@skyfall_ai/aegis 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/tokens/colors.ts","../src/tokens/typography.ts","../src/tokens/spacing.ts","../src/tokens/sizing.ts","../src/tokens/radius.ts","../src/tokens/borders.ts","../src/tokens/shadows.ts","../src/tokens/motion.ts","../src/tokens/opacity.ts","../src/tokens/zIndex.ts","../src/tokens/layout.ts","../src/tokens/focus.ts","../src/components/Button/Button.tsx","../src/utils/cn.ts","../src/components/Button/Button.module.css","../src/components/IconButton/IconButton.tsx","../src/components/IconButton/IconButton.module.css","../src/components/Input/Input.tsx","../src/components/Input/Input.module.css","../src/components/Textarea/Textarea.tsx","../src/components/Textarea/Textarea.module.css","../src/components/Select/Select.tsx","../src/components/Select/Select.module.css","../src/components/Checkbox/Checkbox.tsx","../src/components/Checkbox/Checkbox.module.css","../src/components/Radio/Radio.tsx","../src/components/Radio/Radio.module.css","../src/components/Switch/Switch.tsx","../src/components/Switch/Switch.module.css","../src/components/Label/Label.module.css","../src/components/Label/Label.tsx","../src/components/HelperText/HelperText.module.css","../src/components/HelperText/HelperText.tsx","../src/components/Card/Card.module.css","../src/components/Card/Card.tsx","../src/components/Badge/Badge.module.css","../src/components/Badge/Badge.tsx","../src/components/Alert/Alert.module.css","../src/components/Alert/Alert.tsx","../src/components/Tabs/Tabs.tsx","../src/components/Tabs/Tabs.module.css","../src/components/Modal/Modal.tsx","../src/components/Modal/Modal.module.css","../src/components/Table/Table.module.css","../src/components/Table/Table.tsx","../src/components/Tooltip/Tooltip.tsx","../src/components/Tooltip/Tooltip.module.css","../src/components/Divider/Divider.module.css","../src/components/Divider/Divider.tsx","../src/components/Spinner/Spinner.module.css","../src/components/Spinner/Spinner.tsx","../src/components/Skeleton/Skeleton.module.css","../src/components/Skeleton/Skeleton.tsx","../src/components/StatusBadge/StatusBadge.module.css","../src/components/StatusBadge/StatusBadge.tsx","../src/components/Avatar/Avatar.tsx","../src/components/Avatar/Avatar.module.css","../src/components/EmptyState/EmptyState.module.css","../src/components/EmptyState/EmptyState.tsx","../src/components/ProgressBar/ProgressBar.module.css","../src/components/ProgressBar/ProgressBar.tsx","../src/components/Pagination/Pagination.module.css","../src/components/Pagination/Pagination.tsx","../src/components/DescriptionList/DescriptionList.module.css","../src/components/DescriptionList/DescriptionList.tsx","../src/components/Popover/Popover.tsx","../src/components/Popover/Popover.module.css","../src/components/Drawer/Drawer.tsx","../src/components/Drawer/Drawer.module.css","../src/components/DataGrid/DataGrid.tsx","../src/components/DataGrid/DataGrid.module.css","../src/components/FormField/FormField.tsx","../src/components/FormField/FormField.module.css","../src/components/SearchField/SearchField.tsx","../src/components/SearchField/SearchField.module.css","../src/components/NumberField/NumberField.tsx","../src/components/NumberField/NumberField.module.css","../src/components/CheckboxGroup/CheckboxGroup.tsx","../src/components/CheckboxGroup/CheckboxGroup.module.css","../src/components/RadioGroup/RadioGroup.tsx","../src/components/RadioGroup/RadioGroup.module.css","../src/components/Slider/Slider.tsx","../src/components/Slider/Slider.module.css","../src/components/FileUpload/FileUpload.tsx","../src/components/FileUpload/FileUpload.module.css","../src/components/OTPInput/OTPInput.tsx","../src/components/OTPInput/OTPInput.module.css","../src/components/DatePicker/DatePicker.tsx","../src/components/DatePicker/DatePicker.module.css","../src/components/MultiSelect/MultiSelect.tsx","../src/components/MultiSelect/MultiSelect.module.css","../src/components/Autocomplete/Autocomplete.tsx","../src/components/Autocomplete/Autocomplete.module.css","../src/components/Stepper/Stepper.module.css","../src/components/Stepper/Stepper.tsx","../src/components/Accordion/Accordion.tsx","../src/components/Accordion/Accordion.module.css","../src/components/Breadcrumbs/Breadcrumbs.module.css","../src/components/Breadcrumbs/Breadcrumbs.tsx","../src/components/SideNav/SideNav.module.css","../src/components/SideNav/SideNav.tsx","../src/components/TopNav/TopNav.module.css","../src/components/TopNav/TopNav.tsx","../src/components/StatCard/StatCard.module.css","../src/components/StatCard/StatCard.tsx","../src/components/List/List.tsx","../src/components/List/List.module.css","../src/components/CollapsiblePanel/CollapsiblePanel.tsx","../src/components/CollapsiblePanel/CollapsiblePanel.module.css","../src/components/PatientCard/PatientCard.module.css","../src/components/PatientCard/PatientCard.tsx","../src/components/AppointmentCard/AppointmentCard.module.css","../src/components/AppointmentCard/AppointmentCard.tsx","../src/components/Timeline/Timeline.module.css","../src/components/Timeline/Timeline.tsx","../src/components/ClinicalBanner/ClinicalBanner.module.css","../src/components/ClinicalBanner/ClinicalBanner.tsx","../src/components/MedicationRow/MedicationRow.module.css","../src/components/MedicationRow/MedicationRow.tsx","../src/components/LabResultRow/LabResultRow.module.css","../src/components/LabResultRow/LabResultRow.tsx","../src/components/InsuranceCard/InsuranceCard.module.css","../src/components/InsuranceCard/InsuranceCard.tsx","../src/components/Toast/Toast.tsx","../src/components/Toast/Toast.module.css","../src/components/ConfirmDialog/ConfirmDialog.tsx","../src/components/ConfirmDialog/ConfirmDialog.module.css","../src/components/Banner/Banner.module.css","../src/components/Banner/Banner.tsx"],"sourcesContent":["/** Brand primary palette */\nexport const brandPrimary = {\n 50: '#EEF4FF',\n 100: '#DCE8FF',\n 200: '#BED4FF',\n 300: '#8FB7FF',\n 400: '#5C92F2',\n 500: '#2F6FE4',\n 600: '#1F5CCD',\n 700: '#1849A6',\n 800: '#153B82',\n 900: '#112E63',\n} as const;\n\n/** Support accent — teal */\nexport const accentTeal = {\n 50: '#EDF9F8',\n 100: '#D4F1EE',\n 200: '#A9E0D9',\n 300: '#77C9BE',\n 400: '#48AE9F',\n 500: '#2E8F83',\n 600: '#237368',\n 700: '#1D5D54',\n} as const;\n\n/** Neutral palette */\nexport const neutral = {\n 0: '#FFFFFF',\n 25: '#FCFDFE',\n 50: '#F6F8FA',\n 100: '#EDF1F5',\n 200: '#DCE3EA',\n 300: '#C1CBD6',\n 400: '#93A1B2',\n 500: '#66768A',\n 600: '#4B5B6C',\n 700: '#334155',\n 800: '#223042',\n 900: '#16202B',\n} as const;\n\n/** Semantic colors */\nexport const semantic = {\n success: { 50: '#EEF8F1', 500: '#2F8F57', 700: '#1F6B3D' },\n warning: { 50: '#FFF6E8', 500: '#B86A00', 700: '#8D4F00' },\n error: { 50: '#FFF0F0', 500: '#C23A3A', 700: '#8F2626' },\n info: { 50: '#EEF6FF', 500: '#2563B8', 700: '#1B4C8E' },\n} as const;\n\n/** Text aliases */\nexport const text = {\n primary: '#16202B',\n secondary: '#4B5B6C',\n muted: '#66768A',\n inverse: '#FFFFFF',\n} as const;\n\n/** Surface aliases */\nexport const surface = {\n canvas: '#FCFDFE',\n default: '#FFFFFF',\n subtle: '#F6F8FA',\n raised: '#FFFFFF',\n} as const;\n\n/** Border aliases */\nexport const border = {\n default: '#DCE3EA',\n strong: '#C1CBD6',\n inverse: '#334155',\n} as const;\n\n/** Data visualization */\nexport const dataVis = {\n 1: '#2F6FE4',\n 2: '#2E8F83',\n 3: '#7B61C9',\n 4: '#B86A00',\n 5: '#C23A3A',\n gridline: '#DCE3EA',\n axis: '#66768A',\n} as const;\n","export const fontFamily = {\n sans: '\"Inter\", system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif',\n mono: '\"IBM Plex Mono\", \"SFMono-Regular\", Consolas, monospace',\n} as const;\n\nexport const fontWeight = {\n regular: 400,\n medium: 500,\n semibold: 600,\n bold: 700,\n} as const;\n\nexport const fontSize = {\n 'display-lg': '40px',\n 'display-md': '32px',\n 'heading-xl': '28px',\n 'heading-lg': '24px',\n 'heading-md': '20px',\n 'heading-sm': '18px',\n 'body-lg': '16px',\n 'body-md': '14px',\n 'body-sm': '13px',\n 'label-lg': '14px',\n 'label-md': '13px',\n caption: '12px',\n data: '14px',\n code: '13px',\n} as const;\n\nexport const lineHeight = {\n 'display-lg': '48px',\n 'display-md': '40px',\n 'heading-xl': '36px',\n 'heading-lg': '32px',\n 'heading-md': '28px',\n 'heading-sm': '26px',\n 'body-lg': '24px',\n 'body-md': '22px',\n 'body-sm': '20px',\n 'label-lg': '20px',\n 'label-md': '18px',\n caption: '16px',\n data: '20px',\n code: '18px',\n} as const;\n\nexport const tracking = {\n tight: '-0.02em',\n normal: '0em',\n wide: '0.01em',\n} as const;\n","export const space = {\n 0: '0',\n 1: '4px',\n 2: '8px',\n 3: '12px',\n 4: '16px',\n 5: '20px',\n 6: '24px',\n 8: '32px',\n 10: '40px',\n 12: '48px',\n 16: '64px',\n 20: '80px',\n} as const;\n","export const controlSize = {\n sm: '32px',\n md: '40px',\n lg: '48px',\n} as const;\n\nexport const iconSize = {\n xs: '12px',\n sm: '16px',\n md: '20px',\n lg: '24px',\n} as const;\n\nexport const touchMin = '44px';\n\nexport const modalSize = {\n sm: '400px',\n md: '560px',\n lg: '720px',\n xl: '880px',\n} as const;\n\nexport const sidebarDefault = '280px';\n","export const radius = {\n none: '0',\n sm: '6px',\n md: '10px',\n lg: '14px',\n xl: '18px',\n full: '9999px',\n} as const;\n","export const borderWidth = {\n none: '0',\n hairline: '1px',\n medium: '2px',\n strong: '3px',\n} as const;\n\nexport const borderStyle = {\n default: 'solid',\n} as const;\n","export const shadow = {\n none: 'none',\n xs: '0 1px 2px rgba(22, 32, 43, 0.05)',\n sm: '0 1px 3px rgba(22, 32, 43, 0.06), 0 2px 8px rgba(22, 32, 43, 0.04)',\n md: '0 2px 4px rgba(22, 32, 43, 0.04), 0 8px 20px rgba(22, 32, 43, 0.08)',\n lg: '0 4px 8px rgba(22, 32, 43, 0.04), 0 16px 40px rgba(22, 32, 43, 0.12)',\n xl: '0 8px 16px rgba(22, 32, 43, 0.06), 0 24px 56px rgba(22, 32, 43, 0.16)',\n focus: '0 0 0 3px rgba(47, 111, 228, 0.28)',\n focusError: '0 0 0 3px rgba(194, 58, 58, 0.2)',\n focusSuccess: '0 0 0 3px rgba(47, 143, 87, 0.2)',\n insetXs: 'inset 0 1px 2px rgba(22, 32, 43, 0.06)',\n insetSm: 'inset 0 2px 4px rgba(22, 32, 43, 0.08)',\n} as const;\n","export const duration = {\n fast: '120ms',\n base: '180ms',\n slow: '240ms',\n} as const;\n\nexport const easing = {\n standard: 'cubic-bezier(0.2, 0, 0, 1)',\n emphasized: 'cubic-bezier(0.2, 0, 0, 1)',\n exit: 'cubic-bezier(0.4, 0, 1, 1)',\n} as const;\n","export const opacity = {\n disabled: 0.48,\n subtle: 0.72,\n overlay: 0.48,\n scrimStrong: 0.64,\n} as const;\n","export const zIndex = {\n base: 0,\n dropdown: 1000,\n sticky: 1100,\n banner: 1200,\n overlay: 1300,\n modal: 1400,\n toast: 1500,\n tooltip: 1600,\n} as const;\n","export const container = {\n max: '1280px',\n reading: '720px',\n} as const;\n\nexport const grid = {\n columns: 12,\n gutter: '24px',\n margin: {\n desktop: '32px',\n tablet: '24px',\n mobile: '16px',\n },\n} as const;\n","export const focusRing = {\n width: '3px',\n color: 'rgba(47, 111, 228, 0.28)',\n offset: '2px',\n outlineColor: '#2F6FE4',\n} as const;\n","import { forwardRef, type ButtonHTMLAttributes, type ReactNode } from 'react';\nimport { cn } from '../../utils/cn';\nimport styles from './Button.module.css';\n\nexport interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n /** Visual variant */\n variant?: 'primary' | 'secondary' | 'ghost' | 'danger';\n /** Size of the button */\n size?: 'sm' | 'md' | 'lg';\n /** Full width */\n fullWidth?: boolean;\n /** Loading state — disables interaction and shows spinner */\n loading?: boolean;\n /** Icon before the label */\n iconLeft?: ReactNode;\n /** Icon after the label */\n iconRight?: ReactNode;\n}\n\n/**\n * Button — primary interactive element.\n *\n * Accessibility:\n * - Uses native <button> for keyboard and screen reader support\n * - aria-disabled used during loading to maintain focusability\n * - aria-busy signals loading state to assistive technology\n * - Minimum 44px touch target on md/lg sizes\n */\nexport const Button = forwardRef<HTMLButtonElement, ButtonProps>(\n (\n {\n variant = 'primary',\n size = 'md',\n fullWidth = false,\n loading = false,\n disabled = false,\n iconLeft,\n iconRight,\n children,\n className,\n ...props\n },\n ref,\n ) => {\n const isDisabled = disabled || loading;\n\n return (\n <button\n ref={ref}\n className={cn(\n styles.button,\n styles[variant],\n styles[size],\n fullWidth && styles.fullWidth,\n loading && styles.loading,\n className,\n )}\n disabled={isDisabled}\n aria-disabled={isDisabled || undefined}\n aria-busy={loading || undefined}\n {...props}\n >\n {loading && (\n <span className={styles.spinner} aria-hidden=\"true\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <circle cx=\"8\" cy=\"8\" r=\"6\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeDasharray=\"28\" strokeDashoffset=\"8\" />\n </svg>\n </span>\n )}\n {iconLeft && <span className={styles.iconLeft} aria-hidden=\"true\">{iconLeft}</span>}\n <span className={styles.label}>{children}</span>\n {iconRight && <span className={styles.iconRight} aria-hidden=\"true\">{iconRight}</span>}\n </button>\n );\n },\n);\n\nButton.displayName = 'Button';\n","/** Merge CSS module class names, filtering out falsy values */\nexport function cn(...classes: (string | false | null | undefined)[]): string {\n return classes.filter(Boolean).join(' ');\n}\n",".button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: var(--aegis-space-2);\n border: var(--aegis-border-width-hairline) solid transparent;\n border-radius: var(--aegis-radius-md);\n font-family: var(--aegis-font-family-sans);\n font-weight: var(--aegis-font-weight-medium);\n cursor: pointer;\n transition:\n background-color var(--aegis-motion-duration-base) var(--aegis-motion-easing-standard),\n border-color var(--aegis-motion-duration-base) var(--aegis-motion-easing-standard),\n box-shadow var(--aegis-motion-duration-base) var(--aegis-motion-easing-standard),\n transform var(--aegis-motion-duration-fast) var(--aegis-motion-easing-standard);\n white-space: nowrap;\n user-select: none;\n text-decoration: none;\n line-height: 1;\n}\n\n.button:focus-visible {\n outline: var(--aegis-border-width-medium) solid var(--aegis-focus-outline-color);\n outline-offset: var(--aegis-focus-ring-offset);\n box-shadow: var(--aegis-shadow-focus);\n}\n\n.button:disabled {\n cursor: not-allowed;\n opacity: var(--aegis-opacity-disabled);\n}\n\n/* Sizes */\n.sm {\n height: var(--aegis-size-control-sm);\n padding: 0 var(--aegis-space-3);\n font-size: var(--aegis-font-size-body-sm);\n}\n\n.md {\n height: var(--aegis-size-control-md);\n padding: 0 var(--aegis-space-4);\n font-size: var(--aegis-font-size-body-md);\n}\n\n.lg {\n height: var(--aegis-size-control-lg);\n padding: 0 var(--aegis-space-6);\n font-size: var(--aegis-font-size-body-lg);\n}\n\n/* Variants */\n.primary {\n background: linear-gradient(\n 180deg,\n var(--aegis-color-brand-primary-500) 0%,\n var(--aegis-color-brand-primary-600) 100%\n );\n color: var(--aegis-color-text-inverse);\n box-shadow: var(--aegis-shadow-xs);\n}\n\n.primary:hover:not(:disabled) {\n background: linear-gradient(\n 180deg,\n var(--aegis-color-brand-primary-600) 0%,\n var(--aegis-color-brand-primary-700) 100%\n );\n box-shadow: var(--aegis-shadow-sm);\n}\n\n.primary:active:not(:disabled) {\n background: var(--aegis-color-brand-primary-700);\n box-shadow: var(--aegis-shadow-inset-xs);\n}\n\n.secondary {\n background-color: var(--aegis-color-surface-default);\n color: var(--aegis-color-text-primary);\n border-color: var(--aegis-color-border-default);\n box-shadow: var(--aegis-shadow-xs);\n}\n\n.secondary:hover:not(:disabled) {\n background-color: var(--aegis-color-surface-hover);\n border-color: var(--aegis-color-border-strong);\n box-shadow: var(--aegis-shadow-sm);\n}\n\n.secondary:active:not(:disabled) {\n background-color: var(--aegis-color-surface-active);\n box-shadow: var(--aegis-shadow-inset-xs);\n}\n\n.ghost {\n background-color: transparent;\n color: var(--aegis-color-brand-primary-500);\n}\n\n.ghost:hover:not(:disabled) {\n background-color: var(--aegis-color-brand-primary-50);\n}\n\n.ghost:active:not(:disabled) {\n background-color: var(--aegis-color-brand-primary-100);\n}\n\n.danger {\n background: linear-gradient(\n 180deg,\n var(--aegis-color-error-500) 0%,\n var(--aegis-color-error-700) 100%\n );\n color: var(--aegis-color-text-inverse);\n box-shadow: var(--aegis-shadow-xs);\n}\n\n.danger:hover:not(:disabled) {\n background: var(--aegis-color-error-700);\n box-shadow: var(--aegis-shadow-sm);\n}\n\n.danger:active:not(:disabled) {\n background: #7A2020;\n box-shadow: var(--aegis-shadow-inset-xs);\n}\n\n/* Full width */\n.fullWidth {\n width: 100%;\n}\n\n/* Loading */\n.loading .label {\n opacity: var(--aegis-opacity-subtle);\n}\n\n.spinner {\n display: inline-flex;\n animation: aegis-spin 0.8s linear infinite;\n}\n\n.iconLeft,\n.iconRight {\n display: inline-flex;\n flex-shrink: 0;\n}\n\n@keyframes aegis-spin {\n to {\n transform: rotate(360deg);\n }\n}\n","import { forwardRef, type ButtonHTMLAttributes, type ReactNode } from 'react';\nimport { cn } from '../../utils/cn';\nimport styles from './IconButton.module.css';\n\nexport interface IconButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n /** Accessible label (required — icon-only buttons need text for screen readers) */\n 'aria-label': string;\n /** The icon element */\n icon: ReactNode;\n /** Visual variant */\n variant?: 'primary' | 'secondary' | 'ghost' | 'danger';\n /** Size */\n size?: 'sm' | 'md' | 'lg';\n}\n\n/**\n * IconButton — icon-only interactive button.\n *\n * Accessibility:\n * - aria-label is required to provide screen reader context\n * - Meets 44px minimum touch target at md/lg sizes\n */\nexport const IconButton = forwardRef<HTMLButtonElement, IconButtonProps>(\n ({ icon, variant = 'ghost', size = 'md', className, ...props }, ref) => (\n <button\n ref={ref}\n className={cn(styles.iconButton, styles[variant], styles[size], className)}\n {...props}\n >\n <span aria-hidden=\"true\">{icon}</span>\n </button>\n ),\n);\n\nIconButton.displayName = 'IconButton';\n",".iconButton {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border: var(--aegis-border-width-hairline) solid transparent;\n border-radius: var(--aegis-radius-md);\n cursor: pointer;\n transition:\n background-color var(--aegis-motion-duration-base) var(--aegis-motion-easing-standard),\n border-color var(--aegis-motion-duration-base) var(--aegis-motion-easing-standard),\n box-shadow var(--aegis-motion-duration-base) var(--aegis-motion-easing-standard),\n color var(--aegis-motion-duration-base) var(--aegis-motion-easing-standard);\n padding: 0;\n flex-shrink: 0;\n}\n\n.iconButton:focus-visible {\n outline: var(--aegis-border-width-medium) solid var(--aegis-focus-outline-color);\n outline-offset: var(--aegis-focus-ring-offset);\n box-shadow: var(--aegis-shadow-focus);\n}\n\n.iconButton:disabled {\n cursor: not-allowed;\n opacity: var(--aegis-opacity-disabled);\n}\n\n.sm {\n width: var(--aegis-size-control-sm);\n height: var(--aegis-size-control-sm);\n}\n\n.md {\n width: var(--aegis-size-control-md);\n height: var(--aegis-size-control-md);\n}\n\n.lg {\n width: var(--aegis-size-control-lg);\n height: var(--aegis-size-control-lg);\n}\n\n.primary {\n background: linear-gradient(\n 180deg,\n var(--aegis-color-brand-primary-500) 0%,\n var(--aegis-color-brand-primary-600) 100%\n );\n color: var(--aegis-color-text-inverse);\n box-shadow: var(--aegis-shadow-xs);\n}\n\n.primary:hover:not(:disabled) {\n background: linear-gradient(\n 180deg,\n var(--aegis-color-brand-primary-600) 0%,\n var(--aegis-color-brand-primary-700) 100%\n );\n box-shadow: var(--aegis-shadow-sm);\n}\n\n.primary:active:not(:disabled) {\n background: var(--aegis-color-brand-primary-700);\n box-shadow: var(--aegis-shadow-inset-xs);\n}\n\n.secondary {\n background-color: var(--aegis-color-surface-default);\n color: var(--aegis-color-text-primary);\n border-color: var(--aegis-color-border-default);\n box-shadow: var(--aegis-shadow-xs);\n}\n\n.secondary:hover:not(:disabled) {\n background-color: var(--aegis-color-surface-hover);\n border-color: var(--aegis-color-border-strong);\n box-shadow: var(--aegis-shadow-sm);\n}\n\n.secondary:active:not(:disabled) {\n background-color: var(--aegis-color-surface-active);\n box-shadow: var(--aegis-shadow-inset-xs);\n}\n\n.ghost {\n background-color: transparent;\n color: var(--aegis-color-text-secondary);\n}\n\n.ghost:hover:not(:disabled) {\n background-color: var(--aegis-color-surface-hover);\n color: var(--aegis-color-text-primary);\n}\n\n.ghost:active:not(:disabled) {\n background-color: var(--aegis-color-surface-active);\n}\n\n.danger {\n background-color: transparent;\n color: var(--aegis-color-error-500);\n}\n\n.danger:hover:not(:disabled) {\n background-color: var(--aegis-color-error-50);\n color: var(--aegis-color-error-700);\n}\n\n.danger:active:not(:disabled) {\n background-color: var(--aegis-color-error-50);\n box-shadow: var(--aegis-shadow-inset-xs);\n}\n","import { forwardRef, type InputHTMLAttributes } from 'react';\nimport { cn } from '../../utils/cn';\nimport styles from './Input.module.css';\n\nexport interface InputProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'size'> {\n /** Size of the input control */\n size?: 'sm' | 'md' | 'lg';\n /** Error state */\n error?: boolean;\n /** Full width */\n fullWidth?: boolean;\n}\n\n/**\n * Input — single-line text input.\n *\n * Accessibility:\n * - Use with <Label> and associate via htmlFor/id\n * - Use aria-describedby to link to HelperText or error messages\n * - aria-invalid signals error state to assistive technology\n * - Visible border change + color signals error (not color alone)\n */\nexport const Input = forwardRef<HTMLInputElement, InputProps>(\n ({ size = 'md', error = false, fullWidth = false, className, ...props }, ref) => (\n <input\n ref={ref}\n className={cn(\n styles.input,\n styles[size],\n error && styles.error,\n fullWidth && styles.fullWidth,\n className,\n )}\n aria-invalid={error || undefined}\n {...props}\n />\n ),\n);\n\nInput.displayName = 'Input';\n",".input {\n display: block;\n width: auto;\n border: var(--aegis-border-width-hairline) var(--aegis-border-style-default) var(--aegis-color-border-default);\n border-radius: var(--aegis-radius-md);\n background-color: var(--aegis-color-surface-default);\n color: var(--aegis-color-text-primary);\n font-family: var(--aegis-font-family-sans);\n box-shadow: var(--aegis-shadow-inset-xs);\n transition:\n border-color var(--aegis-motion-duration-base) var(--aegis-motion-easing-standard),\n box-shadow var(--aegis-motion-duration-base) var(--aegis-motion-easing-standard),\n background-color var(--aegis-motion-duration-base) var(--aegis-motion-easing-standard);\n}\n\n.input::placeholder {\n color: var(--aegis-color-text-muted);\n}\n\n.input:hover:not(:disabled):not(:focus) {\n border-color: var(--aegis-color-border-strong);\n background-color: var(--aegis-color-surface-hover);\n}\n\n.input:focus {\n outline: none;\n border-color: var(--aegis-color-brand-primary-500);\n box-shadow: var(--aegis-shadow-focus);\n background-color: var(--aegis-color-surface-default);\n}\n\n.input:disabled {\n cursor: not-allowed;\n opacity: var(--aegis-opacity-disabled);\n background-color: var(--aegis-color-surface-subtle);\n box-shadow: none;\n}\n\n/* Sizes */\n.sm {\n height: var(--aegis-size-control-sm);\n padding: 0 var(--aegis-space-3);\n font-size: var(--aegis-font-size-body-sm);\n}\n\n.md {\n height: var(--aegis-size-control-md);\n padding: 0 var(--aegis-space-4);\n font-size: var(--aegis-font-size-body-md);\n}\n\n.lg {\n height: var(--aegis-size-control-lg);\n padding: 0 var(--aegis-space-4);\n font-size: var(--aegis-font-size-body-lg);\n}\n\n/* Error */\n.error {\n border-color: var(--aegis-color-error-500);\n}\n\n.error:focus {\n border-color: var(--aegis-color-error-500);\n box-shadow: var(--aegis-shadow-focus-error);\n}\n\n/* Full width */\n.fullWidth {\n width: 100%;\n}\n","import { forwardRef, type TextareaHTMLAttributes } from 'react';\nimport { cn } from '../../utils/cn';\nimport styles from './Textarea.module.css';\n\nexport interface TextareaProps extends TextareaHTMLAttributes<HTMLTextAreaElement> {\n /** Error state */\n error?: boolean;\n /** Full width */\n fullWidth?: boolean;\n /** Allow vertical resize */\n resize?: 'none' | 'vertical' | 'both';\n}\n\n/**\n * Textarea — multi-line text input.\n *\n * Accessibility:\n * - Associate with Label via htmlFor/id\n * - Link to HelperText via aria-describedby\n */\nexport const Textarea = forwardRef<HTMLTextAreaElement, TextareaProps>(\n ({ error = false, fullWidth = false, resize = 'vertical', className, style, ...props }, ref) => (\n <textarea\n ref={ref}\n className={cn(\n styles.textarea,\n error && styles.error,\n fullWidth && styles.fullWidth,\n className,\n )}\n aria-invalid={error || undefined}\n style={{ ...style, resize }}\n {...props}\n />\n ),\n);\n\nTextarea.displayName = 'Textarea';\n",".textarea {\n display: block;\n width: auto;\n min-height: 80px;\n padding: var(--aegis-space-3) var(--aegis-space-4);\n border: var(--aegis-border-width-hairline) var(--aegis-border-style-default) var(--aegis-color-border-default);\n border-radius: var(--aegis-radius-md);\n background-color: var(--aegis-color-surface-default);\n color: var(--aegis-color-text-primary);\n font-family: var(--aegis-font-family-sans);\n font-size: var(--aegis-font-size-body-md);\n line-height: var(--aegis-line-height-body-md);\n box-shadow: var(--aegis-shadow-inset-xs);\n transition:\n border-color var(--aegis-motion-duration-base) var(--aegis-motion-easing-standard),\n box-shadow var(--aegis-motion-duration-base) var(--aegis-motion-easing-standard),\n background-color var(--aegis-motion-duration-base) var(--aegis-motion-easing-standard);\n}\n\n.textarea::placeholder {\n color: var(--aegis-color-text-muted);\n}\n\n.textarea:hover:not(:disabled):not(:focus) {\n border-color: var(--aegis-color-border-strong);\n background-color: var(--aegis-color-surface-hover);\n}\n\n.textarea:focus {\n outline: none;\n border-color: var(--aegis-color-brand-primary-500);\n box-shadow: var(--aegis-shadow-focus);\n background-color: var(--aegis-color-surface-default);\n}\n\n.textarea:disabled {\n cursor: not-allowed;\n opacity: var(--aegis-opacity-disabled);\n background-color: var(--aegis-color-surface-subtle);\n box-shadow: none;\n}\n\n.error {\n border-color: var(--aegis-color-error-500);\n}\n\n.error:focus {\n border-color: var(--aegis-color-error-500);\n box-shadow: var(--aegis-shadow-focus-error);\n}\n\n.fullWidth {\n width: 100%;\n}\n","import { forwardRef, type SelectHTMLAttributes } from 'react';\nimport { cn } from '../../utils/cn';\nimport styles from './Select.module.css';\n\nexport interface SelectProps extends Omit<SelectHTMLAttributes<HTMLSelectElement>, 'size'> {\n /** Size */\n size?: 'sm' | 'md' | 'lg';\n /** Error state */\n error?: boolean;\n /** Full width */\n fullWidth?: boolean;\n}\n\n/**\n * Select — native dropdown select.\n *\n * Accessibility:\n * - Uses native <select> for full keyboard and screen reader support\n * - Associate with Label via htmlFor/id\n * - Custom chevron is decorative (aria-hidden on the icon)\n */\nexport const Select = forwardRef<HTMLSelectElement, SelectProps>(\n ({ size = 'md', error = false, fullWidth = false, className, children, ...props }, ref) => (\n <div className={cn(styles.wrapper, fullWidth && styles.fullWidth)}>\n <select\n ref={ref}\n className={cn(\n styles.select,\n styles[size],\n error && styles.error,\n fullWidth && styles.fullWidth,\n className,\n )}\n aria-invalid={error || undefined}\n {...props}\n >\n {children}\n </select>\n <span className={styles.chevron} aria-hidden=\"true\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.75\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M4 6l4 4 4-4\" />\n </svg>\n </span>\n </div>\n ),\n);\n\nSelect.displayName = 'Select';\n",".wrapper {\n position: relative;\n display: inline-block;\n}\n\n.select {\n display: block;\n width: 100%;\n appearance: none;\n border: var(--aegis-border-width-hairline) var(--aegis-border-style-default) var(--aegis-color-border-default);\n border-radius: var(--aegis-radius-md);\n background-color: var(--aegis-color-surface-default);\n color: var(--aegis-color-text-primary);\n font-family: var(--aegis-font-family-sans);\n padding-right: var(--aegis-space-10);\n cursor: pointer;\n box-shadow: var(--aegis-shadow-inset-xs);\n transition:\n border-color var(--aegis-motion-duration-base) var(--aegis-motion-easing-standard),\n box-shadow var(--aegis-motion-duration-base) var(--aegis-motion-easing-standard),\n background-color var(--aegis-motion-duration-base) var(--aegis-motion-easing-standard);\n}\n\n.select:hover:not(:disabled) {\n border-color: var(--aegis-color-border-strong);\n background-color: var(--aegis-color-surface-hover);\n}\n\n.select:focus {\n outline: none;\n border-color: var(--aegis-color-brand-primary-500);\n box-shadow: var(--aegis-shadow-focus);\n background-color: var(--aegis-color-surface-default);\n}\n\n.select:disabled {\n cursor: not-allowed;\n opacity: var(--aegis-opacity-disabled);\n background-color: var(--aegis-color-surface-subtle);\n box-shadow: none;\n}\n\n.sm {\n height: var(--aegis-size-control-sm);\n padding-left: var(--aegis-space-3);\n font-size: var(--aegis-font-size-body-sm);\n}\n\n.md {\n height: var(--aegis-size-control-md);\n padding-left: var(--aegis-space-4);\n font-size: var(--aegis-font-size-body-md);\n}\n\n.lg {\n height: var(--aegis-size-control-lg);\n padding-left: var(--aegis-space-4);\n font-size: var(--aegis-font-size-body-lg);\n}\n\n.error {\n border-color: var(--aegis-color-error-500);\n}\n\n.error:focus {\n box-shadow: var(--aegis-shadow-focus-error);\n}\n\n.fullWidth {\n width: 100%;\n}\n\n.chevron {\n position: absolute;\n right: var(--aegis-space-3);\n top: 50%;\n transform: translateY(-50%);\n pointer-events: none;\n color: var(--aegis-color-text-muted);\n display: flex;\n}\n","import { forwardRef, type InputHTMLAttributes } from 'react';\nimport { cn } from '../../utils/cn';\nimport styles from './Checkbox.module.css';\n\nexport interface CheckboxProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'type'> {\n /** Label text displayed next to the checkbox */\n label?: string;\n /** Error state */\n error?: boolean;\n}\n\n/**\n * Checkbox — boolean toggle with label.\n *\n * Accessibility:\n * - Uses native <input type=\"checkbox\"> for full keyboard/screen reader support\n * - Checkmark is CSS-only, no JS required for visual state\n * - Label is clickable and linked to input\n * - 44px minimum touch target maintained via padding\n */\nexport const Checkbox = forwardRef<HTMLInputElement, CheckboxProps>(\n ({ label, error = false, className, id, ...props }, ref) => {\n const inputId = id || (label ? `checkbox-${label.replace(/\\s+/g, '-').toLowerCase()}` : undefined);\n\n return (\n <label className={cn(styles.wrapper, error && styles.error, className)}>\n <input\n ref={ref}\n type=\"checkbox\"\n className={styles.input}\n id={inputId}\n aria-invalid={error || undefined}\n {...props}\n />\n <span className={styles.control} aria-hidden=\"true\">\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M2.5 6L5 8.5L9.5 3.5\" />\n </svg>\n </span>\n {label && <span className={styles.label}>{label}</span>}\n </label>\n );\n },\n);\n\nCheckbox.displayName = 'Checkbox';\n",".wrapper {\n display: inline-flex;\n align-items: center;\n gap: var(--aegis-space-2);\n cursor: pointer;\n min-height: var(--aegis-size-touch-min);\n user-select: none;\n}\n\n.input {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n}\n\n.control {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 20px;\n height: 20px;\n border: var(--aegis-border-width-hairline) var(--aegis-border-style-default) var(--aegis-color-border-default);\n border-radius: var(--aegis-radius-sm);\n background-color: var(--aegis-color-surface-default);\n color: transparent;\n flex-shrink: 0;\n box-shadow: var(--aegis-shadow-inset-xs);\n transition:\n background-color var(--aegis-motion-duration-base) var(--aegis-motion-easing-standard),\n border-color var(--aegis-motion-duration-base) var(--aegis-motion-easing-standard),\n color var(--aegis-motion-duration-base) var(--aegis-motion-easing-standard),\n box-shadow var(--aegis-motion-duration-base) var(--aegis-motion-easing-standard);\n}\n\n.wrapper:hover .control {\n border-color: var(--aegis-color-border-strong);\n background-color: var(--aegis-color-surface-hover);\n}\n\n.input:checked + .control {\n background: linear-gradient(\n 180deg,\n var(--aegis-color-brand-primary-500) 0%,\n var(--aegis-color-brand-primary-600) 100%\n );\n border-color: var(--aegis-color-brand-primary-600);\n color: var(--aegis-color-text-inverse);\n box-shadow: var(--aegis-shadow-xs);\n}\n\n.input:focus-visible + .control {\n outline: var(--aegis-border-width-medium) solid var(--aegis-focus-outline-color);\n outline-offset: var(--aegis-focus-ring-offset);\n box-shadow: var(--aegis-shadow-focus);\n}\n\n.input:disabled + .control {\n opacity: var(--aegis-opacity-disabled);\n cursor: not-allowed;\n}\n\n.input:disabled ~ .label {\n opacity: var(--aegis-opacity-disabled);\n cursor: not-allowed;\n}\n\n.label {\n font-family: var(--aegis-font-family-sans);\n font-size: var(--aegis-font-size-body-md);\n line-height: var(--aegis-line-height-body-md);\n color: var(--aegis-color-text-primary);\n}\n\n.error .control {\n border-color: var(--aegis-color-error-500);\n}\n","import { forwardRef, type InputHTMLAttributes } from 'react';\nimport { cn } from '../../utils/cn';\nimport styles from './Radio.module.css';\n\nexport interface RadioProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'type'> {\n /** Label text */\n label?: string;\n /** Error state */\n error?: boolean;\n}\n\n/**\n * Radio — single-selection option within a group.\n *\n * Accessibility:\n * - Uses native <input type=\"radio\">\n * - Wrap multiple Radios in a fieldset with legend for group labeling\n * - Arrow keys navigate between radios within the same name group\n */\nexport const Radio = forwardRef<HTMLInputElement, RadioProps>(\n ({ label, error = false, className, id, ...props }, ref) => {\n const inputId = id || (label ? `radio-${label.replace(/\\s+/g, '-').toLowerCase()}` : undefined);\n\n return (\n <label className={cn(styles.wrapper, error && styles.error, className)}>\n <input\n ref={ref}\n type=\"radio\"\n className={styles.input}\n id={inputId}\n aria-invalid={error || undefined}\n {...props}\n />\n <span className={styles.control} aria-hidden=\"true\">\n <span className={styles.dot} />\n </span>\n {label && <span className={styles.label}>{label}</span>}\n </label>\n );\n },\n);\n\nRadio.displayName = 'Radio';\n",".wrapper {\n display: inline-flex;\n align-items: center;\n gap: var(--aegis-space-2);\n cursor: pointer;\n min-height: var(--aegis-size-touch-min);\n user-select: none;\n}\n\n.input {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n}\n\n.control {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 20px;\n height: 20px;\n border: var(--aegis-border-width-hairline) var(--aegis-border-style-default) var(--aegis-color-border-default);\n border-radius: var(--aegis-radius-full);\n background-color: var(--aegis-color-surface-default);\n flex-shrink: 0;\n box-shadow: var(--aegis-shadow-inset-xs);\n transition:\n border-color var(--aegis-motion-duration-base) var(--aegis-motion-easing-standard),\n background-color var(--aegis-motion-duration-base) var(--aegis-motion-easing-standard),\n box-shadow var(--aegis-motion-duration-base) var(--aegis-motion-easing-standard);\n}\n\n.dot {\n width: 8px;\n height: 8px;\n border-radius: var(--aegis-radius-full);\n background-color: transparent;\n transition:\n background-color var(--aegis-motion-duration-base) var(--aegis-motion-easing-standard),\n transform var(--aegis-motion-duration-base) var(--aegis-motion-easing-standard);\n transform: scale(0);\n}\n\n.wrapper:hover .control {\n border-color: var(--aegis-color-border-strong);\n background-color: var(--aegis-color-surface-hover);\n}\n\n.input:checked + .control {\n border-color: var(--aegis-color-brand-primary-500);\n background-color: var(--aegis-color-surface-default);\n box-shadow: var(--aegis-shadow-xs);\n}\n\n.input:checked + .control .dot {\n background-color: var(--aegis-color-brand-primary-500);\n transform: scale(1);\n}\n\n.input:focus-visible + .control {\n outline: var(--aegis-border-width-medium) solid var(--aegis-focus-outline-color);\n outline-offset: var(--aegis-focus-ring-offset);\n box-shadow: var(--aegis-shadow-focus);\n}\n\n.input:disabled + .control {\n opacity: var(--aegis-opacity-disabled);\n cursor: not-allowed;\n}\n\n.input:disabled ~ .label {\n opacity: var(--aegis-opacity-disabled);\n cursor: not-allowed;\n}\n\n.label {\n font-family: var(--aegis-font-family-sans);\n font-size: var(--aegis-font-size-body-md);\n line-height: var(--aegis-line-height-body-md);\n color: var(--aegis-color-text-primary);\n}\n\n.error .control {\n border-color: var(--aegis-color-error-500);\n}\n","import { forwardRef, type InputHTMLAttributes } from 'react';\nimport { cn } from '../../utils/cn';\nimport styles from './Switch.module.css';\n\nexport interface SwitchProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'type'> {\n /** Label text */\n label?: string;\n}\n\n/**\n * Switch — on/off toggle control.\n *\n * Accessibility:\n * - Uses role=\"switch\" with native checkbox for AT support\n * - aria-checked reflects state\n * - Label is clickable and linked\n * - Healthcare note: use for non-critical preferences only.\n * For high-risk toggles (e.g., medication alerts), prefer explicit\n * confirmation patterns instead.\n */\nexport const Switch = forwardRef<HTMLInputElement, SwitchProps>(\n ({ label, className, checked, defaultChecked, ...props }, ref) => (\n <label className={cn(styles.wrapper, className)}>\n <input\n ref={ref}\n type=\"checkbox\"\n role=\"switch\"\n className={styles.input}\n checked={checked}\n defaultChecked={defaultChecked}\n aria-checked={checked}\n {...props}\n />\n <span className={styles.track} aria-hidden=\"true\">\n <span className={styles.thumb} />\n </span>\n {label && <span className={styles.label}>{label}</span>}\n </label>\n ),\n);\n\nSwitch.displayName = 'Switch';\n",".wrapper {\n display: inline-flex;\n align-items: center;\n gap: var(--aegis-space-3);\n cursor: pointer;\n min-height: var(--aegis-size-touch-min);\n user-select: none;\n}\n\n.input {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n}\n\n.track {\n position: relative;\n width: 44px;\n height: 24px;\n border-radius: var(--aegis-radius-full);\n background-color: var(--aegis-color-neutral-300);\n flex-shrink: 0;\n box-shadow: var(--aegis-shadow-inset-sm);\n transition:\n background-color var(--aegis-motion-duration-base) var(--aegis-motion-easing-standard),\n box-shadow var(--aegis-motion-duration-base) var(--aegis-motion-easing-standard);\n}\n\n.thumb {\n position: absolute;\n top: 2px;\n left: 2px;\n width: 20px;\n height: 20px;\n border-radius: var(--aegis-radius-full);\n background-color: var(--aegis-color-surface-default);\n box-shadow: var(--aegis-shadow-sm);\n transition:\n transform var(--aegis-motion-duration-base) var(--aegis-motion-easing-standard),\n box-shadow var(--aegis-motion-duration-base) var(--aegis-motion-easing-standard);\n}\n\n.input:checked + .track {\n background: linear-gradient(\n 180deg,\n var(--aegis-color-brand-primary-500) 0%,\n var(--aegis-color-brand-primary-600) 100%\n );\n box-shadow: var(--aegis-shadow-inset-xs);\n}\n\n.input:checked + .track .thumb {\n transform: translateX(20px);\n box-shadow: var(--aegis-shadow-md);\n}\n\n.input:focus-visible + .track {\n outline: var(--aegis-border-width-medium) solid var(--aegis-focus-outline-color);\n outline-offset: var(--aegis-focus-ring-offset);\n box-shadow: var(--aegis-shadow-focus);\n}\n\n.input:disabled + .track {\n opacity: var(--aegis-opacity-disabled);\n cursor: not-allowed;\n}\n\n.input:disabled ~ .label {\n opacity: var(--aegis-opacity-disabled);\n cursor: not-allowed;\n}\n\n.label {\n font-family: var(--aegis-font-family-sans);\n font-size: var(--aegis-font-size-body-md);\n line-height: var(--aegis-line-height-body-md);\n color: var(--aegis-color-text-primary);\n}\n",".label {\n display: block;\n font-family: var(--aegis-font-family-sans);\n font-size: var(--aegis-font-size-label-lg);\n font-weight: var(--aegis-font-weight-medium);\n line-height: var(--aegis-line-height-label-lg);\n color: var(--aegis-color-text-primary);\n margin-bottom: var(--aegis-space-1);\n}\n\n.required {\n color: var(--aegis-color-error-500);\n}\n\n.srOnly {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n}\n","import { type LabelHTMLAttributes } from 'react';\nimport { cn } from '../../utils/cn';\nimport styles from './Label.module.css';\n\nexport interface LabelProps extends LabelHTMLAttributes<HTMLLabelElement> {\n /** Mark the field as required — adds visual indicator */\n required?: boolean;\n}\n\n/**\n * Label — form field label.\n *\n * Accessibility:\n * - Always associate with an input via htmlFor\n * - Required indicator uses both visual (*) and sr-only text\n */\nexport function Label({ required, className, children, ...props }: LabelProps) {\n return (\n <label className={cn(styles.label, className)} {...props}>\n {children}\n {required && (\n <>\n <span className={styles.required} aria-hidden=\"true\"> *</span>\n <span className={styles.srOnly}> (required)</span>\n </>\n )}\n </label>\n );\n}\n",".helperText {\n display: flex;\n align-items: flex-start;\n gap: var(--aegis-space-1);\n margin: var(--aegis-space-1) 0 0;\n font-family: var(--aegis-font-family-sans);\n font-size: var(--aegis-font-size-body-sm);\n line-height: var(--aegis-line-height-body-sm);\n color: var(--aegis-color-text-muted);\n}\n\n.error {\n color: var(--aegis-color-error-500);\n}\n\n.icon {\n flex-shrink: 0;\n margin-top: 3px;\n}\n","import { type HTMLAttributes } from 'react';\nimport { cn } from '../../utils/cn';\nimport styles from './HelperText.module.css';\n\nexport interface HelperTextProps extends HTMLAttributes<HTMLParagraphElement> {\n /** Render as error message */\n error?: boolean;\n}\n\n/**\n * HelperText — descriptive or error text beneath a form field.\n *\n * Accessibility:\n * - Link to input via aria-describedby on the input, matching this element's id\n * - Error messages use role=\"alert\" for immediate screen reader announcement\n * - Error state uses both color and icon (not color alone)\n */\nexport function HelperText({ error = false, className, children, ...props }: HelperTextProps) {\n return (\n <p\n className={cn(styles.helperText, error && styles.error, className)}\n role={error ? 'alert' : undefined}\n {...props}\n >\n {error && (\n <svg className={styles.icon} width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M7 0a7 7 0 110 14A7 7 0 017 0zm0 9.5a.75.75 0 100 1.5.75.75 0 000-1.5zM7 3a.75.75 0 00-.75.75v4a.75.75 0 001.5 0v-4A.75.75 0 007 3z\" />\n </svg>\n )}\n {children}\n </p>\n );\n}\n",".card {\n border-radius: var(--aegis-radius-lg);\n background-color: var(--aegis-color-surface-default);\n border: var(--aegis-border-width-hairline) var(--aegis-border-style-default) var(--aegis-color-border-default);\n transition: box-shadow var(--aegis-motion-duration-base) var(--aegis-motion-easing-standard);\n}\n\n/* Elevation */\n.flat {\n box-shadow: var(--aegis-shadow-none);\n}\n\n.raised {\n box-shadow: var(--aegis-shadow-sm);\n border-bottom: var(--aegis-border-width-medium) var(--aegis-border-style-default) var(--aegis-color-border-subtle);\n}\n\n.elevated {\n box-shadow: var(--aegis-shadow-md);\n border-color: var(--aegis-color-border-subtle);\n border-bottom: var(--aegis-border-width-medium) var(--aegis-border-style-default) var(--aegis-color-border-default);\n}\n\n/* Padding */\n.pad-none { padding: 0; }\n.pad-sm { padding: var(--aegis-space-4); }\n.pad-md { padding: var(--aegis-space-6); }\n.pad-lg { padding: var(--aegis-space-8); }\n","import { type HTMLAttributes } from 'react';\nimport { cn } from '../../utils/cn';\nimport styles from './Card.module.css';\n\nexport interface CardProps extends HTMLAttributes<HTMLDivElement> {\n /** Elevation level */\n elevation?: 'flat' | 'raised';\n /** Padding size */\n padding?: 'none' | 'sm' | 'md' | 'lg';\n}\n\n/**\n * Card — surface container for grouping related content.\n *\n * Accessibility:\n * - Uses semantic HTML; add role=\"region\" + aria-label when card\n * represents a distinct content section\n * - Border provides separation independent of shadow (not shadow alone)\n */\nexport function Card({ elevation = 'flat', padding = 'md', className, children, ...props }: CardProps) {\n return (\n <div\n className={cn(styles.card, styles[elevation], styles[`pad-${padding}`], className)}\n {...props}\n >\n {children}\n </div>\n );\n}\n",".badge {\n display: inline-flex;\n align-items: center;\n gap: var(--aegis-space-1);\n padding: 2px var(--aegis-space-2);\n border-radius: var(--aegis-radius-full);\n font-family: var(--aegis-font-family-sans);\n font-size: var(--aegis-font-size-caption);\n font-weight: var(--aegis-font-weight-semibold);\n line-height: var(--aegis-line-height-caption);\n white-space: nowrap;\n}\n\n.neutral {\n background-color: var(--aegis-color-neutral-100);\n color: var(--aegis-color-text-secondary);\n border: var(--aegis-border-width-hairline) var(--aegis-border-style-default) var(--aegis-color-neutral-200);\n}\n\n.success {\n background-color: var(--aegis-color-success-50);\n color: var(--aegis-color-success-700);\n border: var(--aegis-border-width-hairline) var(--aegis-border-style-default) var(--aegis-color-border-success);\n}\n\n.warning {\n background-color: var(--aegis-color-warning-50);\n color: var(--aegis-color-warning-700);\n border: var(--aegis-border-width-hairline) var(--aegis-border-style-default) var(--aegis-color-border-warning);\n}\n\n.error {\n background-color: var(--aegis-color-error-50);\n color: var(--aegis-color-error-700);\n border: var(--aegis-border-width-hairline) var(--aegis-border-style-default) var(--aegis-color-border-error);\n}\n\n.info {\n background-color: var(--aegis-color-info-50);\n color: var(--aegis-color-info-700);\n border: var(--aegis-border-width-hairline) var(--aegis-border-style-default) var(--aegis-color-border-brand);\n}\n","import { type HTMLAttributes } from 'react';\nimport { cn } from '../../utils/cn';\nimport styles from './Badge.module.css';\n\nexport interface BadgeProps extends HTMLAttributes<HTMLSpanElement> {\n /** Status variant */\n status?: 'neutral' | 'success' | 'warning' | 'error' | 'info';\n}\n\n/**\n * Badge / StatusChip — small label for status or metadata.\n *\n * Accessibility:\n * - Always include meaningful text content (not color alone)\n * - In healthcare contexts, pair with text like \"Active\", \"Pending\",\n * \"Critical\" rather than relying on color to communicate status\n */\nexport function Badge({ status = 'neutral', className, children, ...props }: BadgeProps) {\n return (\n <span className={cn(styles.badge, styles[status], className)} {...props}>\n {children}\n </span>\n );\n}\n",".alert {\n display: flex;\n align-items: flex-start;\n gap: var(--aegis-space-3);\n padding: var(--aegis-space-4);\n border-radius: var(--aegis-radius-md);\n border: var(--aegis-border-width-hairline) var(--aegis-border-style-default) transparent;\n border-left: var(--aegis-border-width-strong) var(--aegis-border-style-default) transparent;\n font-family: var(--aegis-font-family-sans);\n box-shadow: var(--aegis-shadow-xs);\n}\n\n.icon {\n flex-shrink: 0;\n display: flex;\n margin-top: 1px;\n}\n\n.content {\n flex: 1;\n min-width: 0;\n}\n\n.title {\n margin: 0;\n font-size: var(--aegis-font-size-body-md);\n font-weight: var(--aegis-font-weight-semibold);\n line-height: var(--aegis-line-height-body-md);\n}\n\n.body {\n font-size: var(--aegis-font-size-body-sm);\n line-height: var(--aegis-line-height-body-sm);\n margin-top: var(--aegis-space-1);\n}\n\n.action {\n flex-shrink: 0;\n}\n\n/* Status variants */\n.info {\n background-color: var(--aegis-color-info-50);\n border-color: var(--aegis-color-info-500);\n border-left-color: var(--aegis-color-border-brand);\n color: var(--aegis-color-info-700);\n}\n\n.success {\n background-color: var(--aegis-color-success-50);\n border-color: var(--aegis-color-success-500);\n border-left-color: var(--aegis-color-border-success);\n color: var(--aegis-color-success-700);\n}\n\n.warning {\n background-color: var(--aegis-color-warning-50);\n border-color: var(--aegis-color-warning-500);\n border-left-color: var(--aegis-color-border-warning);\n color: var(--aegis-color-warning-700);\n}\n\n.error {\n background-color: var(--aegis-color-error-50);\n border-color: var(--aegis-color-error-500);\n border-left-color: var(--aegis-color-border-error);\n color: var(--aegis-color-error-700);\n}\n","import { type HTMLAttributes, type ReactNode } from 'react';\nimport { cn } from '../../utils/cn';\nimport styles from './Alert.module.css';\n\nexport interface AlertProps extends HTMLAttributes<HTMLDivElement> {\n /** Semantic status */\n status?: 'info' | 'success' | 'warning' | 'error';\n /** Optional title */\n title?: string;\n /** Optional action element (e.g., a close button) */\n action?: ReactNode;\n}\n\nconst statusIcons: Record<string, ReactNode> = {\n info: (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path d=\"M10 0a10 10 0 110 20 10 10 0 010-20zm0 8a1 1 0 00-1 1v5a1 1 0 102 0V9a1 1 0 00-1-1zm0-3.5a1 1 0 100 2 1 1 0 000-2z\" />\n </svg>\n ),\n success: (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path d=\"M10 0a10 10 0 110 20 10 10 0 010-20zm4.3 7.3a1 1 0 00-1.4-1.4L8.5 10.3 7.1 8.9a1 1 0 10-1.4 1.4l2.1 2.1a1 1 0 001.4 0l5.1-5.1z\" />\n </svg>\n ),\n warning: (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path d=\"M10 0a10 10 0 110 20 10 10 0 010-20zm0 13a1 1 0 100 2 1 1 0 000-2zm0-8a1 1 0 00-1 1v4a1 1 0 102 0V6a1 1 0 00-1-1z\" />\n </svg>\n ),\n error: (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path d=\"M10 0a10 10 0 110 20 10 10 0 010-20zm3.5 6.5a1 1 0 00-1.4 0L10 8.6 7.9 6.5a1 1 0 10-1.4 1.4L8.6 10l-2.1 2.1a1 1 0 101.4 1.4L10 11.4l2.1 2.1a1 1 0 001.4-1.4L11.4 10l2.1-2.1a1 1 0 000-1.4z\" />\n </svg>\n ),\n};\n\n/**\n * Alert — contextual message banner.\n *\n * Accessibility:\n * - Uses role=\"alert\" for errors/warnings (live region, immediately announced)\n * - Uses role=\"status\" for info/success (polite announcement)\n * - Icon + color + text ensures meaning is communicated multiple ways\n */\nexport function Alert({ status = 'info', title, action, className, children, ...props }: AlertProps) {\n const isUrgent = status === 'error' || status === 'warning';\n\n return (\n <div\n className={cn(styles.alert, styles[status], className)}\n role={isUrgent ? 'alert' : 'status'}\n {...props}\n >\n <span className={styles.icon} aria-hidden=\"true\">{statusIcons[status]}</span>\n <div className={styles.content}>\n {title && <p className={styles.title}>{title}</p>}\n {children && <div className={styles.body}>{children}</div>}\n </div>\n {action && <div className={styles.action}>{action}</div>}\n </div>\n );\n}\n","import { useState, useRef, useCallback, type ReactNode, type KeyboardEvent } from 'react';\nimport { cn } from '../../utils/cn';\nimport styles from './Tabs.module.css';\n\nexport interface Tab {\n id: string;\n label: string;\n content: ReactNode;\n disabled?: boolean;\n}\n\nexport interface TabsProps {\n /** Tab definitions */\n tabs: Tab[];\n /** Controlled active tab id */\n activeTab?: string;\n /** Callback when tab changes */\n onTabChange?: (id: string) => void;\n /** Additional className for the wrapper */\n className?: string;\n}\n\n/**\n * Tabs — tabbed interface for switching between content panels.\n *\n * Accessibility:\n * - Full WAI-ARIA tabs pattern: role=\"tablist\", role=\"tab\", role=\"tabpanel\"\n * - Arrow key navigation between tabs\n * - Home/End keys jump to first/last tab\n * - aria-selected, aria-controls, aria-labelledby for AT relationships\n * - Only active panel is in the tab order (tabIndex=0 on active tab)\n */\nexport function Tabs({ tabs, activeTab, onTabChange, className }: TabsProps) {\n const [internalActive, setInternalActive] = useState(tabs[0]?.id ?? '');\n const tabListRef = useRef<HTMLDivElement>(null);\n\n const active = activeTab ?? internalActive;\n\n const setActive = useCallback(\n (id: string) => {\n if (!activeTab) setInternalActive(id);\n onTabChange?.(id);\n },\n [activeTab, onTabChange],\n );\n\n const enabledTabs = tabs.filter((t) => !t.disabled);\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent) => {\n const currentIndex = enabledTabs.findIndex((t) => t.id === active);\n let nextIndex = currentIndex;\n\n switch (e.key) {\n case 'ArrowRight':\n nextIndex = (currentIndex + 1) % enabledTabs.length;\n break;\n case 'ArrowLeft':\n nextIndex = (currentIndex - 1 + enabledTabs.length) % enabledTabs.length;\n break;\n case 'Home':\n nextIndex = 0;\n break;\n case 'End':\n nextIndex = enabledTabs.length - 1;\n break;\n default:\n return;\n }\n\n e.preventDefault();\n const nextTab = enabledTabs[nextIndex];\n setActive(nextTab.id);\n\n const button = tabListRef.current?.querySelector(`[data-tab-id=\"${nextTab.id}\"]`) as HTMLElement;\n button?.focus();\n },\n [active, enabledTabs, setActive],\n );\n\n const activePanel = tabs.find((t) => t.id === active);\n\n return (\n <div className={cn(styles.wrapper, className)}>\n <div\n ref={tabListRef}\n role=\"tablist\"\n className={styles.tabList}\n onKeyDown={handleKeyDown}\n >\n {tabs.map((tab) => (\n <button\n key={tab.id}\n role=\"tab\"\n data-tab-id={tab.id}\n id={`tab-${tab.id}`}\n className={cn(styles.tab, tab.id === active && styles.active)}\n aria-selected={tab.id === active}\n aria-controls={`panel-${tab.id}`}\n tabIndex={tab.id === active ? 0 : -1}\n disabled={tab.disabled}\n onClick={() => setActive(tab.id)}\n >\n {tab.label}\n </button>\n ))}\n </div>\n {activePanel && (\n <div\n key={activePanel.id}\n role=\"tabpanel\"\n id={`panel-${activePanel.id}`}\n aria-labelledby={`tab-${activePanel.id}`}\n className={styles.panel}\n tabIndex={0}\n >\n {activePanel.content}\n </div>\n )}\n </div>\n );\n}\n",".wrapper {\n width: 100%;\n}\n\n.tabList {\n display: flex;\n gap: 0;\n border-bottom: var(--aegis-border-width-hairline) var(--aegis-border-style-default) var(--aegis-color-border-default);\n}\n\n.tab {\n position: relative;\n padding: var(--aegis-space-3) var(--aegis-space-4);\n background: transparent;\n border: none;\n border-bottom: var(--aegis-border-width-medium) solid transparent;\n margin-bottom: calc(-1 * var(--aegis-border-width-hairline));\n font-family: var(--aegis-font-family-sans);\n font-size: var(--aegis-font-size-label-md);\n font-weight: var(--aegis-font-weight-medium);\n color: var(--aegis-color-text-muted);\n cursor: pointer;\n white-space: nowrap;\n transition:\n color var(--aegis-motion-duration-base) var(--aegis-motion-easing-standard),\n border-color var(--aegis-motion-duration-base) var(--aegis-motion-easing-standard),\n background-color var(--aegis-motion-duration-base) var(--aegis-motion-easing-standard);\n}\n\n.tab:hover:not(:disabled) {\n color: var(--aegis-color-text-primary);\n background-color: var(--aegis-color-surface-hover);\n}\n\n.tab:focus-visible {\n outline: var(--aegis-border-width-medium) solid var(--aegis-focus-outline-color);\n outline-offset: calc(-1 * var(--aegis-border-width-medium));\n box-shadow: var(--aegis-shadow-focus);\n border-radius: var(--aegis-radius-sm) var(--aegis-radius-sm) 0 0;\n}\n\n.tab:disabled {\n opacity: var(--aegis-opacity-disabled);\n cursor: not-allowed;\n}\n\n.active {\n color: var(--aegis-color-brand-primary-500);\n border-bottom-color: var(--aegis-color-brand-primary-500);\n font-weight: var(--aegis-font-weight-semibold);\n}\n\n.active:hover:not(:disabled) {\n color: var(--aegis-color-brand-primary-600);\n background-color: transparent;\n}\n\n.panel {\n padding: var(--aegis-space-4) 0;\n}\n\n.panel:focus {\n outline: none;\n}\n","import { useEffect, useRef, type ReactNode } from 'react';\nimport { cn } from '../../utils/cn';\nimport styles from './Modal.module.css';\n\nexport interface ModalProps {\n /** Additional className */\n className?: string;\n /** Whether the modal is visible */\n open: boolean;\n /** Called when the modal should close */\n onClose: () => void;\n /** Modal title (rendered in header) */\n title: ReactNode;\n /** Max width */\n size?: 'sm' | 'md' | 'lg' | 'xl';\n /** Footer actions */\n footer?: ReactNode;\n}\n\n/**\n * Modal / Dialog — overlay dialog for focused interactions.\n *\n * Accessibility:\n * - Uses native <dialog> element for built-in focus trapping and Escape handling\n * - aria-labelledby links to the title\n * - Focus is moved into the dialog on open\n * - Escape key closes the dialog\n * - Scrim click closes the dialog\n * - Healthcare note: for destructive actions (e.g., cancel appointment,\n * delete record), always include clear confirmation language in the\n * dialog and use danger-variant buttons\n */\nexport function Modal({ open, onClose, title, size = 'md', footer, className, children }: ModalProps & { children?: ReactNode }) {\n const dialogRef = useRef<HTMLDialogElement>(null);\n\n useEffect(() => {\n const dialog = dialogRef.current;\n if (!dialog) return;\n\n if (open && !dialog.open) {\n dialog.showModal();\n } else if (!open && dialog.open) {\n dialog.close();\n }\n }, [open]);\n\n useEffect(() => {\n const dialog = dialogRef.current;\n if (!dialog) return;\n\n const handleClose = () => onClose();\n dialog.addEventListener('close', handleClose);\n return () => dialog.removeEventListener('close', handleClose);\n }, [onClose]);\n\n const handleBackdropClick = (e: React.MouseEvent<HTMLDialogElement>) => {\n if (e.target === dialogRef.current) {\n onClose();\n }\n };\n\n return (\n <dialog\n ref={dialogRef}\n className={cn(styles.dialog, styles[size], className)}\n aria-labelledby=\"aegis-modal-title\"\n onClick={handleBackdropClick}\n >\n <div className={styles.content}>\n <header className={styles.header}>\n <h2 id=\"aegis-modal-title\" className={styles.title}>{title}</h2>\n <button\n className={styles.close}\n onClick={onClose}\n aria-label=\"Close dialog\"\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.75\" strokeLinecap=\"round\">\n <line x1=\"5\" y1=\"5\" x2=\"15\" y2=\"15\" />\n <line x1=\"15\" y1=\"5\" x2=\"5\" y2=\"15\" />\n </svg>\n </button>\n </header>\n <div className={styles.body}>{children}</div>\n {footer && <footer className={styles.footer}>{footer}</footer>}\n </div>\n </dialog>\n );\n}\n",".dialog {\n border: none;\n border-radius: var(--aegis-radius-xl);\n padding: 0;\n box-shadow: var(--aegis-shadow-xl);\n background-color: var(--aegis-color-surface-overlay);\n max-height: 85vh;\n display: flex;\n flex-direction: column;\n}\n\n.dialog::backdrop {\n background-color: var(--aegis-color-overlay-scrim);\n animation: aegis-backdrop-in var(--aegis-motion-duration-slow) var(--aegis-motion-easing-standard);\n}\n\n.dialog[open] {\n animation: aegis-modal-in var(--aegis-motion-duration-slow) var(--aegis-motion-easing-standard);\n}\n\n/* Sizes */\n.sm { width: var(--aegis-size-modal-sm); max-width: 90vw; }\n.md { width: var(--aegis-size-modal-md); max-width: 90vw; }\n.lg { width: var(--aegis-size-modal-lg); max-width: 90vw; }\n.xl { width: var(--aegis-size-modal-xl); max-width: 90vw; }\n\n.content {\n display: flex;\n flex-direction: column;\n max-height: 85vh;\n}\n\n.header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: var(--aegis-space-6) var(--aegis-space-6) var(--aegis-space-4);\n flex-shrink: 0;\n border-bottom: var(--aegis-border-width-hairline) var(--aegis-border-style-default) var(--aegis-color-border-subtle);\n}\n\n.title {\n margin: 0;\n font-family: var(--aegis-font-family-sans);\n font-size: var(--aegis-font-size-heading-md);\n font-weight: var(--aegis-font-weight-semibold);\n line-height: var(--aegis-line-height-heading-md);\n color: var(--aegis-color-text-primary);\n}\n\n.close {\n display: flex;\n align-items: center;\n justify-content: center;\n width: var(--aegis-size-control-sm);\n height: var(--aegis-size-control-sm);\n border: none;\n border-radius: var(--aegis-radius-md);\n background: transparent;\n color: var(--aegis-color-text-muted);\n cursor: pointer;\n flex-shrink: 0;\n transition:\n background-color var(--aegis-motion-duration-fast) var(--aegis-motion-easing-standard),\n color var(--aegis-motion-duration-fast) var(--aegis-motion-easing-standard);\n}\n\n.close:hover {\n background-color: var(--aegis-color-surface-hover);\n color: var(--aegis-color-text-primary);\n}\n\n.close:focus-visible {\n outline: var(--aegis-border-width-medium) solid var(--aegis-focus-outline-color);\n outline-offset: var(--aegis-focus-ring-offset);\n box-shadow: var(--aegis-shadow-focus);\n}\n\n.body {\n padding: 0 var(--aegis-space-6);\n overflow-y: auto;\n flex: 1;\n font-family: var(--aegis-font-family-sans);\n font-size: var(--aegis-font-size-body-md);\n line-height: var(--aegis-line-height-body-md);\n color: var(--aegis-color-text-secondary);\n}\n\n.footer {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: var(--aegis-space-3);\n padding: var(--aegis-space-4) var(--aegis-space-6) var(--aegis-space-6);\n flex-shrink: 0;\n border-top: var(--aegis-border-width-hairline) var(--aegis-border-style-default) var(--aegis-color-border-subtle);\n}\n\n@keyframes aegis-modal-in {\n from {\n opacity: 0;\n transform: translateY(8px) scale(0.98);\n }\n to {\n opacity: 1;\n transform: translateY(0) scale(1);\n }\n}\n\n@keyframes aegis-backdrop-in {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n",".wrapper {\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n}\n\n.table {\n width: 100%;\n border-collapse: collapse;\n font-family: var(--aegis-font-family-sans);\n font-size: var(--aegis-font-size-body-md);\n line-height: var(--aegis-line-height-body-md);\n color: var(--aegis-color-text-primary);\n}\n\n.thead {\n border-bottom: var(--aegis-border-width-hairline) var(--aegis-border-style-default) var(--aegis-color-border-default);\n background-color: var(--aegis-color-surface-subtle);\n}\n\n.th {\n text-align: left;\n font-weight: var(--aegis-font-weight-medium);\n font-size: var(--aegis-font-size-label-md);\n color: var(--aegis-color-text-secondary);\n white-space: nowrap;\n}\n\n.td {\n border-bottom: var(--aegis-border-width-hairline) var(--aegis-border-style-default) var(--aegis-color-border-subtle);\n transition: background-color var(--aegis-motion-duration-fast) var(--aegis-motion-easing-standard);\n}\n\n/* Density: default */\n.default .th,\n.default .td {\n padding: var(--aegis-space-3) var(--aegis-space-4);\n height: var(--aegis-size-control-lg);\n}\n\n/* Density: compact */\n.compact .th,\n.compact .td {\n padding: var(--aegis-space-2) var(--aegis-space-3);\n height: var(--aegis-size-control-sm);\n font-size: var(--aegis-font-size-body-sm);\n}\n\n/* Striped rows */\n.striped .tbody .tr:nth-child(even) {\n background-color: var(--aegis-color-neutral-50);\n}\n\n/* Hover */\n.tbody .tr:hover {\n background-color: var(--aegis-color-surface-hover);\n}\n\n/* Selected row */\n.tbody .tr.selected {\n background-color: var(--aegis-color-surface-selected);\n}\n\n.tbody .tr.selected:hover {\n background-color: var(--aegis-color-surface-selected-hover);\n}\n","import { type TableHTMLAttributes, type ThHTMLAttributes, type TdHTMLAttributes, type HTMLAttributes } from 'react';\nimport { cn } from '../../utils/cn';\nimport styles from './Table.module.css';\n\nexport interface TableProps extends TableHTMLAttributes<HTMLTableElement> {\n /** Compact density for admin/operational views */\n density?: 'default' | 'compact';\n /** Striped rows for scan-ability */\n striped?: boolean;\n}\n\n/**\n * Table — data table with accessible defaults.\n *\n * Accessibility:\n * - Semantic <table> / <thead> / <tbody> / <th> structure\n * - Use scope=\"col\" on header cells\n * - For complex tables, use aria-describedby to link to a caption\n * - Healthcare note: clinical data tables should use tabular numerals\n * (monospace) and adequate row height for readability under stress\n */\nexport function Table({ density = 'default', striped = false, className, children, ...props }: TableProps) {\n return (\n <div className={styles.wrapper}>\n <table\n className={cn(styles.table, styles[density], striped && styles.striped, className)}\n {...props}\n >\n {children}\n </table>\n </div>\n );\n}\n\nexport function TableHead({ className, children, ...props }: HTMLAttributes<HTMLTableSectionElement>) {\n return <thead className={cn(styles.thead, className)} {...props}>{children}</thead>;\n}\n\nexport function TableBody({ className, children, ...props }: HTMLAttributes<HTMLTableSectionElement>) {\n return <tbody className={cn(styles.tbody, className)} {...props}>{children}</tbody>;\n}\n\nexport function TableRow({ className, children, ...props }: HTMLAttributes<HTMLTableRowElement>) {\n return <tr className={cn(styles.tr, className)} {...props}>{children}</tr>;\n}\n\nexport function TableHeaderCell({ className, children, ...props }: ThHTMLAttributes<HTMLTableCellElement>) {\n return <th scope=\"col\" className={cn(styles.th, className)} {...props}>{children}</th>;\n}\n\nexport function TableCell({ className, children, ...props }: TdHTMLAttributes<HTMLTableCellElement>) {\n return <td className={cn(styles.td, className)} {...props}>{children}</td>;\n}\n","import { useState, useRef, type ReactNode } from 'react';\nimport { cn } from '../../utils/cn';\nimport styles from './Tooltip.module.css';\n\nexport interface TooltipProps {\n /** Tooltip content */\n content: ReactNode;\n /** Trigger element */\n children: ReactNode;\n /** Placement */\n placement?: 'top' | 'bottom';\n /** Delay before showing (ms) */\n delay?: number;\n /** Additional className */\n className?: string;\n}\n\n/**\n * Tooltip — supplementary text on hover/focus.\n *\n * Accessibility:\n * - Shows on both hover and keyboard focus\n * - Uses role=\"tooltip\" with aria-describedby linking\n * - Respects reduced motion preferences (no animation)\n * - Healthcare note: never put critical information in tooltips alone.\n * Use for supplementary context only, since tooltips are easy to miss\n * and not accessible on touch devices.\n */\nexport function Tooltip({ content, children, placement = 'top', delay = 200, className }: TooltipProps) {\n const [visible, setVisible] = useState(false);\n const timeoutRef = useRef<ReturnType<typeof setTimeout>>();\n const tooltipId = useRef(`tooltip-${Math.random().toString(36).slice(2, 9)}`).current;\n\n const show = () => {\n timeoutRef.current = setTimeout(() => setVisible(true), delay);\n };\n\n const hide = () => {\n clearTimeout(timeoutRef.current);\n setVisible(false);\n };\n\n return (\n <div\n className={cn(styles.wrapper, className)}\n onMouseEnter={show}\n onMouseLeave={hide}\n onFocus={show}\n onBlur={hide}\n >\n <div aria-describedby={visible ? tooltipId : undefined}>\n {children}\n </div>\n {visible && (\n <div\n id={tooltipId}\n role=\"tooltip\"\n className={cn(styles.tooltip, styles[placement])}\n >\n {content}\n </div>\n )}\n </div>\n );\n}\n",".wrapper {\n position: relative;\n display: inline-flex;\n}\n\n.tooltip {\n position: absolute;\n left: 50%;\n transform: translateX(-50%);\n z-index: var(--aegis-z-tooltip);\n padding: var(--aegis-space-1) var(--aegis-space-2);\n border-radius: var(--aegis-radius-sm);\n background-color: var(--aegis-color-neutral-900);\n color: var(--aegis-color-text-inverse);\n font-family: var(--aegis-font-family-sans);\n font-size: var(--aegis-font-size-caption);\n line-height: var(--aegis-line-height-caption);\n white-space: nowrap;\n pointer-events: none;\n box-shadow: var(--aegis-shadow-md);\n animation: aegis-tooltip-in var(--aegis-motion-duration-fast) var(--aegis-motion-easing-standard);\n}\n\n.top {\n bottom: calc(100% + 6px);\n}\n\n.bottom {\n top: calc(100% + 6px);\n}\n\n@keyframes aegis-tooltip-in {\n from {\n opacity: 0;\n transform: translateX(-50%) translateY(2px);\n }\n to {\n opacity: 1;\n transform: translateX(-50%) translateY(0);\n }\n}\n",".divider {\n border: none;\n border-top: var(--aegis-border-width-hairline) var(--aegis-border-style-default) var(--aegis-color-border-default);\n width: 100%;\n}\n\n.light {\n border-top-color: var(--aegis-color-border-subtle);\n}\n\n.none { margin: 0; }\n.sm { margin: var(--aegis-space-2) 0; }\n.md { margin: var(--aegis-space-4) 0; }\n.lg { margin: var(--aegis-space-8) 0; }\n","import { type HTMLAttributes } from 'react';\nimport { cn } from '../../utils/cn';\nimport styles from './Divider.module.css';\n\nexport interface DividerProps extends HTMLAttributes<HTMLHRElement> {\n /** Spacing above and below */\n spacing?: 'none' | 'sm' | 'md' | 'lg';\n}\n\n/**\n * Divider — horizontal rule for visual separation.\n *\n * Accessibility:\n * - Uses semantic <hr> which conveys a thematic break\n * - role=\"separator\" is implicit for <hr>\n */\nexport function Divider({ spacing = 'md', className, ...props }: DividerProps) {\n return <hr className={cn(styles.divider, styles[spacing], className)} {...props} />;\n}\n",".spinner {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n color: var(--aegis-color-brand-primary-500);\n}\n\n.svg {\n animation: aegis-spin 0.8s linear infinite;\n}\n\n@keyframes aegis-spin {\n to {\n transform: rotate(360deg);\n }\n}\n","import { type HTMLAttributes } from 'react';\nimport { cn } from '../../utils/cn';\nimport styles from './Spinner.module.css';\n\nexport interface SpinnerProps extends HTMLAttributes<HTMLSpanElement> {\n /** Size */\n size?: 'sm' | 'md' | 'lg';\n /** Accessible label */\n label?: string;\n}\n\n/**\n * Spinner / LoadingIndicator — visual loading state.\n *\n * Accessibility:\n * - role=\"status\" with aria-label for screen reader announcement\n * - aria-live=\"polite\" so loading state is announced without interrupting\n * - Healthcare note: in clinical workflows, always pair with text\n * context (\"Loading patient records...\") so users understand what\n * they are waiting for\n */\nexport function Spinner({ size = 'md', label = 'Loading', className, ...props }: SpinnerProps) {\n const sizeMap = { sm: 16, md: 24, lg: 32 };\n const s = sizeMap[size];\n\n return (\n <span\n className={cn(styles.spinner, className)}\n role=\"status\"\n aria-label={label}\n aria-live=\"polite\"\n {...props}\n >\n <svg\n width={s}\n height={s}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n className={styles.svg}\n aria-hidden=\"true\"\n >\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n opacity=\"0.2\"\n />\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeDasharray=\"50\"\n strokeDashoffset=\"35\"\n />\n </svg>\n </span>\n );\n}\n",".skeleton {\n background-color: var(--aegis-color-neutral-100);\n background-image: linear-gradient(\n 90deg,\n var(--aegis-color-neutral-100) 0%,\n var(--aegis-color-neutral-50) 40%,\n var(--aegis-color-neutral-100) 80%\n );\n background-size: 200% 100%;\n animation: aegis-shimmer 1.5s ease-in-out infinite;\n}\n\n.text {\n height: 1em;\n border-radius: var(--aegis-radius-sm);\n}\n\n.circular {\n border-radius: var(--aegis-radius-full);\n}\n\n.rectangular {\n border-radius: var(--aegis-radius-md);\n}\n\n.group {\n display: flex;\n flex-direction: column;\n gap: var(--aegis-space-2);\n}\n\n@keyframes aegis-shimmer {\n 0% {\n background-position: 200% 0;\n }\n 100% {\n background-position: -200% 0;\n }\n}\n","import { type HTMLAttributes } from 'react';\nimport { cn } from '../../utils/cn';\nimport styles from './Skeleton.module.css';\n\nexport interface SkeletonProps extends HTMLAttributes<HTMLDivElement> {\n /** Shape variant */\n variant?: 'text' | 'circular' | 'rectangular';\n /** Width (CSS value) */\n width?: string | number;\n /** Height (CSS value) */\n height?: string | number;\n /** Number of text lines (only for text variant) */\n lines?: number;\n}\n\n/**\n * Skeleton — placeholder loading indicator with shimmer animation.\n *\n * Accessibility:\n * - aria-hidden=\"true\" since it is purely decorative\n * - Healthcare note: use Skeleton loaders in clinical dashboards to\n * indicate data is loading, reducing perceived wait time\n */\nexport function Skeleton({\n variant = 'text',\n width,\n height,\n lines = 1,\n className,\n style,\n ...props\n}: SkeletonProps) {\n if (variant === 'text' && lines > 1) {\n return (\n <div className={cn(styles.group, className)} aria-hidden=\"true\" {...props}>\n {Array.from({ length: lines }, (_, i) => (\n <div\n key={i}\n className={cn(styles.skeleton, styles.text)}\n style={{\n width: i === lines - 1 ? '75%' : width ?? '100%',\n height: height ?? undefined,\n ...style,\n }}\n />\n ))}\n </div>\n );\n }\n\n return (\n <div\n className={cn(styles.skeleton, styles[variant], className)}\n aria-hidden=\"true\"\n style={{\n width: width ?? (variant === 'circular' ? 40 : '100%'),\n height: height ?? (variant === 'circular' ? 40 : variant === 'rectangular' ? 120 : undefined),\n ...style,\n }}\n {...props}\n />\n );\n}\n",".badge {\n display: inline-flex;\n align-items: center;\n gap: var(--aegis-space-1);\n border-radius: var(--aegis-radius-full);\n font-family: var(--aegis-font-family-sans);\n font-weight: var(--aegis-font-weight-medium);\n white-space: nowrap;\n}\n\n/* Sizes */\n.sm {\n padding: 1px var(--aegis-space-2);\n font-size: var(--aegis-font-size-caption);\n line-height: var(--aegis-line-height-caption);\n}\n\n.md {\n padding: 2px var(--aegis-space-3);\n font-size: var(--aegis-font-size-body-sm);\n line-height: var(--aegis-line-height-body-sm);\n}\n\n/* Status dot */\n.dot {\n width: 6px;\n height: 6px;\n border-radius: var(--aegis-radius-full);\n background-color: currentColor;\n flex-shrink: 0;\n}\n\n/* Status colors */\n.active {\n background-color: var(--aegis-color-success-50);\n color: var(--aegis-color-success-700);\n}\n\n.inactive {\n background-color: var(--aegis-color-neutral-100);\n color: var(--aegis-color-text-muted);\n}\n\n.pending {\n background-color: var(--aegis-color-warning-50);\n color: var(--aegis-color-warning-700);\n}\n\n.critical {\n background-color: var(--aegis-color-error-50);\n color: var(--aegis-color-error-700);\n}\n\n.discharged {\n background-color: var(--aegis-color-info-50);\n color: var(--aegis-color-info-700);\n}\n\n.scheduled {\n background-color: var(--aegis-color-info-50);\n color: var(--aegis-color-info-700);\n}\n\n.cancelled {\n background-color: var(--aegis-color-neutral-100);\n color: var(--aegis-color-text-secondary);\n}\n\n.in-progress {\n background-color: var(--aegis-color-warning-50);\n color: var(--aegis-color-warning-700);\n}\n","import { type HTMLAttributes } from 'react';\nimport { cn } from '../../utils/cn';\nimport styles from './StatusBadge.module.css';\n\nexport type StatusBadgeStatus =\n | 'active'\n | 'inactive'\n | 'pending'\n | 'critical'\n | 'discharged'\n | 'scheduled'\n | 'cancelled'\n | 'in-progress';\n\nexport interface StatusBadgeProps extends HTMLAttributes<HTMLSpanElement> {\n /** Healthcare status */\n status: StatusBadgeStatus;\n /** Size variant */\n size?: 'sm' | 'md';\n /** Show a colored status dot before the label */\n dot?: boolean;\n}\n\nconst statusLabels: Record<StatusBadgeStatus, string> = {\n active: 'Active',\n inactive: 'Inactive',\n pending: 'Pending',\n critical: 'Critical',\n discharged: 'Discharged',\n scheduled: 'Scheduled',\n cancelled: 'Cancelled',\n 'in-progress': 'In Progress',\n};\n\n/**\n * StatusBadge — enhanced badge for healthcare workflow statuses.\n *\n * Accessibility:\n * - Always displays text label alongside color to avoid color-only indication\n * - Healthcare note: maps each clinical status to an appropriate semantic\n * color (critical = red, active = green, pending = amber, etc.)\n */\nexport function StatusBadge({\n status,\n size = 'md',\n dot = false,\n className,\n children,\n ...props\n}: StatusBadgeProps) {\n return (\n <span\n className={cn(styles.badge, styles[status], styles[size], className)}\n {...props}\n >\n {dot && <span className={styles.dot} aria-hidden=\"true\" />}\n {children ?? statusLabels[status]}\n </span>\n );\n}\n","import { useState, type HTMLAttributes } from 'react';\nimport { cn } from '../../utils/cn';\nimport styles from './Avatar.module.css';\n\nexport interface AvatarProps extends HTMLAttributes<HTMLSpanElement> {\n /** Image source URL */\n src?: string;\n /** Alt text for the image */\n alt?: string;\n /** Full name used to generate initials fallback */\n name?: string;\n /** Size variant */\n size?: 'sm' | 'md' | 'lg' | 'xl';\n /** Optional status dot overlay */\n status?: 'active' | 'inactive' | 'busy' | 'away';\n}\n\nfunction getInitials(name: string): string {\n const parts = name.trim().split(/\\s+/);\n if (parts.length === 0) return '';\n if (parts.length === 1) return parts[0][0]?.toUpperCase() ?? '';\n return (parts[0][0] + parts[parts.length - 1][0]).toUpperCase();\n}\n\n/**\n * Avatar — circular user image with initials fallback and optional status.\n *\n * Accessibility:\n * - Image includes alt text when src is provided\n * - Initials fallback uses aria-label with the full name\n * - Status dot includes a visually-hidden label\n * - Healthcare note: use avatars to identify care team members,\n * patients, and providers in clinical workflows\n */\nexport function Avatar({\n src,\n alt,\n name,\n size = 'md',\n status,\n className,\n ...props\n}: AvatarProps) {\n const [imgError, setImgError] = useState(false);\n const showImage = src && !imgError;\n const initials = name ? getInitials(name) : '';\n\n return (\n <span\n className={cn(styles.avatar, styles[size], className)}\n role=\"img\"\n aria-label={alt ?? name ?? 'Avatar'}\n {...props}\n >\n {showImage ? (\n <img\n src={src}\n alt={alt ?? name ?? 'Avatar'}\n className={styles.image}\n onError={() => setImgError(true)}\n />\n ) : (\n <span className={styles.initials} aria-hidden=\"true\">\n {initials}\n </span>\n )}\n {status && (\n <span className={cn(styles.status, styles[`status-${status}`])} aria-hidden=\"true\">\n <span className={styles.srOnly}>{status}</span>\n </span>\n )}\n </span>\n );\n}\n",".avatar {\n position: relative;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border-radius: var(--aegis-radius-full);\n background-color: var(--aegis-color-neutral-100);\n color: var(--aegis-color-text-secondary);\n font-family: var(--aegis-font-family-sans);\n font-weight: var(--aegis-font-weight-semibold);\n overflow: hidden;\n flex-shrink: 0;\n}\n\n/* Sizes */\n.sm {\n width: 28px;\n height: 28px;\n font-size: 11px;\n}\n\n.md {\n width: 36px;\n height: 36px;\n font-size: 13px;\n}\n\n.lg {\n width: 48px;\n height: 48px;\n font-size: 16px;\n}\n\n.xl {\n width: 64px;\n height: 64px;\n font-size: 20px;\n}\n\n.image {\n width: 100%;\n height: 100%;\n object-fit: cover;\n border-radius: var(--aegis-radius-full);\n}\n\n.initials {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n height: 100%;\n user-select: none;\n}\n\n/* Status dot */\n.status {\n position: absolute;\n bottom: 0;\n right: 0;\n width: 25%;\n height: 25%;\n min-width: 8px;\n min-height: 8px;\n border-radius: var(--aegis-radius-full);\n border: 2px solid var(--aegis-color-surface-default);\n box-sizing: content-box;\n}\n\n.status-active {\n background-color: var(--aegis-color-success-500);\n}\n\n.status-inactive {\n background-color: var(--aegis-color-neutral-300);\n}\n\n.status-busy {\n background-color: var(--aegis-color-error-500);\n}\n\n.status-away {\n background-color: var(--aegis-color-warning-500);\n}\n\n.srOnly {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border-width: 0;\n}\n",".container {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: var(--aegis-space-12) var(--aegis-space-6);\n text-align: center;\n}\n\n.icon {\n margin-bottom: var(--aegis-space-4);\n color: var(--aegis-color-text-muted);\n font-size: 48px;\n line-height: 1;\n}\n\n.title {\n margin: 0;\n font-family: var(--aegis-font-family-sans);\n font-size: var(--aegis-font-size-heading-sm);\n font-weight: var(--aegis-font-weight-semibold);\n line-height: var(--aegis-line-height-heading-sm);\n color: var(--aegis-color-text-primary);\n}\n\n.description {\n margin: var(--aegis-space-2) 0 0;\n font-family: var(--aegis-font-family-sans);\n font-size: var(--aegis-font-size-body-md);\n line-height: var(--aegis-line-height-body-md);\n color: var(--aegis-color-text-muted);\n max-width: 360px;\n}\n\n.action {\n margin-top: var(--aegis-space-6);\n}\n","import { type ReactNode, type HTMLAttributes } from 'react';\nimport { cn } from '../../utils/cn';\nimport styles from './EmptyState.module.css';\n\nexport interface EmptyStateProps extends HTMLAttributes<HTMLDivElement> {\n /** Optional icon displayed above the title */\n icon?: ReactNode;\n /** Title text */\n title: string;\n /** Descriptive text below the title */\n description?: string;\n /** Optional action element (e.g., a button) */\n action?: ReactNode;\n}\n\n/**\n * EmptyState — centered placeholder for empty tables, lists, or views.\n *\n * Accessibility:\n * - Uses semantic heading and paragraph elements\n * - Healthcare note: provide clear, actionable guidance in empty states\n * (e.g., \"No patients match your filters. Try adjusting your search.\")\n */\nexport function EmptyState({\n icon,\n title,\n description,\n action,\n className,\n ...props\n}: EmptyStateProps) {\n return (\n <div className={cn(styles.container, className)} {...props}>\n {icon && <div className={styles.icon} aria-hidden=\"true\">{icon}</div>}\n <h3 className={styles.title}>{title}</h3>\n {description && <p className={styles.description}>{description}</p>}\n {action && <div className={styles.action}>{action}</div>}\n </div>\n );\n}\n",".container {\n width: 100%;\n}\n\n.header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: var(--aegis-space-2);\n}\n\n.label {\n font-family: var(--aegis-font-family-sans);\n font-size: var(--aegis-font-size-label-md);\n font-weight: var(--aegis-font-weight-medium);\n color: var(--aegis-color-text-primary);\n}\n\n.value {\n font-family: var(--aegis-font-family-mono);\n font-size: var(--aegis-font-size-body-sm);\n color: var(--aegis-color-text-secondary);\n}\n\n.track {\n width: 100%;\n background-color: var(--aegis-color-neutral-100);\n border-radius: var(--aegis-radius-full);\n overflow: hidden;\n}\n\n/* Sizes */\n.sm {\n height: 4px;\n}\n\n.md {\n height: 8px;\n}\n\n/* Fill bar */\n.fill {\n height: 100%;\n border-radius: var(--aegis-radius-full);\n transition: width 0.3s ease;\n}\n\n/* Variants */\n.default {\n background-color: var(--aegis-color-brand-primary-500);\n}\n\n.success {\n background-color: var(--aegis-color-success-500);\n}\n\n.warning {\n background-color: var(--aegis-color-warning-500);\n}\n\n.error {\n background-color: var(--aegis-color-error-500);\n}\n","import { type HTMLAttributes } from 'react';\nimport { cn } from '../../utils/cn';\nimport styles from './ProgressBar.module.css';\n\nexport interface ProgressBarProps extends HTMLAttributes<HTMLDivElement> {\n /** Current value (0-100) */\n value: number;\n /** Maximum value (defaults to 100) */\n max?: number;\n /** Size variant */\n size?: 'sm' | 'md';\n /** Color variant */\n variant?: 'default' | 'success' | 'warning' | 'error';\n /** Visible label text */\n label?: string;\n /** Show the numeric value */\n showValue?: boolean;\n}\n\n/**\n * ProgressBar — horizontal bar indicating completion or progress.\n *\n * Accessibility:\n * - role=\"progressbar\" with aria-valuenow, aria-valuemin, aria-valuemax\n * - aria-label derived from the label prop\n * - Healthcare note: useful for treatment progress, form completion,\n * or patient intake steps\n */\nexport function ProgressBar({\n value,\n max = 100,\n size = 'md',\n variant = 'default',\n label,\n showValue = false,\n className,\n ...props\n}: ProgressBarProps) {\n const pct = Math.min(100, Math.max(0, (value / max) * 100));\n\n return (\n <div className={cn(styles.container, className)} {...props}>\n {(label || showValue) && (\n <div className={styles.header}>\n {label && <span className={styles.label}>{label}</span>}\n {showValue && <span className={styles.value}>{Math.round(pct)}%</span>}\n </div>\n )}\n <div\n className={cn(styles.track, styles[size])}\n role=\"progressbar\"\n aria-valuenow={value}\n aria-valuemin={0}\n aria-valuemax={max}\n aria-label={label}\n >\n <div\n className={cn(styles.fill, styles[variant])}\n style={{ width: `${pct}%` }}\n />\n </div>\n </div>\n );\n}\n",".pagination {\n display: flex;\n align-items: center;\n gap: var(--aegis-space-1);\n}\n\n.button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border: var(--aegis-border-width-hairline) solid transparent;\n border-radius: var(--aegis-radius-md);\n background: transparent;\n color: var(--aegis-color-text-secondary);\n font-family: var(--aegis-font-family-sans);\n font-weight: var(--aegis-font-weight-medium);\n cursor: pointer;\n transition: background-color 0.15s ease, color 0.15s ease, border-color 0.15s ease;\n}\n\n/* Sizes */\n.sm .button {\n min-width: 28px;\n height: 28px;\n font-size: var(--aegis-font-size-body-sm);\n padding: 0 var(--aegis-space-1);\n}\n\n.md .button {\n min-width: 36px;\n height: 36px;\n font-size: var(--aegis-font-size-body-md);\n padding: 0 var(--aegis-space-2);\n}\n\n.button:hover:not(:disabled) {\n background-color: var(--aegis-color-surface-subtle);\n color: var(--aegis-color-text-primary);\n}\n\n.button:focus-visible {\n outline: var(--aegis-border-width-medium) solid var(--aegis-focus-outline-color);\n outline-offset: var(--aegis-focus-ring-offset);\n box-shadow: var(--aegis-shadow-focus);\n}\n\n.button:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n}\n\n/* Active page */\n.active {\n background-color: var(--aegis-color-brand-primary-500);\n color: white;\n border-color: var(--aegis-color-brand-primary-500);\n}\n\n.active:hover:not(:disabled) {\n background-color: var(--aegis-color-brand-primary-600);\n color: white;\n}\n\n/* Nav buttons */\n.nav {\n color: var(--aegis-color-text-secondary);\n}\n\n.ellipsis {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 28px;\n height: 28px;\n color: var(--aegis-color-text-muted);\n font-family: var(--aegis-font-family-sans);\n user-select: none;\n}\n","import { type HTMLAttributes } from 'react';\nimport { cn } from '../../utils/cn';\nimport styles from './Pagination.module.css';\n\nexport interface PaginationProps extends Omit<HTMLAttributes<HTMLElement>, 'onChange'> {\n /** Current active page (1-based) */\n currentPage: number;\n /** Total number of pages */\n totalPages: number;\n /** Callback when page changes */\n onPageChange: (page: number) => void;\n /** Number of sibling pages to show around the current page */\n siblingCount?: number;\n /** Size variant */\n size?: 'sm' | 'md';\n}\n\nfunction getPageRange(current: number, total: number, siblings: number): (number | 'ellipsis')[] {\n const totalNumbers = siblings * 2 + 3; // siblings + current + 2 boundaries\n const totalBlocks = totalNumbers + 2; // + 2 ellipsis slots\n\n if (total <= totalBlocks) {\n return Array.from({ length: total }, (_, i) => i + 1);\n }\n\n const leftSibling = Math.max(current - siblings, 1);\n const rightSibling = Math.min(current + siblings, total);\n\n const showLeftEllipsis = leftSibling > 2;\n const showRightEllipsis = rightSibling < total - 1;\n\n if (!showLeftEllipsis && showRightEllipsis) {\n const leftCount = 3 + 2 * siblings;\n const leftRange = Array.from({ length: leftCount }, (_, i) => i + 1);\n return [...leftRange, 'ellipsis', total];\n }\n\n if (showLeftEllipsis && !showRightEllipsis) {\n const rightCount = 3 + 2 * siblings;\n const rightRange = Array.from({ length: rightCount }, (_, i) => total - rightCount + i + 1);\n return [1, 'ellipsis', ...rightRange];\n }\n\n const middleRange = Array.from(\n { length: rightSibling - leftSibling + 1 },\n (_, i) => leftSibling + i\n );\n return [1, 'ellipsis', ...middleRange, 'ellipsis', total];\n}\n\n/**\n * Pagination — page navigation for paginated data.\n *\n * Accessibility:\n * - Wraps in <nav> with aria-label=\"Pagination\"\n * - Current page indicated with aria-current=\"page\"\n * - Previous/Next buttons disabled at boundaries\n * - Healthcare note: use pagination for patient lists, lab results,\n * and audit logs to keep pages manageable\n */\nexport function Pagination({\n currentPage,\n totalPages,\n onPageChange,\n siblingCount = 1,\n size = 'md',\n className,\n ...props\n}: PaginationProps) {\n const pages = getPageRange(currentPage, totalPages, siblingCount);\n\n if (totalPages <= 1) return null;\n\n return (\n <nav\n className={cn(styles.pagination, styles[size], className)}\n aria-label=\"Pagination\"\n {...props}\n >\n <button\n className={cn(styles.button, styles.nav)}\n onClick={() => onPageChange(currentPage - 1)}\n disabled={currentPage <= 1}\n aria-label=\"Previous page\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <polyline points=\"10 4 6 8 10 12\" />\n </svg>\n </button>\n\n {pages.map((page, idx) =>\n page === 'ellipsis' ? (\n <span key={`ellipsis-${idx}`} className={styles.ellipsis} aria-hidden=\"true\">\n &hellip;\n </span>\n ) : (\n <button\n key={page}\n className={cn(styles.button, page === currentPage && styles.active)}\n onClick={() => onPageChange(page)}\n aria-current={page === currentPage ? 'page' : undefined}\n aria-label={`Page ${page}`}\n >\n {page}\n </button>\n )\n )}\n\n <button\n className={cn(styles.button, styles.nav)}\n onClick={() => onPageChange(currentPage + 1)}\n disabled={currentPage >= totalPages}\n aria-label=\"Next page\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <polyline points=\"6 4 10 8 6 12\" />\n </svg>\n </button>\n </nav>\n );\n}\n",".list {\n margin: 0;\n padding: 0;\n font-family: var(--aegis-font-family-sans);\n}\n\n.item {\n display: flex;\n flex-direction: column;\n}\n\n.term {\n font-size: var(--aegis-font-size-label-md);\n font-weight: var(--aegis-font-weight-medium);\n color: var(--aegis-color-text-muted);\n margin-bottom: var(--aegis-space-1);\n}\n\n.definition {\n margin: 0;\n font-size: var(--aegis-font-size-body-md);\n line-height: var(--aegis-line-height-body-md);\n color: var(--aegis-color-text-primary);\n}\n\n/* Vertical layout */\n.vertical {\n display: flex;\n flex-direction: column;\n gap: var(--aegis-space-4);\n}\n\n/* Horizontal layout */\n.horizontal .item {\n flex-direction: row;\n align-items: baseline;\n gap: var(--aegis-space-3);\n}\n\n.horizontal {\n display: flex;\n flex-direction: column;\n gap: var(--aegis-space-3);\n}\n\n.horizontal .term {\n flex-shrink: 0;\n min-width: 140px;\n margin-bottom: 0;\n}\n\n/* Grid layout */\n.grid {\n display: grid;\n grid-template-columns: repeat(var(--dl-columns, 2), 1fr);\n gap: var(--aegis-space-4) var(--aegis-space-6);\n}\n","import { type ReactNode, type HTMLAttributes } from 'react';\nimport { cn } from '../../utils/cn';\nimport styles from './DescriptionList.module.css';\n\nexport interface DescriptionListItem {\n /** Label / term */\n label: ReactNode;\n /** Value / description */\n value: ReactNode;\n}\n\nexport interface DescriptionListProps extends HTMLAttributes<HTMLDListElement> {\n /** Array of label-value pairs */\n items: DescriptionListItem[];\n /** Layout mode */\n layout?: 'vertical' | 'horizontal' | 'grid';\n /** Number of columns for grid layout */\n columns?: number;\n}\n\n/**\n * DescriptionList — semantic key-value display using dl/dt/dd.\n *\n * Accessibility:\n * - Uses <dl>, <dt>, <dd> semantic HTML\n * - Screen readers will announce terms and definitions\n * - Healthcare note: ideal for patient demographics, encounter details,\n * and insurance information panels\n */\nexport function DescriptionList({\n items,\n layout = 'vertical',\n columns = 2,\n className,\n style,\n ...props\n}: DescriptionListProps) {\n return (\n <dl\n className={cn(styles.list, styles[layout], className)}\n style={{\n ...(layout === 'grid' ? { '--dl-columns': columns } as React.CSSProperties : {}),\n ...style,\n }}\n {...props}\n >\n {items.map((item, i) => (\n <div key={i} className={styles.item}>\n <dt className={styles.term}>{item.label}</dt>\n <dd className={styles.definition}>{item.value}</dd>\n </div>\n ))}\n </dl>\n );\n}\n","import { useState, useRef, useEffect, useCallback, type ReactNode, type HTMLAttributes } from 'react';\nimport { cn } from '../../utils/cn';\nimport styles from './Popover.module.css';\n\nexport interface PopoverProps extends Omit<HTMLAttributes<HTMLDivElement>, 'content'> {\n /** Trigger element that opens the popover */\n trigger: ReactNode;\n /** Content rendered inside the popover */\n content: ReactNode;\n /** Controlled open state */\n open?: boolean;\n /** Callback when open state changes */\n onOpenChange?: (open: boolean) => void;\n /** Placement relative to the trigger */\n placement?: 'top' | 'bottom' | 'left' | 'right';\n /** Alignment along the placement axis */\n align?: 'start' | 'center' | 'end';\n}\n\n/**\n * Popover — positioned overlay content triggered by a reference element.\n *\n * Accessibility:\n * - Escape key closes the popover\n * - Focus is managed: moves into popover on open, returns on close\n * - Click outside closes the popover\n * - Healthcare note: use for additional context like patient quick-view,\n * medication details, or field-level help without navigating away\n */\nexport function Popover({\n trigger,\n content,\n open: controlledOpen,\n onOpenChange,\n placement = 'bottom',\n align = 'center',\n className,\n ...props\n}: PopoverProps) {\n const [internalOpen, setInternalOpen] = useState(false);\n const isControlled = controlledOpen !== undefined;\n const isOpen = isControlled ? controlledOpen : internalOpen;\n\n const containerRef = useRef<HTMLDivElement>(null);\n const contentRef = useRef<HTMLDivElement>(null);\n\n const setOpen = useCallback(\n (value: boolean) => {\n if (!isControlled) setInternalOpen(value);\n onOpenChange?.(value);\n },\n [isControlled, onOpenChange]\n );\n\n const toggle = useCallback(() => setOpen(!isOpen), [isOpen, setOpen]);\n\n // Close on Escape\n useEffect(() => {\n if (!isOpen) return;\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n setOpen(false);\n }\n };\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [isOpen, setOpen]);\n\n // Close on click outside\n useEffect(() => {\n if (!isOpen) return;\n const handleClick = (e: MouseEvent) => {\n if (containerRef.current && !containerRef.current.contains(e.target as Node)) {\n setOpen(false);\n }\n };\n document.addEventListener('mousedown', handleClick);\n return () => document.removeEventListener('mousedown', handleClick);\n }, [isOpen, setOpen]);\n\n // Focus management\n useEffect(() => {\n if (isOpen && contentRef.current) {\n const firstFocusable = contentRef.current.querySelector<HTMLElement>(\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])'\n );\n if (firstFocusable) {\n firstFocusable.focus();\n }\n }\n }, [isOpen]);\n\n return (\n <div ref={containerRef} className={cn(styles.container, className)} {...props}>\n <div className={styles.trigger} onClick={toggle}>\n {trigger}\n </div>\n {isOpen && (\n <div\n ref={contentRef}\n className={cn(styles.content, styles[placement], styles[`align-${align}`])}\n role=\"dialog\"\n aria-modal=\"false\"\n >\n {content}\n </div>\n )}\n </div>\n );\n}\n",".container {\n position: relative;\n display: inline-flex;\n}\n\n.trigger {\n display: inline-flex;\n cursor: pointer;\n}\n\n.content {\n position: absolute;\n z-index: 50;\n min-width: 200px;\n padding: var(--aegis-space-4);\n background-color: var(--aegis-color-surface-default);\n border: var(--aegis-border-width-hairline) solid var(--aegis-color-border-default);\n border-radius: var(--aegis-radius-lg);\n box-shadow: var(--aegis-shadow-lg);\n font-family: var(--aegis-font-family-sans);\n font-size: var(--aegis-font-size-body-md);\n line-height: var(--aegis-line-height-body-md);\n color: var(--aegis-color-text-primary);\n animation: aegis-popover-in var(--aegis-motion-duration-fast) var(--aegis-motion-easing-standard);\n}\n\n/* Placement */\n.bottom {\n top: calc(100% + var(--aegis-space-2));\n}\n\n.top {\n bottom: calc(100% + var(--aegis-space-2));\n}\n\n.left {\n right: calc(100% + var(--aegis-space-2));\n top: 50%;\n transform: translateY(-50%);\n}\n\n.right {\n left: calc(100% + var(--aegis-space-2));\n top: 50%;\n transform: translateY(-50%);\n}\n\n/* Alignment (for top/bottom) */\n.align-start {\n left: 0;\n}\n\n.align-center:not(.left):not(.right) {\n left: 50%;\n transform: translateX(-50%);\n}\n\n.align-end {\n right: 0;\n}\n\n@keyframes aegis-popover-in {\n from {\n opacity: 0;\n transform: scale(0.96);\n }\n to {\n opacity: 1;\n transform: scale(1);\n }\n}\n\n/* Fix transform for centered top/bottom (override animation target) */\n.align-center.bottom,\n.align-center.top {\n transform: translateX(-50%);\n}\n\n.left,\n.right {\n transform: translateY(-50%);\n}\n","import { useEffect, useRef, type ReactNode } from 'react';\nimport { cn } from '../../utils/cn';\nimport styles from './Drawer.module.css';\n\nexport interface DrawerProps {\n /** Additional className */\n className?: string;\n /** Whether the drawer is visible */\n open: boolean;\n /** Called when the drawer should close */\n onClose: () => void;\n /** Drawer title */\n title: ReactNode;\n /** Width preset */\n size?: 'sm' | 'md' | 'lg';\n /** Which side the drawer slides from */\n position?: 'left' | 'right';\n /** Footer actions */\n footer?: ReactNode;\n /** Drawer body content */\n children?: ReactNode;\n}\n\n/**\n * Drawer — side panel overlay for detail views and forms.\n *\n * Accessibility:\n * - Uses native <dialog> element for focus trapping\n * - Escape key closes the drawer\n * - aria-labelledby links to the title\n * - Scrim click closes the drawer\n * - Healthcare note: use drawers for patient detail views, order entry,\n * and contextual forms that don't require full-page navigation\n */\nexport function Drawer({\n open,\n onClose,\n title,\n size = 'md',\n position = 'right',\n footer,\n className,\n children,\n}: DrawerProps) {\n const dialogRef = useRef<HTMLDialogElement>(null);\n\n useEffect(() => {\n const dialog = dialogRef.current;\n if (!dialog) return;\n\n if (open && !dialog.open) {\n dialog.showModal();\n } else if (!open && dialog.open) {\n dialog.close();\n }\n }, [open]);\n\n useEffect(() => {\n const dialog = dialogRef.current;\n if (!dialog) return;\n\n const handleClose = () => onClose();\n dialog.addEventListener('close', handleClose);\n return () => dialog.removeEventListener('close', handleClose);\n }, [onClose]);\n\n const handleBackdropClick = (e: React.MouseEvent<HTMLDialogElement>) => {\n if (e.target === dialogRef.current) {\n onClose();\n }\n };\n\n return (\n <dialog\n ref={dialogRef}\n className={cn(styles.dialog, styles[position], styles[size], className)}\n aria-labelledby=\"aegis-drawer-title\"\n onClick={handleBackdropClick}\n >\n <div className={styles.panel}>\n <header className={styles.header}>\n <h2 id=\"aegis-drawer-title\" className={styles.title}>{title}</h2>\n <button\n className={styles.close}\n onClick={onClose}\n aria-label=\"Close drawer\"\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.75\" strokeLinecap=\"round\" aria-hidden=\"true\">\n <line x1=\"5\" y1=\"5\" x2=\"15\" y2=\"15\" />\n <line x1=\"15\" y1=\"5\" x2=\"5\" y2=\"15\" />\n </svg>\n </button>\n </header>\n <div className={styles.body}>{children}</div>\n {footer && <footer className={styles.footer}>{footer}</footer>}\n </div>\n </dialog>\n );\n}\n",".dialog {\n position: fixed;\n inset: 0;\n border: none;\n padding: 0;\n background: transparent;\n max-width: 100vw;\n max-height: 100vh;\n width: 100vw;\n height: 100vh;\n}\n\n.dialog::backdrop {\n background-color: var(--aegis-color-overlay-scrim);\n}\n\n.panel {\n position: fixed;\n top: 0;\n bottom: 0;\n display: flex;\n flex-direction: column;\n background-color: var(--aegis-color-surface-default);\n box-shadow: var(--aegis-shadow-lg);\n max-width: 90vw;\n}\n\n/* Position */\n.right .panel {\n right: 0;\n animation: aegis-drawer-right-in var(--aegis-motion-duration-slow) var(--aegis-motion-easing-standard);\n}\n\n.left .panel {\n left: 0;\n animation: aegis-drawer-left-in var(--aegis-motion-duration-slow) var(--aegis-motion-easing-standard);\n}\n\n/* Sizes */\n.sm .panel { width: 320px; }\n.md .panel { width: 480px; }\n.lg .panel { width: 640px; }\n\n.header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: var(--aegis-space-6);\n border-bottom: var(--aegis-border-width-hairline) solid var(--aegis-color-border-default);\n flex-shrink: 0;\n}\n\n.title {\n margin: 0;\n font-family: var(--aegis-font-family-sans);\n font-size: var(--aegis-font-size-heading-md);\n font-weight: var(--aegis-font-weight-semibold);\n line-height: var(--aegis-line-height-heading-md);\n color: var(--aegis-color-text-primary);\n}\n\n.close {\n display: flex;\n align-items: center;\n justify-content: center;\n width: var(--aegis-size-control-sm);\n height: var(--aegis-size-control-sm);\n border: none;\n border-radius: var(--aegis-radius-md);\n background: transparent;\n color: var(--aegis-color-text-muted);\n cursor: pointer;\n flex-shrink: 0;\n}\n\n.close:hover {\n background-color: var(--aegis-color-surface-subtle);\n color: var(--aegis-color-text-primary);\n}\n\n.close:focus-visible {\n outline: var(--aegis-border-width-medium) solid var(--aegis-focus-outline-color);\n outline-offset: var(--aegis-focus-ring-offset);\n box-shadow: var(--aegis-shadow-focus);\n}\n\n.body {\n padding: var(--aegis-space-6);\n overflow-y: auto;\n flex: 1;\n font-family: var(--aegis-font-family-sans);\n font-size: var(--aegis-font-size-body-md);\n line-height: var(--aegis-line-height-body-md);\n color: var(--aegis-color-text-secondary);\n}\n\n.footer {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: var(--aegis-space-3);\n padding: var(--aegis-space-4) var(--aegis-space-6);\n border-top: var(--aegis-border-width-hairline) solid var(--aegis-color-border-default);\n flex-shrink: 0;\n}\n\n@keyframes aegis-drawer-right-in {\n from {\n transform: translateX(100%);\n }\n to {\n transform: translateX(0);\n }\n}\n\n@keyframes aegis-drawer-left-in {\n from {\n transform: translateX(-100%);\n }\n to {\n transform: translateX(0);\n }\n}\n","import { type ReactNode, type HTMLAttributes, useCallback } from 'react';\nimport { cn } from '../../utils/cn';\nimport { Table, TableHead, TableBody, TableRow, TableHeaderCell, TableCell } from '../Table';\nimport { Skeleton } from '../Skeleton';\nimport { EmptyState } from '../EmptyState';\nimport styles from './DataGrid.module.css';\n\nexport interface DataGridColumn<T = Record<string, unknown>> {\n /** Unique key for the column, used as the data accessor */\n key: string;\n /** Column header label */\n header: ReactNode;\n /** Custom render function for cell content */\n render?: (value: unknown, row: T, rowIndex: number) => ReactNode;\n /** Whether this column is sortable */\n sortable?: boolean;\n /** Column width (CSS value) */\n width?: string | number;\n /** Text alignment */\n align?: 'left' | 'center' | 'right';\n}\n\nexport type SortDirection = 'asc' | 'desc';\n\nexport interface DataGridProps<T = Record<string, unknown>> extends Omit<HTMLAttributes<HTMLDivElement>, 'onSelect'> {\n /** Column definitions */\n columns: DataGridColumn<T>[];\n /** Data array */\n data: T[];\n /** Enable row selection with checkboxes */\n selectable?: boolean;\n /** Callback when selection changes, receives array of selected row indices */\n onSelectionChange?: (selectedIndices: number[]) => void;\n /** Currently selected row indices (controlled) */\n selectedRows?: number[];\n /** Current sort column key */\n sortColumn?: string;\n /** Current sort direction */\n sortDirection?: SortDirection;\n /** Callback when a sortable column header is clicked */\n onSort?: (column: string, direction: SortDirection) => void;\n /** Show loading skeleton */\n loading?: boolean;\n /** Message shown when data is empty */\n emptyMessage?: string;\n /** Row density */\n density?: 'default' | 'compact' | 'comfortable';\n /** Sticky header */\n stickyHeader?: boolean;\n /** Striped rows */\n striped?: boolean;\n /** Callback when a row is clicked */\n onRowClick?: (row: T, index: number) => void;\n}\n\n/**\n * DataGrid — composable data grid built on Table primitives.\n *\n * Accessibility:\n * - Built on semantic Table components (table/thead/tbody/tr/th/td)\n * - Sortable columns use aria-sort\n * - Selection checkboxes include accessible labels\n * - Loading state announced via aria-busy\n * - Healthcare note: designed for patient lists, lab results,\n * appointment schedules, and other clinical data views\n */\nexport function DataGrid<T extends Record<string, unknown>>({\n columns,\n data,\n selectable = false,\n onSelectionChange,\n selectedRows = [],\n sortColumn,\n sortDirection,\n onSort,\n loading = false,\n emptyMessage = 'No data available',\n density = 'default',\n stickyHeader = false,\n striped = false,\n onRowClick,\n className,\n ...props\n}: DataGridProps<T>) {\n const allSelected = data.length > 0 && selectedRows.length === data.length;\n const someSelected = selectedRows.length > 0 && !allSelected;\n\n const handleSelectAll = useCallback(() => {\n if (!onSelectionChange) return;\n if (allSelected) {\n onSelectionChange([]);\n } else {\n onSelectionChange(data.map((_, i) => i));\n }\n }, [allSelected, data, onSelectionChange]);\n\n const handleSelectRow = useCallback(\n (index: number) => {\n if (!onSelectionChange) return;\n if (selectedRows.includes(index)) {\n onSelectionChange(selectedRows.filter((i) => i !== index));\n } else {\n onSelectionChange([...selectedRows, index]);\n }\n },\n [selectedRows, onSelectionChange]\n );\n\n const handleSort = useCallback(\n (key: string) => {\n if (!onSort) return;\n const newDirection: SortDirection =\n sortColumn === key && sortDirection === 'asc' ? 'desc' : 'asc';\n onSort(key, newDirection);\n },\n [sortColumn, sortDirection, onSort]\n );\n\n const tableDensity = density === 'comfortable' ? 'default' : density;\n\n const getAriaSort = (key: string): 'ascending' | 'descending' | 'none' | undefined => {\n if (sortColumn !== key) return 'none';\n return sortDirection === 'asc' ? 'ascending' : 'descending';\n };\n\n // Accessor function to get nested values by dot-notation key\n const getValue = (row: T, key: string): unknown => {\n return key.split('.').reduce<unknown>((obj, k) => {\n if (obj && typeof obj === 'object') return (obj as Record<string, unknown>)[k];\n return undefined;\n }, row);\n };\n\n const loadingRows = 5;\n\n return (\n <div\n className={cn(styles.container, stickyHeader && styles.stickyHeader, className)}\n aria-busy={loading}\n {...props}\n >\n <Table\n density={tableDensity}\n striped={striped}\n className={cn(density === 'comfortable' && styles.comfortable)}\n >\n <TableHead>\n <TableRow>\n {selectable && (\n <TableHeaderCell style={{ width: 44 }}>\n <input\n type=\"checkbox\"\n checked={allSelected}\n ref={(el) => {\n if (el) el.indeterminate = someSelected;\n }}\n onChange={handleSelectAll}\n aria-label=\"Select all rows\"\n className={styles.checkbox}\n />\n </TableHeaderCell>\n )}\n {columns.map((col) => (\n <TableHeaderCell\n key={col.key}\n style={{\n width: col.width,\n textAlign: col.align,\n }}\n aria-sort={col.sortable ? getAriaSort(col.key) : undefined}\n >\n {col.sortable ? (\n <button\n className={styles.sortButton}\n onClick={() => handleSort(col.key)}\n style={{ textAlign: col.align }}\n >\n {col.header}\n <span className={styles.sortIcon} aria-hidden=\"true\">\n {sortColumn === col.key ? (\n sortDirection === 'asc' ? (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"4 8 7 5 10 8\" />\n </svg>\n ) : (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"4 6 7 9 10 6\" />\n </svg>\n )\n ) : (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" opacity=\"0.3\">\n <polyline points=\"4 5 7 3 10 5\" />\n <polyline points=\"4 9 7 11 10 9\" />\n </svg>\n )}\n </span>\n </button>\n ) : (\n col.header\n )}\n </TableHeaderCell>\n ))}\n </TableRow>\n </TableHead>\n <TableBody>\n {loading ? (\n Array.from({ length: loadingRows }, (_, rowIdx) => (\n <TableRow key={`skeleton-${rowIdx}`}>\n {selectable && (\n <TableCell>\n <Skeleton variant=\"rectangular\" width={16} height={16} />\n </TableCell>\n )}\n {columns.map((col) => (\n <TableCell key={col.key}>\n <Skeleton variant=\"text\" width=\"80%\" />\n </TableCell>\n ))}\n </TableRow>\n ))\n ) : data.length === 0 ? (\n <tr>\n <td colSpan={columns.length + (selectable ? 1 : 0)}>\n <EmptyState title={emptyMessage} />\n </td>\n </tr>\n ) : (\n data.map((row, rowIdx) => {\n const isSelected = selectedRows.includes(rowIdx);\n return (\n <TableRow\n key={rowIdx}\n className={cn(\n isSelected && styles.selectedRow,\n onRowClick && styles.clickableRow\n )}\n onClick={onRowClick ? () => onRowClick(row, rowIdx) : undefined}\n >\n {selectable && (\n <TableCell>\n <input\n type=\"checkbox\"\n checked={isSelected}\n onChange={(e) => {\n e.stopPropagation();\n handleSelectRow(rowIdx);\n }}\n onClick={(e) => e.stopPropagation()}\n aria-label={`Select row ${rowIdx + 1}`}\n className={styles.checkbox}\n />\n </TableCell>\n )}\n {columns.map((col) => {\n const value = getValue(row, col.key);\n return (\n <TableCell key={col.key} style={{ textAlign: col.align }}>\n {col.render ? col.render(value, row, rowIdx) : (value as ReactNode)}\n </TableCell>\n );\n })}\n </TableRow>\n );\n })\n )}\n </TableBody>\n </Table>\n </div>\n );\n}\n",".container {\n width: 100%;\n}\n\n/* Sticky header */\n.stickyHeader thead {\n position: sticky;\n top: 0;\n z-index: 2;\n background-color: var(--aegis-color-surface-default);\n}\n\n/* Comfortable density */\n.comfortable th,\n.comfortable td {\n padding: var(--aegis-space-4) var(--aegis-space-5);\n height: var(--aegis-size-control-lg);\n}\n\n/* Sort button */\n.sortButton {\n display: inline-flex;\n align-items: center;\n gap: var(--aegis-space-1);\n border: none;\n background: transparent;\n cursor: pointer;\n padding: 0;\n font: inherit;\n color: inherit;\n font-weight: var(--aegis-font-weight-medium);\n white-space: nowrap;\n}\n\n.sortButton:hover {\n color: var(--aegis-color-text-primary);\n}\n\n.sortButton:focus-visible {\n outline: var(--aegis-border-width-medium) solid var(--aegis-focus-outline-color);\n outline-offset: 2px;\n border-radius: var(--aegis-radius-sm);\n}\n\n.sortIcon {\n display: inline-flex;\n align-items: center;\n flex-shrink: 0;\n}\n\n/* Checkbox */\n.checkbox {\n width: 16px;\n height: 16px;\n cursor: pointer;\n accent-color: var(--aegis-color-brand-primary-500);\n}\n\n/* Selected row */\n.selectedRow {\n background-color: var(--aegis-color-brand-primary-50, rgba(59, 130, 246, 0.06)) !important;\n}\n\n/* Clickable row */\n.clickableRow {\n cursor: pointer;\n}\n\n.clickableRow:hover {\n background-color: var(--aegis-color-neutral-100);\n}\n","import { type ReactNode, useId } from 'react';\nimport { cn } from '../../utils/cn';\nimport { Label } from '../Label';\nimport { HelperText } from '../HelperText';\nimport styles from './FormField.module.css';\n\nexport interface FormFieldProps {\n /** Label text for the field */\n label?: string;\n /** HTML for attribute to associate label with input */\n htmlFor?: string;\n /** Mark field as required */\n required?: boolean;\n /** Error message string — renders HelperText in error state */\n error?: string;\n /** Helper text displayed below the input */\n helperText?: string;\n /** The form control element (Input, Select, Textarea, etc.) */\n children: ReactNode;\n /** Disabled state — visually dims the field */\n disabled?: boolean;\n /** Additional CSS class */\n className?: string;\n}\n\n/**\n * FormField — composable wrapper that renders Label + input + HelperText/error.\n *\n * Accessibility:\n * - Generates aria-describedby linking between input and helper/error text\n * - Error messages use role=\"alert\" via HelperText\n * - Required indicator on Label\n * - Disabled state dims the entire field\n */\nexport function FormField({\n label,\n htmlFor,\n required,\n error,\n helperText,\n children,\n disabled,\n className,\n}: FormFieldProps) {\n const generatedId = useId();\n const descriptionId = `${generatedId}-description`;\n const hasDescription = Boolean(error || helperText);\n\n return (\n <div className={cn(styles.formField, disabled && styles.disabled, className)}>\n {label && (\n <Label htmlFor={htmlFor} required={required}>\n {label}\n </Label>\n )}\n <div className={styles.control} data-describedby={hasDescription ? descriptionId : undefined}>\n {children}\n </div>\n {(error || helperText) && (\n <HelperText id={descriptionId} error={Boolean(error)}>\n {error || helperText}\n </HelperText>\n )}\n </div>\n );\n}\n",".formField {\n display: flex;\n flex-direction: column;\n gap: 0;\n width: 100%;\n}\n\n.control {\n width: 100%;\n}\n\n.disabled {\n opacity: var(--aegis-opacity-disabled);\n pointer-events: none;\n}\n","import { forwardRef, type InputHTMLAttributes } from 'react';\nimport { cn } from '../../utils/cn';\nimport styles from './SearchField.module.css';\n\nexport interface SearchFieldProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'size' | 'type'> {\n /** Size of the search control */\n size?: 'sm' | 'md' | 'lg';\n /** Error state */\n error?: boolean;\n /** Full width */\n fullWidth?: boolean;\n /** Callback when clear button is clicked */\n onClear?: () => void;\n /** Show the clear button when input has a value */\n showClearButton?: boolean;\n}\n\n/**\n * SearchField — search input with magnifying glass icon and optional clear button.\n *\n * Accessibility:\n * - Uses role=\"searchbox\" for semantic search intent\n * - Clear button has aria-label for screen readers\n * - Search icon is decorative (aria-hidden)\n */\nexport const SearchField = forwardRef<HTMLInputElement, SearchFieldProps>(\n (\n {\n size = 'md',\n error = false,\n fullWidth = false,\n onClear,\n showClearButton = true,\n className,\n value,\n defaultValue,\n ...props\n },\n ref,\n ) => {\n const hasValue = Boolean(value || defaultValue);\n\n return (\n <div className={cn(styles.wrapper, styles[size], fullWidth && styles.fullWidth, className)}>\n <svg\n className={styles.searchIcon}\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <circle cx=\"6.5\" cy=\"6.5\" r=\"5.5\" />\n <path d=\"M11 11l4 4\" />\n </svg>\n <input\n ref={ref}\n type=\"search\"\n role=\"searchbox\"\n className={cn(styles.input, error && styles.error)}\n value={value}\n defaultValue={defaultValue}\n aria-invalid={error || undefined}\n {...props}\n />\n {showClearButton && hasValue && onClear && (\n <button\n type=\"button\"\n className={styles.clearButton}\n onClick={onClear}\n aria-label=\"Clear search\"\n tabIndex={-1}\n >\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M3 3l8 8M11 3l-8 8\" />\n </svg>\n </button>\n )}\n </div>\n );\n },\n);\n\nSearchField.displayName = 'SearchField';\n",".wrapper {\n position: relative;\n display: inline-flex;\n align-items: center;\n width: auto;\n}\n\n.fullWidth {\n width: 100%;\n}\n\n.searchIcon {\n position: absolute;\n left: var(--aegis-space-3);\n color: var(--aegis-color-text-muted);\n pointer-events: none;\n flex-shrink: 0;\n}\n\n.input {\n display: block;\n width: 100%;\n border: var(--aegis-border-width-hairline) var(--aegis-border-style-default) var(--aegis-color-border-default);\n border-radius: var(--aegis-radius-md);\n background-color: var(--aegis-color-surface-default);\n color: var(--aegis-color-text-primary);\n font-family: var(--aegis-font-family-sans);\n transition:\n border-color var(--aegis-motion-duration-fast) var(--aegis-motion-easing-standard),\n box-shadow var(--aegis-motion-duration-fast) var(--aegis-motion-easing-standard);\n}\n\n.input::placeholder {\n color: var(--aegis-color-text-muted);\n}\n\n.input:hover:not(:disabled):not(:focus) {\n border-color: var(--aegis-color-border-strong);\n}\n\n.input:focus {\n outline: none;\n border-color: var(--aegis-color-brand-primary-500);\n box-shadow: var(--aegis-shadow-focus);\n}\n\n.input:disabled {\n cursor: not-allowed;\n opacity: var(--aegis-opacity-disabled);\n background-color: var(--aegis-color-surface-subtle);\n}\n\n/* Hide native search cancel button */\n.input::-webkit-search-cancel-button {\n display: none;\n}\n\n/* Sizes */\n.sm .input {\n height: var(--aegis-size-control-sm);\n padding: 0 var(--aegis-space-3) 0 calc(var(--aegis-space-3) + 20px);\n font-size: var(--aegis-font-size-body-sm);\n}\n\n.md .input {\n height: var(--aegis-size-control-md);\n padding: 0 var(--aegis-space-4) 0 calc(var(--aegis-space-4) + 20px);\n font-size: var(--aegis-font-size-body-md);\n}\n\n.lg .input {\n height: var(--aegis-size-control-lg);\n padding: 0 var(--aegis-space-4) 0 calc(var(--aegis-space-4) + 22px);\n font-size: var(--aegis-font-size-body-lg);\n}\n\n/* Error */\n.error {\n border-color: var(--aegis-color-error-500);\n}\n\n.error:focus {\n border-color: var(--aegis-color-error-500);\n box-shadow: 0 0 0 3px rgba(194, 58, 58, 0.2);\n}\n\n/* Clear button */\n.clearButton {\n position: absolute;\n right: var(--aegis-space-2);\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n border: none;\n border-radius: var(--aegis-radius-sm);\n background: transparent;\n color: var(--aegis-color-text-muted);\n cursor: pointer;\n padding: 0;\n transition: color var(--aegis-motion-duration-fast) var(--aegis-motion-easing-standard),\n background-color var(--aegis-motion-duration-fast) var(--aegis-motion-easing-standard);\n}\n\n.clearButton:hover {\n color: var(--aegis-color-text-primary);\n background-color: var(--aegis-color-surface-subtle);\n}\n","import { forwardRef, useCallback, type InputHTMLAttributes } from 'react';\nimport { cn } from '../../utils/cn';\nimport styles from './NumberField.module.css';\n\nexport interface NumberFieldProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'size' | 'type' | 'onChange' | 'value' | 'prefix'> {\n /** Current numeric value */\n value?: number;\n /** Change handler */\n onChange?: (value: number) => void;\n /** Minimum allowed value */\n min?: number;\n /** Maximum allowed value */\n max?: number;\n /** Increment step */\n step?: number;\n /** Size variant */\n size?: 'sm' | 'md' | 'lg';\n /** Error state */\n error?: boolean;\n /** Prefix text (e.g., \"$\") */\n prefix?: string;\n /** Suffix text (e.g., \"mg\") */\n suffix?: string;\n}\n\n/**\n * NumberField — numeric input with increment/decrement buttons.\n *\n * Accessibility:\n * - Uses native input[type=\"number\"] for spinbutton role\n * - Increment/decrement buttons have aria-labels\n * - Buttons are hidden from tab order (input handles keyboard)\n * - min/max constraints are communicated to AT\n */\nexport const NumberField = forwardRef<HTMLInputElement, NumberFieldProps>(\n (\n {\n value,\n onChange,\n min,\n max,\n step = 1,\n size = 'md',\n error = false,\n disabled = false,\n prefix,\n suffix,\n className,\n ...props\n },\n ref,\n ) => {\n const clamp = useCallback(\n (v: number) => {\n let clamped = v;\n if (min !== undefined) clamped = Math.max(min, clamped);\n if (max !== undefined) clamped = Math.min(max, clamped);\n return clamped;\n },\n [min, max],\n );\n\n const handleChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const raw = parseFloat(e.target.value);\n if (!isNaN(raw)) onChange?.(clamp(raw));\n },\n [onChange, clamp],\n );\n\n const increment = useCallback(() => {\n if (disabled) return;\n const current = value ?? 0;\n onChange?.(clamp(current + step));\n }, [value, step, onChange, clamp, disabled]);\n\n const decrement = useCallback(() => {\n if (disabled) return;\n const current = value ?? 0;\n onChange?.(clamp(current - step));\n }, [value, step, onChange, clamp, disabled]);\n\n const atMin = min !== undefined && value !== undefined && value <= min;\n const atMax = max !== undefined && value !== undefined && value >= max;\n\n return (\n <div\n className={cn(\n styles.wrapper,\n styles[size],\n error && styles.error,\n disabled && styles.disabled,\n className,\n )}\n >\n {prefix && <span className={styles.prefix}>{prefix}</span>}\n <input\n ref={ref}\n type=\"number\"\n className={styles.input}\n value={value ?? ''}\n onChange={handleChange}\n min={min}\n max={max}\n step={step}\n disabled={disabled}\n aria-invalid={error || undefined}\n {...props}\n />\n {suffix && <span className={styles.suffix}>{suffix}</span>}\n <div className={styles.buttons}>\n <button\n type=\"button\"\n className={styles.button}\n onClick={increment}\n disabled={disabled || atMax}\n aria-label=\"Increment\"\n tabIndex={-1}\n >\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" aria-hidden=\"true\">\n <path d=\"M2 6.5L5 3.5L8 6.5\" />\n </svg>\n </button>\n <button\n type=\"button\"\n className={styles.button}\n onClick={decrement}\n disabled={disabled || atMin}\n aria-label=\"Decrement\"\n tabIndex={-1}\n >\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" aria-hidden=\"true\">\n <path d=\"M2 3.5L5 6.5L8 3.5\" />\n </svg>\n </button>\n </div>\n </div>\n );\n },\n);\n\nNumberField.displayName = 'NumberField';\n",".wrapper {\n position: relative;\n display: inline-flex;\n align-items: center;\n border: var(--aegis-border-width-hairline) var(--aegis-border-style-default) var(--aegis-color-border-default);\n border-radius: var(--aegis-radius-md);\n background-color: var(--aegis-color-surface-default);\n transition:\n border-color var(--aegis-motion-duration-fast) var(--aegis-motion-easing-standard),\n box-shadow var(--aegis-motion-duration-fast) var(--aegis-motion-easing-standard);\n}\n\n.wrapper:hover:not(.disabled) {\n border-color: var(--aegis-color-border-strong);\n}\n\n.wrapper:focus-within {\n border-color: var(--aegis-color-brand-primary-500);\n box-shadow: var(--aegis-shadow-focus);\n}\n\n.input {\n flex: 1;\n min-width: 0;\n border: none;\n background: transparent;\n color: var(--aegis-color-text-primary);\n font-family: var(--aegis-font-family-sans);\n outline: none;\n -moz-appearance: textfield;\n}\n\n.input::-webkit-inner-spin-button,\n.input::-webkit-outer-spin-button {\n -webkit-appearance: none;\n margin: 0;\n}\n\n.input::placeholder {\n color: var(--aegis-color-text-muted);\n}\n\n.prefix,\n.suffix {\n color: var(--aegis-color-text-muted);\n font-family: var(--aegis-font-family-sans);\n flex-shrink: 0;\n user-select: none;\n}\n\n/* Sizes */\n.sm {\n height: var(--aegis-size-control-sm);\n}\n\n.sm .input {\n padding: 0 var(--aegis-space-2);\n font-size: var(--aegis-font-size-body-sm);\n}\n\n.sm .prefix { padding-left: var(--aegis-space-3); font-size: var(--aegis-font-size-body-sm); }\n.sm .suffix { padding-right: var(--aegis-space-2); font-size: var(--aegis-font-size-body-sm); }\n\n.md {\n height: var(--aegis-size-control-md);\n}\n\n.md .input {\n padding: 0 var(--aegis-space-3);\n font-size: var(--aegis-font-size-body-md);\n}\n\n.md .prefix { padding-left: var(--aegis-space-4); font-size: var(--aegis-font-size-body-md); }\n.md .suffix { padding-right: var(--aegis-space-3); font-size: var(--aegis-font-size-body-md); }\n\n.lg {\n height: var(--aegis-size-control-lg);\n}\n\n.lg .input {\n padding: 0 var(--aegis-space-3);\n font-size: var(--aegis-font-size-body-lg);\n}\n\n.lg .prefix { padding-left: var(--aegis-space-4); font-size: var(--aegis-font-size-body-lg); }\n.lg .suffix { padding-right: var(--aegis-space-3); font-size: var(--aegis-font-size-body-lg); }\n\n/* Buttons column */\n.buttons {\n display: flex;\n flex-direction: column;\n border-left: var(--aegis-border-width-hairline) var(--aegis-border-style-default) var(--aegis-color-border-default);\n align-self: stretch;\n}\n\n.button {\n display: flex;\n align-items: center;\n justify-content: center;\n flex: 1;\n width: 28px;\n border: none;\n background: transparent;\n color: var(--aegis-color-text-muted);\n cursor: pointer;\n padding: 0;\n transition: background-color var(--aegis-motion-duration-fast) var(--aegis-motion-easing-standard),\n color var(--aegis-motion-duration-fast) var(--aegis-motion-easing-standard);\n}\n\n.button + .button {\n border-top: var(--aegis-border-width-hairline) var(--aegis-border-style-default) var(--aegis-color-border-default);\n}\n\n.button:hover:not(:disabled) {\n background-color: var(--aegis-color-surface-subtle);\n color: var(--aegis-color-text-primary);\n}\n\n.button:disabled {\n cursor: not-allowed;\n opacity: var(--aegis-opacity-disabled);\n}\n\n/* Error */\n.error {\n border-color: var(--aegis-color-error-500);\n}\n\n.error:focus-within {\n border-color: var(--aegis-color-error-500);\n box-shadow: 0 0 0 3px rgba(194, 58, 58, 0.2);\n}\n\n/* Disabled */\n.disabled {\n cursor: not-allowed;\n opacity: var(--aegis-opacity-disabled);\n background-color: var(--aegis-color-surface-subtle);\n}\n","import { useCallback } from 'react';\nimport { cn } from '../../utils/cn';\nimport { Checkbox } from '../Checkbox';\nimport { HelperText } from '../HelperText';\nimport styles from './CheckboxGroup.module.css';\n\nexport interface CheckboxGroupOption {\n value: string;\n label: string;\n disabled?: boolean;\n}\n\nexport interface CheckboxGroupProps {\n /** Group label rendered as fieldset legend */\n label: string;\n /** Shared name attribute for all checkboxes */\n name: string;\n /** Array of checkbox options */\n options: CheckboxGroupOption[];\n /** Currently selected values */\n value?: string[];\n /** Change handler — receives updated array of selected values */\n onChange?: (value: string[]) => void;\n /** Error message */\n error?: string;\n /** Layout direction */\n orientation?: 'vertical' | 'horizontal';\n /** Disabled state for all checkboxes */\n disabled?: boolean;\n /** Additional CSS class */\n className?: string;\n}\n\n/**\n * CheckboxGroup — group of checkboxes with fieldset/legend for accessibility.\n *\n * Accessibility:\n * - Uses <fieldset> and <legend> for semantic grouping\n * - Error message linked via role=\"alert\"\n * - Each checkbox is individually focusable\n */\nexport function CheckboxGroup({\n label,\n name,\n options,\n value = [],\n onChange,\n error,\n orientation = 'vertical',\n disabled = false,\n className,\n}: CheckboxGroupProps) {\n const handleChange = useCallback(\n (optionValue: string, checked: boolean) => {\n if (!onChange) return;\n const next = checked\n ? [...value, optionValue]\n : value.filter((v) => v !== optionValue);\n onChange(next);\n },\n [value, onChange],\n );\n\n return (\n <fieldset\n className={cn(styles.fieldset, className)}\n disabled={disabled}\n >\n <legend className={styles.legend}>{label}</legend>\n <div className={cn(styles.options, styles[orientation])}>\n {options.map((opt) => (\n <Checkbox\n key={opt.value}\n name={name}\n label={opt.label}\n value={opt.value}\n checked={value.includes(opt.value)}\n onChange={(e) => handleChange(opt.value, e.target.checked)}\n disabled={opt.disabled || disabled}\n error={Boolean(error)}\n />\n ))}\n </div>\n {error && (\n <HelperText error>{error}</HelperText>\n )}\n </fieldset>\n );\n}\n",".fieldset {\n border: none;\n margin: 0;\n padding: 0;\n}\n\n.legend {\n display: block;\n font-family: var(--aegis-font-family-sans);\n font-size: var(--aegis-font-size-label-lg);\n font-weight: var(--aegis-font-weight-medium);\n line-height: var(--aegis-line-height-label-lg);\n color: var(--aegis-color-text-primary);\n margin-bottom: var(--aegis-space-2);\n padding: 0;\n}\n\n.options {\n display: flex;\n}\n\n.vertical {\n flex-direction: column;\n gap: var(--aegis-space-2);\n}\n\n.horizontal {\n flex-direction: row;\n flex-wrap: wrap;\n gap: var(--aegis-space-4);\n}\n\n.fieldset:disabled {\n opacity: var(--aegis-opacity-disabled);\n}\n","import { useCallback } from 'react';\nimport { cn } from '../../utils/cn';\nimport { Radio } from '../Radio';\nimport { HelperText } from '../HelperText';\nimport styles from './RadioGroup.module.css';\n\nexport interface RadioGroupOption {\n value: string;\n label: string;\n disabled?: boolean;\n}\n\nexport interface RadioGroupProps {\n /** Group label rendered as fieldset legend */\n label: string;\n /** Shared name attribute for all radios */\n name: string;\n /** Array of radio options */\n options: RadioGroupOption[];\n /** Currently selected value */\n value?: string;\n /** Change handler — receives the selected value */\n onChange?: (value: string) => void;\n /** Error message */\n error?: string;\n /** Layout direction */\n orientation?: 'vertical' | 'horizontal';\n /** Disabled state for all radios */\n disabled?: boolean;\n /** Additional CSS class */\n className?: string;\n}\n\n/**\n * RadioGroup — group of radio buttons with fieldset/legend for accessibility.\n *\n * Accessibility:\n * - Uses <fieldset> and <legend> for semantic grouping\n * - Arrow keys navigate between radios within the group\n * - Error message rendered with role=\"alert\"\n */\nexport function RadioGroup({\n label,\n name,\n options,\n value,\n onChange,\n error,\n orientation = 'vertical',\n disabled = false,\n className,\n}: RadioGroupProps) {\n const handleChange = useCallback(\n (optionValue: string) => {\n onChange?.(optionValue);\n },\n [onChange],\n );\n\n return (\n <fieldset\n className={cn(styles.fieldset, className)}\n disabled={disabled}\n >\n <legend className={styles.legend}>{label}</legend>\n <div className={cn(styles.options, styles[orientation])}>\n {options.map((opt) => (\n <Radio\n key={opt.value}\n name={name}\n label={opt.label}\n value={opt.value}\n checked={value === opt.value}\n onChange={() => handleChange(opt.value)}\n disabled={opt.disabled || disabled}\n error={Boolean(error)}\n />\n ))}\n </div>\n {error && (\n <HelperText error>{error}</HelperText>\n )}\n </fieldset>\n );\n}\n",".fieldset {\n border: none;\n margin: 0;\n padding: 0;\n}\n\n.legend {\n display: block;\n font-family: var(--aegis-font-family-sans);\n font-size: var(--aegis-font-size-label-lg);\n font-weight: var(--aegis-font-weight-medium);\n line-height: var(--aegis-line-height-label-lg);\n color: var(--aegis-color-text-primary);\n margin-bottom: var(--aegis-space-2);\n padding: 0;\n}\n\n.options {\n display: flex;\n}\n\n.vertical {\n flex-direction: column;\n gap: var(--aegis-space-2);\n}\n\n.horizontal {\n flex-direction: row;\n flex-wrap: wrap;\n gap: var(--aegis-space-4);\n}\n\n.fieldset:disabled {\n opacity: var(--aegis-opacity-disabled);\n}\n","import { forwardRef, useId, type InputHTMLAttributes } from 'react';\nimport { cn } from '../../utils/cn';\nimport styles from './Slider.module.css';\n\nexport interface SliderProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'size' | 'type' | 'onChange' | 'value'> {\n /** Current value */\n value?: number;\n /** Change handler */\n onChange?: (value: number) => void;\n /** Minimum value */\n min?: number;\n /** Maximum value */\n max?: number;\n /** Step increment */\n step?: number;\n /** Disabled state */\n disabled?: boolean;\n /** Size variant */\n size?: 'sm' | 'md';\n /** Accessible label text */\n label?: string;\n /** Show current value next to the slider */\n showValue?: boolean;\n /** Additional CSS class */\n className?: string;\n}\n\n/**\n * Slider — range input with custom styling.\n *\n * Accessibility:\n * - Uses native input[type=\"range\"] for full keyboard and AT support\n * - Label linked via htmlFor/id\n * - aria-valuemin, aria-valuemax, aria-valuenow communicated natively\n * - showValue provides visual readout of current value\n */\nexport const Slider = forwardRef<HTMLInputElement, SliderProps>(\n (\n {\n value,\n onChange,\n min = 0,\n max = 100,\n step = 1,\n disabled = false,\n size = 'md',\n label,\n showValue = false,\n className,\n id,\n ...props\n },\n ref,\n ) => {\n const generatedId = useId();\n const inputId = id || generatedId;\n\n // Calculate fill percentage for the track\n const current = value ?? min;\n const percentage = ((current - min) / (max - min)) * 100;\n\n return (\n <div className={cn(styles.wrapper, styles[size], disabled && styles.disabled, className)}>\n {label && (\n <div className={styles.header}>\n <label htmlFor={inputId} className={styles.label}>\n {label}\n </label>\n {showValue && (\n <span className={styles.value} aria-hidden=\"true\">\n {current}\n </span>\n )}\n </div>\n )}\n {!label && showValue && (\n <span className={styles.value} aria-hidden=\"true\">\n {current}\n </span>\n )}\n <input\n ref={ref}\n id={inputId}\n type=\"range\"\n className={styles.input}\n value={value}\n onChange={(e) => onChange?.(Number(e.target.value))}\n min={min}\n max={max}\n step={step}\n disabled={disabled}\n style={{ '--slider-fill': `${percentage}%` } as React.CSSProperties}\n {...props}\n />\n </div>\n );\n },\n);\n\nSlider.displayName = 'Slider';\n",".wrapper {\n display: flex;\n flex-direction: column;\n gap: var(--aegis-space-2);\n width: 100%;\n}\n\n.header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n}\n\n.label {\n font-family: var(--aegis-font-family-sans);\n font-size: var(--aegis-font-size-label-lg);\n font-weight: var(--aegis-font-weight-medium);\n line-height: var(--aegis-line-height-label-lg);\n color: var(--aegis-color-text-primary);\n}\n\n.value {\n font-family: var(--aegis-font-family-sans);\n font-size: var(--aegis-font-size-body-sm);\n font-weight: var(--aegis-font-weight-medium);\n color: var(--aegis-color-text-muted);\n min-width: 2ch;\n text-align: right;\n}\n\n/* Range input */\n.input {\n -webkit-appearance: none;\n appearance: none;\n width: 100%;\n background: transparent;\n cursor: pointer;\n margin: 0;\n}\n\n.input:focus {\n outline: none;\n}\n\n/* Track — WebKit */\n.input::-webkit-slider-runnable-track {\n border-radius: var(--aegis-radius-full);\n background: linear-gradient(\n to right,\n var(--aegis-color-brand-primary-500) 0%,\n var(--aegis-color-brand-primary-500) var(--slider-fill, 0%),\n var(--aegis-color-border-default) var(--slider-fill, 0%),\n var(--aegis-color-border-default) 100%\n );\n}\n\n/* Track — Firefox */\n.input::-moz-range-track {\n border-radius: var(--aegis-radius-full);\n background: var(--aegis-color-border-default);\n}\n\n.input::-moz-range-progress {\n border-radius: var(--aegis-radius-full);\n background: var(--aegis-color-brand-primary-500);\n}\n\n/* Thumb — WebKit */\n.input::-webkit-slider-thumb {\n -webkit-appearance: none;\n appearance: none;\n border-radius: var(--aegis-radius-full);\n background-color: var(--aegis-color-surface-default);\n border: 2px solid var(--aegis-color-brand-primary-500);\n box-shadow: var(--aegis-shadow-sm);\n transition:\n box-shadow var(--aegis-motion-duration-fast) var(--aegis-motion-easing-standard),\n transform var(--aegis-motion-duration-fast) var(--aegis-motion-easing-standard);\n}\n\n.input::-webkit-slider-thumb:hover {\n transform: scale(1.15);\n box-shadow: var(--aegis-shadow-md);\n}\n\n.input:focus-visible::-webkit-slider-thumb {\n box-shadow: var(--aegis-shadow-focus);\n}\n\n/* Thumb — Firefox */\n.input::-moz-range-thumb {\n border-radius: var(--aegis-radius-full);\n background-color: var(--aegis-color-surface-default);\n border: 2px solid var(--aegis-color-brand-primary-500);\n box-shadow: var(--aegis-shadow-sm);\n transition:\n box-shadow var(--aegis-motion-duration-fast) var(--aegis-motion-easing-standard),\n transform var(--aegis-motion-duration-fast) var(--aegis-motion-easing-standard);\n}\n\n.input::-moz-range-thumb:hover {\n transform: scale(1.15);\n box-shadow: var(--aegis-shadow-md);\n}\n\n.input:focus-visible::-moz-range-thumb {\n box-shadow: var(--aegis-shadow-focus);\n}\n\n/* Size: sm */\n.sm .input::-webkit-slider-runnable-track { height: 4px; }\n.sm .input::-moz-range-track { height: 4px; }\n.sm .input::-moz-range-progress { height: 4px; }\n.sm .input::-webkit-slider-thumb { width: 14px; height: 14px; margin-top: -5px; }\n.sm .input::-moz-range-thumb { width: 14px; height: 14px; }\n\n/* Size: md */\n.md .input::-webkit-slider-runnable-track { height: 6px; }\n.md .input::-moz-range-track { height: 6px; }\n.md .input::-moz-range-progress { height: 6px; }\n.md .input::-webkit-slider-thumb { width: 18px; height: 18px; margin-top: -6px; }\n.md .input::-moz-range-thumb { width: 18px; height: 18px; }\n\n/* Disabled */\n.disabled {\n opacity: var(--aegis-opacity-disabled);\n pointer-events: none;\n}\n","import { useCallback, useRef, useState, type DragEvent, type KeyboardEvent } from 'react';\nimport { cn } from '../../utils/cn';\nimport { HelperText } from '../HelperText';\nimport styles from './FileUpload.module.css';\n\nexport interface FileUploadProps {\n /** Accepted file types (e.g., \".pdf,.jpg,image/*\") */\n accept?: string;\n /** Allow multiple files */\n multiple?: boolean;\n /** Max file size in bytes */\n maxSize?: number;\n /** Callback when files are selected or dropped */\n onFilesSelected?: (files: File[]) => void;\n /** Disabled state */\n disabled?: boolean;\n /** Error message */\n error?: string;\n /** Additional CSS class */\n className?: string;\n}\n\nfunction formatFileSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\n/**\n * FileUpload — dropzone for file upload with click and drag support.\n *\n * Accessibility:\n * - Keyboard accessible via Enter/Space to open file dialog\n * - Uses role=\"button\" on the dropzone\n * - aria-describedby links to instructions\n * - File list announced after selection\n */\nexport function FileUpload({\n accept,\n multiple = false,\n maxSize,\n onFilesSelected,\n disabled = false,\n error,\n className,\n}: FileUploadProps) {\n const inputRef = useRef<HTMLInputElement>(null);\n const [isDragging, setIsDragging] = useState(false);\n const [files, setFiles] = useState<File[]>([]);\n const [sizeError, setSizeError] = useState<string | null>(null);\n\n const processFiles = useCallback(\n (fileList: FileList | null) => {\n if (!fileList) return;\n const selected = Array.from(fileList);\n\n if (maxSize) {\n const oversized = selected.filter((f) => f.size > maxSize);\n if (oversized.length > 0) {\n setSizeError(`File(s) exceed maximum size of ${formatFileSize(maxSize)}`);\n return;\n }\n }\n\n setSizeError(null);\n setFiles(selected);\n onFilesSelected?.(selected);\n },\n [maxSize, onFilesSelected],\n );\n\n const handleClick = () => {\n if (!disabled) inputRef.current?.click();\n };\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n handleClick();\n }\n };\n\n const handleDragOver = (e: DragEvent) => {\n e.preventDefault();\n if (!disabled) setIsDragging(true);\n };\n\n const handleDragLeave = (e: DragEvent) => {\n e.preventDefault();\n setIsDragging(false);\n };\n\n const handleDrop = (e: DragEvent) => {\n e.preventDefault();\n setIsDragging(false);\n if (!disabled) processFiles(e.dataTransfer.files);\n };\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n processFiles(e.target.files);\n };\n\n const removeFile = (index: number) => {\n const next = files.filter((_, i) => i !== index);\n setFiles(next);\n onFilesSelected?.(next);\n };\n\n const displayError = error || sizeError;\n\n return (\n <div className={cn(styles.container, className)}>\n <div\n className={cn(\n styles.dropzone,\n isDragging && styles.dragging,\n disabled && styles.disabled,\n displayError && styles.error,\n )}\n role=\"button\"\n tabIndex={disabled ? -1 : 0}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n aria-label={`Upload file${multiple ? 's' : ''}`}\n aria-disabled={disabled}\n >\n <svg\n className={styles.icon}\n width=\"32\"\n height=\"32\"\n viewBox=\"0 0 32 32\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M16 20V8M16 8l-5 5M16 8l5 5\" />\n <path d=\"M4 22v4a2 2 0 002 2h20a2 2 0 002-2v-4\" />\n </svg>\n <p className={styles.text}>\n <span className={styles.link}>Click to upload</span> or drag and drop\n </p>\n {accept && (\n <p className={styles.hint}>{accept.replace(/,/g, ', ')}</p>\n )}\n {maxSize && (\n <p className={styles.hint}>Max size: {formatFileSize(maxSize)}</p>\n )}\n </div>\n\n <input\n ref={inputRef}\n type=\"file\"\n className={styles.input}\n accept={accept}\n multiple={multiple}\n onChange={handleInputChange}\n disabled={disabled}\n tabIndex={-1}\n aria-hidden=\"true\"\n />\n\n {files.length > 0 && (\n <ul className={styles.fileList} aria-label=\"Selected files\">\n {files.map((file, i) => (\n <li key={`${file.name}-${i}`} className={styles.fileItem}>\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M9 1H4a1 1 0 00-1 1v12a1 1 0 001 1h8a1 1 0 001-1V5L9 1z\" />\n <path d=\"M9 1v4h4\" />\n </svg>\n <span className={styles.fileName}>{file.name}</span>\n <span className={styles.fileSize}>{formatFileSize(file.size)}</span>\n <button\n type=\"button\"\n className={styles.removeButton}\n onClick={() => removeFile(i)}\n aria-label={`Remove ${file.name}`}\n >\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" aria-hidden=\"true\">\n <path d=\"M2 2l8 8M10 2l-8 8\" />\n </svg>\n </button>\n </li>\n ))}\n </ul>\n )}\n\n {displayError && (\n <HelperText error>{displayError}</HelperText>\n )}\n </div>\n );\n}\n",".container {\n width: 100%;\n}\n\n.dropzone {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: var(--aegis-space-2);\n padding: var(--aegis-space-8) var(--aegis-space-4);\n border: 2px dashed var(--aegis-color-border-default);\n border-radius: var(--aegis-radius-md);\n background-color: var(--aegis-color-surface-default);\n cursor: pointer;\n transition:\n border-color var(--aegis-motion-duration-fast) var(--aegis-motion-easing-standard),\n background-color var(--aegis-motion-duration-fast) var(--aegis-motion-easing-standard),\n box-shadow var(--aegis-motion-duration-fast) var(--aegis-motion-easing-standard);\n}\n\n.dropzone:hover:not(.disabled) {\n border-color: var(--aegis-color-border-strong);\n background-color: var(--aegis-color-surface-subtle);\n}\n\n.dropzone:focus-visible {\n outline: var(--aegis-border-width-medium) solid var(--aegis-focus-outline-color);\n outline-offset: var(--aegis-focus-ring-offset);\n box-shadow: var(--aegis-shadow-focus);\n}\n\n.dragging {\n border-color: var(--aegis-color-brand-primary-500);\n background-color: var(--aegis-color-surface-subtle);\n box-shadow: var(--aegis-shadow-focus);\n}\n\n.disabled {\n cursor: not-allowed;\n opacity: var(--aegis-opacity-disabled);\n}\n\n.error {\n border-color: var(--aegis-color-error-500);\n}\n\n.icon {\n color: var(--aegis-color-text-muted);\n}\n\n.text {\n font-family: var(--aegis-font-family-sans);\n font-size: var(--aegis-font-size-body-md);\n color: var(--aegis-color-text-primary);\n margin: 0;\n}\n\n.link {\n color: var(--aegis-color-brand-primary-500);\n font-weight: var(--aegis-font-weight-medium);\n text-decoration: underline;\n}\n\n.hint {\n font-family: var(--aegis-font-family-sans);\n font-size: var(--aegis-font-size-body-sm);\n color: var(--aegis-color-text-muted);\n margin: 0;\n}\n\n.input {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n}\n\n/* File list */\n.fileList {\n list-style: none;\n margin: var(--aegis-space-3) 0 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n gap: var(--aegis-space-2);\n}\n\n.fileItem {\n display: flex;\n align-items: center;\n gap: var(--aegis-space-2);\n padding: var(--aegis-space-2) var(--aegis-space-3);\n border: var(--aegis-border-width-hairline) var(--aegis-border-style-default) var(--aegis-color-border-default);\n border-radius: var(--aegis-radius-sm);\n background-color: var(--aegis-color-surface-subtle);\n font-family: var(--aegis-font-family-sans);\n font-size: var(--aegis-font-size-body-sm);\n color: var(--aegis-color-text-primary);\n}\n\n.fileName {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.fileSize {\n color: var(--aegis-color-text-muted);\n flex-shrink: 0;\n}\n\n.removeButton {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 20px;\n height: 20px;\n border: none;\n border-radius: var(--aegis-radius-sm);\n background: transparent;\n color: var(--aegis-color-text-muted);\n cursor: pointer;\n padding: 0;\n flex-shrink: 0;\n transition: color var(--aegis-motion-duration-fast) var(--aegis-motion-easing-standard),\n background-color var(--aegis-motion-duration-fast) var(--aegis-motion-easing-standard);\n}\n\n.removeButton:hover {\n color: var(--aegis-color-error-500);\n background-color: var(--aegis-color-surface-default);\n}\n","import { useCallback, useRef, useEffect, type KeyboardEvent, type ClipboardEvent } from 'react';\nimport { cn } from '../../utils/cn';\nimport styles from './OTPInput.module.css';\n\nexport interface OTPInputProps {\n /** Number of OTP digits */\n length?: number;\n /** Current value string */\n value?: string;\n /** Change handler — receives the full OTP string */\n onChange?: (value: string) => void;\n /** Error state */\n error?: boolean;\n /** Disabled state */\n disabled?: boolean;\n /** Auto-focus first input on mount */\n autoFocus?: boolean;\n /** Additional CSS class */\n className?: string;\n}\n\n/**\n * OTPInput — code/OTP input with separate boxes that auto-advance.\n *\n * Accessibility:\n * - Each digit input has aria-label describing its position\n * - Supports keyboard navigation (Backspace moves to previous)\n * - Paste support fills all boxes at once\n * - Error state communicated via aria-invalid\n */\nexport function OTPInput({\n length = 6,\n value = '',\n onChange,\n error = false,\n disabled = false,\n autoFocus = false,\n className,\n}: OTPInputProps) {\n const inputRefs = useRef<(HTMLInputElement | null)[]>([]);\n\n useEffect(() => {\n if (autoFocus && inputRefs.current[0]) {\n inputRefs.current[0].focus();\n }\n }, [autoFocus]);\n\n const focusInput = useCallback((index: number) => {\n if (index >= 0 && index < length) {\n inputRefs.current[index]?.focus();\n inputRefs.current[index]?.select();\n }\n }, [length]);\n\n const updateValue = useCallback(\n (newValue: string) => {\n onChange?.(newValue.slice(0, length));\n },\n [onChange, length],\n );\n\n const handleInput = useCallback(\n (index: number, digit: string) => {\n if (!/^\\d$/.test(digit)) return;\n\n const chars = value.split('');\n // Fill any gaps with empty strings\n while (chars.length < length) chars.push('');\n chars[index] = digit;\n updateValue(chars.join(''));\n\n // Auto-advance to next input\n if (index < length - 1) {\n focusInput(index + 1);\n }\n },\n [value, length, updateValue, focusInput],\n );\n\n const handleKeyDown = useCallback(\n (index: number, e: KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Backspace') {\n e.preventDefault();\n const chars = value.split('');\n while (chars.length < length) chars.push('');\n\n if (chars[index]) {\n chars[index] = '';\n updateValue(chars.join(''));\n } else if (index > 0) {\n chars[index - 1] = '';\n updateValue(chars.join(''));\n focusInput(index - 1);\n }\n } else if (e.key === 'ArrowLeft') {\n e.preventDefault();\n focusInput(index - 1);\n } else if (e.key === 'ArrowRight') {\n e.preventDefault();\n focusInput(index + 1);\n }\n },\n [value, length, updateValue, focusInput],\n );\n\n const handlePaste = useCallback(\n (e: ClipboardEvent<HTMLInputElement>) => {\n e.preventDefault();\n const pasted = e.clipboardData.getData('text').replace(/\\D/g, '').slice(0, length);\n if (pasted) {\n updateValue(pasted);\n focusInput(Math.min(pasted.length, length - 1));\n }\n },\n [length, updateValue, focusInput],\n );\n\n return (\n <div className={cn(styles.wrapper, error && styles.error, disabled && styles.disabled, className)} role=\"group\" aria-label=\"One-time password\">\n {Array.from({ length }, (_, i) => (\n <input\n key={i}\n ref={(el) => { inputRefs.current[i] = el; }}\n type=\"text\"\n inputMode=\"numeric\"\n autoComplete=\"one-time-code\"\n maxLength={1}\n className={styles.digit}\n value={value[i] || ''}\n onChange={(e) => {\n const v = e.target.value;\n if (v.length <= 1) handleInput(i, v);\n }}\n onKeyDown={(e) => handleKeyDown(i, e)}\n onPaste={handlePaste}\n onFocus={(e) => e.target.select()}\n disabled={disabled}\n aria-label={`Digit ${i + 1} of ${length}`}\n aria-invalid={error || undefined}\n />\n ))}\n </div>\n );\n}\n",".wrapper {\n display: inline-flex;\n gap: var(--aegis-space-2);\n}\n\n.digit {\n width: 44px;\n height: 52px;\n border: var(--aegis-border-width-hairline) var(--aegis-border-style-default) var(--aegis-color-border-default);\n border-radius: var(--aegis-radius-md);\n background-color: var(--aegis-color-surface-default);\n color: var(--aegis-color-text-primary);\n font-family: var(--aegis-font-family-sans);\n font-size: var(--aegis-font-size-body-lg);\n font-weight: var(--aegis-font-weight-medium);\n text-align: center;\n caret-color: var(--aegis-color-brand-primary-500);\n transition:\n border-color var(--aegis-motion-duration-fast) var(--aegis-motion-easing-standard),\n box-shadow var(--aegis-motion-duration-fast) var(--aegis-motion-easing-standard);\n}\n\n.digit:hover:not(:disabled):not(:focus) {\n border-color: var(--aegis-color-border-strong);\n}\n\n.digit:focus {\n outline: none;\n border-color: var(--aegis-color-brand-primary-500);\n box-shadow: var(--aegis-shadow-focus);\n}\n\n.digit:disabled {\n cursor: not-allowed;\n opacity: var(--aegis-opacity-disabled);\n background-color: var(--aegis-color-surface-subtle);\n}\n\n/* Error */\n.error .digit {\n border-color: var(--aegis-color-error-500);\n}\n\n.error .digit:focus {\n border-color: var(--aegis-color-error-500);\n box-shadow: 0 0 0 3px rgba(194, 58, 58, 0.2);\n}\n\n/* Disabled */\n.disabled {\n opacity: var(--aegis-opacity-disabled);\n}\n","import { forwardRef, type InputHTMLAttributes } from 'react';\nimport { cn } from '../../utils/cn';\nimport styles from './DatePicker.module.css';\n\nexport interface DatePickerProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'size' | 'type'> {\n /** Size variant */\n size?: 'sm' | 'md' | 'lg';\n /** Error state */\n error?: boolean;\n /** Full width */\n fullWidth?: boolean;\n /** Minimum date (ISO format YYYY-MM-DD) */\n min?: string;\n /** Maximum date (ISO format YYYY-MM-DD) */\n max?: string;\n}\n\n/**\n * DatePicker — styled native date input for consistent appearance.\n *\n * Accessibility:\n * - Uses native input[type=\"date\"] for built-in AT support\n * - Date picker popup provided by the browser\n * - aria-invalid signals error state\n * - Consistent sizing with other Aegis form controls\n */\nexport const DatePicker = forwardRef<HTMLInputElement, DatePickerProps>(\n ({ size = 'md', error = false, fullWidth = false, className, min, max, ...props }, ref) => (\n <div className={cn(styles.wrapper, styles[size], fullWidth && styles.fullWidth, className)}>\n <input\n ref={ref}\n type=\"date\"\n className={cn(styles.input, error && styles.error)}\n min={min}\n max={max}\n aria-invalid={error || undefined}\n {...props}\n />\n <svg\n className={styles.icon}\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <rect x=\"2\" y=\"3\" width=\"12\" height=\"11\" rx=\"1\" />\n <path d=\"M5 1v3M11 1v3M2 7h12\" />\n </svg>\n </div>\n ),\n);\n\nDatePicker.displayName = 'DatePicker';\n",".wrapper {\n position: relative;\n display: inline-flex;\n align-items: center;\n width: auto;\n}\n\n.fullWidth {\n width: 100%;\n}\n\n.input {\n display: block;\n width: 100%;\n border: var(--aegis-border-width-hairline) var(--aegis-border-style-default) var(--aegis-color-border-default);\n border-radius: var(--aegis-radius-md);\n background-color: var(--aegis-color-surface-default);\n color: var(--aegis-color-text-primary);\n font-family: var(--aegis-font-family-sans);\n transition:\n border-color var(--aegis-motion-duration-fast) var(--aegis-motion-easing-standard),\n box-shadow var(--aegis-motion-duration-fast) var(--aegis-motion-easing-standard);\n}\n\n.input:hover:not(:disabled):not(:focus) {\n border-color: var(--aegis-color-border-strong);\n}\n\n.input:focus {\n outline: none;\n border-color: var(--aegis-color-brand-primary-500);\n box-shadow: var(--aegis-shadow-focus);\n}\n\n.input:disabled {\n cursor: not-allowed;\n opacity: var(--aegis-opacity-disabled);\n background-color: var(--aegis-color-surface-subtle);\n}\n\n/* Hide native calendar icon in WebKit browsers */\n.input::-webkit-calendar-picker-indicator {\n opacity: 0;\n position: absolute;\n right: 0;\n top: 0;\n width: 100%;\n height: 100%;\n cursor: pointer;\n}\n\n.icon {\n position: absolute;\n right: var(--aegis-space-3);\n color: var(--aegis-color-text-muted);\n pointer-events: none;\n flex-shrink: 0;\n}\n\n/* Sizes */\n.sm .input {\n height: var(--aegis-size-control-sm);\n padding: 0 calc(var(--aegis-space-3) + 20px) 0 var(--aegis-space-3);\n font-size: var(--aegis-font-size-body-sm);\n}\n\n.md .input {\n height: var(--aegis-size-control-md);\n padding: 0 calc(var(--aegis-space-4) + 20px) 0 var(--aegis-space-4);\n font-size: var(--aegis-font-size-body-md);\n}\n\n.lg .input {\n height: var(--aegis-size-control-lg);\n padding: 0 calc(var(--aegis-space-4) + 22px) 0 var(--aegis-space-4);\n font-size: var(--aegis-font-size-body-lg);\n}\n\n/* Error */\n.error {\n border-color: var(--aegis-color-error-500);\n}\n\n.error:focus {\n border-color: var(--aegis-color-error-500);\n box-shadow: 0 0 0 3px rgba(194, 58, 58, 0.2);\n}\n","import { useState, useRef, useCallback, useEffect, useId, type KeyboardEvent } from 'react';\nimport { cn } from '../../utils/cn';\nimport styles from './MultiSelect.module.css';\n\nexport interface MultiSelectOption {\n value: string;\n label: string;\n}\n\nexport interface MultiSelectProps {\n /** Available options */\n options: MultiSelectOption[];\n /** Currently selected values */\n value?: string[];\n /** Change handler — receives updated array of selected values */\n onChange?: (value: string[]) => void;\n /** Placeholder text */\n placeholder?: string;\n /** Disabled state */\n disabled?: boolean;\n /** Error state */\n error?: boolean;\n /** Size variant */\n size?: 'sm' | 'md' | 'lg';\n /** Maximum number of tags visible before showing \"+N more\" */\n maxDisplayedTags?: number;\n /** Additional CSS class */\n className?: string;\n}\n\n/**\n * MultiSelect — multi-value select with tags and dropdown checkboxes.\n *\n * Accessibility:\n * - Uses role=\"combobox\" with aria-expanded\n * - Dropdown uses role=\"listbox\" with role=\"option\" items\n * - Tags are removable via keyboard (Backspace removes last)\n * - Escape closes dropdown, focus remains on control\n */\nexport function MultiSelect({\n options,\n value = [],\n onChange,\n placeholder = 'Select...',\n disabled = false,\n error = false,\n size = 'md',\n maxDisplayedTags,\n className,\n}: MultiSelectProps) {\n const [isOpen, setIsOpen] = useState(false);\n const [focusedIndex, setFocusedIndex] = useState(-1);\n const wrapperRef = useRef<HTMLDivElement>(null);\n const listboxId = useId();\n\n const toggle = useCallback(\n (optionValue: string) => {\n if (!onChange) return;\n const next = value.includes(optionValue)\n ? value.filter((v) => v !== optionValue)\n : [...value, optionValue];\n onChange(next);\n },\n [value, onChange],\n );\n\n const removeTag = useCallback(\n (optionValue: string) => {\n onChange?.(value.filter((v) => v !== optionValue));\n },\n [value, onChange],\n );\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent) => {\n if (disabled) return;\n\n switch (e.key) {\n case 'Enter':\n case ' ':\n e.preventDefault();\n if (isOpen && focusedIndex >= 0) {\n toggle(options[focusedIndex].value);\n } else {\n setIsOpen(!isOpen);\n }\n break;\n case 'Escape':\n e.preventDefault();\n setIsOpen(false);\n break;\n case 'ArrowDown':\n e.preventDefault();\n if (!isOpen) {\n setIsOpen(true);\n setFocusedIndex(0);\n } else {\n setFocusedIndex((prev) => Math.min(prev + 1, options.length - 1));\n }\n break;\n case 'ArrowUp':\n e.preventDefault();\n setFocusedIndex((prev) => Math.max(prev - 1, 0));\n break;\n case 'Backspace':\n if (value.length > 0) {\n onChange?.(value.slice(0, -1));\n }\n break;\n }\n },\n [disabled, isOpen, focusedIndex, options, value, onChange, toggle],\n );\n\n // Close on outside click\n useEffect(() => {\n if (!isOpen) return;\n const handleClick = (e: MouseEvent) => {\n if (wrapperRef.current && !wrapperRef.current.contains(e.target as Node)) {\n setIsOpen(false);\n }\n };\n document.addEventListener('mousedown', handleClick);\n return () => document.removeEventListener('mousedown', handleClick);\n }, [isOpen]);\n\n const selectedLabels = value\n .map((v) => options.find((o) => o.value === v))\n .filter(Boolean) as MultiSelectOption[];\n\n const displayedTags = maxDisplayedTags\n ? selectedLabels.slice(0, maxDisplayedTags)\n : selectedLabels;\n const hiddenCount = maxDisplayedTags\n ? Math.max(0, selectedLabels.length - maxDisplayedTags)\n : 0;\n\n return (\n <div ref={wrapperRef} className={cn(styles.wrapper, styles[size], className)}>\n <div\n className={cn(\n styles.control,\n isOpen && styles.open,\n error && styles.error,\n disabled && styles.disabled,\n )}\n role=\"combobox\"\n aria-expanded={isOpen}\n aria-haspopup=\"listbox\"\n aria-controls={listboxId}\n aria-disabled={disabled}\n tabIndex={disabled ? -1 : 0}\n onClick={() => !disabled && setIsOpen(!isOpen)}\n onKeyDown={handleKeyDown}\n >\n <div className={styles.tags}>\n {displayedTags.length === 0 && (\n <span className={styles.placeholder}>{placeholder}</span>\n )}\n {displayedTags.map((opt) => (\n <span key={opt.value} className={styles.tag}>\n {opt.label}\n <button\n type=\"button\"\n className={styles.tagRemove}\n onClick={(e) => {\n e.stopPropagation();\n removeTag(opt.value);\n }}\n aria-label={`Remove ${opt.label}`}\n tabIndex={-1}\n >\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" aria-hidden=\"true\">\n <path d=\"M2 2l6 6M8 2l-6 6\" />\n </svg>\n </button>\n </span>\n ))}\n {hiddenCount > 0 && (\n <span className={styles.moreTag}>+{hiddenCount} more</span>\n )}\n </div>\n <svg\n className={cn(styles.chevron, isOpen && styles.chevronOpen)}\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M3 5l4 4 4-4\" />\n </svg>\n </div>\n\n {isOpen && (\n <ul id={listboxId} className={styles.dropdown} role=\"listbox\" aria-multiselectable=\"true\">\n {options.map((opt, i) => {\n const isSelected = value.includes(opt.value);\n const isFocused = i === focusedIndex;\n return (\n <li\n key={opt.value}\n className={cn(styles.option, isFocused && styles.optionFocused)}\n role=\"option\"\n aria-selected={isSelected}\n onClick={() => toggle(opt.value)}\n >\n <span className={cn(styles.checkbox, isSelected && styles.checkboxChecked)} aria-hidden=\"true\">\n {isSelected && (\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M2 5l2 2 4-4\" />\n </svg>\n )}\n </span>\n {opt.label}\n </li>\n );\n })}\n </ul>\n )}\n </div>\n );\n}\n",".wrapper {\n position: relative;\n width: 100%;\n}\n\n.control {\n display: flex;\n align-items: center;\n gap: var(--aegis-space-2);\n min-height: var(--aegis-size-control-md);\n border: var(--aegis-border-width-hairline) var(--aegis-border-style-default) var(--aegis-color-border-default);\n border-radius: var(--aegis-radius-md);\n background-color: var(--aegis-color-surface-default);\n cursor: pointer;\n transition:\n border-color var(--aegis-motion-duration-fast) var(--aegis-motion-easing-standard),\n box-shadow var(--aegis-motion-duration-fast) var(--aegis-motion-easing-standard);\n}\n\n.control:hover:not(.disabled) {\n border-color: var(--aegis-color-border-strong);\n}\n\n.control:focus {\n outline: none;\n border-color: var(--aegis-color-brand-primary-500);\n box-shadow: var(--aegis-shadow-focus);\n}\n\n.open {\n border-color: var(--aegis-color-brand-primary-500);\n box-shadow: var(--aegis-shadow-focus);\n}\n\n.error {\n border-color: var(--aegis-color-error-500);\n}\n\n.error:focus,\n.error.open {\n border-color: var(--aegis-color-error-500);\n box-shadow: 0 0 0 3px rgba(194, 58, 58, 0.2);\n}\n\n.disabled {\n cursor: not-allowed;\n opacity: var(--aegis-opacity-disabled);\n background-color: var(--aegis-color-surface-subtle);\n}\n\n/* Size variants */\n.sm .control {\n min-height: var(--aegis-size-control-sm);\n padding: var(--aegis-space-1) var(--aegis-space-3);\n font-size: var(--aegis-font-size-body-sm);\n}\n\n.md .control {\n min-height: var(--aegis-size-control-md);\n padding: var(--aegis-space-1) var(--aegis-space-4);\n font-size: var(--aegis-font-size-body-md);\n}\n\n.lg .control {\n min-height: var(--aegis-size-control-lg);\n padding: var(--aegis-space-2) var(--aegis-space-4);\n font-size: var(--aegis-font-size-body-lg);\n}\n\n.tags {\n display: flex;\n flex-wrap: wrap;\n gap: var(--aegis-space-1);\n flex: 1;\n align-items: center;\n min-width: 0;\n}\n\n.placeholder {\n color: var(--aegis-color-text-muted);\n font-family: var(--aegis-font-family-sans);\n}\n\n.tag {\n display: inline-flex;\n align-items: center;\n gap: var(--aegis-space-1);\n padding: 2px var(--aegis-space-2);\n border-radius: var(--aegis-radius-sm);\n background-color: var(--aegis-color-surface-subtle);\n border: var(--aegis-border-width-hairline) var(--aegis-border-style-default) var(--aegis-color-border-default);\n font-family: var(--aegis-font-family-sans);\n font-size: var(--aegis-font-size-body-sm);\n color: var(--aegis-color-text-primary);\n line-height: 1.4;\n}\n\n.tagRemove {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 14px;\n height: 14px;\n border: none;\n border-radius: 2px;\n background: transparent;\n color: var(--aegis-color-text-muted);\n cursor: pointer;\n padding: 0;\n transition: color var(--aegis-motion-duration-fast) var(--aegis-motion-easing-standard);\n}\n\n.tagRemove:hover {\n color: var(--aegis-color-error-500);\n}\n\n.moreTag {\n font-family: var(--aegis-font-family-sans);\n font-size: var(--aegis-font-size-body-sm);\n color: var(--aegis-color-text-muted);\n font-weight: var(--aegis-font-weight-medium);\n}\n\n.chevron {\n color: var(--aegis-color-text-muted);\n flex-shrink: 0;\n transition: transform var(--aegis-motion-duration-fast) var(--aegis-motion-easing-standard);\n}\n\n.chevronOpen {\n transform: rotate(180deg);\n}\n\n/* Dropdown */\n.dropdown {\n position: absolute;\n top: 100%;\n left: 0;\n right: 0;\n z-index: 10;\n margin-top: var(--aegis-space-1);\n padding: var(--aegis-space-1) 0;\n list-style: none;\n border: var(--aegis-border-width-hairline) var(--aegis-border-style-default) var(--aegis-color-border-default);\n border-radius: var(--aegis-radius-md);\n background-color: var(--aegis-color-surface-default);\n box-shadow: var(--aegis-shadow-md);\n max-height: 240px;\n overflow-y: auto;\n}\n\n.option {\n display: flex;\n align-items: center;\n gap: var(--aegis-space-2);\n padding: var(--aegis-space-2) var(--aegis-space-3);\n font-family: var(--aegis-font-family-sans);\n font-size: var(--aegis-font-size-body-md);\n color: var(--aegis-color-text-primary);\n cursor: pointer;\n transition: background-color var(--aegis-motion-duration-fast) var(--aegis-motion-easing-standard);\n}\n\n.option:hover,\n.optionFocused {\n background-color: var(--aegis-color-surface-subtle);\n}\n\n.checkbox {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 16px;\n height: 16px;\n border: var(--aegis-border-width-hairline) var(--aegis-border-style-default) var(--aegis-color-border-default);\n border-radius: var(--aegis-radius-sm);\n background-color: var(--aegis-color-surface-default);\n flex-shrink: 0;\n transition:\n background-color var(--aegis-motion-duration-fast) var(--aegis-motion-easing-standard),\n border-color var(--aegis-motion-duration-fast) var(--aegis-motion-easing-standard);\n}\n\n.checkboxChecked {\n background-color: var(--aegis-color-brand-primary-500);\n border-color: var(--aegis-color-brand-primary-500);\n color: var(--aegis-color-text-inverse);\n}\n","import { useState, useRef, useCallback, useEffect, useId, type KeyboardEvent } from 'react';\nimport { cn } from '../../utils/cn';\nimport styles from './Autocomplete.module.css';\n\nexport interface AutocompleteOption {\n value: string;\n label: string;\n}\n\nexport interface AutocompleteProps {\n /** Available options */\n options: AutocompleteOption[];\n /** Selected value */\n value?: string;\n /** Change handler — receives the selected value */\n onChange?: (value: string) => void;\n /** Callback when the text input changes */\n onInputChange?: (inputValue: string) => void;\n /** Placeholder text */\n placeholder?: string;\n /** Disabled state */\n disabled?: boolean;\n /** Error state */\n error?: boolean;\n /** Size variant */\n size?: 'sm' | 'md' | 'lg';\n /** Show a loading spinner in the dropdown */\n loading?: boolean;\n /** Text shown when no results match */\n noResultsText?: string;\n /** Additional CSS class */\n className?: string;\n}\n\n/**\n * Autocomplete — combobox input with filtered suggestions dropdown.\n *\n * Accessibility:\n * - role=\"combobox\" on input with aria-expanded, aria-controls, aria-activedescendant\n * - Dropdown uses role=\"listbox\" with role=\"option\" items\n * - Arrow keys navigate options, Enter selects, Escape closes\n * - Full ARIA combobox pattern per WAI-ARIA 1.2\n */\nexport function Autocomplete({\n options,\n value,\n onChange,\n onInputChange,\n placeholder = 'Search...',\n disabled = false,\n error = false,\n size = 'md',\n loading = false,\n noResultsText = 'No results found',\n className,\n}: AutocompleteProps) {\n const selectedLabel = options.find((o) => o.value === value)?.label ?? '';\n const [inputValue, setInputValue] = useState(selectedLabel);\n const [isOpen, setIsOpen] = useState(false);\n const [focusedIndex, setFocusedIndex] = useState(-1);\n const wrapperRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const listboxId = useId();\n\n // Sync input with external value changes\n useEffect(() => {\n const label = options.find((o) => o.value === value)?.label ?? '';\n setInputValue(label);\n }, [value, options]);\n\n const filteredOptions = options.filter((opt) =>\n opt.label.toLowerCase().includes(inputValue.toLowerCase()),\n );\n\n const handleInputChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const val = e.target.value;\n setInputValue(val);\n setIsOpen(true);\n setFocusedIndex(-1);\n onInputChange?.(val);\n },\n [onInputChange],\n );\n\n const selectOption = useCallback(\n (opt: AutocompleteOption) => {\n setInputValue(opt.label);\n onChange?.(opt.value);\n setIsOpen(false);\n setFocusedIndex(-1);\n inputRef.current?.focus();\n },\n [onChange],\n );\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent<HTMLInputElement>) => {\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault();\n if (!isOpen) {\n setIsOpen(true);\n setFocusedIndex(0);\n } else {\n setFocusedIndex((prev) => Math.min(prev + 1, filteredOptions.length - 1));\n }\n break;\n case 'ArrowUp':\n e.preventDefault();\n setFocusedIndex((prev) => Math.max(prev - 1, 0));\n break;\n case 'Enter':\n e.preventDefault();\n if (isOpen && focusedIndex >= 0 && filteredOptions[focusedIndex]) {\n selectOption(filteredOptions[focusedIndex]);\n }\n break;\n case 'Escape':\n e.preventDefault();\n setIsOpen(false);\n setFocusedIndex(-1);\n break;\n }\n },\n [isOpen, focusedIndex, filteredOptions, selectOption],\n );\n\n // Close on outside click\n useEffect(() => {\n if (!isOpen) return;\n const handleClick = (e: MouseEvent) => {\n if (wrapperRef.current && !wrapperRef.current.contains(e.target as Node)) {\n setIsOpen(false);\n }\n };\n document.addEventListener('mousedown', handleClick);\n return () => document.removeEventListener('mousedown', handleClick);\n }, [isOpen]);\n\n const activeDescendant =\n focusedIndex >= 0 && filteredOptions[focusedIndex]\n ? `${listboxId}-option-${focusedIndex}`\n : undefined;\n\n return (\n <div ref={wrapperRef} className={cn(styles.wrapper, styles[size], className)}>\n <input\n ref={inputRef}\n type=\"text\"\n className={cn(styles.input, error && styles.error)}\n value={inputValue}\n onChange={handleInputChange}\n onFocus={() => setIsOpen(true)}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n disabled={disabled}\n role=\"combobox\"\n aria-expanded={isOpen}\n aria-haspopup=\"listbox\"\n aria-controls={listboxId}\n aria-activedescendant={activeDescendant}\n aria-autocomplete=\"list\"\n aria-invalid={error || undefined}\n autoComplete=\"off\"\n />\n\n {isOpen && (\n <ul id={listboxId} className={styles.dropdown} role=\"listbox\">\n {loading && (\n <li className={styles.message} aria-live=\"polite\">Loading...</li>\n )}\n {!loading && filteredOptions.length === 0 && (\n <li className={styles.message}>{noResultsText}</li>\n )}\n {!loading &&\n filteredOptions.map((opt, i) => (\n <li\n key={opt.value}\n id={`${listboxId}-option-${i}`}\n className={cn(\n styles.option,\n i === focusedIndex && styles.optionFocused,\n opt.value === value && styles.optionSelected,\n )}\n role=\"option\"\n aria-selected={opt.value === value}\n onClick={() => selectOption(opt)}\n >\n {opt.label}\n </li>\n ))}\n </ul>\n )}\n </div>\n );\n}\n",".wrapper {\n position: relative;\n width: 100%;\n}\n\n.input {\n display: block;\n width: 100%;\n border: var(--aegis-border-width-hairline) var(--aegis-border-style-default) var(--aegis-color-border-default);\n border-radius: var(--aegis-radius-md);\n background-color: var(--aegis-color-surface-default);\n color: var(--aegis-color-text-primary);\n font-family: var(--aegis-font-family-sans);\n transition:\n border-color var(--aegis-motion-duration-fast) var(--aegis-motion-easing-standard),\n box-shadow var(--aegis-motion-duration-fast) var(--aegis-motion-easing-standard);\n}\n\n.input::placeholder {\n color: var(--aegis-color-text-muted);\n}\n\n.input:hover:not(:disabled):not(:focus) {\n border-color: var(--aegis-color-border-strong);\n}\n\n.input:focus {\n outline: none;\n border-color: var(--aegis-color-brand-primary-500);\n box-shadow: var(--aegis-shadow-focus);\n}\n\n.input:disabled {\n cursor: not-allowed;\n opacity: var(--aegis-opacity-disabled);\n background-color: var(--aegis-color-surface-subtle);\n}\n\n/* Sizes */\n.sm .input {\n height: var(--aegis-size-control-sm);\n padding: 0 var(--aegis-space-3);\n font-size: var(--aegis-font-size-body-sm);\n}\n\n.md .input {\n height: var(--aegis-size-control-md);\n padding: 0 var(--aegis-space-4);\n font-size: var(--aegis-font-size-body-md);\n}\n\n.lg .input {\n height: var(--aegis-size-control-lg);\n padding: 0 var(--aegis-space-4);\n font-size: var(--aegis-font-size-body-lg);\n}\n\n/* Error */\n.error {\n border-color: var(--aegis-color-error-500);\n}\n\n.error:focus {\n border-color: var(--aegis-color-error-500);\n box-shadow: 0 0 0 3px rgba(194, 58, 58, 0.2);\n}\n\n/* Dropdown */\n.dropdown {\n position: absolute;\n top: 100%;\n left: 0;\n right: 0;\n z-index: 10;\n margin-top: var(--aegis-space-1);\n padding: var(--aegis-space-1) 0;\n list-style: none;\n border: var(--aegis-border-width-hairline) var(--aegis-border-style-default) var(--aegis-color-border-default);\n border-radius: var(--aegis-radius-md);\n background-color: var(--aegis-color-surface-default);\n box-shadow: var(--aegis-shadow-md);\n max-height: 240px;\n overflow-y: auto;\n}\n\n.option {\n padding: var(--aegis-space-2) var(--aegis-space-3);\n font-family: var(--aegis-font-family-sans);\n font-size: var(--aegis-font-size-body-md);\n color: var(--aegis-color-text-primary);\n cursor: pointer;\n transition: background-color var(--aegis-motion-duration-fast) var(--aegis-motion-easing-standard);\n}\n\n.option:hover,\n.optionFocused {\n background-color: var(--aegis-color-surface-subtle);\n}\n\n.optionSelected {\n font-weight: var(--aegis-font-weight-medium);\n color: var(--aegis-color-brand-primary-500);\n}\n\n.message {\n padding: var(--aegis-space-3) var(--aegis-space-3);\n font-family: var(--aegis-font-family-sans);\n font-size: var(--aegis-font-size-body-sm);\n color: var(--aegis-color-text-muted);\n text-align: center;\n}\n",".stepper {\n width: 100%;\n}\n\n.list {\n display: flex;\n list-style: none;\n margin: 0;\n padding: 0;\n}\n\n.srOnly {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n}\n\n/* Horizontal layout */\n.horizontal .list {\n flex-direction: row;\n align-items: flex-start;\n}\n\n.horizontal .step {\n display: flex;\n align-items: flex-start;\n flex: 1;\n}\n\n.horizontal .stepButton {\n display: flex;\n flex-direction: column;\n align-items: center;\n text-align: center;\n gap: var(--aegis-space-2);\n}\n\n.horizontal .connector {\n display: block;\n flex: 1;\n height: 2px;\n margin-top: 16px;\n margin-left: var(--aegis-space-2);\n margin-right: var(--aegis-space-2);\n background-color: var(--aegis-color-border-default);\n transition: background-color var(--aegis-motion-duration-normal) var(--aegis-motion-easing-standard);\n}\n\n/* Vertical layout */\n.vertical .list {\n flex-direction: column;\n}\n\n.vertical .step {\n display: flex;\n flex-direction: column;\n}\n\n.vertical .stepButton {\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: var(--aegis-space-3);\n}\n\n.vertical .connector {\n display: block;\n width: 2px;\n height: 24px;\n margin-left: 15px;\n margin-top: var(--aegis-space-1);\n margin-bottom: var(--aegis-space-1);\n background-color: var(--aegis-color-border-default);\n transition: background-color var(--aegis-motion-duration-normal) var(--aegis-motion-easing-standard);\n}\n\n/* Step button / container */\n.stepButton {\n border: none;\n background: transparent;\n cursor: pointer;\n padding: var(--aegis-space-1);\n border-radius: var(--aegis-radius-sm);\n transition: background-color var(--aegis-motion-duration-fast) var(--aegis-motion-easing-standard);\n font-family: var(--aegis-font-family-sans);\n}\n\nbutton.stepButton:hover {\n background-color: var(--aegis-color-surface-subtle);\n}\n\nbutton.stepButton:focus-visible {\n outline: var(--aegis-border-width-medium) solid var(--aegis-focus-outline-color);\n outline-offset: var(--aegis-focus-ring-offset);\n box-shadow: var(--aegis-shadow-focus);\n}\n\ndiv.stepButton {\n cursor: default;\n}\n\n/* Indicator circle */\n.indicator {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n border-radius: var(--aegis-radius-full);\n border: 2px solid var(--aegis-color-border-default);\n background-color: var(--aegis-color-surface-default);\n font-size: var(--aegis-font-size-body-sm);\n font-weight: var(--aegis-font-weight-medium);\n color: var(--aegis-color-text-muted);\n flex-shrink: 0;\n transition:\n background-color var(--aegis-motion-duration-normal) var(--aegis-motion-easing-standard),\n border-color var(--aegis-motion-duration-normal) var(--aegis-motion-easing-standard),\n color var(--aegis-motion-duration-normal) var(--aegis-motion-easing-standard);\n}\n\n.indicatorCurrent {\n border-color: var(--aegis-color-brand-primary-500);\n color: var(--aegis-color-brand-primary-500);\n box-shadow: var(--aegis-shadow-sm);\n}\n\n.indicatorCompleted {\n border-color: var(--aegis-color-brand-primary-500);\n background-color: var(--aegis-color-brand-primary-500);\n color: var(--aegis-color-text-inverse);\n}\n\n/* Labels */\n.content {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.label {\n font-size: var(--aegis-font-size-body-sm);\n font-weight: var(--aegis-font-weight-medium);\n color: var(--aegis-color-text-muted);\n line-height: var(--aegis-line-height-body-sm);\n}\n\n.labelCurrent {\n color: var(--aegis-color-text-primary);\n font-weight: var(--aegis-font-weight-semibold);\n}\n\n.description {\n font-size: var(--aegis-font-size-body-sm);\n color: var(--aegis-color-text-muted);\n line-height: var(--aegis-line-height-body-sm);\n font-weight: var(--aegis-font-weight-regular);\n}\n\n/* Connector completed state */\n.connectorCompleted {\n background-color: var(--aegis-color-brand-primary-500);\n}\n\n/* Step with connector */\n.stepWithConnector {\n position: relative;\n}\n","import { cn } from '../../utils/cn';\nimport styles from './Stepper.module.css';\n\nexport interface StepperStep {\n label: string;\n description?: string;\n}\n\nexport interface StepperProps {\n /** Array of step definitions */\n steps: StepperStep[];\n /** Currently active step (0-indexed) */\n activeStep: number;\n /** Layout orientation */\n orientation?: 'horizontal' | 'vertical';\n /** Callback when a step is clicked */\n onStepClick?: (stepIndex: number) => void;\n /** Additional CSS class */\n className?: string;\n}\n\n/**\n * Stepper — multi-step form progress indicator.\n *\n * Accessibility:\n * - Uses role=\"navigation\" with aria-label\n * - Each step is a button (when clickable) or div with aria-current=\"step\"\n * - Completed steps indicated via visual checkmark and sr-only text\n * - Step descriptions provide additional context\n */\nexport function Stepper({\n steps,\n activeStep,\n orientation = 'horizontal',\n onStepClick,\n className,\n}: StepperProps) {\n return (\n <nav\n className={cn(styles.stepper, styles[orientation], className)}\n aria-label=\"Progress\"\n >\n <ol className={styles.list}>\n {steps.map((step, index) => {\n const isCompleted = index < activeStep;\n const isCurrent = index === activeStep;\n const isClickable = Boolean(onStepClick);\n\n const stepContent = (\n <>\n <span\n className={cn(\n styles.indicator,\n isCompleted && styles.indicatorCompleted,\n isCurrent && styles.indicatorCurrent,\n )}\n >\n {isCompleted ? (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M3 7l3 3 5-5\" />\n </svg>\n ) : (\n <span aria-hidden=\"true\">{index + 1}</span>\n )}\n </span>\n <span className={styles.content}>\n <span className={cn(styles.label, isCurrent && styles.labelCurrent)}>\n {step.label}\n </span>\n {step.description && (\n <span className={styles.description}>{step.description}</span>\n )}\n </span>\n {isCompleted && <span className={styles.srOnly}>(completed)</span>}\n {isCurrent && <span className={styles.srOnly}>(current step)</span>}\n </>\n );\n\n return (\n <li key={index} className={cn(styles.step, index < steps.length - 1 && styles.stepWithConnector)}>\n {isClickable ? (\n <button\n type=\"button\"\n className={styles.stepButton}\n onClick={() => onStepClick?.(index)}\n aria-current={isCurrent ? 'step' : undefined}\n >\n {stepContent}\n </button>\n ) : (\n <div\n className={styles.stepButton}\n aria-current={isCurrent ? 'step' : undefined}\n >\n {stepContent}\n </div>\n )}\n {index < steps.length - 1 && (\n <span\n className={cn(styles.connector, isCompleted && styles.connectorCompleted)}\n aria-hidden=\"true\"\n />\n )}\n </li>\n );\n })}\n </ol>\n </nav>\n );\n}\n","import { useState, useCallback, useRef, useEffect, type ReactNode } from 'react';\nimport { cn } from '../../utils/cn';\nimport styles from './Accordion.module.css';\n\nexport interface AccordionItem {\n /** Unique identifier */\n id: string;\n /** Header title */\n title: string;\n /** Panel content */\n content: ReactNode;\n}\n\nexport interface AccordionProps {\n /** Accordion items */\n items: AccordionItem[];\n /** Allow multiple panels to be open simultaneously */\n allowMultiple?: boolean;\n /** IDs of panels open by default */\n defaultOpenIds?: string[];\n /** Additional className */\n className?: string;\n}\n\nfunction AccordionPanel({\n item,\n isOpen,\n onToggle,\n}: {\n item: AccordionItem;\n isOpen: boolean;\n onToggle: (id: string) => void;\n}) {\n const contentRef = useRef<HTMLDivElement>(null);\n const [height, setHeight] = useState<number | undefined>(isOpen ? undefined : 0);\n\n useEffect(() => {\n if (!contentRef.current) return;\n if (isOpen) {\n setHeight(contentRef.current.scrollHeight);\n const timer = setTimeout(() => setHeight(undefined), 200);\n return () => clearTimeout(timer);\n } else {\n setHeight(contentRef.current.scrollHeight);\n requestAnimationFrame(() => {\n requestAnimationFrame(() => setHeight(0));\n });\n }\n }, [isOpen]);\n\n const triggerId = `accordion-trigger-${item.id}`;\n const panelId = `accordion-panel-${item.id}`;\n\n return (\n <div className={cn(styles.item, isOpen && styles.open)}>\n <h3 className={styles.heading}>\n <button\n type=\"button\"\n id={triggerId}\n className={styles.trigger}\n aria-expanded={isOpen}\n aria-controls={panelId}\n onClick={() => onToggle(item.id)}\n >\n <span className={styles.triggerLabel}>{item.title}</span>\n <svg\n className={styles.chevron}\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <polyline points=\"6 8 10 12 14 8\" />\n </svg>\n </button>\n </h3>\n <div\n id={panelId}\n role=\"region\"\n aria-labelledby={triggerId}\n className={styles.panel}\n style={{ height: height !== undefined ? `${height}px` : 'auto' }}\n hidden={!isOpen && height === 0}\n >\n <div ref={contentRef} className={styles.panelContent}>\n {item.content}\n </div>\n </div>\n </div>\n );\n}\n\n/**\n * Accordion — expandable/collapsible content sections.\n *\n * Accessibility:\n * - Button triggers with aria-expanded and aria-controls\n * - Content panels have role=\"region\" and aria-labelledby\n * - Animated expand/collapse with proper height transitions\n * - Supports single or multiple open panels\n */\nexport function Accordion({ items, allowMultiple = false, defaultOpenIds = [], className }: AccordionProps) {\n const [openIds, setOpenIds] = useState<Set<string>>(new Set(defaultOpenIds));\n\n const handleToggle = useCallback(\n (id: string) => {\n setOpenIds((prev) => {\n const next = new Set(prev);\n if (next.has(id)) {\n next.delete(id);\n } else {\n if (!allowMultiple) {\n next.clear();\n }\n next.add(id);\n }\n return next;\n });\n },\n [allowMultiple],\n );\n\n return (\n <div className={cn(styles.accordion, className)}>\n {items.map((item) => (\n <AccordionPanel\n key={item.id}\n item={item}\n isOpen={openIds.has(item.id)}\n onToggle={handleToggle}\n />\n ))}\n </div>\n );\n}\n",".accordion {\n font-family: var(--aegis-font-family-sans);\n border: var(--aegis-border-width-hairline) var(--aegis-border-style-default) var(--aegis-color-border-default);\n border-radius: var(--aegis-radius-md);\n overflow: hidden;\n}\n\n.item {\n border-bottom: var(--aegis-border-width-hairline) var(--aegis-border-style-default) var(--aegis-color-border-default);\n}\n\n.item:last-child {\n border-bottom: none;\n}\n\n.heading {\n margin: 0;\n}\n\n.trigger {\n display: flex;\n align-items: center;\n justify-content: space-between;\n width: 100%;\n padding: var(--aegis-space-4);\n background: var(--aegis-color-surface-default);\n border: none;\n cursor: pointer;\n font-family: inherit;\n font-size: var(--aegis-font-size-body-md);\n font-weight: var(--aegis-font-weight-medium);\n line-height: var(--aegis-line-height-body-md);\n color: var(--aegis-color-text-primary);\n text-align: left;\n transition: background-color var(--aegis-motion-duration-fast) var(--aegis-motion-easing-standard);\n}\n\n.trigger:hover {\n background-color: var(--aegis-color-surface-hover);\n}\n\n.trigger:focus-visible {\n outline: var(--aegis-border-width-medium) solid var(--aegis-focus-outline-color);\n outline-offset: calc(-1 * var(--aegis-border-width-medium));\n box-shadow: var(--aegis-shadow-focus);\n z-index: 1;\n position: relative;\n}\n\n.triggerLabel {\n flex: 1;\n min-width: 0;\n}\n\n.chevron {\n flex-shrink: 0;\n color: var(--aegis-color-text-muted);\n transition: transform var(--aegis-motion-duration-fast) var(--aegis-motion-easing-standard);\n}\n\n.open .chevron {\n transform: rotate(180deg);\n}\n\n.panel {\n overflow: hidden;\n transition: height 200ms var(--aegis-motion-easing-standard);\n}\n\n.panelContent {\n padding: 0 var(--aegis-space-4) var(--aegis-space-4);\n font-size: var(--aegis-font-size-body-sm);\n line-height: var(--aegis-line-height-body-sm);\n color: var(--aegis-color-text-secondary);\n}\n",".nav {\n font-family: var(--aegis-font-family-sans);\n}\n\n.list {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: var(--aegis-space-1);\n list-style: none;\n margin: 0;\n padding: 0;\n}\n\n.item {\n display: flex;\n align-items: center;\n gap: var(--aegis-space-1);\n}\n\n.separator {\n color: var(--aegis-color-text-muted);\n font-size: var(--aegis-font-size-body-sm);\n user-select: none;\n}\n\n.link {\n font-size: var(--aegis-font-size-body-sm);\n line-height: var(--aegis-line-height-body-sm);\n color: var(--aegis-color-brand-primary-500);\n text-decoration: none;\n background: none;\n border: none;\n padding: 0;\n cursor: pointer;\n font-family: inherit;\n border-radius: var(--aegis-radius-sm);\n transition: color var(--aegis-motion-duration-fast) var(--aegis-motion-easing-standard);\n}\n\n.link:hover {\n color: var(--aegis-color-brand-primary-700);\n text-decoration: underline;\n}\n\n.link:focus-visible {\n outline: var(--aegis-border-width-medium) solid var(--aegis-focus-outline-color);\n outline-offset: 2px;\n box-shadow: var(--aegis-shadow-focus);\n}\n\n.current {\n font-size: var(--aegis-font-size-body-sm);\n line-height: var(--aegis-line-height-body-sm);\n color: var(--aegis-color-text-primary);\n font-weight: var(--aegis-font-weight-medium);\n}\n","import { type ReactNode } from 'react';\nimport { cn } from '../../utils/cn';\nimport styles from './Breadcrumbs.module.css';\n\nexport interface BreadcrumbItem {\n /** Display label */\n label: string;\n /** Optional URL for link items */\n href?: string;\n /** Optional click handler */\n onClick?: () => void;\n}\n\nexport interface BreadcrumbsProps {\n /** Breadcrumb path items */\n items: BreadcrumbItem[];\n /** Separator between items */\n separator?: ReactNode;\n /** Additional className */\n className?: string;\n}\n\n/**\n * Breadcrumbs — navigational aid showing the current location within a hierarchy.\n *\n * Accessibility:\n * - Wrapped in <nav> with aria-label=\"Breadcrumb\"\n * - Uses semantic <ol>/<li> list structure\n * - Last item has aria-current=\"page\" to indicate current location\n * - Separator is aria-hidden so screen readers skip it\n */\nexport function Breadcrumbs({ items, separator = '/', className }: BreadcrumbsProps) {\n return (\n <nav aria-label=\"Breadcrumb\" className={cn(styles.nav, className)}>\n <ol className={styles.list}>\n {items.map((item, index) => {\n const isLast = index === items.length - 1;\n\n return (\n <li key={index} className={styles.item}>\n {index > 0 && (\n <span className={styles.separator} aria-hidden=\"true\">\n {separator}\n </span>\n )}\n {isLast ? (\n <span className={styles.current} aria-current=\"page\">\n {item.label}\n </span>\n ) : item.href ? (\n <a href={item.href} className={styles.link} onClick={item.onClick}>\n {item.label}\n </a>\n ) : (\n <button\n type=\"button\"\n className={styles.link}\n onClick={item.onClick}\n >\n {item.label}\n </button>\n )}\n </li>\n );\n })}\n </ol>\n </nav>\n );\n}\n",".sideNav {\n display: flex;\n flex-direction: column;\n width: 240px;\n background-color: var(--aegis-color-surface-default);\n border-right: var(--aegis-border-width-hairline) var(--aegis-border-style-default) var(--aegis-color-border-default);\n box-shadow: var(--aegis-shadow-sm);\n font-family: var(--aegis-font-family-sans);\n padding: var(--aegis-space-2) 0;\n transition: width var(--aegis-motion-duration-base) var(--aegis-motion-easing-standard);\n}\n\n.collapsed {\n width: 56px;\n}\n\n.collapseToggle {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n padding: var(--aegis-space-2) var(--aegis-space-3);\n background: none;\n border: none;\n cursor: pointer;\n color: var(--aegis-color-text-muted);\n transition: color var(--aegis-motion-duration-fast) var(--aegis-motion-easing-standard);\n}\n\n.collapseToggle:hover {\n color: var(--aegis-color-text-primary);\n}\n\n.collapseToggle:focus-visible {\n outline: var(--aegis-border-width-medium) solid var(--aegis-focus-outline-color);\n outline-offset: calc(-1 * var(--aegis-border-width-medium));\n box-shadow: var(--aegis-shadow-focus);\n border-radius: var(--aegis-radius-sm);\n}\n\n.list {\n list-style: none;\n margin: 0;\n padding: 0;\n}\n\n.subList {\n list-style: none;\n margin: 0;\n padding: 0;\n}\n\n.navItem {\n display: flex;\n align-items: center;\n gap: var(--aegis-space-3);\n width: 100%;\n padding: var(--aegis-space-2) var(--aegis-space-4);\n background: none;\n border: none;\n font-family: inherit;\n font-size: var(--aegis-font-size-body-sm);\n line-height: var(--aegis-line-height-body-sm);\n font-weight: var(--aegis-font-weight-regular);\n color: var(--aegis-color-text-secondary);\n text-decoration: none;\n cursor: pointer;\n text-align: left;\n transition:\n background-color var(--aegis-motion-duration-fast) var(--aegis-motion-easing-standard),\n color var(--aegis-motion-duration-fast) var(--aegis-motion-easing-standard);\n}\n\n.navItem:hover {\n background-color: var(--aegis-color-surface-hover);\n color: var(--aegis-color-text-primary);\n}\n\n.navItem:focus-visible {\n outline: var(--aegis-border-width-medium) solid var(--aegis-focus-outline-color);\n outline-offset: calc(-1 * var(--aegis-border-width-medium));\n box-shadow: var(--aegis-shadow-focus);\n border-radius: var(--aegis-radius-sm);\n z-index: 1;\n position: relative;\n}\n\n.active {\n background-color: var(--aegis-color-brand-primary-50);\n color: var(--aegis-color-brand-primary-700);\n font-weight: var(--aegis-font-weight-medium);\n}\n\n.active:hover {\n background-color: var(--aegis-color-brand-primary-100);\n}\n\n.nested {\n padding-left: var(--aegis-space-8);\n}\n\n.iconOnly {\n justify-content: center;\n padding: var(--aegis-space-2);\n}\n\n.icon {\n display: flex;\n align-items: center;\n flex-shrink: 0;\n width: 20px;\n height: 20px;\n}\n\n.label {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n","import { type ReactNode } from 'react';\nimport { cn } from '../../utils/cn';\nimport styles from './SideNav.module.css';\n\nexport interface SideNavItem {\n /** Display label */\n label: string;\n /** Optional URL */\n href?: string;\n /** Optional click handler */\n onClick?: () => void;\n /** Optional icon element */\n icon?: ReactNode;\n /** Whether this item is the active/current page */\n active?: boolean;\n /** Nested child items */\n children?: SideNavItem[];\n}\n\nexport interface SideNavProps {\n /** Navigation items */\n items: SideNavItem[];\n /** Whether the sidebar is collapsed to icon-only mode */\n collapsed?: boolean;\n /** Callback when collapse state changes */\n onCollapse?: (collapsed: boolean) => void;\n /** Additional className */\n className?: string;\n}\n\nfunction NavItem({ item, collapsed, depth = 0 }: { item: SideNavItem; collapsed?: boolean; depth?: number }) {\n const hasChildren = item.children && item.children.length > 0;\n\n const content = (\n <>\n {item.icon && (\n <span className={styles.icon} aria-hidden=\"true\">\n {item.icon}\n </span>\n )}\n {!collapsed && <span className={styles.label}>{item.label}</span>}\n </>\n );\n\n const commonProps = {\n className: cn(\n styles.navItem,\n item.active && styles.active,\n collapsed && styles.iconOnly,\n depth > 0 && styles.nested,\n ),\n ...(item.active ? { 'aria-current': 'page' as const } : {}),\n ...(collapsed ? { title: item.label } : {}),\n };\n\n return (\n <li>\n {item.href ? (\n <a href={item.href} onClick={item.onClick} {...commonProps}>\n {content}\n </a>\n ) : (\n <button type=\"button\" onClick={item.onClick} {...commonProps}>\n {content}\n </button>\n )}\n {hasChildren && !collapsed && (\n <ul className={styles.subList}>\n {item.children!.map((child, index) => (\n <NavItem key={index} item={child} collapsed={collapsed} depth={depth + 1} />\n ))}\n </ul>\n )}\n </li>\n );\n}\n\n/**\n * SideNav — vertical sidebar navigation for dashboard layouts.\n *\n * Accessibility:\n * - Semantic <nav> with <ul>/<li> structure\n * - aria-current=\"page\" on the active item\n * - Collapse toggle button with aria-label\n * - Title attribute on items when collapsed for tooltip-style labels\n * - Nested items rendered as sub-lists for proper hierarchy\n */\nexport function SideNav({ items, collapsed = false, onCollapse, className }: SideNavProps) {\n return (\n <nav aria-label=\"Side navigation\" className={cn(styles.sideNav, collapsed && styles.collapsed, className)}>\n {onCollapse && (\n <button\n type=\"button\"\n className={styles.collapseToggle}\n onClick={() => onCollapse(!collapsed)}\n aria-label={collapsed ? 'Expand navigation' : 'Collapse navigation'}\n >\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n {collapsed ? (\n <polyline points=\"8 4 14 10 8 16\" />\n ) : (\n <polyline points=\"12 4 6 10 12 16\" />\n )}\n </svg>\n </button>\n )}\n <ul className={styles.list}>\n {items.map((item, index) => (\n <NavItem key={index} item={item} collapsed={collapsed} />\n ))}\n </ul>\n </nav>\n );\n}\n",".topNav {\n width: 100%;\n height: 56px;\n background-color: var(--aegis-color-surface-default);\n border-bottom: var(--aegis-border-width-hairline) var(--aegis-border-style-default) var(--aegis-color-border-default);\n box-shadow: var(--aegis-shadow-sm);\n font-family: var(--aegis-font-family-sans);\n}\n\n.inner {\n display: flex;\n align-items: center;\n height: 100%;\n padding: 0 var(--aegis-space-5);\n gap: var(--aegis-space-6);\n}\n\n.logo {\n display: flex;\n align-items: center;\n flex-shrink: 0;\n font-size: var(--aegis-font-size-heading-sm);\n font-weight: var(--aegis-font-weight-bold);\n color: var(--aegis-color-text-primary);\n}\n\n.nav {\n display: flex;\n align-items: center;\n gap: var(--aegis-space-1);\n flex: 1;\n min-width: 0;\n}\n\n.actions {\n display: flex;\n align-items: center;\n gap: var(--aegis-space-3);\n flex-shrink: 0;\n margin-left: auto;\n}\n","import { type HTMLAttributes, type ReactNode } from 'react';\nimport { cn } from '../../utils/cn';\nimport styles from './TopNav.module.css';\n\nexport interface TopNavProps extends HTMLAttributes<HTMLElement> {\n /** Logo or brand element */\n logo?: ReactNode;\n /** Navigation items (center/left area) */\n children?: ReactNode;\n /** Action elements on the right (profile, notifications, etc.) */\n actions?: ReactNode;\n}\n\n/**\n * TopNav — horizontal top navigation bar for application headers.\n *\n * Accessibility:\n * - Uses <header> with <nav> for semantic structure\n * - Navigation items should be provided as links or buttons\n * - Fixed height with clean horizontal layout\n */\nexport function TopNav({ logo, children, actions, className, ...props }: TopNavProps) {\n return (\n <header className={cn(styles.topNav, className)} {...props}>\n <div className={styles.inner}>\n {logo && <div className={styles.logo}>{logo}</div>}\n {children && (\n <nav aria-label=\"Main navigation\" className={styles.nav}>\n {children}\n </nav>\n )}\n {actions && <div className={styles.actions}>{actions}</div>}\n </div>\n </header>\n );\n}\n",".card {\n display: flex;\n flex-direction: column;\n gap: var(--aegis-space-2);\n padding: var(--aegis-space-5);\n background-color: var(--aegis-color-surface-default);\n border: var(--aegis-border-width-hairline) var(--aegis-border-style-default) var(--aegis-color-border-default);\n border-radius: var(--aegis-radius-lg);\n font-family: var(--aegis-font-family-sans);\n box-shadow: var(--aegis-shadow-sm);\n}\n\n.header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n}\n\n.label {\n font-size: var(--aegis-font-size-body-sm);\n line-height: var(--aegis-line-height-body-sm);\n color: var(--aegis-color-text-muted);\n font-weight: var(--aegis-font-weight-medium);\n}\n\n.icon {\n display: flex;\n align-items: center;\n color: var(--aegis-color-text-muted);\n}\n\n.value {\n font-size: var(--aegis-font-size-heading-lg);\n line-height: var(--aegis-line-height-heading-lg);\n font-weight: var(--aegis-font-weight-bold);\n color: var(--aegis-color-text-primary);\n}\n\n.trend {\n display: flex;\n align-items: center;\n gap: var(--aegis-space-1);\n font-size: var(--aegis-font-size-body-sm);\n line-height: var(--aegis-line-height-body-sm);\n font-weight: var(--aegis-font-weight-medium);\n}\n\n.up {\n color: var(--aegis-color-success-600);\n}\n\n.down {\n color: var(--aegis-color-error-600);\n}\n\n.neutral {\n color: var(--aegis-color-text-muted);\n}\n\n.changeLabel {\n color: var(--aegis-color-text-muted);\n font-weight: var(--aegis-font-weight-regular);\n}\n\n.srOnly {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border-width: 0;\n}\n","import { type HTMLAttributes, type ReactNode } from 'react';\nimport { cn } from '../../utils/cn';\nimport styles from './StatCard.module.css';\n\nexport interface StatCardProps extends HTMLAttributes<HTMLDivElement> {\n /** Metric label */\n label: string;\n /** Metric value */\n value: string | number;\n /** Percentage change */\n change?: number;\n /** Label for the change (e.g. \"vs last month\") */\n changeLabel?: string;\n /** Trend direction */\n trend?: 'up' | 'down' | 'neutral';\n /** Optional icon */\n icon?: ReactNode;\n}\n\nconst trendIcons: Record<string, ReactNode> = {\n up: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M8 3l5 5h-3v5H6V8H3l5-5z\" />\n </svg>\n ),\n down: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M8 13l5-5h-3V3H6v5H3l5 5z\" />\n </svg>\n ),\n neutral: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M2 7h12v2H2V7z\" />\n </svg>\n ),\n};\n\n/**\n * StatCard — displays a key metric with optional trend indicator.\n *\n * Accessibility:\n * - Trend icons are aria-hidden; meaning conveyed via visible text\n * - Uses semantic structure with clear label/value relationship\n * - sr-only text describes trend for screen readers\n */\nexport function StatCard({\n label,\n value,\n change,\n changeLabel,\n trend = 'neutral',\n icon,\n className,\n ...props\n}: StatCardProps) {\n const formattedChange = change !== undefined\n ? `${change > 0 ? '+' : ''}${change}%`\n : undefined;\n\n return (\n <div className={cn(styles.card, className)} {...props}>\n <div className={styles.header}>\n <span className={styles.label}>{label}</span>\n {icon && (\n <span className={styles.icon} aria-hidden=\"true\">\n {icon}\n </span>\n )}\n </div>\n <div className={styles.value}>{value}</div>\n {formattedChange && (\n <div className={cn(styles.trend, styles[trend])}>\n {trendIcons[trend]}\n <span>{formattedChange}</span>\n {changeLabel && <span className={styles.changeLabel}>{changeLabel}</span>}\n <span className={styles.srOnly}>\n {trend === 'up' ? 'increase' : trend === 'down' ? 'decrease' : 'no change'}\n </span>\n </div>\n )}\n </div>\n );\n}\n","import { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\nimport { cn } from '../../utils/cn';\nimport styles from './List.module.css';\n\n/* ---------- List ---------- */\n\nexport interface ListProps extends HTMLAttributes<HTMLUListElement> {\n /** Show dividers between items */\n divided?: boolean;\n /** Padding inside list items */\n padding?: 'none' | 'sm' | 'md';\n}\n\n/**\n * List — composable list container for displaying groups of items.\n *\n * Accessibility:\n * - Uses semantic <ul>/<li> structure\n * - Interactive items rendered as buttons for keyboard access\n * - Disabled items use aria-disabled\n * - Selected items use aria-selected\n */\nexport const List = forwardRef<HTMLUListElement, ListProps>(\n ({ divided = false, padding = 'md', className, children, ...props }, ref) => {\n return (\n <ul\n ref={ref}\n className={cn(styles.list, divided && styles.divided, styles[`pad-${padding}`], className)}\n {...props}\n >\n {children}\n </ul>\n );\n },\n);\nList.displayName = 'List';\n\n/* ---------- ListItem ---------- */\n\nexport interface ListItemProps extends Omit<HTMLAttributes<HTMLLIElement>, 'prefix'> {\n /** Click handler — makes the item interactive */\n onClick?: () => void;\n /** Whether this item is selected */\n selected?: boolean;\n /** Whether this item is disabled */\n disabled?: boolean;\n /** Leading element (icon, avatar, etc.) */\n prefix?: ReactNode;\n /** Trailing element (badge, action button, etc.) */\n suffix?: ReactNode;\n /** Secondary description text */\n description?: string;\n}\n\nexport const ListItem = forwardRef<HTMLLIElement, ListItemProps>(\n ({ onClick, selected, disabled, prefix, suffix, description, className, children, ...props }, ref) => {\n const isInteractive = !!onClick;\n\n const content = (\n <>\n {prefix && <span className={styles.prefix}>{prefix}</span>}\n <span className={styles.content}>\n <span className={styles.primary}>{children}</span>\n {description && <span className={styles.description}>{description}</span>}\n </span>\n {suffix && <span className={styles.suffix}>{suffix}</span>}\n </>\n );\n\n return (\n <li\n ref={ref}\n className={cn(styles.item, className)}\n {...props}\n >\n {isInteractive ? (\n <button\n type=\"button\"\n className={cn(styles.interactive, selected && styles.selected, disabled && styles.disabled)}\n onClick={onClick}\n disabled={disabled}\n aria-selected={selected || undefined}\n aria-disabled={disabled || undefined}\n >\n {content}\n </button>\n ) : (\n <div className={cn(styles.static, selected && styles.selected, disabled && styles.disabled)}>\n {content}\n </div>\n )}\n </li>\n );\n },\n);\nListItem.displayName = 'ListItem';\n",".list {\n list-style: none;\n margin: 0;\n padding: 0;\n font-family: var(--aegis-font-family-sans);\n}\n\n.divided .item + .item {\n border-top: var(--aegis-border-width-hairline) var(--aegis-border-style-default) var(--aegis-color-border-default);\n}\n\n/* Padding variants */\n.pad-none .interactive,\n.pad-none .static {\n padding: 0;\n}\n\n.pad-sm .interactive,\n.pad-sm .static {\n padding: var(--aegis-space-2) var(--aegis-space-3);\n}\n\n.pad-md .interactive,\n.pad-md .static {\n padding: var(--aegis-space-3) var(--aegis-space-4);\n}\n\n/* Item wrapper */\n.item {\n margin: 0;\n}\n\n/* Shared layout for interactive and static items */\n.interactive,\n.static {\n display: flex;\n align-items: center;\n gap: var(--aegis-space-3);\n width: 100%;\n text-align: left;\n}\n\n.interactive {\n background: none;\n border: none;\n font-family: inherit;\n font-size: inherit;\n cursor: pointer;\n color: inherit;\n border-radius: var(--aegis-radius-sm);\n transition:\n background-color var(--aegis-motion-duration-fast) var(--aegis-motion-easing-standard),\n color var(--aegis-motion-duration-fast) var(--aegis-motion-easing-standard);\n}\n\n.interactive:hover:not(:disabled) {\n background-color: var(--aegis-color-surface-hover);\n}\n\n.interactive:focus-visible {\n outline: var(--aegis-border-width-medium) solid var(--aegis-focus-outline-color);\n outline-offset: calc(-1 * var(--aegis-border-width-medium));\n box-shadow: var(--aegis-shadow-focus);\n z-index: 1;\n position: relative;\n}\n\n.selected {\n background-color: var(--aegis-color-brand-primary-50);\n color: var(--aegis-color-brand-primary-700);\n}\n\n.selected:hover:not(:disabled) {\n background-color: var(--aegis-color-brand-primary-100);\n}\n\n.disabled {\n opacity: var(--aegis-opacity-disabled);\n cursor: not-allowed;\n pointer-events: none;\n}\n\n.prefix {\n display: flex;\n align-items: center;\n flex-shrink: 0;\n color: var(--aegis-color-text-muted);\n}\n\n.content {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: var(--aegis-space-0-5);\n}\n\n.primary {\n font-size: var(--aegis-font-size-body-md);\n line-height: var(--aegis-line-height-body-md);\n color: var(--aegis-color-text-primary);\n}\n\n.description {\n font-size: var(--aegis-font-size-body-sm);\n line-height: var(--aegis-line-height-body-sm);\n color: var(--aegis-color-text-muted);\n}\n\n.suffix {\n display: flex;\n align-items: center;\n flex-shrink: 0;\n}\n","import { useState, useRef, useEffect, type ReactNode } from 'react';\nimport { cn } from '../../utils/cn';\nimport styles from './CollapsiblePanel.module.css';\n\nexport interface CollapsiblePanelProps {\n /** Panel title */\n title: string;\n /** Whether panel is open by default (uncontrolled) */\n defaultOpen?: boolean;\n /** Controlled open state */\n open?: boolean;\n /** Callback when open state changes */\n onToggle?: (open: boolean) => void;\n /** Panel content */\n children: ReactNode;\n /** Additional className */\n className?: string;\n}\n\n/**\n * CollapsiblePanel — a single collapsible section with animated expand/collapse.\n *\n * Accessibility:\n * - Button trigger with aria-expanded\n * - Content region with aria-labelledby linking to the trigger\n * - Chevron icon rotates on expand/collapse\n * - Supports both controlled and uncontrolled modes\n */\nexport function CollapsiblePanel({\n title,\n defaultOpen = false,\n open: controlledOpen,\n onToggle,\n children,\n className,\n}: CollapsiblePanelProps) {\n const [internalOpen, setInternalOpen] = useState(defaultOpen);\n const isOpen = controlledOpen !== undefined ? controlledOpen : internalOpen;\n\n const contentRef = useRef<HTMLDivElement>(null);\n const [height, setHeight] = useState<number | undefined>(isOpen ? undefined : 0);\n\n const panelId = useRef(`collapsible-panel-${Math.random().toString(36).slice(2, 9)}`).current;\n const triggerId = `${panelId}-trigger`;\n\n useEffect(() => {\n if (!contentRef.current) return;\n if (isOpen) {\n setHeight(contentRef.current.scrollHeight);\n const timer = setTimeout(() => setHeight(undefined), 200);\n return () => clearTimeout(timer);\n } else {\n setHeight(contentRef.current.scrollHeight);\n requestAnimationFrame(() => {\n requestAnimationFrame(() => setHeight(0));\n });\n }\n }, [isOpen]);\n\n const handleToggle = () => {\n const next = !isOpen;\n if (controlledOpen === undefined) {\n setInternalOpen(next);\n }\n onToggle?.(next);\n };\n\n return (\n <div className={cn(styles.panel, isOpen && styles.open, className)}>\n <button\n type=\"button\"\n id={triggerId}\n className={styles.trigger}\n aria-expanded={isOpen}\n aria-controls={panelId}\n onClick={handleToggle}\n >\n <svg\n className={styles.chevron}\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <polyline points=\"8 4 14 10 8 16\" />\n </svg>\n <span className={styles.title}>{title}</span>\n </button>\n <div\n id={panelId}\n role=\"region\"\n aria-labelledby={triggerId}\n className={styles.content}\n style={{ height: height !== undefined ? `${height}px` : 'auto' }}\n hidden={!isOpen && height === 0}\n >\n <div ref={contentRef} className={styles.contentInner}>\n {children}\n </div>\n </div>\n </div>\n );\n}\n",".panel {\n font-family: var(--aegis-font-family-sans);\n border: var(--aegis-border-width-hairline) var(--aegis-border-style-default) var(--aegis-color-border-default);\n border-radius: var(--aegis-radius-md);\n background-color: var(--aegis-color-surface-default);\n overflow: hidden;\n}\n\n.trigger {\n display: flex;\n align-items: center;\n gap: var(--aegis-space-2);\n width: 100%;\n padding: var(--aegis-space-3) var(--aegis-space-4);\n background: none;\n border: none;\n cursor: pointer;\n font-family: inherit;\n font-size: var(--aegis-font-size-body-md);\n font-weight: var(--aegis-font-weight-medium);\n line-height: var(--aegis-line-height-body-md);\n color: var(--aegis-color-text-primary);\n text-align: left;\n transition: background-color var(--aegis-motion-duration-fast) var(--aegis-motion-easing-standard);\n}\n\n.trigger:hover {\n background-color: var(--aegis-color-surface-hover);\n}\n\n.trigger:focus-visible {\n outline: var(--aegis-border-width-medium) solid var(--aegis-focus-outline-color);\n outline-offset: calc(-1 * var(--aegis-border-width-medium));\n box-shadow: var(--aegis-shadow-focus);\n z-index: 1;\n position: relative;\n}\n\n.chevron {\n flex-shrink: 0;\n color: var(--aegis-color-text-muted);\n transition: transform var(--aegis-motion-duration-fast) var(--aegis-motion-easing-standard);\n}\n\n.open .chevron {\n transform: rotate(90deg);\n}\n\n.title {\n flex: 1;\n min-width: 0;\n}\n\n.content {\n overflow: hidden;\n transition: height 200ms var(--aegis-motion-easing-standard);\n}\n\n.contentInner {\n padding: 0 var(--aegis-space-4) var(--aegis-space-4);\n padding-left: calc(var(--aegis-space-4) + 20px + var(--aegis-space-2));\n font-size: var(--aegis-font-size-body-sm);\n line-height: var(--aegis-line-height-body-sm);\n color: var(--aegis-color-text-secondary);\n}\n",".card {\n border-radius: var(--aegis-radius-lg);\n background-color: var(--aegis-color-surface-default);\n border: var(--aegis-border-width-hairline) var(--aegis-border-style-default) var(--aegis-color-border-default);\n padding: var(--aegis-space-5);\n font-family: var(--aegis-font-family-sans);\n box-shadow: var(--aegis-shadow-sm);\n transition: box-shadow var(--aegis-motion-duration-base) var(--aegis-motion-easing-standard);\n}\n\n.critical {\n border-left: var(--aegis-border-width-strong) var(--aegis-border-style-default) var(--aegis-color-error-500);\n}\n\n.header {\n display: flex;\n align-items: center;\n gap: var(--aegis-space-3);\n margin-bottom: var(--aegis-space-4);\n}\n\n.avatar {\n flex-shrink: 0;\n width: 48px;\n height: 48px;\n border-radius: var(--aegis-radius-full);\n overflow: hidden;\n display: flex;\n align-items: center;\n justify-content: center;\n background-color: var(--aegis-color-surface-sunken);\n color: var(--aegis-color-text-muted);\n}\n\n.identity {\n flex: 1;\n min-width: 0;\n}\n\n.name {\n margin: 0;\n font-size: var(--aegis-font-size-heading-sm);\n font-weight: var(--aegis-font-weight-semibold);\n line-height: var(--aegis-line-height-heading-sm);\n color: var(--aegis-color-text-primary);\n}\n\n.mrn {\n font-size: var(--aegis-font-size-body-sm);\n color: var(--aegis-color-text-muted);\n line-height: var(--aegis-line-height-body-sm);\n}\n\n.statusBadge {\n flex-shrink: 0;\n display: inline-flex;\n align-items: center;\n padding: var(--aegis-space-1) var(--aegis-space-3);\n border-radius: var(--aegis-radius-full);\n font-size: var(--aegis-font-size-body-xs);\n font-weight: var(--aegis-font-weight-medium);\n line-height: var(--aegis-line-height-body-sm);\n}\n\n.status-active {\n background-color: var(--aegis-color-success-50);\n color: var(--aegis-color-success-700);\n}\n\n.status-inactive {\n background-color: var(--aegis-color-surface-sunken);\n color: var(--aegis-color-text-muted);\n}\n\n.status-critical {\n background-color: var(--aegis-color-error-50);\n color: var(--aegis-color-error-700);\n}\n\n.details {\n display: flex;\n flex-wrap: wrap;\n gap: var(--aegis-space-4);\n margin-bottom: var(--aegis-space-4);\n padding-bottom: var(--aegis-space-4);\n border-bottom: var(--aegis-border-width-hairline) var(--aegis-border-style-default) var(--aegis-color-border-subtle);\n}\n\n.field {\n display: flex;\n flex-direction: column;\n gap: var(--aegis-space-1);\n}\n\n.label {\n font-size: var(--aegis-font-size-body-xs);\n font-weight: var(--aegis-font-weight-medium);\n color: var(--aegis-color-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.05em;\n}\n\n.value {\n font-size: var(--aegis-font-size-body-sm);\n color: var(--aegis-color-text-primary);\n line-height: var(--aegis-line-height-body-sm);\n}\n\n.allergies {\n display: flex;\n align-items: flex-start;\n gap: var(--aegis-space-2);\n flex-wrap: wrap;\n}\n\n.allergiesLabel {\n font-size: var(--aegis-font-size-body-sm);\n font-weight: var(--aegis-font-weight-semibold);\n color: var(--aegis-color-error-600);\n line-height: var(--aegis-line-height-body-sm);\n flex-shrink: 0;\n}\n\n.allergyList {\n display: flex;\n flex-wrap: wrap;\n gap: var(--aegis-space-2);\n list-style: none;\n margin: 0;\n padding: 0;\n}\n\n.allergyItem {\n display: inline-flex;\n padding: var(--aegis-space-1) var(--aegis-space-2);\n background-color: var(--aegis-color-error-50);\n color: var(--aegis-color-error-700);\n border-radius: var(--aegis-radius-sm);\n font-size: var(--aegis-font-size-body-xs);\n line-height: var(--aegis-line-height-body-sm);\n}\n","import { type HTMLAttributes, type ReactNode } from 'react';\nimport { cn } from '../../utils/cn';\nimport styles from './PatientCard.module.css';\n\nexport type PatientStatus = 'active' | 'inactive' | 'critical';\n\nexport interface PatientCardProps extends HTMLAttributes<HTMLDivElement> {\n /** Patient full name */\n name: string;\n /** Medical record number */\n mrn: string;\n /** Date of birth */\n dob: string;\n /** Patient age */\n age: number;\n /** Patient gender */\n gender: string;\n /** Avatar element */\n avatar?: ReactNode;\n /** Patient status */\n status?: PatientStatus;\n /** Known allergies */\n allergies?: string[];\n /** Primary physician name */\n primaryPhysician?: string;\n}\n\nconst statusLabels: Record<PatientStatus, string> = {\n active: 'Active',\n inactive: 'Inactive',\n critical: 'Critical',\n};\n\n/**\n * PatientCard — summary card displaying patient demographics and key info.\n *\n * Accessibility:\n * - Uses role=\"region\" with aria-label for screen readers\n * - Status communicated via text, not color alone\n * - Allergy list uses semantic <ul> element\n */\nexport function PatientCard({\n name,\n mrn,\n dob,\n age,\n gender,\n avatar,\n status = 'active',\n allergies = [],\n primaryPhysician,\n className,\n ...props\n}: PatientCardProps) {\n return (\n <div\n className={cn(styles.card, styles[status], className)}\n role=\"region\"\n aria-label={`Patient card for ${name}`}\n {...props}\n >\n <div className={styles.header}>\n {avatar && <div className={styles.avatar} aria-hidden=\"true\">{avatar}</div>}\n <div className={styles.identity}>\n <h3 className={styles.name}>{name}</h3>\n <span className={styles.mrn}>MRN: {mrn}</span>\n </div>\n <span className={cn(styles.statusBadge, styles[`status-${status}`])}>\n {statusLabels[status]}\n </span>\n </div>\n\n <div className={styles.details}>\n <div className={styles.field}>\n <span className={styles.label}>DOB</span>\n <span className={styles.value}>{dob}</span>\n </div>\n <div className={styles.field}>\n <span className={styles.label}>Age</span>\n <span className={styles.value}>{age}</span>\n </div>\n <div className={styles.field}>\n <span className={styles.label}>Gender</span>\n <span className={styles.value}>{gender}</span>\n </div>\n {primaryPhysician && (\n <div className={styles.field}>\n <span className={styles.label}>PCP</span>\n <span className={styles.value}>{primaryPhysician}</span>\n </div>\n )}\n </div>\n\n {allergies.length > 0 && (\n <div className={styles.allergies}>\n <span className={styles.allergiesLabel}>Allergies:</span>\n <ul className={styles.allergyList}>\n {allergies.map((allergy) => (\n <li key={allergy} className={styles.allergyItem}>{allergy}</li>\n ))}\n </ul>\n </div>\n )}\n </div>\n );\n}\n",".card {\n display: flex;\n border-radius: var(--aegis-radius-lg);\n background-color: var(--aegis-color-surface-default);\n border: var(--aegis-border-width-hairline) var(--aegis-border-style-default) var(--aegis-color-border-default);\n font-family: var(--aegis-font-family-sans);\n box-shadow: var(--aegis-shadow-sm);\n overflow: hidden;\n transition: box-shadow var(--aegis-motion-duration-base) var(--aegis-motion-easing-standard);\n}\n\n.statusBar {\n width: 4px;\n flex-shrink: 0;\n}\n\n.scheduled .statusBar { background-color: var(--aegis-color-info-500); }\n.checked-in .statusBar { background-color: var(--aegis-color-success-400); }\n.in-progress .statusBar { background-color: var(--aegis-color-warning-500); }\n.completed .statusBar { background-color: var(--aegis-color-success-600); }\n.cancelled .statusBar { background-color: var(--aegis-color-text-muted); }\n.no-show .statusBar { background-color: var(--aegis-color-error-500); }\n\n.content {\n flex: 1;\n padding: var(--aegis-space-4) var(--aegis-space-5);\n min-width: 0;\n}\n\n.header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--aegis-space-3);\n margin-bottom: var(--aegis-space-1);\n}\n\n.patientName {\n margin: 0;\n font-size: var(--aegis-font-size-body-md);\n font-weight: var(--aegis-font-weight-semibold);\n line-height: var(--aegis-line-height-body-md);\n color: var(--aegis-color-text-primary);\n}\n\n.type {\n margin: 0 0 var(--aegis-space-3);\n font-size: var(--aegis-font-size-body-sm);\n color: var(--aegis-color-text-secondary);\n line-height: var(--aegis-line-height-body-sm);\n}\n\n.statusBadge {\n flex-shrink: 0;\n display: inline-flex;\n align-items: center;\n padding: var(--aegis-space-1) var(--aegis-space-3);\n border-radius: var(--aegis-radius-full);\n font-size: var(--aegis-font-size-body-xs);\n font-weight: var(--aegis-font-weight-medium);\n line-height: var(--aegis-line-height-body-sm);\n}\n\n.badge-scheduled {\n background-color: var(--aegis-color-info-50);\n color: var(--aegis-color-info-700);\n}\n\n.badge-checked-in {\n background-color: var(--aegis-color-success-50);\n color: var(--aegis-color-success-700);\n}\n\n.badge-in-progress {\n background-color: var(--aegis-color-warning-50);\n color: var(--aegis-color-warning-700);\n}\n\n.badge-completed {\n background-color: var(--aegis-color-success-50);\n color: var(--aegis-color-success-700);\n}\n\n.badge-cancelled {\n background-color: var(--aegis-color-surface-sunken);\n color: var(--aegis-color-text-muted);\n}\n\n.badge-no-show {\n background-color: var(--aegis-color-error-50);\n color: var(--aegis-color-error-700);\n}\n\n.details {\n display: flex;\n flex-wrap: wrap;\n gap: var(--aegis-space-4);\n}\n\n.field {\n display: flex;\n align-items: center;\n gap: var(--aegis-space-2);\n font-size: var(--aegis-font-size-body-sm);\n color: var(--aegis-color-text-secondary);\n line-height: var(--aegis-line-height-body-sm);\n}\n\n.icon {\n flex-shrink: 0;\n color: var(--aegis-color-text-muted);\n}\n","import { type HTMLAttributes } from 'react';\nimport { cn } from '../../utils/cn';\nimport styles from './AppointmentCard.module.css';\n\nexport type AppointmentStatus =\n | 'scheduled'\n | 'checked-in'\n | 'in-progress'\n | 'completed'\n | 'cancelled'\n | 'no-show';\n\nexport interface AppointmentCardProps extends HTMLAttributes<HTMLDivElement> {\n /** Patient name */\n patientName: string;\n /** Appointment date */\n date: string;\n /** Appointment time */\n time: string;\n /** Appointment type (e.g., \"Follow-up\", \"New Patient\") */\n type: string;\n /** Provider / physician name */\n provider: string;\n /** Current appointment status */\n status: AppointmentStatus;\n /** Location or room */\n location?: string;\n}\n\nconst statusLabels: Record<AppointmentStatus, string> = {\n scheduled: 'Scheduled',\n 'checked-in': 'Checked In',\n 'in-progress': 'In Progress',\n completed: 'Completed',\n cancelled: 'Cancelled',\n 'no-show': 'No Show',\n};\n\n/**\n * AppointmentCard — displays appointment summary with status indicator.\n *\n * Accessibility:\n * - Uses role=\"region\" with aria-label for context\n * - Status conveyed via text label, not color alone\n */\nexport function AppointmentCard({\n patientName,\n date,\n time,\n type,\n provider,\n status,\n location,\n className,\n ...props\n}: AppointmentCardProps) {\n return (\n <div\n className={cn(styles.card, styles[status], className)}\n role=\"region\"\n aria-label={`Appointment for ${patientName}`}\n {...props}\n >\n <div className={styles.statusBar} aria-hidden=\"true\" />\n <div className={styles.content}>\n <div className={styles.header}>\n <h3 className={styles.patientName}>{patientName}</h3>\n <span className={cn(styles.statusBadge, styles[`badge-${status}`])}>\n {statusLabels[status]}\n </span>\n </div>\n\n <p className={styles.type}>{type}</p>\n\n <div className={styles.details}>\n <div className={styles.field}>\n <svg className={styles.icon} width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M5 0a1 1 0 011 1v1h4V1a1 1 0 112 0v1h1.5A2.5 2.5 0 0116 4.5v9a2.5 2.5 0 01-2.5 2.5h-11A2.5 2.5 0 010 13.5v-9A2.5 2.5 0 012.5 2H4V1a1 1 0 011-1zM2 6v7.5a.5.5 0 00.5.5h11a.5.5 0 00.5-.5V6H2z\" />\n </svg>\n <span>{date}</span>\n </div>\n <div className={styles.field}>\n <svg className={styles.icon} width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M8 0a8 8 0 110 16A8 8 0 018 0zm0 2a6 6 0 100 12A6 6 0 008 2zm.5 2a.5.5 0 01.5.5V8h2a.5.5 0 010 1H8a.5.5 0 01-.5-.5v-4a.5.5 0 01.5-.5z\" />\n </svg>\n <span>{time}</span>\n </div>\n <div className={styles.field}>\n <svg className={styles.icon} width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M8 0a5 5 0 014.9 5.9L8 14.5 3.1 5.9A5 5 0 018 0zm0 3a2 2 0 100 4 2 2 0 000-4z\" />\n </svg>\n <span>{provider}</span>\n </div>\n {location && (\n <div className={styles.field}>\n <svg className={styles.icon} width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M2 2a2 2 0 012-2h8a2 2 0 012 2v12a2 2 0 01-2 2H4a2 2 0 01-2-2V2zm2 0v12h8V2H4zm2 1h4v2H6V3z\" />\n </svg>\n <span>{location}</span>\n </div>\n )}\n </div>\n </div>\n </div>\n );\n}\n",".timeline {\n list-style: none;\n margin: 0;\n padding: 0;\n font-family: var(--aegis-font-family-sans);\n}\n\n.item {\n display: flex;\n gap: var(--aegis-space-4);\n position: relative;\n padding-bottom: var(--aegis-space-6);\n}\n\n.item:last-child {\n padding-bottom: 0;\n}\n\n.item:last-child .line {\n display: none;\n}\n\n.indicator {\n display: flex;\n flex-direction: column;\n align-items: center;\n flex-shrink: 0;\n width: 24px;\n}\n\n.dot {\n width: 12px;\n height: 12px;\n border-radius: var(--aegis-radius-full);\n border: 2px solid var(--aegis-color-border-default);\n background-color: var(--aegis-color-surface-default);\n flex-shrink: 0;\n}\n\n.icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n border-radius: var(--aegis-radius-full);\n flex-shrink: 0;\n}\n\n.line {\n flex: 1;\n width: 2px;\n background-color: var(--aegis-color-border-subtle);\n margin-top: var(--aegis-space-2);\n}\n\n.content {\n flex: 1;\n min-width: 0;\n padding-top: 0;\n}\n\n.title {\n margin: 0;\n font-size: var(--aegis-font-size-body-md);\n font-weight: var(--aegis-font-weight-semibold);\n line-height: var(--aegis-line-height-body-md);\n color: var(--aegis-color-text-primary);\n}\n\n.description {\n margin: var(--aegis-space-1) 0 0;\n font-size: var(--aegis-font-size-body-sm);\n line-height: var(--aegis-line-height-body-sm);\n color: var(--aegis-color-text-secondary);\n}\n\n.timestamp {\n display: block;\n margin-top: var(--aegis-space-1);\n font-size: var(--aegis-font-size-body-xs);\n color: var(--aegis-color-text-muted);\n line-height: var(--aegis-line-height-body-sm);\n}\n\n/* Variant colors */\n.default .dot { border-color: var(--aegis-color-border-default); }\n.default .icon { background-color: var(--aegis-color-surface-sunken); color: var(--aegis-color-text-muted); }\n\n.success .dot { border-color: var(--aegis-color-success-500); background-color: var(--aegis-color-success-50); }\n.success .icon { background-color: var(--aegis-color-success-50); color: var(--aegis-color-success-600); }\n\n.warning .dot { border-color: var(--aegis-color-warning-500); background-color: var(--aegis-color-warning-50); }\n.warning .icon { background-color: var(--aegis-color-warning-50); color: var(--aegis-color-warning-600); }\n\n.error .dot { border-color: var(--aegis-color-error-500); background-color: var(--aegis-color-error-50); }\n.error .icon { background-color: var(--aegis-color-error-50); color: var(--aegis-color-error-600); }\n\n.info .dot { border-color: var(--aegis-color-info-500); background-color: var(--aegis-color-info-50); }\n.info .icon { background-color: var(--aegis-color-info-50); color: var(--aegis-color-info-600); }\n","import { type HTMLAttributes, type ReactNode } from 'react';\nimport { cn } from '../../utils/cn';\nimport styles from './Timeline.module.css';\n\nexport type TimelineItemVariant = 'default' | 'success' | 'warning' | 'error' | 'info';\n\nexport interface TimelineItem {\n /** Unique identifier */\n id: string;\n /** Event title */\n title: string;\n /** Optional description */\n description?: string;\n /** Timestamp display string */\n timestamp: string;\n /** Optional icon to replace the default dot */\n icon?: ReactNode;\n /** Visual variant */\n variant?: TimelineItemVariant;\n}\n\nexport interface TimelineProps extends HTMLAttributes<HTMLOListElement> {\n /** Timeline items in chronological order */\n items: TimelineItem[];\n}\n\n/**\n * Timeline — vertical timeline for displaying sequential events.\n *\n * Accessibility:\n * - Uses semantic <ol> for ordered event sequence\n * - Each event is an <li> for proper list semantics\n * - Icons are decorative (aria-hidden)\n */\nexport function Timeline({ items, className, ...props }: TimelineProps) {\n return (\n <ol className={cn(styles.timeline, className)} {...props}>\n {items.map((item) => (\n <li\n key={item.id}\n className={cn(styles.item, styles[item.variant ?? 'default'])}\n >\n <div className={styles.indicator} aria-hidden=\"true\">\n {item.icon ? (\n <span className={styles.icon}>{item.icon}</span>\n ) : (\n <span className={styles.dot} />\n )}\n <span className={styles.line} />\n </div>\n <div className={styles.content}>\n <p className={styles.title}>{item.title}</p>\n {item.description && (\n <p className={styles.description}>{item.description}</p>\n )}\n <time className={styles.timestamp}>{item.timestamp}</time>\n </div>\n </li>\n ))}\n </ol>\n );\n}\n",".banner {\n display: flex;\n align-items: flex-start;\n gap: var(--aegis-space-3);\n padding: var(--aegis-space-4) var(--aegis-space-5);\n border-radius: var(--aegis-radius-md);\n font-family: var(--aegis-font-family-sans);\n border: var(--aegis-border-width-hairline) var(--aegis-border-style-default) transparent;\n border-left: var(--aegis-border-width-strong) var(--aegis-border-style-default) transparent;\n}\n\n.icon {\n flex-shrink: 0;\n display: flex;\n margin-top: 1px;\n}\n\n.content {\n flex: 1;\n min-width: 0;\n}\n\n.title {\n margin: 0;\n font-size: var(--aegis-font-size-body-md);\n font-weight: var(--aegis-font-weight-semibold);\n line-height: var(--aegis-line-height-body-md);\n}\n\n.body {\n margin-top: var(--aegis-space-1);\n font-size: var(--aegis-font-size-body-sm);\n line-height: var(--aegis-line-height-body-sm);\n}\n\n.dismiss {\n flex-shrink: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border: none;\n border-radius: var(--aegis-radius-sm);\n background: transparent;\n cursor: pointer;\n opacity: 0.7;\n transition:\n opacity var(--aegis-motion-duration-fast) var(--aegis-motion-easing-standard),\n background-color var(--aegis-motion-duration-fast) var(--aegis-motion-easing-standard);\n}\n\n.dismiss:hover {\n opacity: 1;\n background-color: rgba(0, 0, 0, 0.08);\n}\n\n.dismiss:focus-visible {\n outline: var(--aegis-border-width-medium) solid var(--aegis-focus-outline-color);\n outline-offset: var(--aegis-focus-ring-offset);\n box-shadow: var(--aegis-shadow-focus);\n}\n\n/* Severity: Critical (red) */\n.critical {\n background-color: var(--aegis-color-error-50);\n border-color: var(--aegis-color-error-200);\n border-left-color: var(--aegis-color-error-600);\n color: var(--aegis-color-error-800);\n}\n\n.critical .dismiss {\n color: var(--aegis-color-error-700);\n}\n\n/* Severity: High (orange) */\n.high {\n background-color: var(--aegis-color-warning-50);\n border-color: var(--aegis-color-warning-200);\n border-left-color: var(--aegis-color-warning-600);\n color: var(--aegis-color-warning-800);\n}\n\n.high .dismiss {\n color: var(--aegis-color-warning-700);\n}\n\n/* Severity: Moderate (yellow) */\n.moderate {\n background-color: var(--aegis-color-warning-50);\n border-color: var(--aegis-color-warning-200);\n border-left-color: var(--aegis-color-warning-500);\n color: var(--aegis-color-warning-700);\n}\n\n.moderate .dismiss {\n color: var(--aegis-color-warning-600);\n}\n\n/* Severity: Low (blue) */\n.low {\n background-color: var(--aegis-color-info-50);\n border-color: var(--aegis-color-info-200);\n border-left-color: var(--aegis-color-info-500);\n color: var(--aegis-color-info-700);\n}\n\n.low .dismiss {\n color: var(--aegis-color-info-600);\n}\n","import { type HTMLAttributes, type ReactNode } from 'react';\nimport { cn } from '../../utils/cn';\nimport styles from './ClinicalBanner.module.css';\n\nexport type ClinicalSeverity = 'critical' | 'high' | 'moderate' | 'low';\n\nexport interface ClinicalBannerProps extends HTMLAttributes<HTMLDivElement> {\n /** Severity level */\n severity: ClinicalSeverity;\n /** Banner title */\n title: string;\n /** Dismissible banner */\n dismissible?: boolean;\n /** Called when dismiss button is clicked */\n onDismiss?: () => void;\n /** Detail content */\n children?: ReactNode;\n}\n\nconst severityIcons: Record<ClinicalSeverity, ReactNode> = {\n critical: (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path d=\"M10 0a10 10 0 110 20 10 10 0 010-20zm3.5 6.5a1 1 0 00-1.4 0L10 8.6 7.9 6.5a1 1 0 10-1.4 1.4L8.6 10l-2.1 2.1a1 1 0 101.4 1.4L10 11.4l2.1 2.1a1 1 0 001.4-1.4L11.4 10l2.1-2.1a1 1 0 000-1.4z\" />\n </svg>\n ),\n high: (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path d=\"M10 0a10 10 0 110 20 10 10 0 010-20zm0 13a1 1 0 100 2 1 1 0 000-2zm0-8a1 1 0 00-1 1v4a1 1 0 102 0V6a1 1 0 00-1-1z\" />\n </svg>\n ),\n moderate: (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path d=\"M10 0a10 10 0 110 20 10 10 0 010-20zm0 8a1 1 0 00-1 1v5a1 1 0 102 0V9a1 1 0 00-1-1zm0-3.5a1 1 0 100 2 1 1 0 000-2z\" />\n </svg>\n ),\n low: (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path d=\"M10 0a10 10 0 110 20 10 10 0 010-20zm0 8a1 1 0 00-1 1v5a1 1 0 102 0V9a1 1 0 00-1-1zm0-3.5a1 1 0 100 2 1 1 0 000-2z\" />\n </svg>\n ),\n};\n\n/**\n * ClinicalBanner — prominent banner for critical clinical alerts.\n *\n * Accessibility:\n * - Uses role=\"alert\" for immediate screen reader announcement\n * - Icon + color + text ensures meaning is communicated multiple ways\n * - Dismiss button has accessible label\n */\nexport function ClinicalBanner({\n severity,\n title,\n dismissible = false,\n onDismiss,\n children,\n className,\n ...props\n}: ClinicalBannerProps) {\n return (\n <div\n className={cn(styles.banner, styles[severity], className)}\n role=\"alert\"\n {...props}\n >\n <span className={styles.icon} aria-hidden=\"true\">\n {severityIcons[severity]}\n </span>\n <div className={styles.content}>\n <p className={styles.title}>{title}</p>\n {children && <div className={styles.body}>{children}</div>}\n </div>\n {dismissible && (\n <button\n className={styles.dismiss}\n onClick={onDismiss}\n aria-label=\"Dismiss alert\"\n type=\"button\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.75\" strokeLinecap=\"round\">\n <line x1=\"4\" y1=\"4\" x2=\"12\" y2=\"12\" />\n <line x1=\"12\" y1=\"4\" x2=\"4\" y2=\"12\" />\n </svg>\n </button>\n )}\n </div>\n );\n}\n",".row {\n padding: var(--aegis-space-3) var(--aegis-space-4);\n border-bottom: var(--aegis-border-width-hairline) var(--aegis-border-style-default) var(--aegis-color-border-subtle);\n font-family: var(--aegis-font-family-sans);\n transition: background-color var(--aegis-motion-duration-fast) var(--aegis-motion-easing-standard);\n}\n\n.row:hover {\n background-color: var(--aegis-color-surface-hover);\n}\n\n.row:last-child {\n border-bottom: none;\n}\n\n.primary {\n display: flex;\n align-items: center;\n gap: var(--aegis-space-3);\n margin-bottom: var(--aegis-space-2);\n}\n\n.statusIndicator {\n width: 8px;\n height: 8px;\n border-radius: var(--aegis-radius-full);\n flex-shrink: 0;\n}\n\n.indicator-active { background-color: var(--aegis-color-success-500); }\n.indicator-discontinued { background-color: var(--aegis-color-text-muted); }\n.indicator-hold { background-color: var(--aegis-color-warning-500); }\n.indicator-prn { background-color: var(--aegis-color-info-500); }\n\n.name {\n font-size: var(--aegis-font-size-body-md);\n font-weight: var(--aegis-font-weight-semibold);\n color: var(--aegis-color-text-primary);\n line-height: var(--aegis-line-height-body-md);\n}\n\n.dosage {\n font-size: var(--aegis-font-size-body-sm);\n color: var(--aegis-color-text-secondary);\n line-height: var(--aegis-line-height-body-sm);\n}\n\n.statusBadge {\n margin-left: auto;\n display: inline-flex;\n align-items: center;\n padding: var(--aegis-space-1) var(--aegis-space-2);\n border-radius: var(--aegis-radius-sm);\n font-size: var(--aegis-font-size-body-xs);\n font-weight: var(--aegis-font-weight-medium);\n line-height: var(--aegis-line-height-body-sm);\n}\n\n.badge-active {\n background-color: var(--aegis-color-success-50);\n color: var(--aegis-color-success-700);\n}\n\n.badge-discontinued {\n background-color: var(--aegis-color-surface-sunken);\n color: var(--aegis-color-text-muted);\n text-decoration: line-through;\n}\n\n.badge-hold {\n background-color: var(--aegis-color-warning-50);\n color: var(--aegis-color-warning-700);\n}\n\n.badge-prn {\n background-color: var(--aegis-color-info-50);\n color: var(--aegis-color-info-700);\n}\n\n.secondary {\n display: flex;\n flex-wrap: wrap;\n gap: var(--aegis-space-4);\n padding-left: calc(8px + var(--aegis-space-3));\n}\n\n.detail {\n font-size: var(--aegis-font-size-body-xs);\n color: var(--aegis-color-text-secondary);\n line-height: var(--aegis-line-height-body-sm);\n}\n\n.detailLabel {\n color: var(--aegis-color-text-muted);\n font-weight: var(--aegis-font-weight-medium);\n}\n\n.discontinued .name {\n text-decoration: line-through;\n color: var(--aegis-color-text-muted);\n}\n","import { type HTMLAttributes } from 'react';\nimport { cn } from '../../utils/cn';\nimport styles from './MedicationRow.module.css';\n\nexport type MedicationStatus = 'active' | 'discontinued' | 'hold' | 'prn';\n\nexport interface MedicationRowProps extends HTMLAttributes<HTMLDivElement> {\n /** Medication name */\n name: string;\n /** Dosage (e.g., \"10mg\") */\n dosage: string;\n /** Frequency (e.g., \"Once daily\") */\n frequency: string;\n /** Route of administration (e.g., \"Oral\") */\n route: string;\n /** Prescribing physician */\n prescribedBy: string;\n /** Start date */\n startDate: string;\n /** End date */\n endDate?: string;\n /** Medication status */\n status: MedicationStatus;\n}\n\nconst statusLabels: Record<MedicationStatus, string> = {\n active: 'Active',\n discontinued: 'Discontinued',\n hold: 'On Hold',\n prn: 'PRN',\n};\n\n/**\n * MedicationRow — compact horizontal display of medication details.\n *\n * Accessibility:\n * - Uses role=\"row\" semantics through div structure\n * - Status communicated via text label, not color alone\n * - All information is available as text content for screen readers\n */\nexport function MedicationRow({\n name,\n dosage,\n frequency,\n route,\n prescribedBy,\n startDate,\n endDate,\n status,\n className,\n ...props\n}: MedicationRowProps) {\n return (\n <div\n className={cn(styles.row, styles[status], className)}\n {...props}\n >\n <div className={styles.primary}>\n <span className={cn(styles.statusIndicator, styles[`indicator-${status}`])} aria-hidden=\"true\" />\n <span className={styles.name}>{name}</span>\n <span className={styles.dosage}>{dosage}</span>\n <span className={cn(styles.statusBadge, styles[`badge-${status}`])}>\n {statusLabels[status]}\n </span>\n </div>\n <div className={styles.secondary}>\n <span className={styles.detail}>\n <span className={styles.detailLabel}>Freq:</span> {frequency}\n </span>\n <span className={styles.detail}>\n <span className={styles.detailLabel}>Route:</span> {route}\n </span>\n <span className={styles.detail}>\n <span className={styles.detailLabel}>By:</span> {prescribedBy}\n </span>\n <span className={styles.detail}>\n <span className={styles.detailLabel}>Start:</span> {startDate}\n </span>\n {endDate && (\n <span className={styles.detail}>\n <span className={styles.detailLabel}>End:</span> {endDate}\n </span>\n )}\n </div>\n </div>\n );\n}\n",".row {\n display: flex;\n align-items: center;\n gap: var(--aegis-space-4);\n padding: var(--aegis-space-3) var(--aegis-space-4);\n border-bottom: var(--aegis-border-width-hairline) var(--aegis-border-style-default) var(--aegis-color-border-subtle);\n font-family: var(--aegis-font-family-sans);\n transition: background-color var(--aegis-motion-duration-fast) var(--aegis-motion-easing-standard);\n}\n\n.row:hover {\n background-color: var(--aegis-color-surface-hover);\n}\n\n.row:last-child {\n border-bottom: none;\n}\n\n.testInfo {\n flex: 1;\n min-width: 0;\n}\n\n.testName {\n font-size: var(--aegis-font-size-body-sm);\n font-weight: var(--aegis-font-weight-medium);\n color: var(--aegis-color-text-primary);\n line-height: var(--aegis-line-height-body-sm);\n}\n\n.result {\n display: flex;\n align-items: baseline;\n gap: var(--aegis-space-1);\n min-width: 100px;\n}\n\n.value {\n font-size: var(--aegis-font-size-body-md);\n font-weight: var(--aegis-font-weight-semibold);\n color: var(--aegis-color-text-primary);\n line-height: var(--aegis-line-height-body-md);\n font-variant-numeric: tabular-nums;\n}\n\n.abnormalValue {\n font-weight: var(--aegis-font-weight-bold);\n}\n\n.abnormal-high .value,\n.abnormal-high .arrow { color: var(--aegis-color-warning-700); }\n.abnormal-low .value,\n.abnormal-low .arrow { color: var(--aegis-color-info-700); }\n.critical .value,\n.critical .arrow { color: var(--aegis-color-error-700); }\n\n.arrow {\n font-size: var(--aegis-font-size-body-sm);\n}\n\n.unit {\n font-size: var(--aegis-font-size-body-xs);\n color: var(--aegis-color-text-muted);\n line-height: var(--aegis-line-height-body-sm);\n}\n\n.range {\n display: flex;\n align-items: center;\n gap: var(--aegis-space-1);\n min-width: 120px;\n}\n\n.rangeLabel {\n font-size: var(--aegis-font-size-body-xs);\n color: var(--aegis-color-text-muted);\n font-weight: var(--aegis-font-weight-medium);\n}\n\n.rangeValue {\n font-size: var(--aegis-font-size-body-xs);\n color: var(--aegis-color-text-secondary);\n font-variant-numeric: tabular-nums;\n}\n\n.meta {\n display: flex;\n align-items: center;\n gap: var(--aegis-space-3);\n flex-shrink: 0;\n}\n\n.statusBadge {\n display: inline-flex;\n align-items: center;\n padding: var(--aegis-space-1) var(--aegis-space-2);\n border-radius: var(--aegis-radius-sm);\n font-size: var(--aegis-font-size-body-xs);\n font-weight: var(--aegis-font-weight-medium);\n line-height: var(--aegis-line-height-body-sm);\n}\n\n.badge-normal {\n background-color: var(--aegis-color-success-50);\n color: var(--aegis-color-success-700);\n}\n\n.badge-abnormal-high {\n background-color: var(--aegis-color-warning-50);\n color: var(--aegis-color-warning-700);\n}\n\n.badge-abnormal-low {\n background-color: var(--aegis-color-info-50);\n color: var(--aegis-color-info-700);\n}\n\n.badge-critical {\n background-color: var(--aegis-color-error-50);\n color: var(--aegis-color-error-700);\n}\n\n.date {\n font-size: var(--aegis-font-size-body-xs);\n color: var(--aegis-color-text-muted);\n white-space: nowrap;\n}\n","import { type HTMLAttributes } from 'react';\nimport { cn } from '../../utils/cn';\nimport styles from './LabResultRow.module.css';\n\nexport type LabResultStatus = 'normal' | 'abnormal-high' | 'abnormal-low' | 'critical';\n\nexport interface LabResultRowProps extends HTMLAttributes<HTMLDivElement> {\n /** Test name (e.g., \"White Blood Cells\") */\n testName: string;\n /** Result value */\n value: string | number;\n /** Unit of measurement (e.g., \"K/uL\") */\n unit: string;\n /** Reference range (e.g., \"4.5-11.0\") */\n referenceRange: string;\n /** Result status */\n status: LabResultStatus;\n /** Date collected */\n collectedDate: string;\n}\n\nconst statusLabels: Record<LabResultStatus, string> = {\n normal: 'Normal',\n 'abnormal-high': 'High',\n 'abnormal-low': 'Low',\n critical: 'Critical',\n};\n\nconst statusArrow: Record<LabResultStatus, string> = {\n normal: '',\n 'abnormal-high': '\\u2191',\n 'abnormal-low': '\\u2193',\n critical: '\\u2191\\u2191',\n};\n\n/**\n * LabResultRow — displays a single lab test result with visual status indicator.\n *\n * Accessibility:\n * - Status conveyed via text label (\"High\", \"Low\", \"Critical\"), not color alone\n * - Arrow indicators are supplementary (aria-hidden)\n * - Screen readers receive full context through text content\n */\nexport function LabResultRow({\n testName,\n value,\n unit,\n referenceRange,\n status,\n collectedDate,\n className,\n ...props\n}: LabResultRowProps) {\n const isAbnormal = status !== 'normal';\n\n return (\n <div\n className={cn(styles.row, styles[status], className)}\n {...props}\n >\n <div className={styles.testInfo}>\n <span className={styles.testName}>{testName}</span>\n </div>\n <div className={styles.result}>\n <span className={cn(styles.value, isAbnormal && styles.abnormalValue)}>\n {value}\n {statusArrow[status] && (\n <span className={styles.arrow} aria-hidden=\"true\"> {statusArrow[status]}</span>\n )}\n </span>\n <span className={styles.unit}>{unit}</span>\n </div>\n <div className={styles.range}>\n <span className={styles.rangeLabel}>Ref:</span>\n <span className={styles.rangeValue}>{referenceRange}</span>\n </div>\n <div className={styles.meta}>\n <span className={cn(styles.statusBadge, styles[`badge-${status}`])}>\n {statusLabels[status]}\n </span>\n <span className={styles.date}>{collectedDate}</span>\n </div>\n </div>\n );\n}\n",".card {\n border-radius: var(--aegis-radius-lg);\n background-color: var(--aegis-color-surface-default);\n border: var(--aegis-border-width-hairline) var(--aegis-border-style-default) var(--aegis-color-border-default);\n padding: var(--aegis-space-5);\n font-family: var(--aegis-font-family-sans);\n box-shadow: var(--aegis-shadow-sm);\n}\n\n.header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: var(--aegis-space-3);\n margin-bottom: var(--aegis-space-4);\n padding-bottom: var(--aegis-space-4);\n border-bottom: var(--aegis-border-width-hairline) var(--aegis-border-style-default) var(--aegis-color-border-subtle);\n}\n\n.planInfo {\n min-width: 0;\n}\n\n.planName {\n margin: 0;\n font-size: var(--aegis-font-size-heading-sm);\n font-weight: var(--aegis-font-weight-semibold);\n line-height: var(--aegis-line-height-heading-sm);\n color: var(--aegis-color-text-primary);\n}\n\n.planType {\n display: inline-block;\n margin-top: var(--aegis-space-1);\n font-size: var(--aegis-font-size-body-xs);\n font-weight: var(--aegis-font-weight-medium);\n color: var(--aegis-color-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.05em;\n}\n\n.statusBadge {\n flex-shrink: 0;\n display: inline-flex;\n align-items: center;\n padding: var(--aegis-space-1) var(--aegis-space-3);\n border-radius: var(--aegis-radius-full);\n font-size: var(--aegis-font-size-body-xs);\n font-weight: var(--aegis-font-weight-medium);\n line-height: var(--aegis-line-height-body-sm);\n}\n\n.status-active {\n background-color: var(--aegis-color-success-50);\n color: var(--aegis-color-success-700);\n}\n\n.status-inactive {\n background-color: var(--aegis-color-surface-sunken);\n color: var(--aegis-color-text-muted);\n}\n\n.status-pending {\n background-color: var(--aegis-color-warning-50);\n color: var(--aegis-color-warning-700);\n}\n\n.details {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: var(--aegis-space-4);\n}\n\n.field {\n display: flex;\n flex-direction: column;\n gap: var(--aegis-space-1);\n}\n\n.label {\n font-size: var(--aegis-font-size-body-xs);\n font-weight: var(--aegis-font-weight-medium);\n color: var(--aegis-color-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.05em;\n}\n\n.value {\n font-size: var(--aegis-font-size-body-sm);\n color: var(--aegis-color-text-primary);\n line-height: var(--aegis-line-height-body-sm);\n font-variant-numeric: tabular-nums;\n}\n","import { type HTMLAttributes } from 'react';\nimport { cn } from '../../utils/cn';\nimport styles from './InsuranceCard.module.css';\n\nexport type InsurancePlanType = 'PPO' | 'HMO' | 'EPO' | 'POS' | 'Medicare' | 'Medicaid' | 'Other';\nexport type InsuranceStatus = 'active' | 'inactive' | 'pending';\n\nexport interface InsuranceCardProps extends HTMLAttributes<HTMLDivElement> {\n /** Plan name */\n planName: string;\n /** Member ID */\n memberId: string;\n /** Group number */\n groupNumber: string;\n /** Plan type */\n planType: InsurancePlanType;\n /** Coverage status */\n status: InsuranceStatus;\n /** Coverage effective date */\n effectiveDate: string;\n /** Coverage expiration date */\n expirationDate?: string;\n}\n\nconst statusLabels: Record<InsuranceStatus, string> = {\n active: 'Active',\n inactive: 'Inactive',\n pending: 'Pending',\n};\n\n/**\n * InsuranceCard — displays insurance plan summary information.\n *\n * Accessibility:\n * - Uses role=\"region\" with aria-label for screen reader context\n * - Status communicated via text label, not color alone\n * - Structured layout for easy scanning\n */\nexport function InsuranceCard({\n planName,\n memberId,\n groupNumber,\n planType,\n status,\n effectiveDate,\n expirationDate,\n className,\n ...props\n}: InsuranceCardProps) {\n return (\n <div\n className={cn(styles.card, className)}\n role=\"region\"\n aria-label={`Insurance: ${planName}`}\n {...props}\n >\n <div className={styles.header}>\n <div className={styles.planInfo}>\n <h3 className={styles.planName}>{planName}</h3>\n <span className={styles.planType}>{planType}</span>\n </div>\n <span className={cn(styles.statusBadge, styles[`status-${status}`])}>\n {statusLabels[status]}\n </span>\n </div>\n\n <div className={styles.details}>\n <div className={styles.field}>\n <span className={styles.label}>Member ID</span>\n <span className={styles.value}>{memberId}</span>\n </div>\n <div className={styles.field}>\n <span className={styles.label}>Group #</span>\n <span className={styles.value}>{groupNumber}</span>\n </div>\n <div className={styles.field}>\n <span className={styles.label}>Effective</span>\n <span className={styles.value}>{effectiveDate}</span>\n </div>\n {expirationDate && (\n <div className={styles.field}>\n <span className={styles.label}>Expires</span>\n <span className={styles.value}>{expirationDate}</span>\n </div>\n )}\n </div>\n </div>\n );\n}\n","import { useEffect, type ReactNode } from 'react';\nimport { cn } from '../../utils/cn';\nimport styles from './Toast.module.css';\n\nexport type ToastStatus = 'info' | 'success' | 'warning' | 'error';\n\nexport interface ToastProps {\n /** Toast message */\n message: string;\n /** Optional title */\n title?: string;\n /** Status variant */\n status?: ToastStatus;\n /** Optional action element */\n action?: ReactNode;\n /** Called when toast is closed */\n onClose: () => void;\n /** Auto-dismiss duration in ms (0 to disable) */\n duration?: number;\n /** Additional class name */\n className?: string;\n}\n\nconst statusIcons: Record<ToastStatus, ReactNode> = {\n info: (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path d=\"M10 0a10 10 0 110 20 10 10 0 010-20zm0 8a1 1 0 00-1 1v5a1 1 0 102 0V9a1 1 0 00-1-1zm0-3.5a1 1 0 100 2 1 1 0 000-2z\" />\n </svg>\n ),\n success: (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path d=\"M10 0a10 10 0 110 20 10 10 0 010-20zm4.3 7.3a1 1 0 00-1.4-1.4L8.5 10.3 7.1 8.9a1 1 0 10-1.4 1.4l2.1 2.1a1 1 0 001.4 0l5.1-5.1z\" />\n </svg>\n ),\n warning: (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path d=\"M10 0a10 10 0 110 20 10 10 0 010-20zm0 13a1 1 0 100 2 1 1 0 000-2zm0-8a1 1 0 00-1 1v4a1 1 0 102 0V6a1 1 0 00-1-1z\" />\n </svg>\n ),\n error: (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path d=\"M10 0a10 10 0 110 20 10 10 0 010-20zm3.5 6.5a1 1 0 00-1.4 0L10 8.6 7.9 6.5a1 1 0 10-1.4 1.4L8.6 10l-2.1 2.1a1 1 0 101.4 1.4L10 11.4l2.1 2.1a1 1 0 001.4-1.4L11.4 10l2.1-2.1a1 1 0 000-1.4z\" />\n </svg>\n ),\n};\n\n/**\n * Toast — transient notification that auto-dismisses.\n *\n * Accessibility:\n * - Uses role=\"alert\" for error/warning (assertive), role=\"status\" for info/success (polite)\n * - Close button has accessible label\n * - Auto-dismiss can be disabled for important messages\n * - Icon + color + text ensures meaning is communicated multiple ways\n */\nexport function Toast({\n message,\n title,\n status = 'info',\n action,\n onClose,\n duration = 5000,\n className,\n}: ToastProps) {\n useEffect(() => {\n if (duration <= 0) return;\n const timer = setTimeout(onClose, duration);\n return () => clearTimeout(timer);\n }, [duration, onClose]);\n\n const isUrgent = status === 'error' || status === 'warning';\n\n return (\n <div\n className={cn(styles.toast, styles[status], className)}\n role={isUrgent ? 'alert' : 'status'}\n >\n <span className={styles.icon} aria-hidden=\"true\">\n {statusIcons[status]}\n </span>\n <div className={styles.content}>\n {title && <p className={styles.title}>{title}</p>}\n <p className={styles.message}>{message}</p>\n </div>\n {action && <div className={styles.action}>{action}</div>}\n <button\n className={styles.close}\n onClick={onClose}\n aria-label=\"Dismiss notification\"\n type=\"button\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.75\" strokeLinecap=\"round\">\n <line x1=\"4\" y1=\"4\" x2=\"12\" y2=\"12\" />\n <line x1=\"12\" y1=\"4\" x2=\"4\" y2=\"12\" />\n </svg>\n </button>\n </div>\n );\n}\n",".toast {\n position: fixed;\n bottom: var(--aegis-space-6);\n right: var(--aegis-space-6);\n z-index: 9999;\n display: flex;\n align-items: flex-start;\n gap: var(--aegis-space-3);\n padding: var(--aegis-space-4) var(--aegis-space-5);\n border-radius: var(--aegis-radius-lg);\n background-color: var(--aegis-color-surface-overlay);\n border: var(--aegis-border-width-hairline) var(--aegis-border-style-default) var(--aegis-color-border-default);\n box-shadow: var(--aegis-shadow-lg);\n font-family: var(--aegis-font-family-sans);\n max-width: 420px;\n min-width: 280px;\n animation: aegis-toast-in var(--aegis-motion-duration-slow) var(--aegis-motion-easing-standard);\n}\n\n.icon {\n flex-shrink: 0;\n display: flex;\n margin-top: 1px;\n}\n\n.content {\n flex: 1;\n min-width: 0;\n}\n\n.title {\n margin: 0;\n font-size: var(--aegis-font-size-body-md);\n font-weight: var(--aegis-font-weight-semibold);\n line-height: var(--aegis-line-height-body-md);\n color: var(--aegis-color-text-primary);\n}\n\n.message {\n margin: 0;\n font-size: var(--aegis-font-size-body-sm);\n line-height: var(--aegis-line-height-body-sm);\n color: var(--aegis-color-text-secondary);\n}\n\n.title + .message {\n margin-top: var(--aegis-space-1);\n}\n\n.action {\n flex-shrink: 0;\n align-self: center;\n}\n\n.close {\n flex-shrink: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border: none;\n border-radius: var(--aegis-radius-sm);\n background: transparent;\n color: var(--aegis-color-text-muted);\n cursor: pointer;\n transition:\n background-color var(--aegis-motion-duration-fast) var(--aegis-motion-easing-standard),\n color var(--aegis-motion-duration-fast) var(--aegis-motion-easing-standard);\n}\n\n.close:hover {\n background-color: var(--aegis-color-surface-hover);\n color: var(--aegis-color-text-primary);\n}\n\n.close:focus-visible {\n outline: var(--aegis-border-width-medium) solid var(--aegis-focus-outline-color);\n outline-offset: var(--aegis-focus-ring-offset);\n box-shadow: var(--aegis-shadow-focus);\n}\n\n/* Status variants — left border accent */\n.info {\n border-left: var(--aegis-border-width-strong) var(--aegis-border-style-default) var(--aegis-color-info-500);\n}\n\n.info .icon { color: var(--aegis-color-info-500); }\n\n.success {\n border-left: var(--aegis-border-width-strong) var(--aegis-border-style-default) var(--aegis-color-success-500);\n}\n\n.success .icon { color: var(--aegis-color-success-500); }\n\n.warning {\n border-left: var(--aegis-border-width-strong) var(--aegis-border-style-default) var(--aegis-color-warning-500);\n}\n\n.warning .icon { color: var(--aegis-color-warning-500); }\n\n.error {\n border-left: var(--aegis-border-width-strong) var(--aegis-border-style-default) var(--aegis-color-error-500);\n}\n\n.error .icon { color: var(--aegis-color-error-500); }\n\n@keyframes aegis-toast-in {\n from {\n opacity: 0;\n transform: translateY(12px) scale(0.96);\n }\n to {\n opacity: 1;\n transform: translateY(0) scale(1);\n }\n}\n","import { useEffect, useRef, type ReactNode } from 'react';\nimport { cn } from '../../utils/cn';\nimport styles from './ConfirmDialog.module.css';\n\nexport interface ConfirmDialogProps {\n /** Whether the dialog is open */\n open: boolean;\n /** Called when the user confirms */\n onConfirm: () => void;\n /** Called when the user cancels */\n onCancel: () => void;\n /** Dialog title */\n title: string;\n /** Message or content */\n message: string | ReactNode;\n /** Confirm button label */\n confirmLabel?: string;\n /** Cancel button label */\n cancelLabel?: string;\n /** Visual variant */\n variant?: 'default' | 'danger';\n /** Show loading state on confirm button */\n loading?: boolean;\n /** Additional class name */\n className?: string;\n}\n\n/**\n * ConfirmDialog — confirmation dialog built on native <dialog>.\n *\n * Accessibility:\n * - Uses native <dialog> for built-in focus trapping and Escape handling\n * - aria-labelledby links to the title\n * - aria-describedby links to the message\n * - Focus moves to cancel button on open (safe default)\n * - Escape key closes the dialog\n * - Backdrop click cancels\n */\nexport function ConfirmDialog({\n open,\n onConfirm,\n onCancel,\n title,\n message,\n confirmLabel = 'Confirm',\n cancelLabel = 'Cancel',\n variant = 'default',\n loading = false,\n className,\n}: ConfirmDialogProps) {\n const dialogRef = useRef<HTMLDialogElement>(null);\n const cancelRef = useRef<HTMLButtonElement>(null);\n\n useEffect(() => {\n const dialog = dialogRef.current;\n if (!dialog) return;\n\n if (open && !dialog.open) {\n dialog.showModal();\n cancelRef.current?.focus();\n } else if (!open && dialog.open) {\n dialog.close();\n }\n }, [open]);\n\n useEffect(() => {\n const dialog = dialogRef.current;\n if (!dialog) return;\n\n const handleClose = () => onCancel();\n dialog.addEventListener('close', handleClose);\n return () => dialog.removeEventListener('close', handleClose);\n }, [onCancel]);\n\n const handleBackdropClick = (e: React.MouseEvent<HTMLDialogElement>) => {\n if (e.target === dialogRef.current) {\n onCancel();\n }\n };\n\n return (\n <dialog\n ref={dialogRef}\n className={cn(styles.dialog, className)}\n aria-labelledby=\"aegis-confirm-title\"\n aria-describedby=\"aegis-confirm-message\"\n onClick={handleBackdropClick}\n >\n <div className={styles.content}>\n {variant === 'danger' && (\n <div className={styles.dangerIcon} aria-hidden=\"true\">\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M12 0a12 12 0 110 24 12 12 0 010-24zm0 15a1.25 1.25 0 100 2.5 1.25 1.25 0 000-2.5zm0-9a1 1 0 00-1 1v5.5a1 1 0 102 0V7a1 1 0 00-1-1z\" />\n </svg>\n </div>\n )}\n <h2 id=\"aegis-confirm-title\" className={styles.title}>{title}</h2>\n <div id=\"aegis-confirm-message\" className={styles.message}>\n {typeof message === 'string' ? <p>{message}</p> : message}\n </div>\n <div className={styles.actions}>\n <button\n ref={cancelRef}\n className={styles.cancelButton}\n onClick={onCancel}\n type=\"button\"\n disabled={loading}\n >\n {cancelLabel}\n </button>\n <button\n className={cn(styles.confirmButton, styles[variant])}\n onClick={onConfirm}\n type=\"button\"\n disabled={loading}\n aria-busy={loading}\n >\n {loading ? 'Loading...' : confirmLabel}\n </button>\n </div>\n </div>\n </dialog>\n );\n}\n",".dialog {\n border: none;\n border-radius: var(--aegis-radius-xl);\n padding: 0;\n box-shadow: var(--aegis-shadow-xl);\n background-color: var(--aegis-color-surface-overlay);\n width: 420px;\n max-width: 90vw;\n}\n\n.dialog::backdrop {\n background-color: var(--aegis-color-overlay-scrim);\n animation: aegis-backdrop-in var(--aegis-motion-duration-slow) var(--aegis-motion-easing-standard);\n}\n\n.dialog[open] {\n animation: aegis-dialog-in var(--aegis-motion-duration-slow) var(--aegis-motion-easing-standard);\n}\n\n.content {\n padding: var(--aegis-space-6);\n font-family: var(--aegis-font-family-sans);\n}\n\n.dangerIcon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 48px;\n height: 48px;\n border-radius: var(--aegis-radius-full);\n background-color: var(--aegis-color-error-50);\n color: var(--aegis-color-error-500);\n margin-bottom: var(--aegis-space-4);\n}\n\n.title {\n margin: 0;\n font-size: var(--aegis-font-size-heading-md);\n font-weight: var(--aegis-font-weight-semibold);\n line-height: var(--aegis-line-height-heading-md);\n color: var(--aegis-color-text-primary);\n}\n\n.message {\n margin-top: var(--aegis-space-2);\n font-size: var(--aegis-font-size-body-md);\n line-height: var(--aegis-line-height-body-md);\n color: var(--aegis-color-text-secondary);\n}\n\n.message p {\n margin: 0;\n}\n\n.actions {\n display: flex;\n justify-content: flex-end;\n gap: var(--aegis-space-3);\n margin-top: var(--aegis-space-6);\n}\n\n.cancelButton,\n.confirmButton {\n padding: var(--aegis-space-2) var(--aegis-space-5);\n border-radius: var(--aegis-radius-md);\n font-family: var(--aegis-font-family-sans);\n font-size: var(--aegis-font-size-body-sm);\n font-weight: var(--aegis-font-weight-medium);\n line-height: var(--aegis-line-height-body-md);\n cursor: pointer;\n transition:\n background-color var(--aegis-motion-duration-fast) var(--aegis-motion-easing-standard),\n box-shadow var(--aegis-motion-duration-fast) var(--aegis-motion-easing-standard);\n}\n\n.cancelButton {\n background-color: var(--aegis-color-surface-default);\n border: var(--aegis-border-width-hairline) var(--aegis-border-style-default) var(--aegis-color-border-default);\n color: var(--aegis-color-text-primary);\n}\n\n.cancelButton:hover {\n background-color: var(--aegis-color-surface-hover);\n}\n\n.cancelButton:focus-visible,\n.confirmButton:focus-visible {\n outline: var(--aegis-border-width-medium) solid var(--aegis-focus-outline-color);\n outline-offset: var(--aegis-focus-ring-offset);\n box-shadow: var(--aegis-shadow-focus);\n}\n\n.cancelButton:disabled,\n.confirmButton:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n}\n\n.confirmButton.default {\n background-color: var(--aegis-color-info-600);\n border: none;\n color: #fff;\n}\n\n.confirmButton.default:hover:not(:disabled) {\n background-color: var(--aegis-color-info-700);\n}\n\n.confirmButton.danger {\n background-color: var(--aegis-color-error-600);\n border: none;\n color: #fff;\n}\n\n.confirmButton.danger:hover:not(:disabled) {\n background-color: var(--aegis-color-error-700);\n}\n\n@keyframes aegis-dialog-in {\n from {\n opacity: 0;\n transform: translateY(8px) scale(0.98);\n }\n to {\n opacity: 1;\n transform: translateY(0) scale(1);\n }\n}\n\n@keyframes aegis-backdrop-in {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n",".banner {\n width: 100%;\n font-family: var(--aegis-font-family-sans);\n}\n\n.inner {\n display: flex;\n align-items: center;\n gap: var(--aegis-space-3);\n padding: var(--aegis-space-3) var(--aegis-space-5);\n max-width: 1280px;\n margin: 0 auto;\n}\n\n.icon {\n flex-shrink: 0;\n display: flex;\n}\n\n.content {\n flex: 1;\n min-width: 0;\n font-size: var(--aegis-font-size-body-sm);\n line-height: var(--aegis-line-height-body-sm);\n}\n\n.action {\n flex-shrink: 0;\n}\n\n.dismiss {\n flex-shrink: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border: none;\n border-radius: var(--aegis-radius-sm);\n background: transparent;\n cursor: pointer;\n opacity: 0.7;\n transition:\n opacity var(--aegis-motion-duration-fast) var(--aegis-motion-easing-standard),\n background-color var(--aegis-motion-duration-fast) var(--aegis-motion-easing-standard);\n}\n\n.dismiss:hover {\n opacity: 1;\n background-color: rgba(0, 0, 0, 0.08);\n}\n\n.dismiss:focus-visible {\n outline: var(--aegis-border-width-medium) solid var(--aegis-focus-outline-color);\n outline-offset: var(--aegis-focus-ring-offset);\n box-shadow: var(--aegis-shadow-focus);\n}\n\n/* Status variants */\n.info {\n background-color: var(--aegis-color-info-50);\n border-bottom: var(--aegis-border-width-hairline) var(--aegis-border-style-default) var(--aegis-color-info-200);\n color: var(--aegis-color-info-700);\n}\n\n.info .dismiss { color: var(--aegis-color-info-600); }\n\n.success {\n background-color: var(--aegis-color-success-50);\n border-bottom: var(--aegis-border-width-hairline) var(--aegis-border-style-default) var(--aegis-color-success-200);\n color: var(--aegis-color-success-700);\n}\n\n.success .dismiss { color: var(--aegis-color-success-600); }\n\n.warning {\n background-color: var(--aegis-color-warning-50);\n border-bottom: var(--aegis-border-width-hairline) var(--aegis-border-style-default) var(--aegis-color-warning-200);\n color: var(--aegis-color-warning-700);\n}\n\n.warning .dismiss { color: var(--aegis-color-warning-600); }\n\n.error {\n background-color: var(--aegis-color-error-50);\n border-bottom: var(--aegis-border-width-hairline) var(--aegis-border-style-default) var(--aegis-color-error-200);\n color: var(--aegis-color-error-700);\n}\n\n.error .dismiss { color: var(--aegis-color-error-600); }\n","import { type HTMLAttributes, type ReactNode } from 'react';\nimport { cn } from '../../utils/cn';\nimport styles from './Banner.module.css';\n\nexport type BannerStatus = 'info' | 'success' | 'warning' | 'error';\n\nexport interface BannerProps extends HTMLAttributes<HTMLDivElement> {\n /** Status variant */\n status?: BannerStatus;\n /** Whether the banner can be dismissed */\n dismissible?: boolean;\n /** Called when dismiss button is clicked */\n onDismiss?: () => void;\n /** Optional action element */\n action?: ReactNode;\n /** Banner content */\n children: ReactNode;\n}\n\nconst statusIcons: Record<BannerStatus, ReactNode> = {\n info: (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path d=\"M10 0a10 10 0 110 20 10 10 0 010-20zm0 8a1 1 0 00-1 1v5a1 1 0 102 0V9a1 1 0 00-1-1zm0-3.5a1 1 0 100 2 1 1 0 000-2z\" />\n </svg>\n ),\n success: (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path d=\"M10 0a10 10 0 110 20 10 10 0 010-20zm4.3 7.3a1 1 0 00-1.4-1.4L8.5 10.3 7.1 8.9a1 1 0 10-1.4 1.4l2.1 2.1a1 1 0 001.4 0l5.1-5.1z\" />\n </svg>\n ),\n warning: (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path d=\"M10 0a10 10 0 110 20 10 10 0 010-20zm0 13a1 1 0 100 2 1 1 0 000-2zm0-8a1 1 0 00-1 1v4a1 1 0 102 0V6a1 1 0 00-1-1z\" />\n </svg>\n ),\n error: (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path d=\"M10 0a10 10 0 110 20 10 10 0 010-20zm3.5 6.5a1 1 0 00-1.4 0L10 8.6 7.9 6.5a1 1 0 10-1.4 1.4L8.6 10l-2.1 2.1a1 1 0 101.4 1.4L10 11.4l2.1 2.1a1 1 0 001.4-1.4L11.4 10l2.1-2.1a1 1 0 000-1.4z\" />\n </svg>\n ),\n};\n\n/**\n * Banner — full-width banner for page-level messages.\n *\n * Accessibility:\n * - Uses role=\"alert\" for error/warning (assertive announcement)\n * - Uses role=\"status\" for info/success (polite announcement)\n * - Icon + color + text ensures meaning is communicated multiple ways\n * - Dismiss button has accessible label\n */\nexport function Banner({\n status = 'info',\n dismissible = false,\n onDismiss,\n action,\n children,\n className,\n ...props\n}: BannerProps) {\n const isUrgent = status === 'error' || status === 'warning';\n\n return (\n <div\n className={cn(styles.banner, styles[status], className)}\n role={isUrgent ? 'alert' : 'status'}\n {...props}\n >\n <div className={styles.inner}>\n <span className={styles.icon} aria-hidden=\"true\">\n {statusIcons[status]}\n </span>\n <div className={styles.content}>{children}</div>\n {action && <div className={styles.action}>{action}</div>}\n {dismissible && (\n <button\n className={styles.dismiss}\n onClick={onDismiss}\n aria-label=\"Dismiss banner\"\n type=\"button\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.75\" strokeLinecap=\"round\">\n <line x1=\"4\" y1=\"4\" x2=\"12\" y2=\"12\" />\n <line x1=\"12\" y1=\"4\" x2=\"4\" y2=\"12\" />\n </svg>\n </button>\n )}\n </div>\n </div>\n );\n}\n"],"mappings":"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","names":["forwardRef","jsx","forwardRef","forwardRef","jsx","forwardRef","forwardRef","jsx","forwardRef","forwardRef","jsx","jsxs","forwardRef","forwardRef","jsx","jsxs","forwardRef","forwardRef","jsx","jsxs","forwardRef","forwardRef","jsx","jsxs","forwardRef","jsx","jsxs","jsx","jsxs","jsx","jsx","jsx","jsxs","jsx","jsxs","useRef","jsx","jsxs","useRef","jsx","useState","useRef","jsx","jsxs","useState","useRef","jsx","jsx","jsxs","jsx","jsx","jsxs","useState","jsx","jsxs","useState","jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsxs","useState","useRef","useEffect","useCallback","jsx","jsxs","useState","useRef","useCallback","useEffect","useEffect","useRef","jsx","jsxs","useRef","useEffect","useCallback","jsx","jsxs","useCallback","jsx","jsxs","forwardRef","jsx","jsxs","forwardRef","forwardRef","useCallback","jsx","jsxs","forwardRef","useCallback","useCallback","jsx","jsxs","useCallback","useCallback","jsx","jsxs","useCallback","forwardRef","useId","jsx","jsxs","forwardRef","useId","useCallback","useRef","useState","jsx","jsxs","useRef","useState","useCallback","useCallback","useRef","useEffect","jsx","useRef","useEffect","useCallback","forwardRef","jsx","jsxs","forwardRef","useState","useRef","useCallback","useEffect","useId","jsx","jsxs","useState","useRef","useId","useCallback","useEffect","useState","useRef","useCallback","useEffect","useId","jsx","jsxs","useState","useRef","useId","useEffect","useCallback","Fragment","jsx","jsxs","useState","useCallback","useRef","useEffect","jsx","jsxs","useRef","useState","useEffect","useCallback","jsx","jsxs","Fragment","jsx","jsxs","jsx","jsxs","jsx","jsxs","forwardRef","Fragment","jsx","jsxs","forwardRef","useState","useRef","useEffect","jsx","jsxs","useState","useRef","useEffect","jsx","jsxs","statusLabels","jsx","jsxs","statusLabels","jsx","jsxs","jsx","jsxs","jsx","jsxs","statusLabels","jsx","jsxs","statusLabels","jsx","jsxs","statusLabels","useEffect","jsx","jsxs","statusIcons","duration","useEffect","useEffect","useRef","jsx","jsxs","useRef","useEffect","jsx","jsxs","statusIcons"]}