@ds-mo/ui 0.2.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/components/Text/Text.tsx","../src/components/Surface/Surface.tsx","../src/utils/cn.ts","../src/components/Card/Card.tsx","../src/components/LabelWrap/LabelWrap.tsx","../src/components/Loader/Loader.tsx","../src/components/Button/Button.tsx","../src/components/ToggleButton/ToggleButton.tsx","../src/components/ButtonGroup/ButtonGroup.tsx","../src/components/ToggleButtonGroup/ToggleButtonGroup.tsx","../src/components/Tag/Tag.tsx","../src/components/Badge/Badge.tsx","../src/components/Toggle/Toggle.tsx","../src/components/Checkbox/Checkbox.tsx","../src/components/Input/Input.tsx","../src/components/Slider/Slider.tsx","../src/components/Field/Field.tsx","../src/components/Modal/Modal.tsx","../src/components/Menu/MenuItem.tsx","../src/components/Menu/DestructiveMenuItem.tsx","../src/utils/css-tokens.ts","../src/components/Menu/Menu.tsx","../src/components/Tooltip/Tooltip.tsx","../src/components/Select/Select.tsx","../src/components/Banner/Banner.tsx","../src/components/Table/Table.tsx","../src/components/Tab/Tab.tsx","../src/components/EmptyState/EmptyState.tsx","../src/components/Fade/Fade.tsx","../src/components/Scrollbar/Scrollbar.tsx","../src/components/ErrorBoundary/ErrorBoundary.tsx","../src/components/Sidebar/Sidebar.tsx","../src/components/Sidebar/SidebarSection.tsx","../src/components/Sidebar/SidebarItem.tsx","../src/components/Header/Header.tsx","../src/components/Radio/Radio.tsx","../src/components/TabGroup/TabGroup.tsx","../src/components/Accordion/Accordion.tsx","../src/components/Breadcrumb/Breadcrumb.tsx","../src/components/Pagination/Pagination.tsx","../src/components/Divider/Divider.tsx","../src/components/Skeleton/Skeleton.tsx","../src/components/Toast/Toast.tsx"],"sourcesContent":["import React, { forwardRef } from 'react';\nimport styles from './Text.module.css';\n\n/**\n * Text variant options.\n * Each variant maps to a TokoMo typography class with predefined font-size, line-height,\n * font-weight, and letter-spacing.\n */\nexport type TextVariant =\n | 'text-display-medium'\n | 'text-display-small'\n | 'text-title-large'\n | 'text-title-medium'\n | 'text-title-small'\n | 'text-body-large'\n | 'text-body-large-emphasis'\n | 'text-body-medium'\n | 'text-body-medium-emphasis'\n | 'text-body-small'\n | 'text-body-small-emphasis'\n | 'text-caption'\n | 'text-caption-emphasis';\n\n/** @deprecated Use `TextVariant` instead. */\nexport type TextStyle = TextVariant;\n\n/**\n * Semantic color tokens for text.\n * Maps to TokoMo --color-foreground-* CSS custom properties.\n */\nexport type TextColorToken =\n | 'primary'\n | 'secondary'\n | 'tertiary'\n | 'brand'\n | 'negative'\n | 'positive'\n | 'warning'\n | 'caution'\n | 'ai'\n | 'on-strong'\n | 'on-bold'\n | 'inherit';\n\n/** Text color — semantic token or CSS variable escape hatch. */\nexport type TextColor = TextColorToken | `var(--${string})`;\n\nexport type TextDecoration = 'none' | 'underline' | 'dotted-underline';\nexport type TextAlign = 'left' | 'center' | 'right';\nexport type LineTruncation = 1 | 2 | 3 | 4 | 5 | 'none';\nexport type TextWrap = 'wrap' | 'nowrap' | 'balance' | 'pretty';\nexport type TextElement = 'p' | 'span' | 'div' | 'label' | 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6';\n\nexport interface TextProps {\n /** Typography variant. Maps to a TokoMo typography class. Defaults to 'text-body-medium'. */\n variant?: TextVariant;\n children: React.ReactNode;\n\n // Appearance\n color?: TextColor;\n decoration?: TextDecoration;\n italic?: boolean;\n align?: TextAlign;\n\n // Truncation / wrap\n /** Max lines before ellipsis. Ignored when wrap is 'nowrap'. Defaults to 'none'. */\n lineTruncation?: LineTruncation;\n /** 'nowrap' = single line, truncates with ellipsis when constrained. */\n wrap?: TextWrap;\n\n // Semantic HTML\n as?: TextElement;\n id?: string;\n htmlFor?: string;\n\n // Escape hatches\n className?: string;\n style?: React.CSSProperties;\n}\n\nconst colorClassMap: Record<TextColorToken, string> = {\n primary: styles.colorPrimary,\n secondary: styles.colorSecondary,\n tertiary: styles.colorTertiary,\n brand: styles.colorBrand,\n negative: styles.colorNegative,\n positive: styles.colorPositive,\n warning: styles.colorWarning,\n caution: styles.colorCaution,\n ai: styles.colorAi,\n 'on-strong': styles.colorOnStrong,\n 'on-bold': styles.colorOnBold,\n inherit: styles.colorInherit,\n};\n\nconst decorationClassMap: Record<TextDecoration, string> = {\n none: styles.decorationNone,\n underline: styles.decorationUnderline,\n 'dotted-underline': styles.decorationDottedUnderline,\n};\n\nconst alignClassMap: Record<TextAlign, string> = {\n left: styles.alignLeft,\n center: styles.alignCenter,\n right: styles.alignRight,\n};\n\nconst truncationClassMap: Record<LineTruncation, string> = {\n 1: styles.truncate1Line,\n 2: styles.truncate2Lines,\n 3: styles.truncate3Lines,\n 4: styles.truncate4Lines,\n 5: styles.truncate5Lines,\n none: styles.noTruncation,\n};\n\nconst isCustomColor = (color: TextColor): color is `var(--${string})` =>\n color.startsWith('var(--');\n\nexport const Text = forwardRef<HTMLElement, TextProps>(\n (\n {\n variant = 'text-body-medium',\n children,\n color,\n decoration,\n italic,\n align,\n lineTruncation = 'none',\n wrap,\n as: Component = 'p',\n id,\n htmlFor,\n className = '',\n style,\n },\n ref\n ) => {\n const wrapClass =\n wrap === 'nowrap' ? styles.wrapNowrap\n : wrap === 'balance' ? styles.wrapBalance\n : wrap === 'pretty' ? styles.wrapPretty\n : '';\n const truncationClass =\n wrap === 'nowrap' ? '' : truncationClassMap[lineTruncation];\n\n const classes = [\n variant,\n styles.text,\n wrapClass,\n truncationClass,\n color && !isCustomColor(color) ? colorClassMap[color] : '',\n decoration ? decorationClassMap[decoration] : '',\n italic ? styles.italic : '',\n align ? alignClassMap[align] : '',\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n const computedStyle: React.CSSProperties = {\n ...style,\n ...(color && isCustomColor(color) ? { color } : {}),\n };\n\n const props: React.HTMLAttributes<HTMLElement> & { htmlFor?: string } = {\n className: classes,\n style: Object.keys(computedStyle).length > 0 ? computedStyle : undefined,\n ...(id ? { id } : {}),\n ...(Component === 'label' && htmlFor ? { htmlFor } : {}),\n };\n\n return (\n <Component ref={ref as React.Ref<never>} {...props}>\n {children}\n </Component>\n );\n }\n);\n\nText.displayName = 'Text';\n","import React, { forwardRef } from 'react';\nimport styles from './Surface.module.css';\n\n/**\n * Semantic intent for colored surfaces.\n * Each intent has four contrast levels (faint, medium, bold, strong).\n */\nexport type SurfaceIntent =\n | 'brand'\n | 'positive'\n | 'negative'\n | 'warning'\n | 'caution'\n | 'ai'\n | 'neutral'\n | 'walkthrough'\n | 'guide';\n\n/** Background type for non-intent surfaces. */\nexport type SurfaceBackground = 'primary' | 'secondary' | 'transparent' | 'translucent';\n\n/** Contrast level for semantic intents. */\nexport type SurfaceContrast = 'faint' | 'medium' | 'bold' | 'strong';\n\n/** Elevation for depth/shadow effects. Progressive: none → flat → elevated → floating. */\nexport type SurfaceElevation =\n | 'none'\n | 'depressed'\n | 'depressed-md'\n | 'flat'\n | 'elevated'\n | 'floating'\n | 'overlayTop'\n | 'overlayRight'\n | 'overlayBottom'\n | 'overlayLeft';\n\n/** Edge divider border direction. */\nexport type SurfaceEdge = 'top' | 'right' | 'bottom' | 'left';\n\n/** Corner radius presets. */\nexport type SurfaceRadiusPreset = 'none' | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 'full';\n\n/** Corner radius — preset, CSS variable, or custom string (e.g. '12px 12px 0 0'). */\nexport type SurfaceRadius = SurfaceRadiusPreset | (string & {});\n\n/** HTML elements Surface can render as. */\nexport type SurfaceElement =\n | 'div'\n | 'section'\n | 'aside'\n | 'article'\n | 'header'\n | 'footer'\n | 'main'\n | 'nav'\n | 'span'\n | 'button'\n | 'td'\n | 'th';\n\n/** Props shared by both surface modes. */\ninterface SurfaceBaseProps extends React.HTMLAttributes<HTMLElement> {\n children?: React.ReactNode;\n /** Elevation for depth/shadow effects. Defaults to 'none'. */\n elevation?: SurfaceElevation;\n /** Edge divider border(s). Only applies when elevation is 'none'. */\n edge?: SurfaceEdge | SurfaceEdge[];\n /** Corner radius — preset or CSS variable. */\n radius?: SurfaceRadius;\n /** Enable hover/pressed interaction overlay. */\n interactive?: boolean;\n /** Apply selected background state. */\n selected?: boolean;\n /** Dim and disable pointer events. */\n inactive?: boolean;\n /** HTML element to render. Defaults to 'div'. */\n as?: SurfaceElement;\n /** Button type — only used when as='button'. */\n type?: 'button' | 'submit' | 'reset';\n}\n\n/** Non-intent surface — uses a basic background color. */\ninterface SurfaceDefaultProps extends SurfaceBaseProps {\n /** Background color. Defaults to 'transparent'. */\n background?: SurfaceBackground;\n intent?: never;\n contrast?: never;\n}\n\n/** Intent surface — uses a semantic color with contrast level. */\ninterface SurfaceIntentProps extends SurfaceBaseProps {\n /** Semantic intent color. */\n intent: SurfaceIntent;\n /** Contrast level for the intent background. Defaults to 'faint'. */\n contrast?: SurfaceContrast;\n background?: never;\n}\n\nexport type SurfaceProps = SurfaceDefaultProps | SurfaceIntentProps;\n\nconst backgroundClassMap: Record<SurfaceBackground, string> = {\n primary: styles.bgPrimary,\n secondary: styles.bgSecondary,\n transparent: styles.bgTransparent,\n translucent: styles.bgTranslucent,\n};\n\nconst elevationClassMap: Record<SurfaceElevation, string> = {\n none: styles.elevationNone,\n depressed: styles.elevationDepressed,\n 'depressed-md': styles.elevationDepressedMd,\n flat: styles.elevationFlat,\n elevated: styles.elevationElevated,\n floating: styles.elevationFloating,\n overlayTop: styles.elevationOverlayTop,\n overlayRight: styles.elevationOverlayRight,\n overlayBottom: styles.elevationOverlayBottom,\n overlayLeft: styles.elevationOverlayLeft,\n};\n\nconst edgeClassMap: Record<SurfaceEdge, string> = {\n top: styles.edgeTop,\n right: styles.edgeRight,\n bottom: styles.edgeBottom,\n left: styles.edgeLeft,\n};\n\nconst radiusClassMap: Record<SurfaceRadiusPreset, string> = {\n none: styles.radiusNone,\n xs: styles.radiusXs,\n sm: styles.radiusSm,\n md: styles.radiusMd,\n lg: styles.radiusLg,\n xl: styles.radiusXl,\n '2xl': styles.radius2xl,\n full: styles.radiusFull,\n};\n\nconst getIntentContrastClass = (intent: SurfaceIntent, contrast: SurfaceContrast): string => {\n const intentKey = intent.charAt(0).toUpperCase() + intent.slice(1);\n const contrastKey = contrast.charAt(0).toUpperCase() + contrast.slice(1);\n return styles[`intent${intentKey}${contrastKey}`] || '';\n};\n\nconst isPresetRadius = (radius: SurfaceRadius): radius is SurfaceRadiusPreset =>\n radius in radiusClassMap;\n\nexport const Surface = forwardRef<HTMLElement, SurfaceProps>(\n (\n {\n children,\n background = 'transparent',\n intent,\n contrast = 'faint',\n elevation = 'none',\n edge,\n radius,\n interactive = false,\n selected = false,\n inactive = false,\n as: Component = 'div',\n className = '',\n style,\n type,\n ...rest\n },\n ref\n ) => {\n const classes = [\n styles.surface,\n // Background or intent+contrast\n intent\n ? getIntentContrastClass(intent, contrast)\n : backgroundClassMap[background],\n // Elevation\n elevationClassMap[elevation],\n // Edge(s) — only when elevation is 'none'\n ...(edge && elevation === 'none'\n ? Array.isArray(edge)\n ? edge.map(e => edgeClassMap[e])\n : [edgeClassMap[edge]]\n : []),\n // Radius (preset only — custom handled via inline style)\n radius && isPresetRadius(radius) ? radiusClassMap[radius] : '',\n // States\n interactive ? styles.interactive : '',\n selected ? styles.selected : '',\n inactive ? styles.inactive : '',\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n const computedStyle: React.CSSProperties = {\n ...style,\n ...(radius && !isPresetRadius(radius) ? { borderRadius: radius } : {}),\n };\n\n const hasStyle =\n (radius && !isPresetRadius(radius)) || (style && Object.keys(style).length > 0);\n\n const elementProps = {\n ref,\n className: classes,\n style: hasStyle ? computedStyle : undefined,\n disabled: Component === 'button' ? inactive : undefined,\n type: Component === 'button' ? type || 'button' : undefined,\n ...rest,\n };\n\n return (\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n <Component {...(elementProps as any)}>{children}</Component>\n );\n }\n);\n\nSurface.displayName = 'Surface';\n","/**\n * Joins class names, filtering out falsy values.\n */\nexport function cn(...classes: (string | undefined | null | false)[]): string {\n return classes.filter(Boolean).join(' ');\n}\n","import React, { forwardRef } from 'react';\nimport styles from './Card.module.css';\nimport { cn } from '@/utils/cn';\n\nexport type CardElevation = 'flat' | 'elevated' | 'floating';\nexport type CardRadius = 'sm' | 'md' | 'lg' | 'xl';\n\nexport interface CardProps {\n children: React.ReactNode;\n /** Optional header content — rendered with a bottom divider. */\n header?: React.ReactNode;\n /** Optional footer content — rendered with a top divider. */\n footer?: React.ReactNode;\n /** Elevation level. Defaults to 'elevated'. */\n elevation?: CardElevation;\n /** Corner radius. Defaults to 'lg'. */\n radius?: CardRadius;\n /** Additional CSS classes. */\n className?: string;\n /** Inline styles. */\n style?: React.CSSProperties;\n}\n\nconst elevationClassMap: Record<CardElevation, string> = {\n flat: styles.elevationFlat,\n elevated: styles.elevationElevated,\n floating: styles.elevationFloating,\n};\n\nconst radiusClassMap: Record<CardRadius, string> = {\n sm: styles.radiusSm,\n md: styles.radiusMd,\n lg: styles.radiusLg,\n xl: styles.radiusXl,\n};\n\nexport const Card = forwardRef<HTMLDivElement, CardProps>(\n ({ children, header, footer, elevation = 'elevated', radius = 'lg', className, style }, ref) => {\n return (\n <div\n ref={ref}\n className={cn(styles.card, elevationClassMap[elevation], radiusClassMap[radius], className)}\n style={style}\n >\n {header && <div className={styles.header}>{header}</div>}\n <div className={styles.body}>{children}</div>\n {footer && <div className={styles.footer}>{footer}</div>}\n </div>\n );\n }\n);\n\nCard.displayName = 'Card';\n","import React from 'react';\nimport { cn } from '@/utils/cn';\nimport styles from './LabelWrap.module.css';\n\ninterface LabelWrapProps {\n children: React.ReactNode;\n /**\n * Maps to typography size — controls optical horizontal padding:\n * xs | sm → 2px (tighter scale)\n * md | lg → 4px (body scale, default)\n */\n size?: 'xs' | 'sm' | 'md' | 'lg';\n /** Enables truncation with ellipsis — use inside full-width containers. */\n truncate?: boolean;\n className?: string;\n}\n\n/**\n * Internal utility wrapper used inside interactive components (Button, Tag,\n * Input, Select, MenuItem, etc.) to:\n * 1. Kill the inherited line-height strut from body { line-height: 1.5 }\n * 2. Add optical horizontal padding around the text\n *\n * Not exported from the public barrel — internal use only.\n */\nexport const LabelWrap = ({ children, size = 'md', truncate = false, className }: LabelWrapProps) => (\n <span className={cn(styles.labelWrap, size === 'sm' && styles.sizeSm, size === 'xs' && styles.sizeXs, truncate && styles.truncate, className)}>\n {children}\n </span>\n);\n\nLabelWrap.displayName = 'LabelWrap';\n","import React from 'react';\nimport styles from './Loader.module.css';\n\nexport interface LoaderProps {\n /**\n * Render size in px. Designed at 16px (r=6, strokeWidth=1).\n * Stroke weight scales proportionally with size — same behaviour as icons.\n * Defaults to 20.\n */\n size?: number;\n className?: string;\n}\n\n/**\n * Placeholder spinner component. Will be replaced with a full Loader\n * component once motion/brand specs are finalised.\n *\n * Designed at 16×16 viewBox so it matches the icon grid:\n * - r=5 → 10px circle in a 16px box (3px optical padding each side)\n * - strokeWidth=1 at native size → scales to 1.25px at 20px, 1.5px at 24px\n */\nexport const Loader = ({ size = 20, className }: LoaderProps) => (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n className={`${styles.loader}${className ? ` ${className}` : ''}`}\n aria-hidden=\"true\"\n >\n <circle\n cx=\"8\"\n cy=\"8\"\n r=\"5\"\n stroke=\"currentColor\"\n strokeWidth=\"1\"\n strokeLinecap=\"round\"\n strokeDasharray=\"23.6 7.9\"\n />\n </svg>\n);\n\nLoader.displayName = 'Loader';\n","import React, { forwardRef } from 'react';\nimport { cn } from '@/utils/cn';\nimport { Text } from '@/components/Text';\nimport { LabelWrap } from '@/components/LabelWrap';\nimport { Loader } from '@/components/Loader';\nimport { ChevronDown } from '@ds-mo/icons';\nimport type { IconComponent } from '@/types/icons';\nimport styles from './Button.module.css';\n\nexport type ButtonVariant = 'primary' | 'secondary';\nexport type ButtonElevation = 'none' | 'flat' | 'elevated' | 'floating';\nexport type ButtonIntent = 'none' | 'neutral' | 'brand' | 'ai' | 'negative' | 'warning' | 'caution' | 'positive';\nexport type ButtonSize = 'xs' | 'sm' | 'md' | 'lg';\nexport type ButtonContrast = 'strong' | 'bold' | 'medium' | 'faint';\nexport type ButtonBackground = 'faint' | 'medium' | 'bold' | 'strong' | 'always-dark';\n\nexport interface ButtonProps {\n /** Polymorphic element type. Defaults to 'button'. */\n as?: React.ElementType;\n /** Visual variant. Defaults to 'primary'. */\n variant?: ButtonVariant;\n /** Label text. */\n label?: string;\n /** Leading icon component from @ds-mo/icons. */\n icon?: IconComponent;\n /** Semantic intent. Defaults to 'brand'. */\n intent?: ButtonIntent;\n /** Size. Defaults to 'md'. */\n size?: ButtonSize;\n /** Pill shape with extra padding. */\n rounded?: boolean;\n /** Fill container width. Label truncates if space is tight. */\n fullWidth?: boolean;\n /** Fixed width. Omit for content width. */\n width?: React.CSSProperties['width'];\n /** Contrast level (primary variant only). Defaults to 'bold'. */\n contrast?: ButtonContrast;\n /**\n * Parent surface context. Adjusts hover tokens and secondary fg colors\n * for buttons placed on colored backgrounds.\n * faint — default, no adjustment\n * medium — use on-medium-background interaction tokens\n * bold — use on-bold-background interaction + inverted fg\n * strong — use on-strong-background interaction + inverted fg\n * always-dark — dark surface (no theme flip), on-bold-background tokens\n */\n background?: ButtonBackground;\n /** Show trailing ChevronDown dropdown indicator. */\n dropdown?: boolean;\n /** Badge count. */\n badgeCount?: number;\n /**\n * Chrome level for secondary; shadow level for primary.\n * none — ghost (transparent, no border, no shadow)\n * flat — border only, transparent bg [default for secondary]\n * elevated — bg-primary + shadow [default for primary]\n * floating — bg-primary + FAB-strength shadow\n */\n elevation?: ButtonElevation;\n /** Show loading spinner in place of icon. Prevents interaction. */\n loading?: boolean;\n\n onClick?: (e: React.MouseEvent<HTMLElement>) => void;\n onMouseEnter?: React.MouseEventHandler<HTMLElement>;\n onMouseLeave?: React.MouseEventHandler<HTMLElement>;\n className?: string;\n inactive?: boolean;\n type?: 'button' | 'submit' | 'reset';\n id?: string;\n 'aria-label'?: string;\n href?: string;\n target?: string;\n rel?: string;\n}\n\nconst ICON_SIZE_MAP: Record<ButtonSize, number> = { xs: 12, sm: 16, md: 20, lg: 24 };\n\nconst TEXT_STYLE_MAP: Record<ButtonSize, string> = {\n xs: 'text-caption-emphasis',\n sm: 'text-body-small-emphasis',\n md: 'text-body-medium-emphasis',\n lg: 'text-body-large-emphasis',\n};\n\n\nexport const Button = forwardRef<HTMLElement, ButtonProps>(\n (\n {\n as,\n variant = 'primary',\n label,\n icon: Icon,\n intent = 'brand',\n size = 'md',\n rounded = false,\n fullWidth = false,\n width,\n contrast = 'bold',\n background,\n dropdown = false,\n badgeCount,\n elevation,\n loading = false,\n onClick,\n onMouseEnter,\n onMouseLeave,\n className,\n inactive = false,\n type = 'button',\n id,\n 'aria-label': ariaLabel,\n href,\n target,\n rel,\n },\n ref\n ) => {\n const Component = (as ?? 'button') as React.ElementType;\n const isButton = !as || as === 'button';\n const isInteractive = !inactive && !loading;\n\n const hasIcon = !!Icon;\n const hasLabel = !!label;\n const showLeading = hasIcon || loading; // spinner fills the icon slot\n const isIconOnly = showLeading && !hasLabel;\n const isLabelOnly = hasLabel && !showLeading;\n const isIconAndLabel = showLeading && hasLabel;\n const iconSize = ICON_SIZE_MAP[size];\n const textStyle = TEXT_STYLE_MAP[size];\n\n // Derive default elevation per variant: primary→none, secondary→flat\n const effectiveElevation: ButtonElevation = elevation ?? (variant === 'primary' ? 'none' : 'flat');\n const elevKey = effectiveElevation.charAt(0).toUpperCase() + effectiveElevation.slice(1);\n\n const classes = cn(\n styles.button,\n styles[variant],\n styles[`intent${intent.charAt(0).toUpperCase() + intent.slice(1)}`],\n size !== 'md' && styles[`size${size.toUpperCase()}`],\n rounded && styles.rounded,\n (inactive || loading) && styles.inactive,\n isIconOnly && styles.iconOnly,\n isLabelOnly && styles.labelOnly,\n isIconAndLabel && styles.iconAndLabel,\n dropdown && styles.dropdown,\n variant === 'primary' && intent !== 'none' && contrast !== 'bold' && styles[`contrast${contrast.charAt(0).toUpperCase() + contrast.slice(1)}`],\n styles[`elevation${elevKey}`],\n background && background !== 'faint' && styles[\n background === 'always-dark' ? 'onAlwaysDark'\n : `on${background.charAt(0).toUpperCase() + background.slice(1)}`\n ],\n fullWidth && styles.fullWidth,\n className,\n );\n\n const resolvedAriaLabel = ariaLabel || label || 'button';\n\n const extraProps: Record<string, unknown> = {};\n if (isButton) {\n extraProps.type = type;\n extraProps.disabled = inactive || loading;\n }\n if (href) extraProps.href = href;\n if (target) extraProps.target = target;\n if (rel) extraProps.rel = rel;\n\n return (\n <Component\n ref={ref}\n id={id}\n className={classes}\n style={width ? { width } : undefined}\n onClick={isInteractive ? onClick : undefined}\n onMouseEnter={isInteractive ? onMouseEnter : undefined}\n onMouseLeave={isInteractive ? onMouseLeave : undefined}\n aria-label={resolvedAriaLabel}\n aria-busy={loading || undefined}\n {...extraProps}\n >\n {loading ? (\n <Loader size={iconSize} />\n ) : (\n Icon && <Icon size={iconSize} />\n )}\n {label && (\n <LabelWrap truncate={fullWidth}>\n <Text variant={textStyle as never} as=\"span\" color=\"inherit\">\n {label}\n </Text>\n </LabelWrap>\n )}\n {dropdown && <ChevronDown size={iconSize} />}\n {badgeCount != null && badgeCount > 0 && (\n <span className={styles.badge}>{badgeCount > 9 ? '+' : badgeCount}</span>\n )}\n </Component>\n );\n }\n);\n\nButton.displayName = 'Button';\n","import React, { forwardRef } from 'react';\nimport { cn } from '@/utils/cn';\nimport { Text } from '@/components/Text';\nimport { LabelWrap } from '@/components/LabelWrap';\nimport type { IconComponent } from '@/types/icons';\nimport styles from './ToggleButton.module.css';\n\nexport type ToggleButtonElevation = 'none' | 'flat' | 'elevated' | 'floating';\nexport type ToggleButtonSize = 'md' | 'sm' | 'xs';\nexport type ToggleButtonBackground = 'faint' | 'medium' | 'bold' | 'strong' | 'always-dark';\n\nexport interface ToggleButtonProps {\n /**\n * Chrome level.\n * none — ghost (transparent, no border, no shadow)\n * flat — border only, transparent bg\n * elevated — bg-primary + shadow [default]\n * floating — bg-primary + FAB-strength shadow\n */\n elevation?: ToggleButtonElevation;\n /** Label text. */\n label?: string;\n /** Leading icon component. */\n icon?: IconComponent;\n /** Size: md (32px), sm (24px), xs (16px). Defaults to 'md'. */\n size?: ToggleButtonSize;\n /** Pill shape. */\n rounded?: boolean;\n /** Parent surface context. Adjusts hover tokens for toggle buttons on colored backgrounds. */\n background?: ToggleButtonBackground;\n /** Controlled pressed state. */\n pressed: boolean;\n /** Called when pressed state changes. */\n onPressedChange: (pressed: boolean) => void;\n inactive?: boolean;\n className?: string;\n id?: string;\n 'aria-label'?: string;\n}\n\nconst ICON_SIZE_MAP: Record<ToggleButtonSize, number> = { md: 20, sm: 16, xs: 12 };\n\nconst TEXT_STYLE_MAP: Record<ToggleButtonSize, string> = {\n md: 'text-body-medium-emphasis',\n sm: 'text-body-small-emphasis',\n xs: 'text-caption-emphasis',\n};\n\nexport const ToggleButton = forwardRef<HTMLButtonElement, ToggleButtonProps>(\n (\n {\n elevation = 'elevated',\n label,\n icon: Icon,\n size = 'md',\n rounded = false,\n background,\n pressed,\n onPressedChange,\n inactive = false,\n className,\n id,\n 'aria-label': ariaLabel,\n },\n ref\n ) => {\n const hasIcon = !!Icon;\n const hasLabel = !!label;\n const isIconOnly = hasIcon && !hasLabel;\n const isLabelOnly = hasLabel && !hasIcon;\n const isIconAndLabel = hasIcon && hasLabel;\n const iconSize = ICON_SIZE_MAP[size];\n const textStyle = TEXT_STYLE_MAP[size];\n\n const elevKey = elevation.charAt(0).toUpperCase() + elevation.slice(1);\n\n const classes = cn(\n styles.toggleButton,\n styles[`elevation${elevKey}`],\n size !== 'md' && styles[`size${size.toUpperCase()}`],\n rounded && styles.rounded,\n inactive && styles.inactive,\n isIconOnly && styles.iconOnly,\n isLabelOnly && styles.labelOnly,\n isIconAndLabel && styles.iconAndLabel,\n background && background !== 'faint' && styles[\n background === 'always-dark' ? 'onAlwaysDark'\n : `on${background.charAt(0).toUpperCase() + background.slice(1)}`\n ],\n pressed && styles.pressed,\n className,\n );\n\n return (\n <button\n ref={ref}\n id={id}\n className={classes}\n onClick={inactive ? undefined : () => onPressedChange(!pressed)}\n type=\"button\"\n disabled={inactive}\n aria-label={ariaLabel || label || 'toggle'}\n aria-pressed={pressed}\n >\n {Icon && <Icon size={iconSize} />}\n {label && (\n <LabelWrap>\n <Text variant={textStyle as never} as=\"span\" color=\"inherit\">\n {label}\n </Text>\n </LabelWrap>\n )}\n </button>\n );\n }\n);\n\nToggleButton.displayName = 'ToggleButton';\n","import React from 'react';\nimport { cn } from '@/utils/cn';\nimport styles from './ButtonGroup.module.css';\n\nexport interface ButtonGroupProps {\n children: React.ReactNode;\n className?: string;\n}\n\n/**\n * Renders Button children flush side-by-side with a 1px divider between them.\n * Outer corners keep the button's own border-radius; inner corners are flattened.\n *\n * Individual button chrome (shadow/border) is suppressed — the group container\n * carries the elevation so it wraps the whole control as one visual unit.\n *\n * Divider behaviour by variant:\n * secondary / primary+none — full-height color-border-tertiary line\n * primary (with intent) — color-border-tertiary-on-{contrast}-background\n * ghost (secondary+none) — short centred line (icon/text height)\n *\n * Rounded groups: outer edges keep pill padding; inner edges revert to base padding.\n * Mix of intents is only valid when variant=\"secondary\"; primary groups must be\n * homogeneous (same intent + contrast on all items).\n */\nexport const ButtonGroup = ({ children, className }: ButtonGroupProps) => {\n const items = React.Children.toArray(children).filter(React.isValidElement);\n const count = items.length;\n\n // Read elevation + rounded from first child to drive the group container style.\n const firstEl = items[0] as React.ReactElement<Record<string, unknown>> | undefined;\n const firstProps = firstEl?.props as { variant?: string; elevation?: string; rounded?: boolean } | undefined;\n const firstVariant = firstProps?.variant ?? 'secondary';\n const firstElevation = firstProps?.elevation ?? (firstVariant === 'primary' ? 'none' : 'flat');\n const groupRounded = !!firstProps?.rounded;\n const groupElevKey = firstElevation.charAt(0).toUpperCase() + firstElevation.slice(1);\n\n return (\n <div\n className={cn(\n styles.group,\n (styles as Record<string, string>)[`group${groupElevKey}`],\n groupRounded && styles.groupRounded,\n className,\n )}\n role=\"group\"\n >\n {items.map((child, i) => {\n const el = child as React.ReactElement<Record<string, unknown>>;\n const p = el.props as {\n className?: string;\n variant?: string;\n elevation?: string;\n size?: string;\n intent?: string;\n contrast?: string;\n rounded?: boolean;\n icon?: unknown;\n label?: unknown;\n };\n\n const isFirst = i === 0;\n const isLast = i === count - 1;\n const isMid = !isFirst && !isLast;\n\n const variant = p.variant ?? 'secondary';\n const size = (p.size ?? 'md') as 'xs' | 'sm' | 'md' | 'lg';\n const contrast = p.contrast ?? 'bold';\n const intent = p.intent ?? 'brand';\n const isRounded = !!p.rounded;\n const isIconOnly = !!p.icon && !p.label;\n // Ghost: secondary button with elevation='none' (replaces old tertiary variant)\n const isGhost = variant === 'secondary' && (p.elevation ?? 'flat') === 'none';\n const isPrimary = variant === 'primary' && intent !== 'none';\n\n // Contrast class suffix — capitalised first letter\n const contrastKey = contrast.charAt(0).toUpperCase() + contrast.slice(1);\n\n // Size suffix for rounded padding correction — uppercase\n // XS rounded has no extra padding in Button so needs no correction\n const sizeKey = size.toUpperCase() as 'MD' | 'SM' | 'LG' | 'XS';\n const needsRoundedCorrection = isRounded && !isIconOnly && size !== 'xs';\n\n // Divider injected as a separate element so it's never affected by\n // the adjacent button's opacity (e.g. disabled state).\n const dividerClasses = cn(\n styles.divider,\n isGhost && styles.dividerGhost,\n isGhost && size === 'xs' && styles.dividerGhostXS,\n isGhost && size === 'sm' && styles.dividerGhostSM,\n isGhost && size === 'lg' && styles.dividerGhostLG,\n isPrimary && (styles as Record<string, string>)[`divider${contrastKey}`],\n );\n\n return (\n <React.Fragment key={i}>\n {i > 0 && <div className={dividerClasses} aria-hidden=\"true\" />}\n {React.cloneElement(el, {\n className: cn(\n p.className,\n styles.item,\n isFirst && styles.first,\n isLast && styles.last,\n isMid && styles.middle,\n\n // Ghost (secondary+elevation=none): ::after overlay gets 4px radius treatment\n isGhost && styles.itemShort,\n\n // Rounded: revert inner-edge padding to base (non-pill) value\n needsRoundedCorrection && isFirst && (styles as Record<string, string>)[`roundedFirst${sizeKey}`],\n needsRoundedCorrection && isLast && (styles as Record<string, string>)[`roundedLast${sizeKey}`],\n needsRoundedCorrection && isMid && (styles as Record<string, string>)[`roundedMid${sizeKey}`],\n ),\n })}\n </React.Fragment>\n );\n })}\n </div>\n );\n};\n\nButtonGroup.displayName = 'ButtonGroup';\n","import React from 'react';\nimport { cn } from '@/utils/cn';\nimport styles from './ToggleButtonGroup.module.css';\n\nexport interface ToggleButtonGroupProps {\n children: React.ReactNode;\n className?: string;\n}\n\n/**\n * Renders ToggleButton children flush side-by-side with a 1px divider between them.\n * Outer corners keep the button's own border-radius; inner corners are flattened.\n *\n * Individual button chrome (shadow/border) is suppressed — the group container\n * carries the elevation so it wraps the whole control as one visual unit.\n *\n * Divider behaviour by elevation:\n * elevated / flat / floating — full-height color-border-tertiary line\n * none (ghost) — short centred line (icon/text height)\n *\n * Rounded groups: outer edges keep pill padding; inner edges revert to base padding.\n * Pressed state and onPressedChange are managed by the consumer on each ToggleButton.\n */\nexport const ToggleButtonGroup = ({ children, className }: ToggleButtonGroupProps) => {\n const items = React.Children.toArray(children).filter(React.isValidElement);\n const count = items.length;\n\n // Read elevation + rounded from first child to drive the group container style.\n const firstEl = items[0] as React.ReactElement<Record<string, unknown>> | undefined;\n const firstProps = firstEl?.props as { elevation?: string; rounded?: boolean } | undefined;\n const groupElevation = firstProps?.elevation ?? 'elevated';\n const groupRounded = !!firstProps?.rounded;\n const groupElevKey = groupElevation.charAt(0).toUpperCase() + groupElevation.slice(1);\n\n return (\n <div\n className={cn(\n styles.group,\n (styles as Record<string, string>)[`group${groupElevKey}`],\n groupRounded && styles.groupRounded,\n className,\n )}\n role=\"group\"\n >\n {items.map((child, i) => {\n const el = child as React.ReactElement<Record<string, unknown>>;\n const p = el.props as {\n className?: string;\n elevation?: string;\n size?: string;\n rounded?: boolean;\n pressed?: boolean;\n icon?: unknown;\n label?: unknown;\n };\n\n const isFirst = i === 0;\n const isLast = i === count - 1;\n const isMid = !isFirst && !isLast;\n\n const size = (p.size ?? 'md') as 'xs' | 'sm' | 'md';\n const isRounded = !!p.rounded;\n const isPressed = !!p.pressed;\n const isIconOnly = !!p.icon && !p.label;\n // Ghost: elevation='none' (no chrome) → short centred divider\n const isGhost = (p.elevation ?? 'elevated') === 'none';\n\n // XS rounded has no extra padding in ToggleButton so needs no correction\n const sizeKey = size.toUpperCase() as 'XS' | 'SM' | 'MD';\n const needsRoundedCorrection = isRounded && !isIconOnly && size !== 'xs';\n\n // Divider injected as a separate element so it's never affected by\n // the adjacent button's opacity (e.g. disabled state).\n const dividerClasses = cn(\n styles.divider,\n isGhost && styles.dividerGhost,\n isGhost && size === 'xs' && styles.dividerGhostXS,\n isGhost && size === 'sm' && styles.dividerGhostSM,\n );\n\n return (\n <React.Fragment key={i}>\n {i > 0 && <div className={dividerClasses} aria-hidden=\"true\" />}\n {React.cloneElement(el, {\n className: cn(\n p.className,\n styles.item,\n isFirst && styles.first,\n isLast && styles.last,\n isMid && styles.middle,\n\n // Ghost variant: ::after overlay gets 4px radius treatment\n isGhost && styles.itemShort,\n\n // Ghost + pressed: selected state background chip\n isGhost && isPressed && styles.itemPressed,\n\n // Rounded: revert inner-edge padding to base (non-pill) value\n needsRoundedCorrection && isFirst && (styles as Record<string, string>)[`roundedFirst${sizeKey}`],\n needsRoundedCorrection && isLast && (styles as Record<string, string>)[`roundedLast${sizeKey}`],\n needsRoundedCorrection && isMid && (styles as Record<string, string>)[`roundedMid${sizeKey}`],\n ),\n })}\n </React.Fragment>\n );\n })}\n </div>\n );\n};\n\nToggleButtonGroup.displayName = 'ToggleButtonGroup';\n","import React, { forwardRef } from 'react';\nimport { cn } from '@/utils/cn';\nimport { Text } from '@/components/Text';\nimport { LabelWrap } from '@/components/LabelWrap';\nimport { Cross } from '@ds-mo/icons';\nimport type { IconComponent } from '@/types/icons';\nimport styles from './Tag.module.css';\n\nexport type TagIntent = 'neutral' | 'brand' | 'ai' | 'negative' | 'warning' | 'caution' | 'positive';\nexport type TagContrast = 'strong' | 'bold' | 'medium' | 'faint';\nexport type TagElevation = 'none' | 'flat' | 'elevated';\nexport type TagSize = 'md' | 'sm' | 'xs';\nexport type TagBackground = 'faint' | 'medium' | 'bold' | 'strong' | 'always-dark';\n\nexport interface TagProps {\n label: string;\n intent?: TagIntent;\n contrast?: TagContrast;\n /**\n * Visual chrome level.\n * none — filled with intent bg, no border, no shadow [default]\n * flat — transparent bg + intent-coloured border ring\n * elevated — filled with intent bg + elevated shadow\n */\n elevation?: TagElevation;\n size?: TagSize;\n rounded?: boolean;\n /** Leading icon component. */\n icon?: IconComponent;\n removable?: boolean;\n onRemove?: () => void;\n /** Override the default Cross remove icon. */\n removeIcon?: IconComponent;\n maxWidth?: string | number;\n inactive?: boolean;\n /** Parent surface context. Adjusts hover tokens for tags on colored backgrounds. */\n background?: TagBackground;\n /** Makes the tag clickable. Pair with pressed/onPressedChange for filter-chip behaviour. */\n onClick?: () => void;\n pressed?: boolean;\n onPressedChange?: (pressed: boolean) => void;\n className?: string;\n}\n\nconst ICON_SIZE: Record<TagSize, number> = { md: 20, sm: 16, xs: 12 };\n\nconst TEXT_STYLE_MAP: Record<TagSize, string> = {\n md: 'text-body-medium',\n sm: 'text-body-small',\n xs: 'text-caption',\n};\n\nexport const Tag = forwardRef<HTMLDivElement, TagProps>(\n (\n {\n label,\n intent = 'neutral',\n contrast = 'faint',\n elevation = 'none',\n size = 'md',\n rounded = false,\n icon: Icon,\n removable = false,\n onRemove,\n removeIcon: RemoveIcon,\n maxWidth,\n inactive = false,\n background,\n onClick,\n pressed,\n onPressedChange,\n className,\n },\n ref\n ) => {\n const isInteractive = !!onClick || !!onPressedChange;\n const hasRemove = removable && !!onRemove;\n const iconSize = ICON_SIZE[size];\n const textStyle = TEXT_STYLE_MAP[size];\n const elevKey = elevation.charAt(0).toUpperCase() + elevation.slice(1);\n const sizeKey = size.toUpperCase() as 'MD' | 'SM' | 'XS';\n\n const classes = cn(\n styles.tag,\n styles[`intent${intent.charAt(0).toUpperCase() + intent.slice(1)}`],\n styles[`contrast${contrast.charAt(0).toUpperCase() + contrast.slice(1)}`],\n styles[`elevation${elevKey}`],\n styles[`size${size.charAt(0).toUpperCase() + size.slice(1)}`],\n rounded && styles.rounded,\n // Pill padding correction — extra space-050 on bare sides (no content anchor)\n rounded && !Icon && (styles as Record<string, string>)[`roundedLeft${sizeKey}`],\n rounded && !hasRemove && (styles as Record<string, string>)[`roundedRight${sizeKey}`],\n // Icon-edge correction — reduce padding to (height − icon) / 2 on icon sides\n !!Icon && (styles as Record<string, string>)[`iconLeft${sizeKey}`],\n hasRemove && (styles as Record<string, string>)[`iconRight${sizeKey}`],\n removable && styles.removable,\n isInteractive && styles.interactive,\n background && background !== 'faint' && styles[\n background === 'always-dark' ? 'onAlwaysDark'\n : `on${background.charAt(0).toUpperCase() + background.slice(1)}`\n ],\n inactive && styles.inactive,\n pressed && styles.pressed,\n className,\n );\n\n const style = maxWidth != null\n ? { maxWidth: typeof maxWidth === 'number' ? `${maxWidth}px` : maxWidth }\n : undefined;\n\n const handleInteract = isInteractive && !inactive\n ? () => {\n onPressedChange?.(!pressed);\n onClick?.();\n }\n : undefined;\n\n const handleKeyDown = isInteractive && !inactive\n ? (e: React.KeyboardEvent<HTMLDivElement>) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onPressedChange?.(!pressed);\n onClick?.();\n }\n }\n : undefined;\n\n return (\n <div\n ref={ref}\n className={classes}\n style={style}\n onClick={handleInteract}\n onKeyDown={handleKeyDown}\n role={isInteractive ? 'button' : undefined}\n tabIndex={isInteractive && !inactive ? 0 : undefined}\n aria-pressed={onPressedChange != null ? pressed : undefined}\n aria-disabled={inactive || undefined}\n >\n {Icon && <Icon size={iconSize} />}\n <LabelWrap size={size}>\n <Text variant={textStyle as never} as=\"span\" color=\"inherit\">\n {label}\n </Text>\n </LabelWrap>\n {removable && onRemove && (\n <button\n type=\"button\"\n className={styles.removeButton}\n onClick={(e) => { e.stopPropagation(); onRemove(); }}\n aria-label={`Remove ${label}`}\n tabIndex={-1}\n >\n {RemoveIcon ? <RemoveIcon size={iconSize} /> : <Cross size={iconSize} />}\n </button>\n )}\n </div>\n );\n }\n);\n\nTag.displayName = 'Tag';\n","import React from 'react';\nimport { Text } from '@/components/Text';\nimport styles from './Badge.module.css';\n\nexport interface BadgeProps {\n count: number;\n isSelected?: boolean;\n className?: string;\n}\n\nexport const Badge: React.FC<BadgeProps> = ({ count, isSelected = false, className }) => {\n if (count === 0) return null;\n const displayText = count > 9 ? '+' : count.toString();\n return (\n <span className={`${styles.badge} ${className || ''}`} aria-label={`${count} unread`}>\n <Text variant=\"text-caption-emphasis\" as=\"span\" color={isSelected ? 'primary' : 'secondary'}>\n {displayText}\n </Text>\n </span>\n );\n};\n\nBadge.displayName = 'Badge';\n","import React, { forwardRef, useState } from 'react';\nimport { cn } from '@/utils/cn';\nimport styles from './Toggle.module.css';\n\nexport interface ToggleProps {\n checked?: boolean;\n onChange?: (checked: boolean) => void;\n inactive?: boolean;\n className?: string;\n 'aria-label'?: string;\n}\n\nexport const Toggle = forwardRef<HTMLButtonElement, ToggleProps>(\n ({ checked = false, onChange, inactive = false, className, 'aria-label': ariaLabel }, ref) => {\n const [isPressed, setIsPressed] = useState(false);\n\n const handleMouseDown = (e: React.MouseEvent) => {\n if (inactive) return;\n e.preventDefault();\n setIsPressed(true);\n };\n\n const handleMouseUp = () => {\n if (inactive || !isPressed) return;\n setIsPressed(false);\n onChange?.(!checked);\n };\n\n const handleMouseLeave = () => {\n if (isPressed) setIsPressed(false);\n };\n\n return (\n <button\n ref={ref}\n type=\"button\"\n role=\"switch\"\n aria-checked={checked}\n aria-label={ariaLabel}\n disabled={inactive}\n className={cn(styles.toggle, checked && styles.checked, inactive && styles.inactive, className)}\n onMouseDown={handleMouseDown}\n onMouseUp={handleMouseUp}\n onMouseLeave={handleMouseLeave}\n >\n <span className={styles.thumb} />\n </button>\n );\n }\n);\n\nToggle.displayName = 'Toggle';\n","import React, { forwardRef } from 'react';\nimport { cn } from '@/utils/cn';\nimport { Text } from '@/components/Text';\nimport type { IconComponent } from '@/types/icons';\nimport styles from './Checkbox.module.css';\n\nexport interface CheckboxProps {\n label: string;\n checked?: boolean;\n indeterminate?: boolean;\n onChange?: (checked: boolean) => void;\n inactive?: boolean;\n className?: string;\n /** Icon for checked state. */\n checkedIcon?: IconComponent;\n /** Icon for unchecked state. */\n uncheckedIcon?: IconComponent;\n /** Icon for indeterminate state. */\n indeterminateIcon?: IconComponent;\n}\n\nexport const Checkbox = forwardRef<HTMLDivElement, CheckboxProps>(\n (\n {\n label,\n checked = false,\n indeterminate = false,\n onChange,\n inactive = false,\n className,\n checkedIcon: CheckedIcon,\n uncheckedIcon: UncheckedIcon,\n indeterminateIcon: IndeterminateIcon,\n },\n ref\n ) => {\n const handleClick = () => {\n if (!inactive) onChange?.(!checked);\n };\n\n const iconColor = indeterminate || checked ? 'var(--color-foreground-primary)' : 'var(--color-foreground-secondary)';\n const Icon = indeterminate ? IndeterminateIcon : checked ? CheckedIcon : UncheckedIcon;\n\n return (\n <div\n ref={ref}\n role=\"checkbox\"\n aria-checked={indeterminate ? 'mixed' : checked}\n aria-inactive={inactive}\n tabIndex={inactive ? -1 : 0}\n className={cn(styles.checkbox, inactive && styles.inactive, className)}\n onClick={handleClick}\n onKeyDown={e => { if (e.key === ' ' || e.key === 'Enter') { e.preventDefault(); handleClick(); } }}\n >\n {Icon ? <Icon size={20} color={iconColor} /> : (\n <span className={cn(styles.box, (checked || indeterminate) && styles.boxChecked)}>\n {(checked || indeterminate) && <span className={styles.checkmark}>{indeterminate ? '−' : '✓'}</span>}\n </span>\n )}\n <Text variant=\"text-body-medium\" as=\"span\" color=\"inherit\">\n {label}\n </Text>\n </div>\n );\n }\n);\n\nCheckbox.displayName = 'Checkbox';\n","import React, { forwardRef } from 'react';\nimport { cn } from '@/utils/cn';\nimport type { IconComponent } from '@/types/icons';\nimport styles from './Input.module.css';\n\nexport type InputType = 'text' | 'email' | 'tel' | 'url' | 'search' | 'password';\n\nexport interface InputProps {\n value: string;\n onChange: (e: React.ChangeEvent<HTMLInputElement>) => void;\n id?: string;\n placeholder?: string;\n autoFocus?: boolean;\n className?: string;\n type?: InputType;\n inactive?: boolean;\n onKeyDown?: React.KeyboardEventHandler<HTMLInputElement>;\n /** Content rendered inside the field on the right. */\n suffix?: React.ReactNode;\n /** Icon for clear button (search type). */\n clearIcon?: IconComponent;\n 'aria-label'?: string;\n}\n\nexport const Input = forwardRef<HTMLDivElement, InputProps>(\n (\n {\n value,\n onChange,\n id,\n placeholder,\n autoFocus = false,\n className,\n type = 'text',\n inactive = false,\n onKeyDown,\n suffix,\n clearIcon: ClearIcon,\n 'aria-label': ariaLabel,\n },\n ref\n ) => {\n const showClear = type === 'search' && value.length > 0 && !inactive;\n\n const handleClear = () => {\n onChange({ target: { value: '' } } as React.ChangeEvent<HTMLInputElement>);\n };\n\n return (\n <div ref={ref} className={cn(styles.wrapper, className)}>\n <div className={styles.row}>\n <input\n type={type}\n id={id}\n value={value}\n onChange={onChange}\n onKeyDown={onKeyDown}\n placeholder={placeholder}\n className={styles.input}\n autoFocus={autoFocus}\n disabled={inactive}\n aria-label={ariaLabel}\n />\n {showClear && (\n <button type=\"button\" className={styles.clearButton} onClick={handleClear} aria-label=\"Clear\">\n {ClearIcon ? <ClearIcon size={16} /> : <span aria-hidden>&times;</span>}\n </button>\n )}\n {suffix && <div className={styles.suffix}>{suffix}</div>}\n </div>\n </div>\n );\n }\n);\n\nInput.displayName = 'Input';\n","import React, { forwardRef, useCallback, useEffect, useId, useRef, useState } from 'react';\nimport { cn } from '@/utils/cn';\nimport { Text } from '@/components/Text';\nimport styles from './Slider.module.css';\n\nexport interface SliderProps {\n value: number;\n onChange: (value: number) => void;\n min?: number;\n max?: number;\n step?: number;\n label: string;\n id?: string;\n inactive?: boolean;\n className?: string;\n}\n\nexport const Slider = forwardRef<HTMLDivElement, SliderProps>(\n ({ value, onChange, min = 0, max = 100, step = 1, label, id: idProp, inactive = false, className }, ref) => {\n const generatedId = useId();\n const id = idProp ?? generatedId;\n const containerRef = useRef<HTMLDivElement>(null);\n const [pct, setPct] = useState(() => {\n const range = max - min;\n return range === 0 ? 0 : Math.round(((value - min) / range) * 100);\n });\n\n const sync = useCallback(() => {\n const range = max - min;\n setPct(range === 0 ? 0 : Math.round(((value - min) / range) * 100));\n }, [value, min, max]);\n\n useEffect(() => { sync(); }, [sync]);\n\n const handleInput = (e: React.ChangeEvent<HTMLInputElement>) => {\n onChange(Number(e.target.value));\n };\n\n return (\n <div ref={ref} className={cn(styles.field, className)}>\n <div className={styles.labelRow}>\n <Text variant=\"text-body-small-emphasis\" as=\"label\" htmlFor={id}>{label}</Text>\n <Text variant=\"text-body-small-emphasis\" as=\"span\">{value}</Text>\n </div>\n <div\n ref={containerRef}\n className={cn(styles.track, inactive && styles.trackInactive, pct === 0 && styles.trackAtMin)}\n style={{ '--slider-pct': pct } as React.CSSProperties}\n >\n <div className={styles.trackInner}>\n <div className={styles.fillTrack}><div className={styles.fill} /></div>\n <div className={styles.thumb} />\n </div>\n <input\n type=\"range\"\n id={id}\n min={min}\n max={max}\n step={step}\n value={value}\n onChange={handleInput}\n disabled={inactive}\n className={styles.input}\n aria-valuemin={min}\n aria-valuemax={max}\n aria-valuenow={value}\n />\n </div>\n </div>\n );\n }\n);\n\nSlider.displayName = 'Slider';\n","import React, { forwardRef } from 'react';\nimport { cn } from '@/utils/cn';\nimport { Text } from '@/components/Text';\nimport styles from './Field.module.css';\n\nexport interface FieldProps {\n label: string;\n children: React.ReactNode;\n id?: string;\n className?: string;\n}\n\nexport const Field = forwardRef<HTMLDivElement, FieldProps>(\n ({ label, children, id, className }, ref) => (\n <div ref={ref} className={cn(styles.field, className)}>\n <Text variant=\"text-body-small-emphasis\" as=\"label\" htmlFor={id}>{label}</Text>\n {children}\n </div>\n )\n);\n\nField.displayName = 'Field';\n","import React, { useEffect, useId, useMemo, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport { Surface } from '@/components/Surface';\nimport { Text } from '@/components/Text';\nimport styles from './Modal.module.css';\n\nexport type ModalWidth = 'sm' | 'md' | 'lg';\n\nconst WIDTH_MAP: Record<ModalWidth, string> = {\n sm: 'var(--dimension-modal-width-sm, 400px)',\n md: 'var(--dimension-modal-width-md, 560px)',\n lg: 'var(--dimension-modal-width-lg, 720px)',\n};\n\nconst CLOSE_ANIMATION_MS = 220;\n\nexport interface ModalProps {\n isOpen: boolean;\n onClose: () => void;\n title: string;\n subtitle?: React.ReactNode;\n children: React.ReactNode;\n footer?: React.ReactNode;\n width?: ModalWidth | string;\n bodyClassName?: string;\n}\n\nexport const Modal: React.FC<ModalProps> = ({\n isOpen,\n onClose,\n title,\n subtitle,\n children,\n footer,\n width = 'md',\n bodyClassName,\n}) => {\n const dialogRef = useRef<HTMLDivElement>(null);\n const titleId = useId();\n const [isClosing, setIsClosing] = useState(false);\n const [shouldRender, setShouldRender] = useState(isOpen);\n\n const resolvedWidth = useMemo(() => {\n if (width === 'sm' || width === 'md' || width === 'lg') {\n return WIDTH_MAP[width];\n }\n return width;\n }, [width]);\n\n useEffect(() => {\n if (isOpen) {\n setShouldRender(true);\n setIsClosing(false);\n } else if (shouldRender) {\n setIsClosing(true);\n const timer = setTimeout(() => {\n setShouldRender(false);\n setIsClosing(false);\n }, CLOSE_ANIMATION_MS);\n return () => clearTimeout(timer);\n }\n }, [isOpen, shouldRender]);\n\n useEffect(() => {\n if (!isOpen) return;\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === 'Escape') onClose();\n };\n document.addEventListener('keydown', handleEscape);\n return () => document.removeEventListener('keydown', handleEscape);\n }, [isOpen, onClose]);\n\n useEffect(() => {\n if (!isOpen || !shouldRender) return;\n const id = requestAnimationFrame(() => {\n dialogRef.current?.focus();\n });\n return () => cancelAnimationFrame(id);\n }, [isOpen, shouldRender]);\n\n if (!shouldRender) return null;\n\n return createPortal(\n <div\n className={`${styles.backdrop} ${isClosing ? styles.closing : ''}`}\n onMouseDown={(e) => {\n if (e.target === e.currentTarget) onClose();\n }}\n >\n <Surface\n ref={dialogRef}\n background=\"primary\"\n elevation=\"floating\"\n radius=\"var(--dimension-radius-275, 22px)\"\n className={styles.dialog}\n style={{ width: `min(${resolvedWidth}, calc(100vw - 32px))` }}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={titleId}\n tabIndex={-1}\n >\n <div className={styles.header}>\n <Text id={titleId} as=\"h2\" variant=\"text-title-small\">\n {title}\n </Text>\n {subtitle != null && (\n <div className={styles.subtitle}>{subtitle}</div>\n )}\n </div>\n <div className={`${styles.body} ${bodyClassName ?? ''}`.trim()}>\n {children}\n </div>\n {footer != null && (\n <div className={styles.footer}>{footer}</div>\n )}\n </Surface>\n </div>,\n document.body\n );\n};\n\nModal.displayName = 'Modal';\n","import React, { forwardRef } from 'react';\nimport { Text } from '@/components/Text';\nimport { Surface } from '@/components/Surface';\nimport type { IconComponent } from '@/types';\nimport styles from './MenuItem.module.css';\n\nexport type MenuItemSelectionStyle = 'highlight' | 'radio' | 'noOverlay';\n\nexport interface MenuItemProps {\n label: string;\n onClick: () => void;\n isSelected?: boolean;\n isInactive?: boolean;\n icon?: IconComponent;\n labelColor?: 'primary' | 'secondary' | 'tertiary';\n subtext?: string;\n showToggle?: boolean;\n toggleValue?: boolean;\n intent?: 'negative';\n selectionStyle?: MenuItemSelectionStyle;\n showTrailingChevron?: boolean;\n checkIcon?: IconComponent;\n chevronIcon?: IconComponent;\n}\n\nexport const MenuItem = forwardRef<HTMLButtonElement, MenuItemProps>(\n ({\n label,\n onClick,\n isSelected = false,\n isInactive = false,\n icon: Icon,\n labelColor,\n subtext,\n showToggle = false,\n toggleValue = false,\n intent,\n selectionStyle = 'highlight',\n showTrailingChevron = false,\n checkIcon: CheckIcon,\n chevronIcon: ChevronIcon,\n }, ref) => {\n const useRadioStyle = selectionStyle === 'radio';\n const noOverlay = selectionStyle === 'noOverlay' || useRadioStyle;\n const showSelectedOverlay = isSelected && !noOverlay;\n\n return (\n <Surface\n ref={ref as React.Ref<HTMLElement>}\n as=\"button\"\n interactive={!isInactive}\n selected={showSelectedOverlay}\n radius=\"sm\"\n className={`${styles.menuItem} ${isSelected ? styles.menuItemSelected : ''} ${isInactive ? styles.menuItemInactive : ''} ${intent === 'negative' ? styles.menuItemNegative : ''} ${labelColor === 'tertiary' ? styles.menuItemLabelTertiary : ''}`}\n onClick={onClick}\n type=\"button\"\n inactive={isInactive}\n >\n {Icon && (\n <div className={styles.iconPrefix}>\n <Icon size={20} />\n </div>\n )}\n <div className={styles.content}>\n <Text\n variant={isSelected ? 'text-body-medium-emphasis' : 'text-body-medium'}\n color={labelColor}\n as=\"span\"\n className={styles.label}\n >\n {label}\n </Text>\n {subtext && (\n <Text variant=\"text-body-small\" as=\"span\" className={styles.subtext}>\n {subtext}\n </Text>\n )}\n </div>\n {showToggle && (\n <div className={styles.toggleSuffix}>\n <div className={`${styles.toggle} ${toggleValue ? styles.toggleOn : ''}`}>\n <div className={styles.toggleThumb} />\n </div>\n </div>\n )}\n {useRadioStyle && isSelected && CheckIcon && (\n <div className={styles.checkSuffix}>\n <CheckIcon size={20} />\n </div>\n )}\n {showTrailingChevron && ChevronIcon && (\n <div className={styles.chevronSuffix}>\n <ChevronIcon size={20} />\n </div>\n )}\n </Surface>\n );\n }\n);\n\nMenuItem.displayName = 'MenuItem';\n","import React, { forwardRef, useState, useRef, useEffect } from 'react';\nimport { Text } from '@/components/Text';\nimport styles from './DestructiveMenuItem.module.css';\n\nexport interface DestructiveMenuItemProps {\n label: string;\n onClick: () => void;\n holdDuration?: number;\n subtext?: string;\n}\n\nexport const DestructiveMenuItem = forwardRef<HTMLButtonElement, DestructiveMenuItemProps>(\n ({ label, onClick, holdDuration = 4000, subtext }, ref) => {\n const [progress, setProgress] = useState(0);\n const pressTimerRef = useRef<number | null>(null);\n const startTimeRef = useRef<number>(0);\n const animationFrameRef = useRef<number | null>(null);\n\n const resetState = () => {\n setProgress(0);\n if (pressTimerRef.current) { clearTimeout(pressTimerRef.current); pressTimerRef.current = null; }\n if (animationFrameRef.current) { cancelAnimationFrame(animationFrameRef.current); animationFrameRef.current = null; }\n };\n\n const handleMouseDown = (e: React.MouseEvent) => {\n e.stopPropagation();\n e.preventDefault();\n if (holdDuration === 0) { onClick(); return; }\n startTimeRef.current = performance.now();\n const animate = () => {\n const elapsed = performance.now() - startTimeRef.current;\n const newProgress = Math.min((elapsed / holdDuration) * 100, 100);\n setProgress(newProgress);\n if (newProgress < 100) animationFrameRef.current = requestAnimationFrame(animate);\n };\n animationFrameRef.current = requestAnimationFrame(animate);\n pressTimerRef.current = window.setTimeout(() => { onClick(); resetState(); }, holdDuration);\n };\n\n const handleMouseUp = (e: React.MouseEvent) => { e.stopPropagation(); resetState(); };\n const handleMouseLeave = (e: React.MouseEvent) => { e.stopPropagation(); resetState(); };\n\n useEffect(() => () => { resetState(); }, []);\n\n return (\n <button\n ref={ref}\n className={styles.destructiveMenuItem}\n onMouseDown={handleMouseDown}\n onMouseUp={handleMouseUp}\n onMouseLeave={handleMouseLeave}\n type=\"button\"\n >\n <div className={styles.progressFill} style={{ width: `${progress}%` }} />\n <div className={styles.content}>\n <Text variant=\"text-body-medium\" as=\"span\" className={styles.label}>{label}</Text>\n {subtext && <Text variant=\"text-body-small\" as=\"span\" className={styles.subtext}>{subtext}</Text>}\n </div>\n </button>\n );\n }\n);\n\nDestructiveMenuItem.displayName = 'DestructiveMenuItem';\n","/**\n * Reads a CSS custom property value from :root as a pixel number.\n * Returns the fallback if the property is not set or not parseable.\n */\nexport function getCssSpacePx(property: string, fallback: number): number {\n if (typeof document === 'undefined') return fallback;\n const raw = getComputedStyle(document.documentElement).getPropertyValue(property).trim();\n const parsed = parseFloat(raw);\n return Number.isNaN(parsed) ? fallback : parsed;\n}\n\n/**\n * Reads a CSS custom property value from :root as a millisecond number.\n * Handles both \"300ms\" and \"0.3s\" formats.\n */\nexport function getCssTimeMs(property: string, fallback: number): number {\n if (typeof document === 'undefined') return fallback;\n const raw = getComputedStyle(document.documentElement).getPropertyValue(property).trim();\n if (raw.endsWith('ms')) return parseFloat(raw) || fallback;\n if (raw.endsWith('s')) return (parseFloat(raw) || 0) * 1000 || fallback;\n return fallback;\n}\n","import React, { useState, useEffect, useLayoutEffect, useRef, useMemo } from 'react';\nimport { createPortal } from 'react-dom';\nimport { Text } from '@/components/Text';\nimport { Surface } from '@/components/Surface';\nimport { MenuItem as MenuItemComponent } from './MenuItem';\nimport { DestructiveMenuItem } from './DestructiveMenuItem';\nimport { getCssSpacePx } from '@/utils/css-tokens';\nimport type { IconComponent } from '@/types';\nimport type { MenuItemSelectionStyle } from './MenuItem';\nimport styles from './Menu.module.css';\n\nconst CLOSE_ANIMATION_MS = 220;\n\nexport type MenuSide = 'top' | 'right' | 'bottom' | 'left';\nexport type MenuAlign = 'start' | 'center' | 'end';\n\nexport interface MenuItemData {\n label: string;\n onClick: () => void;\n isSelected?: boolean;\n isDestructive?: boolean;\n isInactive?: boolean;\n intent?: 'negative';\n keepOpenOnClick?: boolean;\n holdDuration?: number;\n icon?: IconComponent;\n subtext?: string;\n showToggle?: boolean;\n toggleValue?: boolean;\n selectionStyle?: MenuItemSelectionStyle;\n}\n\nexport interface MenuSection {\n header?: string;\n items: MenuItemData[];\n}\n\nexport interface MenuProps {\n isOpen: boolean;\n onClose: () => void;\n anchorRef: React.RefObject<HTMLElement | null>;\n items?: MenuItemData[];\n sections?: MenuSection[];\n side?: MenuSide;\n align?: MenuAlign;\n sideOffset?: number;\n alignOffset?: number;\n sideOffsetToken?: string;\n alignOffsetToken?: string;\n width?: string;\n minWidth?: string;\n maxWidth?: string;\n matchAnchorWidth?: boolean;\n matchAnchorWidthOffset?: number;\n usePortal?: boolean;\n}\n\nexport const Menu: React.FC<MenuProps> = ({\n isOpen,\n onClose,\n anchorRef,\n items,\n sections,\n side = 'bottom',\n align = 'start',\n sideOffset = 4,\n alignOffset = 0,\n sideOffsetToken,\n alignOffsetToken,\n width,\n minWidth,\n maxWidth,\n matchAnchorWidth = false,\n matchAnchorWidthOffset = 0,\n usePortal = true,\n}) => {\n const [isClosing, setIsClosing] = useState(false);\n const [shouldRender, setShouldRender] = useState(isOpen);\n const [isPositionReady, setIsPositionReady] = useState(false);\n const [position, setPosition] = useState<{ x: number; y: number }>({ x: 0, y: 0 });\n const [menuSize, setMenuSize] = useState<{ width: number; height: number }>({ width: 0, height: 0 });\n const [anchorSize, setAnchorSize] = useState<{ width: number; height: number }>({ width: 0, height: 0 });\n const positionCalculatedRef = useRef(false);\n const menuRef = useRef<HTMLDivElement>(null);\n const lastSectionsRef = useRef<MenuSection[]>([]);\n\n const menuSections: MenuSection[] = sections || (items ? [{ items }] : []);\n\n const hasItems = menuSections.some((s) => s.items.length > 0);\n if (!isClosing && menuSections.length > 0 && hasItems) {\n lastSectionsRef.current = menuSections;\n }\n const sectionsToRender = isClosing ? lastSectionsRef.current : menuSections;\n\n useEffect(() => {\n if (isOpen) {\n setShouldRender(true);\n setIsClosing(false);\n setIsPositionReady(false);\n positionCalculatedRef.current = false;\n } else if (shouldRender) {\n setIsClosing(true);\n const timer = setTimeout(() => {\n setShouldRender(false);\n setIsClosing(false);\n positionCalculatedRef.current = false;\n }, CLOSE_ANIMATION_MS);\n return () => clearTimeout(timer);\n }\n }, [isOpen, shouldRender]);\n\n useLayoutEffect(() => {\n if (!isOpen || !shouldRender || !menuRef.current) return;\n const updateSize = () => {\n if (!menuRef.current) return;\n const rect = menuRef.current.getBoundingClientRect();\n if (rect.width > 0 && rect.height > 0) setMenuSize({ width: rect.width, height: rect.height });\n };\n updateSize();\n requestAnimationFrame(() => requestAnimationFrame(updateSize));\n if (typeof ResizeObserver !== 'undefined') {\n const observer = new ResizeObserver(updateSize);\n observer.observe(menuRef.current);\n return () => observer.disconnect();\n }\n }, [isOpen, shouldRender, menuSections.length]);\n\n useLayoutEffect(() => {\n if (!isOpen || !shouldRender || !anchorRef.current || !menuRef.current) return;\n const calculatePosition = () => {\n const anchor = anchorRef.current;\n const menu = menuRef.current;\n if (!anchor || !menu) return;\n const anchorRect = anchor.getBoundingClientRect();\n const menuRect = menu.getBoundingClientRect();\n const menuWidth = menuRect.width || menuSize.width || 200;\n const menuHeight = menuRect.height || menuSize.height || 160;\n setAnchorSize({ width: anchorRect.width, height: anchorRect.height });\n const gap = sideOffsetToken != null ? getCssSpacePx(sideOffsetToken, 12) : sideOffset;\n const alignOff = alignOffsetToken != null ? getCssSpacePx(alignOffsetToken, 4) : alignOffset;\n let x = 0, y = 0;\n switch (side) {\n case 'top':\n y = anchorRect.top - menuHeight - gap;\n x = align === 'start' ? anchorRect.left + alignOff : align === 'end' ? anchorRect.right - menuWidth + alignOff : anchorRect.left + anchorRect.width / 2 - menuWidth / 2 + alignOff;\n break;\n case 'bottom':\n y = anchorRect.bottom + gap;\n x = align === 'start' ? anchorRect.left + alignOff : align === 'end' ? anchorRect.right - menuWidth + alignOff : anchorRect.left + anchorRect.width / 2 - menuWidth / 2 + alignOff;\n break;\n case 'left':\n x = anchorRect.left - menuWidth - gap;\n y = align === 'start' ? anchorRect.top + alignOff : align === 'end' ? anchorRect.bottom - menuHeight + alignOff : anchorRect.top + anchorRect.height / 2 - menuHeight / 2 + alignOff;\n break;\n case 'right':\n x = anchorRect.right + gap;\n y = align === 'start' ? anchorRect.top + alignOff : align === 'end' ? anchorRect.bottom - menuHeight + alignOff : anchorRect.top + anchorRect.height / 2 - menuHeight / 2 + alignOff;\n break;\n }\n const vp = 4;\n setPosition({\n x: Math.min(Math.max(x, vp), window.innerWidth - menuWidth - vp),\n y: Math.min(Math.max(y, vp), window.innerHeight - menuHeight - vp),\n });\n positionCalculatedRef.current = true;\n setIsPositionReady(true);\n };\n if (!positionCalculatedRef.current) {\n calculatePosition();\n requestAnimationFrame(() => { if (!positionCalculatedRef.current) calculatePosition(); });\n }\n const handleScrollResize = () => calculatePosition();\n window.addEventListener('scroll', handleScrollResize, true);\n window.addEventListener('resize', handleScrollResize);\n return () => {\n window.removeEventListener('scroll', handleScrollResize, true);\n window.removeEventListener('resize', handleScrollResize);\n };\n }, [isOpen, shouldRender, anchorRef, side, align, sideOffset, alignOffset, sideOffsetToken, alignOffsetToken, menuSize.width, menuSize.height, menuSections.length, matchAnchorWidthOffset]);\n\n useEffect(() => {\n if (!isOpen || !shouldRender) return;\n const handleClickOutside = (event: MouseEvent) => {\n const target = event.target as HTMLElement;\n if (menuRef.current?.contains(target)) return;\n if (anchorRef.current?.contains(target)) return;\n onClose();\n };\n document.addEventListener('mousedown', handleClickOutside, true);\n return () => document.removeEventListener('mousedown', handleClickOutside, true);\n }, [isOpen, shouldRender, onClose, anchorRef]);\n\n useEffect(() => {\n if (!isOpen) return;\n const handleEscape = (e: KeyboardEvent) => { if (e.key === 'Escape') onClose(); };\n document.addEventListener('keydown', handleEscape);\n return () => document.removeEventListener('keydown', handleEscape);\n }, [isOpen, onClose]);\n\n if (!shouldRender || sectionsToRender.length === 0) return null;\n\n const renderMenuItem = (item: MenuItemData, index: number) => {\n if (item.isDestructive) {\n return (\n <DestructiveMenuItem\n key={index}\n label={item.label}\n subtext={item.subtext}\n holdDuration={item.holdDuration ?? 4000}\n onClick={() => { item.onClick(); if (!item.keepOpenOnClick) onClose(); }}\n />\n );\n }\n return (\n <MenuItemComponent\n key={index}\n icon={item.icon}\n label={item.label}\n subtext={item.subtext}\n onClick={() => { if (!item.isInactive) { item.onClick(); if (!item.keepOpenOnClick) onClose(); } }}\n isSelected={item.isSelected}\n isInactive={item.isInactive}\n intent={item.intent}\n showToggle={item.showToggle}\n toggleValue={item.toggleValue}\n selectionStyle={item.selectionStyle}\n />\n );\n };\n\n const menuStyle: React.CSSProperties = {\n position: 'absolute',\n left: 0,\n top: 0,\n transform: `translate(${Math.round(position.x)}px, ${Math.round(position.y)}px)`,\n willChange: 'transform',\n zIndex: 9998,\n visibility: isPositionReady ? 'visible' : 'hidden',\n ...(matchAnchorWidth && anchorSize.width > 0 ? { width: `${anchorSize.width + matchAnchorWidthOffset}px` } : width ? { width } : {}),\n ...(minWidth ? { minWidth } : {}),\n ...(maxWidth ? { maxWidth } : {}),\n };\n\n const menuContent = (\n <div ref={menuRef} className={`${styles.menuContainer} ${isClosing ? styles.closing : ''}`} style={menuStyle} role=\"menu\" aria-label=\"Menu\">\n {sectionsToRender.map((section, sectionIndex) => (\n <Surface\n key={sectionIndex}\n as=\"div\"\n className={styles.menuSection}\n edge={sectionIndex < sectionsToRender.length - 1 ? 'bottom' : undefined}\n elevation=\"none\"\n >\n {section.header && (\n <div className={styles.sectionHeader}>\n <Text variant=\"text-body-small-emphasis\" as=\"span\" className={styles.sectionLabel}>{section.header}</Text>\n </div>\n )}\n {section.items.map((item, itemIndex) => renderMenuItem(item, itemIndex))}\n </Surface>\n ))}\n </div>\n );\n\n if (usePortal) return createPortal(menuContent, document.body);\n return menuContent;\n};\n\nMenu.displayName = 'Menu';\n","import React, { useState, useRef, useEffect, useLayoutEffect, useCallback } from 'react';\nimport { createPortal } from 'react-dom';\nimport { getCssTimeMs } from '@/utils/css-tokens';\nimport { Text } from '@/components/Text';\nimport styles from './Tooltip.module.css';\n\nconst HOVER_DELAY_FALLBACK_MS = 1000;\nconst INSTANT_REOPEN_MS = 300;\nconst FADE_OUT_DURATION_MS = 200;\n\nlet lastTooltipDismissedAt = 0;\n\nexport type TooltipSide = 'top' | 'right' | 'bottom' | 'left';\nexport type TooltipAlign = 'start' | 'center' | 'end';\n\nexport interface TooltipProps {\n label: string;\n children: React.ReactElement;\n delay?: number;\n side?: TooltipSide;\n align?: TooltipAlign;\n sideOffset?: number;\n alignOffset?: number;\n shortcutKey?: string;\n shortcutKeyPosition?: 'start' | 'end';\n usePortal?: boolean;\n}\n\nexport const Tooltip: React.FC<TooltipProps> = ({\n label,\n children,\n delay,\n side = 'top',\n align = 'center',\n sideOffset = 4,\n alignOffset = 0,\n shortcutKey,\n shortcutKeyPosition = 'end',\n usePortal = true,\n}) => {\n const hoverDelayMs = getCssTimeMs('--effect-animation-delay-medium-3', HOVER_DELAY_FALLBACK_MS);\n const resolvedDelay = delay ?? hoverDelayMs;\n const anchorRef = useRef<HTMLElement | null>(null);\n const tooltipRef = useRef<HTMLDivElement>(null);\n\n const setAnchorRef = useCallback(\n (el: HTMLElement | null) => {\n (anchorRef as React.MutableRefObject<HTMLElement | null>).current = el;\n const childEl = React.Children.only(children) as React.ReactElement<{ ref?: React.Ref<unknown> }>;\n const childRef = 'ref' in childEl ? childEl.ref : undefined;\n if (typeof childRef === 'function') childRef(el);\n else if (childRef && typeof childRef === 'object') (childRef as React.MutableRefObject<unknown>).current = el;\n },\n [children]\n );\n\n const [open, setOpen] = useState(false);\n const [isClosing, setIsClosing] = useState(false);\n const [shouldRender, setShouldRender] = useState(false);\n const [position, setPosition] = useState<{ x: number; y: number }>({ x: 0, y: 0 });\n const [tooltipSize, setTooltipSize] = useState<{ width: number; height: number }>({ width: 0, height: 0 });\n const delayTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const closeTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const viewportPadding = 4;\n\n const clearDelayTimer = () => {\n if (delayTimerRef.current) { clearTimeout(delayTimerRef.current); delayTimerRef.current = null; }\n };\n\n const handleOpen = () => {\n clearDelayTimer();\n const showImmediately = Date.now() - lastTooltipDismissedAt < INSTANT_REOPEN_MS;\n if (showImmediately) {\n setOpen(true); setShouldRender(true); setIsClosing(false); return;\n }\n delayTimerRef.current = setTimeout(() => {\n delayTimerRef.current = null;\n setOpen(true); setShouldRender(true); setIsClosing(false);\n }, resolvedDelay);\n };\n\n const handleClose = () => {\n clearDelayTimer();\n if (closeTimerRef.current) { clearTimeout(closeTimerRef.current); closeTimerRef.current = null; }\n if (!open && !shouldRender) return;\n lastTooltipDismissedAt = Date.now();\n setIsClosing(true);\n closeTimerRef.current = setTimeout(() => {\n closeTimerRef.current = null;\n setShouldRender(false); setOpen(false); setIsClosing(false);\n }, FADE_OUT_DURATION_MS);\n };\n\n useEffect(() => () => { clearDelayTimer(); if (closeTimerRef.current) clearTimeout(closeTimerRef.current); }, []);\n\n useLayoutEffect(() => {\n if (!shouldRender || !tooltipRef.current) return;\n const updateSize = () => {\n if (!tooltipRef.current) return;\n const rect = tooltipRef.current.getBoundingClientRect();\n const w = rect.width || tooltipRef.current.offsetWidth;\n const h = rect.height || tooltipRef.current.offsetHeight;\n if (w > 0 && h > 0) setTooltipSize({ width: w, height: h });\n };\n updateSize();\n requestAnimationFrame(updateSize);\n if (typeof ResizeObserver !== 'undefined') {\n const observer = new ResizeObserver(updateSize);\n observer.observe(tooltipRef.current);\n return () => observer.disconnect();\n }\n }, [shouldRender, label, shortcutKey, shortcutKeyPosition]);\n\n useLayoutEffect(() => {\n if (!shouldRender || !anchorRef.current || !tooltipRef.current) return;\n const calculatePosition = () => {\n if (!anchorRef.current || !tooltipRef.current) return;\n const a = anchorRef.current.getBoundingClientRect();\n const tw = tooltipRef.current.getBoundingClientRect().width || tooltipSize.width || 80;\n const th = tooltipRef.current.getBoundingClientRect().height || tooltipSize.height || 24;\n let x = 0, y = 0;\n switch (side) {\n case 'top':\n y = a.top - th - sideOffset;\n x = align === 'start' ? a.left + alignOffset : align === 'end' ? a.right - tw + alignOffset : a.left + a.width / 2 - tw / 2 + alignOffset;\n break;\n case 'bottom':\n y = a.bottom + sideOffset;\n x = align === 'start' ? a.left + alignOffset : align === 'end' ? a.right - tw + alignOffset : a.left + a.width / 2 - tw / 2 + alignOffset;\n break;\n case 'left':\n x = a.left - tw - sideOffset;\n y = align === 'start' ? a.top + alignOffset : align === 'end' ? a.bottom - th + alignOffset : a.top + a.height / 2 - th / 2 + alignOffset;\n break;\n case 'right':\n x = a.right + sideOffset;\n y = align === 'start' ? a.top + alignOffset : align === 'end' ? a.bottom - th + alignOffset : a.top + a.height / 2 - th / 2 + alignOffset;\n break;\n }\n setPosition({\n x: Math.min(Math.max(x, viewportPadding), window.innerWidth - tw - viewportPadding),\n y: Math.min(Math.max(y, viewportPadding), window.innerHeight - th - viewportPadding),\n });\n };\n calculatePosition();\n requestAnimationFrame(() => requestAnimationFrame(calculatePosition));\n }, [shouldRender, side, align, sideOffset, alignOffset, tooltipSize.width, tooltipSize.height, label]);\n\n useEffect(() => {\n if (!shouldRender) return;\n const onScrollResize = () => {\n if (!anchorRef.current || !tooltipRef.current) return;\n const a = anchorRef.current.getBoundingClientRect();\n const tw = tooltipSize.width || 80;\n const th = tooltipSize.height || 24;\n let x = 0, y = 0;\n switch (side) {\n case 'top': y = a.top - th - sideOffset; x = align === 'start' ? a.left + alignOffset : align === 'end' ? a.right - tw + alignOffset : a.left + a.width / 2 - tw / 2 + alignOffset; break;\n case 'bottom': y = a.bottom + sideOffset; x = align === 'start' ? a.left + alignOffset : align === 'end' ? a.right - tw + alignOffset : a.left + a.width / 2 - tw / 2 + alignOffset; break;\n case 'left': x = a.left - tw - sideOffset; y = align === 'start' ? a.top + alignOffset : align === 'end' ? a.bottom - th + alignOffset : a.top + a.height / 2 - th / 2 + alignOffset; break;\n case 'right': x = a.right + sideOffset; y = align === 'start' ? a.top + alignOffset : align === 'end' ? a.bottom - th + alignOffset : a.top + a.height / 2 - th / 2 + alignOffset; break;\n }\n setPosition({\n x: Math.min(Math.max(x, viewportPadding), window.innerWidth - tw - viewportPadding),\n y: Math.min(Math.max(y, viewportPadding), window.innerHeight - th - viewportPadding),\n });\n };\n window.addEventListener('scroll', onScrollResize, true);\n window.addEventListener('resize', onScrollResize);\n return () => { window.removeEventListener('scroll', onScrollResize, true); window.removeEventListener('resize', onScrollResize); };\n }, [shouldRender, side, align, sideOffset, alignOffset, tooltipSize.width, tooltipSize.height]);\n\n const keyHint = shortcutKey ? (\n <div className={styles.keyHint} aria-hidden>\n <Text variant=\"text-caption-emphasis\" as=\"span\" color=\"primary\">{shortcutKey}</Text>\n </div>\n ) : null;\n\n const tooltipContent = shouldRender ? (\n <div\n ref={tooltipRef}\n className={`${styles.tooltip} ${isClosing ? styles.closing : ''}`}\n style={{\n position: 'fixed',\n left: 0,\n top: 0,\n transform: `translate(${Math.round(position.x)}px, ${Math.round(position.y)}px)`,\n willChange: 'transform',\n zIndex: 10000,\n }}\n role=\"tooltip\"\n >\n <div className={styles.tooltipInner}>\n {shortcutKey && shortcutKeyPosition === 'start' && keyHint}\n <Text variant=\"text-body-small\" as=\"span\" color=\"primary\">{label}</Text>\n {shortcutKey && shortcutKeyPosition === 'end' && keyHint}\n </div>\n </div>\n ) : null;\n\n const trigger = React.Children.only(children);\n const triggerWithRefAndHandlers = React.isValidElement(trigger)\n ? React.cloneElement(trigger as React.ReactElement<any>, {\n ref: setAnchorRef,\n onMouseEnter: (e: React.MouseEvent) => {\n handleOpen();\n (trigger as any).props.onMouseEnter?.(e);\n },\n onMouseLeave: (e: React.MouseEvent) => {\n handleClose();\n (trigger as any).props.onMouseLeave?.(e);\n },\n })\n : children;\n\n return (\n <>\n {triggerWithRefAndHandlers}\n {usePortal ? createPortal(tooltipContent, document.body) : tooltipContent}\n </>\n );\n};\n\nTooltip.displayName = 'Tooltip';\n","import React, { forwardRef, useState, useRef } from 'react';\nimport { Surface } from '@/components/Surface';\nimport { Text } from '@/components/Text';\nimport { Menu } from '@/components/Menu';\nimport type { MenuItemData } from '@/components/Menu';\nimport type { IconComponent } from '@/types';\nimport styles from './Select.module.css';\n\nexport interface SelectOption {\n label: string;\n value: string | number;\n}\n\nexport interface SelectProps {\n value: string | number;\n onChange: (value: string | number) => void;\n options: SelectOption[];\n placeholder?: string;\n className?: string;\n inactive?: boolean;\n id?: string;\n chevronIcon?: IconComponent;\n}\n\nexport const Select = forwardRef<HTMLDivElement, SelectProps>(\n ({ value, onChange, options, placeholder = 'Select option', className, inactive = false, id, chevronIcon: ChevronIcon }, ref) => {\n const [isMenuOpen, setIsMenuOpen] = useState(false);\n const buttonRef = useRef<HTMLButtonElement>(null);\n\n const selectedOption = options.find(opt => opt.value === value);\n const selectedLabel = selectedOption?.label || placeholder;\n\n const menuItems: MenuItemData[] = options.map(option => ({\n label: option.label,\n onClick: () => {\n onChange(option.value);\n setIsMenuOpen(false);\n },\n isSelected: option.value === value,\n }));\n\n const handleToggle = () => {\n if (!inactive) setIsMenuOpen(prev => !prev);\n };\n\n return (\n <div ref={ref} className={`${styles.selectWrapper} ${className || ''}`}>\n <Surface\n id={id}\n ref={buttonRef as React.RefObject<HTMLElement>}\n as=\"button\"\n type=\"button\"\n elevation=\"elevated\"\n radius=\"sm\"\n interactive\n selected={isMenuOpen}\n className={styles.selectButton}\n onClick={handleToggle}\n inactive={inactive}\n >\n <Text\n variant=\"text-body-medium\"\n as=\"span\"\n \n color={selectedOption ? 'primary' : 'secondary'}\n >\n {selectedLabel}\n </Text>\n {ChevronIcon && (\n <span className={styles.chevron}>\n <ChevronIcon size={16} />\n </span>\n )}\n </Surface>\n <Menu\n isOpen={isMenuOpen}\n onClose={() => setIsMenuOpen(false)}\n anchorRef={buttonRef as React.RefObject<HTMLElement | null>}\n items={menuItems}\n side=\"bottom\"\n align=\"start\"\n sideOffset={4}\n alignOffset={-4}\n matchAnchorWidth\n matchAnchorWidthOffset={8}\n />\n </div>\n );\n }\n);\n\nSelect.displayName = 'Select';\n","import React, { useState, useEffect, useCallback, useRef } from 'react';\nimport { createPortal } from 'react-dom';\nimport { Surface } from '@/components/Surface';\nimport { Text } from '@/components/Text';\nimport { getCssTimeMs } from '@/utils/css-tokens';\nimport styles from './Banner.module.css';\n\nconst TOAST_DURATION_FALLBACK_MS = 4000;\nconst FADE_OUT_DURATION_MS = 200;\n\nexport type BannerIntent =\n | 'brand' | 'positive' | 'negative' | 'warning' | 'caution'\n | 'ai' | 'neutral' | 'walkthrough' | 'guide';\n\nexport type BannerContrast = 'faint' | 'medium' | 'bold' | 'strong';\n\nexport interface BannerProps {\n intent: BannerIntent;\n contrast: BannerContrast;\n message: string;\n header?: boolean;\n className?: string;\n floating?: boolean;\n onDismiss?: () => void;\n}\n\nconst getContentColorVar = (intent: BannerIntent, contrast: BannerContrast): string => {\n if (contrast === 'bold') return 'var(--color-foreground-on-bold-background-primary)';\n const contentContrast = contrast === 'faint' ? 'bold' : contrast === 'medium' ? 'strong' : 'medium';\n return `var(--color-foreground-${contentContrast}-${intent})`;\n};\n\nexport const Banner: React.FC<BannerProps> = ({\n intent,\n contrast,\n message,\n header = false,\n className = '',\n floating = false,\n onDismiss,\n}) => {\n const toastDurationMs = getCssTimeMs('--effect-animation-delay-long-2', TOAST_DURATION_FALLBACK_MS);\n const messageColor = getContentColorVar(intent, contrast);\n const [isClosing, setIsClosing] = useState(false);\n const dismissTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const closeTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const scheduleDismiss = useCallback(() => {\n if (dismissTimerRef.current) clearTimeout(dismissTimerRef.current);\n if (closeTimerRef.current) clearTimeout(closeTimerRef.current);\n dismissTimerRef.current = setTimeout(() => {\n dismissTimerRef.current = null;\n setIsClosing(true);\n closeTimerRef.current = setTimeout(() => {\n closeTimerRef.current = null;\n onDismiss?.();\n }, FADE_OUT_DURATION_MS);\n }, toastDurationMs);\n }, [onDismiss, toastDurationMs]);\n\n useEffect(() => {\n if (floating && message) scheduleDismiss();\n return () => {\n if (dismissTimerRef.current) clearTimeout(dismissTimerRef.current);\n if (closeTimerRef.current) clearTimeout(closeTimerRef.current);\n };\n }, [floating, message, scheduleDismiss]);\n\n const content = (\n <div\n className={`${styles.bannerWrapper} ${className}`.trim()}\n style={{ '--banner-content': messageColor } as React.CSSProperties}\n >\n <Surface\n elevation={floating ? 'floating' : 'elevated'}\n intent={intent}\n contrast={contrast}\n radius=\"sm\"\n className={styles.banner}\n >\n {header && (\n <div className={styles.bannerHeaderSurface}>\n <div className={styles.bannerHeader} aria-hidden />\n </div>\n )}\n <div className={styles.bannerBody}>\n <Text variant=\"text-body-medium\" as=\"span\" className={styles.message}>\n {message}\n </Text>\n </div>\n </Surface>\n </div>\n );\n\n if (floating) {\n return createPortal(\n <div className={styles.floatingPosition} style={{ zIndex: 9998 }}>\n <div className={`${styles.floatingToast} ${isClosing ? styles.closing : ''}`}>\n {content}\n </div>\n </div>,\n document.body\n );\n }\n\n return content;\n};\n\nBanner.displayName = 'Banner';\n","import React, { useMemo, useState, useCallback } from 'react';\nimport { cn } from '@/utils/cn';\nimport { Text } from '@/components/Text';\nimport styles from './Table.module.css';\n\nexport type SortDirection = 'asc' | 'desc';\nexport type CellType = 'string' | 'numbers' | 'tag' | 'checkbox' | 'button' | 'spacer' | 'image' | 'icon' | 'empty';\nexport type FilterValue = string | number | Array<string | number> | undefined;\nexport type FilterState = Record<string, FilterValue>;\n\nexport interface SortState {\n columnId: string;\n direction: SortDirection;\n}\n\nexport interface PaginationState {\n pageIndex: number;\n pageSize: number;\n}\n\nexport interface TableColumn<T = unknown> {\n id: string;\n header: string | React.ReactNode;\n accessorKey?: string;\n accessor?: (row: T) => unknown;\n sortable?: boolean;\n align?: 'left' | 'right' | 'center';\n width?: string | number;\n minWidth?: string | number;\n maxWidth?: string | number;\n renderCell?: (row: T, rowIndex: number) => React.ReactNode;\n cellType?: CellType;\n hide?: boolean;\n pinned?: 'left' | 'right';\n}\n\nexport interface TableProps<T = unknown> {\n columns: TableColumn<T>[];\n data: T[];\n sortState?: SortState;\n onSort?: (columnId: string) => void;\n className?: string;\n onRowClick?: (row: T, rowIndex: number) => void;\n selectedRows?: Set<number>;\n loading?: boolean;\n pagination?: PaginationState;\n onPaginationChange?: (pageIndex: number, pageSize: number) => void;\n emptyMessage?: string;\n}\n\nfunction getColumnValue<T>(column: TableColumn<T>, row: T): unknown {\n if (column.accessorKey) return (row as Record<string, unknown>)[column.accessorKey];\n if (column.accessor) return column.accessor(row);\n return undefined;\n}\n\nfunction compareValues(a: unknown, b: unknown, direction: SortDirection): number {\n const mult = direction === 'asc' ? 1 : -1;\n if (a == null && b == null) return 0;\n if (a == null) return mult;\n if (b == null) return -mult;\n if (typeof a === 'number' && typeof b === 'number') return (a - b) * mult;\n return String(a).localeCompare(String(b)) * mult;\n}\n\nexport function Table<T>({\n columns,\n data,\n sortState,\n onSort,\n className,\n onRowClick,\n selectedRows,\n loading = false,\n pagination,\n onPaginationChange,\n emptyMessage = 'No results found.',\n}: TableProps<T>) {\n const visibleColumns = useMemo(() => columns.filter(c => !c.hide), [columns]);\n\n const gridTemplateColumns = useMemo(() =>\n visibleColumns.map(col => {\n if (col.width) return typeof col.width === 'number' ? `${col.width}px` : col.width;\n return 'minmax(120px, 1fr)';\n }).join(' '),\n [visibleColumns]\n );\n\n const sortedData = useMemo(() => {\n if (!sortState) return data;\n const col = columns.find(c => c.id === sortState.columnId);\n if (!col) return data;\n return [...data].sort((a, b) =>\n compareValues(getColumnValue(col, a), getColumnValue(col, b), sortState.direction)\n );\n }, [data, columns, sortState]);\n\n const pagedData = useMemo(() => {\n if (!pagination) return sortedData;\n const start = pagination.pageIndex * pagination.pageSize;\n return sortedData.slice(start, start + pagination.pageSize);\n }, [sortedData, pagination]);\n\n const totalPages = pagination ? Math.ceil(sortedData.length / pagination.pageSize) : 1;\n const isEmpty = !loading && pagedData.length === 0;\n\n const handleSort = (columnId: string) => {\n if (onSort) onSort(columnId);\n };\n\n return (\n <div className={cn(styles.tableWrapper, className)}>\n <div className={styles.tableScroll}>\n <div className={styles.table} style={{ gridTemplateColumns }} role=\"table\">\n {/* Header */}\n <div className={styles.headerRow} role=\"row\">\n {visibleColumns.map(col => (\n <div\n key={col.id}\n className={cn(\n styles.headerCell,\n col.sortable && styles.sortable,\n col.align === 'right' && styles.alignRight,\n col.align === 'center' && styles.alignCenter\n )}\n role=\"columnheader\"\n onClick={() => col.sortable && handleSort(col.id)}\n style={col.minWidth ? { minWidth: typeof col.minWidth === 'number' ? `${col.minWidth}px` : col.minWidth } : undefined}\n >\n {typeof col.header === 'string' ? (\n <Text variant=\"text-body-small-emphasis\" as=\"span\" color=\"secondary\">\n {col.header}\n </Text>\n ) : col.header}\n {sortState?.columnId === col.id && (\n <span className={styles.sortIndicator} aria-hidden>\n {sortState.direction === 'asc' ? '\\u2191' : '\\u2193'}\n </span>\n )}\n </div>\n ))}\n </div>\n\n {/* Loading skeleton */}\n {loading && Array.from({ length: 5 }).map((_, i) => (\n <div key={`skeleton-${i}`} className={styles.row} role=\"row\">\n {visibleColumns.map(col => (\n <div key={col.id} className={styles.cell} role=\"cell\">\n <div className={styles.skeleton} />\n </div>\n ))}\n </div>\n ))}\n\n {/* Empty state */}\n {isEmpty && (\n <div className={styles.emptyRow} style={{ gridColumn: `1 / -1` }}>\n <Text variant=\"text-body-medium\" as=\"p\" color=\"secondary\">{emptyMessage}</Text>\n </div>\n )}\n\n {/* Data rows */}\n {!loading && pagedData.map((row, rowIndex) => {\n const isSelected = selectedRows?.has(rowIndex);\n return (\n <div\n key={rowIndex}\n className={cn(\n styles.row,\n isSelected && styles.rowSelected,\n onRowClick && styles.rowClickable\n )}\n role=\"row\"\n onClick={() => onRowClick?.(row, rowIndex)}\n >\n {visibleColumns.map(col => (\n <div\n key={col.id}\n className={cn(\n styles.cell,\n col.align === 'right' && styles.alignRight,\n col.align === 'center' && styles.alignCenter\n )}\n role=\"cell\"\n >\n {col.renderCell\n ? col.renderCell(row, rowIndex)\n : <Text variant=\"text-body-medium\" as=\"span\" lineTruncation={1}>{String(getColumnValue(col, row) ?? '')}</Text>\n }\n </div>\n ))}\n </div>\n );\n })}\n </div>\n </div>\n\n {/* Pagination */}\n {pagination && onPaginationChange && totalPages > 1 && (\n <div className={styles.pagination}>\n <button\n className={styles.pageButton}\n disabled={pagination.pageIndex === 0}\n onClick={() => onPaginationChange(pagination.pageIndex - 1, pagination.pageSize)}\n type=\"button\"\n >\n <Text variant=\"text-body-small\" as=\"span\">Previous</Text>\n </button>\n <Text variant=\"text-body-small\" as=\"span\" color=\"secondary\">\n {`Page ${pagination.pageIndex + 1} of ${totalPages}`}\n </Text>\n <button\n className={styles.pageButton}\n disabled={pagination.pageIndex >= totalPages - 1}\n onClick={() => onPaginationChange(pagination.pageIndex + 1, pagination.pageSize)}\n type=\"button\"\n >\n <Text variant=\"text-body-small\" as=\"span\">Next</Text>\n </button>\n </div>\n )}\n </div>\n );\n}\n\nTable.displayName = 'Table';\n","import React, { forwardRef } from 'react';\nimport { cn } from '@/utils/cn';\nimport { Text } from '@/components/Text';\nimport styles from './Tab.module.css';\n\nexport type TabBackground = 'faint' | 'medium' | 'bold' | 'strong' | 'always-dark';\n\nexport interface TabProps {\n id?: string;\n label: string;\n isSelected?: boolean;\n /** Parent surface context. Adjusts hover tokens and fg for tabs on colored backgrounds. */\n background?: TabBackground;\n onClick?: () => void;\n className?: string;\n}\n\nexport const Tab = forwardRef<HTMLButtonElement, TabProps>(\n ({ id, label, isSelected = false, background, onClick, className }, ref) => {\n const bgClass = background && background !== 'faint'\n ? styles[background === 'always-dark' ? 'onAlwaysDark' : `on${background.charAt(0).toUpperCase() + background.slice(1)}`]\n : undefined;\n return (\n <button\n ref={ref}\n id={id}\n className={cn(styles.tab, isSelected && styles.tabSelected, bgClass, className)}\n onClick={onClick}\n type=\"button\"\n aria-selected={isSelected}\n role=\"tab\"\n >\n <Text variant={isSelected ? 'text-body-medium-emphasis' : 'text-body-medium'} as=\"span\">\n {label}\n </Text>\n </button>\n );\n }\n);\n\nTab.displayName = 'Tab';\n","import React, { forwardRef } from 'react';\nimport { cn } from '@/utils/cn';\nimport { Text } from '@/components/Text';\nimport styles from './EmptyState.module.css';\n\nexport type EmptyStateType = 'no-content' | 'no-results' | 'no-results-filter' | 'no-access';\n\nconst defaultMessages: Record<EmptyStateType, string> = {\n 'no-content': 'No page contents to display.',\n 'no-results': 'No results found.',\n 'no-results-filter': 'No results found. Please update search criteria.',\n 'no-access': \"You don't have access to this page.\",\n};\n\nexport interface EmptyStateProps {\n type?: EmptyStateType;\n message?: string;\n className?: string;\n}\n\nexport const EmptyState = forwardRef<HTMLDivElement, EmptyStateProps>(\n ({ type = 'no-content', message, className }, ref) => (\n <div ref={ref} className={cn(styles.emptyState, className)}>\n <Text variant=\"text-body-medium\" as=\"p\" color=\"secondary\">\n {message || defaultMessages[type]}\n </Text>\n </div>\n )\n);\n\nEmptyState.displayName = 'EmptyState';\n","import React, { forwardRef } from 'react';\nimport { cn } from '@/utils/cn';\nimport styles from './Fade.module.css';\n\nexport type FadeSide = 'top' | 'bottom' | 'left' | 'right';\n\nexport interface FadeProps {\n side: FadeSide;\n height: string;\n background?: string;\n className?: string;\n style?: React.CSSProperties;\n}\n\nconst sideClassMap: Record<FadeSide, string> = {\n top: 'fadeTop',\n bottom: 'fadeBottom',\n left: 'fadeLeft',\n right: 'fadeRight',\n};\n\nexport const Fade = forwardRef<HTMLDivElement, FadeProps>(\n ({ side, height, background = 'var(--color-background-secondary)', className, style = {} }, ref) => (\n <div\n ref={ref}\n className={cn(styles.fade, styles[sideClassMap[side]], className)}\n style={{ ...style, height, '--background': background } as React.CSSProperties}\n aria-hidden=\"true\"\n />\n )\n);\n\nFade.displayName = 'Fade';\n","import React, { useRef, useEffect, useState, useCallback } from 'react';\nimport { cn } from '@/utils/cn';\nimport styles from './Scrollbar.module.css';\n\nexport type ScrollbarVariant = 'default' | 'thick';\n\nexport interface ScrollbarProps {\n children: React.ReactNode;\n className?: string;\n variant?: ScrollbarVariant;\n showTrackOnHover?: boolean;\n onScroll?: (e: React.UIEvent<HTMLDivElement>) => void;\n fadeOverlay?: React.ReactNode;\n contentRef?: React.RefObject<HTMLDivElement>;\n}\n\nexport const Scrollbar: React.FC<ScrollbarProps> = ({\n children,\n className,\n variant = 'default',\n showTrackOnHover = true,\n onScroll,\n fadeOverlay,\n contentRef: externalContentRef,\n}) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const internalContentRef = useRef<HTMLDivElement>(null);\n const contentRef = externalContentRef || internalContentRef;\n const thumbRef = useRef<HTMLDivElement>(null);\n const thumbHRef = useRef<HTMLDivElement>(null);\n const [thumbHeight, setThumbHeight] = useState(0);\n const [thumbTop, setThumbTop] = useState(0);\n const [thumbWidth, setThumbWidth] = useState(0);\n const [thumbLeft, setThumbLeft] = useState(0);\n const [isDragging, setIsDragging] = useState(false);\n const [isDraggingH, setIsDraggingH] = useState(false);\n const [isPointerInside, setIsPointerInside] = useState(false);\n const dragStartY = useRef(0);\n const dragStartScrollTop = useRef(0);\n const dragStartX = useRef(0);\n const dragStartScrollLeft = useRef(0);\n\n const handleMouseEnter = useCallback(() => {\n if (showTrackOnHover) setIsPointerInside(true);\n }, [showTrackOnHover]);\n\n const handleMouseLeave = useCallback(() => {\n setIsPointerInside(false);\n }, []);\n\n const updateThumb = useCallback(() => {\n const container = containerRef.current;\n const content = contentRef.current;\n if (!container || !content) return;\n\n const containerHeight = container.clientHeight;\n const containerWidth = container.clientWidth;\n const contentHeight = content.scrollHeight;\n const contentWidth = content.scrollWidth;\n const scrollTop = content.scrollTop;\n const scrollLeft = content.scrollLeft;\n\n if (contentHeight <= containerHeight) {\n setThumbHeight(0);\n } else {\n const ratio = containerHeight / contentHeight;\n const h = Math.max(20, containerHeight * ratio);\n setThumbHeight(h);\n setThumbTop((scrollTop / (contentHeight - containerHeight)) * (containerHeight - h));\n }\n\n if (contentWidth <= containerWidth) {\n setThumbWidth(0);\n } else {\n const ratio = containerWidth / contentWidth;\n const w = Math.max(20, containerWidth * ratio);\n setThumbWidth(w);\n setThumbLeft((scrollLeft / (contentWidth - containerWidth)) * (containerWidth - w));\n }\n }, [contentRef]);\n\n useEffect(() => {\n const content = contentRef.current;\n if (!content) return;\n const handleScroll = (e: Event) => {\n updateThumb();\n if (onScroll) onScroll(e as unknown as React.UIEvent<HTMLDivElement>);\n };\n content.addEventListener('scroll', handleScroll);\n return () => content.removeEventListener('scroll', handleScroll);\n }, [updateThumb, onScroll, contentRef]);\n\n useEffect(() => {\n const content = contentRef.current;\n if (!content) return;\n const handleResize = () => updateThumb();\n window.addEventListener('resize', handleResize);\n if (typeof ResizeObserver !== 'undefined') {\n const observer = new ResizeObserver(handleResize);\n observer.observe(content);\n return () => { window.removeEventListener('resize', handleResize); observer.disconnect(); };\n }\n return () => window.removeEventListener('resize', handleResize);\n }, [updateThumb, contentRef]);\n\n useEffect(() => { updateThumb(); }, [updateThumb, children]);\n\n const handleThumbMouseDown = useCallback((e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n const content = contentRef.current;\n if (!content) return;\n setIsDragging(true);\n dragStartY.current = e.clientY;\n dragStartScrollTop.current = content.scrollTop;\n const handleMouseMove = (e: MouseEvent) => {\n const container = containerRef.current;\n if (!container || !content) return;\n const deltaY = e.clientY - dragStartY.current;\n const scrollableHeight = content.scrollHeight - container.clientHeight;\n const scrollRatio = scrollableHeight / (container.clientHeight - thumbHeight);\n content.scrollTop = Math.max(0, Math.min(scrollableHeight, dragStartScrollTop.current + deltaY * scrollRatio));\n };\n const handleMouseUp = () => {\n setIsDragging(false);\n document.removeEventListener('mousemove', handleMouseMove);\n document.removeEventListener('mouseup', handleMouseUp);\n };\n document.addEventListener('mousemove', handleMouseMove);\n document.addEventListener('mouseup', handleMouseUp);\n }, [thumbHeight, contentRef]);\n\n const handleThumbHMouseDown = useCallback((e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n const content = contentRef.current;\n if (!content) return;\n setIsDraggingH(true);\n dragStartX.current = e.clientX;\n dragStartScrollLeft.current = content.scrollLeft;\n const handleMouseMove = (e: MouseEvent) => {\n const container = containerRef.current;\n if (!container || !content) return;\n const deltaX = e.clientX - dragStartX.current;\n const scrollableWidth = content.scrollWidth - container.clientWidth;\n const scrollRatio = scrollableWidth / (container.clientWidth - thumbWidth);\n content.scrollLeft = Math.max(0, Math.min(scrollableWidth, dragStartScrollLeft.current + deltaX * scrollRatio));\n };\n const handleMouseUp = () => {\n setIsDraggingH(false);\n document.removeEventListener('mousemove', handleMouseMove);\n document.removeEventListener('mouseup', handleMouseUp);\n };\n document.addEventListener('mousemove', handleMouseMove);\n document.addEventListener('mouseup', handleMouseUp);\n }, [thumbWidth, contentRef]);\n\n const showThumb = thumbHeight > 0;\n const showThumbH = thumbWidth > 0;\n const showTrack = showTrackOnHover && (isPointerInside || isDragging || isDraggingH);\n\n return (\n <div\n ref={containerRef}\n className={cn(styles.container, variant === 'thick' && styles.thick, className)}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n data-dragging={isDragging || isDraggingH}\n data-show-track={showTrack ? 'true' : 'false'}\n >\n <div ref={contentRef} className={styles.content}>{children}</div>\n {fadeOverlay}\n {showThumb && (\n <div className={styles.track}>\n <div ref={thumbRef} className={styles.thumb} style={{ height: `${thumbHeight}px`, top: `${thumbTop}px` }} onMouseDown={handleThumbMouseDown} />\n </div>\n )}\n {showThumbH && (\n <div className={styles.trackHorizontal}>\n <div ref={thumbHRef} className={styles.thumbHorizontal} style={{ width: `${thumbWidth}px`, left: `${thumbLeft}px` }} onMouseDown={handleThumbHMouseDown} />\n </div>\n )}\n </div>\n );\n};\n\nScrollbar.displayName = 'Scrollbar';\n","import React, { Component, ReactNode } from 'react';\nimport { EmptyState } from '@/components/EmptyState';\nimport { Text } from '@/components/Text';\nimport styles from './ErrorBoundary.module.css';\n\nexport interface ErrorBoundaryProps {\n children: ReactNode;\n fallback?: ReactNode;\n}\n\ninterface ErrorBoundaryState {\n hasError: boolean;\n error: Error | null;\n}\n\nexport class ErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundaryState> {\n constructor(props: ErrorBoundaryProps) {\n super(props);\n this.state = { hasError: false, error: null };\n }\n\n static getDerivedStateFromError(error: Error): ErrorBoundaryState {\n return { hasError: true, error };\n }\n\n override componentDidCatch(error: Error, errorInfo: React.ErrorInfo) {\n console.error('ErrorBoundary caught an error:', error, errorInfo);\n }\n\n handleReset = () => {\n this.setState({ hasError: false, error: null });\n };\n\n override render() {\n if (this.state.hasError) {\n if (this.props.fallback) return this.props.fallback;\n return (\n <div className={styles.errorBoundary}>\n <EmptyState type=\"no-content\" />\n <div className={styles.errorDetails}>\n <Text variant=\"text-body-small\" as=\"p\" color=\"secondary\">\n Something went wrong. Please refresh the page.\n </Text>\n </div>\n </div>\n );\n }\n return this.props.children;\n }\n}\n","import React, { forwardRef, useRef, useCallback, useEffect, useState } from 'react';\nimport { cn } from '@/utils/cn';\nimport styles from './Sidebar.module.css';\n\nexport type SidebarWidth = 'mini' | 'default' | number;\n\nexport interface SidebarProps {\n children: React.ReactNode;\n isCollapsed?: boolean;\n onToggle?: () => void;\n width?: SidebarWidth;\n onWidthChange?: (width: SidebarWidth) => void;\n resizable?: boolean;\n footer?: React.ReactNode;\n className?: string;\n isMobile?: boolean;\n}\n\nconst MINI_WIDTH = 56;\nconst DEFAULT_WIDTH = 240;\nconst MIN_DRAG_WIDTH = 180;\nconst SNAP_THRESHOLD = 140;\n\nexport const Sidebar = forwardRef<HTMLElement, SidebarProps>(\n ({\n children,\n isCollapsed = false,\n onToggle,\n width = 'default',\n onWidthChange,\n resizable = true,\n footer,\n className,\n isMobile = false,\n }, ref) => {\n const internalRef = useRef<HTMLElement>(null);\n const sidebarRef = (ref as React.RefObject<HTMLElement>) || internalRef;\n const [isResizing, setIsResizing] = useState(false);\n\n const isMini = width === 'mini';\n const resolvedWidth = width === 'mini' ? MINI_WIDTH : width === 'default' ? DEFAULT_WIDTH : width;\n\n const handleMouseDown = useCallback((e: React.MouseEvent) => {\n if (!resizable || !onWidthChange) return;\n e.preventDefault();\n setIsResizing(true);\n const startX = e.clientX;\n\n const handleMouseMove = (e: MouseEvent) => {\n const newWidth = e.clientX;\n if (newWidth < SNAP_THRESHOLD) {\n onWidthChange('mini');\n } else if (newWidth < MIN_DRAG_WIDTH) {\n onWidthChange('default');\n } else {\n onWidthChange(newWidth);\n }\n };\n\n const handleMouseUp = () => {\n setIsResizing(false);\n document.removeEventListener('mousemove', handleMouseMove);\n document.removeEventListener('mouseup', handleMouseUp);\n document.body.style.cursor = '';\n document.body.style.userSelect = '';\n };\n\n document.body.style.cursor = 'col-resize';\n document.body.style.userSelect = 'none';\n document.addEventListener('mousemove', handleMouseMove);\n document.addEventListener('mouseup', handleMouseUp);\n }, [resizable, onWidthChange]);\n\n // Close sidebar on Escape (mobile)\n useEffect(() => {\n if (!isMobile || isCollapsed) return;\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === 'Escape') onToggle?.();\n };\n document.addEventListener('keydown', handleEscape);\n return () => document.removeEventListener('keydown', handleEscape);\n }, [isMobile, isCollapsed, onToggle]);\n\n if (isCollapsed && !isMobile) return null;\n\n return (\n <>\n {/* Mobile backdrop */}\n {isMobile && !isCollapsed && (\n <div className={styles.backdrop} onClick={onToggle} aria-hidden />\n )}\n <aside\n ref={sidebarRef}\n className={cn(\n styles.sidebar,\n isMini && styles.mini,\n isMobile && styles.mobile,\n isCollapsed && styles.collapsed,\n isResizing && styles.resizing,\n className\n )}\n style={{ width: isCollapsed ? 0 : resolvedWidth }}\n role=\"navigation\"\n aria-label=\"Sidebar\"\n >\n <div className={styles.content}>\n {children}\n </div>\n {footer && (\n <div className={styles.footer}>\n {footer}\n </div>\n )}\n {resizable && !isMobile && (\n <div\n className={styles.resizeHandle}\n onMouseDown={handleMouseDown}\n role=\"separator\"\n aria-orientation=\"vertical\"\n aria-label=\"Resize sidebar\"\n />\n )}\n </aside>\n </>\n );\n }\n);\n\nSidebar.displayName = 'Sidebar';\n","import React, { forwardRef, useState } from 'react';\nimport { cn } from '@/utils/cn';\nimport { Text } from '@/components/Text';\nimport styles from './Sidebar.module.css';\n\nexport interface SidebarSectionProps {\n label?: string;\n children: React.ReactNode;\n collapsible?: boolean;\n defaultCollapsed?: boolean;\n className?: string;\n}\n\nexport const SidebarSection = forwardRef<HTMLDivElement, SidebarSectionProps>(\n ({ label, children, collapsible = false, defaultCollapsed = false, className }, ref) => {\n const [isCollapsed, setIsCollapsed] = useState(defaultCollapsed);\n\n return (\n <div ref={ref} className={cn(styles.section, className)}>\n {label && (\n <div\n className={cn(styles.sectionHeader, collapsible && styles.sectionHeaderClickable)}\n onClick={collapsible ? () => setIsCollapsed(prev => !prev) : undefined}\n role={collapsible ? 'button' : undefined}\n aria-expanded={collapsible ? !isCollapsed : undefined}\n >\n <Text variant=\"text-caption-emphasis\" as=\"span\" color=\"tertiary\">\n {label}\n </Text>\n </div>\n )}\n {!isCollapsed && (\n <div className={styles.sectionItems}>\n {children}\n </div>\n )}\n </div>\n );\n }\n);\n\nSidebarSection.displayName = 'SidebarSection';\n","import React, { forwardRef } from 'react';\nimport { cn } from '@/utils/cn';\nimport { Text } from '@/components/Text';\nimport type { IconComponent } from '@/types';\nimport styles from './Sidebar.module.css';\n\nexport interface SidebarItemProps {\n label: string;\n icon?: IconComponent;\n isSelected?: boolean;\n isDisabled?: boolean;\n onClick?: () => void;\n badge?: React.ReactNode;\n children?: React.ReactNode;\n className?: string;\n}\n\nexport const SidebarItem = forwardRef<HTMLButtonElement, SidebarItemProps>(\n ({ label, icon: Icon, isSelected = false, isDisabled = false, onClick, badge, children, className }, ref) => (\n <div className={cn(styles.itemWrapper, className)}>\n <button\n ref={ref}\n className={cn(\n styles.item,\n isSelected && styles.itemSelected,\n isDisabled && styles.itemDisabled\n )}\n onClick={onClick}\n disabled={isDisabled}\n type=\"button\"\n aria-current={isSelected ? 'page' : undefined}\n >\n {Icon && (\n <span className={styles.itemIcon}>\n <Icon size={20} />\n </span>\n )}\n <Text\n variant={isSelected ? 'text-body-medium-emphasis' : 'text-body-medium'}\n as=\"span\"\n className={styles.itemLabel}\n lineTruncation={1}\n >\n {label}\n </Text>\n {badge && <span className={styles.itemBadge}>{badge}</span>}\n </button>\n {children && isSelected && (\n <div className={styles.subItems}>\n {children}\n </div>\n )}\n </div>\n )\n);\n\nSidebarItem.displayName = 'SidebarItem';\n","import React, { forwardRef } from 'react';\nimport { cn } from '@/utils/cn';\nimport { Surface } from '@/components/Surface';\nimport { Text } from '@/components/Text';\nimport styles from './Header.module.css';\n\nexport type HeaderBackground = 'primary' | 'secondary' | 'transparent' | 'translucent';\n\nexport interface HeaderProps {\n title?: string;\n left?: React.ReactNode;\n center?: React.ReactNode;\n right?: React.ReactNode;\n background?: HeaderBackground;\n className?: string;\n}\n\nexport const Header = forwardRef<HTMLElement, HeaderProps>(\n ({ title, left, center, right, background = 'secondary', className }, ref) => (\n <Surface\n ref={ref}\n as=\"header\"\n background={background}\n elevation=\"none\"\n edge=\"bottom\"\n className={cn(styles.header, className)}\n >\n <div className={styles.left}>\n {left}\n {title && !center && (\n <Text variant=\"text-title-small\" as=\"h1\" lineTruncation={1}>\n {title}\n </Text>\n )}\n </div>\n {center && <div className={styles.center}>{center}</div>}\n <div className={styles.right}>{right}</div>\n </Surface>\n )\n);\n\nHeader.displayName = 'Header';\n","import React, { forwardRef } from 'react';\nimport { cn } from '@/utils/cn';\nimport { Text } from '@/components/Text';\nimport styles from './Radio.module.css';\n\nexport interface RadioOption {\n label: string;\n value: string;\n inactive?: boolean;\n}\n\nexport interface RadioGroupProps {\n /** Currently selected value. */\n value: string;\n /** Called when selection changes. */\n onChange: (value: string) => void;\n /** Radio options to render. */\n options: RadioOption[];\n /** Group label for accessibility. */\n 'aria-label'?: string;\n /** Layout direction. */\n direction?: 'vertical' | 'horizontal';\n /** Disables the entire group. */\n inactive?: boolean;\n className?: string;\n}\n\nexport const RadioGroup = forwardRef<HTMLDivElement, RadioGroupProps>(\n (\n {\n value,\n onChange,\n options,\n 'aria-label': ariaLabel,\n direction = 'vertical',\n inactive = false,\n className,\n },\n ref\n ) => (\n <div\n ref={ref}\n role=\"radiogroup\"\n aria-label={ariaLabel}\n className={cn(\n styles.group,\n direction === 'horizontal' && styles.horizontal,\n className\n )}\n >\n {options.map(opt => (\n <RadioItem\n key={opt.value}\n label={opt.label}\n checked={value === opt.value}\n inactive={inactive || opt.inactive}\n onChange={() => onChange(opt.value)}\n />\n ))}\n </div>\n )\n);\n\nRadioGroup.displayName = 'RadioGroup';\n\n/* ─── Individual Radio Item ─────────────────────────────────────────────────── */\n\nexport interface RadioItemProps {\n label: string;\n checked?: boolean;\n onChange?: () => void;\n inactive?: boolean;\n className?: string;\n}\n\nexport const RadioItem = forwardRef<HTMLDivElement, RadioItemProps>(\n ({ label, checked = false, onChange, inactive = false, className }, ref) => {\n const handleClick = () => {\n if (!inactive && !checked) onChange?.();\n };\n\n return (\n <div\n ref={ref}\n role=\"radio\"\n aria-checked={checked}\n tabIndex={inactive ? -1 : 0}\n className={cn(styles.radio, inactive && styles.inactive, className)}\n onClick={handleClick}\n onKeyDown={e => {\n if (e.key === ' ' || e.key === 'Enter') {\n e.preventDefault();\n handleClick();\n }\n }}\n >\n <span className={cn(styles.circle, checked && styles.circleChecked)}>\n {checked && <span className={styles.dot} />}\n </span>\n <Text variant=\"text-body-medium\" as=\"span\" color=\"inherit\">\n {label}\n </Text>\n </div>\n );\n }\n);\n\nRadioItem.displayName = 'RadioItem';\n","import React, { forwardRef, useRef, useEffect, useState, useCallback } from 'react';\nimport { cn } from '@/utils/cn';\nimport { Tab } from '@/components/Tab';\nimport styles from './TabGroup.module.css';\n\nexport interface TabGroupTab {\n label: string;\n id?: string;\n}\n\nexport interface TabGroupProps {\n /** Tab definitions. */\n tabs: TabGroupTab[];\n /** Index of the active tab. */\n activeIndex?: number;\n /** Called when a tab is clicked. */\n onTabChange?: (index: number) => void;\n className?: string;\n}\n\nexport const TabGroup = forwardRef<HTMLDivElement, TabGroupProps>(\n ({ tabs, activeIndex = 0, onTabChange, className }, ref) => {\n const tabsRef = useRef<(HTMLButtonElement | null)[]>([]);\n const [indicator, setIndicator] = useState({ left: 0, width: 0 });\n\n const updateIndicator = useCallback(() => {\n const el = tabsRef.current[activeIndex];\n if (el) {\n const parent = el.parentElement;\n if (parent) {\n setIndicator({\n left: el.offsetLeft,\n width: el.offsetWidth,\n });\n }\n }\n }, [activeIndex]);\n\n useEffect(() => {\n updateIndicator();\n }, [updateIndicator]);\n\n // Recalculate on resize\n useEffect(() => {\n const observer = new ResizeObserver(updateIndicator);\n const container = tabsRef.current[0]?.parentElement;\n if (container) observer.observe(container);\n return () => observer.disconnect();\n }, [updateIndicator]);\n\n return (\n <div\n ref={ref}\n role=\"tablist\"\n className={cn(styles.tabGroup, className)}\n >\n <div className={styles.tabsRow}>\n {tabs.map((tab, i) => (\n <Tab\n key={tab.id ?? i}\n ref={el => { tabsRef.current[i] = el; }}\n id={tab.id}\n label={tab.label}\n isSelected={i === activeIndex}\n onClick={() => onTabChange?.(i)}\n />\n ))}\n </div>\n <div className={styles.track}>\n <div\n className={styles.indicator}\n style={{\n transform: `translateX(${indicator.left}px)`,\n width: indicator.width,\n }}\n />\n </div>\n </div>\n );\n }\n);\n\nTabGroup.displayName = 'TabGroup';\n","import React, { forwardRef, useState, useRef, useEffect, useCallback } from 'react';\nimport { cn } from '@/utils/cn';\nimport { Text } from '@/components/Text';\nimport styles from './Accordion.module.css';\n\nexport interface AccordionItemData {\n id: string;\n label: string;\n content: React.ReactNode;\n inactive?: boolean;\n}\n\nexport interface AccordionProps {\n /** Items to render. */\n items: AccordionItemData[];\n /** Allow multiple items open at once. When false, behaves as an accordion. */\n multiple?: boolean;\n /** Controlled: which item IDs are expanded. */\n expandedIds?: string[];\n /** Called when expansion state changes. */\n onExpandedChange?: (ids: string[]) => void;\n className?: string;\n}\n\nexport const Accordion = forwardRef<HTMLDivElement, AccordionProps>(\n ({ items, multiple = false, expandedIds: controlledIds, onExpandedChange, className }, ref) => {\n const [internalIds, setInternalIds] = useState<string[]>([]);\n const expandedIds = controlledIds ?? internalIds;\n\n const toggle = (id: string) => {\n let next: string[];\n if (expandedIds.includes(id)) {\n next = expandedIds.filter(x => x !== id);\n } else {\n next = multiple ? [...expandedIds, id] : [id];\n }\n setInternalIds(next);\n onExpandedChange?.(next);\n };\n\n return (\n <div ref={ref} className={cn(styles.accordion, className)}>\n {items.map(item => (\n <AccordionItem\n key={item.id}\n label={item.label}\n isExpanded={expandedIds.includes(item.id)}\n inactive={item.inactive}\n onToggle={() => toggle(item.id)}\n >\n {item.content}\n </AccordionItem>\n ))}\n </div>\n );\n }\n);\n\nAccordion.displayName = 'Accordion';\n\n/* ─── AccordionItem ─────────────────────────────────────────────────────────── */\n\nexport interface AccordionItemProps {\n label: string;\n children: React.ReactNode;\n isExpanded?: boolean;\n onToggle?: () => void;\n inactive?: boolean;\n className?: string;\n}\n\nexport const AccordionItem = forwardRef<HTMLDivElement, AccordionItemProps>(\n ({ label, children, isExpanded = false, onToggle, inactive = false, className }, ref) => {\n const contentRef = useRef<HTMLDivElement>(null);\n const [height, setHeight] = useState<number>(0);\n\n const measure = useCallback(() => {\n if (contentRef.current) {\n setHeight(contentRef.current.scrollHeight);\n }\n }, []);\n\n useEffect(() => {\n measure();\n const el = contentRef.current;\n if (!el) return;\n const ro = new ResizeObserver(measure);\n ro.observe(el);\n return () => ro.disconnect();\n }, [measure]);\n\n return (\n <div ref={ref} className={cn(styles.item, inactive && styles.inactive, className)}>\n <button\n type=\"button\"\n className={styles.trigger}\n onClick={() => !inactive && onToggle?.()}\n aria-expanded={isExpanded}\n tabIndex={inactive ? -1 : 0}\n >\n <Text variant=\"text-body-medium-emphasis\" as=\"span\" color=\"inherit\">\n {label}\n </Text>\n <span className={cn(styles.chevron, isExpanded && styles.chevronOpen)}>\n &#x203A;\n </span>\n </button>\n <div\n className={styles.body}\n style={{ height: isExpanded ? height : 0 }}\n aria-hidden={!isExpanded}\n >\n <div ref={contentRef} className={styles.bodyInner}>\n {children}\n </div>\n </div>\n </div>\n );\n }\n);\n\nAccordionItem.displayName = 'AccordionItem';\n","import React, { forwardRef } from 'react';\nimport { cn } from '@/utils/cn';\nimport { Text } from '@/components/Text';\nimport styles from './Breadcrumb.module.css';\n\nexport interface BreadcrumbItem {\n label: string;\n href?: string;\n onClick?: () => void;\n}\n\nexport interface BreadcrumbProps {\n /** Ordered list of breadcrumb items. Last item is treated as current page. */\n items: BreadcrumbItem[];\n /** Custom separator. Defaults to '/'. */\n separator?: React.ReactNode;\n className?: string;\n}\n\nexport const Breadcrumb = forwardRef<HTMLElement, BreadcrumbProps>(\n ({ items, separator = '/', className }, ref) => (\n <nav ref={ref} aria-label=\"Breadcrumb\" className={cn(styles.breadcrumb, className)}>\n <ol className={styles.list}>\n {items.map((item, i) => {\n const isLast = i === items.length - 1;\n return (\n <li key={i} className={styles.item}>\n {isLast ? (\n <Text variant=\"text-body-medium-emphasis\" as=\"span\" color=\"primary\" aria-current=\"page\">\n {item.label}\n </Text>\n ) : (\n <>\n {item.href ? (\n <a\n href={item.href}\n className={styles.link}\n onClick={e => { if (item.onClick) { e.preventDefault(); item.onClick(); } }}\n >\n <Text variant=\"text-body-medium\" as=\"span\" color=\"inherit\">\n {item.label}\n </Text>\n </a>\n ) : (\n <button\n type=\"button\"\n className={styles.link}\n onClick={item.onClick}\n >\n <Text variant=\"text-body-medium\" as=\"span\" color=\"inherit\">\n {item.label}\n </Text>\n </button>\n )}\n <span className={styles.separator} aria-hidden=\"true\">\n {separator}\n </span>\n </>\n )}\n </li>\n );\n })}\n </ol>\n </nav>\n )\n);\n\nBreadcrumb.displayName = 'Breadcrumb';\n","import React, { forwardRef, useMemo } from 'react';\nimport { cn } from '@/utils/cn';\nimport { Text } from '@/components/Text';\nimport styles from './Pagination.module.css';\n\nexport interface PaginationProps {\n /** Current page (1-based). */\n page: number;\n /** Total number of pages. */\n totalPages: number;\n /** Called when page changes. */\n onPageChange: (page: number) => void;\n /** Max page buttons visible (excluding prev/next). */\n siblingCount?: number;\n /** Disables all interaction. */\n inactive?: boolean;\n className?: string;\n}\n\nfunction buildRange(start: number, end: number): (number | 'ellipsis')[] {\n const items: (number | 'ellipsis')[] = [];\n for (let i = start; i <= end; i++) items.push(i);\n return items;\n}\n\nfunction buildPages(page: number, totalPages: number, siblings: number): (number | 'ellipsis')[] {\n const totalSlots = siblings * 2 + 5; // siblings + boundaries + ellipses + current\n\n if (totalPages <= totalSlots) return buildRange(1, totalPages);\n\n const leftSibling = Math.max(page - siblings, 2);\n const rightSibling = Math.min(page + siblings, totalPages - 1);\n\n const showLeftEllipsis = leftSibling > 2;\n const showRightEllipsis = rightSibling < totalPages - 1;\n\n if (!showLeftEllipsis && showRightEllipsis) {\n const left = buildRange(1, siblings * 2 + 3);\n return [...left, 'ellipsis', totalPages];\n }\n\n if (showLeftEllipsis && !showRightEllipsis) {\n const right = buildRange(totalPages - (siblings * 2 + 2), totalPages);\n return [1, 'ellipsis', ...right];\n }\n\n return [1, 'ellipsis', ...buildRange(leftSibling, rightSibling), 'ellipsis', totalPages];\n}\n\nexport const Pagination = forwardRef<HTMLElement, PaginationProps>(\n ({ page, totalPages, onPageChange, siblingCount = 1, inactive = false, className }, ref) => {\n const pages = useMemo(() => buildPages(page, totalPages, siblingCount), [page, totalPages, siblingCount]);\n\n if (totalPages <= 1) return null;\n\n return (\n <nav ref={ref} aria-label=\"Pagination\" className={cn(styles.pagination, inactive && styles.inactive, className)}>\n <button\n type=\"button\"\n className={cn(styles.button, styles.nav)}\n disabled={page <= 1 || inactive}\n onClick={() => onPageChange(page - 1)}\n aria-label=\"Previous page\"\n >\n <Text variant=\"text-body-small\" as=\"span\" color=\"inherit\">&#x2039;</Text>\n </button>\n\n {pages.map((item, i) =>\n item === 'ellipsis' ? (\n <span key={`e${i}`} className={styles.ellipsis}>\n <Text variant=\"text-body-small\" as=\"span\" color=\"tertiary\">&hellip;</Text>\n </span>\n ) : (\n <button\n key={item}\n type=\"button\"\n className={cn(styles.button, item === page && styles.active)}\n onClick={() => onPageChange(item)}\n aria-current={item === page ? 'page' : undefined}\n disabled={inactive}\n >\n <Text variant={item === page ? 'text-body-small-emphasis' : 'text-body-small'} as=\"span\" color=\"inherit\">\n {item}\n </Text>\n </button>\n )\n )}\n\n <button\n type=\"button\"\n className={cn(styles.button, styles.nav)}\n disabled={page >= totalPages || inactive}\n onClick={() => onPageChange(page + 1)}\n aria-label=\"Next page\"\n >\n <Text variant=\"text-body-small\" as=\"span\" color=\"inherit\">&#x203A;</Text>\n </button>\n </nav>\n );\n }\n);\n\nPagination.displayName = 'Pagination';\n","import React, { forwardRef } from 'react';\nimport { cn } from '@/utils/cn';\nimport styles from './Divider.module.css';\n\nexport type DividerOrientation = 'horizontal' | 'vertical';\n\nexport interface DividerProps {\n /** Direction of the divider line. */\n orientation?: DividerOrientation;\n className?: string;\n}\n\nexport const Divider = forwardRef<HTMLHRElement, DividerProps>(\n ({ orientation = 'horizontal', className }, ref) => (\n <hr\n ref={ref}\n role=\"separator\"\n aria-orientation={orientation}\n className={cn(\n styles.divider,\n orientation === 'vertical' && styles.vertical,\n className\n )}\n />\n )\n);\n\nDivider.displayName = 'Divider';\n","import React, { forwardRef } from 'react';\nimport { cn } from '@/utils/cn';\nimport styles from './Skeleton.module.css';\n\nexport type SkeletonVariant = 'text' | 'circular' | 'rectangular';\n\nexport interface SkeletonProps {\n /** Shape of the skeleton. */\n variant?: SkeletonVariant;\n /** Width (CSS value). */\n width?: string | number;\n /** Height (CSS value). */\n height?: string | number;\n /** Number of text lines to render. Only applies to 'text' variant. */\n lines?: number;\n /** Whether to animate the shimmer. */\n animate?: boolean;\n className?: string;\n}\n\nexport const Skeleton = forwardRef<HTMLDivElement, SkeletonProps>(\n (\n {\n variant = 'text',\n width,\n height,\n lines = 1,\n animate = true,\n className,\n },\n ref\n ) => {\n if (variant === 'text' && lines > 1) {\n return (\n <div ref={ref} className={cn(styles.textGroup, className)} style={{ width }}>\n {Array.from({ length: lines }, (_, i) => (\n <div\n key={i}\n className={cn(styles.skeleton, styles.text, animate && styles.animate)}\n style={{\n width: i === lines - 1 ? '60%' : '100%',\n height,\n }}\n />\n ))}\n </div>\n );\n }\n\n return (\n <div\n ref={ref}\n className={cn(\n styles.skeleton,\n styles[variant],\n animate && styles.animate,\n className\n )}\n style={{ width, height }}\n aria-hidden=\"true\"\n />\n );\n }\n);\n\nSkeleton.displayName = 'Skeleton';\n","import React, { forwardRef, useEffect, useState, useCallback, useRef, useSyncExternalStore } from 'react';\nimport ReactDOM from 'react-dom';\nimport { cn } from '@/utils/cn';\nimport { Text } from '@/components/Text';\nimport { Surface } from '@/components/Surface';\nimport type { SurfaceIntent } from '@/components/Surface';\nimport styles from './Toast.module.css';\n\n/* ─── Toast Types ───────────────────────────────────────────────────────────── */\n\nexport type ToastIntent = 'neutral' | 'brand' | 'positive' | 'negative' | 'warning' | 'caution';\nexport type ToastPosition = 'top-center' | 'top-right' | 'bottom-center' | 'bottom-right';\n\nexport interface ToastData {\n id: string;\n message: string;\n intent?: ToastIntent;\n duration?: number;\n onDismiss?: () => void;\n}\n\nexport interface ToastOptions {\n message: string;\n intent?: ToastIntent;\n /** Auto-dismiss duration in ms. 0 = no auto-dismiss. Default 4000. */\n duration?: number;\n onDismiss?: () => void;\n}\n\n/* ─── Toast Store (external, framework-agnostic) ────────────────────────────── */\n\nlet toasts: ToastData[] = [];\nconst listeners = new Set<() => void>();\n\nfunction emit() {\n listeners.forEach(fn => fn());\n}\n\nfunction getSnapshot(): ToastData[] {\n return toasts;\n}\n\nfunction subscribe(listener: () => void) {\n listeners.add(listener);\n return () => { listeners.delete(listener); };\n}\n\nlet idCounter = 0;\n\nexport const toast = {\n show(options: ToastOptions): string {\n const id = `toast-${++idCounter}`;\n toasts = [...toasts, { id, ...options }];\n emit();\n return id;\n },\n info(message: string, options?: Omit<ToastOptions, 'message'>): string {\n return toast.show({ message, intent: 'neutral', ...options });\n },\n success(message: string, options?: Omit<ToastOptions, 'message'>): string {\n return toast.show({ message, intent: 'positive', ...options });\n },\n error(message: string, options?: Omit<ToastOptions, 'message'>): string {\n return toast.show({ message, intent: 'negative', ...options });\n },\n warning(message: string, options?: Omit<ToastOptions, 'message'>): string {\n return toast.show({ message, intent: 'warning', ...options });\n },\n dismiss(id: string) {\n toasts = toasts.filter(t => t.id !== id);\n emit();\n },\n dismissAll() {\n toasts = [];\n emit();\n },\n};\n\n/* ─── useToasts hook ────────────────────────────────────────────────────────── */\n\nexport function useToasts(): ToastData[] {\n return useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n}\n\n/* ─── Single Toast ──────────────────────────────────────────────────────────── */\n\nconst INTENT_MAP: Record<ToastIntent, SurfaceIntent> = {\n neutral: 'neutral',\n brand: 'brand',\n positive: 'positive',\n negative: 'negative',\n warning: 'warning',\n caution: 'caution',\n};\n\ninterface ToastItemProps {\n data: ToastData;\n}\n\nconst ToastItem: React.FC<ToastItemProps> = ({ data }) => {\n const [exiting, setExiting] = useState(false);\n const timerRef = useRef<ReturnType<typeof setTimeout>>();\n\n const dismiss = useCallback(() => {\n setExiting(true);\n setTimeout(() => {\n toast.dismiss(data.id);\n data.onDismiss?.();\n }, 200);\n }, [data]);\n\n useEffect(() => {\n const duration = data.duration ?? 4000;\n if (duration > 0) {\n timerRef.current = setTimeout(dismiss, duration);\n }\n return () => { if (timerRef.current) clearTimeout(timerRef.current); };\n }, [data.duration, dismiss]);\n\n return (\n <Surface\n intent={INTENT_MAP[data.intent ?? 'neutral']}\n contrast=\"bold\"\n elevation=\"floating\"\n radius=\"lg\"\n className={cn(styles.toast, exiting && styles.toastExit)}\n role=\"status\"\n aria-live=\"polite\"\n >\n <Text variant=\"text-body-medium\" as=\"span\" color=\"inherit\">\n {data.message}\n </Text>\n <button\n type=\"button\"\n className={styles.dismiss}\n onClick={dismiss}\n aria-label=\"Dismiss\"\n >\n &times;\n </button>\n </Surface>\n );\n};\n\n/* ─── ToastContainer ────────────────────────────────────────────────────────── */\n\nexport interface ToastContainerProps {\n /** Where to render toasts on screen. */\n position?: ToastPosition;\n}\n\nexport const ToastContainer = forwardRef<HTMLDivElement, ToastContainerProps>(\n ({ position = 'top-center' }, ref) => {\n const items = useToasts();\n\n if (typeof document === 'undefined') return null;\n\n return ReactDOM.createPortal(\n <div\n ref={ref}\n className={cn(styles.container, styles[positionClass(position)])}\n aria-label=\"Notifications\"\n >\n {items.map(item => (\n <ToastItem key={item.id} data={item} />\n ))}\n </div>,\n document.body\n );\n }\n);\n\nToastContainer.displayName = 'ToastContainer';\n\nfunction positionClass(position: ToastPosition): string {\n switch (position) {\n case 'top-center': return 'topCenter';\n case 'top-right': return 'topRight';\n case 'bottom-center': return 'bottomCenter';\n case 'bottom-right': return 'bottomRight';\n }\n}\n"],"names":["colorClassMap","styles","decorationClassMap","alignClassMap","truncationClassMap","isCustomColor","color","Text","forwardRef","variant","children","decoration","italic","align","lineTruncation","wrap","Component","id","htmlFor","className","style","ref","wrapClass","truncationClass","classes","computedStyle","props","jsx","backgroundClassMap","elevationClassMap","edgeClassMap","radiusClassMap","getIntentContrastClass","intent","contrast","intentKey","contrastKey","isPresetRadius","radius","Surface","background","elevation","edge","interactive","selected","inactive","type","rest","e","hasStyle","elementProps","cn","Card","header","footer","jsxs","LabelWrap","size","truncate","Loader","ICON_SIZE_MAP","TEXT_STYLE_MAP","Button","as","label","Icon","rounded","fullWidth","width","dropdown","badgeCount","loading","onClick","onMouseEnter","onMouseLeave","ariaLabel","href","target","rel","isButton","isInteractive","hasIcon","hasLabel","showLeading","isIconOnly","isLabelOnly","isIconAndLabel","iconSize","textStyle","effectiveElevation","elevKey","resolvedAriaLabel","extraProps","ChevronDown","ToggleButton","pressed","onPressedChange","ButtonGroup","items","React","count","firstEl","firstProps","firstVariant","firstElevation","groupRounded","groupElevKey","child","i","el","p","isFirst","isLast","isMid","isRounded","isGhost","isPrimary","sizeKey","needsRoundedCorrection","dividerClasses","ToggleButtonGroup","groupElevation","isPressed","ICON_SIZE","Tag","removable","onRemove","RemoveIcon","maxWidth","hasRemove","Cross","Badge","isSelected","displayText","Toggle","checked","onChange","setIsPressed","useState","handleMouseDown","handleMouseUp","handleMouseLeave","Checkbox","indeterminate","CheckedIcon","UncheckedIcon","IndeterminateIcon","handleClick","iconColor","Input","value","placeholder","autoFocus","onKeyDown","suffix","ClearIcon","showClear","handleClear","Slider","min","max","step","idProp","generatedId","useId","containerRef","useRef","pct","setPct","range","sync","useCallback","useEffect","handleInput","Field","WIDTH_MAP","CLOSE_ANIMATION_MS","Modal","isOpen","onClose","title","subtitle","bodyClassName","dialogRef","titleId","isClosing","setIsClosing","shouldRender","setShouldRender","resolvedWidth","useMemo","timer","handleEscape","_a","createPortal","MenuItem","isInactive","labelColor","subtext","showToggle","toggleValue","selectionStyle","showTrailingChevron","CheckIcon","ChevronIcon","useRadioStyle","DestructiveMenuItem","holdDuration","progress","setProgress","pressTimerRef","startTimeRef","animationFrameRef","resetState","animate","elapsed","newProgress","getCssSpacePx","property","fallback","raw","parsed","getCssTimeMs","Menu","anchorRef","sections","side","sideOffset","alignOffset","sideOffsetToken","alignOffsetToken","minWidth","matchAnchorWidth","matchAnchorWidthOffset","usePortal","isPositionReady","setIsPositionReady","position","setPosition","menuSize","setMenuSize","anchorSize","setAnchorSize","positionCalculatedRef","menuRef","lastSectionsRef","menuSections","hasItems","s","sectionsToRender","useLayoutEffect","updateSize","rect","observer","calculatePosition","anchor","menu","anchorRect","menuRect","menuWidth","menuHeight","gap","alignOff","x","y","vp","handleScrollResize","handleClickOutside","event","_b","renderMenuItem","item","index","MenuItemComponent","menuStyle","menuContent","section","sectionIndex","itemIndex","HOVER_DELAY_FALLBACK_MS","INSTANT_REOPEN_MS","FADE_OUT_DURATION_MS","lastTooltipDismissedAt","Tooltip","delay","shortcutKey","shortcutKeyPosition","hoverDelayMs","resolvedDelay","tooltipRef","setAnchorRef","childEl","childRef","open","setOpen","tooltipSize","setTooltipSize","delayTimerRef","closeTimerRef","viewportPadding","clearDelayTimer","handleOpen","handleClose","w","a","tw","th","onScrollResize","keyHint","tooltipContent","trigger","triggerWithRefAndHandlers","Fragment","Select","options","isMenuOpen","setIsMenuOpen","buttonRef","selectedOption","opt","selectedLabel","menuItems","option","handleToggle","prev","TOAST_DURATION_FALLBACK_MS","getContentColorVar","Banner","message","floating","onDismiss","toastDurationMs","messageColor","dismissTimerRef","scheduleDismiss","content","getColumnValue","column","row","compareValues","b","direction","mult","Table","columns","data","sortState","onSort","onRowClick","selectedRows","pagination","onPaginationChange","emptyMessage","visibleColumns","c","gridTemplateColumns","col","sortedData","pagedData","start","totalPages","isEmpty","handleSort","columnId","_","rowIndex","Tab","bgClass","defaultMessages","EmptyState","sideClassMap","Fade","height","Scrollbar","showTrackOnHover","onScroll","fadeOverlay","externalContentRef","internalContentRef","contentRef","thumbRef","thumbHRef","thumbHeight","setThumbHeight","thumbTop","setThumbTop","thumbWidth","setThumbWidth","thumbLeft","setThumbLeft","isDragging","setIsDragging","isDraggingH","setIsDraggingH","isPointerInside","setIsPointerInside","dragStartY","dragStartScrollTop","dragStartX","dragStartScrollLeft","handleMouseEnter","updateThumb","container","containerHeight","containerWidth","contentHeight","contentWidth","scrollTop","scrollLeft","ratio","h","handleScroll","handleResize","handleThumbMouseDown","handleMouseMove","deltaY","scrollableHeight","scrollRatio","handleThumbHMouseDown","deltaX","scrollableWidth","showThumb","showThumbH","showTrack","ErrorBoundary","error","errorInfo","MINI_WIDTH","DEFAULT_WIDTH","MIN_DRAG_WIDTH","SNAP_THRESHOLD","Sidebar","isCollapsed","onToggle","onWidthChange","resizable","isMobile","internalRef","sidebarRef","isResizing","setIsResizing","isMini","newWidth","SidebarSection","collapsible","defaultCollapsed","setIsCollapsed","SidebarItem","isDisabled","badge","Header","left","center","right","RadioGroup","RadioItem","TabGroup","tabs","activeIndex","onTabChange","tabsRef","indicator","setIndicator","updateIndicator","tab","Accordion","multiple","controlledIds","onExpandedChange","internalIds","setInternalIds","expandedIds","toggle","next","AccordionItem","isExpanded","setHeight","measure","ro","Breadcrumb","separator","buildRange","end","buildPages","page","siblings","totalSlots","leftSibling","rightSibling","showLeftEllipsis","showRightEllipsis","Pagination","onPageChange","siblingCount","pages","Divider","orientation","Skeleton","lines","toasts","listeners","emit","fn","getSnapshot","subscribe","listener","idCounter","toast","useToasts","useSyncExternalStore","INTENT_MAP","ToastItem","exiting","setExiting","timerRef","dismiss","duration","ToastContainer","ReactDOM","positionClass"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../src/components/Text/Text.module.css","../src/components/Text/Text.tsx","../src/components/Surface/Surface.module.css","../src/components/Surface/Surface.tsx","../src/components/Card/Card.module.css","../src/utils/cn.ts","../src/components/Card/Card.tsx","../src/components/LabelWrap/LabelWrap.module.css","../src/components/LabelWrap/LabelWrap.tsx","../src/components/Loader/Loader.module.css","../src/components/Loader/Loader.tsx","../src/components/Button/Button.module.css","../src/components/Button/Button.tsx","../src/components/ToggleButton/ToggleButton.module.css","../src/components/ToggleButton/ToggleButton.tsx","../src/components/ButtonGroup/ButtonGroup.module.css","../src/components/ButtonGroup/ButtonGroup.tsx","../src/components/ToggleButtonGroup/ToggleButtonGroup.module.css","../src/components/ToggleButtonGroup/ToggleButtonGroup.tsx","../src/components/Tag/Tag.module.css","../src/components/Tag/Tag.tsx","../src/components/Badge/Badge.module.css","../src/components/Badge/Badge.tsx","../src/components/Toggle/Toggle.module.css","../src/components/Toggle/Toggle.tsx","../src/components/Checkbox/Checkbox.module.css","../src/components/Checkbox/Checkbox.tsx","../src/components/Input/Input.module.css","../src/components/Input/Input.tsx","../src/components/Slider/Slider.module.css","../src/components/Slider/Slider.tsx","../src/components/Field/Field.module.css","../src/components/Field/Field.tsx","../src/components/Modal/Modal.module.css","../src/components/Modal/Modal.tsx","../src/components/Menu/MenuItem.module.css","../src/components/Menu/MenuItem.tsx","../src/components/Menu/DestructiveMenuItem.module.css","../src/components/Menu/DestructiveMenuItem.tsx","../src/utils/css-tokens.ts","../src/components/Menu/Menu.module.css","../src/components/Menu/Menu.tsx","../src/components/Tooltip/Tooltip.module.css","../src/components/Tooltip/Tooltip.tsx","../src/components/Select/Select.module.css","../src/components/Select/Select.tsx","../src/components/Banner/Banner.module.css","../src/components/Banner/Banner.tsx","../src/components/Table/Table.module.css","../src/components/Table/Table.tsx","../src/components/Tab/Tab.module.css","../src/components/Tab/Tab.tsx","../src/components/EmptyState/EmptyState.module.css","../src/components/EmptyState/EmptyState.tsx","../src/components/Fade/Fade.module.css","../src/components/Fade/Fade.tsx","../src/components/Scrollbar/Scrollbar.module.css","../src/components/Scrollbar/Scrollbar.tsx","../src/components/ErrorBoundary/ErrorBoundary.module.css","../src/components/ErrorBoundary/ErrorBoundary.tsx","../src/components/Sidebar/Sidebar.module.css","../src/components/Sidebar/Sidebar.tsx","../src/components/Sidebar/SidebarSection.tsx","../src/components/Sidebar/SidebarItem.tsx","../src/components/Header/Header.module.css","../src/components/Header/Header.tsx","../src/components/Radio/Radio.module.css","../src/components/Radio/Radio.tsx","../src/components/TabGroup/TabGroup.module.css","../src/components/TabGroup/TabGroup.tsx","../src/components/Accordion/Accordion.module.css","../src/components/Accordion/Accordion.tsx","../src/components/Breadcrumb/Breadcrumb.module.css","../src/components/Breadcrumb/Breadcrumb.tsx","../src/components/Pagination/Pagination.module.css","../src/components/Pagination/Pagination.tsx","../src/components/Divider/Divider.module.css","../src/components/Divider/Divider.tsx","../src/components/Skeleton/Skeleton.module.css","../src/components/Skeleton/Skeleton.tsx","../src/components/Toast/Toast.module.css","../src/components/Toast/Toast.tsx"],"sourcesContent":[".text {\n margin: 0;\n}\n\n/* ============================================\n LINE TRUNCATION\n ============================================ */\n\n.truncate1Line {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.truncate2Lines {\n overflow: hidden;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n text-overflow: ellipsis;\n word-break: break-word;\n}\n\n.truncate3Lines {\n overflow: hidden;\n display: -webkit-box;\n -webkit-line-clamp: 3;\n -webkit-box-orient: vertical;\n text-overflow: ellipsis;\n word-break: break-word;\n}\n\n.truncate4Lines {\n overflow: hidden;\n display: -webkit-box;\n -webkit-line-clamp: 4;\n -webkit-box-orient: vertical;\n text-overflow: ellipsis;\n word-break: break-word;\n}\n\n.truncate5Lines {\n overflow: hidden;\n display: -webkit-box;\n -webkit-line-clamp: 5;\n -webkit-box-orient: vertical;\n text-overflow: ellipsis;\n word-break: break-word;\n}\n\n.noTruncation {\n word-break: break-word;\n white-space: normal;\n}\n\n.wrapNowrap {\n white-space: nowrap;\n word-break: normal;\n overflow: hidden;\n text-overflow: ellipsis;\n min-width: 0;\n}\n\n.wrapBalance {\n text-wrap: balance;\n}\n\n.wrapPretty {\n text-wrap: pretty;\n}\n\n/* ============================================\n TEXT COLOR - Semantic Tokens\n ============================================ */\n\n.colorPrimary {\n color: var(--color-foreground-primary);\n}\n\n.colorSecondary {\n color: var(--color-foreground-secondary);\n}\n\n.colorTertiary {\n color: var(--color-foreground-tertiary);\n}\n\n.colorBrand {\n color: var(--color-foreground-bold-brand);\n}\n\n.colorNegative {\n color: var(--color-foreground-bold-negative);\n}\n\n.colorPositive {\n color: var(--color-foreground-bold-positive);\n}\n\n.colorWarning {\n color: var(--color-foreground-bold-warning);\n}\n\n.colorCaution {\n color: var(--color-foreground-bold-caution);\n}\n\n.colorAi {\n color: var(--color-foreground-bold-ai);\n}\n\n.colorOnStrong {\n color: var(--color-foreground-on-strong-background-primary);\n}\n\n.colorOnBold {\n color: var(--color-foreground-on-bold-background-primary);\n}\n\n.colorInherit {\n color: inherit;\n}\n\n/* ============================================\n TEXT DECORATION\n ============================================ */\n\n.decorationNone {\n text-decoration: none;\n}\n\n.decorationUnderline {\n text-decoration: underline;\n text-underline-offset: 2px;\n text-decoration-thickness: 1px;\n}\n\n.decorationDottedUnderline {\n text-decoration: underline dotted;\n text-underline-offset: 2px;\n text-decoration-thickness: 1px;\n}\n\n/* ============================================\n FONT STYLE\n ============================================ */\n\n.italic {\n font-style: italic;\n}\n\n/* ============================================\n TEXT ALIGNMENT\n ============================================ */\n\n.alignLeft {\n text-align: left;\n}\n\n.alignCenter {\n text-align: center;\n}\n\n.alignRight {\n text-align: right;\n}\n","import React, { forwardRef } from 'react';\nimport styles from './Text.module.css';\n\n/**\n * Text variant options.\n * Each variant maps to a TokoMo typography class with predefined font-size, line-height,\n * font-weight, and letter-spacing.\n */\nexport type TextVariant =\n | 'text-display-medium'\n | 'text-display-small'\n | 'text-title-large'\n | 'text-title-medium'\n | 'text-title-small'\n | 'text-body-large'\n | 'text-body-large-emphasis'\n | 'text-body-medium'\n | 'text-body-medium-emphasis'\n | 'text-body-small'\n | 'text-body-small-emphasis'\n | 'text-caption'\n | 'text-caption-emphasis';\n\n/** @deprecated Use `TextVariant` instead. */\nexport type TextStyle = TextVariant;\n\n/**\n * Semantic color tokens for text.\n * Maps to TokoMo --color-foreground-* CSS custom properties.\n */\nexport type TextColorToken =\n | 'primary'\n | 'secondary'\n | 'tertiary'\n | 'brand'\n | 'negative'\n | 'positive'\n | 'warning'\n | 'caution'\n | 'ai'\n | 'on-strong'\n | 'on-bold'\n | 'inherit';\n\n/** Text color — semantic token or CSS variable escape hatch. */\nexport type TextColor = TextColorToken | `var(--${string})`;\n\nexport type TextDecoration = 'none' | 'underline' | 'dotted-underline';\nexport type TextAlign = 'left' | 'center' | 'right';\nexport type LineTruncation = 1 | 2 | 3 | 4 | 5 | 'none';\nexport type TextWrap = 'wrap' | 'nowrap' | 'balance' | 'pretty';\nexport type TextElement = 'p' | 'span' | 'div' | 'label' | 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6';\n\nexport interface TextProps {\n /** Typography variant. Maps to a TokoMo typography class. Defaults to 'text-body-medium'. */\n variant?: TextVariant;\n children: React.ReactNode;\n\n // Appearance\n color?: TextColor;\n decoration?: TextDecoration;\n italic?: boolean;\n align?: TextAlign;\n\n // Truncation / wrap\n /** Max lines before ellipsis. Ignored when wrap is 'nowrap'. Defaults to 'none'. */\n lineTruncation?: LineTruncation;\n /** 'nowrap' = single line, truncates with ellipsis when constrained. */\n wrap?: TextWrap;\n\n // Semantic HTML\n as?: TextElement;\n id?: string;\n htmlFor?: string;\n\n // Escape hatches\n className?: string;\n style?: React.CSSProperties;\n}\n\nconst colorClassMap: Record<TextColorToken, string> = {\n primary: styles.colorPrimary,\n secondary: styles.colorSecondary,\n tertiary: styles.colorTertiary,\n brand: styles.colorBrand,\n negative: styles.colorNegative,\n positive: styles.colorPositive,\n warning: styles.colorWarning,\n caution: styles.colorCaution,\n ai: styles.colorAi,\n 'on-strong': styles.colorOnStrong,\n 'on-bold': styles.colorOnBold,\n inherit: styles.colorInherit,\n};\n\nconst decorationClassMap: Record<TextDecoration, string> = {\n none: styles.decorationNone,\n underline: styles.decorationUnderline,\n 'dotted-underline': styles.decorationDottedUnderline,\n};\n\nconst alignClassMap: Record<TextAlign, string> = {\n left: styles.alignLeft,\n center: styles.alignCenter,\n right: styles.alignRight,\n};\n\nconst truncationClassMap: Record<LineTruncation, string> = {\n 1: styles.truncate1Line,\n 2: styles.truncate2Lines,\n 3: styles.truncate3Lines,\n 4: styles.truncate4Lines,\n 5: styles.truncate5Lines,\n none: styles.noTruncation,\n};\n\nconst isCustomColor = (color: TextColor): color is `var(--${string})` =>\n color.startsWith('var(--');\n\nexport const Text = forwardRef<HTMLElement, TextProps>(\n (\n {\n variant = 'text-body-medium',\n children,\n color,\n decoration,\n italic,\n align,\n lineTruncation = 'none',\n wrap,\n as: Component = 'p',\n id,\n htmlFor,\n className = '',\n style,\n },\n ref\n ) => {\n const wrapClass =\n wrap === 'nowrap' ? styles.wrapNowrap\n : wrap === 'balance' ? styles.wrapBalance\n : wrap === 'pretty' ? styles.wrapPretty\n : '';\n const truncationClass =\n wrap === 'nowrap' ? '' : truncationClassMap[lineTruncation];\n\n const classes = [\n variant,\n styles.text,\n wrapClass,\n truncationClass,\n color && !isCustomColor(color) ? colorClassMap[color] : '',\n decoration ? decorationClassMap[decoration] : '',\n italic ? styles.italic : '',\n align ? alignClassMap[align] : '',\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n const computedStyle: React.CSSProperties = {\n ...style,\n ...(color && isCustomColor(color) ? { color } : {}),\n };\n\n const props: React.HTMLAttributes<HTMLElement> & { htmlFor?: string } = {\n className: classes,\n style: Object.keys(computedStyle).length > 0 ? computedStyle : undefined,\n ...(id ? { id } : {}),\n ...(Component === 'label' && htmlFor ? { htmlFor } : {}),\n };\n\n return (\n <Component ref={ref as React.Ref<never>} {...props}>\n {children}\n </Component>\n );\n }\n);\n\nText.displayName = 'Text';\n","/**\n * Surface — lean container primitive.\n * Backgrounds, elevation, edges, radius, and interactive states.\n * Hover/pressed via direct background-color + color-mix(). No pseudo-element overlays.\n */\n\n.surface {\n box-sizing: border-box;\n position: relative;\n /* Reset native button/anchor chrome when rendered as those elements */\n border: none;\n padding: 0;\n margin: 0;\n font: inherit;\n color: inherit;\n background: none;\n text-decoration: none;\n text-align: left;\n cursor: default;\n appearance: none;\n -webkit-appearance: none;\n}\n\n/* ==========================================================================\n Backgrounds\n ========================================================================== */\n\n.bgPrimary {\n background-color: var(--color-background-primary);\n}\n\n.bgSecondary {\n background-color: var(--color-background-secondary);\n}\n\n.bgTransparent {\n background-color: transparent;\n}\n\n.bgTranslucent {\n background-color: var(--color-background-translucent);\n backdrop-filter: blur(var(--effect-blur-md));\n -webkit-backdrop-filter: blur(var(--effect-blur-md));\n}\n\n/* ==========================================================================\n Semantic Intent Backgrounds — intent{Intent}{Contrast}\n ========================================================================== */\n\n/* Brand */\n.intentBrandFaint { background-color: var(--color-background-faint-brand); }\n.intentBrandMedium { background-color: var(--color-background-medium-brand); }\n.intentBrandBold { background-color: var(--color-background-bold-brand); }\n.intentBrandStrong { background-color: var(--color-background-strong-brand); }\n\n/* Positive */\n.intentPositiveFaint { background-color: var(--color-background-faint-positive); }\n.intentPositiveMedium { background-color: var(--color-background-medium-positive); }\n.intentPositiveBold { background-color: var(--color-background-bold-positive); }\n.intentPositiveStrong { background-color: var(--color-background-strong-positive); }\n\n/* Negative */\n.intentNegativeFaint { background-color: var(--color-background-faint-negative); }\n.intentNegativeMedium { background-color: var(--color-background-medium-negative); }\n.intentNegativeBold { background-color: var(--color-background-bold-negative); }\n.intentNegativeStrong { background-color: var(--color-background-strong-negative); }\n\n/* Warning */\n.intentWarningFaint { background-color: var(--color-background-faint-warning); }\n.intentWarningMedium { background-color: var(--color-background-medium-warning); }\n.intentWarningBold { background-color: var(--color-background-bold-warning); }\n.intentWarningStrong { background-color: var(--color-background-strong-warning); }\n\n/* Caution */\n.intentCautionFaint { background-color: var(--color-background-faint-caution); }\n.intentCautionMedium { background-color: var(--color-background-medium-caution); }\n.intentCautionBold { background-color: var(--color-background-bold-caution); }\n.intentCautionStrong { background-color: var(--color-background-strong-caution); }\n\n/* AI */\n.intentAiFaint { background-color: var(--color-background-faint-ai); }\n.intentAiMedium { background-color: var(--color-background-medium-ai); }\n.intentAiBold { background-color: var(--color-background-bold-ai); }\n.intentAiStrong { background-color: var(--color-background-strong-ai); }\n\n/* Neutral */\n.intentNeutralFaint { background-color: var(--color-background-faint-neutral); }\n.intentNeutralMedium { background-color: var(--color-background-medium-neutral); }\n.intentNeutralBold { background-color: var(--color-background-bold-neutral); }\n.intentNeutralStrong { background-color: var(--color-background-strong-neutral); }\n\n/* Walkthrough */\n.intentWalkthroughFaint { background-color: var(--color-background-faint-walkthrough); }\n.intentWalkthroughMedium { background-color: var(--color-background-medium-walkthrough); }\n.intentWalkthroughBold { background-color: var(--color-background-bold-walkthrough); }\n.intentWalkthroughStrong { background-color: var(--color-background-strong-walkthrough); }\n\n/* Guide */\n.intentGuideFaint { background-color: var(--color-background-faint-guide); }\n.intentGuideMedium { background-color: var(--color-background-medium-guide); }\n.intentGuideBold { background-color: var(--color-background-bold-guide); }\n.intentGuideStrong { background-color: var(--color-background-strong-guide); }\n\n/* ==========================================================================\n Elevation — progressive: none → flat → elevated → floating\n ========================================================================== */\n\n.elevationNone {}\n\n.elevationDepressed {\n box-shadow: var(--effect-elevation-depressed-sm);\n}\n\n.elevationDepressedMd {\n box-shadow: var(--effect-elevation-depressed-md);\n}\n\n.elevationFlat {\n box-shadow: var(--effect-elevation-elevated-sm);\n}\n\n.elevationElevated {\n box-shadow: var(--effect-elevation-elevated-md);\n}\n\n.elevationFloating {\n box-shadow: var(--effect-elevation-elevated-floating);\n}\n\n.elevationOverlayTop {\n box-shadow: var(--effect-elevation-elevated-panel-top);\n}\n\n.elevationOverlayRight {\n box-shadow: var(--effect-elevation-elevated-panel-right);\n}\n\n.elevationOverlayBottom {\n box-shadow: var(--effect-elevation-elevated-panel-bottom);\n}\n\n.elevationOverlayLeft {\n box-shadow: var(--effect-elevation-elevated-panel-left);\n}\n\n/* ==========================================================================\n Edge Borders (only when elevation='none')\n ========================================================================== */\n\n.edgeTop { border-top: var(--dimension-stroke-width-015) solid var(--color-border-tertiary); }\n.edgeRight { border-right: var(--dimension-stroke-width-015) solid var(--color-border-tertiary); }\n.edgeBottom { border-bottom: var(--dimension-stroke-width-015) solid var(--color-border-tertiary); }\n.edgeLeft { border-left: var(--dimension-stroke-width-015) solid var(--color-border-tertiary); }\n\n/* ==========================================================================\n Corner Radius\n ========================================================================== */\n\n.radiusNone { border-radius: var(--dimension-radius-000); }\n.radiusXs { border-radius: var(--dimension-radius-050); }\n.radiusSm { border-radius: var(--dimension-radius-075); }\n.radiusMd { border-radius: var(--dimension-radius-100); }\n.radiusLg { border-radius: var(--dimension-radius-125); }\n.radiusXl { border-radius: var(--dimension-radius-175); }\n.radius2xl { border-radius: var(--dimension-radius-200); }\n.radiusFull { border-radius: var(--dimension-radius-half); }\n\n/* ==========================================================================\n Interactive States — direct background-color, no pseudo-elements\n ========================================================================== */\n\n.interactive {\n cursor: pointer;\n transition: transform var(--effect-motion-short-2);\n\n /* Interaction — ghost defaults */\n --_hover-bg: var(--color-interaction-hover);\n --_pressed-bg: var(--color-interaction-pressed);\n}\n\n.interactive:hover {\n background-color: var(--_hover-bg);\n}\n\n.interactive:active {\n background-color: var(--_pressed-bg);\n transform: scale(var(--dimension-scale-subtle));\n}\n\n.interactive:focus-visible {\n outline: var(--dimension-stroke-width-025) solid var(--color-interaction-focus);\n outline-offset: var(--dimension-space-025);\n}\n\n/* ==========================================================================\n Selected State — persistent overlay on any background via ::before\n ========================================================================== */\n\n.selected::before {\n content: '';\n position: absolute;\n inset: 0;\n border-radius: inherit;\n pointer-events: none;\n z-index: 0;\n background-color: var(--color-interaction-hover);\n}\n\n.selected > * {\n position: relative;\n z-index: 1;\n}\n\n/* ==========================================================================\n Inactive State\n ========================================================================== */\n\n.inactive {\n opacity: 0.5;\n cursor: not-allowed;\n pointer-events: none;\n}\n","import React, { forwardRef } from 'react';\nimport styles from './Surface.module.css';\n\n/**\n * Semantic intent for colored surfaces.\n * Each intent has four contrast levels (faint, medium, bold, strong).\n */\nexport type SurfaceIntent =\n | 'brand'\n | 'positive'\n | 'negative'\n | 'warning'\n | 'caution'\n | 'ai'\n | 'neutral'\n | 'walkthrough'\n | 'guide';\n\n/** Background type for non-intent surfaces. */\nexport type SurfaceBackground = 'primary' | 'secondary' | 'transparent' | 'translucent';\n\n/** Contrast level for semantic intents. */\nexport type SurfaceContrast = 'faint' | 'medium' | 'bold' | 'strong';\n\n/** Elevation for depth/shadow effects. Progressive: none → flat → elevated → floating. */\nexport type SurfaceElevation =\n | 'none'\n | 'depressed'\n | 'depressed-md'\n | 'flat'\n | 'elevated'\n | 'floating'\n | 'overlayTop'\n | 'overlayRight'\n | 'overlayBottom'\n | 'overlayLeft';\n\n/** Edge divider border direction. */\nexport type SurfaceEdge = 'top' | 'right' | 'bottom' | 'left';\n\n/** Corner radius presets. */\nexport type SurfaceRadiusPreset = 'none' | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 'full';\n\n/** Corner radius — preset, CSS variable, or custom string (e.g. '12px 12px 0 0'). */\nexport type SurfaceRadius = SurfaceRadiusPreset | (string & {});\n\n/** HTML elements Surface can render as. */\nexport type SurfaceElement =\n | 'div'\n | 'section'\n | 'aside'\n | 'article'\n | 'header'\n | 'footer'\n | 'main'\n | 'nav'\n | 'span'\n | 'button'\n | 'td'\n | 'th';\n\n/** Props shared by both surface modes. */\ninterface SurfaceBaseProps extends React.HTMLAttributes<HTMLElement> {\n children?: React.ReactNode;\n /** Elevation for depth/shadow effects. Defaults to 'none'. */\n elevation?: SurfaceElevation;\n /** Edge divider border(s). Only applies when elevation is 'none'. */\n edge?: SurfaceEdge | SurfaceEdge[];\n /** Corner radius — preset or CSS variable. */\n radius?: SurfaceRadius;\n /** Enable hover/pressed interaction overlay. */\n interactive?: boolean;\n /** Apply selected background state. */\n selected?: boolean;\n /** Dim and disable pointer events. */\n inactive?: boolean;\n /** HTML element to render. Defaults to 'div'. */\n as?: SurfaceElement;\n /** Button type — only used when as='button'. */\n type?: 'button' | 'submit' | 'reset';\n}\n\n/** Non-intent surface — uses a basic background color. */\ninterface SurfaceDefaultProps extends SurfaceBaseProps {\n /** Background color. Defaults to 'transparent'. */\n background?: SurfaceBackground;\n intent?: never;\n contrast?: never;\n}\n\n/** Intent surface — uses a semantic color with contrast level. */\ninterface SurfaceIntentProps extends SurfaceBaseProps {\n /** Semantic intent color. */\n intent: SurfaceIntent;\n /** Contrast level for the intent background. Defaults to 'faint'. */\n contrast?: SurfaceContrast;\n background?: never;\n}\n\nexport type SurfaceProps = SurfaceDefaultProps | SurfaceIntentProps;\n\nconst backgroundClassMap: Record<SurfaceBackground, string> = {\n primary: styles.bgPrimary,\n secondary: styles.bgSecondary,\n transparent: styles.bgTransparent,\n translucent: styles.bgTranslucent,\n};\n\nconst elevationClassMap: Record<SurfaceElevation, string> = {\n none: styles.elevationNone,\n depressed: styles.elevationDepressed,\n 'depressed-md': styles.elevationDepressedMd,\n flat: styles.elevationFlat,\n elevated: styles.elevationElevated,\n floating: styles.elevationFloating,\n overlayTop: styles.elevationOverlayTop,\n overlayRight: styles.elevationOverlayRight,\n overlayBottom: styles.elevationOverlayBottom,\n overlayLeft: styles.elevationOverlayLeft,\n};\n\nconst edgeClassMap: Record<SurfaceEdge, string> = {\n top: styles.edgeTop,\n right: styles.edgeRight,\n bottom: styles.edgeBottom,\n left: styles.edgeLeft,\n};\n\nconst radiusClassMap: Record<SurfaceRadiusPreset, string> = {\n none: styles.radiusNone,\n xs: styles.radiusXs,\n sm: styles.radiusSm,\n md: styles.radiusMd,\n lg: styles.radiusLg,\n xl: styles.radiusXl,\n '2xl': styles.radius2xl,\n full: styles.radiusFull,\n};\n\nconst getIntentContrastClass = (intent: SurfaceIntent, contrast: SurfaceContrast): string => {\n const intentKey = intent.charAt(0).toUpperCase() + intent.slice(1);\n const contrastKey = contrast.charAt(0).toUpperCase() + contrast.slice(1);\n return styles[`intent${intentKey}${contrastKey}`] || '';\n};\n\nconst isPresetRadius = (radius: SurfaceRadius): radius is SurfaceRadiusPreset =>\n radius in radiusClassMap;\n\nexport const Surface = forwardRef<HTMLElement, SurfaceProps>(\n (\n {\n children,\n background = 'transparent',\n intent,\n contrast = 'faint',\n elevation = 'none',\n edge,\n radius,\n interactive = false,\n selected = false,\n inactive = false,\n as: Component = 'div',\n className = '',\n style,\n type,\n ...rest\n },\n ref\n ) => {\n const classes = [\n styles.surface,\n // Background or intent+contrast\n intent\n ? getIntentContrastClass(intent, contrast)\n : backgroundClassMap[background],\n // Elevation\n elevationClassMap[elevation],\n // Edge(s) — only when elevation is 'none'\n ...(edge && elevation === 'none'\n ? Array.isArray(edge)\n ? edge.map(e => edgeClassMap[e])\n : [edgeClassMap[edge]]\n : []),\n // Radius (preset only — custom handled via inline style)\n radius && isPresetRadius(radius) ? radiusClassMap[radius] : '',\n // States\n interactive ? styles.interactive : '',\n selected ? styles.selected : '',\n inactive ? styles.inactive : '',\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n const computedStyle: React.CSSProperties = {\n ...style,\n ...(radius && !isPresetRadius(radius) ? { borderRadius: radius } : {}),\n };\n\n const hasStyle =\n (radius && !isPresetRadius(radius)) || (style && Object.keys(style).length > 0);\n\n const elementProps = {\n ref,\n className: classes,\n style: hasStyle ? computedStyle : undefined,\n disabled: Component === 'button' ? inactive : undefined,\n type: Component === 'button' ? type || 'button' : undefined,\n ...rest,\n };\n\n return (\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n <Component {...(elementProps as any)}>{children}</Component>\n );\n }\n);\n\nSurface.displayName = 'Surface';\n","/**\n * Card — structured container with optional header/footer.\n * Uses TokoMo tokens directly (not built on Surface).\n */\n\n.card {\n box-sizing: border-box;\n background-color: var(--color-background-primary);\n overflow: hidden;\n}\n\n/* Elevation */\n.elevationFlat { box-shadow: var(--effect-elevation-elevated-none); }\n.elevationElevated { box-shadow: var(--effect-elevation-elevated-sm); }\n.elevationFloating { box-shadow: var(--effect-elevation-elevated-floating); }\n\n/* Radius */\n.radiusSm { border-radius: var(--dimension-radius-075); }\n.radiusMd { border-radius: var(--dimension-radius-100); }\n.radiusLg { border-radius: var(--dimension-radius-125); }\n.radiusXl { border-radius: var(--dimension-radius-175); }\n\n/* Sections */\n.header {\n padding: var(--dimension-space-150) var(--dimension-space-200);\n border-bottom: var(--dimension-stroke-width-015) solid var(--color-border-primary);\n}\n\n.body {\n padding: var(--dimension-space-200);\n}\n\n.footer {\n padding: var(--dimension-space-150) var(--dimension-space-200);\n border-top: var(--dimension-stroke-width-015) solid var(--color-border-primary);\n}\n","/**\n * Joins class names, filtering out falsy values.\n */\nexport function cn(...classes: (string | undefined | null | false)[]): string {\n return classes.filter(Boolean).join(' ');\n}\n","import React, { forwardRef } from 'react';\nimport styles from './Card.module.css';\nimport { cn } from '@/utils/cn';\n\nexport type CardElevation = 'flat' | 'elevated' | 'floating';\nexport type CardRadius = 'sm' | 'md' | 'lg' | 'xl';\n\nexport interface CardProps {\n children: React.ReactNode;\n /** Optional header content — rendered with a bottom divider. */\n header?: React.ReactNode;\n /** Optional footer content — rendered with a top divider. */\n footer?: React.ReactNode;\n /** Elevation level. Defaults to 'elevated'. */\n elevation?: CardElevation;\n /** Corner radius. Defaults to 'lg'. */\n radius?: CardRadius;\n /** Additional CSS classes. */\n className?: string;\n /** Inline styles. */\n style?: React.CSSProperties;\n}\n\nconst elevationClassMap: Record<CardElevation, string> = {\n flat: styles.elevationFlat,\n elevated: styles.elevationElevated,\n floating: styles.elevationFloating,\n};\n\nconst radiusClassMap: Record<CardRadius, string> = {\n sm: styles.radiusSm,\n md: styles.radiusMd,\n lg: styles.radiusLg,\n xl: styles.radiusXl,\n};\n\nexport const Card = forwardRef<HTMLDivElement, CardProps>(\n ({ children, header, footer, elevation = 'elevated', radius = 'lg', className, style }, ref) => {\n return (\n <div\n ref={ref}\n className={cn(styles.card, elevationClassMap[elevation], radiusClassMap[radius], className)}\n style={style}\n >\n {header && <div className={styles.header}>{header}</div>}\n <div className={styles.body}>{children}</div>\n {footer && <div className={styles.footer}>{footer}</div>}\n </div>\n );\n }\n);\n\nCard.displayName = 'Card';\n","/* ==========================================================================\n LabelWrap — internal utility\n Kills the inherited line-height strut so the component's fixed height\n is not inflated by body { line-height: 1.5 }, then adds optical\n horizontal padding around the text.\n ========================================================================== */\n\n.labelWrap {\n line-height: 0;\n padding: 0 var(--dimension-space-050); /* 4px — body sm / md / lg */\n white-space: nowrap;\n flex-shrink: 0;\n}\n\n/* Small scale: tighter optical padding */\n.sizeSm { padding: 0 var(--dimension-space-025); } /* 2px */\n\n/* Caption scale: tighter optical padding */\n.sizeXs { padding: 0 var(--dimension-space-025); } /* 2px */\n\n/* Truncation mode — used when parent is full-width and label must ellipsize */\n.truncate {\n flex-shrink: 1;\n min-width: 0;\n overflow: hidden;\n white-space: nowrap;\n}\n\n.truncate > span {\n display: block;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n","import React from 'react';\nimport { cn } from '@/utils/cn';\nimport styles from './LabelWrap.module.css';\n\ninterface LabelWrapProps {\n children: React.ReactNode;\n /**\n * Maps to typography size — controls optical horizontal padding:\n * xs | sm → 2px (tighter scale)\n * md | lg → 4px (body scale, default)\n */\n size?: 'xs' | 'sm' | 'md' | 'lg';\n /** Enables truncation with ellipsis — use inside full-width containers. */\n truncate?: boolean;\n className?: string;\n}\n\n/**\n * Internal utility wrapper used inside interactive components (Button, Tag,\n * Input, Select, MenuItem, etc.) to:\n * 1. Kill the inherited line-height strut from body { line-height: 1.5 }\n * 2. Add optical horizontal padding around the text\n *\n * Not exported from the public barrel — internal use only.\n */\nexport const LabelWrap = ({ children, size = 'md', truncate = false, className }: LabelWrapProps) => (\n <span className={cn(styles.labelWrap, size === 'sm' && styles.sizeSm, size === 'xs' && styles.sizeXs, truncate && styles.truncate, className)}>\n {children}\n </span>\n);\n\nLabelWrap.displayName = 'LabelWrap';\n",".loader {\n flex-shrink: 0;\n animation: spin 0.75s linear infinite;\n}\n\n@keyframes spin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n}\n","import React from 'react';\nimport styles from './Loader.module.css';\n\nexport interface LoaderProps {\n /**\n * Render size in px. Designed at 16px (r=6, strokeWidth=1).\n * Stroke weight scales proportionally with size — same behaviour as icons.\n * Defaults to 20.\n */\n size?: number;\n className?: string;\n}\n\n/**\n * Placeholder spinner component. Will be replaced with a full Loader\n * component once motion/brand specs are finalised.\n *\n * Designed at 16×16 viewBox so it matches the icon grid:\n * - r=5 → 10px circle in a 16px box (3px optical padding each side)\n * - strokeWidth=1 at native size → scales to 1.25px at 20px, 1.5px at 24px\n */\nexport const Loader = ({ size = 20, className }: LoaderProps) => (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n className={`${styles.loader}${className ? ` ${className}` : ''}`}\n aria-hidden=\"true\"\n >\n <circle\n cx=\"8\"\n cy=\"8\"\n r=\"5\"\n stroke=\"currentColor\"\n strokeWidth=\"1\"\n strokeLinecap=\"round\"\n strokeDasharray=\"23.6 7.9\"\n />\n </svg>\n);\n\nLoader.displayName = 'Loader';\n","/* ==========================================================================\n Button — unified primary/secondary\n Hover/pressed via color-mix() on background-color. No pseudo-element overlays.\n ========================================================================== */\n\n.button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border: none;\n border-radius: var(--dimension-radius-050);\n cursor: pointer;\n position: relative;\n transition: transform var(--effect-motion-short-2);\n height: var(--dimension-size-400);\n font-family: inherit;\n color: var(--color-foreground-primary);\n background: transparent;\n box-sizing: border-box;\n text-decoration: none;\n -webkit-user-select: none;\n user-select: none;\n\n /* Interaction — ghost defaults (semi-transparent overlay) */\n --_hover-bg: var(--color-interaction-hover);\n --_pressed-bg: var(--color-interaction-pressed);\n --_border: var(--color-border-tertiary);\n}\n\n.button:focus-visible {\n outline: var(--dimension-stroke-width-025) solid var(--color-interaction-focus);\n outline-offset: var(--dimension-space-025);\n}\n\n.button:hover:not(.inactive) {\n background-color: var(--_hover-bg);\n}\n\n.button:active:not(.inactive) {\n background-color: var(--_pressed-bg);\n transform: scale(var(--dimension-scale-subtle));\n}\n\n/* ==========================================================================\n Background context — parent surface awareness\n Adjusts hover tokens and secondary fg for colored parent surfaces.\n 1-class specificity; overridden by filled variant rules (2+ classes).\n ========================================================================== */\n\n.onMedium {\n --_hover-bg: var(--color-interaction-on-medium-background-hover);\n --_pressed-bg: var(--color-interaction-on-medium-background-pressed);\n --_border: var(--color-border-on-medium-background-tertiary);\n}\n\n.onBold {\n --_hover-bg: var(--color-interaction-on-bold-background-hover);\n --_pressed-bg: var(--color-interaction-on-bold-background-pressed);\n --_border: var(--color-border-on-bold-background-tertiary);\n}\n\n.onStrong {\n --_hover-bg: var(--color-interaction-on-strong-background-hover);\n --_pressed-bg: var(--color-interaction-on-strong-background-pressed);\n --_border: var(--color-border-on-strong-background-tertiary);\n}\n\n.onAlwaysDark {\n --_hover-bg: var(--color-always-dark-interaction-hover);\n --_pressed-bg: var(--color-always-dark-interaction-pressed);\n --_border: var(--color-always-dark-border-tertiary);\n}\n\n/* ==========================================================================\n Variant: Primary\n Bold background, on-bold content. Elevation controls shadow.\n ========================================================================== */\n\n.primary {\n color: var(--color-foreground-on-bold-background-primary);\n}\n\n/* Primary intent: none — inverted surface (black in light mode, white in dark mode) */\n.primary.intentNone {\n background-color: var(--color-inverted-background);\n color: var(--color-inverted-foreground-primary);\n --_hover-bg: color-mix(in oklch, var(--color-inverted-background) 90%, var(--color-inverted-foreground-primary));\n --_pressed-bg: color-mix(in oklch, var(--color-inverted-background) 85%, var(--color-inverted-foreground-primary));\n --_border: var(--color-inverted-border-tertiary);\n}\n\n/* Filled primary — background from --_bg, bold-contrast hover via color-mix.\n 2-class specificity beats background context (1-class). */\n.primary:not(.intentNone) {\n background-color: var(--_bg);\n --_hover-bg: color-mix(in oklch, var(--_bg) 85%, var(--color-foreground-on-bold-background-primary));\n --_pressed-bg: color-mix(in oklch, var(--_bg) 80%, var(--color-foreground-on-bold-background-primary));\n}\n\n/* ── Primary bold contrast (default) ────────────────────────────────── */\n\n.primary.intentBrand { --_bg: var(--color-background-bold-brand); color: var(--color-foreground-faint-brand); }\n.primary.intentNeutral { --_bg: var(--color-background-bold-neutral); color: var(--color-foreground-faint-neutral); }\n.primary.intentPositive { --_bg: var(--color-background-bold-positive); color: var(--color-foreground-faint-positive); }\n.primary.intentNegative { --_bg: var(--color-background-bold-negative); color: var(--color-foreground-faint-negative); }\n.primary.intentWarning { --_bg: var(--color-background-bold-warning); color: var(--color-foreground-faint-warning); }\n.primary.intentCaution { --_bg: var(--color-background-bold-caution); color: var(--color-foreground-faint-caution); }\n.primary.intentAi { --_bg: var(--color-background-bold-ai); color: var(--color-foreground-faint-ai); }\n\n/* ── Primary medium contrast ────────────────────────────────────────── */\n\n.primary.contrastMedium {\n --_hover-bg: color-mix(in oklch, var(--_bg) 85%, var(--color-foreground-primary));\n --_pressed-bg: color-mix(in oklch, var(--_bg) 80%, var(--color-foreground-primary));\n}\n.primary.contrastMedium.intentBrand { --_bg: var(--color-background-medium-brand); color: var(--color-foreground-strong-brand); }\n.primary.contrastMedium.intentNeutral { --_bg: var(--color-background-medium-neutral); color: var(--color-foreground-strong-neutral); }\n.primary.contrastMedium.intentPositive { --_bg: var(--color-background-medium-positive); color: var(--color-foreground-strong-positive); }\n.primary.contrastMedium.intentNegative { --_bg: var(--color-background-medium-negative); color: var(--color-foreground-strong-negative); }\n.primary.contrastMedium.intentWarning { --_bg: var(--color-background-medium-warning); color: var(--color-foreground-strong-warning); }\n.primary.contrastMedium.intentCaution { --_bg: var(--color-background-medium-caution); color: var(--color-foreground-strong-caution); }\n.primary.contrastMedium.intentAi { --_bg: var(--color-background-medium-ai); color: var(--color-foreground-strong-ai); }\n\n/* ── Primary strong contrast ────────────────────────────────────────── */\n\n.primary.contrastStrong {\n --_hover-bg: color-mix(in oklch, var(--_bg) 90%, var(--color-foreground-on-bold-background-primary));\n --_pressed-bg: color-mix(in oklch, var(--_bg) 85%, var(--color-foreground-on-bold-background-primary));\n}\n.primary.contrastStrong.intentBrand { --_bg: var(--color-background-strong-brand); color: var(--color-foreground-medium-brand); }\n.primary.contrastStrong.intentNeutral { --_bg: var(--color-background-strong-neutral); color: var(--color-foreground-medium-neutral); }\n.primary.contrastStrong.intentPositive { --_bg: var(--color-background-strong-positive); color: var(--color-foreground-medium-positive); }\n.primary.contrastStrong.intentNegative { --_bg: var(--color-background-strong-negative); color: var(--color-foreground-medium-negative); }\n.primary.contrastStrong.intentWarning { --_bg: var(--color-background-strong-warning); color: var(--color-foreground-medium-warning); }\n.primary.contrastStrong.intentCaution { --_bg: var(--color-background-strong-caution); color: var(--color-foreground-medium-caution); }\n.primary.contrastStrong.intentAi { --_bg: var(--color-background-strong-ai); color: var(--color-foreground-medium-ai); }\n\n/* ── Primary faint contrast ─────────────────────────────────────────── */\n\n.primary.contrastFaint {\n --_hover-bg: color-mix(in oklch, var(--_bg) 90%, var(--color-foreground-primary));\n --_pressed-bg: color-mix(in oklch, var(--_bg) 85%, var(--color-foreground-primary));\n}\n.primary.contrastFaint.intentBrand { --_bg: var(--color-background-faint-brand); color: var(--color-foreground-bold-brand); }\n.primary.contrastFaint.intentNeutral { --_bg: var(--color-background-faint-neutral); color: var(--color-foreground-bold-neutral); }\n.primary.contrastFaint.intentPositive { --_bg: var(--color-background-faint-positive); color: var(--color-foreground-bold-positive); }\n.primary.contrastFaint.intentNegative { --_bg: var(--color-background-faint-negative); color: var(--color-foreground-bold-negative); }\n.primary.contrastFaint.intentWarning { --_bg: var(--color-background-faint-warning); color: var(--color-foreground-bold-warning); }\n.primary.contrastFaint.intentCaution { --_bg: var(--color-background-faint-caution); color: var(--color-foreground-bold-caution); }\n.primary.contrastFaint.intentAi { --_bg: var(--color-background-faint-ai); color: var(--color-foreground-bold-ai); }\n\n/* ==========================================================================\n Variant: Secondary\n Base is ghost (transparent, no border, no shadow).\n Elevation classes add the chrome — flat=border, elevated=bg+shadow, floating=bg+floating.\n ========================================================================== */\n\n.secondary {\n background-color: transparent;\n color: var(--color-foreground-secondary);\n}\n\n/* Secondary intent — bold fg color */\n.secondary.intentBrand { color: var(--color-foreground-bold-brand); }\n.secondary.intentNeutral { color: var(--color-foreground-bold-neutral); }\n.secondary.intentPositive { color: var(--color-foreground-bold-positive); }\n.secondary.intentNegative { color: var(--color-foreground-bold-negative); }\n.secondary.intentWarning { color: var(--color-foreground-bold-warning); }\n.secondary.intentCaution { color: var(--color-foreground-bold-caution); }\n.secondary.intentAi { color: var(--color-foreground-bold-ai); }\n\n/* ── Secondary fg on medium surface ─────────────────────────────────── */\n\n.secondary.onMedium { color: var(--color-foreground-primary); }\n.secondary.onMedium.intentBrand { color: var(--color-foreground-strong-brand); }\n.secondary.onMedium.intentNeutral { color: var(--color-foreground-strong-neutral); }\n.secondary.onMedium.intentPositive { color: var(--color-foreground-strong-positive); }\n.secondary.onMedium.intentNegative { color: var(--color-foreground-strong-negative); }\n.secondary.onMedium.intentWarning { color: var(--color-foreground-strong-warning); }\n.secondary.onMedium.intentCaution { color: var(--color-foreground-strong-caution); }\n.secondary.onMedium.intentAi { color: var(--color-foreground-strong-ai); }\n\n/* ── Secondary fg on bold surface ──────────────────────────────────── */\n\n.secondary.onBold { color: var(--color-foreground-on-bold-background-secondary); }\n.secondary.onBold.intentBrand { color: var(--color-foreground-faint-brand); }\n.secondary.onBold.intentNeutral { color: var(--color-foreground-faint-neutral); }\n.secondary.onBold.intentPositive { color: var(--color-foreground-faint-positive); }\n.secondary.onBold.intentNegative { color: var(--color-foreground-faint-negative); }\n.secondary.onBold.intentWarning { color: var(--color-foreground-faint-warning); }\n.secondary.onBold.intentCaution { color: var(--color-foreground-faint-caution); }\n.secondary.onBold.intentAi { color: var(--color-foreground-faint-ai); }\n\n/* ── Secondary fg on always-dark surface ──────────────────────────── */\n\n.secondary.onAlwaysDark { color: var(--color-always-dark-foreground-secondary); }\n.secondary.onAlwaysDark.intentBrand { color: var(--color-always-dark-foreground-brand); }\n.secondary.onAlwaysDark.intentNeutral { color: var(--color-always-dark-foreground-neutral); }\n.secondary.onAlwaysDark.intentPositive { color: var(--color-always-dark-foreground-positive); }\n.secondary.onAlwaysDark.intentNegative { color: var(--color-always-dark-foreground-negative); }\n.secondary.onAlwaysDark.intentWarning { color: var(--color-always-dark-foreground-warning); }\n.secondary.onAlwaysDark.intentCaution { color: var(--color-always-dark-foreground-caution); }\n.secondary.onAlwaysDark.intentAi { color: var(--color-always-dark-foreground-ai); }\n\n/* ── Secondary fg on strong surface ─────────────────────────────────── */\n\n.secondary.onStrong { color: var(--color-foreground-on-bold-background-secondary); }\n.secondary.onStrong.intentBrand { color: var(--color-foreground-faint-brand); }\n.secondary.onStrong.intentNeutral { color: var(--color-foreground-faint-neutral); }\n.secondary.onStrong.intentPositive { color: var(--color-foreground-faint-positive); }\n.secondary.onStrong.intentNegative { color: var(--color-foreground-faint-negative); }\n.secondary.onStrong.intentWarning { color: var(--color-foreground-faint-warning); }\n.secondary.onStrong.intentCaution { color: var(--color-foreground-faint-caution); }\n.secondary.onStrong.intentAi { color: var(--color-foreground-faint-ai); }\n\n/* ==========================================================================\n Elevation\n ========================================================================== */\n\n/* ── Secondary chrome ───────────────────────────────────────────────── */\n\n/* elevationNone = ghost base — no extra CSS needed */\n\n.secondary.elevationFlat {\n box-shadow: inset 0 0 0 1px var(--_border);\n}\n\n.secondary.elevationElevated {\n background-color: var(--color-background-primary);\n box-shadow: var(--effect-elevation-elevated-sm);\n --_hover-bg: color-mix(in oklch, var(--color-background-primary) 90%, var(--color-foreground-primary));\n --_pressed-bg: color-mix(in oklch, var(--color-background-primary) 85%, var(--color-foreground-primary));\n}\n\n.secondary.elevationFloating {\n background-color: var(--color-background-primary);\n box-shadow: var(--effect-elevation-elevated-floating);\n --_hover-bg: color-mix(in oklch, var(--color-background-primary) 90%, var(--color-foreground-primary));\n --_pressed-bg: color-mix(in oklch, var(--color-background-primary) 85%, var(--color-foreground-primary));\n}\n\n/* ── Primary shadow + border control ───────────────────────────────── */\n\n/* elevated */\n.primary.elevationElevated { box-shadow: var(--effect-elevation-elevated-sm); }\n\n/* none = no shadow, no border (flat colored button — default for primary) */\n.primary.elevationNone { box-shadow: none; }\n\n/* flat = inset ring against the page background (not the button fill) */\n.primary.elevationFlat { box-shadow: inset 0 0 0 1px var(--_border); }\n\n/* intentNone flat: inverted fill + default border ring (bg/fg inherited from .primary.intentNone) */\n.primary.intentNone.elevationFlat {\n --_border: var(--color-border-tertiary);\n}\n\n/* intentNone on strong/always-dark: flip to surface bg/fg — inverted (black) would be invisible */\n.primary.intentNone.onStrong,\n.primary.intentNone.onAlwaysDark {\n background-color: var(--color-background-primary);\n color: var(--color-foreground-primary);\n --_hover-bg: color-mix(in oklch, var(--color-background-primary) 90%, var(--color-foreground-primary));\n --_pressed-bg: color-mix(in oklch, var(--color-background-primary) 85%, var(--color-foreground-primary));\n --_border: var(--color-border-tertiary);\n}\n\n/* floating = FAB-strength shadow for both variants */\n.primary.elevationFloating { box-shadow: var(--effect-elevation-elevated-floating) !important; }\n\n/* ==========================================================================\n Layout: icon-only, label-only, icon+label, dropdown\n ========================================================================== */\n\n.iconOnly { padding: 0; width: var(--dimension-size-400); min-width: var(--dimension-size-400); }\n.labelOnly { padding: 0 var(--dimension-space-100); }\n.iconAndLabel { padding: 0 var(--dimension-space-100) 0 var(--dimension-space-075); gap: var(--dimension-space-025); }\n.dropdown { gap: var(--dimension-space-050); }\n\n/* ==========================================================================\n Sizes\n ========================================================================== */\n\n.sizeSM { height: var(--dimension-size-300); }\n.sizeSM.iconOnly { width: var(--dimension-size-300); min-width: var(--dimension-size-300); }\n.sizeSM.labelOnly { padding: 0 var(--dimension-space-075); }\n.sizeSM.iconAndLabel { padding: 0 var(--dimension-space-075) 0 var(--dimension-space-050); gap: 1px; }\n\n.sizeXS { height: var(--dimension-size-200); }\n.sizeXS.iconOnly { width: var(--dimension-size-200); min-width: var(--dimension-size-200); }\n.sizeXS.labelOnly, .sizeXS.iconAndLabel { padding: 0 var(--dimension-space-025); gap: 0; }\n\n.sizeLG { height: var(--dimension-size-500); }\n.sizeLG.iconOnly { width: var(--dimension-size-500); min-width: var(--dimension-size-500); }\n.sizeLG.labelOnly { padding: 0 var(--dimension-space-150); }\n.sizeLG.iconAndLabel { padding: 0 var(--dimension-space-150) 0 var(--dimension-space-100); gap: var(--dimension-space-075); }\n\n/* ==========================================================================\n Rounded (pill shape)\n ========================================================================== */\n\n.rounded { border-radius: var(--dimension-radius-half); }\n.rounded.labelOnly { padding-left: calc(var(--dimension-space-100) + var(--dimension-space-050)); padding-right: calc(var(--dimension-space-100) + var(--dimension-space-050)); }\n.rounded.iconAndLabel { padding-left: calc(var(--dimension-space-075) + var(--dimension-space-050)); padding-right: calc(var(--dimension-space-100) + var(--dimension-space-050)); }\n.rounded.sizeSM.labelOnly { padding-left: calc(var(--dimension-space-075) + var(--dimension-space-050)); padding-right: calc(var(--dimension-space-075) + var(--dimension-space-050)); }\n.rounded.sizeSM.iconAndLabel { padding-left: calc(var(--dimension-space-050) + var(--dimension-space-050)); padding-right: calc(var(--dimension-space-075) + var(--dimension-space-050)); }\n.rounded.sizeLG.labelOnly { padding-left: calc(var(--dimension-space-150) + var(--dimension-space-050)); padding-right: calc(var(--dimension-space-150) + var(--dimension-space-050)); }\n.rounded.sizeLG.iconAndLabel { padding-left: calc(var(--dimension-space-100) + var(--dimension-space-050)); padding-right: calc(var(--dimension-space-150) + var(--dimension-space-050)); }\n.rounded.iconOnly { width: var(--dimension-size-400); min-width: var(--dimension-size-400); padding: 0; }\n.rounded.sizeLG.iconOnly { width: var(--dimension-size-500); min-width: var(--dimension-size-500); }\n.rounded.sizeSM.iconOnly { width: var(--dimension-size-300); min-width: var(--dimension-size-300); }\n.rounded.sizeXS.iconOnly { width: var(--dimension-size-200); min-width: var(--dimension-size-200); }\n\n/* ==========================================================================\n Disabled\n ========================================================================== */\n\n.inactive { opacity: 0.5; cursor: not-allowed; pointer-events: none; }\n\n/* ==========================================================================\n Badge\n ========================================================================== */\n\n.badge {\n position: absolute;\n top: var(--dimension-space-025);\n right: var(--dimension-space-025);\n font-size: var(--typography-fontsize-xs);\n font-weight: var(--typography-weight-semibold);\n line-height: var(--typography-lineheight-xs);\n color: var(--color-foreground-secondary);\n pointer-events: none;\n z-index: 10;\n}\n\n/* ==========================================================================\n Full width\n ========================================================================== */\n\n.fullWidth {\n display: flex;\n width: 100%;\n}\n","import React, { forwardRef } from 'react';\nimport { cn } from '@/utils/cn';\nimport { Text } from '@/components/Text';\nimport { LabelWrap } from '@/components/LabelWrap';\nimport { Loader } from '@/components/Loader';\nimport { ChevronDown } from '@ds-mo/icons';\nimport type { IconComponent } from '@/types/icons';\nimport styles from './Button.module.css';\n\nexport type ButtonVariant = 'primary' | 'secondary';\nexport type ButtonElevation = 'none' | 'flat' | 'elevated' | 'floating';\nexport type ButtonIntent = 'none' | 'neutral' | 'brand' | 'ai' | 'negative' | 'warning' | 'caution' | 'positive';\nexport type ButtonSize = 'xs' | 'sm' | 'md' | 'lg';\nexport type ButtonContrast = 'strong' | 'bold' | 'medium' | 'faint';\nexport type ButtonBackground = 'faint' | 'medium' | 'bold' | 'strong' | 'always-dark';\n\nexport interface ButtonProps {\n /** Polymorphic element type. Defaults to 'button'. */\n as?: React.ElementType;\n /** Visual variant. Defaults to 'primary'. */\n variant?: ButtonVariant;\n /** Label text. */\n label?: string;\n /** Leading icon component from @ds-mo/icons. */\n icon?: IconComponent;\n /** Semantic intent. Defaults to 'brand'. */\n intent?: ButtonIntent;\n /** Size. Defaults to 'md'. */\n size?: ButtonSize;\n /** Pill shape with extra padding. */\n rounded?: boolean;\n /** Fill container width. Label truncates if space is tight. */\n fullWidth?: boolean;\n /** Fixed width. Omit for content width. */\n width?: React.CSSProperties['width'];\n /** Contrast level (primary variant only). Defaults to 'bold'. */\n contrast?: ButtonContrast;\n /**\n * Parent surface context. Adjusts hover tokens and secondary fg colors\n * for buttons placed on colored backgrounds.\n * faint — default, no adjustment\n * medium — use on-medium-background interaction tokens\n * bold — use on-bold-background interaction + inverted fg\n * strong — use on-strong-background interaction + inverted fg\n * always-dark — dark surface (no theme flip), on-bold-background tokens\n */\n background?: ButtonBackground;\n /** Show trailing ChevronDown dropdown indicator. */\n dropdown?: boolean;\n /** Badge count. */\n badgeCount?: number;\n /**\n * Chrome level for secondary; shadow level for primary.\n * none — ghost (transparent, no border, no shadow)\n * flat — border only, transparent bg [default for secondary]\n * elevated — bg-primary + shadow [default for primary]\n * floating — bg-primary + FAB-strength shadow\n */\n elevation?: ButtonElevation;\n /** Show loading spinner in place of icon. Prevents interaction. */\n loading?: boolean;\n\n onClick?: (e: React.MouseEvent<HTMLElement>) => void;\n onMouseEnter?: React.MouseEventHandler<HTMLElement>;\n onMouseLeave?: React.MouseEventHandler<HTMLElement>;\n className?: string;\n inactive?: boolean;\n type?: 'button' | 'submit' | 'reset';\n id?: string;\n 'aria-label'?: string;\n href?: string;\n target?: string;\n rel?: string;\n}\n\nconst ICON_SIZE_MAP: Record<ButtonSize, number> = { xs: 12, sm: 16, md: 20, lg: 24 };\n\nconst TEXT_STYLE_MAP: Record<ButtonSize, string> = {\n xs: 'text-caption-emphasis',\n sm: 'text-body-small-emphasis',\n md: 'text-body-medium-emphasis',\n lg: 'text-body-large-emphasis',\n};\n\n\nexport const Button = forwardRef<HTMLElement, ButtonProps>(\n (\n {\n as,\n variant = 'primary',\n label,\n icon: Icon,\n intent = 'brand',\n size = 'md',\n rounded = false,\n fullWidth = false,\n width,\n contrast = 'bold',\n background,\n dropdown = false,\n badgeCount,\n elevation,\n loading = false,\n onClick,\n onMouseEnter,\n onMouseLeave,\n className,\n inactive = false,\n type = 'button',\n id,\n 'aria-label': ariaLabel,\n href,\n target,\n rel,\n },\n ref\n ) => {\n const Component = (as ?? 'button') as React.ElementType;\n const isButton = !as || as === 'button';\n const isInteractive = !inactive && !loading;\n\n const hasIcon = !!Icon;\n const hasLabel = !!label;\n const showLeading = hasIcon || loading; // spinner fills the icon slot\n const isIconOnly = showLeading && !hasLabel;\n const isLabelOnly = hasLabel && !showLeading;\n const isIconAndLabel = showLeading && hasLabel;\n const iconSize = ICON_SIZE_MAP[size];\n const textStyle = TEXT_STYLE_MAP[size];\n\n // Derive default elevation per variant: primary→none, secondary→flat\n const effectiveElevation: ButtonElevation = elevation ?? (variant === 'primary' ? 'none' : 'flat');\n const elevKey = effectiveElevation.charAt(0).toUpperCase() + effectiveElevation.slice(1);\n\n const classes = cn(\n styles.button,\n styles[variant],\n styles[`intent${intent.charAt(0).toUpperCase() + intent.slice(1)}`],\n size !== 'md' && styles[`size${size.toUpperCase()}`],\n rounded && styles.rounded,\n (inactive || loading) && styles.inactive,\n isIconOnly && styles.iconOnly,\n isLabelOnly && styles.labelOnly,\n isIconAndLabel && styles.iconAndLabel,\n dropdown && styles.dropdown,\n variant === 'primary' && intent !== 'none' && contrast !== 'bold' && styles[`contrast${contrast.charAt(0).toUpperCase() + contrast.slice(1)}`],\n styles[`elevation${elevKey}`],\n background && background !== 'faint' && styles[\n background === 'always-dark' ? 'onAlwaysDark'\n : `on${background.charAt(0).toUpperCase() + background.slice(1)}`\n ],\n fullWidth && styles.fullWidth,\n className,\n );\n\n const resolvedAriaLabel = ariaLabel || label || 'button';\n\n const extraProps: Record<string, unknown> = {};\n if (isButton) {\n extraProps.type = type;\n extraProps.disabled = inactive || loading;\n }\n if (href) extraProps.href = href;\n if (target) extraProps.target = target;\n if (rel) extraProps.rel = rel;\n\n return (\n <Component\n ref={ref}\n id={id}\n className={classes}\n style={width ? { width } : undefined}\n onClick={isInteractive ? onClick : undefined}\n onMouseEnter={isInteractive ? onMouseEnter : undefined}\n onMouseLeave={isInteractive ? onMouseLeave : undefined}\n aria-label={resolvedAriaLabel}\n aria-busy={loading || undefined}\n {...extraProps}\n >\n {loading ? (\n <Loader size={iconSize} />\n ) : (\n Icon && <Icon size={iconSize} />\n )}\n {label && (\n <LabelWrap truncate={fullWidth}>\n <Text variant={textStyle as never} as=\"span\" color=\"inherit\">\n {label}\n </Text>\n </LabelWrap>\n )}\n {dropdown && <ChevronDown size={iconSize} />}\n {badgeCount != null && badgeCount > 0 && (\n <span className={styles.badge}>{badgeCount > 9 ? '+' : badgeCount}</span>\n )}\n </Component>\n );\n }\n);\n\nButton.displayName = 'Button';\n","/* ==========================================================================\n ToggleButton — hover/pressed via direct background-color + color-mix().\n No pseudo-element overlays.\n Elevation controls the chrome level:\n elevated — bg-primary + shadow (default)\n flat — border only\n none — ghost (transparent, no border, no shadow)\n floating — bg-primary + FAB-strength shadow\n ========================================================================== */\n\n.toggleButton {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border: none;\n border-radius: var(--dimension-radius-050);\n cursor: pointer;\n position: relative;\n transition: transform var(--effect-motion-short-2);\n height: var(--dimension-size-400);\n font-family: inherit;\n background: transparent;\n box-sizing: border-box;\n -webkit-user-select: none;\n user-select: none;\n\n /* Interaction — ghost defaults */\n --_hover-bg: var(--color-interaction-hover);\n --_pressed-bg: var(--color-interaction-pressed);\n --_border: var(--color-border-tertiary);\n}\n\n.toggleButton:focus-visible {\n outline: var(--dimension-stroke-width-025) solid var(--color-interaction-focus);\n outline-offset: var(--dimension-space-025);\n}\n\n.toggleButton:hover:not(.inactive) {\n background-color: var(--_hover-bg);\n}\n\n.toggleButton:active:not(.inactive) {\n background-color: var(--_pressed-bg);\n transform: scale(var(--dimension-scale-subtle));\n}\n\n/* ==========================================================================\n Background context — parent surface awareness\n ========================================================================== */\n\n.onMedium {\n --_hover-bg: var(--color-interaction-on-medium-background-hover);\n --_pressed-bg: var(--color-interaction-on-medium-background-pressed);\n --_border: var(--color-border-on-medium-background-tertiary);\n}\n\n.onBold {\n --_hover-bg: var(--color-interaction-on-bold-background-hover);\n --_pressed-bg: var(--color-interaction-on-bold-background-pressed);\n --_border: var(--color-border-on-bold-background-tertiary);\n}\n\n.onStrong {\n --_hover-bg: var(--color-interaction-on-strong-background-hover);\n --_pressed-bg: var(--color-interaction-on-strong-background-pressed);\n --_border: var(--color-border-on-strong-background-tertiary);\n}\n\n.onAlwaysDark {\n --_hover-bg: var(--color-always-dark-interaction-hover);\n --_pressed-bg: var(--color-always-dark-interaction-pressed);\n --_border: var(--color-always-dark-border-tertiary);\n}\n\n/* ==========================================================================\n Elevation levels\n ========================================================================== */\n\n/* ── Elevated (default): bg-primary + shadow ───────────────────────────── */\n\n.elevationElevated {\n background-color: var(--color-background-primary);\n box-shadow: var(--effect-elevation-elevated-sm);\n color: var(--color-foreground-secondary);\n --_hover-bg: color-mix(in oklch, var(--color-background-primary) 90%, var(--color-foreground-primary));\n --_pressed-bg: color-mix(in oklch, var(--color-background-primary) 85%, var(--color-foreground-primary));\n}\n\n/* ── Flat: border only, transparent bg ─────────────────────────────────── */\n\n.elevationFlat {\n box-shadow: inset 0 0 0 1px var(--_border);\n color: var(--color-foreground-secondary);\n}\n\n/* ── None: ghost — transparent, no border, no shadow ───────────────────── */\n\n.elevationNone {\n color: var(--color-foreground-secondary);\n}\n\n/* ── Floating: bg-primary + FAB-strength shadow ─────────────────────────── */\n\n.elevationFloating {\n background-color: var(--color-background-primary);\n box-shadow: var(--effect-elevation-elevated-floating);\n color: var(--color-foreground-secondary);\n --_hover-bg: color-mix(in oklch, var(--color-background-primary) 90%, var(--color-foreground-primary));\n --_pressed-bg: color-mix(in oklch, var(--color-background-primary) 85%, var(--color-foreground-primary));\n}\n\n/* ── Fg on bold / strong surface ────────────────────────────────────────── */\n\n.onBold.elevationNone, .onBold.elevationFlat,\n.onStrong.elevationNone, .onStrong.elevationFlat {\n color: var(--color-foreground-on-bold-background-secondary);\n}\n\n/* ── Fg on always-dark surface ─────────────────────────────────────────── */\n\n.onAlwaysDark.elevationNone, .onAlwaysDark.elevationFlat {\n color: var(--color-always-dark-foreground-secondary);\n}\n\n/* ==========================================================================\n Pressed state — shared across all elevation levels\n ========================================================================== */\n\n.pressed {\n background-color: var(--color-background-faint-brand);\n color: var(--color-foreground-bold-brand);\n}\n\n/* ==========================================================================\n Layout\n ========================================================================== */\n\n.iconOnly { padding: 0; width: var(--dimension-size-400); min-width: var(--dimension-size-400); }\n.labelOnly { padding: 0 var(--dimension-space-100); }\n.iconAndLabel{ padding: 0 var(--dimension-space-100) 0 var(--dimension-space-075); gap: var(--dimension-space-025); }\n\n/* ==========================================================================\n Sizes\n ========================================================================== */\n\n.sizeSM { height: var(--dimension-size-300); }\n.sizeSM.iconOnly { width: var(--dimension-size-300); min-width: var(--dimension-size-300); }\n.sizeSM.labelOnly { padding: 0 var(--dimension-space-075); }\n.sizeSM.iconAndLabel { padding: 0 var(--dimension-space-075) 0 var(--dimension-space-050); gap: 0; }\n\n.sizeXS { height: var(--dimension-size-200); }\n.sizeXS.iconOnly { width: var(--dimension-size-200); min-width: var(--dimension-size-200); }\n.sizeXS.labelOnly, .sizeXS.iconAndLabel { padding: 0 var(--dimension-space-025); gap: 0; }\n\n/* ==========================================================================\n Rounded (pill shape)\n ========================================================================== */\n\n.rounded { border-radius: var(--dimension-radius-half); }\n.rounded.labelOnly { padding-left: calc(var(--dimension-space-100) + var(--dimension-space-050)); padding-right: calc(var(--dimension-space-100) + var(--dimension-space-050)); }\n.rounded.iconAndLabel { padding-left: calc(var(--dimension-space-075) + var(--dimension-space-050)); padding-right: calc(var(--dimension-space-100) + var(--dimension-space-050)); }\n.rounded.sizeSM.labelOnly { padding-left: calc(var(--dimension-space-075) + var(--dimension-space-050)); padding-right: calc(var(--dimension-space-075) + var(--dimension-space-050)); }\n.rounded.sizeSM.iconAndLabel { padding-left: calc(var(--dimension-space-050) + var(--dimension-space-050)); padding-right: calc(var(--dimension-space-075) + var(--dimension-space-050)); }\n.rounded.iconOnly { width: var(--dimension-size-400); min-width: var(--dimension-size-400); padding: 0; }\n.rounded.sizeSM.iconOnly { width: var(--dimension-size-300); min-width: var(--dimension-size-300); }\n.rounded.sizeXS.iconOnly { width: var(--dimension-size-200); min-width: var(--dimension-size-200); }\n\n/* ==========================================================================\n Disabled\n ========================================================================== */\n\n.inactive { opacity: 0.5; cursor: not-allowed; pointer-events: none; }\n","import React, { forwardRef } from 'react';\nimport { cn } from '@/utils/cn';\nimport { Text } from '@/components/Text';\nimport { LabelWrap } from '@/components/LabelWrap';\nimport type { IconComponent } from '@/types/icons';\nimport styles from './ToggleButton.module.css';\n\nexport type ToggleButtonElevation = 'none' | 'flat' | 'elevated' | 'floating';\nexport type ToggleButtonSize = 'md' | 'sm' | 'xs';\nexport type ToggleButtonBackground = 'faint' | 'medium' | 'bold' | 'strong' | 'always-dark';\n\nexport interface ToggleButtonProps {\n /**\n * Chrome level.\n * none — ghost (transparent, no border, no shadow)\n * flat — border only, transparent bg\n * elevated — bg-primary + shadow [default]\n * floating — bg-primary + FAB-strength shadow\n */\n elevation?: ToggleButtonElevation;\n /** Label text. */\n label?: string;\n /** Leading icon component. */\n icon?: IconComponent;\n /** Size: md (32px), sm (24px), xs (16px). Defaults to 'md'. */\n size?: ToggleButtonSize;\n /** Pill shape. */\n rounded?: boolean;\n /** Parent surface context. Adjusts hover tokens for toggle buttons on colored backgrounds. */\n background?: ToggleButtonBackground;\n /** Controlled pressed state. */\n pressed: boolean;\n /** Called when pressed state changes. */\n onPressedChange: (pressed: boolean) => void;\n inactive?: boolean;\n className?: string;\n id?: string;\n 'aria-label'?: string;\n}\n\nconst ICON_SIZE_MAP: Record<ToggleButtonSize, number> = { md: 20, sm: 16, xs: 12 };\n\nconst TEXT_STYLE_MAP: Record<ToggleButtonSize, string> = {\n md: 'text-body-medium-emphasis',\n sm: 'text-body-small-emphasis',\n xs: 'text-caption-emphasis',\n};\n\nexport const ToggleButton = forwardRef<HTMLButtonElement, ToggleButtonProps>(\n (\n {\n elevation = 'elevated',\n label,\n icon: Icon,\n size = 'md',\n rounded = false,\n background,\n pressed,\n onPressedChange,\n inactive = false,\n className,\n id,\n 'aria-label': ariaLabel,\n },\n ref\n ) => {\n const hasIcon = !!Icon;\n const hasLabel = !!label;\n const isIconOnly = hasIcon && !hasLabel;\n const isLabelOnly = hasLabel && !hasIcon;\n const isIconAndLabel = hasIcon && hasLabel;\n const iconSize = ICON_SIZE_MAP[size];\n const textStyle = TEXT_STYLE_MAP[size];\n\n const elevKey = elevation.charAt(0).toUpperCase() + elevation.slice(1);\n\n const classes = cn(\n styles.toggleButton,\n styles[`elevation${elevKey}`],\n size !== 'md' && styles[`size${size.toUpperCase()}`],\n rounded && styles.rounded,\n inactive && styles.inactive,\n isIconOnly && styles.iconOnly,\n isLabelOnly && styles.labelOnly,\n isIconAndLabel && styles.iconAndLabel,\n background && background !== 'faint' && styles[\n background === 'always-dark' ? 'onAlwaysDark'\n : `on${background.charAt(0).toUpperCase() + background.slice(1)}`\n ],\n pressed && styles.pressed,\n className,\n );\n\n return (\n <button\n ref={ref}\n id={id}\n className={classes}\n onClick={inactive ? undefined : () => onPressedChange(!pressed)}\n type=\"button\"\n disabled={inactive}\n aria-label={ariaLabel || label || 'toggle'}\n aria-pressed={pressed}\n >\n {Icon && <Icon size={iconSize} />}\n {label && (\n <LabelWrap>\n <Text variant={textStyle as never} as=\"span\" color=\"inherit\">\n {label}\n </Text>\n </LabelWrap>\n )}\n </button>\n );\n }\n);\n\nToggleButton.displayName = 'ToggleButton';\n","/* ==========================================================================\n ButtonGroup — flush row of Button components\n ========================================================================== */\n\n.group {\n display: inline-flex;\n align-items: stretch;\n border-radius: var(--dimension-radius-050);\n position: relative;\n}\n\n/* Inset ring / highlight overlay — sits above button children so it isn't\n covered by their backgrounds. Outset shadow stays on the element itself. */\n.group::after {\n content: '';\n position: absolute;\n inset: 0;\n border-radius: inherit;\n pointer-events: none;\n}\n\n/* ── Group-level elevation ──────────────────────────────────────────────── */\n/* Individual item chrome is suppressed via .item — the group container\n carries the elevation so it wraps the whole control as one visual unit. */\n\n/* Outset shadow on element; inset highlight on ::after (children would cover it otherwise) */\n.groupElevated { box-shadow: var(--effect-shadow-elevated-sm); }\n.groupElevated::after { box-shadow: var(--effect-highlight-elevated-sm); }\n\n/* Flat ring lives entirely on ::after — same reasoning as highlight */\n.groupFlat::after { box-shadow: inset 0 0 0 1px var(--color-border-tertiary); }\n\n.groupFloating { box-shadow: var(--effect-shadow-elevated-floating); }\n.groupFloating::after { box-shadow: var(--effect-highlight-elevated-floating); }\n/* groupNone = ghost / primary — no shadow, no border */\n\n.groupRounded { border-radius: var(--dimension-radius-half); }\n\n/* ── Base item ─────────────────────────────────────────────────────────────── */\n\n.item {\n flex-shrink: 0;\n /* Suppress individual elevation so the group reads as one unit */\n box-shadow: none !important;\n /* Suppress noElevation individual border — divider handles separation */\n border: none !important;\n /* Suppress scale-on-press: transform would detach the divider from the\n adjacent button, creating a visible gap. Pressed state is still\n communicated via the ::after overlay colour. */\n}\n.item:active {\n transform: none !important;\n}\n\n/* ── Divider ────────────────────────────────────────────────────────────────\n * Rendered as a separate <div> between items so it is never part of any\n * button's stacking context — disabled (opacity: 0.5) or other state changes\n * on adjacent buttons cannot bleed through to the divider.\n * ─────────────────────────────────────────────────────────────────────────── */\n\n/* Full-height divider (secondary + primary).\n * Overlaps each neighbour by 0.5px and paints on top so the alpha token\n * composites over the button fill rather than the page background. */\n.divider {\n width: 1px;\n flex-shrink: 0;\n background-color: var(--color-border-tertiary);\n position: relative;\n z-index: 1;\n margin: 0 -0.5px;\n pointer-events: none;\n}\n\n/* Ghost (elevation=none): short centred divider at icon height */\n.dividerGhost { height: 20px; align-self: center; } /* md default */\n.dividerGhostXS { height: 12px; }\n.dividerGhostSM { height: 16px; }\n.dividerGhostLG { height: 24px; }\n\n/* Primary intent: on-background divider colour */\n.dividerBold { background-color: var(--color-border-on-bold-background-tertiary); }\n.dividerMedium { background-color: var(--color-border-on-medium-background-tertiary); }\n.dividerStrong { background-color: var(--color-border-on-strong-background-tertiary); }\n\n/* Ghost hover-fade: hide the divider on either side of a hovered ghost button */\n.item:hover + .dividerGhost,\n.dividerGhost:has(+ .item:hover) { opacity: 0; }\n\n/* ── Ghost interaction states: rounded chips ──────────────────────────────────\n * Ghost items have no group chrome — hover/press overlay should appear as\n * fully rounded chips (4px all corners). Rounded groups: outer corners of\n * first/last become pill; inner corners stay 4px.\n *\n * Uses .group ancestor (2-class specificity) to reliably beat .first / .last /\n * .middle (1-class) regardless of load order. Explicit longhands throughout to\n * avoid shorthand/longhand cascade ambiguity with the !important rules above.\n * ─────────────────────────────────────────────────────────────────────────── */\n\n/* ::after hover/press overlay — all positions: 4px all corners */\n.group .itemShort::after {\n border-top-left-radius: var(--dimension-radius-050) !important;\n border-top-right-radius: var(--dimension-radius-050) !important;\n border-bottom-right-radius: var(--dimension-radius-050) !important;\n border-bottom-left-radius: var(--dimension-radius-050) !important;\n}\n\n/* ── Border radius: flatten only the inner-facing corners ──────────────────── */\n/* Outer corners keep the button's own radius — works for default + rounded */\n\n.first {\n border-top-right-radius: 0 !important;\n border-bottom-right-radius: 0 !important;\n}\n\n.last {\n border-top-left-radius: 0 !important;\n border-bottom-left-radius: 0 !important;\n}\n\n.middle {\n border-radius: 0 !important;\n}\n\n/* Rounded group: first — left corners become pill (3-class specificity) */\n.groupRounded .first.itemShort::after {\n border-top-left-radius: var(--dimension-radius-half) !important;\n border-bottom-left-radius: var(--dimension-radius-half) !important;\n}\n\n/* Rounded group: last — right corners become pill (3-class specificity) */\n.groupRounded .last.itemShort::after {\n border-top-right-radius: var(--dimension-radius-half) !important;\n border-bottom-right-radius: var(--dimension-radius-half) !important;\n}\n\n/* ── Rounded: inner-edge padding correction ────────────────────────────────── */\n/*\n * Rounded buttons add `space-050` extra padding on each side.\n * In a group the inner-facing edge should use base (non-pill) padding instead.\n * These classes are injected by ButtonGroup for first/last/mid × size.\n * XS rounded has no extra padding so needs no correction.\n */\n\n/* MD — base padding: space-100 */\n.roundedFirstMD { padding-right: var(--dimension-space-100) !important; }\n.roundedLastMD { padding-left: var(--dimension-space-100) !important; }\n.roundedMidMD { padding-left: var(--dimension-space-100) !important; padding-right: var(--dimension-space-100) !important; }\n\n/* SM — base padding: space-075 */\n.roundedFirstSM { padding-right: var(--dimension-space-075) !important; }\n.roundedLastSM { padding-left: var(--dimension-space-075) !important; }\n.roundedMidSM { padding-left: var(--dimension-space-075) !important; padding-right: var(--dimension-space-075) !important; }\n\n/* LG — base padding: space-150 */\n.roundedFirstLG { padding-right: var(--dimension-space-150) !important; }\n.roundedLastLG { padding-left: var(--dimension-space-150) !important; }\n.roundedMidLG { padding-left: var(--dimension-space-150) !important; padding-right: var(--dimension-space-150) !important; }\n","import React from 'react';\nimport { cn } from '@/utils/cn';\nimport styles from './ButtonGroup.module.css';\n\nexport interface ButtonGroupProps {\n children: React.ReactNode;\n className?: string;\n}\n\n/**\n * Renders Button children flush side-by-side with a 1px divider between them.\n * Outer corners keep the button's own border-radius; inner corners are flattened.\n *\n * Individual button chrome (shadow/border) is suppressed — the group container\n * carries the elevation so it wraps the whole control as one visual unit.\n *\n * Divider behaviour by variant:\n * secondary / primary+none — full-height color-border-tertiary line\n * primary (with intent) — color-border-tertiary-on-{contrast}-background\n * ghost (secondary+none) — short centred line (icon/text height)\n *\n * Rounded groups: outer edges keep pill padding; inner edges revert to base padding.\n * Mix of intents is only valid when variant=\"secondary\"; primary groups must be\n * homogeneous (same intent + contrast on all items).\n */\nexport const ButtonGroup = ({ children, className }: ButtonGroupProps) => {\n const items = React.Children.toArray(children).filter(React.isValidElement);\n const count = items.length;\n\n // Read elevation + rounded from first child to drive the group container style.\n const firstEl = items[0] as React.ReactElement<Record<string, unknown>> | undefined;\n const firstProps = firstEl?.props as { variant?: string; elevation?: string; rounded?: boolean } | undefined;\n const firstVariant = firstProps?.variant ?? 'secondary';\n const firstElevation = firstProps?.elevation ?? (firstVariant === 'primary' ? 'none' : 'flat');\n const groupRounded = !!firstProps?.rounded;\n const groupElevKey = firstElevation.charAt(0).toUpperCase() + firstElevation.slice(1);\n\n return (\n <div\n className={cn(\n styles.group,\n (styles as Record<string, string>)[`group${groupElevKey}`],\n groupRounded && styles.groupRounded,\n className,\n )}\n role=\"group\"\n >\n {items.map((child, i) => {\n const el = child as React.ReactElement<Record<string, unknown>>;\n const p = el.props as {\n className?: string;\n variant?: string;\n elevation?: string;\n size?: string;\n intent?: string;\n contrast?: string;\n rounded?: boolean;\n icon?: unknown;\n label?: unknown;\n };\n\n const isFirst = i === 0;\n const isLast = i === count - 1;\n const isMid = !isFirst && !isLast;\n\n const variant = p.variant ?? 'secondary';\n const size = (p.size ?? 'md') as 'xs' | 'sm' | 'md' | 'lg';\n const contrast = p.contrast ?? 'bold';\n const intent = p.intent ?? 'brand';\n const isRounded = !!p.rounded;\n const isIconOnly = !!p.icon && !p.label;\n // Ghost: secondary button with elevation='none' (replaces old tertiary variant)\n const isGhost = variant === 'secondary' && (p.elevation ?? 'flat') === 'none';\n const isPrimary = variant === 'primary' && intent !== 'none';\n\n // Contrast class suffix — capitalised first letter\n const contrastKey = contrast.charAt(0).toUpperCase() + contrast.slice(1);\n\n // Size suffix for rounded padding correction — uppercase\n // XS rounded has no extra padding in Button so needs no correction\n const sizeKey = size.toUpperCase() as 'MD' | 'SM' | 'LG' | 'XS';\n const needsRoundedCorrection = isRounded && !isIconOnly && size !== 'xs';\n\n // Divider injected as a separate element so it's never affected by\n // the adjacent button's opacity (e.g. disabled state).\n const dividerClasses = cn(\n styles.divider,\n isGhost && styles.dividerGhost,\n isGhost && size === 'xs' && styles.dividerGhostXS,\n isGhost && size === 'sm' && styles.dividerGhostSM,\n isGhost && size === 'lg' && styles.dividerGhostLG,\n isPrimary && (styles as Record<string, string>)[`divider${contrastKey}`],\n );\n\n return (\n <React.Fragment key={i}>\n {i > 0 && <div className={dividerClasses} aria-hidden=\"true\" />}\n {React.cloneElement(el, {\n className: cn(\n p.className,\n styles.item,\n isFirst && styles.first,\n isLast && styles.last,\n isMid && styles.middle,\n\n // Ghost (secondary+elevation=none): ::after overlay gets 4px radius treatment\n isGhost && styles.itemShort,\n\n // Rounded: revert inner-edge padding to base (non-pill) value\n needsRoundedCorrection && isFirst && (styles as Record<string, string>)[`roundedFirst${sizeKey}`],\n needsRoundedCorrection && isLast && (styles as Record<string, string>)[`roundedLast${sizeKey}`],\n needsRoundedCorrection && isMid && (styles as Record<string, string>)[`roundedMid${sizeKey}`],\n ),\n })}\n </React.Fragment>\n );\n })}\n </div>\n );\n};\n\nButtonGroup.displayName = 'ButtonGroup';\n","/* ==========================================================================\n ToggleButtonGroup — flush row of ToggleButton components\n ========================================================================== */\n\n.group {\n display: inline-flex;\n align-items: stretch;\n border-radius: var(--dimension-radius-050);\n position: relative;\n}\n\n/* Inset ring / highlight overlay — sits above button children so it isn't\n covered by their backgrounds. Outset shadow stays on the element itself. */\n.group::after {\n content: '';\n position: absolute;\n inset: 0;\n border-radius: inherit;\n pointer-events: none;\n}\n\n/* ── Group-level elevation ──────────────────────────────────────────────── */\n/* Individual item chrome (shadow/border) is suppressed via .item below.\n The group container carries the elevation so it wraps the whole control. */\n\n/* Outset shadow on element; inset highlight on ::after (children would cover it otherwise) */\n.groupElevated { box-shadow: var(--effect-shadow-elevated-sm); }\n.groupElevated::after { box-shadow: var(--effect-highlight-elevated-sm); }\n\n/* Flat ring lives entirely on ::after — same reasoning as highlight */\n.groupFlat::after { box-shadow: inset 0 0 0 1px var(--color-border-tertiary); }\n\n.groupFloating { box-shadow: var(--effect-shadow-elevated-floating); }\n.groupFloating::after { box-shadow: var(--effect-highlight-elevated-floating); }\n/* groupNone = ghost — no shadow, no border */\n\n.groupRounded { border-radius: var(--dimension-radius-half); }\n\n/* ── Base item ─────────────────────────────────────────────────────────────── */\n\n.item {\n flex-shrink: 0;\n /* Suppress individual elevation so the group reads as one unit */\n box-shadow: none !important;\n /* Suppress noElevation individual border — divider handles separation */\n border: none !important;\n /* Suppress scale-on-press: transform would detach the divider from the\n adjacent button, creating a visible gap. Pressed state is still\n communicated via the ::after overlay colour. */\n}\n.item:active {\n transform: none !important;\n}\n\n/* ── Divider ────────────────────────────────────────────────────────────────\n * Rendered as a separate <div> between items so it is never part of any\n * button's stacking context — disabled (opacity: 0.5) or other state changes\n * on adjacent buttons cannot bleed through to the divider.\n * ─────────────────────────────────────────────────────────────────────────── */\n\n/* Full-height divider (elevated / flat / floating).\n * Rendered as a separate element (independent of adjacent button opacity),\n * then nudged ±0.5px so it overlaps each neighbour and paints on top via\n * z-index — this lets the alpha token (rgb(0 0 0 / 0.1)) composite over\n * whatever fill the buttons carry (white, blue pressed state, etc.). */\n.divider {\n width: 1px;\n flex-shrink: 0;\n background-color: var(--color-border-tertiary);\n position: relative;\n z-index: 1;\n margin: 0 -0.5px;\n pointer-events: none;\n}\n\n/* Ghost (elevation=none): short centred divider at icon height */\n.dividerGhost { height: 20px; align-self: center; } /* md default */\n.dividerGhostXS { height: 12px; }\n.dividerGhostSM { height: 16px; }\n\n/* Ghost hover-fade: hide the divider on either side of a hovered ghost button */\n.item:hover + .dividerGhost,\n.dividerGhost:has(+ .item:hover) { opacity: 0; }\n\n/* Ghost pressed-state: hide the divider on either side of a selected button */\n.itemPressed + .dividerGhost,\n.dividerGhost:has(+ .itemPressed) { opacity: 0; }\n\n\n/* ── Ghost interaction states: rounded chips ──────────────────────────────────\n * Ghost items have no connecting chrome — hover/press overlay and selected\n * state always appear as independent rounded chips (4px on all corners).\n * Rounded groups: outer corners of first/last become pill; inner stay 4px.\n *\n * Uses explicit longhands throughout to avoid shorthand/longhand cascade\n * ordering ambiguity with the !important rules in .first / .last / .middle.\n * ─────────────────────────────────────────────────────────────────────────── */\n\n/* ::after hover/press overlay — all positions: 4px all corners.\n Uses .group as ancestor (2-class specificity) to reliably beat\n .first / .last / .middle (1-class) regardless of load order. */\n.group .itemShort::after {\n border-top-left-radius: var(--dimension-radius-050) !important;\n border-top-right-radius: var(--dimension-radius-050) !important;\n border-bottom-right-radius: var(--dimension-radius-050) !important;\n border-bottom-left-radius: var(--dimension-radius-050) !important;\n}\n\n/* Selected chip — all positions: 4px all corners */\n.group .itemPressed {\n border-top-left-radius: var(--dimension-radius-050) !important;\n border-top-right-radius: var(--dimension-radius-050) !important;\n border-bottom-right-radius: var(--dimension-radius-050) !important;\n border-bottom-left-radius: var(--dimension-radius-050) !important;\n}\n\n/* ── Border radius: flatten only the inner-facing corners ──────────────────── */\n/* Outer corners keep the button's own radius — works for default + rounded */\n\n.first {\n border-top-right-radius: 0 !important;\n border-bottom-right-radius: 0 !important;\n}\n\n.last {\n border-top-left-radius: 0 !important;\n border-bottom-left-radius: 0 !important;\n}\n\n.middle {\n border-radius: 0 !important;\n}\n\n/* Rounded group: first — left corners become pill (3-class specificity) */\n.groupRounded .first.itemShort::after,\n.groupRounded .first.itemPressed {\n border-top-left-radius: var(--dimension-radius-half) !important;\n border-bottom-left-radius: var(--dimension-radius-half) !important;\n}\n\n/* Rounded group: last — right corners become pill (3-class specificity) */\n.groupRounded .last.itemShort::after,\n.groupRounded .last.itemPressed {\n border-top-right-radius: var(--dimension-radius-half) !important;\n border-bottom-right-radius: var(--dimension-radius-half) !important;\n}\n\n/* ── Rounded: inner-edge padding correction ────────────────────────────────── */\n/*\n * Rounded buttons add `space-050` extra padding on each side.\n * In a group the inner-facing edge should use base (non-pill) padding instead.\n * XS rounded has no extra padding so needs no correction.\n */\n\n/* MD — base padding: space-100 */\n.roundedFirstMD { padding-right: var(--dimension-space-100) !important; }\n.roundedLastMD { padding-left: var(--dimension-space-100) !important; }\n.roundedMidMD { padding-left: var(--dimension-space-100) !important; padding-right: var(--dimension-space-100) !important; }\n\n/* SM — base padding: space-075 */\n.roundedFirstSM { padding-right: var(--dimension-space-075) !important; }\n.roundedLastSM { padding-left: var(--dimension-space-075) !important; }\n.roundedMidSM { padding-left: var(--dimension-space-075) !important; padding-right: var(--dimension-space-075) !important; }\n","import React from 'react';\nimport { cn } from '@/utils/cn';\nimport styles from './ToggleButtonGroup.module.css';\n\nexport interface ToggleButtonGroupProps {\n children: React.ReactNode;\n className?: string;\n}\n\n/**\n * Renders ToggleButton children flush side-by-side with a 1px divider between them.\n * Outer corners keep the button's own border-radius; inner corners are flattened.\n *\n * Individual button chrome (shadow/border) is suppressed — the group container\n * carries the elevation so it wraps the whole control as one visual unit.\n *\n * Divider behaviour by elevation:\n * elevated / flat / floating — full-height color-border-tertiary line\n * none (ghost) — short centred line (icon/text height)\n *\n * Rounded groups: outer edges keep pill padding; inner edges revert to base padding.\n * Pressed state and onPressedChange are managed by the consumer on each ToggleButton.\n */\nexport const ToggleButtonGroup = ({ children, className }: ToggleButtonGroupProps) => {\n const items = React.Children.toArray(children).filter(React.isValidElement);\n const count = items.length;\n\n // Read elevation + rounded from first child to drive the group container style.\n const firstEl = items[0] as React.ReactElement<Record<string, unknown>> | undefined;\n const firstProps = firstEl?.props as { elevation?: string; rounded?: boolean } | undefined;\n const groupElevation = firstProps?.elevation ?? 'elevated';\n const groupRounded = !!firstProps?.rounded;\n const groupElevKey = groupElevation.charAt(0).toUpperCase() + groupElevation.slice(1);\n\n return (\n <div\n className={cn(\n styles.group,\n (styles as Record<string, string>)[`group${groupElevKey}`],\n groupRounded && styles.groupRounded,\n className,\n )}\n role=\"group\"\n >\n {items.map((child, i) => {\n const el = child as React.ReactElement<Record<string, unknown>>;\n const p = el.props as {\n className?: string;\n elevation?: string;\n size?: string;\n rounded?: boolean;\n pressed?: boolean;\n icon?: unknown;\n label?: unknown;\n };\n\n const isFirst = i === 0;\n const isLast = i === count - 1;\n const isMid = !isFirst && !isLast;\n\n const size = (p.size ?? 'md') as 'xs' | 'sm' | 'md';\n const isRounded = !!p.rounded;\n const isPressed = !!p.pressed;\n const isIconOnly = !!p.icon && !p.label;\n // Ghost: elevation='none' (no chrome) → short centred divider\n const isGhost = (p.elevation ?? 'elevated') === 'none';\n\n // XS rounded has no extra padding in ToggleButton so needs no correction\n const sizeKey = size.toUpperCase() as 'XS' | 'SM' | 'MD';\n const needsRoundedCorrection = isRounded && !isIconOnly && size !== 'xs';\n\n // Divider injected as a separate element so it's never affected by\n // the adjacent button's opacity (e.g. disabled state).\n const dividerClasses = cn(\n styles.divider,\n isGhost && styles.dividerGhost,\n isGhost && size === 'xs' && styles.dividerGhostXS,\n isGhost && size === 'sm' && styles.dividerGhostSM,\n );\n\n return (\n <React.Fragment key={i}>\n {i > 0 && <div className={dividerClasses} aria-hidden=\"true\" />}\n {React.cloneElement(el, {\n className: cn(\n p.className,\n styles.item,\n isFirst && styles.first,\n isLast && styles.last,\n isMid && styles.middle,\n\n // Ghost variant: ::after overlay gets 4px radius treatment\n isGhost && styles.itemShort,\n\n // Ghost + pressed: selected state background chip\n isGhost && isPressed && styles.itemPressed,\n\n // Rounded: revert inner-edge padding to base (non-pill) value\n needsRoundedCorrection && isFirst && (styles as Record<string, string>)[`roundedFirst${sizeKey}`],\n needsRoundedCorrection && isLast && (styles as Record<string, string>)[`roundedLast${sizeKey}`],\n needsRoundedCorrection && isMid && (styles as Record<string, string>)[`roundedMid${sizeKey}`],\n ),\n })}\n </React.Fragment>\n );\n })}\n </div>\n );\n};\n\nToggleButtonGroup.displayName = 'ToggleButtonGroup';\n","/* ==========================================================================\n Tag — hover/pressed via direct background-color + color-mix().\n No pseudo-element overlays.\n ========================================================================== */\n\n.tag {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border-radius: var(--dimension-radius-050);\n box-sizing: border-box;\n color: var(--color-foreground-primary);\n position: relative;\n\n /* Interaction — ghost defaults */\n --_hover-bg: var(--color-interaction-hover);\n --_pressed-bg: var(--color-interaction-pressed);\n}\n\n/* ==========================================================================\n Sizes\n md 28px — no size-350 token, expressed as 7/2 × base\n sm 20px — size-250\n xs 12px — size-150\n ========================================================================== */\n\n.sizeMd { height: calc(var(--dimension-size-base) * 7 / 2); padding: 0 var(--dimension-space-075); gap: 0; }\n.sizeSm { height: var(--dimension-size-250); padding: 0 var(--dimension-space-050); gap: 0; }\n.sizeXs { height: var(--dimension-size-150); padding: 0 var(--dimension-space-012); gap: 0; }\n\n/* ==========================================================================\n Rounded\n ========================================================================== */\n\n.rounded { border-radius: var(--dimension-radius-half); }\n\n/*\n * Pill padding correction — add space-050 to sides that have no content anchor.\n * Applied by Tag.tsx based on whether a leading icon or trailing remove is present:\n * no leading icon → roundedLeft{Size} (left side is bare label text)\n * no trailing icon → roundedRight{Size} (right side is bare label text)\n * Placed after size rules so same-specificity cascade wins correctly.\n */\n\n/* MD — base: space-075 */\n.roundedLeftMD { padding-left: calc(var(--dimension-space-075) + var(--dimension-space-050)); }\n.roundedRightMD { padding-right: calc(var(--dimension-space-075) + var(--dimension-space-050)); }\n\n/* SM — base: space-050 */\n.roundedLeftSM { padding-left: calc(var(--dimension-space-050) + var(--dimension-space-050)); }\n.roundedRightSM { padding-right: calc(var(--dimension-space-050) + var(--dimension-space-050)); }\n\n/* XS — base: space-012 (1px) */\n.roundedLeftXS { padding-left: calc(var(--dimension-space-012) + var(--dimension-space-050)); }\n.roundedRightXS { padding-right: calc(var(--dimension-space-012) + var(--dimension-space-050)); }\n\n/*\n * Icon-edge padding correction — when an icon (leading or remove) sits on a\n * side, that side's padding should match the top/bottom optical gap:\n * (height − icon_size) / 2\n *\n * md: (28 − 20) / 2 = 4px → space-050\n * sm: (20 − 16) / 2 = 2px → space-025\n * xs: (12 − 12) / 2 = 0px → 0\n *\n * Applied by Tag.tsx: iconLeft when Icon present, iconRight when removable.\n * Placed after size + rounded rules so same-specificity cascade wins.\n */\n.iconLeftMD { padding-left: var(--dimension-space-050); }\n.iconRightMD { padding-right: var(--dimension-space-050); }\n\n.iconLeftSM { padding-left: var(--dimension-space-025); }\n.iconRightSM { padding-right: var(--dimension-space-025); }\n\n.iconLeftXS { padding-left: 0; }\n.iconRightXS { padding-right: 0; }\n\n/* ==========================================================================\n Background context — parent surface awareness\n ========================================================================== */\n\n.onMedium {\n --_hover-bg: var(--color-interaction-on-medium-background-hover);\n --_pressed-bg: var(--color-interaction-on-medium-background-pressed);\n}\n\n.onBold {\n --_hover-bg: var(--color-interaction-on-bold-background-hover);\n --_pressed-bg: var(--color-interaction-on-bold-background-pressed);\n}\n\n.onStrong {\n --_hover-bg: var(--color-interaction-on-strong-background-hover);\n --_pressed-bg: var(--color-interaction-on-strong-background-pressed);\n}\n\n.onAlwaysDark {\n --_hover-bg: var(--color-always-dark-interaction-hover);\n --_pressed-bg: var(--color-always-dark-interaction-pressed);\n}\n\n/* ==========================================================================\n Elevation\n none — filled intent bg, no border, no shadow (default)\n flat — transparent bg + intent-coloured border ring\n elevated — filled intent bg + elevated shadow\n ========================================================================== */\n\n/* elevationNone — no extra chrome needed, intent+contrast classes handle fill */\n\n.elevationFlat {\n background-color: transparent !important;\n box-shadow: inset 0 0 0 var(--dimension-stroke-width-015) currentColor;\n}\n\n/* Flat: no background — use on-surface fg tokens matched to the contrast level.\n The border ring is currentColor so it follows text color automatically.\n 3-class specificity beats the 2-class intent+contrast filled rules above. */\n\n.elevationFlat.intentNeutral.contrastBold { color: var(--color-foreground-bold-neutral); }\n.elevationFlat.intentBrand.contrastBold { color: var(--color-foreground-bold-brand); }\n.elevationFlat.intentAi.contrastBold { color: var(--color-foreground-bold-ai); }\n.elevationFlat.intentNegative.contrastBold { color: var(--color-foreground-bold-negative); }\n.elevationFlat.intentWarning.contrastBold { color: var(--color-foreground-bold-warning); }\n.elevationFlat.intentCaution.contrastBold { color: var(--color-foreground-bold-caution); }\n.elevationFlat.intentPositive.contrastBold { color: var(--color-foreground-bold-positive); }\n\n.elevationFlat.intentNeutral.contrastStrong { color: var(--color-foreground-strong-neutral); }\n.elevationFlat.intentBrand.contrastStrong { color: var(--color-foreground-strong-brand); }\n.elevationFlat.intentAi.contrastStrong { color: var(--color-foreground-strong-ai); }\n.elevationFlat.intentNegative.contrastStrong { color: var(--color-foreground-strong-negative); }\n.elevationFlat.intentWarning.contrastStrong { color: var(--color-foreground-strong-warning); }\n.elevationFlat.intentCaution.contrastStrong { color: var(--color-foreground-strong-caution); }\n.elevationFlat.intentPositive.contrastStrong { color: var(--color-foreground-strong-positive); }\n\n.elevationFlat.intentNeutral.contrastMedium { color: var(--color-foreground-medium-neutral); }\n.elevationFlat.intentBrand.contrastMedium { color: var(--color-foreground-medium-brand); }\n.elevationFlat.intentAi.contrastMedium { color: var(--color-foreground-medium-ai); }\n.elevationFlat.intentNegative.contrastMedium { color: var(--color-foreground-medium-negative); }\n.elevationFlat.intentWarning.contrastMedium { color: var(--color-foreground-medium-warning); }\n.elevationFlat.intentCaution.contrastMedium { color: var(--color-foreground-medium-caution); }\n.elevationFlat.intentPositive.contrastMedium { color: var(--color-foreground-medium-positive); }\n\n.elevationFlat.intentNeutral.contrastFaint { color: var(--color-foreground-faint-neutral); }\n.elevationFlat.intentBrand.contrastFaint { color: var(--color-foreground-faint-brand); }\n.elevationFlat.intentAi.contrastFaint { color: var(--color-foreground-faint-ai); }\n.elevationFlat.intentNegative.contrastFaint { color: var(--color-foreground-faint-negative); }\n.elevationFlat.intentWarning.contrastFaint { color: var(--color-foreground-faint-warning); }\n.elevationFlat.intentCaution.contrastFaint { color: var(--color-foreground-faint-caution); }\n.elevationFlat.intentPositive.contrastFaint { color: var(--color-foreground-faint-positive); }\n\n.elevationElevated { box-shadow: var(--effect-elevation-elevated-sm); }\n\n/* ==========================================================================\n Intent + contrast — strong\n ========================================================================== */\n\n.intentNeutral.contrastStrong { background-color: var(--color-background-strong-neutral); color: var(--color-foreground-medium-neutral); }\n.intentBrand.contrastStrong { background-color: var(--color-background-strong-brand); color: var(--color-foreground-medium-brand); }\n.intentAi.contrastStrong { background-color: var(--color-background-strong-ai); color: var(--color-foreground-medium-ai); }\n.intentNegative.contrastStrong { background-color: var(--color-background-strong-negative); color: var(--color-foreground-medium-negative); }\n.intentWarning.contrastStrong { background-color: var(--color-background-strong-warning); color: var(--color-foreground-medium-warning); }\n.intentCaution.contrastStrong { background-color: var(--color-background-strong-caution); color: var(--color-foreground-medium-caution); }\n.intentPositive.contrastStrong { background-color: var(--color-background-strong-positive); color: var(--color-foreground-medium-positive); }\n\n/* ==========================================================================\n Intent + contrast — bold\n ========================================================================== */\n\n.intentNeutral.contrastBold { background-color: var(--color-background-bold-neutral); color: var(--color-foreground-on-bold-background-primary); }\n.intentBrand.contrastBold { background-color: var(--color-background-bold-brand); color: var(--color-foreground-on-bold-background-primary); }\n.intentAi.contrastBold { background-color: var(--color-background-bold-ai); color: var(--color-foreground-on-bold-background-primary); }\n.intentNegative.contrastBold { background-color: var(--color-background-bold-negative); color: var(--color-foreground-on-bold-background-primary); }\n.intentWarning.contrastBold { background-color: var(--color-background-bold-warning); color: var(--color-foreground-on-bold-background-primary); }\n.intentCaution.contrastBold { background-color: var(--color-background-bold-caution); color: var(--color-foreground-on-bold-background-primary); }\n.intentPositive.contrastBold { background-color: var(--color-background-bold-positive); color: var(--color-foreground-on-bold-background-primary); }\n\n/* ==========================================================================\n Intent + contrast — medium\n ========================================================================== */\n\n.intentNeutral.contrastMedium { background-color: var(--color-background-medium-neutral); color: var(--color-foreground-strong-neutral); }\n.intentBrand.contrastMedium { background-color: var(--color-background-medium-brand); color: var(--color-foreground-strong-brand); }\n.intentAi.contrastMedium { background-color: var(--color-background-medium-ai); color: var(--color-foreground-strong-ai); }\n.intentNegative.contrastMedium { background-color: var(--color-background-medium-negative); color: var(--color-foreground-strong-negative); }\n.intentWarning.contrastMedium { background-color: var(--color-background-medium-warning); color: var(--color-foreground-strong-warning); }\n.intentCaution.contrastMedium { background-color: var(--color-background-medium-caution); color: var(--color-foreground-strong-caution); }\n.intentPositive.contrastMedium { background-color: var(--color-background-medium-positive); color: var(--color-foreground-strong-positive); }\n\n/* ==========================================================================\n Intent + contrast — faint\n ========================================================================== */\n\n.intentNeutral.contrastFaint { background-color: var(--color-background-faint-neutral); color: var(--color-foreground-bold-neutral); }\n.intentBrand.contrastFaint { background-color: var(--color-background-faint-brand); color: var(--color-foreground-bold-brand); }\n.intentAi.contrastFaint { background-color: var(--color-background-faint-ai); color: var(--color-foreground-bold-ai); }\n.intentNegative.contrastFaint { background-color: var(--color-background-faint-negative); color: var(--color-foreground-bold-negative); }\n.intentWarning.contrastFaint { background-color: var(--color-background-faint-warning); color: var(--color-foreground-bold-warning); }\n.intentCaution.contrastFaint { background-color: var(--color-background-faint-caution); color: var(--color-foreground-bold-caution); }\n.intentPositive.contrastFaint { background-color: var(--color-background-faint-positive); color: var(--color-foreground-bold-positive); }\n\n/* ==========================================================================\n Interactive (clickable / filter-chip)\n ========================================================================== */\n\n.interactive {\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n outline: none;\n}\n\n.interactive:hover { background-color: var(--_hover-bg); }\n.interactive:active { background-color: var(--_pressed-bg); }\n\n.interactive:focus-visible {\n outline: var(--dimension-stroke-width-025) solid var(--color-interaction-focus);\n outline-offset: var(--dimension-space-025);\n}\n\n/* ==========================================================================\n Pressed / selected (filter-chip active state)\n Always brand — same language as ToggleButton\n ========================================================================== */\n\n.tag.pressed {\n background-color: var(--color-background-faint-brand) !important;\n color: var(--color-foreground-bold-brand) !important;\n border-color: transparent !important;\n}\n\n/* ==========================================================================\n Remove button — keeps ::before overlay for its own isolated hit area\n ========================================================================== */\n\n.removable { gap: var(--dimension-space-025); }\n.sizeXs.removable { gap: 0; }\n\n.removeButton {\n padding: 0; margin: 0; border: none; background: none;\n display: flex; align-items: center; justify-content: center;\n cursor: pointer; color: inherit; flex-shrink: 0;\n position: relative; border-radius: var(--dimension-radius-050);\n}\n\n.removeButton::before {\n content: ''; position: absolute; inset: -2px;\n border-radius: var(--dimension-radius-025);\n background-color: transparent;\n transition: var(--effect-transition-interaction-background-short-2);\n pointer-events: none;\n}\n\n.removeButton:hover::before { background-color: var(--color-interaction-hover); }\n.removeButton:active::before { background-color: var(--color-interaction-pressed); }\n\n/* SM — 1px gap, inset -1px → 18×18 hover area */\n.sizeSm .removeButton::before { inset: -1px; border-radius: 3px; }\n\n/* XS — flush, inset 0 → 12×12 hover area matching tag radius */\n.sizeXs .removeButton::before { inset: 0; border-radius: var(--dimension-radius-050); }\n\n.rounded .removeButton,\n.rounded .removeButton::before { border-radius: var(--dimension-radius-half); }\n\n/* ==========================================================================\n Disabled\n ========================================================================== */\n\n.inactive { opacity: 0.5; pointer-events: none; cursor: not-allowed; }\n","import React, { forwardRef } from 'react';\nimport { cn } from '@/utils/cn';\nimport { Text } from '@/components/Text';\nimport { LabelWrap } from '@/components/LabelWrap';\nimport { Cross } from '@ds-mo/icons';\nimport type { IconComponent } from '@/types/icons';\nimport styles from './Tag.module.css';\n\nexport type TagIntent = 'neutral' | 'brand' | 'ai' | 'negative' | 'warning' | 'caution' | 'positive';\nexport type TagContrast = 'strong' | 'bold' | 'medium' | 'faint';\nexport type TagElevation = 'none' | 'flat' | 'elevated';\nexport type TagSize = 'md' | 'sm' | 'xs';\nexport type TagBackground = 'faint' | 'medium' | 'bold' | 'strong' | 'always-dark';\n\nexport interface TagProps {\n label: string;\n intent?: TagIntent;\n contrast?: TagContrast;\n /**\n * Visual chrome level.\n * none — filled with intent bg, no border, no shadow [default]\n * flat — transparent bg + intent-coloured border ring\n * elevated — filled with intent bg + elevated shadow\n */\n elevation?: TagElevation;\n size?: TagSize;\n rounded?: boolean;\n /** Leading icon component. */\n icon?: IconComponent;\n removable?: boolean;\n onRemove?: () => void;\n /** Override the default Cross remove icon. */\n removeIcon?: IconComponent;\n maxWidth?: string | number;\n inactive?: boolean;\n /** Parent surface context. Adjusts hover tokens for tags on colored backgrounds. */\n background?: TagBackground;\n /** Makes the tag clickable. Pair with pressed/onPressedChange for filter-chip behaviour. */\n onClick?: () => void;\n pressed?: boolean;\n onPressedChange?: (pressed: boolean) => void;\n className?: string;\n}\n\nconst ICON_SIZE: Record<TagSize, number> = { md: 20, sm: 16, xs: 12 };\n\nconst TEXT_STYLE_MAP: Record<TagSize, string> = {\n md: 'text-body-medium',\n sm: 'text-body-small',\n xs: 'text-caption',\n};\n\nexport const Tag = forwardRef<HTMLDivElement, TagProps>(\n (\n {\n label,\n intent = 'neutral',\n contrast = 'faint',\n elevation = 'none',\n size = 'md',\n rounded = false,\n icon: Icon,\n removable = false,\n onRemove,\n removeIcon: RemoveIcon,\n maxWidth,\n inactive = false,\n background,\n onClick,\n pressed,\n onPressedChange,\n className,\n },\n ref\n ) => {\n const isInteractive = !!onClick || !!onPressedChange;\n const hasRemove = removable && !!onRemove;\n const iconSize = ICON_SIZE[size];\n const textStyle = TEXT_STYLE_MAP[size];\n const elevKey = elevation.charAt(0).toUpperCase() + elevation.slice(1);\n const sizeKey = size.toUpperCase() as 'MD' | 'SM' | 'XS';\n\n const classes = cn(\n styles.tag,\n styles[`intent${intent.charAt(0).toUpperCase() + intent.slice(1)}`],\n styles[`contrast${contrast.charAt(0).toUpperCase() + contrast.slice(1)}`],\n styles[`elevation${elevKey}`],\n styles[`size${size.charAt(0).toUpperCase() + size.slice(1)}`],\n rounded && styles.rounded,\n // Pill padding correction — extra space-050 on bare sides (no content anchor)\n rounded && !Icon && (styles as Record<string, string>)[`roundedLeft${sizeKey}`],\n rounded && !hasRemove && (styles as Record<string, string>)[`roundedRight${sizeKey}`],\n // Icon-edge correction — reduce padding to (height − icon) / 2 on icon sides\n !!Icon && (styles as Record<string, string>)[`iconLeft${sizeKey}`],\n hasRemove && (styles as Record<string, string>)[`iconRight${sizeKey}`],\n removable && styles.removable,\n isInteractive && styles.interactive,\n background && background !== 'faint' && styles[\n background === 'always-dark' ? 'onAlwaysDark'\n : `on${background.charAt(0).toUpperCase() + background.slice(1)}`\n ],\n inactive && styles.inactive,\n pressed && styles.pressed,\n className,\n );\n\n const style = maxWidth != null\n ? { maxWidth: typeof maxWidth === 'number' ? `${maxWidth}px` : maxWidth }\n : undefined;\n\n const handleInteract = isInteractive && !inactive\n ? () => {\n onPressedChange?.(!pressed);\n onClick?.();\n }\n : undefined;\n\n const handleKeyDown = isInteractive && !inactive\n ? (e: React.KeyboardEvent<HTMLDivElement>) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onPressedChange?.(!pressed);\n onClick?.();\n }\n }\n : undefined;\n\n return (\n <div\n ref={ref}\n className={classes}\n style={style}\n onClick={handleInteract}\n onKeyDown={handleKeyDown}\n role={isInteractive ? 'button' : undefined}\n tabIndex={isInteractive && !inactive ? 0 : undefined}\n aria-pressed={onPressedChange != null ? pressed : undefined}\n aria-disabled={inactive || undefined}\n >\n {Icon && <Icon size={iconSize} />}\n <LabelWrap size={size}>\n <Text variant={textStyle as never} as=\"span\" color=\"inherit\">\n {label}\n </Text>\n </LabelWrap>\n {removable && onRemove && (\n <button\n type=\"button\"\n className={styles.removeButton}\n onClick={(e) => { e.stopPropagation(); onRemove(); }}\n aria-label={`Remove ${label}`}\n tabIndex={-1}\n >\n {RemoveIcon ? <RemoveIcon size={iconSize} /> : <Cross size={iconSize} />}\n </button>\n )}\n </div>\n );\n }\n);\n\nTag.displayName = 'Tag';\n",".badge {\n display: flex;\n align-items: center;\n justify-content: center;\n pointer-events: none;\n}\n","import React from 'react';\nimport { Text } from '@/components/Text';\nimport styles from './Badge.module.css';\n\nexport interface BadgeProps {\n count: number;\n isSelected?: boolean;\n className?: string;\n}\n\nexport const Badge: React.FC<BadgeProps> = ({ count, isSelected = false, className }) => {\n if (count === 0) return null;\n const displayText = count > 9 ? '+' : count.toString();\n return (\n <span className={`${styles.badge} ${className || ''}`} aria-label={`${count} unread`}>\n <Text variant=\"text-caption-emphasis\" as=\"span\" color={isSelected ? 'primary' : 'secondary'}>\n {displayText}\n </Text>\n </span>\n );\n};\n\nBadge.displayName = 'Badge';\n",".toggle {\n position: relative;\n display: inline-flex;\n align-items: center;\n justify-content: flex-start;\n width: var(--dimension-size-400);\n height: var(--dimension-size-250);\n padding: 0 var(--dimension-space-025);\n border: none;\n border-radius: var(--dimension-radius-half);\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n outline: none;\n flex-shrink: 0;\n background-color: var(--color-background-medium-neutral);\n box-shadow: var(--effect-highlight-depressed-sm);\n transition: background-color var(--effect-motion-short-2);\n}\n\n.toggle::before {\n content: '';\n position: absolute;\n inset: 0;\n border-radius: inherit;\n box-shadow: var(--effect-shadow-depressed-sm);\n pointer-events: none;\n}\n\n.toggle:focus-visible {\n outline: var(--dimension-stroke-width-025) solid var(--color-interaction-focus);\n outline-offset: var(--dimension-space-025);\n}\n\n.checked {\n background-color: var(--color-foreground-bold-brand) !important;\n}\n\n.thumb {\n position: relative;\n flex-shrink: 0;\n width: var(--dimension-size-200);\n height: var(--dimension-size-200);\n background-color: var(--color-background-primary);\n border-radius: var(--dimension-radius-half);\n box-shadow: var(--effect-elevation-elevated-sm);\n transition: transform var(--effect-motion-short-2);\n transform: translateX(0);\n z-index: 1;\n}\n\n.thumb::after {\n content: '';\n position: absolute;\n inset: 0;\n background-color: transparent;\n border-radius: inherit;\n transition: var(--effect-transition-interaction-background-instant);\n pointer-events: none;\n}\n\n.toggle:hover:not(.inactive) .thumb::after {\n background-color: var(--color-interaction-hover);\n}\n\n.toggle:active:not(.inactive) .thumb::after {\n background-color: var(--color-interaction-pressed);\n}\n\n.checked .thumb {\n transform: translateX(var(--dimension-offset-150));\n}\n\n.toggle:active:not(.inactive) .thumb {\n transform: translateX(0) scale(var(--dimension-scale-subtle)) !important;\n transition: transform var(--effect-motion-instant);\n}\n\n.checked.toggle:active:not(.inactive) .thumb {\n transform: translateX(var(--dimension-offset-150)) scale(var(--dimension-scale-subtle)) !important;\n transition: transform var(--effect-motion-instant);\n}\n\n.inactive {\n cursor: not-allowed;\n opacity: 0.5;\n}\n","import React, { forwardRef, useState } from 'react';\nimport { cn } from '@/utils/cn';\nimport styles from './Toggle.module.css';\n\nexport interface ToggleProps {\n checked?: boolean;\n onChange?: (checked: boolean) => void;\n inactive?: boolean;\n className?: string;\n 'aria-label'?: string;\n}\n\nexport const Toggle = forwardRef<HTMLButtonElement, ToggleProps>(\n ({ checked = false, onChange, inactive = false, className, 'aria-label': ariaLabel }, ref) => {\n const [isPressed, setIsPressed] = useState(false);\n\n const handleMouseDown = (e: React.MouseEvent) => {\n if (inactive) return;\n e.preventDefault();\n setIsPressed(true);\n };\n\n const handleMouseUp = () => {\n if (inactive || !isPressed) return;\n setIsPressed(false);\n onChange?.(!checked);\n };\n\n const handleMouseLeave = () => {\n if (isPressed) setIsPressed(false);\n };\n\n return (\n <button\n ref={ref}\n type=\"button\"\n role=\"switch\"\n aria-checked={checked}\n aria-label={ariaLabel}\n disabled={inactive}\n className={cn(styles.toggle, checked && styles.checked, inactive && styles.inactive, className)}\n onMouseDown={handleMouseDown}\n onMouseUp={handleMouseUp}\n onMouseLeave={handleMouseLeave}\n >\n <span className={styles.thumb} />\n </button>\n );\n }\n);\n\nToggle.displayName = 'Toggle';\n",".checkbox {\n display: flex;\n align-items: center;\n gap: var(--dimension-space-050);\n padding: var(--dimension-space-075);\n height: var(--dimension-size-400);\n box-sizing: border-box;\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n border-radius: var(--dimension-radius-075);\n transition: background-color var(--effect-motion-short-2);\n}\n\n.checkbox:hover { background-color: var(--color-interaction-hover); }\n.checkbox:active { background-color: var(--color-interaction-pressed); }\n\n.inactive {\n cursor: not-allowed;\n opacity: 0.5;\n pointer-events: none;\n}\n\n/* Fallback checkbox box (when no icon components provided) */\n.box {\n width: 20px;\n height: 20px;\n border: 1.5px solid var(--color-foreground-secondary);\n border-radius: var(--dimension-radius-050);\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n transition: all var(--effect-motion-short-2);\n}\n\n.boxChecked {\n background-color: var(--color-foreground-primary);\n border-color: var(--color-foreground-primary);\n}\n\n.checkmark {\n color: var(--color-foreground-on-bold-background-primary);\n font-size: 14px;\n line-height: 1;\n font-weight: 700;\n}\n","import React, { forwardRef } from 'react';\nimport { cn } from '@/utils/cn';\nimport { Text } from '@/components/Text';\nimport type { IconComponent } from '@/types/icons';\nimport styles from './Checkbox.module.css';\n\nexport interface CheckboxProps {\n label: string;\n checked?: boolean;\n indeterminate?: boolean;\n onChange?: (checked: boolean) => void;\n inactive?: boolean;\n className?: string;\n /** Icon for checked state. */\n checkedIcon?: IconComponent;\n /** Icon for unchecked state. */\n uncheckedIcon?: IconComponent;\n /** Icon for indeterminate state. */\n indeterminateIcon?: IconComponent;\n}\n\nexport const Checkbox = forwardRef<HTMLDivElement, CheckboxProps>(\n (\n {\n label,\n checked = false,\n indeterminate = false,\n onChange,\n inactive = false,\n className,\n checkedIcon: CheckedIcon,\n uncheckedIcon: UncheckedIcon,\n indeterminateIcon: IndeterminateIcon,\n },\n ref\n ) => {\n const handleClick = () => {\n if (!inactive) onChange?.(!checked);\n };\n\n const iconColor = indeterminate || checked ? 'var(--color-foreground-primary)' : 'var(--color-foreground-secondary)';\n const Icon = indeterminate ? IndeterminateIcon : checked ? CheckedIcon : UncheckedIcon;\n\n return (\n <div\n ref={ref}\n role=\"checkbox\"\n aria-checked={indeterminate ? 'mixed' : checked}\n aria-inactive={inactive}\n tabIndex={inactive ? -1 : 0}\n className={cn(styles.checkbox, inactive && styles.inactive, className)}\n onClick={handleClick}\n onKeyDown={e => { if (e.key === ' ' || e.key === 'Enter') { e.preventDefault(); handleClick(); } }}\n >\n {Icon ? <Icon size={20} color={iconColor} /> : (\n <span className={cn(styles.box, (checked || indeterminate) && styles.boxChecked)}>\n {(checked || indeterminate) && <span className={styles.checkmark}>{indeterminate ? '−' : '✓'}</span>}\n </span>\n )}\n <Text variant=\"text-body-medium\" as=\"span\" color=\"inherit\">\n {label}\n </Text>\n </div>\n );\n }\n);\n\nCheckbox.displayName = 'Checkbox';\n",".wrapper {\n width: 100%;\n height: var(--dimension-size-400);\n display: flex;\n align-items: center;\n background-color: var(--color-background-primary);\n border-radius: var(--dimension-radius-075);\n box-shadow: var(--effect-elevation-depressed-sm);\n box-sizing: border-box;\n}\n\n.wrapper:focus-within {\n box-shadow: inset 0 0 0 1.25px var(--color-foreground-bold-brand);\n}\n\n.row {\n display: flex;\n align-items: center;\n width: 100%;\n height: 100%;\n gap: var(--dimension-space-050);\n}\n\n.input {\n flex: 1;\n min-width: 0;\n height: 100%;\n padding: 0 var(--dimension-space-100);\n background: transparent;\n border: none;\n outline: none;\n font-family: inherit;\n font-size: var(--typography-fontsize-md);\n line-height: var(--typography-lineheight-md);\n color: var(--color-foreground-primary);\n border-radius: var(--dimension-radius-075);\n -webkit-appearance: none;\n appearance: none;\n}\n\n.input:disabled { opacity: 0.5; cursor: not-allowed; }\n.input::placeholder { color: var(--color-foreground-secondary); }\n.input:focus::placeholder { color: var(--color-foreground-tertiary); }\n\n/* Hide native search clear */\n.input[type=\"search\"]::-webkit-search-cancel-button,\n.input[type=\"search\"]::-webkit-search-decoration { display: none; }\n\n.clearButton {\n flex-shrink: 0;\n margin-right: var(--dimension-space-050);\n padding: var(--dimension-space-050);\n border: none;\n background: none;\n cursor: pointer;\n color: var(--color-foreground-secondary);\n border-radius: var(--dimension-radius-050);\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.clearButton:hover { background-color: var(--color-interaction-hover); }\n\n.suffix {\n display: flex;\n align-items: center;\n gap: var(--dimension-space-050);\n flex-shrink: 0;\n margin-right: var(--dimension-space-050);\n}\n","import React, { forwardRef } from 'react';\nimport { cn } from '@/utils/cn';\nimport type { IconComponent } from '@/types/icons';\nimport styles from './Input.module.css';\n\nexport type InputType = 'text' | 'email' | 'tel' | 'url' | 'search' | 'password';\n\nexport interface InputProps {\n value: string;\n onChange: (e: React.ChangeEvent<HTMLInputElement>) => void;\n id?: string;\n placeholder?: string;\n autoFocus?: boolean;\n className?: string;\n type?: InputType;\n inactive?: boolean;\n onKeyDown?: React.KeyboardEventHandler<HTMLInputElement>;\n /** Content rendered inside the field on the right. */\n suffix?: React.ReactNode;\n /** Icon for clear button (search type). */\n clearIcon?: IconComponent;\n 'aria-label'?: string;\n}\n\nexport const Input = forwardRef<HTMLDivElement, InputProps>(\n (\n {\n value,\n onChange,\n id,\n placeholder,\n autoFocus = false,\n className,\n type = 'text',\n inactive = false,\n onKeyDown,\n suffix,\n clearIcon: ClearIcon,\n 'aria-label': ariaLabel,\n },\n ref\n ) => {\n const showClear = type === 'search' && value.length > 0 && !inactive;\n\n const handleClear = () => {\n onChange({ target: { value: '' } } as React.ChangeEvent<HTMLInputElement>);\n };\n\n return (\n <div ref={ref} className={cn(styles.wrapper, className)}>\n <div className={styles.row}>\n <input\n type={type}\n id={id}\n value={value}\n onChange={onChange}\n onKeyDown={onKeyDown}\n placeholder={placeholder}\n className={styles.input}\n autoFocus={autoFocus}\n disabled={inactive}\n aria-label={ariaLabel}\n />\n {showClear && (\n <button type=\"button\" className={styles.clearButton} onClick={handleClear} aria-label=\"Clear\">\n {ClearIcon ? <ClearIcon size={16} /> : <span aria-hidden>&times;</span>}\n </button>\n )}\n {suffix && <div className={styles.suffix}>{suffix}</div>}\n </div>\n </div>\n );\n }\n);\n\nInput.displayName = 'Input';\n",".field { display: flex; flex-direction: column; gap: var(--dimension-space-050); width: 100%; }\n.labelRow { display: flex; align-items: baseline; justify-content: space-between; gap: var(--dimension-space-050); }\n\n.track {\n position: relative; width: 100%; height: var(--dimension-size-400);\n padding: 0 var(--dimension-space-025); border-radius: var(--dimension-radius-075); cursor: pointer; -webkit-user-select: none;\n user-select: none;\n}\n\n.trackInner {\n position: absolute; inset: 0; border-radius: inherit;\n background-color: var(--color-background-primary);\n box-shadow: var(--effect-elevation-depressed-sm); pointer-events: none; z-index: 1;\n}\n\n.fillTrack { position: absolute; top: var(--dimension-space-025); right: 0; bottom: var(--dimension-space-025); left: 0; z-index: 1; }\n\n.fill {\n position: absolute; left: var(--dimension-space-025); top: 0; bottom: 0;\n width: max(0px, calc((var(--slider-pct, 0) / 100) * (100% - var(--dimension-size-150)) - var(--dimension-space-025)));\n background-color: var(--color-background-bold-brand);\n box-shadow: var(--effect-elevation-elevated-sm);\n border-radius: var(--dimension-radius-050);\n transition: opacity var(--effect-motion-short-2);\n}\n\n.trackAtMin .fill { opacity: 0; }\n\n.thumb {\n position: absolute; top: 0; bottom: 0;\n left: calc((var(--slider-pct, 0) / 100) * (100% - var(--dimension-size-150)));\n width: var(--dimension-size-150); padding: var(--dimension-space-025);\n box-sizing: border-box; pointer-events: none; z-index: 2;\n}\n\n.thumb::before {\n content: ''; position: absolute; inset: var(--dimension-space-025);\n background-color: var(--color-background-primary);\n box-shadow: var(--effect-elevation-elevated-sm);\n border-radius: var(--dimension-radius-050);\n}\n\n.thumb::after {\n content: ''; position: absolute; inset: var(--dimension-space-025);\n background-color: transparent; border-radius: var(--dimension-radius-050);\n transition: var(--effect-transition-interaction-background-instant);\n}\n\n.track:hover:not(.trackInactive) .thumb::after { background-color: var(--color-interaction-hover); }\n.track:active:not(.trackInactive) .thumb::after { background-color: var(--color-interaction-pressed); }\n\n.trackInactive { cursor: not-allowed; opacity: 0.5; }\n\n.input {\n position: absolute; inset: 0; width: 100%; height: 100%;\n margin: 0; padding: 0; opacity: 0; cursor: pointer;\n -webkit-appearance: none; appearance: none; outline: none; z-index: 3;\n}\n\n.input:disabled { cursor: not-allowed; }\n.input:hover { cursor: grab; }\n.input:active { cursor: grabbing; }\n","import React, { forwardRef, useCallback, useEffect, useId, useRef, useState } from 'react';\nimport { cn } from '@/utils/cn';\nimport { Text } from '@/components/Text';\nimport styles from './Slider.module.css';\n\nexport interface SliderProps {\n value: number;\n onChange: (value: number) => void;\n min?: number;\n max?: number;\n step?: number;\n label: string;\n id?: string;\n inactive?: boolean;\n className?: string;\n}\n\nexport const Slider = forwardRef<HTMLDivElement, SliderProps>(\n ({ value, onChange, min = 0, max = 100, step = 1, label, id: idProp, inactive = false, className }, ref) => {\n const generatedId = useId();\n const id = idProp ?? generatedId;\n const containerRef = useRef<HTMLDivElement>(null);\n const [pct, setPct] = useState(() => {\n const range = max - min;\n return range === 0 ? 0 : Math.round(((value - min) / range) * 100);\n });\n\n const sync = useCallback(() => {\n const range = max - min;\n setPct(range === 0 ? 0 : Math.round(((value - min) / range) * 100));\n }, [value, min, max]);\n\n useEffect(() => { sync(); }, [sync]);\n\n const handleInput = (e: React.ChangeEvent<HTMLInputElement>) => {\n onChange(Number(e.target.value));\n };\n\n return (\n <div ref={ref} className={cn(styles.field, className)}>\n <div className={styles.labelRow}>\n <Text variant=\"text-body-small-emphasis\" as=\"label\" htmlFor={id}>{label}</Text>\n <Text variant=\"text-body-small-emphasis\" as=\"span\">{value}</Text>\n </div>\n <div\n ref={containerRef}\n className={cn(styles.track, inactive && styles.trackInactive, pct === 0 && styles.trackAtMin)}\n style={{ '--slider-pct': pct } as React.CSSProperties}\n >\n <div className={styles.trackInner}>\n <div className={styles.fillTrack}><div className={styles.fill} /></div>\n <div className={styles.thumb} />\n </div>\n <input\n type=\"range\"\n id={id}\n min={min}\n max={max}\n step={step}\n value={value}\n onChange={handleInput}\n disabled={inactive}\n className={styles.input}\n aria-valuemin={min}\n aria-valuemax={max}\n aria-valuenow={value}\n />\n </div>\n </div>\n );\n }\n);\n\nSlider.displayName = 'Slider';\n",".field {\n display: flex;\n flex-direction: column;\n gap: var(--dimension-space-050);\n}\n","import React, { forwardRef } from 'react';\nimport { cn } from '@/utils/cn';\nimport { Text } from '@/components/Text';\nimport styles from './Field.module.css';\n\nexport interface FieldProps {\n label: string;\n children: React.ReactNode;\n id?: string;\n className?: string;\n}\n\nexport const Field = forwardRef<HTMLDivElement, FieldProps>(\n ({ label, children, id, className }, ref) => (\n <div ref={ref} className={cn(styles.field, className)}>\n <Text variant=\"text-body-small-emphasis\" as=\"label\" htmlFor={id}>{label}</Text>\n {children}\n </div>\n )\n);\n\nField.displayName = 'Field';\n",".backdrop {\n position: fixed;\n inset: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: var(--dimension-space-200);\n background-color: var(--color-background-shade);\n backdrop-filter: blur(var(--effect-blur-sm));\n -webkit-backdrop-filter: blur(var(--effect-blur-sm));\n animation: modalBackdropFadeIn var(--effect-motion-short-2) forwards;\n z-index: 9999;\n}\n\n.backdrop.closing {\n animation: modalBackdropFadeOut var(--effect-motion-short-3) forwards;\n}\n\n@keyframes modalBackdropFadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n@keyframes modalBackdropFadeOut {\n from { opacity: 1; }\n to { opacity: 0; }\n}\n\n.dialog {\n display: flex;\n flex-direction: column;\n max-height: calc(100vh - 32px);\n overflow: hidden;\n animation: modalDialogFadeIn var(--effect-motion-short-2) forwards;\n}\n\n.backdrop.closing .dialog {\n animation: modalDialogFadeOut var(--effect-motion-short-3) forwards;\n}\n\n@keyframes modalDialogFadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n@keyframes modalDialogFadeOut {\n from { opacity: 1; }\n to { opacity: 0; }\n}\n\n.header {\n padding: var(--dimension-space-200) var(--dimension-space-200) var(--dimension-space-100) var(--dimension-space-200);\n}\n\n.subtitle {\n margin-top: var(--dimension-space-100);\n text-wrap: balance;\n}\n\n.body {\n padding: var(--dimension-space-100) var(--dimension-space-200);\n overflow-y: auto;\n}\n\n.footer {\n padding: var(--dimension-space-100) var(--dimension-space-200) var(--dimension-space-200) var(--dimension-space-200);\n}\n","import React, { useEffect, useId, useMemo, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport { Surface } from '@/components/Surface';\nimport { Text } from '@/components/Text';\nimport styles from './Modal.module.css';\n\nexport type ModalWidth = 'sm' | 'md' | 'lg';\n\nconst WIDTH_MAP: Record<ModalWidth, string> = {\n sm: 'var(--dimension-modal-width-sm, 400px)',\n md: 'var(--dimension-modal-width-md, 560px)',\n lg: 'var(--dimension-modal-width-lg, 720px)',\n};\n\nconst CLOSE_ANIMATION_MS = 220;\n\nexport interface ModalProps {\n isOpen: boolean;\n onClose: () => void;\n title: string;\n subtitle?: React.ReactNode;\n children: React.ReactNode;\n footer?: React.ReactNode;\n width?: ModalWidth | string;\n bodyClassName?: string;\n}\n\nexport const Modal: React.FC<ModalProps> = ({\n isOpen,\n onClose,\n title,\n subtitle,\n children,\n footer,\n width = 'md',\n bodyClassName,\n}) => {\n const dialogRef = useRef<HTMLDivElement>(null);\n const titleId = useId();\n const [isClosing, setIsClosing] = useState(false);\n const [shouldRender, setShouldRender] = useState(isOpen);\n\n const resolvedWidth = useMemo(() => {\n if (width === 'sm' || width === 'md' || width === 'lg') {\n return WIDTH_MAP[width];\n }\n return width;\n }, [width]);\n\n useEffect(() => {\n if (isOpen) {\n setShouldRender(true);\n setIsClosing(false);\n } else if (shouldRender) {\n setIsClosing(true);\n const timer = setTimeout(() => {\n setShouldRender(false);\n setIsClosing(false);\n }, CLOSE_ANIMATION_MS);\n return () => clearTimeout(timer);\n }\n }, [isOpen, shouldRender]);\n\n useEffect(() => {\n if (!isOpen) return;\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === 'Escape') onClose();\n };\n document.addEventListener('keydown', handleEscape);\n return () => document.removeEventListener('keydown', handleEscape);\n }, [isOpen, onClose]);\n\n useEffect(() => {\n if (!isOpen || !shouldRender) return;\n const id = requestAnimationFrame(() => {\n dialogRef.current?.focus();\n });\n return () => cancelAnimationFrame(id);\n }, [isOpen, shouldRender]);\n\n if (!shouldRender) return null;\n\n return createPortal(\n <div\n className={`${styles.backdrop} ${isClosing ? styles.closing : ''}`}\n onMouseDown={(e) => {\n if (e.target === e.currentTarget) onClose();\n }}\n >\n <Surface\n ref={dialogRef}\n background=\"primary\"\n elevation=\"floating\"\n radius=\"var(--dimension-radius-275, 22px)\"\n className={styles.dialog}\n style={{ width: `min(${resolvedWidth}, calc(100vw - 32px))` }}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={titleId}\n tabIndex={-1}\n >\n <div className={styles.header}>\n <Text id={titleId} as=\"h2\" variant=\"text-title-small\">\n {title}\n </Text>\n {subtitle != null && (\n <div className={styles.subtitle}>{subtitle}</div>\n )}\n </div>\n <div className={`${styles.body} ${bodyClassName ?? ''}`.trim()}>\n {children}\n </div>\n {footer != null && (\n <div className={styles.footer}>{footer}</div>\n )}\n </Surface>\n </div>,\n document.body\n );\n};\n\nModal.displayName = 'Modal';\n",".menuItem {\n display: flex;\n align-items: center;\n gap: var(--dimension-space-050);\n padding: var(--dimension-space-075);\n border: none;\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n text-align: left;\n width: 100%;\n min-height: var(--dimension-size-400);\n}\n\n.menuItem:has(.subtext) { align-items: flex-start; }\n\n.iconPrefix {\n flex-shrink: 0;\n display: flex;\n align-items: center;\n color: var(--color-foreground-secondary);\n}\n\n.menuItemSelected .iconPrefix { color: var(--color-foreground-primary); }\n\n.content {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: var(--dimension-space-025);\n min-width: 0;\n}\n\n.label { color: var(--color-foreground-secondary); }\n.menuItem:has(.subtext) .label { color: var(--color-foreground-primary); }\n.menuItemSelected .label { color: var(--color-foreground-primary) !important; }\n.menuItemLabelTertiary .label, .menuItemLabelTertiary .iconPrefix { color: var(--color-foreground-tertiary); }\n.menuItemNegative .label { color: var(--color-foreground-bold-negative) !important; }\n\n.subtext { color: var(--color-foreground-secondary); line-height: 1.4; }\n\n.menuItemInactive { opacity: 0.5; cursor: default; pointer-events: none; }\n\n.toggleSuffix { flex-shrink: 0; display: flex; align-items: center; }\n\n.toggle {\n width: calc(var(--dimension-size-400) + var(--dimension-size-050));\n height: var(--dimension-size-250);\n background-color: var(--color-background-translucent);\n border-radius: var(--dimension-radius-125);\n position: relative;\n transition: var(--effect-transition-interaction-background-short-2);\n}\n\n.toggleOn { background-color: var(--color-background-medium-brand); }\n\n.toggleThumb {\n width: var(--dimension-size-200);\n height: var(--dimension-size-200);\n background-color: var(--color-foreground-on-bold-background-primary);\n border-radius: 50%;\n position: absolute;\n top: var(--dimension-space-025);\n left: var(--dimension-space-025);\n transition: transform var(--effect-motion-short-2);\n}\n\n.toggleOn .toggleThumb { transform: translateX(var(--dimension-offset-200)); }\n\n.checkSuffix {\n flex-shrink: 0;\n display: flex;\n align-items: center;\n color: var(--color-foreground-primary);\n}\n\n.chevronSuffix {\n flex-shrink: 0;\n display: flex;\n align-items: center;\n color: var(--color-foreground-secondary);\n}\n\n.menuItemSelected .chevronSuffix { color: var(--color-foreground-primary); }\n","import React, { forwardRef } from 'react';\nimport { Text } from '@/components/Text';\nimport { Surface } from '@/components/Surface';\nimport type { IconComponent } from '@/types';\nimport styles from './MenuItem.module.css';\n\nexport type MenuItemSelectionStyle = 'highlight' | 'radio' | 'noOverlay';\n\nexport interface MenuItemProps {\n label: string;\n onClick: () => void;\n isSelected?: boolean;\n isInactive?: boolean;\n icon?: IconComponent;\n labelColor?: 'primary' | 'secondary' | 'tertiary';\n subtext?: string;\n showToggle?: boolean;\n toggleValue?: boolean;\n intent?: 'negative';\n selectionStyle?: MenuItemSelectionStyle;\n showTrailingChevron?: boolean;\n checkIcon?: IconComponent;\n chevronIcon?: IconComponent;\n}\n\nexport const MenuItem = forwardRef<HTMLButtonElement, MenuItemProps>(\n ({\n label,\n onClick,\n isSelected = false,\n isInactive = false,\n icon: Icon,\n labelColor,\n subtext,\n showToggle = false,\n toggleValue = false,\n intent,\n selectionStyle = 'highlight',\n showTrailingChevron = false,\n checkIcon: CheckIcon,\n chevronIcon: ChevronIcon,\n }, ref) => {\n const useRadioStyle = selectionStyle === 'radio';\n const noOverlay = selectionStyle === 'noOverlay' || useRadioStyle;\n const showSelectedOverlay = isSelected && !noOverlay;\n\n return (\n <Surface\n ref={ref as React.Ref<HTMLElement>}\n as=\"button\"\n interactive={!isInactive}\n selected={showSelectedOverlay}\n radius=\"sm\"\n className={`${styles.menuItem} ${isSelected ? styles.menuItemSelected : ''} ${isInactive ? styles.menuItemInactive : ''} ${intent === 'negative' ? styles.menuItemNegative : ''} ${labelColor === 'tertiary' ? styles.menuItemLabelTertiary : ''}`}\n onClick={onClick}\n type=\"button\"\n inactive={isInactive}\n >\n {Icon && (\n <div className={styles.iconPrefix}>\n <Icon size={20} />\n </div>\n )}\n <div className={styles.content}>\n <Text\n variant={isSelected ? 'text-body-medium-emphasis' : 'text-body-medium'}\n color={labelColor}\n as=\"span\"\n className={styles.label}\n >\n {label}\n </Text>\n {subtext && (\n <Text variant=\"text-body-small\" as=\"span\" className={styles.subtext}>\n {subtext}\n </Text>\n )}\n </div>\n {showToggle && (\n <div className={styles.toggleSuffix}>\n <div className={`${styles.toggle} ${toggleValue ? styles.toggleOn : ''}`}>\n <div className={styles.toggleThumb} />\n </div>\n </div>\n )}\n {useRadioStyle && isSelected && CheckIcon && (\n <div className={styles.checkSuffix}>\n <CheckIcon size={20} />\n </div>\n )}\n {showTrailingChevron && ChevronIcon && (\n <div className={styles.chevronSuffix}>\n <ChevronIcon size={20} />\n </div>\n )}\n </Surface>\n );\n }\n);\n\nMenuItem.displayName = 'MenuItem';\n",".destructiveMenuItem {\n display: flex;\n align-items: center;\n padding: var(--dimension-space-075);\n background-color: transparent;\n border: none;\n border-radius: var(--dimension-radius-075);\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n text-align: left;\n width: 100%;\n min-height: var(--dimension-size-400);\n position: relative;\n transition: var(--effect-transition-interaction-background-instant);\n overflow: hidden;\n}\n\n.destructiveMenuItem:has(.subtext) { align-items: flex-start; }\n\n.progressFill {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n background-color: var(--color-background-faint-negative);\n border-radius: var(--dimension-radius-075);\n transition: width 0ms linear;\n pointer-events: none;\n z-index: 0;\n}\n\n.destructiveMenuItem::before {\n content: '';\n position: absolute;\n inset: 0;\n background-color: transparent;\n border-radius: var(--dimension-radius-075);\n transition: var(--effect-transition-interaction-background-instant);\n pointer-events: none;\n z-index: 1;\n}\n\n.content {\n position: relative;\n z-index: 2;\n display: flex;\n flex-direction: column;\n gap: var(--dimension-space-025);\n min-width: 0;\n}\n\n.label { color: var(--color-foreground-bold-negative); }\n.subtext { color: var(--color-foreground-secondary); text-wrap: pretty; }\n\n.destructiveMenuItem:hover::before { background-color: var(--color-interaction-hover); }\n.destructiveMenuItem:active::before { background-color: transparent; }\n","import React, { forwardRef, useState, useRef, useEffect } from 'react';\nimport { Text } from '@/components/Text';\nimport styles from './DestructiveMenuItem.module.css';\n\nexport interface DestructiveMenuItemProps {\n label: string;\n onClick: () => void;\n holdDuration?: number;\n subtext?: string;\n}\n\nexport const DestructiveMenuItem = forwardRef<HTMLButtonElement, DestructiveMenuItemProps>(\n ({ label, onClick, holdDuration = 4000, subtext }, ref) => {\n const [progress, setProgress] = useState(0);\n const pressTimerRef = useRef<number | null>(null);\n const startTimeRef = useRef<number>(0);\n const animationFrameRef = useRef<number | null>(null);\n\n const resetState = () => {\n setProgress(0);\n if (pressTimerRef.current) { clearTimeout(pressTimerRef.current); pressTimerRef.current = null; }\n if (animationFrameRef.current) { cancelAnimationFrame(animationFrameRef.current); animationFrameRef.current = null; }\n };\n\n const handleMouseDown = (e: React.MouseEvent) => {\n e.stopPropagation();\n e.preventDefault();\n if (holdDuration === 0) { onClick(); return; }\n startTimeRef.current = performance.now();\n const animate = () => {\n const elapsed = performance.now() - startTimeRef.current;\n const newProgress = Math.min((elapsed / holdDuration) * 100, 100);\n setProgress(newProgress);\n if (newProgress < 100) animationFrameRef.current = requestAnimationFrame(animate);\n };\n animationFrameRef.current = requestAnimationFrame(animate);\n pressTimerRef.current = window.setTimeout(() => { onClick(); resetState(); }, holdDuration);\n };\n\n const handleMouseUp = (e: React.MouseEvent) => { e.stopPropagation(); resetState(); };\n const handleMouseLeave = (e: React.MouseEvent) => { e.stopPropagation(); resetState(); };\n\n useEffect(() => () => { resetState(); }, []);\n\n return (\n <button\n ref={ref}\n className={styles.destructiveMenuItem}\n onMouseDown={handleMouseDown}\n onMouseUp={handleMouseUp}\n onMouseLeave={handleMouseLeave}\n type=\"button\"\n >\n <div className={styles.progressFill} style={{ width: `${progress}%` }} />\n <div className={styles.content}>\n <Text variant=\"text-body-medium\" as=\"span\" className={styles.label}>{label}</Text>\n {subtext && <Text variant=\"text-body-small\" as=\"span\" className={styles.subtext}>{subtext}</Text>}\n </div>\n </button>\n );\n }\n);\n\nDestructiveMenuItem.displayName = 'DestructiveMenuItem';\n","/**\n * Reads a CSS custom property value from :root as a pixel number.\n * Returns the fallback if the property is not set or not parseable.\n */\nexport function getCssSpacePx(property: string, fallback: number): number {\n if (typeof document === 'undefined') return fallback;\n const raw = getComputedStyle(document.documentElement).getPropertyValue(property).trim();\n const parsed = parseFloat(raw);\n return Number.isNaN(parsed) ? fallback : parsed;\n}\n\n/**\n * Reads a CSS custom property value from :root as a millisecond number.\n * Handles both \"300ms\" and \"0.3s\" formats.\n */\nexport function getCssTimeMs(property: string, fallback: number): number {\n if (typeof document === 'undefined') return fallback;\n const raw = getComputedStyle(document.documentElement).getPropertyValue(property).trim();\n if (raw.endsWith('ms')) return parseFloat(raw) || fallback;\n if (raw.endsWith('s')) return (parseFloat(raw) || 0) * 1000 || fallback;\n return fallback;\n}\n",".menuContainer {\n box-sizing: border-box;\n background-color: var(--color-background-primary);\n border-radius: var(--dimension-radius-125);\n box-shadow: var(--effect-elevation-elevated-floating);\n display: flex;\n flex-direction: column;\n min-width: 200px;\n max-width: 600px;\n overflow: hidden;\n animation: menuFadeIn var(--effect-motion-short-2) forwards;\n backface-visibility: hidden;\n -webkit-font-smoothing: subpixel-antialiased;\n}\n\n@keyframes menuFadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n.menuContainer.closing {\n animation: menuFadeOut var(--effect-motion-short-3) forwards;\n}\n\n@keyframes menuFadeOut {\n from { opacity: 1; }\n to { opacity: 0; }\n}\n\n.menuSection {\n padding: var(--dimension-space-050);\n display: flex;\n flex-direction: column;\n gap: var(--dimension-space-050);\n}\n\n.sectionHeader {\n padding: var(--dimension-space-050) var(--dimension-space-075);\n display: flex;\n align-items: center;\n height: var(--dimension-size-400);\n -webkit-user-select: none;\n user-select: none;\n}\n\n.sectionLabel {\n color: var(--color-foreground-secondary);\n text-align: left;\n}\n","import React, { useState, useEffect, useLayoutEffect, useRef, useMemo } from 'react';\nimport { createPortal } from 'react-dom';\nimport { Text } from '@/components/Text';\nimport { Surface } from '@/components/Surface';\nimport { MenuItem as MenuItemComponent } from './MenuItem';\nimport { DestructiveMenuItem } from './DestructiveMenuItem';\nimport { getCssSpacePx } from '@/utils/css-tokens';\nimport type { IconComponent } from '@/types';\nimport type { MenuItemSelectionStyle } from './MenuItem';\nimport styles from './Menu.module.css';\n\nconst CLOSE_ANIMATION_MS = 220;\n\nexport type MenuSide = 'top' | 'right' | 'bottom' | 'left';\nexport type MenuAlign = 'start' | 'center' | 'end';\n\nexport interface MenuItemData {\n label: string;\n onClick: () => void;\n isSelected?: boolean;\n isDestructive?: boolean;\n isInactive?: boolean;\n intent?: 'negative';\n keepOpenOnClick?: boolean;\n holdDuration?: number;\n icon?: IconComponent;\n subtext?: string;\n showToggle?: boolean;\n toggleValue?: boolean;\n selectionStyle?: MenuItemSelectionStyle;\n}\n\nexport interface MenuSection {\n header?: string;\n items: MenuItemData[];\n}\n\nexport interface MenuProps {\n isOpen: boolean;\n onClose: () => void;\n anchorRef: React.RefObject<HTMLElement | null>;\n items?: MenuItemData[];\n sections?: MenuSection[];\n side?: MenuSide;\n align?: MenuAlign;\n sideOffset?: number;\n alignOffset?: number;\n sideOffsetToken?: string;\n alignOffsetToken?: string;\n width?: string;\n minWidth?: string;\n maxWidth?: string;\n matchAnchorWidth?: boolean;\n matchAnchorWidthOffset?: number;\n usePortal?: boolean;\n}\n\nexport const Menu: React.FC<MenuProps> = ({\n isOpen,\n onClose,\n anchorRef,\n items,\n sections,\n side = 'bottom',\n align = 'start',\n sideOffset = 4,\n alignOffset = 0,\n sideOffsetToken,\n alignOffsetToken,\n width,\n minWidth,\n maxWidth,\n matchAnchorWidth = false,\n matchAnchorWidthOffset = 0,\n usePortal = true,\n}) => {\n const [isClosing, setIsClosing] = useState(false);\n const [shouldRender, setShouldRender] = useState(isOpen);\n const [isPositionReady, setIsPositionReady] = useState(false);\n const [position, setPosition] = useState<{ x: number; y: number }>({ x: 0, y: 0 });\n const [menuSize, setMenuSize] = useState<{ width: number; height: number }>({ width: 0, height: 0 });\n const [anchorSize, setAnchorSize] = useState<{ width: number; height: number }>({ width: 0, height: 0 });\n const positionCalculatedRef = useRef(false);\n const menuRef = useRef<HTMLDivElement>(null);\n const lastSectionsRef = useRef<MenuSection[]>([]);\n\n const menuSections: MenuSection[] = sections || (items ? [{ items }] : []);\n\n const hasItems = menuSections.some((s) => s.items.length > 0);\n if (!isClosing && menuSections.length > 0 && hasItems) {\n lastSectionsRef.current = menuSections;\n }\n const sectionsToRender = isClosing ? lastSectionsRef.current : menuSections;\n\n useEffect(() => {\n if (isOpen) {\n setShouldRender(true);\n setIsClosing(false);\n setIsPositionReady(false);\n positionCalculatedRef.current = false;\n } else if (shouldRender) {\n setIsClosing(true);\n const timer = setTimeout(() => {\n setShouldRender(false);\n setIsClosing(false);\n positionCalculatedRef.current = false;\n }, CLOSE_ANIMATION_MS);\n return () => clearTimeout(timer);\n }\n }, [isOpen, shouldRender]);\n\n useLayoutEffect(() => {\n if (!isOpen || !shouldRender || !menuRef.current) return;\n const updateSize = () => {\n if (!menuRef.current) return;\n const rect = menuRef.current.getBoundingClientRect();\n if (rect.width > 0 && rect.height > 0) setMenuSize({ width: rect.width, height: rect.height });\n };\n updateSize();\n requestAnimationFrame(() => requestAnimationFrame(updateSize));\n if (typeof ResizeObserver !== 'undefined') {\n const observer = new ResizeObserver(updateSize);\n observer.observe(menuRef.current);\n return () => observer.disconnect();\n }\n }, [isOpen, shouldRender, menuSections.length]);\n\n useLayoutEffect(() => {\n if (!isOpen || !shouldRender || !anchorRef.current || !menuRef.current) return;\n const calculatePosition = () => {\n const anchor = anchorRef.current;\n const menu = menuRef.current;\n if (!anchor || !menu) return;\n const anchorRect = anchor.getBoundingClientRect();\n const menuRect = menu.getBoundingClientRect();\n const menuWidth = menuRect.width || menuSize.width || 200;\n const menuHeight = menuRect.height || menuSize.height || 160;\n setAnchorSize({ width: anchorRect.width, height: anchorRect.height });\n const gap = sideOffsetToken != null ? getCssSpacePx(sideOffsetToken, 12) : sideOffset;\n const alignOff = alignOffsetToken != null ? getCssSpacePx(alignOffsetToken, 4) : alignOffset;\n let x = 0, y = 0;\n switch (side) {\n case 'top':\n y = anchorRect.top - menuHeight - gap;\n x = align === 'start' ? anchorRect.left + alignOff : align === 'end' ? anchorRect.right - menuWidth + alignOff : anchorRect.left + anchorRect.width / 2 - menuWidth / 2 + alignOff;\n break;\n case 'bottom':\n y = anchorRect.bottom + gap;\n x = align === 'start' ? anchorRect.left + alignOff : align === 'end' ? anchorRect.right - menuWidth + alignOff : anchorRect.left + anchorRect.width / 2 - menuWidth / 2 + alignOff;\n break;\n case 'left':\n x = anchorRect.left - menuWidth - gap;\n y = align === 'start' ? anchorRect.top + alignOff : align === 'end' ? anchorRect.bottom - menuHeight + alignOff : anchorRect.top + anchorRect.height / 2 - menuHeight / 2 + alignOff;\n break;\n case 'right':\n x = anchorRect.right + gap;\n y = align === 'start' ? anchorRect.top + alignOff : align === 'end' ? anchorRect.bottom - menuHeight + alignOff : anchorRect.top + anchorRect.height / 2 - menuHeight / 2 + alignOff;\n break;\n }\n const vp = 4;\n setPosition({\n x: Math.min(Math.max(x, vp), window.innerWidth - menuWidth - vp),\n y: Math.min(Math.max(y, vp), window.innerHeight - menuHeight - vp),\n });\n positionCalculatedRef.current = true;\n setIsPositionReady(true);\n };\n if (!positionCalculatedRef.current) {\n calculatePosition();\n requestAnimationFrame(() => { if (!positionCalculatedRef.current) calculatePosition(); });\n }\n const handleScrollResize = () => calculatePosition();\n window.addEventListener('scroll', handleScrollResize, true);\n window.addEventListener('resize', handleScrollResize);\n return () => {\n window.removeEventListener('scroll', handleScrollResize, true);\n window.removeEventListener('resize', handleScrollResize);\n };\n }, [isOpen, shouldRender, anchorRef, side, align, sideOffset, alignOffset, sideOffsetToken, alignOffsetToken, menuSize.width, menuSize.height, menuSections.length, matchAnchorWidthOffset]);\n\n useEffect(() => {\n if (!isOpen || !shouldRender) return;\n const handleClickOutside = (event: MouseEvent) => {\n const target = event.target as HTMLElement;\n if (menuRef.current?.contains(target)) return;\n if (anchorRef.current?.contains(target)) return;\n onClose();\n };\n document.addEventListener('mousedown', handleClickOutside, true);\n return () => document.removeEventListener('mousedown', handleClickOutside, true);\n }, [isOpen, shouldRender, onClose, anchorRef]);\n\n useEffect(() => {\n if (!isOpen) return;\n const handleEscape = (e: KeyboardEvent) => { if (e.key === 'Escape') onClose(); };\n document.addEventListener('keydown', handleEscape);\n return () => document.removeEventListener('keydown', handleEscape);\n }, [isOpen, onClose]);\n\n if (!shouldRender || sectionsToRender.length === 0) return null;\n\n const renderMenuItem = (item: MenuItemData, index: number) => {\n if (item.isDestructive) {\n return (\n <DestructiveMenuItem\n key={index}\n label={item.label}\n subtext={item.subtext}\n holdDuration={item.holdDuration ?? 4000}\n onClick={() => { item.onClick(); if (!item.keepOpenOnClick) onClose(); }}\n />\n );\n }\n return (\n <MenuItemComponent\n key={index}\n icon={item.icon}\n label={item.label}\n subtext={item.subtext}\n onClick={() => { if (!item.isInactive) { item.onClick(); if (!item.keepOpenOnClick) onClose(); } }}\n isSelected={item.isSelected}\n isInactive={item.isInactive}\n intent={item.intent}\n showToggle={item.showToggle}\n toggleValue={item.toggleValue}\n selectionStyle={item.selectionStyle}\n />\n );\n };\n\n const menuStyle: React.CSSProperties = {\n position: 'absolute',\n left: 0,\n top: 0,\n transform: `translate(${Math.round(position.x)}px, ${Math.round(position.y)}px)`,\n willChange: 'transform',\n zIndex: 9998,\n visibility: isPositionReady ? 'visible' : 'hidden',\n ...(matchAnchorWidth && anchorSize.width > 0 ? { width: `${anchorSize.width + matchAnchorWidthOffset}px` } : width ? { width } : {}),\n ...(minWidth ? { minWidth } : {}),\n ...(maxWidth ? { maxWidth } : {}),\n };\n\n const menuContent = (\n <div ref={menuRef} className={`${styles.menuContainer} ${isClosing ? styles.closing : ''}`} style={menuStyle} role=\"menu\" aria-label=\"Menu\">\n {sectionsToRender.map((section, sectionIndex) => (\n <Surface\n key={sectionIndex}\n as=\"div\"\n className={styles.menuSection}\n edge={sectionIndex < sectionsToRender.length - 1 ? 'bottom' : undefined}\n elevation=\"none\"\n >\n {section.header && (\n <div className={styles.sectionHeader}>\n <Text variant=\"text-body-small-emphasis\" as=\"span\" className={styles.sectionLabel}>{section.header}</Text>\n </div>\n )}\n {section.items.map((item, itemIndex) => renderMenuItem(item, itemIndex))}\n </Surface>\n ))}\n </div>\n );\n\n if (usePortal) return createPortal(menuContent, document.body);\n return menuContent;\n};\n\nMenu.displayName = 'Menu';\n",".tooltip {\n box-sizing: border-box;\n background-color: var(--color-background-primary);\n border-radius: var(--dimension-radius-075);\n box-shadow: var(--effect-elevation-elevated-floating);\n padding: var(--dimension-space-050);\n line-height: var(--typography-lineheight-sm);\n pointer-events: none;\n backface-visibility: hidden;\n -webkit-font-smoothing: subpixel-antialiased;\n animation: tooltipFadeIn var(--effect-motion-short-2) forwards;\n}\n\n.tooltipInner {\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: var(--dimension-space-050);\n}\n\n.keyHint {\n width: var(--dimension-size-200);\n height: var(--dimension-size-200);\n flex-shrink: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n border: var(--dimension-stroke-width-015) solid var(--color-foreground-tertiary);\n border-bottom-width: var(--dimension-stroke-width-025);\n border-radius: var(--dimension-radius-025);\n}\n\n.tooltip.closing {\n animation: tooltipFadeOut var(--effect-motion-short-3) forwards;\n}\n\n@keyframes tooltipFadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n@keyframes tooltipFadeOut {\n from { opacity: 1; }\n to { opacity: 0; }\n}\n","import React, { useState, useRef, useEffect, useLayoutEffect, useCallback } from 'react';\nimport { createPortal } from 'react-dom';\nimport { getCssTimeMs } from '@/utils/css-tokens';\nimport { Text } from '@/components/Text';\nimport styles from './Tooltip.module.css';\n\nconst HOVER_DELAY_FALLBACK_MS = 1000;\nconst INSTANT_REOPEN_MS = 300;\nconst FADE_OUT_DURATION_MS = 200;\n\nlet lastTooltipDismissedAt = 0;\n\nexport type TooltipSide = 'top' | 'right' | 'bottom' | 'left';\nexport type TooltipAlign = 'start' | 'center' | 'end';\n\nexport interface TooltipProps {\n label: string;\n children: React.ReactElement;\n delay?: number;\n side?: TooltipSide;\n align?: TooltipAlign;\n sideOffset?: number;\n alignOffset?: number;\n shortcutKey?: string;\n shortcutKeyPosition?: 'start' | 'end';\n usePortal?: boolean;\n}\n\nexport const Tooltip: React.FC<TooltipProps> = ({\n label,\n children,\n delay,\n side = 'top',\n align = 'center',\n sideOffset = 4,\n alignOffset = 0,\n shortcutKey,\n shortcutKeyPosition = 'end',\n usePortal = true,\n}) => {\n const hoverDelayMs = getCssTimeMs('--effect-animation-delay-medium-3', HOVER_DELAY_FALLBACK_MS);\n const resolvedDelay = delay ?? hoverDelayMs;\n const anchorRef = useRef<HTMLElement | null>(null);\n const tooltipRef = useRef<HTMLDivElement>(null);\n\n const setAnchorRef = useCallback(\n (el: HTMLElement | null) => {\n (anchorRef as React.MutableRefObject<HTMLElement | null>).current = el;\n const childEl = React.Children.only(children) as React.ReactElement<{ ref?: React.Ref<unknown> }>;\n const childRef = 'ref' in childEl ? childEl.ref : undefined;\n if (typeof childRef === 'function') childRef(el);\n else if (childRef && typeof childRef === 'object') (childRef as React.MutableRefObject<unknown>).current = el;\n },\n [children]\n );\n\n const [open, setOpen] = useState(false);\n const [isClosing, setIsClosing] = useState(false);\n const [shouldRender, setShouldRender] = useState(false);\n const [position, setPosition] = useState<{ x: number; y: number }>({ x: 0, y: 0 });\n const [tooltipSize, setTooltipSize] = useState<{ width: number; height: number }>({ width: 0, height: 0 });\n const delayTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const closeTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const viewportPadding = 4;\n\n const clearDelayTimer = () => {\n if (delayTimerRef.current) { clearTimeout(delayTimerRef.current); delayTimerRef.current = null; }\n };\n\n const handleOpen = () => {\n clearDelayTimer();\n const showImmediately = Date.now() - lastTooltipDismissedAt < INSTANT_REOPEN_MS;\n if (showImmediately) {\n setOpen(true); setShouldRender(true); setIsClosing(false); return;\n }\n delayTimerRef.current = setTimeout(() => {\n delayTimerRef.current = null;\n setOpen(true); setShouldRender(true); setIsClosing(false);\n }, resolvedDelay);\n };\n\n const handleClose = () => {\n clearDelayTimer();\n if (closeTimerRef.current) { clearTimeout(closeTimerRef.current); closeTimerRef.current = null; }\n if (!open && !shouldRender) return;\n lastTooltipDismissedAt = Date.now();\n setIsClosing(true);\n closeTimerRef.current = setTimeout(() => {\n closeTimerRef.current = null;\n setShouldRender(false); setOpen(false); setIsClosing(false);\n }, FADE_OUT_DURATION_MS);\n };\n\n useEffect(() => () => { clearDelayTimer(); if (closeTimerRef.current) clearTimeout(closeTimerRef.current); }, []);\n\n useLayoutEffect(() => {\n if (!shouldRender || !tooltipRef.current) return;\n const updateSize = () => {\n if (!tooltipRef.current) return;\n const rect = tooltipRef.current.getBoundingClientRect();\n const w = rect.width || tooltipRef.current.offsetWidth;\n const h = rect.height || tooltipRef.current.offsetHeight;\n if (w > 0 && h > 0) setTooltipSize({ width: w, height: h });\n };\n updateSize();\n requestAnimationFrame(updateSize);\n if (typeof ResizeObserver !== 'undefined') {\n const observer = new ResizeObserver(updateSize);\n observer.observe(tooltipRef.current);\n return () => observer.disconnect();\n }\n }, [shouldRender, label, shortcutKey, shortcutKeyPosition]);\n\n useLayoutEffect(() => {\n if (!shouldRender || !anchorRef.current || !tooltipRef.current) return;\n const calculatePosition = () => {\n if (!anchorRef.current || !tooltipRef.current) return;\n const a = anchorRef.current.getBoundingClientRect();\n const tw = tooltipRef.current.getBoundingClientRect().width || tooltipSize.width || 80;\n const th = tooltipRef.current.getBoundingClientRect().height || tooltipSize.height || 24;\n let x = 0, y = 0;\n switch (side) {\n case 'top':\n y = a.top - th - sideOffset;\n x = align === 'start' ? a.left + alignOffset : align === 'end' ? a.right - tw + alignOffset : a.left + a.width / 2 - tw / 2 + alignOffset;\n break;\n case 'bottom':\n y = a.bottom + sideOffset;\n x = align === 'start' ? a.left + alignOffset : align === 'end' ? a.right - tw + alignOffset : a.left + a.width / 2 - tw / 2 + alignOffset;\n break;\n case 'left':\n x = a.left - tw - sideOffset;\n y = align === 'start' ? a.top + alignOffset : align === 'end' ? a.bottom - th + alignOffset : a.top + a.height / 2 - th / 2 + alignOffset;\n break;\n case 'right':\n x = a.right + sideOffset;\n y = align === 'start' ? a.top + alignOffset : align === 'end' ? a.bottom - th + alignOffset : a.top + a.height / 2 - th / 2 + alignOffset;\n break;\n }\n setPosition({\n x: Math.min(Math.max(x, viewportPadding), window.innerWidth - tw - viewportPadding),\n y: Math.min(Math.max(y, viewportPadding), window.innerHeight - th - viewportPadding),\n });\n };\n calculatePosition();\n requestAnimationFrame(() => requestAnimationFrame(calculatePosition));\n }, [shouldRender, side, align, sideOffset, alignOffset, tooltipSize.width, tooltipSize.height, label]);\n\n useEffect(() => {\n if (!shouldRender) return;\n const onScrollResize = () => {\n if (!anchorRef.current || !tooltipRef.current) return;\n const a = anchorRef.current.getBoundingClientRect();\n const tw = tooltipSize.width || 80;\n const th = tooltipSize.height || 24;\n let x = 0, y = 0;\n switch (side) {\n case 'top': y = a.top - th - sideOffset; x = align === 'start' ? a.left + alignOffset : align === 'end' ? a.right - tw + alignOffset : a.left + a.width / 2 - tw / 2 + alignOffset; break;\n case 'bottom': y = a.bottom + sideOffset; x = align === 'start' ? a.left + alignOffset : align === 'end' ? a.right - tw + alignOffset : a.left + a.width / 2 - tw / 2 + alignOffset; break;\n case 'left': x = a.left - tw - sideOffset; y = align === 'start' ? a.top + alignOffset : align === 'end' ? a.bottom - th + alignOffset : a.top + a.height / 2 - th / 2 + alignOffset; break;\n case 'right': x = a.right + sideOffset; y = align === 'start' ? a.top + alignOffset : align === 'end' ? a.bottom - th + alignOffset : a.top + a.height / 2 - th / 2 + alignOffset; break;\n }\n setPosition({\n x: Math.min(Math.max(x, viewportPadding), window.innerWidth - tw - viewportPadding),\n y: Math.min(Math.max(y, viewportPadding), window.innerHeight - th - viewportPadding),\n });\n };\n window.addEventListener('scroll', onScrollResize, true);\n window.addEventListener('resize', onScrollResize);\n return () => { window.removeEventListener('scroll', onScrollResize, true); window.removeEventListener('resize', onScrollResize); };\n }, [shouldRender, side, align, sideOffset, alignOffset, tooltipSize.width, tooltipSize.height]);\n\n const keyHint = shortcutKey ? (\n <div className={styles.keyHint} aria-hidden>\n <Text variant=\"text-caption-emphasis\" as=\"span\" color=\"primary\">{shortcutKey}</Text>\n </div>\n ) : null;\n\n const tooltipContent = shouldRender ? (\n <div\n ref={tooltipRef}\n className={`${styles.tooltip} ${isClosing ? styles.closing : ''}`}\n style={{\n position: 'fixed',\n left: 0,\n top: 0,\n transform: `translate(${Math.round(position.x)}px, ${Math.round(position.y)}px)`,\n willChange: 'transform',\n zIndex: 10000,\n }}\n role=\"tooltip\"\n >\n <div className={styles.tooltipInner}>\n {shortcutKey && shortcutKeyPosition === 'start' && keyHint}\n <Text variant=\"text-body-small\" as=\"span\" color=\"primary\">{label}</Text>\n {shortcutKey && shortcutKeyPosition === 'end' && keyHint}\n </div>\n </div>\n ) : null;\n\n const trigger = React.Children.only(children);\n const triggerWithRefAndHandlers = React.isValidElement(trigger)\n ? React.cloneElement(trigger as React.ReactElement<any>, {\n ref: setAnchorRef,\n onMouseEnter: (e: React.MouseEvent) => {\n handleOpen();\n (trigger as any).props.onMouseEnter?.(e);\n },\n onMouseLeave: (e: React.MouseEvent) => {\n handleClose();\n (trigger as any).props.onMouseLeave?.(e);\n },\n })\n : children;\n\n return (\n <>\n {triggerWithRefAndHandlers}\n {usePortal ? createPortal(tooltipContent, document.body) : tooltipContent}\n </>\n );\n};\n\nTooltip.displayName = 'Tooltip';\n",".selectWrapper {\n width: 100%;\n position: relative;\n}\n\n.selectButton {\n display: flex;\n align-items: center;\n justify-content: space-between;\n width: 100%;\n height: var(--dimension-size-400);\n padding: 0 var(--dimension-space-075);\n gap: var(--dimension-space-050);\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n border: none;\n outline: none;\n}\n\n.selectButton:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.chevron {\n display: flex;\n align-items: center;\n color: var(--color-foreground-secondary);\n flex-shrink: 0;\n}\n","import React, { forwardRef, useState, useRef } from 'react';\nimport { Surface } from '@/components/Surface';\nimport { Text } from '@/components/Text';\nimport { Menu } from '@/components/Menu';\nimport type { MenuItemData } from '@/components/Menu';\nimport type { IconComponent } from '@/types';\nimport styles from './Select.module.css';\n\nexport interface SelectOption {\n label: string;\n value: string | number;\n}\n\nexport interface SelectProps {\n value: string | number;\n onChange: (value: string | number) => void;\n options: SelectOption[];\n placeholder?: string;\n className?: string;\n inactive?: boolean;\n id?: string;\n chevronIcon?: IconComponent;\n}\n\nexport const Select = forwardRef<HTMLDivElement, SelectProps>(\n ({ value, onChange, options, placeholder = 'Select option', className, inactive = false, id, chevronIcon: ChevronIcon }, ref) => {\n const [isMenuOpen, setIsMenuOpen] = useState(false);\n const buttonRef = useRef<HTMLButtonElement>(null);\n\n const selectedOption = options.find(opt => opt.value === value);\n const selectedLabel = selectedOption?.label || placeholder;\n\n const menuItems: MenuItemData[] = options.map(option => ({\n label: option.label,\n onClick: () => {\n onChange(option.value);\n setIsMenuOpen(false);\n },\n isSelected: option.value === value,\n }));\n\n const handleToggle = () => {\n if (!inactive) setIsMenuOpen(prev => !prev);\n };\n\n return (\n <div ref={ref} className={`${styles.selectWrapper} ${className || ''}`}>\n <Surface\n id={id}\n ref={buttonRef as React.RefObject<HTMLElement>}\n as=\"button\"\n type=\"button\"\n elevation=\"elevated\"\n radius=\"sm\"\n interactive\n selected={isMenuOpen}\n className={styles.selectButton}\n onClick={handleToggle}\n inactive={inactive}\n >\n <Text\n variant=\"text-body-medium\"\n as=\"span\"\n \n color={selectedOption ? 'primary' : 'secondary'}\n >\n {selectedLabel}\n </Text>\n {ChevronIcon && (\n <span className={styles.chevron}>\n <ChevronIcon size={16} />\n </span>\n )}\n </Surface>\n <Menu\n isOpen={isMenuOpen}\n onClose={() => setIsMenuOpen(false)}\n anchorRef={buttonRef as React.RefObject<HTMLElement | null>}\n items={menuItems}\n side=\"bottom\"\n align=\"start\"\n sideOffset={4}\n alignOffset={-4}\n matchAnchorWidth\n matchAnchorWidthOffset={8}\n />\n </div>\n );\n }\n);\n\nSelect.displayName = 'Select';\n",".bannerWrapper {}\n\n.banner {\n position: relative;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n.bannerHeaderSurface {\n width: 100%;\n height: var(--dimension-space-100);\n flex-shrink: 0;\n overflow: hidden;\n border-bottom: var(--dimension-stroke-width-015) solid var(--color-border-primary);\n}\n\n.bannerHeader {\n width: 100%;\n height: 100%;\n background: repeating-linear-gradient(\n -45deg,\n var(--banner-content),\n var(--banner-content) var(--dimension-size-100),\n transparent var(--dimension-size-100),\n transparent var(--dimension-size-200)\n );\n}\n\n.bannerBody {\n padding: var(--dimension-space-075);\n min-height: var(--dimension-size-400);\n}\n\n.message {\n color: var(--banner-content);\n line-height: var(--typography-lineheight-md);\n display: block;\n}\n\n.floatingPosition {\n position: fixed;\n top: var(--dimension-space-200);\n left: 50%;\n transform: translateX(-50%);\n pointer-events: none;\n}\n\n.floatingToast {\n backface-visibility: hidden;\n -webkit-font-smoothing: subpixel-antialiased;\n animation: toastFadeIn var(--effect-motion-short-2) forwards;\n}\n\n.floatingToast.closing {\n animation: toastFadeOut var(--effect-motion-short-3) forwards;\n}\n\n@keyframes toastFadeIn {\n from { opacity: 0; transform: translateY(-8px); }\n to { opacity: 1; transform: translateY(0); }\n}\n\n@keyframes toastFadeOut {\n from { opacity: 1; transform: translateY(0); }\n to { opacity: 0; transform: translateY(-4px); }\n}\n","import React, { useState, useEffect, useCallback, useRef } from 'react';\nimport { createPortal } from 'react-dom';\nimport { Surface } from '@/components/Surface';\nimport { Text } from '@/components/Text';\nimport { getCssTimeMs } from '@/utils/css-tokens';\nimport styles from './Banner.module.css';\n\nconst TOAST_DURATION_FALLBACK_MS = 4000;\nconst FADE_OUT_DURATION_MS = 200;\n\nexport type BannerIntent =\n | 'brand' | 'positive' | 'negative' | 'warning' | 'caution'\n | 'ai' | 'neutral' | 'walkthrough' | 'guide';\n\nexport type BannerContrast = 'faint' | 'medium' | 'bold' | 'strong';\n\nexport interface BannerProps {\n intent: BannerIntent;\n contrast: BannerContrast;\n message: string;\n header?: boolean;\n className?: string;\n floating?: boolean;\n onDismiss?: () => void;\n}\n\nconst getContentColorVar = (intent: BannerIntent, contrast: BannerContrast): string => {\n if (contrast === 'bold') return 'var(--color-foreground-on-bold-background-primary)';\n const contentContrast = contrast === 'faint' ? 'bold' : contrast === 'medium' ? 'strong' : 'medium';\n return `var(--color-foreground-${contentContrast}-${intent})`;\n};\n\nexport const Banner: React.FC<BannerProps> = ({\n intent,\n contrast,\n message,\n header = false,\n className = '',\n floating = false,\n onDismiss,\n}) => {\n const toastDurationMs = getCssTimeMs('--effect-animation-delay-long-2', TOAST_DURATION_FALLBACK_MS);\n const messageColor = getContentColorVar(intent, contrast);\n const [isClosing, setIsClosing] = useState(false);\n const dismissTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const closeTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const scheduleDismiss = useCallback(() => {\n if (dismissTimerRef.current) clearTimeout(dismissTimerRef.current);\n if (closeTimerRef.current) clearTimeout(closeTimerRef.current);\n dismissTimerRef.current = setTimeout(() => {\n dismissTimerRef.current = null;\n setIsClosing(true);\n closeTimerRef.current = setTimeout(() => {\n closeTimerRef.current = null;\n onDismiss?.();\n }, FADE_OUT_DURATION_MS);\n }, toastDurationMs);\n }, [onDismiss, toastDurationMs]);\n\n useEffect(() => {\n if (floating && message) scheduleDismiss();\n return () => {\n if (dismissTimerRef.current) clearTimeout(dismissTimerRef.current);\n if (closeTimerRef.current) clearTimeout(closeTimerRef.current);\n };\n }, [floating, message, scheduleDismiss]);\n\n const content = (\n <div\n className={`${styles.bannerWrapper} ${className}`.trim()}\n style={{ '--banner-content': messageColor } as React.CSSProperties}\n >\n <Surface\n elevation={floating ? 'floating' : 'elevated'}\n intent={intent}\n contrast={contrast}\n radius=\"sm\"\n className={styles.banner}\n >\n {header && (\n <div className={styles.bannerHeaderSurface}>\n <div className={styles.bannerHeader} aria-hidden />\n </div>\n )}\n <div className={styles.bannerBody}>\n <Text variant=\"text-body-medium\" as=\"span\" className={styles.message}>\n {message}\n </Text>\n </div>\n </Surface>\n </div>\n );\n\n if (floating) {\n return createPortal(\n <div className={styles.floatingPosition} style={{ zIndex: 9998 }}>\n <div className={`${styles.floatingToast} ${isClosing ? styles.closing : ''}`}>\n {content}\n </div>\n </div>,\n document.body\n );\n }\n\n return content;\n};\n\nBanner.displayName = 'Banner';\n",".tableWrapper {\n display: flex;\n flex-direction: column;\n width: 100%;\n overflow: hidden;\n border-radius: var(--dimension-radius-075);\n}\n\n.tableScroll {\n overflow-x: auto;\n width: 100%;\n}\n\n.table {\n display: grid;\n width: 100%;\n min-width: max-content;\n}\n\n.headerRow {\n display: contents;\n}\n\n.headerCell {\n display: flex;\n align-items: center;\n gap: var(--dimension-space-050);\n padding: var(--dimension-space-075) var(--dimension-space-100);\n background-color: var(--color-background-secondary);\n border-bottom: var(--dimension-stroke-width-015) solid var(--color-border-primary);\n -webkit-user-select: none;\n user-select: none;\n position: sticky;\n top: 0;\n z-index: 2;\n}\n\n.headerCell.sortable {\n cursor: pointer;\n}\n\n.headerCell.sortable:hover {\n background-color: var(--color-background-translucent);\n}\n\n.sortIndicator {\n font-size: 12px;\n color: var(--color-foreground-secondary);\n}\n\n.row {\n display: contents;\n}\n\n.row:hover .cell {\n background-color: var(--color-interaction-hover);\n}\n\n.rowSelected .cell {\n background-color: var(--color-background-faint-brand);\n}\n\n.rowClickable {\n cursor: pointer;\n}\n\n.cell {\n display: flex;\n align-items: center;\n padding: var(--dimension-space-075) var(--dimension-space-100);\n border-bottom: var(--dimension-stroke-width-015) solid var(--color-border-primary);\n min-height: var(--dimension-size-500);\n background-color: var(--color-background-primary);\n transition: background-color var(--effect-motion-short-2);\n}\n\n.alignRight { justify-content: flex-end; text-align: right; }\n.alignCenter { justify-content: center; text-align: center; }\n\n.emptyRow {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: var(--dimension-space-400);\n background-color: var(--color-background-primary);\n}\n\n.skeleton {\n height: 14px;\n width: 60%;\n background-color: var(--color-background-translucent);\n border-radius: var(--dimension-radius-050);\n animation: shimmer 1.5s infinite;\n}\n\n@keyframes shimmer {\n 0% { opacity: 0.5; }\n 50% { opacity: 1; }\n 100% { opacity: 0.5; }\n}\n\n.pagination {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: var(--dimension-space-100);\n padding: var(--dimension-space-100);\n border-top: var(--dimension-stroke-width-015) solid var(--color-border-primary);\n background-color: var(--color-background-primary);\n}\n\n.pageButton {\n display: flex;\n align-items: center;\n padding: var(--dimension-space-050) var(--dimension-space-100);\n background-color: transparent;\n border: none;\n border-radius: var(--dimension-radius-075);\n cursor: pointer;\n transition: background-color var(--effect-motion-short-2);\n}\n\n.pageButton:hover:not(:disabled) {\n background-color: var(--color-interaction-hover);\n}\n\n.pageButton:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n}\n","import React, { useMemo, useState, useCallback } from 'react';\nimport { cn } from '@/utils/cn';\nimport { Text } from '@/components/Text';\nimport styles from './Table.module.css';\n\nexport type SortDirection = 'asc' | 'desc';\nexport type CellType = 'string' | 'numbers' | 'tag' | 'checkbox' | 'button' | 'spacer' | 'image' | 'icon' | 'empty';\nexport type FilterValue = string | number | Array<string | number> | undefined;\nexport type FilterState = Record<string, FilterValue>;\n\nexport interface SortState {\n columnId: string;\n direction: SortDirection;\n}\n\nexport interface PaginationState {\n pageIndex: number;\n pageSize: number;\n}\n\nexport interface TableColumn<T = unknown> {\n id: string;\n header: string | React.ReactNode;\n accessorKey?: string;\n accessor?: (row: T) => unknown;\n sortable?: boolean;\n align?: 'left' | 'right' | 'center';\n width?: string | number;\n minWidth?: string | number;\n maxWidth?: string | number;\n renderCell?: (row: T, rowIndex: number) => React.ReactNode;\n cellType?: CellType;\n hide?: boolean;\n pinned?: 'left' | 'right';\n}\n\nexport interface TableProps<T = unknown> {\n columns: TableColumn<T>[];\n data: T[];\n sortState?: SortState;\n onSort?: (columnId: string) => void;\n className?: string;\n onRowClick?: (row: T, rowIndex: number) => void;\n selectedRows?: Set<number>;\n loading?: boolean;\n pagination?: PaginationState;\n onPaginationChange?: (pageIndex: number, pageSize: number) => void;\n emptyMessage?: string;\n}\n\nfunction getColumnValue<T>(column: TableColumn<T>, row: T): unknown {\n if (column.accessorKey) return (row as Record<string, unknown>)[column.accessorKey];\n if (column.accessor) return column.accessor(row);\n return undefined;\n}\n\nfunction compareValues(a: unknown, b: unknown, direction: SortDirection): number {\n const mult = direction === 'asc' ? 1 : -1;\n if (a == null && b == null) return 0;\n if (a == null) return mult;\n if (b == null) return -mult;\n if (typeof a === 'number' && typeof b === 'number') return (a - b) * mult;\n return String(a).localeCompare(String(b)) * mult;\n}\n\nexport function Table<T>({\n columns,\n data,\n sortState,\n onSort,\n className,\n onRowClick,\n selectedRows,\n loading = false,\n pagination,\n onPaginationChange,\n emptyMessage = 'No results found.',\n}: TableProps<T>) {\n const visibleColumns = useMemo(() => columns.filter(c => !c.hide), [columns]);\n\n const gridTemplateColumns = useMemo(() =>\n visibleColumns.map(col => {\n if (col.width) return typeof col.width === 'number' ? `${col.width}px` : col.width;\n return 'minmax(120px, 1fr)';\n }).join(' '),\n [visibleColumns]\n );\n\n const sortedData = useMemo(() => {\n if (!sortState) return data;\n const col = columns.find(c => c.id === sortState.columnId);\n if (!col) return data;\n return [...data].sort((a, b) =>\n compareValues(getColumnValue(col, a), getColumnValue(col, b), sortState.direction)\n );\n }, [data, columns, sortState]);\n\n const pagedData = useMemo(() => {\n if (!pagination) return sortedData;\n const start = pagination.pageIndex * pagination.pageSize;\n return sortedData.slice(start, start + pagination.pageSize);\n }, [sortedData, pagination]);\n\n const totalPages = pagination ? Math.ceil(sortedData.length / pagination.pageSize) : 1;\n const isEmpty = !loading && pagedData.length === 0;\n\n const handleSort = (columnId: string) => {\n if (onSort) onSort(columnId);\n };\n\n return (\n <div className={cn(styles.tableWrapper, className)}>\n <div className={styles.tableScroll}>\n <div className={styles.table} style={{ gridTemplateColumns }} role=\"table\">\n {/* Header */}\n <div className={styles.headerRow} role=\"row\">\n {visibleColumns.map(col => (\n <div\n key={col.id}\n className={cn(\n styles.headerCell,\n col.sortable && styles.sortable,\n col.align === 'right' && styles.alignRight,\n col.align === 'center' && styles.alignCenter\n )}\n role=\"columnheader\"\n onClick={() => col.sortable && handleSort(col.id)}\n style={col.minWidth ? { minWidth: typeof col.minWidth === 'number' ? `${col.minWidth}px` : col.minWidth } : undefined}\n >\n {typeof col.header === 'string' ? (\n <Text variant=\"text-body-small-emphasis\" as=\"span\" color=\"secondary\">\n {col.header}\n </Text>\n ) : col.header}\n {sortState?.columnId === col.id && (\n <span className={styles.sortIndicator} aria-hidden>\n {sortState.direction === 'asc' ? '\\u2191' : '\\u2193'}\n </span>\n )}\n </div>\n ))}\n </div>\n\n {/* Loading skeleton */}\n {loading && Array.from({ length: 5 }).map((_, i) => (\n <div key={`skeleton-${i}`} className={styles.row} role=\"row\">\n {visibleColumns.map(col => (\n <div key={col.id} className={styles.cell} role=\"cell\">\n <div className={styles.skeleton} />\n </div>\n ))}\n </div>\n ))}\n\n {/* Empty state */}\n {isEmpty && (\n <div className={styles.emptyRow} style={{ gridColumn: `1 / -1` }}>\n <Text variant=\"text-body-medium\" as=\"p\" color=\"secondary\">{emptyMessage}</Text>\n </div>\n )}\n\n {/* Data rows */}\n {!loading && pagedData.map((row, rowIndex) => {\n const isSelected = selectedRows?.has(rowIndex);\n return (\n <div\n key={rowIndex}\n className={cn(\n styles.row,\n isSelected && styles.rowSelected,\n onRowClick && styles.rowClickable\n )}\n role=\"row\"\n onClick={() => onRowClick?.(row, rowIndex)}\n >\n {visibleColumns.map(col => (\n <div\n key={col.id}\n className={cn(\n styles.cell,\n col.align === 'right' && styles.alignRight,\n col.align === 'center' && styles.alignCenter\n )}\n role=\"cell\"\n >\n {col.renderCell\n ? col.renderCell(row, rowIndex)\n : <Text variant=\"text-body-medium\" as=\"span\" lineTruncation={1}>{String(getColumnValue(col, row) ?? '')}</Text>\n }\n </div>\n ))}\n </div>\n );\n })}\n </div>\n </div>\n\n {/* Pagination */}\n {pagination && onPaginationChange && totalPages > 1 && (\n <div className={styles.pagination}>\n <button\n className={styles.pageButton}\n disabled={pagination.pageIndex === 0}\n onClick={() => onPaginationChange(pagination.pageIndex - 1, pagination.pageSize)}\n type=\"button\"\n >\n <Text variant=\"text-body-small\" as=\"span\">Previous</Text>\n </button>\n <Text variant=\"text-body-small\" as=\"span\" color=\"secondary\">\n {`Page ${pagination.pageIndex + 1} of ${totalPages}`}\n </Text>\n <button\n className={styles.pageButton}\n disabled={pagination.pageIndex >= totalPages - 1}\n onClick={() => onPaginationChange(pagination.pageIndex + 1, pagination.pageSize)}\n type=\"button\"\n >\n <Text variant=\"text-body-small\" as=\"span\">Next</Text>\n </button>\n </div>\n )}\n </div>\n );\n}\n\nTable.displayName = 'Table';\n","/* ==========================================================================\n Tab — hover/pressed via direct background-color, no pseudo-element overlay.\n ========================================================================== */\n\n.tab {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: var(--dimension-space-075);\n background-color: transparent;\n border: none;\n border-radius: var(--dimension-radius-075);\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n color: var(--color-foreground-secondary);\n position: relative;\n will-change: color;\n transition: color var(--effect-motion-short-2),\n background-color var(--effect-motion-short-2);\n flex-shrink: 0;\n height: var(--dimension-size-400);\n box-sizing: border-box;\n\n /* Interaction — ghost defaults */\n --_hover-bg: var(--color-interaction-hover);\n --_pressed-bg: var(--color-interaction-pressed);\n}\n\n.tab:hover { background-color: var(--_hover-bg); }\n.tab:active { background-color: var(--_pressed-bg); }\n\n.tabSelected { color: var(--color-foreground-primary); }\n\n/* ==========================================================================\n Background context — parent surface awareness\n ========================================================================== */\n\n.onMedium {\n --_hover-bg: var(--color-interaction-on-medium-background-hover);\n --_pressed-bg: var(--color-interaction-on-medium-background-pressed);\n}\n\n.onBold {\n --_hover-bg: var(--color-interaction-on-bold-background-hover);\n --_pressed-bg: var(--color-interaction-on-bold-background-pressed);\n color: var(--color-foreground-on-bold-background-secondary);\n}\n\n.onBold.tabSelected { color: var(--color-foreground-on-bold-background-primary); }\n\n.onStrong {\n --_hover-bg: var(--color-interaction-on-strong-background-hover);\n --_pressed-bg: var(--color-interaction-on-strong-background-pressed);\n color: var(--color-foreground-on-bold-background-secondary);\n}\n\n.onStrong.tabSelected { color: var(--color-foreground-on-bold-background-primary); }\n\n.onAlwaysDark {\n --_hover-bg: var(--color-always-dark-interaction-hover);\n --_pressed-bg: var(--color-always-dark-interaction-pressed);\n color: var(--color-always-dark-foreground-secondary);\n}\n\n.onAlwaysDark.tabSelected { color: var(--color-always-dark-foreground-primary); }\n","import React, { forwardRef } from 'react';\nimport { cn } from '@/utils/cn';\nimport { Text } from '@/components/Text';\nimport styles from './Tab.module.css';\n\nexport type TabBackground = 'faint' | 'medium' | 'bold' | 'strong' | 'always-dark';\n\nexport interface TabProps {\n id?: string;\n label: string;\n isSelected?: boolean;\n /** Parent surface context. Adjusts hover tokens and fg for tabs on colored backgrounds. */\n background?: TabBackground;\n onClick?: () => void;\n className?: string;\n}\n\nexport const Tab = forwardRef<HTMLButtonElement, TabProps>(\n ({ id, label, isSelected = false, background, onClick, className }, ref) => {\n const bgClass = background && background !== 'faint'\n ? styles[background === 'always-dark' ? 'onAlwaysDark' : `on${background.charAt(0).toUpperCase() + background.slice(1)}`]\n : undefined;\n return (\n <button\n ref={ref}\n id={id}\n className={cn(styles.tab, isSelected && styles.tabSelected, bgClass, className)}\n onClick={onClick}\n type=\"button\"\n aria-selected={isSelected}\n role=\"tab\"\n >\n <Text variant={isSelected ? 'text-body-medium-emphasis' : 'text-body-medium'} as=\"span\">\n {label}\n </Text>\n </button>\n );\n }\n);\n\nTab.displayName = 'Tab';\n",".emptyState {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n min-height: 400px;\n width: 100%;\n}\n","import React, { forwardRef } from 'react';\nimport { cn } from '@/utils/cn';\nimport { Text } from '@/components/Text';\nimport styles from './EmptyState.module.css';\n\nexport type EmptyStateType = 'no-content' | 'no-results' | 'no-results-filter' | 'no-access';\n\nconst defaultMessages: Record<EmptyStateType, string> = {\n 'no-content': 'No page contents to display.',\n 'no-results': 'No results found.',\n 'no-results-filter': 'No results found. Please update search criteria.',\n 'no-access': \"You don't have access to this page.\",\n};\n\nexport interface EmptyStateProps {\n type?: EmptyStateType;\n message?: string;\n className?: string;\n}\n\nexport const EmptyState = forwardRef<HTMLDivElement, EmptyStateProps>(\n ({ type = 'no-content', message, className }, ref) => (\n <div ref={ref} className={cn(styles.emptyState, className)}>\n <Text variant=\"text-body-medium\" as=\"p\" color=\"secondary\">\n {message || defaultMessages[type]}\n </Text>\n </div>\n )\n);\n\nEmptyState.displayName = 'EmptyState';\n",".fade {\n position: absolute;\n pointer-events: none;\n z-index: 10;\n transform: translateZ(0);\n backface-visibility: hidden;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .fade { transition: none; }\n}\n\n.fadeTop {\n top: 0; left: 0; right: 0;\n background: linear-gradient(to bottom, var(--background) 0%, var(--background) 50%, transparent 100%);\n}\n\n.fadeBottom {\n bottom: 0; left: 0; right: 0;\n background: linear-gradient(to top, var(--background) 0%, transparent 100%);\n}\n\n.fadeLeft {\n top: 0; bottom: 0; left: 0;\n background: linear-gradient(to right, var(--background) 0%, transparent 100%);\n}\n\n.fadeRight {\n top: 0; bottom: 0; right: 0;\n background: linear-gradient(to left, var(--background) 0%, transparent 100%);\n}\n","import React, { forwardRef } from 'react';\nimport { cn } from '@/utils/cn';\nimport styles from './Fade.module.css';\n\nexport type FadeSide = 'top' | 'bottom' | 'left' | 'right';\n\nexport interface FadeProps {\n side: FadeSide;\n height: string;\n background?: string;\n className?: string;\n style?: React.CSSProperties;\n}\n\nconst sideClassMap: Record<FadeSide, string> = {\n top: 'fadeTop',\n bottom: 'fadeBottom',\n left: 'fadeLeft',\n right: 'fadeRight',\n};\n\nexport const Fade = forwardRef<HTMLDivElement, FadeProps>(\n ({ side, height, background = 'var(--color-background-secondary)', className, style = {} }, ref) => (\n <div\n ref={ref}\n className={cn(styles.fade, styles[sideClassMap[side]], className)}\n style={{ ...style, height, '--background': background } as React.CSSProperties}\n aria-hidden=\"true\"\n />\n )\n);\n\nFade.displayName = 'Fade';\n",".container {\n position: relative;\n width: 100%;\n height: 100%;\n overflow: hidden;\n}\n\n.content {\n width: 100%;\n height: 100%;\n min-height: 0;\n overflow-y: auto;\n overflow-x: auto;\n scrollbar-width: none;\n -ms-overflow-style: none;\n}\n\n.content::-webkit-scrollbar { display: none; }\n\n.track {\n position: absolute;\n top: 0; right: 0; bottom: 0;\n width: var(--dimension-size-050, 4px);\n pointer-events: none;\n z-index: 10;\n opacity: 0;\n transition: opacity var(--effect-motion-short-2);\n}\n\n.container[data-show-track='true'] .track {\n opacity: 1;\n pointer-events: auto;\n}\n\n.thumb {\n position: absolute;\n right: 0;\n width: var(--dimension-size-050, 4px);\n cursor: grab;\n border-radius: 0;\n background-color: var(--color-foreground-quaternary);\n transition: background-color var(--effect-motion-short-2);\n -webkit-user-select: none;\n user-select: none;\n}\n\n.thumb:active { cursor: grabbing; }\n\n.trackHorizontal {\n position: absolute;\n left: 0; right: 0; bottom: 0;\n height: var(--dimension-size-050, 4px);\n pointer-events: none;\n z-index: 10;\n opacity: 0;\n transition: opacity var(--effect-motion-short-2);\n}\n\n.container[data-show-track='true'] .trackHorizontal {\n opacity: 1;\n pointer-events: auto;\n}\n\n.thumbHorizontal {\n position: absolute;\n bottom: 0;\n height: var(--dimension-size-050, 4px);\n cursor: grab;\n border-radius: 0;\n background-color: var(--color-foreground-quaternary);\n transition: background-color var(--effect-motion-short-2);\n -webkit-user-select: none;\n user-select: none;\n}\n\n.thumbHorizontal:active { cursor: grabbing; }\n\n.thick .track { width: var(--dimension-size-100, 8px); }\n.thick .thumb { width: var(--dimension-size-100, 8px); }\n.thick .trackHorizontal { height: var(--dimension-size-100, 8px); }\n.thick .thumbHorizontal { height: var(--dimension-size-100, 8px); }\n","import React, { useRef, useEffect, useState, useCallback } from 'react';\nimport { cn } from '@/utils/cn';\nimport styles from './Scrollbar.module.css';\n\nexport type ScrollbarVariant = 'default' | 'thick';\n\nexport interface ScrollbarProps {\n children: React.ReactNode;\n className?: string;\n variant?: ScrollbarVariant;\n showTrackOnHover?: boolean;\n onScroll?: (e: React.UIEvent<HTMLDivElement>) => void;\n fadeOverlay?: React.ReactNode;\n contentRef?: React.RefObject<HTMLDivElement>;\n}\n\nexport const Scrollbar: React.FC<ScrollbarProps> = ({\n children,\n className,\n variant = 'default',\n showTrackOnHover = true,\n onScroll,\n fadeOverlay,\n contentRef: externalContentRef,\n}) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const internalContentRef = useRef<HTMLDivElement>(null);\n const contentRef = externalContentRef || internalContentRef;\n const thumbRef = useRef<HTMLDivElement>(null);\n const thumbHRef = useRef<HTMLDivElement>(null);\n const [thumbHeight, setThumbHeight] = useState(0);\n const [thumbTop, setThumbTop] = useState(0);\n const [thumbWidth, setThumbWidth] = useState(0);\n const [thumbLeft, setThumbLeft] = useState(0);\n const [isDragging, setIsDragging] = useState(false);\n const [isDraggingH, setIsDraggingH] = useState(false);\n const [isPointerInside, setIsPointerInside] = useState(false);\n const dragStartY = useRef(0);\n const dragStartScrollTop = useRef(0);\n const dragStartX = useRef(0);\n const dragStartScrollLeft = useRef(0);\n\n const handleMouseEnter = useCallback(() => {\n if (showTrackOnHover) setIsPointerInside(true);\n }, [showTrackOnHover]);\n\n const handleMouseLeave = useCallback(() => {\n setIsPointerInside(false);\n }, []);\n\n const updateThumb = useCallback(() => {\n const container = containerRef.current;\n const content = contentRef.current;\n if (!container || !content) return;\n\n const containerHeight = container.clientHeight;\n const containerWidth = container.clientWidth;\n const contentHeight = content.scrollHeight;\n const contentWidth = content.scrollWidth;\n const scrollTop = content.scrollTop;\n const scrollLeft = content.scrollLeft;\n\n if (contentHeight <= containerHeight) {\n setThumbHeight(0);\n } else {\n const ratio = containerHeight / contentHeight;\n const h = Math.max(20, containerHeight * ratio);\n setThumbHeight(h);\n setThumbTop((scrollTop / (contentHeight - containerHeight)) * (containerHeight - h));\n }\n\n if (contentWidth <= containerWidth) {\n setThumbWidth(0);\n } else {\n const ratio = containerWidth / contentWidth;\n const w = Math.max(20, containerWidth * ratio);\n setThumbWidth(w);\n setThumbLeft((scrollLeft / (contentWidth - containerWidth)) * (containerWidth - w));\n }\n }, [contentRef]);\n\n useEffect(() => {\n const content = contentRef.current;\n if (!content) return;\n const handleScroll = (e: Event) => {\n updateThumb();\n if (onScroll) onScroll(e as unknown as React.UIEvent<HTMLDivElement>);\n };\n content.addEventListener('scroll', handleScroll);\n return () => content.removeEventListener('scroll', handleScroll);\n }, [updateThumb, onScroll, contentRef]);\n\n useEffect(() => {\n const content = contentRef.current;\n if (!content) return;\n const handleResize = () => updateThumb();\n window.addEventListener('resize', handleResize);\n if (typeof ResizeObserver !== 'undefined') {\n const observer = new ResizeObserver(handleResize);\n observer.observe(content);\n return () => { window.removeEventListener('resize', handleResize); observer.disconnect(); };\n }\n return () => window.removeEventListener('resize', handleResize);\n }, [updateThumb, contentRef]);\n\n useEffect(() => { updateThumb(); }, [updateThumb, children]);\n\n const handleThumbMouseDown = useCallback((e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n const content = contentRef.current;\n if (!content) return;\n setIsDragging(true);\n dragStartY.current = e.clientY;\n dragStartScrollTop.current = content.scrollTop;\n const handleMouseMove = (e: MouseEvent) => {\n const container = containerRef.current;\n if (!container || !content) return;\n const deltaY = e.clientY - dragStartY.current;\n const scrollableHeight = content.scrollHeight - container.clientHeight;\n const scrollRatio = scrollableHeight / (container.clientHeight - thumbHeight);\n content.scrollTop = Math.max(0, Math.min(scrollableHeight, dragStartScrollTop.current + deltaY * scrollRatio));\n };\n const handleMouseUp = () => {\n setIsDragging(false);\n document.removeEventListener('mousemove', handleMouseMove);\n document.removeEventListener('mouseup', handleMouseUp);\n };\n document.addEventListener('mousemove', handleMouseMove);\n document.addEventListener('mouseup', handleMouseUp);\n }, [thumbHeight, contentRef]);\n\n const handleThumbHMouseDown = useCallback((e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n const content = contentRef.current;\n if (!content) return;\n setIsDraggingH(true);\n dragStartX.current = e.clientX;\n dragStartScrollLeft.current = content.scrollLeft;\n const handleMouseMove = (e: MouseEvent) => {\n const container = containerRef.current;\n if (!container || !content) return;\n const deltaX = e.clientX - dragStartX.current;\n const scrollableWidth = content.scrollWidth - container.clientWidth;\n const scrollRatio = scrollableWidth / (container.clientWidth - thumbWidth);\n content.scrollLeft = Math.max(0, Math.min(scrollableWidth, dragStartScrollLeft.current + deltaX * scrollRatio));\n };\n const handleMouseUp = () => {\n setIsDraggingH(false);\n document.removeEventListener('mousemove', handleMouseMove);\n document.removeEventListener('mouseup', handleMouseUp);\n };\n document.addEventListener('mousemove', handleMouseMove);\n document.addEventListener('mouseup', handleMouseUp);\n }, [thumbWidth, contentRef]);\n\n const showThumb = thumbHeight > 0;\n const showThumbH = thumbWidth > 0;\n const showTrack = showTrackOnHover && (isPointerInside || isDragging || isDraggingH);\n\n return (\n <div\n ref={containerRef}\n className={cn(styles.container, variant === 'thick' && styles.thick, className)}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n data-dragging={isDragging || isDraggingH}\n data-show-track={showTrack ? 'true' : 'false'}\n >\n <div ref={contentRef} className={styles.content}>{children}</div>\n {fadeOverlay}\n {showThumb && (\n <div className={styles.track}>\n <div ref={thumbRef} className={styles.thumb} style={{ height: `${thumbHeight}px`, top: `${thumbTop}px` }} onMouseDown={handleThumbMouseDown} />\n </div>\n )}\n {showThumbH && (\n <div className={styles.trackHorizontal}>\n <div ref={thumbHRef} className={styles.thumbHorizontal} style={{ width: `${thumbWidth}px`, left: `${thumbLeft}px` }} onMouseDown={handleThumbHMouseDown} />\n </div>\n )}\n </div>\n );\n};\n\nScrollbar.displayName = 'Scrollbar';\n",".errorBoundary {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n min-height: 400px;\n padding: var(--dimension-space-400);\n gap: var(--dimension-space-200);\n}\n\n.errorDetails {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--dimension-space-200);\n max-width: 600px;\n text-align: center;\n}\n","import React, { Component, ReactNode } from 'react';\nimport { EmptyState } from '@/components/EmptyState';\nimport { Text } from '@/components/Text';\nimport styles from './ErrorBoundary.module.css';\n\nexport interface ErrorBoundaryProps {\n children: ReactNode;\n fallback?: ReactNode;\n}\n\ninterface ErrorBoundaryState {\n hasError: boolean;\n error: Error | null;\n}\n\nexport class ErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundaryState> {\n constructor(props: ErrorBoundaryProps) {\n super(props);\n this.state = { hasError: false, error: null };\n }\n\n static getDerivedStateFromError(error: Error): ErrorBoundaryState {\n return { hasError: true, error };\n }\n\n override componentDidCatch(error: Error, errorInfo: React.ErrorInfo) {\n console.error('ErrorBoundary caught an error:', error, errorInfo);\n }\n\n handleReset = () => {\n this.setState({ hasError: false, error: null });\n };\n\n override render() {\n if (this.state.hasError) {\n if (this.props.fallback) return this.props.fallback;\n return (\n <div className={styles.errorBoundary}>\n <EmptyState type=\"no-content\" />\n <div className={styles.errorDetails}>\n <Text variant=\"text-body-small\" as=\"p\" color=\"secondary\">\n Something went wrong. Please refresh the page.\n </Text>\n </div>\n </div>\n );\n }\n return this.props.children;\n }\n}\n","/* Sidebar */\n.sidebar {\n display: flex;\n flex-direction: column;\n height: 100%;\n background-color: var(--color-background-secondary);\n border-right: var(--dimension-stroke-width-015) solid var(--color-border-primary);\n position: relative;\n flex-shrink: 0;\n overflow: hidden;\n transition: width var(--effect-motion-short-2);\n}\n\n.sidebar.resizing { transition: none; }\n\n.sidebar.collapsed { width: 0 !important; border-right: none; }\n\n.sidebar.mobile {\n position: fixed;\n top: 0;\n left: 0;\n bottom: 0;\n z-index: 9997;\n}\n\n.sidebar.mini .itemLabel { display: none; }\n.sidebar.mini .itemBadge { display: none; }\n.sidebar.mini .sectionHeader { display: none; }\n\n.backdrop {\n position: fixed;\n inset: 0;\n background-color: var(--color-background-shade);\n z-index: 9996;\n}\n\n.content {\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n padding: var(--dimension-space-050);\n scrollbar-width: none;\n}\n\n.content::-webkit-scrollbar { display: none; }\n\n.footer {\n flex-shrink: 0;\n padding: var(--dimension-space-050);\n border-top: var(--dimension-stroke-width-015) solid var(--color-border-primary);\n}\n\n/* Resize Handle */\n.resizeHandle {\n position: absolute;\n top: 0;\n right: -3px;\n bottom: 0;\n width: 6px;\n cursor: col-resize;\n z-index: 10;\n}\n\n.resizeHandle:hover {\n background-color: var(--color-border-brand);\n opacity: 0.5;\n}\n\n/* Sections */\n.section {\n display: flex;\n flex-direction: column;\n}\n\n.section + .section {\n margin-top: var(--dimension-space-050);\n padding-top: var(--dimension-space-050);\n border-top: var(--dimension-stroke-width-015) solid var(--color-border-primary);\n}\n\n.sectionHeader {\n padding: var(--dimension-space-050) var(--dimension-space-075);\n -webkit-user-select: none;\n user-select: none;\n}\n\n.sectionHeaderClickable { cursor: pointer; }\n\n.sectionItems {\n display: flex;\n flex-direction: column;\n gap: var(--dimension-space-025);\n}\n\n/* Items */\n.itemWrapper {\n display: flex;\n flex-direction: column;\n}\n\n.item {\n display: flex;\n align-items: center;\n gap: var(--dimension-space-075);\n padding: var(--dimension-space-075);\n background-color: transparent;\n border: none;\n border-radius: var(--dimension-radius-075);\n cursor: pointer;\n width: 100%;\n text-align: left;\n position: relative;\n min-height: var(--dimension-size-400);\n transition: background-color var(--effect-motion-short-2);\n}\n\n.item::before {\n content: '';\n position: absolute;\n inset: 0;\n background-color: transparent;\n border-radius: var(--dimension-radius-075);\n transition: var(--effect-transition-interaction-background-short-2);\n pointer-events: none;\n}\n\n.item:hover::before { background-color: var(--color-interaction-hover); }\n.item:active::before { background-color: var(--color-interaction-pressed); }\n\n.itemSelected { background-color: var(--color-background-faint-brand); }\n.itemSelected::before { display: none; }\n\n.itemDisabled { opacity: 0.5; cursor: not-allowed; pointer-events: none; }\n\n.itemIcon {\n flex-shrink: 0;\n display: flex;\n align-items: center;\n color: var(--color-foreground-secondary);\n}\n\n.itemSelected .itemIcon { color: var(--color-foreground-primary); }\n\n.itemLabel {\n flex: 1;\n min-width: 0;\n}\n\n.itemBadge {\n flex-shrink: 0;\n display: flex;\n align-items: center;\n}\n\n/* Sub-items */\n.subItems {\n display: flex;\n flex-direction: column;\n padding-left: var(--dimension-space-300);\n gap: var(--dimension-space-025);\n}\n","import React, { forwardRef, useRef, useCallback, useEffect, useState } from 'react';\nimport { cn } from '@/utils/cn';\nimport styles from './Sidebar.module.css';\n\nexport type SidebarWidth = 'mini' | 'default' | number;\n\nexport interface SidebarProps {\n children: React.ReactNode;\n isCollapsed?: boolean;\n onToggle?: () => void;\n width?: SidebarWidth;\n onWidthChange?: (width: SidebarWidth) => void;\n resizable?: boolean;\n footer?: React.ReactNode;\n className?: string;\n isMobile?: boolean;\n}\n\nconst MINI_WIDTH = 56;\nconst DEFAULT_WIDTH = 240;\nconst MIN_DRAG_WIDTH = 180;\nconst SNAP_THRESHOLD = 140;\n\nexport const Sidebar = forwardRef<HTMLElement, SidebarProps>(\n ({\n children,\n isCollapsed = false,\n onToggle,\n width = 'default',\n onWidthChange,\n resizable = true,\n footer,\n className,\n isMobile = false,\n }, ref) => {\n const internalRef = useRef<HTMLElement>(null);\n const sidebarRef = (ref as React.RefObject<HTMLElement>) || internalRef;\n const [isResizing, setIsResizing] = useState(false);\n\n const isMini = width === 'mini';\n const resolvedWidth = width === 'mini' ? MINI_WIDTH : width === 'default' ? DEFAULT_WIDTH : width;\n\n const handleMouseDown = useCallback((e: React.MouseEvent) => {\n if (!resizable || !onWidthChange) return;\n e.preventDefault();\n setIsResizing(true);\n const startX = e.clientX;\n\n const handleMouseMove = (e: MouseEvent) => {\n const newWidth = e.clientX;\n if (newWidth < SNAP_THRESHOLD) {\n onWidthChange('mini');\n } else if (newWidth < MIN_DRAG_WIDTH) {\n onWidthChange('default');\n } else {\n onWidthChange(newWidth);\n }\n };\n\n const handleMouseUp = () => {\n setIsResizing(false);\n document.removeEventListener('mousemove', handleMouseMove);\n document.removeEventListener('mouseup', handleMouseUp);\n document.body.style.cursor = '';\n document.body.style.userSelect = '';\n };\n\n document.body.style.cursor = 'col-resize';\n document.body.style.userSelect = 'none';\n document.addEventListener('mousemove', handleMouseMove);\n document.addEventListener('mouseup', handleMouseUp);\n }, [resizable, onWidthChange]);\n\n // Close sidebar on Escape (mobile)\n useEffect(() => {\n if (!isMobile || isCollapsed) return;\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === 'Escape') onToggle?.();\n };\n document.addEventListener('keydown', handleEscape);\n return () => document.removeEventListener('keydown', handleEscape);\n }, [isMobile, isCollapsed, onToggle]);\n\n if (isCollapsed && !isMobile) return null;\n\n return (\n <>\n {/* Mobile backdrop */}\n {isMobile && !isCollapsed && (\n <div className={styles.backdrop} onClick={onToggle} aria-hidden />\n )}\n <aside\n ref={sidebarRef}\n className={cn(\n styles.sidebar,\n isMini && styles.mini,\n isMobile && styles.mobile,\n isCollapsed && styles.collapsed,\n isResizing && styles.resizing,\n className\n )}\n style={{ width: isCollapsed ? 0 : resolvedWidth }}\n role=\"navigation\"\n aria-label=\"Sidebar\"\n >\n <div className={styles.content}>\n {children}\n </div>\n {footer && (\n <div className={styles.footer}>\n {footer}\n </div>\n )}\n {resizable && !isMobile && (\n <div\n className={styles.resizeHandle}\n onMouseDown={handleMouseDown}\n role=\"separator\"\n aria-orientation=\"vertical\"\n aria-label=\"Resize sidebar\"\n />\n )}\n </aside>\n </>\n );\n }\n);\n\nSidebar.displayName = 'Sidebar';\n","import React, { forwardRef, useState } from 'react';\nimport { cn } from '@/utils/cn';\nimport { Text } from '@/components/Text';\nimport styles from './Sidebar.module.css';\n\nexport interface SidebarSectionProps {\n label?: string;\n children: React.ReactNode;\n collapsible?: boolean;\n defaultCollapsed?: boolean;\n className?: string;\n}\n\nexport const SidebarSection = forwardRef<HTMLDivElement, SidebarSectionProps>(\n ({ label, children, collapsible = false, defaultCollapsed = false, className }, ref) => {\n const [isCollapsed, setIsCollapsed] = useState(defaultCollapsed);\n\n return (\n <div ref={ref} className={cn(styles.section, className)}>\n {label && (\n <div\n className={cn(styles.sectionHeader, collapsible && styles.sectionHeaderClickable)}\n onClick={collapsible ? () => setIsCollapsed(prev => !prev) : undefined}\n role={collapsible ? 'button' : undefined}\n aria-expanded={collapsible ? !isCollapsed : undefined}\n >\n <Text variant=\"text-caption-emphasis\" as=\"span\" color=\"tertiary\">\n {label}\n </Text>\n </div>\n )}\n {!isCollapsed && (\n <div className={styles.sectionItems}>\n {children}\n </div>\n )}\n </div>\n );\n }\n);\n\nSidebarSection.displayName = 'SidebarSection';\n","import React, { forwardRef } from 'react';\nimport { cn } from '@/utils/cn';\nimport { Text } from '@/components/Text';\nimport type { IconComponent } from '@/types';\nimport styles from './Sidebar.module.css';\n\nexport interface SidebarItemProps {\n label: string;\n icon?: IconComponent;\n isSelected?: boolean;\n isDisabled?: boolean;\n onClick?: () => void;\n badge?: React.ReactNode;\n children?: React.ReactNode;\n className?: string;\n}\n\nexport const SidebarItem = forwardRef<HTMLButtonElement, SidebarItemProps>(\n ({ label, icon: Icon, isSelected = false, isDisabled = false, onClick, badge, children, className }, ref) => (\n <div className={cn(styles.itemWrapper, className)}>\n <button\n ref={ref}\n className={cn(\n styles.item,\n isSelected && styles.itemSelected,\n isDisabled && styles.itemDisabled\n )}\n onClick={onClick}\n disabled={isDisabled}\n type=\"button\"\n aria-current={isSelected ? 'page' : undefined}\n >\n {Icon && (\n <span className={styles.itemIcon}>\n <Icon size={20} />\n </span>\n )}\n <Text\n variant={isSelected ? 'text-body-medium-emphasis' : 'text-body-medium'}\n as=\"span\"\n className={styles.itemLabel}\n lineTruncation={1}\n >\n {label}\n </Text>\n {badge && <span className={styles.itemBadge}>{badge}</span>}\n </button>\n {children && isSelected && (\n <div className={styles.subItems}>\n {children}\n </div>\n )}\n </div>\n )\n);\n\nSidebarItem.displayName = 'SidebarItem';\n",".header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n height: var(--dimension-size-600, 48px);\n padding: 0 var(--dimension-space-100);\n flex-shrink: 0;\n gap: var(--dimension-space-100);\n}\n\n.left {\n display: flex;\n align-items: center;\n gap: var(--dimension-space-100);\n flex-shrink: 0;\n min-width: 0;\n}\n\n.center {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: var(--dimension-space-050);\n flex: 1;\n min-width: 0;\n}\n\n.right {\n display: flex;\n align-items: center;\n gap: var(--dimension-space-050);\n flex-shrink: 0;\n}\n","import React, { forwardRef } from 'react';\nimport { cn } from '@/utils/cn';\nimport { Surface } from '@/components/Surface';\nimport { Text } from '@/components/Text';\nimport styles from './Header.module.css';\n\nexport type HeaderBackground = 'primary' | 'secondary' | 'transparent' | 'translucent';\n\nexport interface HeaderProps {\n title?: string;\n left?: React.ReactNode;\n center?: React.ReactNode;\n right?: React.ReactNode;\n background?: HeaderBackground;\n className?: string;\n}\n\nexport const Header = forwardRef<HTMLElement, HeaderProps>(\n ({ title, left, center, right, background = 'secondary', className }, ref) => (\n <Surface\n ref={ref}\n as=\"header\"\n background={background}\n elevation=\"none\"\n edge=\"bottom\"\n className={cn(styles.header, className)}\n >\n <div className={styles.left}>\n {left}\n {title && !center && (\n <Text variant=\"text-title-small\" as=\"h1\" lineTruncation={1}>\n {title}\n </Text>\n )}\n </div>\n {center && <div className={styles.center}>{center}</div>}\n <div className={styles.right}>{right}</div>\n </Surface>\n )\n);\n\nHeader.displayName = 'Header';\n",".group {\n display: flex;\n flex-direction: column;\n gap: var(--dimension-space-025);\n}\n\n.horizontal {\n flex-direction: row;\n gap: var(--dimension-space-100);\n}\n\n/* ─── Radio item ────────────────────────────────────────────────────────────── */\n\n.radio {\n display: flex;\n align-items: center;\n gap: var(--dimension-space-050);\n padding: var(--dimension-space-075);\n height: var(--dimension-size-400);\n box-sizing: border-box;\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n border-radius: var(--dimension-radius-075);\n transition: background-color var(--effect-motion-short-2);\n}\n\n.radio:hover { background-color: var(--color-interaction-hover); }\n.radio:active { background-color: var(--color-interaction-pressed); }\n\n.inactive {\n cursor: not-allowed;\n opacity: 0.5;\n pointer-events: none;\n}\n\n/* ─── Circle indicator ──────────────────────────────────────────────────────── */\n\n.circle {\n width: 20px;\n height: 20px;\n border: 1.5px solid var(--color-foreground-secondary);\n border-radius: var(--dimension-radius-half);\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n transition: all var(--effect-motion-short-2);\n box-sizing: border-box;\n}\n\n.circleChecked {\n border-color: var(--color-foreground-primary);\n}\n\n.dot {\n width: 10px;\n height: 10px;\n border-radius: var(--dimension-radius-half);\n background-color: var(--color-foreground-primary);\n}\n","import React, { forwardRef } from 'react';\nimport { cn } from '@/utils/cn';\nimport { Text } from '@/components/Text';\nimport styles from './Radio.module.css';\n\nexport interface RadioOption {\n label: string;\n value: string;\n inactive?: boolean;\n}\n\nexport interface RadioGroupProps {\n /** Currently selected value. */\n value: string;\n /** Called when selection changes. */\n onChange: (value: string) => void;\n /** Radio options to render. */\n options: RadioOption[];\n /** Group label for accessibility. */\n 'aria-label'?: string;\n /** Layout direction. */\n direction?: 'vertical' | 'horizontal';\n /** Disables the entire group. */\n inactive?: boolean;\n className?: string;\n}\n\nexport const RadioGroup = forwardRef<HTMLDivElement, RadioGroupProps>(\n (\n {\n value,\n onChange,\n options,\n 'aria-label': ariaLabel,\n direction = 'vertical',\n inactive = false,\n className,\n },\n ref\n ) => (\n <div\n ref={ref}\n role=\"radiogroup\"\n aria-label={ariaLabel}\n className={cn(\n styles.group,\n direction === 'horizontal' && styles.horizontal,\n className\n )}\n >\n {options.map(opt => (\n <RadioItem\n key={opt.value}\n label={opt.label}\n checked={value === opt.value}\n inactive={inactive || opt.inactive}\n onChange={() => onChange(opt.value)}\n />\n ))}\n </div>\n )\n);\n\nRadioGroup.displayName = 'RadioGroup';\n\n/* ─── Individual Radio Item ─────────────────────────────────────────────────── */\n\nexport interface RadioItemProps {\n label: string;\n checked?: boolean;\n onChange?: () => void;\n inactive?: boolean;\n className?: string;\n}\n\nexport const RadioItem = forwardRef<HTMLDivElement, RadioItemProps>(\n ({ label, checked = false, onChange, inactive = false, className }, ref) => {\n const handleClick = () => {\n if (!inactive && !checked) onChange?.();\n };\n\n return (\n <div\n ref={ref}\n role=\"radio\"\n aria-checked={checked}\n tabIndex={inactive ? -1 : 0}\n className={cn(styles.radio, inactive && styles.inactive, className)}\n onClick={handleClick}\n onKeyDown={e => {\n if (e.key === ' ' || e.key === 'Enter') {\n e.preventDefault();\n handleClick();\n }\n }}\n >\n <span className={cn(styles.circle, checked && styles.circleChecked)}>\n {checked && <span className={styles.dot} />}\n </span>\n <Text variant=\"text-body-medium\" as=\"span\" color=\"inherit\">\n {label}\n </Text>\n </div>\n );\n }\n);\n\nRadioItem.displayName = 'RadioItem';\n",".tabGroup {\n display: flex;\n flex-direction: column;\n position: relative;\n}\n\n.tabsRow {\n display: flex;\n gap: var(--dimension-space-025);\n}\n\n.track {\n height: 2px;\n background-color: var(--color-border-secondary);\n position: relative;\n}\n\n.indicator {\n position: absolute;\n bottom: 0;\n height: 2px;\n background-color: var(--color-foreground-primary);\n border-radius: 1px;\n transition: transform var(--effect-motion-short-3), width var(--effect-motion-short-3);\n will-change: transform, width;\n}\n","import React, { forwardRef, useRef, useEffect, useState, useCallback } from 'react';\nimport { cn } from '@/utils/cn';\nimport { Tab } from '@/components/Tab';\nimport styles from './TabGroup.module.css';\n\nexport interface TabGroupTab {\n label: string;\n id?: string;\n}\n\nexport interface TabGroupProps {\n /** Tab definitions. */\n tabs: TabGroupTab[];\n /** Index of the active tab. */\n activeIndex?: number;\n /** Called when a tab is clicked. */\n onTabChange?: (index: number) => void;\n className?: string;\n}\n\nexport const TabGroup = forwardRef<HTMLDivElement, TabGroupProps>(\n ({ tabs, activeIndex = 0, onTabChange, className }, ref) => {\n const tabsRef = useRef<(HTMLButtonElement | null)[]>([]);\n const [indicator, setIndicator] = useState({ left: 0, width: 0 });\n\n const updateIndicator = useCallback(() => {\n const el = tabsRef.current[activeIndex];\n if (el) {\n const parent = el.parentElement;\n if (parent) {\n setIndicator({\n left: el.offsetLeft,\n width: el.offsetWidth,\n });\n }\n }\n }, [activeIndex]);\n\n useEffect(() => {\n updateIndicator();\n }, [updateIndicator]);\n\n // Recalculate on resize\n useEffect(() => {\n const observer = new ResizeObserver(updateIndicator);\n const container = tabsRef.current[0]?.parentElement;\n if (container) observer.observe(container);\n return () => observer.disconnect();\n }, [updateIndicator]);\n\n return (\n <div\n ref={ref}\n role=\"tablist\"\n className={cn(styles.tabGroup, className)}\n >\n <div className={styles.tabsRow}>\n {tabs.map((tab, i) => (\n <Tab\n key={tab.id ?? i}\n ref={el => { tabsRef.current[i] = el; }}\n id={tab.id}\n label={tab.label}\n isSelected={i === activeIndex}\n onClick={() => onTabChange?.(i)}\n />\n ))}\n </div>\n <div className={styles.track}>\n <div\n className={styles.indicator}\n style={{\n transform: `translateX(${indicator.left}px)`,\n width: indicator.width,\n }}\n />\n </div>\n </div>\n );\n }\n);\n\nTabGroup.displayName = 'TabGroup';\n",".accordion {\n display: flex;\n flex-direction: column;\n}\n\n/* ─── Item ──────────────────────────────────────────────────────────────────── */\n\n.item {\n border-bottom: 1px solid var(--color-border-secondary);\n}\n\n.item:first-child {\n border-top: 1px solid var(--color-border-secondary);\n}\n\n.inactive {\n opacity: 0.5;\n pointer-events: none;\n}\n\n/* ─── Trigger ───────────────────────────────────────────────────────────────── */\n\n.trigger {\n display: flex;\n align-items: center;\n justify-content: space-between;\n width: 100%;\n padding: var(--dimension-space-100) var(--dimension-space-050);\n background: none;\n border: none;\n cursor: pointer;\n color: var(--color-foreground-primary);\n border-radius: var(--dimension-radius-050);\n transition: background-color var(--effect-motion-short-2);\n -webkit-user-select: none;\n user-select: none;\n}\n\n.trigger:hover { background-color: var(--color-interaction-hover); }\n.trigger:active { background-color: var(--color-interaction-pressed); }\n\n/* ─── Chevron ───────────────────────────────────────────────────────────────── */\n\n.chevron {\n font-size: 18px;\n line-height: 1;\n transform: rotate(0deg);\n transition: transform var(--effect-motion-short-3);\n color: var(--color-foreground-secondary);\n}\n\n.chevronOpen {\n transform: rotate(90deg);\n}\n\n/* ─── Body (animated height) ────────────────────────────────────────────────── */\n\n.body {\n overflow: hidden;\n transition: height var(--effect-motion-short-3);\n}\n\n.bodyInner {\n padding: var(--dimension-space-050) var(--dimension-space-050) var(--dimension-space-100);\n color: var(--color-foreground-secondary);\n}\n","import React, { forwardRef, useState, useRef, useEffect, useCallback } from 'react';\nimport { cn } from '@/utils/cn';\nimport { Text } from '@/components/Text';\nimport styles from './Accordion.module.css';\n\nexport interface AccordionItemData {\n id: string;\n label: string;\n content: React.ReactNode;\n inactive?: boolean;\n}\n\nexport interface AccordionProps {\n /** Items to render. */\n items: AccordionItemData[];\n /** Allow multiple items open at once. When false, behaves as an accordion. */\n multiple?: boolean;\n /** Controlled: which item IDs are expanded. */\n expandedIds?: string[];\n /** Called when expansion state changes. */\n onExpandedChange?: (ids: string[]) => void;\n className?: string;\n}\n\nexport const Accordion = forwardRef<HTMLDivElement, AccordionProps>(\n ({ items, multiple = false, expandedIds: controlledIds, onExpandedChange, className }, ref) => {\n const [internalIds, setInternalIds] = useState<string[]>([]);\n const expandedIds = controlledIds ?? internalIds;\n\n const toggle = (id: string) => {\n let next: string[];\n if (expandedIds.includes(id)) {\n next = expandedIds.filter(x => x !== id);\n } else {\n next = multiple ? [...expandedIds, id] : [id];\n }\n setInternalIds(next);\n onExpandedChange?.(next);\n };\n\n return (\n <div ref={ref} className={cn(styles.accordion, className)}>\n {items.map(item => (\n <AccordionItem\n key={item.id}\n label={item.label}\n isExpanded={expandedIds.includes(item.id)}\n inactive={item.inactive}\n onToggle={() => toggle(item.id)}\n >\n {item.content}\n </AccordionItem>\n ))}\n </div>\n );\n }\n);\n\nAccordion.displayName = 'Accordion';\n\n/* ─── AccordionItem ─────────────────────────────────────────────────────────── */\n\nexport interface AccordionItemProps {\n label: string;\n children: React.ReactNode;\n isExpanded?: boolean;\n onToggle?: () => void;\n inactive?: boolean;\n className?: string;\n}\n\nexport const AccordionItem = forwardRef<HTMLDivElement, AccordionItemProps>(\n ({ label, children, isExpanded = false, onToggle, inactive = false, className }, ref) => {\n const contentRef = useRef<HTMLDivElement>(null);\n const [height, setHeight] = useState<number>(0);\n\n const measure = useCallback(() => {\n if (contentRef.current) {\n setHeight(contentRef.current.scrollHeight);\n }\n }, []);\n\n useEffect(() => {\n measure();\n const el = contentRef.current;\n if (!el) return;\n const ro = new ResizeObserver(measure);\n ro.observe(el);\n return () => ro.disconnect();\n }, [measure]);\n\n return (\n <div ref={ref} className={cn(styles.item, inactive && styles.inactive, className)}>\n <button\n type=\"button\"\n className={styles.trigger}\n onClick={() => !inactive && onToggle?.()}\n aria-expanded={isExpanded}\n tabIndex={inactive ? -1 : 0}\n >\n <Text variant=\"text-body-medium-emphasis\" as=\"span\" color=\"inherit\">\n {label}\n </Text>\n <span className={cn(styles.chevron, isExpanded && styles.chevronOpen)}>\n &#x203A;\n </span>\n </button>\n <div\n className={styles.body}\n style={{ height: isExpanded ? height : 0 }}\n aria-hidden={!isExpanded}\n >\n <div ref={contentRef} className={styles.bodyInner}>\n {children}\n </div>\n </div>\n </div>\n );\n }\n);\n\nAccordionItem.displayName = 'AccordionItem';\n",".breadcrumb {\n display: flex;\n align-items: center;\n}\n\n.list {\n display: flex;\n align-items: center;\n list-style: none;\n margin: 0;\n padding: 0;\n gap: var(--dimension-space-050);\n}\n\n.item {\n display: flex;\n align-items: center;\n gap: var(--dimension-space-050);\n}\n\n.link {\n color: var(--color-foreground-secondary);\n text-decoration: none;\n background: none;\n border: none;\n padding: var(--dimension-space-025) var(--dimension-space-050);\n border-radius: var(--dimension-radius-050);\n cursor: pointer;\n transition: background-color var(--effect-motion-short-2), color var(--effect-motion-short-2);\n}\n\n.link:hover {\n background-color: var(--color-interaction-hover);\n color: var(--color-foreground-primary);\n}\n\n.link:active {\n background-color: var(--color-interaction-pressed);\n}\n\n.separator {\n color: var(--color-foreground-tertiary);\n font-size: 12px;\n -webkit-user-select: none;\n user-select: none;\n}\n","import React, { forwardRef } from 'react';\nimport { cn } from '@/utils/cn';\nimport { Text } from '@/components/Text';\nimport styles from './Breadcrumb.module.css';\n\nexport interface BreadcrumbItem {\n label: string;\n href?: string;\n onClick?: () => void;\n}\n\nexport interface BreadcrumbProps {\n /** Ordered list of breadcrumb items. Last item is treated as current page. */\n items: BreadcrumbItem[];\n /** Custom separator. Defaults to '/'. */\n separator?: React.ReactNode;\n className?: string;\n}\n\nexport const Breadcrumb = forwardRef<HTMLElement, BreadcrumbProps>(\n ({ items, separator = '/', className }, ref) => (\n <nav ref={ref} aria-label=\"Breadcrumb\" className={cn(styles.breadcrumb, className)}>\n <ol className={styles.list}>\n {items.map((item, i) => {\n const isLast = i === items.length - 1;\n return (\n <li key={i} className={styles.item}>\n {isLast ? (\n <Text variant=\"text-body-medium-emphasis\" as=\"span\" color=\"primary\" aria-current=\"page\">\n {item.label}\n </Text>\n ) : (\n <>\n {item.href ? (\n <a\n href={item.href}\n className={styles.link}\n onClick={e => { if (item.onClick) { e.preventDefault(); item.onClick(); } }}\n >\n <Text variant=\"text-body-medium\" as=\"span\" color=\"inherit\">\n {item.label}\n </Text>\n </a>\n ) : (\n <button\n type=\"button\"\n className={styles.link}\n onClick={item.onClick}\n >\n <Text variant=\"text-body-medium\" as=\"span\" color=\"inherit\">\n {item.label}\n </Text>\n </button>\n )}\n <span className={styles.separator} aria-hidden=\"true\">\n {separator}\n </span>\n </>\n )}\n </li>\n );\n })}\n </ol>\n </nav>\n )\n);\n\nBreadcrumb.displayName = 'Breadcrumb';\n",".pagination {\n display: flex;\n align-items: center;\n gap: var(--dimension-space-025);\n -webkit-user-select: none;\n user-select: none;\n}\n\n.inactive {\n opacity: 0.5;\n pointer-events: none;\n}\n\n/* ─── Button ────────────────────────────────────────────────────────────────── */\n\n.button {\n display: flex;\n align-items: center;\n justify-content: center;\n min-width: var(--dimension-size-300);\n height: var(--dimension-size-300);\n padding: 0 var(--dimension-space-050);\n background: none;\n border: none;\n border-radius: var(--dimension-radius-075);\n cursor: pointer;\n color: var(--color-foreground-secondary);\n transition: background-color var(--effect-motion-short-2), color var(--effect-motion-short-2);\n}\n\n.button:hover:not(:disabled) {\n background-color: var(--color-interaction-hover);\n color: var(--color-foreground-primary);\n}\n\n.button:active:not(:disabled) {\n background-color: var(--color-interaction-pressed);\n}\n\n.button:disabled {\n cursor: not-allowed;\n opacity: 0.35;\n}\n\n.active {\n background-color: var(--color-interaction-hover);\n color: var(--color-foreground-primary);\n}\n\n/* ─── Nav arrows ────────────────────────────────────────────────────────────── */\n\n.nav {\n font-size: 18px;\n}\n\n/* ─── Ellipsis ──────────────────────────────────────────────────────────────── */\n\n.ellipsis {\n display: flex;\n align-items: center;\n justify-content: center;\n min-width: var(--dimension-size-300);\n height: var(--dimension-size-300);\n}\n","import React, { forwardRef, useMemo } from 'react';\nimport { cn } from '@/utils/cn';\nimport { Text } from '@/components/Text';\nimport styles from './Pagination.module.css';\n\nexport interface PaginationProps {\n /** Current page (1-based). */\n page: number;\n /** Total number of pages. */\n totalPages: number;\n /** Called when page changes. */\n onPageChange: (page: number) => void;\n /** Max page buttons visible (excluding prev/next). */\n siblingCount?: number;\n /** Disables all interaction. */\n inactive?: boolean;\n className?: string;\n}\n\nfunction buildRange(start: number, end: number): (number | 'ellipsis')[] {\n const items: (number | 'ellipsis')[] = [];\n for (let i = start; i <= end; i++) items.push(i);\n return items;\n}\n\nfunction buildPages(page: number, totalPages: number, siblings: number): (number | 'ellipsis')[] {\n const totalSlots = siblings * 2 + 5; // siblings + boundaries + ellipses + current\n\n if (totalPages <= totalSlots) return buildRange(1, totalPages);\n\n const leftSibling = Math.max(page - siblings, 2);\n const rightSibling = Math.min(page + siblings, totalPages - 1);\n\n const showLeftEllipsis = leftSibling > 2;\n const showRightEllipsis = rightSibling < totalPages - 1;\n\n if (!showLeftEllipsis && showRightEllipsis) {\n const left = buildRange(1, siblings * 2 + 3);\n return [...left, 'ellipsis', totalPages];\n }\n\n if (showLeftEllipsis && !showRightEllipsis) {\n const right = buildRange(totalPages - (siblings * 2 + 2), totalPages);\n return [1, 'ellipsis', ...right];\n }\n\n return [1, 'ellipsis', ...buildRange(leftSibling, rightSibling), 'ellipsis', totalPages];\n}\n\nexport const Pagination = forwardRef<HTMLElement, PaginationProps>(\n ({ page, totalPages, onPageChange, siblingCount = 1, inactive = false, className }, ref) => {\n const pages = useMemo(() => buildPages(page, totalPages, siblingCount), [page, totalPages, siblingCount]);\n\n if (totalPages <= 1) return null;\n\n return (\n <nav ref={ref} aria-label=\"Pagination\" className={cn(styles.pagination, inactive && styles.inactive, className)}>\n <button\n type=\"button\"\n className={cn(styles.button, styles.nav)}\n disabled={page <= 1 || inactive}\n onClick={() => onPageChange(page - 1)}\n aria-label=\"Previous page\"\n >\n <Text variant=\"text-body-small\" as=\"span\" color=\"inherit\">&#x2039;</Text>\n </button>\n\n {pages.map((item, i) =>\n item === 'ellipsis' ? (\n <span key={`e${i}`} className={styles.ellipsis}>\n <Text variant=\"text-body-small\" as=\"span\" color=\"tertiary\">&hellip;</Text>\n </span>\n ) : (\n <button\n key={item}\n type=\"button\"\n className={cn(styles.button, item === page && styles.active)}\n onClick={() => onPageChange(item)}\n aria-current={item === page ? 'page' : undefined}\n disabled={inactive}\n >\n <Text variant={item === page ? 'text-body-small-emphasis' : 'text-body-small'} as=\"span\" color=\"inherit\">\n {item}\n </Text>\n </button>\n )\n )}\n\n <button\n type=\"button\"\n className={cn(styles.button, styles.nav)}\n disabled={page >= totalPages || inactive}\n onClick={() => onPageChange(page + 1)}\n aria-label=\"Next page\"\n >\n <Text variant=\"text-body-small\" as=\"span\" color=\"inherit\">&#x203A;</Text>\n </button>\n </nav>\n );\n }\n);\n\nPagination.displayName = 'Pagination';\n",".divider {\n border: none;\n margin: 0;\n flex-shrink: 0;\n background-color: var(--color-border-secondary);\n}\n\n/* Horizontal (default) */\n.divider:not(.vertical) {\n width: 100%;\n height: 1px;\n}\n\n/* Vertical */\n.vertical {\n width: 1px;\n height: 100%;\n align-self: stretch;\n}\n","import React, { forwardRef } from 'react';\nimport { cn } from '@/utils/cn';\nimport styles from './Divider.module.css';\n\nexport type DividerOrientation = 'horizontal' | 'vertical';\n\nexport interface DividerProps {\n /** Direction of the divider line. */\n orientation?: DividerOrientation;\n className?: string;\n}\n\nexport const Divider = forwardRef<HTMLHRElement, DividerProps>(\n ({ orientation = 'horizontal', className }, ref) => (\n <hr\n ref={ref}\n role=\"separator\"\n aria-orientation={orientation}\n className={cn(\n styles.divider,\n orientation === 'vertical' && styles.vertical,\n className\n )}\n />\n )\n);\n\nDivider.displayName = 'Divider';\n",".skeleton {\n background-color: var(--color-background-secondary);\n position: relative;\n overflow: hidden;\n}\n\n/* ─── Variants ──────────────────────────────────────────────────────────────── */\n\n.text {\n height: 14px;\n border-radius: var(--dimension-radius-050);\n width: 100%;\n}\n\n.circular {\n width: 40px;\n height: 40px;\n border-radius: var(--dimension-radius-half);\n}\n\n.rectangular {\n width: 100%;\n height: 80px;\n border-radius: var(--dimension-radius-075);\n}\n\n/* ─── Text group ────────────────────────────────────────────────────────────── */\n\n.textGroup {\n display: flex;\n flex-direction: column;\n gap: var(--dimension-space-075);\n}\n\n/* ─── Shimmer animation ─────────────────────────────────────────────────────── */\n\n.animate::after {\n content: '';\n position: absolute;\n inset: 0;\n background: linear-gradient(\n 90deg,\n transparent 0%,\n var(--color-interaction-hover) 50%,\n transparent 100%\n );\n animation: shimmer 1.5s ease-in-out infinite;\n}\n\n@keyframes shimmer {\n 0% { transform: translateX(-100%); }\n 100% { transform: translateX(100%); }\n}\n","import React, { forwardRef } from 'react';\nimport { cn } from '@/utils/cn';\nimport styles from './Skeleton.module.css';\n\nexport type SkeletonVariant = 'text' | 'circular' | 'rectangular';\n\nexport interface SkeletonProps {\n /** Shape of the skeleton. */\n variant?: SkeletonVariant;\n /** Width (CSS value). */\n width?: string | number;\n /** Height (CSS value). */\n height?: string | number;\n /** Number of text lines to render. Only applies to 'text' variant. */\n lines?: number;\n /** Whether to animate the shimmer. */\n animate?: boolean;\n className?: string;\n}\n\nexport const Skeleton = forwardRef<HTMLDivElement, SkeletonProps>(\n (\n {\n variant = 'text',\n width,\n height,\n lines = 1,\n animate = true,\n className,\n },\n ref\n ) => {\n if (variant === 'text' && lines > 1) {\n return (\n <div ref={ref} className={cn(styles.textGroup, className)} style={{ width }}>\n {Array.from({ length: lines }, (_, i) => (\n <div\n key={i}\n className={cn(styles.skeleton, styles.text, animate && styles.animate)}\n style={{\n width: i === lines - 1 ? '60%' : '100%',\n height,\n }}\n />\n ))}\n </div>\n );\n }\n\n return (\n <div\n ref={ref}\n className={cn(\n styles.skeleton,\n styles[variant],\n animate && styles.animate,\n className\n )}\n style={{ width, height }}\n aria-hidden=\"true\"\n />\n );\n }\n);\n\nSkeleton.displayName = 'Skeleton';\n","/* ─── Container ─────────────────────────────────────────────────────────────── */\n\n.container {\n position: fixed;\n z-index: 9999;\n display: flex;\n flex-direction: column;\n gap: var(--dimension-space-075);\n pointer-events: none;\n padding: var(--dimension-space-100);\n max-width: 480px;\n width: 100%;\n box-sizing: border-box;\n}\n\n.topCenter {\n top: 0;\n left: 50%;\n transform: translateX(-50%);\n align-items: center;\n}\n\n.topRight {\n top: 0;\n right: 0;\n align-items: flex-end;\n}\n\n.bottomCenter {\n bottom: 0;\n left: 50%;\n transform: translateX(-50%);\n align-items: center;\n}\n\n.bottomRight {\n bottom: 0;\n right: 0;\n align-items: flex-end;\n}\n\n/* ─── Toast ─────────────────────────────────────────────────────────────────── */\n\n.toast {\n display: flex;\n align-items: center;\n gap: var(--dimension-space-075);\n padding: var(--dimension-space-075) var(--dimension-space-100);\n min-height: var(--dimension-size-400);\n pointer-events: auto;\n animation: slideIn var(--effect-motion-short-3) ease-out;\n}\n\n.toastExit {\n animation: fadeOut 200ms ease-in forwards;\n}\n\n.dismiss {\n background: none;\n border: none;\n color: inherit;\n cursor: pointer;\n padding: var(--dimension-space-025);\n margin-left: auto;\n font-size: 16px;\n line-height: 1;\n opacity: 0.7;\n border-radius: var(--dimension-radius-050);\n transition: opacity var(--effect-motion-short-2);\n flex-shrink: 0;\n}\n\n.dismiss:hover { opacity: 1; }\n\n/* ─── Animations ────────────────────────────────────────────────────────────── */\n\n@keyframes slideIn {\n from {\n opacity: 0;\n transform: translateY(-8px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n@keyframes fadeOut {\n from { opacity: 1; }\n to { opacity: 0; }\n}\n","import React, { forwardRef, useEffect, useState, useCallback, useRef, useSyncExternalStore } from 'react';\nimport ReactDOM from 'react-dom';\nimport { cn } from '@/utils/cn';\nimport { Text } from '@/components/Text';\nimport { Surface } from '@/components/Surface';\nimport type { SurfaceIntent } from '@/components/Surface';\nimport styles from './Toast.module.css';\n\n/* ─── Toast Types ───────────────────────────────────────────────────────────── */\n\nexport type ToastIntent = 'neutral' | 'brand' | 'positive' | 'negative' | 'warning' | 'caution';\nexport type ToastPosition = 'top-center' | 'top-right' | 'bottom-center' | 'bottom-right';\n\nexport interface ToastData {\n id: string;\n message: string;\n intent?: ToastIntent;\n duration?: number;\n onDismiss?: () => void;\n}\n\nexport interface ToastOptions {\n message: string;\n intent?: ToastIntent;\n /** Auto-dismiss duration in ms. 0 = no auto-dismiss. Default 4000. */\n duration?: number;\n onDismiss?: () => void;\n}\n\n/* ─── Toast Store (external, framework-agnostic) ────────────────────────────── */\n\nlet toasts: ToastData[] = [];\nconst listeners = new Set<() => void>();\n\nfunction emit() {\n listeners.forEach(fn => fn());\n}\n\nfunction getSnapshot(): ToastData[] {\n return toasts;\n}\n\nfunction subscribe(listener: () => void) {\n listeners.add(listener);\n return () => { listeners.delete(listener); };\n}\n\nlet idCounter = 0;\n\nexport const toast = {\n show(options: ToastOptions): string {\n const id = `toast-${++idCounter}`;\n toasts = [...toasts, { id, ...options }];\n emit();\n return id;\n },\n info(message: string, options?: Omit<ToastOptions, 'message'>): string {\n return toast.show({ message, intent: 'neutral', ...options });\n },\n success(message: string, options?: Omit<ToastOptions, 'message'>): string {\n return toast.show({ message, intent: 'positive', ...options });\n },\n error(message: string, options?: Omit<ToastOptions, 'message'>): string {\n return toast.show({ message, intent: 'negative', ...options });\n },\n warning(message: string, options?: Omit<ToastOptions, 'message'>): string {\n return toast.show({ message, intent: 'warning', ...options });\n },\n dismiss(id: string) {\n toasts = toasts.filter(t => t.id !== id);\n emit();\n },\n dismissAll() {\n toasts = [];\n emit();\n },\n};\n\n/* ─── useToasts hook ────────────────────────────────────────────────────────── */\n\nexport function useToasts(): ToastData[] {\n return useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n}\n\n/* ─── Single Toast ──────────────────────────────────────────────────────────── */\n\nconst INTENT_MAP: Record<ToastIntent, SurfaceIntent> = {\n neutral: 'neutral',\n brand: 'brand',\n positive: 'positive',\n negative: 'negative',\n warning: 'warning',\n caution: 'caution',\n};\n\ninterface ToastItemProps {\n data: ToastData;\n}\n\nconst ToastItem: React.FC<ToastItemProps> = ({ data }) => {\n const [exiting, setExiting] = useState(false);\n const timerRef = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n\n const dismiss = useCallback(() => {\n setExiting(true);\n setTimeout(() => {\n toast.dismiss(data.id);\n data.onDismiss?.();\n }, 200);\n }, [data]);\n\n useEffect(() => {\n const duration = data.duration ?? 4000;\n if (duration > 0) {\n timerRef.current = setTimeout(dismiss, duration);\n }\n return () => { if (timerRef.current) clearTimeout(timerRef.current); };\n }, [data.duration, dismiss]);\n\n return (\n <Surface\n intent={INTENT_MAP[data.intent ?? 'neutral']}\n contrast=\"bold\"\n elevation=\"floating\"\n radius=\"lg\"\n className={cn(styles.toast, exiting && styles.toastExit)}\n role=\"status\"\n aria-live=\"polite\"\n >\n <Text variant=\"text-body-medium\" as=\"span\" color=\"inherit\">\n {data.message}\n </Text>\n <button\n type=\"button\"\n className={styles.dismiss}\n onClick={dismiss}\n aria-label=\"Dismiss\"\n >\n &times;\n </button>\n </Surface>\n );\n};\n\n/* ─── ToastContainer ────────────────────────────────────────────────────────── */\n\nexport interface ToastContainerProps {\n /** Where to render toasts on screen. */\n position?: ToastPosition;\n}\n\nexport const ToastContainer = forwardRef<HTMLDivElement, ToastContainerProps>(\n ({ position = 'top-center' }, ref) => {\n const items = useToasts();\n\n if (typeof document === 'undefined') return null;\n\n return ReactDOM.createPortal(\n <div\n ref={ref}\n className={cn(styles.container, styles[positionClass(position)])}\n aria-label=\"Notifications\"\n >\n {items.map(item => (\n <ToastItem key={item.id} data={item} />\n ))}\n </div>,\n document.body\n );\n }\n);\n\nToastContainer.displayName = 'ToastContainer';\n\nfunction positionClass(position: ToastPosition): string {\n switch (position) {\n case 'top-center': return 'topCenter';\n case 'top-right': return 'topRight';\n case 'bottom-center': return 'bottomCenter';\n case 'bottom-right': return 'bottomRight';\n }\n}\n"],"mappings":"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"}