@skyfall_ai/aegis 0.2.0 → 0.3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../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","../src/charts/ChartCard.module.css","../src/charts/ChartCard.tsx","../src/charts/chartTheme.ts","../src/charts/ChartTooltip.module.css","../src/charts/ChartTooltip.tsx","../src/charts/ChartLegend.module.css","../src/charts/ChartLegend.tsx","../src/charts/LineChart.tsx","../src/charts/AreaChart.tsx","../src/charts/BarChart.tsx","../src/charts/StackedBarChart.tsx","../src/charts/DonutChart.tsx","../src/charts/DonutChart.module.css","../src/charts/Sparkline.tsx","../src/charts/KpiStatCard.module.css","../src/charts/KpiStatCard.tsx","../src/charts/TrendStatCard.tsx","../src/charts/TrendStatCard.module.css"],"sourcesContent":["// Design tokens (CSS variables are the primary token delivery mechanism)\n// Import '@skyfall/aegis/dist/tokens/aegis-tokens.css' in your app\nexport * from './tokens';\n\n// Components\nexport * from './components';\n\n// Data visualization (Recharts-based)\nexport * from './charts';\n\n// Utilities\nexport { cn } from './utils/cn';\n\n// Types\nexport type { Size, Status, Variant } from './types/common';\n","/** 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",".card {\n display: flex;\n flex-direction: column;\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-sm);\n overflow: hidden;\n font-family: var(--aegis-font-family-sans);\n transition: box-shadow var(--aegis-motion-duration-base) var(--aegis-motion-easing-standard);\n}\n\n.card:hover {\n box-shadow: var(--aegis-shadow-md);\n}\n\n.comfortable {\n padding: var(--aegis-space-6);\n gap: var(--aegis-space-5);\n}\n\n.compact {\n padding: var(--aegis-space-4);\n gap: var(--aegis-space-3);\n}\n\n.header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: var(--aegis-space-4);\n}\n\n.headerText {\n display: flex;\n flex-direction: column;\n gap: var(--aegis-space-1);\n min-width: 0;\n}\n\n.title {\n margin: 0;\n font-size: var(--aegis-font-size-heading-sm);\n line-height: var(--aegis-line-height-heading-sm);\n font-weight: var(--aegis-font-weight-semibold);\n color: var(--aegis-color-text-primary);\n letter-spacing: var(--aegis-tracking-tight);\n}\n\n.subtitle {\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.metricRow {\n display: flex;\n align-items: baseline;\n gap: var(--aegis-space-3);\n margin-top: var(--aegis-space-3);\n flex-wrap: wrap;\n}\n\n.metric {\n font-size: var(--aegis-font-size-display-md);\n line-height: var(--aegis-line-height-display-md);\n font-weight: var(--aegis-font-weight-semibold);\n color: var(--aegis-color-text-primary);\n letter-spacing: var(--aegis-tracking-tight);\n font-variant-numeric: tabular-nums;\n}\n\n.trendSlot {\n display: inline-flex;\n align-items: center;\n gap: var(--aegis-space-1);\n}\n\n.actions {\n display: flex;\n align-items: center;\n gap: var(--aegis-space-2);\n flex-shrink: 0;\n}\n\n.body {\n position: relative;\n width: 100%;\n min-height: 200px;\n}\n\n.footer {\n border-top: var(--aegis-border-width-hairline) solid var(--aegis-color-border-subtle);\n padding-top: var(--aegis-space-4);\n font-size: var(--aegis-font-size-body-sm);\n color: var(--aegis-color-text-secondary);\n}\n\n.placeholder {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: var(--aegis-space-3);\n min-height: 220px;\n padding: var(--aegis-space-6);\n text-align: center;\n}\n\n.placeholderTitle {\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}\n\n.placeholderText {\n font-size: var(--aegis-font-size-body-sm);\n color: var(--aegis-color-text-secondary);\n max-width: 320px;\n}\n\n.skeletonBars {\n display: flex;\n align-items: flex-end;\n gap: var(--aegis-space-2);\n height: 80px;\n width: 200px;\n}\n\n.skeletonBars span {\n flex: 1;\n background: linear-gradient(\n 180deg,\n var(--aegis-color-surface-sunken) 0%,\n var(--aegis-color-surface-hover) 100%\n );\n border-radius: var(--aegis-radius-sm);\n animation: skeleton-pulse 1.6s ease-in-out infinite;\n}\n\n.skeletonBars span:nth-child(1) {\n height: 40%;\n animation-delay: 0ms;\n}\n.skeletonBars span:nth-child(2) {\n height: 80%;\n animation-delay: 100ms;\n}\n.skeletonBars span:nth-child(3) {\n height: 55%;\n animation-delay: 200ms;\n}\n.skeletonBars span:nth-child(4) {\n height: 95%;\n animation-delay: 300ms;\n}\n.skeletonBars span:nth-child(5) {\n height: 65%;\n animation-delay: 400ms;\n}\n\n@keyframes skeleton-pulse {\n 0%, 100% {\n opacity: 0.55;\n }\n 50% {\n opacity: 1;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .skeletonBars span {\n animation: none;\n opacity: 0.7;\n }\n .card {\n transition: none;\n }\n}\n","import { type HTMLAttributes, type ReactNode } from 'react';\nimport { cn } from '../utils/cn';\nimport styles from './ChartCard.module.css';\n\nexport type ChartCardState = 'ready' | 'loading' | 'empty' | 'error';\n\nexport interface ChartCardProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {\n /** Card title (e.g. \"30-day patient adherence\") */\n title?: ReactNode;\n /** Optional subtitle / explanation */\n subtitle?: ReactNode;\n /** Headline metric displayed prominently in the header */\n metric?: ReactNode;\n /** Trend chip beside the metric (use the Aegis Badge or any node) */\n trend?: ReactNode;\n /** Optional actions (filters, export, etc.) rendered in the header */\n actions?: ReactNode;\n /** Footer content rendered below the chart body */\n footer?: ReactNode;\n /** Visual padding density */\n density?: 'comfortable' | 'compact';\n /** Render state — controls whether children, loader, empty, or error renders */\n state?: ChartCardState;\n /** Custom empty-state node */\n emptyState?: ReactNode;\n /** Custom loading-state node */\n loadingState?: ReactNode;\n /** Custom error-state node */\n errorState?: ReactNode;\n /** Optional aria-label for the chart region */\n ariaLabel?: string;\n}\n\nconst defaultEmpty = (\n <div className={styles.placeholder}>\n <div className={styles.placeholderTitle}>No data available</div>\n <div className={styles.placeholderText}>\n There&apos;s nothing to display for the selected range.\n </div>\n </div>\n);\n\nconst defaultLoading = (\n <div className={styles.placeholder}>\n <div className={styles.skeletonBars} aria-hidden=\"true\">\n <span />\n <span />\n <span />\n <span />\n <span />\n </div>\n <div className={styles.placeholderText}>Loading chart…</div>\n </div>\n);\n\nconst defaultError = (\n <div className={styles.placeholder} role=\"alert\">\n <div className={styles.placeholderTitle}>Unable to load chart</div>\n <div className={styles.placeholderText}>\n Something went wrong while loading this data. Try again in a moment.\n </div>\n </div>\n);\n\n/**\n * ChartCard — the unifying shell for every Aegis chart component.\n *\n * Provides a consistent header (title, subtitle, headline metric, trend chip,\n * actions), body slot, footer slot, and built-in loading / empty / error states.\n *\n * Every chart component in Aegis composes this card so the system feels\n * cohesive and developers get visual states for free.\n */\nexport function ChartCard({\n title,\n subtitle,\n metric,\n trend,\n actions,\n footer,\n density = 'comfortable',\n state = 'ready',\n emptyState,\n loadingState,\n errorState,\n ariaLabel,\n className,\n children,\n ...props\n}: ChartCardProps) {\n const showHeader = title || subtitle || metric || trend || actions;\n\n return (\n <section\n className={cn(styles.card, styles[density], className)}\n aria-label={ariaLabel}\n {...props}\n >\n {showHeader && (\n <header className={styles.header}>\n <div className={styles.headerText}>\n {title && <h3 className={styles.title}>{title}</h3>}\n {subtitle && <p className={styles.subtitle}>{subtitle}</p>}\n {(metric || trend) && (\n <div className={styles.metricRow}>\n {metric && <span className={styles.metric}>{metric}</span>}\n {trend && <span className={styles.trendSlot}>{trend}</span>}\n </div>\n )}\n </div>\n {actions && <div className={styles.actions}>{actions}</div>}\n </header>\n )}\n\n <div className={styles.body}>\n {state === 'loading' && (loadingState ?? defaultLoading)}\n {state === 'empty' && (emptyState ?? defaultEmpty)}\n {state === 'error' && (errorState ?? defaultError)}\n {state === 'ready' && children}\n </div>\n\n {footer && <footer className={styles.footer}>{footer}</footer>}\n </section>\n );\n}\n","/**\n * Skyfall Aegis — Chart Theme\n *\n * Centralized theme tokens for all Recharts-based components.\n * Reads from CSS custom properties so chart visuals stay in sync with\n * the rest of the Aegis design system.\n */\n\n/**\n * The Aegis chart series palette. Order is intentional — earlier colors\n * are used first so simple charts always pull from the most credible,\n * brand-aligned hues before moving into supporting accents.\n */\nexport const aegisSeriesPalette = [\n 'var(--aegis-data-vis-1)',\n 'var(--aegis-data-vis-2)',\n 'var(--aegis-data-vis-3)',\n 'var(--aegis-data-vis-4)',\n 'var(--aegis-data-vis-5)',\n] as const;\n\n/**\n * Resolve a series color by index, wrapping the palette if more series\n * exist than available colors. Accepts an explicit override.\n */\nexport function getSeriesColor(index: number, override?: string): string {\n if (override) return override;\n return aegisSeriesPalette[index % aegisSeriesPalette.length];\n}\n\n/**\n * Token-driven chart theme. Used to style axes, gridlines, tooltips,\n * legends, etc. so every chart in Aegis feels like part of one system.\n */\nexport const aegisChartTheme = {\n axis: {\n stroke: 'var(--aegis-data-vis-axis)',\n fontSize: 12,\n fontFamily: 'var(--aegis-font-family-sans)',\n tickColor: 'var(--aegis-color-text-muted)',\n },\n grid: {\n stroke: 'var(--aegis-data-vis-gridline)',\n strokeDasharray: '3 3',\n },\n tooltip: {\n background: 'var(--aegis-color-surface-overlay)',\n border: 'var(--aegis-color-border-default)',\n text: 'var(--aegis-color-text-primary)',\n muted: 'var(--aegis-color-text-secondary)',\n },\n reference: {\n stroke: 'var(--aegis-color-text-muted)',\n strokeDasharray: '4 4',\n },\n} as const;\n\nexport type ChartSeries<T = Record<string, unknown>> = {\n /** Property key on the data row that holds the series value */\n dataKey: keyof T & string;\n /** Display label for tooltip / legend */\n label?: string;\n /** Optional explicit color (defaults to Aegis palette) */\n color?: string;\n};\n\nexport type ValueFormatter = (value: number | string) => string;\n\n/** Default number formatter — locale-aware, with sensible compact behavior */\nexport const defaultValueFormatter: ValueFormatter = (value) => {\n if (typeof value !== 'number') return String(value);\n if (Math.abs(value) >= 1_000_000) return `${(value / 1_000_000).toFixed(1)}M`;\n if (Math.abs(value) >= 1_000) return `${(value / 1_000).toFixed(1)}k`;\n return value.toLocaleString();\n};\n",".tooltip {\n background-color: var(--aegis-color-surface-overlay);\n border: var(--aegis-border-width-hairline) solid var(--aegis-color-border-default);\n border-radius: var(--aegis-radius-md);\n box-shadow: var(--aegis-shadow-md);\n padding: var(--aegis-space-3) var(--aegis-space-4);\n min-width: 160px;\n font-family: var(--aegis-font-family-sans);\n pointer-events: none;\n}\n\n.label {\n font-size: var(--aegis-font-size-caption);\n font-weight: var(--aegis-font-weight-semibold);\n color: var(--aegis-color-text-secondary);\n text-transform: uppercase;\n letter-spacing: var(--aegis-tracking-wide);\n margin-bottom: var(--aegis-space-2);\n padding-bottom: var(--aegis-space-2);\n border-bottom: var(--aegis-border-width-hairline) solid var(--aegis-color-border-subtle);\n}\n\n.list {\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n gap: var(--aegis-space-1);\n}\n\n.row {\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-primary);\n}\n\n.swatch {\n width: 10px;\n height: 10px;\n border-radius: var(--aegis-radius-sm);\n flex-shrink: 0;\n}\n\n.name {\n flex: 1;\n color: var(--aegis-color-text-secondary);\n}\n\n.value {\n font-family: var(--aegis-font-family-mono);\n font-weight: var(--aegis-font-weight-semibold);\n color: var(--aegis-color-text-primary);\n font-variant-numeric: tabular-nums;\n}\n","import type { TooltipProps } from 'recharts';\nimport { defaultValueFormatter, type ValueFormatter } from './chartTheme';\nimport styles from './ChartTooltip.module.css';\n\nexport interface ChartTooltipProps extends TooltipProps<number, string> {\n /** Optional formatter for displayed values */\n valueFormatter?: ValueFormatter;\n /** Optional formatter for the tooltip label (e.g. axis category) */\n labelFormatter?: (label: string) => string;\n}\n\n/**\n * Aegis-styled tooltip used by every chart in the system.\n *\n * Pass directly to Recharts `<Tooltip content={<ChartTooltip />} />`.\n */\nexport function ChartTooltip({\n active,\n payload,\n label,\n valueFormatter = defaultValueFormatter,\n labelFormatter,\n}: ChartTooltipProps) {\n if (!active || !payload || payload.length === 0) return null;\n\n const displayLabel = labelFormatter && label != null ? labelFormatter(String(label)) : label;\n\n return (\n <div className={styles.tooltip} role=\"tooltip\">\n {displayLabel != null && <div className={styles.label}>{displayLabel}</div>}\n <ul className={styles.list}>\n {payload.map((entry, index) => (\n <li key={`${entry.dataKey}-${index}`} className={styles.row}>\n <span\n className={styles.swatch}\n style={{ backgroundColor: entry.color }}\n aria-hidden=\"true\"\n />\n <span className={styles.name}>{entry.name}</span>\n <span className={styles.value}>\n {entry.value != null ? valueFormatter(entry.value as number) : '—'}\n </span>\n </li>\n ))}\n </ul>\n </div>\n );\n}\n",".legend {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--aegis-space-4);\n list-style: none;\n margin: 0;\n padding: var(--aegis-space-3) 0 0;\n font-family: var(--aegis-font-family-sans);\n}\n\n.item {\n display: inline-flex;\n align-items: center;\n gap: var(--aegis-space-2);\n}\n\n.swatch {\n width: 10px;\n height: 10px;\n border-radius: var(--aegis-radius-sm);\n flex-shrink: 0;\n}\n\n.label {\n font-size: var(--aegis-font-size-body-sm);\n color: var(--aegis-color-text-secondary);\n font-weight: var(--aegis-font-weight-medium);\n}\n","import type { LegendProps } from 'recharts';\nimport styles from './ChartLegend.module.css';\n\n/**\n * Aegis-styled chart legend. Pass to Recharts via:\n * <Legend content={<ChartLegend />} />\n */\nexport function ChartLegend({ payload }: LegendProps) {\n if (!payload || payload.length === 0) return null;\n\n return (\n <ul className={styles.legend}>\n {payload.map((entry, index) => (\n <li key={`${entry.value}-${index}`} className={styles.item}>\n <span\n className={styles.swatch}\n style={{ backgroundColor: entry.color }}\n aria-hidden=\"true\"\n />\n <span className={styles.label}>{entry.value}</span>\n </li>\n ))}\n </ul>\n );\n}\n","import {\n CartesianGrid,\n Legend,\n Line,\n LineChart as RechartsLineChart,\n ReferenceLine,\n ResponsiveContainer,\n Tooltip,\n XAxis,\n YAxis,\n} from 'recharts';\nimport { ChartCard, type ChartCardProps } from './ChartCard';\nimport { ChartLegend } from './ChartLegend';\nimport { ChartTooltip } from './ChartTooltip';\nimport {\n aegisChartTheme,\n defaultValueFormatter,\n getSeriesColor,\n type ChartSeries,\n type ValueFormatter,\n} from './chartTheme';\n\nexport interface LineChartProps<T extends Record<string, unknown>>\n extends Omit<ChartCardProps, 'children'> {\n /** Row-shaped data — each row represents one x-axis category */\n data: T[];\n /** Property name on each row used for the x-axis */\n xKey: keyof T & string;\n /** One or more series definitions */\n series: ChartSeries<T>[];\n /** Chart height in pixels (defaults to 280) */\n height?: number;\n /** Show legend (defaults to true when more than one series) */\n showLegend?: boolean;\n /** Show grid (defaults to true) */\n showGrid?: boolean;\n /** Format values in tooltip / axis */\n valueFormatter?: ValueFormatter;\n /** Optional reference line value(s) (e.g. target threshold) */\n referenceLines?: { value: number; label?: string }[];\n /** Smooth curves (defaults to true) */\n smooth?: boolean;\n}\n\n/**\n * Aegis LineChart — wraps Recharts with Aegis tokens, shell, and states.\n *\n * Time-series and trend visualization for dashboards. Pair with KpiStatCard\n * for headline metrics or use standalone in a ChartCard layout.\n */\nexport function LineChart<T extends Record<string, unknown>>({\n data,\n xKey,\n series,\n height = 280,\n showLegend,\n showGrid = true,\n valueFormatter = defaultValueFormatter,\n referenceLines,\n smooth = true,\n state,\n ...cardProps\n}: LineChartProps<T>) {\n const effectiveState = state ?? (data.length === 0 ? 'empty' : 'ready');\n const showLegendFinal = showLegend ?? series.length > 1;\n\n return (\n <ChartCard state={effectiveState} {...cardProps}>\n <ResponsiveContainer width=\"100%\" height={height}>\n <RechartsLineChart data={data} margin={{ top: 8, right: 16, left: 0, bottom: 0 }}>\n {showGrid && (\n <CartesianGrid\n vertical={false}\n stroke={aegisChartTheme.grid.stroke}\n strokeDasharray={aegisChartTheme.grid.strokeDasharray}\n />\n )}\n <XAxis\n dataKey={xKey}\n stroke={aegisChartTheme.axis.stroke}\n tick={{ fill: aegisChartTheme.axis.tickColor, fontSize: aegisChartTheme.axis.fontSize }}\n tickLine={false}\n axisLine={{ stroke: aegisChartTheme.grid.stroke }}\n />\n <YAxis\n stroke={aegisChartTheme.axis.stroke}\n tick={{ fill: aegisChartTheme.axis.tickColor, fontSize: aegisChartTheme.axis.fontSize }}\n tickLine={false}\n axisLine={false}\n tickFormatter={(v) => valueFormatter(v as number)}\n width={48}\n />\n <Tooltip\n cursor={{ stroke: aegisChartTheme.grid.stroke, strokeWidth: 1 }}\n content={<ChartTooltip valueFormatter={valueFormatter} />}\n />\n {showLegendFinal && <Legend content={<ChartLegend />} />}\n {referenceLines?.map((ref, i) => (\n <ReferenceLine\n key={`ref-${i}`}\n y={ref.value}\n stroke={aegisChartTheme.reference.stroke}\n strokeDasharray={aegisChartTheme.reference.strokeDasharray}\n label={\n ref.label\n ? {\n value: ref.label,\n position: 'insideTopRight',\n fill: aegisChartTheme.tooltip.muted,\n fontSize: 11,\n }\n : undefined\n }\n />\n ))}\n {series.map((s, index) => {\n const color = getSeriesColor(index, s.color);\n return (\n <Line\n key={s.dataKey}\n type={smooth ? 'monotone' : 'linear'}\n dataKey={s.dataKey}\n name={s.label ?? s.dataKey}\n stroke={color}\n strokeWidth={2}\n dot={{ r: 0, fill: color }}\n activeDot={{ r: 5, strokeWidth: 0 }}\n isAnimationActive={false}\n />\n );\n })}\n </RechartsLineChart>\n </ResponsiveContainer>\n </ChartCard>\n );\n}\n","import {\n Area,\n AreaChart as RechartsAreaChart,\n CartesianGrid,\n Legend,\n ReferenceLine,\n ResponsiveContainer,\n Tooltip,\n XAxis,\n YAxis,\n} from 'recharts';\nimport { ChartCard, type ChartCardProps } from './ChartCard';\nimport { ChartLegend } from './ChartLegend';\nimport { ChartTooltip } from './ChartTooltip';\nimport {\n aegisChartTheme,\n defaultValueFormatter,\n getSeriesColor,\n type ChartSeries,\n type ValueFormatter,\n} from './chartTheme';\n\nexport interface AreaChartProps<T extends Record<string, unknown>>\n extends Omit<ChartCardProps, 'children'> {\n data: T[];\n xKey: keyof T & string;\n series: ChartSeries<T>[];\n height?: number;\n showLegend?: boolean;\n showGrid?: boolean;\n /** Stack areas (false = overlapping) */\n stacked?: boolean;\n valueFormatter?: ValueFormatter;\n referenceLines?: { value: number; label?: string }[];\n}\n\n/**\n * Aegis AreaChart — for cumulative trend / volume visualization.\n *\n * Set `stacked` to true to stack series on top of each other (e.g. cohort\n * composition over time).\n */\nexport function AreaChart<T extends Record<string, unknown>>({\n data,\n xKey,\n series,\n height = 280,\n showLegend,\n showGrid = true,\n stacked = false,\n valueFormatter = defaultValueFormatter,\n referenceLines,\n state,\n ...cardProps\n}: AreaChartProps<T>) {\n const effectiveState = state ?? (data.length === 0 ? 'empty' : 'ready');\n const showLegendFinal = showLegend ?? series.length > 1;\n\n return (\n <ChartCard state={effectiveState} {...cardProps}>\n <ResponsiveContainer width=\"100%\" height={height}>\n <RechartsAreaChart data={data} margin={{ top: 8, right: 16, left: 0, bottom: 0 }}>\n <defs>\n {series.map((s, index) => {\n const color = getSeriesColor(index, s.color);\n return (\n <linearGradient\n key={`grad-${s.dataKey}`}\n id={`aegis-area-${s.dataKey}`}\n x1=\"0\"\n y1=\"0\"\n x2=\"0\"\n y2=\"1\"\n >\n <stop offset=\"0%\" stopColor={color} stopOpacity={0.32} />\n <stop offset=\"100%\" stopColor={color} stopOpacity={0.02} />\n </linearGradient>\n );\n })}\n </defs>\n {showGrid && (\n <CartesianGrid\n vertical={false}\n stroke={aegisChartTheme.grid.stroke}\n strokeDasharray={aegisChartTheme.grid.strokeDasharray}\n />\n )}\n <XAxis\n dataKey={xKey}\n stroke={aegisChartTheme.axis.stroke}\n tick={{ fill: aegisChartTheme.axis.tickColor, fontSize: aegisChartTheme.axis.fontSize }}\n tickLine={false}\n axisLine={{ stroke: aegisChartTheme.grid.stroke }}\n />\n <YAxis\n stroke={aegisChartTheme.axis.stroke}\n tick={{ fill: aegisChartTheme.axis.tickColor, fontSize: aegisChartTheme.axis.fontSize }}\n tickLine={false}\n axisLine={false}\n tickFormatter={(v) => valueFormatter(v as number)}\n width={48}\n />\n <Tooltip\n cursor={{ stroke: aegisChartTheme.grid.stroke, strokeWidth: 1 }}\n content={<ChartTooltip valueFormatter={valueFormatter} />}\n />\n {showLegendFinal && <Legend content={<ChartLegend />} />}\n {referenceLines?.map((ref, i) => (\n <ReferenceLine\n key={`ref-${i}`}\n y={ref.value}\n stroke={aegisChartTheme.reference.stroke}\n strokeDasharray={aegisChartTheme.reference.strokeDasharray}\n label={\n ref.label\n ? {\n value: ref.label,\n position: 'insideTopRight',\n fill: aegisChartTheme.tooltip.muted,\n fontSize: 11,\n }\n : undefined\n }\n />\n ))}\n {series.map((s, index) => {\n const color = getSeriesColor(index, s.color);\n return (\n <Area\n key={s.dataKey}\n type=\"monotone\"\n dataKey={s.dataKey}\n name={s.label ?? s.dataKey}\n stroke={color}\n strokeWidth={2}\n fill={`url(#aegis-area-${s.dataKey})`}\n stackId={stacked ? 'aegis-stack' : undefined}\n isAnimationActive={false}\n activeDot={{ r: 5, strokeWidth: 0 }}\n />\n );\n })}\n </RechartsAreaChart>\n </ResponsiveContainer>\n </ChartCard>\n );\n}\n","import {\n Bar,\n BarChart as RechartsBarChart,\n CartesianGrid,\n Legend,\n ReferenceLine,\n ResponsiveContainer,\n Tooltip,\n XAxis,\n YAxis,\n} from 'recharts';\nimport { ChartCard, type ChartCardProps } from './ChartCard';\nimport { ChartLegend } from './ChartLegend';\nimport { ChartTooltip } from './ChartTooltip';\nimport {\n aegisChartTheme,\n defaultValueFormatter,\n getSeriesColor,\n type ChartSeries,\n type ValueFormatter,\n} from './chartTheme';\n\nexport interface BarChartProps<T extends Record<string, unknown>>\n extends Omit<ChartCardProps, 'children'> {\n data: T[];\n xKey: keyof T & string;\n series: ChartSeries<T>[];\n height?: number;\n showLegend?: boolean;\n showGrid?: boolean;\n /** Stack bars (renders as a stacked bar chart) */\n stacked?: boolean;\n /** Render bars horizontally */\n horizontal?: boolean;\n valueFormatter?: ValueFormatter;\n referenceLines?: { value: number; label?: string }[];\n}\n\n/**\n * Aegis BarChart — for categorical comparisons.\n *\n * Set `stacked` for stacked bars, `horizontal` for horizontal layout\n * (better for long category labels).\n */\nexport function BarChart<T extends Record<string, unknown>>({\n data,\n xKey,\n series,\n height = 280,\n showLegend,\n showGrid = true,\n stacked = false,\n horizontal = false,\n valueFormatter = defaultValueFormatter,\n referenceLines,\n state,\n ...cardProps\n}: BarChartProps<T>) {\n const effectiveState = state ?? (data.length === 0 ? 'empty' : 'ready');\n const showLegendFinal = showLegend ?? series.length > 1;\n\n return (\n <ChartCard state={effectiveState} {...cardProps}>\n <ResponsiveContainer width=\"100%\" height={height}>\n <RechartsBarChart\n data={data}\n layout={horizontal ? 'vertical' : 'horizontal'}\n margin={{ top: 8, right: 16, left: 0, bottom: 0 }}\n barCategoryGap=\"22%\"\n >\n {showGrid && (\n <CartesianGrid\n vertical={horizontal}\n horizontal={!horizontal}\n stroke={aegisChartTheme.grid.stroke}\n strokeDasharray={aegisChartTheme.grid.strokeDasharray}\n />\n )}\n {horizontal ? (\n <>\n <XAxis\n type=\"number\"\n stroke={aegisChartTheme.axis.stroke}\n tick={{\n fill: aegisChartTheme.axis.tickColor,\n fontSize: aegisChartTheme.axis.fontSize,\n }}\n tickLine={false}\n axisLine={false}\n tickFormatter={(v) => valueFormatter(v as number)}\n />\n <YAxis\n type=\"category\"\n dataKey={xKey}\n stroke={aegisChartTheme.axis.stroke}\n tick={{\n fill: aegisChartTheme.axis.tickColor,\n fontSize: aegisChartTheme.axis.fontSize,\n }}\n tickLine={false}\n axisLine={{ stroke: aegisChartTheme.grid.stroke }}\n width={96}\n />\n </>\n ) : (\n <>\n <XAxis\n dataKey={xKey}\n stroke={aegisChartTheme.axis.stroke}\n tick={{\n fill: aegisChartTheme.axis.tickColor,\n fontSize: aegisChartTheme.axis.fontSize,\n }}\n tickLine={false}\n axisLine={{ stroke: aegisChartTheme.grid.stroke }}\n />\n <YAxis\n stroke={aegisChartTheme.axis.stroke}\n tick={{\n fill: aegisChartTheme.axis.tickColor,\n fontSize: aegisChartTheme.axis.fontSize,\n }}\n tickLine={false}\n axisLine={false}\n tickFormatter={(v) => valueFormatter(v as number)}\n width={48}\n />\n </>\n )}\n <Tooltip\n cursor={{ fill: 'var(--aegis-state-hover-overlay)' }}\n content={<ChartTooltip valueFormatter={valueFormatter} />}\n />\n {showLegendFinal && <Legend content={<ChartLegend />} />}\n {referenceLines?.map((ref, i) => (\n <ReferenceLine\n key={`ref-${i}`}\n {...(horizontal ? { x: ref.value } : { y: ref.value })}\n stroke={aegisChartTheme.reference.stroke}\n strokeDasharray={aegisChartTheme.reference.strokeDasharray}\n label={\n ref.label\n ? {\n value: ref.label,\n position: 'insideTopRight',\n fill: aegisChartTheme.tooltip.muted,\n fontSize: 11,\n }\n : undefined\n }\n />\n ))}\n {series.map((s, index) => {\n const color = getSeriesColor(index, s.color);\n return (\n <Bar\n key={s.dataKey}\n dataKey={s.dataKey}\n name={s.label ?? s.dataKey}\n fill={color}\n radius={[4, 4, 0, 0]}\n stackId={stacked ? 'aegis-stack' : undefined}\n isAnimationActive={false}\n />\n );\n })}\n </RechartsBarChart>\n </ResponsiveContainer>\n </ChartCard>\n );\n}\n","import { BarChart, type BarChartProps } from './BarChart';\n\n/**\n * Aegis StackedBarChart — convenience wrapper around BarChart with\n * `stacked` enabled by default. Use this when stacking is the default\n * intent (e.g. cohort breakdown over time).\n */\nexport function StackedBarChart<T extends Record<string, unknown>>(\n props: Omit<BarChartProps<T>, 'stacked'>,\n) {\n return <BarChart {...props} stacked />;\n}\n\nexport type { BarChartProps as StackedBarChartProps } from './BarChart';\n","import { Cell, Pie, PieChart as RechartsPieChart, ResponsiveContainer, Tooltip } from 'recharts';\nimport { ChartCard, type ChartCardProps } from './ChartCard';\nimport { ChartTooltip } from './ChartTooltip';\nimport { defaultValueFormatter, getSeriesColor, type ValueFormatter } from './chartTheme';\nimport styles from './DonutChart.module.css';\n\nexport interface DonutChartDatum {\n /** Display label for the slice */\n name: string;\n /** Numeric value */\n value: number;\n /** Optional explicit color (defaults to Aegis palette) */\n color?: string;\n}\n\nexport interface DonutChartProps extends Omit<ChartCardProps, 'children'> {\n data: DonutChartDatum[];\n /** Center label (e.g. total value) */\n centerLabel?: string;\n /** Center sublabel (e.g. \"patients\") */\n centerSublabel?: string;\n /** Render as full pie instead of donut */\n variant?: 'donut' | 'pie';\n /** Chart height (defaults to 280) */\n height?: number;\n /** Format slice values in tooltip */\n valueFormatter?: ValueFormatter;\n /** Show legend list to the right of the chart */\n showLegend?: boolean;\n}\n\n/**\n * Aegis DonutChart — for distribution / part-to-whole comparisons.\n *\n * Center label/sublabel slots support headline metrics inside the donut.\n * For pie semantics, set `variant=\"pie\"`.\n */\nexport function DonutChart({\n data,\n centerLabel,\n centerSublabel,\n variant = 'donut',\n height = 280,\n valueFormatter = defaultValueFormatter,\n showLegend = true,\n state,\n ...cardProps\n}: DonutChartProps) {\n const effectiveState = state ?? (data.length === 0 ? 'empty' : 'ready');\n const total = data.reduce((sum, d) => sum + d.value, 0);\n\n return (\n <ChartCard state={effectiveState} {...cardProps}>\n <div className={styles.layout}>\n <div className={styles.chartWrap} style={{ height }}>\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <RechartsPieChart>\n <Pie\n data={data}\n dataKey=\"value\"\n nameKey=\"name\"\n cx=\"50%\"\n cy=\"50%\"\n innerRadius={variant === 'donut' ? '64%' : 0}\n outerRadius=\"92%\"\n paddingAngle={variant === 'donut' ? 2 : 0}\n stroke=\"var(--aegis-color-surface-default)\"\n strokeWidth={2}\n isAnimationActive={false}\n >\n {data.map((entry, index) => (\n <Cell key={`cell-${index}`} fill={getSeriesColor(index, entry.color)} />\n ))}\n </Pie>\n <Tooltip content={<ChartTooltip valueFormatter={valueFormatter} />} />\n </RechartsPieChart>\n </ResponsiveContainer>\n {variant === 'donut' && (centerLabel || centerSublabel) && (\n <div className={styles.center} aria-hidden=\"true\">\n {centerLabel && <div className={styles.centerLabel}>{centerLabel}</div>}\n {centerSublabel && <div className={styles.centerSub}>{centerSublabel}</div>}\n </div>\n )}\n </div>\n {showLegend && (\n <ul className={styles.legend}>\n {data.map((entry, index) => {\n const color = getSeriesColor(index, entry.color);\n const pct = total > 0 ? (entry.value / total) * 100 : 0;\n return (\n <li key={`${entry.name}-${index}`} className={styles.legendItem}>\n <span\n className={styles.swatch}\n style={{ backgroundColor: color }}\n aria-hidden=\"true\"\n />\n <span className={styles.legendLabel}>{entry.name}</span>\n <span className={styles.legendValue}>\n {valueFormatter(entry.value)}\n <span className={styles.legendPct}>{pct.toFixed(0)}%</span>\n </span>\n </li>\n );\n })}\n </ul>\n )}\n </div>\n </ChartCard>\n );\n}\n",".layout {\n display: grid;\n grid-template-columns: minmax(200px, 1fr) minmax(180px, 1fr);\n gap: var(--aegis-space-6);\n align-items: center;\n width: 100%;\n}\n\n@media (max-width: 640px) {\n .layout {\n grid-template-columns: 1fr;\n }\n}\n\n.chartWrap {\n position: relative;\n width: 100%;\n}\n\n.center {\n position: absolute;\n inset: 0;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n pointer-events: none;\n}\n\n.centerLabel {\n font-family: var(--aegis-font-family-sans);\n font-size: var(--aegis-font-size-display-md);\n line-height: 1;\n font-weight: var(--aegis-font-weight-semibold);\n color: var(--aegis-color-text-primary);\n letter-spacing: var(--aegis-tracking-tight);\n font-variant-numeric: tabular-nums;\n}\n\n.centerSub {\n margin-top: var(--aegis-space-1);\n font-size: var(--aegis-font-size-caption);\n text-transform: uppercase;\n letter-spacing: var(--aegis-tracking-wide);\n color: var(--aegis-color-text-secondary);\n font-weight: var(--aegis-font-weight-medium);\n}\n\n.legend {\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n gap: var(--aegis-space-2);\n}\n\n.legendItem {\n display: grid;\n grid-template-columns: 12px 1fr auto;\n align-items: center;\n gap: var(--aegis-space-3);\n padding: var(--aegis-space-2) 0;\n border-bottom: var(--aegis-border-width-hairline) solid var(--aegis-color-border-subtle);\n font-size: var(--aegis-font-size-body-sm);\n}\n\n.legendItem:last-child {\n border-bottom: none;\n}\n\n.swatch {\n width: 10px;\n height: 10px;\n border-radius: var(--aegis-radius-sm);\n}\n\n.legendLabel {\n color: var(--aegis-color-text-secondary);\n}\n\n.legendValue {\n display: inline-flex;\n align-items: baseline;\n gap: var(--aegis-space-2);\n font-family: var(--aegis-font-family-mono);\n font-weight: var(--aegis-font-weight-semibold);\n color: var(--aegis-color-text-primary);\n font-variant-numeric: tabular-nums;\n}\n\n.legendPct {\n font-family: var(--aegis-font-family-sans);\n font-size: var(--aegis-font-size-caption);\n font-weight: var(--aegis-font-weight-medium);\n color: var(--aegis-color-text-muted);\n}\n","import {\n Area,\n AreaChart,\n Line,\n LineChart,\n ResponsiveContainer,\n} from 'recharts';\nimport { getSeriesColor } from './chartTheme';\n\nexport interface SparklineProps {\n /** Array of numeric values OR row objects */\n data: number[] | Record<string, unknown>[];\n /** Property name when `data` is row-shaped (defaults to \"value\") */\n dataKey?: string;\n /** Render style */\n variant?: 'line' | 'area';\n /** Width in px (defaults to 120) — accepts any CSS length */\n width?: number | string;\n /** Height in px (defaults to 36) */\n height?: number | string;\n /** Line/area color (defaults to first Aegis series color) */\n color?: string;\n /** Stroke width (defaults to 2) */\n strokeWidth?: number;\n /** Optional accessible label */\n ariaLabel?: string;\n}\n\n/**\n * Aegis Sparkline — minimal inline trend chart for KPIs and table cells.\n *\n * Pure visual: no axes, grid, tooltip, or legend. Designed to live inside\n * stat cards, data grid cells, and dense dashboard surfaces.\n */\nexport function Sparkline({\n data,\n dataKey = 'value',\n variant = 'line',\n width = 120,\n height = 36,\n color,\n strokeWidth = 2,\n ariaLabel,\n}: SparklineProps) {\n const normalized: Record<string, number>[] =\n typeof data[0] === 'number'\n ? (data as number[]).map((v, i) => ({ x: i, [dataKey]: v }))\n : (data as Record<string, number>[]);\n\n const stroke = getSeriesColor(0, color);\n const gradientId = `aegis-spark-${dataKey}-${Math.random().toString(36).slice(2, 8)}`;\n\n return (\n <div\n style={{ width, height, display: 'inline-block' }}\n role={ariaLabel ? 'img' : undefined}\n aria-label={ariaLabel}\n >\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n {variant === 'area' ? (\n <AreaChart data={normalized} margin={{ top: 2, right: 2, left: 2, bottom: 2 }}>\n <defs>\n <linearGradient id={gradientId} x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" stopColor={stroke} stopOpacity={0.32} />\n <stop offset=\"100%\" stopColor={stroke} stopOpacity={0} />\n </linearGradient>\n </defs>\n <Area\n type=\"monotone\"\n dataKey={dataKey}\n stroke={stroke}\n strokeWidth={strokeWidth}\n fill={`url(#${gradientId})`}\n isAnimationActive={false}\n dot={false}\n />\n </AreaChart>\n ) : (\n <LineChart data={normalized} margin={{ top: 2, right: 2, left: 2, bottom: 2 }}>\n <Line\n type=\"monotone\"\n dataKey={dataKey}\n stroke={stroke}\n strokeWidth={strokeWidth}\n dot={false}\n isAnimationActive={false}\n />\n </LineChart>\n )}\n </ResponsiveContainer>\n </div>\n );\n}\n",".card {\n display: flex;\n flex-direction: column;\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-sm);\n font-family: var(--aegis-font-family-sans);\n transition: box-shadow var(--aegis-motion-duration-base) var(--aegis-motion-easing-standard),\n transform var(--aegis-motion-duration-base) var(--aegis-motion-easing-standard);\n}\n\n.card:hover {\n box-shadow: var(--aegis-shadow-md);\n}\n\n.comfortable {\n padding: var(--aegis-space-5);\n gap: var(--aegis-space-4);\n}\n\n.compact {\n padding: var(--aegis-space-4);\n gap: var(--aegis-space-3);\n}\n\n.header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: var(--aegis-space-3);\n}\n\n.label {\n font-size: var(--aegis-font-size-label-md);\n font-weight: var(--aegis-font-weight-medium);\n color: var(--aegis-color-text-secondary);\n text-transform: uppercase;\n letter-spacing: var(--aegis-tracking-wide);\n}\n\n.icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n border-radius: var(--aegis-radius-md);\n background-color: var(--aegis-color-surface-subtle);\n color: var(--aegis-color-text-secondary);\n}\n\n.valueRow {\n display: flex;\n align-items: baseline;\n gap: var(--aegis-space-2);\n}\n\n.value {\n font-size: var(--aegis-font-size-display-md);\n line-height: var(--aegis-line-height-display-md);\n font-weight: var(--aegis-font-weight-semibold);\n color: var(--aegis-color-text-primary);\n letter-spacing: var(--aegis-tracking-tight);\n font-variant-numeric: tabular-nums;\n}\n\n.unit {\n font-size: var(--aegis-font-size-body-md);\n font-weight: var(--aegis-font-weight-medium);\n color: var(--aegis-color-text-muted);\n}\n\n.footer {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--aegis-space-3);\n min-height: 40px;\n}\n\n.trend {\n display: inline-flex;\n align-items: center;\n gap: var(--aegis-space-1);\n font-size: var(--aegis-font-size-body-sm);\n font-weight: var(--aegis-font-weight-semibold);\n font-variant-numeric: tabular-nums;\n flex-wrap: wrap;\n}\n\n.trendIcon {\n display: inline-flex;\n}\n\n.trendValue {\n font-weight: var(--aegis-font-weight-semibold);\n}\n\n.up {\n color: var(--aegis-color-success-700);\n}\n\n.down {\n color: var(--aegis-color-error-700);\n}\n\n.neutral {\n color: var(--aegis-color-text-muted);\n}\n\n.changeLabel {\n margin-left: var(--aegis-space-1);\n color: var(--aegis-color-text-muted);\n font-weight: var(--aegis-font-weight-regular);\n}\n\n.sparkSlot {\n flex: 1;\n min-width: 0;\n max-width: 50%;\n display: flex;\n justify-content: flex-end;\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@media (prefers-reduced-motion: reduce) {\n .card {\n transition: none;\n }\n}\n","import { type HTMLAttributes, type ReactNode } from 'react';\nimport { cn } from '../utils/cn';\nimport { Sparkline, type SparklineProps } from './Sparkline';\nimport styles from './KpiStatCard.module.css';\n\nexport type TrendDirection = 'up' | 'down' | 'neutral';\n\nexport interface KpiStatCardProps extends HTMLAttributes<HTMLDivElement> {\n /** Metric label (e.g. \"Active patients\") */\n label: string;\n /** Headline value (e.g. 1284 or \"98.2%\") */\n value: ReactNode;\n /** Optional unit/suffix shown next to the value */\n unit?: ReactNode;\n /** Percent change (number) — positive renders as up, negative as down */\n change?: number;\n /** Label for the change context (e.g. \"vs last 30 days\") */\n changeLabel?: string;\n /** Override trend direction (otherwise inferred from `change`) */\n trend?: TrendDirection;\n /**\n * For success-positive metrics, set `inverse` to flip color semantics\n * (e.g. \"wait time\" — a decrease is good).\n */\n inverse?: boolean;\n /** Optional icon rendered top-right */\n icon?: ReactNode;\n /** Optional sparkline data — when present, renders an inline trend chart */\n sparklineData?: SparklineProps['data'];\n /** Sparkline color override */\n sparklineColor?: string;\n /** Sparkline render variant */\n sparklineVariant?: SparklineProps['variant'];\n /** Density variant */\n density?: 'comfortable' | 'compact';\n}\n\nfunction inferTrend(change?: number): TrendDirection {\n if (change == null || change === 0) return 'neutral';\n return change > 0 ? 'up' : 'down';\n}\n\nconst trendIcons: Record<TrendDirection, ReactNode> = {\n up: (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M3 11l5-6 5 6H3z\" />\n </svg>\n ),\n down: (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M3 5l5 6 5-6H3z\" />\n </svg>\n ),\n neutral: (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M3 7h10v2H3z\" />\n </svg>\n ),\n};\n\n/**\n * KpiStatCard — premium stat card with optional inline sparkline.\n *\n * The chart-aware evolution of StatCard. Use for headline KPIs in\n * dashboards. Pair with `inverse` for metrics where a decrease is positive\n * (e.g. wait time, error rate).\n *\n * Accessibility:\n * - Trend icons are aria-hidden; meaning is conveyed in visible text plus an\n * sr-only direction phrase.\n * - Sparkline accepts `aria-label` for screen reader trend description.\n */\nexport function KpiStatCard({\n label,\n value,\n unit,\n change,\n changeLabel,\n trend,\n inverse = false,\n icon,\n sparklineData,\n sparklineColor,\n sparklineVariant = 'area',\n density = 'comfortable',\n className,\n ...props\n}: KpiStatCardProps) {\n const direction = trend ?? inferTrend(change);\n const semantic: TrendDirection =\n inverse && direction === 'up' ? 'down' : inverse && direction === 'down' ? 'up' : direction;\n\n const formattedChange =\n change !== undefined ? `${change > 0 ? '+' : ''}${change}%` : undefined;\n\n return (\n <div className={cn(styles.card, styles[density], 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\n <div className={styles.valueRow}>\n <span className={styles.value}>{value}</span>\n {unit && <span className={styles.unit}>{unit}</span>}\n </div>\n\n {(formattedChange || sparklineData) && (\n <div className={styles.footer}>\n {formattedChange && (\n <div className={cn(styles.trend, styles[semantic])}>\n <span className={styles.trendIcon}>{trendIcons[direction]}</span>\n <span className={styles.trendValue}>{formattedChange}</span>\n {changeLabel && <span className={styles.changeLabel}>{changeLabel}</span>}\n <span className={styles.srOnly}>\n {direction === 'up'\n ? 'increase'\n : direction === 'down'\n ? 'decrease'\n : 'no change'}\n </span>\n </div>\n )}\n {sparklineData && (\n <div className={styles.sparkSlot}>\n <Sparkline\n data={sparklineData}\n color={sparklineColor}\n variant={sparklineVariant}\n width=\"100%\"\n height={40}\n ariaLabel={`${label} trend`}\n />\n </div>\n )}\n </div>\n )}\n </div>\n );\n}\n","import { type HTMLAttributes, type ReactNode } from 'react';\nimport { cn } from '../utils/cn';\nimport {\n Area,\n AreaChart,\n ResponsiveContainer,\n Tooltip,\n XAxis,\n YAxis,\n} from 'recharts';\nimport { ChartTooltip } from './ChartTooltip';\nimport {\n defaultValueFormatter,\n getSeriesColor,\n type ValueFormatter,\n} from './chartTheme';\nimport styles from './TrendStatCard.module.css';\n\nexport type TrendDirection = 'up' | 'down' | 'neutral';\n\nexport interface TrendStatCardProps<T extends Record<string, unknown>>\n extends HTMLAttributes<HTMLDivElement> {\n /** Metric label (e.g. \"30-day readmissions\") */\n label: string;\n /** Headline value */\n value: ReactNode;\n /** Optional unit (e.g. \"%\", \"patients\") */\n unit?: ReactNode;\n /** Trend chart data — row-shaped */\n data: T[];\n /** X-axis key on each row */\n xKey: keyof T & string;\n /** Y value key on each row */\n yKey: keyof T & string;\n /** Percent change value */\n change?: number;\n /** Change context label */\n changeLabel?: string;\n /** Inverse semantics — set true when a decrease is \"good\" */\n inverse?: boolean;\n /** Color override for the trend area */\n color?: string;\n /** Format values shown in tooltip */\n valueFormatter?: ValueFormatter;\n /** Chart height (defaults to 80) */\n chartHeight?: number;\n}\n\nfunction inferTrend(change?: number): TrendDirection {\n if (change == null || change === 0) return 'neutral';\n return change > 0 ? 'up' : 'down';\n}\n\nconst trendIcons: Record<TrendDirection, ReactNode> = {\n up: (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M3 11l5-6 5 6H3z\" />\n </svg>\n ),\n down: (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M3 5l5 6 5-6H3z\" />\n </svg>\n ),\n neutral: (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M3 7h10v2H3z\" />\n </svg>\n ),\n};\n\n/**\n * TrendStatCard — KPI card with a prominent trend chart underneath.\n *\n * Larger than KpiStatCard's inline sparkline, designed to fill more space\n * in dashboard rows where a trend story is the primary message.\n */\nexport function TrendStatCard<T extends Record<string, unknown>>({\n label,\n value,\n unit,\n data,\n xKey,\n yKey,\n change,\n changeLabel,\n inverse = false,\n color,\n valueFormatter = defaultValueFormatter,\n chartHeight = 80,\n className,\n ...props\n}: TrendStatCardProps<T>) {\n const direction = inferTrend(change);\n const semantic: TrendDirection =\n inverse && direction === 'up' ? 'down' : inverse && direction === 'down' ? 'up' : direction;\n const stroke = getSeriesColor(0, color);\n const formattedChange =\n change !== undefined ? `${change > 0 ? '+' : ''}${change}%` : undefined;\n const gradientId = `trend-stat-${String(yKey)}-${Math.random().toString(36).slice(2, 8)}`;\n\n return (\n <div className={cn(styles.card, className)} {...props}>\n <div className={styles.header}>\n <span className={styles.label}>{label}</span>\n {formattedChange && (\n <span className={cn(styles.chip, styles[semantic])}>\n {trendIcons[direction]}\n <span>{formattedChange}</span>\n </span>\n )}\n </div>\n <div className={styles.valueRow}>\n <span className={styles.value}>{value}</span>\n {unit && <span className={styles.unit}>{unit}</span>}\n </div>\n {changeLabel && <div className={styles.changeLabel}>{changeLabel}</div>}\n <div className={styles.chartWrap} style={{ height: chartHeight }}>\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <AreaChart data={data} margin={{ top: 4, right: 0, left: 0, bottom: 0 }}>\n <defs>\n <linearGradient id={gradientId} x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" stopColor={stroke} stopOpacity={0.32} />\n <stop offset=\"100%\" stopColor={stroke} stopOpacity={0} />\n </linearGradient>\n </defs>\n <XAxis dataKey={xKey} hide />\n <YAxis hide />\n <Tooltip content={<ChartTooltip valueFormatter={valueFormatter} />} />\n <Area\n type=\"monotone\"\n dataKey={yKey}\n stroke={stroke}\n strokeWidth={2}\n fill={`url(#${gradientId})`}\n isAnimationActive={false}\n dot={false}\n />\n </AreaChart>\n </ResponsiveContainer>\n </div>\n </div>\n );\n}\n",".card {\n display: flex;\n flex-direction: column;\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-sm);\n padding: var(--aegis-space-5);\n gap: var(--aegis-space-2);\n font-family: var(--aegis-font-family-sans);\n transition: box-shadow var(--aegis-motion-duration-base) var(--aegis-motion-easing-standard);\n overflow: hidden;\n}\n\n.card:hover {\n box-shadow: var(--aegis-shadow-md);\n}\n\n.header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--aegis-space-3);\n}\n\n.label {\n font-size: var(--aegis-font-size-label-md);\n font-weight: var(--aegis-font-weight-medium);\n color: var(--aegis-color-text-secondary);\n text-transform: uppercase;\n letter-spacing: var(--aegis-tracking-wide);\n}\n\n.chip {\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-size: var(--aegis-font-size-caption);\n font-weight: var(--aegis-font-weight-semibold);\n border: var(--aegis-border-width-hairline) solid currentColor;\n background-color: transparent;\n}\n\n.up {\n color: var(--aegis-color-success-700);\n background-color: var(--aegis-color-success-50);\n border-color: var(--aegis-color-border-success);\n}\n\n.down {\n color: var(--aegis-color-error-700);\n background-color: var(--aegis-color-error-50);\n border-color: var(--aegis-color-border-error);\n}\n\n.neutral {\n color: var(--aegis-color-text-muted);\n background-color: var(--aegis-color-surface-subtle);\n border-color: var(--aegis-color-border-default);\n}\n\n.valueRow {\n display: flex;\n align-items: baseline;\n gap: var(--aegis-space-2);\n margin-top: var(--aegis-space-1);\n}\n\n.value {\n font-size: var(--aegis-font-size-display-md);\n line-height: var(--aegis-line-height-display-md);\n font-weight: var(--aegis-font-weight-semibold);\n color: var(--aegis-color-text-primary);\n letter-spacing: var(--aegis-tracking-tight);\n font-variant-numeric: tabular-nums;\n}\n\n.unit {\n font-size: var(--aegis-font-size-body-md);\n color: var(--aegis-color-text-muted);\n font-weight: var(--aegis-font-weight-medium);\n}\n\n.changeLabel {\n font-size: var(--aegis-font-size-caption);\n color: var(--aegis-color-text-muted);\n}\n\n.chartWrap {\n width: calc(100% + var(--aegis-space-10));\n margin: var(--aegis-space-2) calc(var(--aegis-space-5) * -1) calc(var(--aegis-space-5) * -1);\n}\n\n@media (prefers-reduced-motion: reduce) {\n .card {\n transition: none;\n }\n}\n"],"mappings":"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","names":["import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","statusLabels","import_jsx_runtime","statusLabels","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","statusLabels","import_jsx_runtime","statusLabels","import_jsx_runtime","statusLabels","import_react","import_jsx_runtime","statusIcons","duration","import_react","import_jsx_runtime","import_jsx_runtime","statusIcons","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","RechartsLineChart","import_recharts","import_jsx_runtime","RechartsAreaChart","import_recharts","import_jsx_runtime","RechartsBarChart","import_jsx_runtime","import_recharts","import_jsx_runtime","RechartsPieChart","import_recharts","import_jsx_runtime","import_jsx_runtime","trendIcons","semantic","import_recharts","import_jsx_runtime","inferTrend","trendIcons","semantic"]}
1
+ {"version":3,"sources":["../src/index.ts","../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/TextField/TextField.tsx","../src/utils/cn.ts","../src/components/TextField/TextField.module.css","../src/components/Button/Button.tsx","../src/components/Button/Button.module.css","../src/components/IconButton/IconButton.tsx","../src/components/IconButton/IconButton.module.css","../src/components/ButtonGroup/ButtonGroup.module.css","../src/components/ButtonGroup/ButtonGroup.tsx","../src/components/Checkbox/Checkbox.tsx","../src/components/Checkbox/Checkbox.module.css","../src/components/CheckboxGroup/CheckboxGroup.tsx","../src/components/HelperText/HelperText.module.css","../src/components/HelperText/HelperText.tsx","../src/components/CheckboxGroup/CheckboxGroup.module.css","../src/components/Radio/Radio.tsx","../src/components/Radio/Radio.module.css","../src/components/RadioGroup/RadioGroup.tsx","../src/components/RadioGroup/RadioGroup.module.css","../src/components/Select/Select.tsx","../src/components/Select/Select.module.css","../src/components/Switch/Switch.tsx","../src/components/Switch/Switch.module.css","../src/components/Textarea/Textarea.tsx","../src/components/Textarea/Textarea.module.css","../src/components/Slider/Slider.tsx","../src/components/Slider/Slider.module.css","../src/components/NumberField/NumberField.tsx","../src/components/NumberField/NumberField.module.css","../src/components/SearchField/SearchField.tsx","../src/components/SearchField/SearchField.module.css","../src/components/Autocomplete/Autocomplete.tsx","../src/components/Autocomplete/Autocomplete.module.css","../src/components/MultiSelect/MultiSelect.tsx","../src/components/MultiSelect/MultiSelect.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/ColorPicker/ColorPicker.tsx","../src/components/ColorPicker/ColorPicker.module.css","../src/components/Rating/Rating.tsx","../src/components/Rating/Rating.module.css","../src/components/TagInput/TagInput.tsx","../src/components/TagInput/TagInput.module.css","../src/components/Avatar/Avatar.tsx","../src/components/Avatar/Avatar.module.css","../src/components/Badge/Badge.module.css","../src/components/Badge/Badge.tsx","../src/components/Chip/Chip.tsx","../src/components/Chip/Chip.module.css","../src/components/Divider/Divider.module.css","../src/components/Divider/Divider.tsx","../src/components/List/List.tsx","../src/components/List/List.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/Progress/Progress.module.css","../src/components/Progress/Progress.tsx","../src/components/Skeleton/Skeleton.module.css","../src/components/Skeleton/Skeleton.tsx","../src/components/Spinner/Spinner.module.css","../src/components/Spinner/Spinner.tsx","../src/components/StatusBadge/StatusBadge.module.css","../src/components/StatusBadge/StatusBadge.tsx","../src/components/Timeline/Timeline.module.css","../src/components/Timeline/Timeline.tsx","../src/components/DescriptionList/DescriptionList.module.css","../src/components/DescriptionList/DescriptionList.tsx","../src/components/Kbd/Kbd.module.css","../src/components/Kbd/Kbd.tsx","../src/components/TreeView/TreeView.tsx","../src/components/TreeView/TreeView.module.css","../src/components/Typography/Typography.tsx","../src/components/Typography/Typography.module.css","../src/components/Alert/Alert.module.css","../src/components/Alert/Alert.tsx","../src/components/Backdrop/Backdrop.tsx","../src/components/Backdrop/Backdrop.module.css","../src/components/Dialog/Dialog.tsx","../src/components/Dialog/Dialog.module.css","../src/components/EmptyState/EmptyState.module.css","../src/components/EmptyState/EmptyState.tsx","../src/components/ErrorState/ErrorState.module.css","../src/components/ErrorState/ErrorState.tsx","../src/components/Toast/Toast.tsx","../src/components/Toast/Toast.module.css","../src/components/Banner/Banner.module.css","../src/components/Banner/Banner.tsx","../src/components/Accordion/Accordion.tsx","../src/components/Accordion/Accordion.module.css","../src/components/AppBar/AppBar.module.css","../src/components/AppBar/AppBar.tsx","../src/components/Paper/Paper.tsx","../src/components/Paper/Paper.module.css","../src/components/Card/Card.module.css","../src/components/Card/Card.tsx","../src/components/Modal/Modal.tsx","../src/components/Modal/Modal.module.css","../src/components/Popover/Popover.tsx","../src/components/Popover/Popover.module.css","../src/components/CollapsiblePanel/CollapsiblePanel.tsx","../src/components/CollapsiblePanel/CollapsiblePanel.module.css","../src/components/Breadcrumbs/Breadcrumbs.module.css","../src/components/Breadcrumbs/Breadcrumbs.tsx","../src/components/Drawer/Drawer.tsx","../src/components/Drawer/Drawer.module.css","../src/components/Link/Link.tsx","../src/components/Link/Link.module.css","../src/components/Menu/Menu.tsx","../src/components/Menu/Menu.module.css","../src/components/Pagination/Pagination.module.css","../src/components/Pagination/Pagination.tsx","../src/components/SideNav/SideNav.module.css","../src/components/SideNav/SideNav.tsx","../src/components/Stepper/Stepper.module.css","../src/components/Stepper/Stepper.tsx","../src/components/Tabs/Tabs.tsx","../src/components/Tabs/Tabs.module.css","../src/components/CommandPalette/CommandPalette.tsx","../src/components/CommandPalette/CommandPalette.module.css","../src/components/FormField/FormField.tsx","../src/components/Label/Label.module.css","../src/components/Label/Label.tsx","../src/components/FormField/FormField.module.css","../src/components/Container/Container.tsx","../src/components/Container/Container.module.css","../src/components/Grid/Grid.tsx","../src/components/Grid/Grid.module.css","../src/components/Stack/Stack.tsx","../src/components/Stack/Stack.module.css","../src/components/InputGroup/InputGroup.module.css","../src/components/InputGroup/InputGroup.tsx","../src/components/Toolbar/Toolbar.tsx","../src/components/Toolbar/Toolbar.module.css","../src/components/VisuallyHidden/VisuallyHidden.module.css","../src/components/VisuallyHidden/VisuallyHidden.tsx","../src/components/Portal/Portal.tsx","../src/components/DataGrid/DataGrid.tsx","../src/components/DataGrid/DataGrid.module.css","../src/components/DatePicker/DatePicker.tsx","../src/components/DatePicker/DatePicker.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/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/charts/ChartCard.module.css","../src/charts/ChartCard.tsx","../src/charts/chartTheme.ts","../src/charts/ChartTooltip.module.css","../src/charts/ChartTooltip.tsx","../src/charts/ChartLegend.module.css","../src/charts/ChartLegend.tsx","../src/charts/LineChart.tsx","../src/charts/AreaChart.tsx","../src/charts/BarChart.tsx","../src/charts/StackedBarChart.tsx","../src/charts/DonutChart.tsx","../src/charts/DonutChart.module.css","../src/charts/Sparkline.tsx","../src/charts/KpiStatCard.module.css","../src/charts/KpiStatCard.tsx","../src/charts/TrendStatCard.tsx","../src/charts/TrendStatCard.module.css"],"sourcesContent":["// Design tokens (CSS variables are the primary token delivery mechanism)\n// Import '@skyfall/aegis/dist/tokens/aegis-tokens.css' in your app\nexport * from './tokens';\n\n// Components\nexport * from './components';\n\n// Data visualization (Recharts-based)\nexport * from './charts';\n\n// Utilities\nexport { cn } from './utils/cn';\n\n// Types\nexport type { Size, Status, Variant } from './types/common';\n","/** 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 InputHTMLAttributes } from 'react';\nimport { cn } from '../../utils/cn';\nimport styles from './TextField.module.css';\n\nexport interface TextFieldProps 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 * TextField — 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 TextField = forwardRef<HTMLInputElement, TextFieldProps>(\n ({ size = 'md', error = false, fullWidth = false, className, ...props }, ref) => (\n <input\n ref={ref}\n className={cn(\n styles.textField,\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\nTextField.displayName = 'TextField';\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",".textField {\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.textField::placeholder {\n color: var(--aegis-color-text-muted);\n}\n\n.textField:hover:not(:disabled):not(:focus) {\n border-color: var(--aegis-color-border-strong);\n background-color: var(--aegis-color-surface-hover);\n}\n\n.textField: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.textField: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 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",".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",".group {\n display: inline-flex;\n gap: var(--aegis-space-2);\n}\n\n.vertical {\n flex-direction: column;\n}\n\n/* Connected (toolbar) style */\n.connected {\n gap: 0;\n}\n\n.connected.horizontal > :global(button) {\n border-radius: 0;\n}\n\n.connected.horizontal > :global(button:first-child) {\n border-top-left-radius: var(--aegis-radius-md);\n border-bottom-left-radius: var(--aegis-radius-md);\n}\n\n.connected.horizontal > :global(button:last-child) {\n border-top-right-radius: var(--aegis-radius-md);\n border-bottom-right-radius: var(--aegis-radius-md);\n}\n\n.connected.horizontal > :global(button:not(:first-child)) {\n margin-left: calc(-1 * var(--aegis-border-width-hairline));\n}\n\n.connected.vertical > :global(button) {\n border-radius: 0;\n width: 100%;\n}\n\n.connected.vertical > :global(button:first-child) {\n border-top-left-radius: var(--aegis-radius-md);\n border-top-right-radius: var(--aegis-radius-md);\n}\n\n.connected.vertical > :global(button:last-child) {\n border-bottom-left-radius: var(--aegis-radius-md);\n border-bottom-right-radius: var(--aegis-radius-md);\n}\n\n.connected.vertical > :global(button:not(:first-child)) {\n margin-top: calc(-1 * var(--aegis-border-width-hairline));\n}\n\n/* Size propagation via CSS custom property */\n.size-sm { --aegis-btn-group-size: sm; }\n.size-md { --aegis-btn-group-size: md; }\n.size-lg { --aegis-btn-group-size: lg; }\n","import { type HTMLAttributes } from 'react';\nimport { cn } from '../../utils/cn';\nimport styles from './ButtonGroup.module.css';\n\nexport interface ButtonGroupProps extends HTMLAttributes<HTMLDivElement> {\n /** Layout direction */\n orientation?: 'horizontal' | 'vertical';\n /** Size applied to all child buttons */\n size?: 'sm' | 'md' | 'lg';\n /** Whether buttons should share borders (connected style) */\n connected?: boolean;\n}\n\n/**\n * ButtonGroup — layout wrapper for grouping related buttons.\n *\n * Renders multiple Button children in a connected or spaced row/column.\n * When connected, adjacent buttons share borders for a toolbar appearance.\n *\n * Accessibility:\n * - Uses role=\"group\" with optional aria-label for grouping context\n * - Individual buttons retain their own keyboard navigation\n */\nexport function ButtonGroup({\n orientation = 'horizontal',\n size,\n connected = false,\n className,\n children,\n ...props\n}: ButtonGroupProps) {\n return (\n <div\n role=\"group\"\n className={cn(\n styles.group,\n styles[orientation],\n connected && styles.connected,\n size && styles[`size-${size}`],\n className,\n )}\n {...props}\n >\n {children}\n </div>\n );\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 { 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",".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",".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, 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 { 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, 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 './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","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, 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 { 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 { 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 { 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","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 { 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 { useState, useRef, useEffect, useCallback, forwardRef, type HTMLAttributes } from 'react';\nimport { cn } from '../../utils/cn';\nimport styles from './ColorPicker.module.css';\n\nexport interface ColorPickerProps extends Omit<HTMLAttributes<HTMLDivElement>, 'onChange'> {\n /** Current color value (hex) */\n value?: string;\n /** Called when color changes */\n onChange?: (color: string) => void;\n /** Predefined color swatches */\n swatches?: string[];\n /** Label */\n label?: string;\n /** Disabled state */\n disabled?: boolean;\n /** Size variant */\n size?: 'sm' | 'md';\n}\n\nconst defaultSwatches = [\n '#0A2540', '#1A73E8', '#0D9488', '#16A34A', '#EAB308',\n '#F97316', '#EF4444', '#A855F7', '#EC4899', '#6B7280',\n '#374151', '#FFFFFF',\n];\n\n/**\n * ColorPicker — color selection input with swatch palette and native picker.\n *\n * Provides a swatch grid for quick selection plus a native `<input type=\"color\">`\n * fallback for custom colors.\n *\n * Accessibility:\n * - Swatch buttons have aria-label with hex value\n * - Selected swatch indicated with aria-pressed\n * - Native color input provides full keyboard + assistive tech support\n */\nexport const ColorPicker = forwardRef<HTMLDivElement, ColorPickerProps>(\n (\n {\n value = '#0A2540',\n onChange,\n swatches = defaultSwatches,\n label,\n disabled = false,\n size = 'md',\n className,\n ...props\n },\n ref,\n ) => {\n const [currentColor, setCurrentColor] = useState(value);\n const nativeRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n setCurrentColor(value);\n }, [value]);\n\n const handleChange = useCallback(\n (color: string) => {\n if (disabled) return;\n setCurrentColor(color);\n onChange?.(color);\n },\n [disabled, onChange],\n );\n\n return (\n <div\n ref={ref}\n className={cn(styles.picker, styles[size], disabled && styles.disabled, className)}\n {...props}\n >\n {label && <span className={styles.label}>{label}</span>}\n\n <div className={styles.preview}>\n <button\n type=\"button\"\n className={styles.swatch}\n style={{ backgroundColor: currentColor }}\n onClick={() => nativeRef.current?.click()}\n disabled={disabled}\n aria-label={`Selected color: ${currentColor}`}\n />\n <span className={styles.hex}>{currentColor.toUpperCase()}</span>\n <input\n ref={nativeRef}\n type=\"color\"\n className={styles.nativeInput}\n value={currentColor}\n onChange={(e) => handleChange(e.target.value)}\n disabled={disabled}\n tabIndex={-1}\n aria-hidden=\"true\"\n />\n </div>\n\n {swatches.length > 0 && (\n <div className={styles.swatchGrid} role=\"listbox\" aria-label=\"Color swatches\">\n {swatches.map((color) => (\n <button\n key={color}\n type=\"button\"\n role=\"option\"\n className={cn(\n styles.swatchOption,\n currentColor.toLowerCase() === color.toLowerCase() && styles.selected,\n )}\n style={{ backgroundColor: color }}\n onClick={() => handleChange(color)}\n disabled={disabled}\n aria-label={color}\n aria-selected={currentColor.toLowerCase() === color.toLowerCase()}\n />\n ))}\n </div>\n )}\n </div>\n );\n },\n);\n\nColorPicker.displayName = 'ColorPicker';\n",".picker {\n display: inline-flex;\n flex-direction: column;\n gap: var(--aegis-space-3);\n font-family: var(--aegis-font-family-sans);\n}\n\n.disabled {\n opacity: var(--aegis-opacity-disabled);\n pointer-events: none;\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-primary);\n}\n\n.preview {\n display: flex;\n align-items: center;\n gap: var(--aegis-space-2);\n position: relative;\n}\n\n.swatch {\n border: var(--aegis-border-width-hairline) var(--aegis-border-style-default) var(--aegis-color-border-default);\n cursor: pointer;\n flex-shrink: 0;\n transition: box-shadow var(--aegis-motion-duration-fast) var(--aegis-motion-easing-standard);\n}\n\n.sm .swatch { width: 24px; height: 24px; border-radius: var(--aegis-radius-sm); }\n.md .swatch { width: 32px; height: 32px; border-radius: var(--aegis-radius-md); }\n\n.swatch:hover {\n box-shadow: var(--aegis-shadow-sm);\n}\n\n.swatch:focus-visible {\n outline: var(--aegis-border-width-medium) solid var(--aegis-focus-outline-color);\n outline-offset: 2px;\n}\n\n.hex {\n font-size: var(--aegis-font-size-body-sm);\n font-family: var(--aegis-font-family-mono, monospace);\n color: var(--aegis-color-text-secondary);\n min-width: 68px;\n}\n\n.nativeInput {\n position: absolute;\n opacity: 0;\n width: 0;\n height: 0;\n pointer-events: none;\n}\n\n.swatchGrid {\n display: flex;\n flex-wrap: wrap;\n gap: var(--aegis-space-1);\n}\n\n.swatchOption {\n width: 24px;\n height: 24px;\n border-radius: var(--aegis-radius-sm);\n border: var(--aegis-border-width-hairline) var(--aegis-border-style-default) var(--aegis-color-border-default);\n cursor: pointer;\n transition:\n transform 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.swatchOption:hover {\n transform: scale(1.15);\n}\n\n.swatchOption:focus-visible {\n outline: var(--aegis-border-width-medium) solid var(--aegis-focus-outline-color);\n outline-offset: 2px;\n}\n\n.swatchOption.selected {\n box-shadow: 0 0 0 2px var(--aegis-color-surface-default), 0 0 0 4px var(--aegis-color-brand-primary-500);\n}\n","import { useState, useCallback, forwardRef, type HTMLAttributes, type KeyboardEvent } from 'react';\nimport { cn } from '../../utils/cn';\nimport styles from './Rating.module.css';\n\nexport interface RatingProps extends Omit<HTMLAttributes<HTMLDivElement>, 'onChange'> {\n /** Current rating value (0 = no rating) */\n value?: number;\n /** Called when rating changes */\n onChange?: (value: number) => void;\n /** Maximum rating value */\n max?: number;\n /** Size variant */\n size?: 'sm' | 'md' | 'lg';\n /** Whether the rating is read-only */\n readOnly?: boolean;\n /** Disabled state */\n disabled?: boolean;\n /** Label for accessibility */\n label?: string;\n /** Custom icon renderer — receives filled state */\n renderIcon?: (filled: boolean, index: number) => React.ReactNode;\n}\n\nconst StarIcon = ({ filled }: { filled: boolean }) => (\n <svg\n width=\"1em\"\n height=\"1em\"\n viewBox=\"0 0 24 24\"\n fill={filled ? 'currentColor' : 'none'}\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <polygon points=\"12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2\" />\n </svg>\n);\n\n/**\n * Rating — star-based rating input with keyboard navigation.\n *\n * Supports custom max values, read-only display, and custom icon rendering.\n *\n * Accessibility:\n * - Uses radio group pattern with arrow key navigation\n * - Each star has aria-label with its value\n * - Supports keyboard: ArrowLeft/Right to navigate, Enter/Space to select\n */\nexport const Rating = forwardRef<HTMLDivElement, RatingProps>(\n (\n {\n value = 0,\n onChange,\n max = 5,\n size = 'md',\n readOnly = false,\n disabled = false,\n label = 'Rating',\n renderIcon,\n className,\n ...props\n },\n ref,\n ) => {\n const [hovered, setHovered] = useState<number | null>(null);\n const interactive = !readOnly && !disabled;\n\n const handleSelect = useCallback(\n (star: number) => {\n if (!interactive) return;\n // Toggle off if clicking same value\n onChange?.(star === value ? 0 : star);\n },\n [interactive, onChange, value],\n );\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent<HTMLDivElement>) => {\n if (!interactive) return;\n\n let next = value;\n if (e.key === 'ArrowRight' || e.key === 'ArrowUp') {\n e.preventDefault();\n next = Math.min(value + 1, max);\n } else if (e.key === 'ArrowLeft' || e.key === 'ArrowDown') {\n e.preventDefault();\n next = Math.max(value - 1, 0);\n }\n\n if (next !== value) {\n onChange?.(next);\n }\n },\n [interactive, value, max, onChange],\n );\n\n const displayValue = hovered ?? value;\n\n return (\n <div\n ref={ref}\n className={cn(\n styles.rating,\n styles[size],\n readOnly && styles.readOnly,\n disabled && styles.disabled,\n className,\n )}\n role=\"radiogroup\"\n aria-label={label}\n tabIndex={interactive ? 0 : undefined}\n onKeyDown={interactive ? handleKeyDown : undefined}\n {...props}\n >\n {Array.from({ length: max }, (_, i) => {\n const starValue = i + 1;\n const filled = starValue <= displayValue;\n\n return (\n <button\n key={starValue}\n type=\"button\"\n role=\"radio\"\n className={cn(styles.star, filled && styles.filled)}\n aria-checked={starValue === value}\n aria-label={`${starValue} of ${max}`}\n tabIndex={-1}\n disabled={disabled || readOnly}\n onClick={() => handleSelect(starValue)}\n onMouseEnter={() => interactive && setHovered(starValue)}\n onMouseLeave={() => interactive && setHovered(null)}\n >\n {renderIcon ? renderIcon(filled, i) : <StarIcon filled={filled} />}\n </button>\n );\n })}\n </div>\n );\n },\n);\n\nRating.displayName = 'Rating';\n",".rating {\n display: inline-flex;\n align-items: center;\n gap: var(--aegis-space-1);\n font-family: var(--aegis-font-family-sans);\n}\n\n.readOnly {\n pointer-events: none;\n}\n\n.disabled {\n opacity: var(--aegis-opacity-disabled);\n pointer-events: none;\n}\n\n/* Sizes */\n.sm .star { font-size: 16px; }\n.md .star { font-size: 24px; }\n.lg .star { font-size: 32px; }\n\n/* Star button */\n.star {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 0;\n border: none;\n background: transparent;\n cursor: pointer;\n color: var(--aegis-color-border-default);\n transition: color 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.star:hover:not(:disabled) {\n transform: scale(1.15);\n}\n\n.star: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.star.filled {\n color: var(--aegis-color-warning-500, #EAB308);\n}\n\n.star:disabled {\n cursor: default;\n}\n","import {\n useState,\n useRef,\n useCallback,\n forwardRef,\n type HTMLAttributes,\n type KeyboardEvent,\n} from 'react';\nimport { cn } from '../../utils/cn';\nimport styles from './TagInput.module.css';\n\nexport interface TagInputProps extends Omit<HTMLAttributes<HTMLDivElement>, 'onChange'> {\n /** Current tag values */\n value?: string[];\n /** Called when tags change */\n onChange?: (tags: string[]) => void;\n /** Placeholder for the text input */\n placeholder?: string;\n /** Label */\n label?: string;\n /** Maximum number of tags allowed */\n max?: number;\n /** Size variant */\n size?: 'sm' | 'md';\n /** Disabled state */\n disabled?: boolean;\n /** Error state */\n error?: boolean;\n /** Characters that trigger tag creation (default: Enter, comma) */\n separators?: string[];\n /** Whether duplicates are allowed */\n allowDuplicates?: boolean;\n}\n\nconst RemoveIcon = () => (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.75\"\n strokeLinecap=\"round\"\n aria-hidden=\"true\"\n >\n <line x1=\"3\" y1=\"3\" x2=\"9\" y2=\"9\" />\n <line x1=\"9\" y1=\"3\" x2=\"3\" y2=\"9\" />\n </svg>\n);\n\n/**\n * TagInput — multi-value text input that creates tag chips.\n *\n * Users type text and press Enter or comma to create tags.\n * Tags can be removed with Backspace or by clicking the remove button.\n *\n * Accessibility:\n * - Tags have aria-label and remove button with aria-label\n * - Backspace removes last tag when input is empty\n * - Screen readers announce tag count via aria-describedby\n */\nexport const TagInput = forwardRef<HTMLDivElement, TagInputProps>(\n (\n {\n value = [],\n onChange,\n placeholder = 'Add a tag…',\n label,\n max,\n size = 'md',\n disabled = false,\n error = false,\n separators = ['Enter', ','],\n allowDuplicates = false,\n className,\n ...props\n },\n ref,\n ) => {\n const [inputValue, setInputValue] = useState('');\n const inputRef = useRef<HTMLInputElement>(null);\n\n const addTag = useCallback(\n (raw: string) => {\n const tag = raw.trim();\n if (!tag) return;\n if (!allowDuplicates && value.includes(tag)) return;\n if (max && value.length >= max) return;\n\n onChange?.([...value, tag]);\n setInputValue('');\n },\n [value, onChange, allowDuplicates, max],\n );\n\n const removeTag = useCallback(\n (index: number) => {\n onChange?.(value.filter((_, i) => i !== index));\n },\n [value, onChange],\n );\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent<HTMLInputElement>) => {\n if (separators.includes(e.key)) {\n e.preventDefault();\n addTag(inputValue);\n } else if (e.key === 'Backspace' && inputValue === '' && value.length > 0) {\n removeTag(value.length - 1);\n }\n },\n [separators, inputValue, addTag, removeTag, value.length],\n );\n\n const handlePaste = useCallback(\n (e: React.ClipboardEvent<HTMLInputElement>) => {\n const text = e.clipboardData.getData('text');\n if (separators.includes(',') && text.includes(',')) {\n e.preventDefault();\n const parts = text.split(',');\n let updated = [...value];\n for (const part of parts) {\n const tag = part.trim();\n if (!tag) continue;\n if (!allowDuplicates && updated.includes(tag)) continue;\n if (max && updated.length >= max) break;\n updated = [...updated, tag];\n }\n onChange?.(updated);\n }\n },\n [value, onChange, separators, allowDuplicates, max],\n );\n\n const atLimit = max !== undefined && value.length >= max;\n\n return (\n <div\n ref={ref}\n className={cn(\n styles.wrapper,\n styles[size],\n error && styles.error,\n disabled && styles.disabled,\n className,\n )}\n {...props}\n >\n {label && <span className={styles.label}>{label}</span>}\n <div\n className={styles.container}\n onClick={() => inputRef.current?.focus()}\n role=\"presentation\"\n >\n {value.map((tag, i) => (\n <span key={`${tag}-${i}`} className={styles.tag}>\n <span className={styles.tagText}>{tag}</span>\n {!disabled && (\n <button\n type=\"button\"\n className={styles.remove}\n onClick={(e) => {\n e.stopPropagation();\n removeTag(i);\n }}\n aria-label={`Remove ${tag}`}\n tabIndex={-1}\n >\n <RemoveIcon />\n </button>\n )}\n </span>\n ))}\n {!atLimit && (\n <input\n ref={inputRef}\n type=\"text\"\n className={styles.input}\n value={inputValue}\n onChange={(e) => setInputValue(e.target.value)}\n onKeyDown={handleKeyDown}\n onPaste={handlePaste}\n placeholder={value.length === 0 ? placeholder : ''}\n disabled={disabled}\n aria-label={label ?? 'Add tag'}\n />\n )}\n </div>\n {max !== undefined && (\n <span className={styles.count} aria-live=\"polite\">\n {value.length}/{max}\n </span>\n )}\n </div>\n );\n },\n);\n\nTagInput.displayName = 'TagInput';\n",".wrapper {\n display: flex;\n flex-direction: column;\n gap: var(--aegis-space-2);\n font-family: var(--aegis-font-family-sans);\n}\n\n.disabled {\n opacity: var(--aegis-opacity-disabled);\n pointer-events: none;\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-primary);\n}\n\n.container {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--aegis-space-1);\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: var(--aegis-color-surface-default);\n cursor: text;\n transition: 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.sm .container { padding: var(--aegis-space-1) var(--aegis-space-2); min-height: 32px; }\n.md .container { padding: var(--aegis-space-2) var(--aegis-space-3); min-height: 40px; }\n\n.container:focus-within {\n border-color: var(--aegis-color-brand-primary-500);\n box-shadow: 0 0 0 3px var(--aegis-focus-ring-color, rgba(26, 115, 232, 0.15));\n}\n\n.error .container {\n border-color: var(--aegis-color-error-500);\n}\n\n.error .container:focus-within {\n box-shadow: 0 0 0 3px rgba(239, 68, 68, 0.15);\n}\n\n/* Tag chip */\n.tag {\n display: inline-flex;\n align-items: center;\n gap: var(--aegis-space-1);\n background: var(--aegis-color-neutral-100);\n border-radius: var(--aegis-radius-full);\n max-width: 200px;\n}\n\n.sm .tag { padding: 1px var(--aegis-space-2); font-size: var(--aegis-font-size-caption); }\n.md .tag { padding: 2px var(--aegis-space-2); font-size: var(--aegis-font-size-body-sm); }\n\n.tagText {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n color: var(--aegis-color-text-primary);\n}\n\n.remove {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 0;\n border: none;\n background: transparent;\n color: var(--aegis-color-text-muted);\n cursor: pointer;\n border-radius: var(--aegis-radius-full);\n flex-shrink: 0;\n transition: color var(--aegis-motion-duration-fast) var(--aegis-motion-easing-standard);\n}\n\n.remove:hover {\n color: var(--aegis-color-text-primary);\n}\n\n/* Inline text input */\n.input {\n flex: 1;\n min-width: 80px;\n border: none;\n background: transparent;\n outline: none;\n font-family: var(--aegis-font-family-sans);\n color: var(--aegis-color-text-primary);\n}\n\n.sm .input { font-size: var(--aegis-font-size-caption); }\n.md .input { font-size: var(--aegis-font-size-body-sm); }\n\n.input::placeholder {\n color: var(--aegis-color-text-muted);\n}\n\n/* Count indicator */\n.count {\n font-size: var(--aegis-font-size-caption);\n color: var(--aegis-color-text-muted);\n align-self: flex-end;\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",".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","import { forwardRef, type HTMLAttributes, type ReactNode, type MouseEvent } from 'react';\nimport { cn } from '../../utils/cn';\nimport styles from './Chip.module.css';\n\nexport interface ChipProps extends Omit<HTMLAttributes<HTMLSpanElement>, 'onClick'> {\n /** Visual color variant */\n color?: 'neutral' | 'primary' | 'success' | 'warning' | 'error' | 'info';\n /** Size */\n size?: 'sm' | 'md';\n /** Chip style */\n variant?: 'filled' | 'outlined';\n /** Icon or avatar slot (leading) */\n icon?: ReactNode;\n /** Whether the chip is clickable */\n onClick?: (e: MouseEvent<HTMLSpanElement>) => void;\n /** Show a delete/dismiss button */\n onDelete?: (e: MouseEvent<HTMLButtonElement>) => void;\n /** Disabled state */\n disabled?: boolean;\n}\n\nconst DeleteIcon = () => (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.75\" strokeLinecap=\"round\" aria-hidden=\"true\">\n <line x1=\"4\" y1=\"4\" x2=\"10\" y2=\"10\" />\n <line x1=\"10\" y1=\"4\" x2=\"4\" y2=\"10\" />\n </svg>\n);\n\n/**\n * Chip — compact interactive element for tags, filters, and selections.\n *\n * Distinct from Badge: Chip is interactive (clickable, deletable) and\n * larger; Badge is a read-only status label.\n *\n * Accessibility:\n * - Clickable chips render with role=\"button\" and tabIndex\n * - Delete button has an accessible aria-label\n * - Disabled state applies aria-disabled\n * - Healthcare note: useful for allergy tags, condition labels,\n * insurance plan tags, filter selections\n */\nexport const Chip = forwardRef<HTMLSpanElement, ChipProps>(\n (\n {\n color = 'neutral',\n size = 'md',\n variant = 'filled',\n icon,\n onClick,\n onDelete,\n disabled = false,\n className,\n children,\n ...props\n },\n ref,\n ) => {\n const isClickable = !!onClick && !disabled;\n\n return (\n <span\n ref={ref}\n className={cn(\n styles.chip,\n styles[color],\n styles[size],\n styles[variant],\n isClickable && styles.clickable,\n disabled && styles.disabled,\n className,\n )}\n role={isClickable ? 'button' : undefined}\n tabIndex={isClickable ? 0 : undefined}\n onClick={isClickable ? onClick : undefined}\n onKeyDown={\n isClickable\n ? (e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onClick?.(e as any);\n }\n }\n : undefined\n }\n aria-disabled={disabled || undefined}\n {...props}\n >\n {icon && <span className={styles.icon} aria-hidden=\"true\">{icon}</span>}\n <span className={styles.label}>{children}</span>\n {onDelete && (\n <button\n type=\"button\"\n className={styles.deleteButton}\n onClick={(e) => {\n e.stopPropagation();\n if (!disabled) onDelete(e);\n }}\n disabled={disabled}\n aria-label={`Remove ${typeof children === 'string' ? children : ''}`}\n tabIndex={-1}\n >\n <DeleteIcon />\n </button>\n )}\n </span>\n );\n },\n);\n\nChip.displayName = 'Chip';\n",".chip {\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 vertical-align: middle;\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/* Sizes */\n.sm {\n height: 24px;\n padding: 0 var(--aegis-space-2);\n font-size: var(--aegis-font-size-caption);\n}\n\n.md {\n height: 30px;\n padding: 0 var(--aegis-space-3);\n font-size: var(--aegis-font-size-body-sm);\n}\n\n/* ---------- Filled ---------- */\n\n.filled.neutral {\n background-color: var(--aegis-color-neutral-100);\n color: var(--aegis-color-text-primary);\n}\n\n.filled.primary {\n background-color: var(--aegis-color-brand-primary-50);\n color: var(--aegis-color-brand-primary-700);\n}\n\n.filled.success {\n background-color: var(--aegis-color-success-50);\n color: var(--aegis-color-success-700);\n}\n\n.filled.warning {\n background-color: var(--aegis-color-warning-50);\n color: var(--aegis-color-warning-700);\n}\n\n.filled.error {\n background-color: var(--aegis-color-error-50);\n color: var(--aegis-color-error-700);\n}\n\n.filled.info {\n background-color: var(--aegis-color-info-50);\n color: var(--aegis-color-info-700);\n}\n\n/* ---------- Outlined ---------- */\n\n.outlined {\n background-color: transparent;\n border: var(--aegis-border-width-hairline) var(--aegis-border-style-default);\n}\n\n.outlined.neutral {\n border-color: var(--aegis-color-border-default);\n color: var(--aegis-color-text-primary);\n}\n\n.outlined.primary {\n border-color: var(--aegis-color-brand-primary-200);\n color: var(--aegis-color-brand-primary-700);\n}\n\n.outlined.success {\n border-color: var(--aegis-color-success-500);\n color: var(--aegis-color-success-700);\n}\n\n.outlined.warning {\n border-color: var(--aegis-color-warning-500);\n color: var(--aegis-color-warning-700);\n}\n\n.outlined.error {\n border-color: var(--aegis-color-error-500);\n color: var(--aegis-color-error-700);\n}\n\n.outlined.info {\n border-color: var(--aegis-color-info-500);\n color: var(--aegis-color-info-700);\n}\n\n/* ---------- Interactive ---------- */\n\n.clickable {\n cursor: pointer;\n}\n\n.clickable:hover {\n filter: brightness(0.96);\n}\n\n.clickable: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/* ---------- Disabled ---------- */\n\n.disabled {\n opacity: var(--aegis-opacity-disabled);\n cursor: not-allowed;\n pointer-events: none;\n}\n\n/* ---------- Sub-elements ---------- */\n\n.icon {\n display: flex;\n align-items: center;\n flex-shrink: 0;\n}\n\n.label {\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.deleteButton {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 0;\n margin: 0 calc(-1 * var(--aegis-space-1)) 0 0;\n border: none;\n background: none;\n color: inherit;\n cursor: pointer;\n border-radius: var(--aegis-radius-full);\n opacity: 0.64;\n transition: opacity var(--aegis-motion-duration-fast) var(--aegis-motion-easing-standard);\n}\n\n.deleteButton:hover {\n opacity: 1;\n}\n\n.deleteButton:disabled {\n cursor: not-allowed;\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","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",".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",".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 './Progress.module.css';\n\nexport interface ProgressProps 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 * Progress — 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 Progress({\n value,\n max = 100,\n size = 'md',\n variant = 'default',\n label,\n showValue = false,\n className,\n ...props\n}: ProgressProps) {\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",".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",".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",".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",".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",".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",".kbd {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n font-family: var(--aegis-font-family-sans);\n font-weight: var(--aegis-font-weight-medium);\n color: var(--aegis-color-text-secondary);\n background-color: var(--aegis-color-surface-sunken);\n border: var(--aegis-border-width-hairline) var(--aegis-border-style-default) var(--aegis-color-border-default);\n border-bottom-width: 2px;\n border-radius: var(--aegis-radius-sm);\n white-space: nowrap;\n line-height: 1;\n}\n\n.sm {\n min-width: 18px;\n height: 18px;\n padding: 0 var(--aegis-space-1);\n font-size: 11px;\n}\n\n.md {\n min-width: 22px;\n height: 22px;\n padding: 0 var(--aegis-space-2);\n font-size: var(--aegis-font-size-body-xs);\n}\n","import { type HTMLAttributes } from 'react';\nimport { cn } from '../../utils/cn';\nimport styles from './Kbd.module.css';\n\nexport interface KbdProps extends HTMLAttributes<HTMLElement> {\n /** Size variant */\n size?: 'sm' | 'md';\n}\n\n/**\n * Kbd — keyboard shortcut / key indicator.\n *\n * Renders an inline `<kbd>` element styled to look like a physical key.\n * Use to display keyboard shortcuts in menus, tooltips, and documentation.\n *\n * Accessibility:\n * - Uses semantic <kbd> element for screen readers\n * - Screen readers will announce the content as keyboard input\n */\nexport function Kbd({\n size = 'md',\n className,\n children,\n ...props\n}: KbdProps) {\n return (\n <kbd className={cn(styles.kbd, styles[size], className)} {...props}>\n {children}\n </kbd>\n );\n}\n","import { useState, useCallback, forwardRef, type HTMLAttributes, type ReactNode } from 'react';\nimport { cn } from '../../utils/cn';\nimport styles from './TreeView.module.css';\n\nexport interface TreeNode {\n /** Unique identifier */\n id: string;\n /** Display label */\n label: string;\n /** Optional icon */\n icon?: ReactNode;\n /** Child nodes */\n children?: TreeNode[];\n /** Whether the node is disabled */\n disabled?: boolean;\n}\n\nexport interface TreeViewProps extends Omit<HTMLAttributes<HTMLDivElement>, 'onSelect'> {\n /** Tree data */\n data: TreeNode[];\n /** IDs of initially expanded nodes (uncontrolled) */\n defaultExpanded?: string[];\n /** IDs of expanded nodes (controlled) */\n expanded?: string[];\n /** Called when a node is expanded/collapsed */\n onExpandChange?: (expanded: string[]) => void;\n /** Currently selected node ID */\n selected?: string | null;\n /** Called when a node is selected */\n onSelect?: (nodeId: string, node: TreeNode) => void;\n /** Size variant */\n size?: 'sm' | 'md';\n /** Show connecting lines between levels */\n showLines?: boolean;\n}\n\nconst ChevronIcon = ({ expanded }: { expanded: boolean }) => (\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 className={cn(styles.chevron, expanded && styles.chevronExpanded)}\n aria-hidden=\"true\"\n >\n <polyline points=\"6 4 10 8 6 12\" />\n </svg>\n);\n\ninterface TreeNodeItemProps {\n node: TreeNode;\n level: number;\n expanded: string[];\n selected: string | null;\n onToggle: (id: string) => void;\n onSelect: (id: string, node: TreeNode) => void;\n size: 'sm' | 'md';\n showLines: boolean;\n}\n\nfunction TreeNodeItem({ node, level, expanded, selected, onToggle, onSelect, size, showLines }: TreeNodeItemProps) {\n const hasChildren = node.children && node.children.length > 0;\n const isExpanded = expanded.includes(node.id);\n const isSelected = selected === node.id;\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (node.disabled) return;\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onSelect(node.id, node);\n } else if (e.key === 'ArrowRight' && hasChildren && !isExpanded) {\n e.preventDefault();\n onToggle(node.id);\n } else if (e.key === 'ArrowLeft' && hasChildren && isExpanded) {\n e.preventDefault();\n onToggle(node.id);\n }\n },\n [node, hasChildren, isExpanded, onToggle, onSelect],\n );\n\n return (\n <li role=\"treeitem\" aria-expanded={hasChildren ? isExpanded : undefined} aria-selected={isSelected} aria-disabled={node.disabled || undefined}>\n <div\n className={cn(\n styles.node,\n styles[size],\n isSelected && styles.selected,\n node.disabled && styles.disabled,\n showLines && level > 0 && styles.lined,\n )}\n style={{ paddingLeft: `${level * (size === 'sm' ? 16 : 20)}px` }}\n onClick={() => {\n if (node.disabled) return;\n if (hasChildren) onToggle(node.id);\n onSelect(node.id, node);\n }}\n onKeyDown={handleKeyDown}\n tabIndex={node.disabled ? -1 : 0}\n >\n <span className={styles.toggle}>\n {hasChildren ? <ChevronIcon expanded={isExpanded} /> : <span className={styles.leaf} />}\n </span>\n {node.icon && <span className={styles.icon}>{node.icon}</span>}\n <span className={styles.label}>{node.label}</span>\n </div>\n {hasChildren && isExpanded && (\n <ul role=\"group\" className={styles.group}>\n {node.children!.map((child) => (\n <TreeNodeItem\n key={child.id}\n node={child}\n level={level + 1}\n expanded={expanded}\n selected={selected}\n onToggle={onToggle}\n onSelect={onSelect}\n size={size}\n showLines={showLines}\n />\n ))}\n </ul>\n )}\n </li>\n );\n}\n\n/**\n * TreeView — hierarchical data display with expand/collapse.\n *\n * Renders nested tree data with keyboard navigation, selection,\n * and optional connecting guide lines.\n *\n * Accessibility:\n * - Uses tree/treeitem/group ARIA roles\n * - Arrow keys expand/collapse nodes\n * - Enter/Space selects nodes\n * - aria-expanded on branch nodes\n */\nexport const TreeView = forwardRef<HTMLDivElement, TreeViewProps>(\n (\n {\n data,\n defaultExpanded = [],\n expanded: controlledExpanded,\n onExpandChange,\n selected = null,\n onSelect,\n size = 'md',\n showLines = false,\n className,\n ...props\n },\n ref,\n ) => {\n const [uncontrolledExpanded, setUncontrolledExpanded] = useState<string[]>(defaultExpanded);\n const expanded = controlledExpanded ?? uncontrolledExpanded;\n\n const handleToggle = useCallback(\n (id: string) => {\n const next = expanded.includes(id)\n ? expanded.filter((e) => e !== id)\n : [...expanded, id];\n\n if (controlledExpanded === undefined) {\n setUncontrolledExpanded(next);\n }\n onExpandChange?.(next);\n },\n [expanded, controlledExpanded, onExpandChange],\n );\n\n const handleSelect = useCallback(\n (id: string, node: TreeNode) => {\n onSelect?.(id, node);\n },\n [onSelect],\n );\n\n return (\n <div ref={ref} className={cn(styles.tree, className)} {...props}>\n <ul role=\"tree\">\n {data.map((node) => (\n <TreeNodeItem\n key={node.id}\n node={node}\n level={0}\n expanded={expanded}\n selected={selected}\n onToggle={handleToggle}\n onSelect={handleSelect}\n size={size}\n showLines={showLines}\n />\n ))}\n </ul>\n </div>\n );\n },\n);\n\nTreeView.displayName = 'TreeView';\n",".tree {\n font-family: var(--aegis-font-family-sans);\n}\n\n.tree ul {\n list-style: none;\n margin: 0;\n padding: 0;\n}\n\n/* Node row */\n.node {\n display: flex;\n align-items: center;\n gap: var(--aegis-space-1);\n cursor: pointer;\n border-radius: var(--aegis-radius-sm);\n color: var(--aegis-color-text-primary);\n transition: background-color var(--aegis-motion-duration-fast) var(--aegis-motion-easing-standard);\n user-select: none;\n}\n\n.sm.node { padding: 2px var(--aegis-space-2); font-size: var(--aegis-font-size-body-sm); min-height: 28px; }\n.md.node { padding: var(--aegis-space-1) var(--aegis-space-2); font-size: var(--aegis-font-size-body-md); min-height: 32px; }\n\n.node:hover {\n background-color: var(--aegis-color-neutral-50);\n}\n\n.node:focus-visible {\n outline: var(--aegis-border-width-medium) solid var(--aegis-focus-outline-color);\n outline-offset: -2px;\n}\n\n.node.selected {\n background-color: var(--aegis-color-brand-primary-50, rgba(26, 115, 232, 0.08));\n color: var(--aegis-color-brand-primary-600, #1A73E8);\n}\n\n.node.disabled {\n opacity: var(--aegis-opacity-disabled);\n pointer-events: none;\n}\n\n/* Chevron toggle */\n.toggle {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 16px;\n height: 16px;\n flex-shrink: 0;\n}\n\n.chevron {\n transition: transform var(--aegis-motion-duration-fast) var(--aegis-motion-easing-standard);\n}\n\n.chevronExpanded {\n transform: rotate(90deg);\n}\n\n.leaf {\n display: block;\n width: 16px;\n}\n\n/* Icon slot */\n.icon {\n display: inline-flex;\n align-items: center;\n color: var(--aegis-color-text-secondary);\n flex-shrink: 0;\n}\n\n.selected .icon {\n color: inherit;\n}\n\n/* Label */\n.label {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n/* Guide lines */\n.lined {\n position: relative;\n}\n\n.lined::before {\n content: '';\n position: absolute;\n left: 10px;\n top: 0;\n bottom: 0;\n width: 1px;\n background: var(--aegis-color-border-default);\n}\n","import { forwardRef, type HTMLAttributes, type ElementType } from 'react';\nimport { cn } from '../../utils/cn';\nimport styles from './Typography.module.css';\n\nexport type TypographyVariant =\n | 'display-lg'\n | 'display-md'\n | 'heading-xl'\n | 'heading-lg'\n | 'heading-md'\n | 'heading-sm'\n | 'body-lg'\n | 'body-md'\n | 'body-sm'\n | 'label-lg'\n | 'label-md'\n | 'caption'\n | 'data'\n | 'code';\n\nexport type TypographyColor =\n | 'primary'\n | 'secondary'\n | 'muted'\n | 'inverse'\n | 'success'\n | 'warning'\n | 'error'\n | 'info'\n | 'inherit';\n\nexport type TypographyWeight = 'regular' | 'medium' | 'semibold' | 'bold';\n\nexport type TypographyAlign = 'left' | 'center' | 'right';\n\n/** Default HTML elements for each variant */\nconst variantElementMap: Record<TypographyVariant, ElementType> = {\n 'display-lg': 'h1',\n 'display-md': 'h1',\n 'heading-xl': 'h2',\n 'heading-lg': 'h2',\n 'heading-md': 'h3',\n 'heading-sm': 'h4',\n 'body-lg': 'p',\n 'body-md': 'p',\n 'body-sm': 'p',\n 'label-lg': 'span',\n 'label-md': 'span',\n caption: 'span',\n data: 'span',\n code: 'code',\n};\n\nexport interface TypographyProps extends HTMLAttributes<HTMLElement> {\n /** Typographic scale variant */\n variant?: TypographyVariant;\n /** Text color */\n color?: TypographyColor;\n /** Font weight override */\n weight?: TypographyWeight;\n /** Text alignment */\n align?: TypographyAlign;\n /** Render as a specific HTML element (overrides the variant default) */\n as?: ElementType;\n /** Truncate with ellipsis */\n truncate?: boolean;\n /** Clamp to N lines */\n lineClamp?: number;\n}\n\n/**\n * Typography — text rendering primitive.\n *\n * Maps directly to the Aegis type scale tokens and provides a consistent\n * API for rendering text at any level of the hierarchy.\n *\n * Accessibility:\n * - Defaults to the semantically correct HTML element for each variant\n * (h1–h4 for headings, p for body, code for code, span for labels)\n * - Use `as` to override when the visual style and semantic level differ\n * - `color=\"inherit\"` defers to the parent color\n */\nexport const Typography = forwardRef<HTMLElement, TypographyProps>(\n (\n {\n variant = 'body-md',\n color = 'primary',\n weight,\n align,\n as,\n truncate = false,\n lineClamp,\n className,\n style,\n children,\n ...props\n },\n ref,\n ) => {\n const Component = as || variantElementMap[variant];\n\n return (\n <Component\n ref={ref}\n className={cn(\n styles.typography,\n styles[`variant-${variant}`],\n styles[`color-${color}`],\n weight && styles[`weight-${weight}`],\n align && styles[`align-${align}`],\n truncate && styles.truncate,\n !!lineClamp && styles.lineClamp,\n className,\n )}\n style={{\n ...style,\n ...(lineClamp ? { WebkitLineClamp: lineClamp } : undefined),\n }}\n {...props}\n >\n {children}\n </Component>\n );\n },\n);\n\nTypography.displayName = 'Typography';\n",".typography {\n margin: 0;\n padding: 0;\n}\n\n/* ---------- Variant scale ---------- */\n\n.variant-display-lg {\n font-family: var(--aegis-font-family-sans);\n font-size: var(--aegis-font-size-display-lg);\n line-height: var(--aegis-line-height-display-lg);\n font-weight: var(--aegis-font-weight-bold);\n letter-spacing: var(--aegis-tracking-tight);\n}\n\n.variant-display-md {\n font-family: var(--aegis-font-family-sans);\n font-size: var(--aegis-font-size-display-md);\n line-height: var(--aegis-line-height-display-md);\n font-weight: var(--aegis-font-weight-bold);\n letter-spacing: var(--aegis-tracking-tight);\n}\n\n.variant-heading-xl {\n font-family: var(--aegis-font-family-sans);\n font-size: var(--aegis-font-size-heading-xl);\n line-height: var(--aegis-line-height-heading-xl);\n font-weight: var(--aegis-font-weight-semibold);\n}\n\n.variant-heading-lg {\n font-family: var(--aegis-font-family-sans);\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-semibold);\n}\n\n.variant-heading-md {\n font-family: var(--aegis-font-family-sans);\n font-size: var(--aegis-font-size-heading-md);\n line-height: var(--aegis-line-height-heading-md);\n font-weight: var(--aegis-font-weight-semibold);\n}\n\n.variant-heading-sm {\n font-family: var(--aegis-font-family-sans);\n font-size: var(--aegis-font-size-heading-sm);\n line-height: var(--aegis-line-height-heading-sm);\n font-weight: var(--aegis-font-weight-semibold);\n}\n\n.variant-body-lg {\n font-family: var(--aegis-font-family-sans);\n font-size: var(--aegis-font-size-body-lg);\n line-height: var(--aegis-line-height-body-lg);\n font-weight: var(--aegis-font-weight-regular);\n}\n\n.variant-body-md {\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 font-weight: var(--aegis-font-weight-regular);\n}\n\n.variant-body-sm {\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 font-weight: var(--aegis-font-weight-regular);\n}\n\n.variant-label-lg {\n font-family: var(--aegis-font-family-sans);\n font-size: var(--aegis-font-size-label-lg);\n line-height: var(--aegis-line-height-label-lg);\n font-weight: var(--aegis-font-weight-medium);\n}\n\n.variant-label-md {\n font-family: var(--aegis-font-family-sans);\n font-size: var(--aegis-font-size-label-md);\n line-height: var(--aegis-line-height-label-md);\n font-weight: var(--aegis-font-weight-medium);\n}\n\n.variant-caption {\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 font-weight: var(--aegis-font-weight-regular);\n}\n\n.variant-data {\n font-family: var(--aegis-font-family-mono);\n font-size: var(--aegis-font-size-data);\n line-height: var(--aegis-line-height-data);\n font-weight: var(--aegis-font-weight-medium);\n}\n\n.variant-code {\n font-family: var(--aegis-font-family-mono);\n font-size: var(--aegis-font-size-code);\n line-height: var(--aegis-line-height-code);\n font-weight: var(--aegis-font-weight-regular);\n}\n\n/* ---------- Colors ---------- */\n\n.color-primary { color: var(--aegis-color-text-primary); }\n.color-secondary { color: var(--aegis-color-text-secondary); }\n.color-muted { color: var(--aegis-color-text-muted); }\n.color-inverse { color: var(--aegis-color-text-inverse); }\n.color-success { color: var(--aegis-color-success-700); }\n.color-warning { color: var(--aegis-color-warning-700); }\n.color-error { color: var(--aegis-color-error-700); }\n.color-info { color: var(--aegis-color-info-700); }\n.color-inherit { color: inherit; }\n\n/* ---------- Weights ---------- */\n\n.weight-regular { font-weight: var(--aegis-font-weight-regular); }\n.weight-medium { font-weight: var(--aegis-font-weight-medium); }\n.weight-semibold { font-weight: var(--aegis-font-weight-semibold); }\n.weight-bold { font-weight: var(--aegis-font-weight-bold); }\n\n/* ---------- Alignment ---------- */\n\n.align-left { text-align: left; }\n.align-center { text-align: center; }\n.align-right { text-align: right; }\n\n/* ---------- Truncation ---------- */\n\n.truncate {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.lineClamp {\n display: -webkit-box;\n -webkit-box-orient: vertical;\n overflow: hidden;\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 { useEffect, type HTMLAttributes, type MouseEvent } from 'react';\nimport { cn } from '../../utils/cn';\nimport styles from './Backdrop.module.css';\n\nexport interface BackdropProps extends Omit<HTMLAttributes<HTMLDivElement>, 'onClick'> {\n /** Whether the backdrop is visible */\n open: boolean;\n /** Called when the backdrop is clicked */\n onClick?: (e: MouseEvent<HTMLDivElement>) => void;\n /** Whether clicking the backdrop should be ignored (e.g. mandatory dialog) */\n disableClick?: boolean;\n /** Whether to lock body scroll while open */\n lockScroll?: boolean;\n /** Visual intensity */\n variant?: 'default' | 'light' | 'opaque';\n}\n\n/**\n * Backdrop — fullscreen overlay primitive.\n *\n * Backdrop provides the scrim layer behind Modal, Drawer, and Dialog.\n * It handles body scroll locking, click-to-dismiss, and fade animation.\n *\n * Accessibility:\n * - aria-hidden=\"true\" — the backdrop itself is not interactive content\n * - Focus management is the responsibility of the surface component (Modal, Drawer)\n * - Body scroll lock prevents background content from scrolling under the overlay\n */\nexport function Backdrop({\n open,\n onClick,\n disableClick = false,\n lockScroll = true,\n variant = 'default',\n className,\n children,\n ...props\n}: BackdropProps) {\n useEffect(() => {\n if (!lockScroll) return;\n\n if (open) {\n const prev = document.body.style.overflow;\n document.body.style.overflow = 'hidden';\n return () => {\n document.body.style.overflow = prev;\n };\n }\n }, [open, lockScroll]);\n\n if (!open) return null;\n\n const handleClick = (e: MouseEvent<HTMLDivElement>) => {\n if (disableClick) return;\n if (e.target === e.currentTarget) {\n onClick?.(e);\n }\n };\n\n return (\n <div\n className={cn(styles.backdrop, styles[variant], className)}\n aria-hidden=\"true\"\n onClick={handleClick}\n {...props}\n >\n {children}\n </div>\n );\n}\n",".backdrop {\n position: fixed;\n inset: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: var(--aegis-z-overlay, 1300);\n animation: aegis-backdrop-fade-in var(--aegis-motion-duration-slow) var(--aegis-motion-easing-standard) both;\n}\n\n/* Variants */\n.default {\n background-color: var(--aegis-color-overlay-scrim, rgba(22, 32, 43, 0.48));\n}\n\n.light {\n background-color: rgba(22, 32, 43, 0.24);\n}\n\n.opaque {\n background-color: var(--aegis-color-neutral-900);\n}\n\n@keyframes aegis-backdrop-fade-in {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n","import { useEffect, useRef, type ReactNode } from 'react';\nimport { cn } from '../../utils/cn';\nimport styles from './Dialog.module.css';\n\nexport interface DialogProps {\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 * Dialog — 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 Dialog({\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}: DialogProps) {\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-dialog-title\"\n aria-describedby=\"aegis-dialog-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-dialog-title\" className={styles.title}>{title}</h2>\n <div id=\"aegis-dialog-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",".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 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-error-400);\n}\n\n.title {\n margin: 0;\n}\n\n.description {\n margin-top: var(--aegis-space-2);\n max-width: 400px;\n}\n\n.action {\n margin-top: var(--aegis-space-6);\n}\n\n.errorCode {\n margin-top: var(--aegis-space-3);\n font-variant-numeric: tabular-nums;\n}\n","import { type HTMLAttributes, type ReactNode } from 'react';\nimport { cn } from '../../utils/cn';\nimport { Typography } from '../Typography/Typography';\nimport styles from './ErrorState.module.css';\n\nexport interface ErrorStateProps extends HTMLAttributes<HTMLDivElement> {\n /** Error title */\n title?: string;\n /** Descriptive message */\n description?: string;\n /** Custom icon (defaults to a warning icon) */\n icon?: ReactNode;\n /** Retry action element (e.g., a button) */\n action?: ReactNode;\n /** Error code or reference for support */\n errorCode?: string;\n}\n\nconst DefaultErrorIcon = () => (\n <svg width=\"48\" height=\"48\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\" />\n <line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\" />\n </svg>\n);\n\n/**\n * ErrorState — centered error placeholder with retry action.\n *\n * Composes: Typography\n *\n * Use in place of content when a data fetch fails, a page errors,\n * or a section cannot render. Provides clear messaging, an optional\n * error code for support, and a retry action.\n *\n * Accessibility:\n * - Uses role=\"alert\" to announce the error to screen readers\n * - Action button receives focus for quick retry\n */\nexport function ErrorState({\n title = 'Something went wrong',\n description,\n icon,\n action,\n errorCode,\n className,\n ...props\n}: ErrorStateProps) {\n return (\n <div\n className={cn(styles.container, className)}\n role=\"alert\"\n {...props}\n >\n <div className={styles.icon}>\n {icon ?? <DefaultErrorIcon />}\n </div>\n <Typography variant=\"heading-sm\" as=\"h3\" className={styles.title}>\n {title}\n </Typography>\n {description && (\n <Typography variant=\"body-md\" color=\"muted\" className={styles.description}>\n {description}\n </Typography>\n )}\n {action && <div className={styles.action}>{action}</div>}\n {errorCode && (\n <Typography variant=\"caption\" color=\"muted\" className={styles.errorCode}>\n Error code: {errorCode}\n </Typography>\n )}\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",".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","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",".appBar {\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 './AppBar.module.css';\n\nexport interface AppBarProps 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 * AppBar — 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 AppBar({ logo, children, actions, className, ...props }: AppBarProps) {\n return (\n <header className={cn(styles.appBar, 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","import { forwardRef, type HTMLAttributes } from 'react';\nimport { cn } from '../../utils/cn';\nimport styles from './Paper.module.css';\n\nexport interface PaperProps extends HTMLAttributes<HTMLDivElement> {\n /** Surface background */\n surface?: 'default' | 'subtle' | 'canvas' | 'raised' | 'overlay';\n /** Elevation level (shadow depth) */\n elevation?: 0 | 1 | 2 | 3 | 4;\n /** Border radius preset */\n radius?: 'none' | 'sm' | 'md' | 'lg' | 'xl';\n /** Whether to render a border */\n bordered?: boolean;\n /** Padding preset */\n padding?: 'none' | 'sm' | 'md' | 'lg';\n /** Render as a different HTML element */\n as?: 'div' | 'section' | 'article' | 'aside' | 'header' | 'footer';\n}\n\n/**\n * Paper — the foundational surface primitive.\n *\n * Paper provides a styled surface (background, border, shadow, radius)\n * without any layout opinions. It is the atom from which Card, Modal\n * content areas, Drawer panels, and other surface components compose.\n *\n * Accessibility:\n * - Paper is a visual primitive with no semantic role by default\n * - Use the `as` prop to select the correct semantic element\n * - Add `role` and `aria-label` when the surface represents a landmark\n */\nexport const Paper = forwardRef<HTMLDivElement, PaperProps>(\n (\n {\n surface = 'default',\n elevation = 0,\n radius = 'md',\n bordered = true,\n padding = 'none',\n as: Component = 'div',\n className,\n children,\n ...props\n },\n ref,\n ) => (\n <Component\n ref={ref as any}\n className={cn(\n styles.paper,\n styles[`surface-${surface}`],\n styles[`elevation-${elevation}`],\n styles[`radius-${radius}`],\n bordered && styles.bordered,\n padding !== 'none' && styles[`pad-${padding}`],\n className,\n )}\n {...props}\n >\n {children}\n </Component>\n ),\n);\n\nPaper.displayName = 'Paper';\n",".paper {\n font-family: var(--aegis-font-family-sans);\n transition:\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/* Surfaces */\n.surface-default { background-color: var(--aegis-color-surface-default); }\n.surface-subtle { background-color: var(--aegis-color-surface-subtle); }\n.surface-canvas { background-color: var(--aegis-color-surface-canvas); }\n.surface-raised { background-color: var(--aegis-color-surface-raised); }\n.surface-overlay { background-color: var(--aegis-color-surface-overlay, var(--aegis-color-surface-default)); }\n\n/* Border */\n.bordered {\n border: var(--aegis-border-width-hairline) var(--aegis-border-style-default) var(--aegis-color-border-default);\n}\n\n/* Elevation */\n.elevation-0 { box-shadow: var(--aegis-shadow-none); }\n.elevation-1 { box-shadow: var(--aegis-shadow-xs); }\n.elevation-2 { box-shadow: var(--aegis-shadow-sm); }\n.elevation-3 { box-shadow: var(--aegis-shadow-md); }\n.elevation-4 { box-shadow: var(--aegis-shadow-lg); }\n\n/* Radius */\n.radius-none { border-radius: 0; }\n.radius-sm { border-radius: var(--aegis-radius-sm); }\n.radius-md { border-radius: var(--aegis-radius-md); }\n.radius-lg { border-radius: var(--aegis-radius-lg); }\n.radius-xl { border-radius: var(--aegis-radius-xl); }\n\n/* Padding */\n.pad-sm { padding: var(--aegis-space-3); }\n.pad-md { padding: var(--aegis-space-5); }\n.pad-lg { padding: var(--aegis-space-8); }\n","/* Card — thin layer over Paper.\n Surface, border, radius, elevation, and padding delegated to Paper.\n Only Card-specific enhancements here. */\n\n.raised {\n border-bottom: var(--aegis-border-width-medium) var(--aegis-border-style-default) var(--aegis-color-border-subtle);\n}\n","import { type HTMLAttributes } from 'react';\nimport { cn } from '../../utils/cn';\nimport { Paper } from '../Paper/Paper';\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 * Composes: Paper\n *\n * Card is a constrained Paper preset with two elevation levels and\n * opinionated padding. Use Paper directly when you need full control\n * over surface, elevation, and radius.\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 <Paper\n surface=\"default\"\n elevation={elevation === 'raised' ? 2 : 0}\n radius=\"lg\"\n bordered\n padding={padding}\n className={cn(elevation === 'raised' && styles.raised, className)}\n {...props}\n >\n {children}\n </Paper>\n );\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","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 { 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",".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","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 { forwardRef, type AnchorHTMLAttributes, type ReactNode } from 'react';\nimport { cn } from '../../utils/cn';\nimport styles from './Link.module.css';\n\nexport interface LinkProps extends AnchorHTMLAttributes<HTMLAnchorElement> {\n /** Visual variant */\n variant?: 'default' | 'subtle' | 'standalone';\n /** Color */\n color?: 'primary' | 'secondary' | 'inherit';\n /** Whether to show an external indicator */\n external?: boolean;\n /** Icon slot (leading) */\n startIcon?: ReactNode;\n /** Disabled state (prevents navigation) */\n disabled?: boolean;\n}\n\nconst ExternalIcon = () => (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\" style={{ marginLeft: 2, flexShrink: 0 }}>\n <path d=\"M9 3L3 9\" />\n <path d=\"M4 3h5v5\" />\n </svg>\n);\n\n/**\n * Link — styled anchor primitive for navigation.\n *\n * Variants:\n * - `default` — underlined inline link\n * - `subtle` — underline on hover only\n * - `standalone` — no underline, bolder weight, for navigation items\n *\n * Accessibility:\n * - Uses native <a> element for full keyboard + screen reader support\n * - External links get target=\"_blank\" with rel=\"noopener noreferrer\"\n * - aria-disabled prevents interaction without removing from tab order\n */\nexport const Link = forwardRef<HTMLAnchorElement, LinkProps>(\n (\n {\n variant = 'default',\n color = 'primary',\n external = false,\n startIcon,\n disabled = false,\n className,\n children,\n ...props\n },\n ref,\n ) => (\n <a\n ref={ref}\n className={cn(\n styles.link,\n styles[variant],\n styles[`color-${color}`],\n disabled && styles.disabled,\n className,\n )}\n aria-disabled={disabled || undefined}\n tabIndex={disabled ? -1 : undefined}\n {...(external ? { target: '_blank', rel: 'noopener noreferrer' } : {})}\n {...props}\n >\n {startIcon && <span className={styles.startIcon} aria-hidden=\"true\">{startIcon}</span>}\n {children}\n {external && <ExternalIcon />}\n </a>\n ),\n);\n\nLink.displayName = 'Link';\n",".link {\n display: inline-flex;\n align-items: center;\n gap: var(--aegis-space-1);\n font-family: var(--aegis-font-family-sans);\n font-size: inherit;\n line-height: inherit;\n cursor: pointer;\n transition:\n color var(--aegis-motion-duration-fast) var(--aegis-motion-easing-standard),\n text-decoration-color var(--aegis-motion-duration-fast) var(--aegis-motion-easing-standard);\n}\n\n/* ---------- Colors ---------- */\n\n.color-primary {\n color: var(--aegis-color-brand-primary-600);\n}\n\n.color-primary:hover {\n color: var(--aegis-color-brand-primary-700);\n}\n\n.color-secondary {\n color: var(--aegis-color-text-secondary);\n}\n\n.color-secondary:hover {\n color: var(--aegis-color-text-primary);\n}\n\n.color-inherit {\n color: inherit;\n}\n\n.color-inherit:hover {\n opacity: 0.8;\n}\n\n/* ---------- Variants ---------- */\n\n.default {\n text-decoration: underline;\n text-decoration-thickness: 1px;\n text-underline-offset: 2px;\n text-decoration-color: currentColor;\n}\n\n.subtle {\n text-decoration: underline;\n text-decoration-thickness: 1px;\n text-underline-offset: 2px;\n text-decoration-color: transparent;\n}\n\n.subtle:hover {\n text-decoration-color: currentColor;\n}\n\n.standalone {\n text-decoration: none;\n font-weight: var(--aegis-font-weight-medium);\n}\n\n.standalone:hover {\n text-decoration: none;\n}\n\n/* ---------- Focus ---------- */\n\n.link:focus-visible {\n outline: var(--aegis-border-width-medium) solid var(--aegis-focus-outline-color);\n outline-offset: 2px;\n border-radius: 2px;\n box-shadow: var(--aegis-shadow-focus);\n}\n\n/* ---------- Disabled ---------- */\n\n.disabled {\n opacity: var(--aegis-opacity-disabled);\n cursor: not-allowed;\n pointer-events: none;\n text-decoration: none;\n}\n\n/* ---------- Sub-elements ---------- */\n\n.startIcon {\n display: flex;\n align-items: center;\n flex-shrink: 0;\n}\n","import {\n useState,\n useRef,\n useEffect,\n useCallback,\n type HTMLAttributes,\n type ReactNode,\n type KeyboardEvent,\n type MouseEvent,\n} from 'react';\nimport { cn } from '../../utils/cn';\nimport styles from './Menu.module.css';\n\n/* ------------------------------------------------------------------ */\n/* MenuItem */\n/* ------------------------------------------------------------------ */\n\nexport interface MenuItemProps extends Omit<HTMLAttributes<HTMLDivElement>, 'onClick'> {\n /** Leading icon */\n icon?: ReactNode;\n /** Trailing content (shortcut, badge, etc.) */\n trailing?: ReactNode;\n /** Disabled state */\n disabled?: boolean;\n /** Destructive / danger styling */\n danger?: boolean;\n /** Click handler */\n onClick?: (e: MouseEvent<HTMLDivElement>) => void;\n}\n\nexport function MenuItem({\n icon,\n trailing,\n disabled = false,\n danger = false,\n onClick,\n className,\n children,\n ...props\n}: MenuItemProps) {\n return (\n <div\n role=\"menuitem\"\n tabIndex={disabled ? -1 : 0}\n aria-disabled={disabled || undefined}\n className={cn(\n styles.menuItem,\n danger && styles.danger,\n disabled && styles.itemDisabled,\n className,\n )}\n onClick={disabled ? undefined : onClick}\n onKeyDown={(e) => {\n if (disabled) return;\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onClick?.(e as any);\n }\n }}\n {...props}\n >\n {icon && <span className={styles.itemIcon} aria-hidden=\"true\">{icon}</span>}\n <span className={styles.itemLabel}>{children}</span>\n {trailing && <span className={styles.itemTrailing}>{trailing}</span>}\n </div>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* MenuDivider */\n/* ------------------------------------------------------------------ */\n\nexport function MenuDivider() {\n return <div role=\"separator\" className={styles.divider} />;\n}\n\n/* ------------------------------------------------------------------ */\n/* MenuGroup */\n/* ------------------------------------------------------------------ */\n\nexport interface MenuGroupProps {\n /** Group label */\n label: string;\n children: ReactNode;\n}\n\nexport function MenuGroup({ label, children }: MenuGroupProps) {\n return (\n <div role=\"group\" aria-label={label}>\n <div className={styles.groupLabel}>{label}</div>\n {children}\n </div>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Menu */\n/* ------------------------------------------------------------------ */\n\nexport interface MenuProps extends HTMLAttributes<HTMLDivElement> {\n /** The trigger element — a single React element */\n trigger: ReactNode;\n /** Horizontal alignment relative to trigger */\n align?: 'start' | 'end';\n /** Menu width */\n width?: number | 'trigger';\n}\n\n/**\n * Menu — dropdown action menu surface.\n *\n * Composes MenuItem, MenuDivider, and MenuGroup as children.\n *\n * Accessibility:\n * - role=\"menu\" on the dropdown, role=\"menuitem\" on each item\n * - Arrow-key navigation between items\n * - Escape closes the menu\n * - Focus returns to trigger on close\n * - Click outside closes the menu\n * - Healthcare note: ideal for patient action menus, record options,\n * context menus on rows\n */\nexport function Menu({\n trigger,\n align = 'start',\n width,\n className,\n children,\n ...props\n}: MenuProps) {\n const [open, setOpen] = useState(false);\n const triggerRef = useRef<HTMLDivElement>(null);\n const menuRef = useRef<HTMLDivElement>(null);\n\n const close = useCallback(() => {\n setOpen(false);\n triggerRef.current?.querySelector<HTMLElement>('[tabindex], button, a')?.focus();\n }, []);\n\n // Close on outside click\n useEffect(() => {\n if (!open) return;\n\n const handleClick = (e: Event) => {\n if (\n !menuRef.current?.contains(e.target as Node) &&\n !triggerRef.current?.contains(e.target as Node)\n ) {\n close();\n }\n };\n\n document.addEventListener('mousedown', handleClick);\n return () => document.removeEventListener('mousedown', handleClick);\n }, [open, close]);\n\n // Focus first item on open\n useEffect(() => {\n if (open) {\n const firstItem = menuRef.current?.querySelector<HTMLElement>('[role=\"menuitem\"]:not([aria-disabled])');\n firstItem?.focus();\n }\n }, [open]);\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (!open) {\n if (e.key === 'ArrowDown' || e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n setOpen(true);\n }\n return;\n }\n\n const items = Array.from(\n menuRef.current?.querySelectorAll<HTMLElement>('[role=\"menuitem\"]:not([aria-disabled])') || [],\n );\n const current = document.activeElement as HTMLElement;\n const idx = items.indexOf(current);\n\n switch (e.key) {\n case 'ArrowDown': {\n e.preventDefault();\n const next = idx < items.length - 1 ? idx + 1 : 0;\n items[next]?.focus();\n break;\n }\n case 'ArrowUp': {\n e.preventDefault();\n const prev = idx > 0 ? idx - 1 : items.length - 1;\n items[prev]?.focus();\n break;\n }\n case 'Escape':\n e.preventDefault();\n close();\n break;\n case 'Tab':\n close();\n break;\n }\n };\n\n return (\n <div className={cn(styles.menuContainer, className)} onKeyDown={handleKeyDown} {...props}>\n <div\n ref={triggerRef}\n className={styles.trigger}\n onClick={() => setOpen((prev) => !prev)}\n aria-haspopup=\"menu\"\n aria-expanded={open}\n >\n {trigger}\n </div>\n\n {open && (\n <div\n ref={menuRef}\n role=\"menu\"\n className={cn(styles.menu, styles[`align-${align}`])}\n style={width ? { width: width === 'trigger' ? undefined : width, minWidth: width === 'trigger' ? '100%' : undefined } : undefined}\n >\n {children}\n </div>\n )}\n </div>\n );\n}\n",".menuContainer {\n position: relative;\n display: inline-flex;\n}\n\n.trigger {\n display: inline-flex;\n}\n\n/* ---------- Menu surface ---------- */\n\n.menu {\n position: absolute;\n top: calc(100% + 4px);\n z-index: var(--aegis-z-dropdown, 1100);\n min-width: 180px;\n max-height: 320px;\n overflow-y: auto;\n padding: var(--aegis-space-1) 0;\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-md);\n box-shadow: var(--aegis-shadow-lg);\n font-family: var(--aegis-font-family-sans);\n animation: aegis-menu-in var(--aegis-motion-duration-fast) var(--aegis-motion-easing-standard) both;\n}\n\n.align-start {\n left: 0;\n}\n\n.align-end {\n right: 0;\n}\n\n/* ---------- MenuItem ---------- */\n\n.menuItem {\n display: flex;\n align-items: center;\n gap: var(--aegis-space-2);\n padding: var(--aegis-space-2) 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-primary);\n cursor: pointer;\n transition: background-color var(--aegis-motion-duration-fast) var(--aegis-motion-easing-standard);\n outline: none;\n}\n\n.menuItem:hover,\n.menuItem:focus-visible {\n background-color: var(--aegis-color-surface-hover, var(--aegis-color-neutral-50));\n}\n\n.menuItem:focus-visible {\n box-shadow: inset 2px 0 0 0 var(--aegis-color-brand-primary-500);\n}\n\n/* Danger */\n.menuItem.danger {\n color: var(--aegis-color-error-700);\n}\n\n.menuItem.danger:hover,\n.menuItem.danger:focus-visible {\n background-color: var(--aegis-color-error-50);\n}\n\n/* Disabled */\n.menuItem.itemDisabled {\n opacity: var(--aegis-opacity-disabled);\n cursor: not-allowed;\n}\n\n.menuItem.itemDisabled:hover {\n background-color: transparent;\n}\n\n/* Sub-elements */\n.itemIcon {\n display: flex;\n align-items: center;\n flex-shrink: 0;\n color: var(--aegis-color-text-muted);\n}\n\n.menuItem.danger .itemIcon {\n color: var(--aegis-color-error-500);\n}\n\n.itemLabel {\n flex: 1;\n min-width: 0;\n}\n\n.itemTrailing {\n flex-shrink: 0;\n font-size: var(--aegis-font-size-caption);\n color: var(--aegis-color-text-muted);\n}\n\n/* ---------- Divider ---------- */\n\n.divider {\n height: 1px;\n margin: var(--aegis-space-1) 0;\n background-color: var(--aegis-color-border-default);\n}\n\n/* ---------- Group label ---------- */\n\n.groupLabel {\n padding: var(--aegis-space-2) var(--aegis-space-4) var(--aegis-space-1);\n font-size: var(--aegis-font-size-caption);\n font-weight: var(--aegis-font-weight-semibold);\n color: var(--aegis-color-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n}\n\n/* ---------- Animation ---------- */\n\n@keyframes aegis-menu-in {\n from {\n opacity: 0;\n transform: translateY(-4px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\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",".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",".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, 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 {\n useState,\n useEffect,\n useRef,\n useCallback,\n forwardRef,\n type ReactNode,\n type KeyboardEvent,\n} from 'react';\nimport { cn } from '../../utils/cn';\nimport styles from './CommandPalette.module.css';\n\nexport interface CommandItem {\n /** Unique identifier */\n id: string;\n /** Display label */\n label: string;\n /** Optional description shown below the label */\n description?: string;\n /** Leading icon */\n icon?: ReactNode;\n /** Group/category name */\n group?: string;\n /** Keyboard shortcut hint */\n shortcut?: string;\n /** Whether the item is disabled */\n disabled?: boolean;\n /** Custom search keywords (in addition to label) */\n keywords?: string[];\n}\n\nexport interface CommandPaletteProps {\n /** Whether the palette is open */\n open: boolean;\n /** Called when the palette should close */\n onClose: () => void;\n /** Available commands */\n items: CommandItem[];\n /** Called when a command is selected */\n onSelect: (item: CommandItem) => void;\n /** Placeholder text for the search input */\n placeholder?: string;\n /** Empty state message */\n emptyMessage?: string;\n /** Additional className for the overlay */\n className?: string;\n}\n\nconst SearchIcon = () => (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" aria-hidden=\"true\">\n <circle cx=\"11\" cy=\"11\" r=\"8\" />\n <line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\" />\n </svg>\n);\n\nfunction filterItems(items: CommandItem[], query: string): CommandItem[] {\n if (!query) return items;\n const lower = query.toLowerCase();\n return items.filter((item) => {\n if (item.label.toLowerCase().includes(lower)) return true;\n if (item.description?.toLowerCase().includes(lower)) return true;\n if (item.keywords?.some((k) => k.toLowerCase().includes(lower))) return true;\n return false;\n });\n}\n\nfunction groupItems(items: CommandItem[]): Map<string, CommandItem[]> {\n const groups = new Map<string, CommandItem[]>();\n for (const item of items) {\n const key = item.group ?? '';\n const list = groups.get(key) ?? [];\n list.push(item);\n groups.set(key, list);\n }\n return groups;\n}\n\n/**\n * CommandPalette — keyboard-driven command search dialog (Cmd+K pattern).\n *\n * Renders a modal search input with filterable command list,\n * grouped results, keyboard navigation, and shortcut hints.\n *\n * Accessibility:\n * - Uses combobox + listbox ARIA pattern\n * - Arrow keys navigate items, Enter selects\n * - Escape closes the palette\n * - Focus is trapped within the dialog\n * - aria-activedescendant tracks highlighted item\n */\nexport const CommandPalette = forwardRef<HTMLDivElement, CommandPaletteProps>(\n (\n {\n open,\n onClose,\n items,\n onSelect,\n placeholder = 'Search commands…',\n emptyMessage = 'No results found.',\n className,\n },\n ref,\n ) => {\n const [query, setQuery] = useState('');\n const [activeIndex, setActiveIndex] = useState(0);\n const inputRef = useRef<HTMLInputElement>(null);\n const listRef = useRef<HTMLDivElement>(null);\n\n const filtered = filterItems(items, query);\n const grouped = groupItems(filtered);\n const flatFiltered = filtered.filter((i) => !i.disabled);\n\n // Reset state when opening\n useEffect(() => {\n if (open) {\n setQuery('');\n setActiveIndex(0);\n // Delay focus to after render\n requestAnimationFrame(() => inputRef.current?.focus());\n }\n }, [open]);\n\n // Scroll active item into view\n useEffect(() => {\n if (!open || flatFiltered.length === 0) return;\n const activeId = flatFiltered[activeIndex]?.id;\n if (!activeId) return;\n const el = listRef.current?.querySelector(`[data-item-id=\"${activeId}\"]`);\n el?.scrollIntoView({ block: 'nearest' });\n }, [activeIndex, open, flatFiltered]);\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n e.preventDefault();\n onClose();\n return;\n }\n\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n setActiveIndex((i) => (i + 1) % Math.max(flatFiltered.length, 1));\n } else if (e.key === 'ArrowUp') {\n e.preventDefault();\n setActiveIndex((i) => (i - 1 + flatFiltered.length) % Math.max(flatFiltered.length, 1));\n } else if (e.key === 'Enter') {\n e.preventDefault();\n const item = flatFiltered[activeIndex];\n if (item) {\n onSelect(item);\n onClose();\n }\n }\n },\n [flatFiltered, activeIndex, onSelect, onClose],\n );\n\n // Close on backdrop click\n const handleBackdropClick = useCallback(\n (e: React.MouseEvent) => {\n if (e.target === e.currentTarget) onClose();\n },\n [onClose],\n );\n\n // Reset active index when query changes\n useEffect(() => {\n setActiveIndex(0);\n }, [query]);\n\n if (!open) return null;\n\n const activeId = flatFiltered[activeIndex]?.id;\n\n return (\n <div\n ref={ref}\n className={cn(styles.overlay, className)}\n onClick={handleBackdropClick}\n role=\"presentation\"\n >\n <div\n className={styles.palette}\n role=\"dialog\"\n aria-label=\"Command palette\"\n onKeyDown={handleKeyDown}\n >\n <div className={styles.inputWrapper}>\n <SearchIcon />\n <input\n ref={inputRef}\n type=\"text\"\n className={styles.input}\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n placeholder={placeholder}\n role=\"combobox\"\n aria-expanded={true}\n aria-controls=\"command-palette-list\"\n aria-activedescendant={activeId ? `command-${activeId}` : undefined}\n autoComplete=\"off\"\n spellCheck={false}\n />\n </div>\n\n <div ref={listRef} id=\"command-palette-list\" className={styles.list} role=\"listbox\">\n {filtered.length === 0 ? (\n <div className={styles.empty}>{emptyMessage}</div>\n ) : (\n Array.from(grouped.entries()).map(([group, groupItems]) => (\n <div key={group} role=\"group\" aria-label={group || undefined}>\n {group && <div className={styles.groupLabel}>{group}</div>}\n {groupItems.map((item) => {\n const isActive = item.id === activeId;\n return (\n <div\n key={item.id}\n id={`command-${item.id}`}\n data-item-id={item.id}\n className={cn(\n styles.item,\n isActive && styles.active,\n item.disabled && styles.disabled,\n )}\n role=\"option\"\n aria-selected={isActive}\n aria-disabled={item.disabled || undefined}\n onClick={() => {\n if (item.disabled) return;\n onSelect(item);\n onClose();\n }}\n onMouseEnter={() => {\n if (!item.disabled) {\n const idx = flatFiltered.findIndex((f) => f.id === item.id);\n if (idx >= 0) setActiveIndex(idx);\n }\n }}\n >\n {item.icon && <span className={styles.itemIcon}>{item.icon}</span>}\n <div className={styles.itemContent}>\n <span className={styles.itemLabel}>{item.label}</span>\n {item.description && (\n <span className={styles.itemDescription}>{item.description}</span>\n )}\n </div>\n {item.shortcut && <kbd className={styles.shortcut}>{item.shortcut}</kbd>}\n </div>\n );\n })}\n </div>\n ))\n )}\n </div>\n </div>\n </div>\n );\n },\n);\n\nCommandPalette.displayName = 'CommandPalette';\n",".overlay {\n position: fixed;\n inset: 0;\n z-index: var(--aegis-z-modal, 1000);\n display: flex;\n align-items: flex-start;\n justify-content: center;\n padding-top: min(20vh, 140px);\n background: rgba(0, 0, 0, 0.4);\n animation: fadeIn var(--aegis-motion-duration-fast) var(--aegis-motion-easing-standard);\n}\n\n@keyframes fadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n.palette {\n width: min(560px, calc(100vw - 32px));\n max-height: min(420px, 60vh);\n display: flex;\n flex-direction: column;\n background: var(--aegis-color-surface-default);\n border-radius: var(--aegis-radius-lg);\n box-shadow: var(--aegis-shadow-xl, 0 20px 60px rgba(0, 0, 0, 0.3));\n overflow: hidden;\n animation: slideUp var(--aegis-motion-duration-normal) var(--aegis-motion-easing-standard);\n}\n\n@keyframes slideUp {\n from { opacity: 0; transform: translateY(-8px) scale(0.98); }\n to { opacity: 1; transform: translateY(0) scale(1); }\n}\n\n/* Search input area */\n.inputWrapper {\n display: flex;\n align-items: center;\n gap: var(--aegis-space-3);\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-default);\n color: var(--aegis-color-text-muted);\n}\n\n.input {\n flex: 1;\n border: none;\n background: transparent;\n outline: none;\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}\n\n.input::placeholder {\n color: var(--aegis-color-text-muted);\n}\n\n/* Results list */\n.list {\n flex: 1;\n overflow-y: auto;\n padding: var(--aegis-space-2) 0;\n}\n\n.empty {\n padding: var(--aegis-space-6) var(--aegis-space-4);\n text-align: center;\n font-size: var(--aegis-font-size-body-sm);\n color: var(--aegis-color-text-muted);\n font-family: var(--aegis-font-family-sans);\n}\n\n/* Group label */\n.groupLabel {\n padding: var(--aegis-space-2) var(--aegis-space-4) var(--aegis-space-1);\n font-size: var(--aegis-font-size-caption);\n font-weight: var(--aegis-font-weight-medium);\n color: var(--aegis-color-text-muted);\n font-family: var(--aegis-font-family-sans);\n text-transform: uppercase;\n letter-spacing: 0.05em;\n}\n\n/* Command item */\n.item {\n display: flex;\n align-items: center;\n gap: var(--aegis-space-3);\n padding: var(--aegis-space-2) var(--aegis-space-4);\n cursor: pointer;\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.item.active {\n background-color: var(--aegis-color-brand-primary-50, rgba(26, 115, 232, 0.08));\n}\n\n.item.disabled {\n opacity: var(--aegis-opacity-disabled);\n pointer-events: none;\n}\n\n.itemIcon {\n display: inline-flex;\n align-items: center;\n color: var(--aegis-color-text-secondary);\n flex-shrink: 0;\n}\n\n.itemContent {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n}\n\n.itemLabel {\n font-size: var(--aegis-font-size-body-sm);\n color: var(--aegis-color-text-primary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.itemDescription {\n font-size: var(--aegis-font-size-caption);\n color: var(--aegis-color-text-muted);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.shortcut {\n flex-shrink: 0;\n font-family: var(--aegis-font-family-sans);\n font-size: var(--aegis-font-size-caption);\n color: var(--aegis-color-text-muted);\n background: var(--aegis-color-neutral-100);\n padding: 1px var(--aegis-space-2);\n border-radius: var(--aegis-radius-sm);\n border: var(--aegis-border-width-hairline) var(--aegis-border-style-default) var(--aegis-color-border-default);\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",".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",".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 HTMLAttributes, type ElementType } from 'react';\nimport { cn } from '../../utils/cn';\nimport styles from './Container.module.css';\n\nexport interface ContainerProps extends HTMLAttributes<HTMLDivElement> {\n /** Max-width preset */\n maxWidth?: 'sm' | 'md' | 'lg' | 'xl' | 'full';\n /** Horizontal padding */\n padding?: 'none' | 'sm' | 'md' | 'lg';\n /** Center the container horizontally */\n centered?: boolean;\n /** Render as a different HTML element */\n as?: ElementType;\n}\n\n/**\n * Container — max-width content wrapper with responsive padding.\n *\n * Provides consistent horizontal padding and a constrained max-width\n * for page-level content sections.\n *\n * Accessibility:\n * - Purely presentational — no ARIA roles needed\n * - Use semantic HTML elements via the `as` prop (e.g., main, section)\n */\nexport const Container = forwardRef<HTMLDivElement, ContainerProps>(\n (\n {\n maxWidth = 'lg',\n padding = 'md',\n centered = true,\n as: Component = 'div',\n className,\n children,\n ...props\n },\n ref,\n ) => (\n <Component\n ref={ref}\n className={cn(\n styles.container,\n styles[`max-${maxWidth}`],\n padding !== 'none' && styles[`pad-${padding}`],\n centered && styles.centered,\n className,\n )}\n {...props}\n >\n {children}\n </Component>\n ),\n);\n\nContainer.displayName = 'Container';\n",".container {\n width: 100%;\n}\n\n.centered {\n margin-left: auto;\n margin-right: auto;\n}\n\n/* Max-width presets */\n.max-sm { max-width: 640px; }\n.max-md { max-width: 768px; }\n.max-lg { max-width: 1024px; }\n.max-xl { max-width: 1280px; }\n.max-full { max-width: 100%; }\n\n/* Padding */\n.pad-sm { padding-left: var(--aegis-space-4); padding-right: var(--aegis-space-4); }\n.pad-md { padding-left: var(--aegis-space-6); padding-right: var(--aegis-space-6); }\n.pad-lg { padding-left: var(--aegis-space-8); padding-right: var(--aegis-space-8); }\n","import { forwardRef, type HTMLAttributes, type CSSProperties } from 'react';\nimport { cn } from '../../utils/cn';\nimport styles from './Grid.module.css';\n\nexport interface GridProps extends HTMLAttributes<HTMLDivElement> {\n /** Number of columns (1-12) or 'auto' for auto-fill */\n columns?: number | 'auto';\n /** Gap between grid items */\n gap?: 'none' | 'sm' | 'md' | 'lg' | 'xl';\n /** Minimum item width when columns='auto' */\n minItemWidth?: number;\n /** Align items vertically */\n alignItems?: 'start' | 'center' | 'end' | 'stretch';\n}\n\n/**\n * Grid — CSS grid layout primitive.\n *\n * Provides a responsive grid with preset column counts or auto-fill\n * behavior based on minimum item width.\n *\n * Accessibility:\n * - Purely presentational — no ARIA roles needed\n * - Grid layout does not affect reading order for screen readers\n */\nexport const Grid = forwardRef<HTMLDivElement, GridProps>(\n (\n {\n columns = 'auto',\n gap = 'md',\n minItemWidth = 240,\n alignItems = 'stretch',\n className,\n style,\n children,\n ...props\n },\n ref,\n ) => {\n const gridStyle: CSSProperties = {\n ...style,\n ...(columns === 'auto'\n ? { '--grid-min-item-width': `${minItemWidth}px` } as CSSProperties\n : { '--grid-columns': columns } as CSSProperties),\n };\n\n return (\n <div\n ref={ref}\n className={cn(\n styles.grid,\n columns === 'auto' ? styles.autoFill : styles.fixed,\n gap !== 'none' && styles[`gap-${gap}`],\n styles[`align-${alignItems}`],\n className,\n )}\n style={gridStyle}\n {...props}\n >\n {children}\n </div>\n );\n },\n);\n\nGrid.displayName = 'Grid';\n",".grid {\n display: grid;\n}\n\n.fixed {\n grid-template-columns: repeat(var(--grid-columns), 1fr);\n}\n\n.autoFill {\n grid-template-columns: repeat(auto-fill, minmax(var(--grid-min-item-width), 1fr));\n}\n\n/* Gap */\n.gap-sm { gap: var(--aegis-space-2); }\n.gap-md { gap: var(--aegis-space-4); }\n.gap-lg { gap: var(--aegis-space-6); }\n.gap-xl { gap: var(--aegis-space-8); }\n\n/* Align items */\n.align-start { align-items: start; }\n.align-center { align-items: center; }\n.align-end { align-items: end; }\n.align-stretch { align-items: stretch; }\n","import { forwardRef, type HTMLAttributes, type ElementType } from 'react';\nimport { cn } from '../../utils/cn';\nimport styles from './Stack.module.css';\n\nexport interface StackProps extends HTMLAttributes<HTMLDivElement> {\n /** Stack direction */\n direction?: 'vertical' | 'horizontal';\n /** Gap between items */\n gap?: 'none' | 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n /** Align items on the cross axis */\n align?: 'start' | 'center' | 'end' | 'stretch';\n /** Justify items on the main axis */\n justify?: 'start' | 'center' | 'end' | 'between' | 'around';\n /** Whether items should wrap */\n wrap?: boolean;\n /** Render as a different HTML element */\n as?: ElementType;\n}\n\n/**\n * Stack — flex layout primitive for vertical or horizontal spacing.\n *\n * The most common layout component: arranges children with consistent\n * gaps. Defaults to a vertical stack (column).\n *\n * Accessibility:\n * - Purely presentational — no ARIA roles needed\n * - Use semantic HTML via `as` prop when appropriate\n */\nexport const Stack = forwardRef<HTMLDivElement, StackProps>(\n (\n {\n direction = 'vertical',\n gap = 'md',\n align = 'stretch',\n justify = 'start',\n wrap = false,\n as: Component = 'div',\n className,\n children,\n ...props\n },\n ref,\n ) => (\n <Component\n ref={ref}\n className={cn(\n styles.stack,\n styles[direction],\n gap !== 'none' && styles[`gap-${gap}`],\n styles[`align-${align}`],\n styles[`justify-${justify}`],\n wrap && styles.wrap,\n className,\n )}\n {...props}\n >\n {children}\n </Component>\n ),\n);\n\nStack.displayName = 'Stack';\n",".stack {\n display: flex;\n}\n\n.vertical { flex-direction: column; }\n.horizontal { flex-direction: row; }\n\n.wrap { flex-wrap: wrap; }\n\n/* Gap */\n.gap-xs { gap: var(--aegis-space-1); }\n.gap-sm { gap: var(--aegis-space-2); }\n.gap-md { gap: var(--aegis-space-4); }\n.gap-lg { gap: var(--aegis-space-6); }\n.gap-xl { gap: var(--aegis-space-8); }\n\n/* Align (cross axis) */\n.align-start { align-items: flex-start; }\n.align-center { align-items: center; }\n.align-end { align-items: flex-end; }\n.align-stretch { align-items: stretch; }\n\n/* Justify (main axis) */\n.justify-start { justify-content: flex-start; }\n.justify-center { justify-content: center; }\n.justify-end { justify-content: flex-end; }\n.justify-between { justify-content: space-between; }\n.justify-around { justify-content: space-around; }\n",".group {\n display: flex;\n align-items: center;\n border-radius: var(--aegis-radius-md);\n border: var(--aegis-border-width-hairline) var(--aegis-border-style-default) var(--aegis-color-border-default);\n background-color: var(--aegis-color-surface-default);\n font-family: var(--aegis-font-family-sans);\n transition: border-color var(--aegis-motion-duration-fast) var(--aegis-motion-easing-standard);\n overflow: hidden;\n}\n\n.group:focus-within {\n border-color: var(--aegis-color-brand-primary-500);\n box-shadow: 0 0 0 2px var(--aegis-color-brand-primary-100);\n}\n\n.error {\n border-color: var(--aegis-color-error-500);\n}\n\n.error:focus-within {\n box-shadow: 0 0 0 2px var(--aegis-color-error-100);\n}\n\n.disabled {\n opacity: var(--aegis-opacity-disabled);\n pointer-events: none;\n background-color: var(--aegis-color-surface-sunken);\n}\n\n.addon {\n display: flex;\n align-items: center;\n padding: 0 var(--aegis-space-3);\n color: var(--aegis-color-text-muted);\n background-color: var(--aegis-color-surface-sunken);\n border-color: inherit;\n white-space: nowrap;\n font-size: var(--aegis-font-size-body-sm);\n align-self: stretch;\n}\n\n.addon:first-child {\n border-right: var(--aegis-border-width-hairline) var(--aegis-border-style-default) var(--aegis-color-border-default);\n}\n\n.addon:last-child {\n border-left: var(--aegis-border-width-hairline) var(--aegis-border-style-default) var(--aegis-color-border-default);\n}\n\n.input {\n flex: 1;\n min-width: 0;\n}\n\n/* Strip inner input borders when inside InputGroup */\n.input :global(input),\n.input :global(select) {\n border: none;\n border-radius: 0;\n box-shadow: none;\n outline: none;\n}\n\n/* Size */\n.sm { min-height: var(--aegis-size-control-sm); }\n.md { min-height: var(--aegis-size-control-md); }\n.lg { min-height: var(--aegis-size-control-lg); }\n","import { type ReactNode } from 'react';\nimport { cn } from '../../utils/cn';\nimport styles from './InputGroup.module.css';\n\nexport interface InputGroupProps {\n /** Content rendered before the input (e.g., icon, label, currency symbol) */\n startAddon?: ReactNode;\n /** Content rendered after the input (e.g., icon, button, unit label) */\n endAddon?: ReactNode;\n /** Size variant — matches TextField sizes */\n size?: 'sm' | 'md' | 'lg';\n /** Error state */\n error?: boolean;\n /** Disabled state */\n disabled?: boolean;\n /** Additional className */\n className?: string;\n /** Input element */\n children: ReactNode;\n}\n\n/**\n * InputGroup — wrapper that adds prefix/suffix addons to an input.\n *\n * Wraps a TextField (or other input) with leading/trailing elements\n * like icons, currency symbols, units, or action buttons.\n *\n * Accessibility:\n * - Addons are presentational and should not duplicate input labels\n * - Use aria-describedby on the input to associate addon context\n */\nexport function InputGroup({\n startAddon,\n endAddon,\n size = 'md',\n error = false,\n disabled = false,\n className,\n children,\n}: InputGroupProps) {\n return (\n <div\n className={cn(\n styles.group,\n styles[size],\n error && styles.error,\n disabled && styles.disabled,\n className,\n )}\n >\n {startAddon && <span className={styles.addon}>{startAddon}</span>}\n <div className={styles.input}>{children}</div>\n {endAddon && <span className={styles.addon}>{endAddon}</span>}\n </div>\n );\n}\n","import { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\nimport { cn } from '../../utils/cn';\nimport styles from './Toolbar.module.css';\n\nexport interface ToolbarProps extends HTMLAttributes<HTMLDivElement> {\n /** Size variant — affects padding and child button sizing */\n size?: 'sm' | 'md';\n /** Visual variant */\n variant?: 'default' | 'outlined';\n /** Toolbar content (buttons, groups, dividers) */\n children: ReactNode;\n}\n\nexport interface ToolbarGroupProps extends HTMLAttributes<HTMLDivElement> {\n /** Group content */\n children: ReactNode;\n}\n\nexport interface ToolbarDividerProps extends HTMLAttributes<HTMLDivElement> {}\n\n/**\n * Toolbar — horizontal action bar with grouped controls.\n *\n * Use with ToolbarGroup to visually separate related actions\n * and ToolbarDivider for explicit separators.\n *\n * Accessibility:\n * - Uses toolbar ARIA role\n * - Children should be buttons or controls with labels\n */\nexport const Toolbar = forwardRef<HTMLDivElement, ToolbarProps>(\n ({ size = 'md', variant = 'default', className, children, ...props }, ref) => (\n <div\n ref={ref}\n role=\"toolbar\"\n className={cn(styles.toolbar, styles[size], styles[variant], className)}\n {...props}\n >\n {children}\n </div>\n ),\n);\n\nToolbar.displayName = 'Toolbar';\n\nexport const ToolbarGroup = forwardRef<HTMLDivElement, ToolbarGroupProps>(\n ({ className, children, ...props }, ref) => (\n <div ref={ref} role=\"group\" className={cn(styles.group, className)} {...props}>\n {children}\n </div>\n ),\n);\n\nToolbarGroup.displayName = 'ToolbarGroup';\n\nexport const ToolbarDivider = forwardRef<HTMLDivElement, ToolbarDividerProps>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n role=\"separator\"\n aria-orientation=\"vertical\"\n className={cn(styles.divider, className)}\n {...props}\n />\n ),\n);\n\nToolbarDivider.displayName = 'ToolbarDivider';\n",".toolbar {\n display: flex;\n align-items: center;\n gap: var(--aegis-space-1);\n font-family: var(--aegis-font-family-sans);\n background: var(--aegis-color-surface-default);\n border-radius: var(--aegis-radius-md);\n flex-wrap: wrap;\n}\n\n.sm { padding: var(--aegis-space-1); }\n.md { padding: var(--aegis-space-2); }\n\n.outlined {\n border: var(--aegis-border-width-hairline) var(--aegis-border-style-default) var(--aegis-color-border-default);\n}\n\n/* Button sizing within toolbar */\n.sm :global(button) { min-height: 28px; min-width: 28px; }\n.md :global(button) { min-height: 32px; min-width: 32px; }\n\n/* Group */\n.group {\n display: flex;\n align-items: center;\n gap: var(--aegis-space-1);\n}\n\n/* Vertical divider */\n.divider {\n width: 1px;\n align-self: stretch;\n min-height: 20px;\n background: var(--aegis-color-border-default);\n margin: 0 var(--aegis-space-1);\n}\n",".visuallyHidden {\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 HTMLAttributes } from 'react';\nimport styles from './VisuallyHidden.module.css';\n\nexport interface VisuallyHiddenProps extends HTMLAttributes<HTMLSpanElement> {\n /** Render as a different element */\n as?: 'span' | 'div' | 'label';\n}\n\n/**\n * VisuallyHidden — renders content that is hidden visually but accessible\n * to screen readers and other assistive technology.\n *\n * Use for:\n * - Labels for icon-only buttons\n * - Additional context for screen readers\n * - Skip navigation links\n * - Form labels that are visually unnecessary but needed for a11y\n *\n * This uses the standard screen-reader-only CSS technique that keeps\n * content in the document flow for assistive tech while hiding it\n * from sighted users.\n */\nexport function VisuallyHidden({\n as: Component = 'span',\n children,\n ...props\n}: VisuallyHiddenProps) {\n return (\n <Component className={styles.visuallyHidden} {...props}>\n {children}\n </Component>\n );\n}\n","import { useState, useEffect, type ReactNode } from 'react';\nimport { createPortal } from 'react-dom';\n\nexport interface PortalProps {\n /** Content to render in the portal */\n children: ReactNode;\n /** Target container element (defaults to document.body) */\n container?: Element | null;\n /** Whether the portal is active (renders inline when false) */\n disabled?: boolean;\n}\n\n/**\n * Portal — renders children into a DOM node outside the parent hierarchy.\n *\n * Use for overlays, tooltips, modals, and other floating content that\n * needs to escape stacking context or overflow constraints.\n *\n * Falls back to inline rendering during SSR or when disabled.\n *\n * Accessibility:\n * - Portal does not affect the accessibility tree\n * - Focus management is the responsibility of the portal content\n * - Ensure ARIA relationships (aria-describedby, aria-labelledby)\n * still work across the portal boundary\n */\nexport function Portal({ children, container, disabled = false }: PortalProps) {\n const [mounted, setMounted] = useState(false);\n\n useEffect(() => {\n setMounted(true);\n }, []);\n\n if (disabled || !mounted) {\n return <>{children}</>;\n }\n\n return createPortal(children, container ?? document.body);\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 { 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","/* PatientCard — healthcare-specific layout only.\n Surface, text, badge, and chip styling delegated to core atoms. */\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}\n\n.identity {\n flex: 1;\n min-width: 0;\n}\n\n/* @deprecated — legacy avatar ReactNode container */\n.legacyAvatar {\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.details {\n display: flex;\n flex-wrap: wrap;\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.allergies {\n display: flex;\n align-items: flex-start;\n gap: var(--aegis-space-2);\n flex-wrap: wrap;\n margin-top: var(--aegis-space-3);\n}\n\n.allergyList {\n display: flex;\n flex-wrap: wrap;\n gap: var(--aegis-space-2);\n}\n","import { type HTMLAttributes, type ReactNode } from 'react';\nimport { cn } from '../../utils/cn';\nimport { Card } from '../Card/Card';\nimport { Avatar } from '../Avatar/Avatar';\nimport { Badge } from '../Badge/Badge';\nimport { Typography } from '../Typography/Typography';\nimport { Chip } from '../Chip/Chip';\nimport { Divider } from '../Divider/Divider';\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 image URL (preferred) */\n avatarSrc?: string;\n /**\n * @deprecated Use `avatarSrc` instead. Accepts a custom ReactNode for the avatar slot.\n * When both `avatar` and `avatarSrc` are provided, `avatarSrc` takes precedence.\n */\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 statusBadgeMap: Record<PatientStatus, { status: 'success' | 'neutral' | 'error'; label: string }> = {\n active: { status: 'success', label: 'Active' },\n inactive: { status: 'neutral', label: 'Inactive' },\n critical: { status: 'error', label: 'Critical' },\n};\n\n/**\n * PatientCard — summary card displaying patient demographics and key info.\n *\n * Composes: Card, Avatar, Badge, Typography, Chip, Divider\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 Chip components with semantic markup\n */\nexport function PatientCard({\n name,\n mrn,\n dob,\n age,\n gender,\n avatarSrc,\n avatar,\n status = 'active',\n allergies = [],\n primaryPhysician,\n className,\n ...props\n}: PatientCardProps) {\n const badgeConfig = statusBadgeMap[status];\n\n // Render avatar: prefer avatarSrc (Avatar component), fall back to legacy avatar ReactNode\n const avatarElement = avatarSrc\n ? <Avatar name={name} src={avatarSrc} size=\"lg\" />\n : avatar\n ? <div className={styles.legacyAvatar} aria-hidden=\"true\">{avatar}</div>\n : <Avatar name={name} size=\"lg\" />;\n\n return (\n <Card\n elevation=\"raised\"\n padding=\"lg\"\n className={cn(status === 'critical' && styles.critical, className)}\n role=\"region\"\n aria-label={`Patient card for ${name}`}\n {...props}\n >\n <div className={styles.header}>\n {avatarElement}\n <div className={styles.identity}>\n <Typography variant=\"heading-sm\" as=\"h3\">{name}</Typography>\n <Typography variant=\"caption\" color=\"muted\">MRN: {mrn}</Typography>\n </div>\n <Badge status={badgeConfig.status}>{badgeConfig.label}</Badge>\n </div>\n\n <Divider spacing=\"sm\" />\n\n <div className={styles.details}>\n <div className={styles.field}>\n <Typography variant=\"caption\" color=\"muted\" weight=\"medium\" as=\"span\">DOB</Typography>\n <Typography variant=\"body-sm\" as=\"span\">{dob}</Typography>\n </div>\n <div className={styles.field}>\n <Typography variant=\"caption\" color=\"muted\" weight=\"medium\" as=\"span\">Age</Typography>\n <Typography variant=\"body-sm\" as=\"span\">{age}</Typography>\n </div>\n <div className={styles.field}>\n <Typography variant=\"caption\" color=\"muted\" weight=\"medium\" as=\"span\">Gender</Typography>\n <Typography variant=\"body-sm\" as=\"span\">{gender}</Typography>\n </div>\n {primaryPhysician && (\n <div className={styles.field}>\n <Typography variant=\"caption\" color=\"muted\" weight=\"medium\" as=\"span\">PCP</Typography>\n <Typography variant=\"body-sm\" as=\"span\">{primaryPhysician}</Typography>\n </div>\n )}\n </div>\n\n {allergies.length > 0 && (\n <div className={styles.allergies}>\n <Typography variant=\"label-md\" color=\"error\" weight=\"semibold\" as=\"span\">\n Allergies:\n </Typography>\n <div className={styles.allergyList} role=\"list\" aria-label=\"Patient allergies\">\n {allergies.map((allergy) => (\n <Chip key={allergy} color=\"error\" size=\"sm\" variant=\"filled\">\n {allergy}\n </Chip>\n ))}\n </div>\n </div>\n )}\n </Card>\n );\n}\n","/* AppointmentCard — healthcare-specific layout only.\n Surface and text styling delegated to Card, StatusBadge, Typography. */\n\n.card {\n display: flex;\n overflow: hidden;\n}\n\n.statusBar {\n width: 4px;\n flex-shrink: 0;\n}\n\n.bar-scheduled { background-color: var(--aegis-color-info-500); }\n.bar-checked-in { background-color: var(--aegis-color-success-400); }\n.bar-in-progress { background-color: var(--aegis-color-warning-500); }\n.bar-completed { background-color: var(--aegis-color-success-600); }\n.bar-cancelled { background-color: var(--aegis-color-text-muted); }\n.bar-no-show { 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.type {\n margin-bottom: var(--aegis-space-3);\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}\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 { Card } from '../Card/Card';\nimport { StatusBadge } from '../StatusBadge/StatusBadge';\nimport { Typography } from '../Typography/Typography';\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\n/** Map AppointmentStatus → StatusBadge status */\nconst statusBadgeMap: Record<AppointmentStatus, 'scheduled' | 'active' | 'in-progress' | 'inactive' | 'cancelled' | 'critical'> = {\n scheduled: 'scheduled',\n 'checked-in': 'active',\n 'in-progress': 'in-progress',\n completed: 'active',\n cancelled: 'cancelled',\n 'no-show': 'critical',\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 * Composes: Card, StatusBadge, Typography\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 <Card\n elevation=\"raised\"\n padding=\"none\"\n className={cn(styles.card, className)}\n role=\"region\"\n aria-label={`Appointment for ${patientName}`}\n {...props}\n >\n <div className={cn(styles.statusBar, styles[`bar-${status}`])} aria-hidden=\"true\" />\n <div className={styles.content}>\n <div className={styles.header}>\n <Typography variant=\"body-md\" weight=\"semibold\" as=\"h3\">\n {patientName}\n </Typography>\n <StatusBadge status={statusBadgeMap[status]}>\n {statusLabels[status]}\n </StatusBadge>\n </div>\n\n <Typography variant=\"body-sm\" color=\"secondary\" as=\"p\" className={styles.type}>\n {type}\n </Typography>\n\n <div className={styles.details}>\n <span className={styles.field}>\n <CalendarIcon />\n <Typography variant=\"body-sm\" color=\"secondary\" as=\"span\">{date}</Typography>\n </span>\n <span className={styles.field}>\n <ClockIcon />\n <Typography variant=\"body-sm\" color=\"secondary\" as=\"span\">{time}</Typography>\n </span>\n <span className={styles.field}>\n <UserIcon />\n <Typography variant=\"body-sm\" color=\"secondary\" as=\"span\">{provider}</Typography>\n </span>\n {location && (\n <span className={styles.field}>\n <LocationIcon />\n <Typography variant=\"body-sm\" color=\"secondary\" as=\"span\">{location}</Typography>\n </span>\n )}\n </div>\n </div>\n </Card>\n );\n}\n\n/* ---- Inline icons (16×16, minimal healthcare-context icons) ---- */\n\nfunction CalendarIcon() {\n return (\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 );\n}\n\nfunction ClockIcon() {\n return (\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 );\n}\n\nfunction UserIcon() {\n return (\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 );\n}\n\nfunction LocationIcon() {\n return (\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 );\n}\n","/* ClinicalBanner — healthcare-specific enhancements over core Banner.\n Only adds the left-border severity accent. All other styling from Banner. */\n\n.clinicalBanner {\n border-left-width: var(--aegis-border-width-strong);\n border-left-style: var(--aegis-border-style-default);\n}\n\n.critical {\n border-left-color: var(--aegis-color-error-600);\n}\n\n.high {\n border-left-color: var(--aegis-color-warning-600);\n}\n\n.moderate {\n border-left-color: var(--aegis-color-warning-500);\n}\n\n.low {\n border-left-color: var(--aegis-color-info-500);\n}\n\n.title {\n margin: 0;\n}\n\n.body {\n margin-top: var(--aegis-space-1);\n}\n","import { type HTMLAttributes, type ReactNode } from 'react';\nimport { cn } from '../../utils/cn';\nimport { Banner, type BannerStatus } from '../Banner/Banner';\nimport { Typography } from '../Typography/Typography';\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\n/** Map clinical severity → Banner status */\nconst severityToBannerStatus: Record<ClinicalSeverity, BannerStatus> = {\n critical: 'error',\n high: 'warning',\n moderate: 'warning',\n low: 'info',\n};\n\n/**\n * ClinicalBanner — prominent banner for critical clinical alerts.\n *\n * Composes: Banner, Typography\n *\n * Wraps the core Banner component with healthcare-specific severity semantics\n * (critical / high / moderate / low) and an enhanced left-border accent.\n *\n * Accessibility:\n * - Inherits Banner's role=\"alert\" for urgent statuses\n * - Icon + color + text ensures meaning is communicated multiple ways\n */\nexport function ClinicalBanner({\n severity,\n title,\n dismissible = false,\n onDismiss,\n children,\n className,\n ...props\n}: ClinicalBannerProps) {\n return (\n <Banner\n status={severityToBannerStatus[severity]}\n dismissible={dismissible}\n onDismiss={onDismiss}\n className={cn(styles.clinicalBanner, styles[severity], className)}\n {...props}\n >\n <Typography variant=\"body-md\" weight=\"semibold\" as=\"p\" className={styles.title}>\n {title}\n </Typography>\n {children && (\n <Typography variant=\"body-sm\" color=\"inherit\" as=\"div\" className={styles.body}>\n {children}\n </Typography>\n )}\n </Banner>\n );\n}\n","/* MedicationRow — healthcare-specific row layout only.\n Status badge and text styling delegated to StatusBadge, Typography. */\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 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.secondary {\n display: flex;\n flex-wrap: wrap;\n gap: var(--aegis-space-4);\n padding-left: var(--aegis-space-3);\n}\n\n.detail {\n display: inline-flex;\n gap: var(--aegis-space-1);\n}\n\n.strikethrough {\n text-decoration: line-through;\n}\n\n.discontinued {\n opacity: var(--aegis-opacity-disabled, 0.6);\n}\n","import { type HTMLAttributes } from 'react';\nimport { cn } from '../../utils/cn';\nimport { StatusBadge, type StatusBadgeStatus } from '../StatusBadge/StatusBadge';\nimport { Typography } from '../Typography/Typography';\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\n/** Map MedicationStatus → StatusBadge status */\nconst statusBadgeMap: Record<MedicationStatus, { badge: StatusBadgeStatus; label: string }> = {\n active: { badge: 'active', label: 'Active' },\n discontinued: { badge: 'inactive', label: 'Discontinued' },\n hold: { badge: 'pending', label: 'On Hold' },\n prn: { badge: 'scheduled', label: 'PRN' },\n};\n\n/**\n * MedicationRow — compact horizontal display of medication details.\n *\n * Composes: StatusBadge, Typography\n *\n * Accessibility:\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 const badgeConfig = statusBadgeMap[status];\n\n return (\n <div\n className={cn(styles.row, status === 'discontinued' && styles.discontinued, className)}\n {...props}\n >\n <div className={styles.primary}>\n <StatusBadge status={badgeConfig.badge} size=\"sm\" dot>\n {badgeConfig.label}\n </StatusBadge>\n <Typography\n variant=\"body-md\"\n weight=\"semibold\"\n as=\"span\"\n className={cn(status === 'discontinued' && styles.strikethrough)}\n >\n {name}\n </Typography>\n <Typography variant=\"body-sm\" color=\"secondary\" as=\"span\">\n {dosage}\n </Typography>\n </div>\n <div className={styles.secondary}>\n <span className={styles.detail}>\n <Typography variant=\"caption\" color=\"muted\" weight=\"medium\" as=\"span\">Freq:</Typography>\n {' '}\n <Typography variant=\"caption\" color=\"secondary\" as=\"span\">{frequency}</Typography>\n </span>\n <span className={styles.detail}>\n <Typography variant=\"caption\" color=\"muted\" weight=\"medium\" as=\"span\">Route:</Typography>\n {' '}\n <Typography variant=\"caption\" color=\"secondary\" as=\"span\">{route}</Typography>\n </span>\n <span className={styles.detail}>\n <Typography variant=\"caption\" color=\"muted\" weight=\"medium\" as=\"span\">By:</Typography>\n {' '}\n <Typography variant=\"caption\" color=\"secondary\" as=\"span\">{prescribedBy}</Typography>\n </span>\n <span className={styles.detail}>\n <Typography variant=\"caption\" color=\"muted\" weight=\"medium\" as=\"span\">Start:</Typography>\n {' '}\n <Typography variant=\"caption\" color=\"secondary\" as=\"span\">{startDate}</Typography>\n </span>\n {endDate && (\n <span className={styles.detail}>\n <Typography variant=\"caption\" color=\"muted\" weight=\"medium\" as=\"span\">End:</Typography>\n {' '}\n <Typography variant=\"caption\" color=\"secondary\" as=\"span\">{endDate}</Typography>\n </span>\n )}\n </div>\n </div>\n );\n}\n","/* LabResultRow — healthcare-specific tabular layout only.\n Status badge and text styling delegated to Badge, Typography. */\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 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.result {\n display: flex;\n align-items: baseline;\n gap: var(--aegis-space-1);\n min-width: 100px;\n}\n\n.value {\n font-variant-numeric: tabular-nums;\n}\n\n/* Abnormal value color overrides */\n.value-abnormal-high { color: var(--aegis-color-warning-700); }\n.value-abnormal-low { color: var(--aegis-color-info-700); }\n.value-critical { color: var(--aegis-color-error-700); }\n\n.arrow {\n font-size: var(--aegis-font-size-body-sm);\n}\n\n.range {\n display: flex;\n align-items: center;\n gap: var(--aegis-space-1);\n min-width: 120px;\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","import { type HTMLAttributes } from 'react';\nimport { cn } from '../../utils/cn';\nimport { Badge } from '../Badge/Badge';\nimport { Typography } from '../Typography/Typography';\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 statusBadgeMap: Record<LabResultStatus, { status: 'success' | 'warning' | 'info' | 'error'; label: string }> = {\n normal: { status: 'success', label: 'Normal' },\n 'abnormal-high': { status: 'warning', label: 'High' },\n 'abnormal-low': { status: 'info', label: 'Low' },\n critical: { status: 'error', label: '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 * Composes: Badge, Typography\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 const badgeConfig = statusBadgeMap[status];\n const arrow = statusArrow[status];\n\n return (\n <div\n className={cn(styles.row, styles[status], className)}\n {...props}\n >\n <div className={styles.testInfo}>\n <Typography variant=\"body-sm\" weight=\"medium\" as=\"span\">{testName}</Typography>\n </div>\n <div className={styles.result}>\n <Typography\n variant=\"body-md\"\n weight={isAbnormal ? 'bold' : 'semibold'}\n as=\"span\"\n className={cn(styles.value, isAbnormal && styles[`value-${status}`])}\n >\n {value}\n {arrow && (\n <span className={styles.arrow} aria-hidden=\"true\"> {arrow}</span>\n )}\n </Typography>\n <Typography variant=\"caption\" color=\"muted\" as=\"span\">{unit}</Typography>\n </div>\n <div className={styles.range}>\n <Typography variant=\"caption\" color=\"muted\" weight=\"medium\" as=\"span\">Ref:</Typography>\n <Typography variant=\"caption\" color=\"secondary\" as=\"span\">{referenceRange}</Typography>\n </div>\n <div className={styles.meta}>\n <Badge status={badgeConfig.status}>{badgeConfig.label}</Badge>\n <Typography variant=\"caption\" color=\"muted\" as=\"span\">{collectedDate}</Typography>\n </div>\n </div>\n );\n}\n","/* InsuranceCard — healthcare-specific layout only.\n Surface, text, badge, and field styling delegated to core atoms. */\n\n.card {\n font-variant-numeric: tabular-nums;\n}\n\n.header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: var(--aegis-space-3);\n}\n\n.planInfo {\n min-width: 0;\n}\n","import { type HTMLAttributes } from 'react';\nimport { cn } from '../../utils/cn';\nimport { Card } from '../Card/Card';\nimport { Badge } from '../Badge/Badge';\nimport { Typography } from '../Typography/Typography';\nimport { DescriptionList, type DescriptionListItem } from '../DescriptionList/DescriptionList';\nimport { Divider } from '../Divider/Divider';\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 statusBadgeMap: Record<InsuranceStatus, { status: 'success' | 'neutral' | 'warning'; label: string }> = {\n active: { status: 'success', label: 'Active' },\n inactive: { status: 'neutral', label: 'Inactive' },\n pending: { status: 'warning', label: 'Pending' },\n};\n\n/**\n * InsuranceCard — displays insurance plan summary information.\n *\n * Composes: Card, Badge, Typography, DescriptionList, Divider\n *\n * Accessibility:\n * - Uses role=\"region\" with aria-label for screen reader context\n * - Status communicated via text label, not color alone\n * - DescriptionList provides semantic label-value pairs\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 const badgeConfig = statusBadgeMap[status];\n\n const items: DescriptionListItem[] = [\n { label: 'Member ID', value: memberId },\n { label: 'Group #', value: groupNumber },\n { label: 'Effective', value: effectiveDate },\n ...(expirationDate ? [{ label: 'Expires', value: expirationDate }] : []),\n ];\n\n return (\n <Card\n elevation=\"raised\"\n padding=\"lg\"\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 <Typography variant=\"heading-sm\" as=\"h3\">{planName}</Typography>\n <Typography variant=\"caption\" color=\"muted\" weight=\"medium\" as=\"span\">\n {planType}\n </Typography>\n </div>\n <Badge status={badgeConfig.status}>{badgeConfig.label}</Badge>\n </div>\n\n <Divider spacing=\"sm\" />\n\n <DescriptionList items={items} layout=\"grid\" columns={2} />\n </Card>\n );\n}\n",".card {\n display: flex;\n flex-direction: column;\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-sm);\n overflow: hidden;\n font-family: var(--aegis-font-family-sans);\n transition: box-shadow var(--aegis-motion-duration-base) var(--aegis-motion-easing-standard);\n}\n\n.card:hover {\n box-shadow: var(--aegis-shadow-md);\n}\n\n.comfortable {\n padding: var(--aegis-space-6);\n gap: var(--aegis-space-5);\n}\n\n.compact {\n padding: var(--aegis-space-4);\n gap: var(--aegis-space-3);\n}\n\n.header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: var(--aegis-space-4);\n}\n\n.headerText {\n display: flex;\n flex-direction: column;\n gap: var(--aegis-space-1);\n min-width: 0;\n}\n\n.title {\n margin: 0;\n font-size: var(--aegis-font-size-heading-sm);\n line-height: var(--aegis-line-height-heading-sm);\n font-weight: var(--aegis-font-weight-semibold);\n color: var(--aegis-color-text-primary);\n letter-spacing: var(--aegis-tracking-tight);\n}\n\n.subtitle {\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.metricRow {\n display: flex;\n align-items: baseline;\n gap: var(--aegis-space-3);\n margin-top: var(--aegis-space-3);\n flex-wrap: wrap;\n}\n\n.metric {\n font-size: var(--aegis-font-size-display-md);\n line-height: var(--aegis-line-height-display-md);\n font-weight: var(--aegis-font-weight-semibold);\n color: var(--aegis-color-text-primary);\n letter-spacing: var(--aegis-tracking-tight);\n font-variant-numeric: tabular-nums;\n}\n\n.trendSlot {\n display: inline-flex;\n align-items: center;\n gap: var(--aegis-space-1);\n}\n\n.actions {\n display: flex;\n align-items: center;\n gap: var(--aegis-space-2);\n flex-shrink: 0;\n}\n\n.body {\n position: relative;\n width: 100%;\n min-height: 200px;\n}\n\n.footer {\n border-top: var(--aegis-border-width-hairline) solid var(--aegis-color-border-subtle);\n padding-top: var(--aegis-space-4);\n font-size: var(--aegis-font-size-body-sm);\n color: var(--aegis-color-text-secondary);\n}\n\n.placeholder {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: var(--aegis-space-3);\n min-height: 220px;\n padding: var(--aegis-space-6);\n text-align: center;\n}\n\n.placeholderTitle {\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}\n\n.placeholderText {\n font-size: var(--aegis-font-size-body-sm);\n color: var(--aegis-color-text-secondary);\n max-width: 320px;\n}\n\n.skeletonBars {\n display: flex;\n align-items: flex-end;\n gap: var(--aegis-space-2);\n height: 80px;\n width: 200px;\n}\n\n.skeletonBars span {\n flex: 1;\n background: linear-gradient(\n 180deg,\n var(--aegis-color-surface-sunken) 0%,\n var(--aegis-color-surface-hover) 100%\n );\n border-radius: var(--aegis-radius-sm);\n animation: skeleton-pulse 1.6s ease-in-out infinite;\n}\n\n.skeletonBars span:nth-child(1) {\n height: 40%;\n animation-delay: 0ms;\n}\n.skeletonBars span:nth-child(2) {\n height: 80%;\n animation-delay: 100ms;\n}\n.skeletonBars span:nth-child(3) {\n height: 55%;\n animation-delay: 200ms;\n}\n.skeletonBars span:nth-child(4) {\n height: 95%;\n animation-delay: 300ms;\n}\n.skeletonBars span:nth-child(5) {\n height: 65%;\n animation-delay: 400ms;\n}\n\n@keyframes skeleton-pulse {\n 0%, 100% {\n opacity: 0.55;\n }\n 50% {\n opacity: 1;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .skeletonBars span {\n animation: none;\n opacity: 0.7;\n }\n .card {\n transition: none;\n }\n}\n","import { type HTMLAttributes, type ReactNode } from 'react';\nimport { cn } from '../utils/cn';\nimport styles from './ChartCard.module.css';\n\nexport type ChartCardState = 'ready' | 'loading' | 'empty' | 'error';\n\nexport interface ChartCardProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {\n /** Card title (e.g. \"30-day patient adherence\") */\n title?: ReactNode;\n /** Optional subtitle / explanation */\n subtitle?: ReactNode;\n /** Headline metric displayed prominently in the header */\n metric?: ReactNode;\n /** Trend chip beside the metric (use the Aegis Badge or any node) */\n trend?: ReactNode;\n /** Optional actions (filters, export, etc.) rendered in the header */\n actions?: ReactNode;\n /** Footer content rendered below the chart body */\n footer?: ReactNode;\n /** Visual padding density */\n density?: 'comfortable' | 'compact';\n /** Render state — controls whether children, loader, empty, or error renders */\n state?: ChartCardState;\n /** Custom empty-state node */\n emptyState?: ReactNode;\n /** Custom loading-state node */\n loadingState?: ReactNode;\n /** Custom error-state node */\n errorState?: ReactNode;\n /** Optional aria-label for the chart region */\n ariaLabel?: string;\n}\n\nconst defaultEmpty = (\n <div className={styles.placeholder}>\n <div className={styles.placeholderTitle}>No data available</div>\n <div className={styles.placeholderText}>\n There&apos;s nothing to display for the selected range.\n </div>\n </div>\n);\n\nconst defaultLoading = (\n <div className={styles.placeholder}>\n <div className={styles.skeletonBars} aria-hidden=\"true\">\n <span />\n <span />\n <span />\n <span />\n <span />\n </div>\n <div className={styles.placeholderText}>Loading chart…</div>\n </div>\n);\n\nconst defaultError = (\n <div className={styles.placeholder} role=\"alert\">\n <div className={styles.placeholderTitle}>Unable to load chart</div>\n <div className={styles.placeholderText}>\n Something went wrong while loading this data. Try again in a moment.\n </div>\n </div>\n);\n\n/**\n * ChartCard — the unifying shell for every Aegis chart component.\n *\n * Provides a consistent header (title, subtitle, headline metric, trend chip,\n * actions), body slot, footer slot, and built-in loading / empty / error states.\n *\n * Every chart component in Aegis composes this card so the system feels\n * cohesive and developers get visual states for free.\n */\nexport function ChartCard({\n title,\n subtitle,\n metric,\n trend,\n actions,\n footer,\n density = 'comfortable',\n state = 'ready',\n emptyState,\n loadingState,\n errorState,\n ariaLabel,\n className,\n children,\n ...props\n}: ChartCardProps) {\n const showHeader = title || subtitle || metric || trend || actions;\n\n return (\n <section\n className={cn(styles.card, styles[density], className)}\n aria-label={ariaLabel}\n {...props}\n >\n {showHeader && (\n <header className={styles.header}>\n <div className={styles.headerText}>\n {title && <h3 className={styles.title}>{title}</h3>}\n {subtitle && <p className={styles.subtitle}>{subtitle}</p>}\n {(metric || trend) && (\n <div className={styles.metricRow}>\n {metric && <span className={styles.metric}>{metric}</span>}\n {trend && <span className={styles.trendSlot}>{trend}</span>}\n </div>\n )}\n </div>\n {actions && <div className={styles.actions}>{actions}</div>}\n </header>\n )}\n\n <div className={styles.body}>\n {state === 'loading' && (loadingState ?? defaultLoading)}\n {state === 'empty' && (emptyState ?? defaultEmpty)}\n {state === 'error' && (errorState ?? defaultError)}\n {state === 'ready' && children}\n </div>\n\n {footer && <footer className={styles.footer}>{footer}</footer>}\n </section>\n );\n}\n","/**\n * Skyfall Aegis — Chart Theme\n *\n * Centralized theme tokens for all Recharts-based components.\n * Reads from CSS custom properties so chart visuals stay in sync with\n * the rest of the Aegis design system.\n */\n\n/**\n * The Aegis chart series palette. Order is intentional — earlier colors\n * are used first so simple charts always pull from the most credible,\n * brand-aligned hues before moving into supporting accents.\n */\nexport const aegisSeriesPalette = [\n 'var(--aegis-data-vis-1)',\n 'var(--aegis-data-vis-2)',\n 'var(--aegis-data-vis-3)',\n 'var(--aegis-data-vis-4)',\n 'var(--aegis-data-vis-5)',\n] as const;\n\n/**\n * Resolve a series color by index, wrapping the palette if more series\n * exist than available colors. Accepts an explicit override.\n */\nexport function getSeriesColor(index: number, override?: string): string {\n if (override) return override;\n return aegisSeriesPalette[index % aegisSeriesPalette.length];\n}\n\n/**\n * Token-driven chart theme. Used to style axes, gridlines, tooltips,\n * legends, etc. so every chart in Aegis feels like part of one system.\n */\nexport const aegisChartTheme = {\n axis: {\n stroke: 'var(--aegis-data-vis-axis)',\n fontSize: 12,\n fontFamily: 'var(--aegis-font-family-sans)',\n tickColor: 'var(--aegis-color-text-muted)',\n },\n grid: {\n stroke: 'var(--aegis-data-vis-gridline)',\n strokeDasharray: '3 3',\n },\n tooltip: {\n background: 'var(--aegis-color-surface-overlay)',\n border: 'var(--aegis-color-border-default)',\n text: 'var(--aegis-color-text-primary)',\n muted: 'var(--aegis-color-text-secondary)',\n },\n reference: {\n stroke: 'var(--aegis-color-text-muted)',\n strokeDasharray: '4 4',\n },\n} as const;\n\nexport type ChartSeries<T = Record<string, unknown>> = {\n /** Property key on the data row that holds the series value */\n dataKey: keyof T & string;\n /** Display label for tooltip / legend */\n label?: string;\n /** Optional explicit color (defaults to Aegis palette) */\n color?: string;\n};\n\nexport type ValueFormatter = (value: number | string) => string;\n\n/** Default number formatter — locale-aware, with sensible compact behavior */\nexport const defaultValueFormatter: ValueFormatter = (value) => {\n if (typeof value !== 'number') return String(value);\n if (Math.abs(value) >= 1_000_000) return `${(value / 1_000_000).toFixed(1)}M`;\n if (Math.abs(value) >= 1_000) return `${(value / 1_000).toFixed(1)}k`;\n return value.toLocaleString();\n};\n",".tooltip {\n background-color: var(--aegis-color-surface-overlay);\n border: var(--aegis-border-width-hairline) solid var(--aegis-color-border-default);\n border-radius: var(--aegis-radius-md);\n box-shadow: var(--aegis-shadow-md);\n padding: var(--aegis-space-3) var(--aegis-space-4);\n min-width: 160px;\n font-family: var(--aegis-font-family-sans);\n pointer-events: none;\n}\n\n.label {\n font-size: var(--aegis-font-size-caption);\n font-weight: var(--aegis-font-weight-semibold);\n color: var(--aegis-color-text-secondary);\n text-transform: uppercase;\n letter-spacing: var(--aegis-tracking-wide);\n margin-bottom: var(--aegis-space-2);\n padding-bottom: var(--aegis-space-2);\n border-bottom: var(--aegis-border-width-hairline) solid var(--aegis-color-border-subtle);\n}\n\n.list {\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n gap: var(--aegis-space-1);\n}\n\n.row {\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-primary);\n}\n\n.swatch {\n width: 10px;\n height: 10px;\n border-radius: var(--aegis-radius-sm);\n flex-shrink: 0;\n}\n\n.name {\n flex: 1;\n color: var(--aegis-color-text-secondary);\n}\n\n.value {\n font-family: var(--aegis-font-family-mono);\n font-weight: var(--aegis-font-weight-semibold);\n color: var(--aegis-color-text-primary);\n font-variant-numeric: tabular-nums;\n}\n","import type { TooltipProps } from 'recharts';\nimport { defaultValueFormatter, type ValueFormatter } from './chartTheme';\nimport styles from './ChartTooltip.module.css';\n\nexport interface ChartTooltipProps extends TooltipProps<number, string> {\n /** Optional formatter for displayed values */\n valueFormatter?: ValueFormatter;\n /** Optional formatter for the tooltip label (e.g. axis category) */\n labelFormatter?: (label: string) => string;\n}\n\n/**\n * Aegis-styled tooltip used by every chart in the system.\n *\n * Pass directly to Recharts `<Tooltip content={<ChartTooltip />} />`.\n */\nexport function ChartTooltip({\n active,\n payload,\n label,\n valueFormatter = defaultValueFormatter,\n labelFormatter,\n}: ChartTooltipProps) {\n if (!active || !payload || payload.length === 0) return null;\n\n const displayLabel = labelFormatter && label != null ? labelFormatter(String(label)) : label;\n\n return (\n <div className={styles.tooltip} role=\"tooltip\">\n {displayLabel != null && <div className={styles.label}>{displayLabel}</div>}\n <ul className={styles.list}>\n {payload.map((entry, index) => (\n <li key={`${entry.dataKey}-${index}`} className={styles.row}>\n <span\n className={styles.swatch}\n style={{ backgroundColor: entry.color }}\n aria-hidden=\"true\"\n />\n <span className={styles.name}>{entry.name}</span>\n <span className={styles.value}>\n {entry.value != null ? valueFormatter(entry.value as number) : '—'}\n </span>\n </li>\n ))}\n </ul>\n </div>\n );\n}\n",".legend {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--aegis-space-4);\n list-style: none;\n margin: 0;\n padding: var(--aegis-space-3) 0 0;\n font-family: var(--aegis-font-family-sans);\n}\n\n.item {\n display: inline-flex;\n align-items: center;\n gap: var(--aegis-space-2);\n}\n\n.swatch {\n width: 10px;\n height: 10px;\n border-radius: var(--aegis-radius-sm);\n flex-shrink: 0;\n}\n\n.label {\n font-size: var(--aegis-font-size-body-sm);\n color: var(--aegis-color-text-secondary);\n font-weight: var(--aegis-font-weight-medium);\n}\n","import type { LegendProps } from 'recharts';\nimport styles from './ChartLegend.module.css';\n\n/**\n * Aegis-styled chart legend. Pass to Recharts via:\n * <Legend content={<ChartLegend />} />\n */\nexport function ChartLegend({ payload }: LegendProps) {\n if (!payload || payload.length === 0) return null;\n\n return (\n <ul className={styles.legend}>\n {payload.map((entry, index) => (\n <li key={`${entry.value}-${index}`} className={styles.item}>\n <span\n className={styles.swatch}\n style={{ backgroundColor: entry.color }}\n aria-hidden=\"true\"\n />\n <span className={styles.label}>{entry.value}</span>\n </li>\n ))}\n </ul>\n );\n}\n","import {\n CartesianGrid,\n Legend,\n Line,\n LineChart as RechartsLineChart,\n ReferenceLine,\n ResponsiveContainer,\n Tooltip,\n XAxis,\n YAxis,\n} from 'recharts';\nimport { ChartCard, type ChartCardProps } from './ChartCard';\nimport { ChartLegend } from './ChartLegend';\nimport { ChartTooltip } from './ChartTooltip';\nimport {\n aegisChartTheme,\n defaultValueFormatter,\n getSeriesColor,\n type ChartSeries,\n type ValueFormatter,\n} from './chartTheme';\n\nexport interface LineChartProps<T extends Record<string, unknown>>\n extends Omit<ChartCardProps, 'children'> {\n /** Row-shaped data — each row represents one x-axis category */\n data: T[];\n /** Property name on each row used for the x-axis */\n xKey: keyof T & string;\n /** One or more series definitions */\n series: ChartSeries<T>[];\n /** Chart height in pixels (defaults to 280) */\n height?: number;\n /** Show legend (defaults to true when more than one series) */\n showLegend?: boolean;\n /** Show grid (defaults to true) */\n showGrid?: boolean;\n /** Format values in tooltip / axis */\n valueFormatter?: ValueFormatter;\n /** Optional reference line value(s) (e.g. target threshold) */\n referenceLines?: { value: number; label?: string }[];\n /** Smooth curves (defaults to true) */\n smooth?: boolean;\n}\n\n/**\n * Aegis LineChart — wraps Recharts with Aegis tokens, shell, and states.\n *\n * Time-series and trend visualization for dashboards. Pair with KpiStatCard\n * for headline metrics or use standalone in a ChartCard layout.\n */\nexport function LineChart<T extends Record<string, unknown>>({\n data,\n xKey,\n series,\n height = 280,\n showLegend,\n showGrid = true,\n valueFormatter = defaultValueFormatter,\n referenceLines,\n smooth = true,\n state,\n ...cardProps\n}: LineChartProps<T>) {\n const effectiveState = state ?? (data.length === 0 ? 'empty' : 'ready');\n const showLegendFinal = showLegend ?? series.length > 1;\n\n return (\n <ChartCard state={effectiveState} {...cardProps}>\n <ResponsiveContainer width=\"100%\" height={height}>\n <RechartsLineChart data={data} margin={{ top: 8, right: 16, left: 0, bottom: 0 }}>\n {showGrid && (\n <CartesianGrid\n vertical={false}\n stroke={aegisChartTheme.grid.stroke}\n strokeDasharray={aegisChartTheme.grid.strokeDasharray}\n />\n )}\n <XAxis\n dataKey={xKey}\n stroke={aegisChartTheme.axis.stroke}\n tick={{ fill: aegisChartTheme.axis.tickColor, fontSize: aegisChartTheme.axis.fontSize }}\n tickLine={false}\n axisLine={{ stroke: aegisChartTheme.grid.stroke }}\n />\n <YAxis\n stroke={aegisChartTheme.axis.stroke}\n tick={{ fill: aegisChartTheme.axis.tickColor, fontSize: aegisChartTheme.axis.fontSize }}\n tickLine={false}\n axisLine={false}\n tickFormatter={(v) => valueFormatter(v as number)}\n width={48}\n />\n <Tooltip\n cursor={{ stroke: aegisChartTheme.grid.stroke, strokeWidth: 1 }}\n content={<ChartTooltip valueFormatter={valueFormatter} />}\n />\n {showLegendFinal && <Legend content={<ChartLegend />} />}\n {referenceLines?.map((ref, i) => (\n <ReferenceLine\n key={`ref-${i}`}\n y={ref.value}\n stroke={aegisChartTheme.reference.stroke}\n strokeDasharray={aegisChartTheme.reference.strokeDasharray}\n label={\n ref.label\n ? {\n value: ref.label,\n position: 'insideTopRight',\n fill: aegisChartTheme.tooltip.muted,\n fontSize: 11,\n }\n : undefined\n }\n />\n ))}\n {series.map((s, index) => {\n const color = getSeriesColor(index, s.color);\n return (\n <Line\n key={s.dataKey}\n type={smooth ? 'monotone' : 'linear'}\n dataKey={s.dataKey}\n name={s.label ?? s.dataKey}\n stroke={color}\n strokeWidth={2}\n dot={{ r: 0, fill: color }}\n activeDot={{ r: 5, strokeWidth: 0 }}\n isAnimationActive={false}\n />\n );\n })}\n </RechartsLineChart>\n </ResponsiveContainer>\n </ChartCard>\n );\n}\n","import {\n Area,\n AreaChart as RechartsAreaChart,\n CartesianGrid,\n Legend,\n ReferenceLine,\n ResponsiveContainer,\n Tooltip,\n XAxis,\n YAxis,\n} from 'recharts';\nimport { ChartCard, type ChartCardProps } from './ChartCard';\nimport { ChartLegend } from './ChartLegend';\nimport { ChartTooltip } from './ChartTooltip';\nimport {\n aegisChartTheme,\n defaultValueFormatter,\n getSeriesColor,\n type ChartSeries,\n type ValueFormatter,\n} from './chartTheme';\n\nexport interface AreaChartProps<T extends Record<string, unknown>>\n extends Omit<ChartCardProps, 'children'> {\n data: T[];\n xKey: keyof T & string;\n series: ChartSeries<T>[];\n height?: number;\n showLegend?: boolean;\n showGrid?: boolean;\n /** Stack areas (false = overlapping) */\n stacked?: boolean;\n valueFormatter?: ValueFormatter;\n referenceLines?: { value: number; label?: string }[];\n}\n\n/**\n * Aegis AreaChart — for cumulative trend / volume visualization.\n *\n * Set `stacked` to true to stack series on top of each other (e.g. cohort\n * composition over time).\n */\nexport function AreaChart<T extends Record<string, unknown>>({\n data,\n xKey,\n series,\n height = 280,\n showLegend,\n showGrid = true,\n stacked = false,\n valueFormatter = defaultValueFormatter,\n referenceLines,\n state,\n ...cardProps\n}: AreaChartProps<T>) {\n const effectiveState = state ?? (data.length === 0 ? 'empty' : 'ready');\n const showLegendFinal = showLegend ?? series.length > 1;\n\n return (\n <ChartCard state={effectiveState} {...cardProps}>\n <ResponsiveContainer width=\"100%\" height={height}>\n <RechartsAreaChart data={data} margin={{ top: 8, right: 16, left: 0, bottom: 0 }}>\n <defs>\n {series.map((s, index) => {\n const color = getSeriesColor(index, s.color);\n return (\n <linearGradient\n key={`grad-${s.dataKey}`}\n id={`aegis-area-${s.dataKey}`}\n x1=\"0\"\n y1=\"0\"\n x2=\"0\"\n y2=\"1\"\n >\n <stop offset=\"0%\" stopColor={color} stopOpacity={0.32} />\n <stop offset=\"100%\" stopColor={color} stopOpacity={0.02} />\n </linearGradient>\n );\n })}\n </defs>\n {showGrid && (\n <CartesianGrid\n vertical={false}\n stroke={aegisChartTheme.grid.stroke}\n strokeDasharray={aegisChartTheme.grid.strokeDasharray}\n />\n )}\n <XAxis\n dataKey={xKey}\n stroke={aegisChartTheme.axis.stroke}\n tick={{ fill: aegisChartTheme.axis.tickColor, fontSize: aegisChartTheme.axis.fontSize }}\n tickLine={false}\n axisLine={{ stroke: aegisChartTheme.grid.stroke }}\n />\n <YAxis\n stroke={aegisChartTheme.axis.stroke}\n tick={{ fill: aegisChartTheme.axis.tickColor, fontSize: aegisChartTheme.axis.fontSize }}\n tickLine={false}\n axisLine={false}\n tickFormatter={(v) => valueFormatter(v as number)}\n width={48}\n />\n <Tooltip\n cursor={{ stroke: aegisChartTheme.grid.stroke, strokeWidth: 1 }}\n content={<ChartTooltip valueFormatter={valueFormatter} />}\n />\n {showLegendFinal && <Legend content={<ChartLegend />} />}\n {referenceLines?.map((ref, i) => (\n <ReferenceLine\n key={`ref-${i}`}\n y={ref.value}\n stroke={aegisChartTheme.reference.stroke}\n strokeDasharray={aegisChartTheme.reference.strokeDasharray}\n label={\n ref.label\n ? {\n value: ref.label,\n position: 'insideTopRight',\n fill: aegisChartTheme.tooltip.muted,\n fontSize: 11,\n }\n : undefined\n }\n />\n ))}\n {series.map((s, index) => {\n const color = getSeriesColor(index, s.color);\n return (\n <Area\n key={s.dataKey}\n type=\"monotone\"\n dataKey={s.dataKey}\n name={s.label ?? s.dataKey}\n stroke={color}\n strokeWidth={2}\n fill={`url(#aegis-area-${s.dataKey})`}\n stackId={stacked ? 'aegis-stack' : undefined}\n isAnimationActive={false}\n activeDot={{ r: 5, strokeWidth: 0 }}\n />\n );\n })}\n </RechartsAreaChart>\n </ResponsiveContainer>\n </ChartCard>\n );\n}\n","import {\n Bar,\n BarChart as RechartsBarChart,\n CartesianGrid,\n Legend,\n ReferenceLine,\n ResponsiveContainer,\n Tooltip,\n XAxis,\n YAxis,\n} from 'recharts';\nimport { ChartCard, type ChartCardProps } from './ChartCard';\nimport { ChartLegend } from './ChartLegend';\nimport { ChartTooltip } from './ChartTooltip';\nimport {\n aegisChartTheme,\n defaultValueFormatter,\n getSeriesColor,\n type ChartSeries,\n type ValueFormatter,\n} from './chartTheme';\n\nexport interface BarChartProps<T extends Record<string, unknown>>\n extends Omit<ChartCardProps, 'children'> {\n data: T[];\n xKey: keyof T & string;\n series: ChartSeries<T>[];\n height?: number;\n showLegend?: boolean;\n showGrid?: boolean;\n /** Stack bars (renders as a stacked bar chart) */\n stacked?: boolean;\n /** Render bars horizontally */\n horizontal?: boolean;\n valueFormatter?: ValueFormatter;\n referenceLines?: { value: number; label?: string }[];\n}\n\n/**\n * Aegis BarChart — for categorical comparisons.\n *\n * Set `stacked` for stacked bars, `horizontal` for horizontal layout\n * (better for long category labels).\n */\nexport function BarChart<T extends Record<string, unknown>>({\n data,\n xKey,\n series,\n height = 280,\n showLegend,\n showGrid = true,\n stacked = false,\n horizontal = false,\n valueFormatter = defaultValueFormatter,\n referenceLines,\n state,\n ...cardProps\n}: BarChartProps<T>) {\n const effectiveState = state ?? (data.length === 0 ? 'empty' : 'ready');\n const showLegendFinal = showLegend ?? series.length > 1;\n\n return (\n <ChartCard state={effectiveState} {...cardProps}>\n <ResponsiveContainer width=\"100%\" height={height}>\n <RechartsBarChart\n data={data}\n layout={horizontal ? 'vertical' : 'horizontal'}\n margin={{ top: 8, right: 16, left: 0, bottom: 0 }}\n barCategoryGap=\"22%\"\n >\n {showGrid && (\n <CartesianGrid\n vertical={horizontal}\n horizontal={!horizontal}\n stroke={aegisChartTheme.grid.stroke}\n strokeDasharray={aegisChartTheme.grid.strokeDasharray}\n />\n )}\n {horizontal ? (\n <>\n <XAxis\n type=\"number\"\n stroke={aegisChartTheme.axis.stroke}\n tick={{\n fill: aegisChartTheme.axis.tickColor,\n fontSize: aegisChartTheme.axis.fontSize,\n }}\n tickLine={false}\n axisLine={false}\n tickFormatter={(v) => valueFormatter(v as number)}\n />\n <YAxis\n type=\"category\"\n dataKey={xKey}\n stroke={aegisChartTheme.axis.stroke}\n tick={{\n fill: aegisChartTheme.axis.tickColor,\n fontSize: aegisChartTheme.axis.fontSize,\n }}\n tickLine={false}\n axisLine={{ stroke: aegisChartTheme.grid.stroke }}\n width={96}\n />\n </>\n ) : (\n <>\n <XAxis\n dataKey={xKey}\n stroke={aegisChartTheme.axis.stroke}\n tick={{\n fill: aegisChartTheme.axis.tickColor,\n fontSize: aegisChartTheme.axis.fontSize,\n }}\n tickLine={false}\n axisLine={{ stroke: aegisChartTheme.grid.stroke }}\n />\n <YAxis\n stroke={aegisChartTheme.axis.stroke}\n tick={{\n fill: aegisChartTheme.axis.tickColor,\n fontSize: aegisChartTheme.axis.fontSize,\n }}\n tickLine={false}\n axisLine={false}\n tickFormatter={(v) => valueFormatter(v as number)}\n width={48}\n />\n </>\n )}\n <Tooltip\n cursor={{ fill: 'var(--aegis-state-hover-overlay)' }}\n content={<ChartTooltip valueFormatter={valueFormatter} />}\n />\n {showLegendFinal && <Legend content={<ChartLegend />} />}\n {referenceLines?.map((ref, i) => (\n <ReferenceLine\n key={`ref-${i}`}\n {...(horizontal ? { x: ref.value } : { y: ref.value })}\n stroke={aegisChartTheme.reference.stroke}\n strokeDasharray={aegisChartTheme.reference.strokeDasharray}\n label={\n ref.label\n ? {\n value: ref.label,\n position: 'insideTopRight',\n fill: aegisChartTheme.tooltip.muted,\n fontSize: 11,\n }\n : undefined\n }\n />\n ))}\n {series.map((s, index) => {\n const color = getSeriesColor(index, s.color);\n return (\n <Bar\n key={s.dataKey}\n dataKey={s.dataKey}\n name={s.label ?? s.dataKey}\n fill={color}\n radius={[4, 4, 0, 0]}\n stackId={stacked ? 'aegis-stack' : undefined}\n isAnimationActive={false}\n />\n );\n })}\n </RechartsBarChart>\n </ResponsiveContainer>\n </ChartCard>\n );\n}\n","import { BarChart, type BarChartProps } from './BarChart';\n\n/**\n * Aegis StackedBarChart — convenience wrapper around BarChart with\n * `stacked` enabled by default. Use this when stacking is the default\n * intent (e.g. cohort breakdown over time).\n */\nexport function StackedBarChart<T extends Record<string, unknown>>(\n props: Omit<BarChartProps<T>, 'stacked'>,\n) {\n return <BarChart {...props} stacked />;\n}\n\nexport type { BarChartProps as StackedBarChartProps } from './BarChart';\n","import { Cell, Pie, PieChart as RechartsPieChart, ResponsiveContainer, Tooltip } from 'recharts';\nimport { ChartCard, type ChartCardProps } from './ChartCard';\nimport { ChartTooltip } from './ChartTooltip';\nimport { defaultValueFormatter, getSeriesColor, type ValueFormatter } from './chartTheme';\nimport styles from './DonutChart.module.css';\n\nexport interface DonutChartDatum {\n /** Display label for the slice */\n name: string;\n /** Numeric value */\n value: number;\n /** Optional explicit color (defaults to Aegis palette) */\n color?: string;\n}\n\nexport interface DonutChartProps extends Omit<ChartCardProps, 'children'> {\n data: DonutChartDatum[];\n /** Center label (e.g. total value) */\n centerLabel?: string;\n /** Center sublabel (e.g. \"patients\") */\n centerSublabel?: string;\n /** Render as full pie instead of donut */\n variant?: 'donut' | 'pie';\n /** Chart height (defaults to 280) */\n height?: number;\n /** Format slice values in tooltip */\n valueFormatter?: ValueFormatter;\n /** Show legend list to the right of the chart */\n showLegend?: boolean;\n}\n\n/**\n * Aegis DonutChart — for distribution / part-to-whole comparisons.\n *\n * Center label/sublabel slots support headline metrics inside the donut.\n * For pie semantics, set `variant=\"pie\"`.\n */\nexport function DonutChart({\n data,\n centerLabel,\n centerSublabel,\n variant = 'donut',\n height = 280,\n valueFormatter = defaultValueFormatter,\n showLegend = true,\n state,\n ...cardProps\n}: DonutChartProps) {\n const effectiveState = state ?? (data.length === 0 ? 'empty' : 'ready');\n const total = data.reduce((sum, d) => sum + d.value, 0);\n\n return (\n <ChartCard state={effectiveState} {...cardProps}>\n <div className={styles.layout}>\n <div className={styles.chartWrap} style={{ height }}>\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <RechartsPieChart>\n <Pie\n data={data}\n dataKey=\"value\"\n nameKey=\"name\"\n cx=\"50%\"\n cy=\"50%\"\n innerRadius={variant === 'donut' ? '64%' : 0}\n outerRadius=\"92%\"\n paddingAngle={variant === 'donut' ? 2 : 0}\n stroke=\"var(--aegis-color-surface-default)\"\n strokeWidth={2}\n isAnimationActive={false}\n >\n {data.map((entry, index) => (\n <Cell key={`cell-${index}`} fill={getSeriesColor(index, entry.color)} />\n ))}\n </Pie>\n <Tooltip content={<ChartTooltip valueFormatter={valueFormatter} />} />\n </RechartsPieChart>\n </ResponsiveContainer>\n {variant === 'donut' && (centerLabel || centerSublabel) && (\n <div className={styles.center} aria-hidden=\"true\">\n {centerLabel && <div className={styles.centerLabel}>{centerLabel}</div>}\n {centerSublabel && <div className={styles.centerSub}>{centerSublabel}</div>}\n </div>\n )}\n </div>\n {showLegend && (\n <ul className={styles.legend}>\n {data.map((entry, index) => {\n const color = getSeriesColor(index, entry.color);\n const pct = total > 0 ? (entry.value / total) * 100 : 0;\n return (\n <li key={`${entry.name}-${index}`} className={styles.legendItem}>\n <span\n className={styles.swatch}\n style={{ backgroundColor: color }}\n aria-hidden=\"true\"\n />\n <span className={styles.legendLabel}>{entry.name}</span>\n <span className={styles.legendValue}>\n {valueFormatter(entry.value)}\n <span className={styles.legendPct}>{pct.toFixed(0)}%</span>\n </span>\n </li>\n );\n })}\n </ul>\n )}\n </div>\n </ChartCard>\n );\n}\n",".layout {\n display: grid;\n grid-template-columns: minmax(200px, 1fr) minmax(180px, 1fr);\n gap: var(--aegis-space-6);\n align-items: center;\n width: 100%;\n}\n\n@media (max-width: 640px) {\n .layout {\n grid-template-columns: 1fr;\n }\n}\n\n.chartWrap {\n position: relative;\n width: 100%;\n}\n\n.center {\n position: absolute;\n inset: 0;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n pointer-events: none;\n}\n\n.centerLabel {\n font-family: var(--aegis-font-family-sans);\n font-size: var(--aegis-font-size-display-md);\n line-height: 1;\n font-weight: var(--aegis-font-weight-semibold);\n color: var(--aegis-color-text-primary);\n letter-spacing: var(--aegis-tracking-tight);\n font-variant-numeric: tabular-nums;\n}\n\n.centerSub {\n margin-top: var(--aegis-space-1);\n font-size: var(--aegis-font-size-caption);\n text-transform: uppercase;\n letter-spacing: var(--aegis-tracking-wide);\n color: var(--aegis-color-text-secondary);\n font-weight: var(--aegis-font-weight-medium);\n}\n\n.legend {\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n gap: var(--aegis-space-2);\n}\n\n.legendItem {\n display: grid;\n grid-template-columns: 12px 1fr auto;\n align-items: center;\n gap: var(--aegis-space-3);\n padding: var(--aegis-space-2) 0;\n border-bottom: var(--aegis-border-width-hairline) solid var(--aegis-color-border-subtle);\n font-size: var(--aegis-font-size-body-sm);\n}\n\n.legendItem:last-child {\n border-bottom: none;\n}\n\n.swatch {\n width: 10px;\n height: 10px;\n border-radius: var(--aegis-radius-sm);\n}\n\n.legendLabel {\n color: var(--aegis-color-text-secondary);\n}\n\n.legendValue {\n display: inline-flex;\n align-items: baseline;\n gap: var(--aegis-space-2);\n font-family: var(--aegis-font-family-mono);\n font-weight: var(--aegis-font-weight-semibold);\n color: var(--aegis-color-text-primary);\n font-variant-numeric: tabular-nums;\n}\n\n.legendPct {\n font-family: var(--aegis-font-family-sans);\n font-size: var(--aegis-font-size-caption);\n font-weight: var(--aegis-font-weight-medium);\n color: var(--aegis-color-text-muted);\n}\n","import {\n Area,\n AreaChart,\n Line,\n LineChart,\n ResponsiveContainer,\n} from 'recharts';\nimport { getSeriesColor } from './chartTheme';\n\nexport interface SparklineProps {\n /** Array of numeric values OR row objects */\n data: number[] | Record<string, unknown>[];\n /** Property name when `data` is row-shaped (defaults to \"value\") */\n dataKey?: string;\n /** Render style */\n variant?: 'line' | 'area';\n /** Width in px (defaults to 120) — accepts any CSS length */\n width?: number | string;\n /** Height in px (defaults to 36) */\n height?: number | string;\n /** Line/area color (defaults to first Aegis series color) */\n color?: string;\n /** Stroke width (defaults to 2) */\n strokeWidth?: number;\n /** Optional accessible label */\n ariaLabel?: string;\n}\n\n/**\n * Aegis Sparkline — minimal inline trend chart for KPIs and table cells.\n *\n * Pure visual: no axes, grid, tooltip, or legend. Designed to live inside\n * stat cards, data grid cells, and dense dashboard surfaces.\n */\nexport function Sparkline({\n data,\n dataKey = 'value',\n variant = 'line',\n width = 120,\n height = 36,\n color,\n strokeWidth = 2,\n ariaLabel,\n}: SparklineProps) {\n const normalized: Record<string, number>[] =\n typeof data[0] === 'number'\n ? (data as number[]).map((v, i) => ({ x: i, [dataKey]: v }))\n : (data as Record<string, number>[]);\n\n const stroke = getSeriesColor(0, color);\n const gradientId = `aegis-spark-${dataKey}-${Math.random().toString(36).slice(2, 8)}`;\n\n return (\n <div\n style={{ width, height, display: 'inline-block' }}\n role={ariaLabel ? 'img' : undefined}\n aria-label={ariaLabel}\n >\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n {variant === 'area' ? (\n <AreaChart data={normalized} margin={{ top: 2, right: 2, left: 2, bottom: 2 }}>\n <defs>\n <linearGradient id={gradientId} x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" stopColor={stroke} stopOpacity={0.32} />\n <stop offset=\"100%\" stopColor={stroke} stopOpacity={0} />\n </linearGradient>\n </defs>\n <Area\n type=\"monotone\"\n dataKey={dataKey}\n stroke={stroke}\n strokeWidth={strokeWidth}\n fill={`url(#${gradientId})`}\n isAnimationActive={false}\n dot={false}\n />\n </AreaChart>\n ) : (\n <LineChart data={normalized} margin={{ top: 2, right: 2, left: 2, bottom: 2 }}>\n <Line\n type=\"monotone\"\n dataKey={dataKey}\n stroke={stroke}\n strokeWidth={strokeWidth}\n dot={false}\n isAnimationActive={false}\n />\n </LineChart>\n )}\n </ResponsiveContainer>\n </div>\n );\n}\n",".card {\n display: flex;\n flex-direction: column;\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-sm);\n font-family: var(--aegis-font-family-sans);\n transition: box-shadow var(--aegis-motion-duration-base) var(--aegis-motion-easing-standard),\n transform var(--aegis-motion-duration-base) var(--aegis-motion-easing-standard);\n}\n\n.card:hover {\n box-shadow: var(--aegis-shadow-md);\n}\n\n.comfortable {\n padding: var(--aegis-space-5);\n gap: var(--aegis-space-4);\n}\n\n.compact {\n padding: var(--aegis-space-4);\n gap: var(--aegis-space-3);\n}\n\n.header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: var(--aegis-space-3);\n}\n\n.label {\n font-size: var(--aegis-font-size-label-md);\n font-weight: var(--aegis-font-weight-medium);\n color: var(--aegis-color-text-secondary);\n text-transform: uppercase;\n letter-spacing: var(--aegis-tracking-wide);\n}\n\n.icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n border-radius: var(--aegis-radius-md);\n background-color: var(--aegis-color-surface-subtle);\n color: var(--aegis-color-text-secondary);\n}\n\n.valueRow {\n display: flex;\n align-items: baseline;\n gap: var(--aegis-space-2);\n}\n\n.value {\n font-size: var(--aegis-font-size-display-md);\n line-height: var(--aegis-line-height-display-md);\n font-weight: var(--aegis-font-weight-semibold);\n color: var(--aegis-color-text-primary);\n letter-spacing: var(--aegis-tracking-tight);\n font-variant-numeric: tabular-nums;\n}\n\n.unit {\n font-size: var(--aegis-font-size-body-md);\n font-weight: var(--aegis-font-weight-medium);\n color: var(--aegis-color-text-muted);\n}\n\n.footer {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--aegis-space-3);\n min-height: 40px;\n}\n\n.trend {\n display: inline-flex;\n align-items: center;\n gap: var(--aegis-space-1);\n font-size: var(--aegis-font-size-body-sm);\n font-weight: var(--aegis-font-weight-semibold);\n font-variant-numeric: tabular-nums;\n flex-wrap: wrap;\n}\n\n.trendIcon {\n display: inline-flex;\n}\n\n.trendValue {\n font-weight: var(--aegis-font-weight-semibold);\n}\n\n.up {\n color: var(--aegis-color-success-700);\n}\n\n.down {\n color: var(--aegis-color-error-700);\n}\n\n.neutral {\n color: var(--aegis-color-text-muted);\n}\n\n.changeLabel {\n margin-left: var(--aegis-space-1);\n color: var(--aegis-color-text-muted);\n font-weight: var(--aegis-font-weight-regular);\n}\n\n.sparkSlot {\n flex: 1;\n min-width: 0;\n max-width: 50%;\n display: flex;\n justify-content: flex-end;\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@media (prefers-reduced-motion: reduce) {\n .card {\n transition: none;\n }\n}\n","import { type HTMLAttributes, type ReactNode } from 'react';\nimport { cn } from '../utils/cn';\nimport { Sparkline, type SparklineProps } from './Sparkline';\nimport styles from './KpiStatCard.module.css';\n\nexport type TrendDirection = 'up' | 'down' | 'neutral';\n\nexport interface KpiStatCardProps extends HTMLAttributes<HTMLDivElement> {\n /** Metric label (e.g. \"Active patients\") */\n label: string;\n /** Headline value (e.g. 1284 or \"98.2%\") */\n value: ReactNode;\n /** Optional unit/suffix shown next to the value */\n unit?: ReactNode;\n /** Percent change (number) — positive renders as up, negative as down */\n change?: number;\n /** Label for the change context (e.g. \"vs last 30 days\") */\n changeLabel?: string;\n /** Override trend direction (otherwise inferred from `change`) */\n trend?: TrendDirection;\n /**\n * For success-positive metrics, set `inverse` to flip color semantics\n * (e.g. \"wait time\" — a decrease is good).\n */\n inverse?: boolean;\n /** Optional icon rendered top-right */\n icon?: ReactNode;\n /** Optional sparkline data — when present, renders an inline trend chart */\n sparklineData?: SparklineProps['data'];\n /** Sparkline color override */\n sparklineColor?: string;\n /** Sparkline render variant */\n sparklineVariant?: SparklineProps['variant'];\n /** Density variant */\n density?: 'comfortable' | 'compact';\n}\n\nfunction inferTrend(change?: number): TrendDirection {\n if (change == null || change === 0) return 'neutral';\n return change > 0 ? 'up' : 'down';\n}\n\nconst trendIcons: Record<TrendDirection, ReactNode> = {\n up: (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M3 11l5-6 5 6H3z\" />\n </svg>\n ),\n down: (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M3 5l5 6 5-6H3z\" />\n </svg>\n ),\n neutral: (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M3 7h10v2H3z\" />\n </svg>\n ),\n};\n\n/**\n * KpiStatCard — premium stat card with optional inline sparkline.\n *\n * The chart-aware evolution of StatCard. Use for headline KPIs in\n * dashboards. Pair with `inverse` for metrics where a decrease is positive\n * (e.g. wait time, error rate).\n *\n * Accessibility:\n * - Trend icons are aria-hidden; meaning is conveyed in visible text plus an\n * sr-only direction phrase.\n * - Sparkline accepts `aria-label` for screen reader trend description.\n */\nexport function KpiStatCard({\n label,\n value,\n unit,\n change,\n changeLabel,\n trend,\n inverse = false,\n icon,\n sparklineData,\n sparklineColor,\n sparklineVariant = 'area',\n density = 'comfortable',\n className,\n ...props\n}: KpiStatCardProps) {\n const direction = trend ?? inferTrend(change);\n const semantic: TrendDirection =\n inverse && direction === 'up' ? 'down' : inverse && direction === 'down' ? 'up' : direction;\n\n const formattedChange =\n change !== undefined ? `${change > 0 ? '+' : ''}${change}%` : undefined;\n\n return (\n <div className={cn(styles.card, styles[density], 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\n <div className={styles.valueRow}>\n <span className={styles.value}>{value}</span>\n {unit && <span className={styles.unit}>{unit}</span>}\n </div>\n\n {(formattedChange || sparklineData) && (\n <div className={styles.footer}>\n {formattedChange && (\n <div className={cn(styles.trend, styles[semantic])}>\n <span className={styles.trendIcon}>{trendIcons[direction]}</span>\n <span className={styles.trendValue}>{formattedChange}</span>\n {changeLabel && <span className={styles.changeLabel}>{changeLabel}</span>}\n <span className={styles.srOnly}>\n {direction === 'up'\n ? 'increase'\n : direction === 'down'\n ? 'decrease'\n : 'no change'}\n </span>\n </div>\n )}\n {sparklineData && (\n <div className={styles.sparkSlot}>\n <Sparkline\n data={sparklineData}\n color={sparklineColor}\n variant={sparklineVariant}\n width=\"100%\"\n height={40}\n ariaLabel={`${label} trend`}\n />\n </div>\n )}\n </div>\n )}\n </div>\n );\n}\n","import { type HTMLAttributes, type ReactNode } from 'react';\nimport { cn } from '../utils/cn';\nimport {\n Area,\n AreaChart,\n ResponsiveContainer,\n Tooltip,\n XAxis,\n YAxis,\n} from 'recharts';\nimport { ChartTooltip } from './ChartTooltip';\nimport {\n defaultValueFormatter,\n getSeriesColor,\n type ValueFormatter,\n} from './chartTheme';\nimport styles from './TrendStatCard.module.css';\n\nexport type TrendDirection = 'up' | 'down' | 'neutral';\n\nexport interface TrendStatCardProps<T extends Record<string, unknown>>\n extends HTMLAttributes<HTMLDivElement> {\n /** Metric label (e.g. \"30-day readmissions\") */\n label: string;\n /** Headline value */\n value: ReactNode;\n /** Optional unit (e.g. \"%\", \"patients\") */\n unit?: ReactNode;\n /** Trend chart data — row-shaped */\n data: T[];\n /** X-axis key on each row */\n xKey: keyof T & string;\n /** Y value key on each row */\n yKey: keyof T & string;\n /** Percent change value */\n change?: number;\n /** Change context label */\n changeLabel?: string;\n /** Inverse semantics — set true when a decrease is \"good\" */\n inverse?: boolean;\n /** Color override for the trend area */\n color?: string;\n /** Format values shown in tooltip */\n valueFormatter?: ValueFormatter;\n /** Chart height (defaults to 80) */\n chartHeight?: number;\n}\n\nfunction inferTrend(change?: number): TrendDirection {\n if (change == null || change === 0) return 'neutral';\n return change > 0 ? 'up' : 'down';\n}\n\nconst trendIcons: Record<TrendDirection, ReactNode> = {\n up: (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M3 11l5-6 5 6H3z\" />\n </svg>\n ),\n down: (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M3 5l5 6 5-6H3z\" />\n </svg>\n ),\n neutral: (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M3 7h10v2H3z\" />\n </svg>\n ),\n};\n\n/**\n * TrendStatCard — KPI card with a prominent trend chart underneath.\n *\n * Larger than KpiStatCard's inline sparkline, designed to fill more space\n * in dashboard rows where a trend story is the primary message.\n */\nexport function TrendStatCard<T extends Record<string, unknown>>({\n label,\n value,\n unit,\n data,\n xKey,\n yKey,\n change,\n changeLabel,\n inverse = false,\n color,\n valueFormatter = defaultValueFormatter,\n chartHeight = 80,\n className,\n ...props\n}: TrendStatCardProps<T>) {\n const direction = inferTrend(change);\n const semantic: TrendDirection =\n inverse && direction === 'up' ? 'down' : inverse && direction === 'down' ? 'up' : direction;\n const stroke = getSeriesColor(0, color);\n const formattedChange =\n change !== undefined ? `${change > 0 ? '+' : ''}${change}%` : undefined;\n const gradientId = `trend-stat-${String(yKey)}-${Math.random().toString(36).slice(2, 8)}`;\n\n return (\n <div className={cn(styles.card, className)} {...props}>\n <div className={styles.header}>\n <span className={styles.label}>{label}</span>\n {formattedChange && (\n <span className={cn(styles.chip, styles[semantic])}>\n {trendIcons[direction]}\n <span>{formattedChange}</span>\n </span>\n )}\n </div>\n <div className={styles.valueRow}>\n <span className={styles.value}>{value}</span>\n {unit && <span className={styles.unit}>{unit}</span>}\n </div>\n {changeLabel && <div className={styles.changeLabel}>{changeLabel}</div>}\n <div className={styles.chartWrap} style={{ height: chartHeight }}>\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <AreaChart data={data} margin={{ top: 4, right: 0, left: 0, bottom: 0 }}>\n <defs>\n <linearGradient id={gradientId} x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" stopColor={stroke} stopOpacity={0.32} />\n <stop offset=\"100%\" stopColor={stroke} stopOpacity={0} />\n </linearGradient>\n </defs>\n <XAxis dataKey={xKey} hide />\n <YAxis hide />\n <Tooltip content={<ChartTooltip valueFormatter={valueFormatter} />} />\n <Area\n type=\"monotone\"\n dataKey={yKey}\n stroke={stroke}\n strokeWidth={2}\n fill={`url(#${gradientId})`}\n isAnimationActive={false}\n dot={false}\n />\n </AreaChart>\n </ResponsiveContainer>\n </div>\n </div>\n );\n}\n",".card {\n display: flex;\n flex-direction: column;\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-sm);\n padding: var(--aegis-space-5);\n gap: var(--aegis-space-2);\n font-family: var(--aegis-font-family-sans);\n transition: box-shadow var(--aegis-motion-duration-base) var(--aegis-motion-easing-standard);\n overflow: hidden;\n}\n\n.card:hover {\n box-shadow: var(--aegis-shadow-md);\n}\n\n.header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--aegis-space-3);\n}\n\n.label {\n font-size: var(--aegis-font-size-label-md);\n font-weight: var(--aegis-font-weight-medium);\n color: var(--aegis-color-text-secondary);\n text-transform: uppercase;\n letter-spacing: var(--aegis-tracking-wide);\n}\n\n.chip {\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-size: var(--aegis-font-size-caption);\n font-weight: var(--aegis-font-weight-semibold);\n border: var(--aegis-border-width-hairline) solid currentColor;\n background-color: transparent;\n}\n\n.up {\n color: var(--aegis-color-success-700);\n background-color: var(--aegis-color-success-50);\n border-color: var(--aegis-color-border-success);\n}\n\n.down {\n color: var(--aegis-color-error-700);\n background-color: var(--aegis-color-error-50);\n border-color: var(--aegis-color-border-error);\n}\n\n.neutral {\n color: var(--aegis-color-text-muted);\n background-color: var(--aegis-color-surface-subtle);\n border-color: var(--aegis-color-border-default);\n}\n\n.valueRow {\n display: flex;\n align-items: baseline;\n gap: var(--aegis-space-2);\n margin-top: var(--aegis-space-1);\n}\n\n.value {\n font-size: var(--aegis-font-size-display-md);\n line-height: var(--aegis-line-height-display-md);\n font-weight: var(--aegis-font-weight-semibold);\n color: var(--aegis-color-text-primary);\n letter-spacing: var(--aegis-tracking-tight);\n font-variant-numeric: tabular-nums;\n}\n\n.unit {\n font-size: var(--aegis-font-size-body-md);\n color: var(--aegis-color-text-muted);\n font-weight: var(--aegis-font-weight-medium);\n}\n\n.changeLabel {\n font-size: var(--aegis-font-size-caption);\n color: var(--aegis-color-text-muted);\n}\n\n.chartWrap {\n width: calc(100% + var(--aegis-space-10));\n margin: var(--aegis-space-2) calc(var(--aegis-space-5) * -1) calc(var(--aegis-space-5) * -1);\n}\n\n@media (prefers-reduced-motion: reduce) {\n .card {\n transition: none;\n }\n}\n"],"mappings":"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","names":["import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","text","import_react","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","statusIcons","duration","import_jsx_runtime","statusIcons","import_react","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","surface","radius","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","activeId","groupItems","import_react","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","container","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","statusBadgeMap","statusLabels","import_jsx_runtime","import_jsx_runtime","statusBadgeMap","import_jsx_runtime","statusBadgeMap","import_jsx_runtime","statusBadgeMap","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","RechartsLineChart","import_recharts","import_jsx_runtime","RechartsAreaChart","import_recharts","import_jsx_runtime","RechartsBarChart","import_jsx_runtime","import_recharts","import_jsx_runtime","RechartsPieChart","import_recharts","import_jsx_runtime","import_jsx_runtime","semantic","import_recharts","import_jsx_runtime","inferTrend","trendIcons","semantic"]}