@tinybigui/react 0.3.0 → 0.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils/cn.ts","../src/utils/colors.ts","../src/utils/typography.ts","../src/hooks/useScrollElevation.ts","../src/components/AppBar/AppBarHeadless.tsx","../src/components/AppBar/AppBar.variants.ts","../src/components/AppBar/AppBar.tsx","../src/components/Button/ButtonHeadless.tsx","../src/components/Button/Button.variants.ts","../src/hooks/useRipple.tsx","../src/components/Button/Button.tsx","../src/components/IconButton/IconButtonHeadless.tsx","../src/components/IconButton/IconButton.variants.ts","../src/components/IconButton/IconButton.tsx","../src/components/FAB/FABHeadless.tsx","../src/components/FAB/FAB.variants.ts","../src/components/FAB/FAB.tsx","../src/components/TextField/TextField.variants.ts","../src/components/TextField/TextFieldHeadless.tsx","../src/components/TextField/TextField.tsx","../src/components/Checkbox/Checkbox.variants.ts","../src/components/Checkbox/Checkbox.tsx","../src/components/Switch/Switch.variants.ts","../src/components/Switch/Switch.tsx","../src/components/Radio/RadioGroupHeadless.tsx","../src/components/Radio/Radio.variants.ts","../src/components/Radio/Radio.tsx","../src/components/Radio/RadioGroup.tsx","../src/components/Radio/RadioHeadless.tsx","../src/components/Tabs/TabsHeadless.tsx","../src/components/Tabs/Tabs.tsx","../src/components/Tabs/Tabs.variants.ts","../src/components/Tabs/TabList.tsx","../src/components/Tabs/Tab.tsx","../src/components/Tabs/TabPanel.tsx","../src/components/NavigationBar/NavigationBarHeadless.tsx","../src/components/NavigationBar/NavigationBar.variants.ts","../src/components/NavigationBar/NavigationBar.tsx","../src/components/NavigationBar/NavigationBarItem.tsx","../src/components/Drawer/DrawerHeadless.tsx","../src/components/Drawer/Drawer.variants.ts","../src/components/Drawer/Drawer.tsx","../src/components/Drawer/DrawerItem.tsx","../src/components/Drawer/DrawerSection.tsx","../src/components/Progress/Progress.variants.ts","../src/components/Progress/Progress.tsx","../src/components/Progress/ProgressHeadless.tsx","../src/components/Menu/MenuHeadless.tsx","../src/components/Menu/Menu.variants.ts","../src/components/Menu/Menu.tsx","../src/components/Menu/MenuItem.tsx","../src/components/Menu/MenuSection.tsx","../src/components/Menu/MenuDivider.tsx","../src/components/Snackbar/SnackbarHeadless.tsx","../src/components/Snackbar/Snackbar.variants.ts","../src/components/Snackbar/Snackbar.tsx","../src/components/Snackbar/SnackbarProvider.tsx","../src/components/Dialog/DialogHeadless.tsx","../src/components/Dialog/Dialog.variants.ts","../src/components/Dialog/Dialog.tsx","../src/components/Dialog/DialogHeadline.tsx","../src/components/Dialog/DialogContent.tsx","../src/components/Dialog/DialogActions.tsx"],"names":["forwardRef","jsx","cva","useState","useRef","useCallback","jsxs","useButton","mergeProps","filterDOMProps","Spinner","mergedInputProps","useFocusRing","useEffect","useToggleState","VisuallyHidden","useContext","useRadio","createContext","useTabList","useTab","useTabPanel","Item","useTabListState","isBadgeVisible","useProgressBar","isValidElement","Fragment","RACMenuTrigger","useLayoutEffect","RACMenu","HeadlessMenuItem","RACMenuItem","RACMenuSection","RACSeparator","Menu","MenuItem","RACHeader","SnackbarHeadless","Snackbar","useMemo","usePreventScroll","useDialog","useOverlay","DialogHeadless","useOverlayTriggerState","useId","FocusScope","createPortal","Dialog","DialogHeadline","DialogContent","DialogActions"],"mappings":"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","file":"index.js","sourcesContent":["import { type ClassValue, clsx } from \"clsx\";\nimport { extendTailwindMerge } from \"tailwind-merge\";\n\n/**\n * Extended tailwind-merge that understands MD3 custom Tailwind v4 `@theme` utilities.\n *\n * By default, `tailwind-merge` treats ALL `text-*` classes as potentially\n * conflicting. This causes issues with our custom MD3 tokens:\n * - Typography scale: `text-body-large`, `text-label-medium`, etc. → font-size group\n * - Color utilities: `text-on-surface`, `text-primary`, etc. → text-color group\n *\n * We register the typography-scale tokens so `twMerge` knows they live in the\n * `font-size` group and do NOT conflict with `text-color` utilities.\n */\nconst twMerge = extendTailwindMerge({\n extend: {\n classGroups: {\n \"font-size\": [\n {\n text: [\n // MD3 Display scale\n \"display-large\",\n \"display-medium\",\n \"display-small\",\n // MD3 Headline scale\n \"headline-large\",\n \"headline-medium\",\n \"headline-small\",\n // MD3 Title scale\n \"title-large\",\n \"title-medium\",\n \"title-small\",\n // MD3 Body scale\n \"body-large\",\n \"body-medium\",\n \"body-small\",\n // MD3 Label scale\n \"label-large\",\n \"label-medium\",\n \"label-small\",\n ],\n },\n ],\n },\n },\n});\n\n/**\n * Combines and merges Tailwind CSS classes efficiently.\n *\n * Uses `clsx` for conditional joining + extended `tailwind-merge` that is\n * aware of MD3 typography scale utilities (`text-body-large`, etc.) so they\n * are not incorrectly removed when merged alongside color utilities\n * (`text-on-surface`, `text-primary`, etc.).\n *\n * @example\n * ```tsx\n * cn('px-2 py-1', condition && 'bg-blue-500', { 'text-white': isActive })\n * // => 'px-2 py-1 bg-blue-500 text-white'\n * ```\n *\n * @example Merging conflicting classes (later wins)\n * ```tsx\n * cn('px-2', 'px-4')\n * // => 'px-4'\n * ```\n *\n * @example MD3 typography + color (both kept — no false conflict)\n * ```tsx\n * cn('text-body-large', 'text-on-surface')\n * // => 'text-body-large text-on-surface'\n * ```\n */\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs));\n}\n","/**\n * Color Utilities\n *\n * Utilities for working with Material Design 3 color system.\n * Provides functions for color manipulation, CSS variable extraction,\n * and integration with material-color-utilities.\n */\n\nimport { argbFromHex, themeFromSourceColor, type Theme } from \"@material/material-color-utilities\";\n\n/**\n * Material Design 3 color roles\n */\nexport type MD3ColorRole =\n | \"primary\"\n | \"on-primary\"\n | \"primary-container\"\n | \"on-primary-container\"\n | \"secondary\"\n | \"on-secondary\"\n | \"secondary-container\"\n | \"on-secondary-container\"\n | \"tertiary\"\n | \"on-tertiary\"\n | \"tertiary-container\"\n | \"on-tertiary-container\"\n | \"error\"\n | \"on-error\"\n | \"error-container\"\n | \"on-error-container\"\n | \"surface\"\n | \"on-surface\"\n | \"surface-variant\"\n | \"on-surface-variant\"\n | \"outline\"\n | \"outline-variant\"\n | \"background\"\n | \"on-background\";\n\n/**\n * Get the computed value of a CSS variable\n *\n * @param variable - CSS variable name (with or without `--` prefix)\n * @param element - Element to get computed style from (defaults to document root)\n * @returns The computed value of the CSS variable\n *\n * @example\n * ```ts\n * const primaryColor = getColorValue('--md-sys-color-primary');\n * // Returns: '#6750a4'\n *\n * const primaryColor = getColorValue('md-sys-color-primary');\n * // Also returns: '#6750a4'\n * ```\n */\nexport function getColorValue(\n variable: string,\n element: HTMLElement = document.documentElement\n): string {\n const varName = variable.startsWith(\"--\") ? variable : `--${variable}`;\n return getComputedStyle(element).getPropertyValue(varName).trim();\n}\n\n/**\n * Get a Material Design 3 color token value\n *\n * @param role - MD3 color role name\n * @returns The hex color value\n *\n * @example\n * ```ts\n * const primary = getMD3Color('primary');\n * // Returns: '#6750a4'\n *\n * const onPrimary = getMD3Color('on-primary');\n * // Returns: '#ffffff'\n * ```\n */\nexport function getMD3Color(role: MD3ColorRole): string {\n return getColorValue(`--md-sys-color-${role}`);\n}\n\n/**\n * Add opacity to a hex color\n *\n * @param color - Hex color string (with or without #)\n * @param opacity - Opacity value (0-1)\n * @returns Hex color with opacity (8-digit hex)\n *\n * @example\n * ```ts\n * withOpacity('#6750a4', 0.5);\n * // Returns: '#6750a480'\n *\n * withOpacity('6750a4', 0.12);\n * // Returns: '#6750a41f'\n * ```\n */\nexport function withOpacity(color: string, opacity: number): string {\n const hex = color.replace(\"#\", \"\");\n const alpha = Math.round(Math.max(0, Math.min(1, opacity)) * 255)\n .toString(16)\n .padStart(2, \"0\");\n return `#${hex}${alpha}`;\n}\n\n/**\n * Convert hex color to RGB object\n *\n * @param hex - Hex color string (with or without #)\n * @returns RGB object with r, g, b values (0-255)\n *\n * @example\n * ```ts\n * hexToRgb('#6750a4');\n * // Returns: { r: 103, g: 80, b: 164 }\n * ```\n */\nexport function hexToRgb(hex: string): { r: number; g: number; b: number } {\n const h = hex.replace(\"#\", \"\");\n const r = parseInt(h.substring(0, 2), 16);\n const g = parseInt(h.substring(2, 4), 16);\n const b = parseInt(h.substring(4, 6), 16);\n return { r, g, b };\n}\n\n/**\n * Convert RGB to hex color\n *\n * @param r - Red value (0-255)\n * @param g - Green value (0-255)\n * @param b - Blue value (0-255)\n * @returns Hex color string\n *\n * @example\n * ```ts\n * rgbToHex(103, 80, 164);\n * // Returns: '#6750a4'\n * ```\n */\nexport function rgbToHex(r: number, g: number, b: number): string {\n const toHex = (n: number): string => {\n const hex = Math.max(0, Math.min(255, Math.round(n))).toString(16);\n return hex.padStart(2, \"0\");\n };\n return `#${toHex(r)}${toHex(g)}${toHex(b)}`;\n}\n\n/**\n * Generate a complete Material Design 3 theme from a seed color\n *\n * @param seedColor - Hex color to generate theme from\n * @returns Material Color Utilities Theme object\n *\n * @example\n * ```ts\n * const theme = generateMD3Theme('#6750a4');\n *\n * // Access light mode colors\n * const lightPrimary = hexFromArgb(theme.schemes.light.primary);\n * // Returns: '#6750a4'\n *\n * // Access dark mode colors\n * const darkPrimary = hexFromArgb(theme.schemes.dark.primary);\n * // Returns: '#d0bcff'\n * ```\n */\nexport function generateMD3Theme(seedColor: string): Theme {\n const argb = argbFromHex(seedColor);\n return themeFromSourceColor(argb);\n}\n\n/**\n * Material Color Utilities type exports\n *\n * Re-export commonly used types from material-color-utilities\n * for convenience and type safety.\n */\nexport type { Theme } from \"@material/material-color-utilities\";\n\n/**\n * Material Color Utilities function exports\n *\n * Re-export commonly used functions from material-color-utilities\n * for convenience.\n */\nexport { argbFromHex, hexFromArgb } from \"@material/material-color-utilities\";\n\n/**\n * State layer opacity values (Material Design 3 spec)\n *\n * These values are used for hover, focus, press, and drag states\n * in Material Design 3 components.\n *\n * @see https://m3.material.io/foundations/interaction/states/state-layers\n */\nexport const STATE_LAYER_OPACITY = {\n hover: 0.08,\n focus: 0.12,\n press: 0.12,\n drag: 0.16,\n} as const;\n\n/**\n * Apply a state layer opacity to a color\n *\n * @param color - Base hex color\n * @param state - State type ('hover' | 'focus' | 'press' | 'drag')\n * @returns Color with state layer opacity applied\n *\n * @example\n * ```ts\n * applyStateLayer('#6750a4', 'hover');\n * // Returns: '#6750a414' (8% opacity)\n *\n * applyStateLayer('#6750a4', 'focus');\n * // Returns: '#6750a41f' (12% opacity)\n * ```\n */\nexport function applyStateLayer(color: string, state: keyof typeof STATE_LAYER_OPACITY): string {\n return withOpacity(color, STATE_LAYER_OPACITY[state]);\n}\n","/**\n * Typography Utilities\n *\n * Utilities for working with Material Design 3 typography system.\n * Provides type-safe access to typography tokens and helper functions\n * for applying complete text styles.\n */\n\nimport { getColorValue } from \"./colors\";\n\n/**\n * Material Design 3 typography scales\n *\n * MD3 defines 5 categories of typography, each with 3 size variants.\n */\nexport type MD3TypographyScale = \"display\" | \"headline\" | \"title\" | \"body\" | \"label\";\n\n/**\n * Typography size variants\n */\nexport type MD3TypographySize = \"large\" | \"medium\" | \"small\";\n\n/**\n * Complete typography style name\n * Combination of scale and size (e.g., 'display-large', 'body-medium')\n */\nexport type MD3TypographyStyle =\n | \"display-large\"\n | \"display-medium\"\n | \"display-small\"\n | \"headline-large\"\n | \"headline-medium\"\n | \"headline-small\"\n | \"title-large\"\n | \"title-medium\"\n | \"title-small\"\n | \"body-large\"\n | \"body-medium\"\n | \"body-small\"\n | \"label-large\"\n | \"label-medium\"\n | \"label-small\";\n\n/**\n * Typography token properties\n */\nexport type TypographyProperty = \"size\" | \"line-height\" | \"weight\" | \"tracking\";\n\n/**\n * Typography style object returned by getTypographyStyle()\n */\nexport interface TypographyStyleObject {\n fontSize: string;\n lineHeight: string;\n fontWeight: string;\n letterSpacing: string;\n fontFamily?: string;\n}\n\n/**\n * Get a typography token value\n *\n * @param style - Typography style name (e.g., 'display-large', 'body-medium')\n * @param property - Property to retrieve ('size' | 'line-height' | 'weight' | 'tracking')\n * @returns The token value as a string\n *\n * @example\n * ```ts\n * getTypographyToken('display-large', 'size');\n * // Returns: '3.5625rem' (57px)\n *\n * getTypographyToken('body-medium', 'weight');\n * // Returns: '400'\n * ```\n */\nexport function getTypographyToken(\n style: MD3TypographyStyle,\n property: TypographyProperty\n): string {\n return getColorValue(`--md-sys-typescale-${style}-${property}`);\n}\n\n/**\n * Get a complete typography style object\n *\n * Returns a style object with all typography properties that can be\n * spread directly into a React component's style prop.\n *\n * @param style - Typography style name\n * @param includeFontFamily - Whether to include font-family (default: false)\n * @returns Typography style object for React inline styles\n *\n * @example\n * ```tsx\n * const displayStyle = getTypographyStyle('display-large');\n * // Returns: {\n * // fontSize: '3.5625rem',\n * // lineHeight: '4rem',\n * // fontWeight: '400',\n * // letterSpacing: '-0.25px'\n * // }\n *\n * <h1 style={displayStyle}>Display Large Text</h1>\n * ```\n *\n * @example\n * ```tsx\n * // With font family\n * const bodyStyle = getTypographyStyle('body-medium', true);\n * // Returns: {\n * // fontSize: '0.875rem',\n * // lineHeight: '1.25rem',\n * // fontWeight: '400',\n * // letterSpacing: '0.25px',\n * // fontFamily: 'system-ui, -apple-system, ...'\n * // }\n * ```\n */\nexport function getTypographyStyle(\n style: MD3TypographyStyle,\n includeFontFamily = false\n): TypographyStyleObject {\n const styleObject: TypographyStyleObject = {\n fontSize: getTypographyToken(style, \"size\"),\n lineHeight: getTypographyToken(style, \"line-height\"),\n fontWeight: getTypographyToken(style, \"weight\"),\n letterSpacing: getTypographyToken(style, \"tracking\"),\n };\n\n if (includeFontFamily) {\n styleObject.fontFamily = getColorValue(\"--md-sys-typescale-font-family-plain\");\n }\n\n return styleObject;\n}\n\n/**\n * Get font family token value\n *\n * @param variant - Font family variant ('plain' | 'brand')\n * @returns Font family stack\n *\n * @example\n * ```ts\n * getFontFamily('plain');\n * // Returns: 'system-ui, -apple-system, Segoe UI, Roboto, ...'\n *\n * getFontFamily('brand');\n * // Returns: Same as plain (can be customized via CSS variables)\n * ```\n */\nexport function getFontFamily(variant: \"plain\" | \"brand\" = \"plain\"): string {\n return getColorValue(`--md-sys-typescale-font-family-${variant}`);\n}\n\n/**\n * Typography scale recommendations for semantic HTML elements\n *\n * Maps HTML elements to recommended MD3 typography styles.\n * Based on Material Design 3 guidelines.\n */\nexport const TYPOGRAPHY_ELEMENT_MAP = {\n h1: \"display-large\",\n h2: \"display-medium\",\n h3: \"headline-large\",\n h4: \"headline-medium\",\n h5: \"headline-small\",\n h6: \"title-large\",\n p: \"body-large\",\n span: \"body-medium\",\n small: \"body-small\",\n button: \"label-large\",\n label: \"label-medium\",\n caption: \"label-small\",\n} as const satisfies Record<string, MD3TypographyStyle>;\n\n/**\n * Get recommended typography style for an HTML element\n *\n * @param element - HTML element tag name\n * @returns Recommended MD3 typography style\n *\n * @example\n * ```ts\n * getTypographyForElement('h1');\n * // Returns: 'display-large'\n *\n * getTypographyForElement('button');\n * // Returns: 'label-large'\n * ```\n */\nexport function getTypographyForElement(\n element: keyof typeof TYPOGRAPHY_ELEMENT_MAP\n): MD3TypographyStyle {\n return TYPOGRAPHY_ELEMENT_MAP[element];\n}\n\n/**\n * Typography scale usage guidelines\n *\n * Provides semantic context for when to use each typography scale.\n */\nexport const TYPOGRAPHY_USAGE = {\n display: \"Large, expressive text for hero sections and marketing\",\n headline: \"High-emphasis text for titles and important headings\",\n title: \"Medium-emphasis text for section headers and card titles\",\n body: \"Plain text for paragraphs, lists, and general content\",\n label: \"UI labels, buttons, tabs, and form elements\",\n} as const satisfies Record<MD3TypographyScale, string>;\n\n/**\n * Create a typography CSS class name\n *\n * Generates a consistent class name for typography styles.\n * Useful for creating utility classes or component variants.\n *\n * @param style - Typography style name\n * @returns CSS class name string\n *\n * @example\n * ```ts\n * getTypographyClassName('display-large');\n * // Returns: 'text-display-large'\n *\n * getTypographyClassName('body-medium');\n * // Returns: 'text-body-medium'\n * ```\n */\nexport function getTypographyClassName(style: MD3TypographyStyle): string {\n return `text-${style}`;\n}\n\n/**\n * Responsive typography helper\n *\n * Creates a style object that adapts typography across breakpoints.\n *\n * @param mobile - Typography style for mobile screens\n * @param tablet - Typography style for tablet screens (optional)\n * @param desktop - Typography style for desktop screens (optional)\n * @returns Object with styles for different breakpoints\n *\n * @example\n * ```tsx\n * const responsiveTitle = getResponsiveTypography(\n * 'headline-small',\n * 'headline-medium',\n * 'headline-large'\n * );\n *\n * // Use with CSS-in-JS or styled-components\n * const Title = styled.h2`\n * ${responsiveTitle.mobile}\n *\n * @media (min-width: 768px) {\n * ${responsiveTitle.tablet}\n * }\n *\n * @media (min-width: 1024px) {\n * ${responsiveTitle.desktop}\n * }\n * `;\n * ```\n */\nexport function getResponsiveTypography(\n mobile: MD3TypographyStyle,\n tablet?: MD3TypographyStyle,\n desktop?: MD3TypographyStyle\n): {\n mobile: TypographyStyleObject;\n tablet?: TypographyStyleObject;\n desktop?: TypographyStyleObject;\n} {\n return {\n mobile: getTypographyStyle(mobile),\n ...(tablet && { tablet: getTypographyStyle(tablet) }),\n ...(desktop && { desktop: getTypographyStyle(desktop) }),\n };\n}\n\n/**\n * Convert rem to pixels (assuming 16px base)\n *\n * @param rem - Rem value (with or without 'rem' suffix)\n * @returns Pixel value\n *\n * @example\n * ```ts\n * remToPx('1.5rem');\n * // Returns: 24\n *\n * remToPx('3.5625rem');\n * // Returns: 57\n * ```\n */\nexport function remToPx(rem: string): number {\n const remValue = parseFloat(rem.replace(\"rem\", \"\"));\n return remValue * 16;\n}\n\n/**\n * Convert pixels to rem (assuming 16px base)\n *\n * @param px - Pixel value (with or without 'px' suffix)\n * @returns Rem value as string\n *\n * @example\n * ```ts\n * pxToRem(24);\n * // Returns: '1.5rem'\n *\n * pxToRem('57px');\n * // Returns: '3.5625rem'\n * ```\n */\nexport function pxToRem(px: number | string): string {\n const pxValue = typeof px === \"string\" ? parseFloat(px.replace(\"px\", \"\")) : px;\n return `${pxValue / 16}rem`;\n}\n\n/**\n * Truncate text with ellipsis\n *\n * Returns CSS properties for single or multi-line text truncation.\n *\n * @param lines - Number of lines before truncation (1 for single-line)\n * @returns CSS properties object\n *\n * @example\n * ```tsx\n * // Single line truncation\n * const singleLine = truncateText(1);\n * <div style={singleLine}>Long text here...</div>\n *\n * // Multi-line truncation (3 lines)\n * const multiLine = truncateText(3);\n * <p style={multiLine}>Long paragraph text here...</p>\n * ```\n */\nexport function truncateText(lines = 1): React.CSSProperties {\n if (lines === 1) {\n return {\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n };\n }\n\n return {\n display: \"-webkit-box\",\n WebkitLineClamp: lines,\n WebkitBoxOrient: \"vertical\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n };\n}\n","\"use client\";\n\nimport { useState, useEffect, useCallback } from \"react\";\n\n/**\n * Options for useScrollElevation hook\n */\ninterface UseScrollElevationOptions {\n /**\n * Controlled scroll state.\n * When provided, the hook operates in controlled mode and does not\n * attach a scroll listener — the consumer manages state externally.\n * When `undefined`, the hook uses internal scroll detection (uncontrolled).\n */\n scrolled?: boolean | undefined;\n\n /**\n * Callback fired when scroll elevation state changes.\n * In uncontrolled mode: fires when user scrolls past threshold.\n * In controlled mode: fires to inform the consumer of scroll events.\n */\n onScrollStateChange?: ((scrolled: boolean) => void) | undefined;\n\n /**\n * Scroll threshold in pixels before elevation activates\n * @default 0\n */\n threshold?: number | undefined;\n}\n\n/**\n * Hook for MD3 AppBar scroll-triggered elevation behavior.\n *\n * Manages the transition between flat (at rest) and elevated (on scroll)\n * surface states per the Material Design 3 Top App Bar spec.\n *\n * Supports both controlled and uncontrolled modes:\n * - **Uncontrolled**: Attaches a `scroll` listener to `window` and manages\n * elevation state internally. Calls `onScrollStateChange` when the state changes.\n * - **Controlled**: Uses the `scrolled` prop directly. No internal scroll listener\n * is attached. The consumer is responsible for updating `scrolled`.\n *\n * @example Uncontrolled (recommended for most cases)\n * ```tsx\n * const { isScrolled } = useScrollElevation({\n * onScrollStateChange: (scrolled) => console.log('scrolled:', scrolled),\n * });\n * ```\n *\n * @example Controlled\n * ```tsx\n * const [scrolled, setScrolled] = useState(false);\n * const { isScrolled } = useScrollElevation({ scrolled, onScrollStateChange: setScrolled });\n * ```\n */\nexport function useScrollElevation(options: UseScrollElevationOptions = {}): {\n isScrolled: boolean;\n} {\n const { scrolled: controlledScrolled, onScrollStateChange, threshold = 0 } = options;\n\n const isControlled = controlledScrolled !== undefined;\n\n const [internalScrolled, setInternalScrolled] = useState(false);\n\n const handleScroll = useCallback(() => {\n const currentlyScrolled = window.scrollY > threshold;\n setInternalScrolled((prev) => {\n if (prev !== currentlyScrolled) {\n onScrollStateChange?.(currentlyScrolled);\n return currentlyScrolled;\n }\n return prev;\n });\n }, [threshold, onScrollStateChange]);\n\n useEffect(() => {\n // Only attach the scroll listener in uncontrolled mode\n if (isControlled) return;\n\n window.addEventListener(\"scroll\", handleScroll, { passive: true });\n\n // Check initial scroll position\n handleScroll();\n\n return () => {\n window.removeEventListener(\"scroll\", handleScroll);\n };\n }, [isControlled, handleScroll]);\n\n return {\n isScrolled: isControlled ? controlledScrolled : internalScrolled,\n };\n}\n","import { forwardRef } from \"react\";\nimport { useScrollElevation } from \"../../hooks/useScrollElevation\";\nimport type { AppBarHeadlessProps } from \"./AppBar.types\";\n\n/**\n * Headless AppBar Component (Layer 2)\n *\n * Unstyled Top App Bar primitive. Renders a `<header role=\"banner\">` landmark\n * and manages scroll elevation state via the `useScrollElevation` hook.\n *\n * Features:\n * - Semantic `<header>` element with `role=\"banner\"` ARIA landmark\n * - Controlled scroll state via `scrolled` prop\n * - Uncontrolled scroll state with internal `window` scroll detection\n * - `onScrollStateChange` callback for both modes\n * - Full ref forwarding to the header element\n *\n * Use this layer when you need full visual control beyond what the styled\n * `AppBar` provides.\n *\n * @example\n * ```tsx\n * // Uncontrolled (auto scroll detection)\n * <AppBarHeadless className=\"my-custom-appbar\">\n * <div>My custom layout</div>\n * </AppBarHeadless>\n *\n * // Controlled scroll state\n * <AppBarHeadless\n * scrolled={isScrolled}\n * onScrollStateChange={setIsScrolled}\n * className=\"my-custom-appbar\"\n * >\n * <div>My custom layout</div>\n * </AppBarHeadless>\n * ```\n */\nexport const AppBarHeadless = forwardRef<HTMLElement, AppBarHeadlessProps>(\n ({ className, children, scrolled: scrolledProp, onScrollStateChange }, ref) => {\n const { isScrolled } = useScrollElevation({\n scrolled: scrolledProp,\n onScrollStateChange,\n });\n\n return (\n <header ref={ref} role=\"banner\" className={className} data-scrolled={isScrolled}>\n {children}\n </header>\n );\n }\n);\n\nAppBarHeadless.displayName = \"AppBarHeadless\";\n","import { cva, type VariantProps } from \"class-variance-authority\";\n\n/**\n * Material Design 3 Top App Bar Variants (CVA)\n *\n * Type-safe variant management for AppBar component.\n * Uses Tailwind CSS classes mapped to MD3 design tokens.\n *\n * Variants:\n * - `small`: 64dp height (h-appbar-small), title left-aligned\n * - `center-aligned`: 64dp height (h-appbar-small), title centered\n * - `medium`: 112dp height (h-appbar-medium), title bottom-left\n * - `large`: 152dp height (h-appbar-large), title bottom-left\n *\n * Scroll state:\n * - `false`: flat surface, shadow-elevation-0\n * - `true`: elevated surface, shadow-elevation-2\n *\n * @see https://m3.material.io/components/top-app-bar/specs\n */\nexport const appBarVariants = cva(\n [\n // Base classes (always applied)\n \"w-full\",\n \"bg-surface text-on-surface\",\n \"flex flex-col\",\n // Elevation transition using MD3 motion tokens\n \"transition-shadow duration-medium2 ease-standard\",\n ],\n {\n variants: {\n /**\n * Size variant (MD3 specification)\n * Controls bar height, title placement, and type scale\n */\n variant: {\n /** 64dp, title left-aligned, title-large */\n small: \"h-appbar-small\",\n /** 64dp, title centered, title-large */\n \"center-aligned\": \"h-appbar-small variant-center-aligned\",\n /** 112dp, title bottom-left, headline-small */\n medium: \"h-appbar-medium\",\n /** 152dp, title bottom-left, display-small */\n large: \"h-appbar-large\",\n },\n\n /**\n * Scroll state — controls surface elevation\n * MD3: flat at rest, elevated on scroll\n */\n scrolled: {\n false: \"shadow-elevation-0\",\n true: \"shadow-elevation-2\",\n },\n },\n\n defaultVariants: {\n variant: \"small\",\n scrolled: false,\n },\n }\n);\n\n/**\n * Title typography classes per variant\n * Used to apply the correct MD3 type scale to the title element\n */\nexport const appBarTitleVariants = cva(\"text-on-surface font-normal truncate\", {\n variants: {\n variant: {\n small: \"text-title-large\",\n \"center-aligned\": \"text-title-large\",\n medium: \"text-headline-small\",\n large: \"text-display-small\",\n },\n },\n defaultVariants: {\n variant: \"small\",\n },\n});\n\n/**\n * Extract variant prop types from CVA\n */\nexport type AppBarVariants = VariantProps<typeof appBarVariants>;\n","\"use client\";\n\nimport { forwardRef } from \"react\";\nimport { AppBarHeadless } from \"./AppBarHeadless\";\nimport { appBarVariants, appBarTitleVariants } from \"./AppBar.variants\";\nimport { cn } from \"../../utils/cn\";\nimport { useScrollElevation } from \"../../hooks/useScrollElevation\";\nimport type { AppBarProps } from \"./AppBar.types\";\n\n/**\n * Material Design 3 Top App Bar Component\n *\n * Provides context and actions for the current screen. Supports four size variants,\n * a navigation icon slot, title, and trailing action icon slots. Implements\n * scroll-triggered elevation changes per MD3 specification.\n *\n * **Architecture:**\n * - Layer 3 (this file): MD3 styled, CVA variants, layout composition\n * - Layer 2: `AppBarHeadless` — `<header role=\"banner\">`, scroll state\n * - Layer 1: React Aria via `<IconButton>` in consumer slots\n *\n * **Key Features:**\n * - 4 MD3 variants: small, center-aligned, medium, large\n * - Composable API: pass `<IconButton>` nodes into navigation and action slots\n * - Scroll elevation: flat at rest → elevated on scroll (MD3 motion tokens)\n * - Controlled and uncontrolled scroll state\n * - WCAG 2.1 AA: `role=\"banner\"` landmark, keyboard accessible slots\n * - Dark mode via existing token system\n *\n * @example\n * ```tsx\n * // Small variant (default)\n * <AppBar\n * title=\"Page Title\"\n * navigationIcon={\n * <IconButton aria-label=\"Open navigation menu\">\n * <MenuIcon />\n * </IconButton>\n * }\n * actions={\n * <IconButton aria-label=\"Search\">\n * <SearchIcon />\n * </IconButton>\n * }\n * />\n *\n * // Center-aligned with scroll elevation\n * <AppBar\n * variant=\"center-aligned\"\n * title=\"My App\"\n * scrolled={isScrolled}\n * onScrollStateChange={setIsScrolled}\n * />\n *\n * // Medium with expanded title area\n * <AppBar\n * variant=\"medium\"\n * title=\"Article Title\"\n * navigationIcon={\n * <IconButton aria-label=\"Go back\">\n * <ArrowBackIcon />\n * </IconButton>\n * }\n * />\n * ```\n */\nexport const AppBar = forwardRef<HTMLElement, AppBarProps>(\n (\n {\n variant = \"small\",\n title,\n navigationIcon,\n actions,\n scrolled: scrolledProp,\n onScrollStateChange,\n className,\n },\n ref\n ) => {\n const { isScrolled } = useScrollElevation({\n scrolled: scrolledProp,\n onScrollStateChange,\n });\n\n const isExpandedVariant = variant === \"medium\" || variant === \"large\";\n\n return (\n <AppBarHeadless\n ref={ref}\n // Pass scrolled as controlled (already resolved by useScrollElevation above)\n scrolled={isScrolled}\n className={cn(appBarVariants({ variant, scrolled: isScrolled }), className)}\n >\n {/* Top row: navigation icon + title (small/center-aligned) + actions */}\n <div\n data-slot=\"top-row\"\n className={cn(\n \"flex items-center\",\n \"px-1\",\n // Small and center-aligned: fill the full bar height\n !isExpandedVariant && \"flex-1\",\n // Expanded variants: fixed height for the top row (64dp)\n isExpandedVariant && \"h-16 shrink-0\"\n )}\n >\n {/* Navigation icon slot (leading) */}\n {navigationIcon != null && (\n <div data-slot=\"navigation\" className=\"flex shrink-0 items-center\">\n {navigationIcon}\n </div>\n )}\n\n {/* Title — rendered in top row for small and center-aligned variants */}\n {!isExpandedVariant && (\n <span\n data-testid=\"appbar-title\"\n className={cn(\n \"min-w-0 flex-1 px-1\",\n appBarTitleVariants({ variant }),\n // Center-aligned: center the title text\n variant === \"center-aligned\" && \"text-center\"\n )}\n >\n {title}\n </span>\n )}\n\n {/* Actions slot (trailing) */}\n {actions != null && (\n <div data-slot=\"actions\" className=\"flex shrink-0 items-center gap-0.5\">\n {actions}\n </div>\n )}\n </div>\n\n {/* Expanded title row — only for medium and large variants */}\n {isExpandedVariant && (\n <div data-slot=\"expanded-title\" className={cn(\"flex flex-1 items-end\", \"px-4 pb-4\")}>\n <span\n data-testid=\"appbar-title\"\n className={cn(\"min-w-0 truncate\", appBarTitleVariants({ variant }))}\n >\n {title}\n </span>\n </div>\n )}\n </AppBarHeadless>\n );\n }\n);\n\nAppBar.displayName = \"AppBar\";\n","import { forwardRef, useRef } from \"react\";\nimport { useButton } from \"react-aria\";\nimport type { AriaButtonProps } from \"react-aria\";\nimport { mergeProps } from \"@react-aria/utils\";\n\n/**\n * Headless Button Component (Layer 2)\n *\n * Unstyled button primitive using React Aria for accessibility.\n * Provides behavior only - bring your own styles.\n *\n * Features:\n * - Full keyboard navigation (Enter, Space)\n * - Screen reader support\n * - Touch/pointer event handling\n * - Focus management\n * - Disabled state handling\n *\n * @example\n * ```tsx\n * // Use for custom styling\n * <ButtonHeadless className=\"custom-button-class\">\n * Click me\n * </ButtonHeadless>\n * ```\n */\nexport interface ButtonHeadlessProps extends AriaButtonProps {\n /**\n * Additional CSS classes\n */\n className?: string;\n\n /**\n * Button content\n */\n children: React.ReactNode;\n\n /**\n * Tab index for keyboard navigation\n * @default 0\n */\n tabIndex?: number;\n\n /**\n * Mouse down handler (for ripple effect)\n */\n onMouseDown?: (e: React.MouseEvent<HTMLButtonElement>) => void;\n}\n\nexport const ButtonHeadless = forwardRef<HTMLButtonElement, ButtonHeadlessProps>(\n ({ className, children, tabIndex = 0, onMouseDown, type, ...restProps }, forwardedRef) => {\n // Internal ref for React Aria\n const internalRef = useRef<HTMLButtonElement>(null);\n\n // Merge internal ref with forwarded ref\n const ref = (forwardedRef ?? internalRef) as React.RefObject<HTMLButtonElement>;\n\n // React Aria hook - handles all accessibility\n const { buttonProps } = useButton(\n {\n ...restProps,\n // Ensure element type is 'button' for proper semantics\n elementType: \"button\",\n },\n ref\n );\n\n // Filter out React Aria-specific props that shouldn't be on DOM elements\n const {\n isDisabled: _isDisabled,\n onPress: _onPress,\n onPressStart: _onPressStart,\n onPressEnd: _onPressEnd,\n onPressChange: _onPressChange,\n onPressUp: _onPressUp,\n ...htmlAttrs\n } = restProps;\n\n // Merge React Aria props with custom props and HTML attributes\n // Order matters: buttonProps first, then custom props/HTML attributes to allow overrides\n const mergedProps = mergeProps(\n buttonProps,\n {\n tabIndex,\n className,\n onMouseDown,\n },\n htmlAttrs // Pass through only HTML attributes (title, data-*, etc.)\n );\n\n return (\n // eslint-disable-next-line react/button-has-type -- type is dynamically passed from props\n <button {...mergedProps} ref={ref} type={type ?? \"button\"}>\n {children}\n </button>\n );\n }\n);\n\nButtonHeadless.displayName = \"ButtonHeadless\";\n","import { cva, type VariantProps } from \"class-variance-authority\";\n\n/**\n * Material Design 3 Button Variants (CVA)\n *\n * Type-safe variant management for Button component.\n * Uses Tailwind CSS classes mapped to MD3 design tokens.\n */\nexport const buttonVariants = cva(\n [\n // Base classes (always applied)\n \"relative inline-flex items-center justify-center cursor-pointer\",\n \"overflow-hidden rounded-full font-medium\",\n \"transition-all duration-200\",\n \"tracking-[0.1px]\", // MD3 spec: +0.1px letter-spacing for label-large\n \"focus-visible:outline-primary focus-visible:outline-2 focus-visible:outline-offset-2\",\n\n // State layers (hover, focus, active) - MD3 spec: 8%/12%/12% opacity\n \"before:absolute before:inset-0 before:rounded-[inherit] before:transition-opacity before:duration-200\",\n \"before:bg-current before:opacity-0\",\n \"hover:before:opacity-8\",\n \"focus-visible:before:opacity-12\",\n \"active:before:opacity-12\",\n ],\n {\n variants: {\n /**\n * Button variant (MD3 specification)\n */\n variant: {\n filled: \"shadow-none hover:shadow-elevation-1\", // MD3: gains elevation on hover\n outlined: \"bg-transparent border border-outline\",\n tonal: \"\",\n elevated: \"shadow-elevation-1 hover:shadow-elevation-2\", // MD3: level 1 → level 2 on hover\n text: \"bg-transparent\",\n },\n\n /**\n * Color scheme (MD3 color roles)\n */\n color: {\n primary: \"\",\n secondary: \"\",\n tertiary: \"\",\n error: \"\",\n },\n\n /**\n * Button size\n */\n size: {\n small: \"h-8 px-4 text-sm gap-2\",\n medium: \"h-10 px-6 text-sm gap-2\",\n large: \"h-12 px-8 text-base gap-3\",\n },\n\n /**\n * Full width variant\n */\n fullWidth: {\n true: \"w-full\",\n false: \"\",\n },\n\n /**\n * Disabled state (MD3 spec: container 12% opacity, content 38% opacity)\n */\n disabled: {\n true: [\n \"pointer-events-none cursor-not-allowed\",\n \"bg-on-surface/12\", // MD3: disabled container uses on-surface at 12%\n \"text-on-surface/38\", // MD3: disabled text/icons use on-surface at 38%\n \"border-on-surface/12\", // For outlined variant\n \"shadow-none\", // Remove elevation when disabled\n ],\n false: \"\",\n },\n\n /**\n * Loading state\n */\n loading: {\n true: \"cursor-wait\",\n false: \"\",\n },\n },\n\n /**\n * Compound variants - combinations of variant + color\n */\n compoundVariants: [\n // ====================\n // FILLED VARIANTS\n // ====================\n {\n variant: \"filled\",\n color: \"primary\",\n className: \"bg-primary text-on-primary\",\n },\n {\n variant: \"filled\",\n color: \"secondary\",\n className: \"bg-secondary text-on-secondary\",\n },\n {\n variant: \"filled\",\n color: \"tertiary\",\n className: \"bg-tertiary text-on-tertiary\",\n },\n {\n variant: \"filled\",\n color: \"error\",\n className: \"bg-error text-on-error\",\n },\n\n // ====================\n // OUTLINED VARIANTS\n // ====================\n {\n variant: \"outlined\",\n color: \"primary\",\n className: \"text-primary\",\n },\n {\n variant: \"outlined\",\n color: \"secondary\",\n className: \"text-secondary\",\n },\n {\n variant: \"outlined\",\n color: \"tertiary\",\n className: \"text-tertiary\",\n },\n {\n variant: \"outlined\",\n color: \"error\",\n className: \"text-error\",\n },\n\n // ====================\n // TONAL VARIANTS\n // ====================\n {\n variant: \"tonal\",\n color: \"primary\",\n className: \"bg-primary-container text-on-primary-container\",\n },\n {\n variant: \"tonal\",\n color: \"secondary\",\n className: \"bg-secondary-container text-on-secondary-container\",\n },\n {\n variant: \"tonal\",\n color: \"tertiary\",\n className: \"bg-tertiary-container text-on-tertiary-container\",\n },\n {\n variant: \"tonal\",\n color: \"error\",\n className: \"bg-error-container text-on-error-container\",\n },\n\n // ====================\n // ELEVATED VARIANTS\n // ====================\n {\n variant: \"elevated\",\n color: \"primary\",\n className: \"bg-surface-container-low text-primary\",\n },\n {\n variant: \"elevated\",\n color: \"secondary\",\n className: \"bg-surface-container-low text-secondary\",\n },\n {\n variant: \"elevated\",\n color: \"tertiary\",\n className: \"bg-surface-container-low text-tertiary\",\n },\n {\n variant: \"elevated\",\n color: \"error\",\n className: \"bg-surface-container-low text-error\",\n },\n\n // ====================\n // TEXT VARIANTS\n // ====================\n {\n variant: \"text\",\n color: \"primary\",\n className: \"text-primary\",\n },\n {\n variant: \"text\",\n color: \"secondary\",\n className: \"text-secondary\",\n },\n {\n variant: \"text\",\n color: \"tertiary\",\n className: \"text-tertiary\",\n },\n {\n variant: \"text\",\n color: \"error\",\n className: \"text-error\",\n },\n ],\n\n /**\n * Default variants\n */\n defaultVariants: {\n variant: \"filled\",\n color: \"primary\",\n size: \"medium\",\n fullWidth: false,\n disabled: false,\n loading: false,\n },\n }\n);\n\n/**\n * Extract variant prop types from CVA\n */\nexport type ButtonVariants = VariantProps<typeof buttonVariants>;\n","import { useRef, useCallback, useState, type MouseEvent } from \"react\";\n\n/**\n * Ripple state for tracking individual ripple animations\n */\ninterface Ripple {\n key: number;\n x: number;\n y: number;\n size: number;\n}\n\n/**\n * Options for useRipple hook\n */\ninterface UseRippleOptions {\n /**\n * Disable ripple effect\n * @default false\n */\n disabled?: boolean;\n\n /**\n * Color of the ripple (currentColor by default)\n */\n color?: string;\n\n /**\n * Duration of ripple animation in ms\n * @default 450\n */\n duration?: number;\n}\n\n/**\n * Hook for Material Design 3 ripple effect\n *\n * Creates a ripple animation that emanates from the click/touch point.\n * The ripple is bounded to the container and follows MD3 motion specs.\n *\n * @example\n * ```tsx\n * function MyButton() {\n * const { onMouseDown, ripples } = useRipple();\n *\n * return (\n * <button onMouseDown={onMouseDown}>\n * Click me\n * {ripples}\n * </button>\n * );\n * }\n * ```\n */\nexport function useRipple(options: UseRippleOptions = {}): {\n onMouseDown: (event: MouseEvent<HTMLElement>) => void;\n ripples: React.ReactNode;\n} {\n const { disabled = false, color = \"currentColor\", duration = 450 } = options;\n\n const [ripples, setRipples] = useState<Ripple[]>([]);\n const rippleKeyCounter = useRef(0);\n\n /**\n * Create ripple on mouse down\n */\n const onMouseDown = useCallback(\n (event: MouseEvent<HTMLElement>) => {\n if (disabled) return;\n\n const element = event.currentTarget;\n const rect = element.getBoundingClientRect();\n\n // Calculate ripple position relative to element\n const x = event.clientX - rect.left;\n const y = event.clientY - rect.top;\n\n // Calculate ripple size (diameter that covers entire element)\n const sizeX = Math.max(x, rect.width - x);\n const sizeY = Math.max(y, rect.height - y);\n const size = Math.sqrt(sizeX ** 2 + sizeY ** 2) * 2;\n\n const key = rippleKeyCounter.current++;\n\n // Add new ripple\n setRipples((prev) => [...prev, { key, x, y, size }]);\n\n // Remove ripple after animation completes\n setTimeout(() => {\n setRipples((prev) => prev.filter((r) => r.key !== key));\n }, duration);\n },\n [disabled, duration]\n );\n\n /**\n * Ripple elements to render\n */\n const rippleElements = disabled ? null : (\n <span\n data-ripple-container\n className=\"pointer-events-none absolute inset-0 overflow-hidden rounded-[inherit]\"\n >\n {ripples.map((ripple) => (\n <span\n key={ripple.key}\n className=\"animate-ripple absolute rounded-full opacity-12\"\n style={{\n left: ripple.x,\n top: ripple.y,\n width: ripple.size,\n height: ripple.size,\n transform: \"translate(-50%, -50%) scale(0)\",\n backgroundColor: color,\n animationDuration: `${duration}ms`,\n }}\n />\n ))}\n </span>\n );\n\n return {\n onMouseDown,\n ripples: rippleElements,\n };\n}\n","\"use client\";\n\nimport { forwardRef } from \"react\";\nimport type React from \"react\";\nimport { ButtonHeadless } from \"./ButtonHeadless\";\nimport { buttonVariants, type ButtonVariants } from \"./Button.variants\";\nimport { cn } from \"../../utils/cn\";\nimport { useRipple } from \"../../hooks/useRipple\";\nimport type { ButtonProps } from \"./Button.types\";\n\n/**\n * Loading spinner component\n */\nconst Spinner = (): React.ReactElement => (\n <svg\n role=\"progressbar\"\n aria-label=\"Loading\"\n className=\"h-4 w-4 animate-spin\"\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <circle className=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"4\" />\n <path\n className=\"opacity-75\"\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\n />\n </svg>\n);\n\n/**\n * Material Design 3 Button Component (Layer 3: Styled)\n *\n * Built on React Aria for world-class accessibility.\n * Uses CVA for type-safe variant management.\n * Styled with Tailwind CSS using MD3 design tokens.\n *\n * Features:\n * - ✅ 5 MD3 variants: filled, outlined, tonal, elevated, text\n * - ✅ 4 color schemes: primary, secondary, tertiary, error\n * - ✅ 3 sizes: small, medium, large\n * - ✅ Loading state with spinner\n * - ✅ Ripple effect (Material Design)\n * - ✅ Full keyboard accessibility (via React Aria)\n * - ✅ Screen reader support (via React Aria)\n * - ✅ Focus management (via React Aria)\n *\n * MD3 Specifications:\n * - Height: 40dp (medium), 32dp (small), 48dp (large)\n * - Typography: Label Large (14px, 500 weight, +0.1px letter-spacing)\n * - Icon size: 18px × 18px (per MD3 spec)\n * - State layers: 8% hover, 12% focus/pressed\n * - Elevation: Level 1 on hover (filled), Level 1→2 (elevated)\n *\n * @example\n * ```tsx\n * // Basic usage\n * <Button>Click me</Button>\n *\n * // With variant and color\n * <Button variant=\"outlined\" color=\"secondary\">\n * Secondary Action\n * </Button>\n *\n * // With icon (MD3 spec: icons should be 18px × 18px)\n * <Button icon={<IconAdd className=\"h-[18px] w-[18px]\" />}>\n * Add Item\n * </Button>\n *\n * // Loading state\n * <Button loading>\n * Saving...\n * </Button>\n *\n * // Disabled\n * <Button isDisabled>\n * Disabled\n * </Button>\n *\n * // Full width\n * <Button fullWidth>\n * Full Width Button\n * </Button>\n * ```\n */\nexport const Button = forwardRef<HTMLButtonElement, ButtonProps & Omit<ButtonVariants, \"disabled\">>(\n (\n {\n // Variant props (CVA)\n variant = \"filled\",\n color = \"primary\",\n size = \"medium\",\n fullWidth = false,\n\n // Content props\n icon,\n trailingIcon,\n children,\n\n // State props\n loading = false,\n disableRipple = false,\n isDisabled = false,\n\n // Styling\n className,\n\n // Other props\n tabIndex = 0,\n type = \"button\",\n onPress,\n ...props\n },\n ref\n ) => {\n // Development warnings\n if (process.env.NODE_ENV === \"development\") {\n if (!children) {\n console.warn(\n \"[Button] Button should have text content. Use IconButton for icon-only buttons.\"\n );\n }\n\n if (icon && trailingIcon) {\n console.warn(\"[Button] Button should have either icon or trailingIcon, not both.\");\n }\n }\n\n // Combine disabled states\n const isButtonDisabled = isDisabled || loading;\n\n // Ripple effect\n const { onMouseDown: handleRipple, ripples } = useRipple({\n disabled: isButtonDisabled || disableRipple,\n });\n\n // Handle press event (React Aria uses onPress instead of onClick)\n // Note: onPress is already handled by React Aria in ButtonHeadless\n // We just pass it through\n\n return (\n <ButtonHeadless\n {...props}\n ref={ref}\n type={type}\n isDisabled={isButtonDisabled}\n {...(onPress && { onPress })}\n tabIndex={tabIndex}\n onMouseDown={handleRipple}\n className={cn(\n // Apply CVA variants\n buttonVariants({\n variant,\n color,\n size,\n fullWidth,\n disabled: isButtonDisabled,\n loading,\n }),\n // User custom classes\n className\n )}\n >\n {/* Ripple effect */}\n {ripples}\n\n {/* Leading icon (hidden when loading) */}\n {icon && (\n <span className={cn(\"relative z-10 inline-flex shrink-0\", loading && \"invisible\")}>\n {icon}\n </span>\n )}\n\n {/* Loading spinner (shown when loading, overlays icon position) */}\n {loading && (\n <span className=\"relative z-10\">\n <Spinner />\n </span>\n )}\n\n {/* Content */}\n <span className=\"relative z-10 inline-flex items-center\">{children}</span>\n\n {/* Trailing icon (hidden when loading) */}\n {trailingIcon && (\n <span className={cn(\"relative z-10 inline-flex shrink-0\", loading && \"invisible\")}>\n {trailingIcon}\n </span>\n )}\n </ButtonHeadless>\n );\n }\n);\n\nButton.displayName = \"Button\";\n","import { forwardRef, useRef } from \"react\";\nimport { useButton } from \"react-aria\";\nimport type { AriaButtonProps } from \"react-aria\";\nimport { mergeProps, filterDOMProps } from \"@react-aria/utils\";\n\n/**\n * Headless IconButton Component (Layer 2)\n *\n * Unstyled icon button primitive using React Aria for accessibility.\n * Provides behavior only - bring your own styles.\n *\n * Features:\n * - Full keyboard navigation (Enter, Space)\n * - Screen reader support\n * - Touch/pointer event handling\n * - Focus management\n * - Disabled state handling\n * - Toggle button support (aria-pressed)\n *\n * @example\n * ```tsx\n * // Use for custom styling\n * <IconButtonHeadless className=\"custom-icon-button-class\" aria-label=\"Delete\">\n * <IconDelete />\n * </IconButtonHeadless>\n * ```\n */\nexport interface IconButtonHeadlessProps extends AriaButtonProps {\n /**\n * Additional CSS classes\n */\n className?: string;\n\n /**\n * Icon content (React node)\n */\n children: React.ReactNode;\n\n /**\n * Tab index for keyboard navigation\n * @default 0\n */\n tabIndex?: number;\n\n /**\n * Mouse down handler (for ripple effect)\n */\n onMouseDown?: (e: React.MouseEvent<HTMLButtonElement>) => void;\n\n /**\n * Button type attribute\n * @default 'button'\n */\n type?: \"button\" | \"submit\" | \"reset\";\n\n /**\n * Toggle state (for toggle buttons)\n * Sets aria-pressed attribute\n */\n selected?: boolean;\n\n /**\n * REQUIRED: Accessible label for screen readers\n */\n \"aria-label\": string;\n\n /**\n * HTML title attribute for tooltip\n */\n title?: string;\n}\n\nexport const IconButtonHeadless = forwardRef<HTMLButtonElement, IconButtonHeadlessProps>(\n (\n {\n className,\n children,\n tabIndex = 0,\n onMouseDown,\n type,\n selected,\n \"aria-label\": ariaLabel,\n title,\n ...props\n },\n forwardedRef\n ) => {\n // Internal ref for React Aria\n const internalRef = useRef<HTMLButtonElement>(null);\n\n // Merge internal ref with forwarded ref\n const ref = (forwardedRef ?? internalRef) as React.RefObject<HTMLButtonElement>;\n\n // React Aria hook - handles all accessibility\n const { buttonProps } = useButton(\n {\n ...props,\n // Ensure element type is 'button' for proper semantics\n elementType: \"button\",\n // Pass aria-label\n \"aria-label\": ariaLabel,\n },\n ref\n );\n\n // Filter out React Aria-specific props that shouldn't be passed to the DOM element\n\n const domProps = filterDOMProps(props);\n\n // Merge React Aria props with custom props and filtered DOM props\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const mergedProps: React.ButtonHTMLAttributes<HTMLButtonElement> = mergeProps(\n buttonProps,\n domProps,\n {\n tabIndex,\n className,\n onMouseDown,\n type: type ?? \"button\",\n // Add aria-pressed for toggle buttons (only if selected is defined)\n ...(selected !== undefined && { \"aria-pressed\": selected }),\n // Add title if provided\n ...(title && { title }),\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ) as any;\n\n return (\n // eslint-disable-next-line react/button-has-type\n <button {...mergedProps} ref={ref} type={type ?? \"button\"}>\n {children}\n </button>\n );\n }\n);\n\nIconButtonHeadless.displayName = \"IconButtonHeadless\";\n","import { cva, type VariantProps } from \"class-variance-authority\";\n\n/**\n * Material Design 3 IconButton Variants (CVA)\n *\n * Type-safe variant management for IconButton component.\n * Uses Tailwind CSS classes mapped to MD3 design tokens.\n *\n * Key differences from Button:\n * - Circular shape (not pill-shaped)\n * - Fixed square dimensions\n * - No text content support\n * - 'standard' variant instead of 'elevated'\n */\nexport const iconButtonVariants = cva(\n [\n // Base classes (always applied)\n \"relative inline-flex items-center justify-center cursor-pointer\",\n \"overflow-hidden rounded-full\", // Circular shape\n \"transition-all duration-200\",\n \"focus-visible:outline-primary focus-visible:outline-2 focus-visible:outline-offset-2\",\n\n // State layers (hover, focus, active)\n \"before:absolute before:inset-0 before:rounded-[inherit] before:transition-opacity before:duration-200\",\n \"before:bg-current before:opacity-0\",\n \"hover:before:opacity-8\",\n \"focus-visible:before:opacity-12\",\n \"active:before:opacity-12\",\n ],\n {\n variants: {\n /**\n * Button variant (MD3 specification)\n */\n variant: {\n standard: \"bg-transparent\", // No background\n filled: \"shadow-none\", // Solid background\n tonal: \"\", // Container background\n outlined: \"bg-transparent border border-outline\",\n },\n\n /**\n * Color scheme (MD3 color roles)\n */\n color: {\n primary: \"\",\n secondary: \"\",\n tertiary: \"\",\n error: \"\",\n },\n\n /**\n * Button size (square dimensions)\n */\n size: {\n small: \"h-8 w-8\", // 32×32px\n medium: \"h-10 w-10\", // 40×40px (default)\n large: \"h-12 w-12\", // 48×48px\n },\n\n /**\n * Selected state (for toggle buttons)\n */\n selected: {\n true: \"\",\n false: \"\",\n },\n\n /**\n * Disabled state\n */\n isDisabled: {\n true: \"pointer-events-none cursor-not-allowed opacity-38\",\n false: \"\",\n },\n },\n\n /**\n * Compound variants - combinations of variant + color + selected\n */\n compoundVariants: [\n // ====================\n // STANDARD VARIANTS\n // ====================\n {\n variant: \"standard\",\n selected: false,\n className: \"text-on-surface-variant\",\n },\n {\n variant: \"standard\",\n selected: true,\n className: \"text-primary\",\n },\n\n // ====================\n // FILLED VARIANTS (UNSELECTED)\n // ====================\n {\n variant: \"filled\",\n color: \"primary\",\n selected: false,\n className: \"bg-primary text-on-primary\",\n },\n {\n variant: \"filled\",\n color: \"secondary\",\n selected: false,\n className: \"bg-secondary text-on-secondary\",\n },\n {\n variant: \"filled\",\n color: \"tertiary\",\n selected: false,\n className: \"bg-tertiary text-on-tertiary\",\n },\n {\n variant: \"filled\",\n color: \"error\",\n selected: false,\n className: \"bg-error text-on-error\",\n },\n\n // ====================\n // FILLED VARIANTS (SELECTED - uses container colors)\n // ====================\n {\n variant: \"filled\",\n color: \"primary\",\n selected: true,\n className: \"bg-primary-container text-on-primary-container\",\n },\n {\n variant: \"filled\",\n color: \"secondary\",\n selected: true,\n className: \"bg-secondary-container text-on-secondary-container\",\n },\n {\n variant: \"filled\",\n color: \"tertiary\",\n selected: true,\n className: \"bg-tertiary-container text-on-tertiary-container\",\n },\n {\n variant: \"filled\",\n color: \"error\",\n selected: true,\n className: \"bg-error-container text-on-error-container\",\n },\n\n // ====================\n // TONAL VARIANTS (UNSELECTED)\n // ====================\n {\n variant: \"tonal\",\n color: \"primary\",\n selected: false,\n className: \"bg-secondary-container text-on-secondary-container\",\n },\n {\n variant: \"tonal\",\n color: \"secondary\",\n selected: false,\n className: \"bg-secondary-container text-on-secondary-container\",\n },\n {\n variant: \"tonal\",\n color: \"tertiary\",\n selected: false,\n className: \"bg-tertiary-container text-on-tertiary-container\",\n },\n {\n variant: \"tonal\",\n color: \"error\",\n selected: false,\n className: \"bg-error-container text-on-error-container\",\n },\n\n // ====================\n // TONAL VARIANTS (SELECTED - uses tertiary container)\n // ====================\n {\n variant: \"tonal\",\n selected: true,\n className: \"bg-tertiary-container text-on-tertiary-container\",\n },\n\n // ====================\n // OUTLINED VARIANTS (UNSELECTED)\n // ====================\n {\n variant: \"outlined\",\n selected: false,\n className: \"text-on-surface-variant\",\n },\n\n // ====================\n // OUTLINED VARIANTS (SELECTED - uses inverse colors)\n // ====================\n {\n variant: \"outlined\",\n selected: true,\n className: \"bg-inverse-surface text-inverse-on-surface border-transparent\",\n },\n ],\n\n /**\n * Default variants\n */\n defaultVariants: {\n variant: \"standard\",\n color: \"primary\",\n size: \"medium\",\n selected: false,\n isDisabled: false,\n },\n }\n);\n\n/**\n * Extract variant prop types from CVA\n */\nexport type IconButtonVariants = VariantProps<typeof iconButtonVariants>;\n","\"use client\";\n\nimport { forwardRef } from \"react\";\nimport type React from \"react\";\nimport { IconButtonHeadless } from \"./IconButtonHeadless\";\nimport { iconButtonVariants, type IconButtonVariants } from \"./IconButton.variants\";\nimport { cn } from \"../../utils/cn\";\nimport { useRipple } from \"../../hooks/useRipple\";\nimport type { IconButtonProps } from \"./IconButton.types\";\nimport { mergeProps } from \"@react-aria/utils\";\n\n/**\n * Material Design 3 IconButton Component\n *\n * Icon-only button component following MD3 specifications.\n * Supports 4 variants, toggle mode, and enforces accessibility.\n *\n * **Key Features:**\n * - 4 variants: standard, filled, tonal, outlined\n * - Circular shape (MD3 specification)\n * - Mandatory `aria-label` for accessibility\n * - Toggle support with `selected` prop\n * - Ripple effect on interaction\n * - 48×48px minimum touch target\n *\n * @example\n * ```tsx\n * // Standard icon button\n * <IconButton aria-label=\"Delete\">\n * <IconDelete />\n * </IconButton>\n *\n * // Filled with color\n * <IconButton aria-label=\"Favorite\" variant=\"filled\" color=\"error\">\n * <IconHeart />\n * </IconButton>\n *\n * // Toggle button\n * <IconButton\n * aria-label={selected ? \"Remove favorite\" : \"Add favorite\"}\n * selected={selected}\n * onPress={() => setSelected(!selected)}\n * >\n * {selected ? <IconStarFilled /> : <IconStarOutline />}\n * </IconButton>\n * ```\n */\nexport const IconButton = forwardRef<\n HTMLButtonElement,\n IconButtonProps & Omit<IconButtonVariants, \"isDisabled\" | \"selected\">\n>(\n (\n {\n // Variant props (CVA)\n variant = \"standard\",\n color = \"primary\",\n size = \"medium\",\n // IconButton specific props\n children,\n selected,\n disableRipple = false,\n className,\n // React Aria props\n isDisabled: propIsDisabled = false,\n onPress,\n onMouseDown,\n \"aria-label\": ariaLabel,\n title,\n ...props\n },\n ref\n ) => {\n // Development warnings\n if (process.env.NODE_ENV === \"development\") {\n if (!ariaLabel) {\n console.error(\n \"[IconButton] aria-label is required for IconButton. Icon-only buttons need accessible labels for screen readers.\"\n );\n }\n\n if (!children) {\n console.warn(\"[IconButton] IconButton should have an icon as children.\");\n }\n }\n\n // Combine disabled states\n const isDisabled = propIsDisabled;\n\n // Ripple effect\n const { onMouseDown: handleRipple, ripples } = useRipple({\n disabled: isDisabled || disableRipple,\n });\n\n // Merge user's onMouseDown with ripple handler\n const mergedOnMouseDown = (e: React.MouseEvent<HTMLButtonElement>): void => {\n onMouseDown?.(e);\n handleRipple(e);\n };\n\n const mergedPropsValue = mergeProps(props, {\n ...(onPress && { onPress }),\n onMouseDown: mergedOnMouseDown,\n isDisabled,\n });\n\n return (\n <IconButtonHeadless\n ref={ref}\n className={cn(\n // Base classes\n \"relative inline-flex items-center justify-center\",\n \"overflow-hidden rounded-full\", // Circular shape\n \"transition-all duration-200\",\n \"focus-visible:outline-primary focus-visible:outline-2 focus-visible:outline-offset-2\",\n\n // State layers (hover, focus, active)\n \"before:absolute before:inset-0 before:rounded-[inherit] before:transition-opacity before:duration-200\",\n \"before:bg-current before:opacity-0\",\n \"hover:before:opacity-8\",\n \"focus-visible:before:opacity-12\",\n \"active:before:opacity-12\",\n\n // CVA variants\n iconButtonVariants({ variant, color, size, selected: selected ?? false, isDisabled }),\n\n // User custom classes\n className\n )}\n aria-label={ariaLabel}\n {...(selected !== undefined && { selected })}\n {...(title && { title })}\n {...mergedPropsValue}\n >\n {/* Ripple effect */}\n {ripples}\n\n {/* Icon content */}\n <span className=\"relative z-10 inline-flex shrink-0\">{children}</span>\n </IconButtonHeadless>\n );\n }\n);\n\nIconButton.displayName = \"IconButton\";\n","import { forwardRef, useRef } from \"react\";\nimport { useButton } from \"react-aria\";\nimport type { AriaButtonProps } from \"react-aria\";\nimport { mergeProps, filterDOMProps } from \"@react-aria/utils\";\n\n/**\n * Headless FAB Component (Layer 2)\n *\n * Unstyled FAB primitive using React Aria for accessibility.\n * Provides behavior only - bring your own styles.\n *\n * Features:\n * - Full keyboard navigation (Enter, Space)\n * - Screen reader support (requires aria-label)\n * - Touch/pointer event handling\n * - Focus management\n * - Disabled state handling\n *\n * @example\n * ```tsx\n * // Use for custom styling\n * <FABHeadless className=\"custom-fab-class\" aria-label=\"Add\">\n * <IconAdd />\n * </FABHeadless>\n * ```\n */\nexport interface FABHeadlessProps extends AriaButtonProps {\n /**\n * Additional CSS classes\n */\n className?: string;\n\n /**\n * FAB content (icon and optional text)\n */\n children: React.ReactNode;\n\n /**\n * Tab index for keyboard navigation\n * @default 0\n */\n tabIndex?: number;\n\n /**\n * Mouse down handler (for ripple effect)\n */\n onMouseDown?: (e: React.MouseEvent<HTMLButtonElement>) => void;\n\n /**\n * Button type attribute\n * @default 'button'\n */\n type?: \"button\" | \"submit\" | \"reset\";\n\n /**\n * REQUIRED: Accessible label for screen readers\n */\n \"aria-label\": string;\n\n /**\n * HTML title attribute for tooltip\n */\n title?: string;\n}\n\nexport const FABHeadless = forwardRef<HTMLButtonElement, FABHeadlessProps>(\n (\n {\n className,\n children,\n tabIndex = 0,\n onMouseDown,\n type,\n \"aria-label\": ariaLabel,\n title,\n ...props\n },\n forwardedRef\n ) => {\n // Internal ref for React Aria\n const internalRef = useRef<HTMLButtonElement>(null);\n\n // Merge internal ref with forwarded ref\n const ref = (forwardedRef ?? internalRef) as React.RefObject<HTMLButtonElement>;\n\n // React Aria hook - handles all accessibility\n const { buttonProps } = useButton(\n {\n ...props,\n elementType: \"button\",\n },\n ref\n );\n\n // Filter out React Aria-specific props that shouldn't be passed to the DOM element\n const domProps = filterDOMProps(props);\n\n // Merge React Aria props with custom props and filtered DOM props\n const mergedProps = mergeProps(buttonProps, domProps, {\n tabIndex,\n className,\n onMouseDown,\n type: type ?? \"button\",\n \"aria-label\": ariaLabel, // Add aria-label\n // Add title if provided\n ...(title && { title }),\n }) as React.ButtonHTMLAttributes<HTMLButtonElement>;\n\n return (\n // eslint-disable-next-line react/button-has-type\n <button {...mergedProps} ref={ref}>\n {children}\n </button>\n );\n }\n);\n\nFABHeadless.displayName = \"FABHeadless\";\n","import { cva, type VariantProps } from \"class-variance-authority\";\n\n/**\n * Material Design 3 FAB Variants (CVA)\n *\n * Type-safe variant management for FAB component.\n * Uses Tailwind CSS classes mapped to MD3 design tokens.\n *\n * Key differences from Button/IconButton:\n * - NOT fully rounded (uses specific corner radius: 12px/16px/28px)\n * - Always has elevation (shadow-elevation-3)\n * - Larger sizes (40px/56px/96px)\n * - Extended variant with variable width\n */\nexport const fabVariants = cva(\n [\n // Base classes (always applied)\n \"relative inline-flex items-center justify-center cursor-pointer\",\n \"overflow-hidden\",\n \"transition-all duration-200\",\n \"focus-visible:outline-primary focus-visible:outline-2 focus-visible:outline-offset-2\",\n \"shrink-0\", // Prevent shrinking in flex containers\n\n // State layers (hover, focus, active)\n \"before:absolute before:inset-0 before:rounded-[inherit] before:transition-opacity before:duration-200\",\n \"before:bg-current before:opacity-0\",\n \"hover:before:opacity-8\",\n \"focus-visible:before:opacity-12\",\n \"active:before:opacity-12\",\n\n // Elevation (floating appearance)\n \"shadow-elevation-3\", // Default elevation\n \"hover:shadow-elevation-4\", // Hover elevation\n ],\n {\n variants: {\n /**\n * FAB size (controls dimensions and icon size)\n */\n size: {\n small: [\n \"h-10 w-10\", // 40×40px\n \"p-2\", // 8px padding for 24px icon\n \"rounded-xl\", // 12px corner radius (not fully rounded!)\n \"m-1\", // 4px margin for 48×48px touch target\n ],\n medium: [\n \"h-14 w-14\", // 56×56px\n \"p-4\", // 16px padding for 24px icon\n \"rounded-2xl\", // 16px corner radius\n ],\n large: [\n \"h-24 w-24\", // 96×96px\n \"p-[30px]\", // 30px padding for 36px icon\n \"rounded-[28px]\", // 28px corner radius (custom value)\n ],\n extended: [\n \"h-14\", // 56px height (same as medium)\n \"rounded-2xl\", // 16px corner radius\n \"pl-4 pr-5\", // Asymmetric padding: 16px leading, 20px trailing\n \"gap-2\", // 8px gap between icon and text\n ],\n },\n\n /**\n * Color scheme (MD3 color roles)\n */\n color: {\n primary: \"\",\n secondary: \"\",\n tertiary: \"\",\n surface: \"\",\n },\n\n /**\n * Disabled state\n */\n isDisabled: {\n true: \"pointer-events-none cursor-not-allowed !bg-on-surface/12 !text-on-surface/38 !shadow-none\",\n false: \"\",\n },\n },\n\n /**\n * Compound variants - combinations of size + color\n */\n compoundVariants: [\n // ====================\n // PRIMARY COLOR\n // ====================\n {\n color: \"primary\",\n size: \"small\",\n className: \"bg-primary-container text-on-primary-container\",\n },\n {\n color: \"primary\",\n size: \"medium\",\n className: \"bg-primary-container text-on-primary-container\",\n },\n {\n color: \"primary\",\n size: \"large\",\n className: \"bg-primary-container text-on-primary-container\",\n },\n {\n color: \"primary\",\n size: \"extended\",\n className: \"bg-primary-container text-on-primary-container\",\n },\n\n // ====================\n // SECONDARY COLOR\n // ====================\n {\n color: \"secondary\",\n size: \"small\",\n className: \"bg-secondary-container text-on-secondary-container\",\n },\n {\n color: \"secondary\",\n size: \"medium\",\n className: \"bg-secondary-container text-on-secondary-container\",\n },\n {\n color: \"secondary\",\n size: \"large\",\n className: \"bg-secondary-container text-on-secondary-container\",\n },\n {\n color: \"secondary\",\n size: \"extended\",\n className: \"bg-secondary-container text-on-secondary-container\",\n },\n\n // ====================\n // TERTIARY COLOR\n // ====================\n {\n color: \"tertiary\",\n size: \"small\",\n className: \"bg-tertiary-container text-on-tertiary-container\",\n },\n {\n color: \"tertiary\",\n size: \"medium\",\n className: \"bg-tertiary-container text-on-tertiary-container\",\n },\n {\n color: \"tertiary\",\n size: \"large\",\n className: \"bg-tertiary-container text-on-tertiary-container\",\n },\n {\n color: \"tertiary\",\n size: \"extended\",\n className: \"bg-tertiary-container text-on-tertiary-container\",\n },\n\n // ====================\n // SURFACE COLOR\n // ====================\n {\n color: \"surface\",\n size: \"small\",\n className: \"bg-surface text-primary\",\n },\n {\n color: \"surface\",\n size: \"medium\",\n className: \"bg-surface text-primary\",\n },\n {\n color: \"surface\",\n size: \"large\",\n className: \"bg-surface text-primary\",\n },\n {\n color: \"surface\",\n size: \"extended\",\n className: \"bg-surface text-primary\",\n },\n ],\n\n /**\n * Default variants\n */\n defaultVariants: {\n size: \"medium\",\n color: \"primary\",\n isDisabled: false,\n },\n }\n);\n\n/**\n * Extract variant prop types from CVA\n */\nexport type FABVariants = VariantProps<typeof fabVariants>;\n","\"use client\";\n\nimport { forwardRef } from \"react\";\nimport type React from \"react\";\nimport { FABHeadless } from \"./FABHeadless\";\nimport { fabVariants, type FABVariants } from \"./FAB.variants\";\nimport { cn } from \"../../utils/cn\";\nimport { useRipple } from \"../../hooks/useRipple\";\nimport type { FABProps } from \"./FAB.types\";\nimport { mergeProps } from \"@react-aria/utils\";\n\n/**\n * Loading spinner component\n */\nconst Spinner = (): React.ReactElement => (\n <svg\n role=\"progressbar\"\n aria-label=\"Loading\"\n className=\"h-6 w-6 animate-spin\"\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <circle className=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"4\" />\n <path\n className=\"opacity-75\"\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\n />\n </svg>\n);\n\n/**\n * Material Design 3 FAB (Floating Action Button) Component\n *\n * High-emphasis button for primary screen action.\n * Supports 4 sizes: small, medium, large, extended\n * Implementation uses Tailwind CSS classes mapped to MD3 tokens.\n */\nexport const FAB = forwardRef<HTMLButtonElement, FABProps & Omit<FABVariants, \"isDisabled\">>(\n (\n {\n // Variant props (CVA)\n size = \"medium\",\n color = \"primary\",\n // FAB specific props\n icon,\n children,\n \"aria-label\": ariaLabel,\n loading = false,\n disableRipple = false,\n className,\n // React Aria props\n isDisabled: propIsDisabled = false,\n onPress,\n onMouseDown,\n title,\n ...props\n },\n ref\n ) => {\n // Development warnings\n if (process.env.NODE_ENV === \"development\") {\n if (!icon) {\n console.warn(\"[FAB] FAB must have an icon. Please provide the icon prop.\");\n }\n\n if (size === \"extended\" && !children) {\n console.warn(\"[FAB] Extended FAB requires text label as children.\");\n }\n\n if (size !== \"extended\" && children) {\n console.warn(\n \"[FAB] Children (text) is only used for extended FAB. For icon-only FAB, use icon prop only.\"\n );\n }\n }\n\n // Combine disabled states\n const isDisabled = propIsDisabled || loading;\n\n // Ripple effect\n const { onMouseDown: handleRipple, ripples } = useRipple({\n disabled: isDisabled || disableRipple,\n });\n\n // Merge user's onMouseDown with ripple handler\n const mergedOnMouseDown = (e: React.MouseEvent<HTMLButtonElement>): void => {\n onMouseDown?.(e);\n handleRipple(e);\n };\n\n const mergedPropsValue = mergeProps(props, {\n ...(onPress && { onPress }),\n onMouseDown: mergedOnMouseDown,\n isDisabled,\n });\n\n return (\n <FABHeadless\n ref={ref}\n className={cn(\n // Base classes\n \"relative inline-flex items-center justify-center\",\n \"overflow-hidden transition-all duration-200\",\n \"focus-visible:outline-primary focus-visible:outline-2 focus-visible:outline-offset-2\",\n \"shrink-0\",\n\n // State layers (hover, focus, active)\n \"before:absolute before:inset-0 before:rounded-[inherit] before:transition-opacity before:duration-200\",\n \"before:bg-current before:opacity-0\",\n \"hover:before:opacity-8\",\n \"focus-visible:before:opacity-12\",\n \"active:before:opacity-12\",\n\n // Elevation\n \"shadow-elevation-3 hover:shadow-elevation-4\",\n\n // CVA variants\n fabVariants({ size, color, isDisabled }),\n\n // User custom classes\n className\n )}\n aria-label={ariaLabel}\n {...(title && { title })}\n {...mergedPropsValue}\n >\n {/* Ripple effect */}\n {ripples}\n\n {/* Icon (hidden when loading) */}\n {icon && (\n <span className={cn(\"relative z-10 inline-flex shrink-0\", loading && \"invisible\")}>\n {icon}\n </span>\n )}\n\n {/* Loading spinner (shown when loading, overlays icon position) */}\n {loading && (\n <span className=\"relative z-10\">\n <Spinner />\n </span>\n )}\n\n {/* Text label (extended FAB only) */}\n {size === \"extended\" && children && (\n <span className=\"relative z-10 inline-flex items-center text-sm font-medium tracking-[0.1px]\">\n {children}\n </span>\n )}\n </FABHeadless>\n );\n }\n);\n\nFAB.displayName = \"FAB\";\n","/**\n * TextField Variants\n *\n * CVA (class-variance-authority) variant definitions for Material Design 3 TextField.\n * Supports filled and outlined variants with comprehensive state management.\n */\n\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\n/**\n * Container variants for the TextField wrapper\n *\n * Handles layout, width, and positioning\n */\nexport const textFieldContainerVariants = cva(\n [\n // Base container styles\n \"relative inline-flex flex-col\",\n ],\n {\n variants: {\n fullWidth: {\n true: \"w-full\",\n false: \"w-auto\",\n },\n },\n defaultVariants: {\n fullWidth: false,\n },\n }\n);\n\n/**\n * Input wrapper variants (the visual container around the input)\n *\n * Handles MD3 filled and outlined variants with all states\n */\nexport const textFieldWrapperVariants = cva(\n [\n // Base wrapper styles\n \"relative inline-flex items-center w-full\",\n \"transition-all duration-200\",\n \"rounded-t\",\n ],\n {\n variants: {\n variant: {\n filled: [\"bg-surface-container-highest\", \"border-b-2 border-on-surface-variant\"],\n outlined: [\"bg-transparent\", \"border border-outline\", \"rounded-b\"],\n },\n size: {\n small: \"min-h-10\",\n medium: \"min-h-12\",\n large: \"min-h-14\",\n },\n disabled: {\n true: [\"cursor-not-allowed\", \"opacity-38\"],\n false: \"\",\n },\n error: {\n true: \"\",\n false: \"\",\n },\n focused: {\n true: \"\",\n false: \"\",\n },\n },\n compoundVariants: [\n // FILLED VARIANT - Focused state\n {\n variant: \"filled\",\n focused: true,\n error: false,\n className: \"border-primary\",\n },\n // FILLED VARIANT - Error state\n {\n variant: \"filled\",\n error: true,\n className: \"border-error\",\n },\n // FILLED VARIANT - Hover state (handled via group-hover in parent)\n {\n variant: \"filled\",\n disabled: false,\n className: \"hover:bg-on-surface/[0.08]\",\n },\n\n // OUTLINED VARIANT - Focused state\n {\n variant: \"outlined\",\n focused: true,\n error: false,\n className: \"border-2 border-primary\",\n },\n // OUTLINED VARIANT - Error state\n {\n variant: \"outlined\",\n error: true,\n className: \"border-2 border-error\",\n },\n // OUTLINED VARIANT - Hover state\n {\n variant: \"outlined\",\n disabled: false,\n className: \"hover:border-on-surface\",\n },\n ],\n defaultVariants: {\n variant: \"filled\",\n size: \"medium\",\n disabled: false,\n error: false,\n focused: false,\n },\n }\n);\n\n/**\n * Input element variants\n *\n * Styles for the actual input/textarea element\n */\nexport const textFieldInputVariants = cva(\n [\n // Base input styles\n \"w-full bg-transparent outline-none\",\n \"text-on-surface text-base\",\n \"placeholder:text-on-surface-variant placeholder:opacity-60\",\n \"transition-colors duration-200\",\n ],\n {\n variants: {\n variant: {\n filled: \"px-4\",\n outlined: \"px-4\",\n },\n size: {\n small: \"h-10 py-2 text-sm\",\n medium: \"h-12 py-3 text-base\",\n large: \"h-14 py-4 text-lg\",\n },\n disabled: {\n true: \"cursor-not-allowed\",\n false: \"\",\n },\n hasLeadingIcon: {\n true: \"pl-12\",\n false: \"\",\n },\n hasTrailingIcon: {\n true: \"pr-12\",\n false: \"\",\n },\n multiline: {\n true: \"resize-y\",\n false: \"\",\n },\n },\n defaultVariants: {\n variant: \"filled\",\n size: \"medium\",\n disabled: false,\n hasLeadingIcon: false,\n hasTrailingIcon: false,\n multiline: false,\n },\n }\n);\n\n/**\n * Label variants\n *\n * Handles floating label behavior for MD3 text fields\n */\nexport const textFieldLabelVariants = cva(\n [\n // Base label styles\n \"absolute left-4 transition-all duration-200 pointer-events-none\",\n \"text-on-surface-variant origin-top-left\",\n ],\n {\n variants: {\n variant: {\n filled: \"top-2.5\",\n outlined: \"top-2.5 bg-surface px-1\",\n },\n size: {\n small: \"text-sm\",\n medium: \"text-base\",\n large: \"text-lg\",\n },\n floating: {\n true: \"-translate-y-5 scale-75\",\n false: \"scale-100\",\n },\n focused: {\n true: \"text-primary\",\n false: \"\",\n },\n error: {\n true: \"text-error\",\n false: \"\",\n },\n disabled: {\n true: \"text-on-surface/38\",\n false: \"\",\n },\n hasLeadingIcon: {\n true: \"left-12\",\n false: \"\",\n },\n },\n compoundVariants: [\n // Outlined variant floating label positioning\n {\n variant: \"outlined\",\n floating: true,\n className: \"top-2.5\",\n },\n ],\n defaultVariants: {\n variant: \"filled\",\n size: \"medium\",\n floating: false,\n focused: false,\n error: false,\n disabled: false,\n hasLeadingIcon: false,\n },\n }\n);\n\n/**\n * Icon container variants\n *\n * Styles for leading and trailing icon containers\n */\nexport const textFieldIconVariants = cva(\n [\n // Base icon styles\n \"absolute flex items-center justify-center\",\n \"text-on-surface-variant transition-colors duration-200\",\n \"pointer-events-none\",\n ],\n {\n variants: {\n position: {\n leading: \"left-3\",\n trailing: \"right-3\",\n },\n size: {\n small: \"w-5 h-5\",\n medium: \"w-6 h-6\",\n large: \"w-7 h-7\",\n },\n disabled: {\n true: \"opacity-38\",\n false: \"\",\n },\n },\n defaultVariants: {\n position: \"leading\",\n size: \"medium\",\n disabled: false,\n },\n }\n);\n\n/**\n * Helper text variants (description and error messages)\n *\n * Styles for text below the input field\n */\nexport const textFieldHelperTextVariants = cva(\n [\n // Base helper text styles\n \"text-xs mt-1 px-4 transition-colors duration-200\",\n ],\n {\n variants: {\n type: {\n description: \"text-on-surface-variant\",\n error: \"text-error\",\n },\n disabled: {\n true: \"opacity-38\",\n false: \"\",\n },\n },\n defaultVariants: {\n type: \"description\",\n disabled: false,\n },\n }\n);\n\n/**\n * Character counter variants\n *\n * Styles for the character count display\n */\nexport const textFieldCharacterCountVariants = cva(\n [\n // Base character counter styles\n \"text-xs mt-1 px-4 text-right text-on-surface-variant transition-colors duration-200\",\n ],\n {\n variants: {\n exceeded: {\n true: \"text-error\",\n false: \"\",\n },\n disabled: {\n true: \"opacity-38\",\n false: \"\",\n },\n },\n defaultVariants: {\n exceeded: false,\n disabled: false,\n },\n }\n);\n\n// Export variant types\nexport type TextFieldContainerVariants = VariantProps<typeof textFieldContainerVariants>;\nexport type TextFieldWrapperVariants = VariantProps<typeof textFieldWrapperVariants>;\nexport type TextFieldInputVariants = VariantProps<typeof textFieldInputVariants>;\nexport type TextFieldLabelVariants = VariantProps<typeof textFieldLabelVariants>;\nexport type TextFieldIconVariants = VariantProps<typeof textFieldIconVariants>;\nexport type TextFieldHelperTextVariants = VariantProps<typeof textFieldHelperTextVariants>;\nexport type TextFieldCharacterCountVariants = VariantProps<typeof textFieldCharacterCountVariants>;\n","/**\n * TextFieldHeadless Component (Layer 2)\n *\n * Headless primitive for the TextField component.\n * Provides behavior and accessibility via React Aria without styling.\n */\n\nimport { forwardRef, useRef } from \"react\";\nimport { useTextField, useFocusRing } from \"react-aria\";\nimport { mergeProps } from \"@react-aria/utils\";\nimport type { TextFieldHeadlessProps } from \"./TextField.types\";\n\n/**\n * TextFieldHeadless - Headless text input primitive\n *\n * This component provides the foundation for accessible text input fields\n * using React Aria. It handles:\n * - Label association\n * - Description text (helper text)\n * - Error message display\n * - Validation state management\n * - Keyboard accessibility\n * - Screen reader support\n *\n * When `children` is a function (render-prop), the component delegates\n * all DOM rendering to the caller, passing React Aria props and derived\n * state. This is how the styled TextField (Layer 3) composes this layer.\n *\n * When `children` is absent, a minimal accessible DOM renders (for\n * advanced consumers who want headless behaviour with their own markup).\n *\n * @example\n * ```tsx\n * // Default DOM (minimal accessible input)\n * <TextFieldHeadless\n * label=\"Email\"\n * description=\"Enter your email address\"\n * isRequired\n * />\n *\n * // Render-prop (styled layer composition)\n * <TextFieldHeadless label=\"Email\" value={value} onChange={onChange}>\n * {({ labelProps, inputProps, isFocused, currentValue }) => (\n * <div>\n * <label {...labelProps} className={isFocused ? 'focused' : ''}>Email</label>\n * <input {...inputProps} />\n * <span>{currentValue.length} chars</span>\n * </div>\n * )}\n * </TextFieldHeadless>\n * ```\n */\nexport const TextFieldHeadless = forwardRef<\n HTMLInputElement | HTMLTextAreaElement,\n TextFieldHeadlessProps\n>(\n (\n {\n label,\n description,\n errorMessage,\n fullWidth = false,\n multiline = false,\n rows = 3,\n className,\n inputClassName,\n labelClassName,\n descriptionClassName,\n errorClassName,\n isInvalid,\n children,\n ...restProps\n },\n forwardedRef\n ) => {\n const internalRef = useRef<HTMLInputElement | HTMLTextAreaElement>(null);\n const ref = (forwardedRef ?? internalRef) as React.RefObject<\n HTMLInputElement & HTMLTextAreaElement\n >;\n\n const inputElementType = multiline ? (\"textarea\" as const) : (\"input\" as const);\n\n // React Aria's useTextField provides fully-wired labelProps, inputProps,\n // descriptionProps, and errorMessageProps with stable IDs and ARIA linkages.\n const {\n labelProps,\n inputProps,\n descriptionProps,\n errorMessageProps,\n isInvalid: ariaIsInvalid,\n validationErrors,\n } = useTextField(\n {\n label,\n description,\n errorMessage,\n isInvalid: isInvalid ?? false,\n inputElementType,\n ...restProps,\n },\n ref\n );\n\n // useFocusRing distinguishes keyboard focus (isFocusVisible) from pointer focus (isFocused).\n const { isFocused, isFocusVisible, focusProps } = useFocusRing({ within: false });\n\n // Determine if field is invalid (from prop or React Aria validation)\n const invalid = isInvalid ?? ariaIsInvalid;\n\n const showErrorMessage = invalid && (errorMessage ?? validationErrors.length > 0);\n const displayErrorMessage = errorMessage ?? validationErrors.join(\" \");\n\n // Derive current displayed value for the render-prop (controlled or uncontrolled).\n // React Aria puts the current value in inputProps.value for controlled fields\n // and defaultValue for uncontrolled. We normalise to a string for character counting.\n const currentValue =\n typeof inputProps.value === \"string\"\n ? inputProps.value\n : typeof inputProps.defaultValue === \"string\"\n ? inputProps.defaultValue\n : \"\";\n\n // --- Render-prop branch ---\n // When children is a function, delegate all DOM rendering to the caller.\n if (typeof children === \"function\") {\n // Merge focusProps into inputProps so the caller gets focus tracking for free.\n const mergedInputProps = mergeProps(\n inputProps,\n focusProps\n ) as React.InputHTMLAttributes<HTMLInputElement> &\n React.TextareaHTMLAttributes<HTMLTextAreaElement>;\n\n return children({\n labelProps,\n inputProps: mergedInputProps,\n descriptionProps,\n errorMessageProps,\n isInvalid: invalid,\n isFocused,\n isFocusVisible,\n currentValue,\n inputRef: ref,\n });\n }\n\n // --- Default DOM branch ---\n // Filter React Aria-specific props that shouldn't go to DOM elements.\n const {\n isDisabled: _isDisabled,\n isRequired: _isRequired,\n isReadOnly: _isReadOnly,\n validationBehavior: _validationBehavior,\n validate: _validate,\n autoFocus: _autoFocus,\n value: _value,\n defaultValue: _defaultValue,\n onChange: _onChange,\n onFocus: _onFocus,\n onBlur: _onBlur,\n onKeyDown: _onKeyDown,\n onKeyUp: _onKeyUp,\n onCopy: _onCopy,\n onCut: _onCut,\n onPaste: _onPaste,\n onCompositionStart: _onCompositionStart,\n onCompositionEnd: _onCompositionEnd,\n onCompositionUpdate: _onCompositionUpdate,\n onSelect: _onSelect,\n onBeforeInput: _onBeforeInput,\n onInput: _onInput,\n onFocusChange: _onFocusChange,\n ...htmlAttrs\n } = restProps;\n\n const mergedInputProps = mergeProps(inputProps, focusProps, htmlAttrs, {\n className: inputClassName,\n }) as React.InputHTMLAttributes<HTMLInputElement> &\n React.TextareaHTMLAttributes<HTMLTextAreaElement>;\n\n return (\n <div className={className} style={fullWidth ? { width: \"100%\" } : undefined}>\n {label && (\n <label {...labelProps} className={labelClassName}>\n {label}\n </label>\n )}\n\n {multiline ? (\n <textarea\n {...mergedInputProps}\n ref={ref as React.RefObject<HTMLTextAreaElement>}\n rows={rows}\n />\n ) : (\n <input {...mergedInputProps} ref={ref as React.RefObject<HTMLInputElement>} />\n )}\n\n {description && !showErrorMessage && (\n <div {...descriptionProps} className={descriptionClassName}>\n {description}\n </div>\n )}\n\n {showErrorMessage && (\n <div {...errorMessageProps} className={errorClassName}>\n {displayErrorMessage}\n </div>\n )}\n </div>\n );\n }\n);\n\nTextFieldHeadless.displayName = \"TextFieldHeadless\";\n","/**\n * TextField Component (Layer 3)\n *\n * Material Design 3 styled text input component.\n * Composes TextFieldHeadless (Layer 2) via render-prop to obtain all\n * React Aria ARIA props without duplicating accessibility wiring.\n */\n\n\"use client\";\n\nimport { forwardRef } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport {\n textFieldContainerVariants,\n textFieldWrapperVariants,\n textFieldInputVariants,\n textFieldLabelVariants,\n textFieldIconVariants,\n textFieldHelperTextVariants,\n textFieldCharacterCountVariants,\n} from \"./TextField.variants\";\nimport { TextFieldHeadless } from \"./TextFieldHeadless\";\nimport type { TextFieldProps } from \"./TextField.types\";\n\n/**\n * TextField - MD3 Text Input Component\n *\n * A text input field following Material Design 3 specifications.\n * Supports filled and outlined variants with comprehensive accessibility\n * provided by React Aria via the TextFieldHeadless layer.\n *\n * @example\n * ```tsx\n * // Basic usage\n * <TextField label=\"Email\" />\n *\n * // With validation\n * <TextField\n * label=\"Email\"\n * type=\"email\"\n * isRequired\n * errorMessage=\"Please enter a valid email\"\n * />\n *\n * // Multiline with character counter\n * <TextField\n * label=\"Bio\"\n * multiline\n * rows={4}\n * maxLength={500}\n * characterCount\n * />\n * ```\n */\nexport const TextField = forwardRef<HTMLInputElement | HTMLTextAreaElement, TextFieldProps>(\n (\n {\n variant = \"filled\",\n size = \"medium\",\n label,\n description,\n errorMessage,\n leadingIcon,\n trailingIcon,\n characterCount = false,\n maxLength,\n fullWidth = false,\n multiline = false,\n rows = 3,\n className,\n isDisabled = false,\n isInvalid = false,\n isRequired = false,\n isReadOnly = false,\n value,\n defaultValue,\n onChange,\n onFocus,\n onBlur,\n spellCheck,\n ...props\n },\n ref\n ) => {\n // Convert spellCheck to boolean if it arrives as a string (HTML attribute form)\n const spellCheckProp =\n spellCheck === undefined\n ? undefined\n : typeof spellCheck === \"string\"\n ? spellCheck === \"true\"\n : spellCheck;\n\n // Build headless props, omitting undefined optional values to satisfy exactOptionalPropertyTypes\n const headlessProps = {\n ...(label !== undefined ? { label } : {}),\n ...(description !== undefined ? { description } : {}),\n ...(errorMessage !== undefined ? { errorMessage } : {}),\n ...(value !== undefined ? { value } : {}),\n ...(defaultValue !== undefined ? { defaultValue } : {}),\n ...(onChange !== undefined ? { onChange } : {}),\n ...(onFocus !== undefined ? { onFocus } : {}),\n ...(onBlur !== undefined ? { onBlur } : {}),\n ...(maxLength !== undefined ? { maxLength } : {}),\n fullWidth,\n multiline,\n rows,\n isDisabled,\n isInvalid,\n isRequired,\n isReadOnly,\n ...props,\n };\n\n return (\n <TextFieldHeadless ref={ref} {...headlessProps}>\n {({\n labelProps,\n inputProps,\n descriptionProps,\n errorMessageProps,\n isInvalid: fieldIsInvalid,\n isFocused,\n currentValue,\n inputRef,\n }) => {\n const hasValue = currentValue.length > 0;\n const shouldFloatLabel = isFocused || hasValue;\n const characterLength = currentValue.length;\n const isCharacterLimitExceeded = maxLength ? characterLength > maxLength : false;\n\n return (\n <div className={cn(textFieldContainerVariants({ fullWidth }), className)}>\n {/* Input wrapper with visual styling */}\n <div\n className={cn(\n textFieldWrapperVariants({\n variant,\n size,\n disabled: isDisabled,\n error: fieldIsInvalid,\n focused: isFocused,\n })\n )}\n >\n {/* Leading icon */}\n {leadingIcon && (\n <span\n className={textFieldIconVariants({\n position: \"leading\",\n size,\n disabled: isDisabled,\n })}\n >\n {leadingIcon}\n </span>\n )}\n\n {/* Floating label — uses labelProps from React Aria for proper htmlFor wiring */}\n {label && (\n <label\n {...labelProps}\n className={cn(\n textFieldLabelVariants({\n variant,\n size,\n floating: shouldFloatLabel,\n focused: isFocused,\n error: fieldIsInvalid,\n disabled: isDisabled,\n hasLeadingIcon: !!leadingIcon,\n })\n )}\n >\n {label}\n {isRequired && \" *\"}\n </label>\n )}\n\n {/* Input/Textarea — uses inputProps from React Aria for full ARIA wiring */}\n {multiline ? (\n <textarea\n {...inputProps}\n ref={inputRef as React.RefObject<HTMLTextAreaElement>}\n className={cn(\n textFieldInputVariants({\n variant,\n size,\n disabled: isDisabled,\n hasLeadingIcon: !!leadingIcon,\n hasTrailingIcon: !!trailingIcon,\n multiline: true,\n }),\n label && \"placeholder:opacity-0\"\n )}\n rows={rows}\n spellCheck={spellCheckProp}\n />\n ) : (\n <input\n {...inputProps}\n ref={inputRef as React.RefObject<HTMLInputElement>}\n className={cn(\n textFieldInputVariants({\n variant,\n size,\n disabled: isDisabled,\n hasLeadingIcon: !!leadingIcon,\n hasTrailingIcon: !!trailingIcon,\n multiline: false,\n }),\n label && \"placeholder:opacity-0\" // Hide placeholder when there's a value to prevent overlap with floating label\n )}\n spellCheck={spellCheckProp}\n />\n )}\n\n {/* Trailing icon */}\n {trailingIcon && (\n <span\n className={textFieldIconVariants({\n position: \"trailing\",\n size,\n disabled: isDisabled,\n })}\n >\n {trailingIcon}\n </span>\n )}\n </div>\n\n {/* Helper text — only shown when not in error state */}\n {description && !fieldIsInvalid && (\n <div\n {...descriptionProps}\n className={textFieldHelperTextVariants({\n type: \"description\",\n disabled: isDisabled,\n })}\n >\n {description}\n </div>\n )}\n\n {/* Error message */}\n {fieldIsInvalid && errorMessage && (\n <div\n {...errorMessageProps}\n className={textFieldHelperTextVariants({\n type: \"error\",\n disabled: isDisabled,\n })}\n >\n {errorMessage}\n </div>\n )}\n\n {/* Character counter */}\n {characterCount && maxLength && (\n <div\n className={textFieldCharacterCountVariants({\n exceeded: isCharacterLimitExceeded,\n disabled: isDisabled,\n })}\n >\n {characterLength} / {maxLength}\n </div>\n )}\n </div>\n );\n }}\n </TextFieldHeadless>\n );\n }\n);\n\nTextField.displayName = \"TextField\";\n","import { cva, type VariantProps } from \"class-variance-authority\";\n\n/**\n * Material Design 3 Checkbox Variants (CVA)\n *\n * Type-safe variant management for Checkbox component.\n * Uses Tailwind CSS classes mapped to MD3 design tokens.\n *\n * MD3 Specifications:\n * - Container: 18x18dp (within 40x40dp touch target)\n * - Corner radius: 2dp (applied via SVG rx/ry attributes, not CSS)\n * - Outline width: 2dp\n * - State layers: 8% hover, 12% focus/pressed\n * - Disabled: 38% opacity\n */\nexport const checkboxVariants = cva(\n [\n // Base classes (always applied to label wrapper)\n \"relative inline-flex items-center cursor-pointer select-none\",\n \"transition-opacity duration-200\",\n ],\n {\n variants: {\n /**\n * Disabled state\n */\n disabled: {\n true: \"opacity-38 cursor-not-allowed pointer-events-none\",\n false: \"\",\n },\n },\n defaultVariants: {\n disabled: false,\n },\n }\n);\n\n/**\n * Checkbox container variants (for the visual checkbox box)\n */\nexport const checkboxContainerVariants = cva(\n [\n // Base classes for checkbox visual container\n \"relative inline-flex items-center justify-center\",\n \"w-10 h-10\", // 40x40dp touch target (MD3 spec)\n \"flex-shrink-0\",\n \"transition-all duration-200\",\n\n // State layer (hover, focus, active) - MD3 spec: 8%/12%/12% opacity\n \"before:absolute before:inset-0 before:rounded-full before:transition-opacity before:duration-200\",\n \"before:bg-current before:opacity-0\",\n \"hover:before:opacity-8\",\n \"active:before:opacity-12\",\n ],\n {\n variants: {\n /**\n * Checkbox state (determines visual appearance)\n */\n state: {\n unchecked: \"text-on-surface-variant\",\n checked: \"text-primary\",\n indeterminate: \"text-primary\",\n },\n\n /**\n * Error/invalid state\n */\n isInvalid: {\n true: \"text-error\",\n false: \"\",\n },\n\n /**\n * Disabled state\n */\n disabled: {\n true: \"text-on-surface pointer-events-none\",\n false: \"\",\n },\n },\n compoundVariants: [\n // Error state overrides normal colors for all states\n {\n state: \"unchecked\",\n isInvalid: true,\n disabled: false,\n className: \"text-error\",\n },\n {\n state: \"checked\",\n isInvalid: true,\n disabled: false,\n className: \"text-error\",\n },\n {\n state: \"indeterminate\",\n isInvalid: true,\n disabled: false,\n className: \"text-error\",\n },\n ],\n defaultVariants: {\n state: \"unchecked\",\n isInvalid: false,\n disabled: false,\n },\n }\n);\n\n/**\n * Checkbox icon SVG box variants (the 18x18dp square container)\n */\nexport const checkboxIconBoxVariants = cva(\n [\n // Base classes for the checkbox box\n // Note: Border radius is applied via SVG rx/ry attributes (2dp) in the component\n \"transition-all duration-200\",\n ],\n {\n variants: {\n /**\n * Checkbox state\n */\n state: {\n unchecked: [\n \"fill-transparent\",\n \"stroke-outline\", // MD3: outline color for unchecked\n \"stroke-2\", // MD3: 2dp outline width\n ],\n checked: [\n \"fill-current\", // Uses parent text color (primary or error)\n \"stroke-none\",\n ],\n indeterminate: [\n \"fill-current\", // Uses parent text color (primary or error)\n \"stroke-none\",\n ],\n },\n\n /**\n * Disabled state\n */\n disabled: {\n true: [\"fill-transparent\", \"stroke-current\", \"stroke-2\"],\n false: \"\",\n },\n },\n compoundVariants: [\n // Disabled state overrides fill for checked/indeterminate\n {\n state: \"checked\",\n disabled: true,\n className: \"fill-current stroke-none\",\n },\n {\n state: \"indeterminate\",\n disabled: true,\n className: \"fill-current stroke-none\",\n },\n ],\n defaultVariants: {\n state: \"unchecked\",\n disabled: false,\n },\n }\n);\n\n/**\n * Checkbox checkmark/dash icon variants\n */\nexport const checkboxIconVariants = cva(\n [\n \"fill-current\", // Inherits color from parent\n \"transition-all duration-200\",\n ],\n {\n variants: {\n /**\n * Icon type\n */\n type: {\n check: \"\", // Checkmark icon\n dash: \"\", // Dash/minus icon\n },\n },\n defaultVariants: {\n type: \"check\",\n },\n }\n);\n\n/**\n * Checkbox label text variants\n */\nexport const checkboxLabelVariants = cva(\n [\n \"text-sm\", // MD3: Body Medium (14px)\n \"text-on-surface\",\n \"select-none\",\n \"ml-1.5\",\n ],\n {\n variants: {\n disabled: {\n true: \"\",\n false: \"\",\n },\n },\n defaultVariants: {\n disabled: false,\n },\n }\n);\n\n/**\n * Extract variant prop types from CVA\n */\nexport type CheckboxVariants = VariantProps<typeof checkboxVariants>;\nexport type CheckboxContainerVariants = VariantProps<typeof checkboxContainerVariants>;\nexport type CheckboxIconBoxVariants = VariantProps<typeof checkboxIconBoxVariants>;\nexport type CheckboxIconVariants = VariantProps<typeof checkboxIconVariants>;\nexport type CheckboxLabelVariants = VariantProps<typeof checkboxLabelVariants>;\n","\"use client\";\n\nimport { forwardRef, useRef, useEffect } from \"react\";\nimport type React from \"react\";\nimport { useCheckbox, useFocusRing, mergeProps, VisuallyHidden } from \"react-aria\";\nimport { useToggleState } from \"react-stately\";\nimport { cn } from \"../../utils/cn\";\nimport { useRipple } from \"../../hooks/useRipple\";\nimport {\n checkboxVariants,\n checkboxContainerVariants,\n checkboxIconBoxVariants,\n checkboxIconVariants,\n checkboxLabelVariants,\n} from \"./Checkbox.variants\";\nimport type { CheckboxProps } from \"./Checkbox.types\";\n\n/**\n * Material Design 3 Checkbox Component (Layer 3: Styled)\n *\n * Built on React Aria for world-class accessibility.\n * Uses CVA for type-safe variant management.\n * Styled with Tailwind CSS using MD3 design tokens.\n *\n * Features:\n * - ✅ 3 states: unchecked, checked, indeterminate\n * - ✅ Error/invalid state support\n * - ✅ Ripple effect (Material Design)\n * - ✅ Full keyboard accessibility (via React Aria)\n * - ✅ Screen reader support (via React Aria)\n * - ✅ Focus management (via React Aria)\n * - ✅ Form integration (name, value props)\n *\n * MD3 Specifications:\n * - Container: 18x18dp (within 40x40dp touch target)\n * - Corner radius: 2dp (applied via SVG rx/ry attributes)\n * - State layers: 8% hover, 12% focus/pressed\n * - Disabled: 38% opacity\n * - Label spacing: 16px (ml-4)\n *\n * @example\n * ```tsx\n * // Basic usage\n * <Checkbox>Accept terms</Checkbox>\n *\n * // Controlled\n * <Checkbox isSelected={checked} onChange={setChecked}>\n * Subscribe\n * </Checkbox>\n *\n * // Indeterminate (partial selection)\n * <Checkbox isIndeterminate>Select all</Checkbox>\n *\n * // Error state\n * <Checkbox isInvalid>Required field</Checkbox>\n *\n * // Disabled\n * <Checkbox isDisabled>Disabled option</Checkbox>\n *\n * // Without label (icon-only)\n * <Checkbox aria-label=\"Accept\" />\n * ```\n */\nexport const Checkbox = forwardRef<HTMLInputElement, CheckboxProps>(\n (\n {\n // Content props\n children,\n\n // State props\n isIndeterminate = false,\n isInvalid = false,\n disableRipple = false,\n isDisabled = false,\n\n // Styling\n className,\n\n // Other props\n ...props\n },\n forwardedRef\n ) => {\n // Internal ref for React Aria\n const internalRef = useRef<HTMLInputElement>(null);\n\n // Merge internal ref with forwarded ref\n const ref = (forwardedRef ?? internalRef) as React.RefObject<HTMLInputElement>;\n\n // Extract data-testid and other HTML attributes\n const htmlAttrs = props as Record<string, unknown>;\n const dataTestId = htmlAttrs[\"data-testid\"] as string | undefined;\n const htmlId = htmlAttrs.id as string | undefined;\n const htmlTitle = htmlAttrs.title as string | undefined;\n\n // Remove HTML attributes from props for React Aria\n const {\n \"data-testid\": _dataTestId,\n id: _htmlId,\n title: _htmlTitle,\n ...restPropsWithoutHtmlAttrs\n } = props as Record<string, unknown>;\n\n // State management using React Stately\n const state = useToggleState(restPropsWithoutHtmlAttrs as Parameters<typeof useToggleState>[0]);\n\n // React Aria hooks - pass props without HTML attributes\n const { inputProps, labelProps } = useCheckbox(\n restPropsWithoutHtmlAttrs as Parameters<typeof useCheckbox>[0],\n state,\n ref\n );\n const { isFocusVisible, focusProps } = useFocusRing();\n\n // Get selected state\n const isSelected = state.isSelected;\n\n // Determine visual state\n const visualState = isIndeterminate ? \"indeterminate\" : isSelected ? \"checked\" : \"unchecked\";\n\n // Ripple effect\n const { onMouseDown: handleRipple, ripples } = useRipple({\n disabled: isDisabled || disableRipple,\n });\n\n // Sync indeterminate state to native input\n useEffect(() => {\n if (ref.current) {\n ref.current.indeterminate = isIndeterminate;\n }\n }, [isIndeterminate, ref]);\n\n // Development warnings\n if (process.env.NODE_ENV === \"development\") {\n const ariaProps = restPropsWithoutHtmlAttrs as {\n \"aria-label\"?: string;\n \"aria-labelledby\"?: string;\n };\n if (!children && !ariaProps[\"aria-label\"] && !ariaProps[\"aria-labelledby\"]) {\n console.warn(\n \"[Checkbox] Checkbox should have a label (children) or aria-label for accessibility.\"\n );\n }\n }\n\n return (\n <label\n {...labelProps}\n className={cn(\n checkboxVariants({\n disabled: isDisabled,\n }),\n className\n )}\n data-testid={dataTestId}\n title={htmlTitle}\n >\n {/* Visually hidden native input for accessibility */}\n <VisuallyHidden>\n <input {...mergeProps(inputProps, focusProps)} ref={ref} id={htmlId} />\n </VisuallyHidden>\n\n {/* Visual checkbox container */}\n <div\n role=\"presentation\"\n className={cn(\n checkboxContainerVariants({\n state: visualState,\n isInvalid,\n disabled: isDisabled,\n })\n )}\n onMouseDown={handleRipple}\n >\n {/* Ripple effect */}\n {ripples}\n\n {/* SVG Checkbox Visual */}\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 18 18\"\n aria-hidden=\"true\"\n className=\"relative z-10\"\n >\n {/* Checkbox box (rounded square) */}\n <rect\n x=\"0\"\n y=\"0\"\n width=\"18\"\n height=\"18\"\n rx=\"2\"\n ry=\"2\"\n className={cn(\n checkboxIconBoxVariants({\n state: visualState,\n disabled: isDisabled,\n })\n )}\n />\n\n {/* Checkmark icon (for checked state) */}\n {isSelected && !isIndeterminate && (\n <path\n d=\"M14.1 4.5L6.3 12.3l-3.4-3.4L1.5 10.3l4.8 4.8 9.2-9.2z\"\n className={cn(checkboxIconVariants({ type: \"check\" }), \"fill-on-primary\")}\n />\n )}\n\n {/* Dash icon (for indeterminate state) */}\n {isIndeterminate && (\n <rect\n x=\"4\"\n y=\"8\"\n width=\"10\"\n height=\"2\"\n className={cn(checkboxIconVariants({ type: \"dash\" }), \"fill-on-primary\")}\n />\n )}\n\n {/* Focus ring (visible on keyboard focus) */}\n {isFocusVisible && (\n <rect\n x=\"-3\"\n y=\"-3\"\n width=\"24\"\n height=\"24\"\n rx=\"12\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n className=\"animate-pulse\"\n />\n )}\n </svg>\n </div>\n\n {/* Label text */}\n {children && (\n <span\n className={cn(\n checkboxLabelVariants({\n disabled: isDisabled,\n })\n )}\n >\n {children}\n </span>\n )}\n </label>\n );\n }\n);\n\nCheckbox.displayName = \"Checkbox\";\n","import { cva, type VariantProps } from \"class-variance-authority\";\n\n/**\n * Material Design 3 Switch Variants (CVA)\n *\n * Type-safe variant management for Switch component.\n * Uses Tailwind CSS classes mapped to MD3 design tokens.\n *\n * MD3 Specifications:\n * - Track: 52x32dp, border-radius 16dp (full)\n * - Handle: 16x16dp (unselected), 24x24dp (selected), 28x28dp (pressed)\n * - Touch target: 48x48dp minimum\n * - State layers: 8% hover, 12% focus/pressed (on handle)\n * - Disabled: 12% container opacity, 38% content opacity\n * - Label spacing: 16px (ml-4)\n */\n\n/**\n * Switch wrapper/label variants (main container)\n */\nexport const switchVariants = cva(\n [\n // Base classes (always applied to label wrapper)\n \"relative inline-flex items-center cursor-pointer select-none\",\n \"transition-opacity duration-200\",\n ],\n {\n variants: {\n /**\n * Disabled state\n */\n disabled: {\n true: \"opacity-38 cursor-not-allowed pointer-events-none\",\n false: \"\",\n },\n },\n defaultVariants: {\n disabled: false,\n },\n }\n);\n\n/**\n * Switch track variants (the 52x32dp background rail)\n */\nexport const switchTrackVariants = cva(\n [\n // Base classes for track\n \"relative flex items-center\",\n \"w-[52px] h-[32px]\", // MD3 spec: 52x32dp\n \"rounded-full\", // MD3 spec: border-radius 16dp (full)\n \"transition-all duration-200\",\n ],\n {\n variants: {\n /**\n * Switch state (determines track color)\n */\n selected: {\n true: \"bg-primary\", // MD3: selected track\n false: \"bg-surface-container-highest\", // MD3: unselected track\n },\n\n /**\n * Disabled state\n */\n disabled: {\n true: \"bg-on-surface/12\", // MD3: 12% opacity for disabled\n false: \"\",\n },\n },\n compoundVariants: [\n // Disabled state overrides normal colors\n {\n selected: true,\n disabled: true,\n className: \"bg-on-surface/12\",\n },\n {\n selected: false,\n disabled: true,\n className: \"bg-on-surface/12\",\n },\n ],\n defaultVariants: {\n selected: false,\n disabled: false,\n },\n }\n);\n\n/**\n * Switch handle container variants (the movable thumb with state layers)\n */\nexport const switchHandleContainerVariants = cva(\n [\n // Base classes for handle container (includes state layer)\n \"absolute flex items-center justify-center\",\n \"rounded-full\",\n \"transition-all duration-200\",\n\n // State layer (hover, focus, active) - MD3 spec: 8%/12%/12% opacity\n \"before:absolute before:inset-0 before:rounded-full before:transition-opacity before:duration-200\",\n \"before:bg-current before:opacity-0\",\n \"hover:before:opacity-8\",\n \"active:before:opacity-12\",\n ],\n {\n variants: {\n /**\n * Switch state (determines handle position and size)\n */\n selected: {\n true: [\n \"left-[24px]\", // Position when ON (52px - 24px = 28px)\n \"text-primary\", // State layer color\n ],\n false: [\n \"left-[8px]\", // Position when OFF (centered in left half)\n \"text-on-surface-variant\", // State layer color\n ],\n },\n\n /**\n * Pressed state (increases handle size)\n */\n pressed: {\n true: \"w-[28px] h-[28px]\", // MD3: 28dp when pressed\n false: \"\",\n },\n\n /**\n * Disabled state\n */\n disabled: {\n true: \"pointer-events-none\",\n false: \"\",\n },\n },\n compoundVariants: [\n // Size depends on selected + pressed state\n {\n selected: true,\n pressed: false,\n className: \"w-[24px] h-[24px]\", // MD3: 24dp when selected\n },\n {\n selected: false,\n pressed: false,\n className: \"w-[16px] h-[16px]\", // MD3: 16dp when unselected\n },\n ],\n defaultVariants: {\n selected: false,\n pressed: false,\n disabled: false,\n },\n }\n);\n\n/**\n * Switch handle (the actual thumb visual)\n */\nexport const switchHandleVariants = cva(\n [\n // Base classes for the handle\n \"relative z-10 rounded-full\",\n \"transition-all duration-200\",\n \"flex items-center justify-center\",\n ],\n {\n variants: {\n /**\n * Switch state (determines handle color and size)\n */\n selected: {\n true: \"bg-on-primary\", // MD3: on-primary when selected\n false: \"bg-outline\", // MD3: outline when unselected\n },\n\n /**\n * Pressed state\n */\n pressed: {\n true: \"w-[28px] h-[28px]\", // MD3: 28dp when pressed\n false: \"\",\n },\n\n /**\n * Disabled state\n */\n disabled: {\n true: \"bg-on-surface/38\", // MD3: 38% opacity for disabled\n false: \"\",\n },\n },\n compoundVariants: [\n // Size depends on selected + pressed state\n {\n selected: true,\n pressed: false,\n className: \"w-[24px] h-[24px]\", // MD3: 24dp when selected\n },\n {\n selected: false,\n pressed: false,\n className: \"w-[16px] h-[16px]\", // MD3: 16dp when unselected\n },\n // Disabled state overrides normal colors\n {\n selected: true,\n disabled: true,\n className: \"bg-on-surface/38\",\n },\n {\n selected: false,\n disabled: true,\n className: \"bg-on-surface/38\",\n },\n ],\n defaultVariants: {\n selected: false,\n pressed: false,\n disabled: false,\n },\n }\n);\n\n/**\n * Switch icon variants (icons inside handle)\n */\nexport const switchIconVariants = cva(\n [\n // Base classes for icons\n \"w-4 h-4\", // MD3: 16x16dp icon size\n \"transition-all duration-200\",\n ],\n {\n variants: {\n /**\n * Icon visibility based on state\n */\n visible: {\n true: \"opacity-100\",\n false: \"opacity-0\",\n },\n\n /**\n * Disabled state\n */\n disabled: {\n true: \"opacity-38\",\n false: \"\",\n },\n },\n defaultVariants: {\n visible: true,\n disabled: false,\n },\n }\n);\n\n/**\n * Switch label text variants\n */\nexport const switchLabelVariants = cva(\n [\n \"text-sm\", // MD3: Body Medium (14px)\n \"text-on-surface\",\n \"select-none\",\n \"ml-4\", // 16px spacing between switch and label (MD3 standard)\n ],\n {\n variants: {\n disabled: {\n true: \"\",\n false: \"\",\n },\n },\n defaultVariants: {\n disabled: false,\n },\n }\n);\n\n/**\n * Extract variant prop types from CVA\n */\nexport type SwitchVariants = VariantProps<typeof switchVariants>;\nexport type SwitchTrackVariants = VariantProps<typeof switchTrackVariants>;\nexport type SwitchHandleContainerVariants = VariantProps<typeof switchHandleContainerVariants>;\nexport type SwitchHandleVariants = VariantProps<typeof switchHandleVariants>;\nexport type SwitchIconVariants = VariantProps<typeof switchIconVariants>;\nexport type SwitchLabelVariants = VariantProps<typeof switchLabelVariants>;\n","\"use client\";\n\nimport { forwardRef, useRef } from \"react\";\nimport type React from \"react\";\nimport { useSwitch, useFocusRing, mergeProps, VisuallyHidden } from \"react-aria\";\nimport { useToggleState } from \"react-stately\";\nimport { cn } from \"../../utils/cn\";\nimport { useRipple } from \"../../hooks/useRipple\";\nimport {\n switchVariants,\n switchTrackVariants,\n switchHandleContainerVariants,\n switchHandleVariants,\n switchIconVariants,\n switchLabelVariants,\n} from \"./Switch.variants\";\nimport type { SwitchProps } from \"./Switch.types\";\n\n/**\n * Material Design 3 Switch Component (Layer 3: Styled)\n *\n * Built on React Aria for world-class accessibility.\n * Uses CVA for type-safe variant management.\n * Styled with Tailwind CSS using MD3 design tokens.\n *\n * Features:\n * - ✅ 2 states: on/off (not selection like checkbox)\n * - ✅ Optional icons in handle\n * - ✅ Ripple effect (Material Design)\n * - ✅ Full keyboard accessibility (via React Aria)\n * - ✅ Screen reader support (via React Aria)\n * - ✅ Focus management (via React Aria)\n * - ✅ Form integration (name, value props)\n *\n * MD3 Specifications:\n * - Track: 52x32dp (border-radius 16dp)\n * - Handle: 16x16dp (unselected), 24x24dp (selected), 28x28dp (pressed)\n * - Touch target: 48x48dp minimum\n * - State layers: 8% hover, 12% focus/pressed\n * - Disabled: 12% container, 38% content opacity\n * - Label spacing: 16px (ml-4)\n *\n * @example\n * ```tsx\n * // Basic usage\n * <Switch>Low power mode</Switch>\n *\n * // Controlled\n * <Switch isSelected={isOn} onChange={setIsOn}>\n * Notifications\n * </Switch>\n *\n * // With icons\n * <Switch icon={<IconClose />} selectedIcon={<IconCheck />}>\n * Airplane mode\n * </Switch>\n *\n * // Disabled\n * <Switch isDisabled>Disabled option</Switch>\n *\n * // Without label (icon-only)\n * <Switch aria-label=\"Toggle feature\" />\n * ```\n */\nexport const Switch = forwardRef<HTMLInputElement, SwitchProps>(\n (\n {\n // Content props\n children,\n icon,\n selectedIcon,\n\n // State props\n disableRipple = false,\n isDisabled = false,\n\n // Styling\n className,\n\n // Other props\n ...props\n },\n forwardedRef\n ) => {\n // Internal ref for React Aria\n const internalRef = useRef<HTMLInputElement>(null);\n\n // Merge internal ref with forwarded ref\n const ref = (forwardedRef ?? internalRef) as React.RefObject<HTMLInputElement>;\n\n // Extract data-testid and other HTML attributes\n const htmlAttrs = props as Record<string, unknown>;\n const dataTestId = htmlAttrs[\"data-testid\"] as string | undefined;\n const htmlId = htmlAttrs.id as string | undefined;\n const htmlTitle = htmlAttrs.title as string | undefined;\n\n // Remove HTML attributes from props for React Aria\n const {\n \"data-testid\": _dataTestId,\n id: _htmlId,\n title: _htmlTitle,\n ...restPropsWithoutHtmlAttrs\n } = props as Record<string, unknown>;\n\n // State management using React Stately\n const state = useToggleState(restPropsWithoutHtmlAttrs as Parameters<typeof useToggleState>[0]);\n\n // React Aria hooks - pass props without HTML attributes\n const { inputProps, labelProps, isPressed } = useSwitch(\n restPropsWithoutHtmlAttrs as Parameters<typeof useSwitch>[0],\n state,\n ref\n );\n const { isFocusVisible, focusProps } = useFocusRing();\n\n // Get selected state\n const isSelected = state.isSelected;\n\n // Ripple effect\n const { onMouseDown: handleRipple, ripples } = useRipple({\n disabled: isDisabled || disableRipple,\n });\n\n // Development warnings\n if (process.env.NODE_ENV === \"development\") {\n const ariaProps = restPropsWithoutHtmlAttrs as {\n \"aria-label\"?: string;\n \"aria-labelledby\"?: string;\n };\n if (!children && !ariaProps[\"aria-label\"] && !ariaProps[\"aria-labelledby\"]) {\n console.warn(\n \"[Switch] Switch should have a label (children) or aria-label for accessibility.\"\n );\n }\n }\n\n return (\n <label\n {...labelProps}\n className={cn(\n switchVariants({\n disabled: isDisabled,\n }),\n className\n )}\n data-testid={dataTestId}\n title={htmlTitle}\n >\n {/* Visually hidden native input for accessibility */}\n <VisuallyHidden>\n <input {...mergeProps(inputProps, focusProps)} ref={ref} id={htmlId} />\n </VisuallyHidden>\n\n {/* Visual switch container */}\n <div\n role=\"presentation\"\n className={cn(\n switchTrackVariants({\n selected: isSelected,\n disabled: isDisabled,\n })\n )}\n >\n {/* Focus ring (keyboard focus indicator) */}\n {isFocusVisible && (\n <div\n className=\"border-primary absolute inset-[-4px] animate-pulse rounded-full border-2\"\n aria-hidden=\"true\"\n />\n )}\n\n {/* Handle container (with state layers and ripple) */}\n <div\n className={cn(\n switchHandleContainerVariants({\n selected: isSelected,\n pressed: isPressed,\n disabled: isDisabled,\n })\n )}\n onMouseDown={handleRipple}\n role=\"presentation\"\n >\n {/* Ripple effect */}\n {ripples}\n\n {/* Handle (thumb) */}\n <div\n className={cn(\n switchHandleVariants({\n selected: isSelected,\n pressed: isPressed,\n disabled: isDisabled,\n })\n )}\n >\n {/* Icon when OFF */}\n {!isSelected && icon && (\n <div\n className={cn(\n switchIconVariants({\n visible: !isSelected,\n disabled: isDisabled,\n })\n )}\n >\n {icon}\n </div>\n )}\n\n {/* Icon when ON */}\n {isSelected && selectedIcon && (\n <div\n className={cn(\n switchIconVariants({\n visible: isSelected,\n disabled: isDisabled,\n })\n )}\n >\n {selectedIcon}\n </div>\n )}\n </div>\n </div>\n </div>\n\n {/* Label text */}\n {children && (\n <span\n className={cn(\n switchLabelVariants({\n disabled: isDisabled,\n })\n )}\n >\n {children}\n </span>\n )}\n </label>\n );\n }\n);\n\nSwitch.displayName = \"Switch\";\n","import { createContext, forwardRef, useRef } from \"react\";\nimport { useRadioGroup } from \"react-aria\";\nimport { useRadioGroupState } from \"react-stately\";\nimport type { RadioGroupState } from \"react-stately\";\nimport type { RadioGroupHeadlessProps } from \"./Radio.types\";\n\n/**\n * Context to provide RadioGroup state to child Radio components\n */\nexport const RadioGroupContext = createContext<RadioGroupState | null>(null);\n\n/**\n * Headless RadioGroup Component (Layer 2)\n *\n * Unstyled radio group primitive using React Aria for accessibility.\n * Provides behavior only - bring your own styles.\n *\n * Features:\n * - Full keyboard navigation (Arrow keys, Tab)\n * - Screen reader support\n * - Single-selection enforcement\n * - Focus management\n * - Disabled state handling\n * - Form integration\n *\n * @example\n * ```tsx\n * // Use for custom styling\n * <RadioGroupHeadless label=\"Options\" className=\"custom-group\">\n * <RadioHeadless value=\"a\">Option A</RadioHeadless>\n * <RadioHeadless value=\"b\">Option B</RadioHeadless>\n * </RadioGroupHeadless>\n * ```\n */\nexport const RadioGroupHeadless = forwardRef<HTMLDivElement, RadioGroupHeadlessProps>(\n ({ className, children, renderLabel, ...props }, forwardedRef) => {\n // Internal ref for React Aria\n const internalRef = useRef<HTMLDivElement>(null);\n\n // Merge internal ref with forwarded ref\n const ref = (forwardedRef ?? internalRef) as React.RefObject<HTMLDivElement>;\n\n // State management using React Stately\n const state = useRadioGroupState(props);\n\n // React Aria hook - handles all accessibility\n const { radioGroupProps, labelProps } = useRadioGroup(props, state);\n\n // Extract data-testid if present\n const dataTestId = (props as unknown as { \"data-testid\"?: string })[\"data-testid\"];\n\n return (\n <div {...radioGroupProps} ref={ref} className={className} data-testid={dataTestId}>\n {/* Group label — rendered via slot when provided, otherwise default span */}\n {props.label &&\n (renderLabel ? renderLabel(labelProps) : <span {...labelProps}>{props.label}</span>)}\n\n {/* Provide state to child Radio components via context */}\n <RadioGroupContext.Provider value={state}>{children}</RadioGroupContext.Provider>\n </div>\n );\n }\n);\n\nRadioGroupHeadless.displayName = \"RadioGroupHeadless\";\n","import { cva, type VariantProps } from \"class-variance-authority\";\n\n/**\n * Material Design 3 RadioGroup Variants (CVA)\n *\n * Type-safe variant management for RadioGroup component.\n * Uses Tailwind CSS classes mapped to MD3 design tokens.\n *\n * MD3 Specifications:\n * - Radio icon: 20x20dp (within 40x40dp touch target)\n * - Outline width: 2dp\n * - State layers: 8% hover, 12% focus/pressed\n * - Disabled: 38% opacity\n * - Radio spacing: 16px gap between radios\n */\nexport const radioGroupVariants = cva(\n [\n // Base classes (always applied to group wrapper)\n \"flex\",\n \"gap-4\", // 16px spacing between radios (MD3 standard)\n ],\n {\n variants: {\n /**\n * Layout orientation\n */\n orientation: {\n vertical: \"flex-col\",\n horizontal: \"flex-row flex-wrap\",\n },\n\n /**\n * Disabled state\n */\n disabled: {\n true: \"\",\n false: \"\",\n },\n },\n defaultVariants: {\n orientation: \"vertical\",\n disabled: false,\n },\n }\n);\n\n/**\n * RadioGroup label variants\n */\nexport const radioGroupLabelVariants = cva(\n [\n \"text-sm font-medium\", // MD3: Body Medium\n \"text-on-surface\",\n \"mb-3\", // Spacing below label (12px)\n ],\n {\n variants: {\n disabled: {\n true: \"opacity-38\",\n false: \"\",\n },\n },\n defaultVariants: {\n disabled: false,\n },\n }\n);\n\n/**\n * Material Design 3 Radio Variants (CVA)\n *\n * Type-safe variant management for Radio component.\n * Uses Tailwind CSS classes mapped to MD3 design tokens.\n *\n * MD3 Specifications:\n * - Radio icon: 20x20dp (within 40x40dp touch target)\n * - Outline width: 2dp\n * - Inner dot: 10px (selected state)\n * - State layers: 8% hover, 12% focus/pressed\n * - Disabled: 38% opacity\n * - Label spacing: 16px (ml-4)\n */\nexport const radioVariants = cva(\n [\n // Base classes (always applied to label wrapper)\n \"relative inline-flex items-center cursor-pointer select-none\",\n \"transition-opacity duration-200\",\n ],\n {\n variants: {\n /**\n * Disabled state\n */\n disabled: {\n true: \"opacity-38 cursor-not-allowed pointer-events-none\",\n false: \"\",\n },\n },\n defaultVariants: {\n disabled: false,\n },\n }\n);\n\n/**\n * Radio container variants (for the visual radio circle)\n */\nexport const radioContainerVariants = cva(\n [\n // Base classes for radio visual container\n \"relative inline-flex items-center justify-center\",\n \"w-10 h-10\", // 40x40dp touch target (MD3 spec)\n \"flex-shrink-0\",\n \"transition-all duration-200\",\n\n // State layer (hover, focus, active) - MD3 spec: 8%/12%/12% opacity\n \"before:absolute before:inset-0 before:rounded-full before:transition-opacity before:duration-200\",\n \"before:bg-current before:opacity-0\",\n \"hover:before:opacity-8\",\n \"active:before:opacity-12\",\n ],\n {\n variants: {\n /**\n * Radio state (determines visual appearance)\n */\n state: {\n unselected: \"text-on-surface-variant\",\n selected: \"text-primary\",\n },\n\n /**\n * Error/invalid state\n */\n isInvalid: {\n true: \"text-error\",\n false: \"\",\n },\n\n /**\n * Disabled state\n */\n disabled: {\n true: \"text-on-surface pointer-events-none\",\n false: \"\",\n },\n },\n compoundVariants: [\n // Error state overrides normal colors for all states\n {\n state: \"unselected\",\n isInvalid: true,\n disabled: false,\n className: \"text-error\",\n },\n {\n state: \"selected\",\n isInvalid: true,\n disabled: false,\n className: \"text-error\",\n },\n ],\n defaultVariants: {\n state: \"unselected\",\n isInvalid: false,\n disabled: false,\n },\n }\n);\n\n/**\n * Radio icon outer circle variants (the 20x20dp circle)\n */\nexport const radioIconOuterVariants = cva(\n [\n // Base classes for the radio outer circle\n \"transition-all duration-200\",\n ],\n {\n variants: {\n /**\n * Radio state\n */\n state: {\n unselected: [\n \"fill-transparent\",\n \"stroke-current\", // Uses parent text color (on-surface-variant or error)\n \"stroke-2\", // MD3: 2dp outline width\n ],\n selected: [\n \"fill-current\", // Uses parent text color (primary or error)\n \"stroke-none\",\n ],\n },\n\n /**\n * Disabled state\n */\n disabled: {\n true: [\"fill-transparent\", \"stroke-current\", \"stroke-2\"],\n false: \"\",\n },\n },\n compoundVariants: [\n // Disabled + selected state overrides fill\n {\n state: \"selected\",\n disabled: true,\n className: \"fill-current stroke-none\",\n },\n ],\n defaultVariants: {\n state: \"unselected\",\n disabled: false,\n },\n }\n);\n\n/**\n * Radio icon inner dot variants (the 10px center dot when selected)\n */\nexport const radioIconInnerVariants = cva(\n [\n \"fill-current\", // Inherits color from parent (on-primary)\n \"transition-all duration-200\",\n ],\n {\n variants: {\n /**\n * Visibility based on state\n */\n visible: {\n true: \"opacity-100 scale-100\",\n false: \"opacity-0 scale-0\",\n },\n },\n defaultVariants: {\n visible: false,\n },\n }\n);\n\n/**\n * Radio label text variants\n */\nexport const radioLabelVariants = cva(\n [\n \"text-sm\", // MD3: Body Medium (14px)\n \"text-on-surface\",\n \"select-none\",\n \"ml-1.5\",\n ],\n {\n variants: {\n disabled: {\n true: \"\",\n false: \"\",\n },\n },\n defaultVariants: {\n disabled: false,\n },\n }\n);\n\n/**\n * Extract variant prop types from CVA\n */\nexport type RadioGroupVariants = VariantProps<typeof radioGroupVariants>;\nexport type RadioGroupLabelVariants = VariantProps<typeof radioGroupLabelVariants>;\nexport type RadioVariants = VariantProps<typeof radioVariants>;\nexport type RadioContainerVariants = VariantProps<typeof radioContainerVariants>;\nexport type RadioIconOuterVariants = VariantProps<typeof radioIconOuterVariants>;\nexport type RadioIconInnerVariants = VariantProps<typeof radioIconInnerVariants>;\nexport type RadioLabelVariants = VariantProps<typeof radioLabelVariants>;\n","\"use client\";\n\nimport { forwardRef, useRef, useContext } from \"react\";\nimport type React from \"react\";\nimport { useRadio, useFocusRing, mergeProps, VisuallyHidden } from \"react-aria\";\nimport { cn } from \"../../utils/cn\";\nimport { useRipple } from \"../../hooks/useRipple\";\nimport { RadioGroupContext } from \"./RadioGroupHeadless\";\nimport {\n radioVariants,\n radioContainerVariants,\n radioIconOuterVariants,\n radioIconInnerVariants,\n radioLabelVariants,\n} from \"./Radio.variants\";\nimport type { RadioProps } from \"./Radio.types\";\n\n/**\n * Material Design 3 Radio Component (Layer 3: Styled)\n *\n * Built on React Aria for world-class accessibility.\n * Uses CVA for type-safe variant management.\n * Styled with Tailwind CSS using MD3 design tokens.\n * Must be used within a RadioGroup for proper functionality.\n *\n * Features:\n * - ✅ 2 states: unselected, selected\n * - ✅ Ripple effect (Material Design)\n * - ✅ Full keyboard accessibility (via React Aria)\n * - ✅ Screen reader support (via React Aria)\n * - ✅ Focus management (via React Aria)\n * - ✅ Form integration (name, value props from RadioGroup)\n *\n * MD3 Specifications:\n * - Radio icon: 20x20dp (within 40x40dp touch target)\n * - Outer circle: 20px\n * - Inner dot: 10px (selected state)\n * - Outline width: 2dp\n * - State layers: 8% hover, 12% focus/pressed\n * - Disabled: 38% opacity\n * - Label spacing: 16px (ml-4)\n *\n * @example\n * ```tsx\n * // Basic usage within RadioGroup\n * <RadioGroup label=\"Options\">\n * <Radio value=\"a\">Option A</Radio>\n * <Radio value=\"b\">Option B</Radio>\n * </RadioGroup>\n *\n * // Without label (needs aria-label)\n * <RadioGroup label=\"Options\">\n * <Radio value=\"a\" aria-label=\"Option A\" />\n * </RadioGroup>\n *\n * // Disabled individual radio\n * <RadioGroup label=\"Options\">\n * <Radio value=\"a\">Enabled</Radio>\n * <Radio value=\"b\" isDisabled>Disabled</Radio>\n * </RadioGroup>\n *\n * // Custom styling\n * <Radio value=\"custom\" className=\"my-custom-class\">\n * Custom\n * </Radio>\n * ```\n */\nexport const Radio = forwardRef<HTMLInputElement, RadioProps>(\n (\n {\n // Content props\n children,\n\n // State props\n disableRipple = false,\n isDisabled = false,\n\n // Styling\n className,\n\n // Other props\n ...props\n },\n forwardedRef\n ) => {\n // Get RadioGroup state from context\n const state = useContext(RadioGroupContext);\n\n if (!state) {\n throw new Error(\"Radio must be used within a RadioGroup\");\n }\n\n // Internal ref for React Aria\n const internalRef = useRef<HTMLInputElement>(null);\n\n // Merge internal ref with forwarded ref\n const ref = (forwardedRef ?? internalRef) as React.RefObject<HTMLInputElement>;\n\n // Extract data-testid and other HTML attributes\n const htmlAttrs = props as Record<string, unknown>;\n const dataTestId = htmlAttrs[\"data-testid\"] as string | undefined;\n const htmlId = htmlAttrs.id as string | undefined;\n const htmlTitle = htmlAttrs.title as string | undefined;\n\n // Remove HTML attributes from props for React Aria\n const {\n \"data-testid\": _dataTestId,\n id: _htmlId,\n title: _htmlTitle,\n ...restPropsWithoutHtmlAttrs\n } = props as Record<string, unknown>;\n\n // React Aria hooks - pass props without HTML attributes\n const {\n inputProps,\n isSelected,\n isDisabled: radioIsDisabled,\n } = useRadio(\n {\n ...restPropsWithoutHtmlAttrs,\n value: props.value,\n } as Parameters<typeof useRadio>[0],\n state,\n ref\n );\n const { isFocusVisible, focusProps } = useFocusRing();\n\n // Determine final disabled state (group or individual)\n const finalIsDisabled = isDisabled || radioIsDisabled;\n\n // Determine visual state\n const visualState = isSelected ? \"selected\" : \"unselected\";\n\n // Ripple effect\n const { onMouseDown: handleRipple, ripples } = useRipple({\n disabled: finalIsDisabled || disableRipple,\n });\n\n // Development warnings\n if (process.env.NODE_ENV === \"development\") {\n const ariaProps = restPropsWithoutHtmlAttrs as {\n \"aria-label\"?: string;\n \"aria-labelledby\"?: string;\n };\n if (!children && !ariaProps[\"aria-label\"] && !ariaProps[\"aria-labelledby\"]) {\n console.warn(\n \"[Radio] Radio should have a label (children) or aria-label for accessibility.\"\n );\n }\n }\n\n // Get isInvalid from RadioGroup state if available\n const isInvalid = state.validationState === \"invalid\";\n\n return (\n <label\n className={cn(\n radioVariants({\n disabled: finalIsDisabled,\n }),\n className\n )}\n data-testid={dataTestId}\n title={htmlTitle}\n >\n {/* Visually hidden native input for accessibility */}\n <VisuallyHidden>\n <input {...mergeProps(inputProps, focusProps)} ref={ref} id={htmlId} />\n </VisuallyHidden>\n\n {/* Visual radio container */}\n <div\n role=\"presentation\"\n className={cn(\n radioContainerVariants({\n state: visualState,\n isInvalid,\n disabled: finalIsDisabled,\n })\n )}\n onMouseDown={handleRipple}\n >\n {/* Ripple effect */}\n {ripples}\n\n {/* SVG Radio Visual */}\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n aria-hidden=\"true\"\n className=\"relative z-10\"\n >\n {/* Outer circle (20x20) */}\n <circle\n cx=\"10\"\n cy=\"10\"\n r=\"9\"\n className={cn(\n radioIconOuterVariants({\n state: visualState,\n disabled: finalIsDisabled,\n })\n )}\n />\n\n {/* Inner dot (10px diameter = 5px radius, shown when selected) */}\n <circle\n cx=\"10\"\n cy=\"10\"\n r=\"5\"\n className={cn(\n radioIconInnerVariants({\n visible: isSelected,\n })\n )}\n style={{ fill: \"var(--color-on-primary)\" }}\n />\n\n {/* Focus ring (visible on keyboard focus) */}\n {isFocusVisible && (\n <circle\n cx=\"10\"\n cy=\"10\"\n r=\"13\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n className=\"animate-pulse\"\n />\n )}\n </svg>\n </div>\n\n {/* Label text */}\n {children && (\n <span\n className={cn(\n radioLabelVariants({\n disabled: finalIsDisabled,\n })\n )}\n >\n {children}\n </span>\n )}\n </label>\n );\n }\n);\n\nRadio.displayName = \"Radio\";\n","\"use client\";\n\nimport { forwardRef } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { RadioGroupHeadless } from \"./RadioGroupHeadless\";\nimport { radioGroupVariants, radioGroupLabelVariants } from \"./Radio.variants\";\nimport type { RadioGroupProps } from \"./Radio.types\";\n\n/**\n * Material Design 3 RadioGroup Component (Layer 3: Styled)\n *\n * Built on React Aria for world-class accessibility.\n * Uses CVA for type-safe variant management.\n * Styled with Tailwind CSS using MD3 design tokens.\n *\n * Features:\n * - ✅ Single-selection behavior\n * - ✅ Horizontal and vertical orientation\n * - ✅ Error/invalid state support\n * - ✅ Full keyboard accessibility (via React Aria)\n * - ✅ Screen reader support (via React Aria)\n * - ✅ Focus management (via React Aria)\n * - ✅ Form integration (name, value props)\n *\n * MD3 Specifications:\n * - Radio icon: 20x20dp (within 40x40dp touch target)\n * - State layers: 8% hover, 12% focus/pressed\n * - Disabled: 38% opacity\n * - Radio spacing: 16px gap\n *\n * @example\n * ```tsx\n * // Basic usage (vertical)\n * <RadioGroup label=\"Favorite color\">\n * <Radio value=\"red\">Red</Radio>\n * <Radio value=\"blue\">Blue</Radio>\n * </RadioGroup>\n *\n * // Horizontal orientation\n * <RadioGroup label=\"Size\" orientation=\"horizontal\">\n * <Radio value=\"s\">Small</Radio>\n * <Radio value=\"m\">Medium</Radio>\n * <Radio value=\"l\">Large</Radio>\n * </RadioGroup>\n *\n * // Controlled\n * <RadioGroup label=\"Choice\" value={selected} onChange={setSelected}>\n * <Radio value=\"a\">Option A</Radio>\n * <Radio value=\"b\">Option B</Radio>\n * </RadioGroup>\n *\n * // Error state\n * <RadioGroup label=\"Required\" isInvalid>\n * <Radio value=\"yes\">Yes</Radio>\n * <Radio value=\"no\">No</Radio>\n * </RadioGroup>\n *\n * // Disabled\n * <RadioGroup label=\"Options\" isDisabled>\n * <Radio value=\"a\">Option A</Radio>\n * <Radio value=\"b\">Option B</Radio>\n * </RadioGroup>\n * ```\n */\nexport const RadioGroup = forwardRef<HTMLDivElement, RadioGroupProps>(\n (\n {\n // Content props\n children,\n\n // State props\n orientation = \"vertical\",\n isInvalid: _isInvalid = false,\n isDisabled = false,\n\n // Styling\n className,\n\n // Other props\n ...props\n },\n ref\n ) => {\n // Extract data-testid and other HTML attributes\n const htmlAttrs = props as Record<string, unknown>;\n const dataTestId = htmlAttrs[\"data-testid\"] as string | undefined;\n\n // Remove HTML attributes from props for React Aria\n const { \"data-testid\": _dataTestId, ...restPropsWithoutHtmlAttrs } = props as Record<\n string,\n unknown\n >;\n\n // Development warnings\n if (process.env.NODE_ENV === \"development\") {\n const ariaProps = restPropsWithoutHtmlAttrs as {\n label?: string;\n \"aria-label\"?: string;\n \"aria-labelledby\"?: string;\n };\n if (!ariaProps.label && !ariaProps[\"aria-label\"] && !ariaProps[\"aria-labelledby\"]) {\n console.warn(\n \"[RadioGroup] RadioGroup should have a label or aria-label for accessibility.\"\n );\n }\n }\n\n return (\n <RadioGroupHeadless\n {...restPropsWithoutHtmlAttrs}\n isDisabled={isDisabled}\n ref={ref}\n className={cn(\"flex flex-col\", className)}\n data-testid={dataTestId}\n renderLabel={(labelProps) => (\n <div\n {...labelProps}\n className={cn(\n radioGroupLabelVariants({\n disabled: isDisabled,\n })\n )}\n >\n {props.label}\n </div>\n )}\n >\n {/* Radio buttons container */}\n <div\n className={cn(\n radioGroupVariants({\n orientation,\n disabled: isDisabled,\n })\n )}\n >\n {children}\n </div>\n </RadioGroupHeadless>\n );\n }\n);\n\nRadioGroup.displayName = \"RadioGroup\";\n","import { forwardRef, useRef, useContext } from \"react\";\nimport { useRadio, useFocusRing } from \"react-aria\";\nimport { RadioGroupContext } from \"./RadioGroupHeadless\";\nimport type { RadioHeadlessProps } from \"./Radio.types\";\n\n/**\n * Headless Radio Component (Layer 2)\n *\n * Unstyled radio primitive using React Aria for accessibility.\n * Provides behavior only - bring your own styles.\n * Must be used within a RadioGroup for proper functionality.\n *\n * Features:\n * - Full keyboard navigation (Space to select)\n * - Screen reader support\n * - Touch/pointer event handling\n * - Focus management\n * - Disabled state handling\n * - Form integration\n *\n * @example\n * ```tsx\n * // Use for custom styling\n * <RadioGroupHeadless label=\"Options\">\n * <RadioHeadless value=\"a\" className=\"custom-radio\">\n * Option A\n * </RadioHeadless>\n * </RadioGroupHeadless>\n *\n * // With render prop for custom visual\n * <RadioHeadless\n * value=\"a\"\n * renderRadio={({ isSelected }) => (\n * <CustomRadioIcon checked={isSelected} />\n * )}\n * >\n * Custom visual\n * </RadioHeadless>\n * ```\n */\nexport const RadioHeadless = forwardRef<HTMLInputElement, RadioHeadlessProps>(\n ({ className, children, renderRadio, ...props }, forwardedRef) => {\n // Get RadioGroup state from context\n const state = useContext(RadioGroupContext);\n\n if (!state) {\n throw new Error(\"RadioHeadless must be used within a RadioGroupHeadless\");\n }\n\n // Internal ref for React Aria\n const internalRef = useRef<HTMLInputElement>(null);\n\n // Merge internal ref with forwarded ref\n const ref = (forwardedRef ?? internalRef) as React.RefObject<HTMLInputElement>;\n\n // React Aria hook - handles all accessibility\n const { inputProps, isSelected, isDisabled, isPressed } = useRadio(props, state, ref);\n\n // Focus ring for keyboard navigation\n const { isFocusVisible, focusProps } = useFocusRing();\n\n return (\n <label className={className}>\n <input {...inputProps} {...focusProps} ref={ref} />\n {renderRadio?.({\n isSelected,\n isDisabled,\n isFocusVisible,\n isPressed,\n })}\n {children}\n </label>\n );\n }\n);\n\nRadioHeadless.displayName = \"RadioHeadless\";\n","import { createContext, forwardRef, useContext, useRef } from \"react\";\nimport { useTab, useTabList, useTabPanel, useFocusRing } from \"react-aria\";\nimport { mergeProps } from \"@react-aria/utils\";\nimport type { TabListState } from \"react-stately\";\nimport type {\n HeadlessTabProps,\n HeadlessTabPanelProps,\n TabItem,\n HeadlessTabsContextValue,\n} from \"./Tabs.types\";\n\n/**\n * Context providing React Aria tab state to all headless primitives.\n * State is created in the Tabs wrapper and shared here.\n */\nexport const HeadlessTabsContext = createContext<HeadlessTabsContextValue | null>(null);\n\n/**\n * Hook to consume the headless tabs context\n * @internal\n */\nexport function useHeadlessTabsContext(componentName: string): HeadlessTabsContextValue {\n const context = useContext(HeadlessTabsContext);\n if (!context) {\n throw new Error(`${componentName} must be used within a Tabs component`);\n }\n return context;\n}\n\n/**\n * Props for the HeadlessTabList container.\n * State is injected from HeadlessTabsContext (created in Tabs wrapper).\n */\nexport interface HeadlessTabListContainerProps {\n /** Children are Tab elements */\n children: React.ReactNode;\n /** Additional CSS classes */\n className?: string;\n}\n\n/**\n * Headless TabList Component (Layer 2)\n *\n * Unstyled tab list container. Applies useTabList to the container element\n * which wires up role=\"tablist\", aria-label, and keyboard navigation.\n * State must be provided via HeadlessTabsContext (from the Tabs wrapper).\n *\n * @example\n * ```tsx\n * // Advanced usage via headless primitives\n * // State is provided by the Tabs wrapper above in the tree\n * <HeadlessTabList className=\"my-tablist\">\n * {items.map(item => <HeadlessTab key={item.key} item={item} />)}\n * </HeadlessTabList>\n * ```\n */\nexport const HeadlessTabList = forwardRef<HTMLDivElement, HeadlessTabListContainerProps>(\n ({ children, className }, forwardedRef) => {\n const { state } = useHeadlessTabsContext(\"HeadlessTabList\");\n\n const internalRef = useRef<HTMLDivElement>(null);\n const ref = (forwardedRef ?? internalRef) as React.RefObject<HTMLDivElement>;\n\n const { tabListProps } = useTabList({}, state, ref);\n\n return (\n <div {...tabListProps} ref={ref} className={className}>\n {children}\n </div>\n );\n }\n);\n\nHeadlessTabList.displayName = \"HeadlessTabList\";\n\n/**\n * Headless Tab Component (Layer 2)\n *\n * Unstyled individual tab item. Provides full React Aria accessibility:\n * - role=\"tab\"\n * - aria-selected\n * - aria-controls (pointing to panel)\n * - roving tabIndex\n * - keyboard activation\n *\n * Must be used within HeadlessTabsContext.\n *\n * @example\n * ```tsx\n * <HeadlessTab item={item}>\n * {({ isSelected, isFocusVisible }) => (\n * <span className={isSelected ? 'font-bold' : ''}>\n * {item.label}\n * </span>\n * )}\n * </HeadlessTab>\n * ```\n */\nexport const HeadlessTab = forwardRef<HTMLButtonElement, HeadlessTabProps>(\n ({ item, className, onMouseDown, children, ...props }, forwardedRef) => {\n const { state } = useHeadlessTabsContext(\"HeadlessTab\");\n\n const internalRef = useRef<HTMLButtonElement>(null);\n const ref = (forwardedRef ?? internalRef) as React.RefObject<HTMLButtonElement>;\n\n const { tabProps, isSelected, isDisabled, isPressed } = useTab(\n {\n key: item.key,\n ...(item.isDisabled !== undefined && { isDisabled: item.isDisabled }),\n },\n state,\n ref as React.RefObject<HTMLElement>\n );\n\n const { isFocusVisible, focusProps } = useFocusRing();\n\n const mergedProps = mergeProps(tabProps, focusProps, {\n className,\n onMouseDown,\n });\n\n return (\n <button {...mergedProps} ref={ref} type=\"button\" data-key={String(item.key)} {...props}>\n {typeof children === \"function\"\n ? children({ isSelected, isDisabled, isFocusVisible, isPressed })\n : children}\n </button>\n );\n }\n);\n\nHeadlessTab.displayName = \"HeadlessTab\";\n\n/**\n * Headless TabPanel Component (Layer 2)\n *\n * Unstyled tab panel. Provides:\n * - role=\"tabpanel\"\n * - aria-labelledby (pointing to its tab)\n * - Focus management for panels without focusable children\n *\n * Must be used within HeadlessTabsContext.\n *\n * @example\n * ```tsx\n * <HeadlessTabPanel>\n * <p>Panel content here</p>\n * </HeadlessTabPanel>\n * ```\n */\nexport const HeadlessTabPanel = forwardRef<HTMLDivElement, HeadlessTabPanelProps>(\n ({ children, className, ...props }, forwardedRef) => {\n const { state } = useHeadlessTabsContext(\"HeadlessTabPanel\");\n\n const internalRef = useRef<HTMLDivElement>(null);\n const ref = (forwardedRef ?? internalRef) as React.RefObject<HTMLDivElement>;\n\n const { tabPanelProps } = useTabPanel(props, state, ref);\n\n return (\n <div {...tabPanelProps} ref={ref} className={className}>\n {children}\n </div>\n );\n }\n);\n\nHeadlessTabPanel.displayName = \"HeadlessTabPanel\";\n\n/**\n * Expose TabListState type for advanced consumers\n */\nexport type { TabListState, TabItem };\n","\"use client\";\n\nimport { createContext, forwardRef, useContext, useMemo, Children, isValidElement } from \"react\";\nimport type React from \"react\";\nimport { Item } from \"react-stately\";\nimport { useTabListState } from \"react-stately\";\nimport { cn } from \"../../utils/cn\";\nimport { HeadlessTabsContext } from \"./TabsHeadless\";\nimport type {\n TabsProps,\n TabsContextValue,\n TabVariant,\n TabLayout,\n TabProps,\n TabItem,\n} from \"./Tabs.types\";\nimport type { Key } from \"react-stately\";\n\n/**\n * Context providing MD3 styling context (variant, layout) to Tab, TabList, TabPanel\n */\nexport const TabsContext = createContext<TabsContextValue | null>(null);\n\n/**\n * Hook to consume the tabs styling context\n * @internal\n */\nexport function useTabsContext(): TabsContextValue {\n const context = useContext(TabsContext);\n if (!context) {\n throw new Error(\"Component must be used within a Tabs component\");\n }\n return context;\n}\n\n/**\n * Resolves a React component's display name safely.\n * Handles both regular function components and exotic components (forwardRef, memo, etc.)\n * where `typeof component` is \"object\", not \"function\".\n */\nfunction getComponentName(type: unknown): string {\n if (typeof type === \"string\") return type;\n // forwardRef / memo return exotic objects — check displayName/name on the object itself\n const exotic = type as { displayName?: string; name?: string };\n return exotic.displayName ?? exotic.name ?? \"\";\n}\n\n/**\n * Extracts Tab props from the children tree (TabList > Tab children)\n * Used to build the React Aria collection for state management\n */\nfunction extractTabItemsFromChildren(children: React.ReactNode): Array<{\n key: Key;\n label?: string;\n icon?: React.ReactNode;\n isDisabled?: boolean;\n \"aria-label\"?: string;\n}> {\n const items: Array<{\n key: Key;\n label?: string;\n icon?: React.ReactNode;\n isDisabled?: boolean;\n \"aria-label\"?: string;\n }> = [];\n\n Children.forEach(children, (child) => {\n if (!isValidElement(child)) return;\n\n if (getComponentName(child.type) === \"TabList\") {\n // Extract Tab children from the TabList\n const tabListProps = child.props as { children?: React.ReactNode };\n Children.forEach(tabListProps.children, (tabChild) => {\n if (!isValidElement(tabChild)) return;\n\n if (getComponentName(tabChild.type) === \"Tab\") {\n const tabProps = tabChild.props as TabProps & { \"aria-label\"?: string };\n // Conditionally include optional properties to satisfy exactOptionalPropertyTypes.\n // Passing undefined explicitly would violate the strict optional type constraint.\n items.push({\n key: tabProps.id,\n ...(tabProps.label !== undefined && { label: tabProps.label }),\n ...(tabProps.icon !== undefined && { icon: tabProps.icon }),\n ...(tabProps.isDisabled !== undefined && { isDisabled: tabProps.isDisabled }),\n ...(tabProps[\"aria-label\"] !== undefined && { \"aria-label\": tabProps[\"aria-label\"] }),\n });\n }\n });\n }\n });\n\n return items;\n}\n\n/**\n * Material Design 3 Tabs Component (Layer 3: Styled Wrapper)\n *\n * The Tabs component manages shared selected state via useTabListState (React Aria + Stately),\n * and provides this state to all child TabList, Tab, and TabPanel components via context.\n *\n * Architecture:\n * 1. Extracts Tab metadata from children to build the React Aria collection\n * 2. Creates tab list state with useTabListState\n * 3. Provides React Aria state via HeadlessTabsContext\n * 4. Provides MD3 styling context via TabsContext\n *\n * Features:\n * - ✅ Controlled and uncontrolled selection\n * - ✅ Primary and secondary variants\n * - ✅ Fixed and scrollable layouts\n * - ✅ Full keyboard navigation (via React Aria)\n * - ✅ WCAG 2.1 AA compliant\n *\n * @example\n * ```tsx\n * // Uncontrolled\n * <Tabs defaultSelectedKey=\"tab1\" aria-label=\"Settings\">\n * <TabList>\n * <Tab id=\"tab1\" label=\"General\" />\n * <Tab id=\"tab2\" label=\"Privacy\" />\n * </TabList>\n * <TabPanel id=\"tab1\">General content</TabPanel>\n * <TabPanel id=\"tab2\">Privacy content</TabPanel>\n * </Tabs>\n *\n * // Controlled\n * <Tabs selectedKey={tab} onSelectionChange={setTab} aria-label=\"App\">\n * <TabList variant=\"secondary\">\n * <Tab id=\"overview\" label=\"Overview\" />\n * <Tab id=\"details\" label=\"Details\" />\n * </TabList>\n * <TabPanel id=\"overview\">Overview</TabPanel>\n * <TabPanel id=\"details\">Details</TabPanel>\n * </Tabs>\n * ```\n */\nexport const Tabs = forwardRef<HTMLDivElement, TabsProps>(\n (\n {\n selectedKey,\n defaultSelectedKey,\n onSelectionChange,\n variant = \"primary\",\n layout = \"fixed\",\n children,\n className,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": ariaLabelledBy,\n },\n ref\n ) => {\n // Extract tab items from children tree to build the React Aria collection\n const tabItems = useMemo(() => extractTabItemsFromChildren(children), [children]);\n\n // Create React Aria tab list state with Item-based collection.\n // ARIA label props (aria-label / aria-labelledby) are NOT part of TabListStateOptions —\n // they belong to useTabList (the React Aria hook in TabList.tsx).\n // Conditionally spread optional props to satisfy exactOptionalPropertyTypes: passing\n // undefined explicitly would violate the strict optional type constraint.\n const state = useTabListState<TabItem>({\n ...(selectedKey !== undefined && { selectedKey }),\n ...(defaultSelectedKey !== undefined && { defaultSelectedKey }),\n ...(onSelectionChange !== undefined && { onSelectionChange }),\n disabledKeys: tabItems.filter((t) => t.isDisabled).map((t) => t.key),\n children: tabItems.map((item) => (\n <Item key={item.key} textValue={item.label ?? item[\"aria-label\"] ?? String(item.key)}>\n {item.label ?? item[\"aria-label\"] ?? \"\"}\n </Item>\n )),\n });\n\n // MD3 styling context — conditionally include ARIA label props (exactOptionalPropertyTypes)\n const tabsContextValue = useMemo<TabsContextValue>(\n () => ({\n selectedKey: state.selectedKey,\n variant,\n layout,\n disabledKeys: tabItems.filter((t) => t.isDisabled).map((t) => t.key),\n ...(ariaLabel !== undefined && { \"aria-label\": ariaLabel }),\n ...(ariaLabelledBy !== undefined && { \"aria-labelledby\": ariaLabelledBy }),\n }),\n [state.selectedKey, variant, layout, tabItems, ariaLabel, ariaLabelledBy]\n );\n\n // Headless context providing React Aria state\n const headlessContextValue = useMemo(() => ({ state }), [state]);\n\n return (\n <HeadlessTabsContext.Provider value={headlessContextValue}>\n <TabsContext.Provider value={tabsContextValue}>\n <div ref={ref} className={cn(\"flex flex-col\", className)}>\n {children}\n </div>\n </TabsContext.Provider>\n </HeadlessTabsContext.Provider>\n );\n }\n);\n\nTabs.displayName = \"Tabs\";\n\n// Export context helpers for use by child components\nexport type { TabVariant, TabLayout };\n","import { cva, type VariantProps } from \"class-variance-authority\";\n\n/**\n * Material Design 3 TabList Variants (CVA)\n *\n * MD3 Specifications:\n * - Container background: bg-surface\n * - Container height: 48dp (fixed height tabs)\n * - Bottom border: outline-variant color, 1dp\n * - Fixed layout: tabs fill width equally\n * - Scrollable layout: tabs overflow horizontally, no wrapping\n */\nexport const tabListVariants = cva(\n [\n // Base classes\n \"relative flex\",\n \"bg-surface\",\n // Bottom divider line (MD3 spec)\n \"border-b border-outline-variant\",\n ],\n {\n variants: {\n layout: {\n fixed: \"w-full\",\n scrollable: \"overflow-x-auto scrollbar-none\",\n },\n },\n defaultVariants: {\n layout: \"fixed\",\n },\n }\n);\n\n/**\n * Material Design 3 Tab Item Variants (CVA)\n *\n * MD3 Specifications:\n * - Minimum height: 48dp\n * - Minimum width: 90dp (fixed), flexible (scrollable)\n * - Typography: Title Small (14px, weight 500, tracking 0.1px)\n * - State layers: 8% hover, 12% pressed/focus\n * - Disabled: 38% opacity\n * - Touch target: full tab area\n */\nexport const tabVariants = cva(\n [\n // Base layout\n \"relative flex flex-col items-center justify-center\",\n \"min-h-12 px-4\",\n \"cursor-pointer select-none\",\n \"overflow-hidden\",\n // Typography: MD3 Title Small\n \"text-sm font-medium tracking-[0.1px]\",\n // Transition\n \"transition-colors duration-200\",\n // Focus visible\n \"focus-visible:outline-none\",\n // State layer via before pseudo-element\n \"before:absolute before:inset-0 before:transition-opacity before:duration-200\",\n \"before:bg-current before:opacity-0\",\n \"hover:before:opacity-8\",\n \"active:before:opacity-12\",\n \"focus-visible:before:opacity-12\",\n ],\n {\n variants: {\n /**\n * Tab variant (Primary or Secondary)\n */\n variant: {\n primary: \"\",\n secondary: \"\",\n },\n\n /**\n * Selected state\n */\n selected: {\n true: \"\",\n false: \"\",\n },\n\n /**\n * Disabled state\n */\n disabled: {\n true: \"opacity-38 cursor-not-allowed pointer-events-none\",\n false: \"\",\n },\n\n /**\n * Layout determines min-width behavior\n */\n layout: {\n fixed: \"flex-1\",\n scrollable: \"min-w-[90px] shrink-0\",\n },\n },\n\n compoundVariants: [\n // Primary + selected\n {\n variant: \"primary\",\n selected: true,\n disabled: false,\n className: \"text-primary\",\n },\n // Primary + unselected\n {\n variant: \"primary\",\n selected: false,\n disabled: false,\n className: \"text-on-surface-variant\",\n },\n // Secondary + selected\n {\n variant: \"secondary\",\n selected: true,\n disabled: false,\n className: \"text-on-surface\",\n },\n // Secondary + unselected\n {\n variant: \"secondary\",\n selected: false,\n disabled: false,\n className: \"text-on-surface-variant\",\n },\n ],\n\n defaultVariants: {\n variant: \"primary\",\n selected: false,\n disabled: false,\n layout: \"fixed\",\n },\n }\n);\n\n/**\n * Active indicator variants (the sliding underline)\n *\n * MD3 Specifications:\n * - Primary: 3dp height, bg-primary, rounded-full corners\n * - Secondary: 2dp height, bg-on-surface-variant, no rounding\n * - Absolutely positioned at bottom of tab list\n * - Slides to selected tab using CSS transform\n */\nexport const tabIndicatorVariants = cva(\n [\n // Base: absolutely positioned at bottom\n \"absolute bottom-0 left-0\",\n \"pointer-events-none\",\n // Transition using MD3 motion tokens (medium2 duration, emphasized easing)\n \"transition-[left,width]\",\n \"duration-medium2\",\n \"ease-emphasized\",\n ],\n {\n variants: {\n variant: {\n primary: [\"h-[3px]\", \"bg-primary\", \"rounded-t-sm\"],\n secondary: [\"h-[2px]\", \"bg-on-surface-variant\"],\n },\n },\n defaultVariants: {\n variant: \"primary\",\n },\n }\n);\n\n/**\n * Tab panel variants\n *\n * MD3 Specifications:\n * - No specific container styling mandated\n * - Focus management: panel receives focus if no focusable children\n */\nexport const tabPanelVariants = cva(\n [\n // Base panel styles\n \"outline-none\",\n \"focus-visible:ring-2 focus-visible:ring-primary focus-visible:ring-offset-2\",\n ],\n {\n variants: {},\n defaultVariants: {},\n }\n);\n\n/**\n * Tab badge variants\n *\n * Inline badge displayed in the upper-right area of the tab icon/label.\n * MD3 badge spec: small indicator for notification count or status.\n */\nexport const tabBadgeVariants = cva(\n [\n // Base badge\n \"absolute\",\n \"inline-flex items-center justify-center\",\n \"bg-error text-on-error\",\n \"font-medium leading-none\",\n \"pointer-events-none\",\n ],\n {\n variants: {\n type: {\n dot: [\"top-1 right-1\", \"w-1.5 h-1.5\", \"rounded-full\"],\n count: [\"-top-1 -right-1\", \"min-w-[16px] h-4\", \"px-1\", \"rounded-full\", \"text-[11px]\"],\n },\n },\n defaultVariants: {\n type: \"count\",\n },\n }\n);\n\n/**\n * Tab icon wrapper variants\n * Positions icon relative to the badge\n */\nexport const tabIconVariants = cva(\n [\"relative\", \"inline-flex items-center justify-center\", \"w-6 h-6\"],\n {\n variants: {\n hasLabel: {\n true: \"mb-1\",\n false: \"\",\n },\n },\n defaultVariants: {\n hasLabel: false,\n },\n }\n);\n\n// Export variant prop types\nexport type TabListVariants = VariantProps<typeof tabListVariants>;\nexport type TabVariants = VariantProps<typeof tabVariants>;\nexport type TabIndicatorVariants = VariantProps<typeof tabIndicatorVariants>;\nexport type TabPanelVariants = VariantProps<typeof tabPanelVariants>;\nexport type TabBadgeVariants = VariantProps<typeof tabBadgeVariants>;\nexport type TabIconVariants = VariantProps<typeof tabIconVariants>;\n","\"use client\";\n\nimport { forwardRef, useRef, useLayoutEffect, useState, useCallback } from \"react\";\nimport type React from \"react\";\nimport { useTabList } from \"react-aria\";\nimport { cn } from \"../../utils/cn\";\nimport { useHeadlessTabsContext } from \"./TabsHeadless\";\nimport { useTabsContext } from \"./Tabs\";\nimport { tabListVariants, tabIndicatorVariants } from \"./Tabs.variants\";\nimport type { TabListProps } from \"./Tabs.types\";\n\n/**\n * Indicator position and width state for the animated sliding underline\n */\ninterface IndicatorStyle {\n left: number;\n width: number;\n}\n\n/**\n * Material Design 3 TabList Component (Layer 3: Styled)\n *\n * Renders the tab row container with an animated active indicator.\n * Uses React Aria's useTabList for role=\"tablist\", keyboard navigation,\n * and accessibility attributes.\n *\n * The active indicator slides to the selected tab using CSS transitions\n * with MD3 motion tokens (medium2 duration, emphasized easing).\n *\n * MD3 Specifications:\n * - Container background: bg-surface\n * - Container height: 48dp\n * - Bottom border: 1dp, outline-variant color\n * - Fixed layout: tabs fill width equally\n * - Scrollable layout: overflow-x, no wrapping\n *\n * @example\n * ```tsx\n * <Tabs aria-label=\"Settings\" defaultSelectedKey=\"general\">\n * <TabList>\n * <Tab id=\"general\" label=\"General\" />\n * <Tab id=\"privacy\" label=\"Privacy\" />\n * </TabList>\n * ...\n * </Tabs>\n * ```\n */\nexport const TabList = forwardRef<HTMLDivElement, TabListProps>(\n ({ children, className }, forwardedRef) => {\n const { state } = useHeadlessTabsContext(\"TabList\");\n const {\n variant,\n layout,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": ariaLabelledBy,\n } = useTabsContext();\n\n const internalRef = useRef<HTMLDivElement>(null);\n const ref = (forwardedRef ?? internalRef) as React.RefObject<HTMLDivElement>;\n\n // React Aria provides role=\"tablist\", aria-label, and keyboard navigation.\n // Conditionally spread ARIA props to satisfy exactOptionalPropertyTypes:\n // passing undefined values explicitly would violate the strict optional type constraint.\n const { tabListProps } = useTabList(\n {\n ...(ariaLabel !== undefined && { \"aria-label\": ariaLabel }),\n ...(ariaLabelledBy !== undefined && { \"aria-labelledby\": ariaLabelledBy }),\n },\n state,\n ref\n );\n\n // ── Keyboard navigation ────────────────────────────────────────────────\n /**\n * Custom keyboard handler that reads from document.activeElement rather than\n * state.focusedKey. This is critical for test reliability: when a tab is focused\n * via element.focus() outside React's act() boundary, the setFocusedKey state\n * update is deferred and state.focusedKey may still be null when the keydown fires.\n * Reading from the DOM directly avoids this race condition entirely.\n */\n const handleNavKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLDivElement>) => {\n if (![\"ArrowRight\", \"ArrowLeft\", \"Home\", \"End\"].includes(e.key)) return;\n\n const container = ref.current;\n if (!container) return;\n\n const focusedEl = document.activeElement as HTMLElement | null;\n const currentKey = focusedEl?.dataset?.key;\n if (!currentKey) return;\n\n // Read the ordered tab keys and disabled state directly from the DOM.\n // This is more reliable than state.collection.getKeys() because React Stately 3.x\n // builds its collection through a virtual rendering context; when we compute\n // <Item> elements programmatically inside Tabs.tsx, that context is never entered\n // and state.collection remains empty. DOM attributes are always authoritative.\n const allTabEls = [...container.querySelectorAll<HTMLElement>(\"[data-key]\")];\n const allKeys = allTabEls.map((el) => el.dataset.key!).filter(Boolean);\n const enabledKeys = allKeys.filter(\n (k) =>\n allTabEls.find((el) => el.dataset.key === k)?.getAttribute(\"aria-disabled\") !== \"true\"\n );\n\n const currentIndex = enabledKeys.indexOf(currentKey);\n if (currentIndex === -1) return;\n\n let nextKey: string | null = null;\n switch (e.key) {\n case \"ArrowRight\":\n nextKey = enabledKeys[(currentIndex + 1) % enabledKeys.length] ?? null;\n break;\n case \"ArrowLeft\":\n nextKey =\n enabledKeys[(currentIndex - 1 + enabledKeys.length) % enabledKeys.length] ?? null;\n break;\n case \"Home\":\n nextKey = enabledKeys[0] ?? null;\n break;\n case \"End\":\n nextKey = enabledKeys[enabledKeys.length - 1] ?? null;\n break;\n }\n\n if (nextKey != null) {\n e.preventDefault();\n state.setSelectedKey(nextKey);\n const nextEl = container.querySelector<HTMLElement>(\n `[data-key=\"${CSS.escape(nextKey)}\"]`\n );\n nextEl?.focus();\n }\n },\n [state, ref]\n );\n\n // Destructure onKeyDown so it can be used as a stable useCallback dependency.\n const { onKeyDown: tabListKeyDown } = tabListProps;\n\n /**\n * Combined keyboard handler: our DOM-based navigation runs first for arrow/home/end.\n * If we call e.preventDefault() (signalling we handled it), React Aria's handler is\n * skipped for that key. Other keys (Enter, Space, Tab) pass through to React Aria.\n */\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLDivElement>) => {\n handleNavKeyDown(e);\n if (!e.defaultPrevented) {\n tabListKeyDown?.(e);\n }\n },\n [handleNavKeyDown, tabListKeyDown]\n );\n\n // ── Active indicator animation ─────────────────────────────────────────\n const [indicatorStyle, setIndicatorStyle] = useState<IndicatorStyle>({ left: 0, width: 0 });\n const [indicatorReady, setIndicatorReady] = useState(false);\n\n /**\n * Recalculates indicator position/width from the selected tab's DOM rect.\n * Uses the [aria-selected=\"true\"] element as the target.\n * Only calls setState if values changed to prevent infinite update loops.\n */\n const updateIndicator = useCallback(() => {\n const container = ref.current;\n if (!container) return;\n\n const selectedTab = container.querySelector<HTMLElement>('[aria-selected=\"true\"]');\n if (!selectedTab) return;\n\n const containerRect = container.getBoundingClientRect();\n const tabRect = selectedTab.getBoundingClientRect();\n\n const newLeft = tabRect.left - containerRect.left + container.scrollLeft;\n const newWidth = tabRect.width;\n\n // Use functional update to avoid stale closure and prevent needless re-renders\n setIndicatorStyle((prev) => {\n if (prev.left === newLeft && prev.width === newWidth) return prev;\n return { left: newLeft, width: newWidth };\n });\n setIndicatorReady(true);\n }, [ref]);\n\n // Only re-run when the selected key changes (not every render)\n useLayoutEffect(() => {\n updateIndicator();\n }, [state.selectedKey, updateIndicator]);\n\n // ── Render ──────────────────────────────────────────────────────────────\n // Merge handleKeyDown into tabListProps so jsx-a11y can't flag a \"static\" div with\n // an explicit onKeyDown. The role=\"tablist\" (from tabListProps) makes it interactive,\n // but ESLint can't trace roles through spread operators — this avoids the false positive.\n const mergedTabListProps = { ...tabListProps, onKeyDown: handleKeyDown };\n\n return (\n <div {...mergedTabListProps} ref={ref} className={cn(tabListVariants({ layout }), className)}>\n {children}\n\n {/* Animated active indicator (sliding underline) */}\n <span\n data-tab-indicator\n aria-hidden=\"true\"\n className={cn(\n tabIndicatorVariants({ variant }),\n // Hide until first position is calculated to avoid flash\n !indicatorReady && \"opacity-0\"\n )}\n style={{\n // Dynamic left/width values from DOM measurements\n left: `${indicatorStyle.left}px`,\n width: `${indicatorStyle.width}px`,\n }}\n />\n </div>\n );\n }\n);\n\nTabList.displayName = \"TabList\";\n","\"use client\";\n\nimport { forwardRef, useRef, useCallback } from \"react\";\nimport type React from \"react\";\nimport { useTab, useFocusRing } from \"react-aria\";\nimport { mergeProps } from \"@react-aria/utils\";\nimport { cn } from \"../../utils/cn\";\nimport { useRipple } from \"../../hooks/useRipple\";\nimport { useHeadlessTabsContext } from \"./TabsHeadless\";\nimport { useTabsContext } from \"./Tabs\";\nimport { tabVariants, tabIconVariants, tabBadgeVariants } from \"./Tabs.variants\";\nimport type { TabProps, TabBadgeValue } from \"./Tabs.types\";\n\ntype TabElement = HTMLButtonElement;\n\n/**\n * Resolves a badge value to a displayable string or null\n */\nfunction resolveBadgeDisplay(badge: TabBadgeValue | undefined): string | null {\n if (badge === undefined || badge === false) return null;\n if (badge === true) return \"dot\";\n if (typeof badge === \"number\") {\n if (badge === 0) return null;\n return badge > 999 ? \"999+\" : String(badge);\n }\n return null;\n}\n\n/**\n * Material Design 3 Tab Component (Layer 3: Styled)\n *\n * Renders a single tab item inside a TabList.\n * Supports three content modes: icon-only, label-only, icon + label (stacked).\n *\n * Features:\n * - ✅ Icon-only, label-only, icon + label (stacked) content modes\n * - ✅ Ripple effect (Material Design)\n * - ✅ MD3 state layers (hover 8%, pressed 12%)\n * - ✅ Badge support (numeric, dot, 999+)\n * - ✅ Disabled state (opacity-38, not focusable)\n * - ✅ Full keyboard accessibility (via React Aria)\n * - ✅ Primary/secondary variant colors\n *\n * MD3 Specifications:\n * - Minimum height: 48dp\n * - Minimum width: 90dp\n * - Typography: Title Small (14px, weight 500, tracking 0.1px)\n * - Icon: 24x24dp\n * - Active indicator: 3dp primary / 2dp secondary\n * - State layers: 8% hover, 12% pressed/focus\n *\n * @example\n * ```tsx\n * // Label only\n * <Tab id=\"overview\" label=\"Overview\" />\n *\n * // Icon + label\n * <Tab id=\"media\" icon={<PhotoIcon />} label=\"Media\" />\n *\n * // With numeric badge\n * <Tab id=\"messages\" label=\"Messages\" badge={5} />\n *\n * // With dot badge\n * <Tab id=\"notifications\" label=\"Notifications\" badge={true} />\n *\n * // Disabled\n * <Tab id=\"archived\" label=\"Archived\" isDisabled />\n * ```\n */\nexport const Tab = forwardRef<TabElement, TabProps>(\n (\n { id, icon, label, badge, isDisabled = false, disableRipple = false, className, ...htmlProps },\n forwardedRef\n ) => {\n const { state } = useHeadlessTabsContext(\"Tab\");\n const { variant, layout } = useTabsContext();\n\n const internalRef = useRef<TabElement>(null);\n const ref = (forwardedRef ?? internalRef) as React.RefObject<TabElement>;\n\n // React Aria: provides tabProps (role, aria-selected, aria-controls, tabIndex, keyboard events).\n // HTMLButtonElement is structurally compatible with FocusableElement (@react-aria/focus),\n // which is not exported. Casting through HTMLElement satisfies the ref parameter type.\n const {\n tabProps,\n isSelected,\n isDisabled: ariaIsDisabled,\n } = useTab({ key: id, isDisabled }, state, ref as React.RefObject<HTMLElement>);\n\n // Focus ring for keyboard focus indicator\n const { isFocusVisible, focusProps } = useFocusRing();\n\n const finalIsDisabled = isDisabled || ariaIsDisabled;\n\n // Ripple effect\n const { onMouseDown: handleRipple, ripples } = useRipple({\n disabled: finalIsDisabled || disableRipple,\n });\n\n // Direct selection handler — ensures click works reliably across all environments.\n // React Aria's useTab uses shouldSelectOnPressUp which depends on pointerup events.\n // In some environments (jsdom), pointer capture can interfere with pointerup dispatch.\n // Adding a direct onClick fallback ensures selection always works on user click.\n const handleClick = useCallback(() => {\n if (!finalIsDisabled) {\n state.setSelectedKey(id);\n }\n }, [state, id, finalIsDisabled]);\n\n // Direct focus handler — ensures focusedKey is always in sync with DOM focus.\n // React Aria uses focusedKey to determine keyboard delegate's starting position.\n // Without this, focusedKey may be null after programmatic DOM focus, breaking Arrow navigation.\n const handleFocus = useCallback(() => {\n if (!finalIsDisabled) {\n state.selectionManager.setFocusedKey(id);\n }\n }, [state.selectionManager, id, finalIsDisabled]);\n\n // Merge all event handlers — tabProps includes ARIA attrs and keyboard handlers from React Aria.\n // Keyboard navigation (ArrowRight/ArrowLeft/Home/End) is handled at the TabList level,\n // not here, so we don't add an onKeyDown. Events bubble naturally from Tab → TabList.\n const mergedProps = mergeProps(tabProps, focusProps, {\n onMouseDown: disableRipple ? undefined : handleRipple,\n onClick: handleClick,\n onFocus: handleFocus,\n });\n\n // Badge display\n const badgeDisplay = resolveBadgeDisplay(badge);\n const isDotBadge = badgeDisplay === \"dot\";\n const hasIcon = Boolean(icon);\n const hasLabel = Boolean(label);\n\n // Use button for native click handling. role=\"tab\" from tabProps overrides default button role.\n // tabIndex: use isSelected (not isFocused from React Aria) so the selected tab is always reachable\n // via Tab key, regardless of whether React Aria has initialized its internal focusedKey.\n return (\n <button\n {...mergedProps}\n ref={ref}\n type=\"button\"\n // Ensure data-key is set so React Aria's keyboard delegate can find this element by key\n data-key={String(id)}\n // Override React Aria's isFocused-based tabIndex with selection-based roving tabIndex\n tabIndex={finalIsDisabled ? -1 : isSelected ? 0 : -1}\n className={cn(\n tabVariants({\n variant,\n selected: isSelected,\n disabled: finalIsDisabled,\n layout,\n }),\n isFocusVisible && \"outline-primary outline-2 outline-offset-2\",\n hasLabel && hasIcon && \"min-h-16\",\n className\n )}\n {...htmlProps}\n >\n {/* Ripple effect */}\n {!disableRipple && ripples}\n\n {/* Icon with optional badge */}\n {hasIcon && (\n <span className={cn(tabIconVariants({ hasLabel }))}>\n {icon}\n {/* Badge on icon — aria-hidden to keep tab's accessible name clean */}\n {badgeDisplay && (\n <span\n data-badge-type={isDotBadge ? \"dot\" : \"count\"}\n aria-hidden=\"true\"\n className={cn(tabBadgeVariants({ type: isDotBadge ? \"dot\" : \"count\" }))}\n >\n {!isDotBadge && badgeDisplay}\n </span>\n )}\n </span>\n )}\n\n {/* Label */}\n {hasLabel && (\n <span className=\"relative z-10 truncate\">\n {label}\n {/* Badge next to label — aria-hidden keeps accessible name clean */}\n {!hasIcon && badgeDisplay && (\n <span\n data-badge-type={isDotBadge ? \"dot\" : \"count\"}\n aria-hidden=\"true\"\n className={cn(\n \"relative ml-1\",\n tabBadgeVariants({ type: isDotBadge ? \"dot\" : \"count\" })\n )}\n >\n {!isDotBadge && badgeDisplay}\n </span>\n )}\n </span>\n )}\n </button>\n );\n }\n);\n\nTab.displayName = \"Tab\";\n","\"use client\";\n\nimport { forwardRef, useRef } from \"react\";\nimport type React from \"react\";\nimport { useTabPanel } from \"react-aria\";\nimport { cn } from \"../../utils/cn\";\nimport { useHeadlessTabsContext } from \"./TabsHeadless\";\nimport { useTabsContext } from \"./Tabs\";\nimport { tabPanelVariants } from \"./Tabs.variants\";\nimport type { TabPanelProps } from \"./Tabs.types\";\n\n/**\n * Material Design 3 TabPanel Component (Layer 3: Styled)\n *\n * Renders the content area associated with a tab.\n * Only the selected tab's panel content is shown.\n *\n * Provides full accessibility:\n * - role=\"tabpanel\"\n * - aria-labelledby (pointing to the associated tab)\n * - Focus management for panels without focusable children (tabIndex=-1)\n *\n * MD3 Specifications:\n * - No specific container styling mandated by MD3 for the panel itself\n * - The panel should be keyboard-reachable per WCAG requirements\n *\n * @example\n * ```tsx\n * <TabPanel id=\"overview\">\n * <h2>Overview</h2>\n * <p>Content here...</p>\n * </TabPanel>\n * ```\n */\nexport const TabPanel = forwardRef<HTMLDivElement, TabPanelProps>(\n ({ id, children, className }, forwardedRef) => {\n const { state } = useHeadlessTabsContext(\"TabPanel\");\n useTabsContext(); // consume context to validate component is inside Tabs\n\n const internalRef = useRef<HTMLDivElement>(null);\n const ref = (forwardedRef ?? internalRef) as React.RefObject<HTMLDivElement>;\n\n // React Aria: provides role=\"tabpanel\", aria-labelledby, tabIndex\n const { tabPanelProps } = useTabPanel({}, state, ref);\n\n // Only render the selected panel\n if (state.selectedKey !== id) {\n return null;\n }\n\n return (\n <div {...tabPanelProps} ref={ref} className={cn(tabPanelVariants(), className)}>\n {children}\n </div>\n );\n }\n);\n\nTabPanel.displayName = \"TabPanel\";\n","\"use client\";\n\nimport { createContext, forwardRef, useContext, useRef } from \"react\";\nimport { useTabList, useTab, useFocusRing } from \"react-aria\";\nimport { useTabListState, Item, type TabListState } from \"react-stately\";\nimport { mergeProps } from \"@react-aria/utils\";\nimport type {\n HeadlessNavigationBarProps,\n HeadlessNavigationBarItemProps,\n} from \"./NavigationBar.types\";\n\n// ─── Context ──────────────────────────────────────────────────────────────────\n\n/**\n * Context value shared between HeadlessNavigationBar and HeadlessNavigationBarItem.\n * @internal\n */\nexport interface NavigationBarContextValue {\n state: TabListState<object>;\n hideLabels: boolean;\n disableRipple: boolean;\n}\n\n/**\n * Shared context between HeadlessNavigationBar and HeadlessNavigationBarItem.\n * Provides the React Aria TabListState and bar-level configuration.\n * @internal\n */\nexport const NavigationBarContext = createContext<NavigationBarContextValue | null>(null);\n\n/**\n * Hook to read the NavigationBarContext inside HeadlessNavigationBarItem.\n * Throws a descriptive error if used outside HeadlessNavigationBar.\n * @internal\n */\nfunction useNavigationBarContext(): NavigationBarContextValue {\n const ctx = useContext(NavigationBarContext);\n if (ctx === null) {\n throw new Error(\"HeadlessNavigationBarItem must be rendered inside HeadlessNavigationBar.\");\n }\n return ctx;\n}\n\n// ─── HeadlessNavigationBar ────────────────────────────────────────────────────\n\n/**\n * Headless Navigation Bar (Layer 2).\n *\n * Renders an accessible `<nav role=\"navigation\">` landmark wrapping a\n * `<div role=\"tablist\">`. Provides keyboard navigation (Arrow Left/Right,\n * Home, End) and full ARIA semantics via React Aria's `useTabList`.\n *\n * All item accessibility is handled by `HeadlessNavigationBarItem`.\n *\n * Use this component when you need complete visual control beyond what the\n * styled `NavigationBar` provides.\n *\n * @example\n * ```tsx\n * <HeadlessNavigationBar\n * items={items}\n * defaultSelectedKey=\"home\"\n * aria-label=\"Main navigation\"\n * renderItem={(config) => (\n * <HeadlessNavigationBarItem key={config.key} itemKey={config.key}>\n * {config.icon}\n * <span>{config.label}</span>\n * </HeadlessNavigationBarItem>\n * )}\n * />\n * ```\n */\nexport const HeadlessNavigationBar = forwardRef<HTMLElement, HeadlessNavigationBarProps>(\n (\n {\n items,\n selectedKey,\n defaultSelectedKey,\n onSelectionChange,\n \"aria-label\": ariaLabel,\n className,\n renderItem,\n },\n ref\n ) => {\n // Build the React Aria collection from the items array.\n // Item children (text content) are used as the `textValue` for type-ahead.\n const collectionChildren = items.map((item) => (\n <Item key={item.key} textValue={item.label ?? item[\"aria-label\"] ?? item.key}>\n {item.key}\n </Item>\n ));\n\n const disabledKeys = items.filter((item) => item.isDisabled).map((item) => item.key);\n\n // useTabListState manages selected key, keyboard navigation state, and\n // the internal React Aria Collection.\n // We conditionally spread optional props to satisfy exactOptionalPropertyTypes.\n // The generic T is asserted as NavigationBarItemConfig because JSX children\n // cause TypeScript to infer T=object (item data type isn't preserved via JSX).\n const state = useTabListState({\n children: collectionChildren,\n ...(selectedKey !== undefined ? { selectedKey } : {}),\n ...(defaultSelectedKey !== undefined ? { defaultSelectedKey } : {}),\n ...(onSelectionChange ? { onSelectionChange } : {}),\n disabledKeys,\n });\n\n const tabListRef = useRef<HTMLDivElement>(null);\n\n // useTabList provides the ARIA props for the tablist container:\n // role=\"tablist\", keyboard event handlers (Arrow keys, Home, End).\n const { tabListProps } = useTabList({ \"aria-label\": ariaLabel }, state, tabListRef);\n\n return (\n <nav\n ref={ref as React.RefObject<HTMLElement>}\n role=\"navigation\"\n aria-label={ariaLabel}\n className={className}\n >\n <NavigationBarContext.Provider value={{ state, hideLabels: false, disableRipple: false }}>\n {/* The tablist is a full-width flex row inside the nav */}\n <div {...tabListProps} ref={tabListRef} className=\"flex h-full w-full items-stretch\">\n {[...state.collection].map((collectionItem) => {\n const itemConfig = items.find((i) => String(i.key) === String(collectionItem.key));\n if (!itemConfig) return null;\n return renderItem(itemConfig);\n })}\n </div>\n </NavigationBarContext.Provider>\n </nav>\n );\n }\n);\n\nHeadlessNavigationBar.displayName = \"HeadlessNavigationBar\";\n\n// ─── HeadlessNavigationBarItem ────────────────────────────────────────────────\n\n/**\n * Headless Navigation Bar Item (Layer 2).\n *\n * Renders an accessible `<button role=\"tab\">` using React Aria's `useTab`.\n * Provides `aria-selected`, `aria-disabled`, roving `tabIndex`, and\n * focus management via `useFocusRing`.\n *\n * Must be rendered inside `HeadlessNavigationBar`.\n *\n * @example\n * ```tsx\n * <HeadlessNavigationBarItem itemKey=\"home\" className=\"my-item\">\n * <HomeIcon aria-hidden />\n * <span>Home</span>\n * </HeadlessNavigationBarItem>\n * ```\n */\nexport const HeadlessNavigationBarItem = forwardRef<\n HTMLButtonElement,\n HeadlessNavigationBarItemProps\n>(({ itemKey, children, className, \"aria-label\": ariaLabel }, ref) => {\n const { state } = useNavigationBarContext();\n\n const internalRef = useRef<HTMLButtonElement>(null);\n const resolvedRef = (ref as React.RefObject<HTMLButtonElement>) ?? internalRef;\n\n // useTab in @react-aria/tabs 3.x takes { key } (not { item }).\n // It provides: role=\"tab\", aria-selected, aria-disabled, tabIndex,\n // and keyboard event handling (selection on Enter/Space).\n const { tabProps, isSelected } = useTab({ key: itemKey }, state, resolvedRef);\n\n // Navigation bar has no tab panels, so remove aria-controls to avoid ARIA\n // validation errors (aria-controls must reference an existing element).\n const { \"aria-controls\": _controls, ...tabPropsWithoutControls } = tabProps;\n\n // useFocusRing provides isFocusVisible for focus ring management.\n const { focusProps, isFocusVisible } = useFocusRing();\n\n // Support both ReactNode children and render-function children.\n const content =\n typeof children === \"function\" ? children({ isSelected, isFocusVisible }) : children;\n\n return (\n <button\n type=\"button\"\n {...mergeProps(tabPropsWithoutControls, focusProps)}\n ref={resolvedRef}\n className={className}\n aria-label={ariaLabel}\n data-focus-visible={isFocusVisible || undefined}\n data-selected={isSelected}\n >\n {content}\n </button>\n );\n});\n\nHeadlessNavigationBarItem.displayName = \"HeadlessNavigationBarItem\";\n","import { cva, type VariantProps } from \"class-variance-authority\";\n\n/**\n * Material Design 3 Navigation Bar container variants (CVA).\n *\n * Bar surface: `bg-surface-container`\n * Height: 80dp (`h-20`)\n * Position: `fixed bottom-0` — full-width bottom bar\n *\n * @see https://m3.material.io/components/navigation-bar/specs\n */\nexport const navigationBarVariants = cva([\n // Layout\n \"fixed bottom-0 left-0 right-0 z-10\",\n \"w-full\",\n \"flex flex-row items-stretch\",\n // MD3 surface\n \"bg-surface-container\",\n // MD3 height: 80dp\n \"h-20\",\n // Safe-area bottom (for mobile devices)\n \"pb-safe\",\n]);\n\n/**\n * Material Design 3 Navigation Bar item variants (CVA).\n *\n * Each item is a flex column that fills available horizontal space.\n * Active/inactive colors follow MD3 color roles:\n * - Active icon: `text-on-secondary-container`\n * - Inactive icon: `text-on-surface-variant`\n * - Active label: `text-on-surface`\n * - Inactive label:`text-on-surface-variant`\n *\n * State layers use MD3 opacity values via `::before` pseudo-element.\n *\n * @see https://m3.material.io/components/navigation-bar/specs\n */\nexport const navigationBarItemVariants = cva(\n [\n // Layout\n \"relative flex flex-1 flex-col items-center justify-center\",\n \"cursor-pointer select-none outline-none\",\n // State layer pseudo-element (covers the full item area)\n \"before:absolute before:inset-0 before:rounded-none before:transition-opacity before:duration-short2 before:ease-standard\",\n // Focus-visible ring\n \"focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary\",\n // Transition for color changes\n \"transition-colors duration-short2 ease-standard\",\n ],\n {\n variants: {\n /**\n * Whether this item is the currently selected destination.\n * Controls icon and label colors per MD3 spec.\n */\n isActive: {\n true: [\n // Active icon color applied via text-color on the icon wrapper\n \"[&>[data-icon]]:text-on-secondary-container\",\n // Active label color\n \"[&>[data-label]]:text-on-surface\",\n // State layer color for active item\n \"before:bg-on-surface-variant\",\n ],\n false: [\n // Inactive icon color\n \"[&>[data-icon]]:text-on-surface-variant\",\n // Inactive label color\n \"[&>[data-label]]:text-on-surface-variant\",\n // State layer color for inactive item\n \"before:bg-on-surface-variant\",\n ],\n },\n\n /**\n * Whether the item is disabled.\n * Applies `opacity-38` per MD3 disabled state.\n */\n isDisabled: {\n true: [\"cursor-not-allowed opacity-38 pointer-events-none\"],\n false: [],\n },\n\n /**\n * Hover and press state layer opacities.\n * Applied via compound variants on hover/active pseudo-classes.\n */\n isHovered: {\n true: [\"before:opacity-8\"],\n false: [\"before:opacity-0\"],\n },\n\n isPressed: {\n true: [\"before:opacity-12\"],\n false: [],\n },\n },\n\n compoundVariants: [\n // When not hovered or pressed, state layer is invisible\n {\n isHovered: false,\n isPressed: false,\n className: \"before:opacity-0\",\n },\n ],\n\n defaultVariants: {\n isActive: false,\n isDisabled: false,\n isHovered: false,\n isPressed: false,\n },\n }\n);\n\n/**\n * Active indicator pill variants (CVA).\n *\n * The pill sits behind the icon, centered horizontally.\n * MD3 spec: 64dp wide × 32dp tall, `rounded-full`, `bg-secondary-container`.\n *\n * Animation uses MD3 motion tokens:\n * - Active: `scale-x-100 opacity-100`\n * - Inactive: `scale-x-0 opacity-0`\n * - Duration: `duration-medium2` (300ms)\n * - Easing: `ease-emphasized`\n */\nexport const indicatorPillVariants = cva(\n [\n \"absolute left-1/2 -translate-x-1/2 top-1/2 -translate-y-1/2\",\n \"w-16 h-8\",\n \"rounded-full bg-secondary-container\",\n \"transition-[transform,opacity] duration-medium2 ease-emphasized\",\n \"origin-center\",\n ],\n {\n variants: {\n isActive: {\n true: [\"scale-x-100 opacity-100\"],\n false: [\"scale-x-0 opacity-0\"],\n },\n },\n defaultVariants: {\n isActive: false,\n },\n }\n);\n\n/**\n * Badge variants (CVA).\n *\n * Positioned at the top-right of the icon area.\n * MD3 uses `error` color role for badges.\n *\n * - Dot: small circle, no text\n * - Numeric: rounded pill with count\n */\nexport const badgeVariants = cva(\n [\n \"absolute\",\n \"flex items-center justify-center\",\n \"bg-error text-on-error\",\n \"font-medium leading-none\",\n // MD3 label-small\n \"text-[0.6875rem]\",\n ],\n {\n variants: {\n isDot: {\n true: [\n // Dot: 6dp diameter, top-right of icon\n \"top-0 right-0.5 z-10\",\n \"w-1.5 h-1.5 min-w-0 rounded-full\",\n ],\n false: [\n // Numeric: pill shape, top-right of icon\n \"-top-1 left-3 z-10\",\n \"min-w-[1rem] h-4 px-1 rounded-full\",\n ],\n },\n },\n defaultVariants: {\n isDot: false,\n },\n }\n);\n\n/**\n * Icon wrapper variants — controls size and positioning.\n * The icon wrapper is `relative` to position the badge and indicator.\n */\nexport const iconWrapperVariants = cva([\n \"relative z-10 flex items-center justify-center\",\n \"w-6 h-6\",\n]);\n\n/**\n * Label variants — `text-label-medium` per MD3 Navigation Bar spec.\n * Transition mirrors the icon color transition.\n */\nexport const labelVariants = cva([\n \"mt-1 select-none\",\n \"text-label-medium\",\n \"transition-colors duration-short2 ease-standard\",\n \"truncate max-w-full\",\n]);\n\n// ─── Type exports ─────────────────────────────────────────────────────────────\n\nexport type NavigationBarVariants = VariantProps<typeof navigationBarVariants>;\nexport type NavigationBarItemVariants = VariantProps<typeof navigationBarItemVariants>;\nexport type IndicatorPillVariants = VariantProps<typeof indicatorPillVariants>;\nexport type BadgeVariants = VariantProps<typeof badgeVariants>;\n","\"use client\";\n\nimport { forwardRef, type JSX } from \"react\";\nimport { useRipple } from \"../../hooks/useRipple\";\nimport { cn } from \"../../utils/cn\";\nimport { HeadlessNavigationBar, HeadlessNavigationBarItem } from \"./NavigationBarHeadless\";\nimport {\n navigationBarVariants,\n indicatorPillVariants,\n badgeVariants,\n iconWrapperVariants,\n labelVariants,\n} from \"./NavigationBar.variants\";\nimport type { NavigationBarProps, NavigationBarItemConfig } from \"./NavigationBar.types\";\nimport type { Key } from \"react-aria\";\n\n// ─── Item count validation ────────────────────────────────────────────────────\n\nconst MIN_ITEMS = 3;\nconst MAX_ITEMS = 5;\n\nfunction validateItemCount(count: number): void {\n if (process.env.NODE_ENV !== \"production\" && (count < MIN_ITEMS || count > MAX_ITEMS)) {\n console.warn(\n `[NavigationBar] MD3 Navigation Bar requires between ${MIN_ITEMS} and ${MAX_ITEMS} ` +\n `destination items. Received ${count}. ` +\n `See: https://m3.material.io/components/navigation-bar/overview`\n );\n }\n}\n\n// ─── Badge helpers ────────────────────────────────────────────────────────────\n\nfunction getBadgeText(badge: number | true | undefined): string | null {\n if (badge === undefined || badge === 0) return null;\n if (badge === true) return null; // dot — no text\n if (badge > 999) return \"999+\";\n return String(badge);\n}\n\nfunction isBadgeVisible(badge: number | true | undefined): boolean {\n if (badge === undefined) return false;\n if (badge === 0) return false;\n return true;\n}\n\n// ─── Visual content ───────────────────────────────────────────────────────────\n\n/**\n * Private — renders the visual content of a navigation bar item.\n * Intentionally has NO button wrapper (the button is provided by\n * `HeadlessNavigationBarItem` to avoid nested interactive elements).\n */\ninterface ItemVisualProps {\n config: NavigationBarItemConfig;\n isActive: boolean;\n hideLabels: boolean;\n disableRipple: boolean;\n}\n\nfunction ItemVisual({ config, isActive, hideLabels, disableRipple }: ItemVisualProps): JSX.Element {\n const isItemDisabled = config.isDisabled === true;\n const { onMouseDown, ripples } = useRipple({\n ...(disableRipple || isItemDisabled ? { disabled: true } : {}),\n });\n\n const showBadge = isBadgeVisible(config.badge);\n const isDot = config.badge === true;\n const badgeText = getBadgeText(config.badge);\n\n return (\n // Overflow-hidden wrapper required for ripple containment.\n // pointer-events-none is intentional: the parent <button> handles all interaction.\n // eslint-disable-next-line jsx-a11y/no-static-element-interactions\n <span\n onMouseDown={onMouseDown}\n className=\"pointer-events-none relative flex h-full w-full flex-col items-center justify-center overflow-hidden\"\n >\n {ripples}\n\n {/* Active indicator pill */}\n <span\n data-indicator-pill\n data-active={isActive}\n aria-hidden=\"true\"\n className={cn(indicatorPillVariants({ isActive }), !hideLabels && \"-mt-3.5\")}\n />\n\n {/* Icon + Badge wrapper */}\n <span\n data-icon\n className={cn(\n iconWrapperVariants(),\n isActive ? \"text-on-secondary-container\" : \"text-on-surface-variant\"\n )}\n >\n <span className=\"relative z-10 flex h-6 w-6 items-center justify-center\">\n {config.icon}\n </span>\n\n {showBadge && (\n <span\n data-badge\n data-badge-dot={isDot || undefined}\n aria-label={\n isDot ? \"notification\" : badgeText ? `${badgeText} notifications` : undefined\n }\n aria-live=\"polite\"\n className={cn(badgeVariants({ isDot }))}\n >\n {isDot ? null : badgeText}\n </span>\n )}\n </span>\n\n {/* Label */}\n {!hideLabels && config.label && (\n <span\n data-label\n className={cn(labelVariants(), isActive ? \"text-on-surface\" : \"text-on-surface-variant\")}\n >\n {config.label}\n </span>\n )}\n </span>\n );\n}\n\n// ─── NavigationBar ────────────────────────────────────────────────────────────\n\n/**\n * Material Design 3 Navigation Bar (Bottom Navigation) — Layer 3.\n *\n * Renders a fixed bottom navigation bar with 3–5 destination items, each with\n * an icon, optional label, animated active indicator pill, and optional badge.\n *\n * **Architecture:**\n * - Layer 3 (this file): MD3 styled, CVA variants, `'use client'`\n * - Layer 2: `HeadlessNavigationBar` + `HeadlessNavigationBarItem` — React Aria\n * - Layer 1: `useTabList`, `useTab`, `useFocusRing` — accessibility foundation\n *\n * **Key Features:**\n * - 3–5 destination items (dev warning outside this range)\n * - Animated indicator pill per MD3 motion tokens (scale + opacity)\n * - Badge: dot, numeric count, \"999+\" truncation, hidden at 0\n * - `hideLabels` for icon-only mode\n * - Controlled (`activeKey` + `onActiveChange`) and uncontrolled (`defaultActiveKey`)\n * - Full keyboard navigation: Arrow Left/Right, Home, End, roving `tabIndex`\n * - WCAG 2.1 AA: `role=\"navigation\"` + `aria-label`, `role=\"tablist\"`,\n * `role=\"tab\"` + `aria-selected`, visible focus ring\n *\n * **Future — Navigation Rail:**\n * At wider viewports, a NavigationBar may transition to a Navigation Rail.\n * This is a separate component tracked as a future Phase 5+ item.\n *\n * @example\n * ```tsx\n * // Uncontrolled\n * <NavigationBar\n * items={[\n * { key: 'home', icon: <HomeIcon />, label: 'Home' },\n * { key: 'search', icon: <SearchIcon />, label: 'Search', badge: 3 },\n * { key: 'profile', icon: <ProfileIcon />, label: 'Profile' },\n * ]}\n * defaultActiveKey=\"home\"\n * aria-label=\"Main navigation\"\n * />\n *\n * // Controlled\n * <NavigationBar\n * items={items}\n * activeKey={activeKey}\n * onActiveChange={setActiveKey}\n * aria-label=\"Main navigation\"\n * />\n *\n * // Icon-only mode\n * <NavigationBar\n * items={iconOnlyItems}\n * defaultActiveKey=\"home\"\n * aria-label=\"Main navigation\"\n * hideLabels\n * />\n * ```\n *\n * @see https://m3.material.io/components/navigation-bar/overview\n * @see https://m3.material.io/components/navigation-bar/specs\n */\nexport const NavigationBar = forwardRef<HTMLElement, NavigationBarProps>(\n (\n {\n items,\n activeKey,\n defaultActiveKey,\n onActiveChange,\n hideLabels = false,\n \"aria-label\": ariaLabel,\n disableRipple = false,\n className,\n },\n ref\n ) => {\n validateItemCount(items.length);\n\n return (\n <HeadlessNavigationBar\n ref={ref}\n items={items}\n {...(activeKey !== undefined ? { selectedKey: activeKey } : {})}\n {...(defaultActiveKey !== undefined ? { defaultSelectedKey: defaultActiveKey } : {})}\n {...(onActiveChange ? { onSelectionChange: onActiveChange as (key: Key) => void } : {})}\n aria-label={ariaLabel}\n className={cn(navigationBarVariants(), className)}\n renderItem={(config: NavigationBarItemConfig) => (\n // HeadlessNavigationBarItem renders the <button role=\"tab\"> with all\n // ARIA semantics. ItemVisual renders the icon/pill/badge/label inside\n // — no nested <button> elements.\n <HeadlessNavigationBarItem\n key={config.key}\n itemKey={config.key}\n {...(config[\"aria-label\"] !== undefined ? { \"aria-label\": config[\"aria-label\"] } : {})}\n className={cn(\n \"relative flex flex-1 flex-col items-center justify-center\",\n \"cursor-pointer outline-none select-none\",\n \"duration-short2 ease-standard transition-colors\",\n // State layer pseudo-element\n \"before:absolute before:inset-0 before:rounded-none\",\n \"before:bg-on-surface-variant before:opacity-0\",\n \"before:duration-short2 before:ease-standard before:transition-opacity\",\n \"hover:before:opacity-8\",\n \"active:before:opacity-12\",\n // Focus ring\n \"focus-visible:outline-primary focus-visible:outline-2 focus-visible:outline-offset-2\",\n // Disabled styling\n config.isDisabled && \"pointer-events-none cursor-not-allowed opacity-38\"\n )}\n >\n {({ isSelected }: { isSelected: boolean }) => (\n <ItemVisual\n config={config}\n isActive={isSelected}\n hideLabels={hideLabels}\n disableRipple={disableRipple}\n />\n )}\n </HeadlessNavigationBarItem>\n )}\n />\n );\n }\n);\n\nNavigationBar.displayName = \"NavigationBar\";\n","\"use client\";\n\nimport { forwardRef } from \"react\";\nimport { useRipple } from \"../../hooks/useRipple\";\nimport { cn } from \"../../utils/cn\";\nimport {\n navigationBarItemVariants,\n indicatorPillVariants,\n badgeVariants,\n iconWrapperVariants,\n labelVariants,\n} from \"./NavigationBar.variants\";\nimport type { NavigationBarItemProps, NavigationBarBadge } from \"./NavigationBar.types\";\n\n// ─── Badge helper ─────────────────────────────────────────────────────────────\n\n/**\n * Returns the display string for a badge value.\n * - `true` → renders dot (no text)\n * - `0` → hidden\n * - `1–999` → count as string\n * - `> 999` → \"999+\"\n */\nfunction getBadgeContent(badge: NavigationBarBadge): string | null {\n if (badge === true) return null; // dot — no text\n if (badge === 0) return \"\"; // hidden\n if (badge > 999) return \"999+\";\n return String(badge);\n}\n\n/**\n * Whether a badge value should be rendered at all.\n */\nfunction isBadgeVisible(badge: NavigationBarBadge | undefined): boolean {\n if (badge === undefined) return false;\n if (badge === 0) return false;\n return true;\n}\n\n// ─── NavigationBarItem ────────────────────────────────────────────────────────\n\n/**\n * Material Design 3 Navigation Bar Item (Layer 3).\n *\n * Renders a single destination item within a `NavigationBar`. Handles:\n * - Active indicator pill (`rounded-full`, animated with MD3 motion tokens)\n * - Icon slot (24dp, always visible)\n * - Badge (dot, numeric count, 999+ truncation)\n * - Label (hidden in `hideLabels` mode)\n * - MD3 state layers (hover `opacity-8`, pressed `opacity-12`)\n * - Ripple effect via `useRipple`\n * - Focus ring via `data-focus-visible`\n *\n * Used internally by `NavigationBar`. Can also be composed with\n * `HeadlessNavigationBarItem` for advanced customization.\n *\n * **Future — Navigation Rail:**\n * At wider viewports, a NavigationBar may transition to a Navigation Rail.\n * This is a separate component tracked as a future Phase 5+ item.\n *\n * @example\n * ```tsx\n * // Used standalone (advanced consumer with HeadlessNavigationBar)\n * <NavigationBarItem\n * itemKey=\"home\"\n * icon={<HomeIcon />}\n * label=\"Home\"\n * isActive\n * />\n * ```\n */\nexport const NavigationBarItem = forwardRef<HTMLButtonElement, NavigationBarItemProps>(\n (\n {\n itemKey: _itemKey,\n icon,\n label,\n badge,\n isActive = false,\n hideLabels = false,\n isDisabled = false,\n disableRipple = false,\n className,\n \"aria-label\": ariaLabel,\n // Spread remaining props (e.g. tabProps from useTab)\n ...rest\n },\n ref\n ) => {\n const { onMouseDown, ripples } = useRipple({\n ...(disableRipple || isDisabled ? { disabled: true } : {}),\n });\n\n const showBadge = isBadgeVisible(badge);\n const isDot = badge === true;\n const badgeContent = badge !== undefined ? getBadgeContent(badge) : null;\n\n return (\n <button\n type=\"button\"\n ref={ref}\n onMouseDown={onMouseDown}\n disabled={isDisabled}\n aria-label={ariaLabel}\n className={cn(\n navigationBarItemVariants({\n isActive,\n isDisabled,\n }),\n className\n )}\n {...rest}\n >\n {/* Overflow hidden container for ripple */}\n <span className=\"relative flex h-full w-full flex-col items-center justify-center overflow-hidden rounded-none\">\n {/* Ripple nodes */}\n {ripples}\n\n {/* Active indicator pill — animates behind the icon */}\n <span\n data-indicator-pill\n data-active={isActive}\n className={cn(indicatorPillVariants({ isActive }), !hideLabels && \"-mt-3.5\")}\n aria-hidden=\"true\"\n />\n\n {/* Icon + Badge wrapper */}\n <span data-icon className={cn(iconWrapperVariants())}>\n {/* Icon (24dp, aria-hidden is set by the consumer on the SVG) */}\n <span className=\"relative z-10 flex h-6 w-6 items-center justify-center\">{icon}</span>\n\n {/* Badge */}\n {showBadge && (\n <span\n data-badge\n data-badge-dot={isDot || undefined}\n aria-label={\n isDot\n ? \"notification\"\n : badgeContent\n ? `${badgeContent} notifications`\n : undefined\n }\n aria-live=\"polite\"\n className={cn(badgeVariants({ isDot }))}\n >\n {isDot ? null : badgeContent}\n </span>\n )}\n </span>\n\n {/* Label */}\n {!hideLabels && label && (\n <span data-label className={cn(labelVariants())}>\n {label}\n </span>\n )}\n </span>\n </button>\n );\n }\n);\n\nNavigationBarItem.displayName = \"NavigationBarItem\";\n","\"use client\";\n\nimport { createContext, forwardRef, useContext, useRef, useCallback } from \"react\";\nimport type React from \"react\";\nimport {\n useDialog,\n useOverlay,\n usePreventScroll,\n useFocusRing,\n useButton,\n useLink,\n FocusScope,\n} from \"react-aria\";\nimport { useOverlayTriggerState } from \"react-stately\";\nimport { mergeProps } from \"@react-aria/utils\";\nimport type {\n HeadlessDrawerProps,\n HeadlessDrawerItemProps,\n DrawerContextValue,\n} from \"./Drawer.types\";\n\n// ─── Context ──────────────────────────────────────────────────────────────────\n\n/**\n * Context shared between HeadlessDrawer and its children.\n * @internal\n */\nexport const DrawerContext = createContext<DrawerContextValue | null>(null);\n\n/**\n * Hook to access DrawerContext inside drawer children.\n * @internal\n */\nfunction useDrawerContext(): DrawerContextValue {\n const ctx = useContext(DrawerContext);\n if (ctx === null) {\n throw new Error(\"DrawerItem must be rendered inside a Drawer component.\");\n }\n return ctx;\n}\n\n// ─── HeadlessDrawer ───────────────────────────────────────────────────────────\n\n/**\n * Headless Navigation Drawer (Layer 2).\n *\n * Provides all behavior and ARIA semantics without any visual styling.\n * Renders two distinct DOM structures based on the `variant` prop:\n *\n * - **`standard`**: `<nav role=\"navigation\">` — no overlay, no focus trap\n * - **`modal`**: `<nav role=\"navigation\">` containing a `FocusScope`-wrapped\n * `<div role=\"dialog\" aria-modal=\"true\">` with scrim overlay\n *\n * React Aria hooks used:\n * - `useDialog` — `role=\"dialog\"`, `aria-modal`, `aria-label` on modal panel\n * - `useOverlay` — dismiss on Escape key and outside click (modal)\n * - `usePreventScroll` — locks body scroll when modal is open\n * - `FocusScope` — focus trap + restoreFocus when modal closes\n * - `useOverlayTriggerState` — open/close state management\n *\n * @example\n * ```tsx\n * <HeadlessDrawer variant=\"modal\" open aria-label=\"Navigation\">\n * <HeadlessDrawerItem onPress={() => {}}>Home</HeadlessDrawerItem>\n * </HeadlessDrawer>\n * ```\n */\nexport const HeadlessDrawer = forwardRef<HTMLElement, HeadlessDrawerProps>(\n (\n {\n variant = \"standard\",\n open,\n defaultOpen = false,\n onOpenChange,\n \"aria-label\": ariaLabel,\n children,\n className,\n scrimClassName,\n disableRipple = false,\n },\n ref\n ) => {\n // Manage open/close state with react-stately\n // Use conditional spreading to satisfy exactOptionalPropertyTypes\n const state = useOverlayTriggerState({\n ...(open !== undefined ? { isOpen: open } : {}),\n ...(defaultOpen !== undefined ? { defaultOpen } : {}),\n ...(onOpenChange !== undefined ? { onOpenChange } : {}),\n });\n\n const isOpen = state.isOpen;\n\n const close = useCallback(() => {\n state.close();\n }, [state]);\n\n const contextValue: DrawerContextValue = {\n isOpen,\n close,\n disableRipple,\n };\n\n if (variant === \"modal\") {\n return (\n <DrawerContext.Provider value={contextValue}>\n <nav ref={ref as React.RefObject<HTMLElement>} role=\"navigation\" aria-label={ariaLabel}>\n {isOpen && (\n <>\n {/* Scrim overlay — clicking it closes the drawer */}\n <div\n data-testid=\"drawer-scrim\"\n className={scrimClassName}\n onClick={() => state.close()}\n aria-hidden=\"true\"\n />\n {/* FocusScope: traps focus and restores it to trigger on close */}\n <FocusScope contain restoreFocus autoFocus>\n <ModalDrawerPanel\n ariaLabel={ariaLabel}\n onClose={() => state.close()}\n className={className}\n >\n {children}\n </ModalDrawerPanel>\n </FocusScope>\n </>\n )}\n </nav>\n </DrawerContext.Provider>\n );\n }\n\n // Standard variant — inline nav, no overlay\n return (\n <DrawerContext.Provider value={contextValue}>\n <nav\n ref={ref as React.RefObject<HTMLElement>}\n role=\"navigation\"\n aria-label={ariaLabel}\n className={className}\n >\n {children}\n </nav>\n </DrawerContext.Provider>\n );\n }\n);\n\nHeadlessDrawer.displayName = \"HeadlessDrawer\";\n\n// ─── ModalDrawerPanel ─────────────────────────────────────────────────────────\n\n/**\n * Inner dialog panel for the modal drawer variant.\n * Applies `useDialog`, `useOverlay`, and `usePreventScroll`.\n * @internal\n */\ninterface ModalDrawerPanelProps {\n ariaLabel: string;\n onClose: () => void;\n className: string | undefined;\n children: React.ReactNode;\n}\n\nconst ModalDrawerPanel = ({\n ariaLabel,\n onClose,\n className,\n children,\n}: ModalDrawerPanelProps): React.ReactElement => {\n const panelRef = useRef<HTMLDivElement>(null);\n\n // usePreventScroll locks the body scroll while the modal is open\n usePreventScroll();\n\n // useDialog provides role=\"dialog\", aria-modal=\"true\", and aria-label\n const { dialogProps } = useDialog({ \"aria-label\": ariaLabel }, panelRef);\n\n // useOverlay handles Escape key and outside-click dismissal\n const { overlayProps } = useOverlay(\n {\n isOpen: true,\n onClose,\n isDismissable: true,\n shouldCloseOnBlur: false,\n },\n panelRef\n );\n\n return (\n <div\n {...mergeProps(overlayProps, dialogProps)}\n ref={panelRef}\n className={className}\n aria-modal=\"true\"\n >\n {children}\n </div>\n );\n};\n\nModalDrawerPanel.displayName = \"ModalDrawerPanel\";\n\n// ─── HeadlessDrawerItem ────────────────────────────────────────────────────────\n\n/**\n * Headless Navigation Drawer Item (Layer 2).\n *\n * Renders as:\n * - `<a>` using `useLink` when `href` is provided\n * - `<button>` using `useButton` when no `href`\n *\n * Applies `aria-current=\"page\"` when `isActive` is true.\n * Uses `useFocusRing` for visible keyboard focus.\n *\n * @example\n * ```tsx\n * // Button-based item\n * <HeadlessDrawerItem onPress={() => navigate('home')} isActive>\n * Home\n * </HeadlessDrawerItem>\n *\n * // Link-based item\n * <HeadlessDrawerItem href=\"/settings\">\n * Settings\n * </HeadlessDrawerItem>\n * ```\n */\nexport const HeadlessDrawerItem = forwardRef<HTMLElement, HeadlessDrawerItemProps>(\n (\n {\n href,\n isActive = false,\n children,\n className,\n isDisabled,\n onMouseDown,\n onPress,\n onPressStart,\n onPressEnd,\n onPressChange,\n onPressUp,\n ...restProps\n },\n forwardedRef\n ) => {\n const internalRef = useRef<HTMLElement>(null);\n const { isFocusVisible, focusProps } = useFocusRing();\n\n if (href) {\n // ── Link variant ──────────────────────────────────────────────────────\n const linkRef = (forwardedRef ?? internalRef) as React.RefObject<HTMLAnchorElement>;\n\n // eslint-disable-next-line react-hooks/rules-of-hooks\n const { linkProps } = useLink(\n {\n href,\n ...(isDisabled !== undefined ? { isDisabled } : {}),\n ...(onPress !== undefined ? { onPress } : {}),\n },\n linkRef\n );\n\n return (\n <a\n {...mergeProps(linkProps, focusProps, { onMouseDown })}\n ref={linkRef}\n href={href}\n className={className}\n aria-current={isActive ? \"page\" : undefined}\n data-focus-visible={isFocusVisible || undefined}\n data-active={isActive || undefined}\n >\n {children}\n </a>\n );\n }\n\n // ── Button variant ────────────────────────────────────────────────────────\n const buttonRef = (forwardedRef ?? internalRef) as React.RefObject<HTMLButtonElement>;\n\n // eslint-disable-next-line react-hooks/rules-of-hooks\n const { buttonProps } = useButton(\n {\n ...restProps,\n ...(isDisabled !== undefined ? { isDisabled } : {}),\n ...(onPress !== undefined ? { onPress } : {}),\n ...(onPressStart !== undefined ? { onPressStart } : {}),\n ...(onPressEnd !== undefined ? { onPressEnd } : {}),\n ...(onPressChange !== undefined ? { onPressChange } : {}),\n ...(onPressUp !== undefined ? { onPressUp } : {}),\n elementType: \"button\",\n },\n buttonRef\n );\n\n return (\n <button\n type=\"button\"\n {...mergeProps(buttonProps, focusProps, { onMouseDown })}\n ref={buttonRef}\n className={className}\n aria-current={isActive ? \"page\" : undefined}\n data-focus-visible={isFocusVisible || undefined}\n data-active={isActive || undefined}\n >\n {children}\n </button>\n );\n }\n);\n\nHeadlessDrawerItem.displayName = \"HeadlessDrawerItem\";\n\n// ─── Re-export context hook for styled layer ──────────────────────────────────\n\nexport { useDrawerContext };\n","import { cva, type VariantProps } from \"class-variance-authority\";\n\n/**\n * Material Design 3 Navigation Drawer container variants (CVA).\n *\n * Width: 360dp (`w-drawer`)\n * Shape: `rounded-r-xl` (28px right-side radius per MD3 shape extra-large)\n *\n * Slide-in animation is driven by MD3 motion tokens:\n * - Enter: `duration-medium4` (400ms), `ease-emphasized-decelerate`\n * - Exit: `duration-medium2` (300ms), `ease-emphasized-accelerate`\n *\n * @see https://m3.material.io/components/navigation-drawer/specs\n */\nexport const drawerVariants = cva(\n [\n // Layout\n \"fixed top-0 left-0 h-full w-drawer\",\n \"flex flex-col overflow-y-auto\",\n // Stacking and shape\n \"z-50\",\n \"rounded-r-xl\",\n // Slide animation (transition applies to all open/closed state changes)\n \"transition-transform duration-medium4 ease-emphasized-decelerate\",\n // Focus outline removal (focus management handled by FocusScope / React Aria)\n \"outline-none\",\n // Padding for content spacing\n \"px-3\",\n ],\n {\n variants: {\n /**\n * Structural variant — drives surface color and elevation.\n * - `standard`: inline nav panel, lower-elevation surface\n * - `modal`: overlay dialog with elevation shadow\n */\n variant: {\n standard: [\"bg-surface-container-low\"],\n modal: [\"bg-surface-container\", \"shadow-elevation-1\"],\n },\n\n /**\n * Open/closed state — drives translation.\n * - `true`: drawer visible (`translate-x-0`)\n * - `false`: drawer off-screen (`-translate-x-full`)\n */\n open: {\n true: [\"translate-x-0\"],\n false: [\"-translate-x-full\"],\n },\n },\n\n defaultVariants: {\n variant: \"standard\",\n open: false,\n },\n }\n);\n\n/**\n * Material Design 3 Navigation Drawer item variants (CVA).\n *\n * Each item is a full-width flex row with a pill-shaped active indicator.\n *\n * Active item: `bg-secondary-container` / `text-on-secondary-container`\n * Inactive item: `text-on-surface-variant`\n * State layers: `opacity-8` hover, `opacity-12` pressed\n *\n * @see https://m3.material.io/components/navigation-drawer/specs\n */\nexport const drawerItemVariants = cva(\n [\n // Layout\n \"relative flex w-full items-center gap-3\",\n \"h-14 px-4\",\n \"rounded-full\",\n // Typography\n \"text-label-large\",\n // Interaction\n \"cursor-pointer select-none outline-none\",\n // State layer pseudo-element\n \"before:absolute before:inset-0 before:rounded-full\",\n \"before:transition-opacity before:duration-short2 before:ease-standard\",\n \"before:opacity-0\",\n // Hover and focus visible state layers\n \"hover:before:opacity-8\",\n \"focus-visible:before:opacity-12\",\n // Active pressed state\n \"active:before:opacity-12\",\n // Transition for color changes\n \"transition-colors duration-short2 ease-standard\",\n ],\n {\n variants: {\n /**\n * Whether this item is the currently active destination.\n * Controls background, text color, and icon color per MD3 spec.\n */\n isActive: {\n true: [\n \"bg-secondary-container\",\n \"text-on-secondary-container\",\n \"before:bg-on-secondary-container\",\n ],\n false: [\"bg-transparent\", \"text-on-surface-variant\", \"before:bg-on-surface-variant\"],\n },\n\n /**\n * Whether the item is disabled.\n * Applies `opacity-38` per MD3 disabled state spec.\n */\n isDisabled: {\n true: [\"opacity-38 cursor-not-allowed pointer-events-none\"],\n false: [],\n },\n },\n\n defaultVariants: {\n isActive: false,\n isDisabled: false,\n },\n }\n);\n\n/**\n * Modal scrim overlay variants (CVA).\n *\n * Covers the full viewport behind the modal drawer.\n * Clicking the scrim closes the drawer.\n *\n * Color: `bg-scrim` at `opacity-32` per MD3 spec.\n */\nexport const scrimVariants = cva([\n \"fixed inset-0 z-40\",\n \"bg-scrim opacity-32\",\n \"transition-opacity duration-medium2 ease-standard\",\n]);\n\n/**\n * Drawer section container variants (CVA).\n *\n * Groups related items with an optional header label and divider.\n */\nexport const drawerSectionVariants = cva([\"flex flex-col w-full\"]);\n\n/**\n * Drawer section header variants (CVA).\n *\n * Header text: `text-title-small text-on-surface-variant` per MD3 spec.\n */\nexport const drawerSectionHeaderVariants = cva([\n \"px-4 pt-4 pb-2\",\n \"text-title-small text-on-surface-variant\",\n \"select-none\",\n]);\n\n/**\n * Drawer section divider variants (CVA).\n *\n * Horizontal rule using `border-outline-variant`.\n */\nexport const drawerDividerVariants = cva([\"border-t border-outline-variant\", \"mx-4 my-2\"]);\n\n// ─── Type exports ─────────────────────────────────────────────────────────────\n\nexport type DrawerVariants = VariantProps<typeof drawerVariants>;\nexport type DrawerItemVariants = VariantProps<typeof drawerItemVariants>;\nexport type ScrimVariants = VariantProps<typeof scrimVariants>;\nexport type DrawerSectionVariants = VariantProps<typeof drawerSectionVariants>;\n","\"use client\";\n\nimport { forwardRef } from \"react\";\nimport { HeadlessDrawer } from \"./DrawerHeadless\";\nimport { drawerVariants, scrimVariants } from \"./Drawer.variants\";\nimport { cn } from \"../../utils/cn\";\nimport type { DrawerProps } from \"./Drawer.types\";\n\n/**\n * Material Design 3 Navigation Drawer (Layer 3: Styled).\n *\n * Supports two structural variants driven by the `variant` prop:\n *\n * - **`standard`** — Inline `<nav>` landmark. Permanently visible or\n * collapsible via controlled `open` prop. No overlay or focus trap.\n * Surface: `bg-surface-container-low`.\n *\n * - **`modal`** — Overlay dialog with scrim backdrop, slide-in animation,\n * focus trap, and `Escape` to close.\n * Surface: `bg-surface-container`, `shadow-elevation-1`.\n *\n * Both variants:\n * - `role=\"navigation\"` on the outer wrapper\n * - `rounded-r-xl` (28px per MD3 shape extra-large on right side only)\n * - Slide-in animation: `translate-x` driven by MD3 motion tokens\n * - `w-drawer` (360dp per MD3 spec)\n *\n * Modal-only:\n * - `role=\"dialog\"` + `aria-modal=\"true\"` on the panel\n * - `FocusScope` containing focus + restoring on close\n * - `usePreventScroll` to lock body scroll\n * - Scrim: `bg-scrim opacity-32` — click closes drawer\n * - `Escape` key closes drawer\n *\n * @example\n * ```tsx\n * // Standard variant (collapsible sidebar)\n * <Drawer\n * variant=\"standard\"\n * open={sidebarOpen}\n * onOpenChange={setSidebarOpen}\n * aria-label=\"App navigation\"\n * >\n * <DrawerItem icon={<HomeIcon />} label=\"Home\" isActive />\n * <DrawerSection header=\"Settings\" showDivider>\n * <DrawerItem icon={<SettingsIcon />} label=\"Preferences\" />\n * </DrawerSection>\n * </Drawer>\n *\n * // Modal variant (overlay)\n * <Drawer\n * variant=\"modal\"\n * open={drawerOpen}\n * onOpenChange={setDrawerOpen}\n * aria-label=\"App navigation\"\n * >\n * <DrawerItem label=\"Home\" isActive />\n * <DrawerItem label=\"Inbox\" badge={<span>5</span>} />\n * </Drawer>\n * ```\n *\n * @see https://m3.material.io/components/navigation-drawer/overview\n */\nexport const Drawer = forwardRef<HTMLElement, DrawerProps>(\n (\n {\n variant = \"standard\",\n open,\n defaultOpen = false,\n onOpenChange,\n \"aria-label\": ariaLabel,\n children,\n className,\n disableRipple = false,\n ...restProps\n },\n ref\n ) => {\n const isOpen = open ?? defaultOpen;\n\n const drawerPanelClass = cn(\n drawerVariants({\n variant,\n open: isOpen,\n }),\n className\n );\n\n const scrimClass = scrimVariants();\n\n return (\n <HeadlessDrawer\n ref={ref}\n variant={variant}\n {...(open !== undefined ? { open } : {})}\n {...(defaultOpen !== undefined ? { defaultOpen } : {})}\n {...(onOpenChange !== undefined ? { onOpenChange } : {})}\n aria-label={ariaLabel}\n className={drawerPanelClass}\n scrimClassName={scrimClass}\n disableRipple={disableRipple}\n {...restProps}\n >\n {children}\n </HeadlessDrawer>\n );\n }\n);\n\nDrawer.displayName = \"Drawer\";\n","\"use client\";\n\nimport { forwardRef } from \"react\";\nimport { HeadlessDrawerItem } from \"./DrawerHeadless\";\nimport { drawerItemVariants } from \"./Drawer.variants\";\nimport { cn } from \"../../utils/cn\";\nimport { useRipple } from \"../../hooks/useRipple\";\nimport type { DrawerItemProps } from \"./Drawer.types\";\n\n/**\n * Material Design 3 Navigation Drawer Item (Layer 3: Styled).\n *\n * Renders a navigation destination row following MD3 Navigation Drawer specs.\n * Uses `HeadlessDrawerItem` for behavior and accessibility, CVA for variants.\n *\n * Renders as `<a>` when `href` is provided, `<button>` otherwise.\n *\n * Features:\n * - Active indicator: `bg-secondary-container` / `text-on-secondary-container`\n * - `aria-current=\"page\"` on active item\n * - Ripple effect on interaction\n * - Hover/focus/pressed state layers (MD3 spec: 8% / 12%)\n * - Optional leading icon (24dp slot)\n * - Optional trailing badge or secondary text\n * - Disabled state: `opacity-38`, non-interactive\n *\n * @example\n * ```tsx\n * // Active item with icon\n * <DrawerItem icon={<HomeIcon />} label=\"Home\" isActive onPress={() => navigate('/')} />\n *\n * // Link item\n * <DrawerItem href=\"/settings\" icon={<SettingsIcon />} label=\"Settings\" />\n *\n * // Item with badge\n * <DrawerItem label=\"Inbox\" badge={<span>3</span>} />\n *\n * // Disabled\n * <DrawerItem label=\"Disabled Feature\" isDisabled />\n * ```\n *\n * @see https://m3.material.io/components/navigation-drawer/specs\n */\nexport const DrawerItem = forwardRef<HTMLElement, DrawerItemProps>(\n (\n {\n href,\n icon,\n label,\n badge,\n secondaryText,\n isActive = false,\n isDisabled = false,\n disableRipple = false,\n className,\n onPress,\n onPressStart,\n onPressEnd,\n onPressChange,\n onPressUp,\n ...restProps\n },\n ref\n ) => {\n const isItemDisabled = isDisabled;\n\n const { onMouseDown: handleRipple, ripples } = useRipple({\n disabled: isItemDisabled || disableRipple,\n });\n\n return (\n <HeadlessDrawerItem\n {...restProps}\n ref={ref}\n {...(href !== undefined ? { href } : {})}\n isActive={isActive}\n {...(isItemDisabled !== undefined ? { isDisabled: isItemDisabled } : {})}\n {...(onPress !== undefined ? { onPress } : {})}\n {...(onPressStart !== undefined ? { onPressStart } : {})}\n {...(onPressEnd !== undefined ? { onPressEnd } : {})}\n {...(onPressChange !== undefined ? { onPressChange } : {})}\n {...(onPressUp !== undefined ? { onPressUp } : {})}\n onMouseDown={handleRipple}\n className={cn(\n drawerItemVariants({\n isActive,\n isDisabled: isItemDisabled,\n }),\n className\n )}\n >\n {/* Ripple effect */}\n {ripples}\n\n {/* Leading icon slot (24dp) */}\n {icon && (\n <span\n className=\"relative z-10 flex shrink-0 items-center justify-center\"\n aria-hidden=\"true\"\n >\n {icon}\n </span>\n )}\n\n {/* Label and optional secondary text */}\n <span className=\"relative z-10 flex min-w-0 flex-1 flex-col text-left\">\n <span className=\"truncate\">{label}</span>\n {secondaryText && (\n <span className=\"text-body-small truncate opacity-70\">{secondaryText}</span>\n )}\n </span>\n\n {/* Trailing badge */}\n {badge && (\n <span\n className=\"relative z-10 ml-auto flex shrink-0 items-center pr-2\"\n aria-hidden=\"true\"\n >\n {badge}\n </span>\n )}\n </HeadlessDrawerItem>\n );\n }\n);\n\nDrawerItem.displayName = \"DrawerItem\";\n","\"use client\";\n\nimport { forwardRef } from \"react\";\nimport {\n drawerSectionVariants,\n drawerSectionHeaderVariants,\n drawerDividerVariants,\n} from \"./Drawer.variants\";\nimport { cn } from \"../../utils/cn\";\nimport type { DrawerSectionProps } from \"./Drawer.types\";\n\n/**\n * Material Design 3 Navigation Drawer Section (Layer 3: Styled).\n *\n * Groups related `DrawerItem` elements with an optional header label and\n * a horizontal divider. Follows MD3 Navigation Drawer spec for section\n * grouping and typography.\n *\n * Features:\n * - Optional header label: `text-title-small text-on-surface-variant`\n * - Optional top divider: `border-outline-variant`\n * - Semantic `<hr role=\"separator\">` for the divider\n *\n * @example\n * ```tsx\n * // Section with header and divider\n * <DrawerSection header=\"Account\" showDivider>\n * <DrawerItem icon={<ProfileIcon />} label=\"Profile\" />\n * <DrawerItem icon={<LogoutIcon />} label=\"Logout\" />\n * </DrawerSection>\n *\n * // Section without header (just a visual group)\n * <DrawerSection showDivider>\n * <DrawerItem label=\"Help\" />\n * </DrawerSection>\n * ```\n *\n * @see https://m3.material.io/components/navigation-drawer/specs\n */\nexport const DrawerSection = forwardRef<HTMLDivElement, DrawerSectionProps>(\n ({ header, children, showDivider = false, className }, ref) => {\n return (\n <div ref={ref} className={cn(drawerSectionVariants(), className)}>\n {/* Divider above the section */}\n {showDivider && (\n <hr role=\"separator\" aria-hidden=\"true\" className={drawerDividerVariants()} />\n )}\n\n {/* Section header label */}\n {header && <span className={drawerSectionHeaderVariants()}>{header}</span>}\n\n {/* Section items */}\n {children}\n </div>\n );\n }\n);\n\nDrawerSection.displayName = \"DrawerSection\";\n","import { cva, type VariantProps } from \"class-variance-authority\";\n\n/**\n * Material Design 3 Progress Indicator Variants (CVA)\n *\n * Type-safe variant management for Progress component.\n * Uses Tailwind CSS classes mapped to MD3 design tokens.\n *\n * MD3 Specifications:\n * - Linear track height: 4dp (h-1 = 4px)\n * - Linear track shape: rounded-full (radius-full)\n * - Circular default size: 48dp (h-12 w-12)\n * - Circular stroke width: 4dp (applied as SVG attribute)\n * - Active track color: primary\n * - Inactive track color: surface-container-highest\n * - Label text: on-surface, body-small\n */\n\n/**\n * Progress container variants.\n * Wraps the entire progress indicator (label + visual).\n */\nexport const progressContainerVariants = cva([\"inline-flex\", \"flex-col\", \"gap-1\"], {\n variants: {\n /**\n * The visual type of the indicator.\n */\n type: {\n linear: \"w-full\",\n circular: \"items-center justify-center w-auto\",\n },\n },\n defaultVariants: {\n type: \"linear\",\n },\n});\n\n/**\n * Linear track variants (the 4dp-height background rail).\n */\nexport const progressTrackVariants = cva([\n \"relative\",\n \"w-full\",\n \"h-1\", // MD3: 4dp track height\n \"rounded-full\", // MD3: full corner radius\n \"overflow-hidden\",\n \"bg-surface-container-highest\", // MD3: inactive track color\n]);\n\n/**\n * Linear indicator bar variants (the foreground progress fill).\n */\nexport const progressIndicatorVariants = cva([\n \"absolute\",\n \"left-0\",\n \"top-0\",\n \"h-full\",\n \"rounded-full\",\n \"bg-primary\", // MD3: active track color\n \"transition-[width]\",\n \"duration-medium4\", // MD3: 400ms for value transitions\n \"ease-standard\", // MD3: cubic-bezier(0.2, 0, 0, 1)\n]);\n\n/**\n * Stop indicator dot variants (linear determinate only).\n * Appears at the leading edge of the track head per MD3 spec.\n */\nexport const progressStopIndicatorVariants = cva([\n \"absolute\",\n \"right-0\",\n \"top-1/2\",\n \"-translate-y-1/2\",\n \"w-1\",\n \"h-1\",\n \"rounded-full\",\n \"bg-primary\", // MD3: stop indicator uses primary color\n]);\n\n/**\n * Circular SVG size variants.\n * Maps the size prop to MD3-specified dimensions.\n * - small: 24dp → h-6 w-6\n * - medium: 48dp → h-12 w-12 (default)\n * - large: 64dp → h-16 w-16\n */\nexport const progressCircularSizeVariants = cva(\n [\"relative\", \"flex\", \"items-center\", \"justify-center\", \"flex-shrink-0\"],\n {\n variants: {\n size: {\n small: \"h-6 w-6\", // MD3: 24dp\n medium: \"h-12 w-12\", // MD3: 48dp (default)\n large: \"h-16 w-16\", // MD3: 64dp\n },\n },\n defaultVariants: {\n size: \"medium\",\n },\n }\n);\n\n/**\n * Label text variants.\n * Rendered above or beside the indicator per MD3 spec.\n */\nexport const progressLabelVariants = cva([\n \"text-body-small\", // MD3: body-small type scale (12px)\n \"text-on-surface\", // MD3: on-surface color role\n \"select-none\",\n]);\n\n/**\n * Extract variant prop types from CVA.\n */\nexport type ProgressContainerVariants = VariantProps<typeof progressContainerVariants>;\nexport type ProgressTrackVariants = VariantProps<typeof progressTrackVariants>;\nexport type ProgressIndicatorVariants = VariantProps<typeof progressIndicatorVariants>;\nexport type ProgressCircularSizeVariants = VariantProps<typeof progressCircularSizeVariants>;\nexport type ProgressLabelVariants = VariantProps<typeof progressLabelVariants>;\n","\"use client\";\n\nimport { forwardRef, useRef } from \"react\";\nimport type React from \"react\";\nimport { useProgressBar } from \"react-aria\";\nimport { cn } from \"../../utils/cn\";\nimport {\n progressContainerVariants,\n progressTrackVariants,\n progressIndicatorVariants,\n progressStopIndicatorVariants,\n progressCircularSizeVariants,\n progressLabelVariants,\n} from \"./Progress.variants\";\nimport type { ProgressProps } from \"./Progress.types\";\nimport \"./Progress.css\";\n\n// ---------------------------------------------------------------------------\n// SVG constants for circular variant\n// MD3 spec: stroke-width = 4dp; size maps to dp values below.\n// ---------------------------------------------------------------------------\n\nconst STROKE_WIDTH = 4;\n\nconst CIRCULAR_SIZE_PX: Record<\"small\" | \"medium\" | \"large\", number> = {\n small: 24,\n medium: 48,\n large: 64,\n};\n\nfunction getCircularGeometry(size: \"small\" | \"medium\" | \"large\"): {\n diameter: number;\n radius: number;\n circumference: number;\n viewBox: string;\n cx: number;\n cy: number;\n} {\n const diameter = CIRCULAR_SIZE_PX[size];\n const radius = (diameter - STROKE_WIDTH) / 2;\n const circumference = 2 * Math.PI * radius;\n const viewBox = `0 0 ${diameter} ${diameter}`;\n const cx = diameter / 2;\n const cy = diameter / 2;\n return { diameter, radius, circumference, viewBox, cx, cy };\n}\n\n/**\n * Material Design 3 Progress Indicator (Layer 3: Styled)\n *\n * Built on React Aria for world-class accessibility.\n * Supports four variants driven by `type` + `indeterminate` props:\n * - Linear Determinate\n * - Linear Indeterminate\n * - Circular Determinate\n * - Circular Indeterminate\n *\n * MD3 Specifications:\n * - Linear track height: 4dp (h-1)\n * - Linear track shape: rounded-full\n * - Circular default size: 48dp (medium)\n * - Circular stroke width: 4dp (SVG attribute)\n * - Active track: primary\n * - Inactive track: surface-container-highest\n * - Determinate transitions: duration-medium4 + ease-standard\n * - Indeterminate linear cycle: duration-long2\n * - Indeterminate circular rotation: duration-long4\n *\n * @example\n * ```tsx\n * // Linear determinate\n * <Progress type=\"linear\" value={60} label=\"Uploading\" />\n *\n * // Linear indeterminate\n * <Progress type=\"linear\" indeterminate aria-label=\"Loading\" />\n *\n * // Circular determinate\n * <Progress type=\"circular\" value={75} label=\"Processing\" />\n *\n * // Circular indeterminate\n * <Progress type=\"circular\" indeterminate aria-label=\"Loading\" />\n *\n * // Circular small spinner\n * <Progress type=\"circular\" indeterminate size=\"small\" aria-label=\"Loading\" />\n * ```\n */\nexport const Progress = forwardRef<HTMLDivElement, ProgressProps>(\n (\n {\n type = \"linear\",\n indeterminate = false,\n size = \"medium\",\n className,\n label,\n value = 0,\n minValue = 0,\n maxValue = 100,\n ...restProps\n },\n forwardedRef\n ) => {\n const internalRef = useRef<HTMLDivElement>(null);\n const ref = (forwardedRef ?? internalRef) as React.RefObject<HTMLDivElement>;\n\n // React Aria: provides progressBarProps (role, aria-value*) and labelProps\n const { progressBarProps, labelProps } = useProgressBar({\n label,\n value,\n minValue,\n maxValue,\n isIndeterminate: indeterminate,\n ...restProps,\n });\n\n // Percentage for determinate rendering\n const percentage = indeterminate\n ? 0\n : Math.min(100, Math.max(0, ((value - minValue) / (maxValue - minValue)) * 100));\n\n // Development warning: require accessible label\n if (process.env.NODE_ENV !== \"production\") {\n const ariaProps = restProps as {\n \"aria-label\"?: string;\n \"aria-labelledby\"?: string;\n };\n if (!label && !ariaProps[\"aria-label\"] && !ariaProps[\"aria-labelledby\"]) {\n console.warn(\n \"[Progress] Progress indicator should have a visible label prop or aria-label for accessibility.\"\n );\n }\n }\n\n return (\n <div\n {...progressBarProps}\n ref={ref}\n className={cn(progressContainerVariants({ type }), className)}\n >\n {/* Optional visible label */}\n {label && (\n <span {...labelProps} className={cn(progressLabelVariants())}>\n {label}\n </span>\n )}\n\n {/* Visual rendering: branches on type × indeterminate */}\n {type === \"linear\" ? (\n <LinearProgress percentage={percentage} indeterminate={indeterminate} />\n ) : (\n <CircularProgress percentage={percentage} indeterminate={indeterminate} size={size} />\n )}\n </div>\n );\n }\n);\n\nProgress.displayName = \"Progress\";\n\n// ---------------------------------------------------------------------------\n// Linear Progress Visual\n// ---------------------------------------------------------------------------\n\ninterface LinearProgressProps {\n percentage: number;\n indeterminate: boolean;\n}\n\nfunction LinearProgress({ percentage, indeterminate }: LinearProgressProps): React.JSX.Element {\n if (indeterminate) {\n return (\n <div data-progress-track=\"\" className={cn(progressTrackVariants())}>\n <div\n data-progress-indeterminate=\"\"\n className=\"absolute inset-0 overflow-hidden rounded-full\"\n >\n {/* Segment 1 */}\n <div\n className={cn(\n \"bg-primary absolute top-0 h-full rounded-full\",\n \"animate-progress-linear-indeterminate-1\"\n )}\n />\n {/* Segment 2 */}\n <div\n className={cn(\n \"bg-primary absolute top-0 h-full rounded-full\",\n \"animate-progress-linear-indeterminate-2\"\n )}\n />\n </div>\n </div>\n );\n }\n\n return (\n <div data-progress-track=\"\" className={cn(progressTrackVariants())}>\n {/* Determinate indicator bar */}\n <div\n data-progress-indicator=\"\"\n className={cn(progressIndicatorVariants())}\n style={{ width: `${percentage}%` }}\n />\n {/* Stop indicator dot — leading edge of progress head per MD3 */}\n <div\n data-stop-indicator=\"\"\n className={cn(progressStopIndicatorVariants())}\n aria-hidden=\"true\"\n />\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Circular Progress Visual\n// ---------------------------------------------------------------------------\n\ninterface CircularProgressProps {\n percentage: number;\n indeterminate: boolean;\n size: \"small\" | \"medium\" | \"large\";\n}\n\nfunction CircularProgress({\n percentage,\n indeterminate,\n size,\n}: CircularProgressProps): React.JSX.Element {\n const { radius, circumference, viewBox, cx, cy } = getCircularGeometry(size);\n\n // stroke-dashoffset: 0 = full circle (100%), circumference = empty circle (0%)\n const strokeDashoffset = (1 - percentage / 100) * circumference;\n\n if (indeterminate) {\n return (\n <div\n data-progress-size={size}\n data-progress-indeterminate=\"\"\n className={cn(progressCircularSizeVariants({ size }))}\n >\n <svg\n viewBox={viewBox}\n className=\"animate-progress-circular-rotate h-full w-full\"\n aria-hidden=\"true\"\n >\n <circle\n cx={cx}\n cy={cy}\n r={radius}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={STROKE_WIDTH}\n className=\"text-surface-container-highest\"\n />\n <circle\n cx={cx}\n cy={cy}\n r={radius}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={STROKE_WIDTH}\n className=\"animate-progress-circular-dash text-primary\"\n strokeLinecap=\"round\"\n />\n </svg>\n </div>\n );\n }\n\n return (\n <div data-progress-size={size} className={cn(progressCircularSizeVariants({ size }))}>\n <svg viewBox={viewBox} className=\"h-full w-full -rotate-90\" aria-hidden=\"true\">\n {/* Background circle (inactive track) */}\n <circle\n cx={cx}\n cy={cy}\n r={radius}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={STROKE_WIDTH}\n className=\"text-surface-container-highest\"\n />\n {/* Foreground circle (active track, determinate) */}\n <circle\n cx={cx}\n cy={cy}\n r={radius}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={STROKE_WIDTH}\n strokeLinecap=\"round\"\n className=\"text-primary duration-medium4 ease-standard transition-[stroke-dashoffset]\"\n strokeDasharray={circumference}\n strokeDashoffset={strokeDashoffset}\n />\n </svg>\n </div>\n );\n}\n","import { forwardRef, useRef } from \"react\";\nimport type React from \"react\";\nimport { useProgressBar } from \"react-aria\";\nimport type { ProgressHeadlessProps } from \"./Progress.types\";\n\n/**\n * Headless Progress Indicator Component (Layer 2)\n *\n * Unstyled progress bar primitive using React Aria for accessibility.\n * Provides behavior only — bring your own styles.\n *\n * Features:\n * - role=\"progressbar\" with correct aria-value* attributes\n * - Determinate and indeterminate progress support\n * - Internationalized value label formatting via React Aria\n * - Label linkage via aria-labelledby / aria-label\n * - Render prop for custom visual rendering\n *\n * @example\n * ```tsx\n * // Custom visual via render prop\n * <ProgressHeadless\n * value={50}\n * label=\"Upload\"\n * renderProgress={({ percentage }) => (\n * <div style={{ width: `${percentage}%` }} />\n * )}\n * />\n *\n * // Children-based rendering\n * <ProgressHeadless value={75} aria-label=\"Loading\">\n * <MyCustomProgressVisual />\n * </ProgressHeadless>\n * ```\n */\nexport const ProgressHeadless = forwardRef<HTMLDivElement, ProgressHeadlessProps>(\n (\n {\n type = \"linear\",\n indeterminate = false,\n size = \"medium\",\n className,\n children,\n renderProgress,\n label,\n value = 0,\n minValue = 0,\n maxValue = 100,\n ...restProps\n },\n forwardedRef\n ) => {\n const internalRef = useRef<HTMLDivElement>(null);\n const ref = (forwardedRef ?? internalRef) as React.RefObject<HTMLDivElement>;\n\n // Map our `indeterminate` prop to React Aria's `isIndeterminate`\n const { progressBarProps, labelProps } = useProgressBar({\n label,\n value,\n minValue,\n maxValue,\n isIndeterminate: indeterminate,\n ...restProps,\n });\n\n // Compute percentage for consumers\n const percentage = indeterminate ? 0 : ((value - minValue) / (maxValue - minValue)) * 100;\n\n return (\n <div {...progressBarProps} ref={ref} className={className}>\n {label && <span {...labelProps}>{label}</span>}\n {renderProgress?.({\n percentage,\n isIndeterminate: indeterminate,\n type,\n size,\n })}\n {children}\n </div>\n );\n }\n);\n\nProgressHeadless.displayName = \"ProgressHeadless\";\n","\"use client\";\n\nimport {\n createContext,\n forwardRef,\n useCallback,\n useContext,\n useRef,\n useLayoutEffect,\n useState,\n isValidElement,\n cloneElement,\n type ReactNode,\n type ReactElement,\n type HTMLAttributes,\n type JSX,\n} from \"react\";\nimport {\n Menu as RACMenu,\n MenuItem as RACMenuItem,\n MenuSection as RACMenuSection,\n Separator as RACSeparator,\n SubmenuTrigger as RACSubmenuTrigger,\n MenuTrigger as RACMenuTrigger,\n ButtonContext,\n Popover,\n OverlayTriggerStateContext,\n useSlottedContext,\n type SeparatorProps as RACSeparatorProps,\n} from \"react-aria-components\";\nimport { useButton } from \"react-aria\";\nimport { useOverlayTriggerState } from \"react-stately\";\nimport type {\n HeadlessMenuTriggerProps,\n HeadlessMenuProps,\n HeadlessMenuItemProps,\n HeadlessMenuSectionProps,\n HeadlessSubmenuTriggerProps,\n HeadlessContextMenuTriggerProps,\n MenuContextValue,\n} from \"./Menu.types\";\n\n// ─── MenuContext ──────────────────────────────────────────────────────────────\n\nexport const MenuContext = createContext<MenuContextValue | null>(null);\n\nexport function useMenuContext(): MenuContextValue | null {\n return useContext(MenuContext);\n}\n\n// ─── TriggerBridge ────────────────────────────────────────────────────────────\n/**\n * Reads the button slot props from `ButtonContext` (provided by `RACMenuTrigger`)\n * and applies them to any plain HTML element child via `cloneElement`.\n *\n * This bridges the gap between RAC's context-based prop injection (which expects\n * a RAC `Button`) and our Layer 3 API that accepts any trigger element (e.g. a\n * native `<button>` or a custom component).\n *\n * @internal\n */\nfunction TriggerBridge({ children }: { children: ReactNode }): ReactNode {\n // useSlottedContext gives a properly typed value (ButtonContextValue & { ref? })\n // without casting through any.\n const ctx = useSlottedContext(ButtonContext);\n const localRef = useRef<HTMLButtonElement | null>(null);\n\n const { ref: contextRef, ...ctxProps } = ctx ?? {};\n\n // Write to both the context ref (used by RACMenuTrigger for popover\n // positioning) and localRef (passed to useButton, which requires a stable\n // RefObject rather than a ForwardedRef).\n const mergedCallbackRef = useCallback(\n (node: HTMLButtonElement | null) => {\n localRef.current = node;\n if (!contextRef) return;\n if (typeof contextRef === \"function\") {\n contextRef(node);\n } else {\n // After the function check, contextRef is MutableRefObject<HTMLButtonElement | null>\n // (ForwardedRef<T> = callback | MutableRefObject<T | null> | null).\n contextRef.current = node;\n }\n },\n [contextRef]\n );\n\n // ButtonContext is populated by RACMenuTrigger with aria-haspopup,\n // aria-expanded, aria-controls, onPress, onKeyDown, etc.\n // useButton converts React Aria's onPress + keyboard props into standard\n // HTML events (onClick, onKeyDown, etc.) that work on native elements.\n const { buttonProps } = useButton({ ...ctxProps, elementType: \"button\" }, localRef);\n\n if (!isValidElement(children)) return <>{children}</>;\n\n return cloneElement(\n children as React.ReactElement<HTMLAttributes<HTMLElement>>,\n { ...buttonProps, ref: mergedCallbackRef } as HTMLAttributes<HTMLElement>\n );\n}\n\n// ─── HeadlessMenuTrigger ──────────────────────────────────────────────────────\n\n/**\n * Layer 2 headless primitive.\n *\n * Uses `RACMenuTrigger` (Layer 1) as the foundation. `RACMenuTrigger` manages:\n * - `aria-haspopup=\"menu\"` and `aria-expanded` on the trigger (dynamic)\n * - Open/close state and keyboard opening (ArrowDown → focus first item)\n * - `OverlayTriggerStateContext` so the Popover can close on Escape / outside click\n * - `PopoverGroupContext` so the Popover's `ariaHideOutside` does NOT hide the\n * trigger button while the menu is open\n *\n * `TriggerBridge` adapts the context-injected button props to work with any\n * plain HTML element (native `<button>`, custom components, etc.).\n */\nexport function HeadlessMenuTrigger({\n children,\n placement = \"bottom start\",\n shouldFlip = true,\n ...rest\n}: HeadlessMenuTriggerProps): JSX.Element {\n const childrenArray = Array.isArray(children) ? children : [children];\n const [triggerChild, menuChild] = childrenArray as [ReactNode, ReactNode];\n\n return (\n <RACMenuTrigger {...rest}>\n <TriggerBridge>{triggerChild}</TriggerBridge>\n {/*\n * RACMenuTrigger provides PopoverGroupContext which tells ariaHideOutside\n * to exclude the trigger button — so we do NOT need isNonModal here.\n * Without isNonModal the Popover uses the standard modal overlay underlay,\n * which correctly dismisses the menu on any outside pointer interaction.\n */}\n <Popover placement={placement} shouldFlip={shouldFlip} offset={4}>\n {menuChild}\n </Popover>\n </RACMenuTrigger>\n );\n}\n\n// ─── HeadlessMenu ─────────────────────────────────────────────────────────────\n\n/**\n * Layer 2 headless primitive wrapping RAC `Menu`.\n *\n * When nested inside `HeadlessMenuTrigger`, RAC automatically threads the\n * `MenuContext` (containing `autoFocus`, `onClose`, `aria-labelledby`, etc.)\n * from `RACMenuTrigger` through to `RACMenu`. No manual prop threading needed.\n *\n * **aria-label / aria-labelledby precedence fix**: `RACSubmenuTrigger` sets\n * `aria-labelledby` in `MenuContext` pointing to the trigger item. In ARIA\n * spec, `aria-labelledby` always overrides `aria-label`. So when the consumer\n * provides an explicit `aria-label`, we suppress the context's\n * `aria-labelledby` by passing `aria-labelledby={undefined}`, which takes\n * precedence over the `MenuContext` value in `useContextProps`'s `mergeProps`\n * call (last argument wins). This ensures `aria-label=\"My Submenu\"` is\n * respected as the accessible name.\n */\nexport function HeadlessMenu<T extends object = object>({\n className,\n children,\n \"aria-label\": ariaLabel,\n ...props\n}: HeadlessMenuProps<T>): JSX.Element {\n const menuRef = useRef<HTMLDivElement | null>(null);\n\n /**\n * `RACSubmenuTrigger` provides `MenuContext` with `aria-labelledby` pointing\n * to the trigger item's id. In the ARIA spec, `aria-labelledby` always beats\n * `aria-label`, so even if we pass `aria-label` as a prop it would be\n * overridden. `useContextProps` inside `RACMenu` merges context first then\n * explicit props, but passing `aria-labelledby={undefined}` doesn't reliably\n * clear the context-injected attribute in all RAC versions.\n *\n * The only reliable fix: imperatively remove the attribute from the DOM node\n * after every render. `useLayoutEffect` runs synchronously after DOM mutations,\n * so the accessibility tree is already correct when testing-library reads it.\n */\n useLayoutEffect(() => {\n if (ariaLabel && menuRef.current) {\n menuRef.current.removeAttribute(\"aria-labelledby\");\n }\n });\n\n return (\n <RACMenu<T>\n {...props}\n ref={menuRef}\n {...(ariaLabel !== undefined ? { \"aria-label\": ariaLabel } : {})}\n className={className ?? \"\"}\n >\n {children}\n </RACMenu>\n );\n}\n\n// Expose HeadlessMenu as a static property so Layer 2 tests can use\n// <HeadlessMenuTrigger.Menu> just like <MenuTrigger.Menu> at Layer 3.\nHeadlessMenuTrigger.Menu = HeadlessMenu;\n\n// ─── HeadlessMenuItem ─────────────────────────────────────────────────────────\n\n/**\n * Layer 2 headless primitive wrapping RAC `MenuItem`.\n *\n * Accepts `className` as either a static string or a render-prop function\n * `(renderProps: MenuItemRenderProps) => string`, forwarding it directly to\n * `RACMenuItem` so MD3 selection-state styles are applied on the `<li>` element\n * (the element with `role=\"menuitem\"`).\n */\nexport const HeadlessMenuItem = forwardRef<HTMLDivElement, HeadlessMenuItemProps>(\n function HeadlessMenuItem({ children, className, ...props }, ref) {\n return (\n <RACMenuItem {...props} ref={ref} className={className ?? \"\"}>\n {children}\n </RACMenuItem>\n );\n }\n);\n\n// ─── HeadlessMenuSection ──────────────────────────────────────────────────────\n\nexport function HeadlessMenuSection({\n children,\n \"aria-label\": ariaLabel,\n className,\n}: HeadlessMenuSectionProps): JSX.Element {\n return (\n <RACMenuSection\n {...(ariaLabel !== undefined ? { \"aria-label\": ariaLabel } : {})}\n className={className ?? \"\"}\n >\n {children}\n </RACMenuSection>\n );\n}\n\n// ─── HeadlessMenuDivider ──────────────────────────────────────────────────────\n\nexport function HeadlessMenuDivider({\n className,\n ...props\n}: RACSeparatorProps & { className?: string }): JSX.Element {\n return <RACSeparator {...props} className={className ?? \"\"} />;\n}\n\n// ─── HeadlessSubmenuTrigger ───────────────────────────────────────────────────\n\n/**\n * Layer 2 headless primitive wrapping RAC `SubmenuTrigger`.\n *\n * RAC `SubmenuTrigger` expects its children to be a `[MenuItem, Popover>Menu]`\n * pair. The first child is the trigger item; the second is a `Popover` wrapping\n * the submenu `Menu`. We wrap the menu child in a `Popover` here so the consumer\n * only needs to provide `[MenuItem, Menu]`.\n */\nexport function HeadlessSubmenuTrigger({\n children,\n delay,\n}: HeadlessSubmenuTriggerProps): JSX.Element {\n const childrenArray = Array.isArray(children) ? children : [children];\n const [triggerItem, menuChild] = childrenArray as [ReactNode, ReactNode];\n\n // RACSubmenuTrigger requires ReactElement[] children — first child is the\n // trigger MenuItem, second is a Popover wrapping the submenu.\n const racChildren: ReactElement[] = [\n triggerItem as ReactElement,\n <Popover key=\"submenu-popover\">{menuChild}</Popover>,\n ];\n\n return (\n <RACSubmenuTrigger {...(delay !== undefined ? { delay } : {})}>{racChildren}</RACSubmenuTrigger>\n );\n}\n\n// ─── HeadlessContextMenuTrigger ───────────────────────────────────────────────\n\n/**\n * Layer 2 headless primitive for context menus (right-click / two-finger tap).\n * Positions the menu at cursor coordinates via a virtual 0×0 anchor element.\n */\nexport function HeadlessContextMenuTrigger({\n children,\n isOpen: isOpenProp,\n onOpenChange,\n}: HeadlessContextMenuTriggerProps): JSX.Element {\n const virtualTriggerRef = useRef<HTMLSpanElement>(null);\n const [position, setPosition] = useState({ x: 0, y: 0 });\n\n const isControlled = isOpenProp !== undefined;\n\n // Conditionally spread EOPT-sensitive props: isOpen/onOpenChange must not be\n // present with value `undefined` under exactOptionalPropertyTypes.\n const internalState = useOverlayTriggerState({\n ...(isControlled\n ? { isOpen: isOpenProp, ...(onOpenChange !== undefined ? { onOpenChange } : {}) }\n : {}),\n });\n\n const handleContextMenu = (e: React.MouseEvent): void => {\n e.preventDefault();\n setPosition({ x: e.clientX, y: e.clientY });\n internalState.open();\n if (!isControlled) onOpenChange?.(true);\n };\n\n const childrenArray = Array.isArray(children) ? children : [children];\n const [contentChild, menuChild] = childrenArray as [ReactNode, ReactNode];\n\n return (\n <>\n {/* eslint-disable-next-line jsx-a11y/no-static-element-interactions -- display:contents sink; not focusable itself, keyboard dismissal handled by RAC Popover Escape handler */}\n <div onContextMenu={handleContextMenu} style={{ display: \"contents\" }}>\n {contentChild}\n </div>\n\n {/* Virtual 0×0 anchor positioned at cursor coordinates */}\n <span\n ref={virtualTriggerRef}\n aria-hidden=\"true\"\n style={{\n position: \"fixed\",\n top: position.y,\n left: position.x,\n width: 0,\n height: 0,\n pointerEvents: \"none\",\n }}\n />\n\n {/*\n * OverlayTriggerStateContext is provided OUTSIDE the Popover so the\n * Popover reads internalState directly (not a derived localState).\n * We intentionally do NOT pass isOpen as a prop — when isOpen is a prop,\n * the Popover creates a separate localState whose close() doesn't update\n * internalState. By relying solely on OverlayTriggerStateContext, the\n * Popover's DismissButton / Escape key handler call internalState.close()\n * directly, which correctly dismisses the context menu.\n */}\n <OverlayTriggerStateContext.Provider value={internalState}>\n <Popover triggerRef={virtualTriggerRef} placement=\"bottom start\" shouldFlip offset={0}>\n {menuChild}\n </Popover>\n </OverlayTriggerStateContext.Provider>\n </>\n );\n}\n","import { cva, type VariantProps } from \"class-variance-authority\";\n\n/**\n * Material Design 3 Menu container variants (CVA).\n *\n * Elevation: `shadow-elevation-2` (both styles)\n * Width: min 112dp / max 280dp per MD3 spec\n *\n * Shape per menuStyle:\n * - baseline: `rounded-xs` (4dp extra-small)\n * - vertical: `rounded-lg` (16dp large)\n *\n * Background per colorScheme + menuStyle:\n * - baseline + standard: `bg-surface-container`\n * - vertical + standard: `bg-surface-container-low`\n * - vertical + vibrant: `bg-tertiary-container`\n *\n * @see https://m3.material.io/components/menus/specs\n */\nexport const menuContainerVariants = cva(\n [\n // Elevation\n \"shadow-elevation-2\",\n // Width constraints per MD3 spec (112dp min / 280dp max)\n \"min-w-28 max-w-70\",\n // Layout\n \"py-2\",\n // Scroll: show scrollbar when content overflows; max height avoids clipping\n \"overflow-y-auto\",\n \"max-h-[calc(var(--visual-viewport-height,100vh)-2rem)]\",\n // Stacking\n \"z-50\",\n // Focus outline handled by React Aria\n \"outline-none\",\n // GPU compositing — promotes menu to its own compositor layer so\n // scale + opacity animations run without triggering layout reflow.\n \"will-change-[transform,opacity]\",\n // Pointer events blocked during animation to prevent accidental clicks\n // on menu items while the panel is still animating in or out.\n \"data-[entering]:pointer-events-none data-[exiting]:pointer-events-none\",\n // ── Enter animation ────────────────────────────────────────────────────\n // @keyframes menu-enter (defined in styles.css): scale(0.8)+opacity:0 →\n // scale(1)+opacity:1 in 120ms with cubic-bezier(0,0,0.2,1) (standard\n // decelerate — matches Angular Material's _mat-menu-enter keyframe).\n \"data-[entering]:animate-[menu-enter_120ms_cubic-bezier(0,0,0.2,1)_both]\",\n // ── Exit animation ─────────────────────────────────────────────────────\n // @keyframes menu-exit (defined in styles.css): opacity:1 → opacity:0\n // in 100ms after 25ms delay, linear — matches Angular Material's\n // _mat-menu-exit keyframe (fade-only, no reverse scale).\n \"data-[exiting]:animate-[menu-exit_100ms_25ms_linear_both]\",\n // ── Transform origin (placement-aware) ────────────────────────────────\n // RAC sets data-placement=\"bottom|top|left|right\" on the Popover element.\n // Default (bottom): origin at top edge (menu expands downward).\n \"origin-top\",\n // top: origin at bottom edge (menu expands upward)\n \"data-[placement=top]:origin-bottom\",\n // left: origin at right edge\n \"data-[placement=left]:origin-right\",\n // right: origin at left edge\n \"data-[placement=right]:origin-left\",\n // ── Reduced motion ────────────────────────────────────────────────────\n // Skip both animations entirely for users who prefer reduced motion.\n \"motion-reduce:data-[entering]:animate-none motion-reduce:data-[exiting]:animate-none\",\n ],\n {\n variants: {\n /**\n * Color scheme — drives the container background.\n * baseline+standard uses a separate compound variant.\n */\n colorScheme: {\n standard: [],\n vibrant: [],\n },\n /**\n * Visual style — drives corner radius and baseline vs vertical background.\n */\n menuStyle: {\n baseline: [\"rounded-xs\", \"bg-surface-container\"],\n vertical: [\"rounded-lg\", \"bg-surface-container-low\"],\n },\n },\n compoundVariants: [\n // Vertical + vibrant: tertiary container background\n {\n menuStyle: \"vertical\",\n colorScheme: \"vibrant\",\n class: [\"bg-tertiary-container\"],\n },\n ],\n defaultVariants: {\n colorScheme: \"standard\",\n menuStyle: \"baseline\",\n },\n }\n);\n\n/**\n * Material Design 3 Menu item variants (CVA).\n *\n * Typography: `text-body-large` per MD3 baseline spec (16sp / 400 weight).\n * Padding: `px-3` (12dp left/right), `gap-3` (12dp between elements).\n *\n * State layers (MD3 spec):\n * - Hover: `opacity-8` on state layer\n * - Focus visible: `opacity-12` on state layer\n * - Pressed: `opacity-12` on state layer\n * - Disabled: `opacity-38` on entire item\n *\n * Selection colors per menuStyle + colorScheme:\n * - baseline (any): `bg-surface-container-highest`\n * - vertical + standard: `bg-tertiary-container text-on-tertiary-container`\n * - vertical + vibrant: `bg-tertiary text-on-tertiary`\n *\n * Note: item height (48/44/40/36dp) is controlled by density via context,\n * applied directly in MenuItem component (not CVA) to avoid negative key issues.\n *\n * @see https://m3.material.io/components/menus/specs\n */\nexport const menuItemVariants = cva(\n [\n // Layout — height set by density context in MenuItem component\n \"relative flex w-full items-center\",\n \"px-3 gap-3\",\n // Typography: Body Large per MD3 baseline spec\n \"text-body-large\",\n // Interaction\n \"cursor-pointer select-none outline-none\",\n // State layer pseudo-element\n \"before:absolute before:inset-0 before:rounded-[inherit]\",\n \"before:transition-opacity before:duration-short2 before:ease-standard\",\n \"before:opacity-0\",\n // Hover state layer\n \"hover:before:opacity-8\",\n // Focus visible state layer\n \"focus-visible:before:opacity-12\",\n // Active pressed state layer\n \"active:before:opacity-12\",\n // Color transition for selection\n \"transition-colors duration-short2 ease-standard\",\n ],\n {\n variants: {\n /**\n * Disabled state: reduces opacity and blocks interaction.\n */\n isDisabled: {\n true: [\"opacity-38 cursor-not-allowed pointer-events-none\"],\n false: [],\n },\n /**\n * Selected state: background and text color driven by compound variants.\n */\n isSelected: {\n true: [],\n false: [],\n },\n /**\n * Color scheme: drives default text and state layer colors.\n * - standard: on-surface text, on-surface state layer\n * - vibrant (vertical only): on-tertiary-container text + state layer\n */\n colorScheme: {\n standard: [\"text-on-surface\", \"before:bg-on-surface\"],\n vibrant: [\"text-on-tertiary-container\", \"before:bg-on-tertiary-container\"],\n },\n /**\n * Visual style: drives corner radius on items (vertical uses rounded-lg\n * inherited from container, items stay flat inside).\n */\n menuStyle: {\n baseline: [],\n vertical: [],\n },\n },\n compoundVariants: [\n // ── Baseline selection (both colorSchemes) ──────────────────────────\n {\n isSelected: true,\n menuStyle: \"baseline\",\n class: [\n \"bg-surface-container-highest\",\n // text-on-surface already applied by standard colorScheme variant\n ],\n },\n // ── Vertical + Standard selection ───────────────────────────────────\n {\n isSelected: true,\n menuStyle: \"vertical\",\n colorScheme: \"standard\",\n class: [\n \"bg-tertiary-container\",\n \"text-on-tertiary-container\",\n \"before:bg-on-tertiary-container\",\n ],\n },\n // ── Vertical + Vibrant selection ─────────────────────────────────────\n {\n isSelected: true,\n menuStyle: \"vertical\",\n colorScheme: \"vibrant\",\n class: [\"bg-tertiary\", \"text-on-tertiary\", \"before:bg-on-tertiary\"],\n },\n ],\n defaultVariants: {\n isDisabled: false,\n isSelected: false,\n colorScheme: \"standard\",\n menuStyle: \"baseline\",\n },\n }\n);\n\n/**\n * Menu section container variants (CVA).\n */\nexport const menuSectionVariants = cva([\"flex flex-col w-full\"]);\n\n/**\n * Menu section header variants (CVA).\n *\n * Typography: `text-title-small text-on-surface-variant` per MD3 spec.\n */\nexport const menuSectionHeaderVariants = cva([\n \"px-3 pt-2 pb-1\",\n \"text-title-small text-on-surface-variant\",\n \"select-none\",\n]);\n\n/**\n * Menu item divider variants (CVA).\n *\n * Renders a horizontal separator with `border-outline-variant`.\n * Padding: 8dp top/bottom (`my-2`) per MD3 spec.\n *\n * @see https://m3.material.io/components/menus/specs — Measurements\n */\nexport const menuDividerVariants = cva([\"border-t border-outline-variant\", \"my-2 mx-0\"]);\n\n/**\n * Menu gap variants (CVA).\n *\n * A visual spacer for M3 Expressive vertical menus. Uses spacing instead of\n * a border line to separate item groups. `aria-hidden` and `role=\"none\"`.\n *\n * @see https://m3.material.io/components/menus/guidelines#gaps-and-dividers\n */\nexport const menuGapVariants = cva([\"h-2 w-full\"]);\n\n/**\n * Trailing text (keyboard shortcut) variants (CVA).\n *\n * Color: `text-on-surface-variant`, size: `text-label-large` (14sp).\n * The element also carries `aria-keyshortcuts` for screen reader support.\n */\nexport const menuItemTrailingTextVariants = cva([\n \"ml-auto shrink-0 text-label-large text-on-surface-variant\",\n \"select-none\",\n]);\n\n/**\n * Menu item description (supporting text) variants (CVA).\n *\n * Rendered below the label text.\n * Typography: `text-body-medium text-on-surface-variant`.\n */\nexport const menuItemDescriptionVariants = cva([\n \"text-body-medium text-on-surface-variant\",\n \"select-none\",\n]);\n\n// ─── Type exports ─────────────────────────────────────────────────────────────\n\nexport type MenuContainerVariants = VariantProps<typeof menuContainerVariants>;\nexport type MenuItemVariants = VariantProps<typeof menuItemVariants>;\nexport type MenuSectionVariants = VariantProps<typeof menuSectionVariants>;\n","\"use client\";\n\nimport { forwardRef, type JSX } from \"react\";\nimport { HeadlessMenuTrigger } from \"./MenuHeadless\";\nimport { MenuContext } from \"./MenuHeadless\";\nimport { HeadlessMenu } from \"./MenuHeadless\";\nimport { menuContainerVariants } from \"./Menu.variants\";\nimport { cn } from \"../../utils/cn\";\nimport type {\n MenuProps,\n MenuTriggerProps,\n MenuColorScheme,\n MenuStyle,\n MenuDensity,\n} from \"./Menu.types\";\n\n// ─── Menu ────────────────────────────────────────────────────────────────────\n\n/**\n * MD3 styled Menu component (Layer 3).\n *\n * Renders a list of `MenuItem`, `MenuSection`, or `MenuDivider` children.\n * Intended to be used as `MenuTrigger.Menu` (nested inside a `MenuTrigger`).\n *\n * @example\n * ```tsx\n * <MenuTrigger>\n * <Button>Open</Button>\n * <Menu aria-label=\"Actions\">\n * <MenuItem id=\"copy\">Copy</MenuItem>\n * <MenuItem id=\"paste\">Paste</MenuItem>\n * </Menu>\n * </MenuTrigger>\n * ```\n */\nconst Menu = forwardRef<HTMLElement, MenuProps>(function Menu(\n {\n children,\n className,\n colorScheme = \"standard\",\n menuStyle = \"baseline\",\n density = 0,\n disableRipple = false,\n selectionMode,\n selectedKeys,\n onSelectionChange,\n ...props\n },\n _ref\n) {\n /**\n * Close function injected by parent MenuTrigger.\n * The Popover's onClose handles the actual close; we provide a no-op here\n * unless wrapped by a trigger. When used inside MenuTrigger, the context\n * is overridden by the trigger's close handler.\n */\n const close = (): void => {\n // Controlled via RAC Popover — handled by overlay state context.\n };\n\n // Conditionally include optional EOPT-sensitive context fields.\n const contextValue = {\n close,\n disableRipple,\n colorScheme,\n menuStyle,\n density,\n ...(selectionMode !== undefined ? { selectionMode } : {}),\n ...(selectedKeys !== undefined ? { selectedKeys } : {}),\n };\n\n return (\n <MenuContext.Provider value={contextValue}>\n <HeadlessMenu\n {...props}\n {...(selectionMode !== undefined ? { selectionMode } : {})}\n {...(selectedKeys !== undefined ? { selectedKeys } : {})}\n {...(onSelectionChange !== undefined ? { onSelectionChange } : {})}\n className={cn(menuContainerVariants({ colorScheme, menuStyle }), className)}\n >\n {children}\n </HeadlessMenu>\n </MenuContext.Provider>\n );\n});\n\n// ─── MenuTrigger ─────────────────────────────────────────────────────────────\n\n/**\n * MD3 styled MenuTrigger component (Layer 3).\n *\n * Wraps a trigger element and a `Menu` to create a dropdown.\n * Attach `MenuTrigger.Menu` to specify the menu content, which gives IDE\n * autocompletion and makes the parent/child relationship explicit.\n *\n * @example\n * ```tsx\n * <MenuTrigger>\n * <button type=\"button\">Open Menu</button>\n * <MenuTrigger.Menu aria-label=\"Actions\">\n * <MenuItem id=\"cut\">Cut</MenuItem>\n * </MenuTrigger.Menu>\n * </MenuTrigger>\n * ```\n */\nfunction MenuTrigger({\n children,\n placement = \"bottom start\",\n shouldFlip = true,\n ...rest\n}: MenuTriggerProps): JSX.Element {\n return (\n <HeadlessMenuTrigger placement={placement} shouldFlip={shouldFlip} {...rest}>\n {children}\n </HeadlessMenuTrigger>\n );\n}\n\nMenuTrigger.Menu = Menu;\n\nexport { Menu, MenuTrigger };\nexport type { MenuColorScheme, MenuStyle, MenuDensity };\n","\"use client\";\n\nimport { forwardRef, type JSX } from \"react\";\nimport type { MenuItemRenderProps } from \"react-aria-components\";\nimport { useMenuContext } from \"./MenuHeadless\";\nimport { HeadlessMenuItem } from \"./MenuHeadless\";\nimport {\n menuItemVariants,\n menuItemTrailingTextVariants,\n menuItemDescriptionVariants,\n} from \"./Menu.variants\";\nimport { useRipple } from \"../../hooks/useRipple\";\nimport { cn } from \"../../utils/cn\";\nimport type { MenuItemProps } from \"./Menu.types\";\n\n// ─── CheckIcon ───────────────────────────────────────────────────────────────\n\nfunction CheckIcon(): JSX.Element {\n return (\n <svg\n data-testid=\"check-icon\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n focusable=\"false\"\n className=\"h-full w-full\"\n >\n <path d=\"M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z\" />\n </svg>\n );\n}\n\n// ─── ChevronRightIcon ─────────────────────────────────────────────────────────\n\nexport function ChevronRightIcon(): JSX.Element {\n return (\n <svg\n data-testid=\"chevron-icon\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n focusable=\"false\"\n className=\"h-full w-full\"\n >\n <path d=\"M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z\" />\n </svg>\n );\n}\n\n// ─── Density height map ────────────────────────────────────────────────────────\n\nconst DENSITY_HEIGHT: Record<0 | -1 | -2 | -3, string> = {\n 0: \"h-12\",\n [-1]: \"h-11\",\n [-2]: \"h-10\",\n [-3]: \"h-9\",\n};\n\n// ─── MenuItem ─────────────────────────────────────────────────────────────────\n\n/**\n * MD3 styled MenuItem component (Layer 3).\n *\n * All MD3 styles (selection colors, typography, density height) are applied\n * directly to the `<li role=\"menuitem\">` element via RAC's render-prop className,\n * ensuring tests and assistive technologies see the correct classes on the\n * semantically meaningful element.\n *\n * @example\n * ```tsx\n * <MenuItem id=\"copy\" leadingIcon={<CopyIcon />} trailingText=\"⌘C\">\n * Copy\n * </MenuItem>\n * ```\n */\nexport const MenuItem = forwardRef<HTMLDivElement, MenuItemProps>(function MenuItem(\n {\n children,\n leadingIcon,\n trailingIcon,\n trailingText,\n description,\n badge,\n className,\n disableRipple: itemDisableRipple,\n ...props\n },\n ref\n) {\n const ctx = useMenuContext();\n const disableRipple = itemDisableRipple ?? ctx?.disableRipple ?? false;\n const colorScheme = ctx?.colorScheme ?? \"standard\";\n const menuStyle = ctx?.menuStyle ?? \"baseline\";\n const density = ctx?.density ?? 0;\n const selectionMode = ctx?.selectionMode;\n\n const heightClass = DENSITY_HEIGHT[density];\n const isSelectionMenu = selectionMode != null;\n\n const { ripples, onMouseDown } = useRipple({ disabled: disableRipple });\n\n // className rendered on the <li role=\"menuitem\"> via RAC's render-prop form\n const computeClassName = ({ isDisabled, isSelected }: MenuItemRenderProps): string =>\n cn(\n menuItemVariants({\n isDisabled,\n isSelected: isSelected ?? false,\n colorScheme,\n menuStyle,\n }),\n // Height: auto when description is present (multi-line), otherwise density\n description ? \"min-h-12 py-2 h-auto items-start\" : heightClass,\n className\n );\n\n return (\n <HeadlessMenuItem\n {...props}\n ref={ref}\n // Apply all MD3 classes directly to the <li role=\"menuitem\"> element\n className={computeClassName}\n // onMouseDown triggers the ripple effect on mouse presses\n onMouseDown={onMouseDown as unknown as React.MouseEventHandler<Element>}\n >\n {({ isSelected }: MenuItemRenderProps) => (\n <>\n {/* Ripple container */}\n {!disableRipple && (\n <span className=\"pointer-events-none absolute inset-0 z-0 overflow-hidden rounded-[inherit]\">\n {ripples}\n </span>\n )}\n\n {/* ── Leading icon or checkmark slot ────────────────────────── */}\n {(leadingIcon != null || isSelectionMenu) && (\n <span\n className=\"text-on-surface-variant relative z-10 flex h-6 w-6 shrink-0 items-center justify-center\"\n aria-hidden=\"true\"\n >\n {isSelectionMenu && leadingIcon == null ? (\n isSelected ? (\n <CheckIcon />\n ) : null\n ) : (\n leadingIcon\n )}\n </span>\n )}\n\n {/* ── Text content area ─────────────────────────────────────── */}\n {description != null ? (\n <span className=\"relative z-10 flex min-w-0 flex-1 flex-col\">\n <span className=\"text-body-large\">{children}</span>\n <span className={menuItemDescriptionVariants()}>{description}</span>\n </span>\n ) : (\n <span className=\"text-body-large relative z-10 min-w-0 flex-1\">{children}</span>\n )}\n\n {/* ── Badge slot ────────────────────────────────────────────── */}\n {badge != null && <span className=\"relative z-10 shrink-0\">{badge}</span>}\n\n {/* ── Trailing icon ─────────────────────────────────────────── */}\n {trailingIcon != null && trailingText == null && (\n <span\n className=\"text-on-surface-variant relative z-10 ml-auto flex h-6 w-6 shrink-0 items-center justify-center\"\n aria-hidden=\"true\"\n >\n {trailingIcon}\n </span>\n )}\n\n {/* ── Trailing text (keyboard shortcut) ─────────────────────── */}\n {trailingText != null && trailingIcon == null && (\n <span\n className={cn(menuItemTrailingTextVariants(), \"relative z-10\")}\n aria-keyshortcuts={trailingText}\n >\n {trailingText}\n </span>\n )}\n </>\n )}\n </HeadlessMenuItem>\n );\n});\n","\"use client\";\n\nimport { type JSX } from \"react\";\nimport { Header as RACHeader } from \"react-aria-components\";\nimport { HeadlessMenuSection, HeadlessMenuDivider } from \"./MenuHeadless\";\nimport {\n menuSectionVariants,\n menuSectionHeaderVariants,\n menuDividerVariants,\n} from \"./Menu.variants\";\nimport { cn } from \"../../utils/cn\";\nimport type { MenuSectionProps } from \"./Menu.types\";\n\n/**\n * MD3 styled MenuSection component (Layer 3).\n *\n * Groups related `MenuItem` elements with an optional section header and an\n * optional top divider.\n *\n * **Implementation note**: The divider is rendered as a SIBLING BEFORE the\n * `RACMenuSection`, NOT inside it. RAC's `Section`/`MenuSection` only accepts\n * `Header` and `MenuItem` children — placing a `Separator` inside the section\n * would create invalid HTML (`<li>` inside `<li role=\"group\">`) and break RAC's\n * collection rendering.\n *\n * @example\n * ```tsx\n * <MenuSection header=\"Clipboard\" showDivider aria-label=\"Clipboard\">\n * <MenuItem id=\"cut\">Cut</MenuItem>\n * <MenuItem id=\"copy\">Copy</MenuItem>\n * </MenuSection>\n * ```\n */\nexport function MenuSection({\n children,\n header,\n showDivider = false,\n className,\n \"aria-label\": ariaLabel,\n}: MenuSectionProps): JSX.Element {\n // The union type guarantees at least one of these is a string.\n const sectionAriaLabel = (ariaLabel ?? header)!;\n\n return (\n <>\n {/* Divider is a sibling of the section, placed before it in the menu list */}\n {showDivider && <HeadlessMenuDivider className={menuDividerVariants()} />}\n <HeadlessMenuSection\n aria-label={sectionAriaLabel}\n className={cn(menuSectionVariants(), className)}\n >\n {/* RAC Header component renders a semantic section header inside the group */}\n {header && (\n <RACHeader className={menuSectionHeaderVariants()} aria-hidden=\"true\">\n {header}\n </RACHeader>\n )}\n {children}\n </HeadlessMenuSection>\n </>\n );\n}\n","\"use client\";\n\nimport { type JSX } from \"react\";\nimport { HeadlessMenuDivider } from \"./MenuHeadless\";\nimport { menuDividerVariants } from \"./Menu.variants\";\nimport { cn } from \"../../utils/cn\";\nimport type { MenuDividerProps } from \"./Menu.types\";\n\n/**\n * MD3 styled MenuDivider component (Layer 3).\n *\n * Renders a horizontal `role=\"separator\"` with `border-outline-variant` styling.\n * 8dp top/bottom padding (`my-2`) per MD3 spec.\n *\n * @example\n * ```tsx\n * <MenuItem id=\"cut\">Cut</MenuItem>\n * <MenuDivider />\n * <MenuItem id=\"select-all\">Select all</MenuItem>\n * ```\n */\nexport function MenuDivider({ className }: MenuDividerProps): JSX.Element {\n return <HeadlessMenuDivider className={cn(menuDividerVariants(), className)} />;\n}\n","\"use client\";\n\nimport { forwardRef, useCallback, useEffect, useRef, useState } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport type { SnackbarAnimationState, SnackbarHeadlessProps } from \"./Snackbar.types\";\n\n/**\n * SnackbarHeadless — Layer 2 headless primitive.\n *\n * Handles all Snackbar behavior without opinionated visual styling:\n * - ARIA live region with correct `role`/`aria-live` pairing per severity\n * - Auto-dismiss timer with configurable `duration`\n * - Timer pause/resume on pointer hover (`mouseenter`/`mouseleave`) and\n * keyboard focus (`focusin`/`focusout`)\n * - Animation state machine: `entering → visible → exiting → exited`\n * - Exposes `onClose` imperative trigger via render-prop for close icon/action\n * - Merges base `className` with animation-state-dependent classes via\n * the optional `getAnimationClassName` prop\n *\n * No React Aria hook covers Snackbar; ARIA live region patterns follow the\n * ARIA authoring practices specification for status/alert regions.\n *\n * @example\n * ```tsx\n * // With render-prop children (typical usage from styled layer)\n * <SnackbarHeadless\n * message=\"Saved\"\n * duration={3000}\n * onClose={dismiss}\n * className={baseClasses}\n * getAnimationClassName={(state) => snackbarAnimationVariants({ animationState: state })}\n * >\n * {({ onClose }) => (\n * <>\n * <span>Saved</span>\n * <button onClick={onClose}>Dismiss</button>\n * </>\n * )}\n * </SnackbarHeadless>\n * ```\n */\nexport const SnackbarHeadless = forwardRef<HTMLDivElement, SnackbarHeadlessProps>(\n function SnackbarHeadless(\n {\n message,\n supportingText,\n action,\n showClose,\n duration = 4000,\n severity = \"default\",\n position = \"bottom-center\",\n onClose,\n children,\n className,\n getAnimationClassName,\n },\n ref\n ) {\n const [animationState, setAnimationState] = useState<SnackbarAnimationState>(\"entering\");\n\n // Tracks how many ms remain when the timer is paused\n const remainingRef = useRef<number>(duration);\n // Tracks wall-clock time when the current timer segment started\n const startedAtRef = useRef<number>(Date.now());\n // Active auto-dismiss setTimeout handle (separate from exit fallback)\n const dismissTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n // Fallback timer for exit animation (fires onClose if onTransitionEnd doesn't)\n const exitFallbackRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n // Whether the timer is currently paused (hover / focus)\n const pausedRef = useRef<boolean>(false);\n // Guard against calling onClose multiple times\n const closedRef = useRef<boolean>(false);\n\n const clearDismissTimer = useCallback(() => {\n if (dismissTimerRef.current !== null) {\n clearTimeout(dismissTimerRef.current);\n dismissTimerRef.current = null;\n }\n }, []);\n\n const triggerExit = useCallback(() => {\n if (closedRef.current) return;\n clearDismissTimer(); // stop auto-dismiss timer\n setAnimationState(\"exiting\");\n // Fallback: if onTransitionEnd does not fire (jsdom, reduced-motion,\n // or CSS transitions disabled), ensure onClose is called after the\n // exit animation duration (MD3 short4 = 200ms + small buffer).\n exitFallbackRef.current = setTimeout(() => {\n if (!closedRef.current) {\n closedRef.current = true;\n setAnimationState(\"exited\");\n onClose?.();\n }\n }, 250);\n }, [clearDismissTimer, onClose]);\n\n const startDismissTimer = useCallback(\n (ms: number) => {\n if (ms <= 0) return;\n clearDismissTimer();\n startedAtRef.current = Date.now();\n dismissTimerRef.current = setTimeout(triggerExit, ms);\n },\n [clearDismissTimer, triggerExit]\n );\n\n // Entry animation: double requestAnimationFrame guarantees the browser\n // completes at least one full paint cycle with the component in its\n // \"entering\" state (scale-75 + opacity-0) before we transition to\n // \"visible\" (scale-100 + opacity-100). A single setTimeout(0) is not\n // reliable — browsers may batch the renders and never paint the initial\n // state, preventing the CSS zoom-in transition from firing entirely.\n // With fake timers (vi.useFakeTimers), rAF is faked as setTimeout(~16ms),\n // so advancing by 32ms in tests fires both frames correctly.\n useEffect(() => {\n let frameId: number;\n frameId = requestAnimationFrame(() => {\n frameId = requestAnimationFrame(() => {\n setAnimationState(\"visible\");\n });\n });\n return () => cancelAnimationFrame(frameId);\n }, []);\n\n // Start auto-dismiss timer once the component is in `visible` state.\n useEffect(() => {\n if (animationState !== \"visible\") return;\n if (duration <= 0) return;\n\n remainingRef.current = duration;\n startDismissTimer(duration);\n\n // Only clear the dismiss timer on cleanup (not the exit fallback)\n return clearDismissTimer;\n }, [animationState, duration, startDismissTimer, clearDismissTimer]);\n\n // Cleanup all timers on unmount\n useEffect(\n () => () => {\n clearDismissTimer();\n if (exitFallbackRef.current !== null) {\n clearTimeout(exitFallbackRef.current);\n exitFallbackRef.current = null;\n }\n },\n [clearDismissTimer]\n );\n\n // When the exit CSS transition completes, advance to `exited` and fire onClose.\n // Also cancels the fallback timer since the transition fired properly.\n const handleTransitionEnd = useCallback(() => {\n if (animationState === \"exiting\" && !closedRef.current) {\n if (exitFallbackRef.current !== null) {\n clearTimeout(exitFallbackRef.current);\n exitFallbackRef.current = null;\n }\n closedRef.current = true;\n setAnimationState(\"exited\");\n onClose?.();\n }\n }, [animationState, onClose]);\n\n // Pause timer on pointer hover ─────────────────────────────────────────────\n\n const handleMouseEnter = useCallback(() => {\n if (pausedRef.current || animationState !== \"visible\") return;\n pausedRef.current = true;\n const elapsed = Date.now() - startedAtRef.current;\n remainingRef.current = Math.max(remainingRef.current - elapsed, 0);\n clearDismissTimer();\n }, [animationState, clearDismissTimer]);\n\n const handleMouseLeave = useCallback(() => {\n if (!pausedRef.current || animationState !== \"visible\") return;\n pausedRef.current = false;\n if (duration > 0) startDismissTimer(remainingRef.current);\n }, [animationState, duration, startDismissTimer]);\n\n // Pause timer on keyboard focus ────────────────────────────────────────────\n\n const handleFocusIn = useCallback(() => {\n if (pausedRef.current || animationState !== \"visible\") return;\n pausedRef.current = true;\n const elapsed = Date.now() - startedAtRef.current;\n remainingRef.current = Math.max(remainingRef.current - elapsed, 0);\n clearDismissTimer();\n }, [animationState, clearDismissTimer]);\n\n const handleFocusOut = useCallback(() => {\n if (!pausedRef.current || animationState !== \"visible\") return;\n pausedRef.current = false;\n if (duration > 0) startDismissTimer(remainingRef.current);\n }, [animationState, duration, startDismissTimer]);\n\n // Imperative close (close icon pressed, action button, programmatic close)\n const handleClose = useCallback(() => {\n triggerExit();\n }, [triggerExit]);\n\n // ARIA live region attributes per MD3 / ARIA authoring practices spec\n const ariaProps =\n severity === \"error\"\n ? ({ role: \"alert\", \"aria-live\": \"assertive\", \"aria-atomic\": \"true\" } as const)\n : ({ role: \"status\", \"aria-live\": \"polite\", \"aria-atomic\": \"true\" } as const);\n\n // Merge base className with animation-state and position-dependent classes\n const computedClassName = cn(className, getAnimationClassName?.(animationState, position));\n\n // Resolve children — render-prop or static ReactNode\n const childContent =\n typeof children === \"function\"\n ? children({ animationState, onClose: handleClose })\n : (children ?? (\n <>\n <span>{message}</span>\n {supportingText && <span>{supportingText}</span>}\n {action && (\n <button type=\"button\" onClick={action.onAction}>\n {action.label}\n </button>\n )}\n {showClose && (\n <button type=\"button\" aria-label=\"Close\" onClick={handleClose}>\n ✕\n </button>\n )}\n </>\n ));\n\n return (\n // eslint-disable-next-line jsx-a11y/no-static-element-interactions\n <div\n ref={ref}\n className={computedClassName}\n {...ariaProps}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n onFocus={handleFocusIn}\n onBlur={handleFocusOut}\n onTransitionEnd={handleTransitionEnd}\n data-animation-state={animationState}\n >\n {childContent}\n </div>\n );\n }\n);\n\nSnackbarHeadless.displayName = \"SnackbarHeadless\";\n\nexport type { SnackbarAnimationState };\n","import { cva, type VariantProps } from \"class-variance-authority\";\n\n/**\n * Material Design 3 Snackbar Variants (CVA)\n *\n * Type-safe variant management using Tailwind CSS classes mapped to MD3 tokens.\n *\n * MD3 Specifications:\n * - Surface color: inverse-surface\n * - Text color: inverse-on-surface\n * - Shape: extra-small (4dp) → rounded-xs\n * - Elevation: level-3 → shadow-elevation-3\n * - Min width: 288dp → min-w-72\n * - Max width: 568dp → max-w-snackbar-max\n * - Default position: fixed bottom-4, horizontally centered\n * - Message text: body-medium\n * - Action text: label-large, inverse-primary color\n * - Entry motion: medium1 (250ms) + ease-emphasized-decelerate (zoom in)\n * - Exit motion: short4 (200ms) + ease-standard-accelerate (fade out)\n */\n\n// ─── Stack container (fixed viewport anchor, per-position group) ──────────────\n\n/**\n * Outer wrapper rendered once per active position group by `SnackbarProvider`.\n * Handles the fixed viewport positioning and stacking direction for all\n * snackbars sharing the same `position` value.\n *\n * - Bottom positions use `flex-col-reverse` so the newest snackbar sits at\n * the bottom edge and older ones push upward.\n * - Top positions use `flex-col` so the newest sits at the top edge and\n * older ones push downward.\n * - `pointer-events-none` on the container lets clicks pass through the gaps\n * between snackbars; each snackbar restores `pointer-events-auto`.\n */\nexport const snackbarStackContainerVariants = cva(\n [\"fixed\", \"z-50\", \"flex\", \"gap-2\", \"pointer-events-none\"],\n {\n variants: {\n position: {\n \"bottom-center\": [\n \"bottom-4\",\n \"left-1/2\",\n \"-translate-x-1/2\",\n \"flex-col-reverse\",\n \"items-center\",\n ],\n \"bottom-left\": [\"bottom-4\", \"left-4\", \"flex-col-reverse\", \"items-start\"],\n \"bottom-right\": [\"bottom-4\", \"right-4\", \"flex-col-reverse\", \"items-end\"],\n \"top-center\": [\"top-4\", \"left-1/2\", \"-translate-x-1/2\", \"flex-col\", \"items-center\"],\n \"top-left\": [\"top-4\", \"left-4\", \"flex-col\", \"items-start\"],\n \"top-right\": [\"top-4\", \"right-4\", \"flex-col\", \"items-end\"],\n },\n },\n defaultVariants: { position: \"bottom-center\" },\n }\n);\n\nexport type SnackbarStackContainerVariants = VariantProps<typeof snackbarStackContainerVariants>;\n\n// ─── Base container (surface, shape, layout — no positioning) ─────────────────\n\n/**\n * Snackbar base container variants — structural, surface, and layout classes.\n * Positioning is handled by the stack container (`snackbarStackContainerVariants`)\n * so individual snackbars only carry surface/shape/layout concerns.\n */\nexport const snackbarBaseVariants = cva(\n [\n // Sizing (MD3 spec: 288dp min, 568dp max)\n \"min-w-72\",\n \"max-w-snackbar-max\",\n \"w-max\",\n \"min-h-12\",\n\n // Restore pointer events so hover/focus timer pause works\n \"pointer-events-auto\",\n\n // Surface\n \"bg-inverse-surface\",\n\n // Shape: MD3 extra-small corner = 4dp\n \"rounded-xs\",\n\n // Elevation level 3\n \"shadow-elevation-3\",\n\n // Layout\n \"flex\",\n \"items-center\",\n \"gap-x-1\",\n \"pl-4 pr-2\",\n\n // Typography\n \"text-body-medium\",\n \"text-inverse-on-surface\",\n\n // Transition (properties used by both entry and exit)\n \"transition-[opacity,transform]\",\n \"will-change-[opacity,transform]\",\n ],\n {\n variants: {\n /**\n * Whether the Snackbar has supporting text (two-line layout).\n * Adjusts vertical padding to MD3 spec for two-line configuration.\n */\n twoLine: {\n true: \"py-1\",\n false: \"py-1\",\n },\n },\n defaultVariants: {\n twoLine: false,\n },\n }\n);\n\nexport type SnackbarBaseVariants = VariantProps<typeof snackbarBaseVariants>;\n\n// ─── Position variants ────────────────────────────────────────────────────────\n\n/**\n * Snackbar screen position variants.\n *\n * These classes are now applied to the **stack container** rather than\n * individual snackbars. Kept as a separate export so standalone (non-provider)\n * usage of `SnackbarHeadless` can still apply position classes directly.\n *\n * MD3 default is `bottom-center`.\n */\nexport const snackbarPositionVariants = cva(\"\", {\n variants: {\n position: {\n \"bottom-center\": [\"bottom-4\", \"left-1/2\", \"-translate-x-1/2\"],\n \"bottom-left\": [\"bottom-4\", \"left-4\"],\n \"bottom-right\": [\"bottom-4\", \"right-4\"],\n \"top-center\": [\"top-4\", \"left-1/2\", \"-translate-x-1/2\"],\n \"top-left\": [\"top-4\", \"left-4\"],\n \"top-right\": [\"top-4\", \"right-4\"],\n },\n },\n defaultVariants: {\n position: \"bottom-center\",\n },\n});\n\nexport type SnackbarPositionVariants = VariantProps<typeof snackbarPositionVariants>;\n\n// ─── Animation state classes ──────────────────────────────────────────────────\n\n/**\n * Snackbar animation state variants.\n * Applied by `SnackbarHeadless` based on its internal animation state machine.\n *\n * The `enterDirection` sets the transform-origin for the scale animation so the\n * snackbar appears to grow from the correct viewport edge:\n * - `up` (bottom positions): `origin-bottom` — scales up from the bottom edge\n * - `down` (top positions): `origin-top` — scales up from the top edge\n *\n * MD3 motion spec (Emphasized easing set — appropriate for high-attention UI entries):\n * - `entering`: initial mount state — scaled down (75%) + transparent (no duration)\n * - `visible`: scale-100 + opacity-100 (medium1 / emphasized-decelerate = 250ms) — zoom in\n * - `exiting`: scale-75 + opacity-0 (short4 / standard-accelerate = 200ms) — zoom out\n * - `exited`: fully transparent (removed from DOM by provider)\n *\n * `ease-emphasized-decelerate` (cubic-bezier(0.05, 0.7, 0.1, 1)) is used for entry\n * instead of `ease-standard-decelerate` (cubic-bezier(0, 0, 0, 1)) because the\n * standard-decelerate curve has an infinite initial velocity — it snaps to ~50%\n * progress in the first few milliseconds, making the zoom feel abrupt. The\n * emphasized-decelerate curve has a finite (but high) initial velocity that\n * produces a visible, smooth movement from scale-75 to scale-100.\n */\nexport const snackbarAnimationVariants = cva(\"\", {\n variants: {\n animationState: {\n entering: [\"opacity-0\", \"scale-75\"],\n visible: [\"scale-100\", \"opacity-100\", \"duration-medium1\", \"ease-emphasized-decelerate\"],\n exiting: [\"scale-75\", \"opacity-0\", \"duration-short4\", \"ease-standard-accelerate\"],\n exited: [\"scale-75\", \"opacity-0\", \"duration-short4\", \"ease-standard-accelerate\"],\n },\n enterDirection: {\n up: [\"origin-bottom\"],\n down: [\"origin-top\"],\n },\n },\n defaultVariants: {\n animationState: \"entering\",\n enterDirection: \"up\",\n },\n});\n\nexport type SnackbarAnimationVariants = VariantProps<typeof snackbarAnimationVariants>;\n\n/**\n * Combined container variants (base + position + animation) for convenience.\n * The headless layer uses `snackbarAnimationVariants` directly; this export\n * is kept for consumers who want the full combined class string without the\n * render-prop pattern (e.g. standalone headless usage outside the provider).\n */\nexport const snackbarContainerVariants = cva([...snackbarBaseVariants()], {\n variants: {\n animationState: {\n entering: [\"opacity-0\", \"scale-75\"],\n visible: [\"scale-100\", \"opacity-100\", \"duration-medium1\", \"ease-emphasized-decelerate\"],\n exiting: [\"scale-75\", \"opacity-0\", \"duration-short4\", \"ease-standard-accelerate\"],\n exited: [\"scale-75\", \"opacity-0\", \"duration-short4\", \"ease-standard-accelerate\"],\n },\n enterDirection: {\n up: [\"origin-bottom\"],\n down: [\"origin-top\"],\n },\n position: {\n \"bottom-center\": [\"bottom-4\", \"left-1/2\", \"-translate-x-1/2\"],\n \"bottom-left\": [\"bottom-4\", \"left-4\"],\n \"bottom-right\": [\"bottom-4\", \"right-4\"],\n \"top-center\": [\"top-4\", \"left-1/2\", \"-translate-x-1/2\"],\n \"top-left\": [\"top-4\", \"left-4\"],\n \"top-right\": [\"top-4\", \"right-4\"],\n },\n twoLine: {\n true: \"py-1\",\n false: \"py-1\",\n },\n },\n defaultVariants: {\n animationState: \"entering\",\n enterDirection: \"up\",\n position: \"bottom-center\",\n twoLine: false,\n },\n});\n\nexport type SnackbarContainerVariants = VariantProps<typeof snackbarContainerVariants>;\n\n// ─── Message ─────────────────────────────────────────────────────────────────\n\n/**\n * Message text variants.\n * MD3: body-medium, inverse-on-surface color.\n */\nexport const snackbarMessageVariants = cva([\n \"flex-1\",\n \"text-body-medium\",\n \"text-inverse-on-surface\",\n]);\n\n// ─── Supporting text ─────────────────────────────────────────────────────────\n\n/**\n * Supporting text variants (two-line configuration).\n * Same color role as message text per MD3 spec.\n */\nexport const snackbarSupportingTextVariants = cva([\n \"text-body-medium\",\n \"text-inverse-on-surface\",\n \"opacity-80\",\n]);\n\n// ─── Action button wrapper ────────────────────────────────────────────────────\n\n/**\n * Wrapper applied around the action `Button` to override its color to\n * `inverse-primary` as required by MD3 Snackbar spec.\n */\nexport const snackbarActionVariants = cva([\"shrink-0\", \"text-inverse-primary\"]);\n\n// ─── Close icon button wrapper ────────────────────────────────────────────────\n\n/**\n * Wrapper applied around the close `IconButton` to use `inverse-on-surface`\n * as required by MD3 Snackbar spec.\n */\nexport const snackbarCloseVariants = cva([\"shrink-0\", \"text-inverse-on-surface\"]);\n\n// ─── Text+action layout ───────────────────────────────────────────────────────\n\n/**\n * Inner content column (message + optional supporting text).\n */\nexport const snackbarContentVariants = cva([\"flex\", \"flex-col\", \"flex-1\", \"min-w-0 py-2 pr-2\"]);\n\n// ─── Initial hidden state ─────────────────────────────────────────────────────\n\n/**\n * Classes applied before the enter animation begins (component just mounted).\n * Scaled down and transparent — the zoom-in entry starts from this state.\n */\nexport const snackbarInitialVariants = cva([\"scale-75\", \"opacity-0\"]);\n\n// ─── Position → direction helper ─────────────────────────────────────────────\n\n/**\n * Derives the enter animation direction from the Snackbar position.\n * Bottom positions slide up; top positions slide down.\n */\nexport function getEnterDirection(position: string): \"up\" | \"down\" {\n return position.startsWith(\"top\") ? \"down\" : \"up\";\n}\n","\"use client\";\n\nimport { forwardRef } from \"react\";\nimport { Button } from \"../Button\";\nimport { IconButton } from \"../IconButton\";\nimport { cn } from \"../../utils/cn\";\nimport { SnackbarHeadless } from \"./SnackbarHeadless\";\nimport {\n snackbarAnimationVariants,\n snackbarBaseVariants,\n snackbarContentVariants,\n snackbarMessageVariants,\n snackbarSupportingTextVariants,\n snackbarActionVariants,\n snackbarCloseVariants,\n getEnterDirection,\n} from \"./Snackbar.variants\";\nimport type { SnackbarAnimationState } from \"./SnackbarHeadless\";\nimport type { SnackbarPosition, SnackbarProps } from \"./Snackbar.types\";\n\n/**\n * Close icon SVG (24dp, MD3 standard close symbol).\n * Inline to avoid any icon library dependency.\n */\nfunction CloseIcon(): JSX.Element {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\" />\n </svg>\n );\n}\n\n/**\n * `Snackbar` — Layer 3 MD3 Styled Component.\n *\n * Renders one of four MD3 Snackbar content configurations:\n * 1. Single-line message only\n * 2. Two-line message + `supportingText`\n * 3. Single-line with text `action` button (styled `Button variant=\"text\"` with\n * `inverse-primary` color per MD3 spec)\n * 4. Single-line with close icon (or combined with action)\n *\n * Uses `SnackbarHeadless` for all behavioral concerns (ARIA live region,\n * auto-dismiss timer with pause/resume, animation state machine) and CVA\n * variants for MD3-compliant visual styling.\n *\n * For typical app usage, render inside `SnackbarProvider` and trigger via\n * the `useSnackbar` hook. For declarative/test usage, it can be rendered\n * standalone.\n *\n * @example\n * ```tsx\n * // Imperative via hook (typical)\n * const { showSnackbar } = useSnackbar();\n * showSnackbar({ message: \"File deleted\", action: { label: \"Undo\", onAction: handleUndo } });\n *\n * // Declarative standalone\n * <SnackbarProvider>\n * <Snackbar message=\"Saved\" severity=\"default\" showClose onClose={() => {}} />\n * </SnackbarProvider>\n * ```\n */\nexport const Snackbar = forwardRef<HTMLDivElement, SnackbarProps>(function Snackbar(\n {\n message,\n supportingText,\n action,\n showClose = false,\n duration = 4000,\n severity = \"default\",\n position = \"bottom-center\",\n onClose,\n className,\n },\n ref\n) {\n const isTwoLine = Boolean(supportingText);\n\n // Base structural classes only — positioning is handled by the stack container\n // in SnackbarProvider. pointer-events-auto is included in snackbarBaseVariants.\n const baseClassName = cn(snackbarBaseVariants({ twoLine: isTwoLine }), className);\n\n return (\n <SnackbarHeadless\n ref={ref}\n message={message}\n {...(supportingText !== undefined && { supportingText })}\n {...(action !== undefined && { action })}\n showClose={showClose}\n duration={duration}\n severity={severity}\n position={position}\n {...(onClose !== undefined && { onClose })}\n className={baseClassName}\n getAnimationClassName={(state: SnackbarAnimationState, pos: SnackbarPosition) =>\n snackbarAnimationVariants({ animationState: state, enterDirection: getEnterDirection(pos) })\n }\n >\n {({ onClose: triggerClose }) => (\n <>\n {/* Content column: message + optional supporting text */}\n <div className={snackbarContentVariants()}>\n <span className={snackbarMessageVariants()}>{message}</span>\n {supportingText && (\n <span className={snackbarSupportingTextVariants()}>{supportingText}</span>\n )}\n </div>\n\n {/* Action button — MD3: text variant with inverse-primary color */}\n {action && (\n <span className={snackbarActionVariants()}>\n <Button\n variant=\"text\"\n onPress={action.onAction}\n className=\"text-inverse-primary hover:text-inverse-primary\"\n >\n {action.label}\n </Button>\n </span>\n )}\n\n {/* Close icon button — MD3: standard icon button with inverse-on-surface */}\n {showClose && (\n <span className={snackbarCloseVariants()}>\n <IconButton\n variant=\"standard\"\n aria-label=\"Close\"\n onPress={triggerClose}\n className=\"text-inverse-on-surface hover:text-inverse-on-surface\"\n >\n <CloseIcon />\n </IconButton>\n </span>\n )}\n </>\n )}\n </SnackbarHeadless>\n );\n});\n\nSnackbar.displayName = \"Snackbar\";\n","\"use client\";\n\nimport {\n createContext,\n useCallback,\n useContext,\n useId,\n useMemo,\n useRef,\n useState,\n type JSX,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { Snackbar } from \"./Snackbar\";\nimport { snackbarStackContainerVariants } from \"./Snackbar.variants\";\nimport type {\n SnackbarContextValue,\n SnackbarItem,\n SnackbarPosition,\n SnackbarProps,\n SnackbarProviderProps,\n} from \"./Snackbar.types\";\n\n// ─── Context ─────────────────────────────────────────────────────────────────\n\n/**\n * React context for the Snackbar queue.\n * Consumed via the `useSnackbar` hook.\n */\nexport const SnackbarContext = createContext<SnackbarContextValue | null>(null);\n\n// ─── Hook ────────────────────────────────────────────────────────────────────\n\n/**\n * `useSnackbar` — imperative API for triggering Snackbars.\n *\n * Must be called inside a component that is a descendant of `SnackbarProvider`.\n * Throws a descriptive error in development if used outside the provider.\n *\n * @example\n * ```tsx\n * const { showSnackbar } = useSnackbar();\n *\n * // Single-line\n * showSnackbar({ message: \"File deleted\" });\n *\n * // With action\n * showSnackbar({\n * message: \"File deleted\",\n * action: { label: \"Undo\", onAction: () => handleUndo() },\n * });\n *\n * // Error severity (assertive announcement)\n * showSnackbar({ message: \"Upload failed\", severity: \"error\" });\n * ```\n */\nexport function useSnackbar(): SnackbarContextValue {\n const ctx = useContext(SnackbarContext);\n if (!ctx) {\n throw new Error(\n \"[Snackbar] useSnackbar must be used inside <SnackbarProvider>. \" +\n \"Wrap your application (or Storybook decorator) with <SnackbarProvider>.\"\n );\n }\n return ctx;\n}\n\n// ─── Provider ────────────────────────────────────────────────────────────────\n\n/**\n * `SnackbarProvider` — context provider, queue manager, and portal host.\n *\n * Wrap your application (or Storybook preview) with this component to enable\n * the Snackbar stack and portal rendering.\n *\n * - Multiple `showSnackbar` calls are displayed simultaneously in a vertical\n * stack, grouped by their `position` prop.\n * - Each position group is rendered in its own fixed container via `createPortal`\n * into `document.body`.\n * - Bottom positions stack upward (newest at bottom); top positions stack\n * downward (newest at top).\n * - The `maxVisible` prop caps how many snackbars can be visible at once per\n * position group. Snackbars beyond the cap are queued and shown as existing\n * ones are dismissed.\n *\n * @example\n * ```tsx\n * // Application root\n * <SnackbarProvider>\n * <App />\n * </SnackbarProvider>\n *\n * // With custom cap (default is 5)\n * <SnackbarProvider maxVisible={3}>\n * <App />\n * </SnackbarProvider>\n *\n * // Storybook preview.tsx decorator\n * export const decorators = [\n * (Story) => (\n * <SnackbarProvider>\n * <Story />\n * </SnackbarProvider>\n * ),\n * ];\n * ```\n */\nexport function SnackbarProvider({ children, maxVisible = 5 }: SnackbarProviderProps): JSX.Element {\n const [queue, setQueue] = useState<SnackbarItem[]>([]);\n const counterRef = useRef<number>(0);\n const baseId = useId();\n\n /**\n * Enqueue a new Snackbar. Returns the assigned id.\n * The snackbar is immediately visible if the position group has fewer than\n * `maxVisible` items currently displayed.\n */\n const showSnackbar = useCallback(\n (options: SnackbarProps): string => {\n const id = `${baseId}-snackbar-${++counterRef.current}`;\n setQueue((prev) => [...prev, { ...options, id }]);\n return id;\n },\n [baseId]\n );\n\n /**\n * Imperatively dismiss the oldest snackbar across all position groups.\n * The snackbar's own exit animation plays before it is removed.\n */\n const closeSnackbar = useCallback(() => {\n setQueue((prev) => {\n if (prev.length === 0) return prev;\n return prev.slice(1);\n });\n }, []);\n\n /**\n * Removes a specific snackbar by id after its exit animation completes.\n */\n const removeById = useCallback((id: string) => {\n setQueue((prev) => prev.filter((item) => item.id !== id));\n }, []);\n\n const contextValue: SnackbarContextValue = { showSnackbar, closeSnackbar };\n\n // Group visible queue items by position, respecting maxVisible per group.\n const positionGroups = useMemo(() => {\n const groups = new Map<SnackbarPosition, SnackbarItem[]>();\n const countByPosition = new Map<SnackbarPosition, number>();\n\n for (const item of queue) {\n const pos: SnackbarPosition = item.position ?? \"bottom-center\";\n const count = countByPosition.get(pos) ?? 0;\n if (count < maxVisible) {\n const existing = groups.get(pos) ?? [];\n groups.set(pos, [...existing, item]);\n countByPosition.set(pos, count + 1);\n }\n }\n\n return groups;\n }, [queue, maxVisible]);\n\n return (\n <SnackbarContext.Provider value={contextValue}>\n {children}\n {typeof document !== \"undefined\" &&\n createPortal(\n <>\n {Array.from(positionGroups.entries()).map(([position, items]) => (\n <div key={position} className={snackbarStackContainerVariants({ position })}>\n {items.map((item) => (\n <Snackbar\n key={item.id}\n message={item.message}\n {...(item.supportingText !== undefined && {\n supportingText: item.supportingText,\n })}\n {...(item.action !== undefined && { action: item.action })}\n {...(item.showClose !== undefined && { showClose: item.showClose })}\n {...(item.duration !== undefined && { duration: item.duration })}\n {...(item.severity !== undefined && { severity: item.severity })}\n {...(item.position !== undefined && { position: item.position })}\n {...(item.className !== undefined && { className: item.className })}\n onClose={() => {\n item.onClose?.();\n removeById(item.id);\n }}\n />\n ))}\n </div>\n ))}\n </>,\n document.body\n )}\n </SnackbarContext.Provider>\n );\n}\n","\"use client\";\n\nimport {\n createContext,\n forwardRef,\n useCallback,\n useContext,\n useEffect,\n useId,\n useRef,\n useState,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport type React from \"react\";\nimport { useDialog, useOverlay, usePreventScroll, FocusScope } from \"react-aria\";\nimport { useOverlayTriggerState } from \"react-stately\";\nimport { mergeProps } from \"@react-aria/utils\";\nimport { cn } from \"../../utils/cn\";\nimport type {\n DialogAnimationState,\n DialogContextValue,\n DialogHeadlessProps,\n DialogVariant,\n} from \"./Dialog.types\";\n\n// ─── Context ──────────────────────────────────────────────────────────────────\n\n/**\n * Context shared between `DialogHeadless` and slot sub-components\n * (`DialogHeadline`, `DialogContent`, `DialogActions`).\n *\n * Provides stable IDs for aria-labelledby / aria-describedby wiring,\n * the close callback, and the active variant.\n *\n * @internal\n */\nexport const DialogContext = createContext<DialogContextValue | null>(null);\n\n/**\n * Hook to consume `DialogContext` inside dialog slot sub-components.\n * Throws a descriptive error if used outside a `DialogHeadless` tree.\n *\n * @internal\n */\nexport function useDialogContext(): DialogContextValue {\n const ctx = useContext(DialogContext);\n if (ctx === null) {\n throw new Error(\n \"[Dialog] DialogHeadline, DialogContent, and DialogActions must be rendered \" +\n \"inside a <Dialog> or <DialogHeadless> component.\"\n );\n }\n return ctx;\n}\n\n// ─── DialogPanel (internal) ───────────────────────────────────────────────────\n\n/**\n * Inner dialog panel — wires React Aria hooks (`useDialog`, `useOverlay`,\n * `usePreventScroll`) and renders the accessible dialog element with the\n * centering wrapper.\n *\n * DOM structure:\n * ```\n * <div> (centering / positioning wrapper, z-50)\n * <div role=\"dialog\" aria-modal> (panel — className, animation, data attrs)\n * {children}\n * </div>\n * </div>\n * ```\n *\n * This allows `screen.getByRole(\"dialog\")` to directly return the panel\n * (with `data-animation-state` and `data-variant` for test assertions).\n *\n * @internal\n */\ninterface DialogPanelProps {\n ariaLabel: string | undefined;\n headlineId: string;\n contentId: string;\n onClose: () => void;\n onTransitionEnd: () => void;\n variant: DialogVariant;\n isDismissable: boolean;\n wrapperClassName: string;\n className: string | undefined;\n animationState: DialogAnimationState;\n getAnimationClassName: ((state: DialogAnimationState) => string) | undefined;\n children: React.ReactNode;\n}\n\nconst DialogPanel = ({\n ariaLabel,\n headlineId,\n contentId,\n onClose,\n onTransitionEnd,\n variant,\n isDismissable,\n wrapperClassName,\n className,\n animationState,\n getAnimationClassName,\n children,\n}: DialogPanelProps): React.ReactElement => {\n const panelRef = useRef<HTMLDivElement>(null);\n\n // Lock body scroll while dialog is open\n usePreventScroll();\n\n // useDialog: applies role=\"dialog\", aria-modal=\"true\", aria-labelledby, aria-describedby\n const { dialogProps } = useDialog(\n {\n ...(ariaLabel ? { \"aria-label\": ariaLabel } : {}),\n \"aria-labelledby\": headlineId,\n \"aria-describedby\": contentId,\n },\n panelRef\n );\n\n // useOverlay: handles Escape key dismissal and outside-click dismissal\n const { overlayProps } = useOverlay(\n {\n isOpen: true,\n onClose,\n isDismissable,\n shouldCloseOnBlur: false,\n },\n panelRef\n );\n\n // Merge animation classes onto the panel element\n const panelClassName = cn(className, getAnimationClassName?.(animationState));\n\n return (\n // Centering/positioning wrapper — structural only, no ARIA role\n <div className={wrapperClassName}>\n {/* Panel: semantic dialog element with React Aria hooks, animation, data attrs */}\n <div\n {...mergeProps(overlayProps, dialogProps)}\n ref={panelRef}\n aria-modal=\"true\"\n className={panelClassName}\n data-animation-state={animationState}\n data-variant={variant}\n onTransitionEnd={onTransitionEnd}\n >\n {children}\n </div>\n </div>\n );\n};\n\nDialogPanel.displayName = \"DialogPanel\";\n\n// ─── DialogHeadless ───────────────────────────────────────────────────────────\n\n/**\n * `DialogHeadless` — Layer 2 headless primitive.\n *\n * Provides all MD3 Dialog behavior and ARIA semantics without any visual styling:\n *\n * - **Portal rendering**: dialog and scrim render in `document.body` via\n * `createPortal` to avoid stacking context issues.\n * - **Open/close state**: via `useOverlayTriggerState` (supports controlled\n * `open` + `onOpenChange` and uncontrolled `defaultOpen`).\n * - **Scroll lock**: `usePreventScroll` locks body scroll while open.\n * - **Focus trap**: `FocusScope` with `contain`, `restoreFocus`, `autoFocus`.\n * - **Dismiss behavior**: `useOverlay` handles Escape key and outside click.\n * Basic variant is dismissable (Escape + outside click);\n * Full-screen variant is Escape-dismissable only (no scrim click) per MD3 spec.\n * - **Animation state machine**: `entering → visible → exiting → exited`\n * mirrors the Snackbar animation pattern.\n * - **ARIA wiring**: `DialogContext` provides stable IDs for `aria-labelledby`\n * and `aria-describedby`, consumed by slot sub-components.\n *\n * React Aria hooks used:\n * - `useDialog` — `role=\"dialog\"`, `aria-modal`, `aria-labelledby`, `aria-describedby`\n * - `useOverlay` — Escape key + outside-click dismissal\n * - `usePreventScroll` — body scroll lock\n * - `FocusScope` — focus trap + restoreFocus on close\n * - `useOverlayTriggerState` — open/close state management\n *\n * @example\n * ```tsx\n * // Controlled basic dialog\n * <DialogHeadless\n * variant=\"basic\"\n * open={open}\n * onOpenChange={setOpen}\n * className={cn(dialogWrapperVariants({ variant: 'basic' }), dialogPanelVariants({ variant: 'basic' }))}\n * scrimClassName={dialogScrimVariants()}\n * getAnimationClassName={(state) =>\n * dialogAnimationVariants({ animationState: state, variant: 'basic' })\n * }\n * >\n * <DialogHeadline>Confirm?</DialogHeadline>\n * <DialogContent>This action cannot be undone.</DialogContent>\n * <DialogActions>\n * <Button variant=\"text\" onPress={() => setOpen(false)}>Cancel</Button>\n * <Button variant=\"filled\" onPress={handleDelete}>Delete</Button>\n * </DialogActions>\n * </DialogHeadless>\n * ```\n */\nexport const DialogHeadless = forwardRef<HTMLDivElement, DialogHeadlessProps>(\n function DialogHeadless(\n {\n variant = \"basic\",\n open,\n defaultOpen = false,\n onOpenChange,\n \"aria-label\": ariaLabel,\n children,\n className,\n scrimClassName,\n getAnimationClassName,\n },\n _ref\n ) {\n // ── Open/close state ─────────────────────────────────────────────────────\n\n const state = useOverlayTriggerState({\n ...(open !== undefined ? { isOpen: open } : {}),\n ...(defaultOpen !== undefined ? { defaultOpen } : {}),\n ...(onOpenChange !== undefined ? { onOpenChange } : {}),\n });\n\n const isOpen = state.isOpen;\n\n const close = useCallback(() => {\n state.close();\n }, [state]);\n\n // ── Animation state machine ───────────────────────────────────────────────\n\n const [animationState, setAnimationState] = useState<DialogAnimationState>(\"exited\");\n // Guard against calling state updates after unmount / multiple times\n const closedRef = useRef<boolean>(false);\n // Fallback timer for exit animation in case onTransitionEnd doesn't fire\n const exitFallbackRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n // When isOpen becomes true → start entry animation cycle\n useEffect(() => {\n if (!isOpen) return;\n\n closedRef.current = false;\n setAnimationState(\"entering\");\n\n // Zero-delay timer ensures \"entering\" state is rendered (allowing CSS\n // transition initial values) before transitioning to \"visible\".\n const id = setTimeout(() => {\n setAnimationState(\"visible\");\n }, 0);\n\n return () => clearTimeout(id);\n }, [isOpen]);\n\n // When isOpen becomes false while visible → start exit animation cycle\n useEffect(() => {\n if (isOpen) return;\n if (animationState === \"exited\" || animationState === \"entering\") return;\n\n if (animationState === \"visible\") {\n setAnimationState(\"exiting\");\n\n // Fallback: advance to exited if CSS transition doesn't fire\n exitFallbackRef.current = setTimeout(() => {\n if (!closedRef.current) {\n closedRef.current = true;\n setAnimationState(\"exited\");\n }\n }, 150);\n }\n }, [isOpen, animationState]);\n\n // Cleanup on unmount\n useEffect(\n () => () => {\n if (exitFallbackRef.current !== null) {\n clearTimeout(exitFallbackRef.current);\n }\n },\n []\n );\n\n const handleTransitionEnd = useCallback(() => {\n if (animationState === \"exiting\" && !closedRef.current) {\n if (exitFallbackRef.current !== null) {\n clearTimeout(exitFallbackRef.current);\n exitFallbackRef.current = null;\n }\n closedRef.current = true;\n setAnimationState(\"exited\");\n }\n }, [animationState]);\n\n // ── ARIA ID coordination ──────────────────────────────────────────────────\n\n const baseId = useId();\n const headlineId = `${baseId}-dialog-headline`;\n const contentId = `${baseId}-dialog-content`;\n\n const contextValue: DialogContextValue = {\n headlineId,\n contentId,\n close,\n variant,\n };\n\n // ── Scrim dismissal ───────────────────────────────────────────────────────\n\n // Basic variant: scrim click closes dialog. Full-screen: scrim is inert.\n const handleScrimClick = useCallback(() => {\n if (variant === \"basic\") {\n close();\n }\n }, [variant, close]);\n\n // ── Portal gate ───────────────────────────────────────────────────────────\n\n // Do not render portal until open, and remove once animation is fully exited\n if (!isOpen && animationState === \"exited\") {\n return null;\n }\n\n // ── Portal content ────────────────────────────────────────────────────────\n\n const content = (\n <DialogContext.Provider value={contextValue}>\n {/* Scrim overlay — click closes for basic, inert for fullscreen */}\n <div\n data-testid=\"dialog-scrim\"\n className={scrimClassName}\n onClick={handleScrimClick}\n aria-hidden=\"true\"\n />\n\n {/* FocusScope: traps focus, restores focus to trigger on close, auto-focuses first element */}\n <FocusScope contain restoreFocus autoFocus>\n <DialogPanel\n ariaLabel={ariaLabel}\n headlineId={headlineId}\n contentId={contentId}\n onClose={close}\n onTransitionEnd={handleTransitionEnd}\n variant={variant}\n isDismissable={variant === \"basic\"}\n wrapperClassName={\n variant === \"basic\"\n ? \"fixed inset-0 z-50 flex items-center justify-center px-4\"\n : \"fixed inset-0 z-50\"\n }\n className={className}\n animationState={animationState}\n getAnimationClassName={getAnimationClassName}\n >\n {children}\n </DialogPanel>\n </FocusScope>\n </DialogContext.Provider>\n );\n\n if (typeof document === \"undefined\") return null;\n\n return createPortal(content, document.body) as React.ReactElement;\n }\n);\n\nDialogHeadless.displayName = \"DialogHeadless\";\n","import { cva, type VariantProps } from \"class-variance-authority\";\n\n/**\n * Material Design 3 Dialog Variants (CVA)\n *\n * Type-safe variant management using Tailwind CSS classes mapped to MD3 tokens.\n *\n * MD3 Specifications:\n * - Basic surface: surface-container-high\n * - Elevation: level-3 → shadow-elevation-3\n * - Shape (Basic): extra-large (28dp) → rounded-xl\n * - Min width (Basic): 280dp → min-w-70\n * - Max width (Basic): 560dp → max-w-dialog\n * - Scrim: bg-scrim at opacity-32\n * - Headline: text-headline-small, text-on-surface\n * - Body: text-body-medium, text-on-surface-variant\n * - Action row: right-aligned, gap-2\n * - Entry motion (Basic): scale + fade, medium4 (400ms) + ease-emphasized-decelerate\n * - Exit motion (Basic): fade, short2 (100ms) + ease-emphasized-accelerate\n * - Entry motion (Fullscreen): slide-up, medium4 (400ms) + ease-emphasized-decelerate\n * - Exit motion (Fullscreen): slide-down, short2 (100ms) + ease-emphasized-accelerate\n */\n\n// ─── Scrim overlay ─────────────────────────────────────────────────────────────\n\n/**\n * Scrim overlay variants — matches MD3 spec and Drawer scrim pattern.\n * Full-screen variant uses the same scrim but onClick is a no-op.\n */\nexport const dialogScrimVariants = cva([\n \"fixed\",\n \"inset-0\",\n \"z-40\",\n \"bg-scrim\",\n \"opacity-32\",\n \"transition-opacity\",\n \"duration-medium2\",\n \"ease-standard\",\n]);\n\nexport type DialogScrimVariants = VariantProps<typeof dialogScrimVariants>;\n\n// ─── Panel container ────────────────────────────────────────────────────────────\n\n/**\n * Dialog panel container variants.\n *\n * - `basic`: floating card with rounded corners, elevation, max-width constraint.\n * - `fullscreen`: full viewport coverage, no corners, no max-width.\n *\n * Positioned and centered by the portal wrapper; `z-50` sits above the scrim.\n */\nexport const dialogPanelVariants = cva(\n [\n // Stacking above scrim\n \"z-50\",\n\n // Surface\n \"bg-surface-container-high\",\n\n // Flex column layout for slots\n \"flex\",\n \"flex-col\",\n\n // Transition for animation state changes\n \"transition-[opacity,transform]\",\n \"will-change-[opacity,transform]\",\n ],\n {\n variants: {\n variant: {\n basic: [\n // Shape: MD3 extra-large = 28dp\n \"rounded-xl\",\n // Elevation level 3\n \"shadow-elevation-3\",\n // Width constraints per MD3 spec (280dp min, 560dp max)\n \"min-w-70\",\n \"max-w-dialog-max\",\n \"w-full\",\n // Internal spacing\n \"pt-6\",\n \"pb-3\",\n \"px-6\",\n // Positioned in viewport center\n \"relative\",\n ],\n fullscreen: [\n // Full viewport\n \"w-full\",\n \"h-full\",\n // No rounded corners on fullscreen\n \"rounded-none\",\n // No elevation shadow on fullscreen\n \"shadow-none\",\n // Positioned to fill portal\n \"relative\",\n ],\n },\n },\n defaultVariants: {\n variant: \"basic\",\n },\n }\n);\n\nexport type DialogPanelVariants = VariantProps<typeof dialogPanelVariants>;\n\n// ─── Portal wrapper ─────────────────────────────────────────────────────────────\n\n/**\n * Wrapper that centers the basic dialog in the viewport.\n * Not applied to the fullscreen variant (which fills the viewport directly).\n */\nexport const dialogWrapperVariants = cva([], {\n variants: {\n variant: {\n basic: [\"fixed\", \"inset-0\", \"z-50\", \"flex\", \"items-center\", \"justify-center\", \"px-4\"],\n fullscreen: [\"fixed\", \"inset-0\", \"z-50\"],\n },\n },\n defaultVariants: {\n variant: \"basic\",\n },\n});\n\nexport type DialogWrapperVariants = VariantProps<typeof dialogWrapperVariants>;\n\n// ─── Animation state classes ────────────────────────────────────────────────────\n\n/**\n * Animation state variants — applied by `DialogHeadless` based on its\n * internal animation state machine. Variant-specific to match MD3 motion spec:\n *\n * Basic: scale + fade (entry) / fade (exit)\n * Fullscreen: slide-up (entry) / slide-down (exit)\n */\nexport const dialogAnimationVariants = cva(\"\", {\n variants: {\n animationState: {\n entering: [],\n visible: [],\n exiting: [],\n exited: [],\n },\n variant: {\n basic: [],\n fullscreen: [],\n },\n },\n compoundVariants: [\n // Basic: entering — start scaled down + transparent\n {\n animationState: \"entering\",\n variant: \"basic\",\n className: [\"scale-90\", \"opacity-0\"],\n },\n // Basic: visible — scale to full + fade in\n {\n animationState: \"visible\",\n variant: \"basic\",\n className: [\"scale-100\", \"opacity-100\", \"duration-medium4\", \"ease-emphasized-decelerate\"],\n },\n // Basic: exiting — fade out (scale stays at 1)\n {\n animationState: \"exiting\",\n variant: \"basic\",\n className: [\"scale-100\", \"opacity-0\", \"duration-short2\", \"ease-emphasized-accelerate\"],\n },\n // Basic: exited — fully transparent\n {\n animationState: \"exited\",\n variant: \"basic\",\n className: [\"scale-100\", \"opacity-0\"],\n },\n // Fullscreen: entering — start below viewport + transparent\n {\n animationState: \"entering\",\n variant: \"fullscreen\",\n className: [\"translate-y-full\", \"opacity-0\"],\n },\n // Fullscreen: visible — slide up + fade in\n {\n animationState: \"visible\",\n variant: \"fullscreen\",\n className: [\"translate-y-0\", \"opacity-100\", \"duration-medium4\", \"ease-emphasized-decelerate\"],\n },\n // Fullscreen: exiting — slide down + fade out\n {\n animationState: \"exiting\",\n variant: \"fullscreen\",\n className: [\"translate-y-full\", \"opacity-0\", \"duration-short2\", \"ease-emphasized-accelerate\"],\n },\n // Fullscreen: exited — fully off-screen\n {\n animationState: \"exited\",\n variant: \"fullscreen\",\n className: [\"translate-y-full\", \"opacity-0\"],\n },\n ],\n defaultVariants: {\n animationState: \"entering\",\n variant: \"basic\",\n },\n});\n\nexport type DialogAnimationVariants = VariantProps<typeof dialogAnimationVariants>;\n\n// ─── DialogHeadline ─────────────────────────────────────────────────────────────\n\n/**\n * Headline element variants.\n * MD3: text-headline-small, text-on-surface.\n */\nexport const dialogHeadlineVariants = cva([\"text-headline-small\", \"text-on-surface\"], {\n variants: {\n variant: {\n basic: [\"mb-4\"],\n fullscreen: [\n // Top app bar row in fullscreen: flex, items-center, gap\n \"flex\",\n \"items-center\",\n \"gap-4\",\n \"px-4\",\n \"h-14\",\n \"shrink-0\",\n \"border-b\",\n \"border-outline-variant\",\n ],\n },\n },\n defaultVariants: {\n variant: \"basic\",\n },\n});\n\nexport type DialogHeadlineVariants = VariantProps<typeof dialogHeadlineVariants>;\n\n/**\n * Headline text inside the fullscreen top app bar row.\n */\nexport const dialogHeadlineTitleVariants = cva([\n \"flex-1\",\n \"text-headline-small\",\n \"text-on-surface\",\n \"truncate\",\n]);\n\n// ─── DialogContent ──────────────────────────────────────────────────────────────\n\n/**\n * Scrollable body content variants.\n * MD3: text-body-medium, text-on-surface-variant, scrollable.\n */\nexport const dialogContentVariants = cva(\n [\"text-body-medium\", \"text-on-surface-variant\", \"overflow-y-auto\", \"flex-1\"],\n {\n variants: {\n variant: {\n basic: [\"mb-6\"],\n fullscreen: [\"px-6\", \"py-4\"],\n },\n },\n defaultVariants: {\n variant: \"basic\",\n },\n }\n);\n\nexport type DialogContentVariants = VariantProps<typeof dialogContentVariants>;\n\n// ─── DialogActions ──────────────────────────────────────────────────────────────\n\n/**\n * Action button row variants.\n * MD3: right-aligned flex row with gap-2, padding-top per spec.\n */\nexport const dialogActionsVariants = cva([\n \"flex\",\n \"items-center\",\n \"justify-end\",\n \"gap-2\",\n \"pt-3\",\n \"shrink-0\",\n]);\n\nexport type DialogActionsVariants = VariantProps<typeof dialogActionsVariants>;\n","\"use client\";\n\nimport { forwardRef } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { DialogHeadless } from \"./DialogHeadless\";\nimport {\n dialogPanelVariants,\n dialogScrimVariants,\n dialogAnimationVariants,\n} from \"./Dialog.variants\";\nimport type { DialogAnimationState } from \"./Dialog.types\";\nimport type { DialogProps } from \"./Dialog.types\";\n\n/**\n * `Dialog` — Layer 3 MD3 Styled Dialog Component.\n *\n * Supports two structural variants per MD3 spec, with a composable slot-based\n * API via `DialogHeadline`, `DialogContent`, and `DialogActions`:\n *\n * **Basic** (default):\n * - Floating card: `bg-surface-container-high`, `rounded-xl`, `shadow-elevation-3`\n * - Centered in viewport (min 280dp, max 560dp width)\n * - Scale + fade entry animation (`duration-medium4 / ease-emphasized-decelerate`)\n * - Fade exit animation (`duration-short2 / ease-emphasized-accelerate`)\n * - Closes on scrim click or Escape key\n *\n * **Full-screen**:\n * - Full viewport coverage — suited for mobile and complex forms\n * - No rounded corners, no elevation shadow\n * - Slide-up entry / slide-down exit animation\n * - Does NOT close on scrim click per MD3 spec (only via Escape or close button)\n * - Headline replaced by top app bar row (close icon + confirm action)\n *\n * Both variants:\n * - `role=\"dialog\"` + `aria-modal=\"true\"` (React Aria `useDialog`)\n * - `aria-labelledby` pointing to `DialogHeadline` id\n * - `aria-describedby` pointing to `DialogContent` id\n * - Focus trap active while open (`FocusScope`)\n * - Focus returns to trigger element on close (`FocusScope restoreFocus`)\n * - Body scroll locked while open (`usePreventScroll`)\n * - Escape key always closes the dialog\n * - Portal rendered to `document.body`\n *\n * @example\n * ```tsx\n * // Basic dialog — controlled\n * function DeleteDialog() {\n * const [open, setOpen] = useState(false);\n *\n * return (\n * <>\n * <Button onPress={() => setOpen(true)}>Delete file</Button>\n * <Dialog open={open} onOpenChange={setOpen}>\n * <DialogHeadline>Permanently delete?</DialogHeadline>\n * <DialogContent>\n * This action cannot be undone. The file and all associated data\n * will be permanently removed.\n * </DialogContent>\n * <DialogActions>\n * <Button variant=\"text\" onPress={() => setOpen(false)}>Cancel</Button>\n * <Button variant=\"filled\" onPress={handleDelete}>Delete</Button>\n * </DialogActions>\n * </Dialog>\n * </>\n * );\n * }\n *\n * // Full-screen dialog — mobile form flow\n * function NewEventDialog() {\n * const [open, setOpen] = useState(false);\n *\n * return (\n * <>\n * <Button onPress={() => setOpen(true)}>New event</Button>\n * <Dialog variant=\"fullscreen\" open={open} onOpenChange={setOpen}>\n * <DialogHeadline\n * closeButton={\n * <IconButton aria-label=\"Close\" onPress={() => setOpen(false)}>\n * <CloseIcon />\n * </IconButton>\n * }\n * confirmButton={\n * <Button variant=\"text\" onPress={handleSave}>Save</Button>\n * }\n * >\n * New event\n * </DialogHeadline>\n * <DialogContent>\n * <TextField label=\"Event name\" />\n * <TextField label=\"Date\" type=\"date\" />\n * </DialogContent>\n * </Dialog>\n * </>\n * );\n * }\n * ```\n *\n * @see https://m3.material.io/components/dialogs/overview\n * @see https://m3.material.io/components/dialogs/specs\n */\nexport const Dialog = forwardRef<HTMLDivElement, DialogProps>(function Dialog(\n {\n variant = \"basic\",\n open,\n defaultOpen = false,\n onOpenChange,\n \"aria-label\": ariaLabel,\n children,\n className,\n },\n _ref\n) {\n // Build panel class: structural + visual styles from CVA\n const panelClassName = cn(dialogPanelVariants({ variant }), className);\n\n // Scrim class shared between variants\n const scrimClass = dialogScrimVariants();\n\n return (\n <DialogHeadless\n variant={variant}\n {...(open !== undefined ? { open } : {})}\n {...(defaultOpen !== undefined ? { defaultOpen } : {})}\n {...(onOpenChange !== undefined ? { onOpenChange } : {})}\n {...(ariaLabel ? { \"aria-label\": ariaLabel } : {})}\n className={panelClassName}\n scrimClassName={scrimClass}\n getAnimationClassName={(state: DialogAnimationState) =>\n dialogAnimationVariants({ animationState: state, variant })\n }\n >\n {children}\n </DialogHeadless>\n );\n});\n\nDialog.displayName = \"Dialog\";\n","\"use client\";\n\nimport { forwardRef } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { useDialogContext } from \"./DialogHeadless\";\nimport { dialogHeadlineVariants, dialogHeadlineTitleVariants } from \"./Dialog.variants\";\nimport type { DialogHeadlineProps } from \"./Dialog.types\";\n\n/**\n * `DialogHeadline` — Headline slot sub-component (Layer 3).\n *\n * Renders as an `<h2>` element and registers its `id` with the parent\n * `DialogContext` so the dialog panel can wire `aria-labelledby` correctly.\n *\n * For the `fullscreen` variant, the headline renders as a top app bar row\n * containing optional `closeButton` (leading icon button) and `confirmButton`\n * (trailing text action) per MD3 Full-screen Dialog spec.\n *\n * Must be rendered inside a `<Dialog>` or `<DialogHeadless>` component.\n *\n * @example\n * ```tsx\n * // Basic variant\n * <Dialog open onOpenChange={setOpen}>\n * <DialogHeadline>Delete file?</DialogHeadline>\n * ...\n * </Dialog>\n *\n * // Full-screen variant with app bar controls\n * <Dialog variant=\"fullscreen\" open onOpenChange={setOpen}>\n * <DialogHeadline\n * closeButton={\n * <IconButton aria-label=\"Close\" onPress={() => setOpen(false)}>\n * <CloseIcon />\n * </IconButton>\n * }\n * confirmButton={\n * <Button variant=\"text\" onPress={handleSave}>Save</Button>\n * }\n * >\n * New event\n * </DialogHeadline>\n * ...\n * </Dialog>\n * ```\n */\nexport const DialogHeadline = forwardRef<HTMLHeadingElement, DialogHeadlineProps>(\n function DialogHeadline({ children, className, closeButton, confirmButton }, ref) {\n const { headlineId, variant } = useDialogContext();\n\n if (variant === \"fullscreen\") {\n return (\n // Top app bar row for fullscreen variant\n <div className={cn(dialogHeadlineVariants({ variant: \"fullscreen\" }), className)}>\n {/* Leading close icon button */}\n {closeButton}\n\n {/* Headline text — grows to fill available space */}\n <h2 id={headlineId} className={dialogHeadlineTitleVariants()}>\n {children}\n </h2>\n\n {/* Trailing confirm action */}\n {confirmButton}\n </div>\n );\n }\n\n return (\n <h2\n ref={ref}\n id={headlineId}\n className={cn(dialogHeadlineVariants({ variant: \"basic\" }), className)}\n >\n {children}\n </h2>\n );\n }\n);\n\nDialogHeadline.displayName = \"DialogHeadline\";\n","\"use client\";\n\nimport { forwardRef } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { useDialogContext } from \"./DialogHeadless\";\nimport { dialogContentVariants } from \"./Dialog.variants\";\nimport type { DialogContentProps } from \"./Dialog.types\";\n\n/**\n * `DialogContent` — Scrollable body slot sub-component (Layer 3).\n *\n * Renders as a scrollable `<div>` and registers its `id` with the parent\n * `DialogContext` so the dialog panel can wire `aria-describedby` correctly.\n *\n * Styled with `text-body-medium` and `text-on-surface-variant` per MD3 spec.\n * Overflows vertically when content exceeds the available height.\n *\n * Must be rendered inside a `<Dialog>` or `<DialogHeadless>` component.\n *\n * @example\n * ```tsx\n * <Dialog open onOpenChange={setOpen}>\n * <DialogHeadline>Confirm deletion?</DialogHeadline>\n * <DialogContent>\n * <p>\n * This will permanently delete the file and all associated data.\n * This action cannot be undone.\n * </p>\n * </DialogContent>\n * <DialogActions>\n * <Button variant=\"text\" onPress={() => setOpen(false)}>Cancel</Button>\n * <Button variant=\"filled\" onPress={handleDelete}>Delete</Button>\n * </DialogActions>\n * </Dialog>\n * ```\n */\nexport const DialogContent = forwardRef<HTMLDivElement, DialogContentProps>(function DialogContent(\n { children, className },\n ref\n) {\n const { contentId, variant } = useDialogContext();\n\n return (\n <div ref={ref} id={contentId} className={cn(dialogContentVariants({ variant }), className)}>\n {children}\n </div>\n );\n});\n\nDialogContent.displayName = \"DialogContent\";\n","\"use client\";\n\nimport { forwardRef } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { useDialogContext } from \"./DialogHeadless\";\nimport { dialogActionsVariants } from \"./Dialog.variants\";\nimport type { DialogActionsProps } from \"./Dialog.types\";\n\n/**\n * `DialogActions` — Action button row slot sub-component (Layer 3).\n *\n * Renders a right-aligned flex row of action buttons per MD3 spec.\n * Intended to contain `Button` components (typically `variant=\"text\"` for\n * secondary actions and `variant=\"filled\"` for the primary action).\n *\n * Not used in the `fullscreen` variant — the confirm action is placed in the\n * headline top app bar row via `DialogHeadline`'s `confirmButton` slot.\n *\n * Must be rendered inside a `<Dialog>` or `<DialogHeadless>` component.\n *\n * @example\n * ```tsx\n * <Dialog open onOpenChange={setOpen}>\n * <DialogHeadline>Discard changes?</DialogHeadline>\n * <DialogContent>Your unsaved changes will be lost.</DialogContent>\n * <DialogActions>\n * <Button variant=\"text\" onPress={() => setOpen(false)}>Cancel</Button>\n * <Button variant=\"filled\" onPress={handleDiscard}>Discard</Button>\n * </DialogActions>\n * </Dialog>\n * ```\n */\nexport const DialogActions = forwardRef<HTMLDivElement, DialogActionsProps>(function DialogActions(\n { children, className },\n ref\n) {\n // Consume context to validate sub-component is used inside Dialog\n useDialogContext();\n\n return (\n <div ref={ref} className={cn(dialogActionsVariants(), className)}>\n {children}\n </div>\n );\n});\n\nDialogActions.displayName = \"DialogActions\";\n"]}
1
+ {"version":3,"sources":["../src/utils/cn.ts","../src/utils/colors.ts","../src/utils/interactionStates.ts","../src/utils/typography.ts","../src/hooks/useScrollElevation.ts","../src/components/AppBar/AppBarHeadless.tsx","../src/components/AppBar/AppBar.variants.ts","../src/components/AppBar/AppBar.tsx","../src/components/Button/ButtonHeadless.tsx","../src/components/Button/Button.variants.ts","../src/hooks/useReducedMotion.ts","../src/hooks/useRipple.tsx","../src/components/ButtonGroup/ButtonGroupContext.tsx","../src/components/ButtonGroup/ButtonGroup.utils.ts","../src/components/Button/Button.tsx","../src/components/ButtonGroup/ButtonGroupHeadless.tsx","../src/components/ButtonGroup/ButtonGroup.variants.ts","../src/components/ButtonGroup/ButtonGroup.tsx","../src/components/IconButton/IconButtonHeadless.tsx","../src/components/IconButton/IconButton.variants.ts","../src/components/IconButton/IconButton.tsx","../src/components/FAB/FABHeadless.tsx","../src/components/FAB/FAB.variants.ts","../src/components/FAB/FAB.tsx","../src/components/TextField/TextField.variants.ts","../src/components/TextField/TextFieldHeadless.tsx","../src/components/TextField/TextField.tsx","../src/components/Checkbox/Checkbox.variants.ts","../src/components/Checkbox/Checkbox.tsx","../src/components/Switch/Switch.variants.ts","../src/components/Switch/Switch.tsx","../src/components/Radio/RadioGroupHeadless.tsx","../src/components/Radio/Radio.variants.ts","../src/components/Radio/Radio.tsx","../src/components/Radio/RadioGroup.tsx","../src/components/Radio/RadioHeadless.tsx","../src/components/Tabs/TabsHeadless.tsx","../src/components/Tabs/Tabs.tsx","../src/components/Tabs/Tabs.variants.ts","../src/components/Tabs/TabList.tsx","../src/components/Tabs/Tab.tsx","../src/components/Tabs/TabPanel.tsx","../src/components/NavigationBar/NavigationBarHeadless.tsx","../src/components/NavigationBar/NavigationBar.variants.ts","../src/components/NavigationBar/NavigationBar.tsx","../src/components/NavigationBar/NavigationBarItem.tsx","../src/components/Drawer/DrawerHeadless.tsx","../src/components/Divider/DividerHeadless.tsx","../src/components/Divider/Divider.variants.ts","../src/components/Divider/Divider.tsx","../src/components/Drawer/Drawer.variants.ts","../src/components/Drawer/DrawerSection.tsx","../src/components/Drawer/Drawer.tsx","../src/components/Badge/BadgeHeadless.tsx","../src/components/Badge/Badge.variants.ts","../src/components/Badge/BadgeContent.tsx","../src/components/Badge/Badge.tsx","../src/components/Drawer/DrawerItem.tsx","../src/components/Progress/Progress.variants.ts","../src/components/Progress/Progress.tsx","../src/components/Progress/ProgressHeadless.tsx","../src/components/Card/CardHeadless.tsx","../src/components/Card/Card.variants.ts","../src/components/Card/Card.tsx","../src/components/Card/CardMedia.tsx","../src/components/Card/CardHeader.tsx","../src/components/Card/CardContent.tsx","../src/components/Card/CardActions.tsx","../src/components/Menu/MenuHeadless.tsx","../src/components/Menu/Menu.variants.ts","../src/components/Menu/Menu.tsx","../src/components/Menu/MenuItem.tsx","../src/components/Menu/MenuSection.tsx","../src/components/Menu/MenuDivider.tsx","../src/components/Snackbar/SnackbarHeadless.tsx","../src/components/Snackbar/Snackbar.variants.ts","../src/components/Snackbar/Snackbar.tsx","../src/components/Snackbar/SnackbarProvider.tsx","../src/components/Chip/ChipHeadless.tsx","../src/components/Chip/Chip.variants.ts","../src/components/Chip/Chip.tsx","../src/components/Chip/ChipSet.tsx","../src/components/Dialog/DialogHeadless.tsx","../src/components/Dialog/Dialog.variants.ts","../src/components/Dialog/Dialog.tsx","../src/components/Dialog/DialogHeadline.tsx","../src/components/Dialog/DialogContent.tsx","../src/components/Dialog/DialogActions.tsx","../src/components/Tooltip/TooltipHeadless.tsx","../src/components/Tooltip/TooltipTrigger.tsx","../src/components/Tooltip/Tooltip.variants.ts","../src/components/Tooltip/Tooltip.tsx","../src/components/Tooltip/RichTooltip.tsx","../src/components/List/ListHeadless.tsx","../src/components/List/List.variants.ts","../src/components/List/List.tsx","../src/components/List/ListItemLeading.tsx","../src/components/List/ListItemTrailing.tsx","../src/components/List/ListItemText.tsx","../src/components/List/ListItem.tsx","../src/components/Search/SearchHeadless.tsx","../src/components/Search/Search.variants.ts","../src/components/Search/SearchBar.tsx","../src/components/Search/SearchView.tsx","../src/components/Search/Search.tsx","../src/components/SplitButton/SplitButton.variants.ts","../src/components/SplitButton/SplitButton.tsx","../src/components/SplitButton/SplitButtonHeadless.tsx","../src/components/FABMenu/FABMenuHeadless.tsx","../src/components/FABMenu/FABMenu.variants.ts","../src/components/FABMenu/FABMenu.tsx","../src/components/FABMenu/FABMenuItem.tsx","../src/components/Slider/SliderHeadless.tsx","../src/components/Slider/Slider.variants.ts","../src/components/Slider/SliderStops.tsx","../src/components/Slider/SliderValueIndicator.tsx","../src/components/Slider/Slider.tsx","../src/components/BottomSheet/useBottomSheetDrag.ts","../src/components/BottomSheet/BottomSheetHeadless.tsx","../src/components/BottomSheet/BottomSheet.variants.ts","../src/components/BottomSheet/BottomSheetHandle.tsx","../src/components/BottomSheet/BottomSheet.tsx","../src/components/TimePicker/ClockHand.tsx","../src/components/TimePicker/useClockDial.ts","../src/components/TimePicker/ClockDial.tsx","../src/components/TimePicker/TimeSelector.tsx","../src/components/TimePicker/PeriodSelector.tsx","../src/components/TimePicker/TimePickerDial.tsx","../src/components/TimePicker/TimePicker.variants.ts","../src/components/TimePicker/TimePickerDialStyled.tsx","../src/components/TimePicker/TimeInputField.tsx","../src/components/TimePicker/TimePickerInput.tsx","../src/components/TimePicker/TimePickerInputStyled.tsx","../src/components/TimePicker/TimePicker.tsx","../src/components/DatePicker/CalendarCell.tsx","../src/components/DatePicker/CalendarGrid.tsx","../src/components/DatePicker/CalendarHeader.tsx","../src/components/DatePicker/CalendarCore.tsx","../src/components/DatePicker/DatePickerActions.tsx","../src/components/DatePicker/DatePickerDocked.tsx","../src/components/DatePicker/DatePicker.variants.ts","../src/components/DatePicker/DatePickerDockedStyled.tsx","../src/components/DatePicker/DatePickerModalHeader.tsx","../src/components/DatePicker/DatePickerModal.tsx","../src/components/DatePicker/DatePickerModalStyled.tsx","../src/components/DatePicker/DateInputField.tsx","../src/components/DatePicker/DatePickerModalInput.tsx","../src/components/DatePicker/DatePickerModalInputStyled.tsx","../src/components/DatePicker/DatePicker.tsx","../src/components/DatePicker/DateField.tsx"],"names":["forwardRef","jsx","cva","useState","useEffect","useRef","useCallback","jsxs","mergeProps","useButton","filterDOMProps","Spinner","useFocusRing","mergedInputProps","useToggleState","useHover","VisuallyHidden","createContext","useContext","useRadio","useMemo","useTabList","useTab","useTabPanel","Item","useTabListState","isBadgeVisible","badgeVariants","isValidElement","useProgressBar","CardHeadless","Card","CardMedia","CardHeader","CardContent","CardActions","Fragment","RACMenuTrigger","useLayoutEffect","RACMenu","HeadlessMenuItem","RACMenuItem","RACMenuSection","RACSeparator","Menu","MenuItem","RACHeader","SnackbarHeadless","Snackbar","useId","CloseIcon","CheckIcon","usePreventScroll","useDialog","useOverlay","DialogHeadless","useOverlayTriggerState","FocusScope","createPortal","Dialog","DialogHeadline","DialogContent","DialogActions","cloneElement","Children","ListHeadless","InteractiveList","ListItemHeadless","InteractiveListItem","List","ListItemLeading","typeClasses","ListItemTrailing","ListItemText","ListItem","InteractiveStyledListItem","useOption","useMenuTriggerState","formatValue","BottomSheetHeadless","BottomSheet","valueToAngle","to24Hour","from24Hour","useLocale","createCalendar","useDateSegment","useDateFieldState","useDateField"],"mappings":"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","file":"index.js","sourcesContent":["import { type ClassValue, clsx } from \"clsx\";\nimport { extendTailwindMerge } from \"tailwind-merge\";\n\n/**\n * Extended tailwind-merge that understands MD3 custom Tailwind v4 `@theme` utilities.\n *\n * By default, `tailwind-merge` treats ALL `text-*` classes as potentially\n * conflicting. This causes issues with our custom MD3 tokens:\n * - Typography scale: `text-body-large`, `text-label-medium`, etc. → font-size group\n * - Color utilities: `text-on-surface`, `text-primary`, etc. → text-color group\n *\n * We register the typography-scale tokens so `twMerge` knows they live in the\n * `font-size` group and do NOT conflict with `text-color` utilities.\n */\nconst twMerge = extendTailwindMerge({\n extend: {\n classGroups: {\n \"font-size\": [\n {\n text: [\n // MD3 Display scale\n \"display-large\",\n \"display-medium\",\n \"display-small\",\n // MD3 Headline scale\n \"headline-large\",\n \"headline-medium\",\n \"headline-small\",\n // MD3 Title scale\n \"title-large\",\n \"title-medium\",\n \"title-small\",\n // MD3 Body scale\n \"body-large\",\n \"body-medium\",\n \"body-small\",\n // MD3 Label scale\n \"label-large\",\n \"label-medium\",\n \"label-small\",\n ],\n },\n ],\n },\n },\n});\n\n/**\n * Combines and merges Tailwind CSS classes efficiently.\n *\n * Uses `clsx` for conditional joining + extended `tailwind-merge` that is\n * aware of MD3 typography scale utilities (`text-body-large`, etc.) so they\n * are not incorrectly removed when merged alongside color utilities\n * (`text-on-surface`, `text-primary`, etc.).\n *\n * @example\n * ```tsx\n * cn('px-2 py-1', condition && 'bg-blue-500', { 'text-white': isActive })\n * // => 'px-2 py-1 bg-blue-500 text-white'\n * ```\n *\n * @example Merging conflicting classes (later wins)\n * ```tsx\n * cn('px-2', 'px-4')\n * // => 'px-4'\n * ```\n *\n * @example MD3 typography + color (both kept — no false conflict)\n * ```tsx\n * cn('text-body-large', 'text-on-surface')\n * // => 'text-body-large text-on-surface'\n * ```\n */\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs));\n}\n","/**\n * Color Utilities\n *\n * Utilities for working with Material Design 3 color system.\n * Provides functions for color manipulation, CSS variable extraction,\n * and integration with material-color-utilities.\n */\n\nimport { argbFromHex, themeFromSourceColor, type Theme } from \"@material/material-color-utilities\";\n\n/**\n * Material Design 3 color roles\n */\nexport type MD3ColorRole =\n | \"primary\"\n | \"on-primary\"\n | \"primary-container\"\n | \"on-primary-container\"\n | \"secondary\"\n | \"on-secondary\"\n | \"secondary-container\"\n | \"on-secondary-container\"\n | \"tertiary\"\n | \"on-tertiary\"\n | \"tertiary-container\"\n | \"on-tertiary-container\"\n | \"error\"\n | \"on-error\"\n | \"error-container\"\n | \"on-error-container\"\n | \"surface\"\n | \"on-surface\"\n | \"surface-variant\"\n | \"on-surface-variant\"\n | \"outline\"\n | \"outline-variant\"\n | \"background\"\n | \"on-background\";\n\n/**\n * Get the computed value of a CSS variable\n *\n * @param variable - CSS variable name (with or without `--` prefix)\n * @param element - Element to get computed style from (defaults to document root)\n * @returns The computed value of the CSS variable\n *\n * @example\n * ```ts\n * const primaryColor = getColorValue('--md-sys-color-primary');\n * // Returns: '#6750a4'\n *\n * const primaryColor = getColorValue('md-sys-color-primary');\n * // Also returns: '#6750a4'\n * ```\n */\nexport function getColorValue(\n variable: string,\n element: HTMLElement = document.documentElement\n): string {\n const varName = variable.startsWith(\"--\") ? variable : `--${variable}`;\n return getComputedStyle(element).getPropertyValue(varName).trim();\n}\n\n/**\n * Get a Material Design 3 color token value\n *\n * @param role - MD3 color role name\n * @returns The hex color value\n *\n * @example\n * ```ts\n * const primary = getMD3Color('primary');\n * // Returns: '#6750a4'\n *\n * const onPrimary = getMD3Color('on-primary');\n * // Returns: '#ffffff'\n * ```\n */\nexport function getMD3Color(role: MD3ColorRole): string {\n return getColorValue(`--md-sys-color-${role}`);\n}\n\n/**\n * Add opacity to a hex color\n *\n * @param color - Hex color string (with or without #)\n * @param opacity - Opacity value (0-1)\n * @returns Hex color with opacity (8-digit hex)\n *\n * @example\n * ```ts\n * withOpacity('#6750a4', 0.5);\n * // Returns: '#6750a480'\n *\n * withOpacity('6750a4', 0.12);\n * // Returns: '#6750a41f'\n * ```\n */\nexport function withOpacity(color: string, opacity: number): string {\n const hex = color.replace(\"#\", \"\");\n const alpha = Math.round(Math.max(0, Math.min(1, opacity)) * 255)\n .toString(16)\n .padStart(2, \"0\");\n return `#${hex}${alpha}`;\n}\n\n/**\n * Convert hex color to RGB object\n *\n * @param hex - Hex color string (with or without #)\n * @returns RGB object with r, g, b values (0-255)\n *\n * @example\n * ```ts\n * hexToRgb('#6750a4');\n * // Returns: { r: 103, g: 80, b: 164 }\n * ```\n */\nexport function hexToRgb(hex: string): { r: number; g: number; b: number } {\n const h = hex.replace(\"#\", \"\");\n const r = parseInt(h.substring(0, 2), 16);\n const g = parseInt(h.substring(2, 4), 16);\n const b = parseInt(h.substring(4, 6), 16);\n return { r, g, b };\n}\n\n/**\n * Convert RGB to hex color\n *\n * @param r - Red value (0-255)\n * @param g - Green value (0-255)\n * @param b - Blue value (0-255)\n * @returns Hex color string\n *\n * @example\n * ```ts\n * rgbToHex(103, 80, 164);\n * // Returns: '#6750a4'\n * ```\n */\nexport function rgbToHex(r: number, g: number, b: number): string {\n const toHex = (n: number): string => {\n const hex = Math.max(0, Math.min(255, Math.round(n))).toString(16);\n return hex.padStart(2, \"0\");\n };\n return `#${toHex(r)}${toHex(g)}${toHex(b)}`;\n}\n\n/**\n * Generate a complete Material Design 3 theme from a seed color\n *\n * @param seedColor - Hex color to generate theme from\n * @returns Material Color Utilities Theme object\n *\n * @example\n * ```ts\n * const theme = generateMD3Theme('#6750a4');\n *\n * // Access light mode colors\n * const lightPrimary = hexFromArgb(theme.schemes.light.primary);\n * // Returns: '#6750a4'\n *\n * // Access dark mode colors\n * const darkPrimary = hexFromArgb(theme.schemes.dark.primary);\n * // Returns: '#d0bcff'\n * ```\n */\nexport function generateMD3Theme(seedColor: string): Theme {\n const argb = argbFromHex(seedColor);\n return themeFromSourceColor(argb);\n}\n\n/**\n * Material Color Utilities type exports\n *\n * Re-export commonly used types from material-color-utilities\n * for convenience and type safety.\n */\nexport type { Theme } from \"@material/material-color-utilities\";\n\n/**\n * Material Color Utilities function exports\n *\n * Re-export commonly used functions from material-color-utilities\n * for convenience.\n */\nexport { argbFromHex, hexFromArgb } from \"@material/material-color-utilities\";\n\n/**\n * State layer opacity values (Material Design 3 spec)\n *\n * These values are used for hover, focus, press, and drag states\n * in Material Design 3 components.\n *\n * @see https://m3.material.io/foundations/interaction/states/state-layers\n */\nexport const STATE_LAYER_OPACITY = {\n hover: 0.08,\n focus: 0.12,\n press: 0.12,\n drag: 0.16,\n} as const;\n\n/**\n * Apply a state layer opacity to a color\n *\n * @param color - Base hex color\n * @param state - State type ('hover' | 'focus' | 'press' | 'drag')\n * @returns Color with state layer opacity applied\n *\n * @example\n * ```ts\n * applyStateLayer('#6750a4', 'hover');\n * // Returns: '#6750a414' (8% opacity)\n *\n * applyStateLayer('#6750a4', 'focus');\n * // Returns: '#6750a41f' (12% opacity)\n * ```\n */\nexport function applyStateLayer(color: string, state: keyof typeof STATE_LAYER_OPACITY): string {\n return withOpacity(color, STATE_LAYER_OPACITY[state]);\n}\n","/**\n * Interaction States Utility\n *\n * Shared helper for converting React Aria interaction/selection state booleans\n * into presence-based `data-*` attributes for `group-data-[x]/<name>` Tailwind\n * CSS selectors.\n *\n * This covers **interaction and selection states only**. Content flags such as\n * `data-with-icon` or `data-with-label` describe structural composition and\n * must be set explicitly by the component — never via this helper.\n *\n * @example\n * ```tsx\n * const { isHovered, hoverProps } = useHover({ isDisabled })\n * const { isFocusVisible, focusProps } = useFocusRing()\n *\n * <label\n * className=\"group/switch\"\n * {...mergeProps(labelProps, hoverProps, focusProps)}\n * {...getInteractionDataAttributes({ isHovered, isFocusVisible, isSelected, isDisabled })}\n * data-with-icon={(!!icon) ? \"\" : undefined}\n * />\n * ```\n */\n\n/**\n * Subset of React Aria interaction states that map to `data-*` attributes.\n * All fields are optional — omit states not relevant to a given component.\n */\nexport interface InteractionStates {\n /**\n * Pointer is hovering over the component.\n * Source: `useHover` → `isHovered`\n */\n isHovered?: boolean;\n /**\n * Keyboard or programmatic focus is visible (not pointer-initiated).\n * Source: `useFocusRing` → `isFocusVisible`\n */\n isFocusVisible?: boolean;\n /**\n * Component is actively being pressed.\n * Source: React Aria interaction → `isPressed`\n */\n isPressed?: boolean;\n /**\n * Component is in the ON / checked / active selection state.\n * Source: toggle/select state → `isSelected`\n */\n isSelected?: boolean;\n /**\n * Component is non-interactive.\n * Source: `isDisabled` prop\n */\n isDisabled?: boolean;\n /**\n * Component value cannot be changed.\n * Source: `isReadOnly` prop\n */\n isReadOnly?: boolean;\n /**\n * Component value fails validation.\n * Source: `isInvalid` prop\n */\n isInvalid?: boolean;\n /**\n * Component is partially selected (checkbox indeterminate state).\n * Source: `isIndeterminate` prop\n */\n isIndeterminate?: boolean;\n}\n\n/**\n * Converts interaction/selection states into presence-based `data-*` attributes.\n *\n * Attributes are set to `\"\"` (present) when true and `undefined` (absent) when\n * false/undefined, so Tailwind `data-[x]` and `group-data-[x]/<name>` selectors\n * match purely on attribute presence — no value comparison needed.\n *\n * Uses explicit ternaries (`s.isHovered ? \"\" : undefined`) rather than\n * `s.isHovered || undefined` to avoid incorrect attribute removal on falsy\n * non-boolean values.\n *\n * @param s - The component's current interaction/selection state\n * @returns A record of `data-*` attribute names to `\"\"` or `undefined`\n *\n * @example\n * ```tsx\n * <label\n * className=\"group/switch\"\n * {...getInteractionDataAttributes({ isHovered, isFocusVisible, isSelected, isDisabled })}\n * />\n * ```\n */\nexport function getInteractionDataAttributes(s: InteractionStates): Record<string, \"\" | undefined> {\n return {\n \"data-hovered\": s.isHovered ? \"\" : undefined,\n \"data-focus-visible\": s.isFocusVisible ? \"\" : undefined,\n \"data-pressed\": s.isPressed ? \"\" : undefined,\n \"data-selected\": s.isSelected ? \"\" : undefined,\n \"data-disabled\": s.isDisabled ? \"\" : undefined,\n \"data-readonly\": s.isReadOnly ? \"\" : undefined,\n \"data-invalid\": s.isInvalid ? \"\" : undefined,\n \"data-indeterminate\": s.isIndeterminate ? \"\" : undefined,\n };\n}\n","/**\n * Typography Utilities\n *\n * Utilities for working with Material Design 3 typography system.\n * Provides type-safe access to typography tokens and helper functions\n * for applying complete text styles.\n */\n\nimport { getColorValue } from \"./colors\";\n\n/**\n * Material Design 3 typography scales\n *\n * MD3 defines 5 categories of typography, each with 3 size variants.\n */\nexport type MD3TypographyScale = \"display\" | \"headline\" | \"title\" | \"body\" | \"label\";\n\n/**\n * Typography size variants\n */\nexport type MD3TypographySize = \"large\" | \"medium\" | \"small\";\n\n/**\n * Complete typography style name\n * Combination of scale and size (e.g., 'display-large', 'body-medium')\n */\nexport type MD3TypographyStyle =\n | \"display-large\"\n | \"display-medium\"\n | \"display-small\"\n | \"headline-large\"\n | \"headline-medium\"\n | \"headline-small\"\n | \"title-large\"\n | \"title-medium\"\n | \"title-small\"\n | \"body-large\"\n | \"body-medium\"\n | \"body-small\"\n | \"label-large\"\n | \"label-medium\"\n | \"label-small\";\n\n/**\n * Typography token properties\n */\nexport type TypographyProperty = \"size\" | \"line-height\" | \"weight\" | \"tracking\";\n\n/**\n * Typography style object returned by getTypographyStyle()\n */\nexport interface TypographyStyleObject {\n fontSize: string;\n lineHeight: string;\n fontWeight: string;\n letterSpacing: string;\n fontFamily?: string;\n}\n\n/**\n * Get a typography token value\n *\n * @param style - Typography style name (e.g., 'display-large', 'body-medium')\n * @param property - Property to retrieve ('size' | 'line-height' | 'weight' | 'tracking')\n * @returns The token value as a string\n *\n * @example\n * ```ts\n * getTypographyToken('display-large', 'size');\n * // Returns: '3.5625rem' (57px)\n *\n * getTypographyToken('body-medium', 'weight');\n * // Returns: '400'\n * ```\n */\nexport function getTypographyToken(\n style: MD3TypographyStyle,\n property: TypographyProperty\n): string {\n return getColorValue(`--md-sys-typescale-${style}-${property}`);\n}\n\n/**\n * Get a complete typography style object\n *\n * Returns a style object with all typography properties that can be\n * spread directly into a React component's style prop.\n *\n * @param style - Typography style name\n * @param includeFontFamily - Whether to include font-family (default: false)\n * @returns Typography style object for React inline styles\n *\n * @example\n * ```tsx\n * const displayStyle = getTypographyStyle('display-large');\n * // Returns: {\n * // fontSize: '3.5625rem',\n * // lineHeight: '4rem',\n * // fontWeight: '400',\n * // letterSpacing: '-0.25px'\n * // }\n *\n * <h1 style={displayStyle}>Display Large Text</h1>\n * ```\n *\n * @example\n * ```tsx\n * // With font family\n * const bodyStyle = getTypographyStyle('body-medium', true);\n * // Returns: {\n * // fontSize: '0.875rem',\n * // lineHeight: '1.25rem',\n * // fontWeight: '400',\n * // letterSpacing: '0.25px',\n * // fontFamily: 'system-ui, -apple-system, ...'\n * // }\n * ```\n */\nexport function getTypographyStyle(\n style: MD3TypographyStyle,\n includeFontFamily = false\n): TypographyStyleObject {\n const styleObject: TypographyStyleObject = {\n fontSize: getTypographyToken(style, \"size\"),\n lineHeight: getTypographyToken(style, \"line-height\"),\n fontWeight: getTypographyToken(style, \"weight\"),\n letterSpacing: getTypographyToken(style, \"tracking\"),\n };\n\n if (includeFontFamily) {\n styleObject.fontFamily = getColorValue(\"--md-sys-typescale-font-family-plain\");\n }\n\n return styleObject;\n}\n\n/**\n * Get font family token value\n *\n * @param variant - Font family variant ('plain' | 'brand')\n * @returns Font family stack\n *\n * @example\n * ```ts\n * getFontFamily('plain');\n * // Returns: 'system-ui, -apple-system, Segoe UI, Roboto, ...'\n *\n * getFontFamily('brand');\n * // Returns: Same as plain (can be customized via CSS variables)\n * ```\n */\nexport function getFontFamily(variant: \"plain\" | \"brand\" = \"plain\"): string {\n return getColorValue(`--md-sys-typescale-font-family-${variant}`);\n}\n\n/**\n * Typography scale recommendations for semantic HTML elements\n *\n * Maps HTML elements to recommended MD3 typography styles.\n * Based on Material Design 3 guidelines.\n */\nexport const TYPOGRAPHY_ELEMENT_MAP = {\n h1: \"display-large\",\n h2: \"display-medium\",\n h3: \"headline-large\",\n h4: \"headline-medium\",\n h5: \"headline-small\",\n h6: \"title-large\",\n p: \"body-large\",\n span: \"body-medium\",\n small: \"body-small\",\n button: \"label-large\",\n label: \"label-medium\",\n caption: \"label-small\",\n} as const satisfies Record<string, MD3TypographyStyle>;\n\n/**\n * Get recommended typography style for an HTML element\n *\n * @param element - HTML element tag name\n * @returns Recommended MD3 typography style\n *\n * @example\n * ```ts\n * getTypographyForElement('h1');\n * // Returns: 'display-large'\n *\n * getTypographyForElement('button');\n * // Returns: 'label-large'\n * ```\n */\nexport function getTypographyForElement(\n element: keyof typeof TYPOGRAPHY_ELEMENT_MAP\n): MD3TypographyStyle {\n return TYPOGRAPHY_ELEMENT_MAP[element];\n}\n\n/**\n * Typography scale usage guidelines\n *\n * Provides semantic context for when to use each typography scale.\n */\nexport const TYPOGRAPHY_USAGE = {\n display: \"Large, expressive text for hero sections and marketing\",\n headline: \"High-emphasis text for titles and important headings\",\n title: \"Medium-emphasis text for section headers and card titles\",\n body: \"Plain text for paragraphs, lists, and general content\",\n label: \"UI labels, buttons, tabs, and form elements\",\n} as const satisfies Record<MD3TypographyScale, string>;\n\n/**\n * Create a typography CSS class name\n *\n * Generates a consistent class name for typography styles.\n * Useful for creating utility classes or component variants.\n *\n * @param style - Typography style name\n * @returns CSS class name string\n *\n * @example\n * ```ts\n * getTypographyClassName('display-large');\n * // Returns: 'text-display-large'\n *\n * getTypographyClassName('body-medium');\n * // Returns: 'text-body-medium'\n * ```\n */\nexport function getTypographyClassName(style: MD3TypographyStyle): string {\n return `text-${style}`;\n}\n\n/**\n * Responsive typography helper\n *\n * Creates a style object that adapts typography across breakpoints.\n *\n * @param mobile - Typography style for mobile screens\n * @param tablet - Typography style for tablet screens (optional)\n * @param desktop - Typography style for desktop screens (optional)\n * @returns Object with styles for different breakpoints\n *\n * @example\n * ```tsx\n * const responsiveTitle = getResponsiveTypography(\n * 'headline-small',\n * 'headline-medium',\n * 'headline-large'\n * );\n *\n * // Use with CSS-in-JS or styled-components\n * const Title = styled.h2`\n * ${responsiveTitle.mobile}\n *\n * @media (min-width: 768px) {\n * ${responsiveTitle.tablet}\n * }\n *\n * @media (min-width: 1024px) {\n * ${responsiveTitle.desktop}\n * }\n * `;\n * ```\n */\nexport function getResponsiveTypography(\n mobile: MD3TypographyStyle,\n tablet?: MD3TypographyStyle,\n desktop?: MD3TypographyStyle\n): {\n mobile: TypographyStyleObject;\n tablet?: TypographyStyleObject;\n desktop?: TypographyStyleObject;\n} {\n return {\n mobile: getTypographyStyle(mobile),\n ...(tablet && { tablet: getTypographyStyle(tablet) }),\n ...(desktop && { desktop: getTypographyStyle(desktop) }),\n };\n}\n\n/**\n * Convert rem to pixels (assuming 16px base)\n *\n * @param rem - Rem value (with or without 'rem' suffix)\n * @returns Pixel value\n *\n * @example\n * ```ts\n * remToPx('1.5rem');\n * // Returns: 24\n *\n * remToPx('3.5625rem');\n * // Returns: 57\n * ```\n */\nexport function remToPx(rem: string): number {\n const remValue = parseFloat(rem.replace(\"rem\", \"\"));\n return remValue * 16;\n}\n\n/**\n * Convert pixels to rem (assuming 16px base)\n *\n * @param px - Pixel value (with or without 'px' suffix)\n * @returns Rem value as string\n *\n * @example\n * ```ts\n * pxToRem(24);\n * // Returns: '1.5rem'\n *\n * pxToRem('57px');\n * // Returns: '3.5625rem'\n * ```\n */\nexport function pxToRem(px: number | string): string {\n const pxValue = typeof px === \"string\" ? parseFloat(px.replace(\"px\", \"\")) : px;\n return `${pxValue / 16}rem`;\n}\n\n/**\n * Truncate text with ellipsis\n *\n * Returns CSS properties for single or multi-line text truncation.\n *\n * @param lines - Number of lines before truncation (1 for single-line)\n * @returns CSS properties object\n *\n * @example\n * ```tsx\n * // Single line truncation\n * const singleLine = truncateText(1);\n * <div style={singleLine}>Long text here...</div>\n *\n * // Multi-line truncation (3 lines)\n * const multiLine = truncateText(3);\n * <p style={multiLine}>Long paragraph text here...</p>\n * ```\n */\nexport function truncateText(lines = 1): React.CSSProperties {\n if (lines === 1) {\n return {\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n };\n }\n\n return {\n display: \"-webkit-box\",\n WebkitLineClamp: lines,\n WebkitBoxOrient: \"vertical\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n };\n}\n","\"use client\";\n\nimport { useState, useEffect, useCallback } from \"react\";\n\n/**\n * Options for useScrollElevation hook\n */\ninterface UseScrollElevationOptions {\n /**\n * Controlled scroll state.\n * When provided, the hook operates in controlled mode and does not\n * attach a scroll listener — the consumer manages state externally.\n * When `undefined`, the hook uses internal scroll detection (uncontrolled).\n */\n scrolled?: boolean | undefined;\n\n /**\n * Callback fired when scroll elevation state changes.\n * In uncontrolled mode: fires when user scrolls past threshold.\n * In controlled mode: fires to inform the consumer of scroll events.\n */\n onScrollStateChange?: ((scrolled: boolean) => void) | undefined;\n\n /**\n * Scroll threshold in pixels before elevation activates\n * @default 0\n */\n threshold?: number | undefined;\n}\n\n/**\n * Hook for MD3 AppBar scroll-triggered elevation behavior.\n *\n * Manages the transition between flat (at rest) and elevated (on scroll)\n * surface states per the Material Design 3 Top App Bar spec.\n *\n * Supports both controlled and uncontrolled modes:\n * - **Uncontrolled**: Attaches a `scroll` listener to `window` and manages\n * elevation state internally. Calls `onScrollStateChange` when the state changes.\n * - **Controlled**: Uses the `scrolled` prop directly. No internal scroll listener\n * is attached. The consumer is responsible for updating `scrolled`.\n *\n * @example Uncontrolled (recommended for most cases)\n * ```tsx\n * const { isScrolled } = useScrollElevation({\n * onScrollStateChange: (scrolled) => console.log('scrolled:', scrolled),\n * });\n * ```\n *\n * @example Controlled\n * ```tsx\n * const [scrolled, setScrolled] = useState(false);\n * const { isScrolled } = useScrollElevation({ scrolled, onScrollStateChange: setScrolled });\n * ```\n */\nexport function useScrollElevation(options: UseScrollElevationOptions = {}): {\n isScrolled: boolean;\n} {\n const { scrolled: controlledScrolled, onScrollStateChange, threshold = 0 } = options;\n\n const isControlled = controlledScrolled !== undefined;\n\n const [internalScrolled, setInternalScrolled] = useState(false);\n\n const handleScroll = useCallback(() => {\n const currentlyScrolled = window.scrollY > threshold;\n setInternalScrolled((prev) => {\n if (prev !== currentlyScrolled) {\n onScrollStateChange?.(currentlyScrolled);\n return currentlyScrolled;\n }\n return prev;\n });\n }, [threshold, onScrollStateChange]);\n\n useEffect(() => {\n // Only attach the scroll listener in uncontrolled mode\n if (isControlled) return;\n\n window.addEventListener(\"scroll\", handleScroll, { passive: true });\n\n // Check initial scroll position\n handleScroll();\n\n return () => {\n window.removeEventListener(\"scroll\", handleScroll);\n };\n }, [isControlled, handleScroll]);\n\n return {\n isScrolled: isControlled ? controlledScrolled : internalScrolled,\n };\n}\n","import { forwardRef } from \"react\";\nimport { useScrollElevation } from \"../../hooks/useScrollElevation\";\nimport type { AppBarHeadlessProps } from \"./AppBar.types\";\n\n/**\n * Headless AppBar Component (Layer 2)\n *\n * Unstyled Top App Bar primitive. Renders a `<header role=\"banner\">` landmark\n * and manages scroll elevation state via the `useScrollElevation` hook.\n *\n * Features:\n * - Semantic `<header>` element with `role=\"banner\"` ARIA landmark\n * - Controlled scroll state via `scrolled` prop\n * - Uncontrolled scroll state with internal `window` scroll detection\n * - `onScrollStateChange` callback for both modes\n * - Full ref forwarding to the header element\n *\n * Use this layer when you need full visual control beyond what the styled\n * `AppBar` provides.\n *\n * @example\n * ```tsx\n * // Uncontrolled (auto scroll detection)\n * <AppBarHeadless className=\"my-custom-appbar\">\n * <div>My custom layout</div>\n * </AppBarHeadless>\n *\n * // Controlled scroll state\n * <AppBarHeadless\n * scrolled={isScrolled}\n * onScrollStateChange={setIsScrolled}\n * className=\"my-custom-appbar\"\n * >\n * <div>My custom layout</div>\n * </AppBarHeadless>\n * ```\n */\nexport const AppBarHeadless = forwardRef<HTMLElement, AppBarHeadlessProps>(\n ({ className, children, scrolled: scrolledProp, onScrollStateChange }, ref) => {\n const { isScrolled } = useScrollElevation({\n scrolled: scrolledProp,\n onScrollStateChange,\n });\n\n return (\n <header ref={ref} role=\"banner\" className={className} data-scrolled={isScrolled}>\n {children}\n </header>\n );\n }\n);\n\nAppBarHeadless.displayName = \"AppBarHeadless\";\n","import { cva, type VariantProps } from \"class-variance-authority\";\n\n/**\n * Material Design 3 Top App Bar Variants (CVA)\n *\n * Type-safe variant management for AppBar component.\n * Uses Tailwind CSS classes mapped to MD3 design tokens.\n *\n * Variants:\n * - `small`: 64dp height (h-appbar-small), title left-aligned, title-large\n * - `center-aligned`: 64dp height (h-appbar-small), title centered, title-large\n * - `medium`: min 112dp height (min-h-appbar-medium), title bottom-left, headline-medium\n * - `large`: min 120dp height (min-h-appbar-large), title bottom-left, display-small\n *\n * Scroll state:\n * - `false`: flat surface, bg-surface, shadow-elevation-0\n * - `true`: bg-surface-container + shadow-elevation-2 (MD3 on-scroll spec)\n *\n * @see https://m3.material.io/components/top-app-bar/specs\n */\nexport const appBarVariants = cva(\n [\n // Base classes (always applied)\n \"w-full\",\n \"bg-surface text-on-surface\",\n \"flex flex-col\",\n // Elevation transition using MD3 motion tokens\n \"transition-shadow duration-medium2 ease-standard\",\n ],\n {\n variants: {\n /**\n * Size variant (MD3 specification)\n * Controls bar height, title placement, and type scale\n */\n variant: {\n /** 64dp, title left-aligned, title-large */\n small: \"h-appbar-small\",\n /** 64dp, title centered, title-large */\n \"center-aligned\": \"h-appbar-small variant-center-aligned\",\n /** min 112dp, title bottom-left, headline-medium (grows with subtitle) */\n medium: \"min-h-appbar-medium\",\n /** min 120dp, title bottom-left, display-small (grows with subtitle) */\n large: \"min-h-appbar-large\",\n },\n\n /**\n * Scroll state — controls surface elevation and background color\n * MD3: flat surface at rest → surface-container background + elevation-2 on scroll\n */\n scrolled: {\n false: \"shadow-elevation-0\",\n true: \"bg-surface-container shadow-elevation-2\",\n },\n },\n\n defaultVariants: {\n variant: \"small\",\n scrolled: false,\n },\n }\n);\n\n/**\n * Title typography classes per variant\n * Used to apply the correct MD3 type scale to the title element\n */\nexport const appBarTitleVariants = cva(\"text-on-surface font-normal\", {\n variants: {\n variant: {\n /** title-large: 22px / 28px line-height */\n small: \"text-title-large truncate\",\n /** title-large: 22px / 28px line-height, centered */\n \"center-aligned\": \"text-title-large truncate\",\n /** headline-medium: 28px / 36px line-height */\n medium: \"text-headline-medium\",\n /** display-small: 36px / 44px line-height */\n large: \"text-display-small\",\n },\n },\n defaultVariants: {\n variant: \"small\",\n },\n});\n\n/**\n * Subtitle typography classes per variant\n * Used to apply the correct MD3 type scale and color to the subtitle element.\n * Per MD3 spec (M3 Expressive):\n * - small/center-aligned: title-medium + on-surface-variant (secondary text)\n * - medium/large expanded: title-large/headline-small + on-surface (primary text area)\n */\nexport const appBarSubtitleVariants = cva(\"font-normal\", {\n variants: {\n variant: {\n /** title-medium: 16px / 24px, on-surface-variant color */\n small: \"text-title-medium text-on-surface-variant truncate\",\n /** title-medium: 16px / 24px, centered, on-surface-variant color */\n \"center-aligned\": \"text-title-medium text-on-surface-variant truncate\",\n /** title-large: 22px / 28px, on-surface color */\n medium: \"text-title-large text-on-surface\",\n /** headline-small: 24px / 32px, on-surface color */\n large: \"text-headline-small text-on-surface\",\n },\n },\n defaultVariants: {\n variant: \"small\",\n },\n});\n\n/**\n * Extract variant prop types from CVA\n */\nexport type AppBarVariants = VariantProps<typeof appBarVariants>;\n","\"use client\";\n\nimport { forwardRef } from \"react\";\nimport { AppBarHeadless } from \"./AppBarHeadless\";\nimport { appBarVariants, appBarTitleVariants, appBarSubtitleVariants } from \"./AppBar.variants\";\nimport { cn } from \"../../utils/cn\";\nimport { useScrollElevation } from \"../../hooks/useScrollElevation\";\nimport type { AppBarProps } from \"./AppBar.types\";\n\n/**\n * Material Design 3 Top App Bar Component\n *\n * Provides context and actions for the current screen. Supports four size variants,\n * a navigation icon slot, title, and trailing action icon slots. Implements\n * scroll-triggered elevation changes per MD3 specification.\n *\n * **Architecture:**\n * - Layer 3 (this file): MD3 styled, CVA variants, layout composition\n * - Layer 2: `AppBarHeadless` — `<header role=\"banner\">`, scroll state\n * - Layer 1: React Aria via `<IconButton>` in consumer slots\n *\n * **Key Features:**\n * - 4 MD3 variants: small, center-aligned, medium, large\n * - Optional subtitle (per M3 Expressive spec) with per-variant typography\n * - Composable API: pass `<IconButton>` nodes into navigation and action slots\n * - Scroll elevation: flat (bg-surface) at rest → bg-surface-container + shadow-elevation-2 on scroll\n * - Controlled and uncontrolled scroll state\n * - WCAG 2.1 AA: `role=\"banner\"` landmark, keyboard accessible slots\n * - Dark mode via existing token system\n *\n * **MD3 Accessibility (m3.material.io/components/app-bars/accessibility):**\n * - Focus lands on the leading navigation button first (first interactive element in DOM)\n * - Tab navigates: leading icon → trailing action icons (left to right)\n * - Space / Enter activates the focused element\n * - All icon buttons MUST have descriptive `aria-label` attributes\n * - Title text is the accessibility label for the current page context\n *\n * @example\n * ```tsx\n * // Small variant (default)\n * <AppBar\n * title=\"Page Title\"\n * navigationIcon={\n * <IconButton aria-label=\"Open navigation menu\">\n * <MenuIcon />\n * </IconButton>\n * }\n * actions={\n * <IconButton aria-label=\"Search\">\n * <SearchIcon />\n * </IconButton>\n * }\n * />\n *\n * // Center-aligned with scroll elevation\n * <AppBar\n * variant=\"center-aligned\"\n * title=\"My App\"\n * scrolled={isScrolled}\n * onScrollStateChange={setIsScrolled}\n * />\n *\n * // Medium with expanded title and subtitle\n * <AppBar\n * variant=\"medium\"\n * title=\"Article Title\"\n * subtitle=\"Author · 5 min read\"\n * navigationIcon={\n * <IconButton aria-label=\"Go back\">\n * <ArrowBackIcon />\n * </IconButton>\n * }\n * />\n * ```\n */\nexport const AppBar = forwardRef<HTMLElement, AppBarProps>(\n (\n {\n variant = \"small\",\n title,\n subtitle,\n navigationIcon,\n actions,\n scrolled: scrolledProp,\n onScrollStateChange,\n className,\n },\n ref\n ) => {\n const { isScrolled } = useScrollElevation({\n scrolled: scrolledProp,\n onScrollStateChange,\n });\n\n const isExpandedVariant = variant === \"medium\" || variant === \"large\";\n\n return (\n <AppBarHeadless\n ref={ref}\n // Pass scrolled as controlled (already resolved by useScrollElevation above)\n scrolled={isScrolled}\n className={cn(appBarVariants({ variant, scrolled: isScrolled }), className)}\n >\n {/* Top row: navigation icon + title (small/center-aligned) + actions */}\n <div\n data-slot=\"top-row\"\n className={cn(\n \"flex items-center justify-between\",\n \"px-1\",\n // Small and center-aligned: fill the full bar height\n !isExpandedVariant && \"flex-1\",\n // Expanded variants: fixed height for the top row (64dp)\n isExpandedVariant && \"h-16 shrink-0\"\n )}\n >\n {/* Navigation icon slot (leading) */}\n {navigationIcon != null && (\n <div data-slot=\"navigation\" className=\"flex shrink-0 items-center\">\n {navigationIcon}\n </div>\n )}\n\n {/* Title + subtitle — rendered in top row for small and center-aligned variants */}\n {!isExpandedVariant && (\n <div\n className={cn(\n \"flex min-w-0 flex-1 flex-col justify-center px-1\",\n variant === \"center-aligned\" && \"text-center\"\n )}\n >\n <span data-testid=\"appbar-title\" className={cn(appBarTitleVariants({ variant }))}>\n {title}\n </span>\n {subtitle != null && (\n <span\n data-testid=\"appbar-subtitle\"\n className={cn(appBarSubtitleVariants({ variant }))}\n >\n {subtitle}\n </span>\n )}\n </div>\n )}\n\n {/* Actions slot (trailing) */}\n {actions != null && (\n <div data-slot=\"actions\" className=\"flex shrink-0 items-center gap-0.5\">\n {actions}\n </div>\n )}\n </div>\n\n {/* Expanded title + subtitle row — only for medium and large variants */}\n {isExpandedVariant && (\n <div\n data-slot=\"expanded-title\"\n className={cn(\"flex flex-1 flex-col justify-end\", \"gap-0.5 px-4 pb-4\")}\n >\n <span\n data-testid=\"appbar-title\"\n className={cn(\"min-w-0\", appBarTitleVariants({ variant }))}\n >\n {title}\n </span>\n {subtitle != null && (\n <span\n data-testid=\"appbar-subtitle\"\n className={cn(\"min-w-0\", appBarSubtitleVariants({ variant }))}\n >\n {subtitle}\n </span>\n )}\n </div>\n )}\n </AppBarHeadless>\n );\n }\n);\n\nAppBar.displayName = \"AppBar\";\n","import { forwardRef, useRef } from \"react\";\nimport { useButton } from \"react-aria\";\nimport type { AriaButtonProps } from \"react-aria\";\nimport { mergeProps } from \"@react-aria/utils\";\n\n/**\n * Headless Button Component (Layer 2)\n *\n * Unstyled button primitive using React Aria for accessibility.\n * Provides behavior only - bring your own styles.\n *\n * Features:\n * - Full keyboard navigation (Enter, Space)\n * - Screen reader support\n * - Touch/pointer event handling\n * - Focus management\n * - Disabled state handling\n *\n * @example\n * ```tsx\n * // Use for custom styling\n * <ButtonHeadless className=\"custom-button-class\">\n * Click me\n * </ButtonHeadless>\n * ```\n */\nexport interface ButtonHeadlessProps extends AriaButtonProps {\n /**\n * Additional CSS classes\n */\n className?: string;\n\n /**\n * Button content\n */\n children: React.ReactNode;\n\n /**\n * Tab index for keyboard navigation\n * @default 0\n */\n tabIndex?: number;\n\n /**\n * Mouse down handler (for ripple effect)\n */\n onMouseDown?: (e: React.MouseEvent<HTMLButtonElement>) => void;\n}\n\nexport const ButtonHeadless = forwardRef<HTMLButtonElement, ButtonHeadlessProps>(\n ({ className, children, tabIndex = 0, onMouseDown, type, ...restProps }, forwardedRef) => {\n // Internal ref for React Aria\n const internalRef = useRef<HTMLButtonElement>(null);\n\n // Merge internal ref with forwarded ref\n const ref = (forwardedRef ?? internalRef) as React.RefObject<HTMLButtonElement>;\n\n // React Aria hook - handles all accessibility\n const { buttonProps } = useButton(\n {\n ...restProps,\n // Ensure element type is 'button' for proper semantics\n elementType: \"button\",\n },\n ref\n );\n\n // Filter out React Aria-specific props that shouldn't be on DOM elements\n const {\n isDisabled: _isDisabled,\n onPress: _onPress,\n onPressStart: _onPressStart,\n onPressEnd: _onPressEnd,\n onPressChange: _onPressChange,\n onPressUp: _onPressUp,\n ...htmlAttrs\n } = restProps;\n\n // Merge React Aria props with custom props and HTML attributes\n // Order matters: buttonProps first, then custom props/HTML attributes to allow overrides\n const mergedProps = mergeProps(\n buttonProps,\n {\n tabIndex,\n className,\n onMouseDown,\n },\n htmlAttrs // Pass through only HTML attributes (title, data-*, etc.)\n );\n\n return (\n // eslint-disable-next-line react/button-has-type -- type is dynamically passed from props\n <button {...mergedProps} ref={ref} type={type ?? \"button\"}>\n {children}\n </button>\n );\n }\n);\n\nButtonHeadless.displayName = \"ButtonHeadless\";\n","import { cva, type VariantProps } from \"class-variance-authority\";\n\n/**\n * Material Design 3 Button Variants\n *\n * Architecture: Variants vs States\n * - CVA holds design-time structure only (no disabled/loading state variants).\n * - All interaction states are driven by data-* attributes on the root via\n * group-data-[x]/button Tailwind selectors in each slot's base classes.\n * - Content flags (data-with-icon, data-loading) are set explicitly by the component.\n *\n * Slot responsibilities:\n * buttonVariants — root <button>; shape, color, elevation\n * buttonStateLayerVariants — hover/focus/press opacity ring (absolute inset overlay)\n * buttonFocusRingVariants — keyboard focus outline, MUST NOT be inside overflow-hidden\n * buttonIconVariants — leading/trailing icon wrapper\n * buttonLabelVariants — label text slot\n *\n * MD3 Spec:\n * Shape: rounded-full (corner-full)\n * Height: 32dp small | 40dp medium | 56dp large\n * Padding: 16dp small | 24dp medium | 32dp large (12dp text variant)\n * Icon size: 18px × 18px\n * State-layer opacities: hover 8% | focus 10% | pressed 10%\n * Disabled: container 12% opacity, content 38% opacity\n *\n * Elevation per state (MD3 comp tokens):\n * Filled base=0 hover=1 focus=0 pressed=0\n * Tonal base=0 hover=1 focus=0 pressed=0\n * Elevated base=1 hover=2 focus=1 pressed=1\n * Outlined base=0 hover=0 focus=0 pressed=0\n * Text base=0 hover=0 focus=0 pressed=0\n */\n\n// ─── BUTTON ROOT / CONTAINER ─────────────────────────────────────────────────\n\n/**\n * Root <button> element.\n *\n * IMPORTANT — overflow is intentionally NOT on the root.\n * Overflow clipping is delegated to the ripple container and state layer\n * via `overflow-hidden rounded-[inherit]` on those children. This lets the\n * focus ring span (`inset-[-3px]`) extend outside the button boundary and\n * remain fully visible — if overflow-hidden were on the root it would be\n * clipped to zero width.\n */\nexport const buttonVariants = cva(\n [\n // Layout + shape — NO overflow-hidden here (see note above)\n \"relative inline-flex items-center justify-center\",\n \"rounded-full cursor-pointer select-none\",\n // Split MD3 transition: spatial (border-radius) → expressive spring;\n // effects (color/bg/shadow) → standard effects spring.\n \"btn-transition\",\n // Disabled — self-targeting data-[x]: selectors\n \"data-[disabled]:cursor-not-allowed data-[disabled]:pointer-events-none\",\n ],\n {\n variants: {\n /**\n * Button variant (MD3 specification — strict, no color override)\n *\n * Elevation per state follows _md-comp-*-button.scss tokens:\n * Filled/Tonal hover→level-1, focus/pressed→level-0\n * Elevated base→level-1, hover→level-2, focus/pressed→level-1\n * Outlined/Text no elevation\n */\n variant: {\n /**\n * Filled — highest emphasis.\n * MD3: container=primary, label=on-primary, state-layer=on-primary\n * Elevation: 0 base → 1 hover → 0 focus → 0 pressed\n */\n filled: [\n \"bg-primary text-on-primary shadow-none\",\n // Hover: gains level-1 elevation\n \"group-data-[hovered]/button:shadow-elevation-1\",\n // Focus/pressed: shadow must explicitly return to level-0\n // (doubled attribute selector → higher specificity than hover)\n \"group-data-[focus-visible]/button:shadow-none\",\n \"group-data-[pressed]/button:group-data-[pressed]/button:shadow-none\",\n // Disabled overrides\n \"group-data-[disabled]/button:bg-on-surface/12\",\n \"group-data-[disabled]/button:text-on-surface/38\",\n \"group-data-[disabled]/button:shadow-none\",\n ],\n\n /**\n * Outlined — medium emphasis. Transparent with border.\n * MD3: container=transparent, outline=outline, label=primary, state-layer=primary\n * Elevation: always 0\n */\n outlined: [\n \"bg-transparent border border-outline text-primary\",\n // Disabled overrides\n \"group-data-[disabled]/button:border-on-surface/12\",\n \"group-data-[disabled]/button:text-on-surface/38\",\n ],\n\n /**\n * Tonal — secondary emphasis.\n * MD3 name: \"Filled tonal\". container=secondary-container, label=on-secondary-container\n * Elevation: 0 base → 1 hover → 0 focus → 0 pressed\n */\n tonal: [\n \"bg-secondary-container text-on-secondary-container shadow-none\",\n // Hover: gains level-1 elevation (same as filled)\n \"group-data-[hovered]/button:shadow-elevation-1\",\n // Focus/pressed: return to level-0\n \"group-data-[focus-visible]/button:shadow-none\",\n \"group-data-[pressed]/button:group-data-[pressed]/button:shadow-none\",\n // Disabled overrides\n \"group-data-[disabled]/button:bg-on-surface/12\",\n \"group-data-[disabled]/button:text-on-surface/38\",\n \"group-data-[disabled]/button:shadow-none\",\n ],\n\n /**\n * Elevated — separation via shadow.\n * MD3: container=surface-container-low, label=primary\n * Elevation: 1 base → 2 hover → 1 focus → 1 pressed\n */\n elevated: [\n \"bg-surface-container-low text-primary shadow-elevation-1\",\n // Hover: gains extra elevation\n \"group-data-[hovered]/button:shadow-elevation-2\",\n // Focus/pressed: return to base level-1\n // (doubled selector wins over single hover selector at same cascade position)\n \"group-data-[focus-visible]/button:shadow-elevation-1\",\n \"group-data-[pressed]/button:group-data-[pressed]/button:shadow-elevation-1\",\n // Disabled overrides\n \"group-data-[disabled]/button:bg-on-surface/12\",\n \"group-data-[disabled]/button:text-on-surface/38\",\n \"group-data-[disabled]/button:shadow-none\",\n ],\n\n /**\n * Text — lowest emphasis.\n * MD3: container=transparent, label=primary, state-layer=primary\n * Elevation: always 0\n */\n text: [\n \"bg-transparent text-primary\",\n // Disabled overrides\n \"group-data-[disabled]/button:text-on-surface/38\",\n ],\n },\n\n /**\n * Button size\n * MD3 spec: small=32dp, medium=40dp, large=56dp\n * Padding: small=16dp, medium=24dp, large=32dp\n * Text variant uses reduced padding: small=12dp, medium=12dp\n */\n size: {\n small: \"h-8 px-4 gap-1 text-label-medium tracking-[0.1px]\",\n medium: \"h-10 px-6 gap-2 text-label-large tracking-[0.1px]\",\n large: \"h-14 px-8 gap-2 text-title-medium\",\n },\n\n /**\n * Full width button (spans container)\n */\n fullWidth: {\n true: \"w-full\",\n false: \"\",\n },\n },\n\n /**\n * Compound variants for text variant reduced padding per size\n * MD3: text buttons use 12dp padding (px-3) instead of standard padding\n */\n compoundVariants: [\n { variant: \"text\", size: \"small\", className: \"px-3\" },\n { variant: \"text\", size: \"medium\", className: \"px-3\" },\n { variant: \"text\", size: \"large\", className: \"px-4\" },\n ],\n\n defaultVariants: {\n variant: \"filled\",\n size: \"medium\",\n fullWidth: false,\n },\n }\n);\n\n// ─── STATE LAYER ─────────────────────────────────────────────────────────────\n\n/**\n * State layer — absolute inset overlay that transitions opacity on interaction.\n *\n * Color is variant-specific (uses the \"on-container\" role per MD3):\n * filled → bg-on-primary\n * outlined → bg-primary\n * tonal → bg-on-secondary-container\n * elevated → bg-primary\n * text → bg-primary\n *\n * Opacity:\n * 0 at rest\n * 8% hover\n * 10% focus/pressed\n * hidden when disabled\n *\n * Pressed (10%) must win over hover (8%) when both data attributes are set\n * simultaneously. The doubled attribute selector for pressed gives it higher\n * specificity than the singly-chained hover selector:\n * group-data-[hovered]/button: → specificity (0,1,0) relative weight\n * group-data-[pressed]/button:group-... → specificity (0,2,0) always wins\n *\n * overflow-hidden is placed HERE (not on the root button) so the state layer\n * clips to the button shape while the focus ring span can extend outside.\n */\nexport const buttonStateLayerVariants = cva(\n [\n \"absolute inset-0 rounded-[inherit] overflow-hidden pointer-events-none opacity-0\",\n // Effects transition for opacity — standard spring, no overshoot\n \"transition-opacity duration-spring-standard-fast-effects ease-spring-standard-fast-effects\",\n // Hover: 8%\n \"group-data-[hovered]/button:opacity-8\",\n // Focus: 10%\n \"group-data-[focus-visible]/button:opacity-10\",\n // Pressed: 10%, doubled selector wins over hover\n \"group-data-[pressed]/button:group-data-[pressed]/button:opacity-10\",\n // No state layer when disabled\n \"group-data-[disabled]/button:hidden\",\n ],\n {\n variants: {\n variant: {\n filled: \"bg-on-primary\",\n outlined: \"bg-primary\",\n tonal: \"bg-on-secondary-container\",\n elevated: \"bg-primary\",\n text: \"bg-primary\",\n },\n },\n defaultVariants: { variant: \"filled\" },\n }\n);\n\n// ─── FOCUS RING ───────────────────────────────────────────────────────────────\n\n/**\n * Focus ring overlay.\n *\n * Rendered as an absolute `<span>` with `inset-[-3px]` so it extends 3px\n * outside the button boundary. This REQUIRES that `overflow-hidden` is NOT\n * on the root `<button>` element — overflow clipping is moved to the ripple\n * container and state layer instead.\n *\n * The ring is always present in the DOM (opacity-0 at rest) and transitions\n * to opacity-100 on keyboard/programmatic focus, which avoids layout shifts\n * and allows the CSS transition to animate it smoothly.\n */\nexport const buttonFocusRingVariants = cva([\n \"pointer-events-none absolute inset-[-3px] rounded-full\",\n \"outline outline-2 outline-offset-0 outline-secondary\",\n // Effects transition — opacity change must not overshoot\n \"transition-opacity duration-spring-standard-fast-effects ease-spring-standard-fast-effects\",\n \"opacity-0\",\n \"group-data-[focus-visible]/button:opacity-100\",\n]);\n\n// ─── ICON ─────────────────────────────────────────────────────────────────────\n\n/**\n * Icon wrapper (leading or trailing).\n *\n * MD3 spec: icons inside buttons must be 18×18px.\n * Color is inherited from the parent button's text color.\n * `invisible` (not `hidden`) when loading — keeps layout stable so the\n * spinner can take the same space without reflowing adjacent content.\n */\nexport const buttonIconVariants = cva(\n [\n \"relative z-10 inline-flex shrink-0 items-center justify-center\",\n \"size-[18px]\",\n // Color transition uses effects token (no spatial overshoot on color)\n \"transition-colors duration-spring-standard-fast-effects ease-spring-standard-fast-effects\",\n ],\n {\n variants: {\n hidden: {\n true: \"invisible\",\n false: \"\",\n },\n },\n defaultVariants: { hidden: false },\n }\n);\n\n// ─── LABEL ────────────────────────────────────────────────────────────────────\n\n/**\n * Label text wrapper.\n * Typography + color are inherited from the root buttonVariants classes.\n * z-10 keeps it above the state layer and ripple overlays.\n */\nexport const buttonLabelVariants = cva([\"relative z-10 inline-flex items-center\"]);\n\n// ─── EXPORTED TYPES ───────────────────────────────────────────────────────────\n\nexport type ButtonVariants = VariantProps<typeof buttonVariants>;\nexport type ButtonStateLayerVariants = VariantProps<typeof buttonStateLayerVariants>;\nexport type ButtonIconVariants = VariantProps<typeof buttonIconVariants>;\nexport type ButtonLabelVariants = VariantProps<typeof buttonLabelVariants>;\n","\"use client\";\n\nimport { useEffect, useState } from \"react\";\n\nconst QUERY = \"(prefers-reduced-motion: reduce)\";\n\n/**\n * Detects whether the user has requested reduced motion via their OS\n * accessibility settings. Returns `true` when `prefers-reduced-motion: reduce`\n * matches, allowing components to skip or simplify animations.\n *\n * Falls back to `false` during SSR or when `matchMedia` is unavailable.\n */\nexport function useReducedMotion(): boolean {\n const [reduced, setReduced] = useState(() => {\n if (typeof window === \"undefined\") return false;\n return window.matchMedia(QUERY).matches;\n });\n\n useEffect(() => {\n const mql = window.matchMedia(QUERY);\n const handler = (e: MediaQueryListEvent): void => setReduced(e.matches);\n\n mql.addEventListener(\"change\", handler);\n return () => mql.removeEventListener(\"change\", handler);\n }, []);\n\n return reduced;\n}\n","import { useRef, useCallback, useState, useEffect, type MouseEvent } from \"react\";\nimport { useReducedMotion } from \"./useReducedMotion\";\n\n/**\n * Ripple state for tracking individual ripple animations\n */\ninterface Ripple {\n key: number;\n x: number;\n y: number;\n size: number;\n}\n\n/**\n * Options for useRipple hook\n */\ninterface UseRippleOptions {\n /**\n * Disable ripple effect\n * @default false\n */\n disabled?: boolean;\n\n /**\n * Color of the ripple (currentColor by default)\n */\n color?: string;\n\n /**\n * Duration of ripple animation in ms.\n * Must match the `--animate-md-ripple` token duration (450ms).\n * @default 450\n */\n duration?: number;\n}\n\n/**\n * Hook for Material Design 3 ripple effect.\n *\n * Creates a ripple animation that emanates from the pointer-down origin,\n * expanding to cover the entire container element. Uses the `animate-md-ripple`\n * composite token (md-ripple keyframe + 450ms emphasized spatial curve) so\n * the animation is always in sync with the MD3 motion system.\n *\n * Automatically respects `prefers-reduced-motion`: when the OS/browser\n * requests reduced motion the ripple is fully suppressed (no DOM nodes are\n * created, no JS timers fire). This is a non-negotiable accessibility\n * requirement per `md3-motion.mdc`.\n *\n * @example\n * ```tsx\n * function MyButton() {\n * const { onMouseDown, ripples } = useRipple();\n *\n * return (\n * <button onMouseDown={onMouseDown}>\n * Click me\n * {ripples}\n * </button>\n * );\n * }\n * ```\n */\nexport function useRipple(options: UseRippleOptions = {}): {\n onMouseDown: (event: MouseEvent<HTMLElement>) => void;\n ripples: React.ReactNode;\n} {\n const { disabled = false, color = \"currentColor\", duration = 450 } = options;\n\n // MD3 motion rule: JS-driven animations must gate on useReducedMotion().\n // When reduced motion is preferred, suppress the ripple entirely —\n // do not just shorten it (shortened motion can still cause discomfort).\n const prefersReducedMotion = useReducedMotion();\n\n const [ripples, setRipples] = useState<Ripple[]>([]);\n const rippleKeyCounter = useRef(0);\n const timersRef = useRef<Array<ReturnType<typeof setTimeout>>>([]);\n\n useEffect(() => {\n return () => {\n timersRef.current.forEach(clearTimeout);\n };\n }, []);\n\n /**\n * Create ripple on pointer down (mouse or touch)\n */\n const onMouseDown = useCallback(\n (event: MouseEvent<HTMLElement>) => {\n if (disabled || prefersReducedMotion) return;\n\n const element = event.currentTarget;\n const rect = element.getBoundingClientRect();\n\n // Position relative to the element's own coordinate system\n const x = event.clientX - rect.left;\n const y = event.clientY - rect.top;\n\n // Diameter that guarantees coverage of all four corners\n const sizeX = Math.max(x, rect.width - x);\n const sizeY = Math.max(y, rect.height - y);\n const size = Math.sqrt(sizeX ** 2 + sizeY ** 2) * 2;\n\n const key = rippleKeyCounter.current++;\n\n setRipples((prev) => [...prev, { key, x, y, size }]);\n\n // Remove after animation completes so DOM stays clean\n const timer = setTimeout(() => {\n setRipples((prev) => prev.filter((r) => r.key !== key));\n timersRef.current = timersRef.current.filter((t) => t !== timer);\n }, duration);\n timersRef.current.push(timer);\n },\n [disabled, duration, prefersReducedMotion]\n );\n\n /**\n * Ripple container and individual ripple elements.\n *\n * animate-md-ripple — MD3 composite token: md-ripple keyframe + 450ms\n * cubic-bezier(0.2, 0, 0, 1) (emphasized spatial)\n * opacity-12 — MD3 press state layer opacity for ripple fill\n * rounded-full — circular ripple shape\n */\n const rippleElements =\n disabled || prefersReducedMotion ? null : (\n <span\n data-ripple-container\n className=\"pointer-events-none absolute inset-0 overflow-hidden rounded-[inherit]\"\n >\n {ripples.map((ripple) => (\n <span\n key={ripple.key}\n className=\"animate-md-ripple absolute rounded-full opacity-12\"\n style={{\n left: ripple.x,\n top: ripple.y,\n width: ripple.size,\n height: ripple.size,\n transform: \"translate(-50%, -50%) scale(0)\",\n backgroundColor: color,\n animationDuration: `${duration}ms`,\n }}\n />\n ))}\n </span>\n );\n\n return {\n onMouseDown,\n ripples: rippleElements,\n };\n}\n","import { createContext, useContext } from \"react\";\nimport type React from \"react\";\nimport type { ButtonGroupContextValue } from \"./ButtonGroup.types\";\n\n/**\n * Context that provides ButtonGroup state to all child buttons.\n *\n * Consumed via `useButtonGroup()` hook inside child components\n * (Button, IconButton, or any custom button primitive).\n *\n * @example\n * ```tsx\n * // Inside a child button component\n * const { variant, size, selectedValues, onSelectionChange } = useButtonGroup();\n * ```\n */\nexport const ButtonGroupContext = createContext<ButtonGroupContextValue | null>(null);\n\nButtonGroupContext.displayName = \"ButtonGroupContext\";\n\n/**\n * Hook for consuming ButtonGroup context inside child button components.\n *\n * @throws When called outside of a `ButtonGroup` or `ButtonGroupHeadless` container.\n *\n * @example\n * ```tsx\n * const MyButton = ({ value, children }: { value: string; children: React.ReactNode }) => {\n * const { selectedValues, onSelectionChange, variant } = useButtonGroup();\n * return (\n * <button\n * aria-pressed={selectedValues.has(value)}\n * onClick={() => onSelectionChange(value)}\n * >\n * {children}\n * </button>\n * );\n * };\n * ```\n */\nexport function useButtonGroup(): ButtonGroupContextValue {\n const ctx = useContext(ButtonGroupContext);\n if (ctx === null) {\n throw new Error(\n \"[ButtonGroup] useButtonGroup() must be used inside a <ButtonGroup> or <ButtonGroupHeadless>.\"\n );\n }\n return ctx;\n}\n\n/**\n * Optional hook for consuming ButtonGroup context inside child button components.\n *\n * Unlike `useButtonGroup()`, this hook does **not** throw when called outside a group.\n * Use this inside `Button` and `IconButton` so they can read group metadata when\n * rendered inside a `ButtonGroup` but still work standalone.\n *\n * Returns `null` when called outside a `<ButtonGroup>` or `<ButtonGroupHeadless>`.\n *\n * @example\n * ```tsx\n * // Inside Button or IconButton\n * const groupCtx = useOptionalButtonGroup();\n * const isConnected = groupCtx?.variant === 'connected';\n * ```\n */\nexport function useOptionalButtonGroup(): ButtonGroupContextValue | null {\n return useContext(ButtonGroupContext);\n}\n\n/**\n * Props for `ButtonGroupProvider`\n */\nexport interface ButtonGroupProviderProps {\n /** The context value to provide to all children */\n value: ButtonGroupContextValue;\n /** Child button components */\n children: React.ReactNode;\n}\n\n/**\n * Provider component that wraps children with ButtonGroupContext.\n *\n * Used internally by `ButtonGroupHeadless`. You should rarely need\n * to use this directly — prefer `ButtonGroup` or `ButtonGroupHeadless`.\n */\nexport function ButtonGroupProvider({\n value,\n children,\n}: ButtonGroupProviderProps): React.ReactElement {\n return <ButtonGroupContext.Provider value={value}>{children}</ButtonGroupContext.Provider>;\n}\n","import type {\n ButtonGroupContextValue,\n ButtonGroupShape,\n ButtonGroupSize,\n} from \"./ButtonGroup.types\";\n\n/**\n * Static lookup table for connected-variant inner corner radii.\n *\n * \"Inner\" corners are the adjacent sides of every button in a connected group.\n * These values are applied to ALL four corners first, then the outer corners of\n * the first/last buttons are selectively overridden with `OUTER_RADIUS_*`.\n *\n * All class strings are written statically here so that Tailwind v4 can detect\n * them during the build-time class scan.\n *\n * MD3 spec values (dp → Tailwind tokens):\n * extra-small = 4dp → rounded-xs (--radius-xs = 4px)\n * small = 8dp → rounded-sm (--radius-sm = 8px)\n * medium = 8dp → rounded-sm\n * large = 16dp → rounded-lg (--radius-lg = 16px)\n * extra-large = 20dp → rounded-[20px] (no matching token; --radius-xl is 28px)\n */\nconst INNER_RADIUS: Record<ButtonGroupSize, string> = {\n \"extra-small\": \"rounded-xs\",\n small: \"rounded-sm\",\n medium: \"rounded-sm\",\n large: \"rounded-lg\",\n \"extra-large\": \"rounded-[20px]\",\n};\n\n/**\n * Outer corner radius for the \"round\" shape: always full (pill).\n */\nconst OUTER_RADIUS_ROUND = \"rounded-full\";\n\n/**\n * Outer corner radius lookup for the \"square\" shape.\n * Outer corners are the same value as inner corners (no distinction in square mode).\n */\nconst OUTER_RADIUS_SQUARE: Record<ButtonGroupSize, string> = {\n \"extra-small\": \"rounded-xs\",\n small: \"rounded-sm\",\n medium: \"rounded-sm\",\n large: \"rounded-lg\",\n \"extra-large\": \"rounded-[20px]\",\n};\n\n/**\n * Static class arrays for all (shape × size) combinations in the connected variant.\n *\n * Each array contains:\n * [0] Inner radius class (applied to all corners of every button)\n * … `first:` / `last:` overrides using **logical** `rounded-s-*` / `rounded-e-*` so\n * outer vs inner corners stay correct in LTR and RTL.\n *\n * `round` shape: outer (exposed) corners use a graduated radius per size tier to avoid sharp\n * contrast at the join — xs→`rounded-s-lg`, sm→`rounded-s-xl`, md→`rounded-s-3xl`,\n * lg/xl→`rounded-s-4xl`. Inner (adjacent) corners shrink per size tier — xs=4dp, sm/md=8dp,\n * lg=16dp, xl=20dp.\n *\n * `square` shape: outer corners are the same as inner corners — uniform radius on all\n * four corners of every button. No distinction between outer and inner edges.\n *\n * Writing the full class strings statically (not via string concatenation) ensures\n * the Tailwind CSS v4 scanner can detect all classes at build time.\n */\nconst CONNECTED_RADIUS_CLASSES: Record<\n ButtonGroupShape,\n Record<ButtonGroupSize, readonly string[]>\n> = {\n round: {\n \"extra-small\": [\"rounded-xs\", \"first:rounded-s-lg\", \"last:rounded-e-lg\"],\n small: [\"rounded-sm\", \"first:rounded-s-xl\", \"last:rounded-e-xl\"],\n medium: [\"rounded-sm\", \"first:rounded-s-3xl\", \"last:rounded-e-3xl\"],\n large: [\"rounded-lg\", \"first:rounded-s-4xl\", \"last:rounded-e-4xl\"],\n \"extra-large\": [\"rounded-[20px]\", \"first:rounded-s-4xl\", \"last:rounded-e-4xl\"],\n },\n square: {\n \"extra-small\": [\"rounded-xs\", \"first:rounded-s-xs\", \"last:rounded-e-xs\"],\n small: [\"rounded-sm\", \"first:rounded-s-sm\", \"last:rounded-e-sm\"],\n medium: [\"rounded-sm\", \"first:rounded-s-sm\", \"last:rounded-e-sm\"],\n large: [\"rounded-lg\", \"first:rounded-s-lg\", \"last:rounded-e-lg\"],\n \"extra-large\": [\"rounded-[20px]\", \"first:rounded-s-[20px]\", \"last:rounded-e-[20px]\"],\n },\n};\n\n/**\n * Returns the Tailwind class strings for connected-variant corner radius overrides.\n *\n * Call this inside `Button` or `IconButton` when `variant === 'connected'` is\n * detected from `useOptionalButtonGroup()`. The returned classes:\n *\n * 1. Override the button's default `rounded-full` with the correct inner radius\n * 2. Use `first:rounded-s-*` to restore outer corners on the first button\n * 3. Use `last:rounded-e-*` to restore outer corners on the last button\n *\n * Relies on CSS pseudo-class specificity — no React-level child enumeration needed.\n *\n * @example\n * ```tsx\n * const groupCtx = useOptionalButtonGroup();\n * if (groupCtx?.variant === 'connected') {\n * const radiusClasses = getConnectedRadiusClasses(groupCtx);\n * // → ['rounded-sm', 'first:rounded-s-3xl', 'last:rounded-e-3xl']\n * }\n * ```\n */\nexport function getConnectedRadiusClasses(\n ctx: ButtonGroupContextValue,\n value?: string\n): readonly string[] {\n const connectedClasses = CONNECTED_RADIUS_CLASSES[ctx.shape][ctx.size];\n if (value && ctx.selectedValues.has(value)) {\n // round: morph to full pill on selection (MD3 segmented button selected state)\n // square: keep uniform inner radius — no pill morph in square mode\n return ctx.shape === \"round\" ? [\"rounded-full\"] : [INNER_RADIUS[ctx.size]];\n }\n return connectedClasses;\n}\n\n/**\n * Returns the inner corner radius Tailwind class for a given size.\n * Useful when computing context values in the headless layer.\n */\nexport function getInnerRadius(size: ButtonGroupSize): string {\n return INNER_RADIUS[size];\n}\n\n/**\n * Returns the outer corner radius Tailwind class for a given shape + size.\n * Useful when computing context values in the headless layer.\n */\nexport function getOuterRadius(shape: ButtonGroupShape, size: ButtonGroupSize): string {\n if (shape === \"round\") return OUTER_RADIUS_ROUND;\n return OUTER_RADIUS_SQUARE[size];\n}\n","\"use client\";\n\nimport { forwardRef, useRef, useState, useCallback } from \"react\";\nimport type React from \"react\";\nimport { useHover, useFocusRing, mergeProps } from \"react-aria\";\nimport { ButtonHeadless } from \"./ButtonHeadless\";\nimport {\n buttonVariants,\n buttonStateLayerVariants,\n buttonFocusRingVariants,\n buttonIconVariants,\n buttonLabelVariants,\n type ButtonVariants,\n} from \"./Button.variants\";\nimport { cn } from \"../../utils/cn\";\nimport { getInteractionDataAttributes } from \"../../utils/interactionStates\";\nimport { useRipple } from \"../../hooks/useRipple\";\nimport { useOptionalButtonGroup } from \"../ButtonGroup/ButtonGroupContext\";\nimport { getConnectedRadiusClasses } from \"../ButtonGroup/ButtonGroup.utils\";\nimport type { ButtonProps } from \"./Button.types\";\n\n/**\n * Loading spinner component\n */\nconst Spinner = (): React.ReactElement => (\n <svg\n role=\"progressbar\"\n aria-label=\"Loading\"\n className=\"relative z-10 h-[18px] w-[18px] animate-spin\"\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <circle className=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"4\" />\n <path\n className=\"opacity-75\"\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\n />\n </svg>\n);\n\n/**\n * Material Design 3 Button Component (Layer 3: Styled)\n *\n * Built on React Aria for world-class accessibility.\n * Implements the Variants-vs-States architecture: all interaction states are\n * expressed as data-* attributes on the root and consumed by each slot via\n * group-data-[x]/button Tailwind selectors — no state variants in CVA.\n *\n * Features:\n * - ✅ 5 MD3 variants: filled, outlined, tonal, elevated, text\n * - ✅ 3 sizes: small (32dp), medium (40dp), large (56dp)\n * - ✅ Loading state with spinner\n * - ✅ Ripple effect (Material Design)\n * - ✅ Proper MD3 state layer (hover 8%, focus 10%, pressed 10%)\n * - ✅ Full keyboard accessibility (via React Aria)\n * - ✅ Screen reader support (via React Aria)\n * - ✅ Focus management (via React Aria)\n * - ✅ ButtonGroup-aware: applies connected corner radii and min-width when inside a group\n *\n * MD3 Specifications:\n * - Height: 40dp (medium), 32dp (small), 56dp (large)\n * - Typography: Label Large (medium), Label Medium (small), Title Medium (large)\n * - Icon size: 18px × 18px (per MD3 spec)\n * - State layers: 8% hover, 10% focus/pressed\n * - Elevation: Level 1 on hover (filled), Level 1 base → Level 2 hover (elevated)\n *\n * @example\n * ```tsx\n * // Basic usage\n * <Button>Click me</Button>\n *\n * // With variant\n * <Button variant=\"outlined\">Secondary Action</Button>\n *\n * // With icon (MD3 spec: icons are 18px × 18px)\n * <Button icon={<IconAdd className=\"h-[18px] w-[18px]\" />}>\n * Add Item\n * </Button>\n *\n * // Loading state\n * <Button loading>Saving...</Button>\n *\n * // Disabled\n * <Button isDisabled>Disabled</Button>\n *\n * // Full width\n * <Button fullWidth>Full Width Button</Button>\n *\n * // Inside a connected ButtonGroup\n * <ButtonGroup variant=\"connected\" selectionMode=\"required\" defaultValue=\"md\">\n * <Button value=\"sm\">S</Button>\n * <Button value=\"md\">M</Button>\n * <Button value=\"lg\">L</Button>\n * </ButtonGroup>\n * ```\n */\nexport const Button = forwardRef<HTMLButtonElement, ButtonProps & Omit<ButtonVariants, never>>(\n (\n {\n // Variant props (CVA)\n variant = \"filled\",\n size = \"medium\",\n fullWidth = false,\n\n // Content props\n icon,\n trailingIcon,\n children,\n\n // State props\n loading = false,\n disableRipple = false,\n isDisabled = false,\n\n // Styling\n className,\n\n // Other button props\n tabIndex = 0,\n type = \"button\",\n\n // Passed through to ButtonHeadless → useButton\n ...props\n },\n ref\n ) => {\n const buttonRef = useRef<HTMLButtonElement>(null);\n const resolvedRef = (ref ?? buttonRef) as React.RefObject<HTMLButtonElement>;\n\n // ButtonGroup context — null when rendered outside a group\n const groupCtx = useOptionalButtonGroup();\n const isConnected = groupCtx?.variant === \"connected\";\n\n // Combined disabled state (loading also disables)\n const isButtonDisabled = isDisabled || loading;\n\n // ── Interaction state tracking ───────────────────────────────────────────\n // isPressed is tracked via onPressStart/onPressEnd forwarded to useButton,\n // which avoids competing with ButtonHeadless's own useButton press handling.\n const [isPressed, setIsPressed] = useState(false);\n const handlePressStart = useCallback(() => setIsPressed(true), []);\n const handlePressEnd = useCallback(() => setIsPressed(false), []);\n\n const { isHovered, hoverProps } = useHover({ isDisabled: isButtonDisabled });\n const { isFocusVisible, focusProps } = useFocusRing();\n\n // Ripple effect\n const { onMouseDown: handleRipple, ripples } = useRipple({\n disabled: isButtonDisabled || disableRipple,\n });\n\n // Connected group radius + min-width overrides\n const buttonValue = (props as { value?: string | undefined }).value;\n const isGroupSelected =\n isConnected && groupCtx && buttonValue ? groupCtx.selectedValues.has(buttonValue) : false;\n\n const connectedClasses =\n isConnected && groupCtx\n ? [\n ...getConnectedRadiusClasses(groupCtx, buttonValue),\n groupCtx.enforceMinWidth ? \"min-w-12\" : \"\",\n ]\n : [];\n\n const hasIcon = !!icon || !!trailingIcon;\n\n if (process.env.NODE_ENV === \"development\") {\n if (!children) {\n console.warn(\n \"[Button] Button should have text content. Use IconButton for icon-only buttons.\"\n );\n }\n }\n\n return (\n <ButtonHeadless\n {...mergeProps(\n hoverProps,\n focusProps,\n // Track pressed state via useButton's press lifecycle callbacks,\n // rather than a separate usePress hook, to avoid event handler conflicts.\n { onPressStart: handlePressStart, onPressEnd: handlePressEnd },\n props\n )}\n ref={resolvedRef}\n type={type}\n isDisabled={isButtonDisabled}\n tabIndex={tabIndex}\n onMouseDown={handleRipple}\n // ── Interaction data attributes ──────────────────────────────────────\n {...getInteractionDataAttributes({\n isHovered,\n isFocusVisible,\n isPressed,\n isDisabled: isButtonDisabled,\n })}\n // ── Content flags ────────────────────────────────────────────────────\n data-variant={variant}\n data-with-icon={hasIcon ? \"\" : undefined}\n data-loading={loading ? \"\" : undefined}\n // ── Connected group selection state ──────────────────────────────────\n // Used to switch border-radius easing: expressive (select) vs decelerate (deselect).\n // btn-transition-selected overrides --_btn-radius-easing to the bouncy spring only\n // while the button is gaining the pill shape; removal restores safe decelerate easing\n // for the pill→inner-radius return, eliminating the overshoot-to-0px flicker.\n data-group-selected={isGroupSelected ? \"\" : undefined}\n className={cn(\n buttonVariants({ variant, size, fullWidth }),\n // group/button: enables group-data-[x]/button child selectors in all slots\n // (added here, not in CVA, following the Switch pattern)\n \"group/button\",\n // Asymmetric border-radius easing: expressive when selected, decelerate when not\n isGroupSelected ? \"btn-transition-selected\" : \"\",\n // Connected group overrides: inner radius + start/end outer radius + min-width\n ...connectedClasses,\n // User custom classes\n className\n )}\n >\n {/* Ripple effect */}\n {ripples}\n\n {/* State layer — absolute overlay that transitions opacity on interaction */}\n <span className={cn(buttonStateLayerVariants({ variant }))} aria-hidden=\"true\" />\n\n {/* Focus ring — absolute overlay rendered above state layer */}\n <span className={cn(buttonFocusRingVariants())} aria-hidden=\"true\" />\n\n {/* Leading icon (invisible, not hidden, when loading so layout is stable) */}\n {icon && <span className={cn(buttonIconVariants({ hidden: loading }))}>{icon}</span>}\n\n {/* Loading spinner (replaces icon position) */}\n {loading && <Spinner />}\n\n {/* Label */}\n <span className={cn(buttonLabelVariants())}>{children}</span>\n\n {/* Trailing icon (invisible when loading) */}\n {trailingIcon && (\n <span className={cn(buttonIconVariants({ hidden: loading }))}>{trailingIcon}</span>\n )}\n </ButtonHeadless>\n );\n }\n);\n\nButton.displayName = \"Button\";\n","import { forwardRef, useId, useRef, useState } from \"react\";\nimport type React from \"react\";\nimport { ButtonGroupProvider } from \"./ButtonGroupContext\";\nimport { getInnerRadius, getOuterRadius } from \"./ButtonGroup.utils\";\nimport type { ButtonGroupProps } from \"./ButtonGroup.types\";\n\n/**\n * Headless ButtonGroup Component (Layer 2)\n *\n * Unstyled group container using a `<div role=\"group\">` for semantic grouping.\n * Provides behavior only — bring your own styles via the styled `ButtonGroup`\n * or your own className.\n *\n * Responsibilities:\n * - Renders a non-focusable `<div role=\"group\">` (ARIA group landmark)\n * - Manages selection state (uncontrolled) or delegates to parent (controlled)\n * - Provides all group metadata to children via `ButtonGroupContext`\n *\n * @example\n * ```tsx\n * // Uncontrolled with default value\n * <ButtonGroupHeadless selectionMode=\"single\" defaultValue=\"medium\" className=\"flex gap-2\">\n * <MyButton value=\"small\">Small</MyButton>\n * <MyButton value=\"medium\">Medium</MyButton>\n * <MyButton value=\"large\">Large</MyButton>\n * </ButtonGroupHeadless>\n *\n * // Controlled\n * <ButtonGroupHeadless\n * selectionMode=\"multi\"\n * selectedValues={selected}\n * onSelectionChange={setSelected}\n * className=\"inline-flex gap-[18px]\"\n * >\n * <MyButton value=\"b\">Bold</MyButton>\n * <MyButton value=\"i\">Italic</MyButton>\n * </ButtonGroupHeadless>\n * ```\n */\nexport const ButtonGroupHeadless = forwardRef<HTMLDivElement, ButtonGroupProps>(\n (\n {\n // Group configuration\n variant = \"standard\",\n size = \"medium\",\n shape = \"round\",\n selectionMode,\n isDisabled = false,\n\n // Selection — controlled\n selectedValues: controlledValues,\n onSelectionChange: onControlledChange,\n\n // Selection — uncontrolled\n defaultValue,\n\n // DOM\n children,\n className,\n ...htmlProps\n },\n forwardedRef\n ) => {\n const internalRef = useRef<HTMLDivElement>(null);\n const ref = (forwardedRef ?? internalRef) as React.RefObject<HTMLDivElement>;\n\n // Generate stable id for the group\n const groupId = useId();\n\n // Derive initial uncontrolled set from defaultValue\n const initialSelected = (): Set<string> => {\n if (!defaultValue) return new Set<string>();\n return new Set<string>(Array.isArray(defaultValue) ? defaultValue : [defaultValue]);\n };\n\n // Uncontrolled selection state (only used when selectedValues is NOT provided)\n const [uncontrolledValues, setUncontrolledValues] = useState<Set<string>>(initialSelected);\n\n const isControlled = controlledValues !== undefined;\n const selectedValues = isControlled ? controlledValues : uncontrolledValues;\n\n /**\n * Handles selection change from child buttons.\n * Computes the new Set according to the selectionMode and notifies the parent.\n */\n const handleSelectionChange = (value: string): void => {\n if (!selectionMode || isDisabled) return;\n\n let nextValues: Set<string>;\n\n if (selectionMode === \"multi\") {\n nextValues = new Set(selectedValues);\n if (nextValues.has(value)) {\n nextValues.delete(value);\n } else {\n nextValues.add(value);\n }\n } else if (selectionMode === \"required\") {\n // Must always have exactly one selected — pressing the current selection is a no-op\n if (selectedValues.has(value)) {\n nextValues = new Set(selectedValues);\n } else {\n nextValues = new Set([value]);\n }\n } else {\n // single — toggle the value (deselectable)\n nextValues = selectedValues.has(value) ? new Set<string>() : new Set([value]);\n }\n\n if (!isControlled) {\n setUncontrolledValues(nextValues);\n }\n onControlledChange?.(nextValues);\n };\n\n return (\n <div\n {...htmlProps}\n ref={ref}\n role=\"group\"\n id={groupId}\n className={className}\n // Explicitly NOT setting tabIndex — the container must not be focusable\n >\n <ButtonGroupProvider\n value={{\n variant,\n size,\n shape,\n selectionMode,\n selectedValues,\n onSelectionChange: handleSelectionChange,\n isDisabled,\n connectedInnerRadius: getInnerRadius(size),\n connectedOuterRadius: getOuterRadius(shape, size),\n enforceMinWidth:\n variant === \"connected\" && (size === \"extra-small\" || size === \"small\"),\n }}\n >\n {children}\n </ButtonGroupProvider>\n </div>\n );\n }\n);\n\nButtonGroupHeadless.displayName = \"ButtonGroupHeadless\";\n","import { cva, type VariantProps } from \"class-variance-authority\";\n\n/**\n * Material Design 3 ButtonGroup Variants\n *\n * Architecture: Variants vs States\n * - CVA holds design-time structure only (no interaction state variants).\n * - All interaction/selection states are driven by data-* attributes on the root\n * via group-data-[x]/button-group Tailwind selectors.\n * - Container-level state attributes:\n * data-connected — variant is \"connected\"\n * data-has-selection — at least one child button is selected\n * data-disabled — entire group is non-interactive\n * data-selection-mode — \"single\" | \"required\" | \"multi\" (when applicable)\n *\n * Slot responsibilities:\n * buttonGroupRootVariants — layout container; gap, alignment, motion, disabled state\n *\n * MD3 Spec (Inner Gap):\n * | Size | standard | connected |\n * |-------------|------------|-----------|\n * | extra-small | 18dp | 2dp |\n * | small | 12dp | 2dp |\n * | medium | 8dp | 2dp |\n * | large | 8dp | 2dp |\n * | extra-large | 8dp | 2dp |\n *\n * Motion:\n * Gap is a spatial property — uses spring-standard-fast-spatial (350ms, no overshoot\n * for gap since CSS gap cannot visually overshoot). This ensures smooth transitions\n * when the size prop changes or buttons are added/removed.\n *\n * Note: xs/sm standard gaps are intentionally large to preserve 48dp touch targets.\n * Connected gap is always 2dp (`gap-0.5`) regardless of size.\n */\n\n// ─── ROOT ─────────────────────────────────────────────────────────────────────\n\n/**\n * Root container element — carries `group/button-group` scope via the styled layer.\n *\n * Handles:\n * - Flexbox layout (inline-flex or flex)\n * - Gap between child buttons (per variant × size)\n * - Spatial motion for gap transitions\n * - Disabled state (opacity + pointer-events)\n */\nexport const buttonGroupRootVariants = cva(\n [\n // Layout\n \"items-center\",\n // Spatial motion for gap changes — standard spring (calm, utility UI)\n \"transition-[gap] duration-spring-standard-fast-spatial ease-spring-standard-fast-spatial\",\n // Disabled state — self-targeting data-[x]: selector on root\n \"data-[disabled]:pointer-events-none data-[disabled]:opacity-38\",\n ],\n {\n variants: {\n /**\n * Layout variant\n *\n * - `standard`: shrink-wraps to button widths (`inline-flex`)\n * - `connected`: stretches to fill parent (`flex w-full`)\n */\n variant: {\n standard: \"inline-flex\",\n connected: \"flex w-full\",\n },\n\n /**\n * Size tier — controls the inner gap for the standard variant.\n * For the connected variant, gap is always overridden to `gap-0.5`.\n */\n size: {\n \"extra-small\": \"\",\n small: \"\",\n medium: \"\",\n large: \"\",\n \"extra-large\": \"\",\n },\n },\n\n /**\n * Compound variants that set the correct gap per (variant × size) combination.\n */\n compoundVariants: [\n // Standard variant — larger gaps preserve 48dp touch targets\n { variant: \"standard\", size: \"extra-small\", className: \"gap-[18px]\" },\n { variant: \"standard\", size: \"small\", className: \"gap-3\" },\n { variant: \"standard\", size: \"medium\", className: \"gap-2\" },\n { variant: \"standard\", size: \"large\", className: \"gap-2\" },\n { variant: \"standard\", size: \"extra-large\", className: \"gap-2\" },\n\n // Connected variant — always 2dp gap (gap-0.5 = 2px at default spacing)\n { variant: \"connected\", size: \"extra-small\", className: \"gap-0.5\" },\n { variant: \"connected\", size: \"small\", className: \"gap-0.5\" },\n { variant: \"connected\", size: \"medium\", className: \"gap-0.5\" },\n { variant: \"connected\", size: \"large\", className: \"gap-0.5\" },\n { variant: \"connected\", size: \"extra-large\", className: \"gap-0.5\" },\n ],\n\n defaultVariants: {\n variant: \"standard\",\n size: \"medium\",\n },\n }\n);\n\n// ─── FOCUS RING ───────────────────────────────────────────────────────────────\n\n/**\n * Focus ring overlay for the group container.\n *\n * Visible only when the group itself receives keyboard focus (rare — typically\n * focus goes to child buttons). Included for completeness and edge cases where\n * the group container might receive programmatic focus.\n *\n * Uses the same pattern as Switch/Button focus rings:\n * - Always in DOM (opacity-0)\n * - Transitions to opacity-100 on group-data-[focus-visible]\n */\nexport const buttonGroupFocusRingVariants = cva([\n \"pointer-events-none absolute inset-[-3px] rounded-[inherit]\",\n \"outline outline-2 outline-offset-0 outline-secondary\",\n \"transition-opacity duration-spring-standard-fast-effects ease-spring-standard-fast-effects\",\n \"opacity-0\",\n \"group-data-[focus-visible]/button-group:opacity-100\",\n]);\n\n// ─── BACKWARD COMPAT ──────────────────────────────────────────────────────────\n\n/**\n * @deprecated Use `buttonGroupRootVariants` instead.\n * Kept for backward compatibility during migration.\n */\nexport const buttonGroupVariants = buttonGroupRootVariants;\n\n// ─── EXPORTED TYPES ───────────────────────────────────────────────────────────\n\nexport type ButtonGroupRootVariants = VariantProps<typeof buttonGroupRootVariants>;\nexport type ButtonGroupFocusRingVariants = VariantProps<typeof buttonGroupFocusRingVariants>;\n\n/**\n * @deprecated Use `ButtonGroupRootVariants` instead.\n */\nexport type ButtonGroupVariants = ButtonGroupRootVariants;\n","\"use client\";\n\nimport { forwardRef, useCallback, useEffect, useRef, useMemo } from \"react\";\nimport type React from \"react\";\nimport { ButtonGroupHeadless } from \"./ButtonGroupHeadless\";\nimport { buttonGroupRootVariants } from \"./ButtonGroup.variants\";\nimport { cn } from \"../../utils/cn\";\nimport { getInteractionDataAttributes } from \"../../utils/interactionStates\";\nimport type { ButtonGroupProps } from \"./ButtonGroup.types\";\n\n/**\n * Material Design 3 ButtonGroup Component (Layer 3: Styled)\n *\n * Built on the Variants-vs-States architecture: interaction/selection states\n * are expressed as data-* attributes on the root and consumed by child slots\n * via group-data-[x]/button-group Tailwind selectors.\n *\n * An invisible container that:\n * - Applies MD3-spec gap between child buttons with spatial spring transitions\n * - Manages selection state (single / multi / required) across toggle buttons\n * - Passes shape, size, variant, and disabled metadata to children via React Context\n * - Emits container-level state attributes for CSS targeting\n *\n * Container data attributes:\n * - `data-connected` — variant is \"connected\"\n * - `data-has-selection` — at least one child button is selected\n * - `data-selection-mode` — \"single\" | \"required\" | \"multi\"\n * - `data-disabled` — group is non-interactive (via getInteractionDataAttributes)\n *\n * Variants:\n * - `standard`: Buttons float independently. Gap is larger for xs/sm to preserve\n * 48dp touch targets. Shape morphs transiently on press/select.\n * - `connected`: Buttons are visually joined with a 2dp gap. Only the pressed\n * button's shape changes; adjacent buttons are unaffected.\n *\n * Selection modes:\n * - `single`: At most one button selected; deselectable.\n * - `required`: Exactly one always selected; pressing the active button is a no-op.\n * - `multi`: Any number of buttons selected simultaneously.\n *\n * Motion:\n * - Gap transitions use spring-standard-fast-spatial (350ms) for smooth layout changes\n * - Border-radius morphing on child buttons uses expressive-fast-spatial (350ms, overshoot)\n * - Color/opacity effects on children use spring-standard-fast-effects (150ms, no overshoot)\n *\n * @example\n * ```tsx\n * // Standard icon-button group (no selection management)\n * <ButtonGroup variant=\"standard\" size=\"medium\" aria-label=\"Quick settings\">\n * <IconButton aria-label=\"Bluetooth\"><BluetoothIcon /></IconButton>\n * <IconButton aria-label=\"Alarm\"><AlarmIcon /></IconButton>\n * </ButtonGroup>\n *\n * // Connected size-picker — required single selection\n * <ButtonGroup\n * variant=\"connected\"\n * selectionMode=\"required\"\n * defaultValue=\"8oz\"\n * aria-label=\"Drink size\"\n * >\n * <Button value=\"8oz\">8 oz</Button>\n * <Button value=\"12oz\">12 oz</Button>\n * <Button value=\"16oz\">16 oz</Button>\n * </ButtonGroup>\n *\n * // Disabled group\n * <ButtonGroup variant=\"connected\" isDisabled aria-label=\"Unavailable options\">\n * <Button value=\"a\">A</Button>\n * <Button value=\"b\">B</Button>\n * </ButtonGroup>\n * ```\n */\nexport const ButtonGroup = forwardRef<HTMLDivElement, ButtonGroupProps>(\n (\n {\n variant = \"standard\",\n size = \"medium\",\n shape = \"round\",\n selectionMode,\n selectedValues,\n onSelectionChange,\n defaultValue,\n isDisabled = false,\n children,\n className,\n ...htmlProps\n },\n ref\n ) => {\n const containerRef = useRef<HTMLDivElement>(null);\n\n const handleRef = useCallback(\n (node: HTMLDivElement | null) => {\n (containerRef as React.MutableRefObject<HTMLDivElement | null>).current = node;\n if (typeof ref === \"function\") {\n ref(node);\n } else if (ref !== null) {\n ref.current = node;\n }\n },\n [ref]\n );\n\n // Compute whether the group has any active selection\n const hasSelection = useMemo(() => {\n if (selectedValues) return selectedValues.size > 0;\n if (defaultValue) {\n return Array.isArray(defaultValue) ? defaultValue.length > 0 : true;\n }\n return false;\n }, [selectedValues, defaultValue]);\n\n // Development warnings — synchronous child-prop scan\n if (process.env.NODE_ENV === \"development\") {\n const childArray = Array.isArray(children) ? children : [children];\n\n for (const child of childArray) {\n if (!child || typeof child !== \"object\" || !(\"props\" in (child as object))) continue;\n\n const childEl = child as React.ReactElement<{\n \"data-variant\"?: string;\n }>;\n\n const dataVariant = childEl.props[\"data-variant\"];\n if (dataVariant === \"text\" || dataVariant === \"icon\" || dataVariant === \"standard\") {\n console.warn(\n \"[ButtonGroup] text, icon, or standard variant buttons are not recommended inside a ButtonGroup.\",\n `Found child with data-variant=\"${dataVariant}\". Use filled, tonal, or outlined buttons instead.`\n );\n }\n }\n }\n\n // Development warnings — DOM inspection after mount (async, needs rendered DOM)\n useEffect(() => {\n if (process.env.NODE_ENV !== \"development\") return;\n if (variant !== \"connected\" || !containerRef.current) return;\n\n const toggleButtons = containerRef.current.querySelectorAll(\"[aria-pressed]\");\n if (toggleButtons.length === 0) {\n console.warn(\n \"[ButtonGroup] The `connected` variant is designed for toggle button groups.\",\n 'None of the child buttons have `aria-pressed`. Use `selectionMode` on the group and ensure children expose `aria-pressed`, or switch to `variant=\"standard\"` for action-only groups.'\n );\n }\n\n const colorValues = new Set<string>();\n containerRef.current.querySelectorAll(\"[data-color]\").forEach((el) => {\n const c = el.getAttribute(\"data-color\");\n if (c) colorValues.add(c);\n });\n if (colorValues.size > 1) {\n console.warn(\n \"[ButtonGroup] Mixing color styles inside a `connected` group is not recommended.\",\n `Found buttons with different data-color values: ${[...colorValues].join(\", \")}. Use the same color style for all buttons in a connected group.`\n );\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return (\n <ButtonGroupHeadless\n {...htmlProps}\n ref={handleRef}\n variant={variant}\n size={size}\n shape={shape}\n selectionMode={selectionMode}\n selectedValues={selectedValues}\n onSelectionChange={onSelectionChange}\n defaultValue={defaultValue}\n isDisabled={isDisabled}\n className={cn(buttonGroupRootVariants({ variant, size }), \"group/button-group\", className)}\n // ── Interaction data attributes (from component state) ─────────────\n {...getInteractionDataAttributes({ isDisabled })}\n // ── Container state attributes (describe group-level state) ────────\n data-connected={variant === \"connected\" ? \"\" : undefined}\n data-has-selection={hasSelection ? \"\" : undefined}\n data-selection-mode={selectionMode ?? undefined}\n >\n {children}\n </ButtonGroupHeadless>\n );\n }\n);\n\nButtonGroup.displayName = \"ButtonGroup\";\n","import { forwardRef, useRef } from \"react\";\nimport { useButton } from \"react-aria\";\nimport type { AriaButtonProps } from \"react-aria\";\nimport { mergeProps, filterDOMProps } from \"@react-aria/utils\";\n\n/**\n * Headless IconButton Component (Layer 2)\n *\n * Unstyled icon button primitive using React Aria for accessibility.\n * Provides behavior only - bring your own styles.\n *\n * Features:\n * - Full keyboard navigation (Enter, Space)\n * - Screen reader support\n * - Touch/pointer event handling\n * - Focus management\n * - Disabled state handling\n * - Toggle button support (aria-pressed)\n *\n * @example\n * ```tsx\n * // Use for custom styling\n * <IconButtonHeadless className=\"custom-icon-button-class\" aria-label=\"Delete\">\n * <IconDelete />\n * </IconButtonHeadless>\n * ```\n */\nexport interface IconButtonHeadlessProps extends AriaButtonProps {\n /**\n * Additional CSS classes\n */\n className?: string;\n\n /**\n * Icon content (React node)\n */\n children: React.ReactNode;\n\n /**\n * Tab index for keyboard navigation\n * @default 0\n */\n tabIndex?: number;\n\n /**\n * Mouse down handler (for ripple effect)\n */\n onMouseDown?: (e: React.MouseEvent<HTMLButtonElement>) => void;\n\n /**\n * Button type attribute\n * @default 'button'\n */\n type?: \"button\" | \"submit\" | \"reset\";\n\n /**\n * Toggle state (for toggle buttons)\n * Sets aria-pressed attribute\n */\n selected?: boolean;\n\n /**\n * REQUIRED: Accessible label for screen readers\n */\n \"aria-label\": string;\n\n /**\n * HTML title attribute for tooltip\n */\n title?: string;\n}\n\nexport const IconButtonHeadless = forwardRef<HTMLButtonElement, IconButtonHeadlessProps>(\n (\n {\n className,\n children,\n tabIndex = 0,\n onMouseDown,\n type,\n selected,\n \"aria-label\": ariaLabel,\n title,\n ...props\n },\n forwardedRef\n ) => {\n // Internal ref for React Aria\n const internalRef = useRef<HTMLButtonElement>(null);\n\n // Merge internal ref with forwarded ref\n const ref = (forwardedRef ?? internalRef) as React.RefObject<HTMLButtonElement>;\n\n // React Aria hook - handles all accessibility\n const { buttonProps } = useButton(\n {\n ...props,\n // Ensure element type is 'button' for proper semantics\n elementType: \"button\",\n // Pass aria-label\n \"aria-label\": ariaLabel,\n },\n ref\n );\n\n // Filter out React Aria-specific props that shouldn't be passed to the DOM element\n\n const domProps = filterDOMProps(props);\n\n // Merge React Aria props with custom props and filtered DOM props\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const mergedProps: React.ButtonHTMLAttributes<HTMLButtonElement> = mergeProps(\n buttonProps,\n domProps,\n {\n tabIndex,\n className,\n onMouseDown,\n type: type ?? \"button\",\n // Add aria-pressed for toggle buttons (only if selected is defined)\n ...(selected !== undefined && { \"aria-pressed\": selected }),\n // Add title if provided\n ...(title && { title }),\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ) as any;\n\n return (\n // eslint-disable-next-line react/button-has-type\n <button {...mergedProps} ref={ref} type={type ?? \"button\"}>\n {children}\n </button>\n );\n }\n);\n\nIconButtonHeadless.displayName = \"IconButtonHeadless\";\n","import { cva, type VariantProps } from \"class-variance-authority\";\n\n/**\n * Material Design 3 IconButton Variants (CVA)\n *\n * Type-safe variant management for IconButton component.\n * Uses Tailwind CSS classes mapped to MD3 design tokens.\n *\n * Key differences from Button:\n * - Circular shape (not pill-shaped)\n * - Fixed square dimensions\n * - No text content support\n * - 'standard' variant instead of 'elevated'\n */\nexport const iconButtonVariants = cva(\n [\n // Base classes (always applied)\n \"relative inline-flex items-center justify-center cursor-pointer\",\n \"overflow-hidden rounded-full\", // Circular shape\n // Split MD3 transition: btn-transition handles spatial (border-radius) with asymmetric\n // easing (decelerate by default, switched to expressive via btn-transition-selected when\n // the button is group-selected) and effects (color/bg/shadow) with standard spring.\n \"btn-transition\",\n \"focus-visible:outline-primary focus-visible:outline-2 focus-visible:outline-offset-2\",\n\n // State layers — effects token: opacity only, no overshoot (separate ::before pseudo-element)\n \"before:absolute before:inset-0 before:rounded-[inherit]\",\n \"before:transition-opacity before:duration-spring-standard-fast-effects before:ease-spring-standard-fast-effects\",\n \"before:bg-current before:opacity-0\",\n \"hover:before:opacity-8\",\n \"focus-visible:before:opacity-12\",\n \"active:before:opacity-12\",\n ],\n {\n variants: {\n /**\n * Button variant (MD3 specification)\n */\n variant: {\n standard: \"bg-transparent\", // No background\n filled: \"shadow-none\", // Solid background\n tonal: \"\", // Container background\n outlined: \"bg-transparent border border-outline\",\n },\n\n /**\n * Color scheme (MD3 color roles)\n */\n color: {\n primary: \"\",\n secondary: \"\",\n tertiary: \"\",\n error: \"\",\n },\n\n /**\n * Button size (square dimensions)\n */\n size: {\n small: \"h-8 w-8\", // 32×32px\n medium: \"h-10 w-10\", // 40×40px (default)\n large: \"h-12 w-12\", // 48×48px\n },\n\n /**\n * Selected state (for toggle buttons)\n */\n selected: {\n true: \"\",\n false: \"\",\n },\n\n /**\n * Disabled state\n */\n isDisabled: {\n true: \"pointer-events-none cursor-not-allowed opacity-38\",\n false: \"\",\n },\n },\n\n /**\n * Compound variants - combinations of variant + color + selected\n */\n compoundVariants: [\n // ====================\n // STANDARD VARIANTS\n // ====================\n {\n variant: \"standard\",\n selected: false,\n className: \"text-on-surface-variant\",\n },\n {\n variant: \"standard\",\n selected: true,\n className: \"text-primary\",\n },\n\n // ====================\n // FILLED VARIANTS (UNSELECTED)\n // ====================\n {\n variant: \"filled\",\n color: \"primary\",\n selected: false,\n className: \"bg-primary text-on-primary\",\n },\n {\n variant: \"filled\",\n color: \"secondary\",\n selected: false,\n className: \"bg-secondary text-on-secondary\",\n },\n {\n variant: \"filled\",\n color: \"tertiary\",\n selected: false,\n className: \"bg-tertiary text-on-tertiary\",\n },\n {\n variant: \"filled\",\n color: \"error\",\n selected: false,\n className: \"bg-error text-on-error\",\n },\n\n // ====================\n // FILLED VARIANTS (SELECTED - uses container colors)\n // ====================\n {\n variant: \"filled\",\n color: \"primary\",\n selected: true,\n className: \"bg-primary-container text-on-primary-container\",\n },\n {\n variant: \"filled\",\n color: \"secondary\",\n selected: true,\n className: \"bg-secondary-container text-on-secondary-container\",\n },\n {\n variant: \"filled\",\n color: \"tertiary\",\n selected: true,\n className: \"bg-tertiary-container text-on-tertiary-container\",\n },\n {\n variant: \"filled\",\n color: \"error\",\n selected: true,\n className: \"bg-error-container text-on-error-container\",\n },\n\n // ====================\n // TONAL VARIANTS (UNSELECTED)\n // ====================\n {\n variant: \"tonal\",\n color: \"primary\",\n selected: false,\n className: \"bg-secondary-container text-on-secondary-container\",\n },\n {\n variant: \"tonal\",\n color: \"secondary\",\n selected: false,\n className: \"bg-secondary-container text-on-secondary-container\",\n },\n {\n variant: \"tonal\",\n color: \"tertiary\",\n selected: false,\n className: \"bg-tertiary-container text-on-tertiary-container\",\n },\n {\n variant: \"tonal\",\n color: \"error\",\n selected: false,\n className: \"bg-error-container text-on-error-container\",\n },\n\n // ====================\n // TONAL VARIANTS (SELECTED - uses tertiary container)\n // ====================\n {\n variant: \"tonal\",\n selected: true,\n className: \"bg-tertiary-container text-on-tertiary-container\",\n },\n\n // ====================\n // OUTLINED VARIANTS (UNSELECTED)\n // ====================\n {\n variant: \"outlined\",\n selected: false,\n className: \"text-on-surface-variant\",\n },\n\n // ====================\n // OUTLINED VARIANTS (SELECTED - uses inverse colors)\n // ====================\n {\n variant: \"outlined\",\n selected: true,\n className: \"bg-inverse-surface text-inverse-on-surface border-transparent\",\n },\n ],\n\n /**\n * Default variants\n */\n defaultVariants: {\n variant: \"standard\",\n color: \"primary\",\n size: \"medium\",\n selected: false,\n isDisabled: false,\n },\n }\n);\n\n/**\n * Extract variant prop types from CVA\n */\nexport type IconButtonVariants = VariantProps<typeof iconButtonVariants>;\n","\"use client\";\n\nimport { forwardRef } from \"react\";\nimport type React from \"react\";\nimport { IconButtonHeadless } from \"./IconButtonHeadless\";\nimport { iconButtonVariants, type IconButtonVariants } from \"./IconButton.variants\";\nimport { cn } from \"../../utils/cn\";\nimport { useRipple } from \"../../hooks/useRipple\";\nimport { mergeProps } from \"@react-aria/utils\";\nimport { useOptionalButtonGroup } from \"../ButtonGroup/ButtonGroupContext\";\nimport { getConnectedRadiusClasses } from \"../ButtonGroup/ButtonGroup.utils\";\nimport type { IconButtonProps } from \"./IconButton.types\";\n\n/**\n * Material Design 3 IconButton Component\n *\n * Icon-only button component following MD3 specifications.\n * Supports 4 variants, toggle mode, and enforces accessibility.\n *\n * **Key Features:**\n * - 4 variants: standard, filled, tonal, outlined\n * - Circular shape (MD3 specification)\n * - Mandatory `aria-label` for accessibility\n * - Toggle support with `selected` prop\n * - Ripple effect on interaction\n * - 48×48px minimum touch target\n * - ButtonGroup-aware: applies connected corner radii and min-width when inside a group\n *\n * @example\n * ```tsx\n * // Standard icon button\n * <IconButton aria-label=\"Delete\">\n * <IconDelete />\n * </IconButton>\n *\n * // Filled with color\n * <IconButton aria-label=\"Favorite\" variant=\"filled\" color=\"error\">\n * <IconHeart />\n * </IconButton>\n *\n * // Toggle button\n * <IconButton\n * aria-label={selected ? \"Remove favorite\" : \"Add favorite\"}\n * selected={selected}\n * onPress={() => setSelected(!selected)}\n * >\n * {selected ? <IconStarFilled /> : <IconStarOutline />}\n * </IconButton>\n *\n * // Inside a connected ButtonGroup (corner radii applied automatically)\n * <ButtonGroup variant=\"connected\" selectionMode=\"multi\" aria-label=\"Quick settings\">\n * <IconButton aria-label=\"Bluetooth\"><BluetoothIcon /></IconButton>\n * <IconButton aria-label=\"Wi-Fi\"><WifiIcon /></IconButton>\n * </ButtonGroup>\n * ```\n */\nexport const IconButton = forwardRef<\n HTMLButtonElement,\n IconButtonProps & Omit<IconButtonVariants, \"isDisabled\" | \"selected\">\n>(\n (\n {\n // Variant props (CVA)\n variant = \"standard\",\n color = \"primary\",\n size = \"medium\",\n // IconButton specific props\n children,\n value,\n selected,\n disableRipple = false,\n className,\n // React Aria props\n isDisabled: propIsDisabled = false,\n onPress,\n onMouseDown,\n \"aria-label\": ariaLabel,\n title,\n ...props\n },\n ref\n ) => {\n // ButtonGroup context — null when rendered outside a group (safe to call unconditionally)\n const groupCtx = useOptionalButtonGroup();\n const isConnected = groupCtx?.variant === \"connected\";\n\n // Development warnings\n if (process.env.NODE_ENV === \"development\") {\n if (!ariaLabel) {\n console.error(\n \"[IconButton] aria-label is required for IconButton. Icon-only buttons need accessible labels for screen readers.\"\n );\n }\n\n if (!children) {\n console.warn(\"[IconButton] IconButton should have an icon as children.\");\n }\n }\n\n // Combine disabled states\n const isDisabled = propIsDisabled;\n\n // Ripple effect\n const { onMouseDown: handleRipple, ripples } = useRipple({\n disabled: isDisabled || disableRipple,\n });\n\n // Merge user's onMouseDown with ripple handler\n const mergedOnMouseDown = (e: React.MouseEvent<HTMLButtonElement>): void => {\n onMouseDown?.(e);\n handleRipple(e);\n };\n\n const mergedPropsValue = mergeProps(props, {\n ...(onPress && { onPress }),\n onMouseDown: mergedOnMouseDown,\n isDisabled,\n });\n\n // Connected group radius + min-width overrides (pass value for selection-aware shape morph)\n const isGroupSelected =\n isConnected && groupCtx && value ? groupCtx.selectedValues.has(value) : false;\n\n const connectedClasses =\n isConnected && groupCtx\n ? [\n ...getConnectedRadiusClasses(groupCtx, value),\n groupCtx.enforceMinWidth ? \"min-w-12\" : \"\",\n ]\n : [];\n\n return (\n <IconButtonHeadless\n ref={ref}\n className={cn(\n // CVA variants — includes btn-transition for asymmetric border-radius easing\n iconButtonVariants({ variant, color, size, selected: selected ?? false, isDisabled }),\n\n // Asymmetric border-radius easing: expressive when selected, decelerate when not.\n // btn-transition-selected overrides --_btn-radius-easing to the bouncy spring while\n // the button is gaining the pill shape; removal restores decelerate for the return\n // path, preventing the overshoot-to-0px sharp-corner flash.\n isGroupSelected ? \"btn-transition-selected\" : \"\",\n\n // Connected group overrides: inner radius + start/end outer radius + min-width\n ...connectedClasses,\n\n // User custom classes\n className\n )}\n aria-label={ariaLabel}\n data-variant={variant}\n data-color={color}\n // Connected group selection state — mirrors btn-transition-selected for CSS targeting\n data-group-selected={isGroupSelected ? \"\" : undefined}\n {...(selected !== undefined && { selected })}\n {...(title && { title })}\n {...mergedPropsValue}\n >\n {/* Ripple effect */}\n {ripples}\n\n {/* Icon content */}\n <span className=\"relative z-10 inline-flex shrink-0\">{children}</span>\n </IconButtonHeadless>\n );\n }\n);\n\nIconButton.displayName = \"IconButton\";\n","import { forwardRef, useRef } from \"react\";\nimport { useButton } from \"react-aria\";\nimport type { AriaButtonProps } from \"react-aria\";\nimport { mergeProps, filterDOMProps } from \"@react-aria/utils\";\n\n/**\n * Headless FAB Component (Layer 2)\n *\n * Unstyled FAB primitive using React Aria for accessibility.\n * Provides behavior only - bring your own styles.\n *\n * Features:\n * - Full keyboard navigation (Enter, Space)\n * - Screen reader support (requires aria-label)\n * - Touch/pointer event handling\n * - Focus management\n * - Disabled state handling\n *\n * @example\n * ```tsx\n * // Use for custom styling\n * <FABHeadless className=\"custom-fab-class\" aria-label=\"Add\">\n * <IconAdd />\n * </FABHeadless>\n * ```\n */\nexport interface FABHeadlessProps extends AriaButtonProps {\n /**\n * Additional CSS classes\n */\n className?: string;\n\n /**\n * FAB content (icon and optional text)\n */\n children: React.ReactNode;\n\n /**\n * Tab index for keyboard navigation\n * @default 0\n */\n tabIndex?: number;\n\n /**\n * Mouse down handler (for ripple effect)\n */\n onMouseDown?: (e: React.MouseEvent<HTMLButtonElement>) => void;\n\n /**\n * Button type attribute\n * @default 'button'\n */\n type?: \"button\" | \"submit\" | \"reset\";\n\n /**\n * REQUIRED: Accessible label for screen readers\n */\n \"aria-label\": string;\n\n /**\n * HTML title attribute for tooltip\n */\n title?: string;\n}\n\nexport const FABHeadless = forwardRef<HTMLButtonElement, FABHeadlessProps>(\n (\n {\n className,\n children,\n tabIndex = 0,\n onMouseDown,\n type,\n \"aria-label\": ariaLabel,\n title,\n ...props\n },\n forwardedRef\n ) => {\n // Internal ref for React Aria\n const internalRef = useRef<HTMLButtonElement>(null);\n\n // Merge internal ref with forwarded ref\n const ref = (forwardedRef ?? internalRef) as React.RefObject<HTMLButtonElement>;\n\n // React Aria hook - handles all accessibility\n const { buttonProps } = useButton(\n {\n ...props,\n elementType: \"button\",\n },\n ref\n );\n\n // Filter out React Aria-specific props that shouldn't be passed to the DOM element\n const domProps = filterDOMProps(props);\n\n // Merge React Aria props with custom props and filtered DOM props\n const mergedProps = mergeProps(buttonProps, domProps, {\n tabIndex,\n className,\n onMouseDown,\n type: type ?? \"button\",\n \"aria-label\": ariaLabel, // Add aria-label\n // Add title if provided\n ...(title && { title }),\n }) as React.ButtonHTMLAttributes<HTMLButtonElement>;\n\n return (\n // eslint-disable-next-line react/button-has-type\n <button {...mergedProps} ref={ref}>\n {children}\n </button>\n );\n }\n);\n\nFABHeadless.displayName = \"FABHeadless\";\n","import { cva, type VariantProps } from \"class-variance-authority\";\n\n/**\n * Material Design 3 FAB Variants (CVA)\n *\n * Type-safe variant management for FAB component.\n * Uses Tailwind CSS classes mapped to MD3 design tokens.\n *\n * Key differences from Button/IconButton:\n * - NOT fully rounded (uses specific corner radius: 12px/16px/28px)\n * - Always has elevation (shadow-elevation-3)\n * - Larger sizes (40px/56px/96px)\n * - Extended variant with variable width\n */\nexport const fabVariants = cva(\n [\n // Base classes (always applied)\n \"relative inline-flex items-center justify-center cursor-pointer\",\n \"overflow-hidden\",\n \"transition-all duration-200\",\n \"focus-visible:outline-primary focus-visible:outline-2 focus-visible:outline-offset-2\",\n \"shrink-0\", // Prevent shrinking in flex containers\n\n // State layers (hover, focus, active)\n \"before:absolute before:inset-0 before:rounded-[inherit] before:transition-opacity before:duration-200\",\n \"before:bg-current before:opacity-0\",\n \"hover:before:opacity-8\",\n \"focus-visible:before:opacity-12\",\n \"active:before:opacity-12\",\n\n // Elevation (floating appearance)\n \"shadow-elevation-3\", // Default elevation\n \"hover:shadow-elevation-4\", // Hover elevation\n ],\n {\n variants: {\n /**\n * FAB size (controls dimensions and icon size)\n */\n size: {\n small: [\n \"h-10 w-10\", // 40×40px\n \"p-2\", // 8px padding for 24px icon\n \"rounded-xl\", // 12px corner radius (not fully rounded!)\n \"m-1\", // 4px margin for 48×48px touch target\n ],\n medium: [\n \"h-14 w-14\", // 56×56px\n \"p-4\", // 16px padding for 24px icon\n \"rounded-2xl\", // 16px corner radius\n ],\n large: [\n \"h-24 w-24\", // 96×96px\n \"p-[30px]\", // 30px padding for 36px icon\n \"rounded-[28px]\", // 28px corner radius (custom value)\n ],\n extended: [\n \"h-14\", // 56px height (same as medium)\n \"rounded-2xl\", // 16px corner radius\n \"pl-4 pr-5\", // Asymmetric padding: 16px leading, 20px trailing\n \"gap-2\", // 8px gap between icon and text\n ],\n },\n\n /**\n * Color scheme (MD3 color roles)\n */\n color: {\n primary: \"\",\n secondary: \"\",\n tertiary: \"\",\n surface: \"\",\n },\n\n /**\n * Disabled state\n */\n isDisabled: {\n true: \"pointer-events-none cursor-not-allowed !bg-on-surface/12 !text-on-surface/38 !shadow-none\",\n false: \"\",\n },\n },\n\n /**\n * Compound variants - combinations of size + color\n */\n compoundVariants: [\n // ====================\n // PRIMARY COLOR\n // ====================\n {\n color: \"primary\",\n size: \"small\",\n className: \"bg-primary-container text-on-primary-container\",\n },\n {\n color: \"primary\",\n size: \"medium\",\n className: \"bg-primary-container text-on-primary-container\",\n },\n {\n color: \"primary\",\n size: \"large\",\n className: \"bg-primary-container text-on-primary-container\",\n },\n {\n color: \"primary\",\n size: \"extended\",\n className: \"bg-primary-container text-on-primary-container\",\n },\n\n // ====================\n // SECONDARY COLOR\n // ====================\n {\n color: \"secondary\",\n size: \"small\",\n className: \"bg-secondary-container text-on-secondary-container\",\n },\n {\n color: \"secondary\",\n size: \"medium\",\n className: \"bg-secondary-container text-on-secondary-container\",\n },\n {\n color: \"secondary\",\n size: \"large\",\n className: \"bg-secondary-container text-on-secondary-container\",\n },\n {\n color: \"secondary\",\n size: \"extended\",\n className: \"bg-secondary-container text-on-secondary-container\",\n },\n\n // ====================\n // TERTIARY COLOR\n // ====================\n {\n color: \"tertiary\",\n size: \"small\",\n className: \"bg-tertiary-container text-on-tertiary-container\",\n },\n {\n color: \"tertiary\",\n size: \"medium\",\n className: \"bg-tertiary-container text-on-tertiary-container\",\n },\n {\n color: \"tertiary\",\n size: \"large\",\n className: \"bg-tertiary-container text-on-tertiary-container\",\n },\n {\n color: \"tertiary\",\n size: \"extended\",\n className: \"bg-tertiary-container text-on-tertiary-container\",\n },\n\n // ====================\n // SURFACE COLOR\n // ====================\n {\n color: \"surface\",\n size: \"small\",\n className: \"bg-surface text-primary\",\n },\n {\n color: \"surface\",\n size: \"medium\",\n className: \"bg-surface text-primary\",\n },\n {\n color: \"surface\",\n size: \"large\",\n className: \"bg-surface text-primary\",\n },\n {\n color: \"surface\",\n size: \"extended\",\n className: \"bg-surface text-primary\",\n },\n ],\n\n /**\n * Default variants\n */\n defaultVariants: {\n size: \"medium\",\n color: \"primary\",\n isDisabled: false,\n },\n }\n);\n\n/**\n * Extract variant prop types from CVA\n */\nexport type FABVariants = VariantProps<typeof fabVariants>;\n","\"use client\";\n\nimport { forwardRef } from \"react\";\nimport type React from \"react\";\nimport { FABHeadless } from \"./FABHeadless\";\nimport { fabVariants, type FABVariants } from \"./FAB.variants\";\nimport { cn } from \"../../utils/cn\";\nimport { useRipple } from \"../../hooks/useRipple\";\nimport type { FABProps } from \"./FAB.types\";\nimport { mergeProps } from \"@react-aria/utils\";\n\n/**\n * Loading spinner component\n */\nconst Spinner = (): React.ReactElement => (\n <svg\n role=\"progressbar\"\n aria-label=\"Loading\"\n className=\"h-6 w-6 animate-spin\"\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <circle className=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"4\" />\n <path\n className=\"opacity-75\"\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\n />\n </svg>\n);\n\n/**\n * Material Design 3 FAB (Floating Action Button) Component\n *\n * High-emphasis button for primary screen action.\n * Supports 4 sizes: small, medium, large, extended\n * Implementation uses Tailwind CSS classes mapped to MD3 tokens.\n */\nexport const FAB = forwardRef<HTMLButtonElement, FABProps & Omit<FABVariants, \"isDisabled\">>(\n (\n {\n // Variant props (CVA)\n size = \"medium\",\n color = \"primary\",\n // FAB specific props\n icon,\n children,\n \"aria-label\": ariaLabel,\n loading = false,\n disableRipple = false,\n className,\n // React Aria props\n isDisabled: propIsDisabled = false,\n onPress,\n onMouseDown,\n title,\n ...props\n },\n ref\n ) => {\n // Development warnings\n if (process.env.NODE_ENV === \"development\") {\n if (!icon) {\n console.warn(\"[FAB] FAB must have an icon. Please provide the icon prop.\");\n }\n\n if (size === \"extended\" && !children) {\n console.warn(\"[FAB] Extended FAB requires text label as children.\");\n }\n\n if (size !== \"extended\" && children) {\n console.warn(\n \"[FAB] Children (text) is only used for extended FAB. For icon-only FAB, use icon prop only.\"\n );\n }\n }\n\n // Combine disabled states\n const isDisabled = propIsDisabled || loading;\n\n // Ripple effect\n const { onMouseDown: handleRipple, ripples } = useRipple({\n disabled: isDisabled || disableRipple,\n });\n\n // Merge user's onMouseDown with ripple handler\n const mergedOnMouseDown = (e: React.MouseEvent<HTMLButtonElement>): void => {\n onMouseDown?.(e);\n handleRipple(e);\n };\n\n const mergedPropsValue = mergeProps(props, {\n ...(onPress && { onPress }),\n onMouseDown: mergedOnMouseDown,\n isDisabled,\n });\n\n return (\n <FABHeadless\n ref={ref}\n className={cn(\n // Base classes\n \"relative inline-flex items-center justify-center\",\n \"overflow-hidden transition-all duration-200\",\n \"focus-visible:outline-primary focus-visible:outline-2 focus-visible:outline-offset-2\",\n \"shrink-0\",\n\n // State layers (hover, focus, active)\n \"before:absolute before:inset-0 before:rounded-[inherit] before:transition-opacity before:duration-200\",\n \"before:bg-current before:opacity-0\",\n \"hover:before:opacity-8\",\n \"focus-visible:before:opacity-12\",\n \"active:before:opacity-12\",\n\n // Elevation\n \"shadow-elevation-3 hover:shadow-elevation-4\",\n\n // CVA variants\n fabVariants({ size, color, isDisabled }),\n\n // User custom classes\n className\n )}\n aria-label={ariaLabel}\n {...(title && { title })}\n {...mergedPropsValue}\n >\n {/* Ripple effect */}\n {ripples}\n\n {/* Icon (hidden when loading) */}\n {icon && (\n <span className={cn(\"relative z-10 inline-flex shrink-0\", loading && \"invisible\")}>\n {icon}\n </span>\n )}\n\n {/* Loading spinner (shown when loading, overlays icon position) */}\n {loading && (\n <span className=\"relative z-10\">\n <Spinner />\n </span>\n )}\n\n {/* Text label (extended FAB only) */}\n {size === \"extended\" && children && (\n <span className=\"relative z-10 inline-flex items-center text-sm font-medium tracking-[0.1px]\">\n {children}\n </span>\n )}\n </FABHeadless>\n );\n }\n);\n\nFAB.displayName = \"FAB\";\n","/**\n * TextField Variants\n *\n * CVA (class-variance-authority) variant definitions for Material Design 3 TextField.\n * Supports filled and outlined variants with comprehensive state management.\n */\n\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\n/**\n * Container variants for the TextField wrapper\n *\n * Handles layout, width, and positioning\n */\nexport const textFieldContainerVariants = cva(\n [\n // Base container styles\n \"relative inline-flex flex-col\",\n ],\n {\n variants: {\n fullWidth: {\n true: \"w-full\",\n false: \"w-auto\",\n },\n },\n defaultVariants: {\n fullWidth: false,\n },\n }\n);\n\n/**\n * Input wrapper variants (the visual container around the input)\n *\n * Handles MD3 filled and outlined variants with all states\n */\nexport const textFieldWrapperVariants = cva(\n [\n // Base wrapper styles\n \"relative inline-flex items-center w-full\",\n \"transition-all duration-200\",\n \"rounded-t\",\n ],\n {\n variants: {\n variant: {\n filled: [\"bg-surface-container-highest\", \"border-b-2 border-on-surface-variant\"],\n outlined: [\"bg-transparent\", \"border border-outline\", \"rounded-b\"],\n },\n size: {\n small: \"min-h-10\",\n medium: \"min-h-12\",\n large: \"min-h-14\",\n },\n disabled: {\n true: [\"cursor-not-allowed\", \"opacity-38\"],\n false: \"\",\n },\n error: {\n true: \"\",\n false: \"\",\n },\n focused: {\n true: \"\",\n false: \"\",\n },\n },\n compoundVariants: [\n // FILLED VARIANT - Focused state\n {\n variant: \"filled\",\n focused: true,\n error: false,\n className: \"border-primary\",\n },\n // FILLED VARIANT - Error state\n {\n variant: \"filled\",\n error: true,\n className: \"border-error\",\n },\n // FILLED VARIANT - Hover state (handled via group-hover in parent)\n {\n variant: \"filled\",\n disabled: false,\n className: \"hover:bg-on-surface/[0.08]\",\n },\n\n // OUTLINED VARIANT - Focused state\n {\n variant: \"outlined\",\n focused: true,\n error: false,\n className: \"border-2 border-primary\",\n },\n // OUTLINED VARIANT - Error state\n {\n variant: \"outlined\",\n error: true,\n className: \"border-2 border-error\",\n },\n // OUTLINED VARIANT - Hover state\n {\n variant: \"outlined\",\n disabled: false,\n className: \"hover:border-on-surface\",\n },\n ],\n defaultVariants: {\n variant: \"filled\",\n size: \"medium\",\n disabled: false,\n error: false,\n focused: false,\n },\n }\n);\n\n/**\n * Input element variants\n *\n * Styles for the actual input/textarea element\n */\nexport const textFieldInputVariants = cva(\n [\n // Base input styles\n \"w-full bg-transparent outline-none\",\n \"text-on-surface text-base\",\n \"placeholder:text-on-surface-variant placeholder:opacity-60\",\n \"transition-colors duration-200\",\n ],\n {\n variants: {\n variant: {\n filled: \"px-4\",\n outlined: \"px-4\",\n },\n size: {\n small: \"h-10 py-2 text-sm\",\n medium: \"h-12 py-3 text-base\",\n large: \"h-14 py-4 text-lg\",\n },\n disabled: {\n true: \"cursor-not-allowed\",\n false: \"\",\n },\n hasLeadingIcon: {\n true: \"pl-12\",\n false: \"\",\n },\n hasTrailingIcon: {\n true: \"pr-12\",\n false: \"\",\n },\n multiline: {\n true: \"resize-y\",\n false: \"\",\n },\n },\n defaultVariants: {\n variant: \"filled\",\n size: \"medium\",\n disabled: false,\n hasLeadingIcon: false,\n hasTrailingIcon: false,\n multiline: false,\n },\n }\n);\n\n/**\n * Label variants\n *\n * Handles floating label behavior for MD3 text fields\n */\nexport const textFieldLabelVariants = cva(\n [\n // Base label styles\n \"absolute left-4 transition-all duration-200 pointer-events-none\",\n \"text-on-surface-variant origin-top-left\",\n ],\n {\n variants: {\n variant: {\n filled: \"top-2.5\",\n outlined: \"top-2.5 bg-surface px-1\",\n },\n size: {\n small: \"text-sm\",\n medium: \"text-base\",\n large: \"text-lg\",\n },\n floating: {\n true: \"-translate-y-5 scale-75\",\n false: \"scale-100\",\n },\n focused: {\n true: \"text-primary\",\n false: \"\",\n },\n error: {\n true: \"text-error\",\n false: \"\",\n },\n disabled: {\n true: \"text-on-surface/38\",\n false: \"\",\n },\n hasLeadingIcon: {\n true: \"left-12\",\n false: \"\",\n },\n },\n compoundVariants: [\n // Outlined variant floating label positioning\n {\n variant: \"outlined\",\n floating: true,\n className: \"top-2.5\",\n },\n ],\n defaultVariants: {\n variant: \"filled\",\n size: \"medium\",\n floating: false,\n focused: false,\n error: false,\n disabled: false,\n hasLeadingIcon: false,\n },\n }\n);\n\n/**\n * Icon container variants\n *\n * Styles for leading and trailing icon containers\n */\nexport const textFieldIconVariants = cva(\n [\n // Base icon styles\n \"absolute flex items-center justify-center\",\n \"text-on-surface-variant transition-colors duration-200\",\n \"pointer-events-none\",\n ],\n {\n variants: {\n position: {\n leading: \"left-3\",\n trailing: \"right-3\",\n },\n size: {\n small: \"w-5 h-5\",\n medium: \"w-6 h-6\",\n large: \"w-7 h-7\",\n },\n disabled: {\n true: \"opacity-38\",\n false: \"\",\n },\n },\n defaultVariants: {\n position: \"leading\",\n size: \"medium\",\n disabled: false,\n },\n }\n);\n\n/**\n * Helper text variants (description and error messages)\n *\n * Styles for text below the input field\n */\nexport const textFieldHelperTextVariants = cva(\n [\n // Base helper text styles\n \"text-xs mt-1 px-4 transition-colors duration-200\",\n ],\n {\n variants: {\n type: {\n description: \"text-on-surface-variant\",\n error: \"text-error\",\n },\n disabled: {\n true: \"opacity-38\",\n false: \"\",\n },\n },\n defaultVariants: {\n type: \"description\",\n disabled: false,\n },\n }\n);\n\n/**\n * Character counter variants\n *\n * Styles for the character count display\n */\nexport const textFieldCharacterCountVariants = cva(\n [\n // Base character counter styles\n \"text-xs mt-1 px-4 text-right text-on-surface-variant transition-colors duration-200\",\n ],\n {\n variants: {\n exceeded: {\n true: \"text-error\",\n false: \"\",\n },\n disabled: {\n true: \"opacity-38\",\n false: \"\",\n },\n },\n defaultVariants: {\n exceeded: false,\n disabled: false,\n },\n }\n);\n\n// Export variant types\nexport type TextFieldContainerVariants = VariantProps<typeof textFieldContainerVariants>;\nexport type TextFieldWrapperVariants = VariantProps<typeof textFieldWrapperVariants>;\nexport type TextFieldInputVariants = VariantProps<typeof textFieldInputVariants>;\nexport type TextFieldLabelVariants = VariantProps<typeof textFieldLabelVariants>;\nexport type TextFieldIconVariants = VariantProps<typeof textFieldIconVariants>;\nexport type TextFieldHelperTextVariants = VariantProps<typeof textFieldHelperTextVariants>;\nexport type TextFieldCharacterCountVariants = VariantProps<typeof textFieldCharacterCountVariants>;\n","/**\n * TextFieldHeadless Component (Layer 2)\n *\n * Headless primitive for the TextField component.\n * Provides behavior and accessibility via React Aria without styling.\n */\n\nimport { forwardRef, useRef } from \"react\";\nimport { useTextField, useFocusRing } from \"react-aria\";\nimport { mergeProps } from \"@react-aria/utils\";\nimport type { TextFieldHeadlessProps } from \"./TextField.types\";\n\n/**\n * TextFieldHeadless - Headless text input primitive\n *\n * This component provides the foundation for accessible text input fields\n * using React Aria. It handles:\n * - Label association\n * - Description text (helper text)\n * - Error message display\n * - Validation state management\n * - Keyboard accessibility\n * - Screen reader support\n *\n * When `children` is a function (render-prop), the component delegates\n * all DOM rendering to the caller, passing React Aria props and derived\n * state. This is how the styled TextField (Layer 3) composes this layer.\n *\n * When `children` is absent, a minimal accessible DOM renders (for\n * advanced consumers who want headless behaviour with their own markup).\n *\n * @example\n * ```tsx\n * // Default DOM (minimal accessible input)\n * <TextFieldHeadless\n * label=\"Email\"\n * description=\"Enter your email address\"\n * isRequired\n * />\n *\n * // Render-prop (styled layer composition)\n * <TextFieldHeadless label=\"Email\" value={value} onChange={onChange}>\n * {({ labelProps, inputProps, isFocused, currentValue }) => (\n * <div>\n * <label {...labelProps} className={isFocused ? 'focused' : ''}>Email</label>\n * <input {...inputProps} />\n * <span>{currentValue.length} chars</span>\n * </div>\n * )}\n * </TextFieldHeadless>\n * ```\n */\nexport const TextFieldHeadless = forwardRef<\n HTMLInputElement | HTMLTextAreaElement,\n TextFieldHeadlessProps\n>(\n (\n {\n label,\n description,\n errorMessage,\n fullWidth = false,\n multiline = false,\n rows = 3,\n className,\n inputClassName,\n labelClassName,\n descriptionClassName,\n errorClassName,\n isInvalid,\n children,\n ...restProps\n },\n forwardedRef\n ) => {\n const internalRef = useRef<HTMLInputElement | HTMLTextAreaElement>(null);\n const ref = (forwardedRef ?? internalRef) as React.RefObject<\n HTMLInputElement & HTMLTextAreaElement\n >;\n\n const inputElementType = multiline ? (\"textarea\" as const) : (\"input\" as const);\n\n // React Aria's useTextField provides fully-wired labelProps, inputProps,\n // descriptionProps, and errorMessageProps with stable IDs and ARIA linkages.\n const {\n labelProps,\n inputProps,\n descriptionProps,\n errorMessageProps,\n isInvalid: ariaIsInvalid,\n validationErrors,\n } = useTextField(\n {\n label,\n description,\n errorMessage,\n isInvalid: isInvalid ?? false,\n inputElementType,\n ...restProps,\n },\n ref\n );\n\n // useFocusRing distinguishes keyboard focus (isFocusVisible) from pointer focus (isFocused).\n const { isFocused, isFocusVisible, focusProps } = useFocusRing({ within: false });\n\n // Determine if field is invalid (from prop or React Aria validation)\n const invalid = isInvalid ?? ariaIsInvalid;\n\n const showErrorMessage = invalid && (errorMessage ?? validationErrors.length > 0);\n const displayErrorMessage = errorMessage ?? validationErrors.join(\" \");\n\n // Derive current displayed value for the render-prop (controlled or uncontrolled).\n // React Aria puts the current value in inputProps.value for controlled fields\n // and defaultValue for uncontrolled. We normalise to a string for character counting.\n const currentValue =\n typeof inputProps.value === \"string\"\n ? inputProps.value\n : typeof inputProps.defaultValue === \"string\"\n ? inputProps.defaultValue\n : \"\";\n\n // --- Render-prop branch ---\n // When children is a function, delegate all DOM rendering to the caller.\n if (typeof children === \"function\") {\n // Merge focusProps into inputProps so the caller gets focus tracking for free.\n const mergedInputProps = mergeProps(\n inputProps,\n focusProps\n ) as React.InputHTMLAttributes<HTMLInputElement> &\n React.TextareaHTMLAttributes<HTMLTextAreaElement>;\n\n return children({\n labelProps,\n inputProps: mergedInputProps,\n descriptionProps,\n errorMessageProps,\n isInvalid: invalid,\n isFocused,\n isFocusVisible,\n currentValue,\n inputRef: ref,\n });\n }\n\n // --- Default DOM branch ---\n // Filter React Aria-specific props that shouldn't go to DOM elements.\n const {\n isDisabled: _isDisabled,\n isRequired: _isRequired,\n isReadOnly: _isReadOnly,\n validationBehavior: _validationBehavior,\n validate: _validate,\n autoFocus: _autoFocus,\n value: _value,\n defaultValue: _defaultValue,\n onChange: _onChange,\n onFocus: _onFocus,\n onBlur: _onBlur,\n onKeyDown: _onKeyDown,\n onKeyUp: _onKeyUp,\n onCopy: _onCopy,\n onCut: _onCut,\n onPaste: _onPaste,\n onCompositionStart: _onCompositionStart,\n onCompositionEnd: _onCompositionEnd,\n onCompositionUpdate: _onCompositionUpdate,\n onSelect: _onSelect,\n onBeforeInput: _onBeforeInput,\n onInput: _onInput,\n onFocusChange: _onFocusChange,\n ...htmlAttrs\n } = restProps;\n\n const mergedInputProps = mergeProps(inputProps, focusProps, htmlAttrs, {\n className: inputClassName,\n }) as React.InputHTMLAttributes<HTMLInputElement> &\n React.TextareaHTMLAttributes<HTMLTextAreaElement>;\n\n return (\n <div className={className} style={fullWidth ? { width: \"100%\" } : undefined}>\n {label && (\n <label {...labelProps} className={labelClassName}>\n {label}\n </label>\n )}\n\n {multiline ? (\n <textarea\n {...mergedInputProps}\n ref={ref as React.RefObject<HTMLTextAreaElement>}\n rows={rows}\n />\n ) : (\n <input {...mergedInputProps} ref={ref as React.RefObject<HTMLInputElement>} />\n )}\n\n {description && !showErrorMessage && (\n <div {...descriptionProps} className={descriptionClassName}>\n {description}\n </div>\n )}\n\n {showErrorMessage && (\n <div {...errorMessageProps} className={errorClassName}>\n {displayErrorMessage}\n </div>\n )}\n </div>\n );\n }\n);\n\nTextFieldHeadless.displayName = \"TextFieldHeadless\";\n","/**\n * TextField Component (Layer 3)\n *\n * Material Design 3 styled text input component.\n * Composes TextFieldHeadless (Layer 2) via render-prop to obtain all\n * React Aria ARIA props without duplicating accessibility wiring.\n */\n\n\"use client\";\n\nimport { forwardRef } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport {\n textFieldContainerVariants,\n textFieldWrapperVariants,\n textFieldInputVariants,\n textFieldLabelVariants,\n textFieldIconVariants,\n textFieldHelperTextVariants,\n textFieldCharacterCountVariants,\n} from \"./TextField.variants\";\nimport { TextFieldHeadless } from \"./TextFieldHeadless\";\nimport type { TextFieldProps } from \"./TextField.types\";\n\n/**\n * TextField - MD3 Text Input Component\n *\n * A text input field following Material Design 3 specifications.\n * Supports filled and outlined variants with comprehensive accessibility\n * provided by React Aria via the TextFieldHeadless layer.\n *\n * @example\n * ```tsx\n * // Basic usage\n * <TextField label=\"Email\" />\n *\n * // With validation\n * <TextField\n * label=\"Email\"\n * type=\"email\"\n * isRequired\n * errorMessage=\"Please enter a valid email\"\n * />\n *\n * // Multiline with character counter\n * <TextField\n * label=\"Bio\"\n * multiline\n * rows={4}\n * maxLength={500}\n * characterCount\n * />\n * ```\n */\nexport const TextField = forwardRef<HTMLInputElement | HTMLTextAreaElement, TextFieldProps>(\n (\n {\n variant = \"filled\",\n size = \"medium\",\n label,\n description,\n errorMessage,\n leadingIcon,\n trailingIcon,\n characterCount = false,\n maxLength,\n fullWidth = false,\n multiline = false,\n rows = 3,\n className,\n isDisabled = false,\n isInvalid = false,\n isRequired = false,\n isReadOnly = false,\n value,\n defaultValue,\n onChange,\n onFocus,\n onBlur,\n spellCheck,\n ...props\n },\n ref\n ) => {\n // Convert spellCheck to boolean if it arrives as a string (HTML attribute form)\n const spellCheckProp =\n spellCheck === undefined\n ? undefined\n : typeof spellCheck === \"string\"\n ? spellCheck === \"true\"\n : spellCheck;\n\n // Build headless props, omitting undefined optional values to satisfy exactOptionalPropertyTypes\n const headlessProps = {\n ...(label !== undefined ? { label } : {}),\n ...(description !== undefined ? { description } : {}),\n ...(errorMessage !== undefined ? { errorMessage } : {}),\n ...(value !== undefined ? { value } : {}),\n ...(defaultValue !== undefined ? { defaultValue } : {}),\n ...(onChange !== undefined ? { onChange } : {}),\n ...(onFocus !== undefined ? { onFocus } : {}),\n ...(onBlur !== undefined ? { onBlur } : {}),\n ...(maxLength !== undefined ? { maxLength } : {}),\n fullWidth,\n multiline,\n rows,\n isDisabled,\n isInvalid,\n isRequired,\n isReadOnly,\n ...props,\n };\n\n return (\n <TextFieldHeadless ref={ref} {...headlessProps}>\n {({\n labelProps,\n inputProps,\n descriptionProps,\n errorMessageProps,\n isInvalid: fieldIsInvalid,\n isFocused,\n currentValue,\n inputRef,\n }) => {\n const hasValue = currentValue.length > 0;\n const shouldFloatLabel = isFocused || hasValue;\n const characterLength = currentValue.length;\n const isCharacterLimitExceeded = maxLength ? characterLength > maxLength : false;\n\n return (\n <div className={cn(textFieldContainerVariants({ fullWidth }), className)}>\n {/* Input wrapper with visual styling */}\n <div\n className={cn(\n textFieldWrapperVariants({\n variant,\n size,\n disabled: isDisabled,\n error: fieldIsInvalid,\n focused: isFocused,\n })\n )}\n >\n {/* Leading icon */}\n {leadingIcon && (\n <span\n className={textFieldIconVariants({\n position: \"leading\",\n size,\n disabled: isDisabled,\n })}\n >\n {leadingIcon}\n </span>\n )}\n\n {/* Floating label — uses labelProps from React Aria for proper htmlFor wiring */}\n {label && (\n <label\n {...labelProps}\n className={cn(\n textFieldLabelVariants({\n variant,\n size,\n floating: shouldFloatLabel,\n focused: isFocused,\n error: fieldIsInvalid,\n disabled: isDisabled,\n hasLeadingIcon: !!leadingIcon,\n })\n )}\n >\n {label}\n {isRequired && \" *\"}\n </label>\n )}\n\n {/* Input/Textarea — uses inputProps from React Aria for full ARIA wiring */}\n {multiline ? (\n <textarea\n {...inputProps}\n ref={inputRef as React.RefObject<HTMLTextAreaElement>}\n className={cn(\n textFieldInputVariants({\n variant,\n size,\n disabled: isDisabled,\n hasLeadingIcon: !!leadingIcon,\n hasTrailingIcon: !!trailingIcon,\n multiline: true,\n }),\n label && \"placeholder:opacity-0\"\n )}\n rows={rows}\n spellCheck={spellCheckProp}\n />\n ) : (\n <input\n {...inputProps}\n ref={inputRef as React.RefObject<HTMLInputElement>}\n className={cn(\n textFieldInputVariants({\n variant,\n size,\n disabled: isDisabled,\n hasLeadingIcon: !!leadingIcon,\n hasTrailingIcon: !!trailingIcon,\n multiline: false,\n }),\n label && \"placeholder:opacity-0\" // Hide placeholder when there's a value to prevent overlap with floating label\n )}\n spellCheck={spellCheckProp}\n />\n )}\n\n {/* Trailing icon */}\n {trailingIcon && (\n <span\n className={textFieldIconVariants({\n position: \"trailing\",\n size,\n disabled: isDisabled,\n })}\n >\n {trailingIcon}\n </span>\n )}\n </div>\n\n {/* Helper text — only shown when not in error state */}\n {description && !fieldIsInvalid && (\n <div\n {...descriptionProps}\n className={textFieldHelperTextVariants({\n type: \"description\",\n disabled: isDisabled,\n })}\n >\n {description}\n </div>\n )}\n\n {/* Error message */}\n {fieldIsInvalid && errorMessage && (\n <div\n {...errorMessageProps}\n className={textFieldHelperTextVariants({\n type: \"error\",\n disabled: isDisabled,\n })}\n >\n {errorMessage}\n </div>\n )}\n\n {/* Character counter */}\n {characterCount && maxLength && (\n <div\n className={textFieldCharacterCountVariants({\n exceeded: isCharacterLimitExceeded,\n disabled: isDisabled,\n })}\n >\n {characterLength} / {maxLength}\n </div>\n )}\n </div>\n );\n }}\n </TextFieldHeadless>\n );\n }\n);\n\nTextField.displayName = \"TextField\";\n","import { cva, type VariantProps } from \"class-variance-authority\";\n\n/**\n * Material Design 3 Checkbox Variants (CVA)\n *\n * Type-safe variant management for Checkbox component.\n * Uses Tailwind CSS classes mapped to MD3 design tokens.\n *\n * MD3 Specifications:\n * - Container: 18x18dp (within 40x40dp touch target)\n * - Corner radius: 2dp (applied via SVG rx/ry attributes, not CSS)\n * - Outline width: 2dp\n * - State layers: 8% hover, 12% focus/pressed\n * - Disabled: 38% opacity\n */\nexport const checkboxVariants = cva(\n [\n // Base classes (always applied to label wrapper)\n \"relative inline-flex items-center cursor-pointer select-none\",\n \"transition-opacity duration-200\",\n ],\n {\n variants: {\n /**\n * Disabled state\n */\n disabled: {\n true: \"opacity-38 cursor-not-allowed pointer-events-none\",\n false: \"\",\n },\n },\n defaultVariants: {\n disabled: false,\n },\n }\n);\n\n/**\n * Checkbox container variants (for the visual checkbox box)\n */\nexport const checkboxContainerVariants = cva(\n [\n // Base classes for checkbox visual container\n \"relative inline-flex items-center justify-center m-1\",\n \"w-10 h-10\", // 40x40dp touch target (MD3 spec)\n \"flex-shrink-0\",\n \"transition-all duration-200\",\n\n // State layer (hover, focus, active) - MD3 spec: 8%/12%/12% opacity\n \"before:absolute before:inset-0 before:rounded-full before:transition-opacity before:duration-200\",\n \"before:bg-current before:opacity-0\",\n \"hover:before:opacity-8\",\n \"active:before:opacity-12\",\n ],\n {\n variants: {\n /**\n * Checkbox state (determines visual appearance)\n */\n state: {\n unchecked: \"text-on-surface-variant\",\n checked: \"text-primary\",\n indeterminate: \"text-primary\",\n },\n\n /**\n * Error/invalid state\n */\n isInvalid: {\n true: \"text-error\",\n false: \"\",\n },\n\n /**\n * Disabled state\n */\n disabled: {\n true: \"text-on-surface pointer-events-none\",\n false: \"\",\n },\n },\n compoundVariants: [\n // Error state overrides normal colors for all states\n {\n state: \"unchecked\",\n isInvalid: true,\n disabled: false,\n className: \"text-error\",\n },\n {\n state: \"checked\",\n isInvalid: true,\n disabled: false,\n className: \"text-error\",\n },\n {\n state: \"indeterminate\",\n isInvalid: true,\n disabled: false,\n className: \"text-error\",\n },\n ],\n defaultVariants: {\n state: \"unchecked\",\n isInvalid: false,\n disabled: false,\n },\n }\n);\n\n/**\n * Checkbox icon SVG box variants (the 18x18dp square container)\n */\nexport const checkboxIconBoxVariants = cva(\n [\n // Base classes for the checkbox box\n // Note: Border radius is applied via SVG rx/ry attributes (2dp) in the component\n \"transition-all duration-200\",\n ],\n {\n variants: {\n /**\n * Checkbox state\n */\n state: {\n unchecked: [\n \"fill-transparent\",\n \"stroke-outline\", // MD3: outline color for unchecked\n \"stroke-4\", // MD3: 2dp outline width\n ],\n checked: [\n \"fill-current\", // Uses parent text color (primary or error)\n \"stroke-none\",\n ],\n indeterminate: [\n \"fill-current\", // Uses parent text color (primary or error)\n \"stroke-none\",\n ],\n },\n\n /**\n * Disabled state\n */\n disabled: {\n true: [\"fill-transparent\", \"stroke-current\", \"stroke-2\"],\n false: \"\",\n },\n },\n compoundVariants: [\n // Disabled state overrides fill for checked/indeterminate\n {\n state: \"checked\",\n disabled: true,\n className: \"fill-current stroke-none\",\n },\n {\n state: \"indeterminate\",\n disabled: true,\n className: \"fill-current stroke-none\",\n },\n ],\n defaultVariants: {\n state: \"unchecked\",\n disabled: false,\n },\n }\n);\n\n/**\n * Checkbox checkmark/dash icon variants\n */\nexport const checkboxIconVariants = cva(\n [\n \"fill-current\", // Inherits color from parent\n \"transition-all duration-200\",\n ],\n {\n variants: {\n /**\n * Icon type\n */\n type: {\n check: \"\", // Checkmark icon\n dash: \"\", // Dash/minus icon\n },\n },\n defaultVariants: {\n type: \"check\",\n },\n }\n);\n\n/**\n * Checkbox label text variants\n */\nexport const checkboxLabelVariants = cva(\n [\n \"text-sm\", // MD3: Body Medium (14px)\n \"text-on-surface\",\n \"select-none\",\n ],\n {\n variants: {\n disabled: {\n true: \"\",\n false: \"\",\n },\n },\n defaultVariants: {\n disabled: false,\n },\n }\n);\n\n/**\n * Extract variant prop types from CVA\n */\nexport type CheckboxVariants = VariantProps<typeof checkboxVariants>;\nexport type CheckboxContainerVariants = VariantProps<typeof checkboxContainerVariants>;\nexport type CheckboxIconBoxVariants = VariantProps<typeof checkboxIconBoxVariants>;\nexport type CheckboxIconVariants = VariantProps<typeof checkboxIconVariants>;\nexport type CheckboxLabelVariants = VariantProps<typeof checkboxLabelVariants>;\n","\"use client\";\n\nimport { forwardRef, useRef, useEffect } from \"react\";\nimport type React from \"react\";\nimport { useCheckbox, useFocusRing, mergeProps, VisuallyHidden } from \"react-aria\";\nimport { useToggleState } from \"react-stately\";\nimport { cn } from \"../../utils/cn\";\nimport { useRipple } from \"../../hooks/useRipple\";\nimport {\n checkboxVariants,\n checkboxContainerVariants,\n checkboxIconBoxVariants,\n checkboxIconVariants,\n checkboxLabelVariants,\n} from \"./Checkbox.variants\";\nimport type { CheckboxProps } from \"./Checkbox.types\";\n\n/**\n * Material Design 3 Checkbox Component (Layer 3: Styled)\n *\n * Built on React Aria for world-class accessibility.\n * Uses CVA for type-safe variant management.\n * Styled with Tailwind CSS using MD3 design tokens.\n *\n * Features:\n * - ✅ 3 states: unchecked, checked, indeterminate\n * - ✅ Error/invalid state support\n * - ✅ Ripple effect (Material Design)\n * - ✅ Full keyboard accessibility (via React Aria)\n * - ✅ Screen reader support (via React Aria)\n * - ✅ Focus management (via React Aria)\n * - ✅ Form integration (name, value props)\n *\n * MD3 Specifications:\n * - Container: 18x18dp (within 40x40dp touch target)\n * - Corner radius: 2dp (applied via SVG rx/ry attributes)\n * - State layers: 8% hover, 12% focus/pressed\n * - Disabled: 38% opacity\n * - Label spacing: 16px (ml-4)\n *\n * @example\n * ```tsx\n * // Basic usage\n * <Checkbox>Accept terms</Checkbox>\n *\n * // Controlled\n * <Checkbox isSelected={checked} onChange={setChecked}>\n * Subscribe\n * </Checkbox>\n *\n * // Indeterminate (partial selection)\n * <Checkbox isIndeterminate>Select all</Checkbox>\n *\n * // Error state\n * <Checkbox isInvalid>Required field</Checkbox>\n *\n * // Disabled\n * <Checkbox isDisabled>Disabled option</Checkbox>\n *\n * // Without label (icon-only)\n * <Checkbox aria-label=\"Accept\" />\n * ```\n */\nexport const Checkbox = forwardRef<HTMLInputElement, CheckboxProps>(\n (\n {\n // Content props\n children,\n\n // State props\n isIndeterminate = false,\n isInvalid = false,\n disableRipple = false,\n isDisabled = false,\n\n // Styling\n className,\n\n // Other props\n ...props\n },\n forwardedRef\n ) => {\n // Internal ref for React Aria\n const internalRef = useRef<HTMLInputElement>(null);\n\n // Merge internal ref with forwarded ref\n const ref = (forwardedRef ?? internalRef) as React.RefObject<HTMLInputElement>;\n\n // Extract data-testid and other HTML attributes\n const htmlAttrs = props as Record<string, unknown>;\n const dataTestId = htmlAttrs[\"data-testid\"] as string | undefined;\n const htmlId = htmlAttrs.id as string | undefined;\n const htmlTitle = htmlAttrs.title as string | undefined;\n\n // Remove HTML attributes from props for React Aria\n const {\n \"data-testid\": _dataTestId,\n id: _htmlId,\n title: _htmlTitle,\n ...restPropsWithoutHtmlAttrs\n } = props as Record<string, unknown>;\n\n // State management using React Stately\n const state = useToggleState(restPropsWithoutHtmlAttrs as Parameters<typeof useToggleState>[0]);\n\n // React Aria hooks - pass props without HTML attributes\n const { inputProps, labelProps } = useCheckbox(\n restPropsWithoutHtmlAttrs as Parameters<typeof useCheckbox>[0],\n state,\n ref\n );\n const { isFocusVisible, focusProps } = useFocusRing();\n\n // Get selected state\n const isSelected = state.isSelected;\n\n // Determine visual state\n const visualState = isIndeterminate ? \"indeterminate\" : isSelected ? \"checked\" : \"unchecked\";\n\n // Ripple effect\n const { onMouseDown: handleRipple, ripples } = useRipple({\n disabled: isDisabled || disableRipple,\n });\n\n // Sync indeterminate state to native input\n useEffect(() => {\n if (ref.current) {\n ref.current.indeterminate = isIndeterminate;\n }\n }, [isIndeterminate, ref]);\n\n // Development warnings\n if (process.env.NODE_ENV === \"development\") {\n const ariaProps = restPropsWithoutHtmlAttrs as {\n \"aria-label\"?: string;\n \"aria-labelledby\"?: string;\n };\n if (!children && !ariaProps[\"aria-label\"] && !ariaProps[\"aria-labelledby\"]) {\n console.warn(\n \"[Checkbox] Checkbox should have a label (children) or aria-label for accessibility.\"\n );\n }\n }\n\n return (\n <label\n {...labelProps}\n className={cn(\n checkboxVariants({\n disabled: isDisabled,\n }),\n className\n )}\n data-testid={dataTestId}\n title={htmlTitle}\n >\n {/* Visually hidden native input for accessibility */}\n <VisuallyHidden>\n <input {...mergeProps(inputProps, focusProps)} ref={ref} id={htmlId} />\n </VisuallyHidden>\n\n {/* Visual checkbox container */}\n <div\n role=\"presentation\"\n className={cn(\n checkboxContainerVariants({\n state: visualState,\n isInvalid,\n disabled: isDisabled,\n })\n )}\n onMouseDown={handleRipple}\n >\n {/* Ripple effect */}\n {ripples}\n\n {/* SVG Checkbox Visual */}\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 18 18\"\n aria-hidden=\"true\"\n className=\"relative z-10\"\n >\n {/* Checkbox box (rounded square) */}\n <rect\n x=\"0\"\n y=\"0\"\n width=\"18\"\n height=\"18\"\n rx=\"2\"\n ry=\"2\"\n className={cn(\n checkboxIconBoxVariants({\n state: visualState,\n disabled: isDisabled,\n })\n )}\n />\n\n {/* Checkmark icon (for checked state) */}\n {isSelected && !isIndeterminate && (\n <path\n d=\"M14.1 4.5L6.3 12.3l-3.4-3.4L1.5 10.3l4.8 4.8 9.2-9.2z\"\n className={cn(checkboxIconVariants({ type: \"check\" }), \"fill-on-primary\")}\n />\n )}\n\n {/* Dash icon (for indeterminate state) */}\n {isIndeterminate && (\n <rect\n x=\"4\"\n y=\"8\"\n width=\"10\"\n height=\"2\"\n className={cn(checkboxIconVariants({ type: \"dash\" }), \"fill-on-primary\")}\n />\n )}\n\n {/* Focus ring (visible on keyboard focus) */}\n {isFocusVisible && (\n <rect\n x=\"-3\"\n y=\"-3\"\n width=\"24\"\n height=\"24\"\n rx=\"12\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n className=\"animate-pulse\"\n />\n )}\n </svg>\n </div>\n\n {/* Label text */}\n {children && (\n <span\n className={cn(\n checkboxLabelVariants({\n disabled: isDisabled,\n })\n )}\n >\n {children}\n </span>\n )}\n </label>\n );\n }\n);\n\nCheckbox.displayName = \"Checkbox\";\n","import { cva, type VariantProps } from \"class-variance-authority\";\n\n/**\n * Material Design 3 Switch Variants\n *\n * Architecture: Variants vs States\n * - CVA holds design-time structure only (no state variants, no state compoundVariants).\n * - All interaction/selection states are driven by data-* attributes on the root via\n * group-data-[x]/switch Tailwind selectors in each slot's base classes.\n * - Content flags (data-with-icon) are set explicitly by the component, not via helper.\n * - The root element sets inherited CSS variables for dynamic geometry.\n *\n * Slot responsibilities:\n * switchRootVariants — label wrapper; carries `group/switch`; sets --switch-handle-size\n * switchTrackVariants — 52×32dp pill background; owns color/border\n * switchHandleContainerVariants — movement only (translate-x); hosts state layer\n * switchStateLayerVariants — hover/focus/pressed opacity ring\n * switchHandleVariants — size + color only (no positioning)\n * switchIconVariants — icon container inside handle\n * switchLabelVariants — text label next to track\n *\n * MD3 Spec:\n * Track: 52×32dp, border-radius 16dp (full), 2dp border\n * Handle: 16dp unselected | 24dp selected / with-icon | 28dp pressed\n * State-layer container: 40dp, centered on handle\n * State-layer opacities: hover 8% | focus 10% | pressed 10% | dragged 16%\n * Disabled: container 12% opacity, content 38% opacity\n */\n\n// ─── ROOT ─────────────────────────────────────────────────────────────────────\n\n/**\n * Root label wrapper — carries `group/switch` and handle geometry variables.\n *\n * Sets --switch-handle-size as an inherited CSS variable so both the container\n * and the handle slot can consume it without coupling. Priority order (last wins\n * in CSS cascade at equal specificity): base → selected → with-icon → pressed.\n */\nexport const switchRootVariants = cva([\n \"relative inline-flex items-center cursor-pointer select-none\",\n // Interaction states are styled via group-data on children.\n // Root's own disabled state must use self-targeting data-[x]: selectors.\n \"data-[disabled]:cursor-not-allowed data-[disabled]:pointer-events-none\",\n \"data-[disabled]:opacity-38\",\n // ── Handle size CSS variable ──────────────────────────────────────────────\n // Set via self-referential data-[x]: so all child slots inherit the value.\n // \"data-[selected]\" and \"data-[with-icon]\" have specificity (0,1,0).\n // \"data-[pressed]:data-[pressed]:\" doubles the attribute selector → (0,2,0),\n // guaranteeing it always wins regardless of Tailwind's CSS output order.\n \"[--switch-handle-size:1rem]\", // 16dp base\n \"data-[selected]:[--switch-handle-size:1.5rem]\", // 24dp selected\n \"data-[with-icon]:[--switch-handle-size:1.5rem]\", // 24dp with icon\n \"data-[pressed]:data-[pressed]:[--switch-handle-size:1.75rem]\", // 28dp pressed — doubled for higher specificity\n]);\n\n// ─── TRACK ────────────────────────────────────────────────────────────────────\n\n/**\n * Track — the 52×32dp pill background rail.\n * Owns background color, border color, and focus outline.\n * overflow-hidden clips the state-layer ring to the pill shape.\n */\nexport const switchTrackVariants = cva([\n \"relative flex items-center w-13 h-8 rounded-full border-2\",\n // Effects transition (color — no spatial overshoot)\n \"transition-colors duration-spring-standard-fast-effects ease-spring-standard-fast-effects\",\n // Unselected (base)\n \"bg-surface-container-highest border-outline\",\n // Selected\n \"group-data-[selected]/switch:bg-primary group-data-[selected]/switch:border-primary\",\n // Disabled (overrides selected via higher cascade position + same specificity)\n \"group-data-[disabled]/switch:bg-on-surface/12 group-data-[disabled]/switch:border-on-surface/12\",\n]);\n\n// ─── FOCUS RING ───────────────────────────────────────────────────────────────\n\n/**\n * Focus ring overlay (sibling of the track, outside overflow-hidden).\n * Renders as an absolutely-positioned outline so it sits above the track\n * border without being clipped.\n *\n * Replaces the non-MD3 animate-pulse ring from the previous implementation.\n */\nexport const switchFocusRingVariants = cva([\n // Sits outside the track's overflow-hidden by being rendered as a sibling,\n // not a child — see Switch.tsx for the relative wrapper structure.\n \"pointer-events-none absolute inset-[-3px] rounded-full\",\n \"outline outline-2 outline-offset-0 outline-secondary\",\n \"transition-opacity duration-spring-standard-fast-effects ease-spring-standard-fast-effects\",\n \"opacity-0\",\n \"group-data-[focus-visible]/switch:opacity-100\",\n]);\n\n// ─── HANDLE CONTAINER ────────────────────────────────────────────────────────\n\n/**\n * Handle container — movement only.\n *\n * Fixed 40dp circle (MD3 state-layer size), absolutely centred on the handle\n * position. Translates horizontally via group-data-[selected].\n *\n * Geometry:\n * -left-1.5 → container left edge at –6px from track inner-left. (2dp border + 4px gap)\n * Container center (40dp/2=20) at –4+20 = 16px from track inner-left.\n * Handle 16dp: center at 16px (symmetric gap of ~0px from inner-left arc) ✓\n * translate-x-5 (+20px): center at 36px from inner-left.\n * Handle 24dp: edges at 24–48px (inner track spans 0–48px) ✓\n */\nexport const switchHandleContainerVariants = cva([\n \"absolute top-1/2 -translate-y-1/2 -left-1.5 size-10\",\n \"flex items-center justify-center rounded-full\",\n // Spatial transition for movement (position is spatial, not an effect)\n \"transition-transform duration-spring-standard-fast-spatial ease-spring-standard-fast-spatial\",\n // Travel to selected position\n \"group-data-[selected]/switch:translate-x-5\",\n]);\n\n// ─── STATE LAYER ─────────────────────────────────────────────────────────────\n\n/**\n * State layer — the 40dp semi-transparent ring inside the handle container.\n *\n * Color: on-surface (unselected) → primary (selected).\n * Opacity: 0 at rest, 8% hover, 10% focus/pressed, hidden when disabled.\n */\nexport const switchStateLayerVariants = cva([\n \"absolute inset-0 rounded-full pointer-events-none opacity-0\",\n // Base state-layer color (unselected)\n \"bg-on-surface\",\n // Effects transition for opacity\n \"transition-opacity duration-spring-standard-fast-effects ease-spring-standard-fast-effects\",\n // Selected state-layer color\n \"group-data-[selected]/switch:bg-primary\",\n // Interaction opacities (MD3: hover 8%, focus/pressed 10%)\n \"group-data-[hovered]/switch:opacity-8\",\n \"group-data-[focus-visible]/switch:opacity-10\",\n \"group-data-[pressed]/switch:opacity-10\",\n // No state layer when disabled\n \"group-data-[disabled]/switch:hidden\",\n]);\n\n// ─── HANDLE ───────────────────────────────────────────────────────────────────\n\n/**\n * Handle (thumb) — size and color only, no positioning.\n *\n * Size: inherited from --switch-handle-size CSS variable set on root.\n * 16dp unselected → 24dp selected/icon → 28dp pressed.\n *\n * Color progression (singly-chained rules come first; doubly-chained win by\n * higher specificity; disabled rules placed last win by cascade order within\n * equal specificity):\n * base: outline\n * selected: on-primary\n * unselected+int: on-surface-variant (singly-chained)\n * selected+int: primary-container (doubly-chained → higher specificity)\n * disabled: on-surface/38 (singly-chained, placed last → cascade wins)\n * disabled+sel: surface (doubly-chained → highest for this combo)\n */\nexport const switchHandleVariants = cva([\n \"relative z-10 rounded-full flex items-center justify-center flex-shrink-0\",\n // Size via inherited CSS variable\n \"size-[var(--switch-handle-size,1rem)]\",\n // Spatial transition for size changes + effects for color\n \"transition-[width,height,background-color] duration-spring-standard-fast-spatial ease-spring-standard-fast-spatial\",\n // ── Colors ────────────────────────────────────────────────────────────────\n // Base (unselected, enabled, no interaction)\n \"bg-outline\",\n // Selected\n \"group-data-[selected]/switch:bg-on-primary\",\n // Unselected + interaction (singly-chained — overrides base by cascade order)\n \"group-data-[hovered]/switch:bg-on-surface-variant\",\n \"group-data-[focus-visible]/switch:bg-on-surface-variant\",\n \"group-data-[pressed]/switch:bg-on-surface-variant\",\n // Selected + interaction (doubly-chained → higher specificity; wins over singly-chained above)\n \"group-data-[selected]/switch:group-data-[hovered]/switch:bg-primary-container\",\n \"group-data-[selected]/switch:group-data-[focus-visible]/switch:bg-primary-container\",\n \"group-data-[selected]/switch:group-data-[pressed]/switch:bg-primary-container\",\n // Disabled — placed last so cascade wins at equal specificity vs interaction colors\n \"group-data-[disabled]/switch:bg-on-surface/38\",\n // Disabled + selected — doubly-chained wins over singly-chained disabled\n \"group-data-[selected]/switch:group-data-[disabled]/switch:bg-surface\",\n]);\n\n// ─── ICON ─────────────────────────────────────────────────────────────────────\n\n/**\n * Icon container inside the handle.\n *\n * Color follows the MD3 spec:\n * unselected: surface-container-highest (icon blends with track bg)\n * selected: on-primary-container\n * disabled: on-surface/38\n */\nexport const switchIconVariants = cva([\n \"size-4 flex items-center justify-center flex-shrink-0\",\n \"transition-colors duration-spring-standard-fast-effects ease-spring-standard-fast-effects\",\n // Unselected icon color (matches track bg, visually \"hidden\" at rest)\n \"text-surface-container-highest\",\n // Selected icon color\n \"group-data-[selected]/switch:text-on-primary-container\",\n // Disabled\n \"group-data-[disabled]/switch:text-on-surface/38\",\n]);\n\n// ─── LABEL ────────────────────────────────────────────────────────────────────\n\n/**\n * Text label next to the track.\n * Disabled opacity is inherited from the root's data-[disabled]:opacity-38.\n */\nexport const switchLabelVariants = cva([\"text-body-medium text-on-surface select-none ml-4\"]);\n\n// ─── EXPORTED TYPES ───────────────────────────────────────────────────────────\n\nexport type SwitchRootVariants = VariantProps<typeof switchRootVariants>;\nexport type SwitchTrackVariants = VariantProps<typeof switchTrackVariants>;\nexport type SwitchHandleContainerVariants = VariantProps<typeof switchHandleContainerVariants>;\nexport type SwitchStateLayerVariants = VariantProps<typeof switchStateLayerVariants>;\nexport type SwitchHandleVariants = VariantProps<typeof switchHandleVariants>;\nexport type SwitchIconVariants = VariantProps<typeof switchIconVariants>;\nexport type SwitchLabelVariants = VariantProps<typeof switchLabelVariants>;\n","\"use client\";\n\nimport { forwardRef, useRef } from \"react\";\nimport type React from \"react\";\nimport { useSwitch, useFocusRing, useHover, mergeProps, VisuallyHidden } from \"react-aria\";\nimport { useToggleState } from \"react-stately\";\nimport { cn } from \"../../utils/cn\";\nimport { getInteractionDataAttributes } from \"../../utils/interactionStates\";\nimport { useRipple } from \"../../hooks/useRipple\";\nimport {\n switchRootVariants,\n switchTrackVariants,\n switchFocusRingVariants,\n switchHandleContainerVariants,\n switchStateLayerVariants,\n switchHandleVariants,\n switchIconVariants,\n switchLabelVariants,\n} from \"./Switch.variants\";\nimport type { SwitchProps } from \"./Switch.types\";\n\n/**\n * Material Design 3 Switch Component (Layer 3: Styled)\n *\n * Built on React Aria for world-class accessibility.\n * Implements the Variants-vs-States architecture: all interaction/selection\n * states are expressed as data-* attributes on the root and consumed by each\n * slot via group-data-[x]/switch Tailwind selectors — no state variants in CVA.\n *\n * Features:\n * - ✅ 2 states: on/off (not selection like checkbox)\n * - ✅ Optional icons in handle\n * - ✅ Ripple effect (Material Design)\n * - ✅ Full keyboard accessibility (via React Aria)\n * - ✅ Screen reader support (via React Aria)\n * - ✅ Focus management (via React Aria)\n * - ✅ Form integration (name, value props)\n *\n * MD3 Specifications:\n * - Track: 52×32dp (border-radius 16dp)\n * - Handle: 16dp (unselected) | 24dp (selected / with-icon) | 28dp (pressed)\n * - State-layer container: 40dp centered on handle\n * - State-layer opacities: hover 8% | focus 10% | pressed 10%\n * - Disabled: container 12% | content 38% opacity\n * - Label spacing: 16px (ml-4)\n *\n * @example\n * ```tsx\n * // Basic usage\n * <Switch>Low power mode</Switch>\n *\n * // Controlled\n * <Switch isSelected={isOn} onChange={setIsOn}>\n * Notifications\n * </Switch>\n *\n * // With icons\n * <Switch icon={<IconClose />} selectedIcon={<IconCheck />}>\n * Airplane mode\n * </Switch>\n *\n * // Disabled\n * <Switch isDisabled>Disabled option</Switch>\n *\n * // Without label (icon-only)\n * <Switch aria-label=\"Toggle feature\" />\n * ```\n */\nexport const Switch = forwardRef<HTMLInputElement, SwitchProps>(\n (\n {\n children,\n icon,\n selectedIcon,\n disableRipple = false,\n isDisabled = false,\n className,\n ...props\n },\n forwardedRef\n ) => {\n const internalRef = useRef<HTMLInputElement>(null);\n const ref = (forwardedRef ?? internalRef) as React.RefObject<HTMLInputElement>;\n\n // Extract passthrough HTML attributes that React Aria doesn't understand\n const htmlAttrs = props as Record<string, unknown>;\n const dataTestId = htmlAttrs[\"data-testid\"] as string | undefined;\n const htmlId = htmlAttrs.id as string | undefined;\n const htmlTitle = htmlAttrs.title as string | undefined;\n\n const {\n \"data-testid\": _dataTestId,\n id: _htmlId,\n title: _htmlTitle,\n ...ariaProps\n } = props as Record<string, unknown>;\n\n // React Stately — toggle state\n const state = useToggleState(ariaProps as Parameters<typeof useToggleState>[0]);\n\n // React Aria hooks\n const { inputProps, labelProps, isPressed } = useSwitch(\n ariaProps as Parameters<typeof useSwitch>[0],\n state,\n ref\n );\n const { isFocusVisible, focusProps } = useFocusRing();\n const { isHovered, hoverProps } = useHover({ isDisabled });\n\n const isSelected = state.isSelected;\n const hasIcon = !!icon || !!selectedIcon;\n\n // Ripple effect on the handle container\n const { onMouseDown: handleRipple, ripples } = useRipple({\n disabled: isDisabled || disableRipple,\n });\n\n if (process.env.NODE_ENV === \"development\") {\n const a = ariaProps as { \"aria-label\"?: string; \"aria-labelledby\"?: string };\n if (!children && !a[\"aria-label\"] && !a[\"aria-labelledby\"]) {\n console.warn(\"[Switch] Provide a label via children or aria-label for accessibility.\");\n }\n }\n\n return (\n <label\n {...mergeProps(labelProps, hoverProps)}\n className={cn(switchRootVariants(), \"group/switch\", className)}\n data-testid={dataTestId}\n title={htmlTitle}\n // ── Interaction data attributes (from React Aria state) ──────────\n {...getInteractionDataAttributes({\n isHovered,\n isFocusVisible,\n isPressed,\n isSelected,\n isDisabled,\n // isReadOnly can be undefined; ?? false satisfies exactOptionalPropertyTypes\n isReadOnly: (ariaProps as { isReadOnly?: boolean }).isReadOnly ?? false,\n })}\n // ── Content flag (describes structure, NOT interaction state) ────\n data-with-icon={hasIcon ? \"\" : undefined}\n >\n {/* Visually hidden native input — handles all accessibility */}\n <VisuallyHidden>\n <input {...mergeProps(inputProps, focusProps)} ref={ref} id={htmlId} />\n </VisuallyHidden>\n\n {/*\n * Relative wrapper — gives the focus ring an absolute positioning\n * context that is outside the track's overflow-hidden, so the ring\n * is never clipped.\n */}\n <div role=\"presentation\" className=\"relative\">\n {/* Focus ring — sibling of track div, not clipped by overflow-hidden */}\n <div className={cn(switchFocusRingVariants())} aria-hidden=\"true\" />\n\n {/* Track — overflow-hidden clips the state layer to the pill shape */}\n <div className={cn(switchTrackVariants())}>\n {/* Handle container — movement only (translate-x) */}\n <div\n role=\"presentation\"\n className={cn(switchHandleContainerVariants())}\n onMouseDown={handleRipple}\n >\n {/* Ripple */}\n {ripples}\n\n {/* State layer — hover/focus/pressed opacity ring */}\n <span className={cn(switchStateLayerVariants())} aria-hidden=\"true\" />\n\n {/* Handle — size + color only */}\n <div className={cn(switchHandleVariants())} aria-hidden=\"true\">\n {/* Icon when unselected */}\n {!isSelected && icon && <span className={cn(switchIconVariants())}>{icon}</span>}\n {/* Icon when selected */}\n {isSelected && selectedIcon && (\n <span className={cn(switchIconVariants())}>{selectedIcon}</span>\n )}\n </div>\n </div>\n </div>\n </div>\n\n {/* Text label */}\n {children && <span className={cn(switchLabelVariants())}>{children}</span>}\n </label>\n );\n }\n);\n\nSwitch.displayName = \"Switch\";\n","import { createContext, forwardRef, useRef } from \"react\";\nimport { useRadioGroup } from \"react-aria\";\nimport { useRadioGroupState } from \"react-stately\";\nimport type { RadioGroupState } from \"react-stately\";\nimport type { RadioGroupHeadlessProps } from \"./Radio.types\";\n\n/**\n * Context to provide RadioGroup state to child Radio components\n */\nexport const RadioGroupContext = createContext<RadioGroupState | null>(null);\n\n/**\n * Headless RadioGroup Component (Layer 2)\n *\n * Unstyled radio group primitive using React Aria for accessibility.\n * Provides behavior only - bring your own styles.\n *\n * Features:\n * - Full keyboard navigation (Arrow keys, Tab)\n * - Screen reader support\n * - Single-selection enforcement\n * - Focus management\n * - Disabled state handling\n * - Form integration\n *\n * @example\n * ```tsx\n * // Use for custom styling\n * <RadioGroupHeadless label=\"Options\" className=\"custom-group\">\n * <RadioHeadless value=\"a\">Option A</RadioHeadless>\n * <RadioHeadless value=\"b\">Option B</RadioHeadless>\n * </RadioGroupHeadless>\n * ```\n */\nexport const RadioGroupHeadless = forwardRef<HTMLDivElement, RadioGroupHeadlessProps>(\n ({ className, children, renderLabel, ...props }, forwardedRef) => {\n // Internal ref for React Aria\n const internalRef = useRef<HTMLDivElement>(null);\n\n // Merge internal ref with forwarded ref\n const ref = (forwardedRef ?? internalRef) as React.RefObject<HTMLDivElement>;\n\n // State management using React Stately\n const state = useRadioGroupState(props);\n\n // React Aria hook - handles all accessibility\n const { radioGroupProps, labelProps } = useRadioGroup(props, state);\n\n // Extract data-testid if present\n const dataTestId = (props as unknown as { \"data-testid\"?: string })[\"data-testid\"];\n\n return (\n <div {...radioGroupProps} ref={ref} className={className} data-testid={dataTestId}>\n {/* Group label — rendered via slot when provided, otherwise default span */}\n {props.label &&\n (renderLabel ? renderLabel(labelProps) : <span {...labelProps}>{props.label}</span>)}\n\n {/* Provide state to child Radio components via context */}\n <RadioGroupContext.Provider value={state}>{children}</RadioGroupContext.Provider>\n </div>\n );\n }\n);\n\nRadioGroupHeadless.displayName = \"RadioGroupHeadless\";\n","import { cva, type VariantProps } from \"class-variance-authority\";\n\n/**\n * Material Design 3 RadioGroup Variants (CVA)\n *\n * Type-safe variant management for RadioGroup component.\n * Uses Tailwind CSS classes mapped to MD3 design tokens.\n *\n * MD3 Specifications:\n * - Radio icon: 20x20dp (within 40x40dp touch target)\n * - Outline width: 2dp\n * - State layers: 8% hover, 12% focus/pressed\n * - Disabled: 38% opacity\n * - Radio spacing: 16px gap between radios\n */\nexport const radioGroupVariants = cva(\n [\n // Base classes (always applied to group wrapper)\n \"flex\",\n \"gap-4\", // 16px spacing between radios (MD3 standard)\n ],\n {\n variants: {\n /**\n * Layout orientation\n */\n orientation: {\n vertical: \"flex-col\",\n horizontal: \"flex-row flex-wrap\",\n },\n\n /**\n * Disabled state\n */\n disabled: {\n true: \"\",\n false: \"\",\n },\n },\n defaultVariants: {\n orientation: \"vertical\",\n disabled: false,\n },\n }\n);\n\n/**\n * RadioGroup label variants\n */\nexport const radioGroupLabelVariants = cva(\n [\n \"text-sm font-medium\", // MD3: Body Medium\n \"text-on-surface\",\n \"mb-3\", // Spacing below label (12px)\n ],\n {\n variants: {\n disabled: {\n true: \"opacity-38\",\n false: \"\",\n },\n },\n defaultVariants: {\n disabled: false,\n },\n }\n);\n\n/**\n * Material Design 3 Radio Variants (CVA)\n *\n * Type-safe variant management for Radio component.\n * Uses Tailwind CSS classes mapped to MD3 design tokens.\n *\n * MD3 Specifications:\n * - Radio icon: 20x20dp (within 40x40dp touch target)\n * - Outline width: 2dp\n * - Inner dot: 10px (selected state)\n * - State layers: 8% hover, 12% focus/pressed\n * - Disabled: 38% opacity\n * - Label spacing: 16px (ml-4)\n */\nexport const radioVariants = cva(\n [\n // Base classes (always applied to label wrapper)\n \"relative inline-flex items-center cursor-pointer select-none\",\n \"transition-opacity duration-200\",\n ],\n {\n variants: {\n /**\n * Disabled state\n */\n disabled: {\n true: \"opacity-38 cursor-not-allowed pointer-events-none\",\n false: \"\",\n },\n },\n defaultVariants: {\n disabled: false,\n },\n }\n);\n\n/**\n * Radio container variants (for the visual radio circle)\n */\nexport const radioContainerVariants = cva(\n [\n // Base classes for radio visual container\n \"relative inline-flex items-center justify-center\",\n \"w-10 h-10\", // 40x40dp touch target (MD3 spec)\n \"flex-shrink-0\",\n \"transition-all duration-200\",\n \"m-1\", // 4px margin around radio for spacing (total 8px gap between radios)\n // State layer (hover, focus, active) - MD3 spec: 8%/12%/12% opacity\n \"before:absolute before:inset-0 before:rounded-full before:transition-opacity before:duration-200\",\n \"before:bg-current before:opacity-0\",\n \"hover:before:opacity-8\",\n \"active:before:opacity-12\",\n ],\n {\n variants: {\n /**\n * Radio state (determines visual appearance)\n */\n state: {\n unselected: \"text-on-surface-variant\",\n selected: \"text-primary\",\n },\n\n /**\n * Error/invalid state\n */\n isInvalid: {\n true: \"text-error\",\n false: \"\",\n },\n\n /**\n * Disabled state\n */\n disabled: {\n true: \"text-on-surface pointer-events-none\",\n false: \"\",\n },\n },\n compoundVariants: [\n // Error state overrides normal colors for all states\n {\n state: \"unselected\",\n isInvalid: true,\n disabled: false,\n className: \"text-error\",\n },\n {\n state: \"selected\",\n isInvalid: true,\n disabled: false,\n className: \"text-error\",\n },\n ],\n defaultVariants: {\n state: \"unselected\",\n isInvalid: false,\n disabled: false,\n },\n }\n);\n\n/**\n * Radio icon outer circle variants (the 20x20dp circle)\n */\nexport const radioIconOuterVariants = cva(\n [\n // Base classes for the radio outer circle\n \"transition-all duration-200 stroke-current stroke-2 fill-transparent\",\n ],\n {\n variants: {\n /**\n * Radio state\n */\n state: {\n unselected: [],\n selected: [],\n },\n\n /**\n * Disabled state\n */\n disabled: {\n true: [\"fill-transparent\", \"stroke-current\", \"stroke-2\"],\n false: \"\",\n },\n },\n compoundVariants: [\n // Disabled + selected state overrides fill\n {\n state: \"selected\",\n disabled: true,\n className: \"fill-current stroke-none\",\n },\n ],\n defaultVariants: {\n state: \"unselected\",\n disabled: false,\n },\n }\n);\n\n/**\n * Radio icon inner dot variants (the 10px center dot when selected)\n */\nexport const radioIconInnerVariants = cva([\"transition-all origin-center duration-200\"], {\n variants: {\n /**\n * Visibility based on state\n */\n state: {\n selected: [\"fill-current\"],\n unselected: [\"fill-transparent\"],\n },\n visible: {\n true: \"opacity-100 scale-100 fill-current\",\n false: \"opacity-0 scale-0\",\n },\n },\n defaultVariants: {\n visible: false,\n },\n});\n\n/**\n * Radio label text variants\n */\nexport const radioLabelVariants = cva(\n [\n \"text-sm\", // MD3: Body Medium (14px)\n \"text-on-surface\",\n \"select-none\",\n ],\n {\n variants: {\n disabled: {\n true: \"\",\n false: \"\",\n },\n },\n defaultVariants: {\n disabled: false,\n },\n }\n);\n\n/**\n * Extract variant prop types from CVA\n */\nexport type RadioGroupVariants = VariantProps<typeof radioGroupVariants>;\nexport type RadioGroupLabelVariants = VariantProps<typeof radioGroupLabelVariants>;\nexport type RadioVariants = VariantProps<typeof radioVariants>;\nexport type RadioContainerVariants = VariantProps<typeof radioContainerVariants>;\nexport type RadioIconOuterVariants = VariantProps<typeof radioIconOuterVariants>;\nexport type RadioIconInnerVariants = VariantProps<typeof radioIconInnerVariants>;\nexport type RadioLabelVariants = VariantProps<typeof radioLabelVariants>;\n","\"use client\";\n\nimport { forwardRef, useRef, useContext } from \"react\";\nimport type React from \"react\";\nimport { useRadio, useFocusRing, mergeProps, VisuallyHidden } from \"react-aria\";\nimport { cn } from \"../../utils/cn\";\nimport { useRipple } from \"../../hooks/useRipple\";\nimport { RadioGroupContext } from \"./RadioGroupHeadless\";\nimport {\n radioVariants,\n radioContainerVariants,\n radioIconOuterVariants,\n radioIconInnerVariants,\n radioLabelVariants,\n} from \"./Radio.variants\";\nimport type { RadioProps } from \"./Radio.types\";\n\n/**\n * Material Design 3 Radio Component (Layer 3: Styled)\n *\n * Built on React Aria for world-class accessibility.\n * Uses CVA for type-safe variant management.\n * Styled with Tailwind CSS using MD3 design tokens.\n * Must be used within a RadioGroup for proper functionality.\n *\n * Features:\n * - ✅ 2 states: unselected, selected\n * - ✅ Ripple effect (Material Design)\n * - ✅ Full keyboard accessibility (via React Aria)\n * - ✅ Screen reader support (via React Aria)\n * - ✅ Focus management (via React Aria)\n * - ✅ Form integration (name, value props from RadioGroup)\n *\n * MD3 Specifications:\n * - Radio icon: 20x20dp (within 40x40dp touch target)\n * - Outer circle: 20px\n * - Inner dot: 10px (selected state)\n * - Outline width: 2dp\n * - State layers: 8% hover, 12% focus/pressed\n * - Disabled: 38% opacity\n * - Label spacing: 16px (ml-4)\n *\n * @example\n * ```tsx\n * // Basic usage within RadioGroup\n * <RadioGroup label=\"Options\">\n * <Radio value=\"a\">Option A</Radio>\n * <Radio value=\"b\">Option B</Radio>\n * </RadioGroup>\n *\n * // Without label (needs aria-label)\n * <RadioGroup label=\"Options\">\n * <Radio value=\"a\" aria-label=\"Option A\" />\n * </RadioGroup>\n *\n * // Disabled individual radio\n * <RadioGroup label=\"Options\">\n * <Radio value=\"a\">Enabled</Radio>\n * <Radio value=\"b\" isDisabled>Disabled</Radio>\n * </RadioGroup>\n *\n * // Custom styling\n * <Radio value=\"custom\" className=\"my-custom-class\">\n * Custom\n * </Radio>\n * ```\n */\nexport const Radio = forwardRef<HTMLInputElement, RadioProps>(\n (\n {\n // Content props\n children,\n\n // State props\n disableRipple = false,\n isDisabled = false,\n\n // Styling\n className,\n\n // Other props\n ...props\n },\n forwardedRef\n ) => {\n // Get RadioGroup state from context\n const state = useContext(RadioGroupContext);\n\n if (!state) {\n throw new Error(\"Radio must be used within a RadioGroup\");\n }\n\n // Internal ref for React Aria\n const internalRef = useRef<HTMLInputElement>(null);\n\n // Merge internal ref with forwarded ref\n const ref = (forwardedRef ?? internalRef) as React.RefObject<HTMLInputElement>;\n\n // Extract data-testid and other HTML attributes\n const htmlAttrs = props as Record<string, unknown>;\n const dataTestId = htmlAttrs[\"data-testid\"] as string | undefined;\n const htmlId = htmlAttrs.id as string | undefined;\n const htmlTitle = htmlAttrs.title as string | undefined;\n\n // Remove HTML attributes from props for React Aria\n const {\n \"data-testid\": _dataTestId,\n id: _htmlId,\n title: _htmlTitle,\n ...restPropsWithoutHtmlAttrs\n } = props as Record<string, unknown>;\n\n // React Aria hooks - pass props without HTML attributes\n const {\n inputProps,\n isSelected,\n isDisabled: radioIsDisabled,\n } = useRadio(\n {\n ...restPropsWithoutHtmlAttrs,\n value: props.value,\n } as Parameters<typeof useRadio>[0],\n state,\n ref\n );\n const { isFocusVisible, focusProps } = useFocusRing();\n\n // Determine final disabled state (group or individual)\n const finalIsDisabled = isDisabled || radioIsDisabled;\n\n // Determine visual state\n const visualState = isSelected ? \"selected\" : \"unselected\";\n\n // Ripple effect\n const { onMouseDown: handleRipple, ripples } = useRipple({\n disabled: finalIsDisabled || disableRipple,\n });\n\n // Development warnings\n if (process.env.NODE_ENV === \"development\") {\n const ariaProps = restPropsWithoutHtmlAttrs as {\n \"aria-label\"?: string;\n \"aria-labelledby\"?: string;\n };\n if (!children && !ariaProps[\"aria-label\"] && !ariaProps[\"aria-labelledby\"]) {\n console.warn(\n \"[Radio] Radio should have a label (children) or aria-label for accessibility.\"\n );\n }\n }\n\n // Get isInvalid from RadioGroup state if available\n const isInvalid = state.validationState === \"invalid\";\n\n return (\n <label\n className={cn(\n radioVariants({\n disabled: finalIsDisabled,\n }),\n className\n )}\n data-testid={dataTestId}\n title={htmlTitle}\n >\n {/* Visually hidden native input for accessibility */}\n <VisuallyHidden>\n <input {...mergeProps(inputProps, focusProps)} ref={ref} id={htmlId} />\n </VisuallyHidden>\n\n {/* Visual radio container */}\n <div\n role=\"presentation\"\n className={cn(\n radioContainerVariants({\n state: visualState,\n isInvalid,\n disabled: finalIsDisabled,\n })\n )}\n onMouseDown={handleRipple}\n >\n {/* Ripple effect */}\n {ripples}\n\n {/* SVG Radio Visual */}\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n aria-hidden=\"true\"\n className=\"relative z-10\"\n >\n {/* Outer circle (20x20) */}\n <circle\n cx=\"10\"\n cy=\"10\"\n r=\"9\"\n className={cn(\n radioIconOuterVariants({\n state: visualState,\n disabled: finalIsDisabled,\n })\n )}\n />\n\n {/* Inner dot (10px diameter = 5px radius, shown when selected) */}\n <circle\n cx=\"10\"\n cy=\"10\"\n r=\"5\"\n className={cn(\n radioIconInnerVariants({\n visible: isSelected,\n })\n )}\n />\n\n {/* Focus ring (visible on keyboard focus) */}\n {isFocusVisible && (\n <circle\n cx=\"10\"\n cy=\"10\"\n r=\"13\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n className=\"animate-pulse\"\n />\n )}\n </svg>\n </div>\n\n {/* Label text */}\n {children && (\n <span\n className={cn(\n radioLabelVariants({\n disabled: finalIsDisabled,\n })\n )}\n >\n {children}\n </span>\n )}\n </label>\n );\n }\n);\n\nRadio.displayName = \"Radio\";\n","\"use client\";\n\nimport { forwardRef } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { RadioGroupHeadless } from \"./RadioGroupHeadless\";\nimport { radioGroupVariants, radioGroupLabelVariants } from \"./Radio.variants\";\nimport type { RadioGroupProps } from \"./Radio.types\";\n\n/**\n * Material Design 3 RadioGroup Component (Layer 3: Styled)\n *\n * Built on React Aria for world-class accessibility.\n * Uses CVA for type-safe variant management.\n * Styled with Tailwind CSS using MD3 design tokens.\n *\n * Features:\n * - ✅ Single-selection behavior\n * - ✅ Horizontal and vertical orientation\n * - ✅ Error/invalid state support\n * - ✅ Full keyboard accessibility (via React Aria)\n * - ✅ Screen reader support (via React Aria)\n * - ✅ Focus management (via React Aria)\n * - ✅ Form integration (name, value props)\n *\n * MD3 Specifications:\n * - Radio icon: 20x20dp (within 40x40dp touch target)\n * - State layers: 8% hover, 12% focus/pressed\n * - Disabled: 38% opacity\n * - Radio spacing: 16px gap\n *\n * @example\n * ```tsx\n * // Basic usage (vertical)\n * <RadioGroup label=\"Favorite color\">\n * <Radio value=\"red\">Red</Radio>\n * <Radio value=\"blue\">Blue</Radio>\n * </RadioGroup>\n *\n * // Horizontal orientation\n * <RadioGroup label=\"Size\" orientation=\"horizontal\">\n * <Radio value=\"s\">Small</Radio>\n * <Radio value=\"m\">Medium</Radio>\n * <Radio value=\"l\">Large</Radio>\n * </RadioGroup>\n *\n * // Controlled\n * <RadioGroup label=\"Choice\" value={selected} onChange={setSelected}>\n * <Radio value=\"a\">Option A</Radio>\n * <Radio value=\"b\">Option B</Radio>\n * </RadioGroup>\n *\n * // Error state\n * <RadioGroup label=\"Required\" isInvalid>\n * <Radio value=\"yes\">Yes</Radio>\n * <Radio value=\"no\">No</Radio>\n * </RadioGroup>\n *\n * // Disabled\n * <RadioGroup label=\"Options\" isDisabled>\n * <Radio value=\"a\">Option A</Radio>\n * <Radio value=\"b\">Option B</Radio>\n * </RadioGroup>\n * ```\n */\nexport const RadioGroup = forwardRef<HTMLDivElement, RadioGroupProps>(\n (\n {\n // Content props\n children,\n\n // State props\n orientation = \"vertical\",\n isInvalid: _isInvalid = false,\n isDisabled = false,\n\n // Styling\n className,\n\n // Other props\n ...props\n },\n ref\n ) => {\n // Extract data-testid and other HTML attributes\n const htmlAttrs = props as Record<string, unknown>;\n const dataTestId = htmlAttrs[\"data-testid\"] as string | undefined;\n\n // Remove HTML attributes from props for React Aria\n const { \"data-testid\": _dataTestId, ...restPropsWithoutHtmlAttrs } = props as Record<\n string,\n unknown\n >;\n\n // Development warnings\n if (process.env.NODE_ENV === \"development\") {\n const ariaProps = restPropsWithoutHtmlAttrs as {\n label?: string;\n \"aria-label\"?: string;\n \"aria-labelledby\"?: string;\n };\n if (!ariaProps.label && !ariaProps[\"aria-label\"] && !ariaProps[\"aria-labelledby\"]) {\n console.warn(\n \"[RadioGroup] RadioGroup should have a label or aria-label for accessibility.\"\n );\n }\n }\n\n return (\n <RadioGroupHeadless\n {...restPropsWithoutHtmlAttrs}\n isDisabled={isDisabled}\n ref={ref}\n className={cn(\"flex flex-col\", className)}\n data-testid={dataTestId}\n renderLabel={(labelProps) => (\n <div\n {...labelProps}\n className={cn(\n radioGroupLabelVariants({\n disabled: isDisabled,\n })\n )}\n >\n {props.label}\n </div>\n )}\n >\n {/* Radio buttons container */}\n <div\n className={cn(\n radioGroupVariants({\n orientation,\n disabled: isDisabled,\n })\n )}\n >\n {children}\n </div>\n </RadioGroupHeadless>\n );\n }\n);\n\nRadioGroup.displayName = \"RadioGroup\";\n","import { forwardRef, useRef, useContext } from \"react\";\nimport { useRadio, useFocusRing } from \"react-aria\";\nimport { RadioGroupContext } from \"./RadioGroupHeadless\";\nimport type { RadioHeadlessProps } from \"./Radio.types\";\n\n/**\n * Headless Radio Component (Layer 2)\n *\n * Unstyled radio primitive using React Aria for accessibility.\n * Provides behavior only - bring your own styles.\n * Must be used within a RadioGroup for proper functionality.\n *\n * Features:\n * - Full keyboard navigation (Space to select)\n * - Screen reader support\n * - Touch/pointer event handling\n * - Focus management\n * - Disabled state handling\n * - Form integration\n *\n * @example\n * ```tsx\n * // Use for custom styling\n * <RadioGroupHeadless label=\"Options\">\n * <RadioHeadless value=\"a\" className=\"custom-radio\">\n * Option A\n * </RadioHeadless>\n * </RadioGroupHeadless>\n *\n * // With render prop for custom visual\n * <RadioHeadless\n * value=\"a\"\n * renderRadio={({ isSelected }) => (\n * <CustomRadioIcon checked={isSelected} />\n * )}\n * >\n * Custom visual\n * </RadioHeadless>\n * ```\n */\nexport const RadioHeadless = forwardRef<HTMLInputElement, RadioHeadlessProps>(\n ({ className, children, renderRadio, ...props }, forwardedRef) => {\n // Get RadioGroup state from context\n const state = useContext(RadioGroupContext);\n\n if (!state) {\n throw new Error(\"RadioHeadless must be used within a RadioGroupHeadless\");\n }\n\n // Internal ref for React Aria\n const internalRef = useRef<HTMLInputElement>(null);\n\n // Merge internal ref with forwarded ref\n const ref = (forwardedRef ?? internalRef) as React.RefObject<HTMLInputElement>;\n\n // React Aria hook - handles all accessibility\n const { inputProps, isSelected, isDisabled, isPressed } = useRadio(props, state, ref);\n\n // Focus ring for keyboard navigation\n const { isFocusVisible, focusProps } = useFocusRing();\n\n return (\n <label className={className}>\n <input {...inputProps} {...focusProps} ref={ref} />\n {renderRadio?.({\n isSelected,\n isDisabled,\n isFocusVisible,\n isPressed,\n })}\n {children}\n </label>\n );\n }\n);\n\nRadioHeadless.displayName = \"RadioHeadless\";\n","import { createContext, forwardRef, useContext, useRef } from \"react\";\nimport { useTab, useTabList, useTabPanel, useFocusRing } from \"react-aria\";\nimport { mergeProps } from \"@react-aria/utils\";\nimport type { TabListState } from \"react-stately\";\nimport type {\n HeadlessTabProps,\n HeadlessTabPanelProps,\n TabItem,\n HeadlessTabsContextValue,\n} from \"./Tabs.types\";\n\n/**\n * Context providing React Aria tab state to all headless primitives.\n * State is created in the Tabs wrapper and shared here.\n */\nexport const HeadlessTabsContext = createContext<HeadlessTabsContextValue | null>(null);\n\n/**\n * Hook to consume the headless tabs context\n * @internal\n */\nexport function useHeadlessTabsContext(componentName: string): HeadlessTabsContextValue {\n const context = useContext(HeadlessTabsContext);\n if (!context) {\n throw new Error(`${componentName} must be used within a Tabs component`);\n }\n return context;\n}\n\n/**\n * Props for the HeadlessTabList container.\n * State is injected from HeadlessTabsContext (created in Tabs wrapper).\n */\nexport interface HeadlessTabListContainerProps {\n /** Children are Tab elements */\n children: React.ReactNode;\n /** Additional CSS classes */\n className?: string;\n}\n\n/**\n * Headless TabList Component (Layer 2)\n *\n * Unstyled tab list container. Applies useTabList to the container element\n * which wires up role=\"tablist\", aria-label, and keyboard navigation.\n * State must be provided via HeadlessTabsContext (from the Tabs wrapper).\n *\n * @example\n * ```tsx\n * // Advanced usage via headless primitives\n * // State is provided by the Tabs wrapper above in the tree\n * <HeadlessTabList className=\"my-tablist\">\n * {items.map(item => <HeadlessTab key={item.key} item={item} />)}\n * </HeadlessTabList>\n * ```\n */\nexport const HeadlessTabList = forwardRef<HTMLDivElement, HeadlessTabListContainerProps>(\n ({ children, className }, forwardedRef) => {\n const { state } = useHeadlessTabsContext(\"HeadlessTabList\");\n\n const internalRef = useRef<HTMLDivElement>(null);\n const ref = (forwardedRef ?? internalRef) as React.RefObject<HTMLDivElement>;\n\n const { tabListProps } = useTabList({}, state, ref);\n\n return (\n <div {...tabListProps} ref={ref} className={className}>\n {children}\n </div>\n );\n }\n);\n\nHeadlessTabList.displayName = \"HeadlessTabList\";\n\n/**\n * Headless Tab Component (Layer 2)\n *\n * Unstyled individual tab item. Provides full React Aria accessibility:\n * - role=\"tab\"\n * - aria-selected\n * - aria-controls (pointing to panel)\n * - roving tabIndex\n * - keyboard activation\n *\n * Must be used within HeadlessTabsContext.\n *\n * @example\n * ```tsx\n * <HeadlessTab item={item}>\n * {({ isSelected, isFocusVisible }) => (\n * <span className={isSelected ? 'font-bold' : ''}>\n * {item.label}\n * </span>\n * )}\n * </HeadlessTab>\n * ```\n */\nexport const HeadlessTab = forwardRef<HTMLButtonElement, HeadlessTabProps>(\n ({ item, className, onMouseDown, children, ...props }, forwardedRef) => {\n const { state } = useHeadlessTabsContext(\"HeadlessTab\");\n\n const internalRef = useRef<HTMLButtonElement>(null);\n const ref = (forwardedRef ?? internalRef) as React.RefObject<HTMLButtonElement>;\n\n const { tabProps, isSelected, isDisabled, isPressed } = useTab(\n {\n key: item.key,\n ...(item.isDisabled !== undefined && { isDisabled: item.isDisabled }),\n },\n state,\n ref as React.RefObject<HTMLElement>\n );\n\n const { isFocusVisible, focusProps } = useFocusRing();\n\n const mergedProps = mergeProps(tabProps, focusProps, {\n className,\n onMouseDown,\n });\n\n return (\n <button {...mergedProps} ref={ref} type=\"button\" data-key={String(item.key)} {...props}>\n {typeof children === \"function\"\n ? children({ isSelected, isDisabled, isFocusVisible, isPressed })\n : children}\n </button>\n );\n }\n);\n\nHeadlessTab.displayName = \"HeadlessTab\";\n\n/**\n * Headless TabPanel Component (Layer 2)\n *\n * Unstyled tab panel. Provides:\n * - role=\"tabpanel\"\n * - aria-labelledby (pointing to its tab)\n * - Focus management for panels without focusable children\n *\n * Must be used within HeadlessTabsContext.\n *\n * @example\n * ```tsx\n * <HeadlessTabPanel>\n * <p>Panel content here</p>\n * </HeadlessTabPanel>\n * ```\n */\nexport const HeadlessTabPanel = forwardRef<HTMLDivElement, HeadlessTabPanelProps>(\n ({ children, className, ...props }, forwardedRef) => {\n const { state } = useHeadlessTabsContext(\"HeadlessTabPanel\");\n\n const internalRef = useRef<HTMLDivElement>(null);\n const ref = (forwardedRef ?? internalRef) as React.RefObject<HTMLDivElement>;\n\n const { tabPanelProps } = useTabPanel(props, state, ref);\n\n return (\n <div {...tabPanelProps} ref={ref} className={className}>\n {children}\n </div>\n );\n }\n);\n\nHeadlessTabPanel.displayName = \"HeadlessTabPanel\";\n\n/**\n * Expose TabListState type for advanced consumers\n */\nexport type { TabListState, TabItem };\n","\"use client\";\n\nimport { createContext, forwardRef, useContext, useMemo, Children, isValidElement } from \"react\";\nimport type React from \"react\";\nimport { Item } from \"react-stately\";\nimport { useTabListState } from \"react-stately\";\nimport { cn } from \"../../utils/cn\";\nimport { HeadlessTabsContext } from \"./TabsHeadless\";\nimport type {\n TabsProps,\n TabsContextValue,\n TabVariant,\n TabLayout,\n TabProps,\n TabItem,\n} from \"./Tabs.types\";\nimport type { Key } from \"react-stately\";\n\n/**\n * Context providing MD3 styling context (variant, layout) to Tab, TabList, TabPanel\n */\nexport const TabsContext = createContext<TabsContextValue | null>(null);\n\n/**\n * Hook to consume the tabs styling context\n * @internal\n */\nexport function useTabsContext(): TabsContextValue {\n const context = useContext(TabsContext);\n if (!context) {\n throw new Error(\"Component must be used within a Tabs component\");\n }\n return context;\n}\n\n/**\n * Resolves a React component's display name safely.\n * Handles both regular function components and exotic components (forwardRef, memo, etc.)\n * where `typeof component` is \"object\", not \"function\".\n */\nfunction getComponentName(type: unknown): string {\n if (typeof type === \"string\") return type;\n // forwardRef / memo return exotic objects — check displayName/name on the object itself\n const exotic = type as { displayName?: string; name?: string };\n return exotic.displayName ?? exotic.name ?? \"\";\n}\n\n/**\n * Extracts Tab props from the children tree (TabList > Tab children)\n * Used to build the React Aria collection for state management\n */\nfunction extractTabItemsFromChildren(children: React.ReactNode): Array<{\n key: Key;\n label?: string;\n icon?: React.ReactNode;\n isDisabled?: boolean;\n \"aria-label\"?: string;\n}> {\n const items: Array<{\n key: Key;\n label?: string;\n icon?: React.ReactNode;\n isDisabled?: boolean;\n \"aria-label\"?: string;\n }> = [];\n\n Children.forEach(children, (child) => {\n if (!isValidElement(child)) return;\n\n if (getComponentName(child.type) === \"TabList\") {\n // Extract Tab children from the TabList\n const tabListProps = child.props as { children?: React.ReactNode };\n Children.forEach(tabListProps.children, (tabChild) => {\n if (!isValidElement(tabChild)) return;\n\n if (getComponentName(tabChild.type) === \"Tab\") {\n const tabProps = tabChild.props as TabProps & { \"aria-label\"?: string };\n // Conditionally include optional properties to satisfy exactOptionalPropertyTypes.\n // Passing undefined explicitly would violate the strict optional type constraint.\n items.push({\n key: tabProps.id,\n ...(tabProps.label !== undefined && { label: tabProps.label }),\n ...(tabProps.icon !== undefined && { icon: tabProps.icon }),\n ...(tabProps.isDisabled !== undefined && { isDisabled: tabProps.isDisabled }),\n ...(tabProps[\"aria-label\"] !== undefined && { \"aria-label\": tabProps[\"aria-label\"] }),\n });\n }\n });\n }\n });\n\n return items;\n}\n\n/**\n * Material Design 3 Tabs Component (Layer 3: Styled Wrapper)\n *\n * The Tabs component manages shared selected state via useTabListState (React Aria + Stately),\n * and provides this state to all child TabList, Tab, and TabPanel components via context.\n *\n * Architecture:\n * 1. Extracts Tab metadata from children to build the React Aria collection\n * 2. Creates tab list state with useTabListState\n * 3. Provides React Aria state via HeadlessTabsContext\n * 4. Provides MD3 styling context via TabsContext\n *\n * Features:\n * - ✅ Controlled and uncontrolled selection\n * - ✅ Primary and secondary variants\n * - ✅ Fixed and scrollable layouts\n * - ✅ Full keyboard navigation (via React Aria)\n * - ✅ WCAG 2.1 AA compliant\n *\n * @example\n * ```tsx\n * // Uncontrolled\n * <Tabs defaultSelectedKey=\"tab1\" aria-label=\"Settings\">\n * <TabList>\n * <Tab id=\"tab1\" label=\"General\" />\n * <Tab id=\"tab2\" label=\"Privacy\" />\n * </TabList>\n * <TabPanel id=\"tab1\">General content</TabPanel>\n * <TabPanel id=\"tab2\">Privacy content</TabPanel>\n * </Tabs>\n *\n * // Controlled\n * <Tabs selectedKey={tab} onSelectionChange={setTab} aria-label=\"App\">\n * <TabList variant=\"secondary\">\n * <Tab id=\"overview\" label=\"Overview\" />\n * <Tab id=\"details\" label=\"Details\" />\n * </TabList>\n * <TabPanel id=\"overview\">Overview</TabPanel>\n * <TabPanel id=\"details\">Details</TabPanel>\n * </Tabs>\n * ```\n */\nexport const Tabs = forwardRef<HTMLDivElement, TabsProps>(\n (\n {\n selectedKey,\n defaultSelectedKey,\n onSelectionChange,\n variant = \"primary\",\n layout = \"fixed\",\n children,\n className,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": ariaLabelledBy,\n },\n ref\n ) => {\n // Extract tab items from children tree to build the React Aria collection\n const tabItems = useMemo(() => extractTabItemsFromChildren(children), [children]);\n\n // Create React Aria tab list state with Item-based collection.\n // ARIA label props (aria-label / aria-labelledby) are NOT part of TabListStateOptions —\n // they belong to useTabList (the React Aria hook in TabList.tsx).\n // Conditionally spread optional props to satisfy exactOptionalPropertyTypes: passing\n // undefined explicitly would violate the strict optional type constraint.\n const state = useTabListState<TabItem>({\n ...(selectedKey !== undefined && { selectedKey }),\n ...(defaultSelectedKey !== undefined && { defaultSelectedKey }),\n ...(onSelectionChange !== undefined && { onSelectionChange }),\n disabledKeys: tabItems.filter((t) => t.isDisabled).map((t) => t.key),\n children: tabItems.map((item) => (\n <Item key={item.key} textValue={item.label ?? item[\"aria-label\"] ?? String(item.key)}>\n {item.label ?? item[\"aria-label\"] ?? \"\"}\n </Item>\n )),\n });\n\n // MD3 styling context — conditionally include ARIA label props (exactOptionalPropertyTypes)\n const tabsContextValue = useMemo<TabsContextValue>(\n () => ({\n selectedKey: state.selectedKey,\n variant,\n layout,\n disabledKeys: tabItems.filter((t) => t.isDisabled).map((t) => t.key),\n ...(ariaLabel !== undefined && { \"aria-label\": ariaLabel }),\n ...(ariaLabelledBy !== undefined && { \"aria-labelledby\": ariaLabelledBy }),\n }),\n [state.selectedKey, variant, layout, tabItems, ariaLabel, ariaLabelledBy]\n );\n\n // Headless context providing React Aria state\n const headlessContextValue = useMemo(() => ({ state }), [state]);\n\n return (\n <HeadlessTabsContext.Provider value={headlessContextValue}>\n <TabsContext.Provider value={tabsContextValue}>\n <div ref={ref} className={cn(\"flex flex-col\", className)}>\n {children}\n </div>\n </TabsContext.Provider>\n </HeadlessTabsContext.Provider>\n );\n }\n);\n\nTabs.displayName = \"Tabs\";\n\n// Export context helpers for use by child components\nexport type { TabVariant, TabLayout };\n","import { cva, type VariantProps } from \"class-variance-authority\";\n\n/**\n * Material Design 3 TabList Variants (CVA)\n *\n * MD3 Specifications:\n * - Container background: bg-surface\n * - Container height: 48dp (fixed height tabs)\n * - Bottom border: outline-variant color, 1dp\n * - Fixed layout: tabs fill width equally\n * - Scrollable layout: tabs overflow horizontally, no wrapping\n */\nexport const tabListVariants = cva(\n [\n // Base classes\n \"relative flex\",\n \"bg-surface\",\n // Bottom divider line (MD3 spec)\n \"border-b border-outline-variant\",\n ],\n {\n variants: {\n layout: {\n fixed: \"w-full\",\n scrollable: \"overflow-x-auto scrollbar-none\",\n },\n },\n defaultVariants: {\n layout: \"fixed\",\n },\n }\n);\n\n/**\n * Material Design 3 Tab Item Variants (CVA)\n *\n * MD3 Specifications:\n * - Minimum height: 48dp\n * - Minimum width: 90dp (fixed), flexible (scrollable)\n * - Typography: Title Small (14px, weight 500, tracking 0.1px)\n * - State layers: 8% hover, 12% pressed/focus\n * - Disabled: 38% opacity\n * - Touch target: full tab area\n */\nexport const tabVariants = cva(\n [\n // Base layout\n \"relative flex flex-col items-center justify-center\",\n \"min-h-12 px-4\",\n \"cursor-pointer select-none\",\n \"overflow-hidden\",\n // Typography: MD3 Title Small\n \"text-sm font-medium tracking-[0.1px]\",\n // Transition\n \"transition-colors duration-200\",\n // Focus visible\n \"focus-visible:outline-none\",\n // State layer via before pseudo-element\n \"before:absolute before:inset-0 before:transition-opacity before:duration-200\",\n \"before:bg-current before:opacity-0\",\n \"hover:before:opacity-8\",\n \"active:before:opacity-12\",\n \"focus-visible:before:opacity-12\",\n ],\n {\n variants: {\n /**\n * Tab variant (Primary or Secondary)\n */\n variant: {\n primary: \"\",\n secondary: \"\",\n },\n\n /**\n * Selected state\n */\n selected: {\n true: \"\",\n false: \"\",\n },\n\n /**\n * Disabled state\n */\n disabled: {\n true: \"opacity-38 cursor-not-allowed pointer-events-none\",\n false: \"\",\n },\n\n /**\n * Layout determines min-width behavior\n */\n layout: {\n fixed: \"flex-1\",\n scrollable: \"min-w-[90px] shrink-0\",\n },\n },\n\n compoundVariants: [\n // Primary + selected\n {\n variant: \"primary\",\n selected: true,\n disabled: false,\n className: \"text-primary\",\n },\n // Primary + unselected\n {\n variant: \"primary\",\n selected: false,\n disabled: false,\n className: \"text-on-surface-variant\",\n },\n // Secondary + selected\n {\n variant: \"secondary\",\n selected: true,\n disabled: false,\n className: \"text-on-surface\",\n },\n // Secondary + unselected\n {\n variant: \"secondary\",\n selected: false,\n disabled: false,\n className: \"text-on-surface-variant\",\n },\n ],\n\n defaultVariants: {\n variant: \"primary\",\n selected: false,\n disabled: false,\n layout: \"fixed\",\n },\n }\n);\n\n/**\n * Active indicator variants (the sliding underline)\n *\n * MD3 Specifications:\n * - Primary: 3dp height, bg-primary, rounded-full corners\n * - Secondary: 2dp height, bg-on-surface-variant, no rounding\n * - Absolutely positioned at bottom of tab list\n * - Slides to selected tab using CSS transform\n */\nexport const tabIndicatorVariants = cva(\n [\n // Base: absolutely positioned at bottom\n \"absolute bottom-0 left-0\",\n \"pointer-events-none\",\n // Transition using MD3 motion tokens (medium2 duration, emphasized easing)\n \"transition-[left,width]\",\n \"duration-medium2\",\n \"ease-emphasized\",\n ],\n {\n variants: {\n variant: {\n primary: [\"h-[3px]\", \"bg-primary\", \"rounded-t-sm\"],\n secondary: [\"h-[2px]\", \"bg-on-surface-variant\"],\n },\n },\n defaultVariants: {\n variant: \"primary\",\n },\n }\n);\n\n/**\n * Tab panel variants\n *\n * MD3 Specifications:\n * - No specific container styling mandated\n * - Focus management: panel receives focus if no focusable children\n */\nexport const tabPanelVariants = cva(\n [\n // Base panel styles\n \"outline-none\",\n \"focus-visible:ring-2 focus-visible:ring-primary focus-visible:ring-offset-2\",\n ],\n {\n variants: {},\n defaultVariants: {},\n }\n);\n\n/**\n * Tab badge variants\n *\n * Inline badge displayed in the upper-right area of the tab icon/label.\n * MD3 badge spec: small indicator for notification count or status.\n */\nexport const tabBadgeVariants = cva(\n [\n // Base badge\n \"absolute\",\n \"inline-flex items-center justify-center\",\n \"bg-error text-on-error\",\n \"font-medium leading-none\",\n \"pointer-events-none\",\n ],\n {\n variants: {\n type: {\n dot: [\"top-1 right-1\", \"w-1.5 h-1.5\", \"rounded-full\"],\n count: [\"-top-1 -right-1\", \"min-w-[16px] h-4\", \"px-1\", \"rounded-full\", \"text-[11px]\"],\n },\n },\n defaultVariants: {\n type: \"count\",\n },\n }\n);\n\n/**\n * Tab icon wrapper variants\n * Positions icon relative to the badge\n */\nexport const tabIconVariants = cva(\n [\"relative\", \"inline-flex items-center justify-center\", \"w-6 h-6\"],\n {\n variants: {\n hasLabel: {\n true: \"mb-1\",\n false: \"\",\n },\n },\n defaultVariants: {\n hasLabel: false,\n },\n }\n);\n\n// Export variant prop types\nexport type TabListVariants = VariantProps<typeof tabListVariants>;\nexport type TabVariants = VariantProps<typeof tabVariants>;\nexport type TabIndicatorVariants = VariantProps<typeof tabIndicatorVariants>;\nexport type TabPanelVariants = VariantProps<typeof tabPanelVariants>;\nexport type TabBadgeVariants = VariantProps<typeof tabBadgeVariants>;\nexport type TabIconVariants = VariantProps<typeof tabIconVariants>;\n","\"use client\";\n\nimport { forwardRef, useRef, useLayoutEffect, useState, useCallback } from \"react\";\nimport type React from \"react\";\nimport { useTabList } from \"react-aria\";\nimport { cn } from \"../../utils/cn\";\nimport { useHeadlessTabsContext } from \"./TabsHeadless\";\nimport { useTabsContext } from \"./Tabs\";\nimport { tabListVariants, tabIndicatorVariants } from \"./Tabs.variants\";\nimport type { TabListProps } from \"./Tabs.types\";\n\n/**\n * Indicator position and width state for the animated sliding underline\n */\ninterface IndicatorStyle {\n left: number;\n width: number;\n}\n\n/**\n * Material Design 3 TabList Component (Layer 3: Styled)\n *\n * Renders the tab row container with an animated active indicator.\n * Uses React Aria's useTabList for role=\"tablist\", keyboard navigation,\n * and accessibility attributes.\n *\n * The active indicator slides to the selected tab using CSS transitions\n * with MD3 motion tokens (medium2 duration, emphasized easing).\n *\n * MD3 Specifications:\n * - Container background: bg-surface\n * - Container height: 48dp\n * - Bottom border: 1dp, outline-variant color\n * - Fixed layout: tabs fill width equally\n * - Scrollable layout: overflow-x, no wrapping\n *\n * @example\n * ```tsx\n * <Tabs aria-label=\"Settings\" defaultSelectedKey=\"general\">\n * <TabList>\n * <Tab id=\"general\" label=\"General\" />\n * <Tab id=\"privacy\" label=\"Privacy\" />\n * </TabList>\n * ...\n * </Tabs>\n * ```\n */\nexport const TabList = forwardRef<HTMLDivElement, TabListProps>(\n ({ children, className }, forwardedRef) => {\n const { state } = useHeadlessTabsContext(\"TabList\");\n const {\n variant,\n layout,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": ariaLabelledBy,\n } = useTabsContext();\n\n const internalRef = useRef<HTMLDivElement>(null);\n const ref = (forwardedRef ?? internalRef) as React.RefObject<HTMLDivElement>;\n\n // React Aria provides role=\"tablist\", aria-label, and keyboard navigation.\n // Conditionally spread ARIA props to satisfy exactOptionalPropertyTypes:\n // passing undefined values explicitly would violate the strict optional type constraint.\n const { tabListProps } = useTabList(\n {\n ...(ariaLabel !== undefined && { \"aria-label\": ariaLabel }),\n ...(ariaLabelledBy !== undefined && { \"aria-labelledby\": ariaLabelledBy }),\n },\n state,\n ref\n );\n\n // ── Keyboard navigation ────────────────────────────────────────────────\n /**\n * Custom keyboard handler that reads from document.activeElement rather than\n * state.focusedKey. This is critical for test reliability: when a tab is focused\n * via element.focus() outside React's act() boundary, the setFocusedKey state\n * update is deferred and state.focusedKey may still be null when the keydown fires.\n * Reading from the DOM directly avoids this race condition entirely.\n */\n const handleNavKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLDivElement>) => {\n if (![\"ArrowRight\", \"ArrowLeft\", \"Home\", \"End\"].includes(e.key)) return;\n\n const container = ref.current;\n if (!container) return;\n\n const focusedEl = document.activeElement as HTMLElement | null;\n const currentKey = focusedEl?.dataset?.key;\n if (!currentKey) return;\n\n // Read the ordered tab keys and disabled state directly from the DOM.\n // This is more reliable than state.collection.getKeys() because React Stately 3.x\n // builds its collection through a virtual rendering context; when we compute\n // <Item> elements programmatically inside Tabs.tsx, that context is never entered\n // and state.collection remains empty. DOM attributes are always authoritative.\n const allTabEls = [...container.querySelectorAll<HTMLElement>(\"[data-key]\")];\n const allKeys = allTabEls.map((el) => el.dataset.key!).filter(Boolean);\n const enabledKeys = allKeys.filter(\n (k) =>\n allTabEls.find((el) => el.dataset.key === k)?.getAttribute(\"aria-disabled\") !== \"true\"\n );\n\n const currentIndex = enabledKeys.indexOf(currentKey);\n if (currentIndex === -1) return;\n\n let nextKey: string | null = null;\n switch (e.key) {\n case \"ArrowRight\":\n nextKey = enabledKeys[(currentIndex + 1) % enabledKeys.length] ?? null;\n break;\n case \"ArrowLeft\":\n nextKey =\n enabledKeys[(currentIndex - 1 + enabledKeys.length) % enabledKeys.length] ?? null;\n break;\n case \"Home\":\n nextKey = enabledKeys[0] ?? null;\n break;\n case \"End\":\n nextKey = enabledKeys[enabledKeys.length - 1] ?? null;\n break;\n }\n\n if (nextKey != null) {\n e.preventDefault();\n state.setSelectedKey(nextKey);\n const nextEl = container.querySelector<HTMLElement>(\n `[data-key=\"${CSS.escape(nextKey)}\"]`\n );\n nextEl?.focus();\n }\n },\n [state, ref]\n );\n\n // Destructure onKeyDown so it can be used as a stable useCallback dependency.\n const { onKeyDown: tabListKeyDown } = tabListProps;\n\n /**\n * Combined keyboard handler: our DOM-based navigation runs first for arrow/home/end.\n * If we call e.preventDefault() (signalling we handled it), React Aria's handler is\n * skipped for that key. Other keys (Enter, Space, Tab) pass through to React Aria.\n */\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLDivElement>) => {\n handleNavKeyDown(e);\n if (!e.defaultPrevented) {\n tabListKeyDown?.(e);\n }\n },\n [handleNavKeyDown, tabListKeyDown]\n );\n\n // ── Active indicator animation ─────────────────────────────────────────\n const [indicatorStyle, setIndicatorStyle] = useState<IndicatorStyle>({ left: 0, width: 0 });\n const [indicatorReady, setIndicatorReady] = useState(false);\n\n /**\n * Recalculates indicator position/width from the selected tab's DOM rect.\n * Uses the [aria-selected=\"true\"] element as the target.\n * Only calls setState if values changed to prevent infinite update loops.\n */\n const updateIndicator = useCallback(() => {\n const container = ref.current;\n if (!container) return;\n\n const selectedTab = container.querySelector<HTMLElement>('[aria-selected=\"true\"]');\n if (!selectedTab) return;\n\n const containerRect = container.getBoundingClientRect();\n const tabRect = selectedTab.getBoundingClientRect();\n\n const newLeft = tabRect.left - containerRect.left + container.scrollLeft;\n const newWidth = tabRect.width;\n\n // Use functional update to avoid stale closure and prevent needless re-renders\n setIndicatorStyle((prev) => {\n if (prev.left === newLeft && prev.width === newWidth) return prev;\n return { left: newLeft, width: newWidth };\n });\n setIndicatorReady(true);\n }, [ref]);\n\n // Only re-run when the selected key changes (not every render)\n useLayoutEffect(() => {\n updateIndicator();\n }, [state.selectedKey, updateIndicator]);\n\n // ── Render ──────────────────────────────────────────────────────────────\n // Merge handleKeyDown into tabListProps so jsx-a11y can't flag a \"static\" div with\n // an explicit onKeyDown. The role=\"tablist\" (from tabListProps) makes it interactive,\n // but ESLint can't trace roles through spread operators — this avoids the false positive.\n const mergedTabListProps = { ...tabListProps, onKeyDown: handleKeyDown };\n\n return (\n <div {...mergedTabListProps} ref={ref} className={cn(tabListVariants({ layout }), className)}>\n {children}\n\n {/* Animated active indicator (sliding underline) */}\n <span\n data-tab-indicator\n aria-hidden=\"true\"\n className={cn(\n tabIndicatorVariants({ variant }),\n // Hide until first position is calculated to avoid flash\n !indicatorReady && \"opacity-0\"\n )}\n style={{\n // Dynamic left/width values from DOM measurements\n left: `${indicatorStyle.left}px`,\n width: `${indicatorStyle.width}px`,\n }}\n />\n </div>\n );\n }\n);\n\nTabList.displayName = \"TabList\";\n","\"use client\";\n\nimport { forwardRef, useRef, useCallback } from \"react\";\nimport type React from \"react\";\nimport { useTab, useFocusRing } from \"react-aria\";\nimport { mergeProps } from \"@react-aria/utils\";\nimport { cn } from \"../../utils/cn\";\nimport { useRipple } from \"../../hooks/useRipple\";\nimport { useHeadlessTabsContext } from \"./TabsHeadless\";\nimport { useTabsContext } from \"./Tabs\";\nimport { tabVariants, tabIconVariants, tabBadgeVariants } from \"./Tabs.variants\";\nimport type { TabProps, TabBadgeValue } from \"./Tabs.types\";\n\ntype TabElement = HTMLButtonElement;\n\n/**\n * Resolves a badge value to a displayable string or null\n */\nfunction resolveBadgeDisplay(badge: TabBadgeValue | undefined): string | null {\n if (badge === undefined || badge === false) return null;\n if (badge === true) return \"dot\";\n if (typeof badge === \"number\") {\n if (badge === 0) return null;\n return badge > 999 ? \"999+\" : String(badge);\n }\n return null;\n}\n\n/**\n * Material Design 3 Tab Component (Layer 3: Styled)\n *\n * Renders a single tab item inside a TabList.\n * Supports three content modes: icon-only, label-only, icon + label (stacked).\n *\n * Features:\n * - ✅ Icon-only, label-only, icon + label (stacked) content modes\n * - ✅ Ripple effect (Material Design)\n * - ✅ MD3 state layers (hover 8%, pressed 12%)\n * - ✅ Badge support (numeric, dot, 999+)\n * - ✅ Disabled state (opacity-38, not focusable)\n * - ✅ Full keyboard accessibility (via React Aria)\n * - ✅ Primary/secondary variant colors\n *\n * MD3 Specifications:\n * - Minimum height: 48dp\n * - Minimum width: 90dp\n * - Typography: Title Small (14px, weight 500, tracking 0.1px)\n * - Icon: 24x24dp\n * - Active indicator: 3dp primary / 2dp secondary\n * - State layers: 8% hover, 12% pressed/focus\n *\n * @example\n * ```tsx\n * // Label only\n * <Tab id=\"overview\" label=\"Overview\" />\n *\n * // Icon + label\n * <Tab id=\"media\" icon={<PhotoIcon />} label=\"Media\" />\n *\n * // With numeric badge\n * <Tab id=\"messages\" label=\"Messages\" badge={5} />\n *\n * // With dot badge\n * <Tab id=\"notifications\" label=\"Notifications\" badge={true} />\n *\n * // Disabled\n * <Tab id=\"archived\" label=\"Archived\" isDisabled />\n * ```\n */\nexport const Tab = forwardRef<TabElement, TabProps>(\n (\n { id, icon, label, badge, isDisabled = false, disableRipple = false, className, ...htmlProps },\n forwardedRef\n ) => {\n const { state } = useHeadlessTabsContext(\"Tab\");\n const { variant, layout } = useTabsContext();\n\n const internalRef = useRef<TabElement>(null);\n const ref = (forwardedRef ?? internalRef) as React.RefObject<TabElement>;\n\n // React Aria: provides tabProps (role, aria-selected, aria-controls, tabIndex, keyboard events).\n // HTMLButtonElement is structurally compatible with FocusableElement (@react-aria/focus),\n // which is not exported. Casting through HTMLElement satisfies the ref parameter type.\n const {\n tabProps,\n isSelected,\n isDisabled: ariaIsDisabled,\n } = useTab({ key: id, isDisabled }, state, ref as React.RefObject<HTMLElement>);\n\n // Focus ring for keyboard focus indicator\n const { isFocusVisible, focusProps } = useFocusRing();\n\n const finalIsDisabled = isDisabled || ariaIsDisabled;\n\n // Ripple effect\n const { onMouseDown: handleRipple, ripples } = useRipple({\n disabled: finalIsDisabled || disableRipple,\n });\n\n // Direct selection handler — ensures click works reliably across all environments.\n // React Aria's useTab uses shouldSelectOnPressUp which depends on pointerup events.\n // In some environments (jsdom), pointer capture can interfere with pointerup dispatch.\n // Adding a direct onClick fallback ensures selection always works on user click.\n const handleClick = useCallback(() => {\n if (!finalIsDisabled) {\n state.setSelectedKey(id);\n }\n }, [state, id, finalIsDisabled]);\n\n // Direct focus handler — ensures focusedKey is always in sync with DOM focus.\n // React Aria uses focusedKey to determine keyboard delegate's starting position.\n // Without this, focusedKey may be null after programmatic DOM focus, breaking Arrow navigation.\n const handleFocus = useCallback(() => {\n if (!finalIsDisabled) {\n state.selectionManager.setFocusedKey(id);\n }\n }, [state.selectionManager, id, finalIsDisabled]);\n\n // Merge all event handlers — tabProps includes ARIA attrs and keyboard handlers from React Aria.\n // Keyboard navigation (ArrowRight/ArrowLeft/Home/End) is handled at the TabList level,\n // not here, so we don't add an onKeyDown. Events bubble naturally from Tab → TabList.\n const mergedProps = mergeProps(tabProps, focusProps, {\n onMouseDown: disableRipple ? undefined : handleRipple,\n onClick: handleClick,\n onFocus: handleFocus,\n });\n\n // Badge display\n const badgeDisplay = resolveBadgeDisplay(badge);\n const isDotBadge = badgeDisplay === \"dot\";\n const hasIcon = Boolean(icon);\n const hasLabel = Boolean(label);\n\n // Use button for native click handling. role=\"tab\" from tabProps overrides default button role.\n // tabIndex: use isSelected (not isFocused from React Aria) so the selected tab is always reachable\n // via Tab key, regardless of whether React Aria has initialized its internal focusedKey.\n return (\n <button\n {...mergedProps}\n ref={ref}\n type=\"button\"\n // Ensure data-key is set so React Aria's keyboard delegate can find this element by key\n data-key={String(id)}\n // Override React Aria's isFocused-based tabIndex with selection-based roving tabIndex\n tabIndex={finalIsDisabled ? -1 : isSelected ? 0 : -1}\n className={cn(\n tabVariants({\n variant,\n selected: isSelected,\n disabled: finalIsDisabled,\n layout,\n }),\n isFocusVisible && \"outline-primary outline-2 outline-offset-2\",\n hasLabel && hasIcon && \"min-h-16\",\n className\n )}\n {...htmlProps}\n >\n {/* Ripple effect */}\n {!disableRipple && ripples}\n\n {/* Icon with optional badge */}\n {hasIcon && (\n <span className={cn(tabIconVariants({ hasLabel }))}>\n {icon}\n {/* Badge on icon — aria-hidden to keep tab's accessible name clean */}\n {badgeDisplay && (\n <span\n data-badge-type={isDotBadge ? \"dot\" : \"count\"}\n aria-hidden=\"true\"\n className={cn(tabBadgeVariants({ type: isDotBadge ? \"dot\" : \"count\" }))}\n >\n {!isDotBadge && badgeDisplay}\n </span>\n )}\n </span>\n )}\n\n {/* Label */}\n {hasLabel && (\n <span className=\"relative z-10 truncate\">\n {label}\n {/* Badge next to label — aria-hidden keeps accessible name clean */}\n {!hasIcon && badgeDisplay && (\n <span\n data-badge-type={isDotBadge ? \"dot\" : \"count\"}\n aria-hidden=\"true\"\n className={cn(\n \"relative ml-1\",\n tabBadgeVariants({ type: isDotBadge ? \"dot\" : \"count\" })\n )}\n >\n {!isDotBadge && badgeDisplay}\n </span>\n )}\n </span>\n )}\n </button>\n );\n }\n);\n\nTab.displayName = \"Tab\";\n","\"use client\";\n\nimport { forwardRef, useRef } from \"react\";\nimport type React from \"react\";\nimport { useTabPanel } from \"react-aria\";\nimport { cn } from \"../../utils/cn\";\nimport { useHeadlessTabsContext } from \"./TabsHeadless\";\nimport { useTabsContext } from \"./Tabs\";\nimport { tabPanelVariants } from \"./Tabs.variants\";\nimport type { TabPanelProps } from \"./Tabs.types\";\n\n/**\n * Material Design 3 TabPanel Component (Layer 3: Styled)\n *\n * Renders the content area associated with a tab.\n * Only the selected tab's panel content is shown.\n *\n * Provides full accessibility:\n * - role=\"tabpanel\"\n * - aria-labelledby (pointing to the associated tab)\n * - Focus management for panels without focusable children (tabIndex=-1)\n *\n * MD3 Specifications:\n * - No specific container styling mandated by MD3 for the panel itself\n * - The panel should be keyboard-reachable per WCAG requirements\n *\n * @example\n * ```tsx\n * <TabPanel id=\"overview\">\n * <h2>Overview</h2>\n * <p>Content here...</p>\n * </TabPanel>\n * ```\n */\nexport const TabPanel = forwardRef<HTMLDivElement, TabPanelProps>(\n ({ id, children, className }, forwardedRef) => {\n const { state } = useHeadlessTabsContext(\"TabPanel\");\n useTabsContext(); // consume context to validate component is inside Tabs\n\n const internalRef = useRef<HTMLDivElement>(null);\n const ref = (forwardedRef ?? internalRef) as React.RefObject<HTMLDivElement>;\n\n // React Aria: provides role=\"tabpanel\", aria-labelledby, tabIndex\n const { tabPanelProps } = useTabPanel({}, state, ref);\n\n // Only render the selected panel\n if (state.selectedKey !== id) {\n return null;\n }\n\n return (\n <div {...tabPanelProps} ref={ref} className={cn(tabPanelVariants(), className)}>\n {children}\n </div>\n );\n }\n);\n\nTabPanel.displayName = \"TabPanel\";\n","\"use client\";\n\nimport { createContext, forwardRef, useContext, useRef } from \"react\";\nimport { useTabList, useTab, useFocusRing } from \"react-aria\";\nimport { useTabListState, Item, type TabListState } from \"react-stately\";\nimport { mergeProps } from \"@react-aria/utils\";\nimport type {\n HeadlessNavigationBarProps,\n HeadlessNavigationBarItemProps,\n} from \"./NavigationBar.types\";\n\n// ─── Context ──────────────────────────────────────────────────────────────────\n\n/**\n * Context value shared between HeadlessNavigationBar and HeadlessNavigationBarItem.\n * @internal\n */\nexport interface NavigationBarContextValue {\n state: TabListState<object>;\n hideLabels: boolean;\n disableRipple: boolean;\n}\n\n/**\n * Shared context between HeadlessNavigationBar and HeadlessNavigationBarItem.\n * Provides the React Aria TabListState and bar-level configuration.\n * @internal\n */\nexport const NavigationBarContext = createContext<NavigationBarContextValue | null>(null);\n\n/**\n * Hook to read the NavigationBarContext inside HeadlessNavigationBarItem.\n * Throws a descriptive error if used outside HeadlessNavigationBar.\n * @internal\n */\nfunction useNavigationBarContext(): NavigationBarContextValue {\n const ctx = useContext(NavigationBarContext);\n if (ctx === null) {\n throw new Error(\"HeadlessNavigationBarItem must be rendered inside HeadlessNavigationBar.\");\n }\n return ctx;\n}\n\n// ─── HeadlessNavigationBar ────────────────────────────────────────────────────\n\n/**\n * Headless Navigation Bar (Layer 2).\n *\n * Renders an accessible `<nav role=\"navigation\">` landmark wrapping a\n * `<div role=\"tablist\">`. Provides keyboard navigation (Arrow Left/Right,\n * Home, End) and full ARIA semantics via React Aria's `useTabList`.\n *\n * All item accessibility is handled by `HeadlessNavigationBarItem`.\n *\n * Use this component when you need complete visual control beyond what the\n * styled `NavigationBar` provides.\n *\n * @example\n * ```tsx\n * <HeadlessNavigationBar\n * items={items}\n * defaultSelectedKey=\"home\"\n * aria-label=\"Main navigation\"\n * renderItem={(config) => (\n * <HeadlessNavigationBarItem key={config.key} itemKey={config.key}>\n * {config.icon}\n * <span>{config.label}</span>\n * </HeadlessNavigationBarItem>\n * )}\n * />\n * ```\n */\nexport const HeadlessNavigationBar = forwardRef<HTMLElement, HeadlessNavigationBarProps>(\n (\n {\n items,\n selectedKey,\n defaultSelectedKey,\n onSelectionChange,\n \"aria-label\": ariaLabel,\n className,\n renderItem,\n },\n ref\n ) => {\n // Build the React Aria collection from the items array.\n // Item children (text content) are used as the `textValue` for type-ahead.\n const collectionChildren = items.map((item) => (\n <Item key={item.key} textValue={item.label ?? item[\"aria-label\"] ?? item.key}>\n {item.key}\n </Item>\n ));\n\n const disabledKeys = items.filter((item) => item.isDisabled).map((item) => item.key);\n\n // useTabListState manages selected key, keyboard navigation state, and\n // the internal React Aria Collection.\n // We conditionally spread optional props to satisfy exactOptionalPropertyTypes.\n // The generic T is asserted as NavigationBarItemConfig because JSX children\n // cause TypeScript to infer T=object (item data type isn't preserved via JSX).\n const state = useTabListState({\n children: collectionChildren,\n ...(selectedKey !== undefined ? { selectedKey } : {}),\n ...(defaultSelectedKey !== undefined ? { defaultSelectedKey } : {}),\n ...(onSelectionChange ? { onSelectionChange } : {}),\n disabledKeys,\n });\n\n const tabListRef = useRef<HTMLDivElement>(null);\n\n // useTabList provides the ARIA props for the tablist container:\n // role=\"tablist\", keyboard event handlers (Arrow keys, Home, End).\n const { tabListProps } = useTabList({ \"aria-label\": ariaLabel }, state, tabListRef);\n\n return (\n <nav\n ref={ref as React.RefObject<HTMLElement>}\n role=\"navigation\"\n aria-label={ariaLabel}\n className={className}\n >\n <NavigationBarContext.Provider value={{ state, hideLabels: false, disableRipple: false }}>\n {/* The tablist is a full-width flex row inside the nav */}\n <div {...tabListProps} ref={tabListRef} className=\"flex h-full w-full items-stretch\">\n {[...state.collection].map((collectionItem) => {\n const itemConfig = items.find((i) => String(i.key) === String(collectionItem.key));\n if (!itemConfig) return null;\n return renderItem(itemConfig);\n })}\n </div>\n </NavigationBarContext.Provider>\n </nav>\n );\n }\n);\n\nHeadlessNavigationBar.displayName = \"HeadlessNavigationBar\";\n\n// ─── HeadlessNavigationBarItem ────────────────────────────────────────────────\n\n/**\n * Headless Navigation Bar Item (Layer 2).\n *\n * Renders an accessible `<button role=\"tab\">` using React Aria's `useTab`.\n * Provides `aria-selected`, `aria-disabled`, roving `tabIndex`, and\n * focus management via `useFocusRing`.\n *\n * Must be rendered inside `HeadlessNavigationBar`.\n *\n * @example\n * ```tsx\n * <HeadlessNavigationBarItem itemKey=\"home\" className=\"my-item\">\n * <HomeIcon aria-hidden />\n * <span>Home</span>\n * </HeadlessNavigationBarItem>\n * ```\n */\nexport const HeadlessNavigationBarItem = forwardRef<\n HTMLButtonElement,\n HeadlessNavigationBarItemProps\n>(({ itemKey, children, className, \"aria-label\": ariaLabel }, ref) => {\n const { state } = useNavigationBarContext();\n\n const internalRef = useRef<HTMLButtonElement>(null);\n const resolvedRef = (ref as React.RefObject<HTMLButtonElement>) ?? internalRef;\n\n // useTab in @react-aria/tabs 3.x takes { key } (not { item }).\n // It provides: role=\"tab\", aria-selected, aria-disabled, tabIndex,\n // and keyboard event handling (selection on Enter/Space).\n const { tabProps, isSelected } = useTab({ key: itemKey }, state, resolvedRef);\n\n // Navigation bar has no tab panels, so remove aria-controls to avoid ARIA\n // validation errors (aria-controls must reference an existing element).\n const { \"aria-controls\": _controls, ...tabPropsWithoutControls } = tabProps;\n\n // useFocusRing provides isFocusVisible for focus ring management.\n const { focusProps, isFocusVisible } = useFocusRing();\n\n // Support both ReactNode children and render-function children.\n const content =\n typeof children === \"function\" ? children({ isSelected, isFocusVisible }) : children;\n\n return (\n <button\n type=\"button\"\n {...mergeProps(tabPropsWithoutControls, focusProps)}\n ref={resolvedRef}\n className={className}\n aria-label={ariaLabel}\n data-focus-visible={isFocusVisible || undefined}\n data-selected={isSelected}\n >\n {content}\n </button>\n );\n});\n\nHeadlessNavigationBarItem.displayName = \"HeadlessNavigationBarItem\";\n","import { cva, type VariantProps } from \"class-variance-authority\";\n\n/**\n * Material Design 3 Navigation Bar container variants (CVA).\n *\n * Bar surface: `bg-surface-container`\n * Height: 80dp (`h-20`)\n * Position: `fixed bottom-0` — full-width bottom bar\n *\n * @see https://m3.material.io/components/navigation-bar/specs\n */\nexport const navigationBarVariants = cva([\n // Layout\n \"fixed bottom-0 left-0 right-0 z-10\",\n \"w-full\",\n \"flex flex-row items-stretch\",\n // MD3 surface\n \"bg-surface-container\",\n // MD3 height: 80dp\n \"h-20\",\n // Safe-area bottom (for mobile devices)\n \"pb-safe\",\n]);\n\n/**\n * Material Design 3 Navigation Bar item variants (CVA).\n *\n * Each item is a flex column that fills available horizontal space.\n * Active/inactive colors follow MD3 color roles:\n * - Active icon: `text-on-secondary-container`\n * - Inactive icon: `text-on-surface-variant`\n * - Active label: `text-on-surface`\n * - Inactive label:`text-on-surface-variant`\n *\n * State layers use MD3 opacity values via `::before` pseudo-element.\n *\n * @see https://m3.material.io/components/navigation-bar/specs\n */\nexport const navigationBarItemVariants = cva(\n [\n // Layout\n \"relative flex flex-1 flex-col items-center justify-center\",\n \"cursor-pointer select-none outline-none\",\n // State layer pseudo-element (covers the full item area)\n \"before:absolute before:inset-0 before:rounded-none before:transition-opacity before:duration-short2 before:ease-standard\",\n // Focus-visible ring\n \"focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary\",\n // Transition for color changes\n \"transition-colors duration-short2 ease-standard\",\n ],\n {\n variants: {\n /**\n * Whether this item is the currently selected destination.\n * Controls icon and label colors per MD3 spec.\n */\n isActive: {\n true: [\n // Active icon color applied via text-color on the icon wrapper\n \"[&>[data-icon]]:text-on-secondary-container\",\n // Active label color\n \"[&>[data-label]]:text-on-surface\",\n // State layer color for active item\n \"before:bg-on-surface-variant\",\n ],\n false: [\n // Inactive icon color\n \"[&>[data-icon]]:text-on-surface-variant\",\n // Inactive label color\n \"[&>[data-label]]:text-on-surface-variant\",\n // State layer color for inactive item\n \"before:bg-on-surface-variant\",\n ],\n },\n\n /**\n * Whether the item is disabled.\n * Applies `opacity-38` per MD3 disabled state.\n */\n isDisabled: {\n true: [\"cursor-not-allowed opacity-38 pointer-events-none\"],\n false: [],\n },\n\n /**\n * Hover and press state layer opacities.\n * Applied via compound variants on hover/active pseudo-classes.\n */\n isHovered: {\n true: [\"before:opacity-8\"],\n false: [\"before:opacity-0\"],\n },\n\n isPressed: {\n true: [\"before:opacity-12\"],\n false: [],\n },\n },\n\n compoundVariants: [\n // When not hovered or pressed, state layer is invisible\n {\n isHovered: false,\n isPressed: false,\n className: \"before:opacity-0\",\n },\n ],\n\n defaultVariants: {\n isActive: false,\n isDisabled: false,\n isHovered: false,\n isPressed: false,\n },\n }\n);\n\n/**\n * Active indicator pill variants (CVA).\n *\n * The pill sits behind the icon, centered horizontally.\n * MD3 spec: 64dp wide × 32dp tall, `rounded-full`, `bg-secondary-container`.\n *\n * Animation uses MD3 motion tokens:\n * - Active: `scale-x-100 opacity-100`\n * - Inactive: `scale-x-0 opacity-0`\n * - Duration: `duration-medium2` (300ms)\n * - Easing: `ease-emphasized`\n */\nexport const indicatorPillVariants = cva(\n [\n \"absolute left-1/2 -translate-x-1/2 top-1/2 -translate-y-1/2\",\n \"w-16 h-8\",\n \"rounded-full bg-secondary-container\",\n \"transition-[transform,opacity] duration-medium2 ease-emphasized\",\n \"origin-center\",\n ],\n {\n variants: {\n isActive: {\n true: [\"scale-x-100 opacity-100\"],\n false: [\"scale-x-0 opacity-0\"],\n },\n },\n defaultVariants: {\n isActive: false,\n },\n }\n);\n\n/**\n * Badge variants (CVA).\n *\n * Positioned at the top-right of the icon area.\n * MD3 uses `error` color role for badges.\n *\n * - Dot: small circle, no text\n * - Numeric: rounded pill with count\n */\nexport const badgeVariants = cva(\n [\n \"absolute\",\n \"flex items-center justify-center\",\n \"bg-error text-on-error\",\n \"font-medium leading-none\",\n // MD3 label-small\n \"text-[0.6875rem]\",\n ],\n {\n variants: {\n isDot: {\n true: [\n // Dot: 6dp diameter, top-right of icon\n \"top-0 right-0.5 z-10\",\n \"w-1.5 h-1.5 min-w-0 rounded-full\",\n ],\n false: [\n // Numeric: pill shape, top-right of icon\n \"-top-1 left-3 z-10\",\n \"min-w-[1rem] h-4 px-1 rounded-full\",\n ],\n },\n },\n defaultVariants: {\n isDot: false,\n },\n }\n);\n\n/**\n * Icon wrapper variants — controls size and positioning.\n * The icon wrapper is `relative` to position the badge and indicator.\n */\nexport const iconWrapperVariants = cva([\n \"relative z-10 flex items-center justify-center\",\n \"w-6 h-6\",\n]);\n\n/**\n * Label variants — `text-label-medium` per MD3 Navigation Bar spec.\n * Transition mirrors the icon color transition.\n */\nexport const labelVariants = cva([\n \"mt-1 select-none\",\n \"text-label-medium\",\n \"transition-colors duration-short2 ease-standard\",\n \"truncate max-w-full\",\n]);\n\n// ─── Type exports ─────────────────────────────────────────────────────────────\n\nexport type NavigationBarVariants = VariantProps<typeof navigationBarVariants>;\nexport type NavigationBarItemVariants = VariantProps<typeof navigationBarItemVariants>;\nexport type IndicatorPillVariants = VariantProps<typeof indicatorPillVariants>;\nexport type BadgeVariants = VariantProps<typeof badgeVariants>;\n","\"use client\";\n\nimport { forwardRef, type JSX } from \"react\";\nimport { useRipple } from \"../../hooks/useRipple\";\nimport { cn } from \"../../utils/cn\";\nimport { HeadlessNavigationBar, HeadlessNavigationBarItem } from \"./NavigationBarHeadless\";\nimport {\n navigationBarVariants,\n indicatorPillVariants,\n badgeVariants,\n iconWrapperVariants,\n labelVariants,\n} from \"./NavigationBar.variants\";\nimport type { NavigationBarProps, NavigationBarItemConfig } from \"./NavigationBar.types\";\nimport type { Key } from \"react-aria\";\n\n// ─── Item count validation ────────────────────────────────────────────────────\n\nconst MIN_ITEMS = 3;\nconst MAX_ITEMS = 5;\n\nfunction validateItemCount(count: number): void {\n if (process.env.NODE_ENV !== \"production\" && (count < MIN_ITEMS || count > MAX_ITEMS)) {\n console.warn(\n `[NavigationBar] MD3 Navigation Bar requires between ${MIN_ITEMS} and ${MAX_ITEMS} ` +\n `destination items. Received ${count}. ` +\n `See: https://m3.material.io/components/navigation-bar/overview`\n );\n }\n}\n\n// ─── Badge helpers ────────────────────────────────────────────────────────────\n\nfunction getBadgeText(badge: number | true | undefined): string | null {\n if (badge === undefined || badge === 0) return null;\n if (badge === true) return null; // dot — no text\n if (badge > 999) return \"999+\";\n return String(badge);\n}\n\nfunction isBadgeVisible(badge: number | true | undefined): boolean {\n if (badge === undefined) return false;\n if (badge === 0) return false;\n return true;\n}\n\n// ─── Visual content ───────────────────────────────────────────────────────────\n\n/**\n * Private — renders the visual content of a navigation bar item.\n * Intentionally has NO button wrapper (the button is provided by\n * `HeadlessNavigationBarItem` to avoid nested interactive elements).\n */\ninterface ItemVisualProps {\n config: NavigationBarItemConfig;\n isActive: boolean;\n hideLabels: boolean;\n disableRipple: boolean;\n}\n\nfunction ItemVisual({ config, isActive, hideLabels, disableRipple }: ItemVisualProps): JSX.Element {\n const isItemDisabled = config.isDisabled === true;\n const { onMouseDown, ripples } = useRipple({\n ...(disableRipple || isItemDisabled ? { disabled: true } : {}),\n });\n\n const showBadge = isBadgeVisible(config.badge);\n const isDot = config.badge === true;\n const badgeText = getBadgeText(config.badge);\n\n return (\n // Overflow-hidden wrapper required for ripple containment.\n // pointer-events-none is intentional: the parent <button> handles all interaction.\n // eslint-disable-next-line jsx-a11y/no-static-element-interactions\n <span\n onMouseDown={onMouseDown}\n className=\"pointer-events-none relative flex h-full w-full flex-col items-center justify-center overflow-hidden\"\n >\n {ripples}\n\n {/* Active indicator pill */}\n <span\n data-indicator-pill\n data-active={isActive}\n aria-hidden=\"true\"\n className={cn(indicatorPillVariants({ isActive }), !hideLabels && \"-mt-3.5\")}\n />\n\n {/* Icon + Badge wrapper */}\n <span\n data-icon\n className={cn(\n iconWrapperVariants(),\n isActive ? \"text-on-secondary-container\" : \"text-on-surface-variant\"\n )}\n >\n <span className=\"relative z-10 flex h-6 w-6 items-center justify-center\">\n {config.icon}\n </span>\n\n {showBadge && (\n <span\n data-badge\n data-badge-dot={isDot || undefined}\n aria-label={\n isDot ? \"notification\" : badgeText ? `${badgeText} notifications` : undefined\n }\n aria-live=\"polite\"\n className={cn(badgeVariants({ isDot }))}\n >\n {isDot ? null : badgeText}\n </span>\n )}\n </span>\n\n {/* Label */}\n {!hideLabels && config.label && (\n <span\n data-label\n className={cn(labelVariants(), isActive ? \"text-on-surface\" : \"text-on-surface-variant\")}\n >\n {config.label}\n </span>\n )}\n </span>\n );\n}\n\n// ─── NavigationBar ────────────────────────────────────────────────────────────\n\n/**\n * Material Design 3 Navigation Bar (Bottom Navigation) — Layer 3.\n *\n * Renders a fixed bottom navigation bar with 3–5 destination items, each with\n * an icon, optional label, animated active indicator pill, and optional badge.\n *\n * **Architecture:**\n * - Layer 3 (this file): MD3 styled, CVA variants, `'use client'`\n * - Layer 2: `HeadlessNavigationBar` + `HeadlessNavigationBarItem` — React Aria\n * - Layer 1: `useTabList`, `useTab`, `useFocusRing` — accessibility foundation\n *\n * **Key Features:**\n * - 3–5 destination items (dev warning outside this range)\n * - Animated indicator pill per MD3 motion tokens (scale + opacity)\n * - Badge: dot, numeric count, \"999+\" truncation, hidden at 0\n * - `hideLabels` for icon-only mode\n * - Controlled (`activeKey` + `onActiveChange`) and uncontrolled (`defaultActiveKey`)\n * - Full keyboard navigation: Arrow Left/Right, Home, End, roving `tabIndex`\n * - WCAG 2.1 AA: `role=\"navigation\"` + `aria-label`, `role=\"tablist\"`,\n * `role=\"tab\"` + `aria-selected`, visible focus ring\n *\n * **Future — Navigation Rail:**\n * At wider viewports, a NavigationBar may transition to a Navigation Rail.\n * This is a separate component tracked as a future Phase 5+ item.\n *\n * @example\n * ```tsx\n * // Uncontrolled\n * <NavigationBar\n * items={[\n * { key: 'home', icon: <HomeIcon />, label: 'Home' },\n * { key: 'search', icon: <SearchIcon />, label: 'Search', badge: 3 },\n * { key: 'profile', icon: <ProfileIcon />, label: 'Profile' },\n * ]}\n * defaultActiveKey=\"home\"\n * aria-label=\"Main navigation\"\n * />\n *\n * // Controlled\n * <NavigationBar\n * items={items}\n * activeKey={activeKey}\n * onActiveChange={setActiveKey}\n * aria-label=\"Main navigation\"\n * />\n *\n * // Icon-only mode\n * <NavigationBar\n * items={iconOnlyItems}\n * defaultActiveKey=\"home\"\n * aria-label=\"Main navigation\"\n * hideLabels\n * />\n * ```\n *\n * @see https://m3.material.io/components/navigation-bar/overview\n * @see https://m3.material.io/components/navigation-bar/specs\n */\nexport const NavigationBar = forwardRef<HTMLElement, NavigationBarProps>(\n (\n {\n items,\n activeKey,\n defaultActiveKey,\n onActiveChange,\n hideLabels = false,\n \"aria-label\": ariaLabel,\n disableRipple = false,\n className,\n },\n ref\n ) => {\n validateItemCount(items.length);\n\n return (\n <HeadlessNavigationBar\n ref={ref}\n items={items}\n {...(activeKey !== undefined ? { selectedKey: activeKey } : {})}\n {...(defaultActiveKey !== undefined ? { defaultSelectedKey: defaultActiveKey } : {})}\n {...(onActiveChange ? { onSelectionChange: onActiveChange as (key: Key) => void } : {})}\n aria-label={ariaLabel}\n className={cn(navigationBarVariants(), className)}\n renderItem={(config: NavigationBarItemConfig) => (\n // HeadlessNavigationBarItem renders the <button role=\"tab\"> with all\n // ARIA semantics. ItemVisual renders the icon/pill/badge/label inside\n // — no nested <button> elements.\n <HeadlessNavigationBarItem\n key={config.key}\n itemKey={config.key}\n {...(config[\"aria-label\"] !== undefined ? { \"aria-label\": config[\"aria-label\"] } : {})}\n className={cn(\n \"relative flex flex-1 flex-col items-center justify-center\",\n \"cursor-pointer outline-none select-none\",\n \"duration-short2 ease-standard transition-colors\",\n // State layer pseudo-element\n \"before:absolute before:inset-0 before:rounded-none\",\n \"before:bg-on-surface-variant before:opacity-0\",\n \"before:duration-short2 before:ease-standard before:transition-opacity\",\n \"hover:before:opacity-8\",\n \"active:before:opacity-12\",\n // Focus ring\n \"focus-visible:outline-primary focus-visible:outline-2 focus-visible:outline-offset-2\",\n // Disabled styling\n config.isDisabled && \"pointer-events-none cursor-not-allowed opacity-38\"\n )}\n >\n {({ isSelected }: { isSelected: boolean }) => (\n <ItemVisual\n config={config}\n isActive={isSelected}\n hideLabels={hideLabels}\n disableRipple={disableRipple}\n />\n )}\n </HeadlessNavigationBarItem>\n )}\n />\n );\n }\n);\n\nNavigationBar.displayName = \"NavigationBar\";\n","\"use client\";\n\nimport { forwardRef } from \"react\";\nimport { useRipple } from \"../../hooks/useRipple\";\nimport { cn } from \"../../utils/cn\";\nimport {\n navigationBarItemVariants,\n indicatorPillVariants,\n badgeVariants,\n iconWrapperVariants,\n labelVariants,\n} from \"./NavigationBar.variants\";\nimport type { NavigationBarItemProps, NavigationBarBadge } from \"./NavigationBar.types\";\n\n// ─── Badge helper ─────────────────────────────────────────────────────────────\n\n/**\n * Returns the display string for a badge value.\n * - `true` → renders dot (no text)\n * - `0` → hidden\n * - `1–999` → count as string\n * - `> 999` → \"999+\"\n */\nfunction getBadgeContent(badge: NavigationBarBadge): string | null {\n if (badge === true) return null; // dot — no text\n if (badge === 0) return \"\"; // hidden\n if (badge > 999) return \"999+\";\n return String(badge);\n}\n\n/**\n * Whether a badge value should be rendered at all.\n */\nfunction isBadgeVisible(badge: NavigationBarBadge | undefined): boolean {\n if (badge === undefined) return false;\n if (badge === 0) return false;\n return true;\n}\n\n// ─── NavigationBarItem ────────────────────────────────────────────────────────\n\n/**\n * Material Design 3 Navigation Bar Item (Layer 3).\n *\n * Renders a single destination item within a `NavigationBar`. Handles:\n * - Active indicator pill (`rounded-full`, animated with MD3 motion tokens)\n * - Icon slot (24dp, always visible)\n * - Badge (dot, numeric count, 999+ truncation)\n * - Label (hidden in `hideLabels` mode)\n * - MD3 state layers (hover `opacity-8`, pressed `opacity-12`)\n * - Ripple effect via `useRipple`\n * - Focus ring via `data-focus-visible`\n *\n * Used internally by `NavigationBar`. Can also be composed with\n * `HeadlessNavigationBarItem` for advanced customization.\n *\n * **Future — Navigation Rail:**\n * At wider viewports, a NavigationBar may transition to a Navigation Rail.\n * This is a separate component tracked as a future Phase 5+ item.\n *\n * @example\n * ```tsx\n * // Used standalone (advanced consumer with HeadlessNavigationBar)\n * <NavigationBarItem\n * itemKey=\"home\"\n * icon={<HomeIcon />}\n * label=\"Home\"\n * isActive\n * />\n * ```\n */\nexport const NavigationBarItem = forwardRef<HTMLButtonElement, NavigationBarItemProps>(\n (\n {\n itemKey: _itemKey,\n icon,\n label,\n badge,\n isActive = false,\n hideLabels = false,\n isDisabled = false,\n disableRipple = false,\n className,\n \"aria-label\": ariaLabel,\n // Spread remaining props (e.g. tabProps from useTab)\n ...rest\n },\n ref\n ) => {\n const { onMouseDown, ripples } = useRipple({\n ...(disableRipple || isDisabled ? { disabled: true } : {}),\n });\n\n const showBadge = isBadgeVisible(badge);\n const isDot = badge === true;\n const badgeContent = badge !== undefined ? getBadgeContent(badge) : null;\n\n return (\n <button\n type=\"button\"\n ref={ref}\n onMouseDown={onMouseDown}\n disabled={isDisabled}\n aria-label={ariaLabel}\n className={cn(\n navigationBarItemVariants({\n isActive,\n isDisabled,\n }),\n className\n )}\n {...rest}\n >\n {/* Overflow hidden container for ripple */}\n <span className=\"relative flex h-full w-full flex-col items-center justify-center overflow-hidden rounded-none\">\n {/* Ripple nodes */}\n {ripples}\n\n {/* Active indicator pill — animates behind the icon */}\n <span\n data-indicator-pill\n data-active={isActive}\n className={cn(indicatorPillVariants({ isActive }), !hideLabels && \"-mt-3.5\")}\n aria-hidden=\"true\"\n />\n\n {/* Icon + Badge wrapper */}\n <span data-icon className={cn(iconWrapperVariants())}>\n {/* Icon (24dp, aria-hidden is set by the consumer on the SVG) */}\n <span className=\"relative z-10 flex h-6 w-6 items-center justify-center\">{icon}</span>\n\n {/* Badge */}\n {showBadge && (\n <span\n data-badge\n data-badge-dot={isDot || undefined}\n aria-label={\n isDot\n ? \"notification\"\n : badgeContent\n ? `${badgeContent} notifications`\n : undefined\n }\n aria-live=\"polite\"\n className={cn(badgeVariants({ isDot }))}\n >\n {isDot ? null : badgeContent}\n </span>\n )}\n </span>\n\n {/* Label */}\n {!hideLabels && label && (\n <span data-label className={cn(labelVariants())}>\n {label}\n </span>\n )}\n </span>\n </button>\n );\n }\n);\n\nNavigationBarItem.displayName = \"NavigationBarItem\";\n","\"use client\";\n\nimport { createContext, forwardRef, useContext, useRef, useCallback } from \"react\";\nimport type React from \"react\";\nimport {\n useDialog,\n useOverlay,\n usePreventScroll,\n useFocusRing,\n useButton,\n useLink,\n FocusScope,\n} from \"react-aria\";\nimport { useOverlayTriggerState } from \"react-stately\";\nimport { mergeProps } from \"@react-aria/utils\";\nimport type {\n HeadlessDrawerProps,\n HeadlessDrawerItemProps,\n DrawerContextValue,\n} from \"./Drawer.types\";\n\n// ─── Context ──────────────────────────────────────────────────────────────────\n\n/**\n * Context shared between HeadlessDrawer and its children.\n * @internal\n */\nexport const DrawerContext = createContext<DrawerContextValue | null>(null);\n\n/**\n * Icon-only mode context consumed by `DrawerItem` to hide labels\n * and apply `title` attributes.\n * @internal\n */\nexport const DrawerIconOnlyContext = createContext<boolean>(false);\n\n/**\n * Hook to access DrawerContext inside drawer children.\n * @internal\n */\nfunction useDrawerContext(): DrawerContextValue {\n const ctx = useContext(DrawerContext);\n if (ctx === null) {\n throw new Error(\"DrawerItem must be rendered inside a Drawer component.\");\n }\n return ctx;\n}\n\n// ─── HeadlessDrawer ───────────────────────────────────────────────────────────\n\n/**\n * Headless Navigation Drawer (Layer 2).\n *\n * Provides all behavior and ARIA semantics without any visual styling.\n * Renders two distinct DOM structures based on the `variant` prop:\n *\n * - **`standard`**: `<nav role=\"navigation\">` — no overlay, no focus trap\n * - **`modal`**: `<nav role=\"navigation\">` containing a `FocusScope`-wrapped\n * `<div role=\"dialog\" aria-modal=\"true\">` with scrim overlay\n *\n * React Aria hooks used:\n * - `useDialog` — `role=\"dialog\"`, `aria-modal`, `aria-label` on modal panel\n * - `useOverlay` — dismiss on Escape key and outside click (modal)\n * - `usePreventScroll` — locks body scroll when modal is open\n * - `FocusScope` — focus trap + restoreFocus when modal closes\n * - `useOverlayTriggerState` — open/close state management\n *\n * @example\n * ```tsx\n * <HeadlessDrawer variant=\"modal\" open aria-label=\"Navigation\">\n * <HeadlessDrawerItem onPress={() => {}}>Home</HeadlessDrawerItem>\n * </HeadlessDrawer>\n * ```\n */\nexport const HeadlessDrawer = forwardRef<HTMLElement, HeadlessDrawerProps>(\n (\n {\n variant = \"standard\",\n open,\n defaultOpen = false,\n onOpenChange,\n \"aria-label\": ariaLabel,\n children,\n className,\n scrimClassName,\n disableRipple = false,\n iconOnly = false,\n },\n ref\n ) => {\n // Manage open/close state with react-stately\n // Use conditional spreading to satisfy exactOptionalPropertyTypes\n const state = useOverlayTriggerState({\n ...(open !== undefined ? { isOpen: open } : {}),\n ...(defaultOpen !== undefined ? { defaultOpen } : {}),\n ...(onOpenChange !== undefined ? { onOpenChange } : {}),\n });\n\n const isOpen = state.isOpen;\n\n const close = useCallback(() => {\n state.close();\n }, [state]);\n\n const contextValue: DrawerContextValue = {\n isOpen,\n close,\n disableRipple,\n iconOnly,\n };\n\n if (variant === \"modal\") {\n return (\n <DrawerContext.Provider value={contextValue}>\n <nav ref={ref as React.RefObject<HTMLElement>} role=\"navigation\" aria-label={ariaLabel}>\n {isOpen && (\n <>\n {/* Scrim overlay — clicking it closes the drawer */}\n <div\n data-testid=\"drawer-scrim\"\n className={scrimClassName}\n onClick={() => state.close()}\n aria-hidden=\"true\"\n />\n {/* FocusScope: traps focus and restores it to trigger on close */}\n <FocusScope contain restoreFocus autoFocus>\n <ModalDrawerPanel\n ariaLabel={ariaLabel}\n onClose={() => state.close()}\n className={className}\n >\n {children}\n </ModalDrawerPanel>\n </FocusScope>\n </>\n )}\n </nav>\n </DrawerContext.Provider>\n );\n }\n\n // Standard variant — inline nav, no overlay\n return (\n <DrawerContext.Provider value={contextValue}>\n <nav\n ref={ref as React.RefObject<HTMLElement>}\n role=\"navigation\"\n aria-label={ariaLabel}\n className={className}\n >\n {children}\n </nav>\n </DrawerContext.Provider>\n );\n }\n);\n\nHeadlessDrawer.displayName = \"HeadlessDrawer\";\n\n// ─── ModalDrawerPanel ─────────────────────────────────────────────────────────\n\n/**\n * Inner dialog panel for the modal drawer variant.\n * Applies `useDialog`, `useOverlay`, and `usePreventScroll`.\n * @internal\n */\ninterface ModalDrawerPanelProps {\n ariaLabel: string;\n onClose: () => void;\n className: string | undefined;\n children: React.ReactNode;\n}\n\nconst ModalDrawerPanel = ({\n ariaLabel,\n onClose,\n className,\n children,\n}: ModalDrawerPanelProps): React.ReactElement => {\n const panelRef = useRef<HTMLDivElement>(null);\n\n // usePreventScroll locks the body scroll while the modal is open\n usePreventScroll();\n\n // useDialog provides role=\"dialog\", aria-modal=\"true\", and aria-label\n const { dialogProps } = useDialog({ \"aria-label\": ariaLabel }, panelRef);\n\n // useOverlay handles Escape key and outside-click dismissal\n const { overlayProps } = useOverlay(\n {\n isOpen: true,\n onClose,\n isDismissable: true,\n shouldCloseOnBlur: false,\n },\n panelRef\n );\n\n return (\n <div\n {...mergeProps(overlayProps, dialogProps)}\n ref={panelRef}\n className={className}\n aria-modal=\"true\"\n >\n {children}\n </div>\n );\n};\n\nModalDrawerPanel.displayName = \"ModalDrawerPanel\";\n\n// ─── HeadlessDrawerItem ────────────────────────────────────────────────────────\n\n/**\n * Headless Navigation Drawer Item (Layer 2).\n *\n * Renders as:\n * - `<a>` using `useLink` when `href` is provided\n * - `<button>` using `useButton` when no `href`\n *\n * Applies `aria-current=\"page\"` when `isActive` is true.\n * Uses `useFocusRing` for visible keyboard focus.\n *\n * @example\n * ```tsx\n * // Button-based item\n * <HeadlessDrawerItem onPress={() => navigate('home')} isActive>\n * Home\n * </HeadlessDrawerItem>\n *\n * // Link-based item\n * <HeadlessDrawerItem href=\"/settings\">\n * Settings\n * </HeadlessDrawerItem>\n * ```\n */\nexport const HeadlessDrawerItem = forwardRef<HTMLElement, HeadlessDrawerItemProps>(\n (\n {\n href,\n isActive = false,\n children,\n className,\n isDisabled,\n onMouseDown,\n onPress,\n onPressStart,\n onPressEnd,\n onPressChange,\n onPressUp,\n title,\n ...restProps\n },\n forwardedRef\n ) => {\n const internalRef = useRef<HTMLElement>(null);\n const { isFocusVisible, focusProps } = useFocusRing();\n\n if (href) {\n // ── Link variant ──────────────────────────────────────────────────────\n const linkRef = (forwardedRef ?? internalRef) as React.RefObject<HTMLAnchorElement>;\n\n // eslint-disable-next-line react-hooks/rules-of-hooks\n const { linkProps } = useLink(\n {\n href,\n ...(isDisabled !== undefined ? { isDisabled } : {}),\n ...(onPress !== undefined ? { onPress } : {}),\n },\n linkRef\n );\n\n return (\n <a\n {...mergeProps(linkProps, focusProps, { onMouseDown })}\n ref={linkRef}\n href={href}\n className={className}\n title={title}\n aria-current={isActive ? \"page\" : undefined}\n data-focus-visible={isFocusVisible || undefined}\n data-active={isActive || undefined}\n >\n {children}\n </a>\n );\n }\n\n // ── Button variant ────────────────────────────────────────────────────────\n const buttonRef = (forwardedRef ?? internalRef) as React.RefObject<HTMLButtonElement>;\n\n // eslint-disable-next-line react-hooks/rules-of-hooks\n const { buttonProps } = useButton(\n {\n ...restProps,\n ...(isDisabled !== undefined ? { isDisabled } : {}),\n ...(onPress !== undefined ? { onPress } : {}),\n ...(onPressStart !== undefined ? { onPressStart } : {}),\n ...(onPressEnd !== undefined ? { onPressEnd } : {}),\n ...(onPressChange !== undefined ? { onPressChange } : {}),\n ...(onPressUp !== undefined ? { onPressUp } : {}),\n elementType: \"button\",\n },\n buttonRef\n );\n\n return (\n <button\n type=\"button\"\n {...mergeProps(buttonProps, focusProps, { onMouseDown })}\n ref={buttonRef}\n className={className}\n title={title}\n aria-current={isActive ? \"page\" : undefined}\n data-focus-visible={isFocusVisible || undefined}\n data-active={isActive || undefined}\n >\n {children}\n </button>\n );\n }\n);\n\nHeadlessDrawerItem.displayName = \"HeadlessDrawerItem\";\n\n// ─── Re-export context hook for styled layer ──────────────────────────────────\n\nexport { useDrawerContext };\n","\"use client\";\n\nimport { forwardRef } from \"react\";\nimport type { ForwardedRef } from \"react\";\nimport { useSeparator } from \"react-aria\";\n\nimport type { DividerHeadlessProps } from \"./Divider.types\";\n\n/**\n * DividerHeadless — Layer 2 unstyled separator primitive.\n *\n * Uses React Aria's `useSeparator` hook to attach the correct\n * `role=\"separator\"` and `aria-orientation` attributes.\n *\n * - Horizontal → renders `<hr>` (implicit ARIA separator role)\n * - Vertical → renders `<div>` with explicit `role=\"separator\"`\n *\n * Bring your own styles via the `className` prop.\n *\n * @example\n * ```tsx\n * // Used inside the styled Divider, or directly for custom styling:\n * <DividerHeadless\n * orientation=\"horizontal\"\n * className=\"border-t border-outline-variant w-full\"\n * />\n * ```\n */\nexport const DividerHeadless = forwardRef<HTMLElement, DividerHeadlessProps>(\n ({ orientation = \"horizontal\", className }, ref) => {\n const { separatorProps } = useSeparator({\n orientation,\n elementType: orientation === \"vertical\" ? \"div\" : \"hr\",\n });\n\n if (orientation === \"vertical\") {\n return (\n <div {...separatorProps} ref={ref as ForwardedRef<HTMLDivElement>} className={className} />\n );\n }\n\n return (\n <hr\n {...separatorProps}\n aria-orientation=\"horizontal\"\n ref={ref as ForwardedRef<HTMLHRElement>}\n className={className}\n />\n );\n }\n);\n\nDividerHeadless.displayName = \"DividerHeadless\";\n","import { cva, type VariantProps } from \"class-variance-authority\";\n\n/**\n * Material Design 3 Divider Variants (CVA)\n *\n * Defines orientation and inset variants for the Divider component.\n * All classes use MD3 design token utilities — no arbitrary values.\n *\n * Orientation:\n * horizontal — 1px top border, spans full width\n * vertical — 1px left border, spans full height (self-stretch in flex)\n *\n * Inset (MD3 spec: 16dp offset):\n * start — ml-4 (indented from the leading edge)\n * end — mr-4 (indented from the trailing edge)\n * both — ml-4 mr-4 (indented from both edges)\n */\nexport const dividerVariants = cva(\n // Base: always apply the MD3 outline-variant color to the border\n \"border-outline-variant\",\n {\n variants: {\n /**\n * Controls the axis of the visual rule.\n */\n orientation: {\n horizontal: \"border-t\",\n vertical: \"border-l h-auto self-stretch\",\n },\n\n /**\n * Inset — which end(s) are offset by 16dp per MD3 spec.\n */\n inset: {\n none: \"\",\n start: \"ml-4\",\n end: \"mr-4\",\n both: \"ml-4 mr-4\",\n },\n },\n\n defaultVariants: {\n orientation: \"horizontal\",\n inset: \"none\",\n },\n }\n);\n\n/**\n * Inferred CVA variant prop types for the Divider component.\n */\nexport type DividerVariants = VariantProps<typeof dividerVariants>;\n","\"use client\";\n\nimport { forwardRef } from \"react\";\nimport type { ForwardedRef } from \"react\";\n\nimport { cn } from \"../../utils/cn\";\nimport { DividerHeadless } from \"./DividerHeadless\";\nimport { dividerVariants } from \"./Divider.variants\";\nimport type { DividerProps } from \"./Divider.types\";\n\n/**\n * Divider — MD3 Styled Component (Layer 3)\n *\n * A thin rule that separates content in lists and containers.\n * Supports horizontal/vertical orientations, inset variants, and an\n * optional subheader label that renders the text centered between two rules.\n *\n * Built on `DividerHeadless` (React Aria `useSeparator`) for accessible\n * ARIA semantics. Uses CVA variants mapped to MD3 design tokens.\n *\n * @example\n * ```tsx\n * // Full-bleed horizontal divider\n * <Divider />\n *\n * // Inset from the start (16dp)\n * <Divider inset=\"start\" />\n *\n * // Vertical divider inside a flex row\n * <Divider orientation=\"vertical\" />\n *\n * // Subheader divider\n * <Divider label=\"Section Title\" />\n * ```\n */\nexport const Divider = forwardRef<HTMLElement, DividerProps>(\n ({ orientation = \"horizontal\", inset = \"none\", label, className }, ref) => {\n if (label) {\n return (\n <div\n ref={ref as ForwardedRef<HTMLDivElement>}\n role=\"group\"\n aria-label={label}\n className={cn(\"flex items-center gap-4\", className)}\n >\n <DividerHeadless\n orientation=\"horizontal\"\n className={cn(dividerVariants({ orientation: \"horizontal\", inset: \"none\" }), \"flex-1\")}\n />\n <span className=\"text-on-surface-variant text-label-large whitespace-nowrap\">\n {label}\n </span>\n <DividerHeadless\n orientation=\"horizontal\"\n className={cn(dividerVariants({ orientation: \"horizontal\", inset: \"none\" }), \"flex-1\")}\n />\n </div>\n );\n }\n\n return (\n <DividerHeadless\n ref={ref}\n orientation={orientation}\n className={cn(dividerVariants({ orientation, inset }), className)}\n />\n );\n }\n);\n\nDivider.displayName = \"Divider\";\n","import { cva, type VariantProps } from \"class-variance-authority\";\n\n/**\n * Material Design 3 Navigation Drawer container variants (CVA).\n *\n * Width: 360dp (`w-drawer`)\n * Shape: `rounded-r-xl` (28px right-side radius per MD3 shape extra-large)\n *\n * Slide-in animation is driven by MD3 motion tokens:\n * - Enter: `duration-medium4` (400ms), `ease-emphasized-decelerate`\n * - Exit: `duration-medium2` (300ms), `ease-emphasized-accelerate`\n *\n * @see https://m3.material.io/components/navigation-drawer/specs\n */\nexport const drawerVariants = cva(\n [\n // Layout\n \"fixed top-0 left-0 h-full\",\n \"flex flex-col overflow-y-auto\",\n // Stacking and shape\n \"z-50\",\n \"rounded-r-xl\",\n // Slide animation (transition applies to all open/closed state changes)\n \"transition-transform duration-medium4 ease-emphasized-decelerate\",\n // Focus outline removal (focus management handled by FocusScope / React Aria)\n \"outline-none\",\n // Padding for content spacing\n \"px-3\",\n ],\n {\n variants: {\n /**\n * Structural variant — drives surface color and elevation.\n * - `standard`: inline nav panel, lower-elevation surface\n * - `modal`: overlay dialog with elevation shadow\n */\n variant: {\n standard: [\"bg-surface-container-low\"],\n modal: [\"bg-surface-container\", \"shadow-elevation-1\"],\n },\n\n /**\n * Open/closed state — drives translation.\n * - `true`: drawer visible (`translate-x-0`)\n * - `false`: drawer off-screen (`-translate-x-full`)\n */\n open: {\n true: [\"translate-x-0\"],\n false: [\"-translate-x-full\"],\n },\n\n /**\n * Icon-only compact mode — 80dp rail instead of 360dp drawer.\n * - `true`: `w-20` (80dp), items centered\n * - `false`: `w-drawer` (360dp), standard layout\n */\n iconOnly: {\n true: [\"w-20\", \"items-center\"],\n false: [\"w-drawer\"],\n },\n },\n\n defaultVariants: {\n variant: \"standard\",\n open: false,\n iconOnly: false,\n },\n }\n);\n\n/**\n * Material Design 3 Navigation Drawer item variants (CVA).\n *\n * Each item is a full-width flex row with a pill-shaped active indicator.\n *\n * Active item: `bg-secondary-container` / `text-on-secondary-container`\n * Inactive item: `text-on-surface-variant`\n * State layers: `opacity-8` hover, `opacity-12` pressed\n *\n * @see https://m3.material.io/components/navigation-drawer/specs\n */\nexport const drawerItemVariants = cva(\n [\n // Layout\n \"relative flex w-full items-center gap-3\",\n \"h-14 px-4\",\n \"rounded-full\",\n // Typography\n \"text-label-large\",\n // Interaction\n \"cursor-pointer select-none outline-none\",\n // State layer pseudo-element (z-[1] above active indicator)\n \"before:absolute before:inset-0 before:rounded-full before:z-[1]\",\n \"before:transition-opacity before:duration-short2 before:ease-standard\",\n \"before:opacity-0\",\n // Hover and focus visible state layers\n \"hover:before:opacity-8\",\n \"focus-visible:before:opacity-12\",\n // Active pressed state\n \"active:before:opacity-12\",\n // Transition for color changes\n \"transition-colors duration-short2 ease-standard\",\n ],\n {\n variants: {\n /**\n * Whether this item is the currently active destination.\n *\n * Active indicator is a 336dp pill rendered via `after:` pseudo-element\n * per MD3 Navigation Drawer spec.\n */\n isActive: {\n true: [\n \"text-on-secondary-container\",\n \"before:bg-on-secondary-container\",\n // Active indicator — 336dp pill via after: pseudo\n \"after:absolute after:inset-0 after:mx-auto after:max-w-[336px]\",\n \"after:rounded-full after:bg-secondary-container\",\n ],\n false: [\"bg-transparent\", \"text-on-surface-variant\", \"before:bg-on-surface-variant\"],\n },\n\n /**\n * Whether the item is disabled.\n * Applies `opacity-38` per MD3 disabled state spec.\n */\n isDisabled: {\n true: [\"opacity-38 cursor-not-allowed pointer-events-none\"],\n false: [],\n },\n },\n\n defaultVariants: {\n isActive: false,\n isDisabled: false,\n },\n }\n);\n\n/**\n * Modal scrim overlay variants (CVA).\n *\n * Covers the full viewport behind the modal drawer.\n * Clicking the scrim closes the drawer.\n *\n * Color: `bg-scrim` at `opacity-32` per MD3 spec.\n */\nexport const scrimVariants = cva([\n \"fixed inset-0 z-40\",\n \"bg-scrim opacity-32\",\n \"transition-opacity duration-short4 ease-standard\",\n]);\n\n/**\n * Drawer section container variants (CVA).\n *\n * Groups related items with an optional header label and divider.\n */\nexport const drawerSectionVariants = cva([\"flex flex-col w-full\"]);\n\n/**\n * Drawer section header variants (CVA).\n *\n * Header text: `text-title-small text-on-surface-variant` per MD3 spec.\n */\nexport const drawerSectionHeaderVariants = cva([\n \"px-4 pt-4 pb-2\",\n \"text-title-small text-on-surface-variant\",\n \"select-none\",\n]);\n\n/**\n * Drawer section divider variants (CVA).\n *\n * Horizontal rule using `border-outline-variant`.\n */\nexport const drawerDividerVariants = cva([\"border-t border-outline-variant\", \"mx-4 my-2\"]);\n\n// ─── Type exports ─────────────────────────────────────────────────────────────\n\nexport type DrawerVariants = VariantProps<typeof drawerVariants>;\nexport type DrawerItemVariants = VariantProps<typeof drawerItemVariants>;\nexport type ScrimVariants = VariantProps<typeof scrimVariants>;\nexport type DrawerSectionVariants = VariantProps<typeof drawerSectionVariants>;\n","\"use client\";\n\nimport { forwardRef } from \"react\";\nimport { Divider } from \"../Divider\";\nimport { drawerSectionVariants, drawerSectionHeaderVariants } from \"./Drawer.variants\";\nimport { cn } from \"../../utils/cn\";\nimport type { DrawerSectionProps } from \"./Drawer.types\";\n\n/**\n * Internal props extending the public DrawerSectionProps.\n * `_isFirstSection` is injected by the parent `Drawer` to suppress\n * the top divider on the first section.\n * @internal\n */\ninterface DrawerSectionInternalProps extends DrawerSectionProps {\n /** @internal Injected by Drawer — suppresses the divider on the first section. */\n _isFirstSection?: boolean;\n}\n\n/**\n * Material Design 3 Navigation Drawer Section (Layer 3: Styled).\n *\n * Groups related `DrawerItem` elements with an optional header label and\n * a horizontal divider. Follows MD3 Navigation Drawer spec for section\n * grouping and typography.\n *\n * Features:\n * - Optional header label: `text-title-small text-on-surface-variant`\n * - Optional top divider via `Divider` component\n * - Divider auto-hidden on the first section inside a `Drawer`\n *\n * @example\n * ```tsx\n * // Section with header and divider\n * <DrawerSection header=\"Account\" showDivider>\n * <DrawerItem icon={<ProfileIcon />} label=\"Profile\" />\n * <DrawerItem icon={<LogoutIcon />} label=\"Logout\" />\n * </DrawerSection>\n *\n * // Section without header (just a visual group)\n * <DrawerSection showDivider>\n * <DrawerItem label=\"Help\" />\n * </DrawerSection>\n * ```\n *\n * @see https://m3.material.io/components/navigation-drawer/specs\n */\nexport const DrawerSection = forwardRef<HTMLDivElement, DrawerSectionInternalProps>(\n ({ header, children, showDivider = true, _isFirstSection = false, className }, ref) => {\n const shouldShowDivider = showDivider && !_isFirstSection;\n\n return (\n <div ref={ref} className={cn(drawerSectionVariants(), className)} data-drawer-section>\n {shouldShowDivider && <Divider orientation=\"horizontal\" className=\"my-1\" />}\n\n {/* Section header label */}\n {header && <span className={drawerSectionHeaderVariants()}>{header}</span>}\n\n {/* Section items */}\n {children}\n </div>\n );\n }\n);\n\nDrawerSection.displayName = \"DrawerSection\";\n","\"use client\";\n\nimport React, { forwardRef } from \"react\";\nimport { HeadlessDrawer, DrawerIconOnlyContext } from \"./DrawerHeadless\";\nimport { DrawerSection } from \"./DrawerSection\";\nimport { drawerVariants, scrimVariants } from \"./Drawer.variants\";\nimport { cn } from \"../../utils/cn\";\nimport type { DrawerProps } from \"./Drawer.types\";\n\n/**\n * Material Design 3 Navigation Drawer (Layer 3: Styled).\n *\n * Supports two structural variants driven by the `variant` prop:\n *\n * - **`standard`** — Inline `<nav>` landmark. Permanently visible or\n * collapsible via controlled `open` prop. No overlay or focus trap.\n * Surface: `bg-surface-container-low`.\n *\n * - **`modal`** — Overlay dialog with scrim backdrop, slide-in animation,\n * focus trap, and `Escape` to close.\n * Surface: `bg-surface-container`, `shadow-elevation-1`.\n *\n * Both variants:\n * - `role=\"navigation\"` on the outer wrapper\n * - `rounded-r-xl` (28px per MD3 shape extra-large on right side only)\n * - Slide-in animation: `translate-x` driven by MD3 motion tokens\n * - `w-drawer` (360dp) or `w-20` (80dp) in `iconOnly` mode\n *\n * Modal-only:\n * - `role=\"dialog\"` + `aria-modal=\"true\"` on the panel\n * - `FocusScope` containing focus + restoring on close\n * - `usePreventScroll` to lock body scroll\n * - Scrim: `bg-scrim opacity-32` — click closes drawer\n * - `Escape` key closes drawer\n *\n * @example\n * ```tsx\n * // Standard variant (collapsible sidebar)\n * <Drawer\n * variant=\"standard\"\n * open={sidebarOpen}\n * onOpenChange={setSidebarOpen}\n * aria-label=\"App navigation\"\n * >\n * <DrawerItem icon={<HomeIcon />} label=\"Home\" isActive />\n * <DrawerSection header=\"Settings\" showDivider>\n * <DrawerItem icon={<SettingsIcon />} label=\"Preferences\" />\n * </DrawerSection>\n * </Drawer>\n *\n * // Icon-only mode (prep for NavigationRail)\n * <Drawer variant=\"standard\" open iconOnly aria-label=\"App navigation\">\n * <DrawerItem icon={<HomeIcon />} label=\"Home\" isActive />\n * </Drawer>\n * ```\n *\n * @see https://m3.material.io/components/navigation-drawer/overview\n */\nexport const Drawer = forwardRef<HTMLElement, DrawerProps>(\n (\n {\n variant = \"standard\",\n open,\n defaultOpen = false,\n onOpenChange,\n \"aria-label\": ariaLabel,\n children,\n className,\n disableRipple = false,\n iconOnly = false,\n ...restProps\n },\n ref\n ) => {\n const isOpen = open ?? defaultOpen;\n\n const drawerPanelClass = cn(\n drawerVariants({\n variant,\n open: isOpen,\n iconOnly,\n }),\n className\n );\n\n const scrimClass = scrimVariants();\n\n // Mark the first DrawerSection to suppress its divider\n let foundFirstSection = false;\n const processedChildren = React.Children.map(children, (child) => {\n if (React.isValidElement(child) && child.type === DrawerSection) {\n if (!foundFirstSection) {\n foundFirstSection = true;\n return React.cloneElement(child as React.ReactElement<Record<string, unknown>>, {\n _isFirstSection: true,\n });\n }\n }\n return child;\n });\n\n return (\n <DrawerIconOnlyContext.Provider value={iconOnly}>\n <HeadlessDrawer\n ref={ref}\n variant={variant}\n {...(open !== undefined ? { open } : {})}\n {...(defaultOpen !== undefined ? { defaultOpen } : {})}\n {...(onOpenChange !== undefined ? { onOpenChange } : {})}\n aria-label={ariaLabel}\n className={drawerPanelClass}\n scrimClassName={scrimClass}\n disableRipple={disableRipple}\n iconOnly={iconOnly}\n {...restProps}\n >\n {processedChildren}\n </HeadlessDrawer>\n </DrawerIconOnlyContext.Provider>\n );\n }\n);\n\nDrawer.displayName = \"Drawer\";\n","\"use client\";\n\nimport { forwardRef } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport type { BadgeHeadlessProps } from \"./Badge.types\";\n\n/**\n * Headless Badge Wrapper (Layer 2)\n *\n * Provides the structural `relative inline-flex` container that\n * positions badge content absolutely over the host element.\n * Unstyled beyond positioning — bring your own badge indicator.\n *\n * @example\n * ```tsx\n * <BadgeHeadless>\n * <IconButton icon={<BellIcon />} aria-label=\"Notifications\" />\n * <span className=\"absolute -top-1 -right-1 ...\">3</span>\n * </BadgeHeadless>\n * ```\n */\nexport const BadgeHeadless = forwardRef<HTMLDivElement, BadgeHeadlessProps>(\n ({ className, children, ...props }, ref) => {\n return (\n <div ref={ref} className={cn(\"relative inline-flex\", className)} {...props}>\n {children}\n </div>\n );\n }\n);\n\nBadgeHeadless.displayName = \"BadgeHeadless\";\n","import { cva, type VariantProps } from \"class-variance-authority\";\n\n/**\n * Material Design 3 Badge Content Variants (CVA)\n *\n * Manages the visual appearance of the badge indicator element:\n * - `size`: small (6dp dot) or large (16dp min-width pill)\n * - `color`: MD3 color role — error (default) or primary\n * - `invisible`: scale/opacity toggle for show/hide animation\n * - `reducedMotion`: strips transition when `prefers-reduced-motion` is active\n */\nexport const badgeVariants = cva(\n [\"absolute -top-1 -right-1 rounded-full flex items-center justify-center\"],\n {\n variants: {\n size: {\n small: \"size-1.5\",\n large: \"min-w-4 h-4 px-1 text-label-small\",\n },\n color: {\n error: \"bg-error text-on-error\",\n primary: \"bg-primary text-on-primary\",\n },\n invisible: {\n true: \"scale-0 opacity-0\",\n false: \"scale-100 opacity-100\",\n },\n reducedMotion: {\n true: \"\",\n false:\n \"transition-[transform,opacity] duration-spring-standard-fast-effects ease-spring-standard-fast-effects\",\n },\n },\n defaultVariants: {\n size: \"large\",\n color: \"error\",\n invisible: false,\n reducedMotion: false,\n },\n }\n);\n\n/**\n * Extract variant prop types from CVA\n */\nexport type BadgeVariants = VariantProps<typeof badgeVariants>;\n","\"use client\";\n\nimport { forwardRef } from \"react\";\nimport { badgeVariants } from \"./Badge.variants\";\nimport { cn } from \"../../utils/cn\";\nimport type { BadgeContentProps } from \"./Badge.types\";\n\n/**\n * Derives the visible text for the badge indicator.\n *\n * - No `count` → empty string (dot badge, no text)\n * - `count` ≤ `max` → count as string\n * - `count` > `max` → `\"${max}+\"`\n */\nconst getDisplayValue = (count: number | undefined, max: number): string => {\n if (count === undefined) return \"\";\n return count > max ? `${max}+` : count.toString();\n};\n\n/**\n * Derives the accessible label for the badge indicator.\n *\n * - Explicit override → use as-is\n * - No `count` → `\"New\"`\n * - With `count` → `\"${count} notifications\"`\n */\nconst getAriaLabel = (count: number | undefined, override: string | undefined): string => {\n if (override) return override;\n return count === undefined ? \"New\" : `${count} notifications`;\n};\n\n/**\n * Badge Content Indicator\n *\n * Renders the badge's visual element — either a small dot (no count)\n * or a count pill. Applies CVA variants for size, color, and visibility.\n *\n * Uses `role=\"status\"` so screen readers announce changes to the count.\n */\nexport const BadgeContent = forwardRef<HTMLSpanElement, BadgeContentProps>(\n (\n {\n count,\n max = 999,\n color = \"error\",\n invisible = false,\n \"aria-label\": ariaLabelOverride,\n reducedMotion = false,\n className,\n },\n ref\n ) => {\n const size = count === undefined ? \"small\" : \"large\";\n const displayValue = getDisplayValue(count, max);\n const ariaLabel = getAriaLabel(count, ariaLabelOverride);\n\n return (\n <span\n ref={ref}\n role=\"status\"\n aria-label={ariaLabel}\n className={cn(badgeVariants({ size, color, invisible, reducedMotion }), className)}\n >\n {displayValue}\n </span>\n );\n }\n);\n\nBadgeContent.displayName = \"BadgeContent\";\n","\"use client\";\n\nimport { forwardRef } from \"react\";\nimport { BadgeHeadless } from \"./BadgeHeadless\";\nimport { BadgeContent } from \"./BadgeContent\";\nimport { useReducedMotion } from \"../../hooks/useReducedMotion\";\nimport type { BadgeProps } from \"./Badge.types\";\n\n/**\n * Material Design 3 Badge Component (Layer 3: Styled)\n *\n * Composes `BadgeHeadless` (positioning wrapper) with `BadgeContent`\n * (dot or count indicator). Automatically hides the badge when\n * `count` is `0` or `invisible` is `true`.\n *\n * Respects `prefers-reduced-motion` — transitions are omitted when\n * the user has requested reduced motion.\n *\n * @example\n * ```tsx\n * // Dot badge\n * <Badge>\n * <IconButton icon={<BellIcon />} aria-label=\"Notifications\" />\n * </Badge>\n *\n * // Count badge\n * <Badge count={5}>\n * <IconButton icon={<BellIcon />} aria-label=\"Notifications\" />\n * </Badge>\n *\n * // Capped at 99\n * <Badge count={150} max={99}>\n * <IconButton icon={<MailIcon />} aria-label=\"Messages\" />\n * </Badge>\n * ```\n */\nexport const Badge = forwardRef<HTMLDivElement, BadgeProps>(\n (\n {\n count,\n max = 999,\n color = \"error\",\n invisible = false,\n \"aria-label\": ariaLabel,\n className,\n children,\n },\n ref\n ) => {\n const isReduced = useReducedMotion();\n const shouldShow = !invisible && (count === undefined || count > 0);\n\n return (\n <BadgeHeadless ref={ref} className={className}>\n {children}\n <BadgeContent\n count={count}\n max={max}\n color={color}\n invisible={!shouldShow}\n aria-label={ariaLabel}\n reducedMotion={isReduced}\n />\n </BadgeHeadless>\n );\n }\n);\n\nBadge.displayName = \"Badge\";\n","\"use client\";\n\nimport type React from \"react\";\nimport { forwardRef, isValidElement, useContext } from \"react\";\nimport { HeadlessDrawerItem, DrawerIconOnlyContext } from \"./DrawerHeadless\";\nimport { Badge } from \"../Badge\";\nimport { drawerItemVariants } from \"./Drawer.variants\";\nimport { cn } from \"../../utils/cn\";\nimport { useRipple } from \"../../hooks/useRipple\";\nimport type { DrawerItemProps, DrawerItemBadgeConfig } from \"./Drawer.types\";\n\n/**\n * Runtime type guard for the structured `DrawerItemBadgeConfig`.\n * Distinguishes config objects from React elements / primitives.\n */\nfunction isBadgeConfig(badge: unknown): badge is DrawerItemBadgeConfig {\n return (\n typeof badge === \"object\" &&\n badge !== null &&\n !isValidElement(badge) &&\n (\"count\" in badge || \"color\" in badge)\n );\n}\n\n/**\n * Material Design 3 Navigation Drawer Item (Layer 3: Styled).\n *\n * Renders a navigation destination row following MD3 Navigation Drawer specs.\n * Uses `HeadlessDrawerItem` for behavior and accessibility, CVA for variants.\n *\n * Renders as `<a>` when `href` is provided, `<button>` otherwise.\n *\n * Features:\n * - Active indicator: 336dp pill, `bg-secondary-container` / `text-on-secondary-container`\n * - `aria-current=\"page\"` on active item\n * - Ripple effect on interaction\n * - Hover/focus/pressed state layers (MD3 spec: 8% / 12%)\n * - Optional leading icon (24dp slot)\n * - Optional trailing badge — `ReactNode` or `{ count, color }` config\n * - Icon-only mode: label hidden, `title` tooltip via `DrawerIconOnlyContext`\n * - Disabled state: `opacity-38`, non-interactive\n *\n * @example\n * ```tsx\n * // Active item with icon\n * <DrawerItem icon={<HomeIcon />} label=\"Home\" isActive onPress={() => navigate('/')} />\n *\n * // Item with Badge config\n * <DrawerItem label=\"Inbox\" badge={{ count: 5, color: 'primary' }} />\n *\n * // Disabled\n * <DrawerItem label=\"Disabled Feature\" isDisabled />\n * ```\n *\n * @see https://m3.material.io/components/navigation-drawer/specs\n */\nexport const DrawerItem = forwardRef<HTMLElement, DrawerItemProps>(\n (\n {\n href,\n icon,\n label,\n badge,\n secondaryText,\n isActive = false,\n isDisabled = false,\n disableRipple = false,\n className,\n onPress,\n onPressStart,\n onPressEnd,\n onPressChange,\n onPressUp,\n ...restProps\n },\n ref\n ) => {\n const isItemDisabled = isDisabled;\n const isIconOnly = useContext(DrawerIconOnlyContext);\n\n const { onMouseDown: handleRipple, ripples } = useRipple({\n disabled: isItemDisabled || disableRipple,\n });\n\n const renderBadge = (): React.ReactElement | null => {\n if (!badge) return null;\n\n if (isBadgeConfig(badge)) {\n return (\n <span className=\"relative z-10 ml-auto flex shrink-0 items-center pr-2\">\n <Badge\n {...(badge.count !== undefined ? { count: badge.count } : {})}\n {...(badge.color !== undefined ? { color: badge.color } : {})}\n >\n <span />\n </Badge>\n </span>\n );\n }\n\n return (\n <span className=\"relative z-10 ml-auto flex shrink-0 items-center pr-2\" aria-hidden=\"true\">\n {badge}\n </span>\n );\n };\n\n return (\n <HeadlessDrawerItem\n {...restProps}\n ref={ref}\n {...(href !== undefined ? { href } : {})}\n isActive={isActive}\n {...(isItemDisabled !== undefined ? { isDisabled: isItemDisabled } : {})}\n {...(onPress !== undefined ? { onPress } : {})}\n {...(onPressStart !== undefined ? { onPressStart } : {})}\n {...(onPressEnd !== undefined ? { onPressEnd } : {})}\n {...(onPressChange !== undefined ? { onPressChange } : {})}\n {...(onPressUp !== undefined ? { onPressUp } : {})}\n onMouseDown={handleRipple}\n title={isIconOnly ? label : undefined}\n className={cn(\n drawerItemVariants({\n isActive,\n isDisabled: isItemDisabled,\n }),\n className\n )}\n >\n {/* Ripple effect */}\n {ripples}\n\n {/* Leading icon slot (24dp) */}\n {icon && (\n <span\n className=\"relative z-10 flex shrink-0 items-center justify-center\"\n aria-hidden=\"true\"\n >\n {icon}\n </span>\n )}\n\n {/* Label and optional secondary text */}\n <span\n className={cn(\n \"relative z-10 flex min-w-0 flex-1 flex-col text-left\",\n isIconOnly && \"hidden\"\n )}\n >\n <span className=\"truncate\">{label}</span>\n {secondaryText && (\n <span className=\"text-body-small truncate opacity-70\">{secondaryText}</span>\n )}\n </span>\n\n {/* Trailing badge */}\n {!isIconOnly && renderBadge()}\n </HeadlessDrawerItem>\n );\n }\n);\n\nDrawerItem.displayName = \"DrawerItem\";\n","import { cva, type VariantProps } from \"class-variance-authority\";\n\n/**\n * Material Design 3 Progress Indicator Variants (CVA)\n *\n * Type-safe variant management for Progress component.\n * Uses Tailwind CSS classes mapped to MD3 design tokens.\n *\n * MD3 Specifications:\n * - Linear track height: 4dp (h-1 = 4px)\n * - Linear track shape: rounded-full (radius-full)\n * - Circular default size: 48dp (h-12 w-12)\n * - Circular stroke width: 4dp (applied as SVG attribute)\n * - Active track color: primary\n * - Inactive track color: surface-container-highest\n * - Label text: on-surface, body-small\n */\n\n/**\n * Progress container variants.\n * Wraps the entire progress indicator (label + visual).\n */\nexport const progressContainerVariants = cva([\"inline-flex\", \"flex-col\", \"gap-1\"], {\n variants: {\n /**\n * The visual type of the indicator.\n */\n type: {\n linear: \"w-full\",\n circular: \"items-center justify-center w-auto\",\n },\n },\n defaultVariants: {\n type: \"linear\",\n },\n});\n\n/**\n * Linear track variants (the 4dp-height background rail).\n */\nexport const progressTrackVariants = cva([\n \"relative\",\n \"w-full\",\n \"h-1\", // MD3: 4dp track height\n \"rounded-full\", // MD3: full corner radius\n \"overflow-hidden\",\n \"bg-surface-container-highest\", // MD3: inactive track color\n]);\n\n/**\n * Linear indicator bar variants (the foreground progress fill).\n */\nexport const progressIndicatorVariants = cva([\n \"absolute\",\n \"left-0\",\n \"top-0\",\n \"h-full\",\n \"rounded-full\",\n \"bg-primary\", // MD3: active track color\n \"transition-[width]\",\n \"duration-medium4\", // MD3: 400ms for value transitions\n \"ease-standard\", // MD3: cubic-bezier(0.2, 0, 0, 1)\n]);\n\n/**\n * Stop indicator dot variants (linear determinate only).\n * Appears at the leading edge of the track head per MD3 spec.\n */\nexport const progressStopIndicatorVariants = cva([\n \"absolute\",\n \"right-0\",\n \"top-1/2\",\n \"-translate-y-1/2\",\n \"w-1\",\n \"h-1\",\n \"rounded-full\",\n \"bg-primary\", // MD3: stop indicator uses primary color\n]);\n\n/**\n * Circular SVG size variants.\n * Maps the size prop to MD3-specified dimensions.\n * - small: 24dp → h-6 w-6\n * - medium: 48dp → h-12 w-12 (default)\n * - large: 64dp → h-16 w-16\n */\nexport const progressCircularSizeVariants = cva(\n [\"relative\", \"flex\", \"items-center\", \"justify-center\", \"flex-shrink-0\"],\n {\n variants: {\n size: {\n small: \"h-6 w-6\", // MD3: 24dp\n medium: \"h-12 w-12\", // MD3: 48dp (default)\n large: \"h-16 w-16\", // MD3: 64dp\n },\n },\n defaultVariants: {\n size: \"medium\",\n },\n }\n);\n\n/**\n * Label text variants.\n * Rendered above or beside the indicator per MD3 spec.\n */\nexport const progressLabelVariants = cva([\n \"text-body-small\", // MD3: body-small type scale (12px)\n \"text-on-surface\", // MD3: on-surface color role\n \"select-none\",\n]);\n\n/**\n * Extract variant prop types from CVA.\n */\nexport type ProgressContainerVariants = VariantProps<typeof progressContainerVariants>;\nexport type ProgressTrackVariants = VariantProps<typeof progressTrackVariants>;\nexport type ProgressIndicatorVariants = VariantProps<typeof progressIndicatorVariants>;\nexport type ProgressCircularSizeVariants = VariantProps<typeof progressCircularSizeVariants>;\nexport type ProgressLabelVariants = VariantProps<typeof progressLabelVariants>;\n","\"use client\";\n\nimport { forwardRef, useRef } from \"react\";\nimport type React from \"react\";\nimport { useProgressBar } from \"react-aria\";\nimport { cn } from \"../../utils/cn\";\nimport {\n progressContainerVariants,\n progressTrackVariants,\n progressIndicatorVariants,\n progressStopIndicatorVariants,\n progressCircularSizeVariants,\n progressLabelVariants,\n} from \"./Progress.variants\";\nimport type { ProgressProps } from \"./Progress.types\";\nimport \"./Progress.css\";\n\n// ---------------------------------------------------------------------------\n// SVG constants for circular variant\n// MD3 spec: stroke-width = 4dp; size maps to dp values below.\n// ---------------------------------------------------------------------------\n\nconst STROKE_WIDTH = 4;\n\nconst CIRCULAR_SIZE_PX: Record<\"small\" | \"medium\" | \"large\", number> = {\n small: 24,\n medium: 48,\n large: 64,\n};\n\nfunction getCircularGeometry(size: \"small\" | \"medium\" | \"large\"): {\n diameter: number;\n radius: number;\n circumference: number;\n viewBox: string;\n cx: number;\n cy: number;\n} {\n const diameter = CIRCULAR_SIZE_PX[size];\n const radius = (diameter - STROKE_WIDTH) / 2;\n const circumference = 2 * Math.PI * radius;\n const viewBox = `0 0 ${diameter} ${diameter}`;\n const cx = diameter / 2;\n const cy = diameter / 2;\n return { diameter, radius, circumference, viewBox, cx, cy };\n}\n\n/**\n * Material Design 3 Progress Indicator (Layer 3: Styled)\n *\n * Built on React Aria for world-class accessibility.\n * Supports four variants driven by `type` + `indeterminate` props:\n * - Linear Determinate\n * - Linear Indeterminate\n * - Circular Determinate\n * - Circular Indeterminate\n *\n * MD3 Specifications:\n * - Linear track height: 4dp (h-1)\n * - Linear track shape: rounded-full\n * - Circular default size: 48dp (medium)\n * - Circular stroke width: 4dp (SVG attribute)\n * - Active track: primary\n * - Inactive track: surface-container-highest\n * - Determinate transitions: duration-medium4 + ease-standard\n * - Indeterminate linear cycle: duration-long2\n * - Indeterminate circular rotation: duration-long4\n *\n * @example\n * ```tsx\n * // Linear determinate\n * <Progress type=\"linear\" value={60} label=\"Uploading\" />\n *\n * // Linear indeterminate\n * <Progress type=\"linear\" indeterminate aria-label=\"Loading\" />\n *\n * // Circular determinate\n * <Progress type=\"circular\" value={75} label=\"Processing\" />\n *\n * // Circular indeterminate\n * <Progress type=\"circular\" indeterminate aria-label=\"Loading\" />\n *\n * // Circular small spinner\n * <Progress type=\"circular\" indeterminate size=\"small\" aria-label=\"Loading\" />\n * ```\n */\nexport const Progress = forwardRef<HTMLDivElement, ProgressProps>(\n (\n {\n type = \"linear\",\n indeterminate = false,\n size = \"medium\",\n className,\n label,\n value = 0,\n minValue = 0,\n maxValue = 100,\n ...restProps\n },\n forwardedRef\n ) => {\n const internalRef = useRef<HTMLDivElement>(null);\n const ref = (forwardedRef ?? internalRef) as React.RefObject<HTMLDivElement>;\n\n // React Aria: provides progressBarProps (role, aria-value*) and labelProps\n const { progressBarProps, labelProps } = useProgressBar({\n label,\n value,\n minValue,\n maxValue,\n isIndeterminate: indeterminate,\n ...restProps,\n });\n\n // Percentage for determinate rendering\n const percentage = indeterminate\n ? 0\n : Math.min(100, Math.max(0, ((value - minValue) / (maxValue - minValue)) * 100));\n\n // Development warning: require accessible label\n if (process.env.NODE_ENV !== \"production\") {\n const ariaProps = restProps as {\n \"aria-label\"?: string;\n \"aria-labelledby\"?: string;\n };\n if (!label && !ariaProps[\"aria-label\"] && !ariaProps[\"aria-labelledby\"]) {\n console.warn(\n \"[Progress] Progress indicator should have a visible label prop or aria-label for accessibility.\"\n );\n }\n }\n\n return (\n <div\n {...progressBarProps}\n ref={ref}\n className={cn(progressContainerVariants({ type }), className)}\n >\n {/* Optional visible label */}\n {label && (\n <span {...labelProps} className={cn(progressLabelVariants())}>\n {label}\n </span>\n )}\n\n {/* Visual rendering: branches on type × indeterminate */}\n {type === \"linear\" ? (\n <LinearProgress percentage={percentage} indeterminate={indeterminate} />\n ) : (\n <CircularProgress percentage={percentage} indeterminate={indeterminate} size={size} />\n )}\n </div>\n );\n }\n);\n\nProgress.displayName = \"Progress\";\n\n// ---------------------------------------------------------------------------\n// Linear Progress Visual\n// ---------------------------------------------------------------------------\n\ninterface LinearProgressProps {\n percentage: number;\n indeterminate: boolean;\n}\n\nfunction LinearProgress({ percentage, indeterminate }: LinearProgressProps): React.JSX.Element {\n if (indeterminate) {\n return (\n <div data-progress-track=\"\" className={cn(progressTrackVariants())}>\n <div\n data-progress-indeterminate=\"\"\n className=\"absolute inset-0 overflow-hidden rounded-full\"\n >\n {/* Segment 1 */}\n <div\n className={cn(\n \"bg-primary absolute top-0 h-full rounded-full\",\n \"animate-progress-linear-indeterminate-1\"\n )}\n />\n {/* Segment 2 */}\n <div\n className={cn(\n \"bg-primary absolute top-0 h-full rounded-full\",\n \"animate-progress-linear-indeterminate-2\"\n )}\n />\n </div>\n </div>\n );\n }\n\n return (\n <div data-progress-track=\"\" className={cn(progressTrackVariants())}>\n {/* Determinate indicator bar */}\n <div\n data-progress-indicator=\"\"\n className={cn(progressIndicatorVariants())}\n style={{ width: `${percentage}%` }}\n />\n {/* Stop indicator dot — leading edge of progress head per MD3 */}\n <div\n data-stop-indicator=\"\"\n className={cn(progressStopIndicatorVariants())}\n aria-hidden=\"true\"\n />\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Circular Progress Visual\n// ---------------------------------------------------------------------------\n\ninterface CircularProgressProps {\n percentage: number;\n indeterminate: boolean;\n size: \"small\" | \"medium\" | \"large\";\n}\n\nfunction CircularProgress({\n percentage,\n indeterminate,\n size,\n}: CircularProgressProps): React.JSX.Element {\n const { radius, circumference, viewBox, cx, cy } = getCircularGeometry(size);\n\n // stroke-dashoffset: 0 = full circle (100%), circumference = empty circle (0%)\n const strokeDashoffset = (1 - percentage / 100) * circumference;\n\n if (indeterminate) {\n return (\n <div\n data-progress-size={size}\n data-progress-indeterminate=\"\"\n className={cn(progressCircularSizeVariants({ size }))}\n >\n <svg\n viewBox={viewBox}\n className=\"animate-progress-circular-rotate h-full w-full\"\n aria-hidden=\"true\"\n >\n <circle\n cx={cx}\n cy={cy}\n r={radius}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={STROKE_WIDTH}\n className=\"text-surface-container-highest\"\n />\n <circle\n cx={cx}\n cy={cy}\n r={radius}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={STROKE_WIDTH}\n className=\"animate-progress-circular-dash text-primary\"\n strokeLinecap=\"round\"\n />\n </svg>\n </div>\n );\n }\n\n return (\n <div data-progress-size={size} className={cn(progressCircularSizeVariants({ size }))}>\n <svg viewBox={viewBox} className=\"h-full w-full -rotate-90\" aria-hidden=\"true\">\n {/* Background circle (inactive track) */}\n <circle\n cx={cx}\n cy={cy}\n r={radius}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={STROKE_WIDTH}\n className=\"text-surface-container-highest\"\n />\n {/* Foreground circle (active track, determinate) */}\n <circle\n cx={cx}\n cy={cy}\n r={radius}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={STROKE_WIDTH}\n strokeLinecap=\"round\"\n className=\"text-primary duration-medium4 ease-standard transition-[stroke-dashoffset]\"\n strokeDasharray={circumference}\n strokeDashoffset={strokeDashoffset}\n />\n </svg>\n </div>\n );\n}\n","import { forwardRef, useRef } from \"react\";\nimport type React from \"react\";\nimport { useProgressBar } from \"react-aria\";\nimport type { ProgressHeadlessProps } from \"./Progress.types\";\n\n/**\n * Headless Progress Indicator Component (Layer 2)\n *\n * Unstyled progress bar primitive using React Aria for accessibility.\n * Provides behavior only — bring your own styles.\n *\n * Features:\n * - role=\"progressbar\" with correct aria-value* attributes\n * - Determinate and indeterminate progress support\n * - Internationalized value label formatting via React Aria\n * - Label linkage via aria-labelledby / aria-label\n * - Render prop for custom visual rendering\n *\n * @example\n * ```tsx\n * // Custom visual via render prop\n * <ProgressHeadless\n * value={50}\n * label=\"Upload\"\n * renderProgress={({ percentage }) => (\n * <div style={{ width: `${percentage}%` }} />\n * )}\n * />\n *\n * // Children-based rendering\n * <ProgressHeadless value={75} aria-label=\"Loading\">\n * <MyCustomProgressVisual />\n * </ProgressHeadless>\n * ```\n */\nexport const ProgressHeadless = forwardRef<HTMLDivElement, ProgressHeadlessProps>(\n (\n {\n type = \"linear\",\n indeterminate = false,\n size = \"medium\",\n className,\n children,\n renderProgress,\n label,\n value = 0,\n minValue = 0,\n maxValue = 100,\n ...restProps\n },\n forwardedRef\n ) => {\n const internalRef = useRef<HTMLDivElement>(null);\n const ref = (forwardedRef ?? internalRef) as React.RefObject<HTMLDivElement>;\n\n // Map our `indeterminate` prop to React Aria's `isIndeterminate`\n const { progressBarProps, labelProps } = useProgressBar({\n label,\n value,\n minValue,\n maxValue,\n isIndeterminate: indeterminate,\n ...restProps,\n });\n\n // Compute percentage for consumers\n const percentage = indeterminate ? 0 : ((value - minValue) / (maxValue - minValue)) * 100;\n\n return (\n <div {...progressBarProps} ref={ref} className={className}>\n {label && <span {...labelProps}>{label}</span>}\n {renderProgress?.({\n percentage,\n isIndeterminate: indeterminate,\n type,\n size,\n })}\n {children}\n </div>\n );\n }\n);\n\nProgressHeadless.displayName = \"ProgressHeadless\";\n","\"use client\";\n\nimport { forwardRef, useRef } from \"react\";\nimport type React from \"react\";\nimport { useButton, useFocusRing } from \"react-aria\";\nimport { mergeProps } from \"@react-aria/utils\";\nimport type { CardHeadlessProps } from \"./Card.types\";\n\n/**\n * `CardHeadless` — Layer 2 headless primitive.\n *\n * Provides all MD3 Card interaction semantics without any visual styling.\n *\n * ## Dual-mode behavior\n *\n * | Condition | Role | Keyboard | Focus ring |\n * |---|---|---|---|\n * | `onPress` or `href` present | `role=\"button\"` | Enter / Space activate | `data-focus-visible=\"true\"` on keyboard focus |\n * | Neither present | `role=\"article\"` | No activation | Not applicable |\n *\n * Both `useButton` and `useFocusRing` are **always** called (React Rules of Hooks).\n * When the card is non-interactive, `buttonProps` are not spread onto the element\n * so no keyboard interaction or tab-stop is added.\n *\n * ## Focus ring\n *\n * The `data-focus-visible` attribute is set to `\"true\"` only when focus was\n * triggered by keyboard navigation (`useFocusRing` → `isFocusVisible`).\n * Mouse/touch focus leaves the attribute unset. The styled Card layer reads\n * this attribute to conditionally render the MD3 focus ring.\n *\n * @example\n * ```tsx\n * // Interactive\n * <CardHeadless\n * onPress={handlePress}\n * aria-label=\"View details\"\n * className=\"rounded-xl p-4\"\n * >\n * Card content\n * </CardHeadless>\n *\n * // Static\n * <CardHeadless className=\"rounded-xl p-4\">\n * Card content\n * </CardHeadless>\n * ```\n */\nexport const CardHeadless = forwardRef<HTMLDivElement, CardHeadlessProps>(function CardHeadless(\n { className, children, ...ariaButtonProps },\n forwardedRef\n) {\n const internalRef = useRef<HTMLDivElement>(null);\n\n // Prefer the forwarded ref; fall back to internal ref for React Aria hooks.\n const ref = (forwardedRef ?? internalRef) as React.RefObject<HTMLDivElement>;\n\n const isInteractive = !!(ariaButtonProps.onPress ?? ariaButtonProps.href);\n\n // Always call both hooks unconditionally (Rules of Hooks).\n // All AriaButtonProps flow through the spread to satisfy exactOptionalPropertyTypes —\n // explicitly re-listing optional props as `key: value` would force `T | undefined`\n // onto required positions and cause TS2769.\n // `buttonProps` is only applied to the element when isInteractive is true.\n const { buttonProps } = useButton({ elementType: \"div\", ...ariaButtonProps }, ref);\n\n const { focusProps, isFocusVisible } = useFocusRing();\n\n if (isInteractive) {\n const interactiveProps = mergeProps(buttonProps, focusProps, {\n className,\n \"data-focus-visible\": isFocusVisible ? \"true\" : undefined,\n });\n\n return (\n <div {...interactiveProps} ref={ref}>\n {children}\n </div>\n );\n }\n\n return (\n <div role=\"article\" className={className} ref={ref}>\n {children}\n </div>\n );\n});\n\nCardHeadless.displayName = \"CardHeadless\";\n","import { cva, type VariantProps } from \"class-variance-authority\";\n\n/**\n * Material Design 3 Card Variants (CVA)\n *\n * Type-safe variant management for the Card component.\n * Uses Tailwind CSS classes mapped to MD3 design tokens.\n *\n * MD3 Specifications:\n * - Shape: medium (12dp) → `rounded-md`\n * - Elevated: surface-container-low + elevation-1 (resting), elevation-2 (hover/interactive)\n * - Filled: surface-container-highest + elevation-0\n * - Outlined: surface + outline-variant border + elevation-0\n * - Dragged state (elevated only): elevation-4, slower shadow transition\n * - Disabled: on-surface at 12% opacity (`opacity-38`) + no pointer events\n */\nexport const cardVariants = cva(\n [\n // Shape: MD3 medium corner = 12dp\n \"relative overflow-hidden rounded-md\",\n // Shadow transition (effects property — use spring standard fast effects)\n \"transition-shadow duration-spring-standard-fast-effects ease-spring-standard-fast-effects\",\n ],\n {\n variants: {\n /**\n * Card visual variant per MD3 specification.\n */\n variant: {\n elevated: [\"shadow-elevation-1\", \"hover:shadow-elevation-2\"],\n filled: [\"shadow-elevation-0\"],\n outlined: [\"border\", \"border-outline-variant\", \"shadow-elevation-0\"],\n },\n\n /**\n * Whether the card is interactive (has onPress or href).\n * Interactive cards gain a cursor, keyboard focus ring, and state layer.\n */\n isInteractive: {\n true: [\n \"cursor-pointer\",\n \"focus-visible:outline-2\",\n \"focus-visible:outline-primary\",\n \"focus-visible:outline-offset-2\",\n ],\n false: \"cursor-default\",\n },\n\n /**\n * Whether the card is currently being dragged.\n * Applies elevated shadow level 4 with a slower, more intentional transition\n * to communicate physical lift per MD3 motion spec.\n */\n isDragged: {\n true: [\n \"shadow-elevation-4\",\n // Override base transition to use a slower, decelerate curve for drag onset\n \"duration-medium2\",\n \"ease-emphasized-decelerate\",\n ],\n false: \"\",\n },\n\n /**\n * Whether the card is disabled.\n * MD3 spec: 38% opacity, no pointer events.\n */\n isDisabled: {\n true: [\"opacity-38\", \"pointer-events-none\"],\n false: \"\",\n },\n },\n\n compoundVariants: [\n // Filled + enabled\n {\n variant: \"filled\",\n isDisabled: false,\n class: \"bg-surface-container-highest\",\n },\n\n // Filled + disabled\n {\n variant: \"filled\",\n isDisabled: true,\n class: \"bg-surface-container-variant\",\n },\n // Elevated + enabled\n {\n variant: \"elevated\",\n isDisabled: true,\n class: \"bg-surface\",\n },\n // Elevated + disabled\n {\n variant: \"elevated\",\n isDisabled: false,\n class: \"bg-surface-container-low\",\n },\n // Outlined + enabled\n {\n variant: \"outlined\",\n isDisabled: true,\n class: \"bg-surface\",\n },\n // Outlined + disabled\n {\n variant: \"outlined\",\n isDisabled: false,\n class: \"bg-surface\",\n },\n ],\n\n defaultVariants: {\n variant: \"elevated\",\n isInteractive: false,\n isDragged: false,\n isDisabled: false,\n },\n }\n);\n\n/**\n * Extract variant prop types from CVA for typed usage.\n */\nexport type CardVariants = VariantProps<typeof cardVariants>;\n","\"use client\";\n\nimport { forwardRef, useState } from \"react\";\nimport type React from \"react\";\nimport { CardHeadless } from \"./CardHeadless\";\nimport { cardVariants } from \"./Card.variants\";\nimport { cn } from \"../../utils/cn\";\nimport { useRipple } from \"../../hooks/useRipple\";\nimport type { CardProps } from \"./Card.types\";\n\n/**\n * `Card` — Layer 3 MD3 Styled Card Component.\n *\n * Wraps `CardHeadless` with Material Design 3 visual styling: elevation shadows,\n * state layer, ripple feedback, and all three card variants.\n *\n * ## Modes\n *\n * | Condition | Rendered as | Ripple | State layer |\n * |---|---|---|---|\n * | `onPress` or `href` provided | `role=\"button\"` | ✅ | ✅ |\n * | Neither provided | `role=\"article\"` | ❌ | ❌ |\n *\n * ## Variants\n *\n * - **elevated** — `surface-container-low` background, elevation 1dp at rest (2dp on hover).\n * - **filled** — `surface-container-highest` background, no elevation.\n * - **outlined** — `surface` background, `outline-variant` border, no elevation.\n *\n * ## Dragged state\n *\n * When `isDraggable` is `true`, the card tracks its own drag state via mouse events.\n * While dragging, the `elevated` variant jumps to elevation 4dp using a slower,\n * decelerate transition curve per MD3 motion spec.\n *\n * @example\n * ```tsx\n * // Non-interactive\n * <Card variant=\"outlined\">\n * <CardHeader headline=\"Title\" subheader=\"Subheader\" />\n * <CardContent>Body text</CardContent>\n * </Card>\n *\n * // Interactive\n * <Card variant=\"elevated\" onPress={() => navigate('/details')} aria-label=\"View product details\">\n * <CardMedia src=\"/image.jpg\" alt=\"Product\" />\n * <CardHeader headline=\"Product Name\" />\n * <CardActions>\n * <Button variant=\"text\">Buy Now</Button>\n * </CardActions>\n * </Card>\n * ```\n *\n * @see https://m3.material.io/components/cards/overview\n * @see https://m3.material.io/components/cards/specs\n */\nexport const Card = forwardRef<HTMLDivElement, CardProps>(function Card(\n {\n variant = \"elevated\",\n onPress,\n href,\n isDraggable = false,\n isDisabled = false,\n className,\n children,\n \"aria-label\": ariaLabel,\n },\n ref\n) {\n const isInteractive = !!(onPress ?? href);\n\n const [isDragged, setIsDragged] = useState(false);\n const [isPressed, setIsPressed] = useState(false);\n\n const { onMouseDown: handleRipple, ripples } = useRipple({\n disabled: !isInteractive || isDisabled,\n });\n\n const handleMouseDown = (e: React.MouseEvent<HTMLElement>): void => {\n handleRipple(e);\n if (isDraggable) setIsDragged(true);\n };\n\n const handleMouseUp = (): void => {\n if (isDraggable) setIsDragged(false);\n };\n\n const handleMouseLeave = (): void => {\n if (isDraggable) setIsDragged(false);\n };\n\n const handlePressStart = (): void => setIsPressed(true);\n const handlePressEnd = (): void => setIsPressed(false);\n\n return (\n <CardHeadless\n ref={ref}\n {...(onPress !== undefined && { onPress })}\n {...(href !== undefined && { href })}\n isDisabled={isDisabled}\n {...(ariaLabel !== undefined && { \"aria-label\": ariaLabel })}\n onPressStart={handlePressStart}\n onPressEnd={handlePressEnd}\n onMouseDown={handleMouseDown}\n onMouseUp={handleMouseUp}\n onMouseLeave={handleMouseLeave}\n className={cn(\n cardVariants({ variant, isInteractive, isDragged, isDisabled }),\n \"group\",\n className\n )}\n >\n {/* State layer — rendered below content via DOM order; pointer-events-none passes clicks through */}\n {isInteractive && (\n <div\n data-testid=\"card-state-layer\"\n data-pressed={isPressed ? \"\" : undefined}\n aria-hidden=\"true\"\n className={cn(\n \"bg-on-surface pointer-events-none absolute inset-0 rounded-md\",\n \"opacity-0 group-hover:opacity-8 data-[pressed]:opacity-12\",\n \"duration-spring-standard-fast-effects ease-spring-standard-fast-effects transition-opacity\"\n )}\n />\n )}\n\n {/* Ripple — rendered below content via DOM order */}\n {isInteractive && ripples}\n\n {/* Slot content — painted on top of state layer and ripple via DOM stacking order */}\n {children}\n </CardHeadless>\n );\n});\n\nCard.displayName = \"Card\";\n","import { forwardRef } from \"react\";\nimport { cva } from \"class-variance-authority\";\nimport { cn } from \"../../utils/cn\";\nimport type { CardMediaProps } from \"./Card.types\";\n\n/**\n * Aspect ratio CVA for CardMedia.\n *\n * MD3 spec: full-bleed media slot at the top of a card.\n * - `16/9` → `aspect-video` (16:9 native Tailwind utility)\n * - `4/3` → `aspect-video` (closest available token without arbitrary values)\n * - `1/1` → `aspect-square`\n * - `auto` → no aspect constraint (natural image dimensions)\n */\nconst cardMediaVariants = cva(\"w-full object-cover\", {\n variants: {\n aspectRatio: {\n \"16/9\": \"aspect-video\",\n \"4/3\": \"aspect-video\",\n \"1/1\": \"aspect-square\",\n auto: \"\",\n },\n },\n defaultVariants: {\n aspectRatio: \"auto\",\n },\n});\n\n/**\n * `CardMedia` — Full-bleed image slot sub-component (Layer 3).\n *\n * Renders a responsive image at the top of the card per MD3 spec.\n * When `alt` is an empty string the image is treated as decorative\n * (`role=\"presentation\"`). All other `alt` values are passed through as-is.\n *\n * @example\n * ```tsx\n * // Standard media with aspect ratio\n * <CardMedia src=\"/images/preview.jpg\" alt=\"Product preview\" aspectRatio=\"16/9\" />\n *\n * // Decorative image (hidden from assistive technology)\n * <CardMedia src=\"/images/banner.jpg\" alt=\"\" />\n * ```\n *\n * @see https://m3.material.io/components/cards/specs\n */\nexport const CardMedia = forwardRef<HTMLImageElement, CardMediaProps>(function CardMedia(\n { src, alt, aspectRatio = \"auto\", className },\n ref\n) {\n return (\n <img\n ref={ref}\n src={src}\n alt={alt}\n {...(alt === \"\" && { role: \"presentation\" })}\n className={cn(cardMediaVariants({ aspectRatio }), className)}\n />\n );\n});\n\nCardMedia.displayName = \"CardMedia\";\n","import { forwardRef } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport type { CardHeaderProps } from \"./Card.types\";\n\n/**\n * `CardHeader` — Headline and subheader slot sub-component (Layer 3).\n *\n * Renders the primary headline (`h3`) and an optional subheader (`p`) per MD3 spec.\n * Default padding is `p-4` (16dp). When stacked directly after another slot\n * (e.g., `CardMedia`), consumers should apply `pt-0` to reduce top padding\n * per the MD3 adjacent-slot spacing rule.\n *\n * @example\n * ```tsx\n * <CardHeader headline=\"Card title\" subheader=\"Supporting text\" />\n *\n * // Stacked after CardMedia — reduce top padding\n * <>\n * <CardMedia src=\"/hero.jpg\" alt=\"Hero\" aspectRatio=\"16/9\" />\n * <CardHeader className=\"pt-0\" headline=\"Card title\" subheader=\"Supporting text\" />\n * </>\n * ```\n *\n * @see https://m3.material.io/components/cards/specs\n */\nexport const CardHeader = forwardRef<HTMLDivElement, CardHeaderProps>(function CardHeader(\n { headline, subheader, className },\n ref\n) {\n return (\n <div ref={ref} className={cn(\"p-4\", className)}>\n <h3 className=\"text-on-surface text-title-large\">{headline}</h3>\n {subheader !== undefined && (\n <p className=\"text-on-surface-variant text-body-medium mt-1\">{subheader}</p>\n )}\n </div>\n );\n});\n\nCardHeader.displayName = \"CardHeader\";\n","import { forwardRef } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport type { CardContentProps } from \"./Card.types\";\n\n/**\n * `CardContent` — Body content slot sub-component (Layer 3).\n *\n * Renders the main body area of the card with `p-4` (16dp) padding per MD3 spec.\n * No forced text styling is applied — consumers control typography of children.\n *\n * @example\n * ```tsx\n * <CardContent>\n * <p>Supporting text about the card content.</p>\n * </CardContent>\n * ```\n *\n * @see https://m3.material.io/components/cards/specs\n */\nexport const CardContent = forwardRef<HTMLDivElement, CardContentProps>(function CardContent(\n { children, className },\n ref\n) {\n return (\n <div ref={ref} className={cn(\"p-4\", className)}>\n {children}\n </div>\n );\n});\n\nCardContent.displayName = \"CardContent\";\n","import { forwardRef } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport type { CardActionsProps } from \"./Card.types\";\n\n/**\n * `CardActions` — Action buttons row slot sub-component (Layer 3).\n *\n * Renders a right-aligned flex row of action buttons at the bottom of the card\n * per MD3 spec. Top padding is reduced (`pt-0`) because this slot always\n * follows a content area. Typically contains `Button` components.\n *\n * @example\n * ```tsx\n * <CardActions>\n * <Button variant=\"text\" onPress={onCancel}>Cancel</Button>\n * <Button variant=\"filled\" onPress={onConfirm}>Confirm</Button>\n * </CardActions>\n * ```\n *\n * @see https://m3.material.io/components/cards/specs\n */\nexport const CardActions = forwardRef<HTMLDivElement, CardActionsProps>(function CardActions(\n { children, className },\n ref\n) {\n return (\n <div ref={ref} className={cn(\"flex items-center justify-end gap-2 p-4 pt-0\", className)}>\n {children}\n </div>\n );\n});\n\nCardActions.displayName = \"CardActions\";\n","\"use client\";\n\nimport {\n createContext,\n forwardRef,\n useCallback,\n useContext,\n useRef,\n useLayoutEffect,\n useState,\n isValidElement,\n cloneElement,\n type ReactNode,\n type ReactElement,\n type HTMLAttributes,\n type JSX,\n} from \"react\";\nimport {\n Menu as RACMenu,\n MenuItem as RACMenuItem,\n MenuSection as RACMenuSection,\n Separator as RACSeparator,\n SubmenuTrigger as RACSubmenuTrigger,\n MenuTrigger as RACMenuTrigger,\n ButtonContext,\n Popover,\n OverlayTriggerStateContext,\n useSlottedContext,\n type SeparatorProps as RACSeparatorProps,\n} from \"react-aria-components\";\nimport { useButton } from \"react-aria\";\nimport { useOverlayTriggerState } from \"react-stately\";\nimport type {\n HeadlessMenuTriggerProps,\n HeadlessMenuProps,\n HeadlessMenuItemProps,\n HeadlessMenuSectionProps,\n HeadlessSubmenuTriggerProps,\n HeadlessContextMenuTriggerProps,\n MenuContextValue,\n} from \"./Menu.types\";\n\n// ─── MenuContext ──────────────────────────────────────────────────────────────\n\nexport const MenuContext = createContext<MenuContextValue | null>(null);\n\nexport function useMenuContext(): MenuContextValue | null {\n return useContext(MenuContext);\n}\n\n// ─── TriggerBridge ────────────────────────────────────────────────────────────\n/**\n * Reads the button slot props from `ButtonContext` (provided by `RACMenuTrigger`)\n * and applies them to any plain HTML element child via `cloneElement`.\n *\n * This bridges the gap between RAC's context-based prop injection (which expects\n * a RAC `Button`) and our Layer 3 API that accepts any trigger element (e.g. a\n * native `<button>` or a custom component).\n *\n * @internal\n */\nfunction TriggerBridge({ children }: { children: ReactNode }): ReactNode {\n // useSlottedContext gives a properly typed value (ButtonContextValue & { ref? })\n // without casting through any.\n const ctx = useSlottedContext(ButtonContext);\n const localRef = useRef<HTMLButtonElement | null>(null);\n\n const { ref: contextRef, ...ctxProps } = ctx ?? {};\n\n // Write to both the context ref (used by RACMenuTrigger for popover\n // positioning) and localRef (passed to useButton, which requires a stable\n // RefObject rather than a ForwardedRef).\n const mergedCallbackRef = useCallback(\n (node: HTMLButtonElement | null) => {\n localRef.current = node;\n if (!contextRef) return;\n if (typeof contextRef === \"function\") {\n contextRef(node);\n } else {\n // After the function check, contextRef is MutableRefObject<HTMLButtonElement | null>\n // (ForwardedRef<T> = callback | MutableRefObject<T | null> | null).\n contextRef.current = node;\n }\n },\n [contextRef]\n );\n\n // ButtonContext is populated by RACMenuTrigger with aria-haspopup,\n // aria-expanded, aria-controls, onPress, onKeyDown, etc.\n // useButton converts React Aria's onPress + keyboard props into standard\n // HTML events (onClick, onKeyDown, etc.) that work on native elements.\n const { buttonProps } = useButton({ ...ctxProps, elementType: \"button\" }, localRef);\n\n if (!isValidElement(children)) return <>{children}</>;\n\n return cloneElement(\n children as React.ReactElement<HTMLAttributes<HTMLElement>>,\n { ...buttonProps, ref: mergedCallbackRef } as HTMLAttributes<HTMLElement>\n );\n}\n\n// ─── HeadlessMenuTrigger ──────────────────────────────────────────────────────\n\n/**\n * Layer 2 headless primitive.\n *\n * Uses `RACMenuTrigger` (Layer 1) as the foundation. `RACMenuTrigger` manages:\n * - `aria-haspopup=\"menu\"` and `aria-expanded` on the trigger (dynamic)\n * - Open/close state and keyboard opening (ArrowDown → focus first item)\n * - `OverlayTriggerStateContext` so the Popover can close on Escape / outside click\n * - `PopoverGroupContext` so the Popover's `ariaHideOutside` does NOT hide the\n * trigger button while the menu is open\n *\n * `TriggerBridge` adapts the context-injected button props to work with any\n * plain HTML element (native `<button>`, custom components, etc.).\n */\nexport function HeadlessMenuTrigger({\n children,\n placement = \"bottom start\",\n shouldFlip = true,\n ...rest\n}: HeadlessMenuTriggerProps): JSX.Element {\n const childrenArray = Array.isArray(children) ? children : [children];\n const [triggerChild, menuChild] = childrenArray as [ReactNode, ReactNode];\n\n return (\n <RACMenuTrigger {...rest}>\n <TriggerBridge>{triggerChild}</TriggerBridge>\n {/*\n * RACMenuTrigger provides PopoverGroupContext which tells ariaHideOutside\n * to exclude the trigger button — so we do NOT need isNonModal here.\n * Without isNonModal the Popover uses the standard modal overlay underlay,\n * which correctly dismisses the menu on any outside pointer interaction.\n */}\n <Popover placement={placement} shouldFlip={shouldFlip} offset={4}>\n {menuChild}\n </Popover>\n </RACMenuTrigger>\n );\n}\n\n// ─── HeadlessMenu ─────────────────────────────────────────────────────────────\n\n/**\n * Layer 2 headless primitive wrapping RAC `Menu`.\n *\n * When nested inside `HeadlessMenuTrigger`, RAC automatically threads the\n * `MenuContext` (containing `autoFocus`, `onClose`, `aria-labelledby`, etc.)\n * from `RACMenuTrigger` through to `RACMenu`. No manual prop threading needed.\n *\n * **aria-label / aria-labelledby precedence fix**: `RACSubmenuTrigger` sets\n * `aria-labelledby` in `MenuContext` pointing to the trigger item. In ARIA\n * spec, `aria-labelledby` always overrides `aria-label`. So when the consumer\n * provides an explicit `aria-label`, we suppress the context's\n * `aria-labelledby` by passing `aria-labelledby={undefined}`, which takes\n * precedence over the `MenuContext` value in `useContextProps`'s `mergeProps`\n * call (last argument wins). This ensures `aria-label=\"My Submenu\"` is\n * respected as the accessible name.\n */\nexport function HeadlessMenu<T extends object = object>({\n className,\n children,\n \"aria-label\": ariaLabel,\n ...props\n}: HeadlessMenuProps<T>): JSX.Element {\n const menuRef = useRef<HTMLDivElement | null>(null);\n\n /**\n * `RACSubmenuTrigger` provides `MenuContext` with `aria-labelledby` pointing\n * to the trigger item's id. In the ARIA spec, `aria-labelledby` always beats\n * `aria-label`, so even if we pass `aria-label` as a prop it would be\n * overridden. `useContextProps` inside `RACMenu` merges context first then\n * explicit props, but passing `aria-labelledby={undefined}` doesn't reliably\n * clear the context-injected attribute in all RAC versions.\n *\n * The only reliable fix: imperatively remove the attribute from the DOM node\n * after every render. `useLayoutEffect` runs synchronously after DOM mutations,\n * so the accessibility tree is already correct when testing-library reads it.\n */\n useLayoutEffect(() => {\n if (ariaLabel && menuRef.current) {\n menuRef.current.removeAttribute(\"aria-labelledby\");\n }\n });\n\n return (\n <RACMenu<T>\n {...props}\n ref={menuRef}\n {...(ariaLabel !== undefined ? { \"aria-label\": ariaLabel } : {})}\n className={className ?? \"\"}\n >\n {children}\n </RACMenu>\n );\n}\n\n// Expose HeadlessMenu as a static property so Layer 2 tests can use\n// <HeadlessMenuTrigger.Menu> just like <MenuTrigger.Menu> at Layer 3.\nHeadlessMenuTrigger.Menu = HeadlessMenu;\n\n// ─── HeadlessMenuItem ─────────────────────────────────────────────────────────\n\n/**\n * Layer 2 headless primitive wrapping RAC `MenuItem`.\n *\n * Accepts `className` as either a static string or a render-prop function\n * `(renderProps: MenuItemRenderProps) => string`, forwarding it directly to\n * `RACMenuItem` so MD3 selection-state styles are applied on the `<li>` element\n * (the element with `role=\"menuitem\"`).\n */\nexport const HeadlessMenuItem = forwardRef<HTMLDivElement, HeadlessMenuItemProps>(\n function HeadlessMenuItem({ children, className, ...props }, ref) {\n return (\n <RACMenuItem {...props} ref={ref} className={className ?? \"\"}>\n {children}\n </RACMenuItem>\n );\n }\n);\n\n// ─── HeadlessMenuSection ──────────────────────────────────────────────────────\n\nexport function HeadlessMenuSection({\n children,\n \"aria-label\": ariaLabel,\n className,\n}: HeadlessMenuSectionProps): JSX.Element {\n return (\n <RACMenuSection\n {...(ariaLabel !== undefined ? { \"aria-label\": ariaLabel } : {})}\n className={className ?? \"\"}\n >\n {children}\n </RACMenuSection>\n );\n}\n\n// ─── HeadlessMenuDivider ──────────────────────────────────────────────────────\n\nexport function HeadlessMenuDivider({\n className,\n ...props\n}: RACSeparatorProps & { className?: string }): JSX.Element {\n return <RACSeparator {...props} className={className ?? \"\"} />;\n}\n\n// ─── HeadlessSubmenuTrigger ───────────────────────────────────────────────────\n\n/**\n * Layer 2 headless primitive wrapping RAC `SubmenuTrigger`.\n *\n * RAC `SubmenuTrigger` expects its children to be a `[MenuItem, Popover>Menu]`\n * pair. The first child is the trigger item; the second is a `Popover` wrapping\n * the submenu `Menu`. We wrap the menu child in a `Popover` here so the consumer\n * only needs to provide `[MenuItem, Menu]`.\n */\nexport function HeadlessSubmenuTrigger({\n children,\n delay,\n}: HeadlessSubmenuTriggerProps): JSX.Element {\n const childrenArray = Array.isArray(children) ? children : [children];\n const [triggerItem, menuChild] = childrenArray as [ReactNode, ReactNode];\n\n // RACSubmenuTrigger requires ReactElement[] children — first child is the\n // trigger MenuItem, second is a Popover wrapping the submenu.\n const racChildren: ReactElement[] = [\n triggerItem as ReactElement,\n <Popover key=\"submenu-popover\">{menuChild}</Popover>,\n ];\n\n return (\n <RACSubmenuTrigger {...(delay !== undefined ? { delay } : {})}>{racChildren}</RACSubmenuTrigger>\n );\n}\n\n// ─── HeadlessContextMenuTrigger ───────────────────────────────────────────────\n\n/**\n * Layer 2 headless primitive for context menus (right-click / two-finger tap).\n * Positions the menu at cursor coordinates via a virtual 0×0 anchor element.\n */\nexport function HeadlessContextMenuTrigger({\n children,\n isOpen: isOpenProp,\n onOpenChange,\n}: HeadlessContextMenuTriggerProps): JSX.Element {\n const virtualTriggerRef = useRef<HTMLSpanElement>(null);\n const [position, setPosition] = useState({ x: 0, y: 0 });\n\n const isControlled = isOpenProp !== undefined;\n\n // Conditionally spread EOPT-sensitive props: isOpen/onOpenChange must not be\n // present with value `undefined` under exactOptionalPropertyTypes.\n const internalState = useOverlayTriggerState({\n ...(isControlled\n ? { isOpen: isOpenProp, ...(onOpenChange !== undefined ? { onOpenChange } : {}) }\n : {}),\n });\n\n const handleContextMenu = (e: React.MouseEvent): void => {\n e.preventDefault();\n setPosition({ x: e.clientX, y: e.clientY });\n internalState.open();\n if (!isControlled) onOpenChange?.(true);\n };\n\n const childrenArray = Array.isArray(children) ? children : [children];\n const [contentChild, menuChild] = childrenArray as [ReactNode, ReactNode];\n\n return (\n <>\n {/* eslint-disable-next-line jsx-a11y/no-static-element-interactions -- display:contents sink; not focusable itself, keyboard dismissal handled by RAC Popover Escape handler */}\n <div onContextMenu={handleContextMenu} style={{ display: \"contents\" }}>\n {contentChild}\n </div>\n\n {/* Virtual 0×0 anchor positioned at cursor coordinates */}\n <span\n ref={virtualTriggerRef}\n aria-hidden=\"true\"\n style={{\n position: \"fixed\",\n top: position.y,\n left: position.x,\n width: 0,\n height: 0,\n pointerEvents: \"none\",\n }}\n />\n\n {/*\n * OverlayTriggerStateContext is provided OUTSIDE the Popover so the\n * Popover reads internalState directly (not a derived localState).\n * We intentionally do NOT pass isOpen as a prop — when isOpen is a prop,\n * the Popover creates a separate localState whose close() doesn't update\n * internalState. By relying solely on OverlayTriggerStateContext, the\n * Popover's DismissButton / Escape key handler call internalState.close()\n * directly, which correctly dismisses the context menu.\n */}\n <OverlayTriggerStateContext.Provider value={internalState}>\n <Popover triggerRef={virtualTriggerRef} placement=\"bottom start\" shouldFlip offset={0}>\n {menuChild}\n </Popover>\n </OverlayTriggerStateContext.Provider>\n </>\n );\n}\n","import { cva, type VariantProps } from \"class-variance-authority\";\n\n/**\n * Material Design 3 Menu container variants (CVA).\n *\n * Elevation: `shadow-elevation-2` (both styles)\n * Width: min 112dp / max 280dp per MD3 spec\n *\n * Shape per menuStyle:\n * - baseline: `rounded-xs` (4dp extra-small)\n * - vertical: `rounded-lg` (16dp large)\n *\n * Background per colorScheme + menuStyle:\n * - baseline + standard: `bg-surface-container`\n * - vertical + standard: `bg-surface-container-low`\n * - vertical + vibrant: `bg-tertiary-container`\n *\n * @see https://m3.material.io/components/menus/specs\n */\nexport const menuContainerVariants = cva(\n [\n // Elevation\n \"shadow-elevation-2\",\n // Width constraints per MD3 spec (112dp min / 280dp max)\n \"min-w-28 max-w-70\",\n // Layout\n \"py-2\",\n // Scroll: show scrollbar when content overflows; max height avoids clipping\n \"overflow-y-auto\",\n \"max-h-[calc(var(--visual-viewport-height,100vh)-2rem)]\",\n // Stacking\n \"z-50\",\n // Focus outline handled by React Aria\n \"outline-none\",\n // GPU compositing — promotes menu to its own compositor layer so\n // scale + opacity animations run without triggering layout reflow.\n \"will-change-[transform,opacity]\",\n // Pointer events blocked during animation to prevent accidental clicks\n // on menu items while the panel is still animating in or out.\n \"data-[entering]:pointer-events-none data-[exiting]:pointer-events-none\",\n // ── Enter animation ────────────────────────────────────────────────────\n // @keyframes menu-enter (defined in styles.css): scale(0.8)+opacity:0 →\n // scale(1)+opacity:1 in 120ms with cubic-bezier(0,0,0.2,1) (standard\n // decelerate — matches Angular Material's _mat-menu-enter keyframe).\n \"data-[entering]:animate-[menu-enter_120ms_cubic-bezier(0,0,0.2,1)_both]\",\n // ── Exit animation ─────────────────────────────────────────────────────\n // @keyframes menu-exit (defined in styles.css): opacity:1 → opacity:0\n // in 100ms after 25ms delay, linear — matches Angular Material's\n // _mat-menu-exit keyframe (fade-only, no reverse scale).\n \"data-[exiting]:animate-[menu-exit_100ms_25ms_linear_both]\",\n // ── Transform origin (placement-aware) ────────────────────────────────\n // RAC sets data-placement=\"bottom|top|left|right\" on the Popover element.\n // Default (bottom): origin at top edge (menu expands downward).\n \"origin-top\",\n // top: origin at bottom edge (menu expands upward)\n \"data-[placement=top]:origin-bottom\",\n // left: origin at right edge\n \"data-[placement=left]:origin-right\",\n // right: origin at left edge\n \"data-[placement=right]:origin-left\",\n // ── Reduced motion ────────────────────────────────────────────────────\n // Skip both animations entirely for users who prefer reduced motion.\n \"motion-reduce:data-[entering]:animate-none motion-reduce:data-[exiting]:animate-none\",\n ],\n {\n variants: {\n /**\n * Color scheme — drives the container background.\n * baseline+standard uses a separate compound variant.\n */\n colorScheme: {\n standard: [],\n vibrant: [],\n },\n /**\n * Visual style — drives corner radius and baseline vs vertical background.\n */\n menuStyle: {\n baseline: [\"rounded-xs\", \"bg-surface-container\"],\n vertical: [\"rounded-lg\", \"bg-surface-container-low\"],\n },\n },\n compoundVariants: [\n // Vertical + vibrant: tertiary container background\n {\n menuStyle: \"vertical\",\n colorScheme: \"vibrant\",\n class: [\"bg-tertiary-container\"],\n },\n ],\n defaultVariants: {\n colorScheme: \"standard\",\n menuStyle: \"baseline\",\n },\n }\n);\n\n/**\n * Material Design 3 Menu item variants (CVA).\n *\n * Typography: `text-body-large` per MD3 baseline spec (16sp / 400 weight).\n * Padding: `px-3` (12dp left/right), `gap-3` (12dp between elements).\n *\n * State layers (MD3 spec):\n * - Hover: `opacity-8` on state layer\n * - Focus visible: `opacity-12` on state layer\n * - Pressed: `opacity-12` on state layer\n * - Disabled: `opacity-38` on entire item\n *\n * Selection colors per menuStyle + colorScheme:\n * - baseline (any): `bg-surface-container-highest`\n * - vertical + standard: `bg-tertiary-container text-on-tertiary-container`\n * - vertical + vibrant: `bg-tertiary text-on-tertiary`\n *\n * Note: item height (48/44/40/36dp) is controlled by density via context,\n * applied directly in MenuItem component (not CVA) to avoid negative key issues.\n *\n * @see https://m3.material.io/components/menus/specs\n */\nexport const menuItemVariants = cva(\n [\n // Layout — height set by density context in MenuItem component\n \"relative flex w-full items-center\",\n \"px-3 gap-3\",\n // Typography: Body Large per MD3 baseline spec\n \"text-body-large\",\n // Interaction\n \"cursor-pointer select-none outline-none\",\n // State layer pseudo-element\n \"before:absolute before:inset-0 before:rounded-[inherit]\",\n \"before:transition-opacity before:duration-short2 before:ease-standard\",\n \"before:opacity-0\",\n // Hover state layer\n \"hover:before:opacity-8\",\n // Focus visible state layer\n \"focus-visible:before:opacity-12\",\n // Active pressed state layer\n \"active:before:opacity-12\",\n // Color transition for selection\n \"transition-colors duration-short2 ease-standard\",\n ],\n {\n variants: {\n /**\n * Disabled state: reduces opacity and blocks interaction.\n */\n isDisabled: {\n true: [\"opacity-38 cursor-not-allowed pointer-events-none\"],\n false: [],\n },\n /**\n * Selected state: background and text color driven by compound variants.\n */\n isSelected: {\n true: [],\n false: [],\n },\n /**\n * Color scheme: drives default text and state layer colors.\n * - standard: on-surface text, on-surface state layer\n * - vibrant (vertical only): on-tertiary-container text + state layer\n */\n colorScheme: {\n standard: [\"text-on-surface\", \"before:bg-on-surface\"],\n vibrant: [\"text-on-tertiary-container\", \"before:bg-on-tertiary-container\"],\n },\n /**\n * Visual style: drives corner radius on items (vertical uses rounded-lg\n * inherited from container, items stay flat inside).\n */\n menuStyle: {\n baseline: [],\n vertical: [],\n },\n },\n compoundVariants: [\n // ── Baseline selection (both colorSchemes) ──────────────────────────\n {\n isSelected: true,\n menuStyle: \"baseline\",\n class: [\n \"bg-surface-container-highest\",\n // text-on-surface already applied by standard colorScheme variant\n ],\n },\n // ── Vertical + Standard selection ───────────────────────────────────\n {\n isSelected: true,\n menuStyle: \"vertical\",\n colorScheme: \"standard\",\n class: [\n \"bg-tertiary-container\",\n \"text-on-tertiary-container\",\n \"before:bg-on-tertiary-container\",\n ],\n },\n // ── Vertical + Vibrant selection ─────────────────────────────────────\n {\n isSelected: true,\n menuStyle: \"vertical\",\n colorScheme: \"vibrant\",\n class: [\"bg-tertiary\", \"text-on-tertiary\", \"before:bg-on-tertiary\"],\n },\n ],\n defaultVariants: {\n isDisabled: false,\n isSelected: false,\n colorScheme: \"standard\",\n menuStyle: \"baseline\",\n },\n }\n);\n\n/**\n * Menu section container variants (CVA).\n */\nexport const menuSectionVariants = cva([\"flex flex-col w-full\"]);\n\n/**\n * Menu section header variants (CVA).\n *\n * Typography: `text-title-small text-on-surface-variant` per MD3 spec.\n */\nexport const menuSectionHeaderVariants = cva([\n \"px-3 pt-2 pb-1\",\n \"text-title-small text-on-surface-variant\",\n \"select-none\",\n]);\n\n/**\n * Menu item divider variants (CVA).\n *\n * Renders a horizontal separator with `border-outline-variant`.\n * Padding: 8dp top/bottom (`my-2`) per MD3 spec.\n *\n * @see https://m3.material.io/components/menus/specs — Measurements\n */\nexport const menuDividerVariants = cva([\"border-t border-outline-variant\", \"my-2 mx-0\"]);\n\n/**\n * Menu gap variants (CVA).\n *\n * A visual spacer for M3 Expressive vertical menus. Uses spacing instead of\n * a border line to separate item groups. `aria-hidden` and `role=\"none\"`.\n *\n * @see https://m3.material.io/components/menus/guidelines#gaps-and-dividers\n */\nexport const menuGapVariants = cva([\"h-2 w-full\"]);\n\n/**\n * Trailing text (keyboard shortcut) variants (CVA).\n *\n * Color: `text-on-surface-variant`, size: `text-label-large` (14sp).\n * The element also carries `aria-keyshortcuts` for screen reader support.\n */\nexport const menuItemTrailingTextVariants = cva([\n \"ml-auto shrink-0 text-label-large text-on-surface-variant\",\n \"select-none\",\n]);\n\n/**\n * Menu item description (supporting text) variants (CVA).\n *\n * Rendered below the label text.\n * Typography: `text-body-medium text-on-surface-variant`.\n */\nexport const menuItemDescriptionVariants = cva([\n \"text-body-medium text-on-surface-variant\",\n \"select-none\",\n]);\n\n// ─── Type exports ─────────────────────────────────────────────────────────────\n\nexport type MenuContainerVariants = VariantProps<typeof menuContainerVariants>;\nexport type MenuItemVariants = VariantProps<typeof menuItemVariants>;\nexport type MenuSectionVariants = VariantProps<typeof menuSectionVariants>;\n","\"use client\";\n\nimport { forwardRef, type JSX } from \"react\";\nimport { HeadlessMenuTrigger } from \"./MenuHeadless\";\nimport { MenuContext } from \"./MenuHeadless\";\nimport { HeadlessMenu } from \"./MenuHeadless\";\nimport { menuContainerVariants } from \"./Menu.variants\";\nimport { cn } from \"../../utils/cn\";\nimport type {\n MenuProps,\n MenuTriggerProps,\n MenuColorScheme,\n MenuStyle,\n MenuDensity,\n} from \"./Menu.types\";\n\n// ─── Menu ────────────────────────────────────────────────────────────────────\n\n/**\n * MD3 styled Menu component (Layer 3).\n *\n * Renders a list of `MenuItem`, `MenuSection`, or `MenuDivider` children.\n * Intended to be used as `MenuTrigger.Menu` (nested inside a `MenuTrigger`).\n *\n * @example\n * ```tsx\n * <MenuTrigger>\n * <Button>Open</Button>\n * <Menu aria-label=\"Actions\">\n * <MenuItem id=\"copy\">Copy</MenuItem>\n * <MenuItem id=\"paste\">Paste</MenuItem>\n * </Menu>\n * </MenuTrigger>\n * ```\n */\nconst Menu = forwardRef<HTMLElement, MenuProps>(function Menu(\n {\n children,\n className,\n colorScheme = \"standard\",\n menuStyle = \"baseline\",\n density = 0,\n disableRipple = false,\n selectionMode,\n selectedKeys,\n onSelectionChange,\n ...props\n },\n _ref\n) {\n /**\n * Close function injected by parent MenuTrigger.\n * The Popover's onClose handles the actual close; we provide a no-op here\n * unless wrapped by a trigger. When used inside MenuTrigger, the context\n * is overridden by the trigger's close handler.\n */\n const close = (): void => {\n // Controlled via RAC Popover — handled by overlay state context.\n };\n\n // Conditionally include optional EOPT-sensitive context fields.\n const contextValue = {\n close,\n disableRipple,\n colorScheme,\n menuStyle,\n density,\n ...(selectionMode !== undefined ? { selectionMode } : {}),\n ...(selectedKeys !== undefined ? { selectedKeys } : {}),\n };\n\n return (\n <MenuContext.Provider value={contextValue}>\n <HeadlessMenu\n {...props}\n {...(selectionMode !== undefined ? { selectionMode } : {})}\n {...(selectedKeys !== undefined ? { selectedKeys } : {})}\n {...(onSelectionChange !== undefined ? { onSelectionChange } : {})}\n className={cn(menuContainerVariants({ colorScheme, menuStyle }), className)}\n >\n {children}\n </HeadlessMenu>\n </MenuContext.Provider>\n );\n});\n\n// ─── MenuTrigger ─────────────────────────────────────────────────────────────\n\n/**\n * MD3 styled MenuTrigger component (Layer 3).\n *\n * Wraps a trigger element and a `Menu` to create a dropdown.\n * Attach `MenuTrigger.Menu` to specify the menu content, which gives IDE\n * autocompletion and makes the parent/child relationship explicit.\n *\n * @example\n * ```tsx\n * <MenuTrigger>\n * <button type=\"button\">Open Menu</button>\n * <MenuTrigger.Menu aria-label=\"Actions\">\n * <MenuItem id=\"cut\">Cut</MenuItem>\n * </MenuTrigger.Menu>\n * </MenuTrigger>\n * ```\n */\nfunction MenuTrigger({\n children,\n placement = \"bottom start\",\n shouldFlip = true,\n ...rest\n}: MenuTriggerProps): JSX.Element {\n return (\n <HeadlessMenuTrigger placement={placement} shouldFlip={shouldFlip} {...rest}>\n {children}\n </HeadlessMenuTrigger>\n );\n}\n\nMenuTrigger.Menu = Menu;\n\nexport { Menu, MenuTrigger };\nexport type { MenuColorScheme, MenuStyle, MenuDensity };\n","\"use client\";\n\nimport { forwardRef, type JSX } from \"react\";\nimport type { MenuItemRenderProps } from \"react-aria-components\";\nimport { useMenuContext } from \"./MenuHeadless\";\nimport { HeadlessMenuItem } from \"./MenuHeadless\";\nimport {\n menuItemVariants,\n menuItemTrailingTextVariants,\n menuItemDescriptionVariants,\n} from \"./Menu.variants\";\nimport { useRipple } from \"../../hooks/useRipple\";\nimport { cn } from \"../../utils/cn\";\nimport type { MenuItemProps } from \"./Menu.types\";\n\n// ─── CheckIcon ───────────────────────────────────────────────────────────────\n\nfunction CheckIcon(): JSX.Element {\n return (\n <svg\n data-testid=\"check-icon\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n focusable=\"false\"\n className=\"h-full w-full\"\n >\n <path d=\"M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z\" />\n </svg>\n );\n}\n\n// ─── ChevronRightIcon ─────────────────────────────────────────────────────────\n\nexport function ChevronRightIcon(): JSX.Element {\n return (\n <svg\n data-testid=\"chevron-icon\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n focusable=\"false\"\n className=\"h-full w-full\"\n >\n <path d=\"M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z\" />\n </svg>\n );\n}\n\n// ─── Density height map ────────────────────────────────────────────────────────\n\nconst DENSITY_HEIGHT: Record<0 | -1 | -2 | -3, string> = {\n 0: \"h-12\",\n [-1]: \"h-11\",\n [-2]: \"h-10\",\n [-3]: \"h-9\",\n};\n\n// ─── MenuItem ─────────────────────────────────────────────────────────────────\n\n/**\n * MD3 styled MenuItem component (Layer 3).\n *\n * All MD3 styles (selection colors, typography, density height) are applied\n * directly to the `<li role=\"menuitem\">` element via RAC's render-prop className,\n * ensuring tests and assistive technologies see the correct classes on the\n * semantically meaningful element.\n *\n * @example\n * ```tsx\n * <MenuItem id=\"copy\" leadingIcon={<CopyIcon />} trailingText=\"⌘C\">\n * Copy\n * </MenuItem>\n * ```\n */\nexport const MenuItem = forwardRef<HTMLDivElement, MenuItemProps>(function MenuItem(\n {\n children,\n leadingIcon,\n trailingIcon,\n trailingText,\n description,\n badge,\n className,\n disableRipple: itemDisableRipple,\n ...props\n },\n ref\n) {\n const ctx = useMenuContext();\n const disableRipple = itemDisableRipple ?? ctx?.disableRipple ?? false;\n const colorScheme = ctx?.colorScheme ?? \"standard\";\n const menuStyle = ctx?.menuStyle ?? \"baseline\";\n const density = ctx?.density ?? 0;\n const selectionMode = ctx?.selectionMode;\n\n const heightClass = DENSITY_HEIGHT[density];\n const isSelectionMenu = selectionMode != null;\n\n const { ripples, onMouseDown } = useRipple({ disabled: disableRipple });\n\n // className rendered on the <li role=\"menuitem\"> via RAC's render-prop form\n const computeClassName = ({ isDisabled, isSelected }: MenuItemRenderProps): string =>\n cn(\n menuItemVariants({\n isDisabled,\n isSelected: isSelected ?? false,\n colorScheme,\n menuStyle,\n }),\n // Height: auto when description is present (multi-line), otherwise density\n description ? \"min-h-12 py-2 h-auto items-start\" : heightClass,\n className\n );\n\n return (\n <HeadlessMenuItem\n {...props}\n ref={ref}\n // Apply all MD3 classes directly to the <li role=\"menuitem\"> element\n className={computeClassName}\n // onMouseDown triggers the ripple effect on mouse presses\n onMouseDown={onMouseDown as unknown as React.MouseEventHandler<Element>}\n >\n {({ isSelected }: MenuItemRenderProps) => (\n <>\n {/* Ripple container */}\n {!disableRipple && (\n <span className=\"pointer-events-none absolute inset-0 z-0 overflow-hidden rounded-[inherit]\">\n {ripples}\n </span>\n )}\n\n {/* ── Leading icon or checkmark slot ────────────────────────── */}\n {(leadingIcon != null || isSelectionMenu) && (\n <span\n className=\"text-on-surface-variant relative z-10 flex h-6 w-6 shrink-0 items-center justify-center\"\n aria-hidden=\"true\"\n >\n {isSelectionMenu && leadingIcon == null ? (\n isSelected ? (\n <CheckIcon />\n ) : null\n ) : (\n leadingIcon\n )}\n </span>\n )}\n\n {/* ── Text content area ─────────────────────────────────────── */}\n {description != null ? (\n <span className=\"relative z-10 flex min-w-0 flex-1 flex-col\">\n <span className=\"text-body-large\">{children}</span>\n <span className={menuItemDescriptionVariants()}>{description}</span>\n </span>\n ) : (\n <span className=\"text-body-large relative z-10 min-w-0 flex-1\">{children}</span>\n )}\n\n {/* ── Badge slot ────────────────────────────────────────────── */}\n {badge != null && <span className=\"relative z-10 shrink-0\">{badge}</span>}\n\n {/* ── Trailing icon ─────────────────────────────────────────── */}\n {trailingIcon != null && trailingText == null && (\n <span\n className=\"text-on-surface-variant relative z-10 ml-auto flex h-6 w-6 shrink-0 items-center justify-center\"\n aria-hidden=\"true\"\n >\n {trailingIcon}\n </span>\n )}\n\n {/* ── Trailing text (keyboard shortcut) ─────────────────────── */}\n {trailingText != null && trailingIcon == null && (\n <span\n className={cn(menuItemTrailingTextVariants(), \"relative z-10\")}\n aria-keyshortcuts={trailingText}\n >\n {trailingText}\n </span>\n )}\n </>\n )}\n </HeadlessMenuItem>\n );\n});\n","\"use client\";\n\nimport { type JSX } from \"react\";\nimport { Header as RACHeader } from \"react-aria-components\";\nimport { HeadlessMenuSection, HeadlessMenuDivider } from \"./MenuHeadless\";\nimport {\n menuSectionVariants,\n menuSectionHeaderVariants,\n menuDividerVariants,\n} from \"./Menu.variants\";\nimport { cn } from \"../../utils/cn\";\nimport type { MenuSectionProps } from \"./Menu.types\";\n\n/**\n * MD3 styled MenuSection component (Layer 3).\n *\n * Groups related `MenuItem` elements with an optional section header and an\n * optional top divider.\n *\n * **Implementation note**: The divider is rendered as a SIBLING BEFORE the\n * `RACMenuSection`, NOT inside it. RAC's `Section`/`MenuSection` only accepts\n * `Header` and `MenuItem` children — placing a `Separator` inside the section\n * would create invalid HTML (`<li>` inside `<li role=\"group\">`) and break RAC's\n * collection rendering.\n *\n * @example\n * ```tsx\n * <MenuSection header=\"Clipboard\" showDivider aria-label=\"Clipboard\">\n * <MenuItem id=\"cut\">Cut</MenuItem>\n * <MenuItem id=\"copy\">Copy</MenuItem>\n * </MenuSection>\n * ```\n */\nexport function MenuSection({\n children,\n header,\n showDivider = false,\n className,\n \"aria-label\": ariaLabel,\n}: MenuSectionProps): JSX.Element {\n // The union type guarantees at least one of these is a string.\n const sectionAriaLabel = (ariaLabel ?? header)!;\n\n return (\n <>\n {/* Divider is a sibling of the section, placed before it in the menu list */}\n {showDivider && <HeadlessMenuDivider className={menuDividerVariants()} />}\n <HeadlessMenuSection\n aria-label={sectionAriaLabel}\n className={cn(menuSectionVariants(), className)}\n >\n {/* RAC Header component renders a semantic section header inside the group */}\n {header && (\n <RACHeader className={menuSectionHeaderVariants()} aria-hidden=\"true\">\n {header}\n </RACHeader>\n )}\n {children}\n </HeadlessMenuSection>\n </>\n );\n}\n","\"use client\";\n\nimport { type JSX } from \"react\";\nimport { HeadlessMenuDivider } from \"./MenuHeadless\";\nimport { menuDividerVariants } from \"./Menu.variants\";\nimport { cn } from \"../../utils/cn\";\nimport type { MenuDividerProps } from \"./Menu.types\";\n\n/**\n * MD3 styled MenuDivider component (Layer 3).\n *\n * Renders a horizontal `role=\"separator\"` with `border-outline-variant` styling.\n * 8dp top/bottom padding (`my-2`) per MD3 spec.\n *\n * @example\n * ```tsx\n * <MenuItem id=\"cut\">Cut</MenuItem>\n * <MenuDivider />\n * <MenuItem id=\"select-all\">Select all</MenuItem>\n * ```\n */\nexport function MenuDivider({ className }: MenuDividerProps): JSX.Element {\n return <HeadlessMenuDivider className={cn(menuDividerVariants(), className)} />;\n}\n","\"use client\";\n\nimport { forwardRef, useCallback, useEffect, useRef, useState } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport type { SnackbarAnimationState, SnackbarHeadlessProps } from \"./Snackbar.types\";\n\n/**\n * SnackbarHeadless — Layer 2 headless primitive.\n *\n * Handles all Snackbar behavior without opinionated visual styling:\n * - ARIA live region with correct `role`/`aria-live` pairing per severity\n * - Auto-dismiss timer with configurable `duration`\n * - Timer pause/resume on pointer hover (`mouseenter`/`mouseleave`) and\n * keyboard focus (`focusin`/`focusout`)\n * - Animation state machine: `entering → visible → exiting → exited`\n * - Exposes `onClose` imperative trigger via render-prop for close icon/action\n * - Merges base `className` with animation-state-dependent classes via\n * the optional `getAnimationClassName` prop\n *\n * No React Aria hook covers Snackbar; ARIA live region patterns follow the\n * ARIA authoring practices specification for status/alert regions.\n *\n * @example\n * ```tsx\n * // With render-prop children (typical usage from styled layer)\n * <SnackbarHeadless\n * message=\"Saved\"\n * duration={3000}\n * onClose={dismiss}\n * className={baseClasses}\n * getAnimationClassName={(state) => snackbarAnimationVariants({ animationState: state })}\n * >\n * {({ onClose }) => (\n * <>\n * <span>Saved</span>\n * <button onClick={onClose}>Dismiss</button>\n * </>\n * )}\n * </SnackbarHeadless>\n * ```\n */\nexport const SnackbarHeadless = forwardRef<HTMLDivElement, SnackbarHeadlessProps>(\n function SnackbarHeadless(\n {\n message,\n supportingText,\n action,\n showClose,\n duration = 4000,\n severity = \"default\",\n position = \"bottom-center\",\n onClose,\n children,\n className,\n getAnimationClassName,\n },\n ref\n ) {\n const [animationState, setAnimationState] = useState<SnackbarAnimationState>(\"entering\");\n\n // Tracks how many ms remain when the timer is paused\n const remainingRef = useRef<number>(duration);\n // Tracks wall-clock time when the current timer segment started\n const startedAtRef = useRef<number>(Date.now());\n // Active auto-dismiss setTimeout handle (separate from exit fallback)\n const dismissTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n // Fallback timer for exit animation (fires onClose if onTransitionEnd doesn't)\n const exitFallbackRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n // Whether the timer is currently paused (hover / focus)\n const pausedRef = useRef<boolean>(false);\n // Guard against calling onClose multiple times\n const closedRef = useRef<boolean>(false);\n\n const clearDismissTimer = useCallback(() => {\n if (dismissTimerRef.current !== null) {\n clearTimeout(dismissTimerRef.current);\n dismissTimerRef.current = null;\n }\n }, []);\n\n const triggerExit = useCallback(() => {\n if (closedRef.current) return;\n clearDismissTimer(); // stop auto-dismiss timer\n setAnimationState(\"exiting\");\n // Fallback: if onTransitionEnd does not fire (jsdom, reduced-motion,\n // or CSS transitions disabled), ensure onClose is called after the\n // exit animation duration (MD3 short4 = 200ms + small buffer).\n exitFallbackRef.current = setTimeout(() => {\n if (!closedRef.current) {\n closedRef.current = true;\n setAnimationState(\"exited\");\n onClose?.();\n }\n }, 250);\n }, [clearDismissTimer, onClose]);\n\n const startDismissTimer = useCallback(\n (ms: number) => {\n if (ms <= 0) return;\n clearDismissTimer();\n startedAtRef.current = Date.now();\n dismissTimerRef.current = setTimeout(triggerExit, ms);\n },\n [clearDismissTimer, triggerExit]\n );\n\n // Entry animation: double requestAnimationFrame guarantees the browser\n // completes at least one full paint cycle with the component in its\n // \"entering\" state (scale-75 + opacity-0) before we transition to\n // \"visible\" (scale-100 + opacity-100). A single setTimeout(0) is not\n // reliable — browsers may batch the renders and never paint the initial\n // state, preventing the CSS zoom-in transition from firing entirely.\n // With fake timers (vi.useFakeTimers), rAF is faked as setTimeout(~16ms),\n // so advancing by 32ms in tests fires both frames correctly.\n useEffect(() => {\n let frameId: number;\n frameId = requestAnimationFrame(() => {\n frameId = requestAnimationFrame(() => {\n setAnimationState(\"visible\");\n });\n });\n return () => cancelAnimationFrame(frameId);\n }, []);\n\n // Start auto-dismiss timer once the component is in `visible` state.\n useEffect(() => {\n if (animationState !== \"visible\") return;\n if (duration <= 0) return;\n\n remainingRef.current = duration;\n startDismissTimer(duration);\n\n // Only clear the dismiss timer on cleanup (not the exit fallback)\n return clearDismissTimer;\n }, [animationState, duration, startDismissTimer, clearDismissTimer]);\n\n // Cleanup all timers on unmount\n useEffect(\n () => () => {\n clearDismissTimer();\n if (exitFallbackRef.current !== null) {\n clearTimeout(exitFallbackRef.current);\n exitFallbackRef.current = null;\n }\n },\n [clearDismissTimer]\n );\n\n // When the exit CSS transition completes, advance to `exited` and fire onClose.\n // Also cancels the fallback timer since the transition fired properly.\n const handleTransitionEnd = useCallback(() => {\n if (animationState === \"exiting\" && !closedRef.current) {\n if (exitFallbackRef.current !== null) {\n clearTimeout(exitFallbackRef.current);\n exitFallbackRef.current = null;\n }\n closedRef.current = true;\n setAnimationState(\"exited\");\n onClose?.();\n }\n }, [animationState, onClose]);\n\n // Pause timer on pointer hover ─────────────────────────────────────────────\n\n const handleMouseEnter = useCallback(() => {\n if (pausedRef.current || animationState !== \"visible\") return;\n pausedRef.current = true;\n const elapsed = Date.now() - startedAtRef.current;\n remainingRef.current = Math.max(remainingRef.current - elapsed, 0);\n clearDismissTimer();\n }, [animationState, clearDismissTimer]);\n\n const handleMouseLeave = useCallback(() => {\n if (!pausedRef.current || animationState !== \"visible\") return;\n pausedRef.current = false;\n if (duration > 0) startDismissTimer(remainingRef.current);\n }, [animationState, duration, startDismissTimer]);\n\n // Pause timer on keyboard focus ────────────────────────────────────────────\n\n const handleFocusIn = useCallback(() => {\n if (pausedRef.current || animationState !== \"visible\") return;\n pausedRef.current = true;\n const elapsed = Date.now() - startedAtRef.current;\n remainingRef.current = Math.max(remainingRef.current - elapsed, 0);\n clearDismissTimer();\n }, [animationState, clearDismissTimer]);\n\n const handleFocusOut = useCallback(() => {\n if (!pausedRef.current || animationState !== \"visible\") return;\n pausedRef.current = false;\n if (duration > 0) startDismissTimer(remainingRef.current);\n }, [animationState, duration, startDismissTimer]);\n\n // Imperative close (close icon pressed, action button, programmatic close)\n const handleClose = useCallback(() => {\n triggerExit();\n }, [triggerExit]);\n\n // ARIA live region attributes per MD3 / ARIA authoring practices spec\n const ariaProps =\n severity === \"error\"\n ? ({ role: \"alert\", \"aria-live\": \"assertive\", \"aria-atomic\": \"true\" } as const)\n : ({ role: \"status\", \"aria-live\": \"polite\", \"aria-atomic\": \"true\" } as const);\n\n // Merge base className with animation-state and position-dependent classes\n const computedClassName = cn(className, getAnimationClassName?.(animationState, position));\n\n // Resolve children — render-prop or static ReactNode\n const childContent =\n typeof children === \"function\"\n ? children({ animationState, onClose: handleClose })\n : (children ?? (\n <>\n <span>{message}</span>\n {supportingText && <span>{supportingText}</span>}\n {action && (\n <button type=\"button\" onClick={action.onAction}>\n {action.label}\n </button>\n )}\n {showClose && (\n <button type=\"button\" aria-label=\"Close\" onClick={handleClose}>\n ✕\n </button>\n )}\n </>\n ));\n\n return (\n // eslint-disable-next-line jsx-a11y/no-static-element-interactions\n <div\n ref={ref}\n className={computedClassName}\n {...ariaProps}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n onFocus={handleFocusIn}\n onBlur={handleFocusOut}\n onTransitionEnd={handleTransitionEnd}\n data-animation-state={animationState}\n >\n {childContent}\n </div>\n );\n }\n);\n\nSnackbarHeadless.displayName = \"SnackbarHeadless\";\n\nexport type { SnackbarAnimationState };\n","import { cva, type VariantProps } from \"class-variance-authority\";\n\n/**\n * Material Design 3 Snackbar Variants (CVA)\n *\n * Type-safe variant management using Tailwind CSS classes mapped to MD3 tokens.\n *\n * MD3 Specifications:\n * - Surface color: inverse-surface\n * - Text color: inverse-on-surface\n * - Shape: extra-small (4dp) → rounded-xs\n * - Elevation: level-3 → shadow-elevation-3\n * - Min width: 288dp → min-w-72\n * - Max width: 568dp → max-w-snackbar-max\n * - Default position: fixed bottom-4, horizontally centered\n * - Message text: body-medium\n * - Action text: label-large, inverse-primary color\n * - Entry motion: medium1 (250ms) + ease-emphasized-decelerate (zoom in)\n * - Exit motion: short4 (200ms) + ease-standard-accelerate (fade out)\n */\n\n// ─── Stack container (fixed viewport anchor, per-position group) ──────────────\n\n/**\n * Outer wrapper rendered once per active position group by `SnackbarProvider`.\n * Handles the fixed viewport positioning and stacking direction for all\n * snackbars sharing the same `position` value.\n *\n * - Bottom positions use `flex-col-reverse` so the newest snackbar sits at\n * the bottom edge and older ones push upward.\n * - Top positions use `flex-col` so the newest sits at the top edge and\n * older ones push downward.\n * - `pointer-events-none` on the container lets clicks pass through the gaps\n * between snackbars; each snackbar restores `pointer-events-auto`.\n */\nexport const snackbarStackContainerVariants = cva(\n [\"fixed\", \"z-50\", \"flex\", \"gap-2\", \"pointer-events-none\"],\n {\n variants: {\n position: {\n \"bottom-center\": [\n \"bottom-4\",\n \"left-1/2\",\n \"-translate-x-1/2\",\n \"flex-col-reverse\",\n \"items-center\",\n ],\n \"bottom-left\": [\"bottom-4\", \"left-4\", \"flex-col-reverse\", \"items-start\"],\n \"bottom-right\": [\"bottom-4\", \"right-4\", \"flex-col-reverse\", \"items-end\"],\n \"top-center\": [\"top-4\", \"left-1/2\", \"-translate-x-1/2\", \"flex-col\", \"items-center\"],\n \"top-left\": [\"top-4\", \"left-4\", \"flex-col\", \"items-start\"],\n \"top-right\": [\"top-4\", \"right-4\", \"flex-col\", \"items-end\"],\n },\n },\n defaultVariants: { position: \"bottom-center\" },\n }\n);\n\nexport type SnackbarStackContainerVariants = VariantProps<typeof snackbarStackContainerVariants>;\n\n// ─── Base container (surface, shape, layout — no positioning) ─────────────────\n\n/**\n * Snackbar base container variants — structural, surface, and layout classes.\n * Positioning is handled by the stack container (`snackbarStackContainerVariants`)\n * so individual snackbars only carry surface/shape/layout concerns.\n */\nexport const snackbarBaseVariants = cva(\n [\n // Sizing (MD3 spec: 288dp min, 568dp max)\n \"min-w-72\",\n \"max-w-snackbar-max\",\n \"w-max\",\n \"min-h-12\",\n\n // Restore pointer events so hover/focus timer pause works\n \"pointer-events-auto\",\n\n // Surface\n \"bg-inverse-surface\",\n\n // Shape: MD3 extra-small corner = 4dp\n \"rounded-xs\",\n\n // Elevation level 3\n \"shadow-elevation-3\",\n\n // Layout\n \"flex\",\n \"items-center\",\n \"gap-x-1\",\n \"pl-4 pr-2\",\n\n // Typography\n \"text-body-medium\",\n \"text-inverse-on-surface\",\n\n // Transition (properties used by both entry and exit)\n \"transition-[opacity,transform]\",\n \"will-change-[opacity,transform]\",\n ],\n {\n variants: {\n /**\n * Whether the Snackbar has supporting text (two-line layout).\n * Adjusts vertical padding to MD3 spec for two-line configuration.\n */\n twoLine: {\n true: \"py-1\",\n false: \"py-1\",\n },\n },\n defaultVariants: {\n twoLine: false,\n },\n }\n);\n\nexport type SnackbarBaseVariants = VariantProps<typeof snackbarBaseVariants>;\n\n// ─── Position variants ────────────────────────────────────────────────────────\n\n/**\n * Snackbar screen position variants.\n *\n * These classes are now applied to the **stack container** rather than\n * individual snackbars. Kept as a separate export so standalone (non-provider)\n * usage of `SnackbarHeadless` can still apply position classes directly.\n *\n * MD3 default is `bottom-center`.\n */\nexport const snackbarPositionVariants = cva(\"\", {\n variants: {\n position: {\n \"bottom-center\": [\"bottom-4\", \"left-1/2\", \"-translate-x-1/2\"],\n \"bottom-left\": [\"bottom-4\", \"left-4\"],\n \"bottom-right\": [\"bottom-4\", \"right-4\"],\n \"top-center\": [\"top-4\", \"left-1/2\", \"-translate-x-1/2\"],\n \"top-left\": [\"top-4\", \"left-4\"],\n \"top-right\": [\"top-4\", \"right-4\"],\n },\n },\n defaultVariants: {\n position: \"bottom-center\",\n },\n});\n\nexport type SnackbarPositionVariants = VariantProps<typeof snackbarPositionVariants>;\n\n// ─── Animation state classes ──────────────────────────────────────────────────\n\n/**\n * Snackbar animation state variants.\n * Applied by `SnackbarHeadless` based on its internal animation state machine.\n *\n * The `enterDirection` sets the transform-origin for the scale animation so the\n * snackbar appears to grow from the correct viewport edge:\n * - `up` (bottom positions): `origin-bottom` — scales up from the bottom edge\n * - `down` (top positions): `origin-top` — scales up from the top edge\n *\n * MD3 motion spec (Emphasized easing set — appropriate for high-attention UI entries):\n * - `entering`: initial mount state — scaled down (75%) + transparent (no duration)\n * - `visible`: scale-100 + opacity-100 (medium1 / emphasized-decelerate = 250ms) — zoom in\n * - `exiting`: scale-75 + opacity-0 (short4 / standard-accelerate = 200ms) — zoom out\n * - `exited`: fully transparent (removed from DOM by provider)\n *\n * `ease-emphasized-decelerate` (cubic-bezier(0.05, 0.7, 0.1, 1)) is used for entry\n * instead of `ease-standard-decelerate` (cubic-bezier(0, 0, 0, 1)) because the\n * standard-decelerate curve has an infinite initial velocity — it snaps to ~50%\n * progress in the first few milliseconds, making the zoom feel abrupt. The\n * emphasized-decelerate curve has a finite (but high) initial velocity that\n * produces a visible, smooth movement from scale-75 to scale-100.\n */\nexport const snackbarAnimationVariants = cva(\"\", {\n variants: {\n animationState: {\n entering: [\"opacity-0\", \"scale-75\"],\n visible: [\"scale-100\", \"opacity-100\", \"duration-medium1\", \"ease-emphasized-decelerate\"],\n exiting: [\"scale-75\", \"opacity-0\", \"duration-short4\", \"ease-standard-accelerate\"],\n exited: [\"scale-75\", \"opacity-0\", \"duration-short4\", \"ease-standard-accelerate\"],\n },\n enterDirection: {\n up: [\"origin-bottom\"],\n down: [\"origin-top\"],\n },\n },\n defaultVariants: {\n animationState: \"entering\",\n enterDirection: \"up\",\n },\n});\n\nexport type SnackbarAnimationVariants = VariantProps<typeof snackbarAnimationVariants>;\n\n/**\n * Combined container variants (base + position + animation) for convenience.\n * The headless layer uses `snackbarAnimationVariants` directly; this export\n * is kept for consumers who want the full combined class string without the\n * render-prop pattern (e.g. standalone headless usage outside the provider).\n */\nexport const snackbarContainerVariants = cva([...snackbarBaseVariants()], {\n variants: {\n animationState: {\n entering: [\"opacity-0\", \"scale-75\"],\n visible: [\"scale-100\", \"opacity-100\", \"duration-medium1\", \"ease-emphasized-decelerate\"],\n exiting: [\"scale-75\", \"opacity-0\", \"duration-short4\", \"ease-standard-accelerate\"],\n exited: [\"scale-75\", \"opacity-0\", \"duration-short4\", \"ease-standard-accelerate\"],\n },\n enterDirection: {\n up: [\"origin-bottom\"],\n down: [\"origin-top\"],\n },\n position: {\n \"bottom-center\": [\"bottom-4\", \"left-1/2\", \"-translate-x-1/2\"],\n \"bottom-left\": [\"bottom-4\", \"left-4\"],\n \"bottom-right\": [\"bottom-4\", \"right-4\"],\n \"top-center\": [\"top-4\", \"left-1/2\", \"-translate-x-1/2\"],\n \"top-left\": [\"top-4\", \"left-4\"],\n \"top-right\": [\"top-4\", \"right-4\"],\n },\n twoLine: {\n true: \"py-1\",\n false: \"py-1\",\n },\n },\n defaultVariants: {\n animationState: \"entering\",\n enterDirection: \"up\",\n position: \"bottom-center\",\n twoLine: false,\n },\n});\n\nexport type SnackbarContainerVariants = VariantProps<typeof snackbarContainerVariants>;\n\n// ─── Message ─────────────────────────────────────────────────────────────────\n\n/**\n * Message text variants.\n * MD3: body-medium, inverse-on-surface color.\n */\nexport const snackbarMessageVariants = cva([\n \"flex-1\",\n \"text-body-medium\",\n \"text-inverse-on-surface\",\n]);\n\n// ─── Supporting text ─────────────────────────────────────────────────────────\n\n/**\n * Supporting text variants (two-line configuration).\n * Same color role as message text per MD3 spec.\n */\nexport const snackbarSupportingTextVariants = cva([\n \"text-body-medium\",\n \"text-inverse-on-surface\",\n \"opacity-80\",\n]);\n\n// ─── Action button wrapper ────────────────────────────────────────────────────\n\n/**\n * Wrapper applied around the action `Button` to override its color to\n * `inverse-primary` as required by MD3 Snackbar spec.\n */\nexport const snackbarActionVariants = cva([\"shrink-0\", \"text-inverse-primary\"]);\n\n// ─── Close icon button wrapper ────────────────────────────────────────────────\n\n/**\n * Wrapper applied around the close `IconButton` to use `inverse-on-surface`\n * as required by MD3 Snackbar spec.\n */\nexport const snackbarCloseVariants = cva([\"shrink-0\", \"text-inverse-on-surface\"]);\n\n// ─── Text+action layout ───────────────────────────────────────────────────────\n\n/**\n * Inner content column (message + optional supporting text).\n */\nexport const snackbarContentVariants = cva([\"flex\", \"flex-col\", \"flex-1\", \"min-w-0 py-2 pr-2\"]);\n\n// ─── Initial hidden state ─────────────────────────────────────────────────────\n\n/**\n * Classes applied before the enter animation begins (component just mounted).\n * Scaled down and transparent — the zoom-in entry starts from this state.\n */\nexport const snackbarInitialVariants = cva([\"scale-75\", \"opacity-0\"]);\n\n// ─── Position → direction helper ─────────────────────────────────────────────\n\n/**\n * Derives the enter animation direction from the Snackbar position.\n * Bottom positions slide up; top positions slide down.\n */\nexport function getEnterDirection(position: string): \"up\" | \"down\" {\n return position.startsWith(\"top\") ? \"down\" : \"up\";\n}\n","\"use client\";\n\nimport { forwardRef } from \"react\";\nimport { Button } from \"../Button\";\nimport { IconButton } from \"../IconButton\";\nimport { cn } from \"../../utils/cn\";\nimport { SnackbarHeadless } from \"./SnackbarHeadless\";\nimport {\n snackbarAnimationVariants,\n snackbarBaseVariants,\n snackbarContentVariants,\n snackbarMessageVariants,\n snackbarSupportingTextVariants,\n snackbarActionVariants,\n snackbarCloseVariants,\n getEnterDirection,\n} from \"./Snackbar.variants\";\nimport type { SnackbarAnimationState } from \"./SnackbarHeadless\";\nimport type { SnackbarPosition, SnackbarProps } from \"./Snackbar.types\";\n\n/**\n * Close icon SVG (24dp, MD3 standard close symbol).\n * Inline to avoid any icon library dependency.\n */\nfunction CloseIcon(): JSX.Element {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\" />\n </svg>\n );\n}\n\n/**\n * `Snackbar` — Layer 3 MD3 Styled Component.\n *\n * Renders one of four MD3 Snackbar content configurations:\n * 1. Single-line message only\n * 2. Two-line message + `supportingText`\n * 3. Single-line with text `action` button (styled `Button variant=\"text\"` with\n * `inverse-primary` color per MD3 spec)\n * 4. Single-line with close icon (or combined with action)\n *\n * Uses `SnackbarHeadless` for all behavioral concerns (ARIA live region,\n * auto-dismiss timer with pause/resume, animation state machine) and CVA\n * variants for MD3-compliant visual styling.\n *\n * For typical app usage, render inside `SnackbarProvider` and trigger via\n * the `useSnackbar` hook. For declarative/test usage, it can be rendered\n * standalone.\n *\n * @example\n * ```tsx\n * // Imperative via hook (typical)\n * const { showSnackbar } = useSnackbar();\n * showSnackbar({ message: \"File deleted\", action: { label: \"Undo\", onAction: handleUndo } });\n *\n * // Declarative standalone\n * <SnackbarProvider>\n * <Snackbar message=\"Saved\" severity=\"default\" showClose onClose={() => {}} />\n * </SnackbarProvider>\n * ```\n */\nexport const Snackbar = forwardRef<HTMLDivElement, SnackbarProps>(function Snackbar(\n {\n message,\n supportingText,\n action,\n showClose = false,\n duration = 4000,\n severity = \"default\",\n position = \"bottom-center\",\n onClose,\n className,\n },\n ref\n) {\n const isTwoLine = Boolean(supportingText);\n\n // Base structural classes only — positioning is handled by the stack container\n // in SnackbarProvider. pointer-events-auto is included in snackbarBaseVariants.\n const baseClassName = cn(snackbarBaseVariants({ twoLine: isTwoLine }), className);\n\n return (\n <SnackbarHeadless\n ref={ref}\n message={message}\n {...(supportingText !== undefined && { supportingText })}\n {...(action !== undefined && { action })}\n showClose={showClose}\n duration={duration}\n severity={severity}\n position={position}\n {...(onClose !== undefined && { onClose })}\n className={baseClassName}\n getAnimationClassName={(state: SnackbarAnimationState, pos: SnackbarPosition) =>\n snackbarAnimationVariants({ animationState: state, enterDirection: getEnterDirection(pos) })\n }\n >\n {({ onClose: triggerClose }) => (\n <>\n {/* Content column: message + optional supporting text */}\n <div className={snackbarContentVariants()}>\n <span className={snackbarMessageVariants()}>{message}</span>\n {supportingText && (\n <span className={snackbarSupportingTextVariants()}>{supportingText}</span>\n )}\n </div>\n\n {/* Action button — MD3: text variant with inverse-primary color */}\n {action && (\n <span className={snackbarActionVariants()}>\n <Button\n variant=\"text\"\n onPress={action.onAction}\n className=\"text-inverse-primary hover:text-inverse-primary px-3\"\n >\n {action.label}\n </Button>\n </span>\n )}\n\n {/* Close icon button — MD3: standard icon button with inverse-on-surface */}\n {showClose && (\n <span className={snackbarCloseVariants()}>\n <IconButton\n variant=\"standard\"\n aria-label=\"Close\"\n onPress={triggerClose}\n className=\"text-inverse-on-surface hover:text-inverse-on-surface\"\n >\n <CloseIcon />\n </IconButton>\n </span>\n )}\n </>\n )}\n </SnackbarHeadless>\n );\n});\n\nSnackbar.displayName = \"Snackbar\";\n","\"use client\";\n\nimport {\n createContext,\n useCallback,\n useContext,\n useId,\n useMemo,\n useRef,\n useState,\n type JSX,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { Snackbar } from \"./Snackbar\";\nimport { snackbarStackContainerVariants } from \"./Snackbar.variants\";\nimport type {\n SnackbarContextValue,\n SnackbarItem,\n SnackbarPosition,\n SnackbarProps,\n SnackbarProviderProps,\n} from \"./Snackbar.types\";\n\n// ─── Context ─────────────────────────────────────────────────────────────────\n\n/**\n * React context for the Snackbar queue.\n * Consumed via the `useSnackbar` hook.\n */\nexport const SnackbarContext = createContext<SnackbarContextValue | null>(null);\n\n// ─── Hook ────────────────────────────────────────────────────────────────────\n\n/**\n * `useSnackbar` — imperative API for triggering Snackbars.\n *\n * Must be called inside a component that is a descendant of `SnackbarProvider`.\n * Throws a descriptive error in development if used outside the provider.\n *\n * @example\n * ```tsx\n * const { showSnackbar } = useSnackbar();\n *\n * // Single-line\n * showSnackbar({ message: \"File deleted\" });\n *\n * // With action\n * showSnackbar({\n * message: \"File deleted\",\n * action: { label: \"Undo\", onAction: () => handleUndo() },\n * });\n *\n * // Error severity (assertive announcement)\n * showSnackbar({ message: \"Upload failed\", severity: \"error\" });\n * ```\n */\nexport function useSnackbar(): SnackbarContextValue {\n const ctx = useContext(SnackbarContext);\n if (!ctx) {\n throw new Error(\n \"[Snackbar] useSnackbar must be used inside <SnackbarProvider>. \" +\n \"Wrap your application (or Storybook decorator) with <SnackbarProvider>.\"\n );\n }\n return ctx;\n}\n\n// ─── Provider ────────────────────────────────────────────────────────────────\n\n/**\n * `SnackbarProvider` — context provider, queue manager, and portal host.\n *\n * Wrap your application (or Storybook preview) with this component to enable\n * the Snackbar stack and portal rendering.\n *\n * - Multiple `showSnackbar` calls are displayed simultaneously in a vertical\n * stack, grouped by their `position` prop.\n * - Each position group is rendered in its own fixed container via `createPortal`\n * into `document.body`.\n * - Bottom positions stack upward (newest at bottom); top positions stack\n * downward (newest at top).\n * - The `maxVisible` prop caps how many snackbars can be visible at once per\n * position group. Snackbars beyond the cap are queued and shown as existing\n * ones are dismissed.\n *\n * @example\n * ```tsx\n * // Application root\n * <SnackbarProvider>\n * <App />\n * </SnackbarProvider>\n *\n * // With custom cap (default is 5)\n * <SnackbarProvider maxVisible={3}>\n * <App />\n * </SnackbarProvider>\n *\n * // Storybook preview.tsx decorator\n * export const decorators = [\n * (Story) => (\n * <SnackbarProvider>\n * <Story />\n * </SnackbarProvider>\n * ),\n * ];\n * ```\n */\nexport function SnackbarProvider({ children, maxVisible = 5 }: SnackbarProviderProps): JSX.Element {\n const [queue, setQueue] = useState<SnackbarItem[]>([]);\n const counterRef = useRef<number>(0);\n const baseId = useId();\n\n /**\n * Enqueue a new Snackbar. Returns the assigned id.\n * The snackbar is immediately visible if the position group has fewer than\n * `maxVisible` items currently displayed.\n */\n const showSnackbar = useCallback(\n (options: SnackbarProps): string => {\n const id = `${baseId}-snackbar-${++counterRef.current}`;\n setQueue((prev) => [...prev, { ...options, id }]);\n return id;\n },\n [baseId]\n );\n\n /**\n * Imperatively dismiss the oldest snackbar across all position groups.\n * The snackbar's own exit animation plays before it is removed.\n */\n const closeSnackbar = useCallback(() => {\n setQueue((prev) => {\n if (prev.length === 0) return prev;\n return prev.slice(1);\n });\n }, []);\n\n /**\n * Removes a specific snackbar by id after its exit animation completes.\n */\n const removeById = useCallback((id: string) => {\n setQueue((prev) => prev.filter((item) => item.id !== id));\n }, []);\n\n const contextValue: SnackbarContextValue = { showSnackbar, closeSnackbar };\n\n // Group visible queue items by position, respecting maxVisible per group.\n const positionGroups = useMemo(() => {\n const groups = new Map<SnackbarPosition, SnackbarItem[]>();\n const countByPosition = new Map<SnackbarPosition, number>();\n\n for (const item of queue) {\n const pos: SnackbarPosition = item.position ?? \"bottom-center\";\n const count = countByPosition.get(pos) ?? 0;\n if (count < maxVisible) {\n const existing = groups.get(pos) ?? [];\n groups.set(pos, [...existing, item]);\n countByPosition.set(pos, count + 1);\n }\n }\n\n return groups;\n }, [queue, maxVisible]);\n\n return (\n <SnackbarContext.Provider value={contextValue}>\n {children}\n {typeof document !== \"undefined\" &&\n createPortal(\n <>\n {Array.from(positionGroups.entries()).map(([position, items]) => (\n <div key={position} className={snackbarStackContainerVariants({ position })}>\n {items.map((item) => (\n <Snackbar\n key={item.id}\n message={item.message}\n {...(item.supportingText !== undefined && {\n supportingText: item.supportingText,\n })}\n {...(item.action !== undefined && { action: item.action })}\n {...(item.showClose !== undefined && { showClose: item.showClose })}\n {...(item.duration !== undefined && { duration: item.duration })}\n {...(item.severity !== undefined && { severity: item.severity })}\n {...(item.position !== undefined && { position: item.position })}\n {...(item.className !== undefined && { className: item.className })}\n onClose={() => {\n item.onClose?.();\n removeById(item.id);\n }}\n />\n ))}\n </div>\n ))}\n </>,\n document.body\n )}\n </SnackbarContext.Provider>\n );\n}\n","\"use client\";\n\nimport { forwardRef, useRef } from \"react\";\nimport { useButton, useToggleButton } from \"react-aria\";\nimport { mergeProps } from \"@react-aria/utils\";\nimport { useToggleState } from \"react-stately\";\nimport type { ChipHeadlessProps } from \"./Chip.types\";\n\n// ---------------------------------------------------------------------------\n// Internal sub-implementations\n//\n// Each chip type has distinct React Aria hook requirements. Hooks cannot be\n// called conditionally, so we use separate forwardRef components per type and\n// select the correct one in the public ChipHeadless switcher below.\n// ---------------------------------------------------------------------------\n\n/**\n * Assist chip implementation — uses `useButton` (Enter/Space → onPress).\n */\nconst AssistChipImpl = forwardRef<HTMLButtonElement, ChipHeadlessProps>(\n ({ label, onPress, isDisabled, className, onMouseDown, children }, forwardedRef) => {\n const internalRef = useRef<HTMLButtonElement>(null);\n const ref = (forwardedRef ?? internalRef) as React.RefObject<HTMLButtonElement>;\n\n const { buttonProps } = useButton(\n {\n ...(onPress !== undefined && { onPress }),\n ...(isDisabled !== undefined && { isDisabled }),\n },\n ref\n );\n\n const mergedProps = mergeProps(buttonProps, { onMouseDown });\n\n return (\n <button {...mergedProps} type=\"button\" ref={ref} className={className}>\n {children ?? label}\n </button>\n );\n }\n);\nAssistChipImpl.displayName = \"AssistChipImpl\";\n\n/**\n * Filter chip implementation — uses `useToggleButton` + `useToggleState`.\n * Provides `aria-pressed` for toggle semantics.\n */\nconst FilterChipImpl = forwardRef<HTMLButtonElement, ChipHeadlessProps>(\n (\n {\n label,\n selected,\n defaultSelected,\n onSelectionChange,\n isDisabled,\n className,\n onMouseDown,\n children,\n },\n forwardedRef\n ) => {\n const internalRef = useRef<HTMLButtonElement>(null);\n const ref = (forwardedRef ?? internalRef) as React.RefObject<HTMLButtonElement>;\n\n const toggleProps = {\n ...(selected !== undefined && { isSelected: selected }),\n ...(defaultSelected !== undefined && { defaultSelected }),\n ...(onSelectionChange !== undefined && { onChange: onSelectionChange }),\n ...(isDisabled !== undefined && { isDisabled }),\n };\n\n const state = useToggleState(toggleProps);\n const { buttonProps } = useToggleButton(toggleProps, state, ref);\n\n const mergedProps = mergeProps(buttonProps, { onMouseDown });\n\n return (\n <button {...mergedProps} type=\"button\" ref={ref} className={className}>\n {children ?? label}\n </button>\n );\n }\n);\nFilterChipImpl.displayName = \"FilterChipImpl\";\n\n/**\n * Input chip implementation — chip body uses `useButton` with Backspace/Delete\n * handling for keyboard removal. The remove button is a separate `useButton`\n * instance inside the same layout wrapper.\n *\n * The forwarded ref attaches to the chip body button (the primary interactive\n * element), not the outer `<span>` wrapper.\n */\nconst InputChipImpl = forwardRef<HTMLButtonElement, ChipHeadlessProps>(\n (\n {\n label,\n onRemove,\n isDisabled,\n className,\n onMouseDown,\n removeIcon,\n removeButtonClassName,\n children,\n },\n forwardedRef\n ) => {\n const chipRef = useRef<HTMLButtonElement>(null);\n const ref = (forwardedRef ?? chipRef) as React.RefObject<HTMLButtonElement>;\n const removeRef = useRef<HTMLButtonElement>(null);\n\n const { buttonProps: chipButtonProps } = useButton(\n {\n \"aria-label\": label,\n ...(isDisabled !== undefined && { isDisabled }),\n },\n ref\n );\n\n const { buttonProps: removeButtonProps } = useButton(\n {\n \"aria-label\": `Remove ${label}`,\n onPress: () => onRemove?.(),\n ...(isDisabled !== undefined && { isDisabled }),\n },\n removeRef\n );\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLButtonElement>): void => {\n if (e.key === \"Backspace\" || e.key === \"Delete\") {\n e.preventDefault();\n onRemove?.();\n }\n };\n\n const mergedChipProps = mergeProps(chipButtonProps, { onKeyDown: handleKeyDown, onMouseDown });\n\n return (\n <span className={className}>\n <button {...mergedChipProps} type=\"button\" ref={ref}>\n {children ?? label}\n </button>\n <button\n {...removeButtonProps}\n type=\"button\"\n ref={removeRef}\n className={removeButtonClassName}\n >\n {removeIcon}\n </button>\n </span>\n );\n }\n);\nInputChipImpl.displayName = \"InputChipImpl\";\n\n/**\n * Suggestion chip implementation — uses `useButton` (identical to Assist).\n */\nconst SuggestionChipImpl = forwardRef<HTMLButtonElement, ChipHeadlessProps>(\n ({ label, onPress, isDisabled, className, onMouseDown, children }, forwardedRef) => {\n const internalRef = useRef<HTMLButtonElement>(null);\n const ref = (forwardedRef ?? internalRef) as React.RefObject<HTMLButtonElement>;\n\n const { buttonProps } = useButton(\n {\n ...(onPress !== undefined && { onPress }),\n ...(isDisabled !== undefined && { isDisabled }),\n },\n ref\n );\n\n const mergedProps = mergeProps(buttonProps, { onMouseDown });\n\n return (\n <button {...mergedProps} type=\"button\" ref={ref} className={className}>\n {children ?? label}\n </button>\n );\n }\n);\nSuggestionChipImpl.displayName = \"SuggestionChipImpl\";\n\n// ---------------------------------------------------------------------------\n// Public component\n// ---------------------------------------------------------------------------\n\n/**\n * Headless Chip Component (Layer 2)\n *\n * Unstyled chip primitive covering all four MD3 chip types. Delegates to the\n * correct React Aria hook per `type` — bring your own styles.\n *\n * | type | Hook | Key behaviour |\n * |------------- |-----------------------------------------|----------------------------------|\n * | `assist` | `useButton` | Enter/Space → `onPress` |\n * | `filter` | `useToggleButton` + `useToggleState` | Toggle `aria-pressed` |\n * | `input` | `useButton` + remove `useButton` | Backspace/Delete → `onRemove` |\n * | `suggestion` | `useButton` | Enter/Space → `onPress` |\n *\n * @example\n * ```tsx\n * // Assist\n * <ChipHeadless type=\"assist\" label=\"Set alarm\" onPress={handlePress} />\n *\n * // Filter (uncontrolled)\n * <ChipHeadless type=\"filter\" label=\"Vegetarian\" onSelectionChange={console.log} />\n *\n * // Input\n * <ChipHeadless type=\"input\" label=\"React\" onRemove={() => remove('React')} />\n *\n * // Suggestion\n * <ChipHeadless type=\"suggestion\" label=\"See photos\" onPress={handlePress} />\n * ```\n */\nexport const ChipHeadless = forwardRef<HTMLButtonElement, ChipHeadlessProps>((props, ref) => {\n switch (props.type) {\n case \"filter\":\n return <FilterChipImpl {...props} ref={ref} />;\n case \"input\":\n return <InputChipImpl {...props} ref={ref} />;\n case \"suggestion\":\n return <SuggestionChipImpl {...props} ref={ref} />;\n default:\n return <AssistChipImpl {...props} ref={ref} />;\n }\n});\n\nChipHeadless.displayName = \"ChipHeadless\";\n","import { cva, type VariantProps } from \"class-variance-authority\";\n\n/**\n * Material Design 3 Chip Variants (CVA)\n *\n * Covers all four chip types (assist, filter, input, suggestion) with\n * surface, selection, disabled, and padding variants.\n *\n * Padding resolution (via tailwind-merge in `cn()`):\n * base `px-4` → hasLeadingIcon overrides with `pl-3 pr-4`\n * → hasRemoveButton overrides with `pl-3 pr-3`\n * Both can be combined and the last-applied wins through tailwind-merge.\n */\nexport const chipVariants = cva(\n [\n // Base layout — always applied\n \"relative inline-flex items-center overflow-hidden rounded-sm h-8\",\n \"text-label-large cursor-pointer gap-1 group px-4\",\n // Focus ring\n \"focus-visible:outline-primary focus-visible:outline-2 focus-visible:outline-offset-2\",\n ],\n {\n variants: {\n /**\n * MD3 chip type — determines interaction model and default styling.\n */\n chipType: {\n assist: \"\",\n // Filter and Input chips have a fixed tonal surface style.\n // The transition is on the base class so deselection also animates\n // (adding it only in the selected compound variant would mean the\n // transition property disappears at the same moment the color reverts,\n // causing an instant jump back to the unselected color).\n filter:\n \"bg-surface-container-low text-on-surface border border-outline transition-[background-color,color] duration-short4 ease-standard\",\n input: \"bg-surface-container-low text-on-surface border border-outline\",\n suggestion: \"\",\n },\n\n /**\n * Surface style for Assist and Suggestion chips only.\n * Applied via compound variants so it has no effect on Filter/Input.\n */\n surface: {\n tonal: \"\",\n elevated: \"\",\n },\n\n /**\n * Selected state — only meaningful for Filter chips.\n * Applied via compound variant.\n */\n selected: {\n true: \"\",\n false: \"\",\n },\n\n /**\n * MD3 disabled state: content 38% opacity, border 12% opacity, no background.\n * Kept here only for `pointer-events-none`; color/bg overrides live in the\n * disabled compound variants at the bottom so they win over surface compounds.\n */\n isDisabled: {\n true: \"pointer-events-none\",\n false: \"\",\n },\n\n /**\n * Adjusts leading padding when a leading icon is present.\n * Overrides the base `px-4` → `pl-3 pr-4`.\n */\n hasLeadingIcon: {\n true: \"pl-3 pr-4\",\n false: \"\",\n },\n\n /**\n * Adjusts trailing padding for Input chips with a remove button.\n * Takes precedence over hasLeadingIcon via tailwind-merge: `pl-3 pr-3`.\n */\n hasRemoveButton: {\n true: \"pl-3 pr-3\",\n false: \"\",\n },\n },\n\n compoundVariants: [\n // ── Assist chip surfaces ───────────────────────────────────────────────\n {\n chipType: \"assist\",\n surface: \"tonal\",\n className: \"bg-surface-container-low text-on-surface border border-outline\",\n },\n {\n chipType: \"assist\",\n surface: \"elevated\",\n className: [\n \"bg-surface-container-low text-on-surface shadow-elevation-1\",\n \"hover:shadow-elevation-2 transition-shadow duration-short2 ease-standard\",\n ],\n },\n\n // ── Suggestion chip surfaces ───────────────────────────────────────────\n {\n chipType: \"suggestion\",\n surface: \"tonal\",\n className: \"bg-surface-container-low text-on-surface border border-outline\",\n },\n {\n chipType: \"suggestion\",\n surface: \"elevated\",\n className: [\n \"bg-surface-container-low text-on-surface shadow-elevation-1\",\n \"hover:shadow-elevation-2 transition-shadow duration-short2 ease-standard\",\n ],\n },\n\n // ── Filter chip selected state ─────────────────────────────────────────\n {\n chipType: \"filter\",\n selected: true,\n className: \"bg-secondary-container text-on-secondary-container border-0\",\n },\n\n // ── Disabled overrides — placed last so they always win ────────────────\n // These must follow all surface/selection compound variants to ensure\n // tailwind-merge keeps the disabled classes over any surface classes.\n {\n isDisabled: true,\n className: \"text-on-surface/38 border-on-surface/12 bg-transparent\",\n },\n ],\n\n defaultVariants: {\n chipType: \"assist\",\n surface: \"tonal\",\n selected: false,\n isDisabled: false,\n hasLeadingIcon: false,\n hasRemoveButton: false,\n },\n }\n);\n\n/**\n * Extract variant prop types from CVA\n */\nexport type ChipVariants = VariantProps<typeof chipVariants>;\n","\"use client\";\n\nimport { forwardRef, useState, useCallback } from \"react\";\nimport type React from \"react\";\nimport { ChipHeadless } from \"./ChipHeadless\";\nimport { chipVariants } from \"./Chip.variants\";\nimport { cn } from \"../../utils/cn\";\nimport { useRipple } from \"../../hooks/useRipple\";\nimport type { ChipProps } from \"./Chip.types\";\n\n// ---------------------------------------------------------------------------\n// Internal icon primitives\n// ---------------------------------------------------------------------------\n\n/**\n * MD3 close/remove icon (18 × 18 dp)\n */\nconst CloseIcon = (): React.ReactElement => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\" />\n </svg>\n);\n\n/**\n * MD3 check icon for filter chip selected state (18 × 18 dp)\n */\nconst CheckIcon = (): React.ReactElement => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path d=\"M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z\" />\n </svg>\n);\n\n// ---------------------------------------------------------------------------\n// State layer — shared across all chip types\n// ---------------------------------------------------------------------------\n\nconst StateLayer = (): React.ReactElement => (\n <span\n aria-hidden=\"true\"\n className={cn(\n \"bg-on-surface pointer-events-none absolute inset-0 rounded-sm opacity-0\",\n \"duration-spring-standard-fast-effects ease-spring-standard-fast-effects transition-opacity\",\n \"group-focus-within:opacity-12 group-hover:opacity-8 group-active:opacity-12\"\n )}\n />\n);\n\n// ---------------------------------------------------------------------------\n// Public Chip component (Layer 3: Styled)\n// ---------------------------------------------------------------------------\n\n/**\n * Material Design 3 Chip Component (Layer 3: Styled)\n *\n * Unified styled chip covering all four MD3 chip types.\n * Built on `ChipHeadless` for world-class accessibility via React Aria.\n * Uses CVA for type-safe variant management.\n *\n * | Type | Surface | Selection | Remove |\n * |--------------|---------------|-----------|--------|\n * | `assist` | tonal/elevated | — | — |\n * | `filter` | fixed tonal | ✅ | — |\n * | `input` | fixed tonal | — | ✅ |\n * | `suggestion` | tonal/elevated | — | — |\n *\n * @example\n * ```tsx\n * // Assist chip\n * <Chip type=\"assist\" label=\"Set alarm\" onPress={handlePress} />\n *\n * // Elevated assist chip\n * <Chip type=\"assist\" surface=\"elevated\" label=\"Set alarm\" />\n *\n * // Filter chip (controlled)\n * <Chip type=\"filter\" label=\"Vegetarian\" selected={isVeg} onSelectionChange={setVeg} />\n *\n * // Input chip with leading icon\n * <Chip type=\"input\" label=\"React\" leadingIcon={<ReactIcon />} onRemove={() => remove('React')} />\n *\n * // Suggestion chip\n * <Chip type=\"suggestion\" label=\"See photos\" onPress={handlePress} />\n * ```\n */\nexport const Chip = forwardRef<HTMLButtonElement, ChipProps>(\n (\n {\n type,\n label,\n surface = \"tonal\",\n selected,\n defaultSelected,\n onSelectionChange,\n onPress,\n onRemove,\n leadingIcon,\n trailingIcon,\n isDisabled = false,\n className,\n },\n ref\n ) => {\n // ── Filter chip selected state management ────────────────────────────────\n // We mirror the toggle state here so the checkmark can react to it.\n // The headless layer is always driven as controlled from this component.\n const [localSelected, setLocalSelected] = useState(defaultSelected ?? false);\n const isControlled = selected !== undefined;\n const effectiveSelected = type === \"filter\" ? (isControlled ? selected : localSelected) : false;\n\n const handleSelectionChange = useCallback(\n (newSelected: boolean) => {\n if (!isControlled) {\n setLocalSelected(newSelected);\n }\n onSelectionChange?.(newSelected);\n },\n [isControlled, onSelectionChange]\n );\n\n // ── Ripple ───────────────────────────────────────────────────────────────\n const { onMouseDown: handleRipple, ripples } = useRipple({ disabled: isDisabled });\n\n // ── Derived flags ────────────────────────────────────────────────────────\n const hasLeadingIcon = Boolean(leadingIcon);\n\n // ── Input chip: removal animation ────────────────────────────────────────\n const [isRemoving, setIsRemoving] = useState(false);\n\n const handleRemove = useCallback(() => {\n setIsRemoving(true);\n }, []);\n\n const handleAnimationEnd = useCallback(() => {\n if (isRemoving) {\n onRemove?.();\n }\n }, [isRemoving, onRemove]);\n\n // ── Shared chip variant classes ──────────────────────────────────────────\n const chipClass = (): string =>\n cn(\n chipVariants({\n chipType: type,\n surface: type === \"assist\" || type === \"suggestion\" ? surface : undefined,\n selected: type === \"filter\" ? effectiveSelected : undefined,\n isDisabled,\n hasLeadingIcon,\n hasRemoveButton: false,\n }),\n className\n );\n\n // ── Input chip ───────────────────────────────────────────────────────────\n // Renders a wrapper <span> as the chip root to:\n // 1. Apply chip styles and the removal animation class\n // 2. Host the ripple container (triggered from onMouseDown on the span)\n // 3. Listen for animationend before calling the real onRemove callback\n // The inner <ChipHeadless className=\"contents\"> uses CSS display:contents\n // so the two buttons become direct flex children of the wrapper span.\n if (type === \"input\") {\n return (\n <span\n className={cn(\n chipVariants({\n chipType: \"input\",\n isDisabled,\n hasLeadingIcon,\n hasRemoveButton: true,\n }),\n isRemoving && \"animate-md-fade-out\",\n className\n )}\n onAnimationEnd={handleAnimationEnd}\n >\n {ripples}\n <StateLayer />\n <ChipHeadless\n type=\"input\"\n label={label}\n isDisabled={isDisabled}\n onRemove={handleRemove}\n onMouseDown={handleRipple}\n removeIcon={<CloseIcon />}\n removeButtonClassName=\"relative z-10 inline-flex size-4.5 shrink-0 items-center text-on-surface-variant\"\n ref={ref}\n className=\"contents\"\n >\n {leadingIcon && (\n <span\n aria-hidden=\"true\"\n className=\"relative z-10 inline-flex size-4.5 shrink-0 items-center\"\n >\n {leadingIcon}\n </span>\n )}\n <span className=\"relative z-10\">{label}</span>\n </ChipHeadless>\n </span>\n );\n }\n\n // ── Assist / Filter / Suggestion chips ───────────────────────────────────\n return (\n <ChipHeadless\n ref={ref}\n type={type}\n label={label}\n {...(type === \"filter\" && {\n selected: effectiveSelected,\n onSelectionChange: handleSelectionChange,\n })}\n {...(type !== \"filter\" && onPress !== undefined && { onPress })}\n isDisabled={isDisabled}\n onMouseDown={handleRipple}\n className={chipClass()}\n >\n {ripples}\n <StateLayer />\n\n {/* Filter chip checkmark — slides in/out on selection change */}\n {type === \"filter\" && (\n <span\n className={cn(\n \"duration-short4 ease-emphasized-decelerate inline-flex overflow-hidden transition-[width,opacity]\",\n effectiveSelected ? \"w-4.5 opacity-100\" : \"w-0 opacity-0\"\n )}\n >\n <CheckIcon />\n </span>\n )}\n\n {/* Leading icon */}\n {leadingIcon && (\n <span\n aria-hidden=\"true\"\n className=\"relative z-10 inline-flex size-4.5 shrink-0 items-center\"\n >\n {leadingIcon}\n </span>\n )}\n\n {/* Label */}\n <span className=\"relative z-10\">{label}</span>\n\n {/* Trailing icon (Assist / Suggestion only) */}\n {trailingIcon && (\n <span\n aria-hidden=\"true\"\n className=\"relative z-10 inline-flex size-4.5 shrink-0 items-center\"\n >\n {trailingIcon}\n </span>\n )}\n </ChipHeadless>\n );\n }\n);\n\nChip.displayName = \"Chip\";\n","import { forwardRef } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport type { ChipSetProps } from \"./Chip.types\";\n\n/**\n * Material Design 3 ChipSet Container\n *\n * A layout wrapper that arranges chips in a flowing flex row with\n * consistent 8dp gap. Renders as a `<div>` — no additional ARIA semantics\n * are required per MD3 spec (the individual chips carry their own roles).\n *\n * @example\n * ```tsx\n * <ChipSet>\n * <Chip type=\"filter\" label=\"React\" />\n * <Chip type=\"filter\" label=\"TypeScript\" />\n * <Chip type=\"filter\" label=\"Tailwind\" />\n * </ChipSet>\n * ```\n */\nexport const ChipSet = forwardRef<HTMLDivElement, ChipSetProps>(({ className, children }, ref) => (\n <div ref={ref} className={cn(\"flex flex-wrap gap-2\", className)}>\n {children}\n </div>\n));\n\nChipSet.displayName = \"ChipSet\";\n","\"use client\";\n\nimport {\n createContext,\n forwardRef,\n useCallback,\n useContext,\n useEffect,\n useId,\n useRef,\n useState,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport type React from \"react\";\nimport { useDialog, useOverlay, usePreventScroll, FocusScope } from \"react-aria\";\nimport { useOverlayTriggerState } from \"react-stately\";\nimport { mergeProps } from \"@react-aria/utils\";\nimport { cn } from \"../../utils/cn\";\nimport type {\n DialogAnimationState,\n DialogContextValue,\n DialogHeadlessProps,\n DialogVariant,\n} from \"./Dialog.types\";\n\n// ─── Context ──────────────────────────────────────────────────────────────────\n\n/**\n * Context shared between `DialogHeadless` and slot sub-components\n * (`DialogHeadline`, `DialogContent`, `DialogActions`).\n *\n * Provides stable IDs for aria-labelledby / aria-describedby wiring,\n * the close callback, and the active variant.\n *\n * @internal\n */\nexport const DialogContext = createContext<DialogContextValue | null>(null);\n\n/**\n * Hook to consume `DialogContext` inside dialog slot sub-components.\n * Throws a descriptive error if used outside a `DialogHeadless` tree.\n *\n * @internal\n */\nexport function useDialogContext(): DialogContextValue {\n const ctx = useContext(DialogContext);\n if (ctx === null) {\n throw new Error(\n \"[Dialog] DialogHeadline, DialogContent, and DialogActions must be rendered \" +\n \"inside a <Dialog> or <DialogHeadless> component.\"\n );\n }\n return ctx;\n}\n\n// ─── DialogPanel (internal) ───────────────────────────────────────────────────\n\n/**\n * Inner dialog panel — wires React Aria hooks (`useDialog`, `useOverlay`,\n * `usePreventScroll`) and renders the accessible dialog element with the\n * centering wrapper.\n *\n * DOM structure:\n * ```\n * <div> (centering / positioning wrapper, z-50)\n * <div role=\"dialog\" aria-modal> (panel — className, animation, data attrs)\n * {children}\n * </div>\n * </div>\n * ```\n *\n * This allows `screen.getByRole(\"dialog\")` to directly return the panel\n * (with `data-animation-state` and `data-variant` for test assertions).\n *\n * @internal\n */\ninterface DialogPanelProps {\n ariaLabel: string | undefined;\n headlineId: string;\n contentId: string;\n onClose: () => void;\n onTransitionEnd: () => void;\n variant: DialogVariant;\n isDismissable: boolean;\n wrapperClassName: string;\n className: string | undefined;\n animationState: DialogAnimationState;\n getAnimationClassName: ((state: DialogAnimationState) => string) | undefined;\n children: React.ReactNode;\n}\n\nconst DialogPanel = ({\n ariaLabel,\n headlineId,\n contentId,\n onClose,\n onTransitionEnd,\n variant,\n isDismissable,\n wrapperClassName,\n className,\n animationState,\n getAnimationClassName,\n children,\n}: DialogPanelProps): React.ReactElement => {\n const panelRef = useRef<HTMLDivElement>(null);\n\n // Lock body scroll while dialog is open\n usePreventScroll();\n\n // useDialog: applies role=\"dialog\", aria-modal=\"true\", aria-labelledby, aria-describedby\n const { dialogProps } = useDialog(\n {\n ...(ariaLabel ? { \"aria-label\": ariaLabel } : {}),\n \"aria-labelledby\": headlineId,\n \"aria-describedby\": contentId,\n },\n panelRef\n );\n\n // useOverlay: handles Escape key dismissal and outside-click dismissal\n const { overlayProps } = useOverlay(\n {\n isOpen: true,\n onClose,\n isDismissable,\n shouldCloseOnBlur: false,\n },\n panelRef\n );\n\n // Merge animation classes onto the panel element\n const panelClassName = cn(className, getAnimationClassName?.(animationState));\n\n return (\n // Centering/positioning wrapper — structural only, no ARIA role\n <div className={wrapperClassName}>\n {/* Panel: semantic dialog element with React Aria hooks, animation, data attrs */}\n <div\n {...mergeProps(overlayProps, dialogProps)}\n ref={panelRef}\n aria-modal=\"true\"\n className={panelClassName}\n data-animation-state={animationState}\n data-variant={variant}\n onTransitionEnd={onTransitionEnd}\n >\n {children}\n </div>\n </div>\n );\n};\n\nDialogPanel.displayName = \"DialogPanel\";\n\n// ─── DialogHeadless ───────────────────────────────────────────────────────────\n\n/**\n * `DialogHeadless` — Layer 2 headless primitive.\n *\n * Provides all MD3 Dialog behavior and ARIA semantics without any visual styling:\n *\n * - **Portal rendering**: dialog and scrim render in `document.body` via\n * `createPortal` to avoid stacking context issues.\n * - **Open/close state**: via `useOverlayTriggerState` (supports controlled\n * `open` + `onOpenChange` and uncontrolled `defaultOpen`).\n * - **Scroll lock**: `usePreventScroll` locks body scroll while open.\n * - **Focus trap**: `FocusScope` with `contain`, `restoreFocus`, `autoFocus`.\n * - **Dismiss behavior**: `useOverlay` handles Escape key and outside click.\n * Basic variant is dismissable (Escape + outside click);\n * Full-screen variant is Escape-dismissable only (no scrim click) per MD3 spec.\n * - **Animation state machine**: `entering → visible → exiting → exited`\n * mirrors the Snackbar animation pattern.\n * - **ARIA wiring**: `DialogContext` provides stable IDs for `aria-labelledby`\n * and `aria-describedby`, consumed by slot sub-components.\n *\n * React Aria hooks used:\n * - `useDialog` — `role=\"dialog\"`, `aria-modal`, `aria-labelledby`, `aria-describedby`\n * - `useOverlay` — Escape key + outside-click dismissal\n * - `usePreventScroll` — body scroll lock\n * - `FocusScope` — focus trap + restoreFocus on close\n * - `useOverlayTriggerState` — open/close state management\n *\n * @example\n * ```tsx\n * // Controlled basic dialog\n * <DialogHeadless\n * variant=\"basic\"\n * open={open}\n * onOpenChange={setOpen}\n * className={cn(dialogWrapperVariants({ variant: 'basic' }), dialogPanelVariants({ variant: 'basic' }))}\n * scrimClassName={dialogScrimVariants()}\n * getAnimationClassName={(state) =>\n * dialogAnimationVariants({ animationState: state, variant: 'basic' })\n * }\n * >\n * <DialogHeadline>Confirm?</DialogHeadline>\n * <DialogContent>This action cannot be undone.</DialogContent>\n * <DialogActions>\n * <Button variant=\"text\" onPress={() => setOpen(false)}>Cancel</Button>\n * <Button variant=\"filled\" onPress={handleDelete}>Delete</Button>\n * </DialogActions>\n * </DialogHeadless>\n * ```\n */\nexport const DialogHeadless = forwardRef<HTMLDivElement, DialogHeadlessProps>(\n function DialogHeadless(\n {\n variant = \"basic\",\n open,\n defaultOpen = false,\n onOpenChange,\n \"aria-label\": ariaLabel,\n children,\n className,\n scrimClassName,\n getAnimationClassName,\n },\n _ref\n ) {\n // ── Open/close state ─────────────────────────────────────────────────────\n\n const state = useOverlayTriggerState({\n ...(open !== undefined ? { isOpen: open } : {}),\n ...(defaultOpen !== undefined ? { defaultOpen } : {}),\n ...(onOpenChange !== undefined ? { onOpenChange } : {}),\n });\n\n const isOpen = state.isOpen;\n\n const close = useCallback(() => {\n state.close();\n }, [state]);\n\n // ── Animation state machine ───────────────────────────────────────────────\n\n const [animationState, setAnimationState] = useState<DialogAnimationState>(\"exited\");\n // Guard against calling state updates after unmount / multiple times\n const closedRef = useRef<boolean>(false);\n // Fallback timer for exit animation in case onTransitionEnd doesn't fire\n const exitFallbackRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n // When isOpen becomes true → start entry animation cycle\n useEffect(() => {\n if (!isOpen) return;\n\n closedRef.current = false;\n setAnimationState(\"entering\");\n\n // Zero-delay timer ensures \"entering\" state is rendered (allowing CSS\n // transition initial values) before transitioning to \"visible\".\n const id = setTimeout(() => {\n setAnimationState(\"visible\");\n }, 0);\n\n return () => clearTimeout(id);\n }, [isOpen]);\n\n // When isOpen becomes false while visible → start exit animation cycle\n useEffect(() => {\n if (isOpen) return;\n if (animationState === \"exited\" || animationState === \"entering\") return;\n\n if (animationState === \"visible\") {\n setAnimationState(\"exiting\");\n\n // Fallback: advance to exited if CSS transition doesn't fire\n exitFallbackRef.current = setTimeout(() => {\n if (!closedRef.current) {\n closedRef.current = true;\n setAnimationState(\"exited\");\n }\n }, 150);\n }\n }, [isOpen, animationState]);\n\n // Cleanup on unmount\n useEffect(\n () => () => {\n if (exitFallbackRef.current !== null) {\n clearTimeout(exitFallbackRef.current);\n }\n },\n []\n );\n\n const handleTransitionEnd = useCallback(() => {\n if (animationState === \"exiting\" && !closedRef.current) {\n if (exitFallbackRef.current !== null) {\n clearTimeout(exitFallbackRef.current);\n exitFallbackRef.current = null;\n }\n closedRef.current = true;\n setAnimationState(\"exited\");\n }\n }, [animationState]);\n\n // ── ARIA ID coordination ──────────────────────────────────────────────────\n\n const baseId = useId();\n const headlineId = `${baseId}-dialog-headline`;\n const contentId = `${baseId}-dialog-content`;\n\n const contextValue: DialogContextValue = {\n headlineId,\n contentId,\n close,\n variant,\n };\n\n // ── Scrim dismissal ───────────────────────────────────────────────────────\n\n // Basic variant: scrim click closes dialog. Full-screen: scrim is inert.\n const handleScrimClick = useCallback(() => {\n if (variant === \"basic\") {\n close();\n }\n }, [variant, close]);\n\n // ── Portal gate ───────────────────────────────────────────────────────────\n\n // Do not render portal until open, and remove once animation is fully exited\n if (!isOpen && animationState === \"exited\") {\n return null;\n }\n\n // ── Portal content ────────────────────────────────────────────────────────\n\n const content = (\n <DialogContext.Provider value={contextValue}>\n {/* Scrim overlay — click closes for basic, inert for fullscreen */}\n <div\n data-testid=\"dialog-scrim\"\n className={scrimClassName}\n onClick={handleScrimClick}\n aria-hidden=\"true\"\n />\n\n {/* FocusScope: traps focus, restores focus to trigger on close, auto-focuses first element */}\n <FocusScope contain restoreFocus autoFocus>\n <DialogPanel\n ariaLabel={ariaLabel}\n headlineId={headlineId}\n contentId={contentId}\n onClose={close}\n onTransitionEnd={handleTransitionEnd}\n variant={variant}\n isDismissable={variant === \"basic\"}\n wrapperClassName={\n variant === \"basic\"\n ? \"fixed inset-0 z-50 flex items-center justify-center px-4\"\n : \"fixed inset-0 z-50\"\n }\n className={className}\n animationState={animationState}\n getAnimationClassName={getAnimationClassName}\n >\n {children}\n </DialogPanel>\n </FocusScope>\n </DialogContext.Provider>\n );\n\n if (typeof document === \"undefined\") return null;\n\n return createPortal(content, document.body) as React.ReactElement;\n }\n);\n\nDialogHeadless.displayName = \"DialogHeadless\";\n","import { cva, type VariantProps } from \"class-variance-authority\";\n\n/**\n * Material Design 3 Dialog Variants (CVA)\n *\n * Type-safe variant management using Tailwind CSS classes mapped to MD3 tokens.\n *\n * MD3 Specifications:\n * - Basic surface: surface-container-high\n * - Elevation: level-3 → shadow-elevation-3\n * - Shape (Basic): extra-large (28dp) → rounded-xl\n * - Min width (Basic): 280dp → min-w-70\n * - Max width (Basic): 560dp → max-w-dialog\n * - Scrim: bg-scrim at opacity-32\n * - Headline: text-headline-small, text-on-surface\n * - Body: text-body-medium, text-on-surface-variant\n * - Action row: right-aligned, gap-2\n * - Entry motion (Basic): scale + fade, medium4 (400ms) + ease-emphasized-decelerate\n * - Exit motion (Basic): fade, short2 (100ms) + ease-emphasized-accelerate\n * - Entry motion (Fullscreen): slide-up, medium4 (400ms) + ease-emphasized-decelerate\n * - Exit motion (Fullscreen): slide-down, short2 (100ms) + ease-emphasized-accelerate\n */\n\n// ─── Scrim overlay ─────────────────────────────────────────────────────────────\n\n/**\n * Scrim overlay variants — matches MD3 spec and Drawer scrim pattern.\n * Full-screen variant uses the same scrim but onClick is a no-op.\n */\nexport const dialogScrimVariants = cva([\n \"fixed\",\n \"inset-0\",\n \"z-40\",\n \"bg-scrim\",\n \"opacity-32\",\n \"transition-opacity\",\n \"duration-medium2\",\n \"ease-standard\",\n]);\n\nexport type DialogScrimVariants = VariantProps<typeof dialogScrimVariants>;\n\n// ─── Panel container ────────────────────────────────────────────────────────────\n\n/**\n * Dialog panel container variants.\n *\n * - `basic`: floating card with rounded corners, elevation, max-width constraint.\n * - `fullscreen`: full viewport coverage, no corners, no max-width.\n *\n * Positioned and centered by the portal wrapper; `z-50` sits above the scrim.\n */\nexport const dialogPanelVariants = cva(\n [\n // Stacking above scrim\n \"z-50\",\n\n // Surface\n \"bg-surface-container-high\",\n\n // Flex column layout for slots\n \"flex\",\n \"flex-col\",\n\n // Transition for animation state changes\n \"transition-[opacity,transform]\",\n \"will-change-[opacity,transform]\",\n ],\n {\n variants: {\n variant: {\n basic: [\n // Shape: MD3 extra-large = 28dp\n \"rounded-xl\",\n // Elevation level 3\n \"shadow-elevation-3\",\n // Width constraints per MD3 spec (280dp min, 560dp max)\n \"min-w-70\",\n \"max-w-dialog-max\",\n \"w-full\",\n // Internal spacing\n \"pt-6\",\n \"pb-3\",\n \"px-6\",\n // Positioned in viewport center\n \"relative\",\n ],\n fullscreen: [\n // Full viewport\n \"w-full\",\n \"h-full\",\n // No rounded corners on fullscreen\n \"rounded-none\",\n // No elevation shadow on fullscreen\n \"shadow-none\",\n // Positioned to fill portal\n \"relative\",\n ],\n },\n },\n defaultVariants: {\n variant: \"basic\",\n },\n }\n);\n\nexport type DialogPanelVariants = VariantProps<typeof dialogPanelVariants>;\n\n// ─── Portal wrapper ─────────────────────────────────────────────────────────────\n\n/**\n * Wrapper that centers the basic dialog in the viewport.\n * Not applied to the fullscreen variant (which fills the viewport directly).\n */\nexport const dialogWrapperVariants = cva([], {\n variants: {\n variant: {\n basic: [\"fixed\", \"inset-0\", \"z-50\", \"flex\", \"items-center\", \"justify-center\", \"px-4\"],\n fullscreen: [\"fixed\", \"inset-0\", \"z-50\"],\n },\n },\n defaultVariants: {\n variant: \"basic\",\n },\n});\n\nexport type DialogWrapperVariants = VariantProps<typeof dialogWrapperVariants>;\n\n// ─── Animation state classes ────────────────────────────────────────────────────\n\n/**\n * Animation state variants — applied by `DialogHeadless` based on its\n * internal animation state machine. Variant-specific to match MD3 motion spec:\n *\n * Basic: scale + fade (entry) / fade (exit)\n * Fullscreen: slide-up (entry) / slide-down (exit)\n */\nexport const dialogAnimationVariants = cva(\"\", {\n variants: {\n animationState: {\n entering: [],\n visible: [],\n exiting: [],\n exited: [],\n },\n variant: {\n basic: [],\n fullscreen: [],\n },\n },\n compoundVariants: [\n // Basic: entering — start scaled down + transparent\n {\n animationState: \"entering\",\n variant: \"basic\",\n className: [\"scale-90\", \"opacity-0\"],\n },\n // Basic: visible — scale to full + fade in\n {\n animationState: \"visible\",\n variant: \"basic\",\n className: [\"scale-100\", \"opacity-100\", \"duration-medium4\", \"ease-emphasized-decelerate\"],\n },\n // Basic: exiting — fade out (scale stays at 1)\n {\n animationState: \"exiting\",\n variant: \"basic\",\n className: [\"scale-100\", \"opacity-0\", \"duration-short2\", \"ease-emphasized-accelerate\"],\n },\n // Basic: exited — fully transparent\n {\n animationState: \"exited\",\n variant: \"basic\",\n className: [\"scale-100\", \"opacity-0\"],\n },\n // Fullscreen: entering — start below viewport + transparent\n {\n animationState: \"entering\",\n variant: \"fullscreen\",\n className: [\"translate-y-full\", \"opacity-0\"],\n },\n // Fullscreen: visible — slide up + fade in\n {\n animationState: \"visible\",\n variant: \"fullscreen\",\n className: [\"translate-y-0\", \"opacity-100\", \"duration-medium4\", \"ease-emphasized-decelerate\"],\n },\n // Fullscreen: exiting — slide down + fade out\n {\n animationState: \"exiting\",\n variant: \"fullscreen\",\n className: [\"translate-y-full\", \"opacity-0\", \"duration-short2\", \"ease-emphasized-accelerate\"],\n },\n // Fullscreen: exited — fully off-screen\n {\n animationState: \"exited\",\n variant: \"fullscreen\",\n className: [\"translate-y-full\", \"opacity-0\"],\n },\n ],\n defaultVariants: {\n animationState: \"entering\",\n variant: \"basic\",\n },\n});\n\nexport type DialogAnimationVariants = VariantProps<typeof dialogAnimationVariants>;\n\n// ─── DialogHeadline ─────────────────────────────────────────────────────────────\n\n/**\n * Headline element variants.\n * MD3: text-headline-small, text-on-surface.\n */\nexport const dialogHeadlineVariants = cva([\"text-headline-small\", \"text-on-surface\"], {\n variants: {\n variant: {\n basic: [\"mb-4\"],\n fullscreen: [\n // Top app bar row in fullscreen: flex, items-center, gap\n \"flex\",\n \"items-center\",\n \"gap-4\",\n \"px-4\",\n \"h-14\",\n \"shrink-0\",\n \"border-b\",\n \"border-outline-variant\",\n ],\n },\n },\n defaultVariants: {\n variant: \"basic\",\n },\n});\n\nexport type DialogHeadlineVariants = VariantProps<typeof dialogHeadlineVariants>;\n\n/**\n * Headline text inside the fullscreen top app bar row.\n */\nexport const dialogHeadlineTitleVariants = cva([\n \"flex-1\",\n \"text-headline-small\",\n \"text-on-surface\",\n \"truncate\",\n]);\n\n// ─── DialogContent ──────────────────────────────────────────────────────────────\n\n/**\n * Scrollable body content variants.\n * MD3: text-body-medium, text-on-surface-variant, scrollable.\n */\nexport const dialogContentVariants = cva(\n [\"text-body-medium\", \"text-on-surface-variant\", \"overflow-y-auto\", \"flex-1\"],\n {\n variants: {\n variant: {\n basic: [\"mb-6\"],\n fullscreen: [\"px-6\", \"py-4\"],\n },\n },\n defaultVariants: {\n variant: \"basic\",\n },\n }\n);\n\nexport type DialogContentVariants = VariantProps<typeof dialogContentVariants>;\n\n// ─── DialogActions ──────────────────────────────────────────────────────────────\n\n/**\n * Action button row variants.\n * MD3: right-aligned flex row with gap-2, padding-top per spec.\n */\nexport const dialogActionsVariants = cva([\n \"flex\",\n \"items-center\",\n \"justify-end\",\n \"gap-2\",\n \"pt-3\",\n \"shrink-0\",\n]);\n\nexport type DialogActionsVariants = VariantProps<typeof dialogActionsVariants>;\n","\"use client\";\n\nimport { forwardRef } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { DialogHeadless } from \"./DialogHeadless\";\nimport {\n dialogPanelVariants,\n dialogScrimVariants,\n dialogAnimationVariants,\n} from \"./Dialog.variants\";\nimport type { DialogAnimationState } from \"./Dialog.types\";\nimport type { DialogProps } from \"./Dialog.types\";\n\n/**\n * `Dialog` — Layer 3 MD3 Styled Dialog Component.\n *\n * Supports two structural variants per MD3 spec, with a composable slot-based\n * API via `DialogHeadline`, `DialogContent`, and `DialogActions`:\n *\n * **Basic** (default):\n * - Floating card: `bg-surface-container-high`, `rounded-xl`, `shadow-elevation-3`\n * - Centered in viewport (min 280dp, max 560dp width)\n * - Scale + fade entry animation (`duration-medium4 / ease-emphasized-decelerate`)\n * - Fade exit animation (`duration-short2 / ease-emphasized-accelerate`)\n * - Closes on scrim click or Escape key\n *\n * **Full-screen**:\n * - Full viewport coverage — suited for mobile and complex forms\n * - No rounded corners, no elevation shadow\n * - Slide-up entry / slide-down exit animation\n * - Does NOT close on scrim click per MD3 spec (only via Escape or close button)\n * - Headline replaced by top app bar row (close icon + confirm action)\n *\n * Both variants:\n * - `role=\"dialog\"` + `aria-modal=\"true\"` (React Aria `useDialog`)\n * - `aria-labelledby` pointing to `DialogHeadline` id\n * - `aria-describedby` pointing to `DialogContent` id\n * - Focus trap active while open (`FocusScope`)\n * - Focus returns to trigger element on close (`FocusScope restoreFocus`)\n * - Body scroll locked while open (`usePreventScroll`)\n * - Escape key always closes the dialog\n * - Portal rendered to `document.body`\n *\n * @example\n * ```tsx\n * // Basic dialog — controlled\n * function DeleteDialog() {\n * const [open, setOpen] = useState(false);\n *\n * return (\n * <>\n * <Button onPress={() => setOpen(true)}>Delete file</Button>\n * <Dialog open={open} onOpenChange={setOpen}>\n * <DialogHeadline>Permanently delete?</DialogHeadline>\n * <DialogContent>\n * This action cannot be undone. The file and all associated data\n * will be permanently removed.\n * </DialogContent>\n * <DialogActions>\n * <Button variant=\"text\" onPress={() => setOpen(false)}>Cancel</Button>\n * <Button variant=\"filled\" onPress={handleDelete}>Delete</Button>\n * </DialogActions>\n * </Dialog>\n * </>\n * );\n * }\n *\n * // Full-screen dialog — mobile form flow\n * function NewEventDialog() {\n * const [open, setOpen] = useState(false);\n *\n * return (\n * <>\n * <Button onPress={() => setOpen(true)}>New event</Button>\n * <Dialog variant=\"fullscreen\" open={open} onOpenChange={setOpen}>\n * <DialogHeadline\n * closeButton={\n * <IconButton aria-label=\"Close\" onPress={() => setOpen(false)}>\n * <CloseIcon />\n * </IconButton>\n * }\n * confirmButton={\n * <Button variant=\"text\" onPress={handleSave}>Save</Button>\n * }\n * >\n * New event\n * </DialogHeadline>\n * <DialogContent>\n * <TextField label=\"Event name\" />\n * <TextField label=\"Date\" type=\"date\" />\n * </DialogContent>\n * </Dialog>\n * </>\n * );\n * }\n * ```\n *\n * @see https://m3.material.io/components/dialogs/overview\n * @see https://m3.material.io/components/dialogs/specs\n */\nexport const Dialog = forwardRef<HTMLDivElement, DialogProps>(function Dialog(\n {\n variant = \"basic\",\n open,\n defaultOpen = false,\n onOpenChange,\n \"aria-label\": ariaLabel,\n children,\n className,\n },\n _ref\n) {\n // Build panel class: structural + visual styles from CVA\n const panelClassName = cn(dialogPanelVariants({ variant }), className);\n\n // Scrim class shared between variants\n const scrimClass = dialogScrimVariants();\n\n return (\n <DialogHeadless\n variant={variant}\n {...(open !== undefined ? { open } : {})}\n {...(defaultOpen !== undefined ? { defaultOpen } : {})}\n {...(onOpenChange !== undefined ? { onOpenChange } : {})}\n {...(ariaLabel ? { \"aria-label\": ariaLabel } : {})}\n className={panelClassName}\n scrimClassName={scrimClass}\n getAnimationClassName={(state: DialogAnimationState) =>\n dialogAnimationVariants({ animationState: state, variant })\n }\n >\n {children}\n </DialogHeadless>\n );\n});\n\nDialog.displayName = \"Dialog\";\n","\"use client\";\n\nimport { forwardRef } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { useDialogContext } from \"./DialogHeadless\";\nimport { dialogHeadlineVariants, dialogHeadlineTitleVariants } from \"./Dialog.variants\";\nimport type { DialogHeadlineProps } from \"./Dialog.types\";\n\n/**\n * `DialogHeadline` — Headline slot sub-component (Layer 3).\n *\n * Renders as an `<h2>` element and registers its `id` with the parent\n * `DialogContext` so the dialog panel can wire `aria-labelledby` correctly.\n *\n * For the `fullscreen` variant, the headline renders as a top app bar row\n * containing optional `closeButton` (leading icon button) and `confirmButton`\n * (trailing text action) per MD3 Full-screen Dialog spec.\n *\n * Must be rendered inside a `<Dialog>` or `<DialogHeadless>` component.\n *\n * @example\n * ```tsx\n * // Basic variant\n * <Dialog open onOpenChange={setOpen}>\n * <DialogHeadline>Delete file?</DialogHeadline>\n * ...\n * </Dialog>\n *\n * // Full-screen variant with app bar controls\n * <Dialog variant=\"fullscreen\" open onOpenChange={setOpen}>\n * <DialogHeadline\n * closeButton={\n * <IconButton aria-label=\"Close\" onPress={() => setOpen(false)}>\n * <CloseIcon />\n * </IconButton>\n * }\n * confirmButton={\n * <Button variant=\"text\" onPress={handleSave}>Save</Button>\n * }\n * >\n * New event\n * </DialogHeadline>\n * ...\n * </Dialog>\n * ```\n */\nexport const DialogHeadline = forwardRef<HTMLHeadingElement, DialogHeadlineProps>(\n function DialogHeadline({ children, className, closeButton, confirmButton }, ref) {\n const { headlineId, variant } = useDialogContext();\n\n if (variant === \"fullscreen\") {\n return (\n // Top app bar row for fullscreen variant\n <div className={cn(dialogHeadlineVariants({ variant: \"fullscreen\" }), className)}>\n {/* Leading close icon button */}\n {closeButton}\n\n {/* Headline text — grows to fill available space */}\n <h2 id={headlineId} className={dialogHeadlineTitleVariants()}>\n {children}\n </h2>\n\n {/* Trailing confirm action */}\n {confirmButton}\n </div>\n );\n }\n\n return (\n <h2\n ref={ref}\n id={headlineId}\n className={cn(dialogHeadlineVariants({ variant: \"basic\" }), className)}\n >\n {children}\n </h2>\n );\n }\n);\n\nDialogHeadline.displayName = \"DialogHeadline\";\n","\"use client\";\n\nimport { forwardRef } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { useDialogContext } from \"./DialogHeadless\";\nimport { dialogContentVariants } from \"./Dialog.variants\";\nimport type { DialogContentProps } from \"./Dialog.types\";\n\n/**\n * `DialogContent` — Scrollable body slot sub-component (Layer 3).\n *\n * Renders as a scrollable `<div>` and registers its `id` with the parent\n * `DialogContext` so the dialog panel can wire `aria-describedby` correctly.\n *\n * Styled with `text-body-medium` and `text-on-surface-variant` per MD3 spec.\n * Overflows vertically when content exceeds the available height.\n *\n * Must be rendered inside a `<Dialog>` or `<DialogHeadless>` component.\n *\n * @example\n * ```tsx\n * <Dialog open onOpenChange={setOpen}>\n * <DialogHeadline>Confirm deletion?</DialogHeadline>\n * <DialogContent>\n * <p>\n * This will permanently delete the file and all associated data.\n * This action cannot be undone.\n * </p>\n * </DialogContent>\n * <DialogActions>\n * <Button variant=\"text\" onPress={() => setOpen(false)}>Cancel</Button>\n * <Button variant=\"filled\" onPress={handleDelete}>Delete</Button>\n * </DialogActions>\n * </Dialog>\n * ```\n */\nexport const DialogContent = forwardRef<HTMLDivElement, DialogContentProps>(function DialogContent(\n { children, className },\n ref\n) {\n const { contentId, variant } = useDialogContext();\n\n return (\n <div ref={ref} id={contentId} className={cn(dialogContentVariants({ variant }), className)}>\n {children}\n </div>\n );\n});\n\nDialogContent.displayName = \"DialogContent\";\n","\"use client\";\n\nimport { forwardRef } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { useDialogContext } from \"./DialogHeadless\";\nimport { dialogActionsVariants } from \"./Dialog.variants\";\nimport type { DialogActionsProps } from \"./Dialog.types\";\n\n/**\n * `DialogActions` — Action button row slot sub-component (Layer 3).\n *\n * Renders a right-aligned flex row of action buttons per MD3 spec.\n * Intended to contain `Button` components (typically `variant=\"text\"` for\n * secondary actions and `variant=\"filled\"` for the primary action).\n *\n * Not used in the `fullscreen` variant — the confirm action is placed in the\n * headline top app bar row via `DialogHeadline`'s `confirmButton` slot.\n *\n * Must be rendered inside a `<Dialog>` or `<DialogHeadless>` component.\n *\n * @example\n * ```tsx\n * <Dialog open onOpenChange={setOpen}>\n * <DialogHeadline>Discard changes?</DialogHeadline>\n * <DialogContent>Your unsaved changes will be lost.</DialogContent>\n * <DialogActions>\n * <Button variant=\"text\" onPress={() => setOpen(false)}>Cancel</Button>\n * <Button variant=\"filled\" onPress={handleDiscard}>Discard</Button>\n * </DialogActions>\n * </Dialog>\n * ```\n */\nexport const DialogActions = forwardRef<HTMLDivElement, DialogActionsProps>(function DialogActions(\n { children, className },\n ref\n) {\n // Consume context to validate sub-component is used inside Dialog\n useDialogContext();\n\n return (\n <div ref={ref} className={cn(dialogActionsVariants(), className)}>\n {children}\n </div>\n );\n});\n\nDialogActions.displayName = \"DialogActions\";\n","\"use client\";\n\nimport {\n cloneElement,\n isValidElement,\n useRef,\n type JSX,\n type ReactElement,\n type HTMLAttributes,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { useTooltip, useTooltipTrigger, useOverlayPosition } from \"react-aria\";\nimport { useTooltipTriggerState } from \"react-stately\";\nimport { mergeProps } from \"@react-aria/utils\";\nimport type { AriaTooltipProps } from \"react-aria\";\nimport type { TooltipTriggerProps, TooltipHeadlessProps } from \"./Tooltip.types\";\n\n// ─── TooltipTriggerHeadless ───────────────────────────────────────────────────\n\n/**\n * `TooltipTriggerHeadless` — Layer 2 headless trigger primitive.\n *\n * Manages open/close state and wires all React Aria tooltip hooks:\n *\n * - **State**: `useTooltipTriggerState` — 300ms hover delay, instant focus\n * show, Escape / blur dismiss.\n * - **Wiring**: `useTooltipTrigger` — injects `aria-describedby` on the\n * trigger and provides the tooltip `id`/`role` needed by `useTooltip`.\n * - **Portal**: the tooltip overlay is only mounted while `state.isOpen` is\n * `true`; actual portal rendering happens inside `TooltipOverlayHeadless`.\n *\n * Expects exactly two children:\n * 1. The interactive trigger element (button, anchor, etc.)\n * 2. A `TooltipOverlayHeadless` element — `tooltipProps` and `triggerRef` are\n * injected automatically via `cloneElement`.\n *\n * React Aria hooks used:\n * - `useTooltipTriggerState` — open/close state with delay and warm-up\n * - `useTooltipTrigger` — trigger ARIA wiring and event handlers\n *\n * @example\n * ```tsx\n * <TooltipTriggerHeadless delay={300} onOpenChange={setOpen}>\n * <button>Save</button>\n * <TooltipOverlayHeadless placement=\"top\">Save file</TooltipOverlayHeadless>\n * </TooltipTriggerHeadless>\n * ```\n */\nexport function TooltipTriggerHeadless({\n children,\n delay = 300,\n isDisabled,\n isOpen,\n defaultOpen,\n onOpenChange,\n forceMount = false,\n}: TooltipTriggerProps): JSX.Element {\n const triggerRef = useRef<HTMLElement>(null);\n\n // Manages open/close state with hover delay and instant-focus show.\n const state = useTooltipTriggerState({\n delay,\n ...(isDisabled !== undefined && { isDisabled }),\n ...(isOpen !== undefined && { isOpen }),\n ...(defaultOpen !== undefined && { defaultOpen }),\n ...(onOpenChange !== undefined && { onOpenChange }),\n });\n\n // Wires trigger → tooltip: injects aria-describedby on the trigger and\n // provides the id/role props that useTooltip needs to complete the pairing.\n const { triggerProps, tooltipProps } = useTooltipTrigger(\n {\n delay,\n ...(isDisabled !== undefined && { isDisabled }),\n },\n state,\n triggerRef\n );\n\n const [triggerChild, tooltipChild] = children;\n\n // Inject triggerProps (aria-describedby, event handlers) + ref onto the\n // trigger element. We accept any valid ReactElement as the trigger.\n const trigger = isValidElement(triggerChild)\n ? cloneElement(\n triggerChild as ReactElement<\n HTMLAttributes<HTMLElement> & { ref?: React.Ref<HTMLElement> }\n >,\n {\n ...triggerProps,\n ref: triggerRef as React.Ref<HTMLElement>,\n }\n )\n : triggerChild;\n\n // Inject tooltipProps (id, role) + triggerRef onto the overlay element.\n // forceMount keeps the overlay alive during exit animations without overriding\n // React Aria's isOpen state (which would cause an open/close conflict).\n const overlay =\n (state.isOpen || forceMount) && isValidElement(tooltipChild)\n ? cloneElement(tooltipChild as ReactElement<Partial<TooltipHeadlessProps>>, {\n tooltipProps: tooltipProps as Record<string, unknown>,\n triggerRef,\n })\n : null;\n\n return (\n <>\n {trigger}\n {overlay}\n </>\n );\n}\n\n// ─── TooltipOverlayHeadless ───────────────────────────────────────────────────\n\n/**\n * `TooltipOverlayHeadless` — Layer 2 headless overlay primitive.\n *\n * Handles all tooltip overlay concerns without any visual styling:\n *\n * - **ARIA**: `useTooltip` applies `role=\"tooltip\"` and the stable `id`\n * used by the trigger's `aria-describedby`.\n * - **Positioning**: `useOverlayPosition` computes pixel-precise placement\n * with automatic viewport flip. Positioning values come from the DOM so\n * inline styles are the only viable approach (the one exception to the\n * no-inline-styles rule).\n * - **Portal**: the tooltip is rendered in `document.body` via\n * `ReactDOM.createPortal` so it is never a DOM descendant of the trigger,\n * avoiding stacking-context and overflow issues.\n *\n * `tooltipProps` and `triggerRef` are injected by `TooltipTriggerHeadless`\n * via `cloneElement` — consumers do not need to pass them manually.\n *\n * React Aria hooks used:\n * - `useTooltip` — `role=\"tooltip\"`, stable `id`\n * - `useOverlayPosition` — viewport-aware placement with automatic flip\n *\n * @example\n * ```tsx\n * // Used as the second child of TooltipTriggerHeadless — tooltipProps and\n * // triggerRef are injected automatically.\n * <TooltipOverlayHeadless placement=\"top\" className=\"my-tooltip\">\n * Save file\n * </TooltipOverlayHeadless>\n * ```\n */\nexport function TooltipOverlayHeadless({\n tooltipProps: incomingTooltipProps = {},\n triggerRef,\n placement = \"top\",\n offset = 4,\n className,\n children,\n onPointerEnter,\n onPointerLeave,\n}: TooltipHeadlessProps): JSX.Element | null {\n const overlayRef = useRef<HTMLDivElement>(null);\n\n // useTooltip receives the intermediate props from useTooltipTrigger\n // (carries the stable id for aria-describedby) and returns the final\n // DOM props including role=\"tooltip\".\n const { tooltipProps } = useTooltip(incomingTooltipProps as AriaTooltipProps);\n\n // useOverlayPosition computes pixel-precise coordinates relative to the\n // trigger. DOM measurements require inline styles — this is the one\n // permitted use of inline styles in this codebase.\n const { overlayProps, placement: computedPlacement } = useOverlayPosition({\n targetRef: triggerRef ?? { current: null },\n overlayRef,\n placement,\n offset,\n isOpen: true,\n });\n\n if (typeof document === \"undefined\") return null;\n\n return createPortal(\n <div\n ref={overlayRef}\n data-placement={placement}\n data-computed-placement={computedPlacement}\n {...mergeProps(tooltipProps, overlayProps)}\n className={className}\n onPointerEnter={onPointerEnter}\n onPointerLeave={onPointerLeave}\n >\n {children}\n </div>,\n document.body\n ) as JSX.Element;\n}\n","\"use client\";\n\nimport {\n createContext,\n useCallback,\n useContext,\n useRef,\n useState,\n isValidElement,\n type JSX,\n type ReactNode,\n} from \"react\";\nimport { TooltipTriggerHeadless, TooltipOverlayHeadless } from \"./TooltipHeadless\";\nimport type { TooltipPlacement } from \"./Tooltip.types\";\n\n// ─── Animation Context ────────────────────────────────────────────────────────\n\n/**\n * Shared animation state provided by `TooltipTrigger` to its `Tooltip` /\n * `RichTooltip` children. Drives the CVA `isVisible` variant and the\n * `animationend` unmount callback.\n */\nexport interface TooltipAnimationContextValue {\n /**\n * True while the exit animation is playing.\n * `Tooltip` / `RichTooltip` apply the exit animation class when this is\n * `true` and stay mounted until `onAnimationEnd` fires.\n */\n isExiting: boolean;\n /** Called by the tooltip element's `onAnimationEnd` to unmount after exit. */\n onAnimationEnd: () => void;\n}\n\nexport const TooltipAnimationContext = createContext<TooltipAnimationContextValue>({\n isExiting: false,\n onAnimationEnd: () => undefined,\n});\n\n/**\n * Convenience hook for `Tooltip` / `RichTooltip` to consume the animation\n * context without importing the raw context object.\n */\nexport function useTooltipAnimation(): TooltipAnimationContextValue {\n return useContext(TooltipAnimationContext);\n}\n\n// ─── TooltipTrigger ───────────────────────────────────────────────────────────\n\nexport interface TooltipTriggerStyledProps {\n /**\n * Exactly two children:\n * 1. The interactive trigger element (button, anchor, etc.)\n * 2. A `Tooltip` or `RichTooltip` component\n */\n children: [ReactNode, ReactNode];\n /**\n * Hover delay in ms before the tooltip opens.\n * @default 300\n */\n delay?: number;\n /** When true, the tooltip will not open. */\n isDisabled?: boolean;\n}\n\n/**\n * `TooltipTrigger` — Layer 3 styled trigger wrapper with MD3 animation.\n *\n * Wraps `TooltipTriggerHeadless` and manages the enter/exit animation state\n * machine so that tooltips fade/scale in on open and fade/scale out before\n * unmounting from the DOM, per MD3 motion specs.\n *\n * Animation state machine:\n * 1. RA fires `onOpenChange(true)` → mount overlay, play entry animation\n * 2. RA fires `onOpenChange(false)` → keep mounted, play exit animation\n * 3. `animationend` fires → unmount overlay\n *\n * The controlled `isOpen={isMounted}` prop passed to `TooltipTriggerHeadless`\n * is what keeps the overlay alive during the exit animation phase.\n *\n * @example\n * ```tsx\n * <TooltipTrigger delay={300}>\n * <button>Save</button>\n * <Tooltip placement=\"top\">Save file</Tooltip>\n * </TooltipTrigger>\n * ```\n */\nexport function TooltipTrigger({\n children,\n delay = 300,\n isDisabled,\n}: TooltipTriggerStyledProps): JSX.Element {\n const [isMounted, setIsMounted] = useState(false);\n const [isExiting, setIsExiting] = useState(false);\n\n const isExitingRef = useRef(false);\n const isPointerOverTooltipRef = useRef(false);\n const pendingCloseRef = useRef(false);\n\n /**\n * Stable callback — React Aria calls this when it wants to open or close.\n *\n * On open → cancel any pending close, mount overlay, play entry animation.\n * On close → if pointer is over the tooltip surface, defer the close until\n * the pointer leaves (prevents flicker when hovering the portal).\n * Otherwise start exit animation immediately.\n */\n const handleOpenChange = useCallback((open: boolean) => {\n if (open) {\n pendingCloseRef.current = false;\n isExitingRef.current = false;\n setIsMounted(true);\n setIsExiting(false);\n } else if (isPointerOverTooltipRef.current) {\n pendingCloseRef.current = true;\n } else if (!isExitingRef.current) {\n isExitingRef.current = true;\n setIsExiting(true);\n }\n }, []);\n\n /**\n * Stable callback — called by the tooltip element's `onAnimationEnd` event.\n * Unmounts the overlay after the exit animation completes.\n *\n * The guard ensures the entry animation's `animationend` event is ignored —\n * only the exit animation should trigger unmounting.\n */\n const handleAnimationEnd = useCallback(() => {\n if (!isExitingRef.current) return;\n isExitingRef.current = false;\n pendingCloseRef.current = false;\n setIsMounted(false);\n setIsExiting(false);\n }, []);\n\n const handleOverlayPointerEnter = useCallback(() => {\n isPointerOverTooltipRef.current = true;\n pendingCloseRef.current = false;\n }, []);\n\n const handleOverlayPointerLeave = useCallback(() => {\n isPointerOverTooltipRef.current = false;\n if (pendingCloseRef.current && !isExitingRef.current) {\n pendingCloseRef.current = false;\n isExitingRef.current = true;\n setIsExiting(true);\n }\n }, []);\n\n const contextValue: TooltipAnimationContextValue = {\n isExiting,\n onAnimationEnd: handleAnimationEnd,\n };\n\n const [triggerChild, tooltipChild] = children;\n\n // Extract placement from the tooltip child's props so TooltipOverlayHeadless\n // can position correctly without requiring an extra prop on TooltipTrigger.\n const placement: TooltipPlacement = isValidElement<{ placement?: TooltipPlacement }>(tooltipChild)\n ? (tooltipChild.props.placement ?? \"top\")\n : \"top\";\n\n return (\n <TooltipAnimationContext.Provider value={contextValue}>\n <TooltipTriggerHeadless\n delay={delay}\n forceMount={isMounted}\n onOpenChange={handleOpenChange}\n {...(isDisabled !== undefined && { isDisabled })}\n >\n {triggerChild}\n {/*\n * TooltipTriggerHeadless clones this element and injects:\n * - tooltipProps (id, role) from useTooltipTrigger\n * - triggerRef for useOverlayPosition\n * offset={4} = 4dp gap per MD3 spec.\n */}\n <TooltipOverlayHeadless\n tooltipProps={{}}\n placement={placement}\n offset={4}\n onPointerEnter={handleOverlayPointerEnter}\n onPointerLeave={handleOverlayPointerLeave}\n >\n {tooltipChild}\n </TooltipOverlayHeadless>\n </TooltipTriggerHeadless>\n </TooltipAnimationContext.Provider>\n );\n}\n","import { cva, type VariantProps } from \"class-variance-authority\";\n\n/**\n * Material Design 3 Plain Tooltip Variants (CVA)\n *\n * Base tokens per MD3 spec:\n * - bg-inverse-surface / text-inverse-on-surface — inverted surface for contrast\n * - rounded-xs — 4dp corner radius (CornerExtraSmall)\n * - min-h-6 — 24dp minimum height\n * - max-w-50 — 200dp maximum width\n * - w-fit — shrink-wrap to content width\n * - px-2 py-1 — 8dp horizontal, 4dp vertical padding\n * - text-body-small — MD3 BodySmall typography (12px)\n *\n * `isVisible` drives the entry/exit animation class:\n * - true → animate-md-scale-in (component entering with scale+fade)\n * - false → animate-md-scale-out (component exiting with scale+fade)\n */\nexport const tooltipVariants = cva(\n \"z-50 w-fit min-h-6 rounded-xs px-2 py-1 text-body-small bg-inverse-surface text-inverse-on-surface max-w-50\",\n {\n variants: {\n /**\n * Drives the MD3 enter/exit animation class.\n * Managed by `TooltipTrigger`'s animation state machine.\n * @default true\n */\n isVisible: {\n true: \"animate-md-scale-in\",\n false: \"animate-md-scale-out\",\n },\n },\n defaultVariants: {\n isVisible: true,\n },\n }\n);\n\n/**\n * Material Design 3 Rich Tooltip Variants (CVA)\n *\n * Base tokens per MD3 spec:\n * - bg-surface-container / text-on-surface — surface container background\n * - shadow-elevation-2 — MD3 elevation level 2\n * - rounded-md — 12dp corner radius (CornerMedium)\n * - min-h-6 — 24dp minimum height\n * - max-w-80 — 320dp maximum width\n * - w-fit — shrink-wrap to content width\n * - px-4 py-3 — 16dp horizontal, 12dp vertical padding\n *\n * `isVisible` drives the entry/exit animation class:\n * - true → animate-md-scale-in (component entering with scale+fade)\n * - false → animate-md-scale-out (component exiting with scale+fade)\n */\nexport const richTooltipVariants = cva(\n \"z-50 w-fit min-h-6 rounded-md px-4 py-3 bg-surface-container text-on-surface shadow-elevation-2 max-w-80\",\n {\n variants: {\n /**\n * Drives the MD3 enter/exit animation class.\n * Managed by `TooltipTrigger`'s animation state machine.\n * @default true\n */\n isVisible: {\n true: \"animate-md-scale-in\",\n false: \"animate-md-scale-out\",\n },\n },\n defaultVariants: {\n isVisible: true,\n },\n }\n);\n\n/** Variant prop types inferred from `tooltipVariants`. */\nexport type TooltipVariants = VariantProps<typeof tooltipVariants>;\n\n/** Variant prop types inferred from `richTooltipVariants`. */\nexport type RichTooltipVariants = VariantProps<typeof richTooltipVariants>;\n","\"use client\";\n\nimport { forwardRef } from \"react\";\nimport type { JSX } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { useTooltipAnimation } from \"./TooltipTrigger\";\nimport { tooltipVariants } from \"./Tooltip.variants\";\nimport type { TooltipProps } from \"./Tooltip.types\";\n\n/**\n * `Tooltip` — Layer 3 MD3 Plain Tooltip styled component.\n *\n * Renders a single-line text label with MD3 inverse-surface styling.\n * Animation is driven by the `TooltipAnimationContext` provided by\n * `TooltipTrigger`:\n * - Entry: `animate-md-scale-in` (scale 0.85 + fade → natural)\n * - Exit: `animate-md-scale-out` (natural → scale 0.85 + fade)\n *\n * MD3 Tokens applied:\n * - `bg-inverse-surface` — inverted surface for max contrast\n * - `text-inverse-on-surface` — content color on inverted surface\n * - `rounded-xs` — 4dp corner radius\n * - `max-w-50` — 200dp maximum width\n * - `text-body-small` — MD3 body-small typography\n *\n * Must be used as the second child of `TooltipTrigger`.\n *\n * @example\n * ```tsx\n * <TooltipTrigger delay={300}>\n * <button>Save</button>\n * <Tooltip placement=\"top\">Save file</Tooltip>\n * </TooltipTrigger>\n * ```\n */\nexport const Tooltip = forwardRef<HTMLDivElement, TooltipProps>(\n ({ children, className, placement: _placement }, ref): JSX.Element => {\n const { isExiting, onAnimationEnd } = useTooltipAnimation();\n\n return (\n <div\n ref={ref}\n className={cn(tooltipVariants({ isVisible: !isExiting }), className)}\n onAnimationEnd={onAnimationEnd}\n >\n {children}\n </div>\n );\n }\n);\n\nTooltip.displayName = \"Tooltip\";\n","\"use client\";\n\nimport { forwardRef } from \"react\";\nimport type { JSX } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { useTooltipAnimation } from \"./TooltipTrigger\";\nimport { richTooltipVariants } from \"./Tooltip.variants\";\nimport type { RichTooltipProps } from \"./Tooltip.types\";\n\n/**\n * `RichTooltip` — Layer 3 MD3 Rich Tooltip styled component.\n *\n * Supports an optional title, multi-line supporting text, and an optional\n * action button per MD3 Rich Tooltip specification.\n * Animation is driven by the `TooltipAnimationContext` provided by\n * `TooltipTrigger`:\n * - Entry: `animate-md-scale-in` (scale 0.85 + fade → natural)\n * - Exit: `animate-md-scale-out` (natural → scale 0.85 + fade)\n *\n * MD3 Tokens applied:\n * - `bg-surface-container` — surface container background\n * - `text-on-surface` — content color on surface\n * - `shadow-elevation-2` — MD3 elevation level 2\n * - `rounded-md` — medium corner radius\n * - `max-w-80` — 320dp maximum width\n *\n * Must be used as the second child of `TooltipTrigger`.\n *\n * @example\n * ```tsx\n * <TooltipTrigger delay={300}>\n * <button>Add to list</button>\n * <RichTooltip\n * title=\"Add to list\"\n * action={<Button variant=\"text\">Learn more</Button>}\n * >\n * Saved items appear in your personal list.\n * </RichTooltip>\n * </TooltipTrigger>\n * ```\n */\nexport const RichTooltip = forwardRef<HTMLDivElement, RichTooltipProps>(\n ({ title, children, action, className, placement: _placement }, ref): JSX.Element => {\n const { isExiting, onAnimationEnd } = useTooltipAnimation();\n\n return (\n <div\n ref={ref}\n className={cn(richTooltipVariants({ isVisible: !isExiting }), className)}\n onAnimationEnd={onAnimationEnd}\n >\n {title && <p className=\"text-on-surface text-title-small mb-1\">{title}</p>}\n <p className=\"text-on-surface-variant text-body-medium\">{children}</p>\n {action}\n </div>\n );\n }\n);\n\nRichTooltip.displayName = \"RichTooltip\";\n","\"use client\";\n\nimport { Children, createContext, forwardRef, isValidElement, useContext, useRef } from \"react\";\nimport type React from \"react\";\nimport { useListBox, useOption } from \"react-aria\";\nimport { Item, useListState } from \"react-stately\";\nimport type { ListState } from \"react-stately\";\nimport type { ListHeadlessProps, ListItemProps } from \"./List.types\";\n\n// ─── Context ──────────────────────────────────────────────────────────────────\n\ninterface ListContextValue {\n isInteractive: true;\n state: ListState<object>;\n}\n\nconst ListContext = createContext<ListContextValue | null>(null);\n\nexport function useListContext(): ListContextValue | null {\n return useContext(ListContext);\n}\n\n// ─── Helpers ──────────────────────────────────────────────────────────────────\n\n/**\n * Extracts ListItemHeadless props from children so we can build the\n * React Aria `Item` collection required by `useListState`.\n */\nfunction extractItemProps(children: React.ReactNode): ListItemProps[] {\n const items: ListItemProps[] = [];\n Children.forEach(children, (child) => {\n if (isValidElement<ListItemProps>(child)) {\n items.push(child.props);\n }\n });\n return items;\n}\n\n// ─── ListHeadless ─────────────────────────────────────────────────────────────\n\n/**\n * Headless List container (Layer 2).\n *\n * Renders an accessible list with two operating modes:\n *\n * | Condition | Element | ARIA role |\n * |---|---|---|\n * | `selectionMode === 'none'` AND no `onAction` | `<ul>` | `list` |\n * | `selectionMode` is `'single'`/`'multiple'`, OR `onAction` given | `<ul>` | `listbox` (via `useListBox`) |\n *\n * @example\n * ```tsx\n * // Static\n * <ListHeadless aria-label=\"Settings\">\n * <ListItemHeadless value=\"wifi\" headline=\"Wi-Fi\" />\n * </ListHeadless>\n *\n * // Interactive\n * <ListHeadless aria-label=\"Alignment\" selectionMode=\"single\">\n * <ListItemHeadless value=\"left\" headline=\"Left\" />\n * </ListHeadless>\n * ```\n */\nexport const ListHeadless = forwardRef<HTMLUListElement, ListHeadlessProps>(function ListHeadless(\n {\n selectionMode = \"none\",\n selectedKeys,\n defaultSelectedKeys,\n onSelectionChange,\n onAction,\n className,\n children,\n ...rest\n },\n forwardedRef\n) {\n const isInteractive = selectionMode !== \"none\" || onAction !== undefined;\n\n if (isInteractive) {\n return (\n <InteractiveList\n ref={forwardedRef}\n selectionMode={selectionMode}\n {...(selectedKeys !== undefined ? { selectedKeys } : {})}\n {...(defaultSelectedKeys !== undefined ? { defaultSelectedKeys } : {})}\n {...(onSelectionChange ? { onSelectionChange } : {})}\n {...(onAction ? { onAction } : {})}\n {...(className !== undefined ? { className } : {})}\n {...(rest[\"aria-label\"] !== undefined ? { \"aria-label\": rest[\"aria-label\"] } : {})}\n {...(rest[\"aria-labelledby\"] !== undefined\n ? { \"aria-labelledby\": rest[\"aria-labelledby\"] }\n : {})}\n >\n {children}\n </InteractiveList>\n );\n }\n\n return (\n <ul\n ref={forwardedRef}\n role=\"list\"\n className={className}\n aria-label={rest[\"aria-label\"]}\n aria-labelledby={rest[\"aria-labelledby\"]}\n >\n {children}\n </ul>\n );\n});\n\nListHeadless.displayName = \"ListHeadless\";\n\n// ─── InteractiveList (internal) ───────────────────────────────────────────────\n\n/**\n * Separated into its own component so React Aria hooks (`useListState`,\n * `useListBox`) are always called unconditionally (Rules of Hooks).\n */\nconst InteractiveList = forwardRef<HTMLUListElement, ListHeadlessProps>(function InteractiveList(\n {\n selectionMode = \"none\",\n selectedKeys,\n defaultSelectedKeys,\n onSelectionChange,\n onAction,\n className,\n children,\n ...rest\n },\n forwardedRef\n) {\n const internalRef = useRef<HTMLUListElement>(null);\n const ref = (forwardedRef ?? internalRef) as React.RefObject<HTMLUListElement>;\n\n const itemProps = extractItemProps(children);\n\n const disabledKeys = itemProps.filter((item) => item.isDisabled).map((item) => item.value);\n\n const collectionChildren = itemProps.map((item) => (\n <Item key={item.value} textValue={item.headline}>\n {item.headline}\n </Item>\n ));\n\n const resolvedMode = selectionMode === \"none\" ? undefined : selectionMode;\n\n const state = useListState({\n children: collectionChildren,\n ...(resolvedMode !== undefined ? { selectionMode: resolvedMode } : {}),\n ...(selectedKeys !== undefined ? { selectedKeys } : {}),\n ...(defaultSelectedKeys !== undefined ? { defaultSelectedKeys } : {}),\n ...(onSelectionChange ? { onSelectionChange } : {}),\n ...(onAction ? { onAction } : {}),\n disabledKeys,\n });\n\n const ariaLabel = rest[\"aria-label\"];\n const ariaLabelledby = rest[\"aria-labelledby\"];\n\n const { listBoxProps } = useListBox(\n {\n ...(ariaLabel !== undefined ? { \"aria-label\": ariaLabel } : {}),\n ...(ariaLabelledby !== undefined ? { \"aria-labelledby\": ariaLabelledby } : {}),\n ...(resolvedMode !== undefined ? { selectionMode: resolvedMode } : {}),\n ...(selectedKeys !== undefined ? { selectedKeys } : {}),\n ...(defaultSelectedKeys !== undefined ? { defaultSelectedKeys } : {}),\n ...(onSelectionChange ? { onSelectionChange } : {}),\n ...(onAction ? { onAction } : {}),\n disabledKeys,\n },\n state,\n ref\n );\n\n return (\n <ListContext.Provider value={{ isInteractive: true, state }}>\n <ul {...listBoxProps} ref={ref} className={className}>\n {Children.map(children, (child) => {\n if (isValidElement<ListItemProps>(child)) {\n return child;\n }\n return null;\n })}\n </ul>\n </ListContext.Provider>\n );\n});\n\nInteractiveList.displayName = \"InteractiveList\";\n\n// ─── ListItemHeadless ─────────────────────────────────────────────────────────\n\n/**\n * Headless List Item (Layer 2).\n *\n * Renders an accessible list item:\n * - **Static mode**: `<li role=\"listitem\">`, not focusable\n * - **Interactive mode**: `<li>` with `useOption` providing `role=\"option\"`,\n * `aria-selected`, `aria-disabled`, and keyboard interaction\n *\n * @example\n * ```tsx\n * <ListItemHeadless value=\"wifi\" headline=\"Wi-Fi\" supportingText=\"Connected\" />\n * ```\n */\nexport const ListItemHeadless = forwardRef<HTMLLIElement, ListItemProps>(function ListItemHeadless(\n { value, headline, supportingText, overline, className },\n forwardedRef\n) {\n const ctx = useListContext();\n\n if (ctx) {\n return (\n <InteractiveListItem\n ref={forwardedRef}\n value={value}\n headline={headline}\n {...(supportingText !== undefined ? { supportingText } : {})}\n {...(overline !== undefined ? { overline } : {})}\n {...(className !== undefined ? { className } : {})}\n state={ctx.state}\n />\n );\n }\n\n return (\n <li ref={forwardedRef} role=\"listitem\" className={className}>\n {overline && <span>{overline}</span>}\n <span>{headline}</span>\n {supportingText && <span>{supportingText}</span>}\n </li>\n );\n});\n\nListItemHeadless.displayName = \"ListItemHeadless\";\n\n// ─── InteractiveListItem (internal) ───────────────────────────────────────────\n\ninterface InteractiveListItemInternalProps {\n value: string | number;\n headline: string;\n supportingText?: string;\n overline?: string;\n className?: string;\n state: ListState<object>;\n}\n\nconst InteractiveListItem = forwardRef<HTMLLIElement, InteractiveListItemInternalProps>(\n function InteractiveListItem(\n { value, headline, supportingText, overline, className, state },\n forwardedRef\n ) {\n const internalRef = useRef<HTMLLIElement>(null);\n const ref = (forwardedRef ?? internalRef) as React.RefObject<HTMLLIElement>;\n\n const { optionProps, isSelected, isDisabled } = useOption({ key: value }, state, ref);\n\n return (\n <li\n {...optionProps}\n ref={ref}\n className={className}\n data-selected={isSelected || undefined}\n data-disabled={isDisabled || undefined}\n >\n {overline && <span>{overline}</span>}\n <span>{headline}</span>\n {supportingText && <span>{supportingText}</span>}\n </li>\n );\n }\n);\n\nInteractiveListItem.displayName = \"InteractiveListItem\";\n","import { cva, type VariantProps } from \"class-variance-authority\";\n\n/**\n * MD3 List container CVA variants.\n */\nexport const listVariants = cva(\"w-full bg-surface\");\n\n/**\n * MD3 ListItem CVA variants.\n *\n * Density is auto-derived from content (overline / supportingText), not a user prop.\n * Three-line items use `items-start` so leading/trailing slots top-align.\n */\nexport const listItemVariants = cva(\n [\n \"group relative flex items-center overflow-hidden px-4 py-2 cursor-pointer\",\n \"transition-[background-color] duration-short4 ease-standard\",\n ],\n {\n variants: {\n density: {\n \"one-line\": \"min-h-14\",\n \"two-line\": \"min-h-18\",\n \"three-line\": \"min-h-22 items-start\",\n },\n\n isSelected: {\n true: \"bg-secondary-container text-on-secondary-container\",\n false: \"\",\n },\n\n isDisabled: {\n true: \"opacity-38 pointer-events-none\",\n false: \"\",\n },\n\n isInteractive: {\n true: \"\",\n false: \"cursor-default\",\n },\n },\n\n defaultVariants: {\n density: \"one-line\",\n isSelected: false,\n isDisabled: false,\n isInteractive: true,\n },\n }\n);\n\nexport type ListVariants = VariantProps<typeof listVariants>;\nexport type ListItemVariants = VariantProps<typeof listItemVariants>;\n","\"use client\";\n\nimport { Children, forwardRef } from \"react\";\nimport type React from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { ListHeadless } from \"./ListHeadless\";\nimport { listVariants } from \"./List.variants\";\nimport type { ListProps } from \"./List.types\";\n\n// ─── Helpers ──────────────────────────────────────────────────────────────────\n\n/**\n * Interleaves presentational `<hr>` dividers between each child.\n * Uses `role=\"presentation\"` to keep the element out of the ARIA tree,\n * avoiding `aria-required-children` violations inside `<ul role=\"list\">`.\n */\nfunction interleaveWithDividers(children: React.ReactNode): React.ReactNode[] {\n const items = Children.toArray(children);\n\n return items.reduce<React.ReactNode[]>((acc, child, index) => {\n if (index > 0) {\n acc.push(\n <hr\n key={`divider-${index}`}\n role=\"presentation\"\n className=\"border-outline-variant w-full border-t\"\n />\n );\n }\n acc.push(child);\n return acc;\n }, []);\n}\n\n/**\n * Material Design 3 List Component (Layer 3: Styled)\n *\n * Wraps `ListHeadless` with MD3 surface color and layout tokens.\n *\n * @example\n * ```tsx\n * // Static list\n * <List aria-label=\"Settings\">\n * <ListItem value=\"wifi\" headline=\"Wi-Fi\" />\n * <ListItem value=\"bt\" headline=\"Bluetooth\" />\n * </List>\n *\n * // Interactive single-select list\n * <List aria-label=\"Alignment\" selectionMode=\"single\" onSelectionChange={setSelection}>\n * <ListItem value=\"left\" headline=\"Left\" />\n * <ListItem value=\"center\" headline=\"Center\" />\n * <ListItem value=\"right\" headline=\"Right\" />\n * </List>\n *\n * // With dividers between items\n * <List aria-label=\"Settings\" showDividers>\n * <ListItem value=\"wifi\" headline=\"Wi-Fi\" />\n * <ListItem value=\"bt\" headline=\"Bluetooth\" />\n * </List>\n * ```\n */\nexport const List = forwardRef<HTMLUListElement, ListProps>(function List(\n { className, showDividers = false, children, ...props },\n ref\n) {\n const renderedChildren = showDividers ? interleaveWithDividers(children) : children;\n\n return (\n <ListHeadless ref={ref} className={cn(listVariants(), className)} {...props}>\n {renderedChildren}\n </ListHeadless>\n );\n});\n\nList.displayName = \"List\";\n","import { forwardRef } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport type { ListItemLeadingProps } from \"./List.types\";\n\nconst typeClasses: Record<string, string> = {\n icon: \"size-6 text-on-surface-variant\",\n avatar: \"size-10 overflow-hidden rounded-full\",\n checkbox: \"\",\n radio: \"\",\n};\n\n/**\n * MD3 ListItem leading slot.\n *\n * For `checkbox` and `radio` types the children are wrapped with\n * `aria-hidden=\"true\"` and `tabIndex={-1}` because the parent\n * `ListItem`'s `useOption` already conveys selection state to\n * assistive technology.\n */\nexport const ListItemLeading = forwardRef<HTMLDivElement, ListItemLeadingProps>(\n function ListItemLeading({ type, children, className }, ref) {\n const isControl = type === \"checkbox\" || type === \"radio\";\n\n return (\n <div\n ref={ref}\n className={cn(\"mr-4 flex shrink-0 items-center\", typeClasses[type], className)}\n >\n {isControl ? (\n <span aria-hidden=\"true\" tabIndex={-1}>\n {children}\n </span>\n ) : (\n children\n )}\n </div>\n );\n }\n);\n\nListItemLeading.displayName = \"ListItemLeading\";\n","import { forwardRef } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport type { ListItemTrailingProps } from \"./List.types\";\n\nconst typeClasses: Record<string, string> = {\n icon: \"size-6 text-on-surface-variant\",\n text: \"text-on-surface-variant text-label-small\",\n checkbox: \"\",\n radio: \"\",\n};\n\n/**\n * MD3 ListItem trailing slot.\n *\n * For `checkbox` and `radio` types the children are wrapped with\n * `aria-hidden=\"true\"` and `tabIndex={-1}` — selection semantics\n * come from the parent `ListItem`'s `useOption`.\n */\nexport const ListItemTrailing = forwardRef<HTMLDivElement, ListItemTrailingProps>(\n function ListItemTrailing({ type, children, className }, ref) {\n const isControl = type === \"checkbox\" || type === \"radio\";\n\n return (\n <div\n ref={ref}\n className={cn(\"ml-auto flex shrink-0 items-center\", typeClasses[type], className)}\n >\n {isControl ? (\n <span aria-hidden=\"true\" tabIndex={-1}>\n {children}\n </span>\n ) : (\n children\n )}\n </div>\n );\n }\n);\n\nListItemTrailing.displayName = \"ListItemTrailing\";\n","import { forwardRef } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport type { ListItemTextProps } from \"./List.types\";\n\n/**\n * MD3 ListItem text block — overline + headline + supporting text.\n *\n * Uses `min-w-0` to allow text truncation inside flex containers.\n */\nexport const ListItemText = forwardRef<HTMLDivElement, ListItemTextProps>(function ListItemText(\n { headline, supportingText, overline, className },\n ref\n) {\n return (\n <div ref={ref} className={cn(\"min-w-0 flex-1\", className)}>\n {overline && <p className=\"text-on-surface-variant text-label-small\">{overline}</p>}\n <p className=\"text-on-surface text-body-large\">{headline}</p>\n {supportingText && (\n <p className=\"text-on-surface-variant text-body-medium\">{supportingText}</p>\n )}\n </div>\n );\n});\n\nListItemText.displayName = \"ListItemText\";\n","\"use client\";\n\nimport { forwardRef, useRef } from \"react\";\nimport type React from \"react\";\nimport { useOption } from \"react-aria\";\nimport { mergeProps } from \"@react-aria/utils\";\nimport type { ListState } from \"react-stately\";\nimport { cn } from \"../../utils/cn\";\nimport { useRipple } from \"../../hooks/useRipple\";\nimport { Divider } from \"../Divider\";\nimport { listItemVariants } from \"./List.variants\";\nimport { ListItemLeading } from \"./ListItemLeading\";\nimport { ListItemTrailing } from \"./ListItemTrailing\";\nimport { ListItemText } from \"./ListItemText\";\nimport { useListContext } from \"./ListHeadless\";\nimport type { ListDensity, ListItemProps } from \"./List.types\";\n\n// ─── Helpers ──────────────────────────────────────────────────────────────────\n\nfunction getDensity(overline?: string, supportingText?: string): ListDensity {\n if (overline) return \"three-line\";\n if (supportingText) return \"two-line\";\n return \"one-line\";\n}\n\n// ─── ListItem (Layer 3: Styled) ───────────────────────────────────────────────\n\n/**\n * Material Design 3 List Item (Layer 3: Styled)\n *\n * Renders an accessible list item with MD3 visual treatment:\n * state layer, ripple, density-driven height, and slot-based layout.\n *\n * - **Interactive mode** (inside a `List` with `selectionMode` or `onAction`):\n * uses `useOption` for ARIA semantics, renders state layer + ripple.\n * - **Static mode**: renders `<li role=\"listitem\">` without interactive\n * affordances.\n *\n * Density is auto-derived from content:\n * - one-line (56dp) — headline only\n * - two-line (72dp) — headline + supportingText\n * - three-line (88dp) — overline present\n */\nexport const ListItem = forwardRef<HTMLLIElement, ListItemProps>(function ListItem(\n {\n value,\n headline,\n supportingText,\n overline,\n leadingSlot,\n leadingType,\n trailingSlot,\n trailingType,\n isDisabled = false,\n insetDivider = false,\n className,\n },\n forwardedRef\n) {\n const ctx = useListContext();\n const density = getDensity(overline, supportingText);\n\n if (ctx) {\n return (\n <InteractiveStyledListItem\n ref={forwardedRef}\n value={value}\n headline={headline}\n {...(supportingText !== undefined ? { supportingText } : {})}\n {...(overline !== undefined ? { overline } : {})}\n {...(leadingSlot !== undefined ? { leadingSlot } : {})}\n {...(leadingType !== undefined ? { leadingType } : {})}\n {...(trailingSlot !== undefined ? { trailingSlot } : {})}\n {...(trailingType !== undefined ? { trailingType } : {})}\n density={density}\n insetDivider={insetDivider}\n {...(className !== undefined ? { className } : {})}\n state={ctx.state}\n />\n );\n }\n\n return (\n <li\n ref={forwardedRef}\n role=\"listitem\"\n className={cn(\n listItemVariants({\n density,\n isSelected: false,\n isDisabled,\n isInteractive: false,\n }),\n className\n )}\n >\n {leadingSlot && <ListItemLeading type={leadingType ?? \"icon\"}>{leadingSlot}</ListItemLeading>}\n <ListItemText\n headline={headline}\n {...(supportingText !== undefined ? { supportingText } : {})}\n {...(overline !== undefined ? { overline } : {})}\n />\n {trailingSlot && (\n <ListItemTrailing type={trailingType ?? \"icon\"}>{trailingSlot}</ListItemTrailing>\n )}\n {insetDivider && (\n <Divider\n orientation=\"horizontal\"\n inset=\"start\"\n className=\"absolute right-0 bottom-0 left-0\"\n />\n )}\n </li>\n );\n});\n\nListItem.displayName = \"ListItem\";\n\n// ─── InteractiveStyledListItem (internal) ─────────────────────────────────────\n\ninterface InteractiveStyledListItemInternalProps {\n value: string | number;\n headline: string;\n supportingText?: string;\n overline?: string;\n leadingSlot?: React.ReactNode;\n leadingType?: ListItemProps[\"leadingType\"];\n trailingSlot?: React.ReactNode;\n trailingType?: ListItemProps[\"trailingType\"];\n density: ListDensity;\n insetDivider: boolean;\n className?: string;\n state: ListState<object>;\n}\n\n/**\n * Internal interactive list item — separated so `useOption` is always\n * called unconditionally (Rules of Hooks).\n */\nconst InteractiveStyledListItem = forwardRef<HTMLLIElement, InteractiveStyledListItemInternalProps>(\n function InteractiveStyledListItem(\n {\n value,\n headline,\n supportingText,\n overline,\n leadingSlot,\n leadingType,\n trailingSlot,\n trailingType,\n density,\n insetDivider,\n className,\n state,\n },\n forwardedRef\n ) {\n const internalRef = useRef<HTMLLIElement>(null);\n const ref = (forwardedRef ?? internalRef) as React.RefObject<HTMLLIElement>;\n\n const { optionProps, isSelected, isDisabled } = useOption({ key: value }, state, ref);\n\n const { onMouseDown: handleRipple, ripples } = useRipple({\n disabled: isDisabled,\n });\n\n const mergedProps = mergeProps(optionProps, { onMouseDown: handleRipple });\n\n return (\n <li\n {...mergedProps}\n ref={ref}\n className={cn(\n listItemVariants({\n density,\n isSelected,\n isDisabled,\n isInteractive: true,\n }),\n className\n )}\n data-selected={isSelected || undefined}\n data-disabled={isDisabled || undefined}\n >\n <div\n aria-hidden=\"true\"\n className=\"bg-on-surface duration-short2 ease-standard pointer-events-none absolute inset-0 opacity-0 transition-opacity group-hover:opacity-8 group-active:opacity-12\"\n />\n {ripples}\n\n {leadingSlot && (\n <ListItemLeading type={leadingType ?? \"icon\"}>{leadingSlot}</ListItemLeading>\n )}\n <ListItemText\n headline={headline}\n {...(supportingText !== undefined ? { supportingText } : {})}\n {...(overline !== undefined ? { overline } : {})}\n />\n {trailingSlot && (\n <ListItemTrailing type={trailingType ?? \"icon\"}>{trailingSlot}</ListItemTrailing>\n )}\n {insetDivider && (\n <Divider\n orientation=\"horizontal\"\n inset=\"start\"\n className=\"absolute right-0 bottom-0 left-0\"\n />\n )}\n </li>\n );\n }\n);\n\nInteractiveStyledListItem.displayName = \"InteractiveStyledListItem\";\n","\"use client\";\n\nimport { forwardRef, useRef, useCallback } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { useSearchField, useOverlay, usePreventScroll, useButton, FocusScope } from \"react-aria\";\nimport { useSearchFieldState } from \"react-stately\";\nimport type { SearchBarHeadlessProps, SearchViewHeadlessProps } from \"./Search.types\";\n\n/**\n * SearchBarHeadless — Layer 2 headless primitive for the MD3 Search bar.\n *\n * Renders `<form role=\"search\">` wrapping an accessible search input.\n * Uses `useSearchField` + `useSearchFieldState` from React Aria/Stately.\n *\n * Features:\n * - `role=\"search\"` on the form wrapper\n * - `role=\"searchbox\"` on the input (via type=\"search\")\n * - Keyboard: Enter → onSubmit, Escape (with value) → onClear\n * - Leading icon, trailing actions, and avatar slots\n * - aria-label falls back to placeholder per MD3 labeling spec\n *\n * @example\n * ```tsx\n * <SearchBarHeadless\n * placeholder=\"Search messages\"\n * onFocus={() => setOpen(true)}\n * className=\"my-search-bar\"\n * />\n * ```\n */\nexport const SearchBarHeadless = forwardRef<HTMLFormElement, SearchBarHeadlessProps>(\n (\n {\n value,\n defaultValue,\n onChange,\n onSubmit,\n onClear,\n placeholder,\n leadingIcon,\n trailingActions,\n avatar,\n isDisabled,\n \"aria-label\": ariaLabel,\n className,\n onFocus,\n onBlur,\n },\n forwardedRef\n ) => {\n const inputRef = useRef<HTMLInputElement>(null);\n const internalFormRef = useRef<HTMLFormElement>(null);\n const formRef = (forwardedRef ?? internalFormRef) as React.RefObject<HTMLFormElement>;\n\n const state = useSearchFieldState({\n ...(value !== undefined ? { value } : {}),\n ...(defaultValue !== undefined ? { defaultValue } : {}),\n ...(onChange !== undefined ? { onChange } : {}),\n ...(onSubmit !== undefined ? { onSubmit } : {}),\n ...(onClear !== undefined ? { onClear } : {}),\n });\n\n const { inputProps } = useSearchField(\n {\n \"aria-label\": ariaLabel ?? placeholder ?? \"Search\",\n ...(placeholder !== undefined ? { placeholder } : {}),\n ...(isDisabled !== undefined ? { isDisabled } : {}),\n ...(onSubmit !== undefined ? { onSubmit } : {}),\n ...(onClear !== undefined ? { onClear } : {}),\n ...(onFocus !== undefined ? { onFocus: () => onFocus() } : {}),\n ...(onBlur !== undefined ? { onBlur: () => onBlur() } : {}),\n },\n state,\n inputRef\n );\n\n const handleFormSubmit = useCallback(\n (e: React.FormEvent) => {\n e.preventDefault();\n onSubmit?.(state.value);\n },\n [onSubmit, state.value]\n );\n\n return (\n <form ref={formRef} role=\"search\" className={className} onSubmit={handleFormSubmit}>\n {leadingIcon && <span data-slot=\"leading-icon\">{leadingIcon}</span>}\n <input {...inputProps} ref={inputRef} role=\"searchbox\" />\n {trailingActions && trailingActions.length > 0 && (\n <span data-slot=\"trailing-actions\">\n {trailingActions.map((action, index) => (\n <span key={index} data-slot=\"trailing-action\">\n {action}\n </span>\n ))}\n </span>\n )}\n {avatar && <span data-slot=\"avatar\">{avatar}</span>}\n </form>\n );\n }\n);\n\nSearchBarHeadless.displayName = \"SearchBarHeadless\";\n\n/**\n * SearchViewHeadless — Layer 2 headless primitive for the MD3 Search view.\n *\n * Renders in a portal when `isOpen={true}`. Does not render when closed.\n * Uses `useOverlay` for Escape-key dismissal, `usePreventScroll` to lock\n * body scrolling, and `FocusScope` for focus trapping.\n *\n * Features:\n * - Portal rendering via `createPortal`\n * - Escape key → onClose\n * - Body scroll lock when open\n * - Focus trap with auto-focus and restore on close\n * - aria-live region for autosuggest announcements\n * - Back arrow (leading icon) + input + clear button header\n *\n * @example\n * ```tsx\n * <SearchViewHeadless\n * isOpen={isOpen}\n * onClose={() => setOpen(false)}\n * aria-label=\"Search messages\"\n * >\n * <List>{results.map(r => <ListItem key={r.id} headline={r.label} />)}</List>\n * </SearchViewHeadless>\n * ```\n */\nexport const SearchViewHeadless = forwardRef<HTMLDivElement, SearchViewHeadlessProps>(\n (\n {\n isOpen,\n onClose,\n value,\n defaultValue,\n onChange,\n onSubmit,\n placeholder,\n \"aria-label\": ariaLabel,\n className,\n children,\n leadingIcon,\n trailingActions,\n showDivider,\n },\n forwardedRef\n ) => {\n if (!isOpen) {\n return null;\n }\n\n return createPortal(\n <SearchViewPanel\n ref={forwardedRef}\n onClose={onClose}\n ariaLabel={ariaLabel}\n {...(className !== undefined ? { className } : {})}\n {...(leadingIcon !== undefined ? { leadingIcon } : {})}\n {...(trailingActions !== undefined ? { trailingActions } : {})}\n {...(showDivider !== undefined ? { showDivider } : {})}\n {...(value !== undefined ? { value } : {})}\n {...(defaultValue !== undefined ? { defaultValue } : {})}\n {...(onChange !== undefined ? { onChange } : {})}\n {...(onSubmit !== undefined ? { onSubmit } : {})}\n {...(placeholder !== undefined ? { placeholder } : {})}\n >\n {children}\n </SearchViewPanel>,\n document.body\n );\n }\n);\n\nSearchViewHeadless.displayName = \"SearchViewHeadless\";\n\n// ─── SearchViewPanel (internal) ──────────────────────────────────────────────\n\ninterface SearchViewPanelProps {\n onClose: () => void;\n value?: string;\n defaultValue?: string;\n onChange?: (value: string) => void;\n onSubmit?: (value: string) => void;\n placeholder?: string;\n ariaLabel: string;\n className?: string;\n children?: React.ReactNode;\n leadingIcon?: React.ReactNode;\n trailingActions?: React.ReactNode[];\n showDivider?: boolean;\n}\n\n/**\n * Inner panel for the search view. Separated to allow hooks\n * (`usePreventScroll`, `useOverlay`) which must be called unconditionally.\n * @internal\n */\nconst SearchViewPanel = forwardRef<HTMLDivElement, SearchViewPanelProps>(\n (\n {\n onClose,\n value,\n defaultValue,\n onChange,\n onSubmit,\n placeholder,\n ariaLabel,\n className,\n children,\n leadingIcon,\n trailingActions,\n showDivider,\n },\n forwardedRef\n ) => {\n const panelRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const ref = (forwardedRef ?? panelRef) as React.RefObject<HTMLDivElement>;\n\n usePreventScroll();\n\n const { overlayProps } = useOverlay(\n {\n isOpen: true,\n onClose,\n isDismissable: true,\n shouldCloseOnBlur: false,\n },\n ref\n );\n\n const state = useSearchFieldState({\n ...(value !== undefined ? { value } : {}),\n ...(defaultValue !== undefined ? { defaultValue } : {}),\n ...(onChange !== undefined ? { onChange } : {}),\n ...(onSubmit !== undefined ? { onSubmit } : {}),\n });\n\n const { inputProps, clearButtonProps } = useSearchField(\n {\n \"aria-label\": ariaLabel,\n ...(placeholder !== undefined ? { placeholder } : {}),\n ...(onSubmit !== undefined ? { onSubmit } : {}),\n onClear: () => {\n state.setValue(\"\");\n },\n },\n state,\n inputRef\n );\n\n const clearButtonRef = useRef<HTMLButtonElement>(null);\n const { buttonProps: clearBtnDomProps } = useButton(clearButtonProps, clearButtonRef);\n\n const handleBackClick = useCallback(() => {\n onClose();\n }, [onClose]);\n\n const defaultBackArrow = (\n <button type=\"button\" aria-label=\"Back\" onClick={handleBackClick} data-slot=\"back-button\">\n ←\n </button>\n );\n\n const clearButton = state.value ? (\n <button\n {...clearBtnDomProps}\n ref={clearButtonRef}\n type=\"button\"\n aria-label=\"Clear search\"\n data-slot=\"clear-button\"\n >\n ✕\n </button>\n ) : null;\n\n return (\n <FocusScope contain restoreFocus autoFocus>\n <div {...overlayProps} ref={ref} role=\"search\" aria-label={ariaLabel} className={className}>\n <div data-slot=\"header\">\n <span data-slot=\"leading-icon\">{leadingIcon ?? defaultBackArrow}</span>\n <input {...inputProps} ref={inputRef} role=\"searchbox\" />\n {clearButton}\n {trailingActions && trailingActions.length > 0 && (\n <span data-slot=\"trailing-actions\">\n {trailingActions.map((action, index) => (\n <span key={index} data-slot=\"trailing-action\">\n {action}\n </span>\n ))}\n </span>\n )}\n </div>\n {showDivider && <hr data-slot=\"divider\" />}\n <div data-slot=\"content\" aria-live=\"polite\">\n {children}\n </div>\n </div>\n </FocusScope>\n );\n }\n);\n\nSearchViewPanel.displayName = \"SearchViewPanel\";\n","import { cva, type VariantProps } from \"class-variance-authority\";\n\n/**\n * Material Design 3 Search Bar container variants (CVA).\n *\n * Base: 56dp height, full rounded pill, surface-container-high background,\n * level-3 elevation, body-large typography.\n *\n * Spacing follows MD3 Search spec:\n * - Contained (expressive): 4dp leading/trailing with trailing actions\n * - Contained (no actions): 16dp leading/trailing\n * - Divided (baseline): 16dp leading/trailing, 16dp icon-label gap\n *\n * @see docs/md3-components/search/tokens/layout-text.md\n */\nexport const searchBarVariants = cva(\n [\n \"relative flex items-center h-14 rounded-full bg-surface-container-high\",\n \"shadow-elevation-3 w-full text-body-large cursor-text\",\n ],\n {\n variants: {\n style: {\n contained: \"\",\n divided: \"px-4 gap-4\",\n },\n noActions: {\n true: \"\",\n false: \"\",\n },\n focused: {\n true: \"\",\n false: \"\",\n },\n disabled: {\n true: \"opacity-38 pointer-events-none\",\n false: \"\",\n },\n },\n compoundVariants: [\n {\n style: \"contained\",\n noActions: false,\n class: \"px-1 gap-1\",\n },\n {\n style: \"contained\",\n noActions: true,\n class: \"px-4\",\n },\n ],\n defaultVariants: {\n style: \"contained\",\n noActions: false,\n focused: false,\n disabled: false,\n },\n }\n);\n\n/**\n * Material Design 3 Search View container variants (CVA).\n *\n * Compound variants express all 4 style+layout combinations:\n * - Contained + fullscreen: surface-container-low, no rounding\n * - Contained + docked: surface-container-high, rounded-xl (12dp)\n * - Divided + fullscreen: surface-container-high, no rounding\n * - Divided + docked: surface-container-high, rounded-[28px] (extra-large)\n *\n * @see docs/md3-components/search/tokens/color-tokens-light.md\n */\nexport const searchViewVariants = cva([\"flex flex-col shadow-elevation-3 z-50 overflow-hidden\"], {\n variants: {\n style: {\n contained: \"\",\n divided: \"bg-surface-container-high\",\n },\n layout: {\n fullscreen: \"fixed inset-0\",\n docked: \"relative min-w-[360px] max-w-[720px] min-h-60 max-h-[66vh] overflow-y-auto\",\n },\n },\n compoundVariants: [\n {\n style: \"contained\",\n layout: \"fullscreen\",\n class: \"bg-surface-container-low rounded-none\",\n },\n {\n style: \"contained\",\n layout: \"docked\",\n class: \"bg-surface-container-high rounded-xl gap-0.5\",\n },\n {\n style: \"divided\",\n layout: \"fullscreen\",\n class: \"bg-surface-container-high rounded-none\",\n },\n {\n style: \"divided\",\n layout: \"docked\",\n class: \"bg-surface-container-high rounded-[28px]\",\n },\n ],\n defaultVariants: {\n style: \"contained\",\n layout: \"fullscreen\",\n },\n});\n\n/**\n * Material Design 3 Search View header variants (CVA).\n *\n * Heights per style + layout:\n * - Contained: 56dp (both layouts)\n * - Divided + fullscreen: 72dp\n * - Divided + docked: 56dp (overridden by docked variant)\n *\n * @see docs/md3-components/search/tokens/layout-text.md\n */\nexport const searchViewHeaderVariants = cva(\n [\"flex items-center w-full bg-surface-container-high gap-1\"],\n {\n variants: {\n style: {\n contained: \"h-14 px-3\",\n divided: \"h-[72px] px-4\",\n },\n layout: {\n docked: \"h-14\",\n fullscreen: \"\",\n },\n },\n defaultVariants: {\n style: \"contained\",\n layout: \"fullscreen\",\n },\n }\n);\n\nexport type SearchBarVariants = VariantProps<typeof searchBarVariants>;\nexport type SearchViewVariantsType = VariantProps<typeof searchViewVariants>;\nexport type SearchViewHeaderVariantsType = VariantProps<typeof searchViewHeaderVariants>;\n","\"use client\";\n\nimport { forwardRef, useState, useCallback } from \"react\";\nimport { useReducedMotion } from \"../../hooks/useReducedMotion\";\nimport { SearchBarHeadless } from \"./SearchHeadless\";\nimport { searchBarVariants } from \"./Search.variants\";\nimport { cn } from \"../../utils/cn\";\nimport { useRipple } from \"../../hooks/useRipple\";\nimport type { SearchBarProps } from \"./Search.types\";\n\n/**\n * Material Design 3 Search Bar Component (Layer 3: Styled)\n *\n * The collapsed/maximized state search affordance that transitions\n * to Focused State (SearchView) on click/focus.\n *\n * Anatomy:\n * [Container] [Leading icon] [Supporting text/input] [Trailing actions] [Avatar]\n *\n * Features:\n * - MD3 state layer with hover/active opacity transitions\n * - Ripple effect on press (Material Design state 4)\n * - Focus indicator: 3dp ring in secondary color\n * - M3 Expressive pane margin transition (24dp → 12dp on focus)\n * - Automatic `noActions` variant when no trailing actions/avatar\n *\n * @example\n * ```tsx\n * <SearchBar\n * placeholder=\"Search messages\"\n * leadingIcon={<SearchIcon />}\n * trailingActions={[<IconButton key=\"mic\" icon={<MicIcon />} aria-label=\"Voice search\" />]}\n * onFocus={() => setOpen(true)}\n * />\n * ```\n */\nexport const SearchBar = forwardRef<HTMLFormElement, SearchBarProps>(\n (\n {\n value,\n defaultValue,\n onChange,\n onSubmit,\n onClear,\n placeholder,\n leadingIcon,\n trailingActions,\n avatar,\n isDisabled = false,\n \"aria-label\": ariaLabel,\n className,\n searchStyle = \"contained\",\n onFocus,\n onBlur,\n },\n ref\n ) => {\n const hasNoActions = (!trailingActions || trailingActions.length === 0) && !avatar;\n\n const reducedMotion = useReducedMotion();\n const [isFocused, setIsFocused] = useState(false);\n\n const handleFocusInternal = useCallback(() => {\n setIsFocused(true);\n onFocus?.();\n }, [onFocus]);\n\n const handleBlurInternal = useCallback(() => {\n setIsFocused(false);\n onBlur?.();\n }, [onBlur]);\n\n const { onMouseDown: handleRipple, ripples } = useRipple({\n disabled: isDisabled,\n });\n\n const styledLeadingIcon = leadingIcon ? (\n <span className=\"text-on-surface flex size-12 shrink-0 items-center justify-center\">\n <span className=\"size-6\">{leadingIcon}</span>\n </span>\n ) : undefined;\n\n const styledTrailingActions = trailingActions?.map((action, index) => (\n <span\n key={index}\n className=\"text-on-surface-variant flex size-12 shrink-0 items-center justify-center\"\n >\n {action}\n </span>\n ));\n\n const styledAvatar = avatar ? (\n <span className=\"flex size-12 shrink-0 items-center justify-center\">\n <span className=\"size-[30px] overflow-hidden rounded-full\">{avatar}</span>\n </span>\n ) : undefined;\n\n return (\n <div\n className={cn(\n reducedMotion ? \"\" : \"duration-short4 ease-standard transition-[margin]\",\n isFocused ? \"mx-3\" : \"mx-6\"\n )}\n >\n <div\n role=\"presentation\"\n className={cn(\n \"group relative overflow-hidden rounded-full\",\n \"has-[:focus-visible]:ring-secondary has-[:focus-visible]:ring-3\",\n searchBarVariants({\n style: searchStyle,\n noActions: hasNoActions,\n disabled: isDisabled,\n }),\n className\n )}\n onMouseDown={handleRipple}\n >\n <span\n data-slot=\"state-layer\"\n className={cn(\n \"bg-on-surface pointer-events-none absolute inset-0 rounded-full opacity-0\",\n \"group-hover:opacity-8 group-active:opacity-10\",\n \"duration-spring-standard-fast-effects ease-spring-standard-fast-effects transition-opacity\"\n )}\n />\n\n <SearchBarHeadless\n ref={ref}\n {...(value !== undefined ? { value } : {})}\n {...(defaultValue !== undefined ? { defaultValue } : {})}\n {...(onChange !== undefined ? { onChange } : {})}\n {...(onSubmit !== undefined ? { onSubmit } : {})}\n {...(onClear !== undefined ? { onClear } : {})}\n {...(placeholder !== undefined ? { placeholder } : {})}\n {...(styledLeadingIcon !== undefined ? { leadingIcon: styledLeadingIcon } : {})}\n {...(styledTrailingActions !== undefined\n ? { trailingActions: styledTrailingActions }\n : {})}\n {...(styledAvatar !== undefined ? { avatar: styledAvatar } : {})}\n {...(isDisabled !== undefined ? { isDisabled } : {})}\n {...(ariaLabel !== undefined ? { \"aria-label\": ariaLabel } : {})}\n onFocus={handleFocusInternal}\n onBlur={handleBlurInternal}\n className={cn(\n \"relative z-0 flex h-full w-full items-center\",\n \"[&_input]:flex-1 [&_input]:bg-transparent [&_input]:outline-none\",\n \"[&_input]:text-body-large [&_input]:text-on-surface\",\n \"[&_input]:placeholder:text-on-surface-variant\",\n \"[&_input]:focus-visible:outline-none\"\n )}\n />\n\n {ripples}\n </div>\n </div>\n );\n }\n);\n\nSearchBar.displayName = \"SearchBar\";\n","\"use client\";\n\nimport { forwardRef } from \"react\";\nimport { SearchViewHeadless } from \"./SearchHeadless\";\nimport { searchViewVariants } from \"./Search.variants\";\nimport { cn } from \"../../utils/cn\";\nimport type { SearchViewProps } from \"./Search.types\";\n\n/**\n * Material Design 3 Search View Component (Layer 3: Styled)\n *\n * The expanded/focused search experience with input and results.\n * Displayed in a portal over page content.\n *\n * Anatomy:\n * Header: [Back arrow] [Input] [Clear button] [Optional trailing actions]\n * Divider (divided style only)\n * Content area: children (suggestions/results via List component)\n *\n * Features:\n * - Portal rendering with focus trap and scroll lock (via headless)\n * - Compound variants for 4 style+layout combinations\n * - Animate on mount with `animate-md-scale-in`\n * - Clear button visible only when input has value\n * - aria-live region for autosuggest announcements\n *\n * @example\n * ```tsx\n * <SearchView\n * isOpen={isOpen}\n * onClose={() => setOpen(false)}\n * aria-label=\"Search messages\"\n * searchStyle=\"contained\"\n * layout=\"fullscreen\"\n * >\n * <List>{suggestions.map(s => <ListItem key={s.id} headline={s.label} />)}</List>\n * </SearchView>\n * ```\n */\nexport const SearchView = forwardRef<HTMLDivElement, SearchViewProps>(\n (\n {\n isOpen,\n onClose,\n value,\n defaultValue,\n onChange,\n onSubmit,\n placeholder,\n \"aria-label\": ariaLabel,\n className,\n children,\n searchStyle = \"contained\",\n layout = \"fullscreen\",\n leadingIcon,\n trailingActions,\n showDivider,\n },\n ref\n ) => {\n const resolvedShowDivider = showDivider ?? searchStyle === \"divided\";\n\n const styledLeadingIcon = leadingIcon ? (\n <span className=\"text-on-surface flex size-12 shrink-0 items-center justify-center\">\n {leadingIcon}\n </span>\n ) : undefined;\n\n const styledTrailingActions = trailingActions?.map((action, index) => (\n <span\n key={index}\n className=\"text-on-surface-variant flex size-12 shrink-0 items-center justify-center\"\n >\n {action}\n </span>\n ));\n\n return (\n <SearchViewHeadless\n ref={ref}\n isOpen={isOpen}\n onClose={onClose}\n {...(value !== undefined ? { value } : {})}\n {...(defaultValue !== undefined ? { defaultValue } : {})}\n {...(onChange !== undefined ? { onChange } : {})}\n {...(onSubmit !== undefined ? { onSubmit } : {})}\n {...(placeholder !== undefined ? { placeholder } : {})}\n aria-label={ariaLabel}\n {...(styledLeadingIcon !== undefined ? { leadingIcon: styledLeadingIcon } : {})}\n {...(styledTrailingActions !== undefined ? { trailingActions: styledTrailingActions } : {})}\n showDivider={resolvedShowDivider}\n className={cn(\n searchViewVariants({ style: searchStyle, layout }),\n \"animate-md-scale-in\",\n getHeaderClasses(searchStyle, layout),\n slotClasses,\n className\n )}\n >\n {children}\n </SearchViewHeadless>\n );\n }\n);\n\nSearchView.displayName = \"SearchView\";\n\n/**\n * Static slot styling applied via descendant selectors on the container.\n * Targets data-slot attributes rendered by SearchViewHeadless.\n */\nconst slotClasses = cn(\n // Input styling\n \"[&_input]:flex-1 [&_input]:bg-transparent [&_input]:outline-none\",\n \"[&_input]:text-body-large [&_input]:text-on-surface\",\n \"[&_input]:placeholder:text-on-surface-variant\",\n // Divider\n \"[&>[data-slot=divider]]:border-outline\",\n // Content area\n \"[&>[data-slot=content]]:flex-1 [&>[data-slot=content]]:overflow-y-auto\",\n // Clear button\n \"[&_[data-slot=clear-button]]:size-12 [&_[data-slot=clear-button]]:flex\",\n \"[&_[data-slot=clear-button]]:items-center [&_[data-slot=clear-button]]:justify-center\",\n \"[&_[data-slot=clear-button]]:text-on-surface-variant\",\n \"[&_[data-slot=clear-button]]:transition-opacity [&_[data-slot=clear-button]]:duration-short4\",\n \"[&_[data-slot=clear-button]]:ease-standard\",\n // Back button\n \"[&_[data-slot=back-button]]:size-12 [&_[data-slot=back-button]]:flex\",\n \"[&_[data-slot=back-button]]:items-center [&_[data-slot=back-button]]:justify-center\",\n \"[&_[data-slot=back-button]]:text-on-surface\"\n);\n\n/**\n * Resolves header height and padding based on style + layout combination.\n * Contained: 56dp height, 12dp (px-3) side padding.\n * Divided + fullscreen: 72dp height, 16dp (px-4) side padding.\n * Divided + docked (or any docked): 56dp height.\n */\nfunction getHeaderClasses(style: \"contained\" | \"divided\", layout: \"fullscreen\" | \"docked\"): string {\n const base =\n \"[&>[data-slot=header]]:flex [&>[data-slot=header]]:items-center [&>[data-slot=header]]:w-full [&>[data-slot=header]]:bg-surface-container-high [&>[data-slot=header]]:gap-1\";\n\n if (layout === \"docked\") {\n return cn(\n base,\n \"[&>[data-slot=header]]:h-14\",\n style === \"contained\" ? \"[&>[data-slot=header]]:px-3\" : \"[&>[data-slot=header]]:px-4\"\n );\n }\n\n if (style === \"contained\") {\n return cn(base, \"[&>[data-slot=header]]:h-14 [&>[data-slot=header]]:px-3\");\n }\n\n return cn(base, \"[&>[data-slot=header]]:h-[72px] [&>[data-slot=header]]:px-4\");\n}\n","\"use client\";\n\nimport { forwardRef, useState, useCallback } from \"react\";\nimport { SearchBar } from \"./SearchBar\";\nimport { SearchView } from \"./SearchView\";\nimport type { SearchProps } from \"./Search.types\";\n\n/**\n * Material Design 3 Search Compound Component (Layer 3: Styled)\n *\n * Combines SearchBar + SearchView in one controlled/uncontrolled unit.\n * Manages the open/close lifecycle between the collapsed bar and expanded view.\n *\n * - When closed: renders SearchBar; focus → opens SearchView\n * - When open: renders SearchView; back/Escape → closes to SearchBar\n *\n * @example\n * ```tsx\n * // Uncontrolled\n * <Search placeholder=\"Search messages\">\n * <List>{suggestions.map(s => <ListItem key={s.id} headline={s.label} />)}</List>\n * </Search>\n *\n * // Controlled\n * <Search\n * isOpen={isOpen}\n * onOpenChange={setOpen}\n * value={query}\n * onChange={setQuery}\n * placeholder=\"Search files\"\n * >\n * <List>{results.map(r => <ListItem key={r.id} headline={r.label} />)}</List>\n * </Search>\n * ```\n */\nexport const Search = forwardRef<HTMLFormElement, SearchProps>(\n (\n {\n isOpen: controlledIsOpen,\n onOpenChange,\n value,\n defaultValue,\n onChange,\n onSubmit,\n onClear,\n placeholder,\n leadingIcon,\n trailingActions,\n avatar,\n isDisabled = false,\n \"aria-label\": ariaLabel,\n className,\n searchStyle = \"contained\",\n layout = \"fullscreen\",\n children,\n viewAriaLabel,\n },\n ref\n ) => {\n const [internalIsOpen, setInternalIsOpen] = useState(false);\n const isControlled = controlledIsOpen !== undefined;\n const isOpen = isControlled ? controlledIsOpen : internalIsOpen;\n\n const handleOpenChange = useCallback(\n (open: boolean) => {\n if (!isControlled) {\n setInternalIsOpen(open);\n }\n onOpenChange?.(open);\n },\n [isControlled, onOpenChange]\n );\n\n const handleFocus = useCallback(() => {\n handleOpenChange(true);\n }, [handleOpenChange]);\n\n const handleClose = useCallback(() => {\n handleOpenChange(false);\n }, [handleOpenChange]);\n\n if (isOpen) {\n return (\n <SearchView\n isOpen\n onClose={handleClose}\n {...(value !== undefined ? { value } : {})}\n {...(defaultValue !== undefined ? { defaultValue } : {})}\n {...(onChange !== undefined ? { onChange } : {})}\n {...(onSubmit !== undefined ? { onSubmit } : {})}\n {...(placeholder !== undefined ? { placeholder } : {})}\n aria-label={viewAriaLabel ?? ariaLabel ?? placeholder ?? \"Search\"}\n searchStyle={searchStyle}\n layout={layout}\n {...(trailingActions !== undefined ? { trailingActions } : {})}\n >\n {children}\n </SearchView>\n );\n }\n\n return (\n <SearchBar\n ref={ref}\n {...(value !== undefined ? { value } : {})}\n {...(defaultValue !== undefined ? { defaultValue } : {})}\n {...(onChange !== undefined ? { onChange } : {})}\n {...(onSubmit !== undefined ? { onSubmit } : {})}\n {...(onClear !== undefined ? { onClear } : {})}\n {...(placeholder !== undefined ? { placeholder } : {})}\n {...(leadingIcon !== undefined ? { leadingIcon } : {})}\n {...(trailingActions !== undefined ? { trailingActions } : {})}\n {...(avatar !== undefined ? { avatar } : {})}\n isDisabled={isDisabled}\n {...(ariaLabel !== undefined ? { \"aria-label\": ariaLabel } : {})}\n {...(className !== undefined ? { className } : {})}\n searchStyle={searchStyle}\n onFocus={handleFocus}\n />\n );\n }\n);\n\nSearch.displayName = \"Search\";\n","import { cva, type VariantProps } from \"class-variance-authority\";\n\n/**\n * Material Design 3 Split Button — Container Variants (CVA)\n *\n * Defines the outer container styling for the split button group.\n * Maps `variant`, `size`, and `isDisabled` to MD3 design tokens via Tailwind.\n */\nexport const splitButtonContainerVariants = cva(\n [\"inline-flex items-center rounded-full overflow-hidden\"],\n {\n variants: {\n variant: {\n filled: \"bg-primary shadow-elevation-0 hover:shadow-elevation-1\",\n tonal: \"bg-secondary-container\",\n outlined: \"border border-outline bg-transparent\",\n },\n\n size: {\n small: \"h-8\",\n medium: \"h-10\",\n large: \"h-12\",\n },\n\n isDisabled: {\n true: \"opacity-38 pointer-events-none\",\n false: \"\",\n },\n },\n\n defaultVariants: {\n variant: \"filled\",\n size: \"medium\",\n isDisabled: false,\n },\n }\n);\n\n/**\n * Material Design 3 Split Button — Primary Segment Variants (CVA)\n *\n * Applies text color, padding, and the Tailwind group name (`group/primary`)\n * to the primary action segment. The group name is required so that the\n * nested state-layer span can target `group-hover/primary:opacity-8`.\n * The divider between segments is rendered via the dropdown's `border-l`.\n */\nexport const splitButtonPrimaryVariants = cva(\n [\n \"group/primary relative inline-flex items-center justify-center cursor-pointer\",\n \"h-full font-medium tracking-[0.1px]\",\n \"focus-visible:outline-primary focus-visible:outline-2 focus-visible:outline-offset-2\",\n ],\n {\n variants: {\n variant: {\n filled: \"text-on-primary\",\n tonal: \"text-on-secondary-container\",\n outlined: \"text-primary\",\n },\n\n size: {\n small: \"pl-4 pr-3 text-xs\",\n medium: \"pl-6 pr-4 text-sm\",\n large: \"pl-8 pr-5 text-base\",\n },\n },\n\n defaultVariants: {\n variant: \"filled\",\n size: \"medium\",\n },\n }\n);\n\n/**\n * Material Design 3 Split Button — Dropdown Trigger Variants (CVA)\n *\n * Applies text color, padding, the visual divider (left border), and the\n * Tailwind group name (`group/dropdown`) to the dropdown trigger segment.\n * The group name is required so that the nested state-layer span can target\n * `group-hover/dropdown:opacity-8`.\n */\nexport const splitButtonDropdownVariants = cva(\n [\n \"group/dropdown relative inline-flex items-center justify-center cursor-pointer\",\n \"h-full\",\n \"focus-visible:outline-primary focus-visible:outline-2 focus-visible:outline-offset-2\",\n ],\n {\n variants: {\n variant: {\n filled: \"text-on-primary border-l border-on-primary/38\",\n tonal: \"text-on-secondary-container border-l border-on-secondary-container/38\",\n outlined: \"text-primary border-l border-outline\",\n },\n\n size: {\n small: \"px-1.5\",\n medium: \"px-2\",\n large: \"px-3\",\n },\n },\n\n defaultVariants: {\n variant: \"filled\",\n size: \"medium\",\n },\n }\n);\n\nexport type SplitButtonContainerVariants = VariantProps<typeof splitButtonContainerVariants>;\nexport type SplitButtonPrimaryVariants = VariantProps<typeof splitButtonPrimaryVariants>;\nexport type SplitButtonDropdownVariants = VariantProps<typeof splitButtonDropdownVariants>;\n\n/**\n * Convenience bundle of all three Split Button CVA functions.\n * Useful for consumers that want a single import point.\n */\nexport const splitButtonVariants = {\n container: splitButtonContainerVariants,\n primary: splitButtonPrimaryVariants,\n dropdown: splitButtonDropdownVariants,\n};\n","\"use client\";\n\nimport { forwardRef, useRef, useCallback, useEffect, type MouseEvent } from \"react\";\nimport { useButton } from \"react-aria\";\nimport { useMenuTriggerState } from \"react-stately\";\nimport {\n splitButtonContainerVariants,\n splitButtonPrimaryVariants,\n splitButtonDropdownVariants,\n} from \"./SplitButton.variants\";\nimport { useRipple } from \"../../hooks/useRipple\";\nimport { cn } from \"../../utils/cn\";\nimport type { SplitButtonProps, SplitButtonMenuItem } from \"./SplitButton.types\";\n\n/**\n * Chevron-down SVG icon for the dropdown trigger.\n * Rotates 180° when the menu is open.\n */\nconst ChevronIcon = ({ isOpen }: { isOpen: boolean }): React.ReactElement => (\n <svg\n aria-hidden=\"true\"\n data-testid=\"split-button-chevron\"\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={cn(\"duration-short4 ease-standard transition-transform\", isOpen && \"rotate-180\")}\n >\n <path d=\"M7 10l5 5 5-5H7z\" fill=\"currentColor\" />\n </svg>\n);\n\n/**\n * Material Design 3 Split Button Component (Layer 3: Styled)\n *\n * Combines a primary action button with a dropdown trigger that reveals\n * secondary actions in a menu. Both segments include MD3 state layers and\n * ripple effects.\n *\n * Features:\n * - 3 MD3 variants: filled, tonal, outlined\n * - Per-segment state layers (hover 8%, focus/pressed 12%)\n * - Ripple effect on both segments\n * - Chevron rotation animation on menu open\n * - Visual divider between segments per MD3 spec\n * - Full keyboard accessibility via React Aria\n *\n * @example\n * ```tsx\n * <SplitButton\n * variant=\"filled\"\n * primaryLabel=\"Save\"\n * onPrimaryAction={() => console.log('saved')}\n * items={[\n * { label: 'Save as draft', onAction: () => {} },\n * { label: 'Save and close', onAction: () => {} }\n * ]}\n * />\n * ```\n */\nexport const SplitButton = forwardRef<HTMLDivElement, SplitButtonProps>(\n (\n {\n variant = \"filled\",\n size = \"medium\",\n primaryLabel,\n onPrimaryAction,\n items,\n isDisabled = false,\n \"aria-label\": ariaLabel,\n className,\n },\n forwardedRef\n ) => {\n const primaryRef = useRef<HTMLButtonElement>(null);\n const dropdownRef = useRef<HTMLButtonElement>(null);\n const menuRef = useRef<HTMLUListElement>(null);\n\n const menuState = useMenuTriggerState({});\n\n const { buttonProps: primaryButtonProps } = useButton(\n {\n isDisabled,\n onPress: onPrimaryAction,\n elementType: \"button\",\n },\n primaryRef\n );\n\n const handleDropdownPress = useCallback(() => {\n if (menuState.isOpen) {\n menuState.close();\n } else {\n menuState.open();\n }\n }, [menuState]);\n\n const { buttonProps: dropdownButtonProps } = useButton(\n {\n isDisabled,\n onPress: handleDropdownPress,\n elementType: \"button\",\n },\n dropdownRef\n );\n\n const handleMenuItemSelect = useCallback(\n (item: SplitButtonMenuItem) => {\n if (!item.isDisabled) {\n item.onAction();\n menuState.close();\n }\n },\n [menuState]\n );\n\n useEffect(() => {\n if (!menuState.isOpen) return;\n\n const handleGlobalKeyDown = (e: KeyboardEvent): void => {\n if (e.key === \"Escape\") {\n menuState.close();\n dropdownRef.current?.focus();\n }\n };\n\n document.addEventListener(\"keydown\", handleGlobalKeyDown);\n return () => {\n document.removeEventListener(\"keydown\", handleGlobalKeyDown);\n };\n }, [menuState, menuState.isOpen]);\n\n const handleMenuKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLUListElement>) => {\n const menuItems = Array.from(\n e.currentTarget.querySelectorAll<HTMLElement>(\n '[role=\"menuitem\"]:not([aria-disabled=\"true\"])'\n )\n );\n const currentIndex = menuItems.indexOf(document.activeElement as HTMLElement);\n\n switch (e.key) {\n case \"ArrowDown\": {\n e.preventDefault();\n menuItems[(currentIndex + 1) % menuItems.length]?.focus();\n break;\n }\n case \"ArrowUp\": {\n e.preventDefault();\n menuItems[(currentIndex - 1 + menuItems.length) % menuItems.length]?.focus();\n break;\n }\n case \"Home\": {\n e.preventDefault();\n menuItems[0]?.focus();\n break;\n }\n case \"End\": {\n e.preventDefault();\n menuItems[menuItems.length - 1]?.focus();\n break;\n }\n case \"Escape\": {\n menuState.close();\n dropdownRef.current?.focus();\n break;\n }\n default:\n break;\n }\n },\n [menuState]\n );\n\n // Auto-focus the first enabled menu item when the menu opens so keyboard\n // users can navigate immediately without an extra Tab press.\n useEffect(() => {\n if (menuState.isOpen && menuRef.current) {\n const firstItem = menuRef.current.querySelector<HTMLElement>(\n '[role=\"menuitem\"]:not([aria-disabled=\"true\"])'\n );\n firstItem?.focus();\n }\n }, [menuState.isOpen]);\n\n const handleMenuItemKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLLIElement>, item: SplitButtonMenuItem) => {\n if ((e.key === \"Enter\" || e.key === \" \") && !item.isDisabled) {\n e.preventDefault();\n item.onAction();\n menuState.close();\n }\n },\n [menuState]\n );\n\n const { onMouseDown: handlePrimaryRipple, ripples: primaryRipples } = useRipple({\n disabled: isDisabled,\n });\n\n const { onMouseDown: handleDropdownRipple, ripples: dropdownRipples } = useRipple({\n disabled: isDisabled,\n });\n\n const onPrimaryMouseDown = useCallback(\n (e: MouseEvent<HTMLButtonElement>) => {\n const ariaHandler = primaryButtonProps.onMouseDown as\n | ((e: MouseEvent<HTMLElement>) => void)\n | undefined;\n ariaHandler?.(e);\n handlePrimaryRipple(e);\n },\n [primaryButtonProps, handlePrimaryRipple]\n );\n\n const onDropdownMouseDown = useCallback(\n (e: MouseEvent<HTMLButtonElement>) => {\n const ariaHandler = dropdownButtonProps.onMouseDown as\n | ((e: MouseEvent<HTMLElement>) => void)\n | undefined;\n ariaHandler?.(e);\n handleDropdownRipple(e);\n },\n [dropdownButtonProps, handleDropdownRipple]\n );\n\n return (\n <div className=\"relative inline-flex\">\n <div\n ref={forwardedRef}\n role=\"group\"\n aria-label={ariaLabel ?? `${primaryLabel} split button`}\n className={cn(splitButtonContainerVariants({ variant, size, isDisabled }), className)}\n >\n {/* Primary action segment */}\n <button\n {...primaryButtonProps}\n ref={primaryRef}\n type=\"button\"\n tabIndex={isDisabled ? -1 : 0}\n onMouseDown={onPrimaryMouseDown}\n className={splitButtonPrimaryVariants({ variant, size })}\n >\n <span\n data-testid=\"primary-state-layer\"\n aria-hidden=\"true\"\n className={cn(\n \"pointer-events-none absolute inset-0 bg-current opacity-0\",\n \"duration-spring-standard-fast-effects ease-spring-standard-fast-effects transition-opacity\",\n \"group-hover/primary:opacity-8\"\n )}\n />\n {primaryRipples}\n <span className=\"relative z-10\">{primaryLabel}</span>\n </button>\n\n {/* Visual divider — rendered via border-l on the dropdown segment */}\n <span data-testid=\"split-button-divider\" aria-hidden=\"true\" />\n\n {/* Dropdown trigger segment */}\n <button\n {...dropdownButtonProps}\n ref={dropdownRef}\n type=\"button\"\n tabIndex={isDisabled ? -1 : 0}\n aria-haspopup=\"menu\"\n aria-expanded={menuState.isOpen}\n aria-label={`${primaryLabel} options, expand`}\n onMouseDown={onDropdownMouseDown}\n className={splitButtonDropdownVariants({ variant, size })}\n >\n <span\n data-testid=\"dropdown-state-layer\"\n aria-hidden=\"true\"\n className={cn(\n \"pointer-events-none absolute inset-0 bg-current opacity-0\",\n \"duration-spring-standard-fast-effects ease-spring-standard-fast-effects transition-opacity\",\n \"group-hover/dropdown:opacity-8\"\n )}\n />\n {dropdownRipples}\n <span className=\"relative z-10\">\n <ChevronIcon isOpen={menuState.isOpen} />\n </span>\n </button>\n </div>\n\n {/* Dropdown menu — sibling to the group container so it is NOT clipped\n by `overflow-hidden`; positioned relative to the outer wrapper. */}\n {menuState.isOpen && (\n <ul\n ref={menuRef}\n role=\"menu\"\n aria-label={`${primaryLabel} options`}\n onKeyDown={handleMenuKeyDown}\n className={cn(\n \"bg-surface-container absolute top-full right-0 z-50 mt-1 min-w-40 rounded-md py-2\",\n \"shadow-elevation-2\"\n )}\n >\n {items.map((item) => (\n <li\n key={item.label}\n role=\"menuitem\"\n tabIndex={item.isDisabled ? -1 : 0}\n aria-disabled={item.isDisabled ?? undefined}\n onClick={() => handleMenuItemSelect(item)}\n onKeyDown={(e) => handleMenuItemKeyDown(e, item)}\n className={cn(\n \"text-body-large text-on-surface cursor-pointer px-4 py-2\",\n \"hover:bg-on-surface/8\",\n item.isDisabled && \"text-on-surface/38 pointer-events-none\"\n )}\n >\n {item.label}\n </li>\n ))}\n </ul>\n )}\n </div>\n );\n }\n);\n\nSplitButton.displayName = \"SplitButton\";\n","\"use client\";\n\nimport { forwardRef, useRef, useCallback, useEffect } from \"react\";\nimport { useButton } from \"react-aria\";\nimport { useMenuTriggerState } from \"react-stately\";\nimport type { SplitButtonHeadlessProps, SplitButtonMenuItem } from \"./SplitButton.types\";\n\n/**\n * Headless Split Button Component (Layer 2)\n *\n * Unstyled two-segment button primitive using React Aria for accessibility.\n * Provides behavior only — bring your own styles.\n *\n * Structure:\n * - Primary segment: triggers the main action\n * - Divider: visual separator (1dp vertical line)\n * - Dropdown trigger: opens/closes the dropdown menu\n *\n * Both segments are independently focusable via Tab navigation.\n * The dropdown trigger manages `aria-haspopup` and `aria-expanded`.\n *\n * @example\n * ```tsx\n * <SplitButtonHeadless\n * primaryLabel=\"Save\"\n * onPrimaryAction={() => save()}\n * items={[\n * { label: 'Save as PDF', onAction: () => savePDF() },\n * { label: 'Save as PNG', onAction: () => savePNG() },\n * ]}\n * />\n * ```\n */\nexport const SplitButtonHeadless = forwardRef<HTMLDivElement, SplitButtonHeadlessProps>(\n (\n {\n primaryLabel,\n onPrimaryAction,\n items,\n isDisabled = false,\n \"aria-label\": ariaLabel,\n className,\n },\n forwardedRef\n ) => {\n const primaryRef = useRef<HTMLButtonElement>(null);\n const dropdownRef = useRef<HTMLButtonElement>(null);\n const menuRef = useRef<HTMLUListElement>(null);\n\n const menuState = useMenuTriggerState({});\n\n const { buttonProps: primaryButtonProps } = useButton(\n {\n isDisabled,\n onPress: onPrimaryAction,\n elementType: \"button\",\n },\n primaryRef\n );\n\n const handleDropdownPress = useCallback(() => {\n if (menuState.isOpen) {\n menuState.close();\n } else {\n menuState.open();\n }\n }, [menuState]);\n\n const { buttonProps: dropdownButtonProps } = useButton(\n {\n isDisabled,\n onPress: handleDropdownPress,\n elementType: \"button\",\n },\n dropdownRef\n );\n\n const handleMenuItemSelect = useCallback(\n (item: SplitButtonMenuItem) => {\n if (!item.isDisabled) {\n item.onAction();\n menuState.close();\n }\n },\n [menuState]\n );\n\n useEffect(() => {\n if (!menuState.isOpen) return;\n\n const handleGlobalKeyDown = (e: KeyboardEvent): void => {\n if (e.key === \"Escape\") {\n menuState.close();\n dropdownRef.current?.focus();\n }\n };\n\n document.addEventListener(\"keydown\", handleGlobalKeyDown);\n return () => {\n document.removeEventListener(\"keydown\", handleGlobalKeyDown);\n };\n }, [menuState, menuState.isOpen]);\n\n const handleMenuKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLUListElement>) => {\n const menuItems = Array.from(\n e.currentTarget.querySelectorAll<HTMLElement>(\n '[role=\"menuitem\"]:not([aria-disabled=\"true\"])'\n )\n );\n const currentIndex = menuItems.indexOf(document.activeElement as HTMLElement);\n\n switch (e.key) {\n case \"ArrowDown\": {\n e.preventDefault();\n menuItems[(currentIndex + 1) % menuItems.length]?.focus();\n break;\n }\n case \"ArrowUp\": {\n e.preventDefault();\n menuItems[(currentIndex - 1 + menuItems.length) % menuItems.length]?.focus();\n break;\n }\n case \"Home\": {\n e.preventDefault();\n menuItems[0]?.focus();\n break;\n }\n case \"End\": {\n e.preventDefault();\n menuItems[menuItems.length - 1]?.focus();\n break;\n }\n case \"Escape\": {\n menuState.close();\n dropdownRef.current?.focus();\n break;\n }\n default:\n break;\n }\n },\n [menuState]\n );\n\n // Auto-focus the first enabled menu item when the menu opens so keyboard\n // users can navigate immediately without an extra Tab press.\n useEffect(() => {\n if (menuState.isOpen && menuRef.current) {\n const firstItem = menuRef.current.querySelector<HTMLElement>(\n '[role=\"menuitem\"]:not([aria-disabled=\"true\"])'\n );\n firstItem?.focus();\n }\n }, [menuState.isOpen]);\n\n const handleMenuItemKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLLIElement>, item: SplitButtonMenuItem) => {\n if ((e.key === \"Enter\" || e.key === \" \") && !item.isDisabled) {\n e.preventDefault();\n item.onAction();\n menuState.close();\n }\n },\n [menuState]\n );\n\n return (\n <div\n ref={forwardedRef}\n role=\"group\"\n aria-label={ariaLabel ?? `${primaryLabel} split button`}\n className={className}\n >\n {/* Primary action segment */}\n <button\n {...primaryButtonProps}\n ref={primaryRef}\n type=\"button\"\n tabIndex={isDisabled ? -1 : 0}\n >\n {primaryLabel}\n </button>\n\n {/* Visual divider */}\n <span aria-hidden=\"true\" />\n\n {/* Dropdown trigger segment */}\n <button\n {...dropdownButtonProps}\n ref={dropdownRef}\n type=\"button\"\n tabIndex={isDisabled ? -1 : 0}\n aria-haspopup=\"menu\"\n aria-expanded={menuState.isOpen}\n aria-label={`${primaryLabel} options, expand`}\n >\n <svg\n aria-hidden=\"true\"\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M7 10l5 5 5-5H7z\" fill=\"currentColor\" />\n </svg>\n </button>\n\n {/* Dropdown menu */}\n {menuState.isOpen && (\n <ul\n ref={menuRef}\n role=\"menu\"\n aria-label={`${primaryLabel} options`}\n onKeyDown={handleMenuKeyDown}\n >\n {items.map((item) => (\n <li\n key={item.label}\n role=\"menuitem\"\n tabIndex={item.isDisabled ? -1 : 0}\n aria-disabled={item.isDisabled ?? undefined}\n onClick={() => handleMenuItemSelect(item)}\n onKeyDown={(e) => handleMenuItemKeyDown(e, item)}\n >\n {item.label}\n </li>\n ))}\n </ul>\n )}\n </div>\n );\n }\n);\n\nSplitButtonHeadless.displayName = \"SplitButtonHeadless\";\n\nexport { type SplitButtonHeadlessProps };\n","\"use client\";\n\nimport {\n Children,\n createContext,\n forwardRef,\n useCallback,\n useContext,\n useRef,\n useState,\n} from \"react\";\nimport { useButton } from \"react-aria\";\nimport { mergeProps } from \"@react-aria/utils\";\n\nimport { useReducedMotion } from \"../../hooks/useReducedMotion\";\nimport { cn } from \"../../utils/cn\";\nimport type { FABMenuContextValue, FABMenuHeadlessProps } from \"./FABMenu.types\";\n\n/**\n * Context for FABMenu — provides open state, direction, and reduced motion\n * preference to child `FABMenuItem` components.\n */\nexport const FABMenuContext = createContext<FABMenuContextValue>({\n isOpen: false,\n isExiting: false,\n direction: \"up\",\n reducedMotion: false,\n itemCount: 0,\n});\n\n/**\n * Hook to consume FABMenuContext from within a FABMenuItem or custom child.\n *\n * @example\n * ```tsx\n * const { isOpen, direction, reducedMotion } = useFABMenuContext();\n * ```\n */\nexport function useFABMenuContext(): FABMenuContextValue {\n return useContext(FABMenuContext);\n}\n\nconst DIRECTION_CLASSES: Record<string, string> = {\n up: \"flex-col-reverse\",\n down: \"flex-col\",\n left: \"flex-row-reverse\",\n right: \"flex-row\",\n};\n\n/**\n * FABMenuHeadless — Layer 2 headless primitive for the MD3 FAB Menu.\n *\n * Manages open/close state, keyboard interactions, and ARIA attributes\n * without opinionated styling. Uses `useButton` from React Aria for the\n * trigger element and controlled/uncontrolled state management.\n *\n * Features:\n * - Controlled and uncontrolled open state\n * - `useReducedMotion` animation guard\n * - Keyboard: Escape closes, trigger toggles via Enter/Space (via useButton)\n * - ARIA: `aria-expanded` on trigger, `aria-label` on trigger\n * - Context provider for child FABMenuItem components\n * - `forwardRef` to root element\n *\n * @example\n * ```tsx\n * <FABMenuHeadless aria-label=\"Quick actions\" direction=\"up\">\n * <FABMenuItem icon={<IconEdit />} aria-label=\"Edit\" />\n * <FABMenuItem icon={<IconShare />} aria-label=\"Share\" />\n * </FABMenuHeadless>\n * ```\n */\nexport const FABMenuHeadless = forwardRef<HTMLDivElement, FABMenuHeadlessProps>(\n (\n {\n open: controlledOpen,\n defaultOpen = false,\n onOpenChange,\n direction = \"up\",\n \"aria-label\": ariaLabel,\n className,\n children,\n },\n forwardedRef\n ) => {\n const triggerRef = useRef<HTMLButtonElement>(null);\n const internalRootRef = useRef<HTMLDivElement>(null);\n const rootRef = (forwardedRef ?? internalRootRef) as React.RefObject<HTMLDivElement>;\n\n const reducedMotion = useReducedMotion();\n\n const isControlled = controlledOpen !== undefined;\n const [internalOpen, setInternalOpen] = useState(defaultOpen);\n const isOpen = isControlled ? controlledOpen : internalOpen;\n\n const itemCount = Children.count(children);\n\n const setIsOpen = useCallback(\n (next: boolean) => {\n if (!isControlled) {\n setInternalOpen(next);\n }\n onOpenChange?.(next);\n },\n [isControlled, onOpenChange]\n );\n\n const toggle = useCallback(() => {\n setIsOpen(!isOpen);\n }, [setIsOpen, isOpen]);\n\n const close = useCallback(() => {\n setIsOpen(false);\n }, [setIsOpen]);\n\n const { buttonProps } = useButton(\n {\n onPress: toggle,\n \"aria-label\": ariaLabel,\n \"aria-expanded\": isOpen,\n },\n triggerRef\n );\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLDivElement>) => {\n if (e.key === \"Escape\" && isOpen) {\n e.stopPropagation();\n close();\n triggerRef.current?.focus();\n return;\n }\n if (isOpen && (e.key === \"ArrowUp\" || e.key === \"ArrowDown\")) {\n e.preventDefault();\n const group = rootRef.current?.querySelector<HTMLElement>('[role=\"group\"]');\n if (!group) return;\n const items = Array.from(\n group.querySelectorAll<HTMLButtonElement>(\"button:not([disabled])\")\n );\n if (items.length === 0) return;\n const currentIndex = items.indexOf(document.activeElement as HTMLButtonElement);\n const nextIndex =\n e.key === \"ArrowUp\"\n ? currentIndex <= 0\n ? items.length - 1\n : currentIndex - 1\n : currentIndex >= items.length - 1\n ? 0\n : currentIndex + 1;\n items[nextIndex]?.focus();\n }\n },\n [isOpen, close, rootRef]\n );\n\n const contextValue: FABMenuContextValue = {\n isOpen,\n isExiting: false,\n direction,\n reducedMotion,\n itemCount,\n };\n\n const triggerProps = mergeProps(buttonProps, {\n type: \"button\" as const,\n });\n\n return (\n <FABMenuContext.Provider value={contextValue}>\n {/* eslint-disable-next-line jsx-a11y/no-static-element-interactions */}\n <div\n ref={rootRef}\n className={cn(\"inline-flex items-center gap-2\", DIRECTION_CLASSES[direction], className)}\n onKeyDown={handleKeyDown}\n >\n {isOpen && (\n <div\n className={cn(\"inline-flex items-center gap-2\", DIRECTION_CLASSES[direction])}\n role=\"group\"\n aria-label={`${ariaLabel} actions`}\n >\n {children}\n </div>\n )}\n {/* eslint-disable-next-line react/button-has-type -- type is set via mergeProps */}\n <button {...triggerProps} ref={triggerRef} />\n </div>\n </FABMenuContext.Provider>\n );\n }\n);\n\nFABMenuHeadless.displayName = \"FABMenuHeadless\";\n","import { cva, type VariantProps } from \"class-variance-authority\";\n\n/**\n * CVA variants for the FABMenu root container.\n *\n * Controls the expansion direction of action items relative to the trigger FAB.\n * Uses gap-3 (12px) for spacing between trigger and items per MD3 spec.\n */\nexport const fabMenuVariants = cva([\"relative\", \"inline-flex\", \"items-end\"], {\n variants: {\n direction: {\n up: [\"flex-col-reverse\", \"gap-3\"],\n down: [\"flex-col\", \"gap-3\"],\n left: [\"flex-row-reverse\", \"gap-3\", \"items-center\"],\n right: [\"flex-row\", \"gap-3\", \"items-center\"],\n },\n },\n defaultVariants: {\n direction: \"up\",\n },\n});\n\n/**\n * CVA variants for individual FABMenuItem containers.\n *\n * Controls visibility and pointer interaction based on open state.\n * Transition classes are applied separately for stagger animation support.\n */\nexport const fabMenuItemVariants = cva(\n [\"relative\", \"flex\", \"items-center\", \"gap-3\", \"cursor-pointer\"],\n {\n variants: {\n isOpen: {\n true: [\"pointer-events-auto\", \"opacity-100\"],\n false: [\"pointer-events-none\", \"opacity-0\"],\n },\n },\n defaultVariants: {\n isOpen: false,\n },\n }\n);\n\nexport type FABMenuVariants = VariantProps<typeof fabMenuVariants>;\nexport type FABMenuItemVariants = VariantProps<typeof fabMenuItemVariants>;\n","\"use client\";\n\nimport {\n Children,\n cloneElement,\n forwardRef,\n isValidElement,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport type React from \"react\";\n\nimport { cn } from \"../../utils/cn\";\nimport { useReducedMotion } from \"../../hooks/useReducedMotion\";\nimport { FABMenuContext } from \"./FABMenuHeadless\";\nimport { FAB } from \"../FAB/FAB\";\nimport { fabMenuVariants } from \"./FABMenu.variants\";\nimport type { FABMenuProps, FABMenuContextValue } from \"./FABMenu.types\";\n\n/**\n * FABMenu — Material Design 3 styled FAB Menu (Layer 3).\n *\n * Renders a trigger FAB that expands a list of mini FAB action items\n * in the specified direction. Manages stagger animation-delay on children,\n * elevation changes on the trigger, and icon rotation.\n *\n * Built on top of FABMenuContext for state sharing with FABMenuItem children.\n * Uses the existing `FAB` component as the trigger button.\n *\n * @example\n * ```tsx\n * <FABMenu aria-label=\"Quick actions\" direction=\"up\">\n * <FABMenuItem icon={<IconEdit />} label=\"Edit\" aria-label=\"Edit\" />\n * <FABMenuItem icon={<IconShare />} label=\"Share\" aria-label=\"Share\" />\n * </FABMenu>\n * ```\n */\nexport const FABMenu = forwardRef<HTMLDivElement, FABMenuProps>(\n (\n {\n open: controlledOpen,\n defaultOpen = false,\n onOpenChange,\n direction = \"up\",\n \"aria-label\": ariaLabel,\n className,\n children,\n },\n forwardedRef\n ) => {\n const triggerRef = useRef<HTMLButtonElement>(null);\n const internalRootRef = useRef<HTMLDivElement>(null);\n const rootRef = (forwardedRef ?? internalRootRef) as React.RefObject<HTMLDivElement>;\n\n const reducedMotion = useReducedMotion();\n\n const isControlled = controlledOpen !== undefined;\n const [internalOpen, setInternalOpen] = useState(defaultOpen);\n const isOpen = isControlled ? controlledOpen : internalOpen;\n\n const [isExiting, setIsExiting] = useState(false);\n const exitTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const itemCountRef = useRef(0);\n\n const itemCount = Children.count(children);\n itemCountRef.current = itemCount;\n\n const setIsOpen = useCallback(\n (next: boolean) => {\n if (!isControlled) {\n setInternalOpen(next);\n }\n onOpenChange?.(next);\n },\n [isControlled, onOpenChange]\n );\n\n const toggle = useCallback(() => {\n setIsOpen(!isOpen);\n }, [setIsOpen, isOpen]);\n\n const close = useCallback(() => {\n setIsOpen(false);\n }, [setIsOpen]);\n\n // Manage exit animation: keep items mounted while scale-out plays, then unmount.\n const prevIsOpenRef = useRef<boolean | undefined>(undefined);\n useEffect(() => {\n if (prevIsOpenRef.current === undefined) {\n prevIsOpenRef.current = isOpen;\n return;\n }\n const wasOpen = prevIsOpenRef.current;\n prevIsOpenRef.current = isOpen;\n\n if (wasOpen && !isOpen) {\n setIsExiting(true);\n if (exitTimerRef.current) clearTimeout(exitTimerRef.current);\n const maxDelay = Math.max(0, itemCountRef.current - 1) * 30;\n exitTimerRef.current = setTimeout(() => {\n setIsExiting(false);\n }, maxDelay + 250);\n } else if (isOpen) {\n setIsExiting(false);\n if (exitTimerRef.current) {\n clearTimeout(exitTimerRef.current);\n exitTimerRef.current = null;\n }\n }\n }, [isOpen]);\n\n useEffect(() => {\n return () => {\n if (exitTimerRef.current) clearTimeout(exitTimerRef.current);\n };\n }, []);\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLDivElement>) => {\n if (e.key === \"Escape\" && isOpen) {\n e.stopPropagation();\n close();\n triggerRef.current?.focus();\n return;\n }\n if (isOpen && (e.key === \"ArrowUp\" || e.key === \"ArrowDown\")) {\n e.preventDefault();\n const group = rootRef.current?.querySelector<HTMLElement>('[role=\"group\"]');\n if (!group) return;\n const items = Array.from(\n group.querySelectorAll<HTMLButtonElement>(\"button:not([disabled])\")\n );\n if (items.length === 0) return;\n const currentIndex = items.indexOf(document.activeElement as HTMLButtonElement);\n const nextIndex =\n e.key === \"ArrowUp\"\n ? currentIndex <= 0\n ? items.length - 1\n : currentIndex - 1\n : currentIndex >= items.length - 1\n ? 0\n : currentIndex + 1;\n items[nextIndex]?.focus();\n }\n },\n [isOpen, close, rootRef]\n );\n\n const contextValue: FABMenuContextValue = {\n isOpen,\n isExiting,\n direction,\n reducedMotion,\n itemCount,\n };\n\n const indexedChildren = Children.map(children, (child, index) => {\n if (isValidElement<{ index?: number }>(child)) {\n return cloneElement(child, { index });\n }\n return child;\n });\n\n return (\n <FABMenuContext.Provider value={contextValue}>\n {/* eslint-disable-next-line jsx-a11y/no-static-element-interactions */}\n <div\n ref={rootRef}\n className={cn(fabMenuVariants({ direction }), className)}\n onKeyDown={handleKeyDown}\n >\n {(isOpen || isExiting) && (\n <div\n className={cn(\n \"inline-flex items-center gap-3\",\n direction === \"up\" && \"flex-col-reverse\",\n direction === \"down\" && \"flex-col\",\n direction === \"left\" && \"flex-row-reverse\",\n direction === \"right\" && \"flex-row\"\n )}\n role=\"group\"\n aria-label={`${ariaLabel} actions`}\n >\n {indexedChildren}\n </div>\n )}\n\n <FAB\n ref={triggerRef}\n onPress={toggle}\n aria-label={ariaLabel}\n aria-expanded={isOpen}\n icon={\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n className={cn(\n \"duration-short4 ease-standard h-6 w-6 transition-transform\",\n isOpen && \"rotate-45\"\n )}\n aria-hidden=\"true\"\n >\n <path d=\"M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z\" />\n </svg>\n }\n className={cn(isOpen && \"shadow-elevation-4\")}\n />\n </div>\n </FABMenuContext.Provider>\n );\n }\n);\n\nFABMenu.displayName = \"FABMenu\";\n","\"use client\";\n\nimport { forwardRef, useRef } from \"react\";\nimport type React from \"react\";\nimport { useButton } from \"react-aria\";\nimport { mergeProps } from \"@react-aria/utils\";\n\nimport { cn } from \"../../utils/cn\";\nimport { useRipple } from \"../../hooks/useRipple\";\nimport { useFABMenuContext } from \"./FABMenuHeadless\";\nimport type { FABMenuItemProps } from \"./FABMenu.types\";\n\n/**\n * FABMenuItem — Individual action item rendered as a mini FAB (40dp) with\n * optional label chip. Consumes FABMenuContext for open state and direction.\n *\n * Applies stagger animation via `animation-delay` based on `index` prop\n * (provided by the parent FABMenu). Skips animations when `reducedMotion`\n * is active.\n *\n * @example\n * ```tsx\n * <FABMenuItem\n * icon={<IconEdit />}\n * label=\"Edit\"\n * aria-label=\"Edit item\"\n * onPress={() => handleEdit()}\n * index={0}\n * />\n * ```\n */\nexport const FABMenuItem = forwardRef<HTMLButtonElement, FABMenuItemProps & { index?: number }>(\n (\n { icon, label, onPress, \"aria-label\": ariaLabel, isDisabled = false, className, index = 0 },\n forwardedRef\n ) => {\n const internalRef = useRef<HTMLButtonElement>(null);\n const buttonRef = (forwardedRef ?? internalRef) as React.RefObject<HTMLButtonElement>;\n\n const { isOpen, isExiting, direction, reducedMotion, itemCount } = useFABMenuContext();\n\n const { buttonProps } = useButton(\n {\n ...(onPress && { onPress }),\n \"aria-label\": ariaLabel,\n isDisabled,\n },\n buttonRef\n );\n\n const { onMouseDown: handleRipple, ripples } = useRipple({\n disabled: isDisabled,\n });\n\n const mergedProps = mergeProps(buttonProps, {\n type: \"button\" as const,\n onMouseDown: handleRipple,\n });\n\n // Entry: stagger forward (0ms, 30ms, 60ms…)\n // Exit: stagger in reverse so the last item exits first\n const staggerDelay = reducedMotion\n ? 0\n : isExiting\n ? Math.max(0, itemCount - 1 - index) * 30\n : index * 30;\n\n const animationClass = reducedMotion\n ? undefined\n : isOpen\n ? \"animate-md-scale-in\"\n : isExiting\n ? \"animate-md-scale-out\"\n : undefined;\n\n const labelPosition = direction === \"right\" ? \"after\" : \"before\";\n\n const labelChip = label ? (\n <span className=\"bg-surface-container text-label-large text-on-surface shadow-elevation-1 rounded-full px-3 py-1\">\n {label}\n </span>\n ) : null;\n\n // Keep item visible (opacity-100) during exit animation; hide only when fully closed.\n const isVisible = isOpen || isExiting;\n\n return (\n <div\n className={cn(\n \"relative flex cursor-pointer items-center gap-3\",\n isVisible ? \"opacity-100\" : \"opacity-0\",\n isOpen ? \"pointer-events-auto\" : \"pointer-events-none\",\n className\n )}\n >\n {labelPosition === \"before\" && labelChip}\n\n {/* eslint-disable-next-line react/button-has-type -- type is set via mergeProps */}\n <button\n {...mergedProps}\n ref={buttonRef}\n className={cn(\n \"relative flex size-10 items-center justify-center overflow-hidden rounded-xl\",\n \"bg-primary-container text-on-primary-container shadow-elevation-3\",\n animationClass\n )}\n style={staggerDelay > 0 ? { animationDelay: `${staggerDelay}ms` } : undefined}\n >\n {/* State layer */}\n <span\n data-state-layer\n className=\"bg-on-primary-container duration-spring-standard-fast-effects ease-spring-standard-fast-effects pointer-events-none absolute inset-0 rounded-xl opacity-0 transition-opacity hover:opacity-8\"\n />\n\n {/* Ripple */}\n {ripples}\n\n {/* Icon */}\n <span className=\"relative z-10 inline-flex shrink-0\">{icon}</span>\n </button>\n\n {labelPosition === \"after\" && labelChip}\n </div>\n );\n }\n);\n\nFABMenuItem.displayName = \"FABMenuItem\";\n","\"use client\";\n\nimport { forwardRef, useMemo, useRef } from \"react\";\nimport type React from \"react\";\nimport { mergeProps, useFocusRing, useSlider, useSliderThumb, VisuallyHidden } from \"react-aria\";\nimport { useSliderState } from \"react-stately\";\nimport type { SliderState } from \"react-stately\";\nimport { cn } from \"../../utils/cn\";\nimport type { SliderHeadlessProps } from \"./Slider.types\";\n\n// ─── Centered Variant Utilities ───────────────────────────────────────────────\n\n/**\n * Calculate the percentage position of zero within the slider range.\n * For range [-100, 100]: zeroPercent = 50\n * For range [-50, 150]: zeroPercent = 25\n * For range [0, 100]: zeroPercent = 0 (degenerates to standard)\n */\nfunction getZeroPercent(minValue: number, maxValue: number): number {\n if (minValue >= 0) return 0;\n if (maxValue <= 0) return 100;\n return ((0 - minValue) / (maxValue - minValue)) * 100;\n}\n\n/**\n * Determine which side of center the thumb sits on.\n */\nfunction getValueDirection(value: number): \"negative\" | \"positive\" | \"zero\" {\n if (value < 0) return \"negative\";\n if (value > 0) return \"positive\";\n return \"zero\";\n}\n\n// ─── Internal Thumb ───────────────────────────────────────────────────────────\n\ninterface SliderThumbInternalProps {\n index: number;\n state: SliderState;\n trackRef: React.RefObject<HTMLDivElement>;\n isDisabled: boolean;\n formatValue?: (value: number) => string;\n \"aria-label\"?: string;\n className?: string;\n \"data-direction\"?: \"negative\" | \"positive\" | \"zero\";\n}\n\nfunction SliderThumbInternal({\n index,\n state,\n trackRef,\n isDisabled,\n formatValue,\n className,\n \"data-direction\": dataDirection,\n ...ariaProps\n}: SliderThumbInternalProps): React.JSX.Element {\n const inputRef = useRef<HTMLInputElement>(null);\n\n const { thumbProps, inputProps, isDragging, isFocused } = useSliderThumb(\n {\n index,\n trackRef,\n inputRef,\n isDisabled,\n ...ariaProps,\n },\n state\n );\n\n const { isFocusVisible, focusProps } = useFocusRing();\n\n // Override aria-valuetext with the custom formatter when provided.\n // React Stately v3.7 does not support getValueLabel; we patch the attribute directly.\n const currentValue = state.getThumbValue(index);\n const ariaValueText = formatValue ? formatValue(currentValue) : undefined;\n\n return (\n <div\n {...thumbProps}\n data-dragging={isDragging || undefined}\n data-focused={isFocused || undefined}\n data-focus-visible={isFocusVisible || undefined}\n data-disabled={isDisabled || undefined}\n {...(dataDirection !== undefined ? { \"data-direction\": dataDirection } : {})}\n className={cn(\n \"outline-none\",\n // Focus ring visible only on keyboard focus — matches project pattern (md3-design.mdc §Accessibility)\n \"data-[focus-visible]:ring-3\",\n \"data-[focus-visible]:ring-secondary\",\n \"data-[focus-visible]:ring-offset-2\",\n className\n )}\n >\n <VisuallyHidden>\n <input\n ref={inputRef}\n {...mergeProps(inputProps, focusProps)}\n {...(ariaValueText !== undefined ? { \"aria-valuetext\": ariaValueText } : {})}\n />\n </VisuallyHidden>\n </div>\n );\n}\n\n// ─── SliderHeadless ───────────────────────────────────────────────────────────\n\n/**\n * Headless Slider Component (Layer 2)\n *\n * Unstyled slider primitive using React Aria for full accessibility.\n * Provides behavior only — bring your own styles.\n *\n * Features:\n * - role=\"group\" on container with role=\"slider\" on thumb input\n * - Full keyboard navigation: Arrow keys, Page Up/Down, Home, End\n * - Pointer drag with capture (mouse, touch, pen)\n * - Click-to-seek on the track\n * - Controlled and uncontrolled value management\n * - Horizontal and vertical orientations\n * - Discrete stepping support\n * - Live value announcements via <output>\n * - data-* attributes for styled layer targeting\n *\n * @example\n * ```tsx\n * <SliderHeadless label=\"Volume\" defaultValue={[50]} />\n *\n * <SliderHeadless\n * label=\"Price range\"\n * variant=\"range\"\n * minValue={0}\n * maxValue={500}\n * defaultValue={[100, 400]}\n * formatValue={(v) => `$${v}`}\n * />\n * ```\n */\nexport const SliderHeadless = forwardRef<HTMLDivElement, SliderHeadlessProps>(\n (props, forwardedRef) => {\n const {\n variant = \"standard\",\n orientation = \"horizontal\",\n minValue = 0,\n maxValue = 100,\n step,\n value,\n defaultValue,\n onChange,\n onChangeEnd,\n isDisabled = false,\n label,\n formatValue,\n thumbLabels,\n className,\n style,\n children,\n ...ariaProps\n } = props;\n\n const trackRef = useRef<HTMLDivElement>(null);\n const internalRef = useRef<HTMLDivElement>(null);\n const containerRef = (forwardedRef ?? internalRef) as React.RefObject<HTMLDivElement>;\n\n if (process.env.NODE_ENV !== \"production\") {\n if (!label && !ariaProps[\"aria-label\"] && !ariaProps[\"aria-labelledby\"]) {\n console.warn(\n \"[Slider] Slider must have an accessible name. Provide a `label`, `aria-label`, or `aria-labelledby` prop.\"\n );\n }\n }\n\n // Stable formatter for React Stately value announcements\n const numberFormatter = useMemo(() => new Intl.NumberFormat(), []);\n\n const resolvedDefaultValue =\n defaultValue ?? (variant === \"range\" ? [25, 75] : variant === \"centered\" ? [0] : [minValue]);\n\n // Build state options — omit optional props when undefined to satisfy exactOptionalPropertyTypes\n const state = useSliderState({\n minValue,\n maxValue,\n ...(step !== undefined ? { step } : {}),\n orientation,\n isDisabled,\n ...(label !== undefined ? { label } : {}),\n ...(value !== undefined ? { value } : {}),\n defaultValue: resolvedDefaultValue,\n ...(onChange !== undefined ? { onChange } : {}),\n ...(onChangeEnd !== undefined ? { onChangeEnd } : {}),\n numberFormatter,\n });\n\n const { groupProps, trackProps, labelProps, outputProps } = useSlider(\n {\n ...ariaProps,\n ...(label !== undefined ? { label } : {}),\n orientation,\n isDisabled,\n minValue,\n maxValue,\n ...(step !== undefined ? { step } : {}),\n ...(value !== undefined ? { value } : {}),\n defaultValue: resolvedDefaultValue,\n ...(onChange !== undefined ? { onChange } : {}),\n ...(onChangeEnd !== undefined ? { onChangeEnd } : {}),\n },\n state,\n trackRef\n );\n\n const isRange = variant === \"range\";\n const isCentered = variant === \"centered\";\n\n const zeroPercent = isCentered ? getZeroPercent(minValue, maxValue) : undefined;\n const direction = isCentered ? getValueDirection(state.getThumbValue(0)) : undefined;\n\n // For range, each thumb needs its own distinct aria-label so screen readers\n // can distinguish between the minimum and maximum handle.\n const thumb0Label = isRange ? (thumbLabels?.[0] ?? \"Minimum\") : ariaProps[\"aria-label\"];\n\n return (\n <div\n {...groupProps}\n ref={containerRef}\n className={className}\n style={style}\n data-orientation={orientation}\n data-disabled={isDisabled || undefined}\n data-variant={variant}\n {...(zeroPercent !== undefined ? { \"data-zero-percent\": zeroPercent } : {})}\n >\n {label && <label {...labelProps}>{label}</label>}\n <div\n {...trackProps}\n ref={trackRef}\n data-orientation={orientation}\n data-track\n {...(zeroPercent !== undefined ? { \"data-zero-percent\": zeroPercent } : {})}\n >\n {children}\n <SliderThumbInternal\n index={0}\n state={state}\n trackRef={trackRef}\n isDisabled={isDisabled}\n {...(formatValue !== undefined ? { formatValue } : {})}\n {...(thumb0Label !== undefined ? { \"aria-label\": thumb0Label } : {})}\n {...(direction !== undefined ? { \"data-direction\": direction } : {})}\n />\n {isRange && (\n <SliderThumbInternal\n index={1}\n state={state}\n trackRef={trackRef}\n isDisabled={isDisabled}\n {...(formatValue !== undefined ? { formatValue } : {})}\n aria-label={thumbLabels?.[1] ?? \"Maximum\"}\n />\n )}\n </div>\n <output {...outputProps}>\n {isRange\n ? formatValue\n ? `${formatValue(state.getThumbValue(0))} \\u2013 ${formatValue(state.getThumbValue(1))}`\n : `${state.getThumbValueLabel(0)} \\u2013 ${state.getThumbValueLabel(1)}`\n : formatValue\n ? formatValue(state.getThumbValue(0))\n : state.getThumbValueLabel(0)}\n </output>\n </div>\n );\n }\n);\n\nSliderHeadless.displayName = \"SliderHeadless\";\n","import { cva, type VariantProps } from \"class-variance-authority\";\n\n/**\n * CVA variants for the Slider container (root element — the `role=\"group\"` div).\n *\n * MD3 spec §4.2: Container height equals handle height for each size.\n * MD3 spec §4.1, §10.9: In vertical orientation, container width = handle height (dimensions transposed).\n * Applied via className on SliderHeadless so the groupProps div receives these classes.\n */\nexport const sliderContainerVariants = cva(\n [\n \"relative\",\n \"flex\",\n \"items-center\",\n \"w-full\",\n \"touch-none\", // NOTE: measurement-derived value from MD3 spec; permitted exception — prevents browser scroll on drag\n \"select-none\",\n ],\n {\n variants: {\n size: {\n // NOTE: measurement-derived values from MD3 spec §4.2; permitted exception\n xsmall: \"h-[44px]\",\n small: \"h-[44px]\",\n medium: \"h-[52px]\",\n large: \"h-[68px]\",\n xlarge: \"h-[108px]\",\n },\n orientation: {\n // Horizontal: w-full already in base; flex-row is default flex direction\n horizontal: \"\",\n // Vertical: transposed — container height fills parent, width = handle height (per size)\n // flex-col stacks label → track → output vertically\n // NOTE: h-full requires a parent with defined height; w-[...] set via compound variants\n vertical: \"h-full flex-col\",\n },\n disabled: {\n true: \"cursor-not-allowed pointer-events-none\",\n false: \"cursor-pointer\",\n },\n },\n compoundVariants: [\n // Vertical: container WIDTH = handle height (MD3 §10.9 — dimensions transposed)\n // Overrides w-full from base via tailwind-merge in cn()\n // NOTE: measurement-derived values from MD3 spec §4.2; permitted exception\n { orientation: \"vertical\", size: \"xsmall\", className: \"w-[44px]\" },\n { orientation: \"vertical\", size: \"small\", className: \"w-[44px]\" },\n { orientation: \"vertical\", size: \"medium\", className: \"w-[52px]\" },\n { orientation: \"vertical\", size: \"large\", className: \"w-[68px]\" },\n { orientation: \"vertical\", size: \"xlarge\", className: \"w-[108px]\" },\n ],\n defaultVariants: {\n size: \"xsmall\",\n orientation: \"horizontal\",\n disabled: false,\n },\n }\n);\n\n/**\n * CVA for the active track (filled portion).\n *\n * MD3 spec §6, §8.1, §10.2: `bg-primary`, size-dependent outer corners, 2dp inner corners.\n * Inner corner (near handle) is always 2dp regardless of size.\n * MD3 spec §10.9: In vertical orientation, track thickness becomes width (not height).\n * Transition: flex-basis spatial spring (md3-motion spring-standard-fast-spatial).\n */\nexport const sliderActiveTrackVariants = cva(\n [\"bg-primary\", \"flex-shrink-0\", \"overflow-hidden\", \"relative\"],\n {\n variants: {\n size: {\n // NOTE: measurement-derived values from MD3 spec §4.2, §6 Corner tokens; permitted exception\n // Corner classes are in compound variants to avoid conflicts with vertical orientation corners\n xsmall: \"h-[16px] rounded-l-[16px] rounded-r-[2px]\", // corner.large outer (16dp), 2dp inner\n small: \"h-[16px] rounded-l-[16px] rounded-r-[2px]\",\n medium: \"h-[40px] rounded-l-[12px] rounded-r-[2px]\", // corner.medium outer (12dp), 2dp inner\n large: \"h-[56px] rounded-l-[16px] rounded-r-[2px]\", // corner.large outer (16dp), 2dp inner\n xlarge: \"h-[96px] rounded-l-[28px] rounded-r-[2px]\", // corner.extra-large outer (28dp), 2dp inner\n },\n orientation: {\n horizontal: \"\",\n // Vertical: track thickness is now width; flex-basis (inline style) controls height.\n // h-[...] from size variant is overridden by flex-basis in a flex-col container.\n // Individual corner classes (rounded-tl/tr/bl/br) override the horizontal rounded-l/r\n // via tailwind-merge conflict resolution in cn().\n vertical: \"\",\n },\n disabled: {\n true: \"bg-on-surface opacity-38\",\n false: \"\",\n },\n },\n compoundVariants: [\n // Vertical: width = track thickness, corners transposed (bottom = outer, top = inner near handle)\n // Using individual corner utilities so tailwind-merge correctly resolves conflicts with\n // the horizontal rounded-l/rounded-r classes from size variants.\n // NOTE: measurement-derived values from MD3 spec §4.2, §6 Corner tokens; permitted exception\n {\n orientation: \"vertical\",\n size: \"xsmall\",\n className: \"w-[16px] rounded-tl-[2px] rounded-tr-[2px] rounded-bl-[16px] rounded-br-[16px]\",\n },\n {\n orientation: \"vertical\",\n size: \"small\",\n className: \"w-[16px] rounded-tl-[2px] rounded-tr-[2px] rounded-bl-[16px] rounded-br-[16px]\",\n },\n {\n orientation: \"vertical\",\n size: \"medium\",\n className: \"w-[40px] rounded-tl-[2px] rounded-tr-[2px] rounded-bl-[12px] rounded-br-[12px]\",\n },\n {\n orientation: \"vertical\",\n size: \"large\",\n className: \"w-[56px] rounded-tl-[2px] rounded-tr-[2px] rounded-bl-[16px] rounded-br-[16px]\",\n },\n {\n orientation: \"vertical\",\n size: \"xlarge\",\n className: \"w-[96px] rounded-tl-[2px] rounded-tr-[2px] rounded-bl-[28px] rounded-br-[28px]\",\n },\n ],\n defaultVariants: {\n size: \"xsmall\",\n orientation: \"horizontal\",\n disabled: false,\n },\n }\n);\n\n/**\n * CVA for the inactive track (unfilled portion).\n *\n * MD3 spec §6, §8.1, §10.2: `bg-secondary-container`, 2dp inner corners, size-dependent outer corners.\n * MD3 spec §10.9: In vertical orientation, track thickness becomes width (not height).\n * Disabled: `bg-on-surface` at 10% opacity via Tailwind alpha modifier.\n */\nexport const sliderInactiveTrackVariants = cva(\n [\"bg-secondary-container\", \"flex-1\", \"overflow-hidden\", \"relative\"],\n {\n variants: {\n size: {\n // NOTE: measurement-derived values from MD3 spec §4.2, §6 Corner tokens; permitted exception\n xsmall: \"h-[16px] rounded-l-[2px] rounded-r-[16px]\",\n small: \"h-[16px] rounded-l-[2px] rounded-r-[16px]\",\n medium: \"h-[40px] rounded-l-[2px] rounded-r-[12px]\",\n large: \"h-[56px] rounded-l-[2px] rounded-r-[16px]\",\n xlarge: \"h-[96px] rounded-l-[2px] rounded-r-[28px]\",\n },\n orientation: {\n horizontal: \"\",\n // Vertical: track thickness is width; flex-1 controls height growth.\n // Individual corner classes override horizontal rounded-l/r via tailwind-merge.\n vertical: \"\",\n },\n disabled: {\n true: \"bg-on-surface/10\", // MD3 §8.2: 10% opacity via background alpha\n false: \"\",\n },\n },\n compoundVariants: [\n // Vertical: width = track thickness, corners transposed (top = outer, bottom = inner near handle)\n // NOTE: measurement-derived values from MD3 spec §4.2, §6 Corner tokens; permitted exception\n {\n orientation: \"vertical\",\n size: \"xsmall\",\n className: \"w-[16px] rounded-tl-[16px] rounded-tr-[16px] rounded-bl-[2px] rounded-br-[2px]\",\n },\n {\n orientation: \"vertical\",\n size: \"small\",\n className: \"w-[16px] rounded-tl-[16px] rounded-tr-[16px] rounded-bl-[2px] rounded-br-[2px]\",\n },\n {\n orientation: \"vertical\",\n size: \"medium\",\n className: \"w-[40px] rounded-tl-[12px] rounded-tr-[12px] rounded-bl-[2px] rounded-br-[2px]\",\n },\n {\n orientation: \"vertical\",\n size: \"large\",\n className: \"w-[56px] rounded-tl-[16px] rounded-tr-[16px] rounded-bl-[2px] rounded-br-[2px]\",\n },\n {\n orientation: \"vertical\",\n size: \"xlarge\",\n className: \"w-[96px] rounded-tl-[28px] rounded-tr-[28px] rounded-bl-[2px] rounded-br-[2px]\",\n },\n ],\n defaultVariants: {\n size: \"xsmall\",\n orientation: \"horizontal\",\n disabled: false,\n },\n }\n);\n\n/**\n * CVA for the handle/thumb element.\n *\n * MD3 spec §6, §9, §10.3: 4dp wide, full container height, 2dp border-radius.\n * MD3 spec §10.9: In vertical orientation, width and height are transposed —\n * handle becomes 4dp tall (main axis) × full width (cross axis).\n * Width narrows to 2dp on press (md3 spec §9.3).\n * Motion: transition-[width] with duration-short2 + ease-standard applied conditionally\n * in Slider.tsx based on useReducedMotion() guard (MD3 Appendix E).\n */\nexport const sliderHandleVariants = cva(\n [\n \"bg-primary\",\n \"rounded-[2px]\", // NOTE: measurement-derived value from MD3 spec §10.3 (2dp handle border-radius); permitted exception\n \"flex-shrink-0\",\n \"relative\",\n \"z-10\",\n \"outline-none\",\n // Motion classes applied conditionally in Slider.tsx via useReducedMotion guard\n ],\n {\n variants: {\n size: {\n // NOTE: measurement-derived values from MD3 spec §4.2, §10.3; permitted exception\n xsmall: \"w-[4px] h-[44px]\",\n small: \"w-[4px] h-[44px]\",\n medium: \"w-[4px] h-[52px]\",\n large: \"w-[4px] h-[68px]\",\n xlarge: \"w-[4px] h-[108px]\",\n },\n orientation: {\n horizontal: \"\",\n // Vertical: dimensions transposed. h-[4px] overrides size-variant h-[...] via tailwind-merge;\n // w-full overrides size-variant w-[4px] via tailwind-merge (both in cn() call at styled layer).\n // NOTE: measurement-derived value from MD3 spec §10.3 (4dp handle width); permitted exception\n vertical: \"h-[4px] w-full\",\n },\n pressed: {\n true: \"w-[2px]\", // NOTE: measurement-derived value from MD3 spec §10.3 (2dp pressed width); permitted exception\n false: \"\",\n },\n disabled: {\n true: \"bg-on-surface opacity-38\",\n false: \"\",\n },\n },\n defaultVariants: {\n size: \"xsmall\",\n orientation: \"horizontal\",\n pressed: false,\n disabled: false,\n },\n }\n);\n\n/**\n * CVA for the handle's state layer overlay.\n *\n * MD3 spec §8.3: Inset overlay within the handle.\n * - Hover: on-primary at 8% opacity\n * - Focus/Pressed: on-primary at 10% opacity\n * Motion: transition-opacity with duration-short1 + ease-standard applied conditionally\n * in Slider.tsx based on useReducedMotion() guard (MD3 Appendix E).\n */\nexport const sliderHandleStateLayerVariants = cva(\n [\n \"absolute\",\n \"inset-0\",\n \"rounded-[4px]\", // NOTE: measurement-derived value from MD3 spec §10.3 (4dp state layer border-radius); permitted exception\n \"bg-on-primary\",\n \"pointer-events-none\",\n // Motion classes applied conditionally in Slider.tsx via useReducedMotion guard\n ],\n {\n variants: {\n state: {\n enabled: \"opacity-0\",\n hovered: \"opacity-8\", // MD3 §8.3: 8% hover\n pressed: \"opacity-10\", // MD3 §8.3: 10% pressed\n focused: \"opacity-10\", // MD3 §8.3: 10% focus\n disabled: \"opacity-0\",\n },\n },\n defaultVariants: {\n state: \"enabled\",\n },\n }\n);\n\n/**\n * CVA for the track layout container (holds active track + handle + inactive track).\n *\n * MD3 spec §7, §10.2: Flex row with 6dp gap between handle and track segments.\n * The 6dp gap is the `thumbTrackGapSize` token from MD3 spec.\n * MD3 spec §10.9: Vertical orientation uses flex-col-reverse for bottom-to-top fill.\n * `relative` is required so the absolute stops overlay is positioned within.\n */\nexport const sliderTrackLayoutVariants = cva(\n [\n \"relative\",\n \"flex\",\n \"items-center\",\n \"gap-[6px]\", // NOTE: measurement-derived value from MD3 spec §2, §6 (thumbTrackGapSize: 6dp); permitted exception\n ],\n {\n variants: {\n orientation: {\n // Horizontal: full width, left-to-right fill\n horizontal: \"flex-row w-full\",\n // Vertical: full height, bottom-to-top fill (flex-col-reverse places active track at bottom)\n vertical: \"flex-col-reverse h-full\",\n },\n },\n defaultVariants: {\n orientation: \"horizontal\",\n },\n }\n);\n\n/**\n * CVA for the stops overlay container.\n *\n * An absolute overlay positioned within the track layout, spanning its full area.\n * Dots are distributed with justify-between.\n * Padding from track edges: 4dp.\n * MD3 spec §5.2, §10.5.\n */\nexport const sliderStopsContainerVariants = cva([\n \"absolute\",\n \"inset-0\",\n \"flex\",\n \"items-center\",\n \"justify-between\",\n \"px-[4px]\", // NOTE: measurement-derived value from MD3 spec §10.5 (stopPadding: 4dp); permitted exception\n \"pointer-events-none\",\n \"z-0\",\n]);\n\n/**\n * CVA for individual stop indicator dots.\n *\n * MD3 spec §5.2, §10.5: 4dp circular dots, color depends on whether dot is on\n * active or inactive track.\n */\nexport const sliderStopDotVariants = cva(\n [\n \"rounded-full\",\n \"flex-shrink-0\",\n \"w-[4px]\", // NOTE: measurement-derived value from MD3 spec §10.5 (stopIndicatorSize: 4dp); permitted exception\n \"h-[4px]\",\n ],\n {\n variants: {\n /**\n * Whether this dot is positioned on the active track portion.\n * Determines the dot color per MD3 spec §5.2.\n */\n onActiveTrack: {\n true: \"bg-on-primary\", // Light dots on primary background\n false: \"bg-on-secondary-container\", // Dark dots on secondary-container background\n },\n disabled: {\n true: \"opacity-38\",\n false: \"\",\n },\n },\n defaultVariants: {\n onActiveTrack: false,\n disabled: false,\n },\n }\n);\n\n/**\n * CVA for end track stops (4dp dots at track endpoints).\n *\n * MD3 spec §10.6: positioned 4dp from track edge, vertically centered.\n */\nexport const sliderTrackStopVariants = cva(\n [\n \"absolute\",\n \"top-1/2\",\n \"-translate-y-1/2\",\n \"w-[4px]\", // NOTE: measurement-derived value from MD3 spec §10.6 (trackStopDiameter: 4dp); permitted exception\n \"h-[4px]\",\n \"rounded-full\",\n \"bg-on-secondary-container\",\n \"pointer-events-none\",\n ],\n {\n variants: {\n position: {\n start: \"left-[4px]\", // NOTE: measurement-derived (trackStopOffset: 4dp); permitted exception\n end: \"right-[4px]\",\n },\n },\n defaultVariants: {\n position: \"end\",\n },\n }\n);\n\n/**\n * CVA for the value indicator (floating pill label above the handle).\n *\n * MD3 spec §5.3, §10.4:\n * - Shape: pill (border-radius 1000dp = rounded-full)\n * - Background: inverse-surface\n * - Min-width: 48dp\n * - Padding: 16dp horizontal, 12dp vertical\n * - Position: centered above handle via absolute + left-1/2 + -translate-x-1/2\n * - Only visible during Pressed state; hidden with opacity-0 + scale-0\n * Motion: standard fast effects (small component, utility tooltip).\n */\nexport const sliderValueIndicatorVariants = cva(\n [\n \"absolute\",\n \"left-1/2\",\n \"-translate-x-1/2\",\n \"bottom-[calc(100%+4px)]\", // NOTE: measurement-derived (4dp gap above handle); permitted exception\n \"bg-inverse-surface\",\n \"rounded-full\", // pill shape (1000dp radius)\n \"px-[16px]\", // NOTE: measurement-derived (valueIndicatorPaddingH: 16dp); permitted exception\n \"py-[12px]\", // NOTE: measurement-derived (valueIndicatorPaddingV: 12dp); permitted exception\n \"min-w-[48px]\", // NOTE: measurement-derived (valueIndicatorWidth: 48dp); permitted exception\n \"flex\",\n \"items-center\",\n \"justify-center\",\n \"pointer-events-none\",\n \"z-20\",\n // Motion classes (transition-[transform,opacity] with directional easing) applied\n // conditionally in SliderValueIndicator.tsx via useReducedMotion guard.\n ],\n {\n variants: {\n visible: {\n true: \"opacity-100 scale-100\",\n false: \"opacity-0 scale-0\",\n },\n },\n defaultVariants: {\n visible: false,\n },\n }\n);\n\n/**\n * CVA for value indicator text content.\n *\n * MD3 spec §5.3: Label Large typography — 14px, weight 500, line-height 20px, tracking 0.1px.\n * Color: inverse-on-surface.\n */\nexport const sliderValueIndicatorTextVariants = cva([\n \"text-inverse-on-surface\",\n \"text-label-large\", // MD3 Label Large typescale token\n \"whitespace-nowrap\",\n \"text-center\",\n]);\n\n/**\n * CVA for the inset icon element rendered inside the active track.\n *\n * MD3 spec §5.1, §10.7:\n * - Only available for Medium, Large, XLarge sizes (Standard variant only)\n * - Positioned absolutely inside the active track\n * - Horizontal: 8dp from left edge, vertically centered\n * - Vertical: 8dp from bottom edge, horizontally centered\n * - Icon sizes: 24×24dp (Medium, Large), 32×32dp (XLarge)\n * - Color: on-primary (icon sits on primary-colored active track)\n */\nexport const sliderInsetIconVariants = cva(\n [\"absolute\", \"text-on-primary\", \"pointer-events-none\", \"flex\", \"items-center\", \"justify-center\"],\n {\n variants: {\n size: {\n // NOTE: measurement-derived values from MD3 spec §10.7 (icon sizes); permitted exception\n medium: \"w-[24px] h-[24px]\",\n large: \"w-[24px] h-[24px]\",\n xlarge: \"w-[32px] h-[32px]\",\n },\n orientation: {\n // Horizontal: 8dp from active track left edge, vertically centered\n // NOTE: measurement-derived value from MD3 spec §10.7 (iconOffset: 8dp); permitted exception\n horizontal: \"left-[8px] top-1/2 -translate-y-1/2\",\n // Vertical: 8dp from active track bottom edge (outer end), horizontally centered\n vertical: \"bottom-[8px] left-1/2 -translate-x-1/2\",\n },\n },\n defaultVariants: {\n size: \"medium\",\n orientation: \"horizontal\",\n },\n }\n);\n\n// ─── Variant Prop Types ────────────────────────────────────────────────────────\n\nexport type SliderContainerVariants = VariantProps<typeof sliderContainerVariants>;\nexport type SliderActiveTrackVariants = VariantProps<typeof sliderActiveTrackVariants>;\nexport type SliderInactiveTrackVariants = VariantProps<typeof sliderInactiveTrackVariants>;\nexport type SliderHandleVariants = VariantProps<typeof sliderHandleVariants>;\nexport type SliderHandleStateLayerVariants = VariantProps<typeof sliderHandleStateLayerVariants>;\nexport type SliderTrackLayoutVariants = VariantProps<typeof sliderTrackLayoutVariants>;\nexport type SliderStopsContainerVariants = VariantProps<typeof sliderStopsContainerVariants>;\nexport type SliderStopDotVariants = VariantProps<typeof sliderStopDotVariants>;\nexport type SliderTrackStopVariants = VariantProps<typeof sliderTrackStopVariants>;\nexport type SliderValueIndicatorVariants = VariantProps<typeof sliderValueIndicatorVariants>;\nexport type SliderInsetIconVariants = VariantProps<typeof sliderInsetIconVariants>;\n","\"use client\";\n\nimport type React from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { sliderStopsContainerVariants, sliderStopDotVariants } from \"./Slider.variants\";\nimport type { SliderVariant } from \"./Slider.types\";\n\n// ─── Helpers ─────────────────────────────────────────────────────────────────\n\n/**\n * Determines whether a stop value falls on the active track portion.\n *\n * MD3 spec §5.2: active track color vs inactive track color per variant.\n * - standard: active fill covers min → current value\n * - centered: active fill covers center (0) ↔ current value\n * - range: active fill covers values[0] → values[1]\n */\nfunction getIsOnActiveTrack(\n stopValue: number,\n values: number[],\n variant: SliderVariant,\n minValue: number,\n maxValue: number\n): boolean {\n if (variant === \"range\") {\n const lo = values[0] ?? minValue;\n const hi = values[1] ?? maxValue;\n return stopValue >= lo && stopValue <= hi;\n }\n if (variant === \"centered\") {\n const current = values[0] ?? 0;\n if (current >= 0) {\n return stopValue >= 0 && stopValue <= current;\n }\n return stopValue >= current && stopValue <= 0;\n }\n // standard\n return stopValue <= (values[0] ?? minValue);\n}\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\ninterface SliderStopsProps {\n /**\n * Minimum value of the slider range — defines the leftmost stop.\n */\n minValue: number;\n /**\n * Maximum value of the slider range — defines the rightmost stop.\n */\n maxValue: number;\n /**\n * Step increment. Stop count = floor((max - min) / step) + 1.\n */\n step: number;\n /**\n * Current value(s) — used to determine which dots are on the active track.\n */\n values: number[];\n /**\n * Structural variant — determines active track region.\n */\n variant: SliderVariant;\n /**\n * Whether the slider is disabled (renders dots at 38% opacity).\n */\n isDisabled: boolean;\n /**\n * Additional CSS classes for the stops container.\n */\n className?: string;\n}\n\n// ─── SliderStops ──────────────────────────────────────────────────────────────\n\n/**\n * Renders discrete stop indicator dots as an absolute overlay on the track.\n *\n * MD3 spec §5.2, §10.5: 4dp circular dots distributed with `justify-between`,\n * colored `on-primary` on the active track and `on-secondary-container` on\n * the inactive track. Padding of 4dp from track edges.\n *\n * This is a purely decorative sub-component. All accessibility information\n * is carried by the underlying `<input type=\"range\">` via React Aria.\n *\n * @example\n * ```tsx\n * <SliderStops\n * minValue={0}\n * maxValue={100}\n * step={10}\n * values={[50]}\n * variant=\"standard\"\n * isDisabled={false}\n * />\n * ```\n */\nexport function SliderStops({\n minValue,\n maxValue,\n step,\n values,\n variant,\n isDisabled,\n className,\n}: SliderStopsProps): React.JSX.Element {\n const stopCount = Math.floor((maxValue - minValue) / step) + 1;\n\n return (\n <div\n data-slot=\"stops-container\"\n className={cn(sliderStopsContainerVariants(), className)}\n aria-hidden=\"true\"\n >\n {Array.from({ length: stopCount }, (_, i) => {\n const stopValue = minValue + i * step;\n const isOnActive = getIsOnActiveTrack(stopValue, values, variant, minValue, maxValue);\n return (\n <span\n key={i}\n data-slot=\"stop-dot\"\n className={cn(\n sliderStopDotVariants({ onActiveTrack: isOnActive, disabled: isDisabled })\n )}\n />\n );\n })}\n </div>\n );\n}\n","\"use client\";\n\nimport type React from \"react\";\nimport { useReducedMotion } from \"../../hooks/useReducedMotion\";\nimport { cn } from \"../../utils/cn\";\nimport { sliderValueIndicatorVariants, sliderValueIndicatorTextVariants } from \"./Slider.variants\";\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\ninterface SliderValueIndicatorProps {\n /**\n * Numeric value to display in the pill label.\n */\n value: number;\n /**\n * Whether the indicator is currently visible (thumb in Pressed state).\n * When false the pill is rendered but hidden via `opacity-0 scale-0`.\n * @default false\n */\n isVisible: boolean;\n /**\n * Optional formatter for the displayed value string.\n * @default (v) => `${Math.round(v)}`\n * @example (v) => `$${v}`\n */\n formatValue?: (value: number) => string;\n /**\n * Additional CSS classes for the indicator container.\n */\n className?: string;\n}\n\n// ─── SliderValueIndicator ─────────────────────────────────────────────────────\n\n/**\n * Floating pill label that appears above the handle when the thumb is pressed.\n *\n * MD3 spec §5.3, §9.3, §10.4:\n * - Pill shape (`rounded-full`, 1000dp radius)\n * - Background: `inverse-surface`\n * - Text: `inverse-on-surface`, Label Large typography\n * - Min-width: 48dp, padding 16dp horizontal / 12dp vertical\n * - Positioned absolutely above the thumb; centered horizontally\n * - Visible only during Pressed state; hidden otherwise (`opacity-0 scale-0`)\n * - Transition: spring standard fast effects (MD3 motion §9.3)\n *\n * Rendered as a child of the handle element (which is `position: relative`).\n * The `role=\"tooltip\"` marks it as decorative — accessible value is in the\n * underlying `<input type=\"range\">` managed by React Aria.\n *\n * @example\n * ```tsx\n * <SliderValueIndicator\n * value={50}\n * isVisible={isPressed}\n * formatValue={(v) => `$${v}`}\n * />\n * ```\n */\nexport function SliderValueIndicator({\n value,\n isVisible,\n formatValue,\n className,\n}: SliderValueIndicatorProps): React.JSX.Element {\n const displayValue = formatValue ? formatValue(value) : `${Math.round(value)}`;\n const reducedMotion = useReducedMotion();\n\n // MD3 Appendix E: Value indicator uses directional legacy easing for enter/exit —\n // enter (scale in): ease-standard-decelerate + duration-short3 (150ms)\n // exit (scale out): ease-standard-accelerate + duration-short2 (100ms)\n // The -translate-x-1/2 from CVA is inherited as part of the transform; scale is\n // added via the visible/false variant (scale-100 / scale-0).\n // When reduced motion is preferred, all transitions are suppressed for instant state change.\n const transitionClasses = reducedMotion\n ? \"\"\n : cn(\n \"transition-[transform,opacity]\",\n isVisible\n ? \"duration-short3 ease-standard-decelerate\"\n : \"duration-short2 ease-standard-accelerate\"\n );\n\n return (\n <div\n data-slot=\"value-indicator\"\n className={cn(\n sliderValueIndicatorVariants({ visible: isVisible }),\n transitionClasses,\n className\n )}\n role=\"tooltip\"\n aria-hidden={!isVisible}\n >\n <span className={sliderValueIndicatorTextVariants()}>{displayValue}</span>\n </div>\n );\n}\n","\"use client\";\n\nimport type React from \"react\";\nimport { forwardRef, useCallback, useState } from \"react\";\nimport { useReducedMotion } from \"../../hooks/useReducedMotion\";\nimport { cn } from \"../../utils/cn\";\nimport { SliderHeadless } from \"./SliderHeadless\";\nimport { SliderStops } from \"./SliderStops\";\nimport { SliderValueIndicator } from \"./SliderValueIndicator\";\nimport {\n sliderContainerVariants,\n sliderActiveTrackVariants,\n sliderInactiveTrackVariants,\n sliderHandleVariants,\n sliderHandleStateLayerVariants,\n sliderTrackLayoutVariants,\n sliderTrackStopVariants,\n sliderInsetIconVariants,\n} from \"./Slider.variants\";\nimport type { SliderProps, SliderThumbState } from \"./Slider.types\";\n\n// ─── Helpers ──────────────────────────────────────────────────────────────────\n\nfunction clampPercent(value: number, min: number, max: number): number {\n return Math.max(0, Math.min(100, ((value - min) / (max - min)) * 100));\n}\n\nfunction resolveDefaultValue(\n variant: \"standard\" | \"centered\" | \"range\",\n minValue: number\n): number[] {\n if (variant === \"range\") return [25, 75];\n if (variant === \"centered\") return [0];\n return [minValue];\n}\n\n// ─── Slider ───────────────────────────────────────────────────────────────────\n\n/**\n * Material Design 3 Slider Component (Layer 3: Styled)\n *\n * Wraps SliderHeadless with CVA styling for all five MD3 Expressive sizes.\n * Renders the visual track layout (active track → handle → inactive track) as\n * children inside the headless track element.\n *\n * Track widths are driven by runtime values and use inline `flexBasis` styles —\n * a documented exception for geometry that cannot be expressed as design tokens.\n *\n * Motion: MD3 Appendix E token pairings applied; JS-driven animations are\n * guarded with `useReducedMotion()`.\n *\n * @example\n * ```tsx\n * // Standard slider\n * <Slider label=\"Volume\" defaultValue={[50]} />\n *\n * // Large range slider\n * <Slider variant=\"range\" size=\"large\" label=\"Price\" defaultValue={[20, 80]} />\n *\n * // Centered slider with negative range\n * <Slider variant=\"centered\" label=\"Balance\" minValue={-100} maxValue={100} />\n * ```\n */\nexport const Slider = forwardRef<HTMLDivElement, SliderProps>(\n (\n {\n size = \"xsmall\",\n variant = \"standard\",\n orientation = \"horizontal\",\n minValue = 0,\n maxValue = 100,\n step,\n value,\n defaultValue,\n onChange,\n onChangeEnd,\n isDisabled = false,\n showStops = false,\n showValueIndicator = false,\n formatValue,\n icon,\n className,\n ...headlessProps\n },\n ref\n ) => {\n const reducedMotion = useReducedMotion();\n\n const resolvedDefault = defaultValue ?? resolveDefaultValue(variant, minValue);\n\n const [uncontrolledValue, setUncontrolledValue] = useState<number[]>(resolvedDefault);\n\n const currentValues = value ?? uncontrolledValue;\n\n const handleChange = useCallback(\n (newValue: number[]) => {\n if (value === undefined) {\n setUncontrolledValue(newValue);\n }\n onChange?.(newValue);\n },\n [value, onChange]\n );\n\n // Thumb interaction states — tracked for state layer opacity\n const thumbCount = variant === \"range\" ? 2 : 1;\n const [thumbStates, setThumbStates] = useState<SliderThumbState[]>(() =>\n Array<SliderThumbState>(thumbCount).fill(\"enabled\")\n );\n\n // Pointer-pressed on any thumb means the user is actively dragging.\n // During drag: track fill suppresses transition for immediate pointer response.\n const isDragging = thumbStates.some((s) => s === \"pressed\");\n\n // MD3 Appendix E: Track fill — spring-standard-fast-spatial (spatial, standard, fast).\n // Suppressed during drag (follows pointer immediately) and when reduced motion is preferred.\n const trackTransition =\n reducedMotion || isDragging\n ? \"\"\n : \"transition-[flex-basis] duration-spring-standard-fast-spatial ease-spring-standard-fast-spatial\";\n\n // MD3 Appendix E: Handle width change — standard, fast (duration-short2 + ease-standard).\n // Spatial property (width), guarded by reduced motion.\n const handleMotion = reducedMotion ? \"\" : \"transition-[width] duration-short2 ease-standard\";\n\n // MD3 Appendix E: State layer opacity — effects, standard, fast (duration-short1 + ease-standard).\n // Effects property (opacity), guarded by reduced motion.\n const stateLayerMotion = reducedMotion\n ? \"\"\n : \"transition-opacity duration-short1 ease-standard\";\n\n const isRange = variant === \"range\";\n const isCentered = variant === \"centered\";\n\n // Only Standard variant supports the inset icon, and only for Medium/Large/XLarge sizes\n // (MD3 spec §5.1: icon not available for XSmall and Small)\n const showIcon =\n icon !== undefined &&\n variant === \"standard\" &&\n (size === \"medium\" || size === \"large\" || size === \"xlarge\");\n\n // ── Standard track render ──────────────────────────────────────────────────\n const renderStandardTrack = (): React.JSX.Element => {\n const pct = clampPercent(currentValues[0] ?? minValue, minValue, maxValue);\n const thumb0State: SliderThumbState = isDisabled ? \"disabled\" : (thumbStates[0] ?? \"enabled\");\n\n return (\n <>\n {/* Active track — width/height driven by current value percentage */}\n <div\n data-slot=\"active-track\"\n className={cn(\n sliderActiveTrackVariants({ size, disabled: isDisabled, orientation }),\n trackTransition\n )}\n style={{ flexBasis: `${pct}%` }}\n >\n {showIcon && (\n <span\n data-slot=\"inset-icon\"\n className={cn(\n sliderInsetIconVariants({\n size,\n orientation,\n })\n )}\n >\n {icon}\n </span>\n )}\n </div>\n {/* Visual handle — decorative; keyboard/pointer behaviour is in SliderThumbInternal.\n stopPropagation prevents pointer events from bubbling to the React Aria track\n which would trigger a position calculation (NaN in JSDOM / no-layout envs). */}\n <div\n data-slot=\"handle\"\n className={cn(\n sliderHandleVariants({\n size,\n disabled: isDisabled,\n pressed: thumb0State === \"pressed\",\n orientation,\n }),\n handleMotion\n )}\n onPointerEnter={() => {\n if (!isDisabled) setThumbStates([\"hovered\"]);\n }}\n onPointerLeave={() => {\n if (!isDisabled) setThumbStates([\"enabled\"]);\n }}\n onPointerDown={(e) => {\n e.stopPropagation();\n if (!isDisabled) setThumbStates([\"pressed\"]);\n }}\n onPointerUp={(e) => {\n e.stopPropagation();\n if (!isDisabled) setThumbStates([\"enabled\"]);\n }}\n >\n <div\n data-slot=\"state-layer\"\n className={cn(\n sliderHandleStateLayerVariants({ state: thumb0State }),\n stateLayerMotion\n )}\n />\n {showValueIndicator && (\n <SliderValueIndicator\n value={currentValues[0] ?? minValue}\n isVisible={thumb0State === \"pressed\"}\n {...(formatValue !== undefined ? { formatValue } : {})}\n />\n )}\n </div>\n {/* Inactive track — fills remaining flex space */}\n <div\n data-slot=\"inactive-track\"\n className={cn(\n sliderInactiveTrackVariants({ size, disabled: isDisabled, orientation }),\n trackTransition\n )}\n style={{ flexBasis: `${100 - pct}%` }}\n >\n {showStops && (\n <span\n data-slot=\"track-stop-end\"\n className={cn(sliderTrackStopVariants({ position: \"end\" }))}\n />\n )}\n </div>\n </>\n );\n };\n\n // ── Range track render ─────────────────────────────────────────────────────\n const renderRangeTrack = (): React.JSX.Element => {\n const leftPct = clampPercent(currentValues[0] ?? minValue, minValue, maxValue);\n const rightPct = clampPercent(currentValues[1] ?? maxValue, minValue, maxValue);\n const thumb0State: SliderThumbState = isDisabled ? \"disabled\" : (thumbStates[0] ?? \"enabled\");\n const thumb1State: SliderThumbState = isDisabled ? \"disabled\" : (thumbStates[1] ?? \"enabled\");\n\n const setThumb0 = (next: SliderThumbState): void =>\n setThumbStates((s) => [next, s[1] ?? \"enabled\"] as SliderThumbState[]);\n const setThumb1 = (next: SliderThumbState): void =>\n setThumbStates((s) => [s[0] ?? \"enabled\", next] as SliderThumbState[]);\n\n return (\n <>\n {/* Left inactive track */}\n <div\n data-slot=\"inactive-track-left\"\n className={cn(\n sliderInactiveTrackVariants({ size, disabled: isDisabled, orientation }),\n trackTransition\n )}\n style={{ flexBasis: `${leftPct}%` }}\n >\n {showStops && (\n <span\n data-slot=\"track-stop-start\"\n className={cn(sliderTrackStopVariants({ position: \"start\" }))}\n />\n )}\n </div>\n {/* Left handle */}\n <div\n data-slot=\"handle\"\n data-index=\"0\"\n className={cn(\n sliderHandleVariants({\n size,\n disabled: isDisabled,\n pressed: thumb0State === \"pressed\",\n orientation,\n }),\n handleMotion\n )}\n onPointerEnter={() => {\n if (!isDisabled) setThumb0(\"hovered\");\n }}\n onPointerLeave={() => {\n if (!isDisabled) setThumb0(\"enabled\");\n }}\n onPointerDown={(e) => {\n e.stopPropagation();\n if (!isDisabled) setThumb0(\"pressed\");\n }}\n onPointerUp={(e) => {\n e.stopPropagation();\n if (!isDisabled) setThumb0(\"enabled\");\n }}\n >\n <div\n data-slot=\"state-layer\"\n className={cn(\n sliderHandleStateLayerVariants({ state: thumb0State }),\n stateLayerMotion\n )}\n />\n {showValueIndicator && (\n <SliderValueIndicator\n value={currentValues[0] ?? minValue}\n isVisible={thumb0State === \"pressed\"}\n {...(formatValue !== undefined ? { formatValue } : {})}\n />\n )}\n </div>\n {/* Active track — area between the two handles */}\n <div\n data-slot=\"active-track\"\n className={cn(\n sliderActiveTrackVariants({ size, disabled: isDisabled, orientation }),\n \"rounded-[2px]\", // Both ends near handles: 2dp (MD3 §10.2)\n trackTransition\n )}\n style={{ flexBasis: `${rightPct - leftPct}%` }}\n />\n {/* Right handle */}\n <div\n data-slot=\"handle\"\n data-index=\"1\"\n className={cn(\n sliderHandleVariants({\n size,\n disabled: isDisabled,\n pressed: thumb1State === \"pressed\",\n orientation,\n }),\n handleMotion\n )}\n onPointerEnter={() => {\n if (!isDisabled) setThumb1(\"hovered\");\n }}\n onPointerLeave={() => {\n if (!isDisabled) setThumb1(\"enabled\");\n }}\n onPointerDown={(e) => {\n e.stopPropagation();\n if (!isDisabled) setThumb1(\"pressed\");\n }}\n onPointerUp={(e) => {\n e.stopPropagation();\n if (!isDisabled) setThumb1(\"enabled\");\n }}\n >\n <div\n data-slot=\"state-layer\"\n className={cn(\n sliderHandleStateLayerVariants({ state: thumb1State }),\n stateLayerMotion\n )}\n />\n {showValueIndicator && (\n <SliderValueIndicator\n value={currentValues[1] ?? maxValue}\n isVisible={thumb1State === \"pressed\"}\n {...(formatValue !== undefined ? { formatValue } : {})}\n />\n )}\n </div>\n {/* Right inactive track */}\n <div\n data-slot=\"inactive-track-right\"\n className={cn(\n sliderInactiveTrackVariants({ size, disabled: isDisabled, orientation }),\n trackTransition\n )}\n style={{ flexBasis: `${100 - rightPct}%` }}\n >\n {showStops && (\n <span\n data-slot=\"track-stop-end\"\n className={cn(sliderTrackStopVariants({ position: \"end\" }))}\n />\n )}\n </div>\n </>\n );\n };\n\n // ── Centered track render ──────────────────────────────────────────────────\n const renderCenteredTrack = (): React.JSX.Element => {\n const thumbPct = clampPercent(currentValues[0] ?? minValue, minValue, maxValue);\n const zeroPct =\n minValue >= 0 ? 0 : maxValue <= 0 ? 100 : ((0 - minValue) / (maxValue - minValue)) * 100;\n\n const thumb0State: SliderThumbState = isDisabled ? \"disabled\" : (thumbStates[0] ?? \"enabled\");\n\n const handleEl = (\n <div\n data-slot=\"handle\"\n className={cn(\n sliderHandleVariants({\n size,\n disabled: isDisabled,\n pressed: thumb0State === \"pressed\",\n orientation,\n }),\n handleMotion\n )}\n onPointerEnter={() => {\n if (!isDisabled) setThumbStates([\"hovered\"]);\n }}\n onPointerLeave={() => {\n if (!isDisabled) setThumbStates([\"enabled\"]);\n }}\n onPointerDown={(e) => {\n e.stopPropagation();\n if (!isDisabled) setThumbStates([\"pressed\"]);\n }}\n onPointerUp={(e) => {\n e.stopPropagation();\n if (!isDisabled) setThumbStates([\"enabled\"]);\n }}\n >\n <div\n data-slot=\"state-layer\"\n className={cn(sliderHandleStateLayerVariants({ state: thumb0State }), stateLayerMotion)}\n />\n {showValueIndicator && (\n <SliderValueIndicator\n value={currentValues[0] ?? minValue}\n isVisible={thumb0State === \"pressed\"}\n {...(formatValue !== undefined ? { formatValue } : {})}\n />\n )}\n </div>\n );\n\n if (thumbPct >= zeroPct) {\n // Positive direction: inactive-left | handle | active | inactive-right\n const activePct = thumbPct - zeroPct;\n return (\n <>\n <div\n data-slot=\"inactive-track-left\"\n className={cn(\n sliderInactiveTrackVariants({ size, disabled: isDisabled, orientation }),\n trackTransition\n )}\n style={{ flexBasis: `${zeroPct}%` }}\n />\n {handleEl}\n <div\n data-slot=\"active-track\"\n className={cn(\n sliderActiveTrackVariants({ size, disabled: isDisabled, orientation }),\n trackTransition\n )}\n style={{ flexBasis: `${activePct}%` }}\n />\n <div\n data-slot=\"inactive-track-right\"\n className={cn(\n sliderInactiveTrackVariants({ size, disabled: isDisabled, orientation }),\n trackTransition\n )}\n style={{ flexBasis: `${100 - zeroPct - activePct}%` }}\n />\n </>\n );\n } else {\n // Negative direction: inactive-left | active | handle | inactive-right\n const activePct = zeroPct - thumbPct;\n return (\n <>\n <div\n data-slot=\"inactive-track-left\"\n className={cn(\n sliderInactiveTrackVariants({ size, disabled: isDisabled, orientation }),\n trackTransition\n )}\n style={{ flexBasis: `${thumbPct}%` }}\n />\n <div\n data-slot=\"active-track\"\n className={cn(\n sliderActiveTrackVariants({ size, disabled: isDisabled, orientation }),\n trackTransition\n )}\n style={{ flexBasis: `${activePct}%` }}\n />\n {handleEl}\n <div\n data-slot=\"inactive-track-right\"\n className={cn(\n sliderInactiveTrackVariants({ size, disabled: isDisabled, orientation }),\n trackTransition\n )}\n style={{ flexBasis: `${100 - zeroPct}%` }}\n />\n </>\n );\n }\n };\n\n const canShowStops = showStops && step !== undefined && step > 0;\n\n return (\n <SliderHeadless\n {...headlessProps}\n ref={ref}\n variant={variant}\n orientation={orientation}\n minValue={minValue}\n maxValue={maxValue}\n {...(step !== undefined ? { step } : {})}\n isDisabled={isDisabled}\n onChange={handleChange}\n {...(formatValue !== undefined ? { formatValue } : {})}\n {...(value !== undefined ? { value } : {})}\n {...(defaultValue !== undefined ? { defaultValue } : {})}\n {...(onChangeEnd !== undefined ? { onChangeEnd } : {})}\n className={cn(\n sliderContainerVariants({ size, disabled: isDisabled, orientation }),\n className\n )}\n >\n <div data-slot=\"track-layout\" className={cn(sliderTrackLayoutVariants({ orientation }))}>\n {isRange\n ? renderRangeTrack()\n : isCentered\n ? renderCenteredTrack()\n : renderStandardTrack()}\n {canShowStops && (\n <SliderStops\n minValue={minValue}\n maxValue={maxValue}\n step={step}\n values={currentValues}\n variant={variant}\n isDisabled={isDisabled}\n />\n )}\n </div>\n </SliderHeadless>\n );\n }\n);\n\nSlider.displayName = \"Slider\";\n","\"use client\";\n\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport type React from \"react\";\nimport type { BottomSheetContextValue } from \"./BottomSheet.types\";\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\n/**\n * Options for the `useBottomSheetDrag` hook.\n */\nexport interface UseBottomSheetDragOptions {\n /**\n * Snap points as CSS percentage strings (e.g. `['25%', '50%', '100%']`).\n * Index 0 is the lowest (least expanded), last index is the highest (most expanded).\n */\n snapPoints: string[];\n /**\n * Called when a drag gesture resolves to a new snap point index.\n */\n onSnapChange?: (index: number) => void;\n /**\n * Called when the sheet should close — dragged below the lowest snap point\n * by more than 20% of the viewport height, or ArrowDown pressed at index 0.\n */\n onClose?: () => void;\n}\n\n/**\n * Return value of the `useBottomSheetDrag` hook.\n */\nexport interface UseBottomSheetDragReturn {\n /** Index of the currently active snap point (0 = lowest). */\n currentSnapIndex: number;\n /** `true` while a pointer drag gesture is in progress. */\n isDragging: boolean;\n /**\n * Inline translateY pixel offset during a drag gesture.\n * Positive = dragged down (sheet shrinks), negative = dragged up (sheet grows).\n * `null` when the sheet is snapped and not being dragged.\n */\n dragTranslateY: number | null;\n /** Props to spread onto the drag handle element. */\n handleProps: BottomSheetContextValue[\"handleProps\"];\n}\n\n// ─── Helpers ──────────────────────────────────────────────────────────────────\n\nfunction parseSnapPercent(snap: string): number {\n return parseFloat(snap.replace(\"%\", \"\"));\n}\n\n// ─── Hook ─────────────────────────────────────────────────────────────────────\n\n/**\n * Encapsulates all drag-handle interaction and snap-point logic for the Bottom Sheet.\n *\n * This is a pure behavior hook (Layer 2) — no Tailwind classes.\n *\n * - Tracks pointer drag with `setPointerCapture` and a `window` `pointermove` listener\n * - Calculates nearest snap point on `pointerup`\n * - Calls `onClose()` when dragged more than 20% below the lowest snap point\n * - Provides keyboard cycling (Space/Enter) and directional navigation (ArrowUp/ArrowDown)\n * - Satisfies WCAG 2.1 SC 2.1.1: every drag action has a keyboard equivalent\n *\n * @example\n * ```tsx\n * const { currentSnapIndex, isDragging, dragTranslateY, handleProps } = useBottomSheetDrag({\n * snapPoints: ['25%', '50%', '100%'],\n * onClose: close,\n * })\n * ```\n */\nexport function useBottomSheetDrag({\n snapPoints,\n onSnapChange,\n onClose,\n}: UseBottomSheetDragOptions): UseBottomSheetDragReturn {\n const [currentSnapIndex, setCurrentSnapIndex] = useState(0);\n const [isDragging, setIsDragging] = useState(false);\n const [dragTranslateY, setDragTranslateY] = useState<number | null>(null);\n\n // Refs for values consumed inside event callbacks — avoids stale closures\n const startYRef = useRef<number>(0);\n const currentSnapIndexRef = useRef<number>(0);\n const dragTranslateYRef = useRef<number | null>(null);\n\n // Sync currentSnapIndex ref whenever state changes\n useEffect(() => {\n currentSnapIndexRef.current = currentSnapIndex;\n }, [currentSnapIndex]);\n\n /** Update dragTranslateY in both ref and state atomically. */\n const setDragTranslateYSync = useCallback((val: number | null) => {\n dragTranslateYRef.current = val;\n setDragTranslateY(val);\n }, []);\n\n // ── pointermove attached to window during drag ────────────────────────────\n // Using window avoids missing events when the pointer moves faster than the\n // handle element's bounds (standard practice for drag implementations).\n\n useEffect(() => {\n if (!isDragging) return;\n\n const handlePointerMove = (e: PointerEvent): void => {\n const deltaY = e.clientY - startYRef.current;\n const vh = window.innerHeight;\n\n // Cannot drag above the 100% snap point (top of viewport)\n const maxUpDelta = -vh;\n // Cannot drag more than 50% below the bottom edge (dismiss threshold)\n const maxDownDelta = vh * 0.5;\n\n const clamped = Math.max(maxUpDelta, Math.min(maxDownDelta, deltaY));\n setDragTranslateYSync(clamped);\n };\n\n window.addEventListener(\"pointermove\", handlePointerMove);\n return () => window.removeEventListener(\"pointermove\", handlePointerMove);\n }, [isDragging, setDragTranslateYSync]);\n\n // ── Pointer handlers ──────────────────────────────────────────────────────\n\n const onPointerDown = useCallback((e: React.PointerEvent<HTMLElement>) => {\n e.currentTarget.setPointerCapture(e.pointerId);\n startYRef.current = e.clientY;\n setIsDragging(true);\n }, []);\n\n const onPointerUp = useCallback(\n (e: React.PointerEvent<HTMLElement>) => {\n e.currentTarget.releasePointerCapture(e.pointerId);\n setIsDragging(false);\n\n const vh = window.innerHeight;\n // Use ref value (updated by window pointermove); fall back to raw delta\n const deltaY = dragTranslateYRef.current ?? e.clientY - startYRef.current;\n\n const snapFractions = snapPoints.map((s) => parseSnapPercent(s) / 100);\n const startFraction = snapFractions[currentSnapIndexRef.current] ?? 0.5;\n\n // Positive deltaY = dragged down = sheet is now shorter (lower fraction)\n const newHeightFraction = startFraction - deltaY / vh;\n\n const lowestFraction = Math.min(...snapFractions);\n\n // Dismiss if dragged more than 20% below the lowest snap point\n if (newHeightFraction < lowestFraction - 0.2) {\n setDragTranslateYSync(null);\n onClose?.();\n return;\n }\n\n // Find nearest snap point by minimum absolute distance\n let nearestIndex = 0;\n let minDist = Infinity;\n for (let i = 0; i < snapFractions.length; i++) {\n const dist = Math.abs((snapFractions[i] ?? 0) - newHeightFraction);\n if (dist < minDist) {\n minDist = dist;\n nearestIndex = i;\n }\n }\n\n currentSnapIndexRef.current = nearestIndex;\n setCurrentSnapIndex(nearestIndex);\n setDragTranslateYSync(null);\n onSnapChange?.(nearestIndex);\n },\n [snapPoints, onClose, onSnapChange, setDragTranslateYSync]\n );\n\n // ── Keyboard handler ──────────────────────────────────────────────────────\n\n const onKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLElement>) => {\n if (e.key === \" \" || e.key === \"Enter\") {\n e.preventDefault();\n // Cycle to next snap point; wraps from last back to first\n const nextIndex = (currentSnapIndexRef.current + 1) % snapPoints.length;\n currentSnapIndexRef.current = nextIndex;\n setCurrentSnapIndex(nextIndex);\n onSnapChange?.(nextIndex);\n return;\n }\n\n if (e.key === \"ArrowUp\") {\n e.preventDefault();\n // Move to higher snap point (more expanded) if not already at max\n if (currentSnapIndexRef.current < snapPoints.length - 1) {\n const nextIndex = currentSnapIndexRef.current + 1;\n currentSnapIndexRef.current = nextIndex;\n setCurrentSnapIndex(nextIndex);\n onSnapChange?.(nextIndex);\n }\n return;\n }\n\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n // Move to lower snap point (less expanded); close if already at minimum\n if (currentSnapIndexRef.current > 0) {\n const nextIndex = currentSnapIndexRef.current - 1;\n currentSnapIndexRef.current = nextIndex;\n setCurrentSnapIndex(nextIndex);\n onSnapChange?.(nextIndex);\n } else {\n onClose?.();\n }\n }\n },\n [snapPoints, onClose, onSnapChange]\n );\n\n // ── Handle props ──────────────────────────────────────────────────────────\n\n const handleProps = useMemo<BottomSheetContextValue[\"handleProps\"]>(\n () => ({\n onPointerDown,\n onPointerUp,\n onKeyDown,\n tabIndex: 0,\n role: \"button\" as const,\n // MD3 spec: \"Label only the drag handle.\" Default communicates the action\n // without referencing touch gesture terminology. Override via BottomSheetHandleProps.\n \"aria-label\": \"Adjust sheet height\",\n // Slider-pattern ARIA — communicates current snap position like a range slider.\n // Screen readers announce: \"Adjust sheet height, 0 of 2\" (e.g. with 3 snap points).\n \"aria-valuemin\": 0,\n \"aria-valuenow\": currentSnapIndex,\n \"aria-valuemax\": snapPoints.length - 1,\n \"aria-orientation\": \"vertical\" as const,\n }),\n [onPointerDown, onPointerUp, onKeyDown, currentSnapIndex, snapPoints.length]\n );\n\n return {\n currentSnapIndex,\n isDragging,\n dragTranslateY,\n handleProps,\n };\n}\n","\"use client\";\n\nimport {\n createContext,\n forwardRef,\n useCallback,\n useContext,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport type React from \"react\";\nimport { FocusScope, useDialog, useOverlay, usePreventScroll } from \"react-aria\";\nimport { mergeProps } from \"@react-aria/utils\";\nimport { useOverlayTriggerState } from \"react-stately\";\nimport { cn } from \"../../utils/cn\";\nimport type {\n BottomSheetAnimationState,\n BottomSheetContextValue,\n BottomSheetHeadlessProps,\n} from \"./BottomSheet.types\";\nimport { useBottomSheetDrag } from \"./useBottomSheetDrag\";\n\n// ─── Context ──────────────────────────────────────────────────────────────────\n\n/**\n * Context shared between `BottomSheetHeadless` and its sub-components\n * (`BottomSheetHandle` and others).\n *\n * @internal\n */\nexport const BottomSheetContext = createContext<BottomSheetContextValue | null>(null);\n\n/**\n * Hook to consume `BottomSheetContext` inside bottom sheet sub-components.\n * Throws a descriptive error if used outside a `BottomSheetHeadless` tree.\n *\n * @internal\n */\nexport function useBottomSheetContext(): BottomSheetContextValue {\n const ctx = useContext(BottomSheetContext);\n if (ctx === null) {\n throw new Error(\n \"[BottomSheet] BottomSheetHandle and other sub-components must be rendered \" +\n \"inside a <BottomSheet> or <BottomSheetHeadless> component.\"\n );\n }\n return ctx;\n}\n\n// ─── BottomSheetModalPanel (internal) ────────────────────────────────────────\n\n/**\n * Internal panel component for the modal variant.\n * Wires `useDialog`, `useOverlay`, and `usePreventScroll`, then renders the\n * accessible dialog element.\n *\n * Follows the same pattern as `ModalDrawerPanel` in `DrawerHeadless` and\n * `DialogPanel` in `DialogHeadless`.\n *\n * @internal\n */\ninterface BottomSheetModalPanelProps {\n ariaLabel: string;\n onClose: () => void;\n className: string | undefined;\n animationState: BottomSheetAnimationState;\n getAnimationClassName: ((state: BottomSheetAnimationState) => string) | undefined;\n onTransitionEnd: () => void;\n forwardedRef: React.Ref<HTMLDivElement> | null;\n /** Whether a drag gesture is in progress — applied as data-dragging on the panel. */\n isDragging: boolean;\n /** Inline style providing snap-point height and drag translateY transform. */\n panelStyle: React.CSSProperties;\n children: React.ReactNode;\n}\n\nconst BottomSheetModalPanel = ({\n ariaLabel,\n onClose,\n className,\n animationState,\n getAnimationClassName,\n onTransitionEnd,\n forwardedRef,\n isDragging,\n panelStyle,\n children,\n}: BottomSheetModalPanelProps): React.ReactElement => {\n // Internal ref for React Aria hooks — always an object ref\n const panelRef = useRef<HTMLDivElement | null>(null);\n\n // Lock body scroll while the modal sheet is mounted\n usePreventScroll();\n\n // Provides role=\"dialog\", aria-label, aria-modal\n const { dialogProps } = useDialog(\n { \"aria-label\": ariaLabel },\n panelRef as React.RefObject<HTMLDivElement>\n );\n\n // Handles Escape key and outside-pointer dismissal\n const { overlayProps } = useOverlay(\n { isOpen: true, onClose, isDismissable: true, shouldCloseOnBlur: false },\n panelRef as React.RefObject<HTMLDivElement>\n );\n\n // Merge the internal panelRef with the forwarded ref from BottomSheetHeadless\n const setRef = useCallback(\n (node: HTMLDivElement | null) => {\n panelRef.current = node;\n if (typeof forwardedRef === \"function\") {\n forwardedRef(node);\n } else if (forwardedRef !== null) {\n (forwardedRef as React.MutableRefObject<HTMLDivElement | null>).current = node;\n }\n },\n [forwardedRef]\n );\n\n return (\n <div\n {...mergeProps(overlayProps, dialogProps)}\n ref={setRef}\n aria-modal=\"true\"\n className={cn(className, getAnimationClassName?.(animationState))}\n data-animation-state={animationState}\n data-dragging={isDragging || undefined}\n style={panelStyle}\n onTransitionEnd={onTransitionEnd}\n >\n {children}\n </div>\n );\n};\n\nBottomSheetModalPanel.displayName = \"BottomSheetModalPanel\";\n\n// ─── BottomSheetHeadless ──────────────────────────────────────────────────────\n\n/**\n * `BottomSheetHeadless` — Layer 2 headless primitive (Milestone 2: state + portal).\n *\n * Implements open/close state management, portal rendering to `document.body`,\n * the animation state machine, and `BottomSheetContext` provisioning.\n * Dialog semantics, scrim, focus trap, and drag/snap logic are added in M03+.\n *\n * - **Portal rendering**: content renders in `document.body` via `createPortal`\n * - **Open/close state**: `useOverlayTriggerState` (controlled + uncontrolled)\n * - **Animation state machine**: `entering → visible → exiting → exited`\n * - **Portal gate**: removes DOM content when `!isOpen && animationState === 'exited'`\n * - **SSR guard**: returns `null` when `document` is undefined\n *\n * @example\n * ```tsx\n * // Controlled\n * <BottomSheetHeadless open={open} onOpenChange={setOpen} aria-label=\"Options\">\n * <BottomSheetHandle />\n * <p>Content here</p>\n * </BottomSheetHeadless>\n *\n * // Uncontrolled\n * <BottomSheetHeadless defaultOpen aria-label=\"Player\">\n * <p>Audio player</p>\n * </BottomSheetHeadless>\n * ```\n */\nexport const BottomSheetHeadless = forwardRef<HTMLDivElement, BottomSheetHeadlessProps>(\n function BottomSheetHeadless(\n {\n variant = \"modal\",\n open,\n defaultOpen = false,\n onOpenChange,\n snapPoints = [\"50%\"],\n \"aria-label\": ariaLabel,\n children,\n className,\n scrimClassName,\n getAnimationClassName,\n },\n ref\n ) {\n // ── Open/close state ──────────────────────────────────────────────────────\n\n const state = useOverlayTriggerState({\n ...(open !== undefined ? { isOpen: open } : {}),\n ...(defaultOpen !== undefined ? { defaultOpen } : {}),\n ...(onOpenChange !== undefined ? { onOpenChange } : {}),\n });\n\n const isOpen = state.isOpen;\n\n const close = useCallback(() => {\n state.close();\n }, [state]);\n\n // ── Animation state machine ───────────────────────────────────────────────\n\n const [animationState, setAnimationState] = useState<BottomSheetAnimationState>(\"exited\");\n // Guard against calling state updates after the exit animation completes multiple times\n const closedRef = useRef<boolean>(false);\n // Fallback timer for exit animation — fires if onTransitionEnd doesn't fire in time\n const exitFallbackRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n // Entry: isOpen becomes true → 'entering' → setTimeout(0) → 'visible'\n useEffect(() => {\n if (!isOpen) return;\n\n closedRef.current = false;\n setAnimationState(\"entering\");\n\n // Zero-delay timer ensures 'entering' state is committed (allowing CSS\n // transition initial values to paint) before advancing to 'visible'.\n const id = setTimeout(() => {\n setAnimationState(\"visible\");\n }, 0);\n\n return () => clearTimeout(id);\n }, [isOpen]);\n\n // Exit: isOpen becomes false while 'visible' → 'exiting' → 300ms fallback → 'exited'\n useEffect(() => {\n if (isOpen) return;\n if (animationState === \"exited\" || animationState === \"entering\") return;\n\n if (animationState === \"visible\") {\n setAnimationState(\"exiting\");\n\n // 300ms fallback (longer than Dialog's 150ms — slide animations take longer)\n exitFallbackRef.current = setTimeout(() => {\n if (!closedRef.current) {\n closedRef.current = true;\n setAnimationState(\"exited\");\n }\n }, 300);\n }\n }, [isOpen, animationState]);\n\n // Cleanup fallback timer on unmount\n useEffect(\n () => () => {\n if (exitFallbackRef.current !== null) {\n clearTimeout(exitFallbackRef.current);\n }\n },\n []\n );\n\n const handleTransitionEnd = useCallback(() => {\n if (animationState === \"exiting\" && !closedRef.current) {\n if (exitFallbackRef.current !== null) {\n clearTimeout(exitFallbackRef.current);\n exitFallbackRef.current = null;\n }\n closedRef.current = true;\n setAnimationState(\"exited\");\n }\n }, [animationState]);\n\n // ── Drag handle interaction and snap logic (M04) ──────────────────────────\n\n const {\n currentSnapIndex,\n isDragging,\n dragTranslateY,\n handleProps: dragHandleProps,\n } = useBottomSheetDrag({ snapPoints, onClose: close });\n\n // The hook's default aria-label \"Adjust sheet height\" is the correct label per MD3 spec.\n // Consumers can override via BottomSheetHandleProps[\"aria-label\"] on <BottomSheetHandle />.\n const handleProps = dragHandleProps;\n\n // ── Panel inline style ────────────────────────────────────────────────────\n //\n // The sheet's visible height is driven by the active snap point. Since the\n // panel is `position: fixed; bottom: 0`, percentage heights are relative to\n // the viewport, which is exactly what snap points represent (e.g. \"50%\" = 50vh).\n //\n // During a drag gesture, the height is adjusted by the pointer delta so the\n // sheet resizes from the bottom edge — matching MD3 spec behaviour:\n // \"A bottom sheet can automatically resize to another height after interacting\n // with the drag handle\" (detail.md §Dragging).\n //\n // dragTranslateY > 0: dragging DOWN → height decreases (sheet shrinks from top)\n // dragTranslateY < 0: dragging UP → height increases (sheet grows from top)\n // calc(50% - 50px) → sheet is 50px shorter than its snap height\n // calc(50% + 50px) → sheet is 50px taller than its snap height\n //\n // The `data-[dragging=true]:transition-none` CVA class suppresses the height\n // spring while dragging is active so the sheet follows the pointer without lag.\n // After release, the transition animates height to the nearest snap position.\n const snapHeight = snapPoints[currentSnapIndex] ?? \"50%\";\n const panelStyle: React.CSSProperties = {\n height:\n isDragging && dragTranslateY !== null\n ? `calc(${snapHeight} - ${dragTranslateY}px)`\n : snapHeight,\n };\n\n // ── Context value ─────────────────────────────────────────────────────────\n\n const contextValue: BottomSheetContextValue = {\n isOpen,\n variant,\n snapPoints,\n currentSnapIndex,\n isDragging,\n dragTranslateY,\n close,\n handleProps,\n };\n\n // ── Scrim dismissal (modal always dismissable per MD3 spec) ───────────────\n\n const handleScrimClick = (): void => {\n close();\n };\n\n // ── Portal gate ───────────────────────────────────────────────────────────\n\n // Remove portal content entirely once the exit animation has fully completed\n if (!isOpen && animationState === \"exited\") {\n return null;\n }\n\n // ── SSR guard ─────────────────────────────────────────────────────────────\n\n if (typeof document === \"undefined\") return null;\n\n // ── Portal content ────────────────────────────────────────────────────────\n\n const content =\n variant === \"modal\" ? (\n // Modal: dialog semantics + focus trap + scrim\n <BottomSheetContext.Provider value={contextValue}>\n <FocusScope contain restoreFocus autoFocus>\n {/* Scrim — aria-hidden so assistive tech ignores it */}\n <div\n data-testid=\"bottom-sheet-scrim\"\n className={scrimClassName}\n onClick={handleScrimClick}\n aria-hidden=\"true\"\n />\n <BottomSheetModalPanel\n ariaLabel={ariaLabel}\n onClose={close}\n className={className}\n animationState={animationState}\n getAnimationClassName={getAnimationClassName}\n onTransitionEnd={handleTransitionEnd}\n forwardedRef={ref}\n isDragging={isDragging}\n panelStyle={panelStyle}\n >\n {children}\n </BottomSheetModalPanel>\n </FocusScope>\n </BottomSheetContext.Provider>\n ) : (\n // Standard: plain surface, no dialog role, no scrim, no focus trap\n <BottomSheetContext.Provider value={contextValue}>\n <div\n ref={ref}\n className={cn(className, getAnimationClassName?.(animationState))}\n data-animation-state={animationState}\n data-dragging={isDragging || undefined}\n style={panelStyle}\n onTransitionEnd={handleTransitionEnd}\n >\n {children}\n </div>\n </BottomSheetContext.Provider>\n );\n\n return createPortal(content, document.body) as React.ReactElement;\n }\n);\n\nBottomSheetHeadless.displayName = \"BottomSheetHeadless\";\n","import { cva, type VariantProps } from \"class-variance-authority\";\n\n// ─── Animation variants ───────────────────────────────────────────────────────\n\n/**\n * CVA animation state variants for the Bottom Sheet panel.\n *\n * Motion decision rationale:\n * - Bottom sheet is a standard-size component → `default` speed tier\n * - Slides in/out of screen → composite `animate-md-*` utilities (not manual spring tokens)\n * - Scrim opacity is an effects property → `duration-short4 ease-standard` (legacy screen-level token)\n * - Snap spring is a spatial on-screen transition → `ease-spring-standard-default-spatial` +\n * `duration-spring-standard-default-spatial` (applied in bottomSheetVariants base)\n * - Standard personality (not expressive) — sheets are utility UI, not moments of delight\n */\nexport const bottomSheetAnimationVariants = cva(\"\", {\n variants: {\n animationState: {\n // entering: initial mount frame — sheet starts below viewport (translateY(100%))\n // The CSS is handled inside animate-md-slide-in-bottom keyframes\n entering: [\"opacity-0\"],\n // visible: entry animation active — animate-md-slide-in-bottom runs once\n visible: [\"animate-md-slide-in-bottom\"],\n // exiting: exit animation active — animate-md-slide-out-bottom runs once\n exiting: [\"animate-md-slide-out-bottom\"],\n // exited: portal gate removes element — no classes needed\n exited: [\"opacity-0\", \"pointer-events-none\"],\n },\n },\n defaultVariants: {\n animationState: \"entering\",\n },\n});\n\nexport type BottomSheetAnimationVariants = VariantProps<typeof bottomSheetAnimationVariants>;\n\n// ─── Sheet container ──────────────────────────────────────────────────────────\n\n/**\n * CVA variants for the Bottom Sheet container panel.\n *\n * MD3 tokens applied:\n * - Surface: bg-surface-container-low\n * - Elevation: shadow-elevation-1\n * - Shape: rounded-t-xl (top-left + top-right 28dp, bottom 0)\n * - Width: full width up to 640dp; centered at max-width 640dp on wider viewports\n * (`mx-auto + max-w-[640px]` — at 752dp viewport this naturally produces the MD3-spec 56dp side margins)\n * - Height: constrained by max-height (72dp top margin by default, 56dp on > 640dp viewport)\n * The sheet is always anchored to `bottom-0`; \"top margin\" is expressed as max-height so\n * the sheet cannot overlap the top portion of the screen.\n * - Drag resize: height animates via `transition-[height]`; the sheet grows/shrinks from the\n * bottom edge, always staying anchored — matching the MD3 spec \"resize to another height\" behaviour.\n */\nexport const bottomSheetVariants = cva(\n [\n // Position: fixed to bottom edge, full width\n \"fixed\",\n \"bottom-0\",\n \"left-0\",\n \"right-0\",\n\n // Surface token\n \"bg-surface-container-low\",\n\n // Elevation level 1 per MD3 spec\n \"shadow-elevation-1\",\n\n // Shape: extra-large top corners (28dp), bottom corners are 0 (attached to screen edge)\n \"rounded-t-xl\",\n\n // Layout\n \"flex\",\n \"flex-col\",\n\n // Max width constraint (full width up to 640dp)\n \"mx-auto\",\n // NOTE: measurement-derived value from MD3 spec; permitted exception\n \"w-[640px] max-w-full\",\n\n // Clip content during height transitions (sheet shrinks/grows from bottom edge)\n \"overflow-hidden\",\n\n // Transition: height for snap spring (MD3 spec — sheet \"resizes\" between heights)\n // Standard personality, default speed tier, spatial: no overshoot.\n // During drag, data-[dragging=true]:transition-none suppresses this so the\n // sheet height follows the pointer 1:1 without transition lag.\n // After drag release, the spring transition animates height to the new snap position.\n \"transition-[height]\",\n \"duration-spring-standard-default-spatial\",\n \"ease-spring-standard-default-spatial\",\n \"data-[dragging=true]:transition-none\",\n \"will-change-[height]\",\n\n // Responsive layout: when viewport > 640dp, apply wider top margin per MD3 spec.\n // The sheet remains bottom-anchored at all sizes. Side centering is handled by\n // mx-auto + max-w-[640px] — at 752dp viewport this naturally produces 56dp side\n // margins on each side (exactly matching MD3 measurements).\n // Top margin is expressed as max-height so the sheet cannot overlap the top edge:\n // - Default: 72dp top margin (max-h-[calc(100vh-72px)])\n // - Wide viewport (> 640dp): 56dp top margin (sm:max-h-[calc(100vh-56px)])\n // NOTE: measurement-derived values from MD3 spec; permitted exception\n \"max-h-[calc(100vh-72px)]\",\n \"sm:max-h-[calc(100vh-56px)]\",\n // Top corners rounded at wide layout (sheet floats away from screen edge)\n \"rounded-t-xl\",\n ],\n {\n variants: {\n variant: {\n // Modal: above scrim (z-50)\n modal: \"z-50\",\n // Standard: sits above normal content but below overlays\n standard: \"z-10\",\n },\n },\n defaultVariants: {\n variant: \"modal\",\n },\n }\n);\n\nexport type BottomSheetVariants = VariantProps<typeof bottomSheetVariants>;\n\n// ─── Scrim overlay ────────────────────────────────────────────────────────────\n\n/**\n * CVA for the scrim overlay (modal variant only).\n *\n * MD3 tokens applied:\n * - bg-scrim: scrim surface role\n * - opacity-32: 32% opacity per MD3 spec\n * - Transition: opacity fade (scrim is an effects property — legacy screen-level tokens)\n */\nexport const bottomSheetScrimVariants = cva([\n \"fixed\",\n \"inset-0\",\n \"z-40\",\n \"bg-scrim\",\n \"opacity-32\",\n \"transition-opacity\",\n \"duration-short4\",\n \"ease-standard\",\n]);\n\nexport type BottomSheetScrimVariants = VariantProps<typeof bottomSheetScrimVariants>;\n\n// ─── Drag handle ──────────────────────────────────────────────────────────────\n\n/**\n * CVA for the drag handle wrapper (touch/click target area).\n *\n * MD3 spec: the top 48dp of the sheet is the interactive touch target area\n * when the drag handle is present. The wrapper provides this touch target.\n */\nexport const bottomSheetHandleWrapperVariants = cva([\n // Center the handle pill horizontally\n \"flex\",\n \"items-center\",\n \"justify-center\",\n\n // Top/bottom padding creates the 48dp touch target area\n // 22dp top + 4dp handle + 22dp bottom ≈ 48dp interaction zone (per MD3 measurements)\n // NOTE: measurement-derived value from MD3 spec; permitted exception\n \"py-[22px]\",\n\n // Full width so the touch target spans the sheet\n \"w-full\",\n\n // Focus ring styling for keyboard/switch navigation\n // MD3 spec: focus indicator color = secondary, thickness = 3dp, offset = 2dp\n \"focus-visible:outline-none\",\n \"focus-visible:ring-3\",\n \"focus-visible:ring-secondary\",\n \"focus-visible:ring-offset-2\",\n \"focus-visible:rounded-sm\",\n\n // Cursor affordance\n \"cursor-ns-resize\",\n]);\n\n/**\n * CVA for the drag handle pill visual element.\n *\n * MD3 tokens applied:\n * - bg-on-surface-variant: handle color\n * - w-8: 32dp width per MD3 spec\n * - h-1: 4dp height per MD3 spec\n * - rounded-full: fully rounded pill shape\n * - opacity-40: per MD3 spec (token deprecated but value still in spec)\n */\nexport const bottomSheetHandlePillVariants = cva([\n \"bg-on-surface-variant\",\n \"opacity-40\",\n \"rounded-full\",\n\n // Dimensions: 32dp × 4dp per MD3 spec (measurement-derived; permitted exception)\n \"w-8\", // 32dp = 2rem = w-8\n \"h-1\", // 4dp = 0.25rem = h-1\n\n // Pill itself is decorative; the wrapper handles interaction\n \"pointer-events-none\",\n]);\n\nexport type BottomSheetHandleVariants = VariantProps<typeof bottomSheetHandleWrapperVariants>;\n","\"use client\";\n\nimport type { ReactElement } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { useBottomSheetContext } from \"./BottomSheetHeadless\";\nimport {\n bottomSheetHandleWrapperVariants,\n bottomSheetHandlePillVariants,\n} from \"./BottomSheet.variants\";\nimport type { BottomSheetHandleProps } from \"./BottomSheet.types\";\n\nfunction BottomSheetHandle({\n className,\n \"aria-label\": ariaLabelOverride,\n}: BottomSheetHandleProps): ReactElement {\n const { handleProps, isDragging } = useBottomSheetContext();\n\n return (\n <div\n {...handleProps}\n {...(ariaLabelOverride !== undefined ? { \"aria-label\": ariaLabelOverride } : {})}\n className={cn(bottomSheetHandleWrapperVariants(), className)}\n data-testid=\"bottom-sheet-handle\"\n data-dragging={isDragging || undefined}\n >\n <span className={bottomSheetHandlePillVariants()} aria-hidden=\"true\" />\n </div>\n );\n}\n\nBottomSheetHandle.displayName = \"BottomSheetHandle\";\n\nexport { BottomSheetHandle };\n","\"use client\";\n\nimport { forwardRef, useCallback } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { BottomSheetHeadless } from \"./BottomSheetHeadless\";\nimport { BottomSheetHandle } from \"./BottomSheetHandle\";\nimport {\n bottomSheetVariants,\n bottomSheetScrimVariants,\n bottomSheetAnimationVariants,\n} from \"./BottomSheet.variants\";\nimport { useReducedMotion } from \"../../hooks/useReducedMotion\";\nimport type { BottomSheetProps, BottomSheetAnimationState } from \"./BottomSheet.types\";\n\n/**\n * `BottomSheet` — Layer 3 MD3 Styled Bottom Sheet Component.\n *\n * Applies Material Design 3 visual tokens via CVA variants, renders the drag\n * handle automatically, and wires up the scrim overlay for the modal variant.\n * Built on top of `BottomSheetHeadless` (Layer 2) for full accessibility.\n *\n * **Modal** (default):\n * - `bg-surface-container-low`, `shadow-elevation-1`, `rounded-t-xl`\n * - Full-width scrim overlay (`z-40`) with 32% opacity\n * - Sheet panel at `z-50`, dismissable via Escape, scrim click, or drag\n *\n * **Standard**:\n * - Same visual surface, no scrim, no focus trap, co-exists with content\n * - Sheet panel at `z-10`\n *\n * Responsive layout (> 640dp viewport):\n * - 56dp side margins and 56dp top margin (`sm:mx-14 sm:top-14`)\n * - All corners rounded (`sm:rounded-xl`) — sheet floats away from screen edge\n *\n * @example\n * ```tsx\n * // Modal variant — controlled\n * <BottomSheet\n * open={open}\n * onOpenChange={setOpen}\n * snapPoints={['50%', '90%']}\n * aria-label=\"Share options\"\n * >\n * <p>Share to...</p>\n * </BottomSheet>\n *\n * // Standard variant — uncontrolled\n * <BottomSheet variant=\"standard\" defaultOpen aria-label=\"Now playing\">\n * <p>Song title</p>\n * </BottomSheet>\n * ```\n *\n * @see https://m3.material.io/components/bottom-sheets/overview\n */\nexport const BottomSheet = forwardRef<HTMLDivElement, BottomSheetProps>(function BottomSheet(\n {\n variant = \"modal\",\n open,\n defaultOpen,\n onOpenChange,\n snapPoints,\n \"aria-label\": ariaLabel,\n children,\n className,\n },\n ref\n) {\n const reducedMotion = useReducedMotion();\n\n /**\n * Returns the CVA animation class for the current animation state.\n * Returns empty string when the user prefers reduced motion, suppressing\n * all JS-driven slide animations per WCAG 2.1 AA and MD3 reduce-motion spec.\n */\n const getAnimationClassName = useCallback(\n (state: BottomSheetAnimationState): string => {\n if (reducedMotion) return \"\";\n return bottomSheetAnimationVariants({ animationState: state });\n },\n [reducedMotion]\n );\n\n // When reducedMotion is true, append transition-none to override the snap\n // spring transition-transform added in bottomSheetVariants base.\n // tailwind-merge resolves the conflict and keeps transition-none.\n const panelClassName = cn(\n bottomSheetVariants({ variant }),\n reducedMotion && \"transition-none\",\n className\n );\n const scrimClassName = bottomSheetScrimVariants();\n\n return (\n <BottomSheetHeadless\n ref={ref}\n variant={variant}\n {...(open !== undefined ? { open } : {})}\n {...(defaultOpen !== undefined ? { defaultOpen } : {})}\n {...(onOpenChange !== undefined ? { onOpenChange } : {})}\n {...(snapPoints !== undefined ? { snapPoints } : {})}\n aria-label={ariaLabel}\n className={panelClassName}\n scrimClassName={scrimClassName}\n getAnimationClassName={getAnimationClassName}\n >\n <BottomSheetHandle />\n {children}\n </BottomSheetHeadless>\n );\n});\n\nBottomSheet.displayName = \"BottomSheet\";\n","\"use client\";\n\nimport type { ClockHandProps } from \"./TimePicker.types\";\n\n/**\n * Headless ClockHand (Layer 2)\n *\n * Renders the clock hand selector: a center dot (8dp), a track line (2dp),\n * and a handle circle (48dp) at the selected angular position.\n *\n * This is a headless component — it provides behavior, ARIA semantics, and\n * data attributes only. No styling classes are applied.\n *\n * @internal\n */\nexport function ClockHand({\n angle,\n mode,\n isInnerRing = false,\n className,\n}: ClockHandProps): JSX.Element {\n return (\n <div\n className={className}\n data-clock-hand\n data-mode={mode}\n {...(isInnerRing ? { \"data-inner-ring\": \"\" } : {})}\n style={{ transform: `rotate(${angle}deg)` }}\n aria-hidden=\"true\"\n >\n <div data-clock-hand-center />\n <div data-clock-hand-track />\n <div data-clock-hand-handle />\n </div>\n );\n}\n\nClockHand.displayName = \"ClockHand\";\n","\"use client\";\n\nimport { useCallback, useRef, useState } from \"react\";\n\nimport type { UseClockDialOptions, UseClockDialReturn } from \"./TimePicker.types\";\n\n/**\n * Radius threshold ratio for distinguishing inner vs outer ring in 24h mode.\n * Pointer distance from center below this fraction of the dial radius selects inner ring.\n */\nconst INNER_RING_THRESHOLD_RATIO = 0.65;\n\n/**\n * Converts a pointer position relative to the clock dial center\n * into an angle in degrees measured clockwise from 12 o'clock.\n */\nfunction pointerToAngle(clientX: number, clientY: number, rect: DOMRect): number {\n const centerX = rect.left + rect.width / 2;\n const centerY = rect.top + rect.height / 2;\n const dx = clientX - centerX;\n const dy = -(clientY - centerY);\n const radians = Math.atan2(dx, dy);\n return ((radians * 180) / Math.PI + 360) % 360;\n}\n\n/**\n * Returns the distance from the pointer to the center of the dial, normalised\n * to the dial radius (0 = center, 1 = edge).\n */\nfunction pointerDistanceRatio(clientX: number, clientY: number, rect: DOMRect): number {\n const centerX = rect.left + rect.width / 2;\n const centerY = rect.top + rect.height / 2;\n const dx = clientX - centerX;\n const dy = clientY - centerY;\n const radius = rect.width / 2;\n return Math.sqrt(dx * dx + dy * dy) / radius;\n}\n\n/**\n * Snaps an angle to the nearest hour value (12 positions, 30° each).\n * Returns the hour value (1-12).\n */\nfunction angleToHour12(degrees: number): number {\n const snapped = Math.round(degrees / 30) % 12;\n return snapped === 0 ? 12 : snapped;\n}\n\n/**\n * Snaps an angle + distance to the nearest 24h hour value (0-23).\n * Outer ring: 1-12, inner ring: 13-24 (with 0 replacing 24).\n */\nfunction angleToHour24(degrees: number, isInner: boolean): number {\n const snapped = Math.round(degrees / 30) % 12;\n if (isInner) {\n return snapped === 0 ? 0 : snapped + 12;\n }\n return snapped === 0 ? 12 : snapped;\n}\n\n/**\n * Snaps an angle to the nearest minute value (60 positions, 6° each).\n * Respects minuteStep by rounding to the nearest step.\n */\nfunction angleToMinute(degrees: number, step: number): number {\n const rawMinute = Math.round(degrees / 6) % 60;\n if (step <= 1) return rawMinute;\n return (Math.round(rawMinute / step) * step) % 60;\n}\n\n/**\n * Converts a selected value back to an angle for clock hand rendering.\n */\nfunction valueToAngle(value: number, mode: \"hour\" | \"minute\"): number {\n if (mode === \"hour\") {\n return ((value % 12) * 30) % 360;\n }\n return (value * 6) % 360;\n}\n\n/**\n * Custom hook for clock dial interaction.\n * Converts pointer position to angular value selection.\n *\n * @param options - Configuration for the clock dial hook\n * @returns Props to spread on the dial container, hand angle, and interaction state\n *\n * @example\n * ```tsx\n * const { dialProps, handAngle, isDragging, isInnerRing } = useClockDial({\n * selectionMode: 'hour',\n * hourCycle: 12,\n * onSelect: (value) => setHour(value),\n * containerRef: dialRef,\n * });\n * ```\n */\nexport function useClockDial(options: UseClockDialOptions): UseClockDialReturn {\n const {\n selectionMode,\n hourCycle,\n onSelect,\n containerRef,\n isDisabled = false,\n minuteStep = 1,\n } = options;\n\n const [isDragging, setIsDragging] = useState(false);\n const [isInnerRing, setIsInnerRing] = useState(false);\n const [handAngle, setHandAngle] = useState(0);\n const activePointerIdRef = useRef<number | null>(null);\n\n const resolveValue = useCallback(\n (clientX: number, clientY: number) => {\n const el = containerRef.current;\n if (!el) return;\n const rect = el.getBoundingClientRect();\n const angle = pointerToAngle(clientX, clientY, rect);\n\n if (selectionMode === \"hour\") {\n if (hourCycle === 24) {\n const distRatio = pointerDistanceRatio(clientX, clientY, rect);\n const inner = distRatio < INNER_RING_THRESHOLD_RATIO;\n setIsInnerRing(inner);\n const hour = angleToHour24(angle, inner);\n setHandAngle(valueToAngle(hour, \"hour\"));\n onSelect?.(hour);\n } else {\n setIsInnerRing(false);\n const hour = angleToHour12(angle);\n setHandAngle(valueToAngle(hour, \"hour\"));\n onSelect?.(hour);\n }\n } else {\n setIsInnerRing(false);\n const minute = angleToMinute(angle, minuteStep);\n setHandAngle(valueToAngle(minute, \"minute\"));\n onSelect?.(minute);\n }\n },\n [selectionMode, hourCycle, onSelect, containerRef, minuteStep]\n );\n\n const handlePointerDown = useCallback(\n (e: React.PointerEvent<HTMLDivElement>) => {\n if (isDisabled) return;\n e.preventDefault();\n activePointerIdRef.current = e.pointerId;\n const target = e.currentTarget as HTMLDivElement;\n if (typeof target.setPointerCapture === \"function\") {\n target.setPointerCapture(e.pointerId);\n }\n setIsDragging(true);\n resolveValue(e.clientX, e.clientY);\n },\n [isDisabled, resolveValue]\n );\n\n const handlePointerMove = useCallback(\n (e: React.PointerEvent<HTMLDivElement>) => {\n if (!isDragging || isDisabled) return;\n if (e.pointerId !== activePointerIdRef.current) return;\n resolveValue(e.clientX, e.clientY);\n },\n [isDragging, isDisabled, resolveValue]\n );\n\n const handlePointerUp = useCallback(\n (e: React.PointerEvent<HTMLDivElement>) => {\n if (isDisabled) return;\n if (e.pointerId !== activePointerIdRef.current) return;\n const target = e.currentTarget as HTMLDivElement;\n if (typeof target.releasePointerCapture === \"function\") {\n target.releasePointerCapture(e.pointerId);\n }\n activePointerIdRef.current = null;\n setIsDragging(false);\n },\n [isDisabled]\n );\n\n const dialProps: React.HTMLAttributes<HTMLDivElement> = {\n onPointerDown: handlePointerDown,\n onPointerMove: handlePointerMove,\n onPointerUp: handlePointerUp,\n ...(isDragging ? { \"data-dragging\": \"\" } : {}),\n };\n\n return {\n dialProps,\n handAngle,\n isDragging,\n isInnerRing,\n };\n}\n","\"use client\";\n\nimport { useCallback, useRef } from \"react\";\n\nimport { ClockHand } from \"./ClockHand\";\nimport { useClockDial } from \"./useClockDial\";\n\nimport type { ClockDialProps } from \"./TimePicker.types\";\n\n/** 12-hour number labels (1-12). */\nconst HOURS_12: readonly number[] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] as const;\n\n/** Outer ring for 24h mode (1-12). */\nconst HOURS_24_OUTER: readonly number[] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] as const;\n\n/** Inner ring for 24h mode (13-24, with 0 replacing 24). */\nconst HOURS_24_INNER: readonly number[] = [13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 0] as const;\n\n/**\n * Converts a numeric position (0-11 around the dial) to x/y percentages\n * on a circle, starting from 12 o'clock and going clockwise.\n */\nfunction positionOnCircle(\n index: number,\n total: number,\n radiusPercent: number\n): { x: number; y: number } {\n const angleDeg = (index * 360) / total - 90;\n const angleRad = (angleDeg * Math.PI) / 180;\n return {\n x: 50 + radiusPercent * Math.cos(angleRad),\n y: 50 + radiusPercent * Math.sin(angleRad),\n };\n}\n\n/**\n * Converts a selected value to an angle in degrees from 12 o'clock.\n */\nfunction valueToAngle(value: number, mode: \"hour\" | \"minute\"): number {\n if (mode === \"hour\") {\n return ((value % 12) * 30) % 360;\n }\n return (value * 6) % 360;\n}\n\n/**\n * Headless ClockDial (Layer 2)\n *\n * Renders a circular clock face with numbered positions for hour or minute selection.\n * Uses the `useClockDial` custom hook for pointer-to-angle interaction.\n *\n * - 12-hour: single ring with numbers 1-12 at 30° intervals\n * - 24-hour: outer ring 1-12, inner ring 13-24 (with 0)\n * - Each number is a 48dp touch target\n *\n * This is a headless component — it provides behavior, ARIA semantics, and\n * data attributes only. No styling classes are applied.\n *\n * @internal\n */\nexport function ClockDial({\n selectionMode,\n selectedHour,\n selectedMinute,\n hourCycle,\n minuteStep = 1,\n onSelect,\n isDisabled = false,\n className,\n}: ClockDialProps): JSX.Element {\n const containerRef = useRef<HTMLDivElement>(null);\n\n const { dialProps, handAngle, isDragging, isInnerRing } = useClockDial({\n selectionMode,\n hourCycle,\n ...(onSelect ? { onSelect } : {}),\n containerRef,\n isDisabled,\n minuteStep,\n });\n\n const currentValue = selectionMode === \"hour\" ? selectedHour : selectedMinute;\n const displayAngle = isDragging ? handAngle : valueToAngle(currentValue, selectionMode);\n\n const isInnerSelected =\n selectionMode === \"hour\" && hourCycle === 24 && (currentValue === 0 || currentValue > 12);\n\n const resolvedIsInner = isDragging ? isInnerRing : isInnerSelected;\n\n const handleNumberClick = useCallback(\n (value: number) => {\n if (isDisabled) return;\n onSelect?.(value);\n },\n [isDisabled, onSelect]\n );\n\n const handleNumberKeyDown = useCallback(\n (e: React.KeyboardEvent, value: number) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n handleNumberClick(value);\n }\n },\n [handleNumberClick]\n );\n\n const renderClockNumber = (\n key: string,\n value: number,\n label: string,\n pos: { x: number; y: number },\n isSelected: boolean,\n extraAttrs?: Record<string, string>\n ): JSX.Element => (\n <div\n key={key}\n role=\"option\"\n tabIndex={isDisabled ? -1 : 0}\n aria-selected={isSelected}\n aria-label={`${value}`}\n data-clock-number\n data-value={value}\n {...(isSelected ? { \"data-selected\": \"\" } : {})}\n {...extraAttrs}\n style={{\n position: \"absolute\",\n left: `${pos.x}%`,\n top: `${pos.y}%`,\n transform: \"translate(-50%, -50%)\",\n }}\n onClick={() => handleNumberClick(value)}\n onKeyDown={(e) => handleNumberKeyDown(e, value)}\n >\n {label}\n </div>\n );\n\n const renderHourNumbers = (): JSX.Element[] => {\n if (hourCycle === 24) {\n const outerNumbers = HOURS_24_OUTER.map((hour, i) => {\n const pos = positionOnCircle(i, 12, 40);\n const isSelected = selectionMode === \"hour\" && selectedHour === hour;\n return renderClockNumber(`outer-${hour}`, hour, `${hour}`, pos, isSelected);\n });\n const innerNumbers = HOURS_24_INNER.map((hour, i) => {\n const pos = positionOnCircle(i, 12, 25);\n const isSelected = selectionMode === \"hour\" && selectedHour === hour;\n return renderClockNumber(`inner-${hour}`, hour, `${hour}`, pos, isSelected, {\n \"data-inner-ring\": \"\",\n });\n });\n return [...outerNumbers, ...innerNumbers];\n }\n\n return HOURS_12.map((hour, i) => {\n const pos = positionOnCircle(i, 12, 40);\n const isSelected = selectionMode === \"hour\" && selectedHour === hour;\n return renderClockNumber(`${hour}`, hour, `${hour}`, pos, isSelected);\n });\n };\n\n const renderMinuteNumbers = (): JSX.Element[] => {\n const minuteLabels = Array.from({ length: 12 }, (_, i) => i * 5);\n return minuteLabels.map((minute, i) => {\n const pos = positionOnCircle(i, 12, 40);\n const isSelected = selectionMode === \"minute\" && selectedMinute === minute;\n return renderClockNumber(\n `${minute}`,\n minute,\n String(minute).padStart(2, \"0\"),\n pos,\n isSelected\n );\n });\n };\n\n return (\n <div\n ref={containerRef}\n {...dialProps}\n className={className}\n role=\"listbox\"\n aria-label={selectionMode === \"hour\" ? \"Clock dial hours\" : \"Clock dial minutes\"}\n data-clock-dial\n data-selection-mode={selectionMode}\n data-hour-cycle={hourCycle}\n {...(isDisabled ? { \"data-disabled\": \"\" } : {})}\n style={{ position: \"relative\", touchAction: \"none\" }}\n >\n <ClockHand angle={displayAngle} mode={selectionMode} isInnerRing={resolvedIsInner} />\n {selectionMode === \"hour\" ? renderHourNumbers() : renderMinuteNumbers()}\n </div>\n );\n}\n\nClockDial.displayName = \"ClockDial\";\n","\"use client\";\n\nimport { useCallback, useRef } from \"react\";\nimport { useFocusRing, mergeProps } from \"react-aria\";\n\nimport type { TimeSelectorProps } from \"./TimePicker.types\";\n\n/**\n * Formats hour for display, respecting the hour cycle.\n * - 12h: displays 1-12\n * - 24h: displays 0-23 (zero-padded)\n */\nfunction formatHour(hour: number, hourCycle: 12 | 24): string {\n if (hourCycle === 12) {\n const display = hour % 12;\n return String(display === 0 ? 12 : display).padStart(2, \"0\");\n }\n return String(hour).padStart(2, \"0\");\n}\n\n/**\n * Formats minute for display (always zero-padded to 2 digits).\n */\nfunction formatMinute(minute: number): string {\n return String(minute).padStart(2, \"0\");\n}\n\n/**\n * Headless TimeSelector (Layer 2)\n *\n * Renders the hour:minute display with two large interactive containers\n * acting as `role=\"spinbutton\"` elements. Users can click to switch between\n * hour and minute selection, or use Arrow Up/Down to increment/decrement values.\n *\n * This is a headless component — it provides behavior, ARIA semantics, and\n * data attributes only. No styling classes are applied.\n *\n * @internal\n */\nexport function TimeSelector({\n hour,\n minute,\n activeField,\n onFieldChange,\n onHourChange,\n onMinuteChange,\n hourCycle,\n isDisabled = false,\n className,\n}: TimeSelectorProps): JSX.Element {\n const hourMin = hourCycle === 24 ? 0 : 1;\n const hourMax = hourCycle === 24 ? 23 : 12;\n\n const hourRef = useRef<HTMLDivElement>(null);\n const minuteRef = useRef<HTMLDivElement>(null);\n\n const { focusProps: hourFocusProps, isFocusVisible: hourFocusVisible } = useFocusRing();\n const { focusProps: minuteFocusProps, isFocusVisible: minuteFocusVisible } = useFocusRing();\n\n const handleHourKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (isDisabled) return;\n if (e.key === \"ArrowUp\") {\n e.preventDefault();\n const next = hour >= hourMax ? hourMin : hour + 1;\n onHourChange?.(next);\n } else if (e.key === \"ArrowDown\") {\n e.preventDefault();\n const next = hour <= hourMin ? hourMax : hour - 1;\n onHourChange?.(next);\n }\n },\n [hour, hourMin, hourMax, isDisabled, onHourChange]\n );\n\n const handleMinuteKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (isDisabled) return;\n if (e.key === \"ArrowUp\") {\n e.preventDefault();\n const next = minute >= 59 ? 0 : minute + 1;\n onMinuteChange?.(next);\n } else if (e.key === \"ArrowDown\") {\n e.preventDefault();\n const next = minute <= 0 ? 59 : minute - 1;\n onMinuteChange?.(next);\n }\n },\n [minute, isDisabled, onMinuteChange]\n );\n\n const handleHourClick = useCallback(() => {\n if (isDisabled) return;\n onFieldChange(\"hour\");\n }, [isDisabled, onFieldChange]);\n\n const handleMinuteClick = useCallback(() => {\n if (isDisabled) return;\n onFieldChange(\"minute\");\n }, [isDisabled, onFieldChange]);\n\n return (\n <div className={className} data-time-selector>\n <div\n {...mergeProps({ onKeyDown: handleHourKeyDown, onClick: handleHourClick }, hourFocusProps)}\n ref={hourRef}\n role=\"spinbutton\"\n tabIndex={isDisabled ? -1 : 0}\n aria-label=\"Hours\"\n aria-valuenow={hour}\n aria-valuemin={hourMin}\n aria-valuemax={hourMax}\n aria-disabled={isDisabled || undefined}\n data-time-field=\"hour\"\n {...(activeField === \"hour\" ? { \"data-selected\": \"\" } : {})}\n {...(hourFocusVisible ? { \"data-focus-visible\": \"\" } : {})}\n >\n {formatHour(hour, hourCycle)}\n </div>\n <span data-time-separator aria-hidden=\"true\">\n :\n </span>\n <div\n {...mergeProps(\n { onKeyDown: handleMinuteKeyDown, onClick: handleMinuteClick },\n minuteFocusProps\n )}\n ref={minuteRef}\n role=\"spinbutton\"\n tabIndex={isDisabled ? -1 : 0}\n aria-label=\"Minutes\"\n aria-valuenow={minute}\n aria-valuemin={0}\n aria-valuemax={59}\n aria-disabled={isDisabled || undefined}\n data-time-field=\"minute\"\n {...(activeField === \"minute\" ? { \"data-selected\": \"\" } : {})}\n {...(minuteFocusVisible ? { \"data-focus-visible\": \"\" } : {})}\n >\n {formatMinute(minute)}\n </div>\n </div>\n );\n}\n\nTimeSelector.displayName = \"TimeSelector\";\n","\"use client\";\n\nimport { useCallback, useRef } from \"react\";\nimport { useFocusRing, mergeProps } from \"react-aria\";\n\nimport type { PeriodSelectorProps, TimePeriod } from \"./TimePicker.types\";\n\nconst PERIODS: readonly TimePeriod[] = [\"AM\", \"PM\"] as const;\n\n/**\n * Internal radio item with focus-visible support.\n * @internal\n */\nfunction PeriodRadio({\n period,\n isSelected,\n isDisabled,\n onClick,\n onKeyDown,\n}: {\n period: TimePeriod;\n isSelected: boolean;\n isDisabled: boolean;\n onClick: () => void;\n onKeyDown: (e: React.KeyboardEvent) => void;\n}): JSX.Element {\n const ref = useRef<HTMLDivElement>(null);\n const { focusProps, isFocusVisible } = useFocusRing();\n\n return (\n <div\n {...mergeProps(focusProps, { onClick, onKeyDown })}\n ref={ref}\n role=\"radio\"\n tabIndex={isDisabled ? -1 : isSelected ? 0 : -1}\n aria-checked={isSelected}\n aria-label={period}\n aria-disabled={isDisabled || undefined}\n data-period={period}\n {...(isSelected ? { \"data-selected\": \"\" } : {})}\n {...(isFocusVisible ? { \"data-focus-visible\": \"\" } : {})}\n >\n {period}\n </div>\n );\n}\n\n/**\n * Headless PeriodSelector (Layer 2)\n *\n * Renders an AM/PM toggle as a `role=\"radiogroup\"` with two `role=\"radio\"`\n * options. Supports keyboard navigation (Arrow Left/Right to toggle).\n *\n * Only rendered for 12-hour format time pickers.\n *\n * This is a headless component — it provides behavior, ARIA semantics, and\n * data attributes only. No styling classes are applied.\n *\n * @internal\n */\nexport function PeriodSelector({\n value,\n onChange,\n orientation = \"vertical\",\n isDisabled = false,\n className,\n}: PeriodSelectorProps): JSX.Element {\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent, period: TimePeriod) => {\n if (isDisabled) return;\n if (\n e.key === \"ArrowLeft\" ||\n e.key === \"ArrowRight\" ||\n e.key === \"ArrowUp\" ||\n e.key === \"ArrowDown\"\n ) {\n e.preventDefault();\n const next = period === \"AM\" ? \"PM\" : \"AM\";\n onChange(next);\n }\n },\n [isDisabled, onChange]\n );\n\n const handleClick = useCallback(\n (period: TimePeriod) => {\n if (isDisabled) return;\n onChange(period);\n },\n [isDisabled, onChange]\n );\n\n return (\n <div\n role=\"radiogroup\"\n aria-label=\"Time period\"\n className={className}\n data-period-selector\n data-orientation={orientation}\n {...(isDisabled ? { \"data-disabled\": \"\" } : {})}\n >\n {PERIODS.map((period) => {\n const isSelected = value === period;\n return (\n <PeriodRadio\n key={period}\n period={period}\n isSelected={isSelected}\n isDisabled={isDisabled}\n onClick={() => handleClick(period)}\n onKeyDown={(e) => handleKeyDown(e, period)}\n />\n );\n })}\n </div>\n );\n}\n\nPeriodSelector.displayName = \"PeriodSelector\";\n","\"use client\";\n\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { useButton } from \"react-aria\";\n\nimport { ClockDial } from \"./ClockDial\";\nimport { TimeSelector } from \"./TimeSelector\";\nimport { PeriodSelector } from \"./PeriodSelector\";\n\nimport type {\n ClockSelectionMode,\n TimePeriod,\n TimePickerDialProps,\n TimeValue,\n} from \"./TimePicker.types\";\n\n/**\n * Converts 12h display hour + period into internal 0-23 hour.\n */\nfunction to24Hour(displayHour: number, period: TimePeriod): number {\n if (period === \"AM\") {\n return displayHour === 12 ? 0 : displayHour;\n }\n return displayHour === 12 ? 12 : displayHour + 12;\n}\n\n/**\n * Extracts the 12h display hour and period from a 0-23 hour value.\n */\nfunction from24Hour(hour24: number): { displayHour: number; period: TimePeriod } {\n const period: TimePeriod = hour24 >= 12 ? \"PM\" : \"AM\";\n const displayHour = hour24 % 12 === 0 ? 12 : hour24 % 12;\n return { displayHour, period };\n}\n\n/**\n * Headless TimePickerDial (Layer 2)\n *\n * Orchestrates the full time picker dial experience by composing:\n * - Headline\n * - TimeSelector (hour:minute spinbuttons)\n * - PeriodSelector (AM/PM, 12h only)\n * - ClockDial + ClockHand\n * - Action buttons (Cancel / OK)\n * - Mode toggle (switch to keyboard input)\n *\n * Key behaviors:\n * - Initial mode: hour selection\n * - After selecting hour via clock dial, auto-advances to minute selection\n * - After selecting minute, ready for confirm\n * - Pointer drag on clock face updates value in real-time\n * - Time selector containers clickable to switch selection mode\n *\n * This is a headless component — it provides behavior, ARIA semantics, and\n * data attributes only. No styling classes are applied.\n *\n * @example\n * ```tsx\n * <TimePickerDial\n * hourCycle={12}\n * defaultValue={{ hour: 7, minute: 0 }}\n * onConfirm={(time) => console.log(time)}\n * />\n * ```\n */\nexport function TimePickerDial({\n hourCycle = 12,\n orientation = \"vertical\",\n value,\n defaultValue,\n onChange,\n minuteStep = 1,\n isDisabled = false,\n headline = \"Select time\",\n cancelLabel = \"Cancel\",\n confirmLabel = \"OK\",\n onCancel,\n onConfirm,\n onModeToggle,\n className,\n}: TimePickerDialProps): JSX.Element {\n // ── Internal state ─────────────────────────────────────────────────────────\n\n const resolvedDefault = defaultValue ?? { hour: 0, minute: 0 };\n\n const [internalTime, setInternalTime] = useState<TimeValue>(value ?? resolvedDefault);\n const [selectionMode, setSelectionMode] = useState<ClockSelectionMode>(\"hour\");\n const [period, setPeriod] = useState<TimePeriod>(\n () => from24Hour((value ?? resolvedDefault).hour).period\n );\n\n // Sync controlled value\n useEffect(() => {\n if (value !== undefined && value !== null) {\n setInternalTime(value);\n setPeriod(from24Hour(value.hour).period);\n }\n }, [value]);\n\n // ── Derived values ─────────────────────────────────────────────────────────\n\n const hour24 = internalTime.hour;\n const displayHour = hourCycle === 12 ? from24Hour(hour24).displayHour : hour24;\n\n // ── Handlers ───────────────────────────────────────────────────────────────\n\n const updateTime = useCallback(\n (newTime: TimeValue) => {\n setInternalTime(newTime);\n onChange?.(newTime);\n },\n [onChange]\n );\n\n const handleDialSelect = useCallback(\n (selectedValue: number) => {\n if (selectionMode === \"hour\") {\n let newHour: number;\n if (hourCycle === 12) {\n newHour = to24Hour(selectedValue, period);\n } else {\n newHour = selectedValue;\n }\n updateTime({ ...internalTime, hour: newHour });\n setTimeout(() => setSelectionMode(\"minute\"), 300);\n } else {\n updateTime({ ...internalTime, minute: selectedValue });\n }\n },\n [selectionMode, hourCycle, period, internalTime, updateTime]\n );\n\n const handleFieldChange = useCallback((field: ClockSelectionMode) => {\n setSelectionMode(field);\n }, []);\n\n const handleHourChange = useCallback(\n (newHour: number) => {\n let hour: number;\n if (hourCycle === 12) {\n hour = to24Hour(newHour, period);\n } else {\n hour = newHour;\n }\n updateTime({ ...internalTime, hour });\n },\n [hourCycle, period, internalTime, updateTime]\n );\n\n const handleMinuteChange = useCallback(\n (newMinute: number) => {\n updateTime({ ...internalTime, minute: newMinute });\n },\n [internalTime, updateTime]\n );\n\n const handlePeriodChange = useCallback(\n (newPeriod: TimePeriod) => {\n setPeriod(newPeriod);\n const { displayHour: dh } = from24Hour(internalTime.hour);\n const newHour = to24Hour(dh, newPeriod);\n updateTime({ ...internalTime, hour: newHour });\n },\n [internalTime, updateTime]\n );\n\n const handleConfirm = useCallback(() => {\n onConfirm?.(internalTime);\n }, [internalTime, onConfirm]);\n\n const handleCancel = useCallback(() => {\n onCancel?.();\n }, [onCancel]);\n\n // ── Button refs & props ────────────────────────────────────────────────────\n\n const cancelRef = useRef<HTMLButtonElement>(null);\n const confirmRef = useRef<HTMLButtonElement>(null);\n const modeToggleRef = useRef<HTMLButtonElement>(null);\n\n const { buttonProps: cancelButtonProps } = useButton(\n {\n \"aria-label\": cancelLabel,\n isDisabled,\n ...(onCancel ? { onPress: handleCancel } : {}),\n },\n cancelRef\n );\n\n const { buttonProps: confirmButtonProps } = useButton(\n {\n \"aria-label\": confirmLabel,\n isDisabled,\n ...(onConfirm ? { onPress: handleConfirm } : {}),\n },\n confirmRef\n );\n\n const { buttonProps: modeToggleButtonProps } = useButton(\n {\n \"aria-label\": \"Switch to keyboard input\",\n isDisabled,\n ...(onModeToggle ? { onPress: onModeToggle } : {}),\n },\n modeToggleRef\n );\n\n // ── aria-live announcement ──────────────────────────────────────────────────\n\n const [announcement, setAnnouncement] = useState(\"\");\n\n useEffect(() => {\n const h = hourCycle === 12 ? displayHour : hour24;\n const m = internalTime.minute;\n const periodStr = hourCycle === 12 ? ` ${period}` : \"\";\n setAnnouncement(`${h}:${String(m).padStart(2, \"0\")}${periodStr}`);\n }, [internalTime, period, hourCycle, displayHour, hour24]);\n\n // ── Render ─────────────────────────────────────────────────────────────────\n\n return (\n <div\n className={className}\n data-variant=\"dial\"\n data-orientation={orientation}\n data-selection-mode={selectionMode}\n {...(isDisabled ? { \"data-disabled\": \"\" } : {})}\n >\n <div data-headline>{headline}</div>\n\n <TimeSelector\n hour={displayHour}\n minute={internalTime.minute}\n activeField={selectionMode}\n onFieldChange={handleFieldChange}\n onHourChange={handleHourChange}\n onMinuteChange={handleMinuteChange}\n hourCycle={hourCycle}\n isDisabled={isDisabled}\n />\n\n {hourCycle === 12 && (\n <PeriodSelector value={period} onChange={handlePeriodChange} isDisabled={isDisabled} />\n )}\n\n <ClockDial\n selectionMode={selectionMode}\n selectedHour={hourCycle === 12 ? displayHour : hour24}\n selectedMinute={internalTime.minute}\n hourCycle={hourCycle}\n minuteStep={minuteStep}\n onSelect={handleDialSelect}\n isDisabled={isDisabled}\n />\n\n <div data-actions>\n <button\n {...modeToggleButtonProps}\n ref={modeToggleRef}\n type=\"button\"\n data-action=\"mode-toggle\"\n >\n ⌨\n </button>\n <button {...cancelButtonProps} ref={cancelRef} type=\"button\" data-action=\"cancel\">\n {cancelLabel}\n </button>\n <button {...confirmButtonProps} ref={confirmRef} type=\"button\" data-action=\"confirm\">\n {confirmLabel}\n </button>\n </div>\n\n <div\n aria-live=\"polite\"\n aria-atomic=\"true\"\n data-live-region\n style={{\n position: \"absolute\",\n width: \"1px\",\n height: \"1px\",\n padding: 0,\n margin: \"-1px\",\n overflow: \"hidden\",\n clip: \"rect(0, 0, 0, 0)\",\n whiteSpace: \"nowrap\",\n borderWidth: 0,\n }}\n >\n {announcement}\n </div>\n </div>\n );\n}\n\nTimePickerDial.displayName = \"TimePickerDial\";\n","import { cva, type VariantProps } from \"class-variance-authority\";\n\n// ─── Container ──────────────────────────────────────────────────────────────────\n\n/**\n * CVA for the Time Picker container.\n * MD3 spec: surface-container-high, extra-large corner radius (28dp), 24dp padding.\n */\nexport const timePickerContainerVariants = cva(\n [\n \"bg-surface-container-high\",\n \"rounded-3xl\", // NOTE: shape.extra-large = 28dp; mapped via @theme token\n \"p-6\", // NOTE: measurement-derived (24dp padding); permitted exception\n ],\n {\n variants: {\n variant: {\n dial: \"\",\n input: \"\",\n },\n orientation: {\n vertical: \"flex flex-col gap-6\",\n horizontal: \"flex flex-row gap-6\",\n },\n },\n defaultVariants: {\n variant: \"dial\",\n orientation: \"vertical\",\n },\n }\n);\n\nexport type TimePickerContainerVariants = VariantProps<typeof timePickerContainerVariants>;\n\n// ─── Clock Dial Container ────────────────────────────────────────────────────────\n\n/**\n * CVA for the clock dial circular container.\n * MD3 spec: 256dp × 256dp, full circle, surface-container-highest background.\n */\nexport const clockDialContainerVariants = cva([\n \"w-[256px]\", // NOTE: measurement-derived (256dp clock dial); permitted exception\n \"h-[256px]\", // NOTE: measurement-derived (256dp); permitted exception\n \"rounded-full\", // shape.full = circle\n \"bg-surface-container-highest\",\n \"relative\",\n \"select-none\",\n \"touch-action-none\",\n]);\n\nexport type ClockDialContainerVariants = VariantProps<typeof clockDialContainerVariants>;\n\n// ─── Clock Dial Number ───────────────────────────────────────────────────────────\n\n/**\n * CVA for individual clock dial number labels.\n * MD3 spec: 48dp touch target, on-surface text, on-primary when selected.\n */\nexport const clockDialNumberVariants = cva(\n [\n \"absolute\",\n \"w-[48px]\", // NOTE: measurement-derived (48dp touch target); permitted exception\n \"h-[48px]\", // NOTE: measurement-derived (48dp); permitted exception\n \"rounded-full\",\n \"flex\",\n \"items-center\",\n \"justify-center\",\n \"text-body-large\",\n \"cursor-pointer\",\n \"transition-colors\",\n \"duration-spring-standard-fast-effects\",\n \"ease-spring-standard-fast-effects\",\n ],\n {\n variants: {\n selected: {\n true: \"bg-primary text-on-primary z-10\",\n false: \"text-on-surface\",\n },\n ring: {\n outer: \"\",\n inner: \"text-sm\",\n },\n state: {\n enabled: \"\",\n hovered: \"\",\n focused: \"\",\n },\n },\n compoundVariants: [\n { selected: false, state: \"hovered\", className: \"bg-on-surface/8\" },\n { selected: false, state: \"focused\", className: \"bg-on-surface/10\" },\n { selected: true, state: \"hovered\", className: \"bg-primary/90\" },\n { selected: true, state: \"focused\", className: \"bg-primary/90\" },\n ],\n defaultVariants: {\n selected: false,\n ring: \"outer\",\n state: \"enabled\",\n },\n }\n);\n\nexport type ClockDialNumberVariants = VariantProps<typeof clockDialNumberVariants>;\n\n// ─── Clock Hand Parts ────────────────────────────────────────────────────────────\n\n/**\n * CVA for the clock hand center dot.\n * MD3 spec: 8dp circle, primary color.\n */\nexport const clockHandCenterVariants = cva([\n \"absolute\",\n \"top-1/2\",\n \"left-1/2\",\n \"-translate-x-1/2\",\n \"-translate-y-1/2\",\n \"w-[8px]\", // NOTE: measurement-derived (8dp center dot); permitted exception\n \"h-[8px]\", // NOTE: measurement-derived (8dp); permitted exception\n \"rounded-full\",\n \"bg-primary\",\n \"z-20\",\n]);\n\nexport type ClockHandCenterVariants = VariantProps<typeof clockHandCenterVariants>;\n\n/**\n * CVA for the clock hand track (selector line from center to handle).\n * MD3 spec: 2dp width, primary color.\n */\nexport const clockHandTrackVariants = cva([\n \"absolute\",\n \"top-1/2\",\n \"left-1/2\",\n \"w-[2px]\", // NOTE: measurement-derived (2dp track width); permitted exception\n \"bg-primary\",\n \"origin-bottom\",\n \"z-10\",\n]);\n\nexport type ClockHandTrackVariants = VariantProps<typeof clockHandTrackVariants>;\n\n/**\n * CVA for the clock hand handle (endpoint circle).\n * MD3 spec: 48dp circle, primary color.\n */\nexport const clockHandHandleVariants = cva([\n \"w-[48px]\", // NOTE: measurement-derived (48dp handle); permitted exception\n \"h-[48px]\", // NOTE: measurement-derived (48dp); permitted exception\n \"rounded-full\",\n \"bg-primary\",\n \"flex\",\n \"items-center\",\n \"justify-center\",\n \"text-on-primary\",\n \"text-body-large\",\n]);\n\nexport type ClockHandHandleVariants = VariantProps<typeof clockHandHandleVariants>;\n\n// ─── Time Selector ───────────────────────────────────────────────────────────────\n\n/**\n * CVA for the time selector containers (hour/minute display).\n * MD3 spec: 96dp × 80dp, small corner radius (8dp), display-large text.\n */\nexport const timeSelectorContainerVariants = cva(\n [\n \"w-[96px]\", // NOTE: measurement-derived (96dp); permitted exception\n \"h-[80px]\", // NOTE: measurement-derived (80dp); permitted exception\n \"rounded-lg\", // shape.small = 8dp\n \"flex\",\n \"flex-col\",\n \"items-center\",\n \"justify-center\",\n \"cursor-pointer\",\n \"text-display-large\",\n \"transition-colors\",\n \"duration-spring-standard-fast-effects\",\n \"ease-spring-standard-fast-effects\",\n ],\n {\n variants: {\n selected: {\n true: \"bg-primary-container text-on-primary-container\",\n false: \"bg-surface-container-highest text-on-surface\",\n },\n state: {\n enabled: \"\",\n hovered: \"\",\n focused: \"\",\n },\n },\n compoundVariants: [\n {\n selected: false,\n state: \"hovered\",\n className: \"bg-surface-container-highest/80\",\n },\n {\n selected: false,\n state: \"focused\",\n className: \"border-2 border-primary\",\n },\n {\n selected: true,\n state: \"hovered\",\n className: \"bg-primary-container/80\",\n },\n {\n selected: true,\n state: \"focused\",\n className: \"border-2 border-primary\",\n },\n ],\n defaultVariants: {\n selected: false,\n state: \"enabled\",\n },\n }\n);\n\nexport type TimeSelectorContainerVariants = VariantProps<typeof timeSelectorContainerVariants>;\n\n// ─── Period Selector ─────────────────────────────────────────────────────────────\n\n/**\n * CVA for the AM/PM period selector container.\n * MD3 spec: 52dp × 80dp (vertical) or 216dp × 38dp (horizontal), outline border.\n */\nexport const periodSelectorContainerVariants = cva(\n [\n \"rounded-lg\", // shape.small = 8dp\n \"border\",\n \"border-outline\",\n \"overflow-hidden\",\n \"flex\",\n ],\n {\n variants: {\n orientation: {\n vertical: \"w-[52px] h-[80px] flex-col\", // NOTE: measurement-derived; permitted exception\n horizontal: \"w-[216px] h-[38px] flex-row\", // NOTE: measurement-derived; permitted exception\n },\n },\n defaultVariants: {\n orientation: \"vertical\",\n },\n }\n);\n\nexport type PeriodSelectorContainerVariants = VariantProps<typeof periodSelectorContainerVariants>;\n\n/**\n * CVA for individual period (AM/PM) buttons.\n * MD3 spec: tertiary-container when selected, on-surface-variant when not.\n */\nexport const periodSelectorItemVariants = cva(\n [\n \"flex-1\",\n \"flex\",\n \"items-center\",\n \"justify-center\",\n \"text-title-medium\",\n \"cursor-pointer\",\n \"border-outline\",\n \"transition-colors\",\n \"duration-spring-standard-fast-effects\",\n \"ease-spring-standard-fast-effects\",\n ],\n {\n variants: {\n selected: {\n true: \"bg-tertiary-container text-on-tertiary-container border-transparent\",\n false: \"bg-transparent text-on-surface-variant\",\n },\n state: {\n enabled: \"\",\n hovered: \"\",\n focused: \"\",\n },\n },\n compoundVariants: [\n {\n selected: false,\n state: \"hovered\",\n className: \"bg-on-surface-variant/8\",\n },\n {\n selected: false,\n state: \"focused\",\n className: \"bg-on-surface-variant/10\",\n },\n {\n selected: true,\n state: \"hovered\",\n className: \"bg-tertiary-container/80\",\n },\n {\n selected: true,\n state: \"focused\",\n className: \"bg-tertiary-container/80\",\n },\n ],\n defaultVariants: {\n selected: false,\n state: \"enabled\",\n },\n }\n);\n\nexport type PeriodSelectorItemVariants = VariantProps<typeof periodSelectorItemVariants>;\n\n// ─── Time Input Field ────────────────────────────────────────────────────────────\n\n/**\n * CVA for time input field containers (keyboard entry mode).\n * MD3 spec: 96dp × 72dp, small corner radius (8dp).\n */\nexport const timeInputFieldVariants = cva(\n [\n \"w-[96px]\", // NOTE: measurement-derived (96dp); permitted exception\n \"h-[72px]\", // NOTE: measurement-derived (72dp); permitted exception\n \"rounded-lg\", // shape.small = 8dp\n \"flex\",\n \"flex-col\",\n \"items-center\",\n \"justify-center\",\n \"cursor-text\",\n \"text-display-large\",\n \"transition-colors\",\n \"duration-spring-standard-fast-effects\",\n \"ease-spring-standard-fast-effects\",\n ],\n {\n variants: {\n selected: {\n true: \"bg-primary-container text-on-primary-container border-2 border-primary\",\n false: \"bg-surface-container-highest text-on-surface\",\n },\n state: {\n enabled: \"\",\n hovered: \"\",\n focused: \"\",\n },\n },\n defaultVariants: {\n selected: false,\n state: \"enabled\",\n },\n }\n);\n\nexport type TimeInputFieldVariants = VariantProps<typeof timeInputFieldVariants>;\n\n// ─── Separator ───────────────────────────────────────────────────────────────────\n\n/**\n * CVA for the time separator colon (:) between hour and minute.\n * MD3 spec: display-large, on-surface color.\n */\nexport const timeSeparatorVariants = cva([\n \"text-display-large\",\n \"text-on-surface\",\n \"select-none\",\n \"px-1\",\n]);\n\nexport type TimeSeparatorVariants = VariantProps<typeof timeSeparatorVariants>;\n\n// ─── Headline ────────────────────────────────────────────────────────────────────\n\n/**\n * CVA for the time picker headline text.\n * MD3 spec: label-medium typography, on-surface-variant color.\n */\nexport const timePickerHeadlineVariants = cva([\"text-label-medium\", \"text-on-surface-variant\"]);\n\nexport type TimePickerHeadlineVariants = VariantProps<typeof timePickerHeadlineVariants>;\n\n// ─── Action Buttons ──────────────────────────────────────────────────────────────\n\n/**\n * CVA for the action button row.\n * MD3 spec: right-aligned, gap spacing.\n */\nexport const timePickerActionRowVariants = cva([\"flex\", \"items-center\", \"justify-end\", \"gap-2\"]);\n\nexport type TimePickerActionRowVariants = VariantProps<typeof timePickerActionRowVariants>;\n\n/**\n * CVA for individual action button text styling.\n * MD3 spec: primary color text buttons.\n */\nexport const timePickerActionButtonVariants = cva([\n \"text-primary\",\n \"text-label-large\",\n \"rounded-full\",\n \"px-3\",\n \"py-2\",\n \"transition-colors\",\n \"duration-spring-standard-fast-effects\",\n \"ease-spring-standard-fast-effects\",\n \"hover:bg-primary/8\",\n \"focus-visible:bg-primary/10\",\n \"active:bg-primary/10\",\n]);\n\nexport type TimePickerActionButtonVariants = VariantProps<typeof timePickerActionButtonVariants>;\n\n// ─── Mode Toggle ─────────────────────────────────────────────────────────────────\n\n/**\n * CVA for the mode toggle icon button (switch between dial and input).\n * MD3 spec: on-surface-variant icon, standard icon button.\n */\nexport const timePickerModeToggleVariants = cva([\n \"text-on-surface-variant\",\n \"w-12\",\n \"h-12\",\n \"rounded-full\",\n \"flex\",\n \"items-center\",\n \"justify-center\",\n \"transition-colors\",\n \"duration-spring-standard-fast-effects\",\n \"ease-spring-standard-fast-effects\",\n \"hover:bg-on-surface-variant/8\",\n \"focus-visible:bg-on-surface-variant/10\",\n]);\n\nexport type TimePickerModeToggleVariants = VariantProps<typeof timePickerModeToggleVariants>;\n","\"use client\";\n\nimport { useReducedMotion } from \"../../hooks/useReducedMotion\";\nimport { cn } from \"../../utils/cn\";\nimport { TimePickerDial } from \"./TimePickerDial\";\nimport { timePickerContainerVariants } from \"./TimePicker.variants\";\n\nimport type { TimePickerDialProps } from \"./TimePicker.types\";\n\n/**\n * Tailwind descendant selectors for styling the headless TimePickerDial elements.\n * Each selector targets internal sub-components by their data attributes.\n */\nconst DIAL_STYLES = [\n // ── Headline ──────────────────────────────────────────────────────────────────\n \"[&_[data-headline]]:text-label-medium\",\n \"[&_[data-headline]]:text-on-surface-variant\",\n\n // ── Time selector ─────────────────────────────────────────────────────────────\n \"[&_[data-time-selector]]:flex\",\n \"[&_[data-time-selector]]:items-center\",\n\n // Time selector fields (hour/minute)\n \"[&_[data-time-field]]:w-[96px]\",\n \"[&_[data-time-field]]:h-[80px]\",\n \"[&_[data-time-field]]:rounded-lg\",\n \"[&_[data-time-field]]:flex\",\n \"[&_[data-time-field]]:items-center\",\n \"[&_[data-time-field]]:justify-center\",\n \"[&_[data-time-field]]:text-display-large\",\n \"[&_[data-time-field]]:cursor-pointer\",\n \"[&_[data-time-field]]:transition-colors\",\n \"[&_[data-time-field]]:duration-spring-standard-fast-effects\",\n \"[&_[data-time-field]]:ease-spring-standard-fast-effects\",\n \"[&_[data-time-field]]:bg-surface-container-highest\",\n \"[&_[data-time-field]]:text-on-surface\",\n \"[&_[data-time-field][data-selected]]:bg-primary-container\",\n \"[&_[data-time-field][data-selected]]:text-on-primary-container\",\n \"[&_[data-time-field]:not([data-selected]):hover]:bg-surface-container-highest/80\",\n \"[&_[data-time-field][data-selected]:hover]:bg-primary-container/80\",\n \"[&_[data-time-field][data-focus-visible]]:ring-2\",\n \"[&_[data-time-field][data-focus-visible]]:ring-primary\",\n\n // Separator colon\n \"[&_[data-time-separator]]:text-display-large\",\n \"[&_[data-time-separator]]:text-on-surface\",\n \"[&_[data-time-separator]]:select-none\",\n \"[&_[data-time-separator]]:px-1\",\n\n // ── Period selector ───────────────────────────────────────────────────────────\n \"[&_[data-period-selector]]:rounded-lg\",\n \"[&_[data-period-selector]]:border\",\n \"[&_[data-period-selector]]:border-outline\",\n \"[&_[data-period-selector]]:overflow-hidden\",\n \"[&_[data-period-selector]]:flex\",\n '[&_[data-period-selector][data-orientation=\"vertical\"]]:w-[52px]',\n '[&_[data-period-selector][data-orientation=\"vertical\"]]:h-[80px]',\n '[&_[data-period-selector][data-orientation=\"vertical\"]]:flex-col',\n '[&_[data-period-selector][data-orientation=\"horizontal\"]]:w-[216px]',\n '[&_[data-period-selector][data-orientation=\"horizontal\"]]:h-[38px]',\n '[&_[data-period-selector][data-orientation=\"horizontal\"]]:flex-row',\n \"[&_[data-period-selector]]:ml-3\",\n\n // Period items (AM/PM)\n '[&_[data-period-selector]>[role=\"radio\"]]:flex-1',\n '[&_[data-period-selector]>[role=\"radio\"]]:flex',\n '[&_[data-period-selector]>[role=\"radio\"]]:items-center',\n '[&_[data-period-selector]>[role=\"radio\"]]:justify-center',\n '[&_[data-period-selector]>[role=\"radio\"]]:text-title-medium',\n '[&_[data-period-selector]>[role=\"radio\"]]:cursor-pointer',\n '[&_[data-period-selector]>[role=\"radio\"]]:border-outline',\n '[&_[data-period-selector]>[role=\"radio\"]]:transition-colors',\n '[&_[data-period-selector]>[role=\"radio\"]]:duration-spring-standard-fast-effects',\n '[&_[data-period-selector]>[role=\"radio\"]]:ease-spring-standard-fast-effects',\n '[&_[data-period-selector]>[role=\"radio\"]]:text-on-surface-variant',\n '[&_[data-period-selector]>[role=\"radio\"][data-selected]]:bg-tertiary-container',\n '[&_[data-period-selector]>[role=\"radio\"][data-selected]]:text-on-tertiary-container',\n '[&_[data-period-selector]>[role=\"radio\"][data-selected]]:border-transparent',\n '[&_[data-period-selector]>[role=\"radio\"]:not([data-selected]):hover]:bg-on-surface-variant/8',\n '[&_[data-period-selector]>[role=\"radio\"][data-focus-visible]]:ring-2',\n '[&_[data-period-selector]>[role=\"radio\"][data-focus-visible]]:ring-primary',\n\n // ── Clock dial ────────────────────────────────────────────────────────────────\n \"[&_[data-clock-dial]]:w-[256px]\",\n \"[&_[data-clock-dial]]:h-[256px]\",\n \"[&_[data-clock-dial]]:rounded-full\",\n \"[&_[data-clock-dial]]:bg-surface-container-highest\",\n \"[&_[data-clock-dial]]:mx-auto\",\n\n // Clock numbers\n \"[&_[data-clock-number]]:w-[48px]\",\n \"[&_[data-clock-number]]:h-[48px]\",\n \"[&_[data-clock-number]]:rounded-full\",\n \"[&_[data-clock-number]]:flex\",\n \"[&_[data-clock-number]]:items-center\",\n \"[&_[data-clock-number]]:justify-center\",\n \"[&_[data-clock-number]]:text-body-large\",\n \"[&_[data-clock-number]]:cursor-pointer\",\n \"[&_[data-clock-number]]:transition-colors\",\n \"[&_[data-clock-number]]:duration-spring-standard-fast-effects\",\n \"[&_[data-clock-number]]:ease-spring-standard-fast-effects\",\n \"[&_[data-clock-number]]:text-on-surface\",\n \"[&_[data-clock-number][data-selected]]:bg-primary\",\n \"[&_[data-clock-number][data-selected]]:text-on-primary\",\n \"[&_[data-clock-number][data-selected]]:z-10\",\n \"[&_[data-clock-number]:not([data-selected]):hover]:bg-on-surface/8\",\n\n // ── Clock hand ────────────────────────────────────────────────────────────────\n \"[&_[data-clock-hand]]:absolute\",\n \"[&_[data-clock-hand]]:top-1/2\",\n \"[&_[data-clock-hand]]:left-1/2\",\n \"[&_[data-clock-hand]]:origin-bottom\",\n\n \"[&_[data-clock-hand-center]]:absolute\",\n \"[&_[data-clock-hand-center]]:top-1/2\",\n \"[&_[data-clock-hand-center]]:left-1/2\",\n \"[&_[data-clock-hand-center]]:-translate-x-1/2\",\n \"[&_[data-clock-hand-center]]:-translate-y-1/2\",\n \"[&_[data-clock-hand-center]]:w-[8px]\",\n \"[&_[data-clock-hand-center]]:h-[8px]\",\n \"[&_[data-clock-hand-center]]:rounded-full\",\n \"[&_[data-clock-hand-center]]:bg-primary\",\n \"[&_[data-clock-hand-center]]:z-20\",\n\n \"[&_[data-clock-hand-track]]:absolute\",\n \"[&_[data-clock-hand-track]]:top-1/2\",\n \"[&_[data-clock-hand-track]]:left-1/2\",\n \"[&_[data-clock-hand-track]]:w-[2px]\",\n \"[&_[data-clock-hand-track]]:bg-primary\",\n \"[&_[data-clock-hand-track]]:origin-bottom\",\n \"[&_[data-clock-hand-track]]:z-10\",\n\n \"[&_[data-clock-hand-handle]]:w-[48px]\",\n \"[&_[data-clock-hand-handle]]:h-[48px]\",\n \"[&_[data-clock-hand-handle]]:rounded-full\",\n \"[&_[data-clock-hand-handle]]:bg-primary\",\n \"[&_[data-clock-hand-handle]]:flex\",\n \"[&_[data-clock-hand-handle]]:items-center\",\n \"[&_[data-clock-hand-handle]]:justify-center\",\n \"[&_[data-clock-hand-handle]]:text-on-primary\",\n \"[&_[data-clock-hand-handle]]:text-body-large\",\n\n // ── Actions ───────────────────────────────────────────────────────────────────\n \"[&_[data-actions]]:flex\",\n \"[&_[data-actions]]:items-center\",\n \"[&_[data-actions]]:justify-end\",\n \"[&_[data-actions]]:gap-2\",\n\n \"[&_[data-action]]:text-primary\",\n \"[&_[data-action]]:text-label-large\",\n \"[&_[data-action]]:rounded-full\",\n \"[&_[data-action]]:px-3\",\n \"[&_[data-action]]:py-2\",\n \"[&_[data-action]]:min-h-12\",\n \"[&_[data-action]]:transition-colors\",\n \"[&_[data-action]]:duration-spring-standard-fast-effects\",\n \"[&_[data-action]]:ease-spring-standard-fast-effects\",\n \"[&_[data-action]:hover]:bg-primary/8\",\n \"[&_[data-action]:focus-visible]:bg-primary/10\",\n \"[&_[data-action]:focus-visible]:ring-2\",\n \"[&_[data-action]:focus-visible]:ring-primary\",\n\n // Mode toggle\n '[&_[data-action=\"mode-toggle\"]]:text-on-surface-variant',\n '[&_[data-action=\"mode-toggle\"]]:mr-auto',\n '[&_[data-action=\"mode-toggle\"]]:w-12',\n '[&_[data-action=\"mode-toggle\"]]:h-12',\n '[&_[data-action=\"mode-toggle\"]]:flex',\n '[&_[data-action=\"mode-toggle\"]]:items-center',\n '[&_[data-action=\"mode-toggle\"]]:justify-center',\n '[&_[data-action=\"mode-toggle\"]:hover]:bg-on-surface-variant/8',\n].join(\" \");\n\n/**\n * Motion-specific descendant selectors for the time picker dial.\n * Applied conditionally — omitted when `prefers-reduced-motion: reduce` is active.\n *\n * Uses legacy MD3 motion tokens for clock hand rotation (spatial transform)\n * and standard effects for focus/toggle state transitions.\n */\nexport const DIAL_MOTION_STYLES = [\n // ── Clock hand rotation ──────────────────────────────────────────────────────\n \"[&_[data-clock-hand-track]]:transition-transform\",\n \"[&_[data-clock-hand-track]]:duration-medium1\",\n \"[&_[data-clock-hand-track]]:ease-standard-decelerate\",\n\n \"[&_[data-clock-hand]]:transition-transform\",\n \"[&_[data-clock-hand]]:duration-medium1\",\n \"[&_[data-clock-hand]]:ease-standard-decelerate\",\n\n // ── Dragging suppresses transition ───────────────────────────────────────────\n \"[&_[data-clock-dial][data-dragging]_[data-clock-hand-track]]:!transition-none\",\n \"[&_[data-clock-dial][data-dragging]_[data-clock-hand]]:!transition-none\",\n\n // ── Time selector focus ──────────────────────────────────────────────────────\n \"[&_[data-time-field][data-selected]]:duration-short2\",\n \"[&_[data-time-field][data-selected]]:ease-standard\",\n\n // ── Period selector toggle ───────────────────────────────────────────────────\n '[&_[data-period-selector]>[role=\"radio\"][data-selected]]:duration-short2',\n '[&_[data-period-selector]>[role=\"radio\"][data-selected]]:ease-standard',\n\n // ── Dial number highlight ────────────────────────────────────────────────────\n \"[&_[data-clock-number][data-selected]]:duration-short2\",\n \"[&_[data-clock-number][data-selected]]:ease-standard\",\n].join(\" \");\n\n/**\n * Styled TimePickerDial (Layer 3)\n *\n * Wraps the headless `TimePickerDial` with MD3 visual styling via CVA variants\n * and descendant selectors. Applies container, clock dial, time selector,\n * period selector, clock hand, and action button tokens.\n *\n * @internal\n */\nexport function TimePickerDialStyled(props: TimePickerDialProps): JSX.Element {\n const { className, orientation = \"vertical\", ...rest } = props;\n const reducedMotion = useReducedMotion();\n\n return (\n <TimePickerDial\n {...rest}\n orientation={orientation}\n className={cn(\n timePickerContainerVariants({ variant: \"dial\", orientation }),\n DIAL_STYLES,\n !reducedMotion && DIAL_MOTION_STYLES,\n className\n )}\n />\n );\n}\n\nTimePickerDialStyled.displayName = \"TimePickerDialStyled\";\n","\"use client\";\n\nimport { useCallback, useEffect, useRef, useState } from \"react\";\n\nimport type { TimeInputFieldProps } from \"./TimePicker.types\";\n\n/**\n * Formats a numeric value as a two-digit string with leading zero.\n */\nfunction formatValue(value: number): string {\n return String(value).padStart(2, \"0\");\n}\n\n/**\n * Headless TimeInputField (Layer 2)\n *\n * An individual time input field with `role=\"spinbutton\"` semantics.\n * Supports direct numeric keyboard entry, Arrow Up/Down increment/decrement,\n * wrapping at boundaries, auto-advance after two digits, and validation on blur.\n *\n * This is a headless component — it provides behavior, ARIA semantics, and\n * data attributes only. No styling classes are applied.\n *\n * @internal\n */\nexport function TimeInputField({\n field,\n value,\n onChange,\n onFocus,\n onBlur,\n onAutoAdvance,\n min,\n max,\n isDisabled = false,\n className,\n}: TimeInputFieldProps): JSX.Element {\n const [isFocused, setIsFocused] = useState(false);\n const [isInvalid, setIsInvalid] = useState(false);\n const bufferRef = useRef<string>(\"\");\n const bufferTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(() => {\n return () => {\n if (bufferTimerRef.current !== null) {\n clearTimeout(bufferTimerRef.current);\n }\n };\n }, []);\n\n const label = field === \"hour\" ? \"Hour\" : \"Minute\";\n\n const clamp = useCallback((val: number): number => Math.max(min, Math.min(max, val)), [min, max]);\n\n const commitBuffer = useCallback(() => {\n const buffer = bufferRef.current;\n if (buffer.length > 0) {\n const parsed = parseInt(buffer, 10);\n const clamped = clamp(parsed);\n onChange(clamped);\n setIsInvalid(parsed < min || parsed > max);\n bufferRef.current = \"\";\n }\n }, [clamp, min, max, onChange]);\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (isDisabled) return;\n\n if (e.key === \"ArrowUp\") {\n e.preventDefault();\n bufferRef.current = \"\";\n const next = value >= max ? min : value + 1;\n onChange(next);\n setIsInvalid(false);\n } else if (e.key === \"ArrowDown\") {\n e.preventDefault();\n bufferRef.current = \"\";\n const next = value <= min ? max : value - 1;\n onChange(next);\n setIsInvalid(false);\n } else if (/^[0-9]$/.test(e.key)) {\n e.preventDefault();\n if (bufferTimerRef.current !== null) {\n clearTimeout(bufferTimerRef.current);\n }\n\n bufferRef.current += e.key;\n const parsed = parseInt(bufferRef.current, 10);\n\n if (bufferRef.current.length >= 2) {\n const clamped = clamp(parsed);\n onChange(clamped);\n setIsInvalid(parsed < min || parsed > max);\n bufferRef.current = \"\";\n onAutoAdvance?.();\n } else {\n onChange(parsed);\n setIsInvalid(false);\n bufferTimerRef.current = setTimeout(() => {\n commitBuffer();\n }, 1000);\n }\n }\n },\n [isDisabled, value, min, max, onChange, onAutoAdvance, clamp, commitBuffer]\n );\n\n const handleFocus = useCallback(() => {\n if (isDisabled) return;\n setIsFocused(true);\n bufferRef.current = \"\";\n onFocus?.();\n }, [isDisabled, onFocus]);\n\n const handleBlur = useCallback(() => {\n setIsFocused(false);\n commitBuffer();\n const clamped = clamp(value);\n if (clamped !== value) {\n onChange(clamped);\n }\n setIsInvalid(value < min || value > max);\n onBlur?.();\n }, [value, min, max, clamp, onChange, commitBuffer, onBlur]);\n\n return (\n <div\n role=\"spinbutton\"\n tabIndex={isDisabled ? -1 : 0}\n aria-label={label}\n aria-valuenow={value}\n aria-valuemin={min}\n aria-valuemax={max}\n aria-disabled={isDisabled || undefined}\n aria-invalid={isInvalid || undefined}\n className={className}\n data-time-input-field={field}\n {...(isFocused ? { \"data-focused\": \"\" } : {})}\n {...(isInvalid ? { \"data-invalid\": \"\" } : {})}\n onKeyDown={handleKeyDown}\n onFocus={handleFocus}\n onBlur={handleBlur}\n >\n <span data-value>{formatValue(value)}</span>\n <span data-supporting-text>{label}</span>\n </div>\n );\n}\n\nTimeInputField.displayName = \"TimeInputField\";\n","\"use client\";\n\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { useButton } from \"react-aria\";\n\nimport { TimeInputField } from \"./TimeInputField\";\nimport { PeriodSelector } from \"./PeriodSelector\";\n\nimport type { TimePeriod, TimePickerInputProps, TimeValue } from \"./TimePicker.types\";\n\n/**\n * Converts 12h display hour + period into internal 0-23 hour.\n */\nfunction to24Hour(displayHour: number, period: TimePeriod): number {\n if (period === \"AM\") {\n return displayHour === 12 ? 0 : displayHour;\n }\n return displayHour === 12 ? 12 : displayHour + 12;\n}\n\n/**\n * Extracts the 12h display hour and period from a 0-23 hour value.\n */\nfunction from24Hour(hour24: number): { displayHour: number; period: TimePeriod } {\n const period: TimePeriod = hour24 >= 12 ? \"PM\" : \"AM\";\n const displayHour = hour24 % 12 === 0 ? 12 : hour24 % 12;\n return { displayHour, period };\n}\n\n/**\n * Headless TimePickerInput (Layer 2)\n *\n * Orchestrates the full time picker input (keyboard-entry) experience:\n * - Headline (\"Enter time\")\n * - Two large input fields (hour/minute) with spin button behavior\n * - Separator colon \":\"\n * - Period selector (AM/PM) for 12-hour format\n * - Action buttons (Cancel / OK)\n * - Mode toggle (switch to clock dial)\n *\n * Key behaviors:\n * - Direct numeric keyboard input (0-9)\n * - Arrow Up/Down to increment/decrement\n * - Auto-advance from hour to minute after two digits typed\n * - Validation on blur (clamp to valid range)\n * - Tab order: hour → minute → period → action buttons\n *\n * This is a headless component — it provides behavior, ARIA semantics, and\n * data attributes only. No styling classes are applied.\n *\n * @example\n * ```tsx\n * <TimePickerInput\n * hourCycle={12}\n * defaultValue={{ hour: 7, minute: 0 }}\n * onConfirm={(time) => console.log(time)}\n * />\n * ```\n */\nexport function TimePickerInput({\n hourCycle = 12,\n value,\n defaultValue,\n onChange,\n isDisabled = false,\n headline = \"Enter time\",\n cancelLabel = \"Cancel\",\n confirmLabel = \"OK\",\n onCancel,\n onConfirm,\n onModeToggle,\n className,\n}: TimePickerInputProps): JSX.Element {\n const resolvedDefault = defaultValue ?? { hour: 0, minute: 0 };\n\n const [internalTime, setInternalTime] = useState<TimeValue>(value ?? resolvedDefault);\n const [period, setPeriod] = useState<TimePeriod>(\n () => from24Hour((value ?? resolvedDefault).hour).period\n );\n const minuteFieldRef = useRef<HTMLDivElement>(null);\n const initialTimeRef = useRef<TimeValue>(value ?? resolvedDefault);\n\n useEffect(() => {\n if (value !== undefined && value !== null) {\n setInternalTime(value);\n setPeriod(from24Hour(value.hour).period);\n }\n }, [value]);\n\n // ── Derived values ─────────────────────────────────────────────────────────\n\n const hour24 = internalTime.hour;\n const displayHour = hourCycle === 12 ? from24Hour(hour24).displayHour : hour24;\n\n const hourMin = hourCycle === 24 ? 0 : 1;\n const hourMax = hourCycle === 24 ? 23 : 12;\n\n // ── Handlers ───────────────────────────────────────────────────────────────\n\n const updateTime = useCallback(\n (newTime: TimeValue) => {\n setInternalTime(newTime);\n onChange?.(newTime);\n },\n [onChange]\n );\n\n const handleHourChange = useCallback(\n (newDisplayHour: number) => {\n let hour: number;\n if (hourCycle === 12) {\n hour = to24Hour(newDisplayHour, period);\n } else {\n hour = newDisplayHour;\n }\n updateTime({ ...internalTime, hour });\n },\n [hourCycle, period, internalTime, updateTime]\n );\n\n const handleMinuteChange = useCallback(\n (newMinute: number) => {\n updateTime({ ...internalTime, minute: newMinute });\n },\n [internalTime, updateTime]\n );\n\n const handlePeriodChange = useCallback(\n (newPeriod: TimePeriod) => {\n setPeriod(newPeriod);\n const { displayHour: dh } = from24Hour(internalTime.hour);\n const newHour = to24Hour(dh, newPeriod);\n updateTime({ ...internalTime, hour: newHour });\n },\n [internalTime, updateTime]\n );\n\n const handleHourAutoAdvance = useCallback(() => {\n const minuteEl = minuteFieldRef.current?.querySelector(\n '[data-time-input-field=\"minute\"]'\n ) as HTMLElement | null;\n if (minuteEl) {\n minuteEl.focus();\n } else {\n const parent = minuteFieldRef.current;\n if (parent) {\n parent.focus();\n }\n }\n }, []);\n\n const handleConfirm = useCallback(() => {\n onConfirm?.(internalTime);\n }, [internalTime, onConfirm]);\n\n const handleCancel = useCallback(() => {\n if (value === undefined || value === null) {\n setInternalTime(initialTimeRef.current);\n }\n onCancel?.();\n }, [value, onCancel]);\n\n // ── Button refs & props ────────────────────────────────────────────────────\n\n const cancelRef = useRef<HTMLButtonElement>(null);\n const confirmRef = useRef<HTMLButtonElement>(null);\n const modeToggleRef = useRef<HTMLButtonElement>(null);\n\n const { buttonProps: cancelButtonProps } = useButton(\n {\n \"aria-label\": cancelLabel,\n isDisabled,\n ...(onCancel ? { onPress: handleCancel } : {}),\n },\n cancelRef\n );\n\n const { buttonProps: confirmButtonProps } = useButton(\n {\n \"aria-label\": confirmLabel,\n isDisabled,\n ...(onConfirm ? { onPress: handleConfirm } : {}),\n },\n confirmRef\n );\n\n const { buttonProps: modeToggleButtonProps } = useButton(\n {\n \"aria-label\": \"Switch to clock dial\",\n isDisabled,\n ...(onModeToggle ? { onPress: onModeToggle } : {}),\n },\n modeToggleRef\n );\n\n // ── aria-live announcement ──────────────────────────────────────────────────\n\n const [announcement, setAnnouncement] = useState(\"\");\n\n useEffect(() => {\n const h = displayHour;\n const m = internalTime.minute;\n const periodStr = hourCycle === 12 ? ` ${period}` : \"\";\n setAnnouncement(`${h}:${String(m).padStart(2, \"0\")}${periodStr}`);\n }, [internalTime, period, hourCycle, displayHour]);\n\n // ── Render ─────────────────────────────────────────────────────────────────\n\n return (\n <div\n className={className}\n data-variant=\"input\"\n {...(isDisabled ? { \"data-disabled\": \"\" } : {})}\n >\n <div data-headline>{headline}</div>\n\n <div data-input-row>\n <TimeInputField\n field=\"hour\"\n value={displayHour}\n onChange={handleHourChange}\n onAutoAdvance={handleHourAutoAdvance}\n min={hourMin}\n max={hourMax}\n isDisabled={isDisabled}\n />\n\n <span data-time-separator aria-hidden=\"true\">\n :\n </span>\n\n <div ref={minuteFieldRef}>\n <TimeInputField\n field=\"minute\"\n value={internalTime.minute}\n onChange={handleMinuteChange}\n min={0}\n max={59}\n isDisabled={isDisabled}\n />\n </div>\n\n {hourCycle === 12 && (\n <PeriodSelector\n value={period}\n onChange={handlePeriodChange}\n orientation=\"vertical\"\n isDisabled={isDisabled}\n />\n )}\n </div>\n\n <div data-actions>\n <button\n {...modeToggleButtonProps}\n ref={modeToggleRef}\n type=\"button\"\n data-action=\"mode-toggle\"\n >\n 🕐\n </button>\n <button {...cancelButtonProps} ref={cancelRef} type=\"button\" data-action=\"cancel\">\n {cancelLabel}\n </button>\n <button {...confirmButtonProps} ref={confirmRef} type=\"button\" data-action=\"confirm\">\n {confirmLabel}\n </button>\n </div>\n\n <div\n aria-live=\"polite\"\n aria-atomic=\"true\"\n data-live-region\n style={{\n position: \"absolute\",\n width: \"1px\",\n height: \"1px\",\n padding: 0,\n margin: \"-1px\",\n overflow: \"hidden\",\n clip: \"rect(0, 0, 0, 0)\",\n whiteSpace: \"nowrap\",\n borderWidth: 0,\n }}\n >\n {announcement}\n </div>\n </div>\n );\n}\n\nTimePickerInput.displayName = \"TimePickerInput\";\n","\"use client\";\n\nimport { useReducedMotion } from \"../../hooks/useReducedMotion\";\nimport { cn } from \"../../utils/cn\";\nimport { TimePickerInput } from \"./TimePickerInput\";\nimport { timePickerContainerVariants } from \"./TimePicker.variants\";\n\nimport type { TimePickerInputProps } from \"./TimePicker.types\";\n\n/**\n * Tailwind descendant selectors for styling the headless TimePickerInput elements.\n * Each selector targets internal sub-components by their data attributes.\n */\nconst INPUT_STYLES = [\n // ── Headline ──────────────────────────────────────────────────────────────────\n \"[&_[data-headline]]:text-label-medium\",\n \"[&_[data-headline]]:text-on-surface-variant\",\n \"[&_[data-headline]]:mb-4\",\n\n // ── Input row ─────────────────────────────────────────────────────────────────\n \"[&_[data-input-row]]:flex\",\n \"[&_[data-input-row]]:items-center\",\n\n // Time input fields\n \"[&_[data-time-input-field]]:w-[96px]\",\n \"[&_[data-time-input-field]]:h-[72px]\",\n \"[&_[data-time-input-field]]:rounded-lg\",\n \"[&_[data-time-input-field]]:flex\",\n \"[&_[data-time-input-field]]:flex-col\",\n \"[&_[data-time-input-field]]:items-center\",\n \"[&_[data-time-input-field]]:justify-center\",\n \"[&_[data-time-input-field]]:cursor-text\",\n \"[&_[data-time-input-field]]:transition-colors\",\n \"[&_[data-time-input-field]]:duration-spring-standard-fast-effects\",\n \"[&_[data-time-input-field]]:ease-spring-standard-fast-effects\",\n \"[&_[data-time-input-field]]:bg-surface-container-highest\",\n \"[&_[data-time-input-field]]:text-on-surface\",\n\n // Input field value text\n \"[&_[data-time-input-field]_[data-value]]:text-display-large\",\n\n // Input field supporting text\n \"[&_[data-time-input-field]_[data-supporting-text]]:text-body-small\",\n \"[&_[data-time-input-field]_[data-supporting-text]]:text-on-surface-variant\",\n\n // Focused state (selected)\n \"[&_[data-time-input-field][data-focused]]:bg-primary-container\",\n \"[&_[data-time-input-field][data-focused]]:text-on-primary-container\",\n \"[&_[data-time-input-field][data-focused]]:border-2\",\n \"[&_[data-time-input-field][data-focused]]:border-primary\",\n\n // Focus-visible ring\n \"[&_[data-time-input-field]:focus-visible]:ring-2\",\n \"[&_[data-time-input-field]:focus-visible]:ring-primary\",\n\n // Separator colon\n \"[&_[data-time-separator]]:text-display-large\",\n \"[&_[data-time-separator]]:text-on-surface\",\n \"[&_[data-time-separator]]:select-none\",\n \"[&_[data-time-separator]]:px-1\",\n\n // ── Period selector ───────────────────────────────────────────────────────────\n \"[&_[data-period-selector]]:rounded-lg\",\n \"[&_[data-period-selector]]:border\",\n \"[&_[data-period-selector]]:border-outline\",\n \"[&_[data-period-selector]]:overflow-hidden\",\n \"[&_[data-period-selector]]:flex\",\n '[&_[data-period-selector][data-orientation=\"vertical\"]]:w-[52px]',\n '[&_[data-period-selector][data-orientation=\"vertical\"]]:h-[80px]',\n '[&_[data-period-selector][data-orientation=\"vertical\"]]:flex-col',\n \"[&_[data-period-selector]]:ml-3\",\n\n // Period items (AM/PM)\n '[&_[data-period-selector]>[role=\"radio\"]]:flex-1',\n '[&_[data-period-selector]>[role=\"radio\"]]:flex',\n '[&_[data-period-selector]>[role=\"radio\"]]:items-center',\n '[&_[data-period-selector]>[role=\"radio\"]]:justify-center',\n '[&_[data-period-selector]>[role=\"radio\"]]:text-title-medium',\n '[&_[data-period-selector]>[role=\"radio\"]]:cursor-pointer',\n '[&_[data-period-selector]>[role=\"radio\"]]:border-outline',\n '[&_[data-period-selector]>[role=\"radio\"]]:transition-colors',\n '[&_[data-period-selector]>[role=\"radio\"]]:duration-spring-standard-fast-effects',\n '[&_[data-period-selector]>[role=\"radio\"]]:ease-spring-standard-fast-effects',\n '[&_[data-period-selector]>[role=\"radio\"]]:text-on-surface-variant',\n '[&_[data-period-selector]>[role=\"radio\"][data-selected]]:bg-tertiary-container',\n '[&_[data-period-selector]>[role=\"radio\"][data-selected]]:text-on-tertiary-container',\n '[&_[data-period-selector]>[role=\"radio\"][data-selected]]:border-transparent',\n '[&_[data-period-selector]>[role=\"radio\"]:not([data-selected]):hover]:bg-on-surface-variant/8',\n '[&_[data-period-selector]>[role=\"radio\"][data-focus-visible]]:ring-2',\n '[&_[data-period-selector]>[role=\"radio\"][data-focus-visible]]:ring-primary',\n\n // ── Actions ───────────────────────────────────────────────────────────────────\n \"[&_[data-actions]]:flex\",\n \"[&_[data-actions]]:items-center\",\n \"[&_[data-actions]]:justify-end\",\n \"[&_[data-actions]]:gap-2\",\n \"[&_[data-actions]]:mt-4\",\n\n \"[&_[data-action]]:text-primary\",\n \"[&_[data-action]]:text-label-large\",\n \"[&_[data-action]]:rounded-full\",\n \"[&_[data-action]]:px-3\",\n \"[&_[data-action]]:py-2\",\n \"[&_[data-action]]:min-h-12\",\n \"[&_[data-action]]:transition-colors\",\n \"[&_[data-action]]:duration-spring-standard-fast-effects\",\n \"[&_[data-action]]:ease-spring-standard-fast-effects\",\n \"[&_[data-action]:hover]:bg-primary/8\",\n \"[&_[data-action]:focus-visible]:bg-primary/10\",\n \"[&_[data-action]:focus-visible]:ring-2\",\n \"[&_[data-action]:focus-visible]:ring-primary\",\n\n // Mode toggle\n '[&_[data-action=\"mode-toggle\"]]:text-on-surface-variant',\n '[&_[data-action=\"mode-toggle\"]]:mr-auto',\n '[&_[data-action=\"mode-toggle\"]]:w-12',\n '[&_[data-action=\"mode-toggle\"]]:h-12',\n '[&_[data-action=\"mode-toggle\"]]:flex',\n '[&_[data-action=\"mode-toggle\"]]:items-center',\n '[&_[data-action=\"mode-toggle\"]]:justify-center',\n '[&_[data-action=\"mode-toggle\"]:hover]:bg-on-surface-variant/8',\n].join(\" \");\n\n/**\n * Motion-specific descendant selectors for the time picker input variant.\n * Applied conditionally — omitted when `prefers-reduced-motion: reduce` is active.\n */\nexport const INPUT_MOTION_STYLES = [\n // ── Time input field focus ───────────────────────────────────────────────────\n \"[&_[data-time-input-field][data-focused]]:duration-short2\",\n \"[&_[data-time-input-field][data-focused]]:ease-standard\",\n\n // ── Period selector toggle ───────────────────────────────────────────────────\n '[&_[data-period-selector]>[role=\"radio\"][data-selected]]:duration-short2',\n '[&_[data-period-selector]>[role=\"radio\"][data-selected]]:ease-standard',\n].join(\" \");\n\n/**\n * Styled TimePickerInput (Layer 3)\n *\n * Wraps the headless `TimePickerInput` with MD3 visual styling via CVA variants\n * and descendant selectors. Applies container, time input fields, separator,\n * period selector, and action button tokens.\n *\n * @internal\n */\nexport function TimePickerInputStyled(props: TimePickerInputProps): JSX.Element {\n const { className, ...rest } = props;\n const reducedMotion = useReducedMotion();\n\n return (\n <TimePickerInput\n {...rest}\n className={cn(\n timePickerContainerVariants({ variant: \"input\", orientation: \"vertical\" }),\n INPUT_STYLES,\n !reducedMotion && INPUT_MOTION_STYLES,\n className\n )}\n />\n );\n}\n\nTimePickerInputStyled.displayName = \"TimePickerInputStyled\";\n","\"use client\";\n\nimport { TimePickerDialStyled } from \"./TimePickerDialStyled\";\nimport { TimePickerInputStyled } from \"./TimePickerInputStyled\";\n\nimport type { TimePickerProps } from \"./TimePicker.types\";\n\n/**\n * `TimePicker` — Layer 3 MD3 Styled Time Picker Component.\n *\n * Routes to the correct styled variant based on the `variant` prop:\n *\n * - **`dial`** (default): Circular clock face for selecting hours/minutes (touch-friendly).\n * Uses `TimePickerDialStyled` wrapping `TimePickerDial` headless component.\n *\n * - **`input`**: Text fields for manual time entry (accessibility-first, keyboard-optimized).\n * Uses `TimePickerInputStyled` wrapping `TimePickerInput` headless component.\n *\n * All variants follow MD3 specifications:\n * - `bg-surface-container-high` container background\n * - `rounded-3xl` (28dp) corner radius\n * - `p-6` (24dp) padding\n * - MD3 color tokens for all interactive states\n * - MD3 typography tokens (display-large, label-medium, title-medium, body-large)\n * - Spring-based standard motion tokens for state transitions\n *\n * @example\n * ```tsx\n * // Dial time picker (default, 12-hour)\n * <TimePicker label=\"Alarm time\" hourCycle={12} onConfirm={setTime} />\n *\n * // Input time picker (24-hour)\n * <TimePicker variant=\"input\" hourCycle={24} label=\"Meeting time\" onConfirm={setTime} />\n *\n * // Horizontal layout\n * <TimePicker orientation=\"horizontal\" label=\"Departure time\" />\n * ```\n *\n * @see https://m3.material.io/components/time-pickers/overview\n */\nexport function TimePicker(props: TimePickerProps): JSX.Element {\n const { variant = \"dial\", ...rest } = props;\n\n switch (variant) {\n case \"input\":\n return <TimePickerInputStyled {...mapToInputProps(rest)} />;\n default:\n return <TimePickerDialStyled {...mapToDialProps(rest)} />;\n }\n}\n\nTimePicker.displayName = \"TimePicker\";\n\n/**\n * Maps TimePickerProps (minus variant) to TimePickerDialProps.\n */\nfunction mapToDialProps(props: Omit<TimePickerProps, \"variant\">): Omit<TimePickerProps, \"variant\"> {\n return props;\n}\n\n/**\n * Maps TimePickerProps (minus variant) to TimePickerInputProps.\n */\nfunction mapToInputProps(\n props: Omit<TimePickerProps, \"variant\">\n): Omit<TimePickerProps, \"variant\"> {\n const { orientation: _orientation, minuteStep: _minuteStep, ...inputProps } = props;\n\n return inputProps;\n}\n","\"use client\";\n\nimport { useRef } from \"react\";\nimport { mergeProps, useCalendarCell, useFocusRing } from \"react-aria\";\nimport { isSameDay, today, getLocalTimeZone } from \"@internationalized/date\";\n\nimport type { CalendarDate } from \"@internationalized/date\";\nimport type { CalendarState, RangeCalendarState } from \"react-stately\";\n\n/**\n * Internal props for the CalendarCell headless component.\n * @internal\n */\ninterface CalendarCellInternalProps {\n /** The date this cell represents */\n date: CalendarDate;\n /** Calendar state from React Aria / React Stately */\n state: CalendarState | RangeCalendarState;\n}\n\n/**\n * Headless CalendarCell (Layer 2)\n *\n * Renders a single date cell within the calendar grid using React Aria's\n * `useCalendarCell` for accessibility and keyboard interaction.\n *\n * Exposes data attributes for the styled layer:\n * - `data-selected` — date is selected\n * - `data-today` — date is today\n * - `data-outside-month` — date is from an adjacent month\n * - `data-range-start` — date is the start of a selected range\n * - `data-range-end` — date is the end of a selected range\n * - `data-range-middle` — date is between range start and end\n * - `data-disabled` — date is disabled\n * - `data-unavailable` — date is unavailable\n * - `data-focused` — date is focused\n * - `data-focus-visible` — date has visible focus ring\n *\n * @internal\n */\nexport function CalendarCell({ date, state }: CalendarCellInternalProps): JSX.Element {\n const ref = useRef<HTMLDivElement>(null);\n\n const { cellProps, buttonProps, isSelected, isDisabled, isUnavailable, formattedDate } =\n useCalendarCell({ date }, state, ref);\n\n const { focusProps, isFocusVisible, isFocused } = useFocusRing();\n\n const isCurrentDay = isSameDay(date, today(getLocalTimeZone()));\n const isOutsideMonth =\n date.month !== state.visibleRange.start.month || date.year !== state.visibleRange.start.year;\n\n let isRangeStart = false;\n let isRangeEnd = false;\n let isRangeMiddle = false;\n\n if (\"highlightedRange\" in state && state.highlightedRange) {\n const range = state.highlightedRange;\n isRangeStart = isSameDay(date, range.start);\n isRangeEnd = isSameDay(date, range.end);\n isRangeMiddle = date.compare(range.start) > 0 && date.compare(range.end) < 0;\n }\n\n return (\n <td {...cellProps}>\n <div\n {...mergeProps(buttonProps, focusProps)}\n ref={ref}\n aria-current={isCurrentDay ? (\"date\" as const) : undefined}\n data-selected={isSelected || undefined}\n data-today={isCurrentDay || undefined}\n data-outside-month={isOutsideMonth || undefined}\n data-range-start={isRangeStart || undefined}\n data-range-end={isRangeEnd || undefined}\n data-range-middle={isRangeMiddle || undefined}\n data-disabled={isDisabled || undefined}\n data-unavailable={isUnavailable || undefined}\n data-focused={isFocused || undefined}\n data-focus-visible={isFocusVisible || undefined}\n >\n {formattedDate}\n </div>\n </td>\n );\n}\n\nCalendarCell.displayName = \"CalendarCell\";\n","\"use client\";\n\nimport { useCalendarGrid, useLocale } from \"react-aria\";\nimport { getWeeksInMonth } from \"@internationalized/date\";\n\nimport { CalendarCell } from \"./CalendarCell\";\n\nimport type { CalendarState, RangeCalendarState } from \"react-stately\";\n\n/**\n * Internal props for the CalendarGrid headless component.\n * @internal\n */\ninterface CalendarGridInternalProps {\n /** Calendar state from React Aria / React Stately */\n state: CalendarState | RangeCalendarState;\n /** First day of the week in React Aria string format */\n firstDayOfWeek?: \"sun\" | \"mon\" | \"tue\" | \"wed\" | \"thu\" | \"fri\" | \"sat\" | undefined;\n}\n\n/**\n * Headless CalendarGrid (Layer 2)\n *\n * Renders the calendar grid structure using React Aria's `useCalendarGrid`.\n * Produces a `<table>` with `role=\"grid\"`, weekday column headers, and\n * week rows containing CalendarCell components.\n *\n * @internal\n */\nexport function CalendarGrid({ state, firstDayOfWeek }: CalendarGridInternalProps): JSX.Element {\n const { locale } = useLocale();\n\n const gridOptions = firstDayOfWeek ? { firstDayOfWeek } : {};\n const { gridProps, headerProps, weekDays } = useCalendarGrid(gridOptions, state);\n\n const weeksInMonth = getWeeksInMonth(\n state.visibleRange.start,\n locale,\n firstDayOfWeek ?? undefined\n );\n\n return (\n <table {...gridProps}>\n <thead {...headerProps} aria-hidden={undefined}>\n <tr>\n {weekDays.map((day, index) => (\n <th key={index} role=\"columnheader\">\n {day}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {[...new Array(weeksInMonth).keys()].map((weekIndex) => (\n <tr key={weekIndex}>\n {state\n .getDatesInWeek(weekIndex)\n .map((date, i) =>\n date ? <CalendarCell key={i} state={state} date={date} /> : <td key={i} />\n )}\n </tr>\n ))}\n </tbody>\n </table>\n );\n}\n\nCalendarGrid.displayName = \"CalendarGrid\";\n","\"use client\";\n\nimport { useRef } from \"react\";\nimport { useButton } from \"react-aria\";\n\nimport type { PressEvent } from \"react-aria\";\n\n/**\n * Internal props for a calendar navigation button.\n * Matches the subset of AriaButtonProps returned by useCalendar.\n * @internal\n */\ninterface CalendarNavigationButtonProps {\n /** Accessible label for the button */\n \"aria-label\"?: string | undefined;\n /** Handler called when the button is pressed */\n onPress?: ((e: PressEvent) => void) | undefined;\n /** Whether the button is disabled */\n isDisabled?: boolean | undefined;\n}\n\n/**\n * Internal props for the CalendarHeader headless component.\n * @internal\n */\ninterface CalendarHeaderProps {\n /** Formatted title (e.g., \"August 2025\") */\n title: string;\n /** Props for the previous month navigation button */\n prevButtonProps: CalendarNavigationButtonProps;\n /** Props for the next month navigation button */\n nextButtonProps: CalendarNavigationButtonProps;\n /** Called when the title is clicked (to toggle year selection view) */\n onTitleClick?: () => void;\n /** Whether to show the dropdown indicator on the title */\n showDropdownIndicator?: boolean;\n}\n\n/**\n * Navigation button using React Aria's `useButton` for accessibility.\n * @internal\n */\nfunction NavigationButton({\n children,\n isDisabled,\n onPress,\n \"aria-label\": ariaLabel,\n}: CalendarNavigationButtonProps & { children?: React.ReactNode }): JSX.Element {\n const ref = useRef<HTMLButtonElement>(null);\n const { buttonProps } = useButton(\n {\n isDisabled: isDisabled ?? false,\n ...(onPress ? { onPress } : {}),\n ...(ariaLabel ? { \"aria-label\": ariaLabel } : {}),\n },\n ref\n );\n\n return (\n <button {...buttonProps} ref={ref} type=\"button\" data-nav-button>\n {children}\n </button>\n );\n}\n\n/**\n * Chevron left SVG icon for previous month navigation.\n * @internal\n */\nfunction ChevronLeftIcon(): JSX.Element {\n return (\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z\" />\n </svg>\n );\n}\n\n/**\n * Chevron right SVG icon for next month navigation.\n * @internal\n */\nfunction ChevronRightIcon(): JSX.Element {\n return (\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z\" />\n </svg>\n );\n}\n\n/**\n * Dropdown arrow SVG icon for year selection toggle.\n * @internal\n */\nfunction DropdownArrowIcon(): JSX.Element {\n return (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M7 10l5 5 5-5z\" />\n </svg>\n );\n}\n\n/**\n * Headless CalendarHeader (Layer 2)\n *\n * Renders month/year navigation controls with proper ARIA semantics.\n * Includes previous/next month buttons and an `aria-live=\"polite\"` heading\n * for screen reader announcements of month changes.\n *\n * The title can be made clickable to toggle year selection view by\n * providing the `onTitleClick` callback.\n *\n * @internal\n */\nexport function CalendarHeader({\n title,\n prevButtonProps,\n nextButtonProps,\n onTitleClick,\n showDropdownIndicator = false,\n}: CalendarHeaderProps): JSX.Element {\n const enhancedPrevProps: CalendarNavigationButtonProps = {\n ...prevButtonProps,\n \"aria-label\": \"Previous month\",\n };\n\n const enhancedNextProps: CalendarNavigationButtonProps = {\n ...nextButtonProps,\n \"aria-label\": \"Next month\",\n };\n\n return (\n <div data-calendar-header>\n {onTitleClick ? (\n <button\n type=\"button\"\n onClick={onTitleClick}\n data-calendar-title\n aria-label={`${title}, click to select year`}\n >\n <h2 aria-live=\"polite\">{title}</h2>\n {showDropdownIndicator && <DropdownArrowIcon />}\n </button>\n ) : (\n <div data-calendar-title>\n <h2 aria-live=\"polite\">{title}</h2>\n </div>\n )}\n <div data-calendar-nav>\n <NavigationButton {...enhancedPrevProps}>\n <ChevronLeftIcon />\n </NavigationButton>\n <NavigationButton {...enhancedNextProps}>\n <ChevronRightIcon />\n </NavigationButton>\n </div>\n </div>\n );\n}\n\nCalendarHeader.displayName = \"CalendarHeader\";\n","\"use client\";\n\nimport type React from \"react\";\nimport { forwardRef, useRef, useState } from \"react\";\nimport { useCalendar, useRangeCalendar, useLocale } from \"react-aria\";\nimport { useCalendarState, useRangeCalendarState } from \"react-stately\";\nimport { createCalendar } from \"@internationalized/date\";\n\nimport { CalendarGrid } from \"./CalendarGrid\";\nimport { CalendarHeader } from \"./CalendarHeader\";\n\nimport type { DateValue } from \"@internationalized/date\";\nimport type { CalendarView, DateSelectionMode } from \"./DatePicker.types\";\n\nconst FIRST_DAY_MAP: Record<number, \"sun\" | \"mon\" | \"tue\" | \"wed\" | \"thu\" | \"fri\" | \"sat\"> = {\n 0: \"sun\",\n 1: \"mon\",\n 2: \"tue\",\n 3: \"wed\",\n 4: \"thu\",\n 5: \"fri\",\n 6: \"sat\",\n};\n\nconst YEAR_RANGE_OFFSET = 50;\n\n/**\n * Props for the CalendarCore headless component (Layer 2).\n *\n * Orchestrates the full calendar grid, navigation, and selection behavior\n * for both single-date and date-range modes.\n *\n * @example\n * ```tsx\n * <CalendarCore\n * aria-label=\"Departure date\"\n * selectionMode=\"single\"\n * onChange={(date) => console.log(date)}\n * />\n * ```\n */\nexport interface CalendarCoreProps {\n /** Selection mode: single date or date range. @default 'single' */\n selectionMode?: DateSelectionMode;\n /** Controlled selected date (single mode) */\n value?: DateValue | null;\n /** Default selected date for uncontrolled usage (single mode) */\n defaultValue?: DateValue | null;\n /** Controlled start and end dates (range mode) */\n rangeValue?: { start: DateValue; end: DateValue } | null;\n /** Default range for uncontrolled usage (range mode) */\n defaultRangeValue?: { start: DateValue; end: DateValue } | null;\n /** Called when selected date changes (single mode) */\n onChange?: (value: DateValue) => void;\n /** Called when selected range changes (range mode) */\n onRangeChange?: (value: { start: DateValue; end: DateValue }) => void;\n /** Minimum selectable date */\n minValue?: DateValue;\n /** Maximum selectable date */\n maxValue?: DateValue;\n /** Whether a specific date is unavailable */\n isDateUnavailable?: (date: DateValue) => boolean;\n /** Whether the calendar is disabled. @default false */\n isDisabled?: boolean;\n /** Whether the calendar is read-only. @default false */\n isReadOnly?: boolean;\n /** Current calendar view. @default 'day' */\n view?: CalendarView;\n /** Called when the view changes */\n onViewChange?: (view: CalendarView) => void;\n /** Locale override */\n locale?: string;\n /** First day of week (0=Sun, 1=Mon, ..., 6=Sat) */\n firstDayOfWeek?: 0 | 1 | 2 | 3 | 4 | 5 | 6;\n /** CSS classes for the root element */\n className?: string;\n /** Children for styled layer injection */\n children?: React.ReactNode;\n /** Accessible label */\n \"aria-label\"?: string;\n /** ID of labelling element */\n \"aria-labelledby\"?: string;\n}\n\ntype CalendarInternalProps = Omit<CalendarCoreProps, \"selectionMode\"> & {\n calendarRef: React.RefObject<HTMLDivElement>;\n};\n\n/**\n * Internal year grid for year selection view.\n * Renders a 3-column grid of selectable years.\n * @internal\n */\nfunction YearGrid({\n selectedYear,\n onYearSelect,\n minYear,\n maxYear,\n}: {\n selectedYear: number;\n onYearSelect: (year: number) => void;\n minYear?: number;\n maxYear?: number;\n}): JSX.Element {\n const currentYear = new Date().getFullYear();\n const startYear = minYear ?? currentYear - YEAR_RANGE_OFFSET;\n const endYear = maxYear ?? currentYear + YEAR_RANGE_OFFSET;\n\n const years: number[] = [];\n for (let y = startYear; y <= endYear; y++) {\n years.push(y);\n }\n\n const selectedRef = useRef<HTMLButtonElement>(null);\n\n return (\n <div\n data-year-grid\n role=\"grid\"\n aria-label=\"Year selection\"\n ref={(el) => {\n if (el && selectedRef.current) {\n selectedRef.current.scrollIntoView({\n block: \"center\",\n behavior: \"instant\",\n });\n }\n }}\n >\n {years.map((year) => {\n const isSelected = year === selectedYear;\n return (\n <button\n key={year}\n type=\"button\"\n role=\"gridcell\"\n aria-selected={isSelected}\n data-year-item\n data-selected={isSelected || undefined}\n ref={isSelected ? selectedRef : undefined}\n onClick={() => onYearSelect(year)}\n >\n {year}\n </button>\n );\n })}\n </div>\n );\n}\n\n/**\n * Internal single-date calendar using useCalendar + useCalendarState.\n * Isolated to avoid conditional hook calls.\n */\nfunction SingleCalendarInner({ calendarRef, ...props }: CalendarInternalProps): JSX.Element {\n const { locale: defaultLocale } = useLocale();\n const calendarLocale = props.locale ?? defaultLocale;\n\n const firstDay =\n props.firstDayOfWeek !== undefined ? FIRST_DAY_MAP[props.firstDayOfWeek] : undefined;\n\n const [currentView, setCurrentView] = useState<\"day\" | \"year\">(\n props.view === \"year\" ? \"year\" : \"day\"\n );\n\n const optionalProps = {\n ...(props.value !== undefined ? { value: props.value } : {}),\n ...(props.defaultValue !== undefined ? { defaultValue: props.defaultValue } : {}),\n ...(props.onChange ? { onChange: props.onChange } : {}),\n ...(props.isDateUnavailable ? { isDateUnavailable: props.isDateUnavailable } : {}),\n ...(props[\"aria-label\"] ? { \"aria-label\": props[\"aria-label\"] } : {}),\n ...(props[\"aria-labelledby\"] ? { \"aria-labelledby\": props[\"aria-labelledby\"] } : {}),\n };\n\n const state = useCalendarState({\n ...optionalProps,\n minValue: props.minValue ?? null,\n maxValue: props.maxValue ?? null,\n isDisabled: props.isDisabled ?? false,\n isReadOnly: props.isReadOnly ?? false,\n locale: calendarLocale,\n createCalendar,\n });\n\n const { calendarProps, prevButtonProps, nextButtonProps, title } = useCalendar(\n {\n ...optionalProps,\n minValue: props.minValue ?? null,\n maxValue: props.maxValue ?? null,\n isDisabled: props.isDisabled ?? false,\n isReadOnly: props.isReadOnly ?? false,\n },\n state\n );\n\n const handleTitleClick = (): void => {\n const nextView = currentView === \"day\" ? \"year\" : \"day\";\n setCurrentView(nextView);\n props.onViewChange?.(nextView);\n };\n\n const handleYearSelect = (year: number): void => {\n const newDate = state.focusedDate.set({ year });\n state.setFocusedDate(newDate);\n setCurrentView(\"day\");\n props.onViewChange?.(\"day\");\n };\n\n return (\n <div {...calendarProps} ref={calendarRef} className={props.className} data-view={currentView}>\n <CalendarHeader\n title={title}\n prevButtonProps={currentView === \"day\" ? prevButtonProps : { isDisabled: true }}\n nextButtonProps={currentView === \"day\" ? nextButtonProps : { isDisabled: true }}\n onTitleClick={handleTitleClick}\n showDropdownIndicator\n />\n {currentView === \"day\" ? (\n <CalendarGrid state={state} firstDayOfWeek={firstDay} />\n ) : (\n <YearGrid\n selectedYear={state.focusedDate.year}\n onYearSelect={handleYearSelect}\n {...(props.minValue ? { minYear: props.minValue.year } : {})}\n {...(props.maxValue ? { maxYear: props.maxValue.year } : {})}\n />\n )}\n {props.children}\n </div>\n );\n}\n\n/**\n * Internal range calendar using useRangeCalendar + useRangeCalendarState.\n * Isolated to avoid conditional hook calls.\n */\nfunction RangeCalendarInner({ calendarRef, ...props }: CalendarInternalProps): JSX.Element {\n const { locale: defaultLocale } = useLocale();\n const calendarLocale = props.locale ?? defaultLocale;\n\n const firstDay =\n props.firstDayOfWeek !== undefined ? FIRST_DAY_MAP[props.firstDayOfWeek] : undefined;\n\n const [currentView, setCurrentView] = useState<\"day\" | \"year\">(\n props.view === \"year\" ? \"year\" : \"day\"\n );\n\n const unavailableProp = props.isDateUnavailable\n ? { isDateUnavailable: props.isDateUnavailable }\n : {};\n\n const rangeValueProp = props.rangeValue ? { value: props.rangeValue } : {};\n const rangeDefaultProp = props.defaultRangeValue ? { defaultValue: props.defaultRangeValue } : {};\n const rangeChangeProp = props.onRangeChange ? { onChange: props.onRangeChange } : {};\n const ariaLabelProp = props[\"aria-label\"] ? { \"aria-label\": props[\"aria-label\"] } : {};\n const ariaLabelledByProp = props[\"aria-labelledby\"]\n ? { \"aria-labelledby\": props[\"aria-labelledby\"] }\n : {};\n\n const state = useRangeCalendarState({\n ...rangeValueProp,\n ...rangeDefaultProp,\n ...rangeChangeProp,\n minValue: props.minValue ?? null,\n maxValue: props.maxValue ?? null,\n ...unavailableProp,\n isDisabled: props.isDisabled ?? false,\n isReadOnly: props.isReadOnly ?? false,\n locale: calendarLocale,\n createCalendar,\n });\n\n const { calendarProps, prevButtonProps, nextButtonProps, title } = useRangeCalendar(\n {\n ...ariaLabelProp,\n ...ariaLabelledByProp,\n ...rangeValueProp,\n ...rangeDefaultProp,\n ...rangeChangeProp,\n minValue: props.minValue ?? null,\n maxValue: props.maxValue ?? null,\n ...unavailableProp,\n isDisabled: props.isDisabled ?? false,\n isReadOnly: props.isReadOnly ?? false,\n },\n state,\n calendarRef\n );\n\n const handleTitleClick = (): void => {\n const nextView = currentView === \"day\" ? \"year\" : \"day\";\n setCurrentView(nextView);\n props.onViewChange?.(nextView);\n };\n\n const handleYearSelect = (year: number): void => {\n const newDate = state.focusedDate.set({ year });\n state.setFocusedDate(newDate);\n setCurrentView(\"day\");\n props.onViewChange?.(\"day\");\n };\n\n return (\n <div {...calendarProps} ref={calendarRef} className={props.className} data-view={currentView}>\n <CalendarHeader\n title={title}\n prevButtonProps={currentView === \"day\" ? prevButtonProps : { isDisabled: true }}\n nextButtonProps={currentView === \"day\" ? nextButtonProps : { isDisabled: true }}\n onTitleClick={handleTitleClick}\n showDropdownIndicator\n />\n {currentView === \"day\" ? (\n <CalendarGrid state={state} firstDayOfWeek={firstDay} />\n ) : (\n <YearGrid\n selectedYear={state.focusedDate.year}\n onYearSelect={handleYearSelect}\n {...(props.minValue ? { minYear: props.minValue.year } : {})}\n {...(props.maxValue ? { maxYear: props.maxValue.year } : {})}\n />\n )}\n {props.children}\n </div>\n );\n}\n\n/**\n * Headless CalendarCore (Layer 2)\n *\n * Orchestrates the full calendar experience using React Aria's `useCalendar`\n * (single mode) or `useRangeCalendar` (range mode). Composes CalendarHeader\n * and CalendarGrid sub-components.\n *\n * Supports day view (calendar grid) and year view (3-column year selection grid)\n * toggled by clicking the month/year title in the header.\n *\n * This is a headless component — it provides behavior, ARIA semantics, and\n * data attributes only. No styling classes are applied.\n *\n * @example\n * ```tsx\n * <CalendarCore aria-label=\"Pick a date\" onChange={setDate} />\n * <CalendarCore aria-label=\"Trip dates\" selectionMode=\"range\" onRangeChange={setRange} />\n * ```\n */\nexport const CalendarCore = forwardRef<HTMLDivElement, CalendarCoreProps>((props, forwardedRef) => {\n const { selectionMode = \"single\", ...rest } = props;\n const internalRef = useRef<HTMLDivElement>(null);\n const ref = (forwardedRef ?? internalRef) as React.RefObject<HTMLDivElement>;\n\n if (selectionMode === \"range\") {\n return <RangeCalendarInner key=\"range\" {...rest} calendarRef={ref} />;\n }\n\n return <SingleCalendarInner key=\"single\" {...rest} calendarRef={ref} />;\n});\n\nCalendarCore.displayName = \"CalendarCore\";\n","\"use client\";\n\nimport { useRef } from \"react\";\nimport { useButton } from \"react-aria\";\n\nimport type { DatePickerActionsProps } from \"./DatePicker.types\";\n\n/**\n * Headless DatePickerActions (Layer 2)\n *\n * Renders Cancel, OK, and optionally Clear action buttons for the date picker.\n * Uses React Aria's `useButton` for accessibility and keyboard interaction.\n *\n * This is a headless component — it provides behavior, ARIA semantics, and\n * data attributes only. No styling classes are applied.\n *\n * @internal\n */\nexport function DatePickerActions({\n cancelLabel = \"Cancel\",\n confirmLabel = \"OK\",\n clearLabel = \"Clear\",\n showClear = false,\n isConfirmDisabled = false,\n onCancel,\n onConfirm,\n onClear,\n className,\n}: DatePickerActionsProps): JSX.Element {\n const clearRef = useRef<HTMLButtonElement>(null);\n const cancelRef = useRef<HTMLButtonElement>(null);\n const confirmRef = useRef<HTMLButtonElement>(null);\n\n const { buttonProps: clearButtonProps } = useButton(\n {\n \"aria-label\": clearLabel,\n ...(onClear ? { onPress: onClear } : {}),\n },\n clearRef\n );\n\n const { buttonProps: cancelButtonProps } = useButton(\n {\n \"aria-label\": cancelLabel,\n ...(onCancel ? { onPress: onCancel } : {}),\n },\n cancelRef\n );\n\n const { buttonProps: confirmButtonProps } = useButton(\n {\n \"aria-label\": confirmLabel,\n isDisabled: isConfirmDisabled,\n ...(onConfirm ? { onPress: onConfirm } : {}),\n },\n confirmRef\n );\n\n return (\n <div className={className} data-actions>\n {showClear && (\n <button {...clearButtonProps} ref={clearRef} type=\"button\" data-action=\"clear\">\n {clearLabel}\n </button>\n )}\n <button {...cancelButtonProps} ref={cancelRef} type=\"button\" data-action=\"cancel\">\n {cancelLabel}\n </button>\n <button {...confirmButtonProps} ref={confirmRef} type=\"button\" data-action=\"confirm\">\n {confirmLabel}\n </button>\n </div>\n );\n}\n\nDatePickerActions.displayName = \"DatePickerActions\";\n","\"use client\";\n\nimport { forwardRef, useRef, useCallback, useEffect } from \"react\";\nimport {\n useDatePicker,\n useDateField,\n useDateSegment,\n useButton,\n useLocale,\n usePopover,\n DismissButton,\n} from \"react-aria\";\nimport { useDatePickerState, useDateFieldState } from \"react-stately\";\nimport { createCalendar } from \"@internationalized/date\";\n\nimport { CalendarCore } from \"./CalendarCore\";\nimport { DatePickerActions } from \"./DatePickerActions\";\n\nimport type { DateSegment as DateSegmentType } from \"react-stately\";\nimport type { DateValue } from \"@internationalized/date\";\nimport type { DatePickerDockedProps } from \"./DatePicker.types\";\n\n/**\n * Internal segment renderer for the date field inside the picker.\n * @internal\n */\nfunction PickerDateSegment({\n segment,\n state,\n}: {\n segment: DateSegmentType;\n state: ReturnType<typeof useDateFieldState>;\n}): JSX.Element {\n const ref = useRef<HTMLDivElement>(null);\n const { segmentProps } = useDateSegment(segment, state, ref);\n\n return (\n <div\n {...segmentProps}\n ref={ref}\n data-segment={segment.type}\n data-placeholder={segment.isPlaceholder || undefined}\n >\n {segment.text}\n </div>\n );\n}\n\n/**\n * Internal date field that receives fieldProps from useDatePicker.\n * This bridges the picker's state management to useDateField.\n * @internal\n */\nfunction PickerDateField({\n fieldProps: externalFieldProps,\n}: {\n fieldProps: Record<string, unknown>;\n}): JSX.Element {\n const { locale } = useLocale();\n const ref = useRef<HTMLDivElement>(null);\n\n const state = useDateFieldState({\n ...externalFieldProps,\n locale,\n createCalendar,\n });\n\n const { fieldProps } = useDateField(externalFieldProps, state, ref);\n\n return (\n <div {...fieldProps} ref={ref} data-field>\n {state.segments.map((segment, i) => (\n <PickerDateSegment key={i} segment={segment} state={state} />\n ))}\n </div>\n );\n}\n\n/**\n * Calendar SVG icon for the trigger button.\n * @internal\n */\nfunction CalendarTriggerIcon(): JSX.Element {\n return (\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M19 3h-1V1h-2v2H8V1H6v2H5c-1.11 0-1.99.9-1.99 2L3 19c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 16H5V8h14v11zM9 10H7v2h2v-2zm4 0h-2v2h2v-2zm4 0h-2v2h2v-2z\" />\n </svg>\n );\n}\n\n/**\n * Internal popover content that uses usePopover for proper dismiss handling.\n * Handles Escape key, focus trapping, and click-outside dismiss.\n * @internal\n */\nfunction PopoverContent({\n popoverRef,\n triggerRef,\n state,\n dialogProps,\n calendarProps,\n cancelLabel,\n confirmLabel,\n onCancel,\n onConfirm,\n}: {\n popoverRef: React.RefObject<HTMLDivElement>;\n triggerRef: React.RefObject<HTMLButtonElement>;\n state: ReturnType<typeof useDatePickerState>;\n dialogProps: ReturnType<typeof useDatePicker>[\"dialogProps\"];\n calendarProps: ReturnType<typeof useDatePicker>[\"calendarProps\"];\n cancelLabel: string;\n confirmLabel: string;\n onCancel: () => void;\n onConfirm: () => void;\n}): JSX.Element {\n const { popoverProps } = usePopover(\n {\n popoverRef,\n triggerRef,\n placement: \"bottom start\",\n offset: 4,\n },\n state\n );\n\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent): void => {\n if (e.key === \"Escape\") {\n e.stopPropagation();\n state.close();\n }\n };\n\n document.addEventListener(\"keydown\", handleKeyDown);\n return () => document.removeEventListener(\"keydown\", handleKeyDown);\n }, [state]);\n\n return (\n <div {...popoverProps} ref={popoverRef} data-popover>\n <DismissButton onDismiss={() => state.close()} />\n <div {...dialogProps} role=\"dialog\">\n <CalendarCore\n {...{\n ...(calendarProps.value ? { value: calendarProps.value } : {}),\n ...(calendarProps.onChange ? { onChange: calendarProps.onChange } : {}),\n ...(calendarProps.minValue ? { minValue: calendarProps.minValue } : {}),\n ...(calendarProps.maxValue ? { maxValue: calendarProps.maxValue } : {}),\n ...(calendarProps.isDisabled ? { isDisabled: calendarProps.isDisabled } : {}),\n ...(calendarProps.isReadOnly ? { isReadOnly: calendarProps.isReadOnly } : {}),\n ...(calendarProps.isDateUnavailable\n ? { isDateUnavailable: calendarProps.isDateUnavailable }\n : {}),\n }}\n aria-label={(calendarProps as { \"aria-label\"?: string })[\"aria-label\"] ?? \"Calendar\"}\n />\n <DatePickerActions\n cancelLabel={cancelLabel}\n confirmLabel={confirmLabel}\n onCancel={onCancel}\n onConfirm={onConfirm}\n />\n </div>\n <DismissButton onDismiss={() => state.close()} />\n </div>\n );\n}\n\n/**\n * Headless DatePickerDocked (Layer 2)\n *\n * Provides the complete docked date picker behavior:\n * - Segmented date field trigger (MM/DD/YYYY)\n * - Calendar icon button to toggle the calendar popover\n * - Inline popover containing the CalendarCore from M02\n * - Action buttons (Cancel, OK) at the bottom\n * - Open/close state management via React Aria overlays\n *\n * This is a headless component — it provides behavior, ARIA semantics, and\n * data attributes only. No styling classes are applied.\n *\n * @example\n * ```tsx\n * <DatePickerDocked\n * label=\"Departure date\"\n * onChange={(date) => console.log(date)}\n * />\n * ```\n */\nexport const DatePickerDocked = forwardRef<HTMLDivElement, DatePickerDockedProps>(\n (props, forwardedRef) => {\n const {\n cancelLabel = \"Cancel\",\n confirmLabel = \"OK\",\n onCancel,\n onConfirm,\n className,\n ...datePickerProps\n } = props;\n\n const internalRef = useRef<HTMLDivElement>(null);\n const ref = (forwardedRef ?? internalRef) as React.RefObject<HTMLDivElement>;\n const triggerRef = useRef<HTMLButtonElement>(null);\n const popoverRef = useRef<HTMLDivElement>(null);\n\n const stateProps = {\n ...(datePickerProps.value !== undefined ? { value: datePickerProps.value } : {}),\n ...(datePickerProps.defaultValue !== undefined\n ? { defaultValue: datePickerProps.defaultValue }\n : {}),\n ...(datePickerProps.onChange ? { onChange: datePickerProps.onChange } : {}),\n ...(datePickerProps.minValue ? { minValue: datePickerProps.minValue } : {}),\n ...(datePickerProps.maxValue ? { maxValue: datePickerProps.maxValue } : {}),\n ...(datePickerProps.isDateUnavailable\n ? { isDateUnavailable: datePickerProps.isDateUnavailable }\n : {}),\n ...(datePickerProps.placeholderValue\n ? { placeholderValue: datePickerProps.placeholderValue }\n : {}),\n ...(datePickerProps[\"aria-label\"] ? { \"aria-label\": datePickerProps[\"aria-label\"] } : {}),\n ...(datePickerProps[\"aria-labelledby\"]\n ? { \"aria-labelledby\": datePickerProps[\"aria-labelledby\"] }\n : {}),\n ...(datePickerProps.label ? { label: datePickerProps.label } : {}),\n ...(datePickerProps.isOpen !== undefined ? { isOpen: datePickerProps.isOpen } : {}),\n ...(datePickerProps.defaultOpen !== undefined\n ? { defaultOpen: datePickerProps.defaultOpen }\n : {}),\n ...(datePickerProps.onOpenChange ? { onOpenChange: datePickerProps.onOpenChange } : {}),\n isDisabled: datePickerProps.isDisabled ?? false,\n isReadOnly: datePickerProps.isReadOnly ?? false,\n isRequired: datePickerProps.isRequired ?? false,\n granularity: (datePickerProps.granularity ?? \"day\") as \"day\",\n shouldCloseOnSelect: false,\n };\n\n const state = useDatePickerState(stateProps);\n\n const {\n groupProps,\n labelProps,\n fieldProps,\n buttonProps: triggerButtonAriaProps,\n dialogProps,\n calendarProps,\n } = useDatePicker(stateProps, state, ref);\n\n const { buttonProps: iconButtonProps } = useButton(triggerButtonAriaProps, triggerRef);\n\n const valueBeforeOpenRef = useRef<DateValue | null>(null);\n\n useEffect(() => {\n if (state.isOpen) {\n valueBeforeOpenRef.current = state.value ?? null;\n }\n }, [state.isOpen]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const handleCancel = useCallback(() => {\n const previous = valueBeforeOpenRef.current;\n if (previous !== null) {\n state.setValue(previous);\n } else {\n state.setValue(null as unknown as DateValue);\n }\n state.setOpen(false);\n onCancel?.();\n triggerRef.current?.focus();\n }, [state, onCancel]);\n\n const handleConfirm = useCallback(() => {\n state.setOpen(false);\n onConfirm?.(state.value ?? null);\n triggerRef.current?.focus();\n }, [state, onConfirm]);\n\n return (\n <div\n ref={ref}\n className={className}\n data-variant=\"docked\"\n data-open={state.isOpen ?? undefined}\n data-disabled={datePickerProps.isDisabled ?? undefined}\n >\n {datePickerProps.label && (\n <label {...labelProps} data-label>\n {datePickerProps.label}\n </label>\n )}\n <div {...groupProps} data-field-group>\n <PickerDateField fieldProps={fieldProps as Record<string, unknown>} />\n <button {...iconButtonProps} ref={triggerRef} type=\"button\" data-trigger>\n <CalendarTriggerIcon />\n </button>\n </div>\n {state.isOpen && (\n <PopoverContent\n popoverRef={popoverRef}\n triggerRef={triggerRef}\n state={state}\n dialogProps={dialogProps}\n calendarProps={calendarProps}\n cancelLabel={cancelLabel}\n confirmLabel={confirmLabel}\n onCancel={handleCancel}\n onConfirm={handleConfirm}\n />\n )}\n </div>\n );\n }\n);\n\nDatePickerDocked.displayName = \"DatePickerDocked\";\n","import { cva, type VariantProps } from \"class-variance-authority\";\n\n// ─── Container ──────────────────────────────────────────────────────────────────\n\n/**\n * CVA variants for the Date Picker container.\n * MD3 spec: surface-container-high background, extra-large corner radius (28dp).\n */\nexport const datePickerContainerVariants = cva(\n [\n \"bg-surface-container-high\",\n \"rounded-3xl\", // NOTE: shape.extra-large = 28dp; mapped via @theme token\n \"overflow-hidden\",\n ],\n {\n variants: {\n variant: {\n docked: \"w-[360px]\", // NOTE: measurement-derived value from MD3 spec (360dp fixed width); permitted exception\n modal: \"w-[360px]\", // NOTE: measurement-derived value from MD3 spec (360dp fixed width); permitted exception\n \"modal-input\": \"w-[328px]\", // NOTE: measurement-derived value from MD3 spec (328dp); permitted exception\n },\n },\n defaultVariants: {\n variant: \"docked\",\n },\n }\n);\n\nexport type DatePickerContainerVariants = VariantProps<typeof datePickerContainerVariants>;\n\n// ─── Calendar Cell ──────────────────────────────────────────────────────────────\n\n/**\n * CVA for individual calendar date cells.\n * MD3 spec: 48x48dp circle, various states and types.\n */\nexport const calendarCellVariants = cva(\n [\n \"w-[48px]\", // NOTE: measurement-derived (48dp touch target); permitted exception\n \"h-[48px]\", // NOTE: measurement-derived (48dp); permitted exception\n \"rounded-full\", // shape.full = circle\n \"flex\",\n \"items-center\",\n \"justify-center\",\n \"text-body-large\",\n \"relative\",\n \"cursor-pointer\",\n \"select-none\",\n \"transition-colors\",\n \"duration-spring-standard-fast-effects\",\n \"ease-spring-standard-fast-effects\",\n ],\n {\n variants: {\n cellType: {\n default: \"text-on-surface\",\n today: \"text-primary border border-primary\",\n selected: \"bg-primary text-on-primary\",\n \"selected-range-middle\": \"bg-secondary-container text-on-secondary-container rounded-none\",\n \"outside-month\": \"text-on-surface-variant\",\n disabled: \"text-on-surface/38 cursor-not-allowed\",\n },\n state: {\n enabled: \"\",\n hovered: \"\",\n focused: \"\",\n pressed: \"\",\n },\n },\n compoundVariants: [\n // Default cell states\n {\n cellType: \"default\",\n state: \"hovered\",\n className: \"bg-on-surface/8\",\n },\n {\n cellType: \"default\",\n state: \"focused\",\n className: \"bg-on-surface/10 ring-2 ring-on-surface\",\n },\n {\n cellType: \"default\",\n state: \"pressed\",\n className: \"bg-on-surface/10\",\n },\n // Today cell states\n {\n cellType: \"today\",\n state: \"hovered\",\n className: \"bg-primary/8\",\n },\n {\n cellType: \"today\",\n state: \"focused\",\n className: \"bg-primary/10\",\n },\n {\n cellType: \"today\",\n state: \"pressed\",\n className: \"bg-primary/10\",\n },\n // Selected cell states\n {\n cellType: \"selected\",\n state: \"hovered\",\n className: \"bg-primary shadow-sm\",\n },\n {\n cellType: \"selected\",\n state: \"focused\",\n className: \"bg-primary shadow-sm\",\n },\n {\n cellType: \"selected\",\n state: \"pressed\",\n className: \"bg-primary shadow-sm\",\n },\n // Range middle states\n {\n cellType: \"selected-range-middle\",\n state: \"hovered\",\n className: \"bg-secondary-container/80\",\n },\n {\n cellType: \"selected-range-middle\",\n state: \"focused\",\n className: \"bg-secondary-container/80\",\n },\n ],\n defaultVariants: {\n cellType: \"default\",\n state: \"enabled\",\n },\n }\n);\n\nexport type CalendarCellVariants = VariantProps<typeof calendarCellVariants>;\n\n// ─── Header ─────────────────────────────────────────────────────────────────────\n\n/**\n * CVA for the date picker header (headline + supporting text + toggle icon).\n */\nexport const datePickerHeaderVariants = cva(\n [\"px-6\", \"pt-4\", \"pb-3\"], // NOTE: measurement-derived padding; permitted exception\n {\n variants: {\n variant: {\n docked: \"h-[56px] px-3 flex items-center\", // NOTE: measurement-derived (56dp header); permitted exception\n modal: \"h-auto\",\n \"modal-input\": \"h-auto\",\n },\n },\n defaultVariants: {\n variant: \"docked\",\n },\n }\n);\n\nexport type DatePickerHeaderVariants = VariantProps<typeof datePickerHeaderVariants>;\n\n// ─── Navigation ─────────────────────────────────────────────────────────────────\n\n/**\n * CVA for month/year navigation buttons.\n */\nexport const datePickerNavVariants = cva(\n [\"text-on-surface-variant\", \"flex\", \"items-center\", \"gap-1\"],\n {\n variants: {\n state: {\n enabled: \"\",\n hovered: \"bg-on-surface-variant/8\",\n focused: \"bg-on-surface-variant/10\",\n pressed: \"bg-on-surface-variant/10\",\n disabled: \"text-on-surface/38 cursor-not-allowed\",\n },\n },\n defaultVariants: {\n state: \"enabled\",\n },\n }\n);\n\nexport type DatePickerNavVariants = VariantProps<typeof datePickerNavVariants>;\n\n// ─── Year Item ──────────────────────────────────────────────────────────────────\n\n/**\n * CVA for year grid items.\n * MD3 spec: 88dp × 52dp, pill shape when selected.\n */\nexport const yearItemVariants = cva(\n [\n \"w-[88px]\", // NOTE: measurement-derived (88dp); permitted exception\n \"h-[52px]\", // NOTE: measurement-derived (52dp); permitted exception\n \"rounded-full\", // pill shape\n \"flex\",\n \"items-center\",\n \"justify-center\",\n \"text-body-large\",\n \"cursor-pointer\",\n \"transition-colors\",\n \"duration-spring-standard-fast-effects\",\n \"ease-spring-standard-fast-effects\",\n ],\n {\n variants: {\n selected: {\n true: \"bg-primary text-on-primary\",\n false: \"text-on-surface-variant\",\n },\n state: {\n enabled: \"\",\n hovered: \"\",\n focused: \"\",\n pressed: \"\",\n disabled: \"text-on-surface/38 cursor-not-allowed\",\n },\n },\n compoundVariants: [\n {\n selected: false,\n state: \"hovered\",\n className: \"bg-on-surface-variant/8\",\n },\n {\n selected: false,\n state: \"focused\",\n className: \"bg-on-surface-variant/10\",\n },\n {\n selected: true,\n state: \"hovered\",\n className: \"bg-primary/90\",\n },\n {\n selected: true,\n state: \"focused\",\n className: \"bg-primary/90\",\n },\n ],\n defaultVariants: {\n selected: false,\n state: \"enabled\",\n },\n }\n);\n\nexport type YearItemVariants = VariantProps<typeof yearItemVariants>;\n\n// ─── Divider ────────────────────────────────────────────────────────────────────\n\n/**\n * CVA for divider line between header and calendar.\n * MD3 spec: outline-variant, 1dp thickness.\n */\nexport const datePickerDividerVariants = cva([\"border-outline-variant\", \"border-t\", \"w-full\"]);\n\nexport type DatePickerDividerVariants = VariantProps<typeof datePickerDividerVariants>;\n\n// ─── Action Buttons Row ─────────────────────────────────────────────────────────\n\n/**\n * CVA for the action button row (Cancel, OK, Clear).\n * MD3 spec: right-aligned, 48dp height, 12dp horizontal padding.\n */\nexport const datePickerActionVariants = cva([\n \"flex\",\n \"items-center\",\n \"justify-end\",\n \"gap-2\",\n \"px-3\",\n \"py-2\",\n \"h-12\", // NOTE: measurement-derived (48dp action row height); permitted exception\n]);\n\nexport type DatePickerActionVariants = VariantProps<typeof datePickerActionVariants>;\n\n// ─── Action Button Text ─────────────────────────────────────────────────────────\n\n/**\n * CVA for individual action button text styling.\n * MD3 spec: primary color text buttons.\n */\nexport const datePickerActionButtonVariants = cva([\n \"text-primary\",\n \"text-label-large\",\n \"rounded-full\",\n \"px-3\",\n \"py-2\",\n \"transition-colors\",\n \"duration-spring-standard-fast-effects\",\n \"ease-spring-standard-fast-effects\",\n \"hover:bg-primary/8\",\n \"focus-visible:bg-primary/10\",\n \"active:bg-primary/10\",\n]);\n\nexport type DatePickerActionButtonVariants = VariantProps<typeof datePickerActionButtonVariants>;\n\n// ─── Weekday Labels ─────────────────────────────────────────────────────────────\n\n/**\n * CVA for weekday label text (S, M, T, W, T, F, S).\n * MD3 spec: body-small, on-surface color.\n */\nexport const datePickerWeekdayVariants = cva([\n \"text-body-small\",\n \"text-on-surface\",\n \"font-normal\",\n \"w-[48px]\", // NOTE: measurement-derived (48dp column width); permitted exception\n \"h-[48px]\", // NOTE: measurement-derived (48dp row height); permitted exception\n \"text-center\",\n]);\n\nexport type DatePickerWeekdayVariants = VariantProps<typeof datePickerWeekdayVariants>;\n\n// ─── Range Indicator ────────────────────────────────────────────────────────────\n\n/**\n * CVA for range indicator strip between start and end dates.\n * MD3 spec: secondary-container background, 48dp height.\n */\nexport const datePickerRangeIndicatorVariants = cva([\n \"bg-secondary-container\",\n \"h-[48px]\", // NOTE: measurement-derived (48dp range indicator height); permitted exception\n \"rounded-none\",\n]);\n\nexport type DatePickerRangeIndicatorVariants = VariantProps<\n typeof datePickerRangeIndicatorVariants\n>;\n\n// ─── Headline ───────────────────────────────────────────────────────────────────\n\n/**\n * CVA for headline text in modal variants.\n * MD3 spec: headline-small typography, on-surface color.\n */\nexport const datePickerHeadlineVariants = cva([], {\n variants: {\n variant: {\n docked: \"\",\n modal: [\"text-headline-small\", \"text-on-surface\"],\n \"modal-input\": [\"text-headline-small\", \"text-on-surface\"],\n },\n },\n defaultVariants: {\n variant: \"modal\",\n },\n});\n\nexport type DatePickerHeadlineVariants = VariantProps<typeof datePickerHeadlineVariants>;\n\n// ─── Supporting Text ────────────────────────────────────────────────────────────\n\n/**\n * CVA for supporting text below headline.\n * MD3 spec: label-large typography, on-surface-variant color.\n */\nexport const datePickerSupportingTextVariants = cva([\n \"text-label-large\",\n \"text-on-surface-variant\",\n]);\n\nexport type DatePickerSupportingTextVariants = VariantProps<\n typeof datePickerSupportingTextVariants\n>;\n\n// ─── Scrim ──────────────────────────────────────────────────────────────────────\n\n/**\n * CVA for modal scrim overlay.\n * Matches Dialog scrim pattern.\n */\nexport const datePickerScrimVariants = cva([\n \"fixed\",\n \"inset-0\",\n \"z-40\",\n \"bg-scrim\",\n \"opacity-32\",\n \"transition-opacity\",\n \"duration-medium2\",\n \"ease-standard\",\n]);\n\nexport type DatePickerScrimVariants = VariantProps<typeof datePickerScrimVariants>;\n","\"use client\";\n\nimport { forwardRef } from \"react\";\n\nimport { useReducedMotion } from \"../../hooks/useReducedMotion\";\nimport { cn } from \"../../utils/cn\";\nimport { DatePickerDocked } from \"./DatePickerDocked\";\nimport { datePickerContainerVariants } from \"./DatePicker.variants\";\n\nimport type { DatePickerDockedProps } from \"./DatePicker.types\";\n\n/**\n * Tailwind descendant selectors for styling headless calendar elements.\n * Applied to the container that wraps CalendarCore.\n * Each selector targets internal sub-components by their DOM structure and data attributes.\n */\nconst CALENDAR_STYLES = [\n // ── Label ─────────────────────────────────────────────────────────────────\n \"[&_[data-label]]:text-body-small\",\n \"[&_[data-label]]:text-on-surface-variant\",\n \"[&_[data-label]]:mb-1\",\n \"[&_[data-label]]:block\",\n\n // ── Field group (outlined text field container) ───────────────────────────\n \"[&_[data-field-group]]:flex\",\n \"[&_[data-field-group]]:items-center\",\n \"[&_[data-field-group]]:border\",\n \"[&_[data-field-group]]:border-outline\",\n \"[&_[data-field-group]]:rounded\",\n \"[&_[data-field-group]]:h-14\",\n \"[&_[data-field-group]]:px-3\",\n \"[&_[data-field-group]]:gap-2\",\n \"[&_[data-field-group]]:bg-transparent\",\n \"[&_[data-field-group]:focus-within]:border-primary\",\n \"[&_[data-field-group]:focus-within]:border-2\",\n\n // ── Date field segments (inline rendering) ────────────────────────────────\n \"[&_[data-field]]:flex\",\n \"[&_[data-field]]:items-center\",\n \"[&_[data-field]]:flex-1\",\n \"[&_[data-field]]:text-body-large\",\n \"[&_[data-field]]:text-on-surface\",\n \"[&_[data-segment]]:outline-none\",\n \"[&_[data-segment][data-placeholder]]:text-on-surface-variant\",\n\n // ── Trigger button (calendar icon) ────────────────────────────────────────\n \"[&_[data-trigger]]:flex\",\n \"[&_[data-trigger]]:items-center\",\n \"[&_[data-trigger]]:justify-center\",\n \"[&_[data-trigger]]:w-10\",\n \"[&_[data-trigger]]:h-10\",\n \"[&_[data-trigger]]:rounded-full\",\n \"[&_[data-trigger]]:text-on-surface-variant\",\n \"[&_[data-trigger]]:transition-colors\",\n \"[&_[data-trigger]]:duration-spring-standard-fast-effects\",\n \"[&_[data-trigger]]:ease-spring-standard-fast-effects\",\n \"[&_[data-trigger]:hover]:bg-on-surface/8\",\n\n // ── Popover ───────────────────────────────────────────────────────────────\n \"[&_[data-popover]]:bg-surface-container-high\",\n \"[&_[data-popover]]:rounded-3xl\",\n \"[&_[data-popover]]:mt-1\",\n \"[&_[data-popover]]:shadow-elevation-2\",\n \"[&_[data-popover]]:overflow-hidden\",\n \"[&_[data-popover]]:z-50\",\n\n // ── Calendar header ───────────────────────────────────────────────────────\n \"[&_[data-calendar-header]]:flex\",\n \"[&_[data-calendar-header]]:items-center\",\n \"[&_[data-calendar-header]]:justify-between\",\n \"[&_[data-calendar-header]]:px-3\",\n \"[&_[data-calendar-header]]:py-2\",\n\n // ── Calendar title (month/year label) ─────────────────────────────────────\n \"[&_[data-calendar-title]]:flex\",\n \"[&_[data-calendar-title]]:items-center\",\n \"[&_[data-calendar-title]]:gap-0.5\",\n \"[&_[data-calendar-title]]:bg-transparent\",\n \"[&_[data-calendar-title]]:border-none\",\n \"[&_[data-calendar-title]]:cursor-pointer\",\n \"[&_[data-calendar-title]]:rounded-full\",\n \"[&_[data-calendar-title]]:px-2\",\n \"[&_[data-calendar-title]]:py-1\",\n \"[&_[data-calendar-title]]:transition-colors\",\n \"[&_[data-calendar-title]]:duration-spring-standard-fast-effects\",\n \"[&_[data-calendar-title]]:ease-spring-standard-fast-effects\",\n \"[&_[data-calendar-title]:hover]:bg-on-surface/8\",\n \"[&_[data-calendar-title]_h2]:text-label-large\",\n \"[&_[data-calendar-title]_h2]:text-on-surface-variant\",\n \"[&_[data-calendar-title]_h2]:m-0\",\n \"[&_[data-calendar-title]_svg]:text-on-surface-variant\",\n\n // ── Calendar navigation buttons ───────────────────────────────────────────\n \"[&_[data-calendar-nav]]:flex\",\n \"[&_[data-calendar-nav]]:items-center\",\n \"[&_[data-calendar-nav]]:gap-1\",\n \"[&_[data-nav-button]]:w-10\",\n \"[&_[data-nav-button]]:h-10\",\n \"[&_[data-nav-button]]:rounded-full\",\n \"[&_[data-nav-button]]:flex\",\n \"[&_[data-nav-button]]:items-center\",\n \"[&_[data-nav-button]]:justify-center\",\n \"[&_[data-nav-button]]:text-on-surface-variant\",\n \"[&_[data-nav-button]]:bg-transparent\",\n \"[&_[data-nav-button]]:border-none\",\n \"[&_[data-nav-button]]:transition-colors\",\n \"[&_[data-nav-button]]:duration-spring-standard-fast-effects\",\n \"[&_[data-nav-button]]:ease-spring-standard-fast-effects\",\n \"[&_[data-nav-button]:hover]:bg-on-surface/8\",\n \"[&_[data-nav-button]:focus-visible]:bg-on-surface/10\",\n \"[&_[data-nav-button]:disabled]:text-on-surface/38\",\n \"[&_[data-nav-button]:disabled]:cursor-not-allowed\",\n\n // ── Cell base ─────────────────────────────────────────────────────────────\n \"[&_td>div]:w-[48px]\",\n \"[&_td>div]:h-[48px]\",\n \"[&_td>div]:rounded-full\",\n \"[&_td>div]:flex\",\n \"[&_td>div]:items-center\",\n \"[&_td>div]:justify-center\",\n \"[&_td>div]:text-body-large\",\n \"[&_td>div]:text-on-surface\",\n \"[&_td>div]:relative\",\n \"[&_td>div]:cursor-pointer\",\n \"[&_td>div]:select-none\",\n \"[&_td>div]:transition-colors\",\n \"[&_td>div]:duration-spring-standard-fast-effects\",\n \"[&_td>div]:ease-spring-standard-fast-effects\",\n\n // ── Today (not selected) ──────────────────────────────────────────────────\n \"[&_td>div[data-today]:not([data-selected])]:text-primary\",\n \"[&_td>div[data-today]:not([data-selected])]:border\",\n \"[&_td>div[data-today]:not([data-selected])]:border-primary\",\n\n // ── Selected ──────────────────────────────────────────────────────────────\n \"[&_td>div[data-selected]]:bg-primary\",\n \"[&_td>div[data-selected]]:text-on-primary\",\n\n // ── Range middle ──────────────────────────────────────────────────────────\n \"[&_td>div[data-range-middle]]:bg-secondary-container\",\n \"[&_td>div[data-range-middle]]:text-on-secondary-container\",\n \"[&_td>div[data-range-middle]]:rounded-none\",\n\n // ── Outside month ─────────────────────────────────────────────────────────\n \"[&_td>div[data-outside-month]:not([data-selected])]:text-on-surface-variant\",\n\n // ── Disabled ──────────────────────────────────────────────────────────────\n \"[&_td>div[data-disabled]]:text-on-surface/38\",\n \"[&_td>div[data-disabled]]:cursor-not-allowed\",\n\n // ── Cell hover states ─────────────────────────────────────────────────────\n \"[&_td>div:not([data-selected]):not([data-today]):not([data-disabled]):hover]:bg-on-surface/8\",\n \"[&_td>div[data-today]:not([data-selected]):hover]:bg-primary/8\",\n \"[&_td>div[data-selected]:hover]:shadow-sm\",\n\n // ── Cell focus-visible states ─────────────────────────────────────────────\n \"[&_td>div[data-focus-visible]:not([data-selected]):not([data-today])]:ring-2\",\n \"[&_td>div[data-focus-visible]:not([data-selected]):not([data-today])]:ring-on-surface\",\n \"[&_td>div[data-focus-visible]:not([data-selected]):not([data-today])]:bg-on-surface/10\",\n \"[&_td>div[data-today][data-focus-visible]:not([data-selected])]:bg-primary/10\",\n\n // ── Weekday labels ────────────────────────────────────────────────────────\n \"[&_th]:text-body-small\",\n \"[&_th]:text-on-surface\",\n \"[&_th]:font-normal\",\n \"[&_th]:w-[48px]\",\n \"[&_th]:h-[48px]\",\n\n // ── Year grid ─────────────────────────────────────────────────────────────\n \"[&_[data-year-grid]]:grid\",\n \"[&_[data-year-grid]]:grid-cols-3\",\n \"[&_[data-year-grid]]:gap-2\",\n \"[&_[data-year-grid]]:px-3\",\n \"[&_[data-year-grid]]:py-2\",\n \"[&_[data-year-grid]]:max-h-[280px]\",\n \"[&_[data-year-grid]]:overflow-y-auto\",\n \"[&_[data-year-grid]]:place-items-center\",\n\n \"[&_[data-year-item]]:w-[88px]\",\n \"[&_[data-year-item]]:h-[52px]\",\n \"[&_[data-year-item]]:rounded-full\",\n \"[&_[data-year-item]]:flex\",\n \"[&_[data-year-item]]:items-center\",\n \"[&_[data-year-item]]:justify-center\",\n \"[&_[data-year-item]]:text-body-large\",\n \"[&_[data-year-item]]:text-on-surface-variant\",\n \"[&_[data-year-item]]:bg-transparent\",\n \"[&_[data-year-item]]:border-none\",\n \"[&_[data-year-item]]:cursor-pointer\",\n \"[&_[data-year-item]]:transition-colors\",\n \"[&_[data-year-item]]:duration-spring-standard-fast-effects\",\n \"[&_[data-year-item]]:ease-spring-standard-fast-effects\",\n \"[&_[data-year-item]:hover]:bg-on-surface/8\",\n \"[&_[data-year-item][data-selected]]:bg-primary\",\n \"[&_[data-year-item][data-selected]]:text-on-primary\",\n\n // ── Divider ───────────────────────────────────────────────────────────────\n \"[&_hr[data-divider]]:border-outline-variant\",\n\n // ── Action buttons ────────────────────────────────────────────────────────\n \"[&_[data-actions]]:flex\",\n \"[&_[data-actions]]:items-center\",\n \"[&_[data-actions]]:justify-end\",\n \"[&_[data-actions]]:gap-2\",\n \"[&_[data-actions]]:px-3\",\n \"[&_[data-actions]]:py-2\",\n \"[&_[data-action]]:text-primary\",\n \"[&_[data-action]]:text-label-large\",\n \"[&_[data-action]]:rounded-full\",\n \"[&_[data-action]]:px-3\",\n \"[&_[data-action]]:py-2\",\n \"[&_[data-action]]:min-h-12\",\n \"[&_[data-action]]:bg-transparent\",\n \"[&_[data-action]]:border-none\",\n \"[&_[data-action]]:transition-colors\",\n \"[&_[data-action]]:duration-spring-standard-fast-effects\",\n \"[&_[data-action]]:ease-spring-standard-fast-effects\",\n \"[&_[data-action]:hover]:bg-primary/8\",\n \"[&_[data-action]:focus-visible]:ring-2\",\n \"[&_[data-action]:focus-visible]:ring-primary\",\n \"[&_[data-action]:focus-visible]:bg-primary/10\",\n].join(\" \");\n\n/**\n * Motion-specific descendant selectors for the docked date picker.\n * Applied conditionally — omitted when `prefers-reduced-motion: reduce` is active.\n *\n * Uses legacy MD3 motion tokens for screen-level container transitions\n * and emphasized easing for calendar month navigation (shared-axis motion).\n */\nexport const DOCKED_MOTION_STYLES = [\n // ── Popover container enter ────────────────────────────────────────────────\n \"[&_[data-popover]]:transition-[transform,opacity]\",\n \"[&_[data-popover]]:duration-short3\",\n \"[&_[data-popover]]:ease-standard-decelerate\",\n\n // ── Popover container exit ─────────────────────────────────────────────────\n \"[&_[data-popover][data-exiting]]:duration-short2\",\n \"[&_[data-popover][data-exiting]]:ease-standard-accelerate\",\n\n // ── Calendar month slide ───────────────────────────────────────────────────\n \"[&_table]:transition-transform\",\n \"[&_table]:duration-medium1\",\n \"[&_table]:ease-emphasized-decelerate\",\n\n // ── Cell selection animation (scale + background) ──────────────────────────\n \"[&_td>div[data-selected]]:transition-[background-color,transform]\",\n \"[&_td>div[data-selected]]:duration-short2\",\n \"[&_td>div[data-selected]]:ease-standard\",\n\n // ── State layer opacity ────────────────────────────────────────────────────\n \"[&_td>div::after]:transition-opacity\",\n \"[&_td>div::after]:duration-short1\",\n \"[&_td>div::after]:ease-standard\",\n].join(\" \");\n\n/**\n * Styled DatePickerDocked (Layer 3)\n *\n * Wraps the headless `DatePickerDocked` with MD3 visual styling via CVA variants.\n * Applies container, calendar cell, weekday, navigation, and action button tokens.\n *\n * @internal\n */\nexport const DatePickerDockedStyled = forwardRef<HTMLDivElement, DatePickerDockedProps>(\n (props, ref) => {\n const { className, ...rest } = props;\n const reducedMotion = useReducedMotion();\n\n return (\n <DatePickerDocked\n ref={ref}\n {...rest}\n className={cn(\n datePickerContainerVariants({ variant: \"docked\" }),\n CALENDAR_STYLES,\n !reducedMotion && DOCKED_MOTION_STYLES,\n className\n )}\n />\n );\n }\n);\n\nDatePickerDockedStyled.displayName = \"DatePickerDockedStyled\";\n","\"use client\";\n\nimport { useRef } from \"react\";\nimport { useButton } from \"react-aria\";\n\nimport type { DatePickerModalHeaderProps } from \"./DatePicker.types\";\n\n/**\n * Pencil/edit SVG icon for switching to keyboard input.\n * @internal\n */\nfunction EditIcon(): JSX.Element {\n return (\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M3 17.25V21h3.75L17.81 9.94l-3.75-3.75L3 17.25zM20.71 7.04c.39-.39.39-1.02 0-1.41l-2.34-2.34c-.39-.39-1.02-.39-1.41 0l-1.83 1.83 3.75 3.75 1.83-1.83z\" />\n </svg>\n );\n}\n\n/**\n * Calendar SVG icon for switching to calendar view.\n * @internal\n */\nfunction CalendarIcon(): JSX.Element {\n return (\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M19 3h-1V1h-2v2H8V1H6v2H5c-1.11 0-1.99.9-1.99 2L3 19c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 16H5V8h14v11zM9 10H7v2h2v-2zm4 0h-2v2h2v-2zm4 0h-2v2h2v-2z\" />\n </svg>\n );\n}\n\n/**\n * Headless DatePickerModalHeader (Layer 2)\n *\n * Renders the header section of a modal date picker:\n * - Headline text (\"Select date\" / \"Select dates\")\n * - Supporting text (formatted selected date, e.g., \"Mon, Aug 17\")\n * - Mode toggle icon button (calendar <-> keyboard)\n *\n * This is a headless component — it provides behavior, ARIA semantics, and\n * data attributes only. No styling classes are applied.\n *\n * @internal\n */\nexport function DatePickerModalHeader({\n headline = \"Select date\",\n supportingText,\n inputMode = \"calendar\",\n onModeToggle,\n headlineId,\n className,\n}: DatePickerModalHeaderProps): JSX.Element {\n const toggleRef = useRef<HTMLButtonElement>(null);\n\n const toggleAriaLabel =\n inputMode === \"calendar\" ? \"Switch to keyboard input\" : \"Switch to calendar\";\n\n const { buttonProps: toggleButtonProps } = useButton(\n {\n \"aria-label\": toggleAriaLabel,\n ...(onModeToggle ? { onPress: onModeToggle } : {}),\n },\n toggleRef\n );\n\n return (\n <div className={className} data-modal-header>\n <div data-header-text>\n <p data-headline id={headlineId}>\n {headline}\n </p>\n {supportingText && <p data-supporting-text>{supportingText}</p>}\n </div>\n <button\n {...toggleButtonProps}\n ref={toggleRef}\n type=\"button\"\n data-mode-toggle\n data-input-mode={inputMode}\n >\n {inputMode === \"calendar\" ? <EditIcon /> : <CalendarIcon />}\n </button>\n </div>\n );\n}\n\nDatePickerModalHeader.displayName = \"DatePickerModalHeader\";\n","\"use client\";\n\nimport { forwardRef, useCallback, useEffect, useId, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { useOverlay, usePreventScroll, FocusScope, useDialog } from \"react-aria\";\nimport { useOverlayTriggerState } from \"react-stately\";\n\nimport { CalendarCore } from \"./CalendarCore\";\nimport { DatePickerModalHeader } from \"./DatePickerModalHeader\";\nimport { DatePickerActions } from \"./DatePickerActions\";\n\nimport type { DateValue } from \"@internationalized/date\";\nimport type { DatePickerModalProps } from \"./DatePicker.types\";\n\n/**\n * Headless DatePickerModal (Layer 2)\n *\n * Full-overlay modal dialog for date selection, supporting both single-date\n * and date-range modes. Follows the MD3 Modal Date Picker specification.\n *\n * Features:\n * - Portal rendering for proper z-index stacking\n * - Focus trapping within the dialog\n * - Escape key and scrim click to dismiss\n * - `role=\"dialog\"` with `aria-modal=\"true\"` and `aria-labelledby`\n * - Header with headline, supporting text, and mode toggle\n * - CalendarCore for single date selection\n * - RangeCalendar for date range selection\n * - Action buttons (Clear, Cancel, OK)\n *\n * This is a headless component — it provides behavior, ARIA semantics, and\n * data attributes only. No styling classes are applied.\n *\n * @example\n * ```tsx\n * <DatePickerModal\n * isOpen={open}\n * onOpenChange={setOpen}\n * onChange={(date) => console.log(date)}\n * />\n *\n * <DatePickerModal\n * selectionMode=\"range\"\n * isOpen={open}\n * onOpenChange={setOpen}\n * onRangeChange={(range) => console.log(range)}\n * />\n * ```\n */\nexport const DatePickerModal = forwardRef<HTMLDivElement, DatePickerModalProps>(\n (props, forwardedRef) => {\n const {\n selectionMode = \"single\",\n value,\n defaultValue,\n rangeValue,\n defaultRangeValue,\n onChange,\n onRangeChange,\n minValue,\n maxValue,\n isDateUnavailable,\n isOpen,\n defaultOpen = false,\n onOpenChange,\n headline,\n supportingText,\n cancelLabel = \"Cancel\",\n confirmLabel = \"OK\",\n clearLabel = \"Clear\",\n showClear = true,\n onCancel,\n onConfirm,\n onClear,\n className,\n } = props;\n\n const internalRef = useRef<HTMLDivElement>(null);\n const ref = (forwardedRef ?? internalRef) as React.RefObject<HTMLDivElement>;\n const dialogRef = useRef<HTMLDivElement>(null);\n\n const headlineId = useId();\n const defaultHeadline = selectionMode === \"range\" ? \"Select dates\" : \"Select date\";\n const resolvedHeadline = headline ?? defaultHeadline;\n\n // ── Open/close state ─────────────────────────────────────────────────────\n\n const state = useOverlayTriggerState({\n ...(isOpen !== undefined ? { isOpen } : {}),\n defaultOpen,\n ...(onOpenChange ? { onOpenChange } : {}),\n });\n\n // ── Internal selection state ─────────────────────────────────────────────\n\n const [internalValue, setInternalValue] = useState<DateValue | null>(\n value ?? defaultValue ?? null\n );\n const [internalRangeValue, setInternalRangeValue] = useState<{\n start: DateValue;\n end: DateValue;\n } | null>(rangeValue ?? defaultRangeValue ?? null);\n\n const [inputMode, setInputMode] = useState<\"calendar\" | \"keyboard\">(\"calendar\");\n\n // Sync controlled value\n useEffect(() => {\n if (value !== undefined) {\n setInternalValue(value);\n }\n }, [value]);\n\n useEffect(() => {\n if (rangeValue !== undefined) {\n setInternalRangeValue(rangeValue);\n }\n }, [rangeValue]);\n\n // Store value at time of open for cancel/revert\n const valueOnOpenRef = useRef<DateValue | null>(null);\n const rangeOnOpenRef = useRef<{ start: DateValue; end: DateValue } | null>(null);\n\n useEffect(() => {\n if (state.isOpen) {\n valueOnOpenRef.current = internalValue;\n rangeOnOpenRef.current = internalRangeValue;\n }\n }, [state.isOpen]); // eslint-disable-line react-hooks/exhaustive-deps\n\n // ── Handlers ─────────────────────────────────────────────────────────────\n\n const handleSingleChange = useCallback((newValue: DateValue) => {\n setInternalValue(newValue);\n }, []);\n\n const handleRangeChange = useCallback((newRange: { start: DateValue; end: DateValue }) => {\n setInternalRangeValue(newRange);\n }, []);\n\n const handleConfirm = useCallback(() => {\n if (selectionMode === \"single\") {\n onChange?.(internalValue);\n onConfirm?.(internalValue);\n } else {\n onRangeChange?.(internalRangeValue);\n onConfirm?.(internalRangeValue);\n }\n state.close();\n }, [\n selectionMode,\n internalValue,\n internalRangeValue,\n onChange,\n onRangeChange,\n onConfirm,\n state,\n ]);\n\n const handleCancel = useCallback(() => {\n setInternalValue(valueOnOpenRef.current);\n setInternalRangeValue(rangeOnOpenRef.current);\n onCancel?.();\n state.close();\n }, [onCancel, state]);\n\n const handleClear = useCallback(() => {\n setInternalValue(null);\n setInternalRangeValue(null);\n onClear?.();\n }, [onClear]);\n\n const handleModeToggle = useCallback(() => {\n setInputMode((prev) => (prev === \"calendar\" ? \"keyboard\" : \"calendar\"));\n }, []);\n\n const handleClose = useCallback(() => {\n handleCancel();\n }, [handleCancel]);\n\n // ── Format supporting text ───────────────────────────────────────────────\n\n const resolvedSupportingText = (() => {\n if (supportingText !== undefined) return supportingText;\n if (selectionMode === \"single\" && internalValue) {\n const date = internalValue;\n const formatter = new Intl.DateTimeFormat(\"en-US\", {\n weekday: \"short\",\n month: \"short\",\n day: \"numeric\",\n });\n return formatter.format(new Date(date.year, date.month - 1, date.day));\n }\n if (selectionMode === \"range\" && internalRangeValue) {\n const formatter = new Intl.DateTimeFormat(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n });\n const start = formatter.format(\n new Date(\n internalRangeValue.start.year,\n internalRangeValue.start.month - 1,\n internalRangeValue.start.day\n )\n );\n const end = formatter.format(\n new Date(\n internalRangeValue.end.year,\n internalRangeValue.end.month - 1,\n internalRangeValue.end.day\n )\n );\n return `${start} – ${end}`;\n }\n return undefined;\n })();\n\n // ── Portal gate ──────────────────────────────────────────────────────────\n\n if (!state.isOpen) {\n return null;\n }\n\n if (typeof document === \"undefined\") {\n return null;\n }\n\n // ── Render ───────────────────────────────────────────────────────────────\n\n const content = (\n <FocusScope contain restoreFocus autoFocus>\n <ModalOverlay\n dialogRef={dialogRef}\n headlineId={headlineId}\n onClose={handleClose}\n {...(className ? { className } : {})}\n isOpen={state.isOpen}\n >\n <DatePickerModalHeader\n headline={resolvedHeadline}\n {...(resolvedSupportingText ? { supportingText: resolvedSupportingText } : {})}\n inputMode={inputMode}\n onModeToggle={handleModeToggle}\n headlineId={headlineId}\n />\n <hr data-divider />\n {selectionMode === \"single\" ? (\n <CalendarCore\n aria-label=\"Calendar\"\n value={internalValue}\n onChange={handleSingleChange}\n {...(minValue ? { minValue } : {})}\n {...(maxValue ? { maxValue } : {})}\n {...(isDateUnavailable ? { isDateUnavailable } : {})}\n />\n ) : (\n <CalendarCore\n aria-label=\"Range calendar\"\n selectionMode=\"range\"\n {...(internalRangeValue ? { rangeValue: internalRangeValue } : {})}\n {...(internalRangeValue ? { defaultRangeValue: internalRangeValue } : {})}\n onRangeChange={handleRangeChange}\n {...(minValue ? { minValue } : {})}\n {...(maxValue ? { maxValue } : {})}\n {...(isDateUnavailable ? { isDateUnavailable } : {})}\n />\n )}\n <DatePickerActions\n cancelLabel={cancelLabel}\n confirmLabel={confirmLabel}\n clearLabel={clearLabel}\n showClear={showClear}\n onCancel={handleCancel}\n onConfirm={handleConfirm}\n onClear={handleClear}\n />\n </ModalOverlay>\n </FocusScope>\n );\n\n return createPortal(\n <div ref={ref} data-variant=\"modal\" data-selection-mode={selectionMode} data-open>\n {content}\n </div>,\n document.body\n ) as React.ReactElement;\n }\n);\n\nDatePickerModal.displayName = \"DatePickerModal\";\n\n// ─── Internal ModalOverlay ───────────────────────────────────────────────────\n\ninterface ModalOverlayProps {\n dialogRef: React.RefObject<HTMLDivElement>;\n headlineId: string;\n onClose: () => void;\n className?: string;\n isOpen: boolean;\n children: React.ReactNode;\n}\n\n/**\n * Internal modal overlay that wires useDialog, useOverlay, usePreventScroll.\n * Renders scrim + dialog panel with proper ARIA attributes.\n * @internal\n */\nfunction ModalOverlay({\n dialogRef,\n headlineId,\n onClose,\n className,\n isOpen,\n children,\n}: ModalOverlayProps): JSX.Element {\n usePreventScroll();\n\n const { dialogProps } = useDialog(\n {\n \"aria-labelledby\": headlineId,\n },\n dialogRef\n );\n\n const { overlayProps } = useOverlay(\n {\n isOpen,\n onClose,\n isDismissable: true,\n shouldCloseOnBlur: false,\n },\n dialogRef\n );\n\n return (\n <>\n <div data-scrim aria-hidden=\"true\" onClick={onClose} />\n <div\n {...overlayProps}\n {...dialogProps}\n ref={dialogRef}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={headlineId}\n className={className}\n data-modal-dialog\n >\n {children}\n </div>\n </>\n );\n}\n\nModalOverlay.displayName = \"ModalOverlay\";\n","\"use client\";\n\nimport { forwardRef } from \"react\";\n\nimport { useReducedMotion } from \"../../hooks/useReducedMotion\";\nimport { cn } from \"../../utils/cn\";\nimport { DatePickerModal } from \"./DatePickerModal\";\nimport { datePickerContainerVariants } from \"./DatePicker.variants\";\n\nimport type { DatePickerModalProps } from \"./DatePicker.types\";\n\n/**\n * Tailwind descendant selectors for styling the modal date picker's internal elements.\n */\nconst MODAL_STYLES = [\n // ── Container structure ───────────────────────────────────────────────────\n \"[&_[data-modal-dialog]]:bg-surface-container-high\",\n \"[&_[data-modal-dialog]]:rounded-3xl\",\n \"[&_[data-modal-dialog]]:overflow-hidden\",\n \"[&_[data-modal-dialog]]:fixed\",\n \"[&_[data-modal-dialog]]:top-1/2\",\n \"[&_[data-modal-dialog]]:left-1/2\",\n \"[&_[data-modal-dialog]]:-translate-x-1/2\",\n \"[&_[data-modal-dialog]]:-translate-y-1/2\",\n \"[&_[data-modal-dialog]]:z-50\",\n \"[&_[data-modal-dialog]]:w-[360px]\",\n \"[&_[data-modal-dialog]]:max-h-[90vh]\",\n \"[&_[data-modal-dialog]]:overflow-y-auto\",\n\n // ── Header ────────────────────────────────────────────────────────────────\n \"[&_[data-modal-header]]:px-6\",\n \"[&_[data-modal-header]]:pt-4\",\n \"[&_[data-modal-header]]:pb-3\",\n \"[&_[data-modal-header]]:flex\",\n \"[&_[data-modal-header]]:items-start\",\n \"[&_[data-modal-header]]:justify-between\",\n\n \"[&_[data-headline]]:text-label-large\",\n \"[&_[data-headline]]:text-on-surface-variant\",\n \"[&_[data-headline]]:m-0\",\n\n \"[&_[data-supporting-text]]:text-headline-large\",\n \"[&_[data-supporting-text]]:text-on-surface\",\n \"[&_[data-supporting-text]]:mt-9\",\n \"[&_[data-supporting-text]]:m-0\",\n\n \"[&_[data-mode-toggle]]:w-12\",\n \"[&_[data-mode-toggle]]:h-12\",\n \"[&_[data-mode-toggle]]:rounded-full\",\n \"[&_[data-mode-toggle]]:flex\",\n \"[&_[data-mode-toggle]]:items-center\",\n \"[&_[data-mode-toggle]]:justify-center\",\n \"[&_[data-mode-toggle]]:text-on-surface-variant\",\n \"[&_[data-mode-toggle]]:bg-transparent\",\n \"[&_[data-mode-toggle]]:border-none\",\n \"[&_[data-mode-toggle]]:self-end\",\n \"[&_[data-mode-toggle]]:transition-colors\",\n \"[&_[data-mode-toggle]]:duration-spring-standard-fast-effects\",\n \"[&_[data-mode-toggle]]:ease-spring-standard-fast-effects\",\n \"[&_[data-mode-toggle]:hover]:bg-on-surface-variant/8\",\n\n // ── Divider ───────────────────────────────────────────────────────────────\n \"[&_hr[data-divider]]:border-outline-variant\",\n\n // ── Calendar header ───────────────────────────────────────────────────────\n \"[&_[data-calendar-header]]:flex\",\n \"[&_[data-calendar-header]]:items-center\",\n \"[&_[data-calendar-header]]:justify-between\",\n \"[&_[data-calendar-header]]:px-3\",\n \"[&_[data-calendar-header]]:py-2\",\n\n \"[&_[data-calendar-title]]:flex\",\n \"[&_[data-calendar-title]]:items-center\",\n \"[&_[data-calendar-title]]:gap-0.5\",\n \"[&_[data-calendar-title]]:bg-transparent\",\n \"[&_[data-calendar-title]]:border-none\",\n \"[&_[data-calendar-title]]:cursor-pointer\",\n \"[&_[data-calendar-title]]:rounded-full\",\n \"[&_[data-calendar-title]]:px-2\",\n \"[&_[data-calendar-title]]:py-1\",\n \"[&_[data-calendar-title]]:transition-colors\",\n \"[&_[data-calendar-title]]:duration-spring-standard-fast-effects\",\n \"[&_[data-calendar-title]]:ease-spring-standard-fast-effects\",\n \"[&_[data-calendar-title]:hover]:bg-on-surface/8\",\n \"[&_[data-calendar-title]_h2]:text-label-large\",\n \"[&_[data-calendar-title]_h2]:text-on-surface-variant\",\n \"[&_[data-calendar-title]_h2]:m-0\",\n \"[&_[data-calendar-title]_svg]:text-on-surface-variant\",\n\n \"[&_[data-calendar-nav]]:flex\",\n \"[&_[data-calendar-nav]]:items-center\",\n \"[&_[data-calendar-nav]]:gap-1\",\n \"[&_[data-nav-button]]:w-10\",\n \"[&_[data-nav-button]]:h-10\",\n \"[&_[data-nav-button]]:rounded-full\",\n \"[&_[data-nav-button]]:flex\",\n \"[&_[data-nav-button]]:items-center\",\n \"[&_[data-nav-button]]:justify-center\",\n \"[&_[data-nav-button]]:text-on-surface-variant\",\n \"[&_[data-nav-button]]:bg-transparent\",\n \"[&_[data-nav-button]]:border-none\",\n \"[&_[data-nav-button]]:transition-colors\",\n \"[&_[data-nav-button]]:duration-spring-standard-fast-effects\",\n \"[&_[data-nav-button]]:ease-spring-standard-fast-effects\",\n \"[&_[data-nav-button]:hover]:bg-on-surface/8\",\n \"[&_[data-nav-button]:focus-visible]:bg-on-surface/10\",\n \"[&_[data-nav-button]:disabled]:text-on-surface/38\",\n \"[&_[data-nav-button]:disabled]:cursor-not-allowed\",\n\n // ── Calendar cells ────────────────────────────────────────────────────────\n \"[&_td>div]:w-[48px]\",\n \"[&_td>div]:h-[48px]\",\n \"[&_td>div]:rounded-full\",\n \"[&_td>div]:flex\",\n \"[&_td>div]:items-center\",\n \"[&_td>div]:justify-center\",\n \"[&_td>div]:text-body-large\",\n \"[&_td>div]:text-on-surface\",\n \"[&_td>div]:relative\",\n \"[&_td>div]:cursor-pointer\",\n \"[&_td>div]:select-none\",\n \"[&_td>div]:transition-colors\",\n \"[&_td>div]:duration-spring-standard-fast-effects\",\n \"[&_td>div]:ease-spring-standard-fast-effects\",\n\n \"[&_td>div[data-today]:not([data-selected])]:text-primary\",\n \"[&_td>div[data-today]:not([data-selected])]:border\",\n \"[&_td>div[data-today]:not([data-selected])]:border-primary\",\n \"[&_td>div[data-selected]]:bg-primary\",\n \"[&_td>div[data-selected]]:text-on-primary\",\n \"[&_td>div[data-range-middle]]:bg-secondary-container\",\n \"[&_td>div[data-range-middle]]:text-on-secondary-container\",\n \"[&_td>div[data-range-middle]]:rounded-none\",\n \"[&_td>div[data-outside-month]:not([data-selected])]:text-on-surface-variant\",\n \"[&_td>div[data-disabled]]:text-on-surface/38\",\n \"[&_td>div[data-disabled]]:cursor-not-allowed\",\n\n \"[&_td>div:not([data-selected]):not([data-today]):not([data-disabled]):hover]:bg-on-surface/8\",\n \"[&_td>div[data-today]:not([data-selected]):hover]:bg-primary/8\",\n \"[&_td>div[data-selected]:hover]:shadow-sm\",\n\n \"[&_td>div[data-focus-visible]:not([data-selected]):not([data-today])]:ring-2\",\n \"[&_td>div[data-focus-visible]:not([data-selected]):not([data-today])]:ring-on-surface\",\n \"[&_td>div[data-focus-visible]:not([data-selected]):not([data-today])]:bg-on-surface/10\",\n \"[&_td>div[data-today][data-focus-visible]:not([data-selected])]:bg-primary/10\",\n\n // ── Weekday labels ────────────────────────────────────────────────────────\n \"[&_th]:text-body-small\",\n \"[&_th]:text-on-surface\",\n \"[&_th]:font-normal\",\n \"[&_th]:w-[48px]\",\n \"[&_th]:h-[48px]\",\n\n // ── Year grid ─────────────────────────────────────────────────────────────\n \"[&_[data-year-grid]]:grid\",\n \"[&_[data-year-grid]]:grid-cols-3\",\n \"[&_[data-year-grid]]:gap-2\",\n \"[&_[data-year-grid]]:px-3\",\n \"[&_[data-year-grid]]:py-2\",\n \"[&_[data-year-grid]]:max-h-[280px]\",\n \"[&_[data-year-grid]]:overflow-y-auto\",\n \"[&_[data-year-grid]]:place-items-center\",\n\n \"[&_[data-year-item]]:w-[88px]\",\n \"[&_[data-year-item]]:h-[52px]\",\n \"[&_[data-year-item]]:rounded-full\",\n \"[&_[data-year-item]]:flex\",\n \"[&_[data-year-item]]:items-center\",\n \"[&_[data-year-item]]:justify-center\",\n \"[&_[data-year-item]]:text-body-large\",\n \"[&_[data-year-item]]:text-on-surface-variant\",\n \"[&_[data-year-item]]:bg-transparent\",\n \"[&_[data-year-item]]:border-none\",\n \"[&_[data-year-item]]:cursor-pointer\",\n \"[&_[data-year-item]]:transition-colors\",\n \"[&_[data-year-item]]:duration-spring-standard-fast-effects\",\n \"[&_[data-year-item]]:ease-spring-standard-fast-effects\",\n \"[&_[data-year-item]:hover]:bg-on-surface/8\",\n \"[&_[data-year-item][data-selected]]:bg-primary\",\n \"[&_[data-year-item][data-selected]]:text-on-primary\",\n\n // ── Scrim ─────────────────────────────────────────────────────────────────\n \"[&_[data-scrim]]:fixed\",\n \"[&_[data-scrim]]:inset-0\",\n \"[&_[data-scrim]]:z-40\",\n \"[&_[data-scrim]]:bg-scrim\",\n \"[&_[data-scrim]]:opacity-32\",\n \"[&_[data-scrim]]:transition-opacity\",\n \"[&_[data-scrim]]:duration-medium2\",\n \"[&_[data-scrim]]:ease-standard\",\n\n // ── Action buttons ────────────────────────────────────────────────────────\n \"[&_[data-actions]]:flex\",\n \"[&_[data-actions]]:items-center\",\n \"[&_[data-actions]]:justify-end\",\n \"[&_[data-actions]]:gap-2\",\n \"[&_[data-actions]]:px-3\",\n \"[&_[data-actions]]:py-2\",\n \"[&_[data-action]]:text-primary\",\n \"[&_[data-action]]:text-label-large\",\n \"[&_[data-action]]:rounded-full\",\n \"[&_[data-action]]:px-3\",\n \"[&_[data-action]]:py-2\",\n \"[&_[data-action]]:min-h-12\",\n \"[&_[data-action]]:bg-transparent\",\n \"[&_[data-action]]:border-none\",\n \"[&_[data-action]]:transition-colors\",\n \"[&_[data-action]]:duration-spring-standard-fast-effects\",\n \"[&_[data-action]]:ease-spring-standard-fast-effects\",\n \"[&_[data-action]:hover]:bg-primary/8\",\n \"[&_[data-action]:focus-visible]:ring-2\",\n \"[&_[data-action]:focus-visible]:ring-primary\",\n \"[&_[data-action]:focus-visible]:bg-primary/10\",\n].join(\" \");\n\n/**\n * Motion-specific descendant selectors for the modal date picker.\n * Applied conditionally — omitted when `prefers-reduced-motion: reduce` is active.\n *\n * Uses legacy MD3 motion tokens for screen-level container enter/exit\n * and emphasized easing for calendar month shared-axis navigation.\n */\nexport const MODAL_MOTION_STYLES = [\n // ── Modal container enter ──────────────────────────────────────────────────\n \"[&_[data-modal-dialog]]:transition-[transform,opacity]\",\n \"[&_[data-modal-dialog]]:duration-medium2\",\n \"[&_[data-modal-dialog]]:ease-standard-decelerate\",\n\n // ── Modal container exit ───────────────────────────────────────────────────\n \"[&_[data-modal-dialog][data-exiting]]:duration-medium1\",\n \"[&_[data-modal-dialog][data-exiting]]:ease-standard-accelerate\",\n\n // ── Calendar month slide ───────────────────────────────────────────────────\n \"[&_table]:transition-transform\",\n \"[&_table]:duration-medium1\",\n \"[&_table]:ease-emphasized-decelerate\",\n\n // ── Cell selection animation (scale + background) ──────────────────────────\n \"[&_td>div[data-selected]]:transition-[background-color,transform]\",\n \"[&_td>div[data-selected]]:duration-short2\",\n \"[&_td>div[data-selected]]:ease-standard\",\n\n // ── State layer opacity ────────────────────────────────────────────────────\n \"[&_td>div::after]:transition-opacity\",\n \"[&_td>div::after]:duration-short1\",\n \"[&_td>div::after]:ease-standard\",\n].join(\" \");\n\n/**\n * Styled DatePickerModal (Layer 3)\n *\n * Wraps the headless `DatePickerModal` with MD3 visual styling.\n * Applies modal container, scrim, header, calendar, and action button tokens.\n *\n * @internal\n */\nexport const DatePickerModalStyled = forwardRef<HTMLDivElement, DatePickerModalProps>(\n (props, ref) => {\n const { className, ...rest } = props;\n const reducedMotion = useReducedMotion();\n\n return (\n <DatePickerModal\n ref={ref}\n {...rest}\n className={cn(\n datePickerContainerVariants({ variant: \"modal\" }),\n MODAL_STYLES,\n !reducedMotion && MODAL_MOTION_STYLES,\n className\n )}\n />\n );\n }\n);\n\nDatePickerModalStyled.displayName = \"DatePickerModalStyled\";\n","\"use client\";\n\nimport { forwardRef, useId, useRef, useState } from \"react\";\nimport { useDateField, useDateSegment, useLocale } from \"react-aria\";\nimport { useDateFieldState } from \"react-stately\";\nimport { createCalendar } from \"@internationalized/date\";\n\nimport type { DateSegment as DateSegmentType } from \"react-stately\";\nimport type { DateInputFieldProps } from \"./DatePicker.types\";\n\n/**\n * Internal component for rendering a single editable date segment.\n * @internal\n */\nfunction DateInputSegment({\n segment,\n state,\n}: {\n segment: DateSegmentType;\n state: ReturnType<typeof useDateFieldState>;\n}): JSX.Element {\n const ref = useRef<HTMLDivElement>(null);\n const { segmentProps } = useDateSegment(segment, state, ref);\n\n return (\n <div\n {...segmentProps}\n ref={ref}\n data-segment={segment.type}\n data-placeholder={segment.isPlaceholder || undefined}\n >\n {segment.text}\n </div>\n );\n}\n\n/**\n * Headless DateInputField (Layer 2)\n *\n * An outlined text field for manual date entry with validation.\n * Wraps `useDateField` from React Aria for segmented date input behavior.\n * Renders as an outlined text field pattern with label, input area,\n * and supporting/error text.\n *\n * This is a headless component — it provides behavior, ARIA semantics, and\n * data attributes only. No styling classes are applied.\n *\n * @example\n * ```tsx\n * <DateInputField\n * label=\"Date\"\n * placeholder=\"mm/dd/yyyy\"\n * onChange={(date) => console.log(date)}\n * />\n * ```\n *\n * @internal\n */\nexport const DateInputField = forwardRef<HTMLDivElement, DateInputFieldProps>(\n (props, forwardedRef) => {\n const {\n value,\n defaultValue,\n onChange,\n label,\n placeholder = \"mm/dd/yyyy\",\n isDisabled = false,\n isReadOnly = false,\n isRequired = false,\n minValue,\n maxValue,\n placeholderValue,\n granularity = \"day\",\n isInvalid: externalIsInvalid,\n errorMessage,\n autoFocus = false,\n className,\n } = props;\n\n const { locale } = useLocale();\n const internalRef = useRef<HTMLDivElement>(null);\n const ref = (forwardedRef ?? internalRef) as React.RefObject<HTMLDivElement>;\n const errorId = useId();\n\n const [isFocused, setIsFocused] = useState(false);\n\n const state = useDateFieldState({\n ...(value !== undefined ? { value } : {}),\n ...(defaultValue !== undefined ? { defaultValue } : {}),\n ...(onChange ? { onChange } : {}),\n ...(minValue ? { minValue } : {}),\n ...(maxValue ? { maxValue } : {}),\n ...(placeholderValue ? { placeholderValue } : {}),\n ...(props[\"aria-label\"] ? { \"aria-label\": props[\"aria-label\"] } : {}),\n ...(props[\"aria-labelledby\"] ? { \"aria-labelledby\": props[\"aria-labelledby\"] } : {}),\n ...(label ? { label } : {}),\n isDisabled,\n isReadOnly,\n isRequired,\n granularity: granularity as \"day\",\n locale,\n createCalendar,\n });\n\n const isInvalid = externalIsInvalid ?? state.isInvalid;\n\n const { fieldProps, labelProps } = useDateField(\n {\n ...(value !== undefined ? { value } : {}),\n ...(defaultValue !== undefined ? { defaultValue } : {}),\n ...(onChange ? { onChange } : {}),\n ...(minValue ? { minValue } : {}),\n ...(maxValue ? { maxValue } : {}),\n ...(placeholderValue ? { placeholderValue } : {}),\n ...(props[\"aria-label\"] ? { \"aria-label\": props[\"aria-label\"] } : {}),\n ...(props[\"aria-labelledby\"] ? { \"aria-labelledby\": props[\"aria-labelledby\"] } : {}),\n ...(label ? { label } : {}),\n isDisabled,\n isReadOnly,\n isRequired,\n granularity: granularity as \"day\",\n autoFocus,\n ...(isInvalid ? { \"aria-describedby\": errorId } : {}),\n },\n state,\n ref\n );\n\n return (\n <div\n className={className}\n aria-invalid={isInvalid || undefined}\n data-invalid={isInvalid || undefined}\n data-focused={isFocused || undefined}\n data-disabled={isDisabled || undefined}\n data-date-input-field\n >\n {label && (\n <label {...labelProps} data-label>\n {label}\n </label>\n )}\n <div\n {...fieldProps}\n ref={ref}\n role=\"group\"\n aria-describedby={isInvalid && errorMessage ? errorId : undefined}\n data-field\n data-placeholder-text={placeholder}\n onFocus={(e) => {\n setIsFocused(true);\n fieldProps.onFocus?.(e);\n }}\n onBlur={(e) => {\n setIsFocused(false);\n fieldProps.onBlur?.(e);\n }}\n >\n {state.segments.map((segment, i) => (\n <DateInputSegment key={i} segment={segment} state={state} />\n ))}\n </div>\n {isInvalid && errorMessage && (\n <p id={errorId} data-error-message role=\"alert\">\n {errorMessage}\n </p>\n )}\n </div>\n );\n }\n);\n\nDateInputField.displayName = \"DateInputField\";\n","\"use client\";\n\nimport { forwardRef, useCallback, useEffect, useId, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { useOverlay, usePreventScroll, FocusScope, useDialog } from \"react-aria\";\nimport { useOverlayTriggerState } from \"react-stately\";\n\nimport { DateInputField } from \"./DateInputField\";\nimport { DatePickerModalHeader } from \"./DatePickerModalHeader\";\nimport { DatePickerActions } from \"./DatePickerActions\";\n\nimport type { DateValue } from \"@internationalized/date\";\nimport type { DatePickerModalInputProps } from \"./DatePicker.types\";\n\n/**\n * Headless DatePickerModalInput (Layer 2)\n *\n * Modal dialog for manual keyboard entry of dates via outlined text fields.\n * Supports single-date and range-date input modes with validation.\n *\n * Features:\n * - Portal rendering for proper z-index stacking\n * - Focus trapping within the dialog\n * - Auto-focus first input field on open\n * - Escape key and scrim click to dismiss\n * - `role=\"dialog\"` with `aria-modal=\"true\"` and `aria-labelledby`\n * - Header with headline, supporting text, and mode toggle\n * - One or two outlined date input fields\n * - Validation feedback for invalid date input\n * - OK button disabled when input is invalid\n * - Action buttons (Cancel, OK)\n *\n * This is a headless component — it provides behavior, ARIA semantics, and\n * data attributes only. No styling classes are applied.\n *\n * @example\n * ```tsx\n * <DatePickerModalInput\n * isOpen={open}\n * onOpenChange={setOpen}\n * onChange={(date) => console.log(date)}\n * />\n *\n * <DatePickerModalInput\n * selectionMode=\"range\"\n * isOpen={open}\n * onOpenChange={setOpen}\n * onRangeChange={(range) => console.log(range)}\n * />\n * ```\n */\nexport const DatePickerModalInput = forwardRef<HTMLDivElement, DatePickerModalInputProps>(\n (props, forwardedRef) => {\n const {\n selectionMode = \"single\",\n value,\n defaultValue,\n rangeValue,\n defaultRangeValue,\n onChange,\n onRangeChange,\n minValue,\n maxValue,\n isOpen,\n defaultOpen = false,\n onOpenChange,\n headline,\n supportingText,\n cancelLabel = \"Cancel\",\n confirmLabel = \"OK\",\n onCancel,\n onConfirm,\n onModeToggle,\n className,\n } = props;\n\n const internalRef = useRef<HTMLDivElement>(null);\n const ref = (forwardedRef ?? internalRef) as React.RefObject<HTMLDivElement>;\n const dialogRef = useRef<HTMLDivElement>(null);\n\n const headlineId = useId();\n\n const defaultHeadline = selectionMode === \"range\" ? \"Select dates\" : \"Select date\";\n const resolvedHeadline = headline ?? defaultHeadline;\n\n const defaultSupportingText = selectionMode === \"range\" ? \"Enter dates\" : \"Enter date\";\n const resolvedSupportingText = supportingText ?? defaultSupportingText;\n\n // ── Open/close state ─────────────────────────────────────────────────────\n\n const state = useOverlayTriggerState({\n ...(isOpen !== undefined ? { isOpen } : {}),\n defaultOpen,\n ...(onOpenChange ? { onOpenChange } : {}),\n });\n\n // ── Internal selection state ─────────────────────────────────────────────\n\n const [internalValue, setInternalValue] = useState<DateValue | null>(\n value ?? defaultValue ?? null\n );\n const [internalStartValue, setInternalStartValue] = useState<DateValue | null>(\n rangeValue?.start ?? defaultRangeValue?.start ?? null\n );\n const [internalEndValue, setInternalEndValue] = useState<DateValue | null>(\n rangeValue?.end ?? defaultRangeValue?.end ?? null\n );\n\n // Sync controlled values\n useEffect(() => {\n if (value !== undefined) {\n setInternalValue(value);\n }\n }, [value]);\n\n useEffect(() => {\n if (rangeValue !== undefined) {\n setInternalStartValue(rangeValue?.start ?? null);\n setInternalEndValue(rangeValue?.end ?? null);\n }\n }, [rangeValue]);\n\n // Store value at time of open for cancel/revert\n const valueOnOpenRef = useRef<DateValue | null>(null);\n const startOnOpenRef = useRef<DateValue | null>(null);\n const endOnOpenRef = useRef<DateValue | null>(null);\n\n useEffect(() => {\n if (state.isOpen) {\n valueOnOpenRef.current = internalValue;\n startOnOpenRef.current = internalStartValue;\n endOnOpenRef.current = internalEndValue;\n }\n }, [state.isOpen]); // eslint-disable-line react-hooks/exhaustive-deps\n\n // ── Validation ───────────────────────────────────────────────────────────\n\n const isDateValid = useCallback(\n (date: DateValue | null): boolean => {\n if (!date) return false;\n if (minValue && date.compare(minValue) < 0) return false;\n if (maxValue && date.compare(maxValue) > 0) return false;\n return true;\n },\n [minValue, maxValue]\n );\n\n const isSingleValid = selectionMode === \"single\" && isDateValid(internalValue);\n\n const isRangeValid = (() => {\n if (selectionMode !== \"range\") return false;\n if (!internalStartValue || !internalEndValue) return false;\n if (!isDateValid(internalStartValue) || !isDateValid(internalEndValue)) return false;\n if (internalEndValue.compare(internalStartValue) < 0) return false;\n return true;\n })();\n\n const isFormValid = selectionMode === \"single\" ? isSingleValid : isRangeValid;\n\n // ── Handlers ─────────────────────────────────────────────────────────────\n\n const handleSingleChange = useCallback((newValue: DateValue | null) => {\n setInternalValue(newValue);\n }, []);\n\n const handleStartChange = useCallback((newValue: DateValue | null) => {\n setInternalStartValue(newValue);\n }, []);\n\n const handleEndChange = useCallback((newValue: DateValue | null) => {\n setInternalEndValue(newValue);\n }, []);\n\n const handleConfirm = useCallback(() => {\n if (!isFormValid) return;\n\n if (selectionMode === \"single\") {\n onChange?.(internalValue);\n onConfirm?.(internalValue);\n } else {\n const range =\n internalStartValue && internalEndValue\n ? { start: internalStartValue, end: internalEndValue }\n : null;\n onRangeChange?.(range);\n onConfirm?.(range);\n }\n state.close();\n }, [\n isFormValid,\n selectionMode,\n internalValue,\n internalStartValue,\n internalEndValue,\n onChange,\n onRangeChange,\n onConfirm,\n state,\n ]);\n\n const handleCancel = useCallback(() => {\n setInternalValue(valueOnOpenRef.current);\n setInternalStartValue(startOnOpenRef.current);\n setInternalEndValue(endOnOpenRef.current);\n onCancel?.();\n state.close();\n }, [onCancel, state]);\n\n const handleModeToggle = useCallback(() => {\n onModeToggle?.();\n }, [onModeToggle]);\n\n const handleClose = useCallback(() => {\n handleCancel();\n }, [handleCancel]);\n\n // ── Validation error messages ────────────────────────────────────────────\n\n const getSingleErrorMessage = (): string | undefined => {\n if (!internalValue) return undefined;\n if (minValue && internalValue.compare(minValue) < 0) {\n return \"Date is before minimum allowed date\";\n }\n if (maxValue && internalValue.compare(maxValue) > 0) {\n return \"Date is after maximum allowed date\";\n }\n return undefined;\n };\n\n const getStartErrorMessage = (): string | undefined => {\n if (!internalStartValue) return undefined;\n if (minValue && internalStartValue.compare(minValue) < 0) {\n return \"Date is before minimum allowed date\";\n }\n if (maxValue && internalStartValue.compare(maxValue) > 0) {\n return \"Date is after maximum allowed date\";\n }\n return undefined;\n };\n\n const getEndErrorMessage = (): string | undefined => {\n if (!internalEndValue) return undefined;\n if (minValue && internalEndValue.compare(minValue) < 0) {\n return \"Date is before minimum allowed date\";\n }\n if (maxValue && internalEndValue.compare(maxValue) > 0) {\n return \"Date is after maximum allowed date\";\n }\n if (internalStartValue && internalEndValue.compare(internalStartValue) < 0) {\n return \"End date must be after start date\";\n }\n return undefined;\n };\n\n const singleErrorMessage = getSingleErrorMessage();\n const startErrorMessage = getStartErrorMessage();\n const endErrorMessage = getEndErrorMessage();\n\n const isSingleInvalid = !!singleErrorMessage;\n const isStartInvalid = !!startErrorMessage;\n const isEndInvalid = !!endErrorMessage;\n\n // ── Portal gate ──────────────────────────────────────────────────────────\n\n if (!state.isOpen) {\n return null;\n }\n\n if (typeof document === \"undefined\") {\n return null;\n }\n\n // ── Render ───────────────────────────────────────────────────────────────\n\n const content = (\n <FocusScope contain restoreFocus autoFocus>\n <ModalInputOverlay\n dialogRef={dialogRef}\n headlineId={headlineId}\n onClose={handleClose}\n {...(className ? { className } : {})}\n isOpen={state.isOpen}\n >\n <DatePickerModalHeader\n headline={resolvedHeadline}\n supportingText={resolvedSupportingText}\n inputMode=\"keyboard\"\n onModeToggle={handleModeToggle}\n headlineId={headlineId}\n />\n <hr data-divider />\n {selectionMode === \"single\" ? (\n <DateInputField\n label=\"Date\"\n placeholder=\"mm/dd/yyyy\"\n value={internalValue}\n onChange={handleSingleChange}\n {...(minValue ? { minValue } : {})}\n {...(maxValue ? { maxValue } : {})}\n isInvalid={isSingleInvalid}\n errorMessage={singleErrorMessage}\n autoFocus\n />\n ) : (\n <>\n <DateInputField\n label=\"Start date\"\n placeholder=\"mm/dd/yyyy\"\n value={internalStartValue}\n onChange={handleStartChange}\n {...(minValue ? { minValue } : {})}\n {...(maxValue ? { maxValue } : {})}\n isInvalid={isStartInvalid}\n errorMessage={startErrorMessage}\n autoFocus\n />\n <DateInputField\n label=\"End date\"\n placeholder=\"mm/dd/yyyy\"\n value={internalEndValue}\n onChange={handleEndChange}\n {...(minValue ? { minValue } : {})}\n {...(maxValue ? { maxValue } : {})}\n isInvalid={isEndInvalid}\n errorMessage={endErrorMessage}\n />\n </>\n )}\n <DatePickerActions\n cancelLabel={cancelLabel}\n confirmLabel={confirmLabel}\n onCancel={handleCancel}\n onConfirm={handleConfirm}\n isConfirmDisabled={!isFormValid}\n />\n </ModalInputOverlay>\n </FocusScope>\n );\n\n return createPortal(\n <div ref={ref} data-variant=\"modal-input\" data-selection-mode={selectionMode} data-open>\n {content}\n </div>,\n document.body\n ) as React.ReactElement;\n }\n);\n\nDatePickerModalInput.displayName = \"DatePickerModalInput\";\n\n// ─── Internal ModalInputOverlay ─────────────────────────────────────────────\n\ninterface ModalInputOverlayProps {\n dialogRef: React.RefObject<HTMLDivElement>;\n headlineId: string;\n onClose: () => void;\n className?: string;\n isOpen: boolean;\n children: React.ReactNode;\n}\n\n/**\n * Internal modal overlay for the modal input variant.\n * Wires useDialog, useOverlay, usePreventScroll.\n * @internal\n */\nfunction ModalInputOverlay({\n dialogRef,\n headlineId,\n onClose,\n className,\n isOpen,\n children,\n}: ModalInputOverlayProps): JSX.Element {\n usePreventScroll();\n\n const { dialogProps } = useDialog(\n {\n \"aria-labelledby\": headlineId,\n },\n dialogRef\n );\n\n const { overlayProps } = useOverlay(\n {\n isOpen,\n onClose,\n isDismissable: true,\n shouldCloseOnBlur: false,\n },\n dialogRef\n );\n\n return (\n <>\n <div data-scrim aria-hidden=\"true\" onClick={onClose} />\n <div\n {...overlayProps}\n {...dialogProps}\n ref={dialogRef}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={headlineId}\n className={className}\n data-modal-dialog\n >\n {children}\n </div>\n </>\n );\n}\n\nModalInputOverlay.displayName = \"ModalInputOverlay\";\n","\"use client\";\n\nimport { forwardRef } from \"react\";\n\nimport { cn } from \"../../utils/cn\";\nimport { DatePickerModalInput } from \"./DatePickerModalInput\";\nimport { datePickerContainerVariants } from \"./DatePicker.variants\";\n\nimport type { DatePickerModalInputProps } from \"./DatePicker.types\";\n\n/**\n * Tailwind descendant selectors for styling the modal-input date picker's internal elements.\n */\nconst MODAL_INPUT_STYLES = [\n // ── Container structure ───────────────────────────────────────────────────\n \"[&_[data-modal-dialog]]:bg-surface-container-high\",\n \"[&_[data-modal-dialog]]:rounded-3xl\",\n \"[&_[data-modal-dialog]]:overflow-hidden\",\n \"[&_[data-modal-dialog]]:fixed\",\n \"[&_[data-modal-dialog]]:top-1/2\",\n \"[&_[data-modal-dialog]]:left-1/2\",\n \"[&_[data-modal-dialog]]:-translate-x-1/2\",\n \"[&_[data-modal-dialog]]:-translate-y-1/2\",\n \"[&_[data-modal-dialog]]:z-50\",\n \"[&_[data-modal-dialog]]:w-[328px]\",\n\n // ── Header ────────────────────────────────────────────────────────────────\n \"[&_[data-modal-header]]:px-6\",\n \"[&_[data-modal-header]]:pt-4\",\n \"[&_[data-modal-header]]:pb-3\",\n \"[&_[data-modal-header]]:flex\",\n \"[&_[data-modal-header]]:items-start\",\n \"[&_[data-modal-header]]:justify-between\",\n\n \"[&_[data-headline]]:text-label-large\",\n \"[&_[data-headline]]:text-on-surface-variant\",\n \"[&_[data-headline]]:m-0\",\n\n \"[&_[data-supporting-text]]:text-headline-large\",\n \"[&_[data-supporting-text]]:text-on-surface\",\n \"[&_[data-supporting-text]]:mt-4\",\n \"[&_[data-supporting-text]]:m-0\",\n\n \"[&_[data-mode-toggle]]:w-12\",\n \"[&_[data-mode-toggle]]:h-12\",\n \"[&_[data-mode-toggle]]:rounded-full\",\n \"[&_[data-mode-toggle]]:flex\",\n \"[&_[data-mode-toggle]]:items-center\",\n \"[&_[data-mode-toggle]]:justify-center\",\n \"[&_[data-mode-toggle]]:text-on-surface-variant\",\n \"[&_[data-mode-toggle]]:bg-transparent\",\n \"[&_[data-mode-toggle]]:border-none\",\n \"[&_[data-mode-toggle]]:self-end\",\n \"[&_[data-mode-toggle]]:transition-colors\",\n \"[&_[data-mode-toggle]]:duration-spring-standard-fast-effects\",\n \"[&_[data-mode-toggle]]:ease-spring-standard-fast-effects\",\n \"[&_[data-mode-toggle]:hover]:bg-on-surface-variant/8\",\n\n // ── Divider ───────────────────────────────────────────────────────────────\n \"[&_hr[data-divider]]:border-outline-variant\",\n\n // ── Date input fields ─────────────────────────────────────────────────────\n \"[&_[data-date-input-field]]:px-6\",\n \"[&_[data-date-input-field]]:py-2\",\n\n \"[&_[data-date-input-field]_[data-field]]:flex\",\n \"[&_[data-date-input-field]_[data-field]]:items-center\",\n \"[&_[data-date-input-field]_[data-field]]:border\",\n \"[&_[data-date-input-field]_[data-field]]:border-outline\",\n \"[&_[data-date-input-field]_[data-field]]:rounded-sm\",\n \"[&_[data-date-input-field]_[data-field]]:px-4\",\n \"[&_[data-date-input-field]_[data-field]]:py-3\",\n \"[&_[data-date-input-field]_[data-field]]:text-body-large\",\n \"[&_[data-date-input-field]_[data-field]]:text-on-surface\",\n\n \"[&_[data-date-input-field]_[data-segment]]:outline-none\",\n \"[&_[data-date-input-field]_[data-segment][data-placeholder]]:text-on-surface-variant\",\n\n \"[&_[data-date-input-field][data-focused]_[data-field]]:border-primary\",\n \"[&_[data-date-input-field][data-focused]_[data-field]]:border-2\",\n\n \"[&_[data-date-input-field][data-invalid]_[data-field]]:border-error\",\n\n \"[&_[data-date-input-field]_[data-label]]:text-body-small\",\n \"[&_[data-date-input-field]_[data-label]]:text-on-surface-variant\",\n\n \"[&_[data-date-input-field]_[data-error-message]]:text-body-small\",\n \"[&_[data-date-input-field]_[data-error-message]]:text-error\",\n \"[&_[data-date-input-field]_[data-error-message]]:mt-1\",\n\n // ── Scrim ─────────────────────────────────────────────────────────────────\n \"[&_[data-scrim]]:fixed\",\n \"[&_[data-scrim]]:inset-0\",\n \"[&_[data-scrim]]:z-40\",\n \"[&_[data-scrim]]:bg-scrim\",\n \"[&_[data-scrim]]:opacity-32\",\n \"[&_[data-scrim]]:transition-opacity\",\n \"[&_[data-scrim]]:duration-medium2\",\n \"[&_[data-scrim]]:ease-standard\",\n\n // ── Action buttons ────────────────────────────────────────────────────────\n \"[&_[data-actions]]:flex\",\n \"[&_[data-actions]]:items-center\",\n \"[&_[data-actions]]:justify-end\",\n \"[&_[data-actions]]:gap-2\",\n \"[&_[data-actions]]:px-3\",\n \"[&_[data-actions]]:py-2\",\n \"[&_[data-action]]:text-primary\",\n \"[&_[data-action]]:text-label-large\",\n \"[&_[data-action]]:rounded-full\",\n \"[&_[data-action]]:px-3\",\n \"[&_[data-action]]:py-2\",\n \"[&_[data-action]]:bg-transparent\",\n \"[&_[data-action]]:border-none\",\n \"[&_[data-action]]:transition-colors\",\n \"[&_[data-action]]:duration-spring-standard-fast-effects\",\n \"[&_[data-action]]:ease-spring-standard-fast-effects\",\n \"[&_[data-action]:hover]:bg-primary/8\",\n].join(\" \");\n\n/**\n * Styled DatePickerModalInput (Layer 3)\n *\n * Wraps the headless `DatePickerModalInput` with MD3 visual styling.\n * Applies modal-input container, scrim, header, input field, and action button tokens.\n *\n * @internal\n */\nexport const DatePickerModalInputStyled = forwardRef<HTMLDivElement, DatePickerModalInputProps>(\n (props, ref) => {\n const { className, ...rest } = props;\n\n return (\n <DatePickerModalInput\n ref={ref}\n {...rest}\n className={cn(\n datePickerContainerVariants({ variant: \"modal-input\" }),\n MODAL_INPUT_STYLES,\n className\n )}\n />\n );\n }\n);\n\nDatePickerModalInputStyled.displayName = \"DatePickerModalInputStyled\";\n","\"use client\";\n\nimport { forwardRef } from \"react\";\n\nimport { DatePickerDockedStyled } from \"./DatePickerDockedStyled\";\nimport { DatePickerModalStyled } from \"./DatePickerModalStyled\";\nimport { DatePickerModalInputStyled } from \"./DatePickerModalInputStyled\";\n\nimport type { DatePickerProps } from \"./DatePicker.types\";\nimport type {\n DatePickerDockedProps,\n DatePickerModalProps,\n DatePickerModalInputProps,\n} from \"./DatePicker.types\";\n\n/**\n * `DatePicker` — Layer 3 MD3 Styled Date Picker Component.\n *\n * Routes to the correct styled variant based on the `variant` prop:\n *\n * - **`docked`** (default): Inline picker with text field trigger and popover calendar.\n * Uses `DatePickerDockedStyled` wrapping `DatePickerDocked` headless component.\n *\n * - **`modal`**: Full-screen overlay dialog with calendar selection.\n * Supports single-date and date-range modes.\n * Uses `DatePickerModalStyled` wrapping `DatePickerModal` headless component.\n *\n * - **`modal-input`**: Modal dialog with manual keyboard date entry.\n * Supports single-date and date-range modes.\n * Uses `DatePickerModalInputStyled` wrapping `DatePickerModalInput` headless component.\n *\n * All variants follow MD3 specifications:\n * - `bg-surface-container-high` container background\n * - `rounded-3xl` (28dp) corner radius\n * - MD3 color tokens for all interactive states\n * - MD3 typography tokens (headline-small, label-large, body-large, body-small)\n * - Spring-based standard motion tokens for state transitions\n *\n * @example\n * ```tsx\n * // Docked date picker (default)\n * <DatePicker label=\"Start date\" onChange={setDate} />\n *\n * // Modal date picker\n * <DatePicker variant=\"modal\" isOpen={open} onOpenChange={setOpen} onChange={setDate} />\n *\n * // Modal input date picker\n * <DatePicker variant=\"modal-input\" isOpen={open} onOpenChange={setOpen} onChange={setDate} />\n *\n * // Range selection in modal\n * <DatePicker variant=\"modal\" selectionMode=\"range\" isOpen={open} onOpenChange={setOpen} onRangeChange={setRange} />\n * ```\n *\n * @see https://m3.material.io/components/date-pickers/overview\n */\nexport const DatePicker = forwardRef<HTMLDivElement, DatePickerProps>((props, ref) => {\n const { variant = \"docked\", ...rest } = props;\n\n switch (variant) {\n case \"modal\":\n return <DatePickerModalStyled ref={ref} {...mapToModalProps(rest)} />;\n case \"modal-input\":\n return <DatePickerModalInputStyled ref={ref} {...mapToModalInputProps(rest)} />;\n default:\n return <DatePickerDockedStyled ref={ref} {...mapToDockedProps(rest)} />;\n }\n});\n\nDatePicker.displayName = \"DatePicker\";\n\n/**\n * Maps DatePickerProps (minus variant) to DatePickerDockedProps.\n */\nfunction mapToDockedProps(props: Omit<DatePickerProps, \"variant\">): DatePickerDockedProps {\n const {\n selectionMode: _selectionMode,\n rangeValue: _rangeValue,\n defaultRangeValue: _defaultRangeValue,\n onRangeChange: _onRangeChange,\n headline: _headline,\n supportingText: _supportingText,\n clearLabel: _clearLabel,\n showClear: _showClear,\n onClear: _onClear,\n ...dockedProps\n } = props;\n\n return dockedProps;\n}\n\n/**\n * Maps DatePickerProps (minus variant) to DatePickerModalProps.\n */\nfunction mapToModalProps(props: Omit<DatePickerProps, \"variant\">): DatePickerModalProps {\n return props;\n}\n\n/**\n * Maps DatePickerProps (minus variant) to DatePickerModalInputProps.\n */\nfunction mapToModalInputProps(props: Omit<DatePickerProps, \"variant\">): DatePickerModalInputProps {\n const {\n showClear: _showClear,\n clearLabel: _clearLabel,\n onClear: _onClear,\n isDateUnavailable: _isDateUnavailable,\n ...modalInputProps\n } = props;\n\n return modalInputProps;\n}\n","\"use client\";\n\nimport { forwardRef, useRef } from \"react\";\nimport { useDateField, useDateSegment, useLocale } from \"react-aria\";\nimport { useDateFieldState } from \"react-stately\";\nimport { createCalendar } from \"@internationalized/date\";\n\nimport type { DateSegment as DateSegmentType } from \"react-stately\";\nimport type { DateFieldProps } from \"./DatePicker.types\";\n\n/**\n * Internal component for rendering a single editable date segment.\n * Each segment (month, day, year) is independently focusable and editable.\n * @internal\n */\nfunction DateSegment({\n segment,\n state,\n}: {\n segment: DateSegmentType;\n state: ReturnType<typeof useDateFieldState>;\n}): JSX.Element {\n const ref = useRef<HTMLDivElement>(null);\n const { segmentProps } = useDateSegment(segment, state, ref);\n\n return (\n <div\n {...segmentProps}\n ref={ref}\n data-segment={segment.type}\n data-placeholder={segment.isPlaceholder || undefined}\n data-focused={segment.type !== \"literal\" ? undefined : undefined}\n >\n {segment.text}\n </div>\n );\n}\n\n/**\n * Headless DateField (Layer 2)\n *\n * Renders a segmented date input (e.g., MM/DD/YYYY) using React Aria's\n * `useDateField` and `useDateSegment`. Each segment is independently\n * focusable and editable via keyboard.\n *\n * This is a headless component — it provides behavior, ARIA semantics, and\n * data attributes only. No styling classes are applied.\n *\n * @example\n * ```tsx\n * <DateField aria-label=\"Start date\" onChange={setDate} />\n * ```\n */\nexport const DateField = forwardRef<HTMLDivElement, DateFieldProps>((props, forwardedRef) => {\n const { locale } = useLocale();\n const internalRef = useRef<HTMLDivElement>(null);\n const ref = (forwardedRef ?? internalRef) as React.RefObject<HTMLDivElement>;\n\n const state = useDateFieldState({\n ...(props.value !== undefined ? { value: props.value } : {}),\n ...(props.defaultValue !== undefined ? { defaultValue: props.defaultValue } : {}),\n ...(props.onChange ? { onChange: props.onChange } : {}),\n ...(props.minValue ? { minValue: props.minValue } : {}),\n ...(props.maxValue ? { maxValue: props.maxValue } : {}),\n ...(props.placeholderValue ? { placeholderValue: props.placeholderValue } : {}),\n ...(props[\"aria-label\"] ? { \"aria-label\": props[\"aria-label\"] } : {}),\n ...(props[\"aria-labelledby\"] ? { \"aria-labelledby\": props[\"aria-labelledby\"] } : {}),\n ...(props.label ? { label: props.label } : {}),\n isDisabled: props.isDisabled ?? false,\n isReadOnly: props.isReadOnly ?? false,\n isRequired: props.isRequired ?? false,\n granularity: (props.granularity ?? \"day\") as \"day\",\n locale,\n createCalendar,\n });\n\n const { fieldProps, labelProps } = useDateField(\n {\n ...(props.value !== undefined ? { value: props.value } : {}),\n ...(props.defaultValue !== undefined ? { defaultValue: props.defaultValue } : {}),\n ...(props.onChange ? { onChange: props.onChange } : {}),\n ...(props.minValue ? { minValue: props.minValue } : {}),\n ...(props.maxValue ? { maxValue: props.maxValue } : {}),\n ...(props.placeholderValue ? { placeholderValue: props.placeholderValue } : {}),\n ...(props[\"aria-label\"] ? { \"aria-label\": props[\"aria-label\"] } : {}),\n ...(props[\"aria-labelledby\"] ? { \"aria-labelledby\": props[\"aria-labelledby\"] } : {}),\n ...(props.label ? { label: props.label } : {}),\n isDisabled: props.isDisabled ?? false,\n isReadOnly: props.isReadOnly ?? false,\n isRequired: props.isRequired ?? false,\n granularity: (props.granularity ?? \"day\") as \"day\",\n },\n state,\n ref\n );\n\n return (\n <div className={props.className} data-disabled={props.isDisabled ?? undefined}>\n {props.label && <label {...labelProps}>{props.label}</label>}\n <div {...fieldProps} ref={ref} data-field>\n {state.segments.map((segment, i) => (\n <DateSegment key={i} segment={segment} state={state} />\n ))}\n </div>\n </div>\n );\n});\n\nDateField.displayName = \"DateField\";\n"]}