@tribepad/themis 1.10.1 → 1.11.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +15 -0
- package/dist/elements/Carousel/index.js +1 -1
- package/dist/elements/Carousel/index.js.map +1 -1
- package/dist/elements/Carousel/index.mjs +1 -1
- package/dist/elements/Carousel/index.mjs.map +1 -1
- package/dist/elements/Filters/index.js +1 -1
- package/dist/elements/Filters/index.js.map +1 -1
- package/dist/elements/Filters/index.mjs +1 -1
- package/dist/elements/Filters/index.mjs.map +1 -1
- package/dist/elements/PageTitle/index.js +1 -1
- package/dist/elements/PageTitle/index.js.map +1 -1
- package/dist/elements/PageTitle/index.mjs +1 -1
- package/dist/elements/PageTitle/index.mjs.map +1 -1
- package/dist/elements/Select/Select.d.ts.map +1 -1
- package/dist/elements/Select/Select.styles.d.ts +11 -0
- package/dist/elements/Select/Select.styles.d.ts.map +1 -1
- package/dist/elements/Select/index.js +1 -1
- package/dist/elements/Select/index.js.map +1 -1
- package/dist/elements/Select/index.mjs +1 -1
- package/dist/elements/Select/index.mjs.map +1 -1
- package/dist/elements/Sidebar/Sidebar.types.d.ts +20 -0
- package/dist/elements/Sidebar/Sidebar.types.d.ts.map +1 -1
- package/dist/elements/Sidebar/SidebarRail.d.ts.map +1 -1
- package/dist/elements/Sidebar/index.d.ts +2 -2
- package/dist/elements/Sidebar/index.d.ts.map +1 -1
- package/dist/elements/Sidebar/index.js +1 -1
- package/dist/elements/Sidebar/index.js.map +1 -1
- package/dist/elements/Sidebar/index.mjs +1 -1
- package/dist/elements/Sidebar/index.mjs.map +1 -1
- package/dist/elements/Table/index.js +1 -1
- package/dist/elements/Table/index.js.map +1 -1
- package/dist/elements/Table/index.mjs +1 -1
- package/dist/elements/Table/index.mjs.map +1 -1
- package/dist/elements/index.js +1 -1
- package/dist/elements/index.js.map +1 -1
- package/dist/elements/index.mjs +1 -1
- package/dist/elements/index.mjs.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +2 -2
- package/dist/index.mjs.map +1 -1
- package/package.json +21 -20
- package/src/elements/Sidebar/Sidebar.stories.tsx +25 -0
- package/src/elements/ChatInterface/README.md +0 -408
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/utils/cn.ts","../../../src/styles/interaction-states.ts","../../../src/elements/Checkbox/Checkbox.tsx","../../../src/elements/Table/Table.styles.ts","../../../src/elements/Table/Table.tsx","../../../src/elements/Button/Button.styles.ts","../../../src/elements/ButtonGroup/ButtonGroupContext.tsx","../../../src/elements/ButtonGroup/ButtonGroup.variants.ts","../../../src/elements/Button/Button.tsx","../../../src/elements/Table/BulkActionBar.styles.ts","../../../src/elements/Table/BulkActionBar.tsx","../../../src/elements/Table/resolveSelectedCount.ts","../../../src/elements/Table/useBulkActionShortcut.ts","../../../src/styles/shared-variants.ts","../../../src/utils/browserExtensionOverlay.ts","../../../src/elements/Select/Select.styles.ts","../../../src/elements/Select/Select.tsx","../../../src/elements/Table/TableCardList.styles.ts","../../../src/elements/Table/TableCardList.tsx","../../../src/hooks/useContainerNarrow.ts"],"names":["cn","inputs","twMerge","clsx","FOCUS_STYLES","PRESSED_STYLES","HIGH_CONTRAST_FOCUS","HIGH_CONTRAST_HOVER","HIGH_CONTRAST_PRESSED","checkboxContainerVariants","cva","checkboxIndicatorVariants","checkmarkVariants","CheckmarkIcon","className","props","jsx","MinusIcon","Checkbox","forwardRef","isSelected","defaultSelected","isDisabled","isReadOnly","isIndeterminate","isInvalid","isRequired","onChange","onFocusChange","value","name","size","variant","label","description","selectedIcon","id","ariaLabel","ariaLabelledby","ariaDescribedby","dataTestId","slot","ref","computedIsDisabled","computedIsReadOnly","computedIsIndeterminate","renderIcon","isChecked","isIndet","iconClassName","dataSelected","dataIndeterminate","isValidElement","iconElement","cloneElement","AriaCheckbox","renderProps","jsxs","Fragment","tableContainerVariants","tableVariants","tableHeaderVariants","tableFooterVariants","columnVariants","rowVariants","cellVariants","TableContext","createContext","Table","stickyHeader","zebra","toolbar","selectionMode","selectionBehavior","disallowEmptySelection","disabledBehavior","selectedKeys","defaultSelectedKeys","onSelectionChange","disabledKeys","sortDescriptor","onSortChange","onRowAction","children","contextValue","useMemo","AriaTable","TableHeaderInner","columns","useContext","allowsDragging","useTableOptions","AriaTableHeader","AriaColumn","Collection","TableHeader","TableBodyInner","items","renderEmptyState","AriaTableBody","TableBody","TableFooter","Column","isRowHeader","allowsSorting","align","width","minWidth","maxWidth","canSort","sortDirection","ChevronUp","ChevronDown","ChevronsUpDown","RowInner","href","selectedClasses","unselectedClasses","selectionCellClasses","AriaRow","disabled","AriaCell","Row","Cell","memo","_colSpan","buttonOuterVariants","buttonVisualVariants","ButtonGroupContext","useButtonGroupContext","ButtonGroupItemContext","useButtonGroupItemContext","buttonGroupItemVariants","Button","buttonVisualClassName","visualSize","fullWidth","loading","loadingText","shortcut","paywall","paywallRedirect","paywallDescription","onPress","paywallDescriptionId","useId","groupContext","itemContext","effectiveVariant","effectiveSize","effectiveIsDisabled","isInVerticalGroup","effectiveFullWidth","positionClassName","effectiveVisualSize","AriaButton","e","Loader2","Zap","bulkActionBarVariants","bulkActionToolbarVariants","bulkActionHintVariants","bulkActionKbdVariants","bulkActionButtonVariants","setRef","BulkActionBar","selectedCount","actions","onAction","onClearSelection","sticky","framed","showJumpHint","shortcutKey","labels","forwardedRef","wrapperRef","useRef","prevCount","itemRefs","active","setActive","useState","total","safeActive","focusItem","index","next","onToolbarKeyDown","event","useEffect","previous","activeEl","hasSelection","showHint","liveText","parts","node","action","itemIndex","resolveSelectedCount","selectableKeys","count","_key","TEXT_INPUT_TYPES","isTextEntryTarget","target","tag","role","useBulkActionShortcut","scopeRef","toolbarRef","key","scope","onKeyDown","FIELD_HEIGHTS","FIELD_INPUT_SIZES","FIELD_TOUCH_TARGET","isExtensionInjectedElement","element","depth","root","custom","parent","createInteractOutsideGuard","consumerShouldClose","selectTriggerVariants","selectItemVariants","selectPopoverVariants","selectSectionVariants","selectErrorVariants","LOADING_SKELETON","_","i","SelectBase","ariaSelectProps","triggerContent","triggerRef","isLoading","errorMessage","emptyStateMessage","childCount","labelId","descriptionId","errorId","rootClassName","restAriaSelectProps","AriaSelect","Label","Text","FieldError","validationErrors","displayError","Popover","ListBox","ListBoxItem","SelectRoot","placeholder","defaultValue","isOpen","validate","validationBehavior","onOpenChange","Children","SelectValue","MultiSelectRoot","_selectionMode","valueToLabelMap","map","processChildren","nodes","child","SelectItem","itemValue","itemChildren","displayValue","v","keys","textValue","message","itemDisabled","CheckSquare","Check","SelectSection","ListBoxSection","SelectHeader","Header","Select","cardRegionVariants","cardToolsVariants","cardListVariants","cardVariants","cardCheckVariants","cardContentVariants","cardActionVariants","TableCardList","getRowId","renderCard","sortColumns","selectable","ids","allSelected","someSelected","resolvedSet","toggleAll","toggleOne","sortValue","onSortColumnChange","column","toggleSortDirection","hasTools","isEmpty","ArrowUp","ArrowDown","item","selected","useContainerNarrow","breakpoint","narrow","setNarrow","el","measure","observer"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Class Name Utility\n * Merges Tailwind CSS classes with conflict resolution\n *\n * Combines clsx for conditional classes and tailwind-merge for deduplication\n *\n * @example\n * cn('px-2 py-1', 'px-4') // => 'py-1 px-4' (px-4 overrides px-2)\n * cn('text-red-500', condition && 'text-blue-500') // => conditional application\n */\n\nimport { clsx, type ClassValue } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs));\n}\n","/**\n * Global Interaction State Styles\n *\n * Consistent interaction patterns across all Themis components.\n * These styles ensure WCAG 2.2 AAA compliance and predictable UX.\n *\n * @see spec.md FR-010 (Visible focus ring for keyboard navigation)\n * @see spec.md FR-031 (Pressed state feedback)\n * @see spec.md FR-012 (High contrast mode support)\n * @see constitution.md Principle IV (Accessibility First)\n */\n\n/**\n * Focus state styles (FR-010)\n * Visible focus ring for keyboard navigation - WCAG 2.2 Level AAA\n *\n * Components can override by extending these styles:\n * @example\n * cn(FOCUS_STYLES, \"ring-4\") // Increases ring width to 4px\n */\nexport const FOCUS_STYLES = \"data-[focus-visible]:ring-2 data-[focus-visible]:ring-[var(--themis-ring)] data-[focus-visible]:ring-offset-2\";\n\n/**\n * Pressed/Active state styles (FR-031)\n * Visual feedback for press interactions\n *\n * Components can override the scale amount:\n * @example\n * cn(PRESSED_STYLES_BASE, \"data-[pressed]:scale-[0.95]\") // More pronounced scale\n */\nexport const PRESSED_STYLES = \"data-[pressed]:scale-[0.97]\";\n\n/**\n * Base pressed styles without scale (for components that need different feedback)\n */\nexport const PRESSED_STYLES_BASE = \"data-[pressed]:transition-transform data-[pressed]:duration-100\";\n\n/**\n * Hover state styles\n * Elevation change on hover for better affordance\n *\n * Components can override shadow depth:\n * @example\n * cn(HOVER_STYLES_BASE, \"data-[hovered]:shadow-lg\") // Larger shadow\n */\nexport const HOVER_STYLES = \"\";\n\n/**\n * Base hover styles without shadow (for components that use different hover effects)\n */\nexport const HOVER_STYLES_BASE = \"data-[hovered]:transition-shadow data-[hovered]:duration-200\";\n\n/**\n * High contrast mode focus (FR-012)\n * Enhanced outlines for users requiring high contrast\n *\n * Uses 'hc:' prefix for prefers-contrast: more media query\n */\nexport const HIGH_CONTRAST_FOCUS = \"hc:data-[focus-visible]:outline hc:data-[focus-visible]:outline-4 hc:data-[focus-visible]:outline-offset-2 hc:data-[focus-visible]:outline-foreground\";\n\n/**\n * High contrast mode hover (FR-012)\n * Enhanced outlines for hover in high contrast mode\n */\nexport const HIGH_CONTRAST_HOVER = \"hc:data-[hovered]:outline hc:data-[hovered]:outline-2 hc:data-[hovered]:outline-foreground\";\n\n/**\n * High contrast mode pressed state\n * Enhanced outlines for pressed state in high contrast mode\n */\nexport const HIGH_CONTRAST_PRESSED = \"hc:data-[pressed]:outline hc:data-[pressed]:outline-2 hc:data-[pressed]:outline-offset-1 hc:data-[pressed]:outline-foreground\";\n\n/**\n * Combined high contrast styles\n * Use this for components that need all high contrast interaction states\n */\nexport const HIGH_CONTRAST_INTERACTIONS = `${HIGH_CONTRAST_FOCUS} ${HIGH_CONTRAST_HOVER} ${HIGH_CONTRAST_PRESSED}`;\n\n/**\n * Disabled state styles\n * Consistent disabled appearance across all components\n */\nexport const DISABLED_STYLES = \"disabled:pointer-events-none disabled:opacity-50\";\n\n/**\n * Default interaction bundle\n * Most common combination for interactive components\n *\n * Includes: focus ring, pressed scale, hover shadow, high contrast enhancements\n *\n * @example\n * <button className={cn(DEFAULT_INTERACTIONS, \"bg-primary\")}>Click</button>\n */\nexport const DEFAULT_INTERACTIONS = `${FOCUS_STYLES} ${PRESSED_STYLES} ${HOVER_STYLES} ${HIGH_CONTRAST_FOCUS} ${HIGH_CONTRAST_HOVER} ${HIGH_CONTRAST_PRESSED}`;\n\n/**\n * Subtle interaction bundle\n * For components that need less pronounced feedback\n *\n * Includes: focus ring and high contrast, but no hover shadow or pressed scale\n */\nexport const SUBTLE_INTERACTIONS = `${FOCUS_STYLES} ${HIGH_CONTRAST_FOCUS}`;\n\n/**\n * Non-interactive element styles\n * For elements that should indicate they are not interactive\n */\nexport const NON_INTERACTIVE = \"cursor-default select-none\";\n","\"use client\";\n\n/**\n * Checkbox Component\n * Standalone accessible checkbox with React Aria primitives and CVA styling\n *\n * Key Features:\n * - Standalone checkbox (not requiring CheckboxGroup)\n * - 44px+ touch targets (WCAG 2.2 AAA)\n * - 2 variants: default, destructive\n * - 3 sizes: sm, default, lg\n * - Indeterminate state support\n * - Spring animation for checkmark\n * - RTL support\n * - Works with React Aria slot system (for Table integration)\n *\n * @see React Aria Checkbox: https://react-spectrum.adobe.com/react-aria/Checkbox.html\n * @see constitution.md Principle IV (Accessibility First - WCAG 2.2 AAA)\n */\n\nimport {\n forwardRef,\n cloneElement,\n isValidElement,\n type ReactNode,\n type ReactElement,\n} from 'react';\nimport { Checkbox as AriaCheckbox } from 'react-aria-components';\nimport { cva } from 'class-variance-authority';\nimport { cn } from '../../utils/cn';\nimport { FOCUS_STYLES, HIGH_CONTRAST_FOCUS } from '../../styles/interaction-states';\nimport type { CheckboxProps } from './Checkbox.types';\n\n// ============================================================================\n// CVA Variants\n// ============================================================================\n\n/**\n * Checkbox container variants\n * Controls the overall checkbox layout with touch target\n */\nconst checkboxContainerVariants = cva(\n [\n // `relative` is load-bearing: React Aria renders the real <input> inside a\n // VisuallyHidden span (position:absolute, auto offsets). Without a positioned\n // ancestor its containing block becomes the document, so the input is laid\n // out at its static Y deep in any tall scroll content and EXTENDS the page's\n // scroll height — producing a phantom blank band + a second (window)\n // scrollbar on layouts whose scroll container isn't its containing block.\n // `relative` confines the hidden input to this 44px label box.\n \"group relative inline-flex items-center gap-2 cursor-pointer\",\n \"transition-colors duration-200\",\n \"rtl:flex-row-reverse\",\n FOCUS_STYLES,\n HIGH_CONTRAST_FOCUS,\n ].join(\" \"),\n {\n variants: {\n size: {\n sm: \"min-h-[44px] text-sm\",\n default: \"min-h-[44px] text-sm\",\n lg: \"min-h-[48px] text-base\",\n },\n isDisabled: {\n true: \"opacity-50 cursor-not-allowed\",\n false: \"\",\n },\n },\n defaultVariants: {\n size: \"default\",\n isDisabled: false,\n },\n }\n);\n\n/**\n * Checkbox indicator (the box) variants\n */\nconst checkboxIndicatorVariants = cva(\n // White interior by default so the box reads cleanly on any surface (grey header\n // band, selected/zebra rows); the selected/indeterminate variants fill it.\n \"flex-shrink-0 rounded-sm border-2 bg-[var(--content-background)] flex items-center justify-center transition-colors duration-200 motion-safe:data-[selected]:selection-pulse\",\n {\n variants: {\n variant: {\n default: [\n \"border-[var(--border)]\",\n \"data-[selected]:border-[var(--primary)]\",\n \"data-[selected]:bg-[var(--primary)]\",\n \"data-[indeterminate]:border-[var(--primary)]\",\n \"data-[indeterminate]:bg-[var(--primary)]\",\n ].join(\" \"),\n destructive: [\n \"border-[var(--border)]\",\n \"data-[selected]:border-[var(--destructive-background)]\",\n \"data-[selected]:bg-[var(--destructive-background)]\",\n \"data-[indeterminate]:border-[var(--destructive-background)]\",\n \"data-[indeterminate]:bg-[var(--destructive-background)]\",\n ].join(\" \"),\n },\n size: {\n sm: \"h-4 w-4\",\n default: \"h-5 w-5\",\n lg: \"h-6 w-6\",\n },\n isInvalid: {\n true: \"border-[var(--destructive-background)]\",\n false: \"\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n isInvalid: false,\n },\n }\n);\n\n/**\n * Checkmark icon variants with spring animation\n */\nconst checkmarkVariants = cva(\n [\n \"transition-transform duration-200\",\n \"[transition-timing-function:cubic-bezier(0.34,1.56,0.64,1)]\",\n \"motion-reduce:transition-none\",\n \"scale-0 data-[selected]:scale-100 data-[indeterminate]:scale-100\",\n ].join(\" \"),\n {\n variants: {\n variant: {\n default: \"text-[var(--primary-foreground)]\",\n destructive: \"text-[var(--destructive-foreground)]\",\n },\n size: {\n sm: \"h-3 w-3\",\n default: \"h-3.5 w-3.5\",\n lg: \"h-4 w-4\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n);\n\n// ============================================================================\n// Icon Components\n// ============================================================================\n\n/**\n * Checkmark SVG icon\n */\nfunction CheckmarkIcon({ className, ...props }: { className?: string; 'data-selected'?: boolean; 'data-indeterminate'?: boolean }): ReactNode {\n return (\n <svg\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={3}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n {...props}\n >\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n );\n}\n\n/**\n * Minus (indeterminate) SVG icon\n */\nfunction MinusIcon({ className, ...props }: { className?: string; 'data-selected'?: boolean; 'data-indeterminate'?: boolean }): ReactNode {\n return (\n <svg\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={3}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n {...props}\n >\n <line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\" />\n </svg>\n );\n}\n\n// ============================================================================\n// Checkbox Component\n// ============================================================================\n\n/**\n * Standalone Checkbox component\n * Accessible checkbox that can be used independently or within Table\n */\nconst Checkbox = forwardRef<HTMLLabelElement, CheckboxProps>(\n (\n {\n isSelected,\n defaultSelected,\n isDisabled,\n isReadOnly,\n isIndeterminate,\n isInvalid = false,\n isRequired = false,\n onChange,\n onFocusChange,\n value,\n name,\n size = 'default',\n variant = 'default',\n label,\n description,\n selectedIcon,\n className,\n id,\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledby,\n 'aria-describedby': ariaDescribedby,\n 'data-testid': dataTestId,\n slot,\n },\n ref\n ) => {\n // Only set these props when explicitly true to allow slot system to control them\n // (e.g., Table's selection slot injects isIndeterminate for partial selection)\n const computedIsDisabled = isDisabled || undefined;\n const computedIsReadOnly = isReadOnly || undefined;\n const computedIsIndeterminate = isIndeterminate || undefined;\n // Render the icon based on state\n const renderIcon = (isChecked: boolean, isIndet: boolean) => {\n const iconClassName = cn(checkmarkVariants({ variant, size }));\n const dataSelected = isChecked || undefined;\n const dataIndeterminate = isIndet || undefined;\n\n // For indeterminate state, always show minus\n if (isIndet) {\n return (\n <MinusIcon\n className={iconClassName}\n data-selected={dataSelected}\n data-indeterminate={dataIndeterminate}\n />\n );\n }\n\n // Custom icon support\n if (selectedIcon && isChecked) {\n if (isValidElement(selectedIcon)) {\n const iconElement = selectedIcon as ReactElement<{ className?: string; 'data-selected'?: boolean }>;\n return cloneElement(iconElement, {\n className: cn(iconClassName, iconElement.props.className),\n 'data-selected': dataSelected,\n });\n }\n return <span className={iconClassName} data-selected={dataSelected}>{selectedIcon}</span>;\n }\n\n // Default checkmark\n return (\n <CheckmarkIcon\n className={iconClassName}\n data-selected={dataSelected}\n data-indeterminate={dataIndeterminate}\n />\n );\n };\n\n return (\n <AriaCheckbox\n ref={ref}\n id={id}\n isSelected={isSelected}\n defaultSelected={defaultSelected}\n isDisabled={computedIsDisabled}\n isReadOnly={computedIsReadOnly}\n isIndeterminate={computedIsIndeterminate}\n isInvalid={isInvalid}\n isRequired={isRequired}\n onChange={onChange}\n onFocusChange={onFocusChange}\n value={value}\n name={name}\n slot={slot}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledby}\n aria-describedby={ariaDescribedby}\n data-testid={dataTestId}\n className={(renderProps) =>\n cn(\n checkboxContainerVariants({\n size,\n isDisabled: renderProps.isDisabled,\n }),\n className\n )\n }\n >\n {(renderProps) => (\n <>\n {/* Checkbox indicator (the box) */}\n <div\n className={checkboxIndicatorVariants({\n variant,\n size,\n isInvalid: renderProps.isInvalid,\n })}\n data-selected={renderProps.isSelected || undefined}\n data-indeterminate={renderProps.isIndeterminate || undefined}\n >\n {renderIcon(renderProps.isSelected, renderProps.isIndeterminate)}\n </div>\n\n {/* Label and description */}\n {(label || description) && (\n <div className=\"flex flex-col\">\n {label && (\n <span className=\"font-medium text-[var(--content-foreground)]\">\n {label}\n </span>\n )}\n {description && (\n <span className=\"text-sm text-[var(--menu-muted)]\">\n {description}\n </span>\n )}\n </div>\n )}\n </>\n )}\n </AriaCheckbox>\n );\n }\n);\n\nCheckbox.displayName = \"Checkbox\";\n\n// ============================================================================\n// Exports\n// ============================================================================\n\nexport {\n Checkbox,\n checkboxContainerVariants,\n checkboxIndicatorVariants,\n checkmarkVariants,\n CheckmarkIcon,\n MinusIcon,\n};\n","import { cva } from 'class-variance-authority';\n\n// Table container variants (wrapper div) — Card-style outer frame to match `Card`\n// (rounded-lg + 1px border + content background). overflow-auto + the radius keep\n// the corners clean even when wide tables scroll.\nexport const tableContainerVariants = cva([\n 'relative w-full overflow-auto',\n 'rounded-lg border border-[var(--border)] bg-[var(--content-background)]',\n]);\n\n// Table variants\nexport const tableVariants = cva(\n ['w-full caption-bottom text-sm', 'border-collapse'],\n {\n variants: {\n variant: {\n default: '',\n // The outer frame is on the container; `bordered` adds internal column\n // dividers for a denser grid look.\n bordered: '[&_tr>*+*]:border-l [&_tr>*+*]:border-[var(--border)]',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n }\n);\n\n// Table header variants — the header's bottom rule uses the same token as the\n// outside (Card) border so they read as one consistent frame.\nexport const tableHeaderVariants = cva(['[&_tr]:border-b [&_tr]:border-[var(--border)]'], {\n variants: {\n sticky: {\n true: 'sticky top-0 z-10 bg-[var(--content-background)]',\n false: '',\n },\n },\n defaultVariants: {\n sticky: false,\n },\n});\n\n// Table footer variants\nexport const tableFooterVariants = cva([\n 'border-t border-[var(--border)]',\n 'bg-[var(--accent-background)]/50',\n 'font-medium',\n '[&>tr]:last:border-b-0',\n]);\n\n// Column variants\nexport const columnVariants = cva(\n [\n 'h-12 px-4 text-left align-middle font-semibold',\n 'uppercase tracking-wide',\n // Grey header band; foreground text keeps a 7:1 (AAA) ratio on the grey.\n 'bg-[var(--accent-background)] text-[var(--content-foreground)]',\n '[&:has([role=checkbox])]:pr-0',\n 'select-none',\n 'focus-visible:outline-none focus-visible:ring-2',\n 'focus-visible:ring-[var(--ring)] focus-visible:ring-inset',\n ],\n {\n variants: {\n allowsSorting: {\n true: 'cursor-pointer hover:bg-[var(--accent)]/50',\n false: '',\n },\n align: {\n start: 'text-start',\n center: 'text-center',\n end: 'text-end',\n },\n size: {\n sm: 'h-10 px-3 text-xs',\n default: 'h-12 px-4 text-sm',\n lg: 'h-14 px-5 text-base',\n },\n },\n defaultVariants: {\n allowsSorting: false,\n align: 'start',\n size: 'default',\n },\n }\n);\n\n// Row variants\nexport const rowVariants = cva(\n [\n 'border-b border-[var(--border)]',\n 'transition-colors',\n 'focus-visible:outline-none focus-visible:ring-2',\n 'focus-visible:ring-[var(--ring)] focus-visible:ring-inset',\n 'hover:bg-[var(--accent-background)]/50',\n 'data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n ],\n {\n variants: {\n isSelected: {\n true: 'bg-[var(--selected)] data-[selected]:bg-[var(--selected)]',\n false: '',\n },\n // Zebra striping is orthogonal to `variant` (works with default + bordered)\n // and on by default. Selected rows override the stripe via isSelected.\n zebra: {\n true: 'even:bg-[var(--accent-background)]/30',\n false: '',\n },\n },\n defaultVariants: {\n isSelected: false,\n zebra: true,\n },\n }\n);\n\n// Cell variants\nexport const cellVariants = cva(\n ['p-4 align-middle', '[&:has([role=checkbox])]:pr-0'],\n {\n variants: {\n align: {\n start: 'text-start',\n center: 'text-center',\n end: 'text-end',\n },\n size: {\n sm: 'p-3 text-xs',\n default: 'p-4 text-sm',\n lg: 'p-5 text-base',\n },\n isRowHeader: {\n true: 'font-medium',\n false: '',\n },\n },\n defaultVariants: {\n align: 'start',\n size: 'default',\n isRowHeader: false,\n },\n }\n);\n","'use client';\n\n/**\n * Table Component - Accessible Data Table (v1)\n * ARIA grid pattern with React Aria primitives\n *\n * @see plan.md for architecture details\n * @see table-prd.md for requirements\n * @see WCAG 2.2 AAA compliance\n */\n\nimport {\n forwardRef,\n memo,\n createContext,\n useContext,\n useMemo,\n type ReactNode,\n type ReactElement,\n type ForwardedRef,\n} from 'react';\nimport {\n Table as AriaTable,\n TableHeader as AriaTableHeader,\n TableBody as AriaTableBody,\n Column as AriaColumn,\n Row as AriaRow,\n Cell as AriaCell,\n Collection,\n useTableOptions,\n type TableHeaderProps as AriaTableHeaderProps,\n type TableBodyProps as AriaTableBodyProps,\n type RowProps as AriaRowProps,\n type CellProps as AriaCellProps,\n type Selection,\n type SortDescriptor,\n} from 'react-aria-components';\nimport { Checkbox } from '../Checkbox';\nimport { ChevronUp, ChevronDown, ChevronsUpDown } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport {\n tableContainerVariants,\n tableVariants,\n tableHeaderVariants,\n tableFooterVariants,\n columnVariants,\n rowVariants,\n cellVariants,\n} from './Table.styles';\nimport type {\n TableProps,\n TableHeaderProps,\n TableBodyProps,\n TableFooterProps,\n ColumnProps,\n RowProps,\n CellProps,\n TableVariant,\n TableSize,\n} from './Table.types';\n\n// ============================================================================\n// Context for passing table-level props to children\n// ============================================================================\n\ninterface TableContextValue {\n variant: TableVariant;\n size: TableSize;\n selectionMode: 'none' | 'single' | 'multiple';\n stickyHeader: boolean;\n zebra: boolean;\n}\n\nconst TableContext = createContext<TableContextValue>({\n variant: 'default',\n size: 'default',\n selectionMode: 'none',\n stickyHeader: false,\n zebra: true,\n});\n\n// ============================================================================\n// Table Component\n// ============================================================================\n\nconst Table = forwardRef<HTMLTableElement, TableProps>(\n (\n {\n className,\n variant = 'default',\n size = 'default',\n stickyHeader = false,\n zebra = true,\n toolbar,\n selectionMode = 'none',\n selectionBehavior = 'toggle',\n disallowEmptySelection = false,\n disabledBehavior = 'selection',\n selectedKeys,\n defaultSelectedKeys,\n onSelectionChange,\n disabledKeys,\n sortDescriptor,\n onSortChange,\n onRowAction,\n children,\n ...props\n },\n ref\n ) => {\n // Warn when sm size is used with selection (touch targets < 44px)\n if (process.env.NODE_ENV !== 'production' && size === 'sm' && selectionMode !== 'none') {\n console.warn(\n '[Table] size=\"sm\" with selectionMode produces rows shorter than the 44px WCAG 2.2 AAA minimum touch target. ' +\n 'Use size=\"default\" or size=\"lg\" for accessible interactive tables.'\n );\n }\n\n const contextValue = useMemo(\n () => ({ variant, size, selectionMode, stickyHeader, zebra }),\n [variant, size, selectionMode, stickyHeader, zebra]\n );\n\n return (\n <TableContext.Provider value={contextValue}>\n <div\n className={cn(tableContainerVariants(), className)}\n data-testid=\"table-container\"\n >\n {toolbar}\n <AriaTable\n ref={ref}\n className={cn(tableVariants({ variant }))}\n selectionMode={selectionMode}\n selectionBehavior={selectionBehavior}\n disallowEmptySelection={disallowEmptySelection}\n disabledBehavior={disabledBehavior}\n selectedKeys={selectedKeys}\n defaultSelectedKeys={defaultSelectedKeys}\n onSelectionChange={onSelectionChange}\n disabledKeys={disabledKeys}\n sortDescriptor={sortDescriptor}\n onSortChange={onSortChange}\n onRowAction={onRowAction}\n data-testid=\"table\"\n data-variant={variant}\n data-size={size}\n data-zebra={zebra}\n {...props}\n >\n {children}\n </AriaTable>\n </div>\n </TableContext.Provider>\n );\n }\n);\n\nTable.displayName = 'Table';\n\n// ============================================================================\n// TableHeader Component\n// ============================================================================\n\nfunction TableHeaderInner<T extends object>(\n { className, children, columns, ...props }: TableHeaderProps<T>,\n ref: ForwardedRef<HTMLTableSectionElement>\n): ReactElement {\n const { size, selectionMode, stickyHeader } = useContext(TableContext);\n const { allowsDragging } = useTableOptions();\n\n return (\n <AriaTableHeader\n ref={ref}\n className={cn(tableHeaderVariants({ sticky: stickyHeader }), className)}\n data-testid=\"table-header\"\n {...(props as AriaTableHeaderProps<T>)}\n >\n {/* Selection checkbox column */}\n {selectionMode === 'multiple' && (\n <AriaColumn className={cn(columnVariants({ size }), 'w-12')}>\n <Checkbox slot=\"selection\" aria-label=\"Select all\" size={size} />\n </AriaColumn>\n )}\n {/* Drag handle column if dragging is allowed */}\n {allowsDragging && <AriaColumn />}\n {/* Render columns */}\n {columns ? (\n <Collection items={columns}>{children as (item: T) => ReactElement}</Collection>\n ) : (\n children as ReactNode\n )}\n </AriaTableHeader>\n );\n}\n\nconst TableHeader = forwardRef(TableHeaderInner) as <T extends object>(\n props: TableHeaderProps<T> & { ref?: ForwardedRef<HTMLTableSectionElement> }\n) => ReactElement;\n\n(TableHeader as { displayName?: string }).displayName = 'TableHeader';\n\n// ============================================================================\n// TableBody Component\n// ============================================================================\n\nfunction TableBodyInner<T extends object>(\n { className, children, items, renderEmptyState, ...props }: TableBodyProps<T>,\n ref: ForwardedRef<HTMLTableSectionElement>\n): ReactElement {\n return (\n <AriaTableBody\n ref={ref}\n className={cn(className)}\n items={items}\n renderEmptyState={\n renderEmptyState\n ? () => (\n // React Aria wraps this in a single spanning row/cell — return only\n // the (centered) content, never a hand-rolled <tr>/<td> (which would\n // nest invalidly inside the generated empty-state row).\n <div className=\"text-center p-8\">{renderEmptyState()}</div>\n )\n : undefined\n }\n data-testid=\"table-body\"\n {...(props as AriaTableBodyProps<T>)}\n >\n {children as AriaTableBodyProps<T>['children']}\n </AriaTableBody>\n );\n}\n\nconst TableBody = forwardRef(TableBodyInner) as <T extends object>(\n props: TableBodyProps<T> & { ref?: ForwardedRef<HTMLTableSectionElement> }\n) => ReactElement;\n\n(TableBody as { displayName?: string }).displayName = 'TableBody';\n\n// ============================================================================\n// TableFooter Component (Custom - not from React Aria)\n// ============================================================================\n\nconst TableFooter = forwardRef<HTMLTableSectionElement, TableFooterProps>(\n ({ className, children, ...props }, ref) => {\n return (\n <tfoot\n ref={ref}\n className={cn(tableFooterVariants(), className)}\n data-testid=\"table-footer\"\n {...props}\n >\n {children}\n </tfoot>\n );\n }\n);\n\nTableFooter.displayName = 'TableFooter';\n\n// ============================================================================\n// Column Component\n// ============================================================================\n\nconst Column = forwardRef<HTMLTableCellElement, ColumnProps>(\n (\n {\n className,\n children,\n isRowHeader = false,\n allowsSorting = false,\n align = 'start',\n width,\n minWidth,\n maxWidth,\n ...props\n },\n ref\n ) => {\n const { size } = useContext(TableContext);\n\n return (\n <AriaColumn\n ref={ref}\n isRowHeader={isRowHeader}\n allowsSorting={allowsSorting}\n width={width}\n minWidth={minWidth}\n maxWidth={maxWidth}\n className={cn(columnVariants({ allowsSorting, align, size }), className)}\n {...props}\n >\n {({ allowsSorting: canSort, sortDirection }) => (\n <div className=\"flex items-center gap-1\">\n <span>{children as ReactNode}</span>\n {canSort && (\n <span\n aria-hidden=\"true\"\n data-sort-direction={sortDirection ?? 'none'}\n className={\n sortDirection\n ? 'text-[var(--primary-action)]'\n : 'opacity-50'\n }\n >\n {sortDirection === 'ascending' ? (\n <ChevronUp className=\"h-4 w-4\" />\n ) : sortDirection === 'descending' ? (\n <ChevronDown className=\"h-4 w-4\" />\n ) : (\n // Sortable but not the active sort — neutral affordance.\n <ChevronsUpDown className=\"h-4 w-4\" />\n )}\n </span>\n )}\n </div>\n )}\n </AriaColumn>\n );\n }\n);\n\n(Column as { displayName?: string }).displayName = 'Column';\n\n// ============================================================================\n// Row Component\n// ============================================================================\n\nfunction RowInner<T extends object>(\n { className, children, columns, href, isDisabled, ...props }: RowProps<T>,\n ref: ForwardedRef<HTMLTableRowElement>\n): ReactElement {\n const { size, selectionMode, zebra } = useContext(TableContext);\n const { allowsDragging } = useTableOptions();\n\n // Pre-compute variant class strings to avoid CVA calls in render callback.\n // Zebra striping is orthogonal to `variant`; selected rows override the stripe.\n const selectedClasses = rowVariants({ isSelected: true, zebra });\n const unselectedClasses = rowVariants({ isSelected: false, zebra });\n const selectionCellClasses = cn(cellVariants({ size }), 'w-12');\n\n return (\n <AriaRow\n ref={ref}\n href={href}\n isDisabled={isDisabled}\n className={({ isSelected, isDisabled: disabled }) =>\n cn(\n isSelected ? selectedClasses : unselectedClasses,\n disabled && 'opacity-50',\n className\n )\n }\n data-testid=\"table-row\"\n {...(props as AriaRowProps<T>)}\n >\n {/* Selection checkbox cell */}\n {selectionMode === 'multiple' && (\n <AriaCell className={selectionCellClasses}>\n <Checkbox slot=\"selection\" aria-label=\"Select row\" size={size} />\n </AriaCell>\n )}\n {/* Drag handle cell if dragging is allowed */}\n {allowsDragging && (\n <AriaCell>\n {/* Placeholder for drag handle - v2 feature */}\n </AriaCell>\n )}\n {/* Render cells */}\n {columns ? (\n <Collection items={columns}>{children as (item: T) => ReactElement}</Collection>\n ) : (\n children as ReactNode\n )}\n </AriaRow>\n );\n}\n\nconst Row = forwardRef(RowInner) as <T extends object>(\n props: RowProps<T> & { ref?: ForwardedRef<HTMLTableRowElement> }\n) => ReactElement;\n\n(Row as { displayName?: string }).displayName = 'Row';\n\n// ============================================================================\n// Cell Component\n// ============================================================================\n\nconst Cell = memo(forwardRef<HTMLTableCellElement, CellProps>(\n ({ className, children, align = 'start', colSpan: _colSpan, ...props }, ref) => {\n const { size } = useContext(TableContext);\n\n return (\n <AriaCell\n ref={ref}\n className={cn(cellVariants({ align, size }), className)}\n {...(props as AriaCellProps)}\n >\n {children}\n </AriaCell>\n );\n }\n));\n\nCell.displayName = 'Cell';\n\n// ============================================================================\n// Exports\n// ============================================================================\n\nexport {\n Table,\n TableHeader,\n TableBody,\n TableFooter,\n Column,\n Row,\n Cell,\n};\n\n// Re-export CVA variants (defined in Table.styles.ts)\nexport {\n tableContainerVariants,\n tableVariants,\n tableHeaderVariants,\n tableFooterVariants,\n columnVariants,\n rowVariants,\n cellVariants,\n};\n\n// Re-export types\nexport type { Selection, SortDescriptor };\n","import { cva } from 'class-variance-authority';\n\n/**\n * Layer 1: Transparent outer touch target (44x44px minimum)\n * Handles WCAG 2.2 AAA touch target requirement\n * Always transparent, centers the visual button inside\n * IMPORTANT: Focus ring stays on Layer 1 for AAA compliance (2.4.13)\n *\n * In vertical ButtonGroups, uses items-stretch so the visual layer (Layer 2)\n * can fill the full touch target height, eliminating gaps between buttons.\n */\nexport const buttonOuterVariants = cva(\n \"inline-flex justify-center min-h-[44px] min-w-[44px] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--ring)] focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:pointer-events-none disabled:opacity-50\",\n {\n variants: {\n fullWidth: {\n true: \"w-full\",\n false: \"\",\n },\n inVerticalGroup: {\n true: \"items-stretch\",\n false: \"items-center\",\n },\n },\n defaultVariants: {\n fullWidth: false,\n inVerticalGroup: false,\n },\n }\n);\n\n/**\n * Layer 2: Visual button appearance (adjustable size)\n * Provides the visual appearance with configurable size\n * Can be smaller than touch target for use cases like carousel dots\n * NOTE: NO focus-visible styles here - focus ring is on Layer 1\n */\nexport const buttonVisualVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-normal ring-offset-background motion-safe:transition-transform motion-safe:duration-200 motion-safe:[transition-timing-function:cubic-bezier(0.34,1.56,0.64,1)] motion-reduce:transition-none [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 relative cursor-pointer\",\n {\n variants: {\n variant: {\n default:\n \"bg-[var(--primary-action)] text-[var(--primary-action-foreground)] shadow-md hover:bg-[var(--primary-action-hover)] hover:-translate-y-1\",\n destructive:\n \"bg-[var(--destructive-background)] text-[var(--destructive-foreground)] hover:bg-[var(--destructive-background-hover,var(--destructive-background))] motion-safe:hover:btn-warn-shake\",\n outline:\n \"border border-[var(--input-border)] bg-[var(--content-background)] hover:bg-[var(--accent-background)]/50\",\n secondary:\n \"bg-[var(--secondary)] text-[var(--secondary-foreground)] hover:bg-[var(--secondary-hover,var(--secondary))]\",\n ghost:\n \"hover:bg-[var(--accent)] hover:text-[var(--accent-foreground)]\",\n link: \"text-[var(--text-link)] underline underline-offset-4 hover:bg-[var(--accent)] hover:text-[var(--text-link-hover)]\",\n },\n fullWidth: {\n true: \"w-full\",\n false: \"\",\n },\n visualSize: {\n default: \"h-10 px-4 py-2\",\n sm: \"h-9 rounded-md px-3 text-xs\",\n lg: \"h-11 rounded-md px-6 text-base\",\n icon: \"h-10 w-10\",\n dot: \"h-5 w-5 rounded-full p-0 min-h-0 min-w-0\",\n },\n paywall: {\n true: \"!bg-[var(--paywall)] !text-[var(--paywall-foreground)] hover:!bg-[var(--paywall)]/90 !cursor-not-allowed !border-transparent\",\n false: \"\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n visualSize: \"default\",\n paywall: false,\n },\n }\n);\n\n/**\n * @deprecated Use buttonVisualVariants instead. This alias is kept for backward compatibility.\n */\nexport const buttonVariants = buttonVisualVariants;\n","\"use client\";\n\nimport { createContext, useContext } from 'react';\nimport type {\n ButtonGroupContextValue,\n ButtonGroupItemContextValue,\n} from './ButtonGroup.types';\n\n/**\n * ButtonGroup Context System (Two-Level)\n *\n * Provides a two-level context pattern for ButtonGroup:\n *\n * 1. ButtonGroupContext (group-level):\n * - Provides: orientation, variant, size, isDisabled\n * - Consumed by: Button (for prop inheritance), Separator (for orientation)\n *\n * 2. ButtonGroupItemContext (item-level):\n * - Provides: position ('first' | 'middle' | 'last' | 'only')\n * - Consumed by: Button (for border-radius styling)\n *\n * Both contexts return null when not in a provider, allowing Button\n * to work standalone without any group context.\n *\n * @see plan.md for architecture details\n * @see ButtonGroup.tsx for Provider implementation\n */\n\n// =============================================================================\n// Group-Level Context\n// =============================================================================\n\n/**\n * Context for group-level props (orientation, variant, size, isDisabled)\n * Default value is null to indicate \"not in a group\"\n */\nconst ButtonGroupContext = createContext<ButtonGroupContextValue | null>(null);\n\nButtonGroupContext.displayName = 'ButtonGroupContext';\n\n/**\n * Hook to access group-level context\n * @returns ButtonGroupContextValue if inside a ButtonGroup, null otherwise\n */\nexport function useButtonGroupContext(): ButtonGroupContextValue | null {\n return useContext(ButtonGroupContext);\n}\n\n// =============================================================================\n// Item-Level Context\n// =============================================================================\n\n/**\n * Context for per-button position information\n * Default value is null to indicate \"not wrapped with position context\"\n */\nconst ButtonGroupItemContext =\n createContext<ButtonGroupItemContextValue | null>(null);\n\nButtonGroupItemContext.displayName = 'ButtonGroupItemContext';\n\n/**\n * Hook to access item-level context (position)\n * @returns ButtonGroupItemContextValue if wrapped with position context, null otherwise\n */\nexport function useButtonGroupItemContext(): ButtonGroupItemContextValue | null {\n return useContext(ButtonGroupItemContext);\n}\n\n// =============================================================================\n// Exports\n// =============================================================================\n\nexport { ButtonGroupContext, ButtonGroupItemContext };\n","import { cva } from 'class-variance-authority';\n\n/**\n * ButtonGroup CVA Variants\n *\n * Defines Class Variance Authority (CVA) variants for:\n * - ButtonGroup container (orientation-based layout)\n * - ButtonGroupItem (position-based border-radius)\n * - ButtonGroupSeparator (orientation-based styling)\n *\n * @see plan.md Phase 1: Design & Contracts - CVA Variants\n * @see constitution.md Principle V (Component Quality Standards)\n */\n\n// =============================================================================\n// Container Variants\n// =============================================================================\n\n/**\n * ButtonGroup container variants\n * Controls the layout direction based on orientation\n * Uses gap-0 to ensure buttons are connected (share borders)\n */\nexport const buttonGroupVariants = cva('inline-flex items-center gap-0', {\n variants: {\n orientation: {\n horizontal: 'flex-row',\n vertical: 'flex-col w-full',\n },\n },\n defaultVariants: {\n orientation: 'horizontal',\n },\n});\n\n// =============================================================================\n// Item Position Variants\n// =============================================================================\n\n/**\n * ButtonGroupItem position variants\n * Applied to Button's visual layer (Layer 2) for position-aware border-radius\n *\n * Compound variants handle both orientation and position combinations:\n * - Horizontal: left/right borders and radii\n * - Vertical: top/bottom borders and radii\n */\nexport const buttonGroupItemVariants = cva('', {\n variants: {\n orientation: {\n // min-w-[44px] ensures visual layer fills touch target width (for icon buttons)\n horizontal: 'min-w-[44px]',\n // flex (overrides inline-flex) + min-h-[44px] makes visual layer fill touch target,\n // eliminating gaps between stacked buttons in vertical orientation\n vertical: 'flex min-h-[44px]',\n },\n position: {\n first: '',\n middle: '',\n last: '',\n only: '', // Single button - no modifications needed\n },\n },\n compoundVariants: [\n // ==========================================================================\n // Horizontal Orientation\n // ==========================================================================\n {\n orientation: 'horizontal',\n position: 'first',\n className: 'rounded-r-none border-r-0',\n },\n {\n orientation: 'horizontal',\n position: 'middle',\n className: 'rounded-none border-r-0',\n },\n {\n orientation: 'horizontal',\n position: 'last',\n className: 'rounded-l-none',\n },\n // ==========================================================================\n // Vertical Orientation\n // Note: w-full is handled by Button's effectiveFullWidth for both layers\n // ==========================================================================\n {\n orientation: 'vertical',\n position: 'first',\n className: 'rounded-b-none border-b-0',\n },\n {\n orientation: 'vertical',\n position: 'middle',\n className: 'rounded-none border-b-0',\n },\n {\n orientation: 'vertical',\n position: 'last',\n className: 'rounded-t-none',\n },\n ],\n defaultVariants: {\n orientation: 'horizontal',\n position: 'only',\n },\n});\n\n// =============================================================================\n// Separator Variants\n// =============================================================================\n\n/**\n * ButtonGroupSeparator variants\n * Orientation-aware visual divider between button groups\n */\nexport const buttonGroupSeparatorVariants = cva('bg-[var(--border)]', {\n variants: {\n orientation: {\n horizontal: 'w-px h-6 mx-1',\n vertical: 'h-px w-full my-1',\n },\n },\n defaultVariants: {\n orientation: 'horizontal',\n },\n});\n","\"use client\";\n\n/**\n * Button Component - 3-Layer Architecture\n * Accessible button with React Aria primitives and CVA styling\n *\n * Architecture:\n * - Layer 1: Touch Target (44x44px WCAG AAA compliant, transparent)\n * - Layer 2: Visual Button (configurable size, colors, borders)\n * - Layer 3: Content & Effects (text, icons, ripple, loading spinner)\n *\n * @see 3layer-plan.md for architecture details\n * @see spec.md FR-029 to FR-037 (Button Component Requirements)\n * @see spec.md FR-009 (WCAG 2.2 AAA - 7:1 contrast ratio)\n * @see spec.md FR-014 (44x44px minimum touch targets)\n * @see constitution.md Principle IV (Accessibility First)\n */\n\nimport { forwardRef, memo, useId } from 'react';\nimport {\n Button as AriaButton,\n type ButtonProps as AriaButtonProps,\n} from 'react-aria-components';\nimport { Loader2, Zap } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport type { ButtonProps } from './Button.types';\nimport { buttonOuterVariants, buttonVisualVariants, buttonVariants } from './Button.styles';\nimport { PRESSED_STYLES, HOVER_STYLES, HIGH_CONTRAST_HOVER, HIGH_CONTRAST_PRESSED } from '../../styles/interaction-states';\nimport {\n useButtonGroupContext,\n useButtonGroupItemContext,\n} from '../ButtonGroup/ButtonGroupContext';\nimport { buttonGroupItemVariants } from '../ButtonGroup/ButtonGroup.variants';\n\n/**\n * Button Component - 3-Layer Architecture\n * Fully accessible button with React Aria and themed styling\n *\n * Layer 1: Touch Target (AriaButton) - 44x44px WCAG AAA compliant\n * Layer 2: Visual Button (span) - configurable appearance\n * Layer 3: Content (children) - text, icons, effects\n */\nconst Button = memo(forwardRef<HTMLButtonElement, ButtonProps>(\n (\n {\n className,\n buttonVisualClassName,\n variant,\n size,\n visualSize,\n fullWidth,\n loading = false,\n loadingText = \"Loading...\",\n shortcut,\n children,\n isDisabled,\n paywall = false,\n paywallRedirect,\n paywallDescription,\n onPress,\n ...props\n },\n ref\n ) => {\n const paywallDescriptionId = useId();\n\n // ==========================================================================\n // ButtonGroup Context Integration\n // ==========================================================================\n\n // Consume group-level context (variant, size, isDisabled, orientation)\n const groupContext = useButtonGroupContext();\n\n // Consume item-level context (position for border-radius styling)\n const itemContext = useButtonGroupItemContext();\n\n // Merge context values with props (props take precedence)\n const effectiveVariant = variant ?? groupContext?.variant ?? 'default';\n const effectiveSize = size ?? groupContext?.size;\n const effectiveIsDisabled = isDisabled ?? groupContext?.isDisabled ?? false;\n\n // In vertical groups, buttons should be full width automatically\n const isInVerticalGroup = groupContext?.orientation === 'vertical';\n const effectiveFullWidth = fullWidth || isInVerticalGroup;\n\n // Position styling for ButtonGroup (only applied when in a group)\n const positionClassName = itemContext\n ? buttonGroupItemVariants({\n orientation: groupContext?.orientation ?? 'horizontal',\n position: itemContext.position,\n })\n : '';\n\n // Default visualSize to size for backward compatibility\n const effectiveVisualSize = visualSize ?? effectiveSize ?? 'default';\n\n // AAA Accessibility: Warn in dev/test if icon/dot variant lacks accessible name\n if (process.env.NODE_ENV !== 'production') {\n if (\n (effectiveVisualSize === 'dot' || effectiveVisualSize === 'icon') &&\n !props['aria-label'] &&\n !children\n ) {\n console.warn(\n '[Button] visualSize=\"dot\" or \"icon\" requires aria-label when no visible text is provided (WCAG 1.1.1)'\n );\n }\n }\n\n /**\n * Handle button press - intercepts action when paywalled\n * If paywalled with redirect URL, opens in new tab\n * Otherwise, calls the normal onPress handler\n */\n const handlePress = (e: Parameters<NonNullable<AriaButtonProps['onPress']>>[0]): void => {\n if (paywall) {\n if (paywallRedirect) {\n window.open(paywallRedirect, '_blank', 'noopener,noreferrer');\n }\n // Don't call onPress when paywalled\n return;\n }\n onPress?.(e);\n };\n\n // Only set isDisabled when we have a reason to disable\n // Otherwise, let slot system control disabled state (e.g., in NumberField)\n const computedIsDisabled = effectiveIsDisabled || loading || undefined;\n\n return (\n <AriaButton\n ref={ref}\n isDisabled={computedIsDisabled}\n aria-disabled={paywall ? true : undefined}\n aria-describedby={paywall ? paywallDescriptionId : undefined}\n onPress={handlePress}\n className={cn(buttonOuterVariants({ fullWidth: effectiveFullWidth, inVerticalGroup: isInVerticalGroup }), className)}\n {...props}\n >\n {(renderProps) => (\n /* Layer 2: Visual Button */\n <span\n className={cn(\n buttonVisualVariants({\n variant: effectiveVariant,\n visualSize: effectiveVisualSize,\n paywall,\n fullWidth: effectiveFullWidth,\n }),\n // Position styling from ButtonGroup context (border-radius adjustments)\n positionClassName,\n buttonVisualClassName,\n // Layer 2 interaction styles (no focus - focus ring is on Layer 1)\n PRESSED_STYLES,\n HOVER_STYLES,\n HIGH_CONTRAST_HOVER,\n HIGH_CONTRAST_PRESSED\n )}\n data-pressed={renderProps.isPressed || undefined}\n >\n {/* Layer 3: Content & Effects */}\n\n {/* FR-033: Loading spinner with screen reader announcement */}\n {/* Uses motion-safe: for WCAG 2.3.3 AAA (Animation from Interactions) */}\n {loading && (\n <>\n <Loader2 className=\"motion-safe:animate-spin\" aria-hidden=\"true\" />\n <span className=\"sr-only\" aria-live=\"polite\">\n {loadingText}\n </span>\n </>\n )}\n\n {/* Hide children during loading */}\n {!loading && children}\n\n {/* Paywall: Lightning bolt icon */}\n {paywall && (\n <Zap\n data-testid=\"zap-icon\"\n aria-hidden=\"true\"\n className=\"ml-1\"\n />\n )}\n\n {/* Paywall: Screen reader description */}\n {paywall && (\n <span id={paywallDescriptionId} className=\"sr-only\">\n Premium feature: {paywallDescription || \"Upgrade required to access this feature\"}\n </span>\n )}\n\n {/* FR-034: Keyboard shortcut display on focus */}\n {renderProps.isFocusVisible && shortcut && (\n <kbd className=\"ml-auto hidden text-xs opacity-60 lg:inline\">\n {shortcut}\n </kbd>\n )}\n\n </span>\n )}\n </AriaButton>\n );\n }\n));\n\nButton.displayName = \"Button\";\n\nexport { Button, buttonVariants, buttonOuterVariants, buttonVisualVariants };\nexport type { ButtonProps } from './Button.types';\n","import { cva } from 'class-variance-authority';\n\n/**\n * BulkActionBar wrapper. Appears above the table when rows are selected.\n * Sticky by default so it stays reachable while the user scrolls + selects.\n */\nexport const bulkActionBarVariants = cva(\n [\n 'flex items-center justify-between gap-3 flex-wrap',\n 'px-4 py-2.5',\n // Selection band — the same `--selected` token as selected rows, so a\n // selected row visually connects to the bar. Theme-aware (light lilac / dark violet).\n 'bg-[var(--selected)]',\n ],\n {\n variants: {\n sticky: {\n // Sticks to the top of the table's scroll container (no drop shadow).\n true: 'sticky top-0 z-[6]',\n false: '',\n },\n framed: {\n // Standalone (outside the Table's toolbar slot): a self-contained Card\n // — full border + rounded corners, matching `Card`.\n true: 'rounded-lg border border-[var(--border)]',\n // In the Table card frame: just a bottom rule continuing the header divider.\n false: 'border-b border-[var(--border)]',\n },\n },\n defaultVariants: {\n sticky: true,\n framed: false,\n },\n }\n);\n\n/** The roving toolbar region inside the bar. */\nexport const bulkActionToolbarVariants = cva([\n 'flex items-center gap-3 flex-wrap w-full justify-between',\n]);\n\n/** The visible (decorative) jump-shortcut hint. */\nexport const bulkActionHintVariants = cva([\n 'text-sm text-[var(--content-muted)] inline-flex items-center gap-1.5',\n]);\n\n/** The kbd key inside the jump-shortcut hint. */\nexport const bulkActionKbdVariants = cva([\n 'inline-flex items-center justify-center',\n 'min-w-[1.5rem] h-6 px-1.5 rounded',\n 'border border-[var(--primary)]/40 bg-[var(--content-background)]',\n 'font-mono text-xs font-semibold text-[var(--primary-action)]',\n]);\n\n/** A bulk action button — outline on the lilac band, brand-coloured text + icon. */\nexport const bulkActionButtonVariants = cva([\n 'text-[var(--primary-action)] border-[var(--primary)]/30',\n 'hover:bg-[var(--content-background)]',\n]);\n","'use client';\n\n/**\n * BulkActionBar — a labelled toolbar shown above a Table when rows are selected.\n *\n * - `role=\"toolbar\"` single tab stop with arrow-key roving + Home/End.\n * - A persistent visually-hidden `role=\"status\"` region announces the selection\n * (\"N selected\"), so screen-reader users know the actions appeared.\n * - Sticky by default so it stays reachable while scrolling + selecting.\n * - Selection is consumer-owned: the bar is a pure view of `selectedCount` plus\n * consumer-supplied actions. Pair with {@link useBulkActionShortcut} for the\n * \"jump to actions\" keyboard shortcut.\n *\n * @see WCAG 2.2 AAA — 4.1.3 (status messages), 2.4.3 (focus order), 2.5.5 (44px targets)\n */\n\nimport {\n forwardRef,\n useEffect,\n useRef,\n useState,\n type KeyboardEvent,\n type Ref,\n} from 'react';\nimport { Button } from '../Button';\nimport { cn } from '../../utils/cn';\nimport {\n bulkActionBarVariants,\n bulkActionToolbarVariants,\n bulkActionHintVariants,\n bulkActionKbdVariants,\n bulkActionButtonVariants,\n} from './BulkActionBar.styles';\nimport type { BulkActionBarProps } from './BulkActionBar.types';\n\nfunction setRef<T>(ref: Ref<T> | undefined, value: T | null): void {\n if (typeof ref === 'function') ref(value);\n else if (ref) (ref as { current: T | null }).current = value;\n}\n\nconst BulkActionBar = forwardRef<HTMLDivElement, BulkActionBarProps>(\n (\n {\n selectedCount,\n actions,\n onAction,\n onClearSelection,\n sticky = true,\n framed = false,\n showJumpHint = false,\n shortcutKey = 'A',\n labels,\n className,\n 'data-testid': dataTestId = 'bulk-action-bar',\n },\n forwardedRef\n ) => {\n const wrapperRef = useRef<HTMLDivElement | null>(null);\n const prevCount = useRef(selectedCount);\n\n // Roving tabindex over the logical order [Clear, ...actions].\n const itemRefs = useRef<(HTMLButtonElement | null)[]>([]);\n const [active, setActive] = useState(0);\n const total = actions.length + 1;\n const safeActive = Math.min(active, total - 1);\n\n const focusItem = (index: number): void => {\n const next = (index + total) % total;\n setActive(next);\n itemRefs.current[next]?.focus();\n };\n\n const onToolbarKeyDown = (event: KeyboardEvent<HTMLDivElement>): void => {\n switch (event.key) {\n case 'ArrowRight':\n case 'ArrowDown':\n event.preventDefault();\n focusItem(safeActive + 1);\n break;\n case 'ArrowLeft':\n case 'ArrowUp':\n event.preventDefault();\n focusItem(safeActive - 1);\n break;\n case 'Home':\n event.preventDefault();\n focusItem(0);\n break;\n case 'End':\n event.preventDefault();\n focusItem(total - 1);\n break;\n default:\n break;\n }\n };\n\n // Focus restoration: when the selection drops to 0 the toolbar unmounts. If\n // focus was inside it (e.g. on \"Clear\"), the browser drops focus to <body>.\n // Move it to the persistent wrapper instead so keyboard users keep their place.\n useEffect(() => {\n const previous = prevCount.current;\n prevCount.current = selectedCount;\n if (previous > 0 && selectedCount === 0) {\n const activeEl = document.activeElement;\n if (!activeEl || activeEl === document.body) {\n wrapperRef.current?.focus();\n }\n }\n }, [selectedCount]);\n\n const hasSelection = selectedCount > 0;\n const showHint = showJumpHint && Boolean(labels.jumpHint);\n\n // Live announcement: \"N selected. M actions available. Press A to jump…\"\n let liveText = '';\n if (hasSelection) {\n const parts = [labels.selectedCount(selectedCount)];\n if (labels.actionsAvailable) parts.push(labels.actionsAvailable(actions.length));\n if (showJumpHint && labels.jumpAnnouncement) parts.push(labels.jumpAnnouncement);\n liveText = parts.join('. ');\n }\n\n return (\n <div\n ref={(node) => {\n wrapperRef.current = node;\n setRef(forwardedRef, node);\n }}\n tabIndex={-1}\n className={cn('outline-none', className)}\n data-testid={dataTestId}\n >\n {/* Persistent live region — always mounted so the announcement fires reliably. */}\n <div className=\"sr-only\" role=\"status\" aria-live=\"polite\">\n {liveText}\n </div>\n\n {hasSelection && (\n <div className={bulkActionBarVariants({ sticky, framed })}>\n <div\n role=\"toolbar\"\n aria-label={labels.toolbarLabel(selectedCount)}\n aria-orientation=\"horizontal\"\n onKeyDown={onToolbarKeyDown}\n className={bulkActionToolbarVariants()}\n >\n <div className=\"flex items-center gap-4 flex-wrap\">\n <span className=\"text-sm font-bold text-[var(--content-foreground)]\">\n {labels.selectedCount(selectedCount)}\n </span>\n <Button\n ref={(node) => {\n itemRefs.current[0] = node;\n }}\n variant=\"link\"\n excludeFromTabOrder={safeActive !== 0}\n onFocus={() => setActive(0)}\n onPress={onClearSelection}\n >\n {labels.clear}\n </Button>\n {showHint && labels.jumpHint && (\n <span aria-hidden=\"true\" className={bulkActionHintVariants()}>\n {labels.jumpHint(<kbd className={bulkActionKbdVariants()}>{shortcutKey}</kbd>)}\n </span>\n )}\n </div>\n <div className=\"flex items-center gap-2 flex-wrap\">\n {actions.map((action, index) => {\n const itemIndex = index + 1;\n return (\n <Button\n key={action.id}\n ref={(node) => {\n itemRefs.current[itemIndex] = node;\n }}\n variant={action.tone === 'danger' ? 'destructive' : 'outline'}\n buttonVisualClassName={\n action.tone === 'danger' ? undefined : bulkActionButtonVariants()\n }\n isDisabled={action.isDisabled}\n excludeFromTabOrder={safeActive !== itemIndex}\n onFocus={() => setActive(itemIndex)}\n onPress={() => onAction(action.id)}\n >\n {action.icon != null && (\n <span aria-hidden=\"true\" className=\"inline-flex\">\n {action.icon}\n </span>\n )}\n {action.label}\n </Button>\n );\n })}\n </div>\n </div>\n </div>\n )}\n </div>\n );\n }\n);\n\nBulkActionBar.displayName = 'BulkActionBar';\n\nexport { BulkActionBar };\nexport {\n bulkActionBarVariants,\n bulkActionToolbarVariants,\n bulkActionHintVariants,\n} from './BulkActionBar.styles';\n","import type { Selection, Key } from 'react-aria-components';\n\n/**\n * Resolve a React-Aria {@link Selection} to a concrete count.\n *\n * React-Aria's `selectedKeys` can be the string sentinel `'all'` (emitted by the\n * select-all header checkbox), which has no `.size`. Passing `selectedKeys.size`\n * blindly therefore throws/NaNs exactly when everything is selected. This helper\n * resolves it correctly.\n *\n * @param selectedKeys The controlled `Selection` (`'all'` or a `Set<Key>`).\n * @param selectableKeys The keys currently eligible for selection — i.e. the rows\n * the table is rendering, with any disabled rows already excluded by the\n * consumer. When `selectedKeys` is `'all'`, the result is the size of this set.\n * @returns the number of selected rows.\n *\n * @example\n * const count = resolveSelectedCount(selectedKeys, positions.map((p) => p.id));\n */\nexport function resolveSelectedCount(\n selectedKeys: Selection,\n selectableKeys: Iterable<Key>\n): number {\n if (selectedKeys === 'all') {\n let count = 0;\n for (const _key of selectableKeys) {\n void _key;\n count += 1;\n }\n return count;\n }\n return selectedKeys.size;\n}\n","'use client';\n\nimport { useEffect } from 'react';\nimport type { RefObject } from 'react';\n\nexport interface UseBulkActionShortcutOptions {\n /**\n * The element the shortcut listens within — pass the table's scroll container\n * ref. Pressing the key while focus is inside this scope jumps focus to the\n * bulk toolbar. The listener is attached to this element, never `document` /\n * `window`, so two independent tables never fight over the key.\n */\n scopeRef: RefObject<HTMLElement | null>;\n /** Ref to the {@link BulkActionBar} (its outer element). Focus lands on its current roving item. */\n toolbarRef: RefObject<HTMLElement | null>;\n /** The shortcut key. Default `'a'` (case-insensitive). */\n key?: string;\n /** Disable the shortcut while keeping the toolbar fully usable. Default `false`. */\n disabled?: boolean;\n}\n\nconst TEXT_INPUT_TYPES = new Set([\n 'text',\n 'search',\n 'email',\n 'url',\n 'tel',\n 'number',\n 'password',\n]);\n\n/**\n * True when the event originated in a text-entry context, where a single-letter\n * shortcut must NOT fire. Stricter than a native-input check: also covers\n * `contenteditable` and the ARIA roles React-Aria inputs apply\n * (`textbox` / `searchbox` / `combobox`).\n */\nfunction isTextEntryTarget(target: EventTarget | null): boolean {\n if (!(target instanceof HTMLElement)) return false;\n if (target.isContentEditable) return true;\n if (target.closest('[contenteditable=\"\"],[contenteditable=\"true\"]')) return true;\n const tag = target.tagName;\n if (tag === 'TEXTAREA' || tag === 'SELECT') return true;\n if (tag === 'INPUT' && TEXT_INPUT_TYPES.has((target as HTMLInputElement).type)) {\n return true;\n }\n const role = target.getAttribute('role');\n return role === 'textbox' || role === 'searchbox' || role === 'combobox';\n}\n\n/**\n * Opt-in keyboard shortcut that jumps focus to a {@link BulkActionBar} from\n * anywhere within a scope (typically the table's scroll container) — so users\n * can stay on the row checkboxes while selecting, then jump to the actions on\n * demand.\n *\n * WCAG 2.1.4 (Character Key Shortcuts): the shortcut is single-character but\n * (a) can be turned off (`disabled`, or simply don't call the hook) and\n * (b) is active only when focus is within `scopeRef` and not in a text field —\n * both valid mitigations.\n */\nexport function useBulkActionShortcut({\n scopeRef,\n toolbarRef,\n key = 'a',\n disabled = false,\n}: UseBulkActionShortcutOptions): void {\n useEffect(() => {\n if (disabled) return;\n const scope = scopeRef.current;\n if (!scope) return;\n\n const onKeyDown = (event: KeyboardEvent): void => {\n if (event.metaKey || event.ctrlKey || event.altKey) return;\n if (event.key.toLowerCase() !== key.toLowerCase()) return;\n if (isTextEntryTarget(event.target)) return;\n\n const toolbar = toolbarRef.current;\n if (!toolbar) return;\n const target =\n toolbar.querySelector<HTMLElement>('[tabindex=\"0\"]') ??\n toolbar.querySelector<HTMLElement>('button:not([disabled])');\n if (target) {\n event.preventDefault();\n target.focus();\n }\n };\n\n scope.addEventListener('keydown', onKeyDown);\n return () => scope.removeEventListener('keydown', onKeyDown);\n }, [scopeRef, toolbarRef, key, disabled]);\n}\n","/**\n * Shared CVA Variant Utilities\n *\n * Common patterns extracted from component variants for consistency and reduced bundle size.\n * Use these constants in CVA definitions to ensure consistent styling across Themis.\n *\n * @see interaction-states.ts for interaction-specific styles (focus, hover, pressed)\n */\n\n// =============================================================================\n// Focus Ring Patterns\n// =============================================================================\n\n/**\n * Focus-within ring (for container elements with focusable children)\n * Use when the container should show focus when any child is focused\n */\nexport const FOCUS_WITHIN_RING = [\n 'focus-within:outline-none',\n 'focus-within:ring-2',\n 'focus-within:ring-[var(--ring)]',\n 'focus-within:ring-offset-2',\n] as const;\n\n/**\n * Focus-visible ring (for directly focusable elements)\n * Use for buttons, inputs, and other interactive elements\n */\nexport const FOCUS_VISIBLE_RING = [\n 'focus-visible:outline-none',\n 'focus-visible:ring-2',\n 'focus-visible:ring-[var(--ring)]',\n 'focus-visible:ring-offset-2',\n] as const;\n\n/**\n * Standard focus ring (for elements using :focus pseudo-class)\n * Prefer focus-visible when possible for better UX\n */\nexport const FOCUS_RING = [\n 'focus:outline-none',\n 'focus:ring-2',\n 'focus:ring-[var(--ring)]',\n] as const;\n\n/**\n * Focus with background change (for segments, cells, menu items)\n */\nexport const FOCUS_HIGHLIGHT = [\n 'focus:outline-none',\n 'focus:bg-[var(--accent)]',\n 'focus:text-[var(--accent-foreground)]',\n] as const;\n\n// =============================================================================\n// Disabled State Patterns\n// =============================================================================\n\n/**\n * Standard disabled state using disabled attribute\n */\nexport const DISABLED_STANDARD = [\n 'disabled:pointer-events-none',\n 'disabled:opacity-50',\n] as const;\n\n/**\n * Disabled state using data attribute (React Aria pattern)\n */\nexport const DISABLED_DATA_ATTR = [\n 'data-[disabled]:pointer-events-none',\n 'data-[disabled]:opacity-50',\n 'data-[disabled]:cursor-not-allowed',\n] as const;\n\n// =============================================================================\n// Size-Based Text Variants\n// =============================================================================\n\n/**\n * Small text size scale (xs -> sm -> base)\n */\nexport const TEXT_SIZE_SMALL_SCALE = {\n sm: 'text-xs',\n default: 'text-sm',\n lg: 'text-base',\n} as const;\n\n/**\n * Medium text size scale (sm -> base -> lg)\n */\nexport const TEXT_SIZE_MEDIUM_SCALE = {\n sm: 'text-sm',\n default: 'text-base',\n lg: 'text-lg',\n} as const;\n\n// =============================================================================\n// Touch Target Utilities\n// =============================================================================\n\n/**\n * WCAG 2.2 AAA minimum touch target (44x44px)\n */\nexport const TOUCH_TARGET_MIN = [\n 'min-h-[44px]',\n 'min-w-[44px]',\n] as const;\n\n/**\n * Common button/cell sizes with touch target compliance\n */\nexport const INTERACTIVE_SIZES = {\n sm: 'h-9 w-9', // 36px - desktop only, NOT AAA compliant\n default: 'h-11 w-11', // 44px - AAA compliant\n lg: 'h-14 w-14', // 56px - AAA compliant, enhanced\n} as const;\n\n/**\n * Height-only sizes for fields and inputs\n */\nexport const FIELD_HEIGHTS = {\n sm: 'h-9', // 36px\n default: 'h-10', // 40px\n lg: 'h-11', // 44px\n} as const;\n\n/**\n * Layer 2: Visual sizing for form field inputs (height + padding + font).\n * Use on the <input>, <select>, or trigger element itself.\n *\n * Components may append additional classes (e.g. gap-* for segmented fields, py-* for text inputs).\n */\nexport const FIELD_INPUT_SIZES = {\n sm: `${FIELD_HEIGHTS.sm} px-2 text-xs`,\n default: `${FIELD_HEIGHTS.default} px-3 text-sm`,\n lg: `${FIELD_HEIGHTS.lg} px-4 text-base`,\n} as const;\n\n/**\n * Layer 1: Invisible touch target wrapper for form fields.\n * Apply to a <label> (or wrapper div) around the input element.\n * The <label> natively routes clicks/taps to the contained input\n * without JavaScript — achieving a 44px touch target while the\n * input stays at its visual height (h-9/h-10/h-11).\n */\nexport const FIELD_TOUCH_TARGET = 'min-h-[44px] flex items-center' as const;\n\n// =============================================================================\n// Message/Feedback Patterns\n// =============================================================================\n\n/**\n * Error message styling\n */\nexport const ERROR_MESSAGE_BASE = [\n 'flex',\n 'items-center',\n 'gap-1.5',\n 'text-[var(--destructive-background)]',\n] as const;\n\n/**\n * Success message styling\n */\nexport const SUCCESS_MESSAGE_BASE = [\n 'flex',\n 'items-center',\n 'gap-1.5',\n 'text-[var(--success-background)]',\n] as const;\n\n/**\n * Description/helper text styling\n */\nexport const DESCRIPTION_BASE = [\n 'text-[var(--menu-muted)]',\n] as const;\n\n/**\n * Label base styling\n */\nexport const LABEL_BASE = [\n 'font-medium',\n 'text-[var(--content-foreground)]',\n] as const;\n\n/**\n * Required indicator pattern\n */\nexport const REQUIRED_INDICATOR = \"after:content-['*'] after:ml-0.5 after:text-[var(--destructive-background)]\";\n\n// =============================================================================\n// Animation Patterns\n// =============================================================================\n\n/**\n * Popover/dropdown entry animation\n */\nexport const POPOVER_ANIMATION_IN = [\n 'data-[entering]:animate-in',\n 'data-[entering]:fade-in-0',\n 'data-[entering]:zoom-in-95',\n] as const;\n\n/**\n * Popover/dropdown exit animation\n */\nexport const POPOVER_ANIMATION_OUT = [\n 'data-[exiting]:animate-out',\n 'data-[exiting]:fade-out-0',\n 'data-[exiting]:zoom-out-95',\n] as const;\n\n/**\n * Modal content enter animation (fade + zoom)\n * Uses React Aria data-[entering]/data-[exiting] attributes\n */\nexport const MODAL_ANIMATION_IN = [\n 'data-[entering]:animate-in',\n 'data-[entering]:fade-in-0',\n 'data-[entering]:zoom-in-95',\n 'data-[entering]:duration-200',\n 'data-[entering]:ease-out',\n] as const;\n\n/**\n * Modal content exit animation (fade + zoom)\n * Uses React Aria data-[entering]/data-[exiting] attributes\n */\nexport const MODAL_ANIMATION_OUT = [\n 'data-[exiting]:animate-out',\n 'data-[exiting]:fade-out-0',\n 'data-[exiting]:zoom-out-95',\n 'data-[exiting]:duration-150',\n 'data-[exiting]:ease-in',\n] as const;\n\n/**\n * Modal slide enter animation (fade + slide up)\n */\nexport const MODAL_SLIDE_IN = [\n 'data-[entering]:animate-in',\n 'data-[entering]:fade-in-0',\n 'data-[entering]:slide-in-from-bottom-4',\n 'data-[entering]:duration-200',\n 'data-[entering]:ease-out',\n] as const;\n\n/**\n * Modal slide exit animation (fade + slide down)\n */\nexport const MODAL_SLIDE_OUT = [\n 'data-[exiting]:animate-out',\n 'data-[exiting]:fade-out-0',\n 'data-[exiting]:slide-out-to-bottom-4',\n 'data-[exiting]:duration-150',\n 'data-[exiting]:ease-in',\n] as const;\n\n/**\n * Directional slide animations for edge-anchored drawers (Modal `position` variant).\n *\n * Unitless `slide-in-from-*` / `slide-out-to-*` translate the full extent of the\n * element (100%), so the drawer slides all the way in from / out to its anchored\n * edge — distinct from `MODAL_SLIDE_*` above, which is the small 1rem nudge used by\n * the centred `slide` animation. No `fade` is paired here: a drawer slides, it\n * does not fade. Honour `prefers-reduced-motion` via REDUCED_MOTION on the element.\n */\nexport const MODAL_SLIDE_IN_LEFT = [\n 'data-[entering]:animate-in',\n 'data-[entering]:slide-in-from-left',\n 'data-[entering]:duration-200',\n 'data-[entering]:ease-out',\n] as const;\n\nexport const MODAL_SLIDE_OUT_LEFT = [\n 'data-[exiting]:animate-out',\n 'data-[exiting]:slide-out-to-left',\n 'data-[exiting]:duration-150',\n 'data-[exiting]:ease-in',\n] as const;\n\nexport const MODAL_SLIDE_IN_RIGHT = [\n 'data-[entering]:animate-in',\n 'data-[entering]:slide-in-from-right',\n 'data-[entering]:duration-200',\n 'data-[entering]:ease-out',\n] as const;\n\nexport const MODAL_SLIDE_OUT_RIGHT = [\n 'data-[exiting]:animate-out',\n 'data-[exiting]:slide-out-to-right',\n 'data-[exiting]:duration-150',\n 'data-[exiting]:ease-in',\n] as const;\n\nexport const MODAL_SLIDE_IN_TOP = [\n 'data-[entering]:animate-in',\n 'data-[entering]:slide-in-from-top',\n 'data-[entering]:duration-200',\n 'data-[entering]:ease-out',\n] as const;\n\nexport const MODAL_SLIDE_OUT_TOP = [\n 'data-[exiting]:animate-out',\n 'data-[exiting]:slide-out-to-top',\n 'data-[exiting]:duration-150',\n 'data-[exiting]:ease-in',\n] as const;\n\nexport const MODAL_SLIDE_IN_BOTTOM = [\n 'data-[entering]:animate-in',\n 'data-[entering]:slide-in-from-bottom',\n 'data-[entering]:duration-200',\n 'data-[entering]:ease-out',\n] as const;\n\nexport const MODAL_SLIDE_OUT_BOTTOM = [\n 'data-[exiting]:animate-out',\n 'data-[exiting]:slide-out-to-bottom',\n 'data-[exiting]:duration-150',\n 'data-[exiting]:ease-in',\n] as const;\n\n/**\n * Modal overlay enter/exit animation (fade only)\n */\nexport const MODAL_OVERLAY_IN = [\n 'data-[entering]:animate-in',\n 'data-[entering]:fade-in-0',\n 'data-[entering]:duration-200',\n] as const;\n\nexport const MODAL_OVERLAY_OUT = [\n 'data-[exiting]:animate-out',\n 'data-[exiting]:fade-out-0',\n 'data-[exiting]:duration-150',\n] as const;\n\n/**\n * Reduced motion support (WCAG 2.2)\n */\nexport const REDUCED_MOTION = [\n 'motion-reduce:transition-none',\n 'motion-reduce:animate-none',\n] as const;\n\n/**\n * Standard transition for colors\n */\nexport const TRANSITION_COLORS = [\n 'transition-colors',\n 'duration-200',\n] as const;\n\n/**\n * Fast transition for interactions\n */\nexport const TRANSITION_FAST = [\n 'transition-colors',\n 'duration-150',\n] as const;\n\n// =============================================================================\n// Hover State Patterns\n// =============================================================================\n\n/**\n * Accent background on hover (for interactive items)\n */\nexport const HOVER_ACCENT = [\n 'hover:bg-[var(--accent)]',\n 'hover:text-[var(--accent-foreground)]',\n] as const;\n\n// =============================================================================\n// Helper Functions\n// =============================================================================\n\n/**\n * Combines multiple style arrays into a flat array for CVA base styles\n */\nexport function combineStyles(...styles: (readonly string[] | string)[]): string[] {\n return styles.flatMap(s => Array.isArray(s) ? [...s] : [s]);\n}\n","/**\n * Detection + dismissal guard for in-page writing-assistant browser extensions\n * (Grammarly, LanguageTool, Wordtune, …).\n *\n * These extensions inject their suggestion UI as elements appended to `<body>`,\n * outside any open overlay's DOM subtree. React Aria's `isDismissable` behaviour\n * treats a click on that injected UI as an \"outside click\" and dismisses the\n * overlay — so clicking a spelling suggestion silently closes the form pop-up\n * and discards the user's in-progress correction.\n *\n * The guard below lets overlays keep open when the interaction lands on an\n * extension-injected node, while every other outside click, Escape, and the\n * close button behave exactly as before.\n */\n\nconst MAX_ANCESTOR_DEPTH = 100;\n\n/**\n * Returns `true` when `element` belongs to an injected in-page writing\n * assistant (Grammarly, LanguageTool, Wordtune, …).\n *\n * UX-ONLY heuristic. This is a deliberately spoofable DOM sniff used solely to\n * keep a form pop-up open when a writing-assistant suggestion is clicked. It is\n * NOT a security/authorization control and must never gate access to data or\n * actions (the frontend is not a security boundary). Pure function — never log\n * the element (it can reference arbitrary DOM / user content).\n */\nexport function isExtensionInjectedElement(element: Element): boolean {\n if (!(element instanceof Element)) return false;\n\n // 1. Known-vendor markers (authoritative). Walk up via parentElement, and\n // climb shadow boundaries via getRootNode().host so detection still finds\n // the <grammarly-extension> host if React Aria's shadowDOM flag is ever\n // enabled (it defaults to false today → the document-level listener\n // already receives the retargeted host, so the parentElement walk alone\n // suffices currently). Depth-bounded as a defensive guard against a\n // crafted/overridden getRootNode/host returning a cycle (which would\n // otherwise hang the tab — a client-side DoS).\n let node: Element | null = element;\n for (let depth = 0; node && depth < MAX_ANCESTOR_DEPTH; depth++) {\n const tag = node.tagName?.toLowerCase() ?? '';\n if (tag.startsWith('grammarly-')) return true; // Grammarly\n if (tag.startsWith('lt-')) return true; // LanguageTool\n if (node.hasAttribute('data-grammarly-shadow-root')) return true;\n\n if (node.parentElement) {\n node = node.parentElement;\n } else {\n const root = node.getRootNode();\n node = root instanceof ShadowRoot ? root.host : null;\n }\n }\n\n // 2. Structural fallback (best-effort, future-proofs the long tail).\n // Extensions inject their UI as a custom element (hyphenated tag name)\n // mounted as a top-level sibling of the React root — i.e. a direct child\n // of <body>/<html>. Our app never renders body-level custom elements, and\n // React Aria portals render plain <div>s, so this stays safe for any\n // future first-party web component nested inside the app tree.\n let custom: Element | null = element;\n while (custom && !custom.tagName.includes('-')) {\n custom = custom.parentElement;\n }\n if (!custom) return false;\n\n const parent = custom.parentElement;\n return parent === document.body || parent === document.documentElement;\n}\n\n/**\n * Builds a `shouldCloseOnInteractOutside` predicate for React Aria overlays\n * that keeps the overlay open when the interaction targets an extension-injected\n * element, while preserving any consumer-supplied predicate.\n *\n * React Aria semantics: the predicate returns `true` ⇒ the overlay should\n * close. So we close only when the element is NOT extension-injected AND the\n * consumer (if any) also agrees it should close.\n */\nexport function createInteractOutsideGuard(\n consumerShouldClose?: (element: Element) => boolean,\n): (element: Element) => boolean {\n return (element: Element): boolean =>\n !isExtensionInjectedElement(element) && (consumerShouldClose?.(element) ?? true);\n}\n","import { cva, type VariantProps } from 'class-variance-authority';\nimport { FIELD_INPUT_SIZES } from '../../styles';\n\n/**\n * CVA Variants for Select Trigger Button\n *\n * Styles the trigger button that opens the select popover.\n * All sizes enforce 44px minimum touch targets for WCAG 2.2 AAA compliance.\n */\nexport const selectTriggerVariants = cva(\n [\n // Base styles\n 'flex',\n 'w-full',\n 'items-center',\n 'justify-between',\n 'gap-2',\n 'rounded-md',\n 'border',\n 'bg-[var(--content-background)]',\n 'text-[var(--content-foreground)]',\n 'transition-colors',\n 'duration-200',\n 'outline-none',\n // Focus ring (WCAG 2.2 AAA - 7:1 contrast)\n 'focus-visible:ring-2',\n 'focus-visible:ring-[var(--ring)]',\n 'focus-visible:ring-offset-2',\n // Hover state\n 'hover:bg-[var(--accent)]/10',\n // Disabled state\n 'disabled:cursor-not-allowed',\n 'disabled:opacity-50',\n // Loading state\n 'data-[loading=true]:cursor-wait',\n // Truncate text\n 'truncate',\n ],\n {\n variants: {\n size: {\n sm: `${FIELD_INPUT_SIZES.sm} pr-1`,\n default: `${FIELD_INPUT_SIZES.default} pr-1.5`,\n lg: `${FIELD_INPUT_SIZES.lg} pr-2`,\n },\n isInvalid: {\n true: 'border-[var(--destructive-background)]',\n false: 'border-[var(--input-border)] hover:border-[var(--input-border)]/80',\n },\n },\n defaultVariants: {\n size: 'default',\n isInvalid: false,\n },\n }\n);\n\n/**\n * CVA Variants for Select Items\n *\n * Styles individual selectable items within the listbox.\n * All sizes enforce 44px minimum touch targets for WCAG 2.2 AAA compliance.\n */\nexport const selectItemVariants = cva(\n [\n // Base styles\n 'relative',\n 'flex',\n 'w-full',\n 'cursor-pointer',\n 'select-none',\n 'items-center',\n 'rounded-sm',\n 'outline-none',\n 'transition-colors',\n // Padding for checkmark icon (left side)\n 'pl-8',\n 'pr-2',\n // Hover state\n 'hover:bg-[var(--accent)]',\n 'hover:text-[var(--accent-foreground)]',\n // Focus state\n 'focus:bg-[var(--accent)]',\n 'focus:text-[var(--accent-foreground)]',\n // Selected state\n 'data-[selected=true]:bg-[var(--accent)]',\n 'data-[selected=true]:text-[var(--accent-foreground)]',\n // Disabled state\n 'data-[disabled=true]:pointer-events-none',\n 'data-[disabled=true]:opacity-50',\n 'data-[disabled=true]:text-[var(--menu-muted)]',\n ],\n {\n variants: {\n size: {\n sm: `${FIELD_INPUT_SIZES.sm} py-1`,\n default: `${FIELD_INPUT_SIZES.default} py-2`,\n lg: `${FIELD_INPUT_SIZES.lg} py-3`,\n },\n },\n defaultVariants: {\n size: 'default',\n },\n }\n);\n\n/**\n * CVA Variants for Select Popover\n *\n * Styles the popover container that holds the listbox.\n * Uses menu tokens to match Dropdown styling.\n */\nexport const selectPopoverVariants = cva(\n [\n // Base styles - use menu tokens to match Dropdown styling\n 'z-50',\n 'w-[--trigger-width]',\n 'rounded-md',\n 'border',\n 'border-[var(--menu-border)]',\n 'bg-[var(--menu-background)]',\n 'text-[var(--menu-foreground)]',\n 'outline-none',\n 'overflow-auto',\n // Animations\n 'data-[entering]:animate-in',\n 'data-[entering]:fade-in-0',\n 'data-[entering]:zoom-in-95',\n 'data-[exiting]:animate-out',\n 'data-[exiting]:fade-out-0',\n 'data-[exiting]:zoom-out-95',\n ],\n {\n variants: {\n size: {\n sm: 'max-h-[200px] p-1',\n default: 'max-h-[300px] p-1',\n lg: 'max-h-[400px] p-1',\n },\n },\n defaultVariants: {\n size: 'default',\n },\n }\n);\n\n/**\n * CVA Variants for Section Headers\n *\n * Styles the non-interactive section header labels within grouped selects.\n */\nexport const selectSectionVariants = cva(\n [\n 'px-2',\n 'py-1.5',\n 'text-xs',\n 'font-semibold',\n 'text-[var(--menu-muted)]',\n 'uppercase',\n 'tracking-wider',\n ],\n {\n variants: {\n size: {\n sm: 'px-2 py-1 text-[10px]',\n default: 'px-2 py-1 text-xs',\n lg: 'px-2 py-1.5 text-xs',\n },\n },\n defaultVariants: {\n size: 'default',\n },\n }\n);\n\n/**\n * CVA Variants for Error Messages\n *\n * Styles the error message displayed below the select trigger.\n */\nexport const selectErrorVariants = cva(\n [\n 'flex',\n 'items-center',\n 'gap-1.5',\n 'text-sm',\n 'font-medium',\n 'text-[var(--destructive-background)]',\n // mt-1 (4px) per design spec \"Input → hint: 4px\"; variants below override for size\n 'mt-1',\n ],\n {\n variants: {\n size: {\n sm: 'text-xs mt-1',\n default: 'text-sm mt-1',\n lg: 'text-base mt-1',\n },\n },\n defaultVariants: {\n size: 'default',\n },\n }\n);\n\n/**\n * Type exports for variant props.\n * Allows TypeScript inference of variant combinations.\n */\nexport type SelectTriggerVariantProps = VariantProps<typeof selectTriggerVariants>;\nexport type SelectItemVariantProps = VariantProps<typeof selectItemVariants>;\nexport type SelectPopoverVariantProps = VariantProps<typeof selectPopoverVariants>;\nexport type SelectSectionVariantProps = VariantProps<typeof selectSectionVariants>;\nexport type SelectErrorVariantProps = VariantProps<typeof selectErrorVariants>;\n","'use client';\n\n/**\n * Select Component - Implementation\n *\n * Accessible select/dropdown component combining React Aria primitives with ShadCN styling.\n * Follows Themis library patterns with compound component structure.\n *\n * Architecture:\n * - SelectBase: Internal component containing shared label, description, trigger, error, and listbox rendering.\n * - SelectRoot: Single selection wrapper (thin layer over SelectBase).\n * - MultiSelectRoot: Multiple selection wrapper with display value logic (thin layer over SelectBase).\n * - SelectItem, SelectSection, SelectHeader: Compound sub-components.\n *\n * @see select-prd.md (Full requirements)\n * @see Select.types.ts (Zod schemas)\n * @see Select.styles.ts (CVA variant definitions)\n * @see plan.md (Implementation plan)\n */\n\nimport {\n forwardRef,\n memo,\n Children,\n useId,\n useMemo,\n isValidElement,\n type ReactElement,\n type ReactNode,\n type Ref,\n} from 'react';\nimport {\n Select as AriaSelect,\n Label,\n Button,\n SelectValue,\n Popover,\n ListBox,\n ListBoxItem,\n ListBoxSection,\n Header,\n Text,\n FieldError,\n} from 'react-aria-components';\nimport { Check, CheckSquare, ChevronDown, Loader2 } from 'lucide-react';\nimport { FIELD_TOUCH_TARGET } from '../../styles';\nimport { cn } from '../../utils/cn';\nimport { createInteractOutsideGuard } from '../../utils/browserExtensionOverlay';\nimport type {\n SelectProps,\n SelectItemProps,\n SelectSectionProps,\n SelectHeaderProps,\n SelectSize,\n} from './Select.types';\nimport {\n selectTriggerVariants,\n selectItemVariants,\n selectPopoverVariants,\n selectSectionVariants,\n selectErrorVariants,\n} from './Select.styles';\n\n// Re-export CVA variants so existing imports from './Select' continue to work\nexport {\n selectTriggerVariants,\n selectItemVariants,\n selectPopoverVariants,\n selectSectionVariants,\n selectErrorVariants,\n} from './Select.styles';\n\n// Hoisted static JSX — avoids re-creation on every render\nconst LOADING_SKELETON = Array.from({ length: 3 }).map((_, i) => (\n <div\n key={`skeleton-${i}`}\n className=\"h-11 px-4 py-2\"\n >\n <div className=\"h-4 bg-[var(--accent-background)] rounded animate-pulse\" />\n </div>\n));\n\n/**\n * Internal props for SelectBase.\n * Extends the shared props with selection-mode-specific configuration.\n */\ninterface SelectBaseProps {\n /** The AriaSelect props to spread onto the root element */\n ariaSelectProps: Record<string, unknown>;\n /** Content to render inside the trigger button (SelectValue for single, span for multi) */\n triggerContent: ReactNode;\n /** Ref to forward to the trigger button */\n triggerRef: Ref<HTMLButtonElement>;\n /** Label text */\n label: string;\n /** Optional description text */\n description?: string;\n /** Whether the field is required */\n isRequired: boolean;\n /** Whether the field is disabled */\n isDisabled: boolean;\n /** Whether the field is in a loading state */\n isLoading: boolean;\n /** Error message to display */\n errorMessage?: string;\n /** Size variant */\n size: SelectSize;\n /** Empty state message override */\n emptyStateMessage?: string;\n /** Child count (pre-computed by parent) */\n childCount: number;\n /** Children to render in the listbox */\n children: ReactNode;\n}\n\n/**\n * SelectBase - Internal shared rendering component\n *\n * Contains the shared rendering logic for label, description, trigger button,\n * error message, and popover/listbox that both SelectRoot and MultiSelectRoot use.\n * This is not exported as part of the public API.\n */\nfunction SelectBase({\n ariaSelectProps,\n triggerContent,\n triggerRef,\n label,\n description,\n isRequired,\n isDisabled,\n isLoading,\n errorMessage,\n size,\n emptyStateMessage,\n childCount,\n children,\n}: SelectBaseProps): ReactElement {\n // Generate unique IDs for accessibility\n const labelId = useId();\n const descriptionId = useId();\n const errorId = useId();\n\n // Determine if invalid based on errorMessage\n const isInvalid = Boolean(errorMessage);\n\n // Stack label, description, trigger and error vertically (matching TextField). Without\n // this the inline <label> and description <span> collapse onto one line, so the helper\n // text reads as part of the label instead of sitting beneath the field.\n const { className: rootClassName, ...restAriaSelectProps } = ariaSelectProps as { className?: string } & Record<string, unknown>;\n\n return (\n <AriaSelect\n {...restAriaSelectProps}\n className={cn('flex flex-col gap-1.5', rootClassName)}\n isInvalid={isInvalid}\n >\n {/* Label */}\n <Label id={labelId} className=\"text-sm font-medium text-[var(--content-foreground)]\">\n {label}\n {isRequired && <span className=\"text-[var(--destructive-background)] ml-1\">*</span>}\n </Label>\n\n {/* Description (if provided) — sits below the label; the root's gap handles spacing. */}\n {description && (\n <Text id={descriptionId} slot=\"description\" className=\"text-sm text-[var(--menu-muted)]\">\n {description}\n </Text>\n )}\n\n {/* Layer 1: Touch target (44px min) */}\n <div className={FIELD_TOUCH_TARGET}>\n {/* Layer 2: Visual trigger button */}\n <Button\n ref={triggerRef}\n className={selectTriggerVariants({ size, isInvalid })}\n aria-labelledby={labelId}\n aria-describedby={description ? descriptionId : errorMessage ? errorId : undefined}\n data-loading={isLoading}\n {...(isRequired && { 'aria-required': 'true' })}\n {...(isLoading && { 'aria-busy': 'true' })}\n {...((isDisabled || isLoading) && { 'aria-disabled': 'true' })}\n >\n {triggerContent}\n\n {/* Loading spinner or chevron icon */}\n {isLoading ? (\n <Loader2 className=\"ml-auto h-4 w-4 shrink-0 animate-spin text-[var(--menu-muted)]\" aria-hidden=\"true\" />\n ) : (\n <ChevronDown className=\"ml-auto h-4 w-4 shrink-0 text-[var(--menu-muted)]\" aria-hidden=\"true\" />\n )}\n </Button>\n </div>\n\n {/* Error Message — text only, no decorative icon. Errors are conveyed\n by the red border on the trigger plus the message text colour;\n a leading icon adds visual noise that the other field types don't\n carry (NumberField, TextField error message, RichTextEditor). */}\n <FieldError id={errorId} className={selectErrorVariants({ size })}>\n {({ validationErrors }) => {\n const displayError = errorMessage || validationErrors.join(' ');\n return displayError ? <>{displayError}</> : null;\n }}\n </FieldError>\n\n {/* Popover with ListBox */}\n <Popover\n shouldCloseOnInteractOutside={createInteractOutsideGuard()}\n className={selectPopoverVariants({ size })}\n >\n <ListBox className=\"outline-none\">\n {/* Loading skeleton (if loading and has children) */}\n {isLoading && childCount > 0 && LOADING_SKELETON}\n\n {/* Items or empty state */}\n {!isLoading && (\n <>\n {children}\n {/* Empty state - render as disabled item so popover can open */}\n {childCount === 0 && (\n <ListBoxItem\n id=\"__empty__\"\n textValue=\"empty\"\n isDisabled\n className=\"py-6 text-center text-sm text-[var(--menu-muted)] cursor-default pointer-events-none\"\n >\n <span role=\"status\">\n {emptyStateMessage || 'No options available'}\n </span>\n </ListBoxItem>\n )}\n </>\n )}\n </ListBox>\n </Popover>\n </AriaSelect>\n );\n}\n\n/**\n * Select Root Component (Single Selection Only)\n *\n * Main select component with controlled/uncontrolled modes for single selection.\n * For multiple selection, use MultiSelect component.\n * Delegates shared rendering to SelectBase.\n *\n * @see select-prd.md US-1 (Basic Single Selection)\n * @see plan.md Decision 28 (Ref forwarding to trigger button)\n */\nconst SelectRoot = forwardRef<HTMLButtonElement, Omit<SelectProps, 'selectionMode'>>(\n (\n {\n // Display props\n label,\n placeholder,\n description,\n\n // Selection props\n value,\n defaultValue,\n\n // State props\n isOpen,\n isDisabled = false,\n isRequired = false,\n disabledKeys,\n\n // Validation props\n validate,\n validationBehavior = 'aria',\n errorMessage,\n\n // Loading state\n isLoading = false,\n emptyStateMessage,\n\n // Form integration\n name,\n\n // Size variant\n size = 'default',\n\n // Event handlers\n onChange,\n onOpenChange,\n\n // Standard props\n className,\n children,\n ...props\n },\n ref\n ) => {\n // Warn if >1000 items (Decision 22: Large Item Count Handling)\n const childCount = Children.count(children);\n if (childCount > 1000) {\n console.warn(\n 'Select has >1000 items. Consider using Autocomplete component for better performance.'\n );\n }\n\n return (\n <SelectBase\n ariaSelectProps={{\n value: value as string,\n defaultValue: defaultValue as string,\n onChange: (key: unknown) => {\n if (onChange) {\n onChange(key as string);\n }\n },\n placeholder,\n disabledKeys,\n isOpen,\n onOpenChange,\n isDisabled: isDisabled || isLoading,\n isRequired,\n name,\n validate: validate as ((value: unknown) => true | string | null | undefined) | undefined,\n validationBehavior,\n className,\n ...props,\n }}\n triggerContent={<SelectValue className=\"flex-1 text-left truncate\" />}\n triggerRef={ref}\n label={label}\n description={description}\n isRequired={isRequired}\n isDisabled={isDisabled}\n isLoading={isLoading}\n errorMessage={errorMessage}\n size={size}\n emptyStateMessage={emptyStateMessage}\n childCount={childCount}\n >\n {children}\n </SelectBase>\n );\n }\n);\n\nSelectRoot.displayName = 'Select';\n\n/**\n * MultiSelect Root Component (Multiple Selection)\n *\n * Select component for multiple selection. Uses different API from single Select.\n * Delegates shared rendering to SelectBase, adding multi-select display value logic.\n *\n * @see select-prd.md US-6 (Multiple Selection)\n * @see plan.md Decision 28 (Ref forwarding to trigger button)\n */\nconst MultiSelectRoot = forwardRef<HTMLButtonElement, SelectProps>(\n (\n {\n // Display props\n label,\n placeholder,\n description,\n\n // Selection props\n value,\n defaultValue,\n selectionMode: _selectionMode = 'multiple',\n\n // State props\n isOpen,\n isDisabled = false,\n isRequired = false,\n disabledKeys,\n\n // Validation props\n validate,\n validationBehavior = 'aria',\n errorMessage,\n\n // Loading state\n isLoading = false,\n emptyStateMessage,\n\n // Form integration\n name,\n\n // Size variant\n size = 'default',\n\n // Event handlers\n onChange,\n onOpenChange,\n\n // Standard props\n className,\n children,\n ...props\n },\n ref\n ) => {\n // Warn if >1000 items\n const childCount = Children.count(children);\n if (childCount > 1000) {\n console.warn(\n 'Select has >1000 items. Consider using Autocomplete component for better performance.'\n );\n }\n\n // Build value-to-label map for display (memoized to prevent recreation on every render)\n const valueToLabelMap = useMemo(() => {\n const map = new Map<string, string>();\n const processChildren = (nodes: ReactNode): void => {\n Children.forEach(nodes, (child) => {\n if (isValidElement(child)) {\n const element = child as ReactElement<{ value?: string; children?: ReactNode }>;\n if (element.type === SelectItem || element.props?.value) {\n const itemValue = element.props.value;\n const itemChildren = element.props.children;\n if (itemValue && typeof itemChildren === 'string') {\n map.set(itemValue, itemChildren);\n }\n }\n if (element.props?.children) {\n processChildren(element.props.children);\n }\n }\n });\n };\n processChildren(children);\n return map;\n }, [children]);\n\n // Multi-select display logic (Decision 5: Multi-select threshold)\n // Memoized to prevent recalculation on every render\n const displayValue = useMemo(() => {\n if (!value || !Array.isArray(value) || value.length === 0) {\n return placeholder || '';\n }\n\n if (value.length <= 2) {\n // Show item labels for 1-2 items\n const labels = value.map(v => valueToLabelMap.get(v as string) || v);\n return labels.join(', ');\n }\n\n // Show count for 3+ items\n return `${value.length} items selected`;\n }, [value, valueToLabelMap, placeholder]);\n\n return (\n <SelectBase\n ariaSelectProps={{\n value: value as string[],\n defaultValue: defaultValue as string[],\n onChange: (keys: unknown) => {\n if (onChange) {\n onChange(keys as string[]);\n }\n },\n selectionMode: 'multiple',\n disabledKeys,\n isOpen,\n onOpenChange,\n isDisabled: isDisabled || isLoading,\n isRequired,\n name,\n validate: validate as ((value: unknown) => true | string | null | undefined) | undefined,\n validationBehavior,\n className,\n ...props,\n }}\n triggerContent={\n <span className=\"flex-1 text-left truncate\">\n {displayValue}\n </span>\n }\n triggerRef={ref}\n label={label}\n description={description}\n isRequired={isRequired}\n isDisabled={isDisabled}\n isLoading={isLoading}\n errorMessage={errorMessage}\n size={size}\n emptyStateMessage={emptyStateMessage}\n childCount={childCount}\n >\n {children}\n </SelectBase>\n );\n }\n);\n\nMultiSelectRoot.displayName = 'MultiSelect';\n\n/**\n * Select.Item Component\n *\n * Individual selectable item with checkmark icon.\n *\n * @see select-prd.md US-1 (Basic Single Selection)\n * @see plan.md Decision 6 (Left-side checkmark)\n * @see plan.md Decision 23 (textValue required for custom children)\n */\nconst SelectItem = memo(function SelectItem({ children, textValue, value, isDisabled = false, className, ...props }: SelectItemProps): ReactElement {\n // Validate textValue for custom children (Decision 23)\n if (!textValue && typeof children !== 'string') {\n const message = 'Select.Item with custom children requires textValue prop for accessibility';\n if (process.env.NODE_ENV === 'development') {\n throw new Error(message);\n } else {\n console.warn(message);\n }\n }\n\n return (\n <ListBoxItem\n id={value}\n textValue={textValue || (typeof children === 'string' ? children : undefined)}\n className={`${selectItemVariants({ size: 'default' })} ${className || ''}`}\n isDisabled={isDisabled}\n {...props}\n >\n {({ isSelected, selectionMode, isDisabled: itemDisabled }) => (\n <>\n {/* Checkmark icon (left side) - Decision 6 */}\n {selectionMode === 'multiple' ? (\n <CheckSquare\n className={`absolute left-2 h-4 w-4 ${isSelected ? 'visible' : 'invisible'}`}\n aria-hidden=\"true\"\n />\n ) : (\n isSelected && <Check className=\"absolute left-2 h-4 w-4\" aria-hidden=\"true\" />\n )}\n <span className={itemDisabled ? 'text-[var(--menu-muted)]' : ''}>\n {children}\n </span>\n </>\n )}\n </ListBoxItem>\n );\n});\n\nSelectItem.displayName = 'SelectItem';\n\n/**\n * Select.Section Component\n *\n * Groups related items with optional header.\n *\n * @see select-prd.md US-3 (Grouped Options with Sections)\n */\nfunction SelectSection({ children, className, ...props }: SelectSectionProps): ReactElement {\n return (\n <ListBoxSection className={`border-t border-[var(--border)] first:border-t-0 ${className || ''}`} {...props}>\n {children}\n </ListBoxSection>\n );\n}\n\nSelectSection.displayName = 'SelectSection';\n\n/**\n * Select.Header Component\n *\n * Section header with non-interactive label.\n *\n * @see select-prd.md US-3 (Grouped Options with Sections)\n */\nfunction SelectHeader({ children, className, ...props }: SelectHeaderProps): ReactElement {\n return (\n <Header className={`${selectSectionVariants({ size: 'default' })} ${className || ''}`} {...props}>\n {children}\n </Header>\n );\n}\n\nSelectHeader.displayName = 'SelectHeader';\n\n/**\n * Compound Component Exports\n *\n * Uses Object.assign() for compound components (e.g., Select.Item, Select.Section).\n * Named exports (SelectItem, SelectSection, SelectHeader) are also available below\n * for better tree-shaking. Prefer named exports in new code.\n *\n * @deprecated (v2) The Object.assign compound pattern will be removed in v2.\n * Migrate to named imports: `import { SelectItem, SelectSection, SelectHeader } from '...'`\n *\n * @see GUIDE.mdx (Compound component pattern)\n */\nexport const Select = Object.assign(SelectRoot, {\n Item: SelectItem,\n Section: SelectSection,\n Header: SelectHeader,\n});\n\nexport const MultiSelect = Object.assign(MultiSelectRoot, {\n Item: SelectItem,\n Section: SelectSection,\n Header: SelectHeader,\n});\n\n// Named exports for individual components (preferred for tree-shaking)\nexport { SelectRoot, MultiSelectRoot, SelectItem, SelectSection, SelectHeader };\n","import { cva } from 'class-variance-authority';\n\n/** Card region wrapper (the narrow-mode replacement for the table). */\nexport const cardRegionVariants = cva(['flex flex-col gap-3']);\n\n/** Tools row above the cards: select-all + sort control. */\nexport const cardToolsVariants = cva([\n 'flex items-center justify-between gap-3 flex-wrap px-0.5',\n]);\n\n/** The card list. */\nexport const cardListVariants = cva(['flex flex-col gap-2.5 list-none m-0 p-0']);\n\n/** A single card. Selected cards take the shared `--selected` tint. */\nexport const cardVariants = cva(\n [\n 'flex items-start gap-2.5 p-3.5',\n 'rounded-lg border border-[var(--border)] bg-[var(--content-background)]',\n 'motion-safe:transition-colors',\n ],\n {\n variants: {\n isSelected: {\n true: 'bg-[var(--selected)] border-[var(--primary)]/40',\n false: '',\n },\n },\n defaultVariants: { isSelected: false },\n }\n);\n\n/** The per-card selection checkbox cell (≥44px target). */\nexport const cardCheckVariants = cva([\n 'flex items-center justify-center min-w-[44px] min-h-[44px] -m-1 flex-none',\n]);\n\n/** The card body (consumer-rendered content). */\nexport const cardContentVariants = cva(['flex-1 min-w-0']);\n\n/** The activation wrapper around the card body when `onRowAction` is set —\n * a full-width unstyled button so the whole card is the tap target. */\nexport const cardActionVariants = cva([\n 'block w-full text-left cursor-pointer rounded-md',\n 'outline-none focus-visible:ring-2 focus-visible:ring-[var(--ring)] focus-visible:ring-offset-2',\n]);\n","'use client';\n\n/**\n * TableCardList — the narrow-viewport / narrow-container card view that pairs\n * with the desktop `Table`. Render it instead of `<Table>` when\n * {@link useContainerNarrow} reports the container is below your breakpoint:\n *\n * @example\n * const ref = useRef<HTMLDivElement>(null);\n * const narrow = useContainerNarrow(ref, 680);\n * <div ref={ref}>\n * {narrow\n * ? <TableCardList items={rows} getRowId={(r) => r.id} renderCard={...} selectionMode=\"multiple\" selectedKeys={k} onSelectionChange={setK} … />\n * : <Table selectedKeys={k} onSelectionChange={setK} …>…</Table>}\n * </div>\n *\n * Selection + sort state are consumer-owned (same `selectedKeys`/`sortDescriptor`\n * as the desktop Table), so switching views preserves them. Card mode adds a\n * select-all + a Sort `<Select>` (there are no clickable column headers).\n */\n\nimport { type ReactElement } from 'react';\nimport { Button as AriaButton } from 'react-aria-components';\nimport type { Selection, Key } from 'react-aria-components';\nimport { ArrowUp, ArrowDown } from 'lucide-react';\nimport { Checkbox } from '../Checkbox';\nimport { Select } from '../Select';\nimport { Button } from '../Button';\nimport { cn } from '../../utils/cn';\nimport {\n cardRegionVariants,\n cardToolsVariants,\n cardListVariants,\n cardVariants,\n cardCheckVariants,\n cardContentVariants,\n cardActionVariants,\n} from './TableCardList.styles';\nimport type { TableCardListProps } from './TableCardList.types';\n\nexport function TableCardList<T extends object>({\n items,\n getRowId,\n renderCard,\n selectionMode = 'none',\n selectedKeys = new Set<Key>(),\n onSelectionChange,\n onRowAction,\n sortDescriptor,\n onSortChange,\n sortColumns = [],\n renderEmptyState,\n labels,\n 'aria-label': ariaLabel,\n className,\n 'data-testid': dataTestId = 'table-card-list',\n}: TableCardListProps<T>): ReactElement {\n const selectable = selectionMode === 'multiple';\n const ids = items.map(getRowId);\n\n const isSelected = (id: Key): boolean => selectedKeys === 'all' || selectedKeys.has(id);\n const allSelected = ids.length > 0 && ids.every(isSelected);\n const someSelected = ids.some(isSelected) && !allSelected;\n const resolvedSet = (): Set<Key> =>\n selectedKeys === 'all' ? new Set(ids) : new Set(selectedKeys);\n\n const toggleAll = (): void => {\n onSelectionChange?.(allSelected ? new Set<Key>() : new Set(ids));\n };\n const toggleOne = (id: Key): void => {\n const next = resolvedSet();\n if (next.has(id)) next.delete(id);\n else next.add(id);\n onSelectionChange?.(next as Selection);\n };\n\n const sortValue = sortDescriptor?.column != null ? String(sortDescriptor.column) : undefined;\n const sortDirection = sortDescriptor?.direction ?? 'ascending';\n\n const onSortColumnChange = (value: string | string[]): void => {\n const column = Array.isArray(value) ? value[0] : value;\n if (column) onSortChange?.({ column, direction: sortDescriptor?.direction ?? 'ascending' });\n };\n const toggleSortDirection = (): void => {\n if (sortDescriptor?.column == null) return;\n onSortChange?.({\n column: sortDescriptor.column,\n direction: sortDirection === 'ascending' ? 'descending' : 'ascending',\n });\n };\n\n const hasTools = selectable || sortColumns.length > 0;\n const isEmpty = items.length === 0;\n\n return (\n <div\n role=\"region\"\n aria-label={ariaLabel}\n className={cn(cardRegionVariants(), className)}\n data-testid={dataTestId}\n >\n <p className=\"sr-only\" role=\"status\" aria-live=\"polite\">\n {labels.results(items.length)}\n </p>\n\n {hasTools && (\n <div className={cardToolsVariants()}>\n {selectable ? (\n <Checkbox\n label={labels.selectAll}\n isSelected={allSelected}\n isIndeterminate={someSelected}\n onChange={toggleAll}\n />\n ) : (\n <span />\n )}\n\n {sortColumns.length > 0 && (\n <div className=\"flex items-end gap-2\">\n <Select\n label={labels.sort}\n placeholder={labels.sortPlaceholder}\n value={sortValue}\n onChange={onSortColumnChange}\n >\n {sortColumns.map((column) => (\n <Select.Item key={column.id} value={column.id}>\n {column.label}\n </Select.Item>\n ))}\n </Select>\n <Button\n variant=\"ghost\"\n visualSize=\"icon\"\n isDisabled={sortDescriptor?.column == null}\n aria-label={labels.sortDirection(sortDirection)}\n onPress={toggleSortDirection}\n >\n {sortDirection === 'ascending' ? (\n <ArrowUp aria-hidden=\"true\" />\n ) : (\n <ArrowDown aria-hidden=\"true\" />\n )}\n </Button>\n </div>\n )}\n </div>\n )}\n\n {isEmpty ? (\n renderEmptyState ? (\n <div\n className=\"rounded-lg border border-dashed border-[var(--border)] p-8 text-center\"\n data-testid=\"card-empty-state\"\n >\n {renderEmptyState()}\n </div>\n ) : null\n ) : (\n <ul className={cardListVariants()}>\n {items.map((item) => {\n const id = getRowId(item);\n const selected = isSelected(id);\n return (\n <li key={String(id)} className={cardVariants({ isSelected: selected })}>\n {selectable && (\n <div className={cardCheckVariants()}>\n <Checkbox\n aria-label={labels.selectItem(item)}\n isSelected={selected}\n onChange={() => toggleOne(id)}\n />\n </div>\n )}\n <div className={cardContentVariants()}>\n {onRowAction ? (\n <AriaButton\n className={cardActionVariants()}\n data-testid=\"card-action\"\n onPress={() => onRowAction(id)}\n >\n {renderCard(item)}\n </AriaButton>\n ) : (\n renderCard(item)\n )}\n </div>\n </li>\n );\n })}\n </ul>\n )}\n </div>\n );\n}\n\nTableCardList.displayName = 'TableCardList';\n","'use client';\n\nimport { useEffect, useState, type RefObject } from 'react';\n\n/**\n * Track whether a referenced element is narrower than `breakpoint` (px), via a\n * `ResizeObserver`. This is a **container query**, not a viewport query — a table\n * inside a narrow panel reflows to cards even on a wide screen.\n *\n * Uses `offsetWidth` (ignores CSS transforms, e.g. zoom/preview scaling).\n *\n * @example\n * const ref = useRef<HTMLDivElement>(null);\n * const narrow = useContainerNarrow(ref, 680);\n * return <div ref={ref}>{narrow ? <TableCardList .../> : <Table .../>}</div>;\n */\nexport function useContainerNarrow(\n ref: RefObject<HTMLElement | null>,\n breakpoint: number\n): boolean {\n const [narrow, setNarrow] = useState(false);\n\n useEffect(() => {\n const el = ref.current;\n if (!el) return;\n\n const measure = (): void => setNarrow(el.offsetWidth < breakpoint);\n measure(); // initial — covers an already-narrow mount\n\n let observer: ResizeObserver | undefined;\n if (typeof ResizeObserver !== 'undefined') {\n observer = new ResizeObserver(measure);\n observer.observe(el);\n }\n window.addEventListener('resize', measure);\n return () => {\n window.removeEventListener('resize', measure);\n observer?.disconnect();\n };\n }, [ref, breakpoint]);\n\n return narrow;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/utils/cn.ts","../../../src/styles/interaction-states.ts","../../../src/elements/Checkbox/Checkbox.tsx","../../../src/elements/Table/Table.styles.ts","../../../src/elements/Table/Table.tsx","../../../src/elements/Button/Button.styles.ts","../../../src/elements/ButtonGroup/ButtonGroupContext.tsx","../../../src/elements/ButtonGroup/ButtonGroup.variants.ts","../../../src/elements/Button/Button.tsx","../../../src/elements/Table/BulkActionBar.styles.ts","../../../src/elements/Table/BulkActionBar.tsx","../../../src/elements/Table/resolveSelectedCount.ts","../../../src/elements/Table/useBulkActionShortcut.ts","../../../src/styles/shared-variants.ts","../../../src/utils/browserExtensionOverlay.ts","../../../src/elements/Select/Select.styles.ts","../../../src/elements/Select/Select.tsx","../../../src/elements/Table/TableCardList.styles.ts","../../../src/elements/Table/TableCardList.tsx","../../../src/hooks/useContainerNarrow.ts"],"names":["cn","inputs","twMerge","clsx","FOCUS_STYLES","PRESSED_STYLES","HIGH_CONTRAST_FOCUS","HIGH_CONTRAST_HOVER","HIGH_CONTRAST_PRESSED","checkboxContainerVariants","cva","checkboxIndicatorVariants","checkmarkVariants","CheckmarkIcon","className","props","jsx","MinusIcon","Checkbox","forwardRef","isSelected","defaultSelected","isDisabled","isReadOnly","isIndeterminate","isInvalid","isRequired","onChange","onFocusChange","value","name","size","variant","label","description","selectedIcon","id","ariaLabel","ariaLabelledby","ariaDescribedby","dataTestId","slot","ref","computedIsDisabled","computedIsReadOnly","computedIsIndeterminate","renderIcon","isChecked","isIndet","iconClassName","dataSelected","dataIndeterminate","isValidElement","iconElement","cloneElement","AriaCheckbox","renderProps","jsxs","Fragment","tableContainerVariants","tableVariants","tableHeaderVariants","tableFooterVariants","columnVariants","rowVariants","cellVariants","TableContext","createContext","Table","stickyHeader","zebra","toolbar","selectionMode","selectionBehavior","disallowEmptySelection","disabledBehavior","selectedKeys","defaultSelectedKeys","onSelectionChange","disabledKeys","sortDescriptor","onSortChange","onRowAction","children","contextValue","useMemo","AriaTable","TableHeaderInner","columns","useContext","allowsDragging","useTableOptions","AriaTableHeader","AriaColumn","Collection","TableHeader","TableBodyInner","items","renderEmptyState","AriaTableBody","TableBody","TableFooter","Column","isRowHeader","allowsSorting","align","width","minWidth","maxWidth","canSort","sortDirection","ChevronUp","ChevronDown","ChevronsUpDown","RowInner","href","selectedClasses","unselectedClasses","selectionCellClasses","AriaRow","disabled","AriaCell","Row","Cell","memo","_colSpan","buttonOuterVariants","buttonVisualVariants","ButtonGroupContext","useButtonGroupContext","ButtonGroupItemContext","useButtonGroupItemContext","buttonGroupItemVariants","Button","buttonVisualClassName","visualSize","fullWidth","loading","loadingText","shortcut","paywall","paywallRedirect","paywallDescription","onPress","paywallDescriptionId","useId","groupContext","itemContext","effectiveVariant","effectiveSize","effectiveIsDisabled","isInVerticalGroup","effectiveFullWidth","positionClassName","effectiveVisualSize","AriaButton","e","Loader2","Zap","bulkActionBarVariants","bulkActionToolbarVariants","bulkActionHintVariants","bulkActionKbdVariants","bulkActionButtonVariants","setRef","BulkActionBar","selectedCount","actions","onAction","onClearSelection","sticky","framed","showJumpHint","shortcutKey","labels","forwardedRef","wrapperRef","useRef","prevCount","itemRefs","active","setActive","useState","total","safeActive","focusItem","index","next","onToolbarKeyDown","event","useEffect","previous","activeEl","hasSelection","showHint","liveText","parts","node","action","itemIndex","resolveSelectedCount","selectableKeys","count","_key","TEXT_INPUT_TYPES","isTextEntryTarget","target","tag","role","useBulkActionShortcut","scopeRef","toolbarRef","key","scope","onKeyDown","FIELD_HEIGHTS","FIELD_INPUT_SIZES","FIELD_TOUCH_TARGET","isExtensionInjectedElement","element","depth","root","custom","parent","createInteractOutsideGuard","consumerShouldClose","selectTriggerVariants","selectItemVariants","selectPopoverVariants","SELECT_POPOVER_MAX_HEIGHT","selectSectionVariants","selectErrorVariants","LOADING_SKELETON","_","i","SelectBase","ariaSelectProps","triggerContent","triggerRef","isLoading","errorMessage","emptyStateMessage","childCount","labelId","descriptionId","errorId","rootClassName","restAriaSelectProps","AriaSelect","Label","Text","FieldError","validationErrors","displayError","Popover","ListBox","ListBoxItem","SelectRoot","placeholder","defaultValue","isOpen","validate","validationBehavior","onOpenChange","Children","SelectValue","MultiSelectRoot","_selectionMode","valueToLabelMap","map","processChildren","nodes","child","SelectItem","itemValue","itemChildren","displayValue","v","keys","textValue","message","itemDisabled","CheckSquare","Check","SelectSection","ListBoxSection","SelectHeader","Header","Select","cardRegionVariants","cardToolsVariants","cardListVariants","cardVariants","cardCheckVariants","cardContentVariants","cardActionVariants","TableCardList","getRowId","renderCard","sortColumns","selectable","ids","allSelected","someSelected","resolvedSet","toggleAll","toggleOne","sortValue","onSortColumnChange","column","toggleSortDirection","hasTools","isEmpty","ArrowUp","ArrowDown","item","selected","useContainerNarrow","breakpoint","narrow","setNarrow","el","measure","observer"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Class Name Utility\n * Merges Tailwind CSS classes with conflict resolution\n *\n * Combines clsx for conditional classes and tailwind-merge for deduplication\n *\n * @example\n * cn('px-2 py-1', 'px-4') // => 'py-1 px-4' (px-4 overrides px-2)\n * cn('text-red-500', condition && 'text-blue-500') // => conditional application\n */\n\nimport { clsx, type ClassValue } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs));\n}\n","/**\n * Global Interaction State Styles\n *\n * Consistent interaction patterns across all Themis components.\n * These styles ensure WCAG 2.2 AAA compliance and predictable UX.\n *\n * @see spec.md FR-010 (Visible focus ring for keyboard navigation)\n * @see spec.md FR-031 (Pressed state feedback)\n * @see spec.md FR-012 (High contrast mode support)\n * @see constitution.md Principle IV (Accessibility First)\n */\n\n/**\n * Focus state styles (FR-010)\n * Visible focus ring for keyboard navigation - WCAG 2.2 Level AAA\n *\n * Components can override by extending these styles:\n * @example\n * cn(FOCUS_STYLES, \"ring-4\") // Increases ring width to 4px\n */\nexport const FOCUS_STYLES = \"data-[focus-visible]:ring-2 data-[focus-visible]:ring-[var(--themis-ring)] data-[focus-visible]:ring-offset-2\";\n\n/**\n * Pressed/Active state styles (FR-031)\n * Visual feedback for press interactions\n *\n * Components can override the scale amount:\n * @example\n * cn(PRESSED_STYLES_BASE, \"data-[pressed]:scale-[0.95]\") // More pronounced scale\n */\nexport const PRESSED_STYLES = \"data-[pressed]:scale-[0.97]\";\n\n/**\n * Base pressed styles without scale (for components that need different feedback)\n */\nexport const PRESSED_STYLES_BASE = \"data-[pressed]:transition-transform data-[pressed]:duration-100\";\n\n/**\n * Hover state styles\n * Elevation change on hover for better affordance\n *\n * Components can override shadow depth:\n * @example\n * cn(HOVER_STYLES_BASE, \"data-[hovered]:shadow-lg\") // Larger shadow\n */\nexport const HOVER_STYLES = \"\";\n\n/**\n * Base hover styles without shadow (for components that use different hover effects)\n */\nexport const HOVER_STYLES_BASE = \"data-[hovered]:transition-shadow data-[hovered]:duration-200\";\n\n/**\n * High contrast mode focus (FR-012)\n * Enhanced outlines for users requiring high contrast\n *\n * Uses 'hc:' prefix for prefers-contrast: more media query\n */\nexport const HIGH_CONTRAST_FOCUS = \"hc:data-[focus-visible]:outline hc:data-[focus-visible]:outline-4 hc:data-[focus-visible]:outline-offset-2 hc:data-[focus-visible]:outline-foreground\";\n\n/**\n * High contrast mode hover (FR-012)\n * Enhanced outlines for hover in high contrast mode\n */\nexport const HIGH_CONTRAST_HOVER = \"hc:data-[hovered]:outline hc:data-[hovered]:outline-2 hc:data-[hovered]:outline-foreground\";\n\n/**\n * High contrast mode pressed state\n * Enhanced outlines for pressed state in high contrast mode\n */\nexport const HIGH_CONTRAST_PRESSED = \"hc:data-[pressed]:outline hc:data-[pressed]:outline-2 hc:data-[pressed]:outline-offset-1 hc:data-[pressed]:outline-foreground\";\n\n/**\n * Combined high contrast styles\n * Use this for components that need all high contrast interaction states\n */\nexport const HIGH_CONTRAST_INTERACTIONS = `${HIGH_CONTRAST_FOCUS} ${HIGH_CONTRAST_HOVER} ${HIGH_CONTRAST_PRESSED}`;\n\n/**\n * Disabled state styles\n * Consistent disabled appearance across all components\n */\nexport const DISABLED_STYLES = \"disabled:pointer-events-none disabled:opacity-50\";\n\n/**\n * Default interaction bundle\n * Most common combination for interactive components\n *\n * Includes: focus ring, pressed scale, hover shadow, high contrast enhancements\n *\n * @example\n * <button className={cn(DEFAULT_INTERACTIONS, \"bg-primary\")}>Click</button>\n */\nexport const DEFAULT_INTERACTIONS = `${FOCUS_STYLES} ${PRESSED_STYLES} ${HOVER_STYLES} ${HIGH_CONTRAST_FOCUS} ${HIGH_CONTRAST_HOVER} ${HIGH_CONTRAST_PRESSED}`;\n\n/**\n * Subtle interaction bundle\n * For components that need less pronounced feedback\n *\n * Includes: focus ring and high contrast, but no hover shadow or pressed scale\n */\nexport const SUBTLE_INTERACTIONS = `${FOCUS_STYLES} ${HIGH_CONTRAST_FOCUS}`;\n\n/**\n * Non-interactive element styles\n * For elements that should indicate they are not interactive\n */\nexport const NON_INTERACTIVE = \"cursor-default select-none\";\n","\"use client\";\n\n/**\n * Checkbox Component\n * Standalone accessible checkbox with React Aria primitives and CVA styling\n *\n * Key Features:\n * - Standalone checkbox (not requiring CheckboxGroup)\n * - 44px+ touch targets (WCAG 2.2 AAA)\n * - 2 variants: default, destructive\n * - 3 sizes: sm, default, lg\n * - Indeterminate state support\n * - Spring animation for checkmark\n * - RTL support\n * - Works with React Aria slot system (for Table integration)\n *\n * @see React Aria Checkbox: https://react-spectrum.adobe.com/react-aria/Checkbox.html\n * @see constitution.md Principle IV (Accessibility First - WCAG 2.2 AAA)\n */\n\nimport {\n forwardRef,\n cloneElement,\n isValidElement,\n type ReactNode,\n type ReactElement,\n} from 'react';\nimport { Checkbox as AriaCheckbox } from 'react-aria-components';\nimport { cva } from 'class-variance-authority';\nimport { cn } from '../../utils/cn';\nimport { FOCUS_STYLES, HIGH_CONTRAST_FOCUS } from '../../styles/interaction-states';\nimport type { CheckboxProps } from './Checkbox.types';\n\n// ============================================================================\n// CVA Variants\n// ============================================================================\n\n/**\n * Checkbox container variants\n * Controls the overall checkbox layout with touch target\n */\nconst checkboxContainerVariants = cva(\n [\n // `relative` is load-bearing: React Aria renders the real <input> inside a\n // VisuallyHidden span (position:absolute, auto offsets). Without a positioned\n // ancestor its containing block becomes the document, so the input is laid\n // out at its static Y deep in any tall scroll content and EXTENDS the page's\n // scroll height — producing a phantom blank band + a second (window)\n // scrollbar on layouts whose scroll container isn't its containing block.\n // `relative` confines the hidden input to this 44px label box.\n \"group relative inline-flex items-center gap-2 cursor-pointer\",\n \"transition-colors duration-200\",\n \"rtl:flex-row-reverse\",\n FOCUS_STYLES,\n HIGH_CONTRAST_FOCUS,\n ].join(\" \"),\n {\n variants: {\n size: {\n sm: \"min-h-[44px] text-sm\",\n default: \"min-h-[44px] text-sm\",\n lg: \"min-h-[48px] text-base\",\n },\n isDisabled: {\n true: \"opacity-50 cursor-not-allowed\",\n false: \"\",\n },\n },\n defaultVariants: {\n size: \"default\",\n isDisabled: false,\n },\n }\n);\n\n/**\n * Checkbox indicator (the box) variants\n */\nconst checkboxIndicatorVariants = cva(\n // White interior by default so the box reads cleanly on any surface (grey header\n // band, selected/zebra rows); the selected/indeterminate variants fill it.\n \"flex-shrink-0 rounded-sm border-2 bg-[var(--content-background)] flex items-center justify-center transition-colors duration-200 motion-safe:data-[selected]:selection-pulse\",\n {\n variants: {\n variant: {\n default: [\n \"border-[var(--border)]\",\n \"data-[selected]:border-[var(--primary)]\",\n \"data-[selected]:bg-[var(--primary)]\",\n \"data-[indeterminate]:border-[var(--primary)]\",\n \"data-[indeterminate]:bg-[var(--primary)]\",\n ].join(\" \"),\n destructive: [\n \"border-[var(--border)]\",\n \"data-[selected]:border-[var(--destructive-background)]\",\n \"data-[selected]:bg-[var(--destructive-background)]\",\n \"data-[indeterminate]:border-[var(--destructive-background)]\",\n \"data-[indeterminate]:bg-[var(--destructive-background)]\",\n ].join(\" \"),\n },\n size: {\n sm: \"h-4 w-4\",\n default: \"h-5 w-5\",\n lg: \"h-6 w-6\",\n },\n isInvalid: {\n true: \"border-[var(--destructive-background)]\",\n false: \"\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n isInvalid: false,\n },\n }\n);\n\n/**\n * Checkmark icon variants with spring animation\n */\nconst checkmarkVariants = cva(\n [\n \"transition-transform duration-200\",\n \"[transition-timing-function:cubic-bezier(0.34,1.56,0.64,1)]\",\n \"motion-reduce:transition-none\",\n \"scale-0 data-[selected]:scale-100 data-[indeterminate]:scale-100\",\n ].join(\" \"),\n {\n variants: {\n variant: {\n default: \"text-[var(--primary-foreground)]\",\n destructive: \"text-[var(--destructive-foreground)]\",\n },\n size: {\n sm: \"h-3 w-3\",\n default: \"h-3.5 w-3.5\",\n lg: \"h-4 w-4\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n);\n\n// ============================================================================\n// Icon Components\n// ============================================================================\n\n/**\n * Checkmark SVG icon\n */\nfunction CheckmarkIcon({ className, ...props }: { className?: string; 'data-selected'?: boolean; 'data-indeterminate'?: boolean }): ReactNode {\n return (\n <svg\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={3}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n {...props}\n >\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n );\n}\n\n/**\n * Minus (indeterminate) SVG icon\n */\nfunction MinusIcon({ className, ...props }: { className?: string; 'data-selected'?: boolean; 'data-indeterminate'?: boolean }): ReactNode {\n return (\n <svg\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={3}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n {...props}\n >\n <line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\" />\n </svg>\n );\n}\n\n// ============================================================================\n// Checkbox Component\n// ============================================================================\n\n/**\n * Standalone Checkbox component\n * Accessible checkbox that can be used independently or within Table\n */\nconst Checkbox = forwardRef<HTMLLabelElement, CheckboxProps>(\n (\n {\n isSelected,\n defaultSelected,\n isDisabled,\n isReadOnly,\n isIndeterminate,\n isInvalid = false,\n isRequired = false,\n onChange,\n onFocusChange,\n value,\n name,\n size = 'default',\n variant = 'default',\n label,\n description,\n selectedIcon,\n className,\n id,\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledby,\n 'aria-describedby': ariaDescribedby,\n 'data-testid': dataTestId,\n slot,\n },\n ref\n ) => {\n // Only set these props when explicitly true to allow slot system to control them\n // (e.g., Table's selection slot injects isIndeterminate for partial selection)\n const computedIsDisabled = isDisabled || undefined;\n const computedIsReadOnly = isReadOnly || undefined;\n const computedIsIndeterminate = isIndeterminate || undefined;\n // Render the icon based on state\n const renderIcon = (isChecked: boolean, isIndet: boolean) => {\n const iconClassName = cn(checkmarkVariants({ variant, size }));\n const dataSelected = isChecked || undefined;\n const dataIndeterminate = isIndet || undefined;\n\n // For indeterminate state, always show minus\n if (isIndet) {\n return (\n <MinusIcon\n className={iconClassName}\n data-selected={dataSelected}\n data-indeterminate={dataIndeterminate}\n />\n );\n }\n\n // Custom icon support\n if (selectedIcon && isChecked) {\n if (isValidElement(selectedIcon)) {\n const iconElement = selectedIcon as ReactElement<{ className?: string; 'data-selected'?: boolean }>;\n return cloneElement(iconElement, {\n className: cn(iconClassName, iconElement.props.className),\n 'data-selected': dataSelected,\n });\n }\n return <span className={iconClassName} data-selected={dataSelected}>{selectedIcon}</span>;\n }\n\n // Default checkmark\n return (\n <CheckmarkIcon\n className={iconClassName}\n data-selected={dataSelected}\n data-indeterminate={dataIndeterminate}\n />\n );\n };\n\n return (\n <AriaCheckbox\n ref={ref}\n id={id}\n isSelected={isSelected}\n defaultSelected={defaultSelected}\n isDisabled={computedIsDisabled}\n isReadOnly={computedIsReadOnly}\n isIndeterminate={computedIsIndeterminate}\n isInvalid={isInvalid}\n isRequired={isRequired}\n onChange={onChange}\n onFocusChange={onFocusChange}\n value={value}\n name={name}\n slot={slot}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledby}\n aria-describedby={ariaDescribedby}\n data-testid={dataTestId}\n className={(renderProps) =>\n cn(\n checkboxContainerVariants({\n size,\n isDisabled: renderProps.isDisabled,\n }),\n className\n )\n }\n >\n {(renderProps) => (\n <>\n {/* Checkbox indicator (the box) */}\n <div\n className={checkboxIndicatorVariants({\n variant,\n size,\n isInvalid: renderProps.isInvalid,\n })}\n data-selected={renderProps.isSelected || undefined}\n data-indeterminate={renderProps.isIndeterminate || undefined}\n >\n {renderIcon(renderProps.isSelected, renderProps.isIndeterminate)}\n </div>\n\n {/* Label and description */}\n {(label || description) && (\n <div className=\"flex flex-col\">\n {label && (\n <span className=\"font-medium text-[var(--content-foreground)]\">\n {label}\n </span>\n )}\n {description && (\n <span className=\"text-sm text-[var(--menu-muted)]\">\n {description}\n </span>\n )}\n </div>\n )}\n </>\n )}\n </AriaCheckbox>\n );\n }\n);\n\nCheckbox.displayName = \"Checkbox\";\n\n// ============================================================================\n// Exports\n// ============================================================================\n\nexport {\n Checkbox,\n checkboxContainerVariants,\n checkboxIndicatorVariants,\n checkmarkVariants,\n CheckmarkIcon,\n MinusIcon,\n};\n","import { cva } from 'class-variance-authority';\n\n// Table container variants (wrapper div) — Card-style outer frame to match `Card`\n// (rounded-lg + 1px border + content background). overflow-auto + the radius keep\n// the corners clean even when wide tables scroll.\nexport const tableContainerVariants = cva([\n 'relative w-full overflow-auto',\n 'rounded-lg border border-[var(--border)] bg-[var(--content-background)]',\n]);\n\n// Table variants\nexport const tableVariants = cva(\n ['w-full caption-bottom text-sm', 'border-collapse'],\n {\n variants: {\n variant: {\n default: '',\n // The outer frame is on the container; `bordered` adds internal column\n // dividers for a denser grid look.\n bordered: '[&_tr>*+*]:border-l [&_tr>*+*]:border-[var(--border)]',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n }\n);\n\n// Table header variants — the header's bottom rule uses the same token as the\n// outside (Card) border so they read as one consistent frame.\nexport const tableHeaderVariants = cva(['[&_tr]:border-b [&_tr]:border-[var(--border)]'], {\n variants: {\n sticky: {\n true: 'sticky top-0 z-10 bg-[var(--content-background)]',\n false: '',\n },\n },\n defaultVariants: {\n sticky: false,\n },\n});\n\n// Table footer variants\nexport const tableFooterVariants = cva([\n 'border-t border-[var(--border)]',\n 'bg-[var(--accent-background)]/50',\n 'font-medium',\n '[&>tr]:last:border-b-0',\n]);\n\n// Column variants\nexport const columnVariants = cva(\n [\n 'h-12 px-4 text-left align-middle font-semibold',\n 'uppercase tracking-wide',\n // Grey header band; foreground text keeps a 7:1 (AAA) ratio on the grey.\n 'bg-[var(--accent-background)] text-[var(--content-foreground)]',\n '[&:has([role=checkbox])]:pr-0',\n 'select-none',\n 'focus-visible:outline-none focus-visible:ring-2',\n 'focus-visible:ring-[var(--ring)] focus-visible:ring-inset',\n ],\n {\n variants: {\n allowsSorting: {\n true: 'cursor-pointer hover:bg-[var(--accent)]/50',\n false: '',\n },\n align: {\n start: 'text-start',\n center: 'text-center',\n end: 'text-end',\n },\n size: {\n sm: 'h-10 px-3 text-xs',\n default: 'h-12 px-4 text-sm',\n lg: 'h-14 px-5 text-base',\n },\n },\n defaultVariants: {\n allowsSorting: false,\n align: 'start',\n size: 'default',\n },\n }\n);\n\n// Row variants\nexport const rowVariants = cva(\n [\n 'border-b border-[var(--border)]',\n 'transition-colors',\n 'focus-visible:outline-none focus-visible:ring-2',\n 'focus-visible:ring-[var(--ring)] focus-visible:ring-inset',\n 'hover:bg-[var(--accent-background)]/50',\n 'data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n ],\n {\n variants: {\n isSelected: {\n true: 'bg-[var(--selected)] data-[selected]:bg-[var(--selected)]',\n false: '',\n },\n // Zebra striping is orthogonal to `variant` (works with default + bordered)\n // and on by default. Selected rows override the stripe via isSelected.\n zebra: {\n true: 'even:bg-[var(--accent-background)]/30',\n false: '',\n },\n },\n defaultVariants: {\n isSelected: false,\n zebra: true,\n },\n }\n);\n\n// Cell variants\nexport const cellVariants = cva(\n ['p-4 align-middle', '[&:has([role=checkbox])]:pr-0'],\n {\n variants: {\n align: {\n start: 'text-start',\n center: 'text-center',\n end: 'text-end',\n },\n size: {\n sm: 'p-3 text-xs',\n default: 'p-4 text-sm',\n lg: 'p-5 text-base',\n },\n isRowHeader: {\n true: 'font-medium',\n false: '',\n },\n },\n defaultVariants: {\n align: 'start',\n size: 'default',\n isRowHeader: false,\n },\n }\n);\n","'use client';\n\n/**\n * Table Component - Accessible Data Table (v1)\n * ARIA grid pattern with React Aria primitives\n *\n * @see plan.md for architecture details\n * @see table-prd.md for requirements\n * @see WCAG 2.2 AAA compliance\n */\n\nimport {\n forwardRef,\n memo,\n createContext,\n useContext,\n useMemo,\n type ReactNode,\n type ReactElement,\n type ForwardedRef,\n} from 'react';\nimport {\n Table as AriaTable,\n TableHeader as AriaTableHeader,\n TableBody as AriaTableBody,\n Column as AriaColumn,\n Row as AriaRow,\n Cell as AriaCell,\n Collection,\n useTableOptions,\n type TableHeaderProps as AriaTableHeaderProps,\n type TableBodyProps as AriaTableBodyProps,\n type RowProps as AriaRowProps,\n type CellProps as AriaCellProps,\n type Selection,\n type SortDescriptor,\n} from 'react-aria-components';\nimport { Checkbox } from '../Checkbox';\nimport { ChevronUp, ChevronDown, ChevronsUpDown } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport {\n tableContainerVariants,\n tableVariants,\n tableHeaderVariants,\n tableFooterVariants,\n columnVariants,\n rowVariants,\n cellVariants,\n} from './Table.styles';\nimport type {\n TableProps,\n TableHeaderProps,\n TableBodyProps,\n TableFooterProps,\n ColumnProps,\n RowProps,\n CellProps,\n TableVariant,\n TableSize,\n} from './Table.types';\n\n// ============================================================================\n// Context for passing table-level props to children\n// ============================================================================\n\ninterface TableContextValue {\n variant: TableVariant;\n size: TableSize;\n selectionMode: 'none' | 'single' | 'multiple';\n stickyHeader: boolean;\n zebra: boolean;\n}\n\nconst TableContext = createContext<TableContextValue>({\n variant: 'default',\n size: 'default',\n selectionMode: 'none',\n stickyHeader: false,\n zebra: true,\n});\n\n// ============================================================================\n// Table Component\n// ============================================================================\n\nconst Table = forwardRef<HTMLTableElement, TableProps>(\n (\n {\n className,\n variant = 'default',\n size = 'default',\n stickyHeader = false,\n zebra = true,\n toolbar,\n selectionMode = 'none',\n selectionBehavior = 'toggle',\n disallowEmptySelection = false,\n disabledBehavior = 'selection',\n selectedKeys,\n defaultSelectedKeys,\n onSelectionChange,\n disabledKeys,\n sortDescriptor,\n onSortChange,\n onRowAction,\n children,\n ...props\n },\n ref\n ) => {\n // Warn when sm size is used with selection (touch targets < 44px)\n if (process.env.NODE_ENV !== 'production' && size === 'sm' && selectionMode !== 'none') {\n console.warn(\n '[Table] size=\"sm\" with selectionMode produces rows shorter than the 44px WCAG 2.2 AAA minimum touch target. ' +\n 'Use size=\"default\" or size=\"lg\" for accessible interactive tables.'\n );\n }\n\n const contextValue = useMemo(\n () => ({ variant, size, selectionMode, stickyHeader, zebra }),\n [variant, size, selectionMode, stickyHeader, zebra]\n );\n\n return (\n <TableContext.Provider value={contextValue}>\n <div\n className={cn(tableContainerVariants(), className)}\n data-testid=\"table-container\"\n >\n {toolbar}\n <AriaTable\n ref={ref}\n className={cn(tableVariants({ variant }))}\n selectionMode={selectionMode}\n selectionBehavior={selectionBehavior}\n disallowEmptySelection={disallowEmptySelection}\n disabledBehavior={disabledBehavior}\n selectedKeys={selectedKeys}\n defaultSelectedKeys={defaultSelectedKeys}\n onSelectionChange={onSelectionChange}\n disabledKeys={disabledKeys}\n sortDescriptor={sortDescriptor}\n onSortChange={onSortChange}\n onRowAction={onRowAction}\n data-testid=\"table\"\n data-variant={variant}\n data-size={size}\n data-zebra={zebra}\n {...props}\n >\n {children}\n </AriaTable>\n </div>\n </TableContext.Provider>\n );\n }\n);\n\nTable.displayName = 'Table';\n\n// ============================================================================\n// TableHeader Component\n// ============================================================================\n\nfunction TableHeaderInner<T extends object>(\n { className, children, columns, ...props }: TableHeaderProps<T>,\n ref: ForwardedRef<HTMLTableSectionElement>\n): ReactElement {\n const { size, selectionMode, stickyHeader } = useContext(TableContext);\n const { allowsDragging } = useTableOptions();\n\n return (\n <AriaTableHeader\n ref={ref}\n className={cn(tableHeaderVariants({ sticky: stickyHeader }), className)}\n data-testid=\"table-header\"\n {...(props as AriaTableHeaderProps<T>)}\n >\n {/* Selection checkbox column */}\n {selectionMode === 'multiple' && (\n <AriaColumn className={cn(columnVariants({ size }), 'w-12')}>\n <Checkbox slot=\"selection\" aria-label=\"Select all\" size={size} />\n </AriaColumn>\n )}\n {/* Drag handle column if dragging is allowed */}\n {allowsDragging && <AriaColumn />}\n {/* Render columns */}\n {columns ? (\n <Collection items={columns}>{children as (item: T) => ReactElement}</Collection>\n ) : (\n children as ReactNode\n )}\n </AriaTableHeader>\n );\n}\n\nconst TableHeader = forwardRef(TableHeaderInner) as <T extends object>(\n props: TableHeaderProps<T> & { ref?: ForwardedRef<HTMLTableSectionElement> }\n) => ReactElement;\n\n(TableHeader as { displayName?: string }).displayName = 'TableHeader';\n\n// ============================================================================\n// TableBody Component\n// ============================================================================\n\nfunction TableBodyInner<T extends object>(\n { className, children, items, renderEmptyState, ...props }: TableBodyProps<T>,\n ref: ForwardedRef<HTMLTableSectionElement>\n): ReactElement {\n return (\n <AriaTableBody\n ref={ref}\n className={cn(className)}\n items={items}\n renderEmptyState={\n renderEmptyState\n ? () => (\n // React Aria wraps this in a single spanning row/cell — return only\n // the (centered) content, never a hand-rolled <tr>/<td> (which would\n // nest invalidly inside the generated empty-state row).\n <div className=\"text-center p-8\">{renderEmptyState()}</div>\n )\n : undefined\n }\n data-testid=\"table-body\"\n {...(props as AriaTableBodyProps<T>)}\n >\n {children as AriaTableBodyProps<T>['children']}\n </AriaTableBody>\n );\n}\n\nconst TableBody = forwardRef(TableBodyInner) as <T extends object>(\n props: TableBodyProps<T> & { ref?: ForwardedRef<HTMLTableSectionElement> }\n) => ReactElement;\n\n(TableBody as { displayName?: string }).displayName = 'TableBody';\n\n// ============================================================================\n// TableFooter Component (Custom - not from React Aria)\n// ============================================================================\n\nconst TableFooter = forwardRef<HTMLTableSectionElement, TableFooterProps>(\n ({ className, children, ...props }, ref) => {\n return (\n <tfoot\n ref={ref}\n className={cn(tableFooterVariants(), className)}\n data-testid=\"table-footer\"\n {...props}\n >\n {children}\n </tfoot>\n );\n }\n);\n\nTableFooter.displayName = 'TableFooter';\n\n// ============================================================================\n// Column Component\n// ============================================================================\n\nconst Column = forwardRef<HTMLTableCellElement, ColumnProps>(\n (\n {\n className,\n children,\n isRowHeader = false,\n allowsSorting = false,\n align = 'start',\n width,\n minWidth,\n maxWidth,\n ...props\n },\n ref\n ) => {\n const { size } = useContext(TableContext);\n\n return (\n <AriaColumn\n ref={ref}\n isRowHeader={isRowHeader}\n allowsSorting={allowsSorting}\n width={width}\n minWidth={minWidth}\n maxWidth={maxWidth}\n className={cn(columnVariants({ allowsSorting, align, size }), className)}\n {...props}\n >\n {({ allowsSorting: canSort, sortDirection }) => (\n <div className=\"flex items-center gap-1\">\n <span>{children as ReactNode}</span>\n {canSort && (\n <span\n aria-hidden=\"true\"\n data-sort-direction={sortDirection ?? 'none'}\n className={\n sortDirection\n ? 'text-[var(--primary-action)]'\n : 'opacity-50'\n }\n >\n {sortDirection === 'ascending' ? (\n <ChevronUp className=\"h-4 w-4\" />\n ) : sortDirection === 'descending' ? (\n <ChevronDown className=\"h-4 w-4\" />\n ) : (\n // Sortable but not the active sort — neutral affordance.\n <ChevronsUpDown className=\"h-4 w-4\" />\n )}\n </span>\n )}\n </div>\n )}\n </AriaColumn>\n );\n }\n);\n\n(Column as { displayName?: string }).displayName = 'Column';\n\n// ============================================================================\n// Row Component\n// ============================================================================\n\nfunction RowInner<T extends object>(\n { className, children, columns, href, isDisabled, ...props }: RowProps<T>,\n ref: ForwardedRef<HTMLTableRowElement>\n): ReactElement {\n const { size, selectionMode, zebra } = useContext(TableContext);\n const { allowsDragging } = useTableOptions();\n\n // Pre-compute variant class strings to avoid CVA calls in render callback.\n // Zebra striping is orthogonal to `variant`; selected rows override the stripe.\n const selectedClasses = rowVariants({ isSelected: true, zebra });\n const unselectedClasses = rowVariants({ isSelected: false, zebra });\n const selectionCellClasses = cn(cellVariants({ size }), 'w-12');\n\n return (\n <AriaRow\n ref={ref}\n href={href}\n isDisabled={isDisabled}\n className={({ isSelected, isDisabled: disabled }) =>\n cn(\n isSelected ? selectedClasses : unselectedClasses,\n disabled && 'opacity-50',\n className\n )\n }\n data-testid=\"table-row\"\n {...(props as AriaRowProps<T>)}\n >\n {/* Selection checkbox cell */}\n {selectionMode === 'multiple' && (\n <AriaCell className={selectionCellClasses}>\n <Checkbox slot=\"selection\" aria-label=\"Select row\" size={size} />\n </AriaCell>\n )}\n {/* Drag handle cell if dragging is allowed */}\n {allowsDragging && (\n <AriaCell>\n {/* Placeholder for drag handle - v2 feature */}\n </AriaCell>\n )}\n {/* Render cells */}\n {columns ? (\n <Collection items={columns}>{children as (item: T) => ReactElement}</Collection>\n ) : (\n children as ReactNode\n )}\n </AriaRow>\n );\n}\n\nconst Row = forwardRef(RowInner) as <T extends object>(\n props: RowProps<T> & { ref?: ForwardedRef<HTMLTableRowElement> }\n) => ReactElement;\n\n(Row as { displayName?: string }).displayName = 'Row';\n\n// ============================================================================\n// Cell Component\n// ============================================================================\n\nconst Cell = memo(forwardRef<HTMLTableCellElement, CellProps>(\n ({ className, children, align = 'start', colSpan: _colSpan, ...props }, ref) => {\n const { size } = useContext(TableContext);\n\n return (\n <AriaCell\n ref={ref}\n className={cn(cellVariants({ align, size }), className)}\n {...(props as AriaCellProps)}\n >\n {children}\n </AriaCell>\n );\n }\n));\n\nCell.displayName = 'Cell';\n\n// ============================================================================\n// Exports\n// ============================================================================\n\nexport {\n Table,\n TableHeader,\n TableBody,\n TableFooter,\n Column,\n Row,\n Cell,\n};\n\n// Re-export CVA variants (defined in Table.styles.ts)\nexport {\n tableContainerVariants,\n tableVariants,\n tableHeaderVariants,\n tableFooterVariants,\n columnVariants,\n rowVariants,\n cellVariants,\n};\n\n// Re-export types\nexport type { Selection, SortDescriptor };\n","import { cva } from 'class-variance-authority';\n\n/**\n * Layer 1: Transparent outer touch target (44x44px minimum)\n * Handles WCAG 2.2 AAA touch target requirement\n * Always transparent, centers the visual button inside\n * IMPORTANT: Focus ring stays on Layer 1 for AAA compliance (2.4.13)\n *\n * In vertical ButtonGroups, uses items-stretch so the visual layer (Layer 2)\n * can fill the full touch target height, eliminating gaps between buttons.\n */\nexport const buttonOuterVariants = cva(\n \"inline-flex justify-center min-h-[44px] min-w-[44px] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--ring)] focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:pointer-events-none disabled:opacity-50\",\n {\n variants: {\n fullWidth: {\n true: \"w-full\",\n false: \"\",\n },\n inVerticalGroup: {\n true: \"items-stretch\",\n false: \"items-center\",\n },\n },\n defaultVariants: {\n fullWidth: false,\n inVerticalGroup: false,\n },\n }\n);\n\n/**\n * Layer 2: Visual button appearance (adjustable size)\n * Provides the visual appearance with configurable size\n * Can be smaller than touch target for use cases like carousel dots\n * NOTE: NO focus-visible styles here - focus ring is on Layer 1\n */\nexport const buttonVisualVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-normal ring-offset-background motion-safe:transition-transform motion-safe:duration-200 motion-safe:[transition-timing-function:cubic-bezier(0.34,1.56,0.64,1)] motion-reduce:transition-none [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 relative cursor-pointer\",\n {\n variants: {\n variant: {\n default:\n \"bg-[var(--primary-action)] text-[var(--primary-action-foreground)] shadow-md hover:bg-[var(--primary-action-hover)] hover:-translate-y-1\",\n destructive:\n \"bg-[var(--destructive-background)] text-[var(--destructive-foreground)] hover:bg-[var(--destructive-background-hover,var(--destructive-background))] motion-safe:hover:btn-warn-shake\",\n outline:\n \"border border-[var(--input-border)] bg-[var(--content-background)] hover:bg-[var(--accent-background)]/50\",\n secondary:\n \"bg-[var(--secondary)] text-[var(--secondary-foreground)] hover:bg-[var(--secondary-hover,var(--secondary))]\",\n ghost:\n \"hover:bg-[var(--accent)] hover:text-[var(--accent-foreground)]\",\n link: \"text-[var(--text-link)] underline underline-offset-4 hover:bg-[var(--accent)] hover:text-[var(--text-link-hover)]\",\n },\n fullWidth: {\n true: \"w-full\",\n false: \"\",\n },\n visualSize: {\n default: \"h-10 px-4 py-2\",\n sm: \"h-9 rounded-md px-3 text-xs\",\n lg: \"h-11 rounded-md px-6 text-base\",\n icon: \"h-10 w-10\",\n dot: \"h-5 w-5 rounded-full p-0 min-h-0 min-w-0\",\n },\n paywall: {\n true: \"!bg-[var(--paywall)] !text-[var(--paywall-foreground)] hover:!bg-[var(--paywall)]/90 !cursor-not-allowed !border-transparent\",\n false: \"\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n visualSize: \"default\",\n paywall: false,\n },\n }\n);\n\n/**\n * @deprecated Use buttonVisualVariants instead. This alias is kept for backward compatibility.\n */\nexport const buttonVariants = buttonVisualVariants;\n","\"use client\";\n\nimport { createContext, useContext } from 'react';\nimport type {\n ButtonGroupContextValue,\n ButtonGroupItemContextValue,\n} from './ButtonGroup.types';\n\n/**\n * ButtonGroup Context System (Two-Level)\n *\n * Provides a two-level context pattern for ButtonGroup:\n *\n * 1. ButtonGroupContext (group-level):\n * - Provides: orientation, variant, size, isDisabled\n * - Consumed by: Button (for prop inheritance), Separator (for orientation)\n *\n * 2. ButtonGroupItemContext (item-level):\n * - Provides: position ('first' | 'middle' | 'last' | 'only')\n * - Consumed by: Button (for border-radius styling)\n *\n * Both contexts return null when not in a provider, allowing Button\n * to work standalone without any group context.\n *\n * @see plan.md for architecture details\n * @see ButtonGroup.tsx for Provider implementation\n */\n\n// =============================================================================\n// Group-Level Context\n// =============================================================================\n\n/**\n * Context for group-level props (orientation, variant, size, isDisabled)\n * Default value is null to indicate \"not in a group\"\n */\nconst ButtonGroupContext = createContext<ButtonGroupContextValue | null>(null);\n\nButtonGroupContext.displayName = 'ButtonGroupContext';\n\n/**\n * Hook to access group-level context\n * @returns ButtonGroupContextValue if inside a ButtonGroup, null otherwise\n */\nexport function useButtonGroupContext(): ButtonGroupContextValue | null {\n return useContext(ButtonGroupContext);\n}\n\n// =============================================================================\n// Item-Level Context\n// =============================================================================\n\n/**\n * Context for per-button position information\n * Default value is null to indicate \"not wrapped with position context\"\n */\nconst ButtonGroupItemContext =\n createContext<ButtonGroupItemContextValue | null>(null);\n\nButtonGroupItemContext.displayName = 'ButtonGroupItemContext';\n\n/**\n * Hook to access item-level context (position)\n * @returns ButtonGroupItemContextValue if wrapped with position context, null otherwise\n */\nexport function useButtonGroupItemContext(): ButtonGroupItemContextValue | null {\n return useContext(ButtonGroupItemContext);\n}\n\n// =============================================================================\n// Exports\n// =============================================================================\n\nexport { ButtonGroupContext, ButtonGroupItemContext };\n","import { cva } from 'class-variance-authority';\n\n/**\n * ButtonGroup CVA Variants\n *\n * Defines Class Variance Authority (CVA) variants for:\n * - ButtonGroup container (orientation-based layout)\n * - ButtonGroupItem (position-based border-radius)\n * - ButtonGroupSeparator (orientation-based styling)\n *\n * @see plan.md Phase 1: Design & Contracts - CVA Variants\n * @see constitution.md Principle V (Component Quality Standards)\n */\n\n// =============================================================================\n// Container Variants\n// =============================================================================\n\n/**\n * ButtonGroup container variants\n * Controls the layout direction based on orientation\n * Uses gap-0 to ensure buttons are connected (share borders)\n */\nexport const buttonGroupVariants = cva('inline-flex items-center gap-0', {\n variants: {\n orientation: {\n horizontal: 'flex-row',\n vertical: 'flex-col w-full',\n },\n },\n defaultVariants: {\n orientation: 'horizontal',\n },\n});\n\n// =============================================================================\n// Item Position Variants\n// =============================================================================\n\n/**\n * ButtonGroupItem position variants\n * Applied to Button's visual layer (Layer 2) for position-aware border-radius\n *\n * Compound variants handle both orientation and position combinations:\n * - Horizontal: left/right borders and radii\n * - Vertical: top/bottom borders and radii\n */\nexport const buttonGroupItemVariants = cva('', {\n variants: {\n orientation: {\n // min-w-[44px] ensures visual layer fills touch target width (for icon buttons)\n horizontal: 'min-w-[44px]',\n // flex (overrides inline-flex) + min-h-[44px] makes visual layer fill touch target,\n // eliminating gaps between stacked buttons in vertical orientation\n vertical: 'flex min-h-[44px]',\n },\n position: {\n first: '',\n middle: '',\n last: '',\n only: '', // Single button - no modifications needed\n },\n },\n compoundVariants: [\n // ==========================================================================\n // Horizontal Orientation\n // ==========================================================================\n {\n orientation: 'horizontal',\n position: 'first',\n className: 'rounded-r-none border-r-0',\n },\n {\n orientation: 'horizontal',\n position: 'middle',\n className: 'rounded-none border-r-0',\n },\n {\n orientation: 'horizontal',\n position: 'last',\n className: 'rounded-l-none',\n },\n // ==========================================================================\n // Vertical Orientation\n // Note: w-full is handled by Button's effectiveFullWidth for both layers\n // ==========================================================================\n {\n orientation: 'vertical',\n position: 'first',\n className: 'rounded-b-none border-b-0',\n },\n {\n orientation: 'vertical',\n position: 'middle',\n className: 'rounded-none border-b-0',\n },\n {\n orientation: 'vertical',\n position: 'last',\n className: 'rounded-t-none',\n },\n ],\n defaultVariants: {\n orientation: 'horizontal',\n position: 'only',\n },\n});\n\n// =============================================================================\n// Separator Variants\n// =============================================================================\n\n/**\n * ButtonGroupSeparator variants\n * Orientation-aware visual divider between button groups\n */\nexport const buttonGroupSeparatorVariants = cva('bg-[var(--border)]', {\n variants: {\n orientation: {\n horizontal: 'w-px h-6 mx-1',\n vertical: 'h-px w-full my-1',\n },\n },\n defaultVariants: {\n orientation: 'horizontal',\n },\n});\n","\"use client\";\n\n/**\n * Button Component - 3-Layer Architecture\n * Accessible button with React Aria primitives and CVA styling\n *\n * Architecture:\n * - Layer 1: Touch Target (44x44px WCAG AAA compliant, transparent)\n * - Layer 2: Visual Button (configurable size, colors, borders)\n * - Layer 3: Content & Effects (text, icons, ripple, loading spinner)\n *\n * @see 3layer-plan.md for architecture details\n * @see spec.md FR-029 to FR-037 (Button Component Requirements)\n * @see spec.md FR-009 (WCAG 2.2 AAA - 7:1 contrast ratio)\n * @see spec.md FR-014 (44x44px minimum touch targets)\n * @see constitution.md Principle IV (Accessibility First)\n */\n\nimport { forwardRef, memo, useId } from 'react';\nimport {\n Button as AriaButton,\n type ButtonProps as AriaButtonProps,\n} from 'react-aria-components';\nimport { Loader2, Zap } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport type { ButtonProps } from './Button.types';\nimport { buttonOuterVariants, buttonVisualVariants, buttonVariants } from './Button.styles';\nimport { PRESSED_STYLES, HOVER_STYLES, HIGH_CONTRAST_HOVER, HIGH_CONTRAST_PRESSED } from '../../styles/interaction-states';\nimport {\n useButtonGroupContext,\n useButtonGroupItemContext,\n} from '../ButtonGroup/ButtonGroupContext';\nimport { buttonGroupItemVariants } from '../ButtonGroup/ButtonGroup.variants';\n\n/**\n * Button Component - 3-Layer Architecture\n * Fully accessible button with React Aria and themed styling\n *\n * Layer 1: Touch Target (AriaButton) - 44x44px WCAG AAA compliant\n * Layer 2: Visual Button (span) - configurable appearance\n * Layer 3: Content (children) - text, icons, effects\n */\nconst Button = memo(forwardRef<HTMLButtonElement, ButtonProps>(\n (\n {\n className,\n buttonVisualClassName,\n variant,\n size,\n visualSize,\n fullWidth,\n loading = false,\n loadingText = \"Loading...\",\n shortcut,\n children,\n isDisabled,\n paywall = false,\n paywallRedirect,\n paywallDescription,\n onPress,\n ...props\n },\n ref\n ) => {\n const paywallDescriptionId = useId();\n\n // ==========================================================================\n // ButtonGroup Context Integration\n // ==========================================================================\n\n // Consume group-level context (variant, size, isDisabled, orientation)\n const groupContext = useButtonGroupContext();\n\n // Consume item-level context (position for border-radius styling)\n const itemContext = useButtonGroupItemContext();\n\n // Merge context values with props (props take precedence)\n const effectiveVariant = variant ?? groupContext?.variant ?? 'default';\n const effectiveSize = size ?? groupContext?.size;\n const effectiveIsDisabled = isDisabled ?? groupContext?.isDisabled ?? false;\n\n // In vertical groups, buttons should be full width automatically\n const isInVerticalGroup = groupContext?.orientation === 'vertical';\n const effectiveFullWidth = fullWidth || isInVerticalGroup;\n\n // Position styling for ButtonGroup (only applied when in a group)\n const positionClassName = itemContext\n ? buttonGroupItemVariants({\n orientation: groupContext?.orientation ?? 'horizontal',\n position: itemContext.position,\n })\n : '';\n\n // Default visualSize to size for backward compatibility\n const effectiveVisualSize = visualSize ?? effectiveSize ?? 'default';\n\n // AAA Accessibility: Warn in dev/test if icon/dot variant lacks accessible name\n if (process.env.NODE_ENV !== 'production') {\n if (\n (effectiveVisualSize === 'dot' || effectiveVisualSize === 'icon') &&\n !props['aria-label'] &&\n !children\n ) {\n console.warn(\n '[Button] visualSize=\"dot\" or \"icon\" requires aria-label when no visible text is provided (WCAG 1.1.1)'\n );\n }\n }\n\n /**\n * Handle button press - intercepts action when paywalled\n * If paywalled with redirect URL, opens in new tab\n * Otherwise, calls the normal onPress handler\n */\n const handlePress = (e: Parameters<NonNullable<AriaButtonProps['onPress']>>[0]): void => {\n if (paywall) {\n if (paywallRedirect) {\n window.open(paywallRedirect, '_blank', 'noopener,noreferrer');\n }\n // Don't call onPress when paywalled\n return;\n }\n onPress?.(e);\n };\n\n // Only set isDisabled when we have a reason to disable\n // Otherwise, let slot system control disabled state (e.g., in NumberField)\n const computedIsDisabled = effectiveIsDisabled || loading || undefined;\n\n return (\n <AriaButton\n ref={ref}\n isDisabled={computedIsDisabled}\n aria-disabled={paywall ? true : undefined}\n aria-describedby={paywall ? paywallDescriptionId : undefined}\n onPress={handlePress}\n className={cn(buttonOuterVariants({ fullWidth: effectiveFullWidth, inVerticalGroup: isInVerticalGroup }), className)}\n {...props}\n >\n {(renderProps) => (\n /* Layer 2: Visual Button */\n <span\n className={cn(\n buttonVisualVariants({\n variant: effectiveVariant,\n visualSize: effectiveVisualSize,\n paywall,\n fullWidth: effectiveFullWidth,\n }),\n // Position styling from ButtonGroup context (border-radius adjustments)\n positionClassName,\n buttonVisualClassName,\n // Layer 2 interaction styles (no focus - focus ring is on Layer 1)\n PRESSED_STYLES,\n HOVER_STYLES,\n HIGH_CONTRAST_HOVER,\n HIGH_CONTRAST_PRESSED\n )}\n data-pressed={renderProps.isPressed || undefined}\n >\n {/* Layer 3: Content & Effects */}\n\n {/* FR-033: Loading spinner with screen reader announcement */}\n {/* Uses motion-safe: for WCAG 2.3.3 AAA (Animation from Interactions) */}\n {loading && (\n <>\n <Loader2 className=\"motion-safe:animate-spin\" aria-hidden=\"true\" />\n <span className=\"sr-only\" aria-live=\"polite\">\n {loadingText}\n </span>\n </>\n )}\n\n {/* Hide children during loading */}\n {!loading && children}\n\n {/* Paywall: Lightning bolt icon */}\n {paywall && (\n <Zap\n data-testid=\"zap-icon\"\n aria-hidden=\"true\"\n className=\"ml-1\"\n />\n )}\n\n {/* Paywall: Screen reader description */}\n {paywall && (\n <span id={paywallDescriptionId} className=\"sr-only\">\n Premium feature: {paywallDescription || \"Upgrade required to access this feature\"}\n </span>\n )}\n\n {/* FR-034: Keyboard shortcut display on focus */}\n {renderProps.isFocusVisible && shortcut && (\n <kbd className=\"ml-auto hidden text-xs opacity-60 lg:inline\">\n {shortcut}\n </kbd>\n )}\n\n </span>\n )}\n </AriaButton>\n );\n }\n));\n\nButton.displayName = \"Button\";\n\nexport { Button, buttonVariants, buttonOuterVariants, buttonVisualVariants };\nexport type { ButtonProps } from './Button.types';\n","import { cva } from 'class-variance-authority';\n\n/**\n * BulkActionBar wrapper. Appears above the table when rows are selected.\n * Sticky by default so it stays reachable while the user scrolls + selects.\n */\nexport const bulkActionBarVariants = cva(\n [\n 'flex items-center justify-between gap-3 flex-wrap',\n 'px-4 py-2.5',\n // Selection band — the same `--selected` token as selected rows, so a\n // selected row visually connects to the bar. Theme-aware (light lilac / dark violet).\n 'bg-[var(--selected)]',\n ],\n {\n variants: {\n sticky: {\n // Sticks to the top of the table's scroll container (no drop shadow).\n true: 'sticky top-0 z-[6]',\n false: '',\n },\n framed: {\n // Standalone (outside the Table's toolbar slot): a self-contained Card\n // — full border + rounded corners, matching `Card`.\n true: 'rounded-lg border border-[var(--border)]',\n // In the Table card frame: just a bottom rule continuing the header divider.\n false: 'border-b border-[var(--border)]',\n },\n },\n defaultVariants: {\n sticky: true,\n framed: false,\n },\n }\n);\n\n/** The roving toolbar region inside the bar. */\nexport const bulkActionToolbarVariants = cva([\n 'flex items-center gap-3 flex-wrap w-full justify-between',\n]);\n\n/** The visible (decorative) jump-shortcut hint. */\nexport const bulkActionHintVariants = cva([\n 'text-sm text-[var(--content-muted)] inline-flex items-center gap-1.5',\n]);\n\n/** The kbd key inside the jump-shortcut hint. */\nexport const bulkActionKbdVariants = cva([\n 'inline-flex items-center justify-center',\n 'min-w-[1.5rem] h-6 px-1.5 rounded',\n 'border border-[var(--primary)]/40 bg-[var(--content-background)]',\n 'font-mono text-xs font-semibold text-[var(--primary-action)]',\n]);\n\n/** A bulk action button — outline on the lilac band, brand-coloured text + icon. */\nexport const bulkActionButtonVariants = cva([\n 'text-[var(--primary-action)] border-[var(--primary)]/30',\n 'hover:bg-[var(--content-background)]',\n]);\n","'use client';\n\n/**\n * BulkActionBar — a labelled toolbar shown above a Table when rows are selected.\n *\n * - `role=\"toolbar\"` single tab stop with arrow-key roving + Home/End.\n * - A persistent visually-hidden `role=\"status\"` region announces the selection\n * (\"N selected\"), so screen-reader users know the actions appeared.\n * - Sticky by default so it stays reachable while scrolling + selecting.\n * - Selection is consumer-owned: the bar is a pure view of `selectedCount` plus\n * consumer-supplied actions. Pair with {@link useBulkActionShortcut} for the\n * \"jump to actions\" keyboard shortcut.\n *\n * @see WCAG 2.2 AAA — 4.1.3 (status messages), 2.4.3 (focus order), 2.5.5 (44px targets)\n */\n\nimport {\n forwardRef,\n useEffect,\n useRef,\n useState,\n type KeyboardEvent,\n type Ref,\n} from 'react';\nimport { Button } from '../Button';\nimport { cn } from '../../utils/cn';\nimport {\n bulkActionBarVariants,\n bulkActionToolbarVariants,\n bulkActionHintVariants,\n bulkActionKbdVariants,\n bulkActionButtonVariants,\n} from './BulkActionBar.styles';\nimport type { BulkActionBarProps } from './BulkActionBar.types';\n\nfunction setRef<T>(ref: Ref<T> | undefined, value: T | null): void {\n if (typeof ref === 'function') ref(value);\n else if (ref) (ref as { current: T | null }).current = value;\n}\n\nconst BulkActionBar = forwardRef<HTMLDivElement, BulkActionBarProps>(\n (\n {\n selectedCount,\n actions,\n onAction,\n onClearSelection,\n sticky = true,\n framed = false,\n showJumpHint = false,\n shortcutKey = 'A',\n labels,\n className,\n 'data-testid': dataTestId = 'bulk-action-bar',\n },\n forwardedRef\n ) => {\n const wrapperRef = useRef<HTMLDivElement | null>(null);\n const prevCount = useRef(selectedCount);\n\n // Roving tabindex over the logical order [Clear, ...actions].\n const itemRefs = useRef<(HTMLButtonElement | null)[]>([]);\n const [active, setActive] = useState(0);\n const total = actions.length + 1;\n const safeActive = Math.min(active, total - 1);\n\n const focusItem = (index: number): void => {\n const next = (index + total) % total;\n setActive(next);\n itemRefs.current[next]?.focus();\n };\n\n const onToolbarKeyDown = (event: KeyboardEvent<HTMLDivElement>): void => {\n switch (event.key) {\n case 'ArrowRight':\n case 'ArrowDown':\n event.preventDefault();\n focusItem(safeActive + 1);\n break;\n case 'ArrowLeft':\n case 'ArrowUp':\n event.preventDefault();\n focusItem(safeActive - 1);\n break;\n case 'Home':\n event.preventDefault();\n focusItem(0);\n break;\n case 'End':\n event.preventDefault();\n focusItem(total - 1);\n break;\n default:\n break;\n }\n };\n\n // Focus restoration: when the selection drops to 0 the toolbar unmounts. If\n // focus was inside it (e.g. on \"Clear\"), the browser drops focus to <body>.\n // Move it to the persistent wrapper instead so keyboard users keep their place.\n useEffect(() => {\n const previous = prevCount.current;\n prevCount.current = selectedCount;\n if (previous > 0 && selectedCount === 0) {\n const activeEl = document.activeElement;\n if (!activeEl || activeEl === document.body) {\n wrapperRef.current?.focus();\n }\n }\n }, [selectedCount]);\n\n const hasSelection = selectedCount > 0;\n const showHint = showJumpHint && Boolean(labels.jumpHint);\n\n // Live announcement: \"N selected. M actions available. Press A to jump…\"\n let liveText = '';\n if (hasSelection) {\n const parts = [labels.selectedCount(selectedCount)];\n if (labels.actionsAvailable) parts.push(labels.actionsAvailable(actions.length));\n if (showJumpHint && labels.jumpAnnouncement) parts.push(labels.jumpAnnouncement);\n liveText = parts.join('. ');\n }\n\n return (\n <div\n ref={(node) => {\n wrapperRef.current = node;\n setRef(forwardedRef, node);\n }}\n tabIndex={-1}\n className={cn('outline-none', className)}\n data-testid={dataTestId}\n >\n {/* Persistent live region — always mounted so the announcement fires reliably. */}\n <div className=\"sr-only\" role=\"status\" aria-live=\"polite\">\n {liveText}\n </div>\n\n {hasSelection && (\n <div className={bulkActionBarVariants({ sticky, framed })}>\n <div\n role=\"toolbar\"\n aria-label={labels.toolbarLabel(selectedCount)}\n aria-orientation=\"horizontal\"\n onKeyDown={onToolbarKeyDown}\n className={bulkActionToolbarVariants()}\n >\n <div className=\"flex items-center gap-4 flex-wrap\">\n <span className=\"text-sm font-bold text-[var(--content-foreground)]\">\n {labels.selectedCount(selectedCount)}\n </span>\n <Button\n ref={(node) => {\n itemRefs.current[0] = node;\n }}\n variant=\"link\"\n excludeFromTabOrder={safeActive !== 0}\n onFocus={() => setActive(0)}\n onPress={onClearSelection}\n >\n {labels.clear}\n </Button>\n {showHint && labels.jumpHint && (\n <span aria-hidden=\"true\" className={bulkActionHintVariants()}>\n {labels.jumpHint(<kbd className={bulkActionKbdVariants()}>{shortcutKey}</kbd>)}\n </span>\n )}\n </div>\n <div className=\"flex items-center gap-2 flex-wrap\">\n {actions.map((action, index) => {\n const itemIndex = index + 1;\n return (\n <Button\n key={action.id}\n ref={(node) => {\n itemRefs.current[itemIndex] = node;\n }}\n variant={action.tone === 'danger' ? 'destructive' : 'outline'}\n buttonVisualClassName={\n action.tone === 'danger' ? undefined : bulkActionButtonVariants()\n }\n isDisabled={action.isDisabled}\n excludeFromTabOrder={safeActive !== itemIndex}\n onFocus={() => setActive(itemIndex)}\n onPress={() => onAction(action.id)}\n >\n {action.icon != null && (\n <span aria-hidden=\"true\" className=\"inline-flex\">\n {action.icon}\n </span>\n )}\n {action.label}\n </Button>\n );\n })}\n </div>\n </div>\n </div>\n )}\n </div>\n );\n }\n);\n\nBulkActionBar.displayName = 'BulkActionBar';\n\nexport { BulkActionBar };\nexport {\n bulkActionBarVariants,\n bulkActionToolbarVariants,\n bulkActionHintVariants,\n} from './BulkActionBar.styles';\n","import type { Selection, Key } from 'react-aria-components';\n\n/**\n * Resolve a React-Aria {@link Selection} to a concrete count.\n *\n * React-Aria's `selectedKeys` can be the string sentinel `'all'` (emitted by the\n * select-all header checkbox), which has no `.size`. Passing `selectedKeys.size`\n * blindly therefore throws/NaNs exactly when everything is selected. This helper\n * resolves it correctly.\n *\n * @param selectedKeys The controlled `Selection` (`'all'` or a `Set<Key>`).\n * @param selectableKeys The keys currently eligible for selection — i.e. the rows\n * the table is rendering, with any disabled rows already excluded by the\n * consumer. When `selectedKeys` is `'all'`, the result is the size of this set.\n * @returns the number of selected rows.\n *\n * @example\n * const count = resolveSelectedCount(selectedKeys, positions.map((p) => p.id));\n */\nexport function resolveSelectedCount(\n selectedKeys: Selection,\n selectableKeys: Iterable<Key>\n): number {\n if (selectedKeys === 'all') {\n let count = 0;\n for (const _key of selectableKeys) {\n void _key;\n count += 1;\n }\n return count;\n }\n return selectedKeys.size;\n}\n","'use client';\n\nimport { useEffect } from 'react';\nimport type { RefObject } from 'react';\n\nexport interface UseBulkActionShortcutOptions {\n /**\n * The element the shortcut listens within — pass the table's scroll container\n * ref. Pressing the key while focus is inside this scope jumps focus to the\n * bulk toolbar. The listener is attached to this element, never `document` /\n * `window`, so two independent tables never fight over the key.\n */\n scopeRef: RefObject<HTMLElement | null>;\n /** Ref to the {@link BulkActionBar} (its outer element). Focus lands on its current roving item. */\n toolbarRef: RefObject<HTMLElement | null>;\n /** The shortcut key. Default `'a'` (case-insensitive). */\n key?: string;\n /** Disable the shortcut while keeping the toolbar fully usable. Default `false`. */\n disabled?: boolean;\n}\n\nconst TEXT_INPUT_TYPES = new Set([\n 'text',\n 'search',\n 'email',\n 'url',\n 'tel',\n 'number',\n 'password',\n]);\n\n/**\n * True when the event originated in a text-entry context, where a single-letter\n * shortcut must NOT fire. Stricter than a native-input check: also covers\n * `contenteditable` and the ARIA roles React-Aria inputs apply\n * (`textbox` / `searchbox` / `combobox`).\n */\nfunction isTextEntryTarget(target: EventTarget | null): boolean {\n if (!(target instanceof HTMLElement)) return false;\n if (target.isContentEditable) return true;\n if (target.closest('[contenteditable=\"\"],[contenteditable=\"true\"]')) return true;\n const tag = target.tagName;\n if (tag === 'TEXTAREA' || tag === 'SELECT') return true;\n if (tag === 'INPUT' && TEXT_INPUT_TYPES.has((target as HTMLInputElement).type)) {\n return true;\n }\n const role = target.getAttribute('role');\n return role === 'textbox' || role === 'searchbox' || role === 'combobox';\n}\n\n/**\n * Opt-in keyboard shortcut that jumps focus to a {@link BulkActionBar} from\n * anywhere within a scope (typically the table's scroll container) — so users\n * can stay on the row checkboxes while selecting, then jump to the actions on\n * demand.\n *\n * WCAG 2.1.4 (Character Key Shortcuts): the shortcut is single-character but\n * (a) can be turned off (`disabled`, or simply don't call the hook) and\n * (b) is active only when focus is within `scopeRef` and not in a text field —\n * both valid mitigations.\n */\nexport function useBulkActionShortcut({\n scopeRef,\n toolbarRef,\n key = 'a',\n disabled = false,\n}: UseBulkActionShortcutOptions): void {\n useEffect(() => {\n if (disabled) return;\n const scope = scopeRef.current;\n if (!scope) return;\n\n const onKeyDown = (event: KeyboardEvent): void => {\n if (event.metaKey || event.ctrlKey || event.altKey) return;\n if (event.key.toLowerCase() !== key.toLowerCase()) return;\n if (isTextEntryTarget(event.target)) return;\n\n const toolbar = toolbarRef.current;\n if (!toolbar) return;\n const target =\n toolbar.querySelector<HTMLElement>('[tabindex=\"0\"]') ??\n toolbar.querySelector<HTMLElement>('button:not([disabled])');\n if (target) {\n event.preventDefault();\n target.focus();\n }\n };\n\n scope.addEventListener('keydown', onKeyDown);\n return () => scope.removeEventListener('keydown', onKeyDown);\n }, [scopeRef, toolbarRef, key, disabled]);\n}\n","/**\n * Shared CVA Variant Utilities\n *\n * Common patterns extracted from component variants for consistency and reduced bundle size.\n * Use these constants in CVA definitions to ensure consistent styling across Themis.\n *\n * @see interaction-states.ts for interaction-specific styles (focus, hover, pressed)\n */\n\n// =============================================================================\n// Focus Ring Patterns\n// =============================================================================\n\n/**\n * Focus-within ring (for container elements with focusable children)\n * Use when the container should show focus when any child is focused\n */\nexport const FOCUS_WITHIN_RING = [\n 'focus-within:outline-none',\n 'focus-within:ring-2',\n 'focus-within:ring-[var(--ring)]',\n 'focus-within:ring-offset-2',\n] as const;\n\n/**\n * Focus-visible ring (for directly focusable elements)\n * Use for buttons, inputs, and other interactive elements\n */\nexport const FOCUS_VISIBLE_RING = [\n 'focus-visible:outline-none',\n 'focus-visible:ring-2',\n 'focus-visible:ring-[var(--ring)]',\n 'focus-visible:ring-offset-2',\n] as const;\n\n/**\n * Standard focus ring (for elements using :focus pseudo-class)\n * Prefer focus-visible when possible for better UX\n */\nexport const FOCUS_RING = [\n 'focus:outline-none',\n 'focus:ring-2',\n 'focus:ring-[var(--ring)]',\n] as const;\n\n/**\n * Focus with background change (for segments, cells, menu items)\n */\nexport const FOCUS_HIGHLIGHT = [\n 'focus:outline-none',\n 'focus:bg-[var(--accent)]',\n 'focus:text-[var(--accent-foreground)]',\n] as const;\n\n// =============================================================================\n// Disabled State Patterns\n// =============================================================================\n\n/**\n * Standard disabled state using disabled attribute\n */\nexport const DISABLED_STANDARD = [\n 'disabled:pointer-events-none',\n 'disabled:opacity-50',\n] as const;\n\n/**\n * Disabled state using data attribute (React Aria pattern)\n */\nexport const DISABLED_DATA_ATTR = [\n 'data-[disabled]:pointer-events-none',\n 'data-[disabled]:opacity-50',\n 'data-[disabled]:cursor-not-allowed',\n] as const;\n\n// =============================================================================\n// Size-Based Text Variants\n// =============================================================================\n\n/**\n * Small text size scale (xs -> sm -> base)\n */\nexport const TEXT_SIZE_SMALL_SCALE = {\n sm: 'text-xs',\n default: 'text-sm',\n lg: 'text-base',\n} as const;\n\n/**\n * Medium text size scale (sm -> base -> lg)\n */\nexport const TEXT_SIZE_MEDIUM_SCALE = {\n sm: 'text-sm',\n default: 'text-base',\n lg: 'text-lg',\n} as const;\n\n// =============================================================================\n// Touch Target Utilities\n// =============================================================================\n\n/**\n * WCAG 2.2 AAA minimum touch target (44x44px)\n */\nexport const TOUCH_TARGET_MIN = [\n 'min-h-[44px]',\n 'min-w-[44px]',\n] as const;\n\n/**\n * Common button/cell sizes with touch target compliance\n */\nexport const INTERACTIVE_SIZES = {\n sm: 'h-9 w-9', // 36px - desktop only, NOT AAA compliant\n default: 'h-11 w-11', // 44px - AAA compliant\n lg: 'h-14 w-14', // 56px - AAA compliant, enhanced\n} as const;\n\n/**\n * Height-only sizes for fields and inputs\n */\nexport const FIELD_HEIGHTS = {\n sm: 'h-9', // 36px\n default: 'h-10', // 40px\n lg: 'h-11', // 44px\n} as const;\n\n/**\n * Layer 2: Visual sizing for form field inputs (height + padding + font).\n * Use on the <input>, <select>, or trigger element itself.\n *\n * Components may append additional classes (e.g. gap-* for segmented fields, py-* for text inputs).\n */\nexport const FIELD_INPUT_SIZES = {\n sm: `${FIELD_HEIGHTS.sm} px-2 text-xs`,\n default: `${FIELD_HEIGHTS.default} px-3 text-sm`,\n lg: `${FIELD_HEIGHTS.lg} px-4 text-base`,\n} as const;\n\n/**\n * Layer 1: Invisible touch target wrapper for form fields.\n * Apply to a <label> (or wrapper div) around the input element.\n * The <label> natively routes clicks/taps to the contained input\n * without JavaScript — achieving a 44px touch target while the\n * input stays at its visual height (h-9/h-10/h-11).\n */\nexport const FIELD_TOUCH_TARGET = 'min-h-[44px] flex items-center' as const;\n\n// =============================================================================\n// Message/Feedback Patterns\n// =============================================================================\n\n/**\n * Error message styling\n */\nexport const ERROR_MESSAGE_BASE = [\n 'flex',\n 'items-center',\n 'gap-1.5',\n 'text-[var(--destructive-background)]',\n] as const;\n\n/**\n * Success message styling\n */\nexport const SUCCESS_MESSAGE_BASE = [\n 'flex',\n 'items-center',\n 'gap-1.5',\n 'text-[var(--success-background)]',\n] as const;\n\n/**\n * Description/helper text styling\n */\nexport const DESCRIPTION_BASE = [\n 'text-[var(--menu-muted)]',\n] as const;\n\n/**\n * Label base styling\n */\nexport const LABEL_BASE = [\n 'font-medium',\n 'text-[var(--content-foreground)]',\n] as const;\n\n/**\n * Required indicator pattern\n */\nexport const REQUIRED_INDICATOR = \"after:content-['*'] after:ml-0.5 after:text-[var(--destructive-background)]\";\n\n// =============================================================================\n// Animation Patterns\n// =============================================================================\n\n/**\n * Popover/dropdown entry animation\n */\nexport const POPOVER_ANIMATION_IN = [\n 'data-[entering]:animate-in',\n 'data-[entering]:fade-in-0',\n 'data-[entering]:zoom-in-95',\n] as const;\n\n/**\n * Popover/dropdown exit animation\n */\nexport const POPOVER_ANIMATION_OUT = [\n 'data-[exiting]:animate-out',\n 'data-[exiting]:fade-out-0',\n 'data-[exiting]:zoom-out-95',\n] as const;\n\n/**\n * Modal content enter animation (fade + zoom)\n * Uses React Aria data-[entering]/data-[exiting] attributes\n */\nexport const MODAL_ANIMATION_IN = [\n 'data-[entering]:animate-in',\n 'data-[entering]:fade-in-0',\n 'data-[entering]:zoom-in-95',\n 'data-[entering]:duration-200',\n 'data-[entering]:ease-out',\n] as const;\n\n/**\n * Modal content exit animation (fade + zoom)\n * Uses React Aria data-[entering]/data-[exiting] attributes\n */\nexport const MODAL_ANIMATION_OUT = [\n 'data-[exiting]:animate-out',\n 'data-[exiting]:fade-out-0',\n 'data-[exiting]:zoom-out-95',\n 'data-[exiting]:duration-150',\n 'data-[exiting]:ease-in',\n] as const;\n\n/**\n * Modal slide enter animation (fade + slide up)\n */\nexport const MODAL_SLIDE_IN = [\n 'data-[entering]:animate-in',\n 'data-[entering]:fade-in-0',\n 'data-[entering]:slide-in-from-bottom-4',\n 'data-[entering]:duration-200',\n 'data-[entering]:ease-out',\n] as const;\n\n/**\n * Modal slide exit animation (fade + slide down)\n */\nexport const MODAL_SLIDE_OUT = [\n 'data-[exiting]:animate-out',\n 'data-[exiting]:fade-out-0',\n 'data-[exiting]:slide-out-to-bottom-4',\n 'data-[exiting]:duration-150',\n 'data-[exiting]:ease-in',\n] as const;\n\n/**\n * Directional slide animations for edge-anchored drawers (Modal `position` variant).\n *\n * Unitless `slide-in-from-*` / `slide-out-to-*` translate the full extent of the\n * element (100%), so the drawer slides all the way in from / out to its anchored\n * edge — distinct from `MODAL_SLIDE_*` above, which is the small 1rem nudge used by\n * the centred `slide` animation. No `fade` is paired here: a drawer slides, it\n * does not fade. Honour `prefers-reduced-motion` via REDUCED_MOTION on the element.\n */\nexport const MODAL_SLIDE_IN_LEFT = [\n 'data-[entering]:animate-in',\n 'data-[entering]:slide-in-from-left',\n 'data-[entering]:duration-200',\n 'data-[entering]:ease-out',\n] as const;\n\nexport const MODAL_SLIDE_OUT_LEFT = [\n 'data-[exiting]:animate-out',\n 'data-[exiting]:slide-out-to-left',\n 'data-[exiting]:duration-150',\n 'data-[exiting]:ease-in',\n] as const;\n\nexport const MODAL_SLIDE_IN_RIGHT = [\n 'data-[entering]:animate-in',\n 'data-[entering]:slide-in-from-right',\n 'data-[entering]:duration-200',\n 'data-[entering]:ease-out',\n] as const;\n\nexport const MODAL_SLIDE_OUT_RIGHT = [\n 'data-[exiting]:animate-out',\n 'data-[exiting]:slide-out-to-right',\n 'data-[exiting]:duration-150',\n 'data-[exiting]:ease-in',\n] as const;\n\nexport const MODAL_SLIDE_IN_TOP = [\n 'data-[entering]:animate-in',\n 'data-[entering]:slide-in-from-top',\n 'data-[entering]:duration-200',\n 'data-[entering]:ease-out',\n] as const;\n\nexport const MODAL_SLIDE_OUT_TOP = [\n 'data-[exiting]:animate-out',\n 'data-[exiting]:slide-out-to-top',\n 'data-[exiting]:duration-150',\n 'data-[exiting]:ease-in',\n] as const;\n\nexport const MODAL_SLIDE_IN_BOTTOM = [\n 'data-[entering]:animate-in',\n 'data-[entering]:slide-in-from-bottom',\n 'data-[entering]:duration-200',\n 'data-[entering]:ease-out',\n] as const;\n\nexport const MODAL_SLIDE_OUT_BOTTOM = [\n 'data-[exiting]:animate-out',\n 'data-[exiting]:slide-out-to-bottom',\n 'data-[exiting]:duration-150',\n 'data-[exiting]:ease-in',\n] as const;\n\n/**\n * Modal overlay enter/exit animation (fade only)\n */\nexport const MODAL_OVERLAY_IN = [\n 'data-[entering]:animate-in',\n 'data-[entering]:fade-in-0',\n 'data-[entering]:duration-200',\n] as const;\n\nexport const MODAL_OVERLAY_OUT = [\n 'data-[exiting]:animate-out',\n 'data-[exiting]:fade-out-0',\n 'data-[exiting]:duration-150',\n] as const;\n\n/**\n * Reduced motion support (WCAG 2.2)\n */\nexport const REDUCED_MOTION = [\n 'motion-reduce:transition-none',\n 'motion-reduce:animate-none',\n] as const;\n\n/**\n * Standard transition for colors\n */\nexport const TRANSITION_COLORS = [\n 'transition-colors',\n 'duration-200',\n] as const;\n\n/**\n * Fast transition for interactions\n */\nexport const TRANSITION_FAST = [\n 'transition-colors',\n 'duration-150',\n] as const;\n\n// =============================================================================\n// Hover State Patterns\n// =============================================================================\n\n/**\n * Accent background on hover (for interactive items)\n */\nexport const HOVER_ACCENT = [\n 'hover:bg-[var(--accent)]',\n 'hover:text-[var(--accent-foreground)]',\n] as const;\n\n// =============================================================================\n// Helper Functions\n// =============================================================================\n\n/**\n * Combines multiple style arrays into a flat array for CVA base styles\n */\nexport function combineStyles(...styles: (readonly string[] | string)[]): string[] {\n return styles.flatMap(s => Array.isArray(s) ? [...s] : [s]);\n}\n","/**\n * Detection + dismissal guard for in-page writing-assistant browser extensions\n * (Grammarly, LanguageTool, Wordtune, …).\n *\n * These extensions inject their suggestion UI as elements appended to `<body>`,\n * outside any open overlay's DOM subtree. React Aria's `isDismissable` behaviour\n * treats a click on that injected UI as an \"outside click\" and dismisses the\n * overlay — so clicking a spelling suggestion silently closes the form pop-up\n * and discards the user's in-progress correction.\n *\n * The guard below lets overlays keep open when the interaction lands on an\n * extension-injected node, while every other outside click, Escape, and the\n * close button behave exactly as before.\n */\n\nconst MAX_ANCESTOR_DEPTH = 100;\n\n/**\n * Returns `true` when `element` belongs to an injected in-page writing\n * assistant (Grammarly, LanguageTool, Wordtune, …).\n *\n * UX-ONLY heuristic. This is a deliberately spoofable DOM sniff used solely to\n * keep a form pop-up open when a writing-assistant suggestion is clicked. It is\n * NOT a security/authorization control and must never gate access to data or\n * actions (the frontend is not a security boundary). Pure function — never log\n * the element (it can reference arbitrary DOM / user content).\n */\nexport function isExtensionInjectedElement(element: Element): boolean {\n if (!(element instanceof Element)) return false;\n\n // 1. Known-vendor markers (authoritative). Walk up via parentElement, and\n // climb shadow boundaries via getRootNode().host so detection still finds\n // the <grammarly-extension> host if React Aria's shadowDOM flag is ever\n // enabled (it defaults to false today → the document-level listener\n // already receives the retargeted host, so the parentElement walk alone\n // suffices currently). Depth-bounded as a defensive guard against a\n // crafted/overridden getRootNode/host returning a cycle (which would\n // otherwise hang the tab — a client-side DoS).\n let node: Element | null = element;\n for (let depth = 0; node && depth < MAX_ANCESTOR_DEPTH; depth++) {\n const tag = node.tagName?.toLowerCase() ?? '';\n if (tag.startsWith('grammarly-')) return true; // Grammarly\n if (tag.startsWith('lt-')) return true; // LanguageTool\n if (node.hasAttribute('data-grammarly-shadow-root')) return true;\n\n if (node.parentElement) {\n node = node.parentElement;\n } else {\n const root = node.getRootNode();\n node = root instanceof ShadowRoot ? root.host : null;\n }\n }\n\n // 2. Structural fallback (best-effort, future-proofs the long tail).\n // Extensions inject their UI as a custom element (hyphenated tag name)\n // mounted as a top-level sibling of the React root — i.e. a direct child\n // of <body>/<html>. Our app never renders body-level custom elements, and\n // React Aria portals render plain <div>s, so this stays safe for any\n // future first-party web component nested inside the app tree.\n let custom: Element | null = element;\n while (custom && !custom.tagName.includes('-')) {\n custom = custom.parentElement;\n }\n if (!custom) return false;\n\n const parent = custom.parentElement;\n return parent === document.body || parent === document.documentElement;\n}\n\n/**\n * Builds a `shouldCloseOnInteractOutside` predicate for React Aria overlays\n * that keeps the overlay open when the interaction targets an extension-injected\n * element, while preserving any consumer-supplied predicate.\n *\n * React Aria semantics: the predicate returns `true` ⇒ the overlay should\n * close. So we close only when the element is NOT extension-injected AND the\n * consumer (if any) also agrees it should close.\n */\nexport function createInteractOutsideGuard(\n consumerShouldClose?: (element: Element) => boolean,\n): (element: Element) => boolean {\n return (element: Element): boolean =>\n !isExtensionInjectedElement(element) && (consumerShouldClose?.(element) ?? true);\n}\n","import { cva, type VariantProps } from 'class-variance-authority';\nimport { FIELD_INPUT_SIZES } from '../../styles';\nimport type { SelectSize } from './Select.types';\n\n/**\n * CVA Variants for Select Trigger Button\n *\n * Styles the trigger button that opens the select popover.\n * All sizes enforce 44px minimum touch targets for WCAG 2.2 AAA compliance.\n */\nexport const selectTriggerVariants = cva(\n [\n // Base styles\n 'flex',\n 'w-full',\n 'items-center',\n 'justify-between',\n 'gap-2',\n 'rounded-md',\n 'border',\n 'bg-[var(--content-background)]',\n 'text-[var(--content-foreground)]',\n 'transition-colors',\n 'duration-200',\n 'outline-none',\n // Focus ring (WCAG 2.2 AAA - 7:1 contrast)\n 'focus-visible:ring-2',\n 'focus-visible:ring-[var(--ring)]',\n 'focus-visible:ring-offset-2',\n // Hover state\n 'hover:bg-[var(--accent)]/10',\n // Disabled state\n 'disabled:cursor-not-allowed',\n 'disabled:opacity-50',\n // Loading state\n 'data-[loading=true]:cursor-wait',\n // Truncate text\n 'truncate',\n ],\n {\n variants: {\n size: {\n sm: `${FIELD_INPUT_SIZES.sm} pr-1`,\n default: `${FIELD_INPUT_SIZES.default} pr-1.5`,\n lg: `${FIELD_INPUT_SIZES.lg} pr-2`,\n },\n isInvalid: {\n true: 'border-[var(--destructive-background)]',\n false: 'border-[var(--input-border)] hover:border-[var(--input-border)]/80',\n },\n },\n defaultVariants: {\n size: 'default',\n isInvalid: false,\n },\n }\n);\n\n/**\n * CVA Variants for Select Items\n *\n * Styles individual selectable items within the listbox.\n * All sizes enforce 44px minimum touch targets for WCAG 2.2 AAA compliance.\n */\nexport const selectItemVariants = cva(\n [\n // Base styles\n 'relative',\n 'flex',\n 'w-full',\n 'cursor-pointer',\n 'select-none',\n 'items-center',\n 'rounded-sm',\n 'outline-none',\n 'transition-colors',\n // Padding for checkmark icon (left side)\n 'pl-8',\n 'pr-2',\n // Hover state\n 'hover:bg-[var(--accent)]',\n 'hover:text-[var(--accent-foreground)]',\n // Focus state\n 'focus:bg-[var(--accent)]',\n 'focus:text-[var(--accent-foreground)]',\n // Selected state\n 'data-[selected=true]:bg-[var(--accent)]',\n 'data-[selected=true]:text-[var(--accent-foreground)]',\n // Disabled state\n 'data-[disabled=true]:pointer-events-none',\n 'data-[disabled=true]:opacity-50',\n 'data-[disabled=true]:text-[var(--menu-muted)]',\n ],\n {\n variants: {\n size: {\n sm: `${FIELD_INPUT_SIZES.sm} py-1`,\n default: `${FIELD_INPUT_SIZES.default} py-2`,\n lg: `${FIELD_INPUT_SIZES.lg} py-3`,\n },\n },\n defaultVariants: {\n size: 'default',\n },\n }\n);\n\n/**\n * CVA Variants for Select Popover\n *\n * Styles the popover container that holds the listbox.\n * Uses menu tokens to match Dropdown styling.\n */\nexport const selectPopoverVariants = cva(\n [\n // Base styles - use menu tokens to match Dropdown styling\n 'z-50',\n 'w-[--trigger-width]',\n 'rounded-md',\n 'border',\n 'border-[var(--menu-border)]',\n 'bg-[var(--menu-background)]',\n 'text-[var(--menu-foreground)]',\n 'outline-none',\n 'overflow-auto',\n // Animations\n 'data-[entering]:animate-in',\n 'data-[entering]:fade-in-0',\n 'data-[entering]:zoom-in-95',\n 'data-[exiting]:animate-out',\n 'data-[exiting]:fade-out-0',\n 'data-[exiting]:zoom-out-95',\n ],\n {\n variants: {\n size: {\n // The `max-h-*` classes are a no-JS/pre-positioning fallback only. Once\n // React Aria positions the popover it writes an inline `max-height` that\n // wins over these classes, so the real cap comes from the `maxHeight`\n // prop (see SELECT_POPOVER_MAX_HEIGHT) which React Aria clamps to the\n // available viewport space.\n sm: 'max-h-[200px] p-1',\n default: 'max-h-[300px] p-1',\n lg: 'max-h-[400px] p-1',\n },\n },\n defaultVariants: {\n size: 'default',\n },\n }\n);\n\n/**\n * Max popover height (px) passed to React Aria's `<Popover maxHeight>` prop.\n *\n * React Aria only honours a height cap supplied as a prop — it overrides any\n * CSS `max-height` with an inline style on open. Passing these values lets it\n * clamp the popover to `min(cap, availableViewportSpace)` so the list never\n * runs off the page and scrolls internally instead. Values match the\n * `max-h-*` fallbacks in selectPopoverVariants.\n */\nexport const SELECT_POPOVER_MAX_HEIGHT: Record<SelectSize, number> = {\n sm: 200,\n default: 300,\n lg: 400,\n};\n\n/**\n * CVA Variants for Section Headers\n *\n * Styles the non-interactive section header labels within grouped selects.\n */\nexport const selectSectionVariants = cva(\n [\n 'px-2',\n 'py-1.5',\n 'text-xs',\n 'font-semibold',\n 'text-[var(--menu-muted)]',\n 'uppercase',\n 'tracking-wider',\n ],\n {\n variants: {\n size: {\n sm: 'px-2 py-1 text-[10px]',\n default: 'px-2 py-1 text-xs',\n lg: 'px-2 py-1.5 text-xs',\n },\n },\n defaultVariants: {\n size: 'default',\n },\n }\n);\n\n/**\n * CVA Variants for Error Messages\n *\n * Styles the error message displayed below the select trigger.\n */\nexport const selectErrorVariants = cva(\n [\n 'flex',\n 'items-center',\n 'gap-1.5',\n 'text-sm',\n 'font-medium',\n 'text-[var(--destructive-background)]',\n // mt-1 (4px) per design spec \"Input → hint: 4px\"; variants below override for size\n 'mt-1',\n ],\n {\n variants: {\n size: {\n sm: 'text-xs mt-1',\n default: 'text-sm mt-1',\n lg: 'text-base mt-1',\n },\n },\n defaultVariants: {\n size: 'default',\n },\n }\n);\n\n/**\n * Type exports for variant props.\n * Allows TypeScript inference of variant combinations.\n */\nexport type SelectTriggerVariantProps = VariantProps<typeof selectTriggerVariants>;\nexport type SelectItemVariantProps = VariantProps<typeof selectItemVariants>;\nexport type SelectPopoverVariantProps = VariantProps<typeof selectPopoverVariants>;\nexport type SelectSectionVariantProps = VariantProps<typeof selectSectionVariants>;\nexport type SelectErrorVariantProps = VariantProps<typeof selectErrorVariants>;\n","'use client';\n\n/**\n * Select Component - Implementation\n *\n * Accessible select/dropdown component combining React Aria primitives with ShadCN styling.\n * Follows Themis library patterns with compound component structure.\n *\n * Architecture:\n * - SelectBase: Internal component containing shared label, description, trigger, error, and listbox rendering.\n * - SelectRoot: Single selection wrapper (thin layer over SelectBase).\n * - MultiSelectRoot: Multiple selection wrapper with display value logic (thin layer over SelectBase).\n * - SelectItem, SelectSection, SelectHeader: Compound sub-components.\n *\n * @see select-prd.md (Full requirements)\n * @see Select.types.ts (Zod schemas)\n * @see Select.styles.ts (CVA variant definitions)\n * @see plan.md (Implementation plan)\n */\n\nimport {\n forwardRef,\n memo,\n Children,\n useId,\n useMemo,\n isValidElement,\n type ReactElement,\n type ReactNode,\n type Ref,\n} from 'react';\nimport {\n Select as AriaSelect,\n Label,\n Button,\n SelectValue,\n Popover,\n ListBox,\n ListBoxItem,\n ListBoxSection,\n Header,\n Text,\n FieldError,\n} from 'react-aria-components';\nimport { Check, CheckSquare, ChevronDown, Loader2 } from 'lucide-react';\nimport { FIELD_TOUCH_TARGET } from '../../styles';\nimport { cn } from '../../utils/cn';\nimport { createInteractOutsideGuard } from '../../utils/browserExtensionOverlay';\nimport type {\n SelectProps,\n SelectItemProps,\n SelectSectionProps,\n SelectHeaderProps,\n SelectSize,\n} from './Select.types';\nimport {\n selectTriggerVariants,\n selectItemVariants,\n selectPopoverVariants,\n selectSectionVariants,\n selectErrorVariants,\n SELECT_POPOVER_MAX_HEIGHT,\n} from './Select.styles';\n\n// Re-export CVA variants so existing imports from './Select' continue to work\nexport {\n selectTriggerVariants,\n selectItemVariants,\n selectPopoverVariants,\n selectSectionVariants,\n selectErrorVariants,\n} from './Select.styles';\n\n// Hoisted static JSX — avoids re-creation on every render\nconst LOADING_SKELETON = Array.from({ length: 3 }).map((_, i) => (\n <div\n key={`skeleton-${i}`}\n className=\"h-11 px-4 py-2\"\n >\n <div className=\"h-4 bg-[var(--accent-background)] rounded animate-pulse\" />\n </div>\n));\n\n/**\n * Internal props for SelectBase.\n * Extends the shared props with selection-mode-specific configuration.\n */\ninterface SelectBaseProps {\n /** The AriaSelect props to spread onto the root element */\n ariaSelectProps: Record<string, unknown>;\n /** Content to render inside the trigger button (SelectValue for single, span for multi) */\n triggerContent: ReactNode;\n /** Ref to forward to the trigger button */\n triggerRef: Ref<HTMLButtonElement>;\n /** Label text */\n label: string;\n /** Optional description text */\n description?: string;\n /** Whether the field is required */\n isRequired: boolean;\n /** Whether the field is disabled */\n isDisabled: boolean;\n /** Whether the field is in a loading state */\n isLoading: boolean;\n /** Error message to display */\n errorMessage?: string;\n /** Size variant */\n size: SelectSize;\n /** Empty state message override */\n emptyStateMessage?: string;\n /** Child count (pre-computed by parent) */\n childCount: number;\n /** Children to render in the listbox */\n children: ReactNode;\n}\n\n/**\n * SelectBase - Internal shared rendering component\n *\n * Contains the shared rendering logic for label, description, trigger button,\n * error message, and popover/listbox that both SelectRoot and MultiSelectRoot use.\n * This is not exported as part of the public API.\n */\nfunction SelectBase({\n ariaSelectProps,\n triggerContent,\n triggerRef,\n label,\n description,\n isRequired,\n isDisabled,\n isLoading,\n errorMessage,\n size,\n emptyStateMessage,\n childCount,\n children,\n}: SelectBaseProps): ReactElement {\n // Generate unique IDs for accessibility\n const labelId = useId();\n const descriptionId = useId();\n const errorId = useId();\n\n // Determine if invalid based on errorMessage\n const isInvalid = Boolean(errorMessage);\n\n // Stack label, description, trigger and error vertically (matching TextField). Without\n // this the inline <label> and description <span> collapse onto one line, so the helper\n // text reads as part of the label instead of sitting beneath the field.\n const { className: rootClassName, ...restAriaSelectProps } = ariaSelectProps as { className?: string } & Record<string, unknown>;\n\n return (\n <AriaSelect\n {...restAriaSelectProps}\n className={cn('flex flex-col gap-1.5', rootClassName)}\n isInvalid={isInvalid}\n >\n {/* Label */}\n <Label id={labelId} className=\"text-sm font-medium text-[var(--content-foreground)]\">\n {label}\n {isRequired && <span className=\"text-[var(--destructive-background)] ml-1\">*</span>}\n </Label>\n\n {/* Description (if provided) — sits below the label; the root's gap handles spacing. */}\n {description && (\n <Text id={descriptionId} slot=\"description\" className=\"text-sm text-[var(--menu-muted)]\">\n {description}\n </Text>\n )}\n\n {/* Layer 1: Touch target (44px min) */}\n <div className={FIELD_TOUCH_TARGET}>\n {/* Layer 2: Visual trigger button */}\n <Button\n ref={triggerRef}\n className={selectTriggerVariants({ size, isInvalid })}\n aria-labelledby={labelId}\n aria-describedby={description ? descriptionId : errorMessage ? errorId : undefined}\n data-loading={isLoading}\n {...(isRequired && { 'aria-required': 'true' })}\n {...(isLoading && { 'aria-busy': 'true' })}\n {...((isDisabled || isLoading) && { 'aria-disabled': 'true' })}\n >\n {triggerContent}\n\n {/* Loading spinner or chevron icon */}\n {isLoading ? (\n <Loader2 className=\"ml-auto h-4 w-4 shrink-0 animate-spin text-[var(--menu-muted)]\" aria-hidden=\"true\" />\n ) : (\n <ChevronDown className=\"ml-auto h-4 w-4 shrink-0 text-[var(--menu-muted)]\" aria-hidden=\"true\" />\n )}\n </Button>\n </div>\n\n {/* Error Message — text only, no decorative icon. Errors are conveyed\n by the red border on the trigger plus the message text colour;\n a leading icon adds visual noise that the other field types don't\n carry (NumberField, TextField error message, RichTextEditor). */}\n <FieldError id={errorId} className={selectErrorVariants({ size })}>\n {({ validationErrors }) => {\n const displayError = errorMessage || validationErrors.join(' ');\n return displayError ? <>{displayError}</> : null;\n }}\n </FieldError>\n\n {/* Popover with ListBox */}\n <Popover\n shouldCloseOnInteractOutside={createInteractOutsideGuard()}\n maxHeight={SELECT_POPOVER_MAX_HEIGHT[size]}\n className={selectPopoverVariants({ size })}\n >\n <ListBox className=\"outline-none\">\n {/* Loading skeleton (if loading and has children) */}\n {isLoading && childCount > 0 && LOADING_SKELETON}\n\n {/* Items or empty state */}\n {!isLoading && (\n <>\n {children}\n {/* Empty state - render as disabled item so popover can open */}\n {childCount === 0 && (\n <ListBoxItem\n id=\"__empty__\"\n textValue=\"empty\"\n isDisabled\n className=\"py-6 text-center text-sm text-[var(--menu-muted)] cursor-default pointer-events-none\"\n >\n <span role=\"status\">\n {emptyStateMessage || 'No options available'}\n </span>\n </ListBoxItem>\n )}\n </>\n )}\n </ListBox>\n </Popover>\n </AriaSelect>\n );\n}\n\n/**\n * Select Root Component (Single Selection Only)\n *\n * Main select component with controlled/uncontrolled modes for single selection.\n * For multiple selection, use MultiSelect component.\n * Delegates shared rendering to SelectBase.\n *\n * @see select-prd.md US-1 (Basic Single Selection)\n * @see plan.md Decision 28 (Ref forwarding to trigger button)\n */\nconst SelectRoot = forwardRef<HTMLButtonElement, Omit<SelectProps, 'selectionMode'>>(\n (\n {\n // Display props\n label,\n placeholder,\n description,\n\n // Selection props\n value,\n defaultValue,\n\n // State props\n isOpen,\n isDisabled = false,\n isRequired = false,\n disabledKeys,\n\n // Validation props\n validate,\n validationBehavior = 'aria',\n errorMessage,\n\n // Loading state\n isLoading = false,\n emptyStateMessage,\n\n // Form integration\n name,\n\n // Size variant\n size = 'default',\n\n // Event handlers\n onChange,\n onOpenChange,\n\n // Standard props\n className,\n children,\n ...props\n },\n ref\n ) => {\n // Warn if >1000 items (Decision 22: Large Item Count Handling)\n const childCount = Children.count(children);\n if (childCount > 1000) {\n console.warn(\n 'Select has >1000 items. Consider using Autocomplete component for better performance.'\n );\n }\n\n return (\n <SelectBase\n ariaSelectProps={{\n value: value as string,\n defaultValue: defaultValue as string,\n onChange: (key: unknown) => {\n if (onChange) {\n onChange(key as string);\n }\n },\n placeholder,\n disabledKeys,\n isOpen,\n onOpenChange,\n isDisabled: isDisabled || isLoading,\n isRequired,\n name,\n validate: validate as ((value: unknown) => true | string | null | undefined) | undefined,\n validationBehavior,\n className,\n ...props,\n }}\n triggerContent={<SelectValue className=\"flex-1 text-left truncate\" />}\n triggerRef={ref}\n label={label}\n description={description}\n isRequired={isRequired}\n isDisabled={isDisabled}\n isLoading={isLoading}\n errorMessage={errorMessage}\n size={size}\n emptyStateMessage={emptyStateMessage}\n childCount={childCount}\n >\n {children}\n </SelectBase>\n );\n }\n);\n\nSelectRoot.displayName = 'Select';\n\n/**\n * MultiSelect Root Component (Multiple Selection)\n *\n * Select component for multiple selection. Uses different API from single Select.\n * Delegates shared rendering to SelectBase, adding multi-select display value logic.\n *\n * @see select-prd.md US-6 (Multiple Selection)\n * @see plan.md Decision 28 (Ref forwarding to trigger button)\n */\nconst MultiSelectRoot = forwardRef<HTMLButtonElement, SelectProps>(\n (\n {\n // Display props\n label,\n placeholder,\n description,\n\n // Selection props\n value,\n defaultValue,\n selectionMode: _selectionMode = 'multiple',\n\n // State props\n isOpen,\n isDisabled = false,\n isRequired = false,\n disabledKeys,\n\n // Validation props\n validate,\n validationBehavior = 'aria',\n errorMessage,\n\n // Loading state\n isLoading = false,\n emptyStateMessage,\n\n // Form integration\n name,\n\n // Size variant\n size = 'default',\n\n // Event handlers\n onChange,\n onOpenChange,\n\n // Standard props\n className,\n children,\n ...props\n },\n ref\n ) => {\n // Warn if >1000 items\n const childCount = Children.count(children);\n if (childCount > 1000) {\n console.warn(\n 'Select has >1000 items. Consider using Autocomplete component for better performance.'\n );\n }\n\n // Build value-to-label map for display (memoized to prevent recreation on every render)\n const valueToLabelMap = useMemo(() => {\n const map = new Map<string, string>();\n const processChildren = (nodes: ReactNode): void => {\n Children.forEach(nodes, (child) => {\n if (isValidElement(child)) {\n const element = child as ReactElement<{ value?: string; children?: ReactNode }>;\n if (element.type === SelectItem || element.props?.value) {\n const itemValue = element.props.value;\n const itemChildren = element.props.children;\n if (itemValue && typeof itemChildren === 'string') {\n map.set(itemValue, itemChildren);\n }\n }\n if (element.props?.children) {\n processChildren(element.props.children);\n }\n }\n });\n };\n processChildren(children);\n return map;\n }, [children]);\n\n // Multi-select display logic (Decision 5: Multi-select threshold)\n // Memoized to prevent recalculation on every render\n const displayValue = useMemo(() => {\n if (!value || !Array.isArray(value) || value.length === 0) {\n return placeholder || '';\n }\n\n if (value.length <= 2) {\n // Show item labels for 1-2 items\n const labels = value.map(v => valueToLabelMap.get(v as string) || v);\n return labels.join(', ');\n }\n\n // Show count for 3+ items\n return `${value.length} items selected`;\n }, [value, valueToLabelMap, placeholder]);\n\n return (\n <SelectBase\n ariaSelectProps={{\n value: value as string[],\n defaultValue: defaultValue as string[],\n onChange: (keys: unknown) => {\n if (onChange) {\n onChange(keys as string[]);\n }\n },\n selectionMode: 'multiple',\n disabledKeys,\n isOpen,\n onOpenChange,\n isDisabled: isDisabled || isLoading,\n isRequired,\n name,\n validate: validate as ((value: unknown) => true | string | null | undefined) | undefined,\n validationBehavior,\n className,\n ...props,\n }}\n triggerContent={\n <span className=\"flex-1 text-left truncate\">\n {displayValue}\n </span>\n }\n triggerRef={ref}\n label={label}\n description={description}\n isRequired={isRequired}\n isDisabled={isDisabled}\n isLoading={isLoading}\n errorMessage={errorMessage}\n size={size}\n emptyStateMessage={emptyStateMessage}\n childCount={childCount}\n >\n {children}\n </SelectBase>\n );\n }\n);\n\nMultiSelectRoot.displayName = 'MultiSelect';\n\n/**\n * Select.Item Component\n *\n * Individual selectable item with checkmark icon.\n *\n * @see select-prd.md US-1 (Basic Single Selection)\n * @see plan.md Decision 6 (Left-side checkmark)\n * @see plan.md Decision 23 (textValue required for custom children)\n */\nconst SelectItem = memo(function SelectItem({ children, textValue, value, isDisabled = false, className, ...props }: SelectItemProps): ReactElement {\n // Validate textValue for custom children (Decision 23)\n if (!textValue && typeof children !== 'string') {\n const message = 'Select.Item with custom children requires textValue prop for accessibility';\n if (process.env.NODE_ENV === 'development') {\n throw new Error(message);\n } else {\n console.warn(message);\n }\n }\n\n return (\n <ListBoxItem\n id={value}\n textValue={textValue || (typeof children === 'string' ? children : undefined)}\n className={`${selectItemVariants({ size: 'default' })} ${className || ''}`}\n isDisabled={isDisabled}\n {...props}\n >\n {({ isSelected, selectionMode, isDisabled: itemDisabled }) => (\n <>\n {/* Checkmark icon (left side) - Decision 6 */}\n {selectionMode === 'multiple' ? (\n <CheckSquare\n className={`absolute left-2 h-4 w-4 ${isSelected ? 'visible' : 'invisible'}`}\n aria-hidden=\"true\"\n />\n ) : (\n isSelected && <Check className=\"absolute left-2 h-4 w-4\" aria-hidden=\"true\" />\n )}\n <span className={itemDisabled ? 'text-[var(--menu-muted)]' : ''}>\n {children}\n </span>\n </>\n )}\n </ListBoxItem>\n );\n});\n\nSelectItem.displayName = 'SelectItem';\n\n/**\n * Select.Section Component\n *\n * Groups related items with optional header.\n *\n * @see select-prd.md US-3 (Grouped Options with Sections)\n */\nfunction SelectSection({ children, className, ...props }: SelectSectionProps): ReactElement {\n return (\n <ListBoxSection className={`border-t border-[var(--border)] first:border-t-0 ${className || ''}`} {...props}>\n {children}\n </ListBoxSection>\n );\n}\n\nSelectSection.displayName = 'SelectSection';\n\n/**\n * Select.Header Component\n *\n * Section header with non-interactive label.\n *\n * @see select-prd.md US-3 (Grouped Options with Sections)\n */\nfunction SelectHeader({ children, className, ...props }: SelectHeaderProps): ReactElement {\n return (\n <Header className={`${selectSectionVariants({ size: 'default' })} ${className || ''}`} {...props}>\n {children}\n </Header>\n );\n}\n\nSelectHeader.displayName = 'SelectHeader';\n\n/**\n * Compound Component Exports\n *\n * Uses Object.assign() for compound components (e.g., Select.Item, Select.Section).\n * Named exports (SelectItem, SelectSection, SelectHeader) are also available below\n * for better tree-shaking. Prefer named exports in new code.\n *\n * @deprecated (v2) The Object.assign compound pattern will be removed in v2.\n * Migrate to named imports: `import { SelectItem, SelectSection, SelectHeader } from '...'`\n *\n * @see GUIDE.mdx (Compound component pattern)\n */\nexport const Select = Object.assign(SelectRoot, {\n Item: SelectItem,\n Section: SelectSection,\n Header: SelectHeader,\n});\n\nexport const MultiSelect = Object.assign(MultiSelectRoot, {\n Item: SelectItem,\n Section: SelectSection,\n Header: SelectHeader,\n});\n\n// Named exports for individual components (preferred for tree-shaking)\nexport { SelectRoot, MultiSelectRoot, SelectItem, SelectSection, SelectHeader };\n","import { cva } from 'class-variance-authority';\n\n/** Card region wrapper (the narrow-mode replacement for the table). */\nexport const cardRegionVariants = cva(['flex flex-col gap-3']);\n\n/** Tools row above the cards: select-all + sort control. */\nexport const cardToolsVariants = cva([\n 'flex items-center justify-between gap-3 flex-wrap px-0.5',\n]);\n\n/** The card list. */\nexport const cardListVariants = cva(['flex flex-col gap-2.5 list-none m-0 p-0']);\n\n/** A single card. Selected cards take the shared `--selected` tint. */\nexport const cardVariants = cva(\n [\n 'flex items-start gap-2.5 p-3.5',\n 'rounded-lg border border-[var(--border)] bg-[var(--content-background)]',\n 'motion-safe:transition-colors',\n ],\n {\n variants: {\n isSelected: {\n true: 'bg-[var(--selected)] border-[var(--primary)]/40',\n false: '',\n },\n },\n defaultVariants: { isSelected: false },\n }\n);\n\n/** The per-card selection checkbox cell (≥44px target). */\nexport const cardCheckVariants = cva([\n 'flex items-center justify-center min-w-[44px] min-h-[44px] -m-1 flex-none',\n]);\n\n/** The card body (consumer-rendered content). */\nexport const cardContentVariants = cva(['flex-1 min-w-0']);\n\n/** The activation wrapper around the card body when `onRowAction` is set —\n * a full-width unstyled button so the whole card is the tap target. */\nexport const cardActionVariants = cva([\n 'block w-full text-left cursor-pointer rounded-md',\n 'outline-none focus-visible:ring-2 focus-visible:ring-[var(--ring)] focus-visible:ring-offset-2',\n]);\n","'use client';\n\n/**\n * TableCardList — the narrow-viewport / narrow-container card view that pairs\n * with the desktop `Table`. Render it instead of `<Table>` when\n * {@link useContainerNarrow} reports the container is below your breakpoint:\n *\n * @example\n * const ref = useRef<HTMLDivElement>(null);\n * const narrow = useContainerNarrow(ref, 680);\n * <div ref={ref}>\n * {narrow\n * ? <TableCardList items={rows} getRowId={(r) => r.id} renderCard={...} selectionMode=\"multiple\" selectedKeys={k} onSelectionChange={setK} … />\n * : <Table selectedKeys={k} onSelectionChange={setK} …>…</Table>}\n * </div>\n *\n * Selection + sort state are consumer-owned (same `selectedKeys`/`sortDescriptor`\n * as the desktop Table), so switching views preserves them. Card mode adds a\n * select-all + a Sort `<Select>` (there are no clickable column headers).\n */\n\nimport { type ReactElement } from 'react';\nimport { Button as AriaButton } from 'react-aria-components';\nimport type { Selection, Key } from 'react-aria-components';\nimport { ArrowUp, ArrowDown } from 'lucide-react';\nimport { Checkbox } from '../Checkbox';\nimport { Select } from '../Select';\nimport { Button } from '../Button';\nimport { cn } from '../../utils/cn';\nimport {\n cardRegionVariants,\n cardToolsVariants,\n cardListVariants,\n cardVariants,\n cardCheckVariants,\n cardContentVariants,\n cardActionVariants,\n} from './TableCardList.styles';\nimport type { TableCardListProps } from './TableCardList.types';\n\nexport function TableCardList<T extends object>({\n items,\n getRowId,\n renderCard,\n selectionMode = 'none',\n selectedKeys = new Set<Key>(),\n onSelectionChange,\n onRowAction,\n sortDescriptor,\n onSortChange,\n sortColumns = [],\n renderEmptyState,\n labels,\n 'aria-label': ariaLabel,\n className,\n 'data-testid': dataTestId = 'table-card-list',\n}: TableCardListProps<T>): ReactElement {\n const selectable = selectionMode === 'multiple';\n const ids = items.map(getRowId);\n\n const isSelected = (id: Key): boolean => selectedKeys === 'all' || selectedKeys.has(id);\n const allSelected = ids.length > 0 && ids.every(isSelected);\n const someSelected = ids.some(isSelected) && !allSelected;\n const resolvedSet = (): Set<Key> =>\n selectedKeys === 'all' ? new Set(ids) : new Set(selectedKeys);\n\n const toggleAll = (): void => {\n onSelectionChange?.(allSelected ? new Set<Key>() : new Set(ids));\n };\n const toggleOne = (id: Key): void => {\n const next = resolvedSet();\n if (next.has(id)) next.delete(id);\n else next.add(id);\n onSelectionChange?.(next as Selection);\n };\n\n const sortValue = sortDescriptor?.column != null ? String(sortDescriptor.column) : undefined;\n const sortDirection = sortDescriptor?.direction ?? 'ascending';\n\n const onSortColumnChange = (value: string | string[]): void => {\n const column = Array.isArray(value) ? value[0] : value;\n if (column) onSortChange?.({ column, direction: sortDescriptor?.direction ?? 'ascending' });\n };\n const toggleSortDirection = (): void => {\n if (sortDescriptor?.column == null) return;\n onSortChange?.({\n column: sortDescriptor.column,\n direction: sortDirection === 'ascending' ? 'descending' : 'ascending',\n });\n };\n\n const hasTools = selectable || sortColumns.length > 0;\n const isEmpty = items.length === 0;\n\n return (\n <div\n role=\"region\"\n aria-label={ariaLabel}\n className={cn(cardRegionVariants(), className)}\n data-testid={dataTestId}\n >\n <p className=\"sr-only\" role=\"status\" aria-live=\"polite\">\n {labels.results(items.length)}\n </p>\n\n {hasTools && (\n <div className={cardToolsVariants()}>\n {selectable ? (\n <Checkbox\n label={labels.selectAll}\n isSelected={allSelected}\n isIndeterminate={someSelected}\n onChange={toggleAll}\n />\n ) : (\n <span />\n )}\n\n {sortColumns.length > 0 && (\n <div className=\"flex items-end gap-2\">\n <Select\n label={labels.sort}\n placeholder={labels.sortPlaceholder}\n value={sortValue}\n onChange={onSortColumnChange}\n >\n {sortColumns.map((column) => (\n <Select.Item key={column.id} value={column.id}>\n {column.label}\n </Select.Item>\n ))}\n </Select>\n <Button\n variant=\"ghost\"\n visualSize=\"icon\"\n isDisabled={sortDescriptor?.column == null}\n aria-label={labels.sortDirection(sortDirection)}\n onPress={toggleSortDirection}\n >\n {sortDirection === 'ascending' ? (\n <ArrowUp aria-hidden=\"true\" />\n ) : (\n <ArrowDown aria-hidden=\"true\" />\n )}\n </Button>\n </div>\n )}\n </div>\n )}\n\n {isEmpty ? (\n renderEmptyState ? (\n <div\n className=\"rounded-lg border border-dashed border-[var(--border)] p-8 text-center\"\n data-testid=\"card-empty-state\"\n >\n {renderEmptyState()}\n </div>\n ) : null\n ) : (\n <ul className={cardListVariants()}>\n {items.map((item) => {\n const id = getRowId(item);\n const selected = isSelected(id);\n return (\n <li key={String(id)} className={cardVariants({ isSelected: selected })}>\n {selectable && (\n <div className={cardCheckVariants()}>\n <Checkbox\n aria-label={labels.selectItem(item)}\n isSelected={selected}\n onChange={() => toggleOne(id)}\n />\n </div>\n )}\n <div className={cardContentVariants()}>\n {onRowAction ? (\n <AriaButton\n className={cardActionVariants()}\n data-testid=\"card-action\"\n onPress={() => onRowAction(id)}\n >\n {renderCard(item)}\n </AriaButton>\n ) : (\n renderCard(item)\n )}\n </div>\n </li>\n );\n })}\n </ul>\n )}\n </div>\n );\n}\n\nTableCardList.displayName = 'TableCardList';\n","'use client';\n\nimport { useEffect, useState, type RefObject } from 'react';\n\n/**\n * Track whether a referenced element is narrower than `breakpoint` (px), via a\n * `ResizeObserver`. This is a **container query**, not a viewport query — a table\n * inside a narrow panel reflows to cards even on a wide screen.\n *\n * Uses `offsetWidth` (ignores CSS transforms, e.g. zoom/preview scaling).\n *\n * @example\n * const ref = useRef<HTMLDivElement>(null);\n * const narrow = useContainerNarrow(ref, 680);\n * return <div ref={ref}>{narrow ? <TableCardList .../> : <Table .../>}</div>;\n */\nexport function useContainerNarrow(\n ref: RefObject<HTMLElement | null>,\n breakpoint: number\n): boolean {\n const [narrow, setNarrow] = useState(false);\n\n useEffect(() => {\n const el = ref.current;\n if (!el) return;\n\n const measure = (): void => setNarrow(el.offsetWidth < breakpoint);\n measure(); // initial — covers an already-narrow mount\n\n let observer: ResizeObserver | undefined;\n if (typeof ResizeObserver !== 'undefined') {\n observer = new ResizeObserver(measure);\n observer.observe(el);\n }\n window.addEventListener('resize', measure);\n return () => {\n window.removeEventListener('resize', measure);\n observer?.disconnect();\n };\n }, [ref, breakpoint]);\n\n return narrow;\n}\n"]}
|