@marcoschwartz/lite-ui 0.23.3 → 0.23.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/theme/ThemeProvider.tsx","../src/theme/themes.ts","../src/components/Button.tsx","../src/components/Select.tsx","../src/components/Modal.tsx","../src/components/Navbar.tsx","../src/components/Sidebar.tsx","../src/components/SidebarProvider.tsx","../src/components/AppShell.tsx","../src/icons/icon-utils.tsx","../src/icons/HomeIcon.tsx","../src/icons/UserIcon.tsx","../src/icons/SearchIcon.tsx","../src/icons/BellIcon.tsx","../src/icons/SettingsIcon.tsx","../src/icons/MenuIcon.tsx","../src/icons/CloseIcon.tsx","../src/icons/PlusIcon.tsx","../src/icons/ArrowLeftIcon.tsx","../src/icons/ArrowRightIcon.tsx","../src/icons/ArrowUpIcon.tsx","../src/icons/ArrowDownIcon.tsx","../src/icons/ChevronDownIcon.tsx","../src/icons/ChevronUpIcon.tsx","../src/icons/ChevronLeftIcon.tsx","../src/icons/ChevronRightIcon.tsx","../src/icons/ExternalLinkIcon.tsx","../src/icons/CheckIcon.tsx","../src/icons/CheckCircleIcon.tsx","../src/icons/AlertCircleIcon.tsx","../src/icons/InfoCircleIcon.tsx","../src/icons/TrashIcon.tsx","../src/icons/EditIcon.tsx","../src/icons/CopyIcon.tsx","../src/icons/SaveIcon.tsx","../src/icons/DownloadIcon.tsx","../src/icons/UploadIcon.tsx","../src/icons/RefreshIcon.tsx","../src/icons/EyeIcon.tsx","../src/icons/EyeOffIcon.tsx","../src/icons/PlayIcon.tsx","../src/icons/PauseIcon.tsx","../src/icons/StopIcon.tsx","../src/icons/SkipBackIcon.tsx","../src/icons/SkipForwardIcon.tsx","../src/icons/VolumeUpIcon.tsx","../src/icons/VolumeOffIcon.tsx","../src/icons/FullscreenIcon.tsx","../src/icons/FullscreenExitIcon.tsx","../src/icons/MailIcon.tsx","../src/icons/ChatIcon.tsx","../src/icons/StarIcon.tsx","../src/icons/HeartIcon.tsx","../src/icons/CameraIcon.tsx","../src/icons/CalendarIcon.tsx","../src/icons/BookIcon.tsx","../src/icons/FileIcon.tsx","../src/icons/FolderIcon.tsx","../src/icons/ImageIcon.tsx","../src/icons/CodeIcon.tsx","../src/icons/TerminalIcon.tsx","../src/icons/DatabaseIcon.tsx","../src/icons/CloudIcon.tsx","../src/icons/PlugIcon.tsx","../src/icons/KeyIcon.tsx","../src/icons/LockIcon.tsx","../src/icons/ShieldIcon.tsx","../src/icons/SparklesIcon.tsx","../src/icons/BrainIcon.tsx","../src/icons/GlobeIcon.tsx","../src/icons/BeakerIcon.tsx","../src/icons/GoogleIcon.tsx","../src/icons/GitHubIcon.tsx","../src/icons/TwitterIcon.tsx","../src/icons/FacebookIcon.tsx","../src/icons/AppleIcon.tsx","../src/icons/LinkedInIcon.tsx","../src/icons/YouTubeIcon.tsx","../src/icons/SlackIcon.tsx","../src/components/Drawer.tsx","../src/components/TextInput.tsx","../src/components/NumberInput.tsx","../src/components/ActionMenu.tsx","../src/components/Card.tsx","../src/components/Alert.tsx","../src/components/Checkbox.tsx","../src/components/Toggle.tsx","../src/components/Badge.tsx","../src/components/Spinner.tsx","../src/components/Tabs.tsx","../src/components/Table.tsx","../src/components/Pagination.tsx","../src/components/DatePicker.tsx","../src/components/TimePicker.tsx","../src/components/DateTimePicker.tsx","../src/components/Calendar.tsx","../src/components/Radio.tsx","../src/components/ProgressBar.tsx","../src/components/Slider.tsx","../src/components/Avatar.tsx","../src/components/Textarea.tsx","../src/components/RichTextEditor.tsx","../src/components/Toast.tsx","../src/components/Stepper.tsx","../src/components/Divider.tsx","../src/components/FileUpload.tsx","../src/components/AudioPlayer.tsx","../src/components/VideoPlayer.tsx","../src/charts/LineChart.tsx","../src/charts/constants.ts","../src/charts/utils/scales.ts","../src/charts/utils/paths.ts","../src/charts/utils/format.ts","../src/charts/components/ChartTooltip.tsx","../src/charts/components/Legend.tsx","../src/charts/components/ReferenceLine.tsx","../src/charts/components/ReferenceArea.tsx","../src/charts/components/CartesianGrid.tsx","../src/charts/BarChart.tsx","../src/charts/AreaChart.tsx","../src/charts/PieChart.tsx","../src/charts/ScatterChart.tsx","../src/charts/components/ResponsiveContainer.tsx","../src/components/Heatmap.tsx","../src/utils/theme-script.ts"],"sourcesContent":["\"use client\";\n\nimport React, { createContext, useContext, useState, useEffect } from 'react';\nimport { themes, ThemeName, Theme } from './themes';\n\nexport type ColorMode = 'light' | 'dark' | 'system';\n\ninterface ThemeContextValue {\n theme: Theme;\n themeName: ThemeName;\n setTheme: (themeName: ThemeName) => void;\n colorMode: ColorMode;\n setColorMode: (mode: ColorMode) => void;\n toggleColorMode: () => void;\n resolvedColorMode: 'light' | 'dark';\n}\n\nconst ThemeContext = createContext<ThemeContextValue | undefined>(undefined);\n\nexport function useTheme() {\n const context = useContext(ThemeContext);\n\n // Return default values if no ThemeProvider is present (graceful fallback)\n if (!context) {\n const warnOnce = () => {\n if (process.env.NODE_ENV === 'development') {\n console.warn('useTheme: Component used outside ThemeProvider. Using default theme. Wrap your app with <ThemeProvider> for full functionality.');\n }\n };\n\n return {\n theme: themes.default,\n themeName: 'default' as ThemeName,\n setTheme: () => warnOnce(),\n colorMode: 'light' as ColorMode,\n setColorMode: () => warnOnce(),\n toggleColorMode: () => warnOnce(),\n resolvedColorMode: 'light' as 'light' | 'dark',\n };\n }\n\n return context;\n}\n\ninterface ThemeProviderProps {\n children: React.ReactNode;\n defaultTheme?: ThemeName;\n defaultColorMode?: ColorMode;\n}\n\nexport function ThemeProvider({\n children,\n defaultTheme = 'default',\n defaultColorMode = 'system'\n}: ThemeProviderProps) {\n const [mounted, setMounted] = useState(false);\n\n // Initialize from defaults (will sync with actual values after mount)\n const [themeName, setThemeNameState] = useState<ThemeName>(defaultTheme);\n const [colorMode, setColorModeState] = useState<ColorMode>(defaultColorMode);\n const [resolvedColorMode, setResolvedColorMode] = useState<'light' | 'dark'>('light');\n\n // Sync with actual values after mount to avoid hydration mismatch\n useEffect(() => {\n setMounted(true);\n\n // Read actual values from localStorage and DOM\n const storedTheme = localStorage.getItem('lite-ui-theme') as ThemeName;\n const storedColorMode = localStorage.getItem('lite-ui-color-mode') as ColorMode;\n const currentColorMode = document.documentElement.getAttribute('data-color-mode') as 'light' | 'dark';\n\n if (storedTheme) setThemeNameState(storedTheme);\n if (storedColorMode) setColorModeState(storedColorMode);\n if (currentColorMode) setResolvedColorMode(currentColorMode);\n }, []);\n\n const theme = themes[themeName];\n\n // Update theme\n const setTheme = (newThemeName: ThemeName) => {\n setThemeNameState(newThemeName);\n if (typeof window !== 'undefined') {\n localStorage.setItem('lite-ui-theme', newThemeName);\n document.documentElement.setAttribute('data-theme', newThemeName);\n }\n };\n\n // Update color mode\n const setColorMode = (mode: ColorMode) => {\n if (typeof window === 'undefined') return;\n\n setColorModeState(mode);\n localStorage.setItem('lite-ui-color-mode', mode);\n\n let resolved: 'light' | 'dark';\n if (mode === 'system') {\n resolved = window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';\n } else {\n resolved = mode;\n }\n\n setResolvedColorMode(resolved);\n document.documentElement.setAttribute('data-color-mode', resolved);\n\n if (resolved === 'dark') {\n document.documentElement.classList.add('dark');\n } else {\n document.documentElement.classList.remove('dark');\n }\n };\n\n // Toggle between light and dark mode\n const toggleColorMode = () => {\n if (colorMode === 'system') {\n // If currently system, toggle to opposite of current resolved mode\n setColorMode(resolvedColorMode === 'dark' ? 'light' : 'dark');\n } else {\n // Toggle between light and dark\n setColorMode(colorMode === 'dark' ? 'light' : 'dark');\n }\n };\n\n // Listen for system theme changes\n useEffect(() => {\n if (!mounted) return;\n\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n\n const handleChange = (e: MediaQueryListEvent) => {\n if (colorMode === 'system') {\n const resolved = e.matches ? 'dark' : 'light';\n setResolvedColorMode(resolved);\n document.documentElement.setAttribute('data-color-mode', resolved);\n\n if (resolved === 'dark') {\n document.documentElement.classList.add('dark');\n } else {\n document.documentElement.classList.remove('dark');\n }\n }\n };\n\n mediaQuery.addEventListener('change', handleChange);\n return () => mediaQuery.removeEventListener('change', handleChange);\n }, [mounted, colorMode]);\n\n return (\n <ThemeContext.Provider value={{\n theme,\n themeName,\n setTheme,\n colorMode,\n setColorMode,\n toggleColorMode,\n resolvedColorMode\n }}>\n {children}\n </ThemeContext.Provider>\n );\n}\n","export type ThemeName = 'default' | 'minimalistic';\n\nexport interface ButtonTheme {\n primary: string;\n secondary: string;\n success: string;\n danger: string;\n warning: string;\n info: string;\n outline: string;\n ghost: string;\n link: string;\n}\n\nexport interface SelectTheme {\n base: string;\n sizes: {\n sm: string;\n md: string;\n lg: string;\n xl: string;\n };\n disabled: string;\n}\n\nexport interface Theme {\n name: ThemeName;\n button: {\n base: string;\n variants: ButtonTheme;\n sizes: {\n sm: string;\n md: string;\n lg: string;\n xl: string;\n };\n disabled: string;\n };\n select: SelectTheme;\n}\n\nexport const themes: Record<ThemeName, Theme> = {\n default: {\n name: 'default',\n button: {\n base: 'font-medium rounded-md transition-all duration-150 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-[hsl(var(--ring))]/50 active:scale-[0.98] gap-2',\n variants: {\n primary: 'bg-[hsl(var(--primary))] text-[hsl(var(--primary-foreground))] hover:bg-[hsl(var(--primary))]/90 shadow-sm',\n secondary: 'bg-[hsl(var(--secondary))] text-[hsl(var(--secondary-foreground))] hover:bg-[hsl(var(--secondary))]/80 border border-[hsl(var(--border))]',\n success: 'bg-[hsl(var(--success))] text-[hsl(var(--success-foreground))] hover:bg-[hsl(var(--success))]/90 shadow-sm',\n danger: 'bg-[hsl(var(--destructive))] text-[hsl(var(--destructive-foreground))] hover:bg-[hsl(var(--destructive))]/90 shadow-sm',\n warning: 'bg-[hsl(var(--warning))] text-[hsl(var(--warning-foreground))] hover:bg-[hsl(var(--warning))]/90 shadow-sm',\n info: 'bg-[hsl(var(--info))] text-[hsl(var(--info-foreground))] hover:bg-[hsl(var(--info))]/90 shadow-sm',\n outline: 'border border-[hsl(var(--border))] bg-transparent hover:bg-[hsl(var(--accent))] text-[hsl(var(--foreground))]',\n ghost: 'bg-transparent hover:bg-[hsl(var(--accent))] text-[hsl(var(--foreground))]',\n link: 'bg-transparent text-[hsl(var(--primary))] underline-offset-4 hover:underline !p-0 !h-auto !min-h-0 shadow-none',\n },\n sizes: {\n sm: 'px-3 py-1.5 text-sm h-8',\n md: 'px-4 py-2 text-sm h-9',\n lg: 'px-5 py-2.5 text-base h-10',\n xl: 'px-6 py-3 text-base h-11',\n },\n disabled: 'pointer-events-none opacity-50',\n },\n select: {\n base: 'w-full appearance-none rounded-md border border-[hsl(var(--input))] bg-transparent text-[hsl(var(--foreground))] text-left transition-colors duration-150 focus:outline-none focus:ring-1 focus:ring-[hsl(var(--ring))]/50 focus:border-[hsl(var(--ring))] hover:border-[hsl(var(--muted-foreground))] pr-10 cursor-pointer',\n sizes: {\n sm: 'px-3 py-1.5 text-sm',\n md: 'px-3 py-2.5 text-sm',\n lg: 'px-4 py-3 text-base',\n xl: 'px-4 py-3.5 text-lg',\n },\n disabled: 'pointer-events-none opacity-50 bg-[hsl(var(--muted))]',\n },\n },\n minimalistic: {\n name: 'minimalistic',\n button: {\n base: 'font-normal rounded-none transition-colors duration-200 focus:outline-none border-2 gap-2',\n variants: {\n primary: 'bg-transparent border-white text-white hover:bg-white hover:text-black',\n secondary: 'bg-transparent border-gray-400 text-gray-400 hover:bg-gray-400 hover:text-black',\n success: 'bg-transparent border-green-400 text-green-400 hover:bg-green-400 hover:text-black',\n danger: 'bg-transparent border-red-400 text-red-400 hover:bg-red-400 hover:text-black',\n warning: 'bg-transparent border-yellow-400 text-yellow-400 hover:bg-yellow-400 hover:text-black',\n info: 'bg-transparent border-blue-400 text-blue-400 hover:bg-blue-400 hover:text-black',\n outline: 'bg-transparent border-white text-white hover:bg-white hover:text-black',\n ghost: 'bg-transparent border-transparent text-white hover:bg-white/10',\n link: 'bg-transparent border-transparent text-white underline-offset-4 hover:underline !p-0 !h-auto !min-h-0',\n },\n sizes: {\n sm: 'px-4 py-2 text-sm uppercase tracking-wide min-h-[36px]',\n md: 'px-6 py-3 text-base uppercase tracking-wide min-h-[48px]',\n lg: 'px-8 py-4 text-lg uppercase tracking-wider min-h-[60px]',\n xl: 'px-10 py-5 text-xl uppercase tracking-wider min-h-[72px]',\n },\n disabled: 'opacity-30 cursor-not-allowed hover:bg-transparent',\n },\n select: {\n base: 'w-full appearance-none rounded-none border-2 border-white bg-transparent text-white text-left transition-colors duration-200 focus:outline-none pr-10 cursor-pointer placeholder:text-gray-500',\n sizes: {\n sm: 'px-4 py-2 text-sm uppercase tracking-wide',\n md: 'px-4 py-3 text-base uppercase tracking-wide',\n lg: 'px-4 py-4 text-lg uppercase tracking-wider',\n xl: 'px-5 py-5 text-xl uppercase tracking-wider',\n },\n disabled: 'opacity-30 cursor-not-allowed',\n },\n },\n};\n","\"use client\";\n\nimport React from 'react';\nimport { useTheme } from '../theme/ThemeProvider';\n\nexport interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: 'primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'outline' | 'ghost' | 'link';\n size?: 'sm' | 'md' | 'lg' | 'xl';\n children: React.ReactNode;\n leftIcon?: React.ReactNode;\n rightIcon?: React.ReactNode;\n iconOnly?: boolean;\n}\n\nexport const Button: React.FC<ButtonProps> = ({\n variant = 'primary',\n size = 'md',\n className = '',\n children,\n disabled,\n leftIcon,\n rightIcon,\n iconOnly = false,\n ...props\n}) => {\n const { theme } = useTheme();\n\n const baseStyles = theme.button.base;\n const variantStyles = theme.button.variants[variant];\n const sizeStyles = theme.button.sizes[size];\n const disabledStyles = disabled ? theme.button.disabled : '';\n\n // Adjust padding for icon-only buttons - remove horizontal padding and make square\n const iconOnlyStyles = iconOnly ? '!p-0 aspect-square' : '';\n\n const classes = `inline-flex items-center justify-center ${baseStyles} ${variantStyles} ${sizeStyles} ${disabledStyles} ${iconOnlyStyles} ${className}`.trim();\n\n return (\n <button\n className={classes}\n disabled={disabled}\n {...props}\n >\n {iconOnly ? (\n children\n ) : (\n <>\n {leftIcon && <span className=\"inline-flex shrink-0\">{leftIcon}</span>}\n {children && <span className=\"inline-flex items-center\">{children}</span>}\n {rightIcon && <span className=\"inline-flex shrink-0\">{rightIcon}</span>}\n </>\n )}\n </button>\n );\n};\n","\"use client\";\n\nimport React, { useState, useRef, useEffect } from 'react';\nimport { useTheme } from '../theme/ThemeProvider';\n\nexport interface SelectOption {\n value: string;\n label: string;\n}\n\nexport interface SelectProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'size' | 'onChange' | 'defaultValue'> {\n options: SelectOption[];\n size?: 'sm' | 'md' | 'lg' | 'xl';\n placeholder?: string;\n disabled?: boolean;\n value?: string;\n defaultValue?: string;\n onChange?: (value: string) => void;\n label?: string;\n error?: string;\n helperText?: string;\n searchable?: boolean;\n searchPlaceholder?: string;\n}\n\nexport const Select: React.FC<SelectProps> = ({\n options,\n size = 'md',\n placeholder,\n className = '',\n disabled,\n value: controlledValue,\n defaultValue,\n onChange,\n label,\n error,\n helperText,\n searchable = false,\n searchPlaceholder = 'Search...',\n ...props\n}) => {\n const { theme, themeName } = useTheme();\n const [isOpen, setIsOpen] = useState(false);\n const [internalValue, setInternalValue] = useState(defaultValue || '');\n const [searchQuery, setSearchQuery] = useState('');\n const dropdownRef = useRef<HTMLDivElement>(null);\n const searchInputRef = useRef<HTMLInputElement>(null);\n\n // Use controlled value if provided, otherwise use internal state\n const value = controlledValue !== undefined ? controlledValue : internalValue;\n\n // Find the selected option\n const selectedOption = options.find(opt => opt.value === value);\n const displayText = selectedOption ? selectedOption.label : placeholder || 'Select...';\n\n // Filter options based on search query\n const filteredOptions = searchable && searchQuery\n ? options.filter(option =>\n option.label.toLowerCase().includes(searchQuery.toLowerCase())\n )\n : options;\n\n // Close dropdown when clicking outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) {\n setIsOpen(false);\n setSearchQuery('');\n }\n };\n\n if (isOpen) {\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }\n }, [isOpen]);\n\n // Focus search input when dropdown opens\n useEffect(() => {\n if (isOpen && searchable && searchInputRef.current) {\n searchInputRef.current.focus();\n }\n }, [isOpen, searchable]);\n\n const handleSelect = (optionValue: string) => {\n if (disabled) return;\n\n setInternalValue(optionValue);\n onChange?.(optionValue);\n setIsOpen(false);\n setSearchQuery('');\n };\n\n const handleToggle = () => {\n if (!disabled) {\n setIsOpen(!isOpen);\n }\n };\n\n const baseStyles = theme.select.base;\n const sizeStyles = theme.select.sizes[size];\n const disabledStyles = disabled ? theme.select.disabled : '';\n const errorStyles = error ? 'border-[hsl(var(--destructive))] focus:ring-[hsl(var(--destructive))]' : '';\n\n const buttonClasses = `${baseStyles} ${sizeStyles} ${disabledStyles} ${errorStyles}`.trim();\n\n // Icon color based on theme\n const iconColor = themeName === 'minimalistic'\n ? (disabled ? 'text-[hsl(var(--muted-foreground))]' : 'text-white')\n : 'text-[hsl(var(--muted-foreground))]';\n\n // Dropdown menu styles based on theme\n const dropdownBaseStyles = themeName === 'minimalistic'\n ? 'bg-black border-2 border-white'\n : 'bg-[hsl(var(--popover))] border border-[hsl(var(--border))] shadow-lg';\n\n const optionBaseStyles = themeName === 'minimalistic'\n ? 'text-white hover:bg-white hover:text-black transition-colors duration-200'\n : 'text-[hsl(var(--popover-foreground))] hover:bg-[hsl(var(--accent))] transition-colors duration-150';\n\n const optionSizeStyles = {\n sm: 'px-4 py-2 text-sm',\n md: 'px-4 py-2.5 text-base',\n lg: 'px-4 py-3 text-lg',\n xl: 'px-5 py-4 text-xl',\n }[size];\n\n return (\n <div className={`w-full ${className}`}>\n {label && (\n <label className=\"block text-sm font-medium text-[hsl(var(--foreground))] mb-1.5\">\n {label}\n </label>\n )}\n <div className=\"relative inline-block w-full\" ref={dropdownRef} {...props}>\n {/* Custom button that looks like select */}\n <button\n type=\"button\"\n className={buttonClasses}\n onClick={handleToggle}\n disabled={disabled}\n >\n <span className={!selectedOption && placeholder ? 'opacity-50' : ''}>\n {displayText}\n </span>\n </button>\n\n {/* Chevron icon */}\n <div className=\"pointer-events-none absolute inset-y-0 right-0 flex items-center pr-4\">\n <svg\n className={`h-5 w-5 transition-transform duration-200 ${iconColor} ${isOpen ? 'rotate-180' : ''}`}\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M5.23 7.21a.75.75 0 011.06.02L10 11.168l3.71-3.938a.75.75 0 111.08 1.04l-4.25 4.5a.75.75 0 01-1.08 0l-4.25-4.5a.75.75 0 01.02-1.06z\"\n clipRule=\"evenodd\"\n />\n </svg>\n </div>\n\n {/* Custom dropdown menu */}\n {isOpen && !disabled && (\n <div\n className={`absolute z-50 w-full mt-1 ${dropdownBaseStyles} rounded-md overflow-hidden`}\n >\n {/* Search input */}\n {searchable && (\n <div className={`sticky top-0 ${themeName === 'minimalistic' ? 'bg-black border-b-2 border-white' : 'bg-[hsl(var(--popover))] border-b border-[hsl(var(--border))]'}`}>\n <input\n ref={searchInputRef}\n type=\"text\"\n className={`w-full ${optionSizeStyles} ${themeName === 'minimalistic' ? 'bg-black text-white placeholder-[hsl(var(--muted-foreground))] focus:outline-none' : 'bg-transparent text-[hsl(var(--popover-foreground))] placeholder:text-[hsl(var(--muted-foreground))] focus:outline-none'}`}\n placeholder={searchPlaceholder}\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n onClick={(e) => e.stopPropagation()}\n />\n </div>\n )}\n\n {/* Options list */}\n <style>\n {`\n .select-dropdown-scroll {\n scrollbar-width: thin;\n scrollbar-color: rgba(156, 163, 175, 0.5) transparent;\n }\n .select-dropdown-scroll::-webkit-scrollbar {\n width: 8px;\n }\n .select-dropdown-scroll::-webkit-scrollbar-track {\n background: transparent;\n }\n .select-dropdown-scroll::-webkit-scrollbar-thumb {\n background-color: rgba(156, 163, 175, 0.5);\n border-radius: 4px;\n border: 2px solid transparent;\n background-clip: padding-box;\n }\n .select-dropdown-scroll::-webkit-scrollbar-thumb:hover {\n background-color: rgba(156, 163, 175, 0.7);\n }\n .dark .select-dropdown-scroll {\n scrollbar-color: rgba(75, 85, 99, 0.6) transparent;\n }\n .dark .select-dropdown-scroll::-webkit-scrollbar-thumb {\n background-color: rgba(75, 85, 99, 0.6);\n }\n .dark .select-dropdown-scroll::-webkit-scrollbar-thumb:hover {\n background-color: rgba(75, 85, 99, 0.8);\n }\n `}\n </style>\n <div\n className=\"select-dropdown-scroll\"\n style={{ maxHeight: '300px', overflowY: 'auto' }}\n >\n {filteredOptions.length > 0 ? (\n filteredOptions.map((option) => (\n <div\n key={option.value}\n className={`${optionBaseStyles} ${optionSizeStyles} cursor-pointer ${\n value === option.value ? (themeName === 'minimalistic' ? 'bg-white text-black' : 'bg-[hsl(var(--accent))]') : ''\n }`}\n onClick={() => handleSelect(option.value)}\n >\n {option.label}\n </div>\n ))\n ) : (\n <div className={`${optionSizeStyles} ${themeName === 'minimalistic' ? 'text-[hsl(var(--muted-foreground))]' : 'text-[hsl(var(--muted-foreground))]'} text-center`}>\n No results found\n </div>\n )}\n </div>\n </div>\n )}\n </div>\n {error && (\n <p className=\"mt-1.5 text-sm text-[hsl(var(--destructive))]\">{error}</p>\n )}\n {helperText && !error && (\n <p className=\"mt-1.5 text-sm text-[hsl(var(--muted-foreground))]\">{helperText}</p>\n )}\n </div>\n );\n};\n","\"use client\";\n\nimport React, { useEffect } from 'react';\n\nexport interface ModalProps {\n isOpen: boolean;\n onClose: () => void;\n title?: string;\n children: React.ReactNode;\n size?: 'sm' | 'md' | 'lg' | 'xl';\n showCloseButton?: boolean;\n}\n\nconst sizeClasses = {\n sm: 'max-w-md',\n md: 'max-w-lg',\n lg: 'max-w-2xl',\n xl: 'max-w-4xl',\n};\n\nexport const Modal: React.FC<ModalProps> = ({\n isOpen,\n onClose,\n title,\n children,\n size = 'md',\n showCloseButton = true,\n}) => {\n\n // Close on Escape key\n useEffect(() => {\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === 'Escape' && isOpen) {\n onClose();\n }\n };\n\n if (isOpen) {\n document.addEventListener('keydown', handleEscape);\n // Prevent body scroll when modal is open\n document.body.style.overflow = 'hidden';\n }\n\n return () => {\n document.removeEventListener('keydown', handleEscape);\n document.body.style.overflow = 'unset';\n };\n }, [isOpen, onClose]);\n\n if (!isOpen) return null;\n\n const sizeClass = sizeClasses[size];\n\n return (\n <div\n className=\"fixed inset-0 z-50 flex items-center justify-center p-4 bg-black/80 backdrop-blur-sm transition-all duration-200\"\n onClick={onClose}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={title ? 'modal-title' : undefined}\n >\n <div\n className={`relative w-full ${sizeClass} bg-[hsl(var(--card))] text-[hsl(var(--card-foreground))] rounded-[--radius] border border-[hsl(var(--border))] shadow-2xl transform transition-all duration-200 scale-100 animate-in`}\n onClick={(e) => e.stopPropagation()}\n >\n {/* Header */}\n {(title || showCloseButton) && (\n <div className=\"flex items-center justify-between p-6 border-b border-[hsl(var(--border))]\">\n {title && (\n <h3 id=\"modal-title\" className=\"text-lg font-semibold\">\n {title}\n </h3>\n )}\n {showCloseButton && (\n <button\n onClick={onClose}\n className=\"ml-auto text-[hsl(var(--muted-foreground))] hover:text-[hsl(var(--foreground))] transition-colors rounded-[--radius] p-1 hover:bg-[hsl(var(--accent))]\"\n aria-label=\"Close modal\"\n >\n <svg className=\"w-5 h-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n )}\n </div>\n )}\n\n {/* Content */}\n <div className=\"p-6\">\n {children}\n </div>\n </div>\n </div>\n );\n};\n","\"use client\";\n\nimport React from 'react';\n\nexport interface NavbarProps {\n logo?: React.ReactNode;\n children?: React.ReactNode;\n className?: string;\n sticky?: boolean;\n variant?: 'solid' | 'glass' | 'transparent';\n}\n\nexport const Navbar: React.FC<NavbarProps> = ({\n logo,\n children,\n className = '',\n sticky = false,\n variant = 'solid',\n}) => {\n\n const baseClasses = sticky ? 'sticky top-0 z-40' : '';\n\n const getVariantClasses = () => {\n switch (variant) {\n case 'glass':\n return 'bg-[hsl(var(--background))]/80 backdrop-blur-xl border-b border-[hsl(var(--border))]';\n case 'transparent':\n return 'bg-transparent';\n case 'solid':\n default:\n return 'bg-[hsl(var(--background))] border-b border-[hsl(var(--border))]';\n }\n };\n\n return (\n <nav className={`${getVariantClasses()} ${baseClasses} ${className}`}>\n <div className=\"max-w-7xl mx-auto px-4 sm:px-6 lg:px-8\">\n <div className=\"flex justify-between items-center h-16\">\n {logo && (\n <div className=\"flex items-center\">\n {logo}\n </div>\n )}\n {children && (\n <div className=\"flex items-center gap-6\">\n {children}\n </div>\n )}\n </div>\n </div>\n </nav>\n );\n};\n","\"use client\";\n\nimport React from 'react';\n\nexport interface SidebarProps {\n children: React.ReactNode;\n className?: string;\n width?: 'sm' | 'md' | 'lg';\n position?: 'left' | 'right';\n}\n\nconst widthClasses = {\n sm: 'w-48',\n md: 'w-64',\n lg: 'w-80',\n};\n\nexport const Sidebar: React.FC<SidebarProps> = ({\n children,\n className = '',\n width = 'md',\n position = 'left',\n}) => {\n const widthClass = widthClasses[width];\n const borderClass = position === 'left' ? 'border-r' : 'border-l';\n\n return (\n <aside\n className={`${widthClass} bg-[hsl(var(--card))] ${borderClass} border-[hsl(var(--border))] h-full overflow-y-auto ${className}`}\n >\n {children}\n </aside>\n );\n};\n","\"use client\";\n\nimport React, { createContext, useContext, useState, ReactNode } from 'react';\n\nexport interface SidebarContextValue {\n isOpen: boolean;\n isMobile: boolean;\n open: () => void;\n close: () => void;\n toggle: () => void;\n setIsMobile: (isMobile: boolean) => void;\n}\n\nconst SidebarContext = createContext<SidebarContextValue | undefined>(undefined);\n\nexport interface SidebarProviderProps {\n children: ReactNode;\n defaultOpen?: boolean;\n}\n\nexport const SidebarProvider: React.FC<SidebarProviderProps> = ({\n children,\n defaultOpen = false,\n}) => {\n const [isOpen, setIsOpen] = useState(defaultOpen);\n const [isMobile, setIsMobile] = useState(false);\n\n const open = () => setIsOpen(true);\n const close = () => setIsOpen(false);\n const toggle = () => setIsOpen(prev => !prev);\n\n const value: SidebarContextValue = {\n isOpen,\n isMobile,\n open,\n close,\n toggle,\n setIsMobile,\n };\n\n return (\n <SidebarContext.Provider value={value}>\n {children}\n </SidebarContext.Provider>\n );\n};\n\nexport const useSidebar = (): SidebarContextValue => {\n const context = useContext(SidebarContext);\n if (!context) {\n throw new Error('useSidebar must be used within a SidebarProvider');\n }\n return context;\n};\n","\"use client\";\n\nimport React, { useState } from 'react';\nimport { MenuIcon } from '../icons';\n\nexport interface AppShellProps {\n children: React.ReactNode;\n navbar?: {\n content: React.ReactNode;\n width?: 'sm' | 'md' | 'lg';\n breakpoint?: 'sm' | 'md' | 'lg' | 'xl';\n position?: 'side' | 'top';\n variant?: 'solid' | 'glass' | 'transparent';\n };\n header?: React.ReactNode;\n navbarTitle?: string;\n navbarLogo?: React.ReactNode;\n defaultNavbarOpen?: boolean;\n responsive?: boolean;\n className?: string;\n}\n\nconst widthClasses = {\n sm: 'w-48',\n md: 'w-64',\n lg: 'w-80',\n};\n\nconst breakpointClasses = {\n sm: 'sm',\n md: 'md',\n lg: 'lg',\n xl: 'xl',\n};\n\nconst getVariantClasses = (variant?: 'solid' | 'glass' | 'transparent') => {\n switch (variant) {\n case 'glass':\n return 'bg-[hsl(var(--background))]/80 backdrop-blur-xl';\n case 'transparent':\n return 'bg-transparent';\n case 'solid':\n default:\n return 'bg-[hsl(var(--background))] border-b border-[hsl(var(--border))]';\n }\n};\n\nexport const AppShell: React.FC<AppShellProps> = ({\n children,\n navbar,\n header,\n navbarTitle,\n navbarLogo,\n defaultNavbarOpen = false,\n responsive = true,\n className = '',\n}) => {\n const [isMobileNavbarOpen, setIsMobileNavbarOpen] = useState(defaultNavbarOpen);\n\n const navbarWidth = navbar?.width || 'md';\n const navbarBreakpoint = navbar?.breakpoint || 'md';\n const navbarPosition = navbar?.position || 'side';\n const widthClass = widthClasses[navbarWidth];\n const breakpoint = breakpointClasses[navbarBreakpoint];\n\n // Non-responsive mode: always show sidebar\n if (!responsive && navbar) {\n return (\n <div className={`min-h-screen flex flex-col ${className}`}>\n {header && <div className=\"w-full\">{header}</div>}\n <div className=\"flex flex-1\">\n <aside className={`${widthClass} bg-[hsl(var(--card))] border-r border-[hsl(var(--border))] h-full overflow-y-auto`}>\n {navbar.content}\n </aside>\n <main className=\"flex-1 overflow-y-auto\">\n {children}\n </main>\n </div>\n </div>\n );\n }\n\n // Non-responsive mode without navbar\n if (!responsive) {\n return (\n <div className={`min-h-screen flex flex-col ${className}`}>\n {header && <div className=\"w-full\">{header}</div>}\n <main className=\"flex-1 overflow-y-auto\">\n {children}\n </main>\n </div>\n );\n }\n\n // Responsive mode with TOP navbar\n if (navbar && navbarPosition === 'top') {\n const mobileMenuClass = navbarBreakpoint === 'sm' ? 'sm:hidden' :\n navbarBreakpoint === 'md' ? 'md:hidden' :\n navbarBreakpoint === 'lg' ? 'lg:hidden' : 'xl:hidden';\n\n const desktopNavClass = navbarBreakpoint === 'sm' ? 'sm:flex' :\n navbarBreakpoint === 'md' ? 'md:flex' :\n navbarBreakpoint === 'lg' ? 'lg:flex' : 'xl:flex';\n\n return (\n <div className={`min-h-screen flex flex-col bg-[hsl(var(--background))] ${className}`}>\n {/* Top Navbar */}\n <nav className={`sticky top-0 z-30 ${getVariantClasses(navbar.variant)}`}>\n <div className=\"max-w-7xl mx-auto px-4 sm:px-6 lg:px-8\">\n <div className=\"flex justify-between items-center h-16\">\n {/* Logo/Title */}\n <div className=\"flex items-center\">\n {navbarLogo ? (\n <div>{navbarLogo}</div>\n ) : navbarTitle ? (\n <span className=\"text-xl font-bold text-[hsl(var(--foreground))]\">\n {navbarTitle}\n </span>\n ) : null}\n </div>\n\n {/* Desktop Navigation - Hidden on Mobile */}\n <div className={`hidden ${desktopNavClass} items-center gap-6`}>\n {navbar.content}\n </div>\n\n {/* Mobile Hamburger - Visible on Mobile */}\n <button\n className={`${mobileMenuClass} p-2 rounded-lg hover:bg-[hsl(var(--accent))] transition-colors`}\n onClick={() => setIsMobileNavbarOpen(!isMobileNavbarOpen)}\n aria-label=\"Toggle menu\"\n >\n <MenuIcon size=\"md\" />\n </button>\n </div>\n </div>\n </nav>\n\n {/* Header (optional, shows below top navbar) */}\n {header && <div className=\"w-full\">{header}</div>}\n\n {/* Mobile Drawer */}\n {isMobileNavbarOpen && (\n <>\n <div\n className={`${mobileMenuClass} fixed inset-0 z-40 bg-black/60 backdrop-blur-sm animate-in fade-in duration-200`}\n onClick={() => setIsMobileNavbarOpen(false)}\n />\n <div className={`${mobileMenuClass} fixed left-0 top-0 bottom-0 z-50 w-64 bg-[hsl(var(--card))] shadow-2xl animate-in slide-in-from-left duration-300`}>\n <div className=\"p-4 border-b border-[hsl(var(--border))] flex items-center justify-between\">\n {navbarLogo ? (\n <div>{navbarLogo}</div>\n ) : navbarTitle ? (\n <span className=\"text-xl font-bold text-[hsl(var(--foreground))]\">\n {navbarTitle}\n </span>\n ) : null}\n <button\n className=\"p-1 rounded hover:bg-[hsl(var(--accent))] transition-colors\"\n onClick={() => setIsMobileNavbarOpen(false)}\n aria-label=\"Close menu\"\n >\n <svg className=\"w-6 h-6\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </div>\n <div\n className=\"p-4 flex flex-col gap-4\"\n onClick={() => setIsMobileNavbarOpen(false)}\n >\n {navbar.content}\n </div>\n </div>\n </>\n )}\n\n {/* Main Content */}\n <main className=\"flex-1 overflow-y-auto\">\n {children}\n </main>\n </div>\n );\n }\n\n // Responsive mode with SIDE navbar\n if (navbar) {\n // Build breakpoint classes statically\n const mobileHeaderClass = navbarBreakpoint === 'sm' ? 'sm:hidden' :\n navbarBreakpoint === 'md' ? 'md:hidden' :\n navbarBreakpoint === 'lg' ? 'lg:hidden' : 'xl:hidden';\n\n const desktopNavbarClass = navbarBreakpoint === 'sm' ? 'sm:block' :\n navbarBreakpoint === 'md' ? 'md:block' :\n navbarBreakpoint === 'lg' ? 'lg:block' : 'xl:block';\n\n const mobileDrawerClass = navbarBreakpoint === 'sm' ? 'sm:hidden' :\n navbarBreakpoint === 'md' ? 'md:hidden' :\n navbarBreakpoint === 'lg' ? 'lg:hidden' : 'xl:hidden';\n\n // Build width classes statically (Tailwind can't use dynamic classes)\n const sidebarWidthClass = navbarWidth === 'sm' ? 'w-48' :\n navbarWidth === 'lg' ? 'w-80' : 'w-64';\n\n return (\n <div className={`min-h-screen flex flex-col bg-[hsl(var(--background))] ${className}`}>\n {/* Mobile Header - Hidden on Desktop */}\n <div className={`${mobileHeaderClass} sticky top-0 z-30 ${getVariantClasses(navbar.variant)} px-4 py-3 flex items-center justify-between`}>\n {navbarLogo ? (\n <div>{navbarLogo}</div>\n ) : navbarTitle ? (\n <span className=\"text-xl font-bold text-[hsl(var(--foreground))]\">\n {navbarTitle}\n </span>\n ) : null}\n <button\n className=\"p-2 rounded-lg hover:bg-[hsl(var(--accent))] transition-colors\"\n onClick={() => setIsMobileNavbarOpen(!isMobileNavbarOpen)}\n aria-label=\"Toggle menu\"\n >\n <MenuIcon size=\"md\" />\n </button>\n </div>\n\n {/* Header (optional, shows on all screen sizes) */}\n {header && <div className=\"w-full\">{header}</div>}\n\n {/* Main Layout */}\n <div className=\"flex flex-1 min-h-0\">\n {/* Desktop Navbar - Hidden on Mobile */}\n <aside className={`hidden ${desktopNavbarClass} ${sidebarWidthClass} ${navbar.variant === 'glass' ? 'bg-[hsl(var(--background))]/80 backdrop-blur-xl' : navbar.variant === 'transparent' ? 'bg-transparent' : 'bg-[hsl(var(--card))] border-r border-[hsl(var(--border))]'} overflow-y-auto shrink-0`}>\n {navbar.content}\n </aside>\n\n {/* Mobile Drawer Overlay */}\n {isMobileNavbarOpen && (\n <>\n <div\n className={`${mobileDrawerClass} fixed inset-0 z-40 bg-black/60 backdrop-blur-sm animate-in fade-in duration-200`}\n onClick={() => setIsMobileNavbarOpen(false)}\n />\n <div className={`${mobileDrawerClass} fixed left-0 top-0 bottom-0 z-50 w-64 bg-[hsl(var(--card))] shadow-2xl animate-in slide-in-from-left duration-300`}>\n <div className=\"p-4 border-b border-[hsl(var(--border))] flex items-center justify-between\">\n {navbarLogo ? (\n <div>{navbarLogo}</div>\n ) : navbarTitle ? (\n <span className=\"text-xl font-bold text-[hsl(var(--foreground))]\">\n {navbarTitle}\n </span>\n ) : null}\n <button\n className=\"p-1 rounded hover:bg-[hsl(var(--accent))] transition-colors\"\n onClick={() => setIsMobileNavbarOpen(false)}\n aria-label=\"Close menu\"\n >\n <svg className=\"w-6 h-6\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </div>\n <div\n className=\"overflow-y-auto h-[calc(100vh-73px)]\"\n onClick={() => setIsMobileNavbarOpen(false)}\n >\n {navbar.content}\n </div>\n </div>\n </>\n )}\n\n {/* Main Content */}\n <main className=\"flex-1 overflow-y-auto min-h-screen\">\n {children}\n </main>\n </div>\n </div>\n );\n }\n\n // Responsive mode without navbar\n return (\n <div className={`min-h-screen flex flex-col ${className}`}>\n {header && <div className=\"w-full\">{header}</div>}\n <main className=\"flex-1 overflow-y-auto\">\n {children}\n </main>\n </div>\n );\n};\n","\"use client\";\n\nimport React from 'react';\n\nexport interface IconProps {\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n className?: string;\n color?: string;\n}\n\nconst sizeClasses = {\n xs: 'w-3 h-3',\n sm: 'w-4 h-4',\n md: 'w-5 h-5',\n lg: 'w-6 h-6',\n xl: 'w-8 h-8',\n};\n\nexport interface IconComponent extends React.FC<IconProps> {\n displayName?: string;\n}\n\nexport const createIcon = (\n displayName: string,\n path: React.ReactNode,\n filled = false\n): IconComponent => {\n const Icon: IconComponent = ({ size = 'md', className = '', color = 'currentColor' }) => {\n const sizeClass = sizeClasses[size];\n return (\n <svg\n className={`${sizeClass} ${className}`}\n fill={filled ? color : \"none\"}\n viewBox=\"0 0 24 24\"\n stroke={filled ? \"none\" : color}\n aria-hidden=\"true\"\n >\n {path}\n </svg>\n );\n };\n Icon.displayName = displayName;\n return Icon;\n};\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const HomeIcon = createIcon(\n 'HomeIcon',\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1m-6 0h6\" />\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const UserIcon = createIcon(\n 'UserIcon',\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z\" />\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const SearchIcon = createIcon(\n 'SearchIcon',\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z\" />\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const BellIcon = createIcon(\n 'BellIcon',\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 17h5l-1.405-1.405A2.032 2.032 0 0118 14.158V11a6.002 6.002 0 00-4-5.659V5a2 2 0 10-4 0v.341C7.67 6.165 6 8.388 6 11v3.159c0 .538-.214 1.055-.595 1.436L4 17h5m6 0v1a3 3 0 11-6 0v-1m6 0H9\" />\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const SettingsIcon = createIcon(\n 'SettingsIcon',\n <>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 12a3 3 0 11-6 0 3 3 0 016 0z\" />\n </>\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const MenuIcon = createIcon(\n 'MenuIcon',\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 6h16M4 12h16M4 18h16\" />\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const CloseIcon = createIcon(\n 'CloseIcon',\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const PlusIcon = createIcon(\n 'PlusIcon',\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 4v16m8-8H4\" />\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const ArrowLeftIcon = createIcon(\n 'ArrowLeftIcon',\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M10 19l-7-7m0 0l7-7m-7 7h18\" />\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const ArrowRightIcon = createIcon(\n 'ArrowRightIcon',\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M14 5l7 7m0 0l-7 7m7-7H3\" />\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const ArrowUpIcon = createIcon(\n 'ArrowUpIcon',\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 10l7-7m0 0l7 7m-7-7v18\" />,\n false\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const ArrowDownIcon = createIcon(\n 'ArrowDownIcon',\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 14l-7 7m0 0l-7-7m7 7V3\" />,\n false\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const ChevronDownIcon = createIcon(\n 'ChevronDownIcon',\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 9l-7 7-7-7\" />\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const ChevronUpIcon = createIcon(\n 'ChevronUpIcon',\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 15l7-7 7 7\" />\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const ChevronLeftIcon = createIcon(\n 'ChevronLeftIcon',\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 19l-7-7 7-7\" />\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const ChevronRightIcon = createIcon(\n 'ChevronRightIcon',\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 5l7 7-7 7\" />\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const ExternalLinkIcon = createIcon(\n 'ExternalLinkIcon',\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14\" />\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const CheckIcon = createIcon(\n 'CheckIcon',\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 13l4 4L19 7\" />\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const CheckCircleIcon = createIcon(\n 'CheckCircleIcon',\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z\" />\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const AlertCircleIcon = createIcon(\n 'AlertCircleIcon',\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const InfoCircleIcon = createIcon(\n 'InfoCircleIcon',\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const TrashIcon = createIcon(\n 'TrashIcon',\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16\" />\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const EditIcon = createIcon(\n 'EditIcon',\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M11 5H6a2 2 0 00-2 2v11a2 2 0 002 2h11a2 2 0 002-2v-5m-1.414-9.414a2 2 0 112.828 2.828L11.828 15H9v-2.828l8.586-8.586z\" />\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const CopyIcon = createIcon(\n 'CopyIcon',\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\" />\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const SaveIcon = createIcon(\n 'SaveIcon',\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M8 7H5a2 2 0 00-2 2v10a2 2 0 002 2h14a2 2 0 002-2V9a2 2 0 00-2-2h-3m-1 4l-3 3m0 0l-3-3m3 3V4\" />\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const DownloadIcon = createIcon(\n 'DownloadIcon',\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-4l-4 4m0 0l-4-4m4 4V4\" />\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const UploadIcon = createIcon(\n 'UploadIcon',\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-8l-4-4m0 0L8 8m4-4v12\" />\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const RefreshIcon = createIcon(\n 'RefreshIcon',\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15\" />\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const EyeIcon = createIcon(\n 'EyeIcon',\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 12a3 3 0 11-6 0 3 3 0 016 0z M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z\" />\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const EyeOffIcon = createIcon(\n 'EyeOffIcon',\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M13.875 18.825A10.05 10.05 0 0112 19c-4.478 0-8.268-2.943-9.543-7a9.97 9.97 0 011.563-3.029m5.858.908a3 3 0 114.243 4.243M9.878 9.878l4.242 4.242M9.88 9.88l-3.29-3.29m7.532 7.532l3.29 3.29M3 3l3.59 3.59m0 0A9.953 9.953 0 0112 5c4.478 0 8.268 2.943 9.543 7a10.025 10.025 0 01-4.132 5.411m0 0L21 21\" />\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const PlayIcon = createIcon(\n 'PlayIcon',\n <path d=\"M8 5v14l11-7z\" />,\n true\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const PauseIcon = createIcon(\n 'PauseIcon',\n <>\n <rect x=\"6\" y=\"4\" width=\"4\" height=\"16\" rx=\"1\" />\n <rect x=\"14\" y=\"4\" width=\"4\" height=\"16\" rx=\"1\" />\n </>,\n true\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const StopIcon = createIcon(\n 'StopIcon',\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const SkipBackIcon = createIcon(\n 'SkipBackIcon',\n <>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12.066 11.2a1 1 0 000 1.6l5.334 4A1 1 0 0019 16V8a1 1 0 00-1.6-.8l-5.333 4zM4.066 11.2a1 1 0 000 1.6l5.334 4A1 1 0 0011 16V8a1 1 0 00-1.6-.8l-5.334 4z\" />\n </>,\n false\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const SkipForwardIcon = createIcon(\n 'SkipForwardIcon',\n <>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M11.933 12.8a1 1 0 000-1.6L6.6 7.2A1 1 0 005 8v8a1 1 0 001.6.8l5.333-4zM19.933 12.8a1 1 0 000-1.6l-5.333-4A1 1 0 0013 8v8a1 1 0 001.6.8l5.333-4z\" />\n </>,\n false\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const VolumeUpIcon = createIcon(\n 'VolumeUpIcon',\n <>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15.536 8.464a5 5 0 010 7.072m2.828-9.9a9 9 0 010 12.728M5.586 15H4a1 1 0 01-1-1v-4a1 1 0 011-1h1.586l4.707-4.707C10.923 3.663 12 4.109 12 5v14c0 .891-1.077 1.337-1.707.707L5.586 15z\" />\n </>,\n false\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const VolumeOffIcon = createIcon(\n 'VolumeOffIcon',\n <>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5.586 15H4a1 1 0 01-1-1v-4a1 1 0 011-1h1.586l4.707-4.707C10.923 3.663 12 4.109 12 5v14c0 .891-1.077 1.337-1.707.707L5.586 15z\" clipRule=\"evenodd\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M17 14l2-2m0 0l2-2m-2 2l-2-2m2 2l2 2\" />\n </>,\n false\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const FullscreenIcon = createIcon(\n 'FullscreenIcon',\n <>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 8V4m0 0h4M4 4l5 5m11-1V4m0 0h-4m4 0l-5 5M4 16v4m0 0h4m-4 0l5-5m11 5v-4m0 4h-4m4 0l-5-5\" />\n </>,\n false\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const FullscreenExitIcon = createIcon(\n 'FullscreenExitIcon',\n <>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 9V4.5M9 9H4.5M9 9L3.75 3.75M9 15v4.5M9 15H4.5M9 15l-5.25 5.25M15 9h4.5M15 9V4.5M15 9l5.25-5.25M15 15h4.5M15 15v4.5m0-4.5l5.25 5.25\" />\n </>,\n false\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const MailIcon = createIcon(\n 'MailIcon',\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M3 8l7.89 5.26a2 2 0 002.22 0L21 8M5 19h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z\" />\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const ChatIcon = createIcon(\n 'ChatIcon',\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M8 12h.01M12 12h.01M16 12h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 01-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z\" />\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const StarIcon = createIcon(\n 'StarIcon',\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M11.049 2.927c.3-.921 1.603-.921 1.902 0l1.519 4.674a1 1 0 00.95.69h4.915c.969 0 1.371 1.24.588 1.81l-3.976 2.888a1 1 0 00-.363 1.118l1.518 4.674c.3.922-.755 1.688-1.538 1.118l-3.976-2.888a1 1 0 00-1.176 0l-3.976 2.888c-.783.57-1.838-.197-1.538-1.118l1.518-4.674a1 1 0 00-.363-1.118l-3.976-2.888c-.784-.57-.38-1.81.588-1.81h4.914a1 1 0 00.951-.69l1.519-4.674z\" />\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const HeartIcon = createIcon(\n 'HeartIcon',\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4.318 6.318a4.5 4.5 0 000 6.364L12 20.364l7.682-7.682a4.5 4.5 0 00-6.364-6.364L12 7.636l-1.318-1.318a4.5 4.5 0 00-6.364 0z\" />\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const CameraIcon = createIcon(\n 'CameraIcon',\n <>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M3 9a2 2 0 012-2h.93a2 2 0 001.664-.89l.812-1.22A2 2 0 0110.07 4h3.86a2 2 0 011.664.89l.812 1.22A2 2 0 0018.07 7H19a2 2 0 012 2v9a2 2 0 01-2 2H5a2 2 0 01-2-2V9z\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 13a3 3 0 11-6 0 3 3 0 016 0z\" />\n </>\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const CalendarIcon = createIcon(\n 'CalendarIcon',\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z\" />\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const BookIcon = createIcon(\n 'BookIcon',\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 6.253v13m0-13C10.832 5.477 9.246 5 7.5 5S4.168 5.477 3 6.253v13C4.168 18.477 5.754 18 7.5 18s3.332.477 4.5 1.253m0-13C13.168 5.477 14.754 5 16.5 5c1.747 0 3.332.477 4.5 1.253v13C19.832 18.477 18.247 18 16.5 18c-1.746 0-3.332.477-4.5 1.253\" />\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const FileIcon = createIcon(\n 'FileIcon',\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M7 21h10a2 2 0 002-2V9.414a1 1 0 00-.293-.707l-5.414-5.414A1 1 0 0012.586 3H7a2 2 0 00-2 2v14a2 2 0 002 2z\" />\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const FolderIcon = createIcon(\n 'FolderIcon',\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M3 7v10a2 2 0 002 2h14a2 2 0 002-2V9a2 2 0 00-2-2h-6l-2-2H5a2 2 0 00-2 2z\" />\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const ImageIcon = createIcon(\n 'ImageIcon',\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 16l4.586-4.586a2 2 0 012.828 0L16 16m-2-2l1.586-1.586a2 2 0 012.828 0L20 14m-6-6h.01M6 20h12a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v12a2 2 0 002 2z\" />\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const CodeIcon = createIcon(\n 'CodeIcon',\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M10 20l4-16m4 4l4 4-4 4M6 16l-4-4 4-4\" />\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const TerminalIcon = createIcon(\n 'TerminalIcon',\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M8 9l3 3-3 3m5 0h3M5 20h14a2 2 0 002-2V6a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z\" />\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const DatabaseIcon = createIcon(\n 'DatabaseIcon',\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 7v10c0 2.21 3.582 4 8 4s8-1.79 8-4V7M4 7c0 2.21 3.582 4 8 4s8-1.79 8-4M4 7c0-2.21 3.582-4 8-4s8 1.79 8 4m0 5c0 2.21-3.582 4-8 4s-8-1.79-8-4\" />\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const CloudIcon = createIcon(\n 'CloudIcon',\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M3 15a4 4 0 004 4h9a5 5 0 10-.1-9.999 5.002 5.002 0 10-9.78 2.096A4.001 4.001 0 003 15z\" />\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const PlugIcon = createIcon(\n 'PlugIcon',\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M13 10V3L4 14h7v7l9-11h-7z\" />\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const KeyIcon = createIcon(\n 'KeyIcon',\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 7a2 2 0 012 2m4 0a6 6 0 01-7.743 5.743L11 17H9v2H7v2H4a1 1 0 01-1-1v-2.586a1 1 0 01.293-.707l5.964-5.964A6 6 0 1121 9z\" />\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const LockIcon = createIcon(\n 'LockIcon',\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z\" />\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const ShieldIcon = createIcon(\n 'ShieldIcon',\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z\" />\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const SparklesIcon = createIcon(\n 'SparklesIcon',\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 3v4M3 5h4M6 17v4m-2-2h4m5-16l2.286 6.857L21 12l-5.714 2.143L13 21l-2.286-6.857L5 12l5.714-2.143L13 3z\" />\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const BrainIcon = createIcon(\n 'BrainIcon',\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9.663 17h4.673M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z\" />\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const GlobeIcon = createIcon(\n 'GlobeIcon',\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M3.055 11H5a2 2 0 012 2v1a2 2 0 002 2 2 2 0 012 2v2.945M8 3.935V5.5A2.5 2.5 0 0010.5 8h.5a2 2 0 012 2 2 2 0 104 0 2 2 0 012-2h1.064M15 20.488V18a2 2 0 012-2h3.064M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const BeakerIcon = createIcon(\n 'BeakerIcon',\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19.428 15.428a2 2 0 00-1.022-.547l-2.387-.477a6 6 0 00-3.86.517l-.318.158a6 6 0 01-3.86.517L6.05 15.21a2 2 0 00-1.806.547M8 4h8l-1 1v5.172a2 2 0 00.586 1.414l5 5c1.26 1.26.367 3.414-1.415 3.414H4.828c-1.782 0-2.674-2.154-1.414-3.414l5-5A2 2 0 009 10.172V5L8 4z\" />\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const GoogleIcon = createIcon(\n 'GoogleIcon',\n <path d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\" />,\n true\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const GitHubIcon = createIcon(\n 'GitHubIcon',\n <path d=\"M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z\" />,\n true\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const TwitterIcon = createIcon(\n 'TwitterIcon',\n <path d=\"M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z\" />,\n true\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const FacebookIcon = createIcon(\n 'FacebookIcon',\n <path d=\"M9.101 23.691v-7.98H6.627v-3.667h2.474v-1.58c0-4.085 1.848-5.978 5.858-5.978.401 0 .955.042 1.468.103a8.68 8.68 0 0 1 1.141.195v3.325a8.623 8.623 0 0 0-.653-.036 26.805 26.805 0 0 0-.733-.009c-.707 0-1.259.096-1.675.309a1.686 1.686 0 0 0-.679.622c-.258.42-.374.995-.374 1.752v1.297h3.919l-.386 2.103-.287 1.564h-3.246v8.245C19.396 23.238 24 18.179 24 12.044c0-6.627-5.373-12-12-12s-12 5.373-12 12c0 5.628 3.874 10.35 9.101 11.647Z\" />,\n true\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const AppleIcon = createIcon(\n 'AppleIcon',\n <path d=\"M17.05 20.28c-.98.95-2.05.88-3.08.4-1.09-.5-2.08-.48-3.24 0-1.44.62-2.2.44-3.06-.4C2.79 15.25 3.51 7.59 9.05 7.31c1.35.07 2.29.74 3.08.8 1.18-.24 2.31-.93 3.57-.84 1.51.12 2.65.72 3.4 1.8-3.12 1.87-2.38 5.98.48 7.13-.57 1.5-1.31 2.99-2.54 4.09l.01-.01zM12.03 7.25c-.15-2.23 1.66-4.07 3.74-4.25.29 2.58-2.34 4.5-3.74 4.25z\" />,\n true\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const LinkedInIcon = createIcon(\n 'LinkedInIcon',\n <path d=\"M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433c-1.144 0-2.063-.926-2.063-2.065 0-1.138.92-2.063 2.063-2.063 1.14 0 2.064.925 2.064 2.063 0 1.139-.925 2.065-2.064 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z\" />,\n true\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const YouTubeIcon = createIcon(\n 'YouTubeIcon',\n <path d=\"M23.498 6.186a3.016 3.016 0 0 0-2.122-2.136C19.505 3.545 12 3.545 12 3.545s-7.505 0-9.377.505A3.017 3.017 0 0 0 .502 6.186C0 8.07 0 12 0 12s0 3.93.502 5.814a3.016 3.016 0 0 0 2.122 2.136c1.871.505 9.376.505 9.376.505s7.505 0 9.377-.505a3.015 3.015 0 0 0 2.122-2.136C24 15.93 24 12 24 12s0-3.93-.502-5.814zM9.545 15.568V8.432L15.818 12l-6.273 3.568z\" />,\n true\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const SlackIcon = createIcon(\n 'SlackIcon',\n <path d=\"M5.042 15.165a2.528 2.528 0 0 1-2.52 2.523A2.528 2.528 0 0 1 0 15.165a2.527 2.527 0 0 1 2.522-2.52h2.52v2.52zm1.271 0a2.527 2.527 0 0 1 2.521-2.52 2.527 2.527 0 0 1 2.521 2.52v6.313A2.528 2.528 0 0 1 8.834 24a2.528 2.528 0 0 1-2.521-2.522v-6.313zM8.834 5.042a2.528 2.528 0 0 1-2.521-2.52A2.528 2.528 0 0 1 8.834 0a2.528 2.528 0 0 1 2.521 2.522v2.52H8.834zm0 1.271a2.528 2.528 0 0 1 2.521 2.521 2.528 2.528 0 0 1-2.521 2.521H2.522A2.528 2.528 0 0 1 0 8.834a2.528 2.528 0 0 1 2.522-2.521h6.312zm10.122 2.521a2.528 2.528 0 0 1 2.522-2.521A2.528 2.528 0 0 1 24 8.834a2.528 2.528 0 0 1-2.522 2.521h-2.522V8.834zm-1.268 0a2.528 2.528 0 0 1-2.523 2.521 2.527 2.527 0 0 1-2.52-2.521V2.522A2.527 2.527 0 0 1 15.165 0a2.528 2.528 0 0 1 2.523 2.522v6.312zm-2.523 10.122a2.528 2.528 0 0 1 2.523 2.522A2.528 2.528 0 0 1 15.165 24a2.527 2.527 0 0 1-2.52-2.522v-2.522h2.52zm0-1.268a2.527 2.527 0 0 1-2.52-2.523 2.526 2.526 0 0 1 2.52-2.52h6.313A2.527 2.527 0 0 1 24 15.165a2.528 2.528 0 0 1-2.522 2.523h-6.313z\" />,\n true\n);\n","\"use client\";\n\nimport React, { useEffect } from 'react';\n\nexport interface DrawerProps {\n isOpen: boolean;\n onClose: () => void;\n title?: string;\n children: React.ReactNode;\n position?: 'left' | 'right' | 'top' | 'bottom';\n size?: 'sm' | 'md' | 'lg';\n showCloseButton?: boolean;\n}\n\nconst sizeClasses = {\n left: {\n sm: 'w-64',\n md: 'w-80',\n lg: 'w-96',\n },\n right: {\n sm: 'w-64',\n md: 'w-80',\n lg: 'w-96',\n },\n top: {\n sm: 'h-48',\n md: 'h-64',\n lg: 'h-80',\n },\n bottom: {\n sm: 'h-48',\n md: 'h-64',\n lg: 'h-80',\n },\n};\n\nconst positionClasses = {\n left: 'left-0 top-0 h-full',\n right: 'right-0 top-0 h-full',\n top: 'top-0 left-0 w-full',\n bottom: 'bottom-0 left-0 w-full',\n};\n\nconst slideClasses = {\n left: 'transform transition-transform duration-300',\n right: 'transform transition-transform duration-300',\n top: 'transform transition-transform duration-300',\n bottom: 'transform transition-transform duration-300',\n};\n\nexport const Drawer: React.FC<DrawerProps> = ({\n isOpen,\n onClose,\n title,\n children,\n position = 'right',\n size = 'md',\n showCloseButton = true,\n}) => {\n\n // Close on Escape key\n useEffect(() => {\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === 'Escape' && isOpen) {\n onClose();\n }\n };\n\n if (isOpen) {\n document.addEventListener('keydown', handleEscape);\n document.body.style.overflow = 'hidden';\n }\n\n return () => {\n document.removeEventListener('keydown', handleEscape);\n document.body.style.overflow = 'unset';\n };\n }, [isOpen, onClose]);\n\n if (!isOpen) return null;\n\n const sizeClass = sizeClasses[position][size];\n const positionClass = positionClasses[position];\n\n return (\n <>\n {/* Backdrop */}\n <div\n className=\"fixed inset-0 z-40 bg-black/80 backdrop-blur-sm transition-all duration-200\"\n onClick={onClose}\n />\n\n {/* Drawer */}\n <div\n className={`fixed z-50 ${positionClass} ${sizeClass} bg-[hsl(var(--card))] text-[hsl(var(--card-foreground))] border-[hsl(var(--border))] shadow-2xl overflow-hidden flex flex-col ${slideClasses[position]} ${position === 'left' ? 'border-r' : position === 'right' ? 'border-l' : position === 'top' ? 'border-b' : 'border-t'}`}\n >\n {/* Header */}\n {(title || showCloseButton) && (\n <div className=\"flex items-center justify-between p-6 border-b border-[hsl(var(--border))]\">\n {title && (\n <h3 className=\"text-lg font-semibold\">\n {title}\n </h3>\n )}\n {showCloseButton && (\n <button\n onClick={onClose}\n className=\"ml-auto text-[hsl(var(--muted-foreground))] hover:text-[hsl(var(--foreground))] transition-colors rounded-[--radius] p-1 hover:bg-[hsl(var(--accent))]\"\n aria-label=\"Close drawer\"\n >\n <svg className=\"w-5 h-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n )}\n </div>\n )}\n\n {/* Content */}\n <div className=\"flex-1 p-6 overflow-y-auto\">\n {children}\n </div>\n </div>\n </>\n );\n};\n","\"use client\";\n\nimport React, { forwardRef } from 'react';\nimport { useTheme } from '../theme/ThemeProvider';\n\nexport interface TextInputProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size'> {\n label?: string;\n error?: string;\n helperText?: string;\n size?: 'sm' | 'md' | 'lg';\n fullWidth?: boolean;\n leftIcon?: React.ReactNode;\n rightIcon?: React.ReactNode;\n}\n\nconst sizeClasses = {\n sm: 'px-3 py-1.5 text-sm',\n md: 'px-4 py-2.5 text-base',\n lg: 'px-4 py-3 text-lg',\n};\n\nexport const TextInput = forwardRef<HTMLInputElement, TextInputProps>(\n (\n {\n label,\n error,\n helperText,\n size = 'md',\n fullWidth = false,\n leftIcon,\n rightIcon,\n className = '',\n disabled,\n ...props\n },\n ref\n ) => {\n const { theme, themeName } = useTheme();\n\n const baseStyles = 'w-full appearance-none rounded-md border border-[hsl(var(--input))] bg-transparent text-[hsl(var(--foreground))] transition-colors duration-150 focus:outline-none focus:ring-1 focus:ring-[hsl(var(--ring))]/50 focus:border-[hsl(var(--ring))] hover:border-[hsl(var(--muted-foreground))] placeholder:text-[hsl(var(--muted-foreground))]';\n const sizeStyle = sizeClasses[size];\n const errorStyles = error ? 'border-[hsl(var(--destructive))] focus:ring-[hsl(var(--destructive))]' : '';\n const disabledStyles = disabled ? 'pointer-events-none opacity-50 bg-[hsl(var(--muted))]' : '';\n const widthStyle = fullWidth ? 'w-full' : '';\n const paddingWithIcon = leftIcon ? 'pl-10' : rightIcon ? 'pr-10' : '';\n\n return (\n <div className={`${widthStyle} ${className}`}>\n {label && (\n <label className=\"block text-sm font-medium text-[hsl(var(--foreground))] mb-1.5\">\n {label}\n </label>\n )}\n <div className=\"relative\">\n {leftIcon && (\n <div className=\"absolute left-3 top-1/2 transform -translate-y-1/2 text-[hsl(var(--muted-foreground))]\">\n {leftIcon}\n </div>\n )}\n <input\n ref={ref}\n className={`${baseStyles} ${sizeStyle} ${errorStyles} ${disabledStyles} ${paddingWithIcon}`.trim()}\n disabled={disabled}\n {...props}\n />\n {rightIcon && (\n <div className=\"absolute right-3 top-1/2 transform -translate-y-1/2 text-[hsl(var(--muted-foreground))]\">\n {rightIcon}\n </div>\n )}\n </div>\n {error && (\n <p className=\"mt-1.5 text-sm text-[hsl(var(--destructive))]\">{error}</p>\n )}\n {helperText && !error && (\n <p className=\"mt-1.5 text-sm text-[hsl(var(--muted-foreground))]\">{helperText}</p>\n )}\n </div>\n );\n }\n);\n\nTextInput.displayName = 'TextInput';\n","\"use client\";\n\nimport React, { useState, useRef } from 'react';\n\nexport interface NumberInputProps {\n label?: string;\n error?: string;\n helperText?: string;\n value?: number;\n onChange?: (value: number | undefined) => void;\n min?: number;\n max?: number;\n step?: number;\n precision?: number;\n disabled?: boolean;\n hideControls?: boolean;\n size?: 'sm' | 'md' | 'lg';\n fullWidth?: boolean;\n placeholder?: string;\n className?: string;\n}\n\nconst sizeClasses = {\n sm: 'px-3 py-1.5 text-sm',\n md: 'px-3 py-2.5 text-sm',\n lg: 'px-4 py-3 text-base',\n};\n\nexport const NumberInput: React.FC<NumberInputProps> = ({\n label,\n error,\n helperText,\n value,\n onChange,\n min,\n max,\n step = 1,\n precision,\n disabled = false,\n hideControls = false,\n size = 'md',\n fullWidth = false,\n placeholder,\n className = '',\n}) => {\n const inputRef = useRef<HTMLInputElement>(null);\n const [isFocused, setIsFocused] = useState(false);\n\n const clampValue = (val: number): number => {\n let clamped = val;\n if (min !== undefined && clamped < min) clamped = min;\n if (max !== undefined && clamped > max) clamped = max;\n if (precision !== undefined) {\n clamped = parseFloat(clamped.toFixed(precision));\n }\n return clamped;\n };\n\n const handleIncrement = () => {\n if (disabled) return;\n const currentValue = value ?? 0;\n const newValue = clampValue(currentValue + step);\n onChange?.(newValue);\n };\n\n const handleDecrement = () => {\n if (disabled) return;\n const currentValue = value ?? 0;\n const newValue = clampValue(currentValue - step);\n onChange?.(newValue);\n };\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const inputValue = e.target.value;\n\n if (inputValue === '' || inputValue === '-') {\n onChange?.(undefined);\n return;\n }\n\n const numValue = parseFloat(inputValue);\n if (!isNaN(numValue)) {\n const clamped = clampValue(numValue);\n onChange?.(clamped);\n }\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'ArrowUp') {\n e.preventDefault();\n handleIncrement();\n } else if (e.key === 'ArrowDown') {\n e.preventDefault();\n handleDecrement();\n }\n };\n\n const baseStyles = 'w-full appearance-none rounded-md border border-[hsl(var(--input))] bg-transparent text-[hsl(var(--foreground))] transition-colors duration-150 focus:outline-none focus:ring-1 focus:ring-[hsl(var(--ring))]/50 focus:border-[hsl(var(--ring))] hover:border-[hsl(var(--muted-foreground))] placeholder:text-[hsl(var(--muted-foreground))]';\n const sizeStyle = sizeClasses[size];\n const errorStyles = error ? 'border-[hsl(var(--destructive))] focus:ring-[hsl(var(--destructive))]/50' : '';\n const disabledStyles = disabled ? 'opacity-50 cursor-not-allowed bg-[hsl(var(--muted))]' : '';\n const widthStyle = fullWidth ? 'w-full' : '';\n const paddingWithControls = !hideControls ? 'pr-8' : '';\n\n const displayValue = value !== undefined ? value.toString() : '';\n\n return (\n <div className={`${widthStyle} ${className}`}>\n {label && (\n <label className=\"block text-sm font-medium text-[hsl(var(--foreground))] mb-1.5\">\n {label}\n </label>\n )}\n <div className=\"relative\">\n <input\n ref={inputRef}\n type=\"number\"\n value={displayValue}\n onChange={handleInputChange}\n onKeyDown={handleKeyDown}\n onFocus={() => setIsFocused(true)}\n onBlur={() => setIsFocused(false)}\n disabled={disabled}\n placeholder={placeholder}\n min={min}\n max={max}\n step={step}\n className={`${baseStyles} ${sizeStyle} ${errorStyles} ${disabledStyles} ${paddingWithControls} [appearance:textfield] [&::-webkit-outer-spin-button]:appearance-none [&::-webkit-inner-spin-button]:appearance-none`.trim()}\n />\n {!hideControls && (\n <div className=\"absolute right-1 top-1/2 -translate-y-1/2 flex flex-col\">\n <button\n type=\"button\"\n onClick={handleIncrement}\n disabled={disabled || (max !== undefined && value !== undefined && value >= max)}\n className=\"px-2 py-0.5 hover:bg-[hsl(var(--accent))] rounded transition-colors disabled:opacity-30 disabled:cursor-not-allowed\"\n tabIndex={-1}\n >\n <svg className=\"w-3 h-3 text-[hsl(var(--muted-foreground))]\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={3} d=\"M5 15l7-7 7 7\" />\n </svg>\n </button>\n <button\n type=\"button\"\n onClick={handleDecrement}\n disabled={disabled || (min !== undefined && value !== undefined && value <= min)}\n className=\"px-2 py-0.5 hover:bg-[hsl(var(--accent))] rounded transition-colors disabled:opacity-30 disabled:cursor-not-allowed\"\n tabIndex={-1}\n >\n <svg className=\"w-3 h-3 text-[hsl(var(--muted-foreground))]\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={3} d=\"M19 9l-7 7-7-7\" />\n </svg>\n </button>\n </div>\n )}\n </div>\n {error && (\n <p className=\"mt-1.5 text-sm text-[hsl(var(--destructive))]\">{error}</p>\n )}\n {helperText && !error && (\n <p className=\"mt-1.5 text-sm text-[hsl(var(--muted-foreground))]\">{helperText}</p>\n )}\n </div>\n );\n};\n\nNumberInput.displayName = 'NumberInput';\n","\"use client\";\n\nimport React, { useState, useRef, useEffect } from 'react';\nimport { createPortal } from 'react-dom';\nimport { useTheme } from '../theme/ThemeProvider';\n\nexport type ActionMenuItem = {\n type?: 'item';\n label: string;\n onClick: () => void;\n icon?: React.ReactNode;\n disabled?: boolean;\n variant?: 'default' | 'danger';\n} | {\n type: 'divider';\n};\n\nexport interface ActionMenuProps {\n items: ActionMenuItem[];\n trigger?: React.ReactNode;\n position?: 'left' | 'right';\n placement?: 'top' | 'bottom' | 'left' | 'right';\n}\n\nexport const ActionMenu: React.FC<ActionMenuProps> = ({\n items,\n trigger,\n position = 'right',\n placement = 'bottom',\n}) => {\n const { themeName } = useTheme();\n const [isOpen, setIsOpen] = useState(false);\n const [menuPosition, setMenuPosition] = useState<{ top: number; left: number } | null>(null);\n const [mounted, setMounted] = useState(false);\n const menuRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n setMounted(true);\n }, []);\n\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (menuRef.current && !menuRef.current.contains(event.target as Node) &&\n triggerRef.current && !triggerRef.current.contains(event.target as Node)) {\n setIsOpen(false);\n }\n };\n\n if (isOpen) {\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }\n }, [isOpen]);\n\n useEffect(() => {\n if (isOpen && triggerRef.current) {\n const rect = triggerRef.current.getBoundingClientRect();\n const menuWidth = 224; // 14rem\n const menuHeight = 300; // Approximate max height\n const spacing = 8;\n\n let top = 0;\n let left = 0;\n\n switch (placement) {\n case 'top':\n top = rect.top - menuHeight - spacing;\n left = position === 'left' ? rect.left : rect.right - menuWidth;\n break;\n case 'bottom':\n top = rect.bottom + spacing;\n left = position === 'left' ? rect.left : rect.right - menuWidth;\n break;\n case 'left':\n top = rect.top;\n left = rect.left - menuWidth - spacing;\n break;\n case 'right':\n top = rect.top;\n left = rect.right + spacing;\n break;\n }\n\n setMenuPosition({ top, left });\n } else {\n setMenuPosition(null);\n }\n }, [isOpen, position, placement]);\n\n const handleItemClick = (item: ActionMenuItem) => {\n if (item.type === 'divider') return;\n if (!item.disabled) {\n item.onClick();\n setIsOpen(false);\n }\n };\n\n const defaultTrigger = (\n <button\n className=\"p-2 rounded-md hover:bg-[hsl(var(--accent))] transition-colors\"\n aria-label=\"Open menu\"\n >\n <svg className=\"w-5 h-5 text-[hsl(var(--muted-foreground))]\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 5v.01M12 12v.01M12 19v.01M12 6a1 1 0 110-2 1 1 0 010 2zm0 7a1 1 0 110-2 1 1 0 010 2zm0 7a1 1 0 110-2 1 1 0 010 2z\" />\n </svg>\n </button>\n );\n\n const menuBaseStyles = themeName === 'minimalistic'\n ? 'bg-black border-2 border-white'\n : 'bg-[hsl(var(--popover))] border border-[hsl(var(--border))] shadow-lg';\n\n const itemBaseStyles = themeName === 'minimalistic'\n ? 'text-white hover:bg-white hover:text-black transition-colors duration-200'\n : 'text-[hsl(var(--popover-foreground))] hover:bg-[hsl(var(--accent))] transition-colors';\n\n const menu = isOpen && mounted && menuPosition ? (\n <div\n ref={menuRef}\n className={`fixed w-56 rounded-md ${menuBaseStyles} z-[9999] max-h-[80vh] overflow-auto`}\n style={{\n minWidth: '14rem',\n top: `${menuPosition.top}px`,\n left: `${menuPosition.left}px`,\n }}\n >\n {items.map((item, index) => {\n if (item.type === 'divider') {\n return (\n <div\n key={index}\n className=\"my-1 border-t border-[hsl(var(--border))]\"\n />\n );\n }\n\n return (\n <button\n key={index}\n onClick={() => handleItemClick(item)}\n disabled={item.disabled}\n className={`w-full text-left px-4 py-2.5 flex items-center gap-3 ${itemBaseStyles} ${\n item.disabled ? 'opacity-50 cursor-not-allowed' : 'cursor-pointer'\n } ${\n item.variant === 'danger' ? 'text-[hsl(var(--destructive))] hover:bg-[hsl(var(--destructive))]/10' : ''\n }`}\n >\n {item.icon && <span className=\"flex-shrink-0\">{item.icon}</span>}\n <span className=\"flex-1\">{item.label}</span>\n </button>\n );\n })}\n </div>\n ) : null;\n\n return (\n <>\n <div className=\"relative inline-block\" ref={triggerRef}>\n <div onClick={() => setIsOpen(!isOpen)}>\n {trigger || defaultTrigger}\n </div>\n </div>\n {mounted && createPortal(menu, document.body)}\n </>\n );\n};\n","\"use client\";\n\nimport React from 'react';\n\nexport interface CardProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n className?: string;\n padding?: 'none' | 'sm' | 'md' | 'lg';\n hover?: boolean;\n}\n\nconst paddingClasses = {\n none: '',\n sm: 'p-4',\n md: 'p-6',\n lg: 'p-8',\n};\n\nexport const Card: React.FC<CardProps> = ({\n children,\n className = '',\n padding = 'md',\n hover = false,\n ...props\n}) => {\n\n const paddingClass = paddingClasses[padding];\n const hoverClass = hover\n ? 'hover:shadow-lg hover:border-[hsl(var(--ring))]/50 cursor-pointer transition-all duration-200 ease-in-out'\n : '';\n\n return (\n <div\n className={`bg-[hsl(var(--card))] text-[hsl(var(--card-foreground))] rounded-lg border border-[hsl(var(--border))] shadow-sm ${paddingClass} ${hoverClass} ${className}`}\n {...props}\n >\n {children}\n </div>\n );\n};\n","\"use client\";\n\nimport React from 'react';\n\nexport interface AlertProps {\n variant?: 'info' | 'success' | 'warning' | 'error';\n title?: string;\n children: React.ReactNode;\n onClose?: () => void;\n className?: string;\n}\n\nconst variantStyles = {\n info: 'bg-[hsl(var(--info))]/10 border-[hsl(var(--info))]/20 text-[hsl(var(--info))]',\n success: 'bg-[hsl(var(--success))]/10 border-[hsl(var(--success))]/20 text-[hsl(var(--success))]',\n warning: 'bg-[hsl(var(--warning))]/10 border-[hsl(var(--warning))]/20 text-[hsl(var(--warning))]',\n error: 'bg-[hsl(var(--destructive))]/10 border-[hsl(var(--destructive))]/20 text-[hsl(var(--destructive))]',\n};\n\nconst iconStyles = {\n info: 'text-[hsl(var(--info))]',\n success: 'text-[hsl(var(--success))]',\n warning: 'text-[hsl(var(--warning))]',\n error: 'text-[hsl(var(--destructive))]',\n};\n\nexport const Alert: React.FC<AlertProps> = ({\n variant = 'info',\n title,\n children,\n onClose,\n className = '',\n}) => {\n\n const variantClass = variantStyles[variant];\n const iconClass = iconStyles[variant];\n\n return (\n <div className={`rounded-[--radius] border p-4 ${variantClass} ${className}`} role=\"alert\">\n <div className=\"flex items-start gap-3\">\n <div className={`flex-shrink-0 ${iconClass}`}>\n {variant === 'info' && (\n <svg className=\"w-5 h-5\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fillRule=\"evenodd\" d=\"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a1 1 0 000 2v3a1 1 0 001 1h1a1 1 0 100-2v-3a1 1 0 00-1-1H9z\" clipRule=\"evenodd\" />\n </svg>\n )}\n {variant === 'success' && (\n <svg className=\"w-5 h-5\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fillRule=\"evenodd\" d=\"M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z\" clipRule=\"evenodd\" />\n </svg>\n )}\n {variant === 'warning' && (\n <svg className=\"w-5 h-5\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fillRule=\"evenodd\" d=\"M8.257 3.099c.765-1.36 2.722-1.36 3.486 0l5.58 9.92c.75 1.334-.213 2.98-1.742 2.98H4.42c-1.53 0-2.493-1.646-1.743-2.98l5.58-9.92zM11 13a1 1 0 11-2 0 1 1 0 012 0zm-1-8a1 1 0 00-1 1v3a1 1 0 002 0V6a1 1 0 00-1-1z\" clipRule=\"evenodd\" />\n </svg>\n )}\n {variant === 'error' && (\n <svg className=\"w-5 h-5\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fillRule=\"evenodd\" d=\"M10 18a8 8 0 100-16 8 8 0 000 16zM8.707 7.293a1 1 0 00-1.414 1.414L8.586 10l-1.293 1.293a1 1 0 101.414 1.414L10 11.414l1.293 1.293a1 1 0 001.414-1.414L11.414 10l1.293-1.293a1 1 0 00-1.414-1.414L10 8.586 8.707 7.293z\" clipRule=\"evenodd\" />\n </svg>\n )}\n </div>\n <div className=\"flex-1\">\n {title && <h3 className=\"font-semibold mb-1\">{title}</h3>}\n <div className=\"text-sm\">{children}</div>\n </div>\n {onClose && (\n <button\n onClick={onClose}\n className={`flex-shrink-0 ${iconClass} hover:opacity-70 transition-opacity`}\n aria-label=\"Close alert\"\n >\n <svg className=\"w-5 h-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n )}\n </div>\n </div>\n );\n};\n","\"use client\";\n\nimport React, { forwardRef } from 'react';\n\nexport interface CheckboxProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'type'> {\n label?: string;\n error?: string;\n}\n\nexport const Checkbox = forwardRef<HTMLInputElement, CheckboxProps>(\n ({ label, error, className = '', disabled, checked, ...props }, ref) => {\n\n return (\n <div className={className}>\n <label className=\"flex items-center gap-2 cursor-pointer group\">\n <div className=\"relative inline-flex items-center\">\n <input\n ref={ref}\n type=\"checkbox\"\n disabled={disabled}\n checked={checked}\n className=\"sr-only peer\"\n {...props}\n />\n <div className={`w-4 h-4 border-2 rounded-sm transition-all duration-200 flex items-center justify-center\n ${error\n ? 'border-[hsl(var(--destructive))]'\n : 'border-[hsl(var(--input))]'\n }\n ${disabled\n ? 'opacity-50 cursor-not-allowed bg-[hsl(var(--muted))]'\n : 'peer-hover:border-[hsl(var(--ring))]'\n }\n peer-checked:bg-[hsl(var(--primary))] peer-checked:border-[hsl(var(--primary))]\n peer-focus:ring-1 peer-focus:ring-[hsl(var(--ring))]/50\n `}>\n {/* Checkmark SVG */}\n <svg\n className={`w-3 h-3 text-white transition-opacity duration-200 ${\n checked ? 'opacity-100' : 'opacity-0'\n }`}\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M10 3L4.5 8.5L2 6\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </div>\n </div>\n {label && (\n <span className={`text-sm text-[hsl(var(--foreground))] ${disabled ? 'opacity-50 cursor-not-allowed' : ''}`}>\n {label}\n </span>\n )}\n </label>\n {error && <p className=\"mt-1 text-sm text-[hsl(var(--destructive))]\">{error}</p>}\n </div>\n );\n }\n);\n\nCheckbox.displayName = 'Checkbox';\n","\"use client\";\n\nimport React, { forwardRef } from 'react';\n\nexport interface ToggleProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'type' | 'size'> {\n label?: string;\n size?: 'sm' | 'md' | 'lg';\n}\n\nexport const Toggle = forwardRef<HTMLInputElement, ToggleProps>(\n ({ label, size = 'md', className = '', disabled, checked, ...props }, ref) => {\n\n // Use complete class strings for Tailwind\n const toggleClasses = {\n sm: {\n switch: 'w-9 h-5',\n thumb: 'w-4 h-4 peer-checked:translate-x-4',\n },\n md: {\n switch: 'w-11 h-6',\n thumb: 'w-5 h-5 peer-checked:translate-x-5',\n },\n lg: {\n switch: 'w-14 h-7',\n thumb: 'w-6 h-6 peer-checked:translate-x-7',\n },\n };\n\n const currentSize = toggleClasses[size];\n\n return (\n <label className={`inline-flex items-center gap-3 cursor-pointer ${disabled ? 'opacity-50 cursor-not-allowed' : ''} ${className}`}>\n <div className=\"relative\">\n <input\n ref={ref}\n type=\"checkbox\"\n className=\"sr-only peer\"\n disabled={disabled}\n checked={checked}\n {...props}\n />\n <div\n className={`${currentSize.switch} bg-[hsl(var(--input))] peer-focus:ring-1 peer-focus:ring-[hsl(var(--ring))]/50 rounded-full peer peer-checked:bg-[hsl(var(--primary))] transition-colors`}\n ></div>\n <div\n className={`${currentSize.thumb} bg-white rounded-full shadow-md absolute top-0.5 left-0.5 transition-transform`}\n ></div>\n </div>\n {label && (\n <span className=\"text-sm font-medium text-[hsl(var(--foreground))]\">\n {label}\n </span>\n )}\n </label>\n );\n }\n);\n\nToggle.displayName = 'Toggle';\n","\"use client\";\n\nimport React from 'react';\n\nexport interface BadgeProps {\n children: React.ReactNode;\n variant?: 'default' | 'primary' | 'success' | 'warning' | 'error' | 'info';\n size?: 'sm' | 'md' | 'lg';\n className?: string;\n}\n\nconst variantStyles = {\n default: 'bg-[hsl(var(--secondary))] text-[hsl(var(--secondary-foreground))]',\n primary: 'bg-[hsl(var(--primary))]/10 text-[hsl(var(--primary))]',\n success: 'bg-[hsl(var(--success))]/10 text-[hsl(var(--success))]',\n warning: 'bg-[hsl(var(--warning))]/10 text-[hsl(var(--warning))]',\n error: 'bg-[hsl(var(--destructive))]/10 text-[hsl(var(--destructive))]',\n info: 'bg-[hsl(var(--info))]/10 text-[hsl(var(--info))]',\n};\n\nconst sizeStyles = {\n sm: 'px-2 py-0.5 text-xs',\n md: 'px-2.5 py-1 text-sm',\n lg: 'px-3 py-1.5 text-base',\n};\n\nexport const Badge: React.FC<BadgeProps> = ({\n children,\n variant = 'default',\n size = 'md',\n className = '',\n}) => {\n\n const variantClass = variantStyles[variant];\n const sizeClass = sizeStyles[size];\n\n return (\n <span className={`inline-flex items-center font-medium rounded-full ${variantClass} ${sizeClass} ${className}`}>\n {children}\n </span>\n );\n};\n","\"use client\";\n\nimport React from 'react';\n\nexport interface SpinnerProps {\n size?: 'sm' | 'md' | 'lg' | 'xl';\n color?: 'primary' | 'secondary' | 'white';\n className?: string;\n}\n\nconst sizeClasses = {\n sm: 'w-4 h-4 border-2',\n md: 'w-8 h-8 border-2',\n lg: 'w-12 h-12 border-3',\n xl: 'w-16 h-16 border-4',\n};\n\nconst colorClasses = {\n primary: 'border-[hsl(var(--primary))] border-t-transparent',\n secondary: 'border-[hsl(var(--muted-foreground))] border-t-transparent',\n white: 'border-white border-t-transparent',\n};\n\nexport const Spinner: React.FC<SpinnerProps> = ({\n size = 'md',\n color = 'primary',\n className = '',\n}) => {\n\n const sizeClass = sizeClasses[size];\n const colorClass = colorClasses[color];\n\n return (\n <div\n className={`inline-block rounded-full animate-spin ${sizeClass} ${colorClass} ${className}`}\n role=\"status\"\n aria-label=\"Loading\"\n >\n <span className=\"sr-only\">Loading...</span>\n </div>\n );\n};\n","\"use client\";\n\nimport React, { useState } from 'react';\n\nexport interface Tab {\n label: string;\n content: React.ReactNode;\n disabled?: boolean;\n}\n\nexport interface TabsProps {\n tabs: Tab[];\n defaultIndex?: number;\n onChange?: (index: number) => void;\n className?: string;\n}\n\nexport const Tabs: React.FC<TabsProps> = ({\n tabs,\n defaultIndex = 0,\n onChange,\n className = '',\n}) => {\n const [activeIndex, setActiveIndex] = useState(defaultIndex);\n\n const handleTabClick = (index: number) => {\n if (tabs[index].disabled) return;\n setActiveIndex(index);\n onChange?.(index);\n };\n\n return (\n <div className={className}>\n {/* Tab Headers */}\n <div className=\"border-b border-[hsl(var(--border))] px-4\">\n <nav className=\"flex gap-4 -mb-px\" aria-label=\"Tabs\">\n {tabs.map((tab, index) => (\n <button\n key={index}\n onClick={() => handleTabClick(index)}\n disabled={tab.disabled}\n className={`py-3 border-b-2 font-medium text-sm transition-colors ${\n activeIndex === index\n ? 'border-[hsl(var(--primary))] text-[hsl(var(--foreground))]'\n : 'border-transparent text-[hsl(var(--muted-foreground))] hover:text-[hsl(var(--foreground))] hover:border-[hsl(var(--border))]'\n } ${tab.disabled ? 'opacity-50 cursor-not-allowed' : 'cursor-pointer'}`}\n aria-current={activeIndex === index ? 'page' : undefined}\n >\n {tab.label}\n </button>\n ))}\n </nav>\n </div>\n\n {/* Tab Content */}\n <div>\n {tabs[activeIndex]?.content}\n </div>\n </div>\n );\n};\n","\"use client\";\n\nimport React from 'react';\n\nexport interface Column<T = any> {\n key: string;\n title: string;\n render?: (value: any, row: T, index: number) => React.ReactNode;\n width?: string;\n}\n\nexport interface TableProps<T = any> {\n columns: Column<T>[];\n data: T[];\n keyField?: string;\n striped?: boolean;\n hoverable?: boolean;\n className?: string;\n responsive?: boolean; // Enable mobile card layout (default: true)\n}\n\nexport function Table<T extends Record<string, any>>({\n columns,\n data,\n keyField = 'id',\n striped = false,\n hoverable = true,\n className = '',\n responsive = true,\n}: TableProps<T>) {\n\n return (\n <div className={className}>\n {/* Desktop Table View */}\n <div className={`${responsive ? 'hidden md:block' : ''} overflow-x-auto`}>\n <table className=\"w-full text-left\">\n <thead className=\"bg-[hsl(var(--muted))] border-b border-[hsl(var(--border))]\">\n <tr>\n {columns.map((column, colIndex) => {\n const isLast = colIndex === columns.length - 1;\n return (\n <th\n key={column.key}\n className={\n isLast\n ? 'px-6 py-3 text-xs font-medium text-[hsl(var(--muted-foreground))] uppercase tracking-wider relative'\n : 'px-6 py-3 text-xs font-medium text-[hsl(var(--muted-foreground))] uppercase tracking-wider'\n }\n style={{ width: column.width }}\n >\n {column.title}\n </th>\n );\n })}\n </tr>\n </thead>\n <tbody className=\"bg-[hsl(var(--card))] divide-y divide-[hsl(var(--border))]\">\n {data.map((row, rowIndex) => {\n const rowClasses = [\n striped && rowIndex % 2 === 1 ? 'bg-[hsl(var(--muted))]/50' : '',\n hoverable ? 'hover:bg-[hsl(var(--muted))] transition-colors' : ''\n ].filter(Boolean).join(' ');\n\n return (\n <tr\n key={row[keyField] || rowIndex}\n className={rowClasses}\n >\n {columns.map((column, colIndex) => {\n const isLast = colIndex === columns.length - 1;\n return (\n <td\n key={column.key}\n className={\n isLast\n ? 'px-6 py-4 text-sm text-[hsl(var(--foreground))] overflow-visible'\n : 'px-6 py-4 text-sm text-[hsl(var(--foreground))]'\n }\n >\n {column.render\n ? column.render(row[column.key], row, rowIndex)\n : row[column.key]}\n </td>\n );\n })}\n </tr>\n );\n })}\n </tbody>\n </table>\n {data.length === 0 && (\n <div className=\"text-center py-8 text-[hsl(var(--muted-foreground))]\">\n No data available\n </div>\n )}\n </div>\n\n {/* Mobile Card View */}\n {responsive && (\n <div className=\"md:hidden space-y-3\">\n {data.map((row, rowIndex) => {\n const cardClasses = [\n 'bg-[hsl(var(--card))] border border-[hsl(var(--border))] rounded-[--radius] p-4 shadow-sm',\n hoverable ? 'hover:shadow-md transition-shadow' : '',\n 'relative isolate' // Ensure cards are isolated layers\n ].filter(Boolean).join(' ');\n\n return (\n <div\n key={row[keyField] || rowIndex}\n className={cardClasses}\n >\n {columns.map((column) => (\n <div\n key={column.key}\n className=\"flex justify-between items-start py-2 border-b border-[hsl(var(--border))]/50 last:border-b-0\"\n >\n <span className=\"text-xs font-medium text-[hsl(var(--muted-foreground))] uppercase tracking-wider flex-shrink-0 mr-4\">\n {column.title}\n </span>\n <span className=\"text-sm text-[hsl(var(--foreground))] text-right\">\n {column.render\n ? column.render(row[column.key], row, rowIndex)\n : row[column.key]}\n </span>\n </div>\n ))}\n </div>\n );\n })}\n {data.length === 0 && (\n <div className=\"text-center py-8 text-[hsl(var(--muted-foreground))]\">\n No data available\n </div>\n )}\n </div>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport React from 'react';\n\nexport interface PaginationProps {\n currentPage: number;\n totalPages: number;\n onPageChange: (page: number) => void;\n siblingCount?: number;\n className?: string;\n}\n\nexport const Pagination: React.FC<PaginationProps> = ({\n currentPage,\n totalPages,\n onPageChange,\n siblingCount = 1,\n className = '',\n}) => {\n\n const range = (start: number, end: number) => {\n const length = end - start + 1;\n return Array.from({ length }, (_, idx) => idx + start);\n };\n\n const paginationRange = () => {\n const totalPageNumbers = siblingCount + 5;\n\n if (totalPageNumbers >= totalPages) {\n return range(1, totalPages);\n }\n\n const leftSiblingIndex = Math.max(currentPage - siblingCount, 1);\n const rightSiblingIndex = Math.min(currentPage + siblingCount, totalPages);\n\n const shouldShowLeftDots = leftSiblingIndex > 2;\n const shouldShowRightDots = rightSiblingIndex < totalPages - 2;\n\n const firstPageIndex = 1;\n const lastPageIndex = totalPages;\n\n if (!shouldShowLeftDots && shouldShowRightDots) {\n const leftItemCount = 3 + 2 * siblingCount;\n const leftRange = range(1, leftItemCount);\n return [...leftRange, '...', totalPages];\n }\n\n if (shouldShowLeftDots && !shouldShowRightDots) {\n const rightItemCount = 3 + 2 * siblingCount;\n const rightRange = range(totalPages - rightItemCount + 1, totalPages);\n return [firstPageIndex, '...', ...rightRange];\n }\n\n if (shouldShowLeftDots && shouldShowRightDots) {\n const middleRange = range(leftSiblingIndex, rightSiblingIndex);\n return [firstPageIndex, '...', ...middleRange, '...', lastPageIndex];\n }\n\n return range(1, totalPages);\n };\n\n const pages = paginationRange();\n\n return (\n <nav className={`flex items-center gap-1 ${className}`} aria-label=\"Pagination\">\n {/* Previous Button */}\n <button\n onClick={() => onPageChange(currentPage - 1)}\n disabled={currentPage === 1}\n className=\"px-3 py-2 rounded-md text-sm font-medium text-[hsl(var(--foreground))] hover:bg-[hsl(var(--accent))] disabled:opacity-50 disabled:pointer-events-none transition-colors\"\n aria-label=\"Previous page\"\n >\n Previous\n </button>\n\n {/* Page Numbers */}\n {pages.map((page, index) => {\n if (page === '...') {\n return (\n <span\n key={`dots-${index}`}\n className=\"px-3 py-2 text-[hsl(var(--muted-foreground))]\"\n >\n ...\n </span>\n );\n }\n\n return (\n <button\n key={page}\n onClick={() => onPageChange(page as number)}\n className={`px-3 py-2 rounded-md text-sm font-medium transition-colors ${\n currentPage === page\n ? 'bg-[hsl(var(--primary))] text-[hsl(var(--primary-foreground))]'\n : 'text-[hsl(var(--foreground))] hover:bg-[hsl(var(--accent))]'\n }`}\n aria-label={`Page ${page}`}\n aria-current={currentPage === page ? 'page' : undefined}\n >\n {page}\n </button>\n );\n })}\n\n {/* Next Button */}\n <button\n onClick={() => onPageChange(currentPage + 1)}\n disabled={currentPage === totalPages}\n className=\"px-3 py-2 rounded-md text-sm font-medium text-[hsl(var(--foreground))] hover:bg-[hsl(var(--accent))] disabled:opacity-50 disabled:pointer-events-none transition-colors\"\n aria-label=\"Next page\"\n >\n Next\n </button>\n </nav>\n );\n};\n","\"use client\";\n\nimport React, { useState, useRef, useEffect } from 'react';\nimport { createPortal } from 'react-dom';\n\nexport interface DatePickerProps {\n label?: string;\n error?: string;\n helperText?: string;\n value?: Date;\n onChange?: (date: Date) => void;\n minDate?: Date;\n maxDate?: Date;\n disabled?: boolean;\n className?: string;\n placeholder?: string;\n}\n\nconst DAYS = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];\nconst MONTHS = [\n 'January', 'February', 'March', 'April', 'May', 'June',\n 'July', 'August', 'September', 'October', 'November', 'December'\n];\n\nexport const DatePicker: React.FC<DatePickerProps> = ({\n label,\n error,\n helperText,\n value,\n onChange,\n minDate,\n maxDate,\n disabled,\n className = '',\n placeholder = 'Select date...',\n}) => {\n const [isOpen, setIsOpen] = useState(false);\n const [viewDate, setViewDate] = useState(value || new Date());\n const [mounted, setMounted] = useState(false);\n const [calendarPosition, setCalendarPosition] = useState<{ top: number; left: number } | null>(null);\n const inputRef = useRef<HTMLDivElement>(null);\n const calendarRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n setMounted(true);\n }, []);\n\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (calendarRef.current && !calendarRef.current.contains(event.target as Node) &&\n inputRef.current && !inputRef.current.contains(event.target as Node)) {\n setIsOpen(false);\n }\n };\n\n if (isOpen) {\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }\n }, [isOpen]);\n\n useEffect(() => {\n if (isOpen && inputRef.current) {\n const rect = inputRef.current.getBoundingClientRect();\n setCalendarPosition({\n top: rect.bottom + 8,\n left: rect.left,\n });\n } else {\n setCalendarPosition(null);\n }\n }, [isOpen]);\n\n const year = viewDate.getFullYear();\n const month = viewDate.getMonth();\n\n const firstDayOfMonth = new Date(year, month, 1).getDay();\n const daysInMonth = new Date(year, month + 1, 0).getDate();\n const daysInPrevMonth = new Date(year, month, 0).getDate();\n\n const calendarDays: Date[] = [];\n\n for (let i = firstDayOfMonth - 1; i >= 0; i--) {\n calendarDays.push(new Date(year, month - 1, daysInPrevMonth - i));\n }\n\n for (let i = 1; i <= daysInMonth; i++) {\n calendarDays.push(new Date(year, month, i));\n }\n\n const remainingDays = 42 - calendarDays.length;\n for (let i = 1; i <= remainingDays; i++) {\n calendarDays.push(new Date(year, month + 1, i));\n }\n\n const isSameDay = (date1: Date, date2: Date) => {\n return date1.getDate() === date2.getDate() &&\n date1.getMonth() === date2.getMonth() &&\n date1.getFullYear() === date2.getFullYear();\n };\n\n const isToday = (date: Date) => {\n return isSameDay(date, new Date());\n };\n\n const isSelected = (date: Date) => {\n return value && isSameDay(date, value);\n };\n\n const isCurrentMonth = (date: Date) => {\n return date.getMonth() === month;\n };\n\n const isDisabled = (date: Date) => {\n if (minDate && date < minDate) return true;\n if (maxDate && date > maxDate) return true;\n return false;\n };\n\n const handleDateClick = (date: Date) => {\n if (isDisabled(date)) return;\n onChange?.(date);\n setIsOpen(false);\n };\n\n const handlePrevMonth = () => {\n setViewDate(new Date(year, month - 1, 1));\n };\n\n const handleNextMonth = () => {\n setViewDate(new Date(year, month + 1, 1));\n };\n\n const handleToday = () => {\n const today = new Date();\n setViewDate(today);\n onChange?.(today);\n setIsOpen(false);\n };\n\n const formatDate = (date?: Date) => {\n if (!date) return '';\n return date.toLocaleDateString('en-US', {\n month: 'short',\n day: 'numeric',\n year: 'numeric'\n });\n };\n\n const baseStyles = 'w-full appearance-none rounded-md border border-[hsl(var(--input))] bg-transparent text-[hsl(var(--foreground))] px-4 py-2.5 text-sm transition-colors duration-150 focus:outline-none focus:ring-1 focus:ring-[hsl(var(--ring))]/50 focus:border-[hsl(var(--ring))] hover:border-[hsl(var(--muted-foreground))] cursor-pointer';\n const errorStyles = error ? 'border-[hsl(var(--destructive))] focus:ring-[hsl(var(--destructive))]/50' : '';\n const disabledStyles = disabled ? 'opacity-50 cursor-not-allowed bg-[hsl(var(--muted))]' : '';\n\n const calendar = isOpen && mounted && calendarPosition ? (\n <div\n ref={calendarRef}\n className=\"fixed z-[9999] bg-[hsl(var(--popover))] rounded-md border border-[hsl(var(--border))] shadow-lg p-4\"\n style={{\n top: `${calendarPosition.top}px`,\n left: `${calendarPosition.left}px`,\n minWidth: '320px',\n }}\n >\n {/* Header */}\n <div className=\"flex items-center justify-between mb-4\">\n <button\n onClick={handlePrevMonth}\n className=\"p-2 hover:bg-[hsl(var(--accent))] rounded-md transition-colors\"\n aria-label=\"Previous month\"\n >\n <svg className=\"w-5 h-5 text-[hsl(var(--muted-foreground))]\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 19l-7-7 7-7\" />\n </svg>\n </button>\n\n <div className=\"flex items-center gap-2\">\n <h2 className=\"text-base font-semibold text-[hsl(var(--foreground))]\">\n {MONTHS[month]} {year}\n </h2>\n <button\n onClick={handleToday}\n className=\"px-2 py-1 text-xs bg-[hsl(var(--primary))] text-[hsl(var(--primary-foreground))] rounded-md hover:bg-[hsl(var(--primary))]/90 transition-colors\"\n >\n Today\n </button>\n </div>\n\n <button\n onClick={handleNextMonth}\n className=\"p-2 hover:bg-[hsl(var(--accent))] rounded-md transition-colors\"\n aria-label=\"Next month\"\n >\n <svg className=\"w-5 h-5 text-[hsl(var(--muted-foreground))]\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 5l7 7-7 7\" />\n </svg>\n </button>\n </div>\n\n {/* Day headers */}\n <div className=\"grid grid-cols-7 gap-1 mb-2\">\n {DAYS.map(day => (\n <div key={day} className=\"text-center text-xs font-semibold text-[hsl(var(--muted-foreground))] py-1\">\n {day}\n </div>\n ))}\n </div>\n\n {/* Calendar grid */}\n <div className=\"grid grid-cols-7 gap-1\">\n {calendarDays.map((date, index) => {\n const isCurrentMonthDay = isCurrentMonth(date);\n const isTodayDay = isToday(date);\n const isSelectedDay = isSelected(date);\n const isDisabledDay = isDisabled(date);\n\n return (\n <button\n key={index}\n onClick={() => handleDateClick(date)}\n disabled={isDisabledDay}\n className={`\n aspect-square p-1 rounded-md text-sm font-medium transition-all\n ${!isCurrentMonthDay ? 'text-[hsl(var(--muted-foreground))]/50' : 'text-[hsl(var(--foreground))]'}\n ${isTodayDay && !isSelectedDay ? 'bg-[hsl(var(--accent))] text-[hsl(var(--primary))] font-bold' : ''}\n ${isSelectedDay ? 'bg-[hsl(var(--primary))] text-[hsl(var(--primary-foreground))] hover:bg-[hsl(var(--primary))]/90' : ''}\n ${!isSelectedDay && !isDisabledDay ? 'hover:bg-[hsl(var(--accent))]' : ''}\n ${isDisabledDay ? 'opacity-30 cursor-not-allowed' : 'cursor-pointer'}\n `}\n >\n {date.getDate()}\n </button>\n );\n })}\n </div>\n </div>\n ) : null;\n\n return (\n <div className={className}>\n {label && (\n <label className=\"block text-sm font-medium text-[hsl(var(--foreground))] mb-1.5\">\n {label}\n </label>\n )}\n <div\n ref={inputRef}\n onClick={() => !disabled && setIsOpen(!isOpen)}\n className={`${baseStyles} ${errorStyles} ${disabledStyles} flex items-center justify-between`.trim()}\n >\n <span className={!value ? 'text-[hsl(var(--muted-foreground))]' : ''}>\n {value ? formatDate(value) : placeholder}\n </span>\n <svg className=\"w-5 h-5 text-[hsl(var(--muted-foreground))]\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z\" />\n </svg>\n </div>\n {error && <p className=\"mt-1.5 text-sm text-[hsl(var(--destructive))]\">{error}</p>}\n {helperText && !error && <p className=\"mt-1.5 text-sm text-[hsl(var(--muted-foreground))]\">{helperText}</p>}\n {mounted && createPortal(calendar, document.body)}\n </div>\n );\n};\n\nDatePicker.displayName = 'DatePicker';\n","\"use client\";\n\nimport React, { forwardRef } from 'react';\n\nexport interface TimePickerProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'type'> {\n label?: string;\n error?: string;\n helperText?: string;\n}\n\nexport const TimePicker = forwardRef<HTMLInputElement, TimePickerProps>(\n ({ label, error, helperText, className = '', disabled, ...props }, ref) => {\n\n const baseStyles = 'w-full appearance-none rounded-md border border-[hsl(var(--input))] bg-transparent text-[hsl(var(--foreground))] px-3 py-2.5 text-sm transition-colors duration-150 focus:outline-none focus:ring-1 focus:ring-[hsl(var(--ring))]/50 focus:border-[hsl(var(--ring))] hover:border-[hsl(var(--muted-foreground))]';\n const errorStyles = error ? 'border-[hsl(var(--destructive))] focus:ring-[hsl(var(--destructive))]/50' : '';\n const disabledStyles = disabled ? 'opacity-50 cursor-not-allowed bg-[hsl(var(--muted))]' : '';\n\n return (\n <div className={className}>\n {label && (\n <label className=\"block text-sm font-medium text-[hsl(var(--foreground))] mb-1.5\">\n {label}\n </label>\n )}\n <input\n ref={ref}\n type=\"time\"\n disabled={disabled}\n className={`${baseStyles} ${errorStyles} ${disabledStyles}`.trim()}\n {...props}\n />\n {error && <p className=\"mt-1.5 text-sm text-[hsl(var(--destructive))]\">{error}</p>}\n {helperText && !error && <p className=\"mt-1.5 text-sm text-[hsl(var(--muted-foreground))]\">{helperText}</p>}\n </div>\n );\n }\n);\n\nTimePicker.displayName = 'TimePicker';\n","\"use client\";\n\nimport React, { useState, useRef, useEffect } from 'react';\nimport { createPortal } from 'react-dom';\n\nexport interface DateTimePickerProps {\n label?: string;\n error?: string;\n helperText?: string;\n value?: Date;\n onChange?: (date: Date) => void;\n minDate?: Date;\n maxDate?: Date;\n disabled?: boolean;\n className?: string;\n placeholder?: string;\n}\n\nconst DAYS = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];\nconst MONTHS = [\n 'January', 'February', 'March', 'April', 'May', 'June',\n 'July', 'August', 'September', 'October', 'November', 'December'\n];\nconst SHORT_MONTHS = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n\nexport const DateTimePicker: React.FC<DateTimePickerProps> = ({\n label,\n error,\n helperText,\n value,\n onChange,\n minDate,\n maxDate,\n disabled,\n className = '',\n placeholder = 'Select date and time...',\n}) => {\n const [isOpen, setIsOpen] = useState(false);\n const [viewDate, setViewDate] = useState(value || new Date());\n const [selectedTime, setSelectedTime] = useState(\n value ? { hours: value.getHours(), minutes: value.getMinutes() } : { hours: 12, minutes: 0 }\n );\n const [mounted, setMounted] = useState(false);\n const [pickerPosition, setPickerPosition] = useState<{ top: number; left: number } | null>(null);\n const inputRef = useRef<HTMLDivElement>(null);\n const pickerRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n setMounted(true);\n }, []);\n\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (pickerRef.current && !pickerRef.current.contains(event.target as Node) &&\n inputRef.current && !inputRef.current.contains(event.target as Node)) {\n setIsOpen(false);\n }\n };\n\n if (isOpen) {\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }\n }, [isOpen]);\n\n useEffect(() => {\n if (isOpen && inputRef.current) {\n const rect = inputRef.current.getBoundingClientRect();\n setPickerPosition({\n top: rect.bottom + 8,\n left: rect.left,\n });\n } else {\n setPickerPosition(null);\n }\n }, [isOpen]);\n\n const year = viewDate.getFullYear();\n const month = viewDate.getMonth();\n\n const firstDayOfMonth = new Date(year, month, 1).getDay();\n const daysInMonth = new Date(year, month + 1, 0).getDate();\n const daysInPrevMonth = new Date(year, month, 0).getDate();\n\n const calendarDays: Date[] = [];\n\n for (let i = firstDayOfMonth - 1; i >= 0; i--) {\n calendarDays.push(new Date(year, month - 1, daysInPrevMonth - i));\n }\n\n for (let i = 1; i <= daysInMonth; i++) {\n calendarDays.push(new Date(year, month, i));\n }\n\n const remainingDays = 42 - calendarDays.length;\n for (let i = 1; i <= remainingDays; i++) {\n calendarDays.push(new Date(year, month + 1, i));\n }\n\n const isSameDay = (date1: Date, date2: Date) => {\n return date1.getDate() === date2.getDate() &&\n date1.getMonth() === date2.getMonth() &&\n date1.getFullYear() === date2.getFullYear();\n };\n\n const isToday = (date: Date) => {\n return isSameDay(date, new Date());\n };\n\n const isSelected = (date: Date) => {\n return value && isSameDay(date, value);\n };\n\n const isCurrentMonth = (date: Date) => {\n return date.getMonth() === month;\n };\n\n const isDisabled = (date: Date) => {\n if (minDate && date < minDate) return true;\n if (maxDate && date > maxDate) return true;\n return false;\n };\n\n const handleDateClick = (date: Date) => {\n if (isDisabled(date)) return;\n const newDateTime = new Date(\n date.getFullYear(),\n date.getMonth(),\n date.getDate(),\n selectedTime.hours,\n selectedTime.minutes\n );\n onChange?.(newDateTime);\n };\n\n const handleTimeChange = (hours: number, minutes: number) => {\n setSelectedTime({ hours, minutes });\n if (value) {\n const newDateTime = new Date(\n value.getFullYear(),\n value.getMonth(),\n value.getDate(),\n hours,\n minutes\n );\n onChange?.(newDateTime);\n }\n };\n\n const handleDone = () => {\n if (value) {\n setIsOpen(false);\n }\n };\n\n const handlePrevMonth = () => {\n setViewDate(new Date(year, month - 1, 1));\n };\n\n const handleNextMonth = () => {\n setViewDate(new Date(year, month + 1, 1));\n };\n\n const handleToday = () => {\n const now = new Date();\n setViewDate(now);\n setSelectedTime({ hours: now.getHours(), minutes: now.getMinutes() });\n onChange?.(now);\n };\n\n // Consistent date formatting that doesn't depend on locale\n const formatDateTime = (date?: Date) => {\n if (!date) return '';\n const monthStr = SHORT_MONTHS[date.getMonth()];\n const day = date.getDate();\n const yearNum = date.getFullYear();\n const hours = date.getHours();\n const minutes = date.getMinutes();\n const period = hours >= 12 ? 'PM' : 'AM';\n const displayHours = hours % 12 || 12;\n const displayMinutes = minutes.toString().padStart(2, '0');\n return `${monthStr} ${day}, ${yearNum}, ${displayHours}:${displayMinutes} ${period}`;\n };\n\n const formatTime = (hours: number, minutes: number) => {\n const period = hours >= 12 ? 'PM' : 'AM';\n const displayHours = hours % 12 || 12;\n const displayMinutes = minutes.toString().padStart(2, '0');\n return `${displayHours}:${displayMinutes} ${period}`;\n };\n\n const baseStyles = 'w-full appearance-none rounded-md border border-[hsl(var(--input))] bg-transparent text-[hsl(var(--foreground))] px-4 py-2.5 text-sm transition-colors duration-150 focus:outline-none focus:ring-1 focus:ring-[hsl(var(--ring))]/50 focus:border-[hsl(var(--ring))] hover:border-[hsl(var(--muted-foreground))] cursor-pointer';\n const errorStyles = error ? 'border-[hsl(var(--destructive))] focus:ring-[hsl(var(--destructive))]/50' : '';\n const disabledStyles = disabled ? 'opacity-50 cursor-not-allowed bg-[hsl(var(--muted))]' : '';\n\n const picker = isOpen && mounted && pickerPosition ? (\n <div\n ref={pickerRef}\n className=\"fixed z-[9999] bg-[hsl(var(--popover))] rounded-md border border-[hsl(var(--border))] shadow-lg p-4\"\n style={{\n top: `${pickerPosition.top}px`,\n left: `${pickerPosition.left}px`,\n minWidth: '360px',\n }}\n >\n {/* Calendar Header */}\n <div className=\"flex items-center justify-between mb-4\">\n <button\n onClick={handlePrevMonth}\n className=\"p-2 hover:bg-[hsl(var(--accent))] rounded-md transition-colors\"\n aria-label=\"Previous month\"\n >\n <svg className=\"w-5 h-5 text-[hsl(var(--muted-foreground))]\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 19l-7-7 7-7\" />\n </svg>\n </button>\n\n <div className=\"flex items-center gap-2\">\n <h2 className=\"text-base font-semibold text-[hsl(var(--foreground))]\">\n {MONTHS[month]} {year}\n </h2>\n <button\n onClick={handleToday}\n className=\"px-2 py-1 text-xs bg-[hsl(var(--primary))] text-[hsl(var(--primary-foreground))] rounded-md hover:bg-[hsl(var(--primary))]/90 transition-colors\"\n >\n Now\n </button>\n </div>\n\n <button\n onClick={handleNextMonth}\n className=\"p-2 hover:bg-[hsl(var(--accent))] rounded-md transition-colors\"\n aria-label=\"Next month\"\n >\n <svg className=\"w-5 h-5 text-[hsl(var(--muted-foreground))]\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 5l7 7-7 7\" />\n </svg>\n </button>\n </div>\n\n {/* Day headers */}\n <div className=\"grid grid-cols-7 gap-1 mb-2\">\n {DAYS.map(day => (\n <div key={day} className=\"text-center text-xs font-semibold text-[hsl(var(--muted-foreground))] py-1\">\n {day}\n </div>\n ))}\n </div>\n\n {/* Calendar grid */}\n <div className=\"grid grid-cols-7 gap-1 mb-4\">\n {calendarDays.map((date, index) => {\n const isCurrentMonthDay = isCurrentMonth(date);\n const isTodayDay = isToday(date);\n const isSelectedDay = isSelected(date);\n const isDisabledDay = isDisabled(date);\n\n return (\n <button\n key={index}\n onClick={() => handleDateClick(date)}\n disabled={isDisabledDay}\n className={`\n aspect-square p-1 rounded-md text-sm font-medium transition-all\n ${!isCurrentMonthDay ? 'text-[hsl(var(--muted-foreground))]/50' : 'text-[hsl(var(--foreground))]'}\n ${isTodayDay && !isSelectedDay ? 'bg-[hsl(var(--accent))] text-[hsl(var(--primary))] font-bold' : ''}\n ${isSelectedDay ? 'bg-[hsl(var(--primary))] text-[hsl(var(--primary-foreground))] hover:bg-[hsl(var(--primary))]/90' : ''}\n ${!isSelectedDay && !isDisabledDay ? 'hover:bg-[hsl(var(--accent))]' : ''}\n ${isDisabledDay ? 'opacity-30 cursor-not-allowed' : 'cursor-pointer'}\n `}\n >\n {date.getDate()}\n </button>\n );\n })}\n </div>\n\n {/* Time Picker */}\n <div className=\"border-t border-[hsl(var(--border))] pt-4\">\n <div className=\"flex items-center justify-center gap-4 mb-4\">\n {/* Hours */}\n <div className=\"flex flex-col items-center\">\n <label className=\"text-xs font-semibold text-[hsl(var(--muted-foreground))] mb-2\">Hour</label>\n <div className=\"flex flex-col items-center gap-1\">\n <button\n type=\"button\"\n onClick={() => handleTimeChange((selectedTime.hours + 1) % 24, selectedTime.minutes)}\n className=\"p-1 hover:bg-[hsl(var(--accent))] rounded transition-colors\"\n >\n <svg className=\"w-4 h-4 text-[hsl(var(--muted-foreground))]\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 15l7-7 7 7\" />\n </svg>\n </button>\n <input\n type=\"number\"\n min=\"0\"\n max=\"23\"\n value={selectedTime.hours}\n onChange={(e) => {\n const val = parseInt(e.target.value);\n if (!isNaN(val) && val >= 0 && val <= 23) {\n handleTimeChange(val, selectedTime.minutes);\n }\n }}\n className=\"w-16 px-2 py-2 text-center border border-[hsl(var(--input))] rounded-md bg-transparent text-[hsl(var(--foreground))] focus:outline-none focus:ring-1 focus:ring-[hsl(var(--ring))]/50 text-lg font-semibold [appearance:textfield] [&::-webkit-outer-spin-button]:appearance-none [&::-webkit-inner-spin-button]:appearance-none\"\n />\n <button\n type=\"button\"\n onClick={() => handleTimeChange((selectedTime.hours - 1 + 24) % 24, selectedTime.minutes)}\n className=\"p-1 hover:bg-[hsl(var(--accent))] rounded transition-colors\"\n >\n <svg className=\"w-4 h-4 text-[hsl(var(--muted-foreground))]\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 9l-7 7-7-7\" />\n </svg>\n </button>\n </div>\n </div>\n\n <span className=\"text-2xl font-bold text-[hsl(var(--muted-foreground))] mt-8\">:</span>\n\n {/* Minutes */}\n <div className=\"flex flex-col items-center\">\n <label className=\"text-xs font-semibold text-[hsl(var(--muted-foreground))] mb-2\">Minute</label>\n <div className=\"flex flex-col items-center gap-1\">\n <button\n type=\"button\"\n onClick={() => handleTimeChange(selectedTime.hours, (selectedTime.minutes + 1) % 60)}\n className=\"p-1 hover:bg-[hsl(var(--accent))] rounded transition-colors\"\n >\n <svg className=\"w-4 h-4 text-[hsl(var(--muted-foreground))]\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 15l7-7 7 7\" />\n </svg>\n </button>\n <input\n type=\"number\"\n min=\"0\"\n max=\"59\"\n value={selectedTime.minutes}\n onChange={(e) => {\n const val = parseInt(e.target.value);\n if (!isNaN(val) && val >= 0 && val <= 59) {\n handleTimeChange(selectedTime.hours, val);\n }\n }}\n className=\"w-16 px-2 py-2 text-center border border-[hsl(var(--input))] rounded-md bg-transparent text-[hsl(var(--foreground))] focus:outline-none focus:ring-1 focus:ring-[hsl(var(--ring))]/50 text-lg font-semibold [appearance:textfield] [&::-webkit-outer-spin-button]:appearance-none [&::-webkit-inner-spin-button]:appearance-none\"\n />\n <button\n type=\"button\"\n onClick={() => handleTimeChange(selectedTime.hours, (selectedTime.minutes - 1 + 60) % 60)}\n className=\"p-1 hover:bg-[hsl(var(--accent))] rounded transition-colors\"\n >\n <svg className=\"w-4 h-4 text-[hsl(var(--muted-foreground))]\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 9l-7 7-7-7\" />\n </svg>\n </button>\n </div>\n </div>\n </div>\n <div className=\"text-center text-sm text-[hsl(var(--muted-foreground))] mb-4\">\n {formatTime(selectedTime.hours, selectedTime.minutes)}\n </div>\n <button\n onClick={handleDone}\n className=\"w-full px-4 py-2 bg-[hsl(var(--primary))] text-[hsl(var(--primary-foreground))] rounded-md hover:bg-[hsl(var(--primary))]/90 transition-colors font-medium\"\n >\n Done\n </button>\n </div>\n </div>\n ) : null;\n\n return (\n <div className={className}>\n {label && (\n <label className=\"block text-sm font-medium text-[hsl(var(--foreground))] mb-1.5\">\n {label}\n </label>\n )}\n <div\n ref={inputRef}\n onClick={() => !disabled && setIsOpen(!isOpen)}\n className={`${baseStyles} ${errorStyles} ${disabledStyles} flex items-center justify-between`.trim()}\n >\n <span className={!value ? 'text-[hsl(var(--muted-foreground))]' : ''}>\n {value ? formatDateTime(value) : placeholder}\n </span>\n <svg className=\"w-5 h-5 text-[hsl(var(--muted-foreground))]\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z\" />\n </svg>\n </div>\n {error && <p className=\"mt-1.5 text-sm text-[hsl(var(--destructive))]\">{error}</p>}\n {helperText && !error && <p className=\"mt-1.5 text-sm text-[hsl(var(--muted-foreground))]\">{helperText}</p>}\n {mounted && createPortal(picker, document.body)}\n </div>\n );\n};\n\nDateTimePicker.displayName = 'DateTimePicker';\n","\"use client\";\n\nimport React, { useState } from 'react';\n\nexport interface CalendarProps {\n value?: Date;\n onChange?: (date: Date) => void;\n minDate?: Date;\n maxDate?: Date;\n className?: string;\n}\n\nconst DAYS = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];\nconst MONTHS = [\n 'January', 'February', 'March', 'April', 'May', 'June',\n 'July', 'August', 'September', 'October', 'November', 'December'\n];\n\nexport const Calendar: React.FC<CalendarProps> = ({\n value,\n onChange,\n minDate,\n maxDate,\n className = '',\n}) => {\n const [currentDate, setCurrentDate] = useState(value || new Date());\n const [viewDate, setViewDate] = useState(value || new Date());\n\n const year = viewDate.getFullYear();\n const month = viewDate.getMonth();\n\n // Get first day of month and number of days\n const firstDayOfMonth = new Date(year, month, 1).getDay();\n const daysInMonth = new Date(year, month + 1, 0).getDate();\n const daysInPrevMonth = new Date(year, month, 0).getDate();\n\n // Build calendar grid\n const calendarDays: (Date | null)[] = [];\n\n // Previous month days\n for (let i = firstDayOfMonth - 1; i >= 0; i--) {\n calendarDays.push(new Date(year, month - 1, daysInPrevMonth - i));\n }\n\n // Current month days\n for (let i = 1; i <= daysInMonth; i++) {\n calendarDays.push(new Date(year, month, i));\n }\n\n // Next month days to fill grid\n const remainingDays = 42 - calendarDays.length; // 6 rows * 7 days\n for (let i = 1; i <= remainingDays; i++) {\n calendarDays.push(new Date(year, month + 1, i));\n }\n\n const isSameDay = (date1: Date, date2: Date) => {\n return date1.getDate() === date2.getDate() &&\n date1.getMonth() === date2.getMonth() &&\n date1.getFullYear() === date2.getFullYear();\n };\n\n const isToday = (date: Date) => {\n return isSameDay(date, new Date());\n };\n\n const isSelected = (date: Date) => {\n return value && isSameDay(date, value);\n };\n\n const isCurrentMonth = (date: Date) => {\n return date.getMonth() === month;\n };\n\n const isDisabled = (date: Date) => {\n if (minDate && date < minDate) return true;\n if (maxDate && date > maxDate) return true;\n return false;\n };\n\n const handleDateClick = (date: Date) => {\n if (isDisabled(date)) return;\n setCurrentDate(date);\n onChange?.(date);\n };\n\n const handlePrevMonth = () => {\n setViewDate(new Date(year, month - 1, 1));\n };\n\n const handleNextMonth = () => {\n setViewDate(new Date(year, month + 1, 1));\n };\n\n const handleToday = () => {\n const today = new Date();\n setViewDate(today);\n setCurrentDate(today);\n onChange?.(today);\n };\n\n return (\n <div className={`bg-[hsl(var(--card))] rounded-md border border-[hsl(var(--border))] p-4 ${className}`}>\n {/* Header with month/year and navigation */}\n <div className=\"flex items-center justify-between mb-4\">\n <button\n onClick={handlePrevMonth}\n className=\"p-2 hover:bg-[hsl(var(--accent))] rounded-md transition-colors\"\n aria-label=\"Previous month\"\n >\n <svg className=\"w-5 h-5 text-[hsl(var(--muted-foreground))]\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 19l-7-7 7-7\" />\n </svg>\n </button>\n\n <div className=\"flex items-center gap-2\">\n <h2 className=\"text-lg font-semibold text-[hsl(var(--foreground))]\">\n {MONTHS[month]} {year}\n </h2>\n <button\n onClick={handleToday}\n className=\"px-3 py-1 text-sm bg-[hsl(var(--primary))] text-[hsl(var(--primary-foreground))] rounded-md hover:bg-[hsl(var(--primary))]/90 transition-colors\"\n >\n Today\n </button>\n </div>\n\n <button\n onClick={handleNextMonth}\n className=\"p-2 hover:bg-[hsl(var(--accent))] rounded-md transition-colors\"\n aria-label=\"Next month\"\n >\n <svg className=\"w-5 h-5 text-[hsl(var(--muted-foreground))]\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 5l7 7-7 7\" />\n </svg>\n </button>\n </div>\n\n {/* Day headers */}\n <div className=\"grid grid-cols-7 gap-1 mb-2\">\n {DAYS.map(day => (\n <div\n key={day}\n className=\"text-center text-xs font-semibold text-[hsl(var(--muted-foreground))] py-2\"\n >\n {day}\n </div>\n ))}\n </div>\n\n {/* Calendar grid */}\n <div className=\"grid grid-cols-7 gap-1\">\n {calendarDays.map((date, index) => {\n if (!date) return <div key={index} />;\n\n const isCurrentMonthDay = isCurrentMonth(date);\n const isTodayDay = isToday(date);\n const isSelectedDay = isSelected(date);\n const isDisabledDay = isDisabled(date);\n\n return (\n <button\n key={index}\n onClick={() => handleDateClick(date)}\n disabled={isDisabledDay}\n className={`\n aspect-square p-2 rounded-md text-sm font-medium transition-all\n ${!isCurrentMonthDay ? 'text-[hsl(var(--muted-foreground))]/50' : 'text-[hsl(var(--foreground))]'}\n ${isTodayDay && !isSelectedDay ? 'bg-[hsl(var(--accent))] text-[hsl(var(--primary))] font-bold' : ''}\n ${isSelectedDay ? 'bg-[hsl(var(--primary))] text-[hsl(var(--primary-foreground))] hover:bg-[hsl(var(--primary))]/90' : ''}\n ${!isSelectedDay && !isDisabledDay ? 'hover:bg-[hsl(var(--accent))]' : ''}\n ${isDisabledDay ? 'opacity-30 cursor-not-allowed' : 'cursor-pointer'}\n `}\n >\n {date.getDate()}\n </button>\n );\n })}\n </div>\n </div>\n );\n};\n","\"use client\";\n\nimport React from 'react';\n\nexport interface RadioOption {\n value: string;\n label: string;\n disabled?: boolean;\n}\n\nexport interface RadioProps {\n name: string;\n options: RadioOption[];\n value?: string;\n defaultValue?: string;\n onChange?: (value: string) => void;\n disabled?: boolean;\n orientation?: 'horizontal' | 'vertical';\n className?: string;\n}\n\nexport const Radio: React.FC<RadioProps> = ({\n name,\n options,\n value: controlledValue,\n defaultValue,\n onChange,\n disabled = false,\n orientation = 'vertical',\n className = '',\n}) => {\n const [internalValue, setInternalValue] = React.useState(defaultValue || '');\n\n const value = controlledValue !== undefined ? controlledValue : internalValue;\n\n const handleChange = (optionValue: string) => {\n if (disabled) return;\n setInternalValue(optionValue);\n onChange?.(optionValue);\n };\n\n const containerClass = orientation === 'horizontal'\n ? 'flex flex-wrap gap-4'\n : 'flex flex-col gap-2';\n\n return (\n <div className={`${containerClass} ${className}`} role=\"radiogroup\">\n {options.map((option) => {\n const isDisabled = disabled || option.disabled;\n const isChecked = value === option.value;\n const id = `${name}-${option.value}`;\n\n return (\n <label\n key={option.value}\n htmlFor={id}\n className={`flex items-center gap-2 cursor-pointer group ${\n isDisabled ? 'opacity-50 cursor-not-allowed' : ''\n }`}\n >\n <div className=\"relative inline-flex items-center\">\n <input\n type=\"radio\"\n id={id}\n name={name}\n value={option.value}\n checked={isChecked}\n onChange={() => handleChange(option.value)}\n disabled={isDisabled}\n className=\"sr-only peer\"\n />\n <div className={`w-4 h-4 rounded-full border-2 transition-all duration-200 flex items-center justify-center\n border-[hsl(var(--input))]\n ${isDisabled\n ? 'bg-[hsl(var(--muted))]'\n : 'peer-hover:border-[hsl(var(--ring))]'\n }\n ${isChecked\n ? 'border-[hsl(var(--primary))] bg-[hsl(var(--background))]'\n : ''\n }\n peer-focus:ring-1 peer-focus:ring-[hsl(var(--ring))]/50\n `}>\n {/* Inner dot */}\n <div className={`w-2 h-2 rounded-full bg-[hsl(var(--primary))] transition-all duration-200 ${\n isChecked ? 'scale-100' : 'scale-0'\n }`} />\n </div>\n </div>\n <span className={`text-sm font-medium text-[hsl(var(--foreground))] ${\n !isDisabled && 'group-hover:text-[hsl(var(--foreground))]'\n }`}>\n {option.label}\n </span>\n </label>\n );\n })}\n </div>\n );\n};\n","\"use client\";\n\nimport React from 'react';\n\nexport interface ProgressBarProps {\n value: number;\n max?: number;\n size?: 'sm' | 'md' | 'lg';\n variant?: 'default' | 'success' | 'warning' | 'danger';\n showLabel?: boolean;\n label?: string;\n className?: string;\n}\n\nexport const ProgressBar: React.FC<ProgressBarProps> = ({\n value,\n max = 100,\n size = 'md',\n variant = 'default',\n showLabel = false,\n label,\n className = '',\n}) => {\n const percentage = Math.min(Math.max((value / max) * 100, 0), 100);\n\n const sizeClasses = {\n sm: 'h-1',\n md: 'h-2',\n lg: 'h-3',\n };\n\n const variantClasses = {\n default: 'bg-[hsl(var(--primary))]',\n success: 'bg-[hsl(var(--success))]',\n warning: 'bg-[hsl(var(--warning))]',\n danger: 'bg-[hsl(var(--destructive))]',\n };\n\n return (\n <div className={`w-full ${className}`}>\n {(showLabel || label) && (\n <div className=\"flex justify-between items-center mb-1\">\n {label && (\n <span className=\"text-sm font-medium text-[hsl(var(--foreground))]\">\n {label}\n </span>\n )}\n {showLabel && (\n <span className=\"text-sm font-medium text-[hsl(var(--muted-foreground))]\">\n {Math.round(percentage)}%\n </span>\n )}\n </div>\n )}\n <div\n className={`w-full bg-[hsl(var(--muted))] rounded-full overflow-hidden ${sizeClasses[size]}`}\n role=\"progressbar\"\n aria-valuenow={value}\n aria-valuemin={0}\n aria-valuemax={max}\n >\n <div\n className={`${sizeClasses[size]} ${variantClasses[variant]} rounded-full transition-all duration-300 ease-out`}\n style={{ width: `${percentage}%` }}\n />\n </div>\n </div>\n );\n};\n","\"use client\";\n\nimport React, { useState, useRef } from 'react';\n\nexport interface SliderProps {\n value?: number;\n defaultValue?: number;\n min?: number;\n max?: number;\n step?: number;\n onChange?: (value: number) => void;\n disabled?: boolean;\n showValue?: boolean;\n label?: string;\n className?: string;\n // Range slider props\n range?: boolean;\n rangeValue?: [number, number];\n defaultRangeValue?: [number, number];\n onRangeChange?: (value: [number, number]) => void;\n}\n\nexport const Slider: React.FC<SliderProps> = ({\n value: controlledValue,\n defaultValue = 50,\n min = 0,\n max = 100,\n step = 1,\n onChange,\n disabled = false,\n showValue = false,\n label,\n className = '',\n range = false,\n rangeValue: controlledRangeValue,\n defaultRangeValue = [25, 75],\n onRangeChange,\n}) => {\n const [internalValue, setInternalValue] = React.useState(defaultValue);\n const [internalRangeValue, setInternalRangeValue] = React.useState<[number, number]>(defaultRangeValue);\n const trackRef = useRef<HTMLDivElement>(null);\n const [isDragging, setIsDragging] = React.useState<'min' | 'max' | null>(null);\n\n const value = controlledValue !== undefined ? controlledValue : internalValue;\n const rangeValue = controlledRangeValue !== undefined ? controlledRangeValue : internalRangeValue;\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const newValue = Number(e.target.value);\n setInternalValue(newValue);\n onChange?.(newValue);\n };\n\n const handleRangeStart = (clientX: number, handle: 'min' | 'max') => {\n if (disabled) return;\n setIsDragging(handle);\n };\n\n const handleRangeMouseDown = (e: React.MouseEvent, handle: 'min' | 'max') => {\n e.preventDefault();\n handleRangeStart(e.clientX, handle);\n };\n\n const handleRangeTouchStart = (e: React.TouchEvent, handle: 'min' | 'max') => {\n e.preventDefault();\n handleRangeStart(e.touches[0].clientX, handle);\n };\n\n const updateRangeValue = (clientX: number) => {\n if (!isDragging || !trackRef.current || disabled) return;\n\n const rect = trackRef.current.getBoundingClientRect();\n const percentage = Math.max(0, Math.min(100, ((clientX - rect.left) / rect.width) * 100));\n const newValue = Math.round((percentage / 100) * (max - min) / step) * step + min;\n\n if (isDragging === 'min') {\n const newMin = Math.min(newValue, rangeValue[1] - step);\n const newRange: [number, number] = [newMin, rangeValue[1]];\n setInternalRangeValue(newRange);\n onRangeChange?.(newRange);\n } else {\n const newMax = Math.max(newValue, rangeValue[0] + step);\n const newRange: [number, number] = [rangeValue[0], newMax];\n setInternalRangeValue(newRange);\n onRangeChange?.(newRange);\n }\n };\n\n const handleRangeMouseMove = (e: MouseEvent) => {\n updateRangeValue(e.clientX);\n };\n\n const handleRangeTouchMove = (e: TouchEvent) => {\n if (e.touches.length > 0) {\n updateRangeValue(e.touches[0].clientX);\n }\n };\n\n const handleRangeEnd = () => {\n setIsDragging(null);\n };\n\n React.useEffect(() => {\n if (isDragging) {\n document.addEventListener('mousemove', handleRangeMouseMove);\n document.addEventListener('mouseup', handleRangeEnd);\n document.addEventListener('touchmove', handleRangeTouchMove);\n document.addEventListener('touchend', handleRangeEnd);\n return () => {\n document.removeEventListener('mousemove', handleRangeMouseMove);\n document.removeEventListener('mouseup', handleRangeEnd);\n document.removeEventListener('touchmove', handleRangeTouchMove);\n document.removeEventListener('touchend', handleRangeEnd);\n };\n }\n }, [isDragging, rangeValue]);\n\n const percentage = ((value - min) / (max - min)) * 100;\n const minPercentage = ((rangeValue[0] - min) / (max - min)) * 100;\n const maxPercentage = ((rangeValue[1] - min) / (max - min)) * 100;\n\n if (range) {\n return (\n <div className={`w-full ${className}`}>\n {(label || showValue) && (\n <div className=\"flex justify-between items-center mb-2\">\n {label && (\n <label className=\"text-sm font-medium text-[hsl(var(--foreground))]\">\n {label}\n </label>\n )}\n {showValue && (\n <span className=\"text-sm font-medium text-[hsl(var(--muted-foreground))]\">\n {rangeValue[0]} - {rangeValue[1]}\n </span>\n )}\n </div>\n )}\n <div className=\"relative h-10 flex items-center\" ref={trackRef}>\n {/* Background track */}\n <div className=\"absolute w-full h-2 bg-[hsl(var(--muted))] rounded-full\" />\n\n {/* Filled track between handles */}\n <div\n className=\"absolute h-2 bg-[hsl(var(--primary))] rounded-full pointer-events-none\"\n style={{\n left: `${minPercentage}%`,\n width: `${maxPercentage - minPercentage}%`,\n }}\n />\n\n {/* Min handle */}\n <div\n className={`absolute w-4 h-4 -ml-2 rounded-full bg-[hsl(var(--background))] border-2 border-[hsl(var(--primary))] shadow-md cursor-pointer z-10\n ${disabled ? 'opacity-50 cursor-not-allowed' : ''}\n `}\n style={{ left: `${minPercentage}%` }}\n onMouseDown={(e) => handleRangeMouseDown(e, 'min')}\n onTouchStart={(e) => handleRangeTouchStart(e, 'min')}\n role=\"slider\"\n aria-label={`${label ? label + ' ' : ''}minimum value`}\n aria-valuemin={min}\n aria-valuemax={rangeValue[1]}\n aria-valuenow={rangeValue[0]}\n tabIndex={disabled ? -1 : 0}\n />\n\n {/* Max handle */}\n <div\n className={`absolute w-4 h-4 -ml-2 rounded-full bg-[hsl(var(--background))] border-2 border-[hsl(var(--primary))] shadow-md cursor-pointer z-10\n ${disabled ? 'opacity-50 cursor-not-allowed' : ''}\n `}\n style={{ left: `${maxPercentage}%` }}\n onMouseDown={(e) => handleRangeMouseDown(e, 'max')}\n onTouchStart={(e) => handleRangeTouchStart(e, 'max')}\n role=\"slider\"\n aria-label={`${label ? label + ' ' : ''}maximum value`}\n aria-valuemin={rangeValue[0]}\n aria-valuemax={max}\n aria-valuenow={rangeValue[1]}\n tabIndex={disabled ? -1 : 0}\n />\n </div>\n </div>\n );\n }\n\n return (\n <div className={`w-full ${className}`}>\n {(label || showValue) && (\n <div className=\"flex justify-between items-center mb-2\">\n {label && (\n <label className=\"text-sm font-medium text-[hsl(var(--foreground))]\">\n {label}\n </label>\n )}\n {showValue && (\n <span className=\"text-sm font-medium text-[hsl(var(--muted-foreground))]\">\n {value}\n </span>\n )}\n </div>\n )}\n <div className=\"relative h-10 flex items-center\">\n {/* Background track */}\n <div className=\"absolute w-full h-2 bg-[hsl(var(--muted))] rounded-full\" />\n\n {/* Filled track */}\n <div\n className=\"absolute h-2 bg-[hsl(var(--primary))] rounded-full pointer-events-none\"\n style={{ width: `${percentage}%` }}\n />\n\n {/* Custom handle */}\n <div\n className={`absolute w-4 h-4 -ml-2 rounded-full bg-[hsl(var(--background))] border-2 border-[hsl(var(--primary))] shadow-md pointer-events-none z-10\n ${disabled ? 'opacity-50' : ''}\n `}\n style={{ left: `${percentage}%` }}\n />\n\n {/* Input slider (invisible but functional) */}\n <input\n type=\"range\"\n min={min}\n max={max}\n step={step}\n value={value}\n onChange={handleChange}\n disabled={disabled}\n className=\"relative w-full h-10 bg-transparent appearance-none cursor-pointer disabled:cursor-not-allowed z-20\n [&::-webkit-slider-thumb]:appearance-none [&::-webkit-slider-thumb]:w-4 [&::-webkit-slider-thumb]:h-4\n [&::-webkit-slider-thumb]:rounded-full [&::-webkit-slider-thumb]:bg-transparent [&::-webkit-slider-thumb]:cursor-pointer\n [&::-moz-range-thumb]:w-4 [&::-moz-range-thumb]:h-4 [&::-moz-range-thumb]:rounded-full\n [&::-moz-range-thumb]:bg-transparent [&::-moz-range-thumb]:cursor-pointer [&::-moz-range-thumb]:border-none\"\n aria-label={label}\n aria-valuemin={min}\n aria-valuemax={max}\n aria-valuenow={value}\n />\n </div>\n </div>\n );\n};\n","\"use client\";\n\nimport React from 'react';\n\nexport interface AvatarProps {\n src?: string;\n alt?: string;\n name?: string;\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n shape?: 'circle' | 'square';\n className?: string;\n fallbackColor?: string;\n}\n\nexport const Avatar: React.FC<AvatarProps> = ({\n src,\n alt,\n name,\n size = 'md',\n shape = 'circle',\n className = '',\n fallbackColor = 'bg-[hsl(var(--primary))]',\n}) => {\n const [imageError, setImageError] = React.useState(false);\n\n const sizeClasses = {\n xs: 'w-6 h-6 text-xs',\n sm: 'w-8 h-8 text-sm',\n md: 'w-10 h-10 text-base',\n lg: 'w-12 h-12 text-lg',\n xl: 'w-16 h-16 text-2xl',\n };\n\n const shapeClass = shape === 'circle' ? 'rounded-full' : 'rounded-md';\n\n const getInitials = (name: string): string => {\n const parts = name.trim().split(' ');\n if (parts.length >= 2) {\n return `${parts[0][0]}${parts[parts.length - 1][0]}`.toUpperCase();\n }\n return name.slice(0, 2).toUpperCase();\n };\n\n const showImage = src && !imageError;\n const showInitials = !showImage && name;\n\n return (\n <div\n className={`${sizeClasses[size]} ${shapeClass} flex items-center justify-center overflow-hidden ${\n showImage ? 'bg-[hsl(var(--muted))]' : `${fallbackColor} text-white`\n } ${className}`}\n >\n {showImage ? (\n <img\n src={src}\n alt={alt || name || 'Avatar'}\n className=\"w-full h-full object-cover\"\n onError={() => setImageError(true)}\n />\n ) : showInitials ? (\n <span className=\"font-semibold select-none\">{getInitials(name)}</span>\n ) : (\n <svg\n className=\"w-full h-full text-[hsl(var(--muted-foreground))]\"\n fill=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path d=\"M12 12c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm0 2c-2.67 0-8 1.34-8 4v2h16v-2c0-2.66-5.33-4-8-4z\" />\n </svg>\n )}\n </div>\n );\n};\n","\"use client\";\n\nimport React from 'react';\n\nexport interface TextareaProps extends Omit<React.TextareaHTMLAttributes<HTMLTextAreaElement>, 'size'> {\n label?: string;\n error?: string;\n helperText?: string;\n size?: 'sm' | 'md' | 'lg';\n resize?: 'none' | 'vertical' | 'horizontal' | 'both';\n}\n\nexport const Textarea: React.FC<TextareaProps> = ({\n label,\n error,\n helperText,\n size = 'md',\n resize = 'vertical',\n className = '',\n disabled,\n ...props\n}) => {\n const sizeClasses = {\n sm: 'px-3 py-1.5 text-sm min-h-[80px]',\n md: 'px-3 py-2.5 text-sm min-h-[100px]',\n lg: 'px-4 py-3 text-base min-h-[120px]',\n };\n\n const resizeClasses = {\n none: 'resize-none',\n vertical: 'resize-y',\n horizontal: 'resize-x',\n both: 'resize',\n };\n\n const baseClasses = `w-full rounded-md border transition-colors duration-150 focus:outline-none focus:ring-1 focus:ring-[hsl(var(--ring))]/50 focus:border-[hsl(var(--ring))]\n ${error\n ? 'border-[hsl(var(--destructive))] focus:ring-[hsl(var(--destructive))]/50'\n : 'border-[hsl(var(--input))] hover:border-[hsl(var(--muted-foreground))]'\n }\n bg-transparent text-[hsl(var(--foreground))]\n placeholder:text-[hsl(var(--muted-foreground))]\n disabled:opacity-50 disabled:cursor-not-allowed disabled:bg-[hsl(var(--muted))]`;\n\n return (\n <div className={`w-full ${className}`}>\n {label && (\n <label className=\"block text-sm font-medium text-[hsl(var(--foreground))] mb-1.5\">\n {label}\n </label>\n )}\n <textarea\n className={`${baseClasses} ${sizeClasses[size]} ${resizeClasses[resize]}`}\n disabled={disabled}\n {...props}\n />\n {error && (\n <p className=\"mt-1.5 text-sm text-[hsl(var(--destructive))]\">{error}</p>\n )}\n {helperText && !error && (\n <p className=\"mt-1.5 text-sm text-[hsl(var(--muted-foreground))]\">{helperText}</p>\n )}\n </div>\n );\n};\n","\"use client\";\n\nimport React, { useRef, useCallback, useState, useEffect, useLayoutEffect } from 'react';\nimport { useTheme } from '../theme/ThemeProvider';\nimport { Modal } from './Modal';\nimport { Button } from './Button';\nimport { TextInput } from './TextInput';\n\nexport interface RichTextEditorProps {\n value?: string;\n onChange?: (html: string) => void;\n placeholder?: string;\n className?: string;\n minHeight?: string;\n maxHeight?: string;\n disabled?: boolean;\n label?: string;\n error?: string;\n helperText?: string;\n}\n\ntype FormatCommand = 'bold' | 'italic' | 'underline' | 'strikeThrough';\ntype BlockCommand = 'insertUnorderedList' | 'insertOrderedList' | 'formatBlock';\ntype HeadingLevel = 'h1' | 'h2' | 'h3' | 'p';\n\nexport const RichTextEditor: React.FC<RichTextEditorProps> = ({\n value = '',\n onChange,\n placeholder = 'Start typing...',\n className = '',\n minHeight = '200px',\n maxHeight = '500px',\n disabled = false,\n label,\n error,\n helperText,\n}) => {\n const { themeName } = useTheme();\n const editorRef = useRef<HTMLDivElement>(null);\n const [isFocused, setIsFocused] = useState(false);\n const [activeFormats, setActiveFormats] = useState<Set<string>>(new Set());\n const [showLinkModal, setShowLinkModal] = useState(false);\n const [linkUrl, setLinkUrl] = useState('');\n const [showImageModal, setShowImageModal] = useState(false);\n const [imageUrl, setImageUrl] = useState('');\n const [imageAlt, setImageAlt] = useState('');\n const savedSelection = useRef<Range | null>(null);\n\n // Inject global styles for contenteditable SYNCHRONOUSLY before paint\n useLayoutEffect(() => {\n const styleId = 'rich-text-editor-styles';\n if (!document.getElementById(styleId)) {\n const style = document.createElement('style');\n style.id = styleId;\n style.textContent = `\n [contenteditable]:empty:before {\n content: attr(data-placeholder);\n color: #9ca3af;\n pointer-events: none;\n }\n [contenteditable] h1 {\n font-size: 2em;\n font-weight: bold;\n margin: 0.67em 0;\n }\n [contenteditable] h2 {\n font-size: 1.5em;\n font-weight: bold;\n margin: 0.75em 0;\n }\n [contenteditable] h3 {\n font-size: 1.17em;\n font-weight: bold;\n margin: 0.83em 0;\n }\n [contenteditable] p {\n margin: 0.5em 0;\n }\n [contenteditable] p:first-child {\n margin-top: 0;\n }\n [contenteditable] p:last-child {\n margin-bottom: 0;\n }\n [contenteditable] ul, [contenteditable] ol {\n margin: 1em 0;\n padding-left: 2em;\n }\n [contenteditable] a {\n color: #3b82f6;\n text-decoration: underline;\n }\n .dark [contenteditable] a {\n color: #60a5fa;\n }\n [contenteditable] img {\n max-width: 100%;\n height: auto;\n border-radius: 0.5rem;\n margin: 1em 0;\n }\n [contenteditable] video {\n max-width: 100%;\n height: auto;\n border-radius: 0.5rem;\n margin: 1em 0;\n }\n `;\n document.head.appendChild(style);\n }\n }, []);\n\n // Track if this is the initial render and if we're updating internally\n const isInitialRender = useRef(true);\n const isInternalUpdate = useRef(false);\n\n // Set initial content on mount and configure editor\n useEffect(() => {\n if (isInitialRender.current && editorRef.current) {\n editorRef.current.innerHTML = value;\n isInitialRender.current = false;\n\n // Set default paragraph separator to use <p> instead of <div>\n try {\n document.execCommand('defaultParagraphSeparator', false, 'p');\n } catch (e) {\n console.warn('Could not set defaultParagraphSeparator', e);\n }\n }\n }, []);\n\n // Update content when value changes externally (not from user typing)\n useEffect(() => {\n if (!isInitialRender.current && !isInternalUpdate.current && editorRef.current) {\n const currentHtml = editorRef.current.innerHTML;\n if (currentHtml !== value) {\n // Save cursor position\n const selection = window.getSelection();\n const range = selection && selection.rangeCount > 0 ? selection.getRangeAt(0) : null;\n const preSelectionRange = range ? range.cloneRange() : null;\n\n if (preSelectionRange && editorRef.current.contains(preSelectionRange.startContainer)) {\n preSelectionRange.selectNodeContents(editorRef.current);\n preSelectionRange.setEnd(range!.startContainer, range!.startOffset);\n const start = preSelectionRange.toString().length;\n\n // Update content\n editorRef.current.innerHTML = value;\n\n // Restore cursor position\n const textNodes: Text[] = [];\n const getTextNodes = (node: Node) => {\n if (node.nodeType === Node.TEXT_NODE) {\n textNodes.push(node as Text);\n } else {\n node.childNodes.forEach(getTextNodes);\n }\n };\n getTextNodes(editorRef.current);\n\n let charCount = 0;\n let foundStart = false;\n\n for (const textNode of textNodes) {\n const textLength = textNode.textContent?.length || 0;\n if (!foundStart && charCount + textLength >= start) {\n const newRange = document.createRange();\n newRange.setStart(textNode, start - charCount);\n newRange.collapse(true);\n selection?.removeAllRanges();\n selection?.addRange(newRange);\n foundStart = true;\n break;\n }\n charCount += textLength;\n }\n } else {\n // No cursor position to save, just update content\n editorRef.current.innerHTML = value;\n }\n }\n }\n isInternalUpdate.current = false;\n }, [value]);\n\n // Update active formats\n const updateActiveFormats = useCallback(() => {\n const formats = new Set<string>();\n\n if (document.queryCommandState('bold')) formats.add('bold');\n if (document.queryCommandState('italic')) formats.add('italic');\n if (document.queryCommandState('underline')) formats.add('underline');\n if (document.queryCommandState('strikeThrough')) formats.add('strikeThrough');\n if (document.queryCommandState('insertUnorderedList')) formats.add('ul');\n if (document.queryCommandState('insertOrderedList')) formats.add('ol');\n\n // Check heading level\n const parentNode = window.getSelection()?.anchorNode?.parentElement;\n if (parentNode) {\n const tagName = parentNode.tagName.toLowerCase();\n if (['h1', 'h2', 'h3'].includes(tagName)) {\n formats.add(tagName);\n }\n }\n\n setActiveFormats(formats);\n }, []);\n\n const handleInput = useCallback(() => {\n if (editorRef.current && onChange) {\n isInternalUpdate.current = true;\n onChange(editorRef.current.innerHTML);\n }\n updateActiveFormats();\n }, [onChange, updateActiveFormats]);\n\n const handleFocus = useCallback(() => {\n setIsFocused(true);\n\n // Ensure editor starts with a <p> tag if empty\n if (editorRef.current && (!editorRef.current.innerHTML || editorRef.current.innerHTML === '')) {\n editorRef.current.innerHTML = '<p><br></p>';\n\n // Place cursor inside the <p>\n const selection = window.getSelection();\n const range = document.createRange();\n if (editorRef.current.firstChild) {\n range.setStart(editorRef.current.firstChild, 0);\n range.collapse(true);\n selection?.removeAllRanges();\n selection?.addRange(range);\n }\n }\n }, []);\n\n const handleFormat = useCallback((command: FormatCommand) => {\n if (disabled) return;\n document.execCommand(command, false);\n editorRef.current?.focus();\n updateActiveFormats();\n handleInput();\n }, [disabled, updateActiveFormats, handleInput]);\n\n const handleList = useCallback((command: BlockCommand) => {\n if (disabled) return;\n document.execCommand(command, false);\n editorRef.current?.focus();\n updateActiveFormats();\n handleInput();\n }, [disabled, updateActiveFormats, handleInput]);\n\n const handleHeading = useCallback((level: HeadingLevel) => {\n if (disabled) return;\n document.execCommand('formatBlock', false, level);\n editorRef.current?.focus();\n updateActiveFormats();\n handleInput();\n }, [disabled, updateActiveFormats, handleInput]);\n\n const handleLink = useCallback(() => {\n if (disabled) return;\n\n // Save current selection before opening modal\n const selection = window.getSelection();\n if (selection && selection.rangeCount > 0) {\n savedSelection.current = selection.getRangeAt(0).cloneRange();\n }\n\n setShowLinkModal(true);\n }, [disabled]);\n\n const insertLink = useCallback(() => {\n if (!linkUrl || !editorRef.current) return;\n\n const selection = window.getSelection();\n if (savedSelection.current && selection) {\n try {\n // Restore the saved selection\n selection.removeAllRanges();\n selection.addRange(savedSelection.current);\n\n // Insert link at saved position\n document.execCommand('createLink', false, linkUrl);\n\n savedSelection.current = null;\n } catch (e) {\n console.warn('Could not insert link at saved position', e);\n }\n }\n\n setShowLinkModal(false);\n setLinkUrl('');\n editorRef.current?.focus();\n handleInput();\n }, [linkUrl, handleInput]);\n\n const handleCode = useCallback(() => {\n if (disabled) return;\n const selection = window.getSelection();\n if (selection && selection.rangeCount > 0) {\n const range = selection.getRangeAt(0);\n const code = document.createElement('code');\n code.className = 'bg-[hsl(var(--muted))] px-1.5 py-0.5 rounded text-sm font-mono';\n\n try {\n range.surroundContents(code);\n handleInput();\n } catch (e) {\n console.warn('Could not apply code formatting');\n }\n }\n editorRef.current?.focus();\n }, [disabled, handleInput]);\n\n const handleImage = useCallback(() => {\n if (disabled) return;\n\n // Save current selection before opening modal\n const selection = window.getSelection();\n if (selection && selection.rangeCount > 0) {\n savedSelection.current = selection.getRangeAt(0).cloneRange();\n }\n\n setShowImageModal(true);\n }, [disabled]);\n\n const insertImage = useCallback(() => {\n if (!imageUrl || !editorRef.current) return;\n\n // Focus the editor first\n editorRef.current.focus();\n\n const img = document.createElement('img');\n img.src = imageUrl;\n img.alt = imageAlt || '';\n img.style.maxWidth = '100%';\n img.style.height = 'auto';\n\n const selection = window.getSelection();\n\n // Try to use saved selection if available and valid\n if (savedSelection.current && selection && editorRef.current.contains(savedSelection.current.commonAncestorContainer)) {\n try {\n selection.removeAllRanges();\n selection.addRange(savedSelection.current);\n\n savedSelection.current.deleteContents();\n savedSelection.current.insertNode(img);\n\n // Add line break after image\n const br = document.createElement('br');\n savedSelection.current.setStartAfter(img);\n savedSelection.current.insertNode(br);\n\n // Move cursor after line break\n savedSelection.current.setStartAfter(br);\n savedSelection.current.collapse(true);\n\n selection.removeAllRanges();\n selection.addRange(savedSelection.current);\n\n savedSelection.current = null;\n } catch (e) {\n console.warn('Could not insert at saved position', e);\n // Fallback to current selection or append\n if (selection.rangeCount > 0) {\n const range = selection.getRangeAt(0);\n if (editorRef.current.contains(range.commonAncestorContainer)) {\n range.insertNode(img);\n const br = document.createElement('br');\n range.setStartAfter(img);\n range.insertNode(br);\n range.setStartAfter(br);\n range.collapse(true);\n } else {\n editorRef.current.appendChild(img);\n editorRef.current.appendChild(document.createElement('br'));\n }\n } else {\n editorRef.current.appendChild(img);\n editorRef.current.appendChild(document.createElement('br'));\n }\n }\n } else {\n // No valid saved selection, try current selection\n if (selection && selection.rangeCount > 0) {\n const range = selection.getRangeAt(0);\n if (editorRef.current.contains(range.commonAncestorContainer)) {\n range.deleteContents();\n range.insertNode(img);\n const br = document.createElement('br');\n range.setStartAfter(img);\n range.insertNode(br);\n range.setStartAfter(br);\n range.collapse(true);\n selection.removeAllRanges();\n selection.addRange(range);\n } else {\n editorRef.current.appendChild(img);\n editorRef.current.appendChild(document.createElement('br'));\n }\n } else {\n // No selection at all, append to end\n editorRef.current.appendChild(img);\n editorRef.current.appendChild(document.createElement('br'));\n }\n }\n\n setShowImageModal(false);\n setImageUrl('');\n setImageAlt('');\n handleInput();\n }, [imageUrl, imageAlt, handleInput]);\n\n // Toolbar button base styles\n const getButtonClass = (isActive: boolean) => {\n const baseClass = themeName === 'minimalistic'\n ? 'border border-white text-white transition-colors'\n : 'border border-[hsl(var(--input))] text-[hsl(var(--foreground))] transition-colors';\n\n const activeClass = themeName === 'minimalistic'\n ? 'bg-white text-black'\n : 'bg-[hsl(var(--primary))]/20 border-[hsl(var(--primary))]';\n\n const hoverClass = themeName === 'minimalistic'\n ? 'hover:bg-white hover:text-black'\n : 'hover:bg-[hsl(var(--accent))]';\n\n const disabledClass = disabled ? 'opacity-50 cursor-not-allowed' : 'cursor-pointer';\n\n return `px-2.5 py-1.5 rounded text-sm font-medium ${baseClass} ${isActive ? activeClass : hoverClass} ${disabledClass}`;\n };\n\n // Editor base styles\n const editorBaseClass = themeName === 'minimalistic'\n ? 'bg-transparent border-2 border-white text-white placeholder:text-[hsl(var(--muted-foreground))]'\n : 'bg-[hsl(var(--card))] border border-[hsl(var(--input))] text-[hsl(var(--foreground))]';\n\n const focusClass = isFocused && !disabled\n ? themeName === 'minimalistic'\n ? 'border-white'\n : 'border-[hsl(var(--primary))] ring-1 ring-[hsl(var(--ring))]/50'\n : '';\n\n const errorClass = error\n ? 'border-red-500 dark:border-red-400'\n : '';\n\n return (\n <div className={`w-full ${className}`}>\n {label && (\n <label className=\"block text-sm font-medium text-[hsl(var(--foreground))] mb-2\">\n {label}\n </label>\n )}\n\n {/* Toolbar */}\n <div className={`rounded-t-lg border-b ${editorBaseClass} p-2 flex flex-wrap gap-1`}>\n {/* Text Formatting */}\n <div className=\"flex gap-1\">\n <button\n type=\"button\"\n onClick={() => handleFormat('bold')}\n className={getButtonClass(activeFormats.has('bold'))}\n disabled={disabled}\n title=\"Bold (Ctrl+B)\"\n >\n <svg className=\"w-4 h-4\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path d=\"M12.78 4c1.09 0 2.04.38 2.84 1.14.8.76 1.2 1.74 1.2 2.94 0 .9-.25 1.68-.76 2.36-.51.68-1.2 1.14-2.04 1.38v.08c1.06.22 1.89.7 2.48 1.44.59.74.88 1.64.88 2.7 0 1.34-.47 2.43-1.41 3.27C14.96 19.77 13.74 20 12.24 20H4V4h8.78zm-.66 7.14c.62 0 1.12-.18 1.5-.54.38-.36.57-.84.57-1.44 0-.6-.19-1.08-.57-1.44-.38-.36-.88-.54-1.5-.54H7.5v3.96h4.62zm.24 6.86c.68 0 1.24-.19 1.68-.57.44-.38.66-.9.66-1.56 0-.66-.22-1.18-.66-1.56-.44-.38-1-.57-1.68-.57H7.5v4.26h4.86z\"/>\n </svg>\n </button>\n <button\n type=\"button\"\n onClick={() => handleFormat('italic')}\n className={getButtonClass(activeFormats.has('italic'))}\n disabled={disabled}\n title=\"Italic (Ctrl+I)\"\n >\n <svg className=\"w-4 h-4\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path d=\"M11.59 4H16v2h-1.71l-3.58 8H13v2H8v-2h1.71l3.58-8H11.59V4z\"/>\n </svg>\n </button>\n <button\n type=\"button\"\n onClick={() => handleFormat('underline')}\n className={getButtonClass(activeFormats.has('underline'))}\n disabled={disabled}\n title=\"Underline (Ctrl+U)\"\n >\n <svg className=\"w-4 h-4\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path d=\"M10 16c-2.21 0-4-1.79-4-4V4h2v8c0 1.1.9 2 2 2s2-.9 2-2V4h2v8c0 2.21-1.79 4-4 4zM4 18h12v2H4v-2z\"/>\n </svg>\n </button>\n <button\n type=\"button\"\n onClick={() => handleFormat('strikeThrough')}\n className={getButtonClass(activeFormats.has('strikeThrough'))}\n disabled={disabled}\n title=\"Strikethrough\"\n >\n <svg className=\"w-4 h-4\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path d=\"M10 4c-2 0-3.5.5-4.5 1.5S4 7.5 4 9h2c0-.7.2-1.2.6-1.6.4-.4 1-.6 1.9-.6.8 0 1.4.2 1.8.5.4.3.7.8.7 1.4 0 .5-.2.9-.5 1.2-.3.3-.9.6-1.8.9l-.7.2c-1.2.3-2.1.7-2.7 1.2C4.2 12.7 4 13.5 4 14.5c0 1.1.4 2 1.1 2.6.7.6 1.7.9 3 .9 2.1 0 3.6-.5 4.6-1.5.9-1 1.3-2.3 1.3-3.8h-2c0 .9-.2 1.6-.7 2.1-.5.5-1.2.7-2.2.7-.8 0-1.4-.2-1.8-.5-.4-.3-.6-.8-.6-1.4 0-.5.2-.9.5-1.2.3-.3.9-.6 1.8-.9l.7-.2c1.2-.3 2.1-.7 2.7-1.2.6-.5.9-1.3.9-2.3 0-1.2-.4-2.1-1.2-2.8-.8-.7-1.9-1-3.3-1zM2 10h16v1H2v-1z\"/>\n </svg>\n </button>\n </div>\n\n <div className=\"w-px bg-[hsl(var(--border))] mx-1\" />\n\n {/* Headings */}\n <div className=\"flex gap-1\">\n <button\n type=\"button\"\n onClick={() => handleHeading('h1')}\n className={getButtonClass(activeFormats.has('h1'))}\n disabled={disabled}\n title=\"Heading 1\"\n >\n <svg className=\"w-4 h-4\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <text x=\"2\" y=\"16\" fontSize=\"14\" fontWeight=\"bold\">H1</text>\n </svg>\n </button>\n <button\n type=\"button\"\n onClick={() => handleHeading('h2')}\n className={getButtonClass(activeFormats.has('h2'))}\n disabled={disabled}\n title=\"Heading 2\"\n >\n <svg className=\"w-4 h-4\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <text x=\"2\" y=\"16\" fontSize=\"14\" fontWeight=\"bold\">H2</text>\n </svg>\n </button>\n <button\n type=\"button\"\n onClick={() => handleHeading('h3')}\n className={getButtonClass(activeFormats.has('h3'))}\n disabled={disabled}\n title=\"Heading 3\"\n >\n <svg className=\"w-4 h-4\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <text x=\"2\" y=\"16\" fontSize=\"14\" fontWeight=\"bold\">H3</text>\n </svg>\n </button>\n </div>\n\n <div className=\"w-px bg-[hsl(var(--border))] mx-1\" />\n\n {/* Lists */}\n <div className=\"flex gap-1\">\n <button\n type=\"button\"\n onClick={() => handleList('insertUnorderedList')}\n className={getButtonClass(activeFormats.has('ul'))}\n disabled={disabled}\n title=\"Bullet List\"\n >\n <svg className=\"w-4 h-4\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path d=\"M4 4h2v2H4V4zm4 0h8v2H8V4zM4 8h2v2H4V8zm4 0h8v2H8V8zm-4 4h2v2H4v-2zm4 0h8v2H8v-2zm-4 4h2v2H4v-2zm4 0h8v2H8v-2z\"/>\n </svg>\n </button>\n <button\n type=\"button\"\n onClick={() => handleList('insertOrderedList')}\n className={getButtonClass(activeFormats.has('ol'))}\n disabled={disabled}\n title=\"Numbered List\"\n >\n <svg className=\"w-4 h-4\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path d=\"M4 4h1v3H4V4zm0 4h1v1H3V8h2v1H4zm1 2H3v1h2v1H3v1h2v-3zM8 4h8v2H8V4zm0 4h8v2H8V8zm0 4h8v2H8v-2zm0 4h8v2H8v-2z\"/>\n </svg>\n </button>\n </div>\n\n <div className=\"w-px bg-[hsl(var(--border))] mx-1\" />\n\n {/* Link & Code */}\n <div className=\"flex gap-1\">\n <button\n type=\"button\"\n onClick={handleLink}\n className={getButtonClass(false)}\n disabled={disabled}\n title=\"Insert Link\"\n >\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1\" />\n </svg>\n </button>\n <button\n type=\"button\"\n onClick={handleImage}\n className={getButtonClass(false)}\n disabled={disabled}\n title=\"Insert Image/Video\"\n >\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 16l4.586-4.586a2 2 0 012.828 0L16 16m-2-2l1.586-1.586a2 2 0 012.828 0L20 14m-6-6h.01M6 20h12a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v12a2 2 0 002 2z\" />\n </svg>\n </button>\n <button\n type=\"button\"\n onClick={handleCode}\n className={getButtonClass(false)}\n disabled={disabled}\n title=\"Code\"\n >\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M10 20l4-16m4 4l4 4-4 4M6 16l-4-4 4-4\" />\n </svg>\n </button>\n </div>\n </div>\n\n {/* Editor Content */}\n <div\n ref={editorRef}\n contentEditable={!disabled}\n onInput={handleInput}\n onFocus={handleFocus}\n onBlur={() => setIsFocused(false)}\n onMouseUp={updateActiveFormats}\n onKeyUp={updateActiveFormats}\n className={`\n w-full px-4 py-3 rounded-b-lg outline-none overflow-y-auto\n ${editorBaseClass} ${focusClass} ${errorClass}\n ${disabled ? 'opacity-50 cursor-not-allowed' : ''}\n prose prose-sm dark:prose-invert max-w-none\n `}\n style={{\n minHeight,\n maxHeight,\n }}\n data-placeholder={placeholder}\n suppressContentEditableWarning\n />\n\n {/* Helper/Error Text */}\n {error && (\n <p className=\"mt-1 text-sm text-red-600 dark:text-red-400\">{error}</p>\n )}\n {helperText && !error && (\n <p className=\"mt-1 text-sm text-[hsl(var(--muted-foreground))]\">{helperText}</p>\n )}\n\n {/* Link Modal */}\n <Modal\n isOpen={showLinkModal}\n onClose={() => {\n setShowLinkModal(false);\n setLinkUrl('');\n }}\n title=\"Insert Link\"\n size=\"sm\"\n >\n <div className=\"space-y-4\">\n <TextInput\n label=\"URL\"\n value={linkUrl}\n onChange={(e) => setLinkUrl(e.target.value)}\n placeholder=\"https://example.com\"\n autoFocus\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n insertLink();\n }\n }}\n />\n <div className=\"flex gap-2 justify-end\">\n <Button\n variant=\"secondary\"\n onClick={() => {\n setShowLinkModal(false);\n setLinkUrl('');\n }}\n >\n Cancel\n </Button>\n <Button\n variant=\"primary\"\n onClick={insertLink}\n disabled={!linkUrl}\n >\n Insert\n </Button>\n </div>\n </div>\n </Modal>\n\n {/* Image Modal */}\n <Modal\n isOpen={showImageModal}\n onClose={() => {\n setShowImageModal(false);\n setImageUrl('');\n setImageAlt('');\n }}\n title=\"Insert Image\"\n size=\"sm\"\n >\n <div className=\"space-y-4\">\n <TextInput\n label=\"Image URL\"\n value={imageUrl}\n onChange={(e) => setImageUrl(e.target.value)}\n placeholder=\"https://example.com/image.jpg\"\n autoFocus\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n insertImage();\n }\n }}\n />\n\n <TextInput\n label=\"Alt Text (optional)\"\n value={imageAlt}\n onChange={(e) => setImageAlt(e.target.value)}\n placeholder=\"Describe the image\"\n />\n\n <div className=\"flex gap-2 justify-end\">\n <Button\n variant=\"secondary\"\n onClick={() => {\n setShowImageModal(false);\n setImageUrl('');\n setImageAlt('');\n }}\n >\n Cancel\n </Button>\n <Button\n variant=\"primary\"\n onClick={insertImage}\n disabled={!imageUrl}\n >\n Insert\n </Button>\n </div>\n </div>\n </Modal>\n </div>\n );\n};\n","\"use client\";\n\nimport React, { createContext, useContext, useState, useCallback } from 'react';\nimport { CheckIcon, CloseIcon } from '../icons';\n\nexport interface Toast {\n id: string;\n message: string;\n type?: 'success' | 'error' | 'warning' | 'info';\n duration?: number;\n}\n\ninterface ToastContextValue {\n toasts: Toast[];\n addToast: (toast: Omit<Toast, 'id'>) => void;\n removeToast: (id: string) => void;\n}\n\nconst ToastContext = createContext<ToastContextValue | undefined>(undefined);\n\nexport const useToast = () => {\n const context = useContext(ToastContext);\n if (!context) {\n throw new Error('useToast must be used within a ToastProvider');\n }\n return context;\n};\n\nexport interface ToastProviderProps {\n children: React.ReactNode;\n position?: 'top-right' | 'top-left' | 'bottom-right' | 'bottom-left' | 'top-center' | 'bottom-center';\n}\n\nexport const ToastProvider: React.FC<ToastProviderProps> = ({ children, position = 'top-right' }) => {\n const [toasts, setToasts] = useState<Toast[]>([]);\n\n const addToast = useCallback((toast: Omit<Toast, 'id'>) => {\n const id = Math.random().toString(36).substring(7);\n const newToast = { ...toast, id };\n setToasts((prev) => [...prev, newToast]);\n\n // Auto-remove after duration\n const duration = toast.duration || 5000;\n setTimeout(() => {\n removeToast(id);\n }, duration);\n }, []);\n\n const removeToast = useCallback((id: string) => {\n setToasts((prev) => prev.filter((toast) => toast.id !== id));\n }, []);\n\n const positionClasses = {\n 'top-right': 'top-4 right-4',\n 'top-left': 'top-4 left-4',\n 'bottom-right': 'bottom-4 right-4',\n 'bottom-left': 'bottom-4 left-4',\n 'top-center': 'top-4 left-1/2 -translate-x-1/2',\n 'bottom-center': 'bottom-4 left-1/2 -translate-x-1/2',\n };\n\n return (\n <ToastContext.Provider value={{ toasts, addToast, removeToast }}>\n {children}\n <div className={`fixed ${positionClasses[position]} z-50 flex flex-col gap-2 max-w-md`}>\n {toasts.map((toast) => (\n <ToastItem key={toast.id} toast={toast} onClose={() => removeToast(toast.id)} />\n ))}\n </div>\n </ToastContext.Provider>\n );\n};\n\ninterface ToastItemProps {\n toast: Toast;\n onClose: () => void;\n}\n\nconst ToastItem: React.FC<ToastItemProps> = ({ toast, onClose }) => {\n const typeStyles = {\n success: 'bg-[hsl(var(--success))]/10 border-[hsl(var(--success))] text-[hsl(var(--success))]',\n error: 'bg-[hsl(var(--destructive))]/10 border-[hsl(var(--destructive))] text-[hsl(var(--destructive))]',\n warning: 'bg-[hsl(var(--warning))]/10 border-[hsl(var(--warning))] text-[hsl(var(--warning))]',\n info: 'bg-[hsl(var(--info))]/10 border-[hsl(var(--info))] text-[hsl(var(--info))]',\n };\n\n const typeIcons = {\n success: <CheckIcon size=\"sm\" className=\"text-[hsl(var(--success))]\" />,\n error: <CloseIcon size=\"sm\" className=\"text-[hsl(var(--destructive))]\" />,\n warning: (\n <svg className=\"w-4 h-4 text-[hsl(var(--warning))]\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fillRule=\"evenodd\" d=\"M8.257 3.099c.765-1.36 2.722-1.36 3.486 0l5.58 9.92c.75 1.334-.213 2.98-1.742 2.98H4.42c-1.53 0-2.493-1.646-1.743-2.98l5.58-9.92zM11 13a1 1 0 11-2 0 1 1 0 012 0zm-1-8a1 1 0 00-1 1v3a1 1 0 002 0V6a1 1 0 00-1-1z\" clipRule=\"evenodd\" />\n </svg>\n ),\n info: (\n <svg className=\"w-4 h-4 text-[hsl(var(--info))]\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fillRule=\"evenodd\" d=\"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a1 1 0 000 2v3a1 1 0 001 1h1a1 1 0 100-2v-3a1 1 0 00-1-1H9z\" clipRule=\"evenodd\" />\n </svg>\n ),\n };\n\n const type = toast.type || 'info';\n\n return (\n <div\n className={`flex items-start gap-3 p-4 rounded-md border-l-4 shadow-lg bg-[hsl(var(--card))] ${typeStyles[type]} animate-slide-in`}\n role=\"alert\"\n >\n <div className=\"flex-shrink-0 mt-0.5\">{typeIcons[type]}</div>\n <p className=\"flex-1 text-sm font-medium text-[hsl(var(--foreground))]\">{toast.message}</p>\n <button\n onClick={onClose}\n className=\"flex-shrink-0 text-[hsl(var(--muted-foreground))] hover:text-[hsl(var(--foreground))] transition-colors\"\n aria-label=\"Close\"\n >\n <CloseIcon size=\"sm\" />\n </button>\n </div>\n );\n};\n\n// Helper function to easily show toasts\nexport const toast = {\n success: (message: string, duration?: number) => ({\n message,\n type: 'success' as const,\n duration,\n }),\n error: (message: string, duration?: number) => ({\n message,\n type: 'error' as const,\n duration,\n }),\n warning: (message: string, duration?: number) => ({\n message,\n type: 'warning' as const,\n duration,\n }),\n info: (message: string, duration?: number) => ({\n message,\n type: 'info' as const,\n duration,\n }),\n};\n","\"use client\";\n\nimport React from 'react';\nimport { CheckIcon } from '../icons';\n\nexport interface Step {\n label: string;\n description?: string;\n}\n\nexport interface StepperProps {\n steps: Step[];\n currentStep: number;\n orientation?: 'horizontal' | 'vertical';\n className?: string;\n compact?: boolean; // Show fewer steps on small screens\n}\n\nexport const Stepper: React.FC<StepperProps> = ({\n steps,\n currentStep,\n orientation = 'horizontal',\n className = '',\n compact = false,\n}) => {\n const isHorizontal = orientation === 'horizontal';\n\n // Determine which steps to show based on screen size and compact mode\n const getStepVisibility = (index: number) => {\n if (!isHorizontal || steps.length <= 3) {\n return { mobile: true, desktop: true };\n }\n\n const stepNumber = index + 1;\n const distance = Math.abs(stepNumber - currentStep);\n\n // Mobile (automatic compact): show current step ± 1\n const mobileVisible = distance <= 1;\n\n // Desktop: show all steps unless compact is explicitly true\n const desktopVisible = !compact;\n\n return { mobile: mobileVisible, desktop: desktopVisible };\n };\n\n const shouldShowCounter = isHorizontal && steps.length > 3;\n\n return (\n <div className={`${isHorizontal ? 'flex items-start w-full' : 'flex flex-col'} ${className}`}>\n {/* Step counter - visible on mobile when compact mode is active */}\n {shouldShowCounter && (\n <div className=\"md:hidden flex items-center mr-4 flex-shrink-0\">\n <span className=\"text-sm font-medium text-[hsl(var(--muted-foreground))]\">\n {currentStep}/{steps.length}\n </span>\n </div>\n )}\n\n {steps.map((step, index) => {\n const stepNumber = index + 1;\n const isActive = stepNumber === currentStep;\n const isCompleted = stepNumber < currentStep;\n const isLast = index === steps.length - 1;\n\n const visibility = getStepVisibility(index);\n\n // Determine if this is the last visible step on mobile\n const visibleMobileSteps = steps.filter((_, i) => getStepVisibility(i).mobile);\n const isLastVisibleMobile = index === steps.map((_, i) => i).filter(i => getStepVisibility(i).mobile).slice(-1)[0];\n\n return (\n <React.Fragment key={index}>\n {/* Step - responsive visibility */}\n <div className={`\n flex ${isHorizontal ? 'flex-col items-center flex-shrink-0' : 'flex-row items-start'}\n ${isHorizontal ? '' : isLast ? '' : 'mb-6'}\n ${!visibility.mobile ? 'hidden md:flex' : ''}\n ${!visibility.desktop && visibility.mobile ? 'md:hidden' : ''}\n `}>\n <div className={`flex ${isHorizontal ? 'flex-col items-center' : 'flex-col items-center flex-shrink-0'}`}>\n {/* Circle/Check */}\n <div\n className={`flex items-center justify-center w-10 h-10 rounded-full border-2 transition-all ${\n isCompleted\n ? 'bg-[hsl(var(--primary))] border-[hsl(var(--primary))]'\n : isActive\n ? 'border-[hsl(var(--primary))] bg-[hsl(var(--background))]'\n : 'border-[hsl(var(--border))] bg-[hsl(var(--background))]'\n }`}\n >\n {isCompleted ? (\n <CheckIcon size=\"sm\" className=\"text-[hsl(var(--primary-foreground))]\" />\n ) : (\n <span\n className={`text-sm font-semibold ${\n isActive\n ? 'text-[hsl(var(--primary))]'\n : 'text-[hsl(var(--muted-foreground))]'\n }`}\n >\n {stepNumber}\n </span>\n )}\n </div>\n\n {/* Connector Line for Vertical */}\n {!isLast && !isHorizontal && (\n <div\n className={`w-0.5 flex-1 min-h-[24px] ${\n isCompleted\n ? 'bg-[hsl(var(--primary))]'\n : 'bg-[hsl(var(--border))]'\n }`}\n />\n )}\n </div>\n\n {/* Label */}\n <div className={`${isHorizontal ? 'mt-3 text-center' : 'ml-4 flex-1 min-h-[40px] flex flex-col justify-center'}`}>\n <p\n className={`text-sm font-medium whitespace-nowrap ${\n isActive || isCompleted\n ? 'text-[hsl(var(--foreground))]'\n : 'text-[hsl(var(--muted-foreground))]'\n }`}\n >\n {step.label}\n </p>\n {step.description && (\n <p className=\"text-xs text-[hsl(var(--muted-foreground))] mt-1 whitespace-nowrap\">\n {step.description}\n </p>\n )}\n </div>\n </div>\n\n {/* Connector Line for Horizontal - responsive visibility */}\n {!isLast && isHorizontal && (\n <div className={`\n flex items-start pt-5 mx-4 min-w-[80px] max-w-[200px] flex-1\n ${!visibility.mobile || isLastVisibleMobile ? 'hidden md:flex' : ''}\n ${!visibility.desktop && visibility.mobile ? 'md:hidden' : ''}\n `}>\n <div\n className={`h-0.5 w-full ${\n isCompleted\n ? 'bg-[hsl(var(--primary))]'\n : 'bg-[hsl(var(--border))]'\n }`}\n />\n </div>\n )}\n </React.Fragment>\n );\n })}\n </div>\n );\n};\n","\"use client\";\n\nimport React from 'react';\n\nexport interface DividerProps {\n orientation?: 'horizontal' | 'vertical';\n variant?: 'solid' | 'dashed' | 'dotted';\n className?: string;\n label?: string;\n labelPosition?: 'left' | 'center' | 'right';\n}\n\nexport const Divider: React.FC<DividerProps> = ({\n orientation = 'horizontal',\n variant = 'solid',\n className = '',\n label,\n labelPosition = 'center',\n}) => {\n const variantClasses = {\n solid: 'border-solid',\n dashed: 'border-dashed',\n dotted: 'border-dotted',\n };\n\n if (label && orientation === 'horizontal') {\n const alignmentClasses = {\n left: 'justify-start',\n center: 'justify-center',\n right: 'justify-end',\n };\n\n return (\n <div className={`flex items-center ${alignmentClasses[labelPosition]} ${className}`} role=\"separator\">\n {labelPosition !== 'left' && (\n <div className={`flex-1 border-t ${variantClasses[variant]} border-[hsl(var(--input))]`} />\n )}\n <span className=\"px-4 text-sm text-[hsl(var(--muted-foreground))]\">\n {label}\n </span>\n {labelPosition !== 'right' && (\n <div className={`flex-1 border-t ${variantClasses[variant]} border-[hsl(var(--input))]`} />\n )}\n </div>\n );\n }\n\n if (orientation === 'vertical') {\n return (\n <div\n className={`inline-block h-full border-l ${variantClasses[variant]} border-[hsl(var(--input))] ${className}`}\n role=\"separator\"\n aria-orientation=\"vertical\"\n />\n );\n }\n\n return (\n <hr\n className={`border-t ${variantClasses[variant]} border-[hsl(var(--input))] ${className}`}\n role=\"separator\"\n />\n );\n};\n","\"use client\";\n\nimport React, { useRef, useState } from 'react';\nimport { UploadIcon, CloseIcon } from '../icons';\n\nexport interface FileUploadProps {\n accept?: string;\n multiple?: boolean;\n maxSize?: number; // in bytes\n maxFiles?: number;\n disabled?: boolean;\n onChange?: (files: File[]) => void;\n onError?: (error: string) => void;\n className?: string;\n label?: string;\n helperText?: string;\n}\n\nexport const FileUpload: React.FC<FileUploadProps> = ({\n accept,\n multiple = false,\n maxSize,\n maxFiles = 10,\n disabled = false,\n onChange,\n onError,\n className = '',\n label,\n helperText,\n}) => {\n const [files, setFiles] = useState<File[]>([]);\n const [isDragging, setIsDragging] = useState(false);\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n const formatFileSize = (bytes: number): string => {\n if (bytes === 0) return '0 Bytes';\n const k = 1024;\n const sizes = ['Bytes', 'KB', 'MB', 'GB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return Math.round(bytes / Math.pow(k, i) * 100) / 100 + ' ' + sizes[i];\n };\n\n const validateFiles = (fileList: FileList): File[] => {\n const validFiles: File[] = [];\n const filesArray = Array.from(fileList);\n\n // Check max files\n if (filesArray.length + files.length > maxFiles) {\n onError?.(`Maximum ${maxFiles} files allowed`);\n return validFiles;\n }\n\n for (const file of filesArray) {\n // Check file size\n if (maxSize && file.size > maxSize) {\n onError?.(`File ${file.name} exceeds maximum size of ${formatFileSize(maxSize)}`);\n continue;\n }\n\n validFiles.push(file);\n }\n\n return validFiles;\n };\n\n const handleFiles = (fileList: FileList | null) => {\n if (!fileList || disabled) return;\n\n const validFiles = validateFiles(fileList);\n if (validFiles.length > 0) {\n const newFiles = multiple ? [...files, ...validFiles] : validFiles;\n setFiles(newFiles);\n onChange?.(newFiles);\n }\n };\n\n const handleDrop = (e: React.DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n setIsDragging(false);\n handleFiles(e.dataTransfer.files);\n };\n\n const handleDragOver = (e: React.DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n if (!disabled) {\n setIsDragging(true);\n }\n };\n\n const handleDragLeave = (e: React.DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n setIsDragging(false);\n };\n\n const handleClick = () => {\n if (!disabled) {\n fileInputRef.current?.click();\n }\n };\n\n const handleRemoveFile = (index: number) => {\n const newFiles = files.filter((_, i) => i !== index);\n setFiles(newFiles);\n onChange?.(newFiles);\n };\n\n return (\n <div className={`w-full ${className}`}>\n {label && (\n <label className=\"block text-sm font-medium text-[hsl(var(--foreground))] mb-2\">\n {label}\n </label>\n )}\n\n <div\n onDrop={handleDrop}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onClick={handleClick}\n className={`relative border-2 border-dashed rounded-lg p-8 text-center cursor-pointer transition-all ${\n isDragging\n ? 'border-[hsl(var(--primary))] bg-[hsl(var(--primary))]/10'\n : 'border-[hsl(var(--input))] hover:border-[hsl(var(--muted-foreground))]'\n } ${disabled ? 'opacity-50 cursor-not-allowed' : ''}`}\n >\n <input\n ref={fileInputRef}\n type=\"file\"\n accept={accept}\n multiple={multiple}\n onChange={(e) => handleFiles(e.target.files)}\n disabled={disabled}\n className=\"hidden\"\n />\n\n <div className=\"flex flex-col items-center gap-2\">\n <div className=\"w-12 h-12 rounded-full bg-[hsl(var(--muted))] flex items-center justify-center\">\n <UploadIcon size=\"lg\" className=\"text-[hsl(var(--muted-foreground))]\" />\n </div>\n <div>\n <p className=\"text-sm font-medium text-[hsl(var(--foreground))]\">\n <span className=\"text-[hsl(var(--primary))]\">Click to upload</span> or drag and drop\n </p>\n <p className=\"text-xs text-[hsl(var(--muted-foreground))] mt-1\">\n {accept ? `Accepted: ${accept}` : 'Any file type'}\n {maxSize && ` • Max size: ${formatFileSize(maxSize)}`}\n </p>\n </div>\n </div>\n </div>\n\n {helperText && (\n <p className=\"mt-2 text-sm text-[hsl(var(--muted-foreground))]\">{helperText}</p>\n )}\n\n {/* File List */}\n {files.length > 0 && (\n <div className=\"mt-4 space-y-2\">\n {files.map((file, index) => (\n <div\n key={index}\n className=\"flex items-center justify-between p-3 bg-[hsl(var(--muted))] rounded-lg border border-[hsl(var(--border))]\"\n >\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium text-[hsl(var(--foreground))] truncate\">\n {file.name}\n </p>\n <p className=\"text-xs text-[hsl(var(--muted-foreground))]\">\n {formatFileSize(file.size)}\n </p>\n </div>\n <button\n onClick={(e) => {\n e.stopPropagation();\n handleRemoveFile(index);\n }}\n className=\"ml-4 text-[hsl(var(--muted-foreground))] hover:text-[hsl(var(--destructive))] transition-colors\"\n aria-label=\"Remove file\"\n >\n <CloseIcon size=\"sm\" />\n </button>\n </div>\n ))}\n </div>\n )}\n </div>\n );\n};\n","\"use client\";\n\nimport React, { useRef, useState, useEffect } from 'react';\nimport { PlayIcon } from '../icons/PlayIcon';\nimport { PauseIcon } from '../icons/PauseIcon';\nimport { SkipBackIcon } from '../icons/SkipBackIcon';\nimport { SkipForwardIcon } from '../icons/SkipForwardIcon';\nimport { VolumeUpIcon } from '../icons/VolumeUpIcon';\nimport { VolumeOffIcon } from '../icons/VolumeOffIcon';\nimport { Button } from './Button';\n\nexport interface Chapter {\n title: string;\n startTime: number;\n}\n\nexport interface AudioPlayerProps {\n src: string;\n title?: string;\n artist?: string;\n album?: string;\n coverArt?: string;\n variant?: 'default' | 'compact' | 'mini';\n autoPlay?: boolean;\n loop?: boolean;\n preload?: 'none' | 'metadata' | 'auto';\n onPlay?: () => void;\n onPause?: () => void;\n onEnded?: () => void;\n onTimeUpdate?: (currentTime: number) => void;\n className?: string;\n showSkipButtons?: boolean;\n onSkipBack?: () => void;\n onSkipForward?: () => void;\n chapters?: Chapter[];\n showChapters?: boolean;\n onChapterChange?: (chapter: Chapter) => void;\n}\n\nexport const AudioPlayer: React.FC<AudioPlayerProps> = ({\n src,\n title,\n artist,\n album,\n coverArt,\n variant = 'default',\n autoPlay = false,\n loop = false,\n preload = 'metadata',\n onPlay,\n onPause,\n onEnded,\n onTimeUpdate,\n className = '',\n showSkipButtons = false,\n onSkipBack,\n onSkipForward,\n chapters = [],\n showChapters = true,\n onChapterChange,\n}) => {\n const audioRef = useRef<HTMLAudioElement>(null);\n const [isPlaying, setIsPlaying] = useState(false);\n const [currentTime, setCurrentTime] = useState(0);\n const [duration, setDuration] = useState(0);\n const [volume, setVolume] = useState(1);\n const [isMuted, setIsMuted] = useState(false);\n const [isLoading, setIsLoading] = useState(true);\n const [currentChapter, setCurrentChapter] = useState<Chapter | null>(null);\n const [showChapterList, setShowChapterList] = useState(false);\n const [hoveredChapter, setHoveredChapter] = useState<Chapter | null>(null);\n const [hoverPosition, setHoverPosition] = useState({ x: 0, y: 0 });\n\n useEffect(() => {\n const audio = audioRef.current;\n if (!audio) return;\n\n const handleLoadedMetadata = () => {\n setDuration(audio.duration);\n setIsLoading(false);\n };\n\n const handleCanPlay = () => {\n setIsLoading(false);\n };\n\n const handleTimeUpdate = () => {\n setCurrentTime(audio.currentTime);\n onTimeUpdate?.(audio.currentTime);\n\n // Update current chapter\n if (chapters.length > 0) {\n const chapter = getCurrentChapter(audio.currentTime);\n if (chapter && chapter !== currentChapter) {\n setCurrentChapter(chapter);\n onChapterChange?.(chapter);\n }\n }\n };\n\n const handleEnded = () => {\n setIsPlaying(false);\n onEnded?.();\n };\n\n const handlePlay = () => {\n setIsPlaying(true);\n onPlay?.();\n };\n\n const handlePause = () => {\n setIsPlaying(false);\n onPause?.();\n };\n\n const handleError = (e: Event) => {\n console.error('Audio error:', e);\n setIsPlaying(false);\n setIsLoading(false);\n };\n\n const handleLoadStart = () => {\n setIsLoading(true);\n };\n\n audio.addEventListener('loadstart', handleLoadStart);\n audio.addEventListener('loadedmetadata', handleLoadedMetadata);\n audio.addEventListener('canplay', handleCanPlay);\n audio.addEventListener('timeupdate', handleTimeUpdate);\n audio.addEventListener('ended', handleEnded);\n audio.addEventListener('play', handlePlay);\n audio.addEventListener('pause', handlePause);\n audio.addEventListener('error', handleError);\n\n // Trigger load if audio is ready\n if (audio.readyState >= 2) {\n setIsLoading(false);\n setDuration(audio.duration);\n }\n\n return () => {\n audio.removeEventListener('loadstart', handleLoadStart);\n audio.removeEventListener('loadedmetadata', handleLoadedMetadata);\n audio.removeEventListener('canplay', handleCanPlay);\n audio.removeEventListener('timeupdate', handleTimeUpdate);\n audio.removeEventListener('ended', handleEnded);\n audio.removeEventListener('play', handlePlay);\n audio.removeEventListener('pause', handlePause);\n audio.removeEventListener('error', handleError);\n };\n }, [onPlay, onPause, onEnded, onTimeUpdate]);\n\n // Separate effect for src changes\n useEffect(() => {\n const audio = audioRef.current;\n if (!audio) return;\n\n // Load the new audio source\n audio.load();\n }, [src]);\n\n const togglePlayPause = async () => {\n const audio = audioRef.current;\n if (!audio) return;\n\n try {\n if (isPlaying) {\n audio.pause();\n } else {\n await audio.play();\n }\n } catch (error) {\n console.error('Playback error:', error);\n setIsPlaying(false);\n }\n };\n\n const handleSeek = (e: React.ChangeEvent<HTMLInputElement>) => {\n const audio = audioRef.current;\n if (!audio) return;\n\n const time = parseFloat(e.target.value);\n audio.currentTime = time;\n setCurrentTime(time);\n };\n\n const handleVolumeChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const audio = audioRef.current;\n if (!audio) return;\n\n const vol = parseFloat(e.target.value);\n audio.volume = vol;\n setVolume(vol);\n setIsMuted(vol === 0);\n };\n\n const toggleMute = () => {\n const audio = audioRef.current;\n if (!audio) return;\n\n if (isMuted) {\n audio.volume = volume || 0.5;\n setIsMuted(false);\n } else {\n audio.volume = 0;\n setIsMuted(true);\n }\n };\n\n const formatTime = (time: number): string => {\n if (!isFinite(time)) return '0:00';\n const minutes = Math.floor(time / 60);\n const seconds = Math.floor(time % 60);\n return `${minutes}:${seconds.toString().padStart(2, '0')}`;\n };\n\n const getCurrentChapter = (time: number): Chapter | null => {\n if (chapters.length === 0) return null;\n\n // Find the chapter that the current time falls into\n for (let i = chapters.length - 1; i >= 0; i--) {\n if (time >= chapters[i].startTime) {\n return chapters[i];\n }\n }\n return chapters[0];\n };\n\n const jumpToChapter = (chapter: Chapter) => {\n const audio = audioRef.current;\n if (!audio) return;\n\n audio.currentTime = chapter.startTime;\n setCurrentTime(chapter.startTime);\n setShowChapterList(false);\n };\n\n const handleSkipBack = () => {\n const audio = audioRef.current;\n if (!audio) return;\n\n if (onSkipBack) {\n onSkipBack();\n } else {\n audio.currentTime = Math.max(0, audio.currentTime - 10);\n }\n };\n\n const handleSkipForward = () => {\n const audio = audioRef.current;\n if (!audio) return;\n\n if (onSkipForward) {\n onSkipForward();\n } else {\n audio.currentTime = Math.min(duration, audio.currentTime + 10);\n }\n };\n\n const progress = duration > 0 ? (currentTime / duration) * 100 : 0;\n\n // Mini variant - just play button and title\n if (variant === 'mini') {\n return (\n <div className={`flex items-center gap-2 p-2 bg-[hsl(var(--card))] rounded-lg border border-[hsl(var(--border))] ${className}`}>\n <audio ref={audioRef} src={src} preload={preload} loop={loop} autoPlay={autoPlay} />\n <Button\n iconOnly\n size=\"sm\"\n variant=\"primary\"\n onClick={togglePlayPause}\n disabled={isLoading}\n aria-label={isPlaying ? 'Pause' : 'Play'}\n >\n {isPlaying ? <PauseIcon size=\"sm\" /> : <PlayIcon size=\"sm\" />}\n </Button>\n {title && (\n <span className=\"text-sm font-medium text-[hsl(var(--foreground))] truncate\">\n {title}\n </span>\n )}\n </div>\n );\n }\n\n // Compact variant - single row layout\n if (variant === 'compact') {\n return (\n <div className={`flex items-center gap-3 p-3 bg-[hsl(var(--card))] rounded-lg border border-[hsl(var(--border))] shadow-sm ${className}`}>\n <audio ref={audioRef} src={src} preload={preload} loop={loop} autoPlay={autoPlay} />\n\n {/* Play/Pause Button */}\n <Button\n iconOnly\n size=\"md\"\n variant=\"primary\"\n onClick={togglePlayPause}\n disabled={isLoading}\n aria-label={isPlaying ? 'Pause' : 'Play'}\n >\n {isPlaying ? <PauseIcon size=\"md\" /> : <PlayIcon size=\"md\" />}\n </Button>\n\n {/* Track Info */}\n <div className=\"flex-1 min-w-0\">\n {title && (\n <div className=\"text-sm font-medium text-[hsl(var(--foreground))] truncate\">\n {title}\n </div>\n )}\n {artist && (\n <div className=\"text-xs text-[hsl(var(--muted-foreground))] truncate\">\n {artist}\n </div>\n )}\n </div>\n\n {/* Progress Bar */}\n <div className=\"flex items-center gap-2 flex-1\">\n <span className=\"text-xs text-[hsl(var(--muted-foreground))] tabular-nums\">\n {formatTime(currentTime)}\n </span>\n <div className=\"relative flex-1 h-1.5 bg-[hsl(var(--muted))] rounded-full overflow-visible\">\n <div\n className=\"absolute h-full bg-[hsl(var(--primary))] rounded-full transition-all\"\n style={{ width: `${progress}%` }}\n />\n {/* Chapter Markers */}\n {showChapters && chapters.length > 0 && chapters.map((chapter, index) => {\n const markerPosition = duration > 0 ? (chapter.startTime / duration) * 100 : 0;\n return (\n <div\n key={index}\n className=\"absolute top-0 bottom-0 w-1 -ml-0.5 bg-[hsl(var(--background))] opacity-70 hover:opacity-100 hover:w-1.5 hover:-ml-0.5 cursor-pointer z-10 transition-all\"\n style={{ left: `${markerPosition}%` }}\n onClick={() => jumpToChapter(chapter)}\n onMouseEnter={(e) => {\n setHoveredChapter(chapter);\n const rect = e.currentTarget.getBoundingClientRect();\n setHoverPosition({ x: rect.left + rect.width / 2, y: rect.top });\n }}\n onMouseLeave={() => setHoveredChapter(null)}\n />\n );\n })}\n <input\n type=\"range\"\n min={0}\n max={duration || 0}\n value={currentTime}\n onChange={handleSeek}\n disabled={isLoading}\n className=\"absolute inset-0 w-full h-full opacity-0 cursor-pointer disabled:cursor-not-allowed z-20\"\n aria-label=\"Seek\"\n />\n </div>\n <span className=\"text-xs text-[hsl(var(--muted-foreground))] tabular-nums\">\n {formatTime(duration)}\n </span>\n {currentChapter && showChapters && (\n <span className=\"text-xs text-[hsl(var(--primary))] font-medium truncate max-w-[120px]\">\n • {currentChapter.title}\n </span>\n )}\n </div>\n\n {/* Volume */}\n <div className=\"flex items-center gap-2\">\n <button\n onClick={toggleMute}\n className=\"text-[hsl(var(--muted-foreground))] hover:text-[hsl(var(--foreground))]\"\n aria-label={isMuted ? 'Unmute' : 'Mute'}\n >\n {isMuted ? <VolumeOffIcon size=\"sm\" /> : <VolumeUpIcon size=\"sm\" />}\n </button>\n <input\n type=\"range\"\n min={0}\n max={1}\n step={0.01}\n value={isMuted ? 0 : volume}\n onChange={handleVolumeChange}\n className=\"w-16 h-1.5 bg-[hsl(var(--muted))] rounded-full appearance-none cursor-pointer\n [&::-webkit-slider-thumb]:appearance-none [&::-webkit-slider-thumb]:w-3 [&::-webkit-slider-thumb]:h-3\n [&::-webkit-slider-thumb]:rounded-full [&::-webkit-slider-thumb]:bg-[hsl(var(--primary))] [&::-webkit-slider-thumb]:cursor-pointer\n [&::-moz-range-thumb]:w-3 [&::-moz-range-thumb]:h-3 [&::-moz-range-thumb]:rounded-full\n [&::-moz-range-thumb]:bg-[hsl(var(--primary))] [&::-moz-range-thumb]:cursor-pointer [&::-moz-range-thumb]:border-none\"\n aria-label=\"Volume\"\n />\n </div>\n\n {/* Chapter Hover Tooltip */}\n {hoveredChapter && showChapters && (\n <div\n className=\"fixed z-50 px-3 py-2 bg-[hsl(var(--popover))] text-white text-xs font-medium rounded shadow-lg pointer-events-none transform -translate-x-1/2 -translate-y-full\"\n style={{ left: hoverPosition.x, top: hoverPosition.y - 8 }}\n >\n <div className=\"whitespace-nowrap\">{hoveredChapter.title}</div>\n <div className=\"text-[hsl(var(--muted-foreground))] text-[10px] mt-0.5\">{formatTime(hoveredChapter.startTime)}</div>\n <div className=\"absolute left-1/2 -bottom-1 w-2 h-2 bg-[hsl(var(--popover))] transform -translate-x-1/2 rotate-45\" />\n </div>\n )}\n </div>\n );\n }\n\n // Default variant - full featured player\n return (\n <div className={`bg-[hsl(var(--card))] rounded-lg border border-[hsl(var(--border))] shadow-md overflow-hidden ${className}`}>\n <audio ref={audioRef} src={src} preload={preload} loop={loop} autoPlay={autoPlay} />\n\n {/* Header with artwork and track info */}\n <div className=\"flex items-center gap-4 p-4 border-b border-[hsl(var(--border))]\">\n {coverArt && (\n <div className=\"w-16 h-16 flex-shrink-0 rounded-md overflow-hidden bg-[hsl(var(--muted))]\">\n <img\n src={coverArt}\n alt={`${title || 'Track'} cover art`}\n className=\"w-full h-full object-cover\"\n />\n </div>\n )}\n <div className=\"flex-1 min-w-0\">\n {title && (\n <h3 className=\"text-base font-semibold text-[hsl(var(--foreground))] truncate\">\n {title}\n </h3>\n )}\n {artist && (\n <p className=\"text-sm text-[hsl(var(--muted-foreground))] truncate\">\n {artist}\n </p>\n )}\n {album && (\n <p className=\"text-xs text-[hsl(var(--muted-foreground))] truncate\">\n {album}\n </p>\n )}\n </div>\n </div>\n\n {/* Progress Bar */}\n <div className=\"px-4 pt-4\">\n <div className=\"relative h-2 bg-[hsl(var(--muted))] rounded-full overflow-visible\">\n <div\n className=\"absolute h-full bg-[hsl(var(--primary))] rounded-full transition-all\"\n style={{ width: `${progress}%` }}\n />\n {/* Chapter Markers */}\n {showChapters && chapters.length > 0 && chapters.map((chapter, index) => {\n const markerPosition = duration > 0 ? (chapter.startTime / duration) * 100 : 0;\n return (\n <div\n key={index}\n className=\"absolute top-0 bottom-0 w-1 -ml-0.5 bg-[hsl(var(--background))] opacity-70 hover:opacity-100 hover:w-1.5 hover:-ml-0.5 cursor-pointer z-10 transition-all\"\n style={{ left: `${markerPosition}%` }}\n onClick={() => jumpToChapter(chapter)}\n onMouseEnter={(e) => {\n setHoveredChapter(chapter);\n const rect = e.currentTarget.getBoundingClientRect();\n setHoverPosition({ x: rect.left + rect.width / 2, y: rect.top });\n }}\n onMouseLeave={() => setHoveredChapter(null)}\n />\n );\n })}\n\n {/* Chapter Hover Tooltip */}\n {hoveredChapter && showChapters && (\n <div\n className=\"fixed z-50 px-3 py-2 bg-[hsl(var(--popover))] text-white text-xs font-medium rounded shadow-lg pointer-events-none transform -translate-x-1/2 -translate-y-full\"\n style={{ left: hoverPosition.x, top: hoverPosition.y - 8 }}\n >\n <div className=\"whitespace-nowrap\">{hoveredChapter.title}</div>\n <div className=\"text-[hsl(var(--muted-foreground))] text-[10px] mt-0.5\">{formatTime(hoveredChapter.startTime)}</div>\n <div className=\"absolute left-1/2 -bottom-1 w-2 h-2 bg-[hsl(var(--popover))] transform -translate-x-1/2 rotate-45\" />\n </div>\n )}\n <input\n type=\"range\"\n min={0}\n max={duration || 0}\n value={currentTime}\n onChange={handleSeek}\n disabled={isLoading}\n className=\"absolute inset-0 w-full h-full opacity-0 cursor-pointer disabled:cursor-not-allowed z-20\"\n aria-label=\"Seek\"\n />\n </div>\n <div className=\"flex justify-between items-center mt-1 text-xs text-[hsl(var(--muted-foreground))] tabular-nums\">\n <span>{formatTime(currentTime)}</span>\n {currentChapter && showChapters && (\n <span className=\"text-[hsl(var(--primary))] font-medium truncate max-w-[200px]\">\n {currentChapter.title}\n </span>\n )}\n <span>{formatTime(duration)}</span>\n </div>\n </div>\n\n {/* Controls */}\n <div className=\"flex items-center justify-between px-4 py-4\">\n {/* Left side - Volume */}\n <div className=\"flex items-center gap-2 flex-1\">\n <button\n onClick={toggleMute}\n className=\"text-[hsl(var(--muted-foreground))] hover:text-[hsl(var(--foreground))] transition-colors\"\n aria-label={isMuted ? 'Unmute' : 'Mute'}\n >\n {isMuted ? <VolumeOffIcon size=\"md\" /> : <VolumeUpIcon size=\"md\" />}\n </button>\n <input\n type=\"range\"\n min={0}\n max={1}\n step={0.01}\n value={isMuted ? 0 : volume}\n onChange={handleVolumeChange}\n className=\"w-20 h-1.5 bg-[hsl(var(--muted))] rounded-full appearance-none cursor-pointer\n [&::-webkit-slider-thumb]:appearance-none [&::-webkit-slider-thumb]:w-3 [&::-webkit-slider-thumb]:h-3\n [&::-webkit-slider-thumb]:rounded-full [&::-webkit-slider-thumb]:bg-[hsl(var(--primary))] [&::-webkit-slider-thumb]:cursor-pointer\n [&::-moz-range-thumb]:w-3 [&::-moz-range-thumb]:h-3 [&::-moz-range-thumb]:rounded-full\n [&::-moz-range-thumb]:bg-[hsl(var(--primary))] [&::-moz-range-thumb]:cursor-pointer [&::-moz-range-thumb]:border-none\"\n aria-label=\"Volume\"\n />\n </div>\n\n {/* Center - Playback Controls */}\n <div className=\"flex items-center gap-2\">\n {showSkipButtons && (\n <Button\n iconOnly\n size=\"md\"\n variant=\"secondary\"\n onClick={handleSkipBack}\n disabled={isLoading}\n aria-label=\"Skip back 10 seconds\"\n >\n <SkipBackIcon size=\"md\" />\n </Button>\n )}\n\n <Button\n iconOnly\n size=\"lg\"\n variant=\"primary\"\n onClick={togglePlayPause}\n disabled={isLoading}\n aria-label={isPlaying ? 'Pause' : 'Play'}\n >\n {isPlaying ? <PauseIcon size=\"lg\" /> : <PlayIcon size=\"lg\" />}\n </Button>\n\n {showSkipButtons && (\n <Button\n iconOnly\n size=\"md\"\n variant=\"secondary\"\n onClick={handleSkipForward}\n disabled={isLoading}\n aria-label=\"Skip forward 10 seconds\"\n >\n <SkipForwardIcon size=\"md\" />\n </Button>\n )}\n </div>\n\n {/* Right side - Chapter menu toggle */}\n <div className=\"flex-1 flex justify-end\">\n {showChapters && chapters.length > 0 && (\n <button\n onClick={() => setShowChapterList(!showChapterList)}\n className=\"text-sm text-[hsl(var(--muted-foreground))] hover:text-[hsl(var(--foreground))] transition-colors\"\n aria-label=\"Toggle chapters\"\n >\n Chapters ({chapters.length})\n </button>\n )}\n </div>\n </div>\n\n {/* Chapter List */}\n {showChapters && showChapterList && chapters.length > 0 && (\n <div className=\"border-t border-[hsl(var(--border))] bg-[hsl(var(--muted))]/50 max-h-48 overflow-y-auto\">\n {chapters.map((chapter, index) => {\n const isCurrentChapter = currentChapter?.startTime === chapter.startTime;\n return (\n <button\n key={index}\n onClick={() => jumpToChapter(chapter)}\n className={`w-full text-left px-4 py-2 hover:bg-[hsl(var(--accent))] transition-colors ${\n isCurrentChapter ? 'bg-[hsl(var(--primary))]/10 border-l-2 border-[hsl(var(--primary))]' : ''\n }`}\n >\n <div className=\"flex items-center justify-between gap-2\">\n <span className={`text-sm font-medium ${\n isCurrentChapter ? 'text-[hsl(var(--primary))]' : 'text-[hsl(var(--foreground))]'\n }`}>\n {chapter.title}\n </span>\n <span className=\"text-xs text-[hsl(var(--muted-foreground))] tabular-nums\">\n {formatTime(chapter.startTime)}\n </span>\n </div>\n </button>\n );\n })}\n </div>\n )}\n </div>\n );\n};\n","\"use client\";\n\nimport React, { useRef, useState, useEffect } from 'react';\nimport { PlayIcon } from '../icons/PlayIcon';\nimport { PauseIcon } from '../icons/PauseIcon';\nimport { VolumeUpIcon } from '../icons/VolumeUpIcon';\nimport { VolumeOffIcon } from '../icons/VolumeOffIcon';\nimport { FullscreenIcon } from '../icons/FullscreenIcon';\nimport { FullscreenExitIcon } from '../icons/FullscreenExitIcon';\nimport { Button } from './Button';\nimport type { Chapter } from './AudioPlayer';\n\nexport interface VideoPlayerProps {\n src: string;\n poster?: string;\n title?: string;\n variant?: 'default' | 'compact';\n autoPlay?: boolean;\n loop?: boolean;\n muted?: boolean;\n controls?: boolean;\n preload?: 'none' | 'metadata' | 'auto';\n width?: string | number;\n height?: string | number;\n aspectRatio?: '16:9' | '4:3' | '21:9' | '1:1';\n onPlay?: () => void;\n onPause?: () => void;\n onEnded?: () => void;\n onTimeUpdate?: (currentTime: number) => void;\n className?: string;\n showControls?: boolean;\n chapters?: Chapter[];\n showChapters?: boolean;\n onChapterChange?: (chapter: Chapter) => void;\n}\n\nexport const VideoPlayer: React.FC<VideoPlayerProps> = ({\n src,\n poster,\n title,\n variant = 'default',\n autoPlay = false,\n loop = false,\n muted = false,\n controls = false,\n preload = 'metadata',\n width,\n height,\n aspectRatio = '16:9',\n onPlay,\n onPause,\n onEnded,\n onTimeUpdate,\n className = '',\n showControls = true,\n chapters = [],\n showChapters = true,\n onChapterChange,\n}) => {\n const videoRef = useRef<HTMLVideoElement>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n const [isPlaying, setIsPlaying] = useState(false);\n const [currentTime, setCurrentTime] = useState(0);\n const [duration, setDuration] = useState(0);\n const [volume, setVolume] = useState(muted ? 0 : 1);\n const [isMuted, setIsMuted] = useState(muted);\n const [isLoading, setIsLoading] = useState(true);\n const [isFullscreen, setIsFullscreen] = useState(false);\n const [showControlsOverlay, setShowControlsOverlay] = useState(true);\n const hideControlsTimeout = useRef<NodeJS.Timeout | null>(null);\n const [currentChapter, setCurrentChapter] = useState<Chapter | null>(null);\n const [hoveredChapter, setHoveredChapter] = useState<Chapter | null>(null);\n const [hoverPosition, setHoverPosition] = useState({ x: 0, y: 0 });\n\n useEffect(() => {\n const video = videoRef.current;\n if (!video) return;\n\n const handleLoadedMetadata = () => {\n setDuration(video.duration);\n setIsLoading(false);\n };\n\n const handleCanPlay = () => {\n setIsLoading(false);\n };\n\n const handleTimeUpdate = () => {\n setCurrentTime(video.currentTime);\n onTimeUpdate?.(video.currentTime);\n\n // Update current chapter\n if (chapters.length > 0) {\n const chapter = getCurrentChapter(video.currentTime);\n if (chapter && chapter !== currentChapter) {\n setCurrentChapter(chapter);\n onChapterChange?.(chapter);\n }\n }\n };\n\n const handleEnded = () => {\n setIsPlaying(false);\n onEnded?.();\n };\n\n const handlePlay = () => {\n setIsPlaying(true);\n onPlay?.();\n };\n\n const handlePause = () => {\n setIsPlaying(false);\n onPause?.();\n };\n\n const handleError = (e: Event) => {\n console.error('Video error:', e);\n setIsPlaying(false);\n setIsLoading(false);\n };\n\n const handleLoadStart = () => {\n setIsLoading(true);\n };\n\n const handleFullscreenChange = () => {\n setIsFullscreen(!!document.fullscreenElement);\n };\n\n video.addEventListener('loadstart', handleLoadStart);\n video.addEventListener('loadedmetadata', handleLoadedMetadata);\n video.addEventListener('canplay', handleCanPlay);\n video.addEventListener('timeupdate', handleTimeUpdate);\n video.addEventListener('ended', handleEnded);\n video.addEventListener('play', handlePlay);\n video.addEventListener('pause', handlePause);\n video.addEventListener('error', handleError);\n document.addEventListener('fullscreenchange', handleFullscreenChange);\n\n // Check if video is ready\n if (video.readyState >= 2) {\n setIsLoading(false);\n setDuration(video.duration);\n }\n\n return () => {\n video.removeEventListener('loadstart', handleLoadStart);\n video.removeEventListener('loadedmetadata', handleLoadedMetadata);\n video.removeEventListener('canplay', handleCanPlay);\n video.removeEventListener('timeupdate', handleTimeUpdate);\n video.removeEventListener('ended', handleEnded);\n video.removeEventListener('play', handlePlay);\n video.removeEventListener('pause', handlePause);\n video.removeEventListener('error', handleError);\n document.removeEventListener('fullscreenchange', handleFullscreenChange);\n };\n }, [onPlay, onPause, onEnded, onTimeUpdate]);\n\n // Separate effect for src changes\n useEffect(() => {\n const video = videoRef.current;\n if (!video) return;\n video.load();\n }, [src]);\n\n // Auto-hide controls in fullscreen\n useEffect(() => {\n if (!isFullscreen || !isPlaying) return;\n\n const resetTimeout = () => {\n if (hideControlsTimeout.current) {\n clearTimeout(hideControlsTimeout.current);\n }\n setShowControlsOverlay(true);\n hideControlsTimeout.current = setTimeout(() => {\n setShowControlsOverlay(false);\n }, 3000);\n };\n\n resetTimeout();\n\n return () => {\n if (hideControlsTimeout.current) {\n clearTimeout(hideControlsTimeout.current);\n }\n };\n }, [isFullscreen, isPlaying, currentTime]);\n\n const togglePlayPause = async () => {\n const video = videoRef.current;\n if (!video) return;\n\n try {\n if (isPlaying) {\n video.pause();\n } else {\n await video.play();\n }\n } catch (error) {\n console.error('Playback error:', error);\n setIsPlaying(false);\n }\n };\n\n const handleSeek = (e: React.ChangeEvent<HTMLInputElement>) => {\n const video = videoRef.current;\n if (!video) return;\n\n const time = parseFloat(e.target.value);\n video.currentTime = time;\n setCurrentTime(time);\n };\n\n const handleVolumeChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const video = videoRef.current;\n if (!video) return;\n\n const vol = parseFloat(e.target.value);\n video.volume = vol;\n setVolume(vol);\n setIsMuted(vol === 0);\n };\n\n const toggleMute = () => {\n const video = videoRef.current;\n if (!video) return;\n\n if (isMuted) {\n video.volume = volume || 0.5;\n video.muted = false;\n setIsMuted(false);\n } else {\n video.volume = 0;\n video.muted = true;\n setIsMuted(true);\n }\n };\n\n const toggleFullscreen = async () => {\n const container = containerRef.current;\n if (!container) return;\n\n try {\n if (!document.fullscreenElement) {\n await container.requestFullscreen();\n } else {\n await document.exitFullscreen();\n }\n } catch (error) {\n console.error('Fullscreen error:', error);\n }\n };\n\n const formatTime = (time: number): string => {\n if (!isFinite(time)) return '0:00';\n const minutes = Math.floor(time / 60);\n const seconds = Math.floor(time % 60);\n return `${minutes}:${seconds.toString().padStart(2, '0')}`;\n };\n\n const getCurrentChapter = (time: number): Chapter | null => {\n if (chapters.length === 0) return null;\n\n // Find the chapter that the current time falls into\n for (let i = chapters.length - 1; i >= 0; i--) {\n if (time >= chapters[i].startTime) {\n return chapters[i];\n }\n }\n return chapters[0];\n };\n\n const jumpToChapter = (chapter: Chapter) => {\n const video = videoRef.current;\n if (!video) return;\n\n video.currentTime = chapter.startTime;\n setCurrentTime(chapter.startTime);\n };\n\n const progress = duration > 0 ? (currentTime / duration) * 100 : 0;\n\n const aspectRatioClasses = {\n '16:9': 'aspect-video',\n '4:3': 'aspect-[4/3]',\n '21:9': 'aspect-[21/9]',\n '1:1': 'aspect-square',\n };\n\n const handleMouseMove = () => {\n if (isFullscreen) {\n setShowControlsOverlay(true);\n if (hideControlsTimeout.current) {\n clearTimeout(hideControlsTimeout.current);\n }\n hideControlsTimeout.current = setTimeout(() => {\n if (isPlaying) {\n setShowControlsOverlay(false);\n }\n }, 3000);\n }\n };\n\n // Compact variant - video with minimal controls overlay\n if (variant === 'compact') {\n return (\n <div\n ref={containerRef}\n className={`relative bg-black rounded-lg overflow-hidden ${aspectRatioClasses[aspectRatio]} ${className}`}\n style={{ width, height }}\n onMouseMove={handleMouseMove}\n >\n <video\n ref={videoRef}\n src={src}\n poster={poster}\n preload={preload}\n loop={loop}\n muted={muted}\n autoPlay={autoPlay}\n className=\"w-full h-full object-contain\"\n onClick={togglePlayPause}\n />\n\n {showControls && (\n <div className={`absolute inset-0 bg-gradient-to-t from-black/70 via-transparent to-transparent transition-opacity ${showControlsOverlay || !isPlaying ? 'opacity-100' : 'opacity-0'}`}>\n {/* Play/Pause Overlay */}\n <div className=\"absolute inset-0 flex items-center justify-center\">\n <Button\n iconOnly\n size=\"xl\"\n variant=\"primary\"\n onClick={togglePlayPause}\n disabled={isLoading}\n className=\"!w-16 !h-16 !rounded-full bg-white/20 hover:bg-white/30 backdrop-blur-sm\"\n aria-label={isPlaying ? 'Pause' : 'Play'}\n >\n {isPlaying ? <PauseIcon size=\"xl\" /> : <PlayIcon size=\"xl\" />}\n </Button>\n </div>\n\n {/* Bottom Controls */}\n <div className=\"absolute bottom-0 left-0 right-0 p-3 space-y-2\">\n {/* Progress Bar */}\n <div className=\"relative h-1 bg-white/30 rounded-full overflow-visible\">\n <div\n className=\"absolute h-full bg-[hsl(var(--primary))] rounded-full transition-all\"\n style={{ width: `${progress}%` }}\n />\n {/* Chapter Markers */}\n {showChapters && chapters.length > 0 && chapters.map((chapter, index) => {\n const markerPosition = duration > 0 ? (chapter.startTime / duration) * 100 : 0;\n return (\n <div\n key={index}\n className=\"absolute top-0 bottom-0 w-1 -ml-0.5 bg-white opacity-70 hover:opacity-100 hover:w-1.5 hover:-ml-0.5 cursor-pointer z-10 transition-all\"\n style={{ left: `${markerPosition}%` }}\n onClick={() => jumpToChapter(chapter)}\n onMouseEnter={(e) => {\n setHoveredChapter(chapter);\n const rect = e.currentTarget.getBoundingClientRect();\n setHoverPosition({ x: rect.left + rect.width / 2, y: rect.top });\n }}\n onMouseLeave={() => setHoveredChapter(null)}\n />\n );\n })}\n <input\n type=\"range\"\n min={0}\n max={duration || 0}\n value={currentTime}\n onChange={handleSeek}\n disabled={isLoading}\n className=\"absolute inset-0 w-full h-full opacity-0 cursor-pointer disabled:cursor-not-allowed z-20\"\n aria-label=\"Seek\"\n />\n </div>\n\n {/* Controls Row */}\n <div className=\"flex items-center justify-between gap-2\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs text-white tabular-nums\">\n {formatTime(currentTime)} / {formatTime(duration)}\n </span>\n {currentChapter && showChapters && (\n <span className=\"text-xs text-white/90 font-medium truncate max-w-[150px]\">\n • {currentChapter.title}\n </span>\n )}\n </div>\n\n <div className=\"flex items-center gap-2\">\n <button\n onClick={toggleMute}\n className=\"text-white hover:text-[hsl(var(--foreground))] transition-colors\"\n aria-label={isMuted ? 'Unmute' : 'Mute'}\n >\n {isMuted ? <VolumeOffIcon size=\"sm\" /> : <VolumeUpIcon size=\"sm\" />}\n </button>\n <button\n onClick={toggleFullscreen}\n className=\"text-white hover:text-[hsl(var(--foreground))] transition-colors\"\n aria-label={isFullscreen ? 'Exit fullscreen' : 'Enter fullscreen'}\n >\n {isFullscreen ? <FullscreenExitIcon size=\"sm\" /> : <FullscreenIcon size=\"sm\" />}\n </button>\n </div>\n </div>\n </div>\n </div>\n )}\n\n {/* Chapter Hover Tooltip */}\n {hoveredChapter && showChapters && (\n <div\n className=\"fixed z-50 px-3 py-2 bg-[hsl(var(--popover))] text-white text-xs font-medium rounded shadow-lg pointer-events-none transform -translate-x-1/2 -translate-y-full\"\n style={{ left: hoverPosition.x, top: hoverPosition.y - 8 }}\n >\n <div className=\"whitespace-nowrap\">{hoveredChapter.title}</div>\n <div className=\"text-[hsl(var(--muted-foreground))] text-[10px] mt-0.5\">{formatTime(hoveredChapter.startTime)}</div>\n <div className=\"absolute left-1/2 -bottom-1 w-2 h-2 bg-[hsl(var(--popover))] transform -translate-x-1/2 rotate-45\" />\n </div>\n )}\n </div>\n );\n }\n\n // Default variant - full featured player\n return (\n <div className={`bg-[hsl(var(--card))] rounded-lg border border-[hsl(var(--border))] shadow-md overflow-hidden ${className}`}>\n {title && (\n <div className=\"px-4 py-3 border-b border-[hsl(var(--border))]\">\n <h3 className=\"text-base font-semibold text-[hsl(var(--foreground))] truncate\">\n {title}\n </h3>\n </div>\n )}\n\n <div\n ref={containerRef}\n className={`relative bg-black ${aspectRatioClasses[aspectRatio]}`}\n style={{ width, height }}\n onMouseMove={handleMouseMove}\n >\n <video\n ref={videoRef}\n src={src}\n poster={poster}\n preload={preload}\n loop={loop}\n muted={muted}\n autoPlay={autoPlay}\n controls={controls}\n className=\"w-full h-full object-contain\"\n onClick={togglePlayPause}\n />\n\n {showControls && !controls && (\n <div className={`absolute inset-0 bg-gradient-to-t from-black/70 via-transparent to-transparent transition-opacity ${showControlsOverlay || !isPlaying ? 'opacity-100' : 'opacity-0'}`}>\n {/* Play/Pause Overlay */}\n <div className=\"absolute inset-0 flex items-center justify-center\">\n <Button\n iconOnly\n size=\"xl\"\n variant=\"primary\"\n onClick={togglePlayPause}\n disabled={isLoading}\n className=\"!w-20 !h-20 !rounded-full bg-white/20 hover:bg-white/30 backdrop-blur-sm\"\n aria-label={isPlaying ? 'Pause' : 'Play'}\n >\n {isPlaying ? <PauseIcon size=\"xl\" /> : <PlayIcon size=\"xl\" />}\n </Button>\n </div>\n\n {/* Bottom Controls */}\n <div className=\"absolute bottom-0 left-0 right-0 p-4 space-y-3\">\n {/* Progress Bar */}\n <div className=\"relative h-1.5 bg-white/30 rounded-full overflow-visible\">\n <div\n className=\"absolute h-full bg-[hsl(var(--primary))] rounded-full transition-all\"\n style={{ width: `${progress}%` }}\n />\n {/* Chapter Markers */}\n {showChapters && chapters.length > 0 && chapters.map((chapter, index) => {\n const markerPosition = duration > 0 ? (chapter.startTime / duration) * 100 : 0;\n return (\n <div\n key={index}\n className=\"absolute top-0 bottom-0 w-1 -ml-0.5 bg-white opacity-70 hover:opacity-100 hover:w-1.5 hover:-ml-0.5 cursor-pointer z-10 transition-all\"\n style={{ left: `${markerPosition}%` }}\n onClick={() => jumpToChapter(chapter)}\n onMouseEnter={(e) => {\n setHoveredChapter(chapter);\n const rect = e.currentTarget.getBoundingClientRect();\n setHoverPosition({ x: rect.left + rect.width / 2, y: rect.top });\n }}\n onMouseLeave={() => setHoveredChapter(null)}\n />\n );\n })}\n <input\n type=\"range\"\n min={0}\n max={duration || 0}\n value={currentTime}\n onChange={handleSeek}\n disabled={isLoading}\n className=\"absolute inset-0 w-full h-full opacity-0 cursor-pointer disabled:cursor-not-allowed z-20\"\n aria-label=\"Seek\"\n />\n </div>\n\n {/* Controls Row */}\n <div className=\"flex items-center justify-between gap-4\">\n <div className=\"flex items-center gap-3\">\n <Button\n iconOnly\n size=\"md\"\n variant=\"secondary\"\n onClick={togglePlayPause}\n disabled={isLoading}\n className=\"bg-white/20 hover:bg-white/30 backdrop-blur-sm border-white/30\"\n aria-label={isPlaying ? 'Pause' : 'Play'}\n >\n {isPlaying ? <PauseIcon size=\"md\" /> : <PlayIcon size=\"md\" />}\n </Button>\n\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm text-white tabular-nums\">\n {formatTime(currentTime)} / {formatTime(duration)}\n </span>\n {currentChapter && showChapters && (\n <span className=\"text-sm text-white/90 font-medium truncate max-w-[200px]\">\n • {currentChapter.title}\n </span>\n )}\n </div>\n </div>\n\n <div className=\"flex items-center gap-3\">\n <div className=\"flex items-center gap-2\">\n <button\n onClick={toggleMute}\n className=\"text-white hover:text-[hsl(var(--foreground))] transition-colors\"\n aria-label={isMuted ? 'Unmute' : 'Mute'}\n >\n {isMuted ? <VolumeOffIcon size=\"md\" /> : <VolumeUpIcon size=\"md\" />}\n </button>\n <input\n type=\"range\"\n min={0}\n max={1}\n step={0.01}\n value={isMuted ? 0 : volume}\n onChange={handleVolumeChange}\n className=\"w-20 h-1.5 bg-white/30 rounded-full appearance-none cursor-pointer\n [&::-webkit-slider-thumb]:appearance-none [&::-webkit-slider-thumb]:w-3 [&::-webkit-slider-thumb]:h-3\n [&::-webkit-slider-thumb]:rounded-full [&::-webkit-slider-thumb]:bg-white [&::-webkit-slider-thumb]:cursor-pointer\n [&::-moz-range-thumb]:w-3 [&::-moz-range-thumb]:h-3 [&::-moz-range-thumb]:rounded-full\n [&::-moz-range-thumb]:bg-white [&::-moz-range-thumb]:cursor-pointer [&::-moz-range-thumb]:border-none\"\n aria-label=\"Volume\"\n />\n </div>\n\n <button\n onClick={toggleFullscreen}\n className=\"text-white hover:text-[hsl(var(--foreground))] transition-colors\"\n aria-label={isFullscreen ? 'Exit fullscreen' : 'Enter fullscreen'}\n >\n {isFullscreen ? <FullscreenExitIcon size=\"md\" /> : <FullscreenIcon size=\"md\" />}\n </button>\n </div>\n </div>\n </div>\n </div>\n )}\n\n {/* Chapter Hover Tooltip */}\n {hoveredChapter && showChapters && (\n <div\n className=\"fixed z-50 px-3 py-2 bg-[hsl(var(--popover))] text-white text-xs font-medium rounded shadow-lg pointer-events-none transform -translate-x-1/2 -translate-y-full\"\n style={{ left: hoverPosition.x, top: hoverPosition.y - 8 }}\n >\n <div className=\"whitespace-nowrap\">{hoveredChapter.title}</div>\n <div className=\"text-[hsl(var(--muted-foreground))] text-[10px] mt-0.5\">{formatTime(hoveredChapter.startTime)}</div>\n <div className=\"absolute left-1/2 -bottom-1 w-2 h-2 bg-[hsl(var(--popover))] transform -translate-x-1/2 rotate-45\" />\n </div>\n )}\n </div>\n </div>\n );\n};\n","\"use client\";\n\nimport React, { useMemo, useCallback, useRef, useState } from 'react';\nimport { CHART_DEFAULTS } from './constants';\nimport { scaleLinear, scaleTime, calculateDomain, getTicks } from './utils/scales';\nimport { generateLinePath, generateMonotonePath, generateStepPath } from './utils/paths';\nimport { formatNumber, formatDate, createTickFormatter } from './utils/format';\nimport { ChartTooltip, useTooltip, type TooltipPayloadItem } from './components/ChartTooltip';\nimport { Legend, type LegendItem } from './components/Legend';\nimport { ReferenceLine, type ReferenceLineProps } from './components/ReferenceLine';\nimport { ReferenceArea, type ReferenceAreaProps } from './components/ReferenceArea';\nimport { CartesianGrid, type CartesianGridProps } from './components/CartesianGrid';\n\nexport interface LineChartDataPoint {\n x: string | number | Date;\n y: number;\n [key: string]: unknown;\n}\n\nexport interface LineChartSeries {\n name: string;\n data: LineChartDataPoint[];\n color?: string;\n strokeWidth?: number;\n type?: 'linear' | 'monotone' | 'step' | 'stepBefore' | 'stepAfter';\n dot?: boolean;\n activeDot?: boolean;\n connectNulls?: boolean;\n}\n\nexport interface LineChartProps {\n /** Chart data - array of series */\n data: LineChartSeries[];\n /** Chart width in pixels (or use ResponsiveContainer) */\n width?: number;\n /** Chart height in pixels (or use ResponsiveContainer) */\n height?: number;\n /** Padding inside the chart */\n padding?: { top?: number; right?: number; bottom?: number; left?: number };\n /** Show grid lines */\n showGrid?: boolean;\n /** Show X axis */\n showXAxis?: boolean;\n /** Show Y axis */\n showYAxis?: boolean;\n /** Show legend */\n showLegend?: boolean;\n /** Show tooltip on hover */\n showTooltip?: boolean;\n /** Show dots on data points */\n showDots?: boolean;\n /** Animate on load and data change */\n animate?: boolean;\n /** Animation duration in ms */\n animationDuration?: number;\n /** X axis label */\n xAxisLabel?: string;\n /** Y axis label */\n yAxisLabel?: string;\n /** Number of Y axis ticks */\n yAxisTickCount?: number;\n /** Custom Y axis domain [min, max] */\n yDomain?: [number, number];\n /** Custom X axis formatter */\n formatXValue?: (value: string | number | Date) => string;\n /** Custom Y axis formatter */\n formatYValue?: (value: number) => string;\n /** Custom tooltip formatter */\n tooltipFormatter?: (value: number | string, name: string, payload: TooltipPayloadItem) => string;\n /** Custom tooltip label formatter */\n tooltipLabelFormatter?: (label: string | number) => string;\n /** Custom tooltip content component */\n tooltipContent?: React.FC<any>;\n /** Click handler for data points */\n onPointClick?: (data: LineChartDataPoint, seriesIndex: number, pointIndex: number) => void;\n /** Hover handler for data points */\n onPointHover?: (data: LineChartDataPoint | null, seriesIndex: number, pointIndex: number) => void;\n /** Show crosshair on hover */\n showCrosshair?: boolean;\n /** Show value labels at end of lines */\n showValueLabels?: boolean;\n /** Custom CSS class */\n className?: string;\n /** Chart children (ReferenceLine, ReferenceArea, etc.) */\n children?: React.ReactNode;\n /** Custom colors array */\n colors?: string[];\n /** ARIA label for accessibility */\n ariaLabel?: string;\n}\n\nexport const LineChart: React.FC<LineChartProps> = ({\n data,\n width: providedWidth,\n height: providedHeight,\n padding: customPadding,\n showGrid = true,\n showXAxis = true,\n showYAxis = true,\n showLegend = true,\n showTooltip = true,\n showDots = true,\n animate = true,\n animationDuration = CHART_DEFAULTS.animation.duration,\n xAxisLabel,\n yAxisLabel,\n yAxisTickCount = 5,\n yDomain,\n formatXValue,\n formatYValue,\n tooltipFormatter,\n tooltipLabelFormatter,\n tooltipContent,\n onPointClick,\n onPointHover,\n showCrosshair = false,\n showValueLabels = false,\n className = '',\n children,\n colors = CHART_DEFAULTS.colors,\n ariaLabel,\n}) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const svgRef = useRef<SVGSVGElement>(null);\n const [hoveredPoint, setHoveredPoint] = useState<{\n seriesIndex: number;\n pointIndex: number;\n } | null>(null);\n const [crosshairX, setCrosshairX] = useState<number | null>(null);\n\n const { tooltipData, showTooltip: showTooltipFn, hideTooltip } = useTooltip();\n\n // Dimensions\n const width = providedWidth || 800;\n const height = providedHeight || 400;\n\n const padding = useMemo(() => ({\n top: customPadding?.top ?? CHART_DEFAULTS.padding.top,\n right: customPadding?.right ?? (showValueLabels ? 80 : CHART_DEFAULTS.padding.right),\n bottom: customPadding?.bottom ?? (showXAxis ? 60 : CHART_DEFAULTS.padding.bottom),\n left: customPadding?.left ?? (showYAxis ? 60 : CHART_DEFAULTS.padding.left),\n }), [customPadding, showXAxis, showYAxis, showValueLabels]);\n\n const chartWidth = width - padding.left - padding.right;\n const chartHeight = height - padding.top - padding.bottom;\n\n // Collect all data points\n const allPoints = useMemo(() =>\n data.flatMap(series => series.data),\n [data]\n );\n\n // Determine X value type\n const xValueType = useMemo(() => {\n const firstX = data[0]?.data[0]?.x;\n if (firstX instanceof Date) return 'date';\n if (typeof firstX === 'number') return 'number';\n return 'string';\n }, [data]);\n\n // Calculate domains\n const xDomainCalc = useMemo(() => {\n if (xValueType === 'date') {\n const dates = allPoints.map(p => (p.x as Date).getTime());\n return [Math.min(...dates), Math.max(...dates)] as [number, number];\n }\n if (xValueType === 'number') {\n const nums = allPoints.map(p => p.x as number);\n return [Math.min(...nums), Math.max(...nums)] as [number, number];\n }\n // For strings, use index-based\n const maxLen = Math.max(...data.map(s => s.data.length));\n return [0, maxLen - 1] as [number, number];\n }, [allPoints, xValueType, data]);\n\n const yDomainCalc = useMemo(() => {\n if (yDomain) return yDomain;\n const yValues = allPoints.map(p => p.y);\n return calculateDomain(yValues, { includeZero: true, padding: 0.1 });\n }, [allPoints, yDomain]);\n\n // Create scale functions (memoized for performance)\n const xScale = useMemo(() => {\n if (xValueType === 'date') {\n return (value: string | number | Date) => {\n const time = value instanceof Date ? value.getTime() : Number(value);\n return scaleLinear({\n domain: xDomainCalc,\n range: [0, chartWidth],\n })(time);\n };\n }\n if (xValueType === 'number') {\n const scale = scaleLinear({\n domain: xDomainCalc,\n range: [0, chartWidth],\n });\n return (value: string | number | Date) => scale(Number(value));\n }\n // String - index based\n return (_value: string | number | Date, index: number = 0) => {\n const maxLen = Math.max(...data.map(s => s.data.length)) - 1;\n if (maxLen === 0) return chartWidth / 2;\n return (index / maxLen) * chartWidth;\n };\n }, [xValueType, xDomainCalc, chartWidth, data]);\n\n const yScale = useMemo(() =>\n scaleLinear({\n domain: yDomainCalc,\n range: [chartHeight, 0],\n }),\n [yDomainCalc, chartHeight]\n );\n\n // Generate Y axis ticks\n const yTicks = useMemo(() =>\n getTicks(yDomainCalc, yAxisTickCount),\n [yDomainCalc, yAxisTickCount]\n );\n\n // Generate X axis ticks\n const xTicks = useMemo(() => {\n if (xValueType === 'string') {\n // Use actual x values from first series\n return data[0]?.data.map((p, i) => ({ value: p.x, index: i })) || [];\n }\n const tickCount = Math.min(6, Math.max(2, data[0]?.data.length || 2));\n const ticks = getTicks(xDomainCalc, tickCount);\n return ticks.map(t => ({ value: t, index: 0 }));\n }, [xValueType, xDomainCalc, data]);\n\n // Format functions\n const xFormatter = useCallback((value: string | number | Date) => {\n if (formatXValue) return formatXValue(value);\n if (value instanceof Date) {\n const range = xDomainCalc[1] - xDomainCalc[0];\n return formatDate(value, range);\n }\n return String(value);\n }, [formatXValue, xDomainCalc]);\n\n const yFormatter = useMemo(() => {\n if (formatYValue) return formatYValue;\n return createTickFormatter(yDomainCalc);\n }, [formatYValue, yDomainCalc]);\n\n // Generate paths for each series (memoized)\n const seriesPaths = useMemo(() => {\n return data.map((series) => {\n const points = series.data.map((point, i) => ({\n x: xScale(point.x, i),\n y: yScale(point.y),\n }));\n\n const type = series.type || 'linear';\n let path: string;\n\n switch (type) {\n case 'monotone':\n path = generateMonotonePath(points);\n break;\n case 'step':\n case 'stepAfter':\n path = generateStepPath(points, 'after');\n break;\n case 'stepBefore':\n path = generateStepPath(points, 'before');\n break;\n default:\n path = generateLinePath(points);\n }\n\n return { points, path };\n });\n }, [data, xScale, yScale]);\n\n // Handle point interactions\n const handlePointEnter = useCallback((\n e: React.MouseEvent,\n seriesIndex: number,\n pointIndex: number\n ) => {\n const series = data[seriesIndex];\n const point = series.data[pointIndex];\n const scaledPoint = seriesPaths[seriesIndex].points[pointIndex];\n\n setHoveredPoint({ seriesIndex, pointIndex });\n\n if (showCrosshair) {\n setCrosshairX(scaledPoint.x);\n }\n\n if (showTooltip && containerRef.current) {\n const rect = containerRef.current.getBoundingClientRect();\n const mouseX = e.clientX - rect.left;\n const mouseY = e.clientY - rect.top;\n\n const payload: TooltipPayloadItem[] = [{\n name: series.name,\n value: point.y,\n color: series.color || colors[seriesIndex % colors.length],\n payload: point,\n }];\n\n showTooltipFn({\n x: mouseX,\n y: mouseY,\n label: xFormatter(point.x),\n payload,\n });\n }\n\n onPointHover?.(point, seriesIndex, pointIndex);\n }, [data, seriesPaths, showCrosshair, showTooltip, colors, xFormatter, showTooltipFn, onPointHover]);\n\n const handlePointLeave = useCallback(() => {\n setHoveredPoint(null);\n setCrosshairX(null);\n hideTooltip();\n onPointHover?.(null, -1, -1);\n }, [hideTooltip, onPointHover]);\n\n const handlePointClick = useCallback((\n seriesIndex: number,\n pointIndex: number\n ) => {\n const point = data[seriesIndex].data[pointIndex];\n onPointClick?.(point, seriesIndex, pointIndex);\n }, [data, onPointClick]);\n\n // Prepare legend items\n const legendItems: LegendItem[] = useMemo(() =>\n data.map((series, i) => ({\n name: series.name,\n color: series.color || colors[i % colors.length],\n type: 'line' as const,\n })),\n [data, colors]\n );\n\n // Prepare reference components with injected props\n const referenceElements = useMemo(() => {\n if (!children) return null;\n\n const chartDimensions = {\n width: chartWidth,\n height: chartHeight,\n padding,\n };\n\n const scales = {\n xScale: (value: number | string | Date) => {\n if (xValueType === 'string') {\n const index = data[0]?.data.findIndex(p => p.x === value) ?? 0;\n return xScale(value, index);\n }\n return xScale(value, 0);\n },\n yScale,\n };\n\n return React.Children.map(children, (child) => {\n if (!React.isValidElement(child)) return child;\n\n // Inject chart dimensions and scales into reference components\n if (\n child.type === ReferenceLine ||\n child.type === ReferenceArea ||\n child.type === CartesianGrid\n ) {\n return React.cloneElement(child as React.ReactElement<any>, {\n _chartDimensions: chartDimensions,\n _scales: scales,\n });\n }\n\n return child;\n });\n }, [children, chartWidth, chartHeight, padding, xScale, yScale, xValueType, data]);\n\n // Generate accessible description\n const accessibleDescription = useMemo(() => {\n if (ariaLabel) return ariaLabel;\n const seriesNames = data.map(s => s.name).join(', ');\n return `Line chart with ${data.length} series: ${seriesNames}`;\n }, [data, ariaLabel]);\n\n return (\n <div\n ref={containerRef}\n className={`relative ${className}`}\n style={{ width, height: 'auto' }}\n >\n <svg\n ref={svgRef}\n width={width}\n height={height}\n viewBox={`0 0 ${width} ${height}`}\n role=\"img\"\n aria-label={accessibleDescription}\n className=\"bg-[hsl(var(--card))]\"\n >\n <defs>\n {/* Animation keyframes for line drawing */}\n {animate && data.map((series, i) => (\n <style key={`anim-${i}`}>{`\n @keyframes drawLine${i} {\n from { stroke-dashoffset: 2000; }\n to { stroke-dashoffset: 0; }\n }\n `}</style>\n ))}\n </defs>\n\n <g transform={`translate(${padding.left}, ${padding.top})`}>\n {/* Grid */}\n {showGrid && (\n <CartesianGrid\n _chartDimensions={{ width: chartWidth, height: chartHeight }}\n horizontalPoints={yTicks.map(t => yScale(t))}\n />\n )}\n\n {/* Reference elements (areas/lines) - render before data */}\n {referenceElements}\n\n {/* Crosshair */}\n {showCrosshair && crosshairX !== null && (\n <line\n x1={crosshairX}\n y1={0}\n x2={crosshairX}\n y2={chartHeight}\n stroke=\"currentColor\"\n strokeWidth={1}\n strokeDasharray=\"4 4\"\n className=\"text-[hsl(var(--muted-foreground))]\"\n pointerEvents=\"none\"\n />\n )}\n\n {/* Lines */}\n {data.map((series, seriesIndex) => {\n const { path } = seriesPaths[seriesIndex];\n const color = series.color || colors[seriesIndex % colors.length];\n const strokeWidth = series.strokeWidth || CHART_DEFAULTS.line.strokeWidth;\n\n return (\n <path\n key={`line-${seriesIndex}`}\n d={path}\n fill=\"none\"\n stroke={color}\n strokeWidth={strokeWidth}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n style={animate ? {\n strokeDasharray: 2000,\n animation: `drawLine${seriesIndex} ${animationDuration}ms ease-out forwards`,\n } : undefined}\n />\n );\n })}\n\n {/* Data points */}\n {showDots && data.map((series, seriesIndex) => {\n const { points } = seriesPaths[seriesIndex];\n const color = series.color || colors[seriesIndex % colors.length];\n const showSeriesDots = series.dot !== false;\n\n if (!showSeriesDots) return null;\n\n return points.map((point, pointIndex) => {\n const isHovered =\n hoveredPoint?.seriesIndex === seriesIndex &&\n hoveredPoint?.pointIndex === pointIndex;\n\n return (\n <circle\n key={`dot-${seriesIndex}-${pointIndex}`}\n cx={point.x}\n cy={point.y}\n r={isHovered ? CHART_DEFAULTS.line.activeDotRadius : CHART_DEFAULTS.line.dotRadius}\n fill={color}\n stroke=\"white\"\n strokeWidth={2}\n className=\"cursor-pointer transition-all duration-150\"\n style={{\n opacity: animate ? 0 : 1,\n animation: animate\n ? `fadeIn 200ms ease-out ${animationDuration + pointIndex * 20}ms forwards`\n : undefined,\n }}\n onMouseEnter={(e) => handlePointEnter(e, seriesIndex, pointIndex)}\n onMouseLeave={handlePointLeave}\n onClick={() => handlePointClick(seriesIndex, pointIndex)}\n />\n );\n });\n })}\n\n {/* Value labels at end of lines */}\n {showValueLabels && data.map((series, seriesIndex) => {\n const lastPoint = series.data[series.data.length - 1];\n const { points } = seriesPaths[seriesIndex];\n const lastScaled = points[points.length - 1];\n const color = series.color || colors[seriesIndex % colors.length];\n\n if (!lastPoint || !lastScaled) return null;\n\n return (\n <g key={`label-${seriesIndex}`}>\n <circle\n cx={chartWidth + 12}\n cy={lastScaled.y}\n r={4}\n fill={color}\n />\n <text\n x={chartWidth + 22}\n y={lastScaled.y}\n dominantBaseline=\"middle\"\n fontSize={CHART_DEFAULTS.fontSize.gridLabel}\n fontWeight=\"600\"\n className=\"fill-[hsl(var(--foreground))]\"\n >\n {yFormatter(lastPoint.y)}\n </text>\n </g>\n );\n })}\n\n {/* X Axis */}\n {showXAxis && (\n <g transform={`translate(0, ${chartHeight})`}>\n <line\n x1={0}\n y1={0}\n x2={chartWidth}\n y2={0}\n className=\"stroke-[hsl(var(--border))]\"\n strokeWidth={1}\n />\n {xTicks.map((tick, i) => {\n const x = xValueType === 'string'\n ? xScale(tick.value, tick.index)\n : xScale(xValueType === 'date' ? new Date(tick.value as number) : tick.value, 0);\n\n return (\n <g key={`x-tick-${i}`} transform={`translate(${x}, 0)`}>\n <line y2={6} className=\"stroke-[hsl(var(--border))]\" />\n <text\n y={20}\n textAnchor=\"middle\"\n fontSize={CHART_DEFAULTS.fontSize.gridLabel}\n className=\"fill-[hsl(var(--muted-foreground))]\"\n >\n {xFormatter(xValueType === 'date' ? new Date(tick.value as number) : tick.value)}\n </text>\n </g>\n );\n })}\n {xAxisLabel && (\n <text\n x={chartWidth / 2}\n y={50}\n textAnchor=\"middle\"\n fontSize={CHART_DEFAULTS.fontSize.axisLabel}\n fontWeight=\"500\"\n className=\"fill-[hsl(var(--foreground))]\"\n >\n {xAxisLabel}\n </text>\n )}\n </g>\n )}\n\n {/* Y Axis */}\n {showYAxis && (\n <g>\n <line\n x1={0}\n y1={0}\n x2={0}\n y2={chartHeight}\n className=\"stroke-[hsl(var(--border))]\"\n strokeWidth={1}\n />\n {yTicks.map((tick, i) => (\n <g key={`y-tick-${i}`} transform={`translate(0, ${yScale(tick)})`}>\n <line x2={-6} className=\"stroke-[hsl(var(--border))]\" />\n <text\n x={-12}\n textAnchor=\"end\"\n dominantBaseline=\"middle\"\n fontSize={CHART_DEFAULTS.fontSize.gridLabel}\n className=\"fill-[hsl(var(--muted-foreground))]\"\n >\n {yFormatter(tick)}\n </text>\n </g>\n ))}\n {yAxisLabel && (\n <text\n x={-chartHeight / 2}\n y={-45}\n textAnchor=\"middle\"\n transform=\"rotate(-90)\"\n fontSize={CHART_DEFAULTS.fontSize.axisLabel}\n fontWeight=\"500\"\n className=\"fill-[hsl(var(--foreground))]\"\n >\n {yAxisLabel}\n </text>\n )}\n </g>\n )}\n </g>\n\n {/* CSS for animations */}\n <style>{`\n @keyframes fadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n }\n `}</style>\n </svg>\n\n {/* Legend */}\n {showLegend && (\n <Legend\n items={legendItems}\n layout=\"horizontal\"\n align=\"center\"\n />\n )}\n\n {/* Tooltip */}\n {showTooltip && (\n <ChartTooltip\n {...tooltipData}\n content={tooltipContent}\n formatter={tooltipFormatter}\n labelFormatter={tooltipLabelFormatter}\n containerBounds={{ width, height }}\n />\n )}\n </div>\n );\n};\n","// Chart constants - no more magic numbers\n\nexport const CHART_DEFAULTS = {\n viewBox: {\n width: 1000,\n height: 600,\n pieSize: 600,\n },\n padding: {\n top: 40,\n right: 40,\n bottom: 60,\n left: 60,\n },\n fontSize: {\n gridLabel: 12,\n axisLabel: 14,\n title: 16,\n tooltip: 12,\n },\n colors: [\n '#3b82f6', // blue-500\n '#10b981', // emerald-500\n '#f59e0b', // amber-500\n '#ef4444', // red-500\n '#8b5cf6', // violet-500\n '#ec4899', // pink-500\n '#06b6d4', // cyan-500\n '#f97316', // orange-500\n '#84cc16', // lime-500\n '#6366f1', // indigo-500\n ],\n animation: {\n duration: 300,\n easing: 'ease-out',\n },\n grid: {\n strokeDasharray: '3 3',\n strokeWidth: 1,\n },\n line: {\n strokeWidth: 2,\n dotRadius: 4,\n activeDotRadius: 6,\n },\n bar: {\n radius: 4,\n gap: 0.1, // 10% gap between bars\n },\n tooltip: {\n offset: 10,\n },\n} as const;\n\nexport type ChartColor = string;\n","// Scale utilities for charts\n\nexport interface ScaleLinearOptions {\n domain: [number, number];\n range: [number, number];\n nice?: boolean;\n clamp?: boolean;\n}\n\nexport interface ScaleTimeOptions {\n domain: [Date, Date];\n range: [number, number];\n}\n\nexport interface ScaleBandOptions {\n domain: string[];\n range: [number, number];\n padding?: number;\n paddingInner?: number;\n paddingOuter?: number;\n}\n\n// Linear scale for continuous numeric data\nexport function scaleLinear({ domain, range, nice = false, clamp = false }: ScaleLinearOptions) {\n let [d0, d1] = domain;\n const [r0, r1] = range;\n\n // Nice the domain to round numbers\n if (nice) {\n const span = d1 - d0;\n const step = Math.pow(10, Math.floor(Math.log10(span))) / 2;\n d0 = Math.floor(d0 / step) * step;\n d1 = Math.ceil(d1 / step) * step;\n }\n\n const domainSpan = d1 - d0;\n const rangeSpan = r1 - r0;\n\n return (value: number): number => {\n if (domainSpan === 0) return (r0 + r1) / 2;\n\n let normalized = (value - d0) / domainSpan;\n\n if (clamp) {\n normalized = Math.max(0, Math.min(1, normalized));\n }\n\n return r0 + normalized * rangeSpan;\n };\n}\n\n// Inverse linear scale (for mouse position to value)\nexport function scaleLinearInvert({ domain, range }: ScaleLinearOptions) {\n const [d0, d1] = domain;\n const [r0, r1] = range;\n\n const domainSpan = d1 - d0;\n const rangeSpan = r1 - r0;\n\n return (pixel: number): number => {\n if (rangeSpan === 0) return (d0 + d1) / 2;\n const normalized = (pixel - r0) / rangeSpan;\n return d0 + normalized * domainSpan;\n };\n}\n\n// Time scale for date data\nexport function scaleTime({ domain, range }: ScaleTimeOptions) {\n const [d0, d1] = domain;\n const [r0, r1] = range;\n\n const domainSpan = d1.getTime() - d0.getTime();\n const rangeSpan = r1 - r0;\n\n return (value: Date): number => {\n if (domainSpan === 0) return (r0 + r1) / 2;\n const normalized = (value.getTime() - d0.getTime()) / domainSpan;\n return r0 + normalized * rangeSpan;\n };\n}\n\n// Band scale for categorical data (bar charts)\nexport function scaleBand({ domain, range, padding = 0.1, paddingInner, paddingOuter }: ScaleBandOptions) {\n const [r0, r1] = range;\n const n = domain.length;\n\n if (n === 0) {\n return {\n scale: (_value: string) => r0,\n bandwidth: () => 0,\n step: () => 0,\n };\n }\n\n const inner = paddingInner ?? padding;\n const outer = paddingOuter ?? padding;\n\n const totalRange = r1 - r0;\n const step = totalRange / (n + outer * 2 - inner);\n const bandwidth = step * (1 - inner);\n const start = r0 + step * outer;\n\n const indexMap = new Map(domain.map((d, i) => [d, i]));\n\n return {\n scale: (value: string): number => {\n const index = indexMap.get(value);\n if (index === undefined) return r0;\n return start + index * step;\n },\n bandwidth: () => bandwidth,\n step: () => step,\n };\n}\n\n// Calculate nice tick values\nexport function getTicks(domain: [number, number], count: number = 5): number[] {\n const [min, max] = domain;\n const span = max - min;\n\n if (span === 0) return [min];\n\n const step = span / (count - 1);\n const ticks: number[] = [];\n\n for (let i = 0; i < count; i++) {\n ticks.push(min + step * i);\n }\n\n return ticks;\n}\n\n// Calculate domain from data with optional padding\nexport function calculateDomain(\n values: number[],\n options: { includeZero?: boolean; padding?: number } = {}\n): [number, number] {\n const { includeZero = true, padding = 0.1 } = options;\n\n if (values.length === 0) return [0, 1];\n\n let min = Math.min(...values);\n let max = Math.max(...values);\n\n if (includeZero) {\n min = Math.min(0, min);\n }\n\n const span = max - min;\n const pad = span * padding;\n\n return [min - (includeZero && min >= 0 ? 0 : pad), max + pad];\n}\n","// Path generation utilities for charts\n\nexport interface Point {\n x: number;\n y: number;\n}\n\n// Generate a line path (straight segments)\nexport function generateLinePath(points: Point[]): string {\n if (points.length === 0) return '';\n if (points.length === 1) return `M ${points[0].x} ${points[0].y}`;\n\n return points\n .map((p, i) => `${i === 0 ? 'M' : 'L'} ${p.x} ${p.y}`)\n .join(' ');\n}\n\n// Generate a smooth curved path using cubic bezier\nexport function generateCurvedPath(points: Point[], tension: number = 0.3): string {\n if (points.length === 0) return '';\n if (points.length === 1) return `M ${points[0].x} ${points[0].y}`;\n if (points.length === 2) return generateLinePath(points);\n\n let path = `M ${points[0].x} ${points[0].y}`;\n\n for (let i = 0; i < points.length - 1; i++) {\n const p0 = points[Math.max(0, i - 1)];\n const p1 = points[i];\n const p2 = points[i + 1];\n const p3 = points[Math.min(points.length - 1, i + 2)];\n\n // Calculate control points\n const cp1x = p1.x + (p2.x - p0.x) * tension;\n const cp1y = p1.y + (p2.y - p0.y) * tension;\n const cp2x = p2.x - (p3.x - p1.x) * tension;\n const cp2y = p2.y - (p3.y - p1.y) * tension;\n\n path += ` C ${cp1x} ${cp1y}, ${cp2x} ${cp2y}, ${p2.x} ${p2.y}`;\n }\n\n return path;\n}\n\n// Generate a monotone cubic spline (better for charts - no overshooting)\nexport function generateMonotonePath(points: Point[]): string {\n if (points.length === 0) return '';\n if (points.length === 1) return `M ${points[0].x} ${points[0].y}`;\n if (points.length === 2) return generateLinePath(points);\n\n // Calculate tangents\n const tangents: number[] = [];\n for (let i = 0; i < points.length; i++) {\n if (i === 0) {\n tangents.push((points[1].y - points[0].y) / (points[1].x - points[0].x));\n } else if (i === points.length - 1) {\n tangents.push((points[i].y - points[i - 1].y) / (points[i].x - points[i - 1].x));\n } else {\n const d0 = (points[i].y - points[i - 1].y) / (points[i].x - points[i - 1].x);\n const d1 = (points[i + 1].y - points[i].y) / (points[i + 1].x - points[i].x);\n tangents.push((d0 + d1) / 2);\n }\n }\n\n let path = `M ${points[0].x} ${points[0].y}`;\n\n for (let i = 0; i < points.length - 1; i++) {\n const p0 = points[i];\n const p1 = points[i + 1];\n const dx = (p1.x - p0.x) / 3;\n\n const cp1x = p0.x + dx;\n const cp1y = p0.y + tangents[i] * dx;\n const cp2x = p1.x - dx;\n const cp2y = p1.y - tangents[i + 1] * dx;\n\n path += ` C ${cp1x} ${cp1y}, ${cp2x} ${cp2y}, ${p1.x} ${p1.y}`;\n }\n\n return path;\n}\n\n// Generate step path (for step charts)\nexport function generateStepPath(points: Point[], position: 'before' | 'after' | 'middle' = 'after'): string {\n if (points.length === 0) return '';\n if (points.length === 1) return `M ${points[0].x} ${points[0].y}`;\n\n let path = `M ${points[0].x} ${points[0].y}`;\n\n for (let i = 1; i < points.length; i++) {\n const prev = points[i - 1];\n const curr = points[i];\n\n if (position === 'before') {\n path += ` V ${curr.y} H ${curr.x}`;\n } else if (position === 'after') {\n path += ` H ${curr.x} V ${curr.y}`;\n } else {\n const midX = (prev.x + curr.x) / 2;\n path += ` H ${midX} V ${curr.y} H ${curr.x}`;\n }\n }\n\n return path;\n}\n\n// Generate area path (closed shape with baseline)\nexport function generateAreaPath(\n points: Point[],\n baseline: number,\n curved: boolean = false\n): string {\n if (points.length === 0) return '';\n\n const linePath = curved ? generateMonotonePath(points) : generateLinePath(points);\n const lastPoint = points[points.length - 1];\n const firstPoint = points[0];\n\n return `${linePath} L ${lastPoint.x} ${baseline} L ${firstPoint.x} ${baseline} Z`;\n}\n\n// Generate stacked area path\nexport function generateStackedAreaPath(\n topPoints: Point[],\n bottomPoints: Point[],\n curved: boolean = false\n): string {\n if (topPoints.length === 0) return '';\n\n const topPath = curved ? generateMonotonePath(topPoints) : generateLinePath(topPoints);\n const reversedBottom = [...bottomPoints].reverse();\n const bottomPath = reversedBottom\n .map((p, i) => `${i === 0 ? 'L' : 'L'} ${p.x} ${p.y}`)\n .join(' ');\n\n return `${topPath} ${bottomPath} Z`;\n}\n\n// Generate pie/donut slice path\nexport function generateArcPath(\n centerX: number,\n centerY: number,\n radius: number,\n startAngle: number,\n endAngle: number,\n innerRadius: number = 0\n): string {\n const startRad = (startAngle - 90) * Math.PI / 180;\n const endRad = (endAngle - 90) * Math.PI / 180;\n\n const x1 = centerX + radius * Math.cos(startRad);\n const y1 = centerY + radius * Math.sin(startRad);\n const x2 = centerX + radius * Math.cos(endRad);\n const y2 = centerY + radius * Math.sin(endRad);\n\n const largeArc = endAngle - startAngle > 180 ? 1 : 0;\n\n if (innerRadius === 0) {\n // Pie slice\n return [\n `M ${centerX} ${centerY}`,\n `L ${x1} ${y1}`,\n `A ${radius} ${radius} 0 ${largeArc} 1 ${x2} ${y2}`,\n 'Z'\n ].join(' ');\n } else {\n // Donut slice\n const ix1 = centerX + innerRadius * Math.cos(startRad);\n const iy1 = centerY + innerRadius * Math.sin(startRad);\n const ix2 = centerX + innerRadius * Math.cos(endRad);\n const iy2 = centerY + innerRadius * Math.sin(endRad);\n\n return [\n `M ${x1} ${y1}`,\n `A ${radius} ${radius} 0 ${largeArc} 1 ${x2} ${y2}`,\n `L ${ix2} ${iy2}`,\n `A ${innerRadius} ${innerRadius} 0 ${largeArc} 0 ${ix1} ${iy1}`,\n 'Z'\n ].join(' ');\n }\n}\n","// Formatting utilities for charts\n\n// Format number with appropriate precision\nexport function formatNumber(value: number, options: {\n precision?: number;\n compact?: boolean;\n prefix?: string;\n suffix?: string;\n} = {}): string {\n const { precision = 2, compact = false, prefix = '', suffix = '' } = options;\n\n if (compact) {\n const absValue = Math.abs(value);\n if (absValue >= 1e9) {\n return `${prefix}${(value / 1e9).toFixed(1)}B${suffix}`;\n }\n if (absValue >= 1e6) {\n return `${prefix}${(value / 1e6).toFixed(1)}M${suffix}`;\n }\n if (absValue >= 1e3) {\n return `${prefix}${(value / 1e3).toFixed(1)}K${suffix}`;\n }\n }\n\n // Remove unnecessary decimal places\n const formatted = value.toFixed(precision);\n const trimmed = parseFloat(formatted).toString();\n\n return `${prefix}${trimmed}${suffix}`;\n}\n\n// Format currency\nexport function formatCurrency(value: number, options: {\n currency?: string;\n locale?: string;\n compact?: boolean;\n} = {}): string {\n const { currency = 'USD', locale = 'en-US', compact = false } = options;\n\n if (compact) {\n const absValue = Math.abs(value);\n const sign = value < 0 ? '-' : '';\n const symbol = currency === 'USD' ? '$' : currency;\n\n if (absValue >= 1e9) {\n return `${sign}${symbol}${(absValue / 1e9).toFixed(1)}B`;\n }\n if (absValue >= 1e6) {\n return `${sign}${symbol}${(absValue / 1e6).toFixed(1)}M`;\n }\n if (absValue >= 1e3) {\n return `${sign}${symbol}${(absValue / 1e3).toFixed(1)}K`;\n }\n }\n\n return new Intl.NumberFormat(locale, {\n style: 'currency',\n currency,\n }).format(value);\n}\n\n// Format percentage\nexport function formatPercent(value: number, options: {\n precision?: number;\n multiply?: boolean;\n} = {}): string {\n const { precision = 1, multiply = false } = options;\n const percent = multiply ? value * 100 : value;\n return `${percent.toFixed(precision)}%`;\n}\n\n// Intelligent date formatting based on time range\nexport function formatDate(date: Date, rangeMs?: number): string {\n const minute = 60 * 1000;\n const hour = 60 * minute;\n const day = 24 * hour;\n const month = 30 * day;\n const year = 365 * day;\n\n // If no range specified, use full date\n if (!rangeMs) {\n return date.toLocaleDateString('en-US', {\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n });\n }\n\n if (rangeMs < hour) {\n // Less than 1 hour: show time with seconds\n return date.toLocaleTimeString('en-US', {\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n });\n } else if (rangeMs < day) {\n // Less than 1 day: show time\n return date.toLocaleTimeString('en-US', {\n hour: '2-digit',\n minute: '2-digit',\n });\n } else if (rangeMs < month) {\n // Less than 1 month: show date and time\n return date.toLocaleDateString('en-US', {\n month: 'short',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n });\n } else if (rangeMs < year) {\n // Less than 1 year: show month and day\n return date.toLocaleDateString('en-US', {\n month: 'short',\n day: 'numeric',\n });\n } else {\n // More than 1 year: show month and year\n return date.toLocaleDateString('en-US', {\n month: 'short',\n year: 'numeric',\n });\n }\n}\n\n// Format time duration\nexport function formatDuration(ms: number): string {\n const seconds = Math.floor(ms / 1000);\n const minutes = Math.floor(seconds / 60);\n const hours = Math.floor(minutes / 60);\n const days = Math.floor(hours / 24);\n\n if (days > 0) {\n return `${days}d ${hours % 24}h`;\n }\n if (hours > 0) {\n return `${hours}h ${minutes % 60}m`;\n }\n if (minutes > 0) {\n return `${minutes}m ${seconds % 60}s`;\n }\n return `${seconds}s`;\n}\n\n// Create a tick formatter based on the domain\nexport function createTickFormatter(domain: [number, number]): (value: number) => string {\n const [min, max] = domain;\n const range = max - min;\n\n // Determine appropriate precision\n let precision = 0;\n if (range < 1) {\n precision = 2;\n } else if (range < 10) {\n precision = 1;\n }\n\n // Use compact format for large numbers\n const compact = Math.abs(max) >= 1000 || Math.abs(min) >= 1000;\n\n return (value: number) => formatNumber(value, { precision, compact });\n}\n","\"use client\";\n\nimport React, { useRef, useEffect, useState } from 'react';\n\nexport interface TooltipPayloadItem {\n name: string;\n value: number | string;\n color?: string;\n dataKey?: string;\n payload?: Record<string, unknown>;\n}\n\nexport interface TooltipProps {\n /** Whether the tooltip is currently active/visible */\n active?: boolean;\n /** The label for the tooltip (usually x-axis value) */\n label?: string | number;\n /** Array of data items to display */\n payload?: TooltipPayloadItem[];\n /** Custom content renderer */\n content?: React.FC<TooltipProps> | React.ReactElement;\n /** X position in pixels */\n x?: number;\n /** Y position in pixels */\n y?: number;\n /** Offset from cursor position */\n offset?: number;\n /** Custom formatter for values */\n formatter?: (value: number | string, name: string, payload: TooltipPayloadItem) => string;\n /** Custom formatter for labels */\n labelFormatter?: (label: string | number) => string;\n /** Custom CSS class */\n className?: string;\n /** Container bounds for positioning */\n containerBounds?: { width: number; height: number };\n /** Animation duration in ms (0 to disable) */\n animationDuration?: number;\n}\n\nconst DefaultTooltipContent: React.FC<TooltipProps> = ({\n active,\n label,\n payload,\n formatter,\n labelFormatter,\n}) => {\n if (!active || !payload || payload.length === 0) {\n return null;\n }\n\n const formattedLabel = labelFormatter ? labelFormatter(label ?? '') : String(label ?? '');\n\n return (\n <div className=\"bg-[hsl(var(--popover))] text-white rounded-lg shadow-xl border border-[hsl(var(--border))] overflow-hidden min-w-[120px]\">\n {formattedLabel && (\n <div className=\"px-3 py-2 bg-[hsl(var(--popover))] border-b border-[hsl(var(--border))]\">\n <span className=\"text-sm font-medium text-[hsl(var(--muted-foreground))]\">{formattedLabel}</span>\n </div>\n )}\n <div className=\"px-3 py-2 space-y-1\">\n {payload.map((item, index) => {\n const formattedValue = formatter\n ? formatter(item.value, item.name, item)\n : String(item.value);\n\n return (\n <div key={`${item.name}-${index}`} className=\"flex items-center justify-between gap-4\">\n <div className=\"flex items-center gap-2\">\n {item.color && (\n <span\n className=\"w-2.5 h-2.5 rounded-full flex-shrink-0\"\n style={{ backgroundColor: item.color }}\n />\n )}\n <span className=\"text-xs text-[hsl(var(--muted-foreground))]\">{item.name}</span>\n </div>\n <span className=\"text-sm font-semibold text-white\">{formattedValue}</span>\n </div>\n );\n })}\n </div>\n </div>\n );\n};\n\nexport const ChartTooltip: React.FC<TooltipProps> = ({\n active = false,\n label,\n payload,\n content,\n x = 0,\n y = 0,\n offset = 12,\n formatter,\n labelFormatter,\n className = '',\n containerBounds,\n animationDuration = 150,\n}) => {\n const tooltipRef = useRef<HTMLDivElement>(null);\n const [position, setPosition] = useState({ x: 0, y: 0 });\n const [isVisible, setIsVisible] = useState(false);\n\n // Calculate position with boundary detection\n useEffect(() => {\n if (!active || !tooltipRef.current) {\n setIsVisible(false);\n return;\n }\n\n const tooltip = tooltipRef.current;\n const tooltipRect = tooltip.getBoundingClientRect();\n const tooltipWidth = tooltipRect.width || 150;\n const tooltipHeight = tooltipRect.height || 80;\n\n let newX = x + offset;\n let newY = y - tooltipHeight / 2;\n\n // Adjust for right boundary\n if (containerBounds && newX + tooltipWidth > containerBounds.width) {\n newX = x - tooltipWidth - offset;\n }\n\n // Adjust for left boundary\n if (newX < 0) {\n newX = offset;\n }\n\n // Adjust for top boundary\n if (newY < 0) {\n newY = offset;\n }\n\n // Adjust for bottom boundary\n if (containerBounds && newY + tooltipHeight > containerBounds.height) {\n newY = containerBounds.height - tooltipHeight - offset;\n }\n\n setPosition({ x: newX, y: newY });\n setIsVisible(true);\n }, [active, x, y, offset, containerBounds]);\n\n if (!active) {\n return null;\n }\n\n const tooltipContent = content ? (\n React.isValidElement(content) ? (\n React.cloneElement(content as React.ReactElement<TooltipProps>, {\n active,\n label,\n payload,\n formatter,\n labelFormatter,\n })\n ) : (\n React.createElement(content as React.FC<TooltipProps>, {\n active,\n label,\n payload,\n formatter,\n labelFormatter,\n })\n )\n ) : (\n <DefaultTooltipContent\n active={active}\n label={label}\n payload={payload}\n formatter={formatter}\n labelFormatter={labelFormatter}\n />\n );\n\n return (\n <div\n ref={tooltipRef}\n className={`absolute pointer-events-none z-50 ${className}`}\n style={{\n left: `${position.x}px`,\n top: `${position.y}px`,\n opacity: isVisible ? 1 : 0,\n transform: `translateZ(0)`,\n transition: animationDuration > 0\n ? `opacity ${animationDuration}ms ease-out`\n : undefined,\n }}\n >\n {tooltipContent}\n </div>\n );\n};\n\n// Hook for tooltip state management\nexport interface UseTooltipReturn {\n tooltipData: {\n active: boolean;\n x: number;\n y: number;\n label?: string | number;\n payload?: TooltipPayloadItem[];\n };\n showTooltip: (data: {\n x: number;\n y: number;\n label?: string | number;\n payload?: TooltipPayloadItem[];\n }) => void;\n hideTooltip: () => void;\n updatePosition: (x: number, y: number) => void;\n}\n\nexport function useTooltip(): UseTooltipReturn {\n const [tooltipData, setTooltipData] = useState<UseTooltipReturn['tooltipData']>({\n active: false,\n x: 0,\n y: 0,\n label: undefined,\n payload: undefined,\n });\n\n const showTooltip = React.useCallback((data: {\n x: number;\n y: number;\n label?: string | number;\n payload?: TooltipPayloadItem[];\n }) => {\n setTooltipData({\n active: true,\n ...data,\n });\n }, []);\n\n const hideTooltip = React.useCallback(() => {\n setTooltipData(prev => ({\n ...prev,\n active: false,\n }));\n }, []);\n\n const updatePosition = React.useCallback((x: number, y: number) => {\n setTooltipData(prev => ({\n ...prev,\n x,\n y,\n }));\n }, []);\n\n return {\n tooltipData,\n showTooltip,\n hideTooltip,\n updatePosition,\n };\n}\n","\"use client\";\n\nimport React from 'react';\n\nexport interface LegendItem {\n name: string;\n color: string;\n type?: 'line' | 'square' | 'circle' | 'rect';\n inactive?: boolean;\n}\n\nexport interface LegendProps {\n /** Legend items to display */\n items?: LegendItem[];\n /** Legend layout direction */\n layout?: 'horizontal' | 'vertical';\n /** Alignment */\n align?: 'left' | 'center' | 'right';\n /** Vertical alignment */\n verticalAlign?: 'top' | 'middle' | 'bottom';\n /** Icon size */\n iconSize?: number;\n /** Custom formatter for legend text */\n formatter?: (value: string, entry: LegendItem, index: number) => React.ReactNode;\n /** Click handler */\n onClick?: (item: LegendItem, index: number) => void;\n /** Mouse enter handler */\n onMouseEnter?: (item: LegendItem, index: number) => void;\n /** Mouse leave handler */\n onMouseLeave?: () => void;\n /** Custom CSS class */\n className?: string;\n /** Wrapper style */\n wrapperStyle?: React.CSSProperties;\n}\n\nexport const Legend: React.FC<LegendProps> = ({\n items = [],\n layout = 'horizontal',\n align = 'center',\n verticalAlign = 'bottom',\n iconSize = 12,\n formatter,\n onClick,\n onMouseEnter,\n onMouseLeave,\n className = '',\n wrapperStyle,\n}) => {\n const alignClass = {\n left: 'justify-start',\n center: 'justify-center',\n right: 'justify-end',\n }[align];\n\n const layoutClass = layout === 'horizontal' ? 'flex-row flex-wrap' : 'flex-col';\n\n const renderIcon = (item: LegendItem) => {\n const style = { backgroundColor: item.color };\n\n switch (item.type) {\n case 'line':\n return (\n <div\n className=\"flex-shrink-0\"\n style={{\n width: iconSize,\n height: 2,\n backgroundColor: item.color,\n }}\n />\n );\n case 'circle':\n return (\n <div\n className=\"rounded-full flex-shrink-0\"\n style={{\n width: iconSize,\n height: iconSize,\n ...style,\n }}\n />\n );\n case 'rect':\n case 'square':\n default:\n return (\n <div\n className=\"rounded-sm flex-shrink-0\"\n style={{\n width: iconSize,\n height: iconSize,\n ...style,\n }}\n />\n );\n }\n };\n\n return (\n <div\n className={`flex gap-4 px-4 py-2 ${layoutClass} ${alignClass} ${className}`}\n style={wrapperStyle}\n >\n {items.map((item, index) => (\n <button\n key={`${item.name}-${index}`}\n type=\"button\"\n className={`\n flex items-center gap-2 text-sm transition-opacity\n ${onClick ? 'cursor-pointer hover:opacity-80' : 'cursor-default'}\n ${item.inactive ? 'opacity-40' : 'opacity-100'}\n `}\n onClick={() => onClick?.(item, index)}\n onMouseEnter={() => onMouseEnter?.(item, index)}\n onMouseLeave={onMouseLeave}\n >\n {renderIcon(item)}\n <span className=\"text-[hsl(var(--foreground))]\">\n {formatter ? formatter(item.name, item, index) : item.name}\n </span>\n </button>\n ))}\n </div>\n );\n};\n","\"use client\";\n\nimport React from 'react';\nimport { CHART_DEFAULTS } from '../constants';\n\nexport interface ReferenceLineProps {\n /** X-axis value for vertical line */\n x?: number | string | Date;\n /** Y-axis value for horizontal line */\n y?: number;\n /** Line stroke color */\n stroke?: string;\n /** Line stroke width */\n strokeWidth?: number;\n /** Line dash pattern (e.g., \"5 5\") */\n strokeDasharray?: string;\n /** Label text */\n label?: string | React.ReactNode;\n /** Label position */\n labelPosition?: 'start' | 'middle' | 'end' | 'insideStart' | 'insideEnd';\n /** Custom CSS class for the line */\n className?: string;\n /** If true, the line extends to the edge of the chart */\n ifOverflow?: 'hidden' | 'visible' | 'extendDomain';\n /** Internal - chart dimensions (injected by parent) */\n _chartDimensions?: {\n width: number;\n height: number;\n padding: { top: number; right: number; bottom: number; left: number };\n };\n /** Internal - scale functions (injected by parent) */\n _scales?: {\n xScale: (value: number | string | Date) => number;\n yScale: (value: number) => number;\n };\n}\n\nexport const ReferenceLine: React.FC<ReferenceLineProps> = ({\n x,\n y,\n stroke = '#94a3b8',\n strokeWidth = 1,\n strokeDasharray = '4 4',\n label,\n labelPosition = 'end',\n className = '',\n ifOverflow = 'hidden',\n _chartDimensions,\n _scales,\n}) => {\n // If no internal props provided, this is being rendered standalone (shouldn't happen)\n if (!_chartDimensions || !_scales) {\n return null;\n }\n\n const { width, height } = _chartDimensions;\n const { xScale, yScale } = _scales;\n\n // Determine if this is a horizontal or vertical line\n const isHorizontal = y !== undefined;\n const isVertical = x !== undefined;\n\n if (!isHorizontal && !isVertical) {\n return null;\n }\n\n let x1: number, y1: number, x2: number, y2: number;\n let labelX: number, labelY: number;\n let textAnchor: 'start' | 'middle' | 'end' = 'middle';\n let dominantBaseline: 'auto' | 'middle' | 'hanging' = 'middle';\n\n if (isHorizontal && y !== undefined) {\n // Horizontal line at y value\n const scaledY = yScale(y);\n\n // Skip if out of bounds and overflow is hidden\n if (ifOverflow === 'hidden' && (scaledY < 0 || scaledY > height)) {\n return null;\n }\n\n x1 = 0;\n y1 = scaledY;\n x2 = width;\n y2 = scaledY;\n\n // Label positioning\n switch (labelPosition) {\n case 'start':\n labelX = 0;\n labelY = scaledY - 8;\n textAnchor = 'start';\n break;\n case 'middle':\n labelX = width / 2;\n labelY = scaledY - 8;\n break;\n case 'end':\n labelX = width;\n labelY = scaledY - 8;\n textAnchor = 'end';\n break;\n case 'insideStart':\n labelX = 8;\n labelY = scaledY - 8;\n textAnchor = 'start';\n break;\n case 'insideEnd':\n labelX = width - 8;\n labelY = scaledY - 8;\n textAnchor = 'end';\n break;\n default:\n labelX = width;\n labelY = scaledY - 8;\n textAnchor = 'end';\n }\n } else if (isVertical && x !== undefined) {\n // Vertical line at x value\n const scaledX = xScale(x);\n\n // Skip if out of bounds and overflow is hidden\n if (ifOverflow === 'hidden' && (scaledX < 0 || scaledX > width)) {\n return null;\n }\n\n x1 = scaledX;\n y1 = 0;\n x2 = scaledX;\n y2 = height;\n\n // Label positioning\n switch (labelPosition) {\n case 'start':\n labelX = scaledX;\n labelY = -8;\n dominantBaseline = 'auto';\n break;\n case 'middle':\n labelX = scaledX + 8;\n labelY = height / 2;\n textAnchor = 'start';\n break;\n case 'end':\n labelX = scaledX;\n labelY = height + 16;\n dominantBaseline = 'hanging';\n break;\n case 'insideStart':\n labelX = scaledX + 8;\n labelY = 16;\n textAnchor = 'start';\n dominantBaseline = 'hanging';\n break;\n case 'insideEnd':\n labelX = scaledX + 8;\n labelY = height - 16;\n textAnchor = 'start';\n dominantBaseline = 'auto';\n break;\n default:\n labelX = scaledX;\n labelY = -8;\n dominantBaseline = 'auto';\n }\n } else {\n return null;\n }\n\n return (\n <g className={`reference-line ${className}`}>\n <line\n x1={x1}\n y1={y1}\n x2={x2}\n y2={y2}\n stroke={stroke}\n strokeWidth={strokeWidth}\n strokeDasharray={strokeDasharray}\n />\n {label && (\n typeof label === 'string' ? (\n <text\n x={labelX}\n y={labelY}\n textAnchor={textAnchor}\n dominantBaseline={dominantBaseline}\n fontSize={CHART_DEFAULTS.fontSize.gridLabel}\n fontWeight=\"500\"\n className=\"fill-[hsl(var(--muted-foreground))]\"\n >\n {label}\n </text>\n ) : (\n <foreignObject\n x={labelX - 50}\n y={labelY - 12}\n width={100}\n height={24}\n >\n {label}\n </foreignObject>\n )\n )}\n </g>\n );\n};\n","\"use client\";\n\nimport React from 'react';\nimport { CHART_DEFAULTS } from '../constants';\n\nexport interface ReferenceAreaProps {\n /** Start X value (for vertical bands) */\n x1?: number | string | Date;\n /** End X value (for vertical bands) */\n x2?: number | string | Date;\n /** Start Y value (for horizontal bands) */\n y1?: number;\n /** End Y value (for horizontal bands) */\n y2?: number;\n /** Fill color */\n fill?: string;\n /** Fill opacity (0-1) */\n fillOpacity?: number;\n /** Stroke color */\n stroke?: string;\n /** Stroke width */\n strokeWidth?: number;\n /** Label text */\n label?: string | React.ReactNode;\n /** Label position */\n labelPosition?: 'center' | 'top' | 'bottom' | 'left' | 'right' | 'insideTop' | 'insideBottom';\n /** Custom CSS class */\n className?: string;\n /** If true, area clips to chart bounds */\n ifOverflow?: 'hidden' | 'visible';\n /** Internal - chart dimensions (injected by parent) */\n _chartDimensions?: {\n width: number;\n height: number;\n padding: { top: number; right: number; bottom: number; left: number };\n };\n /** Internal - scale functions (injected by parent) */\n _scales?: {\n xScale: (value: number | string | Date) => number;\n yScale: (value: number) => number;\n };\n}\n\nexport const ReferenceArea: React.FC<ReferenceAreaProps> = ({\n x1,\n x2,\n y1,\n y2,\n fill = '#3b82f6',\n fillOpacity = 0.1,\n stroke,\n strokeWidth = 0,\n label,\n labelPosition = 'center',\n className = '',\n ifOverflow = 'hidden',\n _chartDimensions,\n _scales,\n}) => {\n // If no internal props provided, this is being rendered standalone\n if (!_chartDimensions || !_scales) {\n return null;\n }\n\n const { width, height } = _chartDimensions;\n const { xScale, yScale } = _scales;\n\n // Calculate rectangle bounds\n let rectX: number, rectY: number, rectWidth: number, rectHeight: number;\n\n // Vertical band (x1 to x2)\n if (x1 !== undefined && x2 !== undefined) {\n const scaledX1 = xScale(x1);\n const scaledX2 = xScale(x2);\n\n rectX = Math.min(scaledX1, scaledX2);\n rectWidth = Math.abs(scaledX2 - scaledX1);\n\n if (y1 !== undefined && y2 !== undefined) {\n // Both X and Y specified - specific rectangle\n const scaledY1 = yScale(y1);\n const scaledY2 = yScale(y2);\n rectY = Math.min(scaledY1, scaledY2);\n rectHeight = Math.abs(scaledY2 - scaledY1);\n } else {\n // Only X specified - full height band\n rectY = 0;\n rectHeight = height;\n }\n }\n // Horizontal band (y1 to y2)\n else if (y1 !== undefined && y2 !== undefined) {\n const scaledY1 = yScale(y1);\n const scaledY2 = yScale(y2);\n\n rectY = Math.min(scaledY1, scaledY2);\n rectHeight = Math.abs(scaledY2 - scaledY1);\n rectX = 0;\n rectWidth = width;\n } else {\n return null;\n }\n\n // Clip to bounds if overflow is hidden\n if (ifOverflow === 'hidden') {\n if (rectX < 0) {\n rectWidth += rectX;\n rectX = 0;\n }\n if (rectY < 0) {\n rectHeight += rectY;\n rectY = 0;\n }\n if (rectX + rectWidth > width) {\n rectWidth = width - rectX;\n }\n if (rectY + rectHeight > height) {\n rectHeight = height - rectY;\n }\n\n // Skip if completely out of bounds\n if (rectWidth <= 0 || rectHeight <= 0) {\n return null;\n }\n }\n\n // Calculate label position\n let labelX: number, labelY: number;\n let textAnchor: 'start' | 'middle' | 'end' = 'middle';\n let dominantBaseline: 'auto' | 'middle' | 'hanging' = 'middle';\n\n switch (labelPosition) {\n case 'center':\n labelX = rectX + rectWidth / 2;\n labelY = rectY + rectHeight / 2;\n break;\n case 'top':\n labelX = rectX + rectWidth / 2;\n labelY = rectY - 8;\n dominantBaseline = 'auto';\n break;\n case 'bottom':\n labelX = rectX + rectWidth / 2;\n labelY = rectY + rectHeight + 16;\n dominantBaseline = 'hanging';\n break;\n case 'left':\n labelX = rectX - 8;\n labelY = rectY + rectHeight / 2;\n textAnchor = 'end';\n break;\n case 'right':\n labelX = rectX + rectWidth + 8;\n labelY = rectY + rectHeight / 2;\n textAnchor = 'start';\n break;\n case 'insideTop':\n labelX = rectX + rectWidth / 2;\n labelY = rectY + 16;\n dominantBaseline = 'hanging';\n break;\n case 'insideBottom':\n labelX = rectX + rectWidth / 2;\n labelY = rectY + rectHeight - 16;\n dominantBaseline = 'auto';\n break;\n default:\n labelX = rectX + rectWidth / 2;\n labelY = rectY + rectHeight / 2;\n }\n\n return (\n <g className={`reference-area ${className}`}>\n <rect\n x={rectX}\n y={rectY}\n width={rectWidth}\n height={rectHeight}\n fill={fill}\n fillOpacity={fillOpacity}\n stroke={stroke}\n strokeWidth={strokeWidth}\n />\n {label && (\n typeof label === 'string' ? (\n <text\n x={labelX}\n y={labelY}\n textAnchor={textAnchor}\n dominantBaseline={dominantBaseline}\n fontSize={CHART_DEFAULTS.fontSize.gridLabel}\n fontWeight=\"500\"\n className=\"fill-[hsl(var(--muted-foreground))]\"\n >\n {label}\n </text>\n ) : (\n <foreignObject\n x={labelX - 50}\n y={labelY - 12}\n width={100}\n height={24}\n >\n {label}\n </foreignObject>\n )\n )}\n </g>\n );\n};\n","\"use client\";\n\nimport React, { useMemo } from 'react';\nimport { CHART_DEFAULTS } from '../constants';\n\nexport interface CartesianGridProps {\n /** Show horizontal grid lines */\n horizontal?: boolean;\n /** Show vertical grid lines */\n vertical?: boolean;\n /** Stroke color */\n stroke?: string;\n /** Stroke dash array (e.g., \"3 3\") */\n strokeDasharray?: string;\n /** Stroke width */\n strokeWidth?: number;\n /** Stroke opacity */\n strokeOpacity?: number;\n /** Custom horizontal line positions */\n horizontalPoints?: number[];\n /** Custom vertical line positions */\n verticalPoints?: number[];\n /** Custom CSS class */\n className?: string;\n /** Internal - chart dimensions (injected by parent) */\n _chartDimensions?: {\n width: number;\n height: number;\n };\n}\n\nexport const CartesianGrid: React.FC<CartesianGridProps> = ({\n horizontal = true,\n vertical = true,\n stroke,\n strokeDasharray = CHART_DEFAULTS.grid.strokeDasharray,\n strokeWidth = CHART_DEFAULTS.grid.strokeWidth,\n strokeOpacity = 0.5,\n horizontalPoints,\n verticalPoints,\n className = '',\n _chartDimensions,\n}) => {\n // If no internal props provided, this is being rendered standalone\n if (!_chartDimensions) {\n return null;\n }\n\n const { width, height } = _chartDimensions;\n\n // Generate default grid points if not provided\n const hPoints = useMemo(() => {\n if (horizontalPoints) return horizontalPoints;\n const count = 5;\n return Array.from({ length: count + 1 }, (_, i) => (height / count) * i);\n }, [horizontalPoints, height]);\n\n const vPoints = useMemo(() => {\n if (verticalPoints) return verticalPoints;\n const count = 6;\n return Array.from({ length: count + 1 }, (_, i) => (width / count) * i);\n }, [verticalPoints, width]);\n\n return (\n <g className={`cartesian-grid ${className}`}>\n {horizontal && hPoints.map((y, i) => (\n <line\n key={`h-${i}`}\n x1={0}\n y1={y}\n x2={width}\n y2={y}\n stroke={stroke}\n strokeDasharray={strokeDasharray}\n strokeWidth={strokeWidth}\n strokeOpacity={strokeOpacity}\n className={!stroke ? 'stroke-[hsl(var(--border))]' : undefined}\n />\n ))}\n {vertical && vPoints.map((x, i) => (\n <line\n key={`v-${i}`}\n x1={x}\n y1={0}\n x2={x}\n y2={height}\n stroke={stroke}\n strokeDasharray={strokeDasharray}\n strokeWidth={strokeWidth}\n strokeOpacity={strokeOpacity}\n className={!stroke ? 'stroke-[hsl(var(--border))]' : undefined}\n />\n ))}\n </g>\n );\n};\n","\"use client\";\n\nimport React, { useMemo, useCallback, useRef, useState } from 'react';\nimport { CHART_DEFAULTS } from './constants';\nimport { scaleLinear, scaleBand, calculateDomain, getTicks } from './utils/scales';\nimport { formatNumber, createTickFormatter } from './utils/format';\nimport { ChartTooltip, useTooltip, type TooltipPayloadItem } from './components/ChartTooltip';\nimport { Legend, type LegendItem } from './components/Legend';\nimport { ReferenceLine, type ReferenceLineProps } from './components/ReferenceLine';\nimport { ReferenceArea, type ReferenceAreaProps } from './components/ReferenceArea';\nimport { CartesianGrid } from './components/CartesianGrid';\n\nexport interface BarChartDataPoint {\n x: string | number;\n y: number;\n [key: string]: unknown;\n}\n\nexport interface BarChartSeries {\n name: string;\n data: BarChartDataPoint[];\n color?: string;\n radius?: number;\n}\n\nexport interface BarChartProps {\n /** Chart data - array of series */\n data: BarChartSeries[];\n /** Chart width in pixels */\n width?: number;\n /** Chart height in pixels */\n height?: number;\n /** Padding inside the chart */\n padding?: { top?: number; right?: number; bottom?: number; left?: number };\n /** Show grid lines */\n showGrid?: boolean;\n /** Show X axis */\n showXAxis?: boolean;\n /** Show Y axis */\n showYAxis?: boolean;\n /** Show legend */\n showLegend?: boolean;\n /** Show tooltip on hover */\n showTooltip?: boolean;\n /** Show values on top of bars */\n showValues?: boolean;\n /** Stack bars on top of each other */\n stacked?: boolean;\n /** Horizontal bar orientation */\n horizontal?: boolean;\n /** Bar corner radius */\n barRadius?: number;\n /** Gap between bar groups (0-1) */\n barGap?: number;\n /** Gap between bars in a group (0-1) */\n barCategoryGap?: number;\n /** Animate on load */\n animate?: boolean;\n /** Animation duration in ms */\n animationDuration?: number;\n /** X axis label */\n xAxisLabel?: string;\n /** Y axis label */\n yAxisLabel?: string;\n /** Number of Y axis ticks */\n yAxisTickCount?: number;\n /** Custom Y axis domain */\n yDomain?: [number, number];\n /** Custom Y axis formatter */\n formatYValue?: (value: number) => string;\n /** Custom tooltip formatter */\n tooltipFormatter?: (value: number | string, name: string, payload: TooltipPayloadItem) => string;\n /** Click handler for bars */\n onBarClick?: (data: BarChartDataPoint, seriesIndex: number, barIndex: number) => void;\n /** Hover handler for bars */\n onBarHover?: (data: BarChartDataPoint | null, seriesIndex: number, barIndex: number) => void;\n /** Custom CSS class */\n className?: string;\n /** Chart children (ReferenceLine, etc.) */\n children?: React.ReactNode;\n /** Custom colors array */\n colors?: string[];\n /** ARIA label for accessibility */\n ariaLabel?: string;\n}\n\nexport const BarChart: React.FC<BarChartProps> = ({\n data,\n width: providedWidth,\n height: providedHeight,\n padding: customPadding,\n showGrid = true,\n showXAxis = true,\n showYAxis = true,\n showLegend = true,\n showTooltip = true,\n showValues = false,\n stacked = false,\n horizontal = false,\n barRadius = CHART_DEFAULTS.bar.radius,\n barGap = 0.1,\n barCategoryGap = 0.2,\n animate = true,\n animationDuration = CHART_DEFAULTS.animation.duration,\n xAxisLabel,\n yAxisLabel,\n yAxisTickCount = 5,\n yDomain,\n formatYValue,\n tooltipFormatter,\n onBarClick,\n onBarHover,\n className = '',\n children,\n colors = CHART_DEFAULTS.colors,\n ariaLabel,\n}) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const [hoveredBar, setHoveredBar] = useState<{\n seriesIndex: number;\n barIndex: number;\n } | null>(null);\n\n const { tooltipData, showTooltip: showTooltipFn, hideTooltip } = useTooltip();\n\n // Dimensions\n const width = providedWidth || 800;\n const height = providedHeight || 400;\n\n const padding = useMemo(() => ({\n top: customPadding?.top ?? CHART_DEFAULTS.padding.top,\n right: customPadding?.right ?? CHART_DEFAULTS.padding.right,\n bottom: customPadding?.bottom ?? (showXAxis ? 70 : CHART_DEFAULTS.padding.bottom),\n left: customPadding?.left ?? (showYAxis ? 60 : CHART_DEFAULTS.padding.left),\n }), [customPadding, showXAxis, showYAxis]);\n\n const chartWidth = width - padding.left - padding.right;\n const chartHeight = height - padding.top - padding.bottom;\n\n // Get unique categories (x values)\n const categories = useMemo(() => {\n const cats = data[0]?.data.map(d => String(d.x)) || [];\n return [...new Set(cats)];\n }, [data]);\n\n // Calculate Y domain\n const yDomainCalc = useMemo(() => {\n if (yDomain) return yDomain;\n\n if (stacked) {\n // For stacked, calculate max of cumulative values\n const maxStacked = categories.map((_, catIndex) => {\n return data.reduce((sum, series) => {\n return sum + (series.data[catIndex]?.y || 0);\n }, 0);\n });\n return calculateDomain([0, ...maxStacked], { includeZero: true, padding: 0.1 });\n }\n\n const allY = data.flatMap(s => s.data.map(d => d.y));\n return calculateDomain(allY, { includeZero: true, padding: 0.1 });\n }, [data, categories, stacked, yDomain]);\n\n // Create scales\n const xBandScale = useMemo(() =>\n scaleBand({\n domain: categories,\n range: horizontal ? [chartHeight, 0] : [0, chartWidth],\n padding: barCategoryGap,\n }),\n [categories, chartWidth, chartHeight, horizontal, barCategoryGap]\n );\n\n const yScale = useMemo(() =>\n scaleLinear({\n domain: yDomainCalc,\n range: horizontal ? [0, chartWidth] : [chartHeight, 0],\n }),\n [yDomainCalc, chartWidth, chartHeight, horizontal]\n );\n\n // Y axis ticks\n const yTicks = useMemo(() =>\n getTicks(yDomainCalc, yAxisTickCount),\n [yDomainCalc, yAxisTickCount]\n );\n\n // Y formatter\n const yFormatter = useMemo(() => {\n if (formatYValue) return formatYValue;\n return createTickFormatter(yDomainCalc);\n }, [formatYValue, yDomainCalc]);\n\n // Calculate bar dimensions\n const numSeries = data.length;\n const bandwidth = xBandScale.bandwidth();\n const barWidth = stacked\n ? bandwidth\n : (bandwidth - bandwidth * barGap * (numSeries - 1)) / numSeries;\n\n // Handle bar interactions\n const handleBarEnter = useCallback((\n e: React.MouseEvent,\n seriesIndex: number,\n barIndex: number\n ) => {\n const series = data[seriesIndex];\n const point = series.data[barIndex];\n\n setHoveredBar({ seriesIndex, barIndex });\n\n if (showTooltip && containerRef.current) {\n const rect = containerRef.current.getBoundingClientRect();\n const mouseX = e.clientX - rect.left;\n const mouseY = e.clientY - rect.top;\n\n const payload: TooltipPayloadItem[] = [{\n name: series.name,\n value: point.y,\n color: series.color || colors[seriesIndex % colors.length],\n payload: point,\n }];\n\n showTooltipFn({\n x: mouseX,\n y: mouseY,\n label: String(point.x),\n payload,\n });\n }\n\n onBarHover?.(point, seriesIndex, barIndex);\n }, [data, showTooltip, colors, showTooltipFn, onBarHover]);\n\n const handleBarLeave = useCallback(() => {\n setHoveredBar(null);\n hideTooltip();\n onBarHover?.(null, -1, -1);\n }, [hideTooltip, onBarHover]);\n\n const handleBarClick = useCallback((seriesIndex: number, barIndex: number) => {\n const point = data[seriesIndex].data[barIndex];\n onBarClick?.(point, seriesIndex, barIndex);\n }, [data, onBarClick]);\n\n // Prepare legend items\n const legendItems: LegendItem[] = useMemo(() =>\n data.map((series, i) => ({\n name: series.name,\n color: series.color || colors[i % colors.length],\n type: 'square' as const,\n })),\n [data, colors]\n );\n\n // Render bars\n const bars = useMemo(() => {\n const result: React.ReactNode[] = [];\n\n // Track cumulative values for stacking\n const cumulativeValues: Record<string, number> = {};\n\n data.forEach((series, seriesIndex) => {\n const color = series.color || colors[seriesIndex % colors.length];\n const radius = series.radius ?? barRadius;\n\n series.data.forEach((point, barIndex) => {\n const category = String(point.x);\n const baseX = xBandScale.scale(category);\n\n let barX: number, barY: number, barH: number, barW: number;\n\n if (stacked) {\n const prevValue = cumulativeValues[category] || 0;\n cumulativeValues[category] = prevValue + point.y;\n\n if (horizontal) {\n barX = yScale(prevValue);\n barY = baseX;\n barW = yScale(point.y) - yScale(0);\n barH = bandwidth;\n } else {\n barX = baseX;\n barY = yScale(prevValue + point.y);\n barW = bandwidth;\n barH = yScale(prevValue) - yScale(prevValue + point.y);\n }\n } else {\n const offset = seriesIndex * (barWidth + bandwidth * barGap / numSeries);\n\n if (horizontal) {\n barX = yScale(0);\n barY = baseX + offset;\n barW = yScale(point.y) - yScale(0);\n barH = barWidth;\n } else {\n barX = baseX + offset;\n barY = yScale(Math.max(0, point.y));\n barW = barWidth;\n barH = Math.abs(yScale(point.y) - yScale(0));\n }\n }\n\n const isHovered =\n hoveredBar?.seriesIndex === seriesIndex &&\n hoveredBar?.barIndex === barIndex;\n\n result.push(\n <rect\n key={`bar-${seriesIndex}-${barIndex}`}\n x={barX}\n y={barY}\n width={Math.max(0, barW)}\n height={Math.max(0, barH)}\n rx={radius}\n ry={radius}\n fill={color}\n opacity={isHovered ? 0.8 : 1}\n className=\"cursor-pointer transition-opacity duration-150\"\n style={animate ? {\n transform: horizontal ? 'scaleX(0)' : 'scaleY(0)',\n transformOrigin: horizontal ? 'left' : 'bottom',\n animation: `${horizontal ? 'growX' : 'growY'} ${animationDuration}ms ease-out ${barIndex * 50}ms forwards`,\n } : undefined}\n onMouseEnter={(e) => handleBarEnter(e, seriesIndex, barIndex)}\n onMouseLeave={handleBarLeave}\n onClick={() => handleBarClick(seriesIndex, barIndex)}\n />\n );\n\n // Value labels\n if (showValues) {\n const labelX = horizontal\n ? barX + barW + 8\n : barX + barW / 2;\n const labelY = horizontal\n ? barY + barH / 2\n : barY - 8;\n\n result.push(\n <text\n key={`value-${seriesIndex}-${barIndex}`}\n x={labelX}\n y={labelY}\n textAnchor={horizontal ? 'start' : 'middle'}\n dominantBaseline={horizontal ? 'middle' : 'auto'}\n fontSize={CHART_DEFAULTS.fontSize.gridLabel}\n fontWeight=\"600\"\n className=\"fill-[hsl(var(--foreground))]\"\n style={animate ? {\n opacity: 0,\n animation: `fadeIn 200ms ease-out ${animationDuration + barIndex * 50}ms forwards`,\n } : undefined}\n >\n {yFormatter(point.y)}\n </text>\n );\n }\n });\n });\n\n return result;\n }, [\n data, colors, barRadius, xBandScale, yScale, stacked, horizontal,\n bandwidth, barWidth, barGap, numSeries, hoveredBar, animate,\n animationDuration, showValues, yFormatter, handleBarEnter,\n handleBarLeave, handleBarClick\n ]);\n\n // Reference elements\n const referenceElements = useMemo(() => {\n if (!children) return null;\n\n const chartDimensions = { width: chartWidth, height: chartHeight, padding };\n const scales = {\n xScale: (value: number | string | Date) => xBandScale.scale(String(value)) + bandwidth / 2,\n yScale,\n };\n\n return React.Children.map(children, (child) => {\n if (!React.isValidElement(child)) return child;\n\n if (child.type === ReferenceLine || child.type === ReferenceArea || child.type === CartesianGrid) {\n return React.cloneElement(child as React.ReactElement<any>, {\n _chartDimensions: chartDimensions,\n _scales: scales,\n });\n }\n\n return child;\n });\n }, [children, chartWidth, chartHeight, padding, xBandScale, bandwidth, yScale]);\n\n const accessibleDescription = useMemo(() => {\n if (ariaLabel) return ariaLabel;\n const seriesNames = data.map(s => s.name).join(', ');\n return `Bar chart with ${data.length} series: ${seriesNames}`;\n }, [data, ariaLabel]);\n\n return (\n <div\n ref={containerRef}\n className={`relative ${className}`}\n style={{ width, height: 'auto' }}\n >\n <svg\n width={width}\n height={height}\n viewBox={`0 0 ${width} ${height}`}\n role=\"img\"\n aria-label={accessibleDescription}\n className=\"bg-[hsl(var(--card))]\"\n >\n <defs>\n <style>{`\n @keyframes growY {\n from { transform: scaleY(0); }\n to { transform: scaleY(1); }\n }\n @keyframes growX {\n from { transform: scaleX(0); }\n to { transform: scaleX(1); }\n }\n @keyframes fadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n }\n `}</style>\n </defs>\n\n <g transform={`translate(${padding.left}, ${padding.top})`}>\n {/* Grid */}\n {showGrid && (\n <CartesianGrid\n _chartDimensions={{ width: chartWidth, height: chartHeight }}\n horizontal={!horizontal}\n vertical={horizontal}\n horizontalPoints={horizontal ? undefined : yTicks.map(t => yScale(t))}\n verticalPoints={horizontal ? yTicks.map(t => yScale(t)) : undefined}\n />\n )}\n\n {/* Reference elements */}\n {referenceElements}\n\n {/* Bars */}\n {bars}\n\n {/* X Axis */}\n {showXAxis && (\n <g transform={`translate(0, ${chartHeight})`}>\n <line\n x1={0}\n y1={0}\n x2={chartWidth}\n y2={0}\n className=\"stroke-[hsl(var(--border))]\"\n />\n {categories.map((cat, i) => {\n const x = xBandScale.scale(cat) + bandwidth / 2;\n return (\n <g key={`x-tick-${i}`} transform={`translate(${x}, 0)`}>\n <line y2={6} className=\"stroke-[hsl(var(--border))]\" />\n <text\n y={20}\n textAnchor=\"middle\"\n fontSize={CHART_DEFAULTS.fontSize.gridLabel}\n className=\"fill-[hsl(var(--muted-foreground))]\"\n >\n {cat}\n </text>\n </g>\n );\n })}\n {xAxisLabel && (\n <text\n x={chartWidth / 2}\n y={50}\n textAnchor=\"middle\"\n fontSize={CHART_DEFAULTS.fontSize.axisLabel}\n fontWeight=\"500\"\n className=\"fill-[hsl(var(--foreground))]\"\n >\n {xAxisLabel}\n </text>\n )}\n </g>\n )}\n\n {/* Y Axis */}\n {showYAxis && (\n <g>\n <line\n x1={0}\n y1={0}\n x2={0}\n y2={chartHeight}\n className=\"stroke-[hsl(var(--border))]\"\n />\n {yTicks.map((tick, i) => (\n <g key={`y-tick-${i}`} transform={`translate(0, ${yScale(tick)})`}>\n <line x2={-6} className=\"stroke-[hsl(var(--border))]\" />\n <text\n x={-12}\n textAnchor=\"end\"\n dominantBaseline=\"middle\"\n fontSize={CHART_DEFAULTS.fontSize.gridLabel}\n className=\"fill-[hsl(var(--muted-foreground))]\"\n >\n {yFormatter(tick)}\n </text>\n </g>\n ))}\n {yAxisLabel && (\n <text\n x={-chartHeight / 2}\n y={-45}\n textAnchor=\"middle\"\n transform=\"rotate(-90)\"\n fontSize={CHART_DEFAULTS.fontSize.axisLabel}\n fontWeight=\"500\"\n className=\"fill-[hsl(var(--foreground))]\"\n >\n {yAxisLabel}\n </text>\n )}\n </g>\n )}\n </g>\n </svg>\n\n {/* Legend */}\n {showLegend && (\n <Legend items={legendItems} layout=\"horizontal\" align=\"center\" />\n )}\n\n {/* Tooltip */}\n {showTooltip && (\n <ChartTooltip\n {...tooltipData}\n formatter={tooltipFormatter}\n containerBounds={{ width, height }}\n />\n )}\n </div>\n );\n};\n","\"use client\";\n\nimport React, { useMemo, useCallback, useRef, useState } from 'react';\nimport { CHART_DEFAULTS } from './constants';\nimport { scaleLinear, calculateDomain, getTicks } from './utils/scales';\nimport { generateLinePath, generateMonotonePath, generateAreaPath, generateStackedAreaPath } from './utils/paths';\nimport { formatDate, createTickFormatter } from './utils/format';\nimport { ChartTooltip, useTooltip, type TooltipPayloadItem } from './components/ChartTooltip';\nimport { Legend, type LegendItem } from './components/Legend';\nimport { ReferenceLine } from './components/ReferenceLine';\nimport { ReferenceArea } from './components/ReferenceArea';\nimport { CartesianGrid } from './components/CartesianGrid';\n\nexport interface AreaChartDataPoint {\n x: string | number | Date;\n y: number;\n [key: string]: unknown;\n}\n\nexport interface AreaChartSeries {\n name: string;\n data: AreaChartDataPoint[];\n color?: string;\n fillOpacity?: number;\n strokeWidth?: number;\n type?: 'linear' | 'monotone';\n dot?: boolean;\n}\n\nexport interface AreaChartProps {\n /** Chart data - array of series */\n data: AreaChartSeries[];\n /** Chart width in pixels */\n width?: number;\n /** Chart height in pixels */\n height?: number;\n /** Padding inside the chart */\n padding?: { top?: number; right?: number; bottom?: number; left?: number };\n /** Show grid lines */\n showGrid?: boolean;\n /** Show X axis */\n showXAxis?: boolean;\n /** Show Y axis */\n showYAxis?: boolean;\n /** Show legend */\n showLegend?: boolean;\n /** Show tooltip on hover */\n showTooltip?: boolean;\n /** Show dots on data points */\n showDots?: boolean;\n /** Stack areas on top of each other */\n stacked?: boolean;\n /** Default fill opacity for areas */\n fillOpacity?: number;\n /** Use curved/smooth lines (shorthand for all series) */\n curved?: boolean;\n /** Animate on load */\n animate?: boolean;\n /** Animation duration in ms */\n animationDuration?: number;\n /** X axis label */\n xAxisLabel?: string;\n /** Y axis label */\n yAxisLabel?: string;\n /** Number of Y axis ticks */\n yAxisTickCount?: number;\n /** Custom Y axis domain */\n yDomain?: [number, number];\n /** Custom X axis formatter */\n formatXValue?: (value: string | number | Date) => string;\n /** Custom Y axis formatter */\n formatYValue?: (value: number) => string;\n /** Custom tooltip formatter */\n tooltipFormatter?: (value: number | string, name: string, payload: TooltipPayloadItem) => string;\n /** Click handler for data points */\n onPointClick?: (data: AreaChartDataPoint, seriesIndex: number, pointIndex: number) => void;\n /** Hover handler for data points */\n onPointHover?: (data: AreaChartDataPoint | null, seriesIndex: number, pointIndex: number) => void;\n /** Custom CSS class */\n className?: string;\n /** Chart children (ReferenceLine, etc.) */\n children?: React.ReactNode;\n /** Custom colors array */\n colors?: string[];\n /** ARIA label for accessibility */\n ariaLabel?: string;\n}\n\nexport const AreaChart: React.FC<AreaChartProps> = ({\n data,\n width: providedWidth,\n height: providedHeight,\n padding: customPadding,\n showGrid = true,\n showXAxis = true,\n showYAxis = true,\n showLegend = true,\n showTooltip = true,\n showDots = false,\n stacked = false,\n fillOpacity = 0.3,\n curved = true,\n animate = true,\n animationDuration = CHART_DEFAULTS.animation.duration,\n xAxisLabel,\n yAxisLabel,\n yAxisTickCount = 5,\n yDomain,\n formatXValue,\n formatYValue,\n tooltipFormatter,\n onPointClick,\n onPointHover,\n className = '',\n children,\n colors = CHART_DEFAULTS.colors,\n ariaLabel,\n}) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const [hoveredPoint, setHoveredPoint] = useState<{\n seriesIndex: number;\n pointIndex: number;\n } | null>(null);\n\n const { tooltipData, showTooltip: showTooltipFn, hideTooltip } = useTooltip();\n\n // Dimensions\n const width = providedWidth || 800;\n const height = providedHeight || 400;\n\n const padding = useMemo(() => ({\n top: customPadding?.top ?? CHART_DEFAULTS.padding.top,\n right: customPadding?.right ?? CHART_DEFAULTS.padding.right,\n bottom: customPadding?.bottom ?? (showXAxis ? 60 : CHART_DEFAULTS.padding.bottom),\n left: customPadding?.left ?? (showYAxis ? 60 : CHART_DEFAULTS.padding.left),\n }), [customPadding, showXAxis, showYAxis]);\n\n const chartWidth = width - padding.left - padding.right;\n const chartHeight = height - padding.top - padding.bottom;\n\n // Collect all data points\n const allPoints = useMemo(() =>\n data.flatMap(series => series.data),\n [data]\n );\n\n // Determine X value type\n const xValueType = useMemo(() => {\n const firstX = data[0]?.data[0]?.x;\n if (firstX instanceof Date) return 'date';\n if (typeof firstX === 'number') return 'number';\n return 'string';\n }, [data]);\n\n // Calculate domains\n const xDomainCalc = useMemo(() => {\n if (xValueType === 'date') {\n const dates = allPoints.map(p => (p.x as Date).getTime());\n return [Math.min(...dates), Math.max(...dates)] as [number, number];\n }\n if (xValueType === 'number') {\n const nums = allPoints.map(p => p.x as number);\n return [Math.min(...nums), Math.max(...nums)] as [number, number];\n }\n const maxLen = Math.max(...data.map(s => s.data.length));\n return [0, maxLen - 1] as [number, number];\n }, [allPoints, xValueType, data]);\n\n const yDomainCalc = useMemo(() => {\n if (yDomain) return yDomain;\n\n if (stacked) {\n // For stacked, calculate max of cumulative values\n const maxPoints = Math.max(...data.map(s => s.data.length));\n const maxStacked = Array.from({ length: maxPoints }, (_, i) => {\n return data.reduce((sum, series) => sum + (series.data[i]?.y || 0), 0);\n });\n return calculateDomain([0, ...maxStacked], { includeZero: true, padding: 0.1 });\n }\n\n const yValues = allPoints.map(p => p.y);\n return calculateDomain(yValues, { includeZero: true, padding: 0.1 });\n }, [allPoints, stacked, data, yDomain]);\n\n // Create scale functions\n const xScale = useMemo(() => {\n if (xValueType === 'date') {\n return (value: string | number | Date) => {\n const time = value instanceof Date ? value.getTime() : Number(value);\n return scaleLinear({\n domain: xDomainCalc,\n range: [0, chartWidth],\n })(time);\n };\n }\n if (xValueType === 'number') {\n const scale = scaleLinear({\n domain: xDomainCalc,\n range: [0, chartWidth],\n });\n return (value: string | number | Date) => scale(Number(value));\n }\n return (_value: string | number | Date, index: number = 0) => {\n const maxLen = Math.max(...data.map(s => s.data.length)) - 1;\n if (maxLen === 0) return chartWidth / 2;\n return (index / maxLen) * chartWidth;\n };\n }, [xValueType, xDomainCalc, chartWidth, data]);\n\n const yScale = useMemo(() =>\n scaleLinear({\n domain: yDomainCalc,\n range: [chartHeight, 0],\n }),\n [yDomainCalc, chartHeight]\n );\n\n // Y axis ticks\n const yTicks = useMemo(() =>\n getTicks(yDomainCalc, yAxisTickCount),\n [yDomainCalc, yAxisTickCount]\n );\n\n // X axis ticks\n const xTicks = useMemo(() => {\n if (xValueType === 'string') {\n return data[0]?.data.map((p, i) => ({ value: p.x, index: i })) || [];\n }\n const tickCount = Math.min(6, Math.max(2, data[0]?.data.length || 2));\n const ticks = getTicks(xDomainCalc, tickCount);\n return ticks.map(t => ({ value: t, index: 0 }));\n }, [xValueType, xDomainCalc, data]);\n\n // Format functions\n const xFormatter = useCallback((value: string | number | Date) => {\n if (formatXValue) return formatXValue(value);\n if (value instanceof Date) {\n const range = xDomainCalc[1] - xDomainCalc[0];\n return formatDate(value, range);\n }\n return String(value);\n }, [formatXValue, xDomainCalc]);\n\n const yFormatter = useMemo(() => {\n if (formatYValue) return formatYValue;\n return createTickFormatter(yDomainCalc);\n }, [formatYValue, yDomainCalc]);\n\n // Generate area paths\n const areaPaths = useMemo(() => {\n const paths: Array<{\n areaPath: string;\n linePath: string;\n points: Array<{ x: number; y: number }>;\n }> = [];\n\n // Track cumulative values for stacking\n const cumulativeY: number[] = Array(data[0]?.data.length || 0).fill(0);\n\n data.forEach((series) => {\n // Determine if curved: use series type if specified, otherwise use prop\n const seriesType = series.type;\n const isCurved = seriesType !== undefined ? seriesType === 'monotone' : curved;\n\n // Calculate points\n const points = series.data.map((point, i) => {\n const x = xScale(point.x, i);\n const baseY = stacked ? cumulativeY[i] : 0;\n const y = yScale(baseY + point.y);\n return { x, y, baseY: yScale(baseY) };\n });\n\n // Update cumulative for stacking\n if (stacked) {\n series.data.forEach((point, i) => {\n cumulativeY[i] += point.y;\n });\n }\n\n // Generate paths\n const linePoints = points.map(p => ({ x: p.x, y: p.y }));\n const linePath = isCurved\n ? generateMonotonePath(linePoints)\n : generateLinePath(linePoints);\n\n let areaPath: string;\n if (stacked && paths.length > 0) {\n // For stacked, use previous series as baseline\n const prevPoints = paths[paths.length - 1].points;\n areaPath = generateStackedAreaPath(linePoints, prevPoints, isCurved);\n } else {\n areaPath = generateAreaPath(linePoints, yScale(0), isCurved);\n }\n\n paths.push({\n areaPath,\n linePath,\n points: linePoints,\n });\n });\n\n return paths;\n }, [data, xScale, yScale, stacked, curved]);\n\n // Handle point interactions\n const handlePointEnter = useCallback((\n e: React.MouseEvent,\n seriesIndex: number,\n pointIndex: number\n ) => {\n const series = data[seriesIndex];\n const point = series.data[pointIndex];\n\n setHoveredPoint({ seriesIndex, pointIndex });\n\n if (showTooltip && containerRef.current) {\n const rect = containerRef.current.getBoundingClientRect();\n const mouseX = e.clientX - rect.left;\n const mouseY = e.clientY - rect.top;\n\n const payload: TooltipPayloadItem[] = [{\n name: series.name,\n value: point.y,\n color: series.color || colors[seriesIndex % colors.length],\n payload: point,\n }];\n\n showTooltipFn({\n x: mouseX,\n y: mouseY,\n label: xFormatter(point.x),\n payload,\n });\n }\n\n onPointHover?.(point, seriesIndex, pointIndex);\n }, [data, showTooltip, colors, xFormatter, showTooltipFn, onPointHover]);\n\n const handlePointLeave = useCallback(() => {\n setHoveredPoint(null);\n hideTooltip();\n onPointHover?.(null, -1, -1);\n }, [hideTooltip, onPointHover]);\n\n const handlePointClick = useCallback((seriesIndex: number, pointIndex: number) => {\n const point = data[seriesIndex].data[pointIndex];\n onPointClick?.(point, seriesIndex, pointIndex);\n }, [data, onPointClick]);\n\n // Prepare legend items\n const legendItems: LegendItem[] = useMemo(() =>\n data.map((series, i) => ({\n name: series.name,\n color: series.color || colors[i % colors.length],\n type: 'square' as const,\n })),\n [data, colors]\n );\n\n // Reference elements\n const referenceElements = useMemo(() => {\n if (!children) return null;\n\n const chartDimensions = { width: chartWidth, height: chartHeight, padding };\n const scales = {\n xScale: (value: number | string | Date) => {\n if (xValueType === 'string') {\n const index = data[0]?.data.findIndex(p => p.x === value) ?? 0;\n return xScale(value, index);\n }\n return xScale(value, 0);\n },\n yScale,\n };\n\n return React.Children.map(children, (child) => {\n if (!React.isValidElement(child)) return child;\n\n if (child.type === ReferenceLine || child.type === ReferenceArea || child.type === CartesianGrid) {\n return React.cloneElement(child as React.ReactElement<any>, {\n _chartDimensions: chartDimensions,\n _scales: scales,\n });\n }\n\n return child;\n });\n }, [children, chartWidth, chartHeight, padding, xScale, yScale, xValueType, data]);\n\n const accessibleDescription = useMemo(() => {\n if (ariaLabel) return ariaLabel;\n const seriesNames = data.map(s => s.name).join(', ');\n return `Area chart with ${data.length} series: ${seriesNames}`;\n }, [data, ariaLabel]);\n\n return (\n <div\n ref={containerRef}\n className={`relative ${className}`}\n style={{ width, height: 'auto' }}\n >\n <svg\n width={width}\n height={height}\n viewBox={`0 0 ${width} ${height}`}\n role=\"img\"\n aria-label={accessibleDescription}\n className=\"bg-[hsl(var(--card))]\"\n >\n <defs>\n {/* Gradients for areas */}\n {data.map((series, i) => {\n const color = series.color || colors[i % colors.length];\n return (\n <linearGradient\n key={`gradient-${i}`}\n id={`area-gradient-${i}`}\n x1=\"0\"\n y1=\"0\"\n x2=\"0\"\n y2=\"1\"\n >\n <stop offset=\"0%\" stopColor={color} stopOpacity={series.fillOpacity ?? fillOpacity} />\n <stop offset=\"100%\" stopColor={color} stopOpacity={0.05} />\n </linearGradient>\n );\n })}\n <style>{`\n @keyframes fadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n }\n @keyframes drawPath {\n from { stroke-dashoffset: 2000; }\n to { stroke-dashoffset: 0; }\n }\n `}</style>\n </defs>\n\n <g transform={`translate(${padding.left}, ${padding.top})`}>\n {/* Grid */}\n {showGrid && (\n <CartesianGrid\n _chartDimensions={{ width: chartWidth, height: chartHeight }}\n horizontalPoints={yTicks.map(t => yScale(t))}\n />\n )}\n\n {/* Reference elements */}\n {referenceElements}\n\n {/* Areas - render in reverse order for stacking visibility */}\n {[...data].reverse().map((series, reversedIndex) => {\n const seriesIndex = data.length - 1 - reversedIndex;\n const { areaPath, linePath } = areaPaths[seriesIndex];\n const color = series.color || colors[seriesIndex % colors.length];\n const strokeWidth = series.strokeWidth || CHART_DEFAULTS.line.strokeWidth;\n\n return (\n <g key={`area-${seriesIndex}`}>\n {/* Filled area */}\n <path\n d={areaPath}\n fill={`url(#area-gradient-${seriesIndex})`}\n style={animate ? {\n opacity: 0,\n animation: `fadeIn ${animationDuration}ms ease-out forwards`,\n } : undefined}\n />\n {/* Stroke line */}\n <path\n d={linePath}\n fill=\"none\"\n stroke={color}\n strokeWidth={strokeWidth}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n style={animate ? {\n strokeDasharray: 2000,\n animation: `drawPath ${animationDuration}ms ease-out forwards`,\n } : undefined}\n />\n </g>\n );\n })}\n\n {/* Data points */}\n {showDots && data.map((series, seriesIndex) => {\n const { points } = areaPaths[seriesIndex];\n const color = series.color || colors[seriesIndex % colors.length];\n const showSeriesDots = series.dot !== false;\n\n if (!showSeriesDots) return null;\n\n return points.map((point, pointIndex) => {\n const isHovered =\n hoveredPoint?.seriesIndex === seriesIndex &&\n hoveredPoint?.pointIndex === pointIndex;\n\n return (\n <circle\n key={`dot-${seriesIndex}-${pointIndex}`}\n cx={point.x}\n cy={point.y}\n r={isHovered ? CHART_DEFAULTS.line.activeDotRadius : CHART_DEFAULTS.line.dotRadius}\n fill={color}\n stroke=\"white\"\n strokeWidth={2}\n className=\"cursor-pointer transition-all duration-150\"\n style={animate ? {\n opacity: 0,\n animation: `fadeIn 200ms ease-out ${animationDuration + pointIndex * 20}ms forwards`,\n } : undefined}\n onMouseEnter={(e) => handlePointEnter(e, seriesIndex, pointIndex)}\n onMouseLeave={handlePointLeave}\n onClick={() => handlePointClick(seriesIndex, pointIndex)}\n />\n );\n });\n })}\n\n {/* X Axis */}\n {showXAxis && (\n <g transform={`translate(0, ${chartHeight})`}>\n <line\n x1={0}\n y1={0}\n x2={chartWidth}\n y2={0}\n className=\"stroke-[hsl(var(--border))]\"\n />\n {xTicks.map((tick, i) => {\n const x = xValueType === 'string'\n ? xScale(tick.value, tick.index)\n : xScale(xValueType === 'date' ? new Date(tick.value as number) : tick.value, 0);\n\n return (\n <g key={`x-tick-${i}`} transform={`translate(${x}, 0)`}>\n <line y2={6} className=\"stroke-[hsl(var(--border))]\" />\n <text\n y={20}\n textAnchor=\"middle\"\n fontSize={CHART_DEFAULTS.fontSize.gridLabel}\n className=\"fill-[hsl(var(--muted-foreground))]\"\n >\n {xFormatter(xValueType === 'date' ? new Date(tick.value as number) : tick.value)}\n </text>\n </g>\n );\n })}\n {xAxisLabel && (\n <text\n x={chartWidth / 2}\n y={50}\n textAnchor=\"middle\"\n fontSize={CHART_DEFAULTS.fontSize.axisLabel}\n fontWeight=\"500\"\n className=\"fill-[hsl(var(--foreground))]\"\n >\n {xAxisLabel}\n </text>\n )}\n </g>\n )}\n\n {/* Y Axis */}\n {showYAxis && (\n <g>\n <line\n x1={0}\n y1={0}\n x2={0}\n y2={chartHeight}\n className=\"stroke-[hsl(var(--border))]\"\n />\n {yTicks.map((tick, i) => (\n <g key={`y-tick-${i}`} transform={`translate(0, ${yScale(tick)})`}>\n <line x2={-6} className=\"stroke-[hsl(var(--border))]\" />\n <text\n x={-12}\n textAnchor=\"end\"\n dominantBaseline=\"middle\"\n fontSize={CHART_DEFAULTS.fontSize.gridLabel}\n className=\"fill-[hsl(var(--muted-foreground))]\"\n >\n {yFormatter(tick)}\n </text>\n </g>\n ))}\n {yAxisLabel && (\n <text\n x={-chartHeight / 2}\n y={-45}\n textAnchor=\"middle\"\n transform=\"rotate(-90)\"\n fontSize={CHART_DEFAULTS.fontSize.axisLabel}\n fontWeight=\"500\"\n className=\"fill-[hsl(var(--foreground))]\"\n >\n {yAxisLabel}\n </text>\n )}\n </g>\n )}\n </g>\n </svg>\n\n {/* Legend */}\n {showLegend && (\n <Legend items={legendItems} layout=\"horizontal\" align=\"center\" />\n )}\n\n {/* Tooltip */}\n {showTooltip && (\n <ChartTooltip\n {...tooltipData}\n formatter={tooltipFormatter}\n containerBounds={{ width, height }}\n />\n )}\n </div>\n );\n};\n","\"use client\";\n\nimport React, { useMemo, useCallback, useRef, useState } from 'react';\nimport { CHART_DEFAULTS } from './constants';\nimport { generateArcPath } from './utils/paths';\nimport { formatNumber, formatPercent } from './utils/format';\nimport { ChartTooltip, useTooltip, type TooltipPayloadItem } from './components/ChartTooltip';\nimport { Legend, type LegendItem } from './components/Legend';\n\nexport interface PieChartDataPoint {\n label: string;\n value: number;\n color?: string;\n [key: string]: unknown;\n}\n\nexport interface PieChartProps {\n /** Chart data - array of slices */\n data: PieChartDataPoint[];\n /** Chart width in pixels */\n width?: number;\n /** Chart height in pixels */\n height?: number;\n /** Inner radius for donut chart (0 for pie) */\n innerRadius?: number;\n /** Outer radius */\n outerRadius?: number;\n /** Enable donut mode (sets default inner radius) */\n donut?: boolean;\n /** Padding angle between slices (degrees) */\n paddingAngle?: number;\n /** Start angle (degrees, 0 = top) */\n startAngle?: number;\n /** End angle (degrees) */\n endAngle?: number;\n /** Show legend */\n showLegend?: boolean;\n /** Show tooltip on hover */\n showTooltip?: boolean;\n /** Show labels on slices */\n showLabels?: boolean;\n /** Label type */\n labelType?: 'percent' | 'value' | 'name' | 'custom';\n /** Custom label formatter */\n labelFormatter?: (data: PieChartDataPoint, percent: number) => string;\n /** Show percentages in labels */\n showPercentages?: boolean;\n /** Minimum percentage to show label */\n minLabelPercent?: number;\n /** Animate on load */\n animate?: boolean;\n /** Animation duration in ms */\n animationDuration?: number;\n /** Center label (for donut charts) */\n centerLabel?: string | React.ReactNode;\n /** Center value (for donut charts) */\n centerValue?: string | number;\n /** Custom tooltip formatter */\n tooltipFormatter?: (value: number | string, name: string, payload: TooltipPayloadItem) => string;\n /** Click handler for slices */\n onSliceClick?: (data: PieChartDataPoint, index: number) => void;\n /** Hover handler for slices */\n onSliceHover?: (data: PieChartDataPoint | null, index: number) => void;\n /** Custom CSS class */\n className?: string;\n /** Custom colors array */\n colors?: string[];\n /** ARIA label for accessibility */\n ariaLabel?: string;\n}\n\nexport const PieChart: React.FC<PieChartProps> = ({\n data,\n width: providedWidth,\n height: providedHeight,\n innerRadius: providedInnerRadius,\n outerRadius: providedOuterRadius,\n donut = false,\n paddingAngle = 0,\n startAngle = 0,\n endAngle = 360,\n showLegend = true,\n showTooltip = true,\n showLabels = true,\n labelType = 'percent',\n labelFormatter,\n showPercentages = false,\n minLabelPercent = 5,\n animate = true,\n animationDuration = CHART_DEFAULTS.animation.duration,\n centerLabel,\n centerValue,\n tooltipFormatter,\n onSliceClick,\n onSliceHover,\n className = '',\n colors = CHART_DEFAULTS.colors,\n ariaLabel,\n}) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const [hoveredSlice, setHoveredSlice] = useState<number | null>(null);\n const [activeSlice, setActiveSlice] = useState<number | null>(null);\n\n const { tooltipData, showTooltip: showTooltipFn, hideTooltip } = useTooltip();\n\n // Dimensions\n const width = providedWidth || 400;\n const height = providedHeight || 400;\n const size = Math.min(width, height);\n const centerX = width / 2;\n const centerY = height / 2;\n\n // Calculate radii\n const maxRadius = size / 2 - 20; // Padding for labels\n const outerRadius = providedOuterRadius || maxRadius;\n // If donut prop is true and no innerRadius specified, use 60% of outerRadius\n const innerRadius = providedInnerRadius ?? (donut ? outerRadius * 0.6 : 0);\n const isDonut = innerRadius > 0;\n\n // Calculate total and percentages\n const total = useMemo(() =>\n data.reduce((sum, d) => sum + d.value, 0),\n [data]\n );\n\n // Generate slices\n const slices = useMemo(() => {\n const angleRange = endAngle - startAngle;\n let currentAngle = startAngle;\n\n return data.map((item, index) => {\n const percent = total > 0 ? (item.value / total) * 100 : 0;\n const sliceAngle = (item.value / total) * angleRange;\n\n // Account for padding\n const actualStartAngle = currentAngle + (paddingAngle / 2);\n const actualEndAngle = currentAngle + sliceAngle - (paddingAngle / 2);\n\n const path = generateArcPath(\n centerX,\n centerY,\n outerRadius,\n actualStartAngle,\n actualEndAngle,\n innerRadius\n );\n\n // Calculate label position\n const midAngle = currentAngle + sliceAngle / 2;\n const labelRadius = isDonut\n ? innerRadius + (outerRadius - innerRadius) / 2\n : outerRadius * 0.65;\n const labelRad = (midAngle - 90) * Math.PI / 180;\n const labelX = centerX + labelRadius * Math.cos(labelRad);\n const labelY = centerY + labelRadius * Math.sin(labelRad);\n\n currentAngle += sliceAngle;\n\n return {\n ...item,\n index,\n path,\n percent,\n startAngle: actualStartAngle,\n endAngle: actualEndAngle,\n midAngle,\n labelX,\n labelY,\n color: item.color || colors[index % colors.length],\n };\n });\n }, [data, total, startAngle, endAngle, paddingAngle, centerX, centerY, outerRadius, innerRadius, isDonut, colors]);\n\n // Handle slice interactions\n const handleSliceEnter = useCallback((\n e: React.MouseEvent,\n index: number\n ) => {\n const slice = slices[index];\n\n setHoveredSlice(index);\n\n if (showTooltip && containerRef.current) {\n const rect = containerRef.current.getBoundingClientRect();\n const mouseX = e.clientX - rect.left;\n const mouseY = e.clientY - rect.top;\n\n const payload: TooltipPayloadItem[] = [{\n name: slice.label,\n value: slice.value,\n color: slice.color,\n payload: data[index],\n }];\n\n showTooltipFn({\n x: mouseX,\n y: mouseY,\n label: slice.label,\n payload,\n });\n }\n\n onSliceHover?.(data[index], index);\n }, [slices, data, showTooltip, showTooltipFn, onSliceHover]);\n\n const handleSliceLeave = useCallback(() => {\n setHoveredSlice(null);\n hideTooltip();\n onSliceHover?.(null, -1);\n }, [hideTooltip, onSliceHover]);\n\n const handleSliceClick = useCallback((index: number) => {\n setActiveSlice(prev => prev === index ? null : index);\n onSliceClick?.(data[index], index);\n }, [data, onSliceClick]);\n\n // Generate label text\n const getLabelText = useCallback((slice: typeof slices[0]) => {\n if (labelFormatter) {\n return labelFormatter(data[slice.index], slice.percent);\n }\n\n switch (labelType) {\n case 'percent':\n return `${slice.percent.toFixed(1)}%`;\n case 'value':\n return formatNumber(slice.value);\n case 'name':\n return slice.label;\n default:\n return `${slice.percent.toFixed(1)}%`;\n }\n }, [labelType, labelFormatter, data]);\n\n // Prepare legend items\n const legendItems: LegendItem[] = useMemo(() =>\n data.map((item, i) => ({\n name: `${item.label}${showPercentages ? ` (${((item.value / total) * 100).toFixed(1)}%)` : ''}`,\n color: item.color || colors[i % colors.length],\n type: 'square' as const,\n })),\n [data, colors, total, showPercentages]\n );\n\n const accessibleDescription = useMemo(() => {\n if (ariaLabel) return ariaLabel;\n const sliceNames = data.map(d => `${d.label}: ${d.value}`).join(', ');\n return `${isDonut ? 'Donut' : 'Pie'} chart with ${data.length} slices: ${sliceNames}`;\n }, [data, isDonut, ariaLabel]);\n\n return (\n <div\n ref={containerRef}\n className={`relative inline-flex flex-col items-center ${className}`}\n style={{ width }}\n >\n <svg\n width={width}\n height={height}\n viewBox={`0 0 ${width} ${height}`}\n role=\"img\"\n aria-label={accessibleDescription}\n className=\"bg-[hsl(var(--card))]\"\n >\n <defs>\n <style>{`\n @keyframes rotateIn {\n from {\n transform: rotate(-90deg);\n opacity: 0;\n }\n to {\n transform: rotate(0deg);\n opacity: 1;\n }\n }\n @keyframes fadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n }\n `}</style>\n </defs>\n\n {/* Slices */}\n <g style={animate ? {\n transformOrigin: `${centerX}px ${centerY}px`,\n animation: `rotateIn ${animationDuration}ms ease-out forwards`,\n } : undefined}>\n {slices.map((slice) => {\n const isHovered = hoveredSlice === slice.index;\n const isActive = activeSlice === slice.index;\n\n // Scale up on hover/active\n const scale = isHovered || isActive ? 1.03 : 1;\n const transform = `translate(${centerX}px, ${centerY}px) scale(${scale}) translate(${-centerX}px, ${-centerY}px)`;\n\n return (\n <g key={slice.index}>\n <path\n d={slice.path}\n fill={slice.color}\n stroke=\"white\"\n strokeWidth={2}\n className=\"cursor-pointer transition-transform duration-150\"\n style={{ transform }}\n onMouseEnter={(e) => handleSliceEnter(e, slice.index)}\n onMouseLeave={handleSliceLeave}\n onClick={() => handleSliceClick(slice.index)}\n />\n\n {/* Labels */}\n {showLabels && slice.percent >= minLabelPercent && (\n <text\n x={slice.labelX}\n y={slice.labelY}\n textAnchor=\"middle\"\n dominantBaseline=\"middle\"\n fontSize={CHART_DEFAULTS.fontSize.gridLabel}\n fontWeight=\"600\"\n className=\"fill-white dark:fill-white pointer-events-none\"\n style={animate ? {\n opacity: 0,\n animation: `fadeIn 200ms ease-out ${animationDuration}ms forwards`,\n } : undefined}\n >\n {getLabelText(slice)}\n </text>\n )}\n </g>\n );\n })}\n </g>\n\n {/* Center content for donut */}\n {isDonut && (centerLabel || centerValue !== undefined) && (\n <g>\n {centerValue !== undefined && (\n <text\n x={centerX}\n y={centerY - (centerLabel ? 8 : 0)}\n textAnchor=\"middle\"\n dominantBaseline=\"middle\"\n fontSize={CHART_DEFAULTS.fontSize.title}\n fontWeight=\"700\"\n className=\"fill-[hsl(var(--foreground))]\"\n >\n {typeof centerValue === 'number' ? formatNumber(centerValue) : centerValue}\n </text>\n )}\n {centerLabel && (\n typeof centerLabel === 'string' ? (\n <text\n x={centerX}\n y={centerY + (centerValue !== undefined ? 16 : 0)}\n textAnchor=\"middle\"\n dominantBaseline=\"middle\"\n fontSize={CHART_DEFAULTS.fontSize.gridLabel}\n className=\"fill-[hsl(var(--muted-foreground))]\"\n >\n {centerLabel}\n </text>\n ) : (\n <foreignObject\n x={centerX - innerRadius * 0.7}\n y={centerY - innerRadius * 0.3}\n width={innerRadius * 1.4}\n height={innerRadius * 0.6}\n >\n {centerLabel}\n </foreignObject>\n )\n )}\n </g>\n )}\n </svg>\n\n {/* Legend */}\n {showLegend && (\n <Legend\n items={legendItems}\n layout=\"horizontal\"\n align=\"center\"\n onClick={(item, index) => handleSliceClick(index)}\n onMouseEnter={(item, index) => setHoveredSlice(index)}\n onMouseLeave={() => setHoveredSlice(null)}\n />\n )}\n\n {/* Tooltip */}\n {showTooltip && (\n <ChartTooltip\n {...tooltipData}\n formatter={tooltipFormatter || ((value) => `${formatNumber(value as number)} (${formatPercent((value as number) / total * 100)})`)}\n containerBounds={{ width, height }}\n />\n )}\n </div>\n );\n};\n","\"use client\";\n\nimport React, { useMemo, useCallback, useRef, useState } from 'react';\nimport { CHART_DEFAULTS } from './constants';\nimport { scaleLinear, calculateDomain, getTicks } from './utils/scales';\nimport { createTickFormatter } from './utils/format';\nimport { ChartTooltip, useTooltip, type TooltipPayloadItem } from './components/ChartTooltip';\nimport { Legend, type LegendItem } from './components/Legend';\nimport { ReferenceLine } from './components/ReferenceLine';\nimport { ReferenceArea } from './components/ReferenceArea';\nimport { CartesianGrid } from './components/CartesianGrid';\n\nexport interface ScatterChartDataPoint {\n x: number;\n y: number;\n z?: number; // For bubble size\n label?: string;\n [key: string]: unknown;\n}\n\nexport interface ScatterChartSeries {\n name: string;\n data: ScatterChartDataPoint[];\n color?: string;\n shape?: 'circle' | 'square' | 'triangle' | 'diamond';\n size?: number;\n}\n\nexport interface ScatterChartProps {\n /** Chart data - array of series */\n data: ScatterChartSeries[];\n /** Chart width in pixels */\n width?: number;\n /** Chart height in pixels */\n height?: number;\n /** Padding inside the chart */\n padding?: { top?: number; right?: number; bottom?: number; left?: number };\n /** Show grid lines */\n showGrid?: boolean;\n /** Show X axis */\n showXAxis?: boolean;\n /** Show Y axis */\n showYAxis?: boolean;\n /** Show legend */\n showLegend?: boolean;\n /** Show tooltip on hover */\n showTooltip?: boolean;\n /** Enable bubble mode (size based on z value) */\n bubble?: boolean;\n /** Min bubble size */\n minBubbleSize?: number;\n /** Max bubble size */\n maxBubbleSize?: number;\n /** Default point size */\n pointSize?: number;\n /** Animate on load */\n animate?: boolean;\n /** Animation duration in ms */\n animationDuration?: number;\n /** X axis label */\n xAxisLabel?: string;\n /** Y axis label */\n yAxisLabel?: string;\n /** Number of X axis ticks */\n xAxisTickCount?: number;\n /** Number of Y axis ticks */\n yAxisTickCount?: number;\n /** Custom X axis domain */\n xDomain?: [number, number];\n /** Custom Y axis domain */\n yDomain?: [number, number];\n /** Custom X axis formatter */\n formatXValue?: (value: number) => string;\n /** Custom Y axis formatter */\n formatYValue?: (value: number) => string;\n /** Custom tooltip formatter */\n tooltipFormatter?: (value: number | string, name: string, payload: TooltipPayloadItem) => string;\n /** Click handler for points */\n onPointClick?: (data: ScatterChartDataPoint, seriesIndex: number, pointIndex: number) => void;\n /** Hover handler for points */\n onPointHover?: (data: ScatterChartDataPoint | null, seriesIndex: number, pointIndex: number) => void;\n /** Show trend line */\n showTrendLine?: boolean;\n /** Custom CSS class */\n className?: string;\n /** Chart children (ReferenceLine, etc.) */\n children?: React.ReactNode;\n /** Custom colors array */\n colors?: string[];\n /** ARIA label for accessibility */\n ariaLabel?: string;\n}\n\n// Calculate linear regression for trend line\nfunction linearRegression(points: Array<{ x: number; y: number }>): { slope: number; intercept: number } {\n const n = points.length;\n if (n === 0) return { slope: 0, intercept: 0 };\n\n let sumX = 0, sumY = 0, sumXY = 0, sumXX = 0;\n\n for (const p of points) {\n sumX += p.x;\n sumY += p.y;\n sumXY += p.x * p.y;\n sumXX += p.x * p.x;\n }\n\n const denominator = n * sumXX - sumX * sumX;\n if (denominator === 0) return { slope: 0, intercept: sumY / n };\n\n const slope = (n * sumXY - sumX * sumY) / denominator;\n const intercept = (sumY - slope * sumX) / n;\n\n return { slope, intercept };\n}\n\n// Shape renderers\nconst renderShape = (\n shape: string,\n x: number,\n y: number,\n size: number,\n color: string,\n commonProps: {\n className?: string;\n stroke?: string;\n strokeWidth?: number;\n onMouseEnter?: (e: React.MouseEvent) => void;\n onMouseLeave?: () => void;\n onClick?: () => void;\n }\n): React.ReactNode => {\n const { className, stroke, strokeWidth, onMouseEnter, onMouseLeave, onClick } = commonProps;\n\n switch (shape) {\n case 'square':\n return (\n <rect\n x={x - size / 2}\n y={y - size / 2}\n width={size}\n height={size}\n fill={color}\n className={className}\n stroke={stroke}\n strokeWidth={strokeWidth}\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n onClick={onClick}\n />\n );\n case 'triangle': {\n const h = size * 0.866; // sqrt(3)/2\n const points = `${x},${y - h / 2} ${x - size / 2},${y + h / 2} ${x + size / 2},${y + h / 2}`;\n return (\n <polygon\n points={points}\n fill={color}\n className={className}\n stroke={stroke}\n strokeWidth={strokeWidth}\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n onClick={onClick}\n />\n );\n }\n case 'diamond': {\n const d = size / 1.414; // sqrt(2)\n const diamondPoints = `${x},${y - d} ${x + d},${y} ${x},${y + d} ${x - d},${y}`;\n return (\n <polygon\n points={diamondPoints}\n fill={color}\n className={className}\n stroke={stroke}\n strokeWidth={strokeWidth}\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n onClick={onClick}\n />\n );\n }\n case 'circle':\n default:\n return (\n <circle\n cx={x}\n cy={y}\n r={size / 2}\n fill={color}\n className={className}\n stroke={stroke}\n strokeWidth={strokeWidth}\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n onClick={onClick}\n />\n );\n }\n};\n\nexport const ScatterChart: React.FC<ScatterChartProps> = ({\n data,\n width: providedWidth,\n height: providedHeight,\n padding: customPadding,\n showGrid = true,\n showXAxis = true,\n showYAxis = true,\n showLegend = true,\n showTooltip = true,\n bubble = false,\n minBubbleSize = 8,\n maxBubbleSize = 40,\n pointSize = 8,\n animate = true,\n animationDuration = CHART_DEFAULTS.animation.duration,\n xAxisLabel,\n yAxisLabel,\n xAxisTickCount = 5,\n yAxisTickCount = 5,\n xDomain,\n yDomain,\n formatXValue,\n formatYValue,\n tooltipFormatter,\n onPointClick,\n onPointHover,\n showTrendLine = false,\n className = '',\n children,\n colors = CHART_DEFAULTS.colors,\n ariaLabel,\n}) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const [hoveredPoint, setHoveredPoint] = useState<{\n seriesIndex: number;\n pointIndex: number;\n } | null>(null);\n\n const { tooltipData, showTooltip: showTooltipFn, hideTooltip } = useTooltip();\n\n // Dimensions\n const width = providedWidth || 800;\n const height = providedHeight || 400;\n\n const padding = useMemo(() => ({\n top: customPadding?.top ?? CHART_DEFAULTS.padding.top,\n right: customPadding?.right ?? CHART_DEFAULTS.padding.right,\n bottom: customPadding?.bottom ?? (showXAxis ? 60 : CHART_DEFAULTS.padding.bottom),\n left: customPadding?.left ?? (showYAxis ? 60 : CHART_DEFAULTS.padding.left),\n }), [customPadding, showXAxis, showYAxis]);\n\n const chartWidth = width - padding.left - padding.right;\n const chartHeight = height - padding.top - padding.bottom;\n\n // Collect all data points\n const allPoints = useMemo(() =>\n data.flatMap(series => series.data),\n [data]\n );\n\n // Calculate domains\n const xDomainCalc = useMemo(() => {\n if (xDomain) return xDomain;\n const xValues = allPoints.map(p => p.x);\n return calculateDomain(xValues, { includeZero: false, padding: 0.1 });\n }, [allPoints, xDomain]);\n\n const yDomainCalc = useMemo(() => {\n if (yDomain) return yDomain;\n const yValues = allPoints.map(p => p.y);\n return calculateDomain(yValues, { includeZero: false, padding: 0.1 });\n }, [allPoints, yDomain]);\n\n // Z domain for bubble sizing\n const zDomain = useMemo(() => {\n if (!bubble) return [0, 1] as [number, number];\n const zValues = allPoints.map(p => p.z || 0).filter(z => z > 0);\n if (zValues.length === 0) return [0, 1] as [number, number];\n return [Math.min(...zValues), Math.max(...zValues)] as [number, number];\n }, [allPoints, bubble]);\n\n // Create scale functions\n const xScale = useMemo(() =>\n scaleLinear({\n domain: xDomainCalc,\n range: [0, chartWidth],\n }),\n [xDomainCalc, chartWidth]\n );\n\n const yScale = useMemo(() =>\n scaleLinear({\n domain: yDomainCalc,\n range: [chartHeight, 0],\n }),\n [yDomainCalc, chartHeight]\n );\n\n const sizeScale = useMemo(() => {\n if (!bubble) return () => pointSize;\n return scaleLinear({\n domain: zDomain,\n range: [minBubbleSize, maxBubbleSize],\n });\n }, [bubble, zDomain, minBubbleSize, maxBubbleSize, pointSize]);\n\n // Axis ticks\n const xTicks = useMemo(() => getTicks(xDomainCalc, xAxisTickCount), [xDomainCalc, xAxisTickCount]);\n const yTicks = useMemo(() => getTicks(yDomainCalc, yAxisTickCount), [yDomainCalc, yAxisTickCount]);\n\n // Formatters\n const xFormatter = useMemo(() => formatXValue || createTickFormatter(xDomainCalc), [formatXValue, xDomainCalc]);\n const yFormatter = useMemo(() => formatYValue || createTickFormatter(yDomainCalc), [formatYValue, yDomainCalc]);\n\n // Calculate trend lines\n const trendLines = useMemo(() => {\n if (!showTrendLine) return [];\n\n return data.map(series => {\n const regression = linearRegression(series.data);\n const x1 = xDomainCalc[0];\n const x2 = xDomainCalc[1];\n const y1 = regression.slope * x1 + regression.intercept;\n const y2 = regression.slope * x2 + regression.intercept;\n\n return {\n x1: xScale(x1),\n y1: yScale(y1),\n x2: xScale(x2),\n y2: yScale(y2),\n };\n });\n }, [data, showTrendLine, xDomainCalc, xScale, yScale]);\n\n // Handle point interactions\n const handlePointEnter = useCallback((\n e: React.MouseEvent,\n seriesIndex: number,\n pointIndex: number\n ) => {\n const series = data[seriesIndex];\n const point = series.data[pointIndex];\n\n setHoveredPoint({ seriesIndex, pointIndex });\n\n if (showTooltip && containerRef.current) {\n const rect = containerRef.current.getBoundingClientRect();\n const mouseX = e.clientX - rect.left;\n const mouseY = e.clientY - rect.top;\n\n const payload: TooltipPayloadItem[] = [\n { name: 'X', value: point.x, color: series.color || colors[seriesIndex % colors.length] },\n { name: 'Y', value: point.y, color: series.color || colors[seriesIndex % colors.length] },\n ];\n\n if (bubble && point.z !== undefined) {\n payload.push({ name: 'Size', value: point.z, color: series.color || colors[seriesIndex % colors.length] });\n }\n\n showTooltipFn({\n x: mouseX,\n y: mouseY,\n label: point.label || series.name,\n payload,\n });\n }\n\n onPointHover?.(point, seriesIndex, pointIndex);\n }, [data, showTooltip, colors, bubble, showTooltipFn, onPointHover]);\n\n const handlePointLeave = useCallback(() => {\n setHoveredPoint(null);\n hideTooltip();\n onPointHover?.(null, -1, -1);\n }, [hideTooltip, onPointHover]);\n\n const handlePointClick = useCallback((seriesIndex: number, pointIndex: number) => {\n const point = data[seriesIndex].data[pointIndex];\n onPointClick?.(point, seriesIndex, pointIndex);\n }, [data, onPointClick]);\n\n // Prepare legend items\n const legendItems: LegendItem[] = useMemo(() =>\n data.map((series, i) => ({\n name: series.name,\n color: series.color || colors[i % colors.length],\n type: (series.shape || 'circle') as 'circle' | 'square',\n })),\n [data, colors]\n );\n\n // Reference elements\n const referenceElements = useMemo(() => {\n if (!children) return null;\n\n const chartDimensions = { width: chartWidth, height: chartHeight, padding };\n const scales = { xScale, yScale };\n\n return React.Children.map(children, (child) => {\n if (!React.isValidElement(child)) return child;\n\n if (child.type === ReferenceLine || child.type === ReferenceArea || child.type === CartesianGrid) {\n return React.cloneElement(child as React.ReactElement<any>, {\n _chartDimensions: chartDimensions,\n _scales: scales,\n });\n }\n\n return child;\n });\n }, [children, chartWidth, chartHeight, padding, xScale, yScale]);\n\n const accessibleDescription = useMemo(() => {\n if (ariaLabel) return ariaLabel;\n const totalPoints = data.reduce((sum, s) => sum + s.data.length, 0);\n return `Scatter chart with ${data.length} series and ${totalPoints} data points`;\n }, [data, ariaLabel]);\n\n return (\n <div\n ref={containerRef}\n className={`relative ${className}`}\n style={{ width, height: 'auto' }}\n >\n <svg\n width={width}\n height={height}\n viewBox={`0 0 ${width} ${height}`}\n role=\"img\"\n aria-label={accessibleDescription}\n className=\"bg-[hsl(var(--card))]\"\n >\n <defs>\n <style>{`\n @keyframes popIn {\n from {\n transform: scale(0);\n opacity: 0;\n }\n to {\n transform: scale(1);\n opacity: 1;\n }\n }\n `}</style>\n </defs>\n\n <g transform={`translate(${padding.left}, ${padding.top})`}>\n {/* Grid */}\n {showGrid && (\n <CartesianGrid\n _chartDimensions={{ width: chartWidth, height: chartHeight }}\n horizontalPoints={yTicks.map(t => yScale(t))}\n verticalPoints={xTicks.map(t => xScale(t))}\n />\n )}\n\n {/* Reference elements */}\n {referenceElements}\n\n {/* Trend lines */}\n {showTrendLine && trendLines.map((line, i) => (\n <line\n key={`trend-${i}`}\n x1={line.x1}\n y1={line.y1}\n x2={line.x2}\n y2={line.y2}\n stroke={data[i].color || colors[i % colors.length]}\n strokeWidth={2}\n strokeDasharray=\"5 5\"\n opacity={0.5}\n />\n ))}\n\n {/* Data points */}\n {data.map((series, seriesIndex) => {\n const color = series.color || colors[seriesIndex % colors.length];\n const shape = series.shape || 'circle';\n const baseSize = series.size || pointSize;\n\n return series.data.map((point, pointIndex) => {\n const x = xScale(point.x);\n const y = yScale(point.y);\n const size = bubble && point.z !== undefined\n ? sizeScale(point.z)\n : baseSize;\n\n const isHovered =\n hoveredPoint?.seriesIndex === seriesIndex &&\n hoveredPoint?.pointIndex === pointIndex;\n\n const displaySize = isHovered ? size * 1.3 : size;\n\n return (\n <g\n key={`point-${seriesIndex}-${pointIndex}`}\n style={animate ? {\n transformOrigin: `${x}px ${y}px`,\n animation: `popIn 200ms ease-out ${pointIndex * 30}ms forwards`,\n opacity: 0,\n } : undefined}\n >\n {renderShape(shape, x, y, displaySize, color, {\n className: 'cursor-pointer transition-all duration-150',\n stroke: 'white',\n strokeWidth: 2,\n onMouseEnter: (e: any) => handlePointEnter(e, seriesIndex, pointIndex),\n onMouseLeave: handlePointLeave,\n onClick: () => handlePointClick(seriesIndex, pointIndex),\n } as any)}\n </g>\n );\n });\n })}\n\n {/* X Axis */}\n {showXAxis && (\n <g transform={`translate(0, ${chartHeight})`}>\n <line\n x1={0}\n y1={0}\n x2={chartWidth}\n y2={0}\n className=\"stroke-[hsl(var(--border))]\"\n />\n {xTicks.map((tick, i) => (\n <g key={`x-tick-${i}`} transform={`translate(${xScale(tick)}, 0)`}>\n <line y2={6} className=\"stroke-[hsl(var(--border))]\" />\n <text\n y={20}\n textAnchor=\"middle\"\n fontSize={CHART_DEFAULTS.fontSize.gridLabel}\n className=\"fill-[hsl(var(--muted-foreground))]\"\n >\n {xFormatter(tick)}\n </text>\n </g>\n ))}\n {xAxisLabel && (\n <text\n x={chartWidth / 2}\n y={50}\n textAnchor=\"middle\"\n fontSize={CHART_DEFAULTS.fontSize.axisLabel}\n fontWeight=\"500\"\n className=\"fill-[hsl(var(--foreground))]\"\n >\n {xAxisLabel}\n </text>\n )}\n </g>\n )}\n\n {/* Y Axis */}\n {showYAxis && (\n <g>\n <line\n x1={0}\n y1={0}\n x2={0}\n y2={chartHeight}\n className=\"stroke-[hsl(var(--border))]\"\n />\n {yTicks.map((tick, i) => (\n <g key={`y-tick-${i}`} transform={`translate(0, ${yScale(tick)})`}>\n <line x2={-6} className=\"stroke-[hsl(var(--border))]\" />\n <text\n x={-12}\n textAnchor=\"end\"\n dominantBaseline=\"middle\"\n fontSize={CHART_DEFAULTS.fontSize.gridLabel}\n className=\"fill-[hsl(var(--muted-foreground))]\"\n >\n {yFormatter(tick)}\n </text>\n </g>\n ))}\n {yAxisLabel && (\n <text\n x={-chartHeight / 2}\n y={-45}\n textAnchor=\"middle\"\n transform=\"rotate(-90)\"\n fontSize={CHART_DEFAULTS.fontSize.axisLabel}\n fontWeight=\"500\"\n className=\"fill-[hsl(var(--foreground))]\"\n >\n {yAxisLabel}\n </text>\n )}\n </g>\n )}\n </g>\n </svg>\n\n {/* Legend */}\n {showLegend && (\n <Legend items={legendItems} layout=\"horizontal\" align=\"center\" />\n )}\n\n {/* Tooltip */}\n {showTooltip && (\n <ChartTooltip\n {...tooltipData}\n formatter={tooltipFormatter}\n containerBounds={{ width, height }}\n />\n )}\n </div>\n );\n};\n","\"use client\";\n\nimport React, { useRef, useState, useEffect, useCallback } from 'react';\n\nexport interface ResponsiveContainerProps {\n /** Width of the container. Can be number (px) or string (%, auto) */\n width?: number | string;\n /** Height of the container. Can be number (px) or string (%, auto) */\n height?: number | string;\n /** Aspect ratio (width/height) - used when height is not specified */\n aspect?: number;\n /** Minimum width in pixels */\n minWidth?: number;\n /** Minimum height in pixels */\n minHeight?: number;\n /** Maximum width in pixels */\n maxWidth?: number;\n /** Maximum height in pixels */\n maxHeight?: number;\n /** Debounce resize events (ms) */\n debounce?: number;\n /** Additional CSS class */\n className?: string;\n /** Children - should be a single chart element */\n children: React.ReactElement;\n /** Callback when dimensions change */\n onResize?: (width: number, height: number) => void;\n}\n\nexport const ResponsiveContainer: React.FC<ResponsiveContainerProps> = ({\n width = '100%',\n height,\n aspect,\n minWidth = 0,\n minHeight = 0,\n maxWidth,\n maxHeight,\n debounce = 0,\n className = '',\n children,\n onResize,\n}) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const [dimensions, setDimensions] = useState<{ width: number; height: number }>({\n width: 0,\n height: 0,\n });\n const debounceTimerRef = useRef<NodeJS.Timeout | null>(null);\n\n const calculateDimensions = useCallback((containerWidth: number, containerHeight: number) => {\n let finalWidth = containerWidth;\n let finalHeight = containerHeight;\n\n // Apply aspect ratio if height not specified\n if (aspect && !height) {\n finalHeight = containerWidth / aspect;\n }\n\n // Apply min/max constraints\n finalWidth = Math.max(minWidth, finalWidth);\n finalHeight = Math.max(minHeight, finalHeight);\n\n if (maxWidth) {\n finalWidth = Math.min(maxWidth, finalWidth);\n }\n if (maxHeight) {\n finalHeight = Math.min(maxHeight, finalHeight);\n }\n\n return { width: finalWidth, height: finalHeight };\n }, [aspect, height, minWidth, minHeight, maxWidth, maxHeight]);\n\n const handleResize = useCallback((entries: ResizeObserverEntry[]) => {\n const entry = entries[0];\n if (!entry) return;\n\n const { width: containerWidth, height: containerHeight } = entry.contentRect;\n const newDimensions = calculateDimensions(containerWidth, containerHeight);\n\n const updateDimensions = () => {\n setDimensions(newDimensions);\n onResize?.(newDimensions.width, newDimensions.height);\n };\n\n if (debounce > 0) {\n if (debounceTimerRef.current) {\n clearTimeout(debounceTimerRef.current);\n }\n debounceTimerRef.current = setTimeout(updateDimensions, debounce);\n } else {\n updateDimensions();\n }\n }, [calculateDimensions, debounce, onResize]);\n\n useEffect(() => {\n const container = containerRef.current;\n if (!container) return;\n\n const observer = new ResizeObserver(handleResize);\n observer.observe(container);\n\n // Initial measurement\n const rect = container.getBoundingClientRect();\n const initialDimensions = calculateDimensions(rect.width, rect.height);\n setDimensions(initialDimensions);\n\n return () => {\n observer.disconnect();\n if (debounceTimerRef.current) {\n clearTimeout(debounceTimerRef.current);\n }\n };\n }, [handleResize, calculateDimensions]);\n\n const containerStyle: React.CSSProperties = {\n width: typeof width === 'number' ? `${width}px` : width,\n height: height ? (typeof height === 'number' ? `${height}px` : height) : 'auto',\n minWidth: minWidth ? `${minWidth}px` : undefined,\n minHeight: minHeight ? `${minHeight}px` : undefined,\n maxWidth: maxWidth ? `${maxWidth}px` : undefined,\n maxHeight: maxHeight ? `${maxHeight}px` : undefined,\n };\n\n // Don't render children until we have dimensions\n if (dimensions.width === 0 || dimensions.height === 0) {\n return (\n <div\n ref={containerRef}\n className={`relative ${className}`}\n style={containerStyle}\n />\n );\n }\n\n // Clone the child element and inject dimensions\n const chartElement = React.cloneElement(\n children as React.ReactElement<{ width?: number; height?: number }>,\n {\n width: dimensions.width,\n height: dimensions.height,\n }\n );\n\n return (\n <div\n ref={containerRef}\n className={`relative ${className}`}\n style={containerStyle}\n >\n {chartElement}\n </div>\n );\n};\n","\"use client\";\n\nimport React, { useMemo, useState } from 'react';\n\nexport interface HeatmapDataPoint {\n x: string | number;\n y: string | number;\n value: number;\n}\n\nexport interface HeatmapProps {\n data: HeatmapDataPoint[];\n xLabels?: string[];\n yLabels?: string[];\n colorScale?: 'blue' | 'green' | 'red' | 'purple' | 'orange' | 'gray';\n minValue?: number;\n maxValue?: number;\n showValues?: boolean;\n showTooltip?: boolean;\n cellSize?: number;\n cellGap?: number;\n className?: string;\n onCellClick?: (point: HeatmapDataPoint) => void;\n formatValue?: (value: number) => string;\n formatTooltip?: (point: HeatmapDataPoint) => string;\n}\n\nconst COLOR_SCALES = {\n blue: {\n light: ['#eff6ff', '#dbeafe', '#bfdbfe', '#93c5fd', '#60a5fa', '#3b82f6', '#2563eb', '#1d4ed8', '#1e40af'],\n dark: ['#1e3a5f', '#1e4976', '#1e5a8d', '#2563eb', '#3b82f6', '#60a5fa', '#93c5fd', '#bfdbfe', '#dbeafe'],\n },\n green: {\n light: ['#f0fdf4', '#dcfce7', '#bbf7d0', '#86efac', '#4ade80', '#22c55e', '#16a34a', '#15803d', '#166534'],\n dark: ['#14532d', '#166534', '#15803d', '#16a34a', '#22c55e', '#4ade80', '#86efac', '#bbf7d0', '#dcfce7'],\n },\n red: {\n light: ['#fef2f2', '#fee2e2', '#fecaca', '#fca5a5', '#f87171', '#ef4444', '#dc2626', '#b91c1c', '#991b1b'],\n dark: ['#450a0a', '#7f1d1d', '#991b1b', '#b91c1c', '#dc2626', '#ef4444', '#f87171', '#fca5a5', '#fecaca'],\n },\n purple: {\n light: ['#faf5ff', '#f3e8ff', '#e9d5ff', '#d8b4fe', '#c084fc', '#a855f7', '#9333ea', '#7e22ce', '#6b21a8'],\n dark: ['#3b0764', '#4c1d95', '#5b21b6', '#6d28d9', '#7c3aed', '#8b5cf6', '#a78bfa', '#c4b5fd', '#ddd6fe'],\n },\n orange: {\n light: ['#fff7ed', '#ffedd5', '#fed7aa', '#fdba74', '#fb923c', '#f97316', '#ea580c', '#c2410c', '#9a3412'],\n dark: ['#431407', '#7c2d12', '#9a3412', '#c2410c', '#ea580c', '#f97316', '#fb923c', '#fdba74', '#fed7aa'],\n },\n gray: {\n light: ['#f9fafb', '#f3f4f6', '#e5e7eb', '#d1d5db', '#9ca3af', '#6b7280', '#4b5563', '#374151', '#1f2937'],\n dark: ['#111827', '#1f2937', '#374151', '#4b5563', '#6b7280', '#9ca3af', '#d1d5db', '#e5e7eb', '#f3f4f6'],\n },\n};\n\nexport const Heatmap: React.FC<HeatmapProps> = ({\n data,\n xLabels,\n yLabels,\n colorScale = 'blue',\n minValue: propMinValue,\n maxValue: propMaxValue,\n showValues = false,\n showTooltip = true,\n cellSize = 40,\n cellGap = 2,\n className = '',\n onCellClick,\n formatValue = (v) => v.toFixed(0),\n formatTooltip,\n}) => {\n const [hoveredCell, setHoveredCell] = useState<{ x: number; y: number; point: HeatmapDataPoint } | null>(null);\n const [isDarkMode, setIsDarkMode] = useState(false);\n\n // Check for dark mode\n React.useEffect(() => {\n const checkDarkMode = () => {\n setIsDarkMode(document.documentElement.classList.contains('dark'));\n };\n checkDarkMode();\n const observer = new MutationObserver(checkDarkMode);\n observer.observe(document.documentElement, { attributes: true, attributeFilter: ['class'] });\n return () => observer.disconnect();\n }, []);\n\n // Compute unique x and y values from data if labels not provided\n const { uniqueX, uniqueY, dataMap, minValue, maxValue } = useMemo(() => {\n const xSet = new Set<string>();\n const ySet = new Set<string>();\n const map = new Map<string, number>();\n let min = propMinValue ?? Infinity;\n let max = propMaxValue ?? -Infinity;\n\n data.forEach(point => {\n const xKey = String(point.x);\n const yKey = String(point.y);\n xSet.add(xKey);\n ySet.add(yKey);\n map.set(`${xKey}:${yKey}`, point.value);\n if (propMinValue === undefined) min = Math.min(min, point.value);\n if (propMaxValue === undefined) max = Math.max(max, point.value);\n });\n\n return {\n uniqueX: xLabels || Array.from(xSet),\n uniqueY: yLabels || Array.from(ySet),\n dataMap: map,\n minValue: propMinValue ?? min,\n maxValue: propMaxValue ?? max,\n };\n }, [data, xLabels, yLabels, propMinValue, propMaxValue]);\n\n const getColor = (value: number | undefined): string => {\n if (value === undefined) {\n return isDarkMode ? '#374151' : '#f3f4f6';\n }\n const colors = isDarkMode ? COLOR_SCALES[colorScale].dark : COLOR_SCALES[colorScale].light;\n const range = maxValue - minValue;\n if (range === 0) return colors[4];\n const normalized = Math.max(0, Math.min(1, (value - minValue) / range));\n const index = Math.floor(normalized * (colors.length - 1));\n return colors[index];\n };\n\n const getTextColor = (value: number | undefined): string => {\n if (value === undefined) return isDarkMode ? '#6b7280' : '#9ca3af';\n const range = maxValue - minValue;\n const normalized = range === 0 ? 0.5 : (value - minValue) / range;\n // Use white text for darker cells, dark text for lighter cells\n if (isDarkMode) {\n return normalized > 0.5 ? '#111827' : '#f9fafb';\n }\n return normalized > 0.5 ? '#ffffff' : '#111827';\n };\n\n const getTooltipContent = (point: HeatmapDataPoint): string => {\n if (formatTooltip) return formatTooltip(point);\n return `${point.x}, ${point.y}: ${formatValue(point.value)}`;\n };\n\n const labelWidth = 80;\n const labelHeight = 30;\n const width = labelWidth + uniqueX.length * (cellSize + cellGap);\n const height = labelHeight + uniqueY.length * (cellSize + cellGap);\n\n return (\n <div className={`relative inline-block ${className}`}>\n <svg\n width={width}\n height={height}\n className=\"select-none\"\n >\n {/* X-axis labels */}\n {uniqueX.map((label, i) => (\n <text\n key={`x-${label}`}\n x={labelWidth + i * (cellSize + cellGap) + cellSize / 2}\n y={labelHeight - 8}\n textAnchor=\"middle\"\n className=\"text-xs fill-[hsl(var(--muted-foreground))]\"\n style={{ fontSize: '11px' }}\n >\n {label}\n </text>\n ))}\n\n {/* Y-axis labels */}\n {uniqueY.map((label, j) => (\n <text\n key={`y-${label}`}\n x={labelWidth - 8}\n y={labelHeight + j * (cellSize + cellGap) + cellSize / 2 + 4}\n textAnchor=\"end\"\n className=\"text-xs fill-[hsl(var(--muted-foreground))]\"\n style={{ fontSize: '11px' }}\n >\n {label}\n </text>\n ))}\n\n {/* Cells */}\n {uniqueY.map((yLabel, j) =>\n uniqueX.map((xLabel, i) => {\n const value = dataMap.get(`${xLabel}:${yLabel}`);\n const point = data.find(d => String(d.x) === xLabel && String(d.y) === yLabel);\n const x = labelWidth + i * (cellSize + cellGap);\n const y = labelHeight + j * (cellSize + cellGap);\n\n return (\n <g key={`${xLabel}-${yLabel}`}>\n <rect\n x={x}\n y={y}\n width={cellSize}\n height={cellSize}\n rx={4}\n fill={getColor(value)}\n className={`transition-all duration-150 ${onCellClick && point ? 'cursor-pointer' : ''}`}\n style={{\n stroke: hoveredCell?.x === i && hoveredCell?.y === j ? (isDarkMode ? '#60a5fa' : '#3b82f6') : 'transparent',\n strokeWidth: 2,\n }}\n onMouseEnter={() => {\n if (point) setHoveredCell({ x: i, y: j, point });\n }}\n onMouseLeave={() => setHoveredCell(null)}\n onClick={() => {\n if (point && onCellClick) onCellClick(point);\n }}\n />\n {showValues && value !== undefined && (\n <text\n x={x + cellSize / 2}\n y={y + cellSize / 2 + 4}\n textAnchor=\"middle\"\n fill={getTextColor(value)}\n style={{ fontSize: '11px', fontWeight: 500 }}\n >\n {formatValue(value)}\n </text>\n )}\n </g>\n );\n })\n )}\n </svg>\n\n {/* Tooltip */}\n {showTooltip && hoveredCell && (\n <div\n className=\"absolute z-50 px-3 py-2 text-sm bg-[hsl(var(--popover))] text-[hsl(var(--popover-foreground))] border border-[hsl(var(--border))] rounded-lg shadow-lg pointer-events-none whitespace-nowrap\"\n style={{\n left: labelWidth + hoveredCell.x * (cellSize + cellGap) + cellSize / 2,\n top: labelHeight + hoveredCell.y * (cellSize + cellGap) - 8,\n transform: 'translate(-50%, -100%)',\n }}\n >\n {getTooltipContent(hoveredCell.point)}\n <div\n className=\"absolute w-2 h-2 bg-[hsl(var(--popover))] rotate-45\"\n style={{\n left: '50%',\n bottom: '-4px',\n transform: 'translateX(-50%)',\n }}\n />\n </div>\n )}\n </div>\n );\n};\n\n// Calendar Heatmap variant - like GitHub contribution graph\nexport interface CalendarHeatmapProps {\n data: { date: Date | string; value: number }[];\n startDate?: Date;\n endDate?: Date;\n colorScale?: 'blue' | 'green' | 'red' | 'purple' | 'orange' | 'gray';\n showMonthLabels?: boolean;\n showDayLabels?: boolean;\n cellSize?: number;\n cellGap?: number;\n className?: string;\n onCellClick?: (date: Date, value: number) => void;\n formatTooltip?: (date: Date, value: number) => string;\n}\n\nconst DAY_LABELS = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];\nconst MONTH_LABELS = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n\nexport const CalendarHeatmap: React.FC<CalendarHeatmapProps> = ({\n data,\n startDate: propStartDate,\n endDate: propEndDate,\n colorScale = 'green',\n showMonthLabels = true,\n showDayLabels = true,\n cellSize = 12,\n cellGap = 2,\n className = '',\n onCellClick,\n formatTooltip,\n}) => {\n const [hoveredCell, setHoveredCell] = useState<{ weekIndex: number; dayIndex: number; date: Date; value: number } | null>(null);\n const [isDarkMode, setIsDarkMode] = useState(false);\n\n React.useEffect(() => {\n const checkDarkMode = () => {\n setIsDarkMode(document.documentElement.classList.contains('dark'));\n };\n checkDarkMode();\n const observer = new MutationObserver(checkDarkMode);\n observer.observe(document.documentElement, { attributes: true, attributeFilter: ['class'] });\n return () => observer.disconnect();\n }, []);\n\n const { weeks, minValue, maxValue, dataMap, monthLabels } = useMemo(() => {\n // Parse dates and create data map\n const map = new Map<string, number>();\n let min = Infinity;\n let max = -Infinity;\n\n data.forEach(item => {\n const date = typeof item.date === 'string' ? new Date(item.date) : item.date;\n const key = date.toISOString().split('T')[0];\n map.set(key, item.value);\n min = Math.min(min, item.value);\n max = Math.max(max, item.value);\n });\n\n if (min === Infinity) min = 0;\n if (max === -Infinity) max = 0;\n\n // Determine date range\n const endDate = propEndDate || new Date();\n const startDate = propStartDate || new Date(endDate.getTime() - 364 * 24 * 60 * 60 * 1000); // ~1 year ago\n\n // Adjust start date to beginning of week (Sunday)\n const adjustedStart = new Date(startDate);\n adjustedStart.setDate(adjustedStart.getDate() - adjustedStart.getDay());\n\n // Build weeks array\n const weeksArr: Date[][] = [];\n const currentDate = new Date(adjustedStart);\n const months: { label: string; weekIndex: number }[] = [];\n let lastMonth = -1;\n\n while (currentDate <= endDate || weeksArr.length === 0 || weeksArr[weeksArr.length - 1].length < 7) {\n if (weeksArr.length === 0 || weeksArr[weeksArr.length - 1].length === 7) {\n weeksArr.push([]);\n }\n\n if (currentDate.getMonth() !== lastMonth && currentDate <= endDate) {\n months.push({ label: MONTH_LABELS[currentDate.getMonth()], weekIndex: weeksArr.length - 1 });\n lastMonth = currentDate.getMonth();\n }\n\n weeksArr[weeksArr.length - 1].push(new Date(currentDate));\n currentDate.setDate(currentDate.getDate() + 1);\n }\n\n return {\n weeks: weeksArr,\n minValue: min,\n maxValue: max,\n dataMap: map,\n monthLabels: months,\n };\n }, [data, propStartDate, propEndDate]);\n\n const getColor = (value: number | undefined): string => {\n if (value === undefined || value === 0) {\n return isDarkMode ? '#1f2937' : '#ebedf0';\n }\n const colors = isDarkMode ? COLOR_SCALES[colorScale].dark : COLOR_SCALES[colorScale].light;\n const range = maxValue - minValue;\n if (range === 0) return colors[4];\n const normalized = Math.max(0, Math.min(1, (value - minValue) / range));\n const index = Math.max(1, Math.floor(normalized * (colors.length - 1)));\n return colors[index];\n };\n\n const getTooltipContent = (date: Date, value: number): string => {\n if (formatTooltip) return formatTooltip(date, value);\n const dateStr = date.toLocaleDateString('en-US', { weekday: 'short', month: 'short', day: 'numeric', year: 'numeric' });\n return `${dateStr}: ${value} contribution${value !== 1 ? 's' : ''}`;\n };\n\n const dayLabelWidth = showDayLabels ? 30 : 0;\n const monthLabelHeight = showMonthLabels ? 20 : 0;\n const width = dayLabelWidth + weeks.length * (cellSize + cellGap);\n const height = monthLabelHeight + 7 * (cellSize + cellGap);\n\n return (\n <div className={`relative inline-block ${className}`}>\n <svg width={width} height={height} className=\"select-none\">\n {/* Month labels */}\n {showMonthLabels && monthLabels.map(({ label, weekIndex }, i) => (\n <text\n key={`month-${i}`}\n x={dayLabelWidth + weekIndex * (cellSize + cellGap)}\n y={12}\n className=\"text-xs fill-[hsl(var(--muted-foreground))]\"\n style={{ fontSize: '10px' }}\n >\n {label}\n </text>\n ))}\n\n {/* Day labels */}\n {showDayLabels && [1, 3, 5].map(dayIndex => (\n <text\n key={`day-${dayIndex}`}\n x={dayLabelWidth - 6}\n y={monthLabelHeight + dayIndex * (cellSize + cellGap) + cellSize / 2 + 3}\n textAnchor=\"end\"\n className=\"text-xs fill-[hsl(var(--muted-foreground))]\"\n style={{ fontSize: '9px' }}\n >\n {DAY_LABELS[dayIndex]}\n </text>\n ))}\n\n {/* Cells */}\n {weeks.map((week, weekIndex) =>\n week.map((date, dayIndex) => {\n const key = date.toISOString().split('T')[0];\n const value = dataMap.get(key);\n const x = dayLabelWidth + weekIndex * (cellSize + cellGap);\n const y = monthLabelHeight + dayIndex * (cellSize + cellGap);\n\n return (\n <rect\n key={key}\n x={x}\n y={y}\n width={cellSize}\n height={cellSize}\n rx={2}\n fill={getColor(value)}\n className={`transition-all duration-150 ${onCellClick ? 'cursor-pointer' : ''}`}\n style={{\n stroke: hoveredCell?.weekIndex === weekIndex && hoveredCell?.dayIndex === dayIndex\n ? (isDarkMode ? '#60a5fa' : '#3b82f6')\n : 'transparent',\n strokeWidth: 1,\n }}\n onMouseEnter={() => setHoveredCell({ weekIndex, dayIndex, date, value: value || 0 })}\n onMouseLeave={() => setHoveredCell(null)}\n onClick={() => {\n if (onCellClick) onCellClick(date, value || 0);\n }}\n />\n );\n })\n )}\n </svg>\n\n {/* Tooltip */}\n {hoveredCell && (\n <div\n className=\"absolute z-50 px-3 py-2 text-sm bg-[hsl(var(--popover))] text-[hsl(var(--popover-foreground))] border border-[hsl(var(--border))] rounded-lg shadow-lg pointer-events-none whitespace-nowrap\"\n style={{\n left: dayLabelWidth + hoveredCell.weekIndex * (cellSize + cellGap) + cellSize / 2,\n top: monthLabelHeight + hoveredCell.dayIndex * (cellSize + cellGap) - 8,\n transform: 'translate(-50%, -100%)',\n }}\n >\n {getTooltipContent(hoveredCell.date, hoveredCell.value)}\n <div\n className=\"absolute w-2 h-2 bg-[hsl(var(--popover))] rotate-45\"\n style={{\n left: '50%',\n bottom: '-4px',\n transform: 'translateX(-50%)',\n }}\n />\n </div>\n )}\n </div>\n );\n};\n","/**\n * Theme initialization script that runs before React hydration\n * This prevents flickering by setting the theme before the page renders\n * Must be inlined in the HTML <head> as a blocking script\n */\n\nexport const themeScript = `\n(function() {\n try {\n // Get stored preferences\n const storedTheme = localStorage.getItem('lite-ui-theme') || 'default';\n const storedColorMode = localStorage.getItem('lite-ui-color-mode');\n\n // Determine color mode (system, light, or dark)\n let colorMode = storedColorMode;\n if (!colorMode || colorMode === 'system') {\n colorMode = window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';\n }\n\n // Set attributes before render\n document.documentElement.setAttribute('data-theme', storedTheme);\n document.documentElement.setAttribute('data-color-mode', colorMode);\n\n // Add dark class for Tailwind\n if (colorMode === 'dark') {\n document.documentElement.classList.add('dark');\n } else {\n document.documentElement.classList.remove('dark');\n }\n } catch (e) {\n console.error('Failed to initialize theme:', e);\n }\n})();\n`;\n\nexport function getThemeScript() {\n return themeScript;\n}\n"],"mappings":"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","names":["jsx","variantStyles","sizeStyles","useState","useEffect","jsx","jsxs","useState","useEffect","sizeStyles","useEffect","jsx","jsxs","jsx","jsxs","getVariantClasses","jsx","createContext","useContext","useState","jsx","useState","jsx","sizeClasses","jsx","jsx","jsx","jsx","Fragment","jsx","jsxs","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","Fragment","jsx","jsxs","jsx","Fragment","jsx","Fragment","jsx","Fragment","jsx","Fragment","jsx","jsxs","Fragment","jsx","Fragment","jsx","jsx","jsx","jsx","jsx","Fragment","jsx","jsxs","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","Fragment","jsx","jsxs","widthClasses","useState","useEffect","Fragment","jsx","jsxs","sizeClasses","jsx","jsxs","sizeClasses","useState","useRef","jsx","jsxs","sizeClasses","useState","useRef","useEffect","Fragment","jsx","jsxs","useState","useRef","useEffect","jsx","jsx","jsxs","forwardRef","jsx","jsxs","forwardRef","jsx","jsxs","jsx","variantStyles","jsx","sizeClasses","useState","jsx","jsxs","jsx","jsxs","jsx","jsxs","useState","useRef","useEffect","createPortal","jsx","jsxs","formatDate","forwardRef","jsx","jsxs","useState","useRef","useEffect","createPortal","jsx","jsxs","DAYS","MONTHS","useState","jsx","jsxs","DAYS","MONTHS","React","jsx","jsxs","jsx","jsxs","sizeClasses","React","useRef","jsx","jsxs","percentage","React","jsx","sizeClasses","name","jsx","jsxs","sizeClasses","useRef","useState","useEffect","jsx","jsxs","useRef","useState","useEffect","createContext","useContext","useState","useCallback","jsx","jsxs","createContext","useContext","useState","useCallback","toast","positionClasses","React","jsx","jsxs","React","jsx","jsxs","useRef","useState","jsx","jsxs","useState","useRef","useRef","useState","useEffect","jsx","jsxs","useRef","useState","useEffect","useRef","useState","useEffect","jsx","jsxs","useRef","useState","useEffect","React","useMemo","useCallback","useRef","useState","React","useRef","useEffect","useState","jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsxs","useRef","useState","useMemo","useCallback","React","React","useMemo","useCallback","useRef","useState","jsx","jsxs","useRef","useState","useMemo","useCallback","React","React","useMemo","useCallback","useRef","useState","jsx","jsxs","useRef","useState","useMemo","useCallback","React","useMemo","useCallback","useRef","useState","jsx","jsxs","useRef","useState","useMemo","useCallback","React","useMemo","useCallback","useRef","useState","jsx","jsxs","useRef","useState","useMemo","useCallback","React","React","useRef","useState","useEffect","useCallback","jsx","React","useMemo","useState","jsx","jsxs"]}
|
|
1
|
+
{"version":3,"sources":["../src/theme/ThemeProvider.tsx","../src/theme/themes.ts","../src/components/Button.tsx","../src/components/Select.tsx","../src/components/Modal.tsx","../src/components/Navbar.tsx","../src/components/Sidebar.tsx","../src/components/SidebarProvider.tsx","../src/components/AppShell.tsx","../src/icons/icon-utils.tsx","../src/icons/HomeIcon.tsx","../src/icons/UserIcon.tsx","../src/icons/SearchIcon.tsx","../src/icons/BellIcon.tsx","../src/icons/SettingsIcon.tsx","../src/icons/MenuIcon.tsx","../src/icons/CloseIcon.tsx","../src/icons/PlusIcon.tsx","../src/icons/ArrowLeftIcon.tsx","../src/icons/ArrowRightIcon.tsx","../src/icons/ArrowUpIcon.tsx","../src/icons/ArrowDownIcon.tsx","../src/icons/ChevronDownIcon.tsx","../src/icons/ChevronUpIcon.tsx","../src/icons/ChevronLeftIcon.tsx","../src/icons/ChevronRightIcon.tsx","../src/icons/ExternalLinkIcon.tsx","../src/icons/CheckIcon.tsx","../src/icons/CheckCircleIcon.tsx","../src/icons/AlertCircleIcon.tsx","../src/icons/InfoCircleIcon.tsx","../src/icons/TrashIcon.tsx","../src/icons/EditIcon.tsx","../src/icons/CopyIcon.tsx","../src/icons/SaveIcon.tsx","../src/icons/DownloadIcon.tsx","../src/icons/UploadIcon.tsx","../src/icons/RefreshIcon.tsx","../src/icons/EyeIcon.tsx","../src/icons/EyeOffIcon.tsx","../src/icons/PlayIcon.tsx","../src/icons/PauseIcon.tsx","../src/icons/StopIcon.tsx","../src/icons/SkipBackIcon.tsx","../src/icons/SkipForwardIcon.tsx","../src/icons/VolumeUpIcon.tsx","../src/icons/VolumeOffIcon.tsx","../src/icons/FullscreenIcon.tsx","../src/icons/FullscreenExitIcon.tsx","../src/icons/MailIcon.tsx","../src/icons/ChatIcon.tsx","../src/icons/StarIcon.tsx","../src/icons/HeartIcon.tsx","../src/icons/CameraIcon.tsx","../src/icons/CalendarIcon.tsx","../src/icons/BookIcon.tsx","../src/icons/FileIcon.tsx","../src/icons/FolderIcon.tsx","../src/icons/ImageIcon.tsx","../src/icons/CodeIcon.tsx","../src/icons/TerminalIcon.tsx","../src/icons/DatabaseIcon.tsx","../src/icons/CloudIcon.tsx","../src/icons/PlugIcon.tsx","../src/icons/KeyIcon.tsx","../src/icons/LockIcon.tsx","../src/icons/ShieldIcon.tsx","../src/icons/SparklesIcon.tsx","../src/icons/BrainIcon.tsx","../src/icons/GlobeIcon.tsx","../src/icons/BeakerIcon.tsx","../src/icons/GoogleIcon.tsx","../src/icons/GitHubIcon.tsx","../src/icons/TwitterIcon.tsx","../src/icons/FacebookIcon.tsx","../src/icons/AppleIcon.tsx","../src/icons/LinkedInIcon.tsx","../src/icons/YouTubeIcon.tsx","../src/icons/SlackIcon.tsx","../src/components/Drawer.tsx","../src/components/TextInput.tsx","../src/components/NumberInput.tsx","../src/components/ActionMenu.tsx","../src/components/Card.tsx","../src/components/Alert.tsx","../src/components/Checkbox.tsx","../src/components/Toggle.tsx","../src/components/Badge.tsx","../src/components/Spinner.tsx","../src/components/Tabs.tsx","../src/components/Table.tsx","../src/components/Pagination.tsx","../src/components/DatePicker.tsx","../src/components/TimePicker.tsx","../src/components/DateTimePicker.tsx","../src/components/Calendar.tsx","../src/components/Radio.tsx","../src/components/ProgressBar.tsx","../src/components/Slider.tsx","../src/components/Avatar.tsx","../src/components/Textarea.tsx","../src/components/RichTextEditor.tsx","../src/components/Toast.tsx","../src/components/Stepper.tsx","../src/components/Divider.tsx","../src/components/FileUpload.tsx","../src/components/AudioPlayer.tsx","../src/components/VideoPlayer.tsx","../src/charts/LineChart.tsx","../src/charts/constants.ts","../src/charts/utils/scales.ts","../src/charts/utils/paths.ts","../src/charts/utils/format.ts","../src/charts/components/ChartTooltip.tsx","../src/charts/components/Legend.tsx","../src/charts/components/ReferenceLine.tsx","../src/charts/components/ReferenceArea.tsx","../src/charts/components/CartesianGrid.tsx","../src/charts/BarChart.tsx","../src/charts/AreaChart.tsx","../src/charts/PieChart.tsx","../src/charts/ScatterChart.tsx","../src/charts/components/ResponsiveContainer.tsx","../src/components/Heatmap.tsx","../src/utils/theme-script.ts"],"sourcesContent":["\"use client\";\n\nimport React, { createContext, useContext, useState, useEffect } from 'react';\nimport { themes, ThemeName, Theme } from './themes';\n\nexport type ColorMode = 'light' | 'dark' | 'system';\n\ninterface ThemeContextValue {\n theme: Theme;\n themeName: ThemeName;\n setTheme: (themeName: ThemeName) => void;\n colorMode: ColorMode;\n setColorMode: (mode: ColorMode) => void;\n toggleColorMode: () => void;\n resolvedColorMode: 'light' | 'dark';\n}\n\nconst ThemeContext = createContext<ThemeContextValue | undefined>(undefined);\n\nexport function useTheme() {\n const context = useContext(ThemeContext);\n\n // Return default values if no ThemeProvider is present (graceful fallback)\n if (!context) {\n const warnOnce = () => {\n if (process.env.NODE_ENV === 'development') {\n console.warn('useTheme: Component used outside ThemeProvider. Using default theme. Wrap your app with <ThemeProvider> for full functionality.');\n }\n };\n\n return {\n theme: themes.default,\n themeName: 'default' as ThemeName,\n setTheme: () => warnOnce(),\n colorMode: 'light' as ColorMode,\n setColorMode: () => warnOnce(),\n toggleColorMode: () => warnOnce(),\n resolvedColorMode: 'light' as 'light' | 'dark',\n };\n }\n\n return context;\n}\n\ninterface ThemeProviderProps {\n children: React.ReactNode;\n defaultTheme?: ThemeName;\n defaultColorMode?: ColorMode;\n}\n\nexport function ThemeProvider({\n children,\n defaultTheme = 'default',\n defaultColorMode = 'system'\n}: ThemeProviderProps) {\n const [mounted, setMounted] = useState(false);\n\n // Initialize from defaults (will sync with actual values after mount)\n const [themeName, setThemeNameState] = useState<ThemeName>(defaultTheme);\n const [colorMode, setColorModeState] = useState<ColorMode>(defaultColorMode);\n const [resolvedColorMode, setResolvedColorMode] = useState<'light' | 'dark'>('light');\n\n // Sync with actual values after mount to avoid hydration mismatch\n useEffect(() => {\n setMounted(true);\n\n // Read actual values from localStorage and DOM\n const storedTheme = localStorage.getItem('lite-ui-theme') as ThemeName;\n const storedColorMode = localStorage.getItem('lite-ui-color-mode') as ColorMode;\n const currentColorMode = document.documentElement.getAttribute('data-color-mode') as 'light' | 'dark';\n\n if (storedTheme) setThemeNameState(storedTheme);\n if (storedColorMode) setColorModeState(storedColorMode);\n if (currentColorMode) setResolvedColorMode(currentColorMode);\n }, []);\n\n const theme = themes[themeName];\n\n // Update theme\n const setTheme = (newThemeName: ThemeName) => {\n setThemeNameState(newThemeName);\n if (typeof window !== 'undefined') {\n localStorage.setItem('lite-ui-theme', newThemeName);\n document.documentElement.setAttribute('data-theme', newThemeName);\n }\n };\n\n // Update color mode\n const setColorMode = (mode: ColorMode) => {\n if (typeof window === 'undefined') return;\n\n setColorModeState(mode);\n localStorage.setItem('lite-ui-color-mode', mode);\n\n let resolved: 'light' | 'dark';\n if (mode === 'system') {\n resolved = window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';\n } else {\n resolved = mode;\n }\n\n setResolvedColorMode(resolved);\n document.documentElement.setAttribute('data-color-mode', resolved);\n\n if (resolved === 'dark') {\n document.documentElement.classList.add('dark');\n } else {\n document.documentElement.classList.remove('dark');\n }\n };\n\n // Toggle between light and dark mode\n const toggleColorMode = () => {\n if (colorMode === 'system') {\n // If currently system, toggle to opposite of current resolved mode\n setColorMode(resolvedColorMode === 'dark' ? 'light' : 'dark');\n } else {\n // Toggle between light and dark\n setColorMode(colorMode === 'dark' ? 'light' : 'dark');\n }\n };\n\n // Listen for system theme changes\n useEffect(() => {\n if (!mounted) return;\n\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n\n const handleChange = (e: MediaQueryListEvent) => {\n if (colorMode === 'system') {\n const resolved = e.matches ? 'dark' : 'light';\n setResolvedColorMode(resolved);\n document.documentElement.setAttribute('data-color-mode', resolved);\n\n if (resolved === 'dark') {\n document.documentElement.classList.add('dark');\n } else {\n document.documentElement.classList.remove('dark');\n }\n }\n };\n\n mediaQuery.addEventListener('change', handleChange);\n return () => mediaQuery.removeEventListener('change', handleChange);\n }, [mounted, colorMode]);\n\n return (\n <ThemeContext.Provider value={{\n theme,\n themeName,\n setTheme,\n colorMode,\n setColorMode,\n toggleColorMode,\n resolvedColorMode\n }}>\n {children}\n </ThemeContext.Provider>\n );\n}\n","export type ThemeName = 'default' | 'minimalistic';\n\nexport interface ButtonTheme {\n primary: string;\n secondary: string;\n success: string;\n danger: string;\n warning: string;\n info: string;\n outline: string;\n ghost: string;\n link: string;\n}\n\nexport interface SelectTheme {\n base: string;\n sizes: {\n sm: string;\n md: string;\n lg: string;\n xl: string;\n };\n disabled: string;\n}\n\nexport interface Theme {\n name: ThemeName;\n button: {\n base: string;\n variants: ButtonTheme;\n sizes: {\n sm: string;\n md: string;\n lg: string;\n xl: string;\n };\n disabled: string;\n };\n select: SelectTheme;\n}\n\nexport const themes: Record<ThemeName, Theme> = {\n default: {\n name: 'default',\n button: {\n base: 'font-medium rounded-md transition-all duration-150 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-[hsl(var(--ring))]/50 active:scale-[0.98] gap-2',\n variants: {\n primary: 'bg-[hsl(var(--primary))] text-[hsl(var(--primary-foreground))] hover:bg-[hsl(var(--primary))]/90 shadow-sm',\n secondary: 'bg-[hsl(var(--secondary))] text-[hsl(var(--secondary-foreground))] hover:bg-[hsl(var(--secondary))]/80 border border-[hsl(var(--border))]',\n success: 'bg-[hsl(var(--success))] text-[hsl(var(--success-foreground))] hover:bg-[hsl(var(--success))]/90 shadow-sm',\n danger: 'bg-[hsl(var(--destructive))] text-[hsl(var(--destructive-foreground))] hover:bg-[hsl(var(--destructive))]/90 shadow-sm',\n warning: 'bg-[hsl(var(--warning))] text-[hsl(var(--warning-foreground))] hover:bg-[hsl(var(--warning))]/90 shadow-sm',\n info: 'bg-[hsl(var(--info))] text-[hsl(var(--info-foreground))] hover:bg-[hsl(var(--info))]/90 shadow-sm',\n outline: 'border border-[hsl(var(--border))] bg-transparent hover:bg-[hsl(var(--accent))] text-[hsl(var(--foreground))]',\n ghost: 'bg-transparent hover:bg-[hsl(var(--accent))] text-[hsl(var(--foreground))]',\n link: 'bg-transparent text-[hsl(var(--primary))] underline-offset-4 hover:underline !p-0 !h-auto !min-h-0 shadow-none',\n },\n sizes: {\n sm: 'px-3 py-1.5 text-sm h-8',\n md: 'px-4 py-2 text-sm h-9',\n lg: 'px-5 py-2.5 text-base h-10',\n xl: 'px-6 py-3 text-base h-11',\n },\n disabled: 'pointer-events-none opacity-50',\n },\n select: {\n base: 'w-full appearance-none rounded-md border border-[hsl(var(--input))] bg-transparent text-[hsl(var(--foreground))] text-left transition-colors duration-150 focus:outline-none focus:ring-1 focus:ring-[hsl(var(--ring))]/50 focus:border-[hsl(var(--ring))] hover:border-[hsl(var(--muted-foreground))] pr-10 cursor-pointer',\n sizes: {\n sm: 'px-3 py-1.5 text-sm',\n md: 'px-3 py-2.5 text-sm',\n lg: 'px-4 py-3 text-base',\n xl: 'px-4 py-3.5 text-lg',\n },\n disabled: 'pointer-events-none opacity-50 bg-[hsl(var(--muted))]',\n },\n },\n minimalistic: {\n name: 'minimalistic',\n button: {\n base: 'font-normal rounded-none transition-colors duration-200 focus:outline-none border-2 gap-2',\n variants: {\n primary: 'bg-transparent border-white text-white hover:bg-white hover:text-black',\n secondary: 'bg-transparent border-gray-400 text-gray-400 hover:bg-gray-400 hover:text-black',\n success: 'bg-transparent border-green-400 text-green-400 hover:bg-green-400 hover:text-black',\n danger: 'bg-transparent border-red-400 text-red-400 hover:bg-red-400 hover:text-black',\n warning: 'bg-transparent border-yellow-400 text-yellow-400 hover:bg-yellow-400 hover:text-black',\n info: 'bg-transparent border-blue-400 text-blue-400 hover:bg-blue-400 hover:text-black',\n outline: 'bg-transparent border-white text-white hover:bg-white hover:text-black',\n ghost: 'bg-transparent border-transparent text-white hover:bg-white/10',\n link: 'bg-transparent border-transparent text-white underline-offset-4 hover:underline !p-0 !h-auto !min-h-0',\n },\n sizes: {\n sm: 'px-4 py-2 text-sm uppercase tracking-wide min-h-[36px]',\n md: 'px-6 py-3 text-base uppercase tracking-wide min-h-[48px]',\n lg: 'px-8 py-4 text-lg uppercase tracking-wider min-h-[60px]',\n xl: 'px-10 py-5 text-xl uppercase tracking-wider min-h-[72px]',\n },\n disabled: 'opacity-30 cursor-not-allowed hover:bg-transparent',\n },\n select: {\n base: 'w-full appearance-none rounded-none border-2 border-white bg-transparent text-white text-left transition-colors duration-200 focus:outline-none pr-10 cursor-pointer placeholder:text-gray-500',\n sizes: {\n sm: 'px-4 py-2 text-sm uppercase tracking-wide',\n md: 'px-4 py-3 text-base uppercase tracking-wide',\n lg: 'px-4 py-4 text-lg uppercase tracking-wider',\n xl: 'px-5 py-5 text-xl uppercase tracking-wider',\n },\n disabled: 'opacity-30 cursor-not-allowed',\n },\n },\n};\n","\"use client\";\n\nimport React from 'react';\nimport { useTheme } from '../theme/ThemeProvider';\n\nexport interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: 'primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'outline' | 'ghost' | 'link';\n size?: 'sm' | 'md' | 'lg' | 'xl';\n children: React.ReactNode;\n leftIcon?: React.ReactNode;\n rightIcon?: React.ReactNode;\n iconOnly?: boolean;\n}\n\nexport const Button: React.FC<ButtonProps> = ({\n variant = 'primary',\n size = 'md',\n className = '',\n children,\n disabled,\n leftIcon,\n rightIcon,\n iconOnly = false,\n ...props\n}) => {\n const { theme } = useTheme();\n\n const baseStyles = theme.button.base;\n const variantStyles = theme.button.variants[variant];\n const sizeStyles = theme.button.sizes[size];\n const disabledStyles = disabled ? theme.button.disabled : '';\n\n // Adjust padding for icon-only buttons - remove horizontal padding and make square\n const iconOnlyStyles = iconOnly ? '!p-0 aspect-square' : '';\n\n const classes = `inline-flex items-center justify-center ${baseStyles} ${variantStyles} ${sizeStyles} ${disabledStyles} ${iconOnlyStyles} ${className}`.trim();\n\n return (\n <button\n className={classes}\n disabled={disabled}\n {...props}\n >\n {iconOnly ? (\n children\n ) : (\n <>\n {leftIcon && <span className=\"inline-flex shrink-0\">{leftIcon}</span>}\n {children && <span className=\"inline-flex items-center\">{children}</span>}\n {rightIcon && <span className=\"inline-flex shrink-0\">{rightIcon}</span>}\n </>\n )}\n </button>\n );\n};\n","\"use client\";\n\nimport React, { useState, useRef, useEffect } from 'react';\nimport { useTheme } from '../theme/ThemeProvider';\n\nexport interface SelectOption {\n value: string;\n label: string;\n}\n\nexport interface SelectProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'size' | 'onChange' | 'defaultValue'> {\n options: SelectOption[];\n size?: 'sm' | 'md' | 'lg' | 'xl';\n placeholder?: string;\n disabled?: boolean;\n value?: string;\n defaultValue?: string;\n onChange?: (value: string) => void;\n label?: string;\n error?: string;\n helperText?: string;\n searchable?: boolean;\n searchPlaceholder?: string;\n}\n\nexport const Select: React.FC<SelectProps> = ({\n options,\n size = 'md',\n placeholder,\n className = '',\n disabled,\n value: controlledValue,\n defaultValue,\n onChange,\n label,\n error,\n helperText,\n searchable = false,\n searchPlaceholder = 'Search...',\n ...props\n}) => {\n const { theme, themeName } = useTheme();\n const [isOpen, setIsOpen] = useState(false);\n const [internalValue, setInternalValue] = useState(defaultValue || '');\n const [searchQuery, setSearchQuery] = useState('');\n const dropdownRef = useRef<HTMLDivElement>(null);\n const searchInputRef = useRef<HTMLInputElement>(null);\n\n // Use controlled value if provided, otherwise use internal state\n const value = controlledValue !== undefined ? controlledValue : internalValue;\n\n // Find the selected option\n const selectedOption = options.find(opt => opt.value === value);\n const displayText = selectedOption ? selectedOption.label : placeholder || 'Select...';\n\n // Filter options based on search query\n const filteredOptions = searchable && searchQuery\n ? options.filter(option =>\n option.label.toLowerCase().includes(searchQuery.toLowerCase())\n )\n : options;\n\n // Close dropdown when clicking outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) {\n setIsOpen(false);\n setSearchQuery('');\n }\n };\n\n if (isOpen) {\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }\n }, [isOpen]);\n\n // Focus search input when dropdown opens\n useEffect(() => {\n if (isOpen && searchable && searchInputRef.current) {\n searchInputRef.current.focus();\n }\n }, [isOpen, searchable]);\n\n const handleSelect = (optionValue: string) => {\n if (disabled) return;\n\n setInternalValue(optionValue);\n onChange?.(optionValue);\n setIsOpen(false);\n setSearchQuery('');\n };\n\n const handleToggle = () => {\n if (!disabled) {\n setIsOpen(!isOpen);\n }\n };\n\n const baseStyles = theme.select.base;\n const sizeStyles = theme.select.sizes[size];\n const disabledStyles = disabled ? theme.select.disabled : '';\n const errorStyles = error ? 'border-[hsl(var(--destructive))] focus:ring-[hsl(var(--destructive))]' : '';\n\n const buttonClasses = `${baseStyles} ${sizeStyles} ${disabledStyles} ${errorStyles}`.trim();\n\n // Icon color based on theme\n const iconColor = themeName === 'minimalistic'\n ? (disabled ? 'text-[hsl(var(--muted-foreground))]' : 'text-white')\n : 'text-[hsl(var(--muted-foreground))]';\n\n // Dropdown menu styles based on theme\n const dropdownBaseStyles = themeName === 'minimalistic'\n ? 'bg-black border-2 border-white'\n : 'bg-[hsl(var(--popover))] border border-[hsl(var(--border))] shadow-lg';\n\n const optionBaseStyles = themeName === 'minimalistic'\n ? 'text-white hover:bg-white hover:text-black transition-colors duration-200'\n : 'text-[hsl(var(--popover-foreground))] hover:bg-[hsl(var(--accent))] transition-colors duration-150';\n\n const optionSizeStyles = {\n sm: 'px-4 py-2 text-sm',\n md: 'px-4 py-2.5 text-base',\n lg: 'px-4 py-3 text-lg',\n xl: 'px-5 py-4 text-xl',\n }[size];\n\n return (\n <div className={`w-full ${className}`}>\n {label && (\n <label className=\"block text-sm font-medium text-[hsl(var(--foreground))] mb-1.5\">\n {label}\n </label>\n )}\n <div className=\"relative inline-block w-full\" ref={dropdownRef} {...props}>\n {/* Custom button that looks like select */}\n <button\n type=\"button\"\n className={buttonClasses}\n onClick={handleToggle}\n disabled={disabled}\n >\n <span className={!selectedOption && placeholder ? 'opacity-50' : ''}>\n {displayText}\n </span>\n </button>\n\n {/* Chevron icon */}\n <div className=\"pointer-events-none absolute inset-y-0 right-0 flex items-center pr-4\">\n <svg\n className={`h-5 w-5 transition-transform duration-200 ${iconColor} ${isOpen ? 'rotate-180' : ''}`}\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M5.23 7.21a.75.75 0 011.06.02L10 11.168l3.71-3.938a.75.75 0 111.08 1.04l-4.25 4.5a.75.75 0 01-1.08 0l-4.25-4.5a.75.75 0 01.02-1.06z\"\n clipRule=\"evenodd\"\n />\n </svg>\n </div>\n\n {/* Custom dropdown menu */}\n {isOpen && !disabled && (\n <div\n className={`absolute z-50 w-full mt-1 ${dropdownBaseStyles} rounded-md overflow-hidden`}\n >\n {/* Search input */}\n {searchable && (\n <div className={`sticky top-0 ${themeName === 'minimalistic' ? 'bg-black border-b-2 border-white' : 'bg-[hsl(var(--popover))] border-b border-[hsl(var(--border))]'}`}>\n <input\n ref={searchInputRef}\n type=\"text\"\n className={`w-full ${optionSizeStyles} ${themeName === 'minimalistic' ? 'bg-black text-white placeholder-[hsl(var(--muted-foreground))] focus:outline-none' : 'bg-transparent text-[hsl(var(--popover-foreground))] placeholder:text-[hsl(var(--muted-foreground))] focus:outline-none'}`}\n placeholder={searchPlaceholder}\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n onClick={(e) => e.stopPropagation()}\n />\n </div>\n )}\n\n {/* Options list */}\n <style>\n {`\n .select-dropdown-scroll {\n scrollbar-width: thin;\n scrollbar-color: rgba(156, 163, 175, 0.5) transparent;\n }\n .select-dropdown-scroll::-webkit-scrollbar {\n width: 8px;\n }\n .select-dropdown-scroll::-webkit-scrollbar-track {\n background: transparent;\n }\n .select-dropdown-scroll::-webkit-scrollbar-thumb {\n background-color: rgba(156, 163, 175, 0.5);\n border-radius: 4px;\n border: 2px solid transparent;\n background-clip: padding-box;\n }\n .select-dropdown-scroll::-webkit-scrollbar-thumb:hover {\n background-color: rgba(156, 163, 175, 0.7);\n }\n .dark .select-dropdown-scroll {\n scrollbar-color: rgba(75, 85, 99, 0.6) transparent;\n }\n .dark .select-dropdown-scroll::-webkit-scrollbar-thumb {\n background-color: rgba(75, 85, 99, 0.6);\n }\n .dark .select-dropdown-scroll::-webkit-scrollbar-thumb:hover {\n background-color: rgba(75, 85, 99, 0.8);\n }\n `}\n </style>\n <div\n className=\"select-dropdown-scroll\"\n style={{ maxHeight: '300px', overflowY: 'auto' }}\n >\n {filteredOptions.length > 0 ? (\n filteredOptions.map((option) => (\n <div\n key={option.value}\n className={`${optionBaseStyles} ${optionSizeStyles} cursor-pointer ${\n value === option.value ? (themeName === 'minimalistic' ? 'bg-white text-black' : 'bg-[hsl(var(--accent))]') : ''\n }`}\n onClick={() => handleSelect(option.value)}\n >\n {option.label}\n </div>\n ))\n ) : (\n <div className={`${optionSizeStyles} ${themeName === 'minimalistic' ? 'text-[hsl(var(--muted-foreground))]' : 'text-[hsl(var(--muted-foreground))]'} text-center`}>\n No results found\n </div>\n )}\n </div>\n </div>\n )}\n </div>\n {error && (\n <p className=\"mt-1.5 text-sm text-[hsl(var(--destructive))]\">{error}</p>\n )}\n {helperText && !error && (\n <p className=\"mt-1.5 text-sm text-[hsl(var(--muted-foreground))]\">{helperText}</p>\n )}\n </div>\n );\n};\n","\"use client\";\n\nimport React, { useEffect } from 'react';\n\nexport interface ModalProps {\n isOpen: boolean;\n onClose: () => void;\n title?: string;\n children: React.ReactNode;\n size?: 'sm' | 'md' | 'lg' | 'xl';\n showCloseButton?: boolean;\n}\n\nconst sizeClasses = {\n sm: 'max-w-md',\n md: 'max-w-lg',\n lg: 'max-w-2xl',\n xl: 'max-w-4xl',\n};\n\nexport const Modal: React.FC<ModalProps> = ({\n isOpen,\n onClose,\n title,\n children,\n size = 'md',\n showCloseButton = true,\n}) => {\n\n // Close on Escape key\n useEffect(() => {\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === 'Escape' && isOpen) {\n onClose();\n }\n };\n\n if (isOpen) {\n document.addEventListener('keydown', handleEscape);\n // Prevent body scroll when modal is open\n document.body.style.overflow = 'hidden';\n }\n\n return () => {\n document.removeEventListener('keydown', handleEscape);\n document.body.style.overflow = 'unset';\n };\n }, [isOpen, onClose]);\n\n if (!isOpen) return null;\n\n const sizeClass = sizeClasses[size];\n\n return (\n <div\n className=\"fixed inset-0 z-50 flex items-center justify-center p-4 bg-black/80 backdrop-blur-sm transition-all duration-200\"\n onClick={onClose}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={title ? 'modal-title' : undefined}\n >\n <div\n className={`relative w-full ${sizeClass} bg-[hsl(var(--card))] text-[hsl(var(--card-foreground))] rounded-lg border border-[hsl(var(--border))] shadow-2xl transform transition-all duration-200 scale-100 animate-in`}\n onClick={(e) => e.stopPropagation()}\n >\n {/* Header */}\n {(title || showCloseButton) && (\n <div className=\"flex items-center justify-between p-6 border-b border-[hsl(var(--border))]\">\n {title && (\n <h3 id=\"modal-title\" className=\"text-lg font-semibold\">\n {title}\n </h3>\n )}\n {showCloseButton && (\n <button\n onClick={onClose}\n className=\"ml-auto text-[hsl(var(--muted-foreground))] hover:text-[hsl(var(--foreground))] transition-colors rounded-[--radius] p-1 hover:bg-[hsl(var(--accent))]\"\n aria-label=\"Close modal\"\n >\n <svg className=\"w-5 h-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n )}\n </div>\n )}\n\n {/* Content */}\n <div className=\"p-6\">\n {children}\n </div>\n </div>\n </div>\n );\n};\n","\"use client\";\n\nimport React from 'react';\n\nexport interface NavbarProps {\n logo?: React.ReactNode;\n children?: React.ReactNode;\n className?: string;\n sticky?: boolean;\n variant?: 'solid' | 'glass' | 'transparent';\n}\n\nexport const Navbar: React.FC<NavbarProps> = ({\n logo,\n children,\n className = '',\n sticky = false,\n variant = 'solid',\n}) => {\n\n const baseClasses = sticky ? 'sticky top-0 z-40' : '';\n\n const getVariantClasses = () => {\n switch (variant) {\n case 'glass':\n return 'bg-[hsl(var(--background))]/80 backdrop-blur-xl border-b border-[hsl(var(--border))]';\n case 'transparent':\n return 'bg-transparent';\n case 'solid':\n default:\n return 'bg-[hsl(var(--background))] border-b border-[hsl(var(--border))]';\n }\n };\n\n return (\n <nav className={`${getVariantClasses()} ${baseClasses} ${className}`}>\n <div className=\"max-w-7xl mx-auto px-4 sm:px-6 lg:px-8\">\n <div className=\"flex justify-between items-center h-16\">\n {logo && (\n <div className=\"flex items-center\">\n {logo}\n </div>\n )}\n {children && (\n <div className=\"flex items-center gap-6\">\n {children}\n </div>\n )}\n </div>\n </div>\n </nav>\n );\n};\n","\"use client\";\n\nimport React from 'react';\n\nexport interface SidebarProps {\n children: React.ReactNode;\n className?: string;\n width?: 'sm' | 'md' | 'lg';\n position?: 'left' | 'right';\n}\n\nconst widthClasses = {\n sm: 'w-48',\n md: 'w-64',\n lg: 'w-80',\n};\n\nexport const Sidebar: React.FC<SidebarProps> = ({\n children,\n className = '',\n width = 'md',\n position = 'left',\n}) => {\n const widthClass = widthClasses[width];\n const borderClass = position === 'left' ? 'border-r' : 'border-l';\n\n return (\n <aside\n className={`${widthClass} bg-[hsl(var(--card))] ${borderClass} border-[hsl(var(--border))] h-full overflow-y-auto ${className}`}\n >\n {children}\n </aside>\n );\n};\n","\"use client\";\n\nimport React, { createContext, useContext, useState, ReactNode } from 'react';\n\nexport interface SidebarContextValue {\n isOpen: boolean;\n isMobile: boolean;\n open: () => void;\n close: () => void;\n toggle: () => void;\n setIsMobile: (isMobile: boolean) => void;\n}\n\nconst SidebarContext = createContext<SidebarContextValue | undefined>(undefined);\n\nexport interface SidebarProviderProps {\n children: ReactNode;\n defaultOpen?: boolean;\n}\n\nexport const SidebarProvider: React.FC<SidebarProviderProps> = ({\n children,\n defaultOpen = false,\n}) => {\n const [isOpen, setIsOpen] = useState(defaultOpen);\n const [isMobile, setIsMobile] = useState(false);\n\n const open = () => setIsOpen(true);\n const close = () => setIsOpen(false);\n const toggle = () => setIsOpen(prev => !prev);\n\n const value: SidebarContextValue = {\n isOpen,\n isMobile,\n open,\n close,\n toggle,\n setIsMobile,\n };\n\n return (\n <SidebarContext.Provider value={value}>\n {children}\n </SidebarContext.Provider>\n );\n};\n\nexport const useSidebar = (): SidebarContextValue => {\n const context = useContext(SidebarContext);\n if (!context) {\n throw new Error('useSidebar must be used within a SidebarProvider');\n }\n return context;\n};\n","\"use client\";\n\nimport React, { useState } from 'react';\nimport { MenuIcon } from '../icons';\n\nexport interface AppShellProps {\n children: React.ReactNode;\n navbar?: {\n content: React.ReactNode;\n width?: 'sm' | 'md' | 'lg';\n breakpoint?: 'sm' | 'md' | 'lg' | 'xl';\n position?: 'side' | 'top';\n variant?: 'solid' | 'glass' | 'transparent';\n };\n header?: React.ReactNode;\n navbarTitle?: string;\n navbarLogo?: React.ReactNode;\n defaultNavbarOpen?: boolean;\n responsive?: boolean;\n className?: string;\n}\n\nconst widthClasses = {\n sm: 'w-48',\n md: 'w-64',\n lg: 'w-80',\n};\n\nconst breakpointClasses = {\n sm: 'sm',\n md: 'md',\n lg: 'lg',\n xl: 'xl',\n};\n\nconst getVariantClasses = (variant?: 'solid' | 'glass' | 'transparent') => {\n switch (variant) {\n case 'glass':\n return 'bg-[hsl(var(--background))]/80 backdrop-blur-xl';\n case 'transparent':\n return 'bg-transparent';\n case 'solid':\n default:\n return 'bg-[hsl(var(--background))] border-b border-[hsl(var(--border))]';\n }\n};\n\nexport const AppShell: React.FC<AppShellProps> = ({\n children,\n navbar,\n header,\n navbarTitle,\n navbarLogo,\n defaultNavbarOpen = false,\n responsive = true,\n className = '',\n}) => {\n const [isMobileNavbarOpen, setIsMobileNavbarOpen] = useState(defaultNavbarOpen);\n\n const navbarWidth = navbar?.width || 'md';\n const navbarBreakpoint = navbar?.breakpoint || 'md';\n const navbarPosition = navbar?.position || 'side';\n const widthClass = widthClasses[navbarWidth];\n const breakpoint = breakpointClasses[navbarBreakpoint];\n\n // Non-responsive mode: always show sidebar\n if (!responsive && navbar) {\n return (\n <div className={`min-h-screen flex flex-col ${className}`}>\n {header && <div className=\"w-full\">{header}</div>}\n <div className=\"flex flex-1\">\n <aside className={`${widthClass} bg-[hsl(var(--card))] border-r border-[hsl(var(--border))] h-full overflow-y-auto`}>\n {navbar.content}\n </aside>\n <main className=\"flex-1 overflow-y-auto\">\n {children}\n </main>\n </div>\n </div>\n );\n }\n\n // Non-responsive mode without navbar\n if (!responsive) {\n return (\n <div className={`min-h-screen flex flex-col ${className}`}>\n {header && <div className=\"w-full\">{header}</div>}\n <main className=\"flex-1 overflow-y-auto\">\n {children}\n </main>\n </div>\n );\n }\n\n // Responsive mode with TOP navbar\n if (navbar && navbarPosition === 'top') {\n const mobileMenuClass = navbarBreakpoint === 'sm' ? 'sm:hidden' :\n navbarBreakpoint === 'md' ? 'md:hidden' :\n navbarBreakpoint === 'lg' ? 'lg:hidden' : 'xl:hidden';\n\n const desktopNavClass = navbarBreakpoint === 'sm' ? 'sm:flex' :\n navbarBreakpoint === 'md' ? 'md:flex' :\n navbarBreakpoint === 'lg' ? 'lg:flex' : 'xl:flex';\n\n return (\n <div className={`min-h-screen flex flex-col bg-[hsl(var(--background))] ${className}`}>\n {/* Top Navbar */}\n <nav className={`sticky top-0 z-30 ${getVariantClasses(navbar.variant)}`}>\n <div className=\"max-w-7xl mx-auto px-4 sm:px-6 lg:px-8\">\n <div className=\"flex justify-between items-center h-16\">\n {/* Logo/Title */}\n <div className=\"flex items-center\">\n {navbarLogo ? (\n <div>{navbarLogo}</div>\n ) : navbarTitle ? (\n <span className=\"text-xl font-bold text-[hsl(var(--foreground))]\">\n {navbarTitle}\n </span>\n ) : null}\n </div>\n\n {/* Desktop Navigation - Hidden on Mobile */}\n <div className={`hidden ${desktopNavClass} items-center gap-6`}>\n {navbar.content}\n </div>\n\n {/* Mobile Hamburger - Visible on Mobile */}\n <button\n className={`${mobileMenuClass} p-2 rounded-lg hover:bg-[hsl(var(--accent))] transition-colors`}\n onClick={() => setIsMobileNavbarOpen(!isMobileNavbarOpen)}\n aria-label=\"Toggle menu\"\n >\n <MenuIcon size=\"md\" />\n </button>\n </div>\n </div>\n </nav>\n\n {/* Header (optional, shows below top navbar) */}\n {header && <div className=\"w-full\">{header}</div>}\n\n {/* Mobile Drawer */}\n {isMobileNavbarOpen && (\n <>\n <div\n className={`${mobileMenuClass} fixed inset-0 z-40 bg-black/60 backdrop-blur-sm animate-in fade-in duration-200`}\n onClick={() => setIsMobileNavbarOpen(false)}\n />\n <div className={`${mobileMenuClass} fixed left-0 top-0 bottom-0 z-50 w-64 bg-[hsl(var(--card))] shadow-2xl animate-in slide-in-from-left duration-300`}>\n <div className=\"p-4 border-b border-[hsl(var(--border))] flex items-center justify-between\">\n {navbarLogo ? (\n <div>{navbarLogo}</div>\n ) : navbarTitle ? (\n <span className=\"text-xl font-bold text-[hsl(var(--foreground))]\">\n {navbarTitle}\n </span>\n ) : null}\n <button\n className=\"p-1 rounded hover:bg-[hsl(var(--accent))] transition-colors\"\n onClick={() => setIsMobileNavbarOpen(false)}\n aria-label=\"Close menu\"\n >\n <svg className=\"w-6 h-6\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </div>\n <div\n className=\"p-4 flex flex-col gap-4\"\n onClick={() => setIsMobileNavbarOpen(false)}\n >\n {navbar.content}\n </div>\n </div>\n </>\n )}\n\n {/* Main Content */}\n <main className=\"flex-1 overflow-y-auto\">\n {children}\n </main>\n </div>\n );\n }\n\n // Responsive mode with SIDE navbar\n if (navbar) {\n // Build breakpoint classes statically\n const mobileHeaderClass = navbarBreakpoint === 'sm' ? 'sm:hidden' :\n navbarBreakpoint === 'md' ? 'md:hidden' :\n navbarBreakpoint === 'lg' ? 'lg:hidden' : 'xl:hidden';\n\n const desktopNavbarClass = navbarBreakpoint === 'sm' ? 'sm:block' :\n navbarBreakpoint === 'md' ? 'md:block' :\n navbarBreakpoint === 'lg' ? 'lg:block' : 'xl:block';\n\n const mobileDrawerClass = navbarBreakpoint === 'sm' ? 'sm:hidden' :\n navbarBreakpoint === 'md' ? 'md:hidden' :\n navbarBreakpoint === 'lg' ? 'lg:hidden' : 'xl:hidden';\n\n // Build width classes statically (Tailwind can't use dynamic classes)\n const sidebarWidthClass = navbarWidth === 'sm' ? 'w-48' :\n navbarWidth === 'lg' ? 'w-80' : 'w-64';\n\n return (\n <div className={`min-h-screen flex flex-col bg-[hsl(var(--background))] ${className}`}>\n {/* Mobile Header - Hidden on Desktop */}\n <div className={`${mobileHeaderClass} sticky top-0 z-30 ${getVariantClasses(navbar.variant)} px-4 py-3 flex items-center justify-between`}>\n {navbarLogo ? (\n <div>{navbarLogo}</div>\n ) : navbarTitle ? (\n <span className=\"text-xl font-bold text-[hsl(var(--foreground))]\">\n {navbarTitle}\n </span>\n ) : null}\n <button\n className=\"p-2 rounded-lg hover:bg-[hsl(var(--accent))] transition-colors\"\n onClick={() => setIsMobileNavbarOpen(!isMobileNavbarOpen)}\n aria-label=\"Toggle menu\"\n >\n <MenuIcon size=\"md\" />\n </button>\n </div>\n\n {/* Header (optional, shows on all screen sizes) */}\n {header && <div className=\"w-full\">{header}</div>}\n\n {/* Main Layout */}\n <div className=\"flex flex-1 min-h-0\">\n {/* Desktop Navbar - Hidden on Mobile */}\n <aside className={`hidden ${desktopNavbarClass} ${sidebarWidthClass} ${navbar.variant === 'glass' ? 'bg-[hsl(var(--background))]/80 backdrop-blur-xl' : navbar.variant === 'transparent' ? 'bg-transparent' : 'bg-[hsl(var(--card))] border-r border-[hsl(var(--border))]'} overflow-y-auto shrink-0`}>\n {navbar.content}\n </aside>\n\n {/* Mobile Drawer Overlay */}\n {isMobileNavbarOpen && (\n <>\n <div\n className={`${mobileDrawerClass} fixed inset-0 z-40 bg-black/60 backdrop-blur-sm animate-in fade-in duration-200`}\n onClick={() => setIsMobileNavbarOpen(false)}\n />\n <div className={`${mobileDrawerClass} fixed left-0 top-0 bottom-0 z-50 w-64 bg-[hsl(var(--card))] shadow-2xl animate-in slide-in-from-left duration-300`}>\n <div className=\"p-4 border-b border-[hsl(var(--border))] flex items-center justify-between\">\n {navbarLogo ? (\n <div>{navbarLogo}</div>\n ) : navbarTitle ? (\n <span className=\"text-xl font-bold text-[hsl(var(--foreground))]\">\n {navbarTitle}\n </span>\n ) : null}\n <button\n className=\"p-1 rounded hover:bg-[hsl(var(--accent))] transition-colors\"\n onClick={() => setIsMobileNavbarOpen(false)}\n aria-label=\"Close menu\"\n >\n <svg className=\"w-6 h-6\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </div>\n <div\n className=\"overflow-y-auto h-[calc(100vh-73px)]\"\n onClick={() => setIsMobileNavbarOpen(false)}\n >\n {navbar.content}\n </div>\n </div>\n </>\n )}\n\n {/* Main Content */}\n <main className=\"flex-1 overflow-y-auto min-h-screen\">\n {children}\n </main>\n </div>\n </div>\n );\n }\n\n // Responsive mode without navbar\n return (\n <div className={`min-h-screen flex flex-col ${className}`}>\n {header && <div className=\"w-full\">{header}</div>}\n <main className=\"flex-1 overflow-y-auto\">\n {children}\n </main>\n </div>\n );\n};\n","\"use client\";\n\nimport React from 'react';\n\nexport interface IconProps {\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n className?: string;\n color?: string;\n}\n\nconst sizeClasses = {\n xs: 'w-3 h-3',\n sm: 'w-4 h-4',\n md: 'w-5 h-5',\n lg: 'w-6 h-6',\n xl: 'w-8 h-8',\n};\n\nexport interface IconComponent extends React.FC<IconProps> {\n displayName?: string;\n}\n\nexport const createIcon = (\n displayName: string,\n path: React.ReactNode,\n filled = false\n): IconComponent => {\n const Icon: IconComponent = ({ size = 'md', className = '', color = 'currentColor' }) => {\n const sizeClass = sizeClasses[size];\n return (\n <svg\n className={`${sizeClass} ${className}`}\n fill={filled ? color : \"none\"}\n viewBox=\"0 0 24 24\"\n stroke={filled ? \"none\" : color}\n aria-hidden=\"true\"\n >\n {path}\n </svg>\n );\n };\n Icon.displayName = displayName;\n return Icon;\n};\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const HomeIcon = createIcon(\n 'HomeIcon',\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1m-6 0h6\" />\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const UserIcon = createIcon(\n 'UserIcon',\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z\" />\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const SearchIcon = createIcon(\n 'SearchIcon',\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z\" />\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const BellIcon = createIcon(\n 'BellIcon',\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 17h5l-1.405-1.405A2.032 2.032 0 0118 14.158V11a6.002 6.002 0 00-4-5.659V5a2 2 0 10-4 0v.341C7.67 6.165 6 8.388 6 11v3.159c0 .538-.214 1.055-.595 1.436L4 17h5m6 0v1a3 3 0 11-6 0v-1m6 0H9\" />\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const SettingsIcon = createIcon(\n 'SettingsIcon',\n <>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 12a3 3 0 11-6 0 3 3 0 016 0z\" />\n </>\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const MenuIcon = createIcon(\n 'MenuIcon',\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 6h16M4 12h16M4 18h16\" />\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const CloseIcon = createIcon(\n 'CloseIcon',\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const PlusIcon = createIcon(\n 'PlusIcon',\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 4v16m8-8H4\" />\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const ArrowLeftIcon = createIcon(\n 'ArrowLeftIcon',\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M10 19l-7-7m0 0l7-7m-7 7h18\" />\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const ArrowRightIcon = createIcon(\n 'ArrowRightIcon',\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M14 5l7 7m0 0l-7 7m7-7H3\" />\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const ArrowUpIcon = createIcon(\n 'ArrowUpIcon',\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 10l7-7m0 0l7 7m-7-7v18\" />,\n false\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const ArrowDownIcon = createIcon(\n 'ArrowDownIcon',\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 14l-7 7m0 0l-7-7m7 7V3\" />,\n false\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const ChevronDownIcon = createIcon(\n 'ChevronDownIcon',\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 9l-7 7-7-7\" />\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const ChevronUpIcon = createIcon(\n 'ChevronUpIcon',\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 15l7-7 7 7\" />\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const ChevronLeftIcon = createIcon(\n 'ChevronLeftIcon',\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 19l-7-7 7-7\" />\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const ChevronRightIcon = createIcon(\n 'ChevronRightIcon',\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 5l7 7-7 7\" />\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const ExternalLinkIcon = createIcon(\n 'ExternalLinkIcon',\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14\" />\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const CheckIcon = createIcon(\n 'CheckIcon',\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 13l4 4L19 7\" />\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const CheckCircleIcon = createIcon(\n 'CheckCircleIcon',\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z\" />\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const AlertCircleIcon = createIcon(\n 'AlertCircleIcon',\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const InfoCircleIcon = createIcon(\n 'InfoCircleIcon',\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const TrashIcon = createIcon(\n 'TrashIcon',\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16\" />\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const EditIcon = createIcon(\n 'EditIcon',\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M11 5H6a2 2 0 00-2 2v11a2 2 0 002 2h11a2 2 0 002-2v-5m-1.414-9.414a2 2 0 112.828 2.828L11.828 15H9v-2.828l8.586-8.586z\" />\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const CopyIcon = createIcon(\n 'CopyIcon',\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\" />\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const SaveIcon = createIcon(\n 'SaveIcon',\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M8 7H5a2 2 0 00-2 2v10a2 2 0 002 2h14a2 2 0 002-2V9a2 2 0 00-2-2h-3m-1 4l-3 3m0 0l-3-3m3 3V4\" />\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const DownloadIcon = createIcon(\n 'DownloadIcon',\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-4l-4 4m0 0l-4-4m4 4V4\" />\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const UploadIcon = createIcon(\n 'UploadIcon',\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-8l-4-4m0 0L8 8m4-4v12\" />\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const RefreshIcon = createIcon(\n 'RefreshIcon',\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15\" />\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const EyeIcon = createIcon(\n 'EyeIcon',\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 12a3 3 0 11-6 0 3 3 0 016 0z M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z\" />\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const EyeOffIcon = createIcon(\n 'EyeOffIcon',\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M13.875 18.825A10.05 10.05 0 0112 19c-4.478 0-8.268-2.943-9.543-7a9.97 9.97 0 011.563-3.029m5.858.908a3 3 0 114.243 4.243M9.878 9.878l4.242 4.242M9.88 9.88l-3.29-3.29m7.532 7.532l3.29 3.29M3 3l3.59 3.59m0 0A9.953 9.953 0 0112 5c4.478 0 8.268 2.943 9.543 7a10.025 10.025 0 01-4.132 5.411m0 0L21 21\" />\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const PlayIcon = createIcon(\n 'PlayIcon',\n <path d=\"M8 5v14l11-7z\" />,\n true\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const PauseIcon = createIcon(\n 'PauseIcon',\n <>\n <rect x=\"6\" y=\"4\" width=\"4\" height=\"16\" rx=\"1\" />\n <rect x=\"14\" y=\"4\" width=\"4\" height=\"16\" rx=\"1\" />\n </>,\n true\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const StopIcon = createIcon(\n 'StopIcon',\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const SkipBackIcon = createIcon(\n 'SkipBackIcon',\n <>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12.066 11.2a1 1 0 000 1.6l5.334 4A1 1 0 0019 16V8a1 1 0 00-1.6-.8l-5.333 4zM4.066 11.2a1 1 0 000 1.6l5.334 4A1 1 0 0011 16V8a1 1 0 00-1.6-.8l-5.334 4z\" />\n </>,\n false\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const SkipForwardIcon = createIcon(\n 'SkipForwardIcon',\n <>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M11.933 12.8a1 1 0 000-1.6L6.6 7.2A1 1 0 005 8v8a1 1 0 001.6.8l5.333-4zM19.933 12.8a1 1 0 000-1.6l-5.333-4A1 1 0 0013 8v8a1 1 0 001.6.8l5.333-4z\" />\n </>,\n false\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const VolumeUpIcon = createIcon(\n 'VolumeUpIcon',\n <>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15.536 8.464a5 5 0 010 7.072m2.828-9.9a9 9 0 010 12.728M5.586 15H4a1 1 0 01-1-1v-4a1 1 0 011-1h1.586l4.707-4.707C10.923 3.663 12 4.109 12 5v14c0 .891-1.077 1.337-1.707.707L5.586 15z\" />\n </>,\n false\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const VolumeOffIcon = createIcon(\n 'VolumeOffIcon',\n <>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5.586 15H4a1 1 0 01-1-1v-4a1 1 0 011-1h1.586l4.707-4.707C10.923 3.663 12 4.109 12 5v14c0 .891-1.077 1.337-1.707.707L5.586 15z\" clipRule=\"evenodd\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M17 14l2-2m0 0l2-2m-2 2l-2-2m2 2l2 2\" />\n </>,\n false\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const FullscreenIcon = createIcon(\n 'FullscreenIcon',\n <>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 8V4m0 0h4M4 4l5 5m11-1V4m0 0h-4m4 0l-5 5M4 16v4m0 0h4m-4 0l5-5m11 5v-4m0 4h-4m4 0l-5-5\" />\n </>,\n false\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const FullscreenExitIcon = createIcon(\n 'FullscreenExitIcon',\n <>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 9V4.5M9 9H4.5M9 9L3.75 3.75M9 15v4.5M9 15H4.5M9 15l-5.25 5.25M15 9h4.5M15 9V4.5M15 9l5.25-5.25M15 15h4.5M15 15v4.5m0-4.5l5.25 5.25\" />\n </>,\n false\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const MailIcon = createIcon(\n 'MailIcon',\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M3 8l7.89 5.26a2 2 0 002.22 0L21 8M5 19h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z\" />\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const ChatIcon = createIcon(\n 'ChatIcon',\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M8 12h.01M12 12h.01M16 12h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 01-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z\" />\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const StarIcon = createIcon(\n 'StarIcon',\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M11.049 2.927c.3-.921 1.603-.921 1.902 0l1.519 4.674a1 1 0 00.95.69h4.915c.969 0 1.371 1.24.588 1.81l-3.976 2.888a1 1 0 00-.363 1.118l1.518 4.674c.3.922-.755 1.688-1.538 1.118l-3.976-2.888a1 1 0 00-1.176 0l-3.976 2.888c-.783.57-1.838-.197-1.538-1.118l1.518-4.674a1 1 0 00-.363-1.118l-3.976-2.888c-.784-.57-.38-1.81.588-1.81h4.914a1 1 0 00.951-.69l1.519-4.674z\" />\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const HeartIcon = createIcon(\n 'HeartIcon',\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4.318 6.318a4.5 4.5 0 000 6.364L12 20.364l7.682-7.682a4.5 4.5 0 00-6.364-6.364L12 7.636l-1.318-1.318a4.5 4.5 0 00-6.364 0z\" />\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const CameraIcon = createIcon(\n 'CameraIcon',\n <>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M3 9a2 2 0 012-2h.93a2 2 0 001.664-.89l.812-1.22A2 2 0 0110.07 4h3.86a2 2 0 011.664.89l.812 1.22A2 2 0 0018.07 7H19a2 2 0 012 2v9a2 2 0 01-2 2H5a2 2 0 01-2-2V9z\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 13a3 3 0 11-6 0 3 3 0 016 0z\" />\n </>\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const CalendarIcon = createIcon(\n 'CalendarIcon',\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z\" />\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const BookIcon = createIcon(\n 'BookIcon',\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 6.253v13m0-13C10.832 5.477 9.246 5 7.5 5S4.168 5.477 3 6.253v13C4.168 18.477 5.754 18 7.5 18s3.332.477 4.5 1.253m0-13C13.168 5.477 14.754 5 16.5 5c1.747 0 3.332.477 4.5 1.253v13C19.832 18.477 18.247 18 16.5 18c-1.746 0-3.332.477-4.5 1.253\" />\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const FileIcon = createIcon(\n 'FileIcon',\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M7 21h10a2 2 0 002-2V9.414a1 1 0 00-.293-.707l-5.414-5.414A1 1 0 0012.586 3H7a2 2 0 00-2 2v14a2 2 0 002 2z\" />\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const FolderIcon = createIcon(\n 'FolderIcon',\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M3 7v10a2 2 0 002 2h14a2 2 0 002-2V9a2 2 0 00-2-2h-6l-2-2H5a2 2 0 00-2 2z\" />\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const ImageIcon = createIcon(\n 'ImageIcon',\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 16l4.586-4.586a2 2 0 012.828 0L16 16m-2-2l1.586-1.586a2 2 0 012.828 0L20 14m-6-6h.01M6 20h12a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v12a2 2 0 002 2z\" />\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const CodeIcon = createIcon(\n 'CodeIcon',\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M10 20l4-16m4 4l4 4-4 4M6 16l-4-4 4-4\" />\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const TerminalIcon = createIcon(\n 'TerminalIcon',\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M8 9l3 3-3 3m5 0h3M5 20h14a2 2 0 002-2V6a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z\" />\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const DatabaseIcon = createIcon(\n 'DatabaseIcon',\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 7v10c0 2.21 3.582 4 8 4s8-1.79 8-4V7M4 7c0 2.21 3.582 4 8 4s8-1.79 8-4M4 7c0-2.21 3.582-4 8-4s8 1.79 8 4m0 5c0 2.21-3.582 4-8 4s-8-1.79-8-4\" />\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const CloudIcon = createIcon(\n 'CloudIcon',\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M3 15a4 4 0 004 4h9a5 5 0 10-.1-9.999 5.002 5.002 0 10-9.78 2.096A4.001 4.001 0 003 15z\" />\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const PlugIcon = createIcon(\n 'PlugIcon',\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M13 10V3L4 14h7v7l9-11h-7z\" />\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const KeyIcon = createIcon(\n 'KeyIcon',\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 7a2 2 0 012 2m4 0a6 6 0 01-7.743 5.743L11 17H9v2H7v2H4a1 1 0 01-1-1v-2.586a1 1 0 01.293-.707l5.964-5.964A6 6 0 1121 9z\" />\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const LockIcon = createIcon(\n 'LockIcon',\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z\" />\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const ShieldIcon = createIcon(\n 'ShieldIcon',\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z\" />\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const SparklesIcon = createIcon(\n 'SparklesIcon',\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 3v4M3 5h4M6 17v4m-2-2h4m5-16l2.286 6.857L21 12l-5.714 2.143L13 21l-2.286-6.857L5 12l5.714-2.143L13 3z\" />\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const BrainIcon = createIcon(\n 'BrainIcon',\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9.663 17h4.673M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z\" />\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const GlobeIcon = createIcon(\n 'GlobeIcon',\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M3.055 11H5a2 2 0 012 2v1a2 2 0 002 2 2 2 0 012 2v2.945M8 3.935V5.5A2.5 2.5 0 0010.5 8h.5a2 2 0 012 2 2 2 0 104 0 2 2 0 012-2h1.064M15 20.488V18a2 2 0 012-2h3.064M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const BeakerIcon = createIcon(\n 'BeakerIcon',\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19.428 15.428a2 2 0 00-1.022-.547l-2.387-.477a6 6 0 00-3.86.517l-.318.158a6 6 0 01-3.86.517L6.05 15.21a2 2 0 00-1.806.547M8 4h8l-1 1v5.172a2 2 0 00.586 1.414l5 5c1.26 1.26.367 3.414-1.415 3.414H4.828c-1.782 0-2.674-2.154-1.414-3.414l5-5A2 2 0 009 10.172V5L8 4z\" />\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const GoogleIcon = createIcon(\n 'GoogleIcon',\n <path d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\" />,\n true\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const GitHubIcon = createIcon(\n 'GitHubIcon',\n <path d=\"M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z\" />,\n true\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const TwitterIcon = createIcon(\n 'TwitterIcon',\n <path d=\"M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z\" />,\n true\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const FacebookIcon = createIcon(\n 'FacebookIcon',\n <path d=\"M9.101 23.691v-7.98H6.627v-3.667h2.474v-1.58c0-4.085 1.848-5.978 5.858-5.978.401 0 .955.042 1.468.103a8.68 8.68 0 0 1 1.141.195v3.325a8.623 8.623 0 0 0-.653-.036 26.805 26.805 0 0 0-.733-.009c-.707 0-1.259.096-1.675.309a1.686 1.686 0 0 0-.679.622c-.258.42-.374.995-.374 1.752v1.297h3.919l-.386 2.103-.287 1.564h-3.246v8.245C19.396 23.238 24 18.179 24 12.044c0-6.627-5.373-12-12-12s-12 5.373-12 12c0 5.628 3.874 10.35 9.101 11.647Z\" />,\n true\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const AppleIcon = createIcon(\n 'AppleIcon',\n <path d=\"M17.05 20.28c-.98.95-2.05.88-3.08.4-1.09-.5-2.08-.48-3.24 0-1.44.62-2.2.44-3.06-.4C2.79 15.25 3.51 7.59 9.05 7.31c1.35.07 2.29.74 3.08.8 1.18-.24 2.31-.93 3.57-.84 1.51.12 2.65.72 3.4 1.8-3.12 1.87-2.38 5.98.48 7.13-.57 1.5-1.31 2.99-2.54 4.09l.01-.01zM12.03 7.25c-.15-2.23 1.66-4.07 3.74-4.25.29 2.58-2.34 4.5-3.74 4.25z\" />,\n true\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const LinkedInIcon = createIcon(\n 'LinkedInIcon',\n <path d=\"M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433c-1.144 0-2.063-.926-2.063-2.065 0-1.138.92-2.063 2.063-2.063 1.14 0 2.064.925 2.064 2.063 0 1.139-.925 2.065-2.064 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z\" />,\n true\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const YouTubeIcon = createIcon(\n 'YouTubeIcon',\n <path d=\"M23.498 6.186a3.016 3.016 0 0 0-2.122-2.136C19.505 3.545 12 3.545 12 3.545s-7.505 0-9.377.505A3.017 3.017 0 0 0 .502 6.186C0 8.07 0 12 0 12s0 3.93.502 5.814a3.016 3.016 0 0 0 2.122 2.136c1.871.505 9.376.505 9.376.505s7.505 0 9.377-.505a3.015 3.015 0 0 0 2.122-2.136C24 15.93 24 12 24 12s0-3.93-.502-5.814zM9.545 15.568V8.432L15.818 12l-6.273 3.568z\" />,\n true\n);\n","\"use client\";\n\nimport { createIcon } from './icon-utils';\n\nexport const SlackIcon = createIcon(\n 'SlackIcon',\n <path d=\"M5.042 15.165a2.528 2.528 0 0 1-2.52 2.523A2.528 2.528 0 0 1 0 15.165a2.527 2.527 0 0 1 2.522-2.52h2.52v2.52zm1.271 0a2.527 2.527 0 0 1 2.521-2.52 2.527 2.527 0 0 1 2.521 2.52v6.313A2.528 2.528 0 0 1 8.834 24a2.528 2.528 0 0 1-2.521-2.522v-6.313zM8.834 5.042a2.528 2.528 0 0 1-2.521-2.52A2.528 2.528 0 0 1 8.834 0a2.528 2.528 0 0 1 2.521 2.522v2.52H8.834zm0 1.271a2.528 2.528 0 0 1 2.521 2.521 2.528 2.528 0 0 1-2.521 2.521H2.522A2.528 2.528 0 0 1 0 8.834a2.528 2.528 0 0 1 2.522-2.521h6.312zm10.122 2.521a2.528 2.528 0 0 1 2.522-2.521A2.528 2.528 0 0 1 24 8.834a2.528 2.528 0 0 1-2.522 2.521h-2.522V8.834zm-1.268 0a2.528 2.528 0 0 1-2.523 2.521 2.527 2.527 0 0 1-2.52-2.521V2.522A2.527 2.527 0 0 1 15.165 0a2.528 2.528 0 0 1 2.523 2.522v6.312zm-2.523 10.122a2.528 2.528 0 0 1 2.523 2.522A2.528 2.528 0 0 1 15.165 24a2.527 2.527 0 0 1-2.52-2.522v-2.522h2.52zm0-1.268a2.527 2.527 0 0 1-2.52-2.523 2.526 2.526 0 0 1 2.52-2.52h6.313A2.527 2.527 0 0 1 24 15.165a2.528 2.528 0 0 1-2.522 2.523h-6.313z\" />,\n true\n);\n","\"use client\";\n\nimport React, { useEffect } from 'react';\n\nexport interface DrawerProps {\n isOpen: boolean;\n onClose: () => void;\n title?: string;\n children: React.ReactNode;\n position?: 'left' | 'right' | 'top' | 'bottom';\n size?: 'sm' | 'md' | 'lg';\n showCloseButton?: boolean;\n}\n\nconst sizeClasses = {\n left: {\n sm: 'w-64',\n md: 'w-80',\n lg: 'w-96',\n },\n right: {\n sm: 'w-64',\n md: 'w-80',\n lg: 'w-96',\n },\n top: {\n sm: 'h-48',\n md: 'h-64',\n lg: 'h-80',\n },\n bottom: {\n sm: 'h-48',\n md: 'h-64',\n lg: 'h-80',\n },\n};\n\nconst positionClasses = {\n left: 'left-0 top-0 h-full',\n right: 'right-0 top-0 h-full',\n top: 'top-0 left-0 w-full',\n bottom: 'bottom-0 left-0 w-full',\n};\n\nconst slideClasses = {\n left: 'transform transition-transform duration-300',\n right: 'transform transition-transform duration-300',\n top: 'transform transition-transform duration-300',\n bottom: 'transform transition-transform duration-300',\n};\n\nexport const Drawer: React.FC<DrawerProps> = ({\n isOpen,\n onClose,\n title,\n children,\n position = 'right',\n size = 'md',\n showCloseButton = true,\n}) => {\n\n // Close on Escape key\n useEffect(() => {\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === 'Escape' && isOpen) {\n onClose();\n }\n };\n\n if (isOpen) {\n document.addEventListener('keydown', handleEscape);\n document.body.style.overflow = 'hidden';\n }\n\n return () => {\n document.removeEventListener('keydown', handleEscape);\n document.body.style.overflow = 'unset';\n };\n }, [isOpen, onClose]);\n\n if (!isOpen) return null;\n\n const sizeClass = sizeClasses[position][size];\n const positionClass = positionClasses[position];\n\n return (\n <>\n {/* Backdrop */}\n <div\n className=\"fixed inset-0 z-40 bg-black/80 backdrop-blur-sm transition-all duration-200\"\n onClick={onClose}\n />\n\n {/* Drawer */}\n <div\n className={`fixed z-50 ${positionClass} ${sizeClass} bg-[hsl(var(--card))] text-[hsl(var(--card-foreground))] border-[hsl(var(--border))] shadow-2xl overflow-hidden flex flex-col ${slideClasses[position]} ${position === 'left' ? 'border-r' : position === 'right' ? 'border-l' : position === 'top' ? 'border-b' : 'border-t'}`}\n >\n {/* Header */}\n {(title || showCloseButton) && (\n <div className=\"flex items-center justify-between p-6 border-b border-[hsl(var(--border))]\">\n {title && (\n <h3 className=\"text-lg font-semibold\">\n {title}\n </h3>\n )}\n {showCloseButton && (\n <button\n onClick={onClose}\n className=\"ml-auto text-[hsl(var(--muted-foreground))] hover:text-[hsl(var(--foreground))] transition-colors rounded-[--radius] p-1 hover:bg-[hsl(var(--accent))]\"\n aria-label=\"Close drawer\"\n >\n <svg className=\"w-5 h-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n )}\n </div>\n )}\n\n {/* Content */}\n <div className=\"flex-1 p-6 overflow-y-auto\">\n {children}\n </div>\n </div>\n </>\n );\n};\n","\"use client\";\n\nimport React, { forwardRef } from 'react';\nimport { useTheme } from '../theme/ThemeProvider';\n\nexport interface TextInputProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size'> {\n label?: string;\n error?: string;\n helperText?: string;\n size?: 'sm' | 'md' | 'lg';\n fullWidth?: boolean;\n leftIcon?: React.ReactNode;\n rightIcon?: React.ReactNode;\n}\n\nconst sizeClasses = {\n sm: 'px-3 py-1.5 text-sm',\n md: 'px-4 py-2.5 text-base',\n lg: 'px-4 py-3 text-lg',\n};\n\nexport const TextInput = forwardRef<HTMLInputElement, TextInputProps>(\n (\n {\n label,\n error,\n helperText,\n size = 'md',\n fullWidth = false,\n leftIcon,\n rightIcon,\n className = '',\n disabled,\n ...props\n },\n ref\n ) => {\n const { theme, themeName } = useTheme();\n\n const baseStyles = 'w-full appearance-none rounded-md border border-[hsl(var(--input))] bg-transparent text-[hsl(var(--foreground))] transition-colors duration-150 focus:outline-none focus:ring-1 focus:ring-[hsl(var(--ring))]/50 focus:border-[hsl(var(--ring))] hover:border-[hsl(var(--muted-foreground))] placeholder:text-[hsl(var(--muted-foreground))]';\n const sizeStyle = sizeClasses[size];\n const errorStyles = error ? 'border-[hsl(var(--destructive))] focus:ring-[hsl(var(--destructive))]' : '';\n const disabledStyles = disabled ? 'pointer-events-none opacity-50 bg-[hsl(var(--muted))]' : '';\n const widthStyle = fullWidth ? 'w-full' : '';\n const paddingWithIcon = leftIcon ? 'pl-10' : rightIcon ? 'pr-10' : '';\n\n return (\n <div className={`${widthStyle} ${className}`}>\n {label && (\n <label className=\"block text-sm font-medium text-[hsl(var(--foreground))] mb-1.5\">\n {label}\n </label>\n )}\n <div className=\"relative\">\n {leftIcon && (\n <div className=\"absolute left-3 top-1/2 transform -translate-y-1/2 text-[hsl(var(--muted-foreground))]\">\n {leftIcon}\n </div>\n )}\n <input\n ref={ref}\n className={`${baseStyles} ${sizeStyle} ${errorStyles} ${disabledStyles} ${paddingWithIcon}`.trim()}\n disabled={disabled}\n {...props}\n />\n {rightIcon && (\n <div className=\"absolute right-3 top-1/2 transform -translate-y-1/2 text-[hsl(var(--muted-foreground))]\">\n {rightIcon}\n </div>\n )}\n </div>\n {error && (\n <p className=\"mt-1.5 text-sm text-[hsl(var(--destructive))]\">{error}</p>\n )}\n {helperText && !error && (\n <p className=\"mt-1.5 text-sm text-[hsl(var(--muted-foreground))]\">{helperText}</p>\n )}\n </div>\n );\n }\n);\n\nTextInput.displayName = 'TextInput';\n","\"use client\";\n\nimport React, { useState, useRef } from 'react';\n\nexport interface NumberInputProps {\n label?: string;\n error?: string;\n helperText?: string;\n value?: number;\n onChange?: (value: number | undefined) => void;\n min?: number;\n max?: number;\n step?: number;\n precision?: number;\n disabled?: boolean;\n hideControls?: boolean;\n size?: 'sm' | 'md' | 'lg';\n fullWidth?: boolean;\n placeholder?: string;\n className?: string;\n}\n\nconst sizeClasses = {\n sm: 'px-3 py-1.5 text-sm',\n md: 'px-3 py-2.5 text-sm',\n lg: 'px-4 py-3 text-base',\n};\n\nexport const NumberInput: React.FC<NumberInputProps> = ({\n label,\n error,\n helperText,\n value,\n onChange,\n min,\n max,\n step = 1,\n precision,\n disabled = false,\n hideControls = false,\n size = 'md',\n fullWidth = false,\n placeholder,\n className = '',\n}) => {\n const inputRef = useRef<HTMLInputElement>(null);\n const [isFocused, setIsFocused] = useState(false);\n\n const clampValue = (val: number): number => {\n let clamped = val;\n if (min !== undefined && clamped < min) clamped = min;\n if (max !== undefined && clamped > max) clamped = max;\n if (precision !== undefined) {\n clamped = parseFloat(clamped.toFixed(precision));\n }\n return clamped;\n };\n\n const handleIncrement = () => {\n if (disabled) return;\n const currentValue = value ?? 0;\n const newValue = clampValue(currentValue + step);\n onChange?.(newValue);\n };\n\n const handleDecrement = () => {\n if (disabled) return;\n const currentValue = value ?? 0;\n const newValue = clampValue(currentValue - step);\n onChange?.(newValue);\n };\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const inputValue = e.target.value;\n\n if (inputValue === '' || inputValue === '-') {\n onChange?.(undefined);\n return;\n }\n\n const numValue = parseFloat(inputValue);\n if (!isNaN(numValue)) {\n const clamped = clampValue(numValue);\n onChange?.(clamped);\n }\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'ArrowUp') {\n e.preventDefault();\n handleIncrement();\n } else if (e.key === 'ArrowDown') {\n e.preventDefault();\n handleDecrement();\n }\n };\n\n const baseStyles = 'w-full appearance-none rounded-md border border-[hsl(var(--input))] bg-transparent text-[hsl(var(--foreground))] transition-colors duration-150 focus:outline-none focus:ring-1 focus:ring-[hsl(var(--ring))]/50 focus:border-[hsl(var(--ring))] hover:border-[hsl(var(--muted-foreground))] placeholder:text-[hsl(var(--muted-foreground))]';\n const sizeStyle = sizeClasses[size];\n const errorStyles = error ? 'border-[hsl(var(--destructive))] focus:ring-[hsl(var(--destructive))]/50' : '';\n const disabledStyles = disabled ? 'opacity-50 cursor-not-allowed bg-[hsl(var(--muted))]' : '';\n const widthStyle = fullWidth ? 'w-full' : '';\n const paddingWithControls = !hideControls ? 'pr-8' : '';\n\n const displayValue = value !== undefined ? value.toString() : '';\n\n return (\n <div className={`${widthStyle} ${className}`}>\n {label && (\n <label className=\"block text-sm font-medium text-[hsl(var(--foreground))] mb-1.5\">\n {label}\n </label>\n )}\n <div className=\"relative\">\n <input\n ref={inputRef}\n type=\"number\"\n value={displayValue}\n onChange={handleInputChange}\n onKeyDown={handleKeyDown}\n onFocus={() => setIsFocused(true)}\n onBlur={() => setIsFocused(false)}\n disabled={disabled}\n placeholder={placeholder}\n min={min}\n max={max}\n step={step}\n className={`${baseStyles} ${sizeStyle} ${errorStyles} ${disabledStyles} ${paddingWithControls} [appearance:textfield] [&::-webkit-outer-spin-button]:appearance-none [&::-webkit-inner-spin-button]:appearance-none`.trim()}\n />\n {!hideControls && (\n <div className=\"absolute right-1 top-1/2 -translate-y-1/2 flex flex-col\">\n <button\n type=\"button\"\n onClick={handleIncrement}\n disabled={disabled || (max !== undefined && value !== undefined && value >= max)}\n className=\"px-2 py-0.5 hover:bg-[hsl(var(--accent))] rounded transition-colors disabled:opacity-30 disabled:cursor-not-allowed\"\n tabIndex={-1}\n >\n <svg className=\"w-3 h-3 text-[hsl(var(--muted-foreground))]\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={3} d=\"M5 15l7-7 7 7\" />\n </svg>\n </button>\n <button\n type=\"button\"\n onClick={handleDecrement}\n disabled={disabled || (min !== undefined && value !== undefined && value <= min)}\n className=\"px-2 py-0.5 hover:bg-[hsl(var(--accent))] rounded transition-colors disabled:opacity-30 disabled:cursor-not-allowed\"\n tabIndex={-1}\n >\n <svg className=\"w-3 h-3 text-[hsl(var(--muted-foreground))]\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={3} d=\"M19 9l-7 7-7-7\" />\n </svg>\n </button>\n </div>\n )}\n </div>\n {error && (\n <p className=\"mt-1.5 text-sm text-[hsl(var(--destructive))]\">{error}</p>\n )}\n {helperText && !error && (\n <p className=\"mt-1.5 text-sm text-[hsl(var(--muted-foreground))]\">{helperText}</p>\n )}\n </div>\n );\n};\n\nNumberInput.displayName = 'NumberInput';\n","\"use client\";\n\nimport React, { useState, useRef, useEffect } from 'react';\nimport { createPortal } from 'react-dom';\nimport { useTheme } from '../theme/ThemeProvider';\n\nexport type ActionMenuItem = {\n type?: 'item';\n label: string;\n onClick: () => void;\n icon?: React.ReactNode;\n disabled?: boolean;\n variant?: 'default' | 'danger';\n} | {\n type: 'divider';\n};\n\nexport interface ActionMenuProps {\n items: ActionMenuItem[];\n trigger?: React.ReactNode;\n position?: 'left' | 'right';\n placement?: 'top' | 'bottom' | 'left' | 'right';\n}\n\nexport const ActionMenu: React.FC<ActionMenuProps> = ({\n items,\n trigger,\n position = 'right',\n placement = 'bottom',\n}) => {\n const { themeName } = useTheme();\n const [isOpen, setIsOpen] = useState(false);\n const [menuPosition, setMenuPosition] = useState<{ top: number; left: number } | null>(null);\n const [mounted, setMounted] = useState(false);\n const menuRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n setMounted(true);\n }, []);\n\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (menuRef.current && !menuRef.current.contains(event.target as Node) &&\n triggerRef.current && !triggerRef.current.contains(event.target as Node)) {\n setIsOpen(false);\n }\n };\n\n if (isOpen) {\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }\n }, [isOpen]);\n\n useEffect(() => {\n if (isOpen && triggerRef.current) {\n const rect = triggerRef.current.getBoundingClientRect();\n const menuWidth = 224; // 14rem\n const menuHeight = 300; // Approximate max height\n const spacing = 8;\n\n let top = 0;\n let left = 0;\n\n switch (placement) {\n case 'top':\n top = rect.top - menuHeight - spacing;\n left = position === 'left' ? rect.left : rect.right - menuWidth;\n break;\n case 'bottom':\n top = rect.bottom + spacing;\n left = position === 'left' ? rect.left : rect.right - menuWidth;\n break;\n case 'left':\n top = rect.top;\n left = rect.left - menuWidth - spacing;\n break;\n case 'right':\n top = rect.top;\n left = rect.right + spacing;\n break;\n }\n\n setMenuPosition({ top, left });\n } else {\n setMenuPosition(null);\n }\n }, [isOpen, position, placement]);\n\n const handleItemClick = (item: ActionMenuItem) => {\n if (item.type === 'divider') return;\n if (!item.disabled) {\n item.onClick();\n setIsOpen(false);\n }\n };\n\n const defaultTrigger = (\n <button\n className=\"p-2 rounded-md hover:bg-[hsl(var(--accent))] transition-colors\"\n aria-label=\"Open menu\"\n >\n <svg className=\"w-5 h-5 text-[hsl(var(--muted-foreground))]\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 5v.01M12 12v.01M12 19v.01M12 6a1 1 0 110-2 1 1 0 010 2zm0 7a1 1 0 110-2 1 1 0 010 2zm0 7a1 1 0 110-2 1 1 0 010 2z\" />\n </svg>\n </button>\n );\n\n const menuBaseStyles = themeName === 'minimalistic'\n ? 'bg-black border-2 border-white'\n : 'bg-[hsl(var(--popover))] border border-[hsl(var(--border))] shadow-lg';\n\n const itemBaseStyles = themeName === 'minimalistic'\n ? 'text-white hover:bg-white hover:text-black transition-colors duration-200'\n : 'text-[hsl(var(--popover-foreground))] hover:bg-[hsl(var(--accent))] transition-colors';\n\n const menu = isOpen && mounted && menuPosition ? (\n <div\n ref={menuRef}\n className={`fixed w-56 rounded-md ${menuBaseStyles} z-[9999] max-h-[80vh] overflow-auto`}\n style={{\n minWidth: '14rem',\n top: `${menuPosition.top}px`,\n left: `${menuPosition.left}px`,\n }}\n >\n {items.map((item, index) => {\n if (item.type === 'divider') {\n return (\n <div\n key={index}\n className=\"my-1 border-t border-[hsl(var(--border))]\"\n />\n );\n }\n\n return (\n <button\n key={index}\n onClick={() => handleItemClick(item)}\n disabled={item.disabled}\n className={`w-full text-left px-4 py-2.5 flex items-center gap-3 ${itemBaseStyles} ${\n item.disabled ? 'opacity-50 cursor-not-allowed' : 'cursor-pointer'\n } ${\n item.variant === 'danger' ? 'text-[hsl(var(--destructive))] hover:bg-[hsl(var(--destructive))]/10' : ''\n }`}\n >\n {item.icon && <span className=\"flex-shrink-0\">{item.icon}</span>}\n <span className=\"flex-1\">{item.label}</span>\n </button>\n );\n })}\n </div>\n ) : null;\n\n return (\n <>\n <div className=\"relative inline-block\" ref={triggerRef}>\n <div onClick={() => setIsOpen(!isOpen)}>\n {trigger || defaultTrigger}\n </div>\n </div>\n {mounted && createPortal(menu, document.body)}\n </>\n );\n};\n","\"use client\";\n\nimport React from 'react';\n\nexport interface CardProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n className?: string;\n padding?: 'none' | 'sm' | 'md' | 'lg';\n hover?: boolean;\n}\n\nconst paddingClasses = {\n none: '',\n sm: 'p-4',\n md: 'p-6',\n lg: 'p-8',\n};\n\nexport const Card: React.FC<CardProps> = ({\n children,\n className = '',\n padding = 'md',\n hover = false,\n ...props\n}) => {\n\n const paddingClass = paddingClasses[padding];\n const hoverClass = hover\n ? 'hover:shadow-lg hover:border-[hsl(var(--ring))]/50 cursor-pointer transition-all duration-200 ease-in-out'\n : '';\n\n return (\n <div\n className={`bg-[hsl(var(--card))] text-[hsl(var(--card-foreground))] rounded-lg border border-[hsl(var(--border))] shadow-sm ${paddingClass} ${hoverClass} ${className}`}\n {...props}\n >\n {children}\n </div>\n );\n};\n","\"use client\";\n\nimport React from 'react';\n\nexport interface AlertProps {\n variant?: 'info' | 'success' | 'warning' | 'error';\n title?: string;\n children: React.ReactNode;\n onClose?: () => void;\n className?: string;\n}\n\nconst variantStyles = {\n info: 'bg-[hsl(var(--info))]/10 border-[hsl(var(--info))]/20 text-[hsl(var(--info))]',\n success: 'bg-[hsl(var(--success))]/10 border-[hsl(var(--success))]/20 text-[hsl(var(--success))]',\n warning: 'bg-[hsl(var(--warning))]/10 border-[hsl(var(--warning))]/20 text-[hsl(var(--warning))]',\n error: 'bg-[hsl(var(--destructive))]/10 border-[hsl(var(--destructive))]/20 text-[hsl(var(--destructive))]',\n};\n\nconst iconStyles = {\n info: 'text-[hsl(var(--info))]',\n success: 'text-[hsl(var(--success))]',\n warning: 'text-[hsl(var(--warning))]',\n error: 'text-[hsl(var(--destructive))]',\n};\n\nexport const Alert: React.FC<AlertProps> = ({\n variant = 'info',\n title,\n children,\n onClose,\n className = '',\n}) => {\n\n const variantClass = variantStyles[variant];\n const iconClass = iconStyles[variant];\n\n return (\n <div className={`rounded-[--radius] border p-4 ${variantClass} ${className}`} role=\"alert\">\n <div className=\"flex items-start gap-3\">\n <div className={`flex-shrink-0 ${iconClass}`}>\n {variant === 'info' && (\n <svg className=\"w-5 h-5\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fillRule=\"evenodd\" d=\"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a1 1 0 000 2v3a1 1 0 001 1h1a1 1 0 100-2v-3a1 1 0 00-1-1H9z\" clipRule=\"evenodd\" />\n </svg>\n )}\n {variant === 'success' && (\n <svg className=\"w-5 h-5\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fillRule=\"evenodd\" d=\"M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z\" clipRule=\"evenodd\" />\n </svg>\n )}\n {variant === 'warning' && (\n <svg className=\"w-5 h-5\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fillRule=\"evenodd\" d=\"M8.257 3.099c.765-1.36 2.722-1.36 3.486 0l5.58 9.92c.75 1.334-.213 2.98-1.742 2.98H4.42c-1.53 0-2.493-1.646-1.743-2.98l5.58-9.92zM11 13a1 1 0 11-2 0 1 1 0 012 0zm-1-8a1 1 0 00-1 1v3a1 1 0 002 0V6a1 1 0 00-1-1z\" clipRule=\"evenodd\" />\n </svg>\n )}\n {variant === 'error' && (\n <svg className=\"w-5 h-5\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fillRule=\"evenodd\" d=\"M10 18a8 8 0 100-16 8 8 0 000 16zM8.707 7.293a1 1 0 00-1.414 1.414L8.586 10l-1.293 1.293a1 1 0 101.414 1.414L10 11.414l1.293 1.293a1 1 0 001.414-1.414L11.414 10l1.293-1.293a1 1 0 00-1.414-1.414L10 8.586 8.707 7.293z\" clipRule=\"evenodd\" />\n </svg>\n )}\n </div>\n <div className=\"flex-1\">\n {title && <h3 className=\"font-semibold mb-1\">{title}</h3>}\n <div className=\"text-sm\">{children}</div>\n </div>\n {onClose && (\n <button\n onClick={onClose}\n className={`flex-shrink-0 ${iconClass} hover:opacity-70 transition-opacity`}\n aria-label=\"Close alert\"\n >\n <svg className=\"w-5 h-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n )}\n </div>\n </div>\n );\n};\n","\"use client\";\n\nimport React, { forwardRef } from 'react';\n\nexport interface CheckboxProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'type'> {\n label?: string;\n error?: string;\n}\n\nexport const Checkbox = forwardRef<HTMLInputElement, CheckboxProps>(\n ({ label, error, className = '', disabled, checked, ...props }, ref) => {\n\n return (\n <div className={className}>\n <label className=\"flex items-center gap-2 cursor-pointer group\">\n <div className=\"relative inline-flex items-center\">\n <input\n ref={ref}\n type=\"checkbox\"\n disabled={disabled}\n checked={checked}\n className=\"sr-only peer\"\n {...props}\n />\n <div className={`w-4 h-4 border-2 rounded-sm transition-all duration-200 flex items-center justify-center\n ${error\n ? 'border-[hsl(var(--destructive))]'\n : 'border-[hsl(var(--input))]'\n }\n ${disabled\n ? 'opacity-50 cursor-not-allowed bg-[hsl(var(--muted))]'\n : 'peer-hover:border-[hsl(var(--ring))]'\n }\n peer-checked:bg-[hsl(var(--primary))] peer-checked:border-[hsl(var(--primary))]\n peer-focus:ring-1 peer-focus:ring-[hsl(var(--ring))]/50\n `}>\n {/* Checkmark SVG */}\n <svg\n className={`w-3 h-3 text-white transition-opacity duration-200 ${\n checked ? 'opacity-100' : 'opacity-0'\n }`}\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M10 3L4.5 8.5L2 6\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </div>\n </div>\n {label && (\n <span className={`text-sm text-[hsl(var(--foreground))] ${disabled ? 'opacity-50 cursor-not-allowed' : ''}`}>\n {label}\n </span>\n )}\n </label>\n {error && <p className=\"mt-1 text-sm text-[hsl(var(--destructive))]\">{error}</p>}\n </div>\n );\n }\n);\n\nCheckbox.displayName = 'Checkbox';\n","\"use client\";\n\nimport React, { forwardRef } from 'react';\n\nexport interface ToggleProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'type' | 'size'> {\n label?: string;\n size?: 'sm' | 'md' | 'lg';\n}\n\nexport const Toggle = forwardRef<HTMLInputElement, ToggleProps>(\n ({ label, size = 'md', className = '', disabled, checked, ...props }, ref) => {\n\n // Use complete class strings for Tailwind\n const toggleClasses = {\n sm: {\n switch: 'w-9 h-5',\n thumb: 'w-4 h-4 peer-checked:translate-x-4',\n },\n md: {\n switch: 'w-11 h-6',\n thumb: 'w-5 h-5 peer-checked:translate-x-5',\n },\n lg: {\n switch: 'w-14 h-7',\n thumb: 'w-6 h-6 peer-checked:translate-x-7',\n },\n };\n\n const currentSize = toggleClasses[size];\n\n return (\n <label className={`inline-flex items-center gap-3 cursor-pointer ${disabled ? 'opacity-50 cursor-not-allowed' : ''} ${className}`}>\n <div className=\"relative\">\n <input\n ref={ref}\n type=\"checkbox\"\n className=\"sr-only peer\"\n disabled={disabled}\n checked={checked}\n {...props}\n />\n <div\n className={`${currentSize.switch} bg-[hsl(var(--input))] peer-focus:ring-1 peer-focus:ring-[hsl(var(--ring))]/50 rounded-full peer peer-checked:bg-[hsl(var(--primary))] transition-colors`}\n ></div>\n <div\n className={`${currentSize.thumb} bg-white rounded-full shadow-md absolute top-0.5 left-0.5 transition-transform`}\n ></div>\n </div>\n {label && (\n <span className=\"text-sm font-medium text-[hsl(var(--foreground))]\">\n {label}\n </span>\n )}\n </label>\n );\n }\n);\n\nToggle.displayName = 'Toggle';\n","\"use client\";\n\nimport React from 'react';\n\nexport interface BadgeProps {\n children: React.ReactNode;\n variant?: 'default' | 'primary' | 'success' | 'warning' | 'error' | 'info';\n size?: 'sm' | 'md' | 'lg';\n className?: string;\n}\n\nconst variantStyles = {\n default: 'bg-[hsl(var(--secondary))] text-[hsl(var(--secondary-foreground))]',\n primary: 'bg-[hsl(var(--primary))]/10 text-[hsl(var(--primary))]',\n success: 'bg-[hsl(var(--success))]/10 text-[hsl(var(--success))]',\n warning: 'bg-[hsl(var(--warning))]/10 text-[hsl(var(--warning))]',\n error: 'bg-[hsl(var(--destructive))]/10 text-[hsl(var(--destructive))]',\n info: 'bg-[hsl(var(--info))]/10 text-[hsl(var(--info))]',\n};\n\nconst sizeStyles = {\n sm: 'px-2 py-0.5 text-xs',\n md: 'px-2.5 py-1 text-sm',\n lg: 'px-3 py-1.5 text-base',\n};\n\nexport const Badge: React.FC<BadgeProps> = ({\n children,\n variant = 'default',\n size = 'md',\n className = '',\n}) => {\n\n const variantClass = variantStyles[variant];\n const sizeClass = sizeStyles[size];\n\n return (\n <span className={`inline-flex items-center font-medium rounded-full ${variantClass} ${sizeClass} ${className}`}>\n {children}\n </span>\n );\n};\n","\"use client\";\n\nimport React from 'react';\n\nexport interface SpinnerProps {\n size?: 'sm' | 'md' | 'lg' | 'xl';\n color?: 'primary' | 'secondary' | 'white';\n className?: string;\n}\n\nconst sizeClasses = {\n sm: 'w-4 h-4 border-2',\n md: 'w-8 h-8 border-2',\n lg: 'w-12 h-12 border-3',\n xl: 'w-16 h-16 border-4',\n};\n\nconst colorClasses = {\n primary: 'border-[hsl(var(--primary))] border-t-transparent',\n secondary: 'border-[hsl(var(--muted-foreground))] border-t-transparent',\n white: 'border-white border-t-transparent',\n};\n\nexport const Spinner: React.FC<SpinnerProps> = ({\n size = 'md',\n color = 'primary',\n className = '',\n}) => {\n\n const sizeClass = sizeClasses[size];\n const colorClass = colorClasses[color];\n\n return (\n <div\n className={`inline-block rounded-full animate-spin ${sizeClass} ${colorClass} ${className}`}\n role=\"status\"\n aria-label=\"Loading\"\n >\n <span className=\"sr-only\">Loading...</span>\n </div>\n );\n};\n","\"use client\";\n\nimport React, { useState } from 'react';\n\nexport interface Tab {\n label: string;\n content: React.ReactNode;\n disabled?: boolean;\n}\n\nexport interface TabsProps {\n tabs: Tab[];\n defaultIndex?: number;\n onChange?: (index: number) => void;\n className?: string;\n}\n\nexport const Tabs: React.FC<TabsProps> = ({\n tabs,\n defaultIndex = 0,\n onChange,\n className = '',\n}) => {\n const [activeIndex, setActiveIndex] = useState(defaultIndex);\n\n const handleTabClick = (index: number) => {\n if (tabs[index].disabled) return;\n setActiveIndex(index);\n onChange?.(index);\n };\n\n return (\n <div className={className}>\n {/* Tab Headers */}\n <div className=\"border-b border-[hsl(var(--border))] px-4\">\n <nav className=\"flex gap-4 -mb-px\" aria-label=\"Tabs\">\n {tabs.map((tab, index) => (\n <button\n key={index}\n onClick={() => handleTabClick(index)}\n disabled={tab.disabled}\n className={`py-3 border-b-2 font-medium text-sm transition-colors ${\n activeIndex === index\n ? 'border-[hsl(var(--primary))] text-[hsl(var(--foreground))]'\n : 'border-transparent text-[hsl(var(--muted-foreground))] hover:text-[hsl(var(--foreground))] hover:border-[hsl(var(--border))]'\n } ${tab.disabled ? 'opacity-50 cursor-not-allowed' : 'cursor-pointer'}`}\n aria-current={activeIndex === index ? 'page' : undefined}\n >\n {tab.label}\n </button>\n ))}\n </nav>\n </div>\n\n {/* Tab Content */}\n <div>\n {tabs[activeIndex]?.content}\n </div>\n </div>\n );\n};\n","\"use client\";\n\nimport React from 'react';\n\nexport interface Column<T = any> {\n key: string;\n title: string;\n render?: (value: any, row: T, index: number) => React.ReactNode;\n width?: string;\n}\n\nexport interface TableProps<T = any> {\n columns: Column<T>[];\n data: T[];\n keyField?: string;\n striped?: boolean;\n hoverable?: boolean;\n className?: string;\n responsive?: boolean; // Enable mobile card layout (default: true)\n}\n\nexport function Table<T extends Record<string, any>>({\n columns,\n data,\n keyField = 'id',\n striped = false,\n hoverable = true,\n className = '',\n responsive = true,\n}: TableProps<T>) {\n\n return (\n <div className={className}>\n {/* Desktop Table View */}\n <div className={`${responsive ? 'hidden md:block' : ''} overflow-x-auto`}>\n <table className=\"w-full text-left\">\n <thead className=\"bg-[hsl(var(--muted))] border-b border-[hsl(var(--border))]\">\n <tr>\n {columns.map((column, colIndex) => {\n const isLast = colIndex === columns.length - 1;\n return (\n <th\n key={column.key}\n className={\n isLast\n ? 'px-6 py-3 text-xs font-medium text-[hsl(var(--muted-foreground))] uppercase tracking-wider relative'\n : 'px-6 py-3 text-xs font-medium text-[hsl(var(--muted-foreground))] uppercase tracking-wider'\n }\n style={{ width: column.width }}\n >\n {column.title}\n </th>\n );\n })}\n </tr>\n </thead>\n <tbody className=\"bg-[hsl(var(--card))] divide-y divide-[hsl(var(--border))]\">\n {data.map((row, rowIndex) => {\n const rowClasses = [\n striped && rowIndex % 2 === 1 ? 'bg-[hsl(var(--muted))]/50' : '',\n hoverable ? 'hover:bg-[hsl(var(--muted))] transition-colors' : ''\n ].filter(Boolean).join(' ');\n\n return (\n <tr\n key={row[keyField] || rowIndex}\n className={rowClasses}\n >\n {columns.map((column, colIndex) => {\n const isLast = colIndex === columns.length - 1;\n return (\n <td\n key={column.key}\n className={\n isLast\n ? 'px-6 py-4 text-sm text-[hsl(var(--foreground))] overflow-visible'\n : 'px-6 py-4 text-sm text-[hsl(var(--foreground))]'\n }\n >\n {column.render\n ? column.render(row[column.key], row, rowIndex)\n : row[column.key]}\n </td>\n );\n })}\n </tr>\n );\n })}\n </tbody>\n </table>\n {data.length === 0 && (\n <div className=\"text-center py-8 text-[hsl(var(--muted-foreground))]\">\n No data available\n </div>\n )}\n </div>\n\n {/* Mobile Card View */}\n {responsive && (\n <div className=\"md:hidden space-y-3\">\n {data.map((row, rowIndex) => {\n const cardClasses = [\n 'bg-[hsl(var(--card))] border border-[hsl(var(--border))] rounded-[--radius] p-4 shadow-sm',\n hoverable ? 'hover:shadow-md transition-shadow' : '',\n 'relative isolate' // Ensure cards are isolated layers\n ].filter(Boolean).join(' ');\n\n return (\n <div\n key={row[keyField] || rowIndex}\n className={cardClasses}\n >\n {columns.map((column) => (\n <div\n key={column.key}\n className=\"flex justify-between items-start py-2 border-b border-[hsl(var(--border))]/50 last:border-b-0\"\n >\n <span className=\"text-xs font-medium text-[hsl(var(--muted-foreground))] uppercase tracking-wider flex-shrink-0 mr-4\">\n {column.title}\n </span>\n <span className=\"text-sm text-[hsl(var(--foreground))] text-right\">\n {column.render\n ? column.render(row[column.key], row, rowIndex)\n : row[column.key]}\n </span>\n </div>\n ))}\n </div>\n );\n })}\n {data.length === 0 && (\n <div className=\"text-center py-8 text-[hsl(var(--muted-foreground))]\">\n No data available\n </div>\n )}\n </div>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport React from 'react';\n\nexport interface PaginationProps {\n currentPage: number;\n totalPages: number;\n onPageChange: (page: number) => void;\n siblingCount?: number;\n className?: string;\n}\n\nexport const Pagination: React.FC<PaginationProps> = ({\n currentPage,\n totalPages,\n onPageChange,\n siblingCount = 1,\n className = '',\n}) => {\n\n const range = (start: number, end: number) => {\n const length = end - start + 1;\n return Array.from({ length }, (_, idx) => idx + start);\n };\n\n const paginationRange = () => {\n const totalPageNumbers = siblingCount + 5;\n\n if (totalPageNumbers >= totalPages) {\n return range(1, totalPages);\n }\n\n const leftSiblingIndex = Math.max(currentPage - siblingCount, 1);\n const rightSiblingIndex = Math.min(currentPage + siblingCount, totalPages);\n\n const shouldShowLeftDots = leftSiblingIndex > 2;\n const shouldShowRightDots = rightSiblingIndex < totalPages - 2;\n\n const firstPageIndex = 1;\n const lastPageIndex = totalPages;\n\n if (!shouldShowLeftDots && shouldShowRightDots) {\n const leftItemCount = 3 + 2 * siblingCount;\n const leftRange = range(1, leftItemCount);\n return [...leftRange, '...', totalPages];\n }\n\n if (shouldShowLeftDots && !shouldShowRightDots) {\n const rightItemCount = 3 + 2 * siblingCount;\n const rightRange = range(totalPages - rightItemCount + 1, totalPages);\n return [firstPageIndex, '...', ...rightRange];\n }\n\n if (shouldShowLeftDots && shouldShowRightDots) {\n const middleRange = range(leftSiblingIndex, rightSiblingIndex);\n return [firstPageIndex, '...', ...middleRange, '...', lastPageIndex];\n }\n\n return range(1, totalPages);\n };\n\n const pages = paginationRange();\n\n return (\n <nav className={`flex items-center gap-1 ${className}`} aria-label=\"Pagination\">\n {/* Previous Button */}\n <button\n onClick={() => onPageChange(currentPage - 1)}\n disabled={currentPage === 1}\n className=\"px-3 py-2 rounded-md text-sm font-medium text-[hsl(var(--foreground))] hover:bg-[hsl(var(--accent))] disabled:opacity-50 disabled:pointer-events-none transition-colors\"\n aria-label=\"Previous page\"\n >\n Previous\n </button>\n\n {/* Page Numbers */}\n {pages.map((page, index) => {\n if (page === '...') {\n return (\n <span\n key={`dots-${index}`}\n className=\"px-3 py-2 text-[hsl(var(--muted-foreground))]\"\n >\n ...\n </span>\n );\n }\n\n return (\n <button\n key={page}\n onClick={() => onPageChange(page as number)}\n className={`px-3 py-2 rounded-md text-sm font-medium transition-colors ${\n currentPage === page\n ? 'bg-[hsl(var(--primary))] text-[hsl(var(--primary-foreground))]'\n : 'text-[hsl(var(--foreground))] hover:bg-[hsl(var(--accent))]'\n }`}\n aria-label={`Page ${page}`}\n aria-current={currentPage === page ? 'page' : undefined}\n >\n {page}\n </button>\n );\n })}\n\n {/* Next Button */}\n <button\n onClick={() => onPageChange(currentPage + 1)}\n disabled={currentPage === totalPages}\n className=\"px-3 py-2 rounded-md text-sm font-medium text-[hsl(var(--foreground))] hover:bg-[hsl(var(--accent))] disabled:opacity-50 disabled:pointer-events-none transition-colors\"\n aria-label=\"Next page\"\n >\n Next\n </button>\n </nav>\n );\n};\n","\"use client\";\n\nimport React, { useState, useRef, useEffect } from 'react';\nimport { createPortal } from 'react-dom';\n\nexport interface DatePickerProps {\n label?: string;\n error?: string;\n helperText?: string;\n value?: Date;\n onChange?: (date: Date) => void;\n minDate?: Date;\n maxDate?: Date;\n disabled?: boolean;\n className?: string;\n placeholder?: string;\n}\n\nconst DAYS = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];\nconst MONTHS = [\n 'January', 'February', 'March', 'April', 'May', 'June',\n 'July', 'August', 'September', 'October', 'November', 'December'\n];\n\nexport const DatePicker: React.FC<DatePickerProps> = ({\n label,\n error,\n helperText,\n value,\n onChange,\n minDate,\n maxDate,\n disabled,\n className = '',\n placeholder = 'Select date...',\n}) => {\n const [isOpen, setIsOpen] = useState(false);\n const [viewDate, setViewDate] = useState(value || new Date());\n const [mounted, setMounted] = useState(false);\n const [calendarPosition, setCalendarPosition] = useState<{ top: number; left: number } | null>(null);\n const inputRef = useRef<HTMLDivElement>(null);\n const calendarRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n setMounted(true);\n }, []);\n\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (calendarRef.current && !calendarRef.current.contains(event.target as Node) &&\n inputRef.current && !inputRef.current.contains(event.target as Node)) {\n setIsOpen(false);\n }\n };\n\n if (isOpen) {\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }\n }, [isOpen]);\n\n useEffect(() => {\n if (isOpen && inputRef.current) {\n const rect = inputRef.current.getBoundingClientRect();\n setCalendarPosition({\n top: rect.bottom + 8,\n left: rect.left,\n });\n } else {\n setCalendarPosition(null);\n }\n }, [isOpen]);\n\n const year = viewDate.getFullYear();\n const month = viewDate.getMonth();\n\n const firstDayOfMonth = new Date(year, month, 1).getDay();\n const daysInMonth = new Date(year, month + 1, 0).getDate();\n const daysInPrevMonth = new Date(year, month, 0).getDate();\n\n const calendarDays: Date[] = [];\n\n for (let i = firstDayOfMonth - 1; i >= 0; i--) {\n calendarDays.push(new Date(year, month - 1, daysInPrevMonth - i));\n }\n\n for (let i = 1; i <= daysInMonth; i++) {\n calendarDays.push(new Date(year, month, i));\n }\n\n const remainingDays = 42 - calendarDays.length;\n for (let i = 1; i <= remainingDays; i++) {\n calendarDays.push(new Date(year, month + 1, i));\n }\n\n const isSameDay = (date1: Date, date2: Date) => {\n return date1.getDate() === date2.getDate() &&\n date1.getMonth() === date2.getMonth() &&\n date1.getFullYear() === date2.getFullYear();\n };\n\n const isToday = (date: Date) => {\n return isSameDay(date, new Date());\n };\n\n const isSelected = (date: Date) => {\n return value && isSameDay(date, value);\n };\n\n const isCurrentMonth = (date: Date) => {\n return date.getMonth() === month;\n };\n\n const isDisabled = (date: Date) => {\n if (minDate && date < minDate) return true;\n if (maxDate && date > maxDate) return true;\n return false;\n };\n\n const handleDateClick = (date: Date) => {\n if (isDisabled(date)) return;\n onChange?.(date);\n setIsOpen(false);\n };\n\n const handlePrevMonth = () => {\n setViewDate(new Date(year, month - 1, 1));\n };\n\n const handleNextMonth = () => {\n setViewDate(new Date(year, month + 1, 1));\n };\n\n const handleToday = () => {\n const today = new Date();\n setViewDate(today);\n onChange?.(today);\n setIsOpen(false);\n };\n\n const formatDate = (date?: Date) => {\n if (!date) return '';\n return date.toLocaleDateString('en-US', {\n month: 'short',\n day: 'numeric',\n year: 'numeric'\n });\n };\n\n const baseStyles = 'w-full appearance-none rounded-md border border-[hsl(var(--input))] bg-transparent text-[hsl(var(--foreground))] px-4 py-2.5 text-sm transition-colors duration-150 focus:outline-none focus:ring-1 focus:ring-[hsl(var(--ring))]/50 focus:border-[hsl(var(--ring))] hover:border-[hsl(var(--muted-foreground))] cursor-pointer';\n const errorStyles = error ? 'border-[hsl(var(--destructive))] focus:ring-[hsl(var(--destructive))]/50' : '';\n const disabledStyles = disabled ? 'opacity-50 cursor-not-allowed bg-[hsl(var(--muted))]' : '';\n\n const calendar = isOpen && mounted && calendarPosition ? (\n <div\n ref={calendarRef}\n className=\"fixed z-[9999] bg-[hsl(var(--popover))] rounded-md border border-[hsl(var(--border))] shadow-lg p-4\"\n style={{\n top: `${calendarPosition.top}px`,\n left: `${calendarPosition.left}px`,\n minWidth: '320px',\n }}\n >\n {/* Header */}\n <div className=\"flex items-center justify-between mb-4\">\n <button\n onClick={handlePrevMonth}\n className=\"p-2 hover:bg-[hsl(var(--accent))] rounded-md transition-colors\"\n aria-label=\"Previous month\"\n >\n <svg className=\"w-5 h-5 text-[hsl(var(--muted-foreground))]\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 19l-7-7 7-7\" />\n </svg>\n </button>\n\n <div className=\"flex items-center gap-2\">\n <h2 className=\"text-base font-semibold text-[hsl(var(--foreground))]\">\n {MONTHS[month]} {year}\n </h2>\n <button\n onClick={handleToday}\n className=\"px-2 py-1 text-xs bg-[hsl(var(--primary))] text-[hsl(var(--primary-foreground))] rounded-md hover:bg-[hsl(var(--primary))]/90 transition-colors\"\n >\n Today\n </button>\n </div>\n\n <button\n onClick={handleNextMonth}\n className=\"p-2 hover:bg-[hsl(var(--accent))] rounded-md transition-colors\"\n aria-label=\"Next month\"\n >\n <svg className=\"w-5 h-5 text-[hsl(var(--muted-foreground))]\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 5l7 7-7 7\" />\n </svg>\n </button>\n </div>\n\n {/* Day headers */}\n <div className=\"grid grid-cols-7 gap-1 mb-2\">\n {DAYS.map(day => (\n <div key={day} className=\"text-center text-xs font-semibold text-[hsl(var(--muted-foreground))] py-1\">\n {day}\n </div>\n ))}\n </div>\n\n {/* Calendar grid */}\n <div className=\"grid grid-cols-7 gap-1\">\n {calendarDays.map((date, index) => {\n const isCurrentMonthDay = isCurrentMonth(date);\n const isTodayDay = isToday(date);\n const isSelectedDay = isSelected(date);\n const isDisabledDay = isDisabled(date);\n\n return (\n <button\n key={index}\n onClick={() => handleDateClick(date)}\n disabled={isDisabledDay}\n className={`\n aspect-square p-1 rounded-md text-sm font-medium transition-all\n ${!isCurrentMonthDay ? 'text-[hsl(var(--muted-foreground))]/50' : 'text-[hsl(var(--foreground))]'}\n ${isTodayDay && !isSelectedDay ? 'bg-[hsl(var(--accent))] text-[hsl(var(--primary))] font-bold' : ''}\n ${isSelectedDay ? 'bg-[hsl(var(--primary))] text-[hsl(var(--primary-foreground))] hover:bg-[hsl(var(--primary))]/90' : ''}\n ${!isSelectedDay && !isDisabledDay ? 'hover:bg-[hsl(var(--accent))]' : ''}\n ${isDisabledDay ? 'opacity-30 cursor-not-allowed' : 'cursor-pointer'}\n `}\n >\n {date.getDate()}\n </button>\n );\n })}\n </div>\n </div>\n ) : null;\n\n return (\n <div className={className}>\n {label && (\n <label className=\"block text-sm font-medium text-[hsl(var(--foreground))] mb-1.5\">\n {label}\n </label>\n )}\n <div\n ref={inputRef}\n onClick={() => !disabled && setIsOpen(!isOpen)}\n className={`${baseStyles} ${errorStyles} ${disabledStyles} flex items-center justify-between`.trim()}\n >\n <span className={!value ? 'text-[hsl(var(--muted-foreground))]' : ''}>\n {value ? formatDate(value) : placeholder}\n </span>\n <svg className=\"w-5 h-5 text-[hsl(var(--muted-foreground))]\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z\" />\n </svg>\n </div>\n {error && <p className=\"mt-1.5 text-sm text-[hsl(var(--destructive))]\">{error}</p>}\n {helperText && !error && <p className=\"mt-1.5 text-sm text-[hsl(var(--muted-foreground))]\">{helperText}</p>}\n {mounted && createPortal(calendar, document.body)}\n </div>\n );\n};\n\nDatePicker.displayName = 'DatePicker';\n","\"use client\";\n\nimport React, { forwardRef } from 'react';\n\nexport interface TimePickerProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'type'> {\n label?: string;\n error?: string;\n helperText?: string;\n}\n\nexport const TimePicker = forwardRef<HTMLInputElement, TimePickerProps>(\n ({ label, error, helperText, className = '', disabled, ...props }, ref) => {\n\n const baseStyles = 'w-full appearance-none rounded-md border border-[hsl(var(--input))] bg-transparent text-[hsl(var(--foreground))] px-3 py-2.5 text-sm transition-colors duration-150 focus:outline-none focus:ring-1 focus:ring-[hsl(var(--ring))]/50 focus:border-[hsl(var(--ring))] hover:border-[hsl(var(--muted-foreground))]';\n const errorStyles = error ? 'border-[hsl(var(--destructive))] focus:ring-[hsl(var(--destructive))]/50' : '';\n const disabledStyles = disabled ? 'opacity-50 cursor-not-allowed bg-[hsl(var(--muted))]' : '';\n\n return (\n <div className={className}>\n {label && (\n <label className=\"block text-sm font-medium text-[hsl(var(--foreground))] mb-1.5\">\n {label}\n </label>\n )}\n <input\n ref={ref}\n type=\"time\"\n disabled={disabled}\n className={`${baseStyles} ${errorStyles} ${disabledStyles}`.trim()}\n {...props}\n />\n {error && <p className=\"mt-1.5 text-sm text-[hsl(var(--destructive))]\">{error}</p>}\n {helperText && !error && <p className=\"mt-1.5 text-sm text-[hsl(var(--muted-foreground))]\">{helperText}</p>}\n </div>\n );\n }\n);\n\nTimePicker.displayName = 'TimePicker';\n","\"use client\";\n\nimport React, { useState, useRef, useEffect } from 'react';\nimport { createPortal } from 'react-dom';\n\nexport interface DateTimePickerProps {\n label?: string;\n error?: string;\n helperText?: string;\n value?: Date;\n onChange?: (date: Date) => void;\n minDate?: Date;\n maxDate?: Date;\n disabled?: boolean;\n className?: string;\n placeholder?: string;\n}\n\nconst DAYS = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];\nconst MONTHS = [\n 'January', 'February', 'March', 'April', 'May', 'June',\n 'July', 'August', 'September', 'October', 'November', 'December'\n];\nconst SHORT_MONTHS = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n\nexport const DateTimePicker: React.FC<DateTimePickerProps> = ({\n label,\n error,\n helperText,\n value,\n onChange,\n minDate,\n maxDate,\n disabled,\n className = '',\n placeholder = 'Select date and time...',\n}) => {\n const [isOpen, setIsOpen] = useState(false);\n const [viewDate, setViewDate] = useState(value || new Date());\n const [selectedTime, setSelectedTime] = useState(\n value ? { hours: value.getHours(), minutes: value.getMinutes() } : { hours: 12, minutes: 0 }\n );\n const [mounted, setMounted] = useState(false);\n const [pickerPosition, setPickerPosition] = useState<{ top: number; left: number } | null>(null);\n const inputRef = useRef<HTMLDivElement>(null);\n const pickerRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n setMounted(true);\n }, []);\n\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (pickerRef.current && !pickerRef.current.contains(event.target as Node) &&\n inputRef.current && !inputRef.current.contains(event.target as Node)) {\n setIsOpen(false);\n }\n };\n\n if (isOpen) {\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }\n }, [isOpen]);\n\n useEffect(() => {\n if (isOpen && inputRef.current) {\n const rect = inputRef.current.getBoundingClientRect();\n setPickerPosition({\n top: rect.bottom + 8,\n left: rect.left,\n });\n } else {\n setPickerPosition(null);\n }\n }, [isOpen]);\n\n const year = viewDate.getFullYear();\n const month = viewDate.getMonth();\n\n const firstDayOfMonth = new Date(year, month, 1).getDay();\n const daysInMonth = new Date(year, month + 1, 0).getDate();\n const daysInPrevMonth = new Date(year, month, 0).getDate();\n\n const calendarDays: Date[] = [];\n\n for (let i = firstDayOfMonth - 1; i >= 0; i--) {\n calendarDays.push(new Date(year, month - 1, daysInPrevMonth - i));\n }\n\n for (let i = 1; i <= daysInMonth; i++) {\n calendarDays.push(new Date(year, month, i));\n }\n\n const remainingDays = 42 - calendarDays.length;\n for (let i = 1; i <= remainingDays; i++) {\n calendarDays.push(new Date(year, month + 1, i));\n }\n\n const isSameDay = (date1: Date, date2: Date) => {\n return date1.getDate() === date2.getDate() &&\n date1.getMonth() === date2.getMonth() &&\n date1.getFullYear() === date2.getFullYear();\n };\n\n const isToday = (date: Date) => {\n return isSameDay(date, new Date());\n };\n\n const isSelected = (date: Date) => {\n return value && isSameDay(date, value);\n };\n\n const isCurrentMonth = (date: Date) => {\n return date.getMonth() === month;\n };\n\n const isDisabled = (date: Date) => {\n if (minDate && date < minDate) return true;\n if (maxDate && date > maxDate) return true;\n return false;\n };\n\n const handleDateClick = (date: Date) => {\n if (isDisabled(date)) return;\n const newDateTime = new Date(\n date.getFullYear(),\n date.getMonth(),\n date.getDate(),\n selectedTime.hours,\n selectedTime.minutes\n );\n onChange?.(newDateTime);\n };\n\n const handleTimeChange = (hours: number, minutes: number) => {\n setSelectedTime({ hours, minutes });\n if (value) {\n const newDateTime = new Date(\n value.getFullYear(),\n value.getMonth(),\n value.getDate(),\n hours,\n minutes\n );\n onChange?.(newDateTime);\n }\n };\n\n const handleDone = () => {\n if (value) {\n setIsOpen(false);\n }\n };\n\n const handlePrevMonth = () => {\n setViewDate(new Date(year, month - 1, 1));\n };\n\n const handleNextMonth = () => {\n setViewDate(new Date(year, month + 1, 1));\n };\n\n const handleToday = () => {\n const now = new Date();\n setViewDate(now);\n setSelectedTime({ hours: now.getHours(), minutes: now.getMinutes() });\n onChange?.(now);\n };\n\n // Consistent date formatting that doesn't depend on locale\n const formatDateTime = (date?: Date) => {\n if (!date) return '';\n const monthStr = SHORT_MONTHS[date.getMonth()];\n const day = date.getDate();\n const yearNum = date.getFullYear();\n const hours = date.getHours();\n const minutes = date.getMinutes();\n const period = hours >= 12 ? 'PM' : 'AM';\n const displayHours = hours % 12 || 12;\n const displayMinutes = minutes.toString().padStart(2, '0');\n return `${monthStr} ${day}, ${yearNum}, ${displayHours}:${displayMinutes} ${period}`;\n };\n\n const formatTime = (hours: number, minutes: number) => {\n const period = hours >= 12 ? 'PM' : 'AM';\n const displayHours = hours % 12 || 12;\n const displayMinutes = minutes.toString().padStart(2, '0');\n return `${displayHours}:${displayMinutes} ${period}`;\n };\n\n const baseStyles = 'w-full appearance-none rounded-md border border-[hsl(var(--input))] bg-transparent text-[hsl(var(--foreground))] px-4 py-2.5 text-sm transition-colors duration-150 focus:outline-none focus:ring-1 focus:ring-[hsl(var(--ring))]/50 focus:border-[hsl(var(--ring))] hover:border-[hsl(var(--muted-foreground))] cursor-pointer';\n const errorStyles = error ? 'border-[hsl(var(--destructive))] focus:ring-[hsl(var(--destructive))]/50' : '';\n const disabledStyles = disabled ? 'opacity-50 cursor-not-allowed bg-[hsl(var(--muted))]' : '';\n\n const picker = isOpen && mounted && pickerPosition ? (\n <div\n ref={pickerRef}\n className=\"fixed z-[9999] bg-[hsl(var(--popover))] rounded-md border border-[hsl(var(--border))] shadow-lg p-4\"\n style={{\n top: `${pickerPosition.top}px`,\n left: `${pickerPosition.left}px`,\n minWidth: '360px',\n }}\n >\n {/* Calendar Header */}\n <div className=\"flex items-center justify-between mb-4\">\n <button\n onClick={handlePrevMonth}\n className=\"p-2 hover:bg-[hsl(var(--accent))] rounded-md transition-colors\"\n aria-label=\"Previous month\"\n >\n <svg className=\"w-5 h-5 text-[hsl(var(--muted-foreground))]\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 19l-7-7 7-7\" />\n </svg>\n </button>\n\n <div className=\"flex items-center gap-2\">\n <h2 className=\"text-base font-semibold text-[hsl(var(--foreground))]\">\n {MONTHS[month]} {year}\n </h2>\n <button\n onClick={handleToday}\n className=\"px-2 py-1 text-xs bg-[hsl(var(--primary))] text-[hsl(var(--primary-foreground))] rounded-md hover:bg-[hsl(var(--primary))]/90 transition-colors\"\n >\n Now\n </button>\n </div>\n\n <button\n onClick={handleNextMonth}\n className=\"p-2 hover:bg-[hsl(var(--accent))] rounded-md transition-colors\"\n aria-label=\"Next month\"\n >\n <svg className=\"w-5 h-5 text-[hsl(var(--muted-foreground))]\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 5l7 7-7 7\" />\n </svg>\n </button>\n </div>\n\n {/* Day headers */}\n <div className=\"grid grid-cols-7 gap-1 mb-2\">\n {DAYS.map(day => (\n <div key={day} className=\"text-center text-xs font-semibold text-[hsl(var(--muted-foreground))] py-1\">\n {day}\n </div>\n ))}\n </div>\n\n {/* Calendar grid */}\n <div className=\"grid grid-cols-7 gap-1 mb-4\">\n {calendarDays.map((date, index) => {\n const isCurrentMonthDay = isCurrentMonth(date);\n const isTodayDay = isToday(date);\n const isSelectedDay = isSelected(date);\n const isDisabledDay = isDisabled(date);\n\n return (\n <button\n key={index}\n onClick={() => handleDateClick(date)}\n disabled={isDisabledDay}\n className={`\n aspect-square p-1 rounded-md text-sm font-medium transition-all\n ${!isCurrentMonthDay ? 'text-[hsl(var(--muted-foreground))]/50' : 'text-[hsl(var(--foreground))]'}\n ${isTodayDay && !isSelectedDay ? 'bg-[hsl(var(--accent))] text-[hsl(var(--primary))] font-bold' : ''}\n ${isSelectedDay ? 'bg-[hsl(var(--primary))] text-[hsl(var(--primary-foreground))] hover:bg-[hsl(var(--primary))]/90' : ''}\n ${!isSelectedDay && !isDisabledDay ? 'hover:bg-[hsl(var(--accent))]' : ''}\n ${isDisabledDay ? 'opacity-30 cursor-not-allowed' : 'cursor-pointer'}\n `}\n >\n {date.getDate()}\n </button>\n );\n })}\n </div>\n\n {/* Time Picker */}\n <div className=\"border-t border-[hsl(var(--border))] pt-4\">\n <div className=\"flex items-center justify-center gap-4 mb-4\">\n {/* Hours */}\n <div className=\"flex flex-col items-center\">\n <label className=\"text-xs font-semibold text-[hsl(var(--muted-foreground))] mb-2\">Hour</label>\n <div className=\"flex flex-col items-center gap-1\">\n <button\n type=\"button\"\n onClick={() => handleTimeChange((selectedTime.hours + 1) % 24, selectedTime.minutes)}\n className=\"p-1 hover:bg-[hsl(var(--accent))] rounded transition-colors\"\n >\n <svg className=\"w-4 h-4 text-[hsl(var(--muted-foreground))]\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 15l7-7 7 7\" />\n </svg>\n </button>\n <input\n type=\"number\"\n min=\"0\"\n max=\"23\"\n value={selectedTime.hours}\n onChange={(e) => {\n const val = parseInt(e.target.value);\n if (!isNaN(val) && val >= 0 && val <= 23) {\n handleTimeChange(val, selectedTime.minutes);\n }\n }}\n className=\"w-16 px-2 py-2 text-center border border-[hsl(var(--input))] rounded-md bg-transparent text-[hsl(var(--foreground))] focus:outline-none focus:ring-1 focus:ring-[hsl(var(--ring))]/50 text-lg font-semibold [appearance:textfield] [&::-webkit-outer-spin-button]:appearance-none [&::-webkit-inner-spin-button]:appearance-none\"\n />\n <button\n type=\"button\"\n onClick={() => handleTimeChange((selectedTime.hours - 1 + 24) % 24, selectedTime.minutes)}\n className=\"p-1 hover:bg-[hsl(var(--accent))] rounded transition-colors\"\n >\n <svg className=\"w-4 h-4 text-[hsl(var(--muted-foreground))]\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 9l-7 7-7-7\" />\n </svg>\n </button>\n </div>\n </div>\n\n <span className=\"text-2xl font-bold text-[hsl(var(--muted-foreground))] mt-8\">:</span>\n\n {/* Minutes */}\n <div className=\"flex flex-col items-center\">\n <label className=\"text-xs font-semibold text-[hsl(var(--muted-foreground))] mb-2\">Minute</label>\n <div className=\"flex flex-col items-center gap-1\">\n <button\n type=\"button\"\n onClick={() => handleTimeChange(selectedTime.hours, (selectedTime.minutes + 1) % 60)}\n className=\"p-1 hover:bg-[hsl(var(--accent))] rounded transition-colors\"\n >\n <svg className=\"w-4 h-4 text-[hsl(var(--muted-foreground))]\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 15l7-7 7 7\" />\n </svg>\n </button>\n <input\n type=\"number\"\n min=\"0\"\n max=\"59\"\n value={selectedTime.minutes}\n onChange={(e) => {\n const val = parseInt(e.target.value);\n if (!isNaN(val) && val >= 0 && val <= 59) {\n handleTimeChange(selectedTime.hours, val);\n }\n }}\n className=\"w-16 px-2 py-2 text-center border border-[hsl(var(--input))] rounded-md bg-transparent text-[hsl(var(--foreground))] focus:outline-none focus:ring-1 focus:ring-[hsl(var(--ring))]/50 text-lg font-semibold [appearance:textfield] [&::-webkit-outer-spin-button]:appearance-none [&::-webkit-inner-spin-button]:appearance-none\"\n />\n <button\n type=\"button\"\n onClick={() => handleTimeChange(selectedTime.hours, (selectedTime.minutes - 1 + 60) % 60)}\n className=\"p-1 hover:bg-[hsl(var(--accent))] rounded transition-colors\"\n >\n <svg className=\"w-4 h-4 text-[hsl(var(--muted-foreground))]\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 9l-7 7-7-7\" />\n </svg>\n </button>\n </div>\n </div>\n </div>\n <div className=\"text-center text-sm text-[hsl(var(--muted-foreground))] mb-4\">\n {formatTime(selectedTime.hours, selectedTime.minutes)}\n </div>\n <button\n onClick={handleDone}\n className=\"w-full px-4 py-2 bg-[hsl(var(--primary))] text-[hsl(var(--primary-foreground))] rounded-md hover:bg-[hsl(var(--primary))]/90 transition-colors font-medium\"\n >\n Done\n </button>\n </div>\n </div>\n ) : null;\n\n return (\n <div className={className}>\n {label && (\n <label className=\"block text-sm font-medium text-[hsl(var(--foreground))] mb-1.5\">\n {label}\n </label>\n )}\n <div\n ref={inputRef}\n onClick={() => !disabled && setIsOpen(!isOpen)}\n className={`${baseStyles} ${errorStyles} ${disabledStyles} flex items-center justify-between`.trim()}\n >\n <span className={!value ? 'text-[hsl(var(--muted-foreground))]' : ''}>\n {value ? formatDateTime(value) : placeholder}\n </span>\n <svg className=\"w-5 h-5 text-[hsl(var(--muted-foreground))]\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z\" />\n </svg>\n </div>\n {error && <p className=\"mt-1.5 text-sm text-[hsl(var(--destructive))]\">{error}</p>}\n {helperText && !error && <p className=\"mt-1.5 text-sm text-[hsl(var(--muted-foreground))]\">{helperText}</p>}\n {mounted && createPortal(picker, document.body)}\n </div>\n );\n};\n\nDateTimePicker.displayName = 'DateTimePicker';\n","\"use client\";\n\nimport React, { useState } from 'react';\n\nexport interface CalendarProps {\n value?: Date;\n onChange?: (date: Date) => void;\n minDate?: Date;\n maxDate?: Date;\n className?: string;\n}\n\nconst DAYS = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];\nconst MONTHS = [\n 'January', 'February', 'March', 'April', 'May', 'June',\n 'July', 'August', 'September', 'October', 'November', 'December'\n];\n\nexport const Calendar: React.FC<CalendarProps> = ({\n value,\n onChange,\n minDate,\n maxDate,\n className = '',\n}) => {\n const [currentDate, setCurrentDate] = useState(value || new Date());\n const [viewDate, setViewDate] = useState(value || new Date());\n\n const year = viewDate.getFullYear();\n const month = viewDate.getMonth();\n\n // Get first day of month and number of days\n const firstDayOfMonth = new Date(year, month, 1).getDay();\n const daysInMonth = new Date(year, month + 1, 0).getDate();\n const daysInPrevMonth = new Date(year, month, 0).getDate();\n\n // Build calendar grid\n const calendarDays: (Date | null)[] = [];\n\n // Previous month days\n for (let i = firstDayOfMonth - 1; i >= 0; i--) {\n calendarDays.push(new Date(year, month - 1, daysInPrevMonth - i));\n }\n\n // Current month days\n for (let i = 1; i <= daysInMonth; i++) {\n calendarDays.push(new Date(year, month, i));\n }\n\n // Next month days to fill grid\n const remainingDays = 42 - calendarDays.length; // 6 rows * 7 days\n for (let i = 1; i <= remainingDays; i++) {\n calendarDays.push(new Date(year, month + 1, i));\n }\n\n const isSameDay = (date1: Date, date2: Date) => {\n return date1.getDate() === date2.getDate() &&\n date1.getMonth() === date2.getMonth() &&\n date1.getFullYear() === date2.getFullYear();\n };\n\n const isToday = (date: Date) => {\n return isSameDay(date, new Date());\n };\n\n const isSelected = (date: Date) => {\n return value && isSameDay(date, value);\n };\n\n const isCurrentMonth = (date: Date) => {\n return date.getMonth() === month;\n };\n\n const isDisabled = (date: Date) => {\n if (minDate && date < minDate) return true;\n if (maxDate && date > maxDate) return true;\n return false;\n };\n\n const handleDateClick = (date: Date) => {\n if (isDisabled(date)) return;\n setCurrentDate(date);\n onChange?.(date);\n };\n\n const handlePrevMonth = () => {\n setViewDate(new Date(year, month - 1, 1));\n };\n\n const handleNextMonth = () => {\n setViewDate(new Date(year, month + 1, 1));\n };\n\n const handleToday = () => {\n const today = new Date();\n setViewDate(today);\n setCurrentDate(today);\n onChange?.(today);\n };\n\n return (\n <div className={`bg-[hsl(var(--card))] rounded-md border border-[hsl(var(--border))] p-4 ${className}`}>\n {/* Header with month/year and navigation */}\n <div className=\"flex items-center justify-between mb-4\">\n <button\n onClick={handlePrevMonth}\n className=\"p-2 hover:bg-[hsl(var(--accent))] rounded-md transition-colors\"\n aria-label=\"Previous month\"\n >\n <svg className=\"w-5 h-5 text-[hsl(var(--muted-foreground))]\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 19l-7-7 7-7\" />\n </svg>\n </button>\n\n <div className=\"flex items-center gap-2\">\n <h2 className=\"text-lg font-semibold text-[hsl(var(--foreground))]\">\n {MONTHS[month]} {year}\n </h2>\n <button\n onClick={handleToday}\n className=\"px-3 py-1 text-sm bg-[hsl(var(--primary))] text-[hsl(var(--primary-foreground))] rounded-md hover:bg-[hsl(var(--primary))]/90 transition-colors\"\n >\n Today\n </button>\n </div>\n\n <button\n onClick={handleNextMonth}\n className=\"p-2 hover:bg-[hsl(var(--accent))] rounded-md transition-colors\"\n aria-label=\"Next month\"\n >\n <svg className=\"w-5 h-5 text-[hsl(var(--muted-foreground))]\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 5l7 7-7 7\" />\n </svg>\n </button>\n </div>\n\n {/* Day headers */}\n <div className=\"grid grid-cols-7 gap-1 mb-2\">\n {DAYS.map(day => (\n <div\n key={day}\n className=\"text-center text-xs font-semibold text-[hsl(var(--muted-foreground))] py-2\"\n >\n {day}\n </div>\n ))}\n </div>\n\n {/* Calendar grid */}\n <div className=\"grid grid-cols-7 gap-1\">\n {calendarDays.map((date, index) => {\n if (!date) return <div key={index} />;\n\n const isCurrentMonthDay = isCurrentMonth(date);\n const isTodayDay = isToday(date);\n const isSelectedDay = isSelected(date);\n const isDisabledDay = isDisabled(date);\n\n return (\n <button\n key={index}\n onClick={() => handleDateClick(date)}\n disabled={isDisabledDay}\n className={`\n aspect-square p-2 rounded-md text-sm font-medium transition-all\n ${!isCurrentMonthDay ? 'text-[hsl(var(--muted-foreground))]/50' : 'text-[hsl(var(--foreground))]'}\n ${isTodayDay && !isSelectedDay ? 'bg-[hsl(var(--accent))] text-[hsl(var(--primary))] font-bold' : ''}\n ${isSelectedDay ? 'bg-[hsl(var(--primary))] text-[hsl(var(--primary-foreground))] hover:bg-[hsl(var(--primary))]/90' : ''}\n ${!isSelectedDay && !isDisabledDay ? 'hover:bg-[hsl(var(--accent))]' : ''}\n ${isDisabledDay ? 'opacity-30 cursor-not-allowed' : 'cursor-pointer'}\n `}\n >\n {date.getDate()}\n </button>\n );\n })}\n </div>\n </div>\n );\n};\n","\"use client\";\n\nimport React from 'react';\n\nexport interface RadioOption {\n value: string;\n label: string;\n disabled?: boolean;\n}\n\nexport interface RadioProps {\n name: string;\n options: RadioOption[];\n value?: string;\n defaultValue?: string;\n onChange?: (value: string) => void;\n disabled?: boolean;\n orientation?: 'horizontal' | 'vertical';\n className?: string;\n}\n\nexport const Radio: React.FC<RadioProps> = ({\n name,\n options,\n value: controlledValue,\n defaultValue,\n onChange,\n disabled = false,\n orientation = 'vertical',\n className = '',\n}) => {\n const [internalValue, setInternalValue] = React.useState(defaultValue || '');\n\n const value = controlledValue !== undefined ? controlledValue : internalValue;\n\n const handleChange = (optionValue: string) => {\n if (disabled) return;\n setInternalValue(optionValue);\n onChange?.(optionValue);\n };\n\n const containerClass = orientation === 'horizontal'\n ? 'flex flex-wrap gap-4'\n : 'flex flex-col gap-2';\n\n return (\n <div className={`${containerClass} ${className}`} role=\"radiogroup\">\n {options.map((option) => {\n const isDisabled = disabled || option.disabled;\n const isChecked = value === option.value;\n const id = `${name}-${option.value}`;\n\n return (\n <label\n key={option.value}\n htmlFor={id}\n className={`flex items-center gap-2 cursor-pointer group ${\n isDisabled ? 'opacity-50 cursor-not-allowed' : ''\n }`}\n >\n <div className=\"relative inline-flex items-center\">\n <input\n type=\"radio\"\n id={id}\n name={name}\n value={option.value}\n checked={isChecked}\n onChange={() => handleChange(option.value)}\n disabled={isDisabled}\n className=\"sr-only peer\"\n />\n <div className={`w-4 h-4 rounded-full border-2 transition-all duration-200 flex items-center justify-center\n border-[hsl(var(--input))]\n ${isDisabled\n ? 'bg-[hsl(var(--muted))]'\n : 'peer-hover:border-[hsl(var(--ring))]'\n }\n ${isChecked\n ? 'border-[hsl(var(--primary))] bg-[hsl(var(--background))]'\n : ''\n }\n peer-focus:ring-1 peer-focus:ring-[hsl(var(--ring))]/50\n `}>\n {/* Inner dot */}\n <div className={`w-2 h-2 rounded-full bg-[hsl(var(--primary))] transition-all duration-200 ${\n isChecked ? 'scale-100' : 'scale-0'\n }`} />\n </div>\n </div>\n <span className={`text-sm font-medium text-[hsl(var(--foreground))] ${\n !isDisabled && 'group-hover:text-[hsl(var(--foreground))]'\n }`}>\n {option.label}\n </span>\n </label>\n );\n })}\n </div>\n );\n};\n","\"use client\";\n\nimport React from 'react';\n\nexport interface ProgressBarProps {\n value: number;\n max?: number;\n size?: 'sm' | 'md' | 'lg';\n variant?: 'default' | 'success' | 'warning' | 'danger';\n showLabel?: boolean;\n label?: string;\n className?: string;\n}\n\nexport const ProgressBar: React.FC<ProgressBarProps> = ({\n value,\n max = 100,\n size = 'md',\n variant = 'default',\n showLabel = false,\n label,\n className = '',\n}) => {\n const percentage = Math.min(Math.max((value / max) * 100, 0), 100);\n\n const sizeClasses = {\n sm: 'h-1',\n md: 'h-2',\n lg: 'h-3',\n };\n\n const variantClasses = {\n default: 'bg-[hsl(var(--primary))]',\n success: 'bg-[hsl(var(--success))]',\n warning: 'bg-[hsl(var(--warning))]',\n danger: 'bg-[hsl(var(--destructive))]',\n };\n\n return (\n <div className={`w-full ${className}`}>\n {(showLabel || label) && (\n <div className=\"flex justify-between items-center mb-1\">\n {label && (\n <span className=\"text-sm font-medium text-[hsl(var(--foreground))]\">\n {label}\n </span>\n )}\n {showLabel && (\n <span className=\"text-sm font-medium text-[hsl(var(--muted-foreground))]\">\n {Math.round(percentage)}%\n </span>\n )}\n </div>\n )}\n <div\n className={`w-full bg-[hsl(var(--muted))] rounded-full overflow-hidden ${sizeClasses[size]}`}\n role=\"progressbar\"\n aria-valuenow={value}\n aria-valuemin={0}\n aria-valuemax={max}\n >\n <div\n className={`${sizeClasses[size]} ${variantClasses[variant]} rounded-full transition-all duration-300 ease-out`}\n style={{ width: `${percentage}%` }}\n />\n </div>\n </div>\n );\n};\n","\"use client\";\n\nimport React, { useState, useRef } from 'react';\n\nexport interface SliderProps {\n value?: number;\n defaultValue?: number;\n min?: number;\n max?: number;\n step?: number;\n onChange?: (value: number) => void;\n disabled?: boolean;\n showValue?: boolean;\n label?: string;\n className?: string;\n // Range slider props\n range?: boolean;\n rangeValue?: [number, number];\n defaultRangeValue?: [number, number];\n onRangeChange?: (value: [number, number]) => void;\n}\n\nexport const Slider: React.FC<SliderProps> = ({\n value: controlledValue,\n defaultValue = 50,\n min = 0,\n max = 100,\n step = 1,\n onChange,\n disabled = false,\n showValue = false,\n label,\n className = '',\n range = false,\n rangeValue: controlledRangeValue,\n defaultRangeValue = [25, 75],\n onRangeChange,\n}) => {\n const [internalValue, setInternalValue] = React.useState(defaultValue);\n const [internalRangeValue, setInternalRangeValue] = React.useState<[number, number]>(defaultRangeValue);\n const trackRef = useRef<HTMLDivElement>(null);\n const [isDragging, setIsDragging] = React.useState<'min' | 'max' | null>(null);\n\n const value = controlledValue !== undefined ? controlledValue : internalValue;\n const rangeValue = controlledRangeValue !== undefined ? controlledRangeValue : internalRangeValue;\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const newValue = Number(e.target.value);\n setInternalValue(newValue);\n onChange?.(newValue);\n };\n\n const handleRangeStart = (clientX: number, handle: 'min' | 'max') => {\n if (disabled) return;\n setIsDragging(handle);\n };\n\n const handleRangeMouseDown = (e: React.MouseEvent, handle: 'min' | 'max') => {\n e.preventDefault();\n handleRangeStart(e.clientX, handle);\n };\n\n const handleRangeTouchStart = (e: React.TouchEvent, handle: 'min' | 'max') => {\n e.preventDefault();\n handleRangeStart(e.touches[0].clientX, handle);\n };\n\n const updateRangeValue = (clientX: number) => {\n if (!isDragging || !trackRef.current || disabled) return;\n\n const rect = trackRef.current.getBoundingClientRect();\n const percentage = Math.max(0, Math.min(100, ((clientX - rect.left) / rect.width) * 100));\n const newValue = Math.round((percentage / 100) * (max - min) / step) * step + min;\n\n if (isDragging === 'min') {\n const newMin = Math.min(newValue, rangeValue[1] - step);\n const newRange: [number, number] = [newMin, rangeValue[1]];\n setInternalRangeValue(newRange);\n onRangeChange?.(newRange);\n } else {\n const newMax = Math.max(newValue, rangeValue[0] + step);\n const newRange: [number, number] = [rangeValue[0], newMax];\n setInternalRangeValue(newRange);\n onRangeChange?.(newRange);\n }\n };\n\n const handleRangeMouseMove = (e: MouseEvent) => {\n updateRangeValue(e.clientX);\n };\n\n const handleRangeTouchMove = (e: TouchEvent) => {\n if (e.touches.length > 0) {\n updateRangeValue(e.touches[0].clientX);\n }\n };\n\n const handleRangeEnd = () => {\n setIsDragging(null);\n };\n\n React.useEffect(() => {\n if (isDragging) {\n document.addEventListener('mousemove', handleRangeMouseMove);\n document.addEventListener('mouseup', handleRangeEnd);\n document.addEventListener('touchmove', handleRangeTouchMove);\n document.addEventListener('touchend', handleRangeEnd);\n return () => {\n document.removeEventListener('mousemove', handleRangeMouseMove);\n document.removeEventListener('mouseup', handleRangeEnd);\n document.removeEventListener('touchmove', handleRangeTouchMove);\n document.removeEventListener('touchend', handleRangeEnd);\n };\n }\n }, [isDragging, rangeValue]);\n\n const percentage = ((value - min) / (max - min)) * 100;\n const minPercentage = ((rangeValue[0] - min) / (max - min)) * 100;\n const maxPercentage = ((rangeValue[1] - min) / (max - min)) * 100;\n\n if (range) {\n return (\n <div className={`w-full ${className}`}>\n {(label || showValue) && (\n <div className=\"flex justify-between items-center mb-2\">\n {label && (\n <label className=\"text-sm font-medium text-[hsl(var(--foreground))]\">\n {label}\n </label>\n )}\n {showValue && (\n <span className=\"text-sm font-medium text-[hsl(var(--muted-foreground))]\">\n {rangeValue[0]} - {rangeValue[1]}\n </span>\n )}\n </div>\n )}\n <div className=\"relative h-10 flex items-center\" ref={trackRef}>\n {/* Background track */}\n <div className=\"absolute w-full h-2 bg-[hsl(var(--muted))] rounded-full\" />\n\n {/* Filled track between handles */}\n <div\n className=\"absolute h-2 bg-[hsl(var(--primary))] rounded-full pointer-events-none\"\n style={{\n left: `${minPercentage}%`,\n width: `${maxPercentage - minPercentage}%`,\n }}\n />\n\n {/* Min handle */}\n <div\n className={`absolute w-4 h-4 -ml-2 rounded-full bg-[hsl(var(--background))] border-2 border-[hsl(var(--primary))] shadow-md cursor-pointer z-10\n ${disabled ? 'opacity-50 cursor-not-allowed' : ''}\n `}\n style={{ left: `${minPercentage}%` }}\n onMouseDown={(e) => handleRangeMouseDown(e, 'min')}\n onTouchStart={(e) => handleRangeTouchStart(e, 'min')}\n role=\"slider\"\n aria-label={`${label ? label + ' ' : ''}minimum value`}\n aria-valuemin={min}\n aria-valuemax={rangeValue[1]}\n aria-valuenow={rangeValue[0]}\n tabIndex={disabled ? -1 : 0}\n />\n\n {/* Max handle */}\n <div\n className={`absolute w-4 h-4 -ml-2 rounded-full bg-[hsl(var(--background))] border-2 border-[hsl(var(--primary))] shadow-md cursor-pointer z-10\n ${disabled ? 'opacity-50 cursor-not-allowed' : ''}\n `}\n style={{ left: `${maxPercentage}%` }}\n onMouseDown={(e) => handleRangeMouseDown(e, 'max')}\n onTouchStart={(e) => handleRangeTouchStart(e, 'max')}\n role=\"slider\"\n aria-label={`${label ? label + ' ' : ''}maximum value`}\n aria-valuemin={rangeValue[0]}\n aria-valuemax={max}\n aria-valuenow={rangeValue[1]}\n tabIndex={disabled ? -1 : 0}\n />\n </div>\n </div>\n );\n }\n\n return (\n <div className={`w-full ${className}`}>\n {(label || showValue) && (\n <div className=\"flex justify-between items-center mb-2\">\n {label && (\n <label className=\"text-sm font-medium text-[hsl(var(--foreground))]\">\n {label}\n </label>\n )}\n {showValue && (\n <span className=\"text-sm font-medium text-[hsl(var(--muted-foreground))]\">\n {value}\n </span>\n )}\n </div>\n )}\n <div className=\"relative h-10 flex items-center\">\n {/* Background track */}\n <div className=\"absolute w-full h-2 bg-[hsl(var(--muted))] rounded-full\" />\n\n {/* Filled track */}\n <div\n className=\"absolute h-2 bg-[hsl(var(--primary))] rounded-full pointer-events-none\"\n style={{ width: `${percentage}%` }}\n />\n\n {/* Custom handle */}\n <div\n className={`absolute w-4 h-4 -ml-2 rounded-full bg-[hsl(var(--background))] border-2 border-[hsl(var(--primary))] shadow-md pointer-events-none z-10\n ${disabled ? 'opacity-50' : ''}\n `}\n style={{ left: `${percentage}%` }}\n />\n\n {/* Input slider (invisible but functional) */}\n <input\n type=\"range\"\n min={min}\n max={max}\n step={step}\n value={value}\n onChange={handleChange}\n disabled={disabled}\n className=\"relative w-full h-10 bg-transparent appearance-none cursor-pointer disabled:cursor-not-allowed z-20\n [&::-webkit-slider-thumb]:appearance-none [&::-webkit-slider-thumb]:w-4 [&::-webkit-slider-thumb]:h-4\n [&::-webkit-slider-thumb]:rounded-full [&::-webkit-slider-thumb]:bg-transparent [&::-webkit-slider-thumb]:cursor-pointer\n [&::-moz-range-thumb]:w-4 [&::-moz-range-thumb]:h-4 [&::-moz-range-thumb]:rounded-full\n [&::-moz-range-thumb]:bg-transparent [&::-moz-range-thumb]:cursor-pointer [&::-moz-range-thumb]:border-none\"\n aria-label={label}\n aria-valuemin={min}\n aria-valuemax={max}\n aria-valuenow={value}\n />\n </div>\n </div>\n );\n};\n","\"use client\";\n\nimport React from 'react';\n\nexport interface AvatarProps {\n src?: string;\n alt?: string;\n name?: string;\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n shape?: 'circle' | 'square';\n className?: string;\n fallbackColor?: string;\n}\n\nexport const Avatar: React.FC<AvatarProps> = ({\n src,\n alt,\n name,\n size = 'md',\n shape = 'circle',\n className = '',\n fallbackColor = 'bg-[hsl(var(--primary))]',\n}) => {\n const [imageError, setImageError] = React.useState(false);\n\n const sizeClasses = {\n xs: 'w-6 h-6 text-xs',\n sm: 'w-8 h-8 text-sm',\n md: 'w-10 h-10 text-base',\n lg: 'w-12 h-12 text-lg',\n xl: 'w-16 h-16 text-2xl',\n };\n\n const shapeClass = shape === 'circle' ? 'rounded-full' : 'rounded-md';\n\n const getInitials = (name: string): string => {\n const parts = name.trim().split(' ');\n if (parts.length >= 2) {\n return `${parts[0][0]}${parts[parts.length - 1][0]}`.toUpperCase();\n }\n return name.slice(0, 2).toUpperCase();\n };\n\n const showImage = src && !imageError;\n const showInitials = !showImage && name;\n\n return (\n <div\n className={`${sizeClasses[size]} ${shapeClass} flex items-center justify-center overflow-hidden ${\n showImage ? 'bg-[hsl(var(--muted))]' : `${fallbackColor} text-white`\n } ${className}`}\n >\n {showImage ? (\n <img\n src={src}\n alt={alt || name || 'Avatar'}\n className=\"w-full h-full object-cover\"\n onError={() => setImageError(true)}\n />\n ) : showInitials ? (\n <span className=\"font-semibold select-none\">{getInitials(name)}</span>\n ) : (\n <svg\n className=\"w-full h-full text-[hsl(var(--muted-foreground))]\"\n fill=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path d=\"M12 12c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm0 2c-2.67 0-8 1.34-8 4v2h16v-2c0-2.66-5.33-4-8-4z\" />\n </svg>\n )}\n </div>\n );\n};\n","\"use client\";\n\nimport React from 'react';\n\nexport interface TextareaProps extends Omit<React.TextareaHTMLAttributes<HTMLTextAreaElement>, 'size'> {\n label?: string;\n error?: string;\n helperText?: string;\n size?: 'sm' | 'md' | 'lg';\n resize?: 'none' | 'vertical' | 'horizontal' | 'both';\n}\n\nexport const Textarea: React.FC<TextareaProps> = ({\n label,\n error,\n helperText,\n size = 'md',\n resize = 'vertical',\n className = '',\n disabled,\n ...props\n}) => {\n const sizeClasses = {\n sm: 'px-3 py-1.5 text-sm min-h-[80px]',\n md: 'px-3 py-2.5 text-sm min-h-[100px]',\n lg: 'px-4 py-3 text-base min-h-[120px]',\n };\n\n const resizeClasses = {\n none: 'resize-none',\n vertical: 'resize-y',\n horizontal: 'resize-x',\n both: 'resize',\n };\n\n const baseClasses = `w-full rounded-md border transition-colors duration-150 focus:outline-none focus:ring-1 focus:ring-[hsl(var(--ring))]/50 focus:border-[hsl(var(--ring))]\n ${error\n ? 'border-[hsl(var(--destructive))] focus:ring-[hsl(var(--destructive))]/50'\n : 'border-[hsl(var(--input))] hover:border-[hsl(var(--muted-foreground))]'\n }\n bg-transparent text-[hsl(var(--foreground))]\n placeholder:text-[hsl(var(--muted-foreground))]\n disabled:opacity-50 disabled:cursor-not-allowed disabled:bg-[hsl(var(--muted))]`;\n\n return (\n <div className={`w-full ${className}`}>\n {label && (\n <label className=\"block text-sm font-medium text-[hsl(var(--foreground))] mb-1.5\">\n {label}\n </label>\n )}\n <textarea\n className={`${baseClasses} ${sizeClasses[size]} ${resizeClasses[resize]}`}\n disabled={disabled}\n {...props}\n />\n {error && (\n <p className=\"mt-1.5 text-sm text-[hsl(var(--destructive))]\">{error}</p>\n )}\n {helperText && !error && (\n <p className=\"mt-1.5 text-sm text-[hsl(var(--muted-foreground))]\">{helperText}</p>\n )}\n </div>\n );\n};\n","\"use client\";\n\nimport React, { useRef, useCallback, useState, useEffect, useLayoutEffect } from 'react';\nimport { useTheme } from '../theme/ThemeProvider';\nimport { Modal } from './Modal';\nimport { Button } from './Button';\nimport { TextInput } from './TextInput';\n\nexport interface RichTextEditorProps {\n value?: string;\n onChange?: (html: string) => void;\n placeholder?: string;\n className?: string;\n minHeight?: string;\n maxHeight?: string;\n disabled?: boolean;\n label?: string;\n error?: string;\n helperText?: string;\n}\n\ntype FormatCommand = 'bold' | 'italic' | 'underline' | 'strikeThrough';\ntype BlockCommand = 'insertUnorderedList' | 'insertOrderedList' | 'formatBlock';\ntype HeadingLevel = 'h1' | 'h2' | 'h3' | 'p';\n\nexport const RichTextEditor: React.FC<RichTextEditorProps> = ({\n value = '',\n onChange,\n placeholder = 'Start typing...',\n className = '',\n minHeight = '200px',\n maxHeight = '500px',\n disabled = false,\n label,\n error,\n helperText,\n}) => {\n const { themeName } = useTheme();\n const editorRef = useRef<HTMLDivElement>(null);\n const [isFocused, setIsFocused] = useState(false);\n const [activeFormats, setActiveFormats] = useState<Set<string>>(new Set());\n const [showLinkModal, setShowLinkModal] = useState(false);\n const [linkUrl, setLinkUrl] = useState('');\n const [showImageModal, setShowImageModal] = useState(false);\n const [imageUrl, setImageUrl] = useState('');\n const [imageAlt, setImageAlt] = useState('');\n const savedSelection = useRef<Range | null>(null);\n\n // Inject global styles for contenteditable SYNCHRONOUSLY before paint\n useLayoutEffect(() => {\n const styleId = 'rich-text-editor-styles';\n if (!document.getElementById(styleId)) {\n const style = document.createElement('style');\n style.id = styleId;\n style.textContent = `\n [contenteditable]:empty:before {\n content: attr(data-placeholder);\n color: #9ca3af;\n pointer-events: none;\n }\n [contenteditable] h1 {\n font-size: 2em;\n font-weight: bold;\n margin: 0.67em 0;\n }\n [contenteditable] h2 {\n font-size: 1.5em;\n font-weight: bold;\n margin: 0.75em 0;\n }\n [contenteditable] h3 {\n font-size: 1.17em;\n font-weight: bold;\n margin: 0.83em 0;\n }\n [contenteditable] p {\n margin: 0.5em 0;\n }\n [contenteditable] p:first-child {\n margin-top: 0;\n }\n [contenteditable] p:last-child {\n margin-bottom: 0;\n }\n [contenteditable] ul, [contenteditable] ol {\n margin: 1em 0;\n padding-left: 2em;\n }\n [contenteditable] a {\n color: #3b82f6;\n text-decoration: underline;\n }\n .dark [contenteditable] a {\n color: #60a5fa;\n }\n [contenteditable] img {\n max-width: 100%;\n height: auto;\n border-radius: 0.5rem;\n margin: 1em 0;\n }\n [contenteditable] video {\n max-width: 100%;\n height: auto;\n border-radius: 0.5rem;\n margin: 1em 0;\n }\n `;\n document.head.appendChild(style);\n }\n }, []);\n\n // Track if this is the initial render and if we're updating internally\n const isInitialRender = useRef(true);\n const isInternalUpdate = useRef(false);\n\n // Set initial content on mount and configure editor\n useEffect(() => {\n if (isInitialRender.current && editorRef.current) {\n editorRef.current.innerHTML = value;\n isInitialRender.current = false;\n\n // Set default paragraph separator to use <p> instead of <div>\n try {\n document.execCommand('defaultParagraphSeparator', false, 'p');\n } catch (e) {\n console.warn('Could not set defaultParagraphSeparator', e);\n }\n }\n }, []);\n\n // Update content when value changes externally (not from user typing)\n useEffect(() => {\n if (!isInitialRender.current && !isInternalUpdate.current && editorRef.current) {\n const currentHtml = editorRef.current.innerHTML;\n if (currentHtml !== value) {\n // Save cursor position\n const selection = window.getSelection();\n const range = selection && selection.rangeCount > 0 ? selection.getRangeAt(0) : null;\n const preSelectionRange = range ? range.cloneRange() : null;\n\n if (preSelectionRange && editorRef.current.contains(preSelectionRange.startContainer)) {\n preSelectionRange.selectNodeContents(editorRef.current);\n preSelectionRange.setEnd(range!.startContainer, range!.startOffset);\n const start = preSelectionRange.toString().length;\n\n // Update content\n editorRef.current.innerHTML = value;\n\n // Restore cursor position\n const textNodes: Text[] = [];\n const getTextNodes = (node: Node) => {\n if (node.nodeType === Node.TEXT_NODE) {\n textNodes.push(node as Text);\n } else {\n node.childNodes.forEach(getTextNodes);\n }\n };\n getTextNodes(editorRef.current);\n\n let charCount = 0;\n let foundStart = false;\n\n for (const textNode of textNodes) {\n const textLength = textNode.textContent?.length || 0;\n if (!foundStart && charCount + textLength >= start) {\n const newRange = document.createRange();\n newRange.setStart(textNode, start - charCount);\n newRange.collapse(true);\n selection?.removeAllRanges();\n selection?.addRange(newRange);\n foundStart = true;\n break;\n }\n charCount += textLength;\n }\n } else {\n // No cursor position to save, just update content\n editorRef.current.innerHTML = value;\n }\n }\n }\n isInternalUpdate.current = false;\n }, [value]);\n\n // Update active formats\n const updateActiveFormats = useCallback(() => {\n const formats = new Set<string>();\n\n if (document.queryCommandState('bold')) formats.add('bold');\n if (document.queryCommandState('italic')) formats.add('italic');\n if (document.queryCommandState('underline')) formats.add('underline');\n if (document.queryCommandState('strikeThrough')) formats.add('strikeThrough');\n if (document.queryCommandState('insertUnorderedList')) formats.add('ul');\n if (document.queryCommandState('insertOrderedList')) formats.add('ol');\n\n // Check heading level\n const parentNode = window.getSelection()?.anchorNode?.parentElement;\n if (parentNode) {\n const tagName = parentNode.tagName.toLowerCase();\n if (['h1', 'h2', 'h3'].includes(tagName)) {\n formats.add(tagName);\n }\n }\n\n setActiveFormats(formats);\n }, []);\n\n const handleInput = useCallback(() => {\n if (editorRef.current && onChange) {\n isInternalUpdate.current = true;\n onChange(editorRef.current.innerHTML);\n }\n updateActiveFormats();\n }, [onChange, updateActiveFormats]);\n\n const handleFocus = useCallback(() => {\n setIsFocused(true);\n\n // Ensure editor starts with a <p> tag if empty\n if (editorRef.current && (!editorRef.current.innerHTML || editorRef.current.innerHTML === '')) {\n editorRef.current.innerHTML = '<p><br></p>';\n\n // Place cursor inside the <p>\n const selection = window.getSelection();\n const range = document.createRange();\n if (editorRef.current.firstChild) {\n range.setStart(editorRef.current.firstChild, 0);\n range.collapse(true);\n selection?.removeAllRanges();\n selection?.addRange(range);\n }\n }\n }, []);\n\n const handleFormat = useCallback((command: FormatCommand) => {\n if (disabled) return;\n document.execCommand(command, false);\n editorRef.current?.focus();\n updateActiveFormats();\n handleInput();\n }, [disabled, updateActiveFormats, handleInput]);\n\n const handleList = useCallback((command: BlockCommand) => {\n if (disabled) return;\n document.execCommand(command, false);\n editorRef.current?.focus();\n updateActiveFormats();\n handleInput();\n }, [disabled, updateActiveFormats, handleInput]);\n\n const handleHeading = useCallback((level: HeadingLevel) => {\n if (disabled) return;\n document.execCommand('formatBlock', false, level);\n editorRef.current?.focus();\n updateActiveFormats();\n handleInput();\n }, [disabled, updateActiveFormats, handleInput]);\n\n const handleLink = useCallback(() => {\n if (disabled) return;\n\n // Save current selection before opening modal\n const selection = window.getSelection();\n if (selection && selection.rangeCount > 0) {\n savedSelection.current = selection.getRangeAt(0).cloneRange();\n }\n\n setShowLinkModal(true);\n }, [disabled]);\n\n const insertLink = useCallback(() => {\n if (!linkUrl || !editorRef.current) return;\n\n const selection = window.getSelection();\n if (savedSelection.current && selection) {\n try {\n // Restore the saved selection\n selection.removeAllRanges();\n selection.addRange(savedSelection.current);\n\n // Insert link at saved position\n document.execCommand('createLink', false, linkUrl);\n\n savedSelection.current = null;\n } catch (e) {\n console.warn('Could not insert link at saved position', e);\n }\n }\n\n setShowLinkModal(false);\n setLinkUrl('');\n editorRef.current?.focus();\n handleInput();\n }, [linkUrl, handleInput]);\n\n const handleCode = useCallback(() => {\n if (disabled) return;\n const selection = window.getSelection();\n if (selection && selection.rangeCount > 0) {\n const range = selection.getRangeAt(0);\n const code = document.createElement('code');\n code.className = 'bg-[hsl(var(--muted))] px-1.5 py-0.5 rounded text-sm font-mono';\n\n try {\n range.surroundContents(code);\n handleInput();\n } catch (e) {\n console.warn('Could not apply code formatting');\n }\n }\n editorRef.current?.focus();\n }, [disabled, handleInput]);\n\n const handleImage = useCallback(() => {\n if (disabled) return;\n\n // Save current selection before opening modal\n const selection = window.getSelection();\n if (selection && selection.rangeCount > 0) {\n savedSelection.current = selection.getRangeAt(0).cloneRange();\n }\n\n setShowImageModal(true);\n }, [disabled]);\n\n const insertImage = useCallback(() => {\n if (!imageUrl || !editorRef.current) return;\n\n // Focus the editor first\n editorRef.current.focus();\n\n const img = document.createElement('img');\n img.src = imageUrl;\n img.alt = imageAlt || '';\n img.style.maxWidth = '100%';\n img.style.height = 'auto';\n\n const selection = window.getSelection();\n\n // Try to use saved selection if available and valid\n if (savedSelection.current && selection && editorRef.current.contains(savedSelection.current.commonAncestorContainer)) {\n try {\n selection.removeAllRanges();\n selection.addRange(savedSelection.current);\n\n savedSelection.current.deleteContents();\n savedSelection.current.insertNode(img);\n\n // Add line break after image\n const br = document.createElement('br');\n savedSelection.current.setStartAfter(img);\n savedSelection.current.insertNode(br);\n\n // Move cursor after line break\n savedSelection.current.setStartAfter(br);\n savedSelection.current.collapse(true);\n\n selection.removeAllRanges();\n selection.addRange(savedSelection.current);\n\n savedSelection.current = null;\n } catch (e) {\n console.warn('Could not insert at saved position', e);\n // Fallback to current selection or append\n if (selection.rangeCount > 0) {\n const range = selection.getRangeAt(0);\n if (editorRef.current.contains(range.commonAncestorContainer)) {\n range.insertNode(img);\n const br = document.createElement('br');\n range.setStartAfter(img);\n range.insertNode(br);\n range.setStartAfter(br);\n range.collapse(true);\n } else {\n editorRef.current.appendChild(img);\n editorRef.current.appendChild(document.createElement('br'));\n }\n } else {\n editorRef.current.appendChild(img);\n editorRef.current.appendChild(document.createElement('br'));\n }\n }\n } else {\n // No valid saved selection, try current selection\n if (selection && selection.rangeCount > 0) {\n const range = selection.getRangeAt(0);\n if (editorRef.current.contains(range.commonAncestorContainer)) {\n range.deleteContents();\n range.insertNode(img);\n const br = document.createElement('br');\n range.setStartAfter(img);\n range.insertNode(br);\n range.setStartAfter(br);\n range.collapse(true);\n selection.removeAllRanges();\n selection.addRange(range);\n } else {\n editorRef.current.appendChild(img);\n editorRef.current.appendChild(document.createElement('br'));\n }\n } else {\n // No selection at all, append to end\n editorRef.current.appendChild(img);\n editorRef.current.appendChild(document.createElement('br'));\n }\n }\n\n setShowImageModal(false);\n setImageUrl('');\n setImageAlt('');\n handleInput();\n }, [imageUrl, imageAlt, handleInput]);\n\n // Toolbar button base styles\n const getButtonClass = (isActive: boolean) => {\n const baseClass = themeName === 'minimalistic'\n ? 'border border-white text-white transition-colors'\n : 'border border-[hsl(var(--input))] text-[hsl(var(--foreground))] transition-colors';\n\n const activeClass = themeName === 'minimalistic'\n ? 'bg-white text-black'\n : 'bg-[hsl(var(--primary))]/20 border-[hsl(var(--primary))]';\n\n const hoverClass = themeName === 'minimalistic'\n ? 'hover:bg-white hover:text-black'\n : 'hover:bg-[hsl(var(--accent))]';\n\n const disabledClass = disabled ? 'opacity-50 cursor-not-allowed' : 'cursor-pointer';\n\n return `px-2.5 py-1.5 rounded text-sm font-medium ${baseClass} ${isActive ? activeClass : hoverClass} ${disabledClass}`;\n };\n\n // Editor base styles\n const editorBaseClass = themeName === 'minimalistic'\n ? 'bg-transparent border-2 border-white text-white placeholder:text-[hsl(var(--muted-foreground))]'\n : 'bg-[hsl(var(--card))] border border-[hsl(var(--input))] text-[hsl(var(--foreground))]';\n\n const focusClass = isFocused && !disabled\n ? themeName === 'minimalistic'\n ? 'border-white'\n : 'border-[hsl(var(--primary))] ring-1 ring-[hsl(var(--ring))]/50'\n : '';\n\n const errorClass = error\n ? 'border-red-500 dark:border-red-400'\n : '';\n\n return (\n <div className={`w-full ${className}`}>\n {label && (\n <label className=\"block text-sm font-medium text-[hsl(var(--foreground))] mb-2\">\n {label}\n </label>\n )}\n\n {/* Toolbar */}\n <div className={`rounded-t-lg border-b ${editorBaseClass} p-2 flex flex-wrap gap-1`}>\n {/* Text Formatting */}\n <div className=\"flex gap-1\">\n <button\n type=\"button\"\n onClick={() => handleFormat('bold')}\n className={getButtonClass(activeFormats.has('bold'))}\n disabled={disabled}\n title=\"Bold (Ctrl+B)\"\n >\n <svg className=\"w-4 h-4\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path d=\"M12.78 4c1.09 0 2.04.38 2.84 1.14.8.76 1.2 1.74 1.2 2.94 0 .9-.25 1.68-.76 2.36-.51.68-1.2 1.14-2.04 1.38v.08c1.06.22 1.89.7 2.48 1.44.59.74.88 1.64.88 2.7 0 1.34-.47 2.43-1.41 3.27C14.96 19.77 13.74 20 12.24 20H4V4h8.78zm-.66 7.14c.62 0 1.12-.18 1.5-.54.38-.36.57-.84.57-1.44 0-.6-.19-1.08-.57-1.44-.38-.36-.88-.54-1.5-.54H7.5v3.96h4.62zm.24 6.86c.68 0 1.24-.19 1.68-.57.44-.38.66-.9.66-1.56 0-.66-.22-1.18-.66-1.56-.44-.38-1-.57-1.68-.57H7.5v4.26h4.86z\"/>\n </svg>\n </button>\n <button\n type=\"button\"\n onClick={() => handleFormat('italic')}\n className={getButtonClass(activeFormats.has('italic'))}\n disabled={disabled}\n title=\"Italic (Ctrl+I)\"\n >\n <svg className=\"w-4 h-4\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path d=\"M11.59 4H16v2h-1.71l-3.58 8H13v2H8v-2h1.71l3.58-8H11.59V4z\"/>\n </svg>\n </button>\n <button\n type=\"button\"\n onClick={() => handleFormat('underline')}\n className={getButtonClass(activeFormats.has('underline'))}\n disabled={disabled}\n title=\"Underline (Ctrl+U)\"\n >\n <svg className=\"w-4 h-4\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path d=\"M10 16c-2.21 0-4-1.79-4-4V4h2v8c0 1.1.9 2 2 2s2-.9 2-2V4h2v8c0 2.21-1.79 4-4 4zM4 18h12v2H4v-2z\"/>\n </svg>\n </button>\n <button\n type=\"button\"\n onClick={() => handleFormat('strikeThrough')}\n className={getButtonClass(activeFormats.has('strikeThrough'))}\n disabled={disabled}\n title=\"Strikethrough\"\n >\n <svg className=\"w-4 h-4\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path d=\"M10 4c-2 0-3.5.5-4.5 1.5S4 7.5 4 9h2c0-.7.2-1.2.6-1.6.4-.4 1-.6 1.9-.6.8 0 1.4.2 1.8.5.4.3.7.8.7 1.4 0 .5-.2.9-.5 1.2-.3.3-.9.6-1.8.9l-.7.2c-1.2.3-2.1.7-2.7 1.2C4.2 12.7 4 13.5 4 14.5c0 1.1.4 2 1.1 2.6.7.6 1.7.9 3 .9 2.1 0 3.6-.5 4.6-1.5.9-1 1.3-2.3 1.3-3.8h-2c0 .9-.2 1.6-.7 2.1-.5.5-1.2.7-2.2.7-.8 0-1.4-.2-1.8-.5-.4-.3-.6-.8-.6-1.4 0-.5.2-.9.5-1.2.3-.3.9-.6 1.8-.9l.7-.2c1.2-.3 2.1-.7 2.7-1.2.6-.5.9-1.3.9-2.3 0-1.2-.4-2.1-1.2-2.8-.8-.7-1.9-1-3.3-1zM2 10h16v1H2v-1z\"/>\n </svg>\n </button>\n </div>\n\n <div className=\"w-px bg-[hsl(var(--border))] mx-1\" />\n\n {/* Headings */}\n <div className=\"flex gap-1\">\n <button\n type=\"button\"\n onClick={() => handleHeading('h1')}\n className={getButtonClass(activeFormats.has('h1'))}\n disabled={disabled}\n title=\"Heading 1\"\n >\n <svg className=\"w-4 h-4\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <text x=\"2\" y=\"16\" fontSize=\"14\" fontWeight=\"bold\">H1</text>\n </svg>\n </button>\n <button\n type=\"button\"\n onClick={() => handleHeading('h2')}\n className={getButtonClass(activeFormats.has('h2'))}\n disabled={disabled}\n title=\"Heading 2\"\n >\n <svg className=\"w-4 h-4\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <text x=\"2\" y=\"16\" fontSize=\"14\" fontWeight=\"bold\">H2</text>\n </svg>\n </button>\n <button\n type=\"button\"\n onClick={() => handleHeading('h3')}\n className={getButtonClass(activeFormats.has('h3'))}\n disabled={disabled}\n title=\"Heading 3\"\n >\n <svg className=\"w-4 h-4\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <text x=\"2\" y=\"16\" fontSize=\"14\" fontWeight=\"bold\">H3</text>\n </svg>\n </button>\n </div>\n\n <div className=\"w-px bg-[hsl(var(--border))] mx-1\" />\n\n {/* Lists */}\n <div className=\"flex gap-1\">\n <button\n type=\"button\"\n onClick={() => handleList('insertUnorderedList')}\n className={getButtonClass(activeFormats.has('ul'))}\n disabled={disabled}\n title=\"Bullet List\"\n >\n <svg className=\"w-4 h-4\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path d=\"M4 4h2v2H4V4zm4 0h8v2H8V4zM4 8h2v2H4V8zm4 0h8v2H8V8zm-4 4h2v2H4v-2zm4 0h8v2H8v-2zm-4 4h2v2H4v-2zm4 0h8v2H8v-2z\"/>\n </svg>\n </button>\n <button\n type=\"button\"\n onClick={() => handleList('insertOrderedList')}\n className={getButtonClass(activeFormats.has('ol'))}\n disabled={disabled}\n title=\"Numbered List\"\n >\n <svg className=\"w-4 h-4\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path d=\"M4 4h1v3H4V4zm0 4h1v1H3V8h2v1H4zm1 2H3v1h2v1H3v1h2v-3zM8 4h8v2H8V4zm0 4h8v2H8V8zm0 4h8v2H8v-2zm0 4h8v2H8v-2z\"/>\n </svg>\n </button>\n </div>\n\n <div className=\"w-px bg-[hsl(var(--border))] mx-1\" />\n\n {/* Link & Code */}\n <div className=\"flex gap-1\">\n <button\n type=\"button\"\n onClick={handleLink}\n className={getButtonClass(false)}\n disabled={disabled}\n title=\"Insert Link\"\n >\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1\" />\n </svg>\n </button>\n <button\n type=\"button\"\n onClick={handleImage}\n className={getButtonClass(false)}\n disabled={disabled}\n title=\"Insert Image/Video\"\n >\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 16l4.586-4.586a2 2 0 012.828 0L16 16m-2-2l1.586-1.586a2 2 0 012.828 0L20 14m-6-6h.01M6 20h12a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v12a2 2 0 002 2z\" />\n </svg>\n </button>\n <button\n type=\"button\"\n onClick={handleCode}\n className={getButtonClass(false)}\n disabled={disabled}\n title=\"Code\"\n >\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M10 20l4-16m4 4l4 4-4 4M6 16l-4-4 4-4\" />\n </svg>\n </button>\n </div>\n </div>\n\n {/* Editor Content */}\n <div\n ref={editorRef}\n contentEditable={!disabled}\n onInput={handleInput}\n onFocus={handleFocus}\n onBlur={() => setIsFocused(false)}\n onMouseUp={updateActiveFormats}\n onKeyUp={updateActiveFormats}\n className={`\n w-full px-4 py-3 rounded-b-lg outline-none overflow-y-auto\n ${editorBaseClass} ${focusClass} ${errorClass}\n ${disabled ? 'opacity-50 cursor-not-allowed' : ''}\n prose prose-sm dark:prose-invert max-w-none\n `}\n style={{\n minHeight,\n maxHeight,\n }}\n data-placeholder={placeholder}\n suppressContentEditableWarning\n />\n\n {/* Helper/Error Text */}\n {error && (\n <p className=\"mt-1 text-sm text-red-600 dark:text-red-400\">{error}</p>\n )}\n {helperText && !error && (\n <p className=\"mt-1 text-sm text-[hsl(var(--muted-foreground))]\">{helperText}</p>\n )}\n\n {/* Link Modal */}\n <Modal\n isOpen={showLinkModal}\n onClose={() => {\n setShowLinkModal(false);\n setLinkUrl('');\n }}\n title=\"Insert Link\"\n size=\"sm\"\n >\n <div className=\"space-y-4\">\n <TextInput\n label=\"URL\"\n value={linkUrl}\n onChange={(e) => setLinkUrl(e.target.value)}\n placeholder=\"https://example.com\"\n autoFocus\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n insertLink();\n }\n }}\n />\n <div className=\"flex gap-2 justify-end\">\n <Button\n variant=\"secondary\"\n onClick={() => {\n setShowLinkModal(false);\n setLinkUrl('');\n }}\n >\n Cancel\n </Button>\n <Button\n variant=\"primary\"\n onClick={insertLink}\n disabled={!linkUrl}\n >\n Insert\n </Button>\n </div>\n </div>\n </Modal>\n\n {/* Image Modal */}\n <Modal\n isOpen={showImageModal}\n onClose={() => {\n setShowImageModal(false);\n setImageUrl('');\n setImageAlt('');\n }}\n title=\"Insert Image\"\n size=\"sm\"\n >\n <div className=\"space-y-4\">\n <TextInput\n label=\"Image URL\"\n value={imageUrl}\n onChange={(e) => setImageUrl(e.target.value)}\n placeholder=\"https://example.com/image.jpg\"\n autoFocus\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n insertImage();\n }\n }}\n />\n\n <TextInput\n label=\"Alt Text (optional)\"\n value={imageAlt}\n onChange={(e) => setImageAlt(e.target.value)}\n placeholder=\"Describe the image\"\n />\n\n <div className=\"flex gap-2 justify-end\">\n <Button\n variant=\"secondary\"\n onClick={() => {\n setShowImageModal(false);\n setImageUrl('');\n setImageAlt('');\n }}\n >\n Cancel\n </Button>\n <Button\n variant=\"primary\"\n onClick={insertImage}\n disabled={!imageUrl}\n >\n Insert\n </Button>\n </div>\n </div>\n </Modal>\n </div>\n );\n};\n","\"use client\";\n\nimport React, { createContext, useContext, useState, useCallback } from 'react';\nimport { CheckIcon, CloseIcon } from '../icons';\n\nexport interface Toast {\n id: string;\n message: string;\n type?: 'success' | 'error' | 'warning' | 'info';\n duration?: number;\n}\n\ninterface ToastContextValue {\n toasts: Toast[];\n addToast: (toast: Omit<Toast, 'id'>) => void;\n removeToast: (id: string) => void;\n}\n\nconst ToastContext = createContext<ToastContextValue | undefined>(undefined);\n\nexport const useToast = () => {\n const context = useContext(ToastContext);\n if (!context) {\n throw new Error('useToast must be used within a ToastProvider');\n }\n return context;\n};\n\nexport interface ToastProviderProps {\n children: React.ReactNode;\n position?: 'top-right' | 'top-left' | 'bottom-right' | 'bottom-left' | 'top-center' | 'bottom-center';\n}\n\nexport const ToastProvider: React.FC<ToastProviderProps> = ({ children, position = 'top-right' }) => {\n const [toasts, setToasts] = useState<Toast[]>([]);\n\n const addToast = useCallback((toast: Omit<Toast, 'id'>) => {\n const id = Math.random().toString(36).substring(7);\n const newToast = { ...toast, id };\n setToasts((prev) => [...prev, newToast]);\n\n // Auto-remove after duration\n const duration = toast.duration || 5000;\n setTimeout(() => {\n removeToast(id);\n }, duration);\n }, []);\n\n const removeToast = useCallback((id: string) => {\n setToasts((prev) => prev.filter((toast) => toast.id !== id));\n }, []);\n\n const positionClasses = {\n 'top-right': 'top-4 right-4',\n 'top-left': 'top-4 left-4',\n 'bottom-right': 'bottom-4 right-4',\n 'bottom-left': 'bottom-4 left-4',\n 'top-center': 'top-4 left-1/2 -translate-x-1/2',\n 'bottom-center': 'bottom-4 left-1/2 -translate-x-1/2',\n };\n\n return (\n <ToastContext.Provider value={{ toasts, addToast, removeToast }}>\n {children}\n <div className={`fixed ${positionClasses[position]} z-50 flex flex-col gap-2 max-w-md`}>\n {toasts.map((toast) => (\n <ToastItem key={toast.id} toast={toast} onClose={() => removeToast(toast.id)} />\n ))}\n </div>\n </ToastContext.Provider>\n );\n};\n\ninterface ToastItemProps {\n toast: Toast;\n onClose: () => void;\n}\n\nconst ToastItem: React.FC<ToastItemProps> = ({ toast, onClose }) => {\n const typeStyles = {\n success: 'bg-[hsl(var(--success))]/10 border-[hsl(var(--success))] text-[hsl(var(--success))]',\n error: 'bg-[hsl(var(--destructive))]/10 border-[hsl(var(--destructive))] text-[hsl(var(--destructive))]',\n warning: 'bg-[hsl(var(--warning))]/10 border-[hsl(var(--warning))] text-[hsl(var(--warning))]',\n info: 'bg-[hsl(var(--info))]/10 border-[hsl(var(--info))] text-[hsl(var(--info))]',\n };\n\n const typeIcons = {\n success: <CheckIcon size=\"sm\" className=\"text-[hsl(var(--success))]\" />,\n error: <CloseIcon size=\"sm\" className=\"text-[hsl(var(--destructive))]\" />,\n warning: (\n <svg className=\"w-4 h-4 text-[hsl(var(--warning))]\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fillRule=\"evenodd\" d=\"M8.257 3.099c.765-1.36 2.722-1.36 3.486 0l5.58 9.92c.75 1.334-.213 2.98-1.742 2.98H4.42c-1.53 0-2.493-1.646-1.743-2.98l5.58-9.92zM11 13a1 1 0 11-2 0 1 1 0 012 0zm-1-8a1 1 0 00-1 1v3a1 1 0 002 0V6a1 1 0 00-1-1z\" clipRule=\"evenodd\" />\n </svg>\n ),\n info: (\n <svg className=\"w-4 h-4 text-[hsl(var(--info))]\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fillRule=\"evenodd\" d=\"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a1 1 0 000 2v3a1 1 0 001 1h1a1 1 0 100-2v-3a1 1 0 00-1-1H9z\" clipRule=\"evenodd\" />\n </svg>\n ),\n };\n\n const type = toast.type || 'info';\n\n return (\n <div\n className={`flex items-start gap-3 p-4 rounded-md border-l-4 shadow-lg bg-[hsl(var(--card))] ${typeStyles[type]} animate-slide-in`}\n role=\"alert\"\n >\n <div className=\"flex-shrink-0 mt-0.5\">{typeIcons[type]}</div>\n <p className=\"flex-1 text-sm font-medium text-[hsl(var(--foreground))]\">{toast.message}</p>\n <button\n onClick={onClose}\n className=\"flex-shrink-0 text-[hsl(var(--muted-foreground))] hover:text-[hsl(var(--foreground))] transition-colors\"\n aria-label=\"Close\"\n >\n <CloseIcon size=\"sm\" />\n </button>\n </div>\n );\n};\n\n// Helper function to easily show toasts\nexport const toast = {\n success: (message: string, duration?: number) => ({\n message,\n type: 'success' as const,\n duration,\n }),\n error: (message: string, duration?: number) => ({\n message,\n type: 'error' as const,\n duration,\n }),\n warning: (message: string, duration?: number) => ({\n message,\n type: 'warning' as const,\n duration,\n }),\n info: (message: string, duration?: number) => ({\n message,\n type: 'info' as const,\n duration,\n }),\n};\n","\"use client\";\n\nimport React from 'react';\nimport { CheckIcon } from '../icons';\n\nexport interface Step {\n label: string;\n description?: string;\n}\n\nexport interface StepperProps {\n steps: Step[];\n currentStep: number;\n orientation?: 'horizontal' | 'vertical';\n className?: string;\n compact?: boolean; // Show fewer steps on small screens\n}\n\nexport const Stepper: React.FC<StepperProps> = ({\n steps,\n currentStep,\n orientation = 'horizontal',\n className = '',\n compact = false,\n}) => {\n const isHorizontal = orientation === 'horizontal';\n\n // Determine which steps to show based on screen size and compact mode\n const getStepVisibility = (index: number) => {\n if (!isHorizontal || steps.length <= 3) {\n return { mobile: true, desktop: true };\n }\n\n const stepNumber = index + 1;\n const distance = Math.abs(stepNumber - currentStep);\n\n // Mobile (automatic compact): show current step ± 1\n const mobileVisible = distance <= 1;\n\n // Desktop: show all steps unless compact is explicitly true\n const desktopVisible = !compact;\n\n return { mobile: mobileVisible, desktop: desktopVisible };\n };\n\n const shouldShowCounter = isHorizontal && steps.length > 3;\n\n return (\n <div className={`${isHorizontal ? 'flex items-start w-full' : 'flex flex-col'} ${className}`}>\n {/* Step counter - visible on mobile when compact mode is active */}\n {shouldShowCounter && (\n <div className=\"md:hidden flex items-center mr-4 flex-shrink-0\">\n <span className=\"text-sm font-medium text-[hsl(var(--muted-foreground))]\">\n {currentStep}/{steps.length}\n </span>\n </div>\n )}\n\n {steps.map((step, index) => {\n const stepNumber = index + 1;\n const isActive = stepNumber === currentStep;\n const isCompleted = stepNumber < currentStep;\n const isLast = index === steps.length - 1;\n\n const visibility = getStepVisibility(index);\n\n // Determine if this is the last visible step on mobile\n const visibleMobileSteps = steps.filter((_, i) => getStepVisibility(i).mobile);\n const isLastVisibleMobile = index === steps.map((_, i) => i).filter(i => getStepVisibility(i).mobile).slice(-1)[0];\n\n return (\n <React.Fragment key={index}>\n {/* Step - responsive visibility */}\n <div className={`\n flex ${isHorizontal ? 'flex-col items-center flex-shrink-0' : 'flex-row items-start'}\n ${isHorizontal ? '' : isLast ? '' : 'mb-6'}\n ${!visibility.mobile ? 'hidden md:flex' : ''}\n ${!visibility.desktop && visibility.mobile ? 'md:hidden' : ''}\n `}>\n <div className={`flex ${isHorizontal ? 'flex-col items-center' : 'flex-col items-center flex-shrink-0'}`}>\n {/* Circle/Check */}\n <div\n className={`flex items-center justify-center w-10 h-10 rounded-full border-2 transition-all ${\n isCompleted\n ? 'bg-[hsl(var(--primary))] border-[hsl(var(--primary))]'\n : isActive\n ? 'border-[hsl(var(--primary))] bg-[hsl(var(--background))]'\n : 'border-[hsl(var(--border))] bg-[hsl(var(--background))]'\n }`}\n >\n {isCompleted ? (\n <CheckIcon size=\"sm\" className=\"text-[hsl(var(--primary-foreground))]\" />\n ) : (\n <span\n className={`text-sm font-semibold ${\n isActive\n ? 'text-[hsl(var(--primary))]'\n : 'text-[hsl(var(--muted-foreground))]'\n }`}\n >\n {stepNumber}\n </span>\n )}\n </div>\n\n {/* Connector Line for Vertical */}\n {!isLast && !isHorizontal && (\n <div\n className={`w-0.5 flex-1 min-h-[24px] ${\n isCompleted\n ? 'bg-[hsl(var(--primary))]'\n : 'bg-[hsl(var(--border))]'\n }`}\n />\n )}\n </div>\n\n {/* Label */}\n <div className={`${isHorizontal ? 'mt-3 text-center' : 'ml-4 flex-1 min-h-[40px] flex flex-col justify-center'}`}>\n <p\n className={`text-sm font-medium whitespace-nowrap ${\n isActive || isCompleted\n ? 'text-[hsl(var(--foreground))]'\n : 'text-[hsl(var(--muted-foreground))]'\n }`}\n >\n {step.label}\n </p>\n {step.description && (\n <p className=\"text-xs text-[hsl(var(--muted-foreground))] mt-1 whitespace-nowrap\">\n {step.description}\n </p>\n )}\n </div>\n </div>\n\n {/* Connector Line for Horizontal - responsive visibility */}\n {!isLast && isHorizontal && (\n <div className={`\n flex items-start pt-5 mx-4 min-w-[80px] max-w-[200px] flex-1\n ${!visibility.mobile || isLastVisibleMobile ? 'hidden md:flex' : ''}\n ${!visibility.desktop && visibility.mobile ? 'md:hidden' : ''}\n `}>\n <div\n className={`h-0.5 w-full ${\n isCompleted\n ? 'bg-[hsl(var(--primary))]'\n : 'bg-[hsl(var(--border))]'\n }`}\n />\n </div>\n )}\n </React.Fragment>\n );\n })}\n </div>\n );\n};\n","\"use client\";\n\nimport React from 'react';\n\nexport interface DividerProps {\n orientation?: 'horizontal' | 'vertical';\n variant?: 'solid' | 'dashed' | 'dotted';\n className?: string;\n label?: string;\n labelPosition?: 'left' | 'center' | 'right';\n}\n\nexport const Divider: React.FC<DividerProps> = ({\n orientation = 'horizontal',\n variant = 'solid',\n className = '',\n label,\n labelPosition = 'center',\n}) => {\n const variantClasses = {\n solid: 'border-solid',\n dashed: 'border-dashed',\n dotted: 'border-dotted',\n };\n\n if (label && orientation === 'horizontal') {\n const alignmentClasses = {\n left: 'justify-start',\n center: 'justify-center',\n right: 'justify-end',\n };\n\n return (\n <div className={`flex items-center ${alignmentClasses[labelPosition]} ${className}`} role=\"separator\">\n {labelPosition !== 'left' && (\n <div className={`flex-1 border-t ${variantClasses[variant]} border-[hsl(var(--input))]`} />\n )}\n <span className=\"px-4 text-sm text-[hsl(var(--muted-foreground))]\">\n {label}\n </span>\n {labelPosition !== 'right' && (\n <div className={`flex-1 border-t ${variantClasses[variant]} border-[hsl(var(--input))]`} />\n )}\n </div>\n );\n }\n\n if (orientation === 'vertical') {\n return (\n <div\n className={`inline-block h-full border-l ${variantClasses[variant]} border-[hsl(var(--input))] ${className}`}\n role=\"separator\"\n aria-orientation=\"vertical\"\n />\n );\n }\n\n return (\n <hr\n className={`border-t ${variantClasses[variant]} border-[hsl(var(--input))] ${className}`}\n role=\"separator\"\n />\n );\n};\n","\"use client\";\n\nimport React, { useRef, useState } from 'react';\nimport { UploadIcon, CloseIcon } from '../icons';\n\nexport interface FileUploadProps {\n accept?: string;\n multiple?: boolean;\n maxSize?: number; // in bytes\n maxFiles?: number;\n disabled?: boolean;\n onChange?: (files: File[]) => void;\n onError?: (error: string) => void;\n className?: string;\n label?: string;\n helperText?: string;\n}\n\nexport const FileUpload: React.FC<FileUploadProps> = ({\n accept,\n multiple = false,\n maxSize,\n maxFiles = 10,\n disabled = false,\n onChange,\n onError,\n className = '',\n label,\n helperText,\n}) => {\n const [files, setFiles] = useState<File[]>([]);\n const [isDragging, setIsDragging] = useState(false);\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n const formatFileSize = (bytes: number): string => {\n if (bytes === 0) return '0 Bytes';\n const k = 1024;\n const sizes = ['Bytes', 'KB', 'MB', 'GB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return Math.round(bytes / Math.pow(k, i) * 100) / 100 + ' ' + sizes[i];\n };\n\n const validateFiles = (fileList: FileList): File[] => {\n const validFiles: File[] = [];\n const filesArray = Array.from(fileList);\n\n // Check max files\n if (filesArray.length + files.length > maxFiles) {\n onError?.(`Maximum ${maxFiles} files allowed`);\n return validFiles;\n }\n\n for (const file of filesArray) {\n // Check file size\n if (maxSize && file.size > maxSize) {\n onError?.(`File ${file.name} exceeds maximum size of ${formatFileSize(maxSize)}`);\n continue;\n }\n\n validFiles.push(file);\n }\n\n return validFiles;\n };\n\n const handleFiles = (fileList: FileList | null) => {\n if (!fileList || disabled) return;\n\n const validFiles = validateFiles(fileList);\n if (validFiles.length > 0) {\n const newFiles = multiple ? [...files, ...validFiles] : validFiles;\n setFiles(newFiles);\n onChange?.(newFiles);\n }\n };\n\n const handleDrop = (e: React.DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n setIsDragging(false);\n handleFiles(e.dataTransfer.files);\n };\n\n const handleDragOver = (e: React.DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n if (!disabled) {\n setIsDragging(true);\n }\n };\n\n const handleDragLeave = (e: React.DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n setIsDragging(false);\n };\n\n const handleClick = () => {\n if (!disabled) {\n fileInputRef.current?.click();\n }\n };\n\n const handleRemoveFile = (index: number) => {\n const newFiles = files.filter((_, i) => i !== index);\n setFiles(newFiles);\n onChange?.(newFiles);\n };\n\n return (\n <div className={`w-full ${className}`}>\n {label && (\n <label className=\"block text-sm font-medium text-[hsl(var(--foreground))] mb-2\">\n {label}\n </label>\n )}\n\n <div\n onDrop={handleDrop}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onClick={handleClick}\n className={`relative border-2 border-dashed rounded-lg p-8 text-center cursor-pointer transition-all ${\n isDragging\n ? 'border-[hsl(var(--primary))] bg-[hsl(var(--primary))]/10'\n : 'border-[hsl(var(--input))] hover:border-[hsl(var(--muted-foreground))]'\n } ${disabled ? 'opacity-50 cursor-not-allowed' : ''}`}\n >\n <input\n ref={fileInputRef}\n type=\"file\"\n accept={accept}\n multiple={multiple}\n onChange={(e) => handleFiles(e.target.files)}\n disabled={disabled}\n className=\"hidden\"\n />\n\n <div className=\"flex flex-col items-center gap-2\">\n <div className=\"w-12 h-12 rounded-full bg-[hsl(var(--muted))] flex items-center justify-center\">\n <UploadIcon size=\"lg\" className=\"text-[hsl(var(--muted-foreground))]\" />\n </div>\n <div>\n <p className=\"text-sm font-medium text-[hsl(var(--foreground))]\">\n <span className=\"text-[hsl(var(--primary))]\">Click to upload</span> or drag and drop\n </p>\n <p className=\"text-xs text-[hsl(var(--muted-foreground))] mt-1\">\n {accept ? `Accepted: ${accept}` : 'Any file type'}\n {maxSize && ` • Max size: ${formatFileSize(maxSize)}`}\n </p>\n </div>\n </div>\n </div>\n\n {helperText && (\n <p className=\"mt-2 text-sm text-[hsl(var(--muted-foreground))]\">{helperText}</p>\n )}\n\n {/* File List */}\n {files.length > 0 && (\n <div className=\"mt-4 space-y-2\">\n {files.map((file, index) => (\n <div\n key={index}\n className=\"flex items-center justify-between p-3 bg-[hsl(var(--muted))] rounded-lg border border-[hsl(var(--border))]\"\n >\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium text-[hsl(var(--foreground))] truncate\">\n {file.name}\n </p>\n <p className=\"text-xs text-[hsl(var(--muted-foreground))]\">\n {formatFileSize(file.size)}\n </p>\n </div>\n <button\n onClick={(e) => {\n e.stopPropagation();\n handleRemoveFile(index);\n }}\n className=\"ml-4 text-[hsl(var(--muted-foreground))] hover:text-[hsl(var(--destructive))] transition-colors\"\n aria-label=\"Remove file\"\n >\n <CloseIcon size=\"sm\" />\n </button>\n </div>\n ))}\n </div>\n )}\n </div>\n );\n};\n","\"use client\";\n\nimport React, { useRef, useState, useEffect } from 'react';\nimport { PlayIcon } from '../icons/PlayIcon';\nimport { PauseIcon } from '../icons/PauseIcon';\nimport { SkipBackIcon } from '../icons/SkipBackIcon';\nimport { SkipForwardIcon } from '../icons/SkipForwardIcon';\nimport { VolumeUpIcon } from '../icons/VolumeUpIcon';\nimport { VolumeOffIcon } from '../icons/VolumeOffIcon';\nimport { Button } from './Button';\n\nexport interface Chapter {\n title: string;\n startTime: number;\n}\n\nexport interface AudioPlayerProps {\n src: string;\n title?: string;\n artist?: string;\n album?: string;\n coverArt?: string;\n variant?: 'default' | 'compact' | 'mini';\n autoPlay?: boolean;\n loop?: boolean;\n preload?: 'none' | 'metadata' | 'auto';\n onPlay?: () => void;\n onPause?: () => void;\n onEnded?: () => void;\n onTimeUpdate?: (currentTime: number) => void;\n className?: string;\n showSkipButtons?: boolean;\n onSkipBack?: () => void;\n onSkipForward?: () => void;\n chapters?: Chapter[];\n showChapters?: boolean;\n onChapterChange?: (chapter: Chapter) => void;\n}\n\nexport const AudioPlayer: React.FC<AudioPlayerProps> = ({\n src,\n title,\n artist,\n album,\n coverArt,\n variant = 'default',\n autoPlay = false,\n loop = false,\n preload = 'metadata',\n onPlay,\n onPause,\n onEnded,\n onTimeUpdate,\n className = '',\n showSkipButtons = false,\n onSkipBack,\n onSkipForward,\n chapters = [],\n showChapters = true,\n onChapterChange,\n}) => {\n const audioRef = useRef<HTMLAudioElement>(null);\n const [isPlaying, setIsPlaying] = useState(false);\n const [currentTime, setCurrentTime] = useState(0);\n const [duration, setDuration] = useState(0);\n const [volume, setVolume] = useState(1);\n const [isMuted, setIsMuted] = useState(false);\n const [isLoading, setIsLoading] = useState(true);\n const [currentChapter, setCurrentChapter] = useState<Chapter | null>(null);\n const [showChapterList, setShowChapterList] = useState(false);\n const [hoveredChapter, setHoveredChapter] = useState<Chapter | null>(null);\n const [hoverPosition, setHoverPosition] = useState({ x: 0, y: 0 });\n\n useEffect(() => {\n const audio = audioRef.current;\n if (!audio) return;\n\n const handleLoadedMetadata = () => {\n setDuration(audio.duration);\n setIsLoading(false);\n };\n\n const handleCanPlay = () => {\n setIsLoading(false);\n };\n\n const handleTimeUpdate = () => {\n setCurrentTime(audio.currentTime);\n onTimeUpdate?.(audio.currentTime);\n\n // Update current chapter\n if (chapters.length > 0) {\n const chapter = getCurrentChapter(audio.currentTime);\n if (chapter && chapter !== currentChapter) {\n setCurrentChapter(chapter);\n onChapterChange?.(chapter);\n }\n }\n };\n\n const handleEnded = () => {\n setIsPlaying(false);\n onEnded?.();\n };\n\n const handlePlay = () => {\n setIsPlaying(true);\n onPlay?.();\n };\n\n const handlePause = () => {\n setIsPlaying(false);\n onPause?.();\n };\n\n const handleError = (e: Event) => {\n console.error('Audio error:', e);\n setIsPlaying(false);\n setIsLoading(false);\n };\n\n const handleLoadStart = () => {\n setIsLoading(true);\n };\n\n audio.addEventListener('loadstart', handleLoadStart);\n audio.addEventListener('loadedmetadata', handleLoadedMetadata);\n audio.addEventListener('canplay', handleCanPlay);\n audio.addEventListener('timeupdate', handleTimeUpdate);\n audio.addEventListener('ended', handleEnded);\n audio.addEventListener('play', handlePlay);\n audio.addEventListener('pause', handlePause);\n audio.addEventListener('error', handleError);\n\n // Trigger load if audio is ready\n if (audio.readyState >= 2) {\n setIsLoading(false);\n setDuration(audio.duration);\n }\n\n return () => {\n audio.removeEventListener('loadstart', handleLoadStart);\n audio.removeEventListener('loadedmetadata', handleLoadedMetadata);\n audio.removeEventListener('canplay', handleCanPlay);\n audio.removeEventListener('timeupdate', handleTimeUpdate);\n audio.removeEventListener('ended', handleEnded);\n audio.removeEventListener('play', handlePlay);\n audio.removeEventListener('pause', handlePause);\n audio.removeEventListener('error', handleError);\n };\n }, [onPlay, onPause, onEnded, onTimeUpdate]);\n\n // Separate effect for src changes\n useEffect(() => {\n const audio = audioRef.current;\n if (!audio) return;\n\n // Load the new audio source\n audio.load();\n }, [src]);\n\n const togglePlayPause = async () => {\n const audio = audioRef.current;\n if (!audio) return;\n\n try {\n if (isPlaying) {\n audio.pause();\n } else {\n await audio.play();\n }\n } catch (error) {\n console.error('Playback error:', error);\n setIsPlaying(false);\n }\n };\n\n const handleSeek = (e: React.ChangeEvent<HTMLInputElement>) => {\n const audio = audioRef.current;\n if (!audio) return;\n\n const time = parseFloat(e.target.value);\n audio.currentTime = time;\n setCurrentTime(time);\n };\n\n const handleVolumeChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const audio = audioRef.current;\n if (!audio) return;\n\n const vol = parseFloat(e.target.value);\n audio.volume = vol;\n setVolume(vol);\n setIsMuted(vol === 0);\n };\n\n const toggleMute = () => {\n const audio = audioRef.current;\n if (!audio) return;\n\n if (isMuted) {\n audio.volume = volume || 0.5;\n setIsMuted(false);\n } else {\n audio.volume = 0;\n setIsMuted(true);\n }\n };\n\n const formatTime = (time: number): string => {\n if (!isFinite(time)) return '0:00';\n const minutes = Math.floor(time / 60);\n const seconds = Math.floor(time % 60);\n return `${minutes}:${seconds.toString().padStart(2, '0')}`;\n };\n\n const getCurrentChapter = (time: number): Chapter | null => {\n if (chapters.length === 0) return null;\n\n // Find the chapter that the current time falls into\n for (let i = chapters.length - 1; i >= 0; i--) {\n if (time >= chapters[i].startTime) {\n return chapters[i];\n }\n }\n return chapters[0];\n };\n\n const jumpToChapter = (chapter: Chapter) => {\n const audio = audioRef.current;\n if (!audio) return;\n\n audio.currentTime = chapter.startTime;\n setCurrentTime(chapter.startTime);\n setShowChapterList(false);\n };\n\n const handleSkipBack = () => {\n const audio = audioRef.current;\n if (!audio) return;\n\n if (onSkipBack) {\n onSkipBack();\n } else {\n audio.currentTime = Math.max(0, audio.currentTime - 10);\n }\n };\n\n const handleSkipForward = () => {\n const audio = audioRef.current;\n if (!audio) return;\n\n if (onSkipForward) {\n onSkipForward();\n } else {\n audio.currentTime = Math.min(duration, audio.currentTime + 10);\n }\n };\n\n const progress = duration > 0 ? (currentTime / duration) * 100 : 0;\n\n // Mini variant - just play button and title\n if (variant === 'mini') {\n return (\n <div className={`flex items-center gap-2 p-2 bg-[hsl(var(--card))] rounded-lg border border-[hsl(var(--border))] ${className}`}>\n <audio ref={audioRef} src={src} preload={preload} loop={loop} autoPlay={autoPlay} />\n <Button\n iconOnly\n size=\"sm\"\n variant=\"primary\"\n onClick={togglePlayPause}\n disabled={isLoading}\n aria-label={isPlaying ? 'Pause' : 'Play'}\n >\n {isPlaying ? <PauseIcon size=\"sm\" /> : <PlayIcon size=\"sm\" />}\n </Button>\n {title && (\n <span className=\"text-sm font-medium text-[hsl(var(--foreground))] truncate\">\n {title}\n </span>\n )}\n </div>\n );\n }\n\n // Compact variant - single row layout\n if (variant === 'compact') {\n return (\n <div className={`flex items-center gap-3 p-3 bg-[hsl(var(--card))] rounded-lg border border-[hsl(var(--border))] shadow-sm ${className}`}>\n <audio ref={audioRef} src={src} preload={preload} loop={loop} autoPlay={autoPlay} />\n\n {/* Play/Pause Button */}\n <Button\n iconOnly\n size=\"md\"\n variant=\"primary\"\n onClick={togglePlayPause}\n disabled={isLoading}\n aria-label={isPlaying ? 'Pause' : 'Play'}\n >\n {isPlaying ? <PauseIcon size=\"md\" /> : <PlayIcon size=\"md\" />}\n </Button>\n\n {/* Track Info */}\n <div className=\"flex-1 min-w-0\">\n {title && (\n <div className=\"text-sm font-medium text-[hsl(var(--foreground))] truncate\">\n {title}\n </div>\n )}\n {artist && (\n <div className=\"text-xs text-[hsl(var(--muted-foreground))] truncate\">\n {artist}\n </div>\n )}\n </div>\n\n {/* Progress Bar */}\n <div className=\"flex items-center gap-2 flex-1\">\n <span className=\"text-xs text-[hsl(var(--muted-foreground))] tabular-nums\">\n {formatTime(currentTime)}\n </span>\n <div className=\"relative flex-1 h-1.5 bg-[hsl(var(--muted))] rounded-full overflow-visible\">\n <div\n className=\"absolute h-full bg-[hsl(var(--primary))] rounded-full transition-all\"\n style={{ width: `${progress}%` }}\n />\n {/* Chapter Markers */}\n {showChapters && chapters.length > 0 && chapters.map((chapter, index) => {\n const markerPosition = duration > 0 ? (chapter.startTime / duration) * 100 : 0;\n return (\n <div\n key={index}\n className=\"absolute top-0 bottom-0 w-1 -ml-0.5 bg-[hsl(var(--background))] opacity-70 hover:opacity-100 hover:w-1.5 hover:-ml-0.5 cursor-pointer z-10 transition-all\"\n style={{ left: `${markerPosition}%` }}\n onClick={() => jumpToChapter(chapter)}\n onMouseEnter={(e) => {\n setHoveredChapter(chapter);\n const rect = e.currentTarget.getBoundingClientRect();\n setHoverPosition({ x: rect.left + rect.width / 2, y: rect.top });\n }}\n onMouseLeave={() => setHoveredChapter(null)}\n />\n );\n })}\n <input\n type=\"range\"\n min={0}\n max={duration || 0}\n value={currentTime}\n onChange={handleSeek}\n disabled={isLoading}\n className=\"absolute inset-0 w-full h-full opacity-0 cursor-pointer disabled:cursor-not-allowed z-20\"\n aria-label=\"Seek\"\n />\n </div>\n <span className=\"text-xs text-[hsl(var(--muted-foreground))] tabular-nums\">\n {formatTime(duration)}\n </span>\n {currentChapter && showChapters && (\n <span className=\"text-xs text-[hsl(var(--primary))] font-medium truncate max-w-[120px]\">\n • {currentChapter.title}\n </span>\n )}\n </div>\n\n {/* Volume */}\n <div className=\"flex items-center gap-2\">\n <button\n onClick={toggleMute}\n className=\"text-[hsl(var(--muted-foreground))] hover:text-[hsl(var(--foreground))]\"\n aria-label={isMuted ? 'Unmute' : 'Mute'}\n >\n {isMuted ? <VolumeOffIcon size=\"sm\" /> : <VolumeUpIcon size=\"sm\" />}\n </button>\n <input\n type=\"range\"\n min={0}\n max={1}\n step={0.01}\n value={isMuted ? 0 : volume}\n onChange={handleVolumeChange}\n className=\"w-16 h-1.5 bg-[hsl(var(--muted))] rounded-full appearance-none cursor-pointer\n [&::-webkit-slider-thumb]:appearance-none [&::-webkit-slider-thumb]:w-3 [&::-webkit-slider-thumb]:h-3\n [&::-webkit-slider-thumb]:rounded-full [&::-webkit-slider-thumb]:bg-[hsl(var(--primary))] [&::-webkit-slider-thumb]:cursor-pointer\n [&::-moz-range-thumb]:w-3 [&::-moz-range-thumb]:h-3 [&::-moz-range-thumb]:rounded-full\n [&::-moz-range-thumb]:bg-[hsl(var(--primary))] [&::-moz-range-thumb]:cursor-pointer [&::-moz-range-thumb]:border-none\"\n aria-label=\"Volume\"\n />\n </div>\n\n {/* Chapter Hover Tooltip */}\n {hoveredChapter && showChapters && (\n <div\n className=\"fixed z-50 px-3 py-2 bg-[hsl(var(--popover))] text-white text-xs font-medium rounded shadow-lg pointer-events-none transform -translate-x-1/2 -translate-y-full\"\n style={{ left: hoverPosition.x, top: hoverPosition.y - 8 }}\n >\n <div className=\"whitespace-nowrap\">{hoveredChapter.title}</div>\n <div className=\"text-[hsl(var(--muted-foreground))] text-[10px] mt-0.5\">{formatTime(hoveredChapter.startTime)}</div>\n <div className=\"absolute left-1/2 -bottom-1 w-2 h-2 bg-[hsl(var(--popover))] transform -translate-x-1/2 rotate-45\" />\n </div>\n )}\n </div>\n );\n }\n\n // Default variant - full featured player\n return (\n <div className={`bg-[hsl(var(--card))] rounded-lg border border-[hsl(var(--border))] shadow-md overflow-hidden ${className}`}>\n <audio ref={audioRef} src={src} preload={preload} loop={loop} autoPlay={autoPlay} />\n\n {/* Header with artwork and track info */}\n <div className=\"flex items-center gap-4 p-4 border-b border-[hsl(var(--border))]\">\n {coverArt && (\n <div className=\"w-16 h-16 flex-shrink-0 rounded-md overflow-hidden bg-[hsl(var(--muted))]\">\n <img\n src={coverArt}\n alt={`${title || 'Track'} cover art`}\n className=\"w-full h-full object-cover\"\n />\n </div>\n )}\n <div className=\"flex-1 min-w-0\">\n {title && (\n <h3 className=\"text-base font-semibold text-[hsl(var(--foreground))] truncate\">\n {title}\n </h3>\n )}\n {artist && (\n <p className=\"text-sm text-[hsl(var(--muted-foreground))] truncate\">\n {artist}\n </p>\n )}\n {album && (\n <p className=\"text-xs text-[hsl(var(--muted-foreground))] truncate\">\n {album}\n </p>\n )}\n </div>\n </div>\n\n {/* Progress Bar */}\n <div className=\"px-4 pt-4\">\n <div className=\"relative h-2 bg-[hsl(var(--muted))] rounded-full overflow-visible\">\n <div\n className=\"absolute h-full bg-[hsl(var(--primary))] rounded-full transition-all\"\n style={{ width: `${progress}%` }}\n />\n {/* Chapter Markers */}\n {showChapters && chapters.length > 0 && chapters.map((chapter, index) => {\n const markerPosition = duration > 0 ? (chapter.startTime / duration) * 100 : 0;\n return (\n <div\n key={index}\n className=\"absolute top-0 bottom-0 w-1 -ml-0.5 bg-[hsl(var(--background))] opacity-70 hover:opacity-100 hover:w-1.5 hover:-ml-0.5 cursor-pointer z-10 transition-all\"\n style={{ left: `${markerPosition}%` }}\n onClick={() => jumpToChapter(chapter)}\n onMouseEnter={(e) => {\n setHoveredChapter(chapter);\n const rect = e.currentTarget.getBoundingClientRect();\n setHoverPosition({ x: rect.left + rect.width / 2, y: rect.top });\n }}\n onMouseLeave={() => setHoveredChapter(null)}\n />\n );\n })}\n\n {/* Chapter Hover Tooltip */}\n {hoveredChapter && showChapters && (\n <div\n className=\"fixed z-50 px-3 py-2 bg-[hsl(var(--popover))] text-white text-xs font-medium rounded shadow-lg pointer-events-none transform -translate-x-1/2 -translate-y-full\"\n style={{ left: hoverPosition.x, top: hoverPosition.y - 8 }}\n >\n <div className=\"whitespace-nowrap\">{hoveredChapter.title}</div>\n <div className=\"text-[hsl(var(--muted-foreground))] text-[10px] mt-0.5\">{formatTime(hoveredChapter.startTime)}</div>\n <div className=\"absolute left-1/2 -bottom-1 w-2 h-2 bg-[hsl(var(--popover))] transform -translate-x-1/2 rotate-45\" />\n </div>\n )}\n <input\n type=\"range\"\n min={0}\n max={duration || 0}\n value={currentTime}\n onChange={handleSeek}\n disabled={isLoading}\n className=\"absolute inset-0 w-full h-full opacity-0 cursor-pointer disabled:cursor-not-allowed z-20\"\n aria-label=\"Seek\"\n />\n </div>\n <div className=\"flex justify-between items-center mt-1 text-xs text-[hsl(var(--muted-foreground))] tabular-nums\">\n <span>{formatTime(currentTime)}</span>\n {currentChapter && showChapters && (\n <span className=\"text-[hsl(var(--primary))] font-medium truncate max-w-[200px]\">\n {currentChapter.title}\n </span>\n )}\n <span>{formatTime(duration)}</span>\n </div>\n </div>\n\n {/* Controls */}\n <div className=\"flex items-center justify-between px-4 py-4\">\n {/* Left side - Volume */}\n <div className=\"flex items-center gap-2 flex-1\">\n <button\n onClick={toggleMute}\n className=\"text-[hsl(var(--muted-foreground))] hover:text-[hsl(var(--foreground))] transition-colors\"\n aria-label={isMuted ? 'Unmute' : 'Mute'}\n >\n {isMuted ? <VolumeOffIcon size=\"md\" /> : <VolumeUpIcon size=\"md\" />}\n </button>\n <input\n type=\"range\"\n min={0}\n max={1}\n step={0.01}\n value={isMuted ? 0 : volume}\n onChange={handleVolumeChange}\n className=\"w-20 h-1.5 bg-[hsl(var(--muted))] rounded-full appearance-none cursor-pointer\n [&::-webkit-slider-thumb]:appearance-none [&::-webkit-slider-thumb]:w-3 [&::-webkit-slider-thumb]:h-3\n [&::-webkit-slider-thumb]:rounded-full [&::-webkit-slider-thumb]:bg-[hsl(var(--primary))] [&::-webkit-slider-thumb]:cursor-pointer\n [&::-moz-range-thumb]:w-3 [&::-moz-range-thumb]:h-3 [&::-moz-range-thumb]:rounded-full\n [&::-moz-range-thumb]:bg-[hsl(var(--primary))] [&::-moz-range-thumb]:cursor-pointer [&::-moz-range-thumb]:border-none\"\n aria-label=\"Volume\"\n />\n </div>\n\n {/* Center - Playback Controls */}\n <div className=\"flex items-center gap-2\">\n {showSkipButtons && (\n <Button\n iconOnly\n size=\"md\"\n variant=\"secondary\"\n onClick={handleSkipBack}\n disabled={isLoading}\n aria-label=\"Skip back 10 seconds\"\n >\n <SkipBackIcon size=\"md\" />\n </Button>\n )}\n\n <Button\n iconOnly\n size=\"lg\"\n variant=\"primary\"\n onClick={togglePlayPause}\n disabled={isLoading}\n aria-label={isPlaying ? 'Pause' : 'Play'}\n >\n {isPlaying ? <PauseIcon size=\"lg\" /> : <PlayIcon size=\"lg\" />}\n </Button>\n\n {showSkipButtons && (\n <Button\n iconOnly\n size=\"md\"\n variant=\"secondary\"\n onClick={handleSkipForward}\n disabled={isLoading}\n aria-label=\"Skip forward 10 seconds\"\n >\n <SkipForwardIcon size=\"md\" />\n </Button>\n )}\n </div>\n\n {/* Right side - Chapter menu toggle */}\n <div className=\"flex-1 flex justify-end\">\n {showChapters && chapters.length > 0 && (\n <button\n onClick={() => setShowChapterList(!showChapterList)}\n className=\"text-sm text-[hsl(var(--muted-foreground))] hover:text-[hsl(var(--foreground))] transition-colors\"\n aria-label=\"Toggle chapters\"\n >\n Chapters ({chapters.length})\n </button>\n )}\n </div>\n </div>\n\n {/* Chapter List */}\n {showChapters && showChapterList && chapters.length > 0 && (\n <div className=\"border-t border-[hsl(var(--border))] bg-[hsl(var(--muted))]/50 max-h-48 overflow-y-auto\">\n {chapters.map((chapter, index) => {\n const isCurrentChapter = currentChapter?.startTime === chapter.startTime;\n return (\n <button\n key={index}\n onClick={() => jumpToChapter(chapter)}\n className={`w-full text-left px-4 py-2 hover:bg-[hsl(var(--accent))] transition-colors ${\n isCurrentChapter ? 'bg-[hsl(var(--primary))]/10 border-l-2 border-[hsl(var(--primary))]' : ''\n }`}\n >\n <div className=\"flex items-center justify-between gap-2\">\n <span className={`text-sm font-medium ${\n isCurrentChapter ? 'text-[hsl(var(--primary))]' : 'text-[hsl(var(--foreground))]'\n }`}>\n {chapter.title}\n </span>\n <span className=\"text-xs text-[hsl(var(--muted-foreground))] tabular-nums\">\n {formatTime(chapter.startTime)}\n </span>\n </div>\n </button>\n );\n })}\n </div>\n )}\n </div>\n );\n};\n","\"use client\";\n\nimport React, { useRef, useState, useEffect } from 'react';\nimport { PlayIcon } from '../icons/PlayIcon';\nimport { PauseIcon } from '../icons/PauseIcon';\nimport { VolumeUpIcon } from '../icons/VolumeUpIcon';\nimport { VolumeOffIcon } from '../icons/VolumeOffIcon';\nimport { FullscreenIcon } from '../icons/FullscreenIcon';\nimport { FullscreenExitIcon } from '../icons/FullscreenExitIcon';\nimport { Button } from './Button';\nimport type { Chapter } from './AudioPlayer';\n\nexport interface VideoPlayerProps {\n src: string;\n poster?: string;\n title?: string;\n variant?: 'default' | 'compact';\n autoPlay?: boolean;\n loop?: boolean;\n muted?: boolean;\n controls?: boolean;\n preload?: 'none' | 'metadata' | 'auto';\n width?: string | number;\n height?: string | number;\n aspectRatio?: '16:9' | '4:3' | '21:9' | '1:1';\n onPlay?: () => void;\n onPause?: () => void;\n onEnded?: () => void;\n onTimeUpdate?: (currentTime: number) => void;\n className?: string;\n showControls?: boolean;\n chapters?: Chapter[];\n showChapters?: boolean;\n onChapterChange?: (chapter: Chapter) => void;\n}\n\nexport const VideoPlayer: React.FC<VideoPlayerProps> = ({\n src,\n poster,\n title,\n variant = 'default',\n autoPlay = false,\n loop = false,\n muted = false,\n controls = false,\n preload = 'metadata',\n width,\n height,\n aspectRatio = '16:9',\n onPlay,\n onPause,\n onEnded,\n onTimeUpdate,\n className = '',\n showControls = true,\n chapters = [],\n showChapters = true,\n onChapterChange,\n}) => {\n const videoRef = useRef<HTMLVideoElement>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n const [isPlaying, setIsPlaying] = useState(false);\n const [currentTime, setCurrentTime] = useState(0);\n const [duration, setDuration] = useState(0);\n const [volume, setVolume] = useState(muted ? 0 : 1);\n const [isMuted, setIsMuted] = useState(muted);\n const [isLoading, setIsLoading] = useState(true);\n const [isFullscreen, setIsFullscreen] = useState(false);\n const [showControlsOverlay, setShowControlsOverlay] = useState(true);\n const hideControlsTimeout = useRef<NodeJS.Timeout | null>(null);\n const [currentChapter, setCurrentChapter] = useState<Chapter | null>(null);\n const [hoveredChapter, setHoveredChapter] = useState<Chapter | null>(null);\n const [hoverPosition, setHoverPosition] = useState({ x: 0, y: 0 });\n\n useEffect(() => {\n const video = videoRef.current;\n if (!video) return;\n\n const handleLoadedMetadata = () => {\n setDuration(video.duration);\n setIsLoading(false);\n };\n\n const handleCanPlay = () => {\n setIsLoading(false);\n };\n\n const handleTimeUpdate = () => {\n setCurrentTime(video.currentTime);\n onTimeUpdate?.(video.currentTime);\n\n // Update current chapter\n if (chapters.length > 0) {\n const chapter = getCurrentChapter(video.currentTime);\n if (chapter && chapter !== currentChapter) {\n setCurrentChapter(chapter);\n onChapterChange?.(chapter);\n }\n }\n };\n\n const handleEnded = () => {\n setIsPlaying(false);\n onEnded?.();\n };\n\n const handlePlay = () => {\n setIsPlaying(true);\n onPlay?.();\n };\n\n const handlePause = () => {\n setIsPlaying(false);\n onPause?.();\n };\n\n const handleError = (e: Event) => {\n console.error('Video error:', e);\n setIsPlaying(false);\n setIsLoading(false);\n };\n\n const handleLoadStart = () => {\n setIsLoading(true);\n };\n\n const handleFullscreenChange = () => {\n setIsFullscreen(!!document.fullscreenElement);\n };\n\n video.addEventListener('loadstart', handleLoadStart);\n video.addEventListener('loadedmetadata', handleLoadedMetadata);\n video.addEventListener('canplay', handleCanPlay);\n video.addEventListener('timeupdate', handleTimeUpdate);\n video.addEventListener('ended', handleEnded);\n video.addEventListener('play', handlePlay);\n video.addEventListener('pause', handlePause);\n video.addEventListener('error', handleError);\n document.addEventListener('fullscreenchange', handleFullscreenChange);\n\n // Check if video is ready\n if (video.readyState >= 2) {\n setIsLoading(false);\n setDuration(video.duration);\n }\n\n return () => {\n video.removeEventListener('loadstart', handleLoadStart);\n video.removeEventListener('loadedmetadata', handleLoadedMetadata);\n video.removeEventListener('canplay', handleCanPlay);\n video.removeEventListener('timeupdate', handleTimeUpdate);\n video.removeEventListener('ended', handleEnded);\n video.removeEventListener('play', handlePlay);\n video.removeEventListener('pause', handlePause);\n video.removeEventListener('error', handleError);\n document.removeEventListener('fullscreenchange', handleFullscreenChange);\n };\n }, [onPlay, onPause, onEnded, onTimeUpdate]);\n\n // Separate effect for src changes\n useEffect(() => {\n const video = videoRef.current;\n if (!video) return;\n video.load();\n }, [src]);\n\n // Auto-hide controls in fullscreen\n useEffect(() => {\n if (!isFullscreen || !isPlaying) return;\n\n const resetTimeout = () => {\n if (hideControlsTimeout.current) {\n clearTimeout(hideControlsTimeout.current);\n }\n setShowControlsOverlay(true);\n hideControlsTimeout.current = setTimeout(() => {\n setShowControlsOverlay(false);\n }, 3000);\n };\n\n resetTimeout();\n\n return () => {\n if (hideControlsTimeout.current) {\n clearTimeout(hideControlsTimeout.current);\n }\n };\n }, [isFullscreen, isPlaying, currentTime]);\n\n const togglePlayPause = async () => {\n const video = videoRef.current;\n if (!video) return;\n\n try {\n if (isPlaying) {\n video.pause();\n } else {\n await video.play();\n }\n } catch (error) {\n console.error('Playback error:', error);\n setIsPlaying(false);\n }\n };\n\n const handleSeek = (e: React.ChangeEvent<HTMLInputElement>) => {\n const video = videoRef.current;\n if (!video) return;\n\n const time = parseFloat(e.target.value);\n video.currentTime = time;\n setCurrentTime(time);\n };\n\n const handleVolumeChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const video = videoRef.current;\n if (!video) return;\n\n const vol = parseFloat(e.target.value);\n video.volume = vol;\n setVolume(vol);\n setIsMuted(vol === 0);\n };\n\n const toggleMute = () => {\n const video = videoRef.current;\n if (!video) return;\n\n if (isMuted) {\n video.volume = volume || 0.5;\n video.muted = false;\n setIsMuted(false);\n } else {\n video.volume = 0;\n video.muted = true;\n setIsMuted(true);\n }\n };\n\n const toggleFullscreen = async () => {\n const container = containerRef.current;\n if (!container) return;\n\n try {\n if (!document.fullscreenElement) {\n await container.requestFullscreen();\n } else {\n await document.exitFullscreen();\n }\n } catch (error) {\n console.error('Fullscreen error:', error);\n }\n };\n\n const formatTime = (time: number): string => {\n if (!isFinite(time)) return '0:00';\n const minutes = Math.floor(time / 60);\n const seconds = Math.floor(time % 60);\n return `${minutes}:${seconds.toString().padStart(2, '0')}`;\n };\n\n const getCurrentChapter = (time: number): Chapter | null => {\n if (chapters.length === 0) return null;\n\n // Find the chapter that the current time falls into\n for (let i = chapters.length - 1; i >= 0; i--) {\n if (time >= chapters[i].startTime) {\n return chapters[i];\n }\n }\n return chapters[0];\n };\n\n const jumpToChapter = (chapter: Chapter) => {\n const video = videoRef.current;\n if (!video) return;\n\n video.currentTime = chapter.startTime;\n setCurrentTime(chapter.startTime);\n };\n\n const progress = duration > 0 ? (currentTime / duration) * 100 : 0;\n\n const aspectRatioClasses = {\n '16:9': 'aspect-video',\n '4:3': 'aspect-[4/3]',\n '21:9': 'aspect-[21/9]',\n '1:1': 'aspect-square',\n };\n\n const handleMouseMove = () => {\n if (isFullscreen) {\n setShowControlsOverlay(true);\n if (hideControlsTimeout.current) {\n clearTimeout(hideControlsTimeout.current);\n }\n hideControlsTimeout.current = setTimeout(() => {\n if (isPlaying) {\n setShowControlsOverlay(false);\n }\n }, 3000);\n }\n };\n\n // Compact variant - video with minimal controls overlay\n if (variant === 'compact') {\n return (\n <div\n ref={containerRef}\n className={`relative bg-black rounded-lg overflow-hidden ${aspectRatioClasses[aspectRatio]} ${className}`}\n style={{ width, height }}\n onMouseMove={handleMouseMove}\n >\n <video\n ref={videoRef}\n src={src}\n poster={poster}\n preload={preload}\n loop={loop}\n muted={muted}\n autoPlay={autoPlay}\n className=\"w-full h-full object-contain\"\n onClick={togglePlayPause}\n />\n\n {showControls && (\n <div className={`absolute inset-0 bg-gradient-to-t from-black/70 via-transparent to-transparent transition-opacity ${showControlsOverlay || !isPlaying ? 'opacity-100' : 'opacity-0'}`}>\n {/* Play/Pause Overlay */}\n <div className=\"absolute inset-0 flex items-center justify-center\">\n <Button\n iconOnly\n size=\"xl\"\n variant=\"primary\"\n onClick={togglePlayPause}\n disabled={isLoading}\n className=\"!w-16 !h-16 !rounded-full bg-white/20 hover:bg-white/30 backdrop-blur-sm\"\n aria-label={isPlaying ? 'Pause' : 'Play'}\n >\n {isPlaying ? <PauseIcon size=\"xl\" /> : <PlayIcon size=\"xl\" />}\n </Button>\n </div>\n\n {/* Bottom Controls */}\n <div className=\"absolute bottom-0 left-0 right-0 p-3 space-y-2\">\n {/* Progress Bar */}\n <div className=\"relative h-1 bg-white/30 rounded-full overflow-visible\">\n <div\n className=\"absolute h-full bg-[hsl(var(--primary))] rounded-full transition-all\"\n style={{ width: `${progress}%` }}\n />\n {/* Chapter Markers */}\n {showChapters && chapters.length > 0 && chapters.map((chapter, index) => {\n const markerPosition = duration > 0 ? (chapter.startTime / duration) * 100 : 0;\n return (\n <div\n key={index}\n className=\"absolute top-0 bottom-0 w-1 -ml-0.5 bg-white opacity-70 hover:opacity-100 hover:w-1.5 hover:-ml-0.5 cursor-pointer z-10 transition-all\"\n style={{ left: `${markerPosition}%` }}\n onClick={() => jumpToChapter(chapter)}\n onMouseEnter={(e) => {\n setHoveredChapter(chapter);\n const rect = e.currentTarget.getBoundingClientRect();\n setHoverPosition({ x: rect.left + rect.width / 2, y: rect.top });\n }}\n onMouseLeave={() => setHoveredChapter(null)}\n />\n );\n })}\n <input\n type=\"range\"\n min={0}\n max={duration || 0}\n value={currentTime}\n onChange={handleSeek}\n disabled={isLoading}\n className=\"absolute inset-0 w-full h-full opacity-0 cursor-pointer disabled:cursor-not-allowed z-20\"\n aria-label=\"Seek\"\n />\n </div>\n\n {/* Controls Row */}\n <div className=\"flex items-center justify-between gap-2\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs text-white tabular-nums\">\n {formatTime(currentTime)} / {formatTime(duration)}\n </span>\n {currentChapter && showChapters && (\n <span className=\"text-xs text-white/90 font-medium truncate max-w-[150px]\">\n • {currentChapter.title}\n </span>\n )}\n </div>\n\n <div className=\"flex items-center gap-2\">\n <button\n onClick={toggleMute}\n className=\"text-white hover:text-[hsl(var(--foreground))] transition-colors\"\n aria-label={isMuted ? 'Unmute' : 'Mute'}\n >\n {isMuted ? <VolumeOffIcon size=\"sm\" /> : <VolumeUpIcon size=\"sm\" />}\n </button>\n <button\n onClick={toggleFullscreen}\n className=\"text-white hover:text-[hsl(var(--foreground))] transition-colors\"\n aria-label={isFullscreen ? 'Exit fullscreen' : 'Enter fullscreen'}\n >\n {isFullscreen ? <FullscreenExitIcon size=\"sm\" /> : <FullscreenIcon size=\"sm\" />}\n </button>\n </div>\n </div>\n </div>\n </div>\n )}\n\n {/* Chapter Hover Tooltip */}\n {hoveredChapter && showChapters && (\n <div\n className=\"fixed z-50 px-3 py-2 bg-[hsl(var(--popover))] text-white text-xs font-medium rounded shadow-lg pointer-events-none transform -translate-x-1/2 -translate-y-full\"\n style={{ left: hoverPosition.x, top: hoverPosition.y - 8 }}\n >\n <div className=\"whitespace-nowrap\">{hoveredChapter.title}</div>\n <div className=\"text-[hsl(var(--muted-foreground))] text-[10px] mt-0.5\">{formatTime(hoveredChapter.startTime)}</div>\n <div className=\"absolute left-1/2 -bottom-1 w-2 h-2 bg-[hsl(var(--popover))] transform -translate-x-1/2 rotate-45\" />\n </div>\n )}\n </div>\n );\n }\n\n // Default variant - full featured player\n return (\n <div className={`bg-[hsl(var(--card))] rounded-lg border border-[hsl(var(--border))] shadow-md overflow-hidden ${className}`}>\n {title && (\n <div className=\"px-4 py-3 border-b border-[hsl(var(--border))]\">\n <h3 className=\"text-base font-semibold text-[hsl(var(--foreground))] truncate\">\n {title}\n </h3>\n </div>\n )}\n\n <div\n ref={containerRef}\n className={`relative bg-black ${aspectRatioClasses[aspectRatio]}`}\n style={{ width, height }}\n onMouseMove={handleMouseMove}\n >\n <video\n ref={videoRef}\n src={src}\n poster={poster}\n preload={preload}\n loop={loop}\n muted={muted}\n autoPlay={autoPlay}\n controls={controls}\n className=\"w-full h-full object-contain\"\n onClick={togglePlayPause}\n />\n\n {showControls && !controls && (\n <div className={`absolute inset-0 bg-gradient-to-t from-black/70 via-transparent to-transparent transition-opacity ${showControlsOverlay || !isPlaying ? 'opacity-100' : 'opacity-0'}`}>\n {/* Play/Pause Overlay */}\n <div className=\"absolute inset-0 flex items-center justify-center\">\n <Button\n iconOnly\n size=\"xl\"\n variant=\"primary\"\n onClick={togglePlayPause}\n disabled={isLoading}\n className=\"!w-20 !h-20 !rounded-full bg-white/20 hover:bg-white/30 backdrop-blur-sm\"\n aria-label={isPlaying ? 'Pause' : 'Play'}\n >\n {isPlaying ? <PauseIcon size=\"xl\" /> : <PlayIcon size=\"xl\" />}\n </Button>\n </div>\n\n {/* Bottom Controls */}\n <div className=\"absolute bottom-0 left-0 right-0 p-4 space-y-3\">\n {/* Progress Bar */}\n <div className=\"relative h-1.5 bg-white/30 rounded-full overflow-visible\">\n <div\n className=\"absolute h-full bg-[hsl(var(--primary))] rounded-full transition-all\"\n style={{ width: `${progress}%` }}\n />\n {/* Chapter Markers */}\n {showChapters && chapters.length > 0 && chapters.map((chapter, index) => {\n const markerPosition = duration > 0 ? (chapter.startTime / duration) * 100 : 0;\n return (\n <div\n key={index}\n className=\"absolute top-0 bottom-0 w-1 -ml-0.5 bg-white opacity-70 hover:opacity-100 hover:w-1.5 hover:-ml-0.5 cursor-pointer z-10 transition-all\"\n style={{ left: `${markerPosition}%` }}\n onClick={() => jumpToChapter(chapter)}\n onMouseEnter={(e) => {\n setHoveredChapter(chapter);\n const rect = e.currentTarget.getBoundingClientRect();\n setHoverPosition({ x: rect.left + rect.width / 2, y: rect.top });\n }}\n onMouseLeave={() => setHoveredChapter(null)}\n />\n );\n })}\n <input\n type=\"range\"\n min={0}\n max={duration || 0}\n value={currentTime}\n onChange={handleSeek}\n disabled={isLoading}\n className=\"absolute inset-0 w-full h-full opacity-0 cursor-pointer disabled:cursor-not-allowed z-20\"\n aria-label=\"Seek\"\n />\n </div>\n\n {/* Controls Row */}\n <div className=\"flex items-center justify-between gap-4\">\n <div className=\"flex items-center gap-3\">\n <Button\n iconOnly\n size=\"md\"\n variant=\"secondary\"\n onClick={togglePlayPause}\n disabled={isLoading}\n className=\"bg-white/20 hover:bg-white/30 backdrop-blur-sm border-white/30\"\n aria-label={isPlaying ? 'Pause' : 'Play'}\n >\n {isPlaying ? <PauseIcon size=\"md\" /> : <PlayIcon size=\"md\" />}\n </Button>\n\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm text-white tabular-nums\">\n {formatTime(currentTime)} / {formatTime(duration)}\n </span>\n {currentChapter && showChapters && (\n <span className=\"text-sm text-white/90 font-medium truncate max-w-[200px]\">\n • {currentChapter.title}\n </span>\n )}\n </div>\n </div>\n\n <div className=\"flex items-center gap-3\">\n <div className=\"flex items-center gap-2\">\n <button\n onClick={toggleMute}\n className=\"text-white hover:text-[hsl(var(--foreground))] transition-colors\"\n aria-label={isMuted ? 'Unmute' : 'Mute'}\n >\n {isMuted ? <VolumeOffIcon size=\"md\" /> : <VolumeUpIcon size=\"md\" />}\n </button>\n <input\n type=\"range\"\n min={0}\n max={1}\n step={0.01}\n value={isMuted ? 0 : volume}\n onChange={handleVolumeChange}\n className=\"w-20 h-1.5 bg-white/30 rounded-full appearance-none cursor-pointer\n [&::-webkit-slider-thumb]:appearance-none [&::-webkit-slider-thumb]:w-3 [&::-webkit-slider-thumb]:h-3\n [&::-webkit-slider-thumb]:rounded-full [&::-webkit-slider-thumb]:bg-white [&::-webkit-slider-thumb]:cursor-pointer\n [&::-moz-range-thumb]:w-3 [&::-moz-range-thumb]:h-3 [&::-moz-range-thumb]:rounded-full\n [&::-moz-range-thumb]:bg-white [&::-moz-range-thumb]:cursor-pointer [&::-moz-range-thumb]:border-none\"\n aria-label=\"Volume\"\n />\n </div>\n\n <button\n onClick={toggleFullscreen}\n className=\"text-white hover:text-[hsl(var(--foreground))] transition-colors\"\n aria-label={isFullscreen ? 'Exit fullscreen' : 'Enter fullscreen'}\n >\n {isFullscreen ? <FullscreenExitIcon size=\"md\" /> : <FullscreenIcon size=\"md\" />}\n </button>\n </div>\n </div>\n </div>\n </div>\n )}\n\n {/* Chapter Hover Tooltip */}\n {hoveredChapter && showChapters && (\n <div\n className=\"fixed z-50 px-3 py-2 bg-[hsl(var(--popover))] text-white text-xs font-medium rounded shadow-lg pointer-events-none transform -translate-x-1/2 -translate-y-full\"\n style={{ left: hoverPosition.x, top: hoverPosition.y - 8 }}\n >\n <div className=\"whitespace-nowrap\">{hoveredChapter.title}</div>\n <div className=\"text-[hsl(var(--muted-foreground))] text-[10px] mt-0.5\">{formatTime(hoveredChapter.startTime)}</div>\n <div className=\"absolute left-1/2 -bottom-1 w-2 h-2 bg-[hsl(var(--popover))] transform -translate-x-1/2 rotate-45\" />\n </div>\n )}\n </div>\n </div>\n );\n};\n","\"use client\";\n\nimport React, { useMemo, useCallback, useRef, useState } from 'react';\nimport { CHART_DEFAULTS } from './constants';\nimport { scaleLinear, scaleTime, calculateDomain, getTicks } from './utils/scales';\nimport { generateLinePath, generateMonotonePath, generateStepPath } from './utils/paths';\nimport { formatNumber, formatDate, createTickFormatter } from './utils/format';\nimport { ChartTooltip, useTooltip, type TooltipPayloadItem } from './components/ChartTooltip';\nimport { Legend, type LegendItem } from './components/Legend';\nimport { ReferenceLine, type ReferenceLineProps } from './components/ReferenceLine';\nimport { ReferenceArea, type ReferenceAreaProps } from './components/ReferenceArea';\nimport { CartesianGrid, type CartesianGridProps } from './components/CartesianGrid';\n\nexport interface LineChartDataPoint {\n x: string | number | Date;\n y: number;\n [key: string]: unknown;\n}\n\nexport interface LineChartSeries {\n name: string;\n data: LineChartDataPoint[];\n color?: string;\n strokeWidth?: number;\n type?: 'linear' | 'monotone' | 'step' | 'stepBefore' | 'stepAfter';\n dot?: boolean;\n activeDot?: boolean;\n connectNulls?: boolean;\n}\n\nexport interface LineChartProps {\n /** Chart data - array of series */\n data: LineChartSeries[];\n /** Chart width in pixels (or use ResponsiveContainer) */\n width?: number;\n /** Chart height in pixels (or use ResponsiveContainer) */\n height?: number;\n /** Padding inside the chart */\n padding?: { top?: number; right?: number; bottom?: number; left?: number };\n /** Show grid lines */\n showGrid?: boolean;\n /** Show X axis */\n showXAxis?: boolean;\n /** Show Y axis */\n showYAxis?: boolean;\n /** Show legend */\n showLegend?: boolean;\n /** Show tooltip on hover */\n showTooltip?: boolean;\n /** Show dots on data points */\n showDots?: boolean;\n /** Animate on load and data change */\n animate?: boolean;\n /** Animation duration in ms */\n animationDuration?: number;\n /** X axis label */\n xAxisLabel?: string;\n /** Y axis label */\n yAxisLabel?: string;\n /** Number of Y axis ticks */\n yAxisTickCount?: number;\n /** Custom Y axis domain [min, max] */\n yDomain?: [number, number];\n /** Custom X axis formatter */\n formatXValue?: (value: string | number | Date) => string;\n /** Custom Y axis formatter */\n formatYValue?: (value: number) => string;\n /** Custom tooltip formatter */\n tooltipFormatter?: (value: number | string, name: string, payload: TooltipPayloadItem) => string;\n /** Custom tooltip label formatter */\n tooltipLabelFormatter?: (label: string | number) => string;\n /** Custom tooltip content component */\n tooltipContent?: React.FC<any>;\n /** Click handler for data points */\n onPointClick?: (data: LineChartDataPoint, seriesIndex: number, pointIndex: number) => void;\n /** Hover handler for data points */\n onPointHover?: (data: LineChartDataPoint | null, seriesIndex: number, pointIndex: number) => void;\n /** Show crosshair on hover */\n showCrosshair?: boolean;\n /** Show value labels at end of lines */\n showValueLabels?: boolean;\n /** Custom CSS class */\n className?: string;\n /** Chart children (ReferenceLine, ReferenceArea, etc.) */\n children?: React.ReactNode;\n /** Custom colors array */\n colors?: string[];\n /** ARIA label for accessibility */\n ariaLabel?: string;\n}\n\nexport const LineChart: React.FC<LineChartProps> = ({\n data,\n width: providedWidth,\n height: providedHeight,\n padding: customPadding,\n showGrid = true,\n showXAxis = true,\n showYAxis = true,\n showLegend = true,\n showTooltip = true,\n showDots = true,\n animate = true,\n animationDuration = CHART_DEFAULTS.animation.duration,\n xAxisLabel,\n yAxisLabel,\n yAxisTickCount = 5,\n yDomain,\n formatXValue,\n formatYValue,\n tooltipFormatter,\n tooltipLabelFormatter,\n tooltipContent,\n onPointClick,\n onPointHover,\n showCrosshair = false,\n showValueLabels = false,\n className = '',\n children,\n colors = CHART_DEFAULTS.colors,\n ariaLabel,\n}) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const svgRef = useRef<SVGSVGElement>(null);\n const [hoveredPoint, setHoveredPoint] = useState<{\n seriesIndex: number;\n pointIndex: number;\n } | null>(null);\n const [crosshairX, setCrosshairX] = useState<number | null>(null);\n\n const { tooltipData, showTooltip: showTooltipFn, hideTooltip } = useTooltip();\n\n // Dimensions\n const width = providedWidth || 800;\n const height = providedHeight || 400;\n\n const padding = useMemo(() => ({\n top: customPadding?.top ?? CHART_DEFAULTS.padding.top,\n right: customPadding?.right ?? (showValueLabels ? 80 : CHART_DEFAULTS.padding.right),\n bottom: customPadding?.bottom ?? (showXAxis ? 60 : CHART_DEFAULTS.padding.bottom),\n left: customPadding?.left ?? (showYAxis ? 60 : CHART_DEFAULTS.padding.left),\n }), [customPadding, showXAxis, showYAxis, showValueLabels]);\n\n const chartWidth = width - padding.left - padding.right;\n const chartHeight = height - padding.top - padding.bottom;\n\n // Collect all data points\n const allPoints = useMemo(() =>\n data.flatMap(series => series.data),\n [data]\n );\n\n // Determine X value type\n const xValueType = useMemo(() => {\n const firstX = data[0]?.data[0]?.x;\n if (firstX instanceof Date) return 'date';\n if (typeof firstX === 'number') return 'number';\n return 'string';\n }, [data]);\n\n // Calculate domains\n const xDomainCalc = useMemo(() => {\n if (xValueType === 'date') {\n const dates = allPoints.map(p => (p.x as Date).getTime());\n return [Math.min(...dates), Math.max(...dates)] as [number, number];\n }\n if (xValueType === 'number') {\n const nums = allPoints.map(p => p.x as number);\n return [Math.min(...nums), Math.max(...nums)] as [number, number];\n }\n // For strings, use index-based\n const maxLen = Math.max(...data.map(s => s.data.length));\n return [0, maxLen - 1] as [number, number];\n }, [allPoints, xValueType, data]);\n\n const yDomainCalc = useMemo(() => {\n if (yDomain) return yDomain;\n const yValues = allPoints.map(p => p.y);\n return calculateDomain(yValues, { includeZero: true, padding: 0.1 });\n }, [allPoints, yDomain]);\n\n // Create scale functions (memoized for performance)\n const xScale = useMemo(() => {\n if (xValueType === 'date') {\n return (value: string | number | Date) => {\n const time = value instanceof Date ? value.getTime() : Number(value);\n return scaleLinear({\n domain: xDomainCalc,\n range: [0, chartWidth],\n })(time);\n };\n }\n if (xValueType === 'number') {\n const scale = scaleLinear({\n domain: xDomainCalc,\n range: [0, chartWidth],\n });\n return (value: string | number | Date) => scale(Number(value));\n }\n // String - index based\n return (_value: string | number | Date, index: number = 0) => {\n const maxLen = Math.max(...data.map(s => s.data.length)) - 1;\n if (maxLen === 0) return chartWidth / 2;\n return (index / maxLen) * chartWidth;\n };\n }, [xValueType, xDomainCalc, chartWidth, data]);\n\n const yScale = useMemo(() =>\n scaleLinear({\n domain: yDomainCalc,\n range: [chartHeight, 0],\n }),\n [yDomainCalc, chartHeight]\n );\n\n // Generate Y axis ticks\n const yTicks = useMemo(() =>\n getTicks(yDomainCalc, yAxisTickCount),\n [yDomainCalc, yAxisTickCount]\n );\n\n // Generate X axis ticks\n const xTicks = useMemo(() => {\n if (xValueType === 'string') {\n // Use actual x values from first series\n return data[0]?.data.map((p, i) => ({ value: p.x, index: i })) || [];\n }\n const tickCount = Math.min(6, Math.max(2, data[0]?.data.length || 2));\n const ticks = getTicks(xDomainCalc, tickCount);\n return ticks.map(t => ({ value: t, index: 0 }));\n }, [xValueType, xDomainCalc, data]);\n\n // Format functions\n const xFormatter = useCallback((value: string | number | Date) => {\n if (formatXValue) return formatXValue(value);\n if (value instanceof Date) {\n const range = xDomainCalc[1] - xDomainCalc[0];\n return formatDate(value, range);\n }\n return String(value);\n }, [formatXValue, xDomainCalc]);\n\n const yFormatter = useMemo(() => {\n if (formatYValue) return formatYValue;\n return createTickFormatter(yDomainCalc);\n }, [formatYValue, yDomainCalc]);\n\n // Generate paths for each series (memoized)\n const seriesPaths = useMemo(() => {\n return data.map((series) => {\n const points = series.data.map((point, i) => ({\n x: xScale(point.x, i),\n y: yScale(point.y),\n }));\n\n const type = series.type || 'linear';\n let path: string;\n\n switch (type) {\n case 'monotone':\n path = generateMonotonePath(points);\n break;\n case 'step':\n case 'stepAfter':\n path = generateStepPath(points, 'after');\n break;\n case 'stepBefore':\n path = generateStepPath(points, 'before');\n break;\n default:\n path = generateLinePath(points);\n }\n\n return { points, path };\n });\n }, [data, xScale, yScale]);\n\n // Handle point interactions\n const handlePointEnter = useCallback((\n e: React.MouseEvent,\n seriesIndex: number,\n pointIndex: number\n ) => {\n const series = data[seriesIndex];\n const point = series.data[pointIndex];\n const scaledPoint = seriesPaths[seriesIndex].points[pointIndex];\n\n setHoveredPoint({ seriesIndex, pointIndex });\n\n if (showCrosshair) {\n setCrosshairX(scaledPoint.x);\n }\n\n if (showTooltip && containerRef.current) {\n const rect = containerRef.current.getBoundingClientRect();\n const mouseX = e.clientX - rect.left;\n const mouseY = e.clientY - rect.top;\n\n const payload: TooltipPayloadItem[] = [{\n name: series.name,\n value: point.y,\n color: series.color || colors[seriesIndex % colors.length],\n payload: point,\n }];\n\n showTooltipFn({\n x: mouseX,\n y: mouseY,\n label: xFormatter(point.x),\n payload,\n });\n }\n\n onPointHover?.(point, seriesIndex, pointIndex);\n }, [data, seriesPaths, showCrosshair, showTooltip, colors, xFormatter, showTooltipFn, onPointHover]);\n\n const handlePointLeave = useCallback(() => {\n setHoveredPoint(null);\n setCrosshairX(null);\n hideTooltip();\n onPointHover?.(null, -1, -1);\n }, [hideTooltip, onPointHover]);\n\n const handlePointClick = useCallback((\n seriesIndex: number,\n pointIndex: number\n ) => {\n const point = data[seriesIndex].data[pointIndex];\n onPointClick?.(point, seriesIndex, pointIndex);\n }, [data, onPointClick]);\n\n // Prepare legend items\n const legendItems: LegendItem[] = useMemo(() =>\n data.map((series, i) => ({\n name: series.name,\n color: series.color || colors[i % colors.length],\n type: 'line' as const,\n })),\n [data, colors]\n );\n\n // Prepare reference components with injected props\n const referenceElements = useMemo(() => {\n if (!children) return null;\n\n const chartDimensions = {\n width: chartWidth,\n height: chartHeight,\n padding,\n };\n\n const scales = {\n xScale: (value: number | string | Date) => {\n if (xValueType === 'string') {\n const index = data[0]?.data.findIndex(p => p.x === value) ?? 0;\n return xScale(value, index);\n }\n return xScale(value, 0);\n },\n yScale,\n };\n\n return React.Children.map(children, (child) => {\n if (!React.isValidElement(child)) return child;\n\n // Inject chart dimensions and scales into reference components\n if (\n child.type === ReferenceLine ||\n child.type === ReferenceArea ||\n child.type === CartesianGrid\n ) {\n return React.cloneElement(child as React.ReactElement<any>, {\n _chartDimensions: chartDimensions,\n _scales: scales,\n });\n }\n\n return child;\n });\n }, [children, chartWidth, chartHeight, padding, xScale, yScale, xValueType, data]);\n\n // Generate accessible description\n const accessibleDescription = useMemo(() => {\n if (ariaLabel) return ariaLabel;\n const seriesNames = data.map(s => s.name).join(', ');\n return `Line chart with ${data.length} series: ${seriesNames}`;\n }, [data, ariaLabel]);\n\n return (\n <div\n ref={containerRef}\n className={`relative ${className}`}\n style={{ width, height: 'auto' }}\n >\n <svg\n ref={svgRef}\n width={width}\n height={height}\n viewBox={`0 0 ${width} ${height}`}\n role=\"img\"\n aria-label={accessibleDescription}\n className=\"bg-[hsl(var(--card))]\"\n >\n <defs>\n {/* Animation keyframes for line drawing */}\n {animate && data.map((series, i) => (\n <style key={`anim-${i}`}>{`\n @keyframes drawLine${i} {\n from { stroke-dashoffset: 2000; }\n to { stroke-dashoffset: 0; }\n }\n `}</style>\n ))}\n </defs>\n\n <g transform={`translate(${padding.left}, ${padding.top})`}>\n {/* Grid */}\n {showGrid && (\n <CartesianGrid\n _chartDimensions={{ width: chartWidth, height: chartHeight }}\n horizontalPoints={yTicks.map(t => yScale(t))}\n />\n )}\n\n {/* Reference elements (areas/lines) - render before data */}\n {referenceElements}\n\n {/* Crosshair */}\n {showCrosshair && crosshairX !== null && (\n <line\n x1={crosshairX}\n y1={0}\n x2={crosshairX}\n y2={chartHeight}\n stroke=\"currentColor\"\n strokeWidth={1}\n strokeDasharray=\"4 4\"\n className=\"text-[hsl(var(--muted-foreground))]\"\n pointerEvents=\"none\"\n />\n )}\n\n {/* Lines */}\n {data.map((series, seriesIndex) => {\n const { path } = seriesPaths[seriesIndex];\n const color = series.color || colors[seriesIndex % colors.length];\n const strokeWidth = series.strokeWidth || CHART_DEFAULTS.line.strokeWidth;\n\n return (\n <path\n key={`line-${seriesIndex}`}\n d={path}\n fill=\"none\"\n stroke={color}\n strokeWidth={strokeWidth}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n style={animate ? {\n strokeDasharray: 2000,\n animation: `drawLine${seriesIndex} ${animationDuration}ms ease-out forwards`,\n } : undefined}\n />\n );\n })}\n\n {/* Data points */}\n {showDots && data.map((series, seriesIndex) => {\n const { points } = seriesPaths[seriesIndex];\n const color = series.color || colors[seriesIndex % colors.length];\n const showSeriesDots = series.dot !== false;\n\n if (!showSeriesDots) return null;\n\n return points.map((point, pointIndex) => {\n const isHovered =\n hoveredPoint?.seriesIndex === seriesIndex &&\n hoveredPoint?.pointIndex === pointIndex;\n\n return (\n <circle\n key={`dot-${seriesIndex}-${pointIndex}`}\n cx={point.x}\n cy={point.y}\n r={isHovered ? CHART_DEFAULTS.line.activeDotRadius : CHART_DEFAULTS.line.dotRadius}\n fill={color}\n stroke=\"white\"\n strokeWidth={2}\n className=\"cursor-pointer transition-all duration-150\"\n style={{\n opacity: animate ? 0 : 1,\n animation: animate\n ? `fadeIn 200ms ease-out ${animationDuration + pointIndex * 20}ms forwards`\n : undefined,\n }}\n onMouseEnter={(e) => handlePointEnter(e, seriesIndex, pointIndex)}\n onMouseLeave={handlePointLeave}\n onClick={() => handlePointClick(seriesIndex, pointIndex)}\n />\n );\n });\n })}\n\n {/* Value labels at end of lines */}\n {showValueLabels && data.map((series, seriesIndex) => {\n const lastPoint = series.data[series.data.length - 1];\n const { points } = seriesPaths[seriesIndex];\n const lastScaled = points[points.length - 1];\n const color = series.color || colors[seriesIndex % colors.length];\n\n if (!lastPoint || !lastScaled) return null;\n\n return (\n <g key={`label-${seriesIndex}`}>\n <circle\n cx={chartWidth + 12}\n cy={lastScaled.y}\n r={4}\n fill={color}\n />\n <text\n x={chartWidth + 22}\n y={lastScaled.y}\n dominantBaseline=\"middle\"\n fontSize={CHART_DEFAULTS.fontSize.gridLabel}\n fontWeight=\"600\"\n className=\"fill-[hsl(var(--foreground))]\"\n >\n {yFormatter(lastPoint.y)}\n </text>\n </g>\n );\n })}\n\n {/* X Axis */}\n {showXAxis && (\n <g transform={`translate(0, ${chartHeight})`}>\n <line\n x1={0}\n y1={0}\n x2={chartWidth}\n y2={0}\n className=\"stroke-[hsl(var(--border))]\"\n strokeWidth={1}\n />\n {xTicks.map((tick, i) => {\n const x = xValueType === 'string'\n ? xScale(tick.value, tick.index)\n : xScale(xValueType === 'date' ? new Date(tick.value as number) : tick.value, 0);\n\n return (\n <g key={`x-tick-${i}`} transform={`translate(${x}, 0)`}>\n <line y2={6} className=\"stroke-[hsl(var(--border))]\" />\n <text\n y={20}\n textAnchor=\"middle\"\n fontSize={CHART_DEFAULTS.fontSize.gridLabel}\n className=\"fill-[hsl(var(--muted-foreground))]\"\n >\n {xFormatter(xValueType === 'date' ? new Date(tick.value as number) : tick.value)}\n </text>\n </g>\n );\n })}\n {xAxisLabel && (\n <text\n x={chartWidth / 2}\n y={50}\n textAnchor=\"middle\"\n fontSize={CHART_DEFAULTS.fontSize.axisLabel}\n fontWeight=\"500\"\n className=\"fill-[hsl(var(--foreground))]\"\n >\n {xAxisLabel}\n </text>\n )}\n </g>\n )}\n\n {/* Y Axis */}\n {showYAxis && (\n <g>\n <line\n x1={0}\n y1={0}\n x2={0}\n y2={chartHeight}\n className=\"stroke-[hsl(var(--border))]\"\n strokeWidth={1}\n />\n {yTicks.map((tick, i) => (\n <g key={`y-tick-${i}`} transform={`translate(0, ${yScale(tick)})`}>\n <line x2={-6} className=\"stroke-[hsl(var(--border))]\" />\n <text\n x={-12}\n textAnchor=\"end\"\n dominantBaseline=\"middle\"\n fontSize={CHART_DEFAULTS.fontSize.gridLabel}\n className=\"fill-[hsl(var(--muted-foreground))]\"\n >\n {yFormatter(tick)}\n </text>\n </g>\n ))}\n {yAxisLabel && (\n <text\n x={-chartHeight / 2}\n y={-45}\n textAnchor=\"middle\"\n transform=\"rotate(-90)\"\n fontSize={CHART_DEFAULTS.fontSize.axisLabel}\n fontWeight=\"500\"\n className=\"fill-[hsl(var(--foreground))]\"\n >\n {yAxisLabel}\n </text>\n )}\n </g>\n )}\n </g>\n\n {/* CSS for animations */}\n <style>{`\n @keyframes fadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n }\n `}</style>\n </svg>\n\n {/* Legend */}\n {showLegend && (\n <Legend\n items={legendItems}\n layout=\"horizontal\"\n align=\"center\"\n />\n )}\n\n {/* Tooltip */}\n {showTooltip && (\n <ChartTooltip\n {...tooltipData}\n content={tooltipContent}\n formatter={tooltipFormatter}\n labelFormatter={tooltipLabelFormatter}\n containerBounds={{ width, height }}\n />\n )}\n </div>\n );\n};\n","// Chart constants - no more magic numbers\n\nexport const CHART_DEFAULTS = {\n viewBox: {\n width: 1000,\n height: 600,\n pieSize: 600,\n },\n padding: {\n top: 40,\n right: 40,\n bottom: 60,\n left: 60,\n },\n fontSize: {\n gridLabel: 12,\n axisLabel: 14,\n title: 16,\n tooltip: 12,\n },\n colors: [\n '#3b82f6', // blue-500\n '#10b981', // emerald-500\n '#f59e0b', // amber-500\n '#ef4444', // red-500\n '#8b5cf6', // violet-500\n '#ec4899', // pink-500\n '#06b6d4', // cyan-500\n '#f97316', // orange-500\n '#84cc16', // lime-500\n '#6366f1', // indigo-500\n ],\n animation: {\n duration: 300,\n easing: 'ease-out',\n },\n grid: {\n strokeDasharray: '3 3',\n strokeWidth: 1,\n },\n line: {\n strokeWidth: 2,\n dotRadius: 4,\n activeDotRadius: 6,\n },\n bar: {\n radius: 4,\n gap: 0.1, // 10% gap between bars\n },\n tooltip: {\n offset: 10,\n },\n} as const;\n\nexport type ChartColor = string;\n","// Scale utilities for charts\n\nexport interface ScaleLinearOptions {\n domain: [number, number];\n range: [number, number];\n nice?: boolean;\n clamp?: boolean;\n}\n\nexport interface ScaleTimeOptions {\n domain: [Date, Date];\n range: [number, number];\n}\n\nexport interface ScaleBandOptions {\n domain: string[];\n range: [number, number];\n padding?: number;\n paddingInner?: number;\n paddingOuter?: number;\n}\n\n// Linear scale for continuous numeric data\nexport function scaleLinear({ domain, range, nice = false, clamp = false }: ScaleLinearOptions) {\n let [d0, d1] = domain;\n const [r0, r1] = range;\n\n // Nice the domain to round numbers\n if (nice) {\n const span = d1 - d0;\n const step = Math.pow(10, Math.floor(Math.log10(span))) / 2;\n d0 = Math.floor(d0 / step) * step;\n d1 = Math.ceil(d1 / step) * step;\n }\n\n const domainSpan = d1 - d0;\n const rangeSpan = r1 - r0;\n\n return (value: number): number => {\n if (domainSpan === 0) return (r0 + r1) / 2;\n\n let normalized = (value - d0) / domainSpan;\n\n if (clamp) {\n normalized = Math.max(0, Math.min(1, normalized));\n }\n\n return r0 + normalized * rangeSpan;\n };\n}\n\n// Inverse linear scale (for mouse position to value)\nexport function scaleLinearInvert({ domain, range }: ScaleLinearOptions) {\n const [d0, d1] = domain;\n const [r0, r1] = range;\n\n const domainSpan = d1 - d0;\n const rangeSpan = r1 - r0;\n\n return (pixel: number): number => {\n if (rangeSpan === 0) return (d0 + d1) / 2;\n const normalized = (pixel - r0) / rangeSpan;\n return d0 + normalized * domainSpan;\n };\n}\n\n// Time scale for date data\nexport function scaleTime({ domain, range }: ScaleTimeOptions) {\n const [d0, d1] = domain;\n const [r0, r1] = range;\n\n const domainSpan = d1.getTime() - d0.getTime();\n const rangeSpan = r1 - r0;\n\n return (value: Date): number => {\n if (domainSpan === 0) return (r0 + r1) / 2;\n const normalized = (value.getTime() - d0.getTime()) / domainSpan;\n return r0 + normalized * rangeSpan;\n };\n}\n\n// Band scale for categorical data (bar charts)\nexport function scaleBand({ domain, range, padding = 0.1, paddingInner, paddingOuter }: ScaleBandOptions) {\n const [r0, r1] = range;\n const n = domain.length;\n\n if (n === 0) {\n return {\n scale: (_value: string) => r0,\n bandwidth: () => 0,\n step: () => 0,\n };\n }\n\n const inner = paddingInner ?? padding;\n const outer = paddingOuter ?? padding;\n\n const totalRange = r1 - r0;\n const step = totalRange / (n + outer * 2 - inner);\n const bandwidth = step * (1 - inner);\n const start = r0 + step * outer;\n\n const indexMap = new Map(domain.map((d, i) => [d, i]));\n\n return {\n scale: (value: string): number => {\n const index = indexMap.get(value);\n if (index === undefined) return r0;\n return start + index * step;\n },\n bandwidth: () => bandwidth,\n step: () => step,\n };\n}\n\n// Calculate nice tick values\nexport function getTicks(domain: [number, number], count: number = 5): number[] {\n const [min, max] = domain;\n const span = max - min;\n\n if (span === 0) return [min];\n\n const step = span / (count - 1);\n const ticks: number[] = [];\n\n for (let i = 0; i < count; i++) {\n ticks.push(min + step * i);\n }\n\n return ticks;\n}\n\n// Calculate domain from data with optional padding\nexport function calculateDomain(\n values: number[],\n options: { includeZero?: boolean; padding?: number } = {}\n): [number, number] {\n const { includeZero = true, padding = 0.1 } = options;\n\n if (values.length === 0) return [0, 1];\n\n let min = Math.min(...values);\n let max = Math.max(...values);\n\n if (includeZero) {\n min = Math.min(0, min);\n }\n\n const span = max - min;\n const pad = span * padding;\n\n return [min - (includeZero && min >= 0 ? 0 : pad), max + pad];\n}\n","// Path generation utilities for charts\n\nexport interface Point {\n x: number;\n y: number;\n}\n\n// Generate a line path (straight segments)\nexport function generateLinePath(points: Point[]): string {\n if (points.length === 0) return '';\n if (points.length === 1) return `M ${points[0].x} ${points[0].y}`;\n\n return points\n .map((p, i) => `${i === 0 ? 'M' : 'L'} ${p.x} ${p.y}`)\n .join(' ');\n}\n\n// Generate a smooth curved path using cubic bezier\nexport function generateCurvedPath(points: Point[], tension: number = 0.3): string {\n if (points.length === 0) return '';\n if (points.length === 1) return `M ${points[0].x} ${points[0].y}`;\n if (points.length === 2) return generateLinePath(points);\n\n let path = `M ${points[0].x} ${points[0].y}`;\n\n for (let i = 0; i < points.length - 1; i++) {\n const p0 = points[Math.max(0, i - 1)];\n const p1 = points[i];\n const p2 = points[i + 1];\n const p3 = points[Math.min(points.length - 1, i + 2)];\n\n // Calculate control points\n const cp1x = p1.x + (p2.x - p0.x) * tension;\n const cp1y = p1.y + (p2.y - p0.y) * tension;\n const cp2x = p2.x - (p3.x - p1.x) * tension;\n const cp2y = p2.y - (p3.y - p1.y) * tension;\n\n path += ` C ${cp1x} ${cp1y}, ${cp2x} ${cp2y}, ${p2.x} ${p2.y}`;\n }\n\n return path;\n}\n\n// Generate a monotone cubic spline (better for charts - no overshooting)\nexport function generateMonotonePath(points: Point[]): string {\n if (points.length === 0) return '';\n if (points.length === 1) return `M ${points[0].x} ${points[0].y}`;\n if (points.length === 2) return generateLinePath(points);\n\n // Calculate tangents\n const tangents: number[] = [];\n for (let i = 0; i < points.length; i++) {\n if (i === 0) {\n tangents.push((points[1].y - points[0].y) / (points[1].x - points[0].x));\n } else if (i === points.length - 1) {\n tangents.push((points[i].y - points[i - 1].y) / (points[i].x - points[i - 1].x));\n } else {\n const d0 = (points[i].y - points[i - 1].y) / (points[i].x - points[i - 1].x);\n const d1 = (points[i + 1].y - points[i].y) / (points[i + 1].x - points[i].x);\n tangents.push((d0 + d1) / 2);\n }\n }\n\n let path = `M ${points[0].x} ${points[0].y}`;\n\n for (let i = 0; i < points.length - 1; i++) {\n const p0 = points[i];\n const p1 = points[i + 1];\n const dx = (p1.x - p0.x) / 3;\n\n const cp1x = p0.x + dx;\n const cp1y = p0.y + tangents[i] * dx;\n const cp2x = p1.x - dx;\n const cp2y = p1.y - tangents[i + 1] * dx;\n\n path += ` C ${cp1x} ${cp1y}, ${cp2x} ${cp2y}, ${p1.x} ${p1.y}`;\n }\n\n return path;\n}\n\n// Generate step path (for step charts)\nexport function generateStepPath(points: Point[], position: 'before' | 'after' | 'middle' = 'after'): string {\n if (points.length === 0) return '';\n if (points.length === 1) return `M ${points[0].x} ${points[0].y}`;\n\n let path = `M ${points[0].x} ${points[0].y}`;\n\n for (let i = 1; i < points.length; i++) {\n const prev = points[i - 1];\n const curr = points[i];\n\n if (position === 'before') {\n path += ` V ${curr.y} H ${curr.x}`;\n } else if (position === 'after') {\n path += ` H ${curr.x} V ${curr.y}`;\n } else {\n const midX = (prev.x + curr.x) / 2;\n path += ` H ${midX} V ${curr.y} H ${curr.x}`;\n }\n }\n\n return path;\n}\n\n// Generate area path (closed shape with baseline)\nexport function generateAreaPath(\n points: Point[],\n baseline: number,\n curved: boolean = false\n): string {\n if (points.length === 0) return '';\n\n const linePath = curved ? generateMonotonePath(points) : generateLinePath(points);\n const lastPoint = points[points.length - 1];\n const firstPoint = points[0];\n\n return `${linePath} L ${lastPoint.x} ${baseline} L ${firstPoint.x} ${baseline} Z`;\n}\n\n// Generate stacked area path\nexport function generateStackedAreaPath(\n topPoints: Point[],\n bottomPoints: Point[],\n curved: boolean = false\n): string {\n if (topPoints.length === 0) return '';\n\n const topPath = curved ? generateMonotonePath(topPoints) : generateLinePath(topPoints);\n const reversedBottom = [...bottomPoints].reverse();\n const bottomPath = reversedBottom\n .map((p, i) => `${i === 0 ? 'L' : 'L'} ${p.x} ${p.y}`)\n .join(' ');\n\n return `${topPath} ${bottomPath} Z`;\n}\n\n// Generate pie/donut slice path\nexport function generateArcPath(\n centerX: number,\n centerY: number,\n radius: number,\n startAngle: number,\n endAngle: number,\n innerRadius: number = 0\n): string {\n const startRad = (startAngle - 90) * Math.PI / 180;\n const endRad = (endAngle - 90) * Math.PI / 180;\n\n const x1 = centerX + radius * Math.cos(startRad);\n const y1 = centerY + radius * Math.sin(startRad);\n const x2 = centerX + radius * Math.cos(endRad);\n const y2 = centerY + radius * Math.sin(endRad);\n\n const largeArc = endAngle - startAngle > 180 ? 1 : 0;\n\n if (innerRadius === 0) {\n // Pie slice\n return [\n `M ${centerX} ${centerY}`,\n `L ${x1} ${y1}`,\n `A ${radius} ${radius} 0 ${largeArc} 1 ${x2} ${y2}`,\n 'Z'\n ].join(' ');\n } else {\n // Donut slice\n const ix1 = centerX + innerRadius * Math.cos(startRad);\n const iy1 = centerY + innerRadius * Math.sin(startRad);\n const ix2 = centerX + innerRadius * Math.cos(endRad);\n const iy2 = centerY + innerRadius * Math.sin(endRad);\n\n return [\n `M ${x1} ${y1}`,\n `A ${radius} ${radius} 0 ${largeArc} 1 ${x2} ${y2}`,\n `L ${ix2} ${iy2}`,\n `A ${innerRadius} ${innerRadius} 0 ${largeArc} 0 ${ix1} ${iy1}`,\n 'Z'\n ].join(' ');\n }\n}\n","// Formatting utilities for charts\n\n// Format number with appropriate precision\nexport function formatNumber(value: number, options: {\n precision?: number;\n compact?: boolean;\n prefix?: string;\n suffix?: string;\n} = {}): string {\n const { precision = 2, compact = false, prefix = '', suffix = '' } = options;\n\n if (compact) {\n const absValue = Math.abs(value);\n if (absValue >= 1e9) {\n return `${prefix}${(value / 1e9).toFixed(1)}B${suffix}`;\n }\n if (absValue >= 1e6) {\n return `${prefix}${(value / 1e6).toFixed(1)}M${suffix}`;\n }\n if (absValue >= 1e3) {\n return `${prefix}${(value / 1e3).toFixed(1)}K${suffix}`;\n }\n }\n\n // Remove unnecessary decimal places\n const formatted = value.toFixed(precision);\n const trimmed = parseFloat(formatted).toString();\n\n return `${prefix}${trimmed}${suffix}`;\n}\n\n// Format currency\nexport function formatCurrency(value: number, options: {\n currency?: string;\n locale?: string;\n compact?: boolean;\n} = {}): string {\n const { currency = 'USD', locale = 'en-US', compact = false } = options;\n\n if (compact) {\n const absValue = Math.abs(value);\n const sign = value < 0 ? '-' : '';\n const symbol = currency === 'USD' ? '$' : currency;\n\n if (absValue >= 1e9) {\n return `${sign}${symbol}${(absValue / 1e9).toFixed(1)}B`;\n }\n if (absValue >= 1e6) {\n return `${sign}${symbol}${(absValue / 1e6).toFixed(1)}M`;\n }\n if (absValue >= 1e3) {\n return `${sign}${symbol}${(absValue / 1e3).toFixed(1)}K`;\n }\n }\n\n return new Intl.NumberFormat(locale, {\n style: 'currency',\n currency,\n }).format(value);\n}\n\n// Format percentage\nexport function formatPercent(value: number, options: {\n precision?: number;\n multiply?: boolean;\n} = {}): string {\n const { precision = 1, multiply = false } = options;\n const percent = multiply ? value * 100 : value;\n return `${percent.toFixed(precision)}%`;\n}\n\n// Intelligent date formatting based on time range\nexport function formatDate(date: Date, rangeMs?: number): string {\n const minute = 60 * 1000;\n const hour = 60 * minute;\n const day = 24 * hour;\n const month = 30 * day;\n const year = 365 * day;\n\n // If no range specified, use full date\n if (!rangeMs) {\n return date.toLocaleDateString('en-US', {\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n });\n }\n\n if (rangeMs < hour) {\n // Less than 1 hour: show time with seconds\n return date.toLocaleTimeString('en-US', {\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n });\n } else if (rangeMs < day) {\n // Less than 1 day: show time\n return date.toLocaleTimeString('en-US', {\n hour: '2-digit',\n minute: '2-digit',\n });\n } else if (rangeMs < month) {\n // Less than 1 month: show date and time\n return date.toLocaleDateString('en-US', {\n month: 'short',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n });\n } else if (rangeMs < year) {\n // Less than 1 year: show month and day\n return date.toLocaleDateString('en-US', {\n month: 'short',\n day: 'numeric',\n });\n } else {\n // More than 1 year: show month and year\n return date.toLocaleDateString('en-US', {\n month: 'short',\n year: 'numeric',\n });\n }\n}\n\n// Format time duration\nexport function formatDuration(ms: number): string {\n const seconds = Math.floor(ms / 1000);\n const minutes = Math.floor(seconds / 60);\n const hours = Math.floor(minutes / 60);\n const days = Math.floor(hours / 24);\n\n if (days > 0) {\n return `${days}d ${hours % 24}h`;\n }\n if (hours > 0) {\n return `${hours}h ${minutes % 60}m`;\n }\n if (minutes > 0) {\n return `${minutes}m ${seconds % 60}s`;\n }\n return `${seconds}s`;\n}\n\n// Create a tick formatter based on the domain\nexport function createTickFormatter(domain: [number, number]): (value: number) => string {\n const [min, max] = domain;\n const range = max - min;\n\n // Determine appropriate precision\n let precision = 0;\n if (range < 1) {\n precision = 2;\n } else if (range < 10) {\n precision = 1;\n }\n\n // Use compact format for large numbers\n const compact = Math.abs(max) >= 1000 || Math.abs(min) >= 1000;\n\n return (value: number) => formatNumber(value, { precision, compact });\n}\n","\"use client\";\n\nimport React, { useRef, useEffect, useState } from 'react';\n\nexport interface TooltipPayloadItem {\n name: string;\n value: number | string;\n color?: string;\n dataKey?: string;\n payload?: Record<string, unknown>;\n}\n\nexport interface TooltipProps {\n /** Whether the tooltip is currently active/visible */\n active?: boolean;\n /** The label for the tooltip (usually x-axis value) */\n label?: string | number;\n /** Array of data items to display */\n payload?: TooltipPayloadItem[];\n /** Custom content renderer */\n content?: React.FC<TooltipProps> | React.ReactElement;\n /** X position in pixels */\n x?: number;\n /** Y position in pixels */\n y?: number;\n /** Offset from cursor position */\n offset?: number;\n /** Custom formatter for values */\n formatter?: (value: number | string, name: string, payload: TooltipPayloadItem) => string;\n /** Custom formatter for labels */\n labelFormatter?: (label: string | number) => string;\n /** Custom CSS class */\n className?: string;\n /** Container bounds for positioning */\n containerBounds?: { width: number; height: number };\n /** Animation duration in ms (0 to disable) */\n animationDuration?: number;\n}\n\nconst DefaultTooltipContent: React.FC<TooltipProps> = ({\n active,\n label,\n payload,\n formatter,\n labelFormatter,\n}) => {\n if (!active || !payload || payload.length === 0) {\n return null;\n }\n\n const formattedLabel = labelFormatter ? labelFormatter(label ?? '') : String(label ?? '');\n\n return (\n <div className=\"bg-[hsl(var(--popover))] text-white rounded-lg shadow-xl border border-[hsl(var(--border))] overflow-hidden min-w-[120px]\">\n {formattedLabel && (\n <div className=\"px-3 py-2 bg-[hsl(var(--popover))] border-b border-[hsl(var(--border))]\">\n <span className=\"text-sm font-medium text-[hsl(var(--muted-foreground))]\">{formattedLabel}</span>\n </div>\n )}\n <div className=\"px-3 py-2 space-y-1\">\n {payload.map((item, index) => {\n const formattedValue = formatter\n ? formatter(item.value, item.name, item)\n : String(item.value);\n\n return (\n <div key={`${item.name}-${index}`} className=\"flex items-center justify-between gap-4\">\n <div className=\"flex items-center gap-2\">\n {item.color && (\n <span\n className=\"w-2.5 h-2.5 rounded-full flex-shrink-0\"\n style={{ backgroundColor: item.color }}\n />\n )}\n <span className=\"text-xs text-[hsl(var(--muted-foreground))]\">{item.name}</span>\n </div>\n <span className=\"text-sm font-semibold text-white\">{formattedValue}</span>\n </div>\n );\n })}\n </div>\n </div>\n );\n};\n\nexport const ChartTooltip: React.FC<TooltipProps> = ({\n active = false,\n label,\n payload,\n content,\n x = 0,\n y = 0,\n offset = 12,\n formatter,\n labelFormatter,\n className = '',\n containerBounds,\n animationDuration = 150,\n}) => {\n const tooltipRef = useRef<HTMLDivElement>(null);\n const [position, setPosition] = useState({ x: 0, y: 0 });\n const [isVisible, setIsVisible] = useState(false);\n\n // Calculate position with boundary detection\n useEffect(() => {\n if (!active || !tooltipRef.current) {\n setIsVisible(false);\n return;\n }\n\n const tooltip = tooltipRef.current;\n const tooltipRect = tooltip.getBoundingClientRect();\n const tooltipWidth = tooltipRect.width || 150;\n const tooltipHeight = tooltipRect.height || 80;\n\n let newX = x + offset;\n let newY = y - tooltipHeight / 2;\n\n // Adjust for right boundary\n if (containerBounds && newX + tooltipWidth > containerBounds.width) {\n newX = x - tooltipWidth - offset;\n }\n\n // Adjust for left boundary\n if (newX < 0) {\n newX = offset;\n }\n\n // Adjust for top boundary\n if (newY < 0) {\n newY = offset;\n }\n\n // Adjust for bottom boundary\n if (containerBounds && newY + tooltipHeight > containerBounds.height) {\n newY = containerBounds.height - tooltipHeight - offset;\n }\n\n setPosition({ x: newX, y: newY });\n setIsVisible(true);\n }, [active, x, y, offset, containerBounds]);\n\n if (!active) {\n return null;\n }\n\n const tooltipContent = content ? (\n React.isValidElement(content) ? (\n React.cloneElement(content as React.ReactElement<TooltipProps>, {\n active,\n label,\n payload,\n formatter,\n labelFormatter,\n })\n ) : (\n React.createElement(content as React.FC<TooltipProps>, {\n active,\n label,\n payload,\n formatter,\n labelFormatter,\n })\n )\n ) : (\n <DefaultTooltipContent\n active={active}\n label={label}\n payload={payload}\n formatter={formatter}\n labelFormatter={labelFormatter}\n />\n );\n\n return (\n <div\n ref={tooltipRef}\n className={`absolute pointer-events-none z-50 ${className}`}\n style={{\n left: `${position.x}px`,\n top: `${position.y}px`,\n opacity: isVisible ? 1 : 0,\n transform: `translateZ(0)`,\n transition: animationDuration > 0\n ? `opacity ${animationDuration}ms ease-out`\n : undefined,\n }}\n >\n {tooltipContent}\n </div>\n );\n};\n\n// Hook for tooltip state management\nexport interface UseTooltipReturn {\n tooltipData: {\n active: boolean;\n x: number;\n y: number;\n label?: string | number;\n payload?: TooltipPayloadItem[];\n };\n showTooltip: (data: {\n x: number;\n y: number;\n label?: string | number;\n payload?: TooltipPayloadItem[];\n }) => void;\n hideTooltip: () => void;\n updatePosition: (x: number, y: number) => void;\n}\n\nexport function useTooltip(): UseTooltipReturn {\n const [tooltipData, setTooltipData] = useState<UseTooltipReturn['tooltipData']>({\n active: false,\n x: 0,\n y: 0,\n label: undefined,\n payload: undefined,\n });\n\n const showTooltip = React.useCallback((data: {\n x: number;\n y: number;\n label?: string | number;\n payload?: TooltipPayloadItem[];\n }) => {\n setTooltipData({\n active: true,\n ...data,\n });\n }, []);\n\n const hideTooltip = React.useCallback(() => {\n setTooltipData(prev => ({\n ...prev,\n active: false,\n }));\n }, []);\n\n const updatePosition = React.useCallback((x: number, y: number) => {\n setTooltipData(prev => ({\n ...prev,\n x,\n y,\n }));\n }, []);\n\n return {\n tooltipData,\n showTooltip,\n hideTooltip,\n updatePosition,\n };\n}\n","\"use client\";\n\nimport React from 'react';\n\nexport interface LegendItem {\n name: string;\n color: string;\n type?: 'line' | 'square' | 'circle' | 'rect';\n inactive?: boolean;\n}\n\nexport interface LegendProps {\n /** Legend items to display */\n items?: LegendItem[];\n /** Legend layout direction */\n layout?: 'horizontal' | 'vertical';\n /** Alignment */\n align?: 'left' | 'center' | 'right';\n /** Vertical alignment */\n verticalAlign?: 'top' | 'middle' | 'bottom';\n /** Icon size */\n iconSize?: number;\n /** Custom formatter for legend text */\n formatter?: (value: string, entry: LegendItem, index: number) => React.ReactNode;\n /** Click handler */\n onClick?: (item: LegendItem, index: number) => void;\n /** Mouse enter handler */\n onMouseEnter?: (item: LegendItem, index: number) => void;\n /** Mouse leave handler */\n onMouseLeave?: () => void;\n /** Custom CSS class */\n className?: string;\n /** Wrapper style */\n wrapperStyle?: React.CSSProperties;\n}\n\nexport const Legend: React.FC<LegendProps> = ({\n items = [],\n layout = 'horizontal',\n align = 'center',\n verticalAlign = 'bottom',\n iconSize = 12,\n formatter,\n onClick,\n onMouseEnter,\n onMouseLeave,\n className = '',\n wrapperStyle,\n}) => {\n const alignClass = {\n left: 'justify-start',\n center: 'justify-center',\n right: 'justify-end',\n }[align];\n\n const layoutClass = layout === 'horizontal' ? 'flex-row flex-wrap' : 'flex-col';\n\n const renderIcon = (item: LegendItem) => {\n const style = { backgroundColor: item.color };\n\n switch (item.type) {\n case 'line':\n return (\n <div\n className=\"flex-shrink-0\"\n style={{\n width: iconSize,\n height: 2,\n backgroundColor: item.color,\n }}\n />\n );\n case 'circle':\n return (\n <div\n className=\"rounded-full flex-shrink-0\"\n style={{\n width: iconSize,\n height: iconSize,\n ...style,\n }}\n />\n );\n case 'rect':\n case 'square':\n default:\n return (\n <div\n className=\"rounded-sm flex-shrink-0\"\n style={{\n width: iconSize,\n height: iconSize,\n ...style,\n }}\n />\n );\n }\n };\n\n return (\n <div\n className={`flex gap-4 px-4 py-2 ${layoutClass} ${alignClass} ${className}`}\n style={wrapperStyle}\n >\n {items.map((item, index) => (\n <button\n key={`${item.name}-${index}`}\n type=\"button\"\n className={`\n flex items-center gap-2 text-sm transition-opacity\n ${onClick ? 'cursor-pointer hover:opacity-80' : 'cursor-default'}\n ${item.inactive ? 'opacity-40' : 'opacity-100'}\n `}\n onClick={() => onClick?.(item, index)}\n onMouseEnter={() => onMouseEnter?.(item, index)}\n onMouseLeave={onMouseLeave}\n >\n {renderIcon(item)}\n <span className=\"text-[hsl(var(--foreground))]\">\n {formatter ? formatter(item.name, item, index) : item.name}\n </span>\n </button>\n ))}\n </div>\n );\n};\n","\"use client\";\n\nimport React from 'react';\nimport { CHART_DEFAULTS } from '../constants';\n\nexport interface ReferenceLineProps {\n /** X-axis value for vertical line */\n x?: number | string | Date;\n /** Y-axis value for horizontal line */\n y?: number;\n /** Line stroke color */\n stroke?: string;\n /** Line stroke width */\n strokeWidth?: number;\n /** Line dash pattern (e.g., \"5 5\") */\n strokeDasharray?: string;\n /** Label text */\n label?: string | React.ReactNode;\n /** Label position */\n labelPosition?: 'start' | 'middle' | 'end' | 'insideStart' | 'insideEnd';\n /** Custom CSS class for the line */\n className?: string;\n /** If true, the line extends to the edge of the chart */\n ifOverflow?: 'hidden' | 'visible' | 'extendDomain';\n /** Internal - chart dimensions (injected by parent) */\n _chartDimensions?: {\n width: number;\n height: number;\n padding: { top: number; right: number; bottom: number; left: number };\n };\n /** Internal - scale functions (injected by parent) */\n _scales?: {\n xScale: (value: number | string | Date) => number;\n yScale: (value: number) => number;\n };\n}\n\nexport const ReferenceLine: React.FC<ReferenceLineProps> = ({\n x,\n y,\n stroke = '#94a3b8',\n strokeWidth = 1,\n strokeDasharray = '4 4',\n label,\n labelPosition = 'end',\n className = '',\n ifOverflow = 'hidden',\n _chartDimensions,\n _scales,\n}) => {\n // If no internal props provided, this is being rendered standalone (shouldn't happen)\n if (!_chartDimensions || !_scales) {\n return null;\n }\n\n const { width, height } = _chartDimensions;\n const { xScale, yScale } = _scales;\n\n // Determine if this is a horizontal or vertical line\n const isHorizontal = y !== undefined;\n const isVertical = x !== undefined;\n\n if (!isHorizontal && !isVertical) {\n return null;\n }\n\n let x1: number, y1: number, x2: number, y2: number;\n let labelX: number, labelY: number;\n let textAnchor: 'start' | 'middle' | 'end' = 'middle';\n let dominantBaseline: 'auto' | 'middle' | 'hanging' = 'middle';\n\n if (isHorizontal && y !== undefined) {\n // Horizontal line at y value\n const scaledY = yScale(y);\n\n // Skip if out of bounds and overflow is hidden\n if (ifOverflow === 'hidden' && (scaledY < 0 || scaledY > height)) {\n return null;\n }\n\n x1 = 0;\n y1 = scaledY;\n x2 = width;\n y2 = scaledY;\n\n // Label positioning\n switch (labelPosition) {\n case 'start':\n labelX = 0;\n labelY = scaledY - 8;\n textAnchor = 'start';\n break;\n case 'middle':\n labelX = width / 2;\n labelY = scaledY - 8;\n break;\n case 'end':\n labelX = width;\n labelY = scaledY - 8;\n textAnchor = 'end';\n break;\n case 'insideStart':\n labelX = 8;\n labelY = scaledY - 8;\n textAnchor = 'start';\n break;\n case 'insideEnd':\n labelX = width - 8;\n labelY = scaledY - 8;\n textAnchor = 'end';\n break;\n default:\n labelX = width;\n labelY = scaledY - 8;\n textAnchor = 'end';\n }\n } else if (isVertical && x !== undefined) {\n // Vertical line at x value\n const scaledX = xScale(x);\n\n // Skip if out of bounds and overflow is hidden\n if (ifOverflow === 'hidden' && (scaledX < 0 || scaledX > width)) {\n return null;\n }\n\n x1 = scaledX;\n y1 = 0;\n x2 = scaledX;\n y2 = height;\n\n // Label positioning\n switch (labelPosition) {\n case 'start':\n labelX = scaledX;\n labelY = -8;\n dominantBaseline = 'auto';\n break;\n case 'middle':\n labelX = scaledX + 8;\n labelY = height / 2;\n textAnchor = 'start';\n break;\n case 'end':\n labelX = scaledX;\n labelY = height + 16;\n dominantBaseline = 'hanging';\n break;\n case 'insideStart':\n labelX = scaledX + 8;\n labelY = 16;\n textAnchor = 'start';\n dominantBaseline = 'hanging';\n break;\n case 'insideEnd':\n labelX = scaledX + 8;\n labelY = height - 16;\n textAnchor = 'start';\n dominantBaseline = 'auto';\n break;\n default:\n labelX = scaledX;\n labelY = -8;\n dominantBaseline = 'auto';\n }\n } else {\n return null;\n }\n\n return (\n <g className={`reference-line ${className}`}>\n <line\n x1={x1}\n y1={y1}\n x2={x2}\n y2={y2}\n stroke={stroke}\n strokeWidth={strokeWidth}\n strokeDasharray={strokeDasharray}\n />\n {label && (\n typeof label === 'string' ? (\n <text\n x={labelX}\n y={labelY}\n textAnchor={textAnchor}\n dominantBaseline={dominantBaseline}\n fontSize={CHART_DEFAULTS.fontSize.gridLabel}\n fontWeight=\"500\"\n className=\"fill-[hsl(var(--muted-foreground))]\"\n >\n {label}\n </text>\n ) : (\n <foreignObject\n x={labelX - 50}\n y={labelY - 12}\n width={100}\n height={24}\n >\n {label}\n </foreignObject>\n )\n )}\n </g>\n );\n};\n","\"use client\";\n\nimport React from 'react';\nimport { CHART_DEFAULTS } from '../constants';\n\nexport interface ReferenceAreaProps {\n /** Start X value (for vertical bands) */\n x1?: number | string | Date;\n /** End X value (for vertical bands) */\n x2?: number | string | Date;\n /** Start Y value (for horizontal bands) */\n y1?: number;\n /** End Y value (for horizontal bands) */\n y2?: number;\n /** Fill color */\n fill?: string;\n /** Fill opacity (0-1) */\n fillOpacity?: number;\n /** Stroke color */\n stroke?: string;\n /** Stroke width */\n strokeWidth?: number;\n /** Label text */\n label?: string | React.ReactNode;\n /** Label position */\n labelPosition?: 'center' | 'top' | 'bottom' | 'left' | 'right' | 'insideTop' | 'insideBottom';\n /** Custom CSS class */\n className?: string;\n /** If true, area clips to chart bounds */\n ifOverflow?: 'hidden' | 'visible';\n /** Internal - chart dimensions (injected by parent) */\n _chartDimensions?: {\n width: number;\n height: number;\n padding: { top: number; right: number; bottom: number; left: number };\n };\n /** Internal - scale functions (injected by parent) */\n _scales?: {\n xScale: (value: number | string | Date) => number;\n yScale: (value: number) => number;\n };\n}\n\nexport const ReferenceArea: React.FC<ReferenceAreaProps> = ({\n x1,\n x2,\n y1,\n y2,\n fill = '#3b82f6',\n fillOpacity = 0.1,\n stroke,\n strokeWidth = 0,\n label,\n labelPosition = 'center',\n className = '',\n ifOverflow = 'hidden',\n _chartDimensions,\n _scales,\n}) => {\n // If no internal props provided, this is being rendered standalone\n if (!_chartDimensions || !_scales) {\n return null;\n }\n\n const { width, height } = _chartDimensions;\n const { xScale, yScale } = _scales;\n\n // Calculate rectangle bounds\n let rectX: number, rectY: number, rectWidth: number, rectHeight: number;\n\n // Vertical band (x1 to x2)\n if (x1 !== undefined && x2 !== undefined) {\n const scaledX1 = xScale(x1);\n const scaledX2 = xScale(x2);\n\n rectX = Math.min(scaledX1, scaledX2);\n rectWidth = Math.abs(scaledX2 - scaledX1);\n\n if (y1 !== undefined && y2 !== undefined) {\n // Both X and Y specified - specific rectangle\n const scaledY1 = yScale(y1);\n const scaledY2 = yScale(y2);\n rectY = Math.min(scaledY1, scaledY2);\n rectHeight = Math.abs(scaledY2 - scaledY1);\n } else {\n // Only X specified - full height band\n rectY = 0;\n rectHeight = height;\n }\n }\n // Horizontal band (y1 to y2)\n else if (y1 !== undefined && y2 !== undefined) {\n const scaledY1 = yScale(y1);\n const scaledY2 = yScale(y2);\n\n rectY = Math.min(scaledY1, scaledY2);\n rectHeight = Math.abs(scaledY2 - scaledY1);\n rectX = 0;\n rectWidth = width;\n } else {\n return null;\n }\n\n // Clip to bounds if overflow is hidden\n if (ifOverflow === 'hidden') {\n if (rectX < 0) {\n rectWidth += rectX;\n rectX = 0;\n }\n if (rectY < 0) {\n rectHeight += rectY;\n rectY = 0;\n }\n if (rectX + rectWidth > width) {\n rectWidth = width - rectX;\n }\n if (rectY + rectHeight > height) {\n rectHeight = height - rectY;\n }\n\n // Skip if completely out of bounds\n if (rectWidth <= 0 || rectHeight <= 0) {\n return null;\n }\n }\n\n // Calculate label position\n let labelX: number, labelY: number;\n let textAnchor: 'start' | 'middle' | 'end' = 'middle';\n let dominantBaseline: 'auto' | 'middle' | 'hanging' = 'middle';\n\n switch (labelPosition) {\n case 'center':\n labelX = rectX + rectWidth / 2;\n labelY = rectY + rectHeight / 2;\n break;\n case 'top':\n labelX = rectX + rectWidth / 2;\n labelY = rectY - 8;\n dominantBaseline = 'auto';\n break;\n case 'bottom':\n labelX = rectX + rectWidth / 2;\n labelY = rectY + rectHeight + 16;\n dominantBaseline = 'hanging';\n break;\n case 'left':\n labelX = rectX - 8;\n labelY = rectY + rectHeight / 2;\n textAnchor = 'end';\n break;\n case 'right':\n labelX = rectX + rectWidth + 8;\n labelY = rectY + rectHeight / 2;\n textAnchor = 'start';\n break;\n case 'insideTop':\n labelX = rectX + rectWidth / 2;\n labelY = rectY + 16;\n dominantBaseline = 'hanging';\n break;\n case 'insideBottom':\n labelX = rectX + rectWidth / 2;\n labelY = rectY + rectHeight - 16;\n dominantBaseline = 'auto';\n break;\n default:\n labelX = rectX + rectWidth / 2;\n labelY = rectY + rectHeight / 2;\n }\n\n return (\n <g className={`reference-area ${className}`}>\n <rect\n x={rectX}\n y={rectY}\n width={rectWidth}\n height={rectHeight}\n fill={fill}\n fillOpacity={fillOpacity}\n stroke={stroke}\n strokeWidth={strokeWidth}\n />\n {label && (\n typeof label === 'string' ? (\n <text\n x={labelX}\n y={labelY}\n textAnchor={textAnchor}\n dominantBaseline={dominantBaseline}\n fontSize={CHART_DEFAULTS.fontSize.gridLabel}\n fontWeight=\"500\"\n className=\"fill-[hsl(var(--muted-foreground))]\"\n >\n {label}\n </text>\n ) : (\n <foreignObject\n x={labelX - 50}\n y={labelY - 12}\n width={100}\n height={24}\n >\n {label}\n </foreignObject>\n )\n )}\n </g>\n );\n};\n","\"use client\";\n\nimport React, { useMemo } from 'react';\nimport { CHART_DEFAULTS } from '../constants';\n\nexport interface CartesianGridProps {\n /** Show horizontal grid lines */\n horizontal?: boolean;\n /** Show vertical grid lines */\n vertical?: boolean;\n /** Stroke color */\n stroke?: string;\n /** Stroke dash array (e.g., \"3 3\") */\n strokeDasharray?: string;\n /** Stroke width */\n strokeWidth?: number;\n /** Stroke opacity */\n strokeOpacity?: number;\n /** Custom horizontal line positions */\n horizontalPoints?: number[];\n /** Custom vertical line positions */\n verticalPoints?: number[];\n /** Custom CSS class */\n className?: string;\n /** Internal - chart dimensions (injected by parent) */\n _chartDimensions?: {\n width: number;\n height: number;\n };\n}\n\nexport const CartesianGrid: React.FC<CartesianGridProps> = ({\n horizontal = true,\n vertical = true,\n stroke,\n strokeDasharray = CHART_DEFAULTS.grid.strokeDasharray,\n strokeWidth = CHART_DEFAULTS.grid.strokeWidth,\n strokeOpacity = 0.5,\n horizontalPoints,\n verticalPoints,\n className = '',\n _chartDimensions,\n}) => {\n // If no internal props provided, this is being rendered standalone\n if (!_chartDimensions) {\n return null;\n }\n\n const { width, height } = _chartDimensions;\n\n // Generate default grid points if not provided\n const hPoints = useMemo(() => {\n if (horizontalPoints) return horizontalPoints;\n const count = 5;\n return Array.from({ length: count + 1 }, (_, i) => (height / count) * i);\n }, [horizontalPoints, height]);\n\n const vPoints = useMemo(() => {\n if (verticalPoints) return verticalPoints;\n const count = 6;\n return Array.from({ length: count + 1 }, (_, i) => (width / count) * i);\n }, [verticalPoints, width]);\n\n return (\n <g className={`cartesian-grid ${className}`}>\n {horizontal && hPoints.map((y, i) => (\n <line\n key={`h-${i}`}\n x1={0}\n y1={y}\n x2={width}\n y2={y}\n stroke={stroke}\n strokeDasharray={strokeDasharray}\n strokeWidth={strokeWidth}\n strokeOpacity={strokeOpacity}\n className={!stroke ? 'stroke-[hsl(var(--border))]' : undefined}\n />\n ))}\n {vertical && vPoints.map((x, i) => (\n <line\n key={`v-${i}`}\n x1={x}\n y1={0}\n x2={x}\n y2={height}\n stroke={stroke}\n strokeDasharray={strokeDasharray}\n strokeWidth={strokeWidth}\n strokeOpacity={strokeOpacity}\n className={!stroke ? 'stroke-[hsl(var(--border))]' : undefined}\n />\n ))}\n </g>\n );\n};\n","\"use client\";\n\nimport React, { useMemo, useCallback, useRef, useState } from 'react';\nimport { CHART_DEFAULTS } from './constants';\nimport { scaleLinear, scaleBand, calculateDomain, getTicks } from './utils/scales';\nimport { formatNumber, createTickFormatter } from './utils/format';\nimport { ChartTooltip, useTooltip, type TooltipPayloadItem } from './components/ChartTooltip';\nimport { Legend, type LegendItem } from './components/Legend';\nimport { ReferenceLine, type ReferenceLineProps } from './components/ReferenceLine';\nimport { ReferenceArea, type ReferenceAreaProps } from './components/ReferenceArea';\nimport { CartesianGrid } from './components/CartesianGrid';\n\nexport interface BarChartDataPoint {\n x: string | number;\n y: number;\n [key: string]: unknown;\n}\n\nexport interface BarChartSeries {\n name: string;\n data: BarChartDataPoint[];\n color?: string;\n radius?: number;\n}\n\nexport interface BarChartProps {\n /** Chart data - array of series */\n data: BarChartSeries[];\n /** Chart width in pixels */\n width?: number;\n /** Chart height in pixels */\n height?: number;\n /** Padding inside the chart */\n padding?: { top?: number; right?: number; bottom?: number; left?: number };\n /** Show grid lines */\n showGrid?: boolean;\n /** Show X axis */\n showXAxis?: boolean;\n /** Show Y axis */\n showYAxis?: boolean;\n /** Show legend */\n showLegend?: boolean;\n /** Show tooltip on hover */\n showTooltip?: boolean;\n /** Show values on top of bars */\n showValues?: boolean;\n /** Stack bars on top of each other */\n stacked?: boolean;\n /** Horizontal bar orientation */\n horizontal?: boolean;\n /** Bar corner radius */\n barRadius?: number;\n /** Gap between bar groups (0-1) */\n barGap?: number;\n /** Gap between bars in a group (0-1) */\n barCategoryGap?: number;\n /** Animate on load */\n animate?: boolean;\n /** Animation duration in ms */\n animationDuration?: number;\n /** X axis label */\n xAxisLabel?: string;\n /** Y axis label */\n yAxisLabel?: string;\n /** Number of Y axis ticks */\n yAxisTickCount?: number;\n /** Custom Y axis domain */\n yDomain?: [number, number];\n /** Custom Y axis formatter */\n formatYValue?: (value: number) => string;\n /** Custom tooltip formatter */\n tooltipFormatter?: (value: number | string, name: string, payload: TooltipPayloadItem) => string;\n /** Click handler for bars */\n onBarClick?: (data: BarChartDataPoint, seriesIndex: number, barIndex: number) => void;\n /** Hover handler for bars */\n onBarHover?: (data: BarChartDataPoint | null, seriesIndex: number, barIndex: number) => void;\n /** Custom CSS class */\n className?: string;\n /** Chart children (ReferenceLine, etc.) */\n children?: React.ReactNode;\n /** Custom colors array */\n colors?: string[];\n /** ARIA label for accessibility */\n ariaLabel?: string;\n}\n\nexport const BarChart: React.FC<BarChartProps> = ({\n data,\n width: providedWidth,\n height: providedHeight,\n padding: customPadding,\n showGrid = true,\n showXAxis = true,\n showYAxis = true,\n showLegend = true,\n showTooltip = true,\n showValues = false,\n stacked = false,\n horizontal = false,\n barRadius = CHART_DEFAULTS.bar.radius,\n barGap = 0.1,\n barCategoryGap = 0.2,\n animate = true,\n animationDuration = CHART_DEFAULTS.animation.duration,\n xAxisLabel,\n yAxisLabel,\n yAxisTickCount = 5,\n yDomain,\n formatYValue,\n tooltipFormatter,\n onBarClick,\n onBarHover,\n className = '',\n children,\n colors = CHART_DEFAULTS.colors,\n ariaLabel,\n}) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const [hoveredBar, setHoveredBar] = useState<{\n seriesIndex: number;\n barIndex: number;\n } | null>(null);\n\n const { tooltipData, showTooltip: showTooltipFn, hideTooltip } = useTooltip();\n\n // Dimensions\n const width = providedWidth || 800;\n const height = providedHeight || 400;\n\n const padding = useMemo(() => ({\n top: customPadding?.top ?? CHART_DEFAULTS.padding.top,\n right: customPadding?.right ?? CHART_DEFAULTS.padding.right,\n bottom: customPadding?.bottom ?? (showXAxis ? 70 : CHART_DEFAULTS.padding.bottom),\n left: customPadding?.left ?? (showYAxis ? 60 : CHART_DEFAULTS.padding.left),\n }), [customPadding, showXAxis, showYAxis]);\n\n const chartWidth = width - padding.left - padding.right;\n const chartHeight = height - padding.top - padding.bottom;\n\n // Get unique categories (x values)\n const categories = useMemo(() => {\n const cats = data[0]?.data.map(d => String(d.x)) || [];\n return [...new Set(cats)];\n }, [data]);\n\n // Calculate Y domain\n const yDomainCalc = useMemo(() => {\n if (yDomain) return yDomain;\n\n if (stacked) {\n // For stacked, calculate max of cumulative values\n const maxStacked = categories.map((_, catIndex) => {\n return data.reduce((sum, series) => {\n return sum + (series.data[catIndex]?.y || 0);\n }, 0);\n });\n return calculateDomain([0, ...maxStacked], { includeZero: true, padding: 0.1 });\n }\n\n const allY = data.flatMap(s => s.data.map(d => d.y));\n return calculateDomain(allY, { includeZero: true, padding: 0.1 });\n }, [data, categories, stacked, yDomain]);\n\n // Create scales\n const xBandScale = useMemo(() =>\n scaleBand({\n domain: categories,\n range: horizontal ? [chartHeight, 0] : [0, chartWidth],\n padding: barCategoryGap,\n }),\n [categories, chartWidth, chartHeight, horizontal, barCategoryGap]\n );\n\n const yScale = useMemo(() =>\n scaleLinear({\n domain: yDomainCalc,\n range: horizontal ? [0, chartWidth] : [chartHeight, 0],\n }),\n [yDomainCalc, chartWidth, chartHeight, horizontal]\n );\n\n // Y axis ticks\n const yTicks = useMemo(() =>\n getTicks(yDomainCalc, yAxisTickCount),\n [yDomainCalc, yAxisTickCount]\n );\n\n // Y formatter\n const yFormatter = useMemo(() => {\n if (formatYValue) return formatYValue;\n return createTickFormatter(yDomainCalc);\n }, [formatYValue, yDomainCalc]);\n\n // Calculate bar dimensions\n const numSeries = data.length;\n const bandwidth = xBandScale.bandwidth();\n const barWidth = stacked\n ? bandwidth\n : (bandwidth - bandwidth * barGap * (numSeries - 1)) / numSeries;\n\n // Handle bar interactions\n const handleBarEnter = useCallback((\n e: React.MouseEvent,\n seriesIndex: number,\n barIndex: number\n ) => {\n const series = data[seriesIndex];\n const point = series.data[barIndex];\n\n setHoveredBar({ seriesIndex, barIndex });\n\n if (showTooltip && containerRef.current) {\n const rect = containerRef.current.getBoundingClientRect();\n const mouseX = e.clientX - rect.left;\n const mouseY = e.clientY - rect.top;\n\n const payload: TooltipPayloadItem[] = [{\n name: series.name,\n value: point.y,\n color: series.color || colors[seriesIndex % colors.length],\n payload: point,\n }];\n\n showTooltipFn({\n x: mouseX,\n y: mouseY,\n label: String(point.x),\n payload,\n });\n }\n\n onBarHover?.(point, seriesIndex, barIndex);\n }, [data, showTooltip, colors, showTooltipFn, onBarHover]);\n\n const handleBarLeave = useCallback(() => {\n setHoveredBar(null);\n hideTooltip();\n onBarHover?.(null, -1, -1);\n }, [hideTooltip, onBarHover]);\n\n const handleBarClick = useCallback((seriesIndex: number, barIndex: number) => {\n const point = data[seriesIndex].data[barIndex];\n onBarClick?.(point, seriesIndex, barIndex);\n }, [data, onBarClick]);\n\n // Prepare legend items\n const legendItems: LegendItem[] = useMemo(() =>\n data.map((series, i) => ({\n name: series.name,\n color: series.color || colors[i % colors.length],\n type: 'square' as const,\n })),\n [data, colors]\n );\n\n // Render bars\n const bars = useMemo(() => {\n const result: React.ReactNode[] = [];\n\n // Track cumulative values for stacking\n const cumulativeValues: Record<string, number> = {};\n\n data.forEach((series, seriesIndex) => {\n const color = series.color || colors[seriesIndex % colors.length];\n const radius = series.radius ?? barRadius;\n\n series.data.forEach((point, barIndex) => {\n const category = String(point.x);\n const baseX = xBandScale.scale(category);\n\n let barX: number, barY: number, barH: number, barW: number;\n\n if (stacked) {\n const prevValue = cumulativeValues[category] || 0;\n cumulativeValues[category] = prevValue + point.y;\n\n if (horizontal) {\n barX = yScale(prevValue);\n barY = baseX;\n barW = yScale(point.y) - yScale(0);\n barH = bandwidth;\n } else {\n barX = baseX;\n barY = yScale(prevValue + point.y);\n barW = bandwidth;\n barH = yScale(prevValue) - yScale(prevValue + point.y);\n }\n } else {\n const offset = seriesIndex * (barWidth + bandwidth * barGap / numSeries);\n\n if (horizontal) {\n barX = yScale(0);\n barY = baseX + offset;\n barW = yScale(point.y) - yScale(0);\n barH = barWidth;\n } else {\n barX = baseX + offset;\n barY = yScale(Math.max(0, point.y));\n barW = barWidth;\n barH = Math.abs(yScale(point.y) - yScale(0));\n }\n }\n\n const isHovered =\n hoveredBar?.seriesIndex === seriesIndex &&\n hoveredBar?.barIndex === barIndex;\n\n result.push(\n <rect\n key={`bar-${seriesIndex}-${barIndex}`}\n x={barX}\n y={barY}\n width={Math.max(0, barW)}\n height={Math.max(0, barH)}\n rx={radius}\n ry={radius}\n fill={color}\n opacity={isHovered ? 0.8 : 1}\n className=\"cursor-pointer transition-opacity duration-150\"\n style={animate ? {\n transform: horizontal ? 'scaleX(0)' : 'scaleY(0)',\n transformOrigin: horizontal ? 'left' : 'bottom',\n animation: `${horizontal ? 'growX' : 'growY'} ${animationDuration}ms ease-out ${barIndex * 50}ms forwards`,\n } : undefined}\n onMouseEnter={(e) => handleBarEnter(e, seriesIndex, barIndex)}\n onMouseLeave={handleBarLeave}\n onClick={() => handleBarClick(seriesIndex, barIndex)}\n />\n );\n\n // Value labels\n if (showValues) {\n const labelX = horizontal\n ? barX + barW + 8\n : barX + barW / 2;\n const labelY = horizontal\n ? barY + barH / 2\n : barY - 8;\n\n result.push(\n <text\n key={`value-${seriesIndex}-${barIndex}`}\n x={labelX}\n y={labelY}\n textAnchor={horizontal ? 'start' : 'middle'}\n dominantBaseline={horizontal ? 'middle' : 'auto'}\n fontSize={CHART_DEFAULTS.fontSize.gridLabel}\n fontWeight=\"600\"\n className=\"fill-[hsl(var(--foreground))]\"\n style={animate ? {\n opacity: 0,\n animation: `fadeIn 200ms ease-out ${animationDuration + barIndex * 50}ms forwards`,\n } : undefined}\n >\n {yFormatter(point.y)}\n </text>\n );\n }\n });\n });\n\n return result;\n }, [\n data, colors, barRadius, xBandScale, yScale, stacked, horizontal,\n bandwidth, barWidth, barGap, numSeries, hoveredBar, animate,\n animationDuration, showValues, yFormatter, handleBarEnter,\n handleBarLeave, handleBarClick\n ]);\n\n // Reference elements\n const referenceElements = useMemo(() => {\n if (!children) return null;\n\n const chartDimensions = { width: chartWidth, height: chartHeight, padding };\n const scales = {\n xScale: (value: number | string | Date) => xBandScale.scale(String(value)) + bandwidth / 2,\n yScale,\n };\n\n return React.Children.map(children, (child) => {\n if (!React.isValidElement(child)) return child;\n\n if (child.type === ReferenceLine || child.type === ReferenceArea || child.type === CartesianGrid) {\n return React.cloneElement(child as React.ReactElement<any>, {\n _chartDimensions: chartDimensions,\n _scales: scales,\n });\n }\n\n return child;\n });\n }, [children, chartWidth, chartHeight, padding, xBandScale, bandwidth, yScale]);\n\n const accessibleDescription = useMemo(() => {\n if (ariaLabel) return ariaLabel;\n const seriesNames = data.map(s => s.name).join(', ');\n return `Bar chart with ${data.length} series: ${seriesNames}`;\n }, [data, ariaLabel]);\n\n return (\n <div\n ref={containerRef}\n className={`relative ${className}`}\n style={{ width, height: 'auto' }}\n >\n <svg\n width={width}\n height={height}\n viewBox={`0 0 ${width} ${height}`}\n role=\"img\"\n aria-label={accessibleDescription}\n className=\"bg-[hsl(var(--card))]\"\n >\n <defs>\n <style>{`\n @keyframes growY {\n from { transform: scaleY(0); }\n to { transform: scaleY(1); }\n }\n @keyframes growX {\n from { transform: scaleX(0); }\n to { transform: scaleX(1); }\n }\n @keyframes fadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n }\n `}</style>\n </defs>\n\n <g transform={`translate(${padding.left}, ${padding.top})`}>\n {/* Grid */}\n {showGrid && (\n <CartesianGrid\n _chartDimensions={{ width: chartWidth, height: chartHeight }}\n horizontal={!horizontal}\n vertical={horizontal}\n horizontalPoints={horizontal ? undefined : yTicks.map(t => yScale(t))}\n verticalPoints={horizontal ? yTicks.map(t => yScale(t)) : undefined}\n />\n )}\n\n {/* Reference elements */}\n {referenceElements}\n\n {/* Bars */}\n {bars}\n\n {/* X Axis */}\n {showXAxis && (\n <g transform={`translate(0, ${chartHeight})`}>\n <line\n x1={0}\n y1={0}\n x2={chartWidth}\n y2={0}\n className=\"stroke-[hsl(var(--border))]\"\n />\n {categories.map((cat, i) => {\n const x = xBandScale.scale(cat) + bandwidth / 2;\n return (\n <g key={`x-tick-${i}`} transform={`translate(${x}, 0)`}>\n <line y2={6} className=\"stroke-[hsl(var(--border))]\" />\n <text\n y={20}\n textAnchor=\"middle\"\n fontSize={CHART_DEFAULTS.fontSize.gridLabel}\n className=\"fill-[hsl(var(--muted-foreground))]\"\n >\n {cat}\n </text>\n </g>\n );\n })}\n {xAxisLabel && (\n <text\n x={chartWidth / 2}\n y={50}\n textAnchor=\"middle\"\n fontSize={CHART_DEFAULTS.fontSize.axisLabel}\n fontWeight=\"500\"\n className=\"fill-[hsl(var(--foreground))]\"\n >\n {xAxisLabel}\n </text>\n )}\n </g>\n )}\n\n {/* Y Axis */}\n {showYAxis && (\n <g>\n <line\n x1={0}\n y1={0}\n x2={0}\n y2={chartHeight}\n className=\"stroke-[hsl(var(--border))]\"\n />\n {yTicks.map((tick, i) => (\n <g key={`y-tick-${i}`} transform={`translate(0, ${yScale(tick)})`}>\n <line x2={-6} className=\"stroke-[hsl(var(--border))]\" />\n <text\n x={-12}\n textAnchor=\"end\"\n dominantBaseline=\"middle\"\n fontSize={CHART_DEFAULTS.fontSize.gridLabel}\n className=\"fill-[hsl(var(--muted-foreground))]\"\n >\n {yFormatter(tick)}\n </text>\n </g>\n ))}\n {yAxisLabel && (\n <text\n x={-chartHeight / 2}\n y={-45}\n textAnchor=\"middle\"\n transform=\"rotate(-90)\"\n fontSize={CHART_DEFAULTS.fontSize.axisLabel}\n fontWeight=\"500\"\n className=\"fill-[hsl(var(--foreground))]\"\n >\n {yAxisLabel}\n </text>\n )}\n </g>\n )}\n </g>\n </svg>\n\n {/* Legend */}\n {showLegend && (\n <Legend items={legendItems} layout=\"horizontal\" align=\"center\" />\n )}\n\n {/* Tooltip */}\n {showTooltip && (\n <ChartTooltip\n {...tooltipData}\n formatter={tooltipFormatter}\n containerBounds={{ width, height }}\n />\n )}\n </div>\n );\n};\n","\"use client\";\n\nimport React, { useMemo, useCallback, useRef, useState } from 'react';\nimport { CHART_DEFAULTS } from './constants';\nimport { scaleLinear, calculateDomain, getTicks } from './utils/scales';\nimport { generateLinePath, generateMonotonePath, generateAreaPath, generateStackedAreaPath } from './utils/paths';\nimport { formatDate, createTickFormatter } from './utils/format';\nimport { ChartTooltip, useTooltip, type TooltipPayloadItem } from './components/ChartTooltip';\nimport { Legend, type LegendItem } from './components/Legend';\nimport { ReferenceLine } from './components/ReferenceLine';\nimport { ReferenceArea } from './components/ReferenceArea';\nimport { CartesianGrid } from './components/CartesianGrid';\n\nexport interface AreaChartDataPoint {\n x: string | number | Date;\n y: number;\n [key: string]: unknown;\n}\n\nexport interface AreaChartSeries {\n name: string;\n data: AreaChartDataPoint[];\n color?: string;\n fillOpacity?: number;\n strokeWidth?: number;\n type?: 'linear' | 'monotone';\n dot?: boolean;\n}\n\nexport interface AreaChartProps {\n /** Chart data - array of series */\n data: AreaChartSeries[];\n /** Chart width in pixels */\n width?: number;\n /** Chart height in pixels */\n height?: number;\n /** Padding inside the chart */\n padding?: { top?: number; right?: number; bottom?: number; left?: number };\n /** Show grid lines */\n showGrid?: boolean;\n /** Show X axis */\n showXAxis?: boolean;\n /** Show Y axis */\n showYAxis?: boolean;\n /** Show legend */\n showLegend?: boolean;\n /** Show tooltip on hover */\n showTooltip?: boolean;\n /** Show dots on data points */\n showDots?: boolean;\n /** Stack areas on top of each other */\n stacked?: boolean;\n /** Default fill opacity for areas */\n fillOpacity?: number;\n /** Use curved/smooth lines (shorthand for all series) */\n curved?: boolean;\n /** Animate on load */\n animate?: boolean;\n /** Animation duration in ms */\n animationDuration?: number;\n /** X axis label */\n xAxisLabel?: string;\n /** Y axis label */\n yAxisLabel?: string;\n /** Number of Y axis ticks */\n yAxisTickCount?: number;\n /** Custom Y axis domain */\n yDomain?: [number, number];\n /** Custom X axis formatter */\n formatXValue?: (value: string | number | Date) => string;\n /** Custom Y axis formatter */\n formatYValue?: (value: number) => string;\n /** Custom tooltip formatter */\n tooltipFormatter?: (value: number | string, name: string, payload: TooltipPayloadItem) => string;\n /** Click handler for data points */\n onPointClick?: (data: AreaChartDataPoint, seriesIndex: number, pointIndex: number) => void;\n /** Hover handler for data points */\n onPointHover?: (data: AreaChartDataPoint | null, seriesIndex: number, pointIndex: number) => void;\n /** Custom CSS class */\n className?: string;\n /** Chart children (ReferenceLine, etc.) */\n children?: React.ReactNode;\n /** Custom colors array */\n colors?: string[];\n /** ARIA label for accessibility */\n ariaLabel?: string;\n}\n\nexport const AreaChart: React.FC<AreaChartProps> = ({\n data,\n width: providedWidth,\n height: providedHeight,\n padding: customPadding,\n showGrid = true,\n showXAxis = true,\n showYAxis = true,\n showLegend = true,\n showTooltip = true,\n showDots = false,\n stacked = false,\n fillOpacity = 0.3,\n curved = true,\n animate = true,\n animationDuration = CHART_DEFAULTS.animation.duration,\n xAxisLabel,\n yAxisLabel,\n yAxisTickCount = 5,\n yDomain,\n formatXValue,\n formatYValue,\n tooltipFormatter,\n onPointClick,\n onPointHover,\n className = '',\n children,\n colors = CHART_DEFAULTS.colors,\n ariaLabel,\n}) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const [hoveredPoint, setHoveredPoint] = useState<{\n seriesIndex: number;\n pointIndex: number;\n } | null>(null);\n\n const { tooltipData, showTooltip: showTooltipFn, hideTooltip } = useTooltip();\n\n // Dimensions\n const width = providedWidth || 800;\n const height = providedHeight || 400;\n\n const padding = useMemo(() => ({\n top: customPadding?.top ?? CHART_DEFAULTS.padding.top,\n right: customPadding?.right ?? CHART_DEFAULTS.padding.right,\n bottom: customPadding?.bottom ?? (showXAxis ? 60 : CHART_DEFAULTS.padding.bottom),\n left: customPadding?.left ?? (showYAxis ? 60 : CHART_DEFAULTS.padding.left),\n }), [customPadding, showXAxis, showYAxis]);\n\n const chartWidth = width - padding.left - padding.right;\n const chartHeight = height - padding.top - padding.bottom;\n\n // Collect all data points\n const allPoints = useMemo(() =>\n data.flatMap(series => series.data),\n [data]\n );\n\n // Determine X value type\n const xValueType = useMemo(() => {\n const firstX = data[0]?.data[0]?.x;\n if (firstX instanceof Date) return 'date';\n if (typeof firstX === 'number') return 'number';\n return 'string';\n }, [data]);\n\n // Calculate domains\n const xDomainCalc = useMemo(() => {\n if (xValueType === 'date') {\n const dates = allPoints.map(p => (p.x as Date).getTime());\n return [Math.min(...dates), Math.max(...dates)] as [number, number];\n }\n if (xValueType === 'number') {\n const nums = allPoints.map(p => p.x as number);\n return [Math.min(...nums), Math.max(...nums)] as [number, number];\n }\n const maxLen = Math.max(...data.map(s => s.data.length));\n return [0, maxLen - 1] as [number, number];\n }, [allPoints, xValueType, data]);\n\n const yDomainCalc = useMemo(() => {\n if (yDomain) return yDomain;\n\n if (stacked) {\n // For stacked, calculate max of cumulative values\n const maxPoints = Math.max(...data.map(s => s.data.length));\n const maxStacked = Array.from({ length: maxPoints }, (_, i) => {\n return data.reduce((sum, series) => sum + (series.data[i]?.y || 0), 0);\n });\n return calculateDomain([0, ...maxStacked], { includeZero: true, padding: 0.1 });\n }\n\n const yValues = allPoints.map(p => p.y);\n return calculateDomain(yValues, { includeZero: true, padding: 0.1 });\n }, [allPoints, stacked, data, yDomain]);\n\n // Create scale functions\n const xScale = useMemo(() => {\n if (xValueType === 'date') {\n return (value: string | number | Date) => {\n const time = value instanceof Date ? value.getTime() : Number(value);\n return scaleLinear({\n domain: xDomainCalc,\n range: [0, chartWidth],\n })(time);\n };\n }\n if (xValueType === 'number') {\n const scale = scaleLinear({\n domain: xDomainCalc,\n range: [0, chartWidth],\n });\n return (value: string | number | Date) => scale(Number(value));\n }\n return (_value: string | number | Date, index: number = 0) => {\n const maxLen = Math.max(...data.map(s => s.data.length)) - 1;\n if (maxLen === 0) return chartWidth / 2;\n return (index / maxLen) * chartWidth;\n };\n }, [xValueType, xDomainCalc, chartWidth, data]);\n\n const yScale = useMemo(() =>\n scaleLinear({\n domain: yDomainCalc,\n range: [chartHeight, 0],\n }),\n [yDomainCalc, chartHeight]\n );\n\n // Y axis ticks\n const yTicks = useMemo(() =>\n getTicks(yDomainCalc, yAxisTickCount),\n [yDomainCalc, yAxisTickCount]\n );\n\n // X axis ticks\n const xTicks = useMemo(() => {\n if (xValueType === 'string') {\n return data[0]?.data.map((p, i) => ({ value: p.x, index: i })) || [];\n }\n const tickCount = Math.min(6, Math.max(2, data[0]?.data.length || 2));\n const ticks = getTicks(xDomainCalc, tickCount);\n return ticks.map(t => ({ value: t, index: 0 }));\n }, [xValueType, xDomainCalc, data]);\n\n // Format functions\n const xFormatter = useCallback((value: string | number | Date) => {\n if (formatXValue) return formatXValue(value);\n if (value instanceof Date) {\n const range = xDomainCalc[1] - xDomainCalc[0];\n return formatDate(value, range);\n }\n return String(value);\n }, [formatXValue, xDomainCalc]);\n\n const yFormatter = useMemo(() => {\n if (formatYValue) return formatYValue;\n return createTickFormatter(yDomainCalc);\n }, [formatYValue, yDomainCalc]);\n\n // Generate area paths\n const areaPaths = useMemo(() => {\n const paths: Array<{\n areaPath: string;\n linePath: string;\n points: Array<{ x: number; y: number }>;\n }> = [];\n\n // Track cumulative values for stacking\n const cumulativeY: number[] = Array(data[0]?.data.length || 0).fill(0);\n\n data.forEach((series) => {\n // Determine if curved: use series type if specified, otherwise use prop\n const seriesType = series.type;\n const isCurved = seriesType !== undefined ? seriesType === 'monotone' : curved;\n\n // Calculate points\n const points = series.data.map((point, i) => {\n const x = xScale(point.x, i);\n const baseY = stacked ? cumulativeY[i] : 0;\n const y = yScale(baseY + point.y);\n return { x, y, baseY: yScale(baseY) };\n });\n\n // Update cumulative for stacking\n if (stacked) {\n series.data.forEach((point, i) => {\n cumulativeY[i] += point.y;\n });\n }\n\n // Generate paths\n const linePoints = points.map(p => ({ x: p.x, y: p.y }));\n const linePath = isCurved\n ? generateMonotonePath(linePoints)\n : generateLinePath(linePoints);\n\n let areaPath: string;\n if (stacked && paths.length > 0) {\n // For stacked, use previous series as baseline\n const prevPoints = paths[paths.length - 1].points;\n areaPath = generateStackedAreaPath(linePoints, prevPoints, isCurved);\n } else {\n areaPath = generateAreaPath(linePoints, yScale(0), isCurved);\n }\n\n paths.push({\n areaPath,\n linePath,\n points: linePoints,\n });\n });\n\n return paths;\n }, [data, xScale, yScale, stacked, curved]);\n\n // Handle point interactions\n const handlePointEnter = useCallback((\n e: React.MouseEvent,\n seriesIndex: number,\n pointIndex: number\n ) => {\n const series = data[seriesIndex];\n const point = series.data[pointIndex];\n\n setHoveredPoint({ seriesIndex, pointIndex });\n\n if (showTooltip && containerRef.current) {\n const rect = containerRef.current.getBoundingClientRect();\n const mouseX = e.clientX - rect.left;\n const mouseY = e.clientY - rect.top;\n\n const payload: TooltipPayloadItem[] = [{\n name: series.name,\n value: point.y,\n color: series.color || colors[seriesIndex % colors.length],\n payload: point,\n }];\n\n showTooltipFn({\n x: mouseX,\n y: mouseY,\n label: xFormatter(point.x),\n payload,\n });\n }\n\n onPointHover?.(point, seriesIndex, pointIndex);\n }, [data, showTooltip, colors, xFormatter, showTooltipFn, onPointHover]);\n\n const handlePointLeave = useCallback(() => {\n setHoveredPoint(null);\n hideTooltip();\n onPointHover?.(null, -1, -1);\n }, [hideTooltip, onPointHover]);\n\n const handlePointClick = useCallback((seriesIndex: number, pointIndex: number) => {\n const point = data[seriesIndex].data[pointIndex];\n onPointClick?.(point, seriesIndex, pointIndex);\n }, [data, onPointClick]);\n\n // Prepare legend items\n const legendItems: LegendItem[] = useMemo(() =>\n data.map((series, i) => ({\n name: series.name,\n color: series.color || colors[i % colors.length],\n type: 'square' as const,\n })),\n [data, colors]\n );\n\n // Reference elements\n const referenceElements = useMemo(() => {\n if (!children) return null;\n\n const chartDimensions = { width: chartWidth, height: chartHeight, padding };\n const scales = {\n xScale: (value: number | string | Date) => {\n if (xValueType === 'string') {\n const index = data[0]?.data.findIndex(p => p.x === value) ?? 0;\n return xScale(value, index);\n }\n return xScale(value, 0);\n },\n yScale,\n };\n\n return React.Children.map(children, (child) => {\n if (!React.isValidElement(child)) return child;\n\n if (child.type === ReferenceLine || child.type === ReferenceArea || child.type === CartesianGrid) {\n return React.cloneElement(child as React.ReactElement<any>, {\n _chartDimensions: chartDimensions,\n _scales: scales,\n });\n }\n\n return child;\n });\n }, [children, chartWidth, chartHeight, padding, xScale, yScale, xValueType, data]);\n\n const accessibleDescription = useMemo(() => {\n if (ariaLabel) return ariaLabel;\n const seriesNames = data.map(s => s.name).join(', ');\n return `Area chart with ${data.length} series: ${seriesNames}`;\n }, [data, ariaLabel]);\n\n return (\n <div\n ref={containerRef}\n className={`relative ${className}`}\n style={{ width, height: 'auto' }}\n >\n <svg\n width={width}\n height={height}\n viewBox={`0 0 ${width} ${height}`}\n role=\"img\"\n aria-label={accessibleDescription}\n className=\"bg-[hsl(var(--card))]\"\n >\n <defs>\n {/* Gradients for areas */}\n {data.map((series, i) => {\n const color = series.color || colors[i % colors.length];\n return (\n <linearGradient\n key={`gradient-${i}`}\n id={`area-gradient-${i}`}\n x1=\"0\"\n y1=\"0\"\n x2=\"0\"\n y2=\"1\"\n >\n <stop offset=\"0%\" stopColor={color} stopOpacity={series.fillOpacity ?? fillOpacity} />\n <stop offset=\"100%\" stopColor={color} stopOpacity={0.05} />\n </linearGradient>\n );\n })}\n <style>{`\n @keyframes fadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n }\n @keyframes drawPath {\n from { stroke-dashoffset: 2000; }\n to { stroke-dashoffset: 0; }\n }\n `}</style>\n </defs>\n\n <g transform={`translate(${padding.left}, ${padding.top})`}>\n {/* Grid */}\n {showGrid && (\n <CartesianGrid\n _chartDimensions={{ width: chartWidth, height: chartHeight }}\n horizontalPoints={yTicks.map(t => yScale(t))}\n />\n )}\n\n {/* Reference elements */}\n {referenceElements}\n\n {/* Areas - render in reverse order for stacking visibility */}\n {[...data].reverse().map((series, reversedIndex) => {\n const seriesIndex = data.length - 1 - reversedIndex;\n const { areaPath, linePath } = areaPaths[seriesIndex];\n const color = series.color || colors[seriesIndex % colors.length];\n const strokeWidth = series.strokeWidth || CHART_DEFAULTS.line.strokeWidth;\n\n return (\n <g key={`area-${seriesIndex}`}>\n {/* Filled area */}\n <path\n d={areaPath}\n fill={`url(#area-gradient-${seriesIndex})`}\n style={animate ? {\n opacity: 0,\n animation: `fadeIn ${animationDuration}ms ease-out forwards`,\n } : undefined}\n />\n {/* Stroke line */}\n <path\n d={linePath}\n fill=\"none\"\n stroke={color}\n strokeWidth={strokeWidth}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n style={animate ? {\n strokeDasharray: 2000,\n animation: `drawPath ${animationDuration}ms ease-out forwards`,\n } : undefined}\n />\n </g>\n );\n })}\n\n {/* Data points */}\n {showDots && data.map((series, seriesIndex) => {\n const { points } = areaPaths[seriesIndex];\n const color = series.color || colors[seriesIndex % colors.length];\n const showSeriesDots = series.dot !== false;\n\n if (!showSeriesDots) return null;\n\n return points.map((point, pointIndex) => {\n const isHovered =\n hoveredPoint?.seriesIndex === seriesIndex &&\n hoveredPoint?.pointIndex === pointIndex;\n\n return (\n <circle\n key={`dot-${seriesIndex}-${pointIndex}`}\n cx={point.x}\n cy={point.y}\n r={isHovered ? CHART_DEFAULTS.line.activeDotRadius : CHART_DEFAULTS.line.dotRadius}\n fill={color}\n stroke=\"white\"\n strokeWidth={2}\n className=\"cursor-pointer transition-all duration-150\"\n style={animate ? {\n opacity: 0,\n animation: `fadeIn 200ms ease-out ${animationDuration + pointIndex * 20}ms forwards`,\n } : undefined}\n onMouseEnter={(e) => handlePointEnter(e, seriesIndex, pointIndex)}\n onMouseLeave={handlePointLeave}\n onClick={() => handlePointClick(seriesIndex, pointIndex)}\n />\n );\n });\n })}\n\n {/* X Axis */}\n {showXAxis && (\n <g transform={`translate(0, ${chartHeight})`}>\n <line\n x1={0}\n y1={0}\n x2={chartWidth}\n y2={0}\n className=\"stroke-[hsl(var(--border))]\"\n />\n {xTicks.map((tick, i) => {\n const x = xValueType === 'string'\n ? xScale(tick.value, tick.index)\n : xScale(xValueType === 'date' ? new Date(tick.value as number) : tick.value, 0);\n\n return (\n <g key={`x-tick-${i}`} transform={`translate(${x}, 0)`}>\n <line y2={6} className=\"stroke-[hsl(var(--border))]\" />\n <text\n y={20}\n textAnchor=\"middle\"\n fontSize={CHART_DEFAULTS.fontSize.gridLabel}\n className=\"fill-[hsl(var(--muted-foreground))]\"\n >\n {xFormatter(xValueType === 'date' ? new Date(tick.value as number) : tick.value)}\n </text>\n </g>\n );\n })}\n {xAxisLabel && (\n <text\n x={chartWidth / 2}\n y={50}\n textAnchor=\"middle\"\n fontSize={CHART_DEFAULTS.fontSize.axisLabel}\n fontWeight=\"500\"\n className=\"fill-[hsl(var(--foreground))]\"\n >\n {xAxisLabel}\n </text>\n )}\n </g>\n )}\n\n {/* Y Axis */}\n {showYAxis && (\n <g>\n <line\n x1={0}\n y1={0}\n x2={0}\n y2={chartHeight}\n className=\"stroke-[hsl(var(--border))]\"\n />\n {yTicks.map((tick, i) => (\n <g key={`y-tick-${i}`} transform={`translate(0, ${yScale(tick)})`}>\n <line x2={-6} className=\"stroke-[hsl(var(--border))]\" />\n <text\n x={-12}\n textAnchor=\"end\"\n dominantBaseline=\"middle\"\n fontSize={CHART_DEFAULTS.fontSize.gridLabel}\n className=\"fill-[hsl(var(--muted-foreground))]\"\n >\n {yFormatter(tick)}\n </text>\n </g>\n ))}\n {yAxisLabel && (\n <text\n x={-chartHeight / 2}\n y={-45}\n textAnchor=\"middle\"\n transform=\"rotate(-90)\"\n fontSize={CHART_DEFAULTS.fontSize.axisLabel}\n fontWeight=\"500\"\n className=\"fill-[hsl(var(--foreground))]\"\n >\n {yAxisLabel}\n </text>\n )}\n </g>\n )}\n </g>\n </svg>\n\n {/* Legend */}\n {showLegend && (\n <Legend items={legendItems} layout=\"horizontal\" align=\"center\" />\n )}\n\n {/* Tooltip */}\n {showTooltip && (\n <ChartTooltip\n {...tooltipData}\n formatter={tooltipFormatter}\n containerBounds={{ width, height }}\n />\n )}\n </div>\n );\n};\n","\"use client\";\n\nimport React, { useMemo, useCallback, useRef, useState } from 'react';\nimport { CHART_DEFAULTS } from './constants';\nimport { generateArcPath } from './utils/paths';\nimport { formatNumber, formatPercent } from './utils/format';\nimport { ChartTooltip, useTooltip, type TooltipPayloadItem } from './components/ChartTooltip';\nimport { Legend, type LegendItem } from './components/Legend';\n\nexport interface PieChartDataPoint {\n label: string;\n value: number;\n color?: string;\n [key: string]: unknown;\n}\n\nexport interface PieChartProps {\n /** Chart data - array of slices */\n data: PieChartDataPoint[];\n /** Chart width in pixels */\n width?: number;\n /** Chart height in pixels */\n height?: number;\n /** Inner radius for donut chart (0 for pie) */\n innerRadius?: number;\n /** Outer radius */\n outerRadius?: number;\n /** Enable donut mode (sets default inner radius) */\n donut?: boolean;\n /** Padding angle between slices (degrees) */\n paddingAngle?: number;\n /** Start angle (degrees, 0 = top) */\n startAngle?: number;\n /** End angle (degrees) */\n endAngle?: number;\n /** Show legend */\n showLegend?: boolean;\n /** Show tooltip on hover */\n showTooltip?: boolean;\n /** Show labels on slices */\n showLabels?: boolean;\n /** Label type */\n labelType?: 'percent' | 'value' | 'name' | 'custom';\n /** Custom label formatter */\n labelFormatter?: (data: PieChartDataPoint, percent: number) => string;\n /** Show percentages in labels */\n showPercentages?: boolean;\n /** Minimum percentage to show label */\n minLabelPercent?: number;\n /** Animate on load */\n animate?: boolean;\n /** Animation duration in ms */\n animationDuration?: number;\n /** Center label (for donut charts) */\n centerLabel?: string | React.ReactNode;\n /** Center value (for donut charts) */\n centerValue?: string | number;\n /** Custom tooltip formatter */\n tooltipFormatter?: (value: number | string, name: string, payload: TooltipPayloadItem) => string;\n /** Click handler for slices */\n onSliceClick?: (data: PieChartDataPoint, index: number) => void;\n /** Hover handler for slices */\n onSliceHover?: (data: PieChartDataPoint | null, index: number) => void;\n /** Custom CSS class */\n className?: string;\n /** Custom colors array */\n colors?: string[];\n /** ARIA label for accessibility */\n ariaLabel?: string;\n}\n\nexport const PieChart: React.FC<PieChartProps> = ({\n data,\n width: providedWidth,\n height: providedHeight,\n innerRadius: providedInnerRadius,\n outerRadius: providedOuterRadius,\n donut = false,\n paddingAngle = 0,\n startAngle = 0,\n endAngle = 360,\n showLegend = true,\n showTooltip = true,\n showLabels = true,\n labelType = 'percent',\n labelFormatter,\n showPercentages = false,\n minLabelPercent = 5,\n animate = true,\n animationDuration = CHART_DEFAULTS.animation.duration,\n centerLabel,\n centerValue,\n tooltipFormatter,\n onSliceClick,\n onSliceHover,\n className = '',\n colors = CHART_DEFAULTS.colors,\n ariaLabel,\n}) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const [hoveredSlice, setHoveredSlice] = useState<number | null>(null);\n const [activeSlice, setActiveSlice] = useState<number | null>(null);\n\n const { tooltipData, showTooltip: showTooltipFn, hideTooltip } = useTooltip();\n\n // Dimensions\n const width = providedWidth || 400;\n const height = providedHeight || 400;\n const size = Math.min(width, height);\n const centerX = width / 2;\n const centerY = height / 2;\n\n // Calculate radii\n const maxRadius = size / 2 - 20; // Padding for labels\n const outerRadius = providedOuterRadius || maxRadius;\n // If donut prop is true and no innerRadius specified, use 60% of outerRadius\n const innerRadius = providedInnerRadius ?? (donut ? outerRadius * 0.6 : 0);\n const isDonut = innerRadius > 0;\n\n // Calculate total and percentages\n const total = useMemo(() =>\n data.reduce((sum, d) => sum + d.value, 0),\n [data]\n );\n\n // Generate slices\n const slices = useMemo(() => {\n const angleRange = endAngle - startAngle;\n let currentAngle = startAngle;\n\n return data.map((item, index) => {\n const percent = total > 0 ? (item.value / total) * 100 : 0;\n const sliceAngle = (item.value / total) * angleRange;\n\n // Account for padding\n const actualStartAngle = currentAngle + (paddingAngle / 2);\n const actualEndAngle = currentAngle + sliceAngle - (paddingAngle / 2);\n\n const path = generateArcPath(\n centerX,\n centerY,\n outerRadius,\n actualStartAngle,\n actualEndAngle,\n innerRadius\n );\n\n // Calculate label position\n const midAngle = currentAngle + sliceAngle / 2;\n const labelRadius = isDonut\n ? innerRadius + (outerRadius - innerRadius) / 2\n : outerRadius * 0.65;\n const labelRad = (midAngle - 90) * Math.PI / 180;\n const labelX = centerX + labelRadius * Math.cos(labelRad);\n const labelY = centerY + labelRadius * Math.sin(labelRad);\n\n currentAngle += sliceAngle;\n\n return {\n ...item,\n index,\n path,\n percent,\n startAngle: actualStartAngle,\n endAngle: actualEndAngle,\n midAngle,\n labelX,\n labelY,\n color: item.color || colors[index % colors.length],\n };\n });\n }, [data, total, startAngle, endAngle, paddingAngle, centerX, centerY, outerRadius, innerRadius, isDonut, colors]);\n\n // Handle slice interactions\n const handleSliceEnter = useCallback((\n e: React.MouseEvent,\n index: number\n ) => {\n const slice = slices[index];\n\n setHoveredSlice(index);\n\n if (showTooltip && containerRef.current) {\n const rect = containerRef.current.getBoundingClientRect();\n const mouseX = e.clientX - rect.left;\n const mouseY = e.clientY - rect.top;\n\n const payload: TooltipPayloadItem[] = [{\n name: slice.label,\n value: slice.value,\n color: slice.color,\n payload: data[index],\n }];\n\n showTooltipFn({\n x: mouseX,\n y: mouseY,\n label: slice.label,\n payload,\n });\n }\n\n onSliceHover?.(data[index], index);\n }, [slices, data, showTooltip, showTooltipFn, onSliceHover]);\n\n const handleSliceLeave = useCallback(() => {\n setHoveredSlice(null);\n hideTooltip();\n onSliceHover?.(null, -1);\n }, [hideTooltip, onSliceHover]);\n\n const handleSliceClick = useCallback((index: number) => {\n setActiveSlice(prev => prev === index ? null : index);\n onSliceClick?.(data[index], index);\n }, [data, onSliceClick]);\n\n // Generate label text\n const getLabelText = useCallback((slice: typeof slices[0]) => {\n if (labelFormatter) {\n return labelFormatter(data[slice.index], slice.percent);\n }\n\n switch (labelType) {\n case 'percent':\n return `${slice.percent.toFixed(1)}%`;\n case 'value':\n return formatNumber(slice.value);\n case 'name':\n return slice.label;\n default:\n return `${slice.percent.toFixed(1)}%`;\n }\n }, [labelType, labelFormatter, data]);\n\n // Prepare legend items\n const legendItems: LegendItem[] = useMemo(() =>\n data.map((item, i) => ({\n name: `${item.label}${showPercentages ? ` (${((item.value / total) * 100).toFixed(1)}%)` : ''}`,\n color: item.color || colors[i % colors.length],\n type: 'square' as const,\n })),\n [data, colors, total, showPercentages]\n );\n\n const accessibleDescription = useMemo(() => {\n if (ariaLabel) return ariaLabel;\n const sliceNames = data.map(d => `${d.label}: ${d.value}`).join(', ');\n return `${isDonut ? 'Donut' : 'Pie'} chart with ${data.length} slices: ${sliceNames}`;\n }, [data, isDonut, ariaLabel]);\n\n return (\n <div\n ref={containerRef}\n className={`relative inline-flex flex-col items-center ${className}`}\n style={{ width }}\n >\n <svg\n width={width}\n height={height}\n viewBox={`0 0 ${width} ${height}`}\n role=\"img\"\n aria-label={accessibleDescription}\n className=\"bg-[hsl(var(--card))]\"\n >\n <defs>\n <style>{`\n @keyframes rotateIn {\n from {\n transform: rotate(-90deg);\n opacity: 0;\n }\n to {\n transform: rotate(0deg);\n opacity: 1;\n }\n }\n @keyframes fadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n }\n `}</style>\n </defs>\n\n {/* Slices */}\n <g style={animate ? {\n transformOrigin: `${centerX}px ${centerY}px`,\n animation: `rotateIn ${animationDuration}ms ease-out forwards`,\n } : undefined}>\n {slices.map((slice) => {\n const isHovered = hoveredSlice === slice.index;\n const isActive = activeSlice === slice.index;\n\n // Scale up on hover/active\n const scale = isHovered || isActive ? 1.03 : 1;\n const transform = `translate(${centerX}px, ${centerY}px) scale(${scale}) translate(${-centerX}px, ${-centerY}px)`;\n\n return (\n <g key={slice.index}>\n <path\n d={slice.path}\n fill={slice.color}\n stroke=\"white\"\n strokeWidth={2}\n className=\"cursor-pointer transition-transform duration-150\"\n style={{ transform }}\n onMouseEnter={(e) => handleSliceEnter(e, slice.index)}\n onMouseLeave={handleSliceLeave}\n onClick={() => handleSliceClick(slice.index)}\n />\n\n {/* Labels */}\n {showLabels && slice.percent >= minLabelPercent && (\n <text\n x={slice.labelX}\n y={slice.labelY}\n textAnchor=\"middle\"\n dominantBaseline=\"middle\"\n fontSize={CHART_DEFAULTS.fontSize.gridLabel}\n fontWeight=\"600\"\n className=\"fill-white dark:fill-white pointer-events-none\"\n style={animate ? {\n opacity: 0,\n animation: `fadeIn 200ms ease-out ${animationDuration}ms forwards`,\n } : undefined}\n >\n {getLabelText(slice)}\n </text>\n )}\n </g>\n );\n })}\n </g>\n\n {/* Center content for donut */}\n {isDonut && (centerLabel || centerValue !== undefined) && (\n <g>\n {centerValue !== undefined && (\n <text\n x={centerX}\n y={centerY - (centerLabel ? 8 : 0)}\n textAnchor=\"middle\"\n dominantBaseline=\"middle\"\n fontSize={CHART_DEFAULTS.fontSize.title}\n fontWeight=\"700\"\n className=\"fill-[hsl(var(--foreground))]\"\n >\n {typeof centerValue === 'number' ? formatNumber(centerValue) : centerValue}\n </text>\n )}\n {centerLabel && (\n typeof centerLabel === 'string' ? (\n <text\n x={centerX}\n y={centerY + (centerValue !== undefined ? 16 : 0)}\n textAnchor=\"middle\"\n dominantBaseline=\"middle\"\n fontSize={CHART_DEFAULTS.fontSize.gridLabel}\n className=\"fill-[hsl(var(--muted-foreground))]\"\n >\n {centerLabel}\n </text>\n ) : (\n <foreignObject\n x={centerX - innerRadius * 0.7}\n y={centerY - innerRadius * 0.3}\n width={innerRadius * 1.4}\n height={innerRadius * 0.6}\n >\n {centerLabel}\n </foreignObject>\n )\n )}\n </g>\n )}\n </svg>\n\n {/* Legend */}\n {showLegend && (\n <Legend\n items={legendItems}\n layout=\"horizontal\"\n align=\"center\"\n onClick={(item, index) => handleSliceClick(index)}\n onMouseEnter={(item, index) => setHoveredSlice(index)}\n onMouseLeave={() => setHoveredSlice(null)}\n />\n )}\n\n {/* Tooltip */}\n {showTooltip && (\n <ChartTooltip\n {...tooltipData}\n formatter={tooltipFormatter || ((value) => `${formatNumber(value as number)} (${formatPercent((value as number) / total * 100)})`)}\n containerBounds={{ width, height }}\n />\n )}\n </div>\n );\n};\n","\"use client\";\n\nimport React, { useMemo, useCallback, useRef, useState } from 'react';\nimport { CHART_DEFAULTS } from './constants';\nimport { scaleLinear, calculateDomain, getTicks } from './utils/scales';\nimport { createTickFormatter } from './utils/format';\nimport { ChartTooltip, useTooltip, type TooltipPayloadItem } from './components/ChartTooltip';\nimport { Legend, type LegendItem } from './components/Legend';\nimport { ReferenceLine } from './components/ReferenceLine';\nimport { ReferenceArea } from './components/ReferenceArea';\nimport { CartesianGrid } from './components/CartesianGrid';\n\nexport interface ScatterChartDataPoint {\n x: number;\n y: number;\n z?: number; // For bubble size\n label?: string;\n [key: string]: unknown;\n}\n\nexport interface ScatterChartSeries {\n name: string;\n data: ScatterChartDataPoint[];\n color?: string;\n shape?: 'circle' | 'square' | 'triangle' | 'diamond';\n size?: number;\n}\n\nexport interface ScatterChartProps {\n /** Chart data - array of series */\n data: ScatterChartSeries[];\n /** Chart width in pixels */\n width?: number;\n /** Chart height in pixels */\n height?: number;\n /** Padding inside the chart */\n padding?: { top?: number; right?: number; bottom?: number; left?: number };\n /** Show grid lines */\n showGrid?: boolean;\n /** Show X axis */\n showXAxis?: boolean;\n /** Show Y axis */\n showYAxis?: boolean;\n /** Show legend */\n showLegend?: boolean;\n /** Show tooltip on hover */\n showTooltip?: boolean;\n /** Enable bubble mode (size based on z value) */\n bubble?: boolean;\n /** Min bubble size */\n minBubbleSize?: number;\n /** Max bubble size */\n maxBubbleSize?: number;\n /** Default point size */\n pointSize?: number;\n /** Animate on load */\n animate?: boolean;\n /** Animation duration in ms */\n animationDuration?: number;\n /** X axis label */\n xAxisLabel?: string;\n /** Y axis label */\n yAxisLabel?: string;\n /** Number of X axis ticks */\n xAxisTickCount?: number;\n /** Number of Y axis ticks */\n yAxisTickCount?: number;\n /** Custom X axis domain */\n xDomain?: [number, number];\n /** Custom Y axis domain */\n yDomain?: [number, number];\n /** Custom X axis formatter */\n formatXValue?: (value: number) => string;\n /** Custom Y axis formatter */\n formatYValue?: (value: number) => string;\n /** Custom tooltip formatter */\n tooltipFormatter?: (value: number | string, name: string, payload: TooltipPayloadItem) => string;\n /** Click handler for points */\n onPointClick?: (data: ScatterChartDataPoint, seriesIndex: number, pointIndex: number) => void;\n /** Hover handler for points */\n onPointHover?: (data: ScatterChartDataPoint | null, seriesIndex: number, pointIndex: number) => void;\n /** Show trend line */\n showTrendLine?: boolean;\n /** Custom CSS class */\n className?: string;\n /** Chart children (ReferenceLine, etc.) */\n children?: React.ReactNode;\n /** Custom colors array */\n colors?: string[];\n /** ARIA label for accessibility */\n ariaLabel?: string;\n}\n\n// Calculate linear regression for trend line\nfunction linearRegression(points: Array<{ x: number; y: number }>): { slope: number; intercept: number } {\n const n = points.length;\n if (n === 0) return { slope: 0, intercept: 0 };\n\n let sumX = 0, sumY = 0, sumXY = 0, sumXX = 0;\n\n for (const p of points) {\n sumX += p.x;\n sumY += p.y;\n sumXY += p.x * p.y;\n sumXX += p.x * p.x;\n }\n\n const denominator = n * sumXX - sumX * sumX;\n if (denominator === 0) return { slope: 0, intercept: sumY / n };\n\n const slope = (n * sumXY - sumX * sumY) / denominator;\n const intercept = (sumY - slope * sumX) / n;\n\n return { slope, intercept };\n}\n\n// Shape renderers\nconst renderShape = (\n shape: string,\n x: number,\n y: number,\n size: number,\n color: string,\n commonProps: {\n className?: string;\n stroke?: string;\n strokeWidth?: number;\n onMouseEnter?: (e: React.MouseEvent) => void;\n onMouseLeave?: () => void;\n onClick?: () => void;\n }\n): React.ReactNode => {\n const { className, stroke, strokeWidth, onMouseEnter, onMouseLeave, onClick } = commonProps;\n\n switch (shape) {\n case 'square':\n return (\n <rect\n x={x - size / 2}\n y={y - size / 2}\n width={size}\n height={size}\n fill={color}\n className={className}\n stroke={stroke}\n strokeWidth={strokeWidth}\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n onClick={onClick}\n />\n );\n case 'triangle': {\n const h = size * 0.866; // sqrt(3)/2\n const points = `${x},${y - h / 2} ${x - size / 2},${y + h / 2} ${x + size / 2},${y + h / 2}`;\n return (\n <polygon\n points={points}\n fill={color}\n className={className}\n stroke={stroke}\n strokeWidth={strokeWidth}\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n onClick={onClick}\n />\n );\n }\n case 'diamond': {\n const d = size / 1.414; // sqrt(2)\n const diamondPoints = `${x},${y - d} ${x + d},${y} ${x},${y + d} ${x - d},${y}`;\n return (\n <polygon\n points={diamondPoints}\n fill={color}\n className={className}\n stroke={stroke}\n strokeWidth={strokeWidth}\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n onClick={onClick}\n />\n );\n }\n case 'circle':\n default:\n return (\n <circle\n cx={x}\n cy={y}\n r={size / 2}\n fill={color}\n className={className}\n stroke={stroke}\n strokeWidth={strokeWidth}\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n onClick={onClick}\n />\n );\n }\n};\n\nexport const ScatterChart: React.FC<ScatterChartProps> = ({\n data,\n width: providedWidth,\n height: providedHeight,\n padding: customPadding,\n showGrid = true,\n showXAxis = true,\n showYAxis = true,\n showLegend = true,\n showTooltip = true,\n bubble = false,\n minBubbleSize = 8,\n maxBubbleSize = 40,\n pointSize = 8,\n animate = true,\n animationDuration = CHART_DEFAULTS.animation.duration,\n xAxisLabel,\n yAxisLabel,\n xAxisTickCount = 5,\n yAxisTickCount = 5,\n xDomain,\n yDomain,\n formatXValue,\n formatYValue,\n tooltipFormatter,\n onPointClick,\n onPointHover,\n showTrendLine = false,\n className = '',\n children,\n colors = CHART_DEFAULTS.colors,\n ariaLabel,\n}) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const [hoveredPoint, setHoveredPoint] = useState<{\n seriesIndex: number;\n pointIndex: number;\n } | null>(null);\n\n const { tooltipData, showTooltip: showTooltipFn, hideTooltip } = useTooltip();\n\n // Dimensions\n const width = providedWidth || 800;\n const height = providedHeight || 400;\n\n const padding = useMemo(() => ({\n top: customPadding?.top ?? CHART_DEFAULTS.padding.top,\n right: customPadding?.right ?? CHART_DEFAULTS.padding.right,\n bottom: customPadding?.bottom ?? (showXAxis ? 60 : CHART_DEFAULTS.padding.bottom),\n left: customPadding?.left ?? (showYAxis ? 60 : CHART_DEFAULTS.padding.left),\n }), [customPadding, showXAxis, showYAxis]);\n\n const chartWidth = width - padding.left - padding.right;\n const chartHeight = height - padding.top - padding.bottom;\n\n // Collect all data points\n const allPoints = useMemo(() =>\n data.flatMap(series => series.data),\n [data]\n );\n\n // Calculate domains\n const xDomainCalc = useMemo(() => {\n if (xDomain) return xDomain;\n const xValues = allPoints.map(p => p.x);\n return calculateDomain(xValues, { includeZero: false, padding: 0.1 });\n }, [allPoints, xDomain]);\n\n const yDomainCalc = useMemo(() => {\n if (yDomain) return yDomain;\n const yValues = allPoints.map(p => p.y);\n return calculateDomain(yValues, { includeZero: false, padding: 0.1 });\n }, [allPoints, yDomain]);\n\n // Z domain for bubble sizing\n const zDomain = useMemo(() => {\n if (!bubble) return [0, 1] as [number, number];\n const zValues = allPoints.map(p => p.z || 0).filter(z => z > 0);\n if (zValues.length === 0) return [0, 1] as [number, number];\n return [Math.min(...zValues), Math.max(...zValues)] as [number, number];\n }, [allPoints, bubble]);\n\n // Create scale functions\n const xScale = useMemo(() =>\n scaleLinear({\n domain: xDomainCalc,\n range: [0, chartWidth],\n }),\n [xDomainCalc, chartWidth]\n );\n\n const yScale = useMemo(() =>\n scaleLinear({\n domain: yDomainCalc,\n range: [chartHeight, 0],\n }),\n [yDomainCalc, chartHeight]\n );\n\n const sizeScale = useMemo(() => {\n if (!bubble) return () => pointSize;\n return scaleLinear({\n domain: zDomain,\n range: [minBubbleSize, maxBubbleSize],\n });\n }, [bubble, zDomain, minBubbleSize, maxBubbleSize, pointSize]);\n\n // Axis ticks\n const xTicks = useMemo(() => getTicks(xDomainCalc, xAxisTickCount), [xDomainCalc, xAxisTickCount]);\n const yTicks = useMemo(() => getTicks(yDomainCalc, yAxisTickCount), [yDomainCalc, yAxisTickCount]);\n\n // Formatters\n const xFormatter = useMemo(() => formatXValue || createTickFormatter(xDomainCalc), [formatXValue, xDomainCalc]);\n const yFormatter = useMemo(() => formatYValue || createTickFormatter(yDomainCalc), [formatYValue, yDomainCalc]);\n\n // Calculate trend lines\n const trendLines = useMemo(() => {\n if (!showTrendLine) return [];\n\n return data.map(series => {\n const regression = linearRegression(series.data);\n const x1 = xDomainCalc[0];\n const x2 = xDomainCalc[1];\n const y1 = regression.slope * x1 + regression.intercept;\n const y2 = regression.slope * x2 + regression.intercept;\n\n return {\n x1: xScale(x1),\n y1: yScale(y1),\n x2: xScale(x2),\n y2: yScale(y2),\n };\n });\n }, [data, showTrendLine, xDomainCalc, xScale, yScale]);\n\n // Handle point interactions\n const handlePointEnter = useCallback((\n e: React.MouseEvent,\n seriesIndex: number,\n pointIndex: number\n ) => {\n const series = data[seriesIndex];\n const point = series.data[pointIndex];\n\n setHoveredPoint({ seriesIndex, pointIndex });\n\n if (showTooltip && containerRef.current) {\n const rect = containerRef.current.getBoundingClientRect();\n const mouseX = e.clientX - rect.left;\n const mouseY = e.clientY - rect.top;\n\n const payload: TooltipPayloadItem[] = [\n { name: 'X', value: point.x, color: series.color || colors[seriesIndex % colors.length] },\n { name: 'Y', value: point.y, color: series.color || colors[seriesIndex % colors.length] },\n ];\n\n if (bubble && point.z !== undefined) {\n payload.push({ name: 'Size', value: point.z, color: series.color || colors[seriesIndex % colors.length] });\n }\n\n showTooltipFn({\n x: mouseX,\n y: mouseY,\n label: point.label || series.name,\n payload,\n });\n }\n\n onPointHover?.(point, seriesIndex, pointIndex);\n }, [data, showTooltip, colors, bubble, showTooltipFn, onPointHover]);\n\n const handlePointLeave = useCallback(() => {\n setHoveredPoint(null);\n hideTooltip();\n onPointHover?.(null, -1, -1);\n }, [hideTooltip, onPointHover]);\n\n const handlePointClick = useCallback((seriesIndex: number, pointIndex: number) => {\n const point = data[seriesIndex].data[pointIndex];\n onPointClick?.(point, seriesIndex, pointIndex);\n }, [data, onPointClick]);\n\n // Prepare legend items\n const legendItems: LegendItem[] = useMemo(() =>\n data.map((series, i) => ({\n name: series.name,\n color: series.color || colors[i % colors.length],\n type: (series.shape || 'circle') as 'circle' | 'square',\n })),\n [data, colors]\n );\n\n // Reference elements\n const referenceElements = useMemo(() => {\n if (!children) return null;\n\n const chartDimensions = { width: chartWidth, height: chartHeight, padding };\n const scales = { xScale, yScale };\n\n return React.Children.map(children, (child) => {\n if (!React.isValidElement(child)) return child;\n\n if (child.type === ReferenceLine || child.type === ReferenceArea || child.type === CartesianGrid) {\n return React.cloneElement(child as React.ReactElement<any>, {\n _chartDimensions: chartDimensions,\n _scales: scales,\n });\n }\n\n return child;\n });\n }, [children, chartWidth, chartHeight, padding, xScale, yScale]);\n\n const accessibleDescription = useMemo(() => {\n if (ariaLabel) return ariaLabel;\n const totalPoints = data.reduce((sum, s) => sum + s.data.length, 0);\n return `Scatter chart with ${data.length} series and ${totalPoints} data points`;\n }, [data, ariaLabel]);\n\n return (\n <div\n ref={containerRef}\n className={`relative ${className}`}\n style={{ width, height: 'auto' }}\n >\n <svg\n width={width}\n height={height}\n viewBox={`0 0 ${width} ${height}`}\n role=\"img\"\n aria-label={accessibleDescription}\n className=\"bg-[hsl(var(--card))]\"\n >\n <defs>\n <style>{`\n @keyframes popIn {\n from {\n transform: scale(0);\n opacity: 0;\n }\n to {\n transform: scale(1);\n opacity: 1;\n }\n }\n `}</style>\n </defs>\n\n <g transform={`translate(${padding.left}, ${padding.top})`}>\n {/* Grid */}\n {showGrid && (\n <CartesianGrid\n _chartDimensions={{ width: chartWidth, height: chartHeight }}\n horizontalPoints={yTicks.map(t => yScale(t))}\n verticalPoints={xTicks.map(t => xScale(t))}\n />\n )}\n\n {/* Reference elements */}\n {referenceElements}\n\n {/* Trend lines */}\n {showTrendLine && trendLines.map((line, i) => (\n <line\n key={`trend-${i}`}\n x1={line.x1}\n y1={line.y1}\n x2={line.x2}\n y2={line.y2}\n stroke={data[i].color || colors[i % colors.length]}\n strokeWidth={2}\n strokeDasharray=\"5 5\"\n opacity={0.5}\n />\n ))}\n\n {/* Data points */}\n {data.map((series, seriesIndex) => {\n const color = series.color || colors[seriesIndex % colors.length];\n const shape = series.shape || 'circle';\n const baseSize = series.size || pointSize;\n\n return series.data.map((point, pointIndex) => {\n const x = xScale(point.x);\n const y = yScale(point.y);\n const size = bubble && point.z !== undefined\n ? sizeScale(point.z)\n : baseSize;\n\n const isHovered =\n hoveredPoint?.seriesIndex === seriesIndex &&\n hoveredPoint?.pointIndex === pointIndex;\n\n const displaySize = isHovered ? size * 1.3 : size;\n\n return (\n <g\n key={`point-${seriesIndex}-${pointIndex}`}\n style={animate ? {\n transformOrigin: `${x}px ${y}px`,\n animation: `popIn 200ms ease-out ${pointIndex * 30}ms forwards`,\n opacity: 0,\n } : undefined}\n >\n {renderShape(shape, x, y, displaySize, color, {\n className: 'cursor-pointer transition-all duration-150',\n stroke: 'white',\n strokeWidth: 2,\n onMouseEnter: (e: any) => handlePointEnter(e, seriesIndex, pointIndex),\n onMouseLeave: handlePointLeave,\n onClick: () => handlePointClick(seriesIndex, pointIndex),\n } as any)}\n </g>\n );\n });\n })}\n\n {/* X Axis */}\n {showXAxis && (\n <g transform={`translate(0, ${chartHeight})`}>\n <line\n x1={0}\n y1={0}\n x2={chartWidth}\n y2={0}\n className=\"stroke-[hsl(var(--border))]\"\n />\n {xTicks.map((tick, i) => (\n <g key={`x-tick-${i}`} transform={`translate(${xScale(tick)}, 0)`}>\n <line y2={6} className=\"stroke-[hsl(var(--border))]\" />\n <text\n y={20}\n textAnchor=\"middle\"\n fontSize={CHART_DEFAULTS.fontSize.gridLabel}\n className=\"fill-[hsl(var(--muted-foreground))]\"\n >\n {xFormatter(tick)}\n </text>\n </g>\n ))}\n {xAxisLabel && (\n <text\n x={chartWidth / 2}\n y={50}\n textAnchor=\"middle\"\n fontSize={CHART_DEFAULTS.fontSize.axisLabel}\n fontWeight=\"500\"\n className=\"fill-[hsl(var(--foreground))]\"\n >\n {xAxisLabel}\n </text>\n )}\n </g>\n )}\n\n {/* Y Axis */}\n {showYAxis && (\n <g>\n <line\n x1={0}\n y1={0}\n x2={0}\n y2={chartHeight}\n className=\"stroke-[hsl(var(--border))]\"\n />\n {yTicks.map((tick, i) => (\n <g key={`y-tick-${i}`} transform={`translate(0, ${yScale(tick)})`}>\n <line x2={-6} className=\"stroke-[hsl(var(--border))]\" />\n <text\n x={-12}\n textAnchor=\"end\"\n dominantBaseline=\"middle\"\n fontSize={CHART_DEFAULTS.fontSize.gridLabel}\n className=\"fill-[hsl(var(--muted-foreground))]\"\n >\n {yFormatter(tick)}\n </text>\n </g>\n ))}\n {yAxisLabel && (\n <text\n x={-chartHeight / 2}\n y={-45}\n textAnchor=\"middle\"\n transform=\"rotate(-90)\"\n fontSize={CHART_DEFAULTS.fontSize.axisLabel}\n fontWeight=\"500\"\n className=\"fill-[hsl(var(--foreground))]\"\n >\n {yAxisLabel}\n </text>\n )}\n </g>\n )}\n </g>\n </svg>\n\n {/* Legend */}\n {showLegend && (\n <Legend items={legendItems} layout=\"horizontal\" align=\"center\" />\n )}\n\n {/* Tooltip */}\n {showTooltip && (\n <ChartTooltip\n {...tooltipData}\n formatter={tooltipFormatter}\n containerBounds={{ width, height }}\n />\n )}\n </div>\n );\n};\n","\"use client\";\n\nimport React, { useRef, useState, useEffect, useCallback } from 'react';\n\nexport interface ResponsiveContainerProps {\n /** Width of the container. Can be number (px) or string (%, auto) */\n width?: number | string;\n /** Height of the container. Can be number (px) or string (%, auto) */\n height?: number | string;\n /** Aspect ratio (width/height) - used when height is not specified */\n aspect?: number;\n /** Minimum width in pixels */\n minWidth?: number;\n /** Minimum height in pixels */\n minHeight?: number;\n /** Maximum width in pixels */\n maxWidth?: number;\n /** Maximum height in pixels */\n maxHeight?: number;\n /** Debounce resize events (ms) */\n debounce?: number;\n /** Additional CSS class */\n className?: string;\n /** Children - should be a single chart element */\n children: React.ReactElement;\n /** Callback when dimensions change */\n onResize?: (width: number, height: number) => void;\n}\n\nexport const ResponsiveContainer: React.FC<ResponsiveContainerProps> = ({\n width = '100%',\n height,\n aspect,\n minWidth = 0,\n minHeight = 0,\n maxWidth,\n maxHeight,\n debounce = 0,\n className = '',\n children,\n onResize,\n}) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const [dimensions, setDimensions] = useState<{ width: number; height: number }>({\n width: 0,\n height: 0,\n });\n const debounceTimerRef = useRef<NodeJS.Timeout | null>(null);\n\n const calculateDimensions = useCallback((containerWidth: number, containerHeight: number) => {\n let finalWidth = containerWidth;\n let finalHeight = containerHeight;\n\n // Apply aspect ratio if height not specified\n if (aspect && !height) {\n finalHeight = containerWidth / aspect;\n }\n\n // Apply min/max constraints\n finalWidth = Math.max(minWidth, finalWidth);\n finalHeight = Math.max(minHeight, finalHeight);\n\n if (maxWidth) {\n finalWidth = Math.min(maxWidth, finalWidth);\n }\n if (maxHeight) {\n finalHeight = Math.min(maxHeight, finalHeight);\n }\n\n return { width: finalWidth, height: finalHeight };\n }, [aspect, height, minWidth, minHeight, maxWidth, maxHeight]);\n\n const handleResize = useCallback((entries: ResizeObserverEntry[]) => {\n const entry = entries[0];\n if (!entry) return;\n\n const { width: containerWidth, height: containerHeight } = entry.contentRect;\n const newDimensions = calculateDimensions(containerWidth, containerHeight);\n\n const updateDimensions = () => {\n setDimensions(newDimensions);\n onResize?.(newDimensions.width, newDimensions.height);\n };\n\n if (debounce > 0) {\n if (debounceTimerRef.current) {\n clearTimeout(debounceTimerRef.current);\n }\n debounceTimerRef.current = setTimeout(updateDimensions, debounce);\n } else {\n updateDimensions();\n }\n }, [calculateDimensions, debounce, onResize]);\n\n useEffect(() => {\n const container = containerRef.current;\n if (!container) return;\n\n const observer = new ResizeObserver(handleResize);\n observer.observe(container);\n\n // Initial measurement\n const rect = container.getBoundingClientRect();\n const initialDimensions = calculateDimensions(rect.width, rect.height);\n setDimensions(initialDimensions);\n\n return () => {\n observer.disconnect();\n if (debounceTimerRef.current) {\n clearTimeout(debounceTimerRef.current);\n }\n };\n }, [handleResize, calculateDimensions]);\n\n const containerStyle: React.CSSProperties = {\n width: typeof width === 'number' ? `${width}px` : width,\n height: height ? (typeof height === 'number' ? `${height}px` : height) : 'auto',\n minWidth: minWidth ? `${minWidth}px` : undefined,\n minHeight: minHeight ? `${minHeight}px` : undefined,\n maxWidth: maxWidth ? `${maxWidth}px` : undefined,\n maxHeight: maxHeight ? `${maxHeight}px` : undefined,\n };\n\n // Don't render children until we have dimensions\n if (dimensions.width === 0 || dimensions.height === 0) {\n return (\n <div\n ref={containerRef}\n className={`relative ${className}`}\n style={containerStyle}\n />\n );\n }\n\n // Clone the child element and inject dimensions\n const chartElement = React.cloneElement(\n children as React.ReactElement<{ width?: number; height?: number }>,\n {\n width: dimensions.width,\n height: dimensions.height,\n }\n );\n\n return (\n <div\n ref={containerRef}\n className={`relative ${className}`}\n style={containerStyle}\n >\n {chartElement}\n </div>\n );\n};\n","\"use client\";\n\nimport React, { useMemo, useState } from 'react';\n\nexport interface HeatmapDataPoint {\n x: string | number;\n y: string | number;\n value: number;\n}\n\nexport interface HeatmapProps {\n data: HeatmapDataPoint[];\n xLabels?: string[];\n yLabels?: string[];\n colorScale?: 'blue' | 'green' | 'red' | 'purple' | 'orange' | 'gray';\n minValue?: number;\n maxValue?: number;\n showValues?: boolean;\n showTooltip?: boolean;\n cellSize?: number;\n cellGap?: number;\n className?: string;\n onCellClick?: (point: HeatmapDataPoint) => void;\n formatValue?: (value: number) => string;\n formatTooltip?: (point: HeatmapDataPoint) => string;\n}\n\nconst COLOR_SCALES = {\n blue: {\n light: ['#eff6ff', '#dbeafe', '#bfdbfe', '#93c5fd', '#60a5fa', '#3b82f6', '#2563eb', '#1d4ed8', '#1e40af'],\n dark: ['#1e3a5f', '#1e4976', '#1e5a8d', '#2563eb', '#3b82f6', '#60a5fa', '#93c5fd', '#bfdbfe', '#dbeafe'],\n },\n green: {\n light: ['#f0fdf4', '#dcfce7', '#bbf7d0', '#86efac', '#4ade80', '#22c55e', '#16a34a', '#15803d', '#166534'],\n dark: ['#14532d', '#166534', '#15803d', '#16a34a', '#22c55e', '#4ade80', '#86efac', '#bbf7d0', '#dcfce7'],\n },\n red: {\n light: ['#fef2f2', '#fee2e2', '#fecaca', '#fca5a5', '#f87171', '#ef4444', '#dc2626', '#b91c1c', '#991b1b'],\n dark: ['#450a0a', '#7f1d1d', '#991b1b', '#b91c1c', '#dc2626', '#ef4444', '#f87171', '#fca5a5', '#fecaca'],\n },\n purple: {\n light: ['#faf5ff', '#f3e8ff', '#e9d5ff', '#d8b4fe', '#c084fc', '#a855f7', '#9333ea', '#7e22ce', '#6b21a8'],\n dark: ['#3b0764', '#4c1d95', '#5b21b6', '#6d28d9', '#7c3aed', '#8b5cf6', '#a78bfa', '#c4b5fd', '#ddd6fe'],\n },\n orange: {\n light: ['#fff7ed', '#ffedd5', '#fed7aa', '#fdba74', '#fb923c', '#f97316', '#ea580c', '#c2410c', '#9a3412'],\n dark: ['#431407', '#7c2d12', '#9a3412', '#c2410c', '#ea580c', '#f97316', '#fb923c', '#fdba74', '#fed7aa'],\n },\n gray: {\n light: ['#f9fafb', '#f3f4f6', '#e5e7eb', '#d1d5db', '#9ca3af', '#6b7280', '#4b5563', '#374151', '#1f2937'],\n dark: ['#111827', '#1f2937', '#374151', '#4b5563', '#6b7280', '#9ca3af', '#d1d5db', '#e5e7eb', '#f3f4f6'],\n },\n};\n\nexport const Heatmap: React.FC<HeatmapProps> = ({\n data,\n xLabels,\n yLabels,\n colorScale = 'blue',\n minValue: propMinValue,\n maxValue: propMaxValue,\n showValues = false,\n showTooltip = true,\n cellSize = 40,\n cellGap = 2,\n className = '',\n onCellClick,\n formatValue = (v) => v.toFixed(0),\n formatTooltip,\n}) => {\n const [hoveredCell, setHoveredCell] = useState<{ x: number; y: number; point: HeatmapDataPoint } | null>(null);\n const [isDarkMode, setIsDarkMode] = useState(false);\n\n // Check for dark mode\n React.useEffect(() => {\n const checkDarkMode = () => {\n setIsDarkMode(document.documentElement.classList.contains('dark'));\n };\n checkDarkMode();\n const observer = new MutationObserver(checkDarkMode);\n observer.observe(document.documentElement, { attributes: true, attributeFilter: ['class'] });\n return () => observer.disconnect();\n }, []);\n\n // Compute unique x and y values from data if labels not provided\n const { uniqueX, uniqueY, dataMap, minValue, maxValue } = useMemo(() => {\n const xSet = new Set<string>();\n const ySet = new Set<string>();\n const map = new Map<string, number>();\n let min = propMinValue ?? Infinity;\n let max = propMaxValue ?? -Infinity;\n\n data.forEach(point => {\n const xKey = String(point.x);\n const yKey = String(point.y);\n xSet.add(xKey);\n ySet.add(yKey);\n map.set(`${xKey}:${yKey}`, point.value);\n if (propMinValue === undefined) min = Math.min(min, point.value);\n if (propMaxValue === undefined) max = Math.max(max, point.value);\n });\n\n return {\n uniqueX: xLabels || Array.from(xSet),\n uniqueY: yLabels || Array.from(ySet),\n dataMap: map,\n minValue: propMinValue ?? min,\n maxValue: propMaxValue ?? max,\n };\n }, [data, xLabels, yLabels, propMinValue, propMaxValue]);\n\n const getColor = (value: number | undefined): string => {\n if (value === undefined) {\n return isDarkMode ? '#374151' : '#f3f4f6';\n }\n const colors = isDarkMode ? COLOR_SCALES[colorScale].dark : COLOR_SCALES[colorScale].light;\n const range = maxValue - minValue;\n if (range === 0) return colors[4];\n const normalized = Math.max(0, Math.min(1, (value - minValue) / range));\n const index = Math.floor(normalized * (colors.length - 1));\n return colors[index];\n };\n\n const getTextColor = (value: number | undefined): string => {\n if (value === undefined) return isDarkMode ? '#6b7280' : '#9ca3af';\n const range = maxValue - minValue;\n const normalized = range === 0 ? 0.5 : (value - minValue) / range;\n // Use white text for darker cells, dark text for lighter cells\n if (isDarkMode) {\n return normalized > 0.5 ? '#111827' : '#f9fafb';\n }\n return normalized > 0.5 ? '#ffffff' : '#111827';\n };\n\n const getTooltipContent = (point: HeatmapDataPoint): string => {\n if (formatTooltip) return formatTooltip(point);\n return `${point.x}, ${point.y}: ${formatValue(point.value)}`;\n };\n\n const labelWidth = 80;\n const labelHeight = 30;\n const width = labelWidth + uniqueX.length * (cellSize + cellGap);\n const height = labelHeight + uniqueY.length * (cellSize + cellGap);\n\n return (\n <div className={`relative inline-block ${className}`}>\n <svg\n width={width}\n height={height}\n className=\"select-none\"\n >\n {/* X-axis labels */}\n {uniqueX.map((label, i) => (\n <text\n key={`x-${label}`}\n x={labelWidth + i * (cellSize + cellGap) + cellSize / 2}\n y={labelHeight - 8}\n textAnchor=\"middle\"\n className=\"text-xs fill-[hsl(var(--muted-foreground))]\"\n style={{ fontSize: '11px' }}\n >\n {label}\n </text>\n ))}\n\n {/* Y-axis labels */}\n {uniqueY.map((label, j) => (\n <text\n key={`y-${label}`}\n x={labelWidth - 8}\n y={labelHeight + j * (cellSize + cellGap) + cellSize / 2 + 4}\n textAnchor=\"end\"\n className=\"text-xs fill-[hsl(var(--muted-foreground))]\"\n style={{ fontSize: '11px' }}\n >\n {label}\n </text>\n ))}\n\n {/* Cells */}\n {uniqueY.map((yLabel, j) =>\n uniqueX.map((xLabel, i) => {\n const value = dataMap.get(`${xLabel}:${yLabel}`);\n const point = data.find(d => String(d.x) === xLabel && String(d.y) === yLabel);\n const x = labelWidth + i * (cellSize + cellGap);\n const y = labelHeight + j * (cellSize + cellGap);\n\n return (\n <g key={`${xLabel}-${yLabel}`}>\n <rect\n x={x}\n y={y}\n width={cellSize}\n height={cellSize}\n rx={4}\n fill={getColor(value)}\n className={`transition-all duration-150 ${onCellClick && point ? 'cursor-pointer' : ''}`}\n style={{\n stroke: hoveredCell?.x === i && hoveredCell?.y === j ? (isDarkMode ? '#60a5fa' : '#3b82f6') : 'transparent',\n strokeWidth: 2,\n }}\n onMouseEnter={() => {\n if (point) setHoveredCell({ x: i, y: j, point });\n }}\n onMouseLeave={() => setHoveredCell(null)}\n onClick={() => {\n if (point && onCellClick) onCellClick(point);\n }}\n />\n {showValues && value !== undefined && (\n <text\n x={x + cellSize / 2}\n y={y + cellSize / 2 + 4}\n textAnchor=\"middle\"\n fill={getTextColor(value)}\n style={{ fontSize: '11px', fontWeight: 500 }}\n >\n {formatValue(value)}\n </text>\n )}\n </g>\n );\n })\n )}\n </svg>\n\n {/* Tooltip */}\n {showTooltip && hoveredCell && (\n <div\n className=\"absolute z-50 px-3 py-2 text-sm bg-[hsl(var(--popover))] text-[hsl(var(--popover-foreground))] border border-[hsl(var(--border))] rounded-lg shadow-lg pointer-events-none whitespace-nowrap\"\n style={{\n left: labelWidth + hoveredCell.x * (cellSize + cellGap) + cellSize / 2,\n top: labelHeight + hoveredCell.y * (cellSize + cellGap) - 8,\n transform: 'translate(-50%, -100%)',\n }}\n >\n {getTooltipContent(hoveredCell.point)}\n <div\n className=\"absolute w-2 h-2 bg-[hsl(var(--popover))] rotate-45\"\n style={{\n left: '50%',\n bottom: '-4px',\n transform: 'translateX(-50%)',\n }}\n />\n </div>\n )}\n </div>\n );\n};\n\n// Calendar Heatmap variant - like GitHub contribution graph\nexport interface CalendarHeatmapProps {\n data: { date: Date | string; value: number }[];\n startDate?: Date;\n endDate?: Date;\n colorScale?: 'blue' | 'green' | 'red' | 'purple' | 'orange' | 'gray';\n showMonthLabels?: boolean;\n showDayLabels?: boolean;\n cellSize?: number;\n cellGap?: number;\n className?: string;\n onCellClick?: (date: Date, value: number) => void;\n formatTooltip?: (date: Date, value: number) => string;\n}\n\nconst DAY_LABELS = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];\nconst MONTH_LABELS = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n\nexport const CalendarHeatmap: React.FC<CalendarHeatmapProps> = ({\n data,\n startDate: propStartDate,\n endDate: propEndDate,\n colorScale = 'green',\n showMonthLabels = true,\n showDayLabels = true,\n cellSize = 12,\n cellGap = 2,\n className = '',\n onCellClick,\n formatTooltip,\n}) => {\n const [hoveredCell, setHoveredCell] = useState<{ weekIndex: number; dayIndex: number; date: Date; value: number } | null>(null);\n const [isDarkMode, setIsDarkMode] = useState(false);\n\n React.useEffect(() => {\n const checkDarkMode = () => {\n setIsDarkMode(document.documentElement.classList.contains('dark'));\n };\n checkDarkMode();\n const observer = new MutationObserver(checkDarkMode);\n observer.observe(document.documentElement, { attributes: true, attributeFilter: ['class'] });\n return () => observer.disconnect();\n }, []);\n\n const { weeks, minValue, maxValue, dataMap, monthLabels } = useMemo(() => {\n // Parse dates and create data map\n const map = new Map<string, number>();\n let min = Infinity;\n let max = -Infinity;\n\n data.forEach(item => {\n const date = typeof item.date === 'string' ? new Date(item.date) : item.date;\n const key = date.toISOString().split('T')[0];\n map.set(key, item.value);\n min = Math.min(min, item.value);\n max = Math.max(max, item.value);\n });\n\n if (min === Infinity) min = 0;\n if (max === -Infinity) max = 0;\n\n // Determine date range\n const endDate = propEndDate || new Date();\n const startDate = propStartDate || new Date(endDate.getTime() - 364 * 24 * 60 * 60 * 1000); // ~1 year ago\n\n // Adjust start date to beginning of week (Sunday)\n const adjustedStart = new Date(startDate);\n adjustedStart.setDate(adjustedStart.getDate() - adjustedStart.getDay());\n\n // Build weeks array\n const weeksArr: Date[][] = [];\n const currentDate = new Date(adjustedStart);\n const months: { label: string; weekIndex: number }[] = [];\n let lastMonth = -1;\n\n while (currentDate <= endDate || weeksArr.length === 0 || weeksArr[weeksArr.length - 1].length < 7) {\n if (weeksArr.length === 0 || weeksArr[weeksArr.length - 1].length === 7) {\n weeksArr.push([]);\n }\n\n if (currentDate.getMonth() !== lastMonth && currentDate <= endDate) {\n months.push({ label: MONTH_LABELS[currentDate.getMonth()], weekIndex: weeksArr.length - 1 });\n lastMonth = currentDate.getMonth();\n }\n\n weeksArr[weeksArr.length - 1].push(new Date(currentDate));\n currentDate.setDate(currentDate.getDate() + 1);\n }\n\n return {\n weeks: weeksArr,\n minValue: min,\n maxValue: max,\n dataMap: map,\n monthLabels: months,\n };\n }, [data, propStartDate, propEndDate]);\n\n const getColor = (value: number | undefined): string => {\n if (value === undefined || value === 0) {\n return isDarkMode ? '#1f2937' : '#ebedf0';\n }\n const colors = isDarkMode ? COLOR_SCALES[colorScale].dark : COLOR_SCALES[colorScale].light;\n const range = maxValue - minValue;\n if (range === 0) return colors[4];\n const normalized = Math.max(0, Math.min(1, (value - minValue) / range));\n const index = Math.max(1, Math.floor(normalized * (colors.length - 1)));\n return colors[index];\n };\n\n const getTooltipContent = (date: Date, value: number): string => {\n if (formatTooltip) return formatTooltip(date, value);\n const dateStr = date.toLocaleDateString('en-US', { weekday: 'short', month: 'short', day: 'numeric', year: 'numeric' });\n return `${dateStr}: ${value} contribution${value !== 1 ? 's' : ''}`;\n };\n\n const dayLabelWidth = showDayLabels ? 30 : 0;\n const monthLabelHeight = showMonthLabels ? 20 : 0;\n const width = dayLabelWidth + weeks.length * (cellSize + cellGap);\n const height = monthLabelHeight + 7 * (cellSize + cellGap);\n\n return (\n <div className={`relative inline-block ${className}`}>\n <svg width={width} height={height} className=\"select-none\">\n {/* Month labels */}\n {showMonthLabels && monthLabels.map(({ label, weekIndex }, i) => (\n <text\n key={`month-${i}`}\n x={dayLabelWidth + weekIndex * (cellSize + cellGap)}\n y={12}\n className=\"text-xs fill-[hsl(var(--muted-foreground))]\"\n style={{ fontSize: '10px' }}\n >\n {label}\n </text>\n ))}\n\n {/* Day labels */}\n {showDayLabels && [1, 3, 5].map(dayIndex => (\n <text\n key={`day-${dayIndex}`}\n x={dayLabelWidth - 6}\n y={monthLabelHeight + dayIndex * (cellSize + cellGap) + cellSize / 2 + 3}\n textAnchor=\"end\"\n className=\"text-xs fill-[hsl(var(--muted-foreground))]\"\n style={{ fontSize: '9px' }}\n >\n {DAY_LABELS[dayIndex]}\n </text>\n ))}\n\n {/* Cells */}\n {weeks.map((week, weekIndex) =>\n week.map((date, dayIndex) => {\n const key = date.toISOString().split('T')[0];\n const value = dataMap.get(key);\n const x = dayLabelWidth + weekIndex * (cellSize + cellGap);\n const y = monthLabelHeight + dayIndex * (cellSize + cellGap);\n\n return (\n <rect\n key={key}\n x={x}\n y={y}\n width={cellSize}\n height={cellSize}\n rx={2}\n fill={getColor(value)}\n className={`transition-all duration-150 ${onCellClick ? 'cursor-pointer' : ''}`}\n style={{\n stroke: hoveredCell?.weekIndex === weekIndex && hoveredCell?.dayIndex === dayIndex\n ? (isDarkMode ? '#60a5fa' : '#3b82f6')\n : 'transparent',\n strokeWidth: 1,\n }}\n onMouseEnter={() => setHoveredCell({ weekIndex, dayIndex, date, value: value || 0 })}\n onMouseLeave={() => setHoveredCell(null)}\n onClick={() => {\n if (onCellClick) onCellClick(date, value || 0);\n }}\n />\n );\n })\n )}\n </svg>\n\n {/* Tooltip */}\n {hoveredCell && (\n <div\n className=\"absolute z-50 px-3 py-2 text-sm bg-[hsl(var(--popover))] text-[hsl(var(--popover-foreground))] border border-[hsl(var(--border))] rounded-lg shadow-lg pointer-events-none whitespace-nowrap\"\n style={{\n left: dayLabelWidth + hoveredCell.weekIndex * (cellSize + cellGap) + cellSize / 2,\n top: monthLabelHeight + hoveredCell.dayIndex * (cellSize + cellGap) - 8,\n transform: 'translate(-50%, -100%)',\n }}\n >\n {getTooltipContent(hoveredCell.date, hoveredCell.value)}\n <div\n className=\"absolute w-2 h-2 bg-[hsl(var(--popover))] rotate-45\"\n style={{\n left: '50%',\n bottom: '-4px',\n transform: 'translateX(-50%)',\n }}\n />\n </div>\n )}\n </div>\n );\n};\n","/**\n * Theme initialization script that runs before React hydration\n * This prevents flickering by setting the theme before the page renders\n * Must be inlined in the HTML <head> as a blocking script\n */\n\nexport const themeScript = `\n(function() {\n try {\n // Get stored preferences\n const storedTheme = localStorage.getItem('lite-ui-theme') || 'default';\n const storedColorMode = localStorage.getItem('lite-ui-color-mode');\n\n // Determine color mode (system, light, or dark)\n let colorMode = storedColorMode;\n if (!colorMode || colorMode === 'system') {\n colorMode = window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';\n }\n\n // Set attributes before render\n document.documentElement.setAttribute('data-theme', storedTheme);\n document.documentElement.setAttribute('data-color-mode', colorMode);\n\n // Add dark class for Tailwind\n if (colorMode === 'dark') {\n document.documentElement.classList.add('dark');\n } else {\n document.documentElement.classList.remove('dark');\n }\n } catch (e) {\n console.error('Failed to initialize theme:', e);\n }\n})();\n`;\n\nexport function getThemeScript() {\n return themeScript;\n}\n"],"mappings":"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","names":["jsx","variantStyles","sizeStyles","useState","useEffect","jsx","jsxs","useState","useEffect","sizeStyles","useEffect","jsx","jsxs","jsx","jsxs","getVariantClasses","jsx","createContext","useContext","useState","jsx","useState","jsx","sizeClasses","jsx","jsx","jsx","jsx","Fragment","jsx","jsxs","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","Fragment","jsx","jsxs","jsx","Fragment","jsx","Fragment","jsx","Fragment","jsx","Fragment","jsx","jsxs","Fragment","jsx","Fragment","jsx","jsx","jsx","jsx","jsx","Fragment","jsx","jsxs","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","Fragment","jsx","jsxs","widthClasses","useState","useEffect","Fragment","jsx","jsxs","sizeClasses","jsx","jsxs","sizeClasses","useState","useRef","jsx","jsxs","sizeClasses","useState","useRef","useEffect","Fragment","jsx","jsxs","useState","useRef","useEffect","jsx","jsx","jsxs","forwardRef","jsx","jsxs","forwardRef","jsx","jsxs","jsx","variantStyles","jsx","sizeClasses","useState","jsx","jsxs","jsx","jsxs","jsx","jsxs","useState","useRef","useEffect","createPortal","jsx","jsxs","formatDate","forwardRef","jsx","jsxs","useState","useRef","useEffect","createPortal","jsx","jsxs","DAYS","MONTHS","useState","jsx","jsxs","DAYS","MONTHS","React","jsx","jsxs","jsx","jsxs","sizeClasses","React","useRef","jsx","jsxs","percentage","React","jsx","sizeClasses","name","jsx","jsxs","sizeClasses","useRef","useState","useEffect","jsx","jsxs","useRef","useState","useEffect","createContext","useContext","useState","useCallback","jsx","jsxs","createContext","useContext","useState","useCallback","toast","positionClasses","React","jsx","jsxs","React","jsx","jsxs","useRef","useState","jsx","jsxs","useState","useRef","useRef","useState","useEffect","jsx","jsxs","useRef","useState","useEffect","useRef","useState","useEffect","jsx","jsxs","useRef","useState","useEffect","React","useMemo","useCallback","useRef","useState","React","useRef","useEffect","useState","jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsxs","useRef","useState","useMemo","useCallback","React","React","useMemo","useCallback","useRef","useState","jsx","jsxs","useRef","useState","useMemo","useCallback","React","React","useMemo","useCallback","useRef","useState","jsx","jsxs","useRef","useState","useMemo","useCallback","React","useMemo","useCallback","useRef","useState","jsx","jsxs","useRef","useState","useMemo","useCallback","React","useMemo","useCallback","useRef","useState","jsx","jsxs","useRef","useState","useMemo","useCallback","React","React","useRef","useState","useEffect","useCallback","jsx","React","useMemo","useState","jsx","jsxs"]}
|