@annondeveloper/ui-kit 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +215 -0
  3. package/dist/chunk-5OKSXPWK.js +270 -0
  4. package/dist/chunk-5OKSXPWK.js.map +1 -0
  5. package/dist/cli/index.js +430 -0
  6. package/dist/form.d.ts +65 -0
  7. package/dist/form.js +148 -0
  8. package/dist/form.js.map +1 -0
  9. package/dist/index.d.ts +942 -0
  10. package/dist/index.js +2812 -0
  11. package/dist/index.js.map +1 -0
  12. package/dist/select-nnBJUO8U.d.ts +26 -0
  13. package/package.json +114 -0
  14. package/src/components/animated-counter.stories.tsx +68 -0
  15. package/src/components/animated-counter.tsx +85 -0
  16. package/src/components/avatar.tsx +106 -0
  17. package/src/components/badge.stories.tsx +70 -0
  18. package/src/components/badge.tsx +97 -0
  19. package/src/components/button.stories.tsx +101 -0
  20. package/src/components/button.tsx +67 -0
  21. package/src/components/card.tsx +128 -0
  22. package/src/components/checkbox.stories.tsx +64 -0
  23. package/src/components/checkbox.tsx +58 -0
  24. package/src/components/confirm-dialog.stories.tsx +96 -0
  25. package/src/components/confirm-dialog.tsx +145 -0
  26. package/src/components/data-table.stories.tsx +125 -0
  27. package/src/components/data-table.tsx +791 -0
  28. package/src/components/dropdown-menu.tsx +111 -0
  29. package/src/components/empty-state.stories.tsx +42 -0
  30. package/src/components/empty-state.tsx +43 -0
  31. package/src/components/filter-pill.stories.tsx +71 -0
  32. package/src/components/filter-pill.tsx +45 -0
  33. package/src/components/form-input.stories.tsx +91 -0
  34. package/src/components/form-input.tsx +77 -0
  35. package/src/components/log-viewer.tsx +212 -0
  36. package/src/components/metric-card.tsx +141 -0
  37. package/src/components/pipeline-stage.tsx +134 -0
  38. package/src/components/popover.tsx +72 -0
  39. package/src/components/port-status-grid.tsx +102 -0
  40. package/src/components/progress.tsx +128 -0
  41. package/src/components/radio-group.tsx +162 -0
  42. package/src/components/select.stories.tsx +52 -0
  43. package/src/components/select.tsx +92 -0
  44. package/src/components/severity-timeline.tsx +125 -0
  45. package/src/components/sheet.tsx +164 -0
  46. package/src/components/skeleton.stories.tsx +64 -0
  47. package/src/components/skeleton.tsx +62 -0
  48. package/src/components/slider.tsx +208 -0
  49. package/src/components/sparkline.tsx +104 -0
  50. package/src/components/status-badge.stories.tsx +84 -0
  51. package/src/components/status-badge.tsx +71 -0
  52. package/src/components/status-pulse.stories.tsx +56 -0
  53. package/src/components/status-pulse.tsx +78 -0
  54. package/src/components/success-checkmark.stories.tsx +67 -0
  55. package/src/components/success-checkmark.tsx +53 -0
  56. package/src/components/tabs.tsx +177 -0
  57. package/src/components/threshold-gauge.tsx +149 -0
  58. package/src/components/time-range-selector.tsx +86 -0
  59. package/src/components/toast.stories.tsx +70 -0
  60. package/src/components/toast.tsx +48 -0
  61. package/src/components/toggle-switch.stories.tsx +66 -0
  62. package/src/components/toggle-switch.tsx +51 -0
  63. package/src/components/tooltip.tsx +62 -0
  64. package/src/components/truncated-text.stories.tsx +56 -0
  65. package/src/components/truncated-text.tsx +80 -0
  66. package/src/components/uptime-tracker.tsx +138 -0
  67. package/src/components/utilization-bar.tsx +103 -0
  68. package/src/theme.css +178 -0
  69. package/src/utils.ts +123 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/button.tsx","../src/components/badge.tsx","../src/components/filter-pill.tsx","../src/components/empty-state.tsx","../src/components/skeleton.tsx","../src/components/truncated-text.tsx","../src/components/confirm-dialog.tsx","../src/components/animated-counter.tsx","../src/components/success-checkmark.tsx","../src/components/status-badge.tsx","../src/components/status-pulse.tsx","../src/components/toast.tsx","../src/components/data-table.tsx","../src/components/tabs.tsx","../src/components/dropdown-menu.tsx","../src/components/sheet.tsx","../src/components/progress.tsx","../src/components/avatar.tsx","../src/components/popover.tsx","../src/components/slider.tsx","../src/components/card.tsx","../src/components/radio-group.tsx","../src/components/tooltip.tsx","../src/components/sparkline.tsx","../src/components/metric-card.tsx","../src/components/utilization-bar.tsx","../src/components/threshold-gauge.tsx","../src/components/severity-timeline.tsx","../src/components/log-viewer.tsx","../src/components/port-status-grid.tsx","../src/components/time-range-selector.tsx","../src/components/pipeline-stage.tsx","../src/components/uptime-tracker.tsx"],"names":["jsxs","jsx","Loader2","useRef","useState","useEffect","useReducedMotion","motion","SonnerToaster","AnimatePresence","sizeClasses","useCallback","X","contentVariants","variantClasses","forwardRef","Tooltip","TooltipPrimitive","Search","statusBorder"],"mappings":"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","file":"index.js","sourcesContent":["'use client'\n\nimport { forwardRef, type ButtonHTMLAttributes } from 'react'\nimport { Loader2 } from 'lucide-react'\nimport { cn } from '../utils'\n\nexport type ButtonVariant = 'primary' | 'secondary' | 'danger' | 'outline' | 'ghost'\nexport type ButtonSize = 'sm' | 'md' | 'lg' | 'icon'\n\nconst variantClasses: Record<ButtonVariant, string> = {\n primary:\n 'bg-[hsl(var(--brand-primary))] text-[hsl(var(--text-on-brand))] hover:bg-[hsl(var(--brand-primary)/0.85)] active:bg-[hsl(var(--brand-primary)/0.75)]',\n secondary:\n 'bg-[hsl(var(--bg-elevated))] text-[hsl(var(--text-primary))] border border-[hsl(var(--border-default))] hover:bg-[hsl(var(--bg-overlay))] active:bg-[hsl(var(--border-subtle))]',\n danger:\n 'bg-[hsl(var(--status-critical))] text-[hsl(var(--text-on-brand))] hover:bg-[hsl(var(--status-critical)/0.85)] active:bg-[hsl(var(--status-critical)/0.75)]',\n outline:\n 'bg-transparent text-[hsl(var(--text-primary))] border border-[hsl(var(--border-default))] hover:bg-[hsl(var(--bg-elevated))] active:bg-[hsl(var(--bg-overlay))]',\n ghost:\n 'bg-transparent text-[hsl(var(--text-secondary))] hover:bg-[hsl(var(--bg-elevated))] hover:text-[hsl(var(--text-primary))] active:bg-[hsl(var(--bg-overlay))]',\n}\n\nconst sizeClasses: Record<ButtonSize, string> = {\n sm: 'h-8 px-3 text-xs gap-1.5 rounded-lg',\n md: 'h-9 px-4 text-sm gap-2 rounded-lg',\n lg: 'h-11 px-6 text-sm gap-2 rounded-xl',\n icon: 'h-9 w-9 rounded-lg',\n}\n\nexport interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n /** Visual variant of the button. */\n variant?: ButtonVariant\n /** Size preset. */\n size?: ButtonSize\n /** Show a loading spinner and disable interaction. */\n loading?: boolean\n}\n\n/**\n * @description A themed button with variant, size, and loading support.\n * Uses CSS custom property tokens for dark/light mode compatibility.\n */\nconst Button = forwardRef<HTMLButtonElement, ButtonProps>(\n ({ variant = 'primary', size = 'md', loading, disabled, className, children, ...props }, ref) => (\n <button\n ref={ref}\n disabled={disabled || loading}\n className={cn(\n 'inline-flex items-center justify-center font-medium transition-colors duration-150',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[hsl(var(--brand-primary))] focus-visible:ring-offset-2 focus-visible:ring-offset-[hsl(var(--bg-base))]',\n 'disabled:pointer-events-none disabled:opacity-50',\n 'cursor-pointer select-none',\n variantClasses[variant],\n sizeClasses[size],\n className,\n )}\n {...props}\n >\n {loading && <Loader2 className=\"h-4 w-4 animate-spin\" />}\n {children}\n </button>\n ),\n)\n\nButton.displayName = 'Button'\n\nexport { Button }\n","'use client'\n\nimport { cn } from '../utils'\nimport type { LucideIcon } from 'lucide-react'\n\n// ── Theme-safe color presets ────────────────────────────────────────────────\n// All colors use CSS custom properties for dark/light mode compliance.\n\nexport type BadgeColor =\n | 'brand' | 'blue' | 'green' | 'yellow' | 'red' | 'orange'\n | 'purple' | 'pink' | 'teal' | 'gray'\n\nconst COLOR_MAP: Record<BadgeColor, string> = {\n brand: 'bg-[hsl(var(--brand-primary))]/10 text-[hsl(var(--brand-primary))]',\n blue: 'bg-[hsl(var(--brand-secondary))]/10 text-[hsl(var(--brand-secondary))]',\n green: 'bg-[hsl(var(--status-ok))]/10 text-[hsl(var(--status-ok))]',\n yellow: 'bg-[hsl(var(--status-warning))]/10 text-[hsl(var(--status-warning))]',\n red: 'bg-[hsl(var(--status-critical))]/10 text-[hsl(var(--status-critical))]',\n orange: 'bg-[hsl(var(--status-warning))]/15 text-[hsl(var(--status-warning))]',\n purple: 'bg-[hsl(270,60%,60%)]/10 text-[hsl(270,60%,65%)]',\n pink: 'bg-[hsl(330,60%,60%)]/10 text-[hsl(330,60%,65%)]',\n teal: 'bg-[hsl(180,60%,40%)]/10 text-[hsl(180,60%,55%)]',\n gray: 'bg-[hsl(var(--bg-overlay))] text-[hsl(var(--text-secondary))]',\n}\n\nexport interface BadgeProps {\n children: React.ReactNode\n /** Color preset for the badge. */\n color?: BadgeColor\n /** Optional icon displayed before the label. */\n icon?: LucideIcon\n /** Size variant. */\n size?: 'xs' | 'sm' | 'md'\n className?: string\n}\n\n/**\n * @description A themed pill badge with color presets and optional icon.\n * Supports xs, sm, and md sizes with dark/light mode via CSS tokens.\n */\nexport function Badge({\n children, color = 'gray', icon: Icon, size = 'sm', className,\n}: BadgeProps) {\n return (\n <span className={cn(\n 'inline-flex items-center gap-1 rounded-full font-medium whitespace-nowrap',\n size === 'xs' && 'px-1.5 py-0.5 text-[10px]',\n size === 'sm' && 'px-2 py-0.5 text-xs',\n size === 'md' && 'px-2.5 py-1 text-xs',\n COLOR_MAP[color],\n className,\n )}>\n {Icon && <Icon className={cn(size === 'xs' ? 'size-2.5' : 'size-3')} />}\n {children}\n </span>\n )\n}\n\n// ── Badge variant factory ──────────────────────────────────────────────────\n\nexport interface BadgeVariantConfig<T extends string> {\n /** Map from value to BadgeColor. */\n colorMap: Partial<Record<T, BadgeColor>>\n /** Map from value to display label. Falls back to the value itself. */\n labelMap?: Partial<Record<T, string>>\n /** Default color when value is not found in colorMap. */\n defaultColor?: BadgeColor\n /** Default size for the badge. */\n defaultSize?: 'xs' | 'sm' | 'md'\n}\n\n/**\n * @description Factory function to create domain-specific badge components.\n * Accepts a color map and optional label map, returns a typed Badge component.\n *\n * @example\n * ```tsx\n * const SeverityBadge = createBadgeVariant({\n * colorMap: { critical: 'red', warning: 'yellow', info: 'blue' },\n * labelMap: { critical: 'Critical', warning: 'Warning', info: 'Info' },\n * })\n * // Usage: <SeverityBadge value=\"critical\" />\n * ```\n */\nexport function createBadgeVariant<T extends string>(config: BadgeVariantConfig<T>) {\n const { colorMap, labelMap, defaultColor = 'gray', defaultSize = 'xs' } = config\n\n return function VariantBadge({ value, className }: { value: T; className?: string }) {\n const color = colorMap[value] ?? defaultColor\n const label = labelMap?.[value] ?? value.replace(/_/g, ' ')\n return (\n <Badge color={color} size={defaultSize} className={className}>\n {label}\n </Badge>\n )\n }\n}\n","'use client'\n\nimport { cn } from '../utils'\n\nexport interface FilterPillProps {\n /** Label text for the pill. */\n label: string\n /** Optional count displayed after the label. */\n count?: number\n /** Whether this pill is currently active/selected. */\n active: boolean\n /** Click handler. */\n onClick: () => void\n className?: string\n}\n\n/**\n * @description A rounded pill-style filter toggle with active state and optional count.\n * Uses CSS custom property tokens for dark/light mode compatibility.\n */\nexport function FilterPill({ label, count, active, onClick, className }: FilterPillProps) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className={cn(\n 'rounded-full px-3 py-1 text-xs transition-colors whitespace-nowrap',\n active\n ? 'bg-[hsl(var(--brand-primary))]/10 text-[hsl(var(--brand-primary))] font-medium'\n : 'bg-[hsl(var(--bg-elevated))] text-[hsl(var(--text-secondary))] hover:bg-[hsl(var(--bg-overlay))]',\n className,\n )}\n >\n {label}\n {count != null && (\n <span className={cn(\n 'ml-1.5 tabular-nums',\n active ? 'text-[hsl(var(--brand-primary))]/70' : 'text-[hsl(var(--text-tertiary))]',\n )}>\n {count}\n </span>\n )}\n </button>\n )\n}\n","'use client'\n\nimport { cn } from '../utils'\nimport type { LucideIcon } from 'lucide-react'\n\nexport interface EmptyStateProps {\n /** Icon component displayed in the center. */\n icon: LucideIcon\n /** Title text. */\n title: string\n /** Description text. */\n description: string\n /** Optional action buttons rendered below the description. */\n actions?: React.ReactNode\n className?: string\n}\n\n/**\n * @description A decorative empty state placeholder with icon, title, description, and optional actions.\n * Features a subtle gradient background and glass-morphism styling.\n */\nexport function EmptyState({ icon: Icon, title, description, actions, className }: EmptyStateProps) {\n return (\n <div\n className={cn(\n 'relative overflow-hidden flex flex-col items-center justify-center rounded-2xl border border-dashed border-[hsl(var(--border-default))]',\n 'bg-[hsl(var(--bg-surface)/0.6)] backdrop-blur-xl px-6 py-12 text-center',\n className,\n )}\n >\n {/* Decorative gradient background */}\n <div className=\"pointer-events-none absolute inset-0 bg-gradient-to-b from-[hsl(var(--brand-primary)/0.04)] to-transparent\" />\n <div className=\"pointer-events-none absolute inset-0 bg-[radial-gradient(ellipse_at_50%_0%,hsl(var(--brand-primary)/0.06),transparent_70%)]\" />\n\n <div className=\"relative mb-4 flex size-14 items-center justify-center rounded-2xl bg-[hsl(var(--bg-elevated))] border border-[hsl(var(--border-subtle)/0.6)] shadow-[0_1px_3px_hsl(0_0%_0%/0.12)]\">\n <Icon className=\"size-6 text-[hsl(var(--text-disabled))]\" />\n </div>\n <h3 className=\"relative text-heading-3 text-[hsl(var(--text-primary))] mb-1\">{title}</h3>\n <p className=\"relative text-body text-[hsl(var(--text-secondary))] max-w-sm\">{description}</p>\n {actions && <div className=\"relative mt-6 flex gap-3\">{actions}</div>}\n </div>\n )\n}\n","'use client'\n\nimport { cn } from '../utils'\n\n/**\n * @description A shimmer skeleton loader block. Requires the `skeleton-shimmer` CSS class\n * from theme.css to animate.\n */\nexport function Skeleton({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n className={cn('skeleton-shimmer rounded-md', className)}\n {...props}\n />\n )\n}\n\nexport interface SkeletonTextProps {\n /** Number of text lines to render. */\n lines?: number\n className?: string\n}\n\n/**\n * @description A multi-line skeleton text placeholder. The last line renders shorter\n * for a natural paragraph appearance.\n */\nexport function SkeletonText({ lines = 1, className }: SkeletonTextProps) {\n return (\n <div className={cn('space-y-2', className)}>\n {Array.from({ length: lines }).map((_, i) => (\n <Skeleton\n key={i}\n className={cn('h-3', i === lines - 1 && lines > 1 ? 'w-4/5' : 'w-full')}\n />\n ))}\n </div>\n )\n}\n\n/**\n * @description A card-shaped skeleton placeholder with header area and content bars.\n */\nexport function SkeletonCard({ className }: { className?: string }) {\n return (\n <div className={cn('rounded-lg border border-[hsl(var(--border-subtle))] bg-[hsl(var(--bg-surface))] p-4 space-y-3', className)}>\n <div className=\"flex items-center gap-3\">\n <Skeleton className=\"size-8 rounded-md\" />\n <div className=\"flex-1 space-y-1.5\">\n <Skeleton className=\"h-3.5 w-32\" />\n <Skeleton className=\"h-2.5 w-20\" />\n </div>\n <Skeleton className=\"h-5 w-14 rounded-full\" />\n </div>\n <div className=\"flex gap-3\">\n <Skeleton className=\"h-2.5 flex-1\" />\n <Skeleton className=\"h-2.5 flex-1\" />\n <Skeleton className=\"h-2.5 flex-1\" />\n </div>\n </div>\n )\n}\n","'use client'\n\nimport { useRef, useState, useEffect } from 'react'\nimport * as Tooltip from '@radix-ui/react-tooltip'\nimport { Copy, Check } from 'lucide-react'\n\nexport interface TruncatedTextProps {\n /** The full text to display (truncated if it overflows). */\n text: string\n /** Max width constraint for truncation. */\n maxWidth?: string | number\n className?: string\n}\n\n/**\n * @description A text element that truncates with ellipsis and shows a tooltip with the\n * full text on hover when truncated. Includes a copy-to-clipboard button in the tooltip.\n */\nexport function TruncatedText({ text, maxWidth = '100%', className = '' }: TruncatedTextProps) {\n const ref = useRef<HTMLSpanElement>(null)\n const [isTruncated, setIsTruncated] = useState(false)\n const [copied, setCopied] = useState(false)\n\n useEffect(() => {\n const el = ref.current\n if (el) setIsTruncated(el.scrollWidth > el.clientWidth)\n }, [text])\n\n const handleCopy = async (e: React.MouseEvent) => {\n e.stopPropagation()\n await navigator.clipboard.writeText(text)\n setCopied(true)\n setTimeout(() => setCopied(false), 1500)\n }\n\n const inner = (\n <span\n ref={ref}\n className={`block truncate ${className}`}\n style={{ maxWidth }}\n >\n {text}\n </span>\n )\n\n if (!isTruncated) return inner\n\n return (\n <Tooltip.Provider delayDuration={300}>\n <Tooltip.Root>\n <Tooltip.Trigger asChild>{inner}</Tooltip.Trigger>\n <Tooltip.Portal>\n <Tooltip.Content\n side=\"top\"\n align=\"start\"\n sideOffset={6}\n className=\"z-50 max-w-[400px] rounded-lg border border-[hsl(var(--border-default))]\n bg-[hsl(var(--bg-elevated))] px-3 py-2 shadow-lg\n animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out\n data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95\"\n >\n <p className=\"text-small text-[hsl(var(--text-primary))] break-all\">{text}</p>\n <div className=\"mt-1.5 flex justify-end\">\n <button\n onClick={handleCopy}\n className=\"flex items-center gap-1 rounded px-2 py-0.5\n text-[11px] text-[hsl(var(--brand-primary))]\n hover:bg-[hsl(var(--bg-surface))] transition-colors\"\n >\n {copied ? <Check className=\"h-3 w-3\" /> : <Copy className=\"h-3 w-3\" />}\n {copied ? 'Copied' : 'Copy'}\n </button>\n </div>\n <Tooltip.Arrow className=\"fill-[hsl(var(--bg-elevated))]\" />\n </Tooltip.Content>\n </Tooltip.Portal>\n </Tooltip.Root>\n </Tooltip.Provider>\n )\n}\n","'use client'\n\nimport * as AlertDialog from '@radix-ui/react-alert-dialog'\nimport { motion, AnimatePresence } from 'framer-motion'\nimport { AlertTriangle, Loader2 } from 'lucide-react'\nimport { cn } from '../utils'\n\nexport interface ConfirmDialogProps {\n /** Whether the dialog is open. */\n open: boolean\n /** Callback to control open state. */\n onOpenChange: (open: boolean) => void\n /** Dialog title. */\n title: string\n /** Dialog description text. */\n description: string\n /** Label for the confirm button. */\n confirmLabel?: string\n /** Label for the cancel button. */\n cancelLabel?: string\n /** Visual variant affecting the icon and confirm button color. */\n variant?: 'danger' | 'warning' | 'default'\n /** Show a loading spinner on the confirm button. */\n loading?: boolean\n /** Callback when confirmed. */\n onConfirm: () => void\n}\n\nconst variantStyles = {\n danger: {\n icon: 'text-[hsl(var(--status-critical))] bg-[hsl(var(--status-critical))]/10',\n button: 'bg-[hsl(var(--status-critical))] hover:bg-[hsl(var(--status-critical))]/90 text-[hsl(var(--text-on-brand))]',\n },\n warning: {\n icon: 'text-[hsl(var(--status-warning))] bg-[hsl(var(--status-warning))]/10',\n button: 'bg-[hsl(var(--status-warning))] hover:bg-[hsl(var(--status-warning))]/90 text-[hsl(var(--text-on-brand))]',\n },\n default: {\n icon: 'text-[hsl(var(--brand-primary))] bg-[hsl(var(--brand-primary))]/10',\n button: 'bg-[hsl(var(--brand-primary))] hover:bg-[hsl(var(--brand-primary))]/90 text-[hsl(var(--text-on-brand))]',\n },\n}\n\n/**\n * @description A confirmation dialog built on Radix AlertDialog with Framer Motion animations.\n * Supports danger, warning, and default variants with loading state.\n */\nexport function ConfirmDialog({\n open,\n onOpenChange,\n title,\n description,\n confirmLabel = 'Confirm',\n cancelLabel = 'Cancel',\n variant = 'danger',\n loading = false,\n onConfirm,\n}: ConfirmDialogProps) {\n const styles = variantStyles[variant]\n\n return (\n <AlertDialog.Root open={open} onOpenChange={onOpenChange}>\n <AnimatePresence>\n {open && (\n <AlertDialog.Portal forceMount>\n <AlertDialog.Overlay asChild>\n <motion.div\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={{ duration: 0.15 }}\n className=\"fixed inset-0 z-50 bg-[hsl(var(--bg-base)/0.7)] backdrop-blur-sm\"\n />\n </AlertDialog.Overlay>\n <AlertDialog.Content asChild>\n <motion.div\n initial={{ opacity: 0, scale: 0.95, y: 8 }}\n animate={{ opacity: 1, scale: 1, y: 0 }}\n exit={{ opacity: 0, scale: 0.95, y: 8 }}\n transition={{ duration: 0.2, ease: [0.16, 1, 0.3, 1] }}\n className={cn(\n 'fixed left-1/2 top-1/2 z-50 -translate-x-1/2 -translate-y-1/2',\n 'w-full max-w-md p-6 rounded-2xl',\n 'border border-[hsl(var(--border-default))]',\n 'bg-[hsl(var(--bg-elevated))] shadow-2xl',\n 'focus:outline-none',\n )}\n >\n <div className=\"flex gap-4\">\n <div className={cn('flex-shrink-0 p-2.5 rounded-xl h-fit', styles.icon)}>\n <AlertTriangle className=\"w-5 h-5\" />\n </div>\n <div className=\"flex-1 min-w-0\">\n <AlertDialog.Title className=\"text-base font-semibold text-[hsl(var(--text-primary))]\">\n {title}\n </AlertDialog.Title>\n <AlertDialog.Description className=\"mt-2 text-sm text-[hsl(var(--text-secondary))] leading-relaxed\">\n {description}\n </AlertDialog.Description>\n </div>\n </div>\n\n <div className=\"flex justify-end gap-3 mt-6\">\n <AlertDialog.Cancel\n className={cn(\n 'px-4 py-2 text-sm font-medium rounded-lg',\n 'border border-[hsl(var(--border-default))]',\n 'text-[hsl(var(--text-primary))]',\n 'hover:bg-[hsl(var(--bg-overlay))] transition-colors',\n 'focus:outline-none focus:ring-2 focus:ring-[hsl(var(--brand-primary))]',\n )}\n >\n {cancelLabel}\n </AlertDialog.Cancel>\n <AlertDialog.Action\n onClick={(e) => {\n e.preventDefault()\n onConfirm()\n }}\n disabled={loading}\n className={cn(\n 'px-4 py-2 text-sm font-medium rounded-lg transition-all',\n 'focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-offset-[hsl(var(--bg-elevated))]',\n styles.button,\n loading && 'opacity-70 cursor-not-allowed',\n )}\n >\n {loading ? (\n <span className=\"flex items-center gap-2\">\n <Loader2 className=\"w-4 h-4 animate-spin\" />\n {confirmLabel}\n </span>\n ) : (\n confirmLabel\n )}\n </AlertDialog.Action>\n </div>\n </motion.div>\n </AlertDialog.Content>\n </AlertDialog.Portal>\n )}\n </AnimatePresence>\n </AlertDialog.Root>\n )\n}\n","'use client'\n\nimport { useEffect, useRef, useState } from 'react'\nimport { useReducedMotion } from 'framer-motion'\nimport { cn } from '../utils'\n\nexport interface AnimatedCounterProps {\n /** The target numeric value to animate to. */\n value: number\n /** Animation duration in milliseconds. */\n duration?: number\n className?: string\n /** Custom formatting function for the displayed number. */\n format?: (n: number) => string\n}\n\nfunction easeOutCubic(t: number): number {\n return 1 - Math.pow(1 - t, 3)\n}\n\n/**\n * @description An animated number counter that transitions smoothly between values\n * using requestAnimationFrame. Respects prefers-reduced-motion.\n */\nexport function AnimatedCounter({\n value,\n duration = 400,\n className,\n format,\n}: AnimatedCounterProps) {\n const reduced = useReducedMotion()\n const prevRef = useRef(value)\n const rafRef = useRef<number | null>(null)\n const [displayed, setDisplayed] = useState(value)\n\n useEffect(() => {\n const from = prevRef.current\n const to = value\n prevRef.current = value\n\n if (reduced || from === to) {\n setDisplayed(to)\n return\n }\n\n const start = performance.now()\n\n function tick(now: number) {\n const elapsed = now - start\n const progress = Math.min(elapsed / duration, 1)\n const eased = easeOutCubic(progress)\n const current = from + (to - from) * eased\n\n setDisplayed(current)\n\n if (progress < 1) {\n rafRef.current = requestAnimationFrame(tick)\n } else {\n setDisplayed(to)\n }\n }\n\n rafRef.current = requestAnimationFrame(tick)\n\n return () => {\n if (rafRef.current !== null) {\n cancelAnimationFrame(rafRef.current)\n }\n }\n }, [value, duration, reduced])\n\n const formatted = format\n ? format(displayed)\n : Number.isInteger(value)\n ? Math.round(displayed).toString()\n : displayed.toFixed(\n value.toString().split('.')[1]?.length ?? 1\n )\n\n return (\n <span className={cn('tabular-nums', className)}>\n {formatted}\n </span>\n )\n}\n","'use client'\n\nimport { motion, useReducedMotion } from 'framer-motion'\n\nexport interface SuccessCheckmarkProps {\n /** Size of the SVG in pixels. */\n size?: number\n className?: string\n}\n\n/**\n * @description An animated success checkmark SVG with circle and path draw animations.\n * Uses Framer Motion spring physics. Respects prefers-reduced-motion.\n */\nexport function SuccessCheckmark({ size = 20, className }: SuccessCheckmarkProps) {\n const reduced = useReducedMotion()\n\n return (\n <motion.svg\n width={size}\n height={size}\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n className={className}\n initial={reduced ? false : { scale: 0, opacity: 0 }}\n animate={{ scale: 1, opacity: 1 }}\n transition={{ type: 'spring', stiffness: 300, damping: 20 }}\n >\n <motion.circle\n cx=\"10\"\n cy=\"10\"\n r=\"9\"\n stroke=\"hsl(var(--status-ok))\"\n strokeWidth=\"1.5\"\n fill=\"none\"\n initial={reduced ? false : { pathLength: 0 }}\n animate={{ pathLength: 1 }}\n transition={{ duration: 0.4, ease: 'easeOut' }}\n />\n <motion.path\n d=\"M6 10l2.5 2.5L14 7.5\"\n stroke=\"hsl(var(--status-ok))\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n fill=\"none\"\n initial={reduced ? false : { pathLength: 0 }}\n animate={{ pathLength: 1 }}\n transition={{ duration: 0.3, delay: 0.2, ease: 'easeOut' }}\n />\n </motion.svg>\n )\n}\n","'use client'\n\nimport { cn } from '../utils'\n\n/** Configuration for a single status entry in a StatusBadge. */\nexport interface StatusConfig {\n /** Display label. */\n label: string\n /** CSS class for the status dot. */\n dot: string\n /** CSS class for the text color. */\n text: string\n /** CSS class for the background color. */\n bg: string\n}\n\n/** A sensible default status map covering common statuses. */\nexport const defaultStatusMap: Record<string, StatusConfig> = {\n ok: { label: 'OK', dot: 'bg-[hsl(var(--status-ok))]', text: 'text-[hsl(var(--status-ok))]', bg: 'bg-[hsl(var(--status-ok))]/10' },\n active: { label: 'Active', dot: 'bg-[hsl(var(--status-ok))]', text: 'text-[hsl(var(--status-ok))]', bg: 'bg-[hsl(var(--status-ok))]/10' },\n warning: { label: 'Warning', dot: 'bg-[hsl(var(--status-warning))]', text: 'text-[hsl(var(--status-warning))]', bg: 'bg-[hsl(var(--status-warning))]/10' },\n critical: { label: 'Critical', dot: 'bg-[hsl(var(--status-critical))]', text: 'text-[hsl(var(--status-critical))]', bg: 'bg-[hsl(var(--status-critical))]/10' },\n unknown: { label: 'Unknown', dot: 'bg-[hsl(var(--status-unknown))]', text: 'text-[hsl(var(--status-unknown))]', bg: 'bg-[hsl(var(--status-unknown))]/10' },\n maintenance: { label: 'Maintenance', dot: 'bg-[hsl(var(--status-maintenance))]', text: 'text-[hsl(var(--status-maintenance))]', bg: 'bg-[hsl(var(--status-maintenance))]/10' },\n stale: { label: 'Stale', dot: 'bg-[hsl(var(--status-warning))]', text: 'text-[hsl(var(--status-warning))]', bg: 'bg-[hsl(var(--status-warning))]/10' },\n inactive: { label: 'Inactive', dot: 'bg-[hsl(var(--text-tertiary))]', text: 'text-[hsl(var(--text-tertiary))]', bg: 'bg-[hsl(var(--text-tertiary))]/10' },\n decommissioned: { label: 'Decommissioned', dot: 'bg-[hsl(var(--text-disabled))]', text: 'text-[hsl(var(--text-disabled))]', bg: 'bg-[hsl(var(--text-disabled))]/10' },\n pending: { label: 'Pending', dot: 'bg-[hsl(var(--status-warning))]', text: 'text-[hsl(var(--status-warning))]', bg: 'bg-[hsl(var(--status-warning))]/10' },\n}\n\nexport interface StatusBadgeProps {\n /** Status key to look up in the status map. */\n status: string\n /** Override display label. */\n label?: string\n /** Size variant. */\n size?: 'sm' | 'md'\n /** Show a CSS pulse animation on the dot. */\n pulse?: boolean\n /** Custom status map. Falls back to defaultStatusMap. */\n statusMap?: Record<string, StatusConfig>\n className?: string\n}\n\n/**\n * @description A status badge with colored dot indicator and label.\n * Accepts a configurable statusMap to define custom status values and their appearance.\n * Falls back to a built-in default map if none is provided.\n */\nexport function StatusBadge({\n status, label, size = 'md', pulse = false, statusMap, className,\n}: StatusBadgeProps) {\n const map = statusMap ?? defaultStatusMap\n const fallback = map['unknown'] ?? defaultStatusMap['unknown']!\n const config = map[status] ?? fallback\n\n return (\n <span\n className={cn(\n 'inline-flex items-center gap-1.5 rounded-full font-medium',\n size === 'sm' ? 'px-1.5 py-0.5 text-[0.6875rem]' : 'px-2 py-1 text-[0.75rem]',\n config.text,\n config.bg,\n className,\n )}\n >\n <span className={cn('rounded-full shrink-0', size === 'sm' ? 'size-1.5' : 'size-2', config.dot, pulse && 'animate-pulse')} />\n {label ?? config.label}\n </span>\n )\n}\n","'use client'\n\nimport { motion, useReducedMotion } from 'framer-motion'\nimport { cn } from '../utils'\n\n/** Configuration for a single status in StatusPulse. */\nexport interface PulseConfig {\n /** CSS class for the solid dot. */\n dot: string\n /** CSS class for the pulse ring. */\n ring: string\n /** Whether to show the pulse ring animation. */\n pulse: boolean\n /** Use faster animation (e.g. for degraded states). */\n fast: boolean\n}\n\n/** Default pulse configuration map for common statuses. */\nexport const defaultPulseConfigMap: Record<string, PulseConfig> = {\n online: { dot: 'bg-[hsl(var(--status-ok))]', ring: 'bg-[hsl(var(--status-ok))]', pulse: true, fast: false },\n degraded: { dot: 'bg-[hsl(var(--status-warning))]', ring: 'bg-[hsl(var(--status-warning))]', pulse: true, fast: true },\n offline: { dot: 'bg-[hsl(var(--status-critical))]', ring: 'bg-[hsl(var(--status-critical))]', pulse: false, fast: false },\n unknown: { dot: 'bg-[hsl(var(--text-tertiary))]', ring: 'bg-[hsl(var(--text-tertiary))]', pulse: false, fast: false },\n}\n\nexport interface StatusPulseProps {\n /** Status key to look up in the config map. */\n status: string\n /** Whether to show the status label text. */\n label?: boolean\n /** Custom pulse configuration map. Falls back to defaultPulseConfigMap. */\n configMap?: Record<string, PulseConfig>\n className?: string\n}\n\n/**\n * @description An animated status indicator dot with optional pulse ring and label.\n * Accepts a configurable map to define custom statuses. Respects prefers-reduced-motion.\n */\nexport function StatusPulse({ status, label = true, configMap, className }: StatusPulseProps) {\n const reduced = useReducedMotion()\n const map = configMap ?? defaultPulseConfigMap\n const cfg = map[status] ?? map['unknown'] ?? defaultPulseConfigMap['unknown']!\n\n return (\n <div className={cn('flex items-center gap-2', className)}>\n <div className=\"relative flex size-2.5 shrink-0\">\n {/* Pulse ring -- CSS animation only */}\n {cfg.pulse && !reduced && (\n <span\n className={cn(\n 'absolute inline-flex size-full rounded-full opacity-75 animate-pulse-ring',\n cfg.ring,\n cfg.fast && '[animation-duration:1s]',\n )}\n />\n )}\n {/* Solid dot */}\n <motion.span\n className={cn('relative inline-flex size-2.5 rounded-full', cfg.dot)}\n animate={{ scale: 1 }}\n whileHover={{ scale: reduced ? 1 : 1.3 }}\n transition={{ type: 'spring', stiffness: 400, damping: 15 }}\n />\n </div>\n {label && (\n <motion.span\n key={status}\n initial={reduced ? {} : { opacity: 0 }}\n animate={{ opacity: 1 }}\n className=\"text-xs font-medium capitalize text-[hsl(var(--text-secondary))]\"\n >\n {status}\n </motion.span>\n )}\n </div>\n )\n}\n","'use client'\n\nimport { Toaster as SonnerToaster } from 'sonner'\n\nexport interface ToasterProps {\n /** Theme mode. Controls Sonner's internal theming. */\n theme?: 'dark' | 'light'\n /** Toast position on screen. */\n position?: 'top-left' | 'top-right' | 'top-center' | 'bottom-left' | 'bottom-right' | 'bottom-center'\n /** Auto-dismiss duration in milliseconds. */\n duration?: number\n}\n\n/**\n * @description A pre-themed Sonner toast container. Accepts theme as a prop\n * instead of reading from a hook, making it portable across applications.\n * Import this Toaster once in your app layout, then use `toast()` from sonner anywhere.\n */\nexport function Toaster({ theme = 'dark', position = 'bottom-right', duration = 4000 }: ToasterProps) {\n return (\n <SonnerToaster\n theme={theme}\n position={position}\n richColors\n duration={duration}\n gap={8}\n toastOptions={{\n style: {\n background: 'hsl(var(--bg-elevated))',\n color: 'hsl(var(--text-primary))',\n border: '1px solid hsl(var(--border-default))',\n borderRadius: '0.75rem',\n boxShadow: '0 8px 32px hsl(0 0% 0% / 0.25)',\n fontSize: '0.875rem',\n },\n classNames: {\n success: 'toast-success',\n error: 'toast-error',\n warning: 'toast-warning',\n info: 'toast-info',\n },\n }}\n />\n )\n}\n\n// Re-export toast function for convenient imports\nexport { toast } from 'sonner'\n","'use client'\n\nimport { useState, useMemo, useCallback, useRef, useEffect } from 'react'\nimport {\n useReactTable, getCoreRowModel, getSortedRowModel,\n getFilteredRowModel, getPaginationRowModel,\n flexRender, type ColumnDef, type SortingState,\n type ColumnFiltersState, type VisibilityState,\n type FilterFn, type Table,\n} from '@tanstack/react-table'\nimport { motion, AnimatePresence, useReducedMotion } from 'framer-motion'\nimport {\n Search, ChevronUp, ChevronDown, ChevronsUpDown,\n Download, Filter, X, List, AlignJustify, LayoutList,\n Columns3, Eye, EyeOff, GripVertical,\n} from 'lucide-react'\nimport type { LucideIcon } from 'lucide-react'\nimport { TruncatedText } from './truncated-text'\nimport { EmptyState } from './empty-state'\nimport { Skeleton } from './skeleton'\nimport { cn } from '../utils'\n\n// ---------------------------------------------------------------------------\n// Types & constants\n// ---------------------------------------------------------------------------\n\nexport type Density = 'compact' | 'comfortable' | 'spacious'\n\nconst DENSITY_CLASSES: Record<Density, string> = {\n compact: 'py-1.5 px-3',\n comfortable: 'py-3 px-4',\n spacious: 'py-4 px-5',\n}\n\nconst DENSITY_ICONS: { key: Density; icon: LucideIcon; label: string }[] = [\n { key: 'compact', icon: List, label: 'Compact' },\n { key: 'comfortable', icon: AlignJustify, label: 'Comfortable' },\n { key: 'spacious', icon: LayoutList, label: 'Spacious' },\n]\n\nconst PAGE_SIZES = [10, 25, 50, 100]\nconst STORAGE_KEY = 'ui-kit-table-density'\n\n// ---------------------------------------------------------------------------\n// Global filter\n// ---------------------------------------------------------------------------\n\nconst globalFilterFn: FilterFn<unknown> = (row, _columnId, filterValue) => {\n const search = String(filterValue).toLowerCase()\n return row.getAllCells().some(cell =>\n String(cell.getValue() ?? '').toLowerCase().includes(search)\n )\n}\n\n// ---------------------------------------------------------------------------\n// CSV export\n// ---------------------------------------------------------------------------\n\nfunction exportToCsv<T>(table: Table<T>, filename: string) {\n const headers = table.getAllColumns().filter(c => c.getIsVisible()).map(c => c.id)\n const rows = table.getFilteredRowModel().rows.map(row =>\n headers.map(h => {\n const val = row.getValue(h)\n const str = String(val ?? '')\n return str.includes(',') || str.includes('\"') ? `\"${str.replace(/\"/g, '\"\"')}\"` : str\n }).join(',')\n )\n const csv = [headers.join(','), ...rows].join('\\n')\n const blob = new Blob([csv], { type: 'text/csv' })\n const url = URL.createObjectURL(blob)\n const a = document.createElement('a')\n a.href = url\n a.download = `${filename}.csv`\n a.click()\n URL.revokeObjectURL(url)\n}\n\n// ---------------------------------------------------------------------------\n// Column filter popover (internal)\n// ---------------------------------------------------------------------------\n\nfunction ColumnFilterPopover<T>({ column, table }: {\n column: ReturnType<Table<T>['getHeaderGroups']>[0]['headers'][0]['column']\n table: Table<T>\n}) {\n const [open, setOpen] = useState(false)\n const ref = useRef<HTMLDivElement>(null)\n const currentFilter = column.getFilterValue()\n const isActive = currentFilter !== undefined && currentFilter !== '' &&\n !(Array.isArray(currentFilter) && currentFilter.length === 0)\n\n useEffect(() => {\n if (!open) return\n const handler = (e: MouseEvent) => {\n if (ref.current && !ref.current.contains(e.target as Node)) setOpen(false)\n }\n document.addEventListener('mousedown', handler)\n return () => document.removeEventListener('mousedown', handler)\n }, [open])\n\n const { kind, uniqueValues } = useMemo(() => {\n const rows = table.getPreFilteredRowModel().rows.slice(0, 100)\n const vals = rows.map(r => r.getValue(column.id)).filter(v => v != null)\n const nums = vals.filter(v => typeof v === 'number' || (typeof v === 'string' && v !== '' && !isNaN(Number(v))))\n if (nums.length > vals.length * 0.7 && vals.length > 0) return { kind: 'number' as const, uniqueValues: [] }\n const uniques = [...new Set(vals.map(v => String(v)))]\n if (uniques.length > 0 && uniques.length < 20) return { kind: 'enum' as const, uniqueValues: uniques.sort() }\n return { kind: 'text' as const, uniqueValues: [] }\n }, [table, column.id])\n\n return (\n <div ref={ref} className=\"relative inline-flex\">\n <button\n onClick={(e) => { e.stopPropagation(); setOpen(o => !o) }}\n className=\"relative p-0.5 rounded hover:bg-[hsl(var(--bg-elevated)/0.5)] transition-colors\"\n aria-label={`Filter ${column.id}`}\n >\n <Filter className=\"h-3 w-3 text-[hsl(var(--text-tertiary))]\" />\n {isActive && (\n <span className=\"absolute -top-0.5 -right-0.5 w-1.5 h-1.5 rounded-full bg-[hsl(var(--brand-primary))]\" />\n )}\n </button>\n\n {open && (\n <div\n className=\"absolute top-full left-0 z-50 mt-1 min-w-[200px]\n bg-[hsl(var(--bg-elevated))] border border-[hsl(var(--border-default))] rounded-lg shadow-lg p-3\"\n onClick={e => e.stopPropagation()}\n >\n <div className=\"flex items-center justify-between mb-2\">\n <span className=\"text-[11px] font-medium text-[hsl(var(--text-secondary))] uppercase tracking-wider\">\n Filter\n </span>\n {isActive && (\n <button\n onClick={() => { column.setFilterValue(undefined); setOpen(false) }}\n className=\"text-[11px] text-[hsl(var(--brand-primary))] hover:underline\"\n >\n Clear\n </button>\n )}\n </div>\n\n {kind === 'text' && (\n <input\n type=\"text\"\n value={(currentFilter as string) ?? ''}\n onChange={e => column.setFilterValue(e.target.value || undefined)}\n placeholder=\"Search\\u2026\"\n className=\"w-full rounded-md border border-[hsl(var(--border-subtle))]\n bg-[hsl(var(--bg-surface))] px-2.5 py-1.5 text-small text-[hsl(var(--text-primary))]\n placeholder:text-[hsl(var(--text-tertiary))] outline-none\n focus:border-[hsl(var(--brand-primary))] transition-colors\"\n autoFocus\n />\n )}\n\n {kind === 'number' && (\n <div className=\"flex gap-2\">\n <input\n type=\"number\"\n value={(currentFilter as [number?, number?])?.[0] ?? ''}\n onChange={e => {\n const val = e.target.value === '' ? undefined : Number(e.target.value)\n column.setFilterValue((old: [number?, number?]) => [val, old?.[1]])\n }}\n placeholder=\"Min\"\n className=\"w-full rounded-md border border-[hsl(var(--border-subtle))]\n bg-[hsl(var(--bg-surface))] px-2.5 py-1.5 text-small text-[hsl(var(--text-primary))]\n placeholder:text-[hsl(var(--text-tertiary))] outline-none\n focus:border-[hsl(var(--brand-primary))] transition-colors\"\n />\n <input\n type=\"number\"\n value={(currentFilter as [number?, number?])?.[1] ?? ''}\n onChange={e => {\n const val = e.target.value === '' ? undefined : Number(e.target.value)\n column.setFilterValue((old: [number?, number?]) => [old?.[0], val])\n }}\n placeholder=\"Max\"\n className=\"w-full rounded-md border border-[hsl(var(--border-subtle))]\n bg-[hsl(var(--bg-surface))] px-2.5 py-1.5 text-small text-[hsl(var(--text-primary))]\n placeholder:text-[hsl(var(--text-tertiary))] outline-none\n focus:border-[hsl(var(--brand-primary))] transition-colors\"\n />\n </div>\n )}\n\n {kind === 'enum' && (\n <div className=\"max-h-[200px] overflow-y-auto space-y-1\">\n {uniqueValues.map(val => {\n const selected = Array.isArray(currentFilter) ? (currentFilter as string[]).includes(val) : false\n return (\n <label key={val} className=\"flex items-center gap-2 rounded px-1.5 py-1\n hover:bg-[hsl(var(--bg-surface)/0.5)] cursor-pointer transition-colors\">\n <input\n type=\"checkbox\"\n checked={selected}\n onChange={() => {\n const prev = Array.isArray(currentFilter) ? (currentFilter as string[]) : []\n const next = selected ? prev.filter(v => v !== val) : [...prev, val]\n column.setFilterValue(next.length > 0 ? next : undefined)\n }}\n className=\"rounded border-[hsl(var(--border-default))] accent-[hsl(var(--brand-primary))]\"\n />\n <span className=\"text-small text-[hsl(var(--text-primary))] truncate\">{val}</span>\n </label>\n )\n })}\n </div>\n )}\n </div>\n )}\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Column picker\n// ---------------------------------------------------------------------------\n\nfunction ColumnPicker<T>({ table, onClose }: { table: Table<T>; onClose: () => void }) {\n const ref = useRef<HTMLDivElement>(null)\n const [dragIdx, setDragIdx] = useState<number | null>(null)\n\n useEffect(() => {\n const handler = (e: MouseEvent) => {\n if (ref.current && !ref.current.contains(e.target as Node)) onClose()\n }\n document.addEventListener('mousedown', handler)\n return () => document.removeEventListener('mousedown', handler)\n }, [onClose])\n\n const allColumns = table.getAllLeafColumns()\n\n const handleDragStart = (idx: number) => setDragIdx(idx)\n const handleDragOver = (e: React.DragEvent, idx: number) => {\n e.preventDefault()\n if (dragIdx === null || dragIdx === idx) return\n const order = table.getState().columnOrder.length > 0\n ? [...table.getState().columnOrder]\n : allColumns.map(c => c.id)\n const [moved] = order.splice(dragIdx, 1)\n if (moved !== undefined) order.splice(idx, 0, moved)\n table.setColumnOrder(order)\n setDragIdx(idx)\n }\n\n return (\n <motion.div\n ref={ref}\n initial={{ opacity: 0, y: -4 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: -4 }}\n transition={{ duration: 0.12 }}\n className={cn(\n 'absolute right-0 top-full z-50 mt-1 w-56 rounded-xl overflow-hidden',\n 'border border-[hsl(var(--border-subtle))] bg-[hsl(var(--bg-elevated))] shadow-xl',\n )}\n >\n <div className=\"px-3 py-2 border-b border-[hsl(var(--border-subtle)/0.5)]\">\n <span className=\"text-[10px] font-semibold uppercase tracking-wider text-[hsl(var(--text-tertiary))]\">\n Columns\n </span>\n </div>\n <div className=\"max-h-72 overflow-y-auto p-1\">\n {allColumns.map((col, idx) => {\n if (!col.getCanHide()) return null\n const visible = col.getIsVisible()\n const header = typeof col.columnDef.header === 'string' ? col.columnDef.header : col.id\n return (\n <div\n key={col.id}\n draggable\n onDragStart={() => handleDragStart(idx)}\n onDragOver={(e) => handleDragOver(e, idx)}\n onDragEnd={() => setDragIdx(null)}\n className={cn(\n 'flex items-center gap-2 rounded-lg px-2 py-1.5 text-small cursor-grab',\n 'hover:bg-[hsl(var(--bg-surface)/0.7)] transition-colors',\n dragIdx === idx && 'bg-[hsl(var(--brand-primary)/0.1)]',\n )}\n >\n <GripVertical className=\"h-3 w-3 text-[hsl(var(--text-disabled))] shrink-0\" />\n <button\n onClick={() => col.toggleVisibility()}\n className=\"flex items-center gap-2 flex-1 text-left\"\n >\n {visible\n ? <Eye className=\"h-3.5 w-3.5 text-[hsl(var(--brand-primary))]\" />\n : <EyeOff className=\"h-3.5 w-3.5 text-[hsl(var(--text-disabled))]\" />}\n <span className={cn(\n 'truncate',\n visible ? 'text-[hsl(var(--text-primary))]' : 'text-[hsl(var(--text-disabled))]',\n )}>\n {header}\n </span>\n </button>\n </div>\n )\n })}\n </div>\n <div className=\"px-3 py-2 border-t border-[hsl(var(--border-subtle)/0.5)]\">\n <button\n onClick={() => {\n table.toggleAllColumnsVisible(true)\n table.setColumnOrder([])\n }}\n className=\"text-[10px] text-[hsl(var(--brand-primary))] hover:text-[hsl(var(--text-primary))] transition-colors\"\n >\n Reset to defaults\n </button>\n </div>\n </motion.div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// DataTable props\n// ---------------------------------------------------------------------------\n\nexport interface DataTableProps<T> {\n /** Column definitions from @tanstack/react-table. */\n columns: ColumnDef<T, unknown>[]\n /** Row data array. */\n data: T[]\n /** Show loading skeleton. */\n isLoading?: boolean\n /** Custom empty state configuration. */\n emptyState?: { icon: LucideIcon; title: string; description: string }\n /** Placeholder text for the search input. */\n searchPlaceholder?: string\n /** Callback when a row is clicked. */\n onRowClick?: (row: T) => void\n /** Default sorting configuration. */\n defaultSort?: { id: string; desc: boolean }\n /** Default number of rows per page. */\n defaultPageSize?: number\n /** Filename for CSV export (enables export button when set). */\n exportFilename?: string\n /** Make the first column sticky on horizontal scroll. */\n stickyFirstColumn?: boolean\n /** Override the density setting. */\n density?: Density\n}\n\n// ---------------------------------------------------------------------------\n// DataTable component\n// ---------------------------------------------------------------------------\n\n/**\n * @description A full-featured data table with search, column filters, sorting, pagination,\n * density control, column visibility/reorder, CSV export, and Framer Motion row animations.\n * Built on @tanstack/react-table v8.\n */\nexport function DataTable<T>({\n columns,\n data,\n isLoading = false,\n emptyState: emptyStateProps,\n searchPlaceholder = 'Search...',\n onRowClick,\n defaultSort,\n defaultPageSize = 25,\n exportFilename,\n stickyFirstColumn = false,\n density: densityProp,\n}: DataTableProps<T>) {\n const prefersReducedMotion = useReducedMotion()\n\n const [density, setDensity] = useState<Density>(() => {\n if (densityProp) return densityProp\n if (typeof window !== 'undefined') {\n const stored = localStorage.getItem(STORAGE_KEY)\n if (stored && stored in DENSITY_CLASSES) return stored as Density\n }\n return 'comfortable'\n })\n\n const handleDensity = useCallback((d: Density) => {\n setDensity(d)\n localStorage.setItem(STORAGE_KEY, d)\n }, [])\n\n const [sorting, setSorting] = useState<SortingState>(\n defaultSort ? [{ id: defaultSort.id, desc: defaultSort.desc }] : []\n )\n const [columnFilters, setColumnFilters] = useState<ColumnFiltersState>([])\n const [globalFilter, setGlobalFilter] = useState('')\n const [columnVisibility, setColumnVisibility] = useState<VisibilityState>({})\n const [columnOrder, setColumnOrder] = useState<string[]>([])\n const [columnPickerOpen, setColumnPickerOpen] = useState(false)\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const table = useReactTable({\n data: data as any[],\n columns: columns as any,\n state: { sorting, columnFilters, globalFilter, columnVisibility, columnOrder },\n onSortingChange: setSorting,\n onColumnFiltersChange: setColumnFilters,\n onGlobalFilterChange: setGlobalFilter,\n onColumnVisibilityChange: setColumnVisibility,\n onColumnOrderChange: setColumnOrder,\n globalFilterFn,\n getCoreRowModel: getCoreRowModel(),\n getSortedRowModel: getSortedRowModel(),\n getFilteredRowModel: getFilteredRowModel(),\n getPaginationRowModel: getPaginationRowModel(),\n initialState: { pagination: { pageSize: defaultPageSize } },\n })\n\n const activeFilterCount = columnFilters.length\n const { pageIndex, pageSize } = table.getState().pagination\n const totalRows = table.getFilteredRowModel().rows.length\n const startRow = totalRows === 0 ? 0 : pageIndex * pageSize + 1\n const endRow = Math.min((pageIndex + 1) * pageSize, totalRows)\n const pageCount = table.getPageCount()\n\n const rowVariants = useMemo(() => ({\n hidden: { opacity: 0, y: 4 },\n visible: (i: number) => ({\n opacity: 1,\n y: 0,\n transition: {\n delay: Math.min(i, 20) * 0.02,\n duration: 0.15,\n },\n }),\n }), [])\n\n // Loading skeleton\n if (isLoading) {\n return (\n <div className=\"rounded-xl border border-[hsl(var(--border-subtle)/0.5)]\n bg-[hsl(var(--bg-surface)/0.6)] backdrop-blur-xl overflow-hidden\">\n <div className=\"flex items-center gap-3 p-4 border-b border-[hsl(var(--border-subtle)/0.3)]\">\n <Skeleton className=\"h-9 w-64 rounded-lg\" />\n <div className=\"flex-1\" />\n <Skeleton className=\"h-8 w-24 rounded-lg\" />\n </div>\n <div className=\"divide-y divide-[hsl(var(--border-subtle)/0.3)]\">\n {Array.from({ length: 8 }).map((_, i) => (\n <div key={i} className={cn('flex gap-4', DENSITY_CLASSES.comfortable)}>\n <Skeleton className=\"h-4 w-32\" />\n <Skeleton className=\"h-4 w-48\" />\n <Skeleton className=\"h-4 w-24\" />\n <Skeleton className=\"h-4 flex-1\" />\n </div>\n ))}\n </div>\n </div>\n )\n }\n\n return (\n <div className=\"rounded-xl border border-[hsl(var(--border-subtle)/0.5)]\n bg-[hsl(var(--bg-surface)/0.6)] backdrop-blur-xl overflow-hidden\">\n\n {/* Toolbar */}\n <div className=\"flex flex-wrap items-center gap-3 px-4 py-3\n border-b border-[hsl(var(--border-subtle)/0.3)]\">\n\n {/* Search */}\n <div className=\"relative flex-1 min-w-[200px] max-w-sm\">\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4\n text-[hsl(var(--text-tertiary))]\" />\n <input\n type=\"text\"\n value={globalFilter}\n onChange={e => setGlobalFilter(e.target.value)}\n placeholder={searchPlaceholder}\n className=\"w-full rounded-lg border border-[hsl(var(--border-subtle))]\n bg-[hsl(var(--bg-surface))] pl-9 pr-3 py-2 text-small\n text-[hsl(var(--text-primary))] placeholder:text-[hsl(var(--text-tertiary))]\n outline-none focus:border-[hsl(var(--brand-primary))] transition-colors\"\n />\n {globalFilter && (\n <button\n onClick={() => setGlobalFilter('')}\n className=\"absolute right-2.5 top-1/2 -translate-y-1/2 p-0.5 rounded\n hover:bg-[hsl(var(--bg-elevated)/0.5)] transition-colors\"\n >\n <X className=\"h-3.5 w-3.5 text-[hsl(var(--text-tertiary))]\" />\n </button>\n )}\n </div>\n\n {/* Active filter count */}\n {activeFilterCount > 0 && (\n <span className=\"inline-flex items-center gap-1 rounded-full\n bg-[hsl(var(--brand-primary)/0.15)] px-2.5 py-1 text-[11px] font-medium\n text-[hsl(var(--brand-primary))]\">\n <Filter className=\"h-3 w-3\" />\n {activeFilterCount} filter{activeFilterCount > 1 ? 's' : ''}\n </span>\n )}\n\n <div className=\"flex-1\" />\n\n {/* Density toggle */}\n <div className=\"flex items-center rounded-lg border border-[hsl(var(--border-subtle))]\n bg-[hsl(var(--bg-surface))] p-0.5\">\n {DENSITY_ICONS.map(({ key, icon: Icon, label }) => (\n <button\n key={key}\n onClick={() => handleDensity(key)}\n title={label}\n className={cn(\n 'p-1.5 rounded-md transition-colors',\n density === key\n ? 'bg-[hsl(var(--brand-primary)/0.2)] text-[hsl(var(--brand-primary))]'\n : 'text-[hsl(var(--text-tertiary))] hover:text-[hsl(var(--text-secondary))]',\n )}\n >\n <Icon className=\"h-3.5 w-3.5\" />\n </button>\n ))}\n </div>\n\n {/* Column visibility picker */}\n <div className=\"relative\">\n <button\n onClick={() => setColumnPickerOpen(o => !o)}\n className={cn(\n 'flex items-center gap-1.5 rounded-lg border border-[hsl(var(--border-subtle))]',\n 'bg-[hsl(var(--bg-surface))] px-3 py-1.5 text-small text-[hsl(var(--text-secondary))]',\n 'hover:bg-[hsl(var(--bg-elevated)/0.5)] hover:text-[hsl(var(--text-primary))] transition-colors',\n )}\n >\n <Columns3 className=\"h-3.5 w-3.5\" />\n Columns\n </button>\n <AnimatePresence>\n {columnPickerOpen && (\n <ColumnPicker table={table} onClose={() => setColumnPickerOpen(false)} />\n )}\n </AnimatePresence>\n </div>\n\n {/* CSV export */}\n {exportFilename && (\n <button\n onClick={() => exportToCsv(table, exportFilename)}\n className=\"flex items-center gap-1.5 rounded-lg border border-[hsl(var(--border-subtle))]\n bg-[hsl(var(--bg-surface))] px-3 py-1.5 text-small text-[hsl(var(--text-secondary))]\n hover:bg-[hsl(var(--bg-elevated)/0.5)] hover:text-[hsl(var(--text-primary))]\n transition-colors\"\n >\n <Download className=\"h-3.5 w-3.5\" />\n Export\n </button>\n )}\n\n {/* Row count */}\n <span className=\"text-[11px] text-[hsl(var(--text-tertiary))] tabular-nums\">\n {totalRows} row{totalRows !== 1 ? 's' : ''}\n </span>\n </div>\n\n {/* Table */}\n <div className={cn('overflow-x-auto', stickyFirstColumn && 'relative')}>\n <table className=\"w-full border-collapse text-small\">\n <thead>\n {table.getHeaderGroups().map(headerGroup => (\n <tr key={headerGroup.id} className=\"bg-[hsl(var(--bg-elevated)/0.3)]\">\n {headerGroup.headers.map((header, colIdx) => {\n const canSort = header.column.getCanSort()\n const sorted = header.column.getIsSorted()\n return (\n <th\n key={header.id}\n className={cn(\n DENSITY_CLASSES[density],\n 'text-left text-[11px] font-semibold uppercase tracking-wider',\n 'text-[hsl(var(--text-tertiary))] select-none whitespace-nowrap',\n 'border-b border-[hsl(var(--border-subtle)/0.3)]',\n stickyFirstColumn && colIdx === 0 &&\n 'sticky left-0 z-10 bg-[hsl(var(--bg-elevated)/0.8)] backdrop-blur-sm',\n )}\n >\n <div className=\"flex items-center gap-1.5\">\n {canSort ? (\n <button\n onClick={header.column.getToggleSortingHandler()}\n className=\"flex items-center gap-1 hover:text-[hsl(var(--text-secondary))] transition-colors\"\n >\n {header.isPlaceholder\n ? null\n : flexRender(header.column.columnDef.header, header.getContext())}\n {sorted === 'asc' ? (\n <ChevronUp className=\"h-3.5 w-3.5 text-[hsl(var(--brand-primary))]\" />\n ) : sorted === 'desc' ? (\n <ChevronDown className=\"h-3.5 w-3.5 text-[hsl(var(--brand-primary))]\" />\n ) : (\n <ChevronsUpDown className=\"h-3 w-3 opacity-40\" />\n )}\n </button>\n ) : (\n header.isPlaceholder\n ? null\n : flexRender(header.column.columnDef.header, header.getContext())\n )}\n {header.column.getCanFilter() && (\n <ColumnFilterPopover column={header.column} table={table} />\n )}\n </div>\n </th>\n )\n })}\n </tr>\n ))}\n </thead>\n <tbody>\n <AnimatePresence mode=\"popLayout\">\n {table.getRowModel().rows.length === 0 ? (\n <tr>\n <td colSpan={columns.length} className=\"p-0\">\n {emptyStateProps ? (\n <EmptyState\n icon={emptyStateProps.icon}\n title={emptyStateProps.title}\n description={emptyStateProps.description}\n className=\"border-0 rounded-none\"\n />\n ) : (\n <EmptyState\n icon={Search}\n title=\"No results\"\n description=\"No rows match your search or filter criteria.\"\n className=\"border-0 rounded-none\"\n />\n )}\n </td>\n </tr>\n ) : (\n table.getRowModel().rows.map((row, i) => (\n <motion.tr\n key={row.id}\n custom={i}\n variants={prefersReducedMotion ? undefined : rowVariants}\n initial={prefersReducedMotion ? undefined : 'hidden'}\n animate={prefersReducedMotion ? undefined : 'visible'}\n exit={prefersReducedMotion ? undefined : { opacity: 0 }}\n onClick={onRowClick ? () => onRowClick(row.original) : undefined}\n className={cn(\n 'border-b border-[hsl(var(--border-subtle)/0.3)]',\n 'transition-colors',\n onRowClick && 'cursor-pointer hover:bg-[hsl(var(--bg-elevated)/0.5)]',\n )}\n >\n {row.getVisibleCells().map((cell, colIdx) => (\n <td\n key={cell.id}\n className={cn(\n DENSITY_CLASSES[density],\n 'text-[hsl(var(--text-primary))]',\n stickyFirstColumn && colIdx === 0 &&\n 'sticky left-0 z-10 bg-[hsl(var(--bg-surface)/0.9)] backdrop-blur-sm',\n )}\n >\n {flexRender(cell.column.columnDef.cell, cell.getContext())}\n </td>\n ))}\n </motion.tr>\n ))\n )}\n </AnimatePresence>\n </tbody>\n </table>\n </div>\n\n {/* Pagination footer */}\n {totalRows > 0 && (\n <div className=\"flex flex-wrap items-center justify-between gap-3 px-4 py-3\n border-t border-[hsl(var(--border-subtle)/0.3)]\">\n <span className=\"text-[12px] text-[hsl(var(--text-tertiary))] tabular-nums\">\n Showing {startRow}&ndash;{endRow} of {totalRows}\n </span>\n\n <div className=\"flex items-center gap-2\">\n <select\n value={pageSize}\n onChange={e => table.setPageSize(Number(e.target.value))}\n className=\"rounded-md border border-[hsl(var(--border-subtle))]\n bg-[hsl(var(--bg-surface))] px-2 py-1 text-[12px]\n text-[hsl(var(--text-secondary))] outline-none\n focus:border-[hsl(var(--brand-primary))] transition-colors\"\n >\n {PAGE_SIZES.map(size => (\n <option key={size} value={size}>{size} / page</option>\n ))}\n </select>\n\n <div className=\"flex items-center gap-1\">\n <PaginationButton\n onClick={() => table.setPageIndex(0)}\n disabled={!table.getCanPreviousPage()}\n >\n First\n </PaginationButton>\n <PaginationButton\n onClick={() => table.previousPage()}\n disabled={!table.getCanPreviousPage()}\n >\n Prev\n </PaginationButton>\n\n {generatePageNumbers(pageIndex, pageCount).map((p, idx) =>\n p === -1 ? (\n <span key={`ellipsis-${idx}`} className=\"px-1 text-[hsl(var(--text-tertiary))]\">\n ...\n </span>\n ) : (\n <PaginationButton\n key={p}\n onClick={() => table.setPageIndex(p)}\n active={p === pageIndex}\n >\n {p + 1}\n </PaginationButton>\n )\n )}\n\n <PaginationButton\n onClick={() => table.nextPage()}\n disabled={!table.getCanNextPage()}\n >\n Next\n </PaginationButton>\n <PaginationButton\n onClick={() => table.setPageIndex(pageCount - 1)}\n disabled={!table.getCanNextPage()}\n >\n Last\n </PaginationButton>\n </div>\n </div>\n </div>\n )}\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Pagination button\n// ---------------------------------------------------------------------------\n\nfunction PaginationButton({ children, onClick, disabled, active }: {\n children: React.ReactNode\n onClick: () => void\n disabled?: boolean\n active?: boolean\n}) {\n return (\n <button\n onClick={onClick}\n disabled={disabled}\n className={cn(\n 'rounded-md px-2 py-1 text-[12px] font-medium transition-colors tabular-nums',\n active\n ? 'bg-[hsl(var(--brand-primary)/0.2)] text-[hsl(var(--brand-primary))]'\n : 'text-[hsl(var(--text-secondary))] hover:bg-[hsl(var(--bg-elevated)/0.5)] hover:text-[hsl(var(--text-primary))]',\n disabled && 'opacity-40 pointer-events-none',\n )}\n >\n {children}\n </button>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Page number generation\n// ---------------------------------------------------------------------------\n\nfunction generatePageNumbers(current: number, total: number): number[] {\n if (total <= 7) return Array.from({ length: total }, (_, i) => i)\n const pages: number[] = []\n const addPage = (p: number) => { if (!pages.includes(p)) pages.push(p) }\n addPage(0)\n for (let i = Math.max(1, current - 1); i <= Math.min(total - 2, current + 1); i++) addPage(i)\n addPage(total - 1)\n const result: number[] = []\n for (let i = 0; i < pages.length; i++) {\n if (i > 0 && pages[i]! - pages[i - 1]! > 1) result.push(-1)\n result.push(pages[i]!)\n }\n return result\n}\n\n// Re-export TruncatedText for convenience (used often with DataTable)\nexport { TruncatedText }\n","'use client'\n\nimport { useCallback, useRef, type KeyboardEvent } from 'react'\nimport { motion, useReducedMotion } from 'framer-motion'\nimport type { LucideIcon } from 'lucide-react'\nimport { cn } from '../utils'\n\n/** A single tab definition. */\nexport interface Tab {\n /** Unique value for this tab. */\n value: string\n /** Display label. */\n label: string\n /** Optional icon component. */\n icon?: LucideIcon\n /** Whether this tab is disabled. */\n disabled?: boolean\n}\n\nexport interface TabsProps {\n /** Array of tab definitions. */\n tabs: Tab[]\n /** Currently selected tab value. */\n value: string\n /** Callback when a tab is selected. */\n onChange: (value: string) => void\n /** Visual variant. */\n variant?: 'underline' | 'pills' | 'enclosed'\n /** Size preset. */\n size?: 'sm' | 'md'\n /** Additional class name for the root element. */\n className?: string\n}\n\nconst sizeClasses = {\n sm: 'text-xs px-3 py-1.5 gap-1.5',\n md: 'text-sm px-4 py-2 gap-2',\n} as const\n\n/**\n * @description Accessible tabbed interface with three visual variants.\n * Uses Framer Motion layoutId for animated indicator sliding between tabs.\n * Supports keyboard navigation (arrow keys) and ARIA roles.\n */\nexport function Tabs({\n tabs,\n value,\n onChange,\n variant = 'underline',\n size = 'md',\n className,\n}: TabsProps) {\n const prefersReducedMotion = useReducedMotion()\n const tabListRef = useRef<HTMLDivElement>(null)\n\n const enabledTabs = tabs.filter((t) => !t.disabled)\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent<HTMLDivElement>) => {\n const currentIdx = enabledTabs.findIndex((t) => t.value === value)\n if (currentIdx === -1) return\n\n let nextIdx: number | null = null\n\n if (e.key === 'ArrowRight' || e.key === 'ArrowDown') {\n e.preventDefault()\n nextIdx = (currentIdx + 1) % enabledTabs.length\n } else if (e.key === 'ArrowLeft' || e.key === 'ArrowUp') {\n e.preventDefault()\n nextIdx = (currentIdx - 1 + enabledTabs.length) % enabledTabs.length\n } else if (e.key === 'Home') {\n e.preventDefault()\n nextIdx = 0\n } else if (e.key === 'End') {\n e.preventDefault()\n nextIdx = enabledTabs.length - 1\n }\n\n if (nextIdx !== null) {\n onChange(enabledTabs[nextIdx].value)\n const buttons = tabListRef.current?.querySelectorAll<HTMLButtonElement>('[role=\"tab\"]:not([disabled])')\n buttons?.[nextIdx]?.focus()\n }\n },\n [enabledTabs, value, onChange],\n )\n\n const listCls = cn(\n 'inline-flex items-center',\n variant === 'underline' && 'border-b border-[hsl(var(--border-subtle))] gap-0',\n variant === 'pills' && 'gap-1 p-1 rounded-xl bg-[hsl(var(--bg-surface))]',\n variant === 'enclosed' && 'gap-0 border-b border-[hsl(var(--border-subtle))]',\n className,\n )\n\n const layoutId = `tabs-indicator-${variant}`\n\n return (\n <div\n ref={tabListRef}\n role=\"tablist\"\n aria-orientation=\"horizontal\"\n onKeyDown={handleKeyDown}\n className={listCls}\n >\n {tabs.map((tab) => {\n const isActive = tab.value === value\n const Icon = tab.icon\n\n const buttonCls = cn(\n 'relative inline-flex items-center justify-center font-medium transition-colors duration-150',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[hsl(var(--brand-primary))] focus-visible:ring-offset-1 focus-visible:ring-offset-[hsl(var(--bg-base))]',\n 'disabled:pointer-events-none disabled:opacity-40',\n 'cursor-pointer select-none whitespace-nowrap',\n sizeClasses[size],\n // variant-specific active/inactive\n variant === 'underline' && [\n isActive\n ? 'text-[hsl(var(--text-primary))]'\n : 'text-[hsl(var(--text-tertiary))] hover:text-[hsl(var(--text-secondary))]',\n ],\n variant === 'pills' && [\n isActive\n ? 'text-[hsl(var(--text-primary))]'\n : 'text-[hsl(var(--text-tertiary))] hover:text-[hsl(var(--text-secondary))] hover:bg-[hsl(var(--bg-elevated)/0.5)]',\n 'rounded-lg',\n ],\n variant === 'enclosed' && [\n isActive\n ? 'text-[hsl(var(--text-primary))] bg-[hsl(var(--bg-elevated))]'\n : 'text-[hsl(var(--text-tertiary))] hover:text-[hsl(var(--text-secondary))]',\n 'rounded-t-lg',\n ],\n )\n\n return (\n <button\n key={tab.value}\n role=\"tab\"\n aria-selected={isActive}\n aria-controls={`tabpanel-${tab.value}`}\n tabIndex={isActive ? 0 : -1}\n disabled={tab.disabled}\n onClick={() => onChange(tab.value)}\n className={buttonCls}\n >\n {Icon && <Icon className={size === 'sm' ? 'h-3.5 w-3.5' : 'h-4 w-4'} />}\n {tab.label}\n\n {/* Animated indicator */}\n {isActive && variant === 'underline' && (\n <motion.div\n layoutId={layoutId}\n className=\"absolute bottom-0 left-0 right-0 h-0.5 bg-[hsl(var(--brand-primary))] rounded-full\"\n transition={prefersReducedMotion ? { duration: 0 } : { type: 'spring', stiffness: 500, damping: 35 }}\n />\n )}\n {isActive && variant === 'pills' && (\n <motion.div\n layoutId={layoutId}\n className=\"absolute inset-0 rounded-lg bg-[hsl(var(--bg-elevated))] -z-10\"\n transition={prefersReducedMotion ? { duration: 0 } : { type: 'spring', stiffness: 500, damping: 35 }}\n />\n )}\n {isActive && variant === 'enclosed' && (\n <motion.div\n layoutId={layoutId}\n className=\"absolute bottom-0 left-0 right-0 h-0.5 bg-[hsl(var(--brand-primary))] rounded-full\"\n transition={prefersReducedMotion ? { duration: 0 } : { type: 'spring', stiffness: 500, damping: 35 }}\n />\n )}\n </button>\n )\n })}\n </div>\n )\n}\n","'use client'\n\nimport { type ReactNode } from 'react'\nimport * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu'\nimport { motion, AnimatePresence, useReducedMotion } from 'framer-motion'\nimport type { LucideIcon } from 'lucide-react'\nimport { cn } from '../utils'\n\n/** A single menu item definition. */\nexport interface MenuItem {\n /** Display label. */\n label: string\n /** Optional icon component. */\n icon?: LucideIcon\n /** Callback when item is clicked. */\n onClick: () => void\n /** Visual variant — danger for destructive actions. */\n variant?: 'default' | 'danger'\n /** Whether this item is disabled. */\n disabled?: boolean\n}\n\nexport interface DropdownMenuProps {\n /** Trigger element that opens the menu. */\n trigger: ReactNode\n /** Array of menu item definitions. */\n items: MenuItem[]\n /** Alignment of the menu relative to the trigger. */\n align?: 'start' | 'center' | 'end'\n /** Additional class name for the content container. */\n className?: string\n}\n\nconst contentVariants = {\n hidden: { opacity: 0, scale: 0.95, y: -4 },\n visible: { opacity: 1, scale: 1, y: 0 },\n exit: { opacity: 0, scale: 0.95, y: -4 },\n}\n\n/**\n * @description A context/action dropdown menu built on Radix DropdownMenu.\n * Features Framer Motion entry/exit animations, keyboard accessibility,\n * and a danger variant for destructive actions.\n */\nexport function DropdownMenu({ trigger, items, align = 'end', className }: DropdownMenuProps) {\n const prefersReducedMotion = useReducedMotion()\n\n return (\n <DropdownMenuPrimitive.Root>\n <DropdownMenuPrimitive.Trigger asChild>{trigger}</DropdownMenuPrimitive.Trigger>\n\n <AnimatePresence>\n <DropdownMenuPrimitive.Portal>\n <DropdownMenuPrimitive.Content\n align={align}\n sideOffset={6}\n asChild\n >\n <motion.div\n initial=\"hidden\"\n animate=\"visible\"\n exit=\"exit\"\n variants={contentVariants}\n transition={prefersReducedMotion ? { duration: 0 } : { duration: 0.15, ease: [0.16, 1, 0.3, 1] }}\n className={cn(\n 'z-50 min-w-[160px] overflow-hidden rounded-xl p-1',\n 'border border-[hsl(var(--border-default))]',\n 'bg-[hsl(var(--bg-elevated))] shadow-xl',\n 'focus:outline-none',\n className,\n )}\n >\n {items.map((item, i) => {\n const Icon = item.icon\n const isDanger = item.variant === 'danger'\n\n return (\n <DropdownMenuPrimitive.Item\n key={i}\n disabled={item.disabled}\n onSelect={item.onClick}\n className={cn(\n 'relative flex items-center gap-2.5 px-3 py-2 text-sm rounded-lg',\n 'outline-none cursor-pointer select-none transition-colors duration-100',\n 'data-[disabled]:pointer-events-none data-[disabled]:opacity-40',\n isDanger\n ? 'text-[hsl(var(--status-critical))] data-[highlighted]:bg-[hsl(var(--status-critical)/0.1)]'\n : 'text-[hsl(var(--text-primary))] data-[highlighted]:bg-[hsl(var(--bg-overlay))]',\n )}\n >\n {Icon && (\n <Icon\n className={cn(\n 'h-4 w-4 shrink-0',\n isDanger\n ? 'text-[hsl(var(--status-critical))]'\n : 'text-[hsl(var(--text-secondary))]',\n )}\n />\n )}\n {item.label}\n </DropdownMenuPrimitive.Item>\n )\n })}\n </motion.div>\n </DropdownMenuPrimitive.Content>\n </DropdownMenuPrimitive.Portal>\n </AnimatePresence>\n </DropdownMenuPrimitive.Root>\n )\n}\n","'use client'\n\nimport { useEffect, useCallback, useRef, type ReactNode } from 'react'\nimport { motion, AnimatePresence, useReducedMotion } from 'framer-motion'\nimport { X } from 'lucide-react'\nimport { cn } from '../utils'\n\nexport interface SheetProps {\n /** Whether the sheet is open. */\n open: boolean\n /** Callback to close the sheet. */\n onClose: () => void\n /** Edge from which the sheet slides in. */\n side?: 'right' | 'left' | 'top' | 'bottom'\n /** Title displayed in the sheet header. */\n title?: string\n /** Description text below the title. */\n description?: string\n /** Width class for left/right sheets, height class for top/bottom. */\n width?: string\n /** Sheet content. */\n children: ReactNode\n /** Additional class name for the panel. */\n className?: string\n}\n\nconst slideVariants = {\n right: { initial: { x: '100%' }, animate: { x: 0 }, exit: { x: '100%' } },\n left: { initial: { x: '-100%' }, animate: { x: 0 }, exit: { x: '-100%' } },\n top: { initial: { y: '-100%' }, animate: { y: 0 }, exit: { y: '-100%' } },\n bottom: { initial: { y: '100%' }, animate: { y: 0 }, exit: { y: '100%' } },\n}\n\nconst positionClasses = {\n right: 'inset-y-0 right-0',\n left: 'inset-y-0 left-0',\n top: 'inset-x-0 top-0',\n bottom: 'inset-x-0 bottom-0',\n}\n\n/**\n * @description A slide-over panel (drawer) from any edge of the screen.\n * Features backdrop overlay, spring animation, Escape to close, backdrop click to close,\n * and focus trapping within the panel.\n */\nexport function Sheet({\n open,\n onClose,\n side = 'right',\n title,\n description,\n width = 'max-w-md',\n children,\n className,\n}: SheetProps) {\n const prefersReducedMotion = useReducedMotion()\n const panelRef = useRef<HTMLDivElement>(null)\n\n // Close on Escape\n const handleKeyDown = useCallback(\n (e: KeyboardEvent) => {\n if (e.key === 'Escape') onClose()\n },\n [onClose],\n )\n\n useEffect(() => {\n if (open) {\n document.addEventListener('keydown', handleKeyDown)\n // Prevent body scroll\n const prevOverflow = document.body.style.overflow\n document.body.style.overflow = 'hidden'\n return () => {\n document.removeEventListener('keydown', handleKeyDown)\n document.body.style.overflow = prevOverflow\n }\n }\n }, [open, handleKeyDown])\n\n // Focus the panel when opened\n useEffect(() => {\n if (open) {\n requestAnimationFrame(() => {\n panelRef.current?.focus()\n })\n }\n }, [open])\n\n const isHorizontal = side === 'left' || side === 'right'\n const variants = slideVariants[side]\n\n return (\n <AnimatePresence>\n {open && (\n <div className=\"fixed inset-0 z-50\">\n {/* Backdrop */}\n <motion.div\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={prefersReducedMotion ? { duration: 0 } : { duration: 0.2 }}\n className=\"absolute inset-0 bg-[hsl(var(--bg-base)/0.6)] backdrop-blur-sm\"\n onClick={onClose}\n />\n\n {/* Panel */}\n <motion.div\n ref={panelRef}\n tabIndex={-1}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={title}\n initial={variants.initial}\n animate={variants.animate}\n exit={variants.exit}\n transition={\n prefersReducedMotion\n ? { duration: 0 }\n : { type: 'spring', stiffness: 400, damping: 35 }\n }\n className={cn(\n 'absolute flex flex-col',\n 'bg-[hsl(var(--bg-surface))] border-[hsl(var(--border-default))]',\n 'shadow-2xl focus:outline-none',\n positionClasses[side],\n isHorizontal\n ? cn('w-full h-full', width, side === 'right' ? 'border-l' : 'border-r')\n : cn('h-auto w-full', side === 'top' ? 'border-b' : 'border-t'),\n className,\n )}\n >\n {/* Header */}\n {(title || description) && (\n <div className=\"flex items-start justify-between gap-4 px-6 pt-6 pb-4 border-b border-[hsl(var(--border-subtle))]\">\n <div className=\"min-w-0\">\n {title && (\n <h2 className=\"text-base font-semibold text-[hsl(var(--text-primary))]\">{title}</h2>\n )}\n {description && (\n <p className=\"mt-1 text-sm text-[hsl(var(--text-secondary))]\">{description}</p>\n )}\n </div>\n <button\n onClick={onClose}\n className={cn(\n 'shrink-0 p-1.5 rounded-lg transition-colors',\n 'text-[hsl(var(--text-tertiary))] hover:text-[hsl(var(--text-primary))]',\n 'hover:bg-[hsl(var(--bg-elevated))]',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[hsl(var(--brand-primary))]',\n )}\n >\n <X className=\"h-4 w-4\" />\n </button>\n </div>\n )}\n\n {/* Content */}\n <div className=\"flex-1 overflow-y-auto px-6 py-4\">{children}</div>\n </motion.div>\n </div>\n )}\n </AnimatePresence>\n )\n}\n","'use client'\n\nimport { motion, useReducedMotion } from 'framer-motion'\nimport { cn } from '../utils'\n\nexport interface ProgressProps {\n /** Current progress value (0-100 by default). */\n value: number\n /** Maximum value. */\n max?: number\n /** Optional label displayed above the bar. */\n label?: string\n /** Show the current percentage value. */\n showValue?: boolean\n /** Color variant. */\n variant?: 'default' | 'success' | 'warning' | 'danger'\n /** Height preset. */\n size?: 'sm' | 'md' | 'lg'\n /** Animate the fill width on value changes. */\n animated?: boolean\n /** Show an indeterminate shimmer animation (ignores value). */\n indeterminate?: boolean\n /** Additional class name for the root element. */\n className?: string\n}\n\nconst variantColors: Record<NonNullable<ProgressProps['variant']>, string> = {\n default: 'bg-[hsl(var(--brand-primary))]',\n success: 'bg-[hsl(var(--status-ok))]',\n warning: 'bg-[hsl(var(--status-warning))]',\n danger: 'bg-[hsl(var(--status-critical))]',\n}\n\nconst sizeClasses: Record<NonNullable<ProgressProps['size']>, string> = {\n sm: 'h-1.5',\n md: 'h-2.5',\n lg: 'h-4',\n}\n\n/**\n * @description A progress bar with optional label, animated fill, and indeterminate mode.\n * Supports multiple color variants and size presets.\n */\nexport function Progress({\n value,\n max = 100,\n label,\n showValue = false,\n variant = 'default',\n size = 'md',\n animated = true,\n indeterminate = false,\n className,\n}: ProgressProps) {\n const prefersReducedMotion = useReducedMotion()\n const pct = Math.min(100, Math.max(0, (value / max) * 100))\n\n return (\n <div className={cn('w-full', className)}>\n {/* Label + value row */}\n {(label || showValue) && (\n <div className=\"flex items-center justify-between mb-1.5\">\n {label && (\n <span className=\"text-xs font-medium text-[hsl(var(--text-secondary))]\">{label}</span>\n )}\n {showValue && !indeterminate && (\n <span className=\"text-xs font-medium tabular-nums text-[hsl(var(--text-secondary))]\">\n {Math.round(pct)}%\n </span>\n )}\n </div>\n )}\n\n {/* Track */}\n <div\n role=\"progressbar\"\n aria-valuenow={indeterminate ? undefined : pct}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-label={label}\n className={cn(\n 'w-full overflow-hidden rounded-full bg-[hsl(var(--bg-overlay))]',\n sizeClasses[size],\n )}\n >\n {indeterminate ? (\n <div\n className={cn(\n 'h-full w-1/3 rounded-full',\n variantColors[variant],\n prefersReducedMotion ? '' : 'animate-shimmer',\n )}\n style={\n prefersReducedMotion\n ? { width: '33%' }\n : {\n animation: 'indeterminate-slide 1.5s ease-in-out infinite',\n }\n }\n />\n ) : animated && !prefersReducedMotion ? (\n <motion.div\n className={cn('h-full rounded-full', variantColors[variant])}\n initial={{ width: 0 }}\n animate={{ width: `${pct}%` }}\n transition={{ type: 'spring', stiffness: 100, damping: 20 }}\n />\n ) : (\n <div\n className={cn('h-full rounded-full transition-[width] duration-300', variantColors[variant])}\n style={{ width: `${pct}%` }}\n />\n )}\n </div>\n\n {/* Indeterminate keyframes injected as inline style */}\n {indeterminate && !prefersReducedMotion && (\n <style>{`\n @keyframes indeterminate-slide {\n 0% { transform: translateX(-100%); }\n 50% { transform: translateX(200%); }\n 100% { transform: translateX(-100%); }\n }\n `}</style>\n )}\n </div>\n )\n}\n","'use client'\n\nimport { useState } from 'react'\nimport { cn } from '../utils'\n\nexport interface AvatarProps {\n /** Image source URL. */\n src?: string\n /** Alt text for the image; used for accessibility. */\n alt: string\n /** Initials fallback (e.g. \"JD\"). Derived from alt if not provided. */\n fallback?: string\n /** Size preset. */\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n /** Optional status dot overlay. */\n status?: 'online' | 'offline' | 'busy' | 'away'\n /** Additional class name for the root element. */\n className?: string\n}\n\nconst sizeClasses: Record<NonNullable<AvatarProps['size']>, { root: string; text: string; dot: string }> = {\n xs: { root: 'h-6 w-6', text: 'text-[10px]', dot: 'h-2 w-2 -bottom-0 -right-0 ring-1' },\n sm: { root: 'h-8 w-8', text: 'text-xs', dot: 'h-2.5 w-2.5 -bottom-0.5 -right-0.5 ring-[1.5px]' },\n md: { root: 'h-10 w-10', text: 'text-sm', dot: 'h-3 w-3 -bottom-0.5 -right-0.5 ring-2' },\n lg: { root: 'h-12 w-12', text: 'text-base', dot: 'h-3.5 w-3.5 -bottom-0.5 -right-0.5 ring-2' },\n xl: { root: 'h-16 w-16', text: 'text-lg', dot: 'h-4 w-4 -bottom-0.5 -right-0.5 ring-2' },\n}\n\nconst statusColors: Record<NonNullable<AvatarProps['status']>, string> = {\n online: 'bg-[hsl(var(--status-ok))]',\n offline: 'bg-[hsl(var(--text-disabled))]',\n busy: 'bg-[hsl(var(--status-critical))]',\n away: 'bg-[hsl(var(--status-warning))]',\n}\n\n/**\n * Derive initials from a name string (max 2 characters).\n */\nfunction deriveInitials(name: string): string {\n const parts = name.trim().split(/\\s+/)\n if (parts.length >= 2) {\n return (parts[0][0] + parts[parts.length - 1][0]).toUpperCase()\n }\n return name.slice(0, 2).toUpperCase()\n}\n\n/**\n * @description User/entity avatar with image support and initials fallback.\n * Optional status dot overlay for presence indication.\n */\nexport function Avatar({\n src,\n alt,\n fallback,\n size = 'md',\n status,\n className,\n}: AvatarProps) {\n const [imgError, setImgError] = useState(false)\n const s = sizeClasses[size]\n const initials = fallback ?? deriveInitials(alt)\n const showImage = src && !imgError\n\n return (\n <div className={cn('relative inline-flex shrink-0', className)}>\n <div\n className={cn(\n s.root,\n 'rounded-full overflow-hidden',\n 'flex items-center justify-center',\n !showImage && 'bg-[hsl(var(--bg-overlay))]',\n )}\n >\n {showImage ? (\n <img\n src={src}\n alt={alt}\n onError={() => setImgError(true)}\n className=\"h-full w-full object-cover\"\n />\n ) : (\n <span\n className={cn(\n s.text,\n 'font-semibold text-[hsl(var(--text-secondary))] select-none',\n )}\n >\n {initials}\n </span>\n )}\n </div>\n\n {/* Status dot */}\n {status && (\n <span\n className={cn(\n 'absolute rounded-full ring-[hsl(var(--bg-surface))]',\n s.dot,\n statusColors[status],\n )}\n aria-label={status}\n />\n )}\n </div>\n )\n}\n","'use client'\n\nimport { type ReactNode } from 'react'\nimport * as PopoverPrimitive from '@radix-ui/react-popover'\nimport { motion, AnimatePresence, useReducedMotion } from 'framer-motion'\nimport { cn } from '../utils'\n\nexport interface PopoverProps {\n /** Trigger element that opens the popover. */\n trigger: ReactNode\n /** Popover content. */\n children: ReactNode\n /** Side of the trigger to display the popover. */\n side?: 'top' | 'right' | 'bottom' | 'left'\n /** Alignment of the popover relative to the trigger. */\n align?: 'start' | 'center' | 'end'\n /** Additional class name for the content container. */\n className?: string\n}\n\nconst contentVariants = {\n hidden: { opacity: 0, scale: 0.96, y: -2 },\n visible: { opacity: 1, scale: 1, y: 0 },\n exit: { opacity: 0, scale: 0.96, y: -2 },\n}\n\n/**\n * @description A popover wrapper built on Radix Popover with Framer Motion entry animation.\n * Closes on outside click. Includes an arrow pointer.\n */\nexport function Popover({ trigger, children, side = 'bottom', align = 'center', className }: PopoverProps) {\n const prefersReducedMotion = useReducedMotion()\n\n return (\n <PopoverPrimitive.Root>\n <PopoverPrimitive.Trigger asChild>{trigger}</PopoverPrimitive.Trigger>\n\n <AnimatePresence>\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n side={side}\n align={align}\n sideOffset={8}\n asChild\n >\n <motion.div\n initial=\"hidden\"\n animate=\"visible\"\n exit=\"exit\"\n variants={contentVariants}\n transition={prefersReducedMotion ? { duration: 0 } : { duration: 0.15, ease: [0.16, 1, 0.3, 1] }}\n className={cn(\n 'z-50 rounded-xl p-4',\n 'border border-[hsl(var(--border-default))]',\n 'bg-[hsl(var(--bg-elevated))] shadow-xl',\n 'focus:outline-none',\n className,\n )}\n >\n {children}\n <PopoverPrimitive.Arrow\n className=\"fill-[hsl(var(--bg-elevated))]\"\n width={12}\n height={6}\n />\n </motion.div>\n </PopoverPrimitive.Content>\n </PopoverPrimitive.Portal>\n </AnimatePresence>\n </PopoverPrimitive.Root>\n )\n}\n","'use client'\n\nimport { useCallback, useRef, useState, type KeyboardEvent, type MouseEvent, type TouchEvent } from 'react'\nimport { cn } from '../utils'\n\nexport interface SliderProps {\n /** Current value. */\n value: number\n /** Callback when value changes. */\n onChange: (value: number) => void\n /** Minimum value. */\n min?: number\n /** Maximum value. */\n max?: number\n /** Step increment. */\n step?: number\n /** Optional label displayed above the slider. */\n label?: string\n /** Show the current value. */\n showValue?: boolean\n /** Additional class name for the root element. */\n className?: string\n}\n\n/**\n * @description A custom-styled range slider with keyboard accessibility.\n * Features a styled track, filled portion, and draggable thumb.\n * Shows current value on hover/drag via a tooltip above the thumb.\n */\nexport function Slider({\n value,\n onChange,\n min = 0,\n max = 100,\n step = 1,\n label,\n showValue = false,\n className,\n}: SliderProps) {\n const trackRef = useRef<HTMLDivElement>(null)\n const [isDragging, setIsDragging] = useState(false)\n const [isHovering, setIsHovering] = useState(false)\n\n const pct = max === min ? 0 : ((value - min) / (max - min)) * 100\n\n const clampToStep = useCallback(\n (raw: number) => {\n const clamped = Math.min(max, Math.max(min, raw))\n const stepped = Math.round((clamped - min) / step) * step + min\n // Avoid floating point issues\n return Math.min(max, Math.max(min, parseFloat(stepped.toPrecision(10))))\n },\n [min, max, step],\n )\n\n const getValueFromPosition = useCallback(\n (clientX: number) => {\n const track = trackRef.current\n if (!track) return value\n const rect = track.getBoundingClientRect()\n const ratio = Math.max(0, Math.min(1, (clientX - rect.left) / rect.width))\n return clampToStep(min + ratio * (max - min))\n },\n [min, max, value, clampToStep],\n )\n\n const handleMouseDown = useCallback(\n (e: MouseEvent) => {\n e.preventDefault()\n setIsDragging(true)\n onChange(getValueFromPosition(e.clientX))\n\n const handleMouseMove = (ev: globalThis.MouseEvent) => {\n onChange(getValueFromPosition(ev.clientX))\n }\n const handleMouseUp = () => {\n setIsDragging(false)\n document.removeEventListener('mousemove', handleMouseMove)\n document.removeEventListener('mouseup', handleMouseUp)\n }\n document.addEventListener('mousemove', handleMouseMove)\n document.addEventListener('mouseup', handleMouseUp)\n },\n [getValueFromPosition, onChange],\n )\n\n const handleTouchStart = useCallback(\n (e: TouchEvent) => {\n setIsDragging(true)\n if (e.touches[0]) {\n onChange(getValueFromPosition(e.touches[0].clientX))\n }\n\n const handleTouchMove = (ev: globalThis.TouchEvent) => {\n if (ev.touches[0]) {\n onChange(getValueFromPosition(ev.touches[0].clientX))\n }\n }\n const handleTouchEnd = () => {\n setIsDragging(false)\n document.removeEventListener('touchmove', handleTouchMove)\n document.removeEventListener('touchend', handleTouchEnd)\n }\n document.addEventListener('touchmove', handleTouchMove)\n document.addEventListener('touchend', handleTouchEnd)\n },\n [getValueFromPosition, onChange],\n )\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent) => {\n let newValue = value\n if (e.key === 'ArrowRight' || e.key === 'ArrowUp') {\n e.preventDefault()\n newValue = clampToStep(value + step)\n } else if (e.key === 'ArrowLeft' || e.key === 'ArrowDown') {\n e.preventDefault()\n newValue = clampToStep(value - step)\n } else if (e.key === 'Home') {\n e.preventDefault()\n newValue = min\n } else if (e.key === 'End') {\n e.preventDefault()\n newValue = max\n }\n if (newValue !== value) onChange(newValue)\n },\n [value, min, max, step, clampToStep, onChange],\n )\n\n const showTooltip = isDragging || isHovering\n\n return (\n <div className={cn('w-full', className)}>\n {/* Label + value row */}\n {(label || showValue) && (\n <div className=\"flex items-center justify-between mb-2\">\n {label && (\n <span className=\"text-xs font-medium text-[hsl(var(--text-secondary))]\">{label}</span>\n )}\n {showValue && (\n <span className=\"text-xs font-medium tabular-nums text-[hsl(var(--text-secondary))]\">\n {value}\n </span>\n )}\n </div>\n )}\n\n {/* Track */}\n <div\n ref={trackRef}\n role=\"slider\"\n aria-valuenow={value}\n aria-valuemin={min}\n aria-valuemax={max}\n aria-label={label}\n tabIndex={0}\n onMouseDown={handleMouseDown}\n onTouchStart={handleTouchStart}\n onKeyDown={handleKeyDown}\n onMouseEnter={() => setIsHovering(true)}\n onMouseLeave={() => setIsHovering(false)}\n className={cn(\n 'relative h-6 w-full cursor-pointer select-none',\n 'focus-visible:outline-none',\n 'group',\n )}\n >\n {/* Track background */}\n <div className=\"absolute top-1/2 -translate-y-1/2 w-full h-2 rounded-full bg-[hsl(var(--bg-overlay))]\">\n {/* Filled portion */}\n <div\n className=\"absolute inset-y-0 left-0 rounded-full bg-[hsl(var(--brand-primary))]\"\n style={{ width: `${pct}%` }}\n />\n </div>\n\n {/* Thumb */}\n <div\n className={cn(\n 'absolute top-1/2 -translate-y-1/2 -translate-x-1/2',\n 'h-5 w-5 rounded-full',\n 'bg-[hsl(var(--text-on-brand))] border-2 border-[hsl(var(--brand-primary))]',\n 'shadow-md transition-transform duration-100',\n isDragging && 'scale-110',\n 'group-focus-visible:ring-2 group-focus-visible:ring-[hsl(var(--brand-primary))] group-focus-visible:ring-offset-2 group-focus-visible:ring-offset-[hsl(var(--bg-base))]',\n )}\n style={{ left: `${pct}%` }}\n >\n {/* Value tooltip */}\n {showTooltip && (\n <div\n className={cn(\n 'absolute -top-8 left-1/2 -translate-x-1/2',\n 'px-2 py-0.5 rounded-md text-xs font-medium tabular-nums',\n 'bg-[hsl(var(--bg-elevated))] text-[hsl(var(--text-primary))]',\n 'border border-[hsl(var(--border-subtle))] shadow-sm',\n 'pointer-events-none whitespace-nowrap',\n )}\n >\n {value}\n </div>\n )}\n </div>\n </div>\n </div>\n )\n}\n","'use client'\n\nimport { forwardRef, type HTMLAttributes, type ReactNode } from 'react'\nimport { cn } from '../utils'\n\n/* ── Variant & padding maps ───────────────────────────────────────────────── */\n\nconst variantClasses = {\n default:\n 'bg-[hsl(var(--bg-surface))] border border-[hsl(var(--border-subtle))] shadow-sm',\n elevated:\n 'bg-[hsl(var(--bg-elevated))] border border-[hsl(var(--border-default))] shadow-lg',\n outlined:\n 'bg-transparent border border-[hsl(var(--border-default))]',\n interactive:\n 'bg-[hsl(var(--bg-surface))] border border-[hsl(var(--border-subtle))] shadow-sm hover:bg-[hsl(var(--bg-elevated))] hover:border-[hsl(var(--border-default))] hover:shadow-md transition-all duration-150 cursor-pointer',\n} as const\n\nconst paddingClasses = {\n none: '',\n sm: 'p-3',\n md: 'p-5',\n lg: 'p-6',\n} as const\n\nexport interface CardProps extends HTMLAttributes<HTMLDivElement> {\n /** Visual variant. */\n variant?: keyof typeof variantClasses\n /** Padding preset. */\n padding?: keyof typeof paddingClasses\n /** Card content. */\n children: ReactNode\n}\n\n/**\n * @description A styled card container with variant and padding presets.\n * Use with CardHeader, CardTitle, CardDescription, CardContent, and CardFooter\n * subcomponents for semantic structure.\n */\nconst Card = forwardRef<HTMLDivElement, CardProps>(\n ({ variant = 'default', padding = 'md', className, children, ...props }, ref) => (\n <div\n ref={ref}\n className={cn('rounded-2xl', variantClasses[variant], paddingClasses[padding], className)}\n {...props}\n >\n {children}\n </div>\n ),\n)\nCard.displayName = 'Card'\n\n/* ── Subcomponents ────────────────────────────────────────────────────────── */\n\nexport interface CardSubProps extends HTMLAttributes<HTMLDivElement> {\n children: ReactNode\n}\n\n/** Header section of a Card (flex row for title + actions). */\nconst CardHeader = forwardRef<HTMLDivElement, CardSubProps>(\n ({ className, children, ...props }, ref) => (\n <div\n ref={ref}\n className={cn('flex items-start justify-between gap-4', className)}\n {...props}\n >\n {children}\n </div>\n ),\n)\nCardHeader.displayName = 'CardHeader'\n\n/** Title within a CardHeader. */\nconst CardTitle = forwardRef<HTMLHeadingElement, HTMLAttributes<HTMLHeadingElement> & { children: ReactNode }>(\n ({ className, children, ...props }, ref) => (\n <h3\n ref={ref}\n className={cn('text-base font-semibold text-[hsl(var(--text-primary))]', className)}\n {...props}\n >\n {children}\n </h3>\n ),\n)\nCardTitle.displayName = 'CardTitle'\n\n/** Description text within a CardHeader. */\nconst CardDescription = forwardRef<HTMLParagraphElement, HTMLAttributes<HTMLParagraphElement> & { children: ReactNode }>(\n ({ className, children, ...props }, ref) => (\n <p\n ref={ref}\n className={cn('text-sm text-[hsl(var(--text-secondary))]', className)}\n {...props}\n >\n {children}\n </p>\n ),\n)\nCardDescription.displayName = 'CardDescription'\n\n/** Main content area of a Card. */\nconst CardContent = forwardRef<HTMLDivElement, CardSubProps>(\n ({ className, children, ...props }, ref) => (\n <div ref={ref} className={cn('mt-4', className)} {...props}>\n {children}\n </div>\n ),\n)\nCardContent.displayName = 'CardContent'\n\n/** Footer section of a Card (typically for actions). */\nconst CardFooter = forwardRef<HTMLDivElement, CardSubProps>(\n ({ className, children, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n 'mt-4 pt-4 flex items-center gap-3 border-t border-[hsl(var(--border-subtle))]',\n className,\n )}\n {...props}\n >\n {children}\n </div>\n ),\n)\nCardFooter.displayName = 'CardFooter'\n\nexport { Card, CardHeader, CardTitle, CardDescription, CardContent, CardFooter }\n","'use client'\n\nimport { useCallback, useRef, type KeyboardEvent } from 'react'\nimport { motion, useReducedMotion } from 'framer-motion'\nimport { cn } from '../utils'\n\n/** A single radio option definition. */\nexport interface RadioOption {\n /** Unique value. */\n value: string\n /** Display label. */\n label: string\n /** Optional description text below the label. */\n description?: string\n /** Whether this option is disabled. */\n disabled?: boolean\n}\n\nexport interface RadioGroupProps {\n /** Array of radio option definitions. */\n options: RadioOption[]\n /** Currently selected value. */\n value: string\n /** Callback when selection changes. */\n onChange: (value: string) => void\n /** Layout direction. */\n orientation?: 'horizontal' | 'vertical'\n /** Additional class name for the root element. */\n className?: string\n}\n\n/**\n * @description A custom-styled radio button group with Framer Motion selection indicator.\n * Supports keyboard navigation (arrow keys, Home, End) and ARIA roles.\n */\nexport function RadioGroup({\n options,\n value,\n onChange,\n orientation = 'vertical',\n className,\n}: RadioGroupProps) {\n const prefersReducedMotion = useReducedMotion()\n const groupRef = useRef<HTMLDivElement>(null)\n\n const enabledOptions = options.filter((o) => !o.disabled)\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent<HTMLDivElement>) => {\n const currentIdx = enabledOptions.findIndex((o) => o.value === value)\n if (currentIdx === -1) return\n\n const isVertical = orientation === 'vertical'\n const nextKey = isVertical ? 'ArrowDown' : 'ArrowRight'\n const prevKey = isVertical ? 'ArrowUp' : 'ArrowLeft'\n\n let nextIdx: number | null = null\n\n if (e.key === nextKey) {\n e.preventDefault()\n nextIdx = (currentIdx + 1) % enabledOptions.length\n } else if (e.key === prevKey) {\n e.preventDefault()\n nextIdx = (currentIdx - 1 + enabledOptions.length) % enabledOptions.length\n } else if (e.key === 'Home') {\n e.preventDefault()\n nextIdx = 0\n } else if (e.key === 'End') {\n e.preventDefault()\n nextIdx = enabledOptions.length - 1\n }\n\n if (nextIdx !== null) {\n onChange(enabledOptions[nextIdx].value)\n const radios = groupRef.current?.querySelectorAll<HTMLDivElement>('[role=\"radio\"]:not([aria-disabled=\"true\"])')\n radios?.[nextIdx]?.focus()\n }\n },\n [enabledOptions, value, onChange, orientation],\n )\n\n return (\n <div\n ref={groupRef}\n role=\"radiogroup\"\n aria-orientation={orientation}\n onKeyDown={handleKeyDown}\n className={cn(\n 'flex',\n orientation === 'vertical' ? 'flex-col gap-2' : 'flex-row flex-wrap gap-4',\n className,\n )}\n >\n {options.map((option) => {\n const isSelected = option.value === value\n\n return (\n <div\n key={option.value}\n role=\"radio\"\n aria-checked={isSelected}\n aria-disabled={option.disabled}\n tabIndex={isSelected ? 0 : -1}\n onClick={() => {\n if (!option.disabled) onChange(option.value)\n }}\n className={cn(\n 'flex items-start gap-3 cursor-pointer select-none group',\n 'focus-visible:outline-none',\n option.disabled && 'opacity-40 pointer-events-none',\n )}\n >\n {/* Radio circle */}\n <div\n className={cn(\n 'relative mt-0.5 h-[18px] w-[18px] shrink-0 rounded-full border-2 transition-colors duration-150',\n 'flex items-center justify-center',\n isSelected\n ? 'border-[hsl(var(--brand-primary))]'\n : 'border-[hsl(var(--border-strong))] group-hover:border-[hsl(var(--brand-primary))]',\n 'group-focus-visible:ring-2 group-focus-visible:ring-[hsl(var(--brand-primary))] group-focus-visible:ring-offset-2 group-focus-visible:ring-offset-[hsl(var(--bg-base))]',\n )}\n >\n {isSelected && (\n <motion.div\n layoutId=\"radio-indicator\"\n initial={prefersReducedMotion ? false : { scale: 0 }}\n animate={{ scale: 1 }}\n transition={\n prefersReducedMotion\n ? { duration: 0 }\n : { type: 'spring', stiffness: 500, damping: 30 }\n }\n className=\"h-2.5 w-2.5 rounded-full bg-[hsl(var(--brand-primary))]\"\n />\n )}\n </div>\n\n {/* Label + description */}\n <div className=\"min-w-0\">\n <span\n className={cn(\n 'text-sm font-medium',\n isSelected\n ? 'text-[hsl(var(--text-primary))]'\n : 'text-[hsl(var(--text-secondary))]',\n )}\n >\n {option.label}\n </span>\n {option.description && (\n <p className=\"mt-0.5 text-xs text-[hsl(var(--text-tertiary))]\">\n {option.description}\n </p>\n )}\n </div>\n </div>\n )\n })}\n </div>\n )\n}\n","'use client'\n\nimport { type ReactNode } from 'react'\nimport * as TooltipPrimitive from '@radix-ui/react-tooltip'\nimport { cn } from '../utils'\n\nexport interface TooltipProps {\n /** Tooltip content (can be text or ReactNode). */\n content: ReactNode\n /** Trigger element. */\n children: ReactNode\n /** Side of the trigger to display the tooltip. */\n side?: 'top' | 'right' | 'bottom' | 'left'\n /** Delay in milliseconds before the tooltip appears. */\n delay?: number\n /** Additional class name for the tooltip content. */\n className?: string\n}\n\n/**\n * @description A simple tooltip wrapper built on Radix Tooltip.\n * Theme-styled content with arrow pointer and configurable delay.\n * Requires a TooltipProvider ancestor (included by default).\n */\nexport function Tooltip({\n content,\n children,\n side = 'top',\n delay = 200,\n className,\n}: TooltipProps) {\n return (\n <TooltipPrimitive.Provider delayDuration={delay}>\n <TooltipPrimitive.Root>\n <TooltipPrimitive.Trigger asChild>{children}</TooltipPrimitive.Trigger>\n <TooltipPrimitive.Portal>\n <TooltipPrimitive.Content\n side={side}\n sideOffset={6}\n className={cn(\n 'z-50 px-3 py-1.5 rounded-lg text-xs font-medium',\n 'bg-[hsl(var(--bg-elevated))] text-[hsl(var(--text-primary))]',\n 'border border-[hsl(var(--border-default))] shadow-lg',\n 'animate-in fade-in-0 zoom-in-95',\n 'data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95',\n 'data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2',\n 'data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',\n className,\n )}\n >\n {content}\n <TooltipPrimitive.Arrow\n className=\"fill-[hsl(var(--bg-elevated))]\"\n width={10}\n height={5}\n />\n </TooltipPrimitive.Content>\n </TooltipPrimitive.Portal>\n </TooltipPrimitive.Root>\n </TooltipPrimitive.Provider>\n )\n}\n","'use client'\n\nimport { cn } from '../utils'\n\nexport interface SparklineProps {\n /** Array of numeric values to plot. */\n data: number[]\n /** SVG width in pixels. */\n width?: number\n /** SVG height in pixels. */\n height?: number\n /** Line color — must use hsl(var(--token)) format. */\n color?: string\n /** Opacity for the gradient fill below the line (0 to disable). */\n fillOpacity?: number\n /** Show dots on first and last data points. */\n showDots?: boolean\n className?: string\n}\n\nfunction buildPoints(data: number[], w: number, h: number, pad: number): string {\n if (data.length < 2) return ''\n const min = Math.min(...data)\n const max = Math.max(...data)\n const range = max - min || 1\n const stepX = (w - pad * 2) / (data.length - 1)\n return data\n .map((v, i) => {\n const x = pad + i * stepX\n const y = pad + (1 - (v - min) / range) * (h - pad * 2)\n return `${x},${y}`\n })\n .join(' ')\n}\n\n/**\n * @description A tiny inline SVG sparkline chart for embedding in tables, cards,\n * and metric tiles. Pure SVG with no external dependencies.\n */\nexport function Sparkline({\n data,\n width = 80,\n height = 24,\n color = 'hsl(var(--brand-primary))',\n fillOpacity = 0.1,\n showDots = false,\n className,\n}: SparklineProps) {\n if (data.length < 2) return null\n\n const pad = showDots ? 3 : 1\n const points = buildPoints(data, width, height, pad)\n const gradId = `sp-grad-${Math.random().toString(36).slice(2, 8)}`\n\n const min = Math.min(...data)\n const max = Math.max(...data)\n const range = max - min || 1\n const stepX = (width - pad * 2) / (data.length - 1)\n\n const firstX = pad\n const firstY = pad + (1 - (data[0] - min) / range) * (height - pad * 2)\n const lastX = pad + (data.length - 1) * stepX\n const lastY = pad + (1 - (data[data.length - 1] - min) / range) * (height - pad * 2)\n\n const fillPath = fillOpacity > 0\n ? `M ${firstX},${height} L ${points.split(' ').join(' L ')} L ${lastX},${height} Z`\n : undefined\n\n return (\n <svg\n width={width}\n height={height}\n viewBox={`0 0 ${width} ${height}`}\n className={cn('shrink-0', className)}\n aria-hidden=\"true\"\n >\n {fillOpacity > 0 && (\n <defs>\n <linearGradient id={gradId} x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" stopColor={color} stopOpacity={fillOpacity} />\n <stop offset=\"100%\" stopColor={color} stopOpacity={0} />\n </linearGradient>\n </defs>\n )}\n {fillPath && (\n <path d={fillPath} fill={`url(#${gradId})`} />\n )}\n <polyline\n points={points}\n fill=\"none\"\n stroke={color}\n strokeWidth={1.5}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n {showDots && (\n <>\n <circle cx={firstX} cy={firstY} r={2} fill={color} />\n <circle cx={lastX} cy={lastY} r={2} fill={color} />\n </>\n )}\n </svg>\n )\n}\n","'use client'\n\nimport { type ElementType } from 'react'\nimport { motion, useReducedMotion } from 'framer-motion'\nimport { TrendingUp, TrendingDown } from 'lucide-react'\nimport { cn } from '../utils'\nimport { AnimatedCounter } from './animated-counter'\nimport { Sparkline } from './sparkline'\n\nexport interface MetricCardProps {\n /** Metric display label. */\n label: string\n /** Current numeric value. */\n value: number\n /** Custom formatter for the displayed value (e.g. fmtBytes, fmtBps). */\n format?: (n: number) => string\n /** Previous value for trend calculation. */\n previousValue?: number\n /** Interpret trend direction for coloring. */\n trendDirection?: 'up-good' | 'up-bad' | 'down-good' | 'down-bad'\n /** Lucide icon component to display. */\n icon?: ElementType\n /** Status determines left border accent color. */\n status?: 'ok' | 'warning' | 'critical'\n /** Recent values to render an inline sparkline. */\n sparklineData?: number[]\n className?: string\n}\n\nconst statusBorder: Record<string, string> = {\n ok: 'border-l-[hsl(var(--status-ok))]',\n warning: 'border-l-[hsl(var(--status-warning))]',\n critical: 'border-l-[hsl(var(--status-critical))]',\n}\n\nconst trendColors: Record<string, string> = {\n good: 'text-[hsl(var(--status-ok))]',\n bad: 'text-[hsl(var(--status-critical))]',\n}\n\n/**\n * @description A dashboard stat tile showing a metric value with animated counter,\n * trend indicator, optional sparkline, and status-colored left border.\n * Designed for monitoring dashboards and overview panels.\n */\nexport function MetricCard({\n label,\n value,\n format,\n previousValue,\n trendDirection,\n icon: Icon,\n status,\n sparklineData,\n className,\n}: MetricCardProps) {\n const reduced = useReducedMotion()\n\n // Trend calculation\n let trendPct: number | null = null\n let trendUp = false\n let trendColorKey: 'good' | 'bad' | null = null\n\n if (previousValue != null && previousValue !== 0) {\n trendPct = ((value - previousValue) / Math.abs(previousValue)) * 100\n trendUp = trendPct >= 0\n\n if (trendDirection) {\n const isUp = trendPct >= 0\n if (trendDirection === 'up-good') trendColorKey = isUp ? 'good' : 'bad'\n else if (trendDirection === 'up-bad') trendColorKey = isUp ? 'bad' : 'good'\n else if (trendDirection === 'down-good') trendColorKey = isUp ? 'bad' : 'good'\n else if (trendDirection === 'down-bad') trendColorKey = isUp ? 'good' : 'bad'\n }\n }\n\n return (\n <motion.div\n initial={reduced ? false : { opacity: 0, y: 8 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ duration: 0.2, ease: 'easeOut' }}\n className={cn(\n 'relative rounded-2xl border border-[hsl(var(--border-subtle))] bg-[hsl(var(--bg-surface))]',\n 'p-5 shadow-sm border-l-[3px]',\n status ? statusBorder[status] : 'border-l-[hsl(var(--border-subtle))]',\n className,\n )}\n >\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-2 mb-1\">\n {Icon && (\n <Icon className=\"size-4 shrink-0 text-[hsl(var(--text-tertiary))]\" />\n )}\n <span className=\"text-[0.75rem] font-medium text-[hsl(var(--text-secondary))] truncate\">\n {label}\n </span>\n </div>\n\n <div className=\"flex items-baseline gap-2\">\n <span className=\"text-2xl font-semibold text-[hsl(var(--text-primary))] tabular-nums\">\n <AnimatedCounter value={value} format={format} />\n </span>\n\n {trendPct != null && (\n <span\n className={cn(\n 'inline-flex items-center gap-0.5 text-[0.6875rem] font-medium tabular-nums',\n trendColorKey ? trendColors[trendColorKey] : 'text-[hsl(var(--text-tertiary))]',\n )}\n >\n {trendUp ? (\n <TrendingUp className=\"size-3\" />\n ) : (\n <TrendingDown className=\"size-3\" />\n )}\n {Math.abs(trendPct).toFixed(1)}%\n </span>\n )}\n </div>\n </div>\n\n {sparklineData && sparklineData.length >= 2 && (\n <Sparkline\n data={sparklineData}\n width={72}\n height={28}\n color={\n status === 'critical'\n ? 'hsl(var(--status-critical))'\n : status === 'warning'\n ? 'hsl(var(--status-warning))'\n : 'hsl(var(--brand-primary))'\n }\n fillOpacity={0.15}\n />\n )}\n </div>\n </motion.div>\n )\n}\n","'use client'\n\nimport { useEffect, useState } from 'react'\nimport { useReducedMotion } from 'framer-motion'\nimport { cn, clamp } from '../utils'\n\nexport interface UtilizationBarProps {\n /** Utilization value from 0 to 100. */\n value: number\n /** Warning and critical thresholds. */\n thresholds?: { warning: number; critical: number }\n /** Optional label displayed to the left. */\n label?: string\n /** Show percentage value text to the right. */\n showValue?: boolean\n /** Bar height size. */\n size?: 'sm' | 'md' | 'lg'\n /** Animate the fill width on mount. */\n animated?: boolean\n className?: string\n}\n\nconst sizeMap = {\n sm: 'h-1.5',\n md: 'h-2.5',\n lg: 'h-4',\n}\n\nfunction getBarColor(value: number, warning: number, critical: number): string {\n if (value >= critical) return 'hsl(var(--util-high))'\n if (value >= warning) return 'hsl(var(--util-medium))'\n return 'hsl(var(--util-low))'\n}\n\nfunction getTextClass(value: number, warning: number, critical: number): string {\n if (value >= critical) return 'text-[hsl(var(--status-critical))]'\n if (value >= warning) return 'text-[hsl(var(--status-warning))]'\n return 'text-[hsl(var(--text-secondary))]'\n}\n\n/**\n * @description A segmented horizontal bar showing resource utilization with\n * color-coded thresholds (green/yellow/red). Supports animated fill on mount.\n */\nexport function UtilizationBar({\n value: rawValue,\n thresholds,\n label,\n showValue = true,\n size = 'md',\n animated = true,\n className,\n}: UtilizationBarProps) {\n const reduced = useReducedMotion()\n const value = clamp(rawValue, 0, 100)\n const warning = thresholds?.warning ?? 70\n const critical = thresholds?.critical ?? 90\n\n const [displayWidth, setDisplayWidth] = useState(animated && !reduced ? 0 : value)\n\n useEffect(() => {\n if (!animated || reduced) {\n setDisplayWidth(value)\n return\n }\n // Trigger the animated width after mount\n const raf = requestAnimationFrame(() => setDisplayWidth(value))\n return () => cancelAnimationFrame(raf)\n }, [value, animated, reduced])\n\n const barColor = getBarColor(value, warning, critical)\n const textClass = getTextClass(value, warning, critical)\n\n return (\n <div className={cn('flex items-center gap-2', className)} title={`${value.toFixed(1)}%`}>\n {label && (\n <span className=\"text-[0.75rem] font-medium text-[hsl(var(--text-secondary))] shrink-0 min-w-[3rem]\">\n {label}\n </span>\n )}\n <div\n className={cn(\n 'flex-1 rounded-full bg-[hsl(var(--bg-elevated))] overflow-hidden',\n sizeMap[size],\n )}\n >\n <div\n className=\"h-full rounded-full\"\n style={{\n width: `${displayWidth}%`,\n backgroundColor: barColor,\n transition: animated && !reduced ? 'width 600ms cubic-bezier(0.4, 0, 0.2, 1)' : 'none',\n }}\n />\n </div>\n {showValue && (\n <span className={cn('text-[0.75rem] font-medium tabular-nums shrink-0 min-w-[2.5rem] text-right', textClass)}>\n {value.toFixed(0)}%\n </span>\n )}\n </div>\n )\n}\n","'use client'\n\nimport { useEffect, useState } from 'react'\nimport { useReducedMotion } from 'framer-motion'\nimport { cn, clamp } from '../utils'\n\nexport interface ThresholdGaugeProps {\n /** Gauge value from 0 to 100. */\n value: number\n /** Label displayed below the gauge. */\n label?: string\n /** Warning and critical thresholds. */\n thresholds?: { warning: number; critical: number }\n /** Gauge diameter in pixels. */\n size?: number\n /** Show the numeric value in the center. */\n showValue?: boolean\n /** Custom formatter for the center value. */\n format?: (n: number) => string\n className?: string\n}\n\nconst ARC_START = 135 // degrees, bottom-left\nconst ARC_SWEEP = 270 // degrees, total arc span\n\nfunction polarToCartesian(cx: number, cy: number, r: number, angleDeg: number) {\n const rad = ((angleDeg - 90) * Math.PI) / 180\n return { x: cx + r * Math.cos(rad), y: cy + r * Math.sin(rad) }\n}\n\nfunction describeArc(cx: number, cy: number, r: number, startAngle: number, endAngle: number): string {\n const start = polarToCartesian(cx, cy, r, endAngle)\n const end = polarToCartesian(cx, cy, r, startAngle)\n const largeArc = endAngle - startAngle > 180 ? 1 : 0\n return `M ${start.x} ${start.y} A ${r} ${r} 0 ${largeArc} 0 ${end.x} ${end.y}`\n}\n\nfunction getArcColor(pct: number, warning: number, critical: number): string {\n if (pct >= critical) return 'hsl(var(--util-high))'\n if (pct >= warning) return 'hsl(var(--util-medium))'\n return 'hsl(var(--util-low))'\n}\n\n/**\n * @description A semicircular SVG gauge with color-coded threshold zones\n * (green/yellow/red). Animates the arc on mount. Displays value in center.\n */\nexport function ThresholdGauge({\n value: rawValue,\n label,\n thresholds,\n size = 120,\n showValue = true,\n format,\n className,\n}: ThresholdGaugeProps) {\n const reduced = useReducedMotion()\n const value = clamp(rawValue, 0, 100)\n const warning = thresholds?.warning ?? 70\n const critical = thresholds?.critical ?? 90\n\n const [animatedValue, setAnimatedValue] = useState(reduced ? value : 0)\n\n useEffect(() => {\n if (reduced) {\n setAnimatedValue(value)\n return\n }\n const start = performance.now()\n const from = 0\n const dur = 600\n let raf: number\n\n function tick(now: number) {\n const progress = Math.min((now - start) / dur, 1)\n const eased = 1 - Math.pow(1 - progress, 3) // ease-out cubic\n setAnimatedValue(from + (value - from) * eased)\n if (progress < 1) raf = requestAnimationFrame(tick)\n }\n raf = requestAnimationFrame(tick)\n return () => cancelAnimationFrame(raf)\n }, [value, reduced])\n\n const cx = size / 2\n const cy = size / 2\n const r = (size - 16) / 2\n const strokeWidth = Math.max(6, size * 0.08)\n\n // Background zone arcs\n const warnAngle = ARC_START + (warning / 100) * ARC_SWEEP\n const critAngle = ARC_START + (critical / 100) * ARC_SWEEP\n const endAngle = ARC_START + ARC_SWEEP\n\n const greenArc = describeArc(cx, cy, r, ARC_START, warnAngle)\n const yellowArc = describeArc(cx, cy, r, warnAngle, critAngle)\n const redArc = describeArc(cx, cy, r, critAngle, endAngle)\n\n // Value arc\n const valueAngle = ARC_START + (animatedValue / 100) * ARC_SWEEP\n const valueArc = animatedValue > 0.5\n ? describeArc(cx, cy, r, ARC_START, valueAngle)\n : ''\n\n const displayText = format ? format(value) : `${Math.round(value)}%`\n\n return (\n <div className={cn('inline-flex flex-col items-center', className)}>\n <svg width={size} height={size * 0.75} viewBox={`0 0 ${size} ${size * 0.75}`} aria-hidden=\"true\">\n {/* Background zones */}\n <path d={greenArc} fill=\"none\" stroke=\"hsl(var(--util-low))\" strokeWidth={strokeWidth} strokeLinecap=\"round\" opacity={0.2} />\n <path d={yellowArc} fill=\"none\" stroke=\"hsl(var(--util-medium))\" strokeWidth={strokeWidth} strokeLinecap=\"round\" opacity={0.2} />\n <path d={redArc} fill=\"none\" stroke=\"hsl(var(--util-high))\" strokeWidth={strokeWidth} strokeLinecap=\"round\" opacity={0.2} />\n\n {/* Value arc */}\n {valueArc && (\n <path\n d={valueArc}\n fill=\"none\"\n stroke={getArcColor(animatedValue, warning, critical)}\n strokeWidth={strokeWidth}\n strokeLinecap=\"round\"\n />\n )}\n\n {/* Center value */}\n {showValue && (\n <text\n x={cx}\n y={cy - 2}\n textAnchor=\"middle\"\n dominantBaseline=\"central\"\n fill=\"hsl(var(--text-primary))\"\n fontSize={size * 0.2}\n fontWeight={600}\n fontFamily=\"inherit\"\n className=\"tabular-nums\"\n >\n {displayText}\n </text>\n )}\n </svg>\n {label && (\n <span className=\"text-[0.75rem] font-medium text-[hsl(var(--text-secondary))] mt-1\">\n {label}\n </span>\n )}\n </div>\n )\n}\n","'use client'\n\nimport { useRef } from 'react'\nimport { motion, AnimatePresence, useReducedMotion } from 'framer-motion'\nimport { cn } from '../utils'\n\nexport interface TimelineEvent {\n /** ISO 8601 timestamp. */\n time: string\n /** Short event label. */\n label: string\n /** Severity determines dot color. */\n severity: 'critical' | 'warning' | 'info' | 'ok'\n /** Optional detail text shown on click/hover. */\n detail?: string\n}\n\nexport interface SeverityTimelineProps {\n /** Events to display (most recent should be first). */\n events: TimelineEvent[]\n /** Maximum number of visible events. */\n maxVisible?: number\n /** Callback when an event dot/label is clicked. */\n onEventClick?: (event: TimelineEvent) => void\n className?: string\n}\n\nconst severityDot: Record<string, string> = {\n critical: 'bg-[hsl(var(--status-critical))]',\n warning: 'bg-[hsl(var(--status-warning))]',\n info: 'bg-[hsl(var(--brand-primary))]',\n ok: 'bg-[hsl(var(--status-ok))]',\n}\n\nconst severityRing: Record<string, string> = {\n critical: 'ring-[hsl(var(--status-critical))]/30',\n warning: 'ring-[hsl(var(--status-warning))]/30',\n info: 'ring-[hsl(var(--brand-primary))]/30',\n ok: 'ring-[hsl(var(--status-ok))]/30',\n}\n\nfunction formatTime(iso: string): string {\n try {\n const d = new Date(iso)\n return d.toLocaleTimeString(undefined, { hour: '2-digit', minute: '2-digit' })\n } catch {\n return iso\n }\n}\n\n/**\n * @description A horizontal scrollable timeline showing events with severity-colored\n * dots. Most recent events appear on the left. Click events for detail callbacks.\n * Designed for alert timelines and incident history strips.\n */\nexport function SeverityTimeline({\n events,\n maxVisible = 20,\n onEventClick,\n className,\n}: SeverityTimelineProps) {\n const reduced = useReducedMotion()\n const scrollRef = useRef<HTMLDivElement>(null)\n const visible = events.slice(0, maxVisible)\n\n if (visible.length === 0) return null\n\n return (\n <div\n ref={scrollRef}\n className={cn(\n 'relative overflow-x-auto scrollbar-thin py-2',\n className,\n )}\n >\n <div className=\"flex items-start gap-0 min-w-max\">\n <AnimatePresence initial={false}>\n {visible.map((ev, i) => (\n <motion.div\n key={`${ev.time}-${i}`}\n initial={reduced ? false : { opacity: 0, scale: 0.8 }}\n animate={{ opacity: 1, scale: 1 }}\n exit={{ opacity: 0, scale: 0.8 }}\n transition={{ duration: 0.15, delay: reduced ? 0 : i * 0.03 }}\n className=\"flex flex-col items-center relative\"\n style={{ minWidth: 64 }}\n >\n {/* Connector line */}\n {i < visible.length - 1 && (\n <div\n className=\"absolute top-[11px] left-1/2 h-px bg-[hsl(var(--border-default))]\"\n style={{ width: 64 }}\n />\n )}\n\n {/* Dot */}\n <button\n type=\"button\"\n onClick={() => onEventClick?.(ev)}\n className={cn(\n 'relative z-10 size-[10px] rounded-full ring-4 shrink-0',\n 'transition-transform hover:scale-125 cursor-pointer',\n severityDot[ev.severity] ?? severityDot.info,\n severityRing[ev.severity] ?? severityRing.info,\n )}\n title={ev.detail ?? ev.label}\n aria-label={`${ev.label} — ${ev.severity}`}\n />\n\n {/* Label */}\n <span className=\"mt-1.5 text-[0.6875rem] font-medium text-[hsl(var(--text-primary))] text-center max-w-[56px] truncate\">\n {ev.label}\n </span>\n\n {/* Timestamp */}\n <span className=\"text-[0.625rem] text-[hsl(var(--text-tertiary))] tabular-nums\">\n {formatTime(ev.time)}\n </span>\n </motion.div>\n ))}\n </AnimatePresence>\n </div>\n </div>\n )\n}\n","'use client'\n\nimport { useCallback, useEffect, useRef, useState } from 'react'\nimport { motion, AnimatePresence, useReducedMotion } from 'framer-motion'\nimport { ArrowDown, Search } from 'lucide-react'\nimport { cn } from '../utils'\n\nexport interface LogEntry {\n /** ISO 8601 timestamp. */\n time: string\n /** Log level. */\n level: 'error' | 'warn' | 'info' | 'debug' | 'trace'\n /** Log message content. */\n message: string\n /** Optional source identifier. */\n source?: string\n}\n\nexport interface LogViewerProps {\n /** Log entries to display. */\n entries: LogEntry[]\n /** Maximum container height in pixels. */\n maxHeight?: number\n /** Auto-scroll to bottom on new entries. */\n autoScroll?: boolean\n /** Show timestamps column. */\n showTimestamps?: boolean\n /** Show level badge. */\n showLevel?: boolean\n /** Callback when a log entry is clicked. */\n onEntryClick?: (entry: LogEntry) => void\n className?: string\n}\n\nconst levelBorder: Record<string, string> = {\n error: 'border-l-[hsl(var(--status-critical))]',\n warn: 'border-l-[hsl(var(--status-warning))]',\n info: 'border-l-[hsl(var(--brand-primary))]',\n debug: 'border-l-[hsl(var(--text-tertiary))]',\n trace: 'border-l-[hsl(var(--text-disabled))]',\n}\n\nconst levelText: Record<string, string> = {\n error: 'text-[hsl(var(--status-critical))]',\n warn: 'text-[hsl(var(--status-warning))]',\n info: 'text-[hsl(var(--brand-primary))]',\n debug: 'text-[hsl(var(--text-tertiary))]',\n trace: 'text-[hsl(var(--text-disabled))]',\n}\n\nconst levelLabel: Record<string, string> = {\n error: 'ERR',\n warn: 'WRN',\n info: 'INF',\n debug: 'DBG',\n trace: 'TRC',\n}\n\nfunction formatTs(iso: string): string {\n try {\n const d = new Date(iso)\n return d.toLocaleTimeString(undefined, { hour: '2-digit', minute: '2-digit', second: '2-digit' })\n } catch {\n return iso\n }\n}\n\n/**\n * @description A log stream viewer with severity-colored borders, auto-scroll,\n * search filtering, and a \"new entries\" indicator when scrolled up.\n * Designed for real-time log tailing in monitoring dashboards.\n */\nexport function LogViewer({\n entries,\n maxHeight = 400,\n autoScroll = true,\n showTimestamps = true,\n showLevel = true,\n onEntryClick,\n className,\n}: LogViewerProps) {\n const reduced = useReducedMotion()\n const containerRef = useRef<HTMLDivElement>(null)\n const [isAtBottom, setIsAtBottom] = useState(true)\n const [filter, setFilter] = useState('')\n const [newCount, setNewCount] = useState(0)\n const prevLenRef = useRef(entries.length)\n\n const checkAtBottom = useCallback(() => {\n const el = containerRef.current\n if (!el) return\n const atBottom = el.scrollHeight - el.scrollTop - el.clientHeight < 32\n setIsAtBottom(atBottom)\n if (atBottom) setNewCount(0)\n }, [])\n\n // Auto-scroll on new entries\n useEffect(() => {\n const added = entries.length - prevLenRef.current\n prevLenRef.current = entries.length\n\n if (added > 0 && !isAtBottom) {\n setNewCount(prev => prev + added)\n }\n\n if (autoScroll && isAtBottom && containerRef.current) {\n containerRef.current.scrollTop = containerRef.current.scrollHeight\n }\n }, [entries.length, autoScroll, isAtBottom])\n\n const scrollToBottom = useCallback(() => {\n if (containerRef.current) {\n containerRef.current.scrollTop = containerRef.current.scrollHeight\n setNewCount(0)\n setIsAtBottom(true)\n }\n }, [])\n\n const lowerFilter = filter.toLowerCase()\n const filtered = filter\n ? entries.filter(e =>\n e.message.toLowerCase().includes(lowerFilter) ||\n e.source?.toLowerCase().includes(lowerFilter) ||\n e.level.includes(lowerFilter)\n )\n : entries\n\n return (\n <div className={cn('relative rounded-xl border border-[hsl(var(--border-subtle))] bg-[hsl(var(--bg-surface))] overflow-hidden', className)}>\n {/* Search bar */}\n <div className=\"flex items-center gap-2 px-3 py-2 border-b border-[hsl(var(--border-subtle))] bg-[hsl(var(--bg-elevated))]\">\n <Search className=\"size-3.5 text-[hsl(var(--text-tertiary))] shrink-0\" />\n <input\n type=\"text\"\n value={filter}\n onChange={e => setFilter(e.target.value)}\n placeholder=\"Filter logs...\"\n className=\"flex-1 bg-transparent text-[0.75rem] text-[hsl(var(--text-primary))] placeholder:text-[hsl(var(--text-disabled))] outline-none font-mono\"\n />\n {filter && (\n <span className=\"text-[0.6875rem] text-[hsl(var(--text-tertiary))] tabular-nums shrink-0\">\n {filtered.length} / {entries.length}\n </span>\n )}\n </div>\n\n {/* Log entries */}\n <div\n ref={containerRef}\n onScroll={checkAtBottom}\n className=\"overflow-y-auto\"\n style={{ maxHeight }}\n >\n {filtered.map((entry, i) => (\n <div\n key={`${entry.time}-${i}`}\n onClick={() => onEntryClick?.(entry)}\n className={cn(\n 'flex items-start gap-2 px-3 py-1 border-l-2 font-mono text-[0.75rem] leading-5',\n 'hover:bg-[hsl(var(--bg-elevated))] transition-colors',\n onEntryClick && 'cursor-pointer',\n levelBorder[entry.level] ?? levelBorder.info,\n )}\n >\n {showTimestamps && (\n <span className=\"text-[hsl(var(--text-tertiary))] tabular-nums shrink-0 select-all\">\n {formatTs(entry.time)}\n </span>\n )}\n {showLevel && (\n <span className={cn('font-semibold shrink-0 w-[2.5ch]', levelText[entry.level] ?? levelText.info)}>\n {levelLabel[entry.level] ?? entry.level.toUpperCase().slice(0, 3)}\n </span>\n )}\n {entry.source && (\n <span className=\"text-[hsl(var(--text-secondary))] shrink-0\">\n [{entry.source}]\n </span>\n )}\n <span className=\"text-[hsl(var(--text-primary))] break-all min-w-0\">\n {entry.message}\n </span>\n </div>\n ))}\n </div>\n\n {/* New entries indicator */}\n <AnimatePresence>\n {newCount > 0 && !isAtBottom && (\n <motion.button\n type=\"button\"\n initial={reduced ? false : { opacity: 0, y: 8 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: 8 }}\n transition={{ duration: 0.15 }}\n onClick={scrollToBottom}\n className={cn(\n 'absolute bottom-3 left-1/2 -translate-x-1/2 z-10',\n 'inline-flex items-center gap-1.5 px-3 py-1.5 rounded-full',\n 'bg-[hsl(var(--brand-primary))] text-[hsl(var(--text-on-brand))]',\n 'text-[0.6875rem] font-medium shadow-lg cursor-pointer',\n 'hover:opacity-90 transition-opacity',\n )}\n >\n <ArrowDown className=\"size-3\" />\n {newCount} new {newCount === 1 ? 'entry' : 'entries'}\n </motion.button>\n )}\n </AnimatePresence>\n </div>\n )\n}\n","'use client'\n\nimport { motion, useReducedMotion } from 'framer-motion'\nimport { cn } from '../utils'\n\nexport interface PortStatus {\n /** Unique port identifier. */\n id: string\n /** Display label (e.g. \"Gi1/0/1\"). */\n label: string\n /** Port operational status. */\n status: 'up' | 'down' | 'disabled' | 'error'\n /** Link speed display string (e.g. \"10G\", \"1G\"). */\n speed?: string\n /** Port utilization 0-100 percentage. */\n utilization?: number\n}\n\nexport interface PortStatusGridProps {\n /** Array of port status objects. */\n ports: PortStatus[]\n /** Number of columns. Defaults to auto-fit. */\n columns?: number\n /** Dot/rectangle size. */\n size?: 'sm' | 'md'\n /** Callback when a port is clicked. */\n onPortClick?: (port: PortStatus) => void\n className?: string\n}\n\nconst statusColor: Record<string, string> = {\n up: 'bg-[hsl(var(--status-ok))]',\n down: 'bg-[hsl(var(--status-critical))]',\n disabled: 'bg-[hsl(var(--text-disabled))]',\n error: 'bg-[hsl(var(--status-warning))]',\n}\n\nconst statusHover: Record<string, string> = {\n up: 'hover:ring-[hsl(var(--status-ok))]/40',\n down: 'hover:ring-[hsl(var(--status-critical))]/40',\n disabled: 'hover:ring-[hsl(var(--text-disabled))]/40',\n error: 'hover:ring-[hsl(var(--status-warning))]/40',\n}\n\nconst sizeClasses = {\n sm: 'size-3 rounded-[2px]',\n md: 'size-5 rounded-[3px]',\n}\n\n/**\n * @description A grid of small colored indicators representing network ports or\n * interfaces. Each port is colored by operational status with hover tooltips showing\n * label, speed, and utilization. Designed for switch/router faceplate visualizations.\n */\nexport function PortStatusGrid({\n ports,\n columns,\n size = 'sm',\n onPortClick,\n className,\n}: PortStatusGridProps) {\n const reduced = useReducedMotion()\n\n const gridStyle = columns\n ? { gridTemplateColumns: `repeat(${columns}, minmax(0, 1fr))` }\n : { gridTemplateColumns: `repeat(auto-fill, minmax(${size === 'sm' ? '12px' : '20px'}, 1fr))` }\n\n return (\n <div\n className={cn('grid gap-1', className)}\n style={gridStyle}\n role=\"grid\"\n aria-label=\"Port status grid\"\n >\n {ports.map((port, i) => {\n const tooltipParts = [port.label]\n if (port.speed) tooltipParts.push(port.speed)\n if (port.utilization != null) tooltipParts.push(`${port.utilization.toFixed(0)}%`)\n tooltipParts.push(port.status)\n\n return (\n <motion.button\n key={port.id}\n type=\"button\"\n initial={reduced ? false : { opacity: 0, scale: 0.5 }}\n animate={{ opacity: 1, scale: 1 }}\n transition={{ duration: 0.1, delay: reduced ? 0 : Math.min(i * 0.008, 0.4) }}\n onClick={() => onPortClick?.(port)}\n title={tooltipParts.join(' \\u00b7 ')}\n aria-label={`${port.label}: ${port.status}`}\n className={cn(\n 'transition-all cursor-pointer ring-0 hover:ring-2',\n sizeClasses[size],\n statusColor[port.status] ?? statusColor.disabled,\n statusHover[port.status] ?? statusHover.disabled,\n )}\n />\n )\n })}\n </div>\n )\n}\n","'use client'\n\nimport { motion, useReducedMotion } from 'framer-motion'\nimport { cn } from '../utils'\n\nexport interface TimeRange {\n /** Display label (e.g. \"1h\", \"24h\"). */\n label: string\n /** Unique value identifier. */\n value: string\n /** Duration in seconds represented by this range. */\n seconds: number\n}\n\nexport interface TimeRangeSelectorProps {\n /** Currently selected range value. */\n value: string\n /** Callback when a range is selected. */\n onChange: (value: string, range: TimeRange) => void\n /** Custom range options. Defaults to 1h, 6h, 24h, 7d, 30d. */\n ranges?: TimeRange[]\n className?: string\n}\n\nconst defaultRanges: TimeRange[] = [\n { label: '1h', value: '1h', seconds: 3600 },\n { label: '6h', value: '6h', seconds: 21600 },\n { label: '24h', value: '24h', seconds: 86400 },\n { label: '7d', value: '7d', seconds: 604800 },\n { label: '30d', value: '30d', seconds: 2592000 },\n]\n\n/**\n * @description A compact horizontal pill-group time range selector for dashboards.\n * Active selection is highlighted with a sliding indicator using the brand color.\n * Common in monitoring dashboards for controlling chart time windows.\n */\nexport function TimeRangeSelector({\n value,\n onChange,\n ranges = defaultRanges,\n className,\n}: TimeRangeSelectorProps) {\n const reduced = useReducedMotion()\n\n return (\n <div\n className={cn(\n 'inline-flex items-center rounded-lg bg-[hsl(var(--bg-elevated))] p-0.5',\n 'border border-[hsl(var(--border-subtle))]',\n className,\n )}\n role=\"radiogroup\"\n aria-label=\"Time range\"\n >\n {ranges.map(range => {\n const isActive = range.value === value\n return (\n <button\n key={range.value}\n type=\"button\"\n role=\"radio\"\n aria-checked={isActive}\n onClick={() => onChange(range.value, range)}\n className={cn(\n 'relative px-3 py-1 text-[0.75rem] font-medium rounded-md cursor-pointer',\n 'transition-colors duration-150',\n isActive\n ? 'text-[hsl(var(--text-on-brand))]'\n : 'text-[hsl(var(--text-secondary))] hover:text-[hsl(var(--text-primary))]',\n )}\n >\n {isActive && (\n <motion.span\n layoutId=\"time-range-active\"\n className=\"absolute inset-0 rounded-md bg-[hsl(var(--brand-primary))]\"\n transition={reduced ? { duration: 0 } : { type: 'spring', stiffness: 400, damping: 30 }}\n />\n )}\n <span className=\"relative z-10\">{range.label}</span>\n </button>\n )\n })}\n </div>\n )\n}\n","'use client'\n\nimport { type ElementType } from 'react'\nimport { motion, useReducedMotion } from 'framer-motion'\nimport { ChevronRight } from 'lucide-react'\nimport { cn } from '../utils'\n\nexport interface StageInfo {\n /** Stage display name. */\n name: string\n /** Current stage status. */\n status: 'active' | 'idle' | 'error' | 'disabled'\n /** Optional metric to display inside the stage box. */\n metric?: { label: string; value: string }\n /** Lucide icon component for the stage. */\n icon?: ElementType\n}\n\nexport interface PipelineStageProps {\n /** Ordered array of processing stages. */\n stages: StageInfo[]\n /** Callback when a stage is clicked. */\n onStageClick?: (stage: StageInfo, index: number) => void\n className?: string\n}\n\nconst statusDot: Record<string, string> = {\n active: 'bg-[hsl(var(--status-ok))]',\n idle: 'bg-[hsl(var(--text-tertiary))]',\n error: 'bg-[hsl(var(--status-critical))]',\n disabled: 'bg-[hsl(var(--text-disabled))]',\n}\n\nconst statusBorder: Record<string, string> = {\n active: 'border-[hsl(var(--status-ok))]/30',\n idle: 'border-[hsl(var(--border-default))]',\n error: 'border-[hsl(var(--status-critical))]/30',\n disabled: 'border-[hsl(var(--border-subtle))]',\n}\n\nconst statusBg: Record<string, string> = {\n active: 'bg-[hsl(var(--bg-surface))]',\n idle: 'bg-[hsl(var(--bg-surface))]',\n error: 'bg-[hsl(var(--status-critical))]/5',\n disabled: 'bg-[hsl(var(--bg-elevated))]',\n}\n\n/**\n * @description A horizontal data pipeline visualization showing processing stages\n * connected by animated chevron arrows. Each stage displays name, status dot,\n * optional icon, and optional metric. Designed for data pipeline monitoring views.\n */\nexport function PipelineStage({\n stages,\n onStageClick,\n className,\n}: PipelineStageProps) {\n const reduced = useReducedMotion()\n\n return (\n <div className={cn('flex items-center gap-0 overflow-x-auto', className)}>\n {stages.map((stage, i) => {\n const Icon = stage.icon\n const isDisabled = stage.status === 'disabled'\n\n return (\n <div key={`${stage.name}-${i}`} className=\"flex items-center shrink-0\">\n {/* Arrow connector */}\n {i > 0 && (\n <motion.div\n initial={reduced ? false : { opacity: 0, x: -4 }}\n animate={{ opacity: 1, x: 0 }}\n transition={{ duration: 0.15, delay: reduced ? 0 : i * 0.05 }}\n className=\"px-1\"\n >\n <ChevronRight className=\"size-4 text-[hsl(var(--text-tertiary))]\" />\n </motion.div>\n )}\n\n {/* Stage box */}\n <motion.button\n type=\"button\"\n initial={reduced ? false : { opacity: 0, y: 6 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ duration: 0.2, delay: reduced ? 0 : i * 0.06 }}\n onClick={() => onStageClick?.(stage, i)}\n disabled={isDisabled && !onStageClick}\n className={cn(\n 'flex flex-col items-start gap-1.5 px-4 py-3 rounded-xl border',\n 'transition-all min-w-[120px]',\n statusBorder[stage.status],\n statusBg[stage.status],\n onStageClick && !isDisabled && 'cursor-pointer hover:bg-[hsl(var(--bg-elevated))]',\n isDisabled && 'opacity-50',\n )}\n >\n {/* Header row: icon + name + status dot */}\n <div className=\"flex items-center gap-2 w-full\">\n {Icon && (\n <Icon className={cn('size-3.5 shrink-0', isDisabled ? 'text-[hsl(var(--text-disabled))]' : 'text-[hsl(var(--text-secondary))]')} />\n )}\n <span className={cn(\n 'text-[0.8125rem] font-medium truncate',\n isDisabled ? 'text-[hsl(var(--text-disabled))]' : 'text-[hsl(var(--text-primary))]',\n )}>\n {stage.name}\n </span>\n <span\n className={cn(\n 'size-2 rounded-full shrink-0 ml-auto',\n statusDot[stage.status],\n stage.status === 'active' && 'animate-pulse',\n )}\n />\n </div>\n\n {/* Metric */}\n {stage.metric && (\n <div className=\"flex items-baseline gap-1\">\n <span className=\"text-[0.875rem] font-semibold text-[hsl(var(--text-primary))] tabular-nums\">\n {stage.metric.value}\n </span>\n <span className=\"text-[0.625rem] text-[hsl(var(--text-tertiary))]\">\n {stage.metric.label}\n </span>\n </div>\n )}\n </motion.button>\n </div>\n )\n })}\n </div>\n )\n}\n","'use client'\n\nimport { motion, useReducedMotion } from 'framer-motion'\nimport { cn } from '../utils'\n\nexport interface DayStatus {\n /** Date in YYYY-MM-DD format. */\n date: string\n /** Operational status for that day. */\n status: 'ok' | 'degraded' | 'outage' | 'no-data'\n /** Uptime percentage for that day (0-100). */\n uptime?: number\n}\n\nexport interface UptimeTrackerProps {\n /** Array of day-status entries (oldest first). */\n days: DayStatus[]\n /** Show overall uptime percentage. */\n showPercentage?: boolean\n /** Optional label displayed above the bar. */\n label?: string\n /** Callback when a day bar is clicked. */\n onDayClick?: (day: DayStatus) => void\n className?: string\n}\n\nconst dayColor: Record<string, string> = {\n ok: 'bg-[hsl(var(--status-ok))]',\n degraded: 'bg-[hsl(var(--status-warning))]',\n outage: 'bg-[hsl(var(--status-critical))]',\n 'no-data': 'bg-[hsl(var(--text-disabled))]',\n}\n\nconst dayHover: Record<string, string> = {\n ok: 'hover:bg-[hsl(var(--status-ok))]/80',\n degraded: 'hover:bg-[hsl(var(--status-warning))]/80',\n outage: 'hover:bg-[hsl(var(--status-critical))]/80',\n 'no-data': 'hover:bg-[hsl(var(--text-disabled))]/80',\n}\n\nfunction formatDate(dateStr: string): string {\n try {\n const d = new Date(dateStr + 'T00:00:00')\n return d.toLocaleDateString(undefined, { month: 'short', day: 'numeric' })\n } catch {\n return dateStr\n }\n}\n\n/**\n * @description A row of thin vertical bars representing daily uptime status,\n * inspired by GitHub/Statuspage uptime indicators. Each bar is colored by\n * operational status (ok/degraded/outage/no-data). Hover shows date and uptime\n * percentage. Designed for SLA and availability tracking displays.\n */\nexport function UptimeTracker({\n days,\n showPercentage = true,\n label,\n onDayClick,\n className,\n}: UptimeTrackerProps) {\n const reduced = useReducedMotion()\n\n // Calculate overall uptime\n const daysWithUptime = days.filter(d => d.uptime != null)\n const overallUptime = daysWithUptime.length > 0\n ? daysWithUptime.reduce((sum, d) => sum + (d.uptime ?? 0), 0) / daysWithUptime.length\n : null\n\n return (\n <div className={cn('space-y-2', className)}>\n {/* Header */}\n {(label || showPercentage) && (\n <div className=\"flex items-center justify-between\">\n {label && (\n <span className=\"text-[0.8125rem] font-medium text-[hsl(var(--text-primary))]\">\n {label}\n </span>\n )}\n {showPercentage && overallUptime != null && (\n <span className={cn(\n 'text-[0.8125rem] font-semibold tabular-nums',\n overallUptime >= 99.9\n ? 'text-[hsl(var(--status-ok))]'\n : overallUptime >= 99\n ? 'text-[hsl(var(--status-warning))]'\n : 'text-[hsl(var(--status-critical))]',\n )}>\n {overallUptime.toFixed(2)}% uptime\n </span>\n )}\n </div>\n )}\n\n {/* Day bars */}\n <div className=\"flex items-end gap-px h-8\">\n {days.map((day, i) => {\n const tooltip = [\n formatDate(day.date),\n day.uptime != null ? `${day.uptime.toFixed(1)}%` : day.status,\n ].join(' \\u2014 ')\n\n return (\n <motion.button\n key={day.date}\n type=\"button\"\n initial={reduced ? false : { scaleY: 0 }}\n animate={{ scaleY: 1 }}\n transition={{ duration: 0.15, delay: reduced ? 0 : Math.min(i * 0.005, 0.3) }}\n style={{ originY: '100%' }}\n onClick={() => onDayClick?.(day)}\n title={tooltip}\n aria-label={tooltip}\n className={cn(\n 'flex-1 min-w-[2px] h-full rounded-[1px] transition-opacity cursor-pointer',\n dayColor[day.status] ?? dayColor['no-data'],\n dayHover[day.status] ?? dayHover['no-data'],\n )}\n />\n )\n })}\n </div>\n\n {/* Date range labels */}\n {days.length > 0 && (\n <div className=\"flex items-center justify-between\">\n <span className=\"text-[0.625rem] text-[hsl(var(--text-tertiary))]\">\n {formatDate(days[0].date)}\n </span>\n <span className=\"text-[0.625rem] text-[hsl(var(--text-tertiary))]\">\n {formatDate(days[days.length - 1].date)}\n </span>\n </div>\n )}\n </div>\n )\n}\n"]}