{"version":3,"sources":["../src/utils/cn.ts","../src/utils/colors.ts","../src/utils/interactionStates.ts","../src/utils/typography.ts","../src/hooks/useScrollElevation.ts","../src/components/AppBar/AppBarHeadless.tsx","../src/components/AppBar/AppBar.variants.ts","../src/components/AppBar/AppBar.tsx","../src/components/Button/ButtonHeadless.tsx","../src/components/Button/Button.variants.ts","../src/hooks/useReducedMotion.ts","../src/hooks/useRipple.tsx","../src/components/ButtonGroup/ButtonGroupContext.tsx","../src/components/ButtonGroup/ButtonGroup.utils.ts","../src/components/Button/Button.tsx","../src/components/ButtonGroup/ButtonGroupHeadless.tsx","../src/components/ButtonGroup/ButtonGroup.variants.ts","../src/components/ButtonGroup/ButtonGroup.tsx","../src/components/IconButton/IconButtonHeadless.tsx","../src/components/IconButton/IconButton.variants.ts","../src/components/IconButton/IconButton.tsx","../src/components/FAB/FABHeadless.tsx","../src/components/FAB/FAB.variants.ts","../src/components/FAB/FAB.tsx","../src/components/TextField/TextField.variants.ts","../src/components/TextField/TextFieldHeadless.tsx","../src/components/TextField/TextField.tsx","../src/components/Checkbox/Checkbox.variants.ts","../src/components/Checkbox/Checkbox.icons.tsx","../src/components/Checkbox/Checkbox.tsx","../src/components/Switch/Switch.variants.ts","../src/components/Switch/Switch.tsx","../src/components/Radio/RadioGroupHeadless.tsx","../src/components/Radio/Radio.variants.ts","../src/components/Radio/Radio.tsx","../src/components/Radio/RadioGroup.tsx","../src/components/Radio/RadioHeadless.tsx","../src/components/Tabs/TabsHeadless.tsx","../src/components/Tabs/Tabs.tsx","../src/components/Tabs/Tabs.variants.ts","../src/components/Tabs/TabList.tsx","../src/components/Tabs/Tab.tsx","../src/components/Tabs/TabPanel.tsx","../src/components/NavigationBar/NavigationBarHeadless.tsx","../src/components/NavigationBar/NavigationBar.variants.ts","../src/components/NavigationBar/NavigationBar.tsx","../src/components/NavigationBar/NavigationBarItem.tsx","../src/components/Drawer/DrawerHeadless.tsx","../src/components/Divider/DividerHeadless.tsx","../src/components/Divider/Divider.variants.ts","../src/components/Divider/Divider.tsx","../src/components/Drawer/Drawer.variants.ts","../src/components/Drawer/DrawerSection.tsx","../src/components/Drawer/Drawer.tsx","../src/components/Drawer/DrawerItem.tsx","../src/components/Drawer/DrawerHeadline.tsx","../src/components/Progress/Progress.variants.ts","../src/components/Progress/Progress.tsx","../src/components/Progress/ProgressHeadless.tsx","../src/components/Card/CardHeadless.tsx","../src/components/Card/Card.variants.ts","../src/components/Card/Card.tsx","../src/components/Card/CardMedia.tsx","../src/components/Card/CardHeader.tsx","../src/components/Card/CardContent.tsx","../src/components/Card/CardActions.tsx","../src/components/Menu/Menu.variants.ts","../src/components/Menu/MenuHeadless.tsx","../src/components/Menu/Menu.tsx","../src/components/Menu/MenuItem.tsx","../src/components/Menu/MenuSection.tsx","../src/components/Menu/MenuDivider.tsx","../src/components/Snackbar/SnackbarHeadless.tsx","../src/components/Snackbar/Snackbar.variants.ts","../src/components/Snackbar/Snackbar.tsx","../src/components/Snackbar/SnackbarProvider.tsx","../src/components/Chip/ChipHeadless.tsx","../src/components/Chip/Chip.variants.ts","../src/components/Chip/Chip.tsx","../src/components/Chip/ChipSet.tsx","../src/components/Dialog/DialogHeadless.tsx","../src/components/Dialog/Dialog.variants.ts","../src/components/Dialog/Dialog.tsx","../src/components/Dialog/DialogHeadline.tsx","../src/components/Dialog/DialogContent.tsx","../src/components/Dialog/DialogActions.tsx","../src/components/Tooltip/TooltipHeadless.tsx","../src/components/Tooltip/TooltipTrigger.tsx","../src/components/Tooltip/Tooltip.variants.ts","../src/components/Tooltip/Tooltip.tsx","../src/components/Tooltip/RichTooltip.tsx","../src/components/List/ListHeadless.tsx","../src/components/List/List.variants.ts","../src/components/List/List.tsx","../src/components/List/ListItemLeading.tsx","../src/components/List/ListItemTrailing.tsx","../src/components/List/ListItemText.tsx","../src/components/List/ListItem.tsx","../src/components/Search/SearchHeadless.tsx","../src/components/Search/Search.variants.ts","../src/components/Search/SearchBar.tsx","../src/components/Search/SearchView.tsx","../src/components/Search/Search.tsx","../src/components/Badge/BadgeHeadless.tsx","../src/components/Badge/Badge.variants.ts","../src/components/Badge/BadgeContent.tsx","../src/components/Badge/Badge.tsx","../src/components/SplitButton/SplitButton.variants.ts","../src/components/SplitButton/SplitButton.tsx","../src/components/SplitButton/SplitButtonHeadless.tsx","../src/components/FABMenu/FABMenuHeadless.tsx","../src/components/FABMenu/FABMenu.variants.ts","../src/components/FABMenu/FABMenu.tsx","../src/components/FABMenu/FABMenuItem.tsx","../src/components/Slider/SliderHeadless.tsx","../src/components/Slider/Slider.variants.ts","../src/components/Slider/SliderStops.tsx","../src/components/Slider/SliderValueIndicator.tsx","../src/components/Slider/Slider.tsx","../src/components/BottomSheet/useBottomSheetDrag.ts","../src/components/BottomSheet/BottomSheetHeadless.tsx","../src/components/BottomSheet/BottomSheet.variants.ts","../src/components/BottomSheet/BottomSheetHandle.tsx","../src/components/BottomSheet/BottomSheet.tsx","../src/components/TimePicker/ClockHand.tsx","../src/components/TimePicker/useClockDial.ts","../src/components/TimePicker/ClockDial.tsx","../src/components/TimePicker/TimeSelector.tsx","../src/components/TimePicker/PeriodSelector.tsx","../src/components/TimePicker/TimePickerDial.tsx","../src/components/TimePicker/TimePicker.variants.ts","../src/components/TimePicker/TimePickerDialStyled.tsx","../src/components/TimePicker/TimeInputField.tsx","../src/components/TimePicker/TimePickerInput.tsx","../src/components/TimePicker/TimePickerInputStyled.tsx","../src/components/TimePicker/TimePicker.tsx","../src/components/DatePicker/CalendarCell.tsx","../src/components/DatePicker/CalendarGrid.tsx","../src/components/DatePicker/CalendarHeader.tsx","../src/components/DatePicker/CalendarCore.tsx","../src/components/DatePicker/DatePickerActions.tsx","../src/components/DatePicker/DatePickerDocked.tsx","../src/components/DatePicker/DatePicker.variants.ts","../src/components/DatePicker/StyledCalendarCell.tsx","../src/components/DatePicker/StyledCalendarHeader.tsx","../src/components/DatePicker/StyledYearItem.tsx","../src/components/DatePicker/StyledWeekday.tsx","../src/components/DatePicker/StyledActionButton.tsx","../src/components/DatePicker/datePickerStructuralStyles.ts","../src/components/DatePicker/DatePickerDockedStyled.tsx","../src/components/DatePicker/DatePickerModalHeader.tsx","../src/components/DatePicker/DatePickerModal.tsx","../src/components/DatePicker/DatePickerModalStyled.tsx","../src/components/DatePicker/DateInputField.tsx","../src/components/DatePicker/DatePickerModalInput.tsx","../src/components/DatePicker/DatePickerModalInputStyled.tsx","../src/components/DatePicker/DatePicker.tsx","../src/components/DatePicker/DateField.tsx"],"names":["extendTailwindMerge","clsx","argbFromHex","themeFromSourceColor","useState","useCallback","useEffect","forwardRef","jsx","cva","jsxs","useRef","useButton","mergeProps","createContext","useContext","useHover","useFocusRing","useId","useMemo","filterDOMProps","Spinner","useTextField","mergedInputProps","useToggleState","useCheckbox","VisuallyHidden","useSwitch","useRadioGroupState","useRadioGroup","useRadio","useTabList","useTab","useTabPanel","Children","isValidElement","useTabListState","Item","useLayoutEffect","isBadgeVisible","usePreventScroll","useDialog","useOverlay","useOverlayTriggerState","FocusScope","createPortal","useLink","useSeparator","React","useReducedMotion","useProgressBar","CardHeadless","Card","CardMedia","CardHeader","CardContent","CardActions","useSlottedContext","ButtonContext","Fragment","cloneElement","RACMenuTrigger","Popover","RACMenu","HeadlessMenuItem","RACMenuItem","RACMenuSection","RACSeparator","Menu","MenuItem","RACHeader","SnackbarHeadless","Snackbar","useToggleButton","CloseIcon","CheckIcon","DialogHeadless","Dialog","DialogHeadline","DialogContent","DialogActions","useTooltipTriggerState","useTooltipTrigger","useTooltip","useOverlayPosition","ListHeadless","InteractiveList","useListState","useListBox","ListItemHeadless","InteractiveListItem","useOption","List","ListItemLeading","ListItemTrailing","ListItemText","ListItem","StaticStyledListItem","InteractiveStyledListItem","useSearchFieldState","useSearchField","badgeVariants","useMenuTriggerState","formatValue","useSliderThumb","useSliderState","useSlider","BottomSheetHeadless","BottomSheet","valueToAngle","to24Hour","from24Hour","date","useCalendarCell","usePress","isSameDay","today","getLocalTimeZone","useLocale","useCalendarGrid","getWeeksInMonth","useCalendarState","createCalendar","useCalendar","useRangeCalendarState","useRangeCalendar","useDateSegment","useDateFieldState","useDateField","usePopover","DismissButton","useDatePickerState","useDatePicker"],"mappings":"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","file":"index.cjs","sourcesContent":["import { type ClassValue, clsx } from \"clsx\";\nimport { extendTailwindMerge } from \"tailwind-merge\";\n\n/**\n * Extended tailwind-merge that understands MD3 custom Tailwind v4 `@theme` utilities.\n *\n * By default, `tailwind-merge` treats ALL `text-*` classes as potentially\n * conflicting. This causes issues with our custom MD3 tokens:\n * - Typography scale: `text-body-large`, `text-label-medium`, etc. → font-size group\n * - Color utilities:  `text-on-surface`, `text-primary`, etc.       → text-color group\n *\n * We register the typography-scale tokens so `twMerge` knows they live in the\n * `font-size` group and do NOT conflict with `text-color` utilities.\n */\nconst twMerge = extendTailwindMerge({\n  extend: {\n    classGroups: {\n      \"font-size\": [\n        {\n          text: [\n            // MD3 Display scale\n            \"display-large\",\n            \"display-medium\",\n            \"display-small\",\n            // MD3 Headline scale\n            \"headline-large\",\n            \"headline-medium\",\n            \"headline-small\",\n            // MD3 Title scale\n            \"title-large\",\n            \"title-medium\",\n            \"title-small\",\n            // MD3 Body scale\n            \"body-large\",\n            \"body-medium\",\n            \"body-small\",\n            // MD3 Label scale\n            \"label-large\",\n            \"label-medium\",\n            \"label-small\",\n          ],\n        },\n      ],\n    },\n  },\n});\n\n/**\n * Combines and merges Tailwind CSS classes efficiently.\n *\n * Uses `clsx` for conditional joining + extended `tailwind-merge` that is\n * aware of MD3 typography scale utilities (`text-body-large`, etc.) so they\n * are not incorrectly removed when merged alongside color utilities\n * (`text-on-surface`, `text-primary`, etc.).\n *\n * @example\n * ```tsx\n * cn('px-2 py-1', condition && 'bg-blue-500', { 'text-white': isActive })\n * // => 'px-2 py-1 bg-blue-500 text-white'\n * ```\n *\n * @example Merging conflicting classes (later wins)\n * ```tsx\n * cn('px-2', 'px-4')\n * // => 'px-4'\n * ```\n *\n * @example MD3 typography + color (both kept — no false conflict)\n * ```tsx\n * cn('text-body-large', 'text-on-surface')\n * // => 'text-body-large text-on-surface'\n * ```\n */\nexport function cn(...inputs: ClassValue[]): string {\n  return twMerge(clsx(inputs));\n}\n","/**\n * Color Utilities\n *\n * Utilities for working with Material Design 3 color system.\n * Provides functions for color manipulation, CSS variable extraction,\n * and integration with material-color-utilities.\n */\n\nimport { argbFromHex, themeFromSourceColor, type Theme } from \"@material/material-color-utilities\";\n\n/**\n * Material Design 3 color roles\n */\nexport type MD3ColorRole =\n  | \"primary\"\n  | \"on-primary\"\n  | \"primary-container\"\n  | \"on-primary-container\"\n  | \"secondary\"\n  | \"on-secondary\"\n  | \"secondary-container\"\n  | \"on-secondary-container\"\n  | \"tertiary\"\n  | \"on-tertiary\"\n  | \"tertiary-container\"\n  | \"on-tertiary-container\"\n  | \"error\"\n  | \"on-error\"\n  | \"error-container\"\n  | \"on-error-container\"\n  | \"surface\"\n  | \"on-surface\"\n  | \"surface-variant\"\n  | \"on-surface-variant\"\n  | \"outline\"\n  | \"outline-variant\"\n  | \"background\"\n  | \"on-background\";\n\n/**\n * Get the computed value of a CSS variable\n *\n * @param variable - CSS variable name (with or without `--` prefix)\n * @param element - Element to get computed style from (defaults to document root)\n * @returns The computed value of the CSS variable\n *\n * @example\n * ```ts\n * const primaryColor = getColorValue('--md-sys-color-primary');\n * // Returns: '#6750a4'\n *\n * const primaryColor = getColorValue('md-sys-color-primary');\n * // Also returns: '#6750a4'\n * ```\n */\nexport function getColorValue(\n  variable: string,\n  element: HTMLElement = document.documentElement\n): string {\n  const varName = variable.startsWith(\"--\") ? variable : `--${variable}`;\n  return getComputedStyle(element).getPropertyValue(varName).trim();\n}\n\n/**\n * Get a Material Design 3 color token value\n *\n * @param role - MD3 color role name\n * @returns The hex color value\n *\n * @example\n * ```ts\n * const primary = getMD3Color('primary');\n * // Returns: '#6750a4'\n *\n * const onPrimary = getMD3Color('on-primary');\n * // Returns: '#ffffff'\n * ```\n */\nexport function getMD3Color(role: MD3ColorRole): string {\n  return getColorValue(`--md-sys-color-${role}`);\n}\n\n/**\n * Add opacity to a hex color\n *\n * @param color - Hex color string (with or without #)\n * @param opacity - Opacity value (0-1)\n * @returns Hex color with opacity (8-digit hex)\n *\n * @example\n * ```ts\n * withOpacity('#6750a4', 0.5);\n * // Returns: '#6750a480'\n *\n * withOpacity('6750a4', 0.12);\n * // Returns: '#6750a41f'\n * ```\n */\nexport function withOpacity(color: string, opacity: number): string {\n  const hex = color.replace(\"#\", \"\");\n  const alpha = Math.round(Math.max(0, Math.min(1, opacity)) * 255)\n    .toString(16)\n    .padStart(2, \"0\");\n  return `#${hex}${alpha}`;\n}\n\n/**\n * Convert hex color to RGB object\n *\n * @param hex - Hex color string (with or without #)\n * @returns RGB object with r, g, b values (0-255)\n *\n * @example\n * ```ts\n * hexToRgb('#6750a4');\n * // Returns: { r: 103, g: 80, b: 164 }\n * ```\n */\nexport function hexToRgb(hex: string): { r: number; g: number; b: number } {\n  const h = hex.replace(\"#\", \"\");\n  const r = parseInt(h.substring(0, 2), 16);\n  const g = parseInt(h.substring(2, 4), 16);\n  const b = parseInt(h.substring(4, 6), 16);\n  return { r, g, b };\n}\n\n/**\n * Convert RGB to hex color\n *\n * @param r - Red value (0-255)\n * @param g - Green value (0-255)\n * @param b - Blue value (0-255)\n * @returns Hex color string\n *\n * @example\n * ```ts\n * rgbToHex(103, 80, 164);\n * // Returns: '#6750a4'\n * ```\n */\nexport function rgbToHex(r: number, g: number, b: number): string {\n  const toHex = (n: number): string => {\n    const hex = Math.max(0, Math.min(255, Math.round(n))).toString(16);\n    return hex.padStart(2, \"0\");\n  };\n  return `#${toHex(r)}${toHex(g)}${toHex(b)}`;\n}\n\n/**\n * Generate a complete Material Design 3 theme from a seed color\n *\n * @param seedColor - Hex color to generate theme from\n * @returns Material Color Utilities Theme object\n *\n * @example\n * ```ts\n * const theme = generateMD3Theme('#6750a4');\n *\n * // Access light mode colors\n * const lightPrimary = hexFromArgb(theme.schemes.light.primary);\n * // Returns: '#6750a4'\n *\n * // Access dark mode colors\n * const darkPrimary = hexFromArgb(theme.schemes.dark.primary);\n * // Returns: '#d0bcff'\n * ```\n */\nexport function generateMD3Theme(seedColor: string): Theme {\n  const argb = argbFromHex(seedColor);\n  return themeFromSourceColor(argb);\n}\n\n/**\n * Material Color Utilities type exports\n *\n * Re-export commonly used types from material-color-utilities\n * for convenience and type safety.\n */\nexport type { Theme } from \"@material/material-color-utilities\";\n\n/**\n * Material Color Utilities function exports\n *\n * Re-export commonly used functions from material-color-utilities\n * for convenience.\n */\nexport { argbFromHex, hexFromArgb } from \"@material/material-color-utilities\";\n\n/**\n * State layer opacity values (Material Design 3 spec)\n *\n * These values are used for hover, focus, press, and drag states\n * in Material Design 3 components.\n *\n * @see https://m3.material.io/foundations/interaction/states/state-layers\n */\nexport const STATE_LAYER_OPACITY = {\n  hover: 0.08,\n  focus: 0.12,\n  press: 0.12,\n  drag: 0.16,\n} as const;\n\n/**\n * Apply a state layer opacity to a color\n *\n * @param color - Base hex color\n * @param state - State type ('hover' | 'focus' | 'press' | 'drag')\n * @returns Color with state layer opacity applied\n *\n * @example\n * ```ts\n * applyStateLayer('#6750a4', 'hover');\n * // Returns: '#6750a414' (8% opacity)\n *\n * applyStateLayer('#6750a4', 'focus');\n * // Returns: '#6750a41f' (12% opacity)\n * ```\n */\nexport function applyStateLayer(color: string, state: keyof typeof STATE_LAYER_OPACITY): string {\n  return withOpacity(color, STATE_LAYER_OPACITY[state]);\n}\n","/**\n * Interaction States Utility\n *\n * Shared helper for converting React Aria interaction/selection state booleans\n * into presence-based `data-*` attributes for `group-data-[x]/<name>` Tailwind\n * CSS selectors.\n *\n * This covers **interaction and selection states only**. Content flags such as\n * `data-with-icon` or `data-with-label` describe structural composition and\n * must be set explicitly by the component — never via this helper.\n *\n * @example\n * ```tsx\n * const { isHovered, hoverProps } = useHover({ isDisabled })\n * const { isFocusVisible, focusProps } = useFocusRing()\n *\n * <label\n *   className=\"group/switch\"\n *   {...mergeProps(labelProps, hoverProps, focusProps)}\n *   {...getInteractionDataAttributes({ isHovered, isFocusVisible, isSelected, isDisabled })}\n *   data-with-icon={(!!icon) ? \"\" : undefined}\n * />\n * ```\n */\n\n/**\n * Subset of React Aria interaction states that map to `data-*` attributes.\n * All fields are optional — omit states not relevant to a given component.\n */\nexport interface InteractionStates {\n  /**\n   * Pointer is hovering over the component.\n   * Source: `useHover` → `isHovered`\n   */\n  isHovered?: boolean;\n  /**\n   * Keyboard or programmatic focus is visible (not pointer-initiated).\n   * Source: `useFocusRing` → `isFocusVisible`\n   */\n  isFocusVisible?: boolean;\n  /**\n   * Component is actively being pressed.\n   * Source: React Aria interaction → `isPressed`\n   */\n  isPressed?: boolean;\n  /**\n   * Component is in the ON / checked / active selection state.\n   * Source: toggle/select state → `isSelected`\n   */\n  isSelected?: boolean;\n  /**\n   * Component is non-interactive.\n   * Source: `isDisabled` prop\n   */\n  isDisabled?: boolean;\n  /**\n   * Component value cannot be changed.\n   * Source: `isReadOnly` prop\n   */\n  isReadOnly?: boolean;\n  /**\n   * Component value fails validation.\n   * Source: `isInvalid` prop\n   */\n  isInvalid?: boolean;\n  /**\n   * Component is partially selected (checkbox indeterminate state).\n   * Source: `isIndeterminate` prop\n   */\n  isIndeterminate?: boolean;\n}\n\n/**\n * Converts interaction/selection states into presence-based `data-*` attributes.\n *\n * Attributes are set to `\"\"` (present) when true and `undefined` (absent) when\n * false/undefined, so Tailwind `data-[x]` and `group-data-[x]/<name>` selectors\n * match purely on attribute presence — no value comparison needed.\n *\n * Uses explicit ternaries (`s.isHovered ? \"\" : undefined`) rather than\n * `s.isHovered || undefined` to avoid incorrect attribute removal on falsy\n * non-boolean values.\n *\n * @param s - The component's current interaction/selection state\n * @returns A record of `data-*` attribute names to `\"\"` or `undefined`\n *\n * @example\n * ```tsx\n * <label\n *   className=\"group/switch\"\n *   {...getInteractionDataAttributes({ isHovered, isFocusVisible, isSelected, isDisabled })}\n * />\n * ```\n */\nexport function getInteractionDataAttributes(s: InteractionStates): Record<string, \"\" | undefined> {\n  return {\n    \"data-hovered\": s.isHovered ? \"\" : undefined,\n    \"data-focus-visible\": s.isFocusVisible ? \"\" : undefined,\n    \"data-pressed\": s.isPressed ? \"\" : undefined,\n    \"data-selected\": s.isSelected ? \"\" : undefined,\n    \"data-disabled\": s.isDisabled ? \"\" : undefined,\n    \"data-readonly\": s.isReadOnly ? \"\" : undefined,\n    \"data-invalid\": s.isInvalid ? \"\" : undefined,\n    \"data-indeterminate\": s.isIndeterminate ? \"\" : undefined,\n  };\n}\n","/**\n * Typography Utilities\n *\n * Utilities for working with Material Design 3 typography system.\n * Provides type-safe access to typography tokens and helper functions\n * for applying complete text styles.\n */\n\nimport { getColorValue } from \"./colors\";\n\n/**\n * Material Design 3 typography scales\n *\n * MD3 defines 5 categories of typography, each with 3 size variants.\n */\nexport type MD3TypographyScale = \"display\" | \"headline\" | \"title\" | \"body\" | \"label\";\n\n/**\n * Typography size variants\n */\nexport type MD3TypographySize = \"large\" | \"medium\" | \"small\";\n\n/**\n * Complete typography style name\n * Combination of scale and size (e.g., 'display-large', 'body-medium')\n */\nexport type MD3TypographyStyle =\n  | \"display-large\"\n  | \"display-medium\"\n  | \"display-small\"\n  | \"headline-large\"\n  | \"headline-medium\"\n  | \"headline-small\"\n  | \"title-large\"\n  | \"title-medium\"\n  | \"title-small\"\n  | \"body-large\"\n  | \"body-medium\"\n  | \"body-small\"\n  | \"label-large\"\n  | \"label-medium\"\n  | \"label-small\";\n\n/**\n * Typography token properties\n */\nexport type TypographyProperty = \"size\" | \"line-height\" | \"weight\" | \"tracking\";\n\n/**\n * Typography style object returned by getTypographyStyle()\n */\nexport interface TypographyStyleObject {\n  fontSize: string;\n  lineHeight: string;\n  fontWeight: string;\n  letterSpacing: string;\n  fontFamily?: string;\n}\n\n/**\n * Get a typography token value\n *\n * @param style - Typography style name (e.g., 'display-large', 'body-medium')\n * @param property - Property to retrieve ('size' | 'line-height' | 'weight' | 'tracking')\n * @returns The token value as a string\n *\n * @example\n * ```ts\n * getTypographyToken('display-large', 'size');\n * // Returns: '3.5625rem' (57px)\n *\n * getTypographyToken('body-medium', 'weight');\n * // Returns: '400'\n * ```\n */\nexport function getTypographyToken(\n  style: MD3TypographyStyle,\n  property: TypographyProperty\n): string {\n  return getColorValue(`--md-sys-typescale-${style}-${property}`);\n}\n\n/**\n * Get a complete typography style object\n *\n * Returns a style object with all typography properties that can be\n * spread directly into a React component's style prop.\n *\n * @param style - Typography style name\n * @param includeFontFamily - Whether to include font-family (default: false)\n * @returns Typography style object for React inline styles\n *\n * @example\n * ```tsx\n * const displayStyle = getTypographyStyle('display-large');\n * // Returns: {\n * //   fontSize: '3.5625rem',\n * //   lineHeight: '4rem',\n * //   fontWeight: '400',\n * //   letterSpacing: '-0.25px'\n * // }\n *\n * <h1 style={displayStyle}>Display Large Text</h1>\n * ```\n *\n * @example\n * ```tsx\n * // With font family\n * const bodyStyle = getTypographyStyle('body-medium', true);\n * // Returns: {\n * //   fontSize: '0.875rem',\n * //   lineHeight: '1.25rem',\n * //   fontWeight: '400',\n * //   letterSpacing: '0.25px',\n * //   fontFamily: 'system-ui, -apple-system, ...'\n * // }\n * ```\n */\nexport function getTypographyStyle(\n  style: MD3TypographyStyle,\n  includeFontFamily = false\n): TypographyStyleObject {\n  const styleObject: TypographyStyleObject = {\n    fontSize: getTypographyToken(style, \"size\"),\n    lineHeight: getTypographyToken(style, \"line-height\"),\n    fontWeight: getTypographyToken(style, \"weight\"),\n    letterSpacing: getTypographyToken(style, \"tracking\"),\n  };\n\n  if (includeFontFamily) {\n    styleObject.fontFamily = getColorValue(\"--md-sys-typescale-font-family-plain\");\n  }\n\n  return styleObject;\n}\n\n/**\n * Get font family token value\n *\n * @param variant - Font family variant ('plain' | 'brand')\n * @returns Font family stack\n *\n * @example\n * ```ts\n * getFontFamily('plain');\n * // Returns: 'system-ui, -apple-system, Segoe UI, Roboto, ...'\n *\n * getFontFamily('brand');\n * // Returns: Same as plain (can be customized via CSS variables)\n * ```\n */\nexport function getFontFamily(variant: \"plain\" | \"brand\" = \"plain\"): string {\n  return getColorValue(`--md-sys-typescale-font-family-${variant}`);\n}\n\n/**\n * Typography scale recommendations for semantic HTML elements\n *\n * Maps HTML elements to recommended MD3 typography styles.\n * Based on Material Design 3 guidelines.\n */\nexport const TYPOGRAPHY_ELEMENT_MAP = {\n  h1: \"display-large\",\n  h2: \"display-medium\",\n  h3: \"headline-large\",\n  h4: \"headline-medium\",\n  h5: \"headline-small\",\n  h6: \"title-large\",\n  p: \"body-large\",\n  span: \"body-medium\",\n  small: \"body-small\",\n  button: \"label-large\",\n  label: \"label-medium\",\n  caption: \"label-small\",\n} as const satisfies Record<string, MD3TypographyStyle>;\n\n/**\n * Get recommended typography style for an HTML element\n *\n * @param element - HTML element tag name\n * @returns Recommended MD3 typography style\n *\n * @example\n * ```ts\n * getTypographyForElement('h1');\n * // Returns: 'display-large'\n *\n * getTypographyForElement('button');\n * // Returns: 'label-large'\n * ```\n */\nexport function getTypographyForElement(\n  element: keyof typeof TYPOGRAPHY_ELEMENT_MAP\n): MD3TypographyStyle {\n  return TYPOGRAPHY_ELEMENT_MAP[element];\n}\n\n/**\n * Typography scale usage guidelines\n *\n * Provides semantic context for when to use each typography scale.\n */\nexport const TYPOGRAPHY_USAGE = {\n  display: \"Large, expressive text for hero sections and marketing\",\n  headline: \"High-emphasis text for titles and important headings\",\n  title: \"Medium-emphasis text for section headers and card titles\",\n  body: \"Plain text for paragraphs, lists, and general content\",\n  label: \"UI labels, buttons, tabs, and form elements\",\n} as const satisfies Record<MD3TypographyScale, string>;\n\n/**\n * Create a typography CSS class name\n *\n * Generates a consistent class name for typography styles.\n * Useful for creating utility classes or component variants.\n *\n * @param style - Typography style name\n * @returns CSS class name string\n *\n * @example\n * ```ts\n * getTypographyClassName('display-large');\n * // Returns: 'text-display-large'\n *\n * getTypographyClassName('body-medium');\n * // Returns: 'text-body-medium'\n * ```\n */\nexport function getTypographyClassName(style: MD3TypographyStyle): string {\n  return `text-${style}`;\n}\n\n/**\n * Responsive typography helper\n *\n * Creates a style object that adapts typography across breakpoints.\n *\n * @param mobile - Typography style for mobile screens\n * @param tablet - Typography style for tablet screens (optional)\n * @param desktop - Typography style for desktop screens (optional)\n * @returns Object with styles for different breakpoints\n *\n * @example\n * ```tsx\n * const responsiveTitle = getResponsiveTypography(\n *   'headline-small',\n *   'headline-medium',\n *   'headline-large'\n * );\n *\n * // Use with CSS-in-JS or styled-components\n * const Title = styled.h2`\n *   ${responsiveTitle.mobile}\n *\n *   @media (min-width: 768px) {\n *     ${responsiveTitle.tablet}\n *   }\n *\n *   @media (min-width: 1024px) {\n *     ${responsiveTitle.desktop}\n *   }\n * `;\n * ```\n */\nexport function getResponsiveTypography(\n  mobile: MD3TypographyStyle,\n  tablet?: MD3TypographyStyle,\n  desktop?: MD3TypographyStyle\n): {\n  mobile: TypographyStyleObject;\n  tablet?: TypographyStyleObject;\n  desktop?: TypographyStyleObject;\n} {\n  return {\n    mobile: getTypographyStyle(mobile),\n    ...(tablet && { tablet: getTypographyStyle(tablet) }),\n    ...(desktop && { desktop: getTypographyStyle(desktop) }),\n  };\n}\n\n/**\n * Convert rem to pixels (assuming 16px base)\n *\n * @param rem - Rem value (with or without 'rem' suffix)\n * @returns Pixel value\n *\n * @example\n * ```ts\n * remToPx('1.5rem');\n * // Returns: 24\n *\n * remToPx('3.5625rem');\n * // Returns: 57\n * ```\n */\nexport function remToPx(rem: string): number {\n  const remValue = parseFloat(rem.replace(\"rem\", \"\"));\n  return remValue * 16;\n}\n\n/**\n * Convert pixels to rem (assuming 16px base)\n *\n * @param px - Pixel value (with or without 'px' suffix)\n * @returns Rem value as string\n *\n * @example\n * ```ts\n * pxToRem(24);\n * // Returns: '1.5rem'\n *\n * pxToRem('57px');\n * // Returns: '3.5625rem'\n * ```\n */\nexport function pxToRem(px: number | string): string {\n  const pxValue = typeof px === \"string\" ? parseFloat(px.replace(\"px\", \"\")) : px;\n  return `${pxValue / 16}rem`;\n}\n\n/**\n * Truncate text with ellipsis\n *\n * Returns CSS properties for single or multi-line text truncation.\n *\n * @param lines - Number of lines before truncation (1 for single-line)\n * @returns CSS properties object\n *\n * @example\n * ```tsx\n * // Single line truncation\n * const singleLine = truncateText(1);\n * <div style={singleLine}>Long text here...</div>\n *\n * // Multi-line truncation (3 lines)\n * const multiLine = truncateText(3);\n * <p style={multiLine}>Long paragraph text here...</p>\n * ```\n */\nexport function truncateText(lines = 1): React.CSSProperties {\n  if (lines === 1) {\n    return {\n      overflow: \"hidden\",\n      textOverflow: \"ellipsis\",\n      whiteSpace: \"nowrap\",\n    };\n  }\n\n  return {\n    display: \"-webkit-box\",\n    WebkitLineClamp: lines,\n    WebkitBoxOrient: \"vertical\",\n    overflow: \"hidden\",\n    textOverflow: \"ellipsis\",\n  };\n}\n","\"use client\";\n\nimport { useState, useEffect, useCallback } from \"react\";\n\n/**\n * Options for useScrollElevation hook\n */\ninterface UseScrollElevationOptions {\n  /**\n   * Controlled scroll state.\n   * When provided, the hook operates in controlled mode and does not\n   * attach a scroll listener — the consumer manages state externally.\n   * When `undefined`, the hook uses internal scroll detection (uncontrolled).\n   */\n  scrolled?: boolean | undefined;\n\n  /**\n   * Callback fired when scroll elevation state changes.\n   * In uncontrolled mode: fires when user scrolls past threshold.\n   * In controlled mode: fires to inform the consumer of scroll events.\n   */\n  onScrollStateChange?: ((scrolled: boolean) => void) | undefined;\n\n  /**\n   * Scroll threshold in pixels before elevation activates\n   * @default 0\n   */\n  threshold?: number | undefined;\n}\n\n/**\n * Hook for MD3 AppBar scroll-triggered elevation behavior.\n *\n * Manages the transition between flat (at rest) and elevated (on scroll)\n * surface states per the Material Design 3 Top App Bar spec.\n *\n * Supports both controlled and uncontrolled modes:\n * - **Uncontrolled**: Attaches a `scroll` listener to `window` and manages\n *   elevation state internally. Calls `onScrollStateChange` when the state changes.\n * - **Controlled**: Uses the `scrolled` prop directly. No internal scroll listener\n *   is attached. The consumer is responsible for updating `scrolled`.\n *\n * @example Uncontrolled (recommended for most cases)\n * ```tsx\n * const { isScrolled } = useScrollElevation({\n *   onScrollStateChange: (scrolled) => console.log('scrolled:', scrolled),\n * });\n * ```\n *\n * @example Controlled\n * ```tsx\n * const [scrolled, setScrolled] = useState(false);\n * const { isScrolled } = useScrollElevation({ scrolled, onScrollStateChange: setScrolled });\n * ```\n */\nexport function useScrollElevation(options: UseScrollElevationOptions = {}): {\n  isScrolled: boolean;\n} {\n  const { scrolled: controlledScrolled, onScrollStateChange, threshold = 0 } = options;\n\n  const isControlled = controlledScrolled !== undefined;\n\n  const [internalScrolled, setInternalScrolled] = useState(false);\n\n  const handleScroll = useCallback(() => {\n    const currentlyScrolled = window.scrollY > threshold;\n    setInternalScrolled((prev) => {\n      if (prev !== currentlyScrolled) {\n        onScrollStateChange?.(currentlyScrolled);\n        return currentlyScrolled;\n      }\n      return prev;\n    });\n  }, [threshold, onScrollStateChange]);\n\n  useEffect(() => {\n    // Only attach the scroll listener in uncontrolled mode\n    if (isControlled) return;\n\n    window.addEventListener(\"scroll\", handleScroll, { passive: true });\n\n    // Check initial scroll position\n    handleScroll();\n\n    return () => {\n      window.removeEventListener(\"scroll\", handleScroll);\n    };\n  }, [isControlled, handleScroll]);\n\n  return {\n    isScrolled: isControlled ? controlledScrolled : internalScrolled,\n  };\n}\n","import { forwardRef } from \"react\";\nimport { useScrollElevation } from \"../../hooks/useScrollElevation\";\nimport type { AppBarHeadlessProps } from \"./AppBar.types\";\n\n/**\n * Headless AppBar Component (Layer 2)\n *\n * Unstyled Top App Bar primitive. Renders a `<header role=\"banner\">` landmark\n * and manages scroll elevation state via the `useScrollElevation` hook.\n *\n * Features:\n * - Semantic `<header>` element with `role=\"banner\"` ARIA landmark\n * - Controlled scroll state via `scrolled` prop\n * - Uncontrolled scroll state with internal `window` scroll detection\n * - `onScrollStateChange` callback for both modes\n * - Full ref forwarding to the header element\n *\n * Use this layer when you need full visual control beyond what the styled\n * `AppBar` provides.\n *\n * @example\n * ```tsx\n * // Uncontrolled (auto scroll detection)\n * <AppBarHeadless className=\"my-custom-appbar\">\n *   <div>My custom layout</div>\n * </AppBarHeadless>\n *\n * // Controlled scroll state\n * <AppBarHeadless\n *   scrolled={isScrolled}\n *   onScrollStateChange={setIsScrolled}\n *   className=\"my-custom-appbar\"\n * >\n *   <div>My custom layout</div>\n * </AppBarHeadless>\n * ```\n */\nexport const AppBarHeadless = forwardRef<HTMLElement, AppBarHeadlessProps>(\n  ({ className, children, scrolled: scrolledProp, onScrollStateChange, ...htmlProps }, ref) => {\n    const { isScrolled } = useScrollElevation({\n      scrolled: scrolledProp,\n      onScrollStateChange,\n    });\n\n    return (\n      <header\n        {...htmlProps}\n        ref={ref}\n        role=\"banner\"\n        className={className}\n        data-scrolled={isScrolled ? \"\" : undefined}\n      >\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 — Slot CVA Variants\n *\n * Architecture: Variants vs States\n * - CVA holds design-time structure only (variant = size/layout choice).\n * - Scroll elevation state is driven by data-scrolled on the root via\n *   group-data-[scrolled]/appbar selectors — NOT a CVA variant.\n * - With-subtitle growth (136/152dp) is driven by data-with-subtitle via\n *   group-data-[with-subtitle]/appbar selectors.\n *\n * Slot responsibilities:\n *   appBarVariants          — root <header>; container color, elevation, motion, scroll state\n *   appBarTopRowVariants    — leading nav + collapsed title + trailing actions row\n *   appBarLeadingVariants   — nav icon slot wrapper (leading)\n *   appBarHeadlineBlockVariants — collapsed title+subtitle block (small / center-aligned only)\n *   appBarTitleVariants     — title text; per-variant type scale\n *   appBarSubtitleVariants  — subtitle text; per-variant type scale (M3 Expressive flexible)\n *   appBarTrailingVariants  — action icon slot wrapper (trailing)\n *   appBarExpandedTitleVariants — expanded title+subtitle block (medium / large only)\n *\n * M3 Expressive Flexible type scales:\n *   Title:\n *     small / center-aligned (collapsed): title-large\n *     medium (expanded):                  headline-medium\n *     large (expanded):                   display-small\n *\n *   Subtitle (M3 Expressive Flexible — corrected from prior implementation):\n *     small / center-aligned (collapsed): label-medium\n *     medium (expanded):                  label-large\n *     large (expanded):                   title-medium\n *\n *   Subtitle color: always on-surface-variant (corrected for medium/large)\n *\n * Heights (M3 Expressive flexible):\n *   small / center-aligned: 64dp (fixed)\n *   medium: 112dp no subtitle / 136dp with subtitle\n *   large:  120dp no subtitle / 152dp with subtitle\n *\n * Scroll state (MD3):\n *   At rest:   bg-surface + shadow-elevation-0\n *   On scroll: bg-surface-container + shadow-elevation-2\n *\n * Motion:\n *   background-color + box-shadow are effects properties → standard effects spring pair\n *   (duration-spring-standard-default-effects + ease-spring-standard-default-effects)\n *\n * @see https://m3.material.io/components/app-bars/specs\n */\n\n// ─── ROOT / CONTAINER ─────────────────────────────────────────────────────────\n\n/**\n * Root <header> element.\n *\n * - Scroll elevation state is driven by group-data-[scrolled]/appbar selectors.\n * - With-subtitle height growth uses group-data-[with-subtitle]/appbar selectors.\n * - Motion: background-color and box-shadow are effects properties — use the\n *   standard effects spring pair (no overshoot on color/opacity).\n */\nexport const appBarVariants = cva(\n  [\n    // Layout\n    \"w-full flex flex-col\",\n    // Color (base — at rest)\n    \"bg-surface text-on-surface\",\n    // Elevation base\n    \"shadow-elevation-0\",\n    // Scroll state — effects properties animated with standard spring (no overshoot)\n    \"transition-[background-color,box-shadow]\",\n    \"duration-spring-standard-default-effects\",\n    \"ease-spring-standard-default-effects\",\n    // On scroll: surface-container background + elevation-2\n    \"group-data-[scrolled]/appbar:bg-surface-container\",\n    \"group-data-[scrolled]/appbar:shadow-elevation-2\",\n  ],\n  {\n    variants: {\n      /**\n       * Size variant — controls bar height and which title row is shown.\n       * With-subtitle height growth is handled via group-data-[with-subtitle]/appbar below.\n       */\n      variant: {\n        /** 64dp fixed — title left-aligned in top row */\n        small: \"h-appbar-small\",\n        /** 64dp fixed — title centered in top row */\n        \"center-aligned\": \"h-appbar-small\",\n        /**\n         * 112dp no-subtitle / 136dp with-subtitle — title in expanded bottom row.\n         * group-data-[with-subtitle]/appbar switches to the taller token.\n         */\n        medium: [\n          \"min-h-appbar-medium\",\n          \"group-data-[with-subtitle]/appbar:min-h-appbar-medium-subtitle\",\n        ],\n        /**\n         * 120dp no-subtitle / 152dp with-subtitle — title in expanded bottom row.\n         * group-data-[with-subtitle]/appbar switches to the taller token.\n         */\n        large: [\n          \"min-h-appbar-large\",\n          \"group-data-[with-subtitle]/appbar:min-h-appbar-large-subtitle\",\n        ],\n      },\n    },\n    defaultVariants: {\n      variant: \"small\",\n    },\n  }\n);\n\n// ─── TOP ROW ──────────────────────────────────────────────────────────────────\n\n/**\n * The top row containing the leading nav slot, optional collapsed title block,\n * and trailing actions slot.\n *\n * - small / center-aligned: flex-1 to fill the full fixed bar height.\n * - medium / large: fixed 64dp (h-16) so title block can be positioned below.\n */\nexport const appBarTopRowVariants = cva([\"flex items-center justify-between\", \"px-1\"], {\n  variants: {\n    variant: {\n      small: \"flex-1\",\n      \"center-aligned\": \"flex-1\",\n      medium: \"h-16 shrink-0\",\n      large: \"h-16 shrink-0\",\n    },\n  },\n  defaultVariants: {\n    variant: \"small\",\n  },\n});\n\n// ─── LEADING SLOT (nav icon) ───────────────────────────────────────────────────\n\n/**\n * Wrapper for the navigation icon in the leading position.\n * Provides correct color context for icon buttons that inherit currentColor.\n */\nexport const appBarLeadingVariants = cva([\"flex shrink-0 items-center\", \"text-on-surface\"]);\n\n// ─── HEADLINE BLOCK (collapsed title + subtitle — small / center-aligned) ────\n\n/**\n * The title + subtitle block rendered in the top row.\n * Only shown for small and center-aligned variants.\n *\n * center-aligned: title and subtitle are horizontally centered.\n */\nexport const appBarHeadlineBlockVariants = cva(\n  [\"flex min-w-0 flex-1 flex-col justify-center\", \"px-1\"],\n  {\n    variants: {\n      variant: {\n        small: \"\",\n        \"center-aligned\": \"items-center text-center\",\n        medium: \"\",\n        large: \"\",\n      },\n    },\n    defaultVariants: {\n      variant: \"small\",\n    },\n  }\n);\n\n// ─── TITLE ────────────────────────────────────────────────────────────────────\n\n/**\n * Title text element.\n *\n * Type scales per M3 Expressive flexible spec:\n *   small / center-aligned: title-large (22px / 28px), truncated\n *   medium expanded:        headline-medium (28px / 36px)\n *   large expanded:         display-small (36px / 44px)\n */\nexport const appBarTitleVariants = cva(\"text-on-surface font-normal\", {\n  variants: {\n    variant: {\n      small: \"text-title-large truncate\",\n      \"center-aligned\": \"text-title-large truncate\",\n      medium: \"text-headline-medium\",\n      large: \"text-display-small\",\n    },\n  },\n  defaultVariants: {\n    variant: \"small\",\n  },\n});\n\n// ─── SUBTITLE ─────────────────────────────────────────────────────────────────\n\n/**\n * Subtitle text element (M3 Expressive flexible — corrected type scales).\n *\n * Type scales per M3 Expressive Flexible AppBar spec:\n *   small / center-aligned: label-medium (11px / 16px), on-surface-variant, truncated\n *   medium expanded:        label-large (14px / 20px), on-surface-variant\n *   large expanded:         title-medium (16px / 24px), on-surface-variant\n *\n * Note: subtitle is always on-surface-variant across all variants\n * (corrected from prior implementation which used on-surface for medium/large).\n */\nexport const appBarSubtitleVariants = cva(\"text-on-surface-variant font-normal\", {\n  variants: {\n    variant: {\n      small: \"text-label-medium truncate\",\n      \"center-aligned\": \"text-label-medium truncate\",\n      medium: \"text-label-large\",\n      large: \"text-title-medium\",\n    },\n  },\n  defaultVariants: {\n    variant: \"small\",\n  },\n});\n\n// ─── TRAILING SLOT (action icons) ─────────────────────────────────────────────\n\n/**\n * Wrapper for trailing action icon buttons.\n * Provides secondary icon color context per MD3 spec.\n */\nexport const appBarTrailingVariants = cva([\n  \"flex shrink-0 items-center gap-0.5\",\n  \"text-on-surface-variant\",\n]);\n\n// ─── EXPANDED TITLE BLOCK (medium / large only) ────────────────────────────────\n\n/**\n * The expanded title + subtitle block rendered below the top row.\n * Only shown for medium and large variants.\n *\n * Grows to fill remaining space, positioning title at the bottom of the bar.\n */\nexport const appBarExpandedTitleVariants = cva([\n  \"flex flex-1 flex-col justify-end\",\n  \"gap-0.5 px-4 pb-4\",\n]);\n\n// ─── EXPORTED TYPES ───────────────────────────────────────────────────────────\n\nexport type AppBarVariants = VariantProps<typeof appBarVariants>;\nexport type AppBarTopRowVariants = VariantProps<typeof appBarTopRowVariants>;\nexport type AppBarHeadlineBlockVariants = VariantProps<typeof appBarHeadlineBlockVariants>;\nexport type AppBarTitleVariants = VariantProps<typeof appBarTitleVariants>;\nexport type AppBarSubtitleVariants = VariantProps<typeof appBarSubtitleVariants>;\n","\"use client\";\n\nimport { forwardRef } from \"react\";\nimport { AppBarHeadless } from \"./AppBarHeadless\";\nimport {\n  appBarVariants,\n  appBarTopRowVariants,\n  appBarLeadingVariants,\n  appBarHeadlineBlockVariants,\n  appBarTitleVariants,\n  appBarSubtitleVariants,\n  appBarTrailingVariants,\n  appBarExpandedTitleVariants,\n} 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 (M3 Expressive Flexible)\n *\n * Provides context and actions for the current screen. Supports four size variants,\n * a navigation icon slot, title, optional subtitle, and trailing action icon slots.\n * Implements scroll-triggered elevation changes per MD3 specification.\n *\n * **Architecture:**\n * - Layer 3 (this file): MD3 styled, CVA slot variants, layout composition\n * - Layer 2: `AppBarHeadless` — `<header role=\"banner\">`, scroll state\n * - Layer 1: React Aria via `<IconButton>` in consumer slots\n *\n * **Slot-based styling:**\n * All layout and state styling follows the Variants vs States pattern:\n * - `variant` prop drives design-time choices (height, type scale, alignment)\n * - Scroll elevation state is emitted as `data-scrolled=\"\"` on the root and\n *   consumed by `group-data-[scrolled]/appbar:*` selectors (presence-based)\n * - Subtitle presence is emitted as `data-with-subtitle=\"\"` on the root and\n *   used to grow medium/large bar heights (group-data-[with-subtitle]/appbar:*)\n *\n * **Key Features:**\n * - 4 MD3 variants: small, center-aligned, medium, large\n * - M3 Expressive flexible: medium and large grow vertically with a subtitle\n *   (136dp / 152dp respectively), per the M3 Expressive flexible spec\n * - Composable API: pass `<IconButton>` nodes into navigation and action slots\n * - Scroll elevation: bg-surface at rest → bg-surface-container + shadow-elevation-2\n * - Controlled and uncontrolled scroll state\n * - MD3 motion: background-color + box-shadow use standard effects spring pair\n * - WCAG 2.1 AA: `role=\"banner\"` landmark, keyboard accessible slots\n * - Dark mode via existing token system\n *\n * **M3 Expressive Flexible subtitle type scales:**\n * - small / center-aligned: label-medium, on-surface-variant\n * - medium expanded: label-large, on-surface-variant\n * - large expanded: title-medium, on-surface-variant\n *\n * **MD3 Accessibility (m3.material.io/components/app-bars/accessibility):**\n * - Focus lands on the leading navigation button first (first interactive element in DOM)\n * - Tab navigates: leading icon → trailing action icons (left to right)\n * - Space / Enter activates the focused element\n * - All icon buttons MUST have descriptive `aria-label` attributes\n * - Title text is the accessibility label for the current page context\n *\n * @example\n * ```tsx\n * // Small variant (default)\n * <AppBar\n *   title=\"Page Title\"\n *   navigationIcon={\n *     <IconButton aria-label=\"Open navigation menu\">\n *       <MenuIcon />\n *     </IconButton>\n *   }\n *   actions={\n *     <IconButton aria-label=\"Search\">\n *       <SearchIcon />\n *     </IconButton>\n *   }\n * />\n *\n * // Center-aligned with scroll elevation\n * <AppBar\n *   variant=\"center-aligned\"\n *   title=\"My App\"\n *   scrolled={isScrolled}\n *   onScrollStateChange={setIsScrolled}\n * />\n *\n * // Medium with expanded title and subtitle (grows to 136dp with subtitle)\n * <AppBar\n *   variant=\"medium\"\n *   title=\"Article Title\"\n *   subtitle=\"Author · 5 min read\"\n *   navigationIcon={\n *     <IconButton aria-label=\"Go back\">\n *       <ArrowBackIcon />\n *     </IconButton>\n *   }\n * />\n * ```\n */\nexport const AppBar = forwardRef<HTMLElement, AppBarProps>(\n  (\n    {\n      variant = \"small\",\n      title,\n      subtitle,\n      navigationIcon,\n      actions,\n      scrolled: scrolledProp,\n      onScrollStateChange,\n      className,\n    },\n    ref\n  ) => {\n    const { isScrolled } = useScrollElevation({\n      scrolled: scrolledProp,\n      onScrollStateChange,\n    });\n\n    const isExpandedVariant = variant === \"medium\" || variant === \"large\";\n    const hasSubtitle = subtitle != null;\n\n    return (\n      <AppBarHeadless\n        ref={ref}\n        scrolled={isScrolled}\n        className={cn(\n          appBarVariants({ variant }),\n          // group/appbar: enables group-data-[scrolled]/appbar and\n          // group-data-[with-subtitle]/appbar child selectors in all slots\n          \"group/appbar\",\n          className\n        )}\n        // Content flag — subtitle presence drives height growth on medium/large\n        data-with-subtitle={hasSubtitle ? \"\" : undefined}\n      >\n        {/* Top row: navigation icon + title (small/center-aligned) + actions */}\n        <div data-slot=\"top-row\" className={cn(appBarTopRowVariants({ variant }))}>\n          {/* Leading: navigation icon slot */}\n          {navigationIcon != null && (\n            <div data-slot=\"navigation\" className={cn(appBarLeadingVariants())}>\n              {navigationIcon}\n            </div>\n          )}\n\n          {/* Collapsed headline block — title + subtitle in top row (small / center-aligned only) */}\n          {!isExpandedVariant && (\n            <div className={cn(appBarHeadlineBlockVariants({ variant }))}>\n              <span data-testid=\"appbar-title\" className={cn(appBarTitleVariants({ variant }))}>\n                {title}\n              </span>\n              {hasSubtitle && (\n                <span\n                  data-testid=\"appbar-subtitle\"\n                  className={cn(appBarSubtitleVariants({ variant }))}\n                >\n                  {subtitle}\n                </span>\n              )}\n            </div>\n          )}\n\n          {/* Trailing: action icon slots */}\n          {actions != null && (\n            <div data-slot=\"actions\" className={cn(appBarTrailingVariants())}>\n              {actions}\n            </div>\n          )}\n        </div>\n\n        {/* Expanded headline block — title + subtitle below the top row (medium / large only) */}\n        {isExpandedVariant && (\n          <div data-slot=\"expanded-title\" className={cn(appBarExpandedTitleVariants())}>\n            <span\n              data-testid=\"appbar-title\"\n              className={cn(\"min-w-0\", appBarTitleVariants({ variant }))}\n            >\n              {title}\n            </span>\n            {hasSubtitle && (\n              <span\n                data-testid=\"appbar-subtitle\"\n                className={cn(\"min-w-0\", appBarSubtitleVariants({ variant }))}\n              >\n                {subtitle}\n              </span>\n            )}\n          </div>\n        )}\n      </AppBarHeadless>\n    );\n  }\n);\n\nAppBar.displayName = \"AppBar\";\n","import { forwardRef, useRef } from \"react\";\nimport { useButton } from \"react-aria\";\nimport type { AriaButtonProps } from \"react-aria\";\nimport { mergeProps } from \"@react-aria/utils\";\n\n/**\n * Headless Button Component (Layer 2)\n *\n * Unstyled button primitive using React Aria for accessibility.\n * Provides behavior only - bring your own styles.\n *\n * Features:\n * - Full keyboard navigation (Enter, Space)\n * - Screen reader support\n * - Touch/pointer event handling\n * - Focus management\n * - Disabled state handling\n *\n * @example\n * ```tsx\n * // Use for custom styling\n * <ButtonHeadless className=\"custom-button-class\">\n *   Click me\n * </ButtonHeadless>\n * ```\n */\nexport interface ButtonHeadlessProps extends AriaButtonProps {\n  /**\n   * Additional CSS classes\n   */\n  className?: string;\n\n  /**\n   * Button content\n   */\n  children: React.ReactNode;\n\n  /**\n   * Tab index for keyboard navigation\n   * @default 0\n   */\n  tabIndex?: number;\n\n  /**\n   * Mouse down handler (for ripple effect)\n   */\n  onMouseDown?: (e: React.MouseEvent<HTMLButtonElement>) => void;\n}\n\nexport const ButtonHeadless = forwardRef<HTMLButtonElement, ButtonHeadlessProps>(\n  ({ className, children, tabIndex = 0, onMouseDown, type, ...restProps }, forwardedRef) => {\n    // Internal ref for React Aria\n    const internalRef = useRef<HTMLButtonElement>(null);\n\n    // Merge internal ref with forwarded ref\n    const ref = (forwardedRef ?? internalRef) as React.RefObject<HTMLButtonElement>;\n\n    // React Aria hook - handles all accessibility\n    const { buttonProps } = useButton(\n      {\n        ...restProps,\n        // Ensure element type is 'button' for proper semantics\n        elementType: \"button\",\n      },\n      ref\n    );\n\n    // Filter out React Aria-specific props that shouldn't be on DOM elements\n    const {\n      isDisabled: _isDisabled,\n      onPress: _onPress,\n      onPressStart: _onPressStart,\n      onPressEnd: _onPressEnd,\n      onPressChange: _onPressChange,\n      onPressUp: _onPressUp,\n      ...htmlAttrs\n    } = restProps;\n\n    // Merge React Aria props with custom props and HTML attributes\n    // Order matters: buttonProps first, then custom props/HTML attributes to allow overrides\n    const mergedProps = mergeProps(\n      buttonProps,\n      {\n        tabIndex,\n        className,\n        onMouseDown,\n      },\n      htmlAttrs // Pass through only HTML attributes (title, data-*, etc.)\n    );\n\n    return (\n      // eslint-disable-next-line react/button-has-type -- type is dynamically passed from props\n      <button {...mergedProps} ref={ref} type={type ?? \"button\"}>\n        {children}\n      </button>\n    );\n  }\n);\n\nButtonHeadless.displayName = \"ButtonHeadless\";\n","import { cva, type VariantProps } from \"class-variance-authority\";\n\n/**\n * Material Design 3 Button Variants\n *\n * Architecture: Variants vs States\n * - CVA holds design-time structure only (no disabled/loading state variants).\n * - All interaction states are driven by data-* attributes on the root via\n *   group-data-[x]/button Tailwind selectors in each slot's base classes.\n * - Content flags (data-with-icon, data-loading) are set explicitly by the component.\n *\n * Slot responsibilities:\n *   buttonVariants           — root <button>; shape, text color, elevation (shadow)\n *   buttonContainerVariants  — absolute inset child; background color + disabled bg override\n *   buttonStateLayerVariants — hover/focus/press opacity ring (absolute inset overlay)\n *   buttonFocusRingVariants  — keyboard focus outline, MUST NOT be inside overflow-hidden\n *   buttonIconVariants       — leading/trailing icon wrapper\n *   buttonLabelVariants      — label text slot\n *\n * Why background lives on a child slot (buttonContainerVariants) rather than the root:\n *   Tailwind `group-data-[x]/button:` generates a descendant combinator selector —\n *   `.group\\/button[data-x] .target`. The root <button> IS the group host and cannot\n *   be its own descendant, so group selectors cannot target it directly. Moving the\n *   background to an absolutely-positioned child span lets us use the proven\n *   `group-data-[disabled]/button:bg-on-surface/12` pattern (same as Switch track)\n *   to override the container background on disabled, guaranteeing correct specificity.\n *\n * MD3 Spec:\n *   Shape: rounded-full (corner-full)\n *   Height: 32dp small | 40dp medium | 56dp large\n *   Padding: 16dp small | 24dp medium | 32dp large (12dp text variant)\n *   Icon size: 18px × 18px\n *   State-layer opacities: hover 8% | focus 10% | pressed 10%\n *   Disabled: container 12% opacity, content 38% opacity\n *\n * Elevation per state (MD3 comp tokens):\n *   Filled   base=0  hover=1  focus=0  pressed=0\n *   Tonal    base=0  hover=1  focus=0  pressed=0\n *   Elevated base=1  hover=2  focus=1  pressed=1\n *   Outlined base=0  hover=0  focus=0  pressed=0\n *   Text     base=0  hover=0  focus=0  pressed=0\n */\n\n// ─── BUTTON ROOT / CONTAINER ─────────────────────────────────────────────────\n\n/**\n * Root <button> element.\n *\n * Owns: shape, text color, elevation (box-shadow), cursor, layout.\n * Does NOT own background-color — that lives on buttonContainerVariants so\n * the group-data disabled override can reach it via descendant selector.\n *\n * IMPORTANT — overflow is intentionally NOT on the root.\n * Overflow clipping is delegated to the ripple container and state layer\n * via `overflow-hidden rounded-[inherit]` on those children. This lets the\n * focus ring span (`inset-[-3px]`) extend outside the button boundary and\n * remain fully visible — if overflow-hidden were on the root it would be\n * clipped to zero width.\n *\n * Elevation state classes use self-targeting `data-[x]:` (not group-data)\n * because the root is the group host and cannot be its own descendant.\n */\nexport const buttonVariants = cva(\n  [\n    // Layout + shape — NO overflow-hidden here (see note above)\n    \"relative inline-flex items-center justify-center\",\n    \"rounded-full cursor-pointer select-none\",\n    // Split MD3 transition: spatial (border-radius) → expressive spring;\n    // effects (color/bg/shadow) → standard effects spring.\n    \"btn-transition\",\n    // Disabled — self-targeting data-[x]: selectors\n    \"data-[disabled]:cursor-not-allowed data-[disabled]:pointer-events-none\",\n  ],\n  {\n    variants: {\n      /**\n       * Button variant (MD3 specification — strict, no color override)\n       *\n       * Elevation per state follows _md-comp-*-button.scss tokens:\n       *   Filled/Tonal  hover→level-1, focus/pressed→level-0\n       *   Elevated      base→level-1, hover→level-2, focus/pressed→level-1\n       *   Outlined/Text no elevation\n       *\n       * Self-targeting `data-[x]:` is used for elevation because these classes\n       * sit on the root element (the group host) — group-data descendant\n       * selectors cannot match an element against itself.\n       */\n      variant: {\n        /**\n         * Filled — highest emphasis.\n         * MD3: container=primary, label=on-primary, state-layer=on-primary\n         * Elevation: 0 base → 1 hover → 0 focus → 0 pressed\n         */\n        filled: [\n          \"text-on-primary shadow-none\",\n          // Hover: gains level-1 elevation\n          \"data-[hovered]:shadow-elevation-1\",\n          // Focus/pressed: shadow must explicitly return to level-0\n          // (doubled attribute selector → higher specificity than hover)\n          \"group-data-[focus-visible]/button:shadow-none\",\n          \"group-data-[pressed]/button:shadow-none\",\n          // Disabled overrides\n          \"group-data-[disabled]/button:bg-on-surface/12\",\n          \"group-data-[disabled]/button:text-on-surface/38\",\n          \"group-data-[disabled]/button:shadow-none\",\n        ],\n\n        /**\n         * Outlined — medium emphasis. Transparent with border.\n         * MD3: container=transparent, outline=outline, label=primary, state-layer=primary\n         * Elevation: always 0\n         */\n        outlined: [\n          \"bg-transparent border border-outline-variant text-primary\",\n          // Disabled overrides\n          \"data-[disabled]:border-on-surface/12\",\n          \"data-[disabled]:text-on-surface/38\",\n        ],\n\n        /**\n         * Tonal — secondary emphasis.\n         * MD3 name: \"Filled tonal\". container=secondary-container, label=on-secondary-container\n         * Elevation: 0 base → 1 hover → 0 focus → 0 pressed\n         */\n        tonal: [\n          \"text-on-secondary-container shadow-none\",\n          // Hover: gains level-1 elevation (same as filled)\n          \"data-[hovered]:shadow-elevation-1\",\n          // Focus/pressed: return to level-0\n          \"group-data-[focus-visible]/button:shadow-none\",\n          \"group-data-[pressed]/button:shadow-none\",\n          // Disabled overrides\n          \"data-[disabled]:text-on-surface/38\",\n          \"data-[disabled]:shadow-none\",\n        ],\n\n        /**\n         * Elevated — separation via shadow.\n         * MD3: container=surface-container-low, label=primary\n         * Elevation: 1 base → 2 hover → 1 focus → 1 pressed\n         */\n        elevated: [\n          \"text-primary shadow-elevation-1\",\n          // Hover: gains extra elevation\n          \"data-[hovered]:shadow-elevation-2\",\n          // Focus/pressed: return to base level-1\n          // (doubled selector wins over single hover selector at same cascade position)\n          \"group-data-[focus-visible]/button:shadow-elevation-1\",\n          \"group-data-[pressed]/button:shadow-elevation-1\",\n          // Disabled overrides\n          \"data-[disabled]:text-on-surface/38\",\n          \"data-[disabled]:shadow-none\",\n        ],\n\n        /**\n         * Text — lowest emphasis.\n         * MD3: container=transparent, label=primary, state-layer=primary\n         * Elevation: always 0\n         */\n        text: [\n          \"text-primary\",\n          // Disabled overrides\n          \"data-[disabled]:text-on-surface/38\",\n        ],\n      },\n\n      /**\n       * Button size\n       * MD3 spec: small=32dp, medium=40dp, large=56dp\n       * Padding: small=16dp, medium=24dp, large=32dp\n       * Text variant uses reduced padding: small=12dp, medium=12dp\n       */\n      size: {\n        small: \"h-8 px-4 gap-1 text-label-medium tracking-[0.1px]\",\n        medium: \"h-10 px-6 gap-2 text-label-large tracking-[0.1px]\",\n        large: \"h-14 px-8 gap-2 text-title-medium\",\n      },\n\n      /**\n       * Full width button (spans container)\n       */\n      fullWidth: {\n        true: \"w-full\",\n        false: \"\",\n      },\n    },\n\n    /**\n     * Compound variants for text variant reduced padding per size\n     * MD3: text buttons use 12dp padding (px-3) instead of standard padding\n     */\n    compoundVariants: [\n      { variant: \"text\", size: \"small\", className: \"px-3\" },\n      { variant: \"text\", size: \"medium\", className: \"px-3\" },\n      { variant: \"text\", size: \"large\", className: \"px-4\" },\n    ],\n\n    defaultVariants: {\n      variant: \"filled\",\n      size: \"medium\",\n      fullWidth: false,\n    },\n  }\n);\n\n// ─── BACKGROUND CONTAINER ─────────────────────────────────────────────────────\n\n/**\n * Background container — absolute inset child span that owns the container\n * background color for each variant and applies the MD3 disabled bg override.\n *\n * Separated from the root because the root is the `group/button` host and\n * cannot be targeted by its own `group-data-[x]/button:` selectors (those\n * generate descendant combinators). As a real child, this slot DOES match\n * `group-data-[disabled]/button:` with full specificity, exactly like the\n * Switch track slot.\n *\n * MD3 disabled: container uses on-surface at 12% opacity.\n */\nexport const buttonContainerVariants = cva(\n  [\n    \"absolute inset-0 rounded-[inherit] pointer-events-none\",\n    // Effects transition for background-color — no overshoot\n    \"transition-[background-color] duration-spring-standard-fast-effects ease-spring-standard-fast-effects\",\n  ],\n  {\n    variants: {\n      variant: {\n        // MD3 disabled: filled containers replace bg with on-surface/12.\n        // group-data descendant selector targets this child span (not the root host).\n        filled: \"bg-primary group-data-[disabled]/button:bg-on-surface/12\",\n        // outlined/text: container stays transparent when disabled — only border + label fade.\n        outlined: \"bg-transparent\",\n        // MD3 disabled: tonal and elevated containers also replace bg with on-surface/12.\n        tonal: \"bg-secondary-container group-data-[disabled]/button:bg-on-surface/12\",\n        elevated: \"bg-surface-container-low group-data-[disabled]/button:bg-on-surface/12\",\n        text: \"bg-transparent\",\n      },\n    },\n    defaultVariants: { variant: \"filled\" },\n  }\n);\n\n// ─── STATE LAYER ─────────────────────────────────────────────────────────────\n\n/**\n * State layer — absolute inset overlay that transitions opacity on interaction.\n *\n * Color is variant-specific (uses the \"on-container\" role per MD3):\n *   filled   → bg-on-primary\n *   outlined → bg-primary\n *   tonal    → bg-on-secondary-container\n *   elevated → bg-primary\n *   text     → bg-primary\n *\n * Opacity:\n *   0 at rest\n *   8% hover\n *   10% focus/pressed\n *   hidden when disabled\n *\n * Pressed (10%) must win over hover (8%) when both data attributes are set\n * simultaneously. The doubled attribute selector for pressed gives it higher\n * specificity than the singly-chained hover selector:\n *   group-data-[hovered]/button:           → specificity (0,1,0) relative weight\n *   group-data-[pressed]/button:group-...  → specificity (0,2,0) always wins\n *\n * overflow-hidden is placed HERE (not on the root button) so the state layer\n * clips to the button shape while the focus ring span can extend outside.\n */\nexport const buttonStateLayerVariants = cva(\n  [\n    \"absolute inset-0 rounded-[inherit] overflow-hidden pointer-events-none opacity-0\",\n    // Effects transition for opacity — standard spring, no overshoot\n    \"transition-opacity duration-spring-standard-fast-effects ease-spring-standard-fast-effects\",\n    // Hover: 8%\n    \"group-data-[hovered]/button:opacity-[0.08]\",\n    // Focus: 10%\n    \"group-data-[focus-visible]/button:opacity-10\",\n    // Pressed: 10%, doubled selector wins over hover\n    \"group-data-[pressed]/button:opacity-10\",\n    // No state layer when disabled\n    \"group-data-[disabled]/button:hidden\",\n  ],\n  {\n    variants: {\n      variant: {\n        filled: \"bg-on-primary\",\n        outlined: \"bg-primary\",\n        tonal: \"bg-on-secondary-container\",\n        elevated: \"bg-primary\",\n        text: \"bg-primary\",\n      },\n    },\n    defaultVariants: { variant: \"filled\" },\n  }\n);\n\n// ─── FOCUS RING ───────────────────────────────────────────────────────────────\n\n/**\n * Focus ring overlay.\n *\n * Rendered as an absolute `<span>` with `inset-[-3px]` so it extends 3px\n * outside the button boundary. This REQUIRES that `overflow-hidden` is NOT\n * on the root `<button>` element — overflow clipping is moved to the ripple\n * container and state layer instead.\n *\n * The ring is always present in the DOM (opacity-0 at rest) and transitions\n * to opacity-100 on keyboard/programmatic focus, which avoids layout shifts\n * and allows the CSS transition to animate it smoothly.\n */\nexport const buttonFocusRingVariants = cva([\n  \"pointer-events-none absolute inset-[-3px] rounded-full\",\n  \"outline outline-2 outline-offset-0 outline-secondary\",\n  // Effects transition — opacity change must not overshoot\n  \"transition-opacity duration-spring-standard-fast-effects ease-spring-standard-fast-effects\",\n  \"opacity-0\",\n  \"group-data-[focus-visible]/button:opacity-100\",\n]);\n\n// ─── ICON ─────────────────────────────────────────────────────────────────────\n\n/**\n * Icon wrapper (leading or trailing).\n *\n * MD3 spec: icons inside buttons must be 18×18px.\n * Color is inherited from the parent button's text color.\n * `invisible` (not `hidden`) when loading — keeps layout stable so the\n * spinner can take the same space without reflowing adjacent content.\n */\nexport const buttonIconVariants = cva(\n  [\n    \"relative z-10 inline-flex shrink-0 items-center justify-center\",\n    \"size-[18px]\",\n    // Color transition uses effects token (no spatial overshoot on color)\n    \"transition-colors duration-spring-standard-fast-effects ease-spring-standard-fast-effects\",\n  ],\n  {\n    variants: {\n      hidden: {\n        true: \"invisible\",\n        false: \"\",\n      },\n    },\n    defaultVariants: { hidden: false },\n  }\n);\n\n// ─── LABEL ────────────────────────────────────────────────────────────────────\n\n/**\n * Label text wrapper.\n * Typography + color are inherited from the root buttonVariants classes.\n * z-10 keeps it above the state layer and ripple overlays.\n */\nexport const buttonLabelVariants = cva([\"relative z-10 inline-flex items-center\"]);\n\n// ─── EXPORTED TYPES ───────────────────────────────────────────────────────────\n\nexport type ButtonVariants = VariantProps<typeof buttonVariants>;\nexport type ButtonContainerVariants = VariantProps<typeof buttonContainerVariants>;\nexport type ButtonStateLayerVariants = VariantProps<typeof buttonStateLayerVariants>;\nexport type ButtonIconVariants = VariantProps<typeof buttonIconVariants>;\nexport type ButtonLabelVariants = VariantProps<typeof buttonLabelVariants>;\n","\"use client\";\n\nimport { useEffect, useState } from \"react\";\n\nconst QUERY = \"(prefers-reduced-motion: reduce)\";\n\n/**\n * Detects whether the user has requested reduced motion via their OS\n * accessibility settings. Returns `true` when `prefers-reduced-motion: reduce`\n * matches, allowing components to skip or simplify animations.\n *\n * Falls back to `false` during SSR or when `matchMedia` is unavailable.\n */\nexport function useReducedMotion(): boolean {\n  const [reduced, setReduced] = useState(() => {\n    if (typeof window === \"undefined\") return false;\n    return window.matchMedia(QUERY).matches;\n  });\n\n  useEffect(() => {\n    const mql = window.matchMedia(QUERY);\n    const handler = (e: MediaQueryListEvent): void => setReduced(e.matches);\n\n    mql.addEventListener(\"change\", handler);\n    return () => mql.removeEventListener(\"change\", handler);\n  }, []);\n\n  return reduced;\n}\n","import { useRef, useCallback, useState, useEffect, type MouseEvent } from \"react\";\nimport { useReducedMotion } from \"./useReducedMotion\";\n\n/**\n * Ripple state for tracking individual ripple animations\n */\ninterface Ripple {\n  key: number;\n  x: number;\n  y: number;\n  size: number;\n}\n\n/**\n * Options for useRipple hook\n */\ninterface UseRippleOptions {\n  /**\n   * Disable ripple effect\n   * @default false\n   */\n  disabled?: boolean;\n\n  /**\n   * Color of the ripple (currentColor by default)\n   */\n  color?: string;\n\n  /**\n   * Duration of ripple animation in ms.\n   * Must match the `--animate-md-ripple` token duration (450ms).\n   * @default 450\n   */\n  duration?: number;\n}\n\n/**\n * Hook for Material Design 3 ripple effect.\n *\n * Creates a ripple animation that emanates from the pointer-down origin,\n * expanding to cover the entire container element. Uses the `animate-md-ripple`\n * composite token (md-ripple keyframe + 450ms emphasized spatial curve) so\n * the animation is always in sync with the MD3 motion system.\n *\n * Automatically respects `prefers-reduced-motion`: when the OS/browser\n * requests reduced motion the ripple is fully suppressed (no DOM nodes are\n * created, no JS timers fire). This is a non-negotiable accessibility\n * requirement per `md3-motion.mdc`.\n *\n * @example\n * ```tsx\n * function MyButton() {\n *   const { onMouseDown, ripples } = useRipple();\n *\n *   return (\n *     <button onMouseDown={onMouseDown}>\n *       Click me\n *       {ripples}\n *     </button>\n *   );\n * }\n * ```\n */\nexport function useRipple(options: UseRippleOptions = {}): {\n  onMouseDown: (event: MouseEvent<HTMLElement>) => void;\n  ripples: React.ReactNode;\n} {\n  const { disabled = false, color = \"currentColor\", duration = 450 } = options;\n\n  // MD3 motion rule: JS-driven animations must gate on useReducedMotion().\n  // When reduced motion is preferred, suppress the ripple entirely —\n  // do not just shorten it (shortened motion can still cause discomfort).\n  const prefersReducedMotion = useReducedMotion();\n\n  const [ripples, setRipples] = useState<Ripple[]>([]);\n  const rippleKeyCounter = useRef(0);\n  const timersRef = useRef<Array<ReturnType<typeof setTimeout>>>([]);\n\n  useEffect(() => {\n    return () => {\n      timersRef.current.forEach(clearTimeout);\n    };\n  }, []);\n\n  /**\n   * Create ripple on pointer down (mouse or touch)\n   */\n  const onMouseDown = useCallback(\n    (event: MouseEvent<HTMLElement>) => {\n      if (disabled || prefersReducedMotion) return;\n\n      const element = event.currentTarget;\n      const rect = element.getBoundingClientRect();\n\n      // Position relative to the element's own coordinate system\n      const x = event.clientX - rect.left;\n      const y = event.clientY - rect.top;\n\n      // Diameter that guarantees coverage of all four corners\n      const sizeX = Math.max(x, rect.width - x);\n      const sizeY = Math.max(y, rect.height - y);\n      const size = Math.sqrt(sizeX ** 2 + sizeY ** 2) * 2;\n\n      const key = rippleKeyCounter.current++;\n\n      setRipples((prev) => [...prev, { key, x, y, size }]);\n\n      // Remove after animation completes so DOM stays clean\n      const timer = setTimeout(() => {\n        setRipples((prev) => prev.filter((r) => r.key !== key));\n        timersRef.current = timersRef.current.filter((t) => t !== timer);\n      }, duration);\n      timersRef.current.push(timer);\n    },\n    [disabled, duration, prefersReducedMotion]\n  );\n\n  /**\n   * Ripple container and individual ripple elements.\n   *\n   * animate-md-ripple   — MD3 composite token: md-ripple keyframe + 450ms\n   *                       cubic-bezier(0.2, 0, 0, 1) (emphasized spatial)\n   * opacity-12          — MD3 press state layer opacity for ripple fill\n   * rounded-full        — circular ripple shape\n   */\n  const rippleElements =\n    disabled || prefersReducedMotion ? null : (\n      <span\n        data-ripple-container\n        className=\"pointer-events-none absolute inset-0 overflow-hidden rounded-[inherit]\"\n      >\n        {ripples.map((ripple) => (\n          <span\n            key={ripple.key}\n            className=\"animate-md-ripple absolute rounded-full opacity-12\"\n            style={{\n              left: ripple.x,\n              top: ripple.y,\n              width: ripple.size,\n              height: ripple.size,\n              transform: \"translate(-50%, -50%) scale(0)\",\n              backgroundColor: color,\n              animationDuration: `${duration}ms`,\n            }}\n          />\n        ))}\n      </span>\n    );\n\n  return {\n    onMouseDown,\n    ripples: rippleElements,\n  };\n}\n","import { createContext, useContext } from \"react\";\nimport type React from \"react\";\nimport type { ButtonGroupContextValue } from \"./ButtonGroup.types\";\n\n/**\n * Context that provides ButtonGroup state to all child buttons.\n *\n * Consumed via `useButtonGroup()` hook inside child components\n * (Button, IconButton, or any custom button primitive).\n *\n * @example\n * ```tsx\n * // Inside a child button component\n * const { variant, size, selectedValues, onSelectionChange } = useButtonGroup();\n * ```\n */\nexport const ButtonGroupContext = createContext<ButtonGroupContextValue | null>(null);\n\nButtonGroupContext.displayName = \"ButtonGroupContext\";\n\n/**\n * Hook for consuming ButtonGroup context inside child button components.\n *\n * @throws When called outside of a `ButtonGroup` or `ButtonGroupHeadless` container.\n *\n * @example\n * ```tsx\n * const MyButton = ({ value, children }: { value: string; children: React.ReactNode }) => {\n *   const { selectedValues, onSelectionChange, variant } = useButtonGroup();\n *   return (\n *     <button\n *       aria-pressed={selectedValues.has(value)}\n *       onClick={() => onSelectionChange(value)}\n *     >\n *       {children}\n *     </button>\n *   );\n * };\n * ```\n */\nexport function useButtonGroup(): ButtonGroupContextValue {\n  const ctx = useContext(ButtonGroupContext);\n  if (ctx === null) {\n    throw new Error(\n      \"[ButtonGroup] useButtonGroup() must be used inside a <ButtonGroup> or <ButtonGroupHeadless>.\"\n    );\n  }\n  return ctx;\n}\n\n/**\n * Optional hook for consuming ButtonGroup context inside child button components.\n *\n * Unlike `useButtonGroup()`, this hook does **not** throw when called outside a group.\n * Use this inside `Button` and `IconButton` so they can read group metadata when\n * rendered inside a `ButtonGroup` but still work standalone.\n *\n * Returns `null` when called outside a `<ButtonGroup>` or `<ButtonGroupHeadless>`.\n *\n * @example\n * ```tsx\n * // Inside Button or IconButton\n * const groupCtx = useOptionalButtonGroup();\n * const isConnected = groupCtx?.variant === 'connected';\n * ```\n */\nexport function useOptionalButtonGroup(): ButtonGroupContextValue | null {\n  return useContext(ButtonGroupContext);\n}\n\n/**\n * Props for `ButtonGroupProvider`\n */\nexport interface ButtonGroupProviderProps {\n  /** The context value to provide to all children */\n  value: ButtonGroupContextValue;\n  /** Child button components */\n  children: React.ReactNode;\n}\n\n/**\n * Provider component that wraps children with ButtonGroupContext.\n *\n * Used internally by `ButtonGroupHeadless`. You should rarely need\n * to use this directly — prefer `ButtonGroup` or `ButtonGroupHeadless`.\n */\nexport function ButtonGroupProvider({\n  value,\n  children,\n}: ButtonGroupProviderProps): React.ReactElement {\n  return <ButtonGroupContext.Provider value={value}>{children}</ButtonGroupContext.Provider>;\n}\n","import type {\n  ButtonGroupContextValue,\n  ButtonGroupShape,\n  ButtonGroupSize,\n} from \"./ButtonGroup.types\";\n\n/**\n * Static lookup table for connected-variant inner corner radii.\n *\n * \"Inner\" corners are the adjacent sides of every button in a connected group.\n * These values are applied to ALL four corners first, then the outer corners of\n * the first/last buttons are selectively overridden with `OUTER_RADIUS_*`.\n *\n * All class strings are written statically here so that Tailwind v4 can detect\n * them during the build-time class scan.\n *\n * MD3 spec values (dp → Tailwind tokens):\n *   extra-small = 4dp  → rounded-xs   (--radius-xs = 4px)\n *   small       = 8dp  → rounded-sm   (--radius-sm = 8px)\n *   medium      = 8dp  → rounded-sm\n *   large       = 16dp → rounded-lg   (--radius-lg = 16px)\n *   extra-large = 20dp → rounded-[20px] (no matching token; --radius-xl is 28px)\n */\nconst INNER_RADIUS: Record<ButtonGroupSize, string> = {\n  \"extra-small\": \"rounded-xs\",\n  small: \"rounded-sm\",\n  medium: \"rounded-sm\",\n  large: \"rounded-lg\",\n  \"extra-large\": \"rounded-[20px]\",\n};\n\n/**\n * Outer corner radius for the \"round\" shape: always full (pill).\n */\nconst OUTER_RADIUS_ROUND = \"rounded-full\";\n\n/**\n * Outer corner radius lookup for the \"square\" shape.\n * Outer corners are the same value as inner corners (no distinction in square mode).\n */\nconst OUTER_RADIUS_SQUARE: Record<ButtonGroupSize, string> = {\n  \"extra-small\": \"rounded-xs\",\n  small: \"rounded-sm\",\n  medium: \"rounded-sm\",\n  large: \"rounded-lg\",\n  \"extra-large\": \"rounded-[20px]\",\n};\n\n/**\n * Static class arrays for all (shape × size) combinations in the connected variant.\n *\n * Each array contains:\n *   [0] Inner radius class (applied to all corners of every button)\n *   … `first:` / `last:` overrides using **logical** `rounded-s-*` / `rounded-e-*` so\n *     outer vs inner corners stay correct in LTR and RTL.\n *\n * `round` shape: outer (exposed) corners use a graduated radius per size tier to avoid sharp\n *   contrast at the join — xs→`rounded-s-lg`, sm→`rounded-s-xl`, md→`rounded-s-3xl`,\n *   lg/xl→`rounded-s-4xl`. Inner (adjacent) corners shrink per size tier — xs=4dp, sm/md=8dp,\n *   lg=16dp, xl=20dp.\n *\n * `square` shape: outer corners are the same as inner corners — uniform radius on all\n *   four corners of every button. No distinction between outer and inner edges.\n *\n * Writing the full class strings statically (not via string concatenation) ensures\n * the Tailwind CSS v4 scanner can detect all classes at build time.\n */\nconst CONNECTED_RADIUS_CLASSES: Record<\n  ButtonGroupShape,\n  Record<ButtonGroupSize, readonly string[]>\n> = {\n  round: {\n    \"extra-small\": [\"rounded-xs\", \"first:rounded-s-lg\", \"last:rounded-e-lg\"],\n    small: [\"rounded-sm\", \"first:rounded-s-xl\", \"last:rounded-e-xl\"],\n    medium: [\"rounded-sm\", \"first:rounded-s-3xl\", \"last:rounded-e-3xl\"],\n    large: [\"rounded-lg\", \"first:rounded-s-4xl\", \"last:rounded-e-4xl\"],\n    \"extra-large\": [\"rounded-[20px]\", \"first:rounded-s-4xl\", \"last:rounded-e-4xl\"],\n  },\n  square: {\n    \"extra-small\": [\"rounded-xs\", \"first:rounded-s-xs\", \"last:rounded-e-xs\"],\n    small: [\"rounded-sm\", \"first:rounded-s-sm\", \"last:rounded-e-sm\"],\n    medium: [\"rounded-sm\", \"first:rounded-s-sm\", \"last:rounded-e-sm\"],\n    large: [\"rounded-lg\", \"first:rounded-s-lg\", \"last:rounded-e-lg\"],\n    \"extra-large\": [\"rounded-[20px]\", \"first:rounded-s-[20px]\", \"last:rounded-e-[20px]\"],\n  },\n};\n\n/**\n * Returns the Tailwind class strings for connected-variant corner radius overrides.\n *\n * Call this inside `Button` or `IconButton` when `variant === 'connected'` is\n * detected from `useOptionalButtonGroup()`. The returned classes:\n *\n * 1. Override the button's default `rounded-full` with the correct inner radius\n * 2. Use `first:rounded-s-*` to restore outer corners on the first button\n * 3. Use `last:rounded-e-*` to restore outer corners on the last button\n *\n * Relies on CSS pseudo-class specificity — no React-level child enumeration needed.\n *\n * @example\n * ```tsx\n * const groupCtx = useOptionalButtonGroup();\n * if (groupCtx?.variant === 'connected') {\n *   const radiusClasses = getConnectedRadiusClasses(groupCtx);\n *   // → ['rounded-sm', 'first:rounded-s-3xl', 'last:rounded-e-3xl']\n * }\n * ```\n */\nexport function getConnectedRadiusClasses(\n  ctx: ButtonGroupContextValue,\n  value?: string\n): readonly string[] {\n  const connectedClasses = CONNECTED_RADIUS_CLASSES[ctx.shape][ctx.size];\n  if (value && ctx.selectedValues.has(value)) {\n    // round: morph to full pill on selection (MD3 segmented button selected state)\n    // square: keep uniform inner radius — no pill morph in square mode\n    return ctx.shape === \"round\" ? [\"rounded-full\"] : [INNER_RADIUS[ctx.size]];\n  }\n  return connectedClasses;\n}\n\n/**\n * Returns the inner corner radius Tailwind class for a given size.\n * Useful when computing context values in the headless layer.\n */\nexport function getInnerRadius(size: ButtonGroupSize): string {\n  return INNER_RADIUS[size];\n}\n\n/**\n * Returns the outer corner radius Tailwind class for a given shape + size.\n * Useful when computing context values in the headless layer.\n */\nexport function getOuterRadius(shape: ButtonGroupShape, size: ButtonGroupSize): string {\n  if (shape === \"round\") return OUTER_RADIUS_ROUND;\n  return OUTER_RADIUS_SQUARE[size];\n}\n","\"use client\";\n\nimport { forwardRef, useRef, useState, useCallback } from \"react\";\nimport type React from \"react\";\nimport { useHover, useFocusRing, mergeProps } from \"react-aria\";\nimport { ButtonHeadless } from \"./ButtonHeadless\";\nimport {\n  buttonVariants,\n  buttonContainerVariants,\n  buttonStateLayerVariants,\n  buttonFocusRingVariants,\n  buttonIconVariants,\n  buttonLabelVariants,\n  type ButtonVariants,\n} from \"./Button.variants\";\nimport { cn } from \"../../utils/cn\";\nimport { getInteractionDataAttributes } from \"../../utils/interactionStates\";\nimport { useRipple } from \"../../hooks/useRipple\";\nimport { useOptionalButtonGroup } from \"../ButtonGroup/ButtonGroupContext\";\nimport { getConnectedRadiusClasses } from \"../ButtonGroup/ButtonGroup.utils\";\nimport type { ButtonProps } from \"./Button.types\";\n\n/**\n * Loading spinner component\n */\nconst Spinner = (): React.ReactElement => (\n  <svg\n    role=\"progressbar\"\n    aria-label=\"Loading\"\n    className=\"relative z-10 h-[18px] w-[18px] animate-spin\"\n    xmlns=\"http://www.w3.org/2000/svg\"\n    fill=\"none\"\n    viewBox=\"0 0 24 24\"\n  >\n    <circle className=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"4\" />\n    <path\n      className=\"opacity-75\"\n      fill=\"currentColor\"\n      d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\n    />\n  </svg>\n);\n\n/**\n * Material Design 3 Button Component (Layer 3: Styled)\n *\n * Built on React Aria for world-class accessibility.\n * Implements the Variants-vs-States architecture: all interaction states are\n * expressed as data-* attributes on the root and consumed by each slot via\n * group-data-[x]/button Tailwind selectors — no state variants in CVA.\n *\n * Features:\n * - ✅ 5 MD3 variants: filled, outlined, tonal, elevated, text\n * - ✅ 3 sizes: small (32dp), medium (40dp), large (56dp)\n * - ✅ Loading state with spinner\n * - ✅ Ripple effect (Material Design)\n * - ✅ Proper MD3 state layer (hover 8%, focus 10%, pressed 10%)\n * - ✅ Full keyboard accessibility (via React Aria)\n * - ✅ Screen reader support (via React Aria)\n * - ✅ Focus management (via React Aria)\n * - ✅ ButtonGroup-aware: applies connected corner radii and min-width when inside a group\n *\n * MD3 Specifications:\n * - Height: 40dp (medium), 32dp (small), 56dp (large)\n * - Typography: Label Large (medium), Label Medium (small), Title Medium (large)\n * - Icon size: 18px × 18px (per MD3 spec)\n * - State layers: 8% hover, 10% focus/pressed\n * - Elevation: Level 1 on hover (filled), Level 1 base → Level 2 hover (elevated)\n *\n * @example\n * ```tsx\n * // Basic usage\n * <Button>Click me</Button>\n *\n * // With variant\n * <Button variant=\"outlined\">Secondary Action</Button>\n *\n * // With icon (MD3 spec: icons are 18px × 18px)\n * <Button icon={<IconAdd className=\"h-[18px] w-[18px]\" />}>\n *   Add Item\n * </Button>\n *\n * // Loading state\n * <Button loading>Saving...</Button>\n *\n * // Disabled\n * <Button isDisabled>Disabled</Button>\n *\n * // Full width\n * <Button fullWidth>Full Width Button</Button>\n *\n * // Inside a connected ButtonGroup\n * <ButtonGroup variant=\"connected\" selectionMode=\"required\" defaultValue=\"md\">\n *   <Button value=\"sm\">S</Button>\n *   <Button value=\"md\">M</Button>\n *   <Button value=\"lg\">L</Button>\n * </ButtonGroup>\n * ```\n */\nexport const Button = forwardRef<HTMLButtonElement, ButtonProps & Omit<ButtonVariants, never>>(\n  (\n    {\n      // Variant props (CVA)\n      variant = \"filled\",\n      size = \"medium\",\n      fullWidth = false,\n\n      // Content props\n      icon,\n      trailingIcon,\n      children,\n\n      // State props\n      loading = false,\n      disableRipple = false,\n      isDisabled = false,\n\n      // Styling\n      className,\n\n      // Other button props\n      tabIndex = 0,\n      type = \"button\",\n\n      // Passed through to ButtonHeadless → useButton\n      ...props\n    },\n    ref\n  ) => {\n    const buttonRef = useRef<HTMLButtonElement>(null);\n    const resolvedRef = (ref ?? buttonRef) as React.RefObject<HTMLButtonElement>;\n\n    // ButtonGroup context — null when rendered outside a group\n    const groupCtx = useOptionalButtonGroup();\n    const isConnected = groupCtx?.variant === \"connected\";\n\n    // Combined disabled state (loading also disables)\n    const isButtonDisabled = isDisabled || loading;\n\n    // ── Interaction state tracking ───────────────────────────────────────────\n    // isPressed is tracked via onPressStart/onPressEnd forwarded to useButton,\n    // which avoids competing with ButtonHeadless's own useButton press handling.\n    const [isPressed, setIsPressed] = useState(false);\n    const handlePressStart = useCallback(() => setIsPressed(true), []);\n    const handlePressEnd = useCallback(() => setIsPressed(false), []);\n\n    const { isHovered, hoverProps } = useHover({ isDisabled: isButtonDisabled });\n    const { isFocusVisible, focusProps } = useFocusRing();\n\n    // Ripple effect\n    const { onMouseDown: handleRipple, ripples } = useRipple({\n      disabled: isButtonDisabled || disableRipple,\n    });\n\n    // Connected group radius + min-width overrides\n    const buttonValue = (props as { value?: string | undefined }).value;\n    const isGroupSelected =\n      isConnected && groupCtx && buttonValue ? groupCtx.selectedValues.has(buttonValue) : false;\n\n    const connectedClasses =\n      isConnected && groupCtx\n        ? [\n            ...getConnectedRadiusClasses(groupCtx, buttonValue),\n            groupCtx.enforceMinWidth ? \"min-w-12\" : \"\",\n          ]\n        : [];\n\n    const hasIcon = !!icon || !!trailingIcon;\n\n    if (process.env.NODE_ENV === \"development\") {\n      if (!children) {\n        console.warn(\n          \"[Button] Button should have text content. Use IconButton for icon-only buttons.\"\n        );\n      }\n    }\n\n    return (\n      <ButtonHeadless\n        {...mergeProps(\n          hoverProps,\n          focusProps,\n          // Track pressed state via useButton's press lifecycle callbacks,\n          // rather than a separate usePress hook, to avoid event handler conflicts.\n          { onPressStart: handlePressStart, onPressEnd: handlePressEnd },\n          props\n        )}\n        ref={resolvedRef}\n        type={type}\n        isDisabled={isButtonDisabled}\n        tabIndex={tabIndex}\n        onMouseDown={handleRipple}\n        // ── Interaction data attributes ──────────────────────────────────────\n        {...getInteractionDataAttributes({\n          isHovered,\n          isFocusVisible,\n          isPressed,\n          isDisabled: isButtonDisabled,\n        })}\n        // ── Content flags ────────────────────────────────────────────────────\n        data-variant={variant}\n        data-with-icon={hasIcon ? \"\" : undefined}\n        data-loading={loading ? \"\" : undefined}\n        // ── Connected group selection state ──────────────────────────────────\n        // Used to switch border-radius easing: expressive (select) vs decelerate (deselect).\n        // btn-transition-selected overrides --_btn-radius-easing to the bouncy spring only\n        // while the button is gaining the pill shape; removal restores safe decelerate easing\n        // for the pill→inner-radius return, eliminating the overshoot-to-0px flicker.\n        data-group-selected={isGroupSelected ? \"\" : undefined}\n        className={cn(\n          buttonVariants({ variant, size, fullWidth }),\n          // group/button: enables group-data-[x]/button child selectors in all slots\n          // (added here, not in CVA, following the Switch pattern)\n          \"group/button\",\n          // Asymmetric border-radius easing: expressive when selected, decelerate when not\n          isGroupSelected ? \"btn-transition-selected\" : \"\",\n          // Connected group overrides: inner radius + start/end outer radius + min-width\n          ...connectedClasses,\n          // User custom classes\n          className\n        )}\n      >\n        {/* Background container — owns the variant bg color; group-data-[disabled]/button\n            override applies here because this span is a real descendant of group/button */}\n        <span className={cn(buttonContainerVariants({ variant }))} aria-hidden=\"true\" />\n\n        {/* Ripple effect */}\n        {ripples}\n\n        {/* State layer — absolute overlay that transitions opacity on interaction */}\n        <span className={cn(buttonStateLayerVariants({ variant }))} aria-hidden=\"true\" />\n\n        {/* Focus ring — absolute overlay rendered above state layer */}\n        <span className={cn(buttonFocusRingVariants())} aria-hidden=\"true\" />\n\n        {/* Leading icon (invisible, not hidden, when loading so layout is stable) */}\n        {icon && <span className={cn(buttonIconVariants({ hidden: loading }))}>{icon}</span>}\n\n        {/* Loading spinner (replaces icon position) */}\n        {loading && <Spinner />}\n\n        {/* Label */}\n        <span className={cn(buttonLabelVariants())}>{children}</span>\n\n        {/* Trailing icon (invisible when loading) */}\n        {trailingIcon && (\n          <span className={cn(buttonIconVariants({ hidden: loading }))}>{trailingIcon}</span>\n        )}\n      </ButtonHeadless>\n    );\n  }\n);\n\nButton.displayName = \"Button\";\n","import { forwardRef, useId, useRef, useState } from \"react\";\nimport type React from \"react\";\nimport { ButtonGroupProvider } from \"./ButtonGroupContext\";\nimport { getInnerRadius, getOuterRadius } from \"./ButtonGroup.utils\";\nimport type { ButtonGroupProps } from \"./ButtonGroup.types\";\n\n/**\n * Headless ButtonGroup Component (Layer 2)\n *\n * Unstyled group container using a `<div role=\"group\">` for semantic grouping.\n * Provides behavior only — bring your own styles via the styled `ButtonGroup`\n * or your own className.\n *\n * Responsibilities:\n * - Renders a non-focusable `<div role=\"group\">` (ARIA group landmark)\n * - Manages selection state (uncontrolled) or delegates to parent (controlled)\n * - Provides all group metadata to children via `ButtonGroupContext`\n *\n * @example\n * ```tsx\n * // Uncontrolled with default value\n * <ButtonGroupHeadless selectionMode=\"single\" defaultValue=\"medium\" className=\"flex gap-2\">\n *   <MyButton value=\"small\">Small</MyButton>\n *   <MyButton value=\"medium\">Medium</MyButton>\n *   <MyButton value=\"large\">Large</MyButton>\n * </ButtonGroupHeadless>\n *\n * // Controlled\n * <ButtonGroupHeadless\n *   selectionMode=\"multi\"\n *   selectedValues={selected}\n *   onSelectionChange={setSelected}\n *   className=\"inline-flex gap-[18px]\"\n * >\n *   <MyButton value=\"b\">Bold</MyButton>\n *   <MyButton value=\"i\">Italic</MyButton>\n * </ButtonGroupHeadless>\n * ```\n */\nexport const ButtonGroupHeadless = forwardRef<HTMLDivElement, ButtonGroupProps>(\n  (\n    {\n      // Group configuration\n      variant = \"standard\",\n      size = \"medium\",\n      shape = \"round\",\n      selectionMode,\n      isDisabled = false,\n\n      // Selection — controlled\n      selectedValues: controlledValues,\n      onSelectionChange: onControlledChange,\n\n      // Selection — uncontrolled\n      defaultValue,\n\n      // DOM\n      children,\n      className,\n      ...htmlProps\n    },\n    forwardedRef\n  ) => {\n    const internalRef = useRef<HTMLDivElement>(null);\n    const ref = (forwardedRef ?? internalRef) as React.RefObject<HTMLDivElement>;\n\n    // Generate stable id for the group\n    const groupId = useId();\n\n    // Derive initial uncontrolled set from defaultValue\n    const initialSelected = (): Set<string> => {\n      if (!defaultValue) return new Set<string>();\n      return new Set<string>(Array.isArray(defaultValue) ? defaultValue : [defaultValue]);\n    };\n\n    // Uncontrolled selection state (only used when selectedValues is NOT provided)\n    const [uncontrolledValues, setUncontrolledValues] = useState<Set<string>>(initialSelected);\n\n    const isControlled = controlledValues !== undefined;\n    const selectedValues = isControlled ? controlledValues : uncontrolledValues;\n\n    /**\n     * Handles selection change from child buttons.\n     * Computes the new Set according to the selectionMode and notifies the parent.\n     */\n    const handleSelectionChange = (value: string): void => {\n      if (!selectionMode || isDisabled) return;\n\n      let nextValues: Set<string>;\n\n      if (selectionMode === \"multi\") {\n        nextValues = new Set(selectedValues);\n        if (nextValues.has(value)) {\n          nextValues.delete(value);\n        } else {\n          nextValues.add(value);\n        }\n      } else if (selectionMode === \"required\") {\n        // Must always have exactly one selected — pressing the current selection is a no-op\n        if (selectedValues.has(value)) {\n          nextValues = new Set(selectedValues);\n        } else {\n          nextValues = new Set([value]);\n        }\n      } else {\n        // single — toggle the value (deselectable)\n        nextValues = selectedValues.has(value) ? new Set<string>() : new Set([value]);\n      }\n\n      if (!isControlled) {\n        setUncontrolledValues(nextValues);\n      }\n      onControlledChange?.(nextValues);\n    };\n\n    return (\n      <div\n        {...htmlProps}\n        ref={ref}\n        role=\"group\"\n        id={groupId}\n        className={className}\n        // Explicitly NOT setting tabIndex — the container must not be focusable\n      >\n        <ButtonGroupProvider\n          value={{\n            variant,\n            size,\n            shape,\n            selectionMode,\n            selectedValues,\n            onSelectionChange: handleSelectionChange,\n            isDisabled,\n            connectedInnerRadius: getInnerRadius(size),\n            connectedOuterRadius: getOuterRadius(shape, size),\n            enforceMinWidth:\n              variant === \"connected\" && (size === \"extra-small\" || size === \"small\"),\n          }}\n        >\n          {children}\n        </ButtonGroupProvider>\n      </div>\n    );\n  }\n);\n\nButtonGroupHeadless.displayName = \"ButtonGroupHeadless\";\n","import { cva, type VariantProps } from \"class-variance-authority\";\n\n/**\n * Material Design 3 ButtonGroup Variants\n *\n * Architecture: Variants vs States\n * - CVA holds design-time structure only (no interaction state variants).\n * - All interaction/selection states are driven by data-* attributes on the root\n *   via group-data-[x]/button-group Tailwind selectors.\n * - Container-level state attributes:\n *     data-connected      — variant is \"connected\"\n *     data-has-selection  — at least one child button is selected\n *     data-disabled       — entire group is non-interactive\n *     data-selection-mode — \"single\" | \"required\" | \"multi\" (when applicable)\n *\n * Slot responsibilities:\n *   buttonGroupRootVariants  — layout container; gap, alignment, motion, disabled state\n *\n * MD3 Spec (Inner Gap):\n *   | Size        | standard   | connected |\n *   |-------------|------------|-----------|\n *   | extra-small | 18dp       | 2dp       |\n *   | small       | 12dp       | 2dp       |\n *   | medium      | 8dp        | 2dp       |\n *   | large       | 8dp        | 2dp       |\n *   | extra-large | 8dp        | 2dp       |\n *\n * Motion:\n *   Gap is a spatial property — uses spring-standard-fast-spatial (350ms, no overshoot\n *   for gap since CSS gap cannot visually overshoot). This ensures smooth transitions\n *   when the size prop changes or buttons are added/removed.\n *\n * Note: xs/sm standard gaps are intentionally large to preserve 48dp touch targets.\n * Connected gap is always 2dp (`gap-0.5`) regardless of size.\n */\n\n// ─── ROOT ─────────────────────────────────────────────────────────────────────\n\n/**\n * Root container element — carries `group/button-group` scope via the styled layer.\n *\n * Handles:\n * - Flexbox layout (inline-flex or flex)\n * - Gap between child buttons (per variant × size)\n * - Spatial motion for gap transitions\n * - Disabled state (opacity + pointer-events)\n */\nexport const buttonGroupRootVariants = cva(\n  [\n    // Layout\n    \"items-center\",\n    // Spatial motion for gap changes — standard spring (calm, utility UI)\n    \"transition-[gap] duration-spring-standard-fast-spatial ease-spring-standard-fast-spatial\",\n    // Disabled state — self-targeting data-[x]: selector on root\n    \"data-[disabled]:pointer-events-none data-[disabled]:opacity-38\",\n  ],\n  {\n    variants: {\n      /**\n       * Layout variant\n       *\n       * - `standard`: shrink-wraps to button widths (`inline-flex`)\n       * - `connected`: stretches to fill parent (`flex w-full`)\n       */\n      variant: {\n        standard: \"inline-flex\",\n        connected: \"flex w-full\",\n      },\n\n      /**\n       * Size tier — controls the inner gap for the standard variant.\n       * For the connected variant, gap is always overridden to `gap-0.5`.\n       */\n      size: {\n        \"extra-small\": \"\",\n        small: \"\",\n        medium: \"\",\n        large: \"\",\n        \"extra-large\": \"\",\n      },\n    },\n\n    /**\n     * Compound variants that set the correct gap per (variant × size) combination.\n     */\n    compoundVariants: [\n      // Standard variant — larger gaps preserve 48dp touch targets\n      { variant: \"standard\", size: \"extra-small\", className: \"gap-[18px]\" },\n      { variant: \"standard\", size: \"small\", className: \"gap-3\" },\n      { variant: \"standard\", size: \"medium\", className: \"gap-2\" },\n      { variant: \"standard\", size: \"large\", className: \"gap-2\" },\n      { variant: \"standard\", size: \"extra-large\", className: \"gap-2\" },\n\n      // Connected variant — always 2dp gap (gap-0.5 = 2px at default spacing)\n      { variant: \"connected\", size: \"extra-small\", className: \"gap-0.5\" },\n      { variant: \"connected\", size: \"small\", className: \"gap-0.5\" },\n      { variant: \"connected\", size: \"medium\", className: \"gap-0.5\" },\n      { variant: \"connected\", size: \"large\", className: \"gap-0.5\" },\n      { variant: \"connected\", size: \"extra-large\", className: \"gap-0.5\" },\n    ],\n\n    defaultVariants: {\n      variant: \"standard\",\n      size: \"medium\",\n    },\n  }\n);\n\n// ─── FOCUS RING ───────────────────────────────────────────────────────────────\n\n/**\n * Focus ring overlay for the group container.\n *\n * Visible only when the group itself receives keyboard focus (rare — typically\n * focus goes to child buttons). Included for completeness and edge cases where\n * the group container might receive programmatic focus.\n *\n * Uses the same pattern as Switch/Button focus rings:\n * - Always in DOM (opacity-0)\n * - Transitions to opacity-100 on group-data-[focus-visible]\n */\nexport const buttonGroupFocusRingVariants = cva([\n  \"pointer-events-none absolute inset-[-3px] rounded-[inherit]\",\n  \"outline outline-2 outline-offset-0 outline-secondary\",\n  \"transition-opacity duration-spring-standard-fast-effects ease-spring-standard-fast-effects\",\n  \"opacity-0\",\n  \"group-data-[focus-visible]/button-group:opacity-100\",\n]);\n\n// ─── BACKWARD COMPAT ──────────────────────────────────────────────────────────\n\n/**\n * @deprecated Use `buttonGroupRootVariants` instead.\n * Kept for backward compatibility during migration.\n */\nexport const buttonGroupVariants = buttonGroupRootVariants;\n\n// ─── EXPORTED TYPES ───────────────────────────────────────────────────────────\n\nexport type ButtonGroupRootVariants = VariantProps<typeof buttonGroupRootVariants>;\nexport type ButtonGroupFocusRingVariants = VariantProps<typeof buttonGroupFocusRingVariants>;\n\n/**\n * @deprecated Use `ButtonGroupRootVariants` instead.\n */\nexport type ButtonGroupVariants = ButtonGroupRootVariants;\n","\"use client\";\n\nimport { forwardRef, useCallback, useEffect, useRef, useMemo } from \"react\";\nimport type React from \"react\";\nimport { ButtonGroupHeadless } from \"./ButtonGroupHeadless\";\nimport { buttonGroupRootVariants } from \"./ButtonGroup.variants\";\nimport { cn } from \"../../utils/cn\";\nimport { getInteractionDataAttributes } from \"../../utils/interactionStates\";\nimport type { ButtonGroupProps } from \"./ButtonGroup.types\";\n\n/**\n * Material Design 3 ButtonGroup Component (Layer 3: Styled)\n *\n * Built on the Variants-vs-States architecture: interaction/selection states\n * are expressed as data-* attributes on the root and consumed by child slots\n * via group-data-[x]/button-group Tailwind selectors.\n *\n * An invisible container that:\n * - Applies MD3-spec gap between child buttons with spatial spring transitions\n * - Manages selection state (single / multi / required) across toggle buttons\n * - Passes shape, size, variant, and disabled metadata to children via React Context\n * - Emits container-level state attributes for CSS targeting\n *\n * Container data attributes:\n * - `data-connected`      — variant is \"connected\"\n * - `data-has-selection`  — at least one child button is selected\n * - `data-selection-mode` — \"single\" | \"required\" | \"multi\"\n * - `data-disabled`       — group is non-interactive (via getInteractionDataAttributes)\n *\n * Variants:\n * - `standard`: Buttons float independently. Gap is larger for xs/sm to preserve\n *   48dp touch targets. Shape morphs transiently on press/select.\n * - `connected`: Buttons are visually joined with a 2dp gap. Only the pressed\n *   button's shape changes; adjacent buttons are unaffected.\n *\n * Selection modes:\n * - `single`: At most one button selected; deselectable.\n * - `required`: Exactly one always selected; pressing the active button is a no-op.\n * - `multi`: Any number of buttons selected simultaneously.\n *\n * Motion:\n * - Gap transitions use spring-standard-fast-spatial (350ms) for smooth layout changes\n * - Border-radius morphing on child buttons uses expressive-fast-spatial (350ms, overshoot)\n * - Color/opacity effects on children use spring-standard-fast-effects (150ms, no overshoot)\n *\n * @example\n * ```tsx\n * // Standard icon-button group (no selection management)\n * <ButtonGroup variant=\"standard\" size=\"medium\" aria-label=\"Quick settings\">\n *   <IconButton aria-label=\"Bluetooth\"><BluetoothIcon /></IconButton>\n *   <IconButton aria-label=\"Alarm\"><AlarmIcon /></IconButton>\n * </ButtonGroup>\n *\n * // Connected size-picker — required single selection\n * <ButtonGroup\n *   variant=\"connected\"\n *   selectionMode=\"required\"\n *   defaultValue=\"8oz\"\n *   aria-label=\"Drink size\"\n * >\n *   <Button value=\"8oz\">8 oz</Button>\n *   <Button value=\"12oz\">12 oz</Button>\n *   <Button value=\"16oz\">16 oz</Button>\n * </ButtonGroup>\n *\n * // Disabled group\n * <ButtonGroup variant=\"connected\" isDisabled aria-label=\"Unavailable options\">\n *   <Button value=\"a\">A</Button>\n *   <Button value=\"b\">B</Button>\n * </ButtonGroup>\n * ```\n */\nexport const ButtonGroup = forwardRef<HTMLDivElement, ButtonGroupProps>(\n  (\n    {\n      variant = \"standard\",\n      size = \"medium\",\n      shape = \"round\",\n      selectionMode,\n      selectedValues,\n      onSelectionChange,\n      defaultValue,\n      isDisabled = false,\n      children,\n      className,\n      ...htmlProps\n    },\n    ref\n  ) => {\n    const containerRef = useRef<HTMLDivElement>(null);\n\n    const handleRef = useCallback(\n      (node: HTMLDivElement | null) => {\n        (containerRef as React.MutableRefObject<HTMLDivElement | null>).current = node;\n        if (typeof ref === \"function\") {\n          ref(node);\n        } else if (ref !== null) {\n          ref.current = node;\n        }\n      },\n      [ref]\n    );\n\n    // Compute whether the group has any active selection\n    const hasSelection = useMemo(() => {\n      if (selectedValues) return selectedValues.size > 0;\n      if (defaultValue) {\n        return Array.isArray(defaultValue) ? defaultValue.length > 0 : true;\n      }\n      return false;\n    }, [selectedValues, defaultValue]);\n\n    // Development warnings — synchronous child-prop scan\n    if (process.env.NODE_ENV === \"development\") {\n      const childArray = Array.isArray(children) ? children : [children];\n\n      for (const child of childArray) {\n        if (!child || typeof child !== \"object\" || !(\"props\" in (child as object))) continue;\n\n        const childEl = child as React.ReactElement<{\n          \"data-variant\"?: string;\n        }>;\n\n        const dataVariant = childEl.props[\"data-variant\"];\n        if (dataVariant === \"text\" || dataVariant === \"icon\" || dataVariant === \"standard\") {\n          console.warn(\n            \"[ButtonGroup] text, icon, or standard variant buttons are not recommended inside a ButtonGroup.\",\n            `Found child with data-variant=\"${dataVariant}\". Use filled, tonal, or outlined buttons instead.`\n          );\n        }\n      }\n    }\n\n    // Development warnings — DOM inspection after mount (async, needs rendered DOM)\n    useEffect(() => {\n      if (process.env.NODE_ENV !== \"development\") return;\n      if (variant !== \"connected\" || !containerRef.current) return;\n\n      const toggleButtons = containerRef.current.querySelectorAll(\"[aria-pressed]\");\n      if (toggleButtons.length === 0) {\n        console.warn(\n          \"[ButtonGroup] The `connected` variant is designed for toggle button groups.\",\n          'None of the child buttons have `aria-pressed`. Use `selectionMode` on the group and ensure children expose `aria-pressed`, or switch to `variant=\"standard\"` for action-only groups.'\n        );\n      }\n\n      const colorValues = new Set<string>();\n      containerRef.current.querySelectorAll(\"[data-color]\").forEach((el) => {\n        const c = el.getAttribute(\"data-color\");\n        if (c) colorValues.add(c);\n      });\n      if (colorValues.size > 1) {\n        console.warn(\n          \"[ButtonGroup] Mixing color styles inside a `connected` group is not recommended.\",\n          `Found buttons with different data-color values: ${[...colorValues].join(\", \")}. Use the same color style for all buttons in a connected group.`\n        );\n      }\n      // eslint-disable-next-line react-hooks/exhaustive-deps\n    }, []);\n\n    return (\n      <ButtonGroupHeadless\n        {...htmlProps}\n        ref={handleRef}\n        variant={variant}\n        size={size}\n        shape={shape}\n        selectionMode={selectionMode}\n        selectedValues={selectedValues}\n        onSelectionChange={onSelectionChange}\n        defaultValue={defaultValue}\n        isDisabled={isDisabled}\n        className={cn(buttonGroupRootVariants({ variant, size }), \"group/button-group\", className)}\n        // ── Interaction data attributes (from component state) ─────────────\n        {...getInteractionDataAttributes({ isDisabled })}\n        // ── Container state attributes (describe group-level state) ────────\n        data-connected={variant === \"connected\" ? \"\" : undefined}\n        data-has-selection={hasSelection ? \"\" : undefined}\n        data-selection-mode={selectionMode ?? undefined}\n      >\n        {children}\n      </ButtonGroupHeadless>\n    );\n  }\n);\n\nButtonGroup.displayName = \"ButtonGroup\";\n","\"use client\";\n\nimport { forwardRef, useRef } from \"react\";\nimport { useButton, useHover, useFocusRing } from \"react-aria\";\nimport { mergeProps, filterDOMProps } from \"@react-aria/utils\";\nimport type { AriaButtonProps } from \"react-aria\";\nimport { getInteractionDataAttributes } from \"../../utils/interactionStates\";\n\n/**\n * Headless IconButton Component (Layer 2)\n *\n * Unstyled icon button primitive using React Aria for accessibility.\n * Provides behavior AND emits MD3-compliant data-* interaction attributes\n * so the styled Layer 3 can drive all visual states through CSS alone.\n *\n * Emitted data attributes (via getInteractionDataAttributes):\n * - `data-hovered`       — pointer is over the button\n * - `data-focus-visible` — keyboard/programmatic focus is visible\n * - `data-pressed`       — button is being pressed\n * - `data-selected`      — toggle button is in the ON state\n * - `data-disabled`      — button is non-interactive\n *\n * Content flags (set explicitly):\n * - `data-toggle`        — button is a toggle (selected prop is defined)\n *\n * Features:\n * - Full keyboard navigation (Enter, Space)\n * - Screen reader support (aria-pressed for toggle buttons)\n * - Touch/pointer event handling\n * - Focus management\n * - Hover detection (useHover — pointer-only, not keyboard)\n * - Disabled state handling\n *\n * @example\n * ```tsx\n * // Advanced custom styling\n * <IconButtonHeadless\n *   aria-label=\"Delete\"\n *   className=\"group/icon-button my-custom-classes\"\n *   isSelected={false}\n *   isToggle={false}\n *   isDisabled={false}\n * >\n *   <IconDelete />\n * </IconButtonHeadless>\n * ```\n */\nexport interface IconButtonHeadlessProps extends AriaButtonProps {\n  /** Additional CSS classes */\n  className?: string;\n\n  /** Icon content */\n  children: React.ReactNode;\n\n  /** Tab index for keyboard navigation @default 0 */\n  tabIndex?: number;\n\n  /** Mouse down handler (for ripple effect) */\n  onMouseDown?: (e: React.MouseEvent<HTMLButtonElement>) => void;\n\n  /** Button type attribute @default 'button' */\n  type?: \"button\" | \"submit\" | \"reset\";\n\n  /**\n   * Toggle selected state.\n   * When defined, sets aria-pressed and emits data-selected / data-toggle.\n   */\n  isSelected?: boolean;\n\n  /**\n   * Whether this button behaves as a toggle (i.e. selected prop was passed).\n   * Drives `data-toggle` attribute; determines whether aria-pressed is set.\n   */\n  isToggle?: boolean;\n\n  /** Whether the button is disabled */\n  isDisabled?: boolean;\n\n  /** REQUIRED: Accessible label for screen readers */\n  \"aria-label\": string;\n\n  /** HTML title attribute for tooltip */\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      isSelected,\n      isToggle = false,\n      isDisabled = false,\n      \"aria-label\": ariaLabel,\n      title,\n      ...props\n    },\n    forwardedRef\n  ) => {\n    const internalRef = useRef<HTMLButtonElement>(null);\n    const ref = (forwardedRef ?? internalRef) as React.RefObject<HTMLButtonElement>;\n\n    // React Aria hooks — behavior layer\n    const { buttonProps, isPressed } = useButton(\n      {\n        ...props,\n        elementType: \"button\",\n        \"aria-label\": ariaLabel,\n        isDisabled,\n      },\n      ref\n    );\n\n    const { isHovered, hoverProps } = useHover({ isDisabled });\n    const { isFocusVisible, focusProps } = useFocusRing();\n\n    // Filter non-DOM props before spreading\n    const domProps = filterDOMProps(props);\n\n    const mergedProps = mergeProps(buttonProps, hoverProps, focusProps, domProps, {\n      tabIndex,\n      className,\n      onMouseDown,\n      type: type ?? \"button\",\n      ...(title && { title }),\n      // aria-pressed only when acting as a toggle button\n      ...(isToggle && { \"aria-pressed\": isSelected ?? false }),\n    }) as React.ButtonHTMLAttributes<HTMLButtonElement>;\n\n    return (\n      <button\n        {...mergedProps}\n        ref={ref}\n        type={type === \"submit\" ? \"submit\" : type === \"reset\" ? \"reset\" : \"button\"}\n        // Interaction state attributes — consumed by group-data-[x]/icon-button selectors\n        {...getInteractionDataAttributes({\n          isHovered,\n          isFocusVisible,\n          isPressed,\n          ...(isToggle ? { isSelected: isSelected ?? false } : {}),\n          isDisabled,\n        })}\n        // Content flag: present when acting as a toggle, absent otherwise\n        data-toggle={isToggle ? \"\" : undefined}\n      >\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 Expressive — IconButton Variants (slot-based CVA)\n *\n * Architecture: Variants vs States\n * ─────────────────────────────────\n * - CVA holds design-time choices only (variant, color, size, width, shape).\n * - All interaction/selection states are driven by data-* attributes on the\n *   root via group-data-[x]/icon-button Tailwind selectors in each slot's base\n *   classes — no state variants in CVA.\n * - compoundVariants = variant × color (and size × shape) only.\n *\n * CSS role-variable technique\n * ────────────────────────────\n * Per-variant colors are set as CSS custom properties via compoundVariants so\n * the state selectors in base classes only need to read the variable — they\n * never need to know the current variant/color.\n *\n *   --ib-bg            container background (at rest, non-toggleable)\n *   --ib-bg-off        container background when toggleable + unselected\n *   --ib-bg-on         container background when selected\n *   --ib-fg            icon/text color (at rest)\n *   --ib-fg-off        icon/text color when toggleable + unselected\n *   --ib-fg-on         icon/text color when selected\n *   --ib-sl            state layer color\n *   --ib-border        border color (outlined unselected)\n *   --ib-radius        corner radius at rest\n *   --ib-radius-press  corner radius when pressed (shape-morph)\n *\n * Slot responsibilities\n * ──────────────────────\n *   iconButtonRootVariants      — root button; carries group/icon-button, cursor,\n *                                 overflow, corner radius + transitions, min touch target\n *   iconButtonStateLayerVariants — hover/focus/pressed opacity ring (absolute overlay)\n *   iconButtonIconVariants       — icon wrapper; color + size only\n *\n * M3 Expressive Sizes (container height × icon size)\n * ───────────────────────────────────────────────────\n *   xsmall:  32dp / 20dp icon   → h-8  / icon size-5\n *   small:   40dp / 24dp icon   → h-10 / icon size-6\n *   medium:  56dp / 24dp icon   → h-14 / icon size-6  (default)\n *   large:   96dp / 32dp icon   → h-24 / icon size-8\n *   xlarge: 136dp / 40dp icon   → h-34 / icon size-10\n *\n * Width variants (narrow / default / wide) adjust container width per size:\n *   xsmall:  narrow 24dp / default 32dp / wide 40dp\n *   small:   narrow 32dp / default 40dp / wide 52dp\n *   medium:  narrow 48dp / default 56dp / wide 72dp\n *   large:   narrow 72dp / default 96dp / wide 128dp\n *   xlarge: narrow 96dp / default 136dp / wide 168dp\n *\n * Shape:\n *   round  → per-size half-height radius (true circle: xsmall 16px … xlarge 68px)\n *            Press morphs to the size-tiered square corner (e.g. medium 28px → 16px).\n *            Using exact half-height (not 9999px) keeps the morph distance small so\n *            emphasized-decelerate produces a smooth transition with no overshoot clamp.\n *   square → size-tiered corner at rest; no press morph.\n *\n * Press shape morph (round only): on data-[pressed] the radius shrinks to\n * --ib-radius-press (= MD3 square corner for that size tier).\n * Smooth because btn-transition uses emphasized-decelerate (no overshoot) for\n * border-radius. The old 9999px radius caused the spring to overshoot below 0,\n * producing a sharp-corner flash before settling.\n *\n * MD3 state-layer opacities:\n *   hover        opacity-8  (8%)\n *   focus-visible opacity-10 (10%)\n *   pressed      opacity-10 (10%)\n *   disabled container  bg-on-surface/12\n *   disabled content    text-on-surface/38\n */\n\n// ─── SHAPE CORNER RADIUS REFERENCE ───────────────────────────────────────────\n// Round rest radius (half container height → true circle):\n//   xsmall (32dp) → 16px = 1rem\n//   small  (40dp) → 20px = 1.25rem\n//   medium (56dp) → 28px = 1.75rem\n//   large  (96dp) → 48px = 3rem\n//   xlarge(136dp) → 68px = 4.25rem\n//\n// Square rest radius / round press-morph target (MD3 shape scale):\n//   xsmall / small → 12px = 0.75rem\n//   medium         → 16px = 1rem\n//   large / xlarge → 28px = 1.75rem\n\n// ─── ROOT ─────────────────────────────────────────────────────────────────────\n\n/**\n * Root button element.\n *\n * Carries:\n * - `group/icon-button` for child slot selectors\n * - Container dimensions (height × width per size × width-variant)\n * - Corner radius via --ib-radius CSS variable + shape-morph on press\n * - Background, border, text color consumed from --ib-* role variables\n * - Focus ring via group-data-[focus-visible]\n * - MD3-correct disabled (content opacity, not blanket opacity)\n */\nexport const iconButtonRootVariants = cva(\n  [\n    // Layout\n    \"relative inline-flex items-center justify-center\",\n    \"cursor-pointer select-none\",\n    \"overflow-hidden\",\n\n    // Corner radius driven by CSS variable — set per shape×size in compoundVariants.\n    // Fallback 9999px is only reached if both shape and size props are absent,\n    // which cannot happen in normal usage.\n    \"rounded-[var(--ib-radius,9999px)]\",\n\n    // Split MD3 transition via the existing btn-transition utility:\n    //   border-radius  → emphasized-decelerate (no overshoot, no sharp-corner flash)\n    //   color/bg/border/opacity → standard-fast-effects (no overshoot on effects)\n    // This is identical to the approach used by Button/connected ButtonGroup and is\n    // the standard fix for the 9999px overshoot problem documented in styles.css.\n    \"btn-transition\",\n\n    // Background + border + text driven from CSS role variables\n    \"bg-[var(--ib-bg,transparent)]\",\n    \"border border-[var(--ib-border,transparent)]\",\n    \"text-[var(--ib-fg,currentColor)]\",\n\n    // Toggle: off state (data-toggle present but data-selected absent)\n    // Uses doubly-chained selector to beat single-chain specificity of defaults\n    \"data-[toggle]:bg-[var(--ib-bg-off,var(--ib-bg,transparent))]\",\n    \"data-[toggle]:text-[var(--ib-fg-off,var(--ib-fg,currentColor))]\",\n\n    // Selected state\n    \"data-[selected]:bg-[var(--ib-bg-on,var(--ib-bg,transparent))]\",\n    \"data-[selected]:text-[var(--ib-fg-on,var(--ib-fg,currentColor))]\",\n    \"data-[selected]:border-transparent\",\n\n    // Press shape-morph: radius collapses to --ib-radius-press on press\n    // (only has visual effect when --ib-radius-press differs from --ib-radius)\n    \"data-[pressed]:rounded-[var(--ib-radius-press,var(--ib-radius,9999px))]\",\n\n    // Focus ring (outline, not a state layer — stays outside overflow-hidden\n    // because it's drawn as outline on the root element itself)\n    \"outline-none\",\n    \"group-data-[focus-visible]/icon-button:outline-2\",\n    \"group-data-[focus-visible]/icon-button:outline-offset-2\",\n    \"group-data-[focus-visible]/icon-button:outline-secondary\",\n\n    // Disabled — content opacity 38%, container handled per variant via CSS vars\n    \"data-[disabled]:cursor-not-allowed data-[disabled]:pointer-events-none\",\n    \"data-[disabled]:text-on-surface/38\",\n    // Filled/tonal/outlined-selected backgrounds collapse to on-surface/12 — set\n    // via compoundVariants on the root for variants that have a container.\n    // For variants with transparent bg (standard, outlined-unselected) we do nothing.\n  ],\n  {\n    variants: {\n      /**\n       * Visual style variant (MD3 icon button types)\n       */\n      variant: {\n        standard: \"\",\n        filled: \"data-[disabled]:bg-on-surface/12\",\n        tonal: \"data-[disabled]:bg-on-surface/12\",\n        outlined: \"\",\n      },\n\n      /**\n       * Color scheme — sets CSS role variables via compoundVariants.\n       */\n      color: {\n        primary: \"\",\n        secondary: \"\",\n        tertiary: \"\",\n        error: \"\",\n      },\n\n      /**\n       * Size tier (M3 Expressive 5-tier)\n       */\n      size: {\n        xsmall: \"h-8\",\n        small: \"h-10\",\n        medium: \"h-14\",\n        large: \"h-24\",\n        xlarge: \"h-[8.5rem]\",\n      },\n\n      /**\n       * Width variant — adjusts container width\n       */\n      width: {\n        narrow: \"\",\n        default: \"\",\n        wide: \"\",\n      },\n\n      /**\n       * Shape — base values only; per-size radii set via compoundVariants below.\n       *\n       * round:  --ib-radius = half the container height (true circle), set per size.\n       *         --ib-radius-press = square corner for that size (set per size).\n       *         Morph distance is small (e.g. 28px → 16px for medium), so the\n       *         emphasized-decelerate curve from btn-transition produces a smooth,\n       *         non-overshooting transition. The old 9999px fallback caused the\n       *         spring to overshoot below 0 = sharp-corner flash.\n       * square: --ib-radius = size-tiered MD3 corner, set per size. No press morph.\n       */\n      shape: {\n        round: [],\n        square: [],\n      },\n    },\n\n    compoundVariants: [\n      // ══════════════════════════════════════════════════════════════════════\n      // SIZE × WIDTH — container width\n      // ══════════════════════════════════════════════════════════════════════\n      { size: \"xsmall\", width: \"narrow\", className: \"w-6\" },\n      { size: \"xsmall\", width: \"default\", className: \"w-8\" },\n      { size: \"xsmall\", width: \"wide\", className: \"w-10\" },\n\n      { size: \"small\", width: \"narrow\", className: \"w-8\" },\n      { size: \"small\", width: \"default\", className: \"w-10\" },\n      { size: \"small\", width: \"wide\", className: \"w-13\" },\n\n      { size: \"medium\", width: \"narrow\", className: \"w-12\" },\n      { size: \"medium\", width: \"default\", className: \"w-14\" },\n      { size: \"medium\", width: \"wide\", className: \"w-18\" },\n\n      { size: \"large\", width: \"narrow\", className: \"w-18\" },\n      { size: \"large\", width: \"default\", className: \"w-24\" },\n      { size: \"large\", width: \"wide\", className: \"w-32\" },\n\n      { size: \"xlarge\", width: \"narrow\", className: \"w-24\" },\n      { size: \"xlarge\", width: \"default\", className: \"w-[8.5rem]\" },\n      { size: \"xlarge\", width: \"wide\", className: \"w-42\" },\n\n      // ══════════════════════════════════════════════════════════════════════\n      // SHAPE × SIZE — corner radii for both round and square shapes\n      // ══════════════════════════════════════════════════════════════════════\n      //\n      // Round rest radius = half container height (true circle).\n      // Using the exact half-height keeps the morph distance small, so the\n      // no-overshoot emphasized-decelerate curve in btn-transition produces a\n      // smooth animation. Using 9999px was the original cause of the sharp-\n      // corner flash (the spring overshoots below 0 before settling).\n      //\n      //   xsmall h-8  = 32px  → half = 16px = 1rem\n      //   small  h-10 = 40px  → half = 20px = 1.25rem\n      //   medium h-14 = 56px  → half = 28px = 1.75rem\n      //   large  h-24 = 96px  → half = 48px = 3rem\n      //   xlarge h-34 = 136px → half = 68px = 4.25rem\n      //\n      // Round press-morph target = MD3 square corner for that size tier.\n      // Square rest radius = same MD3 corner (no morph).\n\n      // ── round: rest radius (half height) ──────────────────────────────────\n      { shape: \"round\", size: \"xsmall\", className: \"[--ib-radius:1rem]\" },\n      { shape: \"round\", size: \"small\", className: \"[--ib-radius:1.25rem]\" },\n      { shape: \"round\", size: \"medium\", className: \"[--ib-radius:1.75rem]\" },\n      { shape: \"round\", size: \"large\", className: \"[--ib-radius:3rem]\" },\n      { shape: \"round\", size: \"xlarge\", className: \"[--ib-radius:4.25rem]\" },\n\n      // ── round: press-morph target (square corner for that size) ───────────\n      { shape: \"round\", size: \"xsmall\", className: \"[--ib-radius-press:0.75rem]\" },\n      { shape: \"round\", size: \"small\", className: \"[--ib-radius-press:0.75rem]\" },\n      { shape: \"round\", size: \"medium\", className: \"[--ib-radius-press:1rem]\" },\n      { shape: \"round\", size: \"large\", className: \"[--ib-radius-press:1.75rem]\" },\n      { shape: \"round\", size: \"xlarge\", className: \"[--ib-radius-press:1.75rem]\" },\n\n      // ── square: rest radius (MD3 shape scale) ─────────────────────────────\n      // xsmall / small → 12px (0.75rem), medium → 16px (1rem), large / xlarge → 28px (1.75rem)\n      { shape: \"square\", size: \"xsmall\", className: \"[--ib-radius:0.75rem]\" },\n      { shape: \"square\", size: \"small\", className: \"[--ib-radius:0.75rem]\" },\n      { shape: \"square\", size: \"medium\", className: \"[--ib-radius:1rem]\" },\n      { shape: \"square\", size: \"large\", className: \"[--ib-radius:1.75rem]\" },\n      { shape: \"square\", size: \"xlarge\", className: \"[--ib-radius:1.75rem]\" },\n\n      // ══════════════════════════════════════════════════════════════════════\n      // VARIANT × COLOR — CSS role variable assignments\n      // Only variant × color (design-time decisions); no state variants here.\n      // ══════════════════════════════════════════════════════════════════════\n\n      // ── STANDARD ──────────────────────────────────────────────────────────\n      // Non-toggle standard: transparent bg, on-surface-variant fg\n      // Selected: primary fg\n      // State layer: on-surface-variant (unselected) / primary (selected)\n      {\n        variant: \"standard\",\n        color: \"primary\",\n        className: [\n          \"[--ib-bg:transparent]\",\n          \"[--ib-fg:var(--color-on-surface-variant)]\",\n          \"[--ib-fg-on:var(--color-primary)]\",\n          \"[--ib-sl:var(--color-on-surface-variant)]\",\n          // toggle-off same as non-toggle\n          \"[--ib-bg-off:transparent]\",\n          \"[--ib-fg-off:var(--color-on-surface-variant)]\",\n          // toggle-on: selected\n          \"[--ib-bg-on:transparent]\",\n        ],\n      },\n      {\n        variant: \"standard\",\n        color: \"secondary\",\n        className: [\n          \"[--ib-bg:transparent]\",\n          \"[--ib-fg:var(--color-on-surface-variant)]\",\n          \"[--ib-fg-on:var(--color-secondary)]\",\n          \"[--ib-sl:var(--color-on-surface-variant)]\",\n          \"[--ib-bg-off:transparent]\",\n          \"[--ib-fg-off:var(--color-on-surface-variant)]\",\n          \"[--ib-bg-on:transparent]\",\n        ],\n      },\n      {\n        variant: \"standard\",\n        color: \"tertiary\",\n        className: [\n          \"[--ib-bg:transparent]\",\n          \"[--ib-fg:var(--color-on-surface-variant)]\",\n          \"[--ib-fg-on:var(--color-tertiary)]\",\n          \"[--ib-sl:var(--color-on-surface-variant)]\",\n          \"[--ib-bg-off:transparent]\",\n          \"[--ib-fg-off:var(--color-on-surface-variant)]\",\n          \"[--ib-bg-on:transparent]\",\n        ],\n      },\n      {\n        variant: \"standard\",\n        color: \"error\",\n        className: [\n          \"[--ib-bg:transparent]\",\n          \"[--ib-fg:var(--color-on-surface-variant)]\",\n          \"[--ib-fg-on:var(--color-error)]\",\n          \"[--ib-sl:var(--color-on-surface-variant)]\",\n          \"[--ib-bg-off:transparent]\",\n          \"[--ib-fg-off:var(--color-on-surface-variant)]\",\n          \"[--ib-bg-on:transparent]\",\n        ],\n      },\n\n      // ── FILLED ────────────────────────────────────────────────────────────\n      // Non-toggle: bg primary / fg on-primary\n      // Toggle off: bg surface-container-highest / fg primary\n      // Toggle on (selected): bg primary / fg on-primary\n      // State layer: on-primary (non-toggle / selected), primary (toggle-off)\n      {\n        variant: \"filled\",\n        color: \"primary\",\n        className: [\n          \"[--ib-bg:var(--color-primary)]\",\n          \"[--ib-fg:var(--color-on-primary)]\",\n          \"[--ib-sl:var(--color-on-primary)]\",\n          \"[--ib-bg-off:var(--color-surface-container-highest)]\",\n          \"[--ib-fg-off:var(--color-primary)]\",\n          \"[--ib-bg-on:var(--color-primary)]\",\n          \"[--ib-fg-on:var(--color-on-primary)]\",\n        ],\n      },\n      {\n        variant: \"filled\",\n        color: \"secondary\",\n        className: [\n          \"[--ib-bg:var(--color-secondary)]\",\n          \"[--ib-fg:var(--color-on-secondary)]\",\n          \"[--ib-sl:var(--color-on-secondary)]\",\n          \"[--ib-bg-off:var(--color-surface-container-highest)]\",\n          \"[--ib-fg-off:var(--color-secondary)]\",\n          \"[--ib-bg-on:var(--color-secondary)]\",\n          \"[--ib-fg-on:var(--color-on-secondary)]\",\n        ],\n      },\n      {\n        variant: \"filled\",\n        color: \"tertiary\",\n        className: [\n          \"[--ib-bg:var(--color-tertiary)]\",\n          \"[--ib-fg:var(--color-on-tertiary)]\",\n          \"[--ib-sl:var(--color-on-tertiary)]\",\n          \"[--ib-bg-off:var(--color-surface-container-highest)]\",\n          \"[--ib-fg-off:var(--color-tertiary)]\",\n          \"[--ib-bg-on:var(--color-tertiary)]\",\n          \"[--ib-fg-on:var(--color-on-tertiary)]\",\n        ],\n      },\n      {\n        variant: \"filled\",\n        color: \"error\",\n        className: [\n          \"[--ib-bg:var(--color-error)]\",\n          \"[--ib-fg:var(--color-on-error)]\",\n          \"[--ib-sl:var(--color-on-error)]\",\n          \"[--ib-bg-off:var(--color-surface-container-highest)]\",\n          \"[--ib-fg-off:var(--color-error)]\",\n          \"[--ib-bg-on:var(--color-error)]\",\n          \"[--ib-fg-on:var(--color-on-error)]\",\n        ],\n      },\n\n      // ── TONAL ─────────────────────────────────────────────────────────────\n      // Non-toggle: bg secondary-container / fg on-secondary-container\n      // Toggle off: bg surface-container-highest / fg on-surface-variant\n      // Toggle on (selected): bg secondary-container / fg on-secondary-container\n      {\n        variant: \"tonal\",\n        color: \"primary\",\n        className: [\n          \"[--ib-bg:var(--color-secondary-container)]\",\n          \"[--ib-fg:var(--color-on-secondary-container)]\",\n          \"[--ib-sl:var(--color-on-secondary-container)]\",\n          \"[--ib-bg-off:var(--color-surface-container-highest)]\",\n          \"[--ib-fg-off:var(--color-on-surface-variant)]\",\n          \"[--ib-bg-on:var(--color-secondary-container)]\",\n          \"[--ib-fg-on:var(--color-on-secondary-container)]\",\n        ],\n      },\n      {\n        variant: \"tonal\",\n        color: \"secondary\",\n        className: [\n          \"[--ib-bg:var(--color-secondary-container)]\",\n          \"[--ib-fg:var(--color-on-secondary-container)]\",\n          \"[--ib-sl:var(--color-on-secondary-container)]\",\n          \"[--ib-bg-off:var(--color-surface-container-highest)]\",\n          \"[--ib-fg-off:var(--color-on-surface-variant)]\",\n          \"[--ib-bg-on:var(--color-secondary-container)]\",\n          \"[--ib-fg-on:var(--color-on-secondary-container)]\",\n        ],\n      },\n      {\n        variant: \"tonal\",\n        color: \"tertiary\",\n        className: [\n          \"[--ib-bg:var(--color-tertiary-container)]\",\n          \"[--ib-fg:var(--color-on-tertiary-container)]\",\n          \"[--ib-sl:var(--color-on-tertiary-container)]\",\n          \"[--ib-bg-off:var(--color-surface-container-highest)]\",\n          \"[--ib-fg-off:var(--color-on-surface-variant)]\",\n          \"[--ib-bg-on:var(--color-tertiary-container)]\",\n          \"[--ib-fg-on:var(--color-on-tertiary-container)]\",\n        ],\n      },\n      {\n        variant: \"tonal\",\n        color: \"error\",\n        className: [\n          \"[--ib-bg:var(--color-error-container)]\",\n          \"[--ib-fg:var(--color-on-error-container)]\",\n          \"[--ib-sl:var(--color-on-error-container)]\",\n          \"[--ib-bg-off:var(--color-surface-container-highest)]\",\n          \"[--ib-fg-off:var(--color-on-surface-variant)]\",\n          \"[--ib-bg-on:var(--color-error-container)]\",\n          \"[--ib-fg-on:var(--color-on-error-container)]\",\n        ],\n      },\n\n      // ── OUTLINED ──────────────────────────────────────────────────────────\n      // Non-toggle: transparent bg, border-outline, on-surface-variant fg\n      // Toggle off: same as non-toggle\n      // Toggle on (selected): inverse-surface bg, inverse-on-surface fg, no border\n      // Disabled: border becomes on-surface/12 (set via Tailwind utility on root)\n      {\n        variant: \"outlined\",\n        color: \"primary\",\n        className: [\n          \"[--ib-bg:transparent]\",\n          \"[--ib-fg:var(--color-on-surface-variant)]\",\n          \"[--ib-sl:var(--color-on-surface-variant)]\",\n          \"[--ib-border:var(--color-outline)]\",\n          \"[--ib-bg-off:transparent]\",\n          \"[--ib-fg-off:var(--color-on-surface-variant)]\",\n          \"[--ib-bg-on:var(--color-inverse-surface)]\",\n          \"[--ib-fg-on:var(--color-inverse-on-surface)]\",\n          // Disabled outlined border\n          \"data-[disabled]:border-on-surface/12\",\n        ],\n      },\n      {\n        variant: \"outlined\",\n        color: \"secondary\",\n        className: [\n          \"[--ib-bg:transparent]\",\n          \"[--ib-fg:var(--color-on-surface-variant)]\",\n          \"[--ib-sl:var(--color-on-surface-variant)]\",\n          \"[--ib-border:var(--color-outline)]\",\n          \"[--ib-bg-off:transparent]\",\n          \"[--ib-fg-off:var(--color-on-surface-variant)]\",\n          \"[--ib-bg-on:var(--color-inverse-surface)]\",\n          \"[--ib-fg-on:var(--color-inverse-on-surface)]\",\n          \"data-[disabled]:border-on-surface/12\",\n        ],\n      },\n      {\n        variant: \"outlined\",\n        color: \"tertiary\",\n        className: [\n          \"[--ib-bg:transparent]\",\n          \"[--ib-fg:var(--color-on-surface-variant)]\",\n          \"[--ib-sl:var(--color-on-surface-variant)]\",\n          \"[--ib-border:var(--color-outline)]\",\n          \"[--ib-bg-off:transparent]\",\n          \"[--ib-fg-off:var(--color-on-surface-variant)]\",\n          \"[--ib-bg-on:var(--color-inverse-surface)]\",\n          \"[--ib-fg-on:var(--color-inverse-on-surface)]\",\n          \"data-[disabled]:border-on-surface/12\",\n        ],\n      },\n      {\n        variant: \"outlined\",\n        color: \"error\",\n        className: [\n          \"[--ib-bg:transparent]\",\n          \"[--ib-fg:var(--color-on-surface-variant)]\",\n          \"[--ib-sl:var(--color-on-surface-variant)]\",\n          \"[--ib-border:var(--color-outline)]\",\n          \"[--ib-bg-off:transparent]\",\n          \"[--ib-fg-off:var(--color-on-surface-variant)]\",\n          \"[--ib-bg-on:var(--color-inverse-surface)]\",\n          \"[--ib-fg-on:var(--color-inverse-on-surface)]\",\n          \"data-[disabled]:border-on-surface/12\",\n        ],\n      },\n    ],\n\n    defaultVariants: {\n      variant: \"standard\",\n      color: \"primary\",\n      size: \"medium\",\n      width: \"default\",\n      shape: \"round\",\n    },\n  }\n);\n\n// ─── STATE LAYER ─────────────────────────────────────────────────────────────\n\n/**\n * State layer — absolute overlay inside the button container.\n *\n * Color driven from --ib-sl CSS variable set by the root.\n * Opacity: 0 at rest, 8% hover, 10% focus-visible, 10% pressed.\n * Hidden when disabled (no state layer on disabled MD3 components).\n *\n * Uses `group-data-[x]/icon-button` to react to the root's data attributes.\n * Note: the root itself is the group — it carries `group/icon-button`.\n * However, since this is a child element, we read `group-data-[x]/icon-button`\n * from the parent's group. But the root is the button, not a wrapper div.\n * Therefore we use `data-[x]:` selectors directly (self-referential) for the\n * root and emit `group/icon-button` on the root so the state layer can read\n * via `group-data-[x]/icon-button`.\n */\nexport const iconButtonStateLayerVariants = cva([\n  \"absolute inset-0 rounded-[inherit] pointer-events-none opacity-0\",\n  \"bg-[var(--ib-sl,currentColor)]\",\n  // Effects transition (opacity — no spatial overshoot)\n  \"transition-opacity duration-spring-standard-fast-effects ease-spring-standard-fast-effects\",\n  // Interaction opacities (MD3: hover 8%, focus/pressed 10%)\n  \"group-data-[hovered]/icon-button:opacity-8\",\n  \"group-data-[focus-visible]/icon-button:opacity-10\",\n  \"group-data-[pressed]/icon-button:opacity-10\",\n  // No state layer when disabled\n  \"group-data-[disabled]/icon-button:hidden\",\n]);\n\n// ─── ICON SLOT ────────────────────────────────────────────────────────────────\n\n/**\n * Icon wrapper — size and color only, no positioning.\n *\n * Sizes match M3 Expressive icon sizes per container tier.\n * Color transitions via effects token (no spatial overshoot on color).\n *\n * Since this is inside the root (the group), we use group-data selectors.\n * Icon color inherits from the root's `text-[var(--ib-fg)]` — no need to\n * duplicate the full variable chain here; CSS `currentColor` flows through.\n */\nexport const iconButtonIconVariants = cva(\n  [\n    \"relative z-10 inline-flex shrink-0 items-center justify-center\",\n    \"transition-colors duration-spring-standard-fast-effects ease-spring-standard-fast-effects\",\n  ],\n  {\n    variants: {\n      size: {\n        xsmall: \"size-5\", // 20dp\n        small: \"size-6\", // 24dp\n        medium: \"size-6\", // 24dp\n        large: \"size-8\", // 32dp\n        xlarge: \"size-10\", // 40dp\n      },\n    },\n    defaultVariants: {\n      size: \"medium\",\n    },\n  }\n);\n\n// ─── EXPORTED TYPES ───────────────────────────────────────────────────────────\n\nexport type IconButtonRootVariants = VariantProps<typeof iconButtonRootVariants>;\nexport type IconButtonStateLayerVariants = VariantProps<typeof iconButtonStateLayerVariants>;\nexport type IconButtonIconVariants = VariantProps<typeof iconButtonIconVariants>;\n\n/**\n * Combined variants type for the IconButton component surface.\n * Excludes `isDisabled` and `selected` — those are driven by data attributes.\n */\nexport type IconButtonVariants = IconButtonRootVariants;\n","\"use client\";\n\nimport { forwardRef } from \"react\";\nimport type React from \"react\";\nimport { IconButtonHeadless } from \"./IconButtonHeadless\";\nimport {\n  iconButtonRootVariants,\n  iconButtonStateLayerVariants,\n  iconButtonIconVariants,\n} from \"./IconButton.variants\";\nimport { cn } from \"../../utils/cn\";\nimport { useRipple } from \"../../hooks/useRipple\";\nimport { mergeProps } from \"@react-aria/utils\";\nimport { useOptionalButtonGroup } from \"../ButtonGroup/ButtonGroupContext\";\nimport { getConnectedRadiusClasses } from \"../ButtonGroup/ButtonGroup.utils\";\nimport type { IconButtonProps } from \"./IconButton.types\";\n\n/**\n * Material Design 3 Expressive — IconButton Component (Layer 3: Styled)\n *\n * Built on React Aria for world-class accessibility. Implements the\n * Variants-vs-States architecture: all interaction/selection states are\n * expressed as data-* attributes (emitted by IconButtonHeadless) and consumed\n * by each slot via group-data-[x]/icon-button Tailwind selectors — no state\n * variants in CVA.\n *\n * Features:\n * - ✅ M3 Expressive 5-tier sizes: xsmall, small, medium, large, xlarge\n * - ✅ 3 width options: narrow, default, wide\n * - ✅ 2 shapes: round (circular), square (MD3 corner scale)\n * - ✅ Press shape-morph (round shape springs into square corner on press)\n * - ✅ 4 variants: standard, filled, tonal, outlined\n * - ✅ 4 color roles: primary, secondary, tertiary, error\n * - ✅ Toggle support (selected + selectedIcon)\n * - ✅ MD3-correct state layer: per-variant color, opacity-8/10/10\n * - ✅ MD3-correct disabled: content opacity-38 + container on-surface/12\n * - ✅ Ripple effect on press\n * - ✅ ButtonGroup-aware: connected corner radii + min-width\n * - ✅ Mandatory aria-label for accessibility\n *\n * @example\n * ```tsx\n * // Standard icon button\n * <IconButton aria-label=\"Delete\">\n *   <IconDelete />\n * </IconButton>\n *\n * // Filled with color, large\n * <IconButton aria-label=\"Favorite\" variant=\"filled\" color=\"error\" size=\"large\">\n *   <IconHeart />\n * </IconButton>\n *\n * // Toggle button with selectedIcon\n * <IconButton\n *   aria-label={selected ? \"Remove favorite\" : \"Add favorite\"}\n *   selected={selected}\n *   onPress={() => setSelected(!selected)}\n *   selectedIcon={<IconStarFilled />}\n * >\n *   <IconStarOutline />\n * </IconButton>\n *\n * // Square shape, wide width\n * <IconButton aria-label=\"Menu\" shape=\"square\" width=\"wide\" size=\"medium\">\n *   <IconMenu />\n * </IconButton>\n * ```\n */\nexport const IconButton = forwardRef<HTMLButtonElement, IconButtonProps>(\n  (\n    {\n      // Variant props (CVA / design-time)\n      variant = \"standard\",\n      color = \"primary\",\n      size = \"medium\",\n      width = \"default\",\n      shape = \"round\",\n      // IconButton specific props\n      children,\n      selectedIcon,\n      value,\n      selected,\n      disableRipple = false,\n      className,\n      // React Aria props\n      isDisabled = false,\n      onPress,\n      onMouseDown,\n      \"aria-label\": ariaLabel,\n      title,\n      ...props\n    },\n    ref\n  ) => {\n    // ButtonGroup context — null when rendered outside a group\n    const groupCtx = useOptionalButtonGroup();\n    const isConnected = groupCtx?.variant === \"connected\";\n\n    // Development warnings\n    if (process.env.NODE_ENV === \"development\") {\n      if (!ariaLabel) {\n        console.error(\n          \"[IconButton] aria-label is required for IconButton. Icon-only buttons need accessible labels for screen readers.\"\n        );\n      }\n      if (!children) {\n        console.warn(\"[IconButton] IconButton should have an icon as children.\");\n      }\n    }\n\n    // Toggle behaviour: `selected` being defined (even as false) signals a toggle button\n    const isToggle = selected !== undefined;\n    const isSelected = isToggle ? (selected ?? false) : false;\n\n    // Ripple effect\n    const { onMouseDown: handleRipple, ripples } = useRipple({\n      disabled: isDisabled || disableRipple,\n    });\n\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    // ButtonGroup connected-variant radius + min-width overrides\n    const isGroupSelected =\n      isConnected && groupCtx && value ? groupCtx.selectedValues.has(value) : false;\n\n    const connectedClasses =\n      isConnected && groupCtx\n        ? [\n            ...getConnectedRadiusClasses(groupCtx, value),\n            groupCtx.enforceMinWidth ? \"min-w-12\" : \"\",\n          ]\n        : [];\n\n    // Determine which icon to render\n    const iconNode = isToggle && isSelected && selectedIcon ? selectedIcon : children;\n\n    return (\n      <IconButtonHeadless\n        ref={ref}\n        className={cn(\n          // Root CVA — sets CSS role variables, dimensions, shape, transitions\n          iconButtonRootVariants({ variant, color, size, width, shape }),\n          // Group scope for child slot selectors\n          \"group/icon-button\",\n          // ButtonGroup asymmetric border-radius easing (connected selection morph)\n          isGroupSelected ? \"btn-transition-selected\" : \"\",\n          // Connected group corner radius + min-width overrides\n          ...connectedClasses,\n          // Consumer custom classes\n          className\n        )}\n        aria-label={ariaLabel}\n        isSelected={isSelected}\n        isToggle={isToggle}\n        // Data attributes for external CSS targeting + Storybook/test assertions\n        data-variant={variant}\n        data-color={color}\n        data-size={size}\n        data-width={width}\n        data-shape={shape}\n        // ButtonGroup selection shape-morph targeting\n        data-group-selected={isGroupSelected ? \"\" : undefined}\n        {...(title && { title })}\n        {...mergedPropsValue}\n      >\n        {/* State layer — hover/focus/pressed opacity ring */}\n        <span className={iconButtonStateLayerVariants()} aria-hidden=\"true\" data-state-layer=\"\" />\n\n        {/* Ripple effect */}\n        {ripples}\n\n        {/* Icon slot */}\n        <span className={iconButtonIconVariants({ size })} data-icon-slot=\"\" aria-hidden=\"true\">\n          {iconNode}\n        </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 } 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 * - Press lifecycle callbacks (onPressStart/onPressEnd) for pressed state tracking\n *\n * @example\n * ```tsx\n * <FABHeadless aria-label=\"Add\" className=\"custom-fab\">\n *   <IconAdd />\n * </FABHeadless>\n * ```\n */\nexport interface FABHeadlessProps extends AriaButtonProps {\n  /** Additional CSS classes */\n  className?: string;\n\n  /** FAB content (icon and optional text) */\n  children: React.ReactNode;\n\n  /**\n   * Tab index for keyboard navigation.\n   * @default 0\n   */\n  tabIndex?: number;\n\n  /** Mouse down handler (for ripple effect) */\n  onMouseDown?: (e: React.MouseEvent<HTMLButtonElement>) => void;\n\n  /**\n   * Button type attribute.\n   * @default 'button'\n   */\n  type?: \"button\" | \"submit\" | \"reset\";\n\n  /** REQUIRED: Accessible label for screen readers */\n  \"aria-label\": string;\n\n  /** HTML title attribute for tooltip */\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      ...restProps\n    },\n    forwardedRef\n  ) => {\n    const internalRef = useRef<HTMLButtonElement>(null);\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        elementType: \"button\",\n      },\n      ref\n    );\n\n    // Strip React Aria-specific event props that must not reach the DOM,\n    // then pass the remainder (data-*, interaction callbacks, etc.) through.\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    const mergedProps = mergeProps(\n      buttonProps,\n      {\n        tabIndex,\n        className,\n        onMouseDown,\n        \"aria-label\": ariaLabel,\n        ...(title !== undefined && { title }),\n      },\n      htmlAttrs\n    ) as React.ButtonHTMLAttributes<HTMLButtonElement>;\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\nFABHeadless.displayName = \"FABHeadless\";\n","import { cva, type VariantProps } from \"class-variance-authority\";\n\n/**\n * Material Design 3 FAB Variants — Slot-based architecture\n *\n * Architecture: Variants vs States\n * - CVA holds design-time structure only (no disabled/loading state variants).\n * - All interaction states are driven by data-* attributes on the root via\n *   group-data-[x]/fab Tailwind selectors in each slot's base classes.\n * - Content flags (data-with-icon, data-loading) are set explicitly by the component.\n * - Self-targeting data-[x]: selectors handle root-level disabled styling.\n *\n * Slot responsibilities:\n *   fabVariants           — root <button>; shape per size, color per variant,\n *                           elevation (base 3 → hover 4 → focus/pressed 3),\n *                           self data-[disabled] styling, group/fab scope.\n *   fabStateLayerVariants — absolute inset overlay, opacity 0/8%/10%/10%,\n *                           color = icon/on-color per MD3 spec.\n *   fabFocusRingVariants  — keyboard focus outline ring (inset-[-3px]).\n *                           MUST NOT sit inside overflow-hidden.\n *   fabIconVariants       — icon wrapper; size per FAB size variant.\n *   fabLabelVariants      — extended FAB text label slot.\n *\n * MD3 Expressive size scale:\n *   fab      → 56dp  container, 16dp corner, 24dp icon  (default)\n *   medium   → 80dp  container, 20dp corner, 28dp icon  (M3 Expressive)\n *   large    → 96dp  container, 28dp corner, 36dp icon\n *   extended → 56dp  height,    16dp corner, 24dp icon  (+ text label)\n *   small    → 40dp  container, 12dp corner, 24dp icon  (@deprecated)\n *\n * MD3 Expressive color roles:\n *   primary-container   → bg-primary-container   / text-on-primary-container   (default)\n *   secondary-container → bg-secondary-container / text-on-secondary-container\n *   tertiary-container  → bg-tertiary-container  / text-on-tertiary-container\n *   primary             → bg-primary             / text-on-primary             (solid, M3 Expressive)\n *   secondary           → bg-secondary           / text-on-secondary           (solid, M3 Expressive)\n *   tertiary            → bg-tertiary            / text-on-tertiary            (solid, M3 Expressive)\n *   surface             → bg-surface-container-high / text-primary             (@deprecated)\n *\n * Elevation per state (MD3 spec):\n *   base    → elevation-3\n *   hovered → elevation-4  (shadow-elevation-4)\n *   focused → elevation-3  (doubled selector wins over hover)\n *   pressed → elevation-3  (doubled selector wins over hover)\n *   disabled → no shadow\n *\n * State-layer opacities (MD3):\n *   hover  → 8%   (opacity-8)\n *   focus  → 10%  (opacity-10)\n *   pressed→ 10%  (opacity-10, doubled selector wins over hover's 8%)\n *\n * Important — overflow-hidden is NOT on the root button.\n * The focus ring span has `inset-[-3px]` to extend outside the button boundary,\n * which requires the root to not clip overflow. Overflow clipping is delegated\n * to the state layer and ripple container (overflow-hidden + rounded-[inherit]).\n */\n\n// ─── FAB ROOT / CONTAINER ─────────────────────────────────────────────────────\n\nexport const fabVariants = cva(\n  [\n    // Layout — NO overflow-hidden here (focus ring must extend outside)\n    \"relative inline-flex items-center justify-center cursor-pointer select-none\",\n    \"shrink-0\",\n    // Effects transition: color / bg / shadow — standard spring, no overshoot\n    \"transition-[color,background-color,box-shadow]\",\n    \"duration-spring-standard-fast-effects ease-spring-standard-fast-effects\",\n    // Disabled — self-targeting data-[x]: selectors (not group-data — these target the root itself)\n    \"data-[disabled]:bg-on-surface/12 data-[disabled]:text-on-surface/38\",\n    \"data-[disabled]:shadow-none data-[disabled]:cursor-not-allowed data-[disabled]:pointer-events-none\",\n  ],\n  {\n    variants: {\n      /**\n       * FAB size — controls container dimensions, corner radius, and icon slot size.\n       */\n      size: {\n        /**\n         * fab (default) — 56×56dp, 16dp corner radius.\n         * MD3 standard FAB.\n         */\n        fab: [\n          \"h-14 w-14\", // 56dp\n          \"rounded-2xl\", // 16dp corner\n        ],\n\n        /**\n         * medium — 80×80dp, 20dp corner radius.\n         * M3 Expressive Medium FAB. Previously this value mapped to 56dp;\n         * it is now remapped to the Expressive 80dp Medium FAB.\n         */\n        medium: [\n          \"h-20 w-20\", // 80dp\n          \"rounded-[20px]\", // 20dp corner (large-increased shape token)\n        ],\n\n        /**\n         * large — 96×96dp, 28dp corner radius.\n         */\n        large: [\n          \"h-24 w-24\", // 96dp\n          \"rounded-[28px]\", // 28dp corner\n        ],\n\n        /**\n         * extended — 56dp height, variable width, 16dp corner.\n         * Icon + text label side by side.\n         * Padding: 16dp leading (icon side), 20dp trailing (text side).\n         * Gap: 12dp between icon and label (MD3 spec).\n         */\n        extended: [\n          \"h-14\", // 56dp height\n          \"rounded-2xl\", // 16dp corner\n          \"pl-4 pr-5\", // 16dp leading, 20dp trailing\n          \"gap-3\", // 12dp gap between icon and label\n        ],\n\n        /**\n         * @deprecated Use `fab` (56dp) instead.\n         * small — 40×40dp, 12dp corner radius. No longer recommended in M3 Expressive.\n         * Kept functional for backward compatibility.\n         */\n        small: [\n          \"h-10 w-10\", // 40dp\n          \"rounded-xl\", // 12dp corner\n          \"m-1\", // 4dp margin for 48×48dp minimum touch target\n        ],\n      },\n\n      /**\n       * FAB color — controls container + on-color.\n       * State-layer color in fabStateLayerVariants must match icon/on-color.\n       */\n      color: {\n        \"primary-container\": [\n          \"bg-primary-container text-on-primary-container\",\n          // Elevation base=3, hover=4 (state driven), disabled handled by root data-[disabled]\n          \"shadow-elevation-3\",\n          \"group-data-[hovered]/fab:shadow-elevation-4\",\n          // Focus / pressed: return to elevation-3\n          // Doubled attribute selector gives higher specificity than single hover selector\n          \"group-data-[focus-visible]/fab:shadow-elevation-3\",\n          \"group-data-[pressed]/fab:group-data-[pressed]/fab:shadow-elevation-3\",\n        ],\n        \"secondary-container\": [\n          \"bg-secondary-container text-on-secondary-container\",\n          \"shadow-elevation-3\",\n          \"group-data-[hovered]/fab:shadow-elevation-4\",\n          \"group-data-[focus-visible]/fab:shadow-elevation-3\",\n          \"group-data-[pressed]/fab:group-data-[pressed]/fab:shadow-elevation-3\",\n        ],\n        \"tertiary-container\": [\n          \"bg-tertiary-container text-on-tertiary-container\",\n          \"shadow-elevation-3\",\n          \"group-data-[hovered]/fab:shadow-elevation-4\",\n          \"group-data-[focus-visible]/fab:shadow-elevation-3\",\n          \"group-data-[pressed]/fab:group-data-[pressed]/fab:shadow-elevation-3\",\n        ],\n        primary: [\n          \"bg-primary text-on-primary\",\n          \"shadow-elevation-3\",\n          \"group-data-[hovered]/fab:shadow-elevation-4\",\n          \"group-data-[focus-visible]/fab:shadow-elevation-3\",\n          \"group-data-[pressed]/fab:group-data-[pressed]/fab:shadow-elevation-3\",\n        ],\n        secondary: [\n          \"bg-secondary text-on-secondary\",\n          \"shadow-elevation-3\",\n          \"group-data-[hovered]/fab:shadow-elevation-4\",\n          \"group-data-[focus-visible]/fab:shadow-elevation-3\",\n          \"group-data-[pressed]/fab:group-data-[pressed]/fab:shadow-elevation-3\",\n        ],\n        tertiary: [\n          \"bg-tertiary text-on-tertiary\",\n          \"shadow-elevation-3\",\n          \"group-data-[hovered]/fab:shadow-elevation-4\",\n          \"group-data-[focus-visible]/fab:shadow-elevation-3\",\n          \"group-data-[pressed]/fab:group-data-[pressed]/fab:shadow-elevation-3\",\n        ],\n        /** @deprecated Use `primary-container` instead. */\n        surface: [\n          \"bg-surface-container-high text-primary\",\n          \"shadow-elevation-3\",\n          \"group-data-[hovered]/fab:shadow-elevation-4\",\n          \"group-data-[focus-visible]/fab:shadow-elevation-3\",\n          \"group-data-[pressed]/fab:group-data-[pressed]/fab:shadow-elevation-3\",\n        ],\n      },\n    },\n\n    defaultVariants: {\n      size: \"fab\",\n      color: \"primary-container\",\n    },\n  }\n);\n\n// ─── STATE LAYER ─────────────────────────────────────────────────────────────\n\n/**\n * State layer — absolute inset overlay that transitions opacity on interaction.\n *\n * Per MD3 spec, the state-layer color must equal the icon/on-color:\n *   primary-container   → bg-on-primary-container\n *   secondary-container → bg-on-secondary-container\n *   tertiary-container  → bg-on-tertiary-container\n *   primary (solid)     → bg-on-primary\n *   secondary (solid)   → bg-on-secondary\n *   tertiary (solid)    → bg-on-tertiary\n *   surface (deprecated)→ bg-primary\n *\n * Opacity:\n *   0 at rest · 8% hover · 10% focus · 10% pressed · hidden when disabled\n *\n * overflow-hidden is placed HERE (not on root) so the state layer clips to\n * the FAB shape while the focus ring span can extend outside.\n */\nexport const fabStateLayerVariants = cva(\n  [\n    \"absolute inset-0 rounded-[inherit] overflow-hidden pointer-events-none opacity-0\",\n    // Effects transition — opacity must not overshoot\n    \"transition-opacity duration-spring-standard-fast-effects ease-spring-standard-fast-effects\",\n    // Hover: 8%\n    \"group-data-[hovered]/fab:opacity-8\",\n    // Focus: 10%\n    \"group-data-[focus-visible]/fab:opacity-10\",\n    // Pressed: 10% — doubled selector wins over hover's 8%\n    \"group-data-[pressed]/fab:group-data-[pressed]/fab:opacity-10\",\n    // No state layer when disabled\n    \"group-data-[disabled]/fab:hidden\",\n  ],\n  {\n    variants: {\n      color: {\n        \"primary-container\": \"bg-on-primary-container\",\n        \"secondary-container\": \"bg-on-secondary-container\",\n        \"tertiary-container\": \"bg-on-tertiary-container\",\n        primary: \"bg-on-primary\",\n        secondary: \"bg-on-secondary\",\n        tertiary: \"bg-on-tertiary\",\n        /** @deprecated */\n        surface: \"bg-primary\",\n      },\n    },\n    defaultVariants: { color: \"primary-container\" },\n  }\n);\n\n// ─── FOCUS RING ───────────────────────────────────────────────────────────────\n\n/**\n * Focus ring overlay.\n *\n * Rendered as an absolute `<span>` with `inset-[-3px]` so it extends 3px\n * outside the button boundary. This REQUIRES that `overflow-hidden` is NOT\n * on the root `<button>` element — overflow clipping is moved to the ripple\n * container and state layer instead.\n *\n * Always present in the DOM (opacity-0 at rest), transitions to opacity-100\n * on keyboard/programmatic focus — avoids layout shifts.\n */\nexport const fabFocusRingVariants = cva([\n  \"pointer-events-none absolute inset-[-3px] rounded-[inherit]\",\n  \"outline outline-2 outline-offset-0 outline-secondary\",\n  // Effects transition — opacity change must not overshoot\n  \"transition-opacity duration-spring-standard-fast-effects ease-spring-standard-fast-effects\",\n  \"opacity-0\",\n  \"group-data-[focus-visible]/fab:opacity-100\",\n]);\n\n// ─── ICON ─────────────────────────────────────────────────────────────────────\n\n/**\n * Icon wrapper slot.\n *\n * MD3 icon sizes per FAB size:\n *   fab / extended / small  → 24×24px (size-6)\n *   medium                  → 28×28px (size-7)\n *   large                   → 36×36px (size-9)\n *\n * `invisible` (not `hidden`) when loading — keeps the layout stable so the\n * spinner can occupy the same space without reflowing.\n * Color is inherited from the parent button's text color.\n */\nexport const fabIconVariants = cva(\n  [\n    \"relative z-10 inline-flex shrink-0 items-center justify-center\",\n    // Color transition uses effects token (no spatial overshoot on color)\n    \"transition-colors duration-spring-standard-fast-effects ease-spring-standard-fast-effects\",\n  ],\n  {\n    variants: {\n      size: {\n        fab: \"size-6\", // 24dp\n        medium: \"size-7\", // 28dp\n        large: \"size-9\", // 36dp\n        extended: \"size-6\", // 24dp\n        small: \"size-6\", // 24dp\n      },\n      hidden: {\n        true: \"invisible\",\n        false: \"\",\n      },\n    },\n    defaultVariants: {\n      size: \"fab\",\n      hidden: false,\n    },\n  }\n);\n\n// ─── LABEL (Extended FAB only) ────────────────────────────────────────────────\n\n/**\n * Text label wrapper for extended FAB.\n * Typography: Label Large (MD3 spec for FAB labels).\n * z-10 keeps it above the state layer and ripple overlays.\n */\nexport const fabLabelVariants = cva([\n  \"relative z-10 inline-flex items-center\",\n  \"text-label-large tracking-[0.1px]\",\n]);\n\n// ─── EXPORTED TYPES ───────────────────────────────────────────────────────────\n\nexport type FABVariants = VariantProps<typeof fabVariants>;\nexport type FABStateLayerVariants = VariantProps<typeof fabStateLayerVariants>;\nexport type FABFocusRingVariants = VariantProps<typeof fabFocusRingVariants>;\nexport type FABIconVariants = VariantProps<typeof fabIconVariants>;\nexport type FABLabelVariants = VariantProps<typeof fabLabelVariants>;\n","\"use client\";\n\nimport { forwardRef, useRef, useState, useCallback } from \"react\";\nimport type React from \"react\";\nimport { useHover, useFocusRing, mergeProps } from \"react-aria\";\nimport { FABHeadless } from \"./FABHeadless\";\nimport {\n  fabVariants,\n  fabStateLayerVariants,\n  fabFocusRingVariants,\n  fabIconVariants,\n  fabLabelVariants,\n  type FABVariants,\n} from \"./FAB.variants\";\nimport { cn } from \"../../utils/cn\";\nimport { getInteractionDataAttributes } from \"../../utils/interactionStates\";\nimport { useRipple } from \"../../hooks/useRipple\";\nimport type { FABProps } from \"./FAB.types\";\n\n/**\n * Loading spinner — matches Button's Spinner for consistency.\n */\nconst Spinner = (): React.ReactElement => (\n  <svg\n    role=\"progressbar\"\n    aria-label=\"Loading\"\n    className=\"relative z-10 animate-spin\"\n    xmlns=\"http://www.w3.org/2000/svg\"\n    fill=\"none\"\n    viewBox=\"0 0 24 24\"\n    // Spinner matches the icon slot width/height via inherited size from parent span\n    width=\"1em\"\n    height=\"1em\"\n    style={{ fontSize: \"inherit\" }}\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) — M3 Expressive\n *\n * High-emphasis button for the primary screen action.\n * Implements the Variants-vs-States architecture: all interaction states are\n * expressed as data-* attributes on the root and consumed by each slot via\n * group-data-[x]/fab Tailwind selectors — no state variants in CVA.\n *\n * Features:\n * - ✅ MD3 Expressive size scale: fab (56dp), medium (80dp), large (96dp), extended, small (dep)\n * - ✅ Container + solid color styles (primary-container, primary, secondary*, tertiary*)\n * - ✅ Elevation 3 base → 4 hover → 3 focus/pressed per MD3 spec\n * - ✅ State-layer color = icon/on-color per MD3 spec\n * - ✅ Correct state-layer opacities: hover 8% / focus 10% / pressed 10%\n * - ✅ Dedicated focus ring slot (inset-[-3px], keyboard-only)\n * - ✅ Loading state with spinner\n * - ✅ Ripple effect (Material Design)\n * - ✅ Full keyboard accessibility via React Aria\n *\n * @example\n * ```tsx\n * // Default FAB (56dp, primary-container)\n * <FAB aria-label=\"Create\" icon={<IconAdd />} />\n *\n * // Medium FAB (80dp, M3 Expressive)\n * <FAB aria-label=\"Create\" icon={<IconAdd />} size=\"medium\" />\n *\n * // Solid primary color (M3 Expressive)\n * <FAB aria-label=\"Add\" icon={<IconAdd />} color=\"primary\" />\n *\n * // Extended FAB with text\n * <FAB aria-label=\"Create document\" icon={<IconAdd />} size=\"extended\">\n *   Create\n * </FAB>\n * ```\n */\nexport const FAB = forwardRef<HTMLButtonElement, FABProps & Omit<FABVariants, never>>(\n  (\n    {\n      // Variant props\n      size = \"fab\",\n      color = \"primary-container\",\n\n      // Content\n      icon,\n      children,\n\n      // State\n      loading = false,\n      disableRipple = false,\n      isDisabled = false,\n\n      // Styling\n      className,\n\n      // Accessibility\n      \"aria-label\": ariaLabel,\n      title,\n\n      // Passthrough — forwarded to FABHeadless\n      tabIndex = 0,\n      type = \"button\",\n\n      // Passed through to FABHeadless → useButton\n      ...props\n    },\n    ref\n  ) => {\n    const fabRef = useRef<HTMLButtonElement>(null);\n    const resolvedRef = (ref ?? fabRef) as React.RefObject<HTMLButtonElement>;\n\n    const isFABDisabled = isDisabled || loading;\n\n    // ── Interaction state tracking ──────────────────────────────────────────\n    const [isPressed, setIsPressed] = useState(false);\n    const handlePressStart = useCallback(() => setIsPressed(true), []);\n    const handlePressEnd = useCallback(() => setIsPressed(false), []);\n\n    const { isHovered, hoverProps } = useHover({ isDisabled: isFABDisabled });\n    const { isFocusVisible, focusProps } = useFocusRing();\n\n    // Ripple effect\n    const { onMouseDown: handleRipple, ripples } = useRipple({\n      disabled: isFABDisabled || disableRipple,\n    });\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      if (size === \"extended\" && !children) {\n        console.warn(\"[FAB] Extended FAB requires a text label as `children`.\");\n      }\n      if (size !== \"extended\" && children) {\n        console.warn(\n          \"[FAB] `children` (text label) is only rendered for `size='extended'`. For icon-only FABs, use the `icon` prop only.\"\n        );\n      }\n      // Deprecation warnings\n      if (size === \"small\") {\n        console.warn(\n          \"[FAB] `size='small'` is deprecated in M3 Expressive. Use `size='fab'` (56dp) instead.\"\n        );\n      }\n      if (color === \"surface\") {\n        console.warn(\n          \"[FAB] `color='surface'` is deprecated in M3 Expressive. Use `color='primary-container'` instead.\"\n        );\n      }\n    }\n\n    return (\n      <FABHeadless\n        {...mergeProps(\n          hoverProps,\n          focusProps,\n          { onPressStart: handlePressStart, onPressEnd: handlePressEnd },\n          props\n        )}\n        ref={resolvedRef}\n        type={type}\n        isDisabled={isFABDisabled}\n        tabIndex={tabIndex}\n        onMouseDown={handleRipple}\n        aria-label={ariaLabel}\n        {...(title !== undefined && { title })}\n        // ── Interaction data attributes ─────────────────────────────────────\n        {...getInteractionDataAttributes({\n          isHovered,\n          isFocusVisible,\n          isPressed,\n          isDisabled: isFABDisabled,\n        })}\n        // ── Content flags ───────────────────────────────────────────────────\n        data-with-icon={icon ? \"\" : undefined}\n        data-loading={loading ? \"\" : undefined}\n        className={cn(\n          fabVariants({ size, color }),\n          // group/fab: enables group-data-[x]/fab child selectors in all slots\n          \"group/fab\",\n          className\n        )}\n      >\n        {/* Ripple effect */}\n        {ripples}\n\n        {/* State layer — absolute overlay; transitions opacity on interaction */}\n        <span className={cn(fabStateLayerVariants({ color }))} aria-hidden=\"true\" />\n\n        {/* Focus ring — absolute, extends 3px outside boundary; keyboard-only */}\n        <span className={cn(fabFocusRingVariants())} aria-hidden=\"true\" />\n\n        {/* Icon — invisible (not hidden) when loading so layout stays stable */}\n        {icon && <span className={cn(fabIconVariants({ size, hidden: loading }))}>{icon}</span>}\n\n        {/* Loading spinner — overlays icon position */}\n        {loading && (\n          <span className={cn(fabIconVariants({ size }))}>\n            <Spinner />\n          </span>\n        )}\n\n        {/* Text label — extended FAB only */}\n        {size === \"extended\" && children && (\n          <span className={cn(fabLabelVariants())}>{children}</span>\n        )}\n      </FABHeadless>\n    );\n  }\n);\n\nFAB.displayName = \"FAB\";\n","/**\n * TextField Variants\n *\n * CVA (class-variance-authority) variant definitions for the MD3 TextField.\n *\n * Architecture: Variants vs States\n * - CVA holds design-time choices only (variant, position, type).\n * - All interaction/selection states are driven by data-* attributes on the\n *   root via group-data-[x]/text-field Tailwind selectors in each slot's\n *   base classes — no state variants or state compoundVariants in CVA.\n *\n * Slot responsibilities:\n *   textFieldRootVariants          — outer wrapper; carries group/text-field; fullWidth\n *   textFieldFieldVariants         — 56dp visual box; variant-specific shape & bg\n *   textFieldStateLayerVariants    — filled-only hover/focus/pressed opacity ring\n *   textFieldActiveIndicatorVariants — filled-only bottom line (height + color)\n *   textFieldOutlineVariants       — outlined-only <fieldset> border\n *   textFieldNotchVariants         — outlined-only <legend> that creates the gap\n *   textFieldLabelVariants         — floating label; position differs per variant\n *   textFieldInputVariants         — <input> / <textarea>; layout adjustments per variant\n *   textFieldIconVariants          — leading / trailing icon wrapper\n *   textFieldAffixVariants         — prefix / suffix text\n *   textFieldSupportingRowVariants — flex row below field (text + counter)\n *   textFieldSupportingTextVariants — supporting / error text (left slot)\n *   textFieldCounterVariants       — character counter (right slot)\n *\n * MD3 Spec:\n *   Field height:   56dp (h-14)\n *   Shape filled:   top corners 4dp (rounded-t-xs), bottom none\n *   Shape outlined: all corners 4dp (rounded-xs)\n *   Typography:     body-large for input/label-resting/prefix/suffix\n *                   body-small for label-floating / supporting text / counter\n *   State layers:   hover 8% | focus 10% | pressed 10%\n *   Disabled:       container bg-on-surface/4, content text-on-surface/38\n *   Motion:         Standard fast (utility UI, no Expressive overshoot)\n */\n\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\n// ─── ROOT ─────────────────────────────────────────────────────────────────────\n\n/**\n * Outer wrapper div — carries `group/text-field` and `fullWidth`.\n * All data-* attributes are set here so every child slot can read them\n * via `group-data-[x]/text-field:` selectors.\n */\nexport const textFieldRootVariants = cva([\"relative inline-flex flex-col\"], {\n  variants: {\n    fullWidth: {\n      true: \"w-full\",\n      false: \"w-auto\",\n    },\n  },\n  defaultVariants: {\n    fullWidth: false,\n  },\n});\n\n// ─── FIELD BOX ────────────────────────────────────────────────────────────────\n\n/**\n * The 56dp visual container that wraps the input and icons.\n * Filled: top-rounded, background from surface-container-highest.\n * Outlined: all-rounded, transparent background, no indicator line.\n *\n * overflow-hidden is deliberately NOT set here — the focus outline on the\n * outlined variant and the state layer on the filled variant need it on their\n * own elements to avoid clipping issues.\n */\nexport const textFieldFieldVariants = cva(\n  [\n    \"relative flex items-center w-full min-h-14\",\n    // Cursor — disabled via group-data\n    \"group-data-[disabled]/text-field:cursor-not-allowed\",\n    \"group-data-[disabled]/text-field:pointer-events-none\",\n  ],\n  {\n    variants: {\n      variant: {\n        filled: [\n          \"rounded-t-xs bg-surface-container-highest\",\n          // Disabled: background fades to on-surface/4\n          \"group-data-[disabled]/text-field:bg-on-surface/4\",\n        ],\n        outlined: [\"rounded-xs bg-transparent\"],\n      },\n    },\n    defaultVariants: {\n      variant: \"filled\",\n    },\n  }\n);\n\n// ─── STATE LAYER (filled only) ────────────────────────────────────────────────\n\n/**\n * Hover/focus/pressed opacity ring — filled variant only.\n * absolute inset-0 so it covers the entire field box.\n * overflow-hidden + rounded-[inherit] clips to the field shape.\n * Color: on-surface at rest; opacities applied per interaction state.\n */\nexport const textFieldStateLayerVariants = cva([\n  \"absolute inset-0 rounded-t-xs pointer-events-none opacity-0\",\n  \"bg-on-surface\",\n  // Effects transition — no spatial overshoot on opacity\n  \"transition-opacity duration-spring-standard-fast-effects ease-spring-standard-fast-effects\",\n  // Hover: 8%\n  \"group-data-[hovered]/text-field:opacity-8\",\n  // Focus: 10% (focus wins over hover via cascade order — placed after)\n  \"group-data-[focused]/text-field:opacity-10\",\n  // No state layer when disabled\n  \"group-data-[disabled]/text-field:hidden\",\n]);\n\n// ─── ACTIVE INDICATOR (filled only) ──────────────────────────────────────────\n\n/**\n * The bottom border line for the filled variant.\n *\n * Height: 1px at rest → 2px focused/invalid (spatial token — height is spatial).\n * Color transitions use effects token.\n *\n * Uses CSS variables so both height and color can be driven independently.\n */\nexport const textFieldActiveIndicatorVariants = cva([\n  \"absolute bottom-0 left-0 right-0 pointer-events-none\",\n  // Spatial transition: height is a spatial property\n  \"transition-[height,background-color]\",\n  \"duration-spring-standard-fast-spatial ease-spring-standard-fast-spatial\",\n  // Base\n  \"h-px bg-on-surface-variant\",\n  // Hover\n  \"group-data-[hovered]/text-field:bg-on-surface\",\n  // Focused — 2px + primary color (focused placed after hovered to win cascade)\n  \"group-data-[focused]/text-field:h-0.5 group-data-[focused]/text-field:bg-primary\",\n  // Invalid\n  \"group-data-[invalid]/text-field:bg-error\",\n  // Invalid + focused\n  \"group-data-[invalid]/text-field:group-data-[focused]/text-field:bg-error\",\n  // Disabled: hidden\n  \"group-data-[disabled]/text-field:hidden\",\n]);\n\n// ─── OUTLINE (outlined only) ──────────────────────────────────────────────────\n\n/**\n * The <fieldset> border for the outlined variant.\n *\n * Sits absolutely to fill the field box. The legend inside creates the notch.\n * pointer-events-none so clicks fall through to the input.\n *\n * Border width: 1px base → 2px focused/invalid (spatial — border-width is spatial).\n * Color uses effects token.\n */\nexport const textFieldOutlineVariants = cva([\n  \"absolute inset-0 rounded-xs m-0 px-2 pointer-events-none\",\n  \"border border-outline\",\n  // Effects transition for color; spatial for border-width\n  \"transition-[border-color,border-width]\",\n  \"duration-spring-standard-fast-effects ease-spring-standard-fast-effects\",\n  // Hover\n  \"group-data-[hovered]/text-field:border-on-surface\",\n  // Focused — 2px + primary color\n  \"group-data-[focused]/text-field:border-2 group-data-[focused]/text-field:border-primary\",\n  // Invalid\n  \"group-data-[invalid]/text-field:border-error\",\n  // Invalid + focused\n  \"group-data-[invalid]/text-field:group-data-[focused]/text-field:border-2\",\n  \"group-data-[invalid]/text-field:group-data-[focused]/text-field:border-error\",\n  // Disabled\n  \"group-data-[disabled]/text-field:border-on-surface/12\",\n]);\n\n// ─── NOTCH (outlined label gap) ───────────────────────────────────────────────\n\n/**\n * The <legend> element inside the outlined fieldset that creates the gap for\n * the floating label. aria-hidden on the fieldset.\n *\n * At rest (label not floating): max-w-0 / opacity-0 so the border is unbroken.\n * When label floats (data-float): max-w grows to the measured label width.\n *\n * Because we cannot measure label width with pure CSS, we use a text-transparent\n * copy of the label inside the legend that takes up space — this is the standard\n * MUI/MD web approach.\n */\nexport const textFieldNotchVariants = cva([\n  \"invisible whitespace-nowrap text-body-small px-1\",\n  // 0 width when not floating (no gap)\n  \"max-w-0 overflow-hidden\",\n  // Full width when floating (gap opens)\n  \"group-data-[float]/text-field:max-w-full\",\n  // Spatial transition for max-width change\n  \"transition-[max-width] duration-spring-standard-fast-spatial ease-spring-standard-fast-spatial\",\n]);\n\n// ─── LABEL ────────────────────────────────────────────────────────────────────\n\n/**\n * Floating label.\n *\n * Resting state:  body-large, centered vertically inside the field (via absolute top-1/2)\n * Floating state: body-small, translated up to sit at the top edge\n *\n * Filled:   floating label rests in top 8dp padding zone\n * Outlined: floating label sits on top of the border (translateY(-50%) from top edge)\n *\n * Color:\n *   rest:     on-surface-variant\n *   focused:  primary\n *   invalid:  error\n *   disabled: on-surface/38\n *\n * The transform (translate) is spatial; color is effects.\n * We use a single transition-all with the spatial token since the spatial\n * token uses a standard (no-overshoot) spring — safe for text.\n */\nexport const textFieldLabelVariants = cva(\n  [\n    \"absolute pointer-events-none origin-top-left select-none\",\n    \"text-body-large text-on-surface-variant\",\n    // Spatial + effects both use standard fast — no overshoot on font/color\n    \"transition-[transform,font-size,color,line-height]\",\n    \"duration-spring-standard-fast-spatial ease-spring-standard-fast-spatial\",\n    // Disabled\n    \"group-data-[disabled]/text-field:text-on-surface/38\",\n    // Invalid (placed after default, before focused so focused invalid wins)\n    \"group-data-[invalid]/text-field:text-error\",\n    // Focused (singly-chained wins by cascade order)\n    \"group-data-[focused]/text-field:text-primary\",\n    // Invalid + focused — doubly-chained, wins over single-chained focused\n    \"group-data-[invalid]/text-field:group-data-[focused]/text-field:text-error\",\n  ],\n  {\n    variants: {\n      variant: {\n        /**\n         * Filled: label rests at center (top-1/2 -translate-y-1/2).\n         * When floating: moves up to top-2 (8dp) with body-small size.\n         */\n        filled: [\n          \"top-1/2 -translate-y-1/2 left-4\",\n          // Floated position — sits in the top 8dp zone\n          \"group-data-[float]/text-field:top-2 group-data-[float]/text-field:-translate-y-0\",\n          \"group-data-[float]/text-field:text-body-small\",\n          // Leading-icon offset\n          \"group-data-[with-leading-icon]/text-field:left-[52px]\",\n        ],\n        /**\n         * Outlined: label rests at center (top-1/2 -translate-y-1/2).\n         * When floating: moves up to sit on the top border (-translate-y-1/2 from top-0).\n         */\n        outlined: [\n          \"top-1/2 -translate-y-1/2 left-3\",\n          // bg-surface ensures label text punches through the border\n          \"bg-surface px-1\",\n          // Floated: sits on the top border\n          \"group-data-[float]/text-field:top-0 group-data-[float]/text-field:-translate-y-1/2\",\n          \"group-data-[float]/text-field:text-body-small\",\n          // Leading-icon offset\n          \"group-data-[with-leading-icon]/text-field:left-[52px]\",\n        ],\n      },\n    },\n    defaultVariants: {\n      variant: \"filled\",\n    },\n  }\n);\n\n// ─── INPUT / TEXTAREA ─────────────────────────────────────────────────────────\n\n/**\n * The actual <input> or <textarea> element.\n *\n * body-large, on-surface text, transparent background so the field box shows.\n * padding-top pushes text down to make room for the floating label in the\n * filled variant (when label is present).\n *\n * placeholder is hidden by default (opacity-0) and shown only when label is\n * not present or has floated — so there's no text overlap.\n */\nexport const textFieldInputVariants = cva(\n  [\n    \"relative z-10 w-full bg-transparent outline-none border-none\",\n    \"text-body-large text-on-surface\",\n    \"placeholder:text-on-surface-variant\",\n    // Placeholder hidden unless field is floating (avoids overlap with label)\n    \"placeholder:opacity-0\",\n    \"group-data-[float]/text-field:placeholder:opacity-100\",\n    // Disabled\n    \"group-data-[disabled]/text-field:text-on-surface/38\",\n    \"group-data-[disabled]/text-field:cursor-not-allowed\",\n    // Readonly\n    \"group-data-[readonly]/text-field:cursor-default\",\n    // Effects transition for color\n    \"transition-colors duration-spring-standard-fast-effects ease-spring-standard-fast-effects\",\n  ],\n  {\n    variants: {\n      variant: {\n        /**\n         * Filled: top padding creates room for floating label (label rests at 8dp).\n         * Horizontal padding: 16dp left / 16dp right — but yielded to prefix/suffix\n         * when they are present so the affix handles the edge spacing instead.\n         */\n        filled: [\n          \"pt-6 pb-2 px-4\",\n          // No label present: vertically center\n          \"group-data-[no-label]/text-field:py-4\",\n          // Leading icon horizontal offset\n          \"group-data-[with-leading-icon]/text-field:pl-[52px]\",\n          // Trailing icon horizontal offset\n          \"group-data-[with-trailing-icon]/text-field:pr-[52px]\",\n          // Prefix present: prefix handles left edge — remove input's left padding\n          \"group-data-[with-prefix]/text-field:pl-0\",\n          // Leading icon + prefix together: compound wins over both singles\n          \"group-data-[with-leading-icon]/text-field:group-data-[with-prefix]/text-field:pl-0\",\n          // Suffix present: suffix handles right edge — remove input's right padding\n          \"group-data-[with-suffix]/text-field:pr-0\",\n          // Trailing icon + suffix together: compound wins over both singles\n          \"group-data-[with-trailing-icon]/text-field:group-data-[with-suffix]/text-field:pr-0\",\n        ],\n        /**\n         * Outlined: label sits on the border, no extra top padding needed.\n         * Horizontal padding: 16dp — yielded to prefix/suffix when present.\n         */\n        outlined: [\n          \"py-4 px-4\",\n          // Leading icon horizontal offset\n          \"group-data-[with-leading-icon]/text-field:pl-[52px]\",\n          // Trailing icon horizontal offset\n          \"group-data-[with-trailing-icon]/text-field:pr-[52px]\",\n          // Prefix present: prefix handles left edge\n          \"group-data-[with-prefix]/text-field:pl-0\",\n          \"group-data-[with-leading-icon]/text-field:group-data-[with-prefix]/text-field:pl-0\",\n          // Suffix present: suffix handles right edge\n          \"group-data-[with-suffix]/text-field:pr-0\",\n          \"group-data-[with-trailing-icon]/text-field:group-data-[with-suffix]/text-field:pr-0\",\n        ],\n      },\n      multiline: {\n        true: \"resize-y min-h-[1.5rem]\",\n        false: \"h-full\",\n      },\n    },\n    defaultVariants: {\n      variant: \"filled\",\n      multiline: false,\n    },\n  }\n);\n\n// ─── ICON ─────────────────────────────────────────────────────────────────────\n\n/**\n * Leading / trailing icon wrapper.\n *\n * MD3 spec: icons are 24×24dp, 12dp from the edge (left-3 / right-3).\n * Color: on-surface-variant; trailing icon → error when invalid.\n */\nexport const textFieldIconVariants = cva(\n  [\n    \"absolute z-10 flex items-center justify-center size-6 pointer-events-none\",\n    \"text-on-surface-variant\",\n    // Effects transition\n    \"transition-colors duration-spring-standard-fast-effects ease-spring-standard-fast-effects\",\n    // Disabled\n    \"group-data-[disabled]/text-field:text-on-surface/38\",\n  ],\n  {\n    variants: {\n      position: {\n        leading: \"left-3\",\n        trailing: [\n          \"right-3\",\n          // Trailing → error color when invalid\n          \"group-data-[invalid]/text-field:text-error\",\n        ],\n      },\n    },\n    defaultVariants: {\n      position: \"leading\",\n    },\n  }\n);\n\n// ─── AFFIX (prefix / suffix) ──────────────────────────────────────────────────\n\n/**\n * Inline prefix and suffix text — visible only when the field is floated.\n * body-large, on-surface-variant color.\n *\n * Vertical alignment:\n *   Filled  — matches the input's pt-6 pb-2 padding so the text baseline aligns\n *             with the input text in the lower zone of the 56dp container.\n *             When no label is present the input uses py-4, so we mirror that.\n *   Outlined — input uses py-4 which centres text at 28px; naturally-sized affix\n *             is already centred there by items-center on the content column.\n *\n * Horizontal alignment:\n *   Prefix  — pl-4 aligns its left text edge to the field's 16dp start margin\n *             (same as label left-4 and the default input pl-4). With a leading\n *             icon the offset grows to 52dp to clear the icon zone.\n *             pr-0.5 provides a small gap between the prefix text and the cursor.\n *   Suffix  — pl-0.5 provides a small gap between the input text and the suffix.\n *             pr-4 keeps 16dp from the right edge. With a trailing icon the\n *             offset grows to 52dp to avoid overlapping the icon.\n */\nexport const textFieldAffixVariants = cva(\n  [\n    \"relative z-10 text-body-large text-on-surface-variant select-none shrink-0\",\n    \"opacity-0 pointer-events-none\",\n    // Visible once label is floated\n    \"group-data-[float]/text-field:opacity-100 group-data-[float]/text-field:pointer-events-auto\",\n    // Effects transition\n    \"transition-opacity duration-spring-standard-fast-effects ease-spring-standard-fast-effects\",\n    // Disabled\n    \"group-data-[disabled]/text-field:text-on-surface/38\",\n  ],\n  {\n    variants: {\n      variant: {\n        /**\n         * Filled: mirror the input's pt-6 pb-2 so the text sits in the same\n         * vertical zone. When no label is present, the input uses py-4 — match\n         * that too so the affix stays centred with the input text.\n         */\n        filled: [\n          \"pt-6 pb-2\",\n          \"group-data-[no-label]/text-field:pt-4 group-data-[no-label]/text-field:pb-4\",\n        ],\n        /**\n         * Outlined: input uses py-4 and h-full; items-center on the content\n         * column already centres the naturally-sized affix at the same 28px\n         * midpoint as the input text. No extra vertical padding needed.\n         */\n        outlined: [],\n      },\n      position: {\n        /**\n         * Prefix: sits before the input in the flex row.\n         * pl-4 aligns the left text edge to the 16dp field margin.\n         * With a leading icon that shifts to 52dp to clear the icon.\n         * pr-0.5 is a small gap between prefix text and the input cursor.\n         */\n        prefix: [\"pl-4\", \"group-data-[with-leading-icon]/text-field:pl-[52px]\", \"pr-0.5\"],\n        /**\n         * Suffix: sits after the input in the flex row.\n         * pl-0.5 is a small gap between the input text and the suffix.\n         * pr-4 keeps 16dp from the right field edge.\n         * With a trailing icon that shifts to 52dp to avoid overlap.\n         */\n        suffix: [\"pl-0.5\", \"pr-4\", \"group-data-[with-trailing-icon]/text-field:pr-[52px]\"],\n      },\n    },\n    defaultVariants: {\n      variant: \"filled\",\n      position: \"prefix\",\n    },\n  }\n);\n\n// ─── SUPPORTING ROW ───────────────────────────────────────────────────────────\n\n/**\n * The row below the field box containing supporting text (left) and\n * character counter (right) on the same line — matching MD3 spec.\n */\nexport const textFieldSupportingRowVariants = cva([\n  \"flex items-start justify-between w-full gap-4 px-4 pt-1\",\n]);\n\n// ─── SUPPORTING TEXT ──────────────────────────────────────────────────────────\n\n/**\n * Supporting / error text — left slot of the supporting row.\n * body-small per MD3.\n */\nexport const textFieldSupportingTextVariants = cva(\n  [\n    \"text-body-small\",\n    // Effects transition for color\n    \"transition-colors duration-spring-standard-fast-effects ease-spring-standard-fast-effects\",\n  ],\n  {\n    variants: {\n      type: {\n        description: \"text-on-surface-variant\",\n        error: \"text-error\",\n      },\n    },\n    defaultVariants: {\n      type: \"description\",\n    },\n  }\n);\n\n// ─── CHARACTER COUNTER ────────────────────────────────────────────────────────\n\n/**\n * Character counter — right slot of the supporting row.\n * body-small, right-aligned, on-surface-variant; turns error color when exceeded.\n */\nexport const textFieldCounterVariants = cva(\n  [\n    \"text-body-small shrink-0 text-right\",\n    \"transition-colors duration-spring-standard-fast-effects ease-spring-standard-fast-effects\",\n  ],\n  {\n    variants: {\n      exceeded: {\n        true: \"text-error\",\n        false: \"text-on-surface-variant\",\n      },\n    },\n    defaultVariants: {\n      exceeded: false,\n    },\n  }\n);\n\n// ─── EXPORTED TYPES ───────────────────────────────────────────────────────────\n\nexport type TextFieldRootVariants = VariantProps<typeof textFieldRootVariants>;\nexport type TextFieldFieldVariants = VariantProps<typeof textFieldFieldVariants>;\nexport type TextFieldLabelVariants = VariantProps<typeof textFieldLabelVariants>;\nexport type TextFieldInputVariants = VariantProps<typeof textFieldInputVariants>;\nexport type TextFieldIconVariants = VariantProps<typeof textFieldIconVariants>;\nexport type TextFieldAffixVariants = VariantProps<typeof textFieldAffixVariants>;\nexport type TextFieldSupportingTextVariants = VariantProps<typeof textFieldSupportingTextVariants>;\nexport type TextFieldCounterVariants = VariantProps<typeof textFieldCounterVariants>;\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 Expressive 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 * Architecture: Variants vs States\n * - All interaction/selection states are emitted as data-* attributes on the\n *   root div (group/text-field) via getInteractionDataAttributes + explicit\n *   derived content flags. CVA slots read them via group-data-[x]/text-field:.\n * - CVA variants hold only design-time choices (variant, position).\n *\n * MD3 Expressive spec:\n * - Single 56dp height (no size variants)\n * - Filled: rounded-top 4dp, surface-container-highest bg, active indicator\n * - Outlined: rounded 4dp all corners, transparent bg, notched fieldset border\n * - body-large typography for input, body-small for floating label + supporting text\n * - Standard fast motion tokens (utility form UI — no Expressive overshoot)\n */\n\n\"use client\";\n\nimport { forwardRef } from \"react\";\nimport { useHover } from \"react-aria\";\nimport { cn } from \"../../utils/cn\";\nimport { getInteractionDataAttributes } from \"../../utils/interactionStates\";\nimport {\n  textFieldRootVariants,\n  textFieldFieldVariants,\n  textFieldStateLayerVariants,\n  textFieldActiveIndicatorVariants,\n  textFieldOutlineVariants,\n  textFieldNotchVariants,\n  textFieldLabelVariants,\n  textFieldInputVariants,\n  textFieldIconVariants,\n  textFieldAffixVariants,\n  textFieldSupportingRowVariants,\n  textFieldSupportingTextVariants,\n  textFieldCounterVariants,\n} from \"./TextField.variants\";\nimport { TextFieldHeadless } from \"./TextFieldHeadless\";\nimport type { TextFieldProps } from \"./TextField.types\";\n\n/**\n * TextField — MD3 Expressive Text Input Component\n *\n * A text input field strictly following Material Design 3 Expressive specifications.\n * Supports filled and outlined variants with full accessibility via React Aria.\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 * // With icons and affixes\n * <TextField\n *   label=\"Price\"\n *   prefix=\"$\"\n *   suffix=\"USD\"\n *   leadingIcon={<IconDollar />}\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      label,\n      description,\n      errorMessage,\n      leadingIcon,\n      trailingIcon,\n      prefix,\n      suffix,\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    // React Aria hover state for the field box\n    const { isHovered, hoverProps } = useHover({ isDisabled });\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          isFocusVisible,\n          currentValue,\n          inputRef,\n        }) => {\n          const hasValue = currentValue.length > 0;\n          // Placeholder value — we need it to determine float state\n          const hasPlaceholder = !!(props as { placeholder?: string }).placeholder;\n          const hasPrefix = !!prefix;\n          const hasSuffix = !!suffix;\n          // Label floats when: focused, has a value, has a placeholder, or has a prefix\n          const shouldFloat = isFocused || hasValue || hasPlaceholder || hasPrefix;\n          const characterLength = currentValue.length;\n          const isCharacterLimitExceeded = maxLength ? characterLength > maxLength : false;\n\n          const hasLeadingIcon = !!leadingIcon;\n          const hasTrailingIcon = !!trailingIcon;\n          const hasLabel = !!label;\n\n          // Supporting row is shown when description OR counter is present\n          const showDescription = !!description && !fieldIsInvalid;\n          const showError = fieldIsInvalid && !!errorMessage;\n          const showCounter = characterCount && maxLength !== undefined;\n          const showSupportingRow = showDescription || showError || showCounter;\n\n          return (\n            <div\n              className={cn(textFieldRootVariants({ fullWidth }), \"group/text-field\", className)}\n              // ── Interaction data attributes (from React Aria state) ──────\n              {...getInteractionDataAttributes({\n                isHovered,\n                isFocusVisible,\n                isDisabled,\n                isReadOnly,\n                isInvalid: fieldIsInvalid,\n              })}\n              // ── Derived state flags ──────────────────────────────────────\n              data-focused={isFocused ? \"\" : undefined}\n              data-float={shouldFloat ? \"\" : undefined}\n              // ── Content flags (structural composition) ───────────────────\n              data-with-leading-icon={hasLeadingIcon ? \"\" : undefined}\n              data-with-trailing-icon={hasTrailingIcon ? \"\" : undefined}\n              data-with-prefix={hasPrefix ? \"\" : undefined}\n              data-with-suffix={hasSuffix ? \"\" : undefined}\n              data-no-label={!hasLabel ? \"\" : undefined}\n              data-multiline={multiline ? \"\" : undefined}\n            >\n              {/* Field box — 56dp visual container */}\n              <div {...hoverProps} className={cn(textFieldFieldVariants({ variant }))}>\n                {/* ── State layer (filled variant only) ───────────────────── */}\n                {variant === \"filled\" && (\n                  <span className={cn(textFieldStateLayerVariants())} aria-hidden=\"true\" />\n                )}\n\n                {/* ── Leading icon ────────────────────────────────────────── */}\n                {leadingIcon && (\n                  <span\n                    className={cn(textFieldIconVariants({ position: \"leading\" }))}\n                    aria-hidden=\"true\"\n                  >\n                    {leadingIcon}\n                  </span>\n                )}\n\n                {/* ── Content column (label + prefix + input + suffix) ─────── */}\n                <div className=\"relative flex h-full min-w-0 flex-1 items-center\">\n                  {/* Floating label — uses labelProps from React Aria for htmlFor wiring */}\n                  {label && (\n                    <label {...labelProps} className={cn(textFieldLabelVariants({ variant }))}>\n                      {label}\n                      {isRequired && <span aria-hidden=\"true\">&thinsp;*</span>}\n                    </label>\n                  )}\n\n                  {/* Prefix affix */}\n                  {prefix && (\n                    <span className={cn(textFieldAffixVariants({ variant, position: \"prefix\" }))}>\n                      {prefix}\n                    </span>\n                  )}\n\n                  {/* Input / Textarea */}\n                  {multiline ? (\n                    <textarea\n                      {...inputProps}\n                      ref={inputRef as React.RefObject<HTMLTextAreaElement>}\n                      className={cn(textFieldInputVariants({ variant, multiline: true }))}\n                      rows={rows}\n                      spellCheck={spellCheckProp}\n                    />\n                  ) : (\n                    <input\n                      {...inputProps}\n                      ref={inputRef as React.RefObject<HTMLInputElement>}\n                      className={cn(textFieldInputVariants({ variant, multiline: false }))}\n                      spellCheck={spellCheckProp}\n                    />\n                  )}\n\n                  {/* Suffix affix */}\n                  {suffix && (\n                    <span className={cn(textFieldAffixVariants({ variant, position: \"suffix\" }))}>\n                      {suffix}\n                    </span>\n                  )}\n                </div>\n\n                {/* ── Trailing icon ────────────────────────────────────────── */}\n                {trailingIcon && (\n                  <span\n                    className={cn(textFieldIconVariants({ position: \"trailing\" }))}\n                    aria-hidden=\"true\"\n                  >\n                    {trailingIcon}\n                  </span>\n                )}\n\n                {/* ── Active indicator (filled variant only) ───────────────── */}\n                {variant === \"filled\" && (\n                  <span className={cn(textFieldActiveIndicatorVariants())} aria-hidden=\"true\" />\n                )}\n\n                {/* ── Outlined border with notch ───────────────────────────── */}\n                {variant === \"outlined\" && (\n                  <fieldset aria-hidden=\"true\" className={cn(textFieldOutlineVariants())}>\n                    <legend className={cn(textFieldNotchVariants())}>\n                      {/* Invisible copy of label drives the notch width */}\n                      {label && (\n                        <span>\n                          {label}\n                          {isRequired && \"\\u2009*\"}\n                        </span>\n                      )}\n                    </legend>\n                  </fieldset>\n                )}\n              </div>\n\n              {/* ── Supporting row (description / error + counter) ──────────── */}\n              {showSupportingRow && (\n                <div className={cn(textFieldSupportingRowVariants())}>\n                  {/* Left: supporting text or error message (flex-1 pushes counter right) */}\n                  <div className=\"min-w-0 flex-1\">\n                    {showDescription && (\n                      <p\n                        {...descriptionProps}\n                        className={cn(textFieldSupportingTextVariants({ type: \"description\" }))}\n                      >\n                        {description}\n                      </p>\n                    )}\n                    {showError && (\n                      <p\n                        {...errorMessageProps}\n                        className={cn(textFieldSupportingTextVariants({ type: \"error\" }))}\n                      >\n                        {errorMessage}\n                      </p>\n                    )}\n                  </div>\n\n                  {/* Right: character counter */}\n                  {showCounter && (\n                    <span\n                      className={cn(\n                        textFieldCounterVariants({ exceeded: isCharacterLimitExceeded })\n                      )}\n                      aria-live=\"polite\"\n                    >\n                      {characterLength}&thinsp;/&thinsp;{maxLength}\n                    </span>\n                  )}\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\n *\n * Architecture: Variants vs States\n * - CVA holds design-time structure only (no state variants, no state compoundVariants).\n * - All interaction/selection states are driven by data-* attributes on the root via\n *   group-data-[x]/checkbox Tailwind selectors in each slot's base classes.\n * - Content flags (data-invalid, data-indeterminate) are set explicitly by the component.\n *\n * Slot responsibilities:\n *   checkboxRootVariants      — label wrapper; carries `group/checkbox`; cursor + disabled\n *   checkboxControlVariants   — 40dp state-layer + ripple container; centered on the box\n *   checkboxStateLayerVariants — 40dp circle, hover/focus/press opacity ring\n *   checkboxFocusRingVariants — keyboard-focus outline (sibling of the box, not clipped)\n *   checkboxBoxVariants       — 18dp square; border + bg per state; 2dp corner radius\n *   checkboxIconVariants      — SVG check / dash icon inside the box\n *   checkboxLabelVariants     — text label next to the control\n *\n * MD3 Spec:\n *   Box: 18×18dp, 2dp corner radius, 2dp border\n *   Touch target: 40×40dp (control slot)\n *   State-layer opacities: hover 8% | focus/pressed 10%\n *   Disabled: container 38% opacity (root-level) or specific slot overrides\n *   Label spacing: 16px (ml-4)\n */\n\n// ─── ROOT ─────────────────────────────────────────────────────────────────────\n\n/**\n * Root label wrapper — carries `group/checkbox`.\n *\n * Disabled state self-targets via data-[disabled]: so all children inherit\n * the cursor/pointer restriction. Opacity is applied here at 38% when disabled.\n */\nexport const checkboxRootVariants = cva([\n  \"relative inline-flex items-center cursor-pointer select-none -ml-3.75\",\n  \"data-[disabled]:cursor-not-allowed data-[disabled]:pointer-events-none\",\n  \"data-[disabled]:opacity-38\",\n]);\n\n// ─── CONTROL ──────────────────────────────────────────────────────────────────\n\n/**\n * Control — 40dp state-layer + ripple host.\n *\n * Provides the touch target (40dp) centered on the 18dp box.\n * Uses overflow-hidden so ripples are clipped to the circular container.\n */\nexport const checkboxControlVariants = cva([\n  \"relative flex items-center justify-center flex-shrink-0\",\n  \"w-10 h-10 rounded-full m-1\",\n  \"overflow-hidden\",\n]);\n\n// ─── STATE LAYER ──────────────────────────────────────────────────────────────\n\n/**\n * State layer — the 40dp semi-transparent circle inside the control.\n *\n * Color progression:\n *   base (unselected):            on-surface\n *   selected / indeterminate:     primary\n *   invalid:                      error\n *   invalid + selected:           error (doubly-chained → higher specificity)\n *\n * Opacity:\n *   rest: 0 | hover: 8% | focus-visible: 10% | pressed: 10%\n *   hidden when disabled.\n */\nexport const checkboxStateLayerVariants = cva([\n  \"absolute inset-0 rounded-full pointer-events-none opacity-0\",\n  // Base state-layer color (unselected)\n  \"bg-on-surface\",\n  // Effects transition for opacity changes\n  \"transition-opacity duration-spring-standard-fast-effects ease-spring-standard-fast-effects\",\n  // Selected / indeterminate → primary color\n  \"group-data-[selected]/checkbox:bg-primary\",\n  \"group-data-[indeterminate]/checkbox:bg-primary\",\n  // Invalid → error color (singly-chained)\n  \"group-data-[invalid]/checkbox:bg-error\",\n  // Invalid + selected → error wins (doubly-chained for specificity)\n  \"group-data-[invalid]/checkbox:group-data-[selected]/checkbox:bg-error\",\n  // Interaction opacities (MD3: hover 8%, focus-visible 10%, pressed 10%)\n  \"group-data-[hovered]/checkbox:opacity-8\",\n  \"group-data-[focus-visible]/checkbox:opacity-10\",\n  \"group-data-[pressed]/checkbox:opacity-10\",\n  // No state layer when disabled\n  \"group-data-[disabled]/checkbox:hidden\",\n]);\n\n// ─── FOCUS RING ───────────────────────────────────────────────────────────────\n\n/**\n * Focus ring — an absolutely-positioned outline around the 40dp control area.\n *\n * Replaces the old `animate-pulse` SVG rect. Lives as an absolute overlay\n * inside the control div (40dp) so it correctly surrounds the full touch target.\n */\nexport const checkboxFocusRingVariants = cva([\n  \"pointer-events-none absolute inset-0 rounded-full\",\n  \"outline outline-2 outline-offset-0 outline-secondary\",\n  \"transition-opacity duration-spring-standard-fast-effects ease-spring-standard-fast-effects\",\n  \"opacity-0\",\n  \"group-data-[focus-visible]/checkbox:opacity-100\",\n]);\n\n// ─── BOX ──────────────────────────────────────────────────────────────────────\n\n/**\n * Box — the 18×18dp visual checkbox square.\n *\n * Sits inside the 40dp control, centered. Owns border, background, and\n * corner radius. 2dp radius expressed as rounded-[2px] (smallest token is 4px).\n *\n * Color progression (cascade order — disabled last):\n *   base (unselected):            transparent bg, outline border\n *   selected / indeterminate:     primary bg, primary border\n *   invalid (unselected):         transparent bg, error border\n *   invalid + selected:           error bg, error border (doubly-chained)\n *   disabled (unselected):        transparent bg, on-surface/38 border\n *   disabled + selected:          on-surface/38 bg, transparent border\n */\nexport const checkboxBoxVariants = cva([\n  // Base geometry\n  \"relative flex items-center justify-center flex-shrink-0\",\n  \"w-[18px] h-[18px] rounded-[2px] border-2\",\n  // Effects transition for color changes\n  \"transition-[background-color,border-color] duration-spring-standard-fast-effects ease-spring-standard-fast-effects\",\n  // ── Unselected base ───────────────────────────────────────────────────────\n  \"bg-transparent border-outline\",\n  // ── Selected ──────────────────────────────────────────────────────────────\n  \"group-data-[selected]/checkbox:bg-primary group-data-[selected]/checkbox:border-primary\",\n  // ── Indeterminate ─────────────────────────────────────────────────────────\n  \"group-data-[indeterminate]/checkbox:bg-primary group-data-[indeterminate]/checkbox:border-primary\",\n  // ── Invalid (unselected) — singly chained ─────────────────────────────────\n  \"group-data-[invalid]/checkbox:border-error\",\n  // ── Invalid + selected — doubly chained (higher specificity) ──────────────\n  \"group-data-[invalid]/checkbox:group-data-[selected]/checkbox:bg-error\",\n  \"group-data-[invalid]/checkbox:group-data-[selected]/checkbox:border-error\",\n  // ── Invalid + indeterminate — doubly chained ───────────────────────────────\n  \"group-data-[invalid]/checkbox:group-data-[indeterminate]/checkbox:bg-error\",\n  \"group-data-[invalid]/checkbox:group-data-[indeterminate]/checkbox:border-error\",\n  // ── Disabled (placed last — cascade wins over interaction colors) ──────────\n  \"group-data-[disabled]/checkbox:border-on-surface/38\",\n  \"group-data-[disabled]/checkbox:bg-transparent\",\n  // ── Disabled + selected — doubly chained ──────────────────────────────────\n  \"group-data-[selected]/checkbox:group-data-[disabled]/checkbox:bg-on-surface/38\",\n  \"group-data-[selected]/checkbox:group-data-[disabled]/checkbox:border-transparent\",\n  // ── Disabled + indeterminate — doubly chained ─────────────────────────────\n  \"group-data-[indeterminate]/checkbox:group-data-[disabled]/checkbox:bg-on-surface/38\",\n  \"group-data-[indeterminate]/checkbox:group-data-[disabled]/checkbox:border-transparent\",\n]);\n\n// ─── ICON ─────────────────────────────────────────────────────────────────────\n\n/**\n * Icon (check / dash) — SVG element inside the box.\n *\n * Color:\n *   base (selected):              on-primary\n *   invalid + selected:           on-error (doubly-chained)\n *   disabled + selected:          surface (doubly-chained)\n *\n * The icon is only rendered when selected or indeterminate so \"unselected\"\n * color cases are not needed.\n */\nexport const checkboxIconVariants = cva([\n  \"absolute inset-0 flex items-center justify-center\",\n  // Spatial transition for icon appearing (scale)\n  \"transition-transform duration-spring-standard-fast-spatial ease-spring-standard-fast-spatial\",\n  // Base icon color\n  \"text-on-primary\",\n  // Invalid → on-error (doubly-chained for both selected and indeterminate)\n  \"group-data-[invalid]/checkbox:group-data-[selected]/checkbox:text-on-error\",\n  \"group-data-[invalid]/checkbox:group-data-[indeterminate]/checkbox:text-on-error\",\n  // Disabled → surface (doubly-chained)\n  \"group-data-[selected]/checkbox:group-data-[disabled]/checkbox:text-surface\",\n  \"group-data-[indeterminate]/checkbox:group-data-[disabled]/checkbox:text-surface\",\n]);\n\n// ─── LABEL ────────────────────────────────────────────────────────────────────\n\n/**\n * Text label next to the control.\n * Disabled opacity is inherited from the root's data-[disabled]:opacity-38.\n */\nexport const checkboxLabelVariants = cva([\"text-body-large text-on-surface select-none\"]);\n\n// ─── EXPORTED TYPES ───────────────────────────────────────────────────────────\n\nexport type CheckboxRootVariants = VariantProps<typeof checkboxRootVariants>;\nexport type CheckboxControlVariants = VariantProps<typeof checkboxControlVariants>;\nexport type CheckboxStateLayerVariants = VariantProps<typeof checkboxStateLayerVariants>;\nexport type CheckboxFocusRingVariants = VariantProps<typeof checkboxFocusRingVariants>;\nexport type CheckboxBoxVariants = VariantProps<typeof checkboxBoxVariants>;\nexport type CheckboxIconVariants = VariantProps<typeof checkboxIconVariants>;\nexport type CheckboxLabelVariants = VariantProps<typeof checkboxLabelVariants>;\n","import type React from \"react\";\n\n/**\n * MD3 Checkbox checkmark icon.\n *\n * Icon size: 18×18dp (fills the checkbox container per MD3 specs).\n * Mark stroke: 2dp with square caps, matching Material Web and Compose M3.\n *\n * Path coordinates align with `androidx.compose.material3.Checkbox` `drawCheck()`\n * when `ComposeMaterial3Flags.isCheckboxStylingFixEnabled` is true.\n *\n * @see https://m3.material.io/components/checkbox/specs\n *\n * @example\n * ```tsx\n * <span className=\"text-on-primary\">\n *   <CheckboxCheckIcon />\n * </span>\n * ```\n */\nexport function CheckboxCheckIcon(): React.ReactElement {\n  return (\n    <svg\n      xmlns=\"http://www.w3.org/2000/svg\"\n      width=\"18\"\n      height=\"18\"\n      viewBox=\"0 0 18 18\"\n      fill=\"none\"\n      aria-hidden=\"true\"\n    >\n      <path\n        d=\"M4.5 9L7.2 11.7L13.5 5.4\"\n        stroke=\"currentColor\"\n        strokeWidth=\"2\"\n        strokeLinecap=\"square\"\n        strokeLinejoin=\"miter\"\n      />\n    </svg>\n  );\n}\n\n/**\n * MD3 Checkbox indeterminate icon.\n *\n * A 10×2dp horizontal dash centered in the 18dp icon area (1dp corner radius),\n * matching Material Web's indeterminate mark dimensions.\n *\n * @see https://m3.material.io/components/checkbox/specs\n *\n * @example\n * ```tsx\n * <span className=\"text-on-primary\">\n *   <CheckboxIndeterminateIcon />\n * </span>\n * ```\n */\nexport function CheckboxIndeterminateIcon(): React.ReactElement {\n  return (\n    <svg\n      xmlns=\"http://www.w3.org/2000/svg\"\n      width=\"18\"\n      height=\"18\"\n      viewBox=\"0 0 18 18\"\n      fill=\"none\"\n      aria-hidden=\"true\"\n    >\n      <rect x=\"4\" y=\"8\" width=\"10\" height=\"2\" rx=\"1\" fill=\"currentColor\" />\n    </svg>\n  );\n}\n","\"use client\";\n\nimport { forwardRef, useRef, useEffect } from \"react\";\nimport type React from \"react\";\nimport { useCheckbox, useFocusRing, useHover, mergeProps, VisuallyHidden } from \"react-aria\";\nimport { useToggleState } from \"react-stately\";\nimport { cn } from \"../../utils/cn\";\nimport { getInteractionDataAttributes } from \"../../utils/interactionStates\";\nimport { useRipple } from \"../../hooks/useRipple\";\nimport {\n  checkboxRootVariants,\n  checkboxControlVariants,\n  checkboxStateLayerVariants,\n  checkboxFocusRingVariants,\n  checkboxBoxVariants,\n  checkboxIconVariants,\n  checkboxLabelVariants,\n} from \"./Checkbox.variants\";\nimport { CheckboxCheckIcon, CheckboxIndeterminateIcon } from \"./Checkbox.icons\";\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 * Implements the Variants-vs-States architecture: all interaction/selection\n * states are expressed as data-* attributes on the root and consumed by each\n * slot via group-data-[x]/checkbox Tailwind selectors — no state variants in CVA.\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 * - Box: 18×18dp, 2dp corner radius, within 40×40dp touch target\n * - State-layer opacities: hover 8% | focus/pressed 10%\n * - Disabled: 38% opacity on root\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      children,\n      isIndeterminate = false,\n      isInvalid = false,\n      disableRipple = false,\n      isDisabled = false,\n      className,\n      ...props\n    },\n    forwardedRef\n  ) => {\n    const internalRef = useRef<HTMLInputElement>(null);\n    const ref = (forwardedRef ?? internalRef) as React.RefObject<HTMLInputElement>;\n\n    // Extract passthrough HTML attributes that React Aria doesn't understand\n    const htmlAttrs = props as Record<string, unknown>;\n    const dataTestId = htmlAttrs[\"data-testid\"] as string | undefined;\n    const htmlId = htmlAttrs.id as string | undefined;\n    const htmlTitle = htmlAttrs.title as string | undefined;\n\n    const {\n      \"data-testid\": _dataTestId,\n      id: _htmlId,\n      title: _htmlTitle,\n      ...ariaProps\n    } = props as Record<string, unknown>;\n\n    // State management using React Stately\n    const state = useToggleState(ariaProps as Parameters<typeof useToggleState>[0]);\n\n    // React Aria hooks\n    const { inputProps, labelProps, isPressed } = useCheckbox(\n      ariaProps as Parameters<typeof useCheckbox>[0],\n      state,\n      ref\n    );\n    const { isFocusVisible, focusProps } = useFocusRing();\n    const { isHovered, hoverProps } = useHover({ isDisabled });\n\n    const isSelected = state.isSelected;\n\n    // Ripple effect on the control container\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    if (process.env.NODE_ENV === \"development\") {\n      const a = ariaProps as { \"aria-label\"?: string; \"aria-labelledby\"?: string };\n      if (!children && !a[\"aria-label\"] && !a[\"aria-labelledby\"]) {\n        console.warn(\n          \"[Checkbox] Checkbox should have a label (children) or aria-label for accessibility.\"\n        );\n      }\n    }\n\n    return (\n      <label\n        {...mergeProps(labelProps, hoverProps)}\n        className={cn(checkboxRootVariants(), \"group/checkbox\", className)}\n        data-testid={dataTestId}\n        title={htmlTitle}\n        // ── Interaction + selection data attributes ──────────────────────────\n        {...getInteractionDataAttributes({\n          isHovered,\n          isFocusVisible,\n          isPressed,\n          isSelected,\n          isDisabled,\n          isInvalid,\n          isIndeterminate,\n          isReadOnly: (ariaProps as { isReadOnly?: boolean }).isReadOnly ?? false,\n        })}\n      >\n        {/* Visually hidden native input — handles all accessibility */}\n        <VisuallyHidden>\n          <input {...mergeProps(inputProps, focusProps)} ref={ref} id={htmlId} />\n        </VisuallyHidden>\n\n        {/* Control — 40dp touch target, ripple host */}\n        <div\n          role=\"presentation\"\n          className={cn(checkboxControlVariants())}\n          onMouseDown={handleRipple}\n        >\n          {/* Ripple */}\n          {ripples}\n\n          {/* State layer — hover/focus/pressed opacity ring */}\n          <span className={cn(checkboxStateLayerVariants())} aria-hidden=\"true\" />\n\n          {/* Focus ring — keyboard-focus outline */}\n          <span className={cn(checkboxFocusRingVariants())} aria-hidden=\"true\" />\n\n          {/* Box — 18dp visual checkbox square */}\n          <div className={cn(checkboxBoxVariants())} aria-hidden=\"true\">\n            {/* Check icon — 18dp MD3 checkmark */}\n            {isSelected && !isIndeterminate && (\n              <span className={cn(checkboxIconVariants())}>\n                <CheckboxCheckIcon />\n              </span>\n            )}\n\n            {/* Dash icon — indeterminate state */}\n            {isIndeterminate && (\n              <span className={cn(checkboxIconVariants())}>\n                <CheckboxIndeterminateIcon />\n              </span>\n            )}\n          </div>\n        </div>\n\n        {/* Text label */}\n        {children && <span className={cn(checkboxLabelVariants())}>{children}</span>}\n      </label>\n    );\n  }\n);\n\nCheckbox.displayName = \"Checkbox\";\n","import { cva, type VariantProps } from \"class-variance-authority\";\n\n/**\n * Material Design 3 Switch Variants\n *\n * Architecture: Variants vs States\n * - CVA holds design-time structure only (no state variants, no state compoundVariants).\n * - All interaction/selection states are driven by data-* attributes on the root via\n *   group-data-[x]/switch Tailwind selectors in each slot's base classes.\n * - Content flags (data-with-icon) are set explicitly by the component, not via helper.\n * - The root element sets inherited CSS variables for dynamic geometry.\n *\n * Slot responsibilities:\n *   switchRootVariants        — label wrapper; carries `group/switch`; sets --switch-handle-size\n *   switchTrackVariants       — 52×32dp pill background; owns color/border\n *   switchHandleContainerVariants — movement only (translate-x); hosts state layer\n *   switchStateLayerVariants  — hover/focus/pressed opacity ring\n *   switchHandleVariants      — size + color only (no positioning)\n *   switchIconVariants        — icon container inside handle\n *   switchLabelVariants       — text label next to track\n *\n * MD3 Spec:\n *   Track: 52×32dp, border-radius 16dp (full), 2dp border\n *   Handle: 16dp unselected | 24dp selected / with-icon | 28dp pressed\n *   State-layer container: 40dp, centered on handle\n *   State-layer opacities: hover 8% | focus 10% | pressed 10% | dragged 16%\n *   Disabled: container 12% opacity, content 38% opacity\n */\n\n// ─── ROOT ─────────────────────────────────────────────────────────────────────\n\n/**\n * Root label wrapper — carries `group/switch` and handle geometry variables.\n *\n * Sets --switch-handle-size as an inherited CSS variable so both the container\n * and the handle slot can consume it without coupling. Priority order (last wins\n * in CSS cascade at equal specificity): base → selected → with-icon → pressed.\n */\nexport const switchRootVariants = cva([\n  \"relative inline-flex items-center cursor-pointer select-none\",\n  // Interaction states are styled via group-data on children.\n  // Root's own disabled state must use self-targeting data-[x]: selectors.\n  \"data-[disabled]:cursor-not-allowed data-[disabled]:pointer-events-none\",\n  \"data-[disabled]:opacity-38\",\n  // ── Handle size CSS variable ──────────────────────────────────────────────\n  // Set via self-referential data-[x]: so all child slots inherit the value.\n  // \"data-[selected]\" and \"data-[with-icon]\" have specificity (0,1,0).\n  // \"data-[pressed]:data-[pressed]:\" doubles the attribute selector → (0,2,0),\n  // guaranteeing it always wins regardless of Tailwind's CSS output order.\n  \"[--switch-handle-size:1rem]\", // 16dp base\n  \"data-[selected]:[--switch-handle-size:1.5rem]\", // 24dp selected\n  \"data-[with-icon]:[--switch-handle-size:1.5rem]\", // 24dp with icon\n  \"data-[pressed]:data-[pressed]:[--switch-handle-size:1.75rem]\", // 28dp pressed — doubled for higher specificity\n]);\n\n// ─── TRACK ────────────────────────────────────────────────────────────────────\n\n/**\n * Track — the 52×32dp pill background rail.\n * Owns background color, border color, and focus outline.\n * overflow-hidden clips the state-layer ring to the pill shape.\n */\nexport const switchTrackVariants = cva([\n  \"relative flex items-center w-13 h-8 rounded-full border-2\",\n  // Effects transition (color — no spatial overshoot)\n  \"transition-colors duration-spring-standard-fast-effects ease-spring-standard-fast-effects\",\n  // Unselected (base)\n  \"bg-surface-container-highest border-outline\",\n  // Selected\n  \"group-data-[selected]/switch:bg-primary group-data-[selected]/switch:border-primary\",\n  // Disabled (overrides selected via higher cascade position + same specificity)\n  \"group-data-[disabled]/switch:bg-on-surface/12 group-data-[disabled]/switch:border-on-surface/12\",\n]);\n\n// ─── FOCUS RING ───────────────────────────────────────────────────────────────\n\n/**\n * Focus ring overlay (sibling of the track, outside overflow-hidden).\n * Renders as an absolutely-positioned outline so it sits above the track\n * border without being clipped.\n *\n * Replaces the non-MD3 animate-pulse ring from the previous implementation.\n */\nexport const switchFocusRingVariants = cva([\n  // Sits outside the track's overflow-hidden by being rendered as a sibling,\n  // not a child — see Switch.tsx for the relative wrapper structure.\n  \"pointer-events-none absolute inset-[-3px] rounded-full\",\n  \"outline outline-2 outline-offset-0 outline-secondary\",\n  \"transition-opacity duration-spring-standard-fast-effects ease-spring-standard-fast-effects\",\n  \"opacity-0\",\n  \"group-data-[focus-visible]/switch:opacity-100\",\n]);\n\n// ─── HANDLE CONTAINER ────────────────────────────────────────────────────────\n\n/**\n * Handle container — movement only.\n *\n * Fixed 40dp circle (MD3 state-layer size), absolutely centred on the handle\n * position. Translates horizontally via group-data-[selected].\n *\n * Geometry:\n *   -left-1.5 → container left edge at –6px from track inner-left. (2dp border + 4px gap)\n *   Container center (40dp/2=20) at –4+20 = 16px from track inner-left.\n *   Handle 16dp: center at 16px (symmetric gap of ~0px from inner-left arc) ✓\n *   translate-x-5 (+20px): center at 36px from inner-left.\n *   Handle 24dp: edges at 24–48px (inner track spans 0–48px) ✓\n */\nexport const switchHandleContainerVariants = cva([\n  \"absolute top-1/2 -translate-y-1/2 -left-1.5 size-10\",\n  \"flex items-center justify-center rounded-full\",\n  // Spatial transition for movement (position is spatial, not an effect)\n  \"transition-transform duration-spring-standard-fast-spatial ease-spring-standard-fast-spatial\",\n  // Travel to selected position\n  \"group-data-[selected]/switch:translate-x-5\",\n]);\n\n// ─── STATE LAYER ─────────────────────────────────────────────────────────────\n\n/**\n * State layer — the 40dp semi-transparent ring inside the handle container.\n *\n * Color: on-surface (unselected) → primary (selected).\n * Opacity: 0 at rest, 8% hover, 10% focus/pressed, hidden when disabled.\n */\nexport const switchStateLayerVariants = cva([\n  \"absolute inset-0 rounded-full pointer-events-none opacity-0\",\n  // Base state-layer color (unselected)\n  \"bg-on-surface\",\n  // Effects transition for opacity\n  \"transition-opacity duration-spring-standard-fast-effects ease-spring-standard-fast-effects\",\n  // Selected state-layer color\n  \"group-data-[selected]/switch:bg-primary\",\n  // Interaction opacities (MD3: hover 8%, focus/pressed 10%)\n  \"group-data-[hovered]/switch:opacity-8\",\n  \"group-data-[focus-visible]/switch:opacity-10\",\n  \"group-data-[pressed]/switch:opacity-10\",\n  // No state layer when disabled\n  \"group-data-[disabled]/switch:hidden\",\n]);\n\n// ─── HANDLE ───────────────────────────────────────────────────────────────────\n\n/**\n * Handle (thumb) — size and color only, no positioning.\n *\n * Size: inherited from --switch-handle-size CSS variable set on root.\n *   16dp unselected → 24dp selected/icon → 28dp pressed.\n *\n * Color progression (singly-chained rules come first; doubly-chained win by\n * higher specificity; disabled rules placed last win by cascade order within\n * equal specificity):\n *   base:            outline\n *   selected:        on-primary\n *   unselected+int:  on-surface-variant  (singly-chained)\n *   selected+int:    primary-container   (doubly-chained → higher specificity)\n *   disabled:        on-surface/38       (singly-chained, placed last → cascade wins)\n *   disabled+sel:    surface             (doubly-chained → highest for this combo)\n */\nexport const switchHandleVariants = cva([\n  \"relative z-10 rounded-full flex items-center justify-center flex-shrink-0\",\n  // Size via inherited CSS variable\n  \"size-[var(--switch-handle-size,1rem)]\",\n  // Spatial transition for size changes + effects for color\n  \"transition-[width,height,background-color] duration-spring-standard-fast-spatial ease-spring-standard-fast-spatial\",\n  // ── Colors ────────────────────────────────────────────────────────────────\n  // Base (unselected, enabled, no interaction)\n  \"bg-outline\",\n  // Selected\n  \"group-data-[selected]/switch:bg-on-primary\",\n  // Unselected + interaction (singly-chained — overrides base by cascade order)\n  \"group-data-[hovered]/switch:bg-on-surface-variant\",\n  \"group-data-[focus-visible]/switch:bg-on-surface-variant\",\n  \"group-data-[pressed]/switch:bg-on-surface-variant\",\n  // Selected + interaction (doubly-chained → higher specificity; wins over singly-chained above)\n  \"group-data-[selected]/switch:group-data-[hovered]/switch:bg-primary-container\",\n  \"group-data-[selected]/switch:group-data-[focus-visible]/switch:bg-primary-container\",\n  \"group-data-[selected]/switch:group-data-[pressed]/switch:bg-primary-container\",\n  // Disabled — placed last so cascade wins at equal specificity vs interaction colors\n  \"group-data-[disabled]/switch:bg-on-surface/38\",\n  // Disabled + selected — doubly-chained wins over singly-chained disabled\n  \"group-data-[selected]/switch:group-data-[disabled]/switch:bg-surface\",\n]);\n\n// ─── ICON ─────────────────────────────────────────────────────────────────────\n\n/**\n * Icon container inside the handle.\n *\n * Color follows the MD3 spec:\n *   unselected: surface-container-highest (icon blends with track bg)\n *   selected:   on-primary-container\n *   disabled:   on-surface/38\n */\nexport const switchIconVariants = cva([\n  \"size-4 flex items-center justify-center flex-shrink-0\",\n  \"transition-colors duration-spring-standard-fast-effects ease-spring-standard-fast-effects\",\n  // Unselected icon color (matches track bg, visually \"hidden\" at rest)\n  \"text-surface-container-highest\",\n  // Selected icon color\n  \"group-data-[selected]/switch:text-on-primary-container\",\n  // Disabled\n  \"group-data-[disabled]/switch:text-on-surface/38\",\n]);\n\n// ─── LABEL ────────────────────────────────────────────────────────────────────\n\n/**\n * Text label next to the track.\n * Disabled opacity is inherited from the root's data-[disabled]:opacity-38.\n */\nexport const switchLabelVariants = cva([\"text-body-medium text-on-surface select-none ml-4\"]);\n\n// ─── EXPORTED TYPES ───────────────────────────────────────────────────────────\n\nexport type SwitchRootVariants = VariantProps<typeof switchRootVariants>;\nexport type SwitchTrackVariants = VariantProps<typeof switchTrackVariants>;\nexport type SwitchHandleContainerVariants = VariantProps<typeof switchHandleContainerVariants>;\nexport type SwitchStateLayerVariants = VariantProps<typeof switchStateLayerVariants>;\nexport type SwitchHandleVariants = VariantProps<typeof switchHandleVariants>;\nexport type SwitchIconVariants = VariantProps<typeof switchIconVariants>;\nexport type SwitchLabelVariants = VariantProps<typeof switchLabelVariants>;\n","\"use client\";\n\nimport { forwardRef, useRef } from \"react\";\nimport type React from \"react\";\nimport { useSwitch, useFocusRing, useHover, mergeProps, VisuallyHidden } from \"react-aria\";\nimport { useToggleState } from \"react-stately\";\nimport { cn } from \"../../utils/cn\";\nimport { getInteractionDataAttributes } from \"../../utils/interactionStates\";\nimport { useRipple } from \"../../hooks/useRipple\";\nimport {\n  switchRootVariants,\n  switchTrackVariants,\n  switchFocusRingVariants,\n  switchHandleContainerVariants,\n  switchStateLayerVariants,\n  switchHandleVariants,\n  switchIconVariants,\n  switchLabelVariants,\n} from \"./Switch.variants\";\nimport type { SwitchProps } from \"./Switch.types\";\n\n/**\n * Material Design 3 Switch Component (Layer 3: Styled)\n *\n * Built on React Aria for world-class accessibility.\n * Implements the Variants-vs-States architecture: all interaction/selection\n * states are expressed as data-* attributes on the root and consumed by each\n * slot via group-data-[x]/switch Tailwind selectors — no state variants in CVA.\n *\n * Features:\n * - ✅ 2 states: on/off (not selection like checkbox)\n * - ✅ Optional icons in handle\n * - ✅ Ripple effect (Material Design)\n * - ✅ Full keyboard accessibility (via React Aria)\n * - ✅ Screen reader support (via React Aria)\n * - ✅ Focus management (via React Aria)\n * - ✅ Form integration (name, value props)\n *\n * MD3 Specifications:\n * - Track: 52×32dp (border-radius 16dp)\n * - Handle: 16dp (unselected) | 24dp (selected / with-icon) | 28dp (pressed)\n * - State-layer container: 40dp centered on handle\n * - State-layer opacities: hover 8% | focus 10% | pressed 10%\n * - Disabled: container 12% | content 38% opacity\n * - Label spacing: 16px (ml-4)\n *\n * @example\n * ```tsx\n * // Basic usage\n * <Switch>Low power mode</Switch>\n *\n * // Controlled\n * <Switch isSelected={isOn} onChange={setIsOn}>\n *   Notifications\n * </Switch>\n *\n * // With icons\n * <Switch icon={<IconClose />} selectedIcon={<IconCheck />}>\n *   Airplane mode\n * </Switch>\n *\n * // Disabled\n * <Switch isDisabled>Disabled option</Switch>\n *\n * // Without label (icon-only)\n * <Switch aria-label=\"Toggle feature\" />\n * ```\n */\nexport const Switch = forwardRef<HTMLInputElement, SwitchProps>(\n  (\n    {\n      children,\n      icon,\n      selectedIcon,\n      disableRipple = false,\n      isDisabled = false,\n      className,\n      ...props\n    },\n    forwardedRef\n  ) => {\n    const internalRef = useRef<HTMLInputElement>(null);\n    const ref = (forwardedRef ?? internalRef) as React.RefObject<HTMLInputElement>;\n\n    // Extract passthrough HTML attributes that React Aria doesn't understand\n    const htmlAttrs = props as Record<string, unknown>;\n    const dataTestId = htmlAttrs[\"data-testid\"] as string | undefined;\n    const htmlId = htmlAttrs.id as string | undefined;\n    const htmlTitle = htmlAttrs.title as string | undefined;\n\n    const {\n      \"data-testid\": _dataTestId,\n      id: _htmlId,\n      title: _htmlTitle,\n      ...ariaProps\n    } = props as Record<string, unknown>;\n\n    // React Stately — toggle state\n    const state = useToggleState(ariaProps as Parameters<typeof useToggleState>[0]);\n\n    // React Aria hooks\n    const { inputProps, labelProps, isPressed } = useSwitch(\n      ariaProps as Parameters<typeof useSwitch>[0],\n      state,\n      ref\n    );\n    const { isFocusVisible, focusProps } = useFocusRing();\n    const { isHovered, hoverProps } = useHover({ isDisabled });\n\n    const isSelected = state.isSelected;\n    const hasIcon = !!icon || !!selectedIcon;\n\n    // Ripple effect on the handle container\n    const { onMouseDown: handleRipple, ripples } = useRipple({\n      disabled: isDisabled || disableRipple,\n    });\n\n    if (process.env.NODE_ENV === \"development\") {\n      const a = ariaProps as { \"aria-label\"?: string; \"aria-labelledby\"?: string };\n      if (!children && !a[\"aria-label\"] && !a[\"aria-labelledby\"]) {\n        console.warn(\"[Switch] Provide a label via children or aria-label for accessibility.\");\n      }\n    }\n\n    return (\n      <label\n        {...mergeProps(labelProps, hoverProps)}\n        className={cn(switchRootVariants(), \"group/switch\", className)}\n        data-testid={dataTestId}\n        title={htmlTitle}\n        // ── Interaction data attributes (from React Aria state) ──────────\n        {...getInteractionDataAttributes({\n          isHovered,\n          isFocusVisible,\n          isPressed,\n          isSelected,\n          isDisabled,\n          // isReadOnly can be undefined; ?? false satisfies exactOptionalPropertyTypes\n          isReadOnly: (ariaProps as { isReadOnly?: boolean }).isReadOnly ?? false,\n        })}\n        // ── Content flag (describes structure, NOT interaction state) ────\n        data-with-icon={hasIcon ? \"\" : undefined}\n      >\n        {/* Visually hidden native input — handles all accessibility */}\n        <VisuallyHidden>\n          <input {...mergeProps(inputProps, focusProps)} ref={ref} id={htmlId} />\n        </VisuallyHidden>\n\n        {/*\n         * Relative wrapper — gives the focus ring an absolute positioning\n         * context that is outside the track's overflow-hidden, so the ring\n         * is never clipped.\n         */}\n        <div role=\"presentation\" className=\"relative\">\n          {/* Focus ring — sibling of track div, not clipped by overflow-hidden */}\n          <div className={cn(switchFocusRingVariants())} aria-hidden=\"true\" />\n\n          {/* Track — overflow-hidden clips the state layer to the pill shape */}\n          <div className={cn(switchTrackVariants())}>\n            {/* Handle container — movement only (translate-x) */}\n            <div\n              role=\"presentation\"\n              className={cn(switchHandleContainerVariants())}\n              onMouseDown={handleRipple}\n            >\n              {/* Ripple */}\n              {ripples}\n\n              {/* State layer — hover/focus/pressed opacity ring */}\n              <span className={cn(switchStateLayerVariants())} aria-hidden=\"true\" />\n\n              {/* Handle — size + color only */}\n              <div className={cn(switchHandleVariants())} aria-hidden=\"true\">\n                {/* Icon when unselected */}\n                {!isSelected && icon && <span className={cn(switchIconVariants())}>{icon}</span>}\n                {/* Icon when selected */}\n                {isSelected && selectedIcon && (\n                  <span className={cn(switchIconVariants())}>{selectedIcon}</span>\n                )}\n              </div>\n            </div>\n          </div>\n        </div>\n\n        {/* Text label */}\n        {children && <span className={cn(switchLabelVariants())}>{children}</span>}\n      </label>\n    );\n  }\n);\n\nSwitch.displayName = \"Switch\";\n","import { createContext, forwardRef, useRef } from \"react\";\nimport { useRadioGroup } from \"react-aria\";\nimport { useRadioGroupState } from \"react-stately\";\nimport type { RadioGroupState } from \"react-stately\";\nimport type { RadioGroupHeadlessProps } from \"./Radio.types\";\n\n/**\n * Context to provide RadioGroup state to child Radio components\n */\nexport const RadioGroupContext = createContext<RadioGroupState | null>(null);\n\n/**\n * Headless RadioGroup Component (Layer 2)\n *\n * Unstyled radio group primitive using React Aria for accessibility.\n * Provides behavior only - bring your own styles.\n *\n * Features:\n * - Full keyboard navigation (Arrow keys, Tab)\n * - Screen reader support\n * - Single-selection enforcement\n * - Focus management\n * - Disabled state handling\n * - Form integration\n *\n * @example\n * ```tsx\n * // Use for custom styling\n * <RadioGroupHeadless label=\"Options\" className=\"custom-group\">\n *   <RadioHeadless value=\"a\">Option A</RadioHeadless>\n *   <RadioHeadless value=\"b\">Option B</RadioHeadless>\n * </RadioGroupHeadless>\n * ```\n */\nexport const RadioGroupHeadless = forwardRef<HTMLDivElement, RadioGroupHeadlessProps>(\n  ({ className, children, renderLabel, ...props }, forwardedRef) => {\n    // Internal ref for React Aria\n    const internalRef = useRef<HTMLDivElement>(null);\n\n    // Merge internal ref with forwarded ref\n    const ref = (forwardedRef ?? internalRef) as React.RefObject<HTMLDivElement>;\n\n    // State management using React Stately\n    const state = useRadioGroupState(props);\n\n    // React Aria hook - handles all accessibility\n    const { radioGroupProps, labelProps } = useRadioGroup(props, state);\n\n    // Extract data-testid if present\n    const dataTestId = (props as unknown as { \"data-testid\"?: string })[\"data-testid\"];\n\n    return (\n      <div {...radioGroupProps} ref={ref} className={className} data-testid={dataTestId}>\n        {/* Group label — rendered via slot when provided, otherwise default span */}\n        {props.label &&\n          (renderLabel ? renderLabel(labelProps) : <span {...labelProps}>{props.label}</span>)}\n\n        {/* Provide state to child Radio components via context */}\n        <RadioGroupContext.Provider value={state}>{children}</RadioGroupContext.Provider>\n      </div>\n    );\n  }\n);\n\nRadioGroupHeadless.displayName = \"RadioGroupHeadless\";\n","import { cva, type VariantProps } from \"class-variance-authority\";\n\n/**\n * Material Design 3 Radio Variants\n *\n * Architecture: Variants vs States\n * - CVA holds design-time structure only (no state variants, no state compoundVariants).\n * - All interaction/selection/error states are driven by data-* attributes on the root via\n *   group-data-[x]/radio Tailwind selectors in each slot's base classes.\n * - Content flags are set explicitly by the component.\n *\n * Slot responsibilities:\n *   radioRootVariants        — label wrapper; carries `group/radio`; disabled cursor/opacity\n *   radioControlVariants     — relative 40dp touch-target + state-layer host\n *   radioFocusRingVariants   — keyboard focus ring (sibling of radioTarget, not clipped)\n *   radioTargetVariants      — overflow-hidden rounded-full; clips state layer to circle shape\n *   radioStateLayerVariants  — hover/focus/pressed opacity ring (color + opacity transitions)\n *   radioRingVariants        — 20dp outer ring; owns border color (unselected/selected/error/disabled)\n *   radioDotVariants         — 10dp inner filled dot; scale 0→1 when selected\n *   radioLabelVariants       — text label next to control\n *   radioGroupVariants       — flex container for the group\n *   radioGroupLabelVariants  — group label text\n *\n * MD3 Spec:\n *   Outer ring: 20×20dp, 2dp border\n *   Inner dot: 10dp diameter (when selected)\n *   Touch/state-layer target: 40dp\n *   Colors:\n *     Unselected ring:          on-surface-variant\n *     Selected ring + dot:      primary\n *     Error ring + dot:         error\n *     Disabled ring + dot:      on-surface/38\n *   State-layer:\n *     Unselected color:         on-surface\n *     Selected color:           primary\n *     Error color:              error\n *     Hover opacity:            8%\n *     Focus/pressed opacity:    10%\n *     Disabled:                 hidden\n *   Label: body-medium, on-surface\n */\n\n// ─── ROOT ─────────────────────────────────────────────────────────────────────\n\n/**\n * Root label wrapper — carries `group/radio`.\n * Disabled state targets itself with data-[disabled]: selectors so children\n * don't need to handle cursor separately.\n */\nexport const radioRootVariants = cva([\n  \"relative inline-flex items-center cursor-pointer select-none -ml-3.75\",\n  // Disabled state — self-targeting so children inherit via group\n  \"data-[disabled]:cursor-not-allowed data-[disabled]:pointer-events-none\",\n  \"data-[disabled]:opacity-38\",\n]);\n\n// ─── CONTROL ──────────────────────────────────────────────────────────────────\n\n/**\n * Control wrapper — provides the 40dp relative positioning context.\n * Hosts the focus ring (as a sibling) and the overflow-hidden target.\n */\nexport const radioControlVariants = cva([\n  \"relative flex items-center justify-center flex-shrink-0\",\n  \"size-10 m-1\", // 40dp touch target (MD3 spec)\n]);\n\n// ─── FOCUS RING ───────────────────────────────────────────────────────────────\n\n/**\n * Focus ring — absolutely positioned sibling of the target div.\n * Must live outside the overflow-hidden target so it is not clipped.\n * Transitions from opacity-0 to opacity-100 on keyboard focus.\n */\nexport const radioFocusRingVariants = cva([\n  \"pointer-events-none absolute inset-0 rounded-full\",\n  \"outline outline-2 outline-offset-2 outline-secondary\",\n  // Effects transition for opacity\n  \"transition-opacity duration-spring-standard-fast-effects ease-spring-standard-fast-effects\",\n  \"opacity-0\",\n  \"group-data-[focus-visible]/radio:opacity-100\",\n]);\n\n// ─── TARGET ───────────────────────────────────────────────────────────────────\n\n/**\n * Target — the 40dp overflow-hidden rounded circle that clips the state-layer\n * and hosts the ripple. Not positioned (no translate), just centered in the control.\n */\nexport const radioTargetVariants = cva([\n  \"absolute inset-0 rounded-full overflow-hidden\",\n  \"flex items-center justify-center\",\n]);\n\n// ─── STATE LAYER ─────────────────────────────────────────────────────────────\n\n/**\n * State layer — semi-transparent ring for hover/focus/press feedback.\n *\n * Color: on-surface (unselected) → primary (selected) → error (invalid).\n * Opacity: 0 at rest, 8% hover, 10% focus/pressed, hidden when disabled.\n * Uses effects tokens — opacity and background-color must not overshoot.\n */\nexport const radioStateLayerVariants = cva([\n  \"absolute inset-0 rounded-full pointer-events-none opacity-0\",\n  // Base state-layer color (unselected)\n  \"bg-on-surface\",\n  // Effects transition for opacity + color\n  \"transition-[opacity,background-color] duration-spring-standard-fast-effects ease-spring-standard-fast-effects\",\n  // Selected state-layer color\n  \"group-data-[selected]/radio:bg-primary\",\n  // Error state-layer color (overrides selected via cascade position)\n  \"group-data-[invalid]/radio:!bg-error\",\n  // Interaction opacities (MD3: hover 8%, focus/pressed 10%)\n  \"group-data-[hovered]/radio:opacity-8\",\n  \"group-data-[focus-visible]/radio:opacity-10\",\n  \"group-data-[pressed]/radio:opacity-10\",\n  // No state layer when disabled\n  \"group-data-[disabled]/radio:hidden\",\n]);\n\n// ─── RING ─────────────────────────────────────────────────────────────────────\n\n/**\n * Outer ring — the 20×20dp visible radio circle (2dp border).\n * Owns border color; no fill.\n * Uses effects tokens because color changes don't have spatial movement.\n */\nexport const radioRingVariants = cva([\n  \"relative z-10 size-5 rounded-full border-2 flex items-center justify-center flex-shrink-0\",\n  // Base (unselected, enabled)\n  \"border-on-surface-variant\",\n  // Effects transition for border-color\n  \"transition-colors duration-spring-standard-fast-effects ease-spring-standard-fast-effects\",\n  // Selected — border becomes primary\n  \"group-data-[selected]/radio:border-primary\",\n  // Error — placed after selected so it overrides by cascade order\n  \"group-data-[invalid]/radio:!border-error\",\n  // Disabled — on-surface/38 opacity value\n  \"group-data-[disabled]/radio:border-on-surface/38\",\n]);\n\n// ─── DOT ─────────────────────────────────────────────────────────────────────\n\n/**\n * Inner dot — 10dp filled circle, centered in the ring.\n * Animates from scale-0 (unselected) to scale-100 (selected).\n * Uses spatial tokens because scale is a transform (can overshoot intentionally).\n */\nexport const radioDotVariants = cva([\n  \"size-2.5 rounded-full origin-center\",\n  // Spatial transition for scale — springs may overshoot (intentional)\n  \"transition-transform duration-spring-standard-fast-spatial ease-spring-standard-fast-spatial\",\n  // Base fill color (shown when selected)\n  \"bg-primary\",\n  // Hidden when unselected\n  \"scale-0\",\n  // Visible when selected\n  \"group-data-[selected]/radio:scale-100\",\n  // Error — error fill color (placed after selected by cascade)\n  \"group-data-[invalid]/radio:bg-error\",\n  // Disabled — use on-surface/38 opacity\n  \"group-data-[disabled]/radio:bg-on-surface/38\",\n]);\n\n// ─── LABEL ────────────────────────────────────────────────────────────────────\n\n/**\n * Text label next to the radio control.\n * Disabled opacity is inherited from root's data-[disabled]:opacity-38.\n */\nexport const radioLabelVariants = cva([\"text-body-medium text-on-surface select-none\"]);\n\n// ─── GROUP ────────────────────────────────────────────────────────────────────\n\n/**\n * RadioGroup container — flex layout with orientation support.\n */\nexport const radioGroupVariants = cva(\n  [\"flex\", \"gap-1\"], // 4dp gap — padding around each 40dp control handles visual spacing\n  {\n    variants: {\n      /**\n       * Layout orientation\n       * @default \"vertical\"\n       */\n      orientation: {\n        vertical: \"flex-col\",\n        horizontal: \"flex-row flex-wrap\",\n      },\n    },\n    defaultVariants: {\n      orientation: \"vertical\",\n    },\n  }\n);\n\n/**\n * RadioGroup label text.\n * Disabled opacity is applied via `data-disabled` attribute set directly on\n * the label element by the component (not via group selector).\n */\nexport const radioGroupLabelVariants = cva([\n  \"text-body-medium font-medium\",\n  \"text-on-surface\",\n  \"mb-3\",\n  \"data-[disabled]:opacity-38\",\n]);\n\n// ─── EXPORTED TYPES ───────────────────────────────────────────────────────────\n\nexport type RadioRootVariants = VariantProps<typeof radioRootVariants>;\nexport type RadioControlVariants = VariantProps<typeof radioControlVariants>;\nexport type RadioFocusRingVariants = VariantProps<typeof radioFocusRingVariants>;\nexport type RadioTargetVariants = VariantProps<typeof radioTargetVariants>;\nexport type RadioStateLayerVariants = VariantProps<typeof radioStateLayerVariants>;\nexport type RadioRingVariants = VariantProps<typeof radioRingVariants>;\nexport type RadioDotVariants = VariantProps<typeof radioDotVariants>;\nexport type RadioLabelVariants = VariantProps<typeof radioLabelVariants>;\nexport type RadioGroupVariants = VariantProps<typeof radioGroupVariants>;\nexport type RadioGroupLabelVariants = VariantProps<typeof radioGroupLabelVariants>;\n","\"use client\";\n\nimport { forwardRef, useRef, useContext } from \"react\";\nimport type React from \"react\";\nimport { useRadio, useFocusRing, useHover, mergeProps, VisuallyHidden } from \"react-aria\";\nimport { cn } from \"../../utils/cn\";\nimport { getInteractionDataAttributes } from \"../../utils/interactionStates\";\nimport { useRipple } from \"../../hooks/useRipple\";\nimport { RadioGroupContext } from \"./RadioGroupHeadless\";\nimport {\n  radioRootVariants,\n  radioControlVariants,\n  radioFocusRingVariants,\n  radioTargetVariants,\n  radioStateLayerVariants,\n  radioRingVariants,\n  radioDotVariants,\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 * Implements the Variants-vs-States architecture: all interaction/selection/error\n * states are expressed as data-* attributes on the root and consumed by each\n * slot via group-data-[x]/radio Tailwind selectors — no state variants in CVA.\n *\n * Features:\n * - ✅ Unselected / selected states\n * - ✅ Error/invalid state (via RadioGroup isInvalid)\n * - ✅ Ripple effect (Material Design)\n * - ✅ Full keyboard accessibility (via React Aria)\n * - ✅ Screen reader support (via React Aria)\n * - ✅ Focus management with MD3 focus ring (no animate-pulse)\n * - ✅ Form integration (name, value props from RadioGroup)\n *\n * MD3 Specifications:\n * - Radio icon: 20×20dp (within 40×40dp touch target)\n * - Outer circle border: 2dp\n * - Inner dot: 10dp (selected state, scale 0→1)\n * - State layers: 8% hover, 10% focus/pressed\n * - Disabled: 38% opacity (on root)\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 */\nexport const Radio = forwardRef<HTMLInputElement, RadioProps>(\n  ({ children, disableRipple = false, isDisabled = false, className, ...props }, forwardedRef) => {\n    const state = useContext(RadioGroupContext);\n\n    if (!state) {\n      throw new Error(\"Radio must be used within a RadioGroup\");\n    }\n\n    const internalRef = useRef<HTMLInputElement>(null);\n    const ref = (forwardedRef ?? internalRef) as React.RefObject<HTMLInputElement>;\n\n    // Extract passthrough HTML attributes that React Aria doesn't understand\n    const htmlAttrs = props as Record<string, unknown>;\n    const dataTestId = htmlAttrs[\"data-testid\"] as string | undefined;\n    const htmlId = htmlAttrs.id as string | undefined;\n    const htmlTitle = htmlAttrs.title as string | undefined;\n\n    const {\n      \"data-testid\": _dataTestId,\n      id: _htmlId,\n      title: _htmlTitle,\n      ...ariaProps\n    } = props as Record<string, unknown>;\n\n    // React Aria hooks — behavior + interaction states\n    const {\n      inputProps,\n      isSelected,\n      isDisabled: radioIsDisabled,\n      isPressed,\n    } = useRadio(\n      { ...ariaProps, value: props.value } as Parameters<typeof useRadio>[0],\n      state,\n      ref\n    );\n    const { isFocusVisible, focusProps } = useFocusRing();\n    const finalIsDisabled = isDisabled || radioIsDisabled;\n    const { isHovered, hoverProps } = useHover({ isDisabled: finalIsDisabled });\n\n    // Error/invalid state from RadioGroup\n    const isInvalid = state.validationState === \"invalid\";\n\n    // Ripple on the target (40dp area)\n    const { onMouseDown: handleRipple, ripples } = useRipple({\n      disabled: finalIsDisabled || disableRipple,\n    });\n\n    if (process.env.NODE_ENV === \"development\") {\n      const a = ariaProps as { \"aria-label\"?: string; \"aria-labelledby\"?: string };\n      if (!children && !a[\"aria-label\"] && !a[\"aria-labelledby\"]) {\n        console.warn(\"[Radio] Provide a label via children or aria-label for accessibility.\");\n      }\n    }\n\n    return (\n      <label\n        {...mergeProps(hoverProps)}\n        className={cn(radioRootVariants(), \"group/radio\", className)}\n        data-testid={dataTestId}\n        title={htmlTitle}\n        // ── Interaction + selection + error data attributes ─────────────\n        {...getInteractionDataAttributes({\n          isHovered,\n          isFocusVisible,\n          isPressed,\n          isSelected,\n          isDisabled: finalIsDisabled,\n          isInvalid,\n        })}\n      >\n        {/* Visually hidden native input — handles all accessibility */}\n        <VisuallyHidden>\n          <input {...mergeProps(inputProps, focusProps)} ref={ref} id={htmlId} />\n        </VisuallyHidden>\n\n        {/*\n         * Control wrapper — relative 40dp container.\n         * Hosts focus ring (sibling of target, not clipped) and the\n         * overflow-hidden target that clips the state layer.\n         */}\n        <div role=\"presentation\" className={cn(radioControlVariants())}>\n          {/* Focus ring — sibling of target, never clipped by overflow-hidden */}\n          <div className={cn(radioFocusRingVariants())} aria-hidden=\"true\" />\n\n          {/* Target — overflow-hidden clips state layer to the circle */}\n          <div role=\"presentation\" className={cn(radioTargetVariants())} onMouseDown={handleRipple}>\n            {/* Ripple */}\n            {ripples}\n\n            {/* State layer — hover/focus/pressed opacity ring */}\n            <span className={cn(radioStateLayerVariants())} aria-hidden=\"true\" />\n\n            {/* Outer ring — 20dp circle with 2dp border */}\n            <div className={cn(radioRingVariants())} aria-hidden=\"true\">\n              {/* Inner dot — scales 0→1 when selected */}\n              <div className={cn(radioDotVariants())} aria-hidden=\"true\" />\n            </div>\n          </div>\n        </div>\n\n        {/* Text label */}\n        {children && <span className={cn(radioLabelVariants())}>{children}</span>}\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 = 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        isInvalid={isInvalid}\n        ref={ref}\n        className={cn(\"flex flex-col\", className)}\n        data-testid={dataTestId}\n        renderLabel={(labelProps) => (\n          <div\n            {...labelProps}\n            data-disabled={isDisabled ? \"\" : undefined}\n            className={cn(radioGroupLabelVariants())}\n          >\n            {props.label}\n          </div>\n        )}\n      >\n        {/* Radio buttons container */}\n        <div\n          className={cn(\n            radioGroupVariants({\n              orientation,\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 Tabs Variants\n *\n * Architecture: Variants vs States\n * - CVA holds design-time structure only (no selected/disabled state variants).\n * - All interaction/selection states are driven by data-* attributes on the root\n *   via group-data-[x]/tab Tailwind selectors in each slot's base classes.\n * - Content flags (data-with-icon, data-with-label) are set explicitly by Tab.\n *\n * Slot responsibilities:\n *   tabListVariants         — container rail; bg-surface + bottom divider\n *   tabVariants             — root button; group/tab; typography + label color; disabled\n *   tabStateLayerVariants   — absolute inset overlay; hover/focus/pressed opacity ring\n *   tabIndicatorVariants    — sliding underline; spatial spring motion\n *   tabIconVariants         — 24dp icon wrapper + badge anchor\n *   tabBadgeVariants        — numeric / dot badge\n *   tabPanelVariants        — panel container\n *\n * MD3 Spec:\n *   Container: bg-surface, border-b border-outline-variant\n *   Height: 48dp label/icon-only | 64dp icon+label\n *   Typography: Title Small (text-title-small, weight 500, tracking 0.1px)\n *   Icon: 24dp\n *   Inactive label/icon: text-on-surface-variant\n *   Active label/icon: primary → text-primary | secondary → text-on-surface\n *   Active indicator: primary 3dp bg-primary rounded-t-full | secondary 2dp bg-primary\n *   State-layer opacities: hover 8% | focus 10% | pressed 10%\n *   Disabled: content 38% opacity\n *   Indicator motion: spatial spring (default tier)\n */\n\n// ─── TAB LIST ─────────────────────────────────────────────────────────────────\n\n/**\n * TabList container rail.\n * Carries bg-surface and the bottom divider per MD3 spec.\n * layout is the only design-time variant.\n */\nexport const tabListVariants = cva(\n  [\n    \"relative flex\",\n    \"bg-surface\",\n    // MD3: 1dp bottom divider in outline-variant color\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// ─── TAB (ROOT) ───────────────────────────────────────────────────────────────\n\n/**\n * Root <button> element for each tab item.\n * Carries `group/tab` and emits data-* interaction/content attributes.\n *\n * States are driven via group-data-[x]/tab selectors, NOT CVA variant props.\n *   Inactive:  text-on-surface-variant (base)\n *   Active:    text-primary (primary variant) | text-on-surface (secondary variant)\n *   Disabled:  self-targeting data-[disabled]: selectors (38% opacity)\n *   Icon+label height: data-[with-icon]:data-[with-label]:min-h-16\n *\n * Effects transition: color changes use spring-standard-fast-effects.\n * Focus outline: visible via group-data-[focus-visible]/tab on root (above state layer).\n */\nexport const tabVariants = cva(\n  [\n    // Layout\n    \"relative flex flex-col items-center justify-center\",\n    \"min-h-12 px-4\",\n    \"cursor-pointer select-none\",\n    // Clip state layer to tab boundary\n    \"overflow-hidden\",\n    // MD3 Title Small typography\n    \"text-title-small font-medium tracking-[0.1px]\",\n    // Effects transition for color changes (not spatial)\n    \"transition-colors duration-spring-standard-fast-effects ease-spring-standard-fast-effects\",\n    // Remove default button focus outline — handled via group-data-[focus-visible]/tab\n    \"focus-visible:outline-none\",\n    // Disabled — self-targeting data-[x]: selectors (not group)\n    \"data-[disabled]:opacity-38 data-[disabled]:cursor-not-allowed data-[disabled]:pointer-events-none\",\n    // Icon+label stacked: 64dp height\n    \"data-[with-icon]:data-[with-label]:min-h-16\",\n  ],\n  {\n    variants: {\n      /**\n       * Design-time variant: affects active label/icon color and state-layer color.\n       * primary: active → text-primary\n       * secondary: active → text-on-surface\n       */\n      variant: {\n        primary: [\n          // Inactive: on-surface-variant (base)\n          \"text-on-surface-variant\",\n          // Active: text-primary\n          \"group-data-[selected]/tab:text-primary\",\n          // Disabled active: on-surface/38 inherits from opacity-38 on root\n        ],\n        secondary: [\n          // Inactive: on-surface-variant (base)\n          \"text-on-surface-variant\",\n          // Active: on-surface\n          \"group-data-[selected]/tab:text-on-surface\",\n        ],\n      },\n\n      /**\n       * Design-time variant: affects flex sizing in the tab row.\n       */\n      layout: {\n        fixed: \"flex-1\",\n        scrollable: \"min-w-[90px] shrink-0\",\n      },\n    },\n\n    // compoundVariants intentionally empty — state combinations are handled\n    // via group-data-[selected]/tab:group-data-[...]/tab: in state slot\n    compoundVariants: [],\n\n    defaultVariants: {\n      variant: \"primary\",\n      layout: \"fixed\",\n    },\n  }\n);\n\n// ─── STATE LAYER ─────────────────────────────────────────────────────────────\n\n/**\n * State layer — absolute inset overlay transitioning opacity on interaction.\n *\n * Color:\n *   primary inactive → bg-on-surface\n *   primary active   → bg-primary (group-data-[selected]/tab:)\n *   secondary        → bg-on-surface (always)\n *\n * Opacity:\n *   0 at rest\n *   8% hover  (group-data-[hovered]/tab:)\n *   10% focus (group-data-[focus-visible]/tab:)\n *   10% pressed — doubled selector wins over hover at same cascade position\n *   hidden when disabled\n *\n * overflow-hidden on root clips this overlay to the tab shape.\n */\nexport const tabStateLayerVariants = cva(\n  [\n    \"absolute inset-0 pointer-events-none opacity-0\",\n    // Effects transition for opacity — no spatial overshoot\n    \"transition-opacity duration-spring-standard-fast-effects ease-spring-standard-fast-effects\",\n    // Hover: 8%\n    \"group-data-[hovered]/tab:opacity-8\",\n    // Focus: 10%\n    \"group-data-[focus-visible]/tab:opacity-10\",\n    // Pressed: 10%, doubled selector beats hover at equal cascade position\n    \"group-data-[pressed]/tab:group-data-[pressed]/tab:opacity-10\",\n    // No state layer when disabled\n    \"group-data-[disabled]/tab:hidden\",\n  ],\n  {\n    variants: {\n      variant: {\n        primary: [\n          // Inactive state-layer color\n          \"bg-on-surface\",\n          // Active state-layer color (higher cascade position wins over base bg-on-surface)\n          \"group-data-[selected]/tab:bg-primary\",\n        ],\n        secondary: [\n          // Secondary: always on-surface\n          \"bg-on-surface\",\n        ],\n      },\n    },\n    defaultVariants: {\n      variant: \"primary\",\n    },\n  }\n);\n\n// ─── ACTIVE INDICATOR ────────────────────────────────────────────────────────\n\n/**\n * Active indicator — the sliding underline absolutely positioned at the bottom\n * of the TabList container.\n *\n * primary:   3dp height, bg-primary, rounded-t-full top corners\n * secondary: 2dp height, bg-primary, no rounding\n *\n * Motion: left/width are spatial properties → spring-standard-default-spatial.\n * Initial position and width are set inline by TabList via DOM measurement.\n * Primary variant is measured to content width (label/icon inner span);\n * secondary spans the full tab button width.\n */\nexport const tabIndicatorVariants = cva(\n  [\n    \"absolute bottom-0 left-0\",\n    \"pointer-events-none\",\n    // Spatial spring — indicator position/width are spatial (not effects)\n    \"transition-[left,width]\",\n    \"duration-spring-standard-default-spatial\",\n    \"ease-spring-standard-default-spatial\",\n  ],\n  {\n    variants: {\n      variant: {\n        primary: [\"h-[3px]\", \"bg-primary\", \"rounded-tl-sm rounded-tr-sm\"],\n        secondary: [\"h-[2px]\", \"bg-primary\"],\n      },\n    },\n    defaultVariants: {\n      variant: \"primary\",\n    },\n  }\n);\n\n// ─── ICON WRAPPER ─────────────────────────────────────────────────────────────\n\n/**\n * Icon wrapper inside the tab content span.\n * MD3 spec: 24dp icon size.\n * hasLabel: adds bottom margin when stacked with a label.\n */\nexport const tabIconVariants = cva(\n  [\n    \"relative inline-flex items-center justify-center\",\n    // MD3 tab icon size: 24dp\n    \"size-6\",\n    // Effects transition for color (inherited from parent, guard here too)\n    \"transition-colors duration-spring-standard-fast-effects ease-spring-standard-fast-effects\",\n  ],\n  {\n    variants: {\n      hasLabel: {\n        true: \"mb-1\",\n        false: \"\",\n      },\n    },\n    defaultVariants: {\n      hasLabel: false,\n    },\n  }\n);\n\n// ─── BADGE ────────────────────────────────────────────────────────────────────\n\n/**\n * Badge — numeric count or dot indicator anchored to the icon wrapper.\n * MD3 badge spec: bg-error text-on-error.\n */\nexport const tabBadgeVariants = cva(\n  [\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-0 right-0\", \"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// ─── TAB PANEL ────────────────────────────────────────────────────────────────\n\n/**\n * TabPanel container.\n * MD3 does not specify panel container styling — focus management only.\n */\nexport const tabPanelVariants = cva([\n  \"outline-none\",\n  \"focus-visible:ring-2 focus-visible:ring-primary focus-visible:ring-offset-2\",\n]);\n\n// ─── EXPORTED TYPES ───────────────────────────────────────────────────────────\n\nexport type TabListVariants = VariantProps<typeof tabListVariants>;\nexport type TabVariants = VariantProps<typeof tabVariants>;\nexport type TabStateLayerVariants = VariantProps<typeof tabStateLayerVariants>;\nexport type TabIndicatorVariants = VariantProps<typeof tabIndicatorVariants>;\nexport type TabIconVariants = VariantProps<typeof tabIconVariants>;\nexport type TabBadgeVariants = VariantProps<typeof tabBadgeVariants>;\nexport type TabPanelVariants = VariantProps<typeof tabPanelVariants>;\n","\"use client\";\n\nimport { forwardRef, useRef, useLayoutEffect, useState, useCallback, useEffect } 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 * Active indicator behavior (MD3 spec):\n * - Primary: indicator width = content (label/icon) width, centered under content.\n *   Measured via the [data-tab-content] child span of the selected tab.\n * - Secondary: indicator spans the full tab button width.\n *\n * Motion: left and width are spatial properties → spring-standard-default-spatial.\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    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     */\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        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    const { onKeyDown: tabListKeyDown } = tabListProps;\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 and width from the selected tab's DOM.\n     *\n     * Primary variant: measures the [data-tab-content] inner span of the selected tab,\n     * which contains only the icon/label. The indicator is centered under this content\n     * (MD3 spec: indicator hugs content, not the full tab width).\n     *\n     * Secondary variant: measures the full selected tab button rect (full tab width).\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\n      if (variant === \"primary\") {\n        // Primary: measure the content span centered under icon/label\n        const contentEl = selectedTab.querySelector<HTMLElement>(\"[data-tab-content]\");\n        if (!contentEl) return;\n\n        const contentRect = contentEl.getBoundingClientRect();\n        const newLeft = contentRect.left - containerRect.left + container.scrollLeft;\n        const newWidth = contentRect.width;\n\n        setIndicatorStyle((prev) => {\n          if (prev.left === newLeft && prev.width === newWidth) return prev;\n          return { left: newLeft, width: newWidth };\n        });\n      } else {\n        // Secondary: indicator spans the full tab button width\n        const tabRect = selectedTab.getBoundingClientRect();\n        const newLeft = tabRect.left - containerRect.left + container.scrollLeft;\n        const newWidth = tabRect.width;\n\n        setIndicatorStyle((prev) => {\n          if (prev.left === newLeft && prev.width === newWidth) return prev;\n          return { left: newLeft, width: newWidth };\n        });\n      }\n\n      setIndicatorReady(true);\n    }, [ref, variant]);\n\n    // Re-measure when selection changes or variant changes\n    useLayoutEffect(() => {\n      updateIndicator();\n    }, [state.selectedKey, updateIndicator]);\n\n    // Re-measure on container resize (e.g. window resize, flex layout reflow)\n    useEffect(() => {\n      const container = ref.current;\n      if (!container || typeof ResizeObserver === \"undefined\") return;\n\n      const observer = new ResizeObserver(() => {\n        updateIndicator();\n      });\n      observer.observe(container);\n\n      return () => {\n        observer.disconnect();\n      };\n    }, [ref, updateIndicator]);\n\n    // ── Render ──────────────────────────────────────────────────────────────\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            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, useHover } from \"react-aria\";\nimport { mergeProps } from \"@react-aria/utils\";\nimport { cn } from \"../../utils/cn\";\nimport { getInteractionDataAttributes } from \"../../utils/interactionStates\";\nimport { useRipple } from \"../../hooks/useRipple\";\nimport { useHeadlessTabsContext } from \"./TabsHeadless\";\nimport { useTabsContext } from \"./Tabs\";\nimport {\n  tabVariants,\n  tabStateLayerVariants,\n  tabIconVariants,\n  tabBadgeVariants,\n} 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 * Architecture: Variants-vs-States\n * - Design-time variants (primary/secondary, fixed/scrollable) live in CVA.\n * - All interaction states are expressed as data-* attributes on the root button\n *   via getInteractionDataAttributes, consumed by slots using group-data-[x]/tab.\n * - Content flags (data-with-icon, data-with-label) describe structure, set explicitly.\n *\n * Slots:\n *   root button   — group/tab; typography, label color, disabled, content flags\n *   state layer   — absolute inset hover/focus/pressed overlay\n *   content span  — data-tab-content; measured by TabList for primary indicator width\n *   icon wrapper  — 24dp icon + badge anchor\n *   label span    — truncated text label\n *\n * MD3 Specifications:\n * - Minimum height: 48dp (label/icon-only), 64dp (icon+label stacked)\n * - Typography: Title Small (text-title-small, weight 500, tracking 0.1px)\n * - Icon: 24×24dp\n * - Active indicator: 3dp primary / 2dp secondary — both bg-primary\n * - State layers: hover 8%, focus/pressed 10%\n * - Disabled: 38% opacity (not focusable)\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    // isPressed is available from useTab's TabAria return type.\n    const {\n      tabProps,\n      isSelected,\n      isDisabled: ariaIsDisabled,\n      isPressed,\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    // Hover state for state-layer\n    const finalIsDisabled = isDisabled || ariaIsDisabled;\n    const { isHovered, hoverProps } = useHover({ isDisabled: finalIsDisabled });\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    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    const handleFocus = useCallback(() => {\n      if (!finalIsDisabled) {\n        state.selectionManager.setFocusedKey(id);\n      }\n    }, [state.selectionManager, id, finalIsDisabled]);\n\n    const mergedProps = mergeProps(tabProps, focusProps, hoverProps, {\n      onMouseDown: disableRipple ? undefined : handleRipple,\n      onClick: handleClick,\n      onFocus: handleFocus,\n    });\n\n    const badgeDisplay = resolveBadgeDisplay(badge);\n    const isDotBadge = badgeDisplay === \"dot\";\n    const hasIcon = Boolean(icon);\n    const hasLabel = Boolean(label);\n\n    return (\n      <button\n        {...mergedProps}\n        ref={ref}\n        type=\"button\"\n        data-key={String(id)}\n        // Roving tabIndex based on selection, not focus state\n        tabIndex={finalIsDisabled ? -1 : isSelected ? 0 : -1}\n        className={cn(tabVariants({ variant, layout }), className)}\n        // ── Interaction data attributes (from React Aria state) ──────────\n        {...getInteractionDataAttributes({\n          isHovered,\n          isFocusVisible,\n          isPressed,\n          isSelected,\n          isDisabled: finalIsDisabled,\n        })}\n        // ── Content flags (describe structure, NOT interaction state) ────\n        data-with-icon={hasIcon ? \"\" : undefined}\n        data-with-label={hasLabel ? \"\" : undefined}\n        {...htmlProps}\n      >\n        {/* Ripple effect */}\n        {!disableRipple && ripples}\n\n        {/* State layer — absolute inset, opacity driven by group-data-[x]/tab */}\n        <span className={cn(tabStateLayerVariants({ variant }))} aria-hidden=\"true\" />\n\n        {/*\n         * Content span — inline-flex, measured by TabList for primary indicator width.\n         * data-tab-content is the measurement anchor; TabList queries this element's\n         * bounding rect to center the primary indicator under the actual content.\n         */}\n        <span\n          data-tab-content\n          className=\"relative z-10 inline-flex flex-col items-center justify-center\"\n        >\n          {/* Icon with optional badge */}\n          {hasIcon && (\n            <span className={cn(tabIconVariants({ hasLabel }))}>\n              {icon}\n              {/* Badge on icon — aria-hidden keeps 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=\"truncate\">\n              {label}\n              {/* Badge next to label when no icon — 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        </span>\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 {\n  createContext,\n  forwardRef,\n  useCallback,\n  useContext,\n  useEffect,\n  useRef,\n  useState,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport type React from \"react\";\nimport {\n  useDialog,\n  useOverlay,\n  usePreventScroll,\n  useButton,\n  useLink,\n  FocusScope,\n} from \"react-aria\";\nimport { useOverlayTriggerState } from \"react-stately\";\nimport { mergeProps } from \"@react-aria/utils\";\nimport { cn } from \"../../utils/cn\";\nimport type {\n  DrawerAnimationState,\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// ─── ModalDrawerPanel (internal) ─────────────────────────────────────────────\n\n/**\n * Internal dialog panel for the modal drawer variant.\n *\n * Wires `useDialog`, `useOverlay`, `usePreventScroll`, and handles the\n * forwarded ref merge. Receives the current `animationState` and\n * `getAnimationClassName` from the state machine in `HeadlessDrawer` so that\n * the exit animation plays before the portal gate removes the element.\n *\n * @internal\n */\ninterface ModalDrawerPanelProps {\n  ariaLabel: string;\n  onClose: () => void;\n  className: string | undefined;\n  animationState: DrawerAnimationState;\n  getAnimationClassName: ((state: DrawerAnimationState) => string) | undefined;\n  onTransitionEnd: () => void;\n  forwardedRef: React.Ref<HTMLElement> | null;\n  children: React.ReactNode;\n}\n\nconst ModalDrawerPanel = ({\n  ariaLabel,\n  onClose,\n  className,\n  animationState,\n  getAnimationClassName,\n  onTransitionEnd,\n  forwardedRef,\n  children,\n}: ModalDrawerPanelProps): React.ReactElement => {\n  const panelRef = useRef<HTMLDivElement | null>(null);\n\n  // Lock body scroll while the modal panel is mounted\n  usePreventScroll();\n\n  // role=\"dialog\", aria-label, aria-modal\n  const { dialogProps } = useDialog(\n    { \"aria-label\": ariaLabel },\n    panelRef as React.RefObject<HTMLDivElement>\n  );\n\n  // Escape key + outside-click dismissal\n  const { overlayProps } = useOverlay(\n    { isOpen: true, onClose, isDismissable: true, shouldCloseOnBlur: false },\n    panelRef as React.RefObject<HTMLDivElement>\n  );\n\n  // Merge the internal panelRef with the forwarded ref\n  const setRef = useCallback(\n    (node: HTMLDivElement | null) => {\n      panelRef.current = node;\n      if (typeof forwardedRef === \"function\") {\n        forwardedRef(node);\n      } else if (forwardedRef !== null && forwardedRef !== undefined) {\n        (forwardedRef as React.MutableRefObject<HTMLDivElement | null>).current = node;\n      }\n    },\n    [forwardedRef]\n  );\n\n  return (\n    <div\n      {...mergeProps(overlayProps, dialogProps)}\n      ref={setRef}\n      aria-modal=\"true\"\n      className={cn(className, getAnimationClassName?.(animationState))}\n      data-animation-state={animationState}\n      onTransitionEnd={onTransitionEnd}\n    >\n      {children}\n    </div>\n  );\n};\n\nModalDrawerPanel.displayName = \"ModalDrawerPanel\";\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 *   translate-x driven by the `open` prop (spring-standard-spatial via CVA).\n *\n * - **`modal`**: portal to `document.body` with animation state machine\n *   (`entering → visible → exiting → exited`), `createPortal` + portal gate,\n *   `FocusScope`, `useDialog`, `useOverlay`, `usePreventScroll`, scrim, and\n *   `data-animation-state` on both the panel and scrim elements.\n *\n * React Aria hooks used (modal):\n * - `useDialog`              — `role=\"dialog\"`, `aria-modal`, `aria-label`\n * - `useOverlay`             — Escape key + outside-click dismissal\n * - `usePreventScroll`       — locks body scroll when panel is mounted\n * - `FocusScope`             — focus trap + restoreFocus on close\n * - `useOverlayTriggerState` — open/close state management\n *\n * @example\n * ```tsx\n * <HeadlessDrawer variant=\"modal\" open aria-label=\"Navigation\"\n *   getAnimationClassName={(s) => drawerAnimationVariants({ animationState: s })}>\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      getAnimationClassName,\n      getScrimAnimationClassName,\n      disableRipple = false,\n    },\n    ref\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 (modal only) ──────────────────────────────────\n\n    const [animationState, setAnimationState] = useState<DrawerAnimationState>(\"exited\");\n    const closedRef = useRef<boolean>(false);\n    const exitFallbackRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n    // Entry: isOpen true → 'entering' → rAF → 'visible'\n    useEffect(() => {\n      if (!isOpen) return;\n\n      closedRef.current = false;\n      setAnimationState(\"entering\");\n\n      // Zero-delay timer lets 'entering' paint (initial CSS values applied)\n      // before advancing to 'visible' to fire the enter animation.\n      const id = setTimeout(() => {\n        setAnimationState(\"visible\");\n      }, 0);\n\n      return () => clearTimeout(id);\n    }, [isOpen]);\n\n    // Exit: isOpen false + currently visible → 'exiting' → fallback → 'exited'\n    useEffect(() => {\n      if (isOpen) return;\n      if (animationState === \"exited\" || animationState === \"entering\") return;\n\n      if (animationState === \"visible\") {\n        setAnimationState(\"exiting\");\n\n        // 500ms fallback — longer than MD3 emphasized-accelerate (200ms) to give\n        // onTransitionEnd a chance to fire first under normal conditions.\n        exitFallbackRef.current = setTimeout(() => {\n          if (!closedRef.current) {\n            closedRef.current = true;\n            setAnimationState(\"exited\");\n          }\n        }, 500);\n      }\n    }, [isOpen, animationState]);\n\n    // Cleanup fallback timer on unmount\n    useEffect(\n      () => () => {\n        if (exitFallbackRef.current !== null) {\n          clearTimeout(exitFallbackRef.current);\n        }\n      },\n      []\n    );\n\n    const handleTransitionEnd = useCallback(() => {\n      if (animationState === \"exiting\" && !closedRef.current) {\n        if (exitFallbackRef.current !== null) {\n          clearTimeout(exitFallbackRef.current);\n          exitFallbackRef.current = null;\n        }\n        closedRef.current = true;\n        setAnimationState(\"exited\");\n      }\n    }, [animationState]);\n\n    const contextValue: DrawerContextValue = {\n      isOpen,\n      close,\n      disableRipple,\n    };\n\n    // ── Standard variant — inline nav, spring-slide via CVA classes ───────────\n\n    if (variant === \"standard\") {\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    // ── Modal variant — portal gate ───────────────────────────────────────────\n\n    // Remove portal content entirely once the exit animation has fully completed\n    if (!isOpen && animationState === \"exited\") {\n      return null;\n    }\n\n    // SSR guard\n    if (typeof document === \"undefined\") return null;\n\n    const content = (\n      <DrawerContext.Provider value={contextValue}>\n        <FocusScope contain restoreFocus autoFocus>\n          {/* Scrim — aria-hidden, click closes the drawer. Uses scrim-specific\n              animation class (fade in/out) separate from the panel slide. */}\n          <div\n            data-testid=\"drawer-scrim\"\n            className={cn(scrimClassName, getScrimAnimationClassName?.(animationState))}\n            data-animation-state={animationState}\n            onClick={close}\n            aria-hidden=\"true\"\n          />\n          <ModalDrawerPanel\n            ariaLabel={ariaLabel}\n            onClose={close}\n            className={className}\n            animationState={animationState}\n            getAnimationClassName={getAnimationClassName}\n            onTransitionEnd={handleTransitionEnd}\n            forwardedRef={ref}\n          >\n            {children}\n          </ModalDrawerPanel>\n        </FocusScope>\n      </DrawerContext.Provider>\n    );\n\n    return createPortal(content, document.body) as React.ReactElement;\n  }\n);\n\nHeadlessDrawer.displayName = \"HeadlessDrawer\";\n\n// ─── HeadlessDrawerItem ────────────────────────────────────────────────────────\n\n/**\n * Headless Navigation Drawer Item (Layer 2).\n *\n * Thin primitive — handles only behavior and ARIA semantics. All interaction\n * state tracking (hover, focus-visible, pressed) and data-* attributes live\n * in the styled layer (DrawerItem), mirroring the ButtonHeadless pattern.\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 *\n * @example\n * ```tsx\n * // Button-based item\n * <HeadlessDrawerItem onPress={() => navigate('home')} isActive>\n *   Home\n * </HeadlessDrawerItem>\n *\n * // Link-based item\n * <HeadlessDrawerItem href=\"/settings\">\n *   Settings\n * </HeadlessDrawerItem>\n * ```\n */\nexport const HeadlessDrawerItem = forwardRef<HTMLElement, HeadlessDrawerItemProps>(\n  (\n    {\n      href,\n      isActive = false,\n      children,\n      className,\n      isDisabled,\n      onMouseDown,\n      onPress,\n      onPressStart,\n      onPressEnd,\n      onPressChange,\n      onPressUp,\n      title,\n      ...restProps\n    },\n    forwardedRef\n  ) => {\n    const internalRef = useRef<HTMLElement>(null);\n\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, { onMouseDown })}\n          ref={linkRef}\n          href={href}\n          className={className}\n          title={title}\n          aria-current={isActive ? \"page\" : 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, { onMouseDown })}\n        ref={buttonRef}\n        className={className}\n        title={title}\n        aria-current={isActive ? \"page\" : undefined}\n      >\n        {children}\n      </button>\n    );\n  }\n);\n\nHeadlessDrawerItem.displayName = \"HeadlessDrawerItem\";\n\n// ─── Re-export context hook for styled layer ──────────────────────────────────\n\nexport { useDrawerContext };\n","\"use client\";\n\nimport { forwardRef } from \"react\";\nimport type { ForwardedRef } from \"react\";\nimport { useSeparator } from \"react-aria\";\n\nimport type { DividerHeadlessProps } from \"./Divider.types\";\n\n/**\n * DividerHeadless — Layer 2 unstyled separator primitive.\n *\n * Uses React Aria's `useSeparator` hook to attach the correct\n * `role=\"separator\"` and `aria-orientation` attributes.\n *\n * - Horizontal → renders `<hr>` (implicit ARIA separator role)\n * - Vertical   → renders `<div>` with explicit `role=\"separator\"`\n *\n * Bring your own styles via the `className` or `style` props.\n *\n * @example\n * ```tsx\n * <DividerHeadless\n *   orientation=\"horizontal\"\n *   className=\"w-full h-px bg-outline-variant\"\n * />\n * ```\n */\nexport const DividerHeadless = forwardRef<HTMLElement, DividerHeadlessProps>(\n  ({ orientation = \"horizontal\", className, style }, ref) => {\n    const { separatorProps } = useSeparator({\n      orientation,\n      elementType: orientation === \"vertical\" ? \"div\" : \"hr\",\n    });\n\n    if (orientation === \"vertical\") {\n      return (\n        <div\n          {...separatorProps}\n          ref={ref as ForwardedRef<HTMLDivElement>}\n          className={className}\n          style={style}\n        />\n      );\n    }\n\n    return (\n      <hr\n        {...separatorProps}\n        aria-orientation=\"horizontal\"\n        ref={ref as ForwardedRef<HTMLHRElement>}\n        className={className}\n        style={style}\n      />\n    );\n  }\n);\n\nDividerHeadless.displayName = \"DividerHeadless\";\n","import { cva, type VariantProps } from \"class-variance-authority\";\n\n/**\n * Material Design 3 Divider Variants (CVA)\n *\n * Architecture: Variants only — the Divider is a static, non-interactive element\n * (no hover/focus/pressed states) so there is no state-layer machinery.\n *\n * Implementation strategy:\n *   The border-* approach used previously required separate horizontal/vertical\n *   logic and could not share a single thickness control. We now use a background\n *   fill on a zero-border element, driven by a CSS custom property, which is the\n *   same technique used by the official @material/web md-divider implementation.\n *\n * CSS variable:\n *   --md-divider-thickness  (default: 1px, MD3 spec: 1dp)\n *   Override via style or a Tailwind arbitrary property:\n *     <Divider style={{ \"--md-divider-thickness\": \"2px\" }} />\n *\n * Orientation:\n *   horizontal — full-width strip, height driven by --md-divider-thickness\n *   vertical   — self-stretches to container height, width driven by var\n *\n * Inset (MD3 spec: 16dp logical offset, RTL-aware):\n *   start — ms-4  (inline-start, adapts to writing direction)\n *   end   — me-4  (inline-end)\n *   both  — ms-4 me-4\n *\n * MD3 Spec references:\n *   Color:     outline-variant  (--md-sys-color-outline-variant)\n *   Thickness: 1dp (no MD3 component token — exposed as a CSS var for parity with md-web)\n *   Inset:     16dp (--md-comp-divider-leading-space / --md-comp-divider-trailing-space)\n */\nexport const dividerVariants = cva(\n  [\n    // Zero border — color comes from background fill (matches md-web strategy)\n    \"shrink-0 border-0\",\n    // MD3 outline-variant color token\n    \"bg-outline-variant\",\n    // Default thickness — consumers override via the CSS custom property\n    \"[--md-divider-thickness:1px]\",\n  ],\n  {\n    variants: {\n      /**\n       * Controls the axis of the visual rule.\n       *\n       * horizontal — stretches to full inline width; block size is --md-divider-thickness\n       * vertical   — self-stretches to the block axis of the flex/grid parent;\n       *              inline size is --md-divider-thickness\n       */\n      orientation: {\n        horizontal: \"h-[var(--md-divider-thickness)]\",\n        vertical: \"self-stretch h-auto w-[var(--md-divider-thickness)]\",\n      },\n\n      /**\n       * Inset — logical inline offset per MD3 spec (16dp = 1rem = Tailwind spacing-4).\n       *\n       * Uses logical properties (ms-N / me-N) for correct behaviour under RTL\n       * writing modes (Arabic, Hebrew, etc.).\n       */\n      inset: {\n        none: \"\",\n        start: \"ms-4\",\n        end: \"me-4\",\n        both: \"ms-4 me-4\",\n      },\n    },\n\n    defaultVariants: {\n      orientation: \"horizontal\",\n      inset: \"none\",\n    },\n  }\n);\n\n/**\n * Inferred CVA variant prop types for the Divider component.\n */\nexport type DividerVariants = VariantProps<typeof dividerVariants>;\n","\"use client\";\n\nimport { forwardRef } from \"react\";\n\nimport { cn } from \"../../utils/cn\";\nimport { DividerHeadless } from \"./DividerHeadless\";\nimport { dividerVariants } from \"./Divider.variants\";\nimport type { DividerProps } from \"./Divider.types\";\n\n/**\n * Divider — MD3 Styled Component (Layer 3)\n *\n * A thin rule that separates content in lists and containers.\n * Supports horizontal/vertical orientations and four inset variants.\n *\n * Built on `DividerHeadless` (React Aria `useSeparator`) for accessible\n * ARIA semantics. Uses CVA variants mapped to MD3 design tokens.\n *\n * Thickness is controlled via the `--md-divider-thickness` CSS custom property\n * (default `1px`, matching the MD3 1dp spec). Override with a `style` prop:\n *\n * ```tsx\n * <Divider style={{ \"--md-divider-thickness\": \"2px\" }} />\n * ```\n *\n * @example\n * ```tsx\n * // Full-bleed horizontal divider\n * <Divider />\n *\n * // Inset from inline-start (RTL-aware, 16dp)\n * <Divider inset=\"start\" />\n *\n * // Vertical divider inside a flex row\n * <Divider orientation=\"vertical\" />\n *\n * // Custom thickness\n * <Divider style={{ \"--md-divider-thickness\": \"2px\" }} />\n * ```\n */\nexport const Divider = forwardRef<HTMLElement, DividerProps>(\n  ({ orientation = \"horizontal\", inset = \"none\", className, style }, ref) => (\n    <DividerHeadless\n      ref={ref}\n      orientation={orientation}\n      className={cn(dividerVariants({ orientation, inset }), className)}\n      {...(style !== undefined && { style })}\n    />\n  )\n);\n\nDivider.displayName = \"Divider\";\n","import { cva, type VariantProps } from \"class-variance-authority\";\n\n// ─── CONTAINER ────────────────────────────────────────────────────────────────\n\n/**\n * Material Design 3 Navigation Drawer container variants (CVA).\n *\n * Architecture: Variants vs States (component-variants.mdc)\n * - CVA holds design-time structure only (variant, open).\n * - No interaction states in CVA — they are driven by data-* on the root.\n *\n * Specification:\n *   Width:    360dp (`w-drawer`)\n *   Height:   100dvh (`h-full`)\n *   Padding:  12dp sides/top/bottom (`px-3 py-3`)\n *   Surface:  `bg-surface-container-low` (both variants per MD3 color token)\n *   Elevation: standard = none; modal = `shadow-elevation-1`\n *   Shape:\n *     standard = square trailing edge (`rounded-none`) — panel is flush with the\n *                screen left edge and has no exposed trailing corner.\n *     modal    = 16dp trailing corner (`rounded-r-lg`, MD3 corner-large) — the\n *                exposed right edge is rounded when the drawer overlays content.\n *\n * Standard slide motion (spatial, on-screen translate):\n *   Spring-standard-default-spatial (500ms, no overshoot) per md3-motion.mdc.\n *   \"enter = translate-x-0, exit = -translate-x-full\"\n *   Applied with `transition-transform` + spring tokens.\n *   Reduced motion: handled by caller appending `transition-none`.\n *\n * Modal motion (enters/exits the screen):\n *   Uses the animate-md-slide-in-left / animate-md-slide-out-left composite\n *   utilities applied via `drawerAnimationVariants` + the presence state machine\n *   in HeadlessDrawer. Container itself stays fixed; panel is portalled.\n *\n * @see https://m3.material.io/components/navigation-drawer/specs\n */\nexport const drawerVariants = cva(\n  [\n    // Layout\n    \"fixed top-0 left-0 h-full\",\n    \"flex flex-col overflow-y-auto\",\n    // Width — 360dp per MD3 spec\n    \"w-drawer\",\n    // Stacking\n    \"z-50\",\n    // Container padding — 12dp per MD3 nav drawer spec\n    \"px-3 py-3\",\n    // Focus outline removal (focus management handled by FocusScope / React Aria)\n    \"outline-none\",\n  ],\n  {\n    variants: {\n      /**\n       * Structural variant — drives shape and elevation.\n       *\n       * - `standard`: flush left panel, square trailing edge, flat surface.\n       * - `modal`:    overlay dialog, 16dp trailing corner, shadow-elevation-1.\n       */\n      variant: {\n        standard: [\"bg-surface-container-low\", \"rounded-none\"],\n        modal: [\"bg-surface-container-low\", \"rounded-r-lg\", \"shadow-elevation-1\"],\n      },\n\n      /**\n       * Open/closed state — drives translation for the STANDARD variant only.\n       *\n       * Standard slide: spatial on-screen property → spring-standard-default-spatial.\n       * Modal enter/exit is handled externally via drawerAnimationVariants + portal gate.\n       *\n       * - `true`:  translate-x-0 (visible)\n       * - `false`: -translate-x-full (off-screen to the left)\n       */\n      open: {\n        true: [\n          \"translate-x-0\",\n          \"transition-transform\",\n          \"duration-spring-standard-default-spatial\",\n          \"ease-spring-standard-default-spatial\",\n        ],\n        false: [\n          \"-translate-x-full\",\n          \"transition-transform\",\n          \"duration-spring-standard-default-spatial\",\n          \"ease-spring-standard-default-spatial\",\n        ],\n      },\n    },\n\n    defaultVariants: {\n      variant: \"standard\",\n      open: false,\n    },\n  }\n);\n\n// ─── DRAWER ANIMATION (MODAL enter/exit) ─────────────────────────────────────\n\n/**\n * Animation state CVA for the MODAL drawer panel.\n *\n * Mirrors the `bottomSheetAnimationVariants` pattern exactly.\n * Applied by `Drawer.tsx` via a `getAnimationClassName` callback that is\n * gated on `useReducedMotion()`.\n *\n * Motion tokens (drawer is a large screen-level element, left-edge):\n *   Enter: `animate-md-slide-in-left`  — standard-default-spatial (500ms)\n *   Exit:  `animate-md-slide-out-left` — emphasized-accelerate   (200ms)\n *\n * State machine: entering → visible → exiting → exited\n *   entering: mount frame, panel is transparent/off-screen (no animation yet)\n *   visible:  entry animation fires\n *   exiting:  exit animation fires; `onTransitionEnd` + fallback timer → exited\n *   exited:   portal gate removes the element\n *\n * @see packages/react/src/components/BottomSheet/BottomSheet.variants.ts\n * @see https://m3.material.io/components/navigation-drawer/specs — Motion\n */\nexport const drawerAnimationVariants = cva(\"\", {\n  variants: {\n    animationState: {\n      // Mount frame: invisible until animation starts\n      entering: [\"opacity-0\"],\n      // Entry animation: slide in from the left edge\n      visible: [\"animate-md-slide-in-left\"],\n      // Exit animation: slide out to the left\n      exiting: [\"animate-md-slide-out-left\"],\n      // Portal gate removes element; classes below act as a safety net\n      exited: [\"opacity-0\", \"pointer-events-none\"],\n    },\n  },\n  defaultVariants: {\n    animationState: \"entering\",\n  },\n});\n\n/**\n * Scrim animation CVA — controls the modal backdrop fade via CSS transition.\n *\n * Uses `transition-opacity` (an effects property — no overshoot) rather than\n * `animate-md-fade-*` keyframes so that the opacity change is a plain\n * CSS transition from one state to another, avoiding a `tailwind-merge`\n * conflict between the base `opacity-32` and the keyframe `opacity-1`.\n *\n * Opacity sequence per state:\n *   entering: opacity-0   (invisible mount frame — transition will start here)\n *   visible:  opacity-32  (MD3 scrim opacity; CSS transition from 0→32 fires)\n *   exiting:  opacity-0   (CSS transition from 32→0 fires)\n *   exited:   opacity-0 + pointer-events-none (portal gate removes element)\n *\n * NOTE: the base `drawerScrimVariants` must NOT include `opacity-32` so that\n * tailwind-merge does not collapse it with these per-state opacity classes.\n *\n * @see https://m3.material.io/components/navigation-drawer/specs — Scrim callout 9\n */\nexport const drawerScrimAnimationVariants = cva(\n  [\n    \"transition-opacity\",\n    \"duration-spring-standard-fast-effects\",\n    \"ease-spring-standard-fast-effects\",\n  ],\n  {\n    variants: {\n      animationState: {\n        entering: [\"opacity-0\"],\n        visible: [\"opacity-32\"],\n        exiting: [\"opacity-0\"],\n        exited: [\"opacity-0\", \"pointer-events-none\"],\n      },\n    },\n    defaultVariants: {\n      animationState: \"entering\",\n    },\n  }\n);\n\n// ─── DRAWER ITEM ROOT ─────────────────────────────────────────────────────────\n\n/**\n * Material Design 3 Navigation Drawer item root variants (CVA).\n *\n * Architecture: root is the `group/draweritem` host. It owns layout, shape,\n * and cursor. Colors (content color) live here via self-targeting `data-[x]:`\n * selectors since the root IS the group host.\n *\n * Slot z-order:\n *   activeIndicator  z-0    — secondary-container pill background\n *   stateLayer       z-[1]  — hover/press opacity overlay\n *   focusRing        z-[2]  — keyboard focus outline\n *   ripple           z-[3]  — press ripple feedback\n *   content          z-10   — icon, label, badge\n *\n * Specification:\n *   Height:     56dp (`h-14`)\n *   Shape:      `rounded-full` (pill)\n *   Padding:    16dp leading (`pl-4`), 24dp trailing (`pr-6`)\n *   Gap:        12dp icon-to-label (`gap-3`)\n *   Typography: Label Large — 14sp / 500 / 0.1px tracking\n *\n * @see https://m3.material.io/components/navigation-drawer/specs\n */\nexport const drawerItemVariants = cva([\n  // Layout\n  \"relative flex w-full items-center\",\n  \"h-14 pl-4 pr-6 gap-3\",\n  // Shape\n  \"rounded-full\",\n  // Typography — Label Large per MD3 spec (size via text-label-large, weight + tracking explicit)\n  \"text-label-large\",\n  \"font-medium\",\n  \"tracking-[0.1px]\",\n  // Interaction\n  \"cursor-pointer select-none outline-none\",\n  // Color transition (effects — no overshoot)\n  \"transition-colors duration-spring-standard-fast-effects ease-spring-standard-fast-effects\",\n  // Inactive content color (icon/label/badge inherit this via currentColor)\n  \"text-on-surface-variant\",\n  // Active content color — self-targeting data-[active]: (root is the group host)\n  \"data-[active]:text-on-secondary-container\",\n  // Disabled — self-targeting\n  \"data-[disabled]:pointer-events-none data-[disabled]:cursor-not-allowed\",\n  \"data-[disabled]:text-on-surface/38\",\n]);\n\n// ─── ACTIVE INDICATOR ─────────────────────────────────────────────────────────\n\n/**\n * Active indicator — secondary-container pill background.\n *\n * Fills the item shape (`inset-0 rounded-[inherit]`) and uses opacity\n * to toggle visibility when the item becomes active. Separating this from\n * the root background lets the state layer sit above it at z-[1].\n *\n * Color: `bg-secondary-container` per MD3 color token (callout 5).\n *\n * @see https://m3.material.io/components/navigation-drawer/specs\n */\nexport const drawerItemActiveIndicatorVariants = cva([\n  \"absolute inset-0 rounded-[inherit] pointer-events-none\",\n  \"bg-secondary-container\",\n  // Effects transition for opacity — no overshoot\n  \"transition-opacity duration-spring-standard-fast-effects ease-spring-standard-fast-effects\",\n  // Hidden when inactive; shown when active\n  \"opacity-0\",\n  \"group-data-[active]/draweritem:opacity-100\",\n  // z-0: below state layer (z-[1]) and content (z-10)\n  \"z-0\",\n]);\n\n// ─── STATE LAYER ──────────────────────────────────────────────────────────────\n\n/**\n * State layer — absolute inset overlay that transitions opacity on\n * hover / focus-visible / press interaction states.\n *\n * Color mapping per MD3 spec:\n *   Inactive: `bg-on-surface-variant` (callout 2/8)\n *   Active:   `bg-on-secondary-container` (callout 3/6)\n *\n * State-layer opacities per MD3 spec:\n *   Hover:         8%  (opacity-8)\n *   Focused:       10% (opacity-10)\n *   Pressed:       10% (opacity-10 — doubled selector wins over hover)\n *   Hidden when disabled.\n *\n * Focus-visible also activates the dedicated focus-ring slot\n * (drawerItemFocusRingVariants) per WCAG 2.4.7. Both layer + ring are shown\n * simultaneously, matching the BottomSheet handle and MD3 reference grid.\n *\n * @see https://m3.material.io/components/navigation-drawer/specs#states\n */\nexport const drawerItemStateLayerVariants = cva([\n  \"absolute inset-0 rounded-[inherit] overflow-hidden pointer-events-none opacity-0\",\n  // Effects transition — opacity must NOT overshoot\n  \"transition-opacity duration-spring-standard-fast-effects ease-spring-standard-fast-effects\",\n  // Color: inactive uses on-surface-variant; active switches to on-secondary-container\n  \"bg-on-surface-variant\",\n  \"group-data-[active]/draweritem:bg-on-secondary-container\",\n  // Hover: 8%\n  \"group-data-[hovered]/draweritem:opacity-8\",\n  // Focus-visible: 10% (MD3 focus state layer)\n  \"group-data-[focus-visible]/draweritem:opacity-10\",\n  // Pressed: 10%, doubled selector wins over hover at same cascade position\n  \"group-data-[pressed]/draweritem:group-data-[pressed]/draweritem:opacity-10\",\n  // No state layer when disabled\n  \"group-data-[disabled]/draweritem:hidden\",\n  // z-[1]: above active indicator (z-0), below focus ring and content\n  \"z-[1]\",\n]);\n\n// ─── FOCUS RING ───────────────────────────────────────────────────────────────\n\n/**\n * Focus ring slot — keyboard-focus indicator rendered as an absolute overlay.\n *\n * Uses `-outline-offset-2` (inset 2dp) so the outline stays within the pill\n * shape and does not spill into adjacent items.\n *\n * Shown alongside the 10% state layer for full MD3 focus state compliance.\n * Color: `outline-secondary` per MD3 focus indicator token.\n * Opacity: 0 at rest → 100% on focus-visible.\n *\n * @see https://m3.material.io/components/navigation-drawer/specs#states\n */\nexport const drawerItemFocusRingVariants = cva([\n  \"pointer-events-none absolute inset-0 rounded-[inherit]\",\n  \"outline outline-2 -outline-offset-2 outline-secondary\",\n  // Effects transition — opacity must not overshoot\n  \"transition-opacity duration-spring-standard-fast-effects ease-spring-standard-fast-effects\",\n  \"opacity-0\",\n  \"group-data-[focus-visible]/draweritem:opacity-100\",\n  // z-[2]: above state layer (z-[1]), below content (z-10)\n  \"z-[2]\",\n]);\n\n// ─── ICON ─────────────────────────────────────────────────────────────────────\n\n/**\n * Leading icon slot.\n *\n * MD3 spec: 24dp × 24dp icon.\n * Color inherits from the root `text-*` via `currentColor`.\n * Inactive: `text-on-surface-variant` (via root).\n * Active:   `text-on-secondary-container` (via root data-[active]).\n * Disabled: explicit `text-on-surface/38` override (matches Menu icon pattern).\n *\n * @see https://m3.material.io/components/navigation-drawer/specs#anatomy\n */\nexport const drawerItemIconVariants = cva([\n  \"relative z-10 flex shrink-0 items-center justify-center\",\n  \"h-6 w-6\",\n  // Color and transition inherited via currentColor from root\n  \"transition-colors duration-spring-standard-fast-effects ease-spring-standard-fast-effects\",\n  // Explicit disabled override — mirrors Menu icon (on-surface/38)\n  \"group-data-[disabled]/draweritem:text-on-surface/38\",\n]);\n\n// ─── LABEL ────────────────────────────────────────────────────────────────────\n\n/**\n * Label text slot.\n *\n * Typography (Label Large — size, weight, tracking) is set on the root via\n * `drawerItemVariants` and inherited here via cascade.\n * `z-10` keeps it above the state layer and active indicator overlays.\n */\nexport const drawerItemLabelVariants = cva([\"relative z-10 flex-1 min-w-0 truncate\"]);\n\n// ─── BADGE ────────────────────────────────────────────────────────────────────\n\n/**\n * Trailing badge label text slot.\n *\n * MD3 anatomy element 5 — \"Badge label text\".\n * Rendered as plain inline text, colored by the item's active/inactive state\n * via the root's inherited text color.\n *\n * Typography: Label Large — size via `text-label-large`, weight and tracking\n * set explicitly so they are not lost when the element is not a block-level\n * inheritor in all browsers.\n *\n * @see https://m3.material.io/components/navigation-drawer/specs#anatomy\n */\nexport const drawerItemBadgeVariants = cva([\n  \"relative z-10 shrink-0 ml-auto\",\n  \"text-label-large\",\n  \"font-medium\",\n  \"tracking-[0.1px]\",\n  \"transition-colors duration-spring-standard-fast-effects ease-spring-standard-fast-effects\",\n]);\n\n// ─── HEADLINE ─────────────────────────────────────────────────────────────────\n\n/**\n * Material Design 3 Navigation Drawer Headline variants (CVA).\n *\n * MD3 anatomy element 2 — the header text at the top of the drawer.\n * Typography: Title Small — 14sp / 500 / 0.1px tracking.\n * Color: `text-on-surface-variant`.\n * Padding: 16dp top (pt-4), 16dp horizontal (px-4), 4dp bottom (pb-1).\n *\n * @see https://m3.material.io/components/navigation-drawer/specs#anatomy\n */\nexport const drawerHeadlineVariants = cva([\n  \"px-4 pt-4 pb-1\",\n  \"text-title-small\",\n  \"font-medium\",\n  \"tracking-[0.1px]\",\n  \"text-on-surface-variant\",\n  \"select-none\",\n]);\n\n// ─── SCRIM ────────────────────────────────────────────────────────────────────\n\n/**\n * Modal scrim overlay base styles (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 callout 9.\n *\n * Enter/exit fade is applied via `drawerScrimAnimationVariants` by the\n * animation-state machine in HeadlessDrawer.\n *\n * @see https://m3.material.io/components/navigation-drawer/specs\n */\nexport const drawerScrimVariants = cva([\n  \"fixed inset-0 z-40\",\n  // NOTE: opacity is intentionally absent here — it is controlled per\n  // animation state by drawerScrimAnimationVariants (opacity-0 / opacity-32)\n  // to avoid tailwind-merge collapsing the classes during cn() composition.\n  \"bg-scrim\",\n]);\n\n// ─── SECTION ──────────────────────────────────────────────────────────────────\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 * Typography: Title Small — 14sp / 500 / 0.1px tracking per MD3 spec.\n * Color: `text-on-surface-variant`.\n * Padding: 16dp horizontal (aligned with item icon), 16dp top, 8dp bottom.\n *\n * @see https://m3.material.io/components/navigation-drawer/specs\n */\nexport const drawerSectionHeaderVariants = cva([\n  \"px-4 pt-4 pb-2\",\n  \"text-title-small\",\n  \"font-medium\",\n  \"tracking-[0.1px]\",\n  \"text-on-surface-variant\",\n  \"select-none\",\n]);\n\n// ─── TYPE EXPORTS ─────────────────────────────────────────────────────────────\n\nexport type DrawerVariants = VariantProps<typeof drawerVariants>;\nexport type DrawerAnimationVariants = VariantProps<typeof drawerAnimationVariants>;\nexport type DrawerScrimAnimationVariants = VariantProps<typeof drawerScrimAnimationVariants>;\nexport type DrawerItemVariants = VariantProps<typeof drawerItemVariants>;\nexport type DrawerItemActiveIndicatorVariants = VariantProps<\n  typeof drawerItemActiveIndicatorVariants\n>;\nexport type DrawerItemStateLayerVariants = VariantProps<typeof drawerItemStateLayerVariants>;\nexport type DrawerItemFocusRingVariants = VariantProps<typeof drawerItemFocusRingVariants>;\nexport type DrawerItemIconVariants = VariantProps<typeof drawerItemIconVariants>;\nexport type DrawerItemLabelVariants = VariantProps<typeof drawerItemLabelVariants>;\nexport type DrawerItemBadgeVariants = VariantProps<typeof drawerItemBadgeVariants>;\nexport type DrawerHeadlineVariants = VariantProps<typeof drawerHeadlineVariants>;\nexport type DrawerScrimVariants = VariantProps<typeof drawerScrimVariants>;\nexport type DrawerSectionVariants = VariantProps<typeof drawerSectionVariants>;\n","\"use client\";\n\nimport { forwardRef } from \"react\";\nimport { Divider } from \"../Divider\";\nimport { drawerSectionVariants, drawerSectionHeaderVariants } from \"./Drawer.variants\";\nimport { cn } from \"../../utils/cn\";\nimport type { DrawerSectionProps } from \"./Drawer.types\";\n\n/**\n * Internal props extending the public DrawerSectionProps.\n * `_isFirstSection` is injected by the parent `Drawer` to suppress\n * the top divider on the first section.\n * @internal\n */\ninterface DrawerSectionInternalProps extends DrawerSectionProps {\n  /** @internal Injected by Drawer — suppresses the divider on the first section. */\n  _isFirstSection?: boolean;\n}\n\n/**\n * Material Design 3 Navigation Drawer Section (Layer 3: Styled).\n *\n * Groups related `DrawerItem` elements with an optional header label and\n * a horizontal divider. Follows MD3 Navigation Drawer spec for section\n * grouping and typography.\n *\n * Features:\n * - Optional header label: `text-title-small text-on-surface-variant`\n * - Optional top divider via `Divider` component\n * - Divider auto-hidden on the first section inside a `Drawer`\n *\n * @example\n * ```tsx\n * // Section with header and divider\n * <DrawerSection header=\"Labels\" showDivider>\n *   <DrawerItem icon={<LabelIcon />} label=\"Promotions\" />\n *   <DrawerItem icon={<LabelIcon />} label=\"Social\" />\n * </DrawerSection>\n *\n * // Section without header (just a visual group)\n * <DrawerSection showDivider>\n *   <DrawerItem label=\"Help\" />\n * </DrawerSection>\n * ```\n *\n * @see https://m3.material.io/components/navigation-drawer/specs\n */\nexport const DrawerSection = forwardRef<HTMLDivElement, DrawerSectionInternalProps>(\n  ({ header, children, showDivider = true, _isFirstSection = false, className }, ref) => {\n    const shouldShowDivider = showDivider && !_isFirstSection;\n\n    return (\n      <div ref={ref} className={cn(drawerSectionVariants(), className)} data-drawer-section>\n        {shouldShowDivider && <Divider orientation=\"horizontal\" className=\"my-1\" />}\n\n        {/* Section header label */}\n        {header && <span className={drawerSectionHeaderVariants()}>{header}</span>}\n\n        {/* Section items */}\n        {children}\n      </div>\n    );\n  }\n);\n\nDrawerSection.displayName = \"DrawerSection\";\n","\"use client\";\n\nimport React, { forwardRef } from \"react\";\nimport { HeadlessDrawer } from \"./DrawerHeadless\";\nimport { DrawerSection } from \"./DrawerSection\";\nimport {\n  drawerAnimationVariants,\n  drawerScrimAnimationVariants,\n  drawerVariants,\n  drawerScrimVariants,\n} from \"./Drawer.variants\";\nimport { cn } from \"../../utils/cn\";\nimport { useReducedMotion } from \"../../hooks/useReducedMotion\";\nimport type { DrawerAnimationState, 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`, no elevation, square trailing edge.\n *   Slide motion: `transition-transform` + spring-standard-default-spatial\n *   (500ms, no overshoot) driven by translate-x via `drawerVariants`.\n *\n * - **`modal`** — Portal overlay with animation state machine, scrim backdrop,\n *   focus trap, and `Escape` to close.\n *   Surface: `bg-surface-container-low` + `shadow-elevation-1`.\n *   Shape: `rounded-r-lg` (16dp trailing corner per MD3).\n *   Motion: `animate-md-slide-in-left` / `animate-md-slide-out-left` via\n *   `drawerAnimationVariants` + `drawerScrimAnimationVariants`.\n *\n * Both variants:\n * - `role=\"navigation\"` on the outer wrapper\n * - `w-drawer` (360dp)\n *\n * Reduced motion: when `prefers-reduced-motion: reduce` is active, all\n * animation classes are suppressed (`getAnimationClassName` returns `\"\"`\n * and `transition-none` is appended to the standard variant panel).\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 *   <DrawerHeadline>Mail</DrawerHeadline>\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\n * <Drawer variant=\"modal\" open={open} onOpenChange={setOpen} aria-label=\"App navigation\">\n *   <DrawerItem icon={<HomeIcon />} label=\"Home\" isActive />\n * </Drawer>\n * ```\n *\n * @see https://m3.material.io/components/navigation-drawer/overview\n */\nexport const Drawer = forwardRef<HTMLElement, DrawerProps>(\n  (\n    {\n      variant = \"standard\",\n      open,\n      defaultOpen = false,\n      onOpenChange,\n      \"aria-label\": ariaLabel,\n      children,\n      className,\n      disableRipple = false,\n      ...restProps\n    },\n    ref\n  ) => {\n    const isOpen = open ?? defaultOpen;\n    const reducedMotion = useReducedMotion();\n\n    // ── Panel class ───────────────────────────────────────────────────────────\n\n    const drawerPanelClass = cn(\n      drawerVariants({ variant, open: isOpen }),\n      // Suppress spring transition when user has requested reduced motion\n      reducedMotion && \"transition-none\",\n      className\n    );\n\n    // ── Scrim base class (modal only) ─────────────────────────────────────────\n\n    const scrimClass = drawerScrimVariants();\n\n    // ── Animation class callback (modal only) ─────────────────────────────────\n    //\n    // Reduced motion: return \"\" so no animation classes are applied.\n    // Normal: delegate to the CVA variants for panel and scrim independently.\n\n    const getAnimationClassName = reducedMotion\n      ? (_state: DrawerAnimationState): string => \"\"\n      : (state: DrawerAnimationState): string => drawerAnimationVariants({ animationState: state });\n\n    const getScrimAnimationClassName = reducedMotion\n      ? (_state: DrawerAnimationState): string => \"\"\n      : (state: DrawerAnimationState): string =>\n          drawerScrimAnimationVariants({ animationState: state });\n\n    // ── Children pre-processing ───────────────────────────────────────────────\n    //\n    // Mark the first DrawerSection to suppress its top divider so the drawer\n    // does not open with a stray rule between the headline and the first group.\n\n    let foundFirstSection = false;\n    const processedChildren = React.Children.map(children, (child) => {\n      if (React.isValidElement(child) && child.type === DrawerSection) {\n        if (!foundFirstSection) {\n          foundFirstSection = true;\n          return React.cloneElement(child as React.ReactElement<Record<string, unknown>>, {\n            _isFirstSection: true,\n          });\n        }\n      }\n      return child;\n    });\n\n    return (\n      <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        getAnimationClassName={getAnimationClassName}\n        getScrimAnimationClassName={getScrimAnimationClassName}\n        disableRipple={disableRipple}\n        {...restProps}\n      >\n        {processedChildren}\n      </HeadlessDrawer>\n    );\n  }\n);\n\nDrawer.displayName = \"Drawer\";\n","\"use client\";\n\nimport { forwardRef, useCallback, useState } from \"react\";\nimport { useHover, useFocusRing, mergeProps } from \"react-aria\";\nimport { HeadlessDrawerItem } from \"./DrawerHeadless\";\nimport {\n  drawerItemVariants,\n  drawerItemActiveIndicatorVariants,\n  drawerItemStateLayerVariants,\n  drawerItemFocusRingVariants,\n  drawerItemIconVariants,\n  drawerItemLabelVariants,\n  drawerItemBadgeVariants,\n} from \"./Drawer.variants\";\nimport { cn } from \"../../utils/cn\";\nimport { getInteractionDataAttributes } from \"../../utils/interactionStates\";\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 * Architecture: Variants vs States (component-variants.mdc)\n * - Root is `group/draweritem` host; all slots read state via\n *   `group-data-[x]/draweritem:` selectors.\n * - Interaction states tracked in this styled layer via React Aria hooks\n *   and emitted as `data-*` attributes on the root via `getInteractionDataAttributes`.\n * - `data-active` is a content flag set explicitly (not via the shared helper).\n *\n * Slot z-order:\n *   activeIndicator  z-0    — `bg-secondary-container` pill\n *   stateLayer       z-[1]  — hover (8%) / press (10%) opacity overlay\n *   focusRing        z-[2]  — keyboard focus outline (inset, `-outline-offset-2`)\n *   ripple           z-[3]  — press ripple feedback\n *   icon             z-10   — leading icon (24dp)\n *   label            z-10   — label text\n *   badge            z-10   — trailing badge text\n *\n * Renders as `<a>` when `href` is provided, `<button>` otherwise.\n *\n * @example\n * ```tsx\n * // Active item with icon\n * <DrawerItem icon={<HomeIcon />} label=\"Home\" isActive onPress={() => navigate('/')} />\n *\n * // Item with badge count\n * <DrawerItem label=\"Inbox\" badge={24} />\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      isActive = false,\n      isDisabled = false,\n      disableRipple = false,\n      className,\n      // All remaining props (onPress, onPressStart, onPressEnd, etc.) stay in\n      // restProps and are passed into mergeProps — mirrors the Button pattern.\n      ...restProps\n    },\n    ref\n  ) => {\n    // ── Interaction state tracking ─────────────────────────────────────────\n    const [isPressed, setIsPressed] = useState(false);\n    const handlePressStart = useCallback(() => setIsPressed(true), []);\n    const handlePressEnd = useCallback(() => setIsPressed(false), []);\n\n    const { isHovered, hoverProps } = useHover({ isDisabled });\n    const { isFocusVisible, focusProps } = useFocusRing();\n\n    // Ripple effect\n    const { onMouseDown: handleRipple, ripples } = useRipple({\n      disabled: isDisabled || disableRipple,\n    });\n\n    // All event handlers merged in one call — mergeProps chains handlers so both\n    // the internal state-tracking callbacks and the caller's handlers fire.\n    // restProps is passed as the last argument so caller handlers run after ours.\n    const mergedInteractionProps = mergeProps(\n      hoverProps,\n      focusProps,\n      { onPressStart: handlePressStart, onPressEnd: handlePressEnd },\n      restProps\n    );\n\n    return (\n      <HeadlessDrawerItem\n        {...mergedInteractionProps}\n        ref={ref}\n        {...(href !== undefined ? { href } : {})}\n        isActive={isActive}\n        {...(isDisabled !== undefined ? { isDisabled } : {})}\n        onMouseDown={handleRipple}\n        // ── Interaction data attributes ──────────────────────────────────\n        {...getInteractionDataAttributes({\n          isHovered,\n          isFocusVisible,\n          isPressed,\n          isDisabled,\n        })}\n        // ── Content flag: active is structural, not an interaction state ─\n        data-active={isActive ? \"\" : undefined}\n        className={cn(\n          drawerItemVariants(),\n          // group/draweritem: enables group-data-[x]/draweritem selectors in all slots\n          \"group/draweritem\",\n          className\n        )}\n      >\n        {/* ── Active indicator (z-0) ──────────────────────────────────────── */}\n        {/* secondary-container pill; opacity 0→1 driven by data-active on root */}\n        <span aria-hidden=\"true\" className={drawerItemActiveIndicatorVariants()} />\n\n        {/* ── State layer (z-[1]) ─────────────────────────────────────────── */}\n        {/* Hover 8% / press 10%; color switches on data-active */}\n        <span aria-hidden=\"true\" className={drawerItemStateLayerVariants()} />\n\n        {/* ── Focus ring (z-[2]) ──────────────────────────────────────────── */}\n        {/* Inset outline; opacity 0→100 on focus-visible */}\n        <span aria-hidden=\"true\" className={drawerItemFocusRingVariants()} />\n\n        {/* ── Ripple container (z-[3]) ────────────────────────────────────── */}\n        <span\n          className=\"pointer-events-none absolute inset-0 z-[3] overflow-hidden rounded-[inherit]\"\n          aria-hidden=\"true\"\n        >\n          {ripples}\n        </span>\n\n        {/* ── Leading icon (z-10) ─────────────────────────────────────────── */}\n        {icon && (\n          <span aria-hidden=\"true\" className={drawerItemIconVariants()}>\n            {icon}\n          </span>\n        )}\n\n        {/* ── Label (z-10) ────────────────────────────────────────────────── */}\n        <span className={drawerItemLabelVariants()}>{label}</span>\n\n        {/* ── Trailing badge text (z-10) ──────────────────────────────────── */}\n        {badge !== undefined && badge !== null && (\n          <span\n            role=\"status\"\n            aria-label={typeof badge === \"number\" ? `${badge} notifications` : String(badge)}\n            className={drawerItemBadgeVariants()}\n          >\n            {badge}\n          </span>\n        )}\n      </HeadlessDrawerItem>\n    );\n  }\n);\n\nDrawerItem.displayName = \"DrawerItem\";\n","\"use client\";\n\nimport { forwardRef } from \"react\";\nimport { drawerHeadlineVariants } from \"./Drawer.variants\";\nimport { cn } from \"../../utils/cn\";\nimport type { DrawerHeadlineProps } from \"./Drawer.types\";\n\n/**\n * Material Design 3 Navigation Drawer Headline (Layer 3: Styled).\n *\n * MD3 anatomy element 2 — the header text displayed at the top of the drawer,\n * typically the app name or primary section label.\n *\n * Typography: `text-title-small`\n * Color:      `text-on-surface-variant`\n *\n * @example\n * ```tsx\n * <Drawer aria-label=\"App navigation\">\n *   <DrawerHeadline>Mail</DrawerHeadline>\n *   <DrawerItem label=\"Inbox\" isActive />\n * </Drawer>\n * ```\n *\n * @see https://m3.material.io/components/navigation-drawer/specs#anatomy\n */\nexport const DrawerHeadline = forwardRef<HTMLSpanElement, DrawerHeadlineProps>(\n  ({ children, className, ...restProps }, ref) => (\n    <span ref={ref} className={cn(drawerHeadlineVariants(), className)} {...restProps}>\n      {children}\n    </span>\n  )\n);\n\nDrawerHeadline.displayName = \"DrawerHeadline\";\n","import { cva, type VariantProps } from \"class-variance-authority\";\n\n/**\n * Material Design 3 Progress Indicator Variants (CVA)\n *\n * Architecture: Slot-based CVA blocks (no interaction states — Progress is non-interactive).\n * Each DOM slot owns a separate CVA. Design-time variant props (type, size, thickness)\n * are passed to the appropriate slot; no state variants exist here.\n *\n * MD3 Expressive spec (materialy.io/components/progress-indicators):\n *   Active indicator color : primary\n *   Inactive track color   : primary-container  (Expressive \"colorful\" style)\n *   Indicator-track gap    : 4dp\n *   Stop indicator         : 4dp dot, primary, trailing edge (linear determinate only)\n *   Track corner radius    : fully-rounded (rounded-full for all segments)\n *   Track thickness        : 4dp default (h-1) | 8dp thick (h-2)\n *   Determinate transition : spatial spring — width/stroke are spatial properties\n *   Indeterminate motion   : keyframes in Progress.css referencing MD3 motion tokens\n *\n * Slot map:\n *   progressContainerVariants     — outer wrapper; flex layout\n *   progressLabelVariants         — body-small on-surface label text\n *   progressTrackVariants         — linear inactive rail; thickness variant\n *   progressActiveIndicatorVariants — linear active fill; spring spatial transition\n *   progressInactiveSegmentVariants — linear inactive segment (rendered after gap)\n *   progressStopIndicatorVariants  — 4dp primary dot at trailing edge (linear det only)\n *   progressCircularSizeVariants   — circular SVG wrapper; size + thickness variant\n */\n\n// ─── CONTAINER ────────────────────────────────────────────────────────────────\n\n/**\n * Outer wrapper for the entire progress indicator (label + visual).\n * linear → full-width column; circular → auto-width centred column.\n */\nexport const progressContainerVariants = cva([\"inline-flex\", \"flex-col\", \"gap-1\"], {\n  variants: {\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// ─── LABEL ────────────────────────────────────────────────────────────────────\n\n/**\n * Optional visible label rendered above the indicator.\n * MD3: body-small type scale, on-surface color role.\n */\nexport const progressLabelVariants = cva([\"text-body-small\", \"text-on-surface\", \"select-none\"]);\n\n// ─── LINEAR TRACK (OUTER WRAPPER) ─────────────────────────────────────────────\n\n/**\n * Linear track outer wrapper.\n * This element establishes the full-width positioning context for the\n * active indicator, inactive segment, and stop indicator.\n * It does NOT carry a background color itself — the inactive track is a\n * separate sibling element rendered after the gap.\n *\n * thickness variant:\n *   default → h-1 (4dp)\n *   thick   → h-2 (8dp) per MD3 Expressive \"thick\" configuration\n */\nexport const progressTrackVariants = cva(\n  [\n    \"relative\",\n    \"w-full\",\n    \"overflow-visible\", // gap segments extend beyond clipping bounds\n    \"rounded-full\",\n  ],\n  {\n    variants: {\n      thickness: {\n        default: \"h-1\",\n        thick: \"h-2\",\n      },\n    },\n    defaultVariants: {\n      thickness: \"default\",\n    },\n  }\n);\n\n// ─── LINEAR ACTIVE INDICATOR ──────────────────────────────────────────────────\n\n/**\n * Linear active indicator bar (foreground fill).\n *\n * MD3 Expressive: primary color, fully rounded.\n * Spatial spring transition on width — width is a spatial property\n * (can animate with controlled overshoot), not an effects property.\n *\n * Uses spring-standard-default-spatial (500ms) — progress updates are\n * purposeful UI feedback, not high-emphasis expressive moments.\n */\nexport const progressActiveIndicatorVariants = cva([\n  \"absolute\",\n  \"left-0\",\n  \"top-0\",\n  \"h-full\",\n  \"rounded-full\",\n  \"bg-primary\",\n  // Spatial spring — width changes are spatial (bar growing)\n  \"transition-[width]\",\n  \"duration-spring-standard-default-spatial\",\n  \"ease-spring-standard-default-spatial\",\n]);\n\n// ─── LINEAR INACTIVE SEGMENT (AFTER GAP) ──────────────────────────────────────\n\n/**\n * Linear inactive segment — rendered to the right of the active indicator\n * with a 4dp gap between them.\n *\n * MD3 Expressive: primary-container color, fully rounded.\n * `left` is set inline to `calc(P% + 4px)` by the component.\n * Hidden when progress reaches 100% (right=0 with left>100% collapses it).\n */\nexport const progressInactiveSegmentVariants = cva([\n  \"absolute\",\n  \"top-0\",\n  \"right-0\",\n  \"h-full\",\n  \"rounded-full\",\n  \"bg-primary-container\",\n  // Spatial spring on left position (gap moves as progress moves)\n  \"transition-[left]\",\n  \"duration-spring-standard-default-spatial\",\n  \"ease-spring-standard-default-spatial\",\n]);\n\n// ─── STOP INDICATOR ───────────────────────────────────────────────────────────\n\n/**\n * Stop indicator dot — trailing edge of the track for linear determinate.\n *\n * MD3 spec: 4dp size, primary color, always at the far right edge.\n * Required when the track has contrast < 3:1 with its container surface;\n * included unconditionally for determinacy and clarity.\n */\nexport const progressStopIndicatorVariants = cva([\n  \"absolute\",\n  \"right-0\",\n  \"top-1/2\",\n  \"-translate-y-1/2\",\n  \"size-1\", // 4dp\n  \"rounded-full\",\n  \"bg-primary\",\n]);\n\n// ─── CIRCULAR SIZE ────────────────────────────────────────────────────────────\n\n/**\n * Circular SVG wrapper.\n * Maps the size prop to MD3-specified dimensions.\n *\n * size:\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\",\n        medium: \"h-12 w-12\",\n        large: \"h-16 w-16\",\n      },\n    },\n    defaultVariants: {\n      size: \"medium\",\n    },\n  }\n);\n\n// ─── BACKWARD COMPAT ALIAS ────────────────────────────────────────────────────\n\n/**\n * @deprecated Use `progressActiveIndicatorVariants` instead.\n * Kept for backward compatibility with any consumers importing this directly.\n */\nexport const progressIndicatorVariants = progressActiveIndicatorVariants;\n\n// ─── EXPORTED TYPES ───────────────────────────────────────────────────────────\n\nexport type ProgressContainerVariants = VariantProps<typeof progressContainerVariants>;\nexport type ProgressTrackVariants = VariantProps<typeof progressTrackVariants>;\nexport type ProgressActiveIndicatorVariants = VariantProps<typeof progressActiveIndicatorVariants>;\nexport type ProgressInactiveSegmentVariants = VariantProps<typeof progressInactiveSegmentVariants>;\nexport type ProgressStopIndicatorVariants = VariantProps<typeof progressStopIndicatorVariants>;\nexport type ProgressCircularSizeVariants = VariantProps<typeof progressCircularSizeVariants>;\nexport type ProgressLabelVariants = VariantProps<typeof progressLabelVariants>;\n\n/** @deprecated Use `ProgressActiveIndicatorVariants` instead. */\nexport type ProgressIndicatorVariants = ProgressActiveIndicatorVariants;\n","\"use client\";\n\nimport { forwardRef, useRef, useEffect, useState } from \"react\";\nimport type React from \"react\";\nimport { useProgressBar } from \"react-aria\";\nimport { cn } from \"../../utils/cn\";\n\n// ---------------------------------------------------------------------------\n// Reduced-motion hook\n// (useReducedMotion is not available in this version of react-aria)\n// ---------------------------------------------------------------------------\n\nfunction useReducedMotion(): boolean {\n  const [reduced, setReduced] = useState<boolean>(() => {\n    if (typeof window === \"undefined\") return false;\n    return window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches;\n  });\n\n  useEffect(() => {\n    if (typeof window === \"undefined\") return;\n    const mql = window.matchMedia(\"(prefers-reduced-motion: reduce)\");\n    const handler = (e: MediaQueryListEvent): void => setReduced(e.matches);\n    mql.addEventListener(\"change\", handler);\n    return () => mql.removeEventListener(\"change\", handler);\n  }, []);\n\n  return reduced;\n}\n\nimport {\n  progressContainerVariants,\n  progressTrackVariants,\n  progressActiveIndicatorVariants,\n  progressInactiveSegmentVariants,\n  progressStopIndicatorVariants,\n  progressCircularSizeVariants,\n  progressLabelVariants,\n} from \"./Progress.variants\";\nimport type { ProgressProps } from \"./Progress.types\";\nimport \"./Progress.css\";\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\n/** MD3 spec: stroke-width = 4dp for default thickness */\nconst STROKE_WIDTH_DEFAULT = 4;\n/** MD3 Expressive: stroke-width = 8dp for thick variant */\nconst STROKE_WIDTH_THICK = 8;\n\n/** 4dp indicator-track gap (in px — SVG px = CSS px at 1x) */\nconst INDICATOR_TRACK_GAP = 4;\n\nconst CIRCULAR_SIZE_PX: Record<\"small\" | \"medium\" | \"large\", number> = {\n  small: 24,\n  medium: 48,\n  large: 64,\n};\n\n/** MD3 Expressive wavy defaults */\nconst WAVE_AMPLITUDE_DEFAULT = 3; // px amplitude (half-height of wave)\nconst WAVE_AMPLITUDE_THICK = 5; // px amplitude for thick track\n\n/**\n * Number of complete wave cycles drawn across the full bar width.\n * Uses a fixed count (not a fixed wavelength) so the wave never extends\n * beyond the viewBox — the wave density adapts to the rendered bar width.\n * 14 cycles ≈ 40px wavelength at a typical 600px bar.\n */\nconst LINEAR_WAVE_COUNT = 14;\n\n/**\n * SVG viewBox width for linear wavy renderers.\n * x=0..VB_W maps 1-to-1 with 0..100% of the rendered bar width.\n * Using 100 makes clipPath percentage calculations exact.\n */\nconst VB_W = 100;\n\n/**\n * Target arc-length per wave cycle for circular wavy (px).\n * Used to derive an integer waveCount per circle size.\n */\nconst WAVE_WAVELENGTH_CIRCULAR = 30;\n\n// ---------------------------------------------------------------------------\n// Geometry helpers\n// ---------------------------------------------------------------------------\n\nfunction getStrokeWidth(thickness: \"default\" | \"thick\"): number {\n  return thickness === \"thick\" ? STROKE_WIDTH_THICK : STROKE_WIDTH_DEFAULT;\n}\n\nfunction getCircularGeometry(\n  size: \"small\" | \"medium\" | \"large\",\n  thickness: \"default\" | \"thick\"\n): {\n  diameter: number;\n  radius: number;\n  circumference: number;\n  viewBox: string;\n  cx: number;\n  cy: number;\n  strokeWidth: number;\n} {\n  const strokeWidth = getStrokeWidth(thickness);\n  const diameter = CIRCULAR_SIZE_PX[size];\n  const radius = (diameter - strokeWidth) / 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, strokeWidth };\n}\n\n// ---------------------------------------------------------------------------\n// Wave path builders (fixed)\n// ---------------------------------------------------------------------------\n\n/**\n * Build an SVG `d` string for a horizontal sine wave in a VB_W×H viewBox.\n *\n * Key design:\n * - `vbWidth` = viewBox width (100 user units = 100% of rendered width).\n * - Path covers 0..vbWidth so it never exceeds the container.\n * - `vectorEffect=\"non-scaling-stroke\"` on the rendered path keeps the\n *   stroke at screen-pixel size even though x-scale ≠ y-scale.\n * - `midY` is in px (works because viewBox height = rendered height, y-scale=1).\n * - `padCycles` extends the path rightward for seamless-loop animations.\n *\n * @param vbWidth    SVG viewBox width (= VB_W = 100)\n * @param waveCount  Number of complete sine cycles across vbWidth\n * @param amplitude  Half-height of the wave in px\n * @param midY       y-coordinate of the midline in user-units (≈ px since y-scale=1)\n * @param padCycles  Extra cycles appended to the right (for loop animations)\n */\nfunction buildLinearWavePath(\n  vbWidth: number,\n  waveCount: number,\n  amplitude: number,\n  midY: number,\n  padCycles = 0\n): string {\n  const wavelength = vbWidth / waveCount; // user units per cycle\n  const totalCycles = waveCount + padCycles;\n  // Bezier control point distance: wavelength/4 gives a good sine approximation\n  const cp = wavelength / 4;\n  const segments: string[] = [`M 0 ${midY}`];\n\n  for (let i = 0; i < totalCycles; i++) {\n    const x = i * wavelength;\n    // Crest (above midline)\n    segments.push(\n      `C ${x + cp} ${midY - amplitude} ${x + wavelength / 2 - cp} ${midY - amplitude} ${x + wavelength / 2} ${midY}`\n    );\n    // Trough (below midline)\n    segments.push(\n      `C ${x + wavelength / 2 + cp} ${midY + amplitude} ${x + wavelength - cp} ${midY + amplitude} ${x + wavelength} ${midY}`\n    );\n  }\n\n  return segments.join(\" \");\n}\n\n/**\n * Build an SVG `d` string for a wavy ring (circle with radial sine perturbation).\n *\n * Key design: `waveCount` MUST be an integer so `sin(2π·waveCount·1) = sin(2π·waveCount·0)`,\n * guaranteeing the ring closes seamlessly. Compute it with\n * `Math.max(4, Math.round(circumference / WAVE_WAVELENGTH_CIRCULAR))`.\n *\n * The path starts at the 3 o'clock position (angle = 0) so it aligns with\n * SVG `<circle>` dash behavior when the parent SVG is rotated -90deg.\n *\n * @param cx        Circle centre x (px)\n * @param cy        Circle centre y (px)\n * @param radius    Arc radius (px)\n * @param amplitude Radial perturbation amplitude (px)\n * @param waveCount Integer number of wave cycles — must be integer for seamless close\n * @param steps     Polygon approximation steps (default: waveCount × 12)\n */\nfunction buildCircularWavePath(\n  cx: number,\n  cy: number,\n  radius: number,\n  amplitude: number,\n  waveCount: number,\n  steps?: number\n): string {\n  const actualSteps = steps ?? waveCount * 12;\n  const points: string[] = [];\n\n  for (let i = 0; i <= actualSteps; i++) {\n    const t = i / actualSteps;\n    // Start at 3 o'clock (angle=0) to align with <circle> strokeDashoffset behaviour\n    const angle = t * 2 * Math.PI;\n    // Integer waveCount guarantees sin(2π·waveCount·1) = 0 = sin(2π·waveCount·0) → no seam\n    const radialOffset = amplitude * Math.sin(2 * Math.PI * waveCount * t);\n    const r = radius + radialOffset;\n    const x = cx + r * Math.cos(angle);\n    const y = cy + r * Math.sin(angle);\n    points.push(\n      i === 0 ? `M ${x.toFixed(2)} ${y.toFixed(2)}` : `L ${x.toFixed(2)} ${y.toFixed(2)}`\n    );\n  }\n\n  return points.join(\" \") + \" Z\";\n}\n\n// ---------------------------------------------------------------------------\n// Main Progress component\n// ---------------------------------------------------------------------------\n\n/**\n * Material Design 3 Progress Indicator (Layer 3: Styled)\n *\n * Built on React Aria for world-class accessibility.\n * Implements MD3 Expressive spec:\n *   - Colorful track: primary-container (inactive), primary (active)\n *   - 4dp indicator-track gap (linear + circular)\n *   - Fully-rounded segments\n *   - Optional thick (8dp) track\n *   - Optional wavy shape with amplitude ramp\n *   - useReducedMotion guard: wavy falls back to flat when reduced-motion is set\n *\n * Four variants driven by `type` × `indeterminate`:\n *   - Linear Determinate\n *   - Linear Indeterminate\n *   - Circular Determinate\n *   - Circular Indeterminate\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 * // Thick wavy (MD3 Expressive)\n * <Progress type=\"linear\" indeterminate shape=\"wavy\" thickness=\"thick\" aria-label=\"Loading\" />\n * ```\n */\nexport const Progress = forwardRef<HTMLDivElement, ProgressProps>(\n  (\n    {\n      type = \"linear\",\n      indeterminate = false,\n      size = \"medium\",\n      shape = \"flat\",\n      thickness = \"default\",\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    const reducedMotion: boolean = useReducedMotion();\n\n    const { progressBarProps, labelProps } = useProgressBar({\n      label,\n      value,\n      minValue,\n      maxValue,\n      isIndeterminate: indeterminate,\n      ...restProps,\n    });\n\n    const percentage = indeterminate\n      ? 0\n      : Math.min(100, Math.max(0, ((value - minValue) / (maxValue - minValue)) * 100));\n\n    // Reduced-motion degrades wavy → flat\n    const effectiveShape: \"flat\" | \"wavy\" = reducedMotion ? \"flat\" : shape;\n\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        {label && (\n          <span {...labelProps} className={cn(progressLabelVariants())}>\n            {label}\n          </span>\n        )}\n\n        {type === \"linear\" ? (\n          <LinearProgress\n            percentage={percentage}\n            indeterminate={indeterminate}\n            shape={effectiveShape}\n            thickness={thickness}\n            reducedMotion={reducedMotion}\n          />\n        ) : (\n          <CircularProgress\n            percentage={percentage}\n            indeterminate={indeterminate}\n            size={size}\n            shape={effectiveShape}\n            thickness={thickness}\n            reducedMotion={reducedMotion}\n          />\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  shape: \"flat\" | \"wavy\";\n  thickness: \"default\" | \"thick\";\n  reducedMotion: boolean;\n}\n\nfunction LinearProgress({\n  percentage,\n  indeterminate,\n  shape,\n  thickness,\n  reducedMotion,\n}: LinearProgressProps): React.JSX.Element {\n  if (indeterminate) {\n    return shape === \"wavy\" ? (\n      <LinearWavyIndeterminate thickness={thickness} />\n    ) : (\n      <LinearFlatIndeterminate thickness={thickness} />\n    );\n  }\n\n  return shape === \"wavy\" ? (\n    <LinearWavyDeterminate\n      percentage={percentage}\n      thickness={thickness}\n      reducedMotion={reducedMotion}\n    />\n  ) : (\n    <LinearFlatDeterminate percentage={percentage} thickness={thickness} />\n  );\n}\n\n// ── Flat Determinate ────────────────────────────────────────────────────────\n\nfunction LinearFlatDeterminate({\n  percentage,\n  thickness,\n}: {\n  percentage: number;\n  thickness: \"default\" | \"thick\";\n}): React.JSX.Element {\n  return (\n    <div data-progress-track=\"\" className={cn(progressTrackVariants({ thickness }))}>\n      {/* Active indicator */}\n      <div\n        data-progress-indicator=\"\"\n        className={cn(progressActiveIndicatorVariants())}\n        style={{ width: `${percentage}%` }}\n      />\n      {/* Inactive segment — starts after the 4dp gap */}\n      {percentage < 100 && (\n        <div\n          data-progress-inactive-segment=\"\"\n          className={cn(progressInactiveSegmentVariants())}\n          style={{ left: `calc(${percentage}% + ${INDICATOR_TRACK_GAP}px)` }}\n        />\n      )}\n      {/* Stop indicator dot at trailing edge */}\n      <div\n        data-stop-indicator=\"\"\n        className={cn(progressStopIndicatorVariants())}\n        aria-hidden=\"true\"\n      />\n    </div>\n  );\n}\n\n// ── Flat Indeterminate ──────────────────────────────────────────────────────\n\nfunction LinearFlatIndeterminate({\n  thickness,\n}: {\n  thickness: \"default\" | \"thick\";\n}): React.JSX.Element {\n  return (\n    <div data-progress-track=\"\" className={cn(progressTrackVariants({ thickness }))}>\n      <div data-progress-indeterminate=\"\" className=\"absolute inset-0 overflow-hidden rounded-full\">\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// ── Wavy Determinate ───────────────────────────────────────────────────────\n\n/**\n * Linear wavy determinate — fixed approach.\n *\n * The wave is drawn in a `viewBox=\"0 0 VB_W H\"` SVG with\n * `preserveAspectRatio=\"none\"` so x maps 0..VB_W → 0..renderedWidth\n * and the wave can never overflow the container.\n *\n * The active portion is clipped by a CSS `clip-path: inset(0 X% 0 0)` on\n * the SVG element itself (applied in the rendered-element coordinate space),\n * which means `(100 - percentage)%` from the right keeps exactly `percentage`\n * of the wave visible — the percentage bug is fixed.\n *\n * `vectorEffect=\"non-scaling-stroke\"` keeps the stroke at screen-pixel width\n * even though the x-scale (renderedWidth / VB_W) is much larger than 1.\n *\n * The inactive segment and stop dot are crisp DOM elements (px-exact).\n */\nfunction LinearWavyDeterminate({\n  percentage,\n  thickness,\n  reducedMotion,\n}: {\n  percentage: number;\n  thickness: \"default\" | \"thick\";\n  reducedMotion: boolean;\n}): React.JSX.Element {\n  const amplitude = thickness === \"thick\" ? WAVE_AMPLITUDE_THICK : WAVE_AMPLITUDE_DEFAULT;\n  const containerHeight = (thickness === \"thick\" ? 8 : 4) + 2 * amplitude + 4;\n  // midY: 2px top padding + amplitude = midline position in px (= VB y-units, since y-scale=1)\n  const midY = amplitude + 2;\n  const trackHeightClass = thickness === \"thick\" ? \"h-2\" : \"h-1\";\n  // trackPx: the flat-track thickness (= stroke-width). The inactive segment and stop dot\n  // should match this so they look identical to the flat variant.\n  const trackPx = getStrokeWidth(thickness);\n\n  // Amplitude ramp: 0 at 0% and 100%, full amplitude between 20% and 80%\n  const rampedAmplitude =\n    reducedMotion || percentage <= 0 || percentage >= 100\n      ? 0\n      : amplitude *\n        Math.min(\n          (percentage - 10) / 10, // ramp up  10%→20%\n          (90 - percentage) / 10, // ramp down 80%→90%\n          1\n        );\n\n  const wavePath = buildLinearWavePath(VB_W, LINEAR_WAVE_COUNT, rampedAmplitude, midY);\n\n  return (\n    <div\n      data-progress-track=\"\"\n      className={cn(\"relative w-full overflow-hidden\", trackHeightClass)}\n      style={{ height: containerHeight }}\n    >\n      {/*\n       * Active wavy SVG.\n       * - viewBox 0..VB_W × 0..H ensures the path fits within the SVG bounds.\n       * - preserveAspectRatio=\"none\" stretches the path to fill the rendered width.\n       * - CSS clip-path inset clips the right (100-percentage)% in rendered space,\n       *   so exactly `percentage`% of the wave is visible regardless of rendered width.\n       * - The clip-path CSS transition provides the smooth progress animation.\n       */}\n      <svg\n        viewBox={`0 0 ${VB_W} ${containerHeight}`}\n        preserveAspectRatio=\"none\"\n        className={cn(\n          \"absolute inset-0 w-full\",\n          \"transition-[clip-path]\",\n          \"duration-spring-standard-default-spatial\",\n          \"ease-spring-standard-default-spatial\"\n        )}\n        style={{\n          height: containerHeight,\n          // clip-path applied in rendered-element space: keeps left `percentage`%\n          clipPath: `inset(0 ${100 - percentage}% 0 0)`,\n        }}\n        aria-hidden=\"true\"\n      >\n        <path\n          data-progress-indicator=\"\"\n          d={wavePath}\n          fill=\"none\"\n          stroke=\"currentColor\"\n          strokeWidth={getStrokeWidth(thickness)}\n          strokeLinecap=\"round\"\n          vectorEffect=\"non-scaling-stroke\"\n          className=\"text-primary\"\n        />\n      </svg>\n\n      {/* Inactive segment after 4dp gap — centered on midY, trackPx tall (matches flat variant) */}\n      {percentage < 100 && (\n        <div\n          data-progress-inactive-segment=\"\"\n          className={cn(progressInactiveSegmentVariants())}\n          style={{\n            left: `calc(${percentage}% + ${INDICATOR_TRACK_GAP}px)`,\n            height: trackPx,\n            top: midY - trackPx / 2,\n          }}\n        />\n      )}\n\n      {/* Stop indicator dot — centered on the wave's midY baseline */}\n      <div\n        data-stop-indicator=\"\"\n        className={cn(progressStopIndicatorVariants())}\n        style={{ top: midY }}\n        aria-hidden=\"true\"\n      />\n    </div>\n  );\n}\n\n// ── Wavy Indeterminate ──────────────────────────────────────────────────────\n\n/**\n * Linear wavy indeterminate — fixed approach.\n *\n * Two SVG elements (mirroring the two divs in the flat variant) are\n * animated with the existing `progress-linear-indeterminate-1/2` CSS keyframes\n * which animate the `left`/`right` CSS properties of the element.\n * The keyframes are designed for positioned elements — SVG elements inside an\n * HTML container also respect CSS `left`/`right` when `position: absolute`.\n *\n * As the CSS box grows/shrinks the SVG viewport stretches/compresses the wave\n * horizontally (via `preserveAspectRatio=\"none\"`), giving a convincing sweep.\n * The outer `overflow-hidden` container clips both SVGs to the bar bounds.\n */\nfunction LinearWavyIndeterminate({\n  thickness,\n}: {\n  thickness: \"default\" | \"thick\";\n}): React.JSX.Element {\n  const amplitude = thickness === \"thick\" ? WAVE_AMPLITUDE_THICK : WAVE_AMPLITUDE_DEFAULT;\n  const containerHeight = (thickness === \"thick\" ? 8 : 4) + 2 * amplitude + 4;\n  const midY = amplitude + 2;\n  const trackHeightClass = thickness === \"thick\" ? \"h-2\" : \"h-1\";\n  // trackPx: flat-track thickness so the inactive rail matches the flat variant's height\n  const trackPx = getStrokeWidth(thickness);\n\n  const wavePath = buildLinearWavePath(VB_W, LINEAR_WAVE_COUNT, amplitude, midY);\n\n  return (\n    <div\n      data-progress-track=\"\"\n      className={cn(\"relative w-full overflow-hidden\", trackHeightClass)}\n      style={{ height: containerHeight }}\n    >\n      {/* Full-width inactive track — trackPx tall, centered on midY (matches flat variant) */}\n      <div\n        className=\"bg-primary-container absolute right-0 left-0 rounded-full\"\n        style={{ height: trackPx, top: midY - trackPx / 2 }}\n      />\n\n      {/* Animated segments — same approach as flat but with SVG wave paths */}\n      <div data-progress-indeterminate=\"\" className=\"absolute inset-0\">\n        {/* Segment 1 */}\n        <svg\n          viewBox={`0 0 ${VB_W} ${containerHeight}`}\n          preserveAspectRatio=\"none\"\n          className=\"animate-progress-linear-indeterminate-1 absolute top-0 h-full\"\n          aria-hidden=\"true\"\n        >\n          <path\n            d={wavePath}\n            fill=\"none\"\n            stroke=\"currentColor\"\n            strokeWidth={getStrokeWidth(thickness)}\n            strokeLinecap=\"round\"\n            vectorEffect=\"non-scaling-stroke\"\n            className=\"text-primary\"\n          />\n        </svg>\n\n        {/* Segment 2 */}\n        <svg\n          viewBox={`0 0 ${VB_W} ${containerHeight}`}\n          preserveAspectRatio=\"none\"\n          className=\"animate-progress-linear-indeterminate-2 absolute top-0 h-full\"\n          aria-hidden=\"true\"\n        >\n          <path\n            d={wavePath}\n            fill=\"none\"\n            stroke=\"currentColor\"\n            strokeWidth={getStrokeWidth(thickness)}\n            strokeLinecap=\"round\"\n            vectorEffect=\"non-scaling-stroke\"\n            className=\"text-primary\"\n          />\n        </svg>\n      </div>\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  shape: \"flat\" | \"wavy\";\n  thickness: \"default\" | \"thick\";\n  reducedMotion: boolean;\n}\n\nfunction CircularProgress({\n  percentage,\n  indeterminate,\n  size,\n  shape,\n  thickness,\n  reducedMotion,\n}: CircularProgressProps): React.JSX.Element {\n  const { radius, circumference, viewBox, cx, cy, strokeWidth, diameter } = getCircularGeometry(\n    size,\n    thickness\n  );\n\n  if (indeterminate) {\n    if (shape === \"wavy\") {\n      return (\n        <CircularWavyIndeterminate\n          size={size}\n          cx={cx}\n          cy={cy}\n          radius={radius}\n          circumference={circumference}\n          viewBox={viewBox}\n          strokeWidth={strokeWidth}\n          diameter={diameter}\n        />\n      );\n    }\n\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          {/* Inactive track — primary-container (always visible per Expressive spec) */}\n          <circle\n            cx={cx}\n            cy={cy}\n            r={radius}\n            fill=\"none\"\n            stroke=\"currentColor\"\n            strokeWidth={strokeWidth}\n            className=\"text-primary-container\"\n          />\n          <circle\n            cx={cx}\n            cy={cy}\n            r={radius}\n            fill=\"none\"\n            stroke=\"currentColor\"\n            strokeWidth={strokeWidth}\n            className=\"animate-progress-circular-dash text-primary\"\n            strokeLinecap=\"round\"\n          />\n        </svg>\n      </div>\n    );\n  }\n\n  // Determinate\n  if (shape === \"wavy\") {\n    return (\n      <CircularWavyDeterminate\n        size={size}\n        percentage={percentage}\n        cx={cx}\n        cy={cy}\n        radius={radius}\n        circumference={circumference}\n        viewBox={viewBox}\n        strokeWidth={strokeWidth}\n        diameter={diameter}\n        reducedMotion={reducedMotion}\n      />\n    );\n  }\n\n  // Flat determinate — introduce 4dp arc gap via stroke-dasharray\n  const activeArc = (percentage / 100) * circumference;\n  const activeArcGapped = Math.max(0, activeArc - INDICATOR_TRACK_GAP);\n  const inactiveArcGapped = Math.max(0, circumference - activeArc - INDICATOR_TRACK_GAP);\n  const activeOffset = 0;\n  const inactiveOffset = -(activeArcGapped + INDICATOR_TRACK_GAP);\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        {/* Inactive track */}\n        {percentage < 100 && (\n          <circle\n            cx={cx}\n            cy={cy}\n            r={radius}\n            fill=\"none\"\n            stroke=\"currentColor\"\n            strokeWidth={strokeWidth}\n            strokeLinecap=\"round\"\n            strokeDasharray={`${inactiveArcGapped} ${circumference - inactiveArcGapped}`}\n            strokeDashoffset={inactiveOffset}\n            className=\"text-primary-container duration-spring-standard-default-spatial ease-spring-standard-default-spatial transition-[stroke-dasharray,stroke-dashoffset]\"\n          />\n        )}\n        {/* Active indicator */}\n        {percentage > 0 && (\n          <circle\n            cx={cx}\n            cy={cy}\n            r={radius}\n            fill=\"none\"\n            stroke=\"currentColor\"\n            strokeWidth={strokeWidth}\n            strokeLinecap=\"round\"\n            strokeDasharray={`${activeArcGapped} ${circumference - activeArcGapped}`}\n            strokeDashoffset={activeOffset}\n            className=\"text-primary duration-spring-standard-default-spatial ease-spring-standard-default-spatial transition-[stroke-dasharray,stroke-dashoffset]\"\n          />\n        )}\n        {/* Full inactive circle at 0% */}\n        {percentage === 0 && (\n          <circle\n            cx={cx}\n            cy={cy}\n            r={radius}\n            fill=\"none\"\n            stroke=\"currentColor\"\n            strokeWidth={strokeWidth}\n            className=\"text-primary-container\"\n          />\n        )}\n      </svg>\n\n      <span className=\"sr-only\" data-progress-diameter={diameter} />\n    </div>\n  );\n}\n\n// ── Circular wavy geometry helpers ──────────────────────────────────────────\n\ninterface CircularWavyGeometry {\n  size: \"small\" | \"medium\" | \"large\";\n  cx: number;\n  cy: number;\n  radius: number;\n  circumference: number;\n  viewBox: string;\n  strokeWidth: number;\n  diameter: number;\n}\n\n// ── Circular Wavy Indeterminate ─────────────────────────────────────────────\n\n/**\n * Circular wavy indeterminate — fixed approach.\n *\n * Uses an integer `waveCount` derived from `Math.round(circumference / WAVE_WAVELENGTH_CIRCULAR)`\n * so the ring closes seamlessly (no seam/notch from non-integer cycles).\n *\n * The wavy `<path>` uses `pathLength={100}` so `strokeDasharray` is expressed\n * in 0..100 regardless of the path's intrinsic (longer) length.\n * A static dash `\"28 72\"` (≈28% visible arc) + the whole-SVG rotation from\n * `animate-progress-circular-rotate` produces a clean rotating wavy spinner.\n * `animate-progress-circular-dash` is intentionally NOT used: its pixel values\n * are tuned to the plain circle circumference, not the longer wavy path.\n */\nfunction CircularWavyIndeterminate({\n  size,\n  cx,\n  cy,\n  radius,\n  circumference: _circumference,\n  viewBox,\n  strokeWidth,\n}: CircularWavyGeometry): React.JSX.Element {\n  // Clamp amplitude so crests never exceed `radius` (= diameter/2 - strokeWidth/2).\n  // meanRadius is the wave's centreline; crests reach meanRadius + circAmp = radius exactly.\n  const circAmp = Math.min(WAVE_AMPLITUDE_DEFAULT, radius * 0.35);\n  const meanRadius = radius - circAmp;\n  const meanCircumference = 2 * Math.PI * meanRadius;\n\n  // Integer waveCount → seamless close (sin(2π·N·1) = sin(2π·N·0) = 0)\n  const waveCount = Math.max(4, Math.round(meanCircumference / WAVE_WAVELENGTH_CIRCULAR));\n  const wavePath = buildCircularWavePath(cx, cy, meanRadius, circAmp, waveCount);\n\n  return (\n    <div\n      data-progress-size={size}\n      data-progress-indeterminate=\"\"\n      className={cn(progressCircularSizeVariants({ size }))}\n    >\n      {/*\n       * The entire SVG rotates via animate-progress-circular-rotate.\n       * The wavy path has a static dash showing ~28% of the ring,\n       * so the arc sweeps around as a rotating wavy segment.\n       * Inactive ring drawn at meanRadius so it is concentric with the wave centerline —\n       * no plain circle poking through behind the active wavy arc.\n       */}\n      <svg\n        viewBox={viewBox}\n        className=\"animate-progress-circular-rotate h-full w-full\"\n        aria-hidden=\"true\"\n      >\n        {/* Inactive full ring (primary-container) at meanRadius */}\n        <circle\n          cx={cx}\n          cy={cy}\n          r={meanRadius}\n          fill=\"none\"\n          stroke=\"currentColor\"\n          strokeWidth={strokeWidth}\n          className=\"text-primary-container\"\n        />\n        {/* Active wavy arc — pathLength=100 normalises the dash to a percentage */}\n        <path\n          d={wavePath}\n          fill=\"none\"\n          stroke=\"currentColor\"\n          strokeWidth={strokeWidth}\n          strokeLinecap=\"round\"\n          pathLength={100}\n          strokeDasharray=\"28 72\"\n          className=\"text-primary\"\n        />\n      </svg>\n    </div>\n  );\n}\n\n// ── Circular Wavy Determinate ───────────────────────────────────────────────\n\n/**\n * Circular wavy determinate — fixed approach.\n *\n * Uses `pathLength={100}` on the wavy `<path>` so `strokeDasharray` can be\n * expressed in percentage terms (0..100) rather than the path's intrinsic\n * (and longer) arc length. This resolves the mis-match between the wave path\n * length and the pixel-based dash values used previously.\n *\n * Gap: `gapPct = (INDICATOR_TRACK_GAP / circumference) * 100` (in pathLength units).\n * Active arc:   `activeLen   = max(0, percentage - gapPct)`\n * Inactive arc: `inactiveLen = max(0, 100 - percentage - gapPct)`\n * Inactive offset = `-(activeLen + gapPct)` → starts after active + gap.\n *\n * Single active wavy path replaces the previous plain-active + wavy-overlay\n * stacking that produced a distorted double-drawn arc.\n */\nfunction CircularWavyDeterminate({\n  size,\n  percentage,\n  cx,\n  cy,\n  radius,\n  circumference: _circumference,\n  viewBox,\n  strokeWidth,\n  diameter,\n  reducedMotion,\n}: CircularWavyGeometry & { percentage: number; reducedMotion: boolean }): React.JSX.Element {\n  // Clamp amplitude so crests never exceed `radius` → no viewBox clipping.\n  // meanRadius is the wave centreline; crest = meanRadius + circAmp = radius exactly.\n  const circAmp = reducedMotion ? 0 : Math.min(WAVE_AMPLITUDE_DEFAULT, radius * 0.35);\n  const meanRadius = radius - circAmp;\n  const meanCircumference = 2 * Math.PI * meanRadius;\n\n  const waveCount = Math.max(4, Math.round(meanCircumference / WAVE_WAVELENGTH_CIRCULAR));\n  const wavePath = buildCircularWavePath(cx, cy, meanRadius, circAmp, waveCount);\n\n  // Gap expressed in pathLength=100 space (computed from meanRadius circumference for accuracy)\n  const gapPct = (INDICATOR_TRACK_GAP / meanCircumference) * 100;\n  const activeLen = Math.max(0, percentage - gapPct);\n  const inactiveLen = Math.max(0, 100 - percentage - gapPct);\n  // Inactive arc starts after active + gap\n  const inactiveOffset = -(activeLen + gapPct);\n\n  return (\n    <div data-progress-size={size} className={cn(progressCircularSizeVariants({ size }))}>\n      {/*\n       * -rotate-90 on the SVG makes both the circle and the wavy path start\n       * at the visual 12 o'clock position (path starts at 3 o'clock\n       * mathematically, rotated -90° to top visually).\n       * All arcs/rings drawn at meanRadius so they are concentric with the wave centerline —\n       * no plain circle showing through behind the active wavy arc.\n       */}\n      <svg viewBox={viewBox} className=\"h-full w-full -rotate-90\" aria-hidden=\"true\">\n        {/* Full inactive track at 0% — at meanRadius */}\n        {percentage === 0 && (\n          <circle\n            cx={cx}\n            cy={cy}\n            r={meanRadius}\n            fill=\"none\"\n            stroke=\"currentColor\"\n            strokeWidth={strokeWidth}\n            className=\"text-primary-container\"\n          />\n        )}\n\n        {/* Inactive arc (primary-container) — for 0 < percentage < 100, at meanRadius */}\n        {percentage > 0 && percentage < 100 && (\n          <circle\n            cx={cx}\n            cy={cy}\n            r={meanRadius}\n            fill=\"none\"\n            stroke=\"currentColor\"\n            strokeWidth={strokeWidth}\n            strokeLinecap=\"round\"\n            pathLength={100}\n            strokeDasharray={`${inactiveLen} ${100 - inactiveLen}`}\n            strokeDashoffset={inactiveOffset}\n            className=\"text-primary-container duration-spring-standard-default-spatial ease-spring-standard-default-spatial transition-[stroke-dasharray,stroke-dashoffset]\"\n          />\n        )}\n\n        {/* Active wavy arc (primary) — single element, wave built at meanRadius */}\n        {percentage > 0 && (\n          <path\n            data-progress-indicator=\"\"\n            d={wavePath}\n            fill=\"none\"\n            stroke=\"currentColor\"\n            strokeWidth={strokeWidth}\n            strokeLinecap=\"round\"\n            pathLength={100}\n            strokeDasharray={percentage < 100 ? `${activeLen} ${100 - activeLen}` : undefined}\n            strokeDashoffset={0}\n            className=\"text-primary duration-spring-standard-default-spatial ease-spring-standard-default-spatial transition-[stroke-dasharray]\"\n          />\n        )}\n      </svg>\n\n      <span className=\"sr-only\" data-progress-diameter={diameter} />\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 (receives shape + thickness)\n *\n * @example\n * ```tsx\n * // Custom visual via render prop\n * <ProgressHeadless\n *   value={50}\n *   label=\"Upload\"\n *   renderProgress={({ percentage, shape, thickness }) => (\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      shape = \"flat\",\n      thickness = \"default\",\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    const { progressBarProps, labelProps } = useProgressBar({\n      label,\n      value,\n      minValue,\n      maxValue,\n      isIndeterminate: indeterminate,\n      ...restProps,\n    });\n\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          shape,\n          thickness,\n        })}\n        {children}\n      </div>\n    );\n  }\n);\n\nProgressHeadless.displayName = \"ProgressHeadless\";\n","\"use client\";\n\nimport { forwardRef, useRef } from \"react\";\nimport type React from \"react\";\nimport { useButton } from \"react-aria\";\nimport { mergeProps } from \"@react-aria/utils\";\nimport type { CardHeadlessProps } from \"./Card.types\";\n\n/**\n * `CardHeadless` — Layer 2 headless primitive.\n *\n * Provides MD3 Card interaction semantics (press, keyboard activation, link\n * behavior) without any visual styling. Pure behavior — all interaction-state\n * styling is driven by the Layer 3 `Card` via forwarded `data-*` attributes.\n *\n * ## Dual-mode behavior\n *\n * | Condition | Role | Keyboard |\n * |---|---|---|\n * | `onPress` or `href` present | `role=\"button\"` | Enter / Space activate |\n * | Neither present | `role=\"article\"` | No activation, not a tab stop |\n *\n * `useButton` is always called (Rules of Hooks); its `buttonProps` are only\n * applied to the element when the card is interactive, so a static card adds\n * no tab stop or keyboard handlers.\n *\n * ## Prop passthrough\n *\n * Any `data-*` attributes (e.g. `data-hovered`, `data-pressed`, `data-dragged`,\n * `data-interactive`) and DOM event handlers (`onMouseDown`, `onFocus`, …) are\n * spread onto the root element so the styled layer can drive `group-data-[x]/card`\n * selectors and ripple/drag tracking.\n *\n * @example\n * ```tsx\n * // Interactive\n * <CardHeadless onPress={handlePress} aria-label=\"View details\" className=\"rounded-xl p-4\">\n *   Card content\n * </CardHeadless>\n *\n * // Static\n * <CardHeadless className=\"rounded-xl p-4\">Card content</CardHeadless>\n * ```\n */\nexport const CardHeadless = forwardRef<HTMLDivElement, CardHeadlessProps>(function CardHeadless(\n  { className, children, onMouseDown, onMouseUp, onMouseLeave, ...rest },\n  forwardedRef\n) {\n  const internalRef = useRef<HTMLDivElement>(null);\n\n  // Prefer the forwarded ref; fall back to internal ref for React Aria hooks.\n  const ref = (forwardedRef ?? internalRef) as React.RefObject<HTMLDivElement>;\n\n  const isInteractive = !!(rest.onPress ?? rest.href);\n\n  // Always call the hook unconditionally (Rules of Hooks). buttonProps are only\n  // applied to the element when isInteractive is true.\n  const { buttonProps } = useButton({ elementType: \"div\", ...rest }, ref);\n\n  // Strip React Aria press/disabled/link props that must not land on the DOM.\n  // Everything left in `htmlAttrs` (data-*, aria-label, forwarded handlers) is\n  // safe to spread onto the root element.\n  const {\n    isDisabled: _isDisabled,\n    onPress: _onPress,\n    onPressStart: _onPressStart,\n    onPressEnd: _onPressEnd,\n    onPressChange: _onPressChange,\n    onPressUp: _onPressUp,\n    href: _href,\n    target: _target,\n    rel: _rel,\n    ...htmlAttrs\n  } = rest as Record<string, unknown>;\n\n  const mouseHandlers = { onMouseDown, onMouseUp, onMouseLeave };\n\n  if (isInteractive) {\n    const interactiveProps = mergeProps(buttonProps, mouseHandlers, htmlAttrs, { className });\n\n    return (\n      <div {...interactiveProps} ref={ref}>\n        {children}\n      </div>\n    );\n  }\n\n  return (\n    <div role=\"article\" className={className} ref={ref} {...mouseHandlers} {...htmlAttrs}>\n      {children}\n    </div>\n  );\n});\n\nCardHeadless.displayName = \"CardHeadless\";\n","import { cva, type VariantProps } from \"class-variance-authority\";\n\n/**\n * Material Design 3 Card Variants\n *\n * Architecture: Variants vs States\n * - CVA holds design-time structure only (the `variant` axis). No interaction\n *   state variants (hovered/pressed/focused/dragged/disabled) live in CVA.\n * - All interaction states are driven by data-* attributes on the root via\n *   `data-[x]:` (self-targeting) on the root and `group-data-[x]/card:` selectors\n *   in each slot's base classes.\n * - Content flags (`data-interactive`) are set explicitly by the component.\n *\n * Slot responsibilities:\n *   cardVariants           — root container; shape, color, per-state elevation\n *   cardStateLayerVariants — hover/focus/press/drag opacity ring (absolute overlay)\n *   cardFocusRingVariants  — keyboard focus outline (inset so overflow-hidden never clips it)\n *\n * MD3 Spec (https://m3.material.io/components/cards/specs):\n *   Shape: medium corner (12dp) → `rounded-md`\n *   State-layer color: on-surface (all variants)\n *   State-layer opacities: hover 8% | focus 10% | pressed 10% | dragged 16%\n *   Disabled: container 38% opacity, no pointer events\n *\n * Elevation per state (MD3 comp tokens):\n *   Elevated  enabled=1  hover=2  focus=1  pressed=1  dragged=4\n *   Filled    enabled=0  hover=1  focus=0  pressed=0  dragged=3\n *   Outlined  enabled=0  hover=1  focus=0  pressed=0  dragged=3\n *\n * Motion tier: Standard **default** (cards are standard-size components alongside\n *   dialogs/menus — not the fast tier used for small <48dp controls like buttons).\n *   All effect transitions use `duration-spring-standard-default-effects` (200ms) +\n *   `ease-spring-standard-default-effects`.\n *\n * Specificity strategy (self-targeting `data-[x]:` on the root):\n *   base → hover (single) → focus (single) → pressed (doubled) → dragged (tripled)\n *   Doubling/tripling the attribute selector guarantees the later state wins\n *   regardless of Tailwind's emitted class order. `pressed` (and `dragged`,\n *   which co-occurs with a held pointer) therefore beat `hover` deterministically.\n */\n\n// ─── ROOT / CONTAINER ────────────────────────────────────────────────────────\n\n/**\n * Root container element.\n *\n * `overflow-hidden` clips full-bleed media (CardMedia), the ripple, and the\n * state layer to the card's rounded shape. Because the root clips, the focus\n * ring is rendered as an INSET overlay (see `cardFocusRingVariants`) rather than\n * an outset ring, so it is never cut off.\n *\n * Elevation responds to the root's own `data-*` state attributes via\n * self-targeting selectors (the root carries both `group/card` and the state\n * attributes). The shadow, opacity, and border-color changes are effects, so\n * they use the standard-default-effects spring (200ms, no overshoot).\n */\nexport const cardVariants = cva(\n  [\n    // Shape: MD3 medium corner = 12dp\n    \"relative overflow-hidden rounded-md text-on-surface\",\n    // Transition: effects properties — standard default tier (cards are standard-size, not <48dp)\n    // Covers shadow (elevation), opacity (disabled fade), border-color (outlined state)\n    \"transition-[box-shadow,opacity,border-color] duration-spring-standard-default-effects ease-spring-standard-default-effects\",\n    // Interactive affordance (content flag set by the component)\n    \"data-[interactive]:cursor-pointer\",\n    // Disabled — self-targeting selectors (38% container, no interaction)\n    \"data-[disabled]:cursor-not-allowed data-[disabled]:pointer-events-none data-[disabled]:opacity-38\",\n  ],\n  {\n    variants: {\n      /**\n       * Card visual variant per MD3 specification.\n       */\n      variant: {\n        /**\n         * Elevated — separation via shadow.\n         * MD3: container=surface-container-low.\n         * Elevation: 1 base → 2 hover → 1 focus → 1 pressed → 4 dragged.\n         */\n        elevated: [\n          \"bg-surface-container-low\",\n          \"shadow-elevation-1\",\n          \"data-[hovered]:shadow-elevation-2\",\n          \"data-[focus-visible]:shadow-elevation-1\",\n          \"data-[pressed]:data-[pressed]:shadow-elevation-1\",\n          \"data-[dragged]:data-[dragged]:data-[dragged]:shadow-elevation-4\",\n          \"data-[disabled]:shadow-none\",\n        ],\n\n        /**\n         * Filled — subtle container fill, no resting shadow.\n         * MD3: container=surface-container-highest.\n         * Elevation: 0 base → 1 hover → 0 focus → 0 pressed → 3 dragged.\n         */\n        filled: [\n          \"bg-surface-container-highest\",\n          \"shadow-none\",\n          \"data-[hovered]:shadow-elevation-1\",\n          \"data-[focus-visible]:shadow-none\",\n          \"data-[pressed]:data-[pressed]:shadow-none\",\n          \"data-[dragged]:data-[dragged]:data-[dragged]:shadow-elevation-3\",\n          \"data-[disabled]:shadow-none\",\n        ],\n\n        /**\n         * Outlined — visual boundary via border, no resting shadow.\n         * MD3: container=surface, outline=outline-variant.\n         * Elevation: 0 base → 1 hover → 0 focus → 0 pressed → 3 dragged.\n         */\n        outlined: [\n          \"bg-surface border border-outline-variant\",\n          \"shadow-none\",\n          \"data-[hovered]:shadow-elevation-1\",\n          \"data-[focus-visible]:shadow-none\",\n          \"data-[pressed]:data-[pressed]:shadow-none\",\n          \"data-[dragged]:data-[dragged]:data-[dragged]:shadow-elevation-3\",\n          \"data-[disabled]:shadow-none\",\n        ],\n      },\n    },\n\n    defaultVariants: {\n      variant: \"elevated\",\n    },\n  }\n);\n\n// ─── STATE LAYER ─────────────────────────────────────────────────────────────\n\n/**\n * State layer — absolute overlay that transitions opacity on interaction.\n *\n * Color is always `on-surface` per MD3 (cards do not vary the state-layer color\n * by variant). Rendered below the content (content wrapper carries `z-10`) so it\n * tints the container surface without reducing text legibility.\n *\n * Opacity: 0 rest → 8% hover → 10% focus/pressed → 16% dragged → hidden disabled.\n * `pressed` (doubled) and `dragged` (tripled) win over `hover` (single) by\n * specificity when multiple attributes are set simultaneously.\n */\nexport const cardStateLayerVariants = cva([\n  \"pointer-events-none absolute inset-0 rounded-[inherit] opacity-0\",\n  \"bg-on-surface\",\n  // Effects transition for opacity — standard default tier (200ms, no overshoot)\n  \"transition-opacity duration-spring-standard-default-effects ease-spring-standard-default-effects\",\n  \"group-data-[hovered]/card:opacity-8\",\n  \"group-data-[focus-visible]/card:opacity-10\",\n  \"group-data-[pressed]/card:group-data-[pressed]/card:opacity-10\",\n  \"group-data-[dragged]/card:group-data-[dragged]/card:group-data-[dragged]/card:opacity-16\",\n  \"group-data-[disabled]/card:hidden\",\n]);\n\n// ─── FOCUS RING ───────────────────────────────────────────────────────────────\n\n/**\n * Focus ring overlay.\n *\n * Rendered INSET (`-outline-offset-2`, `z-20`) so it stays inside the root's\n * `overflow-hidden` clip and sits above the content. Always present in the DOM\n * (opacity-0 at rest) and fades in on keyboard/programmatic focus, which avoids\n * layout shift and lets the opacity transition animate smoothly.\n */\nexport const cardFocusRingVariants = cva([\n  \"pointer-events-none absolute inset-0 z-20 rounded-[inherit]\",\n  \"outline outline-2 -outline-offset-2 outline-secondary\",\n  // Effects transition — standard default tier, opacity must not overshoot\n  \"transition-opacity duration-spring-standard-default-effects ease-spring-standard-default-effects\",\n  \"opacity-0\",\n  \"group-data-[focus-visible]/card:opacity-100\",\n]);\n\n// ─── EXPORTED TYPES ───────────────────────────────────────────────────────────\n\n/**\n * Extract variant prop types from CVA for typed usage.\n */\nexport type CardVariants = VariantProps<typeof cardVariants>;\nexport type CardStateLayerVariants = VariantProps<typeof cardStateLayerVariants>;\nexport type CardFocusRingVariants = VariantProps<typeof cardFocusRingVariants>;\n","\"use client\";\n\nimport { forwardRef, useRef, useState, useCallback } from \"react\";\nimport type React from \"react\";\nimport { useHover, useFocusRing, mergeProps } from \"react-aria\";\nimport { CardHeadless } from \"./CardHeadless\";\nimport { cardVariants, cardStateLayerVariants, cardFocusRingVariants } from \"./Card.variants\";\nimport { cn } from \"../../utils/cn\";\nimport { getInteractionDataAttributes } from \"../../utils/interactionStates\";\nimport { useRipple } from \"../../hooks/useRipple\";\nimport type { CardProps } from \"./Card.types\";\n\n/**\n * Material Design 3 Card Component (Layer 3: Styled).\n *\n * Wraps `CardHeadless` with MD3 visual styling using the Variants-vs-States\n * architecture: all interaction states are expressed as `data-*` attributes on\n * the root and consumed by each slot via `group-data-[x]/card` selectors — no\n * state variants live in CVA.\n *\n * ## Modes\n *\n * | Condition | Rendered as | Ripple | State layer | Focus ring |\n * |---|---|---|---|---|\n * | `onPress` or `href` provided | `role=\"button\"` | ✅ | ✅ | ✅ |\n * | Neither provided | `role=\"article\"` | ❌ | ❌ | ❌ |\n *\n * ## Variants & elevation per state (MD3 comp tokens)\n *\n * - **elevated** — `surface-container-low`; 1 base → 2 hover → 1 focus/pressed → 4 dragged.\n * - **filled** — `surface-container-highest`; 0 base → 1 hover → 0 focus/pressed → 3 dragged.\n * - **outlined** — `surface` + `outline-variant` border; 0 base → 1 hover → 0 focus/pressed → 3 dragged.\n *\n * ## State layer (interactive only)\n *\n * `on-surface` overlay: 8% hover, 10% focus/pressed, 16% dragged. Rendered below\n * the content (which carries `z-10`) so the surface is tinted without reducing\n * text legibility.\n *\n * ## Dragged state\n *\n * When `isDraggable` is `true`, the card tracks its own drag state via mouse\n * events and exposes it as `data-dragged`. While dragging, elevation rises to\n * its MD3 dragged level and the state layer reaches 16% opacity.\n *\n * @example\n * ```tsx\n * // Non-interactive\n * <Card variant=\"outlined\">\n *   <CardHeader headline=\"Title\" subheader=\"Subheader\" />\n *   <CardContent>Body text</CardContent>\n * </Card>\n *\n * // Interactive\n * <Card variant=\"elevated\" onPress={() => navigate('/details')} aria-label=\"View product details\">\n *   <CardMedia src=\"/image.jpg\" alt=\"Product\" />\n *   <CardHeader headline=\"Product Name\" />\n *   <CardActions>\n *     <Button variant=\"text\">Buy Now</Button>\n *   </CardActions>\n * </Card>\n * ```\n *\n * @see https://m3.material.io/components/cards/overview\n * @see https://m3.material.io/components/cards/specs\n */\nexport const Card = forwardRef<HTMLDivElement, CardProps>(function Card(\n  {\n    variant = \"elevated\",\n    onPress,\n    href,\n    isDraggable = false,\n    isDisabled = false,\n    className,\n    children,\n    \"aria-label\": ariaLabel,\n  },\n  ref\n) {\n  const internalRef = useRef<HTMLDivElement>(null);\n  const resolvedRef = (ref ?? internalRef) as React.RefObject<HTMLDivElement>;\n\n  const isInteractive = !!(onPress ?? href);\n\n  const [isDragged, setIsDragged] = useState(false);\n  const [isPressed, setIsPressed] = useState(false);\n\n  // ── Interaction state (React Aria) ──────────────────────────────────────────\n  // useHover/useFocusRing are always called (Rules of Hooks); their props are\n  // only attached to the root when the card is interactive.\n  const { isHovered, hoverProps } = useHover({ isDisabled: !isInteractive || isDisabled });\n  const { isFocusVisible, focusProps } = useFocusRing();\n\n  const handlePressStart = useCallback(() => setIsPressed(true), []);\n  const handlePressEnd = useCallback(() => setIsPressed(false), []);\n\n  // Ripple effect (interactive, non-disabled only)\n  const { onMouseDown: handleRipple, ripples } = useRipple({\n    disabled: !isInteractive || isDisabled,\n  });\n\n  const handleMouseDown = (e: React.MouseEvent<HTMLElement>): void => {\n    handleRipple(e);\n    if (isDraggable) setIsDragged(true);\n  };\n\n  const handleMouseUp = (): void => {\n    if (isDraggable) setIsDragged(false);\n  };\n\n  const handleMouseLeave = (): void => {\n    if (isDraggable) setIsDragged(false);\n  };\n\n  // Interaction data attributes (only meaningful when interactive).\n  const interactionAttrs = isInteractive\n    ? getInteractionDataAttributes({ isHovered, isFocusVisible, isPressed, isDisabled })\n    : {};\n\n  // React Aria hover/focus/press wiring, attached only when interactive.\n  const interactiveHandlers = isInteractive\n    ? mergeProps(hoverProps, focusProps, {\n        onPressStart: handlePressStart,\n        onPressEnd: handlePressEnd,\n      })\n    : {};\n\n  return (\n    <CardHeadless\n      ref={resolvedRef}\n      {...(onPress !== undefined && { onPress })}\n      {...(href !== undefined && { href })}\n      isDisabled={isDisabled}\n      {...(ariaLabel !== undefined && { \"aria-label\": ariaLabel })}\n      {...interactiveHandlers}\n      {...(isInteractive && { onMouseDown: handleMouseDown })}\n      {...(isInteractive &&\n        isDraggable && {\n          onMouseUp: handleMouseUp,\n          onMouseLeave: handleMouseLeave,\n        })}\n      {...interactionAttrs}\n      // ── Content flags (structure, NOT interaction state) ──────────────────\n      data-interactive={isInteractive ? \"\" : undefined}\n      // ── Dragged is a valid MD3 card state but is not part of the shared\n      //    interaction helper, so it is set explicitly here. ─────────────────\n      data-dragged={isInteractive && isDragged ? \"\" : undefined}\n      className={cn(cardVariants({ variant }), \"group/card\", className)}\n    >\n      {/* State layer — tints the surface below the content (z-10 wrapper) */}\n      {isInteractive && (\n        <span\n          data-testid=\"card-state-layer\"\n          aria-hidden=\"true\"\n          className={cn(cardStateLayerVariants())}\n        />\n      )}\n\n      {/* Ripple — press feedback, clipped to the card shape, below content */}\n      {isInteractive && ripples}\n\n      {/* Focus ring — inset overlay above content, visible on keyboard focus */}\n      {isInteractive && <span aria-hidden=\"true\" className={cn(cardFocusRingVariants())} />}\n\n      {/* Content — z-10 keeps slots above the state layer and ripple */}\n      <div className=\"relative z-10\">{children}</div>\n    </CardHeadless>\n  );\n});\n\nCard.displayName = \"Card\";\n","import { forwardRef } from \"react\";\nimport { cva } from \"class-variance-authority\";\nimport { cn } from \"../../utils/cn\";\nimport type { CardMediaProps } from \"./Card.types\";\n\n/**\n * Aspect ratio CVA for CardMedia.\n *\n * MD3 spec: full-bleed media slot at the top of a card.\n * - `16/9` → `aspect-video` (16:9 native Tailwind utility)\n * - `4/3`  → `aspect-[4/3]` (exact ratio; no MD3 token maps to 4:3 so an\n *             arbitrary value is the correct choice here)\n * - `1/1`  → `aspect-square`\n * - `auto` → no aspect constraint (natural image dimensions)\n */\nconst cardMediaVariants = cva(\"w-full object-cover\", {\n  variants: {\n    aspectRatio: {\n      \"16/9\": \"aspect-video\",\n      \"4/3\": \"aspect-[4/3]\",\n      \"1/1\": \"aspect-square\",\n      auto: \"\",\n    },\n  },\n  defaultVariants: {\n    aspectRatio: \"auto\",\n  },\n});\n\n/**\n * `CardMedia` — Full-bleed image slot sub-component (Layer 3).\n *\n * Renders a responsive image at the top of the card per MD3 spec.\n * When `alt` is an empty string the image is treated as decorative\n * (`role=\"presentation\"`). All other `alt` values are passed through as-is.\n *\n * @example\n * ```tsx\n * // Standard media with aspect ratio\n * <CardMedia src=\"/images/preview.jpg\" alt=\"Product preview\" aspectRatio=\"16/9\" />\n *\n * // Decorative image (hidden from assistive technology)\n * <CardMedia src=\"/images/banner.jpg\" alt=\"\" />\n * ```\n *\n * @see https://m3.material.io/components/cards/specs\n */\nexport const CardMedia = forwardRef<HTMLImageElement, CardMediaProps>(function CardMedia(\n  { src, alt, aspectRatio = \"auto\", className },\n  ref\n) {\n  return (\n    <img\n      ref={ref}\n      src={src}\n      alt={alt}\n      {...(alt === \"\" && { role: \"presentation\" })}\n      className={cn(cardMediaVariants({ aspectRatio }), className)}\n    />\n  );\n});\n\nCardMedia.displayName = \"CardMedia\";\n","import { forwardRef } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport type { CardHeaderProps } from \"./Card.types\";\n\n/**\n * `CardHeader` — Headline and subheader slot sub-component (Layer 3).\n *\n * Renders the primary headline (`h3`) and an optional subheader (`p`) per MD3 spec.\n * Default padding is `p-4` (16dp). When stacked directly after another slot\n * (e.g., `CardMedia`), consumers should apply `pt-0` to reduce top padding\n * per the MD3 adjacent-slot spacing rule.\n *\n * @example\n * ```tsx\n * <CardHeader headline=\"Card title\" subheader=\"Supporting text\" />\n *\n * // Stacked after CardMedia — reduce top padding\n * <>\n *   <CardMedia src=\"/hero.jpg\" alt=\"Hero\" aspectRatio=\"16/9\" />\n *   <CardHeader className=\"pt-0\" headline=\"Card title\" subheader=\"Supporting text\" />\n * </>\n * ```\n *\n * @see https://m3.material.io/components/cards/specs\n */\nexport const CardHeader = forwardRef<HTMLDivElement, CardHeaderProps>(function CardHeader(\n  { headline, subheader, className },\n  ref\n) {\n  return (\n    <div ref={ref} className={cn(\"p-4\", className)}>\n      <h3 className=\"text-on-surface text-title-medium\">{headline}</h3>\n      {subheader !== undefined && (\n        <p className=\"text-on-surface-variant text-body-medium mt-1\">{subheader}</p>\n      )}\n    </div>\n  );\n});\n\nCardHeader.displayName = \"CardHeader\";\n","import { forwardRef } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport type { CardContentProps } from \"./Card.types\";\n\n/**\n * `CardContent` — Body content slot sub-component (Layer 3).\n *\n * Renders the main body area of the card with `p-4` (16dp) padding per MD3 spec.\n * No forced text styling is applied — consumers control typography of children.\n *\n * @example\n * ```tsx\n * <CardContent>\n *   <p>Supporting text about the card content.</p>\n * </CardContent>\n * ```\n *\n * @see https://m3.material.io/components/cards/specs\n */\nexport const CardContent = forwardRef<HTMLDivElement, CardContentProps>(function CardContent(\n  { children, className },\n  ref\n) {\n  return (\n    <div ref={ref} className={cn(\"p-4\", className)}>\n      {children}\n    </div>\n  );\n});\n\nCardContent.displayName = \"CardContent\";\n","import { forwardRef } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport type { CardActionsProps } from \"./Card.types\";\n\n/**\n * `CardActions` — Action buttons row slot sub-component (Layer 3).\n *\n * Renders a right-aligned flex row of action buttons at the bottom of the card\n * per MD3 spec. Top padding is reduced (`pt-0`) because this slot always\n * follows a content area. Typically contains `Button` components.\n *\n * @example\n * ```tsx\n * <CardActions>\n *   <Button variant=\"text\" onPress={onCancel}>Cancel</Button>\n *   <Button variant=\"filled\" onPress={onConfirm}>Confirm</Button>\n * </CardActions>\n * ```\n *\n * @see https://m3.material.io/components/cards/specs\n */\nexport const CardActions = forwardRef<HTMLDivElement, CardActionsProps>(function CardActions(\n  { children, className },\n  ref\n) {\n  return (\n    <div ref={ref} className={cn(\"flex items-center justify-end gap-2 p-4 pt-0\", className)}>\n      {children}\n    </div>\n  );\n});\n\nCardActions.displayName = \"CardActions\";\n","import { cva, type VariantProps } from \"class-variance-authority\";\n\n/**\n * Material Design 3 Menu container variants (CVA).\n *\n * Architecture: Variants vs States\n * - CVA holds design-time structure only (menuStyle, colorScheme).\n * - Animation (enter/exit motion) lives on `menuPopoverVariants` which is\n *   applied to the RAC Popover element — the element where RAC actually emits\n *   data-entering, data-exiting, and data-placement.\n *\n * Shape per menuStyle:\n *   baseline: `rounded-xs` (4dp extra-small)\n *   vertical: `rounded-lg` (16dp large, MD3 Expressive)\n *\n * Background per menuStyle:\n *   baseline: bg-surface-container (solid, houses all items)\n *   vertical: bg-transparent (items paint their own segment cards; gap reveals\n *             the page background between segments — acting as the divider)\n *\n * @see https://m3.material.io/components/menus/specs\n */\nexport const menuContainerVariants = cva(\n  [\n    // Width constraints: 112dp min / 280dp max per MD3 spec\n    \"min-w-28 max-w-70\",\n    \"flex flex-col\",\n    // Scroll behaviour\n\n    \"max-h-[calc(var(--visual-viewport-height,100vh)-2rem)]\",\n    // Stacking\n    \"z-50\",\n    \"gap-0.5\",\n    // Focus outline delegated to React Aria\n    \"outline-none\",\n  ],\n  {\n    variants: {\n      /**\n       * Color scheme — drives item/segment background and content colors.\n       * standard: surface-container-low item background.\n       * vibrant:  tertiary-container item background.\n       */\n      colorScheme: {\n        standard: [],\n        vibrant: [],\n      },\n      /**\n       * Visual style — drives corner radius and container background.\n       *\n       * baseline: solid surface-container, 4dp corners, 8dp vertical padding.\n       * vertical: transparent container, 16dp corners, no container padding —\n       *   items own their segment surface, gaps reveal the page background.\n       */\n      menuStyle: {\n        baseline: [\"rounded-xs\", \"bg-surface-container\", \"py-2\"],\n        vertical: [\"bg-transparent\"],\n      },\n    },\n    defaultVariants: {\n      colorScheme: \"standard\",\n      menuStyle: \"baseline\",\n    },\n  }\n);\n\n// ─── MENU POPOVER ────────────────────────────────────────────────────────────\n\n/**\n * Applied to the React Aria `<Popover>` element — the element where RAC emits\n * `data-entering`, `data-exiting`, and `data-placement`.\n *\n * Motion:\n *   Enter: animate-md-scale-in (350ms expressive-fast-spatial, scale+fade)\n *   Exit:  animate-md-scale-out (200ms emphasized-accelerate, scale+fade)\n *\n * @see https://m3.material.io/components/menus/specs — Motion\n */\nexport const menuPopoverVariants = cva([\n  \"will-change-[transform,opacity]\",\n  \"data-[entering]:pointer-events-none data-[exiting]:pointer-events-none\",\n  \"data-[entering]:animate-md-scale-in\",\n  \"data-[exiting]:animate-md-scale-out\",\n  \"origin-top\",\n  \"data-[placement=top]:origin-bottom\",\n  \"data-[placement=left]:origin-right\",\n  \"data-[placement=right]:origin-left\",\n  \"motion-reduce:data-[entering]:animate-none motion-reduce:data-[exiting]:animate-none\",\n]);\n\n// ─── MENU ITEM ROOT ───────────────────────────────────────────────────────────\n\n/**\n * Material Design 3 Menu item root variants (CVA).\n *\n * Segmented vertical model (MD3 Expressive):\n *   The container is transparent. Each item paints its own segment surface\n *   (bg-surface-container-low / bg-tertiary-container). Groups of items are\n *   visually separated by a MenuGap spacer whose 2dp height reveals the page\n *   background between segments — creating the \"divider\" effect without a line.\n *\n * Segmented corner-rounding strategy (vertical):\n *   Each item defaults to rounded-xs (4dp, inner corners).\n *   The first item in a segment gets rounded-t-lg (16dp top corners).\n *   The last item in a segment gets rounded-b-lg (16dp bottom corners).\n *   Segment boundaries are determined by:\n *     - first/last pseudo-classes (start/end of entire menu)\n *     - CSS adjacent-sibling selectors relative to [data-menu-gap] elements\n *\n *   Adjacent-sibling selectors:\n *     Immediately after a gap  → [[data-menu-gap]+&]:rounded-t-lg\n *     Immediately before a gap → the item uses has-[+[data-menu-gap]] which\n *                                only works if the gap is a true sibling.\n *                                RAC wraps items in <li> so we use\n *                                [:has(+[data-menu-gap])]:rounded-b-lg on the\n *                                item element itself when supported; where not,\n *                                the MenuItem component also computes and\n *                                injects explicit override classes.\n *\n * Color mapping (MD3 Expressive spec):\n *   Standard — item bg: surface-container-low; label: on-surface; icons/trailing: on-surface-variant\n *              selected/open bg: tertiary-container; content: on-tertiary-container\n *   Vibrant  — item bg: tertiary-container; label: on-tertiary-container; icons/trailing: on-tertiary-container\n *              selected/open bg: tertiary; content: on-tertiary\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    // gap is style-specific: baseline = 12dp (gap-3), vertical = 8dp (gap-2)\n    \"relative flex w-full items-center\",\n    // Typography: Label Large per MD3 menu spec\n    \"text-label-large\",\n    // Interaction\n    \"cursor-pointer select-none outline-none\",\n    // Color transition (effects — no overshoot)\n    \"transition-colors duration-spring-standard-fast-effects ease-spring-standard-fast-effects\",\n    // Disabled — self-targeting data-[x]: selectors (RAC emits data-disabled)\n    \"data-[disabled]:pointer-events-none data-[disabled]:cursor-not-allowed\",\n  ],\n  {\n    variants: {\n      /**\n       * Color scheme — drives item bg, default text/icon color, and selection colors.\n       *\n       * standard: surface-container-low bg, on-surface text, on-surface-variant icons.\n       *           Selected/open: tertiary-container bg highlight, on-tertiary-container content.\n       * vibrant:  tertiary-container bg, on-tertiary-container text AND icons.\n       *           Selected/open: tertiary bg highlight, on-tertiary content.\n       */\n      colorScheme: {\n        standard: [\"text-on-surface\"],\n        vibrant: [\"text-on-tertiary-container\"],\n      },\n      /**\n       * Visual style — drives padding, gap, segment surface, and corner rounding.\n       *\n       * baseline: 12dp h-padding, 12dp icon-to-label gap, no item background (container provides it).\n       * vertical: 12dp h-padding, 8dp icon-to-label gap, item owns segment surface, segmented rounding\n       *   via first/last + adjacent-sibling gap selectors.\n       */\n      menuStyle: {\n        baseline: [\"px-3\", \"gap-3\"],\n        vertical: [\n          \"px-3\",\n          \"gap-2\",\n          // Default: inner item (4dp all corners)\n          \"rounded-md\",\n          // Last item in the whole menu → 16dp bottom corners\n        ],\n      },\n    },\n    compoundVariants: [\n      // vertical + standard: selected/open text → on-tertiary-container\n      {\n        menuStyle: \"vertical\",\n        colorScheme: \"standard\",\n        class: [\n          \"data-[selected]:text-on-tertiary-container\",\n          \"data-[open]:text-on-tertiary-container\",\n        ],\n      },\n      // vertical + vibrant: selected/open text → on-tertiary\n      {\n        menuStyle: \"vertical\",\n        colorScheme: \"vibrant\",\n        class: [\"data-[selected]:text-on-tertiary\", \"data-[open]:text-on-tertiary\"],\n      },\n    ],\n    defaultVariants: {\n      colorScheme: \"standard\",\n      menuStyle: \"baseline\",\n    },\n  }\n);\n\n// ─── MENU ITEM HIGHLIGHT ─────────────────────────────────────────────────────\n\n/**\n * Selected/active-background highlight layer for menu items.\n *\n * Geometry:\n *   baseline — `inset-0 rounded-[inherit]` (full-bleed, inherits item corner radius)\n *   vertical — `inset-0 rounded-[inherit]` (full-bleed, inherits segment card corners)\n *\n * Both styles use `inset-0 rounded-[inherit]` so the highlight always fills the\n * item exactly, respecting whichever corner radii the item has (inner 4dp for\n * middle items, outer 16dp for top/bottom items in a segment).\n *\n * Selection/active colors per menuStyle × colorScheme:\n *   baseline (any):         group-data-[selected]/menuitem:bg-surface-container-highest\n *   vertical + standard:    group-data-[selected]/menuitem:bg-tertiary-container\n *                           group-data-[open]/menuitem:bg-tertiary-container\n *   vertical + vibrant:     group-data-[selected]/menuitem:bg-tertiary\n *                           group-data-[open]/menuitem:bg-tertiary\n *\n * @see https://m3.material.io/components/menus/specs — Selected state\n */\nexport const menuItemHighlightVariants = cva(\n  [\n    \"absolute inset-0 pointer-events-none\",\n    // Inherit the item's own corner radius (inner 4dp or outer 16dp)\n    \"rounded-[inherit]\",\n    // Effects transition for background-color — no overshoot\n    \"transition-colors duration-spring-standard-fast-effects ease-spring-standard-fast-effects\",\n    // z-0: below state layer (z-[1]) and content (z-10)\n    \"z-0\",\n  ],\n  {\n    variants: {\n      menuStyle: {\n        baseline: [],\n        vertical: [],\n      },\n      colorScheme: {\n        standard: [\n          // baseline selected bg\n          \"group-data-[selected]/menuitem:bg-surface-container-highest\",\n        ],\n        vibrant: [\n          // baseline + vibrant: use surface-container-highest as fallback\n          \"group-data-[selected]/menuitem:bg-surface-container-highest\",\n        ],\n      },\n    },\n    compoundVariants: [\n      // vertical + standard: selected/open highlight → tertiary-container\n      {\n        menuStyle: \"vertical\",\n        colorScheme: \"standard\",\n        class: [\n          \"group-data-[selected]/menuitem:bg-tertiary-container\",\n          \"group-data-[open]/menuitem:bg-tertiary-container\",\n        ],\n      },\n      // vertical + vibrant: selected/open highlight → tertiary\n      {\n        menuStyle: \"vertical\",\n        colorScheme: \"vibrant\",\n        class: [\n          \"group-data-[selected]/menuitem:bg-tertiary\",\n          \"group-data-[open]/menuitem:bg-tertiary\",\n        ],\n      },\n    ],\n    defaultVariants: {\n      menuStyle: \"baseline\",\n      colorScheme: \"standard\",\n    },\n  }\n);\n\n// ─── MENU ITEM STATE LAYER ────────────────────────────────────────────────────\n\n/**\n * State layer slot — absolute inset overlay that transitions opacity on\n * hover / press interaction states.\n *\n * Geometry: `inset-0 rounded-[inherit]` for both baseline and vertical —\n * full-bleed, inherits item corner radius so the state layer respects\n * the segment card shape.\n *\n * Color mapping (MD3 Expressive):\n *   standard: bg-on-surface (unselected/unopen)\n *             group-data-[selected] / group-data-[open]: bg-on-tertiary-container\n *   vibrant:  bg-on-tertiary-container (unselected/unopen)\n *             group-data-[selected] / group-data-[open]: bg-on-tertiary\n *\n * Focus-visible state is NOT expressed as a state-layer opacity here —\n * it is expressed via the dedicated focus-ring slot (menuItemFocusRingVariants)\n * per the MD3 Expressive reference state grid.\n *\n * State-layer opacities per MD3 spec:\n *   Hover:   8%   (opacity-8)\n *   Pressed: 10%  (opacity-10, doubled selector wins over hover)\n *\n * @see https://m3.material.io/components/menus/specs#state-layers\n */\nexport const menuItemStateLayerVariants = cva(\n  [\n    \"absolute inset-0 rounded-[inherit] overflow-hidden pointer-events-none opacity-0\",\n    // Effects transition — opacity must NOT overshoot\n    \"transition-opacity duration-spring-standard-fast-effects ease-spring-standard-fast-effects\",\n    // Hover: 8%\n    \"group-data-[hovered]/menuitem:opacity-8\",\n    // Pressed: 10%, doubled selector wins over hover at same cascade position\n    \"group-data-[pressed]/menuitem:group-data-[pressed]/menuitem:opacity-10\",\n    // No state layer when disabled\n    \"group-data-[disabled]/menuitem:hidden\",\n    // z-[1]: above highlight layer (z-0), below content (z-10)\n    \"z-[1]\",\n  ],\n  {\n    variants: {\n      colorScheme: {\n        standard: [\"bg-on-surface\"],\n        vibrant: [\"bg-on-tertiary-container\"],\n      },\n      menuStyle: {\n        baseline: [],\n        vertical: [],\n      },\n    },\n    compoundVariants: [\n      // vertical + standard: selected/open state layer → on-tertiary-container\n      {\n        menuStyle: \"vertical\",\n        colorScheme: \"standard\",\n        class: [\n          \"group-data-[selected]/menuitem:bg-on-tertiary-container\",\n          \"group-data-[open]/menuitem:bg-on-tertiary-container\",\n        ],\n      },\n      // vertical + vibrant: selected/open state layer → on-tertiary\n      {\n        menuStyle: \"vertical\",\n        colorScheme: \"vibrant\",\n        class: [\n          \"group-data-[selected]/menuitem:bg-on-tertiary\",\n          \"group-data-[open]/menuitem:bg-on-tertiary\",\n        ],\n      },\n    ],\n    defaultVariants: {\n      colorScheme: \"standard\",\n      menuStyle: \"baseline\",\n    },\n  }\n);\n\n// ─── MENU ITEM FOCUS RING ─────────────────────────────────────────────────────\n\n/**\n * Focus ring slot — keyboard-focus indicator rendered as an absolute overlay\n * with an outline that extends inside the item boundary.\n *\n * Unlike the Button focus ring (which uses `inset-[-3px]` to extend outward),\n * the menu item focus ring uses `-outline-offset-2` (inset 2dp) so it stays\n * within the segment card without clipping adjacent items.\n *\n * Geometry: `inset-0 rounded-[inherit]` — full-bleed, inherits item corners.\n * Color: `outline-secondary` per MD3 focus indicator token.\n * Opacity: 0 at rest → 100% on focus-visible.\n *\n * @see https://m3.material.io/components/menus/specs — States\n */\nexport const menuItemFocusRingVariants = cva([\n  \"pointer-events-none absolute inset-0 rounded-[inherit]\",\n  \"outline outline-2 -outline-offset-2 outline-secondary\",\n  // Effects transition — opacity must not overshoot\n  \"transition-opacity duration-spring-standard-fast-effects ease-spring-standard-fast-effects\",\n  \"opacity-0\",\n  \"group-data-[focus-visible]/menuitem:opacity-100\",\n  // z-[2]: above state layer (z-[1]) and highlight (z-0), below content (z-10)\n  \"z-[2]\",\n]);\n\n// ─── MENU ITEM ICON ───────────────────────────────────────────────────────────\n\n/**\n * Icon slot (leading and trailing icons) for menu items.\n *\n * Color mapping (MD3 Expressive):\n *   standard:  on-surface-variant (unselected); on-tertiary-container (selected/open)\n *   vibrant:   on-tertiary-container (unselected); on-tertiary (selected/open)\n *\n * Size per menuStyle:\n *   baseline — 24dp (MD3 baseline spec)\n *   vertical — 20dp (SegmentedMenuTokens.ItemLeadingIconSize = 20dp)\n *\n * Disabled: on-surface/38 per MD3 spec.\n *\n * @see https://m3.material.io/components/menus/specs#anatomy\n */\nexport const menuItemIconVariants = cva(\n  [\n    \"relative z-10 shrink-0 flex items-center justify-center\",\n    \"transition-colors duration-spring-standard-fast-effects ease-spring-standard-fast-effects\",\n    // Disabled: 38% opacity on icon color\n    \"group-data-[disabled]/menuitem:text-on-surface/38\",\n  ],\n  {\n    variants: {\n      colorScheme: {\n        standard: [\"text-on-surface-variant\"],\n        vibrant: [\"text-on-tertiary-container\"],\n      },\n      menuStyle: {\n        baseline: [\"h-6 w-6\"],\n        vertical: [\"h-5 w-5\"],\n      },\n    },\n    compoundVariants: [\n      // vertical + standard: selected/open icon → on-tertiary-container\n      {\n        menuStyle: \"vertical\",\n        colorScheme: \"standard\",\n        class: [\n          \"group-data-[selected]/menuitem:text-on-tertiary-container\",\n          \"group-data-[open]/menuitem:text-on-tertiary-container\",\n        ],\n      },\n      // vertical + vibrant: selected/open icon → on-tertiary\n      {\n        menuStyle: \"vertical\",\n        colorScheme: \"vibrant\",\n        class: [\n          \"group-data-[selected]/menuitem:text-on-tertiary\",\n          \"group-data-[open]/menuitem:text-on-tertiary\",\n        ],\n      },\n    ],\n    defaultVariants: {\n      colorScheme: \"standard\",\n      menuStyle: \"baseline\",\n    },\n  }\n);\n\n// ─── MENU SECTION ─────────────────────────────────────────────────────────────\n\n/**\n * Menu section container variants (CVA).\n */\nexport const menuSectionVariants = cva([\"flex flex-col w-full\"]);\n\n// ─── MENU SECTION HEADER ──────────────────────────────────────────────────────\n\n/**\n * Menu section header variants (CVA).\n *\n * Color mapping (MD3 Expressive):\n *   standard: text-on-surface-variant\n *   vibrant:  text-on-tertiary-container\n *\n * @see https://m3.material.io/components/menus/specs — Callout 10\n */\nexport const menuSectionHeaderVariants = cva(\n  [\n    // 32dp tall region, content vertically centred, 12dp leading padding aligned with items\n    \"px-3 h-8 flex items-center\",\n    \"text-title-small\",\n    \"select-none\",\n  ],\n  {\n    variants: {\n      colorScheme: {\n        standard: [\"text-on-surface-variant\"],\n        vibrant: [\"text-on-tertiary-container\"],\n      },\n    },\n    defaultVariants: {\n      colorScheme: \"standard\",\n    },\n  }\n);\n\n// ─── MENU DIVIDER ─────────────────────────────────────────────────────────────\n\n/**\n * Menu item divider variants (CVA).\n *\n * Horizontal separator with `border-outline-variant`.\n * Spacing: 2dp top/bottom (`my-0.5`) 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-0.5 mx-3\"]);\n\n// ─── MENU GAP ────────────────────────────────────────────────────────────────\n\n/**\n * Menu gap variants (CVA).\n *\n * A 2dp visual spacer for MD3 Expressive vertical menus. The gap reveals the\n * page background between item segments, acting as a visual divider without\n * a line. Set aria-hidden and role=\"none\" in the component.\n *\n * Height: 2dp (h-0.5) — keeps the segment separation tight but visible.\n *\n * @see https://m3.material.io/components/menus/guidelines#gaps-and-dividers\n */\nexport const menuGapVariants = cva([\"h-0.5 w-full\"]);\n\n// ─── MENU ITEM TRAILING TEXT ──────────────────────────────────────────────────\n\n/**\n * Trailing text (keyboard shortcut) variants (CVA).\n *\n * Color mapping (MD3 Expressive):\n *   standard: on-surface-variant (unselected); on-tertiary-container (selected/open)\n *   vibrant:  on-tertiary-container (unselected); on-tertiary (selected/open)\n *\n * Disabled: on-surface/38.\n */\nexport const menuItemTrailingTextVariants = cva(\n  [\n    \"ml-auto shrink-0 text-label-large\",\n    \"select-none\",\n    \"group-data-[disabled]/menuitem:text-on-surface/38\",\n  ],\n  {\n    variants: {\n      colorScheme: {\n        standard: [\"text-on-surface-variant\"],\n        vibrant: [\"text-on-tertiary-container\"],\n      },\n      menuStyle: {\n        baseline: [],\n        vertical: [\n          \"group-data-[selected]/menuitem:text-on-tertiary-container\",\n          \"group-data-[open]/menuitem:text-on-tertiary-container\",\n        ],\n      },\n    },\n    compoundVariants: [\n      // vertical + vibrant: selected/open trailing text → on-tertiary\n      {\n        menuStyle: \"vertical\",\n        colorScheme: \"vibrant\",\n        class: [\n          \"group-data-[selected]/menuitem:text-on-tertiary\",\n          \"group-data-[open]/menuitem:text-on-tertiary\",\n        ],\n      },\n    ],\n    defaultVariants: {\n      colorScheme: \"standard\",\n      menuStyle: \"baseline\",\n    },\n  }\n);\n\n// ─── MENU ITEM DESCRIPTION ────────────────────────────────────────────────────\n\n/**\n * Menu item description (supporting text) variants (CVA).\n *\n * Rendered below the label text.\n *\n * Color mapping (MD3 Expressive):\n *   standard: on-surface-variant (unselected); on-tertiary-container (selected/open)\n *   vibrant:  on-tertiary-container (unselected); on-tertiary (selected/open)\n *\n * Disabled: on-surface/38.\n */\nexport const menuItemDescriptionVariants = cva(\n  [\"text-body-medium\", \"select-none\", \"group-data-[disabled]/menuitem:text-on-surface/38\"],\n  {\n    variants: {\n      colorScheme: {\n        standard: [\"text-on-surface-variant\"],\n        vibrant: [\"text-on-tertiary-container\"],\n      },\n      menuStyle: {\n        baseline: [],\n        vertical: [\n          \"group-data-[selected]/menuitem:text-on-tertiary-container\",\n          \"group-data-[open]/menuitem:text-on-tertiary-container\",\n        ],\n      },\n    },\n    compoundVariants: [\n      // vertical + vibrant: selected/open description → on-tertiary\n      {\n        menuStyle: \"vertical\",\n        colorScheme: \"vibrant\",\n        class: [\n          \"group-data-[selected]/menuitem:text-on-tertiary\",\n          \"group-data-[open]/menuitem:text-on-tertiary\",\n        ],\n      },\n    ],\n    defaultVariants: {\n      colorScheme: \"standard\",\n      menuStyle: \"baseline\",\n    },\n  }\n);\n\n// ─── MENU ITEM GROUP ──────────────────────────────────────────────────────────\n\n/**\n * Menu item group container variants (CVA).\n *\n * `MenuItemGroup` is the MD3 Expressive sibling-aware grouping primitive.\n * It wraps related `MenuItem` elements in a semantic `role=\"group\"` and, when\n * `menuStyle=\"vertical\"`, automatically inserts a 2dp leading gap that is\n * hidden when the group is the first sibling — yielding a gap *between*\n * consecutive groups without a gap before the very first one.\n *\n * The base classes mirror `menuSectionVariants` (`flex flex-col w-full`)\n * so both grouping components share the same layout baseline.\n *\n * @see https://m3.material.io/components/menus/guidelines#gaps-and-dividers\n */\nexport const menuItemGroupVariants = cva(\n  [\n    \"flex flex-col w-full\",\n    \"px-1 py-0.5 gap-0.5\",\n    \"rounded-lg first:rounded-b-sm last:rounded-t-sm\",\n    \"shadow-elevation-1\",\n  ],\n  {\n    variants: {\n      menuStyle: {\n        vertical: [\"bg-surface-container-low\"],\n        baseline: [],\n      },\n      colorScheme: {\n        standard: [\"bg-surface-container-low\"],\n        vibrant: [\"bg-tertiary-container\"],\n      },\n    },\n    compoundVariants: [\n      // vertical + standard: item background = surface-container-low\n      {\n        menuStyle: \"vertical\",\n        colorScheme: \"standard\",\n        class: [\"bg-surface-container-low\"],\n      },\n      // vertical + vibrant: item background = tertiary-container\n      {\n        menuStyle: \"vertical\",\n        colorScheme: \"vibrant\",\n        class: [\"bg-tertiary-container\"],\n      },\n    ],\n    defaultVariants: {\n      menuStyle: \"vertical\",\n      colorScheme: \"standard\",\n    },\n  }\n);\n\n// ─── TYPE EXPORTS ─────────────────────────────────────────────────────────────\n\nexport type MenuContainerVariants = VariantProps<typeof menuContainerVariants>;\nexport type MenuPopoverVariants = VariantProps<typeof menuPopoverVariants>;\nexport type MenuItemVariants = VariantProps<typeof menuItemVariants>;\nexport type MenuItemHighlightVariants = VariantProps<typeof menuItemHighlightVariants>;\nexport type MenuItemStateLayerVariants = VariantProps<typeof menuItemStateLayerVariants>;\nexport type MenuItemFocusRingVariants = VariantProps<typeof menuItemFocusRingVariants>;\nexport type MenuItemIconVariants = VariantProps<typeof menuItemIconVariants>;\nexport type MenuSectionVariants = VariantProps<typeof menuSectionVariants>;\nexport type MenuSectionHeaderVariants = VariantProps<typeof menuSectionHeaderVariants>;\nexport type MenuItemTrailingTextVariants = VariantProps<typeof menuItemTrailingTextVariants>;\nexport type MenuItemDescriptionVariants = VariantProps<typeof menuItemDescriptionVariants>;\nexport type MenuItemGroupVariants = VariantProps<typeof menuItemGroupVariants>;\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 { menuPopoverVariants } from \"./Menu.variants\";\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\n        placement={placement}\n        shouldFlip={shouldFlip}\n        offset={4}\n        className={menuPopoverVariants()}\n      >\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\" className={menuPopoverVariants()}>\n      {menuChild}\n    </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\n          triggerRef={virtualTriggerRef}\n          placement=\"bottom start\"\n          shouldFlip\n          offset={0}\n          className={menuPopoverVariants()}\n        >\n          {menuChild}\n        </Popover>\n      </OverlayTriggerStateContext.Provider>\n    </>\n  );\n}\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  menuItemStateLayerVariants,\n  menuItemHighlightVariants,\n  menuItemFocusRingVariants,\n  menuItemIconVariants,\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 maps ───────────────────────────────────────────────────────\n\n/**\n * Baseline item heights per MD3 density spec.\n * density 0 = 48dp, -1 = 44dp, -2 = 40dp, -3 = 36dp.\n */\nconst BASELINE_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/**\n * Vertical (Expressive) item heights per MD3 Expressive measurement spec.\n * Matched to baseline heights (48/44/40/36dp) per the measurement reference.\n */\nconst VERTICAL_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 * Slot architecture (mirrors Button/Switch):\n *   root (group/menuitem)        — layout, cursor, color, density height\n *   highlight (z-0)              — selected/active background fill\n *   stateLayer (z-[1])           — hover/press opacity overlay\n *   focusRing (z-[2])            — keyboard focus outline (inset, not on state-layer)\n *   ripple (z-[3])               — press ripple feedback\n *   content (z-10)               — icon, label, trailing text/icon, description\n *\n * All interaction/selection styles are driven by data-* attributes that RAC\n * MenuItem emits natively (data-hovered, data-pressed, data-focus-visible,\n * data-selected, data-disabled, data-open) consumed via group-data selectors.\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 =\n    menuStyle === \"vertical\" ? VERTICAL_DENSITY_HEIGHT[density] : BASELINE_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 = ({ isSelected }: MenuItemRenderProps): string =>\n    cn(\n      menuItemVariants({ colorScheme, menuStyle }),\n      // group/menuitem scope: all slot children read state via group-data-[x]/menuitem\n      \"group/menuitem\",\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      // Silence the isSelected lint — value consumed in render-prop below\n      isSelected ? \"\" : \"\"\n    );\n\n  return (\n    <HeadlessMenuItem\n      {...props}\n      ref={ref}\n      className={computeClassName}\n      onMouseDown={onMouseDown as unknown as React.MouseEventHandler<Element>}\n    >\n      {({ isSelected }: MenuItemRenderProps) => (\n        <>\n          {/* ── Highlight layer (selected/active background) ───────────────── */}\n          {/* z-0, full-bleed inset-0 rounded-[inherit] so it respects the\n              item's current segment corner radius (inner 4dp or outer 16dp). */}\n          <span\n            aria-hidden=\"true\"\n            data-testid=\"menuitem-highlight\"\n            className={menuItemHighlightVariants({ colorScheme, menuStyle })}\n          />\n\n          {/* ── State layer slot ──────────────────────────────────────────── */}\n          {/* z-[1]: above highlight, below focus ring and content.\n              Covers hover (8%) and press (10%) but NOT focus-visible\n              — focus is expressed via the dedicated focus-ring slot below. */}\n          <span\n            aria-hidden=\"true\"\n            className={menuItemStateLayerVariants({ colorScheme, menuStyle })}\n          />\n\n          {/* ── Focus ring slot ───────────────────────────────────────────── */}\n          {/* z-[2]: above state layer. Keyboard-focus outline, inset 2dp,\n              inherits item corner radius. Opacity 0→100 on focus-visible. */}\n          <span\n            aria-hidden=\"true\"\n            data-testid=\"menuitem-focus-ring\"\n            className={menuItemFocusRingVariants()}\n          />\n\n          {/* ── Ripple container ──────────────────────────────────────────── */}\n          {/* z-[3]: above focus ring. Full-bleed, inherits item corners so\n              the ripple clips to the segment card shape. */}\n          {!disableRipple && (\n            <span\n              className={cn(\n                \"pointer-events-none absolute inset-0 z-[3] overflow-hidden rounded-[inherit]\"\n              )}\n            >\n              {ripples}\n            </span>\n          )}\n\n          {/* ── Leading icon or checkmark slot ────────────────────────────── */}\n          {(leadingIcon != null || isSelectionMenu) && (\n            <span className={menuItemIconVariants({ colorScheme, menuStyle })} aria-hidden=\"true\">\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-label-large group-data-[disabled]/menuitem:text-on-surface/38\">\n                {children}\n              </span>\n              <span className={menuItemDescriptionVariants({ colorScheme, menuStyle })}>\n                {description}\n              </span>\n            </span>\n          ) : (\n            <span className=\"text-label-large group-data-[disabled]/menuitem:text-on-surface/38 relative z-10 min-w-0 flex-1\">\n              {children}\n            </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={cn(menuItemIconVariants({ colorScheme, menuStyle }), \"ml-auto\")}\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(\n                menuItemTrailingTextVariants({ colorScheme, menuStyle }),\n                \"relative z-10\"\n              )}\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, useMenuContext } 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 * The section header color adapts to the `colorScheme` from `MenuContext`:\n *   standard → text-on-surface-variant\n *   vibrant  → text-on-tertiary-container\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  const ctx = useMenuContext();\n  const colorScheme = ctx?.colorScheme ?? \"standard\";\n\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({ colorScheme })} 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 * Architecture: Variants vs States\n * ─────────────────────────────────\n * - CVA holds design-time choices only (twoLine density, animationState, position).\n * - Dedicated slot CVAs for the action button and close button replace the old\n *   shared `Button`/`IconButton` usage, giving MD3-correct state-layer colors\n *   on the inverse surface:\n *     • Action button  → state-layer  bg-inverse-primary\n *     • Close button   → state-layer  bg-inverse-on-surface\n * - All interaction states on action/close slots are driven by data-* attributes\n *   via group-data-[x]/snackbar-action and group-data-[x]/snackbar-close selectors.\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 * - Width            : 288dp min (min-w-72) / 568dp max (max-w-snackbar-max)\n * - Single-line height: 48dp (min-h-12)\n * - Two-line height  : 68dp (min-h-[4.25rem])\n * - Action text      : label-large, inverse-primary\n * - Close icon       : 24dp (size-6), inverse-on-surface\n * - Entry motion     : slide + fade in, spring-standard-default-effects (200ms)\n * - Exit motion      : slide + fade out, spring-standard-fast-effects (150ms)\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, density — no positioning) ────────────────\n\n/**\n * Snackbar base container variants — structural, surface, and density classes.\n * Positioning is handled by the stack container (`snackbarStackContainerVariants`).\n *\n * `twoLine` drives two distinct density profiles:\n *   false — 48dp min-height, content vertically centered (MD3 single-line)\n *   true  — 68dp min-height, content top-aligned (MD3 two-line)\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\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    \"gap-x-1\",\n    \"pl-4\",\n\n    // Typography base (inherited by message/supporting-text slots)\n    \"text-body-medium\",\n    \"text-inverse-on-surface\",\n\n    // Slide + fade transition — spring-standard effects tokens (no overshoot).\n    // The translate offset is small (12px), so using the effects token pair for\n    // BOTH opacity AND transform is safe: no visible overshoot at this scale.\n    \"transition-[opacity,transform]\",\n    \"will-change-[opacity,transform]\",\n  ],\n  {\n    variants: {\n      /**\n       * Two-line density mode.\n       *   false — 48dp, items centered (single-line message)\n       *   true  — 68dp, items top-aligned (message + supporting text)\n       */\n      twoLine: {\n        false: [\"min-h-12\", \"items-center\", \"pr-1\"],\n        true: [\"min-h-[4.25rem]\", \"items-start\", \"pr-1\"],\n      },\n    },\n    defaultVariants: {\n      twoLine: false,\n    },\n  }\n);\n\nexport type SnackbarBaseVariants = VariantProps<typeof snackbarBaseVariants>;\n\n// ─── Position variants (standalone / headless usage) ─────────────────────────\n\n/**\n * Snackbar screen position variants.\n *\n * Applied to the **stack container** in `SnackbarProvider`. Kept as a separate\n * export so standalone (non-provider) `SnackbarHeadless` usage can apply\n * 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 * Position-aware slide + fade animation variants.\n *\n * Replaces the legacy scale/zoom approach with MD3-compliant slide + fade\n * using spring-standard effects tokens (no overshoot on opacity or the small\n * translate offset).\n *\n * Enter direction:\n *   up   (bottom positions) → element starts below viewport edge, slides up\n *   down (top positions)    → element starts above viewport edge, slides down\n *\n * Animation flow:\n *   entering → initial paint (opacity-0 + directional translate, no duration)\n *   visible  → slide in + fade in (spring-standard-default-effects = 200ms)\n *   exiting  → slide out + fade out (spring-standard-fast-effects = 150ms)\n *   exited   → hold final position (removed from DOM by provider)\n *\n * compoundVariants express (animationState × enterDirection) pairs — both are\n * derived runtime values, and full explicit compounds are the only reliable way\n * to set direction-specific translate without Tailwind class-order conflicts.\n */\nexport const snackbarAnimationVariants = cva(\"\", {\n  variants: {\n    animationState: {\n      entering: [],\n      visible: [],\n      exiting: [],\n      exited: [],\n    },\n    enterDirection: {\n      up: [],\n      down: [],\n    },\n  },\n  compoundVariants: [\n    // ── entering ──────────────────────────────────────────────────────────────\n    // No transition duration — instant jump to offset state before first paint.\n    {\n      animationState: \"entering\",\n      enterDirection: \"up\",\n      className: [\"opacity-0\", \"translate-y-3\"],\n    },\n    {\n      animationState: \"entering\",\n      enterDirection: \"down\",\n      className: [\"opacity-0\", \"-translate-y-3\"],\n    },\n\n    // ── visible ───────────────────────────────────────────────────────────────\n    // spring-standard default effects = 200ms, no overshoot.\n    {\n      animationState: \"visible\",\n      enterDirection: \"up\",\n      className: [\n        \"opacity-100\",\n        \"translate-y-0\",\n        \"duration-spring-standard-default-effects\",\n        \"ease-spring-standard-default-effects\",\n      ],\n    },\n    {\n      animationState: \"visible\",\n      enterDirection: \"down\",\n      className: [\n        \"opacity-100\",\n        \"translate-y-0\",\n        \"duration-spring-standard-default-effects\",\n        \"ease-spring-standard-default-effects\",\n      ],\n    },\n\n    // ── exiting ───────────────────────────────────────────────────────────────\n    // spring-standard fast effects = 150ms (quicker exit).\n    {\n      animationState: \"exiting\",\n      enterDirection: \"up\",\n      className: [\n        \"opacity-0\",\n        \"translate-y-3\",\n        \"duration-spring-standard-fast-effects\",\n        \"ease-spring-standard-fast-effects\",\n      ],\n    },\n    {\n      animationState: \"exiting\",\n      enterDirection: \"down\",\n      className: [\n        \"opacity-0\",\n        \"-translate-y-3\",\n        \"duration-spring-standard-fast-effects\",\n        \"ease-spring-standard-fast-effects\",\n      ],\n    },\n\n    // ── exited ────────────────────────────────────────────────────────────────\n    // Hold final position — element is removed from DOM shortly after.\n    {\n      animationState: \"exited\",\n      enterDirection: \"up\",\n      className: [\"opacity-0\", \"translate-y-3\"],\n    },\n    {\n      animationState: \"exited\",\n      enterDirection: \"down\",\n      className: [\"opacity-0\", \"-translate-y-3\"],\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 * Used by consumers who want the full combined class string without the\n * render-prop pattern (e.g. standalone headless usage outside the provider).\n *\n * The main rendering path uses `snackbarBaseVariants` + `snackbarAnimationVariants`\n * separately for better separation of concerns.\n */\nexport const snackbarContainerVariants = cva(\n  [\n    \"min-w-72\",\n    \"max-w-snackbar-max\",\n    \"w-max\",\n    \"pointer-events-auto\",\n    \"bg-inverse-surface\",\n    \"rounded-xs\",\n    \"shadow-elevation-3\",\n    \"flex\",\n    \"gap-x-1\",\n    \"pl-4\",\n    \"text-body-medium\",\n    \"text-inverse-on-surface\",\n    \"transition-[opacity,transform]\",\n    \"will-change-[opacity,transform]\",\n  ],\n  {\n    variants: {\n      twoLine: {\n        false: [\"min-h-12\", \"items-center\", \"pr-1\"],\n        true: [\"min-h-[4.25rem]\", \"items-start\", \"pr-1\"],\n      },\n      animationState: {\n        entering: [],\n        visible: [],\n        exiting: [],\n        exited: [],\n      },\n      enterDirection: {\n        up: [],\n        down: [],\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    },\n    compoundVariants: [\n      {\n        animationState: \"entering\",\n        enterDirection: \"up\",\n        className: [\"opacity-0\", \"translate-y-3\"],\n      },\n      {\n        animationState: \"entering\",\n        enterDirection: \"down\",\n        className: [\"opacity-0\", \"-translate-y-3\"],\n      },\n      {\n        animationState: \"visible\",\n        enterDirection: \"up\",\n        className: [\n          \"opacity-100\",\n          \"translate-y-0\",\n          \"duration-spring-standard-default-effects\",\n          \"ease-spring-standard-default-effects\",\n        ],\n      },\n      {\n        animationState: \"visible\",\n        enterDirection: \"down\",\n        className: [\n          \"opacity-100\",\n          \"translate-y-0\",\n          \"duration-spring-standard-default-effects\",\n          \"ease-spring-standard-default-effects\",\n        ],\n      },\n      {\n        animationState: \"exiting\",\n        enterDirection: \"up\",\n        className: [\n          \"opacity-0\",\n          \"translate-y-3\",\n          \"duration-spring-standard-fast-effects\",\n          \"ease-spring-standard-fast-effects\",\n        ],\n      },\n      {\n        animationState: \"exiting\",\n        enterDirection: \"down\",\n        className: [\n          \"opacity-0\",\n          \"-translate-y-3\",\n          \"duration-spring-standard-fast-effects\",\n          \"ease-spring-standard-fast-effects\",\n        ],\n      },\n      {\n        animationState: \"exited\",\n        enterDirection: \"up\",\n        className: [\"opacity-0\", \"translate-y-3\"],\n      },\n      {\n        animationState: \"exited\",\n        enterDirection: \"down\",\n        className: [\"opacity-0\", \"-translate-y-3\"],\n      },\n    ],\n    defaultVariants: {\n      animationState: \"entering\",\n      enterDirection: \"up\",\n      position: \"bottom-center\",\n      twoLine: false,\n    },\n  }\n);\n\nexport type SnackbarContainerVariants = VariantProps<typeof snackbarContainerVariants>;\n\n// ─── Content column ───────────────────────────────────────────────────────────\n\n/**\n * Inner content column (message + optional supporting text).\n *\n * `py-3` (12dp) provides vertical breathing room:\n *   Single-line: 12px + 20px text + 12px = 44px, centered in 48dp by parent\n *   Two-line:    12px + 44px content + 12px = 68dp = exactly min-h-[4.25rem]\n */\nexport const snackbarContentVariants = cva([\n  \"flex\",\n  \"flex-col\",\n  \"flex-1\",\n  \"min-w-0\",\n  \"py-3\",\n  \"pr-2\",\n]);\n\n// ─── Message ─────────────────────────────────────────────────────────────────\n\n/**\n * Primary message text slot.\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 slot (two-line configuration).\n * MD3: body-medium, full inverse-on-surface color (no opacity reduction).\n */\nexport const snackbarSupportingTextVariants = cva([\n  \"text-body-medium\",\n  \"text-inverse-on-surface\",\n  \"mt-1\",\n]);\n\n// ─── Initial hidden state ─────────────────────────────────────────────────────\n\n/**\n * Classes applied before the enter animation begins (component just mounted).\n * Transparent — the slide-in entry starts from this state.\n * The translate offset is applied via `snackbarAnimationVariants` entering state.\n */\nexport const snackbarInitialVariants = cva([\"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\n// ─── ACTION BUTTON — dedicated slot CVAs ─────────────────────────────────────\n//\n// Replaces the reused shared `Button` component whose state-layer color\n// (`bg-primary`) is wrong on an inverse-surface container. The dedicated slot\n// uses `bg-inverse-primary` for both label and state-layer per MD3 spec.\n//\n// Group scope: group/snackbar-action\n\n/**\n * Action button root.\n *\n * MD3: text button style on inverse-surface.\n * - Container: 36dp height (h-9), 12dp horizontal padding (px-3)\n * - Shape: full rounded (rounded-full)\n * - Color: inverse-primary label\n * - No overflow-hidden on root so focus-ring span (inset-[-3px]) is not clipped.\n *   State-layer has its own overflow-hidden to clip ripple children.\n */\nexport const snackbarActionVariants = cva([\n  // Layout\n  \"relative inline-flex items-center justify-center shrink-0\",\n  \"h-9 px-3\",\n  \"rounded-full cursor-pointer select-none\",\n\n  // Typography (MD3 text button: label-large)\n  \"text-label-large\",\n  \"text-inverse-primary\",\n\n  // Effects transition (color)\n  \"transition-colors duration-spring-standard-fast-effects ease-spring-standard-fast-effects\",\n\n  // Disabled\n  \"data-[disabled]:cursor-not-allowed data-[disabled]:pointer-events-none\",\n  \"data-[disabled]:text-on-surface/38\",\n]);\n\n/**\n * Action button state layer.\n * MD3: state-layer color = inverse-primary (matches the label color role).\n * Opacities: hover 8% | focus-visible 10% | pressed 10% (doubled wins over hover).\n */\nexport const snackbarActionStateLayerVariants = cva([\n  \"absolute inset-0 rounded-[inherit] overflow-hidden pointer-events-none opacity-0\",\n  \"bg-inverse-primary\",\n  \"transition-opacity duration-spring-standard-fast-effects ease-spring-standard-fast-effects\",\n  // Hover: 8%\n  \"group-data-[hovered]/snackbar-action:opacity-8\",\n  // Focus: 10%\n  \"group-data-[focus-visible]/snackbar-action:opacity-10\",\n  // Pressed: 10%, doubled selector wins over hover\n  \"group-data-[pressed]/snackbar-action:group-data-[pressed]/snackbar-action:opacity-10\",\n  // No state layer when disabled\n  \"group-data-[disabled]/snackbar-action:hidden\",\n]);\n\n/**\n * Action button focus ring.\n * Extends 3px outside the button boundary (inset-[-3px]).\n * Requires NO overflow-hidden on the root button.\n */\nexport const snackbarActionFocusRingVariants = cva([\n  \"pointer-events-none absolute inset-[-3px] rounded-full\",\n  \"outline outline-2 outline-offset-0 outline-inverse-primary\",\n  \"transition-opacity duration-spring-standard-fast-effects ease-spring-standard-fast-effects\",\n  \"opacity-0\",\n  \"group-data-[focus-visible]/snackbar-action:opacity-100\",\n]);\n\n// ─── CLOSE BUTTON — dedicated slot CVAs ──────────────────────────────────────\n//\n// Replaces the reused shared `IconButton` which was `size=\"medium\"` (56dp),\n// overflowing the 48dp snackbar. The dedicated slot is 32dp (size-8) and uses\n// `bg-inverse-on-surface` for the state-layer per MD3 spec.\n//\n// Group scope: group/snackbar-close\n\n/**\n * Close button root.\n *\n * MD3: standard icon button style on inverse-surface.\n * - Container: 32dp (size-8) — fits within 48dp snackbar with 8dp margin each side\n * - Shape: rounded-full\n * - Color: inverse-on-surface icon\n * - No overflow-hidden on root so focus-ring span (inset-[-3px]) is not clipped.\n */\nexport const snackbarCloseVariants = cva([\n  // Layout\n  \"relative inline-flex items-center justify-center shrink-0\",\n  \"size-8\",\n  \"rounded-full cursor-pointer select-none\",\n\n  // Color\n  \"text-inverse-on-surface\",\n\n  // Effects transition (color)\n  \"transition-colors duration-spring-standard-fast-effects ease-spring-standard-fast-effects\",\n\n  // Disabled\n  \"data-[disabled]:cursor-not-allowed data-[disabled]:pointer-events-none\",\n  \"data-[disabled]:text-on-surface/38\",\n]);\n\n/**\n * Close button state layer.\n * MD3: state-layer color = inverse-on-surface (matches the icon color role).\n * Opacities: hover 8% | focus-visible 10% | pressed 10% (doubled wins over hover).\n */\nexport const snackbarCloseStateLayerVariants = cva([\n  \"absolute inset-0 rounded-[inherit] overflow-hidden pointer-events-none opacity-0\",\n  \"bg-inverse-on-surface\",\n  \"transition-opacity duration-spring-standard-fast-effects ease-spring-standard-fast-effects\",\n  // Hover: 8%\n  \"group-data-[hovered]/snackbar-close:opacity-8\",\n  // Focus: 10%\n  \"group-data-[focus-visible]/snackbar-close:opacity-10\",\n  // Pressed: 10%, doubled selector wins over hover\n  \"group-data-[pressed]/snackbar-close:group-data-[pressed]/snackbar-close:opacity-10\",\n  // No state layer when disabled\n  \"group-data-[disabled]/snackbar-close:hidden\",\n]);\n\n/**\n * Close button focus ring.\n * Extends 3px outside the button boundary (inset-[-3px]).\n * Requires NO overflow-hidden on the root button.\n */\nexport const snackbarCloseFocusRingVariants = cva([\n  \"pointer-events-none absolute inset-[-3px] rounded-full\",\n  \"outline outline-2 outline-offset-0 outline-inverse-on-surface\",\n  \"transition-opacity duration-spring-standard-fast-effects ease-spring-standard-fast-effects\",\n  \"opacity-0\",\n  \"group-data-[focus-visible]/snackbar-close:opacity-100\",\n]);\n\n/**\n * Close button icon wrapper.\n * MD3: 24dp icon inside a 32dp touch target.\n */\nexport const snackbarCloseIconVariants = cva([\n  \"relative z-10 inline-flex shrink-0 items-center justify-center\",\n  \"size-6\",\n]);\n\n// ─── Exported types ───────────────────────────────────────────────────────────\n\nexport type SnackbarActionVariants = VariantProps<typeof snackbarActionVariants>;\nexport type SnackbarActionStateLayerVariants = VariantProps<\n  typeof snackbarActionStateLayerVariants\n>;\nexport type SnackbarActionFocusRingVariants = VariantProps<typeof snackbarActionFocusRingVariants>;\nexport type SnackbarCloseVariants = VariantProps<typeof snackbarCloseVariants>;\nexport type SnackbarCloseStateLayerVariants = VariantProps<typeof snackbarCloseStateLayerVariants>;\nexport type SnackbarCloseFocusRingVariants = VariantProps<typeof snackbarCloseFocusRingVariants>;\nexport type SnackbarCloseIconVariants = VariantProps<typeof snackbarCloseIconVariants>;\n","\"use client\";\n\nimport { forwardRef, useRef } from \"react\";\nimport { useButton, useHover, useFocusRing, mergeProps } from \"react-aria\";\nimport { cn } from \"../../utils/cn\";\nimport { getInteractionDataAttributes } from \"../../utils/interactionStates\";\nimport { useRipple } from \"../../hooks/useRipple\";\nimport { useReducedMotion } from \"../../hooks/useReducedMotion\";\nimport { SnackbarHeadless } from \"./SnackbarHeadless\";\nimport {\n  snackbarAnimationVariants,\n  snackbarBaseVariants,\n  snackbarContentVariants,\n  snackbarMessageVariants,\n  snackbarSupportingTextVariants,\n  snackbarActionVariants,\n  snackbarActionStateLayerVariants,\n  snackbarActionFocusRingVariants,\n  snackbarCloseVariants,\n  snackbarCloseStateLayerVariants,\n  snackbarCloseFocusRingVariants,\n  snackbarCloseIconVariants,\n  getEnterDirection,\n} from \"./Snackbar.variants\";\nimport type { SnackbarAnimationState } from \"./SnackbarHeadless\";\nimport type { SnackbarPosition, SnackbarProps } from \"./Snackbar.types\";\n\n// ─── Close icon ───────────────────────────────────────────────────────────────\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// ─── SnackbarActionButton (internal) ─────────────────────────────────────────\n\n/**\n * Internal action button for the MD3 Snackbar.\n *\n * Implements the slot-based \"Variants vs States\" architecture:\n * - React Aria `useButton` + `useHover` + `useFocusRing` for behavior\n * - `getInteractionDataAttributes` → `group-data-[x]/snackbar-action` selectors\n * - State-layer `bg-inverse-primary` — MD3-correct for the inverse-surface container\n * - Focus ring `outline-inverse-primary` — visible on inverse-surface\n *\n * NOT exported — use the styled `Snackbar` component or `SnackbarHeadless` with\n * a custom render function for custom action implementations.\n */\ninterface SnackbarActionButtonProps {\n  /** Visible label text. Also used as the accessible button name. */\n  label: string;\n  /** Callback fired when the action is pressed. */\n  onAction: () => void;\n}\n\nfunction SnackbarActionButton({ label, onAction }: SnackbarActionButtonProps): JSX.Element {\n  const ref = useRef<HTMLButtonElement>(null);\n\n  const { buttonProps, isPressed } = useButton({ onPress: onAction }, ref);\n  const { isHovered, hoverProps } = useHover({});\n  const { isFocusVisible, focusProps } = useFocusRing();\n  const { onMouseDown, ripples } = useRipple();\n\n  return (\n    <button\n      type=\"button\"\n      {...mergeProps(buttonProps, hoverProps, focusProps, { onMouseDown })}\n      ref={ref}\n      className={cn(snackbarActionVariants(), \"group/snackbar-action\")}\n      {...getInteractionDataAttributes({ isHovered, isFocusVisible, isPressed })}\n    >\n      {/* Ripple feedback */}\n      {ripples}\n\n      {/* State layer — bg-inverse-primary per MD3 Snackbar spec */}\n      <span className={snackbarActionStateLayerVariants()} aria-hidden=\"true\" />\n\n      {/* Focus ring — extends 3px outside; root has no overflow-hidden */}\n      <span className={snackbarActionFocusRingVariants()} aria-hidden=\"true\" />\n\n      {/* Label text — z-10 keeps it above state layer and ripple */}\n      <span className=\"relative z-10\">{label}</span>\n    </button>\n  );\n}\n\n// ─── SnackbarCloseButton (internal) ──────────────────────────────────────────\n\n/**\n * Internal close icon button for the MD3 Snackbar.\n *\n * Implements the slot-based \"Variants vs States\" architecture:\n * - React Aria `useButton` + `useHover` + `useFocusRing` for behavior\n * - `getInteractionDataAttributes` → `group-data-[x]/snackbar-close` selectors\n * - Container: 32dp (size-8) — fits within the 48dp snackbar with 8dp margin\n * - State-layer `bg-inverse-on-surface` — MD3-correct for the inverse-surface container\n *\n * NOT exported — use the styled `Snackbar` component's `showClose` prop.\n */\ninterface SnackbarCloseButtonProps {\n  /** Callback fired when the close button is pressed. */\n  onPress: () => void;\n}\n\nfunction SnackbarCloseButton({ onPress }: SnackbarCloseButtonProps): JSX.Element {\n  const ref = useRef<HTMLButtonElement>(null);\n\n  const { buttonProps, isPressed } = useButton({ onPress, \"aria-label\": \"Close\" }, ref);\n  const { isHovered, hoverProps } = useHover({});\n  const { isFocusVisible, focusProps } = useFocusRing();\n  const { onMouseDown, ripples } = useRipple();\n\n  return (\n    <button\n      type=\"button\"\n      {...mergeProps(buttonProps, hoverProps, focusProps, { onMouseDown })}\n      ref={ref}\n      className={cn(snackbarCloseVariants(), \"group/snackbar-close\")}\n      {...getInteractionDataAttributes({ isHovered, isFocusVisible, isPressed })}\n    >\n      {/* Ripple feedback */}\n      {ripples}\n\n      {/* State layer — bg-inverse-on-surface per MD3 Snackbar spec */}\n      <span className={snackbarCloseStateLayerVariants()} aria-hidden=\"true\" />\n\n      {/* Focus ring — extends 3px outside; root has no overflow-hidden */}\n      <span className={snackbarCloseFocusRingVariants()} aria-hidden=\"true\" />\n\n      {/* Icon — 24dp per MD3, z-10 keeps it above state layer */}\n      <span className={snackbarCloseIconVariants()} aria-hidden=\"true\">\n        <CloseIcon />\n      </span>\n    </button>\n  );\n}\n\n// ─── Snackbar (Layer 3: MD3 Styled) ──────────────────────────────────────────\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 with `inverse-primary` 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 * **Motion**: Position-aware slide + fade using spring-standard effects tokens.\n * Automatically respects `prefers-reduced-motion` (fade-only when reduced motion\n * is preferred — no translate offset).\n *\n * **State layers**: Dedicated slot components (`SnackbarActionButton`,\n * `SnackbarCloseButton`) replace the shared `Button`/`IconButton` components.\n * This ensures the state-layer colors are MD3-correct on an `inverse-surface`:\n * - Action button state layer: `bg-inverse-primary`\n * - Close button state layer: `bg-inverse-on-surface`\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  const reducedMotion = useReducedMotion();\n\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        // Reduced motion: fade-only — no translate offset\n        if (reducedMotion) {\n          return state === \"visible\"\n            ? \"opacity-100 duration-spring-standard-default-effects ease-spring-standard-default-effects\"\n            : \"opacity-0\";\n        }\n        return snackbarAnimationVariants({\n          animationState: state,\n          enterDirection: getEnterDirection(pos),\n        });\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: inverse-primary label + state layer */}\n          {action && <SnackbarActionButton label={action.label} onAction={action.onAction} />}\n\n          {/* Close icon button — MD3: inverse-on-surface icon + state layer, 32dp */}\n          {showClose && <SnackbarCloseButton onPress={triggerClose} />}\n        </>\n      )}\n    </SnackbarHeadless>\n  );\n});\n\nSnackbar.displayName = \"Snackbar\";\n","\"use client\";\n\nimport {\n  createContext,\n  useCallback,\n  useContext,\n  useId,\n  useMemo,\n  useRef,\n  useState,\n  type JSX,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { Snackbar } from \"./Snackbar\";\nimport { snackbarStackContainerVariants } from \"./Snackbar.variants\";\nimport type {\n  SnackbarContextValue,\n  SnackbarItem,\n  SnackbarPosition,\n  SnackbarProps,\n  SnackbarProviderProps,\n} from \"./Snackbar.types\";\n\n// ─── Context ─────────────────────────────────────────────────────────────────\n\n/**\n * React context for the Snackbar queue.\n * Consumed via the `useSnackbar` hook.\n */\nexport const SnackbarContext = createContext<SnackbarContextValue | null>(null);\n\n// ─── Hook ────────────────────────────────────────────────────────────────────\n\n/**\n * `useSnackbar` — imperative API for triggering Snackbars.\n *\n * Must be called inside a component that is a descendant of `SnackbarProvider`.\n * Throws a descriptive error in development if used outside the provider.\n *\n * @example\n * ```tsx\n * const { showSnackbar } = useSnackbar();\n *\n * // Single-line\n * showSnackbar({ message: \"File deleted\" });\n *\n * // With action\n * showSnackbar({\n *   message: \"File deleted\",\n *   action: { label: \"Undo\", onAction: () => handleUndo() },\n * });\n *\n * // Error severity (assertive announcement)\n * showSnackbar({ message: \"Upload failed\", severity: \"error\" });\n * ```\n */\nexport function useSnackbar(): SnackbarContextValue {\n  const ctx = useContext(SnackbarContext);\n  if (!ctx) {\n    throw new Error(\n      \"[Snackbar] useSnackbar must be used inside <SnackbarProvider>. \" +\n        \"Wrap your application (or Storybook decorator) with <SnackbarProvider>.\"\n    );\n  }\n  return ctx;\n}\n\n// ─── Provider ────────────────────────────────────────────────────────────────\n\n/**\n * `SnackbarProvider` — context provider, queue manager, and portal host.\n *\n * Wrap your application (or Storybook preview) with this component to enable\n * the Snackbar stack and portal rendering.\n *\n * - Multiple `showSnackbar` calls are displayed simultaneously in a vertical\n *   stack, grouped by their `position` prop.\n * - Each position group is rendered in its own fixed container via `createPortal`\n *   into `document.body`.\n * - Bottom positions stack upward (newest at bottom); top positions stack\n *   downward (newest at top).\n * - The `maxVisible` prop caps how many snackbars can be visible at once per\n *   position group. Snackbars beyond the cap are queued and shown as existing\n *   ones are dismissed.\n *\n * @example\n * ```tsx\n * // Application root\n * <SnackbarProvider>\n *   <App />\n * </SnackbarProvider>\n *\n * // With custom cap (default is 5)\n * <SnackbarProvider maxVisible={3}>\n *   <App />\n * </SnackbarProvider>\n *\n * // Storybook preview.tsx decorator\n * export const decorators = [\n *   (Story) => (\n *     <SnackbarProvider>\n *       <Story />\n *     </SnackbarProvider>\n *   ),\n * ];\n * ```\n */\nexport function SnackbarProvider({ children, maxVisible = 5 }: SnackbarProviderProps): JSX.Element {\n  const [queue, setQueue] = useState<SnackbarItem[]>([]);\n  const counterRef = useRef<number>(0);\n  const baseId = useId();\n\n  /**\n   * Enqueue a new Snackbar. Returns the assigned id.\n   * The snackbar is immediately visible if the position group has fewer than\n   * `maxVisible` items currently displayed.\n   */\n  const showSnackbar = useCallback(\n    (options: SnackbarProps): string => {\n      const id = `${baseId}-snackbar-${++counterRef.current}`;\n      setQueue((prev) => [...prev, { ...options, id }]);\n      return id;\n    },\n    [baseId]\n  );\n\n  /**\n   * Imperatively dismiss the oldest snackbar across all position groups.\n   * The snackbar's own exit animation plays before it is removed.\n   */\n  const closeSnackbar = useCallback(() => {\n    setQueue((prev) => {\n      if (prev.length === 0) return prev;\n      return prev.slice(1);\n    });\n  }, []);\n\n  /**\n   * Removes a specific snackbar by id after its exit animation completes.\n   */\n  const removeById = useCallback((id: string) => {\n    setQueue((prev) => prev.filter((item) => item.id !== id));\n  }, []);\n\n  const contextValue: SnackbarContextValue = { showSnackbar, closeSnackbar };\n\n  // Group visible queue items by position, respecting maxVisible per group.\n  const positionGroups = useMemo(() => {\n    const groups = new Map<SnackbarPosition, SnackbarItem[]>();\n    const countByPosition = new Map<SnackbarPosition, number>();\n\n    for (const item of queue) {\n      const pos: SnackbarPosition = item.position ?? \"bottom-center\";\n      const count = countByPosition.get(pos) ?? 0;\n      if (count < maxVisible) {\n        const existing = groups.get(pos) ?? [];\n        groups.set(pos, [...existing, item]);\n        countByPosition.set(pos, count + 1);\n      }\n    }\n\n    return groups;\n  }, [queue, maxVisible]);\n\n  return (\n    <SnackbarContext.Provider value={contextValue}>\n      {children}\n      {typeof document !== \"undefined\" &&\n        createPortal(\n          <>\n            {Array.from(positionGroups.entries()).map(([position, items]) => (\n              <div key={position} className={snackbarStackContainerVariants({ position })}>\n                {items.map((item) => (\n                  <Snackbar\n                    key={item.id}\n                    message={item.message}\n                    {...(item.supportingText !== undefined && {\n                      supportingText: item.supportingText,\n                    })}\n                    {...(item.action !== undefined && { action: item.action })}\n                    {...(item.showClose !== undefined && { showClose: item.showClose })}\n                    {...(item.duration !== undefined && { duration: item.duration })}\n                    {...(item.severity !== undefined && { severity: item.severity })}\n                    {...(item.position !== undefined && { position: item.position })}\n                    {...(item.className !== undefined && { className: item.className })}\n                    onClose={() => {\n                      item.onClose?.();\n                      removeById(item.id);\n                    }}\n                  />\n                ))}\n              </div>\n            ))}\n          </>,\n          document.body\n        )}\n    </SnackbarContext.Provider>\n  );\n}\n","\"use client\";\n\nimport { forwardRef, useRef } from \"react\";\nimport { useButton, useToggleButton } from \"react-aria\";\nimport { mergeProps } from \"@react-aria/utils\";\nimport { useToggleState } from \"react-stately\";\nimport type { ChipHeadlessProps } from \"./Chip.types\";\n\n// ---------------------------------------------------------------------------\n// Internal sub-implementations\n//\n// Each chip type has distinct React Aria hook requirements. Hooks cannot be\n// called conditionally, so we use separate forwardRef components per type and\n// select the correct one in the public ChipHeadless switcher below.\n//\n// The styled layer (Chip.tsx) injects interaction data attributes and event\n// handlers via `bodyPassthrough` (and `removePassthrough` for input chips).\n// These are spread onto the DOM element after React Aria's props so they do\n// not get stripped by the React Aria hooks' internal prop filtering.\n// ---------------------------------------------------------------------------\n\n/**\n * Strip React Aria-specific props that must not reach the DOM.\n * Returns only HTML-safe passthrough properties.\n */\nfunction stripAriaProps(handlers: Record<string, unknown>): Record<string, unknown> {\n  const {\n    isDisabled: _isDisabled,\n    onPress: _onPress,\n    onPressStart: _onPressStart,\n    onPressEnd: _onPressEnd,\n    onPressChange: _onPressChange,\n    onPressUp: _onPressUp,\n    ...html\n  } = handlers;\n  return html;\n}\n\n/**\n * Build press lifecycle callbacks for useButton/useToggleButton.\n * Uses conditional spreading to satisfy exactOptionalPropertyTypes: true —\n * React Aria's onPressStart/onPressEnd must be a function, not undefined.\n */\nfunction buildPressCallbacks(\n  onPressStart?: () => void,\n  onPressEnd?: () => void\n): {\n  onPressStart?: () => void;\n  onPressEnd?: () => void;\n} {\n  return {\n    ...(onPressStart !== undefined && { onPressStart }),\n    ...(onPressEnd !== undefined && { onPressEnd }),\n  };\n}\n\n/**\n * Assist chip implementation — uses `useButton` (Enter/Space → onPress).\n */\nconst AssistChipImpl = forwardRef<HTMLButtonElement, ChipHeadlessProps>(\n  (\n    { label, onPress, isDisabled, className, onMouseDown, children, bodyPassthrough },\n    forwardedRef\n  ) => {\n    const internalRef = useRef<HTMLButtonElement>(null);\n    const ref = (forwardedRef ?? internalRef) as React.RefObject<HTMLButtonElement>;\n\n    const { buttonProps } = useButton(\n      {\n        ...(onPress !== undefined && { onPress }),\n        ...(isDisabled !== undefined && { isDisabled }),\n        ...buildPressCallbacks(bodyPassthrough?.onPressStart, bodyPassthrough?.onPressEnd),\n      },\n      ref\n    );\n\n    const htmlPassthrough = stripAriaProps(bodyPassthrough?.eventHandlers ?? {});\n\n    const mergedProps = mergeProps(\n      buttonProps,\n      { onMouseDown },\n      bodyPassthrough?.dataAttributes ?? {},\n      htmlPassthrough\n    );\n\n    return (\n      <button {...mergedProps} type=\"button\" ref={ref} className={className}>\n        {children ?? label}\n      </button>\n    );\n  }\n);\nAssistChipImpl.displayName = \"AssistChipImpl\";\n\n/**\n * Filter chip implementation — uses `useToggleButton` + `useToggleState`.\n * Provides `aria-pressed` for toggle semantics.\n */\nconst FilterChipImpl = forwardRef<HTMLButtonElement, ChipHeadlessProps>(\n  (\n    {\n      label,\n      selected,\n      defaultSelected,\n      onSelectionChange,\n      isDisabled,\n      className,\n      onMouseDown,\n      children,\n      bodyPassthrough,\n    },\n    forwardedRef\n  ) => {\n    const internalRef = useRef<HTMLButtonElement>(null);\n    const ref = (forwardedRef ?? internalRef) as React.RefObject<HTMLButtonElement>;\n\n    const toggleProps = {\n      ...(selected !== undefined && { isSelected: selected }),\n      ...(defaultSelected !== undefined && { defaultSelected }),\n      ...(onSelectionChange !== undefined && { onChange: onSelectionChange }),\n      ...(isDisabled !== undefined && { isDisabled }),\n      ...buildPressCallbacks(bodyPassthrough?.onPressStart, bodyPassthrough?.onPressEnd),\n    };\n\n    const state = useToggleState(toggleProps);\n    const { buttonProps } = useToggleButton(toggleProps, state, ref);\n\n    const htmlPassthrough = stripAriaProps(bodyPassthrough?.eventHandlers ?? {});\n\n    const mergedProps = mergeProps(\n      buttonProps,\n      { onMouseDown },\n      bodyPassthrough?.dataAttributes ?? {},\n      htmlPassthrough\n    );\n\n    return (\n      <button {...mergedProps} type=\"button\" ref={ref} className={className}>\n        {children ?? label}\n      </button>\n    );\n  }\n);\nFilterChipImpl.displayName = \"FilterChipImpl\";\n\n/**\n * Input chip implementation — chip body uses `useButton` with Backspace/Delete\n * handling for keyboard removal. The remove button is a separate `useButton`\n * instance inside the same layout wrapper.\n *\n * The forwarded ref attaches to the chip body button (the primary interactive\n * element), not the outer `<span>` wrapper.\n */\nconst InputChipImpl = forwardRef<HTMLButtonElement, ChipHeadlessProps>(\n  (\n    {\n      label,\n      onRemove,\n      isDisabled,\n      className,\n      onMouseDown,\n      removeIcon,\n      removeButtonClassName,\n      children,\n      bodyPassthrough,\n      removePassthrough,\n    },\n    forwardedRef\n  ) => {\n    const chipRef = useRef<HTMLButtonElement>(null);\n    const ref = (forwardedRef ?? chipRef) as React.RefObject<HTMLButtonElement>;\n    const removeRef = useRef<HTMLButtonElement>(null);\n\n    const { buttonProps: chipButtonProps } = useButton(\n      {\n        \"aria-label\": label,\n        ...(isDisabled !== undefined && { isDisabled }),\n        ...buildPressCallbacks(bodyPassthrough?.onPressStart, bodyPassthrough?.onPressEnd),\n      },\n      ref\n    );\n\n    const { buttonProps: removeButtonProps } = useButton(\n      {\n        \"aria-label\": `Remove ${label}`,\n        onPress: () => onRemove?.(),\n        ...(isDisabled !== undefined && { isDisabled }),\n        ...buildPressCallbacks(removePassthrough?.onPressStart, removePassthrough?.onPressEnd),\n      },\n      removeRef\n    );\n\n    const handleKeyDown = (e: React.KeyboardEvent<HTMLButtonElement>): void => {\n      if (e.key === \"Backspace\" || e.key === \"Delete\") {\n        e.preventDefault();\n        onRemove?.();\n      }\n    };\n\n    const htmlBodyPassthrough = stripAriaProps(bodyPassthrough?.eventHandlers ?? {});\n    const htmlRemovePassthrough = stripAriaProps(removePassthrough?.eventHandlers ?? {});\n\n    const mergedChipProps = mergeProps(\n      chipButtonProps,\n      { onKeyDown: handleKeyDown, onMouseDown },\n      bodyPassthrough?.dataAttributes ?? {},\n      htmlBodyPassthrough\n    );\n\n    const mergedRemoveProps = mergeProps(\n      removeButtonProps,\n      removePassthrough?.dataAttributes ?? {},\n      htmlRemovePassthrough\n    );\n\n    return (\n      <span className={className}>\n        <button {...mergedChipProps} type=\"button\" ref={ref}>\n          {children ?? label}\n        </button>\n        <button\n          {...mergedRemoveProps}\n          type=\"button\"\n          ref={removeRef}\n          className={removeButtonClassName}\n        >\n          {removeIcon}\n        </button>\n      </span>\n    );\n  }\n);\nInputChipImpl.displayName = \"InputChipImpl\";\n\n/**\n * Suggestion chip implementation — uses `useButton` (identical to Assist).\n */\nconst SuggestionChipImpl = forwardRef<HTMLButtonElement, ChipHeadlessProps>(\n  (\n    { label, onPress, isDisabled, className, onMouseDown, children, bodyPassthrough },\n    forwardedRef\n  ) => {\n    const internalRef = useRef<HTMLButtonElement>(null);\n    const ref = (forwardedRef ?? internalRef) as React.RefObject<HTMLButtonElement>;\n\n    const { buttonProps } = useButton(\n      {\n        ...(onPress !== undefined && { onPress }),\n        ...(isDisabled !== undefined && { isDisabled }),\n        ...buildPressCallbacks(bodyPassthrough?.onPressStart, bodyPassthrough?.onPressEnd),\n      },\n      ref\n    );\n\n    const htmlPassthrough = stripAriaProps(bodyPassthrough?.eventHandlers ?? {});\n\n    const mergedProps = mergeProps(\n      buttonProps,\n      { onMouseDown },\n      bodyPassthrough?.dataAttributes ?? {},\n      htmlPassthrough\n    );\n\n    return (\n      <button {...mergedProps} type=\"button\" ref={ref} className={className}>\n        {children ?? label}\n      </button>\n    );\n  }\n);\nSuggestionChipImpl.displayName = \"SuggestionChipImpl\";\n\n// ---------------------------------------------------------------------------\n// Public component\n// ---------------------------------------------------------------------------\n\n/**\n * Headless Chip Component (Layer 2)\n *\n * Unstyled chip primitive covering all four MD3 chip types. Delegates to the\n * correct React Aria hook per `type` — bring your own styles.\n *\n * The styled layer (Chip.tsx) passes `bodyPassthrough` to inject data-* interaction\n * attributes and merged hover/focus handlers onto the body button, enabling the\n * group-data-[x]/chip slot selectors defined in Chip.variants.ts.\n *\n * | type         | Hook                                    | Key behaviour                    |\n * |------------- |-----------------------------------------|----------------------------------|\n * | `assist`     | `useButton`                             | Enter/Space → `onPress`          |\n * | `filter`     | `useToggleButton` + `useToggleState`    | Toggle `aria-pressed`            |\n * | `input`      | `useButton` + remove `useButton`        | Backspace/Delete → `onRemove`    |\n * | `suggestion` | `useButton`                             | Enter/Space → `onPress`          |\n *\n * @example\n * ```tsx\n * // Assist\n * <ChipHeadless type=\"assist\" label=\"Set alarm\" onPress={handlePress} />\n *\n * // Filter (uncontrolled)\n * <ChipHeadless type=\"filter\" label=\"Vegetarian\" onSelectionChange={console.log} />\n *\n * // Input\n * <ChipHeadless type=\"input\" label=\"React\" onRemove={() => remove('React')} />\n *\n * // Suggestion\n * <ChipHeadless type=\"suggestion\" label=\"See photos\" onPress={handlePress} />\n * ```\n */\nexport const ChipHeadless = forwardRef<HTMLButtonElement, ChipHeadlessProps>((props, ref) => {\n  switch (props.type) {\n    case \"filter\":\n      return <FilterChipImpl {...props} ref={ref} />;\n    case \"input\":\n      return <InputChipImpl {...props} ref={ref} />;\n    case \"suggestion\":\n      return <SuggestionChipImpl {...props} ref={ref} />;\n    default:\n      return <AssistChipImpl {...props} ref={ref} />;\n  }\n});\n\nChipHeadless.displayName = \"ChipHeadless\";\n","import { cva, type VariantProps } from \"class-variance-authority\";\n\n/**\n * Material Design 3 Chip Variants (Slot-based \"Variants vs States\" architecture)\n *\n * Architecture: Variants vs States\n * - CVA holds design-time structure only (chipType × surface).\n * - All interaction/selection states are driven by data-* attributes on the root\n *   via group-data-[x]/chip Tailwind selectors in each slot's base classes.\n * - Content flags (data-with-leading, data-with-trailing) are set explicitly by\n *   the component and consumed by the root slot for padding adjustments.\n *\n * Slot responsibilities:\n *   chipVariants             — root button/span; shape, color, elevation, padding\n *   chipStateLayerVariants   — hover/focus/press opacity overlay (absolute inset)\n *   chipFocusRingVariants    — keyboard focus outline, outside overflow-hidden\n *   chipLeadingIconVariants  — leading icon wrapper; color per type + selected/disabled\n *   chipTrailingIconVariants — trailing icon wrapper; assist/suggestion only\n *   chipCheckmarkVariants    — filter chip checkmark container (width spring)\n *   chipLabelVariants        — label text slot\n *   chipRemoveButtonVariants — input chip remove button wrapper\n *   chipRemoveStateLayerVariants — state layer inside remove button circle\n *\n * MD3 Spec (Expressive):\n *   Shape:   corner-small (8dp) → rounded-sm\n *   Height:  32dp → h-8\n *   Padding: 16dp base; 8dp leading side with icon\n *   Gap:     8dp → gap-2\n *   Icon:    18px × 18px\n *   State-layer opacities: hover 8% | focus 10% | pressed 10%\n *   Disabled: container transparent, border 12% opacity, content 38% opacity\n *\n * Per-type color tokens (MD3 strict):\n *   assist:     bg=transparent border=outline      label=on-surface     leadingIcon=primary   stateLayer=on-surface\n *   filter:     bg=transparent border=outline      label=on-surface-variant                   stateLayer=on-surface-variant\n *   filter sel: bg=secondary-container border=none label=on-secondary-container               stateLayer=on-secondary-container\n *   input:      bg=transparent border=outline-variant label=on-surface-variant                stateLayer=on-surface-variant\n *   suggestion: bg=transparent border=outline      label=on-surface-variant                   stateLayer=on-surface-variant\n *\n * Elevation per state (elevated surface):\n *   base=1 → hover=2 → focus/pressed=1 (doubled pressed selector wins over hover)\n */\n\n// ─── ROOT ─────────────────────────────────────────────────────────────────────\n\n/**\n * Root chip element.\n *\n * IMPORTANT — overflow is intentionally NOT on the root.\n * Clipping is delegated to the state-layer and ripple containers via\n * `overflow-hidden rounded-[inherit]` so the focus ring span (inset-[-3px])\n * can extend outside the chip boundary and remain fully visible.\n *\n * Padding is driven by content flags:\n *   base px-4 (16dp)\n *   data-[with-leading]: pl-2 pr-4  (8dp leading, 16dp trailing)\n *   data-[with-trailing]: pl-4 pr-2\n *   data-[with-leading][with-trailing]: pl-2 pr-2\n * These are self-targeting data-[x]: selectors (no group scope needed).\n */\nexport const chipVariants = cva(\n  [\n    // Layout + shape\n    \"relative inline-flex items-center justify-center\",\n    \"h-8 rounded-sm cursor-pointer select-none\",\n    \"text-label-large gap-2\",\n    // Base padding (no icons)\n    \"px-4\",\n    // Content-flag padding overrides (self-targeting)\n    \"data-[with-leading]:pl-2 data-[with-leading]:pr-4\",\n    \"data-[with-trailing]:pr-2\",\n    // Effects transition (color/bg/shadow/border)\n    \"transition-[background-color,border-color,box-shadow,color]\",\n    \"duration-spring-standard-fast-effects ease-spring-standard-fast-effects\",\n    // Disabled self-targeting\n    \"data-[disabled]:cursor-not-allowed data-[disabled]:pointer-events-none\",\n    \"data-[disabled]:text-on-surface/38 data-[disabled]:border-on-surface/12\",\n    \"data-[disabled]:bg-transparent data-[disabled]:shadow-none\",\n  ],\n  {\n    variants: {\n      /**\n       * MD3 chip type — determines base color tokens.\n       */\n      chipType: {\n        /**\n         * Assist — transparent + outline border; label on-surface; leading icon primary.\n         * State layer color: on-surface.\n         */\n        assist: [\"bg-transparent border border-outline text-on-surface\"],\n\n        /**\n         * Filter — transparent + outline border; label on-surface-variant.\n         * Selected state via group-data selectors (no CVA variant key).\n         * State layer color: on-surface-variant → on-secondary-container when selected.\n         */\n        filter: [\n          \"bg-transparent border border-outline text-on-surface-variant\",\n          // Selected: secondary-container fill, no border, on-secondary-container label\n          \"group-data-[selected]/chip:bg-secondary-container\",\n          \"group-data-[selected]/chip:border-0\",\n          \"group-data-[selected]/chip:text-on-secondary-container\",\n          // Disabled + selected overrides (self-targeting, doubled to win over singly-chained selected)\n          \"data-[selected]:data-[disabled]:bg-on-surface/12\",\n          \"data-[selected]:data-[disabled]:border-0\",\n        ],\n\n        /**\n         * Input — transparent + outline-variant border; label/icons on-surface-variant.\n         * State layer color: on-surface-variant.\n         */\n        input: [\"bg-transparent border border-outline-variant text-on-surface-variant\"],\n\n        /**\n         * Suggestion — transparent + outline border; label on-surface-variant.\n         * State layer color: on-surface-variant.\n         */\n        suggestion: [\"bg-transparent border border-outline text-on-surface-variant\"],\n      },\n\n      /**\n       * Surface style — elevated adds shadow and surface-container-low background.\n       * All four chip types support elevated.\n       * Note: \"flat\" and the deprecated \"tonal\" both resolve to the same base style\n       * (transparent + border from chipType). The elevated compound variant overrides.\n       */\n      surface: {\n        flat: \"\",\n        elevated: \"\",\n        /** @deprecated Use `flat` instead. */\n        tonal: \"\",\n      },\n    },\n\n    compoundVariants: [\n      // ── Elevated surface (all chip types) ─────────────────────────────────\n      // Shared elevated base: surface-container-low fill, no border, level-1 elevation\n      {\n        surface: \"elevated\",\n        chipType: \"assist\",\n        className: [\n          \"bg-surface-container-low border-0 shadow-elevation-1\",\n          \"data-[hovered]:shadow-elevation-2\",\n          \"data-[focus-visible]:shadow-elevation-1\",\n          \"data-[pressed]:data-[pressed]:shadow-elevation-1\",\n        ],\n      },\n      {\n        surface: \"elevated\",\n        chipType: \"filter\",\n        className: [\n          \"bg-surface-container-low border-0 shadow-elevation-1\",\n          \"data-[hovered]:shadow-elevation-2\",\n          \"data-[focus-visible]:shadow-elevation-1\",\n          \"data-[pressed]:data-[pressed]:shadow-elevation-1\",\n          // Selected overrides bg; elevation stays\n          \"group-data-[selected]/chip:bg-secondary-container\",\n        ],\n      },\n      {\n        surface: \"elevated\",\n        chipType: \"input\",\n        className: [\n          \"bg-surface-container-low border-0 shadow-elevation-1\",\n          \"data-[hovered]:shadow-elevation-2\",\n          \"data-[focus-visible]:shadow-elevation-1\",\n          \"data-[pressed]:data-[pressed]:shadow-elevation-1\",\n        ],\n      },\n      {\n        surface: \"elevated\",\n        chipType: \"suggestion\",\n        className: [\n          \"bg-surface-container-low border-0 shadow-elevation-1\",\n          \"data-[hovered]:shadow-elevation-2\",\n          \"data-[focus-visible]:shadow-elevation-1\",\n          \"data-[pressed]:data-[pressed]:shadow-elevation-1\",\n        ],\n      },\n      // Deprecated tonal maps to flat (same as no override)\n      {\n        surface: \"tonal\",\n        chipType: \"assist\",\n        className: \"\",\n      },\n      {\n        surface: \"tonal\",\n        chipType: \"filter\",\n        className: \"\",\n      },\n      {\n        surface: \"tonal\",\n        chipType: \"input\",\n        className: \"\",\n      },\n      {\n        surface: \"tonal\",\n        chipType: \"suggestion\",\n        className: \"\",\n      },\n    ],\n\n    defaultVariants: {\n      chipType: \"assist\",\n      surface: \"flat\",\n    },\n  }\n);\n\n// ─── STATE LAYER ─────────────────────────────────────────────────────────────\n\n/**\n * State layer — absolute inset overlay that transitions opacity on interaction.\n *\n * overflow-hidden clips the ripple + state layer to the chip shape without\n * affecting the focus ring (which is a sibling outside, not a child inside).\n *\n * Color follows MD3 per type:\n *   assist    → bg-on-surface\n *   filter    → bg-on-surface-variant; selected → bg-on-secondary-container\n *   input     → bg-on-surface-variant\n *   suggestion → bg-on-surface-variant\n *\n * Opacities: 0 rest → 8% hover → 10% focus → 10% pressed (doubled wins)\n */\nexport const chipStateLayerVariants = cva(\n  [\n    \"absolute inset-0 rounded-[inherit] overflow-hidden pointer-events-none opacity-0\",\n    \"transition-opacity duration-spring-standard-fast-effects ease-spring-standard-fast-effects\",\n    // Hover: 8%\n    \"group-data-[hovered]/chip:opacity-8\",\n    // Focus: 10%\n    \"group-data-[focus-visible]/chip:opacity-10\",\n    // Pressed: 10%, doubled selector wins over hover\n    \"group-data-[pressed]/chip:group-data-[pressed]/chip:opacity-10\",\n    // No state layer when disabled\n    \"group-data-[disabled]/chip:hidden\",\n  ],\n  {\n    variants: {\n      chipType: {\n        assist: \"bg-on-surface\",\n        filter: [\n          \"bg-on-surface-variant\",\n          // Selected: switch to on-secondary-container color\n          \"group-data-[selected]/chip:bg-on-secondary-container\",\n        ],\n        input: \"bg-on-surface-variant\",\n        suggestion: \"bg-on-surface-variant\",\n      },\n    },\n    defaultVariants: { chipType: \"assist\" },\n  }\n);\n\n// ─── FOCUS RING ────────────────────────────────────────────────────────────────\n\n/**\n * Focus ring overlay.\n *\n * Rendered as an absolute `<span>` with `inset-[-3px]` so it extends 3px\n * outside the chip boundary. This requires that `overflow-hidden` is NOT\n * on the root — overflow clipping is moved to the state layer instead.\n *\n * Always present in the DOM (opacity-0 at rest) for smooth CSS transitions.\n */\nexport const chipFocusRingVariants = cva([\n  \"pointer-events-none absolute inset-[-3px] rounded-sm\",\n  \"outline outline-2 outline-offset-0 outline-secondary\",\n  \"transition-opacity duration-spring-standard-fast-effects ease-spring-standard-fast-effects\",\n  \"opacity-0\",\n  \"group-data-[focus-visible]/chip:opacity-100\",\n]);\n\n// ─── LEADING ICON ─────────────────────────────────────────────────────────────\n\n/**\n * Leading icon wrapper.\n *\n * MD3 per-type icon color:\n *   assist    → primary (unselected/selected)\n *   filter    → on-surface-variant; selected → on-secondary-container\n *   input     → on-surface-variant\n *   suggestion → on-surface-variant\n *\n * Disabled: on-surface/38 for all types.\n * `invisible` (not `hidden`) to keep layout stable if icon is conditionally rendered.\n */\nexport const chipLeadingIconVariants = cva(\n  [\n    \"relative z-10 inline-flex shrink-0 items-center justify-center size-[18px]\",\n    \"transition-colors duration-spring-standard-fast-effects ease-spring-standard-fast-effects\",\n    \"group-data-[disabled]/chip:text-on-surface/38\",\n  ],\n  {\n    variants: {\n      chipType: {\n        assist: \"text-primary\",\n        filter: [\n          \"text-on-surface-variant\",\n          \"group-data-[selected]/chip:text-on-secondary-container\",\n        ],\n        input: \"text-on-surface-variant\",\n        suggestion: \"text-on-surface-variant\",\n      },\n    },\n    defaultVariants: { chipType: \"assist\" },\n  }\n);\n\n// ─── TRAILING ICON ────────────────────────────────────────────────────────────\n\n/**\n * Trailing icon wrapper (Assist and Suggestion chips only).\n * Always on-surface-variant per MD3 spec.\n */\nexport const chipTrailingIconVariants = cva([\n  \"relative z-10 inline-flex shrink-0 items-center justify-center size-[18px]\",\n  \"text-on-surface-variant\",\n  \"transition-colors duration-spring-standard-fast-effects ease-spring-standard-fast-effects\",\n  \"group-data-[disabled]/chip:text-on-surface/38\",\n]);\n\n// ─── CHECKMARK (FILTER) ───────────────────────────────────────────────────────\n\n/**\n * Filter chip checkmark container.\n *\n * Animated width (spatial spring) + opacity (effects spring) on selection change.\n * Width transition is intentionally spatial since it moves adjacent content.\n * The inner SVG uses effects transition for opacity so color/opacity don't overshoot.\n */\nexport const chipCheckmarkVariants = cva([\n  \"inline-flex overflow-hidden shrink-0\",\n  // Spatial spring for width (moves adjacent text — this is a spatial animation)\n  \"transition-[width] duration-spring-standard-fast-spatial ease-spring-standard-fast-spatial\",\n  // Collapsed state\n  \"w-0\",\n  // Expanded state when selected\n  \"group-data-[selected]/chip:w-[18px]\",\n]);\n\n/**\n * Inner checkmark icon wrapper — opacity only (effects token, no overshoot).\n */\nexport const chipCheckmarkIconVariants = cva([\n  \"inline-flex items-center justify-center size-[18px] shrink-0\",\n  \"transition-opacity duration-spring-standard-fast-effects ease-spring-standard-fast-effects\",\n  \"opacity-0\",\n  \"group-data-[selected]/chip:opacity-100\",\n  // Color: on-secondary-container when selected; inherits on-surface-variant at rest (invisible)\n  \"text-on-secondary-container\",\n  \"group-data-[disabled]/chip:text-on-surface/38\",\n]);\n\n// ─── LABEL ────────────────────────────────────────────────────────────────────\n\n/**\n * Label text wrapper.\n * Typography and color are inherited from the root chipVariants classes.\n * z-10 keeps it above the state layer and ripple overlays.\n */\nexport const chipLabelVariants = cva([\"relative z-10 inline-flex items-center\"]);\n\n// ─── REMOVE BUTTON (INPUT) ───────────────────────────────────────────────────\n\n/**\n * Remove button wrapper for input chips.\n *\n * MD3: 18dp circular interactive area with its own state layer.\n * Uses `group/chip-remove` as a separate group scope so its own state\n * layer doesn't interfere with the main chip's `group/chip` selectors.\n *\n * The remove button is a separate focusable element (Tab stop) inside\n * the chip wrapper — it must NOT inherit the chip's press/hover state.\n */\nexport const chipRemoveButtonVariants = cva([\n  \"relative z-10 inline-flex size-[18px] shrink-0 items-center justify-center\",\n  \"rounded-full cursor-pointer\",\n  \"text-on-surface-variant\",\n  \"group/chip-remove\",\n  \"transition-colors duration-spring-standard-fast-effects ease-spring-standard-fast-effects\",\n  \"data-[disabled]:text-on-surface/38 data-[disabled]:cursor-not-allowed data-[disabled]:pointer-events-none\",\n]);\n\n/**\n * State layer for the remove button's circular hit area.\n * Uses `group-data-[x]/chip-remove` to scope to the remove button only.\n */\nexport const chipRemoveStateLayerVariants = cva([\n  // Slightly larger circle (32dp touch target centered on 18dp icon)\n  \"absolute inset-[-7px] rounded-full pointer-events-none opacity-0\",\n  \"bg-on-surface-variant\",\n  \"transition-opacity duration-spring-standard-fast-effects ease-spring-standard-fast-effects\",\n  \"group-data-[hovered]/chip-remove:opacity-8\",\n  \"group-data-[focus-visible]/chip-remove:opacity-10\",\n  \"group-data-[pressed]/chip-remove:group-data-[pressed]/chip-remove:opacity-10\",\n  \"group-data-[disabled]/chip-remove:hidden\",\n]);\n\n// ─── EXPORTED TYPES ───────────────────────────────────────────────────────────\n\nexport type ChipVariants = VariantProps<typeof chipVariants>;\nexport type ChipStateLayerVariants = VariantProps<typeof chipStateLayerVariants>;\nexport type ChipLeadingIconVariants = VariantProps<typeof chipLeadingIconVariants>;\n","\"use client\";\n\nimport { forwardRef, useState, useCallback } from \"react\";\nimport type React from \"react\";\nimport { useHover, useFocusRing, mergeProps } from \"react-aria\";\nimport { ChipHeadless } from \"./ChipHeadless\";\nimport {\n  chipVariants,\n  chipStateLayerVariants,\n  chipFocusRingVariants,\n  chipLeadingIconVariants,\n  chipTrailingIconVariants,\n  chipCheckmarkVariants,\n  chipCheckmarkIconVariants,\n  chipLabelVariants,\n  chipRemoveButtonVariants,\n  chipRemoveStateLayerVariants,\n} from \"./Chip.variants\";\nimport { cn } from \"../../utils/cn\";\nimport { getInteractionDataAttributes } from \"../../utils/interactionStates\";\nimport { useRipple } from \"../../hooks/useRipple\";\nimport type { ChipProps } from \"./Chip.types\";\n\n// ---------------------------------------------------------------------------\n// Internal icon primitives\n// ---------------------------------------------------------------------------\n\n/**\n * MD3 close/remove icon (18 × 18 dp)\n */\nconst CloseIcon = (): React.ReactElement => (\n  <svg\n    xmlns=\"http://www.w3.org/2000/svg\"\n    width=\"18\"\n    height=\"18\"\n    viewBox=\"0 0 24 24\"\n    fill=\"currentColor\"\n    aria-hidden=\"true\"\n  >\n    <path d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\" />\n  </svg>\n);\n\n/**\n * MD3 check icon for filter chip selected state (18 × 18 dp)\n */\nconst CheckIcon = (): React.ReactElement => (\n  <svg\n    xmlns=\"http://www.w3.org/2000/svg\"\n    width=\"18\"\n    height=\"18\"\n    viewBox=\"0 0 24 24\"\n    fill=\"currentColor\"\n    aria-hidden=\"true\"\n  >\n    <path d=\"M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z\" />\n  </svg>\n);\n\n// ---------------------------------------------------------------------------\n// Public Chip component (Layer 3: Styled)\n// ---------------------------------------------------------------------------\n\n/**\n * Material Design 3 Chip Component (Layer 3: Styled)\n *\n * Unified styled chip covering all four MD3 chip types.\n * Built on `ChipHeadless` for world-class accessibility via React Aria.\n *\n * Implements the Variants-vs-States architecture: all interaction/selection\n * states are expressed as `data-*` attributes on the root and consumed by each\n * slot via `group-data-[x]/chip` Tailwind selectors — no state variants in CVA.\n *\n * Features:\n * - ✅ 4 MD3 chip types: assist, filter, input, suggestion\n * - ✅ 2 surfaces: flat (transparent + outline), elevated (shadow + fill)\n * - ✅ MD3-correct per-type icon colors (assist leading = primary, etc.)\n * - ✅ Filter chip checkmark with spring animation\n * - ✅ Input chip removal with animate-md-fade-out\n * - ✅ Proper MD3 state layer (hover 8%, focus 10%, pressed 10%)\n * - ✅ Spring motion tokens (no hardcoded durations)\n * - ✅ Dedicated focus ring slot (outside overflow-hidden)\n * - ✅ Full keyboard accessibility (via React Aria)\n * - ✅ Deprecated `surface=\"tonal\"` — warns and maps to `flat`\n *\n * MD3 Specifications:\n * - Height: 32dp (h-8), corner-small 8dp (rounded-sm)\n * - Padding: 16dp base; 8dp leading side when icon present\n * - Icon size: 18px × 18px\n * - State layers: 8% hover, 10% focus/pressed\n * - Elevation: level-1 base → level-2 hover (elevated surface)\n *\n * @example\n * ```tsx\n * // Assist chip (default flat surface)\n * <Chip type=\"assist\" label=\"Set alarm\" onPress={handlePress} />\n *\n * // Elevated assist chip\n * <Chip type=\"assist\" surface=\"elevated\" label=\"Set alarm\" />\n *\n * // Filter chip (controlled)\n * <Chip type=\"filter\" label=\"Vegetarian\" selected={isVeg} onSelectionChange={setVeg} />\n *\n * // Input chip with leading icon\n * <Chip type=\"input\" label=\"React\" leadingIcon={<ReactIcon />} onRemove={() => remove('React')} />\n *\n * // Suggestion chip\n * <Chip type=\"suggestion\" label=\"See photos\" onPress={handlePress} />\n * ```\n */\nexport const Chip = forwardRef<HTMLButtonElement, ChipProps>(\n  (\n    {\n      type,\n      label,\n      surface: surfaceProp = \"flat\",\n      selected,\n      defaultSelected,\n      onSelectionChange,\n      onPress,\n      onRemove,\n      leadingIcon,\n      trailingIcon,\n      isDisabled = false,\n      className,\n    },\n    ref\n  ) => {\n    // Resolve deprecated surface=\"tonal\" → \"flat\" with dev warning\n    const surface = ((): \"flat\" | \"elevated\" => {\n      if (surfaceProp === \"tonal\") {\n        if (process.env.NODE_ENV !== \"production\") {\n          console.warn(\n            '[Chip] surface=\"tonal\" is deprecated. Use surface=\"flat\" instead. ' +\n              '\"tonal\" will be removed in a future minor version.'\n          );\n        }\n        return \"flat\";\n      }\n      return surfaceProp;\n    })();\n\n    // ── Filter chip selected state management ────────────────────────────────\n    const [localSelected, setLocalSelected] = useState(defaultSelected ?? false);\n    const isControlled = selected !== undefined;\n    const effectiveSelected = type === \"filter\" ? (isControlled ? selected : localSelected) : false;\n\n    const handleSelectionChange = useCallback(\n      (newSelected: boolean) => {\n        if (!isControlled) {\n          setLocalSelected(newSelected);\n        }\n        onSelectionChange?.(newSelected);\n      },\n      [isControlled, onSelectionChange]\n    );\n\n    // ── Interaction state tracking (body / main chip) ─────────────────────────\n    const [isPressed, setIsPressed] = useState(false);\n    const handlePressStart = useCallback(() => setIsPressed(true), []);\n    const handlePressEnd = useCallback(() => setIsPressed(false), []);\n\n    const { isHovered, hoverProps } = useHover({ isDisabled });\n    const { isFocusVisible, focusProps } = useFocusRing();\n\n    // ── Interaction state tracking (remove button — input chip only) ──────────\n    const [isRemovePressed, setIsRemovePressed] = useState(false);\n    const { isHovered: isRemoveHovered, hoverProps: removeHoverProps } = useHover({ isDisabled });\n    const { isFocusVisible: isRemoveFocusVisible, focusProps: removeFocusProps } = useFocusRing();\n\n    // ── Ripple ───────────────────────────────────────────────────────────────\n    const { onMouseDown: handleRipple, ripples } = useRipple({ disabled: isDisabled });\n\n    // ── Derived flags ────────────────────────────────────────────────────────\n    const hasLeadingIcon = Boolean(leadingIcon) || type === \"filter\";\n\n    // ── Input chip: removal animation ────────────────────────────────────────\n    const [isRemoving, setIsRemoving] = useState(false);\n\n    const handleRemove = useCallback(() => {\n      setIsRemoving(true);\n    }, []);\n\n    const handleAnimationEnd = useCallback(() => {\n      if (isRemoving) {\n        onRemove?.();\n      }\n    }, [isRemoving, onRemove]);\n\n    // ── Body interaction data attributes ─────────────────────────────────────\n    const bodyDataAttrs = getInteractionDataAttributes({\n      isHovered,\n      isFocusVisible,\n      isPressed,\n      ...(type === \"filter\" && { isSelected: effectiveSelected }),\n      isDisabled,\n    });\n\n    // ── Root classes (shared base) ────────────────────────────────────────────\n    const rootClass = cn(chipVariants({ chipType: type, surface }), \"group/chip\", className);\n\n    // ── Input chip ───────────────────────────────────────────────────────────\n    // Renders a wrapper <span> as the chip root so we can:\n    //  1. Apply chip styles + removal animation class\n    //  2. Carry the group/chip scope so all slot selectors work\n    //  3. Listen for animationend before calling the real onRemove callback\n    // The inner <ChipHeadless className=\"contents\"> uses CSS display:contents\n    // so the two buttons become direct flex children of the wrapper span.\n    if (type === \"input\") {\n      const removeDataAttrs = getInteractionDataAttributes({\n        isHovered: isRemoveHovered,\n        isFocusVisible: isRemoveFocusVisible,\n        isPressed: isRemovePressed,\n        isDisabled,\n      });\n\n      return (\n        <span\n          className={cn(\n            chipVariants({ chipType: \"input\", surface }),\n            \"group/chip\",\n            isRemoving && \"animate-md-fade-out\",\n            className\n          )}\n          // Spread the body interaction attrs onto the root wrapper so\n          // group-data-[x]/chip slot selectors work for the chip body area.\n          // (The remove button has its own group/chip-remove scope.)\n          {...bodyDataAttrs}\n          data-with-leading={hasLeadingIcon ? \"\" : undefined}\n          data-with-trailing=\"\"\n          onAnimationEnd={handleAnimationEnd}\n        >\n          {/* Ripple */}\n          {ripples}\n\n          {/* State layer */}\n          <span className={cn(chipStateLayerVariants({ chipType: \"input\" }))} aria-hidden=\"true\" />\n\n          {/* Focus ring — outside overflow-hidden */}\n          <span className={cn(chipFocusRingVariants())} aria-hidden=\"true\" />\n\n          <ChipHeadless\n            type=\"input\"\n            label={label}\n            isDisabled={isDisabled}\n            onRemove={handleRemove}\n            onMouseDown={handleRipple}\n            removeButtonClassName={cn(chipRemoveButtonVariants())}\n            removeIcon={\n              <>\n                {/* Remove button state layer */}\n                <span\n                  className={cn(chipRemoveStateLayerVariants())}\n                  aria-hidden=\"true\"\n                  {...{ \"data-remove-state-layer\": \"\" }}\n                />\n                <CloseIcon />\n              </>\n            }\n            ref={ref}\n            className=\"contents\"\n            bodyPassthrough={{\n              onPressStart: handlePressStart,\n              onPressEnd: handlePressEnd,\n            }}\n            removePassthrough={{\n              dataAttributes: removeDataAttrs,\n              eventHandlers: mergeProps(removeHoverProps, removeFocusProps) as Record<\n                string,\n                unknown\n              >,\n              onPressStart: () => setIsRemovePressed(true),\n              onPressEnd: () => setIsRemovePressed(false),\n            }}\n          >\n            {/* Leading icon */}\n            {leadingIcon && (\n              <span\n                aria-hidden=\"true\"\n                className={cn(chipLeadingIconVariants({ chipType: \"input\" }))}\n              >\n                {leadingIcon}\n              </span>\n            )}\n            {/* Label */}\n            <span className={cn(chipLabelVariants())}>{label}</span>\n          </ChipHeadless>\n        </span>\n      );\n    }\n\n    // ── Assist / Filter / Suggestion chips ───────────────────────────────────\n    return (\n      <ChipHeadless\n        ref={ref}\n        type={type}\n        label={label}\n        {...(type === \"filter\" && {\n          selected: effectiveSelected,\n          onSelectionChange: handleSelectionChange,\n        })}\n        {...(type !== \"filter\" && onPress !== undefined && { onPress })}\n        isDisabled={isDisabled}\n        onMouseDown={handleRipple}\n        className={cn(rootClass)}\n        bodyPassthrough={{\n          dataAttributes: bodyDataAttrs,\n          onPressStart: handlePressStart,\n          onPressEnd: handlePressEnd,\n          eventHandlers: mergeProps(hoverProps, focusProps) as Record<string, unknown>,\n        }}\n      >\n        {/* Ripple */}\n        {ripples}\n\n        {/* State layer */}\n        <span className={cn(chipStateLayerVariants({ chipType: type }))} aria-hidden=\"true\" />\n\n        {/* Focus ring — absolute sibling, outside overflow-hidden */}\n        <span className={cn(chipFocusRingVariants())} aria-hidden=\"true\" />\n\n        {/* Filter chip checkmark — width spring */}\n        {type === \"filter\" && (\n          <span className={cn(chipCheckmarkVariants())} aria-hidden=\"true\">\n            <span className={cn(chipCheckmarkIconVariants())}>\n              <CheckIcon />\n            </span>\n          </span>\n        )}\n\n        {/* Leading icon */}\n        {leadingIcon && (\n          <span aria-hidden=\"true\" className={cn(chipLeadingIconVariants({ chipType: type }))}>\n            {leadingIcon}\n          </span>\n        )}\n\n        {/* Label */}\n        <span className={cn(chipLabelVariants())}>{label}</span>\n\n        {/* Trailing icon (Assist / Suggestion only) */}\n        {trailingIcon && (\n          <span aria-hidden=\"true\" className={cn(chipTrailingIconVariants())}>\n            {trailingIcon}\n          </span>\n        )}\n      </ChipHeadless>\n    );\n  }\n);\n\nChip.displayName = \"Chip\";\n","import { forwardRef } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport type { ChipSetProps } from \"./Chip.types\";\n\n/**\n * Material Design 3 ChipSet Container\n *\n * A layout wrapper that arranges chips in a flowing flex row with\n * consistent 8dp gap. Renders as a `<div>` — no additional ARIA semantics\n * are required per MD3 spec (the individual chips carry their own roles).\n *\n * @example\n * ```tsx\n * <ChipSet>\n *   <Chip type=\"filter\" label=\"React\" />\n *   <Chip type=\"filter\" label=\"TypeScript\" />\n *   <Chip type=\"filter\" label=\"Tailwind\" />\n * </ChipSet>\n * ```\n */\nexport const ChipSet = forwardRef<HTMLDivElement, ChipSetProps>(({ className, children }, ref) => (\n  <div ref={ref} className={cn(\"flex flex-wrap gap-2\", className)}>\n    {children}\n  </div>\n));\n\nChipSet.displayName = \"ChipSet\";\n","\"use client\";\n\nimport {\n  createContext,\n  forwardRef,\n  useCallback,\n  useContext,\n  useEffect,\n  useId,\n  useRef,\n  useState,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport type React from \"react\";\nimport { useDialog, useOverlay, usePreventScroll, FocusScope } from \"react-aria\";\nimport { useOverlayTriggerState } from \"react-stately\";\nimport { mergeProps } from \"@react-aria/utils\";\nimport { cn } from \"../../utils/cn\";\nimport type {\n  DialogAnimationState,\n  DialogContextValue,\n  DialogHeadlessProps,\n  DialogVariant,\n} from \"./Dialog.types\";\n\n// ─── Context ──────────────────────────────────────────────────────────────────\n\n/**\n * Context shared between `DialogHeadless` and slot sub-components\n * (`DialogHeadline`, `DialogContent`, `DialogActions`).\n *\n * Provides stable IDs for aria-labelledby / aria-describedby wiring,\n * the close callback, and the active variant.\n *\n * @internal\n */\nexport const DialogContext = createContext<DialogContextValue | null>(null);\n\n/**\n * Hook to consume `DialogContext` inside dialog slot sub-components.\n * Throws a descriptive error if used outside a `DialogHeadless` tree.\n *\n * @internal\n */\nexport function useDialogContext(): DialogContextValue {\n  const ctx = useContext(DialogContext);\n  if (ctx === null) {\n    throw new Error(\n      \"[Dialog] DialogHeadline, DialogContent, and DialogActions must be rendered \" +\n        \"inside a <Dialog> or <DialogHeadless> component.\"\n    );\n  }\n  return ctx;\n}\n\n// ─── DialogPanel (internal) ───────────────────────────────────────────────────\n\n/**\n * Inner dialog panel — wires React Aria hooks (`useDialog`, `useOverlay`,\n * `usePreventScroll`) and renders the accessible dialog element with the\n * centering wrapper.\n *\n * DOM structure:\n * ```\n *   <div> (centering / positioning wrapper, z-50)\n *     <div role=\"dialog\" aria-modal> (panel — className, animation, data attrs)\n *       [icon element — only when icon prop is set]\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  onAnimationEnd: (e: React.AnimationEvent<HTMLDivElement>) => void;\n  variant: DialogVariant;\n  isDismissable: boolean;\n  wrapperClassName: string;\n  className: string | undefined;\n  animationState: DialogAnimationState;\n  getAnimationClassName: ((state: DialogAnimationState) => string) | undefined;\n  icon: React.ReactNode | undefined;\n  children: React.ReactNode;\n}\n\nconst DialogPanel = ({\n  ariaLabel,\n  headlineId,\n  contentId,\n  onClose,\n  onAnimationEnd,\n  variant,\n  isDismissable,\n  wrapperClassName,\n  className,\n  animationState,\n  getAnimationClassName,\n  icon,\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  // `data-with-icon` is a content flag (presence-based): attribute present = icon is rendered.\n  // This lets `group-data-[with-icon]/dialog:` selectors in headline/content center their text.\n  const hasIcon = icon !== undefined && icon !== null && variant === \"basic\";\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        // Presence-based content flag — drives centering via group-data-[with-icon]/dialog:\n        data-with-icon={hasIcon ? \"\" : undefined}\n        // onAnimationEnd advances \"exiting\" → \"exited\" after the exit keyframe completes.\n        // We guard e.target === e.currentTarget so that animationend events bubbling up\n        // from child elements (e.g. ripple animations on action buttons) do not\n        // accidentally advance the state machine.\n        onAnimationEnd={onAnimationEnd}\n      >\n        {/* Optional hero icon — rendered above headline, centered per MD3 spec */}\n        {hasIcon && icon}\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 *   Exit advances on `onAnimationEnd` with `e.target === e.currentTarget` guard\n *   (prevents child animation events from advancing the state machine), plus a\n *   250ms fallback timer in case the animation event doesn't fire.\n * - **Scrim animation**: state-driven via `getScrimClassName(animationState)`.\n * - **Hero icon**: optional `icon` prop renders centered above headline;\n *   sets `data-with-icon` on panel root for group-data centering of headline/content.\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(dialogPanelVariants({ variant: 'basic' }))}\n *   wrapperClassName={dialogWrapperVariants({ variant: 'basic' })}\n *   getScrimClassName={(state) => dialogScrimVariants({ animationState: state })}\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      icon,\n      children,\n      className,\n      wrapperClassName,\n      getScrimClassName,\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 onAnimationEnd doesn't fire\n    // (e.g. browser reduced-motion CSS override, animation cancelled)\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      // animation initial keyframe to paint) 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        // 250ms fallback — longer than the 200ms exit keyframe so it only fires\n        // if onAnimationEnd doesn't (e.g. user's CSS `animation: none` override\n        // at the app level rather than via prefers-reduced-motion).\n        exitFallbackRef.current = setTimeout(() => {\n          if (!closedRef.current) {\n            closedRef.current = true;\n            setAnimationState(\"exited\");\n          }\n        }, 250);\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    // Advances exiting → exited after the CSS keyframe animation ends.\n    // e.target === e.currentTarget guard: ensures only the panel's own\n    // animationend event triggers the advance — not events bubbling up\n    // from child elements (e.g. ripple animations inside DialogActions).\n    const handleAnimationEnd = useCallback(\n      (e: React.AnimationEvent<HTMLDivElement>) => {\n        if (e.target !== e.currentTarget) return;\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      },\n      [animationState]\n    );\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    // ── Derived wrapper class ─────────────────────────────────────────────────\n\n    // Use the caller-supplied wrapperClassName when provided; fall back to the\n    // hardcoded centering strings so DialogHeadless still works standalone.\n    const resolvedWrapperClass =\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    // ── Derived scrim class ───────────────────────────────────────────────────\n\n    // Use the caller-supplied getScrimClassName when provided; fall back to a\n    // static scrim without animation so DialogHeadless works as a standalone primitive.\n    const resolvedScrimClass =\n      getScrimClassName?.(animationState) ?? \"fixed inset-0 z-40 bg-scrim/32\";\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={resolvedScrimClass}\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            onAnimationEnd={handleAnimationEnd}\n            variant={variant}\n            isDismissable={variant === \"basic\"}\n            wrapperClassName={resolvedWrapperClass}\n            className={className}\n            animationState={animationState}\n            getAnimationClassName={getAnimationClassName}\n            icon={icon}\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 * Architecture: Variants vs States\n * - CVA holds design-time structure only (no state variants, no state compoundVariants).\n * - `group/dialog` on the panel root lets slot children consume `data-with-icon` via\n *   `group-data-[with-icon]/dialog:` selectors (centering headline/content when icon is present).\n * - Content flags (`data-with-icon`) are set explicitly by the component, not via CVA.\n * - Scroll dividers are toggled by `data-scrolled-top` / `data-scrolled-bottom` on the content\n *   element (set by DialogContent's scroll handler) — no CVA variants needed for those.\n *\n * Slot responsibilities:\n *   dialogScrimVariants          — fixed full-screen overlay; bg-scrim/32; animated fade\n *   dialogPanelVariants          — floating card (basic) or full-viewport (fullscreen); surface, shape, elevation\n *   dialogWrapperVariants        — centering wrapper rendered by DialogHeadless around the panel\n *   dialogAnimationVariants      — enter/exit animation state machine (composite animate-md-* keyframes)\n *   dialogIconVariants           — optional hero icon above headline; centered; text-secondary\n *   dialogHeadlineVariants       — headline h2; text-headline-small; centers on icon presence\n *   dialogHeadlineTitleVariants  — title inside fullscreen top-app-bar row\n *   dialogContentVariants        — scrollable body; text-body-medium; scroll-divider borders\n *   dialogActionsVariants        — right-aligned action button row\n *\n * MD3 Specifications (https://m3.material.io/components/dialogs/specs):\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-max\n * - Internal padding:    24dp → p-6; headline mb-4; actions pt-3\n * - Scrim:               bg-scrim/32\n * - Headline:            text-headline-small, text-on-surface; centered when icon present\n * - Body:                text-body-medium, text-on-surface-variant; scrollable\n * - Action row:          right-aligned flex, gap-2, pt-3 (24dp)\n *\n * Motion (MD3 Expressive — composite keyframe utilities):\n * - Basic enter:        animate-md-scale-in  (expressive-fast-spatial 350ms)\n * - Basic exit:         animate-md-scale-out (emphasized-accelerate 200ms)\n * - Fullscreen enter:   animate-md-slide-in-bottom (standard-default-spatial 500ms)\n * - Fullscreen exit:    animate-md-slide-out-bottom (emphasized-accelerate 200ms)\n * - Scrim enter:        animate-md-fade-in (expressive-default-effects 200ms)\n * - Scrim exit:         animate-md-fade-out (standard-fast-effects 150ms)\n * - Reduced motion:     getAnimationClassName returns \"\" (no animation class added)\n */\n\n// ─── Scrim overlay ──────────────────────────────────────────────────────────────\n\n/**\n * Scrim overlay variants.\n *\n * Fades in on enter, fades out on exit via composite animate-md-* utilities.\n * The scrim's color + opacity are baked into `bg-scrim/32` so the element is\n * immediately visible even before the animation plays (forward-fill).\n *\n * Full-screen variant: same scrim but onClick is a no-op per MD3 spec.\n */\nexport const dialogScrimVariants = cva(\n  [\n    \"fixed\",\n    \"inset-0\",\n    \"z-40\",\n    // MD3 scrim: bg-scrim at 32% opacity — always set so instant-show works in reduced-motion\n    \"bg-scrim/32\",\n  ],\n  {\n    variants: {\n      animationState: {\n        entering: [\"opacity-0\"],\n        visible: [\"animate-md-fade-in\"],\n        exiting: [\"animate-md-fade-out\"],\n        exited: [\"opacity-0\", \"pointer-events-none\"],\n      },\n    },\n    defaultVariants: {\n      animationState: \"entering\",\n    },\n  }\n);\n\nexport type DialogScrimVariants = VariantProps<typeof dialogScrimVariants>;\n\n// ─── Panel container ────────────────────────────────────────────────────────────\n\n/**\n * Dialog panel container variants.\n *\n * `group/dialog` enables child slots to read `data-with-icon` content flag via\n * `group-data-[with-icon]/dialog:` selectors (centers headline and content text).\n *\n * - `basic`:      floating card with rounded corners, elevation, max-width constraint.\n * - `fullscreen`: full viewport coverage, no corners, no max-width.\n *\n * `will-change-[opacity,transform]` is kept to hint the browser compositor during\n * the composite keyframe animation. `transition-*` is intentionally absent — the\n * composite `animate-md-*` utilities manage timing entirely.\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    // Compositor hint for keyframe animation\n    \"will-change-[opacity,transform]\",\n\n    // group scope — lets child slots consume data-with-icon via group-data-[with-icon]/dialog:\n    \"group/dialog\",\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: 24dp padding, headline mb-4, content mb-6, actions pt-3\n          \"pt-6\",\n          \"pb-3\",\n          \"px-6\",\n          // Positioning (centering wrapper handles the viewport centering)\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          \"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 * Consumed by Dialog.tsx and passed as `wrapperClassName` to DialogHeadless.\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` via `getAnimationClassName`.\n *\n * Uses composite `animate-md-*` keyframe utilities so that the correct MD3 Expressive\n * spring easing + duration are automatically encoded in the animation shorthand.\n *\n * Motion decisions per md3-motion.mdc:\n * - Basic dialog: standard-size component → `animate-md-scale-in` / `animate-md-scale-out`\n *   (expressive-fast-spatial 350ms enter; emphasized-accelerate 200ms exit)\n * - Fullscreen dialog: full-screen → `animate-md-slide-in-bottom` / `animate-md-slide-out-bottom`\n *   (standard-default-spatial 500ms enter; emphasized-accelerate 200ms exit)\n * - Enter = decelerate; Exit = accelerate (MD3 rule: enter fast→rest, exit slow→fast)\n *\n * The panel's onAnimationEnd handler advances \"exiting\" → \"exited\" so the portal is\n * removed after the exit animation completes (with a 250ms fallback timer as safety net).\n */\nexport const dialogAnimationVariants = cva(\"\", {\n  variants: {\n    animationState: {\n      // initial mount frame before the animation starts — rendered invisible\n      entering: [],\n      // entry animation active\n      visible: [],\n      // exit animation active\n      exiting: [],\n      // fully dismissed; portal gate will remove the element\n      exited: [],\n    },\n    variant: {\n      basic: [],\n      fullscreen: [],\n    },\n  },\n  compoundVariants: [\n    // ── Basic ────────────────────────────────────────────────────────────────\n    // entering: start invisible (animate-md-scale-in keyframe starts from scale(0.85)/opacity:0)\n    {\n      animationState: \"entering\",\n      variant: \"basic\",\n      className: [\"opacity-0\"],\n    },\n    // visible: composite scale-in keyframe (expressive-fast-spatial 350ms)\n    {\n      animationState: \"visible\",\n      variant: \"basic\",\n      className: [\"animate-md-scale-in\"],\n    },\n    // exiting: composite scale-out keyframe (emphasized-accelerate 200ms)\n    {\n      animationState: \"exiting\",\n      variant: \"basic\",\n      className: [\"animate-md-scale-out\"],\n    },\n    // exited: keep hidden until portal gate removes it\n    {\n      animationState: \"exited\",\n      variant: \"basic\",\n      className: [\"opacity-0\", \"pointer-events-none\"],\n    },\n\n    // ── Fullscreen ───────────────────────────────────────────────────────────\n    // entering: start off-screen below (slide-in-bottom starts from translateY(100%)/opacity:0)\n    {\n      animationState: \"entering\",\n      variant: \"fullscreen\",\n      className: [\"opacity-0\"],\n    },\n    // visible: composite slide-in-bottom keyframe (standard-default-spatial 500ms)\n    {\n      animationState: \"visible\",\n      variant: \"fullscreen\",\n      className: [\"animate-md-slide-in-bottom\"],\n    },\n    // exiting: composite slide-out-bottom keyframe (emphasized-accelerate 200ms)\n    {\n      animationState: \"exiting\",\n      variant: \"fullscreen\",\n      className: [\"animate-md-slide-out-bottom\"],\n    },\n    // exited: keep hidden until portal gate removes it\n    {\n      animationState: \"exited\",\n      variant: \"fullscreen\",\n      className: [\"opacity-0\", \"pointer-events-none\"],\n    },\n  ],\n  defaultVariants: {\n    animationState: \"entering\",\n    variant: \"basic\",\n  },\n});\n\nexport type DialogAnimationVariants = VariantProps<typeof dialogAnimationVariants>;\n\n// ─── Hero Icon ──────────────────────────────────────────────────────────────────\n\n/**\n * Optional hero icon slot — centered above the headline per MD3 spec.\n *\n * MD3: 24dp icon, text-secondary color, centered in the dialog.\n * When the `icon` prop is present, DialogHeadless sets `data-with-icon` on the\n * panel root so `group-data-[with-icon]/dialog:text-center` in headline/content\n * variants applies automatically.\n */\nexport const dialogIconVariants = cva([\n  // Center the icon in the panel\n  \"flex\",\n  \"items-center\",\n  \"justify-center\",\n  // Bottom margin separating icon from headline\n  \"mb-4\",\n  // MD3 spec: icon color = secondary\n  \"text-secondary\",\n  // 24dp icon size (children — typically an SVG — should be 24×24)\n  \"size-6\",\n]);\n\nexport type DialogIconVariants = VariantProps<typeof dialogIconVariants>;\n\n// ─── DialogHeadline ─────────────────────────────────────────────────────────────\n\n/**\n * Headline element variants.\n * MD3: text-headline-small, text-on-surface.\n * Centers text when the dialog has a hero icon (`group-data-[with-icon]/dialog:text-center`).\n */\nexport const dialogHeadlineVariants = cva([\"text-headline-small\", \"text-on-surface\"], {\n  variants: {\n    variant: {\n      basic: [\n        \"mb-4\",\n        // Center headline text when hero icon is present\n        \"group-data-[with-icon]/dialog:text-center\",\n      ],\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 *\n * MD3: text-body-medium, text-on-surface-variant, scrollable.\n * Centers text when hero icon is present (`group-data-[with-icon]/dialog:text-center`).\n *\n * Scroll dividers: when DialogContent's scroll handler determines the content\n * is not scrolled to the top, it sets `data-scrolled-top` (which removes the\n * top divider class). Similarly `data-scrolled-bottom` for the bottom divider.\n * We use presence-based `data-*` attributes: attribute present = divider shown.\n *\n * Top divider: `border-t border-outline-variant` when `data-[scroll-divider-top]`\n * Bottom divider: `border-b border-outline-variant` when `data-[scroll-divider-bottom]`\n */\nexport const dialogContentVariants = cva(\n  [\n    \"text-body-medium\",\n    \"text-on-surface-variant\",\n    \"overflow-y-auto\",\n    \"flex-1\",\n    // Center supporting text when hero icon is present\n    \"group-data-[with-icon]/dialog:text-center\",\n    // Scroll dividers — activated by DialogContent's scroll handler\n    \"data-[scroll-divider-top]:border-t\",\n    \"data-[scroll-divider-top]:border-outline-variant\",\n    \"data-[scroll-divider-bottom]:border-b\",\n    \"data-[scroll-divider-bottom]:border-outline-variant\",\n  ],\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, pt-3 (24dp from content bottom).\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, useCallback } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { useReducedMotion } from \"../../hooks/useReducedMotion\";\nimport { DialogHeadless } from \"./DialogHeadless\";\nimport {\n  dialogPanelVariants,\n  dialogWrapperVariants,\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 (`animate-md-scale-in`, expressive-fast-spatial 350ms)\n * - Scale + fade exit animation (`animate-md-scale-out`, emphasized-accelerate 200ms)\n * - Scrim fades in/out (`animate-md-fade-in` / `animate-md-fade-out`)\n * - Closes on scrim click or Escape key\n * - Optional hero icon above headline (`icon` prop) — centers headline + content text\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 (`animate-md-slide-in-bottom` / out)\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 * **Reduced motion**:\n * - When `prefers-reduced-motion: reduce` is active, all keyframe animations are\n *   suppressed (no animate-md-* class applied). Dialog appears/disappears instantly.\n * - `transition-none` is appended so any inherited transitions are also disabled.\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 * // With hero icon\n * <Dialog icon={<BookmarkIcon />} open={open} onOpenChange={setOpen}>\n *   <DialogHeadline>Save bookmark?</DialogHeadline>\n *   <DialogContent>The page will be saved to your bookmarks.</DialogContent>\n *   <DialogActions>\n *     <Button variant=\"text\" onPress={() => setOpen(false)}>Cancel</Button>\n *     <Button variant=\"filled\" onPress={handleSave}>Save</Button>\n *   </DialogActions>\n * </Dialog>\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    icon,\n    children,\n    className,\n  },\n  _ref\n) {\n  const reducedMotion = useReducedMotion();\n\n  // Panel class: structural + visual styles from CVA.\n  // When reducedMotion is true, append transition-none to ensure no inherited\n  // transitions fire during the instant show/hide.\n  const panelClassName = cn(\n    dialogPanelVariants({ variant }),\n    reducedMotion && \"transition-none\",\n    className\n  );\n\n  // Wrapper class: centering/positioning from CVA (was previously hardcoded in DialogHeadless).\n  const wrapperClassName = dialogWrapperVariants({ variant });\n\n  // Scrim class: state-driven fade animation, suppressed when reducedMotion.\n  const getScrimClassName = useCallback(\n    (state: DialogAnimationState): string => {\n      if (reducedMotion) return \"fixed inset-0 z-40 bg-scrim/32\";\n      return dialogScrimVariants({ animationState: state });\n    },\n    [reducedMotion]\n  );\n\n  // Animation class: MD3 Expressive composite keyframes, suppressed when reducedMotion.\n  const getAnimationClassName = useCallback(\n    (state: DialogAnimationState): string => {\n      if (reducedMotion) return \"\";\n      return dialogAnimationVariants({ animationState: state, variant });\n    },\n    [reducedMotion, variant]\n  );\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      {...(icon !== undefined ? { icon } : {})}\n      className={panelClassName}\n      wrapperClassName={wrapperClassName}\n      getScrimClassName={getScrimClassName}\n      getAnimationClassName={getAnimationClassName}\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 * When the parent dialog has a hero `icon` prop, the panel root carries\n * `data-with-icon` and `group/dialog`, so the `group-data-[with-icon]/dialog:text-center`\n * selector in `dialogHeadlineVariants` automatically centers the headline text —\n * no additional props needed here.\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. The fullscreen app bar\n * always shows a `border-b border-outline-variant` divider below it.\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 — always has border-b border-outline-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      // Basic variant: text-headline-small, text-on-surface, mb-4\n      // group-data-[with-icon]/dialog:text-center is applied via the CVA base classes\n      // when the parent panel root has data-with-icon set by DialogHeadless.\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, useCallback, useEffect, useRef } 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 * **Scroll dividers**: Shows `border-outline-variant` dividers at the top and/or\n * bottom edge when content overflows and is not scrolled to the respective edge.\n * Dividers are toggled by setting `data-scroll-divider-top` / `data-scroll-divider-bottom`\n * presence attributes on the element. The CVA base class uses\n * `data-[scroll-divider-top]:border-t` and `data-[scroll-divider-bottom]:border-b`\n * to apply the borders — no style props needed.\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  forwardedRef\n) {\n  const { contentId, variant } = useDialogContext();\n\n  // Internal ref for scroll measurements — merged with forwarded ref below.\n  // useRef<HTMLDivElement | null>(null) returns MutableRefObject so .current is writable.\n  const internalRef = useRef<HTMLDivElement | null>(null);\n\n  // Merge the internal ref with any forwarded ref so callers can still access the element.\n  const setRef = useCallback(\n    (node: HTMLDivElement | null) => {\n      internalRef.current = node;\n      if (typeof forwardedRef === \"function\") {\n        forwardedRef(node);\n      } else if (forwardedRef !== null && forwardedRef !== undefined) {\n        // RefObject.current is readonly in the React types, but ForwardedRef is\n        // always a mutable ref when it is an object. Cast to a writable shape.\n        (forwardedRef as { current: HTMLDivElement | null }).current = node;\n      }\n    },\n    [forwardedRef]\n  );\n\n  // Computes scroll-divider attributes based on current scroll position.\n  // Divider at top: shown when content is scrolled down (scrollTop > 0).\n  // Divider at bottom: shown when content is not yet scrolled to the bottom.\n  // A 1px threshold avoids floating-point rounding issues on fractional pixels.\n  const updateDividers = useCallback(() => {\n    const el = internalRef.current;\n    if (!el) return;\n\n    const isScrollable = el.scrollHeight > el.clientHeight;\n\n    if (!isScrollable) {\n      el.removeAttribute(\"data-scroll-divider-top\");\n      el.removeAttribute(\"data-scroll-divider-bottom\");\n      return;\n    }\n\n    const scrolledFromTop = el.scrollTop > 1;\n    const scrolledToBottom = el.scrollTop + el.clientHeight >= el.scrollHeight - 1;\n\n    if (scrolledFromTop) {\n      el.setAttribute(\"data-scroll-divider-top\", \"\");\n    } else {\n      el.removeAttribute(\"data-scroll-divider-top\");\n    }\n\n    if (!scrolledToBottom) {\n      el.setAttribute(\"data-scroll-divider-bottom\", \"\");\n    } else {\n      el.removeAttribute(\"data-scroll-divider-bottom\");\n    }\n  }, []);\n\n  // Attach scroll listener and a ResizeObserver to re-evaluate dividers when\n  // the content dimensions change (e.g. accordion, dynamic content).\n  useEffect(() => {\n    const el = internalRef.current;\n    if (!el) return;\n\n    // Initial calculation\n    updateDividers();\n\n    el.addEventListener(\"scroll\", updateDividers, { passive: true });\n\n    const observer = new ResizeObserver(updateDividers);\n    observer.observe(el);\n\n    return () => {\n      el.removeEventListener(\"scroll\", updateDividers);\n      observer.disconnect();\n    };\n  }, [updateDividers]);\n\n  return (\n    <div ref={setRef} id={contentId} className={cn(dialogContentVariants({ variant }), className)}>\n      {children}\n    </div>\n  );\n});\n\nDialogContent.displayName = \"DialogContent\";\n","\"use client\";\n\nimport { forwardRef } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { useDialogContext } from \"./DialogHeadless\";\nimport { dialogActionsVariants } from \"./Dialog.variants\";\nimport type { DialogActionsProps } from \"./Dialog.types\";\n\n/**\n * `DialogActions` — Action button row slot sub-component (Layer 3).\n *\n * Renders a right-aligned flex row of action buttons per MD3 spec.\n * Intended to contain `Button` components (typically `variant=\"text\"` for\n * secondary actions and `variant=\"filled\"` for the primary action).\n *\n * Not used in the `fullscreen` variant — the confirm action is placed in the\n * headline top app bar row via `DialogHeadline`'s `confirmButton` slot.\n *\n * Must be rendered inside a `<Dialog>` or `<DialogHeadless>` component.\n *\n * @example\n * ```tsx\n * <Dialog open onOpenChange={setOpen}>\n *   <DialogHeadline>Discard changes?</DialogHeadline>\n *   <DialogContent>Your unsaved changes will be lost.</DialogContent>\n *   <DialogActions>\n *     <Button variant=\"text\" onPress={() => setOpen(false)}>Cancel</Button>\n *     <Button variant=\"filled\" onPress={handleDiscard}>Discard</Button>\n *   </DialogActions>\n * </Dialog>\n * ```\n */\nexport const DialogActions = forwardRef<HTMLDivElement, DialogActionsProps>(function DialogActions(\n  { children, className },\n  ref\n) {\n  // Consume context to validate sub-component is used inside Dialog\n  useDialogContext();\n\n  return (\n    <div ref={ref} className={cn(dialogActionsVariants(), className)}>\n      {children}\n    </div>\n  );\n});\n\nDialogActions.displayName = \"DialogActions\";\n","\"use client\";\n\nimport {\n  cloneElement,\n  isValidElement,\n  useRef,\n  type JSX,\n  type ReactElement,\n  type HTMLAttributes,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { useTooltip, useTooltipTrigger, useOverlayPosition } from \"react-aria\";\nimport { useTooltipTriggerState } from \"react-stately\";\nimport { mergeProps } from \"@react-aria/utils\";\nimport type { AriaTooltipProps } from \"react-aria\";\nimport type { TooltipTriggerProps, TooltipHeadlessProps } from \"./Tooltip.types\";\n\n// ─── TooltipTriggerHeadless ───────────────────────────────────────────────────\n\n/**\n * `TooltipTriggerHeadless` — Layer 2 headless trigger primitive.\n *\n * Manages open/close state and wires all React Aria tooltip hooks:\n *\n * - **State**: `useTooltipTriggerState` — 300ms hover delay, instant focus\n *   show, Escape / blur dismiss.\n * - **Wiring**: `useTooltipTrigger` — injects `aria-describedby` on the\n *   trigger and provides the tooltip `id`/`role` needed by `useTooltip`.\n * - **Portal**: the tooltip overlay is only mounted while `state.isOpen` is\n *   `true`; actual portal rendering happens inside `TooltipOverlayHeadless`.\n *\n * Expects exactly two children:\n * 1. The interactive trigger element (button, anchor, etc.)\n * 2. A `TooltipOverlayHeadless` element — `tooltipProps` and `triggerRef` are\n *    injected automatically via `cloneElement`.\n *\n * React Aria hooks used:\n * - `useTooltipTriggerState` — open/close state with delay and warm-up\n * - `useTooltipTrigger` — trigger ARIA wiring and event handlers\n *\n * @example\n * ```tsx\n * <TooltipTriggerHeadless delay={300} onOpenChange={setOpen}>\n *   <button>Save</button>\n *   <TooltipOverlayHeadless placement=\"top\">Save file</TooltipOverlayHeadless>\n * </TooltipTriggerHeadless>\n * ```\n */\nexport function TooltipTriggerHeadless({\n  children,\n  delay = 300,\n  isDisabled,\n  isOpen,\n  defaultOpen,\n  onOpenChange,\n  forceMount = false,\n}: TooltipTriggerProps): JSX.Element {\n  const triggerRef = useRef<HTMLElement>(null);\n\n  // Manages open/close state with hover delay and instant-focus show.\n  const state = useTooltipTriggerState({\n    delay,\n    ...(isDisabled !== undefined && { isDisabled }),\n    ...(isOpen !== undefined && { isOpen }),\n    ...(defaultOpen !== undefined && { defaultOpen }),\n    ...(onOpenChange !== undefined && { onOpenChange }),\n  });\n\n  // Wires trigger → tooltip: injects aria-describedby on the trigger and\n  // provides the id/role props that useTooltip needs to complete the pairing.\n  const { triggerProps, tooltipProps } = useTooltipTrigger(\n    {\n      delay,\n      ...(isDisabled !== undefined && { isDisabled }),\n    },\n    state,\n    triggerRef\n  );\n\n  const [triggerChild, tooltipChild] = children;\n\n  // Inject triggerProps (aria-describedby, event handlers) + ref onto the\n  // trigger element. We accept any valid ReactElement as the trigger.\n  const trigger = isValidElement(triggerChild)\n    ? cloneElement(\n        triggerChild as ReactElement<\n          HTMLAttributes<HTMLElement> & { ref?: React.Ref<HTMLElement> }\n        >,\n        {\n          ...triggerProps,\n          ref: triggerRef as React.Ref<HTMLElement>,\n        }\n      )\n    : triggerChild;\n\n  // Inject tooltipProps (id, role) + triggerRef onto the overlay element.\n  // forceMount keeps the overlay alive during exit animations without overriding\n  // React Aria's isOpen state (which would cause an open/close conflict).\n  const overlay =\n    (state.isOpen || forceMount) && isValidElement(tooltipChild)\n      ? cloneElement(tooltipChild as ReactElement<Partial<TooltipHeadlessProps>>, {\n          tooltipProps: tooltipProps as Record<string, unknown>,\n          triggerRef,\n        })\n      : null;\n\n  return (\n    <>\n      {trigger}\n      {overlay}\n    </>\n  );\n}\n\n// ─── TooltipOverlayHeadless ───────────────────────────────────────────────────\n\n/**\n * `TooltipOverlayHeadless` — Layer 2 headless overlay primitive.\n *\n * Handles all tooltip overlay concerns without any visual styling:\n *\n * - **ARIA**: `useTooltip` applies `role=\"tooltip\"` and the stable `id`\n *   used by the trigger's `aria-describedby`.\n * - **Positioning**: `useOverlayPosition` computes pixel-precise placement\n *   with automatic viewport flip. Positioning values come from the DOM so\n *   inline styles are the only viable approach (the one exception to the\n *   no-inline-styles rule).\n * - **Portal**: the tooltip is rendered in `document.body` via\n *   `ReactDOM.createPortal` so it is never a DOM descendant of the trigger,\n *   avoiding stacking-context and overflow issues.\n *\n * `tooltipProps` and `triggerRef` are injected by `TooltipTriggerHeadless`\n * via `cloneElement` — consumers do not need to pass them manually.\n *\n * React Aria hooks used:\n * - `useTooltip` — `role=\"tooltip\"`, stable `id`\n * - `useOverlayPosition` — viewport-aware placement with automatic flip\n *\n * @example\n * ```tsx\n * // Used as the second child of TooltipTriggerHeadless — tooltipProps and\n * // triggerRef are injected automatically.\n * <TooltipOverlayHeadless placement=\"top\" className=\"my-tooltip\">\n *   Save file\n * </TooltipOverlayHeadless>\n * ```\n */\nexport function TooltipOverlayHeadless({\n  tooltipProps: incomingTooltipProps = {},\n  triggerRef,\n  placement = \"top\",\n  offset = 4,\n  className,\n  children,\n  onPointerEnter,\n  onPointerLeave,\n}: TooltipHeadlessProps): JSX.Element | null {\n  const overlayRef = useRef<HTMLDivElement>(null);\n\n  // useTooltip receives the intermediate props from useTooltipTrigger\n  // (carries the stable id for aria-describedby) and returns the final\n  // DOM props including role=\"tooltip\".\n  const { tooltipProps } = useTooltip(incomingTooltipProps as AriaTooltipProps);\n\n  // useOverlayPosition computes pixel-precise coordinates relative to the\n  // trigger. DOM measurements require inline styles — this is the one\n  // permitted use of inline styles in this codebase.\n  const { overlayProps, placement: computedPlacement } = useOverlayPosition({\n    targetRef: triggerRef ?? { current: null },\n    overlayRef,\n    placement,\n    offset,\n    isOpen: true,\n  });\n\n  if (typeof document === \"undefined\") return null;\n\n  return createPortal(\n    <div\n      ref={overlayRef}\n      data-placement={placement}\n      data-computed-placement={computedPlacement}\n      {...mergeProps(tooltipProps, overlayProps)}\n      className={className}\n      onPointerEnter={onPointerEnter}\n      onPointerLeave={onPointerLeave}\n    >\n      {children}\n    </div>,\n    document.body\n  ) as JSX.Element;\n}\n","\"use client\";\n\nimport {\n  createContext,\n  useCallback,\n  useContext,\n  useRef,\n  useState,\n  isValidElement,\n  type JSX,\n  type ReactNode,\n} from \"react\";\nimport { TooltipTriggerHeadless, TooltipOverlayHeadless } from \"./TooltipHeadless\";\nimport { useReducedMotion } from \"../../hooks/useReducedMotion\";\nimport type { TooltipPlacement } from \"./Tooltip.types\";\n\n// ─── Animation Context ────────────────────────────────────────────────────────\n\n/**\n * Shared animation state provided by `TooltipTrigger` to its `Tooltip` /\n * `RichTooltip` children. Drives the CVA `animation` variant and the\n * `animationend` unmount callback.\n */\nexport interface TooltipAnimationContextValue {\n  /**\n   * True while the exit animation is playing.\n   * `Tooltip` / `RichTooltip` apply the exit animation class when this is\n   * `true` and stay mounted until `onAnimationEnd` fires.\n   * Always `false` when `reducedMotion` is `true` (immediate unmount).\n   */\n  isExiting: boolean;\n  /** Called by the tooltip element's `onAnimationEnd` to unmount after exit. */\n  onAnimationEnd: () => void;\n  /**\n   * Whether `prefers-reduced-motion: reduce` is currently active.\n   * When `true`, styled components must skip animation classes and the\n   * `TooltipTrigger` unmounts the overlay immediately on close (no\n   * `animationend` dependency).\n   */\n  reducedMotion: boolean;\n}\n\nexport const TooltipAnimationContext = createContext<TooltipAnimationContextValue>({\n  isExiting: false,\n  onAnimationEnd: () => undefined,\n  reducedMotion: false,\n});\n\n/**\n * Convenience hook for `Tooltip` / `RichTooltip` to consume the animation\n * context without importing the raw context object.\n */\nexport function useTooltipAnimation(): TooltipAnimationContextValue {\n  return useContext(TooltipAnimationContext);\n}\n\n// ─── TooltipTrigger ───────────────────────────────────────────────────────────\n\nexport interface TooltipTriggerStyledProps {\n  /**\n   * Exactly two children:\n   * 1. The interactive trigger element (button, anchor, etc.)\n   * 2. A `Tooltip` or `RichTooltip` component\n   */\n  children: [ReactNode, ReactNode];\n  /**\n   * Hover delay in ms before the tooltip opens.\n   * @default 300\n   */\n  delay?: number;\n  /** When true, the tooltip will not open. */\n  isDisabled?: boolean;\n}\n\n/**\n * `TooltipTrigger` — Layer 3 styled trigger wrapper with MD3 animation.\n *\n * Wraps `TooltipTriggerHeadless` and manages the enter/exit animation state\n * machine so that tooltips fade/scale in on open and fade/scale out before\n * unmounting from the DOM, per MD3 motion specs.\n *\n * When `prefers-reduced-motion: reduce` is active the overlay is unmounted\n * immediately on close — no exit animation, no `animationend` dependency.\n * This prevents the stuck-mount bug that occurs when the global CSS reset\n * collapses animations and `animationend` never fires.\n *\n * Animation state machine (standard motion):\n * 1. RA fires `onOpenChange(true)`  → mount overlay, play entry animation\n * 2. RA fires `onOpenChange(false)` → keep mounted, play exit animation\n * 3. `animationend` fires          → unmount overlay\n *\n * Animation state machine (reduced motion):\n * 1. RA fires `onOpenChange(true)`  → mount overlay, no animation\n * 2. RA fires `onOpenChange(false)` → unmount overlay immediately\n *\n * @example\n * ```tsx\n * <TooltipTrigger delay={300}>\n *   <button>Save</button>\n *   <Tooltip placement=\"top\">Save file</Tooltip>\n * </TooltipTrigger>\n * ```\n */\nexport function TooltipTrigger({\n  children,\n  delay = 300,\n  isDisabled,\n}: TooltipTriggerStyledProps): JSX.Element {\n  const reducedMotion = useReducedMotion();\n\n  const [isMounted, setIsMounted] = useState(false);\n  const [isExiting, setIsExiting] = useState(false);\n\n  const isExitingRef = useRef(false);\n  const isPointerOverTooltipRef = useRef(false);\n  const pendingCloseRef = useRef(false);\n\n  /**\n   * Unmounts the overlay immediately (reduced motion path or forced close).\n   * Resets all animation refs to a clean state.\n   */\n  const unmountImmediately = useCallback(() => {\n    isExitingRef.current = false;\n    pendingCloseRef.current = false;\n    setIsMounted(false);\n    setIsExiting(false);\n  }, []);\n\n  /**\n   * Stable callback — React Aria calls this when it wants to open or close.\n   *\n   * On open  → cancel any pending close, mount overlay, play entry animation.\n   * On close → if pointer is over the tooltip surface, defer the close until\n   *            the pointer leaves (prevents flicker when hovering the portal).\n   *            Otherwise:\n   *              - reduced motion: unmount immediately (no animationend needed)\n   *              - standard motion: start exit animation, unmount on animationend\n   */\n  const handleOpenChange = useCallback(\n    (open: boolean) => {\n      if (open) {\n        pendingCloseRef.current = false;\n        isExitingRef.current = false;\n        setIsMounted(true);\n        setIsExiting(false);\n      } else if (isPointerOverTooltipRef.current) {\n        pendingCloseRef.current = true;\n      } else if (reducedMotion) {\n        unmountImmediately();\n      } else if (!isExitingRef.current) {\n        isExitingRef.current = true;\n        setIsExiting(true);\n      }\n    },\n    [reducedMotion, unmountImmediately]\n  );\n\n  /**\n   * Stable callback — called by the tooltip element's `onAnimationEnd` event.\n   * Unmounts the overlay after the exit animation completes (standard motion only).\n   *\n   * The guard ensures the entry animation's `animationend` event is ignored —\n   * only the exit animation should trigger unmounting.\n   */\n  const handleAnimationEnd = useCallback(() => {\n    if (!isExitingRef.current) return;\n    unmountImmediately();\n  }, [unmountImmediately]);\n\n  const handleOverlayPointerEnter = useCallback(() => {\n    isPointerOverTooltipRef.current = true;\n    pendingCloseRef.current = false;\n  }, []);\n\n  const handleOverlayPointerLeave = useCallback(() => {\n    isPointerOverTooltipRef.current = false;\n    if (pendingCloseRef.current) {\n      pendingCloseRef.current = false;\n      if (reducedMotion) {\n        unmountImmediately();\n      } else if (!isExitingRef.current) {\n        isExitingRef.current = true;\n        setIsExiting(true);\n      }\n    }\n  }, [reducedMotion, unmountImmediately]);\n\n  const contextValue: TooltipAnimationContextValue = {\n    isExiting,\n    onAnimationEnd: handleAnimationEnd,\n    reducedMotion,\n  };\n\n  const [triggerChild, tooltipChild] = children;\n\n  // Extract placement from the tooltip child's props so TooltipOverlayHeadless\n  // can position correctly without requiring an extra prop on TooltipTrigger.\n  const placement: TooltipPlacement = isValidElement<{ placement?: TooltipPlacement }>(tooltipChild)\n    ? (tooltipChild.props.placement ?? \"top\")\n    : \"top\";\n\n  return (\n    <TooltipAnimationContext.Provider value={contextValue}>\n      <TooltipTriggerHeadless\n        delay={delay}\n        forceMount={isMounted}\n        onOpenChange={handleOpenChange}\n        {...(isDisabled !== undefined && { isDisabled })}\n      >\n        {triggerChild}\n        {/*\n         * TooltipTriggerHeadless clones this element and injects:\n         *   - tooltipProps (id, role) from useTooltipTrigger\n         *   - triggerRef   for useOverlayPosition\n         * offset={4} = 4dp gap per MD3 spec.\n         */}\n        <TooltipOverlayHeadless\n          tooltipProps={{}}\n          placement={placement}\n          offset={4}\n          onPointerEnter={handleOverlayPointerEnter}\n          onPointerLeave={handleOverlayPointerLeave}\n        >\n          {tooltipChild}\n        </TooltipOverlayHeadless>\n      </TooltipTriggerHeadless>\n    </TooltipAnimationContext.Provider>\n  );\n}\n","import { cva, type VariantProps } from \"class-variance-authority\";\n\n/**\n * Material Design 3 Tooltip Variants\n *\n * Architecture: Variants vs States\n * - CVA holds design-time structure only (no hover/focus state variants).\n * - The `animation` variant is the only runtime switch — driven by the\n *   `TooltipAnimationContext` in `TooltipTrigger`.\n * - Rich tooltip sub-elements are each their own slot CVA so inline class\n *   strings are never hardcoded in JSX.\n *\n * Slot responsibilities:\n *   tooltipVariants               — plain tooltip container\n *   richTooltipVariants           — rich tooltip container\n *   richTooltipTitleVariants      — optional subhead / title row\n *   richTooltipSupportingTextVariants — multi-line body text\n *   richTooltipActionsVariants    — action button row (optional)\n *\n * MD3 Plain Tooltip spec:\n *   Background:  inverse-surface\n *   Text:        inverse-on-surface, body-small (12sp)\n *   Shape:       corner-extra-small (4dp, rounded-xs)\n *   Min height:  24dp\n *   Max width:   200dp\n *   Padding:     8dp horizontal × 4dp vertical\n *   Elevation:   none (tonal surface provides contrast)\n *\n * MD3 Rich Tooltip spec:\n *   Background:  surface-container\n *   Text:        on-surface\n *   Subhead:     on-surface-variant, title-small\n *   Supporting:  on-surface-variant, body-medium\n *   Shape:       corner-medium (12dp, rounded-md)\n *   Min height:  24dp\n *   Max width:   320dp\n *   Padding:     16dp horizontal × 12dp vertical\n *   Elevation:   level-2 (shadow-elevation-2)\n *   Actions:     text button, 12dp top gap, flush-left inset to content edge\n */\n\n// ─── ANIMATION VARIANT ───────────────────────────────────────────────────────\n\n/**\n * Three-state animation discriminant.\n *\n * `enter` — component mounting, play scale-in animation\n * `exit`  — component unmounting, play scale-out animation\n * `none`  — `prefers-reduced-motion: reduce` is active; skip all transforms\n */\ntype TooltipAnimationState = \"enter\" | \"exit\" | \"none\";\n\n// ─── PLAIN TOOLTIP ────────────────────────────────────────────────────────────\n\n/**\n * Plain tooltip container.\n *\n * Renders an inline-flex pill that vertically centres a single-line text label\n * against the 24dp minimum height.\n *\n * MD3 Tokens:\n * - `bg-inverse-surface`       — inverted surface for maximum contrast\n * - `text-inverse-on-surface`  — content colour on inverted surface\n * - `rounded-xs`               — 4dp corner radius (CornerExtraSmall)\n * - `text-body-small`          — BodySmall typescale (12sp)\n * - `min-h-6`                  — 24dp minimum height\n * - `max-w-50`                 — 200dp maximum width\n * - `px-2 py-1`                — 8dp × 4dp padding\n * - `z-50`                     — above all page content\n *\n * Motion:\n * - `enter` → `animate-md-scale-in`  (expressive-fast-spatial: 350ms, scale 0.85 → 1 + fade)\n * - `exit`  → `animate-md-scale-out` (emphasized-accelerate: 200ms, scale 1 → 0.85 + fade)\n * - `none`  → no animation class     (prefers-reduced-motion guard)\n */\nexport const tooltipVariants = cva(\n  [\n    \"z-50 inline-flex items-center w-fit\",\n    \"min-h-6 rounded-xs px-2 py-1\",\n    \"text-body-small tracking-[0.4px] bg-inverse-surface text-inverse-on-surface\",\n    \"max-w-50\",\n  ],\n  {\n    variants: {\n      /**\n       * Controls the enter/exit animation class.\n       * Managed by `TooltipTrigger`'s animation state machine.\n       * Set to `\"none\"` when `prefers-reduced-motion: reduce` is active.\n       * @default \"enter\"\n       */\n      animation: {\n        enter: \"animate-md-scale-in\",\n        exit: \"animate-md-scale-out\",\n        none: \"\",\n      },\n    },\n    defaultVariants: {\n      animation: \"enter\",\n    },\n  }\n);\n\n// ─── RICH TOOLTIP CONTAINER ───────────────────────────────────────────────────\n\n/**\n * Rich tooltip container.\n *\n * Wraps the title, supporting text, and optional action row in a flex column.\n *\n * MD3 Tokens:\n * - `bg-surface-container`   — surface container background\n * - `text-on-surface`        — content colour on surface\n * - `shadow-elevation-2`     — MD3 elevation level 2\n * - `rounded-md`             — 12dp corner radius (CornerMedium)\n * - `min-h-6`                — 24dp minimum height\n * - `max-w-80`               — 320dp maximum width\n * - `px-4 py-3`              — 16dp × 12dp padding\n * - `z-50`                   — above all page content\n *\n * Motion: same `animation` variant as plain tooltip.\n */\nexport const richTooltipVariants = cva(\n  [\n    \"z-50 flex flex-col w-fit\",\n    \"min-h-6 rounded-md px-4 py-3\",\n    \"bg-surface-container text-on-surface shadow-elevation-2\",\n    \"max-w-80\",\n  ],\n  {\n    variants: {\n      /**\n       * Controls the enter/exit animation class.\n       * Managed by `TooltipTrigger`'s animation state machine.\n       * Set to `\"none\"` when `prefers-reduced-motion: reduce` is active.\n       * @default \"enter\"\n       */\n      animation: {\n        enter: \"animate-md-scale-in\",\n        exit: \"animate-md-scale-out\",\n        none: \"\",\n      },\n    },\n    defaultVariants: {\n      animation: \"enter\",\n    },\n  }\n);\n\n// ─── RICH TOOLTIP SLOTS ───────────────────────────────────────────────────────\n\n/**\n * Rich tooltip subhead / title row.\n *\n * MD3 Tokens:\n * - `text-title-small`       — TitleSmall typescale\n * - `text-on-surface-variant`— MD3 rich-tooltip subhead colour role\n * - `mb-1`                   — 4dp gap below title (before supporting text)\n */\nexport const richTooltipTitleVariants = cva([\n  \"text-title-small font-medium text-on-surface-variant mb-1\",\n]);\n\n/**\n * Rich tooltip supporting text body.\n *\n * MD3 Tokens:\n * - `text-body-medium`        — BodyMedium typescale\n * - `text-on-surface-variant` — same colour role as subhead per spec\n */\nexport const richTooltipSupportingTextVariants = cva([\"text-body-medium text-on-surface-variant\"]);\n\n/**\n * Rich tooltip action row.\n *\n * Renders the optional text Button flush to the content left edge.\n * The `-ml-2` inset compensates for the text Button's own 12dp px-3 padding\n * so the label aligns visually with the supporting text above it.\n *\n * MD3 spec: action sits 12dp below the supporting text body (`mt-3`).\n */\nexport const richTooltipActionsVariants = cva([\"flex items-center justify-start mt-3 -ml-2\"]);\n\n// ─── EXPORTED TYPES ───────────────────────────────────────────────────────────\n\nexport type { TooltipAnimationState };\nexport type TooltipVariants = VariantProps<typeof tooltipVariants>;\nexport type RichTooltipVariants = VariantProps<typeof richTooltipVariants>;\nexport type RichTooltipTitleVariants = VariantProps<typeof richTooltipTitleVariants>;\nexport type RichTooltipSupportingTextVariants = VariantProps<\n  typeof richTooltipSupportingTextVariants\n>;\nexport type RichTooltipActionsVariants = VariantProps<typeof richTooltipActionsVariants>;\n","\"use client\";\n\nimport { forwardRef } from \"react\";\nimport type { JSX } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { useTooltipAnimation } from \"./TooltipTrigger\";\nimport { tooltipVariants } from \"./Tooltip.variants\";\nimport type { TooltipAnimationState } from \"./Tooltip.variants\";\nimport type { TooltipProps } from \"./Tooltip.types\";\n\n/**\n * `Tooltip` — Layer 3 MD3 Plain Tooltip styled component.\n *\n * Renders a single-line text label with MD3 inverse-surface styling.\n * Animation is driven by the `TooltipAnimationContext` provided by\n * `TooltipTrigger`:\n * - Entry: `animate-md-scale-in`  (expressive-fast-spatial: 350ms, scale 0.85 → 1 + fade)\n * - Exit:  `animate-md-scale-out` (emphasized-accelerate: 200ms, scale 1 → 0.85 + fade)\n * - None:  no animation class when `prefers-reduced-motion: reduce` is active\n *\n * MD3 Tokens applied:\n * - `bg-inverse-surface`      — inverted surface for maximum contrast\n * - `text-inverse-on-surface` — content colour on inverted surface\n * - `rounded-xs`              — 4dp corner radius (CornerExtraSmall)\n * - `text-body-small`         — BodySmall typescale (12sp)\n * - `min-h-6`                 — 24dp minimum height\n * - `max-w-50`                — 200dp maximum width\n * - `px-2 py-1`               — 8dp × 4dp padding\n *\n * Must be used as the second child of `TooltipTrigger`.\n *\n * @example\n * ```tsx\n * <TooltipTrigger delay={300}>\n *   <button>Save</button>\n *   <Tooltip placement=\"top\">Save file</Tooltip>\n * </TooltipTrigger>\n * ```\n */\nexport const Tooltip = forwardRef<HTMLDivElement, TooltipProps>(\n  ({ children, className, placement: _placement }, ref): JSX.Element => {\n    const { isExiting, onAnimationEnd, reducedMotion } = useTooltipAnimation();\n\n    const animation: TooltipAnimationState = reducedMotion ? \"none\" : isExiting ? \"exit\" : \"enter\";\n\n    return (\n      <div\n        ref={ref}\n        className={cn(tooltipVariants({ animation }), className)}\n        onAnimationEnd={onAnimationEnd}\n      >\n        {children}\n      </div>\n    );\n  }\n);\n\nTooltip.displayName = \"Tooltip\";\n","\"use client\";\n\nimport { forwardRef } from \"react\";\nimport type { JSX } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { useTooltipAnimation } from \"./TooltipTrigger\";\nimport {\n  richTooltipVariants,\n  richTooltipTitleVariants,\n  richTooltipSupportingTextVariants,\n  richTooltipActionsVariants,\n} from \"./Tooltip.variants\";\nimport type { TooltipAnimationState } from \"./Tooltip.variants\";\nimport type { RichTooltipProps } from \"./Tooltip.types\";\n\n/**\n * `RichTooltip` — Layer 3 MD3 Rich Tooltip styled component.\n *\n * Supports an optional title (subhead), multi-line supporting text, and an\n * optional action button per MD3 Rich Tooltip specification.\n * Animation is driven by the `TooltipAnimationContext` provided by\n * `TooltipTrigger`:\n * - Entry: `animate-md-scale-in`  (expressive-fast-spatial: 350ms)\n * - Exit:  `animate-md-scale-out` (emphasized-accelerate: 200ms)\n * - None:  no animation class when `prefers-reduced-motion: reduce` is active\n *\n * MD3 Tokens applied — container:\n * - `bg-surface-container`   — surface container background\n * - `text-on-surface`        — base content colour\n * - `shadow-elevation-2`     — MD3 elevation level 2\n * - `rounded-md`             — 12dp corner radius (CornerMedium)\n * - `max-w-80`               — 320dp maximum width\n * - `px-4 py-3`              — 16dp × 12dp padding\n *\n * MD3 Tokens applied — subhead (title):\n * - `text-title-small`        — TitleSmall typescale\n * - `text-on-surface-variant` — subhead colour role per MD3 spec\n *\n * MD3 Tokens applied — supporting text:\n * - `text-body-medium`        — BodyMedium typescale\n * - `text-on-surface-variant` — same colour role as subhead\n *\n * Must be used as the second child of `TooltipTrigger`.\n *\n * @example\n * ```tsx\n * <TooltipTrigger delay={300}>\n *   <button>Add to list</button>\n *   <RichTooltip\n *     title=\"Add to list\"\n *     action={<Button variant=\"text\">Learn more</Button>}\n *   >\n *     Saved items appear in your personal list.\n *   </RichTooltip>\n * </TooltipTrigger>\n * ```\n */\nexport const RichTooltip = forwardRef<HTMLDivElement, RichTooltipProps>(\n  ({ title, children, action, className, placement: _placement }, ref): JSX.Element => {\n    const { isExiting, onAnimationEnd, reducedMotion } = useTooltipAnimation();\n\n    const animation: TooltipAnimationState = reducedMotion ? \"none\" : isExiting ? \"exit\" : \"enter\";\n\n    return (\n      <div\n        ref={ref}\n        className={cn(richTooltipVariants({ animation }), className)}\n        onAnimationEnd={onAnimationEnd}\n      >\n        {title && <p className={richTooltipTitleVariants()}>{title}</p>}\n        <p className={richTooltipSupportingTextVariants()}>{children}</p>\n        {action && <div className={richTooltipActionsVariants()}>{action}</div>}\n      </div>\n    );\n  }\n);\n\nRichTooltip.displayName = \"RichTooltip\";\n","\"use client\";\n\nimport { Children, createContext, forwardRef, isValidElement, useContext, useRef } from \"react\";\nimport type React from \"react\";\nimport { useListBox, useOption } from \"react-aria\";\nimport { Item, useListState } from \"react-stately\";\nimport type { ListState } from \"react-stately\";\nimport type { ListHeadlessProps, ListItemProps } from \"./List.types\";\n\n// ─── Context ──────────────────────────────────────────────────────────────────\n\ninterface ListContextValue {\n  isInteractive: true;\n  state: ListState<object>;\n}\n\nconst ListContext = createContext<ListContextValue | null>(null);\n\nexport function useListContext(): ListContextValue | null {\n  return useContext(ListContext);\n}\n\n// ─── Helpers ──────────────────────────────────────────────────────────────────\n\n/**\n * Extracts ListItemHeadless props from children so we can build the\n * React Aria `Item` collection required by `useListState`.\n */\nfunction extractItemProps(children: React.ReactNode): ListItemProps[] {\n  const items: ListItemProps[] = [];\n  Children.forEach(children, (child) => {\n    if (isValidElement<ListItemProps>(child)) {\n      items.push(child.props);\n    }\n  });\n  return items;\n}\n\n// ─── ListHeadless ─────────────────────────────────────────────────────────────\n\n/**\n * Headless List container (Layer 2).\n *\n * Renders an accessible list with two operating modes:\n *\n * | Condition | Element | ARIA role |\n * |---|---|---|\n * | `selectionMode === 'none'` AND no `onAction` | `<ul>` | `list` |\n * | `selectionMode` is `'single'`/`'multiple'`, OR `onAction` given | `<ul>` | `listbox` (via `useListBox`) |\n *\n * @example\n * ```tsx\n * // Static\n * <ListHeadless aria-label=\"Settings\">\n *   <ListItemHeadless value=\"wifi\" headline=\"Wi-Fi\" />\n * </ListHeadless>\n *\n * // Interactive\n * <ListHeadless aria-label=\"Alignment\" selectionMode=\"single\">\n *   <ListItemHeadless value=\"left\" headline=\"Left\" />\n * </ListHeadless>\n * ```\n */\nexport const ListHeadless = forwardRef<HTMLUListElement, ListHeadlessProps>(function ListHeadless(\n  {\n    selectionMode = \"none\",\n    selectedKeys,\n    defaultSelectedKeys,\n    onSelectionChange,\n    onAction,\n    className,\n    children,\n    ...rest\n  },\n  forwardedRef\n) {\n  const isInteractive = selectionMode !== \"none\" || onAction !== undefined;\n\n  if (isInteractive) {\n    return (\n      <InteractiveList\n        ref={forwardedRef}\n        selectionMode={selectionMode}\n        {...(selectedKeys !== undefined ? { selectedKeys } : {})}\n        {...(defaultSelectedKeys !== undefined ? { defaultSelectedKeys } : {})}\n        {...(onSelectionChange ? { onSelectionChange } : {})}\n        {...(onAction ? { onAction } : {})}\n        {...(className !== undefined ? { className } : {})}\n        {...(rest[\"aria-label\"] !== undefined ? { \"aria-label\": rest[\"aria-label\"] } : {})}\n        {...(rest[\"aria-labelledby\"] !== undefined\n          ? { \"aria-labelledby\": rest[\"aria-labelledby\"] }\n          : {})}\n      >\n        {children}\n      </InteractiveList>\n    );\n  }\n\n  return (\n    <ul\n      ref={forwardedRef}\n      role=\"list\"\n      className={className}\n      aria-label={rest[\"aria-label\"]}\n      aria-labelledby={rest[\"aria-labelledby\"]}\n    >\n      {children}\n    </ul>\n  );\n});\n\nListHeadless.displayName = \"ListHeadless\";\n\n// ─── InteractiveList (internal) ───────────────────────────────────────────────\n\n/**\n * Separated into its own component so React Aria hooks (`useListState`,\n * `useListBox`) are always called unconditionally (Rules of Hooks).\n */\nconst InteractiveList = forwardRef<HTMLUListElement, ListHeadlessProps>(function InteractiveList(\n  {\n    selectionMode = \"none\",\n    selectedKeys,\n    defaultSelectedKeys,\n    onSelectionChange,\n    onAction,\n    className,\n    children,\n    ...rest\n  },\n  forwardedRef\n) {\n  const internalRef = useRef<HTMLUListElement>(null);\n  const ref = (forwardedRef ?? internalRef) as React.RefObject<HTMLUListElement>;\n\n  const itemProps = extractItemProps(children);\n\n  const disabledKeys = itemProps.filter((item) => item.isDisabled).map((item) => item.value);\n\n  const collectionChildren = itemProps.map((item) => (\n    <Item key={item.value} textValue={item.headline}>\n      {item.headline}\n    </Item>\n  ));\n\n  const resolvedMode = selectionMode === \"none\" ? undefined : selectionMode;\n\n  const state = useListState({\n    children: collectionChildren,\n    ...(resolvedMode !== undefined ? { selectionMode: resolvedMode } : {}),\n    ...(selectedKeys !== undefined ? { selectedKeys } : {}),\n    ...(defaultSelectedKeys !== undefined ? { defaultSelectedKeys } : {}),\n    ...(onSelectionChange ? { onSelectionChange } : {}),\n    ...(onAction ? { onAction } : {}),\n    disabledKeys,\n  });\n\n  const ariaLabel = rest[\"aria-label\"];\n  const ariaLabelledby = rest[\"aria-labelledby\"];\n\n  const { listBoxProps } = useListBox(\n    {\n      ...(ariaLabel !== undefined ? { \"aria-label\": ariaLabel } : {}),\n      ...(ariaLabelledby !== undefined ? { \"aria-labelledby\": ariaLabelledby } : {}),\n      ...(resolvedMode !== undefined ? { selectionMode: resolvedMode } : {}),\n      ...(selectedKeys !== undefined ? { selectedKeys } : {}),\n      ...(defaultSelectedKeys !== undefined ? { defaultSelectedKeys } : {}),\n      ...(onSelectionChange ? { onSelectionChange } : {}),\n      ...(onAction ? { onAction } : {}),\n      disabledKeys,\n    },\n    state,\n    ref\n  );\n\n  return (\n    <ListContext.Provider value={{ isInteractive: true, state }}>\n      <ul {...listBoxProps} ref={ref} className={className}>\n        {Children.map(children, (child) => {\n          if (isValidElement<ListItemProps>(child)) {\n            return child;\n          }\n          return null;\n        })}\n      </ul>\n    </ListContext.Provider>\n  );\n});\n\nInteractiveList.displayName = \"InteractiveList\";\n\n// ─── ListItemHeadless ─────────────────────────────────────────────────────────\n\n/**\n * Headless List Item (Layer 2).\n *\n * Renders an accessible list item:\n * - **Static mode**: `<li role=\"listitem\">`, not focusable\n * - **Interactive mode**: `<li>` with `useOption` providing `role=\"option\"`,\n *   `aria-selected`, `aria-disabled`, and keyboard interaction\n *\n * @example\n * ```tsx\n * <ListItemHeadless value=\"wifi\" headline=\"Wi-Fi\" supportingText=\"Connected\" />\n * ```\n */\nexport const ListItemHeadless = forwardRef<HTMLLIElement, ListItemProps>(function ListItemHeadless(\n  { value, headline, supportingText, overline, className },\n  forwardedRef\n) {\n  const ctx = useListContext();\n\n  if (ctx) {\n    return (\n      <InteractiveListItem\n        ref={forwardedRef}\n        value={value}\n        headline={headline}\n        {...(supportingText !== undefined ? { supportingText } : {})}\n        {...(overline !== undefined ? { overline } : {})}\n        {...(className !== undefined ? { className } : {})}\n        state={ctx.state}\n      />\n    );\n  }\n\n  return (\n    <li ref={forwardedRef} role=\"listitem\" className={className}>\n      {overline && <span>{overline}</span>}\n      <span>{headline}</span>\n      {supportingText && <span>{supportingText}</span>}\n    </li>\n  );\n});\n\nListItemHeadless.displayName = \"ListItemHeadless\";\n\n// ─── InteractiveListItem (internal) ───────────────────────────────────────────\n\ninterface InteractiveListItemInternalProps {\n  value: string | number;\n  headline: string;\n  supportingText?: string;\n  overline?: string;\n  className?: string;\n  state: ListState<object>;\n}\n\nconst InteractiveListItem = forwardRef<HTMLLIElement, InteractiveListItemInternalProps>(\n  function InteractiveListItem(\n    { value, headline, supportingText, overline, className, state },\n    forwardedRef\n  ) {\n    const internalRef = useRef<HTMLLIElement>(null);\n    const ref = (forwardedRef ?? internalRef) as React.RefObject<HTMLLIElement>;\n\n    const { optionProps, isSelected, isDisabled } = useOption({ key: value }, state, ref);\n\n    return (\n      <li\n        {...optionProps}\n        ref={ref}\n        className={className}\n        data-selected={isSelected || undefined}\n        data-disabled={isDisabled || undefined}\n      >\n        {overline && <span>{overline}</span>}\n        <span>{headline}</span>\n        {supportingText && <span>{supportingText}</span>}\n      </li>\n    );\n  }\n);\n\nInteractiveListItem.displayName = \"InteractiveListItem\";\n","import { cva, type VariantProps } from \"class-variance-authority\";\n\n/**\n * Material Design 3 List Variants\n *\n * Architecture: Variants vs States\n * - CVA holds design-time structure only (density, slot type).\n * - All interaction/selection states are driven by data-* attributes on the root <li>\n *   via group-data-[x]/list-item Tailwind selectors in each slot's base classes.\n * - Content flags (data-with-leading, data-with-trailing) are set explicitly by ListItem.\n *\n * Slot responsibilities:\n *   listVariants               — container <ul>; bg-surface\n *   listItemVariants           — root <li>; group/list-item; density height; cursor; disabled\n *   listItemStateLayerVariants — absolute inset overlay; hover/focus/pressed opacity ring\n *   listItemFocusRingVariants  — keyboard focus indicator outline\n *   listItemLeadingVariants    — leading slot wrapper; type-specific size/shape + color states\n *   listItemTrailingVariants   — trailing slot wrapper; type-specific size/shape + color states\n *   listItemOverlineVariants   — overline text; color reacts to selected/disabled\n *   listItemHeadlineVariants   — headline text; color reacts to selected/disabled\n *   listItemSupportingTextVariants — supporting text; color reacts to selected/disabled\n *\n * MD3 Spec (lists/specs):\n *   One-line:   56dp min-height\n *   Two-line:   72dp min-height\n *   Three-line: 88dp min-height (leading/trailing top-aligned)\n *   Padding: 16dp horizontal, 8dp vertical\n *   Leading icon: 24dp, text-on-surface-variant\n *   Leading avatar: 40dp circle\n *   State-layer opacities: hover 8% | focus 10% | pressed 10%\n *   Disabled: content 38% opacity, pointer-events none\n *   Selected: bg-secondary-container, text/icons on-secondary-container\n */\n\n// ─── LIST CONTAINER ───────────────────────────────────────────────────────────\n\n/**\n * List container (<ul>).\n * MD3: Lists use `surface` color role for their container.\n */\nexport const listVariants = cva(\"w-full bg-surface\");\n\n// ─── LIST ITEM ROOT ───────────────────────────────────────────────────────────\n\n/**\n * Root <li> element — carries `group/list-item` and emits data-* interaction attributes.\n *\n * Design-time variant: `density` only.\n * All interaction/selection states are driven via group-data-[x]/list-item selectors\n * in the slot CVAs below — NOT as CVA variant keys here.\n *\n *   one-line:   56dp (min-h-14)\n *   two-line:   72dp (min-h-18)\n *   three-line: 88dp (min-h-22, items-start for top-aligned slots)\n *\n * Selected background: group-data-[selected]/list-item:bg-secondary-container\n * Interactive cursor: data-[interactive]:cursor-pointer\n * Disabled: self-targeting data-[disabled]: selectors (38% + no pointer)\n */\nexport const listItemVariants = cva(\n  [\n    // Layout\n    \"relative flex items-center overflow-hidden px-4 py-2 select-none\",\n    // Color transition — effects spring (no spatial overshoot on color)\n    \"transition-colors duration-spring-standard-fast-effects ease-spring-standard-fast-effects\",\n    // Cursor: non-interactive base; data-[interactive] overrides\n    \"cursor-default\",\n    \"data-[interactive]:cursor-pointer\",\n    // Selected: secondary-container background\n    \"group-data-[selected]/list-item:bg-secondary-container\",\n    // Disabled: self-targeting selectors (not group, since root is the group)\n    \"data-[disabled]:opacity-38 data-[disabled]:pointer-events-none data-[disabled]:cursor-not-allowed\",\n  ],\n  {\n    variants: {\n      /**\n       * Visual density — derived from content, not a user prop.\n       * one-line:   headline only (56dp)\n       * two-line:   headline + supportingText (72dp)\n       * three-line: overline + headline + supportingText (88dp)\n       */\n      density: {\n        \"one-line\": \"min-h-14\",\n        \"two-line\": \"min-h-18\",\n        \"three-line\": \"min-h-22 items-start\",\n      },\n    },\n\n    defaultVariants: {\n      density: \"one-line\",\n    },\n  }\n);\n\n// ─── STATE LAYER ─────────────────────────────────────────────────────────────\n\n/**\n * State layer — absolute inset overlay that transitions opacity on interaction.\n *\n * Color: bg-on-surface (matches MD3 list item state layer color on surface).\n * On selected items (bg-secondary-container), MD3 uses on-secondary-container\n * for the state layer. We keep bg-on-surface and let the background provide context.\n *\n * Opacity:\n *   0 at rest\n *   8% hover  (group-data-[hovered]/list-item:)\n *   10% focus (group-data-[focus-visible]/list-item:)\n *   10% pressed — doubled selector wins over hover at same cascade position\n *   hidden when disabled\n */\nexport const listItemStateLayerVariants = cva([\n  \"absolute inset-0 pointer-events-none opacity-0\",\n  \"bg-on-surface\",\n  // Effects transition for opacity — no spatial overshoot\n  \"transition-opacity duration-spring-standard-fast-effects ease-spring-standard-fast-effects\",\n  // Hover: 8%\n  \"group-data-[hovered]/list-item:opacity-8\",\n  // Focus: 10%\n  \"group-data-[focus-visible]/list-item:opacity-10\",\n  // Pressed: 10%, doubled selector beats hover\n  \"group-data-[pressed]/list-item:group-data-[pressed]/list-item:opacity-10\",\n  // No state layer when disabled\n  \"group-data-[disabled]/list-item:hidden\",\n]);\n\n// ─── FOCUS RING ───────────────────────────────────────────────────────────────\n\n/**\n * Focus ring — absolute inset outline for keyboard/programmatic focus.\n *\n * Uses an inset outline (not a box-shadow or extra padding) so it stays\n * clipped to the list item bounds. opacity transitions rather than display\n * toggling allows smooth animation.\n */\nexport const listItemFocusRingVariants = cva([\n  \"pointer-events-none absolute inset-0\",\n  \"outline outline-2 -outline-offset-2 outline-secondary\",\n  // Effects transition — opacity must NOT overshoot\n  \"transition-opacity duration-spring-standard-fast-effects ease-spring-standard-fast-effects\",\n  \"opacity-0\",\n  \"group-data-[focus-visible]/list-item:opacity-100\",\n]);\n\n// ─── LEADING SLOT ─────────────────────────────────────────────────────────────\n\n/**\n * Leading slot wrapper.\n *\n * type-specific styling:\n *   icon   — 24dp, text-on-surface-variant at rest, reacts to selected/disabled\n *   avatar — 40dp circle, overflow-hidden (no color tokens, content provides color)\n *   checkbox / radio — no sizing; slot is purely a layout wrapper\n *\n * For checkbox/radio, selection semantics come from the parent <li>'s useOption\n * (aria-selected), so these slots are wrapped in aria-hidden by ListItemLeading.\n */\nexport const listItemLeadingVariants = cva(\n  [\n    \"mr-4 flex shrink-0 items-center\",\n    // Effects transition for icon color changes\n    \"transition-colors duration-spring-standard-fast-effects ease-spring-standard-fast-effects\",\n  ],\n  {\n    variants: {\n      type: {\n        icon: [\n          \"size-6\",\n          \"text-on-surface-variant\",\n          // Selected: icon color changes to on-secondary-container\n          \"group-data-[selected]/list-item:text-on-secondary-container\",\n          // Disabled: 38% (inherited from root opacity-38, but also explicit for color accuracy)\n          \"group-data-[disabled]/list-item:text-on-surface/38\",\n        ],\n        avatar: [\n          \"size-10 overflow-hidden rounded-full\",\n          // Avatar color provided by content; no token overrides needed\n        ],\n        checkbox: [],\n        radio: [],\n      },\n    },\n    defaultVariants: {\n      type: \"icon\",\n    },\n  }\n);\n\n// ─── TRAILING SLOT ────────────────────────────────────────────────────────────\n\n/**\n * Trailing slot wrapper.\n *\n * type-specific styling:\n *   icon   — 24dp, text-on-surface-variant, reacts to selected/disabled\n *   text   — label-small typography, text-on-surface-variant, reacts to selected/disabled\n *   checkbox / radio — no sizing; selection semantics come from useOption\n */\nexport const listItemTrailingVariants = cva(\n  [\n    \"ml-auto flex shrink-0 items-center\",\n    // Effects transition for color changes\n    \"transition-colors duration-spring-standard-fast-effects ease-spring-standard-fast-effects\",\n  ],\n  {\n    variants: {\n      type: {\n        icon: [\n          \"size-6\",\n          \"text-on-surface-variant\",\n          \"group-data-[selected]/list-item:text-on-secondary-container\",\n          \"group-data-[disabled]/list-item:text-on-surface/38\",\n        ],\n        text: [\n          \"text-label-small\",\n          \"text-on-surface-variant\",\n          \"group-data-[selected]/list-item:text-on-secondary-container\",\n          \"group-data-[disabled]/list-item:text-on-surface/38\",\n        ],\n        checkbox: [],\n        radio: [],\n      },\n    },\n    defaultVariants: {\n      type: \"icon\",\n    },\n  }\n);\n\n// ─── TEXT SLOTS ───────────────────────────────────────────────────────────────\n\n/**\n * Overline text — appears above the headline in three-line density.\n * MD3: label-small typography, on-surface-variant color at rest.\n */\nexport const listItemOverlineVariants = cva([\n  \"text-label-small\",\n  \"text-on-surface-variant\",\n  // Effects transition for color\n  \"transition-colors duration-spring-standard-fast-effects ease-spring-standard-fast-effects\",\n  // Selected: on-secondary-container\n  \"group-data-[selected]/list-item:text-on-secondary-container\",\n  // Disabled: opacity inherited from root; explicit for color\n  \"group-data-[disabled]/list-item:text-on-surface/38\",\n]);\n\n/**\n * Headline text — primary list item label.\n * MD3: body-large typography, on-surface color at rest.\n */\nexport const listItemHeadlineVariants = cva([\n  \"text-body-large\",\n  \"text-on-surface\",\n  // Effects transition for color\n  \"transition-colors duration-spring-standard-fast-effects ease-spring-standard-fast-effects\",\n  // Selected: on-secondary-container\n  \"group-data-[selected]/list-item:text-on-secondary-container\",\n  // Disabled: 38% color via CSS (opacity-38 on root handles all descendants, but\n  // explicit token ensures predictable rendering when color is specified).\n  \"group-data-[disabled]/list-item:text-on-surface/38\",\n]);\n\n/**\n * Supporting text — secondary label below the headline.\n * MD3: body-medium typography, on-surface-variant color at rest.\n */\nexport const listItemSupportingTextVariants = cva([\n  \"text-body-medium\",\n  \"text-on-surface-variant\",\n  // Effects transition for color\n  \"transition-colors duration-spring-standard-fast-effects ease-spring-standard-fast-effects\",\n  // Selected: on-secondary-container\n  \"group-data-[selected]/list-item:text-on-secondary-container\",\n  // Disabled: 38% color\n  \"group-data-[disabled]/list-item:text-on-surface/38\",\n]);\n\n// ─── EXPORTED TYPES ───────────────────────────────────────────────────────────\n\nexport type ListVariants = VariantProps<typeof listVariants>;\nexport type ListItemVariants = VariantProps<typeof listItemVariants>;\nexport type ListItemStateLayerVariants = VariantProps<typeof listItemStateLayerVariants>;\nexport type ListItemFocusRingVariants = VariantProps<typeof listItemFocusRingVariants>;\nexport type ListItemLeadingVariants = VariantProps<typeof listItemLeadingVariants>;\nexport type ListItemTrailingVariants = VariantProps<typeof listItemTrailingVariants>;\nexport type ListItemOverlineVariants = VariantProps<typeof listItemOverlineVariants>;\nexport type ListItemHeadlineVariants = VariantProps<typeof listItemHeadlineVariants>;\nexport type ListItemSupportingTextVariants = VariantProps<typeof listItemSupportingTextVariants>;\n","\"use client\";\n\nimport { Children, forwardRef } from \"react\";\nimport type React from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { ListHeadless } from \"./ListHeadless\";\nimport { listVariants } from \"./List.variants\";\nimport type { ListProps } from \"./List.types\";\n\n// ─── Helpers ──────────────────────────────────────────────────────────────────\n\n/**\n * Interleaves presentational `<hr>` dividers between each child.\n * Uses `role=\"presentation\"` to keep the element out of the ARIA tree,\n * avoiding `aria-required-children` violations inside `<ul role=\"list\">`.\n */\nfunction interleaveWithDividers(children: React.ReactNode): React.ReactNode[] {\n  const items = Children.toArray(children);\n\n  return items.reduce<React.ReactNode[]>((acc, child, index) => {\n    if (index > 0) {\n      acc.push(\n        <hr\n          key={`divider-${index}`}\n          role=\"presentation\"\n          className=\"border-outline-variant w-full border-t\"\n        />\n      );\n    }\n    acc.push(child);\n    return acc;\n  }, []);\n}\n\n/**\n * Material Design 3 List Component (Layer 3: Styled)\n *\n * Wraps `ListHeadless` with MD3 surface color and layout tokens.\n *\n * @example\n * ```tsx\n * // Static list\n * <List aria-label=\"Settings\">\n *   <ListItem value=\"wifi\" headline=\"Wi-Fi\" />\n *   <ListItem value=\"bt\" headline=\"Bluetooth\" />\n * </List>\n *\n * // Interactive single-select list\n * <List aria-label=\"Alignment\" selectionMode=\"single\" onSelectionChange={setSelection}>\n *   <ListItem value=\"left\" headline=\"Left\" />\n *   <ListItem value=\"center\" headline=\"Center\" />\n *   <ListItem value=\"right\" headline=\"Right\" />\n * </List>\n *\n * // With dividers between items\n * <List aria-label=\"Settings\" showDividers>\n *   <ListItem value=\"wifi\" headline=\"Wi-Fi\" />\n *   <ListItem value=\"bt\" headline=\"Bluetooth\" />\n * </List>\n * ```\n */\nexport const List = forwardRef<HTMLUListElement, ListProps>(function List(\n  { className, showDividers = false, children, ...props },\n  ref\n) {\n  const renderedChildren = showDividers ? interleaveWithDividers(children) : children;\n\n  return (\n    <ListHeadless ref={ref} className={cn(listVariants(), className)} {...props}>\n      {renderedChildren}\n    </ListHeadless>\n  );\n});\n\nList.displayName = \"List\";\n","import { forwardRef } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { listItemLeadingVariants } from \"./List.variants\";\nimport type { ListItemLeadingProps } from \"./List.types\";\n\n/**\n * MD3 ListItem leading slot.\n *\n * Uses `listItemLeadingVariants` CVA so icon/text colors automatically react to\n * the parent `group/list-item` data-selected and data-disabled attributes.\n *\n * For `checkbox` and `radio` types the children are wrapped with\n * `aria-hidden=\"true\"` and `tabIndex={-1}` because the parent\n * `ListItem`'s `useOption` already conveys selection state to\n * assistive technology.\n */\nexport const ListItemLeading = forwardRef<HTMLDivElement, ListItemLeadingProps>(\n  function ListItemLeading({ type, children, className }, ref) {\n    const isControl = type === \"checkbox\" || type === \"radio\";\n\n    return (\n      <div ref={ref} className={cn(listItemLeadingVariants({ type }), className)}>\n        {isControl ? (\n          <span aria-hidden=\"true\" tabIndex={-1}>\n            {children}\n          </span>\n        ) : (\n          children\n        )}\n      </div>\n    );\n  }\n);\n\nListItemLeading.displayName = \"ListItemLeading\";\n","import { forwardRef } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { listItemTrailingVariants } from \"./List.variants\";\nimport type { ListItemTrailingProps } from \"./List.types\";\n\n/**\n * MD3 ListItem trailing slot.\n *\n * Uses `listItemTrailingVariants` CVA so icon/text colors automatically react to\n * the parent `group/list-item` data-selected and data-disabled attributes.\n *\n * For `checkbox` and `radio` types the children are wrapped with\n * `aria-hidden=\"true\"` and `tabIndex={-1}` — selection semantics\n * come from the parent `ListItem`'s `useOption`.\n */\nexport const ListItemTrailing = forwardRef<HTMLDivElement, ListItemTrailingProps>(\n  function ListItemTrailing({ type, children, className }, ref) {\n    const isControl = type === \"checkbox\" || type === \"radio\";\n\n    return (\n      <div ref={ref} className={cn(listItemTrailingVariants({ type }), className)}>\n        {isControl ? (\n          <span aria-hidden=\"true\" tabIndex={-1}>\n            {children}\n          </span>\n        ) : (\n          children\n        )}\n      </div>\n    );\n  }\n);\n\nListItemTrailing.displayName = \"ListItemTrailing\";\n","import { forwardRef } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport {\n  listItemOverlineVariants,\n  listItemHeadlineVariants,\n  listItemSupportingTextVariants,\n} from \"./List.variants\";\nimport type { ListItemTextProps } from \"./List.types\";\n\n/**\n * MD3 ListItem text block — overline + headline + supporting text.\n *\n * Each text element uses its own slot CVA so colors automatically react to\n * the parent `group/list-item` data-selected and data-disabled attributes.\n *\n * Uses `min-w-0` to allow text truncation inside flex containers.\n */\nexport const ListItemText = forwardRef<HTMLDivElement, ListItemTextProps>(function ListItemText(\n  { headline, supportingText, overline, className },\n  ref\n) {\n  return (\n    <div ref={ref} className={cn(\"min-w-0 flex-1\", className)}>\n      {overline && <p className={cn(listItemOverlineVariants())}>{overline}</p>}\n      <p className={cn(listItemHeadlineVariants())}>{headline}</p>\n      {supportingText && <p className={cn(listItemSupportingTextVariants())}>{supportingText}</p>}\n    </div>\n  );\n});\n\nListItemText.displayName = \"ListItemText\";\n","\"use client\";\n\nimport { forwardRef, useRef } from \"react\";\nimport type React from \"react\";\nimport { useOption, useHover } from \"react-aria\";\nimport { mergeProps } from \"@react-aria/utils\";\nimport type { ListState } from \"react-stately\";\nimport { cn } from \"../../utils/cn\";\nimport { getInteractionDataAttributes } from \"../../utils/interactionStates\";\nimport { useRipple } from \"../../hooks/useRipple\";\nimport { Divider } from \"../Divider\";\nimport {\n  listItemVariants,\n  listItemStateLayerVariants,\n  listItemFocusRingVariants,\n} from \"./List.variants\";\nimport { ListItemLeading } from \"./ListItemLeading\";\nimport { ListItemTrailing } from \"./ListItemTrailing\";\nimport { ListItemText } from \"./ListItemText\";\nimport { useListContext } from \"./ListHeadless\";\nimport type { ListDensity, ListItemProps } from \"./List.types\";\n\n// ─── Helpers ──────────────────────────────────────────────────────────────────\n\nfunction getDensity(overline?: string, supportingText?: string): ListDensity {\n  if (overline) return \"three-line\";\n  if (supportingText) return \"two-line\";\n  return \"one-line\";\n}\n\n// ─── ListItem (Layer 3: Styled) ───────────────────────────────────────────────\n\n/**\n * Material Design 3 List Item (Layer 3: Styled)\n *\n * Architecture: Variants-vs-States\n * - Design-time variant: `density` (auto-derived from content).\n * - All interaction/selection states are expressed as data-* attributes on the root <li>\n *   via `getInteractionDataAttributes`, consumed by each slot via group-data-[x]/list-item.\n * - Content flags (`data-with-leading`, `data-with-trailing`) describe structure, set explicitly.\n *\n * Two operating modes:\n * - **Interactive** (inside a `List` with `selectionMode` or `onAction`):\n *   uses `useOption` for ARIA semantics, renders state layer + focus ring + ripple.\n * - **Static**: renders `<li role=\"listitem\">`, no interactive affordances.\n *\n * Density is auto-derived from content:\n * - one-line (56dp)   — headline only\n * - two-line (72dp)   — headline + supportingText\n * - three-line (88dp) — overline present\n *\n * @example\n * ```tsx\n * // Static\n * <List aria-label=\"Settings\">\n *   <ListItem value=\"wifi\" headline=\"Wi-Fi\" supportingText=\"Connected\" leadingType=\"icon\" leadingSlot={<IconWifi />} />\n * </List>\n *\n * // Interactive single-select\n * <List aria-label=\"Alignment\" selectionMode=\"single\">\n *   <ListItem value=\"left\" headline=\"Left\" />\n *   <ListItem value=\"center\" headline=\"Center\" />\n * </List>\n * ```\n */\nexport const ListItem = forwardRef<HTMLLIElement, ListItemProps>(function ListItem(\n  {\n    value,\n    headline,\n    supportingText,\n    overline,\n    leadingSlot,\n    leadingType,\n    trailingSlot,\n    trailingType,\n    isDisabled = false,\n    insetDivider = false,\n    className,\n  },\n  forwardedRef\n) {\n  const ctx = useListContext();\n  const density = getDensity(overline, supportingText);\n\n  if (ctx) {\n    return (\n      <InteractiveStyledListItem\n        ref={forwardedRef}\n        value={value}\n        headline={headline}\n        {...(supportingText !== undefined ? { supportingText } : {})}\n        {...(overline !== undefined ? { overline } : {})}\n        {...(leadingSlot !== undefined ? { leadingSlot } : {})}\n        {...(leadingType !== undefined ? { leadingType } : {})}\n        {...(trailingSlot !== undefined ? { trailingSlot } : {})}\n        {...(trailingType !== undefined ? { trailingType } : {})}\n        density={density}\n        insetDivider={insetDivider}\n        {...(className !== undefined ? { className } : {})}\n        state={ctx.state}\n      />\n    );\n  }\n\n  return (\n    <StaticStyledListItem\n      ref={forwardedRef}\n      value={value}\n      headline={headline}\n      {...(supportingText !== undefined ? { supportingText } : {})}\n      {...(overline !== undefined ? { overline } : {})}\n      {...(leadingSlot !== undefined ? { leadingSlot } : {})}\n      {...(leadingType !== undefined ? { leadingType } : {})}\n      {...(trailingSlot !== undefined ? { trailingSlot } : {})}\n      {...(trailingType !== undefined ? { trailingType } : {})}\n      density={density}\n      isDisabled={isDisabled}\n      insetDivider={insetDivider}\n      {...(className !== undefined ? { className } : {})}\n    />\n  );\n});\n\nListItem.displayName = \"ListItem\";\n\n// ─── StaticStyledListItem (internal) ─────────────────────────────────────────\n\ninterface StaticStyledListItemInternalProps {\n  value: string | number;\n  headline: string;\n  supportingText?: string;\n  overline?: string;\n  leadingSlot?: React.ReactNode;\n  leadingType?: ListItemProps[\"leadingType\"];\n  trailingSlot?: React.ReactNode;\n  trailingType?: ListItemProps[\"trailingType\"];\n  density: ListDensity;\n  isDisabled: boolean;\n  insetDivider: boolean;\n  className?: string;\n}\n\n/**\n * Static list item — non-interactive; no state layer, focus ring, or ripple.\n * Still propagates data-disabled so slot color tokens respond correctly.\n */\nconst StaticStyledListItem = forwardRef<HTMLLIElement, StaticStyledListItemInternalProps>(\n  function StaticStyledListItem(\n    {\n      headline,\n      supportingText,\n      overline,\n      leadingSlot,\n      leadingType,\n      trailingSlot,\n      trailingType,\n      density,\n      isDisabled,\n      insetDivider,\n      className,\n    },\n    ref\n  ) {\n    return (\n      <li\n        ref={ref}\n        role=\"listitem\"\n        className={cn(listItemVariants({ density }), \"group/list-item\", className)}\n        {...getInteractionDataAttributes({ isDisabled })}\n      >\n        {leadingSlot && (\n          <ListItemLeading type={leadingType ?? \"icon\"}>{leadingSlot}</ListItemLeading>\n        )}\n        <ListItemText\n          headline={headline}\n          {...(supportingText !== undefined ? { supportingText } : {})}\n          {...(overline !== undefined ? { overline } : {})}\n        />\n        {trailingSlot && (\n          <ListItemTrailing type={trailingType ?? \"icon\"}>{trailingSlot}</ListItemTrailing>\n        )}\n        {insetDivider && (\n          <Divider\n            orientation=\"horizontal\"\n            inset=\"start\"\n            className=\"absolute right-0 bottom-0 left-0\"\n          />\n        )}\n      </li>\n    );\n  }\n);\n\nStaticStyledListItem.displayName = \"StaticStyledListItem\";\n\n// ─── InteractiveStyledListItem (internal) ─────────────────────────────────────\n\ninterface InteractiveStyledListItemInternalProps {\n  value: string | number;\n  headline: string;\n  supportingText?: string;\n  overline?: string;\n  leadingSlot?: React.ReactNode;\n  leadingType?: ListItemProps[\"leadingType\"];\n  trailingSlot?: React.ReactNode;\n  trailingType?: ListItemProps[\"trailingType\"];\n  density: ListDensity;\n  insetDivider: boolean;\n  className?: string;\n  state: ListState<object>;\n}\n\n/**\n * Internal interactive list item — separated so `useOption` is always\n * called unconditionally (Rules of Hooks).\n *\n * Emits `group/list-item` on the root so all slot CVAs can consume\n * `group-data-[x]/list-item:` selectors without style leakage to sibling groups.\n */\nconst InteractiveStyledListItem = forwardRef<HTMLLIElement, InteractiveStyledListItemInternalProps>(\n  function InteractiveStyledListItem(\n    {\n      value,\n      headline,\n      supportingText,\n      overline,\n      leadingSlot,\n      leadingType,\n      trailingSlot,\n      trailingType,\n      density,\n      insetDivider,\n      className,\n      state,\n    },\n    forwardedRef\n  ) {\n    const internalRef = useRef<HTMLLIElement>(null);\n    const ref = (forwardedRef ?? internalRef) as React.RefObject<HTMLLIElement>;\n\n    // React Aria: provides ARIA semantics + isSelected, isDisabled, isPressed, isFocusVisible\n    const { optionProps, isSelected, isDisabled, isPressed, isFocusVisible } = useOption(\n      { key: value },\n      state,\n      ref\n    );\n\n    // Hover state for state-layer (useOption does not provide isHovered)\n    const { isHovered, hoverProps } = useHover({ isDisabled });\n\n    // Ripple effect\n    const { onMouseDown: handleRipple, ripples } = useRipple({ disabled: isDisabled });\n\n    const mergedProps = mergeProps(optionProps, hoverProps, { onMouseDown: handleRipple });\n\n    const hasLeading = !!leadingSlot;\n    const hasTrailing = !!trailingSlot;\n\n    return (\n      <li\n        {...mergedProps}\n        ref={ref}\n        className={cn(listItemVariants({ density }), \"group/list-item\", className)}\n        // ── Interaction data attributes (from React Aria state) ──────────\n        {...getInteractionDataAttributes({\n          isHovered,\n          isFocusVisible,\n          isPressed,\n          isSelected,\n          isDisabled,\n        })}\n        // ── Structural flags (describe content, NOT interaction state) ───\n        data-interactive=\"\"\n        data-with-leading={hasLeading ? \"\" : undefined}\n        data-with-trailing={hasTrailing ? \"\" : undefined}\n      >\n        {/* Ripple */}\n        {ripples}\n\n        {/* State layer — hover/focus/pressed opacity ring */}\n        <span aria-hidden=\"true\" className={cn(listItemStateLayerVariants())} />\n\n        {/* Focus ring — keyboard focus indicator */}\n        <span aria-hidden=\"true\" className={cn(listItemFocusRingVariants())} />\n\n        {leadingSlot && (\n          <ListItemLeading type={leadingType ?? \"icon\"}>{leadingSlot}</ListItemLeading>\n        )}\n        <ListItemText\n          headline={headline}\n          {...(supportingText !== undefined ? { supportingText } : {})}\n          {...(overline !== undefined ? { overline } : {})}\n        />\n        {trailingSlot && (\n          <ListItemTrailing type={trailingType ?? \"icon\"}>{trailingSlot}</ListItemTrailing>\n        )}\n        {insetDivider && (\n          <Divider\n            orientation=\"horizontal\"\n            inset=\"start\"\n            className=\"absolute right-0 bottom-0 left-0\"\n          />\n        )}\n      </li>\n    );\n  }\n);\n\nInteractiveStyledListItem.displayName = \"InteractiveStyledListItem\";\n","\"use client\";\n\nimport { forwardRef, useRef, useCallback } from \"react\";\nimport type React from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { useSearchField, useOverlay, usePreventScroll, useButton, FocusScope } from \"react-aria\";\nimport { useSearchFieldState } from \"react-stately\";\nimport type { SearchBarHeadlessProps, SearchViewHeadlessProps } from \"./Search.types\";\n\n// ─── MD3 Icons ────────────────────────────────────────────────────────────────\n\n/**\n * MD3 Arrow Back icon — 24×24, currentColor, aria-hidden.\n * Used as the leading button in Search View to collapse back to the bar.\n */\nconst ArrowBackIcon = (): React.ReactElement => (\n  <svg\n    width=\"24\"\n    height=\"24\"\n    viewBox=\"0 0 24 24\"\n    fill=\"currentColor\"\n    aria-hidden=\"true\"\n    focusable=\"false\"\n  >\n    <path d=\"M20 11H7.83l5.59-5.59L12 4l-8 8 8 8 1.41-1.41L7.83 13H20v-2z\" />\n  </svg>\n);\n\n/**\n * MD3 Close icon — 24×24, currentColor, aria-hidden.\n * Used as the clear button in Search View to reset the input text.\n */\nconst CloseIcon = (): React.ReactElement => (\n  <svg\n    width=\"24\"\n    height=\"24\"\n    viewBox=\"0 0 24 24\"\n    fill=\"currentColor\"\n    aria-hidden=\"true\"\n    focusable=\"false\"\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// ─── SearchBarHeadless ────────────────────────────────────────────────────────\n\n/**\n * SearchBarHeadless — Layer 2 headless primitive for the MD3 Search bar.\n *\n * Renders `<form role=\"search\">` wrapping an accessible search input.\n * Uses `useSearchField` + `useSearchFieldState` from React Aria/Stately.\n *\n * Features:\n * - `role=\"search\"` on the form wrapper\n * - `role=\"searchbox\"` on the input (via type=\"search\")\n * - Keyboard: Enter → onSubmit, Escape (with value) → onClear\n * - Leading icon, trailing actions, and avatar slots\n * - aria-label falls back to placeholder per MD3 labeling spec\n * - `inputClassName` and `trailingActionsClassName` applied directly to inner elements\n *\n * @example\n * ```tsx\n * <SearchBarHeadless\n *   placeholder=\"Search messages\"\n *   onFocus={() => setOpen(true)}\n *   className=\"my-search-bar\"\n * />\n * ```\n */\nexport const SearchBarHeadless = forwardRef<HTMLFormElement, SearchBarHeadlessProps>(\n  (\n    {\n      value,\n      defaultValue,\n      onChange,\n      onSubmit,\n      onClear,\n      placeholder,\n      leadingIcon,\n      trailingActions,\n      avatar,\n      isDisabled,\n      \"aria-label\": ariaLabel,\n      className,\n      onFocus,\n      onBlur,\n      inputClassName,\n      trailingActionsClassName,\n    },\n    forwardedRef\n  ) => {\n    const inputRef = useRef<HTMLInputElement>(null);\n    const internalFormRef = useRef<HTMLFormElement>(null);\n    const formRef = (forwardedRef ?? internalFormRef) as React.RefObject<HTMLFormElement>;\n\n    const state = useSearchFieldState({\n      ...(value !== undefined ? { value } : {}),\n      ...(defaultValue !== undefined ? { defaultValue } : {}),\n      ...(onChange !== undefined ? { onChange } : {}),\n      ...(onSubmit !== undefined ? { onSubmit } : {}),\n      ...(onClear !== undefined ? { onClear } : {}),\n    });\n\n    const { inputProps } = useSearchField(\n      {\n        \"aria-label\": ariaLabel ?? placeholder ?? \"Search\",\n        ...(placeholder !== undefined ? { placeholder } : {}),\n        ...(isDisabled !== undefined ? { isDisabled } : {}),\n        ...(onSubmit !== undefined ? { onSubmit } : {}),\n        ...(onClear !== undefined ? { onClear } : {}),\n        ...(onFocus !== undefined ? { onFocus: () => onFocus() } : {}),\n        ...(onBlur !== undefined ? { onBlur: () => onBlur() } : {}),\n      },\n      state,\n      inputRef\n    );\n\n    const handleFormSubmit = useCallback(\n      (e: React.FormEvent) => {\n        e.preventDefault();\n        onSubmit?.(state.value);\n      },\n      [onSubmit, state.value]\n    );\n\n    return (\n      <form ref={formRef} role=\"search\" className={className} onSubmit={handleFormSubmit}>\n        {leadingIcon && <span data-slot=\"leading-icon\">{leadingIcon}</span>}\n        <input\n          {...inputProps}\n          ref={inputRef}\n          role=\"searchbox\"\n          data-slot=\"input\"\n          className={inputClassName}\n        />\n        {trailingActions && trailingActions.length > 0 && (\n          <span data-slot=\"trailing-actions\" className={trailingActionsClassName}>\n            {trailingActions}\n          </span>\n        )}\n        {avatar && <span data-slot=\"avatar\">{avatar}</span>}\n      </form>\n    );\n  }\n);\n\nSearchBarHeadless.displayName = \"SearchBarHeadless\";\n\n// ─── SearchViewHeadless ───────────────────────────────────────────────────────\n\n/**\n * SearchViewHeadless — Layer 2 headless primitive for the MD3 Search view.\n *\n * Rendering strategy by layout:\n * - `fullscreen`: renders in a portal (`createPortal`) with `usePreventScroll` and\n *   `FocusScope contain` — the view covers the full viewport.\n * - `docked`: renders inline (no portal) with `FocusScope restoreFocus autoFocus` only —\n *   the card sits in normal document flow so it can be centered by its wrapper.\n *\n * Both layouts use `useOverlay` so Escape key and click-outside dismiss correctly.\n *\n * Features:\n * - Back arrow (MD3 ArrowBack SVG) + input + MD3 Close SVG clear button in header\n * - aria-live region for autosuggest announcements\n * - Slot class names from the styled SearchView layer applied directly on elements\n *\n * @example\n * ```tsx\n * <SearchViewHeadless\n *   isOpen={isOpen}\n *   onClose={() => setOpen(false)}\n *   aria-label=\"Search messages\"\n * >\n *   <List>{results.map(r => <ListItem key={r.id} headline={r.label} />)}</List>\n * </SearchViewHeadless>\n * ```\n */\nexport const SearchViewHeadless = forwardRef<HTMLDivElement, SearchViewHeadlessProps>(\n  (\n    {\n      isOpen,\n      onClose,\n      value,\n      defaultValue,\n      onChange,\n      onSubmit,\n      placeholder,\n      \"aria-label\": ariaLabel,\n      className,\n      children,\n      leadingIcon,\n      trailingActions,\n      showDivider,\n      layout = \"fullscreen\",\n      headerClassName,\n      backButtonClassName,\n      clearButtonClassName,\n      inputClassName,\n      trailingActionsClassName,\n      dividerClassName,\n      contentClassName,\n    },\n    forwardedRef\n  ) => {\n    if (!isOpen) {\n      return null;\n    }\n\n    const panelProps = {\n      onClose,\n      ariaLabel,\n      layout,\n      children,\n      ...(className !== undefined ? { className } : {}),\n      ...(leadingIcon !== undefined ? { leadingIcon } : {}),\n      ...(trailingActions !== undefined ? { trailingActions } : {}),\n      ...(showDivider !== undefined ? { showDivider } : {}),\n      ...(value !== undefined ? { value } : {}),\n      ...(defaultValue !== undefined ? { defaultValue } : {}),\n      ...(onChange !== undefined ? { onChange } : {}),\n      ...(onSubmit !== undefined ? { onSubmit } : {}),\n      ...(placeholder !== undefined ? { placeholder } : {}),\n      headerClassName,\n      backButtonClassName,\n      clearButtonClassName,\n      inputClassName,\n      trailingActionsClassName,\n      dividerClassName,\n      contentClassName,\n    };\n\n    // Docked renders inline — no portal, no scroll-lock, no contain trap.\n    // This lets the container sit in normal document flow and be positioned\n    // by its parent wrapper (e.g. centered in the Storybook canvas).\n    if (layout === \"docked\") {\n      return <SearchViewPanel ref={forwardedRef} {...panelProps} />;\n    }\n\n    // Fullscreen renders in a portal over the page with scroll-lock + focus trap.\n    return createPortal(<SearchViewPanel ref={forwardedRef} {...panelProps} />, document.body);\n  }\n);\n\nSearchViewHeadless.displayName = \"SearchViewHeadless\";\n\n// ─── SearchViewPanel (internal) ───────────────────────────────────────────────\n\ninterface SearchViewPanelProps {\n  onClose: () => void;\n  value?: string;\n  defaultValue?: string;\n  onChange?: (value: string) => void;\n  onSubmit?: (value: string) => void;\n  placeholder?: string;\n  ariaLabel: string;\n  className?: string;\n  children?: React.ReactNode;\n  leadingIcon?: React.ReactNode;\n  trailingActions?: React.ReactNode[];\n  showDivider?: boolean;\n  /** Controls scroll-lock and focus containment — see SearchViewHeadless. */\n  layout: \"fullscreen\" | \"docked\";\n  // Slot class names from the styled layer\n  headerClassName?: string | undefined;\n  backButtonClassName?: string | undefined;\n  clearButtonClassName?: string | undefined;\n  inputClassName?: string | undefined;\n  trailingActionsClassName?: string | undefined;\n  dividerClassName?: string | undefined;\n  contentClassName?: string | undefined;\n}\n\n/**\n * Inner panel for the search view. Separated so that hooks that must be called\n * unconditionally (`usePreventScroll`, `useOverlay`) always run.\n * @internal\n */\nconst SearchViewPanel = forwardRef<HTMLDivElement, SearchViewPanelProps>(\n  (\n    {\n      onClose,\n      value,\n      defaultValue,\n      onChange,\n      onSubmit,\n      placeholder,\n      ariaLabel,\n      className,\n      children,\n      leadingIcon,\n      trailingActions,\n      showDivider,\n      layout,\n      headerClassName,\n      backButtonClassName,\n      clearButtonClassName,\n      inputClassName,\n      trailingActionsClassName,\n      dividerClassName,\n      contentClassName,\n    },\n    forwardedRef\n  ) => {\n    const panelRef = useRef<HTMLDivElement>(null);\n    const inputRef = useRef<HTMLInputElement>(null);\n    const ref = (forwardedRef ?? panelRef) as React.RefObject<HTMLDivElement>;\n\n    const isFullscreen = layout === \"fullscreen\";\n\n    // Scroll-lock only when the view covers the whole page (fullscreen portal).\n    usePreventScroll({ isDisabled: !isFullscreen });\n\n    const { overlayProps } = useOverlay(\n      {\n        isOpen: true,\n        onClose,\n        isDismissable: true,\n        shouldCloseOnBlur: false,\n      },\n      ref\n    );\n\n    const state = useSearchFieldState({\n      ...(value !== undefined ? { value } : {}),\n      ...(defaultValue !== undefined ? { defaultValue } : {}),\n      ...(onChange !== undefined ? { onChange } : {}),\n      ...(onSubmit !== undefined ? { onSubmit } : {}),\n    });\n\n    const { inputProps, clearButtonProps } = useSearchField(\n      {\n        \"aria-label\": ariaLabel,\n        ...(placeholder !== undefined ? { placeholder } : {}),\n        ...(onSubmit !== undefined ? { onSubmit } : {}),\n        onClear: () => {\n          state.setValue(\"\");\n        },\n      },\n      state,\n      inputRef\n    );\n\n    const clearButtonRef = useRef<HTMLButtonElement>(null);\n    const { buttonProps: clearBtnDomProps } = useButton(clearButtonProps, clearButtonRef);\n\n    const handleBackClick = useCallback(() => {\n      onClose();\n    }, [onClose]);\n\n    const defaultBackButton = (\n      <button\n        type=\"button\"\n        aria-label=\"Back\"\n        onClick={handleBackClick}\n        data-slot=\"back-button\"\n        className={backButtonClassName}\n      >\n        <ArrowBackIcon />\n      </button>\n    );\n\n    // Clear button only rendered when the input has a value\n    const clearButton = state.value ? (\n      <button\n        {...clearBtnDomProps}\n        ref={clearButtonRef}\n        type=\"button\"\n        aria-label=\"Clear search\"\n        data-slot=\"clear-button\"\n        className={clearButtonClassName}\n      >\n        <CloseIcon />\n      </button>\n    ) : null;\n\n    return (\n      // Focus containment only for fullscreen — docked uses restoreFocus + autoFocus only\n      // so tabbing can naturally leave the widget.\n      <FocusScope contain={isFullscreen} restoreFocus autoFocus>\n        <div {...overlayProps} ref={ref} role=\"search\" aria-label={ariaLabel} className={className}>\n          <div data-slot=\"header\" className={headerClassName}>\n            {/* Leading: custom override or default back arrow */}\n            {leadingIcon ?? defaultBackButton}\n\n            {/* Search input — receives inputClassName with flex-1, outline-none, and\n                the webkit search-cancel hide rule to suppress the native \"×\" button */}\n            <input\n              {...inputProps}\n              ref={inputRef}\n              role=\"searchbox\"\n              data-slot=\"input\"\n              className={inputClassName}\n            />\n\n            {/* MD3 clear button (Close SVG) — only when input has content */}\n            {clearButton}\n\n            {/* Trailing actions */}\n            {trailingActions && trailingActions.length > 0 && (\n              <span data-slot=\"trailing-actions\" className={trailingActionsClassName}>\n                {trailingActions}\n              </span>\n            )}\n          </div>\n\n          {/* Divider (divided style only) */}\n          {showDivider && <hr data-slot=\"divider\" className={dividerClassName} />}\n\n          {/* Results / suggestions content area */}\n          <div data-slot=\"content\" aria-live=\"polite\" className={contentClassName}>\n            {children}\n          </div>\n        </div>\n      </FocusScope>\n    );\n  }\n);\n\nSearchViewPanel.displayName = \"SearchViewPanel\";\n","import { cva, type VariantProps } from \"class-variance-authority\";\n\n/**\n * Material Design 3 Search Variants\n *\n * Architecture: Variants vs States\n * - CVA holds design-time structure only (no focused/disabled/noActions state variants).\n * - All interaction states are driven by data-* attributes on the root via\n *   group-data-[x]/search Tailwind selectors in each slot's base classes.\n * - Content flags (data-with-actions) are set explicitly by the component.\n *\n * Search Bar slot responsibilities:\n *   searchBarRootVariants        — container pill; shape, color, elevation, spacing by style\n *   searchBarStateLayerVariants  — hover/pressed opacity overlay (inside overflow-hidden)\n *   searchBarFocusRingVariants   — keyboard focus outline (outside overflow-hidden)\n *   searchBarLeadingIconVariants — 48dp tap target wrapping 24dp icon, on-surface\n *   searchBarTrailingActionVariants  — 48dp tap target for each trailing icon, on-surface-variant\n *   searchBarTrailingActionsVariants — flex row wrapper for all trailing actions\n *   searchBarAvatarVariants          — 48dp tap target wrapping 30dp rounded-full avatar\n *   searchBarInputVariants           — flex-1 text input inside the bar\n *\n * Search View slot responsibilities:\n *   searchViewVariants           — container; style × layout compound variants\n *   searchViewHeaderVariants     — header row; style × layout heights/padding\n *   searchViewBackButtonVariants — 48dp back-arrow tap target, on-surface\n *   searchViewClearButtonVariants — 48dp clear tap target, on-surface-variant\n *   searchViewTrailingActionVariants  — 48dp trailing action in view header\n *   searchViewTrailingActionsVariants — flex row wrapper for all view trailing actions\n *   searchViewInputVariants           — flex-1 text input inside the view header\n *   searchViewDividerVariants    — horizontal rule (divided style only)\n *   searchViewContentVariants    — scrollable results/suggestions area\n *\n * MD3 Token References:\n *   Container color:   SurfaceContainerHigh\n *   Contained bg (fullscreen view): SurfaceContainerLow\n *   Container elevation: Level 3 (6dp)\n *   Leading icon:      OnSurface\n *   Trailing icon:     OnSurfaceVariant\n *   Placeholder:       OnSurfaceVariant\n *   Input text:        OnSurface\n *   Focus indicator:   Secondary, 3dp\n *   Hover opacity:     8%   (MD3 state.hover.state-layer-opacity)\n *   Pressed opacity:   10%  (MD3 state.pressed.state-layer-opacity)\n *   Disabled:          opacity-38 on container\n *\n * @see docs/md3-components/search/tokens/layout-text.md\n * @see docs/md3-components/search/tokens/color-tokens-light.md\n */\n\n// ─── SEARCH BAR ROOT ─────────────────────────────────────────────────────────\n\n/**\n * Search bar container pill.\n *\n * Spacing follows MD3 Search Bar spec:\n *   Contained + with actions:    px-1 gap-1   (4dp leading/trailing per spec)\n *   Contained + no actions:      px-4         (16dp leading/trailing)\n *   Divided:                     px-4 gap-4   (16dp leading/trailing, 16dp icon-label gap)\n *\n * The `contained` variant uses `data-[with-actions]` on the root (a content flag set by the\n * component) to switch from 16dp → 4dp spacing — no CVA variant needed for this.\n *\n * Disabled is self-targeting (data-[disabled]:) because the root carries the data attr.\n * overflow-hidden intentionally NOT here — the focus ring span sits outside via a sibling\n * wrapper, so we preserve full ring visibility (same pattern as Button).\n */\nexport const searchBarRootVariants = cva(\n  [\n    \"relative flex items-center h-14 rounded-full\",\n    \"bg-surface-container-high shadow-elevation-3\",\n    \"w-full text-body-large cursor-text\",\n    // Disabled — self-targeting; pointer-events lets ripple/hover stop cleanly\n    \"data-[disabled]:opacity-38 data-[disabled]:pointer-events-none data-[disabled]:cursor-not-allowed\",\n  ],\n  {\n    variants: {\n      /**\n       * Visual style of the search bar.\n       * - contained: M3 Expressive — fills container, expressive motion, adjustable spacing\n       * - divided: Baseline — 16dp fixed spacing, no expressive motion\n       */\n      style: {\n        /**\n         * Contained (Expressive): spacing governed by data-[with-actions] content flag.\n         *   With actions:    px-1 gap-1 (4dp each)\n         *   Without actions: px-4      (16dp each)\n         */\n        contained: [\n          \"px-4\", // default: no-actions 16dp\n          \"data-[with-actions]:px-1 data-[with-actions]:gap-1\", // with-actions: 4dp\n        ],\n        /**\n         * Divided (Baseline): fixed 16dp side padding, 16dp icon-label gap.\n         */\n        divided: \"px-4 gap-4\",\n      },\n    },\n    defaultVariants: { style: \"contained\" },\n  }\n);\n\n// ─── SEARCH BAR STATE LAYER ──────────────────────────────────────────────────\n\n/**\n * State layer — absolute inset overlay inside the bar container.\n *\n * Must be inside overflow-hidden (placed on the same pill via the root's inner wrapper).\n * Color: on-surface (MD3 search bar state layer color).\n * Opacities: hover 8%, pressed 10% (doubled selector wins over hover).\n * Hidden when disabled (no state affordance on non-interactive element).\n */\nexport const searchBarStateLayerVariants = cva([\n  \"absolute inset-0 rounded-full pointer-events-none opacity-0\",\n  \"bg-on-surface\",\n  // Effects transition — no overshoot on opacity\n  \"transition-opacity duration-spring-standard-fast-effects ease-spring-standard-fast-effects\",\n  // Hover: 8%\n  \"group-data-[hovered]/search:opacity-8\",\n  // Pressed: 10%, doubled selector wins over hover at equal cascade position\n  \"group-data-[pressed]/search:group-data-[pressed]/search:opacity-10\",\n  // No state layer when disabled\n  \"group-data-[disabled]/search:hidden\",\n]);\n\n// ─── SEARCH BAR FOCUS RING ────────────────────────────────────────────────────\n\n/**\n * Focus ring overlay.\n *\n * Rendered outside the overflow-hidden container (as a sibling, in a relative wrapper)\n * so it can extend 3px beyond the pill boundary and remain fully visible.\n * Color: Secondary (MD3 focus indicator color).\n * Thickness: 3dp (MD3 state.focus-indicator.thickness).\n */\nexport const searchBarFocusRingVariants = cva([\n  \"pointer-events-none absolute inset-[-3px] rounded-full\",\n  \"outline outline-[3px] outline-offset-0 outline-secondary\",\n  // Effects transition\n  \"transition-opacity duration-spring-standard-fast-effects ease-spring-standard-fast-effects\",\n  \"opacity-0\",\n  \"group-data-[focus-visible]/search:opacity-100\",\n]);\n\n// ─── SEARCH BAR LEADING ICON ──────────────────────────────────────────────────\n\n/**\n * Leading icon wrapper — 48dp tap target with centered 24dp icon.\n * Color: on-surface (MD3 leading icon color).\n */\nexport const searchBarLeadingIconVariants = cva([\n  \"flex size-12 shrink-0 items-center justify-center text-on-surface\",\n]);\n\n// ─── SEARCH BAR TRAILING ACTION ───────────────────────────────────────────────\n\n/**\n * Trailing action wrapper — 48dp tap target for each trailing icon button.\n * Color: on-surface-variant (MD3 trailing icon color).\n */\nexport const searchBarTrailingActionVariants = cva([\n  \"flex size-12 shrink-0 items-center justify-center text-on-surface-variant\",\n]);\n\n// ─── SEARCH BAR AVATAR ────────────────────────────────────────────────────────\n\n/**\n * Avatar wrapper — 48dp tap target containing a 30dp rounded-full image/element.\n * Shape: CornerFull (MD3 avatar shape).\n * Size: 30dp (MD3 avatar size).\n */\nexport const searchBarAvatarVariants = cva([\"flex size-12 shrink-0 items-center justify-center\"]);\n\n// ─── SEARCH BAR TRAILING ACTIONS GROUP ────────────────────────────────────────\n\n/**\n * Trailing actions group wrapper — lays out multiple trailing icon slots in a row.\n * gap = 0 per MD3 spec (contained trailing-actions gap token = 0dp).\n */\nexport const searchBarTrailingActionsVariants = cva([\"flex items-center\"]);\n\n// ─── SEARCH BAR INPUT ─────────────────────────────────────────────────────────\n\n/**\n * Text input inside the search bar.\n * Typography: body-large (MD3 supporting text / input text font).\n * Colors: on-surface for input, on-surface-variant for placeholder.\n *\n * `min-w-0` is required so `flex-1` can shrink when trailing actions are present.\n * The native browser search cancel button and decoration are hidden so only our\n * MD3 clear button (in SearchView) controls clearing.\n */\nexport const searchBarInputVariants = cva([\n  \"flex-1 min-w-0 bg-transparent outline-none\",\n  \"text-body-large text-on-surface\",\n  \"placeholder:text-on-surface-variant\",\n  \"focus-visible:outline-none\",\n  // Hide native browser search affordances — our MD3 clear button handles clearing\n  \"[&::-webkit-search-cancel-button]:appearance-none\",\n  \"[&::-webkit-search-decoration]:appearance-none\",\n]);\n\n// ─── SEARCH VIEW CONTAINER ────────────────────────────────────────────────────\n\n/**\n * Search view container — the expanded/focused search surface.\n *\n * All 4 style × layout combinations via compound variants:\n *   contained + fullscreen: surface-container-low,  no rounding\n *   contained + docked:     surface-container-high, rounded-xl (12dp), 2dp gap\n *   divided   + fullscreen: surface-container-high, no rounding\n *   divided   + docked:     surface-container-high, rounded-[28px] (extra-large)\n *\n * @see docs/md3-components/search/tokens/layout-text.md\n * @see docs/md3-components/search/tokens/color-tokens-light.md\n */\nexport const searchViewVariants = cva([\"flex flex-col shadow-elevation-3 z-50 overflow-hidden\"], {\n  variants: {\n    style: {\n      contained: \"\",\n      divided: \"bg-surface-container-high\",\n    },\n    layout: {\n      fullscreen: \"fixed inset-0\",\n      docked: \"relative min-w-[360px] max-w-[720px] min-h-60 max-h-[66vh] overflow-y-auto\",\n    },\n  },\n  compoundVariants: [\n    // Contained + fullscreen: surface-container-low, square corners\n    {\n      style: \"contained\",\n      layout: \"fullscreen\",\n      class: \"bg-surface-container-low rounded-none\",\n    },\n    // Contained + docked: surface-container-high, 12dp results rounding, 2dp gap\n    {\n      style: \"contained\",\n      layout: \"docked\",\n      class: \"bg-surface-container-high rounded-xl gap-0.5\",\n    },\n    // Divided + fullscreen: surface-container-high, square corners\n    {\n      style: \"divided\",\n      layout: \"fullscreen\",\n      class: \"bg-surface-container-high rounded-none\",\n    },\n    // Divided + docked: surface-container-high, extra-large rounding (28dp)\n    {\n      style: \"divided\",\n      layout: \"docked\",\n      class: \"bg-surface-container-high rounded-[28px]\",\n    },\n  ],\n  defaultVariants: { style: \"contained\", layout: \"fullscreen\" },\n});\n\n// ─── SEARCH VIEW HEADER ───────────────────────────────────────────────────────\n\n/**\n * Search view header row.\n *\n * Heights per MD3 spec:\n *   Contained (both layouts):  56dp (h-14), 12dp side padding (px-3)\n *   Divided + fullscreen:      72dp (h-[72px]), 16dp side padding (px-4)\n *   Divided + docked:          56dp (h-14), overridden by docked layout variant\n *\n * @see docs/md3-components/search/tokens/layout-text.md\n */\nexport const searchViewHeaderVariants = cva(\n  [\"flex items-center w-full bg-surface-container-high gap-1\"],\n  {\n    variants: {\n      style: {\n        contained: \"h-14 px-3\",\n        divided: \"h-[72px] px-4\",\n      },\n      layout: {\n        // Docked overrides height to 56dp regardless of style\n        docked: \"h-14\",\n        fullscreen: \"\",\n      },\n    },\n    defaultVariants: { style: \"contained\", layout: \"fullscreen\" },\n  }\n);\n\n// ─── SEARCH VIEW BACK BUTTON ──────────────────────────────────────────────────\n\n/**\n * Back arrow button wrapper — 48dp tap target.\n * Color: on-surface (MD3 header leading icon color).\n * Includes visual state layer for hover/focus feedback (button handles its own states).\n */\nexport const searchViewBackButtonVariants = cva([\n  \"flex size-12 shrink-0 items-center justify-center\",\n  \"text-on-surface rounded-full\",\n  \"cursor-pointer\",\n]);\n\n// ─── SEARCH VIEW CLEAR BUTTON ─────────────────────────────────────────────────\n\n/**\n * Clear (✕) button wrapper — 48dp tap target.\n * Color: on-surface-variant (MD3 trailing icon color).\n * Transitions opacity when shown/hidden (Standard fast effects).\n */\nexport const searchViewClearButtonVariants = cva([\n  \"flex size-12 shrink-0 items-center justify-center\",\n  \"text-on-surface-variant rounded-full\",\n  \"cursor-pointer\",\n  \"transition-opacity duration-spring-standard-fast-effects ease-spring-standard-fast-effects\",\n]);\n\n// ─── SEARCH VIEW TRAILING ACTION ──────────────────────────────────────────────\n\n/**\n * Trailing action wrapper in the view header — 48dp tap target.\n * Color: on-surface-variant (MD3 trailing icon color).\n */\nexport const searchViewTrailingActionVariants = cva([\n  \"flex size-12 shrink-0 items-center justify-center text-on-surface-variant\",\n]);\n\n// ─── SEARCH VIEW TRAILING ACTIONS GROUP ───────────────────────────────────────\n\n/**\n * Trailing actions group wrapper in the view header — lays out multiple action\n * slots in a row. gap = 0 per MD3 spec.\n */\nexport const searchViewTrailingActionsVariants = cva([\"flex items-center\"]);\n\n// ─── SEARCH VIEW INPUT ────────────────────────────────────────────────────────\n\n/**\n * Text input inside the view header.\n * Typography: body-large.\n * Colors: on-surface for input text, on-surface-variant for placeholder.\n *\n * `min-w-0` lets `flex-1` shrink when clear/trailing buttons are present.\n * Native search affordances hidden — MD3 clear button controls clearing.\n */\nexport const searchViewInputVariants = cva([\n  \"flex-1 min-w-0 bg-transparent outline-none\",\n  \"text-body-large text-on-surface\",\n  \"placeholder:text-on-surface-variant\",\n  \"focus-visible:outline-none\",\n  // Hide native browser search affordances\n  \"[&::-webkit-search-cancel-button]:appearance-none\",\n  \"[&::-webkit-search-decoration]:appearance-none\",\n]);\n\n// ─── SEARCH VIEW DIVIDER ──────────────────────────────────────────────────────\n\n/**\n * Horizontal divider between the view header and results area.\n * Color: outline (MD3 divider color).\n * Only rendered when searchStyle=\"divided\".\n */\nexport const searchViewDividerVariants = cva([\"border-t border-outline w-full\"]);\n\n// ─── SEARCH VIEW CONTENT AREA ─────────────────────────────────────────────────\n\n/**\n * Results / suggestions content area.\n * flex-1 to fill remaining height; overflow-y-auto for independent scroll.\n */\nexport const searchViewContentVariants = cva([\"flex-1 overflow-y-auto\"]);\n\n// ─── EXPORTED TYPES ───────────────────────────────────────────────────────────\n\nexport type SearchBarRootVariants = VariantProps<typeof searchBarRootVariants>;\nexport type SearchBarStateLayerVariants = VariantProps<typeof searchBarStateLayerVariants>;\nexport type SearchBarFocusRingVariants = VariantProps<typeof searchBarFocusRingVariants>;\nexport type SearchBarLeadingIconVariants = VariantProps<typeof searchBarLeadingIconVariants>;\nexport type SearchBarTrailingActionVariants = VariantProps<typeof searchBarTrailingActionVariants>;\nexport type SearchBarTrailingActionsVariants = VariantProps<\n  typeof searchBarTrailingActionsVariants\n>;\nexport type SearchBarAvatarVariants = VariantProps<typeof searchBarAvatarVariants>;\nexport type SearchBarInputVariants = VariantProps<typeof searchBarInputVariants>;\nexport type SearchViewVariants = VariantProps<typeof searchViewVariants>;\nexport type SearchViewHeaderVariants = VariantProps<typeof searchViewHeaderVariants>;\nexport type SearchViewBackButtonVariants = VariantProps<typeof searchViewBackButtonVariants>;\nexport type SearchViewClearButtonVariants = VariantProps<typeof searchViewClearButtonVariants>;\nexport type SearchViewTrailingActionVariants = VariantProps<\n  typeof searchViewTrailingActionVariants\n>;\nexport type SearchViewTrailingActionsVariants = VariantProps<\n  typeof searchViewTrailingActionsVariants\n>;\nexport type SearchViewInputVariants = VariantProps<typeof searchViewInputVariants>;\nexport type SearchViewDividerVariants = VariantProps<typeof searchViewDividerVariants>;\nexport type SearchViewContentVariants = VariantProps<typeof searchViewContentVariants>;\n","\"use client\";\n\nimport { forwardRef, useState, useCallback } from \"react\";\nimport type React from \"react\";\nimport { useHover, useFocusRing, mergeProps } from \"react-aria\";\nimport { SearchBarHeadless } from \"./SearchHeadless\";\nimport {\n  searchBarRootVariants,\n  searchBarStateLayerVariants,\n  searchBarFocusRingVariants,\n  searchBarLeadingIconVariants,\n  searchBarTrailingActionVariants,\n  searchBarTrailingActionsVariants,\n  searchBarAvatarVariants,\n  searchBarInputVariants,\n} from \"./Search.variants\";\nimport { cn } from \"../../utils/cn\";\nimport { getInteractionDataAttributes } from \"../../utils/interactionStates\";\nimport { useRipple } from \"../../hooks/useRipple\";\nimport { useReducedMotion } from \"../../hooks/useReducedMotion\";\nimport type { SearchBarProps } from \"./Search.types\";\n\n/**\n * MD3 default leading search icon — shown when no `leadingIcon` prop is provided.\n * Matches the MD3 Search Bar spec which states the leading slot defaults to a search icon.\n * 24×24, currentColor (inherits `text-on-surface` from the leading-icon slot wrapper).\n */\nconst DefaultSearchIcon = (): React.ReactElement => (\n  <svg\n    width=\"24\"\n    height=\"24\"\n    viewBox=\"0 0 24 24\"\n    fill=\"currentColor\"\n    aria-hidden=\"true\"\n    focusable=\"false\"\n  >\n    <path d=\"M15.5 14h-.79l-.28-.27A6.471 6.471 0 0 0 16 9.5 6.5 6.5 0 1 0 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z\" />\n  </svg>\n);\n\n/**\n * Material Design 3 Search Bar Component (Layer 3: Styled)\n *\n * The collapsed/maximized search affordance that transitions to Focused State\n * (SearchView) on click/focus.\n *\n * Implements the Variants-vs-States architecture: all interaction states are\n * expressed as data-* attributes on the root via `getInteractionDataAttributes`\n * and consumed by each slot via `group-data-[x]/search` Tailwind selectors.\n *\n * Anatomy:\n *   [Leading icon] [Input / placeholder] [Trailing actions] [Avatar]\n *\n * Features:\n * - MD3 state layer: hover 8% / pressed 10% opacity (Standard fast effects spring)\n * - Ripple effect on press (Material Design press state)\n * - Focus ring: Secondary color, 3dp, rendered outside overflow-hidden (sibling pattern)\n * - M3 Expressive pane margin: 24dp → 12dp on focus (Expressive fast spatial spring)\n * - Content flag `data-with-actions` switches container spacing: 16dp → 4dp\n *\n * @example\n * ```tsx\n * <SearchBar\n *   placeholder=\"Search messages\"\n *   leadingIcon={<SearchIcon />}\n *   trailingActions={[<IconButton key=\"mic\" aria-label=\"Voice search\"><MicIcon /></IconButton>]}\n *   onFocus={() => setOpen(true)}\n * />\n * ```\n */\nexport const SearchBar = forwardRef<HTMLFormElement, SearchBarProps>(\n  (\n    {\n      value,\n      defaultValue,\n      onChange,\n      onSubmit,\n      onClear,\n      placeholder,\n      leadingIcon,\n      trailingActions,\n      avatar,\n      isDisabled = false,\n      \"aria-label\": ariaLabel,\n      className,\n      searchStyle = \"contained\",\n      onFocus,\n      onBlur,\n    },\n    ref\n  ) => {\n    const hasActions = (trailingActions != null && trailingActions.length > 0) || !!avatar;\n    const reducedMotion = useReducedMotion();\n\n    // Track focus for the M3 Expressive pane-margin transition.\n    // This is a content/layout state, not an interaction data-attr, so local state is correct.\n    const [isFocused, setIsFocused] = useState(false);\n\n    const handleFocusInternal = useCallback(() => {\n      setIsFocused(true);\n      onFocus?.();\n    }, [onFocus]);\n\n    const handleBlurInternal = useCallback(() => {\n      setIsFocused(false);\n      onBlur?.();\n    }, [onBlur]);\n\n    // ── React Aria interaction state hooks ─────────────────────────────────────\n    // useFocusRing with within:true tracks keyboard focus on any descendant.\n    // focusProps spread on the container div lets isFocusVisible flow correctly.\n    const { isHovered, hoverProps } = useHover({ isDisabled });\n    const { isFocusVisible, focusProps } = useFocusRing({ within: true });\n    const [isPressed, setIsPressed] = useState(false);\n\n    // Ripple effect\n    const { onMouseDown: handleRipple, ripples } = useRipple({ disabled: isDisabled });\n\n    const handleMouseDown = useCallback(\n      (e: React.MouseEvent<HTMLElement>) => {\n        setIsPressed(true);\n        handleRipple(e);\n      },\n      [handleRipple]\n    );\n\n    const handleMouseUp = useCallback(() => setIsPressed(false), []);\n\n    // ── Slot content ───────────────────────────────────────────────────────────\n    // Leading icon: use the provided icon or fall back to the MD3 default search icon.\n    // Both are wrapped in the 48dp tap-target + on-surface color slot.\n    const styledLeadingIcon = (\n      <span className={cn(searchBarLeadingIconVariants())}>\n        <span className=\"size-6\">{leadingIcon ?? <DefaultSearchIcon />}</span>\n      </span>\n    );\n\n    // Each action pre-styled with 48dp tap target; the group flex wrapper is applied\n    // via trailingActionsClassName on the <span data-slot=\"trailing-actions\"> in headless.\n    const styledTrailingActions = trailingActions?.map((action, index) => (\n      <span key={index} className={cn(searchBarTrailingActionVariants())}>\n        {action}\n      </span>\n    ));\n\n    const styledAvatar = avatar ? (\n      <span className={cn(searchBarAvatarVariants())}>\n        <span className=\"size-[30px] overflow-hidden rounded-full\">{avatar}</span>\n      </span>\n    ) : undefined;\n\n    // ── M3 Expressive pane margin transition ────────────────────────────────────\n    // Contained style only: margins shrink from 24dp → 12dp on focus.\n    // Divided style uses fixed static margins (non-Expressive, no animation).\n    const paneMarginClass = searchStyle === \"contained\" ? (isFocused ? \"mx-3\" : \"mx-6\") : \"\";\n\n    const paneTransitionClass =\n      searchStyle === \"contained\" && !reducedMotion\n        ? \"transition-[margin] duration-expressive-fast-spatial ease-expressive-fast-spatial\"\n        : \"\";\n\n    return (\n      <div\n        role=\"presentation\"\n        {...mergeProps(hoverProps, focusProps)}\n        className={cn(paneTransitionClass, paneMarginClass)}\n        onMouseUp={handleMouseUp}\n      >\n        {/*\n         * Relative wrapper — provides an absolute positioning context for the focus ring\n         * that sits outside the inner container's overflow-hidden, so the 3dp ring\n         * is never clipped. (Same sibling pattern as Button and Switch.)\n         */}\n        <div role=\"presentation\" className=\"relative\">\n          {/* Focus ring — sibling of inner container, extends 3px beyond pill boundary */}\n          <span className={cn(searchBarFocusRingVariants())} aria-hidden=\"true\" />\n\n          {/* Inner container — group/search anchor for data-* selectors */}\n          <div\n            role=\"presentation\"\n            {...getInteractionDataAttributes({\n              isHovered,\n              isFocusVisible,\n              isPressed,\n              isDisabled,\n            })}\n            data-with-actions={hasActions ? \"\" : undefined}\n            className={cn(\n              \"group/search overflow-hidden\",\n              searchBarRootVariants({ style: searchStyle }),\n              className\n            )}\n            onMouseDown={(e) => handleMouseDown(e as React.MouseEvent<HTMLElement>)}\n          >\n            {/* State layer — clipped to pill shape by parent overflow-hidden */}\n            <span\n              data-slot=\"state-layer\"\n              className={cn(searchBarStateLayerVariants())}\n              aria-hidden=\"true\"\n            />\n\n            {/* Ripple */}\n            {ripples}\n\n            {/* Headless form+input — carries all a11y wiring via React Aria */}\n            <SearchBarHeadless\n              ref={ref}\n              {...(value !== undefined ? { value } : {})}\n              {...(defaultValue !== undefined ? { defaultValue } : {})}\n              {...(onChange !== undefined ? { onChange } : {})}\n              {...(onSubmit !== undefined ? { onSubmit } : {})}\n              {...(onClear !== undefined ? { onClear } : {})}\n              {...(placeholder !== undefined ? { placeholder } : {})}\n              leadingIcon={styledLeadingIcon}\n              {...(styledTrailingActions !== undefined\n                ? { trailingActions: styledTrailingActions }\n                : {})}\n              {...(styledAvatar !== undefined ? { avatar: styledAvatar } : {})}\n              isDisabled={isDisabled}\n              {...(ariaLabel !== undefined ? { \"aria-label\": ariaLabel } : {})}\n              onFocus={handleFocusInternal}\n              onBlur={handleBlurInternal}\n              className=\"relative z-0 flex h-full w-full items-center\"\n              inputClassName={cn(searchBarInputVariants())}\n              trailingActionsClassName={cn(searchBarTrailingActionsVariants())}\n            />\n          </div>\n        </div>\n      </div>\n    );\n  }\n);\n\nSearchBar.displayName = \"SearchBar\";\n","\"use client\";\n\nimport { forwardRef } from \"react\";\nimport { SearchViewHeadless } from \"./SearchHeadless\";\nimport {\n  searchViewVariants,\n  searchViewHeaderVariants,\n  searchViewBackButtonVariants,\n  searchViewClearButtonVariants,\n  searchViewTrailingActionVariants,\n  searchViewTrailingActionsVariants,\n  searchViewInputVariants,\n  searchViewDividerVariants,\n  searchViewContentVariants,\n} from \"./Search.variants\";\nimport { cn } from \"../../utils/cn\";\nimport type { SearchViewProps } from \"./Search.types\";\n\n/**\n * Material Design 3 Search View Component (Layer 3: Styled)\n *\n * The expanded/focused search experience rendered in a portal over page content.\n * Uses per-slot CVAs for all styling — no descendant-selector blobs.\n *\n * Anatomy:\n *   Header: [Back arrow] [Input] [Clear button] [Optional trailing actions]\n *   Divider (divided style only)\n *   Content area: children (suggestions/results via List component)\n *\n * Features:\n * - Portal rendering with focus trap and scroll lock (via headless)\n * - Compound variants for all 4 style × layout combinations\n * - Docked layout: animate-md-scale-in on mount\n * - Fullscreen layout: animate-md-fade-in on mount\n * - Clear button visible only when input has value (controlled by headless)\n * - aria-live region for autosuggest announcements\n *\n * @example\n * ```tsx\n * <SearchView\n *   isOpen={isOpen}\n *   onClose={() => setOpen(false)}\n *   aria-label=\"Search messages\"\n *   searchStyle=\"contained\"\n *   layout=\"fullscreen\"\n * >\n *   <List>{suggestions.map(s => <ListItem key={s.id} headline={s.label} />)}</List>\n * </SearchView>\n * ```\n */\nexport const SearchView = forwardRef<HTMLDivElement, SearchViewProps>(\n  (\n    {\n      isOpen,\n      onClose,\n      value,\n      defaultValue,\n      onChange,\n      onSubmit,\n      placeholder,\n      \"aria-label\": ariaLabel,\n      className,\n      children,\n      searchStyle = \"contained\",\n      layout = \"fullscreen\",\n      leadingIcon,\n      trailingActions,\n      showDivider,\n    },\n    ref\n  ) => {\n    const resolvedShowDivider = showDivider ?? searchStyle === \"divided\";\n\n    // Enter motion: docked uses scale-in (feels contained/popover-like),\n    // fullscreen uses fade-in (covers the screen, no scale distortion).\n    const enterMotionClass = layout === \"docked\" ? \"animate-md-scale-in\" : \"animate-md-fade-in\";\n\n    // ── Slot class strings resolved from CVAs ────────────────────────────────\n    const containerClass = cn(\n      searchViewVariants({ style: searchStyle, layout }),\n      enterMotionClass,\n      className\n    );\n\n    const headerClass = cn(searchViewHeaderVariants({ style: searchStyle, layout }));\n\n    const backButtonClass = cn(searchViewBackButtonVariants());\n\n    const clearButtonClass = cn(searchViewClearButtonVariants());\n\n    const trailingActionClass = cn(searchViewTrailingActionVariants());\n    const trailingActionsGroupClass = cn(searchViewTrailingActionsVariants());\n\n    const inputClass = cn(searchViewInputVariants());\n\n    const dividerClass = cn(searchViewDividerVariants());\n\n    const contentClass = cn(searchViewContentVariants());\n\n    // ── Styled leading icon ──────────────────────────────────────────────────\n    const styledLeadingIcon = leadingIcon ? (\n      <span className=\"text-on-surface flex size-12 shrink-0 items-center justify-center\">\n        {leadingIcon}\n      </span>\n    ) : undefined;\n\n    // ── Styled trailing actions ───────────────────────────────────────────────\n    const styledTrailingActions = trailingActions?.map((action, index) => (\n      <span key={index} className={trailingActionClass}>\n        {action}\n      </span>\n    ));\n\n    return (\n      <SearchViewHeadless\n        ref={ref}\n        isOpen={isOpen}\n        onClose={onClose}\n        layout={layout}\n        {...(value !== undefined ? { value } : {})}\n        {...(defaultValue !== undefined ? { defaultValue } : {})}\n        {...(onChange !== undefined ? { onChange } : {})}\n        {...(onSubmit !== undefined ? { onSubmit } : {})}\n        {...(placeholder !== undefined ? { placeholder } : {})}\n        aria-label={ariaLabel}\n        {...(styledLeadingIcon !== undefined ? { leadingIcon: styledLeadingIcon } : {})}\n        {...(styledTrailingActions !== undefined ? { trailingActions: styledTrailingActions } : {})}\n        showDivider={resolvedShowDivider}\n        // ── Slot class names passed to headless for direct application ────────\n        className={containerClass}\n        headerClassName={headerClass}\n        backButtonClassName={backButtonClass}\n        clearButtonClassName={clearButtonClass}\n        inputClassName={inputClass}\n        trailingActionsClassName={trailingActionsGroupClass}\n        dividerClassName={dividerClass}\n        contentClassName={contentClass}\n      >\n        {children}\n      </SearchViewHeadless>\n    );\n  }\n);\n\nSearchView.displayName = \"SearchView\";\n","\"use client\";\n\nimport { forwardRef, useState, useCallback } from \"react\";\nimport { SearchBar } from \"./SearchBar\";\nimport { SearchView } from \"./SearchView\";\nimport type { SearchProps } from \"./Search.types\";\n\n/**\n * Material Design 3 Search Compound Component (Layer 3: Styled)\n *\n * Combines SearchBar + SearchView in one controlled/uncontrolled unit.\n * Manages the open/close lifecycle between the collapsed bar and expanded view.\n *\n * - When closed: renders SearchBar; focus → opens SearchView\n * - When open: renders SearchView; back/Escape → closes to SearchBar\n *\n * @example\n * ```tsx\n * // Uncontrolled\n * <Search placeholder=\"Search messages\">\n *   <List>{suggestions.map(s => <ListItem key={s.id} headline={s.label} />)}</List>\n * </Search>\n *\n * // Controlled\n * <Search\n *   isOpen={isOpen}\n *   onOpenChange={setOpen}\n *   value={query}\n *   onChange={setQuery}\n *   placeholder=\"Search files\"\n * >\n *   <List>{results.map(r => <ListItem key={r.id} headline={r.label} />)}</List>\n * </Search>\n * ```\n */\nexport const Search = forwardRef<HTMLFormElement, SearchProps>(\n  (\n    {\n      isOpen: controlledIsOpen,\n      onOpenChange,\n      value,\n      defaultValue,\n      onChange,\n      onSubmit,\n      onClear,\n      placeholder,\n      leadingIcon,\n      trailingActions,\n      avatar,\n      isDisabled = false,\n      \"aria-label\": ariaLabel,\n      className,\n      searchStyle = \"contained\",\n      layout = \"fullscreen\",\n      children,\n      viewAriaLabel,\n    },\n    ref\n  ) => {\n    const [internalIsOpen, setInternalIsOpen] = useState(false);\n    const isControlled = controlledIsOpen !== undefined;\n    const isOpen = isControlled ? controlledIsOpen : internalIsOpen;\n\n    const handleOpenChange = useCallback(\n      (open: boolean) => {\n        if (!isControlled) {\n          setInternalIsOpen(open);\n        }\n        onOpenChange?.(open);\n      },\n      [isControlled, onOpenChange]\n    );\n\n    const handleFocus = useCallback(() => {\n      handleOpenChange(true);\n    }, [handleOpenChange]);\n\n    const handleClose = useCallback(() => {\n      handleOpenChange(false);\n    }, [handleOpenChange]);\n\n    if (isOpen) {\n      return (\n        <SearchView\n          isOpen\n          onClose={handleClose}\n          {...(value !== undefined ? { value } : {})}\n          {...(defaultValue !== undefined ? { defaultValue } : {})}\n          {...(onChange !== undefined ? { onChange } : {})}\n          {...(onSubmit !== undefined ? { onSubmit } : {})}\n          {...(placeholder !== undefined ? { placeholder } : {})}\n          aria-label={viewAriaLabel ?? ariaLabel ?? placeholder ?? \"Search\"}\n          searchStyle={searchStyle}\n          layout={layout}\n          {...(trailingActions !== undefined ? { trailingActions } : {})}\n        >\n          {children}\n        </SearchView>\n      );\n    }\n\n    return (\n      <SearchBar\n        ref={ref}\n        {...(value !== undefined ? { value } : {})}\n        {...(defaultValue !== undefined ? { defaultValue } : {})}\n        {...(onChange !== undefined ? { onChange } : {})}\n        {...(onSubmit !== undefined ? { onSubmit } : {})}\n        {...(onClear !== undefined ? { onClear } : {})}\n        {...(placeholder !== undefined ? { placeholder } : {})}\n        {...(leadingIcon !== undefined ? { leadingIcon } : {})}\n        {...(trailingActions !== undefined ? { trailingActions } : {})}\n        {...(avatar !== undefined ? { avatar } : {})}\n        isDisabled={isDisabled}\n        {...(ariaLabel !== undefined ? { \"aria-label\": ariaLabel } : {})}\n        {...(className !== undefined ? { className } : {})}\n        searchStyle={searchStyle}\n        onFocus={handleFocus}\n      />\n    );\n  }\n);\n\nSearch.displayName = \"Search\";\n","\"use client\";\n\nimport { forwardRef } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport type { BadgeHeadlessProps } from \"./Badge.types\";\n\n/**\n * Headless Badge Wrapper (Layer 2)\n *\n * Provides the structural `relative inline-flex` container that\n * positions badge content absolutely over the host element.\n * Unstyled beyond positioning — bring your own badge indicator.\n *\n * @example\n * ```tsx\n * <BadgeHeadless>\n *   <IconButton icon={<BellIcon />} aria-label=\"Notifications\" />\n *   <span className=\"absolute -top-1 -right-1 ...\">3</span>\n * </BadgeHeadless>\n * ```\n */\nexport const BadgeHeadless = forwardRef<HTMLDivElement, BadgeHeadlessProps>(\n  ({ className, children, ...props }, ref) => {\n    return (\n      <div ref={ref} className={cn(\"relative inline-flex\", className)} {...props}>\n        {children}\n      </div>\n    );\n  }\n);\n\nBadgeHeadless.displayName = \"BadgeHeadless\";\n","import { cva, type VariantProps } from \"class-variance-authority\";\n\n/**\n * Material Design 3 Badge Variants\n *\n * Architecture: Variants vs States\n * - CVA holds design-time structure only (no state/content variants, no compoundVariants).\n * - Dot vs count distinction is a content flag — set as `data-dot` on the element.\n * - Visibility is a runtime flag — set as `data-invisible` on the element.\n * - Motion class is applied conditionally in the component (not in CVA) so reduced-motion\n *   can be guarded at the JS level without a variant key.\n *\n * Slot responsibilities:\n *   badgeVariants       — anchored indicator (<span> over a wrapped icon); owns placement + appearance\n *   badgeStaticVariants — trailing pill (inline, no absolute placement); shares appearance only\n *\n * MD3 Spec (m3.material.io/components/badges/specs):\n *   Small (dot): 6dp circle — no text, no padding. `data-[dot]` overrides to size-1.5\n *   Large (number): height 16dp, min-width 16dp, padding 4dp horizontal, shape corner-full\n *   Container: error (bg-error / text-on-error) — only role defined in spec\n *   Typography: label-small (11sp / 1.6 line-height) — applied as base; overridden to zero for dot\n *   Position: badge center sits on the host element's top-right corner (straddling).\n *             Achieved via `top-0 right-0 -translate-y-1/2 translate-x-1/2` — host-size-agnostic.\n *             Mirrors the NavigationBar icon-wrapper badge approach.\n *             In Tailwind v4, `translate-*` and `scale-*` map to the independent native CSS\n *             `translate:` / `scale:` properties, so the static corner translate does NOT\n *             interfere with the scale-0/scale-100 show/hide animation.\n *\n * State-layer opacities: badge is non-interactive — no hover/focus/pressed layers\n * Disabled: badge is hidden via invisible prop (host element owns disabled state)\n */\n\n// ─── SHARED APPEARANCE ────────────────────────────────────────────────────────\n//\n// Common classes between the anchored (badgeVariants) and the static trailing\n// (badgeStaticVariants) forms. Separated so both stay DRY without creating a\n// third CVA that callers would have to compose manually.\n\nconst badgeAppearance = [\n  // ── Shape ─────────────────────────────────────────────────────────────────────\n  \"flex items-center justify-center\",\n  \"rounded-full\",\n  // ── Large (count) sizing — base defaults ──────────────────────────────────────\n  // Height 16dp, min-width 16dp, horizontal padding 4dp\n  \"h-4 min-w-4 px-1\",\n  // ── Color — error role (only MD3-spec role for badges) ────────────────────────\n  \"bg-error text-on-error\",\n  // ── Typography — label-small, tight leading, tabular numbers ──────────────────\n  \"text-label-small leading-none tabular-nums\",\n  // ── Visibility (runtime flag) ──────────────────────────────────────────────────\n  // Base: fully visible\n  \"scale-100\",\n  // data-invisible: scale to zero (visually hidden; aria-label still readable by SR)\n  \"data-[invisible]:scale-0\",\n  // ── Dot content flag overrides (placed last — cascade wins over base sizing) ───\n  // Clear out the count-pill sizing, set 6dp circle\n  \"data-[dot]:size-1.5\",\n  \"data-[dot]:min-w-0\",\n  \"data-[dot]:p-0\",\n  \"data-[dot]:text-[0]\", // suppress any stray text rendering on dot\n] as const;\n\n// ─── BADGE INDICATOR (ANCHORED) ───────────────────────────────────────────────\n\n/**\n * Anchored indicator element — badge center straddles the wrapped host's\n * top-right corner via `top-0 right-0 -translate-y-1/2 translate-x-1/2`.\n *\n * Use this variant (via `BadgeContent`) when the badge wraps an icon element\n * (e.g. a 24dp icon span, an IconButton) and needs to overlay its corner.\n *\n * Content flags (set explicitly by BadgeContent, never by this CVA):\n *   `data-dot`       → element has no count; renders as 6dp dot\n *   `data-invisible` → element is hidden (scale-0); runtime show/hide control\n *\n * Visibility uses scale only (not scale + opacity) per the MD3 Expressive\n * scale-in/out pattern for small components. The transition-transform class\n * is applied conditionally by the component (outside CVA) to allow a\n * component-level reduced-motion guard.\n */\nexport const badgeVariants = cva([\n  // ── Anchored placement — badge center on host's top-right corner ──────────────\n  // top-0 right-0 places the badge's own top-right at the host's top-right,\n  // then the 1/2-element translate moves the badge center onto that corner.\n  // Host-size-agnostic: works for any wrapped element (icon, avatar, nav chip).\n  \"absolute top-0 right-0 -translate-y-1/2 translate-x-1/2\",\n  ...badgeAppearance,\n]);\n\n// ─── BADGE INDICATOR (STATIC / TRAILING) ─────────────────────────────────────\n\n/**\n * Inline (non-anchored) indicator for trailing slots such as the Drawer item.\n *\n * No absolute positioning or translate — the pill sits inline in a flex row.\n * Shares all appearance classes with `badgeVariants` so the visual output\n * (colors, sizing, dot/invisible flags) remains identical.\n *\n * Use in `DrawerItem`'s trailing badge slot where the badge is not overlaid\n * on an icon but rendered as a count chip at the trailing edge of the row.\n */\nexport const badgeStaticVariants = cva([\"inline-flex\", ...badgeAppearance]);\n\n// ─── EXPORTED TYPES ───────────────────────────────────────────────────────────\n\nexport type BadgeVariants = VariantProps<typeof badgeVariants>;\nexport type BadgeStaticVariants = VariantProps<typeof badgeStaticVariants>;\n","\"use client\";\n\nimport { forwardRef } from \"react\";\nimport { badgeVariants } from \"./Badge.variants\";\nimport { cn } from \"../../utils/cn\";\nimport type { BadgeContentProps } from \"./Badge.types\";\n\n/**\n * Derives the visible text for the badge indicator.\n *\n * - No `count` → empty string (dot badge, no text)\n * - `count` ≤ `max` → count as string\n * - `count` > `max` → `\"${max}+\"`\n */\nconst getDisplayValue = (count: number | undefined, max: number): string => {\n  if (count === undefined) return \"\";\n  return count > max ? `${max}+` : count.toString();\n};\n\n/**\n * Derives the accessible label for the badge indicator.\n *\n * - Explicit override → use as-is\n * - No `count` → `\"New\"`\n * - With `count` → `\"${count} notifications\"`\n */\nconst getAriaLabel = (count: number | undefined, override: string | undefined): string => {\n  if (override) return override;\n  return count === undefined ? \"New\" : `${count} notifications`;\n};\n\n/**\n * Badge Content Indicator\n *\n * Renders the badge's visual element — either a small dot (no count)\n * or a count pill. Applies the `badgeVariants` base classes and sets\n * content/visibility data flags directly on the element.\n *\n * Content flags (structural — not interaction state):\n *   `data-dot`       → element is a dot badge (no count)\n *   `data-invisible` → element is hidden (scale-0)\n *\n * Motion:\n *   `transition-transform duration-expressive-fast-spatial ease-expressive-fast-spatial`\n *   is applied when `reducedMotion` is false (component-level guard, per\n *   md3-motion.mdc: JS-driven animations must guard at the component level).\n *\n * Uses `role=\"status\"` so screen readers announce changes to the count.\n */\nexport const BadgeContent = forwardRef<HTMLSpanElement, BadgeContentProps>(\n  (\n    {\n      count,\n      max = 999,\n      invisible = false,\n      \"aria-label\": ariaLabelOverride,\n      reducedMotion = false,\n      className,\n    },\n    ref\n  ) => {\n    const isDot = count === undefined;\n    const displayValue = getDisplayValue(count, max);\n    const ariaLabel = getAriaLabel(count, ariaLabelOverride);\n\n    return (\n      <span\n        ref={ref}\n        role=\"status\"\n        aria-label={ariaLabel}\n        // ── Content flag: dot vs count ──────────────────────────────────────\n        data-dot={isDot ? \"\" : undefined}\n        // ── Visibility runtime flag ─────────────────────────────────────────\n        data-invisible={invisible ? \"\" : undefined}\n        className={cn(\n          badgeVariants(),\n          // MD3 Expressive spatial motion for show/hide scale animation.\n          // Spatial pairing: scale transform → expressive-fast-spatial token.\n          // Guarded at the component level; do NOT use CSS-only reduced-motion\n          // because this is a JS-conditional class, not a persistent transition.\n          !reducedMotion &&\n            \"duration-expressive-fast-spatial ease-expressive-fast-spatial transition-transform\",\n          className\n        )}\n      >\n        {displayValue}\n      </span>\n    );\n  }\n);\n\nBadgeContent.displayName = \"BadgeContent\";\n","\"use client\";\n\nimport { forwardRef } from \"react\";\nimport { BadgeHeadless } from \"./BadgeHeadless\";\nimport { BadgeContent } from \"./BadgeContent\";\nimport { useReducedMotion } from \"../../hooks/useReducedMotion\";\nimport type { BadgeProps } from \"./Badge.types\";\n\n/**\n * Material Design 3 Badge Component (Layer 3: Styled)\n *\n * Composes `BadgeHeadless` (positioning wrapper) with `BadgeContent`\n * (dot or count indicator). Automatically hides the badge when\n * `count` is `0` or `invisible` is `true`.\n *\n * Respects `prefers-reduced-motion` — the scale transition is omitted\n * when the user has requested reduced motion.\n *\n * @example\n * ```tsx\n * // Dot badge\n * <Badge>\n *   <IconButton icon={<BellIcon />} aria-label=\"Notifications\" />\n * </Badge>\n *\n * // Count badge\n * <Badge count={5}>\n *   <IconButton icon={<BellIcon />} aria-label=\"Notifications\" />\n * </Badge>\n *\n * // Capped at 99\n * <Badge count={150} max={99}>\n *   <IconButton icon={<MailIcon />} aria-label=\"Messages\" />\n * </Badge>\n * ```\n */\nexport const Badge = forwardRef<HTMLDivElement, BadgeProps>(\n  ({ count, max = 999, invisible = false, \"aria-label\": ariaLabel, className, children }, ref) => {\n    const isReduced = useReducedMotion();\n    const shouldShow = !invisible && (count === undefined || count > 0);\n\n    return (\n      <BadgeHeadless ref={ref} className={className}>\n        {children}\n        <BadgeContent\n          count={count}\n          max={max}\n          invisible={!shouldShow}\n          aria-label={ariaLabel}\n          reducedMotion={isReduced}\n        />\n      </BadgeHeadless>\n    );\n  }\n);\n\nBadge.displayName = \"Badge\";\n","import { cva, type VariantProps } from \"class-variance-authority\";\n\n/**\n * Material Design 3 Expressive Split Button Variants\n *\n * Architecture: Variants vs States\n * - CVA holds design-time structure only (no disabled/pressed/hovered state variants).\n * - All interaction states are driven by data-* attributes on each segment's root via\n *   group-data-[x]/sb-leading and group-data-[x]/sb-trailing Tailwind selectors.\n * - Inner-corner radius morphing is driven by a CSS variable (--sb-inner-radius) on\n *   the segment root to avoid specificity battles — the same technique as Switch's\n *   --switch-handle-size.\n *\n * Slot responsibilities:\n *   splitButtonContainerVariants  — outer wrapper; gap between the two segments\n *   splitButtonLeadingVariants    — leading (primary) button segment; shape + color\n *   splitButtonTrailingVariants   — trailing (dropdown trigger) button segment; shape + color\n *   splitButtonStateLayerVariants — per-segment hover/focus/press opacity overlay\n *   splitButtonFocusRingVariants  — per-segment keyboard focus outline (extends outside overflow-hidden)\n *   splitButtonLabelVariants      — leading label text slot\n *   splitButtonIconVariants       — icon wrapper; carries per-size optical offset + selected reset\n *   splitButtonMenuVariants       — dropdown menu surface\n *   splitButtonMenuItemVariants   — individual menu item row\n *\n * MD3 Expressive Specs:\n *   Shape: outer corners rounded-full; inner corners morph on interaction\n *   Height: 32dp xs | 40dp sm | 56dp md | 96dp lg | 136dp xl\n *   Trailing segment is always square (width = height); selected state = perfect circle\n *   Gap between segments: 2dp (gap-0.5)\n *   Icon size: 20px xs/sm | 24px md | 32px lg | 40px xl\n *   State-layer opacities: hover 8% | focus 10% | pressed 10%\n *   Disabled: container on-surface/12 | content on-surface/38\n *   Elevation: elevated base=1 hover=2; filled/tonal base=0 hover=1; outlined none\n *\n * Inner-corner radius morph table (--sb-inner-radius CSS variable):\n *\n *   Size     Rest         Hover / Focus        Pressed (stronger)   Selected (trailing)\n *   xs/sm/md --radius-xs  --radius-sm          --radius-lg          --radius-full\n *   lg       --radius-sm  --radius-lg          --radius-xl          --radius-full\n *   xl       --radius-md  --radius-lg          --radius-xl          --radius-full\n *\n * Specificity ladder (CSS attribute selector weight, all at same cascade layer):\n *   rest           → [--sb-inner-radius:...] (0,0,0 base class)\n *   hovered        → data-[hovered]:         (0,1,0)\n *   focus-visible  → data-[fv]:data-[fv]:    (0,2,0)\n *   pressed        → data-[pressed]:data-[pressed]:data-[pressed]:  (0,3,0)\n *   selected       → data-[sel]:data-[sel]:data-[sel]:data-[sel]:   (0,4,0) — always wins\n *\n * Motion token pairing:\n *   Border-radius / transform (spatial) → duration-expressive-fast-spatial ease-expressive-fast-spatial\n *   Opacity / color / shadow (effects)  → duration-spring-standard-fast-effects ease-spring-standard-fast-effects\n *\n * Chevron optical offset (MD3 spec — trailing icon shifts toward center gap when unselected):\n *   xs/sm: -1dp  md: -2dp  lg: -3dp  xl: -6dp\n *   Resets to translate-x-0 when group-data-[selected]/sb-trailing is present.\n */\n\n// ─── OUTER CONTAINER ─────────────────────────────────────────────────────────\n\n/**\n * Outer wrapper div — lays out leading + trailing with a 2dp gap.\n * Does NOT own any color, shape, or elevation — those belong to each segment.\n */\nexport const splitButtonContainerVariants = cva([\n  \"relative inline-flex items-stretch\",\n  \"gap-0.5\", // MD3 2dp gap between segments\n]);\n\n// ─── LEADING (PRIMARY) SEGMENT ────────────────────────────────────────────────\n\n/**\n * Leading segment — the primary action button.\n *\n * Shape:\n *   outer corners (top-left, bottom-left) = rounded-full\n *   inner corners (top-right, bottom-right) = var(--sb-inner-radius), driven by\n *   self-targeting data-[x]: selectors on this element for the CSS variable.\n *\n * The doubled data-[x]:data-[x]: selector for pressed/focus achieves higher\n * specificity than single hover, mirroring the Switch handle-size technique.\n */\nexport const splitButtonLeadingVariants = cva(\n  [\n    // Layout\n    \"group/sb-leading relative inline-flex items-center justify-center\",\n    \"cursor-pointer select-none\",\n    // Shape — asymmetric corners via CSS variable\n    \"rounded-tl-full rounded-bl-full\",\n    \"rounded-tr-[var(--sb-inner-radius,var(--radius-xs))]\",\n    \"rounded-br-[var(--sb-inner-radius,var(--radius-xs))]\",\n    // Inner-corner morph — xs/sm/md defaults; lg/xl override in size variants below.\n    // Specificity ladder: rest (0,0,0) < hover (0,1,0) < focus (0,2,0) < pressed (0,3,0)\n    \"[--sb-inner-radius:var(--radius-xs)]\",\n    \"data-[hovered]:[--sb-inner-radius:var(--radius-sm)]\",\n    \"data-[focus-visible]:data-[focus-visible]:[--sb-inner-radius:var(--radius-sm)]\",\n    // Pressed morphs stronger than hover/focus — tripled selector → (0,3,0)\n    \"data-[pressed]:data-[pressed]:data-[pressed]:[--sb-inner-radius:var(--radius-lg)]\",\n    // Spatial transition for border-radius morphing\n    \"transition-[border-radius]\",\n    \"duration-expressive-fast-spatial ease-expressive-fast-spatial\",\n    // Disabled — self-targeting\n    \"data-[disabled]:cursor-not-allowed data-[disabled]:pointer-events-none\",\n  ],\n  {\n    variants: {\n      /**\n       * Visual variant — controls container color, text color, and elevation.\n       * State layer color is handled in splitButtonStateLayerVariants.\n       */\n      variant: {\n        /**\n         * Filled — highest emphasis.\n         * container=primary, label=on-primary\n         * Elevation: 0 base → 1 hover → 0 focus/pressed\n         */\n        filled: [\n          \"bg-primary text-on-primary shadow-none\",\n          \"group-data-[hovered]/sb-leading:shadow-elevation-1\",\n          \"group-data-[focus-visible]/sb-leading:shadow-none\",\n          \"group-data-[pressed]/sb-leading:group-data-[pressed]/sb-leading:shadow-none\",\n          // Disabled\n          \"data-[disabled]:bg-on-surface/12 data-[disabled]:text-on-surface/38 data-[disabled]:shadow-none\",\n        ],\n\n        /**\n         * Tonal — secondary emphasis.\n         * container=secondary-container, label=on-secondary-container\n         * Elevation: 0 base → 1 hover → 0 focus/pressed\n         */\n        tonal: [\n          \"bg-secondary-container text-on-secondary-container shadow-none\",\n          \"group-data-[hovered]/sb-leading:shadow-elevation-1\",\n          \"group-data-[focus-visible]/sb-leading:shadow-none\",\n          \"group-data-[pressed]/sb-leading:group-data-[pressed]/sb-leading:shadow-none\",\n          // Disabled\n          \"data-[disabled]:bg-on-surface/12 data-[disabled]:text-on-surface/38 data-[disabled]:shadow-none\",\n        ],\n\n        /**\n         * Outlined — medium emphasis. Transparent with border.\n         * container=transparent, border=outline, label=primary\n         * Elevation: always 0\n         */\n        outlined: [\n          \"bg-transparent border border-outline text-primary\",\n          // Disabled\n          \"data-[disabled]:border-on-surface/12 data-[disabled]:text-on-surface/38\",\n        ],\n\n        /**\n         * Elevated — uses surface-container-low with a level-1 shadow base.\n         * container=surface-container-low, label=primary\n         * Elevation: 1 base → 2 hover → 1 focus/pressed\n         */\n        elevated: [\n          \"bg-surface-container-low text-primary shadow-elevation-1\",\n          \"group-data-[hovered]/sb-leading:shadow-elevation-2\",\n          \"group-data-[focus-visible]/sb-leading:shadow-elevation-1\",\n          \"group-data-[pressed]/sb-leading:group-data-[pressed]/sb-leading:shadow-elevation-1\",\n          // Disabled\n          \"data-[disabled]:bg-on-surface/12 data-[disabled]:text-on-surface/38 data-[disabled]:shadow-none\",\n        ],\n      },\n\n      /**\n       * Size — governs height, horizontal padding, typography, and inner-corner rest/morph values.\n       * lg/xl need larger rest radii so their morph steps differ from xs/sm/md.\n       */\n      size: {\n        xs: \"h-8 pl-4 pr-3 text-label-large\",\n        sm: \"h-10 pl-6 pr-4 text-label-large\",\n        md: \"h-14 pl-8 pr-6 text-title-medium\",\n        lg: [\n          \"h-24 pl-10 pr-8 text-headline-small\",\n          // lg rest=sm, hover/focus→lg, pressed→xl\n          \"[--sb-inner-radius:var(--radius-sm)]\",\n          \"data-[hovered]:[--sb-inner-radius:var(--radius-lg)]\",\n          \"data-[focus-visible]:data-[focus-visible]:[--sb-inner-radius:var(--radius-lg)]\",\n          \"data-[pressed]:data-[pressed]:data-[pressed]:[--sb-inner-radius:var(--radius-xl)]\",\n        ],\n        xl: [\n          \"h-[8.5rem] pl-12 pr-10 text-headline-large\",\n          // xl rest=md, hover/focus→lg, pressed→xl\n          \"[--sb-inner-radius:var(--radius-md)]\",\n          \"data-[hovered]:[--sb-inner-radius:var(--radius-lg)]\",\n          \"data-[focus-visible]:data-[focus-visible]:[--sb-inner-radius:var(--radius-lg)]\",\n          \"data-[pressed]:data-[pressed]:data-[pressed]:[--sb-inner-radius:var(--radius-xl)]\",\n        ],\n      },\n    },\n\n    defaultVariants: {\n      variant: \"filled\",\n      size: \"sm\",\n    },\n  }\n);\n\n// ─── TRAILING (DROPDOWN TRIGGER) SEGMENT ─────────────────────────────────────\n\n/**\n * Trailing segment — the dropdown trigger.\n *\n * Shape mirrors leading but mirrored: outer corners right, inner corners left.\n * Uses group/sb-trailing for child slot selectors.\n * Gets data-selected when the menu is open (icon centers per MD3 spec).\n */\nexport const splitButtonTrailingVariants = cva(\n  [\n    // Layout — square so that selected (rounded-full on all corners) = perfect circle\n    \"group/sb-trailing relative inline-flex items-center justify-center shrink-0\",\n    \"cursor-pointer select-none\",\n    // Shape — asymmetric corners, inner on the left side\n    \"rounded-tr-full rounded-br-full\",\n    \"rounded-tl-[var(--sb-inner-radius,var(--radius-xs))]\",\n    \"rounded-bl-[var(--sb-inner-radius,var(--radius-xs))]\",\n    // Inner-corner morph — xs/sm/md defaults; lg/xl override in size variants below.\n    // Specificity ladder: rest (0,0,0) < hover (0,1,0) < focus (0,2,0) < pressed (0,3,0) < selected (0,4,0)\n    \"[--sb-inner-radius:var(--radius-xs)]\",\n    \"data-[hovered]:[--sb-inner-radius:var(--radius-sm)]\",\n    \"data-[focus-visible]:data-[focus-visible]:[--sb-inner-radius:var(--radius-sm)]\",\n    // Pressed morphs stronger than hover/focus — tripled → (0,3,0)\n    \"data-[pressed]:data-[pressed]:data-[pressed]:[--sb-inner-radius:var(--radius-lg)]\",\n    // Selected (menu open) → full circle; quadrupled → (0,4,0) always wins\n    \"data-[selected]:data-[selected]:data-[selected]:data-[selected]:[--sb-inner-radius:var(--radius-full)]\",\n    // Spatial transition for border-radius morphing\n    \"transition-[border-radius]\",\n    \"duration-expressive-fast-spatial ease-expressive-fast-spatial\",\n    // Disabled — self-targeting\n    \"data-[disabled]:cursor-not-allowed data-[disabled]:pointer-events-none\",\n  ],\n  {\n    variants: {\n      variant: {\n        filled: [\n          \"bg-primary text-on-primary shadow-none\",\n          \"group-data-[hovered]/sb-trailing:shadow-elevation-1\",\n          \"group-data-[focus-visible]/sb-trailing:shadow-none\",\n          \"group-data-[pressed]/sb-trailing:group-data-[pressed]/sb-trailing:shadow-none\",\n          \"data-[disabled]:bg-on-surface/12 data-[disabled]:text-on-surface/38 data-[disabled]:shadow-none\",\n        ],\n        tonal: [\n          \"bg-secondary-container text-on-secondary-container shadow-none\",\n          \"group-data-[hovered]/sb-trailing:shadow-elevation-1\",\n          \"group-data-[focus-visible]/sb-trailing:shadow-none\",\n          \"group-data-[pressed]/sb-trailing:group-data-[pressed]/sb-trailing:shadow-none\",\n          \"data-[disabled]:bg-on-surface/12 data-[disabled]:text-on-surface/38 data-[disabled]:shadow-none\",\n        ],\n        outlined: [\n          \"bg-transparent border border-outline text-primary\",\n          \"data-[disabled]:border-on-surface/12 data-[disabled]:text-on-surface/38\",\n        ],\n        elevated: [\n          \"bg-surface-container-low text-primary shadow-elevation-1\",\n          \"group-data-[hovered]/sb-trailing:shadow-elevation-2\",\n          \"group-data-[focus-visible]/sb-trailing:shadow-elevation-1\",\n          \"group-data-[pressed]/sb-trailing:group-data-[pressed]/sb-trailing:shadow-elevation-1\",\n          \"data-[disabled]:bg-on-surface/12 data-[disabled]:text-on-surface/38 data-[disabled]:shadow-none\",\n        ],\n      },\n\n      size: {\n        // Square dimensions (width = height) so selected state = perfect circle.\n        // Per-size inner-radius rest/morph values mirror the leading segment.\n        xs: \"h-8 w-8\",\n        sm: \"h-10 w-10\",\n        md: \"h-14 w-14\",\n        lg: [\n          \"h-24 w-24\",\n          // lg rest=sm, hover/focus→lg, pressed→xl; selected→full handled in base classes\n          \"[--sb-inner-radius:var(--radius-sm)]\",\n          \"data-[hovered]:[--sb-inner-radius:var(--radius-lg)]\",\n          \"data-[focus-visible]:data-[focus-visible]:[--sb-inner-radius:var(--radius-lg)]\",\n          \"data-[pressed]:data-[pressed]:data-[pressed]:[--sb-inner-radius:var(--radius-xl)]\",\n        ],\n        xl: [\n          \"h-[8.5rem] w-[8.5rem]\",\n          // xl rest=md, hover/focus→lg, pressed→xl; selected→full handled in base classes\n          \"[--sb-inner-radius:var(--radius-md)]\",\n          \"data-[hovered]:[--sb-inner-radius:var(--radius-lg)]\",\n          \"data-[focus-visible]:data-[focus-visible]:[--sb-inner-radius:var(--radius-lg)]\",\n          \"data-[pressed]:data-[pressed]:data-[pressed]:[--sb-inner-radius:var(--radius-xl)]\",\n        ],\n      },\n    },\n\n    defaultVariants: {\n      variant: \"filled\",\n      size: \"sm\",\n    },\n  }\n);\n\n// ─── STATE LAYER ─────────────────────────────────────────────────────────────\n\n/**\n * Per-segment state layer — absolute inset overlay that transitions opacity.\n *\n * overflow-hidden clips ripple + state layer to the button shape without\n * affecting the focus ring span (which lives outside this element).\n *\n * Color is variant-specific (MD3 \"on-container\" role):\n *   filled   → bg-on-primary\n *   tonal    → bg-on-secondary-container\n *   outlined → bg-primary\n *   elevated → bg-primary\n *\n * Opacities:\n *   0 at rest | 8% hover | 10% focus | 10% pressed | hidden disabled\n *\n * The doubled attribute selector for pressed gives it higher specificity (0,2,0)\n * than the single hover selector (0,1,0), ensuring pressed always wins.\n *\n * groupScope controls whether this reads from group/sb-leading or group/sb-trailing.\n */\nexport const splitButtonStateLayerVariants = cva(\n  [\n    \"absolute inset-0 rounded-[inherit] overflow-hidden pointer-events-none opacity-0\",\n    \"transition-opacity duration-spring-standard-fast-effects ease-spring-standard-fast-effects\",\n  ],\n  {\n    variants: {\n      variant: {\n        filled: \"bg-on-primary\",\n        tonal: \"bg-on-secondary-container\",\n        outlined: \"bg-primary\",\n        elevated: \"bg-primary\",\n      },\n      /**\n       * groupScope identifies which segment this state layer belongs to so it\n       * reads from the correct group-data-[x]/<scope> selectors.\n       */\n      groupScope: {\n        leading: [\n          \"group-data-[hovered]/sb-leading:opacity-8\",\n          \"group-data-[focus-visible]/sb-leading:opacity-10\",\n          \"group-data-[pressed]/sb-leading:group-data-[pressed]/sb-leading:opacity-10\",\n          \"group-data-[disabled]/sb-leading:hidden\",\n        ],\n        trailing: [\n          \"group-data-[hovered]/sb-trailing:opacity-8\",\n          \"group-data-[focus-visible]/sb-trailing:opacity-10\",\n          \"group-data-[pressed]/sb-trailing:group-data-[pressed]/sb-trailing:opacity-10\",\n          \"group-data-[disabled]/sb-trailing:hidden\",\n        ],\n      },\n    },\n    defaultVariants: {\n      variant: \"filled\",\n      groupScope: \"leading\",\n    },\n  }\n);\n\n// ─── FOCUS RING ───────────────────────────────────────────────────────────────\n\n/**\n * Per-segment focus ring overlay.\n *\n * Rendered as an absolute span with inset-[-3px] so it extends 3px outside\n * the segment boundary. Requires that overflow-hidden is NOT on the segment\n * root — it is moved to the state-layer span instead.\n *\n * Always present in DOM (opacity-0 at rest) for smooth CSS transition.\n */\nexport const splitButtonFocusRingVariants = cva(\n  [\n    \"pointer-events-none absolute inset-[-3px]\",\n    \"outline outline-2 outline-offset-0 outline-secondary\",\n    \"transition-opacity duration-spring-standard-fast-effects ease-spring-standard-fast-effects\",\n    \"opacity-0\",\n  ],\n  {\n    variants: {\n      /**\n       * Corner shape must match the segment it wraps.\n       * Leading: full-left, inner-right follows --sb-inner-radius.\n       * Trailing: full-right, inner-left follows --sb-inner-radius.\n       */\n      groupScope: {\n        leading: [\n          \"rounded-tl-full rounded-bl-full\",\n          \"rounded-tr-[calc(var(--sb-inner-radius,var(--radius-xs))+3px)]\",\n          \"rounded-br-[calc(var(--sb-inner-radius,var(--radius-xs))+3px)]\",\n          \"group-data-[focus-visible]/sb-leading:opacity-100\",\n        ],\n        trailing: [\n          \"rounded-tr-full rounded-br-full\",\n          \"rounded-tl-[calc(var(--sb-inner-radius,var(--radius-xs))+3px)]\",\n          \"rounded-bl-[calc(var(--sb-inner-radius,var(--radius-xs))+3px)]\",\n          \"group-data-[focus-visible]/sb-trailing:opacity-100\",\n        ],\n      },\n    },\n    defaultVariants: { groupScope: \"leading\" },\n  }\n);\n\n// ─── LABEL ────────────────────────────────────────────────────────────────────\n\n/**\n * Label text wrapper — z-10 keeps it above state layer and ripple.\n * Typography is inherited from the leading segment's size class.\n */\nexport const splitButtonLabelVariants = cva([\"relative z-10 inline-flex items-center\"]);\n\n// ─── ICON ─────────────────────────────────────────────────────────────────────\n\n/**\n * Icon wrapper (leading or trailing chevron).\n *\n * Size scales with the button size per MD3 spec:\n *   xs/sm → 20px | md → 24px | lg → 32px | xl → 40px\n *\n * For the trailing chevron the MD3 spec calls for an optical offset toward the\n * gap between segments when the button is unselected, and resets to centered\n * when selected (menu open). The offset is applied as a negative translate-x\n * and reverted via group-data-[selected]/sb-trailing:translate-x-0.\n *\n * Chevron optical offsets (trailing only):\n *   xs/sm: -1dp  md: -2dp  lg: -3dp  xl: -6dp\n */\nexport const splitButtonIconVariants = cva(\n  [\n    \"relative z-10 inline-flex shrink-0 items-center justify-center\",\n    // Spatial spring motion for the optical-offset translate\n    \"transition-transform duration-spring-standard-fast-spatial ease-spring-standard-fast-spatial\",\n    // Reset offset when the trailing segment is in selected state (menu open)\n    \"group-data-[selected]/sb-trailing:translate-x-0\",\n  ],\n  {\n    variants: {\n      size: {\n        // Include per-size icon dimension + unselected optical offset\n        xs: [\"size-5\", \"-translate-x-px\"],\n        sm: [\"size-5\", \"-translate-x-px\"],\n        md: [\"size-6\", \"-translate-x-0.5\"],\n        lg: [\"size-8\", \"-translate-x-[3px]\"],\n        xl: [\"size-10\", \"-translate-x-[6px]\"],\n      },\n    },\n    defaultVariants: { size: \"sm\" },\n  }\n);\n\n// ─── DROPDOWN MENU ────────────────────────────────────────────────────────────\n\n/**\n * Dropdown menu surface — elevated container, positioned below the trailing segment.\n */\nexport const splitButtonMenuVariants = cva([\n  \"absolute top-full right-0 z-50 mt-1 min-w-40\",\n  \"bg-surface-container rounded-md py-2\",\n  \"shadow-elevation-2\",\n  \"animate-md-scale-in\",\n]);\n\n/**\n * Individual menu item row.\n */\nexport const splitButtonMenuItemVariants = cva(\n  [\n    \"text-body-large text-on-surface cursor-pointer px-4 py-2\",\n    \"hover:bg-on-surface/8\",\n    \"focus:bg-on-surface/10 focus:outline-none\",\n  ],\n  {\n    variants: {\n      isDisabled: {\n        true: \"text-on-surface/38 pointer-events-none cursor-not-allowed\",\n        false: \"\",\n      },\n    },\n    defaultVariants: { isDisabled: false },\n  }\n);\n\n// ─── EXPORTED TYPES ───────────────────────────────────────────────────────────\n\nexport type SplitButtonContainerVariants = VariantProps<typeof splitButtonContainerVariants>;\nexport type SplitButtonLeadingVariants = VariantProps<typeof splitButtonLeadingVariants>;\nexport type SplitButtonTrailingVariants = VariantProps<typeof splitButtonTrailingVariants>;\nexport type SplitButtonStateLayerVariants = VariantProps<typeof splitButtonStateLayerVariants>;\nexport type SplitButtonFocusRingVariants = VariantProps<typeof splitButtonFocusRingVariants>;\nexport type SplitButtonIconVariants = VariantProps<typeof splitButtonIconVariants>;\nexport type SplitButtonMenuItemVariantProps = VariantProps<typeof splitButtonMenuItemVariants>;\n\n/**\n * Convenience bundle of all Split Button CVA functions.\n */\nexport const splitButtonVariants = {\n  container: splitButtonContainerVariants,\n  leading: splitButtonLeadingVariants,\n  trailing: splitButtonTrailingVariants,\n  stateLayer: splitButtonStateLayerVariants,\n  focusRing: splitButtonFocusRingVariants,\n  label: splitButtonLabelVariants,\n  icon: splitButtonIconVariants,\n  menu: splitButtonMenuVariants,\n  menuItem: splitButtonMenuItemVariants,\n};\n","\"use client\";\n\nimport { forwardRef, useRef, useCallback, useEffect, useState, type MouseEvent } from \"react\";\nimport { useButton, useHover, useFocusRing, mergeProps } from \"react-aria\";\nimport { useReducedMotion } from \"../../hooks/useReducedMotion\";\nimport { useMenuTriggerState } from \"react-stately\";\nimport {\n  splitButtonContainerVariants,\n  splitButtonLeadingVariants,\n  splitButtonTrailingVariants,\n  splitButtonStateLayerVariants,\n  splitButtonFocusRingVariants,\n  splitButtonLabelVariants,\n  splitButtonIconVariants,\n  splitButtonMenuVariants,\n  splitButtonMenuItemVariants,\n} from \"./SplitButton.variants\";\nimport { useRipple } from \"../../hooks/useRipple\";\nimport { getInteractionDataAttributes } from \"../../utils/interactionStates\";\nimport { cn } from \"../../utils/cn\";\nimport type { SplitButtonProps, SplitButtonMenuItem } from \"./SplitButton.types\";\n\n/**\n * Chevron-down icon for the trailing dropdown trigger.\n * Rotates 180° when the menu is open, using the MD3 spatial spring token.\n * When reduced motion is preferred the rotation is instant (no transition).\n */\nconst ChevronIcon = ({\n  isOpen,\n  reducedMotion,\n}: {\n  isOpen: boolean;\n  reducedMotion: boolean;\n}): React.ReactElement => (\n  <svg\n    aria-hidden=\"true\"\n    data-testid=\"split-button-chevron\"\n    viewBox=\"0 0 24 24\"\n    fill=\"none\"\n    xmlns=\"http://www.w3.org/2000/svg\"\n    className={cn(\n      \"size-full\",\n      !reducedMotion &&\n        \"duration-expressive-fast-spatial ease-expressive-fast-spatial transition-transform\",\n      isOpen && \"rotate-180\"\n    )}\n  >\n    <path d=\"M7 10l5 5 5-5H7z\" fill=\"currentColor\" />\n  </svg>\n);\n\n/**\n * Material Design 3 Expressive Split Button Component (Layer 3: Styled)\n *\n * Combines a leading action button with a trailing dropdown trigger that reveals\n * secondary actions in a menu. Both segments have full MD3 Expressive state layers,\n * per-segment focus rings, and inner-corner shape morphing.\n *\n * Implements the Variants-vs-States architecture: all interaction states are\n * expressed as data-* attributes on each segment root and consumed by child\n * slots via group-data-[x]/sb-leading and group-data-[x]/sb-trailing selectors.\n *\n * Features:\n * - 4 MD3 variants: elevated, filled, tonal, outlined\n * - 5 MD3 Expressive sizes: xs, sm, md, lg, xl\n * - Per-segment React Aria interaction tracking (hover, focus, press)\n * - Per-segment MD3 state layers (hover 8%, focus 10%, pressed 10%)\n * - Per-segment focus rings (extends outside overflow-hidden)\n * - Ripple effect on both segments\n * - Inner-corner shape morphing on interaction (MD3 Expressive signature)\n * - 2dp gap between segments per MD3 spec\n * - Chevron rotation animation on menu open\n * - useReducedMotion guard on all JS-driven transitions\n * - Full keyboard accessibility via React Aria\n *\n * @example\n * ```tsx\n * <SplitButton\n *   variant=\"filled\"\n *   size=\"sm\"\n *   primaryLabel=\"Save\"\n *   onPrimaryAction={() => console.log('saved')}\n *   items={[\n *     { label: 'Save as draft', onAction: () => {} },\n *     { label: 'Save and close', onAction: () => {} }\n *   ]}\n * />\n * ```\n */\nexport const SplitButton = forwardRef<HTMLDivElement, SplitButtonProps>(\n  (\n    {\n      variant = \"filled\",\n      size = \"sm\",\n      primaryLabel,\n      onPrimaryAction,\n      items,\n      isDisabled = false,\n      \"aria-label\": ariaLabel,\n      className,\n    },\n    forwardedRef\n  ) => {\n    const leadingRef = useRef<HTMLButtonElement>(null);\n    const trailingRef = useRef<HTMLButtonElement>(null);\n    const menuRef = useRef<HTMLUListElement>(null);\n\n    const reducedMotion = useReducedMotion();\n\n    const menuState = useMenuTriggerState({});\n\n    // ── Leading segment interaction state ────────────────────────────────────\n    const [isLeadingPressed, setIsLeadingPressed] = useState(false);\n    const handleLeadingPressStart = useCallback(() => setIsLeadingPressed(true), []);\n    const handleLeadingPressEnd = useCallback(() => setIsLeadingPressed(false), []);\n\n    const { isHovered: isLeadingHovered, hoverProps: leadingHoverProps } = useHover({\n      isDisabled,\n    });\n    const { isFocusVisible: isLeadingFocusVisible, focusProps: leadingFocusProps } = useFocusRing();\n\n    const { buttonProps: leadingButtonProps } = useButton(\n      {\n        isDisabled,\n        onPress: onPrimaryAction,\n        onPressStart: handleLeadingPressStart,\n        onPressEnd: handleLeadingPressEnd,\n        elementType: \"button\",\n      },\n      leadingRef\n    );\n\n    // ── Trailing segment interaction state ────────────────────────────────────\n    const [isTrailingPressed, setIsTrailingPressed] = useState(false);\n    const handleTrailingPressStart = useCallback(() => setIsTrailingPressed(true), []);\n    const handleTrailingPressEnd = useCallback(() => setIsTrailingPressed(false), []);\n\n    const { isHovered: isTrailingHovered, hoverProps: trailingHoverProps } = useHover({\n      isDisabled,\n    });\n    const { isFocusVisible: isTrailingFocusVisible, focusProps: trailingFocusProps } =\n      useFocusRing();\n\n    const handleTrailingPress = useCallback(() => {\n      if (menuState.isOpen) {\n        menuState.close();\n      } else {\n        menuState.open();\n      }\n    }, [menuState]);\n\n    const { buttonProps: trailingButtonProps } = useButton(\n      {\n        isDisabled,\n        onPress: handleTrailingPress,\n        onPressStart: handleTrailingPressStart,\n        onPressEnd: handleTrailingPressEnd,\n        elementType: \"button\",\n      },\n      trailingRef\n    );\n\n    // ── Ripple effects ────────────────────────────────────────────────────────\n    const { onMouseDown: handleLeadingRipple, ripples: leadingRipples } = useRipple({\n      disabled: isDisabled,\n    });\n    const { onMouseDown: handleTrailingRipple, ripples: trailingRipples } = useRipple({\n      disabled: isDisabled,\n    });\n\n    const onLeadingMouseDown = useCallback(\n      (e: MouseEvent<HTMLButtonElement>) => {\n        const ariaHandler = leadingButtonProps.onMouseDown as\n          | ((e: MouseEvent<HTMLElement>) => void)\n          | undefined;\n        ariaHandler?.(e);\n        handleLeadingRipple(e);\n      },\n      [leadingButtonProps, handleLeadingRipple]\n    );\n\n    const onTrailingMouseDown = useCallback(\n      (e: MouseEvent<HTMLButtonElement>) => {\n        const ariaHandler = trailingButtonProps.onMouseDown as\n          | ((e: MouseEvent<HTMLElement>) => void)\n          | undefined;\n        ariaHandler?.(e);\n        handleTrailingRipple(e);\n      },\n      [trailingButtonProps, handleTrailingRipple]\n    );\n\n    // ── Menu item handling ────────────────────────────────────────────────────\n    const handleMenuItemSelect = useCallback(\n      (item: SplitButtonMenuItem) => {\n        if (!item.isDisabled) {\n          item.onAction();\n          menuState.close();\n        }\n      },\n      [menuState]\n    );\n\n    // Global Escape closes menu\n    useEffect(() => {\n      if (!menuState.isOpen) return;\n\n      const handleGlobalKeyDown = (e: KeyboardEvent): void => {\n        if (e.key === \"Escape\") {\n          menuState.close();\n          trailingRef.current?.focus();\n        }\n      };\n\n      document.addEventListener(\"keydown\", handleGlobalKeyDown);\n      return () => document.removeEventListener(\"keydown\", handleGlobalKeyDown);\n    }, [menuState, menuState.isOpen]);\n\n    // Arrow / Home / End keyboard navigation within the open menu\n    const handleMenuKeyDown = useCallback(\n      (e: React.KeyboardEvent<HTMLUListElement>) => {\n        const menuItems = Array.from(\n          e.currentTarget.querySelectorAll<HTMLElement>(\n            '[role=\"menuitem\"]:not([aria-disabled=\"true\"])'\n          )\n        );\n        const currentIndex = menuItems.indexOf(document.activeElement as HTMLElement);\n\n        switch (e.key) {\n          case \"ArrowDown\": {\n            e.preventDefault();\n            menuItems[(currentIndex + 1) % menuItems.length]?.focus();\n            break;\n          }\n          case \"ArrowUp\": {\n            e.preventDefault();\n            menuItems[(currentIndex - 1 + menuItems.length) % menuItems.length]?.focus();\n            break;\n          }\n          case \"Home\": {\n            e.preventDefault();\n            menuItems[0]?.focus();\n            break;\n          }\n          case \"End\": {\n            e.preventDefault();\n            menuItems[menuItems.length - 1]?.focus();\n            break;\n          }\n          case \"Escape\": {\n            menuState.close();\n            trailingRef.current?.focus();\n            break;\n          }\n          default:\n            break;\n        }\n      },\n      [menuState]\n    );\n\n    // Auto-focus first enabled item when menu opens\n    useEffect(() => {\n      if (menuState.isOpen && menuRef.current) {\n        const firstItem = menuRef.current.querySelector<HTMLElement>(\n          '[role=\"menuitem\"]:not([aria-disabled=\"true\"])'\n        );\n        firstItem?.focus();\n      }\n    }, [menuState.isOpen]);\n\n    const handleMenuItemKeyDown = useCallback(\n      (e: React.KeyboardEvent<HTMLLIElement>, item: SplitButtonMenuItem) => {\n        if ((e.key === \"Enter\" || e.key === \" \") && !item.isDisabled) {\n          e.preventDefault();\n          item.onAction();\n          menuState.close();\n        }\n      },\n      [menuState]\n    );\n\n    return (\n      <div className=\"relative inline-flex\">\n        <div\n          ref={forwardedRef}\n          role=\"group\"\n          aria-label={ariaLabel ?? `${primaryLabel} split button`}\n          className={cn(splitButtonContainerVariants(), className)}\n        >\n          {/* ── Leading (primary action) segment ──────────────────────────── */}\n          <button\n            {...mergeProps(leadingButtonProps, leadingHoverProps, leadingFocusProps)}\n            ref={leadingRef}\n            type=\"button\"\n            tabIndex={isDisabled ? -1 : 0}\n            onMouseDown={onLeadingMouseDown}\n            // Interaction data attributes drive all state-layer and elevation styling\n            {...getInteractionDataAttributes({\n              isHovered: isLeadingHovered,\n              isFocusVisible: isLeadingFocusVisible,\n              isPressed: isLeadingPressed,\n              isDisabled,\n            })}\n            className={splitButtonLeadingVariants({ variant, size })}\n          >\n            {/* State layer — overflow-hidden here, not on the root */}\n            <span\n              data-testid=\"primary-state-layer\"\n              aria-hidden=\"true\"\n              className={splitButtonStateLayerVariants({ variant, groupScope: \"leading\" })}\n            />\n\n            {/* Ripple */}\n            {leadingRipples}\n\n            {/* Focus ring — outside overflow-hidden, extends 3px past boundary */}\n            <span\n              aria-hidden=\"true\"\n              className={splitButtonFocusRingVariants({ groupScope: \"leading\" })}\n            />\n\n            {/* Label */}\n            <span className={splitButtonLabelVariants()}>{primaryLabel}</span>\n          </button>\n\n          {/* ── Trailing (dropdown trigger) segment ───────────────────────── */}\n          <button\n            {...mergeProps(trailingButtonProps, trailingHoverProps, trailingFocusProps)}\n            ref={trailingRef}\n            type=\"button\"\n            tabIndex={isDisabled ? -1 : 0}\n            aria-haspopup=\"menu\"\n            aria-expanded={menuState.isOpen}\n            aria-label={`${primaryLabel} options, expand`}\n            onMouseDown={onTrailingMouseDown}\n            // data-selected when menu is open — MD3 trailing icon centering\n            {...getInteractionDataAttributes({\n              isHovered: isTrailingHovered,\n              isFocusVisible: isTrailingFocusVisible,\n              isPressed: isTrailingPressed,\n              isSelected: menuState.isOpen,\n              isDisabled,\n            })}\n            className={splitButtonTrailingVariants({ variant, size })}\n          >\n            {/* State layer */}\n            <span\n              data-testid=\"dropdown-state-layer\"\n              aria-hidden=\"true\"\n              className={splitButtonStateLayerVariants({ variant, groupScope: \"trailing\" })}\n            />\n\n            {/* Ripple */}\n            {trailingRipples}\n\n            {/* Focus ring */}\n            <span\n              aria-hidden=\"true\"\n              className={splitButtonFocusRingVariants({ groupScope: \"trailing\" })}\n            />\n\n            {/* Chevron icon — rotates when menu is open */}\n            <span className={splitButtonIconVariants({ size })}>\n              <ChevronIcon isOpen={menuState.isOpen} reducedMotion={reducedMotion} />\n            </span>\n          </button>\n        </div>\n\n        {/* ── Dropdown menu — sibling to the group so it is NOT clipped ─────── */}\n        {menuState.isOpen && (\n          <ul\n            ref={menuRef}\n            role=\"menu\"\n            aria-label={`${primaryLabel} options`}\n            onKeyDown={handleMenuKeyDown}\n            className={splitButtonMenuVariants()}\n          >\n            {items.map((item) => (\n              <li\n                key={item.label}\n                role=\"menuitem\"\n                tabIndex={item.isDisabled ? -1 : 0}\n                aria-disabled={item.isDisabled ?? undefined}\n                onClick={() => handleMenuItemSelect(item)}\n                onKeyDown={(e) => handleMenuItemKeyDown(e, item)}\n                className={splitButtonMenuItemVariants({ isDisabled: item.isDisabled ?? false })}\n              >\n                {item.label}\n              </li>\n            ))}\n          </ul>\n        )}\n      </div>\n    );\n  }\n);\n\nSplitButton.displayName = \"SplitButton\";\n","\"use client\";\n\nimport { forwardRef, useRef, useCallback, useEffect } from \"react\";\nimport { useButton } from \"react-aria\";\nimport { useMenuTriggerState } from \"react-stately\";\nimport type { SplitButtonHeadlessProps, SplitButtonMenuItem } from \"./SplitButton.types\";\n\n/**\n * Headless Split Button Component (Layer 2)\n *\n * Unstyled two-segment button primitive using React Aria for accessibility.\n * Provides behavior only — bring your own styles.\n *\n * Structure:\n * - Leading segment: triggers the main action\n * - Trailing segment: opens/closes the dropdown menu\n *   (separated by a 2dp gap in the styled layer; no divider element here)\n *\n * Both segments are independently focusable via Tab navigation.\n * The trailing trigger manages `aria-haspopup` and `aria-expanded`.\n *\n * @example\n * ```tsx\n * <SplitButtonHeadless\n *   primaryLabel=\"Save\"\n *   onPrimaryAction={() => save()}\n *   items={[\n *     { label: 'Save as PDF', onAction: () => savePDF() },\n *     { label: 'Save as PNG', onAction: () => savePNG() },\n *   ]}\n * />\n * ```\n */\nexport const SplitButtonHeadless = forwardRef<HTMLDivElement, SplitButtonHeadlessProps>(\n  (\n    {\n      primaryLabel,\n      onPrimaryAction,\n      items,\n      isDisabled = false,\n      \"aria-label\": ariaLabel,\n      className,\n    },\n    forwardedRef\n  ) => {\n    const leadingRef = useRef<HTMLButtonElement>(null);\n    const trailingRef = useRef<HTMLButtonElement>(null);\n    const menuRef = useRef<HTMLUListElement>(null);\n\n    const menuState = useMenuTriggerState({});\n\n    const { buttonProps: leadingButtonProps } = useButton(\n      {\n        isDisabled,\n        onPress: onPrimaryAction,\n        elementType: \"button\",\n      },\n      leadingRef\n    );\n\n    const handleTrailingPress = useCallback(() => {\n      if (menuState.isOpen) {\n        menuState.close();\n      } else {\n        menuState.open();\n      }\n    }, [menuState]);\n\n    const { buttonProps: trailingButtonProps } = useButton(\n      {\n        isDisabled,\n        onPress: handleTrailingPress,\n        elementType: \"button\",\n      },\n      trailingRef\n    );\n\n    const handleMenuItemSelect = useCallback(\n      (item: SplitButtonMenuItem) => {\n        if (!item.isDisabled) {\n          item.onAction();\n          menuState.close();\n        }\n      },\n      [menuState]\n    );\n\n    useEffect(() => {\n      if (!menuState.isOpen) return;\n\n      const handleGlobalKeyDown = (e: KeyboardEvent): void => {\n        if (e.key === \"Escape\") {\n          menuState.close();\n          trailingRef.current?.focus();\n        }\n      };\n\n      document.addEventListener(\"keydown\", handleGlobalKeyDown);\n      return () => document.removeEventListener(\"keydown\", handleGlobalKeyDown);\n    }, [menuState, menuState.isOpen]);\n\n    const handleMenuKeyDown = useCallback(\n      (e: React.KeyboardEvent<HTMLUListElement>) => {\n        const menuItems = Array.from(\n          e.currentTarget.querySelectorAll<HTMLElement>(\n            '[role=\"menuitem\"]:not([aria-disabled=\"true\"])'\n          )\n        );\n        const currentIndex = menuItems.indexOf(document.activeElement as HTMLElement);\n\n        switch (e.key) {\n          case \"ArrowDown\": {\n            e.preventDefault();\n            menuItems[(currentIndex + 1) % menuItems.length]?.focus();\n            break;\n          }\n          case \"ArrowUp\": {\n            e.preventDefault();\n            menuItems[(currentIndex - 1 + menuItems.length) % menuItems.length]?.focus();\n            break;\n          }\n          case \"Home\": {\n            e.preventDefault();\n            menuItems[0]?.focus();\n            break;\n          }\n          case \"End\": {\n            e.preventDefault();\n            menuItems[menuItems.length - 1]?.focus();\n            break;\n          }\n          case \"Escape\": {\n            menuState.close();\n            trailingRef.current?.focus();\n            break;\n          }\n          default:\n            break;\n        }\n      },\n      [menuState]\n    );\n\n    // Auto-focus first enabled menu item when the menu opens\n    useEffect(() => {\n      if (menuState.isOpen && menuRef.current) {\n        const firstItem = menuRef.current.querySelector<HTMLElement>(\n          '[role=\"menuitem\"]:not([aria-disabled=\"true\"])'\n        );\n        firstItem?.focus();\n      }\n    }, [menuState.isOpen]);\n\n    const handleMenuItemKeyDown = useCallback(\n      (e: React.KeyboardEvent<HTMLLIElement>, item: SplitButtonMenuItem) => {\n        if ((e.key === \"Enter\" || e.key === \" \") && !item.isDisabled) {\n          e.preventDefault();\n          item.onAction();\n          menuState.close();\n        }\n      },\n      [menuState]\n    );\n\n    return (\n      <div\n        ref={forwardedRef}\n        role=\"group\"\n        aria-label={ariaLabel ?? `${primaryLabel} split button`}\n        className={className}\n      >\n        {/* Leading action segment */}\n        <button\n          {...leadingButtonProps}\n          ref={leadingRef}\n          type=\"button\"\n          tabIndex={isDisabled ? -1 : 0}\n        >\n          {primaryLabel}\n        </button>\n\n        {/* Trailing dropdown trigger segment — no divider element; gap comes from parent layout */}\n        <button\n          {...trailingButtonProps}\n          ref={trailingRef}\n          type=\"button\"\n          tabIndex={isDisabled ? -1 : 0}\n          aria-haspopup=\"menu\"\n          aria-expanded={menuState.isOpen}\n          aria-label={`${primaryLabel} options, expand`}\n        >\n          <svg\n            aria-hidden=\"true\"\n            width=\"18\"\n            height=\"18\"\n            viewBox=\"0 0 24 24\"\n            fill=\"none\"\n            xmlns=\"http://www.w3.org/2000/svg\"\n          >\n            <path d=\"M7 10l5 5 5-5H7z\" fill=\"currentColor\" />\n          </svg>\n        </button>\n\n        {/* Dropdown menu */}\n        {menuState.isOpen && (\n          <ul\n            ref={menuRef}\n            role=\"menu\"\n            aria-label={`${primaryLabel} options`}\n            onKeyDown={handleMenuKeyDown}\n          >\n            {items.map((item) => (\n              <li\n                key={item.label}\n                role=\"menuitem\"\n                tabIndex={item.isDisabled ? -1 : 0}\n                aria-disabled={item.isDisabled ?? undefined}\n                onClick={() => handleMenuItemSelect(item)}\n                onKeyDown={(e) => handleMenuItemKeyDown(e, item)}\n              >\n                {item.label}\n              </li>\n            ))}\n          </ul>\n        )}\n      </div>\n    );\n  }\n);\n\nSplitButtonHeadless.displayName = \"SplitButtonHeadless\";\n\nexport { type SplitButtonHeadlessProps };\n","\"use client\";\n\nimport {\n  Children,\n  createContext,\n  forwardRef,\n  useCallback,\n  useContext,\n  useRef,\n  useState,\n} from \"react\";\nimport { useButton } from \"react-aria\";\nimport { mergeProps } from \"@react-aria/utils\";\n\nimport { useReducedMotion } from \"../../hooks/useReducedMotion\";\nimport { cn } from \"../../utils/cn\";\nimport type { FABMenuContextValue, FABMenuHeadlessProps } from \"./FABMenu.types\";\n\n/**\n * Context for FABMenu — provides open state, direction, and reduced motion\n * preference to child `FABMenuItem` components.\n */\nexport const FABMenuContext = createContext<FABMenuContextValue>({\n  isOpen: false,\n  isExiting: false,\n  direction: \"up\",\n  reducedMotion: false,\n  itemCount: 0,\n});\n\n/**\n * Hook to consume FABMenuContext from within a FABMenuItem or custom child.\n *\n * @example\n * ```tsx\n * const { isOpen, direction, reducedMotion } = useFABMenuContext();\n * ```\n */\nexport function useFABMenuContext(): FABMenuContextValue {\n  return useContext(FABMenuContext);\n}\n\nconst DIRECTION_CLASSES: Record<string, string> = {\n  up: \"flex-col-reverse\",\n  down: \"flex-col\",\n  left: \"flex-row-reverse\",\n  right: \"flex-row\",\n};\n\n/**\n * FABMenuHeadless — Layer 2 headless primitive for the MD3 FAB Menu.\n *\n * Manages open/close state, keyboard interactions, and ARIA attributes\n * without opinionated styling. Uses `useButton` from React Aria for the\n * trigger element and controlled/uncontrolled state management.\n *\n * Features:\n * - Controlled and uncontrolled open state\n * - `useReducedMotion` animation guard\n * - Keyboard: Escape closes, trigger toggles via Enter/Space (via useButton)\n * - ARIA: `aria-expanded` on trigger, `aria-label` on trigger\n * - Context provider for child FABMenuItem components\n * - `forwardRef` to root element\n *\n * @example\n * ```tsx\n * <FABMenuHeadless aria-label=\"Quick actions\" direction=\"up\">\n *   <FABMenuItem icon={<IconEdit />} aria-label=\"Edit\" />\n *   <FABMenuItem icon={<IconShare />} aria-label=\"Share\" />\n * </FABMenuHeadless>\n * ```\n */\nexport const FABMenuHeadless = forwardRef<HTMLDivElement, FABMenuHeadlessProps>(\n  (\n    {\n      open: controlledOpen,\n      defaultOpen = false,\n      onOpenChange,\n      direction = \"up\",\n      \"aria-label\": ariaLabel,\n      className,\n      children,\n    },\n    forwardedRef\n  ) => {\n    const triggerRef = useRef<HTMLButtonElement>(null);\n    const internalRootRef = useRef<HTMLDivElement>(null);\n    const rootRef = (forwardedRef ?? internalRootRef) as React.RefObject<HTMLDivElement>;\n\n    const reducedMotion = useReducedMotion();\n\n    const isControlled = controlledOpen !== undefined;\n    const [internalOpen, setInternalOpen] = useState(defaultOpen);\n    const isOpen = isControlled ? controlledOpen : internalOpen;\n\n    const itemCount = Children.count(children);\n\n    const setIsOpen = useCallback(\n      (next: boolean) => {\n        if (!isControlled) {\n          setInternalOpen(next);\n        }\n        onOpenChange?.(next);\n      },\n      [isControlled, onOpenChange]\n    );\n\n    const toggle = useCallback(() => {\n      setIsOpen(!isOpen);\n    }, [setIsOpen, isOpen]);\n\n    const close = useCallback(() => {\n      setIsOpen(false);\n    }, [setIsOpen]);\n\n    const { buttonProps } = useButton(\n      {\n        onPress: toggle,\n        \"aria-label\": ariaLabel,\n        \"aria-expanded\": isOpen,\n      },\n      triggerRef\n    );\n\n    const handleKeyDown = useCallback(\n      (e: React.KeyboardEvent<HTMLDivElement>) => {\n        if (e.key === \"Escape\" && isOpen) {\n          e.stopPropagation();\n          close();\n          triggerRef.current?.focus();\n          return;\n        }\n        if (isOpen && (e.key === \"ArrowUp\" || e.key === \"ArrowDown\")) {\n          e.preventDefault();\n          const group = rootRef.current?.querySelector<HTMLElement>('[role=\"group\"]');\n          if (!group) return;\n          const items = Array.from(\n            group.querySelectorAll<HTMLButtonElement>(\"button:not([disabled])\")\n          );\n          if (items.length === 0) return;\n          const currentIndex = items.indexOf(document.activeElement as HTMLButtonElement);\n          const nextIndex =\n            e.key === \"ArrowUp\"\n              ? currentIndex <= 0\n                ? items.length - 1\n                : currentIndex - 1\n              : currentIndex >= items.length - 1\n                ? 0\n                : currentIndex + 1;\n          items[nextIndex]?.focus();\n        }\n      },\n      [isOpen, close, rootRef]\n    );\n\n    const contextValue: FABMenuContextValue = {\n      isOpen,\n      isExiting: false,\n      direction,\n      reducedMotion,\n      itemCount,\n    };\n\n    const triggerProps = mergeProps(buttonProps, {\n      type: \"button\" as const,\n    });\n\n    return (\n      <FABMenuContext.Provider value={contextValue}>\n        {/* eslint-disable-next-line jsx-a11y/no-static-element-interactions */}\n        <div\n          ref={rootRef}\n          className={cn(\"inline-flex items-center gap-2\", DIRECTION_CLASSES[direction], className)}\n          onKeyDown={handleKeyDown}\n        >\n          {isOpen && (\n            <div\n              className={cn(\"inline-flex items-center gap-2\", DIRECTION_CLASSES[direction])}\n              role=\"group\"\n              aria-label={`${ariaLabel} actions`}\n            >\n              {children}\n            </div>\n          )}\n          {/* eslint-disable-next-line react/button-has-type -- type is set via mergeProps */}\n          <button {...triggerProps} ref={triggerRef} />\n        </div>\n      </FABMenuContext.Provider>\n    );\n  }\n);\n\nFABMenuHeadless.displayName = \"FABMenuHeadless\";\n","import { cva, type VariantProps } from \"class-variance-authority\";\n\n/**\n * Material Design 3 FABMenu Variants\n *\n * Architecture: Variants vs States\n * - CVA holds design-time structure only (no disabled/state variants in CVA).\n * - All interaction states are driven by data-* attributes on the root via\n *   group-data-[x]/fab-menu-item Tailwind selectors in each slot's base classes.\n * - Content flags (data-with-icon, data-with-label) are set explicitly by the component.\n * - Self-targeting data-[x]: selectors handle root-level disabled styling.\n *\n * Slot responsibilities:\n *   fabMenuVariants           — root container; direction layout\n *   fabMenuItemVariants       — root <button> pill; shape, color, elevation, group scope\n *   fabMenuItemStateLayerVariants — absolute inset overlay; opacity 0/8/10/10; color=on-color\n *   fabMenuItemFocusRingVariants  — keyboard focus outline (inset-[-3px], MUST NOT be clipped)\n *   fabMenuItemIconVariants   — leading icon wrapper; size-6 (24dp)\n *   fabMenuItemLabelVariants  — inline text label slot\n *\n * MD3 Expressive FAB Menu item spec:\n *   Shape:       full-rounded pill (rounded-full)\n *   Height:      56dp (h-14)\n *   Padding:     16dp leading (pl-4), 20dp trailing (pr-5)\n *   Gap:         12dp between icon and label (gap-3)\n *   Icon:        24dp (size-6)\n *   Typography:  Title Medium\n *   Elevation:   base 3 → hover 4 → focus/pressed 3 → disabled none\n *   State-layer: hover 8% | focus 10% | pressed 10% | disabled hidden\n *\n * IMPORTANT — overflow-hidden is NOT on the root button.\n * The focus ring span has `inset-[-3px]` to extend outside the button boundary.\n * Overflow clipping is delegated to the state layer (overflow-hidden + rounded-[inherit]).\n */\n\n// ─── ROOT CONTAINER (FABMenu) ─────────────────────────────────────────────────\n\n/**\n * Root container for FABMenu.\n *\n * The root is sized to the trigger FAB only — `inline-flex` collapses to the\n * FAB's intrinsic size. The items overlay is absolutely positioned, so the\n * container never grows and the FAB never shifts position when the menu opens.\n */\nexport const fabMenuVariants = cva([\"relative\", \"inline-flex\"]);\n\n// ─── MENU ITEMS OVERLAY (FABMenu) ────────────────────────────────────────────\n\n/**\n * Absolutely positioned overlay that holds the menu item list.\n *\n * Anchored to the trigger FAB via logical insets so placement is correct in\n * both LTR and RTL document directions — no consumer intervention needed.\n *\n * `transform-origin` on each direction aligns the `animate-md-scale-in/out`\n * pivot with the FAB edge so items appear to emanate from the trigger:\n *   up    → origin-bottom  (list grows upward from the FAB top edge)\n *   down  → origin-top     (list grows downward from the FAB bottom edge)\n *   left  → origin-right   (list grows leftward from the FAB start edge)\n *   right → origin-left    (list grows rightward from the FAB end edge)\n *\n * Logical properties used (`end-0`, `start-full`, `me-3`, etc.) to respect\n * RTL layout automatically.\n */\nexport const fabMenuListVariants = cva([\"absolute\", \"z-10\", \"flex\", \"gap-3\"], {\n  variants: {\n    direction: {\n      up: [\"bottom-full\", \"mb-3\", \"end-0\", \"flex-col-reverse\", \"items-end\", \"origin-bottom\"],\n      down: [\"top-full\", \"mt-3\", \"end-0\", \"flex-col\", \"items-end\", \"origin-top\"],\n      left: [\n        \"end-full\",\n        \"me-3\",\n        \"top-1/2\",\n        \"-translate-y-1/2\",\n        \"flex-row-reverse\",\n        \"items-center\",\n        \"origin-right\",\n      ],\n      right: [\n        \"start-full\",\n        \"ms-3\",\n        \"top-1/2\",\n        \"-translate-y-1/2\",\n        \"flex-row\",\n        \"items-center\",\n        \"origin-left\",\n      ],\n    },\n  },\n  defaultVariants: {\n    direction: \"up\",\n  },\n});\n\n// ─── MENU ITEM ROOT / CONTAINER ──────────────────────────────────────────────\n\n/**\n * Root <button> pill for a FABMenu action item.\n *\n * IMPORTANT — no overflow-hidden here (focus ring must extend outside).\n * Elevation follows MD3 FAB spec: base 3 → hover 4 → focus/pressed 3 → disabled none.\n * The doubled attribute selector for focus/pressed gives higher specificity than\n * the single hover selector, ensuring they always win.\n *\n * Disabled styling uses self-targeting data-[disabled]: (not group-data —\n * these selectors target the root element itself).\n */\nexport const fabMenuItemVariants = cva(\n  [\n    // Layout — full-rounded pill, NO overflow-hidden (focus ring extends outside)\n    \"relative inline-flex items-center cursor-pointer select-none\",\n    \"rounded-full\",\n    \"h-14 pl-4 pr-5 gap-3\", // 56dp height, 16dp leading, 20dp trailing, 12dp gap\n    // Effects transition for color/bg/shadow\n    \"transition-[color,background-color,box-shadow]\",\n    \"duration-spring-standard-fast-effects ease-spring-standard-fast-effects\",\n    // Disabled — self-targeting data-[x]: selectors\n    \"data-[disabled]:bg-on-surface/12 data-[disabled]:text-on-surface/38\",\n    \"data-[disabled]:shadow-none data-[disabled]:cursor-not-allowed data-[disabled]:pointer-events-none\",\n  ],\n  {\n    variants: {\n      /**\n       * Color role — controls container background, text color, and elevation.\n       * State-layer color must equal the on-color (see fabMenuItemStateLayerVariants).\n       *\n       * Elevation per state:\n       *   base   → elevation-3\n       *   hover  → elevation-4 (group-data-[hovered]/fab-menu-item)\n       *   focus  → elevation-3 (doubled selector wins over hover)\n       *   pressed→ elevation-3 (doubled selector wins over hover)\n       *   disabled → shadow-none (self-targeting data-[disabled])\n       */\n      color: {\n        \"primary-container\": [\n          \"bg-primary-container text-on-primary-container\",\n          \"shadow-elevation-3\",\n          \"group-data-[hovered]/fab-menu-item:shadow-elevation-4\",\n          \"group-data-[focus-visible]/fab-menu-item:shadow-elevation-3\",\n          \"group-data-[pressed]/fab-menu-item:group-data-[pressed]/fab-menu-item:shadow-elevation-3\",\n        ],\n        \"secondary-container\": [\n          \"bg-secondary-container text-on-secondary-container\",\n          \"shadow-elevation-3\",\n          \"group-data-[hovered]/fab-menu-item:shadow-elevation-4\",\n          \"group-data-[focus-visible]/fab-menu-item:shadow-elevation-3\",\n          \"group-data-[pressed]/fab-menu-item:group-data-[pressed]/fab-menu-item:shadow-elevation-3\",\n        ],\n        \"tertiary-container\": [\n          \"bg-tertiary-container text-on-tertiary-container\",\n          \"shadow-elevation-3\",\n          \"group-data-[hovered]/fab-menu-item:shadow-elevation-4\",\n          \"group-data-[focus-visible]/fab-menu-item:shadow-elevation-3\",\n          \"group-data-[pressed]/fab-menu-item:group-data-[pressed]/fab-menu-item:shadow-elevation-3\",\n        ],\n        primary: [\n          \"bg-primary text-on-primary\",\n          \"shadow-elevation-3\",\n          \"group-data-[hovered]/fab-menu-item:shadow-elevation-4\",\n          \"group-data-[focus-visible]/fab-menu-item:shadow-elevation-3\",\n          \"group-data-[pressed]/fab-menu-item:group-data-[pressed]/fab-menu-item:shadow-elevation-3\",\n        ],\n        secondary: [\n          \"bg-secondary text-on-secondary\",\n          \"shadow-elevation-3\",\n          \"group-data-[hovered]/fab-menu-item:shadow-elevation-4\",\n          \"group-data-[focus-visible]/fab-menu-item:shadow-elevation-3\",\n          \"group-data-[pressed]/fab-menu-item:group-data-[pressed]/fab-menu-item:shadow-elevation-3\",\n        ],\n        tertiary: [\n          \"bg-tertiary text-on-tertiary\",\n          \"shadow-elevation-3\",\n          \"group-data-[hovered]/fab-menu-item:shadow-elevation-4\",\n          \"group-data-[focus-visible]/fab-menu-item:shadow-elevation-3\",\n          \"group-data-[pressed]/fab-menu-item:group-data-[pressed]/fab-menu-item:shadow-elevation-3\",\n        ],\n      },\n    },\n    defaultVariants: {\n      color: \"primary-container\",\n    },\n  }\n);\n\n// ─── STATE LAYER ─────────────────────────────────────────────────────────────\n\n/**\n * State layer — absolute inset overlay that transitions opacity on interaction.\n *\n * Per MD3 spec, the state-layer color must equal the icon/on-color:\n *   primary-container   → bg-on-primary-container\n *   secondary-container → bg-on-secondary-container\n *   tertiary-container  → bg-on-tertiary-container\n *   primary (solid)     → bg-on-primary\n *   secondary (solid)   → bg-on-secondary\n *   tertiary (solid)    → bg-on-tertiary\n *\n * Opacity:\n *   0 at rest · 8% hover · 10% focus · 10% pressed · hidden when disabled\n *\n * Pressed (10%) must win over hover (8%) when both data attributes are set.\n * The doubled attribute selector gives it higher specificity:\n *   group-data-[hovered]/fab-menu-item:          → specificity (0,1,0)\n *   group-data-[pressed]/fab-menu-item:group-..  → specificity (0,2,0) always wins\n *\n * overflow-hidden is placed HERE (not on the root) so the state layer clips to\n * the pill shape while the focus ring span can extend outside.\n */\nexport const fabMenuItemStateLayerVariants = cva(\n  [\n    \"absolute inset-0 rounded-[inherit] overflow-hidden pointer-events-none opacity-0\",\n    // Effects transition — opacity must not overshoot\n    \"transition-opacity duration-spring-standard-fast-effects ease-spring-standard-fast-effects\",\n    // Hover: 8%\n    \"group-data-[hovered]/fab-menu-item:opacity-8\",\n    // Focus: 10%\n    \"group-data-[focus-visible]/fab-menu-item:opacity-10\",\n    // Pressed: 10% — doubled selector wins over hover's 8%\n    \"group-data-[pressed]/fab-menu-item:group-data-[pressed]/fab-menu-item:opacity-10\",\n    // No state layer when disabled\n    \"group-data-[disabled]/fab-menu-item:hidden\",\n  ],\n  {\n    variants: {\n      color: {\n        \"primary-container\": \"bg-on-primary-container\",\n        \"secondary-container\": \"bg-on-secondary-container\",\n        \"tertiary-container\": \"bg-on-tertiary-container\",\n        primary: \"bg-on-primary\",\n        secondary: \"bg-on-secondary\",\n        tertiary: \"bg-on-tertiary\",\n      },\n    },\n    defaultVariants: { color: \"primary-container\" },\n  }\n);\n\n// ─── FOCUS RING ───────────────────────────────────────────────────────────────\n\n/**\n * Focus ring overlay.\n *\n * Rendered as an absolute `<span>` with `inset-[-3px]` so it extends 3px\n * outside the button boundary. This REQUIRES that `overflow-hidden` is NOT\n * on the root button — overflow clipping is moved to the state layer.\n *\n * Always present in the DOM (opacity-0 at rest), transitions to opacity-100\n * on keyboard/programmatic focus — avoids layout shifts.\n */\nexport const fabMenuItemFocusRingVariants = cva([\n  \"pointer-events-none absolute inset-[-3px] rounded-full\",\n  \"outline outline-2 outline-offset-0 outline-secondary\",\n  // Effects transition — opacity change must not overshoot\n  \"transition-opacity duration-spring-standard-fast-effects ease-spring-standard-fast-effects\",\n  \"opacity-0\",\n  \"group-data-[focus-visible]/fab-menu-item:opacity-100\",\n]);\n\n// ─── ICON ─────────────────────────────────────────────────────────────────────\n\n/**\n * Leading icon wrapper.\n *\n * MD3 spec: 24×24dp icons inside FAB menu items.\n * Color is inherited from the parent button's text color.\n */\nexport const fabMenuItemIconVariants = cva([\n  \"relative z-10 inline-flex shrink-0 items-center justify-center\",\n  \"size-6\", // 24dp per MD3 spec\n  // Color transition uses effects token (no spatial overshoot on color)\n  \"transition-colors duration-spring-standard-fast-effects ease-spring-standard-fast-effects\",\n]);\n\n// ─── LABEL ────────────────────────────────────────────────────────────────────\n\n/**\n * Inline text label wrapper.\n *\n * MD3 spec: Title Medium typography for FAB menu item labels.\n * z-10 keeps it above the state layer and ripple overlays.\n */\nexport const fabMenuItemLabelVariants = cva([\n  \"relative z-10 inline-flex items-center\",\n  \"text-title-medium\",\n]);\n\n// ─── EXPORTED TYPES ───────────────────────────────────────────────────────────\n\nexport type FABMenuVariants = VariantProps<typeof fabMenuVariants>;\nexport type FABMenuListVariants = VariantProps<typeof fabMenuListVariants>;\nexport type FABMenuItemVariants = VariantProps<typeof fabMenuItemVariants>;\nexport type FABMenuItemStateLayerVariants = VariantProps<typeof fabMenuItemStateLayerVariants>;\nexport type FABMenuItemFocusRingVariants = VariantProps<typeof fabMenuItemFocusRingVariants>;\nexport type FABMenuItemIconVariants = VariantProps<typeof fabMenuItemIconVariants>;\nexport type FABMenuItemLabelVariants = VariantProps<typeof fabMenuItemLabelVariants>;\n","\"use client\";\n\nimport {\n  Children,\n  cloneElement,\n  forwardRef,\n  isValidElement,\n  useCallback,\n  useEffect,\n  useLayoutEffect,\n  useRef,\n  useState,\n} from \"react\";\nimport type React from \"react\";\n\nimport { cn } from \"../../utils/cn\";\nimport { useReducedMotion } from \"../../hooks/useReducedMotion\";\nimport { FABMenuContext } from \"./FABMenuHeadless\";\nimport { FAB } from \"../FAB/FAB\";\nimport { fabMenuVariants, fabMenuListVariants } from \"./FABMenu.variants\";\nimport type { FABMenuProps, FABMenuContextValue } from \"./FABMenu.types\";\n\n/**\n * FABMenu — Material Design 3 Expressive FAB Menu (Layer 3).\n *\n * Renders a trigger FAB that expands a list of MD3 Expressive pill menu items\n * in the specified direction. Manages stagger animation-delay on children,\n * elevation changes on the trigger, and icon rotation (+ → ×).\n *\n * The trigger FAB icon morphs using expressive spring spatial tokens to convey\n * the energetic, high-emphasis nature of the interaction.\n *\n * Built on top of FABMenuContext for state sharing with FABMenuItem children.\n * Uses the existing `FAB` component as the trigger button.\n *\n * @example\n * ```tsx\n * <FABMenu aria-label=\"Quick actions\" direction=\"up\">\n *   <FABMenuItem icon={<IconEdit />} label=\"Edit\" />\n *   <FABMenuItem icon={<IconShare />} label=\"Share\" />\n * </FABMenu>\n * ```\n */\nexport const FABMenu = forwardRef<HTMLDivElement, FABMenuProps>(\n  (\n    {\n      open: controlledOpen,\n      defaultOpen = false,\n      onOpenChange,\n      direction = \"up\",\n      \"aria-label\": ariaLabel,\n      className,\n      children,\n    },\n    forwardedRef\n  ) => {\n    const triggerRef = useRef<HTMLButtonElement>(null);\n    const internalRootRef = useRef<HTMLDivElement>(null);\n    const rootRef = (forwardedRef ?? internalRootRef) as React.RefObject<HTMLDivElement>;\n\n    const reducedMotion = useReducedMotion();\n\n    const isControlled = controlledOpen !== undefined;\n    const [internalOpen, setInternalOpen] = useState(defaultOpen);\n    const isOpen = isControlled ? controlledOpen : internalOpen;\n\n    const [isExiting, setIsExiting] = useState(false);\n    const exitTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n    const itemCountRef = useRef(0);\n\n    const itemCount = Children.count(children);\n    itemCountRef.current = itemCount;\n\n    const setIsOpen = useCallback(\n      (next: boolean) => {\n        if (!isControlled) {\n          setInternalOpen(next);\n        }\n        onOpenChange?.(next);\n      },\n      [isControlled, onOpenChange]\n    );\n\n    const toggle = useCallback(() => {\n      setIsOpen(!isOpen);\n    }, [setIsOpen, isOpen]);\n\n    const close = useCallback(() => {\n      setIsOpen(false);\n    }, [setIsOpen]);\n\n    // Manage exit animation: keep items mounted while scale-out plays, then unmount.\n    // useLayoutEffect (not useEffect) is intentional: it fires synchronously after React\n    // commits but before the browser paints. Without this, the browser would paint a\n    // single frame with isOpen=false AND isExiting=false — items gone — before\n    // setIsExiting(true) re-mounts them for the scale-out animation, causing the blink.\n    const prevIsOpenRef = useRef<boolean | undefined>(undefined);\n    useLayoutEffect(() => {\n      if (prevIsOpenRef.current === undefined) {\n        prevIsOpenRef.current = isOpen;\n        return;\n      }\n      const wasOpen = prevIsOpenRef.current;\n      prevIsOpenRef.current = isOpen;\n\n      if (wasOpen && !isOpen) {\n        setIsExiting(true);\n        if (exitTimerRef.current) clearTimeout(exitTimerRef.current);\n        const maxDelay = Math.max(0, itemCountRef.current - 1) * 30;\n        exitTimerRef.current = setTimeout(() => {\n          setIsExiting(false);\n        }, maxDelay + 250);\n      } else if (isOpen) {\n        setIsExiting(false);\n        if (exitTimerRef.current) {\n          clearTimeout(exitTimerRef.current);\n          exitTimerRef.current = null;\n        }\n      }\n    }, [isOpen]);\n\n    useEffect(() => {\n      return () => {\n        if (exitTimerRef.current) clearTimeout(exitTimerRef.current);\n      };\n    }, []);\n\n    const handleKeyDown = useCallback(\n      (e: React.KeyboardEvent<HTMLDivElement>) => {\n        if (e.key === \"Escape\" && isOpen) {\n          e.stopPropagation();\n          close();\n          triggerRef.current?.focus();\n          return;\n        }\n        if (isOpen && (e.key === \"ArrowUp\" || e.key === \"ArrowDown\")) {\n          e.preventDefault();\n          const group = rootRef.current?.querySelector<HTMLElement>('[role=\"group\"]');\n          if (!group) return;\n          const items = Array.from(\n            group.querySelectorAll<HTMLButtonElement>(\"button:not([disabled])\")\n          );\n          if (items.length === 0) return;\n          const currentIndex = items.indexOf(document.activeElement as HTMLButtonElement);\n          const nextIndex =\n            e.key === \"ArrowUp\"\n              ? currentIndex <= 0\n                ? items.length - 1\n                : currentIndex - 1\n              : currentIndex >= items.length - 1\n                ? 0\n                : currentIndex + 1;\n          items[nextIndex]?.focus();\n        }\n      },\n      [isOpen, close, rootRef]\n    );\n\n    const contextValue: FABMenuContextValue = {\n      isOpen,\n      isExiting,\n      direction,\n      reducedMotion,\n      itemCount,\n    };\n\n    const indexedChildren = Children.map(children, (child, index) => {\n      if (isValidElement<{ index?: number }>(child)) {\n        return cloneElement(child, { index });\n      }\n      return child;\n    });\n\n    return (\n      <FABMenuContext.Provider value={contextValue}>\n        {/* eslint-disable-next-line jsx-a11y/no-static-element-interactions */}\n        <div ref={rootRef} className={cn(fabMenuVariants(), className)} onKeyDown={handleKeyDown}>\n          {(isOpen || isExiting) && (\n            <div\n              className={cn(fabMenuListVariants({ direction }))}\n              role=\"group\"\n              aria-label={`${ariaLabel} actions`}\n            >\n              {indexedChildren}\n            </div>\n          )}\n\n          <FAB\n            ref={triggerRef}\n            onPress={toggle}\n            aria-label={ariaLabel}\n            aria-expanded={isOpen}\n            icon={\n              <svg\n                xmlns=\"http://www.w3.org/2000/svg\"\n                viewBox=\"0 0 24 24\"\n                fill=\"currentColor\"\n                className={cn(\n                  // Expressive fast-spatial: FAB icon is small, high-emphasis — matches FAB enter motion\n                  \"h-6 w-6 transition-transform\",\n                  reducedMotion\n                    ? \"\"\n                    : \"duration-expressive-fast-spatial ease-expressive-fast-spatial\",\n                  isOpen && \"rotate-45\"\n                )}\n                aria-hidden=\"true\"\n              >\n                <path d=\"M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z\" />\n              </svg>\n            }\n            className={cn(isOpen && \"shadow-elevation-4\")}\n          />\n        </div>\n      </FABMenuContext.Provider>\n    );\n  }\n);\n\nFABMenu.displayName = \"FABMenu\";\n","\"use client\";\n\nimport { forwardRef, useRef, useState, useCallback } from \"react\";\nimport type React from \"react\";\nimport { useHover, useFocusRing, useButton, mergeProps } from \"react-aria\";\n\nimport { cn } from \"../../utils/cn\";\nimport { getInteractionDataAttributes } from \"../../utils/interactionStates\";\nimport { useRipple } from \"../../hooks/useRipple\";\nimport { useFABMenuContext } from \"./FABMenuHeadless\";\nimport {\n  fabMenuItemVariants,\n  fabMenuItemStateLayerVariants,\n  fabMenuItemFocusRingVariants,\n  fabMenuItemIconVariants,\n  fabMenuItemLabelVariants,\n} from \"./FABMenu.variants\";\nimport type { FABMenuItemProps } from \"./FABMenu.types\";\n\n/**\n * FABMenuItem — MD3 Expressive FAB Menu action item (Layer 3).\n *\n * Renders as a full-rounded 56dp pill button with a leading icon and an\n * inline text label. Implements the Variants-vs-States architecture:\n * all interaction states are expressed as data-* attributes on the root\n * and consumed by each slot via group-data-[x]/fab-menu-item selectors.\n *\n * Features:\n * - ✅ MD3 Expressive pill shape (56dp height, full-rounded)\n * - ✅ 6 color roles: 3 container + 3 solid (M3 Expressive)\n * - ✅ Elevation 3 base → 4 hover → 3 focus/pressed per MD3 spec\n * - ✅ Correct state-layer opacities: hover 8% / focus 10% / pressed 10%\n * - ✅ Dedicated focus ring slot (inset-[-3px], keyboard-only)\n * - ✅ Ripple effect (Material Design)\n * - ✅ Stagger enter/exit animation (animate-md-scale-in/out), reduce-motion guarded\n * - ✅ Full keyboard accessibility via React Aria\n *\n * @example\n * ```tsx\n * <FABMenuItem\n *   icon={<IconEdit />}\n *   label=\"Edit\"\n *   onPress={() => handleEdit()}\n * />\n *\n * // Solid color role\n * <FABMenuItem icon={<IconAdd />} label=\"Add\" color=\"primary\" />\n * ```\n */\nexport const FABMenuItem = forwardRef<HTMLButtonElement, FABMenuItemProps & { index?: number }>(\n  (\n    {\n      icon,\n      label,\n      \"aria-label\": ariaLabel,\n      onPress,\n      color = \"primary-container\",\n      isDisabled = false,\n      className,\n      index = 0,\n    },\n    forwardedRef\n  ) => {\n    const internalRef = useRef<HTMLButtonElement>(null);\n    const buttonRef = (forwardedRef ?? internalRef) as React.RefObject<HTMLButtonElement>;\n\n    const { isOpen, isExiting, reducedMotion, itemCount, direction } = useFABMenuContext();\n\n    // ── Development warnings ───────────────────────────────────────────────\n    if (process.env.NODE_ENV === \"development\") {\n      if (!label && !ariaLabel) {\n        console.warn(\n          \"[FABMenuItem] Either `label` or `aria-label` must be provided for accessibility.\"\n        );\n      }\n    }\n\n    // ── Interaction state tracking ─────────────────────────────────────────\n    const [isPressed, setIsPressed] = useState(false);\n    const handlePressStart = useCallback(() => setIsPressed(true), []);\n    const handlePressEnd = useCallback(() => setIsPressed(false), []);\n\n    const { isHovered, hoverProps } = useHover({ isDisabled });\n    const { isFocusVisible, focusProps } = useFocusRing();\n\n    // useButton: provides keyboard/pointer interaction handling for accessibility\n    const { buttonProps } = useButton(\n      {\n        ...(onPress ? { onPress } : {}),\n        isDisabled,\n        onPressStart: handlePressStart,\n        onPressEnd: handlePressEnd,\n        ...(ariaLabel ? { \"aria-label\": ariaLabel } : {}),\n        elementType: \"button\",\n      },\n      buttonRef\n    );\n\n    const { onMouseDown: handleRipple, ripples } = useRipple({ disabled: isDisabled });\n\n    // ── Stagger animation ──────────────────────────────────────────────────\n    // Entry: stagger forward (0ms, 30ms, 60ms…)\n    // Exit: stagger in reverse so the last item exits first\n    const staggerDelay = reducedMotion\n      ? 0\n      : isExiting\n        ? Math.max(0, itemCount - 1 - index) * 30\n        : index * 30;\n\n    // Transform-origin matches the list overlay direction so items scale in/out\n    // from the FAB edge rather than the item's own center.\n    const DIRECTION_ORIGIN: Record<string, string> = {\n      up: \"origin-bottom\",\n      down: \"origin-top\",\n      left: \"origin-right\",\n      right: \"origin-left\",\n    };\n    const originClass = reducedMotion ? undefined : DIRECTION_ORIGIN[direction];\n\n    const animationClass = reducedMotion\n      ? undefined\n      : isOpen\n        ? \"animate-md-scale-in\"\n        : isExiting\n          ? \"animate-md-scale-out\"\n          : undefined;\n\n    // Merge React Aria button props with hover + focus props\n    const mergedButtonProps = mergeProps(buttonProps, hoverProps, focusProps, {\n      onMouseDown: handleRipple,\n    });\n\n    // Strip React Aria-specific props from the merged result before putting on DOM\n    const {\n      isDisabled: _isDisabled,\n      onPress: _onPress,\n      onPressStart: _onPressStart,\n      onPressEnd: _onPressEnd,\n      onPressChange: _onPressChange,\n      onPressUp: _onPressUp,\n      ...htmlButtonProps\n    } = mergedButtonProps as unknown as Record<string, unknown>;\n\n    void _isDisabled;\n    void _onPress;\n    void _onPressStart;\n    void _onPressEnd;\n    void _onPressChange;\n    void _onPressUp;\n\n    return (\n      <button\n        {...(htmlButtonProps as React.ButtonHTMLAttributes<HTMLButtonElement>)}\n        ref={buttonRef}\n        type=\"button\"\n        // ── Interaction data attributes ──────────────────────────────────────\n        {...getInteractionDataAttributes({\n          isHovered,\n          isFocusVisible,\n          isPressed,\n          isDisabled,\n        })}\n        // ── Content flags ────────────────────────────────────────────────────\n        data-with-icon={icon ? \"\" : undefined}\n        data-with-label={label ? \"\" : undefined}\n        className={cn(\n          fabMenuItemVariants({ color }),\n          // group/fab-menu-item: enables group-data-[x]/fab-menu-item child selectors in all slots\n          \"group/fab-menu-item\",\n          // Scale pivot toward the FAB so items appear to emanate from the trigger\n          originClass,\n          // Stagger animation class (animate-md-scale-in / animate-md-scale-out)\n          animationClass,\n          className\n        )}\n        style={staggerDelay > 0 ? { animationDelay: `${staggerDelay}ms` } : undefined}\n      >\n        {/* Ripple effect */}\n        {ripples}\n\n        {/* State layer — absolute overlay that transitions opacity on interaction */}\n        <span\n          className={cn(fabMenuItemStateLayerVariants({ color }))}\n          data-state-layer\n          aria-hidden=\"true\"\n        />\n\n        {/* Focus ring — absolute, extends 3px outside boundary; keyboard-only */}\n        <span className={cn(fabMenuItemFocusRingVariants())} aria-hidden=\"true\" />\n\n        {/* Leading icon */}\n        {icon && (\n          <span className={cn(fabMenuItemIconVariants())} aria-hidden=\"true\">\n            {icon}\n          </span>\n        )}\n\n        {/* Inline label */}\n        {label && <span className={cn(fabMenuItemLabelVariants())}>{label}</span>}\n      </button>\n    );\n  }\n);\n\nFABMenuItem.displayName = \"FABMenuItem\";\n","\"use client\";\n\nimport { forwardRef, useEffect, useMemo, useRef } from \"react\";\nimport type React from \"react\";\nimport {\n  mergeProps,\n  useFocusRing,\n  useHover,\n  useSlider,\n  useSliderThumb,\n  VisuallyHidden,\n} from \"react-aria\";\nimport { useSliderState } from \"react-stately\";\nimport type { SliderState } from \"react-stately\";\nimport { cn } from \"../../utils/cn\";\nimport { getInteractionDataAttributes } from \"../../utils/interactionStates\";\nimport type { SliderHeadlessProps, SliderThumbRenderState } from \"./Slider.types\";\n\n// ─── Centered Variant Utilities ───────────────────────────────────────────────\n\n/**\n * Calculate the percentage position of zero within the slider range.\n * For range [-100, 100]: zeroPercent = 50\n * For range [-50, 150]: zeroPercent = 25\n * For range [0, 100]:   zeroPercent = 0  (degenerates to standard)\n */\nfunction getZeroPercent(minValue: number, maxValue: number): number {\n  if (minValue >= 0) return 0;\n  if (maxValue <= 0) return 100;\n  return ((0 - minValue) / (maxValue - minValue)) * 100;\n}\n\n/**\n * Determine which side of center the thumb sits on.\n */\nfunction getValueDirection(value: number): \"negative\" | \"positive\" | \"zero\" {\n  if (value < 0) return \"negative\";\n  if (value > 0) return \"positive\";\n  return \"zero\";\n}\n\n// ─── Internal Thumb ───────────────────────────────────────────────────────────\n\ninterface SliderThumbInternalProps {\n  index: number;\n  state: SliderState;\n  trackRef: React.RefObject<HTMLDivElement>;\n  isDisabled: boolean;\n  orientation: \"horizontal\" | \"vertical\";\n  formatValue?: (value: number) => string;\n  \"aria-label\"?: string;\n  className?: string;\n  \"data-direction\"?: \"negative\" | \"positive\" | \"zero\";\n  renderContent?: (state: SliderThumbRenderState) => React.ReactNode;\n  onDraggingChange?: (isDragging: boolean) => void;\n}\n\nfunction SliderThumbInternal({\n  index,\n  state,\n  trackRef,\n  isDisabled,\n  orientation,\n  formatValue,\n  className,\n  \"data-direction\": dataDirection,\n  renderContent,\n  onDraggingChange,\n  ...ariaProps\n}: SliderThumbInternalProps): React.JSX.Element {\n  const inputRef = useRef<HTMLInputElement>(null);\n\n  const { thumbProps, inputProps, isDragging, isFocused } = useSliderThumb(\n    {\n      index,\n      trackRef,\n      inputRef,\n      isDisabled,\n      ...ariaProps,\n    },\n    state\n  );\n\n  const { isFocusVisible, focusProps } = useFocusRing();\n  const { isHovered, hoverProps } = useHover({ isDisabled });\n\n  // Notify parent when dragging state changes so Slider.tsx can suppress\n  // the track flex-basis transition during active drag (matches Switch/Button pattern).\n  useEffect(() => {\n    onDraggingChange?.(isDragging);\n  }, [isDragging, onDraggingChange]);\n\n  // Override aria-valuetext with the custom formatter when provided.\n  // React Stately v3.7 does not support getValueLabel; we patch the attribute directly.\n  const currentValue = state.getThumbValue(index);\n  const ariaValueText = formatValue ? formatValue(currentValue) : undefined;\n\n  // Absolute positioning: place the thumb (and its visual content) exactly\n  // at the value's percentage position on the track.\n  // Horizontal: left edge at `pct%`, centered via translate(-50%, -50%)\n  // Vertical:   bottom edge at `pct%`, centered via translate(-50%, 50%)\n  const thumbPercent = state.getThumbPercent(index);\n  const positionStyle: React.CSSProperties =\n    orientation === \"horizontal\"\n      ? {\n          position: \"absolute\",\n          left: `${thumbPercent * 100}%`,\n          top: \"50%\",\n          transform: \"translate(-50%, -50%)\",\n          zIndex: 10,\n        }\n      : {\n          position: \"absolute\",\n          bottom: `${thumbPercent * 100}%`,\n          left: \"50%\",\n          transform: \"translate(-50%, 50%)\",\n          zIndex: 10,\n        };\n\n  const renderState: SliderThumbRenderState = {\n    index,\n    value: currentValue,\n    isDragging,\n    isFocusVisible,\n    isHovered,\n    isDisabled,\n  };\n\n  return (\n    <div\n      {...mergeProps(thumbProps, hoverProps, { style: positionStyle })}\n      data-slot=\"slider-thumb\"\n      data-dragging={isDragging || undefined}\n      data-focused={isFocused || undefined}\n      {...(dataDirection !== undefined ? { \"data-direction\": dataDirection } : {})}\n      {...getInteractionDataAttributes({\n        isHovered,\n        isFocusVisible,\n        isPressed: isDragging,\n        isDisabled,\n      })}\n      className={cn(\n        // Group scope: interaction selectors on children target this element\n        \"group/slider-thumb\",\n        // Accessibility: remove default outline (custom focus ring via data-[focus-visible])\n        \"outline-none\",\n        // Focus ring visible only on keyboard focus — matches project pattern\n        \"data-[focus-visible]:ring-3\",\n        \"data-[focus-visible]:ring-secondary\",\n        \"data-[focus-visible]:ring-offset-2\",\n        className\n      )}\n    >\n      <VisuallyHidden>\n        <input\n          ref={inputRef}\n          {...mergeProps(inputProps, focusProps)}\n          {...(ariaValueText !== undefined ? { \"aria-valuetext\": ariaValueText } : {})}\n        />\n      </VisuallyHidden>\n      {renderContent?.(renderState)}\n    </div>\n  );\n}\n\n// ─── SliderHeadless ───────────────────────────────────────────────────────────\n\n/**\n * Headless Slider Component (Layer 2)\n *\n * Unstyled slider primitive using React Aria for full accessibility.\n * Provides behavior only — bring your own styles.\n *\n * Features:\n * - role=\"group\" on container with role=\"slider\" on thumb input\n * - Full keyboard navigation: Arrow keys, Page Up/Down, Home, End\n * - Pointer drag with capture (mouse, touch, pen)\n * - Click-to-seek on the track\n * - Controlled and uncontrolled value management\n * - Horizontal and vertical orientations\n * - Discrete stepping support\n * - Live value announcements via <output>\n * - data-* attributes for styled layer targeting\n * - `group/slider-thumb` scope on each thumb for group-data CSS selectors\n * - `renderThumbContent` render prop for injecting visual content inside RA thumb\n *\n * @example\n * ```tsx\n * <SliderHeadless label=\"Volume\" defaultValue={[50]} />\n *\n * <SliderHeadless\n *   label=\"Price range\"\n *   variant=\"range\"\n *   minValue={0}\n *   maxValue={500}\n *   defaultValue={[100, 400]}\n *   formatValue={(v) => `$${v}`}\n * />\n * ```\n */\nexport const SliderHeadless = forwardRef<HTMLDivElement, SliderHeadlessProps>(\n  (props, forwardedRef) => {\n    const {\n      variant = \"standard\",\n      orientation = \"horizontal\",\n      minValue = 0,\n      maxValue = 100,\n      step,\n      value,\n      defaultValue,\n      onChange,\n      onChangeEnd,\n      isDisabled = false,\n      label,\n      formatValue,\n      thumbLabels,\n      className,\n      style,\n      children,\n      trackClassName,\n      renderThumbContent,\n      onThumbDraggingChange,\n      ...ariaProps\n    } = props;\n\n    const trackRef = useRef<HTMLDivElement>(null);\n    const internalRef = useRef<HTMLDivElement>(null);\n    const containerRef = (forwardedRef ?? internalRef) as React.RefObject<HTMLDivElement>;\n\n    if (process.env.NODE_ENV !== \"production\") {\n      if (!label && !ariaProps[\"aria-label\"] && !ariaProps[\"aria-labelledby\"]) {\n        console.warn(\n          \"[Slider] Slider must have an accessible name. Provide a `label`, `aria-label`, or `aria-labelledby` prop.\"\n        );\n      }\n    }\n\n    // Stable formatter for React Stately value announcements\n    const numberFormatter = useMemo(() => new Intl.NumberFormat(), []);\n\n    const resolvedDefaultValue =\n      defaultValue ?? (variant === \"range\" ? [25, 75] : variant === \"centered\" ? [0] : [minValue]);\n\n    // Build state options — omit optional props when undefined to satisfy exactOptionalPropertyTypes\n    const state = useSliderState({\n      minValue,\n      maxValue,\n      ...(step !== undefined ? { step } : {}),\n      orientation,\n      isDisabled,\n      ...(label !== undefined ? { label } : {}),\n      ...(value !== undefined ? { value } : {}),\n      defaultValue: resolvedDefaultValue,\n      ...(onChange !== undefined ? { onChange } : {}),\n      ...(onChangeEnd !== undefined ? { onChangeEnd } : {}),\n      numberFormatter,\n    });\n\n    const { groupProps, trackProps, labelProps, outputProps } = useSlider(\n      {\n        ...ariaProps,\n        ...(label !== undefined ? { label } : {}),\n        orientation,\n        isDisabled,\n        minValue,\n        maxValue,\n        ...(step !== undefined ? { step } : {}),\n        ...(value !== undefined ? { value } : {}),\n        defaultValue: resolvedDefaultValue,\n        ...(onChange !== undefined ? { onChange } : {}),\n        ...(onChangeEnd !== undefined ? { onChangeEnd } : {}),\n      },\n      state,\n      trackRef\n    );\n\n    const isRange = variant === \"range\";\n    const isCentered = variant === \"centered\";\n\n    const zeroPercent = isCentered ? getZeroPercent(minValue, maxValue) : undefined;\n    const direction = isCentered ? getValueDirection(state.getThumbValue(0)) : undefined;\n\n    // For range, each thumb needs its own distinct aria-label so screen readers\n    // can distinguish between the minimum and maximum handle.\n    const thumb0Label = isRange ? (thumbLabels?.[0] ?? \"Minimum\") : ariaProps[\"aria-label\"];\n\n    return (\n      <div\n        {...groupProps}\n        ref={containerRef}\n        className={className}\n        style={style}\n        data-orientation={orientation}\n        data-disabled={isDisabled || undefined}\n        data-variant={variant}\n        {...(zeroPercent !== undefined ? { \"data-zero-percent\": zeroPercent } : {})}\n      >\n        {label && (\n          <label {...labelProps} className={cn(orientation === \"vertical\" && \"sr-only\")}>\n            {label}\n          </label>\n        )}\n        <output\n          {...outputProps}\n          className={cn(\n            orientation === \"horizontal\" && \"justify-self-end\",\n            orientation === \"vertical\" && \"sr-only\"\n          )}\n        >\n          {isRange\n            ? formatValue\n              ? `${formatValue(state.getThumbValue(0))} \\u2013 ${formatValue(state.getThumbValue(1))}`\n              : `${state.getThumbValueLabel(0)} \\u2013 ${state.getThumbValueLabel(1)}`\n            : formatValue\n              ? formatValue(state.getThumbValue(0))\n              : state.getThumbValueLabel(0)}\n        </output>\n        <div\n          {...trackProps}\n          ref={trackRef}\n          data-orientation={orientation}\n          data-track\n          {...(zeroPercent !== undefined ? { \"data-zero-percent\": zeroPercent } : {})}\n          // `relative` is required so the absolutely-positioned RA thumbs\n          // (which carry all visual content in the new arch) are positioned\n          // relative to this element.\n          className={cn(\n            trackClassName ?? \"relative w-full\",\n            orientation === \"vertical\" && !trackClassName && \"h-full\"\n          )}\n        >\n          {children}\n          <SliderThumbInternal\n            index={0}\n            state={state}\n            trackRef={trackRef}\n            isDisabled={isDisabled}\n            orientation={orientation}\n            {...(formatValue !== undefined ? { formatValue } : {})}\n            {...(thumb0Label !== undefined ? { \"aria-label\": thumb0Label } : {})}\n            {...(direction !== undefined ? { \"data-direction\": direction } : {})}\n            {...(renderThumbContent !== undefined ? { renderContent: renderThumbContent } : {})}\n            {...(onThumbDraggingChange !== undefined\n              ? { onDraggingChange: (d) => onThumbDraggingChange(0, d) }\n              : {})}\n          />\n          {isRange && (\n            <SliderThumbInternal\n              index={1}\n              state={state}\n              trackRef={trackRef}\n              isDisabled={isDisabled}\n              orientation={orientation}\n              {...(formatValue !== undefined ? { formatValue } : {})}\n              aria-label={thumbLabels?.[1] ?? \"Maximum\"}\n              {...(renderThumbContent !== undefined ? { renderContent: renderThumbContent } : {})}\n              {...(onThumbDraggingChange !== undefined\n                ? { onDraggingChange: (d) => onThumbDraggingChange(1, d) }\n                : {})}\n            />\n          )}\n        </div>\n      </div>\n    );\n  }\n);\n\nSliderHeadless.displayName = \"SliderHeadless\";\n","import { cva } from \"class-variance-authority\";\n\n// ─── Container ────────────────────────────────────────────────────────────────\n\n/**\n * Slider root container variants.\n *\n * The root element carries:\n * - `group/slider` — scope for track/stop disabled-state selectors\n *   (`group-data-[disabled]/slider:*`)\n *\n * Horizontal layout: CSS grid with label (col 1) + output (col 2) in the first\n * row, and the full-width track region spanning both columns in the second row.\n * This matches the canonical React Aria / MD3 layout and prevents the track\n * from collapsing when label + output are inline siblings.\n *\n * Vertical layout: flex-col so label is above the track.\n * The size-based HEIGHT lives on the track region, not here (the container is\n * auto-height in horizontal so it wraps the grid rows naturally).\n */\nexport const sliderContainerVariants = cva([\"group/slider\", \"relative\", \"select-none\"], {\n  variants: {\n    orientation: {\n      // Grid: 1fr for label, auto for output value; gap-x for label↔output spacing\n      horizontal: \"grid grid-cols-[1fr_auto] items-center gap-x-2 w-full\",\n      // Flex column: label → track → output stacked; width = handle height (per size)\n      vertical: \"flex flex-col items-center h-full\",\n    },\n    size: {\n      // Vertical orientation: container width = handle height (dimensions transposed)\n      // Applied only for vertical via compoundVariants below\n      // NOTE: measurement-derived values from MD3 spec §4.2; permitted exception\n      xsmall: \"\",\n      small: \"\",\n      medium: \"\",\n      large: \"\",\n      xlarge: \"\",\n    },\n  },\n  compoundVariants: [\n    // Vertical: container WIDTH = handle height (MD3 §10.9 — dimensions transposed)\n    // NOTE: measurement-derived values from MD3 spec §4.2; permitted exception\n    { orientation: \"vertical\", size: \"xsmall\", class: \"w-[44px]\" },\n    { orientation: \"vertical\", size: \"small\", class: \"w-[44px]\" },\n    { orientation: \"vertical\", size: \"medium\", class: \"w-[52px]\" },\n    { orientation: \"vertical\", size: \"large\", class: \"w-[68px]\" },\n    { orientation: \"vertical\", size: \"xlarge\", class: \"w-[108px]\" },\n  ],\n  defaultVariants: {\n    orientation: \"horizontal\",\n    size: \"xsmall\",\n  },\n});\n\n// ─── Track Region ─────────────────────────────────────────────────────────────\n\n/**\n * The track region element (`data-track`).\n *\n * This is the element that React Aria measures for pointer math. It must have\n * a defined width (horizontal) or height (vertical) and be `position: relative`\n * so the absolutely-positioned RA thumb children resolve correctly.\n *\n * In horizontal grid layout it spans both columns (`col-span-2`) and carries\n * the size HEIGHT that was previously on the container. In vertical layout it\n * fills the full parent height and carries the size WIDTH.\n *\n * NOTE: measurement-derived size values from MD3 spec §4.2; permitted exception.\n */\nexport const sliderTrackRegionVariants = cva([\"relative\", \"touch-none\"], {\n  variants: {\n    orientation: {\n      horizontal: \"col-span-2 w-full\",\n      // flex-1 fills the vertical container reliably; h-full collapses when the\n      // container itself is a flex item without an explicit pixel height (CSS spec).\n      // min-h-0 allows the flex child to shrink below its natural size if needed.\n      vertical: \"flex-1 min-h-0\",\n    },\n    size: {\n      // Horizontal: size controls track region HEIGHT (= handle height)\n      // Vertical: size controls track region WIDTH (= handle height, dimensions transposed)\n      // Applied as compound variants below to avoid cross-orientation conflicts\n      xsmall: \"\",\n      small: \"\",\n      medium: \"\",\n      large: \"\",\n      xlarge: \"\",\n    },\n  },\n  compoundVariants: [\n    // Horizontal: height = handle height per MD3 §4.2\n    { orientation: \"horizontal\", size: \"xsmall\", class: \"h-[44px]\" },\n    { orientation: \"horizontal\", size: \"small\", class: \"h-[44px]\" },\n    { orientation: \"horizontal\", size: \"medium\", class: \"h-[52px]\" },\n    { orientation: \"horizontal\", size: \"large\", class: \"h-[68px]\" },\n    { orientation: \"horizontal\", size: \"xlarge\", class: \"h-[108px]\" },\n    // Vertical: width = handle height (transposed per MD3 §10.9)\n    { orientation: \"vertical\", size: \"xsmall\", class: \"w-[44px]\" },\n    { orientation: \"vertical\", size: \"small\", class: \"w-[44px]\" },\n    { orientation: \"vertical\", size: \"medium\", class: \"w-[52px]\" },\n    { orientation: \"vertical\", size: \"large\", class: \"w-[68px]\" },\n    { orientation: \"vertical\", size: \"xlarge\", class: \"w-[108px]\" },\n  ],\n  defaultVariants: {\n    orientation: \"horizontal\",\n    size: \"xsmall\",\n  },\n});\n\n// ─── Track Layout ─────────────────────────────────────────────────────────────\n\n/**\n * Absolute-fill container that holds the active and inactive track segments.\n *\n * Segments are `position: absolute` children sharing the same percentage\n * coordinate space as the React Aria thumbs, so fills always align with\n * handle positions regardless of value or orientation.\n *\n * The MD3 6dp thumb-track gap (`thumbTrackGapSize`) is applied as a symmetric\n * 3px offset on each side of the thumb in the parent's inline position styles.\n *\n * `pointer-events-none` lets React Aria's track click-to-seek events\n * reach the `data-track` region without interference.\n */\nexport const sliderTrackLayoutVariants = cva([\"absolute\", \"inset-0\", \"pointer-events-none\"]);\n\n// ─── Active Track ─────────────────────────────────────────────────────────────\n\n/**\n * The filled (active) portion of the slider track.\n *\n * **Color**: `bg-primary`\n * **Disabled**: driven by `group-data-[disabled]/slider:*` — no CVA disabled variant.\n * **Transition**: `flex-basis` spring (spatial) when not dragging/reduced-motion.\n *\n * MD3 §6, §10.2: outer corner = size corner token, inner corner (near handle) = 2dp.\n * NOTE: measurement-derived corner values from MD3 spec §6; permitted exception.\n */\nexport const sliderActiveTrackVariants = cva(\n  [\n    // Color\n    \"bg-primary\",\n    // Disabled — driven by root group/slider data-disabled attr\n    \"group-data-[disabled]/slider:bg-on-surface\",\n    \"group-data-[disabled]/slider:opacity-38\",\n    // Layout — absolute fill within the track region\n    \"absolute\",\n    \"overflow-hidden\",\n  ],\n  {\n    variants: {\n      size: {\n        // Horizontal: left (start) = outer corner, right (near handle) = 2dp inner\n        // NOTE: measurement-derived values from MD3 spec §4.2, §6; permitted exception\n        xsmall: \"h-[16px] rounded-l-[16px] rounded-r-[2px]\",\n        small: \"h-[16px] rounded-l-[16px] rounded-r-[2px]\",\n        medium: \"h-[40px] rounded-l-[12px] rounded-r-[2px]\",\n        large: \"h-[56px] rounded-l-[16px] rounded-r-[2px]\",\n        xlarge: \"h-[96px] rounded-l-[28px] rounded-r-[2px]\",\n      },\n      orientation: {\n        // Horizontal: center vertically within track region\n        horizontal: \"top-1/2 -translate-y-1/2\",\n        // Vertical: center horizontally; length controlled by inline top/height styles\n        vertical: \"left-1/2 -translate-x-1/2\",\n      },\n    },\n    compoundVariants: [\n      // Vertical: width = track thickness; bottom = outer corner, top = 2dp inner (near handle)\n      // NOTE: measurement-derived values from MD3 spec §4.2, §6; permitted exception\n      {\n        orientation: \"vertical\",\n        size: \"xsmall\",\n        class: \"w-[16px] rounded-tl-[2px] rounded-tr-[2px] rounded-bl-[16px] rounded-br-[16px]\",\n      },\n      {\n        orientation: \"vertical\",\n        size: \"small\",\n        class: \"w-[16px] rounded-tl-[2px] rounded-tr-[2px] rounded-bl-[16px] rounded-br-[16px]\",\n      },\n      {\n        orientation: \"vertical\",\n        size: \"medium\",\n        class: \"w-[40px] rounded-tl-[2px] rounded-tr-[2px] rounded-bl-[12px] rounded-br-[12px]\",\n      },\n      {\n        orientation: \"vertical\",\n        size: \"large\",\n        class: \"w-[56px] rounded-tl-[2px] rounded-tr-[2px] rounded-bl-[16px] rounded-br-[16px]\",\n      },\n      {\n        orientation: \"vertical\",\n        size: \"xlarge\",\n        class: \"w-[96px] rounded-tl-[2px] rounded-tr-[2px] rounded-bl-[28px] rounded-br-[28px]\",\n      },\n    ],\n    defaultVariants: {\n      size: \"xsmall\",\n      orientation: \"horizontal\",\n    },\n  }\n);\n\n// ─── Inactive Track ───────────────────────────────────────────────────────────\n\n/**\n * The unfilled (inactive) portion of the slider track.\n *\n * **Color**: `bg-secondary-container`\n * **Disabled**: driven by `group-data-[disabled]/slider:*` — no CVA disabled variant.\n *\n * MD3 §6, §10.2: inner corner (near handle) = 2dp, outer corner = size corner token.\n * NOTE: measurement-derived corner values from MD3 spec §6; permitted exception.\n */\nexport const sliderInactiveTrackVariants = cva(\n  [\n    // Color\n    \"bg-secondary-container\",\n    // Disabled — driven by root group/slider data-disabled attr\n    \"group-data-[disabled]/slider:bg-on-surface/10\",\n    // Layout — absolute fill within the track region\n    \"absolute\",\n    \"overflow-hidden\",\n  ],\n  {\n    variants: {\n      size: {\n        // Horizontal: left (near handle) = 2dp inner, right (end) = outer corner\n        // NOTE: measurement-derived values from MD3 spec §4.2, §6; permitted exception\n        xsmall: \"h-[16px] rounded-l-[2px] rounded-r-[16px]\",\n        small: \"h-[16px] rounded-l-[2px] rounded-r-[16px]\",\n        medium: \"h-[40px] rounded-l-[2px] rounded-r-[12px]\",\n        large: \"h-[56px] rounded-l-[2px] rounded-r-[16px]\",\n        xlarge: \"h-[96px] rounded-l-[2px] rounded-r-[28px]\",\n      },\n      orientation: {\n        // Horizontal: center vertically within track region\n        horizontal: \"top-1/2 -translate-y-1/2\",\n        // Vertical: center horizontally; length controlled by inline top/height styles\n        vertical: \"left-1/2 -translate-x-1/2\",\n      },\n    },\n    compoundVariants: [\n      // Vertical: width = track thickness; top = outer corner, bottom = 2dp inner (near handle)\n      // NOTE: measurement-derived values from MD3 spec §4.2, §6; permitted exception\n      {\n        orientation: \"vertical\",\n        size: \"xsmall\",\n        class: \"w-[16px] rounded-tl-[16px] rounded-tr-[16px] rounded-bl-[2px] rounded-br-[2px]\",\n      },\n      {\n        orientation: \"vertical\",\n        size: \"small\",\n        class: \"w-[16px] rounded-tl-[16px] rounded-tr-[16px] rounded-bl-[2px] rounded-br-[2px]\",\n      },\n      {\n        orientation: \"vertical\",\n        size: \"medium\",\n        class: \"w-[40px] rounded-tl-[12px] rounded-tr-[12px] rounded-bl-[2px] rounded-br-[2px]\",\n      },\n      {\n        orientation: \"vertical\",\n        size: \"large\",\n        class: \"w-[56px] rounded-tl-[16px] rounded-tr-[16px] rounded-bl-[2px] rounded-br-[2px]\",\n      },\n      {\n        orientation: \"vertical\",\n        size: \"xlarge\",\n        class: \"w-[96px] rounded-tl-[28px] rounded-tr-[28px] rounded-bl-[2px] rounded-br-[2px]\",\n      },\n    ],\n    defaultVariants: {\n      size: \"xsmall\",\n      orientation: \"horizontal\",\n    },\n  }\n);\n\n// ─── Handle ───────────────────────────────────────────────────────────────────\n\n/**\n * Visual handle (thumb indicator) element inside the React Aria thumb container.\n *\n * **Architecture**: This element lives inside the `group/slider-thumb` scope (the\n * RA-positioned thumb div). All interaction states are driven by\n * `group-data-[x]/slider-thumb:*` selectors — no CVA interaction-state variants.\n *\n * **Pressed width**: `group-data-[pressed]/slider-thumb:w-[2px]` (4dp → 2dp, MD3 spec)\n * **Motion**: `transition-[width]` with spring-standard-fast-spatial tokens.\n *   Applied conditionally in `Slider.tsx` (suppressed for `useReducedMotion()`).\n */\nexport const sliderHandleVariants = cva(\n  [\n    // Color\n    \"bg-primary\",\n    // Disabled — driven by thumb group/slider-thumb data-disabled attr\n    \"group-data-[disabled]/slider-thumb:bg-on-surface\",\n    \"group-data-[disabled]/slider-thumb:opacity-38\",\n    // Pressed width (MD3: 4dp → 2dp on press, spatial spring)\n    \"group-data-[pressed]/slider-thumb:w-[2px]\",\n    // Shape\n    \"rounded-[2px]\",\n    // Layout\n    \"flex-shrink-0\",\n    \"pointer-events-none\",\n  ],\n  {\n    variants: {\n      size: {\n        xsmall: \"w-[4px] h-[44px]\",\n        small: \"w-[4px] h-[44px]\",\n        medium: \"w-[4px] h-[52px]\",\n        large: \"w-[4px] h-[68px]\",\n        xlarge: \"w-[4px] h-[108px]\",\n      },\n      orientation: {\n        horizontal: \"\",\n        // Vertical: handle is a thin horizontal bar. h-[4px] overrides the base\n        // h-[44px..108px]. Width is explicitly set per size below so the RA thumb\n        // (which is shrink-to-fit) assumes the correct measured width — this also\n        // fixes the hit-area (w-full) and state-layer (inset-0) widths.\n        vertical: \"h-[4px]\",\n      },\n    },\n    compoundVariants: [\n      // Vertical: override to height-based narrowing on press\n      {\n        orientation: \"vertical\",\n        class: \"group-data-[pressed]/slider-thumb:h-[2px]\",\n      },\n      // Vertical per-size widths (transposed handle length = track region width per MD3 §10.9)\n      // NOTE: measurement-derived values from MD3 spec §4.2; permitted exception\n      { orientation: \"vertical\", size: \"xsmall\", class: \"w-[44px]\" },\n      { orientation: \"vertical\", size: \"small\", class: \"w-[44px]\" },\n      { orientation: \"vertical\", size: \"medium\", class: \"w-[52px]\" },\n      { orientation: \"vertical\", size: \"large\", class: \"w-[68px]\" },\n      { orientation: \"vertical\", size: \"xlarge\", class: \"w-[108px]\" },\n    ],\n    defaultVariants: {\n      size: \"xsmall\",\n      orientation: \"horizontal\",\n    },\n  }\n);\n\n// ─── State Layer ──────────────────────────────────────────────────────────────\n\n/**\n * State layer overlay on the handle (hover ripple).\n *\n * **Architecture**: Lives inside `group/slider-thumb`; opacity driven entirely\n * by `group-data-[x]/slider-thumb:opacity-*` selectors — no CVA state variant.\n *\n * State-layer opacities per MD3 spec:\n * - hover:   8%   (`opacity-8`)\n * - focused: 10%  (`opacity-10`)\n * - pressed: 10%  (`opacity-10`)\n * - dragged: 16%  (`opacity-16`) — note: drag = pressed in RA isDragging → data-pressed\n *\n * **Motion**: `transition-opacity` with spring-standard-fast-effects tokens.\n *   Always present; `@media prefers-reduced-motion` suppresses the transition at\n *   the CSS level.\n */\nexport const sliderHandleStateLayerVariants = cva([\n  // Color\n  \"bg-primary\",\n  // Positioning — covers the handle\n  \"absolute\",\n  \"inset-0\",\n  \"rounded-[2px]\",\n  // Interaction: hidden by default\n  \"opacity-0\",\n  \"pointer-events-none\",\n  // State opacities — driven by group/slider-thumb data attrs\n  \"group-data-[hovered]/slider-thumb:opacity-8\",\n  \"group-data-[focus-visible]/slider-thumb:opacity-10\",\n  \"group-data-[pressed]/slider-thumb:opacity-10\",\n  // Disabled: hide state layer (no interaction feedback)\n  \"group-data-[disabled]/slider-thumb:hidden\",\n  // Motion: effects spring (opacity transition only)\n  \"transition-opacity\",\n  \"duration-spring-standard-fast-effects\",\n  \"ease-spring-standard-fast-effects\",\n]);\n\n// ─── Value Indicator ──────────────────────────────────────────────────────────\n\n/**\n * Floating pill label above the handle showing the current value.\n *\n * **Architecture**: Always rendered in DOM when `showValueIndicator=true`.\n * Visibility is driven by `group-data-[pressed]/slider-thumb:*` CSS selectors;\n * hidden by default via `opacity-0 scale-0`, revealed on press.\n *\n * **Motion**: `transition-[transform,opacity]` with spring-standard-fast-spatial\n *   tokens (dominant animation is scale/transform — spatial personality).\n *   Applied conditionally in `SliderValueIndicator.tsx` (suppressed for\n *   `useReducedMotion()`).\n */\nexport const sliderValueIndicatorVariants = cva([\n  // Positioning: float above handle center\n  \"absolute\",\n  \"left-1/2\",\n  \"-translate-x-1/2\",\n  \"bottom-[calc(100%+4px)]\",\n  // Shape & color\n  \"bg-inverse-surface\",\n  \"rounded-full\",\n  \"px-[12px]\",\n  \"py-[6px]\",\n  \"min-w-[48px]\",\n  \"text-center\",\n  // Hidden by default; revealed when thumb group has data-pressed\n  \"opacity-0\",\n  \"scale-0\",\n  \"group-data-[pressed]/slider-thumb:opacity-100\",\n  \"group-data-[pressed]/slider-thumb:scale-100\",\n  // Prevent interaction (value display only)\n  \"pointer-events-none\",\n  // Z-index above track overlays\n  \"z-10\",\n  // In Tailwind v4, scale-* maps to the CSS `scale` property (not `transform`),\n  // so we must list `scale` here — not `transform` — to animate the reveal.\n  \"will-change-[scale,opacity]\",\n]);\n\n// ─── Stop Dots ────────────────────────────────────────────────────────────────\n\n/**\n * Individual stop indicator dot for discrete sliders.\n */\nexport const sliderStopDotVariants = cva([\"rounded-full\", \"flex-shrink-0\", \"pointer-events-none\"], {\n  variants: {\n    region: {\n      active: \"bg-on-primary\",\n      inactive: \"bg-on-secondary-container\",\n    },\n    size: {\n      xsmall: \"w-[4px] h-[4px]\",\n      small: \"w-[4px] h-[4px]\",\n      medium: \"w-[6px] h-[6px]\",\n      large: \"w-[6px] h-[6px]\",\n      xlarge: \"w-[8px] h-[8px]\",\n    },\n  },\n  defaultVariants: {\n    region: \"inactive\",\n    size: \"xsmall\",\n  },\n});\n\n// ─── Stops Container ──────────────────────────────────────────────────────────\n\n/**\n * Absolute overlay container for discrete stop indicator dots.\n */\nexport const sliderStopsContainerVariants = cva([\n  \"absolute\",\n  \"inset-0\",\n  \"flex\",\n  \"items-center\",\n  \"justify-between\",\n  \"px-[4px]\",\n  \"pointer-events-none\",\n  \"z-10\",\n]);\n\n// ─── Track Stop (end cap) ─────────────────────────────────────────────────────\n\n/**\n * Absolute-positioned stop indicator at the start or end of a track segment.\n * Used for the terminal positions in range and standard sliders.\n */\nexport const sliderTrackStopVariants = cva(\n  [\n    \"absolute\",\n    \"rounded-full\",\n    \"bg-on-secondary-container\",\n    \"pointer-events-none\",\n    \"w-[4px]\",\n    \"h-[4px]\",\n  ],\n  {\n    variants: {\n      position: {\n        start: \"left-[4px]\",\n        end: \"right-[4px]\",\n      },\n    },\n    defaultVariants: {\n      position: \"end\",\n    },\n  }\n);\n\n// ─── Value Indicator Text ─────────────────────────────────────────────────────\n\n/**\n * Text span inside the value indicator pill.\n */\nexport const sliderValueIndicatorTextVariants = cva([\n  \"text-inverse-on-surface\",\n  \"text-label-large\",\n  \"select-none\",\n  \"whitespace-nowrap\",\n]);\n\n// ─── Inset Icon ───────────────────────────────────────────────────────────────\n\n/**\n * Icon rendered inside the active track (medium/large/xlarge sizes only).\n */\nexport const sliderInsetIconVariants = cva(\n  [\"absolute\", \"text-on-primary\", \"pointer-events-none\", \"flex\", \"items-center\", \"justify-center\"],\n  {\n    variants: {\n      size: {\n        medium: \"w-[24px] h-[24px]\",\n        large: \"w-[24px] h-[24px]\",\n        xlarge: \"w-[32px] h-[32px]\",\n      },\n      orientation: {\n        horizontal: \"left-[8px] top-1/2 -translate-y-1/2\",\n        vertical: \"bottom-[8px] left-1/2 -translate-x-1/2\",\n      },\n    },\n    defaultVariants: {\n      size: \"medium\",\n      orientation: \"horizontal\",\n    },\n  }\n);\n","\"use client\";\n\nimport type React from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { sliderStopsContainerVariants, sliderStopDotVariants } from \"./Slider.variants\";\nimport type { SliderSize, SliderVariant } from \"./Slider.types\";\n\n// ─── Helpers ─────────────────────────────────────────────────────────────────\n\n/**\n * Determines whether a stop value falls on the active track portion.\n *\n * MD3 spec §5.2: active track color vs inactive track color per variant.\n * - standard: active fill covers min → current value\n * - centered: active fill covers center (0) ↔ current value\n * - range: active fill covers values[0] → values[1]\n */\nfunction getIsOnActiveTrack(\n  stopValue: number,\n  values: number[],\n  variant: SliderVariant,\n  minValue: number,\n  maxValue: number\n): boolean {\n  if (variant === \"range\") {\n    const lo = values[0] ?? minValue;\n    const hi = values[1] ?? maxValue;\n    return stopValue >= lo && stopValue <= hi;\n  }\n  if (variant === \"centered\") {\n    const current = values[0] ?? 0;\n    if (current >= 0) {\n      return stopValue >= 0 && stopValue <= current;\n    }\n    return stopValue >= current && stopValue <= 0;\n  }\n  // standard\n  return stopValue <= (values[0] ?? minValue);\n}\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\ninterface SliderStopsProps {\n  /**\n   * Minimum value of the slider range — defines the leftmost stop.\n   */\n  minValue: number;\n  /**\n   * Maximum value of the slider range — defines the rightmost stop.\n   */\n  maxValue: number;\n  /**\n   * Step increment. Stop count = floor((max - min) / step) + 1.\n   */\n  step: number;\n  /**\n   * Current value(s) — used to determine which dots are on the active track.\n   */\n  values: number[];\n  /**\n   * Structural variant — determines active track region.\n   */\n  variant: SliderVariant;\n  /**\n   * Size of the slider (controls dot dimensions).\n   * @default 'xsmall'\n   */\n  size?: SliderSize;\n  /**\n   * Additional CSS classes for the stops container.\n   */\n  className?: string;\n}\n\n// ─── SliderStops ──────────────────────────────────────────────────────────────\n\n/**\n * Renders discrete stop indicator dots as an absolute overlay on the track.\n *\n * MD3 spec §5.2, §10.5: 4dp circular dots distributed with `justify-between`,\n * colored `on-primary` on the active track and `on-secondary-container` on\n * the inactive track. Padding of 4dp from track edges.\n *\n * Disabled dot styling is driven by `group-data-[disabled]/slider:` CSS\n * selectors on the root slider container — no explicit `isDisabled` prop needed.\n *\n * This is a purely decorative sub-component. All accessibility information\n * is carried by the underlying `<input type=\"range\">` via React Aria.\n *\n * @example\n * ```tsx\n * <SliderStops\n *   minValue={0}\n *   maxValue={100}\n *   step={10}\n *   values={[50]}\n *   variant=\"standard\"\n *   size=\"xsmall\"\n * />\n * ```\n */\nexport function SliderStops({\n  minValue,\n  maxValue,\n  step,\n  values,\n  variant,\n  size = \"xsmall\",\n  className,\n}: SliderStopsProps): React.JSX.Element {\n  const stopCount = Math.floor((maxValue - minValue) / step) + 1;\n\n  return (\n    <div\n      data-slot=\"stops-container\"\n      className={cn(sliderStopsContainerVariants(), className)}\n      aria-hidden=\"true\"\n    >\n      {Array.from({ length: stopCount }, (_, i) => {\n        const stopValue = minValue + i * step;\n        const isOnActive = getIsOnActiveTrack(stopValue, values, variant, minValue, maxValue);\n        return (\n          <span\n            key={i}\n            data-slot=\"stop-dot\"\n            className={cn(\n              sliderStopDotVariants({\n                region: isOnActive ? \"active\" : \"inactive\",\n                size,\n              })\n            )}\n          />\n        );\n      })}\n    </div>\n  );\n}\n","\"use client\";\n\nimport type React from \"react\";\nimport { useReducedMotion } from \"../../hooks/useReducedMotion\";\nimport { cn } from \"../../utils/cn\";\nimport { sliderValueIndicatorVariants, sliderValueIndicatorTextVariants } from \"./Slider.variants\";\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\ninterface SliderValueIndicatorProps {\n  /**\n   * Numeric value to display in the pill label.\n   */\n  value: number;\n  /**\n   * Optional formatter for the displayed value string.\n   * @default (v) => `${Math.round(v)}`\n   * @example (v) => `$${v}`\n   */\n  formatValue?: (value: number) => string;\n  /**\n   * Additional CSS classes for the indicator container.\n   */\n  className?: string;\n}\n\n// ─── SliderValueIndicator ─────────────────────────────────────────────────────\n\n/**\n * Floating pill label that appears above the handle when the thumb is pressed.\n *\n * MD3 spec §5.3, §9.3, §10.4:\n * - Pill shape (`rounded-full`, 1000dp radius)\n * - Background: `inverse-surface`\n * - Text: `inverse-on-surface`, Label Large typography\n * - Min-width: 48dp, padding 16dp horizontal / 12dp vertical\n * - Positioned absolutely above the thumb; centered horizontally\n * - Visible only during Pressed state; CSS-driven via\n *   `group-data-[pressed]/slider-thumb:opacity-100 scale-100`\n *\n * Rendered as a child of the RA thumb element (`group/slider-thumb`).\n * The element is always present in the DOM when `showValueIndicator=true`.\n * Visibility is driven by `group-data-[pressed]/slider-thumb` CSS selectors\n * (no JS state required). `aria-hidden=\"true\"` permanently since the accessible\n * value is in the `<output>` element managed by React Aria.\n *\n * **Motion**: MD3 spring standard fast spatial tokens for transform/opacity.\n *   Suppressed via `useReducedMotion()` for prefers-reduced-motion.\n *\n * @example\n * ```tsx\n * // Inside renderThumbContent — always rendered when showValueIndicator=true\n * <SliderValueIndicator value={50} formatValue={(v) => `$${v}`} />\n * ```\n */\nexport function SliderValueIndicator({\n  value,\n  formatValue,\n  className,\n}: SliderValueIndicatorProps): React.JSX.Element {\n  const displayValue = formatValue ? formatValue(value) : `${Math.round(value)}`;\n  const reducedMotion = useReducedMotion();\n\n  // MD3 spring system: transform/opacity transition for entry/exit.\n  // In Tailwind v4, scale-* uses the CSS `scale` property (not `transform`),\n  // so the transition list must include `scale` instead of `transform`.\n  // Suppressed entirely when prefers-reduced-motion is active.\n  const transitionClasses = reducedMotion\n    ? \"\"\n    : \"transition-[scale,opacity] duration-spring-standard-fast-spatial ease-spring-standard-fast-spatial\";\n\n  return (\n    <div\n      data-slot=\"value-indicator\"\n      className={cn(sliderValueIndicatorVariants(), transitionClasses, className)}\n      role=\"tooltip\"\n      aria-hidden=\"true\"\n    >\n      <span className={sliderValueIndicatorTextVariants()}>{displayValue}</span>\n    </div>\n  );\n}\n","\"use client\";\n\nimport type React from \"react\";\nimport { forwardRef, useCallback, useState } from \"react\";\nimport { useReducedMotion } from \"../../hooks/useReducedMotion\";\nimport { cn } from \"../../utils/cn\";\nimport { SliderHeadless } from \"./SliderHeadless\";\nimport { SliderStops } from \"./SliderStops\";\nimport { SliderValueIndicator } from \"./SliderValueIndicator\";\nimport {\n  sliderContainerVariants,\n  sliderTrackRegionVariants,\n  sliderActiveTrackVariants,\n  sliderInactiveTrackVariants,\n  sliderHandleVariants,\n  sliderHandleStateLayerVariants,\n  sliderTrackLayoutVariants,\n  sliderTrackStopVariants,\n  sliderInsetIconVariants,\n} from \"./Slider.variants\";\nimport type { SliderProps, SliderThumbRenderState } from \"./Slider.types\";\n\n// ─── Helpers ──────────────────────────────────────────────────────────────────\n\nfunction clampPercent(value: number, min: number, max: number): number {\n  return Math.max(0, Math.min(100, ((value - min) / (max - min)) * 100));\n}\n\nfunction resolveDefaultValue(\n  variant: \"standard\" | \"centered\" | \"range\",\n  minValue: number\n): number[] {\n  if (variant === \"range\") return [25, 75];\n  if (variant === \"centered\") return [0];\n  return [minValue];\n}\n\n/**\n * MD3 thumb-track gap: 6dp total, split symmetrically as 3px per side.\n * Applied as an offset from the thumb's percentage position.\n */\nconst GAP_PX = 3;\n\n/**\n * Build inline CSS position styles for an absolutely-positioned track segment.\n *\n * All segments share the same `position: absolute` coordinate space as the\n * React Aria thumbs (`left: pct%` / `bottom: pct%`), so fills always align\n * with handle positions regardless of value, variant, or orientation.\n *\n * Horizontal segments span along the X axis; vertical along Y (bottom = 0).\n */\nfunction segmentStyle(\n  orientation: \"horizontal\" | \"vertical\",\n  opts: {\n    /** Start edge as a percentage of the track length. `null` = track start (0). */\n    start: number | null;\n    /** End edge as a percentage of the track length. `null` = track end (100). */\n    end: number | null;\n    /** Px offset added to the start edge (gap inset from a thumb). */\n    startGap?: number;\n    /** Px offset subtracted from the end edge (gap inset from a thumb). */\n    endGap?: number;\n  }\n): React.CSSProperties {\n  const { start, end, startGap = 0, endGap = 0 } = opts;\n\n  const startVal = start !== null ? `calc(${start}% + ${startGap}px)` : `${startGap}px`;\n  const endVal = end !== null ? `calc(${100 - end}% + ${endGap}px)` : `${endGap}px`;\n\n  if (orientation === \"horizontal\") {\n    return { left: startVal, right: endVal };\n  }\n  // Vertical: start = bottom edge, end = top edge (fills upward from 0)\n  return { bottom: startVal, top: endVal };\n}\n\n// ─── Slider ───────────────────────────────────────────────────────────────────\n\n/**\n * Material Design 3 Slider Component (Layer 3: Styled)\n *\n * Wraps `SliderHeadless` with CVA styling for all five MD3 Expressive sizes.\n * Renders the visual track layout (active/inactive tracks) as children inside\n * the headless track element. The visual handle, state layer, and value indicator\n * are rendered as children of the React Aria thumb element via `renderThumbContent`,\n * which positions them exactly at the value percentage.\n *\n * **Architecture (Variants-vs-States)**\n * - Interaction states (hover, pressed/dragging, disabled, focus) are driven by\n *   React Aria hooks → `getInteractionDataAttributes` → `data-*` on the RA thumb\n *   (`group/slider-thumb`) → `group-data-[x]/slider-thumb:*` CSS selectors.\n * - No manual pointer state machine — React Aria's `isDragging`, `isHovered`,\n *   and `isFocusVisible` are the single source of truth.\n * - Disabled track/stop colors use `group-data-[disabled]/slider:*` selectors\n *   from the root `group/slider` scope.\n *\n * **Geometry (documented inline-style exception)**\n * Track widths are driven by runtime values and use inline `flexBasis` styles —\n * a documented exception for geometry that cannot be expressed as design tokens.\n *\n * **Motion**\n * - Track fill: spring-standard-fast-spatial (suppressed during drag + reduced motion)\n * - Handle width: spring-standard-fast-spatial (suppressed for reduced motion)\n * - State layer opacity: spring-standard-fast-effects (always present; CSS media\n *   query handles `prefers-reduced-motion` for CSS-driven changes)\n * - Value indicator: spring-standard-fast-spatial (suppressed for reduced motion)\n *\n * @example\n * ```tsx\n * // Standard slider\n * <Slider label=\"Volume\" defaultValue={[50]} />\n *\n * // Large range slider\n * <Slider variant=\"range\" size=\"large\" label=\"Price\" defaultValue={[20, 80]} />\n *\n * // Centered slider with negative range\n * <Slider variant=\"centered\" label=\"Balance\" minValue={-100} maxValue={100} />\n * ```\n */\nexport const Slider = forwardRef<HTMLDivElement, SliderProps>(\n  (\n    {\n      size = \"xsmall\",\n      variant = \"standard\",\n      orientation = \"horizontal\",\n      minValue = 0,\n      maxValue = 100,\n      step,\n      value,\n      defaultValue,\n      onChange,\n      onChangeEnd,\n      isDisabled = false,\n      showStops = false,\n      showValueIndicator = false,\n      formatValue,\n      icon,\n      className,\n      ...headlessProps\n    },\n    ref\n  ) => {\n    const reducedMotion = useReducedMotion();\n\n    const resolvedDefault = defaultValue ?? resolveDefaultValue(variant, minValue);\n\n    const [uncontrolledValue, setUncontrolledValue] = useState<number[]>(resolvedDefault);\n\n    const currentValues = value ?? uncontrolledValue;\n\n    const handleChange = useCallback(\n      (newValue: number[]) => {\n        if (value === undefined) {\n          setUncontrolledValue(newValue);\n        }\n        onChange?.(newValue);\n      },\n      [value, onChange]\n    );\n\n    // Track whether any thumb is actively dragging so we can suppress the\n    // flex-basis spring transition during pointer drag (immediate feedback).\n    // Driven by onThumbDraggingChange callback from SliderHeadless.\n    const [anyThumbDragging, setAnyThumbDragging] = useState(false);\n\n    const handleThumbDraggingChange = useCallback((_index: number, isDragging: boolean) => {\n      setAnyThumbDragging(isDragging);\n    }, []);\n\n    // ── Motion classes ─────────────────────────────────────────────────────────\n\n    // MD3 spring system: Track segment position/size — spring-standard-fast-spatial.\n    // Suppressed during drag (follows pointer immediately) and reduced motion.\n    // Horizontal segments animate left+width; vertical animate top+bottom+height.\n    const springTokens = \"duration-spring-standard-fast-spatial ease-spring-standard-fast-spatial\";\n    const trackTransition =\n      reducedMotion || anyThumbDragging\n        ? \"\"\n        : orientation === \"vertical\"\n          ? `transition-[top,bottom,height] ${springTokens}`\n          : `transition-[left,width,right] ${springTokens}`;\n\n    // MD3 spring system: Handle width change (4dp → 2dp on press) — spatial spring.\n    // Suppressed for reduced motion; applied by the renderThumbContent closure.\n    const handleMotion = reducedMotion\n      ? \"\"\n      : \"transition-[width] duration-spring-standard-fast-spatial ease-spring-standard-fast-spatial\";\n\n    const isRange = variant === \"range\";\n    const isCentered = variant === \"centered\";\n\n    // Only Standard variant supports the inset icon, and only for Medium/Large/XLarge sizes\n    // (MD3 spec §5.1: icon not available for XSmall and Small)\n    const showIcon =\n      icon !== undefined &&\n      variant === \"standard\" &&\n      (size === \"medium\" || size === \"large\" || size === \"xlarge\");\n\n    // ── Thumb content render prop ──────────────────────────────────────────────\n    // Renders the visual handle, state layer, and value indicator INSIDE the\n    // React Aria thumb element (absolutely positioned at the value percentage).\n    // All interaction styling is driven by group-data-[x]/slider-thumb selectors.\n    const renderThumbContent = useCallback(\n      ({ value: thumbValue }: SliderThumbRenderState): React.ReactNode => (\n        <>\n          {/* Transparent hit-area enlarged beyond the 4dp visual handle so\n              dragging is comfortable. aria-hidden so it is invisible to AT. */}\n          <div\n            aria-hidden=\"true\"\n            className={cn(\n              \"absolute\",\n              \"left-1/2\",\n              \"top-1/2\",\n              \"-translate-x-1/2\",\n              \"-translate-y-1/2\",\n              orientation === \"vertical\" ? \"h-[20px] w-full\" : \"h-full w-[20px]\"\n            )}\n          />\n          {/* Visual handle — narrows from 4dp to 2dp on press via group-data */}\n          <div\n            data-slot=\"handle\"\n            className={cn(sliderHandleVariants({ size, orientation }), handleMotion)}\n          />\n          {/* State layer — opacity driven by group-data hover/focus/pressed */}\n          <div data-slot=\"state-layer\" className={cn(sliderHandleStateLayerVariants())} />\n          {/* Value indicator — always in DOM; CSS shows/hides via group-data-[pressed] */}\n          {showValueIndicator && (\n            <SliderValueIndicator\n              value={thumbValue}\n              {...(formatValue !== undefined ? { formatValue } : {})}\n            />\n          )}\n        </>\n      ),\n      [size, orientation, showValueIndicator, formatValue, handleMotion]\n    );\n\n    // ── Standard track render ──────────────────────────────────────────────────\n    const renderStandardTrack = (): React.JSX.Element => {\n      const pct = clampPercent(currentValues[0] ?? minValue, minValue, maxValue);\n\n      return (\n        <>\n          {/* Active track — spans from track start to 3px before the handle */}\n          <div\n            data-slot=\"active-track\"\n            className={cn(sliderActiveTrackVariants({ size, orientation }), trackTransition)}\n            style={segmentStyle(orientation, { start: null, end: pct, endGap: GAP_PX })}\n          >\n            {showIcon && (\n              <span\n                data-slot=\"inset-icon\"\n                className={cn(sliderInsetIconVariants({ size, orientation }))}\n              >\n                {icon}\n              </span>\n            )}\n          </div>\n          {/* Inactive track — spans from 3px after the handle to track end */}\n          <div\n            data-slot=\"inactive-track\"\n            className={cn(sliderInactiveTrackVariants({ size, orientation }), trackTransition)}\n            style={segmentStyle(orientation, { start: pct, startGap: GAP_PX, end: null })}\n          >\n            {showStops && (\n              <span\n                data-slot=\"track-stop-end\"\n                className={cn(sliderTrackStopVariants({ position: \"end\" }))}\n              />\n            )}\n          </div>\n        </>\n      );\n    };\n\n    // ── Range track render ─────────────────────────────────────────────────────\n    const renderRangeTrack = (): React.JSX.Element => {\n      const leftPct = clampPercent(currentValues[0] ?? minValue, minValue, maxValue);\n      const rightPct = clampPercent(currentValues[1] ?? maxValue, minValue, maxValue);\n\n      return (\n        <>\n          {/* Left inactive track — track start to 3px before left handle */}\n          <div\n            data-slot=\"inactive-track-left\"\n            className={cn(sliderInactiveTrackVariants({ size, orientation }), trackTransition)}\n            style={segmentStyle(orientation, { start: null, end: leftPct, endGap: GAP_PX })}\n          >\n            {showStops && (\n              <span\n                data-slot=\"track-stop-start\"\n                className={cn(sliderTrackStopVariants({ position: \"start\" }))}\n              />\n            )}\n          </div>\n          {/* Active track — 3px after left handle to 3px before right handle */}\n          <div\n            data-slot=\"active-track\"\n            className={cn(\n              sliderActiveTrackVariants({ size, orientation }),\n              \"rounded-[2px]\", // Both ends near handles: 2dp inner (MD3 §10.2)\n              trackTransition\n            )}\n            style={segmentStyle(orientation, {\n              start: leftPct,\n              startGap: GAP_PX,\n              end: rightPct,\n              endGap: GAP_PX,\n            })}\n          />\n          {/* Right inactive track — 3px after right handle to track end */}\n          <div\n            data-slot=\"inactive-track-right\"\n            className={cn(sliderInactiveTrackVariants({ size, orientation }), trackTransition)}\n            style={segmentStyle(orientation, { start: rightPct, startGap: GAP_PX, end: null })}\n          >\n            {showStops && (\n              <span\n                data-slot=\"track-stop-end\"\n                className={cn(sliderTrackStopVariants({ position: \"end\" }))}\n              />\n            )}\n          </div>\n        </>\n      );\n    };\n\n    // ── Centered track render ──────────────────────────────────────────────────\n    const renderCenteredTrack = (): React.JSX.Element => {\n      const thumbPct = clampPercent(currentValues[0] ?? minValue, minValue, maxValue);\n      const zeroPct =\n        minValue >= 0 ? 0 : maxValue <= 0 ? 100 : ((0 - minValue) / (maxValue - minValue)) * 100;\n\n      if (thumbPct >= zeroPct) {\n        // Positive direction: inactive-left | active | inactive-right\n        return (\n          <>\n            {/* Left inactive — track start to zero point (no gap at center) */}\n            <div\n              data-slot=\"inactive-track-left\"\n              className={cn(sliderInactiveTrackVariants({ size, orientation }), trackTransition)}\n              style={segmentStyle(orientation, { start: null, end: zeroPct })}\n            />\n            {/* Active — zero point to 3px before handle */}\n            <div\n              data-slot=\"active-track\"\n              className={cn(sliderActiveTrackVariants({ size, orientation }), trackTransition)}\n              style={segmentStyle(orientation, {\n                start: zeroPct,\n                end: thumbPct,\n                endGap: GAP_PX,\n              })}\n            />\n            {/* Right inactive — 3px after handle to track end */}\n            <div\n              data-slot=\"inactive-track-right\"\n              className={cn(sliderInactiveTrackVariants({ size, orientation }), trackTransition)}\n              style={segmentStyle(orientation, { start: thumbPct, startGap: GAP_PX, end: null })}\n            />\n          </>\n        );\n      } else {\n        // Negative direction: inactive-left | active | inactive-right\n        return (\n          <>\n            {/* Left inactive — track start to 3px before handle */}\n            <div\n              data-slot=\"inactive-track-left\"\n              className={cn(sliderInactiveTrackVariants({ size, orientation }), trackTransition)}\n              style={segmentStyle(orientation, { start: null, end: thumbPct, endGap: GAP_PX })}\n            />\n            {/* Active — 3px after handle to zero point (no gap at center) */}\n            <div\n              data-slot=\"active-track\"\n              className={cn(sliderActiveTrackVariants({ size, orientation }), trackTransition)}\n              style={segmentStyle(orientation, {\n                start: thumbPct,\n                startGap: GAP_PX,\n                end: zeroPct,\n              })}\n            />\n            {/* Right inactive — zero point to track end */}\n            <div\n              data-slot=\"inactive-track-right\"\n              className={cn(sliderInactiveTrackVariants({ size, orientation }), trackTransition)}\n              style={segmentStyle(orientation, { start: zeroPct, end: null })}\n            />\n          </>\n        );\n      }\n    };\n\n    const canShowStops = showStops && step !== undefined && step > 0;\n\n    return (\n      <SliderHeadless\n        {...headlessProps}\n        ref={ref}\n        variant={variant}\n        orientation={orientation}\n        minValue={minValue}\n        maxValue={maxValue}\n        {...(step !== undefined ? { step } : {})}\n        isDisabled={isDisabled}\n        onChange={handleChange}\n        {...(formatValue !== undefined ? { formatValue } : {})}\n        {...(value !== undefined ? { value } : {})}\n        {...(defaultValue !== undefined ? { defaultValue } : {})}\n        {...(onChangeEnd !== undefined ? { onChangeEnd } : {})}\n        renderThumbContent={renderThumbContent}\n        onThumbDraggingChange={handleThumbDraggingChange}\n        className={cn(sliderContainerVariants({ size, orientation }), className)}\n        trackClassName={sliderTrackRegionVariants({ size, orientation })}\n      >\n        <div data-slot=\"track-layout\" className={cn(sliderTrackLayoutVariants())}>\n          {isRange\n            ? renderRangeTrack()\n            : isCentered\n              ? renderCenteredTrack()\n              : renderStandardTrack()}\n          {canShowStops && (\n            <SliderStops\n              minValue={minValue}\n              maxValue={maxValue}\n              step={step}\n              values={currentValues}\n              variant={variant}\n              size={size}\n            />\n          )}\n        </div>\n      </SliderHeadless>\n    );\n  }\n);\n\nSlider.displayName = \"Slider\";\n","\"use client\";\n\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport type React from \"react\";\nimport type { BottomSheetContextValue } from \"./BottomSheet.types\";\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\n/**\n * Options for the `useBottomSheetDrag` hook.\n */\nexport interface UseBottomSheetDragOptions {\n  /**\n   * Snap points as CSS percentage strings (e.g. `['25%', '50%', '100%']`).\n   * Index 0 is the lowest (least expanded), last index is the highest (most expanded).\n   */\n  snapPoints: string[];\n  /**\n   * Called when a drag gesture resolves to a new snap point index.\n   */\n  onSnapChange?: (index: number) => void;\n  /**\n   * Called when the sheet should close — dragged below the lowest snap point\n   * by more than 20% of the viewport height, or ArrowDown pressed at index 0.\n   */\n  onClose?: () => void;\n}\n\n/**\n * Return value of the `useBottomSheetDrag` hook.\n */\nexport interface UseBottomSheetDragReturn {\n  /** Index of the currently active snap point (0 = lowest). */\n  currentSnapIndex: number;\n  /** `true` while a pointer drag gesture is in progress. */\n  isDragging: boolean;\n  /**\n   * Inline translateY pixel offset during a drag gesture.\n   * Positive = dragged down (sheet shrinks), negative = dragged up (sheet grows).\n   * `null` when the sheet is snapped and not being dragged.\n   */\n  dragTranslateY: number | null;\n  /** Props to spread onto the drag handle element. */\n  handleProps: BottomSheetContextValue[\"handleProps\"];\n}\n\n// ─── Helpers ──────────────────────────────────────────────────────────────────\n\nfunction parseSnapPercent(snap: string): number {\n  return parseFloat(snap.replace(\"%\", \"\"));\n}\n\n// ─── Hook ─────────────────────────────────────────────────────────────────────\n\n/**\n * Encapsulates all drag-handle interaction and snap-point logic for the Bottom Sheet.\n *\n * This is a pure behavior hook (Layer 2) — no Tailwind classes.\n *\n * - Tracks pointer drag with `setPointerCapture` and a `window` `pointermove` listener\n * - Calculates nearest snap point on `pointerup`\n * - Calls `onClose()` when dragged more than 20% below the lowest snap point\n * - Provides keyboard cycling (Space/Enter) and directional navigation (ArrowUp/ArrowDown)\n * - Satisfies WCAG 2.1 SC 2.1.1: every drag action has a keyboard equivalent\n *\n * @example\n * ```tsx\n * const { currentSnapIndex, isDragging, dragTranslateY, handleProps } = useBottomSheetDrag({\n *   snapPoints: ['25%', '50%', '100%'],\n *   onClose: close,\n * })\n * ```\n */\nexport function useBottomSheetDrag({\n  snapPoints,\n  onSnapChange,\n  onClose,\n}: UseBottomSheetDragOptions): UseBottomSheetDragReturn {\n  const [currentSnapIndex, setCurrentSnapIndex] = useState(0);\n  const [isDragging, setIsDragging] = useState(false);\n  const [dragTranslateY, setDragTranslateY] = useState<number | null>(null);\n\n  // Refs for values consumed inside event callbacks — avoids stale closures\n  const startYRef = useRef<number>(0);\n  const currentSnapIndexRef = useRef<number>(0);\n  const dragTranslateYRef = useRef<number | null>(null);\n\n  // Sync currentSnapIndex ref whenever state changes\n  useEffect(() => {\n    currentSnapIndexRef.current = currentSnapIndex;\n  }, [currentSnapIndex]);\n\n  /** Update dragTranslateY in both ref and state atomically. */\n  const setDragTranslateYSync = useCallback((val: number | null) => {\n    dragTranslateYRef.current = val;\n    setDragTranslateY(val);\n  }, []);\n\n  // ── pointermove attached to window during drag ────────────────────────────\n  // Using window avoids missing events when the pointer moves faster than the\n  // handle element's bounds (standard practice for drag implementations).\n\n  useEffect(() => {\n    if (!isDragging) return;\n\n    const handlePointerMove = (e: PointerEvent): void => {\n      const deltaY = e.clientY - startYRef.current;\n      const vh = window.innerHeight;\n\n      // Cannot drag above the 100% snap point (top of viewport)\n      const maxUpDelta = -vh;\n      // Cannot drag more than 50% below the bottom edge (dismiss threshold)\n      const maxDownDelta = vh * 0.5;\n\n      const clamped = Math.max(maxUpDelta, Math.min(maxDownDelta, deltaY));\n      setDragTranslateYSync(clamped);\n    };\n\n    window.addEventListener(\"pointermove\", handlePointerMove);\n    return () => window.removeEventListener(\"pointermove\", handlePointerMove);\n  }, [isDragging, setDragTranslateYSync]);\n\n  // ── Pointer handlers ──────────────────────────────────────────────────────\n\n  const onPointerDown = useCallback((e: React.PointerEvent<HTMLElement>) => {\n    e.currentTarget.setPointerCapture(e.pointerId);\n    startYRef.current = e.clientY;\n    setIsDragging(true);\n  }, []);\n\n  const onPointerUp = useCallback(\n    (e: React.PointerEvent<HTMLElement>) => {\n      e.currentTarget.releasePointerCapture(e.pointerId);\n      setIsDragging(false);\n\n      const vh = window.innerHeight;\n      // Use ref value (updated by window pointermove); fall back to raw delta\n      const deltaY = dragTranslateYRef.current ?? e.clientY - startYRef.current;\n\n      const snapFractions = snapPoints.map((s) => parseSnapPercent(s) / 100);\n      const startFraction = snapFractions[currentSnapIndexRef.current] ?? 0.5;\n\n      // Positive deltaY = dragged down = sheet is now shorter (lower fraction)\n      const newHeightFraction = startFraction - deltaY / vh;\n\n      const lowestFraction = Math.min(...snapFractions);\n\n      // Dismiss if dragged more than 20% below the lowest snap point\n      if (newHeightFraction < lowestFraction - 0.2) {\n        setDragTranslateYSync(null);\n        onClose?.();\n        return;\n      }\n\n      // Find nearest snap point by minimum absolute distance\n      let nearestIndex = 0;\n      let minDist = Infinity;\n      for (let i = 0; i < snapFractions.length; i++) {\n        const dist = Math.abs((snapFractions[i] ?? 0) - newHeightFraction);\n        if (dist < minDist) {\n          minDist = dist;\n          nearestIndex = i;\n        }\n      }\n\n      currentSnapIndexRef.current = nearestIndex;\n      setCurrentSnapIndex(nearestIndex);\n      setDragTranslateYSync(null);\n      onSnapChange?.(nearestIndex);\n    },\n    [snapPoints, onClose, onSnapChange, setDragTranslateYSync]\n  );\n\n  // ── Keyboard handler ──────────────────────────────────────────────────────\n\n  const onKeyDown = useCallback(\n    (e: React.KeyboardEvent<HTMLElement>) => {\n      if (e.key === \" \" || e.key === \"Enter\") {\n        e.preventDefault();\n        // Cycle to next snap point; wraps from last back to first\n        const nextIndex = (currentSnapIndexRef.current + 1) % snapPoints.length;\n        currentSnapIndexRef.current = nextIndex;\n        setCurrentSnapIndex(nextIndex);\n        onSnapChange?.(nextIndex);\n        return;\n      }\n\n      if (e.key === \"ArrowUp\") {\n        e.preventDefault();\n        // Move to higher snap point (more expanded) if not already at max\n        if (currentSnapIndexRef.current < snapPoints.length - 1) {\n          const nextIndex = currentSnapIndexRef.current + 1;\n          currentSnapIndexRef.current = nextIndex;\n          setCurrentSnapIndex(nextIndex);\n          onSnapChange?.(nextIndex);\n        }\n        return;\n      }\n\n      if (e.key === \"ArrowDown\") {\n        e.preventDefault();\n        // Move to lower snap point (less expanded); close if already at minimum\n        if (currentSnapIndexRef.current > 0) {\n          const nextIndex = currentSnapIndexRef.current - 1;\n          currentSnapIndexRef.current = nextIndex;\n          setCurrentSnapIndex(nextIndex);\n          onSnapChange?.(nextIndex);\n        } else {\n          onClose?.();\n        }\n      }\n    },\n    [snapPoints, onClose, onSnapChange]\n  );\n\n  // ── Handle props ──────────────────────────────────────────────────────────\n\n  const handleProps = useMemo<BottomSheetContextValue[\"handleProps\"]>(\n    () => ({\n      onPointerDown,\n      onPointerUp,\n      onKeyDown,\n      tabIndex: 0,\n      role: \"button\" as const,\n      // MD3 spec: \"Label only the drag handle.\" Default communicates the action\n      // without referencing touch gesture terminology. Override via BottomSheetHandleProps.\n      \"aria-label\": \"Adjust sheet height\",\n      // Slider-pattern ARIA — communicates current snap position like a range slider.\n      // Screen readers announce: \"Adjust sheet height, 0 of 2\" (e.g. with 3 snap points).\n      \"aria-valuemin\": 0,\n      \"aria-valuenow\": currentSnapIndex,\n      \"aria-valuemax\": snapPoints.length - 1,\n      \"aria-orientation\": \"vertical\" as const,\n    }),\n    [onPointerDown, onPointerUp, onKeyDown, currentSnapIndex, snapPoints.length]\n  );\n\n  return {\n    currentSnapIndex,\n    isDragging,\n    dragTranslateY,\n    handleProps,\n  };\n}\n","\"use client\";\n\nimport {\n  createContext,\n  forwardRef,\n  useCallback,\n  useContext,\n  useEffect,\n  useRef,\n  useState,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport type React from \"react\";\nimport { FocusScope, useDialog, useOverlay, usePreventScroll } from \"react-aria\";\nimport { mergeProps } from \"@react-aria/utils\";\nimport { useOverlayTriggerState } from \"react-stately\";\nimport { cn } from \"../../utils/cn\";\nimport type {\n  BottomSheetAnimationState,\n  BottomSheetContextValue,\n  BottomSheetHeadlessProps,\n} from \"./BottomSheet.types\";\nimport { useBottomSheetDrag } from \"./useBottomSheetDrag\";\n\n// ─── Context ──────────────────────────────────────────────────────────────────\n\n/**\n * Context shared between `BottomSheetHeadless` and its sub-components\n * (`BottomSheetHandle` and others).\n *\n * @internal\n */\nexport const BottomSheetContext = createContext<BottomSheetContextValue | null>(null);\n\n/**\n * Hook to consume `BottomSheetContext` inside bottom sheet sub-components.\n * Throws a descriptive error if used outside a `BottomSheetHeadless` tree.\n *\n * @internal\n */\nexport function useBottomSheetContext(): BottomSheetContextValue {\n  const ctx = useContext(BottomSheetContext);\n  if (ctx === null) {\n    throw new Error(\n      \"[BottomSheet] BottomSheetHandle and other sub-components must be rendered \" +\n        \"inside a <BottomSheet> or <BottomSheetHeadless> component.\"\n    );\n  }\n  return ctx;\n}\n\n// ─── BottomSheetModalPanel (internal) ────────────────────────────────────────\n\n/**\n * Internal panel component for the modal variant.\n * Wires `useDialog`, `useOverlay`, and `usePreventScroll`, then renders the\n * accessible dialog element.\n *\n * Follows the same pattern as `ModalDrawerPanel` in `DrawerHeadless` and\n * `DialogPanel` in `DialogHeadless`.\n *\n * @internal\n */\ninterface BottomSheetModalPanelProps {\n  ariaLabel: string;\n  onClose: () => void;\n  className: string | undefined;\n  animationState: BottomSheetAnimationState;\n  getAnimationClassName: ((state: BottomSheetAnimationState) => string) | undefined;\n  onTransitionEnd: () => void;\n  forwardedRef: React.Ref<HTMLDivElement> | null;\n  /** Whether a drag gesture is in progress — applied as data-dragging on the panel. */\n  isDragging: boolean;\n  /** Inline style providing snap-point height and drag translateY transform. */\n  panelStyle: React.CSSProperties;\n  children: React.ReactNode;\n}\n\nconst BottomSheetModalPanel = ({\n  ariaLabel,\n  onClose,\n  className,\n  animationState,\n  getAnimationClassName,\n  onTransitionEnd,\n  forwardedRef,\n  isDragging,\n  panelStyle,\n  children,\n}: BottomSheetModalPanelProps): React.ReactElement => {\n  // Internal ref for React Aria hooks — always an object ref\n  const panelRef = useRef<HTMLDivElement | null>(null);\n\n  // Lock body scroll while the modal sheet is mounted\n  usePreventScroll();\n\n  // Provides role=\"dialog\", aria-label, aria-modal\n  const { dialogProps } = useDialog(\n    { \"aria-label\": ariaLabel },\n    panelRef as React.RefObject<HTMLDivElement>\n  );\n\n  // Handles Escape key and outside-pointer dismissal\n  const { overlayProps } = useOverlay(\n    { isOpen: true, onClose, isDismissable: true, shouldCloseOnBlur: false },\n    panelRef as React.RefObject<HTMLDivElement>\n  );\n\n  // Merge the internal panelRef with the forwarded ref from BottomSheetHeadless\n  const setRef = useCallback(\n    (node: HTMLDivElement | null) => {\n      panelRef.current = node;\n      if (typeof forwardedRef === \"function\") {\n        forwardedRef(node);\n      } else if (forwardedRef !== null) {\n        (forwardedRef as React.MutableRefObject<HTMLDivElement | null>).current = node;\n      }\n    },\n    [forwardedRef]\n  );\n\n  return (\n    <div\n      {...mergeProps(overlayProps, dialogProps)}\n      ref={setRef}\n      aria-modal=\"true\"\n      className={cn(className, getAnimationClassName?.(animationState))}\n      data-animation-state={animationState}\n      data-dragging={isDragging ? \"\" : undefined}\n      style={panelStyle}\n      onTransitionEnd={onTransitionEnd}\n    >\n      {children}\n    </div>\n  );\n};\n\nBottomSheetModalPanel.displayName = \"BottomSheetModalPanel\";\n\n// ─── BottomSheetHeadless ──────────────────────────────────────────────────────\n\n/**\n * `BottomSheetHeadless` — Layer 2 headless primitive (Milestone 2: state + portal).\n *\n * Implements open/close state management, portal rendering to `document.body`,\n * the animation state machine, and `BottomSheetContext` provisioning.\n * Dialog semantics, scrim, focus trap, and drag/snap logic are added in M03+.\n *\n * - **Portal rendering**: content renders in `document.body` via `createPortal`\n * - **Open/close state**: `useOverlayTriggerState` (controlled + uncontrolled)\n * - **Animation state machine**: `entering → visible → exiting → exited`\n * - **Portal gate**: removes DOM content when `!isOpen && animationState === 'exited'`\n * - **SSR guard**: returns `null` when `document` is undefined\n *\n * @example\n * ```tsx\n * // Controlled\n * <BottomSheetHeadless open={open} onOpenChange={setOpen} aria-label=\"Options\">\n *   <BottomSheetHandle />\n *   <p>Content here</p>\n * </BottomSheetHeadless>\n *\n * // Uncontrolled\n * <BottomSheetHeadless defaultOpen aria-label=\"Player\">\n *   <p>Audio player</p>\n * </BottomSheetHeadless>\n * ```\n */\nexport const BottomSheetHeadless = forwardRef<HTMLDivElement, BottomSheetHeadlessProps>(\n  function BottomSheetHeadless(\n    {\n      variant = \"modal\",\n      open,\n      defaultOpen = false,\n      onOpenChange,\n      snapPoints = [\"50%\"],\n      \"aria-label\": ariaLabel,\n      children,\n      className,\n      scrimClassName,\n      getAnimationClassName,\n    },\n    ref\n  ) {\n    // ── Open/close state ──────────────────────────────────────────────────────\n\n    const state = useOverlayTriggerState({\n      ...(open !== undefined ? { isOpen: open } : {}),\n      ...(defaultOpen !== undefined ? { defaultOpen } : {}),\n      ...(onOpenChange !== undefined ? { onOpenChange } : {}),\n    });\n\n    const isOpen = state.isOpen;\n\n    const close = useCallback(() => {\n      state.close();\n    }, [state]);\n\n    // ── Animation state machine ───────────────────────────────────────────────\n\n    const [animationState, setAnimationState] = useState<BottomSheetAnimationState>(\"exited\");\n    // Guard against calling state updates after the exit animation completes multiple times\n    const closedRef = useRef<boolean>(false);\n    // Fallback timer for exit animation — fires if onTransitionEnd doesn't fire in time\n    const exitFallbackRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n    // Entry: isOpen becomes true → 'entering' → setTimeout(0) → 'visible'\n    useEffect(() => {\n      if (!isOpen) return;\n\n      closedRef.current = false;\n      setAnimationState(\"entering\");\n\n      // Zero-delay timer ensures 'entering' state is committed (allowing CSS\n      // transition initial values to paint) before advancing to 'visible'.\n      const id = setTimeout(() => {\n        setAnimationState(\"visible\");\n      }, 0);\n\n      return () => clearTimeout(id);\n    }, [isOpen]);\n\n    // Exit: isOpen becomes false while 'visible' → 'exiting' → 300ms fallback → 'exited'\n    useEffect(() => {\n      if (isOpen) return;\n      if (animationState === \"exited\" || animationState === \"entering\") return;\n\n      if (animationState === \"visible\") {\n        setAnimationState(\"exiting\");\n\n        // 300ms fallback (longer than Dialog's 150ms — slide animations take longer)\n        exitFallbackRef.current = setTimeout(() => {\n          if (!closedRef.current) {\n            closedRef.current = true;\n            setAnimationState(\"exited\");\n          }\n        }, 300);\n      }\n    }, [isOpen, animationState]);\n\n    // Cleanup fallback timer on unmount\n    useEffect(\n      () => () => {\n        if (exitFallbackRef.current !== null) {\n          clearTimeout(exitFallbackRef.current);\n        }\n      },\n      []\n    );\n\n    const handleTransitionEnd = useCallback(() => {\n      if (animationState === \"exiting\" && !closedRef.current) {\n        if (exitFallbackRef.current !== null) {\n          clearTimeout(exitFallbackRef.current);\n          exitFallbackRef.current = null;\n        }\n        closedRef.current = true;\n        setAnimationState(\"exited\");\n      }\n    }, [animationState]);\n\n    // ── Drag handle interaction and snap logic (M04) ──────────────────────────\n\n    const {\n      currentSnapIndex,\n      isDragging,\n      dragTranslateY,\n      handleProps: dragHandleProps,\n    } = useBottomSheetDrag({ snapPoints, onClose: close });\n\n    // The hook's default aria-label \"Adjust sheet height\" is the correct label per MD3 spec.\n    // Consumers can override via BottomSheetHandleProps[\"aria-label\"] on <BottomSheetHandle />.\n    const handleProps = dragHandleProps;\n\n    // ── Panel inline style ────────────────────────────────────────────────────\n    //\n    // The sheet's visible height is driven by the active snap point. Since the\n    // panel is `position: fixed; bottom: 0`, percentage heights are relative to\n    // the viewport, which is exactly what snap points represent (e.g. \"50%\" = 50vh).\n    //\n    // During a drag gesture, the height is adjusted by the pointer delta so the\n    // sheet resizes from the bottom edge — matching MD3 spec behaviour:\n    // \"A bottom sheet can automatically resize to another height after interacting\n    // with the drag handle\" (detail.md §Dragging).\n    //\n    // dragTranslateY > 0: dragging DOWN → height decreases (sheet shrinks from top)\n    // dragTranslateY < 0: dragging UP   → height increases (sheet grows from top)\n    // calc(50% - 50px)  → sheet is 50px shorter than its snap height\n    // calc(50% + 50px)  → sheet is 50px taller  than its snap height\n    //\n    // The `data-[dragging=true]:transition-none` CVA class suppresses the height\n    // spring while dragging is active so the sheet follows the pointer without lag.\n    // After release, the transition animates height to the nearest snap position.\n    const snapHeight = snapPoints[currentSnapIndex] ?? \"50%\";\n    const panelStyle: React.CSSProperties = {\n      height:\n        isDragging && dragTranslateY !== null\n          ? `calc(${snapHeight} - ${dragTranslateY}px)`\n          : snapHeight,\n    };\n\n    // ── Context value ─────────────────────────────────────────────────────────\n\n    const contextValue: BottomSheetContextValue = {\n      isOpen,\n      variant,\n      snapPoints,\n      currentSnapIndex,\n      isDragging,\n      dragTranslateY,\n      close,\n      handleProps,\n    };\n\n    // ── Scrim dismissal (modal always dismissable per MD3 spec) ───────────────\n\n    const handleScrimClick = (): void => {\n      close();\n    };\n\n    // ── Portal gate ───────────────────────────────────────────────────────────\n\n    // Remove portal content entirely once the exit animation has fully completed\n    if (!isOpen && animationState === \"exited\") {\n      return null;\n    }\n\n    // ── SSR guard ─────────────────────────────────────────────────────────────\n\n    if (typeof document === \"undefined\") return null;\n\n    // ── Portal content ────────────────────────────────────────────────────────\n\n    const content =\n      variant === \"modal\" ? (\n        // Modal: dialog semantics + focus trap + scrim\n        <BottomSheetContext.Provider value={contextValue}>\n          <FocusScope contain restoreFocus autoFocus>\n            {/* Scrim — aria-hidden so assistive tech ignores it */}\n            <div\n              data-testid=\"bottom-sheet-scrim\"\n              className={scrimClassName}\n              onClick={handleScrimClick}\n              aria-hidden=\"true\"\n            />\n            <BottomSheetModalPanel\n              ariaLabel={ariaLabel}\n              onClose={close}\n              className={className}\n              animationState={animationState}\n              getAnimationClassName={getAnimationClassName}\n              onTransitionEnd={handleTransitionEnd}\n              forwardedRef={ref}\n              isDragging={isDragging}\n              panelStyle={panelStyle}\n            >\n              {children}\n            </BottomSheetModalPanel>\n          </FocusScope>\n        </BottomSheetContext.Provider>\n      ) : (\n        // Standard: plain surface, no dialog role, no scrim, no focus trap\n        <BottomSheetContext.Provider value={contextValue}>\n          <div\n            ref={ref}\n            className={cn(className, getAnimationClassName?.(animationState))}\n            data-animation-state={animationState}\n            data-dragging={isDragging ? \"\" : undefined}\n            style={panelStyle}\n            onTransitionEnd={handleTransitionEnd}\n          >\n            {children}\n          </div>\n        </BottomSheetContext.Provider>\n      );\n\n    return createPortal(content, document.body) as React.ReactElement;\n  }\n);\n\nBottomSheetHeadless.displayName = \"BottomSheetHeadless\";\n","import { cva, type VariantProps } from \"class-variance-authority\";\n\n/**\n * Material Design 3 Bottom Sheet Variants\n *\n * Architecture: Variants vs States\n * - CVA holds design-time structure only (no state variants, no state compoundVariants).\n * - The drag handle's interaction states are driven by data-* attributes on its wrapper\n *   via group-data-[x]/handle Tailwind selectors in each slot's base classes.\n * - Content flags (data-dragging) are set explicitly by the component, not via helper.\n *\n * Slot responsibilities:\n *   bottomSheetVariants               — fixed container; surface, shape, elevation, snap spring\n *   bottomSheetScrimVariants          — modal scrim overlay; opacity fade (screen-level token)\n *   bottomSheetAnimationVariants      — enter/exit animation state machine classes\n *   bottomSheetHandleWrapperVariants  — 48dp touch target; carries `group/handle`; data-* host\n *   bottomSheetHandleStateLayerVariants — hover/focus/pressed/dragged opacity ring around pill\n *   bottomSheetHandleFocusRingVariants  — keyboard focus outline overlay (opacity-driven)\n *   bottomSheetHandlePillVariants     — 32×4dp pill decoration; pointer-events-none\n *\n * MD3 Spec:\n *   Container surface: surface-container-low, elevation level-1\n *   Shape: extra-large top corners (28dp), square bottom (attached to screen edge)\n *   Width: full width up to 640dp; centered at max-width 640dp on wider viewports\n *   Top margin: 72dp default, 56dp when viewport > 640dp\n *   Drag handle: 32dp × 4dp, on-surface-variant, centered, 22dp top/bottom padding → 48dp target\n *   Scrim: bg-scrim, 32% opacity\n *   State-layer opacities: hover 8% | focus 10% | pressed 10% | dragged 16%\n */\n\n// ─── ANIMATION VARIANTS ───────────────────────────────────────────────────────\n\n/**\n * CVA animation state variants for the Bottom Sheet panel.\n *\n * Motion decision rationale:\n * - Bottom sheet is a standard-size component → `default` speed tier\n * - Slides in/out of screen → composite `animate-md-*` utilities (not manual spring tokens)\n * - Scrim opacity is an effects property → `duration-short4 ease-standard` (legacy screen-level)\n * - Snap spring is a spatial on-screen transition → `ease-spring-standard-default-spatial` +\n *   `duration-spring-standard-default-spatial` (applied in bottomSheetVariants base)\n * - Standard personality (not expressive) — sheets are utility UI, not moments of delight\n */\nexport const bottomSheetAnimationVariants = cva(\"\", {\n  variants: {\n    animationState: {\n      // entering: initial mount frame — sheet starts below viewport (translateY(100%))\n      entering: [\"opacity-0\"],\n      // visible: entry animation active — animate-md-slide-in-bottom runs once\n      visible: [\"animate-md-slide-in-bottom\"],\n      // exiting: exit animation active — animate-md-slide-out-bottom runs once\n      exiting: [\"animate-md-slide-out-bottom\"],\n      // exited: portal gate removes element — no classes needed\n      exited: [\"opacity-0\", \"pointer-events-none\"],\n    },\n  },\n  defaultVariants: {\n    animationState: \"entering\",\n  },\n});\n\nexport type BottomSheetAnimationVariants = VariantProps<typeof bottomSheetAnimationVariants>;\n\n// ─── CONTAINER ────────────────────────────────────────────────────────────────\n\n/**\n * Root container — the bottom sheet panel.\n *\n * MD3 tokens applied:\n * - Surface: bg-surface-container-low\n * - Elevation: shadow-elevation-1\n * - Shape: extra-large top corners (28dp via rounded-t-xl), square bottom (attached to edge)\n * - Width: full width up to 640dp (mx-auto + w-[640px] max-w-full)\n * - Height: snap-point driven via inline style; constrained by max-height to enforce top margin\n *   Default: 72dp top margin → max-h-[calc(100vh-72px)]\n *   Wide (> 640dp): 56dp top margin → sm:max-h-[calc(100vh-56px)]\n * - Snap spring: spatial on-screen transition → spring-standard default spatial pair\n *   data-[dragging]:transition-none suppresses spring during active drag (1:1 pointer tracking)\n *\n * NOTE: overflow-hidden clips content during height transitions. The handle's state layer and\n * focus-ring overlay are sized/positioned to fit within the wrapper, so they are not clipped.\n */\nexport const bottomSheetVariants = cva(\n  [\n    // Position: fixed to bottom edge, full width\n    \"fixed bottom-0 left-0 right-0\",\n\n    // Surface token\n    \"bg-surface-container-low\",\n\n    // Elevation level 1 per MD3 spec\n    \"shadow-elevation-1\",\n\n    // Shape: extra-large top corners (28dp), square bottom (screen-attached)\n    // NOTE: measurement-derived value from MD3 spec; permitted exception per component-variants rule\n    \"rounded-t-xl\",\n\n    // Layout\n    \"flex flex-col\",\n\n    // Width constraint (full width up to 640dp)\n    \"mx-auto\",\n    // NOTE: measurement-derived value from MD3 spec; permitted exception\n    \"w-[640px] max-w-full\",\n\n    // Clip content during height transitions\n    \"overflow-hidden\",\n\n    // Snap spring: spatial property (height), standard personality, default tier\n    \"transition-[height]\",\n    \"duration-spring-standard-default-spatial\",\n    \"ease-spring-standard-default-spatial\",\n    // Suppress spring while dragging so the sheet follows the pointer 1:1\n    \"data-[dragging]:transition-none\",\n    \"will-change-[height]\",\n\n    // Responsive layout: top margin expressed as max-height\n    // NOTE: measurement-derived values from MD3 spec; permitted exception\n    \"max-h-[calc(100vh-72px)]\",\n    \"sm:max-h-[calc(100vh-56px)]\",\n  ],\n  {\n    variants: {\n      variant: {\n        // Modal: rendered above the scrim (z-50)\n        modal: \"z-50\",\n        // Standard: sits above normal content but below overlays\n        standard: \"z-10\",\n      },\n    },\n    defaultVariants: {\n      variant: \"modal\",\n    },\n  }\n);\n\nexport type BottomSheetVariants = VariantProps<typeof bottomSheetVariants>;\n\n// ─── SCRIM ────────────────────────────────────────────────────────────────────\n\n/**\n * Scrim overlay (modal variant only).\n *\n * MD3 tokens applied:\n * - bg-scrim: scrim surface role\n * - opacity-32: 32% opacity per MD3 spec\n * - Transition: opacity fade (scrim is a screen-level effects property → legacy duration tokens)\n */\nexport const bottomSheetScrimVariants = cva([\n  \"fixed inset-0 z-40\",\n  \"bg-scrim opacity-32\",\n  // Screen-level effects transition (scrim enters/exits the screen, not an on-screen state change)\n  \"transition-opacity duration-short4 ease-standard\",\n]);\n\nexport type BottomSheetScrimVariants = VariantProps<typeof bottomSheetScrimVariants>;\n\n// ─── HANDLE WRAPPER ───────────────────────────────────────────────────────────\n\n/**\n * Drag handle wrapper — 48dp touch target area + group scope host.\n *\n * Carries `group/handle` so all handle child slots can consume data-* interaction\n * states via `group-data-[x]/handle:` Tailwind selectors without any CVA variant props.\n *\n * MD3 spec: 22dp top + 4dp handle + 22dp bottom = 48dp interaction zone.\n * NOTE: py-[22px] is a measurement-derived value from MD3 spec; permitted exception.\n *\n * `relative` provides positioning context for the state layer and focus ring overlays.\n * `focus-visible:outline-none` suppresses the browser default — the focus ring overlay\n * in `bottomSheetHandleFocusRingVariants` provides the MD3-spec visible indicator instead.\n */\nexport const bottomSheetHandleWrapperVariants = cva([\n  // Center the pill horizontally; provide positioning context for overlays\n  \"relative flex items-center justify-center w-full\",\n\n  // 48dp touch target (22dp top + 4dp pill + 22dp bottom)\n  // NOTE: measurement-derived value from MD3 spec; permitted exception\n  \"py-[22px]\",\n\n  // Suppress browser default focus outline — the focus-ring overlay slot handles it\n  \"focus-visible:outline-none\",\n\n  // Cursor affordance for drag interaction\n  \"cursor-ns-resize\",\n]);\n\nexport type BottomSheetHandleWrapperVariants = VariantProps<\n  typeof bottomSheetHandleWrapperVariants\n>;\n\n// ─── HANDLE STATE LAYER ───────────────────────────────────────────────────────\n\n/**\n * Drag handle state layer — the semi-transparent interaction feedback ring.\n *\n * Positioned to wrap the pill snugly (not the full 48dp target) to keep the\n * visual feedback proportional to the pill. Sized as a wide pill shape that\n * encapsulates the 32dp × 4dp handle with generous rounded ends.\n *\n * Color: on-surface-variant (matches the pill's own color role per MD3).\n * Opacity progression:\n *   0 at rest\n *   8%  hover\n *   10% focus-visible / pressed\n *   16% dragged (MD3 \"dragged\" state = 16%)\n *\n * Disabled on the handle is not applicable (handle is always interactive when sheet is open).\n */\nexport const bottomSheetHandleStateLayerVariants = cva([\n  // Overlay positioned centrally — sits behind the pill\n  \"absolute pointer-events-none\",\n  // Pill-shaped to complement the handle's form\n  \"rounded-full\",\n  // Sized wider than the pill to provide a visible state layer halo\n  // 48dp wide × 16dp tall — centred by the flex wrapper\n  \"w-12 h-4\",\n\n  // State-layer color (same role as the pill)\n  \"bg-on-surface-variant\",\n\n  // Effects transition — opacity must NOT overshoot\n  \"transition-opacity duration-spring-standard-fast-effects ease-spring-standard-fast-effects\",\n\n  // Opacity at rest\n  \"opacity-0\",\n\n  // Hover: 8%\n  \"group-data-[hovered]/handle:opacity-8\",\n  // Focus-visible: 10%\n  \"group-data-[focus-visible]/handle:opacity-10\",\n  // Pressed: 10% (doubled selector wins over hover at same cascade position)\n  \"group-data-[pressed]/handle:group-data-[pressed]/handle:opacity-10\",\n  // Dragging: 16% (MD3 dragged state — highest on-screen opacity)\n  // Doubled selector wins over hover + pressed\n  \"group-data-[dragging]/handle:group-data-[dragging]/handle:opacity-16\",\n]);\n\nexport type BottomSheetHandleStateLayerVariants = VariantProps<\n  typeof bottomSheetHandleStateLayerVariants\n>;\n\n// ─── HANDLE FOCUS RING ────────────────────────────────────────────────────────\n\n/**\n * Drag handle focus ring overlay.\n *\n * Rendered as an absolutely-positioned element that is always in the DOM\n * (opacity-0 at rest, opacity-100 on keyboard/programmatic focus). The\n * opacity-driven approach avoids layout shifts and enables a smooth transition.\n *\n * Positioned to wrap the pill tightly — slightly larger than the state layer\n * to remain legible. Uses `outline` rather than `border` to avoid layout impact.\n *\n * MD3 spec: focus indicator color = secondary, weight ≈ 2–3dp.\n * We use `outline-2 outline-secondary` to meet the intent with token classes.\n *\n * This element MUST be outside the pill's z-stack but inside the wrapper so\n * it is not clipped by the container's `overflow-hidden`.\n */\nexport const bottomSheetHandleFocusRingVariants = cva([\n  \"absolute pointer-events-none\",\n  \"rounded-full\",\n  // Sized to sit around the state layer halo\n  \"w-14 h-5\",\n\n  // MD3 focus indicator: secondary color, 2dp weight\n  \"outline outline-2 outline-offset-0 outline-secondary\",\n\n  // Effects transition — opacity change must NOT overshoot\n  \"transition-opacity duration-spring-standard-fast-effects ease-spring-standard-fast-effects\",\n\n  // Hidden at rest; shown on keyboard/programmatic focus\n  \"opacity-0\",\n  \"group-data-[focus-visible]/handle:opacity-100\",\n]);\n\nexport type BottomSheetHandleFocusRingVariants = VariantProps<\n  typeof bottomSheetHandleFocusRingVariants\n>;\n\n// ─── HANDLE PILL ──────────────────────────────────────────────────────────────\n\n/**\n * Drag handle pill — the visible 32×4dp decoration.\n *\n * MD3 tokens applied:\n * - bg-on-surface-variant: handle color (muted, low-emphasis by role — no opacity override needed)\n * - w-8 / h-1: 32dp × 4dp per MD3 spec (measurement-derived; permitted exception)\n * - rounded-full: fully-rounded pill shape\n *\n * `pointer-events-none` — all interaction is handled by the wrapper.\n * `relative z-10` — renders above the state layer overlay.\n */\nexport const bottomSheetHandlePillVariants = cva([\n  \"relative z-10 pointer-events-none\",\n  \"bg-on-surface-variant\",\n  \"rounded-full\",\n  // Dimensions: 32dp × 4dp per MD3 spec (measurement-derived; permitted exception)\n  \"w-8\", // 32dp = 2rem\n  \"h-1\", // 4dp  = 0.25rem\n]);\n\nexport type BottomSheetHandlePillVariants = VariantProps<typeof bottomSheetHandlePillVariants>;\n\n// ─── LEGACY TYPE ALIAS ────────────────────────────────────────────────────────\n\n// Kept for backward-compat with existing exports; prefer the specific slot types above.\nexport type BottomSheetHandleVariants = BottomSheetHandleWrapperVariants;\n","\"use client\";\n\nimport type { ReactElement } from \"react\";\nimport { useHover, useFocusRing, mergeProps } from \"react-aria\";\nimport { cn } from \"../../utils/cn\";\nimport { getInteractionDataAttributes } from \"../../utils/interactionStates\";\nimport { useBottomSheetContext } from \"./BottomSheetHeadless\";\nimport {\n  bottomSheetHandleWrapperVariants,\n  bottomSheetHandleStateLayerVariants,\n  bottomSheetHandleFocusRingVariants,\n  bottomSheetHandlePillVariants,\n} from \"./BottomSheet.variants\";\nimport type { BottomSheetHandleProps } from \"./BottomSheet.types\";\n\n/**\n * `BottomSheetHandle` — the draggable handle at the top of the Bottom Sheet.\n *\n * Implements the Variants-vs-States architecture used across TinyBigUI:\n * - Carries `group/handle` on its wrapper so child slots consume data-* selectors.\n * - Emits `getInteractionDataAttributes` for hover/focus/pressed states from React Aria.\n * - Emits `data-dragging` as a component-specific content flag (ternary encoding).\n * - Renders three slots inside the wrapper (stacked via absolute positioning):\n *   1. State layer — hover/focus/pressed/dragged opacity feedback (aria-hidden)\n *   2. Focus ring overlay — keyboard focus indicator (aria-hidden)\n *   3. Pill — the visible 32×4dp decoration (aria-hidden)\n *\n * Pointer and keyboard props are injected from `BottomSheetContext` (via `useBottomSheetDrag`).\n * React Aria `useHover` and `useFocusRing` are merged on top — they do not conflict with the\n * existing `onPointerDown`/`onPointerUp` drag handlers.\n */\nfunction BottomSheetHandle({\n  className,\n  \"aria-label\": ariaLabelOverride,\n}: BottomSheetHandleProps): ReactElement {\n  const { handleProps, isDragging } = useBottomSheetContext();\n\n  // React Aria hooks — provide hover and focus-ring interaction state booleans.\n  // usePress is intentionally omitted: the drag hook's onPointerDown/onPointerUp\n  // already manage pressed state semantics; using usePress alongside would conflict.\n  const { isHovered, hoverProps } = useHover({});\n  const { isFocusVisible, focusProps } = useFocusRing();\n\n  // isDragging acts as the \"pressed\" analogue for the handle (MD3 dragged = 16% opacity).\n  // We pass it as isPressed so the state layer reacts to drag at the standard pressed tier,\n  // then also set data-dragging for the 16% dragged-specific override.\n  const mergedHandleProps = mergeProps(handleProps, hoverProps, focusProps);\n\n  return (\n    <div\n      {...mergedHandleProps}\n      {...(ariaLabelOverride !== undefined ? { \"aria-label\": ariaLabelOverride } : {})}\n      className={cn(bottomSheetHandleWrapperVariants(), \"group/handle\", className)}\n      data-testid=\"bottom-sheet-handle\"\n      // Interaction states via shared helper (presence-based ternary encoding)\n      {...getInteractionDataAttributes({\n        isHovered,\n        isFocusVisible,\n        // Treat active drag as pressed — drives the state layer to 10% opacity\n        isPressed: isDragging,\n      })}\n      // data-dragging is a component-specific content flag (not an interaction state)\n      // driving the 16% dragged-tier opacity on the state layer\n      data-dragging={isDragging ? \"\" : undefined}\n    >\n      {/* State layer — absolute, behind pill, aria-hidden */}\n      <span className={cn(bottomSheetHandleStateLayerVariants())} aria-hidden=\"true\" />\n\n      {/* Focus ring overlay — absolute, behind pill, aria-hidden */}\n      <span className={cn(bottomSheetHandleFocusRingVariants())} aria-hidden=\"true\" />\n\n      {/* Pill decoration — relative z-10, sits above overlays, aria-hidden */}\n      <span className={cn(bottomSheetHandlePillVariants())} aria-hidden=\"true\" />\n    </div>\n  );\n}\n\nBottomSheetHandle.displayName = \"BottomSheetHandle\";\n\nexport { BottomSheetHandle };\n","\"use client\";\n\nimport { forwardRef, useCallback } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { BottomSheetHeadless } from \"./BottomSheetHeadless\";\nimport { BottomSheetHandle } from \"./BottomSheetHandle\";\nimport {\n  bottomSheetVariants,\n  bottomSheetScrimVariants,\n  bottomSheetAnimationVariants,\n} from \"./BottomSheet.variants\";\nimport { useReducedMotion } from \"../../hooks/useReducedMotion\";\nimport type { BottomSheetProps, BottomSheetAnimationState } from \"./BottomSheet.types\";\n\n/**\n * `BottomSheet` — Layer 3 MD3 Styled Bottom Sheet Component.\n *\n * Applies Material Design 3 visual tokens via CVA variants, renders the drag\n * handle automatically, and wires up the scrim overlay for the modal variant.\n * Built on top of `BottomSheetHeadless` (Layer 2) for full accessibility.\n *\n * **Modal** (default):\n * - `bg-surface-container-low`, `shadow-elevation-1`, `rounded-t-xl`\n * - Full-width scrim overlay (`z-40`) with 32% opacity\n * - Sheet panel at `z-50`, dismissable via Escape, scrim click, or drag\n *\n * **Standard**:\n * - Same visual surface, no scrim, no focus trap, co-exists with content\n * - Sheet panel at `z-10`\n *\n * Responsive layout (> 640dp viewport):\n * - 56dp side margins and 56dp top margin (`sm:mx-14 sm:top-14`)\n * - All corners rounded (`sm:rounded-xl`) — sheet floats away from screen edge\n *\n * @example\n * ```tsx\n * // Modal variant — controlled\n * <BottomSheet\n *   open={open}\n *   onOpenChange={setOpen}\n *   snapPoints={['50%', '90%']}\n *   aria-label=\"Share options\"\n * >\n *   <p>Share to...</p>\n * </BottomSheet>\n *\n * // Standard variant — uncontrolled\n * <BottomSheet variant=\"standard\" defaultOpen aria-label=\"Now playing\">\n *   <p>Song title</p>\n * </BottomSheet>\n * ```\n *\n * @see https://m3.material.io/components/bottom-sheets/overview\n */\nexport const BottomSheet = forwardRef<HTMLDivElement, BottomSheetProps>(function BottomSheet(\n  {\n    variant = \"modal\",\n    open,\n    defaultOpen,\n    onOpenChange,\n    snapPoints,\n    \"aria-label\": ariaLabel,\n    children,\n    className,\n  },\n  ref\n) {\n  const reducedMotion = useReducedMotion();\n\n  /**\n   * Returns the CVA animation class for the current animation state.\n   * Returns empty string when the user prefers reduced motion, suppressing\n   * all JS-driven slide animations per WCAG 2.1 AA and MD3 reduce-motion spec.\n   */\n  const getAnimationClassName = useCallback(\n    (state: BottomSheetAnimationState): string => {\n      if (reducedMotion) return \"\";\n      return bottomSheetAnimationVariants({ animationState: state });\n    },\n    [reducedMotion]\n  );\n\n  // When reducedMotion is true, append transition-none to override the snap\n  // spring transition-transform added in bottomSheetVariants base.\n  // tailwind-merge resolves the conflict and keeps transition-none.\n  const panelClassName = cn(\n    bottomSheetVariants({ variant }),\n    reducedMotion && \"transition-none\",\n    className\n  );\n  const scrimClassName = bottomSheetScrimVariants();\n\n  return (\n    <BottomSheetHeadless\n      ref={ref}\n      variant={variant}\n      {...(open !== undefined ? { open } : {})}\n      {...(defaultOpen !== undefined ? { defaultOpen } : {})}\n      {...(onOpenChange !== undefined ? { onOpenChange } : {})}\n      {...(snapPoints !== undefined ? { snapPoints } : {})}\n      aria-label={ariaLabel}\n      className={panelClassName}\n      scrimClassName={scrimClassName}\n      getAnimationClassName={getAnimationClassName}\n    >\n      <BottomSheetHandle />\n      {children}\n    </BottomSheetHeadless>\n  );\n});\n\nBottomSheet.displayName = \"BottomSheet\";\n","\"use client\";\n\nimport type { ClockHandProps } from \"./TimePicker.types\";\n\n/**\n * Headless ClockHand (Layer 2)\n *\n * Renders the clock hand selector: a center dot (8dp), a track line (2dp),\n * and a handle circle (48dp) at the selected angular position.\n *\n * This is a headless component — it provides behavior, ARIA semantics, and\n * data attributes only. No styling classes are applied.\n *\n * @internal\n */\nexport function ClockHand({\n  angle,\n  mode,\n  isInnerRing = false,\n  className,\n}: ClockHandProps): JSX.Element {\n  return (\n    <div\n      className={className}\n      data-clock-hand\n      data-mode={mode}\n      {...(isInnerRing ? { \"data-inner-ring\": \"\" } : {})}\n      style={{ transform: `rotate(${angle}deg)` }}\n      aria-hidden=\"true\"\n    >\n      <div data-clock-hand-center />\n      <div data-clock-hand-track />\n      <div data-clock-hand-handle />\n    </div>\n  );\n}\n\nClockHand.displayName = \"ClockHand\";\n","\"use client\";\n\nimport { useCallback, useRef, useState } from \"react\";\n\nimport type { UseClockDialOptions, UseClockDialReturn } from \"./TimePicker.types\";\n\n/**\n * Radius threshold ratio for distinguishing inner vs outer ring in 24h mode.\n * Pointer distance from center below this fraction of the dial radius selects inner ring.\n */\nconst INNER_RING_THRESHOLD_RATIO = 0.65;\n\n/**\n * Converts a pointer position relative to the clock dial center\n * into an angle in degrees measured clockwise from 12 o'clock.\n */\nfunction pointerToAngle(clientX: number, clientY: number, rect: DOMRect): number {\n  const centerX = rect.left + rect.width / 2;\n  const centerY = rect.top + rect.height / 2;\n  const dx = clientX - centerX;\n  const dy = -(clientY - centerY);\n  const radians = Math.atan2(dx, dy);\n  return ((radians * 180) / Math.PI + 360) % 360;\n}\n\n/**\n * Returns the distance from the pointer to the center of the dial, normalised\n * to the dial radius (0 = center, 1 = edge).\n */\nfunction pointerDistanceRatio(clientX: number, clientY: number, rect: DOMRect): number {\n  const centerX = rect.left + rect.width / 2;\n  const centerY = rect.top + rect.height / 2;\n  const dx = clientX - centerX;\n  const dy = clientY - centerY;\n  const radius = rect.width / 2;\n  return Math.sqrt(dx * dx + dy * dy) / radius;\n}\n\n/**\n * Snaps an angle to the nearest hour value (12 positions, 30° each).\n * Returns the hour value (1-12).\n */\nfunction angleToHour12(degrees: number): number {\n  const snapped = Math.round(degrees / 30) % 12;\n  return snapped === 0 ? 12 : snapped;\n}\n\n/**\n * Snaps an angle + distance to the nearest 24h hour value (0-23).\n * Outer ring: 1-12, inner ring: 13-24 (with 0 replacing 24).\n */\nfunction angleToHour24(degrees: number, isInner: boolean): number {\n  const snapped = Math.round(degrees / 30) % 12;\n  if (isInner) {\n    return snapped === 0 ? 0 : snapped + 12;\n  }\n  return snapped === 0 ? 12 : snapped;\n}\n\n/**\n * Snaps an angle to the nearest minute value (60 positions, 6° each).\n * Respects minuteStep by rounding to the nearest step.\n */\nfunction angleToMinute(degrees: number, step: number): number {\n  const rawMinute = Math.round(degrees / 6) % 60;\n  if (step <= 1) return rawMinute;\n  return (Math.round(rawMinute / step) * step) % 60;\n}\n\n/**\n * Converts a selected value back to an angle for clock hand rendering.\n */\nfunction valueToAngle(value: number, mode: \"hour\" | \"minute\"): number {\n  if (mode === \"hour\") {\n    return ((value % 12) * 30) % 360;\n  }\n  return (value * 6) % 360;\n}\n\n/**\n * Custom hook for clock dial interaction.\n * Converts pointer position to angular value selection.\n *\n * @param options - Configuration for the clock dial hook\n * @returns Props to spread on the dial container, hand angle, and interaction state\n *\n * @example\n * ```tsx\n * const { dialProps, handAngle, isDragging, isInnerRing } = useClockDial({\n *   selectionMode: 'hour',\n *   hourCycle: 12,\n *   onSelect: (value) => setHour(value),\n *   containerRef: dialRef,\n * });\n * ```\n */\nexport function useClockDial(options: UseClockDialOptions): UseClockDialReturn {\n  const {\n    selectionMode,\n    hourCycle,\n    onSelect,\n    containerRef,\n    isDisabled = false,\n    minuteStep = 1,\n  } = options;\n\n  const [isDragging, setIsDragging] = useState(false);\n  const [isInnerRing, setIsInnerRing] = useState(false);\n  const [handAngle, setHandAngle] = useState(0);\n  const activePointerIdRef = useRef<number | null>(null);\n\n  const resolveValue = useCallback(\n    (clientX: number, clientY: number) => {\n      const el = containerRef.current;\n      if (!el) return;\n      const rect = el.getBoundingClientRect();\n      const angle = pointerToAngle(clientX, clientY, rect);\n\n      if (selectionMode === \"hour\") {\n        if (hourCycle === 24) {\n          const distRatio = pointerDistanceRatio(clientX, clientY, rect);\n          const inner = distRatio < INNER_RING_THRESHOLD_RATIO;\n          setIsInnerRing(inner);\n          const hour = angleToHour24(angle, inner);\n          setHandAngle(valueToAngle(hour, \"hour\"));\n          onSelect?.(hour);\n        } else {\n          setIsInnerRing(false);\n          const hour = angleToHour12(angle);\n          setHandAngle(valueToAngle(hour, \"hour\"));\n          onSelect?.(hour);\n        }\n      } else {\n        setIsInnerRing(false);\n        const minute = angleToMinute(angle, minuteStep);\n        setHandAngle(valueToAngle(minute, \"minute\"));\n        onSelect?.(minute);\n      }\n    },\n    [selectionMode, hourCycle, onSelect, containerRef, minuteStep]\n  );\n\n  const handlePointerDown = useCallback(\n    (e: React.PointerEvent<HTMLDivElement>) => {\n      if (isDisabled) return;\n      e.preventDefault();\n      activePointerIdRef.current = e.pointerId;\n      const target = e.currentTarget as HTMLDivElement;\n      if (typeof target.setPointerCapture === \"function\") {\n        target.setPointerCapture(e.pointerId);\n      }\n      setIsDragging(true);\n      resolveValue(e.clientX, e.clientY);\n    },\n    [isDisabled, resolveValue]\n  );\n\n  const handlePointerMove = useCallback(\n    (e: React.PointerEvent<HTMLDivElement>) => {\n      if (!isDragging || isDisabled) return;\n      if (e.pointerId !== activePointerIdRef.current) return;\n      resolveValue(e.clientX, e.clientY);\n    },\n    [isDragging, isDisabled, resolveValue]\n  );\n\n  const handlePointerUp = useCallback(\n    (e: React.PointerEvent<HTMLDivElement>) => {\n      if (isDisabled) return;\n      if (e.pointerId !== activePointerIdRef.current) return;\n      const target = e.currentTarget as HTMLDivElement;\n      if (typeof target.releasePointerCapture === \"function\") {\n        target.releasePointerCapture(e.pointerId);\n      }\n      activePointerIdRef.current = null;\n      setIsDragging(false);\n    },\n    [isDisabled]\n  );\n\n  const dialProps: React.HTMLAttributes<HTMLDivElement> = {\n    onPointerDown: handlePointerDown,\n    onPointerMove: handlePointerMove,\n    onPointerUp: handlePointerUp,\n    ...(isDragging ? { \"data-dragging\": \"\" } : {}),\n  };\n\n  return {\n    dialProps,\n    handAngle,\n    isDragging,\n    isInnerRing,\n  };\n}\n","\"use client\";\n\nimport { useCallback, useRef } from \"react\";\n\nimport { ClockHand } from \"./ClockHand\";\nimport { useClockDial } from \"./useClockDial\";\n\nimport type { ClockDialProps } from \"./TimePicker.types\";\n\n/** 12-hour number labels (1-12). */\nconst HOURS_12: readonly number[] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] as const;\n\n/** Outer ring for 24h mode (1-12). */\nconst HOURS_24_OUTER: readonly number[] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] as const;\n\n/** Inner ring for 24h mode (13-24, with 0 replacing 24). */\nconst HOURS_24_INNER: readonly number[] = [13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 0] as const;\n\n/**\n * Converts a numeric position (0-11 around the dial) to x/y percentages\n * on a circle, starting from 12 o'clock and going clockwise.\n */\nfunction positionOnCircle(\n  index: number,\n  total: number,\n  radiusPercent: number\n): { x: number; y: number } {\n  const angleDeg = (index * 360) / total - 90;\n  const angleRad = (angleDeg * Math.PI) / 180;\n  return {\n    x: 50 + radiusPercent * Math.cos(angleRad),\n    y: 50 + radiusPercent * Math.sin(angleRad),\n  };\n}\n\n/**\n * Converts a selected value to an angle in degrees from 12 o'clock.\n */\nfunction valueToAngle(value: number, mode: \"hour\" | \"minute\"): number {\n  if (mode === \"hour\") {\n    return ((value % 12) * 30) % 360;\n  }\n  return (value * 6) % 360;\n}\n\n/**\n * Headless ClockDial (Layer 2)\n *\n * Renders a circular clock face with numbered positions for hour or minute selection.\n * Uses the `useClockDial` custom hook for pointer-to-angle interaction.\n *\n * - 12-hour: single ring with numbers 1-12 at 30° intervals\n * - 24-hour: outer ring 1-12, inner ring 13-24 (with 0)\n * - Each number is a 48dp touch target\n *\n * This is a headless component — it provides behavior, ARIA semantics, and\n * data attributes only. No styling classes are applied.\n *\n * @internal\n */\nexport function ClockDial({\n  selectionMode,\n  selectedHour,\n  selectedMinute,\n  hourCycle,\n  minuteStep = 1,\n  onSelect,\n  isDisabled = false,\n  className,\n}: ClockDialProps): JSX.Element {\n  const containerRef = useRef<HTMLDivElement>(null);\n\n  const { dialProps, handAngle, isDragging, isInnerRing } = useClockDial({\n    selectionMode,\n    hourCycle,\n    ...(onSelect ? { onSelect } : {}),\n    containerRef,\n    isDisabled,\n    minuteStep,\n  });\n\n  const currentValue = selectionMode === \"hour\" ? selectedHour : selectedMinute;\n  const displayAngle = isDragging ? handAngle : valueToAngle(currentValue, selectionMode);\n\n  const isInnerSelected =\n    selectionMode === \"hour\" && hourCycle === 24 && (currentValue === 0 || currentValue > 12);\n\n  const resolvedIsInner = isDragging ? isInnerRing : isInnerSelected;\n\n  const handleNumberClick = useCallback(\n    (value: number) => {\n      if (isDisabled) return;\n      onSelect?.(value);\n    },\n    [isDisabled, onSelect]\n  );\n\n  const handleNumberKeyDown = useCallback(\n    (e: React.KeyboardEvent, value: number) => {\n      if (e.key === \"Enter\" || e.key === \" \") {\n        e.preventDefault();\n        handleNumberClick(value);\n      }\n    },\n    [handleNumberClick]\n  );\n\n  const renderClockNumber = (\n    key: string,\n    value: number,\n    label: string,\n    pos: { x: number; y: number },\n    isSelected: boolean,\n    extraAttrs?: Record<string, string>\n  ): JSX.Element => (\n    <div\n      key={key}\n      role=\"option\"\n      tabIndex={isDisabled ? -1 : 0}\n      aria-selected={isSelected}\n      aria-label={`${value}`}\n      data-clock-number\n      data-value={value}\n      {...(isSelected ? { \"data-selected\": \"\" } : {})}\n      {...extraAttrs}\n      style={{\n        position: \"absolute\",\n        left: `${pos.x}%`,\n        top: `${pos.y}%`,\n        transform: \"translate(-50%, -50%)\",\n      }}\n      onClick={() => handleNumberClick(value)}\n      onKeyDown={(e) => handleNumberKeyDown(e, value)}\n    >\n      {label}\n    </div>\n  );\n\n  const renderHourNumbers = (): JSX.Element[] => {\n    if (hourCycle === 24) {\n      const outerNumbers = HOURS_24_OUTER.map((hour, i) => {\n        const pos = positionOnCircle(i, 12, 40);\n        const isSelected = selectionMode === \"hour\" && selectedHour === hour;\n        return renderClockNumber(`outer-${hour}`, hour, `${hour}`, pos, isSelected);\n      });\n      const innerNumbers = HOURS_24_INNER.map((hour, i) => {\n        const pos = positionOnCircle(i, 12, 25);\n        const isSelected = selectionMode === \"hour\" && selectedHour === hour;\n        return renderClockNumber(`inner-${hour}`, hour, `${hour}`, pos, isSelected, {\n          \"data-inner-ring\": \"\",\n        });\n      });\n      return [...outerNumbers, ...innerNumbers];\n    }\n\n    return HOURS_12.map((hour, i) => {\n      const pos = positionOnCircle(i, 12, 40);\n      const isSelected = selectionMode === \"hour\" && selectedHour === hour;\n      return renderClockNumber(`${hour}`, hour, `${hour}`, pos, isSelected);\n    });\n  };\n\n  const renderMinuteNumbers = (): JSX.Element[] => {\n    const minuteLabels = Array.from({ length: 12 }, (_, i) => i * 5);\n    return minuteLabels.map((minute, i) => {\n      const pos = positionOnCircle(i, 12, 40);\n      const isSelected = selectionMode === \"minute\" && selectedMinute === minute;\n      return renderClockNumber(\n        `${minute}`,\n        minute,\n        String(minute).padStart(2, \"0\"),\n        pos,\n        isSelected\n      );\n    });\n  };\n\n  return (\n    <div\n      ref={containerRef}\n      {...dialProps}\n      className={className}\n      role=\"listbox\"\n      aria-label={selectionMode === \"hour\" ? \"Clock dial hours\" : \"Clock dial minutes\"}\n      data-clock-dial\n      data-selection-mode={selectionMode}\n      data-hour-cycle={hourCycle}\n      {...(isDisabled ? { \"data-disabled\": \"\" } : {})}\n      style={{ position: \"relative\", touchAction: \"none\" }}\n    >\n      <ClockHand angle={displayAngle} mode={selectionMode} isInnerRing={resolvedIsInner} />\n      {selectionMode === \"hour\" ? renderHourNumbers() : renderMinuteNumbers()}\n    </div>\n  );\n}\n\nClockDial.displayName = \"ClockDial\";\n","\"use client\";\n\nimport { useCallback, useRef } from \"react\";\nimport { useFocusRing, mergeProps } from \"react-aria\";\n\nimport type { TimeSelectorProps } from \"./TimePicker.types\";\n\n/**\n * Formats hour for display, respecting the hour cycle.\n * - 12h: displays 1-12\n * - 24h: displays 0-23 (zero-padded)\n */\nfunction formatHour(hour: number, hourCycle: 12 | 24): string {\n  if (hourCycle === 12) {\n    const display = hour % 12;\n    return String(display === 0 ? 12 : display).padStart(2, \"0\");\n  }\n  return String(hour).padStart(2, \"0\");\n}\n\n/**\n * Formats minute for display (always zero-padded to 2 digits).\n */\nfunction formatMinute(minute: number): string {\n  return String(minute).padStart(2, \"0\");\n}\n\n/**\n * Headless TimeSelector (Layer 2)\n *\n * Renders the hour:minute display with two large interactive containers\n * acting as `role=\"spinbutton\"` elements. Users can click to switch between\n * hour and minute selection, or use Arrow Up/Down to increment/decrement values.\n *\n * This is a headless component — it provides behavior, ARIA semantics, and\n * data attributes only. No styling classes are applied.\n *\n * @internal\n */\nexport function TimeSelector({\n  hour,\n  minute,\n  activeField,\n  onFieldChange,\n  onHourChange,\n  onMinuteChange,\n  hourCycle,\n  isDisabled = false,\n  className,\n}: TimeSelectorProps): JSX.Element {\n  const hourMin = hourCycle === 24 ? 0 : 1;\n  const hourMax = hourCycle === 24 ? 23 : 12;\n\n  const hourRef = useRef<HTMLDivElement>(null);\n  const minuteRef = useRef<HTMLDivElement>(null);\n\n  const { focusProps: hourFocusProps, isFocusVisible: hourFocusVisible } = useFocusRing();\n  const { focusProps: minuteFocusProps, isFocusVisible: minuteFocusVisible } = useFocusRing();\n\n  const handleHourKeyDown = useCallback(\n    (e: React.KeyboardEvent) => {\n      if (isDisabled) return;\n      if (e.key === \"ArrowUp\") {\n        e.preventDefault();\n        const next = hour >= hourMax ? hourMin : hour + 1;\n        onHourChange?.(next);\n      } else if (e.key === \"ArrowDown\") {\n        e.preventDefault();\n        const next = hour <= hourMin ? hourMax : hour - 1;\n        onHourChange?.(next);\n      }\n    },\n    [hour, hourMin, hourMax, isDisabled, onHourChange]\n  );\n\n  const handleMinuteKeyDown = useCallback(\n    (e: React.KeyboardEvent) => {\n      if (isDisabled) return;\n      if (e.key === \"ArrowUp\") {\n        e.preventDefault();\n        const next = minute >= 59 ? 0 : minute + 1;\n        onMinuteChange?.(next);\n      } else if (e.key === \"ArrowDown\") {\n        e.preventDefault();\n        const next = minute <= 0 ? 59 : minute - 1;\n        onMinuteChange?.(next);\n      }\n    },\n    [minute, isDisabled, onMinuteChange]\n  );\n\n  const handleHourClick = useCallback(() => {\n    if (isDisabled) return;\n    onFieldChange(\"hour\");\n  }, [isDisabled, onFieldChange]);\n\n  const handleMinuteClick = useCallback(() => {\n    if (isDisabled) return;\n    onFieldChange(\"minute\");\n  }, [isDisabled, onFieldChange]);\n\n  return (\n    <div className={className} data-time-selector>\n      <div\n        {...mergeProps({ onKeyDown: handleHourKeyDown, onClick: handleHourClick }, hourFocusProps)}\n        ref={hourRef}\n        role=\"spinbutton\"\n        tabIndex={isDisabled ? -1 : 0}\n        aria-label=\"Hours\"\n        aria-valuenow={hour}\n        aria-valuemin={hourMin}\n        aria-valuemax={hourMax}\n        aria-disabled={isDisabled || undefined}\n        data-time-field=\"hour\"\n        {...(activeField === \"hour\" ? { \"data-selected\": \"\" } : {})}\n        {...(hourFocusVisible ? { \"data-focus-visible\": \"\" } : {})}\n      >\n        {formatHour(hour, hourCycle)}\n      </div>\n      <span data-time-separator aria-hidden=\"true\">\n        :\n      </span>\n      <div\n        {...mergeProps(\n          { onKeyDown: handleMinuteKeyDown, onClick: handleMinuteClick },\n          minuteFocusProps\n        )}\n        ref={minuteRef}\n        role=\"spinbutton\"\n        tabIndex={isDisabled ? -1 : 0}\n        aria-label=\"Minutes\"\n        aria-valuenow={minute}\n        aria-valuemin={0}\n        aria-valuemax={59}\n        aria-disabled={isDisabled || undefined}\n        data-time-field=\"minute\"\n        {...(activeField === \"minute\" ? { \"data-selected\": \"\" } : {})}\n        {...(minuteFocusVisible ? { \"data-focus-visible\": \"\" } : {})}\n      >\n        {formatMinute(minute)}\n      </div>\n    </div>\n  );\n}\n\nTimeSelector.displayName = \"TimeSelector\";\n","\"use client\";\n\nimport { useCallback, useRef } from \"react\";\nimport { useFocusRing, mergeProps } from \"react-aria\";\n\nimport type { PeriodSelectorProps, TimePeriod } from \"./TimePicker.types\";\n\nconst PERIODS: readonly TimePeriod[] = [\"AM\", \"PM\"] as const;\n\n/**\n * Internal radio item with focus-visible support.\n * @internal\n */\nfunction PeriodRadio({\n  period,\n  isSelected,\n  isDisabled,\n  onClick,\n  onKeyDown,\n}: {\n  period: TimePeriod;\n  isSelected: boolean;\n  isDisabled: boolean;\n  onClick: () => void;\n  onKeyDown: (e: React.KeyboardEvent) => void;\n}): JSX.Element {\n  const ref = useRef<HTMLDivElement>(null);\n  const { focusProps, isFocusVisible } = useFocusRing();\n\n  return (\n    <div\n      {...mergeProps(focusProps, { onClick, onKeyDown })}\n      ref={ref}\n      role=\"radio\"\n      tabIndex={isDisabled ? -1 : isSelected ? 0 : -1}\n      aria-checked={isSelected}\n      aria-label={period}\n      aria-disabled={isDisabled || undefined}\n      data-period={period}\n      {...(isSelected ? { \"data-selected\": \"\" } : {})}\n      {...(isFocusVisible ? { \"data-focus-visible\": \"\" } : {})}\n    >\n      {period}\n    </div>\n  );\n}\n\n/**\n * Headless PeriodSelector (Layer 2)\n *\n * Renders an AM/PM toggle as a `role=\"radiogroup\"` with two `role=\"radio\"`\n * options. Supports keyboard navigation (Arrow Left/Right to toggle).\n *\n * Only rendered for 12-hour format time pickers.\n *\n * This is a headless component — it provides behavior, ARIA semantics, and\n * data attributes only. No styling classes are applied.\n *\n * @internal\n */\nexport function PeriodSelector({\n  value,\n  onChange,\n  orientation = \"vertical\",\n  isDisabled = false,\n  className,\n}: PeriodSelectorProps): JSX.Element {\n  const handleKeyDown = useCallback(\n    (e: React.KeyboardEvent, period: TimePeriod) => {\n      if (isDisabled) return;\n      if (\n        e.key === \"ArrowLeft\" ||\n        e.key === \"ArrowRight\" ||\n        e.key === \"ArrowUp\" ||\n        e.key === \"ArrowDown\"\n      ) {\n        e.preventDefault();\n        const next = period === \"AM\" ? \"PM\" : \"AM\";\n        onChange(next);\n      }\n    },\n    [isDisabled, onChange]\n  );\n\n  const handleClick = useCallback(\n    (period: TimePeriod) => {\n      if (isDisabled) return;\n      onChange(period);\n    },\n    [isDisabled, onChange]\n  );\n\n  return (\n    <div\n      role=\"radiogroup\"\n      aria-label=\"Time period\"\n      className={className}\n      data-period-selector\n      data-orientation={orientation}\n      {...(isDisabled ? { \"data-disabled\": \"\" } : {})}\n    >\n      {PERIODS.map((period) => {\n        const isSelected = value === period;\n        return (\n          <PeriodRadio\n            key={period}\n            period={period}\n            isSelected={isSelected}\n            isDisabled={isDisabled}\n            onClick={() => handleClick(period)}\n            onKeyDown={(e) => handleKeyDown(e, period)}\n          />\n        );\n      })}\n    </div>\n  );\n}\n\nPeriodSelector.displayName = \"PeriodSelector\";\n","\"use client\";\n\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { useButton } from \"react-aria\";\n\nimport { ClockDial } from \"./ClockDial\";\nimport { TimeSelector } from \"./TimeSelector\";\nimport { PeriodSelector } from \"./PeriodSelector\";\n\nimport type {\n  ClockSelectionMode,\n  TimePeriod,\n  TimePickerDialProps,\n  TimeValue,\n} from \"./TimePicker.types\";\n\n/**\n * Converts 12h display hour + period into internal 0-23 hour.\n */\nfunction to24Hour(displayHour: number, period: TimePeriod): number {\n  if (period === \"AM\") {\n    return displayHour === 12 ? 0 : displayHour;\n  }\n  return displayHour === 12 ? 12 : displayHour + 12;\n}\n\n/**\n * Extracts the 12h display hour and period from a 0-23 hour value.\n */\nfunction from24Hour(hour24: number): { displayHour: number; period: TimePeriod } {\n  const period: TimePeriod = hour24 >= 12 ? \"PM\" : \"AM\";\n  const displayHour = hour24 % 12 === 0 ? 12 : hour24 % 12;\n  return { displayHour, period };\n}\n\n/**\n * Headless TimePickerDial (Layer 2)\n *\n * Orchestrates the full time picker dial experience by composing:\n * - Headline\n * - TimeSelector (hour:minute spinbuttons)\n * - PeriodSelector (AM/PM, 12h only)\n * - ClockDial + ClockHand\n * - Action buttons (Cancel / OK)\n * - Mode toggle (switch to keyboard input)\n *\n * Key behaviors:\n * - Initial mode: hour selection\n * - After selecting hour via clock dial, auto-advances to minute selection\n * - After selecting minute, ready for confirm\n * - Pointer drag on clock face updates value in real-time\n * - Time selector containers clickable to switch selection mode\n *\n * This is a headless component — it provides behavior, ARIA semantics, and\n * data attributes only. No styling classes are applied.\n *\n * @example\n * ```tsx\n * <TimePickerDial\n *   hourCycle={12}\n *   defaultValue={{ hour: 7, minute: 0 }}\n *   onConfirm={(time) => console.log(time)}\n * />\n * ```\n */\nexport function TimePickerDial({\n  hourCycle = 12,\n  orientation = \"vertical\",\n  value,\n  defaultValue,\n  onChange,\n  minuteStep = 1,\n  isDisabled = false,\n  headline = \"Select time\",\n  cancelLabel = \"Cancel\",\n  confirmLabel = \"OK\",\n  onCancel,\n  onConfirm,\n  onModeToggle,\n  className,\n}: TimePickerDialProps): JSX.Element {\n  // ── Internal state ─────────────────────────────────────────────────────────\n\n  const resolvedDefault = defaultValue ?? { hour: 0, minute: 0 };\n\n  const [internalTime, setInternalTime] = useState<TimeValue>(value ?? resolvedDefault);\n  const [selectionMode, setSelectionMode] = useState<ClockSelectionMode>(\"hour\");\n  const [period, setPeriod] = useState<TimePeriod>(\n    () => from24Hour((value ?? resolvedDefault).hour).period\n  );\n\n  // Sync controlled value\n  useEffect(() => {\n    if (value !== undefined && value !== null) {\n      setInternalTime(value);\n      setPeriod(from24Hour(value.hour).period);\n    }\n  }, [value]);\n\n  // ── Derived values ─────────────────────────────────────────────────────────\n\n  const hour24 = internalTime.hour;\n  const displayHour = hourCycle === 12 ? from24Hour(hour24).displayHour : hour24;\n\n  // ── Handlers ───────────────────────────────────────────────────────────────\n\n  const updateTime = useCallback(\n    (newTime: TimeValue) => {\n      setInternalTime(newTime);\n      onChange?.(newTime);\n    },\n    [onChange]\n  );\n\n  const handleDialSelect = useCallback(\n    (selectedValue: number) => {\n      if (selectionMode === \"hour\") {\n        let newHour: number;\n        if (hourCycle === 12) {\n          newHour = to24Hour(selectedValue, period);\n        } else {\n          newHour = selectedValue;\n        }\n        updateTime({ ...internalTime, hour: newHour });\n        setTimeout(() => setSelectionMode(\"minute\"), 300);\n      } else {\n        updateTime({ ...internalTime, minute: selectedValue });\n      }\n    },\n    [selectionMode, hourCycle, period, internalTime, updateTime]\n  );\n\n  const handleFieldChange = useCallback((field: ClockSelectionMode) => {\n    setSelectionMode(field);\n  }, []);\n\n  const handleHourChange = useCallback(\n    (newHour: number) => {\n      let hour: number;\n      if (hourCycle === 12) {\n        hour = to24Hour(newHour, period);\n      } else {\n        hour = newHour;\n      }\n      updateTime({ ...internalTime, hour });\n    },\n    [hourCycle, period, internalTime, updateTime]\n  );\n\n  const handleMinuteChange = useCallback(\n    (newMinute: number) => {\n      updateTime({ ...internalTime, minute: newMinute });\n    },\n    [internalTime, updateTime]\n  );\n\n  const handlePeriodChange = useCallback(\n    (newPeriod: TimePeriod) => {\n      setPeriod(newPeriod);\n      const { displayHour: dh } = from24Hour(internalTime.hour);\n      const newHour = to24Hour(dh, newPeriod);\n      updateTime({ ...internalTime, hour: newHour });\n    },\n    [internalTime, updateTime]\n  );\n\n  const handleConfirm = useCallback(() => {\n    onConfirm?.(internalTime);\n  }, [internalTime, onConfirm]);\n\n  const handleCancel = useCallback(() => {\n    onCancel?.();\n  }, [onCancel]);\n\n  // ── Button refs & props ────────────────────────────────────────────────────\n\n  const cancelRef = useRef<HTMLButtonElement>(null);\n  const confirmRef = useRef<HTMLButtonElement>(null);\n  const modeToggleRef = useRef<HTMLButtonElement>(null);\n\n  const { buttonProps: cancelButtonProps } = useButton(\n    {\n      \"aria-label\": cancelLabel,\n      isDisabled,\n      ...(onCancel ? { onPress: handleCancel } : {}),\n    },\n    cancelRef\n  );\n\n  const { buttonProps: confirmButtonProps } = useButton(\n    {\n      \"aria-label\": confirmLabel,\n      isDisabled,\n      ...(onConfirm ? { onPress: handleConfirm } : {}),\n    },\n    confirmRef\n  );\n\n  const { buttonProps: modeToggleButtonProps } = useButton(\n    {\n      \"aria-label\": \"Switch to keyboard input\",\n      isDisabled,\n      ...(onModeToggle ? { onPress: onModeToggle } : {}),\n    },\n    modeToggleRef\n  );\n\n  // ── aria-live announcement ──────────────────────────────────────────────────\n\n  const [announcement, setAnnouncement] = useState(\"\");\n\n  useEffect(() => {\n    const h = hourCycle === 12 ? displayHour : hour24;\n    const m = internalTime.minute;\n    const periodStr = hourCycle === 12 ? ` ${period}` : \"\";\n    setAnnouncement(`${h}:${String(m).padStart(2, \"0\")}${periodStr}`);\n  }, [internalTime, period, hourCycle, displayHour, hour24]);\n\n  // ── Render ─────────────────────────────────────────────────────────────────\n\n  return (\n    <div\n      className={className}\n      data-variant=\"dial\"\n      data-orientation={orientation}\n      data-selection-mode={selectionMode}\n      {...(isDisabled ? { \"data-disabled\": \"\" } : {})}\n    >\n      <div data-headline>{headline}</div>\n\n      <TimeSelector\n        hour={displayHour}\n        minute={internalTime.minute}\n        activeField={selectionMode}\n        onFieldChange={handleFieldChange}\n        onHourChange={handleHourChange}\n        onMinuteChange={handleMinuteChange}\n        hourCycle={hourCycle}\n        isDisabled={isDisabled}\n      />\n\n      {hourCycle === 12 && (\n        <PeriodSelector value={period} onChange={handlePeriodChange} isDisabled={isDisabled} />\n      )}\n\n      <ClockDial\n        selectionMode={selectionMode}\n        selectedHour={hourCycle === 12 ? displayHour : hour24}\n        selectedMinute={internalTime.minute}\n        hourCycle={hourCycle}\n        minuteStep={minuteStep}\n        onSelect={handleDialSelect}\n        isDisabled={isDisabled}\n      />\n\n      <div data-actions>\n        <button\n          {...modeToggleButtonProps}\n          ref={modeToggleRef}\n          type=\"button\"\n          data-action=\"mode-toggle\"\n        >\n          ⌨\n        </button>\n        <button {...cancelButtonProps} ref={cancelRef} type=\"button\" data-action=\"cancel\">\n          {cancelLabel}\n        </button>\n        <button {...confirmButtonProps} ref={confirmRef} type=\"button\" data-action=\"confirm\">\n          {confirmLabel}\n        </button>\n      </div>\n\n      <div\n        aria-live=\"polite\"\n        aria-atomic=\"true\"\n        data-live-region\n        style={{\n          position: \"absolute\",\n          width: \"1px\",\n          height: \"1px\",\n          padding: 0,\n          margin: \"-1px\",\n          overflow: \"hidden\",\n          clip: \"rect(0, 0, 0, 0)\",\n          whiteSpace: \"nowrap\",\n          borderWidth: 0,\n        }}\n      >\n        {announcement}\n      </div>\n    </div>\n  );\n}\n\nTimePickerDial.displayName = \"TimePickerDial\";\n","import { cva, type VariantProps } from \"class-variance-authority\";\n\n// ─── Container ──────────────────────────────────────────────────────────────────\n\n/**\n * CVA for the Time Picker container.\n * MD3 spec: surface-container-high, extra-large corner radius (28dp), 24dp padding.\n */\nexport const timePickerContainerVariants = cva(\n  [\n    \"bg-surface-container-high\",\n    \"rounded-3xl\", // NOTE: shape.extra-large = 28dp; mapped via @theme token\n    \"p-6\", // NOTE: measurement-derived (24dp padding); permitted exception\n  ],\n  {\n    variants: {\n      variant: {\n        dial: \"\",\n        input: \"\",\n      },\n      orientation: {\n        vertical: \"flex flex-col gap-6\",\n        horizontal: \"flex flex-row gap-6\",\n      },\n    },\n    defaultVariants: {\n      variant: \"dial\",\n      orientation: \"vertical\",\n    },\n  }\n);\n\nexport type TimePickerContainerVariants = VariantProps<typeof timePickerContainerVariants>;\n\n// ─── Clock Dial Container ────────────────────────────────────────────────────────\n\n/**\n * CVA for the clock dial circular container.\n * MD3 spec: 256dp × 256dp, full circle, surface-container-highest background.\n */\nexport const clockDialContainerVariants = cva([\n  \"w-[256px]\", // NOTE: measurement-derived (256dp clock dial); permitted exception\n  \"h-[256px]\", // NOTE: measurement-derived (256dp); permitted exception\n  \"rounded-full\", // shape.full = circle\n  \"bg-surface-container-highest\",\n  \"relative\",\n  \"select-none\",\n  \"touch-action-none\",\n]);\n\nexport type ClockDialContainerVariants = VariantProps<typeof clockDialContainerVariants>;\n\n// ─── Clock Dial Number ───────────────────────────────────────────────────────────\n\n/**\n * CVA for individual clock dial number labels.\n * MD3 spec: 48dp touch target, on-surface text, on-primary when selected.\n */\nexport const clockDialNumberVariants = cva(\n  [\n    \"absolute\",\n    \"w-[48px]\", // NOTE: measurement-derived (48dp touch target); permitted exception\n    \"h-[48px]\", // NOTE: measurement-derived (48dp); permitted exception\n    \"rounded-full\",\n    \"flex\",\n    \"items-center\",\n    \"justify-center\",\n    \"text-body-large\",\n    \"cursor-pointer\",\n    \"transition-colors\",\n    \"duration-spring-standard-fast-effects\",\n    \"ease-spring-standard-fast-effects\",\n  ],\n  {\n    variants: {\n      selected: {\n        true: \"bg-primary text-on-primary z-10\",\n        false: \"text-on-surface\",\n      },\n      ring: {\n        outer: \"\",\n        inner: \"text-sm\",\n      },\n      state: {\n        enabled: \"\",\n        hovered: \"\",\n        focused: \"\",\n      },\n    },\n    compoundVariants: [\n      { selected: false, state: \"hovered\", className: \"bg-on-surface/8\" },\n      { selected: false, state: \"focused\", className: \"bg-on-surface/10\" },\n      { selected: true, state: \"hovered\", className: \"bg-primary/90\" },\n      { selected: true, state: \"focused\", className: \"bg-primary/90\" },\n    ],\n    defaultVariants: {\n      selected: false,\n      ring: \"outer\",\n      state: \"enabled\",\n    },\n  }\n);\n\nexport type ClockDialNumberVariants = VariantProps<typeof clockDialNumberVariants>;\n\n// ─── Clock Hand Parts ────────────────────────────────────────────────────────────\n\n/**\n * CVA for the clock hand center dot.\n * MD3 spec: 8dp circle, primary color.\n */\nexport const clockHandCenterVariants = cva([\n  \"absolute\",\n  \"top-1/2\",\n  \"left-1/2\",\n  \"-translate-x-1/2\",\n  \"-translate-y-1/2\",\n  \"w-[8px]\", // NOTE: measurement-derived (8dp center dot); permitted exception\n  \"h-[8px]\", // NOTE: measurement-derived (8dp); permitted exception\n  \"rounded-full\",\n  \"bg-primary\",\n  \"z-20\",\n]);\n\nexport type ClockHandCenterVariants = VariantProps<typeof clockHandCenterVariants>;\n\n/**\n * CVA for the clock hand track (selector line from center to handle).\n * MD3 spec: 2dp width, primary color.\n */\nexport const clockHandTrackVariants = cva([\n  \"absolute\",\n  \"top-1/2\",\n  \"left-1/2\",\n  \"w-[2px]\", // NOTE: measurement-derived (2dp track width); permitted exception\n  \"bg-primary\",\n  \"origin-bottom\",\n  \"z-10\",\n]);\n\nexport type ClockHandTrackVariants = VariantProps<typeof clockHandTrackVariants>;\n\n/**\n * CVA for the clock hand handle (endpoint circle).\n * MD3 spec: 48dp circle, primary color.\n */\nexport const clockHandHandleVariants = cva([\n  \"w-[48px]\", // NOTE: measurement-derived (48dp handle); permitted exception\n  \"h-[48px]\", // NOTE: measurement-derived (48dp); permitted exception\n  \"rounded-full\",\n  \"bg-primary\",\n  \"flex\",\n  \"items-center\",\n  \"justify-center\",\n  \"text-on-primary\",\n  \"text-body-large\",\n]);\n\nexport type ClockHandHandleVariants = VariantProps<typeof clockHandHandleVariants>;\n\n// ─── Time Selector ───────────────────────────────────────────────────────────────\n\n/**\n * CVA for the time selector containers (hour/minute display).\n * MD3 spec: 96dp × 80dp, small corner radius (8dp), display-large text.\n */\nexport const timeSelectorContainerVariants = cva(\n  [\n    \"w-[96px]\", // NOTE: measurement-derived (96dp); permitted exception\n    \"h-[80px]\", // NOTE: measurement-derived (80dp); permitted exception\n    \"rounded-lg\", // shape.small = 8dp\n    \"flex\",\n    \"flex-col\",\n    \"items-center\",\n    \"justify-center\",\n    \"cursor-pointer\",\n    \"text-display-large\",\n    \"transition-colors\",\n    \"duration-spring-standard-fast-effects\",\n    \"ease-spring-standard-fast-effects\",\n  ],\n  {\n    variants: {\n      selected: {\n        true: \"bg-primary-container text-on-primary-container\",\n        false: \"bg-surface-container-highest text-on-surface\",\n      },\n      state: {\n        enabled: \"\",\n        hovered: \"\",\n        focused: \"\",\n      },\n    },\n    compoundVariants: [\n      {\n        selected: false,\n        state: \"hovered\",\n        className: \"bg-surface-container-highest/80\",\n      },\n      {\n        selected: false,\n        state: \"focused\",\n        className: \"border-2 border-primary\",\n      },\n      {\n        selected: true,\n        state: \"hovered\",\n        className: \"bg-primary-container/80\",\n      },\n      {\n        selected: true,\n        state: \"focused\",\n        className: \"border-2 border-primary\",\n      },\n    ],\n    defaultVariants: {\n      selected: false,\n      state: \"enabled\",\n    },\n  }\n);\n\nexport type TimeSelectorContainerVariants = VariantProps<typeof timeSelectorContainerVariants>;\n\n// ─── Period Selector ─────────────────────────────────────────────────────────────\n\n/**\n * CVA for the AM/PM period selector container.\n * MD3 spec: 52dp × 80dp (vertical) or 216dp × 38dp (horizontal), outline border.\n */\nexport const periodSelectorContainerVariants = cva(\n  [\n    \"rounded-lg\", // shape.small = 8dp\n    \"border\",\n    \"border-outline\",\n    \"overflow-hidden\",\n    \"flex\",\n  ],\n  {\n    variants: {\n      orientation: {\n        vertical: \"w-[52px] h-[80px] flex-col\", // NOTE: measurement-derived; permitted exception\n        horizontal: \"w-[216px] h-[38px] flex-row\", // NOTE: measurement-derived; permitted exception\n      },\n    },\n    defaultVariants: {\n      orientation: \"vertical\",\n    },\n  }\n);\n\nexport type PeriodSelectorContainerVariants = VariantProps<typeof periodSelectorContainerVariants>;\n\n/**\n * CVA for individual period (AM/PM) buttons.\n * MD3 spec: tertiary-container when selected, on-surface-variant when not.\n */\nexport const periodSelectorItemVariants = cva(\n  [\n    \"flex-1\",\n    \"flex\",\n    \"items-center\",\n    \"justify-center\",\n    \"text-title-medium\",\n    \"cursor-pointer\",\n    \"border-outline\",\n    \"transition-colors\",\n    \"duration-spring-standard-fast-effects\",\n    \"ease-spring-standard-fast-effects\",\n  ],\n  {\n    variants: {\n      selected: {\n        true: \"bg-tertiary-container text-on-tertiary-container border-transparent\",\n        false: \"bg-transparent text-on-surface-variant\",\n      },\n      state: {\n        enabled: \"\",\n        hovered: \"\",\n        focused: \"\",\n      },\n    },\n    compoundVariants: [\n      {\n        selected: false,\n        state: \"hovered\",\n        className: \"bg-on-surface-variant/8\",\n      },\n      {\n        selected: false,\n        state: \"focused\",\n        className: \"bg-on-surface-variant/10\",\n      },\n      {\n        selected: true,\n        state: \"hovered\",\n        className: \"bg-tertiary-container/80\",\n      },\n      {\n        selected: true,\n        state: \"focused\",\n        className: \"bg-tertiary-container/80\",\n      },\n    ],\n    defaultVariants: {\n      selected: false,\n      state: \"enabled\",\n    },\n  }\n);\n\nexport type PeriodSelectorItemVariants = VariantProps<typeof periodSelectorItemVariants>;\n\n// ─── Time Input Field ────────────────────────────────────────────────────────────\n\n/**\n * CVA for time input field containers (keyboard entry mode).\n * MD3 spec: 96dp × 72dp, small corner radius (8dp).\n */\nexport const timeInputFieldVariants = cva(\n  [\n    \"w-[96px]\", // NOTE: measurement-derived (96dp); permitted exception\n    \"h-[72px]\", // NOTE: measurement-derived (72dp); permitted exception\n    \"rounded-lg\", // shape.small = 8dp\n    \"flex\",\n    \"flex-col\",\n    \"items-center\",\n    \"justify-center\",\n    \"cursor-text\",\n    \"text-display-large\",\n    \"transition-colors\",\n    \"duration-spring-standard-fast-effects\",\n    \"ease-spring-standard-fast-effects\",\n  ],\n  {\n    variants: {\n      selected: {\n        true: \"bg-primary-container text-on-primary-container border-2 border-primary\",\n        false: \"bg-surface-container-highest text-on-surface\",\n      },\n      state: {\n        enabled: \"\",\n        hovered: \"\",\n        focused: \"\",\n      },\n    },\n    defaultVariants: {\n      selected: false,\n      state: \"enabled\",\n    },\n  }\n);\n\nexport type TimeInputFieldVariants = VariantProps<typeof timeInputFieldVariants>;\n\n// ─── Separator ───────────────────────────────────────────────────────────────────\n\n/**\n * CVA for the time separator colon (:) between hour and minute.\n * MD3 spec: display-large, on-surface color.\n */\nexport const timeSeparatorVariants = cva([\n  \"text-display-large\",\n  \"text-on-surface\",\n  \"select-none\",\n  \"px-1\",\n]);\n\nexport type TimeSeparatorVariants = VariantProps<typeof timeSeparatorVariants>;\n\n// ─── Headline ────────────────────────────────────────────────────────────────────\n\n/**\n * CVA for the time picker headline text.\n * MD3 spec: label-medium typography, on-surface-variant color.\n */\nexport const timePickerHeadlineVariants = cva([\"text-label-medium\", \"text-on-surface-variant\"]);\n\nexport type TimePickerHeadlineVariants = VariantProps<typeof timePickerHeadlineVariants>;\n\n// ─── Action Buttons ──────────────────────────────────────────────────────────────\n\n/**\n * CVA for the action button row.\n * MD3 spec: right-aligned, gap spacing.\n */\nexport const timePickerActionRowVariants = cva([\"flex\", \"items-center\", \"justify-end\", \"gap-2\"]);\n\nexport type TimePickerActionRowVariants = VariantProps<typeof timePickerActionRowVariants>;\n\n/**\n * CVA for individual action button text styling.\n * MD3 spec: primary color text buttons.\n */\nexport const timePickerActionButtonVariants = cva([\n  \"text-primary\",\n  \"text-label-large\",\n  \"rounded-full\",\n  \"px-3\",\n  \"py-2\",\n  \"transition-colors\",\n  \"duration-spring-standard-fast-effects\",\n  \"ease-spring-standard-fast-effects\",\n  \"hover:bg-primary/8\",\n  \"focus-visible:bg-primary/10\",\n  \"active:bg-primary/10\",\n]);\n\nexport type TimePickerActionButtonVariants = VariantProps<typeof timePickerActionButtonVariants>;\n\n// ─── Mode Toggle ─────────────────────────────────────────────────────────────────\n\n/**\n * CVA for the mode toggle icon button (switch between dial and input).\n * MD3 spec: on-surface-variant icon, standard icon button.\n */\nexport const timePickerModeToggleVariants = cva([\n  \"text-on-surface-variant\",\n  \"w-12\",\n  \"h-12\",\n  \"rounded-full\",\n  \"flex\",\n  \"items-center\",\n  \"justify-center\",\n  \"transition-colors\",\n  \"duration-spring-standard-fast-effects\",\n  \"ease-spring-standard-fast-effects\",\n  \"hover:bg-on-surface-variant/8\",\n  \"focus-visible:bg-on-surface-variant/10\",\n]);\n\nexport type TimePickerModeToggleVariants = VariantProps<typeof timePickerModeToggleVariants>;\n","\"use client\";\n\nimport { useReducedMotion } from \"../../hooks/useReducedMotion\";\nimport { cn } from \"../../utils/cn\";\nimport { TimePickerDial } from \"./TimePickerDial\";\nimport { timePickerContainerVariants } from \"./TimePicker.variants\";\n\nimport type { TimePickerDialProps } from \"./TimePicker.types\";\n\n/**\n * Tailwind descendant selectors for styling the headless TimePickerDial elements.\n * Each selector targets internal sub-components by their data attributes.\n */\nconst DIAL_STYLES = [\n  // ── Headline ──────────────────────────────────────────────────────────────────\n  \"[&_[data-headline]]:text-label-medium\",\n  \"[&_[data-headline]]:text-on-surface-variant\",\n\n  // ── Time selector ─────────────────────────────────────────────────────────────\n  \"[&_[data-time-selector]]:flex\",\n  \"[&_[data-time-selector]]:items-center\",\n\n  // Time selector fields (hour/minute)\n  \"[&_[data-time-field]]:w-[96px]\",\n  \"[&_[data-time-field]]:h-[80px]\",\n  \"[&_[data-time-field]]:rounded-lg\",\n  \"[&_[data-time-field]]:flex\",\n  \"[&_[data-time-field]]:items-center\",\n  \"[&_[data-time-field]]:justify-center\",\n  \"[&_[data-time-field]]:text-display-large\",\n  \"[&_[data-time-field]]:cursor-pointer\",\n  \"[&_[data-time-field]]:transition-colors\",\n  \"[&_[data-time-field]]:duration-spring-standard-fast-effects\",\n  \"[&_[data-time-field]]:ease-spring-standard-fast-effects\",\n  \"[&_[data-time-field]]:bg-surface-container-highest\",\n  \"[&_[data-time-field]]:text-on-surface\",\n  \"[&_[data-time-field][data-selected]]:bg-primary-container\",\n  \"[&_[data-time-field][data-selected]]:text-on-primary-container\",\n  \"[&_[data-time-field]:not([data-selected]):hover]:bg-surface-container-highest/80\",\n  \"[&_[data-time-field][data-selected]:hover]:bg-primary-container/80\",\n  \"[&_[data-time-field][data-focus-visible]]:ring-2\",\n  \"[&_[data-time-field][data-focus-visible]]:ring-primary\",\n\n  // Separator colon\n  \"[&_[data-time-separator]]:text-display-large\",\n  \"[&_[data-time-separator]]:text-on-surface\",\n  \"[&_[data-time-separator]]:select-none\",\n  \"[&_[data-time-separator]]:px-1\",\n\n  // ── Period selector ───────────────────────────────────────────────────────────\n  \"[&_[data-period-selector]]:rounded-lg\",\n  \"[&_[data-period-selector]]:border\",\n  \"[&_[data-period-selector]]:border-outline\",\n  \"[&_[data-period-selector]]:overflow-hidden\",\n  \"[&_[data-period-selector]]:flex\",\n  '[&_[data-period-selector][data-orientation=\"vertical\"]]:w-[52px]',\n  '[&_[data-period-selector][data-orientation=\"vertical\"]]:h-[80px]',\n  '[&_[data-period-selector][data-orientation=\"vertical\"]]:flex-col',\n  '[&_[data-period-selector][data-orientation=\"horizontal\"]]:w-[216px]',\n  '[&_[data-period-selector][data-orientation=\"horizontal\"]]:h-[38px]',\n  '[&_[data-period-selector][data-orientation=\"horizontal\"]]:flex-row',\n  \"[&_[data-period-selector]]:ml-3\",\n\n  // Period items (AM/PM)\n  '[&_[data-period-selector]>[role=\"radio\"]]:flex-1',\n  '[&_[data-period-selector]>[role=\"radio\"]]:flex',\n  '[&_[data-period-selector]>[role=\"radio\"]]:items-center',\n  '[&_[data-period-selector]>[role=\"radio\"]]:justify-center',\n  '[&_[data-period-selector]>[role=\"radio\"]]:text-title-medium',\n  '[&_[data-period-selector]>[role=\"radio\"]]:cursor-pointer',\n  '[&_[data-period-selector]>[role=\"radio\"]]:border-outline',\n  '[&_[data-period-selector]>[role=\"radio\"]]:transition-colors',\n  '[&_[data-period-selector]>[role=\"radio\"]]:duration-spring-standard-fast-effects',\n  '[&_[data-period-selector]>[role=\"radio\"]]:ease-spring-standard-fast-effects',\n  '[&_[data-period-selector]>[role=\"radio\"]]:text-on-surface-variant',\n  '[&_[data-period-selector]>[role=\"radio\"][data-selected]]:bg-tertiary-container',\n  '[&_[data-period-selector]>[role=\"radio\"][data-selected]]:text-on-tertiary-container',\n  '[&_[data-period-selector]>[role=\"radio\"][data-selected]]:border-transparent',\n  '[&_[data-period-selector]>[role=\"radio\"]:not([data-selected]):hover]:bg-on-surface-variant/8',\n  '[&_[data-period-selector]>[role=\"radio\"][data-focus-visible]]:ring-2',\n  '[&_[data-period-selector]>[role=\"radio\"][data-focus-visible]]:ring-primary',\n\n  // ── Clock dial ────────────────────────────────────────────────────────────────\n  \"[&_[data-clock-dial]]:w-[256px]\",\n  \"[&_[data-clock-dial]]:h-[256px]\",\n  \"[&_[data-clock-dial]]:rounded-full\",\n  \"[&_[data-clock-dial]]:bg-surface-container-highest\",\n  \"[&_[data-clock-dial]]:mx-auto\",\n\n  // Clock numbers\n  \"[&_[data-clock-number]]:w-[48px]\",\n  \"[&_[data-clock-number]]:h-[48px]\",\n  \"[&_[data-clock-number]]:rounded-full\",\n  \"[&_[data-clock-number]]:flex\",\n  \"[&_[data-clock-number]]:items-center\",\n  \"[&_[data-clock-number]]:justify-center\",\n  \"[&_[data-clock-number]]:text-body-large\",\n  \"[&_[data-clock-number]]:cursor-pointer\",\n  \"[&_[data-clock-number]]:transition-colors\",\n  \"[&_[data-clock-number]]:duration-spring-standard-fast-effects\",\n  \"[&_[data-clock-number]]:ease-spring-standard-fast-effects\",\n  \"[&_[data-clock-number]]:text-on-surface\",\n  \"[&_[data-clock-number][data-selected]]:bg-primary\",\n  \"[&_[data-clock-number][data-selected]]:text-on-primary\",\n  \"[&_[data-clock-number][data-selected]]:z-10\",\n  \"[&_[data-clock-number]:not([data-selected]):hover]:bg-on-surface/8\",\n\n  // ── Clock hand ────────────────────────────────────────────────────────────────\n  \"[&_[data-clock-hand]]:absolute\",\n  \"[&_[data-clock-hand]]:top-1/2\",\n  \"[&_[data-clock-hand]]:left-1/2\",\n  \"[&_[data-clock-hand]]:origin-bottom\",\n\n  \"[&_[data-clock-hand-center]]:absolute\",\n  \"[&_[data-clock-hand-center]]:top-1/2\",\n  \"[&_[data-clock-hand-center]]:left-1/2\",\n  \"[&_[data-clock-hand-center]]:-translate-x-1/2\",\n  \"[&_[data-clock-hand-center]]:-translate-y-1/2\",\n  \"[&_[data-clock-hand-center]]:w-[8px]\",\n  \"[&_[data-clock-hand-center]]:h-[8px]\",\n  \"[&_[data-clock-hand-center]]:rounded-full\",\n  \"[&_[data-clock-hand-center]]:bg-primary\",\n  \"[&_[data-clock-hand-center]]:z-20\",\n\n  \"[&_[data-clock-hand-track]]:absolute\",\n  \"[&_[data-clock-hand-track]]:top-1/2\",\n  \"[&_[data-clock-hand-track]]:left-1/2\",\n  \"[&_[data-clock-hand-track]]:w-[2px]\",\n  \"[&_[data-clock-hand-track]]:bg-primary\",\n  \"[&_[data-clock-hand-track]]:origin-bottom\",\n  \"[&_[data-clock-hand-track]]:z-10\",\n\n  \"[&_[data-clock-hand-handle]]:w-[48px]\",\n  \"[&_[data-clock-hand-handle]]:h-[48px]\",\n  \"[&_[data-clock-hand-handle]]:rounded-full\",\n  \"[&_[data-clock-hand-handle]]:bg-primary\",\n  \"[&_[data-clock-hand-handle]]:flex\",\n  \"[&_[data-clock-hand-handle]]:items-center\",\n  \"[&_[data-clock-hand-handle]]:justify-center\",\n  \"[&_[data-clock-hand-handle]]:text-on-primary\",\n  \"[&_[data-clock-hand-handle]]:text-body-large\",\n\n  // ── Actions ───────────────────────────────────────────────────────────────────\n  \"[&_[data-actions]]:flex\",\n  \"[&_[data-actions]]:items-center\",\n  \"[&_[data-actions]]:justify-end\",\n  \"[&_[data-actions]]:gap-2\",\n\n  \"[&_[data-action]]:text-primary\",\n  \"[&_[data-action]]:text-label-large\",\n  \"[&_[data-action]]:rounded-full\",\n  \"[&_[data-action]]:px-3\",\n  \"[&_[data-action]]:py-2\",\n  \"[&_[data-action]]:min-h-12\",\n  \"[&_[data-action]]:transition-colors\",\n  \"[&_[data-action]]:duration-spring-standard-fast-effects\",\n  \"[&_[data-action]]:ease-spring-standard-fast-effects\",\n  \"[&_[data-action]:hover]:bg-primary/8\",\n  \"[&_[data-action]:focus-visible]:bg-primary/10\",\n  \"[&_[data-action]:focus-visible]:ring-2\",\n  \"[&_[data-action]:focus-visible]:ring-primary\",\n\n  // Mode toggle\n  '[&_[data-action=\"mode-toggle\"]]:text-on-surface-variant',\n  '[&_[data-action=\"mode-toggle\"]]:mr-auto',\n  '[&_[data-action=\"mode-toggle\"]]:w-12',\n  '[&_[data-action=\"mode-toggle\"]]:h-12',\n  '[&_[data-action=\"mode-toggle\"]]:flex',\n  '[&_[data-action=\"mode-toggle\"]]:items-center',\n  '[&_[data-action=\"mode-toggle\"]]:justify-center',\n  '[&_[data-action=\"mode-toggle\"]:hover]:bg-on-surface-variant/8',\n].join(\" \");\n\n/**\n * Motion-specific descendant selectors for the time picker dial.\n * Applied conditionally — omitted when `prefers-reduced-motion: reduce` is active.\n *\n * Uses legacy MD3 motion tokens for clock hand rotation (spatial transform)\n * and standard effects for focus/toggle state transitions.\n */\nexport const DIAL_MOTION_STYLES = [\n  // ── Clock hand rotation ──────────────────────────────────────────────────────\n  \"[&_[data-clock-hand-track]]:transition-transform\",\n  \"[&_[data-clock-hand-track]]:duration-medium1\",\n  \"[&_[data-clock-hand-track]]:ease-standard-decelerate\",\n\n  \"[&_[data-clock-hand]]:transition-transform\",\n  \"[&_[data-clock-hand]]:duration-medium1\",\n  \"[&_[data-clock-hand]]:ease-standard-decelerate\",\n\n  // ── Dragging suppresses transition ───────────────────────────────────────────\n  \"[&_[data-clock-dial][data-dragging]_[data-clock-hand-track]]:!transition-none\",\n  \"[&_[data-clock-dial][data-dragging]_[data-clock-hand]]:!transition-none\",\n\n  // ── Time selector focus ──────────────────────────────────────────────────────\n  \"[&_[data-time-field][data-selected]]:duration-short2\",\n  \"[&_[data-time-field][data-selected]]:ease-standard\",\n\n  // ── Period selector toggle ───────────────────────────────────────────────────\n  '[&_[data-period-selector]>[role=\"radio\"][data-selected]]:duration-short2',\n  '[&_[data-period-selector]>[role=\"radio\"][data-selected]]:ease-standard',\n\n  // ── Dial number highlight ────────────────────────────────────────────────────\n  \"[&_[data-clock-number][data-selected]]:duration-short2\",\n  \"[&_[data-clock-number][data-selected]]:ease-standard\",\n].join(\" \");\n\n/**\n * Styled TimePickerDial (Layer 3)\n *\n * Wraps the headless `TimePickerDial` with MD3 visual styling via CVA variants\n * and descendant selectors. Applies container, clock dial, time selector,\n * period selector, clock hand, and action button tokens.\n *\n * @internal\n */\nexport function TimePickerDialStyled(props: TimePickerDialProps): JSX.Element {\n  const { className, orientation = \"vertical\", ...rest } = props;\n  const reducedMotion = useReducedMotion();\n\n  return (\n    <TimePickerDial\n      {...rest}\n      orientation={orientation}\n      className={cn(\n        timePickerContainerVariants({ variant: \"dial\", orientation }),\n        DIAL_STYLES,\n        !reducedMotion && DIAL_MOTION_STYLES,\n        className\n      )}\n    />\n  );\n}\n\nTimePickerDialStyled.displayName = \"TimePickerDialStyled\";\n","\"use client\";\n\nimport { useCallback, useEffect, useRef, useState } from \"react\";\n\nimport type { TimeInputFieldProps } from \"./TimePicker.types\";\n\n/**\n * Formats a numeric value as a two-digit string with leading zero.\n */\nfunction formatValue(value: number): string {\n  return String(value).padStart(2, \"0\");\n}\n\n/**\n * Headless TimeInputField (Layer 2)\n *\n * An individual time input field with `role=\"spinbutton\"` semantics.\n * Supports direct numeric keyboard entry, Arrow Up/Down increment/decrement,\n * wrapping at boundaries, auto-advance after two digits, and validation on blur.\n *\n * This is a headless component — it provides behavior, ARIA semantics, and\n * data attributes only. No styling classes are applied.\n *\n * @internal\n */\nexport function TimeInputField({\n  field,\n  value,\n  onChange,\n  onFocus,\n  onBlur,\n  onAutoAdvance,\n  min,\n  max,\n  isDisabled = false,\n  className,\n}: TimeInputFieldProps): JSX.Element {\n  const [isFocused, setIsFocused] = useState(false);\n  const [isInvalid, setIsInvalid] = useState(false);\n  const bufferRef = useRef<string>(\"\");\n  const bufferTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n  useEffect(() => {\n    return () => {\n      if (bufferTimerRef.current !== null) {\n        clearTimeout(bufferTimerRef.current);\n      }\n    };\n  }, []);\n\n  const label = field === \"hour\" ? \"Hour\" : \"Minute\";\n\n  const clamp = useCallback((val: number): number => Math.max(min, Math.min(max, val)), [min, max]);\n\n  const commitBuffer = useCallback(() => {\n    const buffer = bufferRef.current;\n    if (buffer.length > 0) {\n      const parsed = parseInt(buffer, 10);\n      const clamped = clamp(parsed);\n      onChange(clamped);\n      setIsInvalid(parsed < min || parsed > max);\n      bufferRef.current = \"\";\n    }\n  }, [clamp, min, max, onChange]);\n\n  const handleKeyDown = useCallback(\n    (e: React.KeyboardEvent) => {\n      if (isDisabled) return;\n\n      if (e.key === \"ArrowUp\") {\n        e.preventDefault();\n        bufferRef.current = \"\";\n        const next = value >= max ? min : value + 1;\n        onChange(next);\n        setIsInvalid(false);\n      } else if (e.key === \"ArrowDown\") {\n        e.preventDefault();\n        bufferRef.current = \"\";\n        const next = value <= min ? max : value - 1;\n        onChange(next);\n        setIsInvalid(false);\n      } else if (/^[0-9]$/.test(e.key)) {\n        e.preventDefault();\n        if (bufferTimerRef.current !== null) {\n          clearTimeout(bufferTimerRef.current);\n        }\n\n        bufferRef.current += e.key;\n        const parsed = parseInt(bufferRef.current, 10);\n\n        if (bufferRef.current.length >= 2) {\n          const clamped = clamp(parsed);\n          onChange(clamped);\n          setIsInvalid(parsed < min || parsed > max);\n          bufferRef.current = \"\";\n          onAutoAdvance?.();\n        } else {\n          onChange(parsed);\n          setIsInvalid(false);\n          bufferTimerRef.current = setTimeout(() => {\n            commitBuffer();\n          }, 1000);\n        }\n      }\n    },\n    [isDisabled, value, min, max, onChange, onAutoAdvance, clamp, commitBuffer]\n  );\n\n  const handleFocus = useCallback(() => {\n    if (isDisabled) return;\n    setIsFocused(true);\n    bufferRef.current = \"\";\n    onFocus?.();\n  }, [isDisabled, onFocus]);\n\n  const handleBlur = useCallback(() => {\n    setIsFocused(false);\n    commitBuffer();\n    const clamped = clamp(value);\n    if (clamped !== value) {\n      onChange(clamped);\n    }\n    setIsInvalid(value < min || value > max);\n    onBlur?.();\n  }, [value, min, max, clamp, onChange, commitBuffer, onBlur]);\n\n  return (\n    <div\n      role=\"spinbutton\"\n      tabIndex={isDisabled ? -1 : 0}\n      aria-label={label}\n      aria-valuenow={value}\n      aria-valuemin={min}\n      aria-valuemax={max}\n      aria-disabled={isDisabled || undefined}\n      aria-invalid={isInvalid || undefined}\n      className={className}\n      data-time-input-field={field}\n      {...(isFocused ? { \"data-focused\": \"\" } : {})}\n      {...(isInvalid ? { \"data-invalid\": \"\" } : {})}\n      onKeyDown={handleKeyDown}\n      onFocus={handleFocus}\n      onBlur={handleBlur}\n    >\n      <span data-value>{formatValue(value)}</span>\n      <span data-supporting-text>{label}</span>\n    </div>\n  );\n}\n\nTimeInputField.displayName = \"TimeInputField\";\n","\"use client\";\n\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { useButton } from \"react-aria\";\n\nimport { TimeInputField } from \"./TimeInputField\";\nimport { PeriodSelector } from \"./PeriodSelector\";\n\nimport type { TimePeriod, TimePickerInputProps, TimeValue } from \"./TimePicker.types\";\n\n/**\n * Converts 12h display hour + period into internal 0-23 hour.\n */\nfunction to24Hour(displayHour: number, period: TimePeriod): number {\n  if (period === \"AM\") {\n    return displayHour === 12 ? 0 : displayHour;\n  }\n  return displayHour === 12 ? 12 : displayHour + 12;\n}\n\n/**\n * Extracts the 12h display hour and period from a 0-23 hour value.\n */\nfunction from24Hour(hour24: number): { displayHour: number; period: TimePeriod } {\n  const period: TimePeriod = hour24 >= 12 ? \"PM\" : \"AM\";\n  const displayHour = hour24 % 12 === 0 ? 12 : hour24 % 12;\n  return { displayHour, period };\n}\n\n/**\n * Headless TimePickerInput (Layer 2)\n *\n * Orchestrates the full time picker input (keyboard-entry) experience:\n * - Headline (\"Enter time\")\n * - Two large input fields (hour/minute) with spin button behavior\n * - Separator colon \":\"\n * - Period selector (AM/PM) for 12-hour format\n * - Action buttons (Cancel / OK)\n * - Mode toggle (switch to clock dial)\n *\n * Key behaviors:\n * - Direct numeric keyboard input (0-9)\n * - Arrow Up/Down to increment/decrement\n * - Auto-advance from hour to minute after two digits typed\n * - Validation on blur (clamp to valid range)\n * - Tab order: hour → minute → period → action buttons\n *\n * This is a headless component — it provides behavior, ARIA semantics, and\n * data attributes only. No styling classes are applied.\n *\n * @example\n * ```tsx\n * <TimePickerInput\n *   hourCycle={12}\n *   defaultValue={{ hour: 7, minute: 0 }}\n *   onConfirm={(time) => console.log(time)}\n * />\n * ```\n */\nexport function TimePickerInput({\n  hourCycle = 12,\n  value,\n  defaultValue,\n  onChange,\n  isDisabled = false,\n  headline = \"Enter time\",\n  cancelLabel = \"Cancel\",\n  confirmLabel = \"OK\",\n  onCancel,\n  onConfirm,\n  onModeToggle,\n  className,\n}: TimePickerInputProps): JSX.Element {\n  const resolvedDefault = defaultValue ?? { hour: 0, minute: 0 };\n\n  const [internalTime, setInternalTime] = useState<TimeValue>(value ?? resolvedDefault);\n  const [period, setPeriod] = useState<TimePeriod>(\n    () => from24Hour((value ?? resolvedDefault).hour).period\n  );\n  const minuteFieldRef = useRef<HTMLDivElement>(null);\n  const initialTimeRef = useRef<TimeValue>(value ?? resolvedDefault);\n\n  useEffect(() => {\n    if (value !== undefined && value !== null) {\n      setInternalTime(value);\n      setPeriod(from24Hour(value.hour).period);\n    }\n  }, [value]);\n\n  // ── Derived values ─────────────────────────────────────────────────────────\n\n  const hour24 = internalTime.hour;\n  const displayHour = hourCycle === 12 ? from24Hour(hour24).displayHour : hour24;\n\n  const hourMin = hourCycle === 24 ? 0 : 1;\n  const hourMax = hourCycle === 24 ? 23 : 12;\n\n  // ── Handlers ───────────────────────────────────────────────────────────────\n\n  const updateTime = useCallback(\n    (newTime: TimeValue) => {\n      setInternalTime(newTime);\n      onChange?.(newTime);\n    },\n    [onChange]\n  );\n\n  const handleHourChange = useCallback(\n    (newDisplayHour: number) => {\n      let hour: number;\n      if (hourCycle === 12) {\n        hour = to24Hour(newDisplayHour, period);\n      } else {\n        hour = newDisplayHour;\n      }\n      updateTime({ ...internalTime, hour });\n    },\n    [hourCycle, period, internalTime, updateTime]\n  );\n\n  const handleMinuteChange = useCallback(\n    (newMinute: number) => {\n      updateTime({ ...internalTime, minute: newMinute });\n    },\n    [internalTime, updateTime]\n  );\n\n  const handlePeriodChange = useCallback(\n    (newPeriod: TimePeriod) => {\n      setPeriod(newPeriod);\n      const { displayHour: dh } = from24Hour(internalTime.hour);\n      const newHour = to24Hour(dh, newPeriod);\n      updateTime({ ...internalTime, hour: newHour });\n    },\n    [internalTime, updateTime]\n  );\n\n  const handleHourAutoAdvance = useCallback(() => {\n    const minuteEl = minuteFieldRef.current?.querySelector(\n      '[data-time-input-field=\"minute\"]'\n    ) as HTMLElement | null;\n    if (minuteEl) {\n      minuteEl.focus();\n    } else {\n      const parent = minuteFieldRef.current;\n      if (parent) {\n        parent.focus();\n      }\n    }\n  }, []);\n\n  const handleConfirm = useCallback(() => {\n    onConfirm?.(internalTime);\n  }, [internalTime, onConfirm]);\n\n  const handleCancel = useCallback(() => {\n    if (value === undefined || value === null) {\n      setInternalTime(initialTimeRef.current);\n    }\n    onCancel?.();\n  }, [value, onCancel]);\n\n  // ── Button refs & props ────────────────────────────────────────────────────\n\n  const cancelRef = useRef<HTMLButtonElement>(null);\n  const confirmRef = useRef<HTMLButtonElement>(null);\n  const modeToggleRef = useRef<HTMLButtonElement>(null);\n\n  const { buttonProps: cancelButtonProps } = useButton(\n    {\n      \"aria-label\": cancelLabel,\n      isDisabled,\n      ...(onCancel ? { onPress: handleCancel } : {}),\n    },\n    cancelRef\n  );\n\n  const { buttonProps: confirmButtonProps } = useButton(\n    {\n      \"aria-label\": confirmLabel,\n      isDisabled,\n      ...(onConfirm ? { onPress: handleConfirm } : {}),\n    },\n    confirmRef\n  );\n\n  const { buttonProps: modeToggleButtonProps } = useButton(\n    {\n      \"aria-label\": \"Switch to clock dial\",\n      isDisabled,\n      ...(onModeToggle ? { onPress: onModeToggle } : {}),\n    },\n    modeToggleRef\n  );\n\n  // ── aria-live announcement ──────────────────────────────────────────────────\n\n  const [announcement, setAnnouncement] = useState(\"\");\n\n  useEffect(() => {\n    const h = displayHour;\n    const m = internalTime.minute;\n    const periodStr = hourCycle === 12 ? ` ${period}` : \"\";\n    setAnnouncement(`${h}:${String(m).padStart(2, \"0\")}${periodStr}`);\n  }, [internalTime, period, hourCycle, displayHour]);\n\n  // ── Render ─────────────────────────────────────────────────────────────────\n\n  return (\n    <div\n      className={className}\n      data-variant=\"input\"\n      {...(isDisabled ? { \"data-disabled\": \"\" } : {})}\n    >\n      <div data-headline>{headline}</div>\n\n      <div data-input-row>\n        <TimeInputField\n          field=\"hour\"\n          value={displayHour}\n          onChange={handleHourChange}\n          onAutoAdvance={handleHourAutoAdvance}\n          min={hourMin}\n          max={hourMax}\n          isDisabled={isDisabled}\n        />\n\n        <span data-time-separator aria-hidden=\"true\">\n          :\n        </span>\n\n        <div ref={minuteFieldRef}>\n          <TimeInputField\n            field=\"minute\"\n            value={internalTime.minute}\n            onChange={handleMinuteChange}\n            min={0}\n            max={59}\n            isDisabled={isDisabled}\n          />\n        </div>\n\n        {hourCycle === 12 && (\n          <PeriodSelector\n            value={period}\n            onChange={handlePeriodChange}\n            orientation=\"vertical\"\n            isDisabled={isDisabled}\n          />\n        )}\n      </div>\n\n      <div data-actions>\n        <button\n          {...modeToggleButtonProps}\n          ref={modeToggleRef}\n          type=\"button\"\n          data-action=\"mode-toggle\"\n        >\n          🕐\n        </button>\n        <button {...cancelButtonProps} ref={cancelRef} type=\"button\" data-action=\"cancel\">\n          {cancelLabel}\n        </button>\n        <button {...confirmButtonProps} ref={confirmRef} type=\"button\" data-action=\"confirm\">\n          {confirmLabel}\n        </button>\n      </div>\n\n      <div\n        aria-live=\"polite\"\n        aria-atomic=\"true\"\n        data-live-region\n        style={{\n          position: \"absolute\",\n          width: \"1px\",\n          height: \"1px\",\n          padding: 0,\n          margin: \"-1px\",\n          overflow: \"hidden\",\n          clip: \"rect(0, 0, 0, 0)\",\n          whiteSpace: \"nowrap\",\n          borderWidth: 0,\n        }}\n      >\n        {announcement}\n      </div>\n    </div>\n  );\n}\n\nTimePickerInput.displayName = \"TimePickerInput\";\n","\"use client\";\n\nimport { useReducedMotion } from \"../../hooks/useReducedMotion\";\nimport { cn } from \"../../utils/cn\";\nimport { TimePickerInput } from \"./TimePickerInput\";\nimport { timePickerContainerVariants } from \"./TimePicker.variants\";\n\nimport type { TimePickerInputProps } from \"./TimePicker.types\";\n\n/**\n * Tailwind descendant selectors for styling the headless TimePickerInput elements.\n * Each selector targets internal sub-components by their data attributes.\n */\nconst INPUT_STYLES = [\n  // ── Headline ──────────────────────────────────────────────────────────────────\n  \"[&_[data-headline]]:text-label-medium\",\n  \"[&_[data-headline]]:text-on-surface-variant\",\n  \"[&_[data-headline]]:mb-4\",\n\n  // ── Input row ─────────────────────────────────────────────────────────────────\n  \"[&_[data-input-row]]:flex\",\n  \"[&_[data-input-row]]:items-center\",\n\n  // Time input fields\n  \"[&_[data-time-input-field]]:w-[96px]\",\n  \"[&_[data-time-input-field]]:h-[72px]\",\n  \"[&_[data-time-input-field]]:rounded-lg\",\n  \"[&_[data-time-input-field]]:flex\",\n  \"[&_[data-time-input-field]]:flex-col\",\n  \"[&_[data-time-input-field]]:items-center\",\n  \"[&_[data-time-input-field]]:justify-center\",\n  \"[&_[data-time-input-field]]:cursor-text\",\n  \"[&_[data-time-input-field]]:transition-colors\",\n  \"[&_[data-time-input-field]]:duration-spring-standard-fast-effects\",\n  \"[&_[data-time-input-field]]:ease-spring-standard-fast-effects\",\n  \"[&_[data-time-input-field]]:bg-surface-container-highest\",\n  \"[&_[data-time-input-field]]:text-on-surface\",\n\n  // Input field value text\n  \"[&_[data-time-input-field]_[data-value]]:text-display-large\",\n\n  // Input field supporting text\n  \"[&_[data-time-input-field]_[data-supporting-text]]:text-body-small\",\n  \"[&_[data-time-input-field]_[data-supporting-text]]:text-on-surface-variant\",\n\n  // Focused state (selected)\n  \"[&_[data-time-input-field][data-focused]]:bg-primary-container\",\n  \"[&_[data-time-input-field][data-focused]]:text-on-primary-container\",\n  \"[&_[data-time-input-field][data-focused]]:border-2\",\n  \"[&_[data-time-input-field][data-focused]]:border-primary\",\n\n  // Focus-visible ring\n  \"[&_[data-time-input-field]:focus-visible]:ring-2\",\n  \"[&_[data-time-input-field]:focus-visible]:ring-primary\",\n\n  // Separator colon\n  \"[&_[data-time-separator]]:text-display-large\",\n  \"[&_[data-time-separator]]:text-on-surface\",\n  \"[&_[data-time-separator]]:select-none\",\n  \"[&_[data-time-separator]]:px-1\",\n\n  // ── Period selector ───────────────────────────────────────────────────────────\n  \"[&_[data-period-selector]]:rounded-lg\",\n  \"[&_[data-period-selector]]:border\",\n  \"[&_[data-period-selector]]:border-outline\",\n  \"[&_[data-period-selector]]:overflow-hidden\",\n  \"[&_[data-period-selector]]:flex\",\n  '[&_[data-period-selector][data-orientation=\"vertical\"]]:w-[52px]',\n  '[&_[data-period-selector][data-orientation=\"vertical\"]]:h-[80px]',\n  '[&_[data-period-selector][data-orientation=\"vertical\"]]:flex-col',\n  \"[&_[data-period-selector]]:ml-3\",\n\n  // Period items (AM/PM)\n  '[&_[data-period-selector]>[role=\"radio\"]]:flex-1',\n  '[&_[data-period-selector]>[role=\"radio\"]]:flex',\n  '[&_[data-period-selector]>[role=\"radio\"]]:items-center',\n  '[&_[data-period-selector]>[role=\"radio\"]]:justify-center',\n  '[&_[data-period-selector]>[role=\"radio\"]]:text-title-medium',\n  '[&_[data-period-selector]>[role=\"radio\"]]:cursor-pointer',\n  '[&_[data-period-selector]>[role=\"radio\"]]:border-outline',\n  '[&_[data-period-selector]>[role=\"radio\"]]:transition-colors',\n  '[&_[data-period-selector]>[role=\"radio\"]]:duration-spring-standard-fast-effects',\n  '[&_[data-period-selector]>[role=\"radio\"]]:ease-spring-standard-fast-effects',\n  '[&_[data-period-selector]>[role=\"radio\"]]:text-on-surface-variant',\n  '[&_[data-period-selector]>[role=\"radio\"][data-selected]]:bg-tertiary-container',\n  '[&_[data-period-selector]>[role=\"radio\"][data-selected]]:text-on-tertiary-container',\n  '[&_[data-period-selector]>[role=\"radio\"][data-selected]]:border-transparent',\n  '[&_[data-period-selector]>[role=\"radio\"]:not([data-selected]):hover]:bg-on-surface-variant/8',\n  '[&_[data-period-selector]>[role=\"radio\"][data-focus-visible]]:ring-2',\n  '[&_[data-period-selector]>[role=\"radio\"][data-focus-visible]]:ring-primary',\n\n  // ── Actions ───────────────────────────────────────────────────────────────────\n  \"[&_[data-actions]]:flex\",\n  \"[&_[data-actions]]:items-center\",\n  \"[&_[data-actions]]:justify-end\",\n  \"[&_[data-actions]]:gap-2\",\n  \"[&_[data-actions]]:mt-4\",\n\n  \"[&_[data-action]]:text-primary\",\n  \"[&_[data-action]]:text-label-large\",\n  \"[&_[data-action]]:rounded-full\",\n  \"[&_[data-action]]:px-3\",\n  \"[&_[data-action]]:py-2\",\n  \"[&_[data-action]]:min-h-12\",\n  \"[&_[data-action]]:transition-colors\",\n  \"[&_[data-action]]:duration-spring-standard-fast-effects\",\n  \"[&_[data-action]]:ease-spring-standard-fast-effects\",\n  \"[&_[data-action]:hover]:bg-primary/8\",\n  \"[&_[data-action]:focus-visible]:bg-primary/10\",\n  \"[&_[data-action]:focus-visible]:ring-2\",\n  \"[&_[data-action]:focus-visible]:ring-primary\",\n\n  // Mode toggle\n  '[&_[data-action=\"mode-toggle\"]]:text-on-surface-variant',\n  '[&_[data-action=\"mode-toggle\"]]:mr-auto',\n  '[&_[data-action=\"mode-toggle\"]]:w-12',\n  '[&_[data-action=\"mode-toggle\"]]:h-12',\n  '[&_[data-action=\"mode-toggle\"]]:flex',\n  '[&_[data-action=\"mode-toggle\"]]:items-center',\n  '[&_[data-action=\"mode-toggle\"]]:justify-center',\n  '[&_[data-action=\"mode-toggle\"]:hover]:bg-on-surface-variant/8',\n].join(\" \");\n\n/**\n * Motion-specific descendant selectors for the time picker input variant.\n * Applied conditionally — omitted when `prefers-reduced-motion: reduce` is active.\n */\nexport const INPUT_MOTION_STYLES = [\n  // ── Time input field focus ───────────────────────────────────────────────────\n  \"[&_[data-time-input-field][data-focused]]:duration-short2\",\n  \"[&_[data-time-input-field][data-focused]]:ease-standard\",\n\n  // ── Period selector toggle ───────────────────────────────────────────────────\n  '[&_[data-period-selector]>[role=\"radio\"][data-selected]]:duration-short2',\n  '[&_[data-period-selector]>[role=\"radio\"][data-selected]]:ease-standard',\n].join(\" \");\n\n/**\n * Styled TimePickerInput (Layer 3)\n *\n * Wraps the headless `TimePickerInput` with MD3 visual styling via CVA variants\n * and descendant selectors. Applies container, time input fields, separator,\n * period selector, and action button tokens.\n *\n * @internal\n */\nexport function TimePickerInputStyled(props: TimePickerInputProps): JSX.Element {\n  const { className, ...rest } = props;\n  const reducedMotion = useReducedMotion();\n\n  return (\n    <TimePickerInput\n      {...rest}\n      className={cn(\n        timePickerContainerVariants({ variant: \"input\", orientation: \"vertical\" }),\n        INPUT_STYLES,\n        !reducedMotion && INPUT_MOTION_STYLES,\n        className\n      )}\n    />\n  );\n}\n\nTimePickerInputStyled.displayName = \"TimePickerInputStyled\";\n","\"use client\";\n\nimport { TimePickerDialStyled } from \"./TimePickerDialStyled\";\nimport { TimePickerInputStyled } from \"./TimePickerInputStyled\";\n\nimport type { TimePickerProps } from \"./TimePicker.types\";\n\n/**\n * `TimePicker` — Layer 3 MD3 Styled Time Picker Component.\n *\n * Routes to the correct styled variant based on the `variant` prop:\n *\n * - **`dial`** (default): Circular clock face for selecting hours/minutes (touch-friendly).\n *   Uses `TimePickerDialStyled` wrapping `TimePickerDial` headless component.\n *\n * - **`input`**: Text fields for manual time entry (accessibility-first, keyboard-optimized).\n *   Uses `TimePickerInputStyled` wrapping `TimePickerInput` headless component.\n *\n * All variants follow MD3 specifications:\n * - `bg-surface-container-high` container background\n * - `rounded-3xl` (28dp) corner radius\n * - `p-6` (24dp) padding\n * - MD3 color tokens for all interactive states\n * - MD3 typography tokens (display-large, label-medium, title-medium, body-large)\n * - Spring-based standard motion tokens for state transitions\n *\n * @example\n * ```tsx\n * // Dial time picker (default, 12-hour)\n * <TimePicker label=\"Alarm time\" hourCycle={12} onConfirm={setTime} />\n *\n * // Input time picker (24-hour)\n * <TimePicker variant=\"input\" hourCycle={24} label=\"Meeting time\" onConfirm={setTime} />\n *\n * // Horizontal layout\n * <TimePicker orientation=\"horizontal\" label=\"Departure time\" />\n * ```\n *\n * @see https://m3.material.io/components/time-pickers/overview\n */\nexport function TimePicker(props: TimePickerProps): JSX.Element {\n  const { variant = \"dial\", ...rest } = props;\n\n  switch (variant) {\n    case \"input\":\n      return <TimePickerInputStyled {...mapToInputProps(rest)} />;\n    default:\n      return <TimePickerDialStyled {...mapToDialProps(rest)} />;\n  }\n}\n\nTimePicker.displayName = \"TimePicker\";\n\n/**\n * Maps TimePickerProps (minus variant) to TimePickerDialProps.\n */\nfunction mapToDialProps(props: Omit<TimePickerProps, \"variant\">): Omit<TimePickerProps, \"variant\"> {\n  return props;\n}\n\n/**\n * Maps TimePickerProps (minus variant) to TimePickerInputProps.\n */\nfunction mapToInputProps(\n  props: Omit<TimePickerProps, \"variant\">\n): Omit<TimePickerProps, \"variant\"> {\n  const { orientation: _orientation, minuteStep: _minuteStep, ...inputProps } = props;\n\n  return inputProps;\n}\n","\"use client\";\n\nimport { useRef } from \"react\";\nimport { mergeProps, useCalendarCell, useFocusRing, useHover, usePress } from \"react-aria\";\nimport { isSameDay, today, getLocalTimeZone } from \"@internationalized/date\";\n\nimport type { CalendarDate } from \"@internationalized/date\";\nimport type { CalendarState, RangeCalendarState } from \"react-stately\";\n\n/**\n * Internal props for the CalendarCell headless component.\n * @internal\n */\ninterface CalendarCellInternalProps {\n  /** The date this cell represents */\n  date: CalendarDate;\n  /** Calendar state from React Aria / React Stately */\n  state: CalendarState | RangeCalendarState;\n  /** Optional CSS class applied to the inner button div */\n  className?: string;\n  /** Optional children rendered inside the cell (e.g. state layer, focus ring) */\n  children?: React.ReactNode;\n}\n\n/**\n * Headless CalendarCell (Layer 2)\n *\n * Renders a single date cell within the calendar grid using React Aria's\n * `useCalendarCell` for accessibility and keyboard interaction.\n *\n * Emits presence-based data attributes consumed by the styled layer:\n * - `data-selected`     — date is selected\n * - `data-today`        — date is today\n * - `data-outside-month` — date is from an adjacent month\n * - `data-range-start`  — date is the start of a selected range\n * - `data-range-end`    — date is the end of a selected range\n * - `data-range-middle` — date is between range start and end\n * - `data-disabled`     — date is disabled\n * - `data-unavailable`  — date is unavailable\n * - `data-focus-visible` — keyboard focus ring should be shown\n * - `data-hovered`      — pointer is over the cell\n * - `data-pressed`      — cell is being pressed\n *\n * Accepts `className` and `children` for the styled layer to inject\n * CVA classes and state-layer / focus-ring overlay elements.\n *\n * @internal\n */\nexport function CalendarCell({\n  date,\n  state,\n  className,\n  children,\n}: CalendarCellInternalProps): JSX.Element {\n  const ref = useRef<HTMLDivElement>(null);\n\n  const { cellProps, buttonProps, isSelected, isDisabled, isUnavailable, formattedDate } =\n    useCalendarCell({ date }, state, ref);\n\n  const { focusProps, isFocusVisible } = useFocusRing();\n  const { hoverProps, isHovered } = useHover({ isDisabled: isDisabled || isUnavailable });\n  const { pressProps, isPressed } = usePress({ isDisabled: isDisabled || isUnavailable });\n\n  const isCurrentDay = isSameDay(date, today(getLocalTimeZone()));\n  const isOutsideMonth =\n    date.month !== state.visibleRange.start.month || date.year !== state.visibleRange.start.year;\n\n  let isRangeStart = false;\n  let isRangeEnd = false;\n  let isRangeMiddle = false;\n\n  if (\"highlightedRange\" in state && state.highlightedRange) {\n    const range = state.highlightedRange;\n    isRangeStart = isSameDay(date, range.start);\n    isRangeEnd = isSameDay(date, range.end);\n    isRangeMiddle = date.compare(range.start) > 0 && date.compare(range.end) < 0;\n  }\n\n  return (\n    <td {...cellProps}>\n      <div\n        {...mergeProps(buttonProps, focusProps, hoverProps, pressProps)}\n        ref={ref}\n        className={className}\n        aria-current={isCurrentDay ? (\"date\" as const) : undefined}\n        data-selected={isSelected ? \"\" : undefined}\n        data-today={isCurrentDay ? \"\" : undefined}\n        data-outside-month={isOutsideMonth ? \"\" : undefined}\n        data-range-start={isRangeStart ? \"\" : undefined}\n        data-range-end={isRangeEnd ? \"\" : undefined}\n        data-range-middle={isRangeMiddle ? \"\" : undefined}\n        data-disabled={isDisabled ? \"\" : undefined}\n        data-unavailable={isUnavailable ? \"\" : undefined}\n        data-focus-visible={isFocusVisible ? \"\" : undefined}\n        data-hovered={isHovered ? \"\" : undefined}\n        data-pressed={isPressed ? \"\" : undefined}\n      >\n        {/* Always render the date text so it's visible in both headless and styled usage */}\n        <span className=\"pointer-events-none relative z-10\">{formattedDate}</span>\n        {/* Overlay slots (state layer, focus ring) — only rendered when children provided */}\n        {children}\n      </div>\n    </td>\n  );\n}\n\nCalendarCell.displayName = \"CalendarCell\";\n","\"use client\";\n\nimport { useCalendarGrid, useLocale } from \"react-aria\";\nimport { getWeeksInMonth } from \"@internationalized/date\";\n\nimport { CalendarCell } from \"./CalendarCell\";\n\nimport type { CalendarDate } from \"@internationalized/date\";\nimport type { CalendarState, RangeCalendarState } from \"react-stately\";\n\n/**\n * Slot component type for rendering an individual calendar date cell.\n * Defaults to the headless `CalendarCell`.\n */\nexport interface CalendarCellComponentProps {\n  date: CalendarDate;\n  state: CalendarState | RangeCalendarState;\n}\n\n/**\n * Internal props for the CalendarGrid headless component.\n * @internal\n */\ninterface CalendarGridInternalProps {\n  /** Calendar state from React Aria / React Stately */\n  state: CalendarState | RangeCalendarState;\n  /** First day of the week in React Aria string format */\n  firstDayOfWeek?: \"sun\" | \"mon\" | \"tue\" | \"wed\" | \"thu\" | \"fri\" | \"sat\" | undefined;\n  /**\n   * Optional slot component for rendering each date cell.\n   * Defaults to the headless `CalendarCell`.\n   * Pass a styled component to inject CVA classes and state layers.\n   */\n  CellComponent?: React.ComponentType<CalendarCellComponentProps>;\n  /**\n   * Optional slot component for rendering weekday column headers.\n   * Receives the formatted weekday label string.\n   */\n  WeekdayComponent?: React.ComponentType<{ label: string }>;\n}\n\n/**\n * Headless CalendarGrid (Layer 2)\n *\n * Renders the calendar grid structure using React Aria's `useCalendarGrid`.\n * Produces a `<table>` with `role=\"grid\"`, weekday column headers, and\n * week rows containing cell components.\n *\n * The `CellComponent` and `WeekdayComponent` slots allow the styled layer to\n * inject fully-styled sub-components without touching the headless layer.\n *\n * @internal\n */\nexport function CalendarGrid({\n  state,\n  firstDayOfWeek,\n  CellComponent = CalendarCell,\n  WeekdayComponent,\n}: CalendarGridInternalProps): JSX.Element {\n  const { locale } = useLocale();\n\n  const gridOptions = firstDayOfWeek ? { firstDayOfWeek } : {};\n  const { gridProps, headerProps, weekDays } = useCalendarGrid(gridOptions, state);\n\n  const weeksInMonth = getWeeksInMonth(\n    state.visibleRange.start,\n    locale,\n    firstDayOfWeek ?? undefined\n  );\n\n  return (\n    <table {...gridProps}>\n      <thead {...headerProps} aria-hidden={undefined}>\n        <tr>\n          {weekDays.map((day, index) =>\n            WeekdayComponent ? (\n              <th key={index} role=\"columnheader\">\n                <WeekdayComponent label={day} />\n              </th>\n            ) : (\n              <th key={index} role=\"columnheader\">\n                {day}\n              </th>\n            )\n          )}\n        </tr>\n      </thead>\n      <tbody>\n        {[...new Array(weeksInMonth).keys()].map((weekIndex) => (\n          <tr key={weekIndex}>\n            {state\n              .getDatesInWeek(weekIndex)\n              .map((date, i) =>\n                date ? <CellComponent key={i} state={state} date={date} /> : <td key={i} />\n              )}\n          </tr>\n        ))}\n      </tbody>\n    </table>\n  );\n}\n\nCalendarGrid.displayName = \"CalendarGrid\";\n","\"use client\";\n\nimport type React from \"react\";\nimport { useRef } from \"react\";\nimport { useButton } from \"react-aria\";\n\nimport type { PressEvent } from \"react-aria\";\n\n/**\n * Internal props for a calendar navigation button.\n * Matches the subset of AriaButtonProps returned by useCalendar.\n * @internal\n */\ninterface CalendarNavigationButtonProps {\n  /** Accessible label for the button */\n  \"aria-label\"?: string | undefined;\n  /** Handler called when the button is pressed */\n  onPress?: ((e: PressEvent) => void) | undefined;\n  /** Whether the button is disabled */\n  isDisabled?: boolean | undefined;\n}\n\n/**\n * Props for a slot navigation button component.\n * Receives all CalendarNavigationButtonProps plus children (the icon).\n */\nexport interface NavButtonComponentProps extends CalendarNavigationButtonProps {\n  children?: React.ReactNode;\n}\n\n/**\n * Props for a slot title component.\n */\nexport interface TitleComponentProps {\n  /** The formatted title string (e.g., \"August 2025\") */\n  title: string;\n  /** Handler when the title is clicked to toggle year view */\n  onClick?: (() => void) | undefined;\n  /** Whether to show the dropdown indicator */\n  showDropdownIndicator?: boolean | undefined;\n}\n\n/**\n * Internal props for the CalendarHeader headless component.\n * @internal\n */\ninterface CalendarHeaderProps {\n  /** Formatted title (e.g., \"August 2025\") */\n  title: string;\n  /** Props for the previous month navigation button */\n  prevButtonProps: CalendarNavigationButtonProps;\n  /** Props for the next month navigation button */\n  nextButtonProps: CalendarNavigationButtonProps;\n  /** Called when the title is clicked (to toggle year selection view) */\n  onTitleClick?: () => void;\n  /** Whether to show the dropdown indicator on the title */\n  showDropdownIndicator?: boolean;\n  /**\n   * Optional slot component for rendering each nav button.\n   * Defaults to the built-in unstyled NavigationButton.\n   */\n  NavButtonComponent?: React.ComponentType<NavButtonComponentProps>;\n  /**\n   * Optional slot component for rendering the title.\n   * Defaults to the built-in unstyled title div/button.\n   */\n  TitleComponent?: React.ComponentType<TitleComponentProps>;\n}\n\n/**\n * Navigation button using React Aria's `useButton` for accessibility.\n * Default unstyled implementation.\n * @internal\n */\nfunction NavigationButton({\n  children,\n  isDisabled,\n  onPress,\n  \"aria-label\": ariaLabel,\n}: NavButtonComponentProps): JSX.Element {\n  const ref = useRef<HTMLButtonElement>(null);\n  const { buttonProps } = useButton(\n    {\n      isDisabled: isDisabled ?? false,\n      ...(onPress ? { onPress } : {}),\n      ...(ariaLabel ? { \"aria-label\": ariaLabel } : {}),\n    },\n    ref\n  );\n\n  return (\n    <button {...buttonProps} ref={ref} type=\"button\" data-nav-button>\n      {children}\n    </button>\n  );\n}\n\n/**\n * Chevron left SVG icon for previous month navigation.\n * @internal\n */\nfunction ChevronLeftIcon(): JSX.Element {\n  return (\n    <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\">\n      <path d=\"M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z\" />\n    </svg>\n  );\n}\n\n/**\n * Chevron right SVG icon for next month navigation.\n * @internal\n */\nfunction ChevronRightIcon(): JSX.Element {\n  return (\n    <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\">\n      <path d=\"M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z\" />\n    </svg>\n  );\n}\n\n/**\n * Dropdown arrow SVG icon for year selection toggle.\n * @internal\n */\nexport function DropdownArrowIcon(): JSX.Element {\n  return (\n    <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\">\n      <path d=\"M7 10l5 5 5-5z\" />\n    </svg>\n  );\n}\n\n/**\n * Default unstyled title renderer.\n * @internal\n */\nfunction DefaultTitle({ title, onClick, showDropdownIndicator }: TitleComponentProps): JSX.Element {\n  if (onClick) {\n    return (\n      <button\n        type=\"button\"\n        onClick={onClick}\n        data-calendar-title\n        aria-label={`${title}, click to select year`}\n      >\n        <h2 aria-live=\"polite\">{title}</h2>\n        {showDropdownIndicator && <DropdownArrowIcon />}\n      </button>\n    );\n  }\n  return (\n    <div data-calendar-title>\n      <h2 aria-live=\"polite\">{title}</h2>\n    </div>\n  );\n}\n\n/**\n * Headless CalendarHeader (Layer 2)\n *\n * Renders month/year navigation controls with proper ARIA semantics.\n * Includes previous/next month buttons and an `aria-live=\"polite\"` heading\n * for screen reader announcements of month changes.\n *\n * The `NavButtonComponent` and `TitleComponent` slots allow the styled layer\n * to inject CVA-styled navigation buttons and the title pill without touching\n * this headless layer.\n *\n * @internal\n */\nexport function CalendarHeader({\n  title,\n  prevButtonProps,\n  nextButtonProps,\n  onTitleClick,\n  showDropdownIndicator = false,\n  NavButtonComponent = NavigationButton,\n  TitleComponent = DefaultTitle,\n}: CalendarHeaderProps): JSX.Element {\n  const enhancedPrevProps: CalendarNavigationButtonProps = {\n    ...prevButtonProps,\n    \"aria-label\": \"Previous month\",\n  };\n\n  const enhancedNextProps: CalendarNavigationButtonProps = {\n    ...nextButtonProps,\n    \"aria-label\": \"Next month\",\n  };\n\n  return (\n    <div data-calendar-header>\n      <TitleComponent\n        title={title}\n        onClick={onTitleClick}\n        showDropdownIndicator={showDropdownIndicator}\n      />\n      <div data-calendar-nav>\n        <NavButtonComponent {...enhancedPrevProps}>\n          <ChevronLeftIcon />\n        </NavButtonComponent>\n        <NavButtonComponent {...enhancedNextProps}>\n          <ChevronRightIcon />\n        </NavButtonComponent>\n      </div>\n    </div>\n  );\n}\n\nCalendarHeader.displayName = \"CalendarHeader\";\n","\"use client\";\n\nimport type React from \"react\";\nimport { forwardRef, useRef, useState } from \"react\";\nimport { useCalendar, useRangeCalendar, useLocale } from \"react-aria\";\nimport { useCalendarState, useRangeCalendarState } from \"react-stately\";\nimport { createCalendar } from \"@internationalized/date\";\n\nimport { CalendarGrid } from \"./CalendarGrid\";\nimport { CalendarHeader } from \"./CalendarHeader\";\n\nimport type { DateValue } from \"@internationalized/date\";\nimport type { CalendarView, DateSelectionMode } from \"./DatePicker.types\";\nimport type { CalendarCellComponentProps } from \"./CalendarGrid\";\nimport type { NavButtonComponentProps, TitleComponentProps } from \"./CalendarHeader\";\n\nconst FIRST_DAY_MAP: Record<number, \"sun\" | \"mon\" | \"tue\" | \"wed\" | \"thu\" | \"fri\" | \"sat\"> = {\n  0: \"sun\",\n  1: \"mon\",\n  2: \"tue\",\n  3: \"wed\",\n  4: \"thu\",\n  5: \"fri\",\n  6: \"sat\",\n};\n\nconst YEAR_RANGE_OFFSET = 50;\n\n/**\n * Slot component overrides for the calendar.\n * Pass styled components from Layer 3 to inject CVA + state layers without\n * modifying the headless behavior.\n */\nexport interface CalendarSlots {\n  /**\n   * Component for rendering each date cell.\n   * Defaults to the headless `CalendarCell`.\n   */\n  CellComponent?: React.ComponentType<CalendarCellComponentProps>;\n  /**\n   * Component for rendering navigation buttons (prev/next month).\n   * Defaults to the built-in unstyled button.\n   */\n  NavButtonComponent?: React.ComponentType<NavButtonComponentProps>;\n  /**\n   * Component for rendering the month/year title pill.\n   * Defaults to the built-in unstyled div/button.\n   */\n  TitleComponent?: React.ComponentType<TitleComponentProps>;\n  /**\n   * Component for rendering each year item in the year-selection grid.\n   */\n  YearItemComponent?: React.ComponentType<YearItemComponentProps>;\n  /**\n   * Component for rendering weekday column headers.\n   */\n  WeekdayComponent?: React.ComponentType<{ label: string }>;\n}\n\n/**\n * Props for a year item slot component.\n */\nexport interface YearItemComponentProps {\n  year: number;\n  isSelected: boolean;\n  onSelect: (year: number) => void;\n}\n\n/**\n * Props for the CalendarCore headless component (Layer 2).\n *\n * Orchestrates the full calendar grid, navigation, and selection behavior\n * for both single-date and date-range modes.\n *\n * @example\n * ```tsx\n * <CalendarCore\n *   aria-label=\"Departure date\"\n *   selectionMode=\"single\"\n *   onChange={(date) => console.log(date)}\n * />\n * ```\n */\nexport interface CalendarCoreProps {\n  /** Selection mode: single date or date range. @default 'single' */\n  selectionMode?: DateSelectionMode;\n  /** Controlled selected date (single mode) */\n  value?: DateValue | null;\n  /** Default selected date for uncontrolled usage (single mode) */\n  defaultValue?: DateValue | null;\n  /** Controlled start and end dates (range mode) */\n  rangeValue?: { start: DateValue; end: DateValue } | null;\n  /** Default range for uncontrolled usage (range mode) */\n  defaultRangeValue?: { start: DateValue; end: DateValue } | null;\n  /** Called when selected date changes (single mode) */\n  onChange?: (value: DateValue) => void;\n  /** Called when selected range changes (range mode) */\n  onRangeChange?: (value: { start: DateValue; end: DateValue }) => void;\n  /** Minimum selectable date */\n  minValue?: DateValue;\n  /** Maximum selectable date */\n  maxValue?: DateValue;\n  /** Whether a specific date is unavailable */\n  isDateUnavailable?: (date: DateValue) => boolean;\n  /** Whether the calendar is disabled. @default false */\n  isDisabled?: boolean;\n  /** Whether the calendar is read-only. @default false */\n  isReadOnly?: boolean;\n  /** Current calendar view. @default 'day' */\n  view?: CalendarView;\n  /** Called when the view changes */\n  onViewChange?: (view: CalendarView) => void;\n  /** Locale override */\n  locale?: string;\n  /** First day of week (0=Sun, 1=Mon, ..., 6=Sat) */\n  firstDayOfWeek?: 0 | 1 | 2 | 3 | 4 | 5 | 6;\n  /** CSS classes for the root element */\n  className?: string;\n  /** Children for styled layer injection */\n  children?: React.ReactNode;\n  /** Accessible label */\n  \"aria-label\"?: string;\n  /** ID of labelling element */\n  \"aria-labelledby\"?: string;\n  /**\n   * Slot component overrides — pass styled components from Layer 3 to inject\n   * CVA classes and state layers into the calendar internals.\n   */\n  slots?: CalendarSlots;\n}\n\ntype CalendarInternalProps = Omit<CalendarCoreProps, \"selectionMode\"> & {\n  calendarRef: React.RefObject<HTMLDivElement>;\n};\n\n/**\n * Internal year grid for year selection view.\n * Renders a 3-column grid of selectable years.\n * @internal\n */\nfunction YearGrid({\n  selectedYear,\n  onYearSelect,\n  minYear,\n  maxYear,\n  YearItemComponent,\n}: {\n  selectedYear: number;\n  onYearSelect: (year: number) => void;\n  minYear?: number;\n  maxYear?: number;\n  YearItemComponent?: React.ComponentType<YearItemComponentProps>;\n}): JSX.Element {\n  const currentYear = new Date().getFullYear();\n  const startYear = minYear ?? currentYear - YEAR_RANGE_OFFSET;\n  const endYear = maxYear ?? currentYear + YEAR_RANGE_OFFSET;\n\n  const years: number[] = [];\n  for (let y = startYear; y <= endYear; y++) {\n    years.push(y);\n  }\n\n  const selectedRef = useRef<HTMLButtonElement>(null);\n\n  return (\n    <div\n      data-year-grid\n      role=\"grid\"\n      aria-label=\"Year selection\"\n      ref={(el) => {\n        if (el && selectedRef.current) {\n          selectedRef.current.scrollIntoView({\n            block: \"center\",\n            behavior: \"instant\",\n          });\n        }\n      }}\n    >\n      {years.map((year) => {\n        const isSelected = year === selectedYear;\n        if (YearItemComponent) {\n          return (\n            <YearItemComponent\n              key={year}\n              year={year}\n              isSelected={isSelected}\n              onSelect={onYearSelect}\n            />\n          );\n        }\n        return (\n          <button\n            key={year}\n            type=\"button\"\n            role=\"gridcell\"\n            aria-selected={isSelected}\n            data-year-item\n            data-selected={isSelected ? \"\" : undefined}\n            ref={isSelected ? selectedRef : undefined}\n            onClick={() => onYearSelect(year)}\n          >\n            {year}\n          </button>\n        );\n      })}\n    </div>\n  );\n}\n\n/**\n * Internal single-date calendar using useCalendar + useCalendarState.\n * Isolated to avoid conditional hook calls.\n */\nfunction SingleCalendarInner({ calendarRef, ...props }: CalendarInternalProps): JSX.Element {\n  const { locale: defaultLocale } = useLocale();\n  const calendarLocale = props.locale ?? defaultLocale;\n\n  const firstDay =\n    props.firstDayOfWeek !== undefined ? FIRST_DAY_MAP[props.firstDayOfWeek] : undefined;\n\n  const [currentView, setCurrentView] = useState<\"day\" | \"year\">(\n    props.view === \"year\" ? \"year\" : \"day\"\n  );\n\n  const optionalProps = {\n    ...(props.value !== undefined ? { value: props.value } : {}),\n    ...(props.defaultValue !== undefined ? { defaultValue: props.defaultValue } : {}),\n    ...(props.onChange ? { onChange: props.onChange } : {}),\n    ...(props.isDateUnavailable ? { isDateUnavailable: props.isDateUnavailable } : {}),\n    ...(props[\"aria-label\"] ? { \"aria-label\": props[\"aria-label\"] } : {}),\n    ...(props[\"aria-labelledby\"] ? { \"aria-labelledby\": props[\"aria-labelledby\"] } : {}),\n  };\n\n  const state = useCalendarState({\n    ...optionalProps,\n    minValue: props.minValue ?? null,\n    maxValue: props.maxValue ?? null,\n    isDisabled: props.isDisabled ?? false,\n    isReadOnly: props.isReadOnly ?? false,\n    locale: calendarLocale,\n    createCalendar,\n  });\n\n  const { calendarProps, prevButtonProps, nextButtonProps, title } = useCalendar(\n    {\n      ...optionalProps,\n      minValue: props.minValue ?? null,\n      maxValue: props.maxValue ?? null,\n      isDisabled: props.isDisabled ?? false,\n      isReadOnly: props.isReadOnly ?? false,\n    },\n    state\n  );\n\n  const handleTitleClick = (): void => {\n    const nextView = currentView === \"day\" ? \"year\" : \"day\";\n    setCurrentView(nextView);\n    props.onViewChange?.(nextView);\n  };\n\n  const handleYearSelect = (year: number): void => {\n    const newDate = state.focusedDate.set({ year });\n    state.setFocusedDate(newDate);\n    setCurrentView(\"day\");\n    props.onViewChange?.(\"day\");\n  };\n\n  const slots = props.slots ?? {};\n\n  return (\n    <div {...calendarProps} ref={calendarRef} className={props.className} data-view={currentView}>\n      <CalendarHeader\n        title={title}\n        prevButtonProps={currentView === \"day\" ? prevButtonProps : { isDisabled: true }}\n        nextButtonProps={currentView === \"day\" ? nextButtonProps : { isDisabled: true }}\n        onTitleClick={handleTitleClick}\n        showDropdownIndicator\n        {...(slots.NavButtonComponent ? { NavButtonComponent: slots.NavButtonComponent } : {})}\n        {...(slots.TitleComponent ? { TitleComponent: slots.TitleComponent } : {})}\n      />\n      {currentView === \"day\" ? (\n        <CalendarGrid\n          state={state}\n          firstDayOfWeek={firstDay}\n          {...(slots.CellComponent ? { CellComponent: slots.CellComponent } : {})}\n          {...(slots.WeekdayComponent ? { WeekdayComponent: slots.WeekdayComponent } : {})}\n        />\n      ) : (\n        <YearGrid\n          selectedYear={state.focusedDate.year}\n          onYearSelect={handleYearSelect}\n          {...(slots.YearItemComponent ? { YearItemComponent: slots.YearItemComponent } : {})}\n          {...(props.minValue ? { minYear: props.minValue.year } : {})}\n          {...(props.maxValue ? { maxYear: props.maxValue.year } : {})}\n        />\n      )}\n      {props.children}\n    </div>\n  );\n}\n\n/**\n * Internal range calendar using useRangeCalendar + useRangeCalendarState.\n * Isolated to avoid conditional hook calls.\n */\nfunction RangeCalendarInner({ calendarRef, ...props }: CalendarInternalProps): JSX.Element {\n  const { locale: defaultLocale } = useLocale();\n  const calendarLocale = props.locale ?? defaultLocale;\n\n  const firstDay =\n    props.firstDayOfWeek !== undefined ? FIRST_DAY_MAP[props.firstDayOfWeek] : undefined;\n\n  const [currentView, setCurrentView] = useState<\"day\" | \"year\">(\n    props.view === \"year\" ? \"year\" : \"day\"\n  );\n\n  const unavailableProp = props.isDateUnavailable\n    ? { isDateUnavailable: props.isDateUnavailable }\n    : {};\n\n  const rangeValueProp = props.rangeValue ? { value: props.rangeValue } : {};\n  const rangeDefaultProp = props.defaultRangeValue ? { defaultValue: props.defaultRangeValue } : {};\n  const rangeChangeProp = props.onRangeChange ? { onChange: props.onRangeChange } : {};\n  const ariaLabelProp = props[\"aria-label\"] ? { \"aria-label\": props[\"aria-label\"] } : {};\n  const ariaLabelledByProp = props[\"aria-labelledby\"]\n    ? { \"aria-labelledby\": props[\"aria-labelledby\"] }\n    : {};\n\n  const state = useRangeCalendarState({\n    ...rangeValueProp,\n    ...rangeDefaultProp,\n    ...rangeChangeProp,\n    minValue: props.minValue ?? null,\n    maxValue: props.maxValue ?? null,\n    ...unavailableProp,\n    isDisabled: props.isDisabled ?? false,\n    isReadOnly: props.isReadOnly ?? false,\n    locale: calendarLocale,\n    createCalendar,\n  });\n\n  const { calendarProps, prevButtonProps, nextButtonProps, title } = useRangeCalendar(\n    {\n      ...ariaLabelProp,\n      ...ariaLabelledByProp,\n      ...rangeValueProp,\n      ...rangeDefaultProp,\n      ...rangeChangeProp,\n      minValue: props.minValue ?? null,\n      maxValue: props.maxValue ?? null,\n      ...unavailableProp,\n      isDisabled: props.isDisabled ?? false,\n      isReadOnly: props.isReadOnly ?? false,\n    },\n    state,\n    calendarRef\n  );\n\n  const handleTitleClick = (): void => {\n    const nextView = currentView === \"day\" ? \"year\" : \"day\";\n    setCurrentView(nextView);\n    props.onViewChange?.(nextView);\n  };\n\n  const handleYearSelect = (year: number): void => {\n    const newDate = state.focusedDate.set({ year });\n    state.setFocusedDate(newDate);\n    setCurrentView(\"day\");\n    props.onViewChange?.(\"day\");\n  };\n\n  const slots = props.slots ?? {};\n\n  return (\n    <div {...calendarProps} ref={calendarRef} className={props.className} data-view={currentView}>\n      <CalendarHeader\n        title={title}\n        prevButtonProps={currentView === \"day\" ? prevButtonProps : { isDisabled: true }}\n        nextButtonProps={currentView === \"day\" ? nextButtonProps : { isDisabled: true }}\n        onTitleClick={handleTitleClick}\n        showDropdownIndicator\n        {...(slots.NavButtonComponent ? { NavButtonComponent: slots.NavButtonComponent } : {})}\n        {...(slots.TitleComponent ? { TitleComponent: slots.TitleComponent } : {})}\n      />\n      {currentView === \"day\" ? (\n        <CalendarGrid\n          state={state}\n          firstDayOfWeek={firstDay}\n          {...(slots.CellComponent ? { CellComponent: slots.CellComponent } : {})}\n          {...(slots.WeekdayComponent ? { WeekdayComponent: slots.WeekdayComponent } : {})}\n        />\n      ) : (\n        <YearGrid\n          selectedYear={state.focusedDate.year}\n          onYearSelect={handleYearSelect}\n          {...(slots.YearItemComponent ? { YearItemComponent: slots.YearItemComponent } : {})}\n          {...(props.minValue ? { minYear: props.minValue.year } : {})}\n          {...(props.maxValue ? { maxYear: props.maxValue.year } : {})}\n        />\n      )}\n      {props.children}\n    </div>\n  );\n}\n\n/**\n * Headless CalendarCore (Layer 2)\n *\n * Orchestrates the full calendar experience using React Aria's `useCalendar`\n * (single mode) or `useRangeCalendar` (range mode). Composes CalendarHeader\n * and CalendarGrid sub-components.\n *\n * Supports day view (calendar grid) and year view (3-column year selection grid)\n * toggled by clicking the month/year title in the header.\n *\n * The `slots` prop allows Layer-3 styled components to inject styled sub-components\n * (cells, nav buttons, title, year items, weekday labels) without modifying this\n * headless layer.\n *\n * @example\n * ```tsx\n * <CalendarCore aria-label=\"Pick a date\" onChange={setDate} />\n * <CalendarCore aria-label=\"Trip dates\" selectionMode=\"range\" onRangeChange={setRange} />\n * ```\n */\nexport const CalendarCore = forwardRef<HTMLDivElement, CalendarCoreProps>((props, forwardedRef) => {\n  const { selectionMode = \"single\", ...rest } = props;\n  const internalRef = useRef<HTMLDivElement>(null);\n  const ref = (forwardedRef ?? internalRef) as React.RefObject<HTMLDivElement>;\n\n  if (selectionMode === \"range\") {\n    return <RangeCalendarInner key=\"range\" {...rest} calendarRef={ref} />;\n  }\n\n  return <SingleCalendarInner key=\"single\" {...rest} calendarRef={ref} />;\n});\n\nCalendarCore.displayName = \"CalendarCore\";\n","\"use client\";\n\nimport type React from \"react\";\nimport { useRef } from \"react\";\nimport { useButton } from \"react-aria\";\n\nimport type { DatePickerActionsProps } from \"./DatePicker.types\";\n\n/**\n * Props for an injectable action button slot component.\n */\nexport interface ActionButtonSlotProps {\n  /** Visible label text */\n  label: string;\n  /** Accessible label */\n  \"aria-label\"?: string | undefined;\n  /** Called when the button is pressed */\n  onPress?: (() => void) | undefined;\n  /** Whether the button is disabled */\n  isDisabled?: boolean | undefined;\n  /** data-action attribute value (\"clear\" | \"cancel\" | \"confirm\") */\n  \"data-action\": string;\n}\n\n/**\n * Headless DatePickerActions (Layer 2)\n *\n * Renders Cancel, OK, and optionally Clear action buttons for the date picker.\n * Uses React Aria's `useButton` for accessibility and keyboard interaction.\n *\n * Accepts a `ButtonComponent` slot to allow the styled layer to inject CVA-styled\n * buttons with state layers without modifying this headless layer.\n *\n * This is a headless component — it provides behavior, ARIA semantics, and\n * data attributes only. The default buttons have no styling.\n *\n * @internal\n */\n\n/**\n * Default unstyled button.\n * @internal\n */\nfunction HeadlessActionButton({\n  label,\n  \"aria-label\": ariaLabel,\n  onPress,\n  isDisabled,\n  \"data-action\": dataAction,\n}: ActionButtonSlotProps): JSX.Element {\n  const ref = useRef<HTMLButtonElement>(null);\n  const { buttonProps } = useButton(\n    {\n      \"aria-label\": ariaLabel ?? label,\n      isDisabled: isDisabled ?? false,\n      ...(onPress ? { onPress } : {}),\n    },\n    ref\n  );\n  return (\n    <button {...buttonProps} ref={ref} type=\"button\" data-action={dataAction}>\n      {label}\n    </button>\n  );\n}\n\ninterface DatePickerActionsInternalProps extends DatePickerActionsProps {\n  /**\n   * Optional slot component for each action button.\n   * Defaults to `HeadlessActionButton` (unstyled).\n   * Pass a styled component from Layer 3 to inject CVA + state layers.\n   */\n  ButtonComponent?: React.ComponentType<ActionButtonSlotProps>;\n}\n\nexport function DatePickerActions({\n  cancelLabel = \"Cancel\",\n  confirmLabel = \"OK\",\n  clearLabel = \"Clear\",\n  showClear = false,\n  isConfirmDisabled = false,\n  onCancel,\n  onConfirm,\n  onClear,\n  className,\n  ButtonComponent = HeadlessActionButton,\n}: DatePickerActionsInternalProps): JSX.Element {\n  return (\n    <div className={className} data-actions>\n      {showClear && (\n        <ButtonComponent\n          label={clearLabel}\n          aria-label={clearLabel}\n          onPress={onClear}\n          data-action=\"clear\"\n        />\n      )}\n      <ButtonComponent\n        label={cancelLabel}\n        aria-label={cancelLabel}\n        onPress={onCancel}\n        data-action=\"cancel\"\n      />\n      <ButtonComponent\n        label={confirmLabel}\n        aria-label={confirmLabel}\n        onPress={onConfirm}\n        isDisabled={isConfirmDisabled}\n        data-action=\"confirm\"\n      />\n    </div>\n  );\n}\n\nDatePickerActions.displayName = \"DatePickerActions\";\n","\"use client\";\n\nimport type React from \"react\";\nimport { forwardRef, useRef, useCallback, useEffect } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport {\n  useDatePicker,\n  useDateField,\n  useDateSegment,\n  useButton,\n  useLocale,\n  usePopover,\n  useHover,\n  useFocusRing,\n  mergeProps,\n  DismissButton,\n} from \"react-aria\";\nimport { useDatePickerState, useDateFieldState } from \"react-stately\";\nimport { createCalendar } from \"@internationalized/date\";\n\nimport { CalendarCore } from \"./CalendarCore\";\nimport { DatePickerActions } from \"./DatePickerActions\";\nimport { getInteractionDataAttributes } from \"../../utils/interactionStates\";\nimport { cn } from \"../../utils/cn\";\n\nimport type { DateSegment as DateSegmentType } from \"react-stately\";\nimport type { DateValue } from \"@internationalized/date\";\nimport type { DatePickerDockedProps } from \"./DatePicker.types\";\nimport type { ActionButtonSlotProps } from \"./DatePickerActions\";\n\n/**\n * Internal segment renderer for the date field inside the picker.\n * @internal\n */\nfunction PickerDateSegment({\n  segment,\n  state,\n}: {\n  segment: DateSegmentType;\n  state: ReturnType<typeof useDateFieldState>;\n}): JSX.Element {\n  const ref = useRef<HTMLDivElement>(null);\n  const { segmentProps } = useDateSegment(segment, state, ref);\n\n  return (\n    <div\n      {...segmentProps}\n      ref={ref}\n      data-segment={segment.type}\n      data-placeholder={segment.isPlaceholder || undefined}\n    >\n      {segment.text}\n    </div>\n  );\n}\n\n/**\n * Internal date field that receives fieldProps from useDatePicker.\n * This bridges the picker's state management to useDateField.\n * @internal\n */\nfunction PickerDateField({\n  fieldProps: externalFieldProps,\n}: {\n  fieldProps: Record<string, unknown>;\n}): JSX.Element {\n  const { locale } = useLocale();\n  const ref = useRef<HTMLDivElement>(null);\n\n  const state = useDateFieldState({\n    ...externalFieldProps,\n    locale,\n    createCalendar,\n  });\n\n  const { fieldProps } = useDateField(externalFieldProps, state, ref);\n\n  return (\n    <div {...fieldProps} ref={ref} data-field>\n      {state.segments.map((segment, i) => (\n        <PickerDateSegment key={i} segment={segment} state={state} />\n      ))}\n    </div>\n  );\n}\n\n/**\n * Calendar SVG icon for the trigger button.\n * @internal\n */\nfunction CalendarTriggerIcon(): JSX.Element {\n  return (\n    <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\">\n      <path d=\"M19 3h-1V1h-2v2H8V1H6v2H5c-1.11 0-1.99.9-1.99 2L3 19c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 16H5V8h14v11zM9 10H7v2h2v-2zm4 0h-2v2h2v-2zm4 0h-2v2h2v-2z\" />\n    </svg>\n  );\n}\n\n/**\n * Internal popover content that uses usePopover for proper dismiss handling.\n * Handles Escape key, focus trapping, and click-outside dismiss.\n * @internal\n */\nfunction PopoverContent({\n  popoverRef,\n  anchorRef,\n  state,\n  dialogProps,\n  calendarProps,\n  cancelLabel,\n  confirmLabel,\n  onCancel,\n  onConfirm,\n  slots,\n  ActionButtonComponent,\n  popoverClassName,\n}: {\n  popoverRef: React.RefObject<HTMLDivElement>;\n  /** The element the popover is anchored to for positioning — the field group, not the icon button. */\n  anchorRef: React.RefObject<HTMLDivElement>;\n  state: ReturnType<typeof useDatePickerState>;\n  dialogProps: ReturnType<typeof useDatePicker>[\"dialogProps\"];\n  calendarProps: ReturnType<typeof useDatePicker>[\"calendarProps\"];\n  cancelLabel: string;\n  confirmLabel: string;\n  onCancel: () => void;\n  onConfirm: () => void;\n  slots?: DatePickerDockedProps[\"slots\"] | undefined;\n  ActionButtonComponent?: React.ComponentType<ActionButtonSlotProps> | undefined;\n  popoverClassName?: string | undefined;\n}): JSX.Element | null {\n  const { popoverProps } = usePopover(\n    {\n      popoverRef,\n      triggerRef: anchorRef,\n      placement: \"bottom start\",\n      offset: 4,\n      shouldFlip: true,\n      containerPadding: 12,\n    },\n    state\n  );\n\n  useEffect(() => {\n    const handleKeyDown = (e: KeyboardEvent): void => {\n      if (e.key === \"Escape\") {\n        e.stopPropagation();\n        state.close();\n      }\n    };\n\n    document.addEventListener(\"keydown\", handleKeyDown);\n    return () => document.removeEventListener(\"keydown\", handleKeyDown);\n  }, [state]);\n\n  if (typeof document === \"undefined\") {\n    return null;\n  }\n\n  const content = (\n    <div {...popoverProps} ref={popoverRef} data-popover className={cn(popoverClassName)}>\n      <DismissButton onDismiss={() => state.close()} />\n      <div {...dialogProps} role=\"dialog\">\n        <CalendarCore\n          {...{\n            ...(calendarProps.value ? { value: calendarProps.value } : {}),\n            ...(calendarProps.onChange ? { onChange: calendarProps.onChange } : {}),\n            ...(calendarProps.minValue ? { minValue: calendarProps.minValue } : {}),\n            ...(calendarProps.maxValue ? { maxValue: calendarProps.maxValue } : {}),\n            ...(calendarProps.isDisabled ? { isDisabled: calendarProps.isDisabled } : {}),\n            ...(calendarProps.isReadOnly ? { isReadOnly: calendarProps.isReadOnly } : {}),\n            ...(calendarProps.isDateUnavailable\n              ? { isDateUnavailable: calendarProps.isDateUnavailable }\n              : {}),\n          }}\n          aria-label={(calendarProps as { \"aria-label\"?: string })[\"aria-label\"] ?? \"Calendar\"}\n          {...(slots ? { slots } : {})}\n        />\n        <DatePickerActions\n          cancelLabel={cancelLabel}\n          confirmLabel={confirmLabel}\n          onCancel={onCancel}\n          onConfirm={onConfirm}\n          {...(ActionButtonComponent !== undefined\n            ? { ButtonComponent: ActionButtonComponent }\n            : {})}\n        />\n      </div>\n      <DismissButton onDismiss={() => state.close()} />\n    </div>\n  );\n\n  return createPortal(content, document.body) as JSX.Element;\n}\n\n/**\n * Headless DatePickerDocked (Layer 2)\n *\n * Provides the complete docked date picker behavior:\n * - Segmented date field trigger (MM/DD/YYYY)\n * - Calendar icon button to toggle the calendar popover\n * - Inline popover containing the CalendarCore\n * - Action buttons (Cancel, OK) at the bottom\n * - Open/close state management via React Aria overlays\n *\n * Accepts `slots` and `ActionButtonComponent` to allow Layer-3 styled wrappers\n * to inject CVA-styled sub-components without modifying this headless layer.\n *\n * This is a headless component — it provides behavior, ARIA semantics, and\n * data attributes only. No styling classes are applied to internal elements.\n *\n * @example\n * ```tsx\n * <DatePickerDocked\n *   label=\"Departure date\"\n *   onChange={(date) => console.log(date)}\n * />\n * ```\n */\nexport const DatePickerDocked = forwardRef<HTMLDivElement, DatePickerDockedProps>(\n  (props, forwardedRef) => {\n    const {\n      cancelLabel = \"Cancel\",\n      confirmLabel = \"OK\",\n      onCancel,\n      onConfirm,\n      className,\n      popoverClassName,\n      slots,\n      ActionButtonComponent,\n      ...datePickerProps\n    } = props;\n\n    const internalRef = useRef<HTMLDivElement>(null);\n    const ref = (forwardedRef ?? internalRef) as React.RefObject<HTMLDivElement>;\n    const triggerRef = useRef<HTMLButtonElement>(null);\n    const groupRef = useRef<HTMLDivElement>(null);\n    const popoverRef = useRef<HTMLDivElement>(null);\n\n    const stateProps = {\n      ...(datePickerProps.value !== undefined ? { value: datePickerProps.value } : {}),\n      ...(datePickerProps.defaultValue !== undefined\n        ? { defaultValue: datePickerProps.defaultValue }\n        : {}),\n      ...(datePickerProps.onChange ? { onChange: datePickerProps.onChange } : {}),\n      ...(datePickerProps.minValue ? { minValue: datePickerProps.minValue } : {}),\n      ...(datePickerProps.maxValue ? { maxValue: datePickerProps.maxValue } : {}),\n      ...(datePickerProps.isDateUnavailable\n        ? { isDateUnavailable: datePickerProps.isDateUnavailable }\n        : {}),\n      ...(datePickerProps.placeholderValue\n        ? { placeholderValue: datePickerProps.placeholderValue }\n        : {}),\n      ...(datePickerProps[\"aria-label\"] ? { \"aria-label\": datePickerProps[\"aria-label\"] } : {}),\n      ...(datePickerProps[\"aria-labelledby\"]\n        ? { \"aria-labelledby\": datePickerProps[\"aria-labelledby\"] }\n        : {}),\n      ...(datePickerProps.label ? { label: datePickerProps.label } : {}),\n      ...(datePickerProps.isOpen !== undefined ? { isOpen: datePickerProps.isOpen } : {}),\n      ...(datePickerProps.defaultOpen !== undefined\n        ? { defaultOpen: datePickerProps.defaultOpen }\n        : {}),\n      ...(datePickerProps.onOpenChange ? { onOpenChange: datePickerProps.onOpenChange } : {}),\n      isDisabled: datePickerProps.isDisabled ?? false,\n      isReadOnly: datePickerProps.isReadOnly ?? false,\n      isRequired: datePickerProps.isRequired ?? false,\n      granularity: (datePickerProps.granularity ?? \"day\") as \"day\",\n      shouldCloseOnSelect: false,\n    };\n\n    const state = useDatePickerState(stateProps);\n\n    const {\n      groupProps,\n      labelProps,\n      fieldProps,\n      buttonProps: triggerButtonAriaProps,\n      dialogProps,\n      calendarProps,\n    } = useDatePicker(stateProps, state, ref);\n\n    const { buttonProps: iconButtonProps, isPressed: isTriggerPressed } = useButton(\n      triggerButtonAriaProps,\n      triggerRef\n    );\n    const { isFocusVisible: isTriggerFocusVisible, focusProps: triggerFocusProps } = useFocusRing();\n    const { isHovered: isTriggerHovered, hoverProps: triggerHoverProps } = useHover({\n      isDisabled: datePickerProps.isDisabled ?? false,\n    });\n\n    const valueBeforeOpenRef = useRef<DateValue | null>(null);\n\n    useEffect(() => {\n      if (state.isOpen) {\n        valueBeforeOpenRef.current = state.value ?? null;\n      }\n    }, [state.isOpen]); // eslint-disable-line react-hooks/exhaustive-deps\n\n    const handleCancel = useCallback(() => {\n      const previous = valueBeforeOpenRef.current;\n      if (previous !== null) {\n        state.setValue(previous);\n      } else {\n        state.setValue(null as unknown as DateValue);\n      }\n      state.setOpen(false);\n      onCancel?.();\n      triggerRef.current?.focus();\n    }, [state, onCancel]);\n\n    const handleConfirm = useCallback(() => {\n      state.setOpen(false);\n      onConfirm?.(state.value ?? null);\n      triggerRef.current?.focus();\n    }, [state, onConfirm]);\n\n    return (\n      <div\n        ref={ref}\n        className={className}\n        data-variant=\"docked\"\n        data-open={state.isOpen ? \"\" : undefined}\n        data-disabled={datePickerProps.isDisabled ? \"\" : undefined}\n      >\n        {datePickerProps.label && (\n          <label {...labelProps} data-label>\n            {datePickerProps.label}\n          </label>\n        )}\n        <div {...groupProps} ref={groupRef} data-field-group>\n          <PickerDateField fieldProps={fieldProps as Record<string, unknown>} />\n          <button\n            {...mergeProps(iconButtonProps, triggerFocusProps, triggerHoverProps)}\n            ref={triggerRef}\n            type=\"button\"\n            data-trigger\n            {...getInteractionDataAttributes({\n              isHovered: isTriggerHovered,\n              isFocusVisible: isTriggerFocusVisible,\n              isPressed: isTriggerPressed,\n              isDisabled: datePickerProps.isDisabled ?? false,\n            })}\n          >\n            <CalendarTriggerIcon />\n          </button>\n        </div>\n        {state.isOpen && (\n          <PopoverContent\n            popoverRef={popoverRef}\n            anchorRef={groupRef}\n            state={state}\n            dialogProps={dialogProps}\n            calendarProps={calendarProps}\n            cancelLabel={cancelLabel}\n            confirmLabel={confirmLabel}\n            onCancel={handleCancel}\n            onConfirm={handleConfirm}\n            {...(slots !== undefined ? { slots } : {})}\n            {...(ActionButtonComponent !== undefined ? { ActionButtonComponent } : {})}\n            {...(popoverClassName !== undefined ? { popoverClassName } : {})}\n          />\n        )}\n      </div>\n    );\n  }\n);\n\nDatePickerDocked.displayName = \"DatePickerDocked\";\n","import { cva, type VariantProps } from \"class-variance-authority\";\n\n/**\n * Material Design 3 DatePicker Variants\n *\n * Architecture: Variants vs States\n * - CVA holds design-time structure only. No interaction state variants\n *   (hovered/focused/pressed/disabled) live in CVA.\n * - All interaction/selection states are driven by data-* attributes emitted\n *   via `getInteractionDataAttributes` and consumed by `group-data-[x]/<name>`\n *   Tailwind selectors in each slot's base classes.\n * - Content flags (data-selected, data-today, data-range-middle, data-disabled,\n *   data-outside-month, data-range-start, data-range-end, data-focus-visible,\n *   data-hovered, data-pressed) are set by the headless cell/nav/year layers.\n *\n * Slot responsibilities:\n *   datePickerContainerVariants    — root container; shape, surface, width by variant\n *   calendarCellVariants           — 48dp date cell root; carries `group/calendar-cell`\n *   calendarCellStateLayerVariants — hover/focus/pressed state-layer overlay\n *   calendarCellFocusRingVariants  — keyboard focus ring for cells\n *   navButtonVariants              — 40dp icon nav button; carries `group/nav-button`\n *   navButtonStateLayerVariants    — state layer for nav button\n *   calendarTitleVariants          — month/year toggle pill; carries `group/calendar-title`\n *   calendarTitleStateLayerVariants — state layer for title button\n *   calendarHeaderVariants         — header row layout\n *   yearItemVariants               — 88×52 pill year item; carries `group/year-item`\n *   yearItemStateLayerVariants     — state layer for year item\n *   yearGridVariants               — scrollable year grid container\n *   weekdayVariants                — \"S M T W T F S\" label cells\n *   dividerVariants                — 1dp outline-variant separator\n *   actionButtonVariants           — Cancel/OK/Clear text button; carries `group/action-button`\n *   actionButtonStateLayerVariants — state layer for action buttons\n *   actionRowVariants              — action button row layout\n *   modalDialogVariants            — centered fixed modal dialog panel\n *   modalHeaderVariants            — modal header layout\n *   headlineVariants               — label-large supporting headline text\n *   supportingTextVariants         — headline-large selected-date display\n *   modeToggleVariants             — calendar/keyboard mode toggle button; carries `group/mode-toggle`\n *   modeToggleStateLayerVariants   — state layer for mode toggle\n *   scrimVariants                  — full-viewport dark overlay\n *   dateInputFieldVariants         — outlined date input field wrapper\n *   dateInputFieldGroupVariants    — inner outlined container + focus/invalid borders\n *   dockedFieldGroupVariants       — docked trigger: outlined field + icon\n *   dockedTriggerVariants          — calendar icon button; carries `group/docked-trigger`\n *   dockedTriggerStateLayerVariants — state layer for docked trigger\n *   popoverVariants                — docked calendar popover panel\n *\n * MD3 Spec (https://m3.material.io/components/date-pickers/specs):\n *   Container: surface-container-high, 28dp corner (extra-large)\n *   Date cell: 48dp circle\n *   Nav button: 40dp, rounded-full\n *   Year item: 88×52dp, pill\n *   State-layer opacities: hover 8% | focus 10% | pressed 10% | disabled 38%\n *   Motion tier: Spring standard FAST (< 48dp interactive elements)\n *   Modal enter: animate-md-scale-in | Exit: animate-md-scale-out\n *   Popover enter: standard-decelerate / short3\n */\n\n// ─── CONTAINER ───────────────────────────────────────────────────────────────\n\n/**\n * Container variants — width and surface styling by structural variant.\n *\n * - **docked**: Root wrapper is layout-only (width). Calendar surface styling\n *   (`bg-surface-container-high`, `rounded-3xl`) is applied to `[data-popover]`\n *   via `DOCKED_POPOVER_STRUCTURAL` in `datePickerStructuralStyles.ts`.\n * - **modal** / **modal-input**: Full container styling on `[data-modal-dialog]`.\n *\n * MD3 spec: surface-container-high, 28dp corner radius (extra-large = rounded-3xl).\n */\nexport const datePickerContainerVariants = cva(\"\", {\n  variants: {\n    variant: {\n      docked: \"w-[360px]\", // NOTE: measurement-derived (360dp fixed width); permitted exception\n      modal: [\n        \"bg-surface-container-high\",\n        \"rounded-3xl\",\n        \"overflow-hidden\",\n        \"w-[360px]\", // NOTE: measurement-derived (360dp fixed width); permitted exception\n      ],\n      \"modal-input\": [\n        \"bg-surface-container-high\",\n        \"rounded-3xl\",\n        \"overflow-hidden\",\n        \"w-[328px]\", // NOTE: measurement-derived (328dp); permitted exception\n      ],\n    },\n  },\n  defaultVariants: {\n    variant: \"docked\",\n  },\n});\n\nexport type DatePickerContainerVariants = VariantProps<typeof datePickerContainerVariants>;\n\n// ─── CALENDAR CELL ───────────────────────────────────────────────────────────\n\n/**\n * Date cell root — carries `group/calendar-cell`.\n *\n * Structure + visual states are driven by presence-based data-* attributes on\n * the root via self-targeting `data-[x]:` and `group-data-[x]/calendar-cell:`\n * selectors — NOT via CVA variants.\n *\n * Cell state progression:\n *   default:             text-on-surface\n *   today (unselected):  text-primary + border border-primary\n *   selected:            bg-primary + text-on-primary (full circle)\n *   range-start/end:     bg-primary + text-on-primary + half-pill rounding\n *   range-middle:        bg-secondary-container + text-on-secondary-container + no rounding\n *   outside-month:       text-on-surface-variant\n *   disabled:            text-on-surface/38, cursor-not-allowed\n *   unavailable:         text-on-surface/38, line-through\n *\n * Interaction states via state layer (see calendarCellStateLayerVariants):\n *   hover 8% | focus-visible 10% | pressed 10%\n */\nexport const calendarCellVariants = cva([\n  // Layout — 48dp circle touch target\n  \"relative flex items-center justify-center\",\n  \"w-[48px] h-[48px]\", // NOTE: measurement-derived (48dp touch target); permitted exception\n  \"rounded-full\",\n  \"select-none cursor-pointer\",\n  \"overflow-hidden\", // clips state layer to circle\n  // Typography\n  \"text-body-large\",\n  // Base text color\n  \"text-on-surface\",\n  // Effects transition for color changes (not spatial — no overshoot)\n  \"transition-colors duration-spring-standard-fast-effects ease-spring-standard-fast-effects\",\n  // Remove default focus outline — handled via calendarCellFocusRingVariants\n  \"focus-visible:outline-none\",\n  // Carries group scope for child slots\n  \"group/calendar-cell\",\n  // ── Today (unselected) ────────────────────────────────────────────────────\n  \"data-[today]:not([data-selected]):text-primary\",\n  \"data-[today]:not([data-selected]):border data-[today]:not([data-selected]):border-primary\",\n  // ── Selected ──────────────────────────────────────────────────────────────\n  \"data-[selected]:bg-primary data-[selected]:text-on-primary\",\n  // ── Range start/end: half-pill shape (right-flat for start, left-flat for end) ──\n  \"data-[range-start]:rounded-r-none\",\n  \"data-[range-end]:rounded-l-none\",\n  // ── Range middle ──────────────────────────────────────────────────────────\n  \"data-[range-middle]:bg-secondary-container\",\n  \"data-[range-middle]:text-on-secondary-container\",\n  \"data-[range-middle]:rounded-none\",\n  // ── Outside month ─────────────────────────────────────────────────────────\n  \"data-[outside-month]:not([data-selected]):text-on-surface-variant\",\n  // ── Disabled ──────────────────────────────────────────────────────────────\n  \"data-[disabled]:text-on-surface/38 data-[disabled]:cursor-not-allowed\",\n  // ── Unavailable ───────────────────────────────────────────────────────────\n  \"data-[unavailable]:text-on-surface/38 data-[unavailable]:line-through\",\n]);\n\nexport type CalendarCellVariants = VariantProps<typeof calendarCellVariants>;\n\n/**\n * Calendar cell state layer — absolute overlay inside the cell.\n *\n * Color: on-surface (unselected) → on-primary (selected) → on-secondary-container (range-middle).\n * Opacity: 0 rest → 8% hover → 10% focus-visible → 10% pressed → hidden disabled.\n * Effects spring (fast tier — small < 48dp control).\n */\nexport const calendarCellStateLayerVariants = cva([\n  \"pointer-events-none absolute inset-0 rounded-[inherit] opacity-0\",\n  // Base state-layer color (unselected)\n  \"bg-on-surface\",\n  // Effects transition — spring standard fast (no spatial overshoot)\n  \"transition-opacity duration-spring-standard-fast-effects ease-spring-standard-fast-effects\",\n  // Selected → state layer color switches to on-primary\n  \"group-data-[selected]/calendar-cell:bg-on-primary\",\n  // Range middle → state layer color switches to on-secondary-container\n  \"group-data-[range-middle]/calendar-cell:bg-on-secondary-container\",\n  // Interaction opacities (MD3: hover 8%, focus/pressed 10%)\n  \"group-data-[hovered]/calendar-cell:opacity-8\",\n  \"group-data-[focus-visible]/calendar-cell:opacity-10\",\n  \"group-data-[pressed]/calendar-cell:opacity-10\",\n  // No state layer for disabled/unavailable\n  \"group-data-[disabled]/calendar-cell:hidden\",\n  \"group-data-[unavailable]/calendar-cell:hidden\",\n]);\n\nexport type CalendarCellStateLayerVariants = VariantProps<typeof calendarCellStateLayerVariants>;\n\n/**\n * Calendar cell focus ring — keyboard-only visible ring.\n * Rendered as an absolute inset so overflow-hidden never clips it.\n */\nexport const calendarCellFocusRingVariants = cva([\n  \"pointer-events-none absolute inset-0 rounded-full\",\n  \"outline outline-2 outline-offset-0 outline-secondary\",\n  \"transition-opacity duration-spring-standard-fast-effects ease-spring-standard-fast-effects\",\n  \"opacity-0\",\n  \"group-data-[focus-visible]/calendar-cell:opacity-100\",\n]);\n\nexport type CalendarCellFocusRingVariants = VariantProps<typeof calendarCellFocusRingVariants>;\n\n// ─── CALENDAR HEADER ─────────────────────────────────────────────────────────\n\n/**\n * Calendar header row — flex layout, padding per MD3 spec.\n */\nexport const calendarHeaderVariants = cva([\n  \"flex items-center justify-between\",\n  \"px-3 py-2\", // NOTE: measurement-derived padding; permitted exception\n]);\n\nexport type CalendarHeaderVariants = VariantProps<typeof calendarHeaderVariants>;\n\n// ─── NAV BUTTON ──────────────────────────────────────────────────────────────\n\n/**\n * Navigation button (previous/next month) — 40dp circle, carries `group/nav-button`.\n *\n * MD3 spec: 40dp icon button, on-surface-variant color, transparent bg.\n * State layer: hover 8%, focus 10%, pressed 10%.\n */\nexport const navButtonVariants = cva([\n  // Layout\n  \"relative flex items-center justify-center\",\n  \"w-10 h-10 rounded-full\", // NOTE: 40dp; permitted exception\n  // Typography\n  \"text-on-surface-variant\",\n  // Reset\n  \"bg-transparent border-none cursor-pointer\",\n  \"overflow-hidden\",\n  // Focus outline removed — ring handled by navButtonFocusRingVariants\n  \"focus-visible:outline-none\",\n  // Effects transition\n  \"transition-colors duration-spring-standard-fast-effects ease-spring-standard-fast-effects\",\n  // Disabled — self-targeting\n  \"data-[disabled]:text-on-surface/38 data-[disabled]:cursor-not-allowed data-[disabled]:pointer-events-none\",\n  // Carries group scope\n  \"group/nav-button\",\n]);\n\nexport type NavButtonVariants = VariantProps<typeof navButtonVariants>;\n\n/**\n * Nav button state layer.\n */\nexport const navButtonStateLayerVariants = cva([\n  \"pointer-events-none absolute inset-0 rounded-full opacity-0\",\n  \"bg-on-surface-variant\",\n  \"transition-opacity duration-spring-standard-fast-effects ease-spring-standard-fast-effects\",\n  \"group-data-[hovered]/nav-button:opacity-8\",\n  \"group-data-[focus-visible]/nav-button:opacity-10\",\n  \"group-data-[pressed]/nav-button:opacity-10\",\n  \"group-data-[disabled]/nav-button:hidden\",\n]);\n\nexport type NavButtonStateLayerVariants = VariantProps<typeof navButtonStateLayerVariants>;\n\n/**\n * Nav button focus ring.\n */\nexport const navButtonFocusRingVariants = cva([\n  \"pointer-events-none absolute inset-0 rounded-full\",\n  \"outline outline-2 outline-offset-0 outline-secondary\",\n  \"transition-opacity duration-spring-standard-fast-effects ease-spring-standard-fast-effects\",\n  \"opacity-0\",\n  \"group-data-[focus-visible]/nav-button:opacity-100\",\n]);\n\nexport type NavButtonFocusRingVariants = VariantProps<typeof navButtonFocusRingVariants>;\n\n// ─── CALENDAR TITLE ──────────────────────────────────────────────────────────\n\n/**\n * Month/year title toggle pill — carries `group/calendar-title`.\n *\n * MD3 spec: label-large text, on-surface-variant, pill shape, transparent bg.\n */\nexport const calendarTitleVariants = cva([\n  \"relative flex items-center gap-0.5\",\n  \"bg-transparent border-none cursor-pointer\",\n  \"rounded-full px-2 py-1\",\n  \"overflow-hidden\",\n  \"focus-visible:outline-none\",\n  // Effects transition\n  \"transition-colors duration-spring-standard-fast-effects ease-spring-standard-fast-effects\",\n  // Group scope\n  \"group/calendar-title\",\n]);\n\nexport type CalendarTitleVariants = VariantProps<typeof calendarTitleVariants>;\n\n/**\n * Calendar title text inside the title button.\n * label-large, on-surface-variant per MD3.\n */\nexport const calendarTitleTextVariants = cva([\n  \"text-label-large text-on-surface-variant m-0 pointer-events-none\",\n]);\n\nexport type CalendarTitleTextVariants = VariantProps<typeof calendarTitleTextVariants>;\n\n/**\n * Calendar title dropdown icon color.\n */\nexport const calendarTitleIconVariants = cva([\"text-on-surface-variant pointer-events-none\"]);\n\nexport type CalendarTitleIconVariants = VariantProps<typeof calendarTitleIconVariants>;\n\n/**\n * Calendar title state layer.\n */\nexport const calendarTitleStateLayerVariants = cva([\n  \"pointer-events-none absolute inset-0 rounded-full opacity-0\",\n  \"bg-on-surface-variant\",\n  \"transition-opacity duration-spring-standard-fast-effects ease-spring-standard-fast-effects\",\n  \"group-data-[hovered]/calendar-title:opacity-8\",\n  \"group-data-[focus-visible]/calendar-title:opacity-10\",\n  \"group-data-[pressed]/calendar-title:opacity-10\",\n]);\n\nexport type CalendarTitleStateLayerVariants = VariantProps<typeof calendarTitleStateLayerVariants>;\n\n// ─── YEAR GRID ───────────────────────────────────────────────────────────────\n\n/**\n * Scrollable year grid container.\n * MD3 spec: 3-column grid, scrollable, max height.\n */\nexport const yearGridVariants = cva([\n  \"grid grid-cols-3 gap-2\",\n  \"px-3 py-2\",\n  \"max-h-[280px] overflow-y-auto\", // NOTE: measurement-derived max height; permitted exception\n  \"place-items-center\",\n]);\n\nexport type YearGridVariants = VariantProps<typeof yearGridVariants>;\n\n/**\n * Year item pill — carries `group/year-item`.\n *\n * MD3 spec: 88×52dp, pill, body-large text.\n * Selected: bg-primary text-on-primary.\n * Unselected: text-on-surface-variant.\n * All interaction states via state layer.\n */\nexport const yearItemVariants = cva([\n  // Layout\n  \"relative flex items-center justify-center\",\n  \"w-[88px] h-[52px]\", // NOTE: measurement-derived (88dp×52dp); permitted exception\n  \"rounded-full\",\n  \"cursor-pointer select-none\",\n  \"overflow-hidden\",\n  // Typography\n  \"text-body-large\",\n  // Reset\n  \"bg-transparent border-none\",\n  // Focus outline removed — ring handled by yearItemFocusRingVariants\n  \"focus-visible:outline-none\",\n  // Effects transition\n  \"transition-colors duration-spring-standard-fast-effects ease-spring-standard-fast-effects\",\n  // Group scope\n  \"group/year-item\",\n  // ── Unselected (base) ─────────────────────────────────────────────────────\n  \"text-on-surface-variant\",\n  // ── Selected ──────────────────────────────────────────────────────────────\n  \"data-[selected]:bg-primary data-[selected]:text-on-primary\",\n  // ── Disabled ──────────────────────────────────────────────────────────────\n  \"data-[disabled]:text-on-surface/38 data-[disabled]:cursor-not-allowed data-[disabled]:pointer-events-none\",\n]);\n\nexport type YearItemVariants = VariantProps<typeof yearItemVariants>;\n\n/**\n * Year item state layer.\n *\n * Color: on-surface-variant (unselected) → on-primary (selected).\n */\nexport const yearItemStateLayerVariants = cva([\n  \"pointer-events-none absolute inset-0 rounded-full opacity-0\",\n  \"bg-on-surface-variant\",\n  \"transition-opacity duration-spring-standard-fast-effects ease-spring-standard-fast-effects\",\n  // Selected → state layer switches color\n  \"group-data-[selected]/year-item:bg-on-primary\",\n  // Interaction opacities\n  \"group-data-[hovered]/year-item:opacity-8\",\n  \"group-data-[focus-visible]/year-item:opacity-10\",\n  \"group-data-[pressed]/year-item:opacity-10\",\n  \"group-data-[disabled]/year-item:hidden\",\n]);\n\nexport type YearItemStateLayerVariants = VariantProps<typeof yearItemStateLayerVariants>;\n\n/**\n * Year item focus ring.\n */\nexport const yearItemFocusRingVariants = cva([\n  \"pointer-events-none absolute inset-0 rounded-full\",\n  \"outline outline-2 outline-offset-0 outline-secondary\",\n  \"transition-opacity duration-spring-standard-fast-effects ease-spring-standard-fast-effects\",\n  \"opacity-0\",\n  \"group-data-[focus-visible]/year-item:opacity-100\",\n]);\n\nexport type YearItemFocusRingVariants = VariantProps<typeof yearItemFocusRingVariants>;\n\n// ─── WEEKDAY LABELS ──────────────────────────────────────────────────────────\n\n/**\n * Weekday column headers (S M T W T F S).\n * MD3 spec: body-small, on-surface-variant, 48dp width, 48dp height, centered.\n */\nexport const weekdayVariants = cva([\n  \"text-body-small text-on-surface-variant font-normal\",\n  \"w-[48px] h-[48px]\", // NOTE: measurement-derived; permitted exception\n  \"flex items-center justify-center\",\n  \"select-none\",\n]);\n\nexport type WeekdayVariants = VariantProps<typeof weekdayVariants>;\n\n// ─── DIVIDER ─────────────────────────────────────────────────────────────────\n\n/**\n * 1dp separator between header and calendar body.\n * MD3 spec: outline-variant color.\n */\nexport const calendarDividerVariants = cva([\"border-t border-outline-variant w-full\"]);\n\nexport type CalendarDividerVariants = VariantProps<typeof calendarDividerVariants>;\n\n// ─── ACTION BUTTONS ──────────────────────────────────────────────────────────\n\n/**\n * Action button row — right-aligned flex, 48dp height.\n * MD3 spec: 12dp horizontal padding, 48dp row height.\n */\nexport const actionRowVariants = cva([\n  \"flex items-center justify-end gap-2\",\n  \"px-3 py-2\",\n  \"h-12\", // NOTE: measurement-derived (48dp action row height); permitted exception\n]);\n\nexport type ActionRowVariants = VariantProps<typeof actionRowVariants>;\n\n/**\n * Individual action button (Cancel / OK / Clear) — carries `group/action-button`.\n *\n * MD3 spec: label-large, primary color, pill shape, transparent bg.\n */\nexport const actionButtonVariants = cva([\n  // Layout\n  \"relative flex items-center justify-center\",\n  \"rounded-full px-3 py-2 min-h-[48px]\", // NOTE: 48dp min touch; permitted exception\n  // Typography + color\n  \"text-label-large text-primary\",\n  // Reset\n  \"bg-transparent border-none cursor-pointer\",\n  \"overflow-hidden\",\n  \"focus-visible:outline-none\",\n  // Effects transition\n  \"transition-colors duration-spring-standard-fast-effects ease-spring-standard-fast-effects\",\n  // Group scope\n  \"group/action-button\",\n  // Disabled\n  \"data-[disabled]:text-on-surface/38 data-[disabled]:cursor-not-allowed data-[disabled]:pointer-events-none\",\n]);\n\nexport type ActionButtonVariants = VariantProps<typeof actionButtonVariants>;\n\n/**\n * Action button state layer.\n */\nexport const actionButtonStateLayerVariants = cva([\n  \"pointer-events-none absolute inset-0 rounded-full opacity-0\",\n  \"bg-primary\",\n  \"transition-opacity duration-spring-standard-fast-effects ease-spring-standard-fast-effects\",\n  \"group-data-[hovered]/action-button:opacity-8\",\n  \"group-data-[focus-visible]/action-button:opacity-10\",\n  \"group-data-[pressed]/action-button:opacity-10\",\n  \"group-data-[disabled]/action-button:hidden\",\n]);\n\nexport type ActionButtonStateLayerVariants = VariantProps<typeof actionButtonStateLayerVariants>;\n\n/**\n * Action button focus ring.\n */\nexport const actionButtonFocusRingVariants = cva([\n  \"pointer-events-none absolute inset-0 rounded-full\",\n  \"outline outline-2 outline-offset-0 outline-primary\",\n  \"transition-opacity duration-spring-standard-fast-effects ease-spring-standard-fast-effects\",\n  \"opacity-0\",\n  \"group-data-[focus-visible]/action-button:opacity-100\",\n]);\n\nexport type ActionButtonFocusRingVariants = VariantProps<typeof actionButtonFocusRingVariants>;\n\n// ─── MODAL DIALOG ────────────────────────────────────────────────────────────\n\n/**\n * Centered modal dialog panel.\n * MD3 spec: surface-container-high, 28dp corner, elevation-3.\n * Sizes: 360dp (modal) | 328dp (modal-input).\n */\nexport const modalDialogVariants = cva(\n  [\n    \"bg-surface-container-high rounded-3xl overflow-hidden\",\n    \"fixed top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2\",\n    \"z-50\",\n    \"max-h-[90vh] overflow-y-auto\",\n  ],\n  {\n    variants: {\n      variant: {\n        modal: \"w-[360px]\", // NOTE: measurement-derived; permitted exception\n        \"modal-input\": \"w-[328px]\", // NOTE: measurement-derived; permitted exception\n      },\n    },\n    defaultVariants: {\n      variant: \"modal\",\n    },\n  }\n);\n\nexport type ModalDialogVariants = VariantProps<typeof modalDialogVariants>;\n\n// ─── MODAL HEADER ────────────────────────────────────────────────────────────\n\n/**\n * Modal header layout wrapper.\n * MD3 spec: 24dp horizontal padding, 16dp top, 12dp bottom, items-start.\n */\nexport const modalHeaderVariants = cva([\n  \"flex items-start justify-between\",\n  \"px-6 pt-4 pb-3\", // NOTE: measurement-derived padding; permitted exception\n]);\n\nexport type ModalHeaderVariants = VariantProps<typeof modalHeaderVariants>;\n\n/**\n * Headline text — label-large, on-surface-variant.\n * Shows \"Select date\" / \"Select dates\" above the large date display.\n */\nexport const headlineVariants = cva([\"text-label-large text-on-surface-variant m-0\"]);\n\nexport type HeadlineVariants = VariantProps<typeof headlineVariants>;\n\n/**\n * Supporting text — the large formatted selected date display.\n * MD3 spec: headline-large, on-surface.\n */\nexport const supportingTextVariants = cva([\n  \"text-headline-large text-on-surface mt-9 m-0\", // NOTE: measurement-derived mt; permitted exception\n]);\n\nexport type SupportingTextVariants = VariantProps<typeof supportingTextVariants>;\n\n/**\n * Mode toggle button (calendar ↔ keyboard) — carries `group/mode-toggle`.\n * MD3 spec: 48dp circle, on-surface-variant.\n */\nexport const modeToggleVariants = cva([\n  \"relative flex items-center justify-center\",\n  \"w-12 h-12 rounded-full\", // NOTE: 48dp; permitted exception\n  \"text-on-surface-variant\",\n  \"bg-transparent border-none cursor-pointer self-end\",\n  \"overflow-hidden\",\n  \"focus-visible:outline-none\",\n  \"transition-colors duration-spring-standard-fast-effects ease-spring-standard-fast-effects\",\n  \"group/mode-toggle\",\n]);\n\nexport type ModeToggleVariants = VariantProps<typeof modeToggleVariants>;\n\n/**\n * Mode toggle state layer.\n */\nexport const modeToggleStateLayerVariants = cva([\n  \"pointer-events-none absolute inset-0 rounded-full opacity-0\",\n  \"bg-on-surface-variant\",\n  \"transition-opacity duration-spring-standard-fast-effects ease-spring-standard-fast-effects\",\n  \"group-data-[hovered]/mode-toggle:opacity-8\",\n  \"group-data-[focus-visible]/mode-toggle:opacity-10\",\n  \"group-data-[pressed]/mode-toggle:opacity-10\",\n]);\n\nexport type ModeToggleStateLayerVariants = VariantProps<typeof modeToggleStateLayerVariants>;\n\n// ─── SCRIM ───────────────────────────────────────────────────────────────────\n\n/**\n * Full-viewport dark overlay behind modal dialogs.\n * MD3 spec: bg-scrim at 32% opacity.\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\nexport type ScrimVariants = VariantProps<typeof scrimVariants>;\n\n// ─── DATE INPUT FIELD (modal-input) ──────────────────────────────────────────\n\n/**\n * Outer wrapper for a labeled date input field (modal-input variant).\n * MD3 spec: 24dp horizontal padding, 8dp vertical.\n */\nexport const dateInputFieldVariants = cva([\"px-6 py-2\"]); // NOTE: measurement-derived; permitted exception\n\nexport type DateInputFieldVariants = VariantProps<typeof dateInputFieldVariants>;\n\n/**\n * Inner outlined container of the date input field.\n * Focus state adds 2dp primary border; invalid adds error border.\n * MD3 spec: outlined text field, body-large text, rounded-sm shape.\n */\nexport const dateInputFieldGroupVariants = cva([\n  \"flex items-center\",\n  \"border border-outline rounded-sm\",\n  \"px-4 py-3\", // NOTE: measurement-derived; permitted exception\n  \"text-body-large text-on-surface\",\n  // Focus state (data-focused on parent wrapper)\n  \"peer-data-[focused]:border-2 peer-data-[focused]:border-primary\",\n  // Invalid state\n  \"peer-data-[invalid]:border-error peer-data-[invalid]:border-2\",\n]);\n\nexport type DateInputFieldGroupVariants = VariantProps<typeof dateInputFieldGroupVariants>;\n\n/**\n * Date input field label — body-small, on-surface-variant.\n */\nexport const dateInputLabelVariants = cva([\"text-body-small text-on-surface-variant block mb-1\"]);\n\nexport type DateInputLabelVariants = VariantProps<typeof dateInputLabelVariants>;\n\n/**\n * Date input field error message — body-small, error color.\n */\nexport const dateInputErrorVariants = cva([\"text-body-small text-error mt-1\"]);\n\nexport type DateInputErrorVariants = VariantProps<typeof dateInputErrorVariants>;\n\n// ─── DOCKED VARIANT PRIMITIVES ───────────────────────────────────────────────\n\n/**\n * Docked trigger field group — outlined container for the date segments + icon.\n * MD3 spec: outlined text field, h-14, border-outline, flex, gap-2.\n */\nexport const dockedFieldGroupVariants = cva([\n  \"flex items-center\",\n  \"border border-outline rounded\",\n  \"h-14\", // NOTE: measurement-derived (56dp); permitted exception\n  \"px-3 gap-2\",\n  \"bg-transparent\",\n  // Focus-within: promote to primary 2dp border\n  \"focus-within:border-primary focus-within:border-2\",\n]);\n\nexport type DockedFieldGroupVariants = VariantProps<typeof dockedFieldGroupVariants>;\n\n/**\n * Docked calendar icon trigger button — carries `group/docked-trigger`.\n * MD3 spec: 40dp circle icon button.\n */\nexport const dockedTriggerVariants = cva([\n  \"relative flex items-center justify-center\",\n  \"w-10 h-10 rounded-full\", // NOTE: 40dp; permitted exception\n  \"text-on-surface-variant\",\n  \"bg-transparent border-none cursor-pointer\",\n  \"overflow-hidden\",\n  \"focus-visible:outline-none\",\n  \"transition-colors duration-spring-standard-fast-effects ease-spring-standard-fast-effects\",\n  \"group/docked-trigger\",\n]);\n\nexport type DockedTriggerVariants = VariantProps<typeof dockedTriggerVariants>;\n\n/**\n * Docked trigger state layer.\n */\nexport const dockedTriggerStateLayerVariants = cva([\n  \"pointer-events-none absolute inset-0 rounded-full opacity-0\",\n  \"bg-on-surface-variant\",\n  \"transition-opacity duration-spring-standard-fast-effects ease-spring-standard-fast-effects\",\n  \"group-data-[hovered]/docked-trigger:opacity-8\",\n  \"group-data-[focus-visible]/docked-trigger:opacity-10\",\n  \"group-data-[pressed]/docked-trigger:opacity-10\",\n]);\n\nexport type DockedTriggerStateLayerVariants = VariantProps<typeof dockedTriggerStateLayerVariants>;\n\n/**\n * Popover panel for the docked calendar.\n * MD3 spec: surface-container-high, 28dp corner, elevation-2, z-50.\n */\nexport const popoverVariants = cva([\n  \"bg-surface-container-high rounded-3xl\",\n  \"shadow-elevation-2 overflow-hidden\",\n  \"z-50 w-[360px]\",\n]);\n\nexport type PopoverVariants = VariantProps<typeof popoverVariants>;\n\n// ─── DOCKED LABEL ────────────────────────────────────────────────────────────\n\n/**\n * Label text above the docked text field.\n * MD3 spec: body-small, on-surface-variant.\n */\nexport const dockedLabelVariants = cva([\"text-body-small text-on-surface-variant block mb-1\"]);\n\nexport type DockedLabelVariants = VariantProps<typeof dockedLabelVariants>;\n\n/**\n * Date field segments container (inline segmented date input).\n * flex, items-center, flex-1, body-large text.\n */\nexport const dateFieldVariants = cva([\n  \"flex items-center flex-1\",\n  \"text-body-large text-on-surface\",\n]);\n\nexport type DateFieldVariants = VariantProps<typeof dateFieldVariants>;\n\n/**\n * Date field placeholder segment text color.\n */\nexport const dateSegmentPlaceholderVariants = cva([\"text-on-surface-variant\"]);\n\nexport type DateSegmentPlaceholderVariants = VariantProps<typeof dateSegmentPlaceholderVariants>;\n","\"use client\";\n\nimport { cn } from \"../../utils/cn\";\nimport { CalendarCell } from \"./CalendarCell\";\nimport {\n  calendarCellVariants,\n  calendarCellStateLayerVariants,\n  calendarCellFocusRingVariants,\n} from \"./DatePicker.variants\";\n\nimport type { CalendarCellComponentProps } from \"./CalendarGrid\";\n\n/**\n * StyledCalendarCell (Layer 3 slot)\n *\n * Wraps the headless `CalendarCell` with MD3 styling via CVA slot variants.\n * Injects the CVA class string as `className`, and renders the state-layer and\n * focus-ring overlays as children inside the cell (alongside the date text,\n * which the headless layer always renders).\n *\n * Architecture:\n * - `calendarCellVariants`          — 48dp circle, body-large, data-* state tokens\n *                                     Carries `group/calendar-cell`.\n * - `calendarCellStateLayerVariants` — absolute opacity overlay; responds to\n *                                     `group-data-[hovered|focus-visible|pressed]/calendar-cell`\n * - `calendarCellFocusRingVariants`  — absolute outline ring; keyboard-only\n *\n * @internal — passed to CalendarCore via `slots.CellComponent`\n */\nexport function StyledCalendarCell({ date, state }: CalendarCellComponentProps): JSX.Element {\n  return (\n    <CalendarCell date={date} state={state} className={cn(calendarCellVariants())}>\n      {/* State layer — absolute overlay responding to data-* interaction attributes */}\n      <span className={cn(calendarCellStateLayerVariants())} aria-hidden=\"true\" />\n      {/* Focus ring — keyboard-only visible outline */}\n      <span className={cn(calendarCellFocusRingVariants())} aria-hidden=\"true\" />\n    </CalendarCell>\n  );\n}\n\nStyledCalendarCell.displayName = \"StyledCalendarCell\";\n","\"use client\";\n\nimport { useRef } from \"react\";\nimport { useButton, useHover, useFocusRing, usePress, mergeProps } from \"react-aria\";\n\nimport { cn } from \"../../utils/cn\";\nimport { getInteractionDataAttributes } from \"../../utils/interactionStates\";\nimport { DropdownArrowIcon } from \"./CalendarHeader\";\nimport {\n  calendarHeaderVariants,\n  navButtonVariants,\n  navButtonStateLayerVariants,\n  navButtonFocusRingVariants,\n  calendarTitleVariants,\n  calendarTitleTextVariants,\n  calendarTitleIconVariants,\n  calendarTitleStateLayerVariants,\n} from \"./DatePicker.variants\";\n\nimport type { NavButtonComponentProps, TitleComponentProps } from \"./CalendarHeader\";\n\n/**\n * StyledNavButton (Layer 3 slot)\n *\n * MD3-styled navigation button for previous/next month.\n * 40dp circle, on-surface-variant icon, with state layer + focus ring.\n *\n * Architecture:\n * - `navButtonVariants`           — 40dp circle, on-surface-variant, group/nav-button\n * - `navButtonStateLayerVariants` — absolute opacity overlay\n * - `navButtonFocusRingVariants`  — keyboard-only outline ring\n *\n * @internal — passed to CalendarHeader via the NavButtonComponent slot\n */\nexport function StyledNavButton({\n  children,\n  isDisabled,\n  onPress,\n  \"aria-label\": ariaLabel,\n}: NavButtonComponentProps): JSX.Element {\n  const ref = useRef<HTMLButtonElement>(null);\n\n  const { buttonProps, isPressed } = useButton(\n    {\n      isDisabled: isDisabled ?? false,\n      ...(onPress ? { onPress } : {}),\n      ...(ariaLabel ? { \"aria-label\": ariaLabel } : {}),\n    },\n    ref\n  );\n  const { isFocusVisible, focusProps } = useFocusRing();\n  const { isHovered, hoverProps } = useHover({ isDisabled: isDisabled ?? false });\n\n  return (\n    <button\n      {...mergeProps(buttonProps, focusProps, hoverProps)}\n      ref={ref}\n      type=\"button\"\n      className={cn(navButtonVariants())}\n      {...getInteractionDataAttributes({\n        isHovered,\n        isFocusVisible,\n        isPressed,\n        isDisabled: isDisabled ?? false,\n      })}\n    >\n      {/* State layer */}\n      <span className={cn(navButtonStateLayerVariants())} aria-hidden=\"true\" />\n      {/* Focus ring */}\n      <span className={cn(navButtonFocusRingVariants())} aria-hidden=\"true\" />\n      {/* Icon */}\n      <span className=\"pointer-events-none relative z-10 flex items-center justify-center\">\n        {children}\n      </span>\n    </button>\n  );\n}\n\nStyledNavButton.displayName = \"StyledNavButton\";\n\n/**\n * StyledCalendarTitle (Layer 3 slot)\n *\n * MD3-styled month/year title toggle pill.\n * Pill shape, label-large, on-surface-variant, with state layer.\n *\n * Architecture:\n * - `calendarTitleVariants`           — pill, group/calendar-title\n * - `calendarTitleStateLayerVariants` — absolute opacity overlay\n *\n * @internal — passed to CalendarHeader via the TitleComponent slot\n */\nexport function StyledCalendarTitle({\n  title,\n  onClick,\n  showDropdownIndicator,\n}: TitleComponentProps): JSX.Element {\n  const ref = useRef<HTMLButtonElement>(null);\n  const { isFocusVisible, focusProps } = useFocusRing();\n  const { isHovered, hoverProps } = useHover({});\n  const { pressProps, isPressed } = usePress({});\n\n  if (onClick) {\n    return (\n      <button\n        {...mergeProps(focusProps, hoverProps, pressProps)}\n        ref={ref}\n        type=\"button\"\n        className={cn(calendarTitleVariants())}\n        aria-label={`${title}, click to select year`}\n        onClick={onClick}\n        {...getInteractionDataAttributes({ isHovered, isFocusVisible, isPressed })}\n      >\n        {/* State layer */}\n        <span className={cn(calendarTitleStateLayerVariants())} aria-hidden=\"true\" />\n        {/* Content */}\n        <h2 aria-live=\"polite\" className={cn(calendarTitleTextVariants())}>\n          {title}\n        </h2>\n        {showDropdownIndicator && (\n          <span className={cn(calendarTitleIconVariants())}>\n            <DropdownArrowIcon />\n          </span>\n        )}\n      </button>\n    );\n  }\n\n  return (\n    <div className={cn(calendarTitleVariants(), \"cursor-default\")}>\n      <h2 aria-live=\"polite\" className={cn(calendarTitleTextVariants())}>\n        {title}\n      </h2>\n    </div>\n  );\n}\n\nStyledCalendarTitle.displayName = \"StyledCalendarTitle\";\n\n/**\n * StyledCalendarHeaderRow (Layer 3 — header row wrapper)\n *\n * Applies MD3 calendarHeaderVariants (flex, px-3 py-2 layout) as a wrapper.\n * Used by the styled layer to style the `[data-calendar-header]` element.\n *\n * NOTE: The actual header DOM structure is owned by the headless CalendarHeader.\n * This variant is used by the *Styled wrappers via a minimal structural selector\n * `[&_[data-calendar-header]]` to apply layout tokens.\n */\nexport const CALENDAR_HEADER_CLASSES = calendarHeaderVariants();\n","\"use client\";\n\nimport { useRef } from \"react\";\nimport { useHover, useFocusRing, usePress, mergeProps } from \"react-aria\";\n\nimport { cn } from \"../../utils/cn\";\nimport { getInteractionDataAttributes } from \"../../utils/interactionStates\";\nimport {\n  yearItemVariants,\n  yearItemStateLayerVariants,\n  yearItemFocusRingVariants,\n} from \"./DatePicker.variants\";\n\nimport type { YearItemComponentProps } from \"./CalendarCore\";\n\n/**\n * StyledYearItem (Layer 3 slot)\n *\n * MD3-styled year selection item.\n * 88×52dp pill, body-large, on-surface-variant/on-primary for selected,\n * with state layer + focus ring.\n *\n * Architecture:\n * - `yearItemVariants`           — pill shape, body-large, data-[selected] bg-primary,\n *                                  carries `group/year-item`\n * - `yearItemStateLayerVariants` — absolute opacity overlay; switches color on selected\n * - `yearItemFocusRingVariants`  — keyboard-only outline ring\n *\n * @internal — passed to CalendarCore via `slots.YearItemComponent`\n */\nexport function StyledYearItem({\n  year,\n  isSelected,\n  onSelect,\n}: YearItemComponentProps): JSX.Element {\n  const ref = useRef<HTMLButtonElement>(null);\n  const { isFocusVisible, focusProps } = useFocusRing();\n  const { isHovered, hoverProps } = useHover({});\n  const { pressProps, isPressed } = usePress({});\n\n  return (\n    <button\n      {...mergeProps(focusProps, hoverProps, pressProps)}\n      ref={ref}\n      type=\"button\"\n      role=\"gridcell\"\n      aria-selected={isSelected}\n      className={cn(yearItemVariants())}\n      onClick={() => onSelect(year)}\n      {...getInteractionDataAttributes({\n        isHovered,\n        isFocusVisible,\n        isPressed,\n        isSelected,\n      })}\n    >\n      {/* State layer */}\n      <span className={cn(yearItemStateLayerVariants())} aria-hidden=\"true\" />\n      {/* Focus ring */}\n      <span className={cn(yearItemFocusRingVariants())} aria-hidden=\"true\" />\n      {/* Label */}\n      <span className=\"pointer-events-none relative z-10\">{year}</span>\n    </button>\n  );\n}\n\nStyledYearItem.displayName = \"StyledYearItem\";\n","\"use client\";\n\nimport { cn } from \"../../utils/cn\";\nimport { weekdayVariants } from \"./DatePicker.variants\";\n\n/**\n * StyledWeekday (Layer 3 slot)\n *\n * MD3-styled weekday column header cell.\n * body-small, on-surface-variant, 48dp width and height, centered.\n *\n * @internal — passed to CalendarCore via `slots.WeekdayComponent`\n */\nexport function StyledWeekday({ label }: { label: string }): JSX.Element {\n  return <span className={cn(weekdayVariants())}>{label}</span>;\n}\n\nStyledWeekday.displayName = \"StyledWeekday\";\n","\"use client\";\n\nimport { useRef } from \"react\";\nimport { useButton, useHover, useFocusRing, mergeProps } from \"react-aria\";\n\nimport { cn } from \"../../utils/cn\";\nimport { getInteractionDataAttributes } from \"../../utils/interactionStates\";\nimport {\n  actionButtonVariants,\n  actionButtonStateLayerVariants,\n  actionButtonFocusRingVariants,\n} from \"./DatePicker.variants\";\n\nimport type { ActionButtonSlotProps } from \"./DatePickerActions\";\n\n/**\n * StyledActionButton (Layer 3 slot)\n *\n * MD3-styled Cancel / OK / Clear text button.\n * label-large, primary color, pill shape, with state layer + focus ring.\n *\n * Architecture:\n * - `actionButtonVariants`           — pill, label-large, text-primary, group/action-button\n * - `actionButtonStateLayerVariants` — absolute opacity overlay; bg-primary\n * - `actionButtonFocusRingVariants`  — keyboard-only outline ring\n *\n * @internal — passed to DatePickerActions via `ButtonComponent` slot\n */\nexport function StyledActionButton({\n  label,\n  \"aria-label\": ariaLabel,\n  onPress,\n  isDisabled,\n  \"data-action\": dataAction,\n}: ActionButtonSlotProps): JSX.Element {\n  const ref = useRef<HTMLButtonElement>(null);\n\n  const { buttonProps, isPressed } = useButton(\n    {\n      \"aria-label\": ariaLabel ?? label,\n      isDisabled: isDisabled ?? false,\n      ...(onPress ? { onPress } : {}),\n    },\n    ref\n  );\n  const { isFocusVisible, focusProps } = useFocusRing();\n  const { isHovered, hoverProps } = useHover({ isDisabled: isDisabled ?? false });\n\n  return (\n    <button\n      {...mergeProps(buttonProps, focusProps, hoverProps)}\n      ref={ref}\n      type=\"button\"\n      data-action={dataAction}\n      className={cn(actionButtonVariants())}\n      {...getInteractionDataAttributes({\n        isHovered,\n        isFocusVisible,\n        isPressed,\n        isDisabled: isDisabled ?? false,\n      })}\n    >\n      {/* State layer */}\n      <span className={cn(actionButtonStateLayerVariants())} aria-hidden=\"true\" />\n      {/* Focus ring */}\n      <span className={cn(actionButtonFocusRingVariants())} aria-hidden=\"true\" />\n      {/* Label */}\n      <span className=\"pointer-events-none relative z-10\">{label}</span>\n    </button>\n  );\n}\n\nStyledActionButton.displayName = \"StyledActionButton\";\n","/**\n * Shared structural styles for DatePicker variants.\n *\n * These are purely layout / non-interactive element selectors. They use\n * descendant `[&_[data-x]]:` selectors, which is acceptable for structural\n * (non-interaction-state) wrappers that the headless layer owns and cannot\n * accept className props (e.g. the calendar header row, table, divider text).\n *\n * Interactive elements (cells, nav buttons, year items, action buttons, etc.)\n * are handled by injected styled slot components (StyledCalendarCell, etc.)\n * that use the two-axis CVA + group-data model.\n *\n * Motion tokens follow the MD3 rule:\n *   - Small interactive elements (< 48dp): spring-standard-fast-*\n *   - Screen-level containers (modal/popover enter/exit): legacy standard-decelerate\n */\n\n// ─── Calendar header row layout ──────────────────────────────────────────────\n\nexport const CALENDAR_HEADER_STRUCTURAL = [\n  \"[&_[data-calendar-header]]:flex\",\n  \"[&_[data-calendar-header]]:items-center\",\n  \"[&_[data-calendar-header]]:justify-between\",\n  \"[&_[data-calendar-header]]:px-3\",\n  \"[&_[data-calendar-header]]:py-2\",\n\n  // Nav group\n  \"[&_[data-calendar-nav]]:flex\",\n  \"[&_[data-calendar-nav]]:items-center\",\n  \"[&_[data-calendar-nav]]:gap-1\",\n];\n\n// ─── Calendar grid / table ────────────────────────────────────────────────────\n\nexport const CALENDAR_GRID_STRUCTURAL = [\n  // Table resets\n  \"[&_table]:border-collapse\",\n  // Center the fixed-width table so 7×48px = 336px is equally inset within 360px\n  \"[&_table]:mx-auto\",\n  \"[&_th]:p-0\",\n  \"[&_td]:p-0\",\n];\n\n// ─── Year grid container ──────────────────────────────────────────────────────\n\nexport const YEAR_GRID_STRUCTURAL = [\n  \"[&_[data-year-grid]]:grid\",\n  \"[&_[data-year-grid]]:grid-cols-3\",\n  \"[&_[data-year-grid]]:gap-2\",\n  \"[&_[data-year-grid]]:px-3\",\n  \"[&_[data-year-grid]]:py-2\",\n  \"[&_[data-year-grid]]:max-h-[280px]\",\n  \"[&_[data-year-grid]]:overflow-y-auto\",\n  \"[&_[data-year-grid]]:place-items-center\",\n];\n\n// ─── Divider ─────────────────────────────────────────────────────────────────\n\nexport const DIVIDER_STRUCTURAL = [\"[&_hr[data-divider]]:border-outline-variant\"];\n\n// ─── Action row container ─────────────────────────────────────────────────────\n\nexport const ACTION_ROW_STRUCTURAL = [\n  \"[&_[data-actions]]:flex\",\n  \"[&_[data-actions]]:items-center\",\n  \"[&_[data-actions]]:justify-end\",\n  \"[&_[data-actions]]:gap-2\",\n  \"[&_[data-actions]]:px-3\",\n  \"[&_[data-actions]]:py-2\",\n  \"[&_[data-actions]]:h-12\",\n];\n\n// ─── Docked: label above the text field ──────────────────────────────────────\n\nexport const DOCKED_LABEL_STRUCTURAL = [\n  \"[&_[data-label]]:text-body-small\",\n  \"[&_[data-label]]:text-on-surface-variant\",\n  \"[&_[data-label]]:mb-1\",\n  \"[&_[data-label]]:block\",\n];\n\n// ─── Docked: outlined field group + segments ──────────────────────────────────\n\nexport const DOCKED_FIELD_STRUCTURAL = [\n  \"[&_[data-field-group]]:flex\",\n  \"[&_[data-field-group]]:items-center\",\n  \"[&_[data-field-group]]:border\",\n  \"[&_[data-field-group]]:border-outline\",\n  \"[&_[data-field-group]]:rounded\",\n  \"[&_[data-field-group]]:h-14\",\n  \"[&_[data-field-group]]:px-3\",\n  \"[&_[data-field-group]]:gap-2\",\n  \"[&_[data-field-group]]:bg-transparent\",\n  \"[&_[data-field-group]:focus-within]:border-primary\",\n  \"[&_[data-field-group]:focus-within]:border-2\",\n\n  \"[&_[data-field]]:flex\",\n  \"[&_[data-field]]:items-center\",\n  \"[&_[data-field]]:flex-1\",\n  \"[&_[data-field]]:text-body-large\",\n  \"[&_[data-field]]:text-on-surface\",\n\n  \"[&_[data-segment]]:outline-none\",\n  \"[&_[data-segment][data-placeholder]]:text-on-surface-variant\",\n];\n\n// ─── Docked: calendar icon trigger button ────────────────────────────────────\n// Layout + interaction states via data-* attributes emitted by the headless layer.\n\nexport const DOCKED_TRIGGER_STRUCTURAL = [\n  \"[&_[data-trigger]]:relative\",\n  \"[&_[data-trigger]]:flex\",\n  \"[&_[data-trigger]]:items-center\",\n  \"[&_[data-trigger]]:justify-center\",\n  \"[&_[data-trigger]]:w-10\",\n  \"[&_[data-trigger]]:h-10\",\n  \"[&_[data-trigger]]:rounded-full\",\n  \"[&_[data-trigger]]:text-on-surface-variant\",\n  \"[&_[data-trigger]]:bg-transparent\",\n  \"[&_[data-trigger]]:border-none\",\n  \"[&_[data-trigger]]:cursor-pointer\",\n  \"[&_[data-trigger]]:transition-colors\",\n  \"[&_[data-trigger]]:duration-spring-standard-fast-effects\",\n  \"[&_[data-trigger]]:ease-spring-standard-fast-effects\",\n  // Hover: 8% overlay via bg tint (acceptable for structural trigger)\n  \"[&_[data-trigger][data-hovered]]:bg-on-surface-variant/8\",\n  \"[&_[data-trigger][data-focus-visible]]:bg-on-surface-variant/10\",\n  \"[&_[data-trigger][data-focus-visible]]:outline\",\n  \"[&_[data-trigger][data-focus-visible]]:outline-2\",\n  \"[&_[data-trigger][data-focus-visible]]:outline-secondary\",\n  \"[&_[data-trigger][data-disabled]]:text-on-surface/38\",\n  \"[&_[data-trigger][data-disabled]]:cursor-not-allowed\",\n];\n\n// ─── Docked: popover panel ────────────────────────────────────────────────────\n\nexport const DOCKED_POPOVER_STRUCTURAL = [\n  \"[&_[data-popover]]:bg-surface-container-high\",\n  \"[&_[data-popover]]:rounded-3xl\",\n  \"[&_[data-popover]]:mt-1\",\n  \"[&_[data-popover]]:shadow-elevation-2\",\n  \"[&_[data-popover]]:overflow-hidden\",\n  \"[&_[data-popover]]:z-50\",\n];\n\n// ─── Modal: dialog panel ──────────────────────────────────────────────────────\n\nexport const MODAL_DIALOG_STRUCTURAL = [\n  \"[&_[data-modal-dialog]]:bg-surface-container-high\",\n  \"[&_[data-modal-dialog]]:rounded-3xl\",\n  \"[&_[data-modal-dialog]]:overflow-hidden\",\n  \"[&_[data-modal-dialog]]:fixed\",\n  \"[&_[data-modal-dialog]]:top-1/2\",\n  \"[&_[data-modal-dialog]]:left-1/2\",\n  \"[&_[data-modal-dialog]]:-translate-x-1/2\",\n  \"[&_[data-modal-dialog]]:-translate-y-1/2\",\n  \"[&_[data-modal-dialog]]:z-50\",\n  \"[&_[data-modal-dialog]]:max-h-[90vh]\",\n  \"[&_[data-modal-dialog]]:overflow-y-auto\",\n];\n\n// ─── Modal: header layout + text ──────────────────────────────────────────────\n\nexport const MODAL_HEADER_STRUCTURAL = [\n  \"[&_[data-modal-header]]:px-6\",\n  \"[&_[data-modal-header]]:pt-4\",\n  \"[&_[data-modal-header]]:pb-3\",\n  \"[&_[data-modal-header]]:flex\",\n  \"[&_[data-modal-header]]:items-start\",\n  \"[&_[data-modal-header]]:justify-between\",\n\n  \"[&_[data-headline]]:text-label-large\",\n  \"[&_[data-headline]]:text-on-surface-variant\",\n  \"[&_[data-headline]]:m-0\",\n\n  \"[&_[data-supporting-text]]:text-headline-large\",\n  \"[&_[data-supporting-text]]:text-on-surface\",\n  \"[&_[data-supporting-text]]:mt-9\",\n  \"[&_[data-supporting-text]]:m-0\",\n];\n\n// ─── Modal-input: supporting text override (no top margin) ───────────────────\n\nexport const MODAL_INPUT_SUPPORTING_TEXT_STRUCTURAL = [\n  \"[&_[data-supporting-text]]:text-headline-large\",\n  \"[&_[data-supporting-text]]:text-on-surface\",\n  \"[&_[data-supporting-text]]:mt-4\",\n  \"[&_[data-supporting-text]]:m-0\",\n];\n\n// ─── Modal: scrim ─────────────────────────────────────────────────────────────\n\nexport const SCRIM_STRUCTURAL = [\n  \"[&_[data-scrim]]:fixed\",\n  \"[&_[data-scrim]]:inset-0\",\n  \"[&_[data-scrim]]:z-40\",\n  \"[&_[data-scrim]]:bg-scrim\",\n  \"[&_[data-scrim]]:opacity-32\",\n  \"[&_[data-scrim]]:transition-opacity\",\n  \"[&_[data-scrim]]:duration-medium2\",\n  \"[&_[data-scrim]]:ease-standard\",\n];\n\n// ─── Modal-input: date input fields ──────────────────────────────────────────\n\nexport const MODAL_INPUT_FIELD_STRUCTURAL = [\n  \"[&_[data-date-input-field]]:px-6\",\n  \"[&_[data-date-input-field]]:py-2\",\n\n  \"[&_[data-date-input-field]_[data-field]]:flex\",\n  \"[&_[data-date-input-field]_[data-field]]:items-center\",\n  \"[&_[data-date-input-field]_[data-field]]:border\",\n  \"[&_[data-date-input-field]_[data-field]]:border-outline\",\n  \"[&_[data-date-input-field]_[data-field]]:rounded-sm\",\n  \"[&_[data-date-input-field]_[data-field]]:px-4\",\n  \"[&_[data-date-input-field]_[data-field]]:py-3\",\n  \"[&_[data-date-input-field]_[data-field]]:text-body-large\",\n  \"[&_[data-date-input-field]_[data-field]]:text-on-surface\",\n\n  \"[&_[data-date-input-field]_[data-segment]]:outline-none\",\n  \"[&_[data-date-input-field]_[data-segment][data-placeholder]]:text-on-surface-variant\",\n\n  \"[&_[data-date-input-field][data-focused]_[data-field]]:border-primary\",\n  \"[&_[data-date-input-field][data-focused]_[data-field]]:border-2\",\n\n  \"[&_[data-date-input-field][data-invalid]_[data-field]]:border-error\",\n  \"[&_[data-date-input-field][data-invalid]_[data-field]]:border-2\",\n\n  \"[&_[data-date-input-field]_[data-label]]:text-body-small\",\n  \"[&_[data-date-input-field]_[data-label]]:text-on-surface-variant\",\n  \"[&_[data-date-input-field]_[data-label]]:block\",\n  \"[&_[data-date-input-field]_[data-label]]:mb-1\",\n\n  \"[&_[data-date-input-field]_[data-error-message]]:text-body-small\",\n  \"[&_[data-date-input-field]_[data-error-message]]:text-error\",\n  \"[&_[data-date-input-field]_[data-error-message]]:mt-1\",\n];\n\n// ─── Composed shared sets ─────────────────────────────────────────────────────\n\n/**\n * All structural styles shared by docked and modal calendar variants.\n * Does NOT include popover/dialog/scrim (those differ per variant).\n */\nexport const SHARED_CALENDAR_STRUCTURAL = [\n  ...CALENDAR_HEADER_STRUCTURAL,\n  ...CALENDAR_GRID_STRUCTURAL,\n  ...YEAR_GRID_STRUCTURAL,\n  ...DIVIDER_STRUCTURAL,\n  ...ACTION_ROW_STRUCTURAL,\n].join(\" \");\n\n/**\n * Structural styles applied directly on the `[data-modal-dialog]` element for\n * the modal (calendar) variant. Does NOT include the dialog surface/sizing\n * (those come from `modalDialogVariants` applied inline) or the scrim\n * (applied via `scrimClassName` on `[data-scrim]`).\n *\n * Use this on the modal dialog's `className` alongside `modalDialogVariants`.\n */\nexport const MODAL_CONTENT_STRUCTURAL = [\n  ...MODAL_HEADER_STRUCTURAL,\n  ...CALENDAR_HEADER_STRUCTURAL,\n  ...CALENDAR_GRID_STRUCTURAL,\n  ...YEAR_GRID_STRUCTURAL,\n  ...DIVIDER_STRUCTURAL,\n  ...ACTION_ROW_STRUCTURAL,\n].join(\" \");\n\n/**\n * Structural styles applied directly on the `[data-modal-dialog]` element for\n * the modal-input variant.\n *\n * Use this on the modal-input dialog's `className` alongside `modalDialogVariants`.\n */\nexport const MODAL_INPUT_CONTENT_STRUCTURAL = [\n  ...MODAL_HEADER_STRUCTURAL,\n  ...MODAL_INPUT_SUPPORTING_TEXT_STRUCTURAL,\n  ...MODAL_INPUT_FIELD_STRUCTURAL,\n  ...DIVIDER_STRUCTURAL,\n  ...ACTION_ROW_STRUCTURAL,\n].join(\" \");\n\n/**\n * Structural styles for the docked variant root (label, field, trigger only).\n * Calendar/popover styles live on the portaled popover panel — see\n * `DOCKED_POPOVER_PANEL_STRUCTURAL`.\n */\nexport const DOCKED_ROOT_STRUCTURAL = [\n  ...DOCKED_LABEL_STRUCTURAL,\n  ...DOCKED_FIELD_STRUCTURAL,\n  ...DOCKED_TRIGGER_STRUCTURAL,\n].join(\" \");\n\n/**\n * Structural styles applied directly on the portaled `[data-popover]` panel.\n * Includes shared calendar layout (header, grid, year grid, divider, actions).\n */\nexport const DOCKED_POPOVER_PANEL_STRUCTURAL = SHARED_CALENDAR_STRUCTURAL;\n\n/**\n * Structural styles for the docked variant (root + descendant popover selectors).\n * @deprecated Prefer `DOCKED_ROOT_STRUCTURAL` on root and `DOCKED_POPOVER_PANEL_STRUCTURAL`\n * on the portaled popover panel.\n */\nexport const DOCKED_STRUCTURAL = [\n  ...DOCKED_LABEL_STRUCTURAL,\n  ...DOCKED_FIELD_STRUCTURAL,\n  ...DOCKED_TRIGGER_STRUCTURAL,\n  ...DOCKED_POPOVER_STRUCTURAL,\n  ...CALENDAR_HEADER_STRUCTURAL,\n  ...CALENDAR_GRID_STRUCTURAL,\n  ...YEAR_GRID_STRUCTURAL,\n  ...DIVIDER_STRUCTURAL,\n  ...ACTION_ROW_STRUCTURAL,\n].join(\" \");\n\n/**\n * Structural styles for the modal variant.\n * @deprecated Prefer `MODAL_CONTENT_STRUCTURAL` applied on the dialog element directly.\n */\nexport const MODAL_STRUCTURAL = [\n  ...MODAL_DIALOG_STRUCTURAL,\n  ...MODAL_HEADER_STRUCTURAL,\n  ...SCRIM_STRUCTURAL,\n  ...CALENDAR_HEADER_STRUCTURAL,\n  ...CALENDAR_GRID_STRUCTURAL,\n  ...YEAR_GRID_STRUCTURAL,\n  ...DIVIDER_STRUCTURAL,\n  ...ACTION_ROW_STRUCTURAL,\n].join(\" \");\n\n/**\n * Structural styles for the modal-input variant.\n * @deprecated Prefer `MODAL_INPUT_CONTENT_STRUCTURAL` applied on the dialog element directly.\n */\nexport const MODAL_INPUT_STRUCTURAL = [\n  ...MODAL_DIALOG_STRUCTURAL,\n  ...MODAL_HEADER_STRUCTURAL,\n  // Override the supporting-text margin (modal-input has a different layout)\n  ...MODAL_INPUT_SUPPORTING_TEXT_STRUCTURAL,\n  ...SCRIM_STRUCTURAL,\n  ...MODAL_INPUT_FIELD_STRUCTURAL,\n  ...DIVIDER_STRUCTURAL,\n  ...ACTION_ROW_STRUCTURAL,\n].join(\" \");\n\n// ─── Motion styles ────────────────────────────────────────────────────────────\n\n/**\n * Screen-level motion for the docked popover container.\n * Uses legacy standard-decelerate (enter) / standard-accelerate (exit).\n * Applied directly on the portaled `[data-popover]` element when reduced motion\n * is NOT active.\n */\nexport const DOCKED_POPOVER_MOTION = [\n  \"transition-[transform,opacity]\",\n  \"duration-short3\",\n  \"ease-standard-decelerate\",\n  \"data-[exiting]:duration-short2\",\n  \"data-[exiting]:ease-standard-accelerate\",\n].join(\" \");\n\n/**\n * Screen-level motion for the docked popover container (root descendant selector).\n * @deprecated Prefer `DOCKED_POPOVER_MOTION` applied directly on the portaled popover.\n */\nexport const DOCKED_MOTION_STRUCTURAL = [\n  \"[&_[data-popover]]:transition-[transform,opacity]\",\n  \"[&_[data-popover]]:duration-short3\",\n  \"[&_[data-popover]]:ease-standard-decelerate\",\n  \"[&_[data-popover][data-exiting]]:duration-short2\",\n  \"[&_[data-popover][data-exiting]]:ease-standard-accelerate\",\n].join(\" \");\n\n/**\n * Screen-level motion for the modal dialog container.\n * Uses legacy standard-decelerate (enter) / standard-accelerate (exit).\n * Applied conditionally when reduced motion is NOT active.\n */\nexport const MODAL_MOTION_STRUCTURAL = [\n  \"[&_[data-modal-dialog]]:transition-[transform,opacity]\",\n  \"[&_[data-modal-dialog]]:duration-medium2\",\n  \"[&_[data-modal-dialog]]:ease-standard-decelerate\",\n  \"[&_[data-modal-dialog][data-exiting]]:duration-medium1\",\n  \"[&_[data-modal-dialog][data-exiting]]:ease-standard-accelerate\",\n].join(\" \");\n\n/**\n * Screen-level motion applied directly on the `[data-modal-dialog]` element.\n * Uses standard-decelerate (enter) / standard-accelerate (exit).\n * Applied conditionally when reduced motion is NOT active.\n */\nexport const MODAL_DIALOG_MOTION = [\n  \"transition-[transform,opacity]\",\n  \"duration-medium2\",\n  \"ease-standard-decelerate\",\n  \"data-[exiting]:duration-medium1\",\n  \"data-[exiting]:ease-standard-accelerate\",\n].join(\" \");\n","\"use client\";\n\nimport { forwardRef } from \"react\";\n\nimport { useReducedMotion } from \"../../hooks/useReducedMotion\";\nimport { cn } from \"../../utils/cn\";\nimport { DatePickerDocked } from \"./DatePickerDocked\";\nimport { datePickerContainerVariants, popoverVariants } from \"./DatePicker.variants\";\nimport { StyledCalendarCell } from \"./StyledCalendarCell\";\nimport { StyledNavButton, StyledCalendarTitle } from \"./StyledCalendarHeader\";\nimport { StyledYearItem } from \"./StyledYearItem\";\nimport { StyledWeekday } from \"./StyledWeekday\";\nimport { StyledActionButton } from \"./StyledActionButton\";\nimport {\n  DOCKED_ROOT_STRUCTURAL,\n  DOCKED_POPOVER_PANEL_STRUCTURAL,\n  DOCKED_POPOVER_MOTION,\n} from \"./datePickerStructuralStyles\";\n\nimport type { DatePickerDockedProps } from \"./DatePicker.types\";\n\n/**\n * Styled DatePickerDocked (Layer 3)\n *\n * Wraps the headless `DatePickerDocked` with MD3 visual styling.\n *\n * Architecture:\n * - Interactive calendar slots (cells, nav buttons, year items, action buttons)\n *   are injected as styled slot components that use the two-axis CVA +\n *   group-data interaction state model (no descendant selectors for states).\n * - Purely structural wrappers on the root (field group, label, trigger) and on\n *   the portaled popover panel (calendar header row, divider, action row) use\n *   consolidated descendant-selector strings — acceptable for layout-only,\n *   non-interactive elements.\n * - The calendar popover is portaled to `document.body` so it is never clipped\n *   by ancestor overflow containers (forms, Storybook story blocks, etc.).\n * - Motion is guarded by `useReducedMotion` and uses screen-level legacy tokens\n *   for the popover container enter/exit (standard-decelerate / standard-accelerate).\n *\n * @internal\n */\nexport const DatePickerDockedStyled = forwardRef<HTMLDivElement, DatePickerDockedProps>(\n  (props, ref) => {\n    const { className, ...rest } = props;\n    const reducedMotion = useReducedMotion();\n\n    return (\n      <DatePickerDocked\n        ref={ref}\n        {...rest}\n        className={cn(\n          datePickerContainerVariants({ variant: \"docked\" }),\n          DOCKED_ROOT_STRUCTURAL,\n          className\n        )}\n        popoverClassName={cn(\n          popoverVariants(),\n          DOCKED_POPOVER_PANEL_STRUCTURAL,\n          !reducedMotion && DOCKED_POPOVER_MOTION\n        )}\n        slots={{\n          CellComponent: StyledCalendarCell,\n          NavButtonComponent: StyledNavButton,\n          TitleComponent: StyledCalendarTitle,\n          YearItemComponent: StyledYearItem,\n          WeekdayComponent: StyledWeekday,\n        }}\n        ActionButtonComponent={StyledActionButton}\n      />\n    );\n  }\n);\n\nDatePickerDockedStyled.displayName = \"DatePickerDockedStyled\";\n","\"use client\";\n\nimport { useRef } from \"react\";\nimport { useButton } from \"react-aria\";\n\nimport type { DatePickerModalHeaderProps } from \"./DatePicker.types\";\n\n/**\n * Pencil/edit SVG icon for switching to keyboard input.\n * @internal\n */\nfunction EditIcon(): JSX.Element {\n  return (\n    <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\">\n      <path d=\"M3 17.25V21h3.75L17.81 9.94l-3.75-3.75L3 17.25zM20.71 7.04c.39-.39.39-1.02 0-1.41l-2.34-2.34c-.39-.39-1.02-.39-1.41 0l-1.83 1.83 3.75 3.75 1.83-1.83z\" />\n    </svg>\n  );\n}\n\n/**\n * Calendar SVG icon for switching to calendar view.\n * @internal\n */\nfunction CalendarIcon(): JSX.Element {\n  return (\n    <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\">\n      <path d=\"M19 3h-1V1h-2v2H8V1H6v2H5c-1.11 0-1.99.9-1.99 2L3 19c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 16H5V8h14v11zM9 10H7v2h2v-2zm4 0h-2v2h2v-2zm4 0h-2v2h2v-2z\" />\n    </svg>\n  );\n}\n\n/**\n * Headless DatePickerModalHeader (Layer 2)\n *\n * Renders the header section of a modal date picker:\n * - Headline text (\"Select date\" / \"Select dates\")\n * - Supporting text (formatted selected date, e.g., \"Mon, Aug 17\")\n * - Mode toggle icon button (calendar <-> keyboard)\n *\n * This is a headless component — it provides behavior, ARIA semantics, and\n * data attributes only. No styling classes are applied.\n *\n * @internal\n */\nexport function DatePickerModalHeader({\n  headline = \"Select date\",\n  supportingText,\n  inputMode = \"calendar\",\n  onModeToggle,\n  headlineId,\n  className,\n}: DatePickerModalHeaderProps): JSX.Element {\n  const toggleRef = useRef<HTMLButtonElement>(null);\n\n  const toggleAriaLabel =\n    inputMode === \"calendar\" ? \"Switch to keyboard input\" : \"Switch to calendar\";\n\n  const { buttonProps: toggleButtonProps } = useButton(\n    {\n      \"aria-label\": toggleAriaLabel,\n      ...(onModeToggle ? { onPress: onModeToggle } : {}),\n    },\n    toggleRef\n  );\n\n  return (\n    <div className={className} data-modal-header>\n      <div data-header-text>\n        <p data-headline id={headlineId}>\n          {headline}\n        </p>\n        {supportingText && <p data-supporting-text>{supportingText}</p>}\n      </div>\n      <button\n        {...toggleButtonProps}\n        ref={toggleRef}\n        type=\"button\"\n        data-mode-toggle\n        data-input-mode={inputMode}\n      >\n        {inputMode === \"calendar\" ? <EditIcon /> : <CalendarIcon />}\n      </button>\n    </div>\n  );\n}\n\nDatePickerModalHeader.displayName = \"DatePickerModalHeader\";\n","\"use client\";\n\nimport { forwardRef, useCallback, useEffect, useId, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { useOverlay, usePreventScroll, FocusScope, useDialog } from \"react-aria\";\nimport { useOverlayTriggerState } from \"react-stately\";\n\nimport { CalendarCore } from \"./CalendarCore\";\nimport { DatePickerModalHeader } from \"./DatePickerModalHeader\";\nimport { DatePickerActions } from \"./DatePickerActions\";\n\nimport type { DateValue } from \"@internationalized/date\";\nimport type { DatePickerModalProps } from \"./DatePicker.types\";\n\n/**\n * Headless DatePickerModal (Layer 2)\n *\n * Full-overlay modal dialog for date selection, supporting both single-date\n * and date-range modes. Follows the MD3 Modal Date Picker specification.\n *\n * Features:\n * - Portal rendering for proper z-index stacking\n * - Focus trapping within the dialog\n * - Escape key and scrim click to dismiss\n * - `role=\"dialog\"` with `aria-modal=\"true\"` and `aria-labelledby`\n * - Header with headline, supporting text, and mode toggle\n * - CalendarCore for single date selection\n * - RangeCalendar for date range selection\n * - Action buttons (Clear, Cancel, OK)\n *\n * This is a headless component — it provides behavior, ARIA semantics, and\n * data attributes only. No styling classes are applied.\n *\n * @example\n * ```tsx\n * <DatePickerModal\n *   isOpen={open}\n *   onOpenChange={setOpen}\n *   onChange={(date) => console.log(date)}\n * />\n *\n * <DatePickerModal\n *   selectionMode=\"range\"\n *   isOpen={open}\n *   onOpenChange={setOpen}\n *   onRangeChange={(range) => console.log(range)}\n * />\n * ```\n */\nexport const DatePickerModal = forwardRef<HTMLDivElement, DatePickerModalProps>(\n  (props, forwardedRef) => {\n    const {\n      selectionMode = \"single\",\n      value,\n      defaultValue,\n      rangeValue,\n      defaultRangeValue,\n      onChange,\n      onRangeChange,\n      minValue,\n      maxValue,\n      isDateUnavailable,\n      isOpen,\n      defaultOpen = false,\n      onOpenChange,\n      headline,\n      supportingText,\n      cancelLabel = \"Cancel\",\n      confirmLabel = \"OK\",\n      clearLabel = \"Clear\",\n      showClear = true,\n      onCancel,\n      onConfirm,\n      onClear,\n      className,\n      scrimClassName,\n      slots,\n      ActionButtonComponent,\n    } = props;\n\n    const internalRef = useRef<HTMLDivElement>(null);\n    const ref = (forwardedRef ?? internalRef) as React.RefObject<HTMLDivElement>;\n    const dialogRef = useRef<HTMLDivElement>(null);\n\n    const headlineId = useId();\n    const defaultHeadline = selectionMode === \"range\" ? \"Select dates\" : \"Select date\";\n    const resolvedHeadline = headline ?? defaultHeadline;\n\n    // ── Open/close state ─────────────────────────────────────────────────────\n\n    const state = useOverlayTriggerState({\n      ...(isOpen !== undefined ? { isOpen } : {}),\n      defaultOpen,\n      ...(onOpenChange ? { onOpenChange } : {}),\n    });\n\n    // ── Internal selection state ─────────────────────────────────────────────\n\n    const [internalValue, setInternalValue] = useState<DateValue | null>(\n      value ?? defaultValue ?? null\n    );\n    const [internalRangeValue, setInternalRangeValue] = useState<{\n      start: DateValue;\n      end: DateValue;\n    } | null>(rangeValue ?? defaultRangeValue ?? null);\n\n    const [inputMode, setInputMode] = useState<\"calendar\" | \"keyboard\">(\"calendar\");\n\n    // Sync controlled value\n    useEffect(() => {\n      if (value !== undefined) {\n        setInternalValue(value);\n      }\n    }, [value]);\n\n    useEffect(() => {\n      if (rangeValue !== undefined) {\n        setInternalRangeValue(rangeValue);\n      }\n    }, [rangeValue]);\n\n    // Store value at time of open for cancel/revert\n    const valueOnOpenRef = useRef<DateValue | null>(null);\n    const rangeOnOpenRef = useRef<{ start: DateValue; end: DateValue } | null>(null);\n\n    useEffect(() => {\n      if (state.isOpen) {\n        valueOnOpenRef.current = internalValue;\n        rangeOnOpenRef.current = internalRangeValue;\n      }\n    }, [state.isOpen]); // eslint-disable-line react-hooks/exhaustive-deps\n\n    // ── Handlers ─────────────────────────────────────────────────────────────\n\n    const handleSingleChange = useCallback((newValue: DateValue) => {\n      setInternalValue(newValue);\n    }, []);\n\n    const handleRangeChange = useCallback((newRange: { start: DateValue; end: DateValue }) => {\n      setInternalRangeValue(newRange);\n    }, []);\n\n    const handleConfirm = useCallback(() => {\n      if (selectionMode === \"single\") {\n        onChange?.(internalValue);\n        onConfirm?.(internalValue);\n      } else {\n        onRangeChange?.(internalRangeValue);\n        onConfirm?.(internalRangeValue);\n      }\n      state.close();\n    }, [\n      selectionMode,\n      internalValue,\n      internalRangeValue,\n      onChange,\n      onRangeChange,\n      onConfirm,\n      state,\n    ]);\n\n    const handleCancel = useCallback(() => {\n      setInternalValue(valueOnOpenRef.current);\n      setInternalRangeValue(rangeOnOpenRef.current);\n      onCancel?.();\n      state.close();\n    }, [onCancel, state]);\n\n    const handleClear = useCallback(() => {\n      setInternalValue(null);\n      setInternalRangeValue(null);\n      onClear?.();\n    }, [onClear]);\n\n    const handleModeToggle = useCallback(() => {\n      setInputMode((prev) => (prev === \"calendar\" ? \"keyboard\" : \"calendar\"));\n    }, []);\n\n    const handleClose = useCallback(() => {\n      handleCancel();\n    }, [handleCancel]);\n\n    // ── Format supporting text ───────────────────────────────────────────────\n\n    const resolvedSupportingText = (() => {\n      if (supportingText !== undefined) return supportingText;\n      if (selectionMode === \"single\" && internalValue) {\n        const date = internalValue;\n        const formatter = new Intl.DateTimeFormat(\"en-US\", {\n          weekday: \"short\",\n          month: \"short\",\n          day: \"numeric\",\n        });\n        return formatter.format(new Date(date.year, date.month - 1, date.day));\n      }\n      if (selectionMode === \"range\" && internalRangeValue) {\n        const formatter = new Intl.DateTimeFormat(\"en-US\", {\n          month: \"short\",\n          day: \"numeric\",\n        });\n        const start = formatter.format(\n          new Date(\n            internalRangeValue.start.year,\n            internalRangeValue.start.month - 1,\n            internalRangeValue.start.day\n          )\n        );\n        const end = formatter.format(\n          new Date(\n            internalRangeValue.end.year,\n            internalRangeValue.end.month - 1,\n            internalRangeValue.end.day\n          )\n        );\n        return `${start} – ${end}`;\n      }\n      return undefined;\n    })();\n\n    // ── Portal gate ──────────────────────────────────────────────────────────\n\n    if (!state.isOpen) {\n      return null;\n    }\n\n    if (typeof document === \"undefined\") {\n      return null;\n    }\n\n    // ── Render ───────────────────────────────────────────────────────────────\n\n    const content = (\n      <FocusScope contain restoreFocus autoFocus>\n        <ModalOverlay\n          dialogRef={dialogRef}\n          headlineId={headlineId}\n          onClose={handleClose}\n          {...(className ? { className } : {})}\n          {...(scrimClassName ? { scrimClassName } : {})}\n          isOpen={state.isOpen}\n        >\n          <DatePickerModalHeader\n            headline={resolvedHeadline}\n            {...(resolvedSupportingText ? { supportingText: resolvedSupportingText } : {})}\n            inputMode={inputMode}\n            onModeToggle={handleModeToggle}\n            headlineId={headlineId}\n          />\n          <hr data-divider />\n          {selectionMode === \"single\" ? (\n            <CalendarCore\n              aria-label=\"Calendar\"\n              value={internalValue}\n              onChange={handleSingleChange}\n              {...(minValue ? { minValue } : {})}\n              {...(maxValue ? { maxValue } : {})}\n              {...(isDateUnavailable ? { isDateUnavailable } : {})}\n              {...(slots ? { slots } : {})}\n            />\n          ) : (\n            <CalendarCore\n              aria-label=\"Range calendar\"\n              selectionMode=\"range\"\n              {...(internalRangeValue ? { rangeValue: internalRangeValue } : {})}\n              {...(internalRangeValue ? { defaultRangeValue: internalRangeValue } : {})}\n              onRangeChange={handleRangeChange}\n              {...(minValue ? { minValue } : {})}\n              {...(maxValue ? { maxValue } : {})}\n              {...(isDateUnavailable ? { isDateUnavailable } : {})}\n              {...(slots ? { slots } : {})}\n            />\n          )}\n          <DatePickerActions\n            cancelLabel={cancelLabel}\n            confirmLabel={confirmLabel}\n            clearLabel={clearLabel}\n            showClear={showClear}\n            onCancel={handleCancel}\n            onConfirm={handleConfirm}\n            onClear={handleClear}\n            {...(ActionButtonComponent ? { ButtonComponent: ActionButtonComponent } : {})}\n          />\n        </ModalOverlay>\n      </FocusScope>\n    );\n\n    return createPortal(\n      <div ref={ref} data-variant=\"modal\" data-selection-mode={selectionMode} data-open>\n        {content}\n      </div>,\n      document.body\n    ) as React.ReactElement;\n  }\n);\n\nDatePickerModal.displayName = \"DatePickerModal\";\n\n// ─── Internal ModalOverlay ───────────────────────────────────────────────────\n\ninterface ModalOverlayProps {\n  dialogRef: React.RefObject<HTMLDivElement>;\n  headlineId: string;\n  onClose: () => void;\n  className?: string;\n  scrimClassName?: string;\n  isOpen: boolean;\n  children: React.ReactNode;\n}\n\n/**\n * Internal modal overlay that wires useDialog, useOverlay, usePreventScroll.\n * Renders scrim + dialog panel with proper ARIA attributes.\n * @internal\n */\nfunction ModalOverlay({\n  dialogRef,\n  headlineId,\n  onClose,\n  className,\n  scrimClassName,\n  isOpen,\n  children,\n}: ModalOverlayProps): JSX.Element {\n  usePreventScroll();\n\n  const { dialogProps } = useDialog(\n    {\n      \"aria-labelledby\": headlineId,\n    },\n    dialogRef\n  );\n\n  const { overlayProps } = useOverlay(\n    {\n      isOpen,\n      onClose,\n      isDismissable: true,\n      shouldCloseOnBlur: false,\n    },\n    dialogRef\n  );\n\n  return (\n    <>\n      <div data-scrim aria-hidden=\"true\" onClick={onClose} className={scrimClassName} />\n      <div\n        {...overlayProps}\n        {...dialogProps}\n        ref={dialogRef}\n        role=\"dialog\"\n        aria-modal=\"true\"\n        aria-labelledby={headlineId}\n        className={className}\n        data-modal-dialog\n      >\n        {children}\n      </div>\n    </>\n  );\n}\n\nModalOverlay.displayName = \"ModalOverlay\";\n","\"use client\";\n\nimport { forwardRef } from \"react\";\n\nimport { useReducedMotion } from \"../../hooks/useReducedMotion\";\nimport { cn } from \"../../utils/cn\";\nimport { DatePickerModal } from \"./DatePickerModal\";\nimport { modalDialogVariants, scrimVariants } from \"./DatePicker.variants\";\nimport { StyledCalendarCell } from \"./StyledCalendarCell\";\nimport { StyledNavButton, StyledCalendarTitle } from \"./StyledCalendarHeader\";\nimport { StyledYearItem } from \"./StyledYearItem\";\nimport { StyledWeekday } from \"./StyledWeekday\";\nimport { StyledActionButton } from \"./StyledActionButton\";\nimport { MODAL_CONTENT_STRUCTURAL, MODAL_DIALOG_MOTION } from \"./datePickerStructuralStyles\";\n\nimport type { DatePickerModalProps } from \"./DatePicker.types\";\n\n/**\n * Styled DatePickerModal (Layer 3)\n *\n * Wraps the headless `DatePickerModal` with MD3 visual styling.\n *\n * Architecture:\n * - `className` is applied directly on the `[data-modal-dialog]` element, so\n *   `modalDialogVariants` provides `fixed` centering immediately — no descendant\n *   selectors needed for the dialog surface or positioning.\n * - `scrimClassName` is applied directly on the `[data-scrim]` element via the\n *   new `scrimClassName` headless prop — `scrimVariants()` styles work correctly.\n * - Interactive calendar slots (cells, nav buttons, year items, action buttons)\n *   are injected as styled slot components using the two-axis CVA +\n *   group-data interaction state model.\n * - Purely structural content inside the dialog (header, calendar layout, divider,\n *   action row) uses `MODAL_CONTENT_STRUCTURAL` descendant selectors — acceptable\n *   since they are layout-only, non-interactive wrappers.\n * - Motion is guarded by `useReducedMotion` and uses screen-level legacy tokens\n *   for the modal dialog container enter/exit.\n *\n * @internal\n */\nexport const DatePickerModalStyled = forwardRef<HTMLDivElement, DatePickerModalProps>(\n  (props, ref) => {\n    const { className, ...rest } = props;\n    const reducedMotion = useReducedMotion();\n\n    return (\n      <DatePickerModal\n        ref={ref}\n        {...rest}\n        className={cn(\n          modalDialogVariants({ variant: \"modal\" }),\n          MODAL_CONTENT_STRUCTURAL,\n          !reducedMotion && MODAL_DIALOG_MOTION,\n          className\n        )}\n        scrimClassName={cn(scrimVariants())}\n        slots={{\n          CellComponent: StyledCalendarCell,\n          NavButtonComponent: StyledNavButton,\n          TitleComponent: StyledCalendarTitle,\n          YearItemComponent: StyledYearItem,\n          WeekdayComponent: StyledWeekday,\n        }}\n        ActionButtonComponent={StyledActionButton}\n      />\n    );\n  }\n);\n\nDatePickerModalStyled.displayName = \"DatePickerModalStyled\";\n","\"use client\";\n\nimport { forwardRef, useId, useRef, useState } from \"react\";\nimport { useDateField, useDateSegment, useLocale } from \"react-aria\";\nimport { useDateFieldState } from \"react-stately\";\nimport { createCalendar } from \"@internationalized/date\";\n\nimport type { DateSegment as DateSegmentType } from \"react-stately\";\nimport type { DateInputFieldProps } from \"./DatePicker.types\";\n\n/**\n * Internal component for rendering a single editable date segment.\n * @internal\n */\nfunction DateInputSegment({\n  segment,\n  state,\n}: {\n  segment: DateSegmentType;\n  state: ReturnType<typeof useDateFieldState>;\n}): JSX.Element {\n  const ref = useRef<HTMLDivElement>(null);\n  const { segmentProps } = useDateSegment(segment, state, ref);\n\n  return (\n    <div\n      {...segmentProps}\n      ref={ref}\n      data-segment={segment.type}\n      data-placeholder={segment.isPlaceholder || undefined}\n    >\n      {segment.text}\n    </div>\n  );\n}\n\n/**\n * Headless DateInputField (Layer 2)\n *\n * An outlined text field for manual date entry with validation.\n * Wraps `useDateField` from React Aria for segmented date input behavior.\n * Renders as an outlined text field pattern with label, input area,\n * and supporting/error text.\n *\n * This is a headless component — it provides behavior, ARIA semantics, and\n * data attributes only. No styling classes are applied.\n *\n * @example\n * ```tsx\n * <DateInputField\n *   label=\"Date\"\n *   placeholder=\"mm/dd/yyyy\"\n *   onChange={(date) => console.log(date)}\n * />\n * ```\n *\n * @internal\n */\nexport const DateInputField = forwardRef<HTMLDivElement, DateInputFieldProps>(\n  (props, forwardedRef) => {\n    const {\n      value,\n      defaultValue,\n      onChange,\n      label,\n      placeholder = \"mm/dd/yyyy\",\n      isDisabled = false,\n      isReadOnly = false,\n      isRequired = false,\n      minValue,\n      maxValue,\n      placeholderValue,\n      granularity = \"day\",\n      isInvalid: externalIsInvalid,\n      errorMessage,\n      autoFocus = false,\n      className,\n    } = props;\n\n    const { locale } = useLocale();\n    const internalRef = useRef<HTMLDivElement>(null);\n    const ref = (forwardedRef ?? internalRef) as React.RefObject<HTMLDivElement>;\n    const errorId = useId();\n\n    const [isFocused, setIsFocused] = useState(false);\n\n    const state = useDateFieldState({\n      ...(value !== undefined ? { value } : {}),\n      ...(defaultValue !== undefined ? { defaultValue } : {}),\n      ...(onChange ? { onChange } : {}),\n      ...(minValue ? { minValue } : {}),\n      ...(maxValue ? { maxValue } : {}),\n      ...(placeholderValue ? { placeholderValue } : {}),\n      ...(props[\"aria-label\"] ? { \"aria-label\": props[\"aria-label\"] } : {}),\n      ...(props[\"aria-labelledby\"] ? { \"aria-labelledby\": props[\"aria-labelledby\"] } : {}),\n      ...(label ? { label } : {}),\n      isDisabled,\n      isReadOnly,\n      isRequired,\n      granularity: granularity as \"day\",\n      locale,\n      createCalendar,\n    });\n\n    const isInvalid = externalIsInvalid ?? state.isInvalid;\n\n    const { fieldProps, labelProps } = useDateField(\n      {\n        ...(value !== undefined ? { value } : {}),\n        ...(defaultValue !== undefined ? { defaultValue } : {}),\n        ...(onChange ? { onChange } : {}),\n        ...(minValue ? { minValue } : {}),\n        ...(maxValue ? { maxValue } : {}),\n        ...(placeholderValue ? { placeholderValue } : {}),\n        ...(props[\"aria-label\"] ? { \"aria-label\": props[\"aria-label\"] } : {}),\n        ...(props[\"aria-labelledby\"] ? { \"aria-labelledby\": props[\"aria-labelledby\"] } : {}),\n        ...(label ? { label } : {}),\n        isDisabled,\n        isReadOnly,\n        isRequired,\n        granularity: granularity as \"day\",\n        autoFocus,\n        ...(isInvalid ? { \"aria-describedby\": errorId } : {}),\n      },\n      state,\n      ref\n    );\n\n    return (\n      <div\n        className={className}\n        aria-invalid={isInvalid || undefined}\n        data-invalid={isInvalid || undefined}\n        data-focused={isFocused || undefined}\n        data-disabled={isDisabled || undefined}\n        data-date-input-field\n      >\n        {label && (\n          <label {...labelProps} data-label>\n            {label}\n          </label>\n        )}\n        <div\n          {...fieldProps}\n          ref={ref}\n          role=\"group\"\n          aria-describedby={isInvalid && errorMessage ? errorId : undefined}\n          data-field\n          data-placeholder-text={placeholder}\n          onFocus={(e) => {\n            setIsFocused(true);\n            fieldProps.onFocus?.(e);\n          }}\n          onBlur={(e) => {\n            setIsFocused(false);\n            fieldProps.onBlur?.(e);\n          }}\n        >\n          {state.segments.map((segment, i) => (\n            <DateInputSegment key={i} segment={segment} state={state} />\n          ))}\n        </div>\n        {isInvalid && errorMessage && (\n          <p id={errorId} data-error-message role=\"alert\">\n            {errorMessage}\n          </p>\n        )}\n      </div>\n    );\n  }\n);\n\nDateInputField.displayName = \"DateInputField\";\n","\"use client\";\n\nimport { forwardRef, useCallback, useEffect, useId, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { useOverlay, usePreventScroll, FocusScope, useDialog } from \"react-aria\";\nimport { useOverlayTriggerState } from \"react-stately\";\n\nimport { DateInputField } from \"./DateInputField\";\nimport { DatePickerModalHeader } from \"./DatePickerModalHeader\";\nimport { DatePickerActions } from \"./DatePickerActions\";\n\nimport type { DateValue } from \"@internationalized/date\";\nimport type { DatePickerModalInputProps } from \"./DatePicker.types\";\n\n/**\n * Headless DatePickerModalInput (Layer 2)\n *\n * Modal dialog for manual keyboard entry of dates via outlined text fields.\n * Supports single-date and range-date input modes with validation.\n *\n * Features:\n * - Portal rendering for proper z-index stacking\n * - Focus trapping within the dialog\n * - Auto-focus first input field on open\n * - Escape key and scrim click to dismiss\n * - `role=\"dialog\"` with `aria-modal=\"true\"` and `aria-labelledby`\n * - Header with headline, supporting text, and mode toggle\n * - One or two outlined date input fields\n * - Validation feedback for invalid date input\n * - OK button disabled when input is invalid\n * - Action buttons (Cancel, OK)\n *\n * This is a headless component — it provides behavior, ARIA semantics, and\n * data attributes only. No styling classes are applied.\n *\n * @example\n * ```tsx\n * <DatePickerModalInput\n *   isOpen={open}\n *   onOpenChange={setOpen}\n *   onChange={(date) => console.log(date)}\n * />\n *\n * <DatePickerModalInput\n *   selectionMode=\"range\"\n *   isOpen={open}\n *   onOpenChange={setOpen}\n *   onRangeChange={(range) => console.log(range)}\n * />\n * ```\n */\nexport const DatePickerModalInput = forwardRef<HTMLDivElement, DatePickerModalInputProps>(\n  (props, forwardedRef) => {\n    const {\n      selectionMode = \"single\",\n      value,\n      defaultValue,\n      rangeValue,\n      defaultRangeValue,\n      onChange,\n      onRangeChange,\n      minValue,\n      maxValue,\n      isOpen,\n      defaultOpen = false,\n      onOpenChange,\n      headline,\n      supportingText,\n      cancelLabel = \"Cancel\",\n      confirmLabel = \"OK\",\n      onCancel,\n      onConfirm,\n      onModeToggle,\n      className,\n      scrimClassName,\n      ActionButtonComponent,\n    } = props;\n\n    const internalRef = useRef<HTMLDivElement>(null);\n    const ref = (forwardedRef ?? internalRef) as React.RefObject<HTMLDivElement>;\n    const dialogRef = useRef<HTMLDivElement>(null);\n\n    const headlineId = useId();\n\n    const defaultHeadline = selectionMode === \"range\" ? \"Select dates\" : \"Select date\";\n    const resolvedHeadline = headline ?? defaultHeadline;\n\n    const defaultSupportingText = selectionMode === \"range\" ? \"Enter dates\" : \"Enter date\";\n    const resolvedSupportingText = supportingText ?? defaultSupportingText;\n\n    // ── Open/close state ─────────────────────────────────────────────────────\n\n    const state = useOverlayTriggerState({\n      ...(isOpen !== undefined ? { isOpen } : {}),\n      defaultOpen,\n      ...(onOpenChange ? { onOpenChange } : {}),\n    });\n\n    // ── Internal selection state ─────────────────────────────────────────────\n\n    const [internalValue, setInternalValue] = useState<DateValue | null>(\n      value ?? defaultValue ?? null\n    );\n    const [internalStartValue, setInternalStartValue] = useState<DateValue | null>(\n      rangeValue?.start ?? defaultRangeValue?.start ?? null\n    );\n    const [internalEndValue, setInternalEndValue] = useState<DateValue | null>(\n      rangeValue?.end ?? defaultRangeValue?.end ?? null\n    );\n\n    // Sync controlled values\n    useEffect(() => {\n      if (value !== undefined) {\n        setInternalValue(value);\n      }\n    }, [value]);\n\n    useEffect(() => {\n      if (rangeValue !== undefined) {\n        setInternalStartValue(rangeValue?.start ?? null);\n        setInternalEndValue(rangeValue?.end ?? null);\n      }\n    }, [rangeValue]);\n\n    // Store value at time of open for cancel/revert\n    const valueOnOpenRef = useRef<DateValue | null>(null);\n    const startOnOpenRef = useRef<DateValue | null>(null);\n    const endOnOpenRef = useRef<DateValue | null>(null);\n\n    useEffect(() => {\n      if (state.isOpen) {\n        valueOnOpenRef.current = internalValue;\n        startOnOpenRef.current = internalStartValue;\n        endOnOpenRef.current = internalEndValue;\n      }\n    }, [state.isOpen]); // eslint-disable-line react-hooks/exhaustive-deps\n\n    // ── Validation ───────────────────────────────────────────────────────────\n\n    const isDateValid = useCallback(\n      (date: DateValue | null): boolean => {\n        if (!date) return false;\n        if (minValue && date.compare(minValue) < 0) return false;\n        if (maxValue && date.compare(maxValue) > 0) return false;\n        return true;\n      },\n      [minValue, maxValue]\n    );\n\n    const isSingleValid = selectionMode === \"single\" && isDateValid(internalValue);\n\n    const isRangeValid = (() => {\n      if (selectionMode !== \"range\") return false;\n      if (!internalStartValue || !internalEndValue) return false;\n      if (!isDateValid(internalStartValue) || !isDateValid(internalEndValue)) return false;\n      if (internalEndValue.compare(internalStartValue) < 0) return false;\n      return true;\n    })();\n\n    const isFormValid = selectionMode === \"single\" ? isSingleValid : isRangeValid;\n\n    // ── Handlers ─────────────────────────────────────────────────────────────\n\n    const handleSingleChange = useCallback((newValue: DateValue | null) => {\n      setInternalValue(newValue);\n    }, []);\n\n    const handleStartChange = useCallback((newValue: DateValue | null) => {\n      setInternalStartValue(newValue);\n    }, []);\n\n    const handleEndChange = useCallback((newValue: DateValue | null) => {\n      setInternalEndValue(newValue);\n    }, []);\n\n    const handleConfirm = useCallback(() => {\n      if (!isFormValid) return;\n\n      if (selectionMode === \"single\") {\n        onChange?.(internalValue);\n        onConfirm?.(internalValue);\n      } else {\n        const range =\n          internalStartValue && internalEndValue\n            ? { start: internalStartValue, end: internalEndValue }\n            : null;\n        onRangeChange?.(range);\n        onConfirm?.(range);\n      }\n      state.close();\n    }, [\n      isFormValid,\n      selectionMode,\n      internalValue,\n      internalStartValue,\n      internalEndValue,\n      onChange,\n      onRangeChange,\n      onConfirm,\n      state,\n    ]);\n\n    const handleCancel = useCallback(() => {\n      setInternalValue(valueOnOpenRef.current);\n      setInternalStartValue(startOnOpenRef.current);\n      setInternalEndValue(endOnOpenRef.current);\n      onCancel?.();\n      state.close();\n    }, [onCancel, state]);\n\n    const handleModeToggle = useCallback(() => {\n      onModeToggle?.();\n    }, [onModeToggle]);\n\n    const handleClose = useCallback(() => {\n      handleCancel();\n    }, [handleCancel]);\n\n    // ── Validation error messages ────────────────────────────────────────────\n\n    const getSingleErrorMessage = (): string | undefined => {\n      if (!internalValue) return undefined;\n      if (minValue && internalValue.compare(minValue) < 0) {\n        return \"Date is before minimum allowed date\";\n      }\n      if (maxValue && internalValue.compare(maxValue) > 0) {\n        return \"Date is after maximum allowed date\";\n      }\n      return undefined;\n    };\n\n    const getStartErrorMessage = (): string | undefined => {\n      if (!internalStartValue) return undefined;\n      if (minValue && internalStartValue.compare(minValue) < 0) {\n        return \"Date is before minimum allowed date\";\n      }\n      if (maxValue && internalStartValue.compare(maxValue) > 0) {\n        return \"Date is after maximum allowed date\";\n      }\n      return undefined;\n    };\n\n    const getEndErrorMessage = (): string | undefined => {\n      if (!internalEndValue) return undefined;\n      if (minValue && internalEndValue.compare(minValue) < 0) {\n        return \"Date is before minimum allowed date\";\n      }\n      if (maxValue && internalEndValue.compare(maxValue) > 0) {\n        return \"Date is after maximum allowed date\";\n      }\n      if (internalStartValue && internalEndValue.compare(internalStartValue) < 0) {\n        return \"End date must be after start date\";\n      }\n      return undefined;\n    };\n\n    const singleErrorMessage = getSingleErrorMessage();\n    const startErrorMessage = getStartErrorMessage();\n    const endErrorMessage = getEndErrorMessage();\n\n    const isSingleInvalid = !!singleErrorMessage;\n    const isStartInvalid = !!startErrorMessage;\n    const isEndInvalid = !!endErrorMessage;\n\n    // ── Portal gate ──────────────────────────────────────────────────────────\n\n    if (!state.isOpen) {\n      return null;\n    }\n\n    if (typeof document === \"undefined\") {\n      return null;\n    }\n\n    // ── Render ───────────────────────────────────────────────────────────────\n\n    const content = (\n      <FocusScope contain restoreFocus autoFocus>\n        <ModalInputOverlay\n          dialogRef={dialogRef}\n          headlineId={headlineId}\n          onClose={handleClose}\n          {...(className ? { className } : {})}\n          {...(scrimClassName ? { scrimClassName } : {})}\n          isOpen={state.isOpen}\n        >\n          <DatePickerModalHeader\n            headline={resolvedHeadline}\n            supportingText={resolvedSupportingText}\n            inputMode=\"keyboard\"\n            onModeToggle={handleModeToggle}\n            headlineId={headlineId}\n          />\n          <hr data-divider />\n          {selectionMode === \"single\" ? (\n            <DateInputField\n              label=\"Date\"\n              placeholder=\"mm/dd/yyyy\"\n              value={internalValue}\n              onChange={handleSingleChange}\n              {...(minValue ? { minValue } : {})}\n              {...(maxValue ? { maxValue } : {})}\n              isInvalid={isSingleInvalid}\n              errorMessage={singleErrorMessage}\n              autoFocus\n            />\n          ) : (\n            <>\n              <DateInputField\n                label=\"Start date\"\n                placeholder=\"mm/dd/yyyy\"\n                value={internalStartValue}\n                onChange={handleStartChange}\n                {...(minValue ? { minValue } : {})}\n                {...(maxValue ? { maxValue } : {})}\n                isInvalid={isStartInvalid}\n                errorMessage={startErrorMessage}\n                autoFocus\n              />\n              <DateInputField\n                label=\"End date\"\n                placeholder=\"mm/dd/yyyy\"\n                value={internalEndValue}\n                onChange={handleEndChange}\n                {...(minValue ? { minValue } : {})}\n                {...(maxValue ? { maxValue } : {})}\n                isInvalid={isEndInvalid}\n                errorMessage={endErrorMessage}\n              />\n            </>\n          )}\n          <DatePickerActions\n            cancelLabel={cancelLabel}\n            confirmLabel={confirmLabel}\n            onCancel={handleCancel}\n            onConfirm={handleConfirm}\n            isConfirmDisabled={!isFormValid}\n            {...(ActionButtonComponent ? { ButtonComponent: ActionButtonComponent } : {})}\n          />\n        </ModalInputOverlay>\n      </FocusScope>\n    );\n\n    return createPortal(\n      <div ref={ref} data-variant=\"modal-input\" data-selection-mode={selectionMode} data-open>\n        {content}\n      </div>,\n      document.body\n    ) as React.ReactElement;\n  }\n);\n\nDatePickerModalInput.displayName = \"DatePickerModalInput\";\n\n// ─── Internal ModalInputOverlay ─────────────────────────────────────────────\n\ninterface ModalInputOverlayProps {\n  dialogRef: React.RefObject<HTMLDivElement>;\n  headlineId: string;\n  onClose: () => void;\n  className?: string;\n  scrimClassName?: string;\n  isOpen: boolean;\n  children: React.ReactNode;\n}\n\n/**\n * Internal modal overlay for the modal input variant.\n * Wires useDialog, useOverlay, usePreventScroll.\n * @internal\n */\nfunction ModalInputOverlay({\n  dialogRef,\n  headlineId,\n  onClose,\n  className,\n  scrimClassName,\n  isOpen,\n  children,\n}: ModalInputOverlayProps): JSX.Element {\n  usePreventScroll();\n\n  const { dialogProps } = useDialog(\n    {\n      \"aria-labelledby\": headlineId,\n    },\n    dialogRef\n  );\n\n  const { overlayProps } = useOverlay(\n    {\n      isOpen,\n      onClose,\n      isDismissable: true,\n      shouldCloseOnBlur: false,\n    },\n    dialogRef\n  );\n\n  return (\n    <>\n      <div data-scrim aria-hidden=\"true\" onClick={onClose} className={scrimClassName} />\n      <div\n        {...overlayProps}\n        {...dialogProps}\n        ref={dialogRef}\n        role=\"dialog\"\n        aria-modal=\"true\"\n        aria-labelledby={headlineId}\n        className={className}\n        data-modal-dialog\n      >\n        {children}\n      </div>\n    </>\n  );\n}\n\nModalInputOverlay.displayName = \"ModalInputOverlay\";\n","\"use client\";\n\nimport { forwardRef } from \"react\";\n\nimport { cn } from \"../../utils/cn\";\nimport { DatePickerModalInput } from \"./DatePickerModalInput\";\nimport { modalDialogVariants, scrimVariants } from \"./DatePicker.variants\";\nimport { StyledActionButton } from \"./StyledActionButton\";\nimport { MODAL_INPUT_CONTENT_STRUCTURAL } from \"./datePickerStructuralStyles\";\n\nimport type { DatePickerModalInputProps } from \"./DatePicker.types\";\n\n/**\n * Styled DatePickerModalInput (Layer 3)\n *\n * Wraps the headless `DatePickerModalInput` with MD3 visual styling.\n *\n * Architecture:\n * - `className` is applied directly on the `[data-modal-dialog]` element, so\n *   `modalDialogVariants` provides `fixed` centering immediately — no descendant\n *   selectors needed for the dialog surface or positioning.\n * - `scrimClassName` is applied directly on the `[data-scrim]` element via the\n *   new `scrimClassName` headless prop — `scrimVariants()` styles work correctly.\n * - Action buttons are injected via the `ActionButtonComponent` slot using the\n *   two-axis CVA + group-data interaction state model.\n * - Structural content inside the dialog (header, date input fields, divider,\n *   action row container) uses `MODAL_INPUT_CONTENT_STRUCTURAL` descendant\n *   selectors — acceptable for layout-only, non-interactive wrappers.\n * - No `useReducedMotion` gating needed — modal-input has no calendar month\n *   navigation animations (keyboard-only input, no calendar grid).\n *\n * @internal\n */\nexport const DatePickerModalInputStyled = forwardRef<HTMLDivElement, DatePickerModalInputProps>(\n  (props, ref) => {\n    const { className, ...rest } = props;\n\n    return (\n      <DatePickerModalInput\n        ref={ref}\n        {...rest}\n        className={cn(\n          modalDialogVariants({ variant: \"modal-input\" }),\n          MODAL_INPUT_CONTENT_STRUCTURAL,\n          className\n        )}\n        scrimClassName={cn(scrimVariants())}\n        ActionButtonComponent={StyledActionButton}\n      />\n    );\n  }\n);\n\nDatePickerModalInputStyled.displayName = \"DatePickerModalInputStyled\";\n","\"use client\";\n\nimport { forwardRef } from \"react\";\n\nimport { DatePickerDockedStyled } from \"./DatePickerDockedStyled\";\nimport { DatePickerModalStyled } from \"./DatePickerModalStyled\";\nimport { DatePickerModalInputStyled } from \"./DatePickerModalInputStyled\";\n\nimport type { DatePickerProps } from \"./DatePicker.types\";\nimport type {\n  DatePickerDockedProps,\n  DatePickerModalProps,\n  DatePickerModalInputProps,\n} from \"./DatePicker.types\";\n\n/**\n * `DatePicker` — Layer 3 MD3 Styled Date Picker Component.\n *\n * Routes to the correct styled variant based on the `variant` prop:\n *\n * - **`docked`** (default): Inline picker with text field trigger and popover calendar.\n *   Uses `DatePickerDockedStyled` wrapping `DatePickerDocked` headless component.\n *\n * - **`modal`**: Full-screen overlay dialog with calendar selection.\n *   Supports single-date and date-range modes.\n *   Uses `DatePickerModalStyled` wrapping `DatePickerModal` headless component.\n *\n * - **`modal-input`**: Modal dialog with manual keyboard date entry.\n *   Supports single-date and date-range modes.\n *   Uses `DatePickerModalInputStyled` wrapping `DatePickerModalInput` headless component.\n *\n * All variants follow MD3 specifications:\n * - `bg-surface-container-high` container background\n * - `rounded-3xl` (28dp) corner radius\n * - MD3 color tokens for all interactive states\n * - MD3 typography tokens (headline-small, label-large, body-large, body-small)\n * - Spring-based standard motion tokens for state transitions\n *\n * @example\n * ```tsx\n * // Docked date picker (default)\n * <DatePicker label=\"Start date\" onChange={setDate} />\n *\n * // Modal date picker\n * <DatePicker variant=\"modal\" isOpen={open} onOpenChange={setOpen} onChange={setDate} />\n *\n * // Modal input date picker\n * <DatePicker variant=\"modal-input\" isOpen={open} onOpenChange={setOpen} onChange={setDate} />\n *\n * // Range selection in modal\n * <DatePicker variant=\"modal\" selectionMode=\"range\" isOpen={open} onOpenChange={setOpen} onRangeChange={setRange} />\n * ```\n *\n * @see https://m3.material.io/components/date-pickers/overview\n */\nexport const DatePicker = forwardRef<HTMLDivElement, DatePickerProps>((props, ref) => {\n  const { variant = \"docked\", ...rest } = props;\n\n  switch (variant) {\n    case \"modal\":\n      return <DatePickerModalStyled ref={ref} {...mapToModalProps(rest)} />;\n    case \"modal-input\":\n      return <DatePickerModalInputStyled ref={ref} {...mapToModalInputProps(rest)} />;\n    default:\n      return <DatePickerDockedStyled ref={ref} {...mapToDockedProps(rest)} />;\n  }\n});\n\nDatePicker.displayName = \"DatePicker\";\n\n/**\n * Maps DatePickerProps (minus variant) to DatePickerDockedProps.\n */\nfunction mapToDockedProps(props: Omit<DatePickerProps, \"variant\">): DatePickerDockedProps {\n  const {\n    selectionMode: _selectionMode,\n    rangeValue: _rangeValue,\n    defaultRangeValue: _defaultRangeValue,\n    onRangeChange: _onRangeChange,\n    headline: _headline,\n    supportingText: _supportingText,\n    clearLabel: _clearLabel,\n    showClear: _showClear,\n    onClear: _onClear,\n    ...dockedProps\n  } = props;\n\n  return dockedProps;\n}\n\n/**\n * Maps DatePickerProps (minus variant) to DatePickerModalProps.\n */\nfunction mapToModalProps(props: Omit<DatePickerProps, \"variant\">): DatePickerModalProps {\n  return props;\n}\n\n/**\n * Maps DatePickerProps (minus variant) to DatePickerModalInputProps.\n */\nfunction mapToModalInputProps(props: Omit<DatePickerProps, \"variant\">): DatePickerModalInputProps {\n  const {\n    showClear: _showClear,\n    clearLabel: _clearLabel,\n    onClear: _onClear,\n    isDateUnavailable: _isDateUnavailable,\n    ...modalInputProps\n  } = props;\n\n  return modalInputProps;\n}\n","\"use client\";\n\nimport { forwardRef, useRef } from \"react\";\nimport { useDateField, useDateSegment, useLocale } from \"react-aria\";\nimport { useDateFieldState } from \"react-stately\";\nimport { createCalendar } from \"@internationalized/date\";\n\nimport type { DateSegment as DateSegmentType } from \"react-stately\";\nimport type { DateFieldProps } from \"./DatePicker.types\";\n\n/**\n * Internal component for rendering a single editable date segment.\n * Each segment (month, day, year) is independently focusable and editable.\n * @internal\n */\nfunction DateSegment({\n  segment,\n  state,\n}: {\n  segment: DateSegmentType;\n  state: ReturnType<typeof useDateFieldState>;\n}): JSX.Element {\n  const ref = useRef<HTMLDivElement>(null);\n  const { segmentProps } = useDateSegment(segment, state, ref);\n\n  return (\n    <div\n      {...segmentProps}\n      ref={ref}\n      data-segment={segment.type}\n      data-placeholder={segment.isPlaceholder || undefined}\n      data-focused={segment.type !== \"literal\" ? undefined : undefined}\n    >\n      {segment.text}\n    </div>\n  );\n}\n\n/**\n * Headless DateField (Layer 2)\n *\n * Renders a segmented date input (e.g., MM/DD/YYYY) using React Aria's\n * `useDateField` and `useDateSegment`. Each segment is independently\n * focusable and editable via keyboard.\n *\n * This is a headless component — it provides behavior, ARIA semantics, and\n * data attributes only. No styling classes are applied.\n *\n * @example\n * ```tsx\n * <DateField aria-label=\"Start date\" onChange={setDate} />\n * ```\n */\nexport const DateField = forwardRef<HTMLDivElement, DateFieldProps>((props, forwardedRef) => {\n  const { locale } = useLocale();\n  const internalRef = useRef<HTMLDivElement>(null);\n  const ref = (forwardedRef ?? internalRef) as React.RefObject<HTMLDivElement>;\n\n  const state = useDateFieldState({\n    ...(props.value !== undefined ? { value: props.value } : {}),\n    ...(props.defaultValue !== undefined ? { defaultValue: props.defaultValue } : {}),\n    ...(props.onChange ? { onChange: props.onChange } : {}),\n    ...(props.minValue ? { minValue: props.minValue } : {}),\n    ...(props.maxValue ? { maxValue: props.maxValue } : {}),\n    ...(props.placeholderValue ? { placeholderValue: props.placeholderValue } : {}),\n    ...(props[\"aria-label\"] ? { \"aria-label\": props[\"aria-label\"] } : {}),\n    ...(props[\"aria-labelledby\"] ? { \"aria-labelledby\": props[\"aria-labelledby\"] } : {}),\n    ...(props.label ? { label: props.label } : {}),\n    isDisabled: props.isDisabled ?? false,\n    isReadOnly: props.isReadOnly ?? false,\n    isRequired: props.isRequired ?? false,\n    granularity: (props.granularity ?? \"day\") as \"day\",\n    locale,\n    createCalendar,\n  });\n\n  const { fieldProps, labelProps } = useDateField(\n    {\n      ...(props.value !== undefined ? { value: props.value } : {}),\n      ...(props.defaultValue !== undefined ? { defaultValue: props.defaultValue } : {}),\n      ...(props.onChange ? { onChange: props.onChange } : {}),\n      ...(props.minValue ? { minValue: props.minValue } : {}),\n      ...(props.maxValue ? { maxValue: props.maxValue } : {}),\n      ...(props.placeholderValue ? { placeholderValue: props.placeholderValue } : {}),\n      ...(props[\"aria-label\"] ? { \"aria-label\": props[\"aria-label\"] } : {}),\n      ...(props[\"aria-labelledby\"] ? { \"aria-labelledby\": props[\"aria-labelledby\"] } : {}),\n      ...(props.label ? { label: props.label } : {}),\n      isDisabled: props.isDisabled ?? false,\n      isReadOnly: props.isReadOnly ?? false,\n      isRequired: props.isRequired ?? false,\n      granularity: (props.granularity ?? \"day\") as \"day\",\n    },\n    state,\n    ref\n  );\n\n  return (\n    <div className={props.className} data-disabled={props.isDisabled ?? undefined}>\n      {props.label && <label {...labelProps}>{props.label}</label>}\n      <div {...fieldProps} ref={ref} data-field>\n        {state.segments.map((segment, i) => (\n          <DateSegment key={i} segment={segment} state={state} />\n        ))}\n      </div>\n    </div>\n  );\n});\n\nDateField.displayName = \"DateField\";\n"]}