@marcoschwartz/lite-ui 0.19.0 → 0.20.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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/components/LineChart.tsx","../src/components/BarChart.tsx","../src/components/AreaChart.tsx","../src/components/PieChart.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}\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-semibold rounded-lg transition-all duration-150 focus:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 active:scale-95 gap-2',\n variants: {\n primary: 'bg-blue-600 hover:bg-blue-700 active:bg-blue-800 text-white shadow-sm hover:shadow-md dark:bg-blue-500 dark:hover:bg-blue-600 dark:active:bg-blue-700',\n secondary: 'bg-gray-600 hover:bg-gray-700 active:bg-gray-800 text-white shadow-sm hover:shadow-md dark:bg-gray-500 dark:hover:bg-gray-600 dark:active:bg-gray-700',\n success: 'bg-green-600 hover:bg-green-700 active:bg-green-800 text-white shadow-sm hover:shadow-md dark:bg-green-500 dark:hover:bg-green-600 dark:active:bg-green-700',\n danger: 'bg-red-600 hover:bg-red-700 active:bg-red-800 text-white shadow-sm hover:shadow-md dark:bg-red-500 dark:hover:bg-red-600 dark:active:bg-red-700',\n warning: 'bg-yellow-500 hover:bg-yellow-600 active:bg-yellow-700 text-white shadow-sm hover:shadow-md dark:bg-yellow-400 dark:hover:bg-yellow-500 dark:active:bg-yellow-600',\n info: 'bg-cyan-600 hover:bg-cyan-700 active:bg-cyan-800 text-white shadow-sm hover:shadow-md dark:bg-cyan-500 dark:hover:bg-cyan-600 dark:active:bg-cyan-700',\n },\n sizes: {\n sm: 'px-3 py-1.5 text-sm min-h-[30px]',\n md: 'px-4 py-2 text-base min-h-[38px]',\n lg: 'px-6 py-3 text-lg min-h-[48px]',\n xl: 'px-8 py-4 text-xl min-h-[60px]',\n },\n disabled: 'opacity-50 cursor-not-allowed hover:shadow-sm active:scale-100',\n },\n select: {\n base: 'w-full appearance-none rounded-lg border border-gray-300 bg-white text-gray-900 text-left transition-all duration-150 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent shadow-sm hover:border-gray-400 pr-10 cursor-pointer dark:bg-gray-800 dark:border-gray-600 dark:text-gray-100 dark:hover:border-gray-500',\n sizes: {\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 xl: 'px-5 py-4 text-xl',\n },\n disabled: 'opacity-50 cursor-not-allowed bg-gray-50 dark:bg-gray-900',\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 },\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';\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-red-500 focus:ring-red-500 dark:border-red-500' : '';\n\n const buttonClasses = `${baseStyles} ${sizeStyles} ${disabledStyles} ${errorStyles}`.trim();\n\n // Icon color based on theme\n const iconColor = themeName === 'minimalistic'\n ? (disabled ? 'text-gray-600' : 'text-white')\n : (disabled ? 'text-gray-400' : 'text-gray-500');\n\n // Dropdown menu styles based on theme\n const dropdownBaseStyles = themeName === 'minimalistic'\n ? 'bg-black border-2 border-white'\n : 'bg-white border border-gray-300 shadow-lg dark:bg-gray-800 dark:border-gray-600';\n\n const optionBaseStyles = themeName === 'minimalistic'\n ? 'text-white hover:bg-white hover:text-black transition-colors duration-200'\n : 'text-gray-900 hover:bg-blue-50 transition-colors duration-150 dark:text-gray-100 dark:hover:bg-gray-700';\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-gray-700 dark:text-gray-300 mb-1\">\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-lg overflow-hidden`}\n >\n {/* Search input */}\n {searchable && (\n <div className={`sticky top-0 ${themeName === 'minimalistic' ? 'bg-black border-b-2 border-white' : 'bg-white dark:bg-gray-800 border-b border-gray-200 dark:border-gray-700'}`}>\n <input\n ref={searchInputRef}\n type=\"text\"\n className={`w-full ${optionSizeStyles} ${themeName === 'minimalistic' ? 'bg-black text-white placeholder-gray-600 focus:outline-none' : 'bg-transparent text-gray-900 dark:text-gray-100 placeholder-gray-400 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-blue-50 dark:bg-gray-700') : ''\n }`}\n onClick={() => handleSelect(option.value)}\n >\n {option.label}\n </div>\n ))\n ) : (\n <div className={`${optionSizeStyles} ${themeName === 'minimalistic' ? 'text-gray-500' : 'text-gray-500 dark:text-gray-400'} text-center`}>\n No results found\n </div>\n )}\n </div>\n </div>\n )}\n </div>\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-gray-500 dark:text-gray-400\">{helperText}</p>\n )}\n </div>\n );\n};\n","\"use client\";\n\nimport React, { useEffect } from 'react';\nimport { useTheme } from '../theme/ThemeProvider';\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 const { theme } = useTheme();\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/60 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-white dark:bg-gray-800 rounded-lg 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-gray-200 dark:border-gray-700\">\n {title && (\n <h3 id=\"modal-title\" className=\"text-xl font-semibold text-gray-900 dark:text-gray-100\">\n {title}\n </h3>\n )}\n {showCloseButton && (\n <button\n onClick={onClose}\n className=\"ml-auto text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 transition-colors\"\n aria-label=\"Close modal\"\n >\n <svg className=\"w-6 h-6\" 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';\nimport { useTheme } from '../theme/ThemeProvider';\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 const { theme } = useTheme();\n\n const baseClasses = sticky ? 'sticky top-0 z-40' : '';\n\n const getVariantClasses = () => {\n switch (variant) {\n case 'glass':\n return 'bg-transparent backdrop-blur-xl';\n case 'transparent':\n return 'bg-transparent';\n case 'solid':\n default:\n return 'bg-white dark:bg-gray-800 border-b border-gray-200 dark:border-gray-700';\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';\nimport { useTheme } from '../theme/ThemeProvider';\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 { theme } = useTheme();\n const widthClass = widthClasses[width];\n const borderClass = position === 'left' ? 'border-r' : 'border-l';\n\n return (\n <aside\n className={`${widthClass} bg-white dark:bg-gray-800 ${borderClass} border-gray-200 dark:border-gray-700 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 { useTheme } from '../theme/ThemeProvider';\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-transparent backdrop-blur-xl';\n case 'transparent':\n return 'bg-transparent';\n case 'solid':\n default:\n return 'bg-white dark:bg-gray-800 border-b border-gray-200 dark:border-gray-700';\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 { theme } = useTheme();\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-white dark:bg-gray-800 border-r border-gray-200 dark:border-gray-700 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-gray-50 dark:bg-gray-900 ${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-gray-900 dark:text-gray-100\">\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-gray-100 dark:hover:bg-gray-700 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-white dark:bg-gray-800 shadow-2xl animate-in slide-in-from-left duration-300`}>\n <div className=\"p-4 border-b border-gray-200 dark:border-gray-700 flex items-center justify-between\">\n {navbarLogo ? (\n <div>{navbarLogo}</div>\n ) : navbarTitle ? (\n <span className=\"text-xl font-bold text-gray-900 dark:text-gray-100\">\n {navbarTitle}\n </span>\n ) : null}\n <button\n className=\"p-1 rounded hover:bg-gray-100 dark:hover:bg-gray-700 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-gray-50 dark:bg-gray-900 ${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-gray-900 dark:text-gray-100\">\n {navbarTitle}\n </span>\n ) : null}\n <button\n className=\"p-2 rounded-lg hover:bg-gray-100 dark:hover:bg-gray-700 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-transparent backdrop-blur-xl' : navbar.variant === 'transparent' ? 'bg-transparent' : 'bg-white dark:bg-gray-800 border-r border-gray-200 dark:border-gray-700'} 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-white dark:bg-gray-800 shadow-2xl animate-in slide-in-from-left duration-300`}>\n <div className=\"p-4 border-b border-gray-200 dark:border-gray-700 flex items-center justify-between\">\n {navbarLogo ? (\n <div>{navbarLogo}</div>\n ) : navbarTitle ? (\n <span className=\"text-xl font-bold text-gray-900 dark:text-gray-100\">\n {navbarTitle}\n </span>\n ) : null}\n <button\n className=\"p-1 rounded hover:bg-gray-100 dark:hover:bg-gray-700 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';\nimport { useTheme } from '../theme/ThemeProvider';\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 const { theme } = useTheme();\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/60 backdrop-blur-sm transition-all duration-200\"\n onClick={onClose}\n />\n\n {/* Drawer */}\n <div\n className={`fixed z-50 ${positionClass} ${sizeClass} bg-white dark:bg-gray-800 shadow-2xl overflow-hidden flex flex-col ${slideClasses[position]}`}\n >\n {/* Header */}\n {(title || showCloseButton) && (\n <div className=\"flex items-center justify-between p-6 border-b border-gray-200 dark:border-gray-700\">\n {title && (\n <h3 className=\"text-xl font-semibold text-gray-900 dark:text-gray-100\">\n {title}\n </h3>\n )}\n {showCloseButton && (\n <button\n onClick={onClose}\n className=\"ml-auto text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 transition-colors\"\n aria-label=\"Close drawer\"\n >\n <svg className=\"w-6 h-6\" 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 = theme.select?.base || 'w-full appearance-none rounded-lg border border-gray-300 bg-white text-gray-900 transition-all duration-150 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent shadow-sm hover:border-gray-400 dark:bg-gray-800 dark:border-gray-600 dark:text-gray-100 dark:hover:border-gray-500';\n const sizeStyle = sizeClasses[size];\n const errorStyles = error ? 'border-red-500 focus:ring-red-500 dark:border-red-500' : '';\n const disabledStyles = disabled ? 'opacity-50 cursor-not-allowed bg-gray-50 dark:bg-gray-900' : '';\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-gray-700 dark:text-gray-300 mb-1\">\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-gray-400 dark:text-gray-500\">\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-gray-400 dark:text-gray-500\">\n {rightIcon}\n </div>\n )}\n </div>\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-gray-500 dark:text-gray-400\">{helperText}</p>\n )}\n </div>\n );\n }\n);\n\nTextInput.displayName = 'TextInput';\n","\"use client\";\n\nimport React, { useState, useRef } from 'react';\nimport { useTheme } from '../theme/ThemeProvider';\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-4 py-2.5 text-base',\n lg: 'px-4 py-3 text-lg',\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 { theme } = useTheme();\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-lg border border-gray-300 bg-white text-gray-900 transition-all duration-150 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent shadow-sm hover:border-gray-400 dark:bg-gray-800 dark:border-gray-600 dark:text-gray-100 dark:hover:border-gray-500';\n const sizeStyle = sizeClasses[size];\n const errorStyles = error ? 'border-red-500 focus:ring-red-500 dark:border-red-500' : '';\n const disabledStyles = disabled ? 'opacity-50 cursor-not-allowed bg-gray-50 dark:bg-gray-900' : '';\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-gray-700 dark:text-gray-300 mb-1\">\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-gray-100 dark:hover:bg-gray-700 rounded transition-colors disabled:opacity-30 disabled:cursor-not-allowed\"\n tabIndex={-1}\n >\n <svg className=\"w-3 h-3 text-gray-600 dark:text-gray-400\" 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-gray-100 dark:hover:bg-gray-700 rounded transition-colors disabled:opacity-30 disabled:cursor-not-allowed\"\n tabIndex={-1}\n >\n <svg className=\"w-3 h-3 text-gray-600 dark:text-gray-400\" 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 text-sm text-red-600 dark:text-red-400\">{error}</p>\n )}\n {helperText && !error && (\n <p className=\"mt-1 text-sm text-gray-500 dark:text-gray-400\">{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-gray-100 dark:hover:bg-gray-700 transition-colors\"\n aria-label=\"Open menu\"\n >\n <svg className=\"w-5 h-5 text-gray-600 dark:text-gray-400\" 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-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 shadow-lg';\n\n const itemBaseStyles = themeName === 'minimalistic'\n ? 'text-white hover:bg-white hover:text-black transition-colors duration-200'\n : 'text-gray-700 dark:text-gray-200 hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors';\n\n const menu = isOpen && mounted && menuPosition ? (\n <div\n ref={menuRef}\n className={`fixed w-56 rounded-lg ${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-gray-200 dark:border-gray-700\"\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-3 flex items-center gap-3 ${itemBaseStyles} ${\n item.disabled ? 'opacity-50 cursor-not-allowed' : 'cursor-pointer'\n } ${\n item.variant === 'danger' ? 'text-red-600 dark:text-red-400 hover:bg-red-50 dark:hover:bg-red-900/20' : ''\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';\nimport { useTheme } from '../theme/ThemeProvider';\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 const { theme } = useTheme();\n\n const paddingClass = paddingClasses[padding];\n const hoverClass = hover\n ? 'hover:shadow-xl hover:scale-[1.02] hover:border-blue-400 dark:hover:border-blue-500 cursor-pointer transition-all duration-200 ease-in-out'\n : '';\n\n return (\n <div\n className={`bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 ${paddingClass} ${hoverClass} ${className}`}\n {...props}\n >\n {children}\n </div>\n );\n};\n","\"use client\";\n\nimport React from 'react';\nimport { useTheme } from '../theme/ThemeProvider';\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-blue-50 dark:bg-blue-900/20 border-blue-200 dark:border-blue-800 text-blue-900 dark:text-blue-100',\n success: 'bg-green-50 dark:bg-green-900/20 border-green-200 dark:border-green-800 text-green-900 dark:text-green-100',\n warning: 'bg-yellow-50 dark:bg-yellow-900/20 border-yellow-200 dark:border-yellow-800 text-yellow-900 dark:text-yellow-100',\n error: 'bg-red-50 dark:bg-red-900/20 border-red-200 dark:border-red-800 text-red-900 dark:text-red-100',\n};\n\nconst iconStyles = {\n info: 'text-blue-600 dark:text-blue-400',\n success: 'text-green-600 dark:text-green-400',\n warning: 'text-yellow-600 dark:text-yellow-400',\n error: 'text-red-600 dark:text-red-400',\n};\n\nexport const Alert: React.FC<AlertProps> = ({\n variant = 'info',\n title,\n children,\n onClose,\n className = '',\n}) => {\n const { theme } = useTheme();\n\n const variantClass = variantStyles[variant];\n const iconClass = iconStyles[variant];\n\n return (\n <div className={`rounded-lg 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';\nimport { useTheme } from '../theme/ThemeProvider';\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 const { theme } = useTheme();\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 transition-all duration-200 flex items-center justify-center\n ${error\n ? 'border-red-500 dark:border-red-500'\n : 'border-gray-300 dark:border-gray-600'\n }\n ${disabled\n ? 'opacity-50 cursor-not-allowed bg-gray-100 dark:bg-gray-800'\n : 'peer-hover:border-gray-400 dark:peer-hover:border-gray-500'\n }\n peer-checked:bg-blue-600 peer-checked:border-blue-600\n peer-focus:ring-2 peer-focus:ring-blue-500 peer-focus:ring-offset-2\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-gray-700 dark:text-gray-300 ${disabled ? 'opacity-50 cursor-not-allowed' : 'group-hover:text-gray-900 dark:group-hover:text-gray-100'}`}>\n {label}\n </span>\n )}\n </label>\n {error && <p className=\"mt-1 text-sm text-red-600 dark:text-red-400\">{error}</p>}\n </div>\n );\n }\n);\n\nCheckbox.displayName = 'Checkbox';\n","\"use client\";\n\nimport React, { forwardRef } from 'react';\nimport { useTheme } from '../theme/ThemeProvider';\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 const { theme } = useTheme();\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-gray-300 dark:bg-gray-700 peer-focus:ring-2 peer-focus:ring-blue-500 rounded-full peer peer-checked:bg-blue-600 dark:peer-checked:bg-blue-500 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-gray-700 dark:text-gray-300\">\n {label}\n </span>\n )}\n </label>\n );\n }\n);\n\nToggle.displayName = 'Toggle';\n","\"use client\";\n\nimport React from 'react';\nimport { useTheme } from '../theme/ThemeProvider';\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-gray-100 dark:bg-gray-700 text-gray-800 dark:text-gray-200',\n primary: 'bg-blue-100 dark:bg-blue-900/30 text-blue-800 dark:text-blue-200',\n success: 'bg-green-100 dark:bg-green-900/30 text-green-800 dark:text-green-200',\n warning: 'bg-yellow-100 dark:bg-yellow-900/30 text-yellow-800 dark:text-yellow-200',\n error: 'bg-red-100 dark:bg-red-900/30 text-red-800 dark:text-red-200',\n info: 'bg-cyan-100 dark:bg-cyan-900/30 text-cyan-800 dark:text-cyan-200',\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 const { theme } = useTheme();\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';\nimport { useTheme } from '../theme/ThemeProvider';\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-blue-600 border-t-transparent',\n secondary: 'border-gray-600 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 const { theme } = useTheme();\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';\nimport { useTheme } from '../theme/ThemeProvider';\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 { theme } = useTheme();\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-gray-200 dark:border-gray-700\">\n <nav className=\"flex gap-8 px-6\" aria-label=\"Tabs\">\n {tabs.map((tab, index) => (\n <button\n key={index}\n onClick={() => handleTabClick(index)}\n disabled={tab.disabled}\n className={`py-4 px-1 border-b-2 font-medium text-sm transition-colors ${\n activeIndex === index\n ? 'border-blue-600 text-blue-600 dark:text-blue-400'\n : 'border-transparent text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-gray-200 hover:border-gray-300 dark:hover:border-gray-600'\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';\nimport { useTheme } from '../theme/ThemeProvider';\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 const { theme } = useTheme();\n\n return (\n <>\n {/* Desktop Table View */}\n <div className={`${responsive ? 'hidden md:block' : ''} overflow-x-auto ${className}`}>\n <table className=\"w-full text-left\">\n <thead className=\"bg-gray-50 dark:bg-gray-800 border-b border-gray-200 dark:border-gray-700\">\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-gray-700 dark:text-gray-300 uppercase tracking-wider relative'\n : 'px-6 py-3 text-xs font-medium text-gray-700 dark:text-gray-300 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-white dark:bg-gray-900 divide-y divide-gray-200 dark:divide-gray-700\">\n {data.map((row, rowIndex) => {\n const rowClasses = [\n striped && rowIndex % 2 === 1 ? 'bg-gray-50 dark:bg-gray-800/50' : '',\n hoverable ? 'hover:bg-gray-100 dark:hover:bg-gray-800 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-gray-900 dark:text-gray-100 overflow-visible'\n : 'px-6 py-4 text-sm text-gray-900 dark:text-gray-100'\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-gray-500 dark:text-gray-400\">\n No data available\n </div>\n )}\n </div>\n\n {/* Mobile Card View */}\n {responsive && (\n <div className={`md:hidden space-y-4 ${className}`}>\n {data.map((row, rowIndex) => {\n const cardClasses = [\n 'bg-white dark:bg-gray-900 border border-gray-200 dark:border-gray-700 rounded-lg p-4 shadow-sm',\n hoverable ? 'hover:shadow-md transition-shadow' : ''\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-gray-100 dark:border-gray-800 last:border-b-0\"\n >\n <span className=\"text-xs font-medium text-gray-500 dark:text-gray-400 uppercase tracking-wider flex-shrink-0 mr-4\">\n {column.title}\n </span>\n <span className=\"text-sm text-gray-900 dark:text-gray-100 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-gray-500 dark:text-gray-400\">\n No data available\n </div>\n )}\n </div>\n )}\n </>\n );\n}\n","\"use client\";\n\nimport React from 'react';\nimport { useTheme } from '../theme/ThemeProvider';\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 const { theme } = useTheme();\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-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-800 disabled:opacity-50 disabled:cursor-not-allowed 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-gray-700 dark:text-gray-300\"\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-blue-600 text-white'\n : 'text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-800'\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-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-800 disabled:opacity-50 disabled:cursor-not-allowed 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';\nimport { useTheme } from '../theme/ThemeProvider';\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 { theme } = useTheme();\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-lg border border-gray-300 bg-white text-gray-900 px-4 py-2.5 text-base transition-all duration-150 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent shadow-sm hover:border-gray-400 dark:bg-gray-800 dark:border-gray-600 dark:text-gray-100 dark:hover:border-gray-500 cursor-pointer';\n const errorStyles = error ? 'border-red-500 focus:ring-red-500 dark:border-red-500' : '';\n const disabledStyles = disabled ? 'opacity-50 cursor-not-allowed bg-gray-50 dark:bg-gray-900' : '';\n\n const calendar = isOpen && mounted && calendarPosition ? (\n <div\n ref={calendarRef}\n className=\"fixed z-[9999] bg-white dark:bg-gray-800 rounded-lg border border-gray-200 dark:border-gray-700 shadow-xl 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-gray-100 dark:hover:bg-gray-700 rounded-lg transition-colors\"\n aria-label=\"Previous month\"\n >\n <svg className=\"w-5 h-5 text-gray-600 dark:text-gray-400\" 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-gray-900 dark:text-gray-100\">\n {MONTHS[month]} {year}\n </h2>\n <button\n onClick={handleToday}\n className=\"px-2 py-1 text-xs bg-blue-600 text-white rounded hover:bg-blue-700 transition-colors\"\n >\n Today\n </button>\n </div>\n\n <button\n onClick={handleNextMonth}\n className=\"p-2 hover:bg-gray-100 dark:hover:bg-gray-700 rounded-lg transition-colors\"\n aria-label=\"Next month\"\n >\n <svg className=\"w-5 h-5 text-gray-600 dark:text-gray-400\" 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-gray-600 dark:text-gray-400 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-lg text-sm font-medium transition-all\n ${!isCurrentMonthDay ? 'text-gray-400 dark:text-gray-600' : 'text-gray-900 dark:text-gray-100'}\n ${isTodayDay && !isSelectedDay ? 'bg-blue-50 dark:bg-blue-900/20 text-blue-600 dark:text-blue-400 font-bold' : ''}\n ${isSelectedDay ? 'bg-blue-600 text-white hover:bg-blue-700' : ''}\n ${!isSelectedDay && !isDisabledDay ? 'hover:bg-gray-100 dark:hover:bg-gray-700' : ''}\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-gray-700 dark:text-gray-300 mb-1\">\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-gray-500 dark:text-gray-400' : ''}>\n {value ? formatDate(value) : placeholder}\n </span>\n <svg className=\"w-5 h-5 text-gray-400\" 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 text-sm text-red-600 dark:text-red-400\">{error}</p>}\n {helperText && !error && <p className=\"mt-1 text-sm text-gray-500 dark:text-gray-400\">{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';\nimport { useTheme } from '../theme/ThemeProvider';\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 const { theme } = useTheme();\n\n const baseStyles = 'w-full appearance-none rounded-lg border border-gray-300 bg-white text-gray-900 px-4 py-2.5 text-base transition-all duration-150 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent shadow-sm hover:border-gray-400 dark:bg-gray-800 dark:border-gray-600 dark:text-gray-100 dark:hover:border-gray-500';\n const errorStyles = error ? 'border-red-500 focus:ring-red-500 dark:border-red-500' : '';\n const disabledStyles = disabled ? 'opacity-50 cursor-not-allowed bg-gray-50 dark:bg-gray-900' : '';\n\n return (\n <div className={className}>\n {label && (\n <label className=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1\">\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 text-sm text-red-600 dark:text-red-400\">{error}</p>}\n {helperText && !error && <p className=\"mt-1 text-sm text-gray-500 dark:text-gray-400\">{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';\nimport { useTheme } from '../theme/ThemeProvider';\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];\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 { theme } = useTheme();\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 const formatDateTime = (date?: Date) => {\n if (!date) return '';\n return date.toLocaleString('en-US', {\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n hour: 'numeric',\n minute: '2-digit',\n hour12: true\n });\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-lg border border-gray-300 bg-white text-gray-900 px-4 py-2.5 text-base transition-all duration-150 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent shadow-sm hover:border-gray-400 dark:bg-gray-800 dark:border-gray-600 dark:text-gray-100 dark:hover:border-gray-500 cursor-pointer';\n const errorStyles = error ? 'border-red-500 focus:ring-red-500 dark:border-red-500' : '';\n const disabledStyles = disabled ? 'opacity-50 cursor-not-allowed bg-gray-50 dark:bg-gray-900' : '';\n\n const picker = isOpen && mounted && pickerPosition ? (\n <div\n ref={pickerRef}\n className=\"fixed z-[9999] bg-white dark:bg-gray-800 rounded-lg border border-gray-200 dark:border-gray-700 shadow-xl 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-gray-100 dark:hover:bg-gray-700 rounded-lg transition-colors\"\n aria-label=\"Previous month\"\n >\n <svg className=\"w-5 h-5 text-gray-600 dark:text-gray-400\" 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-gray-900 dark:text-gray-100\">\n {MONTHS[month]} {year}\n </h2>\n <button\n onClick={handleToday}\n className=\"px-2 py-1 text-xs bg-blue-600 text-white rounded hover:bg-blue-700 transition-colors\"\n >\n Now\n </button>\n </div>\n\n <button\n onClick={handleNextMonth}\n className=\"p-2 hover:bg-gray-100 dark:hover:bg-gray-700 rounded-lg transition-colors\"\n aria-label=\"Next month\"\n >\n <svg className=\"w-5 h-5 text-gray-600 dark:text-gray-400\" 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-gray-600 dark:text-gray-400 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-lg text-sm font-medium transition-all\n ${!isCurrentMonthDay ? 'text-gray-400 dark:text-gray-600' : 'text-gray-900 dark:text-gray-100'}\n ${isTodayDay && !isSelectedDay ? 'bg-blue-50 dark:bg-blue-900/20 text-blue-600 dark:text-blue-400 font-bold' : ''}\n ${isSelectedDay ? 'bg-blue-600 text-white hover:bg-blue-700' : ''}\n ${!isSelectedDay && !isDisabledDay ? 'hover:bg-gray-100 dark:hover:bg-gray-700' : ''}\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-gray-200 dark:border-gray-700 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-gray-600 dark:text-gray-400 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-gray-100 dark:hover:bg-gray-700 rounded transition-colors\"\n >\n <svg className=\"w-4 h-4 text-gray-600 dark:text-gray-400\" 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-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-700 text-gray-900 dark:text-gray-100 focus:outline-none focus:ring-2 focus:ring-blue-500 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-gray-100 dark:hover:bg-gray-700 rounded transition-colors\"\n >\n <svg className=\"w-4 h-4 text-gray-600 dark:text-gray-400\" 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-gray-600 dark:text-gray-400 mt-8\">:</span>\n\n {/* Minutes */}\n <div className=\"flex flex-col items-center\">\n <label className=\"text-xs font-semibold text-gray-600 dark:text-gray-400 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-gray-100 dark:hover:bg-gray-700 rounded transition-colors\"\n >\n <svg className=\"w-4 h-4 text-gray-600 dark:text-gray-400\" 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-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-700 text-gray-900 dark:text-gray-100 focus:outline-none focus:ring-2 focus:ring-blue-500 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-gray-100 dark:hover:bg-gray-700 rounded transition-colors\"\n >\n <svg className=\"w-4 h-4 text-gray-600 dark:text-gray-400\" 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-gray-600 dark:text-gray-400 mb-4\">\n {formatTime(selectedTime.hours, selectedTime.minutes)}\n </div>\n <button\n onClick={handleDone}\n className=\"w-full px-4 py-2 bg-blue-600 text-white rounded-lg hover:bg-blue-700 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-gray-700 dark:text-gray-300 mb-1\">\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-gray-500 dark:text-gray-400' : ''}>\n {value ? formatDateTime(value) : placeholder}\n </span>\n <svg className=\"w-5 h-5 text-gray-400\" 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 text-sm text-red-600 dark:text-red-400\">{error}</p>}\n {helperText && !error && <p className=\"mt-1 text-sm text-gray-500 dark:text-gray-400\">{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';\nimport { useTheme } from '../theme/ThemeProvider';\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 { theme } = useTheme();\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-white dark:bg-gray-800 rounded-lg border border-gray-200 dark:border-gray-700 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-gray-100 dark:hover:bg-gray-700 rounded-lg transition-colors\"\n aria-label=\"Previous month\"\n >\n <svg className=\"w-5 h-5 text-gray-600 dark:text-gray-400\" 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-gray-900 dark:text-gray-100\">\n {MONTHS[month]} {year}\n </h2>\n <button\n onClick={handleToday}\n className=\"px-3 py-1 text-sm bg-blue-600 text-white rounded hover:bg-blue-700 transition-colors\"\n >\n Today\n </button>\n </div>\n\n <button\n onClick={handleNextMonth}\n className=\"p-2 hover:bg-gray-100 dark:hover:bg-gray-700 rounded-lg transition-colors\"\n aria-label=\"Next month\"\n >\n <svg className=\"w-5 h-5 text-gray-600 dark:text-gray-400\" 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-gray-600 dark:text-gray-400 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-lg text-sm font-medium transition-all\n ${!isCurrentMonthDay ? 'text-gray-400 dark:text-gray-600' : 'text-gray-900 dark:text-gray-100'}\n ${isTodayDay && !isSelectedDay ? 'bg-blue-50 dark:bg-blue-900/20 text-blue-600 dark:text-blue-400 font-bold' : ''}\n ${isSelectedDay ? 'bg-blue-600 text-white hover:bg-blue-700' : ''}\n ${!isSelectedDay && !isDisabledDay ? 'hover:bg-gray-100 dark:hover:bg-gray-700' : ''}\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-gray-300 dark:border-gray-600\n ${isDisabled\n ? 'bg-gray-100 dark:bg-gray-800'\n : 'peer-hover:border-gray-400 dark:peer-hover:border-gray-500'\n }\n ${isChecked\n ? 'border-blue-600 bg-white dark:bg-gray-900'\n : ''\n }\n peer-focus:ring-2 peer-focus:ring-blue-500 peer-focus:ring-offset-2\n `}>\n {/* Inner dot */}\n <div className={`w-2 h-2 rounded-full bg-blue-600 transition-all duration-200 ${\n isChecked ? 'scale-100' : 'scale-0'\n }`} />\n </div>\n </div>\n <span className={`text-sm font-medium text-gray-900 dark:text-gray-300 ${\n !isDisabled && 'group-hover:text-gray-700 dark:group-hover:text-gray-100'\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-blue-600 dark:bg-blue-500',\n success: 'bg-green-600 dark:bg-green-500',\n warning: 'bg-yellow-500 dark:bg-yellow-400',\n danger: 'bg-red-600 dark:bg-red-500',\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-gray-700 dark:text-gray-300\">\n {label}\n </span>\n )}\n {showLabel && (\n <span className=\"text-sm font-medium text-gray-700 dark:text-gray-300\">\n {Math.round(percentage)}%\n </span>\n )}\n </div>\n )}\n <div\n className={`w-full bg-gray-200 dark:bg-gray-700 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-gray-700 dark:text-gray-300\">\n {label}\n </label>\n )}\n {showValue && (\n <span className=\"text-sm font-medium text-gray-700 dark:text-gray-300\">\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-gray-200 dark:bg-gray-700 rounded-full\" />\n\n {/* Filled track between handles */}\n <div\n className=\"absolute h-2 bg-blue-600 dark:bg-blue-500 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-sm bg-white dark:bg-gray-800 border-2 border-blue-600 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-sm bg-white dark:bg-gray-800 border-2 border-blue-600 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-gray-700 dark:text-gray-300\">\n {label}\n </label>\n )}\n {showValue && (\n <span className=\"text-sm font-medium text-gray-700 dark:text-gray-300\">\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-gray-200 dark:bg-gray-700 rounded-full\" />\n\n {/* Filled track */}\n <div\n className=\"absolute h-2 bg-blue-600 dark:bg-blue-500 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-sm bg-white dark:bg-gray-800 border-2 border-blue-600 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-sm [&::-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-sm\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-blue-600',\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-gray-200 dark:bg-gray-700' : `${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-gray-400 dark:text-gray-600\"\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-4 py-2 text-base min-h-[100px]',\n lg: 'px-4 py-3 text-lg 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-lg border transition-colors duration-150 focus:outline-none focus:ring-2\n ${error\n ? 'border-red-500 focus:ring-red-500 focus:border-red-500 dark:border-red-400 dark:focus:ring-red-400'\n : 'border-gray-300 focus:ring-blue-500 focus:border-blue-500 dark:border-gray-600 dark:focus:ring-blue-400'\n }\n bg-white dark:bg-gray-800 text-gray-900 dark:text-gray-100\n placeholder:text-gray-500 dark:placeholder:text-gray-400\n disabled:opacity-50 disabled:cursor-not-allowed disabled:bg-gray-50 dark:disabled:bg-gray-900`;\n\n return (\n <div className={`w-full ${className}`}>\n {label && (\n <label className=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1\">\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 text-sm text-red-600 dark:text-red-400\">{error}</p>\n )}\n {helperText && !error && (\n <p className=\"mt-1 text-sm text-gray-500 dark:text-gray-400\">{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-gray-100 dark:bg-gray-700 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-gray-300 dark:border-gray-600 text-gray-700 dark:text-gray-300 transition-colors';\n\n const activeClass = themeName === 'minimalistic'\n ? 'bg-white text-black'\n : 'bg-blue-100 dark:bg-blue-900 border-blue-500 dark:border-blue-400';\n\n const hoverClass = themeName === 'minimalistic'\n ? 'hover:bg-white hover:text-black'\n : 'hover:bg-gray-100 dark:hover:bg-gray-700';\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-gray-500'\n : 'bg-white dark:bg-gray-800 border border-gray-300 dark:border-gray-600 text-gray-900 dark:text-gray-100';\n\n const focusClass = isFocused && !disabled\n ? themeName === 'minimalistic'\n ? 'border-white'\n : 'border-blue-500 dark:border-blue-400 ring-2 ring-blue-500/20'\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-gray-700 dark:text-gray-300 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-gray-300 dark:bg-gray-600 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-gray-300 dark:bg-gray-600 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-gray-300 dark:bg-gray-600 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-gray-500 dark:text-gray-400\">{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-green-50 dark:bg-green-900/30 border-green-500 text-green-800 dark:text-green-200',\n error: 'bg-red-50 dark:bg-red-900/30 border-red-500 text-red-800 dark:text-red-200',\n warning: 'bg-yellow-50 dark:bg-yellow-900/30 border-yellow-500 text-yellow-800 dark:text-yellow-200',\n info: 'bg-blue-50 dark:bg-blue-900/30 border-blue-500 text-blue-800 dark:text-blue-200',\n };\n\n const typeIcons = {\n success: <CheckIcon size=\"sm\" className=\"text-green-600 dark:text-green-400\" />,\n error: <CloseIcon size=\"sm\" className=\"text-red-600 dark:text-red-400\" />,\n warning: (\n <svg className=\"w-4 h-4 text-yellow-600 dark:text-yellow-400\" 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-blue-600 dark:text-blue-400\" 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-lg border-l-4 shadow-lg backdrop-blur-sm ${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\">{toast.message}</p>\n <button\n onClick={onClose}\n className=\"flex-shrink-0 text-gray-400 hover:text-gray-600 dark:hover:text-gray-200 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}\n\nexport const Stepper: React.FC<StepperProps> = ({\n steps,\n currentStep,\n orientation = 'horizontal',\n className = '',\n}) => {\n const isHorizontal = orientation === 'horizontal';\n\n return (\n <div className={`${isHorizontal ? 'flex items-center' : 'flex flex-col'} ${className}`}>\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 return (\n <React.Fragment key={index}>\n {/* Step */}\n <div className={`flex ${isHorizontal ? 'flex-col items-center' : 'flex-row items-start'} ${isHorizontal ? '' : 'flex-1'}`}>\n <div className=\"flex items-center\">\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-blue-600 border-blue-600 dark:bg-blue-500 dark:border-blue-500'\n : isActive\n ? 'border-blue-600 bg-white dark:border-blue-500 dark:bg-gray-800'\n : 'border-gray-300 bg-white dark:border-gray-600 dark:bg-gray-800'\n }`}\n >\n {isCompleted ? (\n <CheckIcon size=\"sm\" className=\"text-white\" />\n ) : (\n <span\n className={`text-sm font-semibold ${\n isActive\n ? 'text-blue-600 dark:text-blue-400'\n : 'text-gray-500 dark:text-gray-400'\n }`}\n >\n {stepNumber}\n </span>\n )}\n </div>\n </div>\n\n {/* Label */}\n <div className={`${isHorizontal ? 'mt-2 text-center' : 'ml-4 pb-8'} ${isLast && !isHorizontal ? 'pb-0' : ''}`}>\n <p\n className={`text-sm font-medium ${\n isActive || isCompleted\n ? 'text-gray-900 dark:text-gray-100'\n : 'text-gray-500 dark:text-gray-400'\n }`}\n >\n {step.label}\n </p>\n {step.description && (\n <p className=\"text-xs text-gray-500 dark:text-gray-400 mt-1\">\n {step.description}\n </p>\n )}\n </div>\n </div>\n\n {/* Connector Line */}\n {!isLast && (\n <div\n className={`${\n isHorizontal\n ? 'flex-1 h-0.5 mx-4'\n : 'w-0.5 h-full ml-5 -mt-8'\n } ${\n isCompleted || (isActive && stepNumber < currentStep)\n ? 'bg-blue-600 dark:bg-blue-500'\n : 'bg-gray-300 dark:bg-gray-600'\n }`}\n />\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-gray-300 dark:border-gray-600`} />\n )}\n <span className=\"px-4 text-sm text-gray-500 dark:text-gray-400\">\n {label}\n </span>\n {labelPosition !== 'right' && (\n <div className={`flex-1 border-t ${variantClasses[variant]} border-gray-300 dark:border-gray-600`} />\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-gray-300 dark:border-gray-600 ${className}`}\n role=\"separator\"\n aria-orientation=\"vertical\"\n />\n );\n }\n\n return (\n <hr\n className={`border-t ${variantClasses[variant]} border-gray-300 dark:border-gray-600 ${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-gray-700 dark:text-gray-300 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-blue-500 bg-blue-50 dark:bg-blue-900/20'\n : 'border-gray-300 dark:border-gray-600 hover:border-gray-400 dark:hover:border-gray-500'\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-gray-100 dark:bg-gray-800 flex items-center justify-center\">\n <UploadIcon size=\"lg\" className=\"text-gray-400 dark:text-gray-500\" />\n </div>\n <div>\n <p className=\"text-sm font-medium text-gray-700 dark:text-gray-300\">\n <span className=\"text-blue-600 dark:text-blue-400\">Click to upload</span> or drag and drop\n </p>\n <p className=\"text-xs text-gray-500 dark:text-gray-400 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-gray-500 dark:text-gray-400\">{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-gray-50 dark:bg-gray-800 rounded-lg border border-gray-200 dark:border-gray-700\"\n >\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium text-gray-900 dark:text-gray-100 truncate\">\n {file.name}\n </p>\n <p className=\"text-xs text-gray-500 dark:text-gray-400\">\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-gray-400 hover:text-red-600 dark:hover:text-red-400 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-white dark:bg-gray-800 rounded-lg border border-gray-200 dark:border-gray-700 ${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-gray-700 dark:text-gray-300 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-white dark:bg-gray-800 rounded-lg border border-gray-200 dark:border-gray-700 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-gray-900 dark:text-gray-100 truncate\">\n {title}\n </div>\n )}\n {artist && (\n <div className=\"text-xs text-gray-500 dark:text-gray-400 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-gray-500 dark:text-gray-400 tabular-nums\">\n {formatTime(currentTime)}\n </span>\n <div className=\"relative flex-1 h-1.5 bg-gray-200 dark:bg-gray-700 rounded-full overflow-visible\">\n <div\n className=\"absolute h-full bg-blue-600 dark:bg-blue-500 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 dark:bg-gray-300 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-gray-500 dark:text-gray-400 tabular-nums\">\n {formatTime(duration)}\n </span>\n {currentChapter && showChapters && (\n <span className=\"text-xs text-blue-600 dark:text-blue-400 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-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-200\"\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-gray-200 dark:bg-gray-700 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-blue-600 [&::-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-blue-600 [&::-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-gray-900 dark:bg-gray-800 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-gray-300 text-[10px] mt-0.5\">{formatTime(hoveredChapter.startTime)}</div>\n <div className=\"absolute left-1/2 -bottom-1 w-2 h-2 bg-gray-900 dark:bg-gray-800 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-white dark:bg-gray-800 rounded-lg border border-gray-200 dark:border-gray-700 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-gray-200 dark:border-gray-700\">\n {coverArt && (\n <div className=\"w-16 h-16 flex-shrink-0 rounded-md overflow-hidden bg-gray-100 dark:bg-gray-700\">\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-gray-900 dark:text-gray-100 truncate\">\n {title}\n </h3>\n )}\n {artist && (\n <p className=\"text-sm text-gray-600 dark:text-gray-400 truncate\">\n {artist}\n </p>\n )}\n {album && (\n <p className=\"text-xs text-gray-500 dark:text-gray-500 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-gray-200 dark:bg-gray-700 rounded-full overflow-visible\">\n <div\n className=\"absolute h-full bg-blue-600 dark:bg-blue-500 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 dark:bg-gray-300 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-gray-900 dark:bg-gray-800 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-gray-300 text-[10px] mt-0.5\">{formatTime(hoveredChapter.startTime)}</div>\n <div className=\"absolute left-1/2 -bottom-1 w-2 h-2 bg-gray-900 dark:bg-gray-800 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-gray-500 dark:text-gray-400 tabular-nums\">\n <span>{formatTime(currentTime)}</span>\n {currentChapter && showChapters && (\n <span className=\"text-blue-600 dark:text-blue-400 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-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-200 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-gray-200 dark:bg-gray-700 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-blue-600 [&::-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-blue-600 [&::-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-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-gray-100 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-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-900/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-gray-100 dark:hover:bg-gray-800 transition-colors ${\n isCurrentChapter ? 'bg-blue-50 dark:bg-blue-900/20 border-l-2 border-blue-600' : ''\n }`}\n >\n <div className=\"flex items-center justify-between gap-2\">\n <span className={`text-sm font-medium ${\n isCurrentChapter ? 'text-blue-600 dark:text-blue-400' : 'text-gray-900 dark:text-gray-100'\n }`}>\n {chapter.title}\n </span>\n <span className=\"text-xs text-gray-500 dark:text-gray-400 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-blue-600 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-gray-200 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-gray-200 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-gray-900 dark:bg-gray-800 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-gray-300 text-[10px] mt-0.5\">{formatTime(hoveredChapter.startTime)}</div>\n <div className=\"absolute left-1/2 -bottom-1 w-2 h-2 bg-gray-900 dark:bg-gray-800 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-white dark:bg-gray-800 rounded-lg border border-gray-200 dark:border-gray-700 shadow-md overflow-hidden ${className}`}>\n {title && (\n <div className=\"px-4 py-3 border-b border-gray-200 dark:border-gray-700\">\n <h3 className=\"text-base font-semibold text-gray-900 dark:text-gray-100 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-blue-600 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-gray-200 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-gray-200 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-gray-900 dark:bg-gray-800 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-gray-300 text-[10px] mt-0.5\">{formatTime(hoveredChapter.startTime)}</div>\n <div className=\"absolute left-1/2 -bottom-1 w-2 h-2 bg-gray-900 dark:bg-gray-800 transform -translate-x-1/2 rotate-45\" />\n </div>\n )}\n </div>\n </div>\n );\n};\n","\"use client\";\n\nimport React from 'react';\n\nexport interface LineChartDataPoint {\n x: string | number;\n y: number;\n}\n\nexport interface LineChartSeries {\n name: string;\n data: LineChartDataPoint[];\n color?: string;\n}\n\nexport interface LineChartProps {\n data: LineChartSeries[];\n width?: number;\n height?: number;\n aspectRatio?: number;\n responsive?: boolean;\n showGrid?: boolean;\n showXAxis?: boolean;\n showYAxis?: boolean;\n showLegend?: boolean;\n showTooltip?: boolean;\n showDots?: boolean;\n curved?: boolean;\n strokeWidth?: number;\n className?: string;\n xAxisLabel?: string;\n yAxisLabel?: string;\n baseFontSize?: number;\n}\n\nconst defaultColors = [\n '#3b82f6', // blue-500\n '#10b981', // green-500\n '#f59e0b', // amber-500\n '#ef4444', // red-500\n '#8b5cf6', // violet-500\n '#ec4899', // pink-500\n];\n\nexport const LineChart: React.FC<LineChartProps> = ({\n data,\n width: providedWidth,\n height: providedHeight,\n aspectRatio = 16 / 9,\n responsive = true,\n showGrid = true,\n showXAxis = true,\n showYAxis = true,\n showLegend = true,\n showTooltip = true,\n showDots = true,\n curved = false,\n strokeWidth = 2,\n className = '',\n xAxisLabel,\n yAxisLabel,\n baseFontSize = 14,\n}) => {\n // SVG viewBox dimensions - fixed for consistency\n const viewBoxWidth = 1000;\n const viewBoxHeight = 600;\n\n const containerRef = React.useRef<HTMLDivElement>(null);\n const svgRef = React.useRef<SVGSVGElement>(null);\n const [tooltipPosition, setTooltipPosition] = React.useState<{ x: number; y: number } | null>(null);\n\n const [hoveredPoint, setHoveredPoint] = React.useState<{\n seriesIndex: number;\n pointIndex: number;\n x: number;\n y: number;\n } | null>(null);\n\n // Generate unique class names for this chart instance\n const chartId = React.useId();\n const wrapperClass = `chart-svg-wrapper-${chartId.replace(/:/g, '-')}`;\n const gridLabelClass = `chart-grid-label-${chartId.replace(/:/g, '-')}`;\n const axisLabelClass = `chart-axis-label-${chartId.replace(/:/g, '-')}`;\n const lineClass = `chart-line-${chartId.replace(/:/g, '-')}`;\n const pointClass = `chart-point-${chartId.replace(/:/g, '-')}`;\n\n // Responsive padding that scales with viewBox\n const padding = {\n top: 50,\n right: 50,\n bottom: showXAxis ? 120 : 50,\n left: showYAxis ? 130 : 50\n };\n const chartWidth = viewBoxWidth - padding.left - padding.right;\n const chartHeight = viewBoxHeight - padding.top - padding.bottom;\n\n // Font sizes as percentage of viewBox width - will be overridden by CSS media queries\n // Mobile gets larger percentages, desktop gets smaller ones\n const gridLabelFontSize = viewBoxWidth * 0.045; // 4.5% = 45px (mobile default)\n const axisLabelFontSize = viewBoxWidth * 0.05; // 5% = 50px (mobile default)\n const titleFontSize = viewBoxWidth * 0.055; // 5.5% = 55px (mobile default)\n\n // Get all data points for scale calculation\n const allPoints = data.flatMap(series => series.data);\n const allYValues = allPoints.map(p => p.y);\n\n // Determine if X values are strings or numbers\n const firstXValue = data[0]?.data[0]?.x;\n const isStringX = typeof firstXValue === 'string';\n\n // For string X values, create a mapping of unique values to indices\n const uniqueXValues = isStringX\n ? Array.from(new Set(allPoints.map(p => p.x)))\n : [];\n\n const xValueToIndex = isStringX\n ? Object.fromEntries(uniqueXValues.map((val, idx) => [val, idx]))\n : {};\n\n // Calculate X scale range\n const allXNumbers = isStringX\n ? uniqueXValues.map((_, idx) => idx)\n : allPoints.map(p => p.x as number);\n\n const minX = Math.min(...allXNumbers);\n const maxX = Math.max(...allXNumbers);\n const minY = Math.min(0, ...allYValues);\n const maxY = Math.max(...allYValues);\n\n // Add some padding to Y axis (but don't go below 0)\n const yRange = maxY - minY;\n const yMin = Math.max(0, minY - yRange * 0.1); // Ensure baseline stays at 0\n const yMax = maxY + yRange * 0.1;\n\n // Scale functions\n const scaleX = (x: string | number, index: number) => {\n const numX = isStringX ? index : (x as number);\n if (maxX === minX) return chartWidth / 2; // Handle single point case\n return ((numX - minX) / (maxX - minX)) * chartWidth;\n };\n\n const scaleY = (y: number) => {\n if (yMax === yMin) return chartHeight / 2; // Handle flat line case\n return chartHeight - ((y - yMin) / (yMax - yMin)) * chartHeight;\n };\n\n // Generate path for line\n const generatePath = (series: LineChartSeries) => {\n if (series.data.length === 0) return '';\n\n const points = series.data.map((point, i) => {\n const x = scaleX(point.x, i);\n const y = scaleY(point.y);\n return { x, y, originalIndex: i };\n });\n\n if (curved) {\n // Cubic bezier curve\n let path = `M ${points[0].x} ${points[0].y}`;\n\n for (let i = 0; i < points.length - 1; i++) {\n const current = points[i];\n const next = points[i + 1];\n const controlPointX = (current.x + next.x) / 2;\n\n path += ` C ${controlPointX} ${current.y}, ${controlPointX} ${next.y}, ${next.x} ${next.y}`;\n }\n\n return path;\n } else {\n // Straight lines\n return points.map((p, i) => `${i === 0 ? 'M' : 'L'} ${p.x} ${p.y}`).join(' ');\n }\n };\n\n // Generate grid lines\n const gridLines = [];\n const numGridLines = 5;\n\n if (showGrid) {\n // Horizontal grid lines\n for (let i = 0; i <= numGridLines; i++) {\n const y = (chartHeight / numGridLines) * i;\n const yValue = yMax - ((yMax - yMin) / numGridLines) * i;\n gridLines.push(\n <g key={`grid-h-${i}`}>\n <line\n x1={0}\n y1={y}\n x2={chartWidth}\n y2={y}\n stroke=\"currentColor\"\n strokeWidth=\"0.5\"\n className=\"text-gray-200 dark:text-gray-700\"\n strokeDasharray=\"4,4\"\n />\n {showYAxis && (\n <text\n x={-25}\n y={y}\n textAnchor=\"end\"\n dominantBaseline=\"middle\"\n fontSize={gridLabelFontSize}\n className={`fill-gray-600 dark:fill-gray-400 ${gridLabelClass}`}\n >\n {yValue.toFixed(1)}\n </text>\n )}\n </g>\n );\n }\n\n // Vertical grid lines - fixed for single point case\n const numXGridLines = Math.max(2, Math.min(allPoints.length, 6));\n const xGridStep = numXGridLines > 1 ? 1 / (numXGridLines - 1) : 0;\n\n for (let i = 0; i < numXGridLines; i++) {\n const x = chartWidth * (i * xGridStep);\n const dataIndex = Math.floor((data[0]?.data.length - 1) * (i * xGridStep));\n const xValue = data[0]?.data[Math.max(0, Math.min(dataIndex, data[0].data.length - 1))]?.x || '';\n\n gridLines.push(\n <g key={`grid-v-${i}`}>\n <line\n x1={x}\n y1={0}\n x2={x}\n y2={chartHeight}\n stroke=\"currentColor\"\n strokeWidth=\"0.5\"\n className=\"text-gray-200 dark:text-gray-700\"\n strokeDasharray=\"4,4\"\n />\n {showXAxis && (\n <text\n x={x}\n y={chartHeight + 35}\n textAnchor=\"middle\"\n dominantBaseline=\"hanging\"\n fontSize={gridLabelFontSize}\n className={`fill-gray-600 dark:fill-gray-400 ${gridLabelClass}`}\n >\n {xValue}\n </text>\n )}\n </g>\n );\n }\n }\n\n\n\n // Calculate tooltip position with boundary detection\n const getTooltipPosition = React.useCallback((x: number, y: number) => {\n if (!containerRef.current) return { x, y };\n\n const rect = containerRef.current.getBoundingClientRect();\n const tooltipWidth = 120;\n const tooltipHeight = 80;\n\n let tooltipX = x + 10;\n let tooltipY = y - 30;\n\n // Check right boundary\n if (tooltipX + tooltipWidth > rect.width) {\n tooltipX = x - tooltipWidth - 10;\n }\n\n // Check bottom boundary\n if (tooltipY + tooltipHeight > rect.height) {\n tooltipY = y + 30;\n }\n\n return { x: tooltipX, y: tooltipY };\n }, []);\n\n const containerStyle: React.CSSProperties = {\n '--font-size-base': `${baseFontSize}px`,\n '--font-size-lg': `calc(var(--font-size-base) * 1.125)`,\n '--font-size-sm': `calc(var(--font-size-base) * 0.875)`,\n '--font-size-xs': `calc(var(--font-size-base) * 0.75)`,\n } as any;\n\n return (\n <div\n ref={containerRef}\n className={`relative flex flex-col gap-4 ${responsive ? 'w-full' : 'inline-block'} ${className}`}\n style={{\n ...containerStyle\n }}\n >\n <style>{`\n /* Mobile: Large fonts, hidden axis titles, thicker lines (default) */\n .${gridLabelClass} { font-size: ${gridLabelFontSize}px !important; }\n .${axisLabelClass} { display: none; }\n .${lineClass} { stroke-width: ${strokeWidth * 2.5} !important; }\n .${pointClass} { r: 6 !important; stroke-width: 3 !important; }\n\n /* Tablet: Medium fonts, show axis titles, medium lines */\n @media (min-width: 640px) {\n .${gridLabelClass} { font-size: ${gridLabelFontSize * 0.7}px !important; }\n .${axisLabelClass} {\n font-size: ${axisLabelFontSize * 0.7}px !important;\n display: block;\n }\n .${lineClass} { stroke-width: ${strokeWidth * 1.5} !important; }\n .${pointClass} { r: 4 !important; stroke-width: 2 !important; }\n }\n\n /* Desktop: Small fonts, show axis titles, normal lines */\n @media (min-width: 1024px) {\n .${gridLabelClass} { font-size: ${gridLabelFontSize * 0.4}px !important; }\n .${axisLabelClass} {\n font-size: ${axisLabelFontSize * 0.4}px !important;\n display: block;\n }\n .${lineClass} { stroke-width: ${strokeWidth} !important; }\n .${pointClass} { r: 3 !important; stroke-width: 1.5 !important; }\n }\n `}</style>\n <svg\n ref={svgRef}\n width=\"100%\"\n viewBox={`0 0 ${viewBoxWidth} ${viewBoxHeight}`}\n preserveAspectRatio=\"xMidYMid meet\"\n className=\"bg-white dark:bg-gray-800 block w-full\"\n style={{ height: 'auto', overflow: 'visible' }}\n >\n <g transform={`translate(${padding.left}, ${padding.top})`}>\n {/* Grid lines */}\n {gridLines}\n\n {/* Lines */}\n {data.map((series, seriesIndex) => (\n <path\n key={`line-${seriesIndex}`}\n d={generatePath(series)}\n fill=\"none\"\n stroke={series.color || defaultColors[seriesIndex % defaultColors.length]}\n strokeWidth={strokeWidth}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={lineClass}\n />\n ))}\n\n {/* Data points */}\n {showDots && data.map((series, seriesIndex) =>\n series.data.map((point, pointIndex) => {\n const x = scaleX(point.x, pointIndex);\n const y = scaleY(point.y);\n const isHovered =\n hoveredPoint?.seriesIndex === seriesIndex &&\n hoveredPoint?.pointIndex === pointIndex;\n\n return (\n <circle\n key={`point-${seriesIndex}-${pointIndex}`}\n cx={x}\n cy={y}\n r={isHovered ? 5 : 3}\n fill={series.color || defaultColors[seriesIndex % defaultColors.length]}\n stroke=\"white\"\n strokeWidth=\"1.5\"\n className={`cursor-pointer transition-all ${pointClass}`}\n onMouseEnter={(e) => {\n if (showTooltip && containerRef.current) {\n setHoveredPoint({ seriesIndex, pointIndex, x, y });\n\n // Use mouse event coordinates relative to the container\n const containerRect = containerRef.current.getBoundingClientRect();\n const mouseX = e.clientX - containerRect.left;\n const mouseY = e.clientY - containerRect.top;\n\n setTooltipPosition(getTooltipPosition(mouseX, mouseY));\n }\n }}\n onMouseMove={(e) => {\n if (showTooltip && hoveredPoint?.seriesIndex === seriesIndex && hoveredPoint?.pointIndex === pointIndex && containerRef.current) {\n // Update tooltip position as mouse moves\n const containerRect = containerRef.current.getBoundingClientRect();\n const mouseX = e.clientX - containerRect.left;\n const mouseY = e.clientY - containerRect.top;\n\n setTooltipPosition(getTooltipPosition(mouseX, mouseY));\n }\n }}\n onMouseLeave={() => {\n setHoveredPoint(null);\n setTooltipPosition(null);\n }}\n />\n );\n })\n )}\n\n {/* Axis labels */}\n {xAxisLabel && showXAxis && (\n <text\n x={chartWidth / 2}\n y={chartHeight + 80}\n textAnchor=\"middle\"\n dominantBaseline=\"hanging\"\n fontSize={axisLabelFontSize}\n fontWeight=\"600\"\n className={`fill-gray-700 dark:fill-gray-300 ${axisLabelClass}`}\n >\n {xAxisLabel}\n </text>\n )}\n {yAxisLabel && showYAxis && (\n <text\n x={-chartHeight / 2}\n y={-100}\n textAnchor=\"middle\"\n dominantBaseline=\"middle\"\n fontSize={axisLabelFontSize}\n fontWeight=\"600\"\n transform=\"rotate(-90)\"\n className={`fill-gray-700 dark:fill-gray-300 ${axisLabelClass}`}\n >\n {yAxisLabel}\n </text>\n )}\n </g>\n </svg>\n\n {/* Legend */}\n {showLegend && (\n <div className=\"flex flex-wrap gap-3 justify-center px-4\">\n {data.map((series, index) => (\n <div key={`legend-${index}`} className=\"flex items-center gap-2 text-sm\">\n <div\n className=\"w-3 h-3 rounded-sm flex-shrink-0\"\n style={{\n backgroundColor: series.color || defaultColors[index % defaultColors.length],\n }}\n />\n <span className=\"text-gray-700 dark:text-gray-300\">\n {series.name}\n </span>\n </div>\n ))}\n </div>\n )}\n\n {/* Tooltip */}\n {showTooltip && hoveredPoint && tooltipPosition && (\n <div\n className=\"absolute bg-gray-900 dark:bg-gray-700 text-white px-3 py-2 rounded shadow-lg pointer-events-none z-50 text-sm whitespace-nowrap\"\n style={{\n left: `${tooltipPosition.x}px`,\n top: `${tooltipPosition.y}px`,\n transform: 'translateZ(0)',\n }}\n >\n <div className=\"font-semibold\">\n {data[hoveredPoint.seriesIndex].name}\n </div>\n <div className=\"text-xs opacity-90\">\n x: {data[hoveredPoint.seriesIndex].data[hoveredPoint.pointIndex].x}\n </div>\n <div className=\"text-xs opacity-90\">\n y: {data[hoveredPoint.seriesIndex].data[hoveredPoint.pointIndex].y}\n </div>\n </div>\n )}\n </div>\n );\n};\n","\"use client\";\n\nimport React from 'react';\n\nexport interface BarChartDataPoint {\n x: string | number;\n y: number;\n}\n\nexport interface BarChartSeries {\n name: string;\n data: BarChartDataPoint[];\n color?: string;\n}\n\nexport interface BarChartProps {\n data: BarChartSeries[];\n width?: number;\n height?: number;\n aspectRatio?: number;\n responsive?: boolean;\n showGrid?: boolean;\n showXAxis?: boolean;\n showYAxis?: boolean;\n showLegend?: boolean;\n showTooltip?: boolean;\n showValues?: boolean;\n stacked?: boolean;\n horizontal?: boolean;\n barWidth?: number;\n className?: string;\n xAxisLabel?: string;\n yAxisLabel?: string;\n baseFontSize?: number;\n colors?: string[];\n}\n\nconst defaultColors = [\n '#3b82f6', // blue-500\n '#10b981', // green-500\n '#f59e0b', // amber-500\n '#ef4444', // red-500\n '#8b5cf6', // violet-500\n '#ec4899', // pink-500\n];\n\nexport const BarChart: React.FC<BarChartProps> = ({\n data,\n width: providedWidth,\n height: providedHeight,\n aspectRatio = 16 / 9,\n responsive = true,\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 barWidth = 0.8,\n className = '',\n xAxisLabel,\n yAxisLabel,\n baseFontSize = 14,\n colors = defaultColors,\n}) => {\n // SVG viewBox dimensions (fixed for proper scaling)\n const viewBoxWidth = 1000;\n const viewBoxHeight = 600;\n\n const containerRef = React.useRef<HTMLDivElement>(null);\n const [tooltipPosition, setTooltipPosition] = React.useState<{ x: number; y: number } | null>(null);\n\n const [hoveredBar, setHoveredBar] = React.useState<{\n seriesIndex: number;\n barIndex: number;\n x: number;\n y: number;\n } | null>(null);\n\n // Generate unique class names for this chart instance\n const chartId = React.useId();\n const wrapperClass = `chart-svg-wrapper-${chartId.replace(/:/g, '-')}`;\n const gridLabelClass = `chart-grid-label-${chartId.replace(/:/g, '-')}`;\n const axisLabelClass = `chart-axis-label-${chartId.replace(/:/g, '-')}`;\n const barClass = `chart-bar-${chartId.replace(/:/g, '-')}`;\n\n // Responsive padding that scales with viewBox\n const padding = {\n top: 50,\n right: 50,\n bottom: showXAxis ? (horizontal ? 120 : 140) : 50,\n left: showYAxis ? (horizontal ? 140 : 130) : 50\n };\n const chartWidth = viewBoxWidth - padding.left - padding.right;\n const chartHeight = viewBoxHeight - padding.top - padding.bottom;\n\n // Font sizes as percentage of viewBox width - will be overridden by CSS media queries\n // Mobile gets larger percentages, desktop gets smaller ones\n const gridLabelFontSize = viewBoxWidth * 0.045; // 4.5% = 45px (mobile default)\n const axisLabelFontSize = viewBoxWidth * 0.05; // 5% = 50px (mobile default)\n const titleFontSize = viewBoxWidth * 0.055; // 5.5% = 55px (mobile default)\n\n // Get all Y values for scale calculation\n const allYValues = stacked\n ? data[0]?.data.map((_, i) =>\n data.reduce((sum, series) => sum + (series.data[i]?.y || 0), 0)\n ) || []\n : data.flatMap(series => series.data.map(p => p.y));\n\n const minY = Math.min(0, ...allYValues);\n const maxY = Math.max(...allYValues);\n\n // Add some padding to Y axis (but don't go below 0)\n const yRange = maxY - minY;\n const yMin = Math.max(0, minY - yRange * 0.1); // Ensure baseline stays at 0\n const yMax = maxY + yRange * 0.1;\n\n // Number of bars per group\n const numBars = data[0]?.data.length || 0;\n const numSeries = data.length;\n\n // Scale functions\n const scaleY = (y: number) => {\n if (yMax === yMin) return chartHeight / 2;\n return chartHeight - ((y - yMin) / (yMax - yMin)) * chartHeight;\n };\n\n // Calculate bar positions\n const barGroupWidth = chartWidth / numBars;\n const barPadding = barGroupWidth * (1 - barWidth) / 2;\n const actualBarWidth = stacked\n ? barGroupWidth * barWidth\n : (barGroupWidth * barWidth) / numSeries;\n\n // Generate grid lines\n const gridLines = [];\n const numGridLines = 5;\n\n if (showGrid) {\n // Horizontal grid lines\n for (let i = 0; i <= numGridLines; i++) {\n const y = (chartHeight / numGridLines) * i;\n const yValue = yMax - ((yMax - yMin) / numGridLines) * i;\n gridLines.push(\n <g key={`grid-h-${i}`}>\n <line\n x1={0}\n y1={y}\n x2={chartWidth}\n y2={y}\n stroke=\"currentColor\"\n strokeWidth=\"0.5\"\n className=\"text-gray-200 dark:text-gray-700\"\n strokeDasharray=\"4,4\"\n />\n {showYAxis && !horizontal && (\n <text\n x={-25}\n y={y}\n textAnchor=\"end\"\n dominantBaseline=\"middle\"\n fontSize={gridLabelFontSize}\n className={`fill-gray-600 dark:fill-gray-400 ${gridLabelClass}`}\n >\n {yValue.toFixed(0)}\n </text>\n )}\n </g>\n );\n }\n\n // Vertical grid lines\n if (horizontal) {\n for (let i = 0; i <= numGridLines; i++) {\n const x = (chartWidth / numGridLines) * i;\n gridLines.push(\n <line\n key={`grid-v-${i}`}\n x1={x}\n y1={0}\n x2={x}\n y2={chartHeight}\n stroke=\"currentColor\"\n strokeWidth=\"1\"\n className=\"text-gray-200 dark:text-gray-700\"\n strokeDasharray=\"2,2\"\n />\n );\n }\n }\n }\n\n // Render bars\n const renderBars = () => {\n const bars = [];\n\n if (stacked) {\n // Stacked bars\n for (let barIndex = 0; barIndex < numBars; barIndex++) {\n let cumulativeY = 0;\n const xPos = barIndex * barGroupWidth + barPadding;\n const barW = barGroupWidth * barWidth;\n\n for (let seriesIndex = 0; seriesIndex < numSeries; seriesIndex++) {\n const point = data[seriesIndex].data[barIndex];\n if (!point) continue;\n\n const barHeight = Math.abs(scaleY(point.y) - scaleY(0));\n const yPos = scaleY(cumulativeY + point.y);\n\n const isHovered =\n hoveredBar?.seriesIndex === seriesIndex &&\n hoveredBar?.barIndex === barIndex;\n\n bars.push(\n <rect\n key={`bar-${seriesIndex}-${barIndex}`}\n x={xPos}\n y={yPos}\n width={barW}\n height={Math.abs(scaleY(0) - yPos)}\n fill={data[seriesIndex].color || colors[seriesIndex % colors.length]}\n className={`cursor-pointer transition-opacity ${barClass}`}\n opacity={isHovered ? 0.8 : 1}\n onMouseEnter={() => {\n if (showTooltip) {\n setHoveredBar({ seriesIndex, barIndex, x: xPos + barW / 2, y: yPos });\n setTooltipPosition(getTooltipPosition(padding.left + xPos + barW / 2, padding.top + yPos));\n }\n }}\n onMouseLeave={() => {\n setHoveredBar(null);\n setTooltipPosition(null);\n }}\n />\n );\n\n cumulativeY += point.y;\n }\n }\n } else {\n // Grouped bars\n for (let barIndex = 0; barIndex < numBars; barIndex++) {\n for (let seriesIndex = 0; seriesIndex < numSeries; seriesIndex++) {\n const point = data[seriesIndex].data[barIndex];\n if (!point) continue;\n\n const xPos = barIndex * barGroupWidth + barPadding + seriesIndex * actualBarWidth;\n const barHeight = Math.abs(scaleY(point.y) - scaleY(0));\n const yPos = scaleY(Math.max(0, point.y));\n\n const isHovered =\n hoveredBar?.seriesIndex === seriesIndex &&\n hoveredBar?.barIndex === barIndex;\n\n bars.push(\n <rect\n key={`bar-${seriesIndex}-${barIndex}`}\n x={xPos}\n y={yPos}\n width={actualBarWidth}\n height={barHeight}\n fill={data[seriesIndex].color || colors[seriesIndex % colors.length]}\n className={`cursor-pointer transition-opacity ${barClass}`}\n opacity={isHovered ? 0.8 : 1}\n onMouseEnter={() =>\n showTooltip &&\n setHoveredBar({ seriesIndex, barIndex, x: xPos + actualBarWidth / 2, y: yPos })\n }\n onMouseLeave={() => setHoveredBar(null)}\n />\n );\n\n // Show values on bars\n if (showValues) {\n bars.push(\n <text\n key={`value-${seriesIndex}-${barIndex}`}\n x={xPos + actualBarWidth / 2}\n y={yPos - 10}\n textAnchor=\"middle\"\n dominantBaseline=\"middle\"\n fontSize=\"11\"\n fontWeight=\"600\"\n className=\"fill-gray-700 dark:fill-gray-300\"\n >\n {point.y}\n </text>\n );\n }\n }\n }\n }\n\n return bars;\n };\n\n // X axis labels\n const xAxisLabels = data[0]?.data.map((point, i) => {\n const xPos = i * barGroupWidth + barGroupWidth / 2;\n return (\n <text\n key={`x-label-${i}`}\n x={xPos}\n y={chartHeight + 35}\n textAnchor=\"middle\"\n dominantBaseline=\"hanging\"\n fontSize={gridLabelFontSize}\n className={`fill-gray-600 dark:fill-gray-400 ${gridLabelClass}`}\n >\n {point.x}\n </text>\n );\n });\n\n // Calculate tooltip position with boundary detection\n const getTooltipPosition = React.useCallback((x: number, y: number) => {\n if (!containerRef.current) return { x, y };\n\n const rect = containerRef.current.getBoundingClientRect();\n const tooltipWidth = 140;\n const tooltipHeight = 80;\n\n let tooltipX = x + 10;\n let tooltipY = y - 30;\n\n // Check right boundary\n if (tooltipX + tooltipWidth > rect.width) {\n tooltipX = x - tooltipWidth - 10;\n }\n\n // Check bottom boundary\n if (tooltipY + tooltipHeight > rect.height) {\n tooltipY = y + 30;\n }\n\n return { x: tooltipX, y: tooltipY };\n }, []);\n\n const containerStyle: React.CSSProperties = {\n '--font-size-base': `${baseFontSize}px`,\n '--font-size-lg': `calc(var(--font-size-base) * 1.125)`,\n '--font-size-sm': `calc(var(--font-size-base) * 0.875)`,\n '--font-size-xs': `calc(var(--font-size-base) * 0.75)`,\n } as any;\n\n return (\n <div\n ref={containerRef}\n className={`relative flex flex-col gap-4 ${responsive ? 'w-full' : 'inline-block'} ${className}`}\n style={{\n ...containerStyle\n }}\n >\n <style>{`\n /* Mobile: Large fonts, hidden axis titles, thicker bars (default) */\n .${gridLabelClass} { font-size: ${gridLabelFontSize}px !important; }\n .${axisLabelClass} { display: none; }\n\n /* Tablet: Medium fonts, show axis titles */\n @media (min-width: 640px) {\n .${gridLabelClass} { font-size: ${gridLabelFontSize * 0.7}px !important; }\n .${axisLabelClass} {\n font-size: ${axisLabelFontSize * 0.7}px !important;\n display: block;\n }\n }\n\n /* Desktop: Small fonts, show axis titles */\n @media (min-width: 1024px) {\n .${gridLabelClass} { font-size: ${gridLabelFontSize * 0.4}px !important; }\n .${axisLabelClass} {\n font-size: ${axisLabelFontSize * 0.4}px !important;\n display: block;\n }\n }\n `}</style>\n <svg\n width=\"100%\"\n viewBox={`0 0 ${viewBoxWidth} ${viewBoxHeight}`}\n preserveAspectRatio=\"xMidYMid meet\"\n className=\"bg-white dark:bg-gray-800 block w-full\"\n style={{ height: 'auto', overflow: 'visible' }}\n >\n <g transform={`translate(${padding.left}, ${padding.top})`}>\n {/* Grid lines */}\n {gridLines}\n\n {/* Bars */}\n {renderBars()}\n\n {/* X axis labels */}\n {showXAxis && xAxisLabels}\n\n {/* Axis labels */}\n {xAxisLabel && showXAxis && (\n <text\n x={chartWidth / 2}\n y={chartHeight + 80}\n textAnchor=\"middle\"\n dominantBaseline=\"hanging\"\n fontSize={axisLabelFontSize}\n fontWeight=\"600\"\n className={`fill-gray-700 dark:fill-gray-300 ${axisLabelClass}`}\n >\n {xAxisLabel}\n </text>\n )}\n {yAxisLabel && showYAxis && (\n <text\n x={-chartHeight / 2}\n y={-100}\n textAnchor=\"middle\"\n dominantBaseline=\"middle\"\n fontSize={axisLabelFontSize}\n fontWeight=\"600\"\n transform=\"rotate(-90)\"\n className={`fill-gray-700 dark:fill-gray-300 ${axisLabelClass}`}\n >\n {yAxisLabel}\n </text>\n )}\n </g>\n </svg>\n\n {/* Legend */}\n {showLegend && (\n <div className=\"flex flex-wrap gap-3 justify-center px-4\">\n {data.map((series, index) => (\n <div key={`legend-${index}`} className=\"flex items-center gap-2 text-sm\">\n <div\n className=\"w-3 h-3 rounded-sm flex-shrink-0\"\n style={{\n backgroundColor: series.color || colors[index % colors.length],\n }}\n />\n <span className=\"text-gray-700 dark:text-gray-300\">\n {series.name}\n </span>\n </div>\n ))}\n </div>\n )}\n\n {/* Tooltip */}\n {showTooltip && hoveredBar && tooltipPosition && (\n <div\n className=\"absolute bg-gray-900 dark:bg-gray-700 text-white px-3 py-2 rounded shadow-lg pointer-events-none z-50 text-sm whitespace-nowrap\"\n style={{\n left: `${tooltipPosition.x}px`,\n top: `${tooltipPosition.y}px`,\n transform: 'translateZ(0)',\n }}\n >\n <div className=\"font-semibold\">\n {data[hoveredBar.seriesIndex].name}\n </div>\n <div className=\"text-xs opacity-90\">\n {data[hoveredBar.seriesIndex].data[hoveredBar.barIndex].x}: {data[hoveredBar.seriesIndex].data[hoveredBar.barIndex].y}\n </div>\n </div>\n )}\n </div>\n );\n};\n","\"use client\";\n\nimport React from 'react';\n\nexport interface AreaChartDataPoint {\n x: string | number;\n y: number;\n}\n\nexport interface AreaChartSeries {\n name: string;\n data: AreaChartDataPoint[];\n color?: string;\n}\n\nexport interface AreaChartProps {\n data: AreaChartSeries[];\n width?: number;\n height?: number;\n aspectRatio?: number;\n responsive?: boolean;\n showGrid?: boolean;\n showXAxis?: boolean;\n showYAxis?: boolean;\n showLegend?: boolean;\n showTooltip?: boolean;\n showDots?: boolean;\n curved?: boolean;\n stacked?: boolean;\n fillOpacity?: number;\n strokeWidth?: number;\n className?: string;\n xAxisLabel?: string;\n yAxisLabel?: string;\n baseFontSize?: number;\n}\n\nconst defaultColors = [\n '#3b82f6', // blue-500\n '#10b981', // green-500\n '#f59e0b', // amber-500\n '#ef4444', // red-500\n '#8b5cf6', // violet-500\n '#ec4899', // pink-500\n];\n\nexport const AreaChart: React.FC<AreaChartProps> = ({\n data,\n width: providedWidth,\n height: providedHeight,\n aspectRatio = 16 / 9,\n responsive = true,\n showGrid = true,\n showXAxis = true,\n showYAxis = true,\n showLegend = true,\n showTooltip = true,\n showDots = false,\n curved = true,\n stacked = false,\n fillOpacity = 0.3,\n strokeWidth = 2,\n className = '',\n xAxisLabel,\n yAxisLabel,\n baseFontSize = 14,\n}) => {\n // SVG viewBox dimensions (fixed for proper scaling)\n const viewBoxWidth = 1000;\n const viewBoxHeight = 600;\n\n const containerRef = React.useRef<HTMLDivElement>(null);\n const svgRef = React.useRef<SVGSVGElement>(null);\n const [tooltipPosition, setTooltipPosition] = React.useState<{ x: number; y: number } | null>(null);\n\n const [hoveredPoint, setHoveredPoint] = React.useState<{\n seriesIndex: number;\n pointIndex: number;\n x: number;\n y: number;\n } | null>(null);\n\n // Generate unique class names for this chart instance\n const chartId = React.useId();\n const wrapperClass = `chart-svg-wrapper-${chartId.replace(/:/g, '-')}`;\n const gridLabelClass = `chart-grid-label-${chartId.replace(/:/g, '-')}`;\n const axisLabelClass = `chart-axis-label-${chartId.replace(/:/g, '-')}`;\n const lineClass = `chart-line-${chartId.replace(/:/g, '-')}`;\n const pointClass = `chart-point-${chartId.replace(/:/g, '-')}`;\n\n // Calculate chart dimensions with padding (in viewBox space)\n const padding = {\n top: 50,\n right: 50,\n bottom: showXAxis ? 120 : 50,\n left: showYAxis ? 130 : 50\n };\n const chartWidth = viewBoxWidth - padding.left - padding.right;\n const chartHeight = viewBoxHeight - padding.top - padding.bottom;\n\n // Font sizes as percentage of viewBox width - will be overridden by CSS media queries\n // Mobile gets larger percentages, desktop gets smaller ones\n const gridLabelFontSize = viewBoxWidth * 0.045; // 4.5% = 45px (mobile default)\n const axisLabelFontSize = viewBoxWidth * 0.05; // 5% = 50px (mobile default)\n const titleFontSize = viewBoxWidth * 0.055; // 5.5% = 55px (mobile default)\n\n // Get all data points for scale calculation\n const allPoints = data.flatMap(series => series.data);\n const allYValues = stacked\n ? data[0]?.data.map((_, i) =>\n data.reduce((sum, series) => sum + (series.data[i]?.y || 0), 0)\n ) || []\n : allPoints.map(p => p.y);\n\n // Determine if X values are strings or numbers\n const firstXValue = data[0]?.data[0]?.x;\n const isStringX = typeof firstXValue === 'string';\n\n // For string X values, create a mapping of unique values to indices\n const uniqueXValues = isStringX\n ? Array.from(new Set(allPoints.map(p => p.x)))\n : [];\n\n // Calculate X scale range\n const allXNumbers = isStringX\n ? uniqueXValues.map((_, idx) => idx)\n : allPoints.map(p => p.x as number);\n\n const minX = Math.min(...allXNumbers);\n const maxX = Math.max(...allXNumbers);\n const minY = Math.min(0, ...allYValues);\n const maxY = Math.max(...allYValues);\n\n // Add some padding to Y axis (but don't go below 0 for area charts)\n const yRange = maxY - minY;\n const yMin = Math.max(0, minY - yRange * 0.1); // Ensure baseline stays at 0\n const yMax = maxY + yRange * 0.1;\n\n // Scale functions\n const scaleX = (x: string | number, index: number) => {\n const numX = isStringX ? index : (x as number);\n if (maxX === minX) return chartWidth / 2;\n return ((numX - minX) / (maxX - minX)) * chartWidth;\n };\n\n const scaleY = (y: number) => {\n if (yMax === yMin) return chartHeight / 2;\n return chartHeight - ((y - yMin) / (yMax - yMin)) * chartHeight;\n };\n\n // Generate path for area\n const generateAreaPath = (series: AreaChartSeries, baselineYValues?: number[]) => {\n if (series.data.length === 0) return '';\n\n const points = series.data.map((point, i) => {\n const x = scaleX(point.x, i);\n const baseY = baselineYValues ? scaleY(baselineYValues[i]) : scaleY(0);\n const y = baselineYValues\n ? scaleY(baselineYValues[i] + point.y)\n : scaleY(point.y);\n return { x, y, baseY, originalIndex: i };\n });\n\n if (curved) {\n // Top line (cubic bezier curve)\n let topPath = `M ${points[0].x} ${points[0].y}`;\n for (let i = 0; i < points.length - 1; i++) {\n const current = points[i];\n const next = points[i + 1];\n const controlPointX = (current.x + next.x) / 2;\n topPath += ` C ${controlPointX} ${current.y}, ${controlPointX} ${next.y}, ${next.x} ${next.y}`;\n }\n\n // Bottom line (reverse, baseline)\n let bottomPath = '';\n for (let i = points.length - 1; i >= 0; i--) {\n const point = points[i];\n if (i === points.length - 1) {\n bottomPath += ` L ${point.x} ${point.baseY}`;\n } else {\n const next = points[i + 1];\n const controlPointX = (point.x + next.x) / 2;\n bottomPath += ` C ${controlPointX} ${next.baseY}, ${controlPointX} ${point.baseY}, ${point.x} ${point.baseY}`;\n }\n }\n\n return topPath + bottomPath + ' Z';\n } else {\n // Straight lines\n const topPath = points.map((p, i) => `${i === 0 ? 'M' : 'L'} ${p.x} ${p.y}`).join(' ');\n const bottomPath = points\n .slice()\n .reverse()\n .map(p => `L ${p.x} ${p.baseY}`)\n .join(' ');\n return topPath + ' ' + bottomPath + ' Z';\n }\n };\n\n // Generate path for line (stroke)\n const generateLinePath = (series: AreaChartSeries, baselineYValues?: number[]) => {\n if (series.data.length === 0) return '';\n\n const points = series.data.map((point, i) => {\n const x = scaleX(point.x, i);\n const y = baselineYValues\n ? scaleY(baselineYValues[i] + point.y)\n : scaleY(point.y);\n return { x, y };\n });\n\n if (curved) {\n let path = `M ${points[0].x} ${points[0].y}`;\n for (let i = 0; i < points.length - 1; i++) {\n const current = points[i];\n const next = points[i + 1];\n const controlPointX = (current.x + next.x) / 2;\n path += ` C ${controlPointX} ${current.y}, ${controlPointX} ${next.y}, ${next.x} ${next.y}`;\n }\n return path;\n } else {\n return points.map((p, i) => `${i === 0 ? 'M' : 'L'} ${p.x} ${p.y}`).join(' ');\n }\n };\n\n // Generate grid lines\n const gridLines = [];\n const numGridLines = 5;\n\n if (showGrid) {\n // Horizontal grid lines\n for (let i = 0; i <= numGridLines; i++) {\n const y = (chartHeight / numGridLines) * i;\n const yValue = yMax - ((yMax - yMin) / numGridLines) * i;\n gridLines.push(\n <g key={`grid-h-${i}`}>\n <line\n x1={0}\n y1={y}\n x2={chartWidth}\n y2={y}\n stroke=\"currentColor\"\n strokeWidth=\"0.5\"\n className=\"text-gray-200 dark:text-gray-700\"\n strokeDasharray=\"4,4\"\n />\n {showYAxis && (\n <text\n x={-25}\n y={y}\n textAnchor=\"end\"\n dominantBaseline=\"middle\"\n fontSize={gridLabelFontSize}\n className={`fill-gray-600 dark:fill-gray-400 ${gridLabelClass}`}\n >\n {yValue.toFixed(1)}\n </text>\n )}\n </g>\n );\n }\n\n // Vertical grid lines\n const numXGridLines = Math.min(allPoints.length, 6);\n for (let i = 0; i < numXGridLines; i++) {\n const x = (chartWidth / (numXGridLines - 1)) * i;\n const xValue = data[0]?.data[Math.floor((data[0].data.length - 1) * (i / (numXGridLines - 1)))]?.x || '';\n gridLines.push(\n <g key={`grid-v-${i}`}>\n <line\n x1={x}\n y1={0}\n x2={x}\n y2={chartHeight}\n stroke=\"currentColor\"\n strokeWidth=\"0.5\"\n className=\"text-gray-200 dark:text-gray-700\"\n strokeDasharray=\"4,4\"\n />\n {showXAxis && (\n <text\n x={x}\n y={chartHeight + 35}\n textAnchor=\"middle\"\n dominantBaseline=\"hanging\"\n fontSize={gridLabelFontSize}\n className={`fill-gray-600 dark:fill-gray-400 ${gridLabelClass}`}\n >\n {xValue}\n </text>\n )}\n </g>\n );\n }\n }\n\n // Calculate baseline values for stacked mode\n let cumulativeValues: number[] = [];\n if (stacked) {\n cumulativeValues = Array(data[0]?.data.length || 0).fill(0);\n }\n\n // Calculate tooltip position with boundary detection\n const getTooltipPosition = React.useCallback((x: number, y: number) => {\n if (!containerRef.current) return { x, y };\n\n const rect = containerRef.current.getBoundingClientRect();\n const tooltipWidth = 120;\n const tooltipHeight = 80;\n\n let tooltipX = x + 10;\n let tooltipY = y - 30;\n\n // Check right boundary\n if (tooltipX + tooltipWidth > rect.width) {\n tooltipX = x - tooltipWidth - 10;\n }\n\n // Check bottom boundary\n if (tooltipY + tooltipHeight > rect.height) {\n tooltipY = y + 30;\n }\n\n return { x: tooltipX, y: tooltipY };\n }, []);\n\n const containerStyle: React.CSSProperties = {\n '--font-size-base': `${baseFontSize}px`,\n '--font-size-lg': `calc(var(--font-size-base) * 1.125)`,\n '--font-size-sm': `calc(var(--font-size-base) * 0.875)`,\n '--font-size-xs': `calc(var(--font-size-base) * 0.75)`,\n } as React.CSSProperties;\n\n return (\n <div\n ref={containerRef}\n className={`relative flex flex-col gap-4 ${responsive ? 'w-full' : 'inline-block'} ${className}`}\n style={containerStyle}\n >\n <style>{`\n /* Mobile: Large fonts, hidden axis titles, thicker lines (default) */\n .${gridLabelClass} { font-size: ${gridLabelFontSize}px !important; }\n .${axisLabelClass} { display: none; }\n .${lineClass} { stroke-width: ${strokeWidth * 2.5} !important; }\n .${pointClass} { r: 6 !important; stroke-width: 3 !important; }\n\n /* Tablet: Medium fonts, show axis titles, medium lines */\n @media (min-width: 640px) {\n .${gridLabelClass} { font-size: ${gridLabelFontSize * 0.7}px !important; }\n .${axisLabelClass} {\n font-size: ${axisLabelFontSize * 0.7}px !important;\n display: block;\n }\n .${lineClass} { stroke-width: ${strokeWidth * 1.5} !important; }\n .${pointClass} { r: 4 !important; stroke-width: 2 !important; }\n }\n\n /* Desktop: Small fonts, show axis titles, normal lines */\n @media (min-width: 1024px) {\n .${gridLabelClass} { font-size: ${gridLabelFontSize * 0.4}px !important; }\n .${axisLabelClass} {\n font-size: ${axisLabelFontSize * 0.4}px !important;\n display: block;\n }\n .${lineClass} { stroke-width: ${strokeWidth} !important; }\n .${pointClass} { r: 3 !important; stroke-width: 1.5 !important; }\n }\n `}</style>\n <svg\n ref={svgRef}\n width=\"100%\"\n viewBox={`0 0 ${viewBoxWidth} ${viewBoxHeight}`}\n preserveAspectRatio=\"xMidYMid meet\"\n className=\"bg-white dark:bg-gray-800 block w-full\"\n style={{ height: 'auto', overflow: 'visible' }}\n >\n <g transform={`translate(${padding.left}, ${padding.top})`}>\n {/* Grid lines */}\n {gridLines}\n\n {/* Areas */}\n {data.map((series, seriesIndex) => {\n const baselineYValues = stacked ? [...cumulativeValues] : undefined;\n const areaPath = generateAreaPath(series, baselineYValues);\n const linePath = generateLinePath(series, baselineYValues);\n\n // Update cumulative values for next series\n if (stacked) {\n series.data.forEach((point, i) => {\n cumulativeValues[i] += point.y;\n });\n }\n\n return (\n <g key={`area-${seriesIndex}`}>\n {/* Filled area */}\n <path\n d={areaPath}\n fill={series.color || defaultColors[seriesIndex % defaultColors.length]}\n opacity={fillOpacity}\n />\n {/* Stroke line */}\n <path\n d={linePath}\n fill=\"none\"\n stroke={series.color || defaultColors[seriesIndex % defaultColors.length]}\n strokeWidth={strokeWidth}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={lineClass}\n />\n </g>\n );\n })}\n\n {/* Data points */}\n {showDots && data.map((series, seriesIndex) => {\n const baselineYValues = stacked\n ? data.slice(0, seriesIndex).reduce((acc, s) => {\n return acc.map((val, i) => val + (s.data[i]?.y || 0));\n }, Array(series.data.length).fill(0))\n : undefined;\n\n return series.data.map((point, pointIndex) => {\n const x = scaleX(point.x, pointIndex);\n const y = baselineYValues\n ? scaleY(baselineYValues[pointIndex] + point.y)\n : scaleY(point.y);\n const isHovered =\n hoveredPoint?.seriesIndex === seriesIndex &&\n hoveredPoint?.pointIndex === pointIndex;\n\n return (\n <circle\n key={`point-${seriesIndex}-${pointIndex}`}\n cx={x}\n cy={y}\n r={isHovered ? 6 : 4}\n fill={series.color || defaultColors[seriesIndex % defaultColors.length]}\n stroke=\"white\"\n strokeWidth=\"2\"\n className={`cursor-pointer transition-all ${pointClass}`}\n onMouseEnter={(e) => {\n if (showTooltip && containerRef.current) {\n setHoveredPoint({ seriesIndex, pointIndex, x, y });\n\n // Use mouse event coordinates relative to the container\n const containerRect = containerRef.current.getBoundingClientRect();\n const mouseX = e.clientX - containerRect.left;\n const mouseY = e.clientY - containerRect.top;\n\n setTooltipPosition(getTooltipPosition(mouseX, mouseY));\n }\n }}\n onMouseMove={(e) => {\n if (showTooltip && hoveredPoint?.seriesIndex === seriesIndex && hoveredPoint?.pointIndex === pointIndex && containerRef.current) {\n // Update tooltip position as mouse moves\n const containerRect = containerRef.current.getBoundingClientRect();\n const mouseX = e.clientX - containerRect.left;\n const mouseY = e.clientY - containerRect.top;\n\n setTooltipPosition(getTooltipPosition(mouseX, mouseY));\n }\n }}\n onMouseLeave={() => {\n setHoveredPoint(null);\n setTooltipPosition(null);\n }}\n />\n );\n });\n })}\n\n {/* Axis labels */}\n {xAxisLabel && showXAxis && (\n <text\n x={chartWidth / 2}\n y={chartHeight + 80}\n textAnchor=\"middle\"\n dominantBaseline=\"hanging\"\n fontSize={axisLabelFontSize}\n fontWeight=\"600\"\n className={`fill-gray-700 dark:fill-gray-300 ${axisLabelClass}`}\n >\n {xAxisLabel}\n </text>\n )}\n {yAxisLabel && showYAxis && (\n <text\n x={-chartHeight / 2}\n y={-100}\n textAnchor=\"middle\"\n dominantBaseline=\"middle\"\n fontSize={axisLabelFontSize}\n fontWeight=\"600\"\n transform=\"rotate(-90)\"\n className={`fill-gray-700 dark:fill-gray-300 ${axisLabelClass}`}\n >\n {yAxisLabel}\n </text>\n )}\n </g>\n </svg>\n\n {/* Legend */}\n {showLegend && (\n <div className=\"flex flex-wrap gap-3 justify-center px-4\">\n {data.map((series, index) => (\n <div key={`legend-${index}`} className=\"flex items-center gap-2 text-sm\">\n <div\n className=\"w-3 h-3 rounded-sm flex-shrink-0\"\n style={{\n backgroundColor: series.color || defaultColors[index % defaultColors.length],\n }}\n />\n <span className=\"text-gray-700 dark:text-gray-300\">\n {series.name}\n </span>\n </div>\n ))}\n </div>\n )}\n\n {/* Tooltip */}\n {showTooltip && hoveredPoint && tooltipPosition && (\n <div\n className=\"absolute bg-gray-900 dark:bg-gray-700 text-white px-3 py-2 rounded shadow-lg pointer-events-none z-50 text-sm whitespace-nowrap\"\n style={{\n left: `${tooltipPosition.x}px`,\n top: `${tooltipPosition.y}px`,\n transform: 'translateZ(0)',\n }}\n >\n <div className=\"font-semibold\">\n {data[hoveredPoint.seriesIndex].name}\n </div>\n <div className=\"text-xs opacity-90\">\n x: {data[hoveredPoint.seriesIndex].data[hoveredPoint.pointIndex].x}\n </div>\n <div className=\"text-xs opacity-90\">\n y: {data[hoveredPoint.seriesIndex].data[hoveredPoint.pointIndex].y}\n </div>\n </div>\n )}\n </div>\n );\n};\n","\"use client\";\n\nimport React from 'react';\n\nexport interface PieChartDataPoint {\n label: string;\n value: number;\n color?: string;\n}\n\nexport interface PieChartProps {\n data: PieChartDataPoint[];\n width?: number;\n height?: number;\n aspectRatio?: number;\n responsive?: boolean;\n showLegend?: boolean;\n showLabels?: boolean;\n showValues?: boolean;\n showPercentages?: boolean;\n donut?: boolean;\n donutWidth?: number;\n className?: string;\n baseFontSize?: number;\n}\n\nconst defaultColors = [\n '#3b82f6', // blue-500\n '#10b981', // green-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];\n\nexport const PieChart: React.FC<PieChartProps> = ({\n data,\n width: providedWidth,\n height: providedHeight,\n aspectRatio = 1,\n responsive = true,\n showLegend = true,\n showLabels = true,\n showValues = false,\n showPercentages = false,\n donut = false,\n donutWidth = 60,\n className = '',\n baseFontSize = 14,\n}) => {\n // SVG viewBox dimensions (fixed for proper scaling)\n const viewBoxWidth = 600;\n const viewBoxHeight = 600;\n\n const containerRef = React.useRef<HTMLDivElement>(null);\n const [tooltipPosition, setTooltipPosition] = React.useState<{ x: number; y: number } | null>(null);\n const [hoveredSlice, setHoveredSlice] = React.useState<number | null>(null);\n\n // Generate unique class names for this chart instance\n const chartId = React.useId();\n const wrapperClass = `chart-svg-wrapper-${chartId.replace(/:/g, '-')}`;\n const gridLabelClass = `chart-grid-label-${chartId.replace(/:/g, '-')}`;\n const axisLabelClass = `chart-axis-label-${chartId.replace(/:/g, '-')}`;\n const sliceClass = `chart-slice-${chartId.replace(/:/g, '-')}`;\n\n // Calculate total\n const total = data.reduce((sum, item) => sum + item.value, 0);\n\n // Chart dimensions\n const centerX = viewBoxWidth / 2;\n const centerY = viewBoxHeight / 2;\n const radius = Math.min(viewBoxWidth, viewBoxHeight) / 2 - 40; // Padding for labels\n const innerRadius = donut ? radius - donutWidth : 0;\n\n // Font sizes as percentage of viewBox width - will be overridden by CSS media queries\n // Mobile gets larger percentages, desktop gets smaller ones\n const gridLabelFontSize = viewBoxWidth * 0.045; // 4.5% = 27px (mobile default)\n const axisLabelFontSize = viewBoxWidth * 0.05; // 5% = 30px (mobile default)\n const titleFontSize = viewBoxWidth * 0.055; // 5.5% = 33px (mobile default)\n\n // Generate pie slices\n let currentAngle = -90; // Start from top\n\n const slices = data.map((item, index) => {\n const percentage = (item.value / total) * 100;\n const angle = (item.value / total) * 360;\n const startAngle = currentAngle;\n const endAngle = currentAngle + angle;\n\n // Calculate path (round to avoid hydration errors)\n const startRad = (startAngle * Math.PI) / 180;\n const endRad = (endAngle * Math.PI) / 180;\n\n const x1 = Math.round((centerX + radius * Math.cos(startRad)) * 100) / 100;\n const y1 = Math.round((centerY + radius * Math.sin(startRad)) * 100) / 100;\n const x2 = Math.round((centerX + radius * Math.cos(endRad)) * 100) / 100;\n const y2 = Math.round((centerY + radius * Math.sin(endRad)) * 100) / 100;\n\n const largeArc = angle > 180 ? 1 : 0;\n\n let path: string;\n if (donut) {\n // Donut slice (round to avoid hydration errors)\n const ix1 = Math.round((centerX + innerRadius * Math.cos(startRad)) * 100) / 100;\n const iy1 = Math.round((centerY + innerRadius * Math.sin(startRad)) * 100) / 100;\n const ix2 = Math.round((centerX + innerRadius * Math.cos(endRad)) * 100) / 100;\n const iy2 = Math.round((centerY + innerRadius * Math.sin(endRad)) * 100) / 100;\n\n path = [\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 } else {\n // Regular pie slice\n path = [\n `M ${centerX} ${centerY}`,\n `L ${x1} ${y1}`,\n `A ${radius} ${radius} 0 ${largeArc} 1 ${x2} ${y2}`,\n 'Z',\n ].join(' ');\n }\n\n // Label position (middle of slice, round to avoid hydration errors)\n const labelAngle = startAngle + angle / 2;\n const labelRad = (labelAngle * Math.PI) / 180;\n const labelRadius = donut ? innerRadius + (radius - innerRadius) / 2 : radius * 0.7;\n const labelX = Math.round((centerX + labelRadius * Math.cos(labelRad)) * 100) / 100;\n const labelY = Math.round((centerY + labelRadius * Math.sin(labelRad)) * 100) / 100;\n\n currentAngle = endAngle;\n\n return {\n path,\n color: item.color || defaultColors[index % defaultColors.length],\n label: item.label,\n value: item.value,\n percentage,\n labelX,\n labelY,\n index,\n };\n });\n\n // Calculate tooltip position with boundary detection\n const getTooltipPosition = React.useCallback((x: number, y: number) => {\n if (!containerRef.current) return { x, y };\n\n const rect = containerRef.current.getBoundingClientRect();\n const tooltipWidth = 120;\n const tooltipHeight = 80;\n\n let tooltipX = x + 10;\n let tooltipY = y - 30;\n\n // Check right boundary\n if (tooltipX + tooltipWidth > rect.width) {\n tooltipX = x - tooltipWidth - 10;\n }\n\n // Check bottom boundary\n if (tooltipY + tooltipHeight > rect.height) {\n tooltipY = y + 30;\n }\n\n return { x: tooltipX, y: tooltipY };\n }, []);\n\n const containerStyle: React.CSSProperties = {\n '--font-size-base': `${baseFontSize}px`,\n '--font-size-lg': `calc(var(--font-size-base) * 1.125)`,\n '--font-size-sm': `calc(var(--font-size-base) * 0.875)`,\n '--font-size-xs': `calc(var(--font-size-base) * 0.75)`,\n '--font-size-xl': `calc(var(--font-size-base) * 1.5)`,\n '--font-size-2xl': `calc(var(--font-size-base) * 2)`,\n };\n\n if (responsive) {\n containerStyle['--font-size-base'] = `clamp(${baseFontSize * 0.8}px, 4vw, ${baseFontSize}px)`;\n }\n\n return (\n <div\n ref={containerRef}\n className={`relative flex flex-col gap-4 ${responsive ? 'w-full' : 'inline-block'} ${className}`}\n style={containerStyle}\n >\n <style>{`\n /* Mobile: Large fonts (default) */\n .${gridLabelClass} { font-size: ${gridLabelFontSize}px !important; }\n .${axisLabelClass} { font-size: ${titleFontSize}px !important; }\n\n /* Tablet: Medium fonts */\n @media (min-width: 640px) {\n .${gridLabelClass} { font-size: ${gridLabelFontSize * 0.7}px !important; }\n .${axisLabelClass} { font-size: ${titleFontSize * 0.7}px !important; }\n }\n\n /* Desktop: Small fonts */\n @media (min-width: 1024px) {\n .${gridLabelClass} { font-size: ${gridLabelFontSize * 0.4}px !important; }\n .${axisLabelClass} { font-size: ${titleFontSize * 0.4}px !important; }\n }\n `}</style>\n <svg\n width=\"100%\"\n viewBox={`0 0 ${viewBoxWidth} ${viewBoxHeight}`}\n preserveAspectRatio=\"xMidYMid meet\"\n className=\"bg-white dark:bg-gray-800 block w-full\"\n style={{ height: 'auto', overflow: 'visible' }}\n >\n {/* Slices */}\n {slices.map((slice) => {\n const isHovered = hoveredSlice === slice.index;\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-opacity\"\n opacity={isHovered ? 0.8 : 1}\n onMouseEnter={(e) => {\n setHoveredSlice(slice.index);\n if (containerRef.current) {\n const rect = containerRef.current.getBoundingClientRect();\n const svgX = (e.clientX - rect.left);\n const svgY = (e.clientY - rect.top);\n setTooltipPosition(getTooltipPosition(svgX, svgY));\n }\n }}\n onMouseLeave={() => {\n setHoveredSlice(null);\n setTooltipPosition(null);\n }}\n />\n {/* Labels */}\n {showLabels && slice.percentage > 5 && (\n <text\n x={slice.labelX}\n y={slice.labelY}\n textAnchor=\"middle\"\n dominantBaseline=\"middle\"\n fontSize={gridLabelFontSize}\n fontWeight=\"600\"\n className={`fill-gray-700 dark:fill-gray-200 pointer-events-none ${gridLabelClass}`}\n >\n {showPercentages && `${slice.percentage.toFixed(1)}%`}\n {showPercentages && showValues && ' '}\n {showValues && `(${slice.value})`}\n {!showPercentages && !showValues && slice.label}\n </text>\n )}\n </g>\n );\n })}\n\n {/* Center label for donut */}\n {donut && (\n <g>\n <text\n x={centerX}\n y={centerY - 10}\n textAnchor=\"middle\"\n dominantBaseline=\"middle\"\n fontSize={titleFontSize}\n fontWeight=\"700\"\n className={`fill-gray-900 dark:fill-gray-100 ${axisLabelClass}`}\n >\n {total}\n </text>\n <text\n x={centerX}\n y={centerY + 15}\n textAnchor=\"middle\"\n dominantBaseline=\"middle\"\n fontSize={axisLabelFontSize}\n className={`fill-gray-600 dark:fill-gray-400 ${gridLabelClass}`}\n >\n Total\n </text>\n </g>\n )}\n </svg>\n\n {/* Legend */}\n {showLegend && (\n <div className=\"flex flex-wrap gap-3 justify-center px-4\">\n {data.map((item, index) => (\n <div\n key={`legend-${index}`}\n className=\"flex items-center gap-2 text-sm cursor-pointer\"\n onMouseEnter={() => setHoveredSlice(index)}\n onMouseLeave={() => setHoveredSlice(null)}\n >\n <div\n className=\"w-3 h-3 rounded-sm flex-shrink-0\"\n style={{\n backgroundColor: item.color || defaultColors[index % defaultColors.length],\n }}\n />\n <span className=\"text-gray-700 dark:text-gray-300\">\n {item.label}: {item.value}\n {showPercentages && ` (${((item.value / total) * 100).toFixed(1)}%)`}\n </span>\n </div>\n ))}\n </div>\n )}\n\n {/* Tooltip */}\n {hoveredSlice !== null && tooltipPosition && (\n <div\n className=\"absolute bg-gray-900 dark:bg-gray-700 text-white px-3 py-2 rounded shadow-lg pointer-events-none z-50 text-sm whitespace-nowrap\"\n style={{\n left: `${tooltipPosition.x}px`,\n top: `${tooltipPosition.y}px`,\n transform: 'translateZ(0)',\n }}\n >\n <div className=\"font-semibold\">{data[hoveredSlice].label}</div>\n <div className=\"text-xs opacity-90\">Value: {data[hoveredSlice].value}</div>\n <div className=\"text-xs opacity-90\">\n Percentage: {((data[hoveredSlice].value / total) * 100).toFixed(1)}%\n </div>\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","useEffect","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","useEffect","jsx","jsxs","sizeClasses","useState","useRef","jsx","jsxs","sizeClasses","useRef","useState","useState","useRef","useEffect","Fragment","jsx","jsxs","useState","useRef","useEffect","jsx","jsx","jsxs","forwardRef","jsx","jsxs","forwardRef","forwardRef","jsx","jsxs","forwardRef","jsx","variantStyles","jsx","sizeClasses","useState","jsx","jsxs","useState","Fragment","jsx","jsxs","jsx","jsxs","useState","useRef","useEffect","createPortal","jsx","jsxs","useState","useRef","useEffect","createPortal","forwardRef","jsx","jsxs","forwardRef","useState","useRef","useEffect","createPortal","jsx","jsxs","DAYS","MONTHS","useState","useRef","useEffect","createPortal","useState","jsx","jsxs","DAYS","MONTHS","useState","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","jsx","jsxs","React","jsx","jsxs","defaultColors","React","jsx","jsxs","defaultColors","React","jsx","jsxs","defaultColors"]}
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/components/LineChart.tsx","../src/components/BarChart.tsx","../src/components/AreaChart.tsx","../src/components/PieChart.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}\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-semibold rounded-lg transition-all duration-150 focus:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 active:scale-95 gap-2',\n variants: {\n primary: 'bg-blue-600 hover:bg-blue-700 active:bg-blue-800 text-white shadow-sm hover:shadow-md dark:bg-blue-500 dark:hover:bg-blue-600 dark:active:bg-blue-700',\n secondary: 'bg-gray-600 hover:bg-gray-700 active:bg-gray-800 text-white shadow-sm hover:shadow-md dark:bg-gray-500 dark:hover:bg-gray-600 dark:active:bg-gray-700',\n success: 'bg-green-600 hover:bg-green-700 active:bg-green-800 text-white shadow-sm hover:shadow-md dark:bg-green-500 dark:hover:bg-green-600 dark:active:bg-green-700',\n danger: 'bg-red-600 hover:bg-red-700 active:bg-red-800 text-white shadow-sm hover:shadow-md dark:bg-red-500 dark:hover:bg-red-600 dark:active:bg-red-700',\n warning: 'bg-yellow-500 hover:bg-yellow-600 active:bg-yellow-700 text-white shadow-sm hover:shadow-md dark:bg-yellow-400 dark:hover:bg-yellow-500 dark:active:bg-yellow-600',\n info: 'bg-cyan-600 hover:bg-cyan-700 active:bg-cyan-800 text-white shadow-sm hover:shadow-md dark:bg-cyan-500 dark:hover:bg-cyan-600 dark:active:bg-cyan-700',\n },\n sizes: {\n sm: 'px-3 py-1.5 text-sm min-h-[30px]',\n md: 'px-4 py-2 text-base min-h-[38px]',\n lg: 'px-6 py-3 text-lg min-h-[48px]',\n xl: 'px-8 py-4 text-xl min-h-[60px]',\n },\n disabled: 'opacity-50 cursor-not-allowed hover:shadow-sm active:scale-100',\n },\n select: {\n base: 'w-full appearance-none rounded-lg border border-gray-300 bg-white text-gray-900 text-left transition-all duration-150 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent shadow-sm hover:border-gray-400 pr-10 cursor-pointer dark:bg-gray-800 dark:border-gray-600 dark:text-gray-100 dark:hover:border-gray-500',\n sizes: {\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 xl: 'px-5 py-4 text-xl',\n },\n disabled: 'opacity-50 cursor-not-allowed bg-gray-50 dark:bg-gray-900',\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 },\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';\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-red-500 focus:ring-red-500 dark:border-red-500' : '';\n\n const buttonClasses = `${baseStyles} ${sizeStyles} ${disabledStyles} ${errorStyles}`.trim();\n\n // Icon color based on theme\n const iconColor = themeName === 'minimalistic'\n ? (disabled ? 'text-gray-600' : 'text-white')\n : (disabled ? 'text-gray-400' : 'text-gray-500');\n\n // Dropdown menu styles based on theme\n const dropdownBaseStyles = themeName === 'minimalistic'\n ? 'bg-black border-2 border-white'\n : 'bg-white border border-gray-300 shadow-lg dark:bg-gray-800 dark:border-gray-600';\n\n const optionBaseStyles = themeName === 'minimalistic'\n ? 'text-white hover:bg-white hover:text-black transition-colors duration-200'\n : 'text-gray-900 hover:bg-blue-50 transition-colors duration-150 dark:text-gray-100 dark:hover:bg-gray-700';\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-gray-700 dark:text-gray-300 mb-1\">\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-lg overflow-hidden`}\n >\n {/* Search input */}\n {searchable && (\n <div className={`sticky top-0 ${themeName === 'minimalistic' ? 'bg-black border-b-2 border-white' : 'bg-white dark:bg-gray-800 border-b border-gray-200 dark:border-gray-700'}`}>\n <input\n ref={searchInputRef}\n type=\"text\"\n className={`w-full ${optionSizeStyles} ${themeName === 'minimalistic' ? 'bg-black text-white placeholder-gray-600 focus:outline-none' : 'bg-transparent text-gray-900 dark:text-gray-100 placeholder-gray-400 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-blue-50 dark:bg-gray-700') : ''\n }`}\n onClick={() => handleSelect(option.value)}\n >\n {option.label}\n </div>\n ))\n ) : (\n <div className={`${optionSizeStyles} ${themeName === 'minimalistic' ? 'text-gray-500' : 'text-gray-500 dark:text-gray-400'} text-center`}>\n No results found\n </div>\n )}\n </div>\n </div>\n )}\n </div>\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-gray-500 dark:text-gray-400\">{helperText}</p>\n )}\n </div>\n );\n};\n","\"use client\";\n\nimport React, { useEffect } from 'react';\nimport { useTheme } from '../theme/ThemeProvider';\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 const { theme } = useTheme();\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/60 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-white dark:bg-gray-800 rounded-lg 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-gray-200 dark:border-gray-700\">\n {title && (\n <h3 id=\"modal-title\" className=\"text-xl font-semibold text-gray-900 dark:text-gray-100\">\n {title}\n </h3>\n )}\n {showCloseButton && (\n <button\n onClick={onClose}\n className=\"ml-auto text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 transition-colors\"\n aria-label=\"Close modal\"\n >\n <svg className=\"w-6 h-6\" 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';\nimport { useTheme } from '../theme/ThemeProvider';\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 const { theme } = useTheme();\n\n const baseClasses = sticky ? 'sticky top-0 z-40' : '';\n\n const getVariantClasses = () => {\n switch (variant) {\n case 'glass':\n return 'bg-transparent backdrop-blur-xl';\n case 'transparent':\n return 'bg-transparent';\n case 'solid':\n default:\n return 'bg-white dark:bg-gray-800 border-b border-gray-200 dark:border-gray-700';\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';\nimport { useTheme } from '../theme/ThemeProvider';\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 { theme } = useTheme();\n const widthClass = widthClasses[width];\n const borderClass = position === 'left' ? 'border-r' : 'border-l';\n\n return (\n <aside\n className={`${widthClass} bg-white dark:bg-gray-800 ${borderClass} border-gray-200 dark:border-gray-700 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 { useTheme } from '../theme/ThemeProvider';\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-transparent backdrop-blur-xl';\n case 'transparent':\n return 'bg-transparent';\n case 'solid':\n default:\n return 'bg-white dark:bg-gray-800 border-b border-gray-200 dark:border-gray-700';\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 { theme } = useTheme();\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-white dark:bg-gray-800 border-r border-gray-200 dark:border-gray-700 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-gray-50 dark:bg-gray-900 ${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-gray-900 dark:text-gray-100\">\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-gray-100 dark:hover:bg-gray-700 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-white dark:bg-gray-800 shadow-2xl animate-in slide-in-from-left duration-300`}>\n <div className=\"p-4 border-b border-gray-200 dark:border-gray-700 flex items-center justify-between\">\n {navbarLogo ? (\n <div>{navbarLogo}</div>\n ) : navbarTitle ? (\n <span className=\"text-xl font-bold text-gray-900 dark:text-gray-100\">\n {navbarTitle}\n </span>\n ) : null}\n <button\n className=\"p-1 rounded hover:bg-gray-100 dark:hover:bg-gray-700 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-gray-50 dark:bg-gray-900 ${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-gray-900 dark:text-gray-100\">\n {navbarTitle}\n </span>\n ) : null}\n <button\n className=\"p-2 rounded-lg hover:bg-gray-100 dark:hover:bg-gray-700 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-transparent backdrop-blur-xl' : navbar.variant === 'transparent' ? 'bg-transparent' : 'bg-white dark:bg-gray-800 border-r border-gray-200 dark:border-gray-700'} 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-white dark:bg-gray-800 shadow-2xl animate-in slide-in-from-left duration-300`}>\n <div className=\"p-4 border-b border-gray-200 dark:border-gray-700 flex items-center justify-between\">\n {navbarLogo ? (\n <div>{navbarLogo}</div>\n ) : navbarTitle ? (\n <span className=\"text-xl font-bold text-gray-900 dark:text-gray-100\">\n {navbarTitle}\n </span>\n ) : null}\n <button\n className=\"p-1 rounded hover:bg-gray-100 dark:hover:bg-gray-700 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';\nimport { useTheme } from '../theme/ThemeProvider';\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 const { theme } = useTheme();\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/60 backdrop-blur-sm transition-all duration-200\"\n onClick={onClose}\n />\n\n {/* Drawer */}\n <div\n className={`fixed z-50 ${positionClass} ${sizeClass} bg-white dark:bg-gray-800 shadow-2xl overflow-hidden flex flex-col ${slideClasses[position]}`}\n >\n {/* Header */}\n {(title || showCloseButton) && (\n <div className=\"flex items-center justify-between p-6 border-b border-gray-200 dark:border-gray-700\">\n {title && (\n <h3 className=\"text-xl font-semibold text-gray-900 dark:text-gray-100\">\n {title}\n </h3>\n )}\n {showCloseButton && (\n <button\n onClick={onClose}\n className=\"ml-auto text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 transition-colors\"\n aria-label=\"Close drawer\"\n >\n <svg className=\"w-6 h-6\" 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 = theme.select?.base || 'w-full appearance-none rounded-lg border border-gray-300 bg-white text-gray-900 transition-all duration-150 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent shadow-sm hover:border-gray-400 dark:bg-gray-800 dark:border-gray-600 dark:text-gray-100 dark:hover:border-gray-500';\n const sizeStyle = sizeClasses[size];\n const errorStyles = error ? 'border-red-500 focus:ring-red-500 dark:border-red-500' : '';\n const disabledStyles = disabled ? 'opacity-50 cursor-not-allowed bg-gray-50 dark:bg-gray-900' : '';\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-gray-700 dark:text-gray-300 mb-1\">\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-gray-400 dark:text-gray-500\">\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-gray-400 dark:text-gray-500\">\n {rightIcon}\n </div>\n )}\n </div>\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-gray-500 dark:text-gray-400\">{helperText}</p>\n )}\n </div>\n );\n }\n);\n\nTextInput.displayName = 'TextInput';\n","\"use client\";\n\nimport React, { useState, useRef } from 'react';\nimport { useTheme } from '../theme/ThemeProvider';\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-4 py-2.5 text-base',\n lg: 'px-4 py-3 text-lg',\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 { theme } = useTheme();\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-lg border border-gray-300 bg-white text-gray-900 transition-all duration-150 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent shadow-sm hover:border-gray-400 dark:bg-gray-800 dark:border-gray-600 dark:text-gray-100 dark:hover:border-gray-500';\n const sizeStyle = sizeClasses[size];\n const errorStyles = error ? 'border-red-500 focus:ring-red-500 dark:border-red-500' : '';\n const disabledStyles = disabled ? 'opacity-50 cursor-not-allowed bg-gray-50 dark:bg-gray-900' : '';\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-gray-700 dark:text-gray-300 mb-1\">\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-gray-100 dark:hover:bg-gray-700 rounded transition-colors disabled:opacity-30 disabled:cursor-not-allowed\"\n tabIndex={-1}\n >\n <svg className=\"w-3 h-3 text-gray-600 dark:text-gray-400\" 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-gray-100 dark:hover:bg-gray-700 rounded transition-colors disabled:opacity-30 disabled:cursor-not-allowed\"\n tabIndex={-1}\n >\n <svg className=\"w-3 h-3 text-gray-600 dark:text-gray-400\" 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 text-sm text-red-600 dark:text-red-400\">{error}</p>\n )}\n {helperText && !error && (\n <p className=\"mt-1 text-sm text-gray-500 dark:text-gray-400\">{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-gray-100 dark:hover:bg-gray-700 transition-colors\"\n aria-label=\"Open menu\"\n >\n <svg className=\"w-5 h-5 text-gray-600 dark:text-gray-400\" 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-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 shadow-lg';\n\n const itemBaseStyles = themeName === 'minimalistic'\n ? 'text-white hover:bg-white hover:text-black transition-colors duration-200'\n : 'text-gray-700 dark:text-gray-200 hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors';\n\n const menu = isOpen && mounted && menuPosition ? (\n <div\n ref={menuRef}\n className={`fixed w-56 rounded-lg ${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-gray-200 dark:border-gray-700\"\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-3 flex items-center gap-3 ${itemBaseStyles} ${\n item.disabled ? 'opacity-50 cursor-not-allowed' : 'cursor-pointer'\n } ${\n item.variant === 'danger' ? 'text-red-600 dark:text-red-400 hover:bg-red-50 dark:hover:bg-red-900/20' : ''\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';\nimport { useTheme } from '../theme/ThemeProvider';\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 const { theme } = useTheme();\n\n const paddingClass = paddingClasses[padding];\n const hoverClass = hover\n ? 'hover:shadow-xl hover:scale-[1.02] hover:border-blue-400 dark:hover:border-blue-500 cursor-pointer transition-all duration-200 ease-in-out'\n : '';\n\n return (\n <div\n className={`bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 ${paddingClass} ${hoverClass} ${className}`}\n {...props}\n >\n {children}\n </div>\n );\n};\n","\"use client\";\n\nimport React from 'react';\nimport { useTheme } from '../theme/ThemeProvider';\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-blue-50 dark:bg-blue-900/20 border-blue-200 dark:border-blue-800 text-blue-900 dark:text-blue-100',\n success: 'bg-green-50 dark:bg-green-900/20 border-green-200 dark:border-green-800 text-green-900 dark:text-green-100',\n warning: 'bg-yellow-50 dark:bg-yellow-900/20 border-yellow-200 dark:border-yellow-800 text-yellow-900 dark:text-yellow-100',\n error: 'bg-red-50 dark:bg-red-900/20 border-red-200 dark:border-red-800 text-red-900 dark:text-red-100',\n};\n\nconst iconStyles = {\n info: 'text-blue-600 dark:text-blue-400',\n success: 'text-green-600 dark:text-green-400',\n warning: 'text-yellow-600 dark:text-yellow-400',\n error: 'text-red-600 dark:text-red-400',\n};\n\nexport const Alert: React.FC<AlertProps> = ({\n variant = 'info',\n title,\n children,\n onClose,\n className = '',\n}) => {\n const { theme } = useTheme();\n\n const variantClass = variantStyles[variant];\n const iconClass = iconStyles[variant];\n\n return (\n <div className={`rounded-lg 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';\nimport { useTheme } from '../theme/ThemeProvider';\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 const { theme } = useTheme();\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 transition-all duration-200 flex items-center justify-center\n ${error\n ? 'border-red-500 dark:border-red-500'\n : 'border-gray-300 dark:border-gray-600'\n }\n ${disabled\n ? 'opacity-50 cursor-not-allowed bg-gray-100 dark:bg-gray-800'\n : 'peer-hover:border-gray-400 dark:peer-hover:border-gray-500'\n }\n peer-checked:bg-blue-600 peer-checked:border-blue-600\n peer-focus:ring-2 peer-focus:ring-blue-500 peer-focus:ring-offset-2\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-gray-700 dark:text-gray-300 ${disabled ? 'opacity-50 cursor-not-allowed' : 'group-hover:text-gray-900 dark:group-hover:text-gray-100'}`}>\n {label}\n </span>\n )}\n </label>\n {error && <p className=\"mt-1 text-sm text-red-600 dark:text-red-400\">{error}</p>}\n </div>\n );\n }\n);\n\nCheckbox.displayName = 'Checkbox';\n","\"use client\";\n\nimport React, { forwardRef } from 'react';\nimport { useTheme } from '../theme/ThemeProvider';\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 const { theme } = useTheme();\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-gray-300 dark:bg-gray-700 peer-focus:ring-2 peer-focus:ring-blue-500 rounded-full peer peer-checked:bg-blue-600 dark:peer-checked:bg-blue-500 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-gray-700 dark:text-gray-300\">\n {label}\n </span>\n )}\n </label>\n );\n }\n);\n\nToggle.displayName = 'Toggle';\n","\"use client\";\n\nimport React from 'react';\nimport { useTheme } from '../theme/ThemeProvider';\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-gray-100 dark:bg-gray-700 text-gray-800 dark:text-gray-200',\n primary: 'bg-blue-100 dark:bg-blue-900/30 text-blue-800 dark:text-blue-200',\n success: 'bg-green-100 dark:bg-green-900/30 text-green-800 dark:text-green-200',\n warning: 'bg-yellow-100 dark:bg-yellow-900/30 text-yellow-800 dark:text-yellow-200',\n error: 'bg-red-100 dark:bg-red-900/30 text-red-800 dark:text-red-200',\n info: 'bg-cyan-100 dark:bg-cyan-900/30 text-cyan-800 dark:text-cyan-200',\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 const { theme } = useTheme();\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';\nimport { useTheme } from '../theme/ThemeProvider';\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-blue-600 border-t-transparent',\n secondary: 'border-gray-600 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 const { theme } = useTheme();\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';\nimport { useTheme } from '../theme/ThemeProvider';\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 { theme } = useTheme();\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-gray-200 dark:border-gray-700\">\n <nav className=\"flex gap-8 px-6\" aria-label=\"Tabs\">\n {tabs.map((tab, index) => (\n <button\n key={index}\n onClick={() => handleTabClick(index)}\n disabled={tab.disabled}\n className={`py-4 px-1 border-b-2 font-medium text-sm transition-colors ${\n activeIndex === index\n ? 'border-blue-600 text-blue-600 dark:text-blue-400'\n : 'border-transparent text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-gray-200 hover:border-gray-300 dark:hover:border-gray-600'\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';\nimport { useTheme } from '../theme/ThemeProvider';\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 const { theme } = useTheme();\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-gray-50 dark:bg-gray-800 border-b border-gray-200 dark:border-gray-700\">\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-gray-700 dark:text-gray-300 uppercase tracking-wider relative'\n : 'px-6 py-3 text-xs font-medium text-gray-700 dark:text-gray-300 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-white dark:bg-gray-900 divide-y divide-gray-200 dark:divide-gray-700\">\n {data.map((row, rowIndex) => {\n const rowClasses = [\n striped && rowIndex % 2 === 1 ? 'bg-gray-50 dark:bg-gray-800/50' : '',\n hoverable ? 'hover:bg-gray-100 dark:hover:bg-gray-800 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-gray-900 dark:text-gray-100 overflow-visible'\n : 'px-6 py-4 text-sm text-gray-900 dark:text-gray-100'\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-gray-500 dark:text-gray-400\">\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-white dark:bg-gray-900 border border-gray-200 dark:border-gray-700 rounded-lg 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-gray-100 dark:border-gray-800 last:border-b-0\"\n >\n <span className=\"text-xs font-medium text-gray-500 dark:text-gray-400 uppercase tracking-wider flex-shrink-0 mr-4\">\n {column.title}\n </span>\n <span className=\"text-sm text-gray-900 dark:text-gray-100 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-gray-500 dark:text-gray-400\">\n No data available\n </div>\n )}\n </div>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport React from 'react';\nimport { useTheme } from '../theme/ThemeProvider';\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 const { theme } = useTheme();\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-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-800 disabled:opacity-50 disabled:cursor-not-allowed 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-gray-700 dark:text-gray-300\"\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-blue-600 text-white'\n : 'text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-800'\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-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-800 disabled:opacity-50 disabled:cursor-not-allowed 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';\nimport { useTheme } from '../theme/ThemeProvider';\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 { theme } = useTheme();\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-lg border border-gray-300 bg-white text-gray-900 px-4 py-2.5 text-base transition-all duration-150 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent shadow-sm hover:border-gray-400 dark:bg-gray-800 dark:border-gray-600 dark:text-gray-100 dark:hover:border-gray-500 cursor-pointer';\n const errorStyles = error ? 'border-red-500 focus:ring-red-500 dark:border-red-500' : '';\n const disabledStyles = disabled ? 'opacity-50 cursor-not-allowed bg-gray-50 dark:bg-gray-900' : '';\n\n const calendar = isOpen && mounted && calendarPosition ? (\n <div\n ref={calendarRef}\n className=\"fixed z-[9999] bg-white dark:bg-gray-800 rounded-lg border border-gray-200 dark:border-gray-700 shadow-xl 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-gray-100 dark:hover:bg-gray-700 rounded-lg transition-colors\"\n aria-label=\"Previous month\"\n >\n <svg className=\"w-5 h-5 text-gray-600 dark:text-gray-400\" 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-gray-900 dark:text-gray-100\">\n {MONTHS[month]} {year}\n </h2>\n <button\n onClick={handleToday}\n className=\"px-2 py-1 text-xs bg-blue-600 text-white rounded hover:bg-blue-700 transition-colors\"\n >\n Today\n </button>\n </div>\n\n <button\n onClick={handleNextMonth}\n className=\"p-2 hover:bg-gray-100 dark:hover:bg-gray-700 rounded-lg transition-colors\"\n aria-label=\"Next month\"\n >\n <svg className=\"w-5 h-5 text-gray-600 dark:text-gray-400\" 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-gray-600 dark:text-gray-400 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-lg text-sm font-medium transition-all\n ${!isCurrentMonthDay ? 'text-gray-400 dark:text-gray-600' : 'text-gray-900 dark:text-gray-100'}\n ${isTodayDay && !isSelectedDay ? 'bg-blue-50 dark:bg-blue-900/20 text-blue-600 dark:text-blue-400 font-bold' : ''}\n ${isSelectedDay ? 'bg-blue-600 text-white hover:bg-blue-700' : ''}\n ${!isSelectedDay && !isDisabledDay ? 'hover:bg-gray-100 dark:hover:bg-gray-700' : ''}\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-gray-700 dark:text-gray-300 mb-1\">\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-gray-500 dark:text-gray-400' : ''}>\n {value ? formatDate(value) : placeholder}\n </span>\n <svg className=\"w-5 h-5 text-gray-400\" 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 text-sm text-red-600 dark:text-red-400\">{error}</p>}\n {helperText && !error && <p className=\"mt-1 text-sm text-gray-500 dark:text-gray-400\">{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';\nimport { useTheme } from '../theme/ThemeProvider';\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 const { theme } = useTheme();\n\n const baseStyles = 'w-full appearance-none rounded-lg border border-gray-300 bg-white text-gray-900 px-4 py-2.5 text-base transition-all duration-150 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent shadow-sm hover:border-gray-400 dark:bg-gray-800 dark:border-gray-600 dark:text-gray-100 dark:hover:border-gray-500';\n const errorStyles = error ? 'border-red-500 focus:ring-red-500 dark:border-red-500' : '';\n const disabledStyles = disabled ? 'opacity-50 cursor-not-allowed bg-gray-50 dark:bg-gray-900' : '';\n\n return (\n <div className={className}>\n {label && (\n <label className=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1\">\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 text-sm text-red-600 dark:text-red-400\">{error}</p>}\n {helperText && !error && <p className=\"mt-1 text-sm text-gray-500 dark:text-gray-400\">{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';\nimport { useTheme } from '../theme/ThemeProvider';\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];\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 { theme } = useTheme();\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 const formatDateTime = (date?: Date) => {\n if (!date) return '';\n return date.toLocaleString('en-US', {\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n hour: 'numeric',\n minute: '2-digit',\n hour12: true\n });\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-lg border border-gray-300 bg-white text-gray-900 px-4 py-2.5 text-base transition-all duration-150 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent shadow-sm hover:border-gray-400 dark:bg-gray-800 dark:border-gray-600 dark:text-gray-100 dark:hover:border-gray-500 cursor-pointer';\n const errorStyles = error ? 'border-red-500 focus:ring-red-500 dark:border-red-500' : '';\n const disabledStyles = disabled ? 'opacity-50 cursor-not-allowed bg-gray-50 dark:bg-gray-900' : '';\n\n const picker = isOpen && mounted && pickerPosition ? (\n <div\n ref={pickerRef}\n className=\"fixed z-[9999] bg-white dark:bg-gray-800 rounded-lg border border-gray-200 dark:border-gray-700 shadow-xl 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-gray-100 dark:hover:bg-gray-700 rounded-lg transition-colors\"\n aria-label=\"Previous month\"\n >\n <svg className=\"w-5 h-5 text-gray-600 dark:text-gray-400\" 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-gray-900 dark:text-gray-100\">\n {MONTHS[month]} {year}\n </h2>\n <button\n onClick={handleToday}\n className=\"px-2 py-1 text-xs bg-blue-600 text-white rounded hover:bg-blue-700 transition-colors\"\n >\n Now\n </button>\n </div>\n\n <button\n onClick={handleNextMonth}\n className=\"p-2 hover:bg-gray-100 dark:hover:bg-gray-700 rounded-lg transition-colors\"\n aria-label=\"Next month\"\n >\n <svg className=\"w-5 h-5 text-gray-600 dark:text-gray-400\" 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-gray-600 dark:text-gray-400 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-lg text-sm font-medium transition-all\n ${!isCurrentMonthDay ? 'text-gray-400 dark:text-gray-600' : 'text-gray-900 dark:text-gray-100'}\n ${isTodayDay && !isSelectedDay ? 'bg-blue-50 dark:bg-blue-900/20 text-blue-600 dark:text-blue-400 font-bold' : ''}\n ${isSelectedDay ? 'bg-blue-600 text-white hover:bg-blue-700' : ''}\n ${!isSelectedDay && !isDisabledDay ? 'hover:bg-gray-100 dark:hover:bg-gray-700' : ''}\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-gray-200 dark:border-gray-700 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-gray-600 dark:text-gray-400 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-gray-100 dark:hover:bg-gray-700 rounded transition-colors\"\n >\n <svg className=\"w-4 h-4 text-gray-600 dark:text-gray-400\" 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-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-700 text-gray-900 dark:text-gray-100 focus:outline-none focus:ring-2 focus:ring-blue-500 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-gray-100 dark:hover:bg-gray-700 rounded transition-colors\"\n >\n <svg className=\"w-4 h-4 text-gray-600 dark:text-gray-400\" 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-gray-600 dark:text-gray-400 mt-8\">:</span>\n\n {/* Minutes */}\n <div className=\"flex flex-col items-center\">\n <label className=\"text-xs font-semibold text-gray-600 dark:text-gray-400 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-gray-100 dark:hover:bg-gray-700 rounded transition-colors\"\n >\n <svg className=\"w-4 h-4 text-gray-600 dark:text-gray-400\" 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-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-700 text-gray-900 dark:text-gray-100 focus:outline-none focus:ring-2 focus:ring-blue-500 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-gray-100 dark:hover:bg-gray-700 rounded transition-colors\"\n >\n <svg className=\"w-4 h-4 text-gray-600 dark:text-gray-400\" 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-gray-600 dark:text-gray-400 mb-4\">\n {formatTime(selectedTime.hours, selectedTime.minutes)}\n </div>\n <button\n onClick={handleDone}\n className=\"w-full px-4 py-2 bg-blue-600 text-white rounded-lg hover:bg-blue-700 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-gray-700 dark:text-gray-300 mb-1\">\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-gray-500 dark:text-gray-400' : ''}>\n {value ? formatDateTime(value) : placeholder}\n </span>\n <svg className=\"w-5 h-5 text-gray-400\" 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 text-sm text-red-600 dark:text-red-400\">{error}</p>}\n {helperText && !error && <p className=\"mt-1 text-sm text-gray-500 dark:text-gray-400\">{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';\nimport { useTheme } from '../theme/ThemeProvider';\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 { theme } = useTheme();\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-white dark:bg-gray-800 rounded-lg border border-gray-200 dark:border-gray-700 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-gray-100 dark:hover:bg-gray-700 rounded-lg transition-colors\"\n aria-label=\"Previous month\"\n >\n <svg className=\"w-5 h-5 text-gray-600 dark:text-gray-400\" 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-gray-900 dark:text-gray-100\">\n {MONTHS[month]} {year}\n </h2>\n <button\n onClick={handleToday}\n className=\"px-3 py-1 text-sm bg-blue-600 text-white rounded hover:bg-blue-700 transition-colors\"\n >\n Today\n </button>\n </div>\n\n <button\n onClick={handleNextMonth}\n className=\"p-2 hover:bg-gray-100 dark:hover:bg-gray-700 rounded-lg transition-colors\"\n aria-label=\"Next month\"\n >\n <svg className=\"w-5 h-5 text-gray-600 dark:text-gray-400\" 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-gray-600 dark:text-gray-400 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-lg text-sm font-medium transition-all\n ${!isCurrentMonthDay ? 'text-gray-400 dark:text-gray-600' : 'text-gray-900 dark:text-gray-100'}\n ${isTodayDay && !isSelectedDay ? 'bg-blue-50 dark:bg-blue-900/20 text-blue-600 dark:text-blue-400 font-bold' : ''}\n ${isSelectedDay ? 'bg-blue-600 text-white hover:bg-blue-700' : ''}\n ${!isSelectedDay && !isDisabledDay ? 'hover:bg-gray-100 dark:hover:bg-gray-700' : ''}\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-gray-300 dark:border-gray-600\n ${isDisabled\n ? 'bg-gray-100 dark:bg-gray-800'\n : 'peer-hover:border-gray-400 dark:peer-hover:border-gray-500'\n }\n ${isChecked\n ? 'border-blue-600 bg-white dark:bg-gray-900'\n : ''\n }\n peer-focus:ring-2 peer-focus:ring-blue-500 peer-focus:ring-offset-2\n `}>\n {/* Inner dot */}\n <div className={`w-2 h-2 rounded-full bg-blue-600 transition-all duration-200 ${\n isChecked ? 'scale-100' : 'scale-0'\n }`} />\n </div>\n </div>\n <span className={`text-sm font-medium text-gray-900 dark:text-gray-300 ${\n !isDisabled && 'group-hover:text-gray-700 dark:group-hover:text-gray-100'\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-blue-600 dark:bg-blue-500',\n success: 'bg-green-600 dark:bg-green-500',\n warning: 'bg-yellow-500 dark:bg-yellow-400',\n danger: 'bg-red-600 dark:bg-red-500',\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-gray-700 dark:text-gray-300\">\n {label}\n </span>\n )}\n {showLabel && (\n <span className=\"text-sm font-medium text-gray-700 dark:text-gray-300\">\n {Math.round(percentage)}%\n </span>\n )}\n </div>\n )}\n <div\n className={`w-full bg-gray-200 dark:bg-gray-700 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-gray-700 dark:text-gray-300\">\n {label}\n </label>\n )}\n {showValue && (\n <span className=\"text-sm font-medium text-gray-700 dark:text-gray-300\">\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-gray-200 dark:bg-gray-700 rounded-full\" />\n\n {/* Filled track between handles */}\n <div\n className=\"absolute h-2 bg-blue-600 dark:bg-blue-500 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-sm bg-white dark:bg-gray-800 border-2 border-blue-600 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-sm bg-white dark:bg-gray-800 border-2 border-blue-600 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-gray-700 dark:text-gray-300\">\n {label}\n </label>\n )}\n {showValue && (\n <span className=\"text-sm font-medium text-gray-700 dark:text-gray-300\">\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-gray-200 dark:bg-gray-700 rounded-full\" />\n\n {/* Filled track */}\n <div\n className=\"absolute h-2 bg-blue-600 dark:bg-blue-500 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-sm bg-white dark:bg-gray-800 border-2 border-blue-600 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-sm [&::-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-sm\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-blue-600',\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-gray-200 dark:bg-gray-700' : `${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-gray-400 dark:text-gray-600\"\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-4 py-2 text-base min-h-[100px]',\n lg: 'px-4 py-3 text-lg 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-lg border transition-colors duration-150 focus:outline-none focus:ring-2\n ${error\n ? 'border-red-500 focus:ring-red-500 focus:border-red-500 dark:border-red-400 dark:focus:ring-red-400'\n : 'border-gray-300 focus:ring-blue-500 focus:border-blue-500 dark:border-gray-600 dark:focus:ring-blue-400'\n }\n bg-white dark:bg-gray-800 text-gray-900 dark:text-gray-100\n placeholder:text-gray-500 dark:placeholder:text-gray-400\n disabled:opacity-50 disabled:cursor-not-allowed disabled:bg-gray-50 dark:disabled:bg-gray-900`;\n\n return (\n <div className={`w-full ${className}`}>\n {label && (\n <label className=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1\">\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 text-sm text-red-600 dark:text-red-400\">{error}</p>\n )}\n {helperText && !error && (\n <p className=\"mt-1 text-sm text-gray-500 dark:text-gray-400\">{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-gray-100 dark:bg-gray-700 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-gray-300 dark:border-gray-600 text-gray-700 dark:text-gray-300 transition-colors';\n\n const activeClass = themeName === 'minimalistic'\n ? 'bg-white text-black'\n : 'bg-blue-100 dark:bg-blue-900 border-blue-500 dark:border-blue-400';\n\n const hoverClass = themeName === 'minimalistic'\n ? 'hover:bg-white hover:text-black'\n : 'hover:bg-gray-100 dark:hover:bg-gray-700';\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-gray-500'\n : 'bg-white dark:bg-gray-800 border border-gray-300 dark:border-gray-600 text-gray-900 dark:text-gray-100';\n\n const focusClass = isFocused && !disabled\n ? themeName === 'minimalistic'\n ? 'border-white'\n : 'border-blue-500 dark:border-blue-400 ring-2 ring-blue-500/20'\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-gray-700 dark:text-gray-300 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-gray-300 dark:bg-gray-600 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-gray-300 dark:bg-gray-600 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-gray-300 dark:bg-gray-600 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-gray-500 dark:text-gray-400\">{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-green-50 dark:bg-green-900/30 border-green-500 text-green-800 dark:text-green-200',\n error: 'bg-red-50 dark:bg-red-900/30 border-red-500 text-red-800 dark:text-red-200',\n warning: 'bg-yellow-50 dark:bg-yellow-900/30 border-yellow-500 text-yellow-800 dark:text-yellow-200',\n info: 'bg-blue-50 dark:bg-blue-900/30 border-blue-500 text-blue-800 dark:text-blue-200',\n };\n\n const typeIcons = {\n success: <CheckIcon size=\"sm\" className=\"text-green-600 dark:text-green-400\" />,\n error: <CloseIcon size=\"sm\" className=\"text-red-600 dark:text-red-400\" />,\n warning: (\n <svg className=\"w-4 h-4 text-yellow-600 dark:text-yellow-400\" 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-blue-600 dark:text-blue-400\" 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-lg border-l-4 shadow-lg backdrop-blur-sm ${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\">{toast.message}</p>\n <button\n onClick={onClose}\n className=\"flex-shrink-0 text-gray-400 hover:text-gray-600 dark:hover:text-gray-200 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-gray-600 dark:text-gray-400\">\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-blue-600 border-blue-600 dark:bg-blue-500 dark:border-blue-500'\n : isActive\n ? 'border-blue-600 bg-white dark:border-blue-500 dark:bg-gray-800'\n : 'border-gray-300 bg-white dark:border-gray-600 dark:bg-gray-800'\n }`}\n >\n {isCompleted ? (\n <CheckIcon size=\"sm\" className=\"text-white\" />\n ) : (\n <span\n className={`text-sm font-semibold ${\n isActive\n ? 'text-blue-600 dark:text-blue-400'\n : 'text-gray-500 dark:text-gray-400'\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-blue-600 dark:bg-blue-500'\n : 'bg-gray-300 dark:bg-gray-600'\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-gray-900 dark:text-gray-100'\n : 'text-gray-500 dark:text-gray-400'\n }`}\n >\n {step.label}\n </p>\n {step.description && (\n <p className=\"text-xs text-gray-500 dark:text-gray-400 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-blue-600 dark:bg-blue-500'\n : 'bg-gray-300 dark:bg-gray-600'\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-gray-300 dark:border-gray-600`} />\n )}\n <span className=\"px-4 text-sm text-gray-500 dark:text-gray-400\">\n {label}\n </span>\n {labelPosition !== 'right' && (\n <div className={`flex-1 border-t ${variantClasses[variant]} border-gray-300 dark:border-gray-600`} />\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-gray-300 dark:border-gray-600 ${className}`}\n role=\"separator\"\n aria-orientation=\"vertical\"\n />\n );\n }\n\n return (\n <hr\n className={`border-t ${variantClasses[variant]} border-gray-300 dark:border-gray-600 ${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-gray-700 dark:text-gray-300 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-blue-500 bg-blue-50 dark:bg-blue-900/20'\n : 'border-gray-300 dark:border-gray-600 hover:border-gray-400 dark:hover:border-gray-500'\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-gray-100 dark:bg-gray-800 flex items-center justify-center\">\n <UploadIcon size=\"lg\" className=\"text-gray-400 dark:text-gray-500\" />\n </div>\n <div>\n <p className=\"text-sm font-medium text-gray-700 dark:text-gray-300\">\n <span className=\"text-blue-600 dark:text-blue-400\">Click to upload</span> or drag and drop\n </p>\n <p className=\"text-xs text-gray-500 dark:text-gray-400 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-gray-500 dark:text-gray-400\">{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-gray-50 dark:bg-gray-800 rounded-lg border border-gray-200 dark:border-gray-700\"\n >\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium text-gray-900 dark:text-gray-100 truncate\">\n {file.name}\n </p>\n <p className=\"text-xs text-gray-500 dark:text-gray-400\">\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-gray-400 hover:text-red-600 dark:hover:text-red-400 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-white dark:bg-gray-800 rounded-lg border border-gray-200 dark:border-gray-700 ${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-gray-700 dark:text-gray-300 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-white dark:bg-gray-800 rounded-lg border border-gray-200 dark:border-gray-700 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-gray-900 dark:text-gray-100 truncate\">\n {title}\n </div>\n )}\n {artist && (\n <div className=\"text-xs text-gray-500 dark:text-gray-400 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-gray-500 dark:text-gray-400 tabular-nums\">\n {formatTime(currentTime)}\n </span>\n <div className=\"relative flex-1 h-1.5 bg-gray-200 dark:bg-gray-700 rounded-full overflow-visible\">\n <div\n className=\"absolute h-full bg-blue-600 dark:bg-blue-500 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 dark:bg-gray-300 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-gray-500 dark:text-gray-400 tabular-nums\">\n {formatTime(duration)}\n </span>\n {currentChapter && showChapters && (\n <span className=\"text-xs text-blue-600 dark:text-blue-400 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-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-200\"\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-gray-200 dark:bg-gray-700 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-blue-600 [&::-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-blue-600 [&::-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-gray-900 dark:bg-gray-800 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-gray-300 text-[10px] mt-0.5\">{formatTime(hoveredChapter.startTime)}</div>\n <div className=\"absolute left-1/2 -bottom-1 w-2 h-2 bg-gray-900 dark:bg-gray-800 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-white dark:bg-gray-800 rounded-lg border border-gray-200 dark:border-gray-700 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-gray-200 dark:border-gray-700\">\n {coverArt && (\n <div className=\"w-16 h-16 flex-shrink-0 rounded-md overflow-hidden bg-gray-100 dark:bg-gray-700\">\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-gray-900 dark:text-gray-100 truncate\">\n {title}\n </h3>\n )}\n {artist && (\n <p className=\"text-sm text-gray-600 dark:text-gray-400 truncate\">\n {artist}\n </p>\n )}\n {album && (\n <p className=\"text-xs text-gray-500 dark:text-gray-500 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-gray-200 dark:bg-gray-700 rounded-full overflow-visible\">\n <div\n className=\"absolute h-full bg-blue-600 dark:bg-blue-500 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 dark:bg-gray-300 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-gray-900 dark:bg-gray-800 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-gray-300 text-[10px] mt-0.5\">{formatTime(hoveredChapter.startTime)}</div>\n <div className=\"absolute left-1/2 -bottom-1 w-2 h-2 bg-gray-900 dark:bg-gray-800 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-gray-500 dark:text-gray-400 tabular-nums\">\n <span>{formatTime(currentTime)}</span>\n {currentChapter && showChapters && (\n <span className=\"text-blue-600 dark:text-blue-400 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-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-200 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-gray-200 dark:bg-gray-700 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-blue-600 [&::-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-blue-600 [&::-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-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-gray-100 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-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-900/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-gray-100 dark:hover:bg-gray-800 transition-colors ${\n isCurrentChapter ? 'bg-blue-50 dark:bg-blue-900/20 border-l-2 border-blue-600' : ''\n }`}\n >\n <div className=\"flex items-center justify-between gap-2\">\n <span className={`text-sm font-medium ${\n isCurrentChapter ? 'text-blue-600 dark:text-blue-400' : 'text-gray-900 dark:text-gray-100'\n }`}>\n {chapter.title}\n </span>\n <span className=\"text-xs text-gray-500 dark:text-gray-400 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-blue-600 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-gray-200 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-gray-200 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-gray-900 dark:bg-gray-800 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-gray-300 text-[10px] mt-0.5\">{formatTime(hoveredChapter.startTime)}</div>\n <div className=\"absolute left-1/2 -bottom-1 w-2 h-2 bg-gray-900 dark:bg-gray-800 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-white dark:bg-gray-800 rounded-lg border border-gray-200 dark:border-gray-700 shadow-md overflow-hidden ${className}`}>\n {title && (\n <div className=\"px-4 py-3 border-b border-gray-200 dark:border-gray-700\">\n <h3 className=\"text-base font-semibold text-gray-900 dark:text-gray-100 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-blue-600 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-gray-200 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-gray-200 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-gray-900 dark:bg-gray-800 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-gray-300 text-[10px] mt-0.5\">{formatTime(hoveredChapter.startTime)}</div>\n <div className=\"absolute left-1/2 -bottom-1 w-2 h-2 bg-gray-900 dark:bg-gray-800 transform -translate-x-1/2 rotate-45\" />\n </div>\n )}\n </div>\n </div>\n );\n};\n","\"use client\";\n\nimport React from 'react';\n\nexport interface LineChartDataPoint {\n x: string | number;\n y: number;\n}\n\nexport interface LineChartSeries {\n name: string;\n data: LineChartDataPoint[];\n color?: string;\n}\n\nexport interface LineChartProps {\n data: LineChartSeries[];\n width?: number;\n height?: number;\n aspectRatio?: number;\n responsive?: boolean;\n showGrid?: boolean;\n showXAxis?: boolean;\n showYAxis?: boolean;\n showLegend?: boolean;\n showTooltip?: boolean;\n showDots?: boolean;\n curved?: boolean;\n strokeWidth?: number;\n className?: string;\n xAxisLabel?: string;\n yAxisLabel?: string;\n baseFontSize?: number;\n}\n\nconst defaultColors = [\n '#3b82f6', // blue-500\n '#10b981', // green-500\n '#f59e0b', // amber-500\n '#ef4444', // red-500\n '#8b5cf6', // violet-500\n '#ec4899', // pink-500\n];\n\nexport const LineChart: React.FC<LineChartProps> = ({\n data,\n width: providedWidth,\n height: providedHeight,\n aspectRatio = 16 / 9,\n responsive = true,\n showGrid = true,\n showXAxis = true,\n showYAxis = true,\n showLegend = true,\n showTooltip = true,\n showDots = true,\n curved = false,\n strokeWidth = 2,\n className = '',\n xAxisLabel,\n yAxisLabel,\n baseFontSize = 14,\n}) => {\n // SVG viewBox dimensions - fixed for consistency\n const viewBoxWidth = 1000;\n const viewBoxHeight = 600;\n\n const containerRef = React.useRef<HTMLDivElement>(null);\n const svgRef = React.useRef<SVGSVGElement>(null);\n const [tooltipPosition, setTooltipPosition] = React.useState<{ x: number; y: number } | null>(null);\n\n const [hoveredPoint, setHoveredPoint] = React.useState<{\n seriesIndex: number;\n pointIndex: number;\n x: number;\n y: number;\n } | null>(null);\n\n // Generate unique class names for this chart instance\n const chartId = React.useId();\n const wrapperClass = `chart-svg-wrapper-${chartId.replace(/:/g, '-')}`;\n const gridLabelClass = `chart-grid-label-${chartId.replace(/:/g, '-')}`;\n const axisLabelClass = `chart-axis-label-${chartId.replace(/:/g, '-')}`;\n const lineClass = `chart-line-${chartId.replace(/:/g, '-')}`;\n const pointClass = `chart-point-${chartId.replace(/:/g, '-')}`;\n\n // Responsive padding that scales with viewBox\n const padding = {\n top: 50,\n right: 50,\n bottom: showXAxis ? 120 : 50,\n left: showYAxis ? 130 : 50\n };\n const chartWidth = viewBoxWidth - padding.left - padding.right;\n const chartHeight = viewBoxHeight - padding.top - padding.bottom;\n\n // Font sizes as percentage of viewBox width - will be overridden by CSS media queries\n // Mobile gets larger percentages, desktop gets smaller ones\n const gridLabelFontSize = viewBoxWidth * 0.045; // 4.5% = 45px (mobile default)\n const axisLabelFontSize = viewBoxWidth * 0.05; // 5% = 50px (mobile default)\n const titleFontSize = viewBoxWidth * 0.055; // 5.5% = 55px (mobile default)\n\n // Get all data points for scale calculation\n const allPoints = data.flatMap(series => series.data);\n const allYValues = allPoints.map(p => p.y);\n\n // Determine if X values are strings or numbers\n const firstXValue = data[0]?.data[0]?.x;\n const isStringX = typeof firstXValue === 'string';\n\n // For string X values, create a mapping of unique values to indices\n const uniqueXValues = isStringX\n ? Array.from(new Set(allPoints.map(p => p.x)))\n : [];\n\n const xValueToIndex = isStringX\n ? Object.fromEntries(uniqueXValues.map((val, idx) => [val, idx]))\n : {};\n\n // Calculate X scale range\n const allXNumbers = isStringX\n ? uniqueXValues.map((_, idx) => idx)\n : allPoints.map(p => p.x as number);\n\n const minX = Math.min(...allXNumbers);\n const maxX = Math.max(...allXNumbers);\n const minY = Math.min(0, ...allYValues);\n const maxY = Math.max(...allYValues);\n\n // Add some padding to Y axis (but don't go below 0)\n const yRange = maxY - minY;\n const yMin = Math.max(0, minY - yRange * 0.1); // Ensure baseline stays at 0\n const yMax = maxY + yRange * 0.1;\n\n // Scale functions\n const scaleX = (x: string | number, index: number) => {\n const numX = isStringX ? index : (x as number);\n if (maxX === minX) return chartWidth / 2; // Handle single point case\n return ((numX - minX) / (maxX - minX)) * chartWidth;\n };\n\n const scaleY = (y: number) => {\n if (yMax === yMin) return chartHeight / 2; // Handle flat line case\n return chartHeight - ((y - yMin) / (yMax - yMin)) * chartHeight;\n };\n\n // Generate path for line\n const generatePath = (series: LineChartSeries) => {\n if (series.data.length === 0) return '';\n\n const points = series.data.map((point, i) => {\n const x = scaleX(point.x, i);\n const y = scaleY(point.y);\n return { x, y, originalIndex: i };\n });\n\n if (curved) {\n // Cubic bezier curve\n let path = `M ${points[0].x} ${points[0].y}`;\n\n for (let i = 0; i < points.length - 1; i++) {\n const current = points[i];\n const next = points[i + 1];\n const controlPointX = (current.x + next.x) / 2;\n\n path += ` C ${controlPointX} ${current.y}, ${controlPointX} ${next.y}, ${next.x} ${next.y}`;\n }\n\n return path;\n } else {\n // Straight lines\n return points.map((p, i) => `${i === 0 ? 'M' : 'L'} ${p.x} ${p.y}`).join(' ');\n }\n };\n\n // Generate grid lines\n const gridLines = [];\n const numGridLines = 5;\n\n if (showGrid) {\n // Horizontal grid lines\n for (let i = 0; i <= numGridLines; i++) {\n const y = (chartHeight / numGridLines) * i;\n const yValue = yMax - ((yMax - yMin) / numGridLines) * i;\n gridLines.push(\n <g key={`grid-h-${i}`}>\n <line\n x1={0}\n y1={y}\n x2={chartWidth}\n y2={y}\n stroke=\"currentColor\"\n strokeWidth=\"0.5\"\n className=\"text-gray-200 dark:text-gray-700\"\n strokeDasharray=\"4,4\"\n />\n {showYAxis && (\n <text\n x={-25}\n y={y}\n textAnchor=\"end\"\n dominantBaseline=\"middle\"\n fontSize={gridLabelFontSize}\n className={`fill-gray-600 dark:fill-gray-400 ${gridLabelClass}`}\n >\n {yValue.toFixed(1)}\n </text>\n )}\n </g>\n );\n }\n\n // Vertical grid lines - fixed for single point case\n const numXGridLines = Math.max(2, Math.min(allPoints.length, 6));\n const xGridStep = numXGridLines > 1 ? 1 / (numXGridLines - 1) : 0;\n\n for (let i = 0; i < numXGridLines; i++) {\n const x = chartWidth * (i * xGridStep);\n const dataIndex = Math.floor((data[0]?.data.length - 1) * (i * xGridStep));\n const xValue = data[0]?.data[Math.max(0, Math.min(dataIndex, data[0].data.length - 1))]?.x || '';\n\n gridLines.push(\n <g key={`grid-v-${i}`}>\n <line\n x1={x}\n y1={0}\n x2={x}\n y2={chartHeight}\n stroke=\"currentColor\"\n strokeWidth=\"0.5\"\n className=\"text-gray-200 dark:text-gray-700\"\n strokeDasharray=\"4,4\"\n />\n {showXAxis && (\n <text\n x={x}\n y={chartHeight + 35}\n textAnchor=\"middle\"\n dominantBaseline=\"hanging\"\n fontSize={gridLabelFontSize}\n className={`fill-gray-600 dark:fill-gray-400 ${gridLabelClass}`}\n >\n {xValue}\n </text>\n )}\n </g>\n );\n }\n }\n\n\n\n // Calculate tooltip position with boundary detection\n const getTooltipPosition = React.useCallback((x: number, y: number) => {\n if (!containerRef.current) return { x, y };\n\n const rect = containerRef.current.getBoundingClientRect();\n const tooltipWidth = 120;\n const tooltipHeight = 80;\n\n let tooltipX = x + 10;\n let tooltipY = y - 30;\n\n // Check right boundary\n if (tooltipX + tooltipWidth > rect.width) {\n tooltipX = x - tooltipWidth - 10;\n }\n\n // Check bottom boundary\n if (tooltipY + tooltipHeight > rect.height) {\n tooltipY = y + 30;\n }\n\n return { x: tooltipX, y: tooltipY };\n }, []);\n\n const containerStyle: React.CSSProperties = {\n '--font-size-base': `${baseFontSize}px`,\n '--font-size-lg': `calc(var(--font-size-base) * 1.125)`,\n '--font-size-sm': `calc(var(--font-size-base) * 0.875)`,\n '--font-size-xs': `calc(var(--font-size-base) * 0.75)`,\n } as any;\n\n return (\n <div\n ref={containerRef}\n className={`relative flex flex-col gap-4 ${responsive ? 'w-full' : 'inline-block'} ${className}`}\n style={{\n ...containerStyle\n }}\n >\n <style>{`\n /* Mobile: Large fonts, hidden axis titles, thicker lines (default) */\n .${gridLabelClass} { font-size: ${gridLabelFontSize}px !important; }\n .${axisLabelClass} { display: none; }\n .${lineClass} { stroke-width: ${strokeWidth * 2.5} !important; }\n .${pointClass} { r: 6 !important; stroke-width: 3 !important; }\n\n /* Tablet: Medium fonts, show axis titles, medium lines */\n @media (min-width: 640px) {\n .${gridLabelClass} { font-size: ${gridLabelFontSize * 0.7}px !important; }\n .${axisLabelClass} {\n font-size: ${axisLabelFontSize * 0.7}px !important;\n display: block;\n }\n .${lineClass} { stroke-width: ${strokeWidth * 1.5} !important; }\n .${pointClass} { r: 4 !important; stroke-width: 2 !important; }\n }\n\n /* Desktop: Small fonts, show axis titles, normal lines */\n @media (min-width: 1024px) {\n .${gridLabelClass} { font-size: ${gridLabelFontSize * 0.4}px !important; }\n .${axisLabelClass} {\n font-size: ${axisLabelFontSize * 0.4}px !important;\n display: block;\n }\n .${lineClass} { stroke-width: ${strokeWidth} !important; }\n .${pointClass} { r: 3 !important; stroke-width: 1.5 !important; }\n }\n `}</style>\n <svg\n ref={svgRef}\n width=\"100%\"\n viewBox={`0 0 ${viewBoxWidth} ${viewBoxHeight}`}\n preserveAspectRatio=\"xMidYMid meet\"\n className=\"bg-white dark:bg-gray-800 block w-full\"\n style={{ height: 'auto', overflow: 'visible' }}\n >\n <g transform={`translate(${padding.left}, ${padding.top})`}>\n {/* Grid lines */}\n {gridLines}\n\n {/* Lines */}\n {data.map((series, seriesIndex) => (\n <path\n key={`line-${seriesIndex}`}\n d={generatePath(series)}\n fill=\"none\"\n stroke={series.color || defaultColors[seriesIndex % defaultColors.length]}\n strokeWidth={strokeWidth}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={lineClass}\n />\n ))}\n\n {/* Data points */}\n {showDots && data.map((series, seriesIndex) =>\n series.data.map((point, pointIndex) => {\n const x = scaleX(point.x, pointIndex);\n const y = scaleY(point.y);\n const isHovered =\n hoveredPoint?.seriesIndex === seriesIndex &&\n hoveredPoint?.pointIndex === pointIndex;\n\n return (\n <circle\n key={`point-${seriesIndex}-${pointIndex}`}\n cx={x}\n cy={y}\n r={isHovered ? 5 : 3}\n fill={series.color || defaultColors[seriesIndex % defaultColors.length]}\n stroke=\"white\"\n strokeWidth=\"1.5\"\n className={`cursor-pointer transition-all ${pointClass}`}\n onMouseEnter={(e) => {\n if (showTooltip && containerRef.current) {\n setHoveredPoint({ seriesIndex, pointIndex, x, y });\n\n // Use mouse event coordinates relative to the container\n const containerRect = containerRef.current.getBoundingClientRect();\n const mouseX = e.clientX - containerRect.left;\n const mouseY = e.clientY - containerRect.top;\n\n setTooltipPosition(getTooltipPosition(mouseX, mouseY));\n }\n }}\n onMouseMove={(e) => {\n if (showTooltip && hoveredPoint?.seriesIndex === seriesIndex && hoveredPoint?.pointIndex === pointIndex && containerRef.current) {\n // Update tooltip position as mouse moves\n const containerRect = containerRef.current.getBoundingClientRect();\n const mouseX = e.clientX - containerRect.left;\n const mouseY = e.clientY - containerRect.top;\n\n setTooltipPosition(getTooltipPosition(mouseX, mouseY));\n }\n }}\n onMouseLeave={() => {\n setHoveredPoint(null);\n setTooltipPosition(null);\n }}\n />\n );\n })\n )}\n\n {/* Axis labels */}\n {xAxisLabel && showXAxis && (\n <text\n x={chartWidth / 2}\n y={chartHeight + 80}\n textAnchor=\"middle\"\n dominantBaseline=\"hanging\"\n fontSize={axisLabelFontSize}\n fontWeight=\"600\"\n className={`fill-gray-700 dark:fill-gray-300 ${axisLabelClass}`}\n >\n {xAxisLabel}\n </text>\n )}\n {yAxisLabel && showYAxis && (\n <text\n x={-chartHeight / 2}\n y={-100}\n textAnchor=\"middle\"\n dominantBaseline=\"middle\"\n fontSize={axisLabelFontSize}\n fontWeight=\"600\"\n transform=\"rotate(-90)\"\n className={`fill-gray-700 dark:fill-gray-300 ${axisLabelClass}`}\n >\n {yAxisLabel}\n </text>\n )}\n </g>\n </svg>\n\n {/* Legend */}\n {showLegend && (\n <div className=\"flex flex-wrap gap-3 justify-center px-4\">\n {data.map((series, index) => (\n <div key={`legend-${index}`} className=\"flex items-center gap-2 text-sm\">\n <div\n className=\"w-3 h-3 rounded-sm flex-shrink-0\"\n style={{\n backgroundColor: series.color || defaultColors[index % defaultColors.length],\n }}\n />\n <span className=\"text-gray-700 dark:text-gray-300\">\n {series.name}\n </span>\n </div>\n ))}\n </div>\n )}\n\n {/* Tooltip */}\n {showTooltip && hoveredPoint && tooltipPosition && (\n <div\n className=\"absolute bg-gray-900 dark:bg-gray-700 text-white px-3 py-2 rounded shadow-lg pointer-events-none z-50 text-sm whitespace-nowrap\"\n style={{\n left: `${tooltipPosition.x}px`,\n top: `${tooltipPosition.y}px`,\n transform: 'translateZ(0)',\n }}\n >\n <div className=\"font-semibold\">\n {data[hoveredPoint.seriesIndex].name}\n </div>\n <div className=\"text-xs opacity-90\">\n x: {data[hoveredPoint.seriesIndex].data[hoveredPoint.pointIndex].x}\n </div>\n <div className=\"text-xs opacity-90\">\n y: {data[hoveredPoint.seriesIndex].data[hoveredPoint.pointIndex].y}\n </div>\n </div>\n )}\n </div>\n );\n};\n","\"use client\";\n\nimport React from 'react';\n\nexport interface BarChartDataPoint {\n x: string | number;\n y: number;\n}\n\nexport interface BarChartSeries {\n name: string;\n data: BarChartDataPoint[];\n color?: string;\n}\n\nexport interface BarChartProps {\n data: BarChartSeries[];\n width?: number;\n height?: number;\n aspectRatio?: number;\n responsive?: boolean;\n showGrid?: boolean;\n showXAxis?: boolean;\n showYAxis?: boolean;\n showLegend?: boolean;\n showTooltip?: boolean;\n showValues?: boolean;\n stacked?: boolean;\n horizontal?: boolean;\n barWidth?: number;\n className?: string;\n xAxisLabel?: string;\n yAxisLabel?: string;\n baseFontSize?: number;\n colors?: string[];\n}\n\nconst defaultColors = [\n '#3b82f6', // blue-500\n '#10b981', // green-500\n '#f59e0b', // amber-500\n '#ef4444', // red-500\n '#8b5cf6', // violet-500\n '#ec4899', // pink-500\n];\n\nexport const BarChart: React.FC<BarChartProps> = ({\n data,\n width: providedWidth,\n height: providedHeight,\n aspectRatio = 16 / 9,\n responsive = true,\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 barWidth = 0.8,\n className = '',\n xAxisLabel,\n yAxisLabel,\n baseFontSize = 14,\n colors = defaultColors,\n}) => {\n // SVG viewBox dimensions (fixed for proper scaling)\n const viewBoxWidth = 1000;\n const viewBoxHeight = 600;\n\n const containerRef = React.useRef<HTMLDivElement>(null);\n const [tooltipPosition, setTooltipPosition] = React.useState<{ x: number; y: number } | null>(null);\n\n const [hoveredBar, setHoveredBar] = React.useState<{\n seriesIndex: number;\n barIndex: number;\n x: number;\n y: number;\n } | null>(null);\n\n // Generate unique class names for this chart instance\n const chartId = React.useId();\n const wrapperClass = `chart-svg-wrapper-${chartId.replace(/:/g, '-')}`;\n const gridLabelClass = `chart-grid-label-${chartId.replace(/:/g, '-')}`;\n const axisLabelClass = `chart-axis-label-${chartId.replace(/:/g, '-')}`;\n const barClass = `chart-bar-${chartId.replace(/:/g, '-')}`;\n\n // Responsive padding that scales with viewBox\n const padding = {\n top: 50,\n right: 50,\n bottom: showXAxis ? (horizontal ? 120 : 140) : 50,\n left: showYAxis ? (horizontal ? 140 : 130) : 50\n };\n const chartWidth = viewBoxWidth - padding.left - padding.right;\n const chartHeight = viewBoxHeight - padding.top - padding.bottom;\n\n // Font sizes as percentage of viewBox width - will be overridden by CSS media queries\n // Mobile gets larger percentages, desktop gets smaller ones\n const gridLabelFontSize = viewBoxWidth * 0.045; // 4.5% = 45px (mobile default)\n const axisLabelFontSize = viewBoxWidth * 0.05; // 5% = 50px (mobile default)\n const titleFontSize = viewBoxWidth * 0.055; // 5.5% = 55px (mobile default)\n\n // Get all Y values for scale calculation\n const allYValues = stacked\n ? data[0]?.data.map((_, i) =>\n data.reduce((sum, series) => sum + (series.data[i]?.y || 0), 0)\n ) || []\n : data.flatMap(series => series.data.map(p => p.y));\n\n const minY = Math.min(0, ...allYValues);\n const maxY = Math.max(...allYValues);\n\n // Add some padding to Y axis (but don't go below 0)\n const yRange = maxY - minY;\n const yMin = Math.max(0, minY - yRange * 0.1); // Ensure baseline stays at 0\n const yMax = maxY + yRange * 0.1;\n\n // Number of bars per group\n const numBars = data[0]?.data.length || 0;\n const numSeries = data.length;\n\n // Scale functions\n const scaleY = (y: number) => {\n if (yMax === yMin) return chartHeight / 2;\n return chartHeight - ((y - yMin) / (yMax - yMin)) * chartHeight;\n };\n\n // Calculate bar positions\n const barGroupWidth = chartWidth / numBars;\n const barPadding = barGroupWidth * (1 - barWidth) / 2;\n const actualBarWidth = stacked\n ? barGroupWidth * barWidth\n : (barGroupWidth * barWidth) / numSeries;\n\n // Generate grid lines\n const gridLines = [];\n const numGridLines = 5;\n\n if (showGrid) {\n // Horizontal grid lines\n for (let i = 0; i <= numGridLines; i++) {\n const y = (chartHeight / numGridLines) * i;\n const yValue = yMax - ((yMax - yMin) / numGridLines) * i;\n gridLines.push(\n <g key={`grid-h-${i}`}>\n <line\n x1={0}\n y1={y}\n x2={chartWidth}\n y2={y}\n stroke=\"currentColor\"\n strokeWidth=\"0.5\"\n className=\"text-gray-200 dark:text-gray-700\"\n strokeDasharray=\"4,4\"\n />\n {showYAxis && !horizontal && (\n <text\n x={-25}\n y={y}\n textAnchor=\"end\"\n dominantBaseline=\"middle\"\n fontSize={gridLabelFontSize}\n className={`fill-gray-600 dark:fill-gray-400 ${gridLabelClass}`}\n >\n {yValue.toFixed(0)}\n </text>\n )}\n </g>\n );\n }\n\n // Vertical grid lines\n if (horizontal) {\n for (let i = 0; i <= numGridLines; i++) {\n const x = (chartWidth / numGridLines) * i;\n gridLines.push(\n <line\n key={`grid-v-${i}`}\n x1={x}\n y1={0}\n x2={x}\n y2={chartHeight}\n stroke=\"currentColor\"\n strokeWidth=\"1\"\n className=\"text-gray-200 dark:text-gray-700\"\n strokeDasharray=\"2,2\"\n />\n );\n }\n }\n }\n\n // Render bars\n const renderBars = () => {\n const bars = [];\n\n if (stacked) {\n // Stacked bars\n for (let barIndex = 0; barIndex < numBars; barIndex++) {\n let cumulativeY = 0;\n const xPos = barIndex * barGroupWidth + barPadding;\n const barW = barGroupWidth * barWidth;\n\n for (let seriesIndex = 0; seriesIndex < numSeries; seriesIndex++) {\n const point = data[seriesIndex].data[barIndex];\n if (!point) continue;\n\n const barHeight = Math.abs(scaleY(point.y) - scaleY(0));\n const yPos = scaleY(cumulativeY + point.y);\n\n const isHovered =\n hoveredBar?.seriesIndex === seriesIndex &&\n hoveredBar?.barIndex === barIndex;\n\n bars.push(\n <rect\n key={`bar-${seriesIndex}-${barIndex}`}\n x={xPos}\n y={yPos}\n width={barW}\n height={Math.abs(scaleY(0) - yPos)}\n fill={data[seriesIndex].color || colors[seriesIndex % colors.length]}\n className={`cursor-pointer transition-opacity ${barClass}`}\n opacity={isHovered ? 0.8 : 1}\n onMouseEnter={() => {\n if (showTooltip) {\n setHoveredBar({ seriesIndex, barIndex, x: xPos + barW / 2, y: yPos });\n setTooltipPosition(getTooltipPosition(padding.left + xPos + barW / 2, padding.top + yPos));\n }\n }}\n onMouseLeave={() => {\n setHoveredBar(null);\n setTooltipPosition(null);\n }}\n />\n );\n\n cumulativeY += point.y;\n }\n }\n } else {\n // Grouped bars\n for (let barIndex = 0; barIndex < numBars; barIndex++) {\n for (let seriesIndex = 0; seriesIndex < numSeries; seriesIndex++) {\n const point = data[seriesIndex].data[barIndex];\n if (!point) continue;\n\n const xPos = barIndex * barGroupWidth + barPadding + seriesIndex * actualBarWidth;\n const barHeight = Math.abs(scaleY(point.y) - scaleY(0));\n const yPos = scaleY(Math.max(0, point.y));\n\n const isHovered =\n hoveredBar?.seriesIndex === seriesIndex &&\n hoveredBar?.barIndex === barIndex;\n\n bars.push(\n <rect\n key={`bar-${seriesIndex}-${barIndex}`}\n x={xPos}\n y={yPos}\n width={actualBarWidth}\n height={barHeight}\n fill={data[seriesIndex].color || colors[seriesIndex % colors.length]}\n className={`cursor-pointer transition-opacity ${barClass}`}\n opacity={isHovered ? 0.8 : 1}\n onMouseEnter={() =>\n showTooltip &&\n setHoveredBar({ seriesIndex, barIndex, x: xPos + actualBarWidth / 2, y: yPos })\n }\n onMouseLeave={() => setHoveredBar(null)}\n />\n );\n\n // Show values on bars\n if (showValues) {\n bars.push(\n <text\n key={`value-${seriesIndex}-${barIndex}`}\n x={xPos + actualBarWidth / 2}\n y={yPos - 10}\n textAnchor=\"middle\"\n dominantBaseline=\"middle\"\n fontSize=\"11\"\n fontWeight=\"600\"\n className=\"fill-gray-700 dark:fill-gray-300\"\n >\n {point.y}\n </text>\n );\n }\n }\n }\n }\n\n return bars;\n };\n\n // X axis labels\n const xAxisLabels = data[0]?.data.map((point, i) => {\n const xPos = i * barGroupWidth + barGroupWidth / 2;\n return (\n <text\n key={`x-label-${i}`}\n x={xPos}\n y={chartHeight + 35}\n textAnchor=\"middle\"\n dominantBaseline=\"hanging\"\n fontSize={gridLabelFontSize}\n className={`fill-gray-600 dark:fill-gray-400 ${gridLabelClass}`}\n >\n {point.x}\n </text>\n );\n });\n\n // Calculate tooltip position with boundary detection\n const getTooltipPosition = React.useCallback((x: number, y: number) => {\n if (!containerRef.current) return { x, y };\n\n const rect = containerRef.current.getBoundingClientRect();\n const tooltipWidth = 140;\n const tooltipHeight = 80;\n\n let tooltipX = x + 10;\n let tooltipY = y - 30;\n\n // Check right boundary\n if (tooltipX + tooltipWidth > rect.width) {\n tooltipX = x - tooltipWidth - 10;\n }\n\n // Check bottom boundary\n if (tooltipY + tooltipHeight > rect.height) {\n tooltipY = y + 30;\n }\n\n return { x: tooltipX, y: tooltipY };\n }, []);\n\n const containerStyle: React.CSSProperties = {\n '--font-size-base': `${baseFontSize}px`,\n '--font-size-lg': `calc(var(--font-size-base) * 1.125)`,\n '--font-size-sm': `calc(var(--font-size-base) * 0.875)`,\n '--font-size-xs': `calc(var(--font-size-base) * 0.75)`,\n } as any;\n\n return (\n <div\n ref={containerRef}\n className={`relative flex flex-col gap-4 ${responsive ? 'w-full' : 'inline-block'} ${className}`}\n style={{\n ...containerStyle\n }}\n >\n <style>{`\n /* Mobile: Large fonts, hidden axis titles, thicker bars (default) */\n .${gridLabelClass} { font-size: ${gridLabelFontSize}px !important; }\n .${axisLabelClass} { display: none; }\n\n /* Tablet: Medium fonts, show axis titles */\n @media (min-width: 640px) {\n .${gridLabelClass} { font-size: ${gridLabelFontSize * 0.7}px !important; }\n .${axisLabelClass} {\n font-size: ${axisLabelFontSize * 0.7}px !important;\n display: block;\n }\n }\n\n /* Desktop: Small fonts, show axis titles */\n @media (min-width: 1024px) {\n .${gridLabelClass} { font-size: ${gridLabelFontSize * 0.4}px !important; }\n .${axisLabelClass} {\n font-size: ${axisLabelFontSize * 0.4}px !important;\n display: block;\n }\n }\n `}</style>\n <svg\n width=\"100%\"\n viewBox={`0 0 ${viewBoxWidth} ${viewBoxHeight}`}\n preserveAspectRatio=\"xMidYMid meet\"\n className=\"bg-white dark:bg-gray-800 block w-full\"\n style={{ height: 'auto', overflow: 'visible' }}\n >\n <g transform={`translate(${padding.left}, ${padding.top})`}>\n {/* Grid lines */}\n {gridLines}\n\n {/* Bars */}\n {renderBars()}\n\n {/* X axis labels */}\n {showXAxis && xAxisLabels}\n\n {/* Axis labels */}\n {xAxisLabel && showXAxis && (\n <text\n x={chartWidth / 2}\n y={chartHeight + 80}\n textAnchor=\"middle\"\n dominantBaseline=\"hanging\"\n fontSize={axisLabelFontSize}\n fontWeight=\"600\"\n className={`fill-gray-700 dark:fill-gray-300 ${axisLabelClass}`}\n >\n {xAxisLabel}\n </text>\n )}\n {yAxisLabel && showYAxis && (\n <text\n x={-chartHeight / 2}\n y={-100}\n textAnchor=\"middle\"\n dominantBaseline=\"middle\"\n fontSize={axisLabelFontSize}\n fontWeight=\"600\"\n transform=\"rotate(-90)\"\n className={`fill-gray-700 dark:fill-gray-300 ${axisLabelClass}`}\n >\n {yAxisLabel}\n </text>\n )}\n </g>\n </svg>\n\n {/* Legend */}\n {showLegend && (\n <div className=\"flex flex-wrap gap-3 justify-center px-4\">\n {data.map((series, index) => (\n <div key={`legend-${index}`} className=\"flex items-center gap-2 text-sm\">\n <div\n className=\"w-3 h-3 rounded-sm flex-shrink-0\"\n style={{\n backgroundColor: series.color || colors[index % colors.length],\n }}\n />\n <span className=\"text-gray-700 dark:text-gray-300\">\n {series.name}\n </span>\n </div>\n ))}\n </div>\n )}\n\n {/* Tooltip */}\n {showTooltip && hoveredBar && tooltipPosition && (\n <div\n className=\"absolute bg-gray-900 dark:bg-gray-700 text-white px-3 py-2 rounded shadow-lg pointer-events-none z-50 text-sm whitespace-nowrap\"\n style={{\n left: `${tooltipPosition.x}px`,\n top: `${tooltipPosition.y}px`,\n transform: 'translateZ(0)',\n }}\n >\n <div className=\"font-semibold\">\n {data[hoveredBar.seriesIndex].name}\n </div>\n <div className=\"text-xs opacity-90\">\n {data[hoveredBar.seriesIndex].data[hoveredBar.barIndex].x}: {data[hoveredBar.seriesIndex].data[hoveredBar.barIndex].y}\n </div>\n </div>\n )}\n </div>\n );\n};\n","\"use client\";\n\nimport React from 'react';\n\nexport interface AreaChartDataPoint {\n x: string | number;\n y: number;\n}\n\nexport interface AreaChartSeries {\n name: string;\n data: AreaChartDataPoint[];\n color?: string;\n}\n\nexport interface AreaChartProps {\n data: AreaChartSeries[];\n width?: number;\n height?: number;\n aspectRatio?: number;\n responsive?: boolean;\n showGrid?: boolean;\n showXAxis?: boolean;\n showYAxis?: boolean;\n showLegend?: boolean;\n showTooltip?: boolean;\n showDots?: boolean;\n curved?: boolean;\n stacked?: boolean;\n fillOpacity?: number;\n strokeWidth?: number;\n className?: string;\n xAxisLabel?: string;\n yAxisLabel?: string;\n baseFontSize?: number;\n}\n\nconst defaultColors = [\n '#3b82f6', // blue-500\n '#10b981', // green-500\n '#f59e0b', // amber-500\n '#ef4444', // red-500\n '#8b5cf6', // violet-500\n '#ec4899', // pink-500\n];\n\nexport const AreaChart: React.FC<AreaChartProps> = ({\n data,\n width: providedWidth,\n height: providedHeight,\n aspectRatio = 16 / 9,\n responsive = true,\n showGrid = true,\n showXAxis = true,\n showYAxis = true,\n showLegend = true,\n showTooltip = true,\n showDots = false,\n curved = true,\n stacked = false,\n fillOpacity = 0.3,\n strokeWidth = 2,\n className = '',\n xAxisLabel,\n yAxisLabel,\n baseFontSize = 14,\n}) => {\n // SVG viewBox dimensions (fixed for proper scaling)\n const viewBoxWidth = 1000;\n const viewBoxHeight = 600;\n\n const containerRef = React.useRef<HTMLDivElement>(null);\n const svgRef = React.useRef<SVGSVGElement>(null);\n const [tooltipPosition, setTooltipPosition] = React.useState<{ x: number; y: number } | null>(null);\n\n const [hoveredPoint, setHoveredPoint] = React.useState<{\n seriesIndex: number;\n pointIndex: number;\n x: number;\n y: number;\n } | null>(null);\n\n // Generate unique class names for this chart instance\n const chartId = React.useId();\n const wrapperClass = `chart-svg-wrapper-${chartId.replace(/:/g, '-')}`;\n const gridLabelClass = `chart-grid-label-${chartId.replace(/:/g, '-')}`;\n const axisLabelClass = `chart-axis-label-${chartId.replace(/:/g, '-')}`;\n const lineClass = `chart-line-${chartId.replace(/:/g, '-')}`;\n const pointClass = `chart-point-${chartId.replace(/:/g, '-')}`;\n\n // Calculate chart dimensions with padding (in viewBox space)\n const padding = {\n top: 50,\n right: 50,\n bottom: showXAxis ? 120 : 50,\n left: showYAxis ? 130 : 50\n };\n const chartWidth = viewBoxWidth - padding.left - padding.right;\n const chartHeight = viewBoxHeight - padding.top - padding.bottom;\n\n // Font sizes as percentage of viewBox width - will be overridden by CSS media queries\n // Mobile gets larger percentages, desktop gets smaller ones\n const gridLabelFontSize = viewBoxWidth * 0.045; // 4.5% = 45px (mobile default)\n const axisLabelFontSize = viewBoxWidth * 0.05; // 5% = 50px (mobile default)\n const titleFontSize = viewBoxWidth * 0.055; // 5.5% = 55px (mobile default)\n\n // Get all data points for scale calculation\n const allPoints = data.flatMap(series => series.data);\n const allYValues = stacked\n ? data[0]?.data.map((_, i) =>\n data.reduce((sum, series) => sum + (series.data[i]?.y || 0), 0)\n ) || []\n : allPoints.map(p => p.y);\n\n // Determine if X values are strings or numbers\n const firstXValue = data[0]?.data[0]?.x;\n const isStringX = typeof firstXValue === 'string';\n\n // For string X values, create a mapping of unique values to indices\n const uniqueXValues = isStringX\n ? Array.from(new Set(allPoints.map(p => p.x)))\n : [];\n\n // Calculate X scale range\n const allXNumbers = isStringX\n ? uniqueXValues.map((_, idx) => idx)\n : allPoints.map(p => p.x as number);\n\n const minX = Math.min(...allXNumbers);\n const maxX = Math.max(...allXNumbers);\n const minY = Math.min(0, ...allYValues);\n const maxY = Math.max(...allYValues);\n\n // Add some padding to Y axis (but don't go below 0 for area charts)\n const yRange = maxY - minY;\n const yMin = Math.max(0, minY - yRange * 0.1); // Ensure baseline stays at 0\n const yMax = maxY + yRange * 0.1;\n\n // Scale functions\n const scaleX = (x: string | number, index: number) => {\n const numX = isStringX ? index : (x as number);\n if (maxX === minX) return chartWidth / 2;\n return ((numX - minX) / (maxX - minX)) * chartWidth;\n };\n\n const scaleY = (y: number) => {\n if (yMax === yMin) return chartHeight / 2;\n return chartHeight - ((y - yMin) / (yMax - yMin)) * chartHeight;\n };\n\n // Generate path for area\n const generateAreaPath = (series: AreaChartSeries, baselineYValues?: number[]) => {\n if (series.data.length === 0) return '';\n\n const points = series.data.map((point, i) => {\n const x = scaleX(point.x, i);\n const baseY = baselineYValues ? scaleY(baselineYValues[i]) : scaleY(0);\n const y = baselineYValues\n ? scaleY(baselineYValues[i] + point.y)\n : scaleY(point.y);\n return { x, y, baseY, originalIndex: i };\n });\n\n if (curved) {\n // Top line (cubic bezier curve)\n let topPath = `M ${points[0].x} ${points[0].y}`;\n for (let i = 0; i < points.length - 1; i++) {\n const current = points[i];\n const next = points[i + 1];\n const controlPointX = (current.x + next.x) / 2;\n topPath += ` C ${controlPointX} ${current.y}, ${controlPointX} ${next.y}, ${next.x} ${next.y}`;\n }\n\n // Bottom line (reverse, baseline)\n let bottomPath = '';\n for (let i = points.length - 1; i >= 0; i--) {\n const point = points[i];\n if (i === points.length - 1) {\n bottomPath += ` L ${point.x} ${point.baseY}`;\n } else {\n const next = points[i + 1];\n const controlPointX = (point.x + next.x) / 2;\n bottomPath += ` C ${controlPointX} ${next.baseY}, ${controlPointX} ${point.baseY}, ${point.x} ${point.baseY}`;\n }\n }\n\n return topPath + bottomPath + ' Z';\n } else {\n // Straight lines\n const topPath = points.map((p, i) => `${i === 0 ? 'M' : 'L'} ${p.x} ${p.y}`).join(' ');\n const bottomPath = points\n .slice()\n .reverse()\n .map(p => `L ${p.x} ${p.baseY}`)\n .join(' ');\n return topPath + ' ' + bottomPath + ' Z';\n }\n };\n\n // Generate path for line (stroke)\n const generateLinePath = (series: AreaChartSeries, baselineYValues?: number[]) => {\n if (series.data.length === 0) return '';\n\n const points = series.data.map((point, i) => {\n const x = scaleX(point.x, i);\n const y = baselineYValues\n ? scaleY(baselineYValues[i] + point.y)\n : scaleY(point.y);\n return { x, y };\n });\n\n if (curved) {\n let path = `M ${points[0].x} ${points[0].y}`;\n for (let i = 0; i < points.length - 1; i++) {\n const current = points[i];\n const next = points[i + 1];\n const controlPointX = (current.x + next.x) / 2;\n path += ` C ${controlPointX} ${current.y}, ${controlPointX} ${next.y}, ${next.x} ${next.y}`;\n }\n return path;\n } else {\n return points.map((p, i) => `${i === 0 ? 'M' : 'L'} ${p.x} ${p.y}`).join(' ');\n }\n };\n\n // Generate grid lines\n const gridLines = [];\n const numGridLines = 5;\n\n if (showGrid) {\n // Horizontal grid lines\n for (let i = 0; i <= numGridLines; i++) {\n const y = (chartHeight / numGridLines) * i;\n const yValue = yMax - ((yMax - yMin) / numGridLines) * i;\n gridLines.push(\n <g key={`grid-h-${i}`}>\n <line\n x1={0}\n y1={y}\n x2={chartWidth}\n y2={y}\n stroke=\"currentColor\"\n strokeWidth=\"0.5\"\n className=\"text-gray-200 dark:text-gray-700\"\n strokeDasharray=\"4,4\"\n />\n {showYAxis && (\n <text\n x={-25}\n y={y}\n textAnchor=\"end\"\n dominantBaseline=\"middle\"\n fontSize={gridLabelFontSize}\n className={`fill-gray-600 dark:fill-gray-400 ${gridLabelClass}`}\n >\n {yValue.toFixed(1)}\n </text>\n )}\n </g>\n );\n }\n\n // Vertical grid lines\n const numXGridLines = Math.min(allPoints.length, 6);\n for (let i = 0; i < numXGridLines; i++) {\n const x = (chartWidth / (numXGridLines - 1)) * i;\n const xValue = data[0]?.data[Math.floor((data[0].data.length - 1) * (i / (numXGridLines - 1)))]?.x || '';\n gridLines.push(\n <g key={`grid-v-${i}`}>\n <line\n x1={x}\n y1={0}\n x2={x}\n y2={chartHeight}\n stroke=\"currentColor\"\n strokeWidth=\"0.5\"\n className=\"text-gray-200 dark:text-gray-700\"\n strokeDasharray=\"4,4\"\n />\n {showXAxis && (\n <text\n x={x}\n y={chartHeight + 35}\n textAnchor=\"middle\"\n dominantBaseline=\"hanging\"\n fontSize={gridLabelFontSize}\n className={`fill-gray-600 dark:fill-gray-400 ${gridLabelClass}`}\n >\n {xValue}\n </text>\n )}\n </g>\n );\n }\n }\n\n // Calculate baseline values for stacked mode\n let cumulativeValues: number[] = [];\n if (stacked) {\n cumulativeValues = Array(data[0]?.data.length || 0).fill(0);\n }\n\n // Calculate tooltip position with boundary detection\n const getTooltipPosition = React.useCallback((x: number, y: number) => {\n if (!containerRef.current) return { x, y };\n\n const rect = containerRef.current.getBoundingClientRect();\n const tooltipWidth = 120;\n const tooltipHeight = 80;\n\n let tooltipX = x + 10;\n let tooltipY = y - 30;\n\n // Check right boundary\n if (tooltipX + tooltipWidth > rect.width) {\n tooltipX = x - tooltipWidth - 10;\n }\n\n // Check bottom boundary\n if (tooltipY + tooltipHeight > rect.height) {\n tooltipY = y + 30;\n }\n\n return { x: tooltipX, y: tooltipY };\n }, []);\n\n const containerStyle: React.CSSProperties = {\n '--font-size-base': `${baseFontSize}px`,\n '--font-size-lg': `calc(var(--font-size-base) * 1.125)`,\n '--font-size-sm': `calc(var(--font-size-base) * 0.875)`,\n '--font-size-xs': `calc(var(--font-size-base) * 0.75)`,\n } as React.CSSProperties;\n\n return (\n <div\n ref={containerRef}\n className={`relative flex flex-col gap-4 ${responsive ? 'w-full' : 'inline-block'} ${className}`}\n style={containerStyle}\n >\n <style>{`\n /* Mobile: Large fonts, hidden axis titles, thicker lines (default) */\n .${gridLabelClass} { font-size: ${gridLabelFontSize}px !important; }\n .${axisLabelClass} { display: none; }\n .${lineClass} { stroke-width: ${strokeWidth * 2.5} !important; }\n .${pointClass} { r: 6 !important; stroke-width: 3 !important; }\n\n /* Tablet: Medium fonts, show axis titles, medium lines */\n @media (min-width: 640px) {\n .${gridLabelClass} { font-size: ${gridLabelFontSize * 0.7}px !important; }\n .${axisLabelClass} {\n font-size: ${axisLabelFontSize * 0.7}px !important;\n display: block;\n }\n .${lineClass} { stroke-width: ${strokeWidth * 1.5} !important; }\n .${pointClass} { r: 4 !important; stroke-width: 2 !important; }\n }\n\n /* Desktop: Small fonts, show axis titles, normal lines */\n @media (min-width: 1024px) {\n .${gridLabelClass} { font-size: ${gridLabelFontSize * 0.4}px !important; }\n .${axisLabelClass} {\n font-size: ${axisLabelFontSize * 0.4}px !important;\n display: block;\n }\n .${lineClass} { stroke-width: ${strokeWidth} !important; }\n .${pointClass} { r: 3 !important; stroke-width: 1.5 !important; }\n }\n `}</style>\n <svg\n ref={svgRef}\n width=\"100%\"\n viewBox={`0 0 ${viewBoxWidth} ${viewBoxHeight}`}\n preserveAspectRatio=\"xMidYMid meet\"\n className=\"bg-white dark:bg-gray-800 block w-full\"\n style={{ height: 'auto', overflow: 'visible' }}\n >\n <g transform={`translate(${padding.left}, ${padding.top})`}>\n {/* Grid lines */}\n {gridLines}\n\n {/* Areas */}\n {data.map((series, seriesIndex) => {\n const baselineYValues = stacked ? [...cumulativeValues] : undefined;\n const areaPath = generateAreaPath(series, baselineYValues);\n const linePath = generateLinePath(series, baselineYValues);\n\n // Update cumulative values for next series\n if (stacked) {\n series.data.forEach((point, i) => {\n cumulativeValues[i] += point.y;\n });\n }\n\n return (\n <g key={`area-${seriesIndex}`}>\n {/* Filled area */}\n <path\n d={areaPath}\n fill={series.color || defaultColors[seriesIndex % defaultColors.length]}\n opacity={fillOpacity}\n />\n {/* Stroke line */}\n <path\n d={linePath}\n fill=\"none\"\n stroke={series.color || defaultColors[seriesIndex % defaultColors.length]}\n strokeWidth={strokeWidth}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={lineClass}\n />\n </g>\n );\n })}\n\n {/* Data points */}\n {showDots && data.map((series, seriesIndex) => {\n const baselineYValues = stacked\n ? data.slice(0, seriesIndex).reduce((acc, s) => {\n return acc.map((val, i) => val + (s.data[i]?.y || 0));\n }, Array(series.data.length).fill(0))\n : undefined;\n\n return series.data.map((point, pointIndex) => {\n const x = scaleX(point.x, pointIndex);\n const y = baselineYValues\n ? scaleY(baselineYValues[pointIndex] + point.y)\n : scaleY(point.y);\n const isHovered =\n hoveredPoint?.seriesIndex === seriesIndex &&\n hoveredPoint?.pointIndex === pointIndex;\n\n return (\n <circle\n key={`point-${seriesIndex}-${pointIndex}`}\n cx={x}\n cy={y}\n r={isHovered ? 6 : 4}\n fill={series.color || defaultColors[seriesIndex % defaultColors.length]}\n stroke=\"white\"\n strokeWidth=\"2\"\n className={`cursor-pointer transition-all ${pointClass}`}\n onMouseEnter={(e) => {\n if (showTooltip && containerRef.current) {\n setHoveredPoint({ seriesIndex, pointIndex, x, y });\n\n // Use mouse event coordinates relative to the container\n const containerRect = containerRef.current.getBoundingClientRect();\n const mouseX = e.clientX - containerRect.left;\n const mouseY = e.clientY - containerRect.top;\n\n setTooltipPosition(getTooltipPosition(mouseX, mouseY));\n }\n }}\n onMouseMove={(e) => {\n if (showTooltip && hoveredPoint?.seriesIndex === seriesIndex && hoveredPoint?.pointIndex === pointIndex && containerRef.current) {\n // Update tooltip position as mouse moves\n const containerRect = containerRef.current.getBoundingClientRect();\n const mouseX = e.clientX - containerRect.left;\n const mouseY = e.clientY - containerRect.top;\n\n setTooltipPosition(getTooltipPosition(mouseX, mouseY));\n }\n }}\n onMouseLeave={() => {\n setHoveredPoint(null);\n setTooltipPosition(null);\n }}\n />\n );\n });\n })}\n\n {/* Axis labels */}\n {xAxisLabel && showXAxis && (\n <text\n x={chartWidth / 2}\n y={chartHeight + 80}\n textAnchor=\"middle\"\n dominantBaseline=\"hanging\"\n fontSize={axisLabelFontSize}\n fontWeight=\"600\"\n className={`fill-gray-700 dark:fill-gray-300 ${axisLabelClass}`}\n >\n {xAxisLabel}\n </text>\n )}\n {yAxisLabel && showYAxis && (\n <text\n x={-chartHeight / 2}\n y={-100}\n textAnchor=\"middle\"\n dominantBaseline=\"middle\"\n fontSize={axisLabelFontSize}\n fontWeight=\"600\"\n transform=\"rotate(-90)\"\n className={`fill-gray-700 dark:fill-gray-300 ${axisLabelClass}`}\n >\n {yAxisLabel}\n </text>\n )}\n </g>\n </svg>\n\n {/* Legend */}\n {showLegend && (\n <div className=\"flex flex-wrap gap-3 justify-center px-4\">\n {data.map((series, index) => (\n <div key={`legend-${index}`} className=\"flex items-center gap-2 text-sm\">\n <div\n className=\"w-3 h-3 rounded-sm flex-shrink-0\"\n style={{\n backgroundColor: series.color || defaultColors[index % defaultColors.length],\n }}\n />\n <span className=\"text-gray-700 dark:text-gray-300\">\n {series.name}\n </span>\n </div>\n ))}\n </div>\n )}\n\n {/* Tooltip */}\n {showTooltip && hoveredPoint && tooltipPosition && (\n <div\n className=\"absolute bg-gray-900 dark:bg-gray-700 text-white px-3 py-2 rounded shadow-lg pointer-events-none z-50 text-sm whitespace-nowrap\"\n style={{\n left: `${tooltipPosition.x}px`,\n top: `${tooltipPosition.y}px`,\n transform: 'translateZ(0)',\n }}\n >\n <div className=\"font-semibold\">\n {data[hoveredPoint.seriesIndex].name}\n </div>\n <div className=\"text-xs opacity-90\">\n x: {data[hoveredPoint.seriesIndex].data[hoveredPoint.pointIndex].x}\n </div>\n <div className=\"text-xs opacity-90\">\n y: {data[hoveredPoint.seriesIndex].data[hoveredPoint.pointIndex].y}\n </div>\n </div>\n )}\n </div>\n );\n};\n","\"use client\";\n\nimport React from 'react';\n\nexport interface PieChartDataPoint {\n label: string;\n value: number;\n color?: string;\n}\n\nexport interface PieChartProps {\n data: PieChartDataPoint[];\n width?: number;\n height?: number;\n aspectRatio?: number;\n responsive?: boolean;\n showLegend?: boolean;\n showLabels?: boolean;\n showValues?: boolean;\n showPercentages?: boolean;\n donut?: boolean;\n donutWidth?: number;\n className?: string;\n baseFontSize?: number;\n}\n\nconst defaultColors = [\n '#3b82f6', // blue-500\n '#10b981', // green-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];\n\nexport const PieChart: React.FC<PieChartProps> = ({\n data,\n width: providedWidth,\n height: providedHeight,\n aspectRatio = 1,\n responsive = true,\n showLegend = true,\n showLabels = true,\n showValues = false,\n showPercentages = false,\n donut = false,\n donutWidth = 60,\n className = '',\n baseFontSize = 14,\n}) => {\n // SVG viewBox dimensions (fixed for proper scaling)\n const viewBoxWidth = 600;\n const viewBoxHeight = 600;\n\n const containerRef = React.useRef<HTMLDivElement>(null);\n const [tooltipPosition, setTooltipPosition] = React.useState<{ x: number; y: number } | null>(null);\n const [hoveredSlice, setHoveredSlice] = React.useState<number | null>(null);\n\n // Generate unique class names for this chart instance\n const chartId = React.useId();\n const wrapperClass = `chart-svg-wrapper-${chartId.replace(/:/g, '-')}`;\n const gridLabelClass = `chart-grid-label-${chartId.replace(/:/g, '-')}`;\n const axisLabelClass = `chart-axis-label-${chartId.replace(/:/g, '-')}`;\n const sliceClass = `chart-slice-${chartId.replace(/:/g, '-')}`;\n\n // Calculate total\n const total = data.reduce((sum, item) => sum + item.value, 0);\n\n // Chart dimensions\n const centerX = viewBoxWidth / 2;\n const centerY = viewBoxHeight / 2;\n const radius = Math.min(viewBoxWidth, viewBoxHeight) / 2 - 40; // Padding for labels\n const innerRadius = donut ? radius - donutWidth : 0;\n\n // Font sizes as percentage of viewBox width - will be overridden by CSS media queries\n // Mobile gets larger percentages, desktop gets smaller ones\n const gridLabelFontSize = viewBoxWidth * 0.045; // 4.5% = 27px (mobile default)\n const axisLabelFontSize = viewBoxWidth * 0.05; // 5% = 30px (mobile default)\n const titleFontSize = viewBoxWidth * 0.055; // 5.5% = 33px (mobile default)\n\n // Generate pie slices\n let currentAngle = -90; // Start from top\n\n const slices = data.map((item, index) => {\n const percentage = (item.value / total) * 100;\n const angle = (item.value / total) * 360;\n const startAngle = currentAngle;\n const endAngle = currentAngle + angle;\n\n // Calculate path (round to avoid hydration errors)\n const startRad = (startAngle * Math.PI) / 180;\n const endRad = (endAngle * Math.PI) / 180;\n\n const x1 = Math.round((centerX + radius * Math.cos(startRad)) * 100) / 100;\n const y1 = Math.round((centerY + radius * Math.sin(startRad)) * 100) / 100;\n const x2 = Math.round((centerX + radius * Math.cos(endRad)) * 100) / 100;\n const y2 = Math.round((centerY + radius * Math.sin(endRad)) * 100) / 100;\n\n const largeArc = angle > 180 ? 1 : 0;\n\n let path: string;\n if (donut) {\n // Donut slice (round to avoid hydration errors)\n const ix1 = Math.round((centerX + innerRadius * Math.cos(startRad)) * 100) / 100;\n const iy1 = Math.round((centerY + innerRadius * Math.sin(startRad)) * 100) / 100;\n const ix2 = Math.round((centerX + innerRadius * Math.cos(endRad)) * 100) / 100;\n const iy2 = Math.round((centerY + innerRadius * Math.sin(endRad)) * 100) / 100;\n\n path = [\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 } else {\n // Regular pie slice\n path = [\n `M ${centerX} ${centerY}`,\n `L ${x1} ${y1}`,\n `A ${radius} ${radius} 0 ${largeArc} 1 ${x2} ${y2}`,\n 'Z',\n ].join(' ');\n }\n\n // Label position (middle of slice, round to avoid hydration errors)\n const labelAngle = startAngle + angle / 2;\n const labelRad = (labelAngle * Math.PI) / 180;\n const labelRadius = donut ? innerRadius + (radius - innerRadius) / 2 : radius * 0.7;\n const labelX = Math.round((centerX + labelRadius * Math.cos(labelRad)) * 100) / 100;\n const labelY = Math.round((centerY + labelRadius * Math.sin(labelRad)) * 100) / 100;\n\n currentAngle = endAngle;\n\n return {\n path,\n color: item.color || defaultColors[index % defaultColors.length],\n label: item.label,\n value: item.value,\n percentage,\n labelX,\n labelY,\n index,\n };\n });\n\n // Calculate tooltip position with boundary detection\n const getTooltipPosition = React.useCallback((x: number, y: number) => {\n if (!containerRef.current) return { x, y };\n\n const rect = containerRef.current.getBoundingClientRect();\n const tooltipWidth = 120;\n const tooltipHeight = 80;\n\n let tooltipX = x + 10;\n let tooltipY = y - 30;\n\n // Check right boundary\n if (tooltipX + tooltipWidth > rect.width) {\n tooltipX = x - tooltipWidth - 10;\n }\n\n // Check bottom boundary\n if (tooltipY + tooltipHeight > rect.height) {\n tooltipY = y + 30;\n }\n\n return { x: tooltipX, y: tooltipY };\n }, []);\n\n const containerStyle: React.CSSProperties = {\n '--font-size-base': `${baseFontSize}px`,\n '--font-size-lg': `calc(var(--font-size-base) * 1.125)`,\n '--font-size-sm': `calc(var(--font-size-base) * 0.875)`,\n '--font-size-xs': `calc(var(--font-size-base) * 0.75)`,\n '--font-size-xl': `calc(var(--font-size-base) * 1.5)`,\n '--font-size-2xl': `calc(var(--font-size-base) * 2)`,\n };\n\n if (responsive) {\n containerStyle['--font-size-base'] = `clamp(${baseFontSize * 0.8}px, 4vw, ${baseFontSize}px)`;\n }\n\n return (\n <div\n ref={containerRef}\n className={`relative flex flex-col gap-4 ${responsive ? 'w-full' : 'inline-block'} ${className}`}\n style={containerStyle}\n >\n <style>{`\n /* Mobile: Large fonts (default) */\n .${gridLabelClass} { font-size: ${gridLabelFontSize}px !important; }\n .${axisLabelClass} { font-size: ${titleFontSize}px !important; }\n\n /* Tablet: Medium fonts */\n @media (min-width: 640px) {\n .${gridLabelClass} { font-size: ${gridLabelFontSize * 0.7}px !important; }\n .${axisLabelClass} { font-size: ${titleFontSize * 0.7}px !important; }\n }\n\n /* Desktop: Small fonts */\n @media (min-width: 1024px) {\n .${gridLabelClass} { font-size: ${gridLabelFontSize * 0.4}px !important; }\n .${axisLabelClass} { font-size: ${titleFontSize * 0.4}px !important; }\n }\n `}</style>\n <svg\n width=\"100%\"\n viewBox={`0 0 ${viewBoxWidth} ${viewBoxHeight}`}\n preserveAspectRatio=\"xMidYMid meet\"\n className=\"bg-white dark:bg-gray-800 block w-full\"\n style={{ height: 'auto', overflow: 'visible' }}\n >\n {/* Slices */}\n {slices.map((slice) => {\n const isHovered = hoveredSlice === slice.index;\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-opacity\"\n opacity={isHovered ? 0.8 : 1}\n onMouseEnter={(e) => {\n setHoveredSlice(slice.index);\n if (containerRef.current) {\n const rect = containerRef.current.getBoundingClientRect();\n const svgX = (e.clientX - rect.left);\n const svgY = (e.clientY - rect.top);\n setTooltipPosition(getTooltipPosition(svgX, svgY));\n }\n }}\n onMouseLeave={() => {\n setHoveredSlice(null);\n setTooltipPosition(null);\n }}\n />\n {/* Labels */}\n {showLabels && slice.percentage > 5 && (\n <text\n x={slice.labelX}\n y={slice.labelY}\n textAnchor=\"middle\"\n dominantBaseline=\"middle\"\n fontSize={gridLabelFontSize}\n fontWeight=\"600\"\n className={`fill-gray-700 dark:fill-gray-200 pointer-events-none ${gridLabelClass}`}\n >\n {showPercentages && `${slice.percentage.toFixed(1)}%`}\n {showPercentages && showValues && ' '}\n {showValues && `(${slice.value})`}\n {!showPercentages && !showValues && slice.label}\n </text>\n )}\n </g>\n );\n })}\n\n {/* Center label for donut */}\n {donut && (\n <g>\n <text\n x={centerX}\n y={centerY - 10}\n textAnchor=\"middle\"\n dominantBaseline=\"middle\"\n fontSize={titleFontSize}\n fontWeight=\"700\"\n className={`fill-gray-900 dark:fill-gray-100 ${axisLabelClass}`}\n >\n {total}\n </text>\n <text\n x={centerX}\n y={centerY + 15}\n textAnchor=\"middle\"\n dominantBaseline=\"middle\"\n fontSize={axisLabelFontSize}\n className={`fill-gray-600 dark:fill-gray-400 ${gridLabelClass}`}\n >\n Total\n </text>\n </g>\n )}\n </svg>\n\n {/* Legend */}\n {showLegend && (\n <div className=\"flex flex-wrap gap-3 justify-center px-4\">\n {data.map((item, index) => (\n <div\n key={`legend-${index}`}\n className=\"flex items-center gap-2 text-sm cursor-pointer\"\n onMouseEnter={() => setHoveredSlice(index)}\n onMouseLeave={() => setHoveredSlice(null)}\n >\n <div\n className=\"w-3 h-3 rounded-sm flex-shrink-0\"\n style={{\n backgroundColor: item.color || defaultColors[index % defaultColors.length],\n }}\n />\n <span className=\"text-gray-700 dark:text-gray-300\">\n {item.label}: {item.value}\n {showPercentages && ` (${((item.value / total) * 100).toFixed(1)}%)`}\n </span>\n </div>\n ))}\n </div>\n )}\n\n {/* Tooltip */}\n {hoveredSlice !== null && tooltipPosition && (\n <div\n className=\"absolute bg-gray-900 dark:bg-gray-700 text-white px-3 py-2 rounded shadow-lg pointer-events-none z-50 text-sm whitespace-nowrap\"\n style={{\n left: `${tooltipPosition.x}px`,\n top: `${tooltipPosition.y}px`,\n transform: 'translateZ(0)',\n }}\n >\n <div className=\"font-semibold\">{data[hoveredSlice].label}</div>\n <div className=\"text-xs opacity-90\">Value: {data[hoveredSlice].value}</div>\n <div className=\"text-xs opacity-90\">\n Percentage: {((data[hoveredSlice].value / total) * 100).toFixed(1)}%\n </div>\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","useEffect","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","useEffect","jsx","jsxs","sizeClasses","useState","useRef","jsx","jsxs","sizeClasses","useRef","useState","useState","useRef","useEffect","Fragment","jsx","jsxs","useState","useRef","useEffect","jsx","jsx","jsxs","forwardRef","jsx","jsxs","forwardRef","forwardRef","jsx","jsxs","forwardRef","jsx","variantStyles","jsx","sizeClasses","useState","jsx","jsxs","useState","jsx","jsxs","jsx","jsxs","useState","useRef","useEffect","createPortal","jsx","jsxs","useState","useRef","useEffect","createPortal","forwardRef","jsx","jsxs","forwardRef","useState","useRef","useEffect","createPortal","jsx","jsxs","DAYS","MONTHS","useState","useRef","useEffect","createPortal","useState","jsx","jsxs","DAYS","MONTHS","useState","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","jsx","jsxs","React","jsx","jsxs","defaultColors","React","jsx","jsxs","defaultColors","React","jsx","jsxs","defaultColors"]}