@camstack/ui-library 0.1.34 → 0.1.35

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/theme/defaults.ts","../src/theme/create-theme.ts","../src/theme/theme-to-css.ts","../src/theme/theme-provider.tsx","../src/theme/use-theme-mode.ts","../src/lib/cn.ts","../src/icons/provider-icons.ts","../src/icons/status-icons.ts","../src/primitives/button.tsx","../src/primitives/icon-button.tsx","../src/primitives/badge.tsx","../src/primitives/card.tsx","../src/primitives/label.tsx","../src/primitives/separator.tsx","../src/primitives/skeleton.tsx","../src/primitives/input.tsx","../src/primitives/select.tsx","../src/primitives/checkbox.tsx","../src/primitives/switch.tsx","../src/primitives/dialog.tsx","../src/primitives/dropdown.tsx","../src/primitives/tooltip.tsx","../src/primitives/popover.tsx","../src/primitives/tabs.tsx","../src/primitives/scroll-area.tsx","../src/primitives/floating-panel.tsx","../src/composites/status-badge.tsx","../src/composites/provider-badge.tsx","../src/composites/version-badge.tsx","../src/composites/form-field.tsx","../src/composites/page-header.tsx","../src/composites/empty-state.tsx","../src/composites/confirm-dialog.tsx","../src/composites/stat-card.tsx","../src/composites/key-value-list.tsx","../src/composites/code-block.tsx","../src/composites/filter-bar.tsx","../src/composites/app-shell/sidebar-item.tsx","../src/composites/app-shell/sidebar.tsx","../src/composites/app-shell/app-shell.tsx","../src/composites/data-table/data-table.tsx","../src/composites/data-table/data-table-header.tsx","../src/composites/data-table/data-table-row.tsx","../src/composites/data-table/data-table-pagination.tsx","../src/composites/device-card.tsx","../src/composites/device-grid.tsx","../src/composites/pipeline-step.tsx","../src/composites/pipeline-runtime-selector.tsx","../src/composites/pipeline-builder.tsx","../src/lib/validate-template.ts","../src/composites/detection-colors.ts","../src/composites/detection-canvas.tsx","../src/composites/detection-result-tree.tsx","../src/composites/step-timings.tsx","../src/composites/image-selector.tsx","../src/composites/inference-config-selector.tsx","../src/composites/mount-addon-page.tsx","../src/composites/dev-shell.tsx","../src/composites/login-form.tsx"],"sourcesContent":["export * from './theme'\nexport * from './lib'\nexport * from './icons'\nexport * from './primitives'\nexport * from './composites'\n","import type { CamStackColorTokens, CamStackTheme } from './types'\n\nconst providerColors: CamStackColorTokens['provider'] = {\n frigate: '#3b82f6',\n scrypted: '#a855f7',\n reolink: '#06b6d4',\n homeAssistant: '#22d3ee',\n rtsp: '#78716c',\n}\n\nexport const darkColors: CamStackColorTokens = {\n primary: '#f59e42',\n primaryForeground: '#0c0a09',\n background: '#0c0a09',\n backgroundElevated: '#1c1917',\n surface: '#1c1917',\n surfaceHover: '#292524',\n border: '#292524',\n borderSubtle: '#1c1917',\n foreground: '#fafaf9',\n foregroundMuted: '#a8a29e',\n foregroundSubtle: '#78716c',\n foregroundDisabled: '#57534e',\n success: '#4ade80',\n warning: '#fbbf24',\n danger: '#f87171',\n info: '#60a5fa',\n provider: providerColors,\n}\n\nexport const lightColors: CamStackColorTokens = {\n primary: '#e67e22',\n primaryForeground: '#ffffff',\n background: '#fafaf9',\n backgroundElevated: '#ffffff',\n surface: '#f5f5f4',\n surfaceHover: '#e7e5e4',\n border: '#d6d3d1',\n borderSubtle: '#e7e5e4',\n foreground: '#1c1917',\n foregroundMuted: '#57534e',\n foregroundSubtle: '#78716c',\n foregroundDisabled: '#a8a29e',\n success: '#16a34a',\n warning: '#d97706',\n danger: '#dc2626',\n info: '#2563eb',\n provider: providerColors,\n}\n\nexport const defaultTheme: CamStackTheme = {\n colors: {\n dark: darkColors,\n light: lightColors,\n },\n spacing: {\n xs: 2,\n sm: 4,\n md: 8,\n lg: 12,\n xl: 16,\n '2xl': 24,\n '3xl': 32,\n },\n radius: {\n sm: 4,\n md: 6,\n lg: 8,\n xl: 12,\n },\n typography: {\n fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif',\n sizes: {\n xs: { fontSize: 10, lineHeight: 14 },\n sm: { fontSize: 11, lineHeight: 16 },\n base: { fontSize: 12, lineHeight: 18 },\n lg: { fontSize: 13, lineHeight: 18 },\n xl: { fontSize: 14, lineHeight: 20 },\n '2xl': { fontSize: 16, lineHeight: 22 },\n '3xl': { fontSize: 20, lineHeight: 28 },\n },\n weights: {\n regular: 400,\n medium: 500,\n semibold: 600,\n bold: 700,\n },\n },\n table: {\n rowHeight: 28,\n headerHeight: 24,\n cellPaddingX: 8,\n cellPaddingY: 6,\n },\n sidebar: {\n width: 176,\n itemHeight: 28,\n iconSize: 14,\n },\n}\n","import type { CamStackTheme, DeepPartial } from './types'\nimport { defaultTheme } from './defaults'\n\nfunction deepMerge<T extends object>(target: T, source: DeepPartial<T>): T {\n const result = { ...target }\n for (const key in source) {\n const sourceVal = source[key]\n const targetVal = target[key]\n if (\n sourceVal !== undefined &&\n typeof sourceVal === 'object' &&\n sourceVal !== null &&\n !Array.isArray(sourceVal) &&\n typeof targetVal === 'object' &&\n targetVal !== null\n ) {\n result[key] = deepMerge(\n targetVal as Record<string, unknown>,\n sourceVal as Record<string, unknown>,\n ) as T[typeof key]\n } else if (sourceVal !== undefined) {\n result[key] = sourceVal as T[typeof key]\n }\n }\n return result\n}\n\nexport function createTheme(overrides?: DeepPartial<CamStackTheme>): CamStackTheme {\n if (!overrides) return structuredClone(defaultTheme)\n return deepMerge(structuredClone(defaultTheme), overrides)\n}\n","import type { CamStackColorTokens, CamStackTheme } from './types'\n\nfunction camelToKebab(str: string): string {\n return str.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`)\n}\n\nfunction colorTokenToCssVar(key: string): string {\n return `--color-${camelToKebab(key)}`\n}\n\nfunction generateColorBlock(colors: CamStackColorTokens): string {\n const lines: string[] = []\n for (const [key, value] of Object.entries(colors)) {\n if (key === 'provider') continue\n lines.push(` ${colorTokenToCssVar(key)}: ${value};`)\n }\n return lines.join('\\n')\n}\n\nfunction generateProviderColors(provider: CamStackColorTokens['provider']): string {\n const lines: string[] = []\n for (const [key, value] of Object.entries(provider)) {\n lines.push(` --color-provider-${camelToKebab(key)}: ${value};`)\n }\n return lines.join('\\n')\n}\n\nfunction generateSpacingTokens(spacing: CamStackTheme['spacing']): string {\n const lines: string[] = []\n for (const [key, value] of Object.entries(spacing)) {\n lines.push(` --spacing-${key}: ${value}px;`)\n }\n return lines.join('\\n')\n}\n\nfunction generateRadiusTokens(radius: CamStackTheme['radius']): string {\n const lines: string[] = []\n for (const [key, value] of Object.entries(radius)) {\n lines.push(` --radius-${key}: ${value}px;`)\n }\n return lines.join('\\n')\n}\n\nexport function themeToCss(theme: CamStackTheme): string {\n const darkColorBlock = generateColorBlock(theme.colors.dark)\n const lightColorBlock = generateColorBlock(theme.colors.light)\n const providerBlock = generateProviderColors(theme.colors.dark.provider)\n const spacingBlock = generateSpacingTokens(theme.spacing)\n const radiusBlock = generateRadiusTokens(theme.radius)\n\n return `@theme {\n${providerBlock}\n${spacingBlock}\n${radiusBlock}\n}\n\n.dark {\n${darkColorBlock}\n}\n\n.light {\n${lightColorBlock}\n}\n\n@media (prefers-color-scheme: dark) {\n :root {\n${darkColorBlock.replace(/^ /gm, ' ')}\n }\n}\n\n@media (prefers-color-scheme: light) {\n :root {\n${lightColorBlock.replace(/^ /gm, ' ')}\n }\n}\n`\n}\n","import { createContext, useCallback, useEffect, useMemo, useState } from 'react'\nimport type { ReactNode } from 'react'\nimport type { ThemeMode, UseThemeModeReturn } from './types'\n\nexport const ThemeContext = createContext<UseThemeModeReturn | null>(null)\n\ninterface ThemeProviderProps {\n children: ReactNode\n defaultMode?: ThemeMode\n storageKey?: string\n}\n\nconst TOGGLE_ORDER: readonly ThemeMode[] = ['dark', 'light', 'system'] as const\n\nfunction getSystemPreference(): 'dark' | 'light' {\n if (typeof window === 'undefined') return 'dark'\n return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'\n}\n\nfunction getInitialMode(storageKey: string, defaultMode: ThemeMode): ThemeMode {\n if (typeof window === 'undefined') return defaultMode\n const stored = localStorage.getItem(storageKey)\n if (stored === 'dark' || stored === 'light' || stored === 'system') {\n return stored\n }\n return defaultMode\n}\n\nfunction resolveMode(mode: ThemeMode): 'dark' | 'light' {\n if (mode === 'system') return getSystemPreference()\n return mode\n}\n\nexport function ThemeProvider({\n children,\n defaultMode = 'system',\n storageKey = 'camstack-theme-mode',\n}: ThemeProviderProps) {\n const [mode, setModeState] = useState<ThemeMode>(() => getInitialMode(storageKey, defaultMode))\n const [resolvedMode, setResolvedMode] = useState<'dark' | 'light'>(() => resolveMode(mode))\n\n const setMode = useCallback(\n (newMode: ThemeMode) => {\n setModeState(newMode)\n setResolvedMode(resolveMode(newMode))\n if (typeof window !== 'undefined') {\n localStorage.setItem(storageKey, newMode)\n }\n },\n [storageKey],\n )\n\n const toggleMode = useCallback(() => {\n const currentIndex = TOGGLE_ORDER.indexOf(mode)\n const nextIndex = (currentIndex + 1) % TOGGLE_ORDER.length\n setMode(TOGGLE_ORDER[nextIndex] ?? 'dark')\n }, [mode, setMode])\n\n // Apply CSS class on document.documentElement\n useEffect(() => {\n if (typeof document === 'undefined') return\n\n const root = document.documentElement\n root.classList.remove('dark', 'light')\n // Always apply the resolved class — even in 'system' mode, the CSS\n // variables need the .dark or .light class to activate\n root.classList.add(resolvedMode)\n }, [mode, resolvedMode])\n\n // Listen for system theme changes when in 'system' mode\n useEffect(() => {\n if (typeof window === 'undefined' || mode !== 'system') return\n\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)')\n const handleChange = () => {\n setResolvedMode(getSystemPreference())\n }\n\n mediaQuery.addEventListener('change', handleChange)\n return () => mediaQuery.removeEventListener('change', handleChange)\n }, [mode])\n\n const value = useMemo<UseThemeModeReturn>(\n () => ({ mode, resolvedMode, setMode, toggleMode }),\n [mode, resolvedMode, setMode, toggleMode],\n )\n\n return <ThemeContext.Provider value={value}>{children}</ThemeContext.Provider>\n}\n","import { useContext } from 'react'\nimport { ThemeContext } from './theme-provider'\nimport type { UseThemeModeReturn } from './types'\n\nexport function useThemeMode(): UseThemeModeReturn {\n const context = useContext(ThemeContext)\n if (!context) {\n throw new Error('useThemeMode must be used within a ThemeProvider')\n }\n return context\n}\n","import { type ClassValue, clsx } from 'clsx'\nimport { twMerge } from 'tailwind-merge'\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","import { Ship, Shield, Radio, Home, Cast, type LucideIcon } from 'lucide-react'\n\nexport type ProviderType = 'frigate' | 'scrypted' | 'reolink' | 'homeAssistant' | 'rtsp'\n\nexport const providerIcons: Record<ProviderType, LucideIcon> = {\n frigate: Ship,\n scrypted: Shield,\n reolink: Radio,\n homeAssistant: Home,\n rtsp: Cast,\n}\n","import { CircleCheck, CircleX, CircleAlert, CircleHelp, type LucideIcon } from 'lucide-react'\n\nexport type StatusType = 'online' | 'offline' | 'degraded' | 'unknown'\n\nexport const statusIcons: Record<StatusType, LucideIcon> = {\n online: CircleCheck,\n offline: CircleX,\n degraded: CircleAlert,\n unknown: CircleHelp,\n}\n","import { type ButtonHTMLAttributes, forwardRef } from 'react'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { cn } from '../lib/cn'\n\nconst buttonVariants = cva(\n 'inline-flex items-center justify-center rounded-md font-medium transition-colors disabled:opacity-50 disabled:pointer-events-none',\n {\n variants: {\n variant: {\n primary: 'bg-primary text-primary-foreground hover:bg-primary/90',\n secondary: 'bg-surface text-foreground hover:bg-surface-hover',\n ghost: 'hover:bg-surface-hover text-foreground-muted',\n danger: 'bg-danger text-white hover:bg-danger/90',\n outline: 'border border-border bg-transparent hover:bg-surface-hover',\n },\n size: {\n sm: 'h-7 px-2.5 text-xs gap-1.5',\n md: 'h-8 px-3 text-sm gap-2',\n lg: 'h-9 px-4 text-sm gap-2',\n },\n },\n defaultVariants: {\n variant: 'primary',\n size: 'sm',\n },\n }\n)\n\nexport interface ButtonProps\n extends ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {}\n\nexport const Button = forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, ...props }, ref) => {\n return (\n <button\n ref={ref}\n className={cn(buttonVariants({ variant, size }), className)}\n {...props}\n />\n )\n }\n)\n\nButton.displayName = 'Button'\n","import { type ButtonHTMLAttributes, forwardRef } from 'react'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { type LucideIcon } from 'lucide-react'\nimport { cn } from '../lib/cn'\n\nconst iconButtonVariants = cva(\n 'inline-flex items-center justify-center rounded-md font-medium transition-colors disabled:opacity-50 disabled:pointer-events-none',\n {\n variants: {\n variant: {\n primary: 'bg-primary text-primary-foreground hover:bg-primary/90',\n secondary: 'bg-surface text-foreground hover:bg-surface-hover',\n ghost: 'hover:bg-surface-hover text-foreground-muted',\n danger: 'bg-danger text-white hover:bg-danger/90',\n outline: 'border border-border bg-transparent hover:bg-surface-hover',\n },\n size: {\n sm: 'h-7 w-7',\n md: 'h-8 w-8',\n lg: 'h-9 w-9',\n },\n },\n defaultVariants: {\n variant: 'primary',\n size: 'sm',\n },\n }\n)\n\nexport interface IconButtonProps\n extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'children'>,\n VariantProps<typeof iconButtonVariants> {\n icon: LucideIcon\n 'aria-label': string\n}\n\nexport const IconButton = forwardRef<HTMLButtonElement, IconButtonProps>(\n ({ className, variant, size, icon: Icon, ...props }, ref) => {\n return (\n <button\n ref={ref}\n className={cn(iconButtonVariants({ variant, size }), className)}\n {...props}\n >\n <Icon className=\"h-4 w-4\" />\n </button>\n )\n }\n)\n\nIconButton.displayName = 'IconButton'\n","import { type HTMLAttributes, forwardRef } from 'react'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { cn } from '../lib/cn'\n\nconst badgeVariants = cva(\n 'inline-flex items-center rounded-full text-xs font-medium px-2 py-0.5',\n {\n variants: {\n variant: {\n default: 'bg-surface-hover text-foreground',\n success: 'bg-success/15 text-success',\n warning: 'bg-warning/15 text-warning',\n danger: 'bg-danger/15 text-danger',\n info: 'bg-info/15 text-info',\n },\n styleVariant: {\n solid: '',\n outline: 'border bg-transparent',\n },\n },\n defaultVariants: {\n variant: 'default',\n styleVariant: 'solid',\n },\n }\n)\n\nexport interface BadgeProps\n extends Omit<HTMLAttributes<HTMLSpanElement>, 'style'>,\n VariantProps<typeof badgeVariants> {\n style?: 'solid' | 'outline'\n}\n\nexport const Badge = forwardRef<HTMLSpanElement, BadgeProps>(\n ({ className, variant, style, ...props }, ref) => {\n return (\n <span\n ref={ref}\n className={cn(badgeVariants({ variant, styleVariant: style }), className)}\n {...props}\n />\n )\n }\n)\n\nBadge.displayName = 'Badge'\n","import { type HTMLAttributes, forwardRef } from 'react'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { cn } from '../lib/cn'\n\nconst cardVariants = cva('rounded-lg p-3', {\n variants: {\n variant: {\n flat: 'bg-surface',\n bordered: 'bg-surface border border-border',\n },\n },\n defaultVariants: {\n variant: 'bordered',\n },\n})\n\nexport interface CardProps\n extends HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof cardVariants> {}\n\nexport const Card = forwardRef<HTMLDivElement, CardProps>(\n ({ className, variant, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={cn(cardVariants({ variant }), className)}\n {...props}\n />\n )\n }\n)\n\nCard.displayName = 'Card'\n","import { type LabelHTMLAttributes, forwardRef } from 'react'\nimport { cn } from '../lib/cn'\n\nexport interface LabelProps extends LabelHTMLAttributes<HTMLLabelElement> {}\n\nexport const Label = forwardRef<HTMLLabelElement, LabelProps>(\n ({ className, ...props }, ref) => {\n return (\n <label\n ref={ref}\n className={cn(\n 'text-[10px] uppercase tracking-wider text-foreground-muted font-medium',\n className\n )}\n {...props}\n />\n )\n }\n)\n\nLabel.displayName = 'Label'\n","import { type HTMLAttributes, forwardRef } from 'react'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { cn } from '../lib/cn'\n\nconst separatorVariants = cva('', {\n variants: {\n orientation: {\n horizontal: 'h-px w-full bg-border-subtle',\n vertical: 'w-px h-full bg-border-subtle',\n },\n },\n defaultVariants: {\n orientation: 'horizontal',\n },\n})\n\nexport interface SeparatorProps\n extends HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof separatorVariants> {}\n\nexport const Separator = forwardRef<HTMLDivElement, SeparatorProps>(\n ({ className, orientation, ...props }, ref) => {\n return (\n <div\n ref={ref}\n role=\"separator\"\n className={cn(separatorVariants({ orientation }), className)}\n {...props}\n />\n )\n }\n)\n\nSeparator.displayName = 'Separator'\n","import { type HTMLAttributes, forwardRef } from 'react'\nimport { cn } from '../lib/cn'\n\nexport interface SkeletonProps extends HTMLAttributes<HTMLDivElement> {}\n\nexport const Skeleton = forwardRef<HTMLDivElement, SkeletonProps>(\n ({ className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={cn('animate-pulse bg-surface-hover rounded-md h-4 w-full', className)}\n {...props}\n />\n )\n }\n)\n\nSkeleton.displayName = 'Skeleton'\n","import { type InputHTMLAttributes, type ReactNode, forwardRef } from 'react'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { cn } from '../lib/cn'\n\nconst inputVariants = cva(\n 'h-7 w-full px-2.5 text-xs bg-surface border rounded-md text-foreground placeholder:text-foreground-subtle focus:outline-none focus:ring-1 focus:ring-primary transition-colors',\n {\n variants: {\n state: {\n default: 'border-border',\n error: 'border-danger',\n },\n },\n defaultVariants: {\n state: 'default',\n },\n }\n)\n\nexport interface InputProps\n extends InputHTMLAttributes<HTMLInputElement>,\n VariantProps<typeof inputVariants> {\n leftSlot?: ReactNode\n rightSlot?: ReactNode\n}\n\nexport const Input = forwardRef<HTMLInputElement, InputProps>(\n ({ className, state, leftSlot, rightSlot, ...props }, ref) => {\n if (leftSlot || rightSlot) {\n return (\n <div className=\"relative flex items-center w-full\">\n {leftSlot && (\n <div className=\"absolute left-2.5 flex items-center pointer-events-none\">\n {leftSlot}\n </div>\n )}\n <input\n ref={ref}\n className={cn(\n inputVariants({ state }),\n leftSlot ? 'pl-7' : '',\n rightSlot ? 'pr-7' : '',\n className\n )}\n {...props}\n />\n {rightSlot && (\n <div className=\"absolute right-2.5 flex items-center pointer-events-none\">\n {rightSlot}\n </div>\n )}\n </div>\n )\n }\n\n return (\n <input\n ref={ref}\n className={cn(inputVariants({ state }), className)}\n {...props}\n />\n )\n }\n)\n\nInput.displayName = 'Input'\n","import { type SelectHTMLAttributes, forwardRef } from 'react'\nimport { ChevronDown } from 'lucide-react'\nimport { cn } from '../lib/cn'\n\nexport interface SelectOption {\n value: string\n label: string\n}\n\nexport interface SelectProps extends SelectHTMLAttributes<HTMLSelectElement> {\n options: SelectOption[]\n}\n\nexport const Select = forwardRef<HTMLSelectElement, SelectProps>(\n ({ className, options, ...props }, ref) => {\n return (\n <div className=\"relative w-full\">\n <select\n ref={ref}\n className={cn(\n 'h-7 w-full px-2.5 text-xs bg-surface border border-border rounded-md text-foreground appearance-none pr-7 focus:outline-none focus:ring-1 focus:ring-primary',\n className\n )}\n {...props}\n >\n {options.map((option) => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </select>\n <div className=\"absolute right-2 top-1/2 -translate-y-1/2 pointer-events-none text-foreground-muted\">\n <ChevronDown className=\"h-3.5 w-3.5\" />\n </div>\n </div>\n )\n }\n)\n\nSelect.displayName = 'Select'\n","import { type InputHTMLAttributes, forwardRef } from 'react'\nimport { cn } from '../lib/cn'\n\nexport interface CheckboxProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'type'> {}\n\nexport const Checkbox = forwardRef<HTMLInputElement, CheckboxProps>(\n ({ className, ...props }, ref) => {\n return (\n <input\n ref={ref}\n type=\"checkbox\"\n className={cn(\n 'w-3.5 h-3.5 rounded-sm border border-border accent-primary',\n className\n )}\n {...props}\n />\n )\n }\n)\n\nCheckbox.displayName = 'Checkbox'\n","import { type ButtonHTMLAttributes, forwardRef } from 'react'\nimport { cn } from '../lib/cn'\n\nexport interface SwitchProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'onClick'> {\n checked: boolean\n onCheckedChange: (checked: boolean) => void\n label?: string\n}\n\nexport const Switch = forwardRef<HTMLButtonElement, SwitchProps>(\n ({ className, checked, onCheckedChange, label, ...props }, ref) => {\n return (\n <button\n ref={ref}\n role=\"switch\"\n aria-checked={checked}\n type=\"button\"\n onClick={() => onCheckedChange(!checked)}\n className={cn('inline-flex items-center gap-2', className)}\n {...props}\n >\n <span\n className={cn(\n 'w-8 h-4 rounded-full transition-colors',\n checked ? 'bg-primary' : 'bg-surface-hover'\n )}\n >\n <span\n className={cn(\n 'block w-3.5 h-3.5 rounded-full bg-white transition-transform',\n checked ? 'translate-x-4' : 'translate-x-0.5'\n )}\n />\n </span>\n {label && <span className=\"text-xs text-foreground\">{label}</span>}\n </button>\n )\n }\n)\n\nSwitch.displayName = 'Switch'\n","import {\n type HTMLAttributes,\n type ReactNode,\n createContext,\n forwardRef,\n useCallback,\n useContext,\n useEffect,\n useId,\n useRef,\n useState,\n} from 'react'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { cn } from '../lib/cn'\n\ninterface DialogContextValue {\n open: boolean\n setOpen: (open: boolean) => void\n contentId: string\n}\n\nconst DialogContext = createContext<DialogContextValue | null>(null)\n\nfunction useDialogContext() {\n const ctx = useContext(DialogContext)\n if (!ctx) throw new Error('Dialog compound components must be used within <Dialog>')\n return ctx\n}\n\n/* ── Root ── */\n\ninterface DialogProps {\n children: ReactNode\n open?: boolean\n onOpenChange?: (open: boolean) => void\n}\n\nexport function Dialog({ children, open: controlledOpen, onOpenChange }: DialogProps) {\n const [uncontrolledOpen, setUncontrolledOpen] = useState(false)\n const open = controlledOpen ?? uncontrolledOpen\n const contentId = useId()\n\n const setOpen = useCallback(\n (next: boolean) => {\n onOpenChange?.(next)\n if (controlledOpen === undefined) setUncontrolledOpen(next)\n },\n [controlledOpen, onOpenChange]\n )\n\n return (\n <DialogContext.Provider value={{ open, setOpen, contentId }}>\n {children}\n </DialogContext.Provider>\n )\n}\n\n/* ── Trigger ── */\n\nexport function DialogTrigger({ children, ...props }: HTMLAttributes<HTMLButtonElement>) {\n const { setOpen } = useDialogContext()\n return (\n <button type=\"button\" onClick={() => setOpen(true)} {...props}>\n {children}\n </button>\n )\n}\n\n/* ── Content ── */\n\nconst contentVariants = cva(\n 'bg-background-elevated border border-border rounded-lg p-4 backdrop:bg-black/50 backdrop:backdrop-blur-sm',\n {\n variants: {\n width: {\n sm: 'max-w-sm',\n md: 'max-w-md',\n lg: 'max-w-lg',\n },\n },\n defaultVariants: { width: 'md' },\n }\n)\n\nexport interface DialogContentProps\n extends HTMLAttributes<HTMLDialogElement>,\n VariantProps<typeof contentVariants> {}\n\nexport const DialogContent = forwardRef<HTMLDialogElement, DialogContentProps>(\n ({ className, width, children, ...props }, ref) => {\n const { open, setOpen, contentId } = useDialogContext()\n const innerRef = useRef<HTMLDialogElement>(null)\n const dialogRef = (ref as React.RefObject<HTMLDialogElement>) ?? innerRef\n\n useEffect(() => {\n const el = dialogRef.current\n if (!el) return\n if (open && !el.open) el.showModal()\n if (!open && el.open) el.close()\n }, [open, dialogRef])\n\n const handleClick = (e: React.MouseEvent<HTMLDialogElement>) => {\n if (e.target === e.currentTarget) setOpen(false)\n }\n\n return (\n <dialog\n ref={dialogRef}\n id={contentId}\n className={cn(contentVariants({ width }), 'w-full', className)}\n onClick={handleClick}\n onClose={() => setOpen(false)}\n {...props}\n >\n {children}\n </dialog>\n )\n }\n)\n\nDialogContent.displayName = 'DialogContent'\n\n/* ── Header / Footer / Title / Description ── */\n\nexport function DialogHeader({ className, ...props }: HTMLAttributes<HTMLDivElement>) {\n return <div className={cn('flex flex-col gap-1 mb-3', className)} {...props} />\n}\n\nexport function DialogFooter({ className, ...props }: HTMLAttributes<HTMLDivElement>) {\n return <div className={cn('flex justify-end gap-2 mt-4', className)} {...props} />\n}\n\nexport function DialogTitle({ className, ...props }: HTMLAttributes<HTMLHeadingElement>) {\n return <h2 className={cn('text-sm font-semibold text-foreground', className)} {...props} />\n}\n\nexport function DialogDescription({ className, ...props }: HTMLAttributes<HTMLParagraphElement>) {\n return <p className={cn('text-xs text-foreground-muted', className)} {...props} />\n}\n","import {\n type ButtonHTMLAttributes,\n type HTMLAttributes,\n type ReactNode,\n createContext,\n useCallback,\n useContext,\n useEffect,\n useId,\n useRef,\n useState,\n} from 'react'\nimport { type LucideIcon } from 'lucide-react'\nimport { cn } from '../lib/cn'\n\ninterface DropdownContextValue {\n open: boolean\n setOpen: (open: boolean) => void\n triggerId: string\n contentId: string\n}\n\nconst DropdownContext = createContext<DropdownContextValue | null>(null)\n\nfunction useDropdownContext() {\n const ctx = useContext(DropdownContext)\n if (!ctx) throw new Error('Dropdown compound components must be used within <Dropdown>')\n return ctx\n}\n\n/* ── Root ── */\n\nexport function Dropdown({ children }: { children: ReactNode }) {\n const [open, setOpen] = useState(false)\n const triggerId = useId()\n const contentId = useId()\n\n return (\n <DropdownContext.Provider value={{ open, setOpen, triggerId, contentId }}>\n <div className=\"relative inline-block\">{children}</div>\n </DropdownContext.Provider>\n )\n}\n\n/* ── Trigger ── */\n\nexport function DropdownTrigger({ children, ...props }: ButtonHTMLAttributes<HTMLButtonElement>) {\n const { open, setOpen, triggerId, contentId } = useDropdownContext()\n return (\n <button\n type=\"button\"\n id={triggerId}\n aria-haspopup=\"menu\"\n aria-expanded={open}\n aria-controls={open ? contentId : undefined}\n onClick={() => setOpen(!open)}\n {...props}\n >\n {children}\n </button>\n )\n}\n\n/* ── Content ── */\n\nexport function DropdownContent({ className, children, ...props }: HTMLAttributes<HTMLDivElement>) {\n const { open, setOpen, contentId, triggerId } = useDropdownContext()\n const ref = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n if (!open) return\n const handler = (e: MouseEvent) => {\n const el = ref.current\n const trigger = document.getElementById(triggerId)\n if (el && !el.contains(e.target as Node) && !trigger?.contains(e.target as Node)) {\n setOpen(false)\n }\n }\n const escHandler = (e: KeyboardEvent) => {\n if (e.key === 'Escape') setOpen(false)\n }\n document.addEventListener('mousedown', handler)\n document.addEventListener('keydown', escHandler)\n return () => {\n document.removeEventListener('mousedown', handler)\n document.removeEventListener('keydown', escHandler)\n }\n }, [open, setOpen, triggerId])\n\n if (!open) return null\n\n return (\n <div\n ref={ref}\n id={contentId}\n role=\"menu\"\n aria-labelledby={triggerId}\n className={cn(\n 'absolute left-0 top-full z-50 mt-1 bg-background-elevated border border-border rounded-md shadow-lg py-1 min-w-[160px]',\n className\n )}\n {...props}\n >\n {children}\n </div>\n )\n}\n\n/* ── Item ── */\n\ninterface DropdownItemProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n icon?: LucideIcon\n variant?: 'default' | 'danger'\n}\n\nexport function DropdownItem({\n className,\n icon: Icon,\n variant = 'default',\n children,\n onClick,\n ...props\n}: DropdownItemProps) {\n const { setOpen } = useDropdownContext()\n\n const handleClick = useCallback(\n (e: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(e)\n setOpen(false)\n },\n [onClick, setOpen]\n )\n\n return (\n <button\n type=\"button\"\n role=\"menuitem\"\n className={cn(\n 'h-7 text-xs px-2 w-full text-left flex items-center gap-2',\n variant === 'danger'\n ? 'text-danger hover:bg-danger/10'\n : 'text-foreground hover:bg-surface-hover',\n className\n )}\n onClick={handleClick}\n {...props}\n >\n {Icon && <Icon size={14} />}\n {children}\n </button>\n )\n}\n","import {\n type HTMLAttributes,\n type ReactNode,\n createContext,\n useContext,\n useId,\n useRef,\n useState,\n} from 'react'\nimport { cn } from '../lib/cn'\n\ninterface TooltipContextValue {\n open: boolean\n show: () => void\n hide: () => void\n tooltipId: string\n}\n\nconst TooltipContext = createContext<TooltipContextValue | null>(null)\n\nfunction useTooltipContext() {\n const ctx = useContext(TooltipContext)\n if (!ctx) throw new Error('Tooltip compound components must be used within <Tooltip>')\n return ctx\n}\n\n/* ── Root ── */\n\nexport function Tooltip({ children }: { children: ReactNode }) {\n const [open, setOpen] = useState(false)\n const timerRef = useRef<ReturnType<typeof setTimeout>>(null)\n const tooltipId = useId()\n\n const show = () => {\n timerRef.current = setTimeout(() => setOpen(true), 300)\n }\n\n const hide = () => {\n if (timerRef.current) clearTimeout(timerRef.current)\n setOpen(false)\n }\n\n return (\n <TooltipContext.Provider value={{ open, show, hide, tooltipId }}>\n <div className=\"relative inline-block\">{children}</div>\n </TooltipContext.Provider>\n )\n}\n\n/* ── Trigger ── */\n\nexport function TooltipTrigger({ children, ...props }: HTMLAttributes<HTMLDivElement>) {\n const { show, hide, tooltipId, open } = useTooltipContext()\n\n return (\n <div\n onMouseEnter={show}\n onMouseLeave={hide}\n onFocus={show}\n onBlur={hide}\n aria-describedby={open ? tooltipId : undefined}\n {...props}\n >\n {children}\n </div>\n )\n}\n\n/* ── Content ── */\n\nexport function TooltipContent({ className, children, ...props }: HTMLAttributes<HTMLDivElement>) {\n const { open, tooltipId } = useTooltipContext()\n\n return (\n <div\n id={tooltipId}\n role=\"tooltip\"\n className={cn(\n 'absolute bottom-full left-1/2 -translate-x-1/2 mb-2 bg-foreground text-background text-xs px-2 py-1 rounded-md shadow-md whitespace-nowrap pointer-events-none transition-opacity duration-150',\n open ? 'opacity-100' : 'opacity-0',\n className\n )}\n {...props}\n >\n {children}\n </div>\n )\n}\n","import {\n type ButtonHTMLAttributes,\n type HTMLAttributes,\n type ReactNode,\n createContext,\n useCallback,\n useContext,\n useEffect,\n useId,\n useRef,\n useState,\n} from 'react'\nimport { cn } from '../lib/cn'\n\ninterface PopoverContextValue {\n open: boolean\n setOpen: (open: boolean) => void\n triggerId: string\n contentId: string\n}\n\nconst PopoverContext = createContext<PopoverContextValue | null>(null)\n\nfunction usePopoverContext() {\n const ctx = useContext(PopoverContext)\n if (!ctx) throw new Error('Popover compound components must be used within <Popover>')\n return ctx\n}\n\n/* ── Root ── */\n\ninterface PopoverProps {\n children: ReactNode\n open?: boolean\n onOpenChange?: (open: boolean) => void\n}\n\nexport function Popover({ children, open: controlledOpen, onOpenChange }: PopoverProps) {\n const [uncontrolledOpen, setUncontrolledOpen] = useState(false)\n const open = controlledOpen ?? uncontrolledOpen\n const triggerId = useId()\n const contentId = useId()\n\n const setOpen = useCallback(\n (next: boolean) => {\n onOpenChange?.(next)\n if (controlledOpen === undefined) setUncontrolledOpen(next)\n },\n [controlledOpen, onOpenChange]\n )\n\n return (\n <PopoverContext.Provider value={{ open, setOpen, triggerId, contentId }}>\n <div className=\"relative inline-block\">{children}</div>\n </PopoverContext.Provider>\n )\n}\n\n/* ── Trigger ── */\n\nexport function PopoverTrigger({ children, ...props }: ButtonHTMLAttributes<HTMLButtonElement>) {\n const { open, setOpen, triggerId, contentId } = usePopoverContext()\n return (\n <button\n type=\"button\"\n id={triggerId}\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n aria-controls={open ? contentId : undefined}\n onClick={() => setOpen(!open)}\n {...props}\n >\n {children}\n </button>\n )\n}\n\n/* ── Content ── */\n\nexport function PopoverContent({ className, children, ...props }: HTMLAttributes<HTMLDivElement>) {\n const { open, setOpen, contentId, triggerId } = usePopoverContext()\n const ref = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n if (!open) return\n const handler = (e: MouseEvent) => {\n const el = ref.current\n const trigger = document.getElementById(triggerId)\n if (el && !el.contains(e.target as Node) && !trigger?.contains(e.target as Node)) {\n setOpen(false)\n }\n }\n const escHandler = (e: KeyboardEvent) => {\n if (e.key === 'Escape') setOpen(false)\n }\n document.addEventListener('mousedown', handler)\n document.addEventListener('keydown', escHandler)\n return () => {\n document.removeEventListener('mousedown', handler)\n document.removeEventListener('keydown', escHandler)\n }\n }, [open, setOpen, triggerId])\n\n if (!open) return null\n\n return (\n <div\n ref={ref}\n id={contentId}\n role=\"dialog\"\n aria-labelledby={triggerId}\n className={cn(\n 'absolute left-0 top-full z-50 mt-1 bg-background-elevated border border-border rounded-lg shadow-lg p-3',\n className\n )}\n {...props}\n >\n {children}\n </div>\n )\n}\n","import {\n type ButtonHTMLAttributes,\n type HTMLAttributes,\n type ReactNode,\n createContext,\n useCallback,\n useContext,\n useState,\n} from 'react'\nimport { cn } from '../lib/cn'\n\ninterface TabsContextValue {\n value: string\n setValue: (value: string) => void\n}\n\nconst TabsContext = createContext<TabsContextValue | null>(null)\n\nfunction useTabsContext() {\n const ctx = useContext(TabsContext)\n if (!ctx) throw new Error('Tabs compound components must be used within <Tabs>')\n return ctx\n}\n\n/* ── Root ── */\n\ninterface TabsProps extends HTMLAttributes<HTMLDivElement> {\n value?: string\n onValueChange?: (value: string) => void\n defaultValue?: string\n}\n\nexport function Tabs({\n value: controlledValue,\n onValueChange,\n defaultValue = '',\n className,\n ...props\n}: TabsProps) {\n const [uncontrolledValue, setUncontrolledValue] = useState(defaultValue)\n const value = controlledValue ?? uncontrolledValue\n\n const setValue = useCallback(\n (next: string) => {\n onValueChange?.(next)\n if (controlledValue === undefined) setUncontrolledValue(next)\n },\n [controlledValue, onValueChange]\n )\n\n return (\n <TabsContext.Provider value={{ value, setValue }}>\n <div className={className} {...props} />\n </TabsContext.Provider>\n )\n}\n\n/* ── TabsList ── */\n\nexport function TabsList({ className, ...props }: HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n role=\"tablist\"\n className={cn('flex flex-row border-b border-border-subtle', className)}\n {...props}\n />\n )\n}\n\n/* ── TabsTrigger ── */\n\ninterface TabsTriggerProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n value: string\n}\n\nexport function TabsTrigger({ value, className, ...props }: TabsTriggerProps) {\n const { value: activeValue, setValue } = useTabsContext()\n const isActive = value === activeValue\n const panelId = `tabpanel-${value}`\n\n return (\n <button\n type=\"button\"\n role=\"tab\"\n aria-selected={isActive}\n aria-controls={panelId}\n tabIndex={isActive ? 0 : -1}\n className={cn(\n 'h-7 text-xs px-3 transition-colors',\n isActive\n ? 'border-b-2 border-primary text-foreground font-medium'\n : 'text-foreground-muted hover:text-foreground',\n className\n )}\n onClick={() => setValue(value)}\n {...props}\n />\n )\n}\n\n/* ── TabsContent ── */\n\ninterface TabsContentProps extends HTMLAttributes<HTMLDivElement> {\n value: string\n}\n\nexport function TabsContent({ value, className, ...props }: TabsContentProps) {\n const { value: activeValue } = useTabsContext()\n if (value !== activeValue) return null\n\n return (\n <div\n role=\"tabpanel\"\n id={`tabpanel-${value}`}\n className={cn('pt-3', className)}\n {...props}\n />\n )\n}\n","import { type HTMLAttributes, forwardRef } from 'react'\nimport { cn } from '../lib/cn'\n\nexport interface ScrollAreaProps extends HTMLAttributes<HTMLDivElement> {}\n\nexport const ScrollArea = forwardRef<HTMLDivElement, ScrollAreaProps>(\n ({ className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={cn(\n 'overflow-auto [&::-webkit-scrollbar]:w-1 [&::-webkit-scrollbar-track]:bg-transparent [&::-webkit-scrollbar-thumb]:bg-surface-hover [&::-webkit-scrollbar-thumb]:rounded-full',\n className\n )}\n {...props}\n />\n )\n }\n)\n\nScrollArea.displayName = 'ScrollArea'\n","import { useRef, useState, useCallback, useEffect, type ReactNode } from 'react';\nimport { X, Minimize2, Maximize2, GripHorizontal } from 'lucide-react';\nimport { cn } from '../lib/cn';\n\nexport interface FloatingPanelProps {\n /** Panel title displayed in the title bar */\n title: string;\n /** Called when the close button is clicked */\n onClose: () => void;\n /** Panel content */\n children: ReactNode;\n /** Default width in pixels */\n defaultWidth?: number;\n /** Default height in pixels */\n defaultHeight?: number;\n /** Minimum width in pixels */\n minWidth?: number;\n /** Minimum height in pixels */\n minHeight?: number;\n /** Offset index to stagger multiple panels (adds 30px offset per index) */\n offsetIndex?: number;\n /** Additional CSS classes for the panel container */\n className?: string;\n}\n\nexport function FloatingPanel({\n title,\n onClose,\n children,\n defaultWidth = 360,\n defaultHeight = 280,\n minWidth = 280,\n minHeight = 160,\n offsetIndex = 0,\n className,\n}: FloatingPanelProps) {\n const [pos, setPos] = useState({ x: 80 + offsetIndex * 30, y: 80 + offsetIndex * 30 });\n const [size, setSize] = useState({ w: defaultWidth, h: defaultHeight });\n const [minimized, setMinimized] = useState(false);\n const dragging = useRef(false);\n const resizing = useRef(false);\n const offset = useRef({ x: 0, y: 0 });\n\n const onDragStart = useCallback((e: React.MouseEvent) => {\n e.preventDefault();\n dragging.current = true;\n offset.current = { x: e.clientX - pos.x, y: e.clientY - pos.y };\n }, [pos]);\n\n const onResizeStart = useCallback((e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n resizing.current = true;\n offset.current = { x: e.clientX, y: e.clientY };\n }, []);\n\n useEffect(() => {\n const onMouseMove = (e: MouseEvent) => {\n if (dragging.current) setPos({ x: e.clientX - offset.current.x, y: e.clientY - offset.current.y });\n if (resizing.current) {\n const dx = e.clientX - offset.current.x;\n const dy = e.clientY - offset.current.y;\n offset.current = { x: e.clientX, y: e.clientY };\n setSize(prev => ({ w: Math.max(minWidth, prev.w + dx), h: Math.max(minHeight, prev.h + dy) }));\n }\n };\n const onMouseUp = () => { dragging.current = false; resizing.current = false; };\n window.addEventListener('mousemove', onMouseMove);\n window.addEventListener('mouseup', onMouseUp);\n return () => { window.removeEventListener('mousemove', onMouseMove); window.removeEventListener('mouseup', onMouseUp); };\n }, [minWidth, minHeight]);\n\n return (\n <div\n className={cn(\n 'fixed z-50 rounded-lg border border-border bg-background-elevated shadow-2xl flex flex-col overflow-hidden',\n className\n )}\n style={{ left: pos.x, top: pos.y, width: minimized ? 280 : size.w, height: minimized ? 'auto' : size.h }}\n >\n {/* Title bar — draggable */}\n <div\n onMouseDown={onDragStart}\n className=\"flex items-center justify-between gap-2 px-3 py-2 border-b border-border cursor-move select-none shrink-0 bg-surface\"\n >\n <div className=\"flex items-center gap-2 min-w-0\">\n <GripHorizontal size={12} className=\"text-foreground-subtle shrink-0\" />\n <span className=\"text-[11px] font-medium truncate\">{title}</span>\n </div>\n <div className=\"flex items-center gap-1 shrink-0\">\n <button\n onClick={() => setMinimized(!minimized)}\n className=\"p-0.5 rounded hover:bg-surface-hover text-foreground-muted transition-colors\"\n title={minimized ? 'Restore' : 'Minimize'}\n >\n {minimized ? <Maximize2 size={12} /> : <Minimize2 size={12} />}\n </button>\n <button\n onClick={onClose}\n className=\"p-0.5 rounded hover:bg-danger/20 text-foreground-muted hover:text-danger transition-colors\"\n title=\"Close\"\n >\n <X size={12} />\n </button>\n </div>\n </div>\n\n {/* Content */}\n {!minimized && (\n <div className=\"flex-1 min-h-0 overflow-y-auto relative\">\n {children}\n {/* Resize handle */}\n <div\n onMouseDown={onResizeStart}\n className=\"absolute bottom-0 right-0 w-4 h-4 cursor-nwse-resize\"\n style={{ background: 'linear-gradient(135deg, transparent 50%, var(--color-foreground-subtle) 50%)', opacity: 0.4 }}\n />\n </div>\n )}\n </div>\n );\n}\n","import { cn } from '../lib/cn'\n\ntype Status = 'online' | 'offline' | 'degraded' | 'unknown'\n\nexport interface StatusBadgeProps {\n status: Status\n showDot?: boolean\n showLabel?: boolean\n size?: 'sm' | 'md'\n className?: string\n}\n\nconst statusConfig: Record<Status, { colorClass: string; label: string }> = {\n online: { colorClass: 'bg-success', label: 'Online' },\n offline: { colorClass: 'bg-danger', label: 'Offline' },\n degraded: { colorClass: 'bg-warning', label: 'Degraded' },\n unknown: { colorClass: 'bg-foreground-subtle', label: 'Unknown' },\n}\n\nexport function StatusBadge({\n status,\n showDot = true,\n showLabel = true,\n size = 'sm',\n className,\n}: StatusBadgeProps) {\n const config = statusConfig[status]\n\n return (\n <span\n className={cn(\n 'inline-flex items-center gap-1.5',\n size === 'sm' ? 'text-xs' : 'text-sm',\n className\n )}\n >\n {showDot && (\n <span\n className={cn('h-1.5 w-1.5 shrink-0 rounded-full', config.colorClass)}\n aria-hidden=\"true\"\n />\n )}\n {showLabel && (\n <span className=\"text-foreground\">{config.label}</span>\n )}\n </span>\n )\n}\n","import { cn } from '../lib/cn'\nimport type { ProviderType } from '../icons'\n\nexport interface ProviderBadgeProps {\n provider: ProviderType\n showLabel?: boolean\n className?: string\n}\n\nconst providerConfig: Record<ProviderType, { colorClass: string; label: string }> = {\n frigate: { colorClass: 'bg-provider-frigate', label: 'Frigate' },\n scrypted: { colorClass: 'bg-provider-scrypted', label: 'Scrypted' },\n reolink: { colorClass: 'bg-provider-reolink', label: 'Reolink' },\n homeAssistant: { colorClass: 'bg-provider-homeAssistant', label: 'Home Assistant' },\n rtsp: { colorClass: 'bg-provider-rtsp', label: 'RTSP' },\n}\n\nexport function ProviderBadge({\n provider,\n showLabel = true,\n className,\n}: ProviderBadgeProps) {\n const config = providerConfig[provider]\n\n return (\n <span className={cn('inline-flex items-center gap-1.5 text-xs', className)}>\n <span\n className={cn('h-1.5 w-1.5 shrink-0 rounded-sm', config.colorClass)}\n aria-hidden=\"true\"\n />\n {showLabel && (\n <span className=\"text-foreground\">{config.label}</span>\n )}\n </span>\n )\n}\n","import React from 'react'\nimport { cn } from '../lib/cn'\n\nexport type SemanticBadgeVariant = 'success' | 'warning' | 'danger' | 'info' | 'neutral'\n\nconst VARIANT_STYLES: Record<SemanticBadgeVariant, string> = {\n success: 'bg-emerald-400 text-emerald-950',\n warning: 'bg-amber-400 text-amber-950',\n danger: 'bg-red-400 text-red-950',\n info: 'bg-blue-400 text-blue-950',\n neutral: 'bg-foreground-subtle/20 text-foreground',\n}\n\nexport interface SemanticBadgeProps {\n children: React.ReactNode\n variant?: SemanticBadgeVariant\n /** Use monospace font (good for versions, codes) */\n mono?: boolean\n className?: string\n}\n\n/**\n * General-purpose badge with semantic color variants.\n * Solid background with dark text for maximum contrast.\n */\nexport function SemanticBadge({ children, variant = 'neutral', mono, className }: SemanticBadgeProps) {\n return (\n <span className={cn(\n 'inline-flex items-center rounded-md px-2 py-0.5 text-[11px] font-bold leading-tight',\n mono && 'font-mono',\n VARIANT_STYLES[variant],\n className,\n )}>\n {children}\n </span>\n )\n}\n\n// --- Convenience wrappers ---\n\nexport interface VersionBadgeProps {\n version: string\n preRelease?: boolean\n className?: string\n}\n\n/**\n * Version badge — auto-detects pre-release versions.\n * Stable = success (green), Pre-release = warning (amber).\n */\nexport function VersionBadge({ version, preRelease, className }: VersionBadgeProps) {\n const isPreRelease = preRelease ?? /-(alpha|beta|rc|dev|canary|next)/i.test(version)\n return (\n <SemanticBadge variant={isPreRelease ? 'warning' : 'success'} mono className={className}>\n {version}\n </SemanticBadge>\n )\n}\n","import { type ReactNode } from 'react'\nimport { cn } from '../lib/cn'\nimport { Label } from '../primitives'\n\nexport interface FormFieldProps {\n label: string\n description?: string\n error?: string\n required?: boolean\n children: ReactNode\n orientation?: 'vertical' | 'horizontal'\n className?: string\n}\n\nexport function FormField({\n label,\n description,\n error,\n required,\n children,\n orientation = 'vertical',\n className,\n}: FormFieldProps) {\n const isHorizontal = orientation === 'horizontal'\n\n return (\n <div\n className={cn(\n 'flex gap-2',\n isHorizontal ? 'flex-row items-center justify-between' : 'flex-col',\n className\n )}\n >\n <div className={cn(isHorizontal ? 'flex-1' : '')}>\n <Label>\n {label}\n {required && <span className=\"text-danger ml-0.5\">*</span>}\n </Label>\n {description && (\n <p className=\"text-foreground-subtle text-xs mt-0.5\">{description}</p>\n )}\n </div>\n <div className={cn(isHorizontal ? 'shrink-0' : '')}>\n {children}\n </div>\n {error && (\n <p className=\"text-danger text-xs\">{error}</p>\n )}\n </div>\n )\n}\n","import { type ReactNode } from 'react'\nimport { cn } from '../lib/cn'\n\nexport interface PageHeaderProps {\n title: string\n subtitle?: string\n actions?: ReactNode\n className?: string\n}\n\nexport function PageHeader({ title, subtitle, actions, className }: PageHeaderProps) {\n return (\n <div className={cn('flex items-center justify-between mb-3', className)}>\n <div>\n <h1 className=\"text-sm font-semibold text-foreground\">{title}</h1>\n {subtitle && (\n <p className=\"text-foreground-subtle text-xs\">{subtitle}</p>\n )}\n </div>\n {actions && <div className=\"flex items-center gap-2\">{actions}</div>}\n </div>\n )\n}\n","import { type ReactNode } from 'react'\nimport { type LucideIcon } from 'lucide-react'\nimport { cn } from '../lib/cn'\n\nexport interface EmptyStateProps {\n icon?: LucideIcon\n title: string\n description?: string\n action?: ReactNode\n className?: string\n}\n\nexport function EmptyState({\n icon: Icon,\n title,\n description,\n action,\n className,\n}: EmptyStateProps) {\n return (\n <div className={cn('flex flex-col items-center justify-center gap-3 py-12', className)}>\n {Icon && (\n <Icon className=\"h-12 w-12 text-foreground-subtle\" aria-hidden=\"true\" />\n )}\n <div className=\"flex flex-col items-center gap-1 text-center\">\n <p className=\"text-foreground-muted text-sm font-medium\">{title}</p>\n {description && (\n <p className=\"text-foreground-subtle text-xs max-w-xs\">{description}</p>\n )}\n </div>\n {action && <div className=\"mt-1\">{action}</div>}\n </div>\n )\n}\n","import {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogDescription,\n DialogFooter,\n Button,\n} from '../primitives'\n\nexport interface ConfirmDialogProps {\n title: string\n message: string\n confirmLabel?: string\n cancelLabel?: string\n onConfirm: () => void\n onCancel: () => void\n variant?: 'danger' | 'default'\n open: boolean\n onOpenChange: (open: boolean) => void\n}\n\nexport function ConfirmDialog({\n title,\n message,\n confirmLabel = 'Confirm',\n cancelLabel = 'Cancel',\n onConfirm,\n onCancel,\n variant = 'default',\n open,\n onOpenChange,\n}: ConfirmDialogProps) {\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>{title}</DialogTitle>\n <DialogDescription>{message}</DialogDescription>\n </DialogHeader>\n <DialogFooter>\n <Button variant=\"ghost\" onClick={onCancel}>\n {cancelLabel}\n </Button>\n <Button\n variant={variant === 'danger' ? 'danger' : 'primary'}\n onClick={onConfirm}\n >\n {confirmLabel}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n )\n}\n","import { TrendingUp, TrendingDown } from 'lucide-react'\nimport { cn } from '../lib/cn'\nimport { Card } from '../primitives'\n\nexport interface StatCardProps {\n value: string | number\n label: string\n trend?: { value: number; direction: 'up' | 'down' }\n className?: string\n}\n\nexport function StatCard({ value, label, trend, className }: StatCardProps) {\n return (\n <Card className={cn('flex flex-col gap-1', className)}>\n <div className=\"flex items-baseline gap-2\">\n <span className=\"text-2xl font-semibold text-foreground\">{value}</span>\n {trend && (\n <span\n className={cn(\n 'inline-flex items-center gap-0.5 text-xs font-medium',\n trend.direction === 'up' ? 'text-success' : 'text-danger'\n )}\n >\n {trend.direction === 'up' ? (\n <TrendingUp className=\"h-3 w-3\" />\n ) : (\n <TrendingDown className=\"h-3 w-3\" />\n )}\n {trend.value}%\n </span>\n )}\n </div>\n <span className=\"text-xs text-foreground-muted\">{label}</span>\n </Card>\n )\n}\n","import { type ReactNode } from 'react'\nimport { cn } from '../lib/cn'\n\nexport interface KeyValueListProps {\n items: { key: string; value: ReactNode }[]\n className?: string\n}\n\nexport function KeyValueList({ items, className }: KeyValueListProps) {\n return (\n <dl className={cn('flex flex-col', className)}>\n {items.map((item) => (\n <div\n key={item.key}\n className=\"flex items-center h-7\"\n >\n <dt className=\"text-foreground-subtle text-xs w-1/3 shrink-0\">\n {item.key}\n </dt>\n <dd className=\"text-foreground text-xs\">{item.value}</dd>\n </div>\n ))}\n </dl>\n )\n}\n","import { useCallback, useState } from 'react'\nimport { Copy, Check } from 'lucide-react'\nimport { cn } from '../lib/cn'\nimport { ScrollArea, IconButton } from '../primitives'\n\nexport interface CodeBlockProps {\n children: string\n maxHeight?: number\n className?: string\n}\n\nexport function CodeBlock({ children, maxHeight = 300, className }: CodeBlockProps) {\n const [copied, setCopied] = useState(false)\n\n const handleCopy = useCallback(() => {\n navigator.clipboard.writeText(children).then(() => {\n setCopied(true)\n setTimeout(() => setCopied(false), 2000)\n })\n }, [children])\n\n return (\n <div className={cn('relative group', className)}>\n <ScrollArea style={{ maxHeight }}>\n <pre className=\"font-mono text-xs bg-surface p-3 rounded-md border border-border-subtle\">\n <code>{children}</code>\n </pre>\n </ScrollArea>\n <div className=\"absolute top-2 right-2 opacity-0 group-hover:opacity-100 transition-opacity\">\n <IconButton\n icon={copied ? Check : Copy}\n aria-label=\"Copy code\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={handleCopy}\n />\n </div>\n </div>\n )\n}\n","import { Search } from 'lucide-react'\nimport { cn } from '../lib/cn'\nimport { Input, Select, Badge } from '../primitives'\n\ntype FilterDef =\n | { type: 'search'; key: string; placeholder?: string }\n | { type: 'select'; key: string; label: string; options: { value: string; label: string }[] }\n | { type: 'badge-toggle'; key: string; options: { value: string; label: string }[] }\n\nexport type { FilterDef }\n\nexport interface FilterBarProps {\n filters: FilterDef[]\n values: Record<string, unknown>\n onChange: (values: Record<string, unknown>) => void\n className?: string\n}\n\nexport function FilterBar({ filters, values, onChange, className }: FilterBarProps) {\n const handleChange = (key: string, value: unknown) => {\n onChange({ ...values, [key]: value })\n }\n\n return (\n <div className={cn('flex items-center gap-2 flex-wrap', className)}>\n {filters.map((filter) => {\n switch (filter.type) {\n case 'search':\n return (\n <Input\n key={filter.key}\n placeholder={filter.placeholder ?? 'Search...'}\n value={(values[filter.key] as string) ?? ''}\n onChange={(e) => handleChange(filter.key, e.target.value)}\n leftSlot={<Search className=\"h-3 w-3 text-foreground-subtle\" />}\n className=\"w-48\"\n />\n )\n\n case 'select':\n return (\n <Select\n key={filter.key}\n options={filter.options}\n value={(values[filter.key] as string) ?? ''}\n onChange={(e) => handleChange(filter.key, e.target.value)}\n className=\"w-36\"\n />\n )\n\n case 'badge-toggle':\n return (\n <div key={filter.key} className=\"flex items-center gap-1\">\n {filter.options.map((option) => {\n const currentValue = values[filter.key]\n const isActive = currentValue === option.value\n\n return (\n <button\n key={option.value}\n type=\"button\"\n onClick={() =>\n handleChange(\n filter.key,\n isActive ? undefined : option.value\n )\n }\n >\n <Badge\n variant={isActive ? 'info' : 'default'}\n className=\"cursor-pointer\"\n >\n {option.label}\n </Badge>\n </button>\n )\n })}\n </div>\n )\n\n default:\n return null\n }\n })}\n </div>\n )\n}\n","import { type LucideIcon } from 'lucide-react'\nimport { cn } from '../../lib/cn'\nimport { Badge } from '../../primitives'\n\nexport interface SidebarItemProps {\n label: string\n icon: LucideIcon\n href: string\n badge?: string | number\n active?: boolean\n className?: string\n}\n\nexport function SidebarItem({\n label,\n icon: Icon,\n href,\n badge,\n active = false,\n className,\n}: SidebarItemProps) {\n return (\n <a\n href={href}\n className={cn(\n 'flex items-center gap-2 h-7 px-2 text-[11px] transition-colors',\n active\n ? 'border-l-2 border-primary bg-primary/[0.08] text-foreground rounded-r-md'\n : 'text-foreground-subtle hover:bg-surface-hover rounded-md',\n className\n )}\n >\n <Icon className=\"h-3.5 w-3.5 shrink-0\" />\n <span className=\"truncate flex-1\">{label}</span>\n {badge !== undefined && (\n <Badge className=\"ml-auto text-[10px] px-1.5 py-0\">{badge}</Badge>\n )}\n </a>\n )\n}\n","import { type ReactNode } from 'react'\nimport { cn } from '../../lib/cn'\nimport { Separator } from '../../primitives'\nimport { SidebarItem, type SidebarItemProps } from './sidebar-item'\n\nexport interface SidebarSection {\n label?: string\n items: SidebarItemProps[]\n}\n\nexport interface SidebarProps {\n logo?: ReactNode\n sections: SidebarSection[]\n footer?: SidebarItemProps[]\n className?: string\n}\n\nexport function Sidebar({ logo, sections, footer, className }: SidebarProps) {\n return (\n <nav\n className={cn(\n 'w-44 bg-surface border-r border-border h-full flex flex-col',\n className\n )}\n >\n {logo && <div className=\"px-3 py-2 shrink-0\">{logo}</div>}\n\n <div className=\"flex-1 overflow-auto px-1 py-1\">\n {sections.map((section, sectionIndex) => (\n <div key={sectionIndex} className={cn(sectionIndex > 0 ? 'mt-3' : '')}>\n {section.label && (\n <span className=\"text-[10px] text-foreground-disabled uppercase tracking-wider px-2 mb-1 block\">\n {section.label}\n </span>\n )}\n <div className=\"flex flex-col gap-0.5\">\n {section.items.map((item) => (\n <SidebarItem key={item.href} {...item} />\n ))}\n </div>\n </div>\n ))}\n </div>\n\n {footer && footer.length > 0 && (\n <div className=\"shrink-0 px-1 pb-1\">\n <Separator className=\"mb-1\" />\n <div className=\"flex flex-col gap-0.5\">\n {footer.map((item) => (\n <SidebarItem key={item.href} {...item} />\n ))}\n </div>\n </div>\n )}\n </nav>\n )\n}\n","import { type ReactNode } from 'react'\nimport { ChevronRight } from 'lucide-react'\nimport { cn } from '../../lib/cn'\nimport { Sidebar, type SidebarProps } from './sidebar'\n\nexport interface AppShellProps {\n sidebar: SidebarProps\n header?: {\n breadcrumbs?: { label: string; href?: string }[]\n actions?: ReactNode\n }\n children: ReactNode\n className?: string\n}\n\nexport function AppShell({ sidebar, header, children, className }: AppShellProps) {\n return (\n <div className={cn('flex h-screen', className)}>\n <Sidebar {...sidebar} />\n\n <div className=\"flex flex-1 flex-col min-w-0\">\n {header && (\n <header className=\"flex items-center h-10 border-b border-border px-4 shrink-0\">\n {header.breadcrumbs && header.breadcrumbs.length > 0 && (\n <nav className=\"flex items-center gap-1 text-xs flex-1 min-w-0\">\n {header.breadcrumbs.map((crumb, index) => {\n const isLast = index === header.breadcrumbs!.length - 1\n return (\n <span key={index} className=\"flex items-center gap-1\">\n {index > 0 && (\n <ChevronRight className=\"h-3 w-3 text-foreground-subtle shrink-0\" />\n )}\n {crumb.href && !isLast ? (\n <a\n href={crumb.href}\n className=\"text-foreground-subtle hover:text-foreground transition-colors truncate\"\n >\n {crumb.label}\n </a>\n ) : (\n <span className=\"text-foreground truncate\">{crumb.label}</span>\n )}\n </span>\n )\n })}\n </nav>\n )}\n {header.actions && (\n <div className=\"flex items-center gap-2 ml-auto shrink-0\">\n {header.actions}\n </div>\n )}\n </header>\n )}\n\n <main className=\"flex-1 overflow-auto p-4\">{children}</main>\n </div>\n </div>\n )\n}\n","import { useMemo } from 'react'\nimport {\n useReactTable,\n getCoreRowModel,\n getSortedRowModel,\n getFilteredRowModel,\n getPaginationRowModel,\n flexRender,\n type ColumnDef,\n} from '@tanstack/react-table'\nimport { cn } from '../../lib/cn'\nimport { Skeleton } from '../../primitives/skeleton'\nimport { Checkbox } from '../../primitives/checkbox'\nimport { DataTableHeader } from './data-table-header'\nimport { DataTableRow } from './data-table-row'\nimport { DataTablePagination } from './data-table-pagination'\nimport type { DataTableProps } from './types'\n\nexport function DataTable<T>({\n data,\n columns: userColumns,\n sorting,\n onSortingChange,\n filtering,\n onFilteringChange,\n pagination,\n onPaginationChange,\n loading = false,\n emptyState,\n rowActions,\n onRowClick,\n selectable = false,\n compact = true,\n stickyHeader = false,\n className,\n}: DataTableProps<T>) {\n const columns = useMemo(() => {\n if (!selectable) return userColumns\n\n const selectColumn: ColumnDef<T, unknown> = {\n id: '__select',\n header: ({ table }) => (\n <Checkbox\n checked={table.getIsAllPageRowsSelected()}\n onChange={table.getToggleAllPageRowsSelectedHandler()}\n aria-label=\"Select all\"\n />\n ),\n cell: ({ row }) => (\n <Checkbox\n checked={row.getIsSelected()}\n onChange={row.getToggleSelectedHandler()}\n aria-label=\"Select row\"\n />\n ),\n enableSorting: false,\n }\n\n return [selectColumn, ...userColumns]\n }, [userColumns, selectable])\n\n const table = useReactTable({\n data,\n columns,\n state: {\n ...(sorting !== undefined && { sorting }),\n ...(filtering !== undefined && { columnFilters: filtering }),\n ...(pagination !== undefined && {\n pagination: { pageIndex: pagination.page, pageSize: pagination.pageSize },\n }),\n },\n onSortingChange: onSortingChange\n ? (updater) => {\n const next = typeof updater === 'function' ? updater(sorting ?? []) : updater\n onSortingChange(next)\n }\n : undefined,\n onColumnFiltersChange: onFilteringChange\n ? (updater) => {\n const next = typeof updater === 'function' ? updater(filtering ?? []) : updater\n onFilteringChange(next)\n }\n : undefined,\n getCoreRowModel: getCoreRowModel(),\n getSortedRowModel: getSortedRowModel(),\n getFilteredRowModel: getFilteredRowModel(),\n getPaginationRowModel: pagination ? getPaginationRowModel() : undefined,\n manualPagination: pagination !== undefined,\n pageCount: pagination ? Math.ceil(pagination.total / pagination.pageSize) : undefined,\n })\n\n const hasActions = !!rowActions\n\n return (\n <div className={cn('overflow-auto', className)}>\n <table className=\"w-full border-collapse\">\n <DataTableHeader\n headerGroups={table.getHeaderGroups()}\n onSortingChange={onSortingChange}\n stickyHeader={stickyHeader}\n flexRender={flexRender}\n />\n <tbody>\n {loading ? (\n <LoadingRows colSpan={columns.length + (hasActions ? 1 : 0)} compact={compact} />\n ) : table.getRowModel().rows.length === 0 ? (\n <tr>\n <td\n colSpan={columns.length + (hasActions ? 1 : 0)}\n className=\"text-center py-8 text-xs text-foreground-muted\"\n >\n {emptyState ?? 'No data'}\n </td>\n </tr>\n ) : (\n table.getRowModel().rows.map((row) => (\n <DataTableRow\n key={row.id}\n row={row}\n onRowClick={onRowClick}\n rowActions={rowActions}\n flexRender={flexRender}\n />\n ))\n )}\n </tbody>\n </table>\n {pagination && (\n <DataTablePagination\n page={pagination.page}\n pageSize={pagination.pageSize}\n total={pagination.total}\n onPaginationChange={onPaginationChange}\n />\n )}\n </div>\n )\n}\n\nfunction LoadingRows({ colSpan, compact }: { colSpan: number; compact: boolean }) {\n return (\n <>\n {Array.from({ length: 5 }).map((_, rowIdx) => (\n <tr key={rowIdx} className={compact ? 'h-7' : 'h-9'}>\n {Array.from({ length: colSpan }).map((_, colIdx) => (\n <td key={colIdx} className=\"px-2 py-1.5\">\n <Skeleton className=\"h-3 w-full\" />\n </td>\n ))}\n </tr>\n ))}\n </>\n )\n}\n","import type { HeaderGroup, Header, flexRender } from '@tanstack/react-table'\nimport { ArrowUpDown, ArrowUp, ArrowDown } from 'lucide-react'\nimport { cn } from '../../lib/cn'\nimport type { SortingState } from './types'\n\ninterface DataTableHeaderProps<T> {\n headerGroups: HeaderGroup<T>[]\n onSortingChange?: (sorting: SortingState) => void\n stickyHeader?: boolean\n flexRender: typeof flexRender\n}\n\nexport function DataTableHeader<T>({\n headerGroups,\n onSortingChange,\n stickyHeader,\n flexRender: render,\n}: DataTableHeaderProps<T>) {\n return (\n <thead\n className={cn(\n stickyHeader && 'sticky top-0 z-10 bg-background',\n )}\n >\n {headerGroups.map((headerGroup) => (\n <tr key={headerGroup.id} className=\"h-6\">\n {headerGroup.headers.map((header) => (\n <HeaderCell\n key={header.id}\n header={header}\n sortable={header.column.getCanSort() && !!onSortingChange}\n flexRender={render}\n />\n ))}\n </tr>\n ))}\n </thead>\n )\n}\n\ninterface HeaderCellProps<T> {\n header: Header<T, unknown>\n sortable: boolean\n flexRender: typeof flexRender\n}\n\nfunction HeaderCell<T>({ header, sortable, flexRender: render }: HeaderCellProps<T>) {\n const sorted = header.column.getIsSorted()\n\n const SortIcon = sorted === 'asc' ? ArrowUp : sorted === 'desc' ? ArrowDown : ArrowUpDown\n\n return (\n <th\n className={cn(\n 'px-2 py-1 text-left text-[10px] text-foreground-subtle uppercase tracking-wider font-medium',\n sortable && 'cursor-pointer select-none',\n )}\n onClick={sortable ? header.column.getToggleSortingHandler() : undefined}\n >\n <span className=\"inline-flex items-center gap-1\">\n {header.isPlaceholder\n ? null\n : render(header.column.columnDef.header, header.getContext())}\n {sortable && <SortIcon className=\"h-3 w-3\" />}\n </span>\n </th>\n )\n}\n","import type { Row, Cell, flexRender } from '@tanstack/react-table'\nimport { MoreHorizontal } from 'lucide-react'\nimport { cn } from '../../lib/cn'\nimport { Dropdown, DropdownTrigger, DropdownContent, DropdownItem as DropdownMenuItem } from '../../primitives/dropdown'\nimport type { DataTableAction } from './types'\n\ninterface DataTableRowProps<T> {\n row: Row<T>\n onRowClick?: (row: T) => void\n rowActions?: (row: T) => DataTableAction[]\n flexRender: typeof flexRender\n}\n\nexport function DataTableRow<T>({\n row,\n onRowClick,\n rowActions,\n flexRender: render,\n}: DataTableRowProps<T>) {\n const actions = rowActions ? rowActions(row.original) : []\n\n return (\n <tr\n className={cn(\n 'h-7 border-b border-border/50',\n onRowClick && 'cursor-pointer',\n 'hover:bg-surface-hover',\n )}\n onClick={onRowClick ? () => onRowClick(row.original) : undefined}\n >\n {row.getVisibleCells().map((cell) => (\n <DataTableCell key={cell.id} cell={cell} flexRender={render} />\n ))}\n {actions.length > 0 && (\n <td className=\"px-2 py-1.5 w-8\">\n <Dropdown>\n <DropdownTrigger\n className=\"p-0.5 rounded hover:bg-surface-hover\"\n onClick={(e) => e.stopPropagation()}\n >\n <MoreHorizontal className=\"h-3.5 w-3.5 text-foreground-muted\" />\n </DropdownTrigger>\n <DropdownContent className=\"right-0 left-auto\">\n {actions.map((action) => (\n <DropdownMenuItem\n key={action.label}\n icon={action.icon}\n variant={action.variant}\n onClick={(e) => {\n e.stopPropagation()\n action.onClick()\n }}\n >\n {action.label}\n </DropdownMenuItem>\n ))}\n </DropdownContent>\n </Dropdown>\n </td>\n )}\n </tr>\n )\n}\n\ninterface DataTableCellProps<T> {\n cell: Cell<T, unknown>\n flexRender: typeof flexRender\n}\n\nfunction DataTableCell<T>({ cell, flexRender: render }: DataTableCellProps<T>) {\n return (\n <td className=\"px-2 py-1.5 text-xs text-foreground\">\n {render(cell.column.columnDef.cell, cell.getContext())}\n </td>\n )\n}\n","import { ChevronLeft, ChevronRight } from 'lucide-react'\nimport { IconButton } from '../../primitives/icon-button'\nimport { Select } from '../../primitives/select'\nimport type { PaginationState } from './types'\n\ninterface DataTablePaginationProps {\n page: number\n pageSize: number\n total: number\n onPaginationChange?: (pagination: PaginationState) => void\n}\n\nconst PAGE_SIZE_OPTIONS = [\n { value: '10', label: '10' },\n { value: '25', label: '25' },\n { value: '50', label: '50' },\n { value: '100', label: '100' },\n]\n\nexport function DataTablePagination({\n page,\n pageSize,\n total,\n onPaginationChange,\n}: DataTablePaginationProps) {\n const totalPages = Math.max(1, Math.ceil(total / pageSize))\n const currentPage = page + 1\n\n return (\n <div className=\"flex items-center justify-between px-2 py-2 text-xs text-foreground-muted\">\n <div className=\"flex items-center gap-2\">\n <span>Rows per page</span>\n <div className=\"w-16\">\n <Select\n options={PAGE_SIZE_OPTIONS}\n value={String(pageSize)}\n onChange={(e) =>\n onPaginationChange?.({\n pageIndex: 0,\n pageSize: Number(e.target.value),\n })\n }\n />\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n <span>\n Page {currentPage} of {totalPages}\n </span>\n <IconButton\n icon={ChevronLeft}\n aria-label=\"Previous page\"\n variant=\"ghost\"\n size=\"sm\"\n disabled={page <= 0}\n onClick={() =>\n onPaginationChange?.({ pageIndex: page - 1, pageSize })\n }\n />\n <IconButton\n icon={ChevronRight}\n aria-label=\"Next page\"\n variant=\"ghost\"\n size=\"sm\"\n disabled={currentPage >= totalPages}\n onClick={() =>\n onPaginationChange?.({ pageIndex: page + 1, pageSize })\n }\n />\n </div>\n </div>\n )\n}\n","import { type ReactNode } from 'react'\nimport { cn } from '../lib/cn'\n\nexport interface DeviceCardBadge {\n /** Badge label text */\n label: string\n /** Optional icon rendered before the label */\n icon?: ReactNode\n /** Click handler — makes the badge interactive */\n onClick?: () => void\n}\n\nexport interface DeviceCardAction {\n /** Icon to render */\n icon: ReactNode\n /** Tooltip / aria-label */\n label: string\n /** Click handler */\n onClick: () => void\n}\n\nexport interface DeviceCardProps {\n /** Primary title (e.g., device name) */\n title: string\n /** Secondary text (e.g., model, IP) */\n subtitle?: string\n /** Status: determines the color of the status dot */\n status?: 'online' | 'offline' | 'warning' | 'unknown'\n /** Whether this card is currently selected */\n selected?: boolean\n /** Click handler for the card body */\n onClick?: () => void\n /** Clickable badges (e.g., stream profiles) */\n badges?: DeviceCardBadge[]\n /** Action icons shown at the bottom (e.g., PTZ, events) */\n actions?: DeviceCardAction[]\n /** Content rendered at the bottom when status is offline (e.g., Connect button) */\n offlineAction?: ReactNode\n /** Additional CSS classes */\n className?: string\n}\n\nconst STATUS_COLORS = {\n online: 'bg-success',\n offline: 'bg-danger',\n warning: 'bg-warning',\n unknown: 'bg-foreground-subtle',\n} as const\n\nexport function DeviceCard({\n title,\n subtitle,\n status,\n selected,\n onClick,\n badges,\n actions,\n offlineAction,\n className,\n}: DeviceCardProps) {\n const isOffline = status === 'offline'\n\n return (\n <div\n onClick={onClick}\n className={cn(\n 'w-full rounded-lg border p-3 text-left transition-colors',\n onClick && 'cursor-pointer',\n selected\n ? 'border-primary bg-primary/10'\n : 'border-border bg-surface hover:bg-surface-hover',\n isOffline && !selected && 'opacity-50',\n className,\n )}\n >\n {/* Header: title + status dot */}\n <div className=\"flex items-center justify-between mb-2\">\n <span className=\"text-sm font-medium truncate\">{title}</span>\n {status && (\n <span className={cn('h-2 w-2 rounded-full shrink-0', STATUS_COLORS[status])} />\n )}\n </div>\n\n {/* Subtitle */}\n {subtitle && (\n <div className=\"text-[11px] text-foreground-muted\">{subtitle}</div>\n )}\n\n {/* Badges */}\n {badges && badges.length > 0 && (\n <div className=\"flex flex-wrap gap-1 mt-2\">\n {badges.map((badge, i) => {\n const cls = cn(\n 'rounded px-1.5 py-0.5 text-[10px] flex items-center gap-0.5',\n selected ? 'bg-primary/20' : 'bg-surface-hover',\n badge.onClick && 'hover:opacity-80 transition-opacity cursor-pointer',\n )\n return badge.onClick ? (\n <button\n key={i}\n onClick={(e) => { e.stopPropagation(); badge.onClick!(); }}\n className={cls}\n >\n {badge.icon}{badge.label}\n </button>\n ) : (\n <span key={i} className={cls}>\n {badge.icon}{badge.label}\n </span>\n )\n })}\n </div>\n )}\n\n {/* Actions (online) or offline action */}\n {!isOffline && actions && actions.length > 0 && (\n <div className=\"flex items-center gap-0.5 mt-2 -mb-1\">\n {actions.map((action, i) => (\n <button\n key={i}\n onClick={(e) => { e.stopPropagation(); action.onClick(); }}\n className=\"p-1 rounded hover:bg-surface-hover text-foreground-subtle hover:text-foreground transition-colors\"\n title={action.label}\n aria-label={action.label}\n >\n {action.icon}\n </button>\n ))}\n </div>\n )}\n\n {isOffline && offlineAction && (\n <div className=\"mt-2\" onClick={(e) => e.stopPropagation()}>\n {offlineAction}\n </div>\n )}\n </div>\n )\n}\n","import { type ReactNode } from 'react'\nimport { cn } from '../lib/cn'\n\nexport interface DeviceGridProps {\n /** Grid items */\n children: ReactNode\n /** Minimum card width in pixels (default 220) */\n minCardWidth?: number\n /** Gap between cards in Tailwind spacing units (default 3) */\n gap?: number\n /** Additional CSS classes */\n className?: string\n}\n\nexport function DeviceGrid({\n children,\n minCardWidth = 220,\n gap = 3,\n className,\n}: DeviceGridProps) {\n return (\n <div\n className={cn(\n 'p-4 overflow-y-auto flex-1 content-start',\n className,\n )}\n style={{\n display: 'grid',\n gridTemplateColumns: `repeat(auto-fill, minmax(${minCardWidth}px, 1fr))`,\n gap: `${gap * 4}px`,\n }}\n >\n {children}\n </div>\n )\n}\n","/**\n * PipelineStep — single step card in the pipeline builder.\n *\n * Driven entirely by PipelineAddonSchema. No hardcoded addon names or models.\n * Renders: colored left border, header with I/O class tags, expandable config\n * (Agent → Runtime → Backend → Model → Confidence), children recursively.\n */\nimport { useState } from 'react'\nimport { ChevronRight, ChevronDown } from 'lucide-react'\nimport type { PipelineSlot, PipelineAddonSchema, InferenceCapabilities, PipelineModelOption } from '@camstack/types'\nimport { cn } from '../lib/cn'\n\n// ---------------------------------------------------------------------------\n// Public interfaces\n// ---------------------------------------------------------------------------\n\nexport interface PipelineStepDisplayConfig {\n readonly addonId: string\n readonly addonName: string\n readonly slot: PipelineSlot\n readonly inputClasses: readonly string[]\n readonly outputClasses: readonly string[]\n readonly enabled: boolean\n readonly agentId: string\n readonly runtime: string\n readonly backend: string\n readonly modelId: string\n readonly confidence: number\n readonly classFilters: readonly string[]\n readonly children: readonly PipelineStepDisplayConfig[]\n}\n\nexport interface PipelineStepProps {\n readonly step: PipelineStepDisplayConfig\n readonly schema: PipelineAddonSchema | null\n /** Full schema map so children can look up their own schema */\n readonly allSchemas: ReadonlyMap<string, PipelineAddonSchema>\n readonly capabilities: InferenceCapabilities\n readonly depth?: number\n readonly onChange: (updated: PipelineStepDisplayConfig) => void\n readonly onDelete?: (addonId: string) => void\n readonly readOnly?: boolean\n}\n\n// ---------------------------------------------------------------------------\n// Border colors — per addon ID with fallback by slot\n// ---------------------------------------------------------------------------\n\nconst ADDON_COLORS: Record<string, string> = {\n 'object-detection': 'border-l-blue-500',\n 'motion-detection': 'border-l-amber-500',\n 'face-detection': 'border-l-purple-500',\n 'face-recognition': 'border-l-violet-500',\n 'plate-detection': 'border-l-pink-500',\n 'plate-recognition': 'border-l-rose-500',\n 'animal-classifier': 'border-l-lime-500',\n 'bird-nabirds-classifier': 'border-l-emerald-500',\n 'bird-global-classifier': 'border-l-teal-500',\n 'audio-classification': 'border-l-green-500',\n 'segmentation-refiner': 'border-l-cyan-500',\n}\n\nconst SLOT_FALLBACK: Record<string, string> = {\n detector: 'border-l-blue-500',\n cropper: 'border-l-purple-500',\n classifier: 'border-l-lime-500',\n refiner: 'border-l-cyan-500',\n}\n\nfunction borderColor(addonId: string, slot: string): string {\n return ADDON_COLORS[addonId] ?? SLOT_FALLBACK[slot] ?? 'border-l-primary'\n}\n\n// ---------------------------------------------------------------------------\n// Helpers — compute available backends + models for a specific step\n// ---------------------------------------------------------------------------\n\n/** Map backend id → required model format */\nconst BACKEND_FORMAT: Record<string, string> = {\n cpu: 'onnx', coreml: 'coreml', openvino: 'openvino',\n cuda: 'onnx', tensorrt: 'onnx', 'onnx-py': 'onnx', pytorch: 'pt',\n}\n\nfunction backendsForRuntime(\n runtime: string,\n caps: InferenceCapabilities,\n schema: PipelineAddonSchema | null,\n): readonly { id: string; label: string; available: boolean }[] {\n const allBackends = runtime === 'node' ? caps.runtimes.node.backends : caps.runtimes.python.backends\n if (!schema) return allBackends\n\n // Filter: only show backends for which at least one model has the required format\n const availableFormats = new Set<string>()\n for (const m of schema.models) {\n for (const fmt of Object.keys(m.formats as Record<string, unknown>)) {\n availableFormats.add(fmt)\n }\n }\n // Node.js always uses ONNX\n if (runtime === 'node') availableFormats.add('onnx')\n\n return allBackends.map(b => {\n const neededFormat = BACKEND_FORMAT[b.id] ?? 'onnx'\n const hasFormat = availableFormats.has(neededFormat)\n return { ...b, available: b.available && hasFormat }\n })\n}\n\nfunction modelsForStep(\n schema: PipelineAddonSchema | null,\n runtime: string,\n backend: string,\n caps: InferenceCapabilities,\n): readonly { id: string; name: string; downloaded: boolean }[] {\n if (!schema) return []\n const fmt = runtime === 'node'\n ? 'onnx'\n : ((caps.runtimes.python.backends.find(b => b.id === backend) as any)?.modelFormat ?? 'onnx')\n return schema.models\n .filter(m => (m.formats as Record<string, unknown>)[fmt])\n .map(m => ({\n id: m.id,\n name: m.name,\n downloaded: ((m.formats as Record<string, { downloaded?: boolean }>)[fmt])?.downloaded ?? false,\n }))\n}\n\nfunction runtimeOptions(caps: InferenceCapabilities): readonly { id: string; label: string; available: boolean }[] {\n const opts: { id: string; label: string; available: boolean }[] = [\n { id: 'node', label: 'Node.js (ONNX)', available: true },\n ]\n if (caps.runtimes.python.available && caps.runtimes.python.backends.some(b => b.available)) {\n opts.unshift({ id: 'python', label: 'Python', available: true })\n }\n return opts\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function PipelineStep({\n step,\n schema,\n allSchemas,\n capabilities,\n depth = 0,\n onChange,\n onDelete,\n readOnly = false,\n}: PipelineStepProps) {\n const [expanded, setExpanded] = useState(false)\n\n const color = borderColor(step.addonId, step.slot)\n const backends = backendsForRuntime(step.runtime, capabilities, schema)\n const rtOptions = runtimeOptions(capabilities)\n\n // Auto-correct: if the selected backend is not available, switch to the first available one\n const currentBackendAvailable = backends.find(b => b.id === step.backend)?.available ?? false\n if (!currentBackendAvailable && !readOnly) {\n const firstAvailable = backends.find(b => b.available)\n if (firstAvailable && firstAvailable.id !== step.backend) {\n // Defer the update to avoid render-during-render\n queueMicrotask(() => onChange({ ...step, backend: firstAvailable.id }))\n }\n }\n\n const models = modelsForStep(schema, step.runtime, step.backend, capabilities)\n\n // Auto-correct: if the selected model is not in the filtered list, switch to default or first\n if (models.length > 0 && !models.some(m => m.id === step.modelId) && !readOnly) {\n const defaultModel = schema?.defaultModelId ? models.find(m => m.id === schema.defaultModelId) : null\n const fallback = defaultModel ?? models[0]\n if (fallback && fallback.id !== step.modelId) {\n queueMicrotask(() => onChange({ ...step, modelId: fallback.id }))\n }\n }\n\n function handleClick(e: React.MouseEvent) {\n // Don't toggle when clicking inside config panel\n if ((e.target as HTMLElement).closest('.step-config')) return\n setExpanded(v => !v)\n }\n\n return (\n <div className=\"space-y-2\">\n {/* ── Step card ─────────────────────────────────────────── */}\n <div\n className={cn(\n 'rounded-xl border border-border bg-surface overflow-hidden border-l-4 shadow-sm',\n color,\n !step.enabled && 'opacity-[0.45]',\n )}\n >\n {/* Header */}\n <div className=\"flex items-center gap-2.5 px-3 py-2.5 cursor-pointer select-none\" onClick={handleClick}>\n <span className=\"text-foreground-subtle\">\n {expanded ? <ChevronDown className=\"h-4 w-4\" /> : <ChevronRight className=\"h-4 w-4\" />}\n </span>\n\n {/* Slot type (small header) + Name (prominent) + class tags */}\n <div className=\"flex-1 min-w-0\">\n <span className=\"text-[10px] uppercase tracking-wider font-medium text-foreground-subtle/60 block leading-none\">{step.slot}</span>\n <span className=\"text-sm font-semibold text-foreground truncate block leading-tight\">{step.addonName}</span>\n <div className=\"flex items-center gap-1 mt-0.5 flex-wrap\">\n {step.inputClasses.map(c => (\n <span key={c} className=\"text-[9px] uppercase font-semibold tracking-wide px-1.5 py-0.5 rounded bg-blue-500/12 text-blue-400\">{c}</span>\n ))}\n {step.inputClasses.length > 0 && step.outputClasses.length > 0 && (\n <span className=\"text-foreground-subtle/40 text-[10px]\">→</span>\n )}\n {step.outputClasses.map(c => (\n <span key={c} className=\"text-[9px] uppercase font-semibold tracking-wide px-1.5 py-0.5 rounded bg-green-500/12 text-green-400\">{c}</span>\n ))}\n </div>\n </div>\n\n {/* Toggle */}\n <button\n onClick={e => { e.stopPropagation(); onChange({ ...step, enabled: !step.enabled }) }}\n className={cn(\n 'relative inline-flex h-6 w-11 shrink-0 items-center rounded-full transition-colors',\n step.enabled ? 'bg-success' : 'bg-foreground-subtle/30',\n )}\n >\n <span className={cn(\n 'inline-block h-4 w-4 rounded-full bg-white shadow transition-transform',\n step.enabled ? 'translate-x-6' : 'translate-x-1',\n )} />\n </button>\n\n {/* Delete button removed — toggle switch is sufficient */}\n </div>\n\n {/* ── Expanded config ──────────────────────────────────── */}\n {expanded && (\n <div className=\"step-config border-t border-border bg-background px-4 py-4 space-y-3\">\n <div className=\"grid grid-cols-2 gap-3\">\n <ConfigSelect label=\"Agent\" value={step.agentId} disabled={readOnly}\n options={[{ value: step.agentId || 'hub', label: step.agentId || 'Hub (local)' }]}\n onChange={v => onChange({ ...step, agentId: v })} />\n <ConfigSelect label=\"Runtime\" value={step.runtime} disabled={readOnly}\n options={rtOptions.map(r => ({ value: r.id, label: r.label, disabled: !r.available }))}\n onChange={v => onChange({ ...step, runtime: v })} />\n <ConfigSelect label=\"Backend\" value={step.backend} disabled={readOnly}\n options={backends.map(b => ({ value: b.id, label: b.label, disabled: !b.available }))}\n onChange={v => onChange({ ...step, backend: v })} />\n <ConfigSelect label=\"Model\" value={step.modelId} disabled={readOnly}\n options={models.map(m => ({ value: m.id, label: `${m.name}${m.downloaded ? ' ✓' : ''}` }))}\n onChange={v => onChange({ ...step, modelId: v })} />\n </div>\n <div>\n <div className=\"flex items-center justify-between mb-1\">\n <span className=\"text-[10px] font-medium text-foreground-subtle uppercase tracking-wide\">Confidence</span>\n <span className=\"text-xs font-medium text-foreground tabular-nums\">{(step.confidence * 100).toFixed(0)}%</span>\n </div>\n <input type=\"range\" min={0} max={1} step={0.01} value={step.confidence} disabled={readOnly}\n onChange={e => onChange({ ...step, confidence: Number(e.target.value) })}\n className=\"w-full accent-primary h-1.5\" />\n </div>\n </div>\n )}\n </div>\n\n {/* Children are rendered by PipelineBuilder (it manages placeholders + nesting) */}\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Small config select — reusable for Agent/Runtime/Backend/Model\n// ---------------------------------------------------------------------------\n\nfunction ConfigSelect({ label, value, options, disabled, onChange }: {\n label: string\n value: string\n options: readonly { value: string; label: string; disabled?: boolean }[]\n disabled?: boolean\n onChange: (value: string) => void\n}) {\n return (\n <div>\n <label className=\"block text-[10px] font-medium text-foreground-subtle uppercase tracking-wide mb-1.5\">\n {label}\n </label>\n <select\n value={value}\n onChange={e => onChange(e.target.value)}\n disabled={disabled}\n className=\"w-full rounded-lg border border-border bg-surface px-3 py-2 text-xs text-foreground focus:outline-none focus:border-primary/50\"\n >\n {options.length === 0 && <option value={value}>{value || 'default'}</option>}\n {options.map(o => (\n <option key={o.value} value={o.value} disabled={o.disabled}>{o.label}</option>\n ))}\n </select>\n </div>\n )\n}\n","import { Cpu, Star } from 'lucide-react'\n\nexport interface PipelineRuntimeOption {\n readonly id: string\n readonly label: string\n readonly available: boolean\n /** Platform score for this backend (higher = better) */\n readonly platformScore?: number\n /** Whether this is the best-scored backend */\n readonly isBest?: boolean\n}\n\ninterface PipelineRuntimeSelectorProps {\n readonly options: readonly PipelineRuntimeOption[]\n readonly value: string\n readonly onChange: (value: string) => void\n}\n\nexport function PipelineRuntimeSelector({ options, value, onChange }: PipelineRuntimeSelectorProps) {\n return (\n <div className=\"flex flex-wrap gap-2\">\n {options.map((opt) => {\n const active = opt.id === value\n return (\n <button\n key={opt.id}\n onClick={() => opt.available && onChange(opt.id)}\n disabled={!opt.available}\n className={`flex items-center gap-2 rounded-lg border px-3 py-2 text-xs font-medium transition-all ${\n active\n ? 'border-primary/40 bg-primary/10 text-primary'\n : opt.available\n ? 'border-border bg-surface text-foreground-subtle hover:bg-surface-hover hover:text-foreground'\n : 'border-border/40 bg-surface/40 text-foreground-subtle/40 cursor-not-allowed'\n }`}\n >\n <Cpu className=\"h-3.5 w-3.5 shrink-0\" />\n {opt.label}\n {opt.isBest && (\n <span className=\"inline-flex items-center gap-0.5 rounded-full bg-amber-500/15 px-1.5 py-0.5 text-[10px] font-semibold text-amber-400\">\n <Star className=\"h-2.5 w-2.5\" />\n Best\n </span>\n )}\n {opt.platformScore != null && (\n <span className=\"text-[10px] text-foreground-subtle/60\">({opt.platformScore})</span>\n )}\n <span\n className={`h-1.5 w-1.5 rounded-full ${\n opt.available ? 'bg-success' : 'bg-danger'\n }`}\n />\n </button>\n )\n })}\n </div>\n )\n}\n","/**\n * PipelineBuilder — orchestrates the pipeline step tree with template management.\n *\n * Renders: template bar (save/load/delete), step tree from schema with nested\n * children, placeholder steps for disabled addons, all driven by API schema.\n */\nimport { useMemo, useState } from 'react'\nimport { Save, CopyPlus, Trash2, PlusCircle, X } from 'lucide-react'\nimport type {\n PipelineSchema,\n PipelineTemplate,\n InferenceCapabilities,\n PipelineAddonSchema,\n} from '@camstack/types'\nimport { cn } from '../lib/cn'\nimport { validateTemplate } from '../lib/validate-template'\nimport { PipelineStep } from './pipeline-step'\nimport type { PipelineStepDisplayConfig } from './pipeline-step'\n\n// ---------------------------------------------------------------------------\n// Public interface\n// ---------------------------------------------------------------------------\n\nexport interface PipelineBuilderProps {\n readonly schema: PipelineSchema\n readonly capabilities: InferenceCapabilities\n readonly steps: readonly PipelineStepDisplayConfig[]\n readonly onChange: (steps: readonly PipelineStepDisplayConfig[]) => void\n readonly templates: readonly PipelineTemplate[]\n readonly selectedTemplateId: string | null\n readonly onSelectTemplate: (id: string | null) => void\n readonly onSaveTemplate: (name: string, steps: readonly PipelineStepDisplayConfig[]) => void\n readonly onUpdateTemplate: (id: string, steps: readonly PipelineStepDisplayConfig[]) => void\n readonly onDeleteTemplate: (id: string) => void\n readonly readOnly?: boolean\n /** Addon IDs to exclude from the pipeline (e.g. 'motion-detection' for benchmark) */\n readonly excludeAddons?: readonly string[]\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction buildSchemaMap(schema: PipelineSchema): Map<string, PipelineAddonSchema> {\n const map = new Map<string, PipelineAddonSchema>()\n for (const slot of schema.slots) {\n for (const addon of slot.addons) {\n map.set(addon.id, addon)\n }\n }\n return map\n}\n\nfunction createDefaultStep(\n addon: PipelineAddonSchema,\n fallbackRuntime?: string,\n fallbackBackend?: string,\n): PipelineStepDisplayConfig {\n return {\n addonId: addon.id,\n addonName: addon.name,\n slot: addon.slot,\n inputClasses: [...addon.inputClasses],\n outputClasses: [...addon.outputClasses],\n enabled: true,\n agentId: 'hub',\n // Use per-addon defaults from backend PlatformScorer, fallback to provided\n runtime: (addon as any).defaultRuntime ?? fallbackRuntime ?? 'node',\n backend: (addon as any).defaultBackend ?? fallbackBackend ?? 'cpu',\n modelId: addon.defaultModelId,\n confidence: addon.defaultConfidence,\n classFilters: [...addon.inputClasses],\n children: [],\n }\n}\n\n// ---------------------------------------------------------------------------\n// Placeholder step — dashed card with plus icon, class I/O tags\n// ---------------------------------------------------------------------------\n\nfunction PlaceholderStep({ addon, onClick }: {\n addon: PipelineAddonSchema\n onClick: () => void\n}) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className=\"w-full rounded-xl border-2 border-dashed border-border/60 px-4 py-3 text-left transition-all hover:border-primary/30 hover:bg-surface/60 group\"\n >\n <div className=\"flex items-center gap-3\">\n <PlusCircle className=\"h-[18px] w-[18px] text-foreground-subtle/30 group-hover:text-primary/60 shrink-0\" />\n <div className=\"flex-1 min-w-0\">\n <span className=\"text-[13px] font-medium text-foreground-subtle/50 group-hover:text-foreground-subtle block truncate\">\n {addon.name}\n </span>\n <div className=\"flex items-center gap-1 mt-0.5 flex-wrap\">\n {addon.inputClasses.map(c => (\n <span key={c} className=\"text-[9px] uppercase font-semibold tracking-wide px-1.5 py-0.5 rounded bg-blue-500/8 text-blue-400/50\">{c}</span>\n ))}\n {addon.inputClasses.length > 0 && addon.outputClasses.length > 0 && (\n <span className=\"text-foreground-subtle/25 text-[10px]\">→</span>\n )}\n {addon.outputClasses.map(c => (\n <span key={c} className=\"text-[9px] uppercase font-semibold tracking-wide px-1.5 py-0.5 rounded bg-green-500/8 text-green-400/50\">{c}</span>\n ))}\n </div>\n </div>\n </div>\n </button>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Main component\n// ---------------------------------------------------------------------------\n\nexport function PipelineBuilder({\n schema,\n capabilities,\n steps,\n onChange,\n templates,\n selectedTemplateId,\n onSelectTemplate,\n onSaveTemplate,\n onUpdateTemplate,\n onDeleteTemplate,\n readOnly = false,\n excludeAddons = [],\n}: PipelineBuilderProps) {\n const excluded = useMemo(() => new Set(excludeAddons), [excludeAddons])\n const schemaMap = useMemo(() => buildSchemaMap(schema), [schema])\n const [warnings, setWarnings] = useState<string[]>([])\n\n // Determine default runtime/backend for new steps — prefer platform scores\n const bestPlatformScore = capabilities.platformScores?.find(s => s.available)\n const hasPython = capabilities.runtimes.python.available &&\n capabilities.runtimes.python.backends.some(b => b.available)\n const defaultRuntime = bestPlatformScore?.runtime\n ?? (hasPython ? 'python' : 'node')\n const defaultBackend = bestPlatformScore?.backend\n ?? (hasPython\n ? (capabilities.runtimes.python.backends.find(b => b.available)?.id ?? 'cpu')\n : (capabilities.runtimes.node.backends.find(b => b.available && b.id !== 'cpu')?.id ?? 'cpu'))\n\n // Check unsaved changes\n const dirty = selectedTemplateId\n ? JSON.stringify(steps) !== JSON.stringify(templates.find(t => t.id === selectedTemplateId)?.steps)\n : false\n\n // ── Template handlers ──────────────────────────────────────────\n function handleSelectTemplate(e: React.ChangeEvent<HTMLSelectElement>) {\n const id = e.target.value || null\n if (id) {\n const tpl = templates.find(t => t.id === id)\n if (tpl) {\n const result = validateTemplate(tpl.steps, schema)\n setWarnings([...result.warnings])\n }\n } else {\n setWarnings([])\n }\n onSelectTemplate(id)\n }\n\n function handleSave() {\n if (selectedTemplateId) onUpdateTemplate(selectedTemplateId, steps)\n }\n\n function handleSaveAs() {\n const name = window.prompt('Template name:')\n if (name?.trim()) onSaveTemplate(name.trim(), steps)\n }\n\n function handleDelete() {\n if (!selectedTemplateId) return\n const tpl = templates.find(t => t.id === selectedTemplateId)\n if (tpl && window.confirm(`Delete template \"${tpl.name}\"?`)) {\n onDeleteTemplate(selectedTemplateId)\n }\n }\n\n // ── Step handlers ──────────────────────────────────────────────\n\n /**\n * When a step is updated, auto-enable the entire ancestor chain if a\n * child/grandchild was just enabled. This ensures enabling face-recognition\n * automatically enables face-detection and object-detection.\n */\n function handleStepChange(updated: PipelineStepDisplayConfig) {\n onChange(steps.map(s => {\n if (s.addonId !== updated.addonId) return s\n return autoEnableAncestors(updated)\n }))\n }\n\n /** If any child or grandchild is enabled, ensure the parent is too */\n function autoEnableAncestors(step: PipelineStepDisplayConfig): PipelineStepDisplayConfig {\n const hasEnabledChild = step.children.some(c => c.enabled || c.children.some(gc => gc.enabled))\n return {\n ...step,\n enabled: step.enabled || hasEnabledChild,\n children: step.children.map(c => {\n const hasEnabledGrandchild = c.children.some(gc => gc.enabled)\n return {\n ...c,\n enabled: c.enabled || hasEnabledGrandchild,\n }\n }),\n }\n }\n\n function handleAddChildToStep(parentAddonId: string, addon: PipelineAddonSchema) {\n const child = createDefaultStep(addon, defaultRuntime, defaultBackend)\n onChange(steps.map(s => {\n if (s.addonId !== parentAddonId) return s\n return { ...s, children: [...s.children, child] }\n }))\n }\n\n // ── Rendering ──────────────────────────────────────────────────\n\n // Collect all addon IDs already in the tree (including nested)\n function collectIds(list: readonly PipelineStepDisplayConfig[]): Set<string> {\n const ids = new Set<string>()\n for (const s of list) {\n ids.add(s.addonId)\n for (const c of s.children) ids.add(c.addonId)\n // Recurse deeper\n const childIds = collectIds(s.children)\n for (const id of childIds) ids.add(id)\n }\n return ids\n }\n\n const existingIds = collectIds(steps)\n\n // Get child-slot addons that could be children of a given step\n function getChildPlaceholders(step: PipelineStepDisplayConfig): PipelineAddonSchema[] {\n const stepSchema = schemaMap.get(step.addonId)\n if (!stepSchema) return []\n const childSlotIds = stepSchema.childSlots\n const childIds = new Set(step.children.map(c => c.addonId))\n const placeholders: PipelineAddonSchema[] = []\n for (const slot of schema.slots) {\n if (!childSlotIds.includes(slot.id)) continue\n for (const addon of slot.addons) {\n if (childIds.has(addon.id) || excluded.has(addon.id)) continue\n // Check class compatibility: addon's input must overlap with step's output\n const compatible = addon.inputClasses.some(ic => step.outputClasses.includes(ic))\n if (compatible) placeholders.push(addon)\n }\n }\n return placeholders\n }\n\n function renderStep(step: PipelineStepDisplayConfig) {\n const childPlaceholders = getChildPlaceholders(step)\n\n return (\n <div key={step.addonId} className=\"space-y-1.5\">\n <PipelineStep\n step={step}\n schema={schemaMap.get(step.addonId) ?? null}\n allSchemas={schemaMap}\n capabilities={capabilities}\n onChange={handleStepChange}\n onDelete={readOnly ? undefined : (id) => onChange(steps.filter(s => s.addonId !== id))}\n readOnly={readOnly}\n />\n\n {/* Children + child placeholders — nested visually */}\n {(step.children.length > 0 || childPlaceholders.length > 0) && (\n <div className=\"ml-6 pl-4 border-l-2 border-dashed border-border/40 space-y-1.5\">\n {/* Slot label for children */}\n <span className=\"text-[10px] font-semibold uppercase tracking-widest text-foreground-subtle/40\">\n Slot: Cropper / Classifier\n </span>\n\n {/* Existing child steps */}\n {step.children.map(child => {\n const childChildPlaceholders = getChildPlaceholders(child)\n return (\n <div key={child.addonId} className=\"space-y-1.5\">\n <PipelineStep\n step={child}\n schema={schemaMap.get(child.addonId) ?? null}\n allSchemas={schemaMap}\n capabilities={capabilities}\n depth={1}\n onChange={updated => {\n handleStepChange({\n ...step,\n children: step.children.map(c => c.addonId === updated.addonId ? updated : c),\n })\n }}\n onDelete={readOnly ? undefined : (id) => {\n handleStepChange({\n ...step,\n children: step.children.filter(c => c.addonId !== id),\n })\n }}\n readOnly={readOnly}\n />\n\n {/* Sub-sub children (recognizers) + placeholders */}\n {(child.children.length > 0 || childChildPlaceholders.length > 0) && (\n <div className=\"ml-6 pl-4 border-l-2 border-dashed border-border/30 space-y-1.5\">\n <span className=\"text-[10px] font-semibold uppercase tracking-widest text-foreground-subtle/30\">\n Slot: Recognizer\n </span>\n\n {/* Existing recognizer steps */}\n {child.children.map(grandchild => (\n <PipelineStep\n key={grandchild.addonId}\n step={grandchild}\n schema={schemaMap.get(grandchild.addonId) ?? null}\n allSchemas={schemaMap}\n capabilities={capabilities}\n depth={2}\n onChange={updatedGrandchild => {\n handleStepChange({\n ...step,\n children: step.children.map(c =>\n c.addonId === child.addonId\n ? { ...c, children: c.children.map(gc => gc.addonId === updatedGrandchild.addonId ? updatedGrandchild : gc) }\n : c\n ),\n })\n }}\n onDelete={readOnly ? undefined : (id) => {\n handleStepChange({\n ...step,\n children: step.children.map(c =>\n c.addonId === child.addonId\n ? { ...c, children: c.children.filter(gc => gc.addonId !== id) }\n : c\n ),\n })\n }}\n readOnly={readOnly}\n />\n ))}\n\n {/* Placeholder recognizers */}\n {!readOnly && childChildPlaceholders.map(addon => (\n <PlaceholderStep\n key={addon.id}\n addon={addon}\n onClick={() => {\n const newChild = createDefaultStep(addon, defaultRuntime, defaultBackend)\n handleStepChange({\n ...step,\n children: step.children.map(c =>\n c.addonId === child.addonId\n ? { ...c, children: [...c.children, newChild] }\n : c\n ),\n })\n }}\n />\n ))}\n </div>\n )}\n </div>\n )\n })}\n\n {/* Placeholders for missing child addons */}\n {!readOnly && childPlaceholders.map(addon => (\n <PlaceholderStep\n key={addon.id}\n addon={addon}\n onClick={() => handleAddChildToStep(step.addonId, addon)}\n />\n ))}\n </div>\n )}\n </div>\n )\n }\n\n // Root slots (detectors)\n const rootSlots = schema.slots.filter(s => s.parentSlot === null).sort((a, b) => a.priority - b.priority)\n\n return (\n <div className=\"space-y-4\">\n {/* ── Template bar ────────────────────────────────────────── */}\n <div className=\"rounded-xl border border-border bg-surface p-3\">\n <div className=\"flex items-center gap-2\">\n <div className=\"relative flex-1 min-w-0\">\n <select\n value={selectedTemplateId ?? ''}\n onChange={handleSelectTemplate}\n className=\"w-full rounded-lg border border-border bg-background px-3 py-2 text-sm text-foreground focus:outline-none focus:border-primary/50\"\n >\n <option value=\"\">No template</option>\n {templates.map(t => <option key={t.id} value={t.id}>{t.name}</option>)}\n </select>\n </div>\n {dirty && <span className=\"h-1.5 w-1.5 rounded-full bg-amber-500 shrink-0\" />}\n <button onClick={handleSave} disabled={!selectedTemplateId || readOnly} title=\"Save\"\n className={cn('p-2 rounded-lg border border-border transition-colors',\n selectedTemplateId && !readOnly ? 'text-foreground-subtle hover:bg-surface-hover' : 'text-foreground-subtle/30 cursor-not-allowed')}>\n <Save className=\"h-4 w-4\" />\n </button>\n <button onClick={handleSaveAs} disabled={readOnly} title=\"Save As\"\n className={cn('p-2 rounded-lg border border-border transition-colors',\n !readOnly ? 'text-foreground-subtle hover:bg-surface-hover' : 'text-foreground-subtle/30 cursor-not-allowed')}>\n <CopyPlus className=\"h-4 w-4\" />\n </button>\n <button onClick={handleDelete} disabled={!selectedTemplateId || readOnly} title=\"Delete\"\n className={cn('p-2 rounded-lg border border-border transition-colors',\n selectedTemplateId && !readOnly ? 'text-foreground-subtle hover:text-danger' : 'text-foreground-subtle/30 cursor-not-allowed')}>\n <Trash2 className=\"h-4 w-4\" />\n </button>\n </div>\n </div>\n\n {/* ── Warnings ────────────────────────────────────────────── */}\n {warnings.length > 0 && (\n <div className=\"rounded-lg border border-amber-500/30 bg-amber-500/5 p-3 text-xs text-amber-400 space-y-1\">\n <div className=\"flex items-center justify-between\">\n <span className=\"font-medium\">Template loaded with warnings:</span>\n <button onClick={() => setWarnings([])} className=\"text-amber-400/60 hover:text-amber-400\"><X className=\"h-3.5 w-3.5\" /></button>\n </div>\n {warnings.map((w, i) => <div key={i}>• {w}</div>)}\n </div>\n )}\n\n {/* ── Step tree ───────────────────────────────────────────── */}\n {rootSlots.map(slot => {\n const slotSteps = steps.filter(s => s.slot === slot.id && !excluded.has(s.addonId))\n const missingRootAddons = slot.addons.filter(a => !existingIds.has(a.id) && !excluded.has(a.id))\n\n return (\n <div key={slot.id} className=\"space-y-2\">\n <span className=\"text-[10px] font-semibold uppercase tracking-widest text-foreground-subtle/50\">\n Slot: {slot.label}\n </span>\n\n {slotSteps.map(step => renderStep(step))}\n\n {/* Root placeholders (e.g. add another detector) */}\n {!readOnly && missingRootAddons.map(addon => (\n <PlaceholderStep key={addon.id} addon={addon} onClick={() => {\n onChange([...steps, createDefaultStep(addon, defaultRuntime, defaultBackend)])\n }} />\n ))}\n </div>\n )\n })}\n </div>\n )\n}\n","// packages/ui-library/src/lib/validate-template.ts\nimport type { PipelineSchema, PipelineTemplateStep, TemplateValidationResult } from '@camstack/types'\n\nexport function validateTemplate(\n steps: readonly PipelineTemplateStep[],\n schema: PipelineSchema,\n): TemplateValidationResult {\n const availableAddonIds = new Set(\n schema.slots.flatMap(s => s.addons.map(a => a.id))\n )\n const warnings: string[] = []\n\n function validateStep(step: PipelineTemplateStep): PipelineTemplateStep | null {\n if (!availableAddonIds.has(step.addonId)) {\n warnings.push(`Addon \"${step.addonId}\" is no longer available — step removed`)\n return null\n }\n const addon = schema.slots\n .flatMap(s => s.addons)\n .find(a => a.id === step.addonId)\n\n let modelId = step.modelId\n if (addon && !addon.models.some(m => m.id === modelId)) {\n const fallback = addon.defaultModelId\n warnings.push(`Model \"${modelId}\" not available for ${step.addonId} — using \"${fallback}\"`)\n modelId = fallback\n }\n\n const validChildren = step.children\n .map(c => validateStep(c))\n .filter((c): c is PipelineTemplateStep => c !== null)\n\n return { ...step, modelId, children: validChildren }\n }\n\n const validSteps = steps\n .map(s => validateStep(s))\n .filter((s): s is PipelineTemplateStep => s !== null)\n\n return {\n valid: warnings.length === 0,\n steps: validSteps,\n warnings,\n }\n}\n","/**\n * Detection class colors — single source of truth.\n *\n * Used by: DetectionCanvas (UI), result-annotator (server-side SVG),\n * admin-ui event viewer, and any other place that visualizes detections.\n */\n\n/** Fixed colors for known detection classes */\nexport const CLASS_COLORS: Readonly<Record<string, string>> = {\n // Primary detection classes\n person: '#3b82f6', // blue-500\n vehicle: '#f59e0b', // amber-500\n animal: '#22c55e', // green-500\n\n // Sub-detection classes\n face: '#a855f7', // purple-500\n plate: '#ec4899', // pink-500\n\n // Specific animal types\n bird: '#14b8a6', // teal-500\n dog: '#84cc16', // lime-500\n cat: '#f97316', // orange-500\n\n // Specific vehicle types\n car: '#f59e0b', // amber-500\n truck: '#d97706', // amber-600\n bus: '#b45309', // amber-700\n motorcycle:'#eab308', // yellow-500\n bicycle: '#ca8a04', // yellow-600\n\n // Other\n motion: '#facc15', // yellow-400\n}\n\n/** Fallback color palette for unknown classes (deterministic hash-based) */\nconst FALLBACK_PALETTE: readonly string[] = [\n '#ef4444', // red-500\n '#8b5cf6', // violet-500\n '#06b6d4', // cyan-500\n '#f97316', // orange-500\n '#10b981', // emerald-500\n '#6366f1', // indigo-500\n '#e11d48', // rose-600\n '#0891b2', // cyan-600\n '#7c3aed', // violet-600\n '#059669', // emerald-600\n]\n\n/** Primary/default color when nothing else matches */\nexport const DEFAULT_COLOR = '#f59e42'\n\n/**\n * Get the color for a detection class name.\n * Returns a fixed color for known classes, or a deterministic hash-based color for unknown ones.\n */\nexport function getClassColor(className: string, customColors?: Readonly<Record<string, string>>): string {\n // Check custom overrides first\n if (customColors?.[className]) return customColors[className]!\n if (customColors?.[className.toLowerCase()]) return customColors[className.toLowerCase()]!\n\n // Check known classes\n if (CLASS_COLORS[className]) return CLASS_COLORS[className]!\n if (CLASS_COLORS[className.toLowerCase()]) return CLASS_COLORS[className.toLowerCase()]!\n\n // Deterministic hash for unknown classes\n let hash = 0\n for (let i = 0; i < className.length; i++) {\n hash = (hash * 31 + (className.codePointAt(i) ?? 0)) >>> 0\n }\n return FALLBACK_PALETTE[hash % FALLBACK_PALETTE.length] ?? DEFAULT_COLOR\n}\n","/**\n * DetectionCanvas — renders an image with overlaid bounding boxes.\n *\n * Supports hierarchical detections (parent → children) with configurable\n * class-based colors. Used by benchmark Image Tester and admin-ui event viewer.\n */\nimport { type ReactNode, useRef, useEffect } from 'react'\nimport { cn } from '../lib/cn'\nimport { CLASS_COLORS, getClassColor } from './detection-colors'\n\n/** @deprecated Use CLASS_COLORS from detection-colors instead */\nexport const DEFAULT_CLASS_COLORS = CLASS_COLORS\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n// Re-export LabelData from @camstack/types for consumers of this component\nexport type { LabelData, LabelOrigin } from '@camstack/types'\nimport type { LabelData } from '@camstack/types'\n\nexport interface Detection {\n /** Display class name (e.g., 'person', 'vehicle', 'face') */\n readonly className: string\n /** Confidence score 0-1 */\n readonly confidence: number\n /** Bounding box [x1, y1, x2, y2] in pixel coordinates */\n readonly bbox: readonly [number, number, number, number]\n /** Sub-detections from cropper steps (face box, plate box) — for debug */\n readonly children?: readonly Detection[]\n /** Accumulated labels from all classifier/recognizer steps */\n readonly labelsData?: readonly LabelData[]\n /** Base64-encoded binary segmentation mask (from -seg models) */\n readonly mask?: string\n /** Mask pixel width */\n readonly maskWidth?: number\n /** Mask pixel height */\n readonly maskHeight?: number\n}\n\nexport interface DetectionCanvasProps {\n /** Image source (data URL or regular URL) */\n readonly src: string | null\n /** Image dimensions (used for bbox coordinate mapping) */\n readonly imageWidth: number\n readonly imageHeight: number\n /** Detections to overlay */\n readonly detections?: readonly Detection[]\n /** Custom class → hex color mapping (merged with defaults) */\n readonly classColors?: Readonly<Record<string, string>>\n /** Aspect ratio CSS value (default: auto based on image dimensions) */\n readonly aspectRatio?: string\n /** Additional CSS classes on the container */\n readonly className?: string\n /** Placeholder content when no image is loaded */\n readonly placeholder?: ReactNode\n /** Show confidence percentage in bbox labels */\n readonly showConfidence?: boolean\n /** Minimum confidence to display (0-1, default: 0) */\n readonly minConfidence?: number\n /** Border width for bboxes in px (default: 2) */\n readonly borderWidth?: number\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function DetectionCanvas({\n src,\n imageWidth,\n imageHeight,\n detections = [],\n classColors,\n aspectRatio,\n className,\n placeholder,\n showConfidence = true,\n minConfidence = 0,\n borderWidth = 2,\n}: DetectionCanvasProps) {\n function getColor(className: string): string {\n return getClassColor(className, classColors)\n }\n\n const ratio = aspectRatio ?? (imageWidth && imageHeight ? `${imageWidth}/${imageHeight}` : '16/9')\n\n const filteredDetections = detections.filter(d => d.confidence >= minConfidence)\n\n return (\n <div\n className={cn(\n 'rounded-lg border border-border bg-surface overflow-hidden relative',\n className,\n )}\n style={{ aspectRatio: ratio }}\n >\n {src ? (\n <>\n {/* Image — absolute so it shares coordinate space with bbox overlays */}\n <img src={src} className=\"absolute inset-0 w-full h-full object-fill\" alt=\"\" />\n\n {/* Segmentation mask overlays (rendered behind bounding boxes) */}\n {filteredDetections.map((d, i) =>\n d.mask && d.maskWidth && d.maskHeight ? (\n <MaskOverlay\n key={`mask-${i}`}\n mask={d.mask}\n maskWidth={d.maskWidth}\n maskHeight={d.maskHeight}\n bbox={d.bbox}\n imageWidth={imageWidth}\n imageHeight={imageHeight}\n color={getColor(d.className)}\n />\n ) : null,\n )}\n\n {/* Parent detection boxes */}\n {filteredDetections.map((d, i) => (\n <BoundingBox\n key={`det-${i}`}\n detection={d}\n imageWidth={imageWidth}\n imageHeight={imageHeight}\n color={getColor(d.className)}\n showConfidence={showConfidence}\n borderWidth={d.mask ? 1 : borderWidth}\n >\n {/* Child detection boxes — only cropper outputs with distinct bbox (face/plate) */}\n {d.children?.filter(c => {\n if (c.confidence < minConfidence) return false\n const [cx1, cy1, cx2, cy2] = c.bbox\n const cw = cx2 - cx1\n const ch = cy2 - cy1\n // Skip zero-size bbox (classifier outputs with no spatial info)\n if (cw <= 0 || ch <= 0) return false\n // Skip if bbox is same as parent (classifier ran on whole detection)\n const [px1, py1, px2, py2] = d.bbox\n const pw = px2 - px1\n const ph = py2 - py1\n if (pw > 0 && ph > 0 && (cw * ch) / (pw * ph) > 0.8) return false\n return true\n }).map((child, j) => (\n <ChildBoundingBox\n key={`child-${j}`}\n child={child}\n parentBbox={d.bbox}\n color={getColor(child.className)}\n showConfidence={showConfidence}\n />\n ))}\n </BoundingBox>\n ))}\n </>\n ) : (\n <div className=\"w-full h-full flex items-center justify-center text-foreground-subtle text-sm\">\n {placeholder ?? 'No image loaded'}\n </div>\n )}\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Sub-components\n// ---------------------------------------------------------------------------\n\nfunction BoundingBox({\n detection,\n imageWidth,\n imageHeight,\n color,\n showConfidence,\n borderWidth,\n children,\n}: {\n detection: Detection\n imageWidth: number\n imageHeight: number\n color: string\n showConfidence: boolean\n borderWidth: number\n children?: ReactNode\n}) {\n const [x1, y1, x2, y2] = detection.bbox\n\n // Smart label placement: if bbox is near the top of the image, show labels below instead\n const labelCount = 1 + (detection.labelsData?.length ?? 0)\n const labelHeightPx = labelCount * 16 + 4 // ~16px per label row + margin\n const topPct = (y1 / imageHeight) * 100\n const containerRef = useRef<HTMLDivElement>(null)\n\n // Estimate if there's enough space above the bbox\n // Each label row is ~16px, we need labelHeightPx above\n // Container height varies, so use percentage: labelHeightPx / containerHeight * 100\n const showBelow = topPct < (labelHeightPx / imageHeight) * 100 * 1.5\n\n const labelsElement = (\n <div\n className={`absolute left-0 flex flex-col items-start gap-px ${\n showBelow ? '' : ''\n }`}\n style={showBelow\n ? { top: '100%', marginTop: '2px' }\n : { bottom: '100%', marginBottom: '2px' }\n }\n >\n <span\n className=\"text-[10px] px-1 rounded-sm whitespace-nowrap text-white\"\n style={{ backgroundColor: color }}\n >\n {detection.className}\n {showConfidence && ` ${(detection.confidence * 100).toFixed(0)}%`}\n </span>\n {detection.labelsData?.map((l: LabelData, k: number) => (\n <span\n key={k}\n className=\"text-[9px] font-semibold px-1 rounded-sm whitespace-nowrap text-white\"\n style={{ backgroundColor: getClassColor(l.addonId ?? l.label) }}\n >\n {l.label} {(l.score * 100).toFixed(0)}%\n </span>\n ))}\n </div>\n )\n\n return (\n <div\n ref={containerRef}\n className=\"absolute rounded-sm\"\n style={{\n left: `${(x1 / imageWidth) * 100}%`,\n top: `${(y1 / imageHeight) * 100}%`,\n width: `${((x2 - x1) / imageWidth) * 100}%`,\n height: `${((y2 - y1) / imageHeight) * 100}%`,\n borderWidth: `${borderWidth}px`,\n borderStyle: 'solid',\n borderColor: color,\n }}\n >\n {labelsElement}\n {children}\n </div>\n )\n}\n\n/** Renders a segmentation mask as a semi-transparent colored canvas overlay */\nfunction MaskOverlay({\n mask,\n maskWidth,\n maskHeight,\n bbox,\n imageWidth,\n imageHeight,\n color,\n}: {\n mask: string\n maskWidth: number\n maskHeight: number\n bbox: readonly [number, number, number, number]\n imageWidth: number\n imageHeight: number\n color: string\n}) {\n const canvasRef = useRef<HTMLCanvasElement>(null)\n\n useEffect(() => {\n const canvas = canvasRef.current\n if (!canvas) return\n\n const ctx = canvas.getContext('2d')\n if (!ctx) return\n\n // Decode base64 mask — each byte is a pixel value (0 or 255)\n const binary = atob(mask)\n const bytes = new Uint8Array(binary.length)\n for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i)\n\n // Parse color\n const r = parseInt(color.slice(1, 3), 16)\n const g = parseInt(color.slice(3, 5), 16)\n const b = parseInt(color.slice(5, 7), 16)\n\n // Create mask image data at mask resolution (1 byte per pixel, not bit-packed)\n canvas.width = maskWidth\n canvas.height = maskHeight\n const imageData = ctx.createImageData(maskWidth, maskHeight)\n const totalPixels = maskWidth * maskHeight\n\n for (let i = 0; i < totalPixels; i++) {\n const val = i < bytes.length ? bytes[i]! : 0\n const px = i * 4\n if (val > 0) {\n imageData.data[px] = r\n imageData.data[px + 1] = g\n imageData.data[px + 2] = b\n imageData.data[px + 3] = 120 // semi-transparent\n }\n }\n\n ctx.putImageData(imageData, 0, 0)\n }, [mask, maskWidth, maskHeight, color])\n\n const [x1, y1, x2, y2] = bbox\n\n return (\n <canvas\n ref={canvasRef}\n className=\"absolute pointer-events-none\"\n style={{\n left: `${(x1 / imageWidth) * 100}%`,\n top: `${(y1 / imageHeight) * 100}%`,\n width: `${((x2 - x1) / imageWidth) * 100}%`,\n height: `${((y2 - y1) / imageHeight) * 100}%`,\n imageRendering: 'pixelated',\n }}\n />\n )\n}\n\nfunction ChildBoundingBox({\n child,\n parentBbox,\n color,\n showConfidence,\n}: {\n child: Detection\n parentBbox: readonly [number, number, number, number]\n color: string\n showConfidence: boolean\n}) {\n const [px1, py1, px2, py2] = parentBbox\n const [cx1, cy1, cx2, cy2] = child.bbox\n const pw = px2 - px1\n const ph = py2 - py1\n\n if (pw <= 0 || ph <= 0) return null\n\n return (\n <div\n className=\"absolute rounded-sm\"\n style={{\n left: `${Math.max(0, ((cx1 - px1) / pw) * 100)}%`,\n top: `${Math.max(0, ((cy1 - py1) / ph) * 100)}%`,\n width: `${Math.min(100, ((cx2 - cx1) / pw) * 100)}%`,\n height: `${Math.min(100, ((cy2 - cy1) / ph) * 100)}%`,\n borderWidth: '1px',\n borderStyle: 'solid',\n borderColor: color,\n }}\n >\n {/* Labels stack: className + labelsData, smart top/bottom placement */}\n {(() => {\n const labelCount = 1 + (child.labelsData?.length ?? 0)\n const relTop = ((cy1 - py1) / ph) * 100\n const showBelow = relTop < labelCount * 6 // ~6% per label row relative to parent\n return (\n <div\n className=\"absolute left-0 flex flex-col items-start gap-px\"\n style={showBelow\n ? { top: '100%', marginTop: '1px' }\n : { bottom: '100%', marginBottom: '1px' }\n }\n >\n <span\n className=\"text-[9px] px-0.5 rounded-sm whitespace-nowrap text-white\"\n style={{ backgroundColor: color }}\n >\n {child.className}\n {showConfidence && ` ${(child.confidence * 100).toFixed(0)}%`}\n </span>\n {child.labelsData?.map((l: LabelData, k: number) => (\n <span\n key={k}\n className=\"text-[8px] font-semibold px-0.5 rounded-sm whitespace-nowrap text-white\"\n style={{ backgroundColor: getClassColor(l.addonId ?? l.label) }}\n >\n {l.label} {(l.score * 100).toFixed(0)}%\n </span>\n ))}\n </div>\n )\n })()}\n </div>\n )\n}\n","/**\n * DetectionResultTree — displays detection results as a hierarchical tree.\n *\n * Shows parent detections with confidence badges, mask info, expandable children,\n * and visibility checkboxes that toggle overlays on the detection canvas.\n */\nimport { type Detection } from './detection-canvas'\nimport { getClassColor } from './detection-colors'\n\nexport interface DetectionResultTreeProps {\n readonly detections: readonly Detection[]\n readonly classColors?: Readonly<Record<string, string>>\n readonly className?: string\n /** Set of detection path keys that are hidden (e.g., \"0\", \"0.1\", \"0.1.2\") */\n readonly hiddenKeys?: ReadonlySet<string>\n /** Callback when a detection's visibility is toggled */\n readonly onToggleVisibility?: (key: string, visible: boolean) => void\n}\n\nexport function DetectionResultTree({\n detections,\n classColors,\n className,\n hiddenKeys,\n onToggleVisibility,\n}: DetectionResultTreeProps) {\n const colors = classColors\n\n if (detections.length === 0) {\n return (\n <div className=\"text-sm text-foreground-subtle italic text-center py-4\">\n No detections\n </div>\n )\n }\n\n return (\n <div className={className}>\n <div className=\"text-xs font-medium text-foreground-subtle uppercase tracking-wide mb-2\">\n Detections ({detections.length})\n </div>\n <div className=\"space-y-2\">\n {detections.map((d, i) => (\n <DetectionNode\n key={i}\n detection={d}\n path={String(i)}\n colors={colors}\n hiddenKeys={hiddenKeys}\n onToggleVisibility={onToggleVisibility}\n />\n ))}\n </div>\n </div>\n )\n}\n\nfunction DetectionNode({\n detection,\n path,\n colors,\n hiddenKeys,\n onToggleVisibility,\n}: {\n detection: Detection\n path: string\n colors?: Record<string, string>\n hiddenKeys?: ReadonlySet<string>\n onToggleVisibility?: (key: string, visible: boolean) => void\n}) {\n const color = getClassColor(detection.className, colors)\n const isVisible = !hiddenKeys?.has(path)\n\n return (\n <div className={`rounded-md border border-border bg-surface p-3 space-y-1 ${isVisible ? '' : 'opacity-40'}`}>\n <div className=\"flex justify-between items-center\">\n <div className=\"flex items-center gap-2\">\n {onToggleVisibility && (\n <input\n type=\"checkbox\"\n checked={isVisible}\n onChange={() => onToggleVisibility(path, !isVisible)}\n className=\"h-3.5 w-3.5 rounded border-border accent-primary cursor-pointer shrink-0\"\n />\n )}\n <span\n className=\"h-2.5 w-2.5 rounded-full shrink-0\"\n style={{ backgroundColor: color }}\n />\n <span className=\"text-sm font-medium text-foreground\">\n {detection.className}\n </span>\n {detection.mask && detection.maskWidth && detection.maskHeight && (\n <span className=\"text-[9px] font-mono px-1 py-0.5 rounded bg-primary/10 text-primary\">\n mask {detection.maskWidth}x{detection.maskHeight}\n </span>\n )}\n </div>\n <ConfidenceBadge confidence={detection.confidence} />\n </div>\n\n <div className=\"text-[10px] text-foreground-subtle font-mono\">\n bbox: [{detection.bbox.map(v => Math.round(v)).join(', ')}]\n </div>\n\n {/* Pipeline labelsData (species, plate text, vehicle type, face name, etc.) */}\n {detection.labelsData && detection.labelsData.length > 0 && (\n <div className=\"flex flex-wrap gap-1 mt-1\">\n {detection.labelsData.map((l: any, k: number) => (\n <span\n key={k}\n className=\"inline-flex items-center gap-1 text-[10px] font-medium px-1.5 py-0.5 rounded-full\"\n style={{ backgroundColor: getClassColor(l.addonId ?? l.label, colors) + '20', color: getClassColor(l.addonId ?? l.label, colors) }}\n >\n {l.label}\n <span className=\"opacity-60\">{(l.score * 100).toFixed(0)}%</span>\n {l.addonId && <span className=\"opacity-40 text-[8px]\">{l.addonId}</span>}\n </span>\n ))}\n </div>\n )}\n\n {/* Children tree — recursive */}\n {detection.children && detection.children.length > 0 && (\n <ChildrenTree\n children={detection.children}\n parentPath={path}\n colors={colors}\n hiddenKeys={hiddenKeys}\n onToggleVisibility={onToggleVisibility}\n />\n )}\n </div>\n )\n}\n\nfunction ChildrenTree({\n children,\n parentPath,\n colors,\n hiddenKeys,\n onToggleVisibility,\n}: {\n children: readonly Detection[]\n parentPath: string\n colors?: Record<string, string>\n hiddenKeys?: ReadonlySet<string>\n onToggleVisibility?: (key: string, visible: boolean) => void\n}) {\n return (\n <div className=\"ml-4 mt-1.5 space-y-1.5 border-l-2 border-border pl-3\">\n {children.map((child, j) => {\n const childPath = `${parentPath}.${j}`\n const childColor = getClassColor(child.className, colors)\n const isVisible = !hiddenKeys?.has(childPath)\n\n return (\n <div key={j} className={`text-xs space-y-0.5 ${isVisible ? '' : 'opacity-40'}`}>\n <div className=\"flex items-center gap-1.5\">\n {onToggleVisibility && (\n <input\n type=\"checkbox\"\n checked={isVisible}\n onChange={() => onToggleVisibility(childPath, !isVisible)}\n className=\"h-3 w-3 rounded border-border accent-primary cursor-pointer shrink-0\"\n />\n )}\n <span\n className=\"h-1.5 w-1.5 rounded-full shrink-0\"\n style={{ backgroundColor: childColor }}\n />\n <span className=\"font-medium\" style={{ color: childColor }}>\n {child.className}\n </span>\n <span className=\"text-foreground-subtle\">\n {(child.confidence * 100).toFixed(0)}%\n </span>\n {child.mask && child.maskWidth && child.maskHeight && (\n <span className=\"text-[9px] font-mono px-1 py-0.5 rounded bg-primary/10 text-primary\">\n mask {child.maskWidth}x{child.maskHeight}\n </span>\n )}\n </div>\n {/* labelsData on child */}\n {child.labelsData && child.labelsData.length > 0 && (\n <div className=\"flex flex-wrap gap-1 ml-5 mt-0.5\">\n {child.labelsData.map((l: any, k: number) => (\n <span key={k} className=\"inline-flex items-center gap-0.5 text-[9px] font-medium px-1 py-0.5 rounded-full\"\n style={{ backgroundColor: getClassColor(l.addonId ?? l.label, colors) + '20', color: getClassColor(l.addonId ?? l.label, colors) }}>\n {l.label} <span className=\"opacity-60\">{(l.score * 100).toFixed(0)}%</span>\n </span>\n ))}\n </div>\n )}\n {/* Recursive children */}\n {child.children && child.children.length > 0 && (\n <ChildrenTree\n children={child.children}\n parentPath={childPath}\n colors={colors}\n hiddenKeys={hiddenKeys}\n onToggleVisibility={onToggleVisibility}\n />\n )}\n </div>\n )\n })}\n </div>\n )\n}\n\nfunction ConfidenceBadge({ confidence }: { confidence: number }) {\n const level =\n confidence >= 0.8 ? 'bg-success/10 text-success' :\n confidence >= 0.5 ? 'bg-warning/10 text-warning' :\n 'bg-danger/10 text-danger'\n\n return (\n <span className={`text-xs font-medium px-2 py-0.5 rounded-full ${level}`}>\n {(confidence * 100).toFixed(1)}%\n </span>\n )\n}\n","/**\n * StepTimings — displays pipeline execution timings per step.\n */\n\nexport interface StepTimingsProps {\n readonly timings: Readonly<Record<string, number>>\n readonly totalMs?: number\n readonly className?: string\n}\n\nexport function StepTimings({ timings, totalMs, className }: StepTimingsProps) {\n const entries = Object.entries(timings)\n if (entries.length === 0 && totalMs === undefined) return null\n\n return (\n <div className={`rounded-lg border border-border bg-surface p-3 space-y-2 ${className ?? ''}`}>\n <div className=\"text-xs font-medium text-foreground-subtle uppercase tracking-wide\">\n Timings\n </div>\n <div className=\"space-y-1 text-xs\">\n {entries.map(([step, ms]) => (\n <div key={step} className=\"flex justify-between\">\n <span className=\"text-foreground-subtle\">{step}</span>\n <span className=\"font-mono text-foreground\">{ms.toFixed(1)}ms</span>\n </div>\n ))}\n {totalMs !== undefined && (\n <div className=\"flex justify-between pt-1 border-t border-border font-medium text-foreground\">\n <span>Total</span>\n <span className=\"font-mono\">{totalMs.toFixed(1)}ms</span>\n </div>\n )}\n </div>\n </div>\n )\n}\n","/**\n * ImageSelector — select from reference images or upload custom image.\n * Used by benchmark Image Tester and any addon page that needs image input.\n */\n\nexport interface ReferenceImage {\n readonly id: string\n readonly filename: string\n readonly sizeKB?: number\n}\n\nexport interface ImageSelectorProps {\n readonly images: readonly ReferenceImage[]\n readonly selectedFilename: string\n readonly uploadedName?: string\n readonly onSelect: (filename: string) => void\n readonly onUpload: (base64: string, filename: string, dataUrl: string) => void\n readonly className?: string\n}\n\nexport function ImageSelector({\n images,\n selectedFilename,\n uploadedName,\n onSelect,\n onUpload,\n className,\n}: ImageSelectorProps) {\n const handleUploadClick = () => {\n const input = document.createElement('input')\n input.type = 'file'\n input.accept = 'image/*'\n input.onchange = (ev: any) => {\n const file = ev.target.files?.[0]\n if (!file) return\n const reader = new FileReader()\n reader.onload = (e: any) => {\n const dataUrl = e.target?.result as string\n const b64 = dataUrl.split(',')[1]\n if (b64) onUpload(b64, file.name, dataUrl)\n }\n reader.readAsDataURL(file)\n }\n input.click()\n }\n\n return (\n <div className={`flex flex-wrap items-center gap-2 ${className ?? ''}`}>\n {images.map(img => (\n <button\n key={img.filename}\n onClick={() => onSelect(img.filename)}\n className={`px-3 py-1.5 text-xs rounded-md border transition-colors ${\n selectedFilename === img.filename\n ? 'bg-primary text-primary-foreground border-primary'\n : 'bg-surface border-border text-foreground hover:border-primary/50'\n }`}\n >\n {img.id}\n </button>\n ))}\n <button\n onClick={handleUploadClick}\n className=\"px-3 py-1.5 text-xs rounded-md border border-border bg-surface text-foreground hover:bg-surface-hover transition-colors\"\n >\n Upload...\n </button>\n {uploadedName && (\n <span className=\"text-xs text-foreground-subtle\">{uploadedName}</span>\n )}\n </div>\n )\n}\n","/**\n * InferenceConfigSelector — cascading selectors for runtime/backend/model.\n *\n * Used by benchmark Engine tab, Image Tester pipeline steps, and admin-ui\n * pipeline configuration. Shows only valid combinations based on capabilities.\n */\n\nexport interface InferenceBackendOption {\n readonly id: string\n readonly label: string\n readonly available: boolean\n}\n\nexport interface InferenceModelOption {\n readonly id: string\n readonly name: string\n readonly downloaded?: boolean\n}\n\nexport interface InferenceAgentOption {\n readonly id: string\n readonly name: string\n readonly status: 'online' | 'offline' | 'busy'\n}\n\nexport interface InferenceConfigSelectorProps {\n // Values\n readonly runtime: 'node' | 'python'\n readonly backend: string\n readonly modelId: string\n readonly agentId?: string\n\n // Options\n readonly runtimes: readonly { value: string; label: string; available: boolean }[]\n readonly backends: readonly InferenceBackendOption[]\n readonly models: readonly InferenceModelOption[]\n readonly agents?: readonly InferenceAgentOption[]\n\n // Callbacks\n readonly onRuntimeChange: (rt: 'node' | 'python') => void\n readonly onBackendChange: (id: string) => void\n readonly onModelChange: (id: string) => void\n readonly onAgentChange?: (id: string) => void\n\n // Layout\n readonly layout?: 'horizontal' | 'vertical' | 'grid'\n readonly className?: string\n /** Show agent selector (default: false) */\n readonly showAgent?: boolean\n}\n\nconst SELECT_CLASS = 'w-full px-3 py-2 text-sm rounded-md border border-border bg-surface text-foreground focus:outline-none focus:ring-2 focus:ring-primary/50'\n\nexport function InferenceConfigSelector({\n runtime,\n backend,\n modelId,\n agentId = 'hub',\n runtimes,\n backends,\n models,\n agents = [],\n onRuntimeChange,\n onBackendChange,\n onModelChange,\n onAgentChange,\n layout = 'grid',\n className,\n showAgent = false,\n}: InferenceConfigSelectorProps) {\n const containerClass = layout === 'grid'\n ? 'grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-4'\n : layout === 'horizontal'\n ? 'flex flex-wrap items-end gap-4'\n : 'space-y-3'\n\n return (\n <div className={`${containerClass} ${className ?? ''}`}>\n {/* Agent (optional) */}\n {showAgent && agents.length > 0 && (\n <label className=\"space-y-1\">\n <span className=\"text-xs font-medium text-foreground-subtle\">Agent</span>\n <select\n value={agentId}\n onChange={e => onAgentChange?.(e.target.value)}\n className={SELECT_CLASS}\n >\n {agents.map(a => (\n <option key={a.id} value={a.id}>\n {a.name} ({a.status})\n </option>\n ))}\n </select>\n </label>\n )}\n\n {/* Runtime */}\n <label className=\"space-y-1\">\n <span className=\"text-xs font-medium text-foreground-subtle\">Runtime</span>\n <select\n value={runtime}\n onChange={e => onRuntimeChange(e.target.value as 'node' | 'python')}\n className={SELECT_CLASS}\n >\n {runtimes.map(r => (\n <option key={r.value} value={r.value} disabled={!r.available}>\n {r.label}{!r.available ? ' (unavailable)' : ''}\n </option>\n ))}\n </select>\n </label>\n\n {/* Backend */}\n <label className=\"space-y-1\">\n <span className=\"text-xs font-medium text-foreground-subtle\">Backend</span>\n <select\n value={backend}\n onChange={e => onBackendChange(e.target.value)}\n className={SELECT_CLASS}\n >\n {backends.map(b => (\n <option key={b.id} value={b.id} disabled={!b.available}>\n {b.label}{!b.available ? ' (unavailable)' : ''}\n </option>\n ))}\n </select>\n </label>\n\n {/* Model */}\n <label className=\"space-y-1\">\n <span className=\"text-xs font-medium text-foreground-subtle\">Model</span>\n <select\n value={modelId}\n onChange={e => onModelChange(e.target.value)}\n className={SELECT_CLASS}\n >\n {models.length === 0\n ? <option value=\"\">No compatible models</option>\n : models.map(m => (\n <option key={m.id} value={m.id}>\n {m.name}{m.downloaded ? ' ✓' : ''}\n </option>\n ))\n }\n </select>\n </label>\n </div>\n )\n}\n","/**\n * mountAddonPage — one-liner to mount an addon page in dev mode.\n *\n * Handles everything: CSS import, React DOM mount, DevShell (login + theme + tRPC),\n * and wiring props in the standard AddonPageProps format.\n *\n * Usage in the addon's dev-shell.tsx:\n * ```tsx\n * import { mountAddonPage } from '@camstack/ui'\n * import MyPage from './page'\n * mountAddonPage(MyPage)\n * ```\n *\n * Or with options:\n * ```tsx\n * mountAddonPage(MyPage, { serverUrl: 'https://localhost:4443', title: 'My Addon' })\n * ```\n */\nimport { createElement } from 'react'\nimport { createRoot } from 'react-dom/client'\nimport { DevShell } from './dev-shell'\nimport type { AddonPageProps } from './addon-page-props'\n\nexport interface MountAddonPageOptions {\n /** Backend server URL (default: 'https://localhost:4443') */\n serverUrl?: string\n /** Title shown in the dev toolbar */\n title?: string\n /** Root element ID (default: 'root') */\n rootId?: string\n}\n\n/**\n * Mount an addon page component with the full dev shell.\n *\n * @param PageComponent - The addon page component (must accept AddonPageProps)\n * @param options - Configuration options\n */\nexport function mountAddonPage(\n PageComponent: (props: AddonPageProps) => any,\n options: MountAddonPageOptions = {},\n): void {\n const {\n serverUrl = 'https://localhost:4443',\n title,\n rootId = 'root',\n } = options\n\n const root = document.getElementById(rootId)\n if (!root) {\n console.error(`[mountAddonPage] Element #${rootId} not found`)\n return\n }\n\n createRoot(root).render(\n createElement(DevShell, {\n serverUrl,\n title,\n children: ({ trpc, theme }) =>\n createElement(PageComponent, {\n trpc,\n theme: { isDark: theme.resolvedMode === 'dark' },\n navigate: (path: string) => {\n console.log('[dev] navigate:', path)\n },\n }),\n }),\n )\n}\n","import { createContext, useCallback, useContext, useMemo, useState } from 'react'\nimport type { ReactNode } from 'react'\nimport { createTRPCClient, createWSClient, wsLink, httpLink, splitLink } from '@trpc/client'\nimport superjson from 'superjson'\nimport { ThemeProvider } from '../theme/theme-provider'\nimport { useThemeMode } from '../theme/use-theme-mode'\nimport type { UseThemeModeReturn } from '../theme/types'\nimport { LoginForm } from './login-form'\n\nconst STORAGE_KEY = 'camstack_dev_token'\n\nexport interface DevShellProps {\n children: (props: { trpc: ReturnType<typeof createTRPCClient>; theme: UseThemeModeReturn }) => ReactNode\n serverUrl?: string\n title?: string\n}\n\ninterface DevShellContextValue {\n trpc: ReturnType<typeof createTRPCClient>\n token: string\n logout: () => void\n}\n\nconst DevShellContext = createContext<DevShellContextValue | null>(null)\n\nexport function useDevShell(): DevShellContextValue {\n const ctx = useContext(DevShellContext)\n if (!ctx) {\n throw new Error('useDevShell must be used within a DevShell')\n }\n return ctx\n}\n\nfunction getStoredToken(): string | null {\n if (typeof window === 'undefined') return null\n return localStorage.getItem(STORAGE_KEY)\n}\n\nfunction SunIcon({ className }: { className?: string }) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n >\n <circle cx=\"12\" cy=\"12\" r=\"4\" />\n <path d=\"M12 2v2\" />\n <path d=\"M12 20v2\" />\n <path d=\"m4.93 4.93 1.41 1.41\" />\n <path d=\"m17.66 17.66 1.41 1.41\" />\n <path d=\"M2 12h2\" />\n <path d=\"M20 12h2\" />\n <path d=\"m6.34 17.66-1.41 1.41\" />\n <path d=\"m19.07 4.93-1.41 1.41\" />\n </svg>\n )\n}\n\nfunction MoonIcon({ className }: { className?: string }) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n >\n <path d=\"M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9Z\" />\n </svg>\n )\n}\n\nfunction DevShellInner({\n children,\n serverUrl,\n title,\n token,\n onLogout,\n}: {\n children: DevShellProps['children']\n serverUrl: string\n title?: string\n token: string\n onLogout: () => void\n}) {\n const theme = useThemeMode()\n\n const trpc = useMemo(\n () => {\n const wsUrl = serverUrl.replace(/^http/, 'ws') + '/trpc'\n const wsClient = createWSClient({\n url: wsUrl,\n connectionParams: () => ({ token }),\n })\n\n return createTRPCClient({\n links: [\n splitLink({\n condition: (op) => op.type === 'subscription',\n true: wsLink({ client: wsClient, transformer: superjson }),\n false: httpLink({\n url: `${serverUrl}/trpc`,\n transformer: superjson,\n headers: () => ({ authorization: `Bearer ${token}` }),\n }),\n }),\n ],\n })\n },\n [serverUrl, token],\n )\n\n const contextValue = useMemo<DevShellContextValue>(\n () => ({ trpc, token, logout: onLogout }),\n [trpc, token, onLogout],\n )\n\n return (\n <DevShellContext.Provider value={contextValue}>\n <div className=\"min-h-screen bg-background text-foreground\">\n <div className=\"flex items-center justify-between border-b border-border bg-surface px-4 py-2\">\n <div className=\"flex items-center gap-2\">\n <span className=\"rounded bg-warning/20 px-2 py-0.5 text-xs font-bold text-warning\">\n DEV MODE\n </span>\n {title && (\n <span className=\"text-sm font-medium text-foreground\">\n {title}\n </span>\n )}\n <span className=\"text-xs text-foreground-subtle\">\n {serverUrl}\n </span>\n </div>\n\n <div className=\"flex items-center gap-2\">\n <button\n type=\"button\"\n onClick={theme.toggleMode}\n className=\"flex items-center gap-1.5 rounded-md px-2 py-1 text-xs font-medium text-foreground-subtle hover:text-foreground hover:bg-surface-hover transition-colors\"\n title={`Theme: ${theme.mode}`}\n >\n {theme.resolvedMode === 'dark' ? (\n <SunIcon className=\"h-3.5 w-3.5\" />\n ) : (\n <MoonIcon className=\"h-3.5 w-3.5\" />\n )}\n {theme.mode === 'dark' ? 'Dark' : theme.mode === 'light' ? 'Light' : 'System'}\n </button>\n\n <button\n type=\"button\"\n onClick={onLogout}\n className=\"rounded-md px-2.5 py-1 text-xs font-medium text-danger hover:bg-danger/10 transition-colors\"\n >\n Logout\n </button>\n </div>\n </div>\n\n <div className=\"p-4\">{children({ trpc, theme })}</div>\n </div>\n </DevShellContext.Provider>\n )\n}\n\nexport function DevShell({\n children,\n serverUrl = 'https://localhost:4443',\n title,\n}: DevShellProps) {\n const [token, setToken] = useState<string | null>(getStoredToken)\n\n const handleLogin = useCallback(\n async (username: string, password: string) => {\n // Use tRPC client for auth (no token yet)\n const anonClient = createTRPCClient({\n links: [\n httpLink({\n url: `${serverUrl}/trpc`,\n transformer: superjson,\n }),\n ],\n })\n\n const res: any = await (anonClient as any).auth.login.mutate({ username, password })\n if (!res?.token) throw new Error('No token returned')\n\n localStorage.setItem(STORAGE_KEY, res.token)\n setToken(res.token)\n },\n [serverUrl],\n )\n\n const handleLogout = useCallback(() => {\n localStorage.removeItem(STORAGE_KEY)\n setToken(null)\n }, [])\n\n if (!token) {\n return (\n <ThemeProvider>\n <LoginForm onLogin={handleLogin} serverUrl={serverUrl} />\n </ThemeProvider>\n )\n }\n\n return (\n <ThemeProvider>\n <DevShellInner\n serverUrl={serverUrl}\n title={title}\n token={token}\n onLogout={handleLogout}\n >\n {children}\n </DevShellInner>\n </ThemeProvider>\n )\n}\n","import { type FormEvent, useState } from 'react'\nimport { cn } from '../lib/cn'\n\nexport interface LoginFormProps {\n onLogin: (username: string, password: string) => Promise<void>\n serverUrl?: string\n logoSrc?: string\n error?: string\n className?: string\n}\n\nfunction EyeIcon({ className }: { className?: string }) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n >\n <path d=\"M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0\" />\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n </svg>\n )\n}\n\nfunction EyeOffIcon({ className }: { className?: string }) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n >\n <path d=\"M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49\" />\n <path d=\"M14.084 14.158a3 3 0 0 1-4.242-4.242\" />\n <path d=\"M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143\" />\n <path d=\"m2 2 20 20\" />\n </svg>\n )\n}\n\nfunction SpinnerIcon({ className }: { className?: string }) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n >\n <path d=\"M21 12a9 9 0 1 1-6.219-8.56\" />\n </svg>\n )\n}\n\nexport function LoginForm({\n onLogin,\n serverUrl,\n logoSrc,\n error: externalError,\n className,\n}: LoginFormProps) {\n const [username, setUsername] = useState('')\n const [password, setPassword] = useState('')\n const [showPassword, setShowPassword] = useState(false)\n const [submitting, setSubmitting] = useState(false)\n const [internalError, setInternalError] = useState<string | null>(null)\n\n const error = externalError ?? internalError\n\n const handleSubmit = async (e: FormEvent) => {\n e.preventDefault()\n if (submitting) return\n\n setInternalError(null)\n setSubmitting(true)\n\n try {\n await onLogin(username, password)\n } catch (err) {\n const message =\n err instanceof Error ? err.message : 'Login failed. Please try again.'\n setInternalError(message)\n } finally {\n setSubmitting(false)\n }\n }\n\n return (\n <div\n className={cn(\n 'flex min-h-screen items-center justify-center bg-background p-4',\n className,\n )}\n >\n <div className=\"w-full max-w-sm\">\n {logoSrc && (\n <div className=\"flex justify-center mb-8\">\n <img src={logoSrc} alt=\"Logo\" className=\"h-12\" />\n </div>\n )}\n\n {serverUrl && (\n <p className=\"mb-4 text-center text-xs text-foreground-subtle truncate\">\n {serverUrl}\n </p>\n )}\n\n <form\n onSubmit={handleSubmit}\n className=\"space-y-4 rounded-xl border border-border bg-surface p-6 shadow-xl shadow-black/10\"\n >\n {error && (\n <div className=\"rounded-md bg-danger/10 border border-danger/20 px-3 py-2 text-xs text-danger\">\n {error}\n </div>\n )}\n\n <div className=\"space-y-1.5\">\n <label className=\"text-xs font-medium text-foreground-subtle\">\n Username\n </label>\n <input\n type=\"text\"\n value={username}\n onChange={(e) => setUsername(e.target.value)}\n autoComplete=\"username\"\n required\n className=\"w-full rounded-lg border border-border bg-background px-3 py-2.5 text-sm text-foreground placeholder:text-foreground-subtle focus:outline-none focus:ring-2 focus:ring-primary/50 focus:border-primary\"\n />\n </div>\n\n <div className=\"space-y-1.5\">\n <label className=\"text-xs font-medium text-foreground-subtle\">\n Password\n </label>\n <div className=\"relative\">\n <input\n type={showPassword ? 'text' : 'password'}\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n autoComplete=\"current-password\"\n required\n className=\"w-full rounded-lg border border-border bg-background px-3 py-2.5 pr-10 text-sm text-foreground placeholder:text-foreground-subtle focus:outline-none focus:ring-2 focus:ring-primary/50 focus:border-primary\"\n />\n <button\n type=\"button\"\n onClick={() => setShowPassword((prev) => !prev)}\n className=\"absolute right-2.5 top-1/2 -translate-y-1/2 text-foreground-subtle hover:text-foreground\"\n tabIndex={-1}\n >\n {showPassword ? (\n <EyeOffIcon className=\"h-4 w-4\" />\n ) : (\n <EyeIcon className=\"h-4 w-4\" />\n )}\n </button>\n </div>\n </div>\n\n <button\n type=\"submit\"\n disabled={submitting}\n className=\"w-full rounded-lg bg-primary px-4 py-2.5 text-sm font-semibold text-primary-foreground hover:bg-primary/90 disabled:opacity-50 disabled:cursor-not-allowed transition-colors flex items-center justify-center gap-2\"\n >\n {submitting && (\n <SpinnerIcon className=\"h-4 w-4 animate-spin\" />\n )}\n {submitting ? 'Logging in...' : 'Log in'}\n </button>\n </form>\n </div>\n </div>\n )\n}\n"],"mappings":"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","names":["import_react","import_lucide_react","import_react","import_jsx_runtime","import_react","import_class_variance_authority","import_jsx_runtime","import_react","import_class_variance_authority","import_jsx_runtime","import_react","import_class_variance_authority","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_class_variance_authority","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_class_variance_authority","import_jsx_runtime","import_react","import_lucide_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_class_variance_authority","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_lucide_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_lucide_react","import_jsx_runtime","import_jsx_runtime","import_react","import_lucide_react","import_jsx_runtime","import_lucide_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_lucide_react","import_jsx_runtime","import_react","import_lucide_react","import_jsx_runtime","import_lucide_react","import_jsx_runtime","import_lucide_react","import_jsx_runtime","import_jsx_runtime","table","_","import_jsx_runtime","import_jsx_runtime","import_react","import_lucide_react","import_jsx_runtime","import_lucide_react","import_jsx_runtime","import_react","import_lucide_react","import_jsx_runtime","import_react","import_jsx_runtime","className","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_client","import_react","import_react","import_jsx_runtime","import_jsx_runtime","superjson"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/theme/defaults.ts","../src/theme/create-theme.ts","../src/theme/theme-to-css.ts","../src/theme/theme-provider.tsx","../src/theme/use-theme-mode.ts","../src/lib/cn.ts","../src/icons/provider-icons.ts","../src/icons/status-icons.ts","../src/primitives/button.tsx","../src/primitives/icon-button.tsx","../src/primitives/badge.tsx","../src/primitives/card.tsx","../src/primitives/label.tsx","../src/primitives/separator.tsx","../src/primitives/skeleton.tsx","../src/primitives/input.tsx","../src/primitives/select.tsx","../src/primitives/checkbox.tsx","../src/primitives/switch.tsx","../src/primitives/dialog.tsx","../src/primitives/dropdown.tsx","../src/primitives/tooltip.tsx","../src/primitives/popover.tsx","../src/primitives/tabs.tsx","../src/primitives/scroll-area.tsx","../src/primitives/floating-panel.tsx","../src/hooks/use-is-mobile.ts","../src/primitives/mobile-drawer.tsx","../src/primitives/bottom-sheet.tsx","../src/composites/status-badge.tsx","../src/composites/provider-badge.tsx","../src/composites/version-badge.tsx","../src/composites/form-field.tsx","../src/composites/page-header.tsx","../src/composites/empty-state.tsx","../src/composites/confirm-dialog.tsx","../src/composites/stat-card.tsx","../src/composites/key-value-list.tsx","../src/composites/code-block.tsx","../src/composites/filter-bar.tsx","../src/composites/app-shell/sidebar-item.tsx","../src/composites/app-shell/sidebar.tsx","../src/composites/app-shell/app-shell.tsx","../src/composites/data-table/data-table.tsx","../src/composites/data-table/data-table-header.tsx","../src/composites/data-table/data-table-row.tsx","../src/composites/data-table/data-table-pagination.tsx","../src/composites/device-card.tsx","../src/composites/device-grid.tsx","../src/composites/pipeline-step.tsx","../src/composites/pipeline-runtime-selector.tsx","../src/composites/pipeline-builder.tsx","../src/lib/validate-template.ts","../src/composites/detection-colors.ts","../src/composites/detection-canvas.tsx","../src/composites/detection-result-tree.tsx","../src/composites/step-timings.tsx","../src/composites/image-selector.tsx","../src/composites/inference-config-selector.tsx","../src/composites/mount-addon-page.tsx","../src/composites/dev-shell.tsx","../src/composites/login-form.tsx"],"sourcesContent":["export * from './theme'\nexport * from './lib'\nexport * from './icons'\nexport * from './primitives'\nexport * from './composites'\nexport * from './hooks'\n","import type { CamStackColorTokens, CamStackTheme } from './types'\n\nconst providerColors: CamStackColorTokens['provider'] = {\n frigate: '#3b82f6',\n scrypted: '#a855f7',\n reolink: '#06b6d4',\n homeAssistant: '#22d3ee',\n rtsp: '#78716c',\n}\n\nexport const darkColors: CamStackColorTokens = {\n primary: '#f59e42',\n primaryForeground: '#0c0a09',\n background: '#0c0a09',\n backgroundElevated: '#1c1917',\n surface: '#1c1917',\n surfaceHover: '#292524',\n border: '#292524',\n borderSubtle: '#1c1917',\n foreground: '#fafaf9',\n foregroundMuted: '#a8a29e',\n foregroundSubtle: '#78716c',\n foregroundDisabled: '#57534e',\n success: '#4ade80',\n warning: '#fbbf24',\n danger: '#f87171',\n info: '#60a5fa',\n provider: providerColors,\n}\n\nexport const lightColors: CamStackColorTokens = {\n primary: '#e67e22',\n primaryForeground: '#ffffff',\n background: '#fafaf9',\n backgroundElevated: '#ffffff',\n surface: '#f5f5f4',\n surfaceHover: '#e7e5e4',\n border: '#d6d3d1',\n borderSubtle: '#e7e5e4',\n foreground: '#1c1917',\n foregroundMuted: '#57534e',\n foregroundSubtle: '#78716c',\n foregroundDisabled: '#a8a29e',\n success: '#16a34a',\n warning: '#d97706',\n danger: '#dc2626',\n info: '#2563eb',\n provider: providerColors,\n}\n\nexport const defaultTheme: CamStackTheme = {\n colors: {\n dark: darkColors,\n light: lightColors,\n },\n spacing: {\n xs: 2,\n sm: 4,\n md: 8,\n lg: 12,\n xl: 16,\n '2xl': 24,\n '3xl': 32,\n },\n radius: {\n sm: 4,\n md: 6,\n lg: 8,\n xl: 12,\n },\n typography: {\n fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif',\n sizes: {\n xs: { fontSize: 10, lineHeight: 14 },\n sm: { fontSize: 11, lineHeight: 16 },\n base: { fontSize: 12, lineHeight: 18 },\n lg: { fontSize: 13, lineHeight: 18 },\n xl: { fontSize: 14, lineHeight: 20 },\n '2xl': { fontSize: 16, lineHeight: 22 },\n '3xl': { fontSize: 20, lineHeight: 28 },\n },\n weights: {\n regular: 400,\n medium: 500,\n semibold: 600,\n bold: 700,\n },\n },\n table: {\n rowHeight: 28,\n headerHeight: 24,\n cellPaddingX: 8,\n cellPaddingY: 6,\n },\n sidebar: {\n width: 176,\n itemHeight: 28,\n iconSize: 14,\n },\n}\n","import type { CamStackTheme, DeepPartial } from './types'\nimport { defaultTheme } from './defaults'\n\nfunction deepMerge<T extends object>(target: T, source: DeepPartial<T>): T {\n const result = { ...target }\n for (const key in source) {\n const sourceVal = source[key]\n const targetVal = target[key]\n if (\n sourceVal !== undefined &&\n typeof sourceVal === 'object' &&\n sourceVal !== null &&\n !Array.isArray(sourceVal) &&\n typeof targetVal === 'object' &&\n targetVal !== null\n ) {\n result[key] = deepMerge(\n targetVal as Record<string, unknown>,\n sourceVal as Record<string, unknown>,\n ) as T[typeof key]\n } else if (sourceVal !== undefined) {\n result[key] = sourceVal as T[typeof key]\n }\n }\n return result\n}\n\nexport function createTheme(overrides?: DeepPartial<CamStackTheme>): CamStackTheme {\n if (!overrides) return structuredClone(defaultTheme)\n return deepMerge(structuredClone(defaultTheme), overrides)\n}\n","import type { CamStackColorTokens, CamStackTheme } from './types'\n\nfunction camelToKebab(str: string): string {\n return str.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`)\n}\n\nfunction colorTokenToCssVar(key: string): string {\n return `--color-${camelToKebab(key)}`\n}\n\nfunction generateColorBlock(colors: CamStackColorTokens): string {\n const lines: string[] = []\n for (const [key, value] of Object.entries(colors)) {\n if (key === 'provider') continue\n lines.push(` ${colorTokenToCssVar(key)}: ${value};`)\n }\n return lines.join('\\n')\n}\n\nfunction generateProviderColors(provider: CamStackColorTokens['provider']): string {\n const lines: string[] = []\n for (const [key, value] of Object.entries(provider)) {\n lines.push(` --color-provider-${camelToKebab(key)}: ${value};`)\n }\n return lines.join('\\n')\n}\n\nfunction generateSpacingTokens(spacing: CamStackTheme['spacing']): string {\n const lines: string[] = []\n for (const [key, value] of Object.entries(spacing)) {\n lines.push(` --spacing-${key}: ${value}px;`)\n }\n return lines.join('\\n')\n}\n\nfunction generateRadiusTokens(radius: CamStackTheme['radius']): string {\n const lines: string[] = []\n for (const [key, value] of Object.entries(radius)) {\n lines.push(` --radius-${key}: ${value}px;`)\n }\n return lines.join('\\n')\n}\n\nexport function themeToCss(theme: CamStackTheme): string {\n const darkColorBlock = generateColorBlock(theme.colors.dark)\n const lightColorBlock = generateColorBlock(theme.colors.light)\n const providerBlock = generateProviderColors(theme.colors.dark.provider)\n const spacingBlock = generateSpacingTokens(theme.spacing)\n const radiusBlock = generateRadiusTokens(theme.radius)\n\n return `@theme {\n${providerBlock}\n${spacingBlock}\n${radiusBlock}\n}\n\n.dark {\n${darkColorBlock}\n}\n\n.light {\n${lightColorBlock}\n}\n\n@media (prefers-color-scheme: dark) {\n :root {\n${darkColorBlock.replace(/^ /gm, ' ')}\n }\n}\n\n@media (prefers-color-scheme: light) {\n :root {\n${lightColorBlock.replace(/^ /gm, ' ')}\n }\n}\n`\n}\n","import { createContext, useCallback, useEffect, useMemo, useState } from 'react'\nimport type { ReactNode } from 'react'\nimport type { ThemeMode, UseThemeModeReturn } from './types'\n\nexport const ThemeContext = createContext<UseThemeModeReturn | null>(null)\n\ninterface ThemeProviderProps {\n children: ReactNode\n defaultMode?: ThemeMode\n storageKey?: string\n}\n\nconst TOGGLE_ORDER: readonly ThemeMode[] = ['dark', 'light', 'system'] as const\n\nfunction getSystemPreference(): 'dark' | 'light' {\n if (typeof window === 'undefined') return 'dark'\n return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'\n}\n\nfunction getInitialMode(storageKey: string, defaultMode: ThemeMode): ThemeMode {\n if (typeof window === 'undefined') return defaultMode\n const stored = localStorage.getItem(storageKey)\n if (stored === 'dark' || stored === 'light' || stored === 'system') {\n return stored\n }\n return defaultMode\n}\n\nfunction resolveMode(mode: ThemeMode): 'dark' | 'light' {\n if (mode === 'system') return getSystemPreference()\n return mode\n}\n\nexport function ThemeProvider({\n children,\n defaultMode = 'system',\n storageKey = 'camstack-theme-mode',\n}: ThemeProviderProps) {\n const [mode, setModeState] = useState<ThemeMode>(() => getInitialMode(storageKey, defaultMode))\n const [resolvedMode, setResolvedMode] = useState<'dark' | 'light'>(() => resolveMode(mode))\n\n const setMode = useCallback(\n (newMode: ThemeMode) => {\n setModeState(newMode)\n setResolvedMode(resolveMode(newMode))\n if (typeof window !== 'undefined') {\n localStorage.setItem(storageKey, newMode)\n }\n },\n [storageKey],\n )\n\n const toggleMode = useCallback(() => {\n const currentIndex = TOGGLE_ORDER.indexOf(mode)\n const nextIndex = (currentIndex + 1) % TOGGLE_ORDER.length\n setMode(TOGGLE_ORDER[nextIndex] ?? 'dark')\n }, [mode, setMode])\n\n // Apply CSS class on document.documentElement\n useEffect(() => {\n if (typeof document === 'undefined') return\n\n const root = document.documentElement\n root.classList.remove('dark', 'light')\n // Always apply the resolved class — even in 'system' mode, the CSS\n // variables need the .dark or .light class to activate\n root.classList.add(resolvedMode)\n }, [mode, resolvedMode])\n\n // Listen for system theme changes when in 'system' mode\n useEffect(() => {\n if (typeof window === 'undefined' || mode !== 'system') return\n\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)')\n const handleChange = () => {\n setResolvedMode(getSystemPreference())\n }\n\n mediaQuery.addEventListener('change', handleChange)\n return () => mediaQuery.removeEventListener('change', handleChange)\n }, [mode])\n\n const value = useMemo<UseThemeModeReturn>(\n () => ({ mode, resolvedMode, setMode, toggleMode }),\n [mode, resolvedMode, setMode, toggleMode],\n )\n\n return <ThemeContext.Provider value={value}>{children}</ThemeContext.Provider>\n}\n","import { useContext } from 'react'\nimport { ThemeContext } from './theme-provider'\nimport type { UseThemeModeReturn } from './types'\n\nexport function useThemeMode(): UseThemeModeReturn {\n const context = useContext(ThemeContext)\n if (!context) {\n throw new Error('useThemeMode must be used within a ThemeProvider')\n }\n return context\n}\n","import { type ClassValue, clsx } from 'clsx'\nimport { twMerge } from 'tailwind-merge'\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","import { Ship, Shield, Radio, Home, Cast, type LucideIcon } from 'lucide-react'\n\nexport type ProviderType = 'frigate' | 'scrypted' | 'reolink' | 'homeAssistant' | 'rtsp'\n\nexport const providerIcons: Record<ProviderType, LucideIcon> = {\n frigate: Ship,\n scrypted: Shield,\n reolink: Radio,\n homeAssistant: Home,\n rtsp: Cast,\n}\n","import { CircleCheck, CircleX, CircleAlert, CircleHelp, type LucideIcon } from 'lucide-react'\n\nexport type StatusType = 'online' | 'offline' | 'degraded' | 'unknown'\n\nexport const statusIcons: Record<StatusType, LucideIcon> = {\n online: CircleCheck,\n offline: CircleX,\n degraded: CircleAlert,\n unknown: CircleHelp,\n}\n","import { type ButtonHTMLAttributes, forwardRef } from 'react'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { cn } from '../lib/cn'\n\nconst buttonVariants = cva(\n 'inline-flex items-center justify-center rounded-md font-medium transition-colors disabled:opacity-50 disabled:pointer-events-none',\n {\n variants: {\n variant: {\n primary: 'bg-primary text-primary-foreground hover:bg-primary/90',\n secondary: 'bg-surface text-foreground hover:bg-surface-hover',\n ghost: 'hover:bg-surface-hover text-foreground-muted',\n danger: 'bg-danger text-white hover:bg-danger/90',\n outline: 'border border-border bg-transparent hover:bg-surface-hover',\n },\n size: {\n sm: 'h-7 px-2.5 text-xs gap-1.5',\n md: 'h-8 px-3 text-sm gap-2',\n lg: 'h-9 px-4 text-sm gap-2',\n },\n },\n defaultVariants: {\n variant: 'primary',\n size: 'sm',\n },\n }\n)\n\nexport interface ButtonProps\n extends ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {}\n\nexport const Button = forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, ...props }, ref) => {\n return (\n <button\n ref={ref}\n className={cn(buttonVariants({ variant, size }), className)}\n {...props}\n />\n )\n }\n)\n\nButton.displayName = 'Button'\n","import { type ButtonHTMLAttributes, forwardRef } from 'react'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { type LucideIcon } from 'lucide-react'\nimport { cn } from '../lib/cn'\n\nconst iconButtonVariants = cva(\n 'inline-flex items-center justify-center rounded-md font-medium transition-colors disabled:opacity-50 disabled:pointer-events-none',\n {\n variants: {\n variant: {\n primary: 'bg-primary text-primary-foreground hover:bg-primary/90',\n secondary: 'bg-surface text-foreground hover:bg-surface-hover',\n ghost: 'hover:bg-surface-hover text-foreground-muted',\n danger: 'bg-danger text-white hover:bg-danger/90',\n outline: 'border border-border bg-transparent hover:bg-surface-hover',\n },\n size: {\n sm: 'h-7 w-7',\n md: 'h-8 w-8',\n lg: 'h-9 w-9',\n },\n },\n defaultVariants: {\n variant: 'primary',\n size: 'sm',\n },\n }\n)\n\nexport interface IconButtonProps\n extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'children'>,\n VariantProps<typeof iconButtonVariants> {\n icon: LucideIcon\n 'aria-label': string\n}\n\nexport const IconButton = forwardRef<HTMLButtonElement, IconButtonProps>(\n ({ className, variant, size, icon: Icon, ...props }, ref) => {\n return (\n <button\n ref={ref}\n className={cn(iconButtonVariants({ variant, size }), className)}\n {...props}\n >\n <Icon className=\"h-4 w-4\" />\n </button>\n )\n }\n)\n\nIconButton.displayName = 'IconButton'\n","import { type HTMLAttributes, forwardRef } from 'react'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { cn } from '../lib/cn'\n\nconst badgeVariants = cva(\n 'inline-flex items-center rounded-full text-xs font-medium px-2 py-0.5',\n {\n variants: {\n variant: {\n default: 'bg-surface-hover text-foreground',\n success: 'bg-success/15 text-success',\n warning: 'bg-warning/15 text-warning',\n danger: 'bg-danger/15 text-danger',\n info: 'bg-info/15 text-info',\n },\n styleVariant: {\n solid: '',\n outline: 'border bg-transparent',\n },\n },\n defaultVariants: {\n variant: 'default',\n styleVariant: 'solid',\n },\n }\n)\n\nexport interface BadgeProps\n extends Omit<HTMLAttributes<HTMLSpanElement>, 'style'>,\n VariantProps<typeof badgeVariants> {\n style?: 'solid' | 'outline'\n}\n\nexport const Badge = forwardRef<HTMLSpanElement, BadgeProps>(\n ({ className, variant, style, ...props }, ref) => {\n return (\n <span\n ref={ref}\n className={cn(badgeVariants({ variant, styleVariant: style }), className)}\n {...props}\n />\n )\n }\n)\n\nBadge.displayName = 'Badge'\n","import { type HTMLAttributes, forwardRef } from 'react'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { cn } from '../lib/cn'\n\nconst cardVariants = cva('rounded-lg p-3', {\n variants: {\n variant: {\n flat: 'bg-surface',\n bordered: 'bg-surface border border-border',\n },\n },\n defaultVariants: {\n variant: 'bordered',\n },\n})\n\nexport interface CardProps\n extends HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof cardVariants> {}\n\nexport const Card = forwardRef<HTMLDivElement, CardProps>(\n ({ className, variant, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={cn(cardVariants({ variant }), className)}\n {...props}\n />\n )\n }\n)\n\nCard.displayName = 'Card'\n","import { type LabelHTMLAttributes, forwardRef } from 'react'\nimport { cn } from '../lib/cn'\n\nexport interface LabelProps extends LabelHTMLAttributes<HTMLLabelElement> {}\n\nexport const Label = forwardRef<HTMLLabelElement, LabelProps>(\n ({ className, ...props }, ref) => {\n return (\n <label\n ref={ref}\n className={cn(\n 'text-[10px] uppercase tracking-wider text-foreground-muted font-medium',\n className\n )}\n {...props}\n />\n )\n }\n)\n\nLabel.displayName = 'Label'\n","import { type HTMLAttributes, forwardRef } from 'react'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { cn } from '../lib/cn'\n\nconst separatorVariants = cva('', {\n variants: {\n orientation: {\n horizontal: 'h-px w-full bg-border-subtle',\n vertical: 'w-px h-full bg-border-subtle',\n },\n },\n defaultVariants: {\n orientation: 'horizontal',\n },\n})\n\nexport interface SeparatorProps\n extends HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof separatorVariants> {}\n\nexport const Separator = forwardRef<HTMLDivElement, SeparatorProps>(\n ({ className, orientation, ...props }, ref) => {\n return (\n <div\n ref={ref}\n role=\"separator\"\n className={cn(separatorVariants({ orientation }), className)}\n {...props}\n />\n )\n }\n)\n\nSeparator.displayName = 'Separator'\n","import { type HTMLAttributes, forwardRef } from 'react'\nimport { cn } from '../lib/cn'\n\nexport interface SkeletonProps extends HTMLAttributes<HTMLDivElement> {}\n\nexport const Skeleton = forwardRef<HTMLDivElement, SkeletonProps>(\n ({ className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={cn('animate-pulse bg-surface-hover rounded-md h-4 w-full', className)}\n {...props}\n />\n )\n }\n)\n\nSkeleton.displayName = 'Skeleton'\n","import { type InputHTMLAttributes, type ReactNode, forwardRef } from 'react'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { cn } from '../lib/cn'\n\nconst inputVariants = cva(\n 'h-7 w-full px-2.5 text-xs bg-surface border rounded-md text-foreground placeholder:text-foreground-subtle focus:outline-none focus:ring-1 focus:ring-primary transition-colors',\n {\n variants: {\n state: {\n default: 'border-border',\n error: 'border-danger',\n },\n },\n defaultVariants: {\n state: 'default',\n },\n }\n)\n\nexport interface InputProps\n extends InputHTMLAttributes<HTMLInputElement>,\n VariantProps<typeof inputVariants> {\n leftSlot?: ReactNode\n rightSlot?: ReactNode\n}\n\nexport const Input = forwardRef<HTMLInputElement, InputProps>(\n ({ className, state, leftSlot, rightSlot, ...props }, ref) => {\n if (leftSlot || rightSlot) {\n return (\n <div className=\"relative flex items-center w-full\">\n {leftSlot && (\n <div className=\"absolute left-2.5 flex items-center pointer-events-none\">\n {leftSlot}\n </div>\n )}\n <input\n ref={ref}\n className={cn(\n inputVariants({ state }),\n leftSlot ? 'pl-7' : '',\n rightSlot ? 'pr-7' : '',\n className\n )}\n {...props}\n />\n {rightSlot && (\n <div className=\"absolute right-2.5 flex items-center pointer-events-none\">\n {rightSlot}\n </div>\n )}\n </div>\n )\n }\n\n return (\n <input\n ref={ref}\n className={cn(inputVariants({ state }), className)}\n {...props}\n />\n )\n }\n)\n\nInput.displayName = 'Input'\n","import { type SelectHTMLAttributes, forwardRef } from 'react'\nimport { ChevronDown } from 'lucide-react'\nimport { cn } from '../lib/cn'\n\nexport interface SelectOption {\n value: string\n label: string\n}\n\nexport interface SelectProps extends SelectHTMLAttributes<HTMLSelectElement> {\n options: SelectOption[]\n}\n\nexport const Select = forwardRef<HTMLSelectElement, SelectProps>(\n ({ className, options, ...props }, ref) => {\n return (\n <div className=\"relative w-full\">\n <select\n ref={ref}\n className={cn(\n 'h-7 w-full px-2.5 text-xs bg-surface border border-border rounded-md text-foreground appearance-none pr-7 focus:outline-none focus:ring-1 focus:ring-primary',\n className\n )}\n {...props}\n >\n {options.map((option) => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </select>\n <div className=\"absolute right-2 top-1/2 -translate-y-1/2 pointer-events-none text-foreground-muted\">\n <ChevronDown className=\"h-3.5 w-3.5\" />\n </div>\n </div>\n )\n }\n)\n\nSelect.displayName = 'Select'\n","import { type InputHTMLAttributes, forwardRef } from 'react'\nimport { cn } from '../lib/cn'\n\nexport interface CheckboxProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'type'> {}\n\nexport const Checkbox = forwardRef<HTMLInputElement, CheckboxProps>(\n ({ className, ...props }, ref) => {\n return (\n <input\n ref={ref}\n type=\"checkbox\"\n className={cn(\n 'w-3.5 h-3.5 rounded-sm border border-border accent-primary',\n className\n )}\n {...props}\n />\n )\n }\n)\n\nCheckbox.displayName = 'Checkbox'\n","import { type ButtonHTMLAttributes, forwardRef } from 'react'\nimport { cn } from '../lib/cn'\n\nexport interface SwitchProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'onClick'> {\n checked: boolean\n onCheckedChange: (checked: boolean) => void\n label?: string\n}\n\nexport const Switch = forwardRef<HTMLButtonElement, SwitchProps>(\n ({ className, checked, onCheckedChange, label, ...props }, ref) => {\n return (\n <button\n ref={ref}\n role=\"switch\"\n aria-checked={checked}\n type=\"button\"\n onClick={() => onCheckedChange(!checked)}\n className={cn('inline-flex items-center gap-2', className)}\n {...props}\n >\n <span\n className={cn(\n 'w-8 h-4 rounded-full transition-colors',\n checked ? 'bg-primary' : 'bg-surface-hover'\n )}\n >\n <span\n className={cn(\n 'block w-3.5 h-3.5 rounded-full bg-white transition-transform',\n checked ? 'translate-x-4' : 'translate-x-0.5'\n )}\n />\n </span>\n {label && <span className=\"text-xs text-foreground\">{label}</span>}\n </button>\n )\n }\n)\n\nSwitch.displayName = 'Switch'\n","import {\n type HTMLAttributes,\n type ReactNode,\n createContext,\n forwardRef,\n useCallback,\n useContext,\n useEffect,\n useId,\n useRef,\n useState,\n} from 'react'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { cn } from '../lib/cn'\n\ninterface DialogContextValue {\n open: boolean\n setOpen: (open: boolean) => void\n contentId: string\n}\n\nconst DialogContext = createContext<DialogContextValue | null>(null)\n\nfunction useDialogContext() {\n const ctx = useContext(DialogContext)\n if (!ctx) throw new Error('Dialog compound components must be used within <Dialog>')\n return ctx\n}\n\n/* ── Root ── */\n\ninterface DialogProps {\n children: ReactNode\n open?: boolean\n onOpenChange?: (open: boolean) => void\n}\n\nexport function Dialog({ children, open: controlledOpen, onOpenChange }: DialogProps) {\n const [uncontrolledOpen, setUncontrolledOpen] = useState(false)\n const open = controlledOpen ?? uncontrolledOpen\n const contentId = useId()\n\n const setOpen = useCallback(\n (next: boolean) => {\n onOpenChange?.(next)\n if (controlledOpen === undefined) setUncontrolledOpen(next)\n },\n [controlledOpen, onOpenChange]\n )\n\n return (\n <DialogContext.Provider value={{ open, setOpen, contentId }}>\n {children}\n </DialogContext.Provider>\n )\n}\n\n/* ── Trigger ── */\n\nexport function DialogTrigger({ children, ...props }: HTMLAttributes<HTMLButtonElement>) {\n const { setOpen } = useDialogContext()\n return (\n <button type=\"button\" onClick={() => setOpen(true)} {...props}>\n {children}\n </button>\n )\n}\n\n/* ── Content ── */\n\nconst contentVariants = cva(\n 'bg-background-elevated border border-border rounded-lg p-4 backdrop:bg-black/50 backdrop:backdrop-blur-sm max-w-[calc(100vw-2rem)] max-h-[calc(100dvh-2rem)] overflow-y-auto',\n {\n variants: {\n width: {\n sm: 'max-w-sm',\n md: 'max-w-md',\n lg: 'max-w-lg',\n },\n },\n defaultVariants: { width: 'md' },\n }\n)\n\nexport interface DialogContentProps\n extends HTMLAttributes<HTMLDialogElement>,\n VariantProps<typeof contentVariants> {}\n\nexport const DialogContent = forwardRef<HTMLDialogElement, DialogContentProps>(\n ({ className, width, children, ...props }, ref) => {\n const { open, setOpen, contentId } = useDialogContext()\n const innerRef = useRef<HTMLDialogElement>(null)\n const dialogRef = (ref as React.RefObject<HTMLDialogElement>) ?? innerRef\n\n useEffect(() => {\n const el = dialogRef.current\n if (!el) return\n if (open && !el.open) el.showModal()\n if (!open && el.open) el.close()\n }, [open, dialogRef])\n\n const handleClick = (e: React.MouseEvent<HTMLDialogElement>) => {\n if (e.target === e.currentTarget) setOpen(false)\n }\n\n return (\n <dialog\n ref={dialogRef}\n id={contentId}\n className={cn(contentVariants({ width }), 'w-full', className)}\n onClick={handleClick}\n onClose={() => setOpen(false)}\n {...props}\n >\n {children}\n </dialog>\n )\n }\n)\n\nDialogContent.displayName = 'DialogContent'\n\n/* ── Header / Footer / Title / Description ── */\n\nexport function DialogHeader({ className, ...props }: HTMLAttributes<HTMLDivElement>) {\n return <div className={cn('flex flex-col gap-1 mb-3', className)} {...props} />\n}\n\nexport function DialogFooter({ className, ...props }: HTMLAttributes<HTMLDivElement>) {\n return <div className={cn('flex justify-end gap-2 mt-4', className)} {...props} />\n}\n\nexport function DialogTitle({ className, ...props }: HTMLAttributes<HTMLHeadingElement>) {\n return <h2 className={cn('text-sm font-semibold text-foreground', className)} {...props} />\n}\n\nexport function DialogDescription({ className, ...props }: HTMLAttributes<HTMLParagraphElement>) {\n return <p className={cn('text-xs text-foreground-muted', className)} {...props} />\n}\n","import {\n type ButtonHTMLAttributes,\n type HTMLAttributes,\n type ReactNode,\n createContext,\n useCallback,\n useContext,\n useEffect,\n useId,\n useRef,\n useState,\n} from 'react'\nimport { type LucideIcon } from 'lucide-react'\nimport { cn } from '../lib/cn'\n\ninterface DropdownContextValue {\n open: boolean\n setOpen: (open: boolean) => void\n triggerId: string\n contentId: string\n}\n\nconst DropdownContext = createContext<DropdownContextValue | null>(null)\n\nfunction useDropdownContext() {\n const ctx = useContext(DropdownContext)\n if (!ctx) throw new Error('Dropdown compound components must be used within <Dropdown>')\n return ctx\n}\n\n/* ── Root ── */\n\nexport function Dropdown({ children }: { children: ReactNode }) {\n const [open, setOpen] = useState(false)\n const triggerId = useId()\n const contentId = useId()\n\n return (\n <DropdownContext.Provider value={{ open, setOpen, triggerId, contentId }}>\n <div className=\"relative inline-block\">{children}</div>\n </DropdownContext.Provider>\n )\n}\n\n/* ── Trigger ── */\n\nexport function DropdownTrigger({ children, ...props }: ButtonHTMLAttributes<HTMLButtonElement>) {\n const { open, setOpen, triggerId, contentId } = useDropdownContext()\n return (\n <button\n type=\"button\"\n id={triggerId}\n aria-haspopup=\"menu\"\n aria-expanded={open}\n aria-controls={open ? contentId : undefined}\n onClick={() => setOpen(!open)}\n {...props}\n >\n {children}\n </button>\n )\n}\n\n/* ── Content ── */\n\nexport function DropdownContent({ className, children, ...props }: HTMLAttributes<HTMLDivElement>) {\n const { open, setOpen, contentId, triggerId } = useDropdownContext()\n const ref = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n if (!open) return\n const handler = (e: MouseEvent) => {\n const el = ref.current\n const trigger = document.getElementById(triggerId)\n if (el && !el.contains(e.target as Node) && !trigger?.contains(e.target as Node)) {\n setOpen(false)\n }\n }\n const escHandler = (e: KeyboardEvent) => {\n if (e.key === 'Escape') setOpen(false)\n }\n document.addEventListener('mousedown', handler)\n document.addEventListener('keydown', escHandler)\n return () => {\n document.removeEventListener('mousedown', handler)\n document.removeEventListener('keydown', escHandler)\n }\n }, [open, setOpen, triggerId])\n\n if (!open) return null\n\n return (\n <div\n ref={ref}\n id={contentId}\n role=\"menu\"\n aria-labelledby={triggerId}\n className={cn(\n 'absolute left-0 top-full z-50 mt-1 bg-background-elevated border border-border rounded-md shadow-lg py-1 min-w-[160px]',\n className\n )}\n {...props}\n >\n {children}\n </div>\n )\n}\n\n/* ── Item ── */\n\ninterface DropdownItemProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n icon?: LucideIcon\n variant?: 'default' | 'danger'\n}\n\nexport function DropdownItem({\n className,\n icon: Icon,\n variant = 'default',\n children,\n onClick,\n ...props\n}: DropdownItemProps) {\n const { setOpen } = useDropdownContext()\n\n const handleClick = useCallback(\n (e: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(e)\n setOpen(false)\n },\n [onClick, setOpen]\n )\n\n return (\n <button\n type=\"button\"\n role=\"menuitem\"\n className={cn(\n 'h-7 text-xs px-2 w-full text-left flex items-center gap-2',\n variant === 'danger'\n ? 'text-danger hover:bg-danger/10'\n : 'text-foreground hover:bg-surface-hover',\n className\n )}\n onClick={handleClick}\n {...props}\n >\n {Icon && <Icon size={14} />}\n {children}\n </button>\n )\n}\n","import {\n type HTMLAttributes,\n type ReactNode,\n createContext,\n useContext,\n useId,\n useRef,\n useState,\n} from 'react'\nimport { cn } from '../lib/cn'\n\ninterface TooltipContextValue {\n open: boolean\n show: () => void\n hide: () => void\n tooltipId: string\n}\n\nconst TooltipContext = createContext<TooltipContextValue | null>(null)\n\nfunction useTooltipContext() {\n const ctx = useContext(TooltipContext)\n if (!ctx) throw new Error('Tooltip compound components must be used within <Tooltip>')\n return ctx\n}\n\n/* ── Root ── */\n\nexport function Tooltip({ children }: { children: ReactNode }) {\n const [open, setOpen] = useState(false)\n const timerRef = useRef<ReturnType<typeof setTimeout>>(null)\n const tooltipId = useId()\n\n const show = () => {\n timerRef.current = setTimeout(() => setOpen(true), 300)\n }\n\n const hide = () => {\n if (timerRef.current) clearTimeout(timerRef.current)\n setOpen(false)\n }\n\n return (\n <TooltipContext.Provider value={{ open, show, hide, tooltipId }}>\n <div className=\"relative inline-block\">{children}</div>\n </TooltipContext.Provider>\n )\n}\n\n/* ── Trigger ── */\n\nexport function TooltipTrigger({ children, ...props }: HTMLAttributes<HTMLDivElement>) {\n const { show, hide, tooltipId, open } = useTooltipContext()\n\n return (\n <div\n onMouseEnter={show}\n onMouseLeave={hide}\n onFocus={show}\n onBlur={hide}\n aria-describedby={open ? tooltipId : undefined}\n {...props}\n >\n {children}\n </div>\n )\n}\n\n/* ── Content ── */\n\nexport function TooltipContent({ className, children, ...props }: HTMLAttributes<HTMLDivElement>) {\n const { open, tooltipId } = useTooltipContext()\n\n return (\n <div\n id={tooltipId}\n role=\"tooltip\"\n className={cn(\n 'absolute bottom-full left-1/2 -translate-x-1/2 mb-2 bg-foreground text-background text-xs px-2 py-1 rounded-md shadow-md whitespace-nowrap pointer-events-none transition-opacity duration-150',\n open ? 'opacity-100' : 'opacity-0',\n className\n )}\n {...props}\n >\n {children}\n </div>\n )\n}\n","import {\n type ButtonHTMLAttributes,\n type HTMLAttributes,\n type ReactNode,\n createContext,\n useCallback,\n useContext,\n useEffect,\n useId,\n useRef,\n useState,\n} from 'react'\nimport { cn } from '../lib/cn'\n\ninterface PopoverContextValue {\n open: boolean\n setOpen: (open: boolean) => void\n triggerId: string\n contentId: string\n}\n\nconst PopoverContext = createContext<PopoverContextValue | null>(null)\n\nfunction usePopoverContext() {\n const ctx = useContext(PopoverContext)\n if (!ctx) throw new Error('Popover compound components must be used within <Popover>')\n return ctx\n}\n\n/* ── Root ── */\n\ninterface PopoverProps {\n children: ReactNode\n open?: boolean\n onOpenChange?: (open: boolean) => void\n}\n\nexport function Popover({ children, open: controlledOpen, onOpenChange }: PopoverProps) {\n const [uncontrolledOpen, setUncontrolledOpen] = useState(false)\n const open = controlledOpen ?? uncontrolledOpen\n const triggerId = useId()\n const contentId = useId()\n\n const setOpen = useCallback(\n (next: boolean) => {\n onOpenChange?.(next)\n if (controlledOpen === undefined) setUncontrolledOpen(next)\n },\n [controlledOpen, onOpenChange]\n )\n\n return (\n <PopoverContext.Provider value={{ open, setOpen, triggerId, contentId }}>\n <div className=\"relative inline-block\">{children}</div>\n </PopoverContext.Provider>\n )\n}\n\n/* ── Trigger ── */\n\nexport function PopoverTrigger({ children, ...props }: ButtonHTMLAttributes<HTMLButtonElement>) {\n const { open, setOpen, triggerId, contentId } = usePopoverContext()\n return (\n <button\n type=\"button\"\n id={triggerId}\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n aria-controls={open ? contentId : undefined}\n onClick={() => setOpen(!open)}\n {...props}\n >\n {children}\n </button>\n )\n}\n\n/* ── Content ── */\n\nexport function PopoverContent({ className, children, ...props }: HTMLAttributes<HTMLDivElement>) {\n const { open, setOpen, contentId, triggerId } = usePopoverContext()\n const ref = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n if (!open) return\n const handler = (e: MouseEvent) => {\n const el = ref.current\n const trigger = document.getElementById(triggerId)\n if (el && !el.contains(e.target as Node) && !trigger?.contains(e.target as Node)) {\n setOpen(false)\n }\n }\n const escHandler = (e: KeyboardEvent) => {\n if (e.key === 'Escape') setOpen(false)\n }\n document.addEventListener('mousedown', handler)\n document.addEventListener('keydown', escHandler)\n return () => {\n document.removeEventListener('mousedown', handler)\n document.removeEventListener('keydown', escHandler)\n }\n }, [open, setOpen, triggerId])\n\n if (!open) return null\n\n return (\n <div\n ref={ref}\n id={contentId}\n role=\"dialog\"\n aria-labelledby={triggerId}\n className={cn(\n 'absolute left-0 top-full z-50 mt-1 bg-background-elevated border border-border rounded-lg shadow-lg p-3',\n className\n )}\n {...props}\n >\n {children}\n </div>\n )\n}\n","import {\n type ButtonHTMLAttributes,\n type HTMLAttributes,\n type ReactNode,\n createContext,\n useCallback,\n useContext,\n useState,\n} from 'react'\nimport { cn } from '../lib/cn'\n\ninterface TabsContextValue {\n value: string\n setValue: (value: string) => void\n}\n\nconst TabsContext = createContext<TabsContextValue | null>(null)\n\nfunction useTabsContext() {\n const ctx = useContext(TabsContext)\n if (!ctx) throw new Error('Tabs compound components must be used within <Tabs>')\n return ctx\n}\n\n/* ── Root ── */\n\ninterface TabsProps extends HTMLAttributes<HTMLDivElement> {\n value?: string\n onValueChange?: (value: string) => void\n defaultValue?: string\n}\n\nexport function Tabs({\n value: controlledValue,\n onValueChange,\n defaultValue = '',\n className,\n ...props\n}: TabsProps) {\n const [uncontrolledValue, setUncontrolledValue] = useState(defaultValue)\n const value = controlledValue ?? uncontrolledValue\n\n const setValue = useCallback(\n (next: string) => {\n onValueChange?.(next)\n if (controlledValue === undefined) setUncontrolledValue(next)\n },\n [controlledValue, onValueChange]\n )\n\n return (\n <TabsContext.Provider value={{ value, setValue }}>\n <div className={className} {...props} />\n </TabsContext.Provider>\n )\n}\n\n/* ── TabsList ── */\n\nexport function TabsList({ className, ...props }: HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n role=\"tablist\"\n className={cn('flex flex-row border-b border-border-subtle', className)}\n {...props}\n />\n )\n}\n\n/* ── TabsTrigger ── */\n\ninterface TabsTriggerProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n value: string\n}\n\nexport function TabsTrigger({ value, className, ...props }: TabsTriggerProps) {\n const { value: activeValue, setValue } = useTabsContext()\n const isActive = value === activeValue\n const panelId = `tabpanel-${value}`\n\n return (\n <button\n type=\"button\"\n role=\"tab\"\n aria-selected={isActive}\n aria-controls={panelId}\n tabIndex={isActive ? 0 : -1}\n className={cn(\n 'h-7 text-xs px-3 transition-colors',\n isActive\n ? 'border-b-2 border-primary text-foreground font-medium'\n : 'text-foreground-muted hover:text-foreground',\n className\n )}\n onClick={() => setValue(value)}\n {...props}\n />\n )\n}\n\n/* ── TabsContent ── */\n\ninterface TabsContentProps extends HTMLAttributes<HTMLDivElement> {\n value: string\n}\n\nexport function TabsContent({ value, className, ...props }: TabsContentProps) {\n const { value: activeValue } = useTabsContext()\n if (value !== activeValue) return null\n\n return (\n <div\n role=\"tabpanel\"\n id={`tabpanel-${value}`}\n className={cn('pt-3', className)}\n {...props}\n />\n )\n}\n","import { type HTMLAttributes, forwardRef } from 'react'\nimport { cn } from '../lib/cn'\n\nexport interface ScrollAreaProps extends HTMLAttributes<HTMLDivElement> {}\n\nexport const ScrollArea = forwardRef<HTMLDivElement, ScrollAreaProps>(\n ({ className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={cn(\n 'overflow-auto [&::-webkit-scrollbar]:w-1 [&::-webkit-scrollbar-track]:bg-transparent [&::-webkit-scrollbar-thumb]:bg-surface-hover [&::-webkit-scrollbar-thumb]:rounded-full',\n className\n )}\n {...props}\n />\n )\n }\n)\n\nScrollArea.displayName = 'ScrollArea'\n","import { useRef, useState, useCallback, useEffect, type ReactNode } from 'react';\nimport { X, Minimize2, Maximize2, GripHorizontal } from 'lucide-react';\nimport { cn } from '../lib/cn';\nimport { useIsMobile } from '../hooks/use-is-mobile';\n\nexport interface FloatingPanelProps {\n /** Panel title displayed in the title bar */\n title: string;\n /** Called when the close button is clicked */\n onClose: () => void;\n /** Panel content */\n children: ReactNode;\n /** Default width in pixels */\n defaultWidth?: number;\n /** Default height in pixels */\n defaultHeight?: number;\n /** Minimum width in pixels */\n minWidth?: number;\n /** Minimum height in pixels */\n minHeight?: number;\n /** Offset index to stagger multiple panels (adds 30px offset per index) */\n offsetIndex?: number;\n /** Additional CSS classes for the panel container */\n className?: string;\n}\n\nexport function FloatingPanel({\n title,\n onClose,\n children,\n defaultWidth = 360,\n defaultHeight = 280,\n minWidth = 280,\n minHeight = 160,\n offsetIndex = 0,\n className,\n}: FloatingPanelProps) {\n const [pos, setPos] = useState({ x: 80 + offsetIndex * 30, y: 80 + offsetIndex * 30 });\n const [size, setSize] = useState({ w: defaultWidth, h: defaultHeight });\n const [minimized, setMinimized] = useState(false);\n const dragging = useRef(false);\n const resizing = useRef(false);\n const offset = useRef({ x: 0, y: 0 });\n const isMobile = useIsMobile();\n\n const onDragStart = useCallback((e: React.MouseEvent) => {\n e.preventDefault();\n dragging.current = true;\n offset.current = { x: e.clientX - pos.x, y: e.clientY - pos.y };\n }, [pos]);\n\n const onResizeStart = useCallback((e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n resizing.current = true;\n offset.current = { x: e.clientX, y: e.clientY };\n }, []);\n\n useEffect(() => {\n const onMouseMove = (e: MouseEvent) => {\n if (dragging.current) setPos({ x: e.clientX - offset.current.x, y: e.clientY - offset.current.y });\n if (resizing.current) {\n const dx = e.clientX - offset.current.x;\n const dy = e.clientY - offset.current.y;\n offset.current = { x: e.clientX, y: e.clientY };\n setSize(prev => ({ w: Math.max(minWidth, prev.w + dx), h: Math.max(minHeight, prev.h + dy) }));\n }\n };\n const onMouseUp = () => { dragging.current = false; resizing.current = false; };\n window.addEventListener('mousemove', onMouseMove);\n window.addEventListener('mouseup', onMouseUp);\n return () => { window.removeEventListener('mousemove', onMouseMove); window.removeEventListener('mouseup', onMouseUp); };\n }, [minWidth, minHeight]);\n\n if (isMobile) {\n return (\n <div\n className={cn(\n 'fixed inset-x-0 bottom-0 z-50 rounded-t-xl border-t border-border bg-background-elevated shadow-2xl flex flex-col overflow-hidden',\n className\n )}\n style={{ maxHeight: '60dvh' }}\n >\n <div className=\"flex items-center justify-between gap-2 px-3 py-2 border-b border-border shrink-0 bg-surface\">\n <span className=\"text-[11px] font-medium truncate\">{title}</span>\n <div className=\"flex items-center gap-1 shrink-0\">\n <button\n onClick={() => setMinimized(!minimized)}\n className=\"p-0.5 rounded hover:bg-surface-hover text-foreground-muted transition-colors\"\n >\n {minimized ? <Maximize2 size={12} /> : <Minimize2 size={12} />}\n </button>\n <button\n onClick={onClose}\n className=\"p-0.5 rounded hover:bg-danger/20 text-foreground-muted hover:text-danger transition-colors\"\n >\n <X size={12} />\n </button>\n </div>\n </div>\n {!minimized && (\n <div className=\"flex-1 min-h-0 overflow-y-auto\">\n {children}\n </div>\n )}\n </div>\n );\n }\n\n return (\n <div\n className={cn(\n 'fixed z-50 rounded-lg border border-border bg-background-elevated shadow-2xl flex flex-col overflow-hidden',\n className\n )}\n style={{ left: pos.x, top: pos.y, width: minimized ? 280 : size.w, height: minimized ? 'auto' : size.h }}\n >\n {/* Title bar — draggable */}\n <div\n onMouseDown={onDragStart}\n className=\"flex items-center justify-between gap-2 px-3 py-2 border-b border-border cursor-move select-none shrink-0 bg-surface\"\n >\n <div className=\"flex items-center gap-2 min-w-0\">\n <GripHorizontal size={12} className=\"text-foreground-subtle shrink-0\" />\n <span className=\"text-[11px] font-medium truncate\">{title}</span>\n </div>\n <div className=\"flex items-center gap-1 shrink-0\">\n <button\n onClick={() => setMinimized(!minimized)}\n className=\"p-0.5 rounded hover:bg-surface-hover text-foreground-muted transition-colors\"\n title={minimized ? 'Restore' : 'Minimize'}\n >\n {minimized ? <Maximize2 size={12} /> : <Minimize2 size={12} />}\n </button>\n <button\n onClick={onClose}\n className=\"p-0.5 rounded hover:bg-danger/20 text-foreground-muted hover:text-danger transition-colors\"\n title=\"Close\"\n >\n <X size={12} />\n </button>\n </div>\n </div>\n\n {/* Content */}\n {!minimized && (\n <div className=\"flex-1 min-h-0 overflow-y-auto relative\">\n {children}\n {/* Resize handle */}\n <div\n onMouseDown={onResizeStart}\n className=\"absolute bottom-0 right-0 w-4 h-4 cursor-nwse-resize\"\n style={{ background: 'linear-gradient(135deg, transparent 50%, var(--color-foreground-subtle) 50%)', opacity: 0.4 }}\n />\n </div>\n )}\n </div>\n );\n}\n","import { useSyncExternalStore } from 'react'\n\nconst MOBILE_QUERY = '(max-width: 767px)'\n\nfunction subscribe(callback: () => void): () => void {\n const mql = window.matchMedia(MOBILE_QUERY)\n mql.addEventListener('change', callback)\n return () => mql.removeEventListener('change', callback)\n}\n\nfunction getSnapshot(): boolean {\n return window.matchMedia(MOBILE_QUERY).matches\n}\n\nfunction getServerSnapshot(): boolean {\n return false\n}\n\nexport function useIsMobile(): boolean {\n return useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot)\n}\n","import { type ReactNode, useEffect, useRef } from 'react'\nimport { cn } from '../lib/cn'\n\nexport interface MobileDrawerProps {\n open: boolean\n onClose: () => void\n children: ReactNode\n className?: string\n /** Width of the drawer panel. Default: 'w-64' */\n width?: string\n}\n\nexport function MobileDrawer({ open, onClose, children, className, width = 'w-64' }: MobileDrawerProps) {\n const drawerRef = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n if (!open) return\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') onClose()\n }\n document.addEventListener('keydown', handleKeyDown)\n document.body.style.overflow = 'hidden'\n return () => {\n document.removeEventListener('keydown', handleKeyDown)\n document.body.style.overflow = ''\n }\n }, [open, onClose])\n\n return (\n <>\n {/* Backdrop */}\n <div\n className={cn(\n 'fixed inset-0 z-40 bg-black/50 backdrop-blur-sm transition-opacity duration-200',\n open ? 'opacity-100' : 'pointer-events-none opacity-0'\n )}\n onClick={onClose}\n aria-hidden=\"true\"\n />\n\n {/* Drawer panel */}\n <div\n ref={drawerRef}\n role=\"dialog\"\n aria-modal=\"true\"\n className={cn(\n 'fixed inset-y-0 left-0 z-50 flex flex-col bg-surface border-r border-border shadow-2xl transition-transform duration-200 ease-out',\n width,\n open ? 'translate-x-0' : '-translate-x-full',\n className\n )}\n >\n {children}\n </div>\n </>\n )\n}\n","import { type ReactNode, useEffect } from 'react'\nimport { X } from 'lucide-react'\nimport { cn } from '../lib/cn'\n\nexport interface BottomSheetProps {\n open: boolean\n onClose: () => void\n title?: string\n children: ReactNode\n className?: string\n}\n\nexport function BottomSheet({ open, onClose, title, children, className }: BottomSheetProps) {\n useEffect(() => {\n if (!open) return\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') onClose()\n }\n document.addEventListener('keydown', handleKeyDown)\n document.body.style.overflow = 'hidden'\n return () => {\n document.removeEventListener('keydown', handleKeyDown)\n document.body.style.overflow = ''\n }\n }, [open, onClose])\n\n return (\n <>\n {/* Backdrop */}\n <div\n className={cn(\n 'fixed inset-0 z-40 bg-black/50 transition-opacity duration-200',\n open ? 'opacity-100' : 'pointer-events-none opacity-0'\n )}\n onClick={onClose}\n aria-hidden=\"true\"\n />\n\n {/* Sheet */}\n <div\n role=\"dialog\"\n aria-modal=\"true\"\n className={cn(\n 'fixed inset-x-0 bottom-0 z-50 flex flex-col bg-background-elevated border-t border-border rounded-t-xl shadow-2xl transition-transform duration-200 ease-out',\n 'max-h-[80dvh]',\n open ? 'translate-y-0' : 'translate-y-full',\n className\n )}\n >\n {/* Handle bar */}\n <div className=\"flex justify-center pt-2 pb-1\">\n <div className=\"h-1 w-8 rounded-full bg-foreground-subtle/30\" />\n </div>\n\n {/* Header */}\n {title && (\n <div className=\"flex items-center justify-between px-4 pb-2\">\n <span className=\"text-sm font-medium text-foreground\">{title}</span>\n <button\n onClick={onClose}\n className=\"p-1 rounded-md hover:bg-surface-hover text-foreground-muted transition-colors\"\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-4 pb-4\">\n {children}\n </div>\n </div>\n </>\n )\n}\n","import { cn } from '../lib/cn'\n\ntype Status = 'online' | 'offline' | 'degraded' | 'unknown'\n\nexport interface StatusBadgeProps {\n status: Status\n showDot?: boolean\n showLabel?: boolean\n size?: 'sm' | 'md'\n className?: string\n}\n\nconst statusConfig: Record<Status, { colorClass: string; label: string }> = {\n online: { colorClass: 'bg-success', label: 'Online' },\n offline: { colorClass: 'bg-danger', label: 'Offline' },\n degraded: { colorClass: 'bg-warning', label: 'Degraded' },\n unknown: { colorClass: 'bg-foreground-subtle', label: 'Unknown' },\n}\n\nexport function StatusBadge({\n status,\n showDot = true,\n showLabel = true,\n size = 'sm',\n className,\n}: StatusBadgeProps) {\n const config = statusConfig[status]\n\n return (\n <span\n className={cn(\n 'inline-flex items-center gap-1.5',\n size === 'sm' ? 'text-xs' : 'text-sm',\n className\n )}\n >\n {showDot && (\n <span\n className={cn('h-1.5 w-1.5 shrink-0 rounded-full', config.colorClass)}\n aria-hidden=\"true\"\n />\n )}\n {showLabel && (\n <span className=\"text-foreground\">{config.label}</span>\n )}\n </span>\n )\n}\n","import { cn } from '../lib/cn'\nimport type { ProviderType } from '../icons'\n\nexport interface ProviderBadgeProps {\n provider: ProviderType\n showLabel?: boolean\n className?: string\n}\n\nconst providerConfig: Record<ProviderType, { colorClass: string; label: string }> = {\n frigate: { colorClass: 'bg-provider-frigate', label: 'Frigate' },\n scrypted: { colorClass: 'bg-provider-scrypted', label: 'Scrypted' },\n reolink: { colorClass: 'bg-provider-reolink', label: 'Reolink' },\n homeAssistant: { colorClass: 'bg-provider-homeAssistant', label: 'Home Assistant' },\n rtsp: { colorClass: 'bg-provider-rtsp', label: 'RTSP' },\n}\n\nexport function ProviderBadge({\n provider,\n showLabel = true,\n className,\n}: ProviderBadgeProps) {\n const config = providerConfig[provider]\n\n return (\n <span className={cn('inline-flex items-center gap-1.5 text-xs', className)}>\n <span\n className={cn('h-1.5 w-1.5 shrink-0 rounded-sm', config.colorClass)}\n aria-hidden=\"true\"\n />\n {showLabel && (\n <span className=\"text-foreground\">{config.label}</span>\n )}\n </span>\n )\n}\n","import React from 'react'\nimport { cn } from '../lib/cn'\n\nexport type SemanticBadgeVariant = 'success' | 'warning' | 'danger' | 'info' | 'neutral'\n\nconst VARIANT_STYLES: Record<SemanticBadgeVariant, string> = {\n success: 'bg-emerald-400 text-emerald-950',\n warning: 'bg-amber-400 text-amber-950',\n danger: 'bg-red-400 text-red-950',\n info: 'bg-blue-400 text-blue-950',\n neutral: 'bg-foreground-subtle/20 text-foreground',\n}\n\nexport interface SemanticBadgeProps {\n children: React.ReactNode\n variant?: SemanticBadgeVariant\n /** Use monospace font (good for versions, codes) */\n mono?: boolean\n className?: string\n}\n\n/**\n * General-purpose badge with semantic color variants.\n * Solid background with dark text for maximum contrast.\n */\nexport function SemanticBadge({ children, variant = 'neutral', mono, className }: SemanticBadgeProps) {\n return (\n <span className={cn(\n 'inline-flex items-center rounded-md px-2 py-0.5 text-[11px] font-bold leading-tight',\n mono && 'font-mono',\n VARIANT_STYLES[variant],\n className,\n )}>\n {children}\n </span>\n )\n}\n\n// --- Convenience wrappers ---\n\nexport interface VersionBadgeProps {\n version: string\n preRelease?: boolean\n className?: string\n}\n\n/**\n * Version badge — auto-detects pre-release versions.\n * Stable = success (green), Pre-release = warning (amber).\n */\nexport function VersionBadge({ version, preRelease, className }: VersionBadgeProps) {\n const isPreRelease = preRelease ?? /-(alpha|beta|rc|dev|canary|next)/i.test(version)\n return (\n <SemanticBadge variant={isPreRelease ? 'warning' : 'success'} mono className={className}>\n {version}\n </SemanticBadge>\n )\n}\n","import { type ReactNode } from 'react'\nimport { cn } from '../lib/cn'\nimport { Label } from '../primitives'\n\nexport interface FormFieldProps {\n label: string\n description?: string\n error?: string\n required?: boolean\n children: ReactNode\n orientation?: 'vertical' | 'horizontal'\n className?: string\n}\n\nexport function FormField({\n label,\n description,\n error,\n required,\n children,\n orientation = 'vertical',\n className,\n}: FormFieldProps) {\n const isHorizontal = orientation === 'horizontal'\n\n return (\n <div\n className={cn(\n 'flex gap-2',\n isHorizontal ? 'flex-row items-center justify-between' : 'flex-col',\n className\n )}\n >\n <div className={cn(isHorizontal ? 'flex-1' : '')}>\n <Label>\n {label}\n {required && <span className=\"text-danger ml-0.5\">*</span>}\n </Label>\n {description && (\n <p className=\"text-foreground-subtle text-xs mt-0.5\">{description}</p>\n )}\n </div>\n <div className={cn(isHorizontal ? 'shrink-0' : '')}>\n {children}\n </div>\n {error && (\n <p className=\"text-danger text-xs\">{error}</p>\n )}\n </div>\n )\n}\n","import { type ReactNode } from 'react'\nimport { cn } from '../lib/cn'\n\nexport interface PageHeaderProps {\n title: string\n subtitle?: string\n actions?: ReactNode\n className?: string\n}\n\nexport function PageHeader({ title, subtitle, actions, className }: PageHeaderProps) {\n return (\n <div className={cn('flex flex-col gap-2 mb-3 sm:flex-row sm:items-center sm:justify-between', className)}>\n <div>\n <h1 className=\"text-sm font-semibold text-foreground\">{title}</h1>\n {subtitle && (\n <p className=\"text-foreground-subtle text-xs\">{subtitle}</p>\n )}\n </div>\n {actions && <div className=\"flex items-center gap-2 flex-wrap\">{actions}</div>}\n </div>\n )\n}\n","import { type ReactNode } from 'react'\nimport { type LucideIcon } from 'lucide-react'\nimport { cn } from '../lib/cn'\n\nexport interface EmptyStateProps {\n icon?: LucideIcon\n title: string\n description?: string\n action?: ReactNode\n className?: string\n}\n\nexport function EmptyState({\n icon: Icon,\n title,\n description,\n action,\n className,\n}: EmptyStateProps) {\n return (\n <div className={cn('flex flex-col items-center justify-center gap-3 py-12', className)}>\n {Icon && (\n <Icon className=\"h-12 w-12 text-foreground-subtle\" aria-hidden=\"true\" />\n )}\n <div className=\"flex flex-col items-center gap-1 text-center\">\n <p className=\"text-foreground-muted text-sm font-medium\">{title}</p>\n {description && (\n <p className=\"text-foreground-subtle text-xs max-w-xs\">{description}</p>\n )}\n </div>\n {action && <div className=\"mt-1\">{action}</div>}\n </div>\n )\n}\n","import {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogDescription,\n DialogFooter,\n Button,\n} from '../primitives'\n\nexport interface ConfirmDialogProps {\n title: string\n message: string\n confirmLabel?: string\n cancelLabel?: string\n onConfirm: () => void\n onCancel: () => void\n variant?: 'danger' | 'default'\n open: boolean\n onOpenChange: (open: boolean) => void\n}\n\nexport function ConfirmDialog({\n title,\n message,\n confirmLabel = 'Confirm',\n cancelLabel = 'Cancel',\n onConfirm,\n onCancel,\n variant = 'default',\n open,\n onOpenChange,\n}: ConfirmDialogProps) {\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>{title}</DialogTitle>\n <DialogDescription>{message}</DialogDescription>\n </DialogHeader>\n <DialogFooter>\n <Button variant=\"ghost\" onClick={onCancel}>\n {cancelLabel}\n </Button>\n <Button\n variant={variant === 'danger' ? 'danger' : 'primary'}\n onClick={onConfirm}\n >\n {confirmLabel}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n )\n}\n","import { TrendingUp, TrendingDown } from 'lucide-react'\nimport { cn } from '../lib/cn'\nimport { Card } from '../primitives'\n\nexport interface StatCardProps {\n value: string | number\n label: string\n trend?: { value: number; direction: 'up' | 'down' }\n className?: string\n}\n\nexport function StatCard({ value, label, trend, className }: StatCardProps) {\n return (\n <Card className={cn('flex flex-col gap-1', className)}>\n <div className=\"flex items-baseline gap-2\">\n <span className=\"text-2xl font-semibold text-foreground\">{value}</span>\n {trend && (\n <span\n className={cn(\n 'inline-flex items-center gap-0.5 text-xs font-medium',\n trend.direction === 'up' ? 'text-success' : 'text-danger'\n )}\n >\n {trend.direction === 'up' ? (\n <TrendingUp className=\"h-3 w-3\" />\n ) : (\n <TrendingDown className=\"h-3 w-3\" />\n )}\n {trend.value}%\n </span>\n )}\n </div>\n <span className=\"text-xs text-foreground-muted\">{label}</span>\n </Card>\n )\n}\n","import { type ReactNode } from 'react'\nimport { cn } from '../lib/cn'\n\nexport interface KeyValueListProps {\n items: { key: string; value: ReactNode }[]\n className?: string\n}\n\nexport function KeyValueList({ items, className }: KeyValueListProps) {\n return (\n <dl className={cn('flex flex-col', className)}>\n {items.map((item) => (\n <div\n key={item.key}\n className=\"flex items-center h-7\"\n >\n <dt className=\"text-foreground-subtle text-xs w-1/3 shrink-0\">\n {item.key}\n </dt>\n <dd className=\"text-foreground text-xs\">{item.value}</dd>\n </div>\n ))}\n </dl>\n )\n}\n","import { useCallback, useState } from 'react'\nimport { Copy, Check } from 'lucide-react'\nimport { cn } from '../lib/cn'\nimport { ScrollArea, IconButton } from '../primitives'\n\nexport interface CodeBlockProps {\n children: string\n maxHeight?: number\n className?: string\n}\n\nexport function CodeBlock({ children, maxHeight = 300, className }: CodeBlockProps) {\n const [copied, setCopied] = useState(false)\n\n const handleCopy = useCallback(() => {\n navigator.clipboard.writeText(children).then(() => {\n setCopied(true)\n setTimeout(() => setCopied(false), 2000)\n })\n }, [children])\n\n return (\n <div className={cn('relative group', className)}>\n <ScrollArea style={{ maxHeight }}>\n <pre className=\"font-mono text-xs bg-surface p-3 rounded-md border border-border-subtle\">\n <code>{children}</code>\n </pre>\n </ScrollArea>\n <div className=\"absolute top-2 right-2 opacity-0 group-hover:opacity-100 transition-opacity\">\n <IconButton\n icon={copied ? Check : Copy}\n aria-label=\"Copy code\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={handleCopy}\n />\n </div>\n </div>\n )\n}\n","import { Search } from 'lucide-react'\nimport { cn } from '../lib/cn'\nimport { Input, Select, Badge } from '../primitives'\n\ntype FilterDef =\n | { type: 'search'; key: string; placeholder?: string }\n | { type: 'select'; key: string; label: string; options: { value: string; label: string }[] }\n | { type: 'badge-toggle'; key: string; options: { value: string; label: string }[] }\n\nexport type { FilterDef }\n\nexport interface FilterBarProps {\n filters: FilterDef[]\n values: Record<string, unknown>\n onChange: (values: Record<string, unknown>) => void\n className?: string\n}\n\nexport function FilterBar({ filters, values, onChange, className }: FilterBarProps) {\n const handleChange = (key: string, value: unknown) => {\n onChange({ ...values, [key]: value })\n }\n\n return (\n <div className={cn('flex items-center gap-2 flex-wrap', className)}>\n {filters.map((filter) => {\n switch (filter.type) {\n case 'search':\n return (\n <Input\n key={filter.key}\n placeholder={filter.placeholder ?? 'Search...'}\n value={(values[filter.key] as string) ?? ''}\n onChange={(e) => handleChange(filter.key, e.target.value)}\n leftSlot={<Search className=\"h-3 w-3 text-foreground-subtle\" />}\n className=\"w-48\"\n />\n )\n\n case 'select':\n return (\n <Select\n key={filter.key}\n options={filter.options}\n value={(values[filter.key] as string) ?? ''}\n onChange={(e) => handleChange(filter.key, e.target.value)}\n className=\"w-36\"\n />\n )\n\n case 'badge-toggle':\n return (\n <div key={filter.key} className=\"flex items-center gap-1\">\n {filter.options.map((option) => {\n const currentValue = values[filter.key]\n const isActive = currentValue === option.value\n\n return (\n <button\n key={option.value}\n type=\"button\"\n onClick={() =>\n handleChange(\n filter.key,\n isActive ? undefined : option.value\n )\n }\n >\n <Badge\n variant={isActive ? 'info' : 'default'}\n className=\"cursor-pointer\"\n >\n {option.label}\n </Badge>\n </button>\n )\n })}\n </div>\n )\n\n default:\n return null\n }\n })}\n </div>\n )\n}\n","import { type LucideIcon } from 'lucide-react'\nimport { cn } from '../../lib/cn'\nimport { Badge } from '../../primitives'\n\nexport interface SidebarItemProps {\n label: string\n icon: LucideIcon\n href: string\n badge?: string | number\n active?: boolean\n className?: string\n}\n\nexport function SidebarItem({\n label,\n icon: Icon,\n href,\n badge,\n active = false,\n className,\n}: SidebarItemProps) {\n return (\n <a\n href={href}\n className={cn(\n 'flex items-center gap-2 h-7 px-2 text-[11px] transition-colors',\n active\n ? 'border-l-2 border-primary bg-primary/[0.08] text-foreground rounded-r-md'\n : 'text-foreground-subtle hover:bg-surface-hover rounded-md',\n className\n )}\n >\n <Icon className=\"h-3.5 w-3.5 shrink-0\" />\n <span className=\"truncate flex-1\">{label}</span>\n {badge !== undefined && (\n <Badge className=\"ml-auto text-[10px] px-1.5 py-0\">{badge}</Badge>\n )}\n </a>\n )\n}\n","import { type ReactNode } from 'react'\nimport { cn } from '../../lib/cn'\nimport { Separator } from '../../primitives'\nimport { SidebarItem, type SidebarItemProps } from './sidebar-item'\n\nexport interface SidebarSection {\n label?: string\n items: SidebarItemProps[]\n}\n\nexport interface SidebarProps {\n logo?: ReactNode\n sections: SidebarSection[]\n footer?: SidebarItemProps[]\n onNavigate?: () => void\n className?: string\n}\n\nexport function Sidebar({ logo, sections, footer, onNavigate, className }: SidebarProps) {\n return (\n <nav\n className={cn(\n 'bg-surface border-r border-border h-full flex flex-col',\n className\n )}\n >\n {logo && <div className=\"px-3 py-2 shrink-0\">{logo}</div>}\n\n <div className=\"flex-1 overflow-auto px-1 py-1\">\n {sections.map((section, sectionIndex) => (\n <div key={sectionIndex} className={cn(sectionIndex > 0 ? 'mt-3' : '')}>\n {section.label && (\n <span className=\"text-[10px] text-foreground-disabled uppercase tracking-wider px-2 mb-1 block\">\n {section.label}\n </span>\n )}\n <div className=\"flex flex-col gap-0.5\" onClick={onNavigate}>\n {section.items.map((item) => (\n <SidebarItem key={item.href} {...item} />\n ))}\n </div>\n </div>\n ))}\n </div>\n\n {footer && footer.length > 0 && (\n <div className=\"shrink-0 px-1 pb-1\">\n <Separator className=\"mb-1\" />\n <div className=\"flex flex-col gap-0.5\" onClick={onNavigate}>\n {footer.map((item) => (\n <SidebarItem key={item.href} {...item} />\n ))}\n </div>\n </div>\n )}\n </nav>\n )\n}\n","import { type ReactNode, useState } from 'react'\nimport { ChevronRight, Menu } from 'lucide-react'\nimport { cn } from '../../lib/cn'\nimport { useIsMobile } from '../../hooks/use-is-mobile'\nimport { MobileDrawer } from '../../primitives/mobile-drawer'\nimport { Sidebar, type SidebarProps } from './sidebar'\n\nexport interface AppShellProps {\n sidebar: SidebarProps\n header?: {\n breadcrumbs?: { label: string; href?: string }[]\n actions?: ReactNode\n }\n /** Content shown in the center of the mobile top bar (e.g. logo) */\n mobileLogo?: ReactNode\n /** Content shown on the right side of the mobile top bar (e.g. avatar menu) */\n mobileActions?: ReactNode\n children: ReactNode\n className?: string\n}\n\nexport function AppShell({ sidebar, header, mobileLogo, mobileActions, children, className }: AppShellProps) {\n const isMobile = useIsMobile()\n const [drawerOpen, setDrawerOpen] = useState(false)\n\n return (\n <div className={cn('flex h-screen', className)}>\n {/* Desktop sidebar */}\n {!isMobile && <Sidebar {...sidebar} className={cn('w-44', sidebar.className)} />}\n\n {/* Mobile drawer */}\n {isMobile && (\n <MobileDrawer open={drawerOpen} onClose={() => setDrawerOpen(false)} width=\"w-64\">\n <Sidebar\n {...sidebar}\n onNavigate={() => setDrawerOpen(false)}\n className=\"w-full border-r-0\"\n />\n </MobileDrawer>\n )}\n\n <div className=\"flex flex-1 flex-col min-w-0\">\n {/* Mobile top bar */}\n {isMobile && (\n <header className=\"flex items-center h-12 border-b border-border px-3 shrink-0 bg-surface/80 backdrop-blur-sm\">\n <button\n onClick={() => setDrawerOpen(true)}\n className=\"p-1.5 -ml-1.5 rounded-md hover:bg-surface-hover text-foreground-muted transition-colors\"\n aria-label=\"Open menu\"\n >\n <Menu className=\"h-5 w-5\" />\n </button>\n {mobileLogo && <div className=\"flex-1 flex justify-center\">{mobileLogo}</div>}\n {mobileActions && <div className=\"shrink-0\">{mobileActions}</div>}\n </header>\n )}\n\n {/* Desktop breadcrumb header */}\n {!isMobile && header && (\n <header className=\"flex items-center h-10 border-b border-border px-4 shrink-0\">\n {header.breadcrumbs && header.breadcrumbs.length > 0 && (\n <nav className=\"flex items-center gap-1 text-xs flex-1 min-w-0\">\n {header.breadcrumbs.map((crumb, index) => {\n const isLast = index === header.breadcrumbs!.length - 1\n return (\n <span key={index} className=\"flex items-center gap-1\">\n {index > 0 && (\n <ChevronRight className=\"h-3 w-3 text-foreground-subtle shrink-0\" />\n )}\n {crumb.href && !isLast ? (\n <a\n href={crumb.href}\n className=\"text-foreground-subtle hover:text-foreground transition-colors truncate\"\n >\n {crumb.label}\n </a>\n ) : (\n <span className=\"text-foreground truncate\">{crumb.label}</span>\n )}\n </span>\n )\n })}\n </nav>\n )}\n {header.actions && (\n <div className=\"flex items-center gap-2 ml-auto shrink-0\">\n {header.actions}\n </div>\n )}\n </header>\n )}\n\n <main className=\"flex-1 overflow-auto p-4\">{children}</main>\n </div>\n </div>\n )\n}\n","import { useMemo } from 'react'\nimport {\n useReactTable,\n getCoreRowModel,\n getSortedRowModel,\n getFilteredRowModel,\n getPaginationRowModel,\n flexRender,\n type ColumnDef,\n} from '@tanstack/react-table'\nimport { cn } from '../../lib/cn'\nimport { Skeleton } from '../../primitives/skeleton'\nimport { Checkbox } from '../../primitives/checkbox'\nimport { DataTableHeader } from './data-table-header'\nimport { DataTableRow } from './data-table-row'\nimport { DataTablePagination } from './data-table-pagination'\nimport type { DataTableProps } from './types'\n\nexport function DataTable<T>({\n data,\n columns: userColumns,\n sorting,\n onSortingChange,\n filtering,\n onFilteringChange,\n pagination,\n onPaginationChange,\n loading = false,\n emptyState,\n rowActions,\n onRowClick,\n selectable = false,\n compact = true,\n stickyHeader = false,\n className,\n}: DataTableProps<T>) {\n const columns = useMemo(() => {\n if (!selectable) return userColumns\n\n const selectColumn: ColumnDef<T, unknown> = {\n id: '__select',\n header: ({ table }) => (\n <Checkbox\n checked={table.getIsAllPageRowsSelected()}\n onChange={table.getToggleAllPageRowsSelectedHandler()}\n aria-label=\"Select all\"\n />\n ),\n cell: ({ row }) => (\n <Checkbox\n checked={row.getIsSelected()}\n onChange={row.getToggleSelectedHandler()}\n aria-label=\"Select row\"\n />\n ),\n enableSorting: false,\n }\n\n return [selectColumn, ...userColumns]\n }, [userColumns, selectable])\n\n const table = useReactTable({\n data,\n columns,\n state: {\n ...(sorting !== undefined && { sorting }),\n ...(filtering !== undefined && { columnFilters: filtering }),\n ...(pagination !== undefined && {\n pagination: { pageIndex: pagination.page, pageSize: pagination.pageSize },\n }),\n },\n onSortingChange: onSortingChange\n ? (updater) => {\n const next = typeof updater === 'function' ? updater(sorting ?? []) : updater\n onSortingChange(next)\n }\n : undefined,\n onColumnFiltersChange: onFilteringChange\n ? (updater) => {\n const next = typeof updater === 'function' ? updater(filtering ?? []) : updater\n onFilteringChange(next)\n }\n : undefined,\n getCoreRowModel: getCoreRowModel(),\n getSortedRowModel: getSortedRowModel(),\n getFilteredRowModel: getFilteredRowModel(),\n getPaginationRowModel: pagination ? getPaginationRowModel() : undefined,\n manualPagination: pagination !== undefined,\n pageCount: pagination ? Math.ceil(pagination.total / pagination.pageSize) : undefined,\n })\n\n const hasActions = !!rowActions\n\n return (\n <div className={cn('overflow-auto', className)}>\n <table className=\"w-full border-collapse\">\n <DataTableHeader\n headerGroups={table.getHeaderGroups()}\n onSortingChange={onSortingChange}\n stickyHeader={stickyHeader}\n flexRender={flexRender}\n />\n <tbody>\n {loading ? (\n <LoadingRows colSpan={columns.length + (hasActions ? 1 : 0)} compact={compact} />\n ) : table.getRowModel().rows.length === 0 ? (\n <tr>\n <td\n colSpan={columns.length + (hasActions ? 1 : 0)}\n className=\"text-center py-8 text-xs text-foreground-muted\"\n >\n {emptyState ?? 'No data'}\n </td>\n </tr>\n ) : (\n table.getRowModel().rows.map((row) => (\n <DataTableRow\n key={row.id}\n row={row}\n onRowClick={onRowClick}\n rowActions={rowActions}\n flexRender={flexRender}\n />\n ))\n )}\n </tbody>\n </table>\n {pagination && (\n <DataTablePagination\n page={pagination.page}\n pageSize={pagination.pageSize}\n total={pagination.total}\n onPaginationChange={onPaginationChange}\n />\n )}\n </div>\n )\n}\n\nfunction LoadingRows({ colSpan, compact }: { colSpan: number; compact: boolean }) {\n return (\n <>\n {Array.from({ length: 5 }).map((_, rowIdx) => (\n <tr key={rowIdx} className={compact ? 'h-7' : 'h-9'}>\n {Array.from({ length: colSpan }).map((_, colIdx) => (\n <td key={colIdx} className=\"px-2 py-1.5\">\n <Skeleton className=\"h-3 w-full\" />\n </td>\n ))}\n </tr>\n ))}\n </>\n )\n}\n","import type { HeaderGroup, Header, flexRender } from '@tanstack/react-table'\nimport { ArrowUpDown, ArrowUp, ArrowDown } from 'lucide-react'\nimport { cn } from '../../lib/cn'\nimport type { SortingState } from './types'\n\ninterface DataTableHeaderProps<T> {\n headerGroups: HeaderGroup<T>[]\n onSortingChange?: (sorting: SortingState) => void\n stickyHeader?: boolean\n flexRender: typeof flexRender\n}\n\nexport function DataTableHeader<T>({\n headerGroups,\n onSortingChange,\n stickyHeader,\n flexRender: render,\n}: DataTableHeaderProps<T>) {\n return (\n <thead\n className={cn(\n stickyHeader && 'sticky top-0 z-10 bg-background',\n )}\n >\n {headerGroups.map((headerGroup) => (\n <tr key={headerGroup.id} className=\"h-6\">\n {headerGroup.headers.map((header) => (\n <HeaderCell\n key={header.id}\n header={header}\n sortable={header.column.getCanSort() && !!onSortingChange}\n flexRender={render}\n />\n ))}\n </tr>\n ))}\n </thead>\n )\n}\n\ninterface HeaderCellProps<T> {\n header: Header<T, unknown>\n sortable: boolean\n flexRender: typeof flexRender\n}\n\nfunction HeaderCell<T>({ header, sortable, flexRender: render }: HeaderCellProps<T>) {\n const sorted = header.column.getIsSorted()\n\n const SortIcon = sorted === 'asc' ? ArrowUp : sorted === 'desc' ? ArrowDown : ArrowUpDown\n\n return (\n <th\n className={cn(\n 'px-2 py-1 text-left text-[10px] text-foreground-subtle uppercase tracking-wider font-medium',\n sortable && 'cursor-pointer select-none',\n )}\n onClick={sortable ? header.column.getToggleSortingHandler() : undefined}\n >\n <span className=\"inline-flex items-center gap-1\">\n {header.isPlaceholder\n ? null\n : render(header.column.columnDef.header, header.getContext())}\n {sortable && <SortIcon className=\"h-3 w-3\" />}\n </span>\n </th>\n )\n}\n","import type { Row, Cell, flexRender } from '@tanstack/react-table'\nimport { MoreHorizontal } from 'lucide-react'\nimport { cn } from '../../lib/cn'\nimport { Dropdown, DropdownTrigger, DropdownContent, DropdownItem as DropdownMenuItem } from '../../primitives/dropdown'\nimport type { DataTableAction } from './types'\n\ninterface DataTableRowProps<T> {\n row: Row<T>\n onRowClick?: (row: T) => void\n rowActions?: (row: T) => DataTableAction[]\n flexRender: typeof flexRender\n}\n\nexport function DataTableRow<T>({\n row,\n onRowClick,\n rowActions,\n flexRender: render,\n}: DataTableRowProps<T>) {\n const actions = rowActions ? rowActions(row.original) : []\n\n return (\n <tr\n className={cn(\n 'h-7 border-b border-border/50',\n onRowClick && 'cursor-pointer',\n 'hover:bg-surface-hover',\n )}\n onClick={onRowClick ? () => onRowClick(row.original) : undefined}\n >\n {row.getVisibleCells().map((cell) => (\n <DataTableCell key={cell.id} cell={cell} flexRender={render} />\n ))}\n {actions.length > 0 && (\n <td className=\"px-2 py-1.5 w-8\">\n <Dropdown>\n <DropdownTrigger\n className=\"p-0.5 rounded hover:bg-surface-hover\"\n onClick={(e) => e.stopPropagation()}\n >\n <MoreHorizontal className=\"h-3.5 w-3.5 text-foreground-muted\" />\n </DropdownTrigger>\n <DropdownContent className=\"right-0 left-auto\">\n {actions.map((action) => (\n <DropdownMenuItem\n key={action.label}\n icon={action.icon}\n variant={action.variant}\n onClick={(e) => {\n e.stopPropagation()\n action.onClick()\n }}\n >\n {action.label}\n </DropdownMenuItem>\n ))}\n </DropdownContent>\n </Dropdown>\n </td>\n )}\n </tr>\n )\n}\n\ninterface DataTableCellProps<T> {\n cell: Cell<T, unknown>\n flexRender: typeof flexRender\n}\n\nfunction DataTableCell<T>({ cell, flexRender: render }: DataTableCellProps<T>) {\n return (\n <td className=\"px-2 py-1.5 text-xs text-foreground\">\n {render(cell.column.columnDef.cell, cell.getContext())}\n </td>\n )\n}\n","import { ChevronLeft, ChevronRight } from 'lucide-react'\nimport { IconButton } from '../../primitives/icon-button'\nimport { Select } from '../../primitives/select'\nimport type { PaginationState } from './types'\n\ninterface DataTablePaginationProps {\n page: number\n pageSize: number\n total: number\n onPaginationChange?: (pagination: PaginationState) => void\n}\n\nconst PAGE_SIZE_OPTIONS = [\n { value: '10', label: '10' },\n { value: '25', label: '25' },\n { value: '50', label: '50' },\n { value: '100', label: '100' },\n]\n\nexport function DataTablePagination({\n page,\n pageSize,\n total,\n onPaginationChange,\n}: DataTablePaginationProps) {\n const totalPages = Math.max(1, Math.ceil(total / pageSize))\n const currentPage = page + 1\n\n return (\n <div className=\"flex items-center justify-between px-2 py-2 text-xs text-foreground-muted\">\n <div className=\"flex items-center gap-2\">\n <span>Rows per page</span>\n <div className=\"w-16\">\n <Select\n options={PAGE_SIZE_OPTIONS}\n value={String(pageSize)}\n onChange={(e) =>\n onPaginationChange?.({\n pageIndex: 0,\n pageSize: Number(e.target.value),\n })\n }\n />\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n <span>\n Page {currentPage} of {totalPages}\n </span>\n <IconButton\n icon={ChevronLeft}\n aria-label=\"Previous page\"\n variant=\"ghost\"\n size=\"sm\"\n disabled={page <= 0}\n onClick={() =>\n onPaginationChange?.({ pageIndex: page - 1, pageSize })\n }\n />\n <IconButton\n icon={ChevronRight}\n aria-label=\"Next page\"\n variant=\"ghost\"\n size=\"sm\"\n disabled={currentPage >= totalPages}\n onClick={() =>\n onPaginationChange?.({ pageIndex: page + 1, pageSize })\n }\n />\n </div>\n </div>\n )\n}\n","import { type ReactNode } from 'react'\nimport { cn } from '../lib/cn'\n\nexport interface DeviceCardBadge {\n /** Badge label text */\n label: string\n /** Optional icon rendered before the label */\n icon?: ReactNode\n /** Click handler — makes the badge interactive */\n onClick?: () => void\n}\n\nexport interface DeviceCardAction {\n /** Icon to render */\n icon: ReactNode\n /** Tooltip / aria-label */\n label: string\n /** Click handler */\n onClick: () => void\n}\n\nexport interface DeviceCardProps {\n /** Primary title (e.g., device name) */\n title: string\n /** Secondary text (e.g., model, IP) */\n subtitle?: string\n /** Status: determines the color of the status dot */\n status?: 'online' | 'offline' | 'warning' | 'unknown'\n /** Whether this card is currently selected */\n selected?: boolean\n /** Click handler for the card body */\n onClick?: () => void\n /** Clickable badges (e.g., stream profiles) */\n badges?: DeviceCardBadge[]\n /** Action icons shown at the bottom (e.g., PTZ, events) */\n actions?: DeviceCardAction[]\n /** Content rendered at the bottom when status is offline (e.g., Connect button) */\n offlineAction?: ReactNode\n /** Additional CSS classes */\n className?: string\n}\n\nconst STATUS_COLORS = {\n online: 'bg-success',\n offline: 'bg-danger',\n warning: 'bg-warning',\n unknown: 'bg-foreground-subtle',\n} as const\n\nexport function DeviceCard({\n title,\n subtitle,\n status,\n selected,\n onClick,\n badges,\n actions,\n offlineAction,\n className,\n}: DeviceCardProps) {\n const isOffline = status === 'offline'\n\n return (\n <div\n onClick={onClick}\n className={cn(\n 'w-full rounded-lg border p-3 text-left transition-colors',\n onClick && 'cursor-pointer',\n selected\n ? 'border-primary bg-primary/10'\n : 'border-border bg-surface hover:bg-surface-hover',\n isOffline && !selected && 'opacity-50',\n className,\n )}\n >\n {/* Header: title + status dot */}\n <div className=\"flex items-center justify-between mb-2\">\n <span className=\"text-sm font-medium truncate\">{title}</span>\n {status && (\n <span className={cn('h-2 w-2 rounded-full shrink-0', STATUS_COLORS[status])} />\n )}\n </div>\n\n {/* Subtitle */}\n {subtitle && (\n <div className=\"text-[11px] text-foreground-muted\">{subtitle}</div>\n )}\n\n {/* Badges */}\n {badges && badges.length > 0 && (\n <div className=\"flex flex-wrap gap-1 mt-2\">\n {badges.map((badge, i) => {\n const cls = cn(\n 'rounded px-1.5 py-0.5 text-[10px] flex items-center gap-0.5',\n selected ? 'bg-primary/20' : 'bg-surface-hover',\n badge.onClick && 'hover:opacity-80 transition-opacity cursor-pointer',\n )\n return badge.onClick ? (\n <button\n key={i}\n onClick={(e) => { e.stopPropagation(); badge.onClick!(); }}\n className={cls}\n >\n {badge.icon}{badge.label}\n </button>\n ) : (\n <span key={i} className={cls}>\n {badge.icon}{badge.label}\n </span>\n )\n })}\n </div>\n )}\n\n {/* Actions (online) or offline action */}\n {!isOffline && actions && actions.length > 0 && (\n <div className=\"flex items-center gap-0.5 mt-2 -mb-1\">\n {actions.map((action, i) => (\n <button\n key={i}\n onClick={(e) => { e.stopPropagation(); action.onClick(); }}\n className=\"p-1 rounded hover:bg-surface-hover text-foreground-subtle hover:text-foreground transition-colors\"\n title={action.label}\n aria-label={action.label}\n >\n {action.icon}\n </button>\n ))}\n </div>\n )}\n\n {isOffline && offlineAction && (\n <div className=\"mt-2\" onClick={(e) => e.stopPropagation()}>\n {offlineAction}\n </div>\n )}\n </div>\n )\n}\n","import { type ReactNode } from 'react'\nimport { cn } from '../lib/cn'\n\nexport interface DeviceGridProps {\n /** Grid items */\n children: ReactNode\n /** Minimum card width in pixels (default 220) */\n minCardWidth?: number\n /** Gap between cards in Tailwind spacing units (default 3) */\n gap?: number\n /** Additional CSS classes */\n className?: string\n}\n\nexport function DeviceGrid({\n children,\n minCardWidth = 220,\n gap = 3,\n className,\n}: DeviceGridProps) {\n return (\n <div\n className={cn(\n 'p-4 overflow-y-auto flex-1 content-start',\n className,\n )}\n style={{\n display: 'grid',\n gridTemplateColumns: `repeat(auto-fill, minmax(${minCardWidth}px, 1fr))`,\n gap: `${gap * 4}px`,\n }}\n >\n {children}\n </div>\n )\n}\n","/**\n * PipelineStep — single step card in the pipeline builder.\n *\n * Driven entirely by PipelineAddonSchema. No hardcoded addon names or models.\n * Renders: colored left border, header with I/O class tags, expandable config\n * (Agent → Runtime → Backend → Model → Confidence), children recursively.\n */\nimport { useState } from 'react'\nimport { ChevronRight, ChevronDown } from 'lucide-react'\nimport type { PipelineSlot, PipelineAddonSchema, InferenceCapabilities, PipelineModelOption } from '@camstack/types'\nimport { cn } from '../lib/cn'\n\n// ---------------------------------------------------------------------------\n// Public interfaces\n// ---------------------------------------------------------------------------\n\nexport interface PipelineStepDisplayConfig {\n readonly addonId: string\n readonly addonName: string\n readonly slot: PipelineSlot\n readonly inputClasses: readonly string[]\n readonly outputClasses: readonly string[]\n readonly enabled: boolean\n readonly agentId: string\n readonly runtime: string\n readonly backend: string\n readonly modelId: string\n readonly confidence: number\n readonly classFilters: readonly string[]\n readonly children: readonly PipelineStepDisplayConfig[]\n}\n\nexport interface PipelineStepProps {\n readonly step: PipelineStepDisplayConfig\n readonly schema: PipelineAddonSchema | null\n /** Full schema map so children can look up their own schema */\n readonly allSchemas: ReadonlyMap<string, PipelineAddonSchema>\n readonly capabilities: InferenceCapabilities\n readonly depth?: number\n readonly onChange: (updated: PipelineStepDisplayConfig) => void\n readonly onDelete?: (addonId: string) => void\n readonly readOnly?: boolean\n}\n\n// ---------------------------------------------------------------------------\n// Border colors — per addon ID with fallback by slot\n// ---------------------------------------------------------------------------\n\nconst ADDON_COLORS: Record<string, string> = {\n 'object-detection': 'border-l-blue-500',\n 'motion-detection': 'border-l-amber-500',\n 'face-detection': 'border-l-purple-500',\n 'face-recognition': 'border-l-violet-500',\n 'plate-detection': 'border-l-pink-500',\n 'plate-recognition': 'border-l-rose-500',\n 'animal-classifier': 'border-l-lime-500',\n 'bird-nabirds-classifier': 'border-l-emerald-500',\n 'bird-global-classifier': 'border-l-teal-500',\n 'audio-classification': 'border-l-green-500',\n 'segmentation-refiner': 'border-l-cyan-500',\n}\n\nconst SLOT_FALLBACK: Record<string, string> = {\n detector: 'border-l-blue-500',\n cropper: 'border-l-purple-500',\n classifier: 'border-l-lime-500',\n refiner: 'border-l-cyan-500',\n}\n\nfunction borderColor(addonId: string, slot: string): string {\n return ADDON_COLORS[addonId] ?? SLOT_FALLBACK[slot] ?? 'border-l-primary'\n}\n\n// ---------------------------------------------------------------------------\n// Helpers — compute available backends + models for a specific step\n// ---------------------------------------------------------------------------\n\n/** Map backend id → required model format */\nconst BACKEND_FORMAT: Record<string, string> = {\n cpu: 'onnx', coreml: 'coreml', openvino: 'openvino',\n cuda: 'onnx', tensorrt: 'onnx', 'onnx-py': 'onnx', pytorch: 'pt',\n}\n\nfunction backendsForRuntime(\n runtime: string,\n caps: InferenceCapabilities,\n schema: PipelineAddonSchema | null,\n): readonly { id: string; label: string; available: boolean }[] {\n const allBackends = runtime === 'node' ? caps.runtimes.node.backends : caps.runtimes.python.backends\n if (!schema) return allBackends\n\n // Filter: only show backends for which at least one model has the required format\n const availableFormats = new Set<string>()\n for (const m of schema.models) {\n for (const fmt of Object.keys(m.formats as Record<string, unknown>)) {\n availableFormats.add(fmt)\n }\n }\n // Node.js always uses ONNX\n if (runtime === 'node') availableFormats.add('onnx')\n\n return allBackends.map(b => {\n const neededFormat = BACKEND_FORMAT[b.id] ?? 'onnx'\n const hasFormat = availableFormats.has(neededFormat)\n return { ...b, available: b.available && hasFormat }\n })\n}\n\nfunction modelsForStep(\n schema: PipelineAddonSchema | null,\n runtime: string,\n backend: string,\n caps: InferenceCapabilities,\n): readonly { id: string; name: string; downloaded: boolean }[] {\n if (!schema) return []\n const fmt = runtime === 'node'\n ? 'onnx'\n : ((caps.runtimes.python.backends.find(b => b.id === backend) as any)?.modelFormat ?? 'onnx')\n return schema.models\n .filter(m => (m.formats as Record<string, unknown>)[fmt])\n .map(m => ({\n id: m.id,\n name: m.name,\n downloaded: ((m.formats as Record<string, { downloaded?: boolean }>)[fmt])?.downloaded ?? false,\n }))\n}\n\nfunction runtimeOptions(caps: InferenceCapabilities): readonly { id: string; label: string; available: boolean }[] {\n const opts: { id: string; label: string; available: boolean }[] = [\n { id: 'node', label: 'Node.js (ONNX)', available: true },\n ]\n if (caps.runtimes.python.available && caps.runtimes.python.backends.some(b => b.available)) {\n opts.unshift({ id: 'python', label: 'Python', available: true })\n }\n return opts\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function PipelineStep({\n step,\n schema,\n allSchemas,\n capabilities,\n depth = 0,\n onChange,\n onDelete,\n readOnly = false,\n}: PipelineStepProps) {\n const [expanded, setExpanded] = useState(false)\n\n const color = borderColor(step.addonId, step.slot)\n const backends = backendsForRuntime(step.runtime, capabilities, schema)\n const rtOptions = runtimeOptions(capabilities)\n\n // Auto-correct: if the selected backend is not available, switch to the first available one\n const currentBackendAvailable = backends.find(b => b.id === step.backend)?.available ?? false\n if (!currentBackendAvailable && !readOnly) {\n const firstAvailable = backends.find(b => b.available)\n if (firstAvailable && firstAvailable.id !== step.backend) {\n // Defer the update to avoid render-during-render\n queueMicrotask(() => onChange({ ...step, backend: firstAvailable.id }))\n }\n }\n\n const models = modelsForStep(schema, step.runtime, step.backend, capabilities)\n\n // Auto-correct: if the selected model is not in the filtered list, switch to default or first\n if (models.length > 0 && !models.some(m => m.id === step.modelId) && !readOnly) {\n const defaultModel = schema?.defaultModelId ? models.find(m => m.id === schema.defaultModelId) : null\n const fallback = defaultModel ?? models[0]\n if (fallback && fallback.id !== step.modelId) {\n queueMicrotask(() => onChange({ ...step, modelId: fallback.id }))\n }\n }\n\n function handleClick(e: React.MouseEvent) {\n // Don't toggle when clicking inside config panel\n if ((e.target as HTMLElement).closest('.step-config')) return\n setExpanded(v => !v)\n }\n\n return (\n <div className=\"space-y-2\">\n {/* ── Step card ─────────────────────────────────────────── */}\n <div\n className={cn(\n 'rounded-xl border border-border bg-surface overflow-hidden border-l-4 shadow-sm',\n color,\n !step.enabled && 'opacity-[0.45]',\n )}\n >\n {/* Header */}\n <div className=\"flex items-center gap-2.5 px-3 py-2.5 cursor-pointer select-none\" onClick={handleClick}>\n <span className=\"text-foreground-subtle\">\n {expanded ? <ChevronDown className=\"h-4 w-4\" /> : <ChevronRight className=\"h-4 w-4\" />}\n </span>\n\n {/* Slot type (small header) + Name (prominent) + class tags */}\n <div className=\"flex-1 min-w-0\">\n <span className=\"text-[10px] uppercase tracking-wider font-medium text-foreground-subtle/60 block leading-none\">{step.slot}</span>\n <span className=\"text-sm font-semibold text-foreground truncate block leading-tight\">{step.addonName}</span>\n <div className=\"flex items-center gap-1 mt-0.5 flex-wrap\">\n {step.inputClasses.map(c => (\n <span key={c} className=\"text-[9px] uppercase font-semibold tracking-wide px-1.5 py-0.5 rounded bg-blue-500/12 text-blue-400\">{c}</span>\n ))}\n {step.inputClasses.length > 0 && step.outputClasses.length > 0 && (\n <span className=\"text-foreground-subtle/40 text-[10px]\">→</span>\n )}\n {step.outputClasses.map(c => (\n <span key={c} className=\"text-[9px] uppercase font-semibold tracking-wide px-1.5 py-0.5 rounded bg-green-500/12 text-green-400\">{c}</span>\n ))}\n </div>\n </div>\n\n {/* Toggle */}\n <button\n onClick={e => { e.stopPropagation(); onChange({ ...step, enabled: !step.enabled }) }}\n className={cn(\n 'relative inline-flex h-6 w-11 shrink-0 items-center rounded-full transition-colors',\n step.enabled ? 'bg-success' : 'bg-foreground-subtle/30',\n )}\n >\n <span className={cn(\n 'inline-block h-4 w-4 rounded-full bg-white shadow transition-transform',\n step.enabled ? 'translate-x-6' : 'translate-x-1',\n )} />\n </button>\n\n {/* Delete button removed — toggle switch is sufficient */}\n </div>\n\n {/* ── Expanded config ──────────────────────────────────── */}\n {expanded && (\n <div className=\"step-config border-t border-border bg-background px-4 py-4 space-y-3\">\n <div className=\"grid grid-cols-2 gap-3\">\n <ConfigSelect label=\"Agent\" value={step.agentId} disabled={readOnly}\n options={[{ value: step.agentId || 'hub', label: step.agentId || 'Hub (local)' }]}\n onChange={v => onChange({ ...step, agentId: v })} />\n <ConfigSelect label=\"Runtime\" value={step.runtime} disabled={readOnly}\n options={rtOptions.map(r => ({ value: r.id, label: r.label, disabled: !r.available }))}\n onChange={v => onChange({ ...step, runtime: v })} />\n <ConfigSelect label=\"Backend\" value={step.backend} disabled={readOnly}\n options={backends.map(b => ({ value: b.id, label: b.label, disabled: !b.available }))}\n onChange={v => onChange({ ...step, backend: v })} />\n <ConfigSelect label=\"Model\" value={step.modelId} disabled={readOnly}\n options={models.map(m => ({ value: m.id, label: `${m.name}${m.downloaded ? ' ✓' : ''}` }))}\n onChange={v => onChange({ ...step, modelId: v })} />\n </div>\n <div>\n <div className=\"flex items-center justify-between mb-1\">\n <span className=\"text-[10px] font-medium text-foreground-subtle uppercase tracking-wide\">Confidence</span>\n <span className=\"text-xs font-medium text-foreground tabular-nums\">{(step.confidence * 100).toFixed(0)}%</span>\n </div>\n <input type=\"range\" min={0} max={1} step={0.01} value={step.confidence} disabled={readOnly}\n onChange={e => onChange({ ...step, confidence: Number(e.target.value) })}\n className=\"w-full accent-primary h-1.5\" />\n </div>\n </div>\n )}\n </div>\n\n {/* Children are rendered by PipelineBuilder (it manages placeholders + nesting) */}\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Small config select — reusable for Agent/Runtime/Backend/Model\n// ---------------------------------------------------------------------------\n\nfunction ConfigSelect({ label, value, options, disabled, onChange }: {\n label: string\n value: string\n options: readonly { value: string; label: string; disabled?: boolean }[]\n disabled?: boolean\n onChange: (value: string) => void\n}) {\n return (\n <div>\n <label className=\"block text-[10px] font-medium text-foreground-subtle uppercase tracking-wide mb-1.5\">\n {label}\n </label>\n <select\n value={value}\n onChange={e => onChange(e.target.value)}\n disabled={disabled}\n className=\"w-full rounded-lg border border-border bg-surface px-3 py-2 text-xs text-foreground focus:outline-none focus:border-primary/50\"\n >\n {options.length === 0 && <option value={value}>{value || 'default'}</option>}\n {options.map(o => (\n <option key={o.value} value={o.value} disabled={o.disabled}>{o.label}</option>\n ))}\n </select>\n </div>\n )\n}\n","import { Cpu, Star } from 'lucide-react'\n\nexport interface PipelineRuntimeOption {\n readonly id: string\n readonly label: string\n readonly available: boolean\n /** Platform score for this backend (higher = better) */\n readonly platformScore?: number\n /** Whether this is the best-scored backend */\n readonly isBest?: boolean\n}\n\ninterface PipelineRuntimeSelectorProps {\n readonly options: readonly PipelineRuntimeOption[]\n readonly value: string\n readonly onChange: (value: string) => void\n}\n\nexport function PipelineRuntimeSelector({ options, value, onChange }: PipelineRuntimeSelectorProps) {\n return (\n <div className=\"flex flex-wrap gap-2\">\n {options.map((opt) => {\n const active = opt.id === value\n return (\n <button\n key={opt.id}\n onClick={() => opt.available && onChange(opt.id)}\n disabled={!opt.available}\n className={`flex items-center gap-2 rounded-lg border px-3 py-2 text-xs font-medium transition-all ${\n active\n ? 'border-primary/40 bg-primary/10 text-primary'\n : opt.available\n ? 'border-border bg-surface text-foreground-subtle hover:bg-surface-hover hover:text-foreground'\n : 'border-border/40 bg-surface/40 text-foreground-subtle/40 cursor-not-allowed'\n }`}\n >\n <Cpu className=\"h-3.5 w-3.5 shrink-0\" />\n {opt.label}\n {opt.isBest && (\n <span className=\"inline-flex items-center gap-0.5 rounded-full bg-amber-500/15 px-1.5 py-0.5 text-[10px] font-semibold text-amber-400\">\n <Star className=\"h-2.5 w-2.5\" />\n Best\n </span>\n )}\n {opt.platformScore != null && (\n <span className=\"text-[10px] text-foreground-subtle/60\">({opt.platformScore})</span>\n )}\n <span\n className={`h-1.5 w-1.5 rounded-full ${\n opt.available ? 'bg-success' : 'bg-danger'\n }`}\n />\n </button>\n )\n })}\n </div>\n )\n}\n","/**\n * PipelineBuilder — orchestrates the pipeline step tree with template management.\n *\n * Renders: template bar (save/load/delete), step tree from schema with nested\n * children, placeholder steps for disabled addons, all driven by API schema.\n */\nimport { useMemo, useState } from 'react'\nimport { Save, CopyPlus, Trash2, PlusCircle, X } from 'lucide-react'\nimport type {\n PipelineSchema,\n PipelineTemplate,\n InferenceCapabilities,\n PipelineAddonSchema,\n} from '@camstack/types'\nimport { cn } from '../lib/cn'\nimport { validateTemplate } from '../lib/validate-template'\nimport { PipelineStep } from './pipeline-step'\nimport type { PipelineStepDisplayConfig } from './pipeline-step'\n\n// ---------------------------------------------------------------------------\n// Public interface\n// ---------------------------------------------------------------------------\n\nexport interface PipelineBuilderProps {\n readonly schema: PipelineSchema\n readonly capabilities: InferenceCapabilities\n readonly steps: readonly PipelineStepDisplayConfig[]\n readonly onChange: (steps: readonly PipelineStepDisplayConfig[]) => void\n readonly templates: readonly PipelineTemplate[]\n readonly selectedTemplateId: string | null\n readonly onSelectTemplate: (id: string | null) => void\n readonly onSaveTemplate: (name: string, steps: readonly PipelineStepDisplayConfig[]) => void\n readonly onUpdateTemplate: (id: string, steps: readonly PipelineStepDisplayConfig[]) => void\n readonly onDeleteTemplate: (id: string) => void\n readonly readOnly?: boolean\n /** Addon IDs to exclude from the pipeline (e.g. 'motion-detection' for benchmark) */\n readonly excludeAddons?: readonly string[]\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction buildSchemaMap(schema: PipelineSchema): Map<string, PipelineAddonSchema> {\n const map = new Map<string, PipelineAddonSchema>()\n for (const slot of schema.slots) {\n for (const addon of slot.addons) {\n map.set(addon.id, addon)\n }\n }\n return map\n}\n\nfunction createDefaultStep(\n addon: PipelineAddonSchema,\n fallbackRuntime?: string,\n fallbackBackend?: string,\n): PipelineStepDisplayConfig {\n return {\n addonId: addon.id,\n addonName: addon.name,\n slot: addon.slot,\n inputClasses: [...addon.inputClasses],\n outputClasses: [...addon.outputClasses],\n enabled: true,\n agentId: 'hub',\n // Use per-addon defaults from backend PlatformScorer, fallback to provided\n runtime: (addon as any).defaultRuntime ?? fallbackRuntime ?? 'node',\n backend: (addon as any).defaultBackend ?? fallbackBackend ?? 'cpu',\n modelId: addon.defaultModelId,\n confidence: addon.defaultConfidence,\n classFilters: [...addon.inputClasses],\n children: [],\n }\n}\n\n// ---------------------------------------------------------------------------\n// Placeholder step — dashed card with plus icon, class I/O tags\n// ---------------------------------------------------------------------------\n\nfunction PlaceholderStep({ addon, onClick }: {\n addon: PipelineAddonSchema\n onClick: () => void\n}) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className=\"w-full rounded-xl border-2 border-dashed border-border/60 px-4 py-3 text-left transition-all hover:border-primary/30 hover:bg-surface/60 group\"\n >\n <div className=\"flex items-center gap-3\">\n <PlusCircle className=\"h-[18px] w-[18px] text-foreground-subtle/30 group-hover:text-primary/60 shrink-0\" />\n <div className=\"flex-1 min-w-0\">\n <span className=\"text-[13px] font-medium text-foreground-subtle/50 group-hover:text-foreground-subtle block truncate\">\n {addon.name}\n </span>\n <div className=\"flex items-center gap-1 mt-0.5 flex-wrap\">\n {addon.inputClasses.map(c => (\n <span key={c} className=\"text-[9px] uppercase font-semibold tracking-wide px-1.5 py-0.5 rounded bg-blue-500/8 text-blue-400/50\">{c}</span>\n ))}\n {addon.inputClasses.length > 0 && addon.outputClasses.length > 0 && (\n <span className=\"text-foreground-subtle/25 text-[10px]\">→</span>\n )}\n {addon.outputClasses.map(c => (\n <span key={c} className=\"text-[9px] uppercase font-semibold tracking-wide px-1.5 py-0.5 rounded bg-green-500/8 text-green-400/50\">{c}</span>\n ))}\n </div>\n </div>\n </div>\n </button>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Main component\n// ---------------------------------------------------------------------------\n\nexport function PipelineBuilder({\n schema,\n capabilities,\n steps,\n onChange,\n templates,\n selectedTemplateId,\n onSelectTemplate,\n onSaveTemplate,\n onUpdateTemplate,\n onDeleteTemplate,\n readOnly = false,\n excludeAddons = [],\n}: PipelineBuilderProps) {\n const excluded = useMemo(() => new Set(excludeAddons), [excludeAddons])\n const schemaMap = useMemo(() => buildSchemaMap(schema), [schema])\n const [warnings, setWarnings] = useState<string[]>([])\n\n // Determine default runtime/backend for new steps — prefer platform scores\n const bestPlatformScore = capabilities.platformScores?.find(s => s.available)\n const hasPython = capabilities.runtimes.python.available &&\n capabilities.runtimes.python.backends.some(b => b.available)\n const defaultRuntime = bestPlatformScore?.runtime\n ?? (hasPython ? 'python' : 'node')\n const defaultBackend = bestPlatformScore?.backend\n ?? (hasPython\n ? (capabilities.runtimes.python.backends.find(b => b.available)?.id ?? 'cpu')\n : (capabilities.runtimes.node.backends.find(b => b.available && b.id !== 'cpu')?.id ?? 'cpu'))\n\n // Check unsaved changes\n const dirty = selectedTemplateId\n ? JSON.stringify(steps) !== JSON.stringify(templates.find(t => t.id === selectedTemplateId)?.steps)\n : false\n\n // ── Template handlers ──────────────────────────────────────────\n function handleSelectTemplate(e: React.ChangeEvent<HTMLSelectElement>) {\n const id = e.target.value || null\n if (id) {\n const tpl = templates.find(t => t.id === id)\n if (tpl) {\n const result = validateTemplate(tpl.steps, schema)\n setWarnings([...result.warnings])\n }\n } else {\n setWarnings([])\n }\n onSelectTemplate(id)\n }\n\n function handleSave() {\n if (selectedTemplateId) onUpdateTemplate(selectedTemplateId, steps)\n }\n\n function handleSaveAs() {\n const name = window.prompt('Template name:')\n if (name?.trim()) onSaveTemplate(name.trim(), steps)\n }\n\n function handleDelete() {\n if (!selectedTemplateId) return\n const tpl = templates.find(t => t.id === selectedTemplateId)\n if (tpl && window.confirm(`Delete template \"${tpl.name}\"?`)) {\n onDeleteTemplate(selectedTemplateId)\n }\n }\n\n // ── Step handlers ──────────────────────────────────────────────\n\n /**\n * When a step is updated, auto-enable the entire ancestor chain if a\n * child/grandchild was just enabled. This ensures enabling face-recognition\n * automatically enables face-detection and object-detection.\n */\n function handleStepChange(updated: PipelineStepDisplayConfig) {\n onChange(steps.map(s => {\n if (s.addonId !== updated.addonId) return s\n return autoEnableAncestors(updated)\n }))\n }\n\n /** If any child or grandchild is enabled, ensure the parent is too */\n function autoEnableAncestors(step: PipelineStepDisplayConfig): PipelineStepDisplayConfig {\n const hasEnabledChild = step.children.some(c => c.enabled || c.children.some(gc => gc.enabled))\n return {\n ...step,\n enabled: step.enabled || hasEnabledChild,\n children: step.children.map(c => {\n const hasEnabledGrandchild = c.children.some(gc => gc.enabled)\n return {\n ...c,\n enabled: c.enabled || hasEnabledGrandchild,\n }\n }),\n }\n }\n\n function handleAddChildToStep(parentAddonId: string, addon: PipelineAddonSchema) {\n const child = createDefaultStep(addon, defaultRuntime, defaultBackend)\n onChange(steps.map(s => {\n if (s.addonId !== parentAddonId) return s\n return { ...s, children: [...s.children, child] }\n }))\n }\n\n // ── Rendering ──────────────────────────────────────────────────\n\n // Collect all addon IDs already in the tree (including nested)\n function collectIds(list: readonly PipelineStepDisplayConfig[]): Set<string> {\n const ids = new Set<string>()\n for (const s of list) {\n ids.add(s.addonId)\n for (const c of s.children) ids.add(c.addonId)\n // Recurse deeper\n const childIds = collectIds(s.children)\n for (const id of childIds) ids.add(id)\n }\n return ids\n }\n\n const existingIds = collectIds(steps)\n\n // Get child-slot addons that could be children of a given step\n function getChildPlaceholders(step: PipelineStepDisplayConfig): PipelineAddonSchema[] {\n const stepSchema = schemaMap.get(step.addonId)\n if (!stepSchema) return []\n const childSlotIds = stepSchema.childSlots\n const childIds = new Set(step.children.map(c => c.addonId))\n const placeholders: PipelineAddonSchema[] = []\n for (const slot of schema.slots) {\n if (!childSlotIds.includes(slot.id)) continue\n for (const addon of slot.addons) {\n if (childIds.has(addon.id) || excluded.has(addon.id)) continue\n // Check class compatibility: addon's input must overlap with step's output\n const compatible = addon.inputClasses.some(ic => step.outputClasses.includes(ic))\n if (compatible) placeholders.push(addon)\n }\n }\n return placeholders\n }\n\n function renderStep(step: PipelineStepDisplayConfig) {\n const childPlaceholders = getChildPlaceholders(step)\n\n return (\n <div key={step.addonId} className=\"space-y-1.5\">\n <PipelineStep\n step={step}\n schema={schemaMap.get(step.addonId) ?? null}\n allSchemas={schemaMap}\n capabilities={capabilities}\n onChange={handleStepChange}\n onDelete={readOnly ? undefined : (id) => onChange(steps.filter(s => s.addonId !== id))}\n readOnly={readOnly}\n />\n\n {/* Children + child placeholders — nested visually */}\n {(step.children.length > 0 || childPlaceholders.length > 0) && (\n <div className=\"ml-6 pl-4 border-l-2 border-dashed border-border/40 space-y-1.5\">\n {/* Slot label for children */}\n <span className=\"text-[10px] font-semibold uppercase tracking-widest text-foreground-subtle/40\">\n Slot: Cropper / Classifier\n </span>\n\n {/* Existing child steps */}\n {step.children.map(child => {\n const childChildPlaceholders = getChildPlaceholders(child)\n return (\n <div key={child.addonId} className=\"space-y-1.5\">\n <PipelineStep\n step={child}\n schema={schemaMap.get(child.addonId) ?? null}\n allSchemas={schemaMap}\n capabilities={capabilities}\n depth={1}\n onChange={updated => {\n handleStepChange({\n ...step,\n children: step.children.map(c => c.addonId === updated.addonId ? updated : c),\n })\n }}\n onDelete={readOnly ? undefined : (id) => {\n handleStepChange({\n ...step,\n children: step.children.filter(c => c.addonId !== id),\n })\n }}\n readOnly={readOnly}\n />\n\n {/* Sub-sub children (recognizers) + placeholders */}\n {(child.children.length > 0 || childChildPlaceholders.length > 0) && (\n <div className=\"ml-6 pl-4 border-l-2 border-dashed border-border/30 space-y-1.5\">\n <span className=\"text-[10px] font-semibold uppercase tracking-widest text-foreground-subtle/30\">\n Slot: Recognizer\n </span>\n\n {/* Existing recognizer steps */}\n {child.children.map(grandchild => (\n <PipelineStep\n key={grandchild.addonId}\n step={grandchild}\n schema={schemaMap.get(grandchild.addonId) ?? null}\n allSchemas={schemaMap}\n capabilities={capabilities}\n depth={2}\n onChange={updatedGrandchild => {\n handleStepChange({\n ...step,\n children: step.children.map(c =>\n c.addonId === child.addonId\n ? { ...c, children: c.children.map(gc => gc.addonId === updatedGrandchild.addonId ? updatedGrandchild : gc) }\n : c\n ),\n })\n }}\n onDelete={readOnly ? undefined : (id) => {\n handleStepChange({\n ...step,\n children: step.children.map(c =>\n c.addonId === child.addonId\n ? { ...c, children: c.children.filter(gc => gc.addonId !== id) }\n : c\n ),\n })\n }}\n readOnly={readOnly}\n />\n ))}\n\n {/* Placeholder recognizers */}\n {!readOnly && childChildPlaceholders.map(addon => (\n <PlaceholderStep\n key={addon.id}\n addon={addon}\n onClick={() => {\n const newChild = createDefaultStep(addon, defaultRuntime, defaultBackend)\n handleStepChange({\n ...step,\n children: step.children.map(c =>\n c.addonId === child.addonId\n ? { ...c, children: [...c.children, newChild] }\n : c\n ),\n })\n }}\n />\n ))}\n </div>\n )}\n </div>\n )\n })}\n\n {/* Placeholders for missing child addons */}\n {!readOnly && childPlaceholders.map(addon => (\n <PlaceholderStep\n key={addon.id}\n addon={addon}\n onClick={() => handleAddChildToStep(step.addonId, addon)}\n />\n ))}\n </div>\n )}\n </div>\n )\n }\n\n // Root slots (detectors)\n const rootSlots = schema.slots.filter(s => s.parentSlot === null).sort((a, b) => a.priority - b.priority)\n\n return (\n <div className=\"space-y-4\">\n {/* ── Template bar ────────────────────────────────────────── */}\n <div className=\"rounded-xl border border-border bg-surface p-3\">\n <div className=\"flex items-center gap-2\">\n <div className=\"relative flex-1 min-w-0\">\n <select\n value={selectedTemplateId ?? ''}\n onChange={handleSelectTemplate}\n className=\"w-full rounded-lg border border-border bg-background px-3 py-2 text-sm text-foreground focus:outline-none focus:border-primary/50\"\n >\n <option value=\"\">No template</option>\n {templates.map(t => <option key={t.id} value={t.id}>{t.name}</option>)}\n </select>\n </div>\n {dirty && <span className=\"h-1.5 w-1.5 rounded-full bg-amber-500 shrink-0\" />}\n <button onClick={handleSave} disabled={!selectedTemplateId || readOnly} title=\"Save\"\n className={cn('p-2 rounded-lg border border-border transition-colors',\n selectedTemplateId && !readOnly ? 'text-foreground-subtle hover:bg-surface-hover' : 'text-foreground-subtle/30 cursor-not-allowed')}>\n <Save className=\"h-4 w-4\" />\n </button>\n <button onClick={handleSaveAs} disabled={readOnly} title=\"Save As\"\n className={cn('p-2 rounded-lg border border-border transition-colors',\n !readOnly ? 'text-foreground-subtle hover:bg-surface-hover' : 'text-foreground-subtle/30 cursor-not-allowed')}>\n <CopyPlus className=\"h-4 w-4\" />\n </button>\n <button onClick={handleDelete} disabled={!selectedTemplateId || readOnly} title=\"Delete\"\n className={cn('p-2 rounded-lg border border-border transition-colors',\n selectedTemplateId && !readOnly ? 'text-foreground-subtle hover:text-danger' : 'text-foreground-subtle/30 cursor-not-allowed')}>\n <Trash2 className=\"h-4 w-4\" />\n </button>\n </div>\n </div>\n\n {/* ── Warnings ────────────────────────────────────────────── */}\n {warnings.length > 0 && (\n <div className=\"rounded-lg border border-amber-500/30 bg-amber-500/5 p-3 text-xs text-amber-400 space-y-1\">\n <div className=\"flex items-center justify-between\">\n <span className=\"font-medium\">Template loaded with warnings:</span>\n <button onClick={() => setWarnings([])} className=\"text-amber-400/60 hover:text-amber-400\"><X className=\"h-3.5 w-3.5\" /></button>\n </div>\n {warnings.map((w, i) => <div key={i}>• {w}</div>)}\n </div>\n )}\n\n {/* ── Step tree ───────────────────────────────────────────── */}\n {rootSlots.map(slot => {\n const slotSteps = steps.filter(s => s.slot === slot.id && !excluded.has(s.addonId))\n const missingRootAddons = slot.addons.filter(a => !existingIds.has(a.id) && !excluded.has(a.id))\n\n return (\n <div key={slot.id} className=\"space-y-2\">\n <span className=\"text-[10px] font-semibold uppercase tracking-widest text-foreground-subtle/50\">\n Slot: {slot.label}\n </span>\n\n {slotSteps.map(step => renderStep(step))}\n\n {/* Root placeholders (e.g. add another detector) */}\n {!readOnly && missingRootAddons.map(addon => (\n <PlaceholderStep key={addon.id} addon={addon} onClick={() => {\n onChange([...steps, createDefaultStep(addon, defaultRuntime, defaultBackend)])\n }} />\n ))}\n </div>\n )\n })}\n </div>\n )\n}\n","// packages/ui-library/src/lib/validate-template.ts\nimport type { PipelineSchema, PipelineTemplateStep, TemplateValidationResult } from '@camstack/types'\n\nexport function validateTemplate(\n steps: readonly PipelineTemplateStep[],\n schema: PipelineSchema,\n): TemplateValidationResult {\n const availableAddonIds = new Set(\n schema.slots.flatMap(s => s.addons.map(a => a.id))\n )\n const warnings: string[] = []\n\n function validateStep(step: PipelineTemplateStep): PipelineTemplateStep | null {\n if (!availableAddonIds.has(step.addonId)) {\n warnings.push(`Addon \"${step.addonId}\" is no longer available — step removed`)\n return null\n }\n const addon = schema.slots\n .flatMap(s => s.addons)\n .find(a => a.id === step.addonId)\n\n let modelId = step.modelId\n if (addon && !addon.models.some(m => m.id === modelId)) {\n const fallback = addon.defaultModelId\n warnings.push(`Model \"${modelId}\" not available for ${step.addonId} — using \"${fallback}\"`)\n modelId = fallback\n }\n\n const validChildren = step.children\n .map(c => validateStep(c))\n .filter((c): c is PipelineTemplateStep => c !== null)\n\n return { ...step, modelId, children: validChildren }\n }\n\n const validSteps = steps\n .map(s => validateStep(s))\n .filter((s): s is PipelineTemplateStep => s !== null)\n\n return {\n valid: warnings.length === 0,\n steps: validSteps,\n warnings,\n }\n}\n","/**\n * Detection class colors — single source of truth.\n *\n * Used by: DetectionCanvas (UI), result-annotator (server-side SVG),\n * admin-ui event viewer, and any other place that visualizes detections.\n */\n\n/** Fixed colors for known detection classes */\nexport const CLASS_COLORS: Readonly<Record<string, string>> = {\n // Primary detection classes\n person: '#3b82f6', // blue-500\n vehicle: '#f59e0b', // amber-500\n animal: '#22c55e', // green-500\n\n // Sub-detection classes\n face: '#a855f7', // purple-500\n plate: '#ec4899', // pink-500\n\n // Specific animal types\n bird: '#14b8a6', // teal-500\n dog: '#84cc16', // lime-500\n cat: '#f97316', // orange-500\n\n // Specific vehicle types\n car: '#f59e0b', // amber-500\n truck: '#d97706', // amber-600\n bus: '#b45309', // amber-700\n motorcycle:'#eab308', // yellow-500\n bicycle: '#ca8a04', // yellow-600\n\n // Other\n motion: '#facc15', // yellow-400\n}\n\n/** Fallback color palette for unknown classes (deterministic hash-based) */\nconst FALLBACK_PALETTE: readonly string[] = [\n '#ef4444', // red-500\n '#8b5cf6', // violet-500\n '#06b6d4', // cyan-500\n '#f97316', // orange-500\n '#10b981', // emerald-500\n '#6366f1', // indigo-500\n '#e11d48', // rose-600\n '#0891b2', // cyan-600\n '#7c3aed', // violet-600\n '#059669', // emerald-600\n]\n\n/** Primary/default color when nothing else matches */\nexport const DEFAULT_COLOR = '#f59e42'\n\n/**\n * Get the color for a detection class name.\n * Returns a fixed color for known classes, or a deterministic hash-based color for unknown ones.\n */\nexport function getClassColor(className: string, customColors?: Readonly<Record<string, string>>): string {\n // Check custom overrides first\n if (customColors?.[className]) return customColors[className]!\n if (customColors?.[className.toLowerCase()]) return customColors[className.toLowerCase()]!\n\n // Check known classes\n if (CLASS_COLORS[className]) return CLASS_COLORS[className]!\n if (CLASS_COLORS[className.toLowerCase()]) return CLASS_COLORS[className.toLowerCase()]!\n\n // Deterministic hash for unknown classes\n let hash = 0\n for (let i = 0; i < className.length; i++) {\n hash = (hash * 31 + (className.codePointAt(i) ?? 0)) >>> 0\n }\n return FALLBACK_PALETTE[hash % FALLBACK_PALETTE.length] ?? DEFAULT_COLOR\n}\n","/**\n * DetectionCanvas — renders an image with overlaid bounding boxes.\n *\n * Supports hierarchical detections (parent → children) with configurable\n * class-based colors. Used by benchmark Image Tester and admin-ui event viewer.\n */\nimport { type ReactNode, useRef, useEffect } from 'react'\nimport { cn } from '../lib/cn'\nimport { CLASS_COLORS, getClassColor } from './detection-colors'\n\n/** @deprecated Use CLASS_COLORS from detection-colors instead */\nexport const DEFAULT_CLASS_COLORS = CLASS_COLORS\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n// Re-export LabelData from @camstack/types for consumers of this component\nexport type { LabelData, LabelOrigin } from '@camstack/types'\nimport type { LabelData } from '@camstack/types'\n\nexport interface Detection {\n /** Display class name (e.g., 'person', 'vehicle', 'face') */\n readonly className: string\n /** Confidence score 0-1 */\n readonly confidence: number\n /** Bounding box [x1, y1, x2, y2] in pixel coordinates */\n readonly bbox: readonly [number, number, number, number]\n /** Sub-detections from cropper steps (face box, plate box) — for debug */\n readonly children?: readonly Detection[]\n /** Accumulated labels from all classifier/recognizer steps */\n readonly labelsData?: readonly LabelData[]\n /** Base64-encoded binary segmentation mask (from -seg models) */\n readonly mask?: string\n /** Mask pixel width */\n readonly maskWidth?: number\n /** Mask pixel height */\n readonly maskHeight?: number\n}\n\nexport interface DetectionCanvasProps {\n /** Image source (data URL or regular URL) */\n readonly src: string | null\n /** Image dimensions (used for bbox coordinate mapping) */\n readonly imageWidth: number\n readonly imageHeight: number\n /** Detections to overlay */\n readonly detections?: readonly Detection[]\n /** Custom class → hex color mapping (merged with defaults) */\n readonly classColors?: Readonly<Record<string, string>>\n /** Aspect ratio CSS value (default: auto based on image dimensions) */\n readonly aspectRatio?: string\n /** Additional CSS classes on the container */\n readonly className?: string\n /** Placeholder content when no image is loaded */\n readonly placeholder?: ReactNode\n /** Show confidence percentage in bbox labels */\n readonly showConfidence?: boolean\n /** Minimum confidence to display (0-1, default: 0) */\n readonly minConfidence?: number\n /** Border width for bboxes in px (default: 2) */\n readonly borderWidth?: number\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function DetectionCanvas({\n src,\n imageWidth,\n imageHeight,\n detections = [],\n classColors,\n aspectRatio,\n className,\n placeholder,\n showConfidence = true,\n minConfidence = 0,\n borderWidth = 2,\n}: DetectionCanvasProps) {\n function getColor(className: string): string {\n return getClassColor(className, classColors)\n }\n\n const ratio = aspectRatio ?? (imageWidth && imageHeight ? `${imageWidth}/${imageHeight}` : '16/9')\n\n const filteredDetections = detections.filter(d => d.confidence >= minConfidence)\n\n return (\n <div\n className={cn(\n 'rounded-lg border border-border bg-surface overflow-hidden relative',\n className,\n )}\n style={{ aspectRatio: ratio }}\n >\n {src ? (\n <>\n {/* Image — absolute so it shares coordinate space with bbox overlays */}\n <img src={src} className=\"absolute inset-0 w-full h-full object-fill\" alt=\"\" />\n\n {/* Segmentation mask overlays (rendered behind bounding boxes) */}\n {filteredDetections.map((d, i) =>\n d.mask && d.maskWidth && d.maskHeight ? (\n <MaskOverlay\n key={`mask-${i}`}\n mask={d.mask}\n maskWidth={d.maskWidth}\n maskHeight={d.maskHeight}\n bbox={d.bbox}\n imageWidth={imageWidth}\n imageHeight={imageHeight}\n color={getColor(d.className)}\n />\n ) : null,\n )}\n\n {/* Parent detection boxes */}\n {filteredDetections.map((d, i) => (\n <BoundingBox\n key={`det-${i}`}\n detection={d}\n imageWidth={imageWidth}\n imageHeight={imageHeight}\n color={getColor(d.className)}\n showConfidence={showConfidence}\n borderWidth={d.mask ? 1 : borderWidth}\n >\n {/* Child detection boxes — only cropper outputs with distinct bbox (face/plate) */}\n {d.children?.filter(c => {\n if (c.confidence < minConfidence) return false\n const [cx1, cy1, cx2, cy2] = c.bbox\n const cw = cx2 - cx1\n const ch = cy2 - cy1\n // Skip zero-size bbox (classifier outputs with no spatial info)\n if (cw <= 0 || ch <= 0) return false\n // Skip if bbox is same as parent (classifier ran on whole detection)\n const [px1, py1, px2, py2] = d.bbox\n const pw = px2 - px1\n const ph = py2 - py1\n if (pw > 0 && ph > 0 && (cw * ch) / (pw * ph) > 0.8) return false\n return true\n }).map((child, j) => (\n <ChildBoundingBox\n key={`child-${j}`}\n child={child}\n parentBbox={d.bbox}\n color={getColor(child.className)}\n showConfidence={showConfidence}\n />\n ))}\n </BoundingBox>\n ))}\n </>\n ) : (\n <div className=\"w-full h-full flex items-center justify-center text-foreground-subtle text-sm\">\n {placeholder ?? 'No image loaded'}\n </div>\n )}\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Sub-components\n// ---------------------------------------------------------------------------\n\nfunction BoundingBox({\n detection,\n imageWidth,\n imageHeight,\n color,\n showConfidence,\n borderWidth,\n children,\n}: {\n detection: Detection\n imageWidth: number\n imageHeight: number\n color: string\n showConfidence: boolean\n borderWidth: number\n children?: ReactNode\n}) {\n const [x1, y1, x2, y2] = detection.bbox\n\n // Smart label placement: if bbox is near the top of the image, show labels below instead\n const labelCount = 1 + (detection.labelsData?.length ?? 0)\n const labelHeightPx = labelCount * 16 + 4 // ~16px per label row + margin\n const topPct = (y1 / imageHeight) * 100\n const containerRef = useRef<HTMLDivElement>(null)\n\n // Estimate if there's enough space above the bbox\n // Each label row is ~16px, we need labelHeightPx above\n // Container height varies, so use percentage: labelHeightPx / containerHeight * 100\n const showBelow = topPct < (labelHeightPx / imageHeight) * 100 * 1.5\n\n const labelsElement = (\n <div\n className={`absolute left-0 flex flex-col items-start gap-px ${\n showBelow ? '' : ''\n }`}\n style={showBelow\n ? { top: '100%', marginTop: '2px' }\n : { bottom: '100%', marginBottom: '2px' }\n }\n >\n <span\n className=\"text-[10px] px-1 rounded-sm whitespace-nowrap text-white\"\n style={{ backgroundColor: color }}\n >\n {detection.className}\n {showConfidence && ` ${(detection.confidence * 100).toFixed(0)}%`}\n </span>\n {detection.labelsData?.map((l: LabelData, k: number) => (\n <span\n key={k}\n className=\"text-[9px] font-semibold px-1 rounded-sm whitespace-nowrap text-white\"\n style={{ backgroundColor: getClassColor(l.addonId ?? l.label) }}\n >\n {l.label} {(l.score * 100).toFixed(0)}%\n </span>\n ))}\n </div>\n )\n\n return (\n <div\n ref={containerRef}\n className=\"absolute rounded-sm\"\n style={{\n left: `${(x1 / imageWidth) * 100}%`,\n top: `${(y1 / imageHeight) * 100}%`,\n width: `${((x2 - x1) / imageWidth) * 100}%`,\n height: `${((y2 - y1) / imageHeight) * 100}%`,\n borderWidth: `${borderWidth}px`,\n borderStyle: 'solid',\n borderColor: color,\n }}\n >\n {labelsElement}\n {children}\n </div>\n )\n}\n\n/** Renders a segmentation mask as a semi-transparent colored canvas overlay */\nfunction MaskOverlay({\n mask,\n maskWidth,\n maskHeight,\n bbox,\n imageWidth,\n imageHeight,\n color,\n}: {\n mask: string\n maskWidth: number\n maskHeight: number\n bbox: readonly [number, number, number, number]\n imageWidth: number\n imageHeight: number\n color: string\n}) {\n const canvasRef = useRef<HTMLCanvasElement>(null)\n\n useEffect(() => {\n const canvas = canvasRef.current\n if (!canvas) return\n\n const ctx = canvas.getContext('2d')\n if (!ctx) return\n\n // Decode base64 mask — each byte is a pixel value (0 or 255)\n const binary = atob(mask)\n const bytes = new Uint8Array(binary.length)\n for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i)\n\n // Parse color\n const r = parseInt(color.slice(1, 3), 16)\n const g = parseInt(color.slice(3, 5), 16)\n const b = parseInt(color.slice(5, 7), 16)\n\n // Create mask image data at mask resolution (1 byte per pixel, not bit-packed)\n canvas.width = maskWidth\n canvas.height = maskHeight\n const imageData = ctx.createImageData(maskWidth, maskHeight)\n const totalPixels = maskWidth * maskHeight\n\n for (let i = 0; i < totalPixels; i++) {\n const val = i < bytes.length ? bytes[i]! : 0\n const px = i * 4\n if (val > 0) {\n imageData.data[px] = r\n imageData.data[px + 1] = g\n imageData.data[px + 2] = b\n imageData.data[px + 3] = 120 // semi-transparent\n }\n }\n\n ctx.putImageData(imageData, 0, 0)\n }, [mask, maskWidth, maskHeight, color])\n\n const [x1, y1, x2, y2] = bbox\n\n return (\n <canvas\n ref={canvasRef}\n className=\"absolute pointer-events-none\"\n style={{\n left: `${(x1 / imageWidth) * 100}%`,\n top: `${(y1 / imageHeight) * 100}%`,\n width: `${((x2 - x1) / imageWidth) * 100}%`,\n height: `${((y2 - y1) / imageHeight) * 100}%`,\n imageRendering: 'pixelated',\n }}\n />\n )\n}\n\nfunction ChildBoundingBox({\n child,\n parentBbox,\n color,\n showConfidence,\n}: {\n child: Detection\n parentBbox: readonly [number, number, number, number]\n color: string\n showConfidence: boolean\n}) {\n const [px1, py1, px2, py2] = parentBbox\n const [cx1, cy1, cx2, cy2] = child.bbox\n const pw = px2 - px1\n const ph = py2 - py1\n\n if (pw <= 0 || ph <= 0) return null\n\n return (\n <div\n className=\"absolute rounded-sm\"\n style={{\n left: `${Math.max(0, ((cx1 - px1) / pw) * 100)}%`,\n top: `${Math.max(0, ((cy1 - py1) / ph) * 100)}%`,\n width: `${Math.min(100, ((cx2 - cx1) / pw) * 100)}%`,\n height: `${Math.min(100, ((cy2 - cy1) / ph) * 100)}%`,\n borderWidth: '1px',\n borderStyle: 'solid',\n borderColor: color,\n }}\n >\n {/* Labels stack: className + labelsData, smart top/bottom placement */}\n {(() => {\n const labelCount = 1 + (child.labelsData?.length ?? 0)\n const relTop = ((cy1 - py1) / ph) * 100\n const showBelow = relTop < labelCount * 6 // ~6% per label row relative to parent\n return (\n <div\n className=\"absolute left-0 flex flex-col items-start gap-px\"\n style={showBelow\n ? { top: '100%', marginTop: '1px' }\n : { bottom: '100%', marginBottom: '1px' }\n }\n >\n <span\n className=\"text-[9px] px-0.5 rounded-sm whitespace-nowrap text-white\"\n style={{ backgroundColor: color }}\n >\n {child.className}\n {showConfidence && ` ${(child.confidence * 100).toFixed(0)}%`}\n </span>\n {child.labelsData?.map((l: LabelData, k: number) => (\n <span\n key={k}\n className=\"text-[8px] font-semibold px-0.5 rounded-sm whitespace-nowrap text-white\"\n style={{ backgroundColor: getClassColor(l.addonId ?? l.label) }}\n >\n {l.label} {(l.score * 100).toFixed(0)}%\n </span>\n ))}\n </div>\n )\n })()}\n </div>\n )\n}\n","/**\n * DetectionResultTree — displays detection results as a hierarchical tree.\n *\n * Shows parent detections with confidence badges, mask info, expandable children,\n * and visibility checkboxes that toggle overlays on the detection canvas.\n */\nimport { type Detection } from './detection-canvas'\nimport { getClassColor } from './detection-colors'\n\nexport interface DetectionResultTreeProps {\n readonly detections: readonly Detection[]\n readonly classColors?: Readonly<Record<string, string>>\n readonly className?: string\n /** Set of detection path keys that are hidden (e.g., \"0\", \"0.1\", \"0.1.2\") */\n readonly hiddenKeys?: ReadonlySet<string>\n /** Callback when a detection's visibility is toggled */\n readonly onToggleVisibility?: (key: string, visible: boolean) => void\n}\n\nexport function DetectionResultTree({\n detections,\n classColors,\n className,\n hiddenKeys,\n onToggleVisibility,\n}: DetectionResultTreeProps) {\n const colors = classColors\n\n if (detections.length === 0) {\n return (\n <div className=\"text-sm text-foreground-subtle italic text-center py-4\">\n No detections\n </div>\n )\n }\n\n return (\n <div className={className}>\n <div className=\"text-xs font-medium text-foreground-subtle uppercase tracking-wide mb-2\">\n Detections ({detections.length})\n </div>\n <div className=\"space-y-2\">\n {detections.map((d, i) => (\n <DetectionNode\n key={i}\n detection={d}\n path={String(i)}\n colors={colors}\n hiddenKeys={hiddenKeys}\n onToggleVisibility={onToggleVisibility}\n />\n ))}\n </div>\n </div>\n )\n}\n\nfunction DetectionNode({\n detection,\n path,\n colors,\n hiddenKeys,\n onToggleVisibility,\n}: {\n detection: Detection\n path: string\n colors?: Record<string, string>\n hiddenKeys?: ReadonlySet<string>\n onToggleVisibility?: (key: string, visible: boolean) => void\n}) {\n const color = getClassColor(detection.className, colors)\n const isVisible = !hiddenKeys?.has(path)\n\n return (\n <div className={`rounded-md border border-border bg-surface p-3 space-y-1 ${isVisible ? '' : 'opacity-40'}`}>\n <div className=\"flex justify-between items-center\">\n <div className=\"flex items-center gap-2\">\n {onToggleVisibility && (\n <input\n type=\"checkbox\"\n checked={isVisible}\n onChange={() => onToggleVisibility(path, !isVisible)}\n className=\"h-3.5 w-3.5 rounded border-border accent-primary cursor-pointer shrink-0\"\n />\n )}\n <span\n className=\"h-2.5 w-2.5 rounded-full shrink-0\"\n style={{ backgroundColor: color }}\n />\n <span className=\"text-sm font-medium text-foreground\">\n {detection.className}\n </span>\n {detection.mask && detection.maskWidth && detection.maskHeight && (\n <span className=\"text-[9px] font-mono px-1 py-0.5 rounded bg-primary/10 text-primary\">\n mask {detection.maskWidth}x{detection.maskHeight}\n </span>\n )}\n </div>\n <ConfidenceBadge confidence={detection.confidence} />\n </div>\n\n <div className=\"text-[10px] text-foreground-subtle font-mono\">\n bbox: [{detection.bbox.map(v => Math.round(v)).join(', ')}]\n </div>\n\n {/* Pipeline labelsData (species, plate text, vehicle type, face name, etc.) */}\n {detection.labelsData && detection.labelsData.length > 0 && (\n <div className=\"flex flex-wrap gap-1 mt-1\">\n {detection.labelsData.map((l: any, k: number) => (\n <span\n key={k}\n className=\"inline-flex items-center gap-1 text-[10px] font-medium px-1.5 py-0.5 rounded-full\"\n style={{ backgroundColor: getClassColor(l.addonId ?? l.label, colors) + '20', color: getClassColor(l.addonId ?? l.label, colors) }}\n >\n {l.label}\n <span className=\"opacity-60\">{(l.score * 100).toFixed(0)}%</span>\n {l.addonId && <span className=\"opacity-40 text-[8px]\">{l.addonId}</span>}\n </span>\n ))}\n </div>\n )}\n\n {/* Children tree — recursive */}\n {detection.children && detection.children.length > 0 && (\n <ChildrenTree\n children={detection.children}\n parentPath={path}\n colors={colors}\n hiddenKeys={hiddenKeys}\n onToggleVisibility={onToggleVisibility}\n />\n )}\n </div>\n )\n}\n\nfunction ChildrenTree({\n children,\n parentPath,\n colors,\n hiddenKeys,\n onToggleVisibility,\n}: {\n children: readonly Detection[]\n parentPath: string\n colors?: Record<string, string>\n hiddenKeys?: ReadonlySet<string>\n onToggleVisibility?: (key: string, visible: boolean) => void\n}) {\n return (\n <div className=\"ml-4 mt-1.5 space-y-1.5 border-l-2 border-border pl-3\">\n {children.map((child, j) => {\n const childPath = `${parentPath}.${j}`\n const childColor = getClassColor(child.className, colors)\n const isVisible = !hiddenKeys?.has(childPath)\n\n return (\n <div key={j} className={`text-xs space-y-0.5 ${isVisible ? '' : 'opacity-40'}`}>\n <div className=\"flex items-center gap-1.5\">\n {onToggleVisibility && (\n <input\n type=\"checkbox\"\n checked={isVisible}\n onChange={() => onToggleVisibility(childPath, !isVisible)}\n className=\"h-3 w-3 rounded border-border accent-primary cursor-pointer shrink-0\"\n />\n )}\n <span\n className=\"h-1.5 w-1.5 rounded-full shrink-0\"\n style={{ backgroundColor: childColor }}\n />\n <span className=\"font-medium\" style={{ color: childColor }}>\n {child.className}\n </span>\n <span className=\"text-foreground-subtle\">\n {(child.confidence * 100).toFixed(0)}%\n </span>\n {child.mask && child.maskWidth && child.maskHeight && (\n <span className=\"text-[9px] font-mono px-1 py-0.5 rounded bg-primary/10 text-primary\">\n mask {child.maskWidth}x{child.maskHeight}\n </span>\n )}\n </div>\n {/* labelsData on child */}\n {child.labelsData && child.labelsData.length > 0 && (\n <div className=\"flex flex-wrap gap-1 ml-5 mt-0.5\">\n {child.labelsData.map((l: any, k: number) => (\n <span key={k} className=\"inline-flex items-center gap-0.5 text-[9px] font-medium px-1 py-0.5 rounded-full\"\n style={{ backgroundColor: getClassColor(l.addonId ?? l.label, colors) + '20', color: getClassColor(l.addonId ?? l.label, colors) }}>\n {l.label} <span className=\"opacity-60\">{(l.score * 100).toFixed(0)}%</span>\n </span>\n ))}\n </div>\n )}\n {/* Recursive children */}\n {child.children && child.children.length > 0 && (\n <ChildrenTree\n children={child.children}\n parentPath={childPath}\n colors={colors}\n hiddenKeys={hiddenKeys}\n onToggleVisibility={onToggleVisibility}\n />\n )}\n </div>\n )\n })}\n </div>\n )\n}\n\nfunction ConfidenceBadge({ confidence }: { confidence: number }) {\n const level =\n confidence >= 0.8 ? 'bg-success/10 text-success' :\n confidence >= 0.5 ? 'bg-warning/10 text-warning' :\n 'bg-danger/10 text-danger'\n\n return (\n <span className={`text-xs font-medium px-2 py-0.5 rounded-full ${level}`}>\n {(confidence * 100).toFixed(1)}%\n </span>\n )\n}\n","/**\n * StepTimings — displays pipeline execution timings per step.\n */\n\nexport interface StepTimingsProps {\n readonly timings: Readonly<Record<string, number>>\n readonly totalMs?: number\n readonly className?: string\n}\n\nexport function StepTimings({ timings, totalMs, className }: StepTimingsProps) {\n const entries = Object.entries(timings)\n if (entries.length === 0 && totalMs === undefined) return null\n\n return (\n <div className={`rounded-lg border border-border bg-surface p-3 space-y-2 ${className ?? ''}`}>\n <div className=\"text-xs font-medium text-foreground-subtle uppercase tracking-wide\">\n Timings\n </div>\n <div className=\"space-y-1 text-xs\">\n {entries.map(([step, ms]) => (\n <div key={step} className=\"flex justify-between\">\n <span className=\"text-foreground-subtle\">{step}</span>\n <span className=\"font-mono text-foreground\">{ms.toFixed(1)}ms</span>\n </div>\n ))}\n {totalMs !== undefined && (\n <div className=\"flex justify-between pt-1 border-t border-border font-medium text-foreground\">\n <span>Total</span>\n <span className=\"font-mono\">{totalMs.toFixed(1)}ms</span>\n </div>\n )}\n </div>\n </div>\n )\n}\n","/**\n * ImageSelector — select from reference images or upload custom image.\n * Used by benchmark Image Tester and any addon page that needs image input.\n */\n\nexport interface ReferenceImage {\n readonly id: string\n readonly filename: string\n readonly sizeKB?: number\n}\n\nexport interface ImageSelectorProps {\n readonly images: readonly ReferenceImage[]\n readonly selectedFilename: string\n readonly uploadedName?: string\n readonly onSelect: (filename: string) => void\n readonly onUpload: (base64: string, filename: string, dataUrl: string) => void\n readonly className?: string\n}\n\nexport function ImageSelector({\n images,\n selectedFilename,\n uploadedName,\n onSelect,\n onUpload,\n className,\n}: ImageSelectorProps) {\n const handleUploadClick = () => {\n const input = document.createElement('input')\n input.type = 'file'\n input.accept = 'image/*'\n input.onchange = (ev: any) => {\n const file = ev.target.files?.[0]\n if (!file) return\n const reader = new FileReader()\n reader.onload = (e: any) => {\n const dataUrl = e.target?.result as string\n const b64 = dataUrl.split(',')[1]\n if (b64) onUpload(b64, file.name, dataUrl)\n }\n reader.readAsDataURL(file)\n }\n input.click()\n }\n\n return (\n <div className={`flex flex-wrap items-center gap-2 ${className ?? ''}`}>\n {images.map(img => (\n <button\n key={img.filename}\n onClick={() => onSelect(img.filename)}\n className={`px-3 py-1.5 text-xs rounded-md border transition-colors ${\n selectedFilename === img.filename\n ? 'bg-primary text-primary-foreground border-primary'\n : 'bg-surface border-border text-foreground hover:border-primary/50'\n }`}\n >\n {img.id}\n </button>\n ))}\n <button\n onClick={handleUploadClick}\n className=\"px-3 py-1.5 text-xs rounded-md border border-border bg-surface text-foreground hover:bg-surface-hover transition-colors\"\n >\n Upload...\n </button>\n {uploadedName && (\n <span className=\"text-xs text-foreground-subtle\">{uploadedName}</span>\n )}\n </div>\n )\n}\n","/**\n * InferenceConfigSelector — cascading selectors for runtime/backend/model.\n *\n * Used by benchmark Engine tab, Image Tester pipeline steps, and admin-ui\n * pipeline configuration. Shows only valid combinations based on capabilities.\n */\n\nexport interface InferenceBackendOption {\n readonly id: string\n readonly label: string\n readonly available: boolean\n}\n\nexport interface InferenceModelOption {\n readonly id: string\n readonly name: string\n readonly downloaded?: boolean\n}\n\nexport interface InferenceAgentOption {\n readonly id: string\n readonly name: string\n readonly status: 'online' | 'offline' | 'busy'\n}\n\nexport interface InferenceConfigSelectorProps {\n // Values\n readonly runtime: 'node' | 'python'\n readonly backend: string\n readonly modelId: string\n readonly agentId?: string\n\n // Options\n readonly runtimes: readonly { value: string; label: string; available: boolean }[]\n readonly backends: readonly InferenceBackendOption[]\n readonly models: readonly InferenceModelOption[]\n readonly agents?: readonly InferenceAgentOption[]\n\n // Callbacks\n readonly onRuntimeChange: (rt: 'node' | 'python') => void\n readonly onBackendChange: (id: string) => void\n readonly onModelChange: (id: string) => void\n readonly onAgentChange?: (id: string) => void\n\n // Layout\n readonly layout?: 'horizontal' | 'vertical' | 'grid'\n readonly className?: string\n /** Show agent selector (default: false) */\n readonly showAgent?: boolean\n}\n\nconst SELECT_CLASS = 'w-full px-3 py-2 text-sm rounded-md border border-border bg-surface text-foreground focus:outline-none focus:ring-2 focus:ring-primary/50'\n\nexport function InferenceConfigSelector({\n runtime,\n backend,\n modelId,\n agentId = 'hub',\n runtimes,\n backends,\n models,\n agents = [],\n onRuntimeChange,\n onBackendChange,\n onModelChange,\n onAgentChange,\n layout = 'grid',\n className,\n showAgent = false,\n}: InferenceConfigSelectorProps) {\n const containerClass = layout === 'grid'\n ? 'grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-4'\n : layout === 'horizontal'\n ? 'flex flex-wrap items-end gap-4'\n : 'space-y-3'\n\n return (\n <div className={`${containerClass} ${className ?? ''}`}>\n {/* Agent (optional) */}\n {showAgent && agents.length > 0 && (\n <label className=\"space-y-1\">\n <span className=\"text-xs font-medium text-foreground-subtle\">Agent</span>\n <select\n value={agentId}\n onChange={e => onAgentChange?.(e.target.value)}\n className={SELECT_CLASS}\n >\n {agents.map(a => (\n <option key={a.id} value={a.id}>\n {a.name} ({a.status})\n </option>\n ))}\n </select>\n </label>\n )}\n\n {/* Runtime */}\n <label className=\"space-y-1\">\n <span className=\"text-xs font-medium text-foreground-subtle\">Runtime</span>\n <select\n value={runtime}\n onChange={e => onRuntimeChange(e.target.value as 'node' | 'python')}\n className={SELECT_CLASS}\n >\n {runtimes.map(r => (\n <option key={r.value} value={r.value} disabled={!r.available}>\n {r.label}{!r.available ? ' (unavailable)' : ''}\n </option>\n ))}\n </select>\n </label>\n\n {/* Backend */}\n <label className=\"space-y-1\">\n <span className=\"text-xs font-medium text-foreground-subtle\">Backend</span>\n <select\n value={backend}\n onChange={e => onBackendChange(e.target.value)}\n className={SELECT_CLASS}\n >\n {backends.map(b => (\n <option key={b.id} value={b.id} disabled={!b.available}>\n {b.label}{!b.available ? ' (unavailable)' : ''}\n </option>\n ))}\n </select>\n </label>\n\n {/* Model */}\n <label className=\"space-y-1\">\n <span className=\"text-xs font-medium text-foreground-subtle\">Model</span>\n <select\n value={modelId}\n onChange={e => onModelChange(e.target.value)}\n className={SELECT_CLASS}\n >\n {models.length === 0\n ? <option value=\"\">No compatible models</option>\n : models.map(m => (\n <option key={m.id} value={m.id}>\n {m.name}{m.downloaded ? ' ✓' : ''}\n </option>\n ))\n }\n </select>\n </label>\n </div>\n )\n}\n","/**\n * mountAddonPage — one-liner to mount an addon page in dev mode.\n *\n * Handles everything: CSS import, React DOM mount, DevShell (login + theme + tRPC),\n * and wiring props in the standard AddonPageProps format.\n *\n * Usage in the addon's dev-shell.tsx:\n * ```tsx\n * import { mountAddonPage } from '@camstack/ui'\n * import MyPage from './page'\n * mountAddonPage(MyPage)\n * ```\n *\n * Or with options:\n * ```tsx\n * mountAddonPage(MyPage, { serverUrl: 'https://localhost:4443', title: 'My Addon' })\n * ```\n */\nimport { createElement } from 'react'\nimport { createRoot } from 'react-dom/client'\nimport { DevShell } from './dev-shell'\nimport type { AddonPageProps } from './addon-page-props'\n\nexport interface MountAddonPageOptions {\n /** Backend server URL (default: 'https://localhost:4443') */\n serverUrl?: string\n /** Title shown in the dev toolbar */\n title?: string\n /** Root element ID (default: 'root') */\n rootId?: string\n}\n\n/**\n * Mount an addon page component with the full dev shell.\n *\n * @param PageComponent - The addon page component (must accept AddonPageProps)\n * @param options - Configuration options\n */\nexport function mountAddonPage(\n PageComponent: (props: AddonPageProps) => any,\n options: MountAddonPageOptions = {},\n): void {\n const {\n serverUrl = 'https://localhost:4443',\n title,\n rootId = 'root',\n } = options\n\n const root = document.getElementById(rootId)\n if (!root) {\n console.error(`[mountAddonPage] Element #${rootId} not found`)\n return\n }\n\n createRoot(root).render(\n createElement(DevShell, {\n serverUrl,\n title,\n children: ({ trpc, theme }) =>\n createElement(PageComponent, {\n trpc,\n theme: { isDark: theme.resolvedMode === 'dark' },\n navigate: (path: string) => {\n console.log('[dev] navigate:', path)\n },\n }),\n }),\n )\n}\n","import { createContext, useCallback, useContext, useMemo, useState } from 'react'\nimport type { ReactNode } from 'react'\nimport { createTRPCClient, createWSClient, wsLink, httpLink, splitLink } from '@trpc/client'\nimport superjson from 'superjson'\nimport { ThemeProvider } from '../theme/theme-provider'\nimport { useThemeMode } from '../theme/use-theme-mode'\nimport type { UseThemeModeReturn } from '../theme/types'\nimport { LoginForm } from './login-form'\n\nconst STORAGE_KEY = 'camstack_dev_token'\n\nexport interface DevShellProps {\n children: (props: { trpc: ReturnType<typeof createTRPCClient>; theme: UseThemeModeReturn }) => ReactNode\n serverUrl?: string\n title?: string\n}\n\ninterface DevShellContextValue {\n trpc: ReturnType<typeof createTRPCClient>\n token: string\n logout: () => void\n}\n\nconst DevShellContext = createContext<DevShellContextValue | null>(null)\n\nexport function useDevShell(): DevShellContextValue {\n const ctx = useContext(DevShellContext)\n if (!ctx) {\n throw new Error('useDevShell must be used within a DevShell')\n }\n return ctx\n}\n\nfunction getStoredToken(): string | null {\n if (typeof window === 'undefined') return null\n return localStorage.getItem(STORAGE_KEY)\n}\n\nfunction SunIcon({ className }: { className?: string }) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n >\n <circle cx=\"12\" cy=\"12\" r=\"4\" />\n <path d=\"M12 2v2\" />\n <path d=\"M12 20v2\" />\n <path d=\"m4.93 4.93 1.41 1.41\" />\n <path d=\"m17.66 17.66 1.41 1.41\" />\n <path d=\"M2 12h2\" />\n <path d=\"M20 12h2\" />\n <path d=\"m6.34 17.66-1.41 1.41\" />\n <path d=\"m19.07 4.93-1.41 1.41\" />\n </svg>\n )\n}\n\nfunction MoonIcon({ className }: { className?: string }) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n >\n <path d=\"M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9Z\" />\n </svg>\n )\n}\n\nfunction DevShellInner({\n children,\n serverUrl,\n title,\n token,\n onLogout,\n}: {\n children: DevShellProps['children']\n serverUrl: string\n title?: string\n token: string\n onLogout: () => void\n}) {\n const theme = useThemeMode()\n\n const trpc = useMemo(\n () => {\n const wsUrl = serverUrl.replace(/^http/, 'ws') + '/trpc'\n const wsClient = createWSClient({\n url: wsUrl,\n connectionParams: () => ({ token }),\n })\n\n return createTRPCClient({\n links: [\n splitLink({\n condition: (op) => op.type === 'subscription',\n true: wsLink({ client: wsClient, transformer: superjson }),\n false: httpLink({\n url: `${serverUrl}/trpc`,\n transformer: superjson,\n headers: () => ({ authorization: `Bearer ${token}` }),\n }),\n }),\n ],\n })\n },\n [serverUrl, token],\n )\n\n const contextValue = useMemo<DevShellContextValue>(\n () => ({ trpc, token, logout: onLogout }),\n [trpc, token, onLogout],\n )\n\n return (\n <DevShellContext.Provider value={contextValue}>\n <div className=\"min-h-screen bg-background text-foreground\">\n <div className=\"flex items-center justify-between border-b border-border bg-surface px-4 py-2\">\n <div className=\"flex items-center gap-2\">\n <span className=\"rounded bg-warning/20 px-2 py-0.5 text-xs font-bold text-warning\">\n DEV MODE\n </span>\n {title && (\n <span className=\"text-sm font-medium text-foreground\">\n {title}\n </span>\n )}\n <span className=\"text-xs text-foreground-subtle\">\n {serverUrl}\n </span>\n </div>\n\n <div className=\"flex items-center gap-2\">\n <button\n type=\"button\"\n onClick={theme.toggleMode}\n className=\"flex items-center gap-1.5 rounded-md px-2 py-1 text-xs font-medium text-foreground-subtle hover:text-foreground hover:bg-surface-hover transition-colors\"\n title={`Theme: ${theme.mode}`}\n >\n {theme.resolvedMode === 'dark' ? (\n <SunIcon className=\"h-3.5 w-3.5\" />\n ) : (\n <MoonIcon className=\"h-3.5 w-3.5\" />\n )}\n {theme.mode === 'dark' ? 'Dark' : theme.mode === 'light' ? 'Light' : 'System'}\n </button>\n\n <button\n type=\"button\"\n onClick={onLogout}\n className=\"rounded-md px-2.5 py-1 text-xs font-medium text-danger hover:bg-danger/10 transition-colors\"\n >\n Logout\n </button>\n </div>\n </div>\n\n <div className=\"p-4\">{children({ trpc, theme })}</div>\n </div>\n </DevShellContext.Provider>\n )\n}\n\nexport function DevShell({\n children,\n serverUrl = 'https://localhost:4443',\n title,\n}: DevShellProps) {\n const [token, setToken] = useState<string | null>(getStoredToken)\n\n const handleLogin = useCallback(\n async (username: string, password: string) => {\n // Use tRPC client for auth (no token yet)\n const anonClient = createTRPCClient({\n links: [\n httpLink({\n url: `${serverUrl}/trpc`,\n transformer: superjson,\n }),\n ],\n })\n\n const res: any = await (anonClient as any).auth.login.mutate({ username, password })\n if (!res?.token) throw new Error('No token returned')\n\n localStorage.setItem(STORAGE_KEY, res.token)\n setToken(res.token)\n },\n [serverUrl],\n )\n\n const handleLogout = useCallback(() => {\n localStorage.removeItem(STORAGE_KEY)\n setToken(null)\n }, [])\n\n if (!token) {\n return (\n <ThemeProvider>\n <LoginForm onLogin={handleLogin} serverUrl={serverUrl} />\n </ThemeProvider>\n )\n }\n\n return (\n <ThemeProvider>\n <DevShellInner\n serverUrl={serverUrl}\n title={title}\n token={token}\n onLogout={handleLogout}\n >\n {children}\n </DevShellInner>\n </ThemeProvider>\n )\n}\n","import { type FormEvent, useState } from 'react'\nimport { cn } from '../lib/cn'\n\nexport interface LoginFormProps {\n onLogin: (username: string, password: string) => Promise<void>\n serverUrl?: string\n logoSrc?: string\n error?: string\n className?: string\n}\n\nfunction EyeIcon({ className }: { className?: string }) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n >\n <path d=\"M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0\" />\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n </svg>\n )\n}\n\nfunction EyeOffIcon({ className }: { className?: string }) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n >\n <path d=\"M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49\" />\n <path d=\"M14.084 14.158a3 3 0 0 1-4.242-4.242\" />\n <path d=\"M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143\" />\n <path d=\"m2 2 20 20\" />\n </svg>\n )\n}\n\nfunction SpinnerIcon({ className }: { className?: string }) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n >\n <path d=\"M21 12a9 9 0 1 1-6.219-8.56\" />\n </svg>\n )\n}\n\nexport function LoginForm({\n onLogin,\n serverUrl,\n logoSrc,\n error: externalError,\n className,\n}: LoginFormProps) {\n const [username, setUsername] = useState('')\n const [password, setPassword] = useState('')\n const [showPassword, setShowPassword] = useState(false)\n const [submitting, setSubmitting] = useState(false)\n const [internalError, setInternalError] = useState<string | null>(null)\n\n const error = externalError ?? internalError\n\n const handleSubmit = async (e: FormEvent) => {\n e.preventDefault()\n if (submitting) return\n\n setInternalError(null)\n setSubmitting(true)\n\n try {\n await onLogin(username, password)\n } catch (err) {\n const message =\n err instanceof Error ? err.message : 'Login failed. Please try again.'\n setInternalError(message)\n } finally {\n setSubmitting(false)\n }\n }\n\n return (\n <div\n className={cn(\n 'flex min-h-screen items-center justify-center bg-background p-4',\n className,\n )}\n >\n <div className=\"w-full max-w-sm\">\n {logoSrc && (\n <div className=\"flex justify-center mb-8\">\n <img src={logoSrc} alt=\"Logo\" className=\"h-12\" />\n </div>\n )}\n\n {serverUrl && (\n <p className=\"mb-4 text-center text-xs text-foreground-subtle truncate\">\n {serverUrl}\n </p>\n )}\n\n <form\n onSubmit={handleSubmit}\n className=\"space-y-4 rounded-xl border border-border bg-surface p-6 shadow-xl shadow-black/10\"\n >\n {error && (\n <div className=\"rounded-md bg-danger/10 border border-danger/20 px-3 py-2 text-xs text-danger\">\n {error}\n </div>\n )}\n\n <div className=\"space-y-1.5\">\n <label className=\"text-xs font-medium text-foreground-subtle\">\n Username\n </label>\n <input\n type=\"text\"\n value={username}\n onChange={(e) => setUsername(e.target.value)}\n autoComplete=\"username\"\n required\n className=\"w-full rounded-lg border border-border bg-background px-3 py-2.5 text-sm text-foreground placeholder:text-foreground-subtle focus:outline-none focus:ring-2 focus:ring-primary/50 focus:border-primary\"\n />\n </div>\n\n <div className=\"space-y-1.5\">\n <label className=\"text-xs font-medium text-foreground-subtle\">\n Password\n </label>\n <div className=\"relative\">\n <input\n type={showPassword ? 'text' : 'password'}\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n autoComplete=\"current-password\"\n required\n className=\"w-full rounded-lg border border-border bg-background px-3 py-2.5 pr-10 text-sm text-foreground placeholder:text-foreground-subtle focus:outline-none focus:ring-2 focus:ring-primary/50 focus:border-primary\"\n />\n <button\n type=\"button\"\n onClick={() => setShowPassword((prev) => !prev)}\n className=\"absolute right-2.5 top-1/2 -translate-y-1/2 text-foreground-subtle hover:text-foreground\"\n tabIndex={-1}\n >\n {showPassword ? (\n <EyeOffIcon className=\"h-4 w-4\" />\n ) : (\n <EyeIcon className=\"h-4 w-4\" />\n )}\n </button>\n </div>\n </div>\n\n <button\n type=\"submit\"\n disabled={submitting}\n className=\"w-full rounded-lg bg-primary px-4 py-2.5 text-sm font-semibold text-primary-foreground hover:bg-primary/90 disabled:opacity-50 disabled:cursor-not-allowed transition-colors flex items-center justify-center gap-2\"\n >\n {submitting && (\n <SpinnerIcon className=\"h-4 w-4 animate-spin\" />\n )}\n {submitting ? 'Logging in...' : 'Log in'}\n </button>\n </form>\n </div>\n </div>\n )\n}\n"],"mappings":"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","names":["import_react","import_lucide_react","import_react","import_jsx_runtime","import_react","import_class_variance_authority","import_jsx_runtime","import_react","import_class_variance_authority","import_jsx_runtime","import_react","import_class_variance_authority","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_class_variance_authority","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_class_variance_authority","import_jsx_runtime","import_react","import_lucide_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_class_variance_authority","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_lucide_react","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_lucide_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_lucide_react","import_jsx_runtime","import_jsx_runtime","import_react","import_lucide_react","import_jsx_runtime","import_lucide_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_lucide_react","import_jsx_runtime","import_react","import_lucide_react","import_jsx_runtime","import_lucide_react","import_jsx_runtime","import_lucide_react","import_jsx_runtime","import_jsx_runtime","table","_","import_jsx_runtime","import_jsx_runtime","import_react","import_lucide_react","import_jsx_runtime","import_lucide_react","import_jsx_runtime","import_react","import_lucide_react","import_jsx_runtime","import_react","import_jsx_runtime","className","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_client","import_react","import_react","import_jsx_runtime","import_jsx_runtime","superjson"]}