@tribepad/themis 1.0.2 → 1.0.4

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.
Files changed (84) hide show
  1. package/dist/elements/Checkbox/index.js +1 -1
  2. package/dist/elements/Checkbox/index.js.map +1 -1
  3. package/dist/elements/Checkbox/index.mjs +1 -1
  4. package/dist/elements/Checkbox/index.mjs.map +1 -1
  5. package/dist/elements/CheckboxGroup/index.js +1 -1
  6. package/dist/elements/CheckboxGroup/index.js.map +1 -1
  7. package/dist/elements/CheckboxGroup/index.mjs +1 -1
  8. package/dist/elements/CheckboxGroup/index.mjs.map +1 -1
  9. package/dist/elements/DatePicker/index.js +1 -1
  10. package/dist/elements/DatePicker/index.js.map +1 -1
  11. package/dist/elements/DatePicker/index.mjs +1 -1
  12. package/dist/elements/DatePicker/index.mjs.map +1 -1
  13. package/dist/elements/FileField/index.js +1 -1
  14. package/dist/elements/FileField/index.js.map +1 -1
  15. package/dist/elements/FileField/index.mjs +1 -1
  16. package/dist/elements/FileField/index.mjs.map +1 -1
  17. package/dist/elements/NumberField/NumberField.variants.d.ts +1 -1
  18. package/dist/elements/NumberField/index.js +1 -1
  19. package/dist/elements/NumberField/index.js.map +1 -1
  20. package/dist/elements/NumberField/index.mjs +1 -1
  21. package/dist/elements/NumberField/index.mjs.map +1 -1
  22. package/dist/elements/OTPInput/index.js +1 -1
  23. package/dist/elements/OTPInput/index.js.map +1 -1
  24. package/dist/elements/OTPInput/index.mjs +1 -1
  25. package/dist/elements/OTPInput/index.mjs.map +1 -1
  26. package/dist/elements/Progress/index.js +1 -1
  27. package/dist/elements/Progress/index.js.map +1 -1
  28. package/dist/elements/Progress/index.mjs +1 -1
  29. package/dist/elements/Progress/index.mjs.map +1 -1
  30. package/dist/elements/RadioGroup/index.js +1 -1
  31. package/dist/elements/RadioGroup/index.js.map +1 -1
  32. package/dist/elements/RadioGroup/index.mjs +1 -1
  33. package/dist/elements/RadioGroup/index.mjs.map +1 -1
  34. package/dist/elements/Resizable/index.js +1 -1
  35. package/dist/elements/Resizable/index.js.map +1 -1
  36. package/dist/elements/Resizable/index.mjs +1 -1
  37. package/dist/elements/Resizable/index.mjs.map +1 -1
  38. package/dist/elements/Select/index.js +1 -1
  39. package/dist/elements/Select/index.js.map +1 -1
  40. package/dist/elements/Select/index.mjs +1 -1
  41. package/dist/elements/Select/index.mjs.map +1 -1
  42. package/dist/elements/Switch/index.js +1 -1
  43. package/dist/elements/Switch/index.js.map +1 -1
  44. package/dist/elements/Switch/index.mjs +1 -1
  45. package/dist/elements/Switch/index.mjs.map +1 -1
  46. package/dist/elements/Table/index.js +1 -1
  47. package/dist/elements/Table/index.js.map +1 -1
  48. package/dist/elements/Table/index.mjs +1 -1
  49. package/dist/elements/Table/index.mjs.map +1 -1
  50. package/dist/elements/Tabs/Tabs.d.ts +5 -3
  51. package/dist/elements/Tabs/Tabs.d.ts.map +1 -1
  52. package/dist/elements/Tabs/Tabs.types.d.ts +15 -0
  53. package/dist/elements/Tabs/Tabs.types.d.ts.map +1 -1
  54. package/dist/elements/Tabs/index.js +1 -1
  55. package/dist/elements/Tabs/index.js.map +1 -1
  56. package/dist/elements/Tabs/index.mjs +1 -1
  57. package/dist/elements/Tabs/index.mjs.map +1 -1
  58. package/dist/elements/TimeField/index.js +1 -1
  59. package/dist/elements/TimeField/index.js.map +1 -1
  60. package/dist/elements/TimeField/index.mjs +1 -1
  61. package/dist/elements/TimeField/index.mjs.map +1 -1
  62. package/dist/elements/index.js +1 -1
  63. package/dist/elements/index.js.map +1 -1
  64. package/dist/elements/index.mjs +1 -1
  65. package/dist/elements/index.mjs.map +1 -1
  66. package/dist/index.js +2 -2
  67. package/dist/index.js.map +1 -1
  68. package/dist/index.mjs +2 -2
  69. package/dist/index.mjs.map +1 -1
  70. package/dist/styles/index.js +1 -1
  71. package/dist/styles/index.js.map +1 -1
  72. package/dist/styles/index.mjs +1 -1
  73. package/dist/styles/index.mjs.map +1 -1
  74. package/dist/styles/shared-variants.d.ts +3 -3
  75. package/dist/styles/shared-variants.d.ts.map +1 -1
  76. package/dist/tailwind-source.css +8 -0
  77. package/package.json +7 -6
  78. package/src/elements/AlertDialog/AlertDialog.stories.tsx +1 -1
  79. package/src/elements/CheckboxGroup/CheckboxGroup.stories.tsx +3 -3
  80. package/src/elements/Combobox/Combobox.stories.tsx +1 -1
  81. package/src/elements/FileField/FileField.stories.tsx +1 -1
  82. package/src/elements/Progress/Progress.stories.tsx +6 -1
  83. package/src/elements/RadioGroup/RadioGroup.stories.tsx +2 -2
  84. package/src/elements/Tabs/Tabs.stories.tsx +45 -1
@@ -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"],"names":["cn","inputs","twMerge","clsx","FOCUS_STYLES","HIGH_CONTRAST_FOCUS","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","tableCaptionVariants","columnVariants","rowVariants","cellVariants","TableContext","createContext","Table","stickyHeader","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","TableCaption","Column","isRowHeader","allowsSorting","align","width","minWidth","maxWidth","canSort","sortDirection","ChevronUp","ChevronDown","RowInner","href","rowVariant","selectedClasses","unselectedClasses","selectionCellClasses","AriaRow","disabled","AriaCell","Row","Cell","memo","_colSpan"],"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 = \"data-[hovered]:shadow-md\";\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 \"group 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 \"flex-shrink-0 rounded-sm border-2 flex items-center justify-center transition-colors duration-200\",\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)]\",\n \"data-[selected]:bg-[var(--destructive)]\",\n \"data-[indeterminate]:border-[var(--destructive)]\",\n \"data-[indeterminate]:bg-[var(--destructive)]\",\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)]\",\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)\nexport const tableContainerVariants = cva(['relative w-full overflow-auto']);\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 bordered: 'border border-[var(--border)] rounded-md',\n striped: '',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n }\n);\n\n// Table header variants\nexport const tableHeaderVariants = cva(['[&_tr]:border-b'], {\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// Table caption variants\nexport const tableCaptionVariants = cva([\n 'mt-4 text-sm text-[var(--menu-muted)]',\n]);\n\n// Column variants\nexport const columnVariants = cva(\n [\n 'h-12 px-4 text-left align-middle font-medium',\n 'text-[var(--menu-muted)]',\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(--accent)] data-[selected]:bg-[var(--accent)]',\n false: '',\n },\n variant: {\n default: '',\n striped: 'even:bg-[var(--accent-background)]/30',\n },\n },\n defaultVariants: {\n isSelected: false,\n variant: 'default',\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 } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport {\n tableContainerVariants,\n tableVariants,\n tableHeaderVariants,\n tableFooterVariants,\n tableCaptionVariants,\n columnVariants,\n rowVariants,\n cellVariants,\n} from './Table.styles';\nimport type {\n TableProps,\n TableHeaderProps,\n TableBodyProps,\n TableFooterProps,\n TableCaptionProps,\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}\n\nconst TableContext = createContext<TableContextValue>({\n variant: 'default',\n size: 'default',\n selectionMode: 'none',\n stickyHeader: false,\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 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 }),\n [variant, size, selectionMode, stickyHeader]\n );\n\n return (\n <TableContext.Provider value={contextValue}>\n <div\n className={cn(tableContainerVariants(), className)}\n data-testid=\"table-container\"\n >\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 {...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\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 <tr>\n <td colSpan={99} className=\"text-center p-8\">\n {renderEmptyState()}\n </td>\n </tr>\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// TableCaption Component (Custom - not from React Aria)\n// ============================================================================\n\nconst TableCaption = forwardRef<HTMLTableCaptionElement, TableCaptionProps>(\n ({ className, children, ...props }, ref) => {\n return (\n <caption\n ref={ref}\n className={cn(tableCaptionVariants(), className)}\n data-testid=\"table-caption\"\n {...props}\n >\n {children}\n </caption>\n );\n }\n);\n\nTableCaption.displayName = 'TableCaption';\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 && sortDirection && (\n <span aria-hidden=\"true\" data-sort-direction={sortDirection}>\n {sortDirection === 'ascending' ? (\n <ChevronUp className=\"h-4 w-4\" />\n ) : (\n <ChevronDown 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 { variant, size, selectionMode } = useContext(TableContext);\n const { allowsDragging } = useTableOptions();\n\n // Pre-compute variant class strings to avoid CVA calls in render callback\n const rowVariant = variant === 'striped' ? 'striped' as const : 'default' as const;\n const selectedClasses = rowVariants({ isSelected: true, variant: rowVariant });\n const unselectedClasses = rowVariants({ isSelected: false, variant: rowVariant });\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\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 TableCaption,\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 tableCaptionVariants,\n columnVariants,\n rowVariants,\n cellVariants,\n};\n\n// Re-export types\nexport type { Selection, SortDescriptor };\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"],"names":["cn","inputs","twMerge","clsx","FOCUS_STYLES","HIGH_CONTRAST_FOCUS","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","tableCaptionVariants","columnVariants","rowVariants","cellVariants","TableContext","createContext","Table","stickyHeader","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","TableCaption","Column","isRowHeader","allowsSorting","align","width","minWidth","maxWidth","canSort","sortDirection","ChevronUp","ChevronDown","RowInner","href","rowVariant","selectedClasses","unselectedClasses","selectionCellClasses","AriaRow","disabled","AriaCell","Row","Cell","memo","_colSpan"],"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 = \"data-[hovered]:shadow-md\";\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 \"group 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 \"flex-shrink-0 rounded-sm border-2 flex items-center justify-center transition-colors duration-200\",\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)\nexport const tableContainerVariants = cva(['relative w-full overflow-auto']);\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 bordered: 'border border-[var(--border)] rounded-md',\n striped: '',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n }\n);\n\n// Table header variants\nexport const tableHeaderVariants = cva(['[&_tr]:border-b'], {\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// Table caption variants\nexport const tableCaptionVariants = cva([\n 'mt-4 text-sm text-[var(--menu-muted)]',\n]);\n\n// Column variants\nexport const columnVariants = cva(\n [\n 'h-12 px-4 text-left align-middle font-medium',\n 'text-[var(--menu-muted)]',\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(--accent)] data-[selected]:bg-[var(--accent)]',\n false: '',\n },\n variant: {\n default: '',\n striped: 'even:bg-[var(--accent-background)]/30',\n },\n },\n defaultVariants: {\n isSelected: false,\n variant: 'default',\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 } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport {\n tableContainerVariants,\n tableVariants,\n tableHeaderVariants,\n tableFooterVariants,\n tableCaptionVariants,\n columnVariants,\n rowVariants,\n cellVariants,\n} from './Table.styles';\nimport type {\n TableProps,\n TableHeaderProps,\n TableBodyProps,\n TableFooterProps,\n TableCaptionProps,\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}\n\nconst TableContext = createContext<TableContextValue>({\n variant: 'default',\n size: 'default',\n selectionMode: 'none',\n stickyHeader: false,\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 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 }),\n [variant, size, selectionMode, stickyHeader]\n );\n\n return (\n <TableContext.Provider value={contextValue}>\n <div\n className={cn(tableContainerVariants(), className)}\n data-testid=\"table-container\"\n >\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 {...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\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 <tr>\n <td colSpan={99} className=\"text-center p-8\">\n {renderEmptyState()}\n </td>\n </tr>\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// TableCaption Component (Custom - not from React Aria)\n// ============================================================================\n\nconst TableCaption = forwardRef<HTMLTableCaptionElement, TableCaptionProps>(\n ({ className, children, ...props }, ref) => {\n return (\n <caption\n ref={ref}\n className={cn(tableCaptionVariants(), className)}\n data-testid=\"table-caption\"\n {...props}\n >\n {children}\n </caption>\n );\n }\n);\n\nTableCaption.displayName = 'TableCaption';\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 && sortDirection && (\n <span aria-hidden=\"true\" data-sort-direction={sortDirection}>\n {sortDirection === 'ascending' ? (\n <ChevronUp className=\"h-4 w-4\" />\n ) : (\n <ChevronDown 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 { variant, size, selectionMode } = useContext(TableContext);\n const { allowsDragging } = useTableOptions();\n\n // Pre-compute variant class strings to avoid CVA calls in render callback\n const rowVariant = variant === 'striped' ? 'striped' as const : 'default' as const;\n const selectedClasses = rowVariants({ isSelected: true, variant: rowVariant });\n const unselectedClasses = rowVariants({ isSelected: false, variant: rowVariant });\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\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 TableCaption,\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 tableCaptionVariants,\n columnVariants,\n rowVariants,\n cellVariants,\n};\n\n// Re-export types\nexport type { Selection, SortDescriptor };\n"]}
@@ -1,4 +1,4 @@
1
- import type { TabsProps, TabListProps, TabProps, TabPanelProps } from './Tabs.types';
1
+ import type { TabsProps, TabsVariant, TabListProps, TabProps, TabPanelProps } from './Tabs.types';
2
2
  /**
3
3
  * TabList CVA variants
4
4
  *
@@ -6,6 +6,7 @@ import type { TabsProps, TabListProps, TabProps, TabPanelProps } from './Tabs.ty
6
6
  * @see PRD.md DS-001 (Design System - Layout)
7
7
  */
8
8
  export declare const tabListVariants: (props?: ({
9
+ variant?: "default" | "block" | null | undefined;
9
10
  orientation?: "horizontal" | "vertical" | null | undefined;
10
11
  } & import("class-variance-authority/types").ClassProp) | undefined) => string;
11
12
  /**
@@ -16,6 +17,7 @@ export declare const tabListVariants: (props?: ({
16
17
  * @see PRD.md AR-001 (Accessibility - 44×44px touch targets)
17
18
  */
18
19
  export declare const tabVariants: (props?: ({
20
+ variant?: "default" | "block" | null | undefined;
19
21
  orientation?: "horizontal" | "vertical" | null | undefined;
20
22
  } & import("class-variance-authority/types").ClassProp) | undefined) => string;
21
23
  /**
@@ -51,7 +53,7 @@ export declare const tabPanelVariants: (props?: ({} & import("class-variance-aut
51
53
  * ...
52
54
  * </Tabs>
53
55
  */
54
- declare function TabsRoot({ children, selectedKey, defaultSelectedKey, onSelectionChange, orientation, keyboardActivation, isDisabled, disabledKeys, className, ...props }: TabsProps): import("react/jsx-runtime").JSX.Element;
56
+ declare function TabsRoot({ children, variant, selectedKey, defaultSelectedKey, onSelectionChange, orientation, keyboardActivation, isDisabled, disabledKeys, className, ...props }: TabsProps): import("react/jsx-runtime").JSX.Element;
55
57
  declare namespace TabsRoot {
56
58
  var displayName: string;
57
59
  }
@@ -125,5 +127,5 @@ export declare const Tabs: typeof TabsRoot;
125
127
  export declare const TabList: typeof TabListComponent;
126
128
  export declare const Tab: typeof TabComponent;
127
129
  export declare const TabPanel: typeof TabPanelComponent;
128
- export type { TabsProps, TabListProps, TabProps, TabPanelProps };
130
+ export type { TabsProps, TabsVariant, TabListProps, TabProps, TabPanelProps };
129
131
  //# sourceMappingURL=Tabs.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Tabs.d.ts","sourceRoot":"","sources":["../../../src/elements/Tabs/Tabs.tsx"],"names":[],"mappings":"AAqDA,OAAO,KAAK,EACV,SAAS,EACT,YAAY,EACZ,QAAQ,EACR,aAAa,EACd,MAAM,cAAc,CAAC;AAMtB;;;;;GAKG;AACH,eAAO,MAAM,eAAe;;8EAiB3B,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,WAAW;;8EA0BvB,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,2FAU5B,CAAC;AAMF;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,iBAAS,QAAQ,CAAC,EAChB,QAAQ,EACR,WAAW,EACX,kBAAkB,EAClB,iBAAiB,EACjB,WAA0B,EAC1B,kBAAgC,EAChC,UAAkB,EAClB,YAAY,EACZ,SAAS,EACT,GAAG,KAAK,EACT,EAAE,SAAS,2CAgBX;kBA3BQ,QAAQ;;;AA+BjB;;;;;;;;GAQG;AACH,iBAAS,gBAAgB,CAAC,EACxB,QAAQ,EACR,SAAS,EACT,GAAG,KAAK,EACT,EAAE,YAAY,2CAcd;kBAlBQ,gBAAgB;;;AAsBzB;;;;;;;;;;GAUG;AACH,iBAAS,YAAY,CAAC,EACpB,QAAQ,EACR,EAAE,EACF,UAAkB,EAClB,IAAI,EACJ,MAAM,EACN,GAAG,EACH,QAAQ,EACR,SAAS,EACT,GAAG,KAAK,EACT,EAAE,QAAQ,2CA+BV;kBAzCQ,YAAY;;;AA6CrB;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,iBAAS,iBAAiB,CAAC,EACzB,QAAQ,EACR,EAAE,EACF,gBAAwB,EACxB,aAAqB,EACrB,SAAS,EACT,GAAG,KAAK,EACT,EAAE,aAAa,2CA2Ef;kBAlFQ,iBAAiB;;;AA0F1B;;;;;;;;;GASG;AACH,eAAO,MAAM,IAAI,iBAAW,CAAC;AAC7B,eAAO,MAAM,OAAO,yBAAmB,CAAC;AACxC,eAAO,MAAM,GAAG,qBAAe,CAAC;AAChC,eAAO,MAAM,QAAQ,0BAAoB,CAAC;AAG1C,YAAY,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,CAAC"}
1
+ {"version":3,"file":"Tabs.d.ts","sourceRoot":"","sources":["../../../src/elements/Tabs/Tabs.tsx"],"names":[],"mappings":"AAuDA,OAAO,KAAK,EACV,SAAS,EACT,WAAW,EAEX,YAAY,EACZ,QAAQ,EACR,aAAa,EACd,MAAM,cAAc,CAAC;AAoBtB;;;;;GAKG;AACH,eAAO,MAAM,eAAe;;;8EA0B3B,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,WAAW;;;8EAiDvB,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,2FAU5B,CAAC;AAMF;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,iBAAS,QAAQ,CAAC,EAChB,QAAQ,EACR,OAAmB,EACnB,WAAW,EACX,kBAAkB,EAClB,iBAAiB,EACjB,WAA0B,EAC1B,kBAAgC,EAChC,UAAkB,EAClB,YAAY,EACZ,SAAS,EACT,GAAG,KAAK,EACT,EAAE,SAAS,2CAkBX;kBA9BQ,QAAQ;;;AAkCjB;;;;;;;;GAQG;AACH,iBAAS,gBAAgB,CAAC,EACxB,QAAQ,EACR,SAAS,EACT,GAAG,KAAK,EACT,EAAE,YAAY,2CAed;kBAnBQ,gBAAgB;;;AAuBzB;;;;;;;;;;GAUG;AACH,iBAAS,YAAY,CAAC,EACpB,QAAQ,EACR,EAAE,EACF,UAAkB,EAClB,IAAI,EACJ,MAAM,EACN,GAAG,EACH,QAAQ,EACR,SAAS,EACT,GAAG,KAAK,EACT,EAAE,QAAQ,2CAgCV;kBA1CQ,YAAY;;;AA8CrB;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,iBAAS,iBAAiB,CAAC,EACzB,QAAQ,EACR,EAAE,EACF,gBAAwB,EACxB,aAAqB,EACrB,SAAS,EACT,GAAG,KAAK,EACT,EAAE,aAAa,2CA2Ef;kBAlFQ,iBAAiB;;;AA0F1B;;;;;;;;;GASG;AACH,eAAO,MAAM,IAAI,iBAAW,CAAC;AAC7B,eAAO,MAAM,OAAO,yBAAmB,CAAC;AACxC,eAAO,MAAM,GAAG,qBAAe,CAAC;AAChC,eAAO,MAAM,QAAQ,0BAAoB,CAAC;AAG1C,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,CAAC"}
@@ -1,5 +1,16 @@
1
1
  import { z } from 'zod';
2
2
  import type { ReactNode, Key } from 'react';
3
+ /**
4
+ * Tab variant schema
5
+ *
6
+ * - 'default': Transparent background with bottom border indicator for active tab
7
+ * - 'block': Pill/card style with accent background and shadow for active tab
8
+ */
9
+ export declare const TabsVariantSchema: z.ZodEnum<{
10
+ default: "default";
11
+ block: "block";
12
+ }>;
13
+ export type TabsVariant = z.infer<typeof TabsVariantSchema>;
3
14
  /**
4
15
  * Tab orientation schema
5
16
  *
@@ -45,6 +56,10 @@ export declare const TabsPropsSchema: z.ZodObject<{
45
56
  }>>;
46
57
  'aria-hidden': z.ZodOptional<z.ZodBoolean>;
47
58
  'data-testid': z.ZodOptional<z.ZodString>;
59
+ variant: z.ZodDefault<z.ZodOptional<z.ZodEnum<{
60
+ default: "default";
61
+ block: "block";
62
+ }>>>;
48
63
  selectedKey: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>;
49
64
  defaultSelectedKey: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>;
50
65
  onSelectionChange: z.ZodOptional<z.ZodCustom<(key: Key) => void, (key: Key) => void>>;
@@ -1 +1 @@
1
- {"version":3,"file":"Tabs.types.d.ts","sourceRoot":"","sources":["../../../src/elements/Tabs/Tabs.types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAE5C;;;;GAIG;AACH,eAAO,MAAM,qBAAqB;;;EAAqC,CAAC;AACxE,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEpE;;;;GAIG;AACH,eAAO,MAAM,4BAA4B;;;EAAkC,CAAC;AAC5E,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,4BAA4B,CAAC,CAAC;AAElF;;;GAGG;AACH,eAAO,MAAM,SAAS,iDAAoC,CAAC;AAE3D;;;;;;GAMG;AACH,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;uDAQQ,GAAG,KAAK,IAAI,QAAZ,GAAG,KAAK,IAAI;;;;;;;;;;;;iBAgB9C,CAAC;AAEH,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAExD;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;iBAS7B,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE9D;;;;;;GAMG;AACH,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;iBAqBzB,CAAC;AAEH,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAEtD;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;iBAe9B,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEhE;;;;GAIG;AACH,eAAO,MAAM,0BAA0B;;;;;EAA0C,CAAC;AAClF,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAE9E;;;GAGG;AACH,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;+BAQT,IAAI,QAAJ,IAAI;;iBAI5B,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC"}
1
+ {"version":3,"file":"Tabs.types.d.ts","sourceRoot":"","sources":["../../../src/elements/Tabs/Tabs.types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAE5C;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB;;;EAA+B,CAAC;AAC9D,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAE5D;;;;GAIG;AACH,eAAO,MAAM,qBAAqB;;;EAAqC,CAAC;AACxE,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEpE;;;;GAIG;AACH,eAAO,MAAM,4BAA4B;;;EAAkC,CAAC;AAC5E,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,4BAA4B,CAAC,CAAC;AAElF;;;GAGG;AACH,eAAO,MAAM,SAAS,iDAAoC,CAAC;AAE3D;;;;;;GAMG;AACH,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;uDAWQ,GAAG,KAAK,IAAI,QAAZ,GAAG,KAAK,IAAI;;;;;;;;;;;;iBAgB9C,CAAC;AAEH,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAExD;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;iBAS7B,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE9D;;;;;;GAMG;AACH,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;iBAqBzB,CAAC;AAEH,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAEtD;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;iBAe9B,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEhE;;;;GAIG;AACH,eAAO,MAAM,0BAA0B;;;;;EAA0C,CAAC;AAClF,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAE9E;;;GAGG;AACH,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;+BAQT,IAAI,QAAJ,IAAI;;iBAI5B,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC"}
@@ -1,3 +1,3 @@
1
1
  "use client";
2
- 'use strict';var react=require('react'),reactAriaComponents=require('react-aria-components'),classVarianceAuthority=require('class-variance-authority'),clsx=require('clsx'),tailwindMerge=require('tailwind-merge'),jsxRuntime=require('react/jsx-runtime'),zod=require('zod');function m(...a){return tailwindMerge.twMerge(clsx.clsx(a))}var v=react.Activity??function({children:t,mode:i}){return jsxRuntime.jsx("div",{"data-activity-mode":i,children:t})},x=classVarianceAuthority.cva(["inline-flex items-center justify-center rounded-md p-1","bg-[var(--accent-background)] text-[var(--menu-muted)]"],{variants:{orientation:{horizontal:"h-10 flex-row gap-0",vertical:"h-auto flex-col w-full gap-1"}},defaultVariants:{orientation:"horizontal"}}),S=classVarianceAuthority.cva(["inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-sm","px-3 py-1.5 text-sm font-medium","ring-offset-[var(--content-background)] transition-all","focus-visible:outline-none focus-visible:ring-2","focus-visible:ring-[var(--ring)] focus-visible:ring-offset-2","data-[disabled]:pointer-events-none data-[disabled]:opacity-50","data-[selected]:bg-[var(--content-background)] data-[selected]:text-[var(--content-foreground)]","data-[selected]:shadow-sm","min-h-[44px]"],{variants:{orientation:{horizontal:"",vertical:"w-full justify-start"}},defaultVariants:{orientation:"horizontal"}}),T=classVarianceAuthority.cva(["mt-2 ring-offset-[var(--content-background)]","focus-visible:outline-none focus-visible:ring-2","focus-visible:ring-[var(--ring)] focus-visible:ring-offset-2"],{variants:{},defaultVariants:{}});function g({children:a,selectedKey:t,defaultSelectedKey:i,onSelectionChange:n,orientation:s="horizontal",keyboardActivation:p="automatic",isDisabled:b=false,disabledKeys:o,className:l,...d}){return jsxRuntime.jsx(reactAriaComponents.Tabs,{selectedKey:t,defaultSelectedKey:i,onSelectionChange:n,orientation:s,keyboardActivation:p,isDisabled:b,disabledKeys:o,className:m(l),...d,children:a})}g.displayName="Tabs";function A({children:a,className:t,...i}){return jsxRuntime.jsx(reactAriaComponents.TabList,{className:reactAriaComponents.composeRenderProps(t,(n,s)=>m(x({orientation:s.orientation}),n)),...i,children:a})}A.displayName="TabList";function w({children:a,id:t,isDisabled:i=false,href:n,target:s,rel:p,download:b,className:o,...l}){return process.env.NODE_ENV!=="production"&&!(typeof a=="string"||Array.isArray(a)&&a.some(C=>typeof C=="string"))&&!l["aria-label"]&&console.warn("Tabs: Icon-only tabs should have an aria-label for accessibility."),jsxRuntime.jsx(reactAriaComponents.Tab,{id:t,isDisabled:i,href:n,target:s,rel:p,download:b,className:reactAriaComponents.composeRenderProps(o,d=>m(S(),d)),...l,children:a})}w.displayName="Tab";function K({children:a,id:t,shouldForceMount:i=false,preserveState:n=false,className:s,...p}){let b=n||i;return typeof a=="function"?jsxRuntime.jsx(reactAriaComponents.TabPanel,{id:t,shouldForceMount:b,className:reactAriaComponents.composeRenderProps(s,o=>m(T(),o)),...p,children:o=>{let l=!o.isInert,d=a({isSelected:l});return n?jsxRuntime.jsx(v,{mode:l?"visible":"hidden",children:d}):d}}):n?jsxRuntime.jsx(reactAriaComponents.TabPanel,{id:t,shouldForceMount:b,className:reactAriaComponents.composeRenderProps(s,o=>m(T(),o)),...p,children:o=>{let l=!o.isInert;return jsxRuntime.jsx(v,{mode:l?"visible":"hidden",children:a})}}):jsxRuntime.jsx(reactAriaComponents.TabPanel,{id:t,shouldForceMount:b,className:reactAriaComponents.composeRenderProps(s,o=>m(T(),o)),...p,children:a})}K.displayName="TabPanel";var F=g,B=A,E=w,I=K;var f=zod.z.object({className:zod.z.string().optional(),children:zod.z.any().optional(),id:zod.z.string().optional(),"aria-label":zod.z.string().optional(),"aria-labelledby":zod.z.string().optional(),"aria-describedby":zod.z.string().optional(),"aria-live":zod.z.enum(["off","polite","assertive"]).optional(),"aria-hidden":zod.z.boolean().optional(),"data-testid":zod.z.string().optional()});var N=zod.z.enum(["horizontal","vertical"]),z=zod.z.enum(["automatic","manual"]),u=zod.z.union([zod.z.string(),zod.z.number()]),j=f.extend({selectedKey:u.optional(),defaultSelectedKey:u.optional(),onSelectionChange:zod.z.custom().optional(),orientation:N.optional().default("horizontal"),keyboardActivation:z.optional().default("automatic"),isDisabled:zod.z.boolean().optional().default(false),disabledKeys:zod.z.array(u).optional(),children:zod.z.custom()}),_=f.extend({"aria-label":zod.z.string().optional(),"aria-labelledby":zod.z.string().optional(),children:zod.z.custom()}),q=f.extend({id:u,isDisabled:zod.z.boolean().optional().default(false),href:zod.z.string().optional(),target:zod.z.string().optional(),rel:zod.z.string().optional(),download:zod.z.union([zod.z.string(),zod.z.boolean()]).optional(),children:zod.z.custom()}),G=f.extend({id:u,shouldForceMount:zod.z.boolean().optional().default(false),preserveState:zod.z.boolean().optional().default(false),children:zod.z.custom()}),L=zod.z.enum(["left","right","up","down"]),H=f.extend({direction:L,isDisabled:zod.z.boolean().optional().default(false),onPress:zod.z.custom(),"aria-label":zod.z.string()});exports.KeySchema=u;exports.ScrollArrowDirectionSchema=L;exports.ScrollArrowPropsSchema=H;exports.Tab=E;exports.TabList=B;exports.TabListPropsSchema=_;exports.TabPanel=I;exports.TabPanelPropsSchema=G;exports.TabPropsSchema=q;exports.Tabs=F;exports.TabsKeyboardActivationSchema=z;exports.TabsOrientationSchema=N;exports.TabsPropsSchema=j;exports.tabListVariants=x;exports.tabPanelVariants=T;exports.tabVariants=S;//# sourceMappingURL=index.js.map
2
+ 'use strict';var react=require('react'),reactAriaComponents=require('react-aria-components'),classVarianceAuthority=require('class-variance-authority'),clsx=require('clsx'),tailwindMerge=require('tailwind-merge'),jsxRuntime=require('react/jsx-runtime'),zod=require('zod');function d(...e){return tailwindMerge.twMerge(clsx.clsx(e))}var S=react.Activity??function({children:o,mode:s}){return jsxRuntime.jsx("div",{"data-activity-mode":s,children:o})},x=react.createContext({variant:"default",orientation:"horizontal"}),z=classVarianceAuthority.cva(["inline-flex items-center text-[var(--menu-muted)]"],{variants:{variant:{default:"border-b border-[var(--border)] bg-transparent rounded-none p-0 gap-0",block:"justify-center rounded-md p-1 bg-[var(--accent-background)]"},orientation:{horizontal:"flex-row",vertical:"h-auto flex-col w-full"}},compoundVariants:[{variant:"block",orientation:"horizontal",class:"h-10 gap-0"},{variant:"block",orientation:"vertical",class:"gap-1"},{variant:"default",orientation:"vertical",class:"border-b-0 border-l"}],defaultVariants:{variant:"default",orientation:"horizontal"}}),V=classVarianceAuthority.cva(["inline-flex items-center justify-center gap-2 whitespace-nowrap","px-3 py-1.5 text-sm font-medium","ring-offset-[var(--content-background)] transition-all","focus-visible:outline-none focus-visible:ring-2","focus-visible:ring-[var(--ring)] focus-visible:ring-offset-2","data-[disabled]:pointer-events-none data-[disabled]:opacity-50","min-h-[44px]"],{variants:{variant:{default:["rounded-none bg-transparent","data-[selected]:text-[var(--content-foreground)]","hover:text-[var(--content-foreground)]"],block:["rounded-sm","data-[selected]:bg-[var(--content-background)] data-[selected]:text-[var(--content-foreground)]","data-[selected]:shadow-sm"]},orientation:{horizontal:"",vertical:"w-full justify-start"}},compoundVariants:[{variant:"default",orientation:"horizontal",class:"border-b-2 border-transparent -mb-px data-[selected]:border-[var(--primary-action)]"},{variant:"default",orientation:"vertical",class:"border-l-2 border-transparent -ml-px data-[selected]:border-[var(--primary-action)]"}],defaultVariants:{variant:"default",orientation:"horizontal"}}),y=classVarianceAuthority.cva(["mt-2 ring-offset-[var(--content-background)]","focus-visible:outline-none focus-visible:ring-2","focus-visible:ring-[var(--ring)] focus-visible:ring-offset-2"],{variants:{},defaultVariants:{}});function w({children:e,variant:o="default",selectedKey:s,defaultSelectedKey:l,onSelectionChange:c,orientation:r="horizontal",keyboardActivation:b="automatic",isDisabled:t=false,disabledKeys:p,className:f,...v}){return jsxRuntime.jsx(x.Provider,{value:{variant:o,orientation:r},children:jsxRuntime.jsx(reactAriaComponents.Tabs,{selectedKey:s,defaultSelectedKey:l,onSelectionChange:c,orientation:r,keyboardActivation:b,isDisabled:t,disabledKeys:p,className:d(f),...v,children:e})})}w.displayName="Tabs";function K({children:e,className:o,...s}){let{variant:l}=react.useContext(x);return jsxRuntime.jsx(reactAriaComponents.TabList,{className:reactAriaComponents.composeRenderProps(o,(c,r)=>d(z({variant:l,orientation:r.orientation}),c)),...s,children:e})}K.displayName="TabList";function C({children:e,id:o,isDisabled:s=false,href:l,target:c,rel:r,download:b,className:t,...p}){process.env.NODE_ENV!=="production"&&!(typeof e=="string"||Array.isArray(e)&&e.some(D=>typeof D=="string"))&&!p["aria-label"]&&console.warn("Tabs: Icon-only tabs should have an aria-label for accessibility.");let{variant:f,orientation:v}=react.useContext(x);return jsxRuntime.jsx(reactAriaComponents.Tab,{id:o,isDisabled:s,href:l,target:c,rel:r,download:b,className:reactAriaComponents.composeRenderProps(t,g=>d(V({variant:f,orientation:v}),g)),...p,children:e})}C.displayName="Tab";function N({children:e,id:o,shouldForceMount:s=false,preserveState:l=false,className:c,...r}){let b=l||s;return typeof e=="function"?jsxRuntime.jsx(reactAriaComponents.TabPanel,{id:o,shouldForceMount:b,className:reactAriaComponents.composeRenderProps(c,t=>d(y(),t)),...r,children:t=>{let p=!t.isInert,f=e({isSelected:p});return l?jsxRuntime.jsx(S,{mode:p?"visible":"hidden",children:f}):f}}):l?jsxRuntime.jsx(reactAriaComponents.TabPanel,{id:o,shouldForceMount:b,className:reactAriaComponents.composeRenderProps(c,t=>d(y(),t)),...r,children:t=>{let p=!t.isInert;return jsxRuntime.jsx(S,{mode:p?"visible":"hidden",children:e})}}):jsxRuntime.jsx(reactAriaComponents.TabPanel,{id:o,shouldForceMount:b,className:reactAriaComponents.composeRenderProps(c,t=>d(y(),t)),...r,children:e})}N.displayName="TabPanel";var _=w,q=K,G=C,H=N;var m=zod.z.object({className:zod.z.string().optional(),children:zod.z.any().optional(),id:zod.z.string().optional(),"aria-label":zod.z.string().optional(),"aria-labelledby":zod.z.string().optional(),"aria-describedby":zod.z.string().optional(),"aria-live":zod.z.enum(["off","polite","assertive"]).optional(),"aria-hidden":zod.z.boolean().optional(),"data-testid":zod.z.string().optional()});var J=zod.z.enum(["default","block"]),L=zod.z.enum(["horizontal","vertical"]),k=zod.z.enum(["automatic","manual"]),u=zod.z.union([zod.z.string(),zod.z.number()]),Q=m.extend({variant:J.optional().default("default"),selectedKey:u.optional(),defaultSelectedKey:u.optional(),onSelectionChange:zod.z.custom().optional(),orientation:L.optional().default("horizontal"),keyboardActivation:k.optional().default("automatic"),isDisabled:zod.z.boolean().optional().default(false),disabledKeys:zod.z.array(u).optional(),children:zod.z.custom()}),U=m.extend({"aria-label":zod.z.string().optional(),"aria-labelledby":zod.z.string().optional(),children:zod.z.custom()}),W=m.extend({id:u,isDisabled:zod.z.boolean().optional().default(false),href:zod.z.string().optional(),target:zod.z.string().optional(),rel:zod.z.string().optional(),download:zod.z.union([zod.z.string(),zod.z.boolean()]).optional(),children:zod.z.custom()}),X=m.extend({id:u,shouldForceMount:zod.z.boolean().optional().default(false),preserveState:zod.z.boolean().optional().default(false),children:zod.z.custom()}),R=zod.z.enum(["left","right","up","down"]),Y=m.extend({direction:R,isDisabled:zod.z.boolean().optional().default(false),onPress:zod.z.custom(),"aria-label":zod.z.string()});exports.KeySchema=u;exports.ScrollArrowDirectionSchema=R;exports.ScrollArrowPropsSchema=Y;exports.Tab=G;exports.TabList=q;exports.TabListPropsSchema=U;exports.TabPanel=H;exports.TabPanelPropsSchema=X;exports.TabPropsSchema=W;exports.Tabs=_;exports.TabsKeyboardActivationSchema=k;exports.TabsOrientationSchema=L;exports.TabsPropsSchema=Q;exports.tabListVariants=z;exports.tabPanelVariants=y;exports.tabVariants=V;//# sourceMappingURL=index.js.map
3
3
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/utils/cn.ts","../../../src/elements/Tabs/Tabs.tsx","../../../src/schemas/BaseComponentProps.ts","../../../src/elements/Tabs/Tabs.types.ts"],"names":["cn","inputs","twMerge","clsx","Activity","ReactActivity","children","mode","jsx","tabListVariants","cva","tabVariants","tabPanelVariants","TabsRoot","selectedKey","defaultSelectedKey","onSelectionChange","orientation","keyboardActivation","isDisabled","disabledKeys","className","props","AriaTabs","TabListComponent","AriaTabList","composeRenderProps","renderProps","TabComponent","id","href","target","rel","download","child","AriaTab","TabPanelComponent","shouldForceMount","preserveState","forceMount","AriaTabPanel","isSelected","content","Tabs","TabList","Tab","TabPanel","BaseComponentPropsSchema","z","TabsOrientationSchema","TabsKeyboardActivationSchema","KeySchema","TabsPropsSchema","TabListPropsSchema","TabPropsSchema","TabPanelPropsSchema","ScrollArrowDirectionSchema","ScrollArrowPropsSchema"],"mappings":"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","file":"index.js","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","'use client';\n\n/**\n * Tabs Component - Implementation\n *\n * Accessible tabbed interface component combining React Aria primitives with ShadCN styling.\n * Follows Themis library patterns with compound component structure and direct named exports.\n *\n * Key Features:\n * - React Aria Tabs for full accessibility (WCAG 2.2 AAA)\n * - CVA variants for orientation styling\n * - React 19.2 Activity API for state preservation (preserveState prop)\n * - Dual keyboard activation modes (automatic/manual)\n * - Support for icons, badges, and link-based tabs\n *\n * @see tabs-prd.md (Full requirements)\n * @see Tabs.types.ts (Zod schemas)\n * @see plan.md (Implementation approach)\n */\n\n// React 19.2 Activity API - may not be available in all builds\n// Import conditionally to support environments where Activity is unavailable\nimport {\n Activity as ReactActivity,\n type ReactNode,\n type Key,\n type ReactElement,\n} from 'react';\n\n// Activity component with fallback for environments where it's not available\n// The fallback simply renders children directly - no state preservation when Activity unavailable\n// Note: ActivityFallback doesn't actually preserve state; it's just a pass-through\nconst Activity = ReactActivity ?? function ActivityFallback({\n children,\n mode,\n}: {\n children: ReactNode;\n mode: 'visible' | 'hidden';\n}): ReactElement {\n // When Activity is not available, just render children directly\n // mode is ignored in the fallback\n return <div data-activity-mode={mode}>{children}</div>;\n};\nimport {\n Tabs as AriaTabs,\n TabList as AriaTabList,\n Tab as AriaTab,\n TabPanel as AriaTabPanel,\n composeRenderProps,\n type Key as AriaKey,\n} from 'react-aria-components';\nimport { cva } from 'class-variance-authority';\nimport { cn } from '../../utils/cn';\nimport type {\n TabsProps,\n TabListProps,\n TabProps,\n TabPanelProps,\n} from './Tabs.types';\n\n// ============================================================================\n// CVA Variants\n// ============================================================================\n\n/**\n * TabList CVA variants\n *\n * @see PRD.md FR-002 (TabList Requirements)\n * @see PRD.md DS-001 (Design System - Layout)\n */\nexport const tabListVariants = cva(\n // Base styles\n [\n 'inline-flex items-center justify-center rounded-md p-1',\n 'bg-[var(--accent-background)] text-[var(--menu-muted)]',\n ],\n {\n variants: {\n orientation: {\n horizontal: 'h-10 flex-row gap-0',\n vertical: 'h-auto flex-col w-full gap-1',\n },\n },\n defaultVariants: {\n orientation: 'horizontal',\n },\n }\n);\n\n/**\n * Tab CVA variants\n *\n * @see PRD.md FR-003 (Tab Requirements)\n * @see PRD.md DS-002 (Design System - Tab Styling)\n * @see PRD.md AR-001 (Accessibility - 44×44px touch targets)\n */\nexport const tabVariants = cva(\n // Base styles\n [\n 'inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-sm',\n 'px-3 py-1.5 text-sm font-medium',\n 'ring-offset-[var(--content-background)] transition-all',\n 'focus-visible:outline-none focus-visible:ring-2',\n 'focus-visible:ring-[var(--ring)] focus-visible:ring-offset-2',\n // States via data attributes\n 'data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n 'data-[selected]:bg-[var(--content-background)] data-[selected]:text-[var(--content-foreground)]',\n 'data-[selected]:shadow-sm',\n // WCAG 2.2 AAA: 44×44px minimum touch target\n 'min-h-[44px]',\n ],\n {\n variants: {\n orientation: {\n horizontal: '',\n vertical: 'w-full justify-start',\n },\n },\n defaultVariants: {\n orientation: 'horizontal',\n },\n }\n);\n\n/**\n * TabPanel CVA variants\n *\n * @see PRD.md FR-004 (TabPanel Requirements)\n */\nexport const tabPanelVariants = cva(\n [\n 'mt-2 ring-offset-[var(--content-background)]',\n 'focus-visible:outline-none focus-visible:ring-2',\n 'focus-visible:ring-[var(--ring)] focus-visible:ring-offset-2',\n ],\n {\n variants: {},\n defaultVariants: {},\n }\n);\n\n// ============================================================================\n// Components\n// ============================================================================\n\n/**\n * Tabs Root Component\n *\n * Container for tabbed interface. Manages selection state and provides\n * context to child components.\n *\n * @see PRD.md FR-001 (Compound Component Pattern)\n * @see PRD.md FR-012 (Controlled Mode)\n * @see PRD.md FR-013 (Uncontrolled Mode)\n *\n * @example\n * // Uncontrolled\n * <Tabs defaultSelectedKey=\"tab1\">\n * <TabList aria-label=\"Navigation\">\n * <Tab id=\"tab1\">Tab 1</Tab>\n * <Tab id=\"tab2\">Tab 2</Tab>\n * </TabList>\n * <TabPanel id=\"tab1\">Content 1</TabPanel>\n * <TabPanel id=\"tab2\">Content 2</TabPanel>\n * </Tabs>\n *\n * @example\n * // Controlled\n * <Tabs selectedKey={selected} onSelectionChange={setSelected}>\n * ...\n * </Tabs>\n */\nfunction TabsRoot({\n children,\n selectedKey,\n defaultSelectedKey,\n onSelectionChange,\n orientation = 'horizontal',\n keyboardActivation = 'automatic',\n isDisabled = false,\n disabledKeys,\n className,\n ...props\n}: TabsProps) {\n return (\n <AriaTabs\n selectedKey={selectedKey}\n defaultSelectedKey={defaultSelectedKey}\n onSelectionChange={onSelectionChange as (key: Key) => void}\n orientation={orientation}\n keyboardActivation={keyboardActivation}\n isDisabled={isDisabled}\n disabledKeys={disabledKeys as Iterable<AriaKey> | undefined}\n className={cn(className)}\n {...props}\n >\n {children}\n </AriaTabs>\n );\n}\n\nTabsRoot.displayName = 'Tabs';\n\n/**\n * TabList Component\n *\n * Container for tab buttons. Uses roving tabindex for keyboard navigation.\n * Receives orientation from parent Tabs via React Aria context.\n *\n * @see PRD.md FR-002 (TabList Requirements)\n * @see PRD.md AR-001 (ARIA Requirements)\n */\nfunction TabListComponent({\n children,\n className,\n ...props\n}: TabListProps) {\n return (\n <AriaTabList\n className={composeRenderProps(className, (className, renderProps) =>\n cn(\n tabListVariants({ orientation: renderProps.orientation }),\n className\n )\n )}\n {...props}\n >\n {children}\n </AriaTabList>\n );\n}\n\nTabListComponent.displayName = 'TabList';\n\n/**\n * Tab Component\n *\n * Individual tab button. Can render as button or anchor (when href provided).\n * Supports icons and badges as children.\n *\n * @see PRD.md FR-003 (Tab Requirements)\n * @see PRD.md FR-007 (Disabled States)\n * @see PRD.md FR-013 (Icon Support)\n * @see PRD.md FR-014 (Link-based Tabs)\n */\nfunction TabComponent({\n children,\n id,\n isDisabled = false,\n href,\n target,\n rel,\n download,\n className,\n ...props\n}: TabProps) {\n // Warn if icon-only tab without aria-label\n if (process.env.NODE_ENV !== 'production') {\n const hasTextContent =\n typeof children === 'string' ||\n (Array.isArray(children) &&\n children.some((child) => typeof child === 'string'));\n\n if (!hasTextContent && !props['aria-label']) {\n console.warn(\n 'Tabs: Icon-only tabs should have an aria-label for accessibility.'\n );\n }\n }\n\n return (\n <AriaTab\n id={id}\n isDisabled={isDisabled}\n href={href}\n target={target}\n rel={rel}\n download={download}\n className={composeRenderProps(className, (className) =>\n cn(tabVariants(), className)\n )}\n {...props}\n >\n {children}\n </AriaTab>\n );\n}\n\nTabComponent.displayName = 'Tab';\n\n/**\n * TabPanel Component\n *\n * Content panel associated with a tab. Only the selected panel is visible.\n * Supports preserveState for React Activity state preservation.\n *\n * @see PRD.md FR-004 (TabPanel Requirements)\n * @see PRD.md FR-015 (Force Mount Panels)\n * @see PRD.md FR-016 (React Activity State Preservation)\n *\n * @example\n * // Default behavior - content unmounts when hidden\n * <TabPanel id=\"tab1\">Content</TabPanel>\n *\n * @example\n * // Legacy force mount - keeps content in DOM\n * <TabPanel id=\"tab1\" shouldForceMount>Form with state</TabPanel>\n *\n * @example\n * // React Activity - preserves state with proper effect cleanup\n * <TabPanel id=\"tab1\" preserveState>\n * <FormWithDraft />\n * </TabPanel>\n */\nfunction TabPanelComponent({\n children,\n id,\n shouldForceMount = false,\n preserveState = false,\n className,\n ...props\n}: TabPanelProps) {\n // preserveState takes precedence - both enable force mounting\n const forceMount = preserveState || shouldForceMount;\n\n // If children is a render function (for dynamic content based on selection state),\n // we need to use the render props pattern\n if (typeof children === 'function') {\n return (\n <AriaTabPanel\n id={id}\n shouldForceMount={forceMount}\n className={composeRenderProps(className, (className) =>\n cn(tabPanelVariants(), className)\n )}\n {...props}\n >\n {(renderProps) => {\n // React Aria TabPanelRenderProps includes: state, isInert\n // We derive isSelected from state - if state is undefined, panel is selected\n const isSelected = !renderProps.isInert;\n const content = (\n children as (renderProps: { isSelected: boolean }) => ReactNode\n )({ isSelected });\n\n if (preserveState) {\n return (\n <Activity mode={isSelected ? 'visible' : 'hidden'}>\n {content}\n </Activity>\n );\n }\n\n return content;\n }}\n </AriaTabPanel>\n );\n }\n\n // For static children (not a function), render directly\n // If preserveState is enabled, wrap in Activity\n if (preserveState) {\n return (\n <AriaTabPanel\n id={id}\n shouldForceMount={forceMount}\n className={composeRenderProps(className, (className) =>\n cn(tabPanelVariants(), className)\n )}\n {...props}\n >\n {(renderProps) => {\n const isSelected = !renderProps.isInert;\n return (\n <Activity mode={isSelected ? 'visible' : 'hidden'}>\n {children}\n </Activity>\n );\n }}\n </AriaTabPanel>\n );\n }\n\n // Default: render static children directly\n return (\n <AriaTabPanel\n id={id}\n shouldForceMount={forceMount}\n className={composeRenderProps(className, (className) =>\n cn(tabPanelVariants(), className)\n )}\n {...props}\n >\n {children}\n </AriaTabPanel>\n );\n}\n\nTabPanelComponent.displayName = 'TabPanel';\n\n// ============================================================================\n// Exports\n// ============================================================================\n\n/**\n * Direct named exports (not Object.assign compound pattern)\n *\n * Tabs follows React Aria's direct export pattern because:\n * - Simpler structure (only 4 components vs Dialog's 9)\n * - Better tree-shaking with named exports\n * - Clearer imports: import { Tabs, TabList, Tab, TabPanel } from '...'\n *\n * @see plan.md \"Why Direct Named Exports (Not Object.assign)?\"\n */\nexport const Tabs = TabsRoot;\nexport const TabList = TabListComponent;\nexport const Tab = TabComponent;\nexport const TabPanel = TabPanelComponent;\n\n// Re-export types for convenience\nexport type { TabsProps, TabListProps, TabProps, TabPanelProps };\n","import { z } from 'zod';\n\n/**\n * Base props schema for all Themis components\n * Ensures consistent accessibility and styling APIs across the library\n *\n * @see spec.md FR-009 to FR-014 (Accessibility Requirements)\n * @see constitution.md Principle IV (Accessibility First - WCAG 2.2 AA minimum)\n */\nexport const BaseComponentPropsSchema = z.object({\n // Styling\n className: z.string().optional(),\n\n // React\n children: z.any().optional(), // ReactNode not directly supported by Zod\n id: z.string().optional(),\n\n // Accessibility (WCAG 2.2 AA requirements)\n 'aria-label': z.string().optional(),\n 'aria-labelledby': z.string().optional(),\n 'aria-describedby': z.string().optional(),\n 'aria-live': z.enum(['off', 'polite', 'assertive']).optional(),\n 'aria-hidden': z.boolean().optional(),\n\n // Testing & Development\n 'data-testid': z.string().optional(),\n});\n\nexport type BaseComponentProps = z.infer<typeof BaseComponentPropsSchema>;\n","import { z } from 'zod';\nimport { BaseComponentPropsSchema } from '../../schemas/BaseComponentProps';\nimport type { ReactNode, Key } from 'react';\n\n/**\n * Tab orientation schema\n *\n * @see PRD.md FR-005 (Orientation Support)\n */\nexport const TabsOrientationSchema = z.enum(['horizontal', 'vertical']);\nexport type TabsOrientation = z.infer<typeof TabsOrientationSchema>;\n\n/**\n * Keyboard activation mode schema\n *\n * @see PRD.md FR-006 (Keyboard Activation Modes)\n */\nexport const TabsKeyboardActivationSchema = z.enum(['automatic', 'manual']);\nexport type TabsKeyboardActivation = z.infer<typeof TabsKeyboardActivationSchema>;\n\n/**\n * Key schema for tab identification\n * Supports both string and number keys per React Aria convention\n */\nexport const KeySchema = z.union([z.string(), z.number()]);\n\n/**\n * Tabs root component props schema\n *\n * @see PRD.md FR-001 (Compound Component Pattern)\n * @see PRD.md FR-012 (Controlled Mode)\n * @see PRD.md FR-013 (Uncontrolled Mode)\n */\nexport const TabsPropsSchema = BaseComponentPropsSchema.extend({\n // Controlled mode: selected tab key\n selectedKey: KeySchema.optional(),\n\n // Uncontrolled mode: default selected tab key\n defaultSelectedKey: KeySchema.optional(),\n\n // Selection change handler\n onSelectionChange: z.custom<(key: Key) => void>().optional(),\n\n // Orientation: horizontal or vertical layout\n orientation: TabsOrientationSchema.optional().default('horizontal'),\n\n // Keyboard activation: automatic (arrows select) or manual (arrows focus, Enter selects)\n keyboardActivation: TabsKeyboardActivationSchema.optional().default('automatic'),\n\n // Disable all tabs\n isDisabled: z.boolean().optional().default(false),\n\n // Keys of tabs to disable individually\n disabledKeys: z.array(KeySchema).optional(),\n\n // Children: TabList and TabPanel components\n children: z.custom<ReactNode>(),\n});\n\nexport type TabsProps = z.infer<typeof TabsPropsSchema>;\n\n/**\n * TabList component props schema\n *\n * @see PRD.md FR-002 (TabList Requirements)\n * @see PRD.md AR-001 (ARIA Requirements)\n */\nexport const TabListPropsSchema = BaseComponentPropsSchema.extend({\n // Accessible label (required for accessibility if no aria-labelledby)\n 'aria-label': z.string().optional(),\n\n // Reference to labelling element\n 'aria-labelledby': z.string().optional(),\n\n // Children: Tab components\n children: z.custom<ReactNode>(),\n});\n\nexport type TabListProps = z.infer<typeof TabListPropsSchema>;\n\n/**\n * Tab component props schema\n *\n * @see PRD.md FR-003 (Tab Requirements)\n * @see PRD.md FR-007 (Disabled States)\n * @see PRD.md FR-014 (Link-based Tabs)\n */\nexport const TabPropsSchema = BaseComponentPropsSchema.extend({\n // Unique identifier for the tab (required)\n id: KeySchema,\n\n // Disable this specific tab\n isDisabled: z.boolean().optional().default(false),\n\n // Link tab: URL for navigation-style tabs\n href: z.string().optional(),\n\n // Link tab: target attribute\n target: z.string().optional(),\n\n // Link tab: rel attribute\n rel: z.string().optional(),\n\n // Link tab: download attribute\n download: z.union([z.string(), z.boolean()]).optional(),\n\n // Tab content (text, icons, badges)\n children: z.custom<ReactNode>(),\n});\n\nexport type TabProps = z.infer<typeof TabPropsSchema>;\n\n/**\n * TabPanel component props schema\n *\n * @see PRD.md FR-004 (TabPanel Requirements)\n * @see PRD.md FR-015 (Force Mount Panels)\n * @see PRD.md FR-016 (React Activity State Preservation)\n */\nexport const TabPanelPropsSchema = BaseComponentPropsSchema.extend({\n // Unique identifier matching a Tab id (required)\n id: KeySchema,\n\n // Legacy: Force panel to stay in DOM when hidden\n // Use preserveState instead for proper effect cleanup\n shouldForceMount: z.boolean().optional().default(false),\n\n // React 19.2 Activity: Preserve state with proper effect cleanup\n // When true, wraps content in <Activity> component\n // Effects are cleaned up when hidden, restored when visible\n preserveState: z.boolean().optional().default(false),\n\n // Panel content\n children: z.custom<ReactNode>(),\n});\n\nexport type TabPanelProps = z.infer<typeof TabPanelPropsSchema>;\n\n/**\n * Scroll arrow direction for overflow handling\n *\n * @see PRD.md FR-010 (Overflow Handling)\n */\nexport const ScrollArrowDirectionSchema = z.enum(['left', 'right', 'up', 'down']);\nexport type ScrollArrowDirection = z.infer<typeof ScrollArrowDirectionSchema>;\n\n/**\n * Internal props for scroll arrow buttons\n * Used by overflow handling implementation\n */\nexport const ScrollArrowPropsSchema = BaseComponentPropsSchema.extend({\n // Scroll direction\n direction: ScrollArrowDirectionSchema,\n\n // Disable when can't scroll further\n isDisabled: z.boolean().optional().default(false),\n\n // Click handler for scrolling\n onPress: z.custom<() => void>(),\n\n // Accessible label\n 'aria-label': z.string(),\n});\n\nexport type ScrollArrowProps = z.infer<typeof ScrollArrowPropsSchema>;\n"]}
1
+ {"version":3,"sources":["../../../src/utils/cn.ts","../../../src/elements/Tabs/Tabs.tsx","../../../src/schemas/BaseComponentProps.ts","../../../src/elements/Tabs/Tabs.types.ts"],"names":["cn","inputs","twMerge","clsx","Activity","ReactActivity","children","mode","jsx","TabsInternalContext","createContext","tabListVariants","cva","tabVariants","tabPanelVariants","TabsRoot","variant","selectedKey","defaultSelectedKey","onSelectionChange","orientation","keyboardActivation","isDisabled","disabledKeys","className","props","AriaTabs","TabListComponent","useContext","AriaTabList","composeRenderProps","renderProps","TabComponent","id","href","target","rel","download","child","AriaTab","TabPanelComponent","shouldForceMount","preserveState","forceMount","AriaTabPanel","isSelected","content","Tabs","TabList","Tab","TabPanel","BaseComponentPropsSchema","z","TabsVariantSchema","TabsOrientationSchema","TabsKeyboardActivationSchema","KeySchema","TabsPropsSchema","TabListPropsSchema","TabPropsSchema","TabPanelPropsSchema","ScrollArrowDirectionSchema","ScrollArrowPropsSchema"],"mappings":"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","file":"index.js","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","'use client';\n\n/**\n * Tabs Component - Implementation\n *\n * Accessible tabbed interface component combining React Aria primitives with ShadCN styling.\n * Follows Themis library patterns with compound component structure and direct named exports.\n *\n * Key Features:\n * - React Aria Tabs for full accessibility (WCAG 2.2 AAA)\n * - CVA variants for orientation styling\n * - React 19.2 Activity API for state preservation (preserveState prop)\n * - Dual keyboard activation modes (automatic/manual)\n * - Support for icons, badges, and link-based tabs\n *\n * @see tabs-prd.md (Full requirements)\n * @see Tabs.types.ts (Zod schemas)\n * @see plan.md (Implementation approach)\n */\n\n// React 19.2 Activity API - may not be available in all builds\n// Import conditionally to support environments where Activity is unavailable\nimport {\n Activity as ReactActivity,\n createContext,\n useContext,\n type ReactNode,\n type Key,\n type ReactElement,\n} from 'react';\n\n// Activity component with fallback for environments where it's not available\n// The fallback simply renders children directly - no state preservation when Activity unavailable\n// Note: ActivityFallback doesn't actually preserve state; it's just a pass-through\nconst Activity = ReactActivity ?? function ActivityFallback({\n children,\n mode,\n}: {\n children: ReactNode;\n mode: 'visible' | 'hidden';\n}): ReactElement {\n // When Activity is not available, just render children directly\n // mode is ignored in the fallback\n return <div data-activity-mode={mode}>{children}</div>;\n};\nimport {\n Tabs as AriaTabs,\n TabList as AriaTabList,\n Tab as AriaTab,\n TabPanel as AriaTabPanel,\n composeRenderProps,\n type Key as AriaKey,\n} from 'react-aria-components';\nimport { cva } from 'class-variance-authority';\nimport { cn } from '../../utils/cn';\nimport type {\n TabsProps,\n TabsVariant,\n TabsOrientation,\n TabListProps,\n TabProps,\n TabPanelProps,\n} from './Tabs.types';\n\n// ============================================================================\n// Internal Context\n// ============================================================================\n\ninterface TabsContextValue {\n variant: TabsVariant;\n orientation: TabsOrientation;\n}\n\nconst TabsInternalContext = createContext<TabsContextValue>({\n variant: 'default',\n orientation: 'horizontal',\n});\n\n// ============================================================================\n// CVA Variants\n// ============================================================================\n\n/**\n * TabList CVA variants\n *\n * @see PRD.md FR-002 (TabList Requirements)\n * @see PRD.md DS-001 (Design System - Layout)\n */\nexport const tabListVariants = cva(\n // Base styles\n [\n 'inline-flex items-center text-[var(--menu-muted)]',\n ],\n {\n variants: {\n variant: {\n default: 'border-b border-[var(--border)] bg-transparent rounded-none p-0 gap-0',\n block: 'justify-center rounded-md p-1 bg-[var(--accent-background)]',\n },\n orientation: {\n horizontal: 'flex-row',\n vertical: 'h-auto flex-col w-full',\n },\n },\n compoundVariants: [\n { variant: 'block', orientation: 'horizontal', class: 'h-10 gap-0' },\n { variant: 'block', orientation: 'vertical', class: 'gap-1' },\n { variant: 'default', orientation: 'vertical', class: 'border-b-0 border-l' },\n ],\n defaultVariants: {\n variant: 'default',\n orientation: 'horizontal',\n },\n }\n);\n\n/**\n * Tab CVA variants\n *\n * @see PRD.md FR-003 (Tab Requirements)\n * @see PRD.md DS-002 (Design System - Tab Styling)\n * @see PRD.md AR-001 (Accessibility - 44×44px touch targets)\n */\nexport const tabVariants = cva(\n // Base styles\n [\n 'inline-flex items-center justify-center gap-2 whitespace-nowrap',\n 'px-3 py-1.5 text-sm font-medium',\n 'ring-offset-[var(--content-background)] transition-all',\n 'focus-visible:outline-none focus-visible:ring-2',\n 'focus-visible:ring-[var(--ring)] focus-visible:ring-offset-2',\n // States via data attributes\n 'data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n // WCAG 2.2 AAA: 44×44px minimum touch target\n 'min-h-[44px]',\n ],\n {\n variants: {\n variant: {\n default: [\n 'rounded-none bg-transparent',\n 'data-[selected]:text-[var(--content-foreground)]',\n 'hover:text-[var(--content-foreground)]',\n ],\n block: [\n 'rounded-sm',\n 'data-[selected]:bg-[var(--content-background)] data-[selected]:text-[var(--content-foreground)]',\n 'data-[selected]:shadow-sm',\n ],\n },\n orientation: {\n horizontal: '',\n vertical: 'w-full justify-start',\n },\n },\n compoundVariants: [\n {\n variant: 'default',\n orientation: 'horizontal',\n class: 'border-b-2 border-transparent -mb-px data-[selected]:border-[var(--primary-action)]',\n },\n {\n variant: 'default',\n orientation: 'vertical',\n class: 'border-l-2 border-transparent -ml-px data-[selected]:border-[var(--primary-action)]',\n },\n ],\n defaultVariants: {\n variant: 'default',\n orientation: 'horizontal',\n },\n }\n);\n\n/**\n * TabPanel CVA variants\n *\n * @see PRD.md FR-004 (TabPanel Requirements)\n */\nexport const tabPanelVariants = cva(\n [\n 'mt-2 ring-offset-[var(--content-background)]',\n 'focus-visible:outline-none focus-visible:ring-2',\n 'focus-visible:ring-[var(--ring)] focus-visible:ring-offset-2',\n ],\n {\n variants: {},\n defaultVariants: {},\n }\n);\n\n// ============================================================================\n// Components\n// ============================================================================\n\n/**\n * Tabs Root Component\n *\n * Container for tabbed interface. Manages selection state and provides\n * context to child components.\n *\n * @see PRD.md FR-001 (Compound Component Pattern)\n * @see PRD.md FR-012 (Controlled Mode)\n * @see PRD.md FR-013 (Uncontrolled Mode)\n *\n * @example\n * // Uncontrolled\n * <Tabs defaultSelectedKey=\"tab1\">\n * <TabList aria-label=\"Navigation\">\n * <Tab id=\"tab1\">Tab 1</Tab>\n * <Tab id=\"tab2\">Tab 2</Tab>\n * </TabList>\n * <TabPanel id=\"tab1\">Content 1</TabPanel>\n * <TabPanel id=\"tab2\">Content 2</TabPanel>\n * </Tabs>\n *\n * @example\n * // Controlled\n * <Tabs selectedKey={selected} onSelectionChange={setSelected}>\n * ...\n * </Tabs>\n */\nfunction TabsRoot({\n children,\n variant = 'default',\n selectedKey,\n defaultSelectedKey,\n onSelectionChange,\n orientation = 'horizontal',\n keyboardActivation = 'automatic',\n isDisabled = false,\n disabledKeys,\n className,\n ...props\n}: TabsProps) {\n return (\n <TabsInternalContext.Provider value={{ variant, orientation }}>\n <AriaTabs\n selectedKey={selectedKey}\n defaultSelectedKey={defaultSelectedKey}\n onSelectionChange={onSelectionChange as (key: Key) => void}\n orientation={orientation}\n keyboardActivation={keyboardActivation}\n isDisabled={isDisabled}\n disabledKeys={disabledKeys as Iterable<AriaKey> | undefined}\n className={cn(className)}\n {...props}\n >\n {children}\n </AriaTabs>\n </TabsInternalContext.Provider>\n );\n}\n\nTabsRoot.displayName = 'Tabs';\n\n/**\n * TabList Component\n *\n * Container for tab buttons. Uses roving tabindex for keyboard navigation.\n * Receives orientation from parent Tabs via React Aria context.\n *\n * @see PRD.md FR-002 (TabList Requirements)\n * @see PRD.md AR-001 (ARIA Requirements)\n */\nfunction TabListComponent({\n children,\n className,\n ...props\n}: TabListProps) {\n const { variant } = useContext(TabsInternalContext);\n return (\n <AriaTabList\n className={composeRenderProps(className, (className, renderProps) =>\n cn(\n tabListVariants({ variant, orientation: renderProps.orientation }),\n className\n )\n )}\n {...props}\n >\n {children}\n </AriaTabList>\n );\n}\n\nTabListComponent.displayName = 'TabList';\n\n/**\n * Tab Component\n *\n * Individual tab button. Can render as button or anchor (when href provided).\n * Supports icons and badges as children.\n *\n * @see PRD.md FR-003 (Tab Requirements)\n * @see PRD.md FR-007 (Disabled States)\n * @see PRD.md FR-013 (Icon Support)\n * @see PRD.md FR-014 (Link-based Tabs)\n */\nfunction TabComponent({\n children,\n id,\n isDisabled = false,\n href,\n target,\n rel,\n download,\n className,\n ...props\n}: TabProps) {\n // Warn if icon-only tab without aria-label\n if (process.env.NODE_ENV !== 'production') {\n const hasTextContent =\n typeof children === 'string' ||\n (Array.isArray(children) &&\n children.some((child) => typeof child === 'string'));\n\n if (!hasTextContent && !props['aria-label']) {\n console.warn(\n 'Tabs: Icon-only tabs should have an aria-label for accessibility.'\n );\n }\n }\n\n const { variant, orientation } = useContext(TabsInternalContext);\n return (\n <AriaTab\n id={id}\n isDisabled={isDisabled}\n href={href}\n target={target}\n rel={rel}\n download={download}\n className={composeRenderProps(className, (className) =>\n cn(tabVariants({ variant, orientation }), className)\n )}\n {...props}\n >\n {children}\n </AriaTab>\n );\n}\n\nTabComponent.displayName = 'Tab';\n\n/**\n * TabPanel Component\n *\n * Content panel associated with a tab. Only the selected panel is visible.\n * Supports preserveState for React Activity state preservation.\n *\n * @see PRD.md FR-004 (TabPanel Requirements)\n * @see PRD.md FR-015 (Force Mount Panels)\n * @see PRD.md FR-016 (React Activity State Preservation)\n *\n * @example\n * // Default behavior - content unmounts when hidden\n * <TabPanel id=\"tab1\">Content</TabPanel>\n *\n * @example\n * // Legacy force mount - keeps content in DOM\n * <TabPanel id=\"tab1\" shouldForceMount>Form with state</TabPanel>\n *\n * @example\n * // React Activity - preserves state with proper effect cleanup\n * <TabPanel id=\"tab1\" preserveState>\n * <FormWithDraft />\n * </TabPanel>\n */\nfunction TabPanelComponent({\n children,\n id,\n shouldForceMount = false,\n preserveState = false,\n className,\n ...props\n}: TabPanelProps) {\n // preserveState takes precedence - both enable force mounting\n const forceMount = preserveState || shouldForceMount;\n\n // If children is a render function (for dynamic content based on selection state),\n // we need to use the render props pattern\n if (typeof children === 'function') {\n return (\n <AriaTabPanel\n id={id}\n shouldForceMount={forceMount}\n className={composeRenderProps(className, (className) =>\n cn(tabPanelVariants(), className)\n )}\n {...props}\n >\n {(renderProps) => {\n // React Aria TabPanelRenderProps includes: state, isInert\n // We derive isSelected from state - if state is undefined, panel is selected\n const isSelected = !renderProps.isInert;\n const content = (\n children as (renderProps: { isSelected: boolean }) => ReactNode\n )({ isSelected });\n\n if (preserveState) {\n return (\n <Activity mode={isSelected ? 'visible' : 'hidden'}>\n {content}\n </Activity>\n );\n }\n\n return content;\n }}\n </AriaTabPanel>\n );\n }\n\n // For static children (not a function), render directly\n // If preserveState is enabled, wrap in Activity\n if (preserveState) {\n return (\n <AriaTabPanel\n id={id}\n shouldForceMount={forceMount}\n className={composeRenderProps(className, (className) =>\n cn(tabPanelVariants(), className)\n )}\n {...props}\n >\n {(renderProps) => {\n const isSelected = !renderProps.isInert;\n return (\n <Activity mode={isSelected ? 'visible' : 'hidden'}>\n {children}\n </Activity>\n );\n }}\n </AriaTabPanel>\n );\n }\n\n // Default: render static children directly\n return (\n <AriaTabPanel\n id={id}\n shouldForceMount={forceMount}\n className={composeRenderProps(className, (className) =>\n cn(tabPanelVariants(), className)\n )}\n {...props}\n >\n {children}\n </AriaTabPanel>\n );\n}\n\nTabPanelComponent.displayName = 'TabPanel';\n\n// ============================================================================\n// Exports\n// ============================================================================\n\n/**\n * Direct named exports (not Object.assign compound pattern)\n *\n * Tabs follows React Aria's direct export pattern because:\n * - Simpler structure (only 4 components vs Dialog's 9)\n * - Better tree-shaking with named exports\n * - Clearer imports: import { Tabs, TabList, Tab, TabPanel } from '...'\n *\n * @see plan.md \"Why Direct Named Exports (Not Object.assign)?\"\n */\nexport const Tabs = TabsRoot;\nexport const TabList = TabListComponent;\nexport const Tab = TabComponent;\nexport const TabPanel = TabPanelComponent;\n\n// Re-export types for convenience\nexport type { TabsProps, TabsVariant, TabListProps, TabProps, TabPanelProps };\n","import { z } from 'zod';\n\n/**\n * Base props schema for all Themis components\n * Ensures consistent accessibility and styling APIs across the library\n *\n * @see spec.md FR-009 to FR-014 (Accessibility Requirements)\n * @see constitution.md Principle IV (Accessibility First - WCAG 2.2 AA minimum)\n */\nexport const BaseComponentPropsSchema = z.object({\n // Styling\n className: z.string().optional(),\n\n // React\n children: z.any().optional(), // ReactNode not directly supported by Zod\n id: z.string().optional(),\n\n // Accessibility (WCAG 2.2 AA requirements)\n 'aria-label': z.string().optional(),\n 'aria-labelledby': z.string().optional(),\n 'aria-describedby': z.string().optional(),\n 'aria-live': z.enum(['off', 'polite', 'assertive']).optional(),\n 'aria-hidden': z.boolean().optional(),\n\n // Testing & Development\n 'data-testid': z.string().optional(),\n});\n\nexport type BaseComponentProps = z.infer<typeof BaseComponentPropsSchema>;\n","import { z } from 'zod';\nimport { BaseComponentPropsSchema } from '../../schemas/BaseComponentProps';\nimport type { ReactNode, Key } from 'react';\n\n/**\n * Tab variant schema\n *\n * - 'default': Transparent background with bottom border indicator for active tab\n * - 'block': Pill/card style with accent background and shadow for active tab\n */\nexport const TabsVariantSchema = z.enum(['default', 'block']);\nexport type TabsVariant = z.infer<typeof TabsVariantSchema>;\n\n/**\n * Tab orientation schema\n *\n * @see PRD.md FR-005 (Orientation Support)\n */\nexport const TabsOrientationSchema = z.enum(['horizontal', 'vertical']);\nexport type TabsOrientation = z.infer<typeof TabsOrientationSchema>;\n\n/**\n * Keyboard activation mode schema\n *\n * @see PRD.md FR-006 (Keyboard Activation Modes)\n */\nexport const TabsKeyboardActivationSchema = z.enum(['automatic', 'manual']);\nexport type TabsKeyboardActivation = z.infer<typeof TabsKeyboardActivationSchema>;\n\n/**\n * Key schema for tab identification\n * Supports both string and number keys per React Aria convention\n */\nexport const KeySchema = z.union([z.string(), z.number()]);\n\n/**\n * Tabs root component props schema\n *\n * @see PRD.md FR-001 (Compound Component Pattern)\n * @see PRD.md FR-012 (Controlled Mode)\n * @see PRD.md FR-013 (Uncontrolled Mode)\n */\nexport const TabsPropsSchema = BaseComponentPropsSchema.extend({\n // Visual variant: 'default' (underline) or 'block' (pill/card)\n variant: TabsVariantSchema.optional().default('default'),\n\n // Controlled mode: selected tab key\n selectedKey: KeySchema.optional(),\n\n // Uncontrolled mode: default selected tab key\n defaultSelectedKey: KeySchema.optional(),\n\n // Selection change handler\n onSelectionChange: z.custom<(key: Key) => void>().optional(),\n\n // Orientation: horizontal or vertical layout\n orientation: TabsOrientationSchema.optional().default('horizontal'),\n\n // Keyboard activation: automatic (arrows select) or manual (arrows focus, Enter selects)\n keyboardActivation: TabsKeyboardActivationSchema.optional().default('automatic'),\n\n // Disable all tabs\n isDisabled: z.boolean().optional().default(false),\n\n // Keys of tabs to disable individually\n disabledKeys: z.array(KeySchema).optional(),\n\n // Children: TabList and TabPanel components\n children: z.custom<ReactNode>(),\n});\n\nexport type TabsProps = z.infer<typeof TabsPropsSchema>;\n\n/**\n * TabList component props schema\n *\n * @see PRD.md FR-002 (TabList Requirements)\n * @see PRD.md AR-001 (ARIA Requirements)\n */\nexport const TabListPropsSchema = BaseComponentPropsSchema.extend({\n // Accessible label (required for accessibility if no aria-labelledby)\n 'aria-label': z.string().optional(),\n\n // Reference to labelling element\n 'aria-labelledby': z.string().optional(),\n\n // Children: Tab components\n children: z.custom<ReactNode>(),\n});\n\nexport type TabListProps = z.infer<typeof TabListPropsSchema>;\n\n/**\n * Tab component props schema\n *\n * @see PRD.md FR-003 (Tab Requirements)\n * @see PRD.md FR-007 (Disabled States)\n * @see PRD.md FR-014 (Link-based Tabs)\n */\nexport const TabPropsSchema = BaseComponentPropsSchema.extend({\n // Unique identifier for the tab (required)\n id: KeySchema,\n\n // Disable this specific tab\n isDisabled: z.boolean().optional().default(false),\n\n // Link tab: URL for navigation-style tabs\n href: z.string().optional(),\n\n // Link tab: target attribute\n target: z.string().optional(),\n\n // Link tab: rel attribute\n rel: z.string().optional(),\n\n // Link tab: download attribute\n download: z.union([z.string(), z.boolean()]).optional(),\n\n // Tab content (text, icons, badges)\n children: z.custom<ReactNode>(),\n});\n\nexport type TabProps = z.infer<typeof TabPropsSchema>;\n\n/**\n * TabPanel component props schema\n *\n * @see PRD.md FR-004 (TabPanel Requirements)\n * @see PRD.md FR-015 (Force Mount Panels)\n * @see PRD.md FR-016 (React Activity State Preservation)\n */\nexport const TabPanelPropsSchema = BaseComponentPropsSchema.extend({\n // Unique identifier matching a Tab id (required)\n id: KeySchema,\n\n // Legacy: Force panel to stay in DOM when hidden\n // Use preserveState instead for proper effect cleanup\n shouldForceMount: z.boolean().optional().default(false),\n\n // React 19.2 Activity: Preserve state with proper effect cleanup\n // When true, wraps content in <Activity> component\n // Effects are cleaned up when hidden, restored when visible\n preserveState: z.boolean().optional().default(false),\n\n // Panel content\n children: z.custom<ReactNode>(),\n});\n\nexport type TabPanelProps = z.infer<typeof TabPanelPropsSchema>;\n\n/**\n * Scroll arrow direction for overflow handling\n *\n * @see PRD.md FR-010 (Overflow Handling)\n */\nexport const ScrollArrowDirectionSchema = z.enum(['left', 'right', 'up', 'down']);\nexport type ScrollArrowDirection = z.infer<typeof ScrollArrowDirectionSchema>;\n\n/**\n * Internal props for scroll arrow buttons\n * Used by overflow handling implementation\n */\nexport const ScrollArrowPropsSchema = BaseComponentPropsSchema.extend({\n // Scroll direction\n direction: ScrollArrowDirectionSchema,\n\n // Disable when can't scroll further\n isDisabled: z.boolean().optional().default(false),\n\n // Click handler for scrolling\n onPress: z.custom<() => void>(),\n\n // Accessible label\n 'aria-label': z.string(),\n});\n\nexport type ScrollArrowProps = z.infer<typeof ScrollArrowPropsSchema>;\n"]}
@@ -1,3 +1,3 @@
1
1
  "use client";
2
- import {Activity}from'react';import {Tabs,TabList,composeRenderProps,Tab,TabPanel}from'react-aria-components';import {cva}from'class-variance-authority';import {clsx}from'clsx';import {twMerge}from'tailwind-merge';import {jsx}from'react/jsx-runtime';import {z as z$1}from'zod';function m(...a){return twMerge(clsx(a))}var v=Activity??function({children:t,mode:i}){return jsx("div",{"data-activity-mode":i,children:t})},x=cva(["inline-flex items-center justify-center rounded-md p-1","bg-[var(--accent-background)] text-[var(--menu-muted)]"],{variants:{orientation:{horizontal:"h-10 flex-row gap-0",vertical:"h-auto flex-col w-full gap-1"}},defaultVariants:{orientation:"horizontal"}}),S=cva(["inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-sm","px-3 py-1.5 text-sm font-medium","ring-offset-[var(--content-background)] transition-all","focus-visible:outline-none focus-visible:ring-2","focus-visible:ring-[var(--ring)] focus-visible:ring-offset-2","data-[disabled]:pointer-events-none data-[disabled]:opacity-50","data-[selected]:bg-[var(--content-background)] data-[selected]:text-[var(--content-foreground)]","data-[selected]:shadow-sm","min-h-[44px]"],{variants:{orientation:{horizontal:"",vertical:"w-full justify-start"}},defaultVariants:{orientation:"horizontal"}}),T=cva(["mt-2 ring-offset-[var(--content-background)]","focus-visible:outline-none focus-visible:ring-2","focus-visible:ring-[var(--ring)] focus-visible:ring-offset-2"],{variants:{},defaultVariants:{}});function g({children:a,selectedKey:t,defaultSelectedKey:i,onSelectionChange:n,orientation:s="horizontal",keyboardActivation:p="automatic",isDisabled:b=false,disabledKeys:o,className:l,...d}){return jsx(Tabs,{selectedKey:t,defaultSelectedKey:i,onSelectionChange:n,orientation:s,keyboardActivation:p,isDisabled:b,disabledKeys:o,className:m(l),...d,children:a})}g.displayName="Tabs";function A({children:a,className:t,...i}){return jsx(TabList,{className:composeRenderProps(t,(n,s)=>m(x({orientation:s.orientation}),n)),...i,children:a})}A.displayName="TabList";function w({children:a,id:t,isDisabled:i=false,href:n,target:s,rel:p,download:b,className:o,...l}){return process.env.NODE_ENV!=="production"&&!(typeof a=="string"||Array.isArray(a)&&a.some(C=>typeof C=="string"))&&!l["aria-label"]&&console.warn("Tabs: Icon-only tabs should have an aria-label for accessibility."),jsx(Tab,{id:t,isDisabled:i,href:n,target:s,rel:p,download:b,className:composeRenderProps(o,d=>m(S(),d)),...l,children:a})}w.displayName="Tab";function K({children:a,id:t,shouldForceMount:i=false,preserveState:n=false,className:s,...p}){let b=n||i;return typeof a=="function"?jsx(TabPanel,{id:t,shouldForceMount:b,className:composeRenderProps(s,o=>m(T(),o)),...p,children:o=>{let l=!o.isInert,d=a({isSelected:l});return n?jsx(v,{mode:l?"visible":"hidden",children:d}):d}}):n?jsx(TabPanel,{id:t,shouldForceMount:b,className:composeRenderProps(s,o=>m(T(),o)),...p,children:o=>{let l=!o.isInert;return jsx(v,{mode:l?"visible":"hidden",children:a})}}):jsx(TabPanel,{id:t,shouldForceMount:b,className:composeRenderProps(s,o=>m(T(),o)),...p,children:a})}K.displayName="TabPanel";var F=g,B=A,E=w,I=K;var f=z$1.object({className:z$1.string().optional(),children:z$1.any().optional(),id:z$1.string().optional(),"aria-label":z$1.string().optional(),"aria-labelledby":z$1.string().optional(),"aria-describedby":z$1.string().optional(),"aria-live":z$1.enum(["off","polite","assertive"]).optional(),"aria-hidden":z$1.boolean().optional(),"data-testid":z$1.string().optional()});var N=z$1.enum(["horizontal","vertical"]),z=z$1.enum(["automatic","manual"]),u=z$1.union([z$1.string(),z$1.number()]),j=f.extend({selectedKey:u.optional(),defaultSelectedKey:u.optional(),onSelectionChange:z$1.custom().optional(),orientation:N.optional().default("horizontal"),keyboardActivation:z.optional().default("automatic"),isDisabled:z$1.boolean().optional().default(false),disabledKeys:z$1.array(u).optional(),children:z$1.custom()}),_=f.extend({"aria-label":z$1.string().optional(),"aria-labelledby":z$1.string().optional(),children:z$1.custom()}),q=f.extend({id:u,isDisabled:z$1.boolean().optional().default(false),href:z$1.string().optional(),target:z$1.string().optional(),rel:z$1.string().optional(),download:z$1.union([z$1.string(),z$1.boolean()]).optional(),children:z$1.custom()}),G=f.extend({id:u,shouldForceMount:z$1.boolean().optional().default(false),preserveState:z$1.boolean().optional().default(false),children:z$1.custom()}),L=z$1.enum(["left","right","up","down"]),H=f.extend({direction:L,isDisabled:z$1.boolean().optional().default(false),onPress:z$1.custom(),"aria-label":z$1.string()});export{u as KeySchema,L as ScrollArrowDirectionSchema,H as ScrollArrowPropsSchema,E as Tab,B as TabList,_ as TabListPropsSchema,I as TabPanel,G as TabPanelPropsSchema,q as TabPropsSchema,F as Tabs,z as TabsKeyboardActivationSchema,N as TabsOrientationSchema,j as TabsPropsSchema,x as tabListVariants,T as tabPanelVariants,S as tabVariants};//# sourceMappingURL=index.mjs.map
2
+ import {createContext,useContext,Activity}from'react';import {Tabs,TabList,composeRenderProps,Tab,TabPanel}from'react-aria-components';import {cva}from'class-variance-authority';import {clsx}from'clsx';import {twMerge}from'tailwind-merge';import {jsx}from'react/jsx-runtime';import {z as z$1}from'zod';function d(...e){return twMerge(clsx(e))}var S=Activity??function({children:o,mode:s}){return jsx("div",{"data-activity-mode":s,children:o})},x=createContext({variant:"default",orientation:"horizontal"}),z=cva(["inline-flex items-center text-[var(--menu-muted)]"],{variants:{variant:{default:"border-b border-[var(--border)] bg-transparent rounded-none p-0 gap-0",block:"justify-center rounded-md p-1 bg-[var(--accent-background)]"},orientation:{horizontal:"flex-row",vertical:"h-auto flex-col w-full"}},compoundVariants:[{variant:"block",orientation:"horizontal",class:"h-10 gap-0"},{variant:"block",orientation:"vertical",class:"gap-1"},{variant:"default",orientation:"vertical",class:"border-b-0 border-l"}],defaultVariants:{variant:"default",orientation:"horizontal"}}),V=cva(["inline-flex items-center justify-center gap-2 whitespace-nowrap","px-3 py-1.5 text-sm font-medium","ring-offset-[var(--content-background)] transition-all","focus-visible:outline-none focus-visible:ring-2","focus-visible:ring-[var(--ring)] focus-visible:ring-offset-2","data-[disabled]:pointer-events-none data-[disabled]:opacity-50","min-h-[44px]"],{variants:{variant:{default:["rounded-none bg-transparent","data-[selected]:text-[var(--content-foreground)]","hover:text-[var(--content-foreground)]"],block:["rounded-sm","data-[selected]:bg-[var(--content-background)] data-[selected]:text-[var(--content-foreground)]","data-[selected]:shadow-sm"]},orientation:{horizontal:"",vertical:"w-full justify-start"}},compoundVariants:[{variant:"default",orientation:"horizontal",class:"border-b-2 border-transparent -mb-px data-[selected]:border-[var(--primary-action)]"},{variant:"default",orientation:"vertical",class:"border-l-2 border-transparent -ml-px data-[selected]:border-[var(--primary-action)]"}],defaultVariants:{variant:"default",orientation:"horizontal"}}),y=cva(["mt-2 ring-offset-[var(--content-background)]","focus-visible:outline-none focus-visible:ring-2","focus-visible:ring-[var(--ring)] focus-visible:ring-offset-2"],{variants:{},defaultVariants:{}});function w({children:e,variant:o="default",selectedKey:s,defaultSelectedKey:l,onSelectionChange:c,orientation:r="horizontal",keyboardActivation:b="automatic",isDisabled:t=false,disabledKeys:p,className:f,...v}){return jsx(x.Provider,{value:{variant:o,orientation:r},children:jsx(Tabs,{selectedKey:s,defaultSelectedKey:l,onSelectionChange:c,orientation:r,keyboardActivation:b,isDisabled:t,disabledKeys:p,className:d(f),...v,children:e})})}w.displayName="Tabs";function K({children:e,className:o,...s}){let{variant:l}=useContext(x);return jsx(TabList,{className:composeRenderProps(o,(c,r)=>d(z({variant:l,orientation:r.orientation}),c)),...s,children:e})}K.displayName="TabList";function C({children:e,id:o,isDisabled:s=false,href:l,target:c,rel:r,download:b,className:t,...p}){process.env.NODE_ENV!=="production"&&!(typeof e=="string"||Array.isArray(e)&&e.some(D=>typeof D=="string"))&&!p["aria-label"]&&console.warn("Tabs: Icon-only tabs should have an aria-label for accessibility.");let{variant:f,orientation:v}=useContext(x);return jsx(Tab,{id:o,isDisabled:s,href:l,target:c,rel:r,download:b,className:composeRenderProps(t,g=>d(V({variant:f,orientation:v}),g)),...p,children:e})}C.displayName="Tab";function N({children:e,id:o,shouldForceMount:s=false,preserveState:l=false,className:c,...r}){let b=l||s;return typeof e=="function"?jsx(TabPanel,{id:o,shouldForceMount:b,className:composeRenderProps(c,t=>d(y(),t)),...r,children:t=>{let p=!t.isInert,f=e({isSelected:p});return l?jsx(S,{mode:p?"visible":"hidden",children:f}):f}}):l?jsx(TabPanel,{id:o,shouldForceMount:b,className:composeRenderProps(c,t=>d(y(),t)),...r,children:t=>{let p=!t.isInert;return jsx(S,{mode:p?"visible":"hidden",children:e})}}):jsx(TabPanel,{id:o,shouldForceMount:b,className:composeRenderProps(c,t=>d(y(),t)),...r,children:e})}N.displayName="TabPanel";var _=w,q=K,G=C,H=N;var m=z$1.object({className:z$1.string().optional(),children:z$1.any().optional(),id:z$1.string().optional(),"aria-label":z$1.string().optional(),"aria-labelledby":z$1.string().optional(),"aria-describedby":z$1.string().optional(),"aria-live":z$1.enum(["off","polite","assertive"]).optional(),"aria-hidden":z$1.boolean().optional(),"data-testid":z$1.string().optional()});var J=z$1.enum(["default","block"]),L=z$1.enum(["horizontal","vertical"]),k=z$1.enum(["automatic","manual"]),u=z$1.union([z$1.string(),z$1.number()]),Q=m.extend({variant:J.optional().default("default"),selectedKey:u.optional(),defaultSelectedKey:u.optional(),onSelectionChange:z$1.custom().optional(),orientation:L.optional().default("horizontal"),keyboardActivation:k.optional().default("automatic"),isDisabled:z$1.boolean().optional().default(false),disabledKeys:z$1.array(u).optional(),children:z$1.custom()}),U=m.extend({"aria-label":z$1.string().optional(),"aria-labelledby":z$1.string().optional(),children:z$1.custom()}),W=m.extend({id:u,isDisabled:z$1.boolean().optional().default(false),href:z$1.string().optional(),target:z$1.string().optional(),rel:z$1.string().optional(),download:z$1.union([z$1.string(),z$1.boolean()]).optional(),children:z$1.custom()}),X=m.extend({id:u,shouldForceMount:z$1.boolean().optional().default(false),preserveState:z$1.boolean().optional().default(false),children:z$1.custom()}),R=z$1.enum(["left","right","up","down"]),Y=m.extend({direction:R,isDisabled:z$1.boolean().optional().default(false),onPress:z$1.custom(),"aria-label":z$1.string()});export{u as KeySchema,R as ScrollArrowDirectionSchema,Y as ScrollArrowPropsSchema,G as Tab,q as TabList,U as TabListPropsSchema,H as TabPanel,X as TabPanelPropsSchema,W as TabPropsSchema,_ as Tabs,k as TabsKeyboardActivationSchema,L as TabsOrientationSchema,Q as TabsPropsSchema,z as tabListVariants,y as tabPanelVariants,V as tabVariants};//# sourceMappingURL=index.mjs.map
3
3
  //# sourceMappingURL=index.mjs.map