@tinybigui/react 0.1.1 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils/cn.ts","../src/utils/colors.ts","../src/utils/typography.ts","../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"],"names":["useRef","jsx","forwardRef","useButton","mergeProps","cva","jsxs","filterDOMProps","Spinner","mergedInputProps","useFocusRing","useToggleState","VisuallyHidden","useContext","useRadio"],"mappings":"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","file":"index.js","sourcesContent":["import { type ClassValue, clsx } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\n/**\n * Combines and merges Tailwind CSS classes efficiently.\n *\n * This utility uses:\n * - `clsx` for conditional class joining\n * - `tailwind-merge` to properly merge/deduplicate Tailwind classes\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\n * ```tsx\n * cn('px-2', 'px-4')\n * // => 'px-4' (later class wins)\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","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-secondary-container text-on-secondary-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\",\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\",\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-4\",\n outlined: \"top-3 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-6 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\",\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 )}\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 )}\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 * - Label spacing: 16px (ml-4)\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-4\", // 16px spacing between checkbox 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 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-[28px]\", // 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-4\", // 16px spacing between radio 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 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"]}
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"]}