@underverse-ui/underverse 0.2.39 → 0.2.40

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../../../components/ui/Button.tsx","../../../lib/constants/constants-ui/button.ts","../../../lib/utils/cn.ts","../../../components/ui/Badge.tsx","../../../components/ui/Card.tsx","../../../components/ui/CheckBox.tsx","../../../components/ui/Input.tsx","../../../lib/i18n/translation-adapter.tsx","../../../components/ui/TagInput.tsx","../../../components/ui/Textarea.tsx","../../../components/ui/Switch.tsx","../../../components/ui/label.tsx","../../../components/ui/SmartImage.tsx","../../../components/ui/Avatar.tsx","../../../components/ui/Skeleton.tsx","../../../components/ui/Progress.tsx","../../../components/ui/Modal.tsx","../../../components/ui/Toast.tsx","../../../components/ui/Tooltip.tsx","../../../components/ui/Popover.tsx","../../../lib/utils/shadcn-animations.ts","../../../components/ui/Sheet.tsx","../../../components/ui/Alert.tsx","../../../components/ui/GlobalLoading.tsx","../../../lib/utils/loading.ts","../../../components/ui/Breadcrumb.tsx","../../../components/ui/Tab.tsx","../../../components/ui/DropdownMenu.tsx","../../../components/ui/Pagination.tsx","../../../components/ui/Combobox.tsx","../../../components/ui/Section.tsx","../../../components/ui/ScrollArea.tsx","../../../components/ui/DatePicker.tsx","../../../lib/utils/date.ts","../../../components/ui/TimePicker.tsx","../../../components/ui/Calendar.tsx","../../../components/ui/MultiCombobox.tsx","../../../components/ui/RadioGroup.tsx","../../../components/ui/Slider.tsx","../../../components/ui/OverlayControls.tsx","../../../components/ui/CategoryTreeSelect.tsx","../../../components/ui/ImageUpload.tsx","../../../components/ui/Carousel.tsx","../../../components/ui/FallingIcons.tsx","../../../components/ui/List.tsx","../../../components/ui/Watermark.tsx","../../../components/ui/Timeline.tsx","../../../components/ui/ColorPicker.tsx","../../../components/ui/Grid.tsx","../../../components/ui/ClientOnly.tsx","../../../components/ui/Loading.tsx","../../../components/ui/Table.tsx","../../../components/ui/DataTable.tsx","../../../components/ui/Form.tsx","../../../components/ui/NotificationModal.tsx","../../../components/ui/FloatingContacts.tsx","../../../components/ui/AccessDenied.tsx","../../../components/ui/ThemeToggleHeadless.tsx","../../../components/ui/LanguageSwitcherHeadless.tsx","../src/utils/cn.ts","../src/utils/date.ts","../src/utils/animations.ts","../../../lib/constants/constants-ui/alert.ts","../src/contexts/TranslationContext.tsx","../locales/en.json","../locales/vi.json","../locales/ko.json","../locales/ja.json","../src/hooks/useSmartTranslations.tsx"],"sourcesContent":["// Re-export UI components from the app source so we can bundle them here.\n// Note: Components that are coupled to app-specific APIs are intentionally excluded.\n\n// Core primitives\nexport { default as Button } from \"../../../components/ui/Button\";\nexport type { ButtonProps } from \"../../../components/ui/Button\";\nexport { default as Badge } from \"../../../components/ui/Badge\";\nexport {\n Badge as BadgeBase,\n NotificationBadge,\n StatusBadge,\n TagBadge,\n InteractiveBadge,\n GradientBadge,\n PulseBadge,\n} from \"../../../components/ui/Badge\";\nexport { default as Card } from \"../../../components/ui/Card\";\nexport { Checkbox } from \"../../../components/ui/CheckBox\";\nexport type { CheckboxProps } from \"../../../components/ui/CheckBox\";\nexport { default as Input } from \"../../../components/ui/Input\";\nexport type { InputProps } from \"../../../components/ui/Input\";\nexport { PasswordInput, NumberInput, SearchInput } from \"../../../components/ui/Input\";\nexport { default as TagInput, TagInput as TagInputBase } from \"../../../components/ui/TagInput\";\nexport type { TagInputProps } from \"../../../components/ui/TagInput\";\nexport { default as Textarea } from \"../../../components/ui/Textarea\";\nexport { default as Switch } from \"../../../components/ui/Switch\";\nexport { Label } from \"../../../components/ui/label\";\nexport { default as Avatar } from \"../../../components/ui/Avatar\";\nexport { default as Skeleton } from \"../../../components/ui/Skeleton\";\nexport * from \"../../../components/ui/Skeleton\";\nexport * from \"../../../components/ui/Progress\";\n\n// Feedback / overlays\nexport { default as Modal } from \"../../../components/ui/Modal\";\nexport { default as ToastProvider, useToast } from \"../../../components/ui/Toast\";\nexport { Tooltip } from \"../../../components/ui/Tooltip\";\nexport { Popover } from \"../../../components/ui/Popover\";\nexport { Sheet, Drawer, SlideOver, BottomSheet, SidebarSheet } from \"../../../components/ui/Sheet\";\nexport { default as Alert } from \"../../../components/ui/Alert\";\nexport { GlobalLoading, PageLoading, InlineLoading, ButtonLoading } from \"../../../components/ui/GlobalLoading\";\n\n// Navigation / structure\nexport { default as Breadcrumb } from \"../../../components/ui/Breadcrumb\";\nexport { Tabs, SimpleTabs, PillTabs, VerticalTabs } from \"../../../components/ui/Tab\";\nexport { default as DropdownMenu } from \"../../../components/ui/DropdownMenu\";\nexport { DropdownMenuItem, DropdownMenuSeparator, SelectDropdown } from \"../../../components/ui/DropdownMenu\";\nexport { Pagination, SimplePagination, CompactPagination } from \"../../../components/ui/Pagination\";\nexport type { PaginationProps, SimplePaginationProps, CompactPaginationProps } from \"../../../components/ui/Pagination\";\nexport { default as Section } from \"../../../components/ui/Section\";\nexport { ScrollArea } from \"../../../components/ui/ScrollArea\";\n\n// Pickers / inputs\nexport { DatePicker, DateRangePicker } from \"../../../components/ui/DatePicker\";\nexport type { DatePickerProps } from \"../../../components/ui/DatePicker\";\nexport { default as TimePicker } from \"../../../components/ui/TimePicker\";\nexport type { TimePickerProps } from \"../../../components/ui/TimePicker\";\nexport { default as Calendar } from \"../../../components/ui/Calendar\";\nexport type { CalendarProps, CalendarEvent } from \"../../../components/ui/Calendar\";\nexport { Combobox } from \"../../../components/ui/Combobox\";\nexport type { ComboboxProps } from \"../../../components/ui/Combobox\";\nexport { MultiCombobox } from \"../../../components/ui/MultiCombobox\";\nexport type { MultiComboboxProps } from \"../../../components/ui/MultiCombobox\";\nexport { RadioGroup, RadioGroupItem } from \"../../../components/ui/RadioGroup\";\nexport { Slider } from \"../../../components/ui/Slider\";\nexport { default as OverlayControls } from \"../../../components/ui/OverlayControls\";\nexport { CategoryTreeSelect } from \"../../../components/ui/CategoryTreeSelect\";\n\n// Media\nexport { default as SmartImage } from \"../../../components/ui/SmartImage\";\nexport { default as ImageUpload } from \"../../../components/ui/ImageUpload\";\nexport { Carousel } from \"../../../components/ui/Carousel\";\nexport { default as FallingIcons } from \"../../../components/ui/FallingIcons\";\nexport { default as List } from \"../../../components/ui/List\";\nexport { ListItem } from \"../../../components/ui/List\";\nexport { default as Watermark } from \"../../../components/ui/Watermark\";\nexport type { WatermarkProps } from \"../../../components/ui/Watermark\";\nexport { default as Timeline } from \"../../../components/ui/Timeline\";\nexport { TimelineItem } from \"../../../components/ui/Timeline\";\nexport { default as ColorPicker } from \"../../../components/ui/ColorPicker\";\nexport type { ColorPickerProps } from \"../../../components/ui/ColorPicker\";\nexport { default as Grid } from \"../../../components/ui/Grid\";\nexport { GridItem } from \"../../../components/ui/Grid\";\nexport type { GridProps, GridItemProps } from \"../../../components/ui/Grid\";\n\n// Misc\nexport { default as ClientOnly } from \"../../../components/ui/ClientOnly\";\nexport * from \"../../../components/ui/Loading\";\n// ThemeToggle depends on app-specific ThemeContext, not exported to keep package neutral\nexport { default as DataTable } from \"../../../components/ui/DataTable\";\nexport type { DataTableColumn, DataTableQuery, Sorter } from \"../../../components/ui/DataTable\";\nexport * from \"../../../components/ui/Table\";\nexport * from \"../../../components/ui/Form\";\nexport { default as NotificationModal } from \"../../../components/ui/NotificationModal\";\nexport { default as FloatingContacts } from \"../../../components/ui/FloatingContacts\";\nexport { default as AccessDenied } from \"../../../components/ui/AccessDenied\";\n\n// Headless, package-safe utilities\n// Export headless components under simple names\nexport { default as ThemeToggle } from \"../../../components/ui/ThemeToggleHeadless\";\nexport type { ThemeToggleHeadlessProps as ThemeToggleProps, ThemeMode } from \"../../../components/ui/ThemeToggleHeadless\";\nexport { default as LanguageSwitcher } from \"../../../components/ui/LanguageSwitcherHeadless\";\nexport type { LanguageSwitcherHeadlessProps as LanguageSwitcherProps, LanguageOption } from \"../../../components/ui/LanguageSwitcherHeadless\";\n\n// Back-compat (optional): keep headless aliases\nexport { default as ThemeToggleHeadless } from \"../../../components/ui/ThemeToggleHeadless\";\nexport type { ThemeToggleHeadlessProps } from \"../../../components/ui/ThemeToggleHeadless\";\nexport { default as LanguageSwitcherHeadless } from \"../../../components/ui/LanguageSwitcherHeadless\";\nexport type { LanguageSwitcherHeadlessProps } from \"../../../components/ui/LanguageSwitcherHeadless\";\n\n// ============================================================================\n// UTILITIES (standalone, no Next.js dependencies)\n// ============================================================================\n\n// Class name utility (cn)\nexport { cn } from \"../../../lib/utils/cn\";\nexport { cn as cnLocal } from \"./utils/cn\";\n\n// Date utilities with locale support (standalone)\nexport * as DateUtils from \"./utils/date\";\nexport type { SupportedLocale } from \"./utils/date\";\n\n// Animation utilities\nexport { shadcnAnimationStyles, useShadCNAnimations, injectAnimationStyles, getAnimationStyles } from \"./utils/animations\";\n\n// Constants for styling\nexport { VARIANT_STYLES_BTN, SIZE_STYLES_BTN } from \"../../../lib/constants/constants-ui/button\";\nexport { VARIANT_STYLES_ALERT } from \"../../../lib/constants/constants-ui/alert\";\n\n// ============================================================================\n// TRANSLATION SYSTEM (for React/Next.js without next-intl)\n// ============================================================================\n// TranslationProvider - Optional context for i18n support\n// When not wrapped in TranslationProvider, components use English fallback texts\nexport { TranslationProvider, useUnderverseTranslations, useUnderverseLocale } from \"./contexts/TranslationContext\";\nexport type { Locale, Translations, TranslationProviderProps } from \"./contexts/TranslationContext\";\n\n// UnderverseProvider - Alternative name for TranslationProvider (for standalone React usage)\nexport {\n UnderverseProvider,\n useTranslations as useUnderverseI18n,\n useLocale as useUnderverseI18nLocale,\n} from \"../../../lib/i18n/translation-adapter\";\nexport type { UnderverseProviderProps } from \"../../../lib/i18n/translation-adapter\";\n\n// Smart hooks that auto-detect next-intl or fallback to internal translations\nexport { useSmartTranslations, useSmartLocale, ForceInternalTranslationsProvider } from \"./hooks/useSmartTranslations\";\n\n// Excluded: NotificationBell (depends on project-specific API, auth, and sockets)\n\n// i18n messages for next-intl consumers\n// Provide ready-to-merge messages so apps can easily integrate underverse UI texts.\nimport en from \"../locales/en.json\";\nimport vi from \"../locales/vi.json\";\nimport ko from \"../locales/ko.json\";\nimport ja from \"../locales/ja.json\";\n\nexport const underverseMessages = { en, vi, ko, ja } as const;\nexport type UnderverseLocale = keyof typeof underverseMessages;\nexport function getUnderverseMessages(locale: UnderverseLocale = \"en\") {\n return underverseMessages[locale] || underverseMessages.en;\n}\n","\"use client\";\n\nimport React, { forwardRef, useCallback, useRef, useState } from \"react\";\nimport { VARIANT_STYLES_BTN, SIZE_STYLES_BTN } from \"@/lib/constants/constants-ui/button\";\nimport { cn } from \"@/lib/utils/cn\";\nimport { Activity } from \"lucide-react\";\n\n// Khai báo kiểu cho props\nexport interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n onClick?: (event: React.MouseEvent<HTMLButtonElement>) => void;\n children?: React.ReactNode;\n type?: \"button\" | \"submit\" | \"reset\";\n icon?: React.ComponentType<{ className?: string }>;\n iconRight?: React.ComponentType<{ className?: string }>;\n variant?: keyof typeof VARIANT_STYLES_BTN;\n size?: keyof typeof SIZE_STYLES_BTN;\n className?: string;\n iConClassName?: string;\n disabled?: boolean;\n loading?: boolean;\n fullWidth?: boolean;\n title?: string;\n // Nâng cấp: tuỳ biến spinner & UX khi loading\n spinner?: React.ComponentType<{ className?: string }>;\n loadingText?: React.ReactNode;\n preserveChildrenOnLoading?: boolean; // giữ nguyên children khi loading\n // Chống double-click vô ý\n preventDoubleClick?: boolean;\n lockMs?: number; // thời gian khóa nếu onClick không trả Promise\n // Layout flexibility\n asContainer?: boolean; // cho phép children tự do layout (không force items-center)\n // Ngăn xuống dòng khiến icon nằm trên, text nằm dưới\n noWrap?: boolean; // mặc định: true\n // Tắt overlay gradient hover mặc định\n noHoverOverlay?: boolean;\n // Bật nền gradient (alias cho variant=\"gradient\")\n gradient?: boolean;\n}\n\n// Sử dụng forwardRef để chuyển tiếp ref\nconst Button = forwardRef<HTMLButtonElement, ButtonProps>(\n (\n {\n onClick,\n children,\n type = \"button\",\n icon: Icon,\n iconRight: IconRight,\n variant = \"default\",\n size = \"md\",\n className = \"\",\n iConClassName = \"\",\n disabled = false,\n loading = false,\n fullWidth = false,\n title,\n spinner: Spinner,\n loadingText,\n preserveChildrenOnLoading = false,\n // custom behavior props (do not forward to DOM)\n preventDoubleClick = false,\n lockMs = 600,\n asContainer = false,\n noWrap = true,\n noHoverOverlay = false,\n gradient = false,\n ...rest\n },\n ref\n ) => {\n const baseStyles = asContainer\n ? \"relative inline-flex justify-center rounded-md font-medium transition-colors duration-150 ease-soft outline-none focus:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background active:translate-y-px\"\n : \"relative inline-flex items-center justify-center gap-2 rounded-md font-medium overflow-hidden transition-colors duration-150 ease-soft outline-none focus:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background active:translate-y-px\";\n\n const finalVariant = gradient ? \"gradient\" : variant;\n const variantStyle = VARIANT_STYLES_BTN[finalVariant] || VARIANT_STYLES_BTN.default;\n const sizeStyle = SIZE_STYLES_BTN[size] || SIZE_STYLES_BTN.md;\n\n const SpinnerIcon = Spinner ?? Activity;\n const [locked, setLocked] = useState(false);\n const lockTimer = useRef<NodeJS.Timeout | null>(null);\n\n const handleClick = useCallback(async (e: React.MouseEvent<HTMLButtonElement>) => {\n if (disabled || loading) return;\n\n if (preventDoubleClick) {\n if (locked) return;\n setLocked(true);\n try {\n const result = onClick?.(e) as unknown;\n if (result && typeof (result as any) === \"object\" && typeof (result as any).then === \"function\") {\n await (result as any);\n setLocked(false);\n } else {\n const ms = lockMs ?? 600;\n if (lockTimer.current) clearTimeout(lockTimer.current);\n lockTimer.current = setTimeout(() => setLocked(false), ms);\n }\n } catch (err) {\n setLocked(false);\n throw err;\n }\n } else {\n onClick?.(e);\n }\n }, [disabled, loading, onClick, locked, preventDoubleClick, lockMs]);\n\n const computedDisabled = disabled || loading || (preventDoubleClick ? locked : false);\n\n return (\n <button\n ref={ref}\n type={type}\n onClick={handleClick}\n title={title}\n className={cn(\n baseStyles,\n variantStyle,\n sizeStyle,\n \"group\",\n noWrap && \"whitespace-nowrap\",\n {\n \"cursor-pointer hover:opacity-95\": !computedDisabled,\n \"opacity-50 cursor-not-allowed\": computedDisabled,\n \"w-full\": fullWidth,\n },\n className\n )}\n disabled={computedDisabled}\n aria-disabled={computedDisabled}\n aria-busy={loading}\n data-variant={variant}\n data-size={size}\n data-locked={preventDoubleClick ? (locked ? \"true\" : \"false\") : undefined}\n aria-label={(rest as any)[\"aria-label\"] || title}\n {...rest}\n >\n {!noHoverOverlay && (\n <span className=\"absolute inset-0 bg-linear-to-r from-primary-foreground/20 to-transparent opacity-0 group-hover:opacity-100 transition-opacity duration-200 dark:hidden\" />\n )}\n {loading ? (\n <>\n <SpinnerIcon className=\"w-4 h-4 animate-spin\" />\n {loadingText && (\n <span className=\"ml-2\" aria-live=\"polite\">\n {loadingText}\n </span>\n )}\n {preserveChildrenOnLoading && !loadingText && (\n <span className=\"ml-2 opacity-70\" aria-hidden>\n {children}\n </span>\n )}\n </>\n ) : (\n <>\n {Icon && <Icon className={cn(\"transition-transform duration-200\", iConClassName ? iConClassName : \"w-5 h-5\")} />}\n {children}\n {IconRight && <IconRight className=\"w-4 h-4 transition-transform duration-200\" />}\n </>\n )}\n </button>\n );\n }\n);\n\nButton.displayName = \"Button\";\n\nexport default Button;\n","export const VARIANT_STYLES_BTN = {\n // Mặc định: tối giản, rõ ràng, dùng tokens hệ màu\n default:\n \"bg-background/80 backdrop-blur-sm text-foreground border border-border hover:bg-accent/50 focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background\",\n\n // Viền: trong suốt, viền tinh tế, hover nhẹ\n outline:\n \"bg-transparent backdrop-blur-sm border border-input hover:bg-accent/40 hover:text-accent-foreground focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background\",\n\n // Primary: dùng brand, bỏ hiệu ứng scale/shadow mạnh\n primary:\n \"bg-primary text-primary-foreground hover:bg-primary/90 shadow-sm border border-primary/20 focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background\",\n\n secondary:\n \"bg-secondary text-secondary-foreground hover:bg-secondary/90 shadow-sm border border-secondary/20 focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background\",\n\n success:\n \"bg-success text-success-foreground hover:bg-success/90 shadow-sm border border-success/20 focus-visible:ring-2 focus-visible:ring-success/60 focus-visible:ring-offset-2 focus-visible:ring-offset-background\",\n\n danger:\n \"bg-destructive text-destructive-foreground hover:bg-destructive/90 shadow-sm border border-destructive/20 focus-visible:ring-2 focus-visible:ring-destructive/60 focus-visible:ring-offset-2 focus-visible:ring-offset-background\",\n\n // Alias for shadcn-style prop naming used in some components\n destructive:\n \"bg-destructive text-destructive-foreground hover:bg-destructive/90 shadow-sm border border-destructive/20 focus-visible:ring-2 focus-visible:ring-destructive/60 focus-visible:ring-offset-2 focus-visible:ring-offset-background\",\n\n warning:\n \"bg-warning text-warning-foreground hover:bg-warning/90 shadow-sm border border-warning/20 focus-visible:ring-2 focus-visible:ring-warning/50 focus-visible:ring-offset-2 focus-visible:ring-offset-background\",\n\n info: \"bg-info text-info-foreground hover:bg-info/90 shadow-sm border border-info/20 focus-visible:ring-2 focus-visible:ring-info/60 focus-visible:ring-offset-2 focus-visible:ring-offset-background\",\n\n // Ghost: minimal\n ghost: \"bg-transparent hover:bg-accent/20 hover:text-accent-foreground backdrop-blur-sm transition-colors\",\n\n // Link: chỉ văn bản\n link: \"text-primary bg-transparent underline-offset-4 hover:underline hover:text-primary/85 transition-colors\",\n\n // Gradient: tuỳ chọn, giảm shadow\n gradient: \"bg-linear-to-r from-primary via-secondary to-accent text-primary-foreground hover:opacity-90 shadow-sm border border-primary/10\",\n};\n\nexport const SIZE_STYLES_BTN = {\n sm: \"px-3 py-1.5 text-sm h-8 min-w-8 md:px-2.5 md:py-1 md:h-7 md:text-xs\",\n md: \"px-4 py-2 text-sm h-10 min-w-10 md:px-3 md:py-1.5 md:h-9\",\n lg: \"px-6 py-3 text-base h-12 min-w-12 md:px-4 md:py-2 md:h-10 md:text-sm\",\n smx: \"px-3.5 py-1.5 text-[13px] h-9 min-w-9 md:px-3 md:py-1 md:h-8 md:text-xs\",\n icon: \"w-11 h-11 p-0 rounded-full flex items-center justify-center md:w-10 md:h-10\",\n};\n","import { clsx, type ClassValue } from \"clsx\";\r\nimport { twMerge } from \"tailwind-merge\";\r\n\r\nexport function cn(...inputs: ClassValue[]) {\r\n return twMerge(clsx(...inputs));\r\n}\r\n","import * as React from \"react\";\r\nimport { cn } from \"@/lib/utils/cn\";\r\n\r\ninterface BadgeProps {\n children?: React.ReactNode;\n variant?: \"default\" | \"primary\" | \"secondary\" | \"success\" | \"warning\" | \"danger\" | \"destructive\" | \"info\" | \"outline\" | \"ghost\" | \"transparent\" | \"gradient\";\n size?: \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n className?: string;\n dot?: boolean;\n count?: number;\n maxCount?: number;\n showZero?: boolean;\n pulse?: boolean;\n removable?: boolean;\n onRemove?: () => void;\n icon?: React.ComponentType<{ className?: string }>;\n clickable?: boolean;\n onClick?: () => void;\n}\n\r\nconst variantStyles = {\n default: \"bg-muted text-muted-foreground border-border/50 hover:bg-muted/80\",\n primary: \"bg-primary text-primary-foreground border-primary/20 hover:bg-primary/90\",\n secondary: \"bg-secondary text-secondary-foreground border-secondary/20 hover:bg-secondary/90\",\n success: \"bg-success text-success-foreground border-success/20 hover:bg-success/90\",\n warning: \"bg-warning text-warning-foreground border-warning/20 hover:bg-warning/90\",\n danger: \"bg-destructive text-destructive-foreground border-destructive/20 hover:bg-destructive/90\",\n destructive: \"bg-destructive text-destructive-foreground border-destructive/20 hover:bg-destructive/90\",\n info: \"bg-info text-info-foreground border-info/20 hover:bg-info/90\",\n outline: \"bg-transparent text-foreground border-border hover:bg-accent/50\",\n ghost: \"bg-transparent hover:bg-accent/20 hover:text-accent-foreground border-transparent transition-colors\",\n transparent: \"bg-transparent text-foreground border-transparent hover:bg-accent/30\",\n gradient: \"bg-linear-to-r from-primary to-secondary text-primary-foreground border-transparent hover:from-primary/90 hover:to-secondary/90\",\n};\n\r\nconst sizeStyles = {\r\n xs: \"px-1.5 py-0.5 text-xs font-medium min-h-[18px]\",\r\n sm: \"px-2 py-0.5 text-xs font-medium min-h-[20px]\",\r\n md: \"px-2.5 py-1 text-xs font-medium min-h-[24px]\",\r\n lg: \"px-3 py-1.5 text-sm font-medium min-h-[28px]\",\r\n xl: \"px-4 py-2 text-sm font-semibold min-h-[32px]\",\r\n};\r\n\r\nconst dotSizeStyles = {\r\n xs: \"w-1.5 h-1.5\",\r\n sm: \"w-2 h-2\",\r\n md: \"w-2.5 h-2.5\",\r\n lg: \"w-3 h-3\",\r\n xl: \"w-4 h-4\",\r\n};\r\n\r\nexport const Badge: React.FC<BadgeProps> = ({\r\n children,\r\n variant = \"default\",\r\n size = \"md\",\r\n className,\r\n dot = false,\r\n count,\r\n maxCount = 99,\r\n showZero = false,\r\n pulse = false,\r\n removable = false,\r\n onRemove,\r\n icon,\r\n clickable = false,\r\n onClick,\r\n}) => {\r\n const isCountBadge = typeof count === \"number\";\r\n const shouldShowCount = isCountBadge && (count > 0 || showZero);\r\n const displayCount = count && count > maxCount ? `${maxCount}+` : count;\r\n const Icon = icon;\r\n\r\n const handleClick = (e: React.MouseEvent) => {\r\n if (clickable && onClick) {\r\n e.preventDefault();\r\n onClick();\r\n }\r\n };\r\n\r\n const handleRemove = (e: React.MouseEvent) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n onRemove?.();\r\n };\r\n\r\n const baseClasses = cn(\r\n \"inline-flex items-center border transition-all duration-200\",\r\n \"focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-1\",\r\n clickable && \"cursor-pointer hover:shadow-sm active:scale-95\",\r\n pulse && \"animate-pulse\",\r\n variantStyles[variant]\r\n );\r\n\r\n if (dot) {\r\n return (\r\n <span\r\n className={cn(\r\n \"inline-flex rounded-full border\",\r\n dotSizeStyles[size],\r\n variantStyles[variant],\r\n pulse && \"animate-pulse\",\r\n clickable && \"cursor-pointer hover:scale-110\",\r\n className\r\n )}\r\n onClick={handleClick}\r\n />\r\n );\r\n }\r\n\r\n if (shouldShowCount) {\r\n return (\r\n <span\r\n className={cn(\r\n baseClasses,\r\n \"justify-center rounded-full\",\r\n \"min-w-6 h-6 px-1.5 text-xs font-bold\",\r\n size === \"xs\" && \"min-w-5 h-5 px-1 text-xs\",\r\n size === \"sm\" && \"min-w-6 h-6 px-1.5 text-xs\",\r\n size === \"md\" && \"min-w-7 h-7 px-2 text-xs\",\r\n size === \"lg\" && \"min-w-8 h-8 px-2.5 text-sm\",\r\n size === \"xl\" && \"min-w-9 h-9 px-3 text-sm\",\r\n className\r\n )}\r\n onClick={handleClick}\r\n role=\"status\"\r\n aria-live=\"polite\"\r\n >\r\n {displayCount}\r\n </span>\r\n );\r\n }\r\n\r\n return (\r\n <span className={cn(baseClasses, \"rounded-md gap-1\", sizeStyles[size], className)} onClick={handleClick} role=\"status\">\r\n {Icon && (\r\n <Icon\r\n className={cn(\r\n \"shrink-0\",\r\n size === \"xs\" && \"h-3 w-3\",\r\n size === \"sm\" && \"h-3 w-3\",\r\n size === \"md\" && \"h-4 w-4\",\r\n size === \"lg\" && \"h-4 w-4\",\r\n size === \"xl\" && \"h-5 w-5\"\r\n )}\r\n />\r\n )}\r\n\r\n {children}\r\n\r\n {removable && (\r\n <button\r\n onClick={handleRemove}\r\n className={cn(\r\n \"ml-1 rounded-full hover:bg-accent focus:outline-none focus:bg-accent\",\r\n \"transition-colors duration-150 shrink-0\",\r\n size === \"xs\" && \"h-3 w-3\",\r\n size === \"sm\" && \"h-3 w-3\",\r\n size === \"md\" && \"h-4 w-4\",\r\n size === \"lg\" && \"h-4 w-4\",\r\n size === \"xl\" && \"h-5 w-5\"\r\n )}\r\n aria-label=\"Remove badge\"\r\n >\r\n <svg className=\"h-full w-full\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6 18L18 6M6 6l12 12\" />\r\n </svg>\r\n </button>\r\n )}\r\n </span>\r\n );\r\n};\r\n\r\n// Notification Badge component - wrapper for positioning badges over other elements\r\ninterface NotificationBadgeProps {\r\n children: React.ReactNode;\r\n count?: number;\r\n maxCount?: number;\r\n showZero?: boolean;\r\n dot?: boolean;\r\n variant?: BadgeProps[\"variant\"];\r\n size?: BadgeProps[\"size\"];\r\n className?: string;\r\n badgeClassName?: string;\r\n position?: \"top-right\" | \"top-left\" | \"bottom-right\" | \"bottom-left\";\r\n pulse?: boolean;\r\n}\r\n\r\nconst positionStyles = {\r\n \"top-right\": \"-top-1 -right-1\",\r\n \"top-left\": \"-top-1 -left-1\",\r\n \"bottom-right\": \"-bottom-1 -right-1\",\r\n \"bottom-left\": \"-bottom-1 -left-1\",\r\n};\r\n\r\nexport const NotificationBadge: React.FC<NotificationBadgeProps> = ({\r\n children,\r\n count,\r\n maxCount = 99,\r\n showZero = false,\r\n dot = false,\r\n variant = \"danger\",\r\n size = \"sm\",\r\n className,\r\n badgeClassName,\r\n position = \"top-right\",\r\n pulse = false,\r\n}) => {\r\n const shouldShow = dot || (typeof count === \"number\" && (count > 0 || showZero));\r\n\r\n return (\r\n <div className={cn(\"relative inline-flex\", className)}>\r\n {children}\r\n {shouldShow && (\r\n <Badge\r\n count={count}\r\n maxCount={maxCount}\r\n showZero={showZero}\r\n dot={dot}\r\n variant={variant}\r\n size={size}\r\n pulse={pulse}\r\n className={cn(\"absolute transform scale-100 transition-transform duration-200\", positionStyles[position], \"shadow-sm\", badgeClassName)}\r\n aria-live=\"polite\"\r\n />\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\n// Specialized Badge components\r\ninterface StatusBadgeProps extends Omit<BadgeProps, \"variant\"> {\r\n status?: \"online\" | \"offline\" | \"busy\" | \"away\" | \"idle\";\r\n}\r\n\r\nexport const StatusBadge: React.FC<StatusBadgeProps> = ({ status = \"offline\", ...props }) => {\r\n const statusVariants = {\r\n online: \"success\",\r\n offline: \"default\",\r\n busy: \"danger\",\r\n away: \"warning\",\r\n idle: \"info\",\r\n } as const;\r\n\r\n return <Badge {...props} variant={statusVariants[status]} dot={true} pulse={status === \"online\"} />;\r\n};\r\n\r\ninterface TagBadgeProps extends Omit<BadgeProps, \"removable\"> {\r\n tags?: string[];\r\n onTagRemove?: (tag: string) => void;\r\n maxTags?: number;\r\n}\r\n\r\nexport const TagBadge: React.FC<TagBadgeProps> = ({ tags = [], onTagRemove, maxTags = 3, size = \"sm\", variant = \"outline\", className, ...props }) => {\r\n const displayTags = tags.slice(0, maxTags);\r\n const remainingCount = tags.length - maxTags;\r\n\r\n return (\r\n <div className={cn(\"flex flex-wrap gap-1\", className)}>\r\n {displayTags.map((tag, index) => (\r\n <Badge key={`${tag}-${index}`} {...props} variant={variant} size={size} removable={!!onTagRemove} onRemove={() => onTagRemove?.(tag)}>\r\n {tag}\r\n </Badge>\r\n ))}\r\n {remainingCount > 0 && (\r\n <Badge variant=\"ghost\" size={size}>\r\n +{remainingCount}\r\n </Badge>\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\ninterface InteractiveBadgeProps extends BadgeProps {\r\n active?: boolean;\r\n disabled?: boolean;\r\n}\r\n\r\nexport const InteractiveBadge: React.FC<InteractiveBadgeProps> = ({ active = false, disabled = false, variant = \"outline\", className, ...props }) => {\r\n return (\r\n <Badge\r\n {...props}\r\n variant={active ? \"primary\" : variant}\r\n clickable={!disabled}\r\n className={cn(\"select-none\", disabled && \"opacity-50 cursor-not-allowed\", !disabled && !active && \"hover:border-primary/50\", className)}\r\n />\r\n );\r\n};\r\n\r\ninterface GradientBadgeProps extends Omit<BadgeProps, \"variant\"> {\r\n from?: string;\r\n to?: string;\r\n}\r\n\r\nexport const GradientBadge: React.FC<GradientBadgeProps> = ({ from = \"from-primary\", to = \"to-secondary\", className, ...props }) => {\r\n return (\r\n <Badge\r\n {...props}\r\n variant=\"transparent\"\r\n className={cn(`bg-linear-to-r ${from} ${to} text-primary-foreground border-transparent`, \"hover:opacity-90\", className)}\r\n />\r\n );\r\n};\r\n\r\ninterface PulseBadgeProps extends BadgeProps {\r\n speed?: \"slow\" | \"normal\" | \"fast\";\r\n}\r\n\r\nexport const PulseBadge: React.FC<PulseBadgeProps> = ({ speed = \"normal\", className, ...props }) => {\r\n const speedClasses = {\r\n slow: \"animate-pulse [animation-duration:2s]\",\r\n normal: \"animate-pulse\",\r\n fast: \"animate-pulse [animation-duration:0.5s]\",\r\n };\r\n\r\n return <Badge {...props} pulse={false} className={cn(speedClasses[speed], className)} />;\r\n};\r\n\r\nexport default Badge;\r\n","\"use client\";\n// components/ui/Card.tsx\nimport React, { useState } from \"react\";\nimport { cn } from \"@/lib/utils/cn\";\n\n// Helper to detect padding classes per direction\nconst getPaddingInfo = (className?: string) => {\n if (!className) return { hasAll: false, hasX: false, hasY: false };\n\n // Check for all-direction padding (p-)\n const hasAll = /\\b(p)-\\d+|\\b(p)-\\[/.test(className) || /\\bmd:p-|lg:p-|sm:p-|xl:p-/.test(className);\n\n // Check for X-axis padding (px-, pl-, pr-, ps-, pe-)\n const hasX = /\\b(px|pl|pr|ps|pe)-/.test(className);\n\n // Check for Y-axis padding (py-, pt-, pb-)\n const hasY = /\\b(py|pt|pb)-/.test(className);\n\n return { hasAll, hasX, hasY };\n};\n\ninterface CardProps extends React.HTMLAttributes<HTMLDivElement> {\n title?: string;\n description?: string;\n footer?: React.ReactNode;\n className?: string;\n children?: React.ReactNode;\n hoverable?: boolean;\n clickable?: boolean;\n innerClassName?: string; // class for inner rounded wrapper\n contentClassName?: string; // class for content wrapper (if padding class provided, overrides default)\n noPadding?: boolean; // remove default body padding\n}\n\nconst Card = ({\n title,\n description,\n children,\n footer,\n className,\n hoverable = false,\n clickable = false,\n innerClassName,\n contentClassName,\n noPadding = false,\n onClick,\n ...rest\n}: CardProps) => {\n const [isHovered, setIsHovered] = useState(false);\n\n return (\n <div\n className={cn(\n \"rounded-lg md:rounded-xl bg-card text-card-foreground transition-all duration-300 ease-soft\",\n \"shadow-sm md:hover:shadow-md mx-2 md:mx-0 border border-border\",\n hoverable && \"md:hover:-translate-y-0.5 md:hover:border-primary/15\",\n clickable && \"cursor-pointer active:translate-y-px md:hover:bg-accent/5\",\n \"backdrop-blur-sm\",\n className\n )}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n onClick={onClick}\n {...rest}\n >\n <div className={cn(\"relative overflow-hidden rounded-xl\", innerClassName)}>\n {(hoverable || clickable) && (\n <div\n className={cn(\n \"absolute inset-0 bg-linear-to-br from-primary/5 to-transparent transition-opacity duration-300\",\n isHovered ? \"opacity-100\" : \"opacity-0\"\n )}\n />\n )}\n\n {(title || description) && (\n <div className=\"relative flex flex-col space-y-2 p-4 md:p-6\">\n {title && (\n <h3\n className={cn(\n \"text-base md:text-lg font-semibold leading-none tracking-tight transition-colors duration-200\",\n isHovered && hoverable && \"text-primary\"\n )}\n >\n {title}\n </h3>\n )}\n {description && <p className=\"text-sm md:text-base text-muted-foreground leading-relaxed\">{description}</p>}\n </div>\n )}\n\n {children &&\n (() => {\n const padding = getPaddingInfo(contentClassName);\n const skipAllPadding = noPadding || padding.hasAll;\n // Default X: px-4 md:px-6, Default Y: pt-0 pb-4 md:pb-6\n const defaultPaddingX = !skipAllPadding && !padding.hasX ? \"px-4 md:px-6\" : \"\";\n const defaultPaddingY = !skipAllPadding && !padding.hasY ? \"pt-0 pb-4 md:pb-6\" : \"\";\n\n return <div className={cn(\"relative\", defaultPaddingX, defaultPaddingY, contentClassName)}>{children}</div>;\n })()}\n {footer && <div className=\"relative flex items-center p-4 md:p-6 pt-0 border-t border-border mt-4\">{footer}</div>}\n </div>\n </div>\n );\n};\n\nexport default Card;\n","\"use client\";\r\n\r\nimport * as React from \"react\";\r\nimport { cn } from \"@/lib/utils/cn\";\r\nimport { Check } from \"lucide-react\";\r\n\r\nexport interface CheckboxProps extends React.InputHTMLAttributes<HTMLInputElement> {\n label?: React.ReactNode;\r\n labelClassName?: string;\r\n containerClassName?: string;\r\n}\r\n\r\nconst Checkbox = React.forwardRef<HTMLInputElement, CheckboxProps>(\r\n ({ className, label, labelClassName, containerClassName, checked, defaultChecked, onChange, ...props }, ref) => {\r\n const [internalChecked, setInternalChecked] = React.useState<boolean>(defaultChecked ?? false);\r\n\r\n const isControlled = checked !== undefined;\r\n const isChecked = isControlled ? checked : internalChecked;\r\n\r\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n if (!isControlled) {\r\n setInternalChecked(e.target.checked);\r\n }\r\n onChange?.(e);\r\n };\r\n\r\n return (\r\n <label className={cn(\"inline-flex items-center gap-2 cursor-pointer select-none\", containerClassName)}>\r\n <input type=\"checkbox\" ref={ref} checked={isChecked} onChange={handleChange} className=\"hidden\" {...props} />\r\n <div\r\n className={cn(\r\n \"w-5 h-5 border rounded-sm flex items-center justify-center transition-all duration-200 ease-soft\",\r\n \"hover:shadow-sm active:scale-95\",\r\n isChecked \r\n ? \"bg-primary border-primary shadow-md text-primary-foreground\" \r\n : \"bg-background border-input hover:border-accent-foreground/30 hover:bg-accent/10\"\r\n )}\r\n >\r\n {isChecked && <Check className=\"w-4 h-4\" />}\r\n </div>\r\n {label && <span className={cn(\"text-sm text-foreground\", labelClassName)}>{label}</span>}\r\n </label>\r\n );\r\n }\r\n);\r\n\r\nCheckbox.displayName = \"Checkbox\";\r\n\r\nexport { Checkbox };\r\n","// components/ui/Input.tsx\r\n\"use client\";\r\n\r\nimport React, { forwardRef, InputHTMLAttributes, useId, useState } from \"react\";\r\nimport { useTranslations } from \"@/lib/i18n/translation-adapter\";\r\nimport { cn } from \"@/lib/utils/cn\";\r\nimport { Eye, EyeOff, Search, X, AlertCircle, CheckCircle, Loader2 } from \"lucide-react\";\r\n\r\nexport interface InputProps extends Omit<InputHTMLAttributes<HTMLInputElement>, \"size\"> {\r\n label?: string;\r\n error?: string;\r\n description?: string;\r\n variant?: \"default\" | \"filled\" | \"outlined\" | \"minimal\";\r\n size?: \"sm\" | \"md\" | \"lg\";\r\n leftIcon?: React.ComponentType<{ className?: string }>;\r\n rightIcon?: React.ComponentType<{ className?: string }>;\r\n clearable?: boolean;\r\n loading?: boolean;\r\n success?: boolean;\r\n onClear?: () => void;\r\n hint?: string;\r\n counter?: boolean;\r\n maxLength?: number;\r\n}\r\n\r\nconst Input = forwardRef<HTMLInputElement, InputProps>(\r\n (\r\n {\r\n label,\r\n error,\r\n description,\r\n className,\r\n required,\r\n variant = \"default\",\r\n size = \"md\",\r\n leftIcon: LeftIcon,\r\n rightIcon: RightIcon,\r\n clearable = false,\r\n loading = false,\r\n success = false,\r\n onClear,\r\n hint,\r\n counter = false,\r\n type = \"text\",\r\n value,\r\n maxLength,\r\n ...rest\r\n },\r\n ref\r\n ) => {\r\n const [localError, setLocalError] = useState<string | undefined>(error);\r\n const [showPassword, setShowPassword] = useState(false);\r\n const [isFocused, setIsFocused] = useState(false);\r\n const tv = useTranslations(\"ValidationInput\");\r\n const autoId = useId();\r\n // Only attach a generated id when we need to reference it (label/description/error)\r\n const needsId = !!(label || description || hint || error);\r\n const resolvedId = (rest.id as string) || (needsId ? `input-${autoId}` : undefined);\r\n\r\n const errMsg = error || localError;\r\n const hasValue = value !== undefined && value !== null && value !== \"\";\r\n const charCount = typeof value === \"string\" ? value.length : 0;\r\n const errorId = errMsg && resolvedId ? `${resolvedId}-error` : undefined;\r\n const descId = !errMsg && (description || hint) && resolvedId ? `${resolvedId}-desc` : undefined;\r\n const containerSpacing = size === \"sm\" ? \"space-y-1.5\" : \"space-y-2\";\r\n\r\n // Variant styles\r\n const variantStyles = {\r\n default: {\r\n container: \"bg-background border border-input hover:border-accent-foreground/20\",\r\n focus:\r\n \"focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-1 focus-visible:ring-offset-background focus-visible:border-transparent\",\r\n error:\r\n \"border-destructive focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-destructive focus-visible:ring-offset-1 focus-visible:ring-offset-background focus-visible:border-transparent\",\r\n },\r\n filled: {\r\n container: \"bg-muted/50 border border-transparent hover:bg-muted/70\",\r\n focus:\r\n \"focus-visible:outline-none focus-visible:bg-background focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-1 focus-visible:ring-offset-background focus-visible:border-transparent\",\r\n error:\r\n \"bg-destructive/10 border-destructive focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-destructive focus-visible:ring-offset-1 focus-visible:ring-offset-background focus-visible:border-transparent\",\r\n },\r\n outlined: {\r\n container: \"bg-transparent border border-border hover:border-accent-foreground/30\",\r\n focus:\r\n \"focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-1 focus-visible:ring-offset-background focus-visible:border-transparent\",\r\n error:\r\n \"border-destructive focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-destructive focus-visible:ring-offset-1 focus-visible:ring-offset-background focus-visible:border-transparent\",\r\n },\r\n minimal: {\r\n container: \"bg-transparent border-0 border-b border-border hover:border-accent-foreground/30\",\r\n focus: \"focus-visible:outline-none focus-visible:border-ring focus-visible:ring-0 rounded-none\",\r\n error: \"border-destructive focus-visible:outline-none focus-visible:border-destructive\",\r\n },\r\n };\r\n\r\n // Size styles\r\n const sizeStyles = {\r\n sm: {\r\n input: \"px-3 py-1.5 text-sm h-8 md:h-7 md:py-1 md:text-xs\",\r\n icon: \"w-4 h-4\",\r\n button: \"h-7 w-7\",\r\n },\r\n md: {\r\n input: \"px-4 py-2 text-sm h-10\",\r\n icon: \"w-5 h-5\",\r\n button: \"h-8 w-8\",\r\n },\r\n lg: {\r\n input: \"px-5 py-4 text-base h-12\",\r\n icon: \"w-6 h-6\",\r\n button: \"h-10 w-10\",\r\n },\r\n };\r\n\r\n const getErrorKey = (v: ValidityState) => {\r\n if (v.valueMissing) return \"required\";\r\n if (v.typeMismatch) return \"typeMismatch\";\r\n if (v.patternMismatch) return \"pattern\";\r\n if (v.tooShort) return \"tooShort\";\r\n if (v.tooLong) return \"tooLong\";\r\n if (v.rangeUnderflow) return \"rangeUnderflow\";\r\n if (v.rangeOverflow) return \"rangeOverflow\";\r\n if (v.stepMismatch) return \"stepMismatch\";\r\n if (v.badInput) return \"badInput\";\r\n return \"invalid\";\r\n };\r\n\r\n // Status icon\r\n const getStatusIcon = () => {\r\n if (loading) return <Loader2 className={cn(\"animate-spin text-muted-foreground\", sizeStyles[size].icon)} />;\r\n if (success) return <CheckCircle className={cn(\"text-success\", sizeStyles[size].icon)} />;\r\n if (errMsg) return <AlertCircle className={cn(\"text-destructive\", sizeStyles[size].icon)} />;\r\n return null;\r\n };\r\n\r\n // Password toggle for password inputs\r\n const showPasswordToggle = type === \"password\";\r\n const actualType = showPasswordToggle && showPassword ? \"text\" : type;\r\n\r\n // Extract handlers and disabled state\r\n const { onFocus: onFocusProp, onBlur: onBlurProp, disabled } = rest;\r\n\r\n // Filter out custom props to create clean HTML attributes\r\n const {\r\n label: _label,\r\n error: _error,\r\n description: _description,\r\n variant: _variant,\r\n size: _size,\r\n leftIcon: _leftIcon,\r\n rightIcon: _rightIcon,\r\n clearable: _clearable,\r\n loading: _loading,\r\n success: _success,\r\n onClear: _onClear,\r\n hint: _hint,\r\n counter: _counter,\r\n ...restInput\r\n } = rest as any;\r\n\r\n const handleFocus: React.FocusEventHandler<HTMLInputElement> = (e) => {\r\n setIsFocused(true);\r\n onFocusProp?.(e);\r\n };\r\n\r\n const handleBlur: React.FocusEventHandler<HTMLInputElement> = (e) => {\r\n setIsFocused(false);\r\n onBlurProp?.(e);\r\n };\r\n\r\n // Radius by size for visual consistency with Combobox/DatePicker\r\n const radiusClass = size === \"sm\" ? \"rounded-md\" : \"rounded-lg\";\r\n\r\n return (\r\n <div className={cn(\"w-full group\", containerSpacing)}>\r\n {/* Label */}\r\n {label && (\r\n <div className=\"flex items-center justify-between\">\r\n <label\r\n className={cn(\r\n // Label size follows input size\r\n size === \"sm\" ? \"text-xs\" : size === \"lg\" ? \"text-base\" : \"text-sm\",\r\n \"font-medium transition-colors duration-200\",\r\n // default color and highlight while any descendant focused\r\n disabled ? \"text-muted-foreground\" : cn(\"text-foreground group-focus-within:text-primary\", success && \"text-primary\"),\r\n errMsg && \"text-destructive\"\r\n )}\r\n >\r\n {label}\r\n {required && <span className=\"text-destructive ml-1\">*</span>}\r\n </label>\r\n\r\n {counter && maxLength && (\r\n <span\r\n className={cn(\r\n \"text-xs transition-colors duration-200\",\r\n charCount > maxLength * 0.9 ? \"text-warning\" : \"text-muted-foreground\",\r\n charCount >= maxLength && \"text-destructive\"\r\n )}\r\n >\r\n {charCount}/{maxLength}\r\n </span>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* Input Container */}\r\n <div className=\"relative group\">\r\n {/* Left Icon */}\r\n {LeftIcon && (\r\n <div\r\n className={cn(\r\n \"absolute left-3 top-1/2 -translate-y-1/2 z-10\",\r\n \"text-muted-foreground transition-colors duration-200\",\r\n // highlight icon when input (or controls) focused\r\n \"group-focus-within:text-primary\"\r\n )}\r\n >\r\n <LeftIcon className={sizeStyles[size].icon} />\r\n </div>\r\n )}\r\n\r\n <input\r\n ref={ref}\r\n type={actualType}\r\n // NOTE: Only controlled when `value` prop is provided.\r\n {...(value !== undefined ? { value } : {})}\r\n maxLength={maxLength}\r\n required={required}\r\n id={resolvedId}\r\n autoComplete={type === \"password\" ? \"current-password\" : type === \"email\" ? \"email\" : rest.autoComplete}\r\n onFocus={handleFocus}\r\n onBlur={handleBlur}\r\n onInvalid={(e) => {\r\n e.preventDefault();\r\n const key = getErrorKey(e.currentTarget.validity);\r\n setLocalError(tv(key));\r\n }}\r\n onInput={() => setLocalError(undefined)}\r\n aria-invalid={!!errMsg}\r\n aria-describedby={[errorId, descId].filter(Boolean).join(\" \") || undefined}\r\n className={cn(\r\n \"w-full text-foreground transition-all duration-200 ease-out\",\r\n \"placeholder:text-muted-foreground focus:outline-none focus-visible:outline-none\",\r\n \"disabled:cursor-not-allowed disabled:opacity-50\",\r\n\r\n // Size styles\r\n sizeStyles[size].input,\r\n radiusClass,\r\n\r\n // Icon padding adjustments\r\n LeftIcon && \"pl-10\",\r\n (RightIcon || showPasswordToggle || clearable || loading || success || errMsg) && \"pr-10\",\r\n\r\n // Variant styles\r\n variantStyles[variant].container,\r\n errMsg ? variantStyles[variant].error : variantStyles[variant].focus,\r\n\r\n // Reduce visual weight for sm: no default drop shadows\r\n size !== \"sm\" && variant !== \"minimal\" && \"shadow-sm\",\r\n size !== \"sm\" && isFocused && \"shadow-md\",\r\n\r\n className\r\n )}\r\n disabled={disabled}\r\n {...restInput}\r\n />\r\n\r\n {/* Right Icons */}\r\n <div className=\"absolute right-3 top-1/2 -translate-y-1/2 flex items-center gap-1\">\r\n {/* Status Icon */}\r\n {getStatusIcon()}\r\n\r\n {/* Custom Right Icon */}\r\n {RightIcon && !loading && !success && !errMsg && <RightIcon className={cn(\"text-muted-foreground\", sizeStyles[size].icon)} />}\r\n\r\n {/* Clear Button */}\r\n {clearable && hasValue && !loading && (\r\n <button\r\n type=\"button\"\r\n onClick={() => {\r\n if (onClear) return onClear();\r\n (rest.onChange as any)?.({ target: { value: \"\" } });\r\n }}\r\n className={cn(\r\n \"flex items-center justify-center text-muted-foreground hover:text-foreground transition-colors rounded-sm\",\r\n \"focus:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1\",\r\n \"active:bg-accent active:text-accent-foreground\",\r\n sizeStyles[size].button\r\n )}\r\n tabIndex={0}\r\n aria-label=\"Clear input\"\r\n >\r\n <X className={sizeStyles[size].icon} />\r\n </button>\r\n )}\r\n\r\n {/* Password Toggle */}\r\n {showPasswordToggle && (\r\n <button\r\n type=\"button\"\r\n onClick={() => setShowPassword(!showPassword)}\r\n className={cn(\r\n \"flex items-center justify-center text-muted-foreground hover:text-foreground transition-colors rounded-full\",\r\n \"focus:outline-none focus-visible:ring-1 focus-visible:ring-ring/40\",\r\n \"active:bg-accent/50 active:text-accent-foreground\",\r\n sizeStyles[size].button\r\n )}\r\n tabIndex={0}\r\n aria-label={showPassword ? \"Hide password\" : \"Show password\"}\r\n >\r\n {showPassword ? <EyeOff className={sizeStyles[size].icon} /> : <Eye className={sizeStyles[size].icon} />}\r\n </button>\r\n )}\r\n </div>\r\n\r\n {/* Focus Indicator for minimal variant */}\r\n {variant === \"minimal\" && (\r\n <div\r\n className={cn(\r\n \"absolute bottom-0 left-0 h-0.5 bg-linear-to-r from-primary to-primary/60 transition-all duration-300\",\r\n // default hidden\r\n \"w-0 opacity-0\",\r\n // expand underline when focused within input container\r\n \"group-focus-within:w-full group-focus-within:opacity-100\"\r\n )}\r\n />\r\n )}\r\n </div>\r\n\r\n {/* Error Message */}\r\n {errMsg && (\r\n <div id={errorId} className=\"flex items-center gap-2 text-sm text-destructive animate-in slide-in-from-top-1 duration-200\">\r\n <AlertCircle className=\"w-4 h-4 shrink-0\" />\r\n <span>{errMsg}</span>\r\n </div>\r\n )}\r\n\r\n {/* Description/Hint */}\r\n {(description || hint) && !errMsg && (\r\n <p\r\n id={descId}\r\n className={cn(\r\n \"text-xs transition-colors duration-200\",\r\n // follow focus state of the whole field area\r\n \"text-muted-foreground group-focus-within:text-primary/70\"\r\n )}\r\n >\r\n {hint || description}\r\n </p>\r\n )}\r\n </div>\r\n );\r\n }\r\n);\r\n\r\nInput.displayName = \"Input\";\r\n\r\n// Search Input - specialized for search functionality\r\ninterface SearchInputProps extends Omit<InputProps, \"leftIcon\" | \"type\"> {\r\n onSearch?: (value: string) => void;\r\n searchDelay?: number;\r\n}\r\n\r\nexport const SearchInput = forwardRef<HTMLInputElement, SearchInputProps>(\r\n ({ onSearch, searchDelay = 300, placeholder = \"Search...\", ...props }, ref) => {\r\n const [searchValue, setSearchValue] = useState(props.value || \"\");\r\n\r\n // Debounced search\r\n React.useEffect(() => {\r\n if (!onSearch) return;\r\n\r\n const timer = setTimeout(() => {\r\n onSearch(searchValue as string);\r\n }, searchDelay);\r\n\r\n return () => clearTimeout(timer);\r\n }, [searchValue, onSearch, searchDelay]);\r\n\r\n return (\r\n <Input\r\n ref={ref}\r\n type=\"search\"\r\n leftIcon={Search}\r\n placeholder={placeholder}\r\n clearable\r\n value={searchValue}\r\n onChange={(e) => setSearchValue(e.target.value)}\r\n onClear={() => setSearchValue(\"\")}\r\n {...props}\r\n />\r\n );\r\n }\r\n);\r\n\r\nSearchInput.displayName = \"SearchInput\";\r\n\r\n// Password Input - enhanced password field\r\ninterface PasswordInputProps extends Omit<InputProps, \"type\"> {\r\n showStrength?: boolean;\r\n strengthLabels?: string[];\r\n}\r\n\r\nexport const PasswordInput = forwardRef<HTMLInputElement, PasswordInputProps>(\r\n ({ showStrength = false, strengthLabels = [\"Weak\", \"Fair\", \"Good\", \"Strong\"], ...props }, ref) => {\r\n const getPasswordStrength = (password: string): number => {\r\n let score = 0;\r\n if (password.length >= 8) score++;\r\n if (/[a-z]/.test(password)) score++;\r\n if (/[A-Z]/.test(password)) score++;\r\n if (/[0-9]/.test(password)) score++;\r\n if (/[^A-Za-z0-9]/.test(password)) score++;\r\n return Math.min(score, 4);\r\n };\r\n\r\n const strength = showStrength && typeof props.value === \"string\" ? getPasswordStrength(props.value) : 0;\r\n const strengthColors = [\"bg-destructive\", \"bg-warning\", \"bg-warning\", \"bg-success\"];\r\n const strengthLabel = strengthLabels[strength - 1];\r\n\r\n return (\r\n <div className=\"space-y-2\">\r\n <Input ref={ref} type=\"password\" {...props} />\r\n\r\n {showStrength && props.value && (\r\n <div className=\"space-y-1\">\r\n <div className=\"flex gap-1\">\r\n {[1, 2, 3, 4].map((level) => (\r\n <div\r\n key={level}\r\n className={cn(\r\n \"h-1 flex-1 rounded-full transition-colors duration-300\",\r\n level <= strength ? strengthColors[strength - 1] : \"bg-muted\"\r\n )}\r\n />\r\n ))}\r\n </div>\r\n {strengthLabel && (\r\n <p\r\n className={cn(\r\n \"text-xs font-medium\",\r\n strength <= 1 ? \"text-destructive\" : strength <= 2 ? \"text-warning\" : strength <= 3 ? \"text-warning\" : \"text-success\"\r\n )}\r\n >\r\n {strengthLabel}\r\n </p>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n }\r\n);\r\n\r\nPasswordInput.displayName = \"PasswordInput\";\r\n\r\n// Number Input - enhanced numeric input\r\ninterface NumberInputProps extends Omit<InputProps, \"type\" | \"value\" | \"onChange\"> {\r\n min?: number;\r\n max?: number;\r\n step?: number;\r\n showSteppers?: boolean;\r\n onIncrement?: () => void;\r\n onDecrement?: () => void;\r\n formatThousands?: boolean;\r\n locale?: string;\r\n value?: number | string;\r\n onChange?: React.ChangeEventHandler<HTMLInputElement>;\r\n}\r\n\r\nexport const NumberInput = forwardRef<HTMLInputElement, NumberInputProps>(\r\n (\r\n { min, max, step = 1, showSteppers = true, onIncrement, onDecrement, formatThousands = false, locale = \"vi-VN\", value, onChange, ...props },\r\n ref\r\n ) => {\r\n const toNumber = (v: any): number => {\r\n if (v === \"\" || v === undefined || v === null) return 0;\r\n const n = Number(v);\r\n return Number.isFinite(n) ? n : 0;\r\n };\r\n\r\n const format = React.useCallback((n: number) => new Intl.NumberFormat(locale, { maximumFractionDigits: 0 }).format(n), [locale]);\r\n\r\n const parse = (s: string) => {\r\n // Remove all non-digits; treat empty as NaN\r\n const digits = (s || \"\").replace(/\\D+/g, \"\");\r\n return digits ? Number(digits) : NaN;\r\n };\r\n\r\n const [displayValue, setDisplayValue] = React.useState<string>(\r\n formatThousands ? (value !== undefined && value !== null && value !== \"\" ? format(toNumber(value)) : \"\") : String(value ?? \"\")\r\n );\r\n\r\n const currentValue = toNumber(value);\r\n\r\n React.useEffect(() => {\r\n if (formatThousands) {\r\n const next = value === \"\" || value === undefined || value === null ? \"\" : format(toNumber(value));\r\n setDisplayValue((prev) => (prev === next ? prev : next));\r\n } else {\r\n const next = String(value ?? \"\");\r\n setDisplayValue((prev) => (prev === next ? prev : next));\r\n }\r\n }, [value, formatThousands, locale, format]);\r\n\r\n const handleIncrement = () => {\r\n if (onIncrement) {\r\n onIncrement();\r\n } else if (onChange) {\r\n const newValue = Math.min(currentValue + step, max ?? Infinity);\r\n if (formatThousands) setDisplayValue(format(newValue));\r\n onChange({ target: { value: newValue.toString() } } as any);\r\n }\r\n };\r\n\r\n const handleDecrement = () => {\r\n if (onDecrement) {\r\n onDecrement();\r\n } else if (onChange) {\r\n const newValue = Math.max(currentValue - step, min ?? -Infinity);\r\n if (formatThousands) setDisplayValue(format(newValue));\r\n onChange({ target: { value: newValue.toString() } } as any);\r\n }\r\n };\r\n\r\n return (\r\n <div className=\"relative\">\r\n <Input\r\n ref={ref}\r\n type={formatThousands ? \"text\" : \"number\"}\r\n min={min}\r\n max={max}\r\n step={step}\r\n rightIcon={showSteppers ? undefined : props.rightIcon}\r\n value={displayValue}\r\n onChange={(e) => {\r\n if (!onChange) return;\r\n if (!formatThousands) return onChange(e);\r\n const raw = e.target.value;\r\n const parsed = parse(raw);\r\n if (Number.isNaN(parsed)) {\r\n setDisplayValue(\"\");\r\n onChange({ target: { value: \"\" } } as any);\r\n } else {\r\n const bounded = Math.min(Math.max(parsed, min ?? -Infinity), max ?? Infinity);\r\n setDisplayValue(format(bounded));\r\n onChange({ target: { value: bounded.toString() } } as any);\r\n }\r\n }}\r\n {...props}\r\n className={cn(\r\n showSteppers && [\r\n \"pr-12\",\r\n // Hide native browser steppers\r\n \"[&::-webkit-outer-spin-button]:appearance-none\",\r\n \"[&::-webkit-inner-spin-button]:appearance-none\",\r\n \"[&::-webkit-inner-spin-button]:m-0\",\r\n \"appearance-none\",\r\n ],\r\n props.className\r\n )}\r\n />\r\n {showSteppers && (\r\n <div className=\"absolute right-2 top-1/2 -translate-y-1/2 flex flex-col gap-0.5\">\r\n <button\r\n type=\"button\"\r\n onClick={handleIncrement}\r\n disabled={max !== undefined && currentValue >= max}\r\n className={cn(\r\n \"flex items-center justify-center w-4 h-4 rounded-sm transition-colors\",\r\n \"hover:bg-accent focus:outline-none focus:bg-accent\",\r\n \"disabled:opacity-50 disabled:cursor-not-allowed disabled:hover:bg-transparent\",\r\n \"text-muted-foreground hover:text-foreground\"\r\n )}\r\n aria-label=\"Increase value\"\r\n >\r\n <svg width=\"8\" height=\"8\" viewBox=\"0 0 8 8\" fill=\"none\" className=\"shrink-0\">\r\n <path d=\"M4 2L6 6H2L4 2Z\" fill=\"currentColor\" />\r\n </svg>\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={handleDecrement}\r\n disabled={min !== undefined && currentValue <= min}\r\n className={cn(\r\n \"flex items-center justify-center w-4 h-4 rounded-sm transition-colors\",\r\n \"hover:bg-accent focus:outline-none focus:bg-accent\",\r\n \"disabled:opacity-50 disabled:cursor-not-allowed disabled:hover:bg-transparent\",\r\n \"text-muted-foreground hover:text-foreground\"\r\n )}\r\n aria-label=\"Decrease value\"\r\n >\r\n <svg width=\"8\" height=\"8\" viewBox=\"0 0 8 8\" fill=\"none\" className=\"shrink-0\">\r\n <path d=\"M4 6L2 2H6L4 6Z\" fill=\"currentColor\" />\r\n </svg>\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n }\r\n);\r\n\r\nNumberInput.displayName = \"NumberInput\";\r\n\r\n// Textarea - multi-line text input\r\ninterface TextareaProps extends React.TextareaHTMLAttributes<HTMLTextAreaElement> {\r\n label?: string;\r\n error?: string;\r\n description?: string;\r\n variant?: \"default\" | \"filled\" | \"outlined\" | \"minimal\";\r\n resize?: \"none\" | \"vertical\" | \"horizontal\" | \"both\";\r\n counter?: boolean;\r\n}\r\n\r\nexport const Textarea = forwardRef<HTMLTextAreaElement, TextareaProps>(\r\n (\r\n { label, error, description, variant = \"default\", resize = \"vertical\", counter = false, className, required, value, maxLength, ...props },\r\n ref\r\n ) => {\r\n const [isFocused, setIsFocused] = useState(false);\r\n const charCount = typeof value === \"string\" ? value.length : 0;\r\n\r\n const variantStyles = {\r\n default:\r\n \"bg-background border border-input hover:border-accent-foreground/20 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-1 focus-visible:ring-offset-background focus-visible:border-transparent\",\r\n filled:\r\n \"bg-muted/50 border border-transparent hover:bg-muted/70 focus-visible:outline-none focus-visible:bg-background focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-1 focus-visible:ring-offset-background focus-visible:border-transparent\",\r\n outlined:\r\n \"bg-transparent border border-border hover:border-accent-foreground/30 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-1 focus-visible:ring-offset-background focus-visible:border-transparent\",\r\n minimal:\r\n \"bg-transparent border-0 border-b border-border hover:border-accent-foreground/30 focus-visible:outline-none focus-visible:border-ring focus-visible:ring-0 rounded-none\",\r\n };\r\n\r\n const resizeClasses = {\r\n none: \"resize-none\",\r\n vertical: \"resize-y\",\r\n horizontal: \"resize-x\",\r\n both: \"resize\",\r\n };\r\n\r\n return (\r\n <div className=\"w-full space-y-2\">\r\n {/* Label */}\r\n {label && (\r\n <div className=\"flex items-center justify-between\">\r\n <label\r\n className={cn(\r\n \"text-sm font-medium transition-colors duration-200\",\r\n isFocused ? \"text-primary\" : \"text-foreground\",\r\n error && \"text-destructive\"\r\n )}\r\n >\r\n {label}\r\n {required && <span className=\"text-destructive ml-1\">*</span>}\r\n </label>\r\n\r\n {counter && maxLength && (\r\n <span\r\n className={cn(\r\n \"text-xs transition-colors duration-200\",\r\n charCount > maxLength * 0.9 ? \"text-warning\" : \"text-muted-foreground\",\r\n charCount >= maxLength && \"text-destructive\"\r\n )}\r\n >\r\n {charCount}/{maxLength}\r\n </span>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* Textarea */}\r\n <textarea\r\n ref={ref}\r\n value={value}\r\n maxLength={maxLength}\r\n required={required}\r\n onFocus={() => setIsFocused(true)}\r\n onBlur={() => setIsFocused(false)}\r\n className={cn(\r\n \"w-full rounded-lg px-4 py-3 text-sm text-foreground transition-all duration-200\",\r\n \"placeholder:text-muted-foreground focus:outline-none min-h-[80px]\",\r\n \"disabled:cursor-not-allowed disabled:opacity-50\",\r\n variantStyles[variant],\r\n // DÒNG NÀY ĐÃ ĐƯỢC CẬP NHẬT:\r\n error &&\r\n \"border-destructive focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-destructive focus-visible:ring-offset-1 focus-visible:ring-offset-background focus-visible:border-transparent\",\r\n resizeClasses[resize],\r\n isFocused && \"shadow-md\",\r\n variant !== \"minimal\" && \"shadow-sm\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n\r\n {/* Error Message */}\r\n {error && (\r\n <div className=\"flex items-center gap-2 text-sm text-destructive animate-in slide-in-from-top-1 duration-200\">\r\n <AlertCircle className=\"w-4 h-4 shrink-0\" />\r\n <span>{error}</span>\r\n </div>\r\n )}\r\n\r\n {/* Description */}\r\n {description && !error && (\r\n <p className={cn(\"text-xs transition-colors duration-200\", isFocused ? \"text-primary/70\" : \"text-muted-foreground\")}>{description}</p>\r\n )}\r\n </div>\r\n );\r\n }\r\n);\r\n\r\nTextarea.displayName = \"Textarea\";\r\n\r\nexport default Input;\r\n","\"use client\";\n\n/**\n * Translation adapter for Underverse UI components.\n *\n * This module provides a unified translation interface that:\n * 1. Uses next-intl when available (for Next.js projects)\n * 2. Falls back to @underverse-ui/underverse's internal translations\n *\n * Components should import from this file instead of directly from next-intl\n * to ensure compatibility with both Next.js and React projects.\n */\n\nimport * as React from \"react\";\n\n// ============================================================================\n// Default translations (fallback when next-intl is not available)\n// ============================================================================\ntype TranslationValue = string | Record<string, string>;\ntype NamespaceTranslations = Record<string, TranslationValue>;\ntype LocaleTranslations = Record<string, NamespaceTranslations>;\n\nconst defaultTranslations: Record<string, LocaleTranslations> = {\n en: {\n Common: {\n close: \"Close\",\n closeAlert: \"Close alert\",\n notifications: \"Notifications\",\n newNotification: \"New\",\n readStatus: \"Read\",\n openLink: \"Open link\",\n theme: \"Theme\",\n lightTheme: \"Light\",\n darkTheme: \"Dark\",\n systemTheme: \"System\",\n density: \"Density\",\n compact: \"Compact\",\n normal: \"Normal\",\n comfortable: \"Comfortable\",\n columns: \"Columns\",\n },\n ValidationInput: {\n required: \"This field is required\",\n typeMismatch: \"Invalid format\",\n pattern: \"Invalid pattern\",\n tooShort: \"Too short\",\n tooLong: \"Too long\",\n rangeUnderflow: \"Below minimum\",\n rangeOverflow: \"Above maximum\",\n stepMismatch: \"Step mismatch\",\n badInput: \"Bad input\",\n invalid: \"Invalid value\",\n },\n Loading: {\n loadingPage: \"Loading page\",\n pleaseWait: \"Please wait\",\n },\n DatePicker: {\n placeholder: \"Select date\",\n today: \"Today\",\n clear: \"Clear\",\n },\n Pagination: {\n navigationLabel: \"Pagination navigation\",\n showingResults: \"Showing {startItem}–{endItem} of {totalItems}\",\n firstPage: \"First page\",\n previousPage: \"Previous page\",\n previous: \"Previous\",\n nextPage: \"Next page\",\n next: \"Next\",\n lastPage: \"Last page\",\n pageNumber: \"Page {page}\",\n itemsPerPage: \"Items per page\",\n search: \"Search\",\n noOptions: \"No options\",\n },\n Form: {\n required: \"This field is required\",\n },\n OCR: {\n imageUpload: {\n dragDropText: \"Drag & drop files here\",\n browseFiles: \"Browse files\",\n supportedFormats: \"Supported formats: images\",\n },\n },\n },\n vi: {\n Common: {\n close: \"Đóng\",\n closeAlert: \"Đóng cảnh báo\",\n notifications: \"Thông báo\",\n newNotification: \"Mới\",\n readStatus: \"Đã đọc\",\n openLink: \"Mở liên kết\",\n theme: \"Chủ đề\",\n lightTheme: \"Giao diện sáng\",\n darkTheme: \"Giao diện tối\",\n systemTheme: \"Theo hệ thống\",\n density: \"Mật độ\",\n compact: \"Gọn\",\n normal: \"Thường\",\n comfortable: \"Thoải mái\",\n columns: \"Cột\",\n },\n ValidationInput: {\n required: \"Trường này là bắt buộc\",\n typeMismatch: \"Định dạng không hợp lệ\",\n pattern: \"Sai mẫu\",\n tooShort: \"Quá ngắn\",\n tooLong: \"Quá dài\",\n rangeUnderflow: \"Nhỏ hơn giá trị tối thiểu\",\n rangeOverflow: \"Lớn hơn giá trị tối đa\",\n stepMismatch: \"Sai bước\",\n badInput: \"Giá trị không hợp lệ\",\n invalid: \"Giá trị không hợp lệ\",\n },\n Loading: {\n loadingPage: \"Đang tải trang\",\n pleaseWait: \"Vui lòng chờ\",\n },\n DatePicker: {\n placeholder: \"Chọn ngày\",\n today: \"Hôm nay\",\n clear: \"Xóa\",\n },\n Pagination: {\n navigationLabel: \"Điều hướng phân trang\",\n showingResults: \"Hiển thị {startItem}–{endItem} trong tổng {totalItems}\",\n firstPage: \"Trang đầu\",\n previousPage: \"Trang trước\",\n previous: \"Trước\",\n nextPage: \"Trang sau\",\n next: \"Sau\",\n lastPage: \"Trang cuối\",\n pageNumber: \"Trang {page}\",\n itemsPerPage: \"Số mục/trang\",\n search: \"Tìm kiếm\",\n noOptions: \"Không có lựa chọn\",\n },\n Form: {\n required: \"Trường này là bắt buộc\",\n },\n OCR: {\n imageUpload: {\n dragDropText: \"Kéo & thả ảnh vào đây\",\n browseFiles: \"Chọn tệp\",\n supportedFormats: \"Hỗ trợ các định dạng ảnh\",\n },\n },\n },\n ko: {\n Common: {\n close: \"닫기\",\n closeAlert: \"알림 닫기\",\n notifications: \"알림\",\n newNotification: \"새로운\",\n readStatus: \"읽음\",\n openLink: \"링크 열기\",\n theme: \"테마\",\n lightTheme: \"라이트\",\n darkTheme: \"다크\",\n systemTheme: \"시스템\",\n density: \"밀도\",\n compact: \"컴팩트\",\n normal: \"보통\",\n comfortable: \"여유\",\n columns: \"열\",\n },\n ValidationInput: {\n required: \"필수 입력 항목입니다\",\n typeMismatch: \"형식이 올바르지 않습니다\",\n pattern: \"패턴이 일치하지 않습니다\",\n tooShort: \"너무 짧습니다\",\n tooLong: \"너무 깁니다\",\n rangeUnderflow: \"최솟값보다 작습니다\",\n rangeOverflow: \"최댓값을 초과했습니다\",\n stepMismatch: \"단계가 일치하지 않습니다\",\n badInput: \"잘못된 입력입니다\",\n invalid: \"유효하지 않은 값입니다\",\n },\n Loading: {\n loadingPage: \"페이지 로딩 중\",\n pleaseWait: \"잠시만 기다려 주세요\",\n },\n DatePicker: {\n placeholder: \"날짜 선택\",\n today: \"오늘\",\n clear: \"지우기\",\n },\n Pagination: {\n navigationLabel: \"페이지 네비게이션\",\n showingResults: \"{startItem}–{endItem} / 총 {totalItems}개\",\n firstPage: \"첫 페이지\",\n previousPage: \"이전 페이지\",\n previous: \"이전\",\n nextPage: \"다음 페이지\",\n next: \"다음\",\n lastPage: \"마지막 페이지\",\n pageNumber: \"{page}페이지\",\n itemsPerPage: \"페이지당 항목 수\",\n search: \"검색\",\n noOptions: \"옵션 없음\",\n },\n Form: {\n required: \"필수 입력 항목입니다\",\n },\n OCR: {\n imageUpload: {\n dragDropText: \"여기에 파일을 드래그 앤 드롭하세요\",\n browseFiles: \"파일 찾아보기\",\n supportedFormats: \"지원 형식: 이미지\",\n },\n },\n },\n ja: {\n Common: {\n close: \"閉じる\",\n closeAlert: \"アラートを閉じる\",\n notifications: \"通知\",\n newNotification: \"新規\",\n readStatus: \"既読\",\n openLink: \"リンクを開く\",\n theme: \"テーマ\",\n lightTheme: \"ライト\",\n darkTheme: \"ダーク\",\n systemTheme: \"システム\",\n density: \"密度\",\n compact: \"コンパクト\",\n normal: \"通常\",\n comfortable: \"ゆったり\",\n columns: \"列\",\n },\n ValidationInput: {\n required: \"この項目は必須です\",\n typeMismatch: \"形式が正しくありません\",\n pattern: \"パターンが一致しません\",\n tooShort: \"短すぎます\",\n tooLong: \"長すぎます\",\n rangeUnderflow: \"最小値より小さいです\",\n rangeOverflow: \"最大値を超えています\",\n stepMismatch: \"ステップが一致しません\",\n badInput: \"入力が無効です\",\n invalid: \"無効な値です\",\n },\n Loading: {\n loadingPage: \"ページを読み込み中\",\n pleaseWait: \"しばらくお待ちください\",\n },\n DatePicker: {\n placeholder: \"日付を選択\",\n today: \"今日\",\n clear: \"クリア\",\n },\n Pagination: {\n navigationLabel: \"ページナビゲーション\",\n showingResults: \"{startItem}–{endItem} / 全{totalItems}件\",\n firstPage: \"最初のページ\",\n previousPage: \"前のページ\",\n previous: \"前へ\",\n nextPage: \"次のページ\",\n next: \"次へ\",\n lastPage: \"最後のページ\",\n pageNumber: \"{page}ページ\",\n itemsPerPage: \"1ページあたりの項目数\",\n search: \"検索\",\n noOptions: \"オプションなし\",\n },\n Form: {\n required: \"この項目は必須です\",\n },\n OCR: {\n imageUpload: {\n dragDropText: \"ここにファイルをドラッグ&ドロップ\",\n browseFiles: \"ファイルを参照\",\n supportedFormats: \"対応形式:画像\",\n },\n },\n },\n};\n\n// ============================================================================\n// Translation Context (for standalone React usage)\n// ============================================================================\ntype Locale = \"en\" | \"vi\" | \"ko\" | \"ja\";\n\ninterface TranslationContextType {\n locale: Locale;\n t: (namespace: string) => (key: string) => string;\n}\n\nconst TranslationContext = React.createContext<TranslationContextType | null>(null);\n\nexport interface UnderverseProviderProps {\n children: React.ReactNode;\n /** Current locale. Defaults to \"en\" */\n locale?: Locale;\n /** Custom translations to merge with defaults */\n translations?: Record<string, Record<string, string | Record<string, string>>>;\n}\n\n/**\n * UnderverseProvider for standalone React usage (without next-intl).\n * Wrap your app with this provider to enable translations.\n *\n * @example\n * ```tsx\n * // For React (Vite, CRA, etc.) - without next-intl\n * import { UnderverseProvider, DatePicker } from \"@underverse-ui/underverse\";\n *\n * function App() {\n * return (\n * <UnderverseProvider locale=\"vi\">\n * <DatePicker onChange={(date) => console.log(date)} />\n * </UnderverseProvider>\n * );\n * }\n * ```\n */\nexport const UnderverseProvider: React.FC<UnderverseProviderProps> = ({ children, locale = \"en\", translations }) => {\n const t = React.useCallback(\n (namespace: string) => {\n return (key: string): string => {\n const mergedTranslations = {\n ...defaultTranslations[locale],\n ...translations,\n };\n\n // Handle nested namespaces like \"OCR.imageUpload\"\n const parts = namespace.split(\".\");\n let current: unknown = mergedTranslations;\n\n for (const part of parts) {\n if (current && typeof current === \"object\" && part in current) {\n current = (current as Record<string, unknown>)[part];\n } else {\n return key;\n }\n }\n\n if (current && typeof current === \"object\" && key in current) {\n const value = (current as Record<string, unknown>)[key];\n return typeof value === \"string\" ? value : key;\n }\n\n return key;\n };\n },\n [locale, translations]\n );\n\n return <TranslationContext.Provider value={{ locale, t }}>{children}</TranslationContext.Provider>;\n};\n\n// ============================================================================\n// Try to detect next-intl\n// ============================================================================\nlet nextIntlAvailable = false;\nlet nextIntlUseTranslations: ((namespace: string) => (key: string) => string) | null = null;\nlet nextIntlUseLocale: (() => string) | null = null;\n\ntry {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const nextIntl = require(\"next-intl\");\n if (nextIntl && typeof nextIntl.useTranslations === \"function\") {\n nextIntlAvailable = true;\n nextIntlUseTranslations = nextIntl.useTranslations;\n nextIntlUseLocale = nextIntl.useLocale;\n }\n} catch {\n // next-intl not available\n}\n\n// ============================================================================\n// Smart hooks that auto-detect translation system\n// ============================================================================\n\n/**\n * Interpolate placeholders in a string.\n * Replaces {key} with the corresponding value from params.\n */\nfunction interpolate(template: string, params?: Record<string, unknown>): string {\n if (!params) return template;\n return template.replace(/\\{(\\w+)\\}/g, (_, key) => {\n const value = params[key];\n return value !== undefined ? String(value) : `{${key}}`;\n });\n}\n\n/**\n * Internal fallback translation function.\n */\nfunction getInternalTranslation(namespace: string, locale: Locale): (key: string, params?: Record<string, unknown>) => string {\n return (key: string, params?: Record<string, unknown>): string => {\n const localeTranslations = defaultTranslations[locale] || defaultTranslations.en;\n const parts = namespace.split(\".\");\n let current: unknown = localeTranslations;\n\n for (const part of parts) {\n if (current && typeof current === \"object\" && part in current) {\n current = (current as Record<string, unknown>)[part];\n } else {\n return interpolate(key, params);\n }\n }\n\n if (current && typeof current === \"object\" && key in current) {\n const value = (current as Record<string, unknown>)[key];\n return typeof value === \"string\" ? interpolate(value, params) : interpolate(key, params);\n }\n\n return interpolate(key, params);\n };\n}\n\n/**\n * Smart translation hook that works with both next-intl and standalone React.\n *\n * Priority:\n * 1. next-intl (if available and in NextIntlClientProvider)\n * 2. UnderverseProvider context\n * 3. English fallback defaults\n *\n * @param namespace - The translation namespace (e.g., \"DatePicker\", \"Common\")\n */\nexport function useTranslations(namespace: string): (key: string, params?: Record<string, unknown>) => string {\n const underverseContext = React.useContext(TranslationContext);\n\n // If UnderverseProvider is available, use it\n if (underverseContext) {\n return (key: string, params?: Record<string, unknown>) => {\n const result = underverseContext.t(namespace)(key);\n return interpolate(result, params);\n };\n }\n\n // Try next-intl if available\n if (nextIntlAvailable && nextIntlUseTranslations) {\n try {\n // This will throw if not wrapped in NextIntlClientProvider\n // eslint-disable-next-line react-hooks/rules-of-hooks\n const nextIntlT = nextIntlUseTranslations(namespace);\n // next-intl's t function already supports params\n return nextIntlT as (key: string, params?: Record<string, unknown>) => string;\n } catch {\n // Fall through to default\n }\n }\n\n // Fallback to English defaults\n return getInternalTranslation(namespace, \"en\");\n}\n\n/**\n * Smart locale hook that works with both next-intl and standalone React.\n */\nexport function useLocale(): Locale {\n const underverseContext = React.useContext(TranslationContext);\n\n // If UnderverseProvider is available, use it\n if (underverseContext) {\n return underverseContext.locale;\n }\n\n // Try next-intl if available\n if (nextIntlAvailable && nextIntlUseLocale) {\n try {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n const locale = nextIntlUseLocale();\n return (locale === \"vi\" ? \"vi\" : \"en\") as Locale;\n } catch {\n // Fall through to default\n }\n }\n\n // Fallback to English\n return \"en\";\n}\n\nexport type { Locale };\n","\"use client\";\n\nimport React, { forwardRef, useState, useRef, useId } from \"react\";\nimport { cn } from \"@/lib/utils/cn\";\nimport { X, Search, Loader2 } from \"lucide-react\";\nimport Button from \"./Button\";\n\nexport interface TagInputProps {\n /** Danh sách tags hiện tại */\n value: string[];\n\n /** Callback khi danh sách tags thay đổi */\n onChange: (tags: string[]) => void;\n\n /** Callback khi user muốn tìm kiếm (Ctrl+Enter hoặc click Search) */\n onSearch: (tags: string[]) => void;\n\n /** Callback when all tags are cleared */\n onClear?: () => void;\n\n /** Placeholder khi chưa có tags */\n placeholder?: string;\n\n /** Placeholder khi đã có tags */\n placeholderWithTags?: string;\n\n /** Label hiển thị phía trên input */\n label?: string;\n\n /** Ẩn nút Search */\n hideSearchButton?: boolean;\n\n /** Ẩn nút Clear All */\n hideClearButton?: boolean;\n\n /** Custom class cho container */\n className?: string;\n\n /** Size: 'sm' | 'md' | 'lg' */\n size?: \"sm\" | \"md\" | \"lg\";\n\n /** Disabled state */\n disabled?: boolean;\n\n /** Loading state - hiển thị spinner trên nút Search */\n loading?: boolean;\n\n /** Maximum number of tags allowed */\n maxTags?: number;\n\n /** i18n labels - no external dependency required */\n labels?: {\n search?: string;\n clearAll?: string;\n placeholder?: string;\n placeholderWithTags?: string;\n moreCount?: string; // e.g. \"+{count} more\" - use {count} as placeholder\n };\n\n /** Maximum visible tags before showing \"+N more\" badge */\n maxVisibleTags?: number;\n}\n\nconst TagInput = forwardRef<HTMLInputElement, TagInputProps>(\n (\n {\n value = [],\n onChange,\n onSearch,\n onClear,\n placeholder,\n placeholderWithTags,\n label,\n hideSearchButton = false,\n hideClearButton = false,\n className,\n size = \"md\",\n disabled = false,\n loading = false,\n maxTags,\n maxVisibleTags,\n labels,\n },\n ref\n ) => {\n const [inputValue, setInputValue] = useState(\"\");\n const [isFocused, setIsFocused] = useState(false);\n const inputRef = useRef<HTMLInputElement>(null);\n const autoId = useId();\n const inputId = `tag-input-${autoId}`;\n\n // Use props > labels > defaults (no external i18n dependency)\n const defaultPlaceholder = placeholder ?? labels?.placeholder ?? \"Enter value and press Enter...\";\n const defaultPlaceholderWithTags = placeholderWithTags ?? labels?.placeholderWithTags ?? \"Ctrl+Enter to search\";\n const searchLabel = labels?.search ?? \"Search\";\n const clearAllLabel = labels?.clearAll ?? \"Clear all\";\n\n // Check if max tags reached\n const isMaxReached = maxTags !== undefined && value.length >= maxTags;\n\n // Calculate visible tags and hidden count\n const [isExpanded, setIsExpanded] = useState(false);\n const hiddenCount = maxVisibleTags !== undefined && !isExpanded ? Math.max(0, value.length - maxVisibleTags) : 0;\n const visibleTags = hiddenCount > 0 ? value.slice(0, maxVisibleTags) : value;\n const moreLabel = labels?.moreCount?.replace(\"{count}\", String(hiddenCount)) ?? `+${hiddenCount} more`;\n\n // Size styles\n const sizeStyles = {\n sm: {\n container: \"min-h-8 p-1.5 gap-1\",\n input: \"text-xs\",\n tag: \"px-1.5 py-0.5 text-xs gap-1\",\n tagIcon: \"h-3 w-3\",\n button: \"h-7 text-xs px-2\",\n },\n md: {\n container: \"min-h-10 p-2 gap-1.5\",\n input: \"text-sm\",\n tag: \"px-2 py-1 text-sm gap-1.5\",\n tagIcon: \"h-3.5 w-3.5\",\n button: \"h-8 text-sm px-3\",\n },\n lg: {\n container: \"min-h-12 p-2.5 gap-2\",\n input: \"text-base\",\n tag: \"px-2.5 py-1.5 text-base gap-2\",\n tagIcon: \"h-4 w-4\",\n button: \"h-9 text-base px-4\",\n },\n };\n\n const addTag = (tagValue: string) => {\n const trimmed = tagValue.trim();\n if (!trimmed) return false;\n\n // Check for duplicates\n if (value.includes(trimmed)) return false;\n\n // Check max tags limit\n if (isMaxReached) return false;\n\n onChange([...value, trimmed]);\n setInputValue(\"\");\n return true;\n };\n\n const removeTag = (index: number) => {\n const newTags = value.filter((_, i) => i !== index);\n onChange(newTags);\n };\n\n const clearAll = () => {\n onChange([]);\n setInputValue(\"\");\n onClear?.();\n inputRef.current?.focus();\n };\n\n const triggerSearch = () => {\n // Add current input if exists before searching\n const trimmed = inputValue.trim();\n let finalTags = [...value];\n if (trimmed && !value.includes(trimmed) && !isMaxReached) {\n finalTags = [...value, trimmed];\n onChange(finalTags);\n setInputValue(\"\");\n }\n onSearch(finalTags);\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n\n // Check for Ctrl+Enter or Cmd+Enter for search\n if (e.ctrlKey || e.metaKey) {\n triggerSearch();\n return; // Exit early to prevent other actions\n }\n\n // Check for Shift+Enter for batch adding tags\n if (e.shiftKey) {\n const tagsToAdd = inputValue\n .split(/\\s+/) // Split by one or more whitespace\n .map((t) => t.trim())\n .filter((t) => t.length > 0 && !value.includes(t)); // Remove empty or duplicate\n\n if (tagsToAdd.length > 0) {\n // Check max tags limit\n const availableSlots = maxTags !== undefined ? maxTags - value.length : Infinity;\n\n if (availableSlots > 0) {\n const tagsToInsert = tagsToAdd.slice(0, availableSlots);\n onChange([...value, ...tagsToInsert]);\n setInputValue(\"\");\n }\n }\n return;\n }\n\n // Default behavior: just add single tag\n addTag(inputValue);\n } else if (e.key === \"Backspace\" && inputValue === \"\" && value.length > 0) {\n // Remove last tag when backspace on empty input\n removeTag(value.length - 1);\n }\n };\n\n const handleContainerClick = () => {\n inputRef.current?.focus();\n };\n\n const currentPlaceholder = value.length > 0 ? defaultPlaceholderWithTags : defaultPlaceholder;\n\n return (\n <div className={cn(\"w-full space-y-2\", className)}>\n {/* Label */}\n {label && (\n <label\n htmlFor={inputId}\n className={cn(\n \"block font-medium transition-colors duration-200\",\n size === \"sm\" ? \"text-xs\" : size === \"lg\" ? \"text-base\" : \"text-sm\",\n disabled ? \"text-muted-foreground\" : isFocused ? \"text-primary\" : \"text-foreground\"\n )}\n >\n {label}\n {maxTags !== undefined && (\n <span className=\"ml-2 text-muted-foreground font-normal\">\n ({value.length}/{maxTags})\n </span>\n )}\n </label>\n )}\n\n {/* Input Container with Tags */}\n <div\n onClick={handleContainerClick}\n className={cn(\n \"flex flex-wrap items-center cursor-text\",\n \"bg-background border border-input rounded-lg\",\n \"transition-all duration-200\",\n \"hover:border-accent-foreground/20\",\n isFocused && \"ring-1 ring-ring ring-offset-1 ring-offset-background border-transparent shadow-md\",\n disabled && \"opacity-50 cursor-not-allowed\",\n sizeStyles[size].container\n )}\n >\n {/* Tags */}\n {visibleTags.map((tag, index) => (\n <span\n key={`${tag}-${index}`}\n className={cn(\n \"inline-flex items-center rounded-md\",\n \"bg-primary/10 text-primary font-mono\",\n \"animate-in fade-in-0 zoom-in-95 duration-200\",\n sizeStyles[size].tag\n )}\n >\n <span className=\"truncate max-w-50\">{tag}</span>\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n removeTag(index);\n }}\n disabled={disabled}\n className={cn(\n \"flex items-center justify-center rounded-sm\",\n \"text-primary/70 hover:text-primary hover:bg-primary/20\",\n \"transition-colors duration-150\",\n \"focus:outline-none focus-visible:ring-1 focus-visible:ring-primary\",\n \"disabled:pointer-events-none\"\n )}\n aria-label={`Remove ${tag}`}\n >\n <X className={sizeStyles[size].tagIcon} />\n </button>\n </span>\n ))}\n\n {/* +N more badge */}\n {hiddenCount > 0 && (\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n setIsExpanded(true);\n }}\n className={cn(\n \"inline-flex items-center rounded-md cursor-pointer\",\n \"bg-muted text-muted-foreground hover:bg-muted/80\",\n \"transition-colors duration-150\",\n \"focus:outline-none focus-visible:ring-1 focus-visible:ring-ring\",\n sizeStyles[size].tag\n )}\n title={value.slice(maxVisibleTags).join(\", \")}\n >\n {moreLabel}\n </button>\n )}\n\n {/* Collapse button when expanded */}\n {isExpanded && maxVisibleTags !== undefined && value.length > maxVisibleTags && (\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n setIsExpanded(false);\n }}\n className={cn(\n \"inline-flex items-center rounded-md cursor-pointer\",\n \"bg-muted/50 text-muted-foreground hover:bg-muted/80\",\n \"transition-colors duration-150\",\n \"focus:outline-none focus-visible:ring-1 focus-visible:ring-ring\",\n sizeStyles[size].tag\n )}\n >\n Show less\n </button>\n )}\n\n {/* Input */}\n <input\n ref={(node) => {\n // Handle both refs\n (inputRef as React.MutableRefObject<HTMLInputElement | null>).current = node;\n if (typeof ref === \"function\") {\n ref(node);\n } else if (ref) {\n ref.current = node;\n }\n }}\n id={inputId}\n type=\"text\"\n value={inputValue}\n onChange={(e) => setInputValue(e.target.value)}\n onKeyDown={handleKeyDown}\n onFocus={() => setIsFocused(true)}\n onBlur={() => setIsFocused(false)}\n placeholder={isMaxReached ? `Max ${maxTags} tags` : currentPlaceholder}\n disabled={disabled || isMaxReached}\n className={cn(\n \"flex-1 min-w-30 bg-transparent outline-none\",\n \"placeholder:text-muted-foreground\",\n \"disabled:cursor-not-allowed\",\n sizeStyles[size].input\n )}\n aria-label={label || \"Tag input\"}\n />\n </div>\n\n {/* Action Buttons */}\n {(!hideSearchButton || !hideClearButton) && (\n <div className=\"flex items-center gap-2\">\n {!hideSearchButton && (\n <Button\n type=\"button\"\n variant=\"default\"\n size={size === \"lg\" ? \"md\" : size}\n onClick={triggerSearch}\n disabled={disabled || loading}\n className={sizeStyles[size].button}\n >\n {loading ? <Loader2 className=\"h-4 w-4 animate-spin mr-1.5\" /> : <Search className=\"h-4 w-4 mr-1.5\" />}\n {searchLabel}\n </Button>\n )}\n\n {!hideClearButton && value.length > 0 && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size={size === \"lg\" ? \"md\" : size}\n onClick={clearAll}\n disabled={disabled}\n className={cn(sizeStyles[size].button, \"text-muted-foreground hover:text-foreground\")}\n >\n {clearAllLabel}\n </Button>\n )}\n </div>\n )}\n </div>\n );\n }\n);\n\nTagInput.displayName = \"TagInput\";\n\nexport { TagInput };\nexport default TagInput;\n// CI Trigger Test\n","\"use client\";\r\n\r\nimport { forwardRef, TextareaHTMLAttributes, useState } from \"react\";\r\nimport { cn } from \"@/lib/utils/cn\";\r\n\r\nexport interface TextareaProps extends TextareaHTMLAttributes<HTMLTextAreaElement> {\r\n label?: string;\r\n error?: string;\r\n description?: string;\r\n variant?: \"default\" | \"filled\" | \"outlined\";\r\n size?: \"sm\" | \"md\" | \"lg\";\r\n}\r\n\r\nconst Textarea = forwardRef<HTMLTextAreaElement, TextareaProps>(\r\n ({ label, error, description, className, required, variant = \"default\", size = \"md\", ...rest }, ref) => {\r\n const [isFocused, setIsFocused] = useState(false);\r\n\r\n const sizeClasses = {\r\n sm: \"px-3 py-2 text-sm min-h-[80px]\",\r\n md: \"px-4 py-3 text-sm min-h-[100px]\", \r\n lg: \"px-5 py-4 text-base min-h-[120px]\"\r\n };\r\n\r\n const variantClasses = {\r\n default: cn(\r\n \"border border-input bg-background\",\r\n \"hover:border-accent-foreground/20\",\r\n \"focus:border-primary focus:ring-2 focus:ring-primary/20\"\r\n ),\r\n filled: cn(\r\n \"border-0 bg-muted\",\r\n \"hover:bg-muted/80\",\r\n \"focus:bg-background focus:ring-2 focus:ring-primary/20\"\r\n ),\r\n outlined: cn(\r\n \"border-2 border-border bg-transparent\",\r\n \"hover:border-primary/50\",\r\n \"focus:border-primary focus:ring-0\"\r\n )\r\n };\r\n\r\n return (\r\n <div className=\"w-full space-y-2\">\r\n {label && (\r\n <div className=\"flex items-center\">\r\n <label className={cn(\r\n \"text-sm font-medium transition-colors duration-200\",\r\n isFocused ? \"text-primary\" : \"text-foreground\",\r\n error && \"text-destructive\"\r\n )}>\r\n {label}\r\n {required && <span className=\"text-destructive ml-1\">*</span>}\r\n </label>\r\n {error && (\r\n <span className=\"text-xs text-destructive ml-auto animate-in slide-in-from-right-2 duration-200\" aria-live=\"polite\" role=\"alert\">\r\n {error}\r\n </span>\r\n )}\r\n </div>\r\n )}\r\n\r\n <div className=\"relative group\">\r\n <textarea\r\n ref={ref}\r\n required={required}\r\n aria-invalid={!!error}\r\n onFocus={() => setIsFocused(true)}\r\n onBlur={() => setIsFocused(false)}\r\n className={cn(\r\n \"w-full rounded-lg transition-all duration-200 ease-soft resize-y\",\r\n \"text-foreground placeholder:text-muted-foreground\",\r\n \"focus:outline-none shadow-sm focus:shadow-md\",\r\n \"backdrop-blur-sm\",\r\n sizeClasses[size],\r\n error \r\n ? \"border-destructive focus:ring-destructive/20 focus:border-destructive\" \r\n : variantClasses[variant],\r\n \"disabled:cursor-not-allowed disabled:opacity-50\",\r\n className\r\n )}\r\n {...rest}\r\n />\r\n \r\n {/* Focus indicator line */}\r\n {variant === \"default\" && (\r\n <div className={cn(\r\n \"absolute bottom-0 left-0 h-0.5 bg-linear-to-r from-primary to-primary/60 transition-all duration-300 ease-soft\",\r\n isFocused ? \"w-full opacity-100\" : \"w-0 opacity-0\"\r\n )} />\r\n )}\r\n \r\n {/* Focus glow effect */}\r\n {isFocused && variant !== \"outlined\" && (\r\n <div className=\"absolute inset-0 rounded-lg bg-primary/5 -z-10 animate-pulse\" />\r\n )}\r\n </div>\r\n\r\n {description && (\r\n <p className={cn(\r\n \"text-xs transition-colors duration-200\",\r\n isFocused ? \"text-primary/70\" : \"text-muted-foreground\",\r\n error && \"text-destructive/70\"\r\n )}>\r\n {description}\r\n </p>\r\n )}\r\n </div>\r\n );\r\n }\r\n);\r\n\r\nTextarea.displayName = \"Textarea\";\r\nexport default Textarea;","\"use client\";\r\n\r\nimport * as React from \"react\";\nimport { cn } from \"@/lib/utils/cn\";\n\r\ninterface SwitchProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size'> {\r\n checked: boolean;\r\n onCheckedChange: (checked: boolean) => void;\r\n label?: string;\r\n size?: \"sm\" | \"md\" | \"lg\";\r\n variant?: \"default\" | \"success\" | \"warning\" | \"danger\";\r\n disabled?: boolean;\r\n}\r\n\r\nexport const Switch: React.FC<SwitchProps> = ({\n checked,\n onCheckedChange,\n label,\n size = \"md\",\n variant = \"default\",\n disabled = false,\n className,\n ...props\n}) => {\n const [isPressed, setIsPressed] = React.useState(false);\n\r\n const sizeClasses = {\r\n sm: {\r\n track: \"w-8 h-4\",\r\n handle: \"w-3 h-3\",\r\n translate: \"translate-x-4\"\r\n },\r\n md: {\r\n track: \"w-11 h-6\", \r\n handle: \"w-5 h-5\",\r\n translate: \"translate-x-5\"\r\n },\r\n lg: {\r\n track: \"w-14 h-8\",\r\n handle: \"w-7 h-7\", \r\n translate: \"translate-x-6\"\r\n }\r\n };\r\n\r\n const variantClasses = {\n default: {\n active: \"bg-primary border-primary\",\n inactive: \"bg-input border-input\",\n },\n success: {\n active: \"bg-success border-success\",\n inactive: \"bg-input border-input\",\n },\n warning: {\n active: \"bg-warning border-warning\",\n inactive: \"bg-input border-input\",\n },\n danger: {\n active: \"bg-destructive border-destructive\",\n inactive: \"bg-input border-input\",\n },\n } as const;\n\r\n return (\r\n <label \r\n className={cn(\r\n \"inline-flex items-center gap-3 cursor-pointer select-none\",\r\n disabled && \"cursor-not-allowed opacity-50\",\r\n className\r\n )}\r\n >\r\n <div\n className={cn(\n \"relative inline-flex rounded-full align-middle\",\n sizeClasses[size].track,\n // Focus ring styled like shadcn (via peer-visible)\n \"peer-focus-visible:ring-2 peer-focus-visible:ring-ring peer-focus-visible:ring-offset-2 peer-focus-visible:ring-offset-background\",\n disabled && \"opacity-50\",\n )}\n >\n <input \n type=\"checkbox\" \n className=\"sr-only peer\"\n checked={checked} \n disabled={disabled}\n onChange={(e) => !disabled && onCheckedChange(e.target.checked)}\n {...props} \n />\n \n {/* Background track */}\n <div \n className={cn(\n \"block w-full h-full rounded-full transition-colors duration-200 ease-out border\",\n checked ? variantClasses[variant].active : variantClasses[variant].inactive\n )} \n />\n \n {/* Handle */}\n <div\n className={cn(\n \"absolute top-0.5 left-0.5 rounded-full transition-transform duration-200 ease-out shadow-sm\",\n sizeClasses[size].handle,\n \"bg-background border border-border\",\n checked ? sizeClasses[size].translate : \"translate-x-0\",\n !disabled && \"hover:scale-[1.02]\",\n isPressed && \"scale-95\",\n disabled && \"opacity-70\"\n )}\n onMouseDown={() => !disabled && setIsPressed(true)}\n onMouseUp={() => setIsPressed(false)}\n onMouseLeave={() => setIsPressed(false)}\n >\n {/* empty thumb */}\n </div>\n </div>\n \r\n {label && (\r\n <span\n className={cn(\n \"text-sm font-medium text-foreground transition-colors\",\n disabled && \"text-muted-foreground\"\n )}\n >\n {label}\n </span>\n )}\n </label>\n );\n};\n\r\nSwitch.displayName = \"Switch\";\r\nexport default Switch;\r\n","\"use client\"\r\n\r\nimport * as React from \"react\"\r\nimport { cva, type VariantProps } from \"class-variance-authority\"\r\n\r\nimport { cn } from \"@/lib/utils/cn\"\r\n\r\nconst labelVariants = cva(\r\n \"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\"\r\n)\r\n\r\nconst Label = React.forwardRef<\r\n HTMLLabelElement,\r\n React.LabelHTMLAttributes<HTMLLabelElement> &\r\n VariantProps<typeof labelVariants>\r\n>(({ className, ...props }, ref) => (\r\n <label\r\n ref={ref}\r\n className={cn(labelVariants(), className)}\r\n {...props}\r\n />\r\n))\r\nLabel.displayName = \"Label\"\r\n\r\nexport { Label }","\"use client\";\n\nimport Image, { ImageProps } from \"next/image\";\nimport React from \"react\";\nimport { cn } from \"@/lib/utils/cn\";\n\ntype Fit = \"cover\" | \"contain\";\n\ninterface SmartImageProps {\n src: string | undefined | null;\n alt: string;\n className?: string;\n /**\n * Aspect ratio utility class, e.g. `aspect-square`, `aspect-4/3`.\n * If provided with `fill`, the wrapper enforces the ratio.\n */\n ratioClass?: string;\n /**\n * Rounded corners; defaults to `rounded-lg` to match project style.\n */\n roundedClass?: string;\n /**\n * When true, uses fill layout; otherwise width/height if provided.\n */\n fill?: boolean;\n width?: number;\n height?: number;\n sizes?: string;\n priority?: boolean;\n quality?: number;\n fit?: Fit;\n /** Control object position, e.g. 'center', 'top', 'left', '50% 50%'. */\n objectPosition?: React.CSSProperties[\"objectPosition\"];\n /** Optional fallback src if original fails. */\n fallbackSrc?: string;\n}\n\nconst DEFAULT_FALLBACK = \"/images/products/hoa-hong-do.png\";\n\n// Cache các URL đã lỗi để không gọi lại nhiều lần\nconst FAILED_SRCS = new Set<string>();\n\nexport default function SmartImage({\n src,\n alt,\n className,\n ratioClass,\n roundedClass = \"rounded-lg\",\n fill = true,\n width,\n height,\n sizes = \"(max-width: 768px) 100vw, 33vw\",\n priority = false,\n quality = 80,\n fit = \"cover\",\n objectPosition,\n fallbackSrc = DEFAULT_FALLBACK,\n}: SmartImageProps) {\n const normalize = (input?: string | null) => {\n if (!input || input.length === 0) return fallbackSrc;\n const raw = input.trim();\n // Proactively convert local product JPGs -> PNG to avoid 404s\n if (raw.startsWith(\"/images/products/\") && /\\.(jpg|jpeg)($|\\?)/i.test(raw)) {\n return raw.replace(/\\.(jpg|jpeg)(?=$|\\?)/i, \".png\");\n }\n // Hỗ trợ protocol-relative //host/path -> https://host/path\n if (raw.startsWith(\"//\")) {\n return `https:${raw}`;\n }\n // Cho phép absolute http(s), data:, blob:\n if (/^(https?:|data:|blob:)/i.test(raw)) {\n return FAILED_SRCS.has(raw) ? fallbackSrc : raw;\n }\n // Cho phép path bắt đầu bằng /\n if (raw.startsWith(\"/\")) {\n return FAILED_SRCS.has(raw) ? fallbackSrc : raw;\n }\n // Các đường dẫn tương đối (vd: \"invalid-url.jpg\") -> thêm leading slash để tránh lỗi Next Image\n const normalized = `/${raw.replace(/^\\.\\/?/, \"\")}`;\n return FAILED_SRCS.has(normalized) ? fallbackSrc : normalized;\n };\n\n const [resolvedSrc, setResolvedSrc] = React.useState<string>(() => normalize(src));\n\n // Keep internal resolved source in sync when `src` prop changes\n React.useEffect(() => {\n setResolvedSrc(normalize(src));\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [src]);\n\n const handleError: NonNullable<ImageProps[\"onError\"]> = () => {\n // Ghi nhớ URL lỗi để lần sau bỏ qua\n if (resolvedSrc && resolvedSrc !== fallbackSrc) FAILED_SRCS.add(resolvedSrc);\n if (resolvedSrc.endsWith(\".jpg\")) {\n const next = resolvedSrc.replace(/\\.jpg($|\\?)/, \".png$1\");\n setResolvedSrc(next);\n } else if (resolvedSrc !== fallbackSrc) {\n setResolvedSrc(fallbackSrc);\n }\n };\n\n const Wrapper = ({ children }: { children: React.ReactNode }) => (\n <div\n className={cn(\n \"relative overflow-hidden bg-muted/30\",\n // remove any default focus outline/ring for visual consistency with Card\n \"outline-none focus:outline-none focus-visible:outline-none ring-0 focus:ring-0\",\n ratioClass,\n roundedClass,\n className\n )}\n >\n {children}\n </div>\n );\n\n if (fill) {\n return (\n <Wrapper>\n <Image\n src={resolvedSrc}\n alt={alt}\n fill\n sizes={sizes}\n onError={handleError}\n priority={priority}\n quality={quality}\n style={{ objectFit: fit, objectPosition }}\n />\n </Wrapper>\n );\n }\n\n return (\n <div\n className={cn(\n \"relative overflow-hidden bg-muted/30\",\n \"outline-none focus:outline-none focus-visible:outline-none ring-0 focus:ring-0\",\n roundedClass,\n className\n )}\n >\n <Image\n src={resolvedSrc}\n alt={alt}\n width={width}\n height={height}\n sizes={sizes}\n onError={handleError}\n priority={priority}\n quality={quality}\n style={{ objectFit: fit, objectPosition, width: \"100%\", height: \"100%\" }}\n />\n </div>\n );\n}\n","import * as React from \"react\";\nimport { cn } from \"@/lib/utils/cn\";\nimport SmartImage from \"@/components/ui/SmartImage\";\n\r\ninterface AvatarProps extends React.HTMLAttributes<HTMLDivElement> {\r\n src?: string;\r\n alt?: string;\r\n fallback?: string;\r\n size?: \"sm\" | \"md\" | \"lg\";\r\n onClick?: () => void; // 👈 thêm onClick rõ ràng\r\n}\r\n\r\nconst sizeClasses: Record<NonNullable<AvatarProps[\"size\"]>, string> = {\r\n sm: \"h-8 w-8 text-sm\",\r\n md: \"h-10 w-10 text-base\",\r\n lg: \"h-14 w-14 text-lg\",\r\n};\r\n\r\nexport const Avatar = ({ src, alt = \"avatar\", fallback = \"?\", size = \"md\", className, onClick, ...props }: AvatarProps) => {\n // Check if src is valid (not empty string, null, or undefined)\n const hasValidSrc = !!(src && src.trim().length > 0);\n\r\n return (\r\n <div\r\n className={cn(\r\n \"relative inline-flex items-center justify-center overflow-hidden rounded-full bg-muted text-foreground select-none transition-all duration-200 ease-soft\",\r\n onClick && \"cursor-pointer hover:ring-2 hover:ring-primary/50 hover:ring-offset-2 hover:shadow-lg active:scale-95\",\r\n sizeClasses[size],\r\n className\r\n )}\r\n onClick={onClick}\r\n {...props}\r\n >\r\n {hasValidSrc && (\n <div className=\"absolute inset-0\">\n <SmartImage\n src={src!}\n alt={alt}\n fill\n // match container size instead of using aspect ratio padding\n ratioClass={undefined}\n className=\"h-full w-full\"\n roundedClass=\"rounded-full\"\n fit=\"cover\"\n objectPosition=\"center\"\n quality={80}\n />\n </div>\n )}\n\r\n {/* Fallback text with better styling */}\r\n {!hasValidSrc && (\n <span\n className={cn(\n \"font-bold uppercase bg-linear-to-br from-primary to-primary/80 bg-clip-text text-transparent\",\n \"transition-all duration-200 animate-fade-in\"\n )}\n >\n {fallback}\n </span>\n )}\n\r\n {/* Online indicator (optional) */}\r\n <div className=\"absolute bottom-0 right-0 w-3 h-3 bg-success border-2 border-background rounded-full opacity-0 group-hover:opacity-100 transition-opacity duration-200\" />\n </div>\r\n );\r\n};\r\n\r\nexport default Avatar;\r\n","import React from \"react\";\r\nimport { cn } from \"@/lib/utils/cn\";\r\n\r\ninterface SkeletonProps {\r\n className?: string;\r\n width?: string | number;\r\n height?: string | number;\r\n variant?: \"rectangular\" | \"circular\" | \"rounded\" | \"text\";\r\n animation?: \"pulse\" | \"wave\" | \"none\";\r\n lines?: number;\r\n}\r\n\r\nexport const Skeleton: React.FC<SkeletonProps> = ({\r\n className,\r\n width,\r\n height,\r\n variant = \"rectangular\",\r\n animation = \"pulse\",\r\n lines = 1\r\n}) => {\r\n const variantClasses = {\r\n rectangular: \"rounded-md\",\r\n circular: \"rounded-full\",\r\n rounded: \"rounded-lg\", \r\n text: \"rounded\"\r\n };\r\n\r\n const animationClasses = {\r\n pulse: \"animate-pulse\",\r\n wave: \"animate-shimmer bg-linear-to-r from-muted via-muted/50 to-muted bg-size-[200%_100%]\",\r\n none: \"\"\r\n };\r\n\r\n if (variant === \"text\" && lines > 1) {\r\n return (\r\n <div className={cn(\"space-y-2\", className)}>\r\n {Array.from({ length: lines }).map((_, index) => (\r\n <div\r\n key={index}\r\n className={cn(\r\n \"h-4 bg-muted\",\r\n variantClasses[variant],\r\n animationClasses[animation],\r\n index === lines - 1 && \"w-3/4\" // Last line is shorter\r\n )}\r\n style={{\r\n width: index === lines - 1 ? undefined : width,\r\n height: height\r\n }}\r\n />\r\n ))}\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div\r\n className={cn(\r\n \"bg-muted\",\r\n variantClasses[variant],\r\n animationClasses[animation],\r\n className\r\n )}\r\n style={{ width, height }}\r\n />\r\n );\r\n};\r\n\r\n// Pre-built skeleton components for common use cases\r\nexport const SkeletonAvatar: React.FC<{ size?: \"sm\" | \"md\" | \"lg\"; className?: string }> = ({ \r\n size = \"md\", \r\n className \r\n}) => {\r\n const sizeClasses = {\r\n sm: \"w-8 h-8\",\r\n md: \"w-10 h-10\",\r\n lg: \"w-12 h-12\"\r\n };\r\n\r\n return (\r\n <Skeleton\r\n variant=\"circular\"\r\n className={cn(sizeClasses[size], className)}\r\n />\r\n );\r\n};\r\n\r\nexport const SkeletonButton: React.FC<{ size?: \"sm\" | \"md\" | \"lg\"; className?: string }> = ({ \r\n size = \"md\", \r\n className \r\n}) => {\r\n const sizeClasses = {\r\n sm: \"h-8 w-20\",\r\n md: \"h-10 w-24\",\r\n lg: \"h-12 w-28\"\r\n };\r\n\r\n return (\r\n <Skeleton\r\n variant=\"rounded\"\r\n className={cn(sizeClasses[size], className)}\r\n />\r\n );\r\n};\r\n\r\nexport const SkeletonText: React.FC<{ \r\n lines?: number; \r\n className?: string;\r\n width?: string;\r\n}> = ({ \r\n lines = 3, \r\n className,\r\n width = \"100%\"\r\n}) => {\r\n return (\r\n <Skeleton\r\n variant=\"text\"\r\n lines={lines}\r\n width={width}\r\n className={className}\r\n />\r\n );\r\n};\r\n\r\n// Complex skeleton layouts\nexport const SkeletonCard: React.FC<{ \n showAvatar?: boolean;\n showImage?: boolean;\n textLines?: number;\n className?: string;\n children?: React.ReactNode;\n}> = ({ \n showAvatar = true,\n showImage = false, \n textLines = 3,\n className,\n children\n}) => {\n if (children) {\n return (\n <div className={cn(\"p-4 space-y-4 rounded-lg bg-card outline-none focus:outline-none\", className)}>\n {children}\n </div>\n );\n }\n\n return (\n <div className={cn(\"p-4 space-y-4 rounded-lg bg-card outline-none focus:outline-none\", className)}>\n {/* Header with avatar */}\n {showAvatar && (\n <div className=\"flex items-center space-x-3\">\n <SkeletonAvatar />\n <div className=\"space-y-2\">\n <Skeleton className=\"h-4 w-24\" />\n <Skeleton className=\"h-3 w-16\" />\n </div>\n </div>\n )}\n\n {/* Image */}\n {showImage && (\n <Skeleton className=\"h-48 w-full rounded-md\" />\n )}\n\n {/* Text content */}\n <SkeletonText lines={textLines} />\n\n {/* Actions */}\n <div className=\"flex space-x-2\">\n <SkeletonButton size=\"sm\" />\n <SkeletonButton size=\"sm\" />\n </div>\n </div>\n );\n};\n\r\nexport const SkeletonPost: React.FC<{ className?: string }> = ({ className }) => {\n return (\n <div className={cn(\"p-6 space-y-4 rounded-xl bg-card outline-none focus:outline-none\", className)}>\n {/* Post header */}\r\n <div className=\"flex items-center space-x-3\">\r\n <SkeletonAvatar size=\"lg\" />\r\n <div className=\"space-y-2\">\r\n <Skeleton className=\"h-4 w-32\" />\r\n <Skeleton className=\"h-3 w-20\" />\r\n </div>\r\n </div>\r\n\r\n {/* Post content */}\r\n <SkeletonText lines={2} />\r\n\r\n {/* Post image */}\r\n <Skeleton className=\"h-64 w-full rounded-lg\" />\r\n\r\n {/* Post stats */}\r\n <div className=\"flex items-center space-x-4\">\r\n <Skeleton className=\"h-3 w-16\" />\r\n <Skeleton className=\"h-3 w-20\" />\r\n <Skeleton className=\"h-3 w-12\" />\r\n </div>\r\n\r\n {/* Post actions */}\r\n <div className=\"flex items-center justify-between pt-2\">\n <div className=\"flex space-x-4\">\n <Skeleton className=\"h-8 w-16\" />\n <Skeleton className=\"h-8 w-20\" />\n <Skeleton className=\"h-8 w-16\" />\n </div>\n </div>\n </div>\n );\n};\n\r\nexport const SkeletonMessage: React.FC<{ \r\n own?: boolean; \r\n showAvatar?: boolean;\r\n className?: string;\r\n}> = ({ \r\n own = false, \r\n showAvatar = true,\r\n className \r\n}) => {\r\n return (\r\n <div className={cn(\r\n \"flex items-end space-x-2\",\r\n own && \"flex-row-reverse space-x-reverse\",\r\n className\r\n )}>\r\n {showAvatar && !own && <SkeletonAvatar size=\"sm\" />}\r\n <div className={cn(\r\n \"max-w-xs space-y-1\",\r\n own ? \"items-end\" : \"items-start\"\r\n )}>\r\n <Skeleton className={cn(\r\n \"h-10 rounded-2xl\",\r\n own ? \"w-32 bg-primary/20\" : \"w-40 bg-muted\"\r\n )} />\r\n <Skeleton className=\"h-3 w-12\" />\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nexport const SkeletonList: React.FC<{ \r\n items?: number;\r\n itemHeight?: number;\r\n showAvatar?: boolean;\r\n className?: string;\r\n}> = ({ \r\n items = 5, \r\n itemHeight = 60,\r\n showAvatar = true,\r\n className \r\n}) => {\r\n return (\r\n <div className={cn(\"space-y-3\", className)}>\r\n {Array.from({ length: items }).map((_, index) => (\r\n <div key={index} className=\"flex items-center space-x-3 p-3 rounded-lg\">\r\n {showAvatar && <SkeletonAvatar />}\r\n <div className=\"flex-1 space-y-2\">\r\n <Skeleton className=\"h-4 w-3/4\" />\r\n <Skeleton className=\"h-3 w-1/2\" />\r\n </div>\r\n <Skeleton className=\"h-6 w-16\" />\r\n </div>\r\n ))}\r\n </div>\r\n );\r\n};\r\n\r\nexport const SkeletonTable: React.FC<{ \r\n rows?: number;\r\n columns?: number;\r\n className?: string;\r\n}> = ({ \r\n rows = 5, \r\n columns = 4,\r\n className \r\n}) => {\r\n return (\n <div className={cn(\"space-y-3\", className)}>\n {/* Header */}\n <div className=\"flex space-x-4 p-3\">\n {Array.from({ length: columns }).map((_, index) => (\n <Skeleton key={index} className=\"h-4 flex-1\" />\n ))}\n </div>\n \r\n {/* Rows */}\r\n {Array.from({ length: rows }).map((_, rowIndex) => (\r\n <div key={rowIndex} className=\"flex space-x-4 p-3\">\r\n {Array.from({ length: columns }).map((_, colIndex) => (\r\n <Skeleton key={colIndex} className=\"h-4 flex-1\" />\r\n ))}\r\n </div>\r\n ))}\r\n </div>\r\n );\r\n};\r\n\r\nexport default Skeleton;\n","import React from \"react\";\r\nimport { cn } from \"@/lib/utils/cn\";\r\nimport { Check, X, Clock, AlertTriangle } from \"lucide-react\";\r\n\r\ninterface ProgressProps {\r\n value: number;\r\n max?: number;\r\n className?: string;\r\n variant?: \"default\" | \"primary\" | \"success\" | \"warning\" | \"danger\" | \"info\";\r\n size?: \"sm\" | \"md\" | \"lg\" | \"xl\";\r\n showValue?: boolean;\r\n label?: string;\r\n animated?: boolean;\r\n striped?: boolean;\r\n indeterminate?: boolean;\r\n description?: string;\r\n status?: \"normal\" | \"error\" | \"complete\";\r\n}\r\n\r\nconst variantStyles = {\r\n default: \"bg-muted-foreground\",\r\n primary: \"bg-linear-to-r from-primary via-primary/90 to-primary\",\r\n success: \"bg-linear-to-r from-success via-success/90 to-success shadow-sm shadow-success/20\", \r\n warning: \"bg-linear-to-r from-warning via-warning/90 to-warning shadow-sm shadow-warning/20\",\r\n danger: \"bg-linear-to-r from-destructive via-destructive/90 to-destructive shadow-sm shadow-destructive/20\",\r\n info: \"bg-linear-to-r from-info via-info/90 to-info shadow-sm shadow-info/20\"\r\n};\r\n\r\nconst sizeStyles = {\r\n sm: \"h-1.5\",\r\n md: \"h-2.5\",\r\n lg: \"h-3.5\",\r\n xl: \"h-4\"\r\n};\r\n\r\nexport const Progress: React.FC<ProgressProps> = ({\n value,\r\n max = 100,\r\n className,\r\n variant = \"primary\",\r\n size = \"md\",\r\n showValue = false,\r\n label,\r\n animated = false,\r\n striped = false,\r\n indeterminate = false,\r\n description,\r\n status = \"normal\"\r\n}) => {\n const percentage = Math.min(Math.max((value / max) * 100, 0), 100);\n const isComplete = status === \"complete\" || percentage >= 100;\n const isError = status === \"error\";\n const labelId = React.useId();\n const descId = React.useId();\n\r\n // Status icon\r\n const getStatusIcon = () => {\r\n if (isComplete) return <Check className=\"w-4 h-4 text-success\" />;\r\n if (isError) return <X className=\"w-4 h-4 text-destructive\" />;\r\n if (animated || indeterminate) return <Clock className=\"w-4 h-4 text-muted-foreground animate-spin\" />;\r\n return null;\r\n };\r\n\r\n return (\r\n <div className={cn(\"w-full space-y-3\", className)}>\r\n {/* Header */}\r\n {(label || showValue || description) && (\r\n <div className=\"space-y-1\">\r\n <div className=\"flex justify-between items-center\">\r\n <div className=\"flex items-center gap-2\">\n {label && <span id={labelId} className=\"font-medium text-foreground\">{label}</span>}\n {getStatusIcon()}\n </div>\n {showValue && !indeterminate && (\r\n <span className={cn(\r\n \"text-sm font-medium\",\r\n isComplete ? \"text-success\" : isError ? \"text-destructive\" : \"text-muted-foreground\"\r\n )}>\r\n {isComplete ? \"Complete\" : isError ? \"Error\" : `${Math.round(percentage)}%`}\r\n </span>\r\n )}\r\n </div>\r\n {description && (\n <p id={descId} className=\"text-sm text-muted-foreground\">{description}</p>\n )}\n </div>\n )}\n \r\n {/* Progress Bar */}\r\n <div\n role=\"progressbar\"\n aria-valuemin={0}\n aria-valuemax={indeterminate ? undefined : max}\n aria-valuenow={indeterminate ? undefined : Math.round(percentage)}\n aria-labelledby={label ? labelId : undefined}\n aria-describedby={description ? descId : undefined}\n className={cn(\n \"w-full bg-muted/50 rounded-full overflow-hidden backdrop-blur-sm\",\n \"border border-border/50\",\n sizeStyles[size]\n )}\n >\n <div\r\n className={cn(\r\n \"h-full transition-all duration-700 ease-out rounded-full relative\",\r\n \"before:absolute before:inset-0 before:rounded-full before:opacity-30\",\r\n indeterminate && \"animate-pulse\",\r\n !indeterminate && variantStyles[variant],\r\n isComplete && \"bg-linear-to-r from-success via-success/90 to-success shadow-sm shadow-success/20\",\r\n isError && \"bg-linear-to-r from-destructive via-destructive/90 to-destructive shadow-sm shadow-destructive/20\",\r\n striped && \"bg-linear-to-r from-transparent via-primary-foreground/20 to-transparent bg-size-[1rem_1rem]\",\r\n animated && !indeterminate && \"before:animate-pulse\",\r\n // Shimmer effect for indeterminate\r\n indeterminate && \"bg-linear-to-r from-muted via-primary/50 to-muted bg-size-[200%_100%] animate-[shimmer_2s_infinite]\"\r\n )}\r\n style={{ \r\n width: indeterminate ? \"100%\" : `${percentage}%`,\r\n backgroundImage: striped ? \"linear-gradient(45deg, hsl(var(--foreground) / 0.15) 25%, transparent 25%, transparent 50%, hsl(var(--foreground) / 0.15) 50%, hsl(var(--foreground) / 0.15) 75%, transparent 75%, transparent)\" : undefined\r\n }}\r\n />\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\n// Circular Progress Component\r\ninterface CircularProgressProps {\r\n value: number;\r\n max?: number;\r\n size?: number;\r\n strokeWidth?: number;\r\n className?: string;\r\n variant?: \"default\" | \"primary\" | \"success\" | \"warning\" | \"danger\" | \"info\";\r\n showValue?: boolean;\r\n children?: React.ReactNode;\r\n indeterminate?: boolean;\r\n status?: \"normal\" | \"error\" | \"complete\";\r\n trackColor?: string;\r\n}\r\n\r\nexport const CircularProgress: React.FC<CircularProgressProps> = ({\n value,\r\n max = 100,\r\n size = 64,\r\n strokeWidth = 4,\r\n className,\r\n variant = \"primary\",\r\n showValue = false,\r\n children,\r\n indeterminate = false,\r\n status = \"normal\",\r\n trackColor = \"stroke-muted/20\"\r\n}) => {\n const percentage = Math.min(Math.max((value / max) * 100, 0), 100);\r\n const radius = (size - strokeWidth) / 2;\r\n const circumference = radius * Math.PI * 2;\r\n const offset = circumference - (percentage / 100) * circumference;\r\n const isComplete = status === \"complete\" || percentage >= 100;\r\n const isError = status === \"error\";\r\n\r\n const variantColors = {\r\n default: \"stroke-muted-foreground\",\r\n primary: \"stroke-primary\",\r\n success: \"stroke-success\",\r\n warning: \"stroke-warning\", \r\n danger: \"stroke-destructive\",\r\n info: \"stroke-info\"\r\n };\r\n\r\n const getContentIcon = () => {\r\n if (isComplete) return <Check className=\"w-5 h-5 text-success\" />;\r\n if (isError) return <X className=\"w-5 h-5 text-destructive\" />;\r\n return null;\r\n };\r\n\r\n return (\n <div\n className={cn(\"relative inline-flex items-center justify-center\", className)}\n role=\"progressbar\"\n aria-valuemin={0}\n aria-valuemax={indeterminate ? undefined : max}\n aria-valuenow={indeterminate ? undefined : Math.round(percentage)}\n aria-label={children ? undefined : \"Progress\"}\n >\n <svg\r\n width={size}\r\n height={size}\r\n className={cn(\r\n \"transform -rotate-90\",\r\n indeterminate && \"animate-spin\"\r\n )}\r\n style={{ animationDuration: indeterminate ? \"2s\" : undefined }}\r\n >\r\n {/* Background circle */}\r\n <circle\r\n cx={size / 2}\r\n cy={size / 2}\r\n r={radius}\r\n stroke=\"currentColor\"\r\n strokeWidth={strokeWidth}\r\n fill=\"transparent\"\r\n className={trackColor}\r\n />\r\n \r\n {/* Progress circle */}\r\n <circle\r\n cx={size / 2}\r\n cy={size / 2}\r\n r={radius}\r\n strokeWidth={strokeWidth}\r\n fill=\"transparent\"\r\n strokeDasharray={circumference}\r\n strokeDashoffset={indeterminate ? circumference * 0.25 : offset}\r\n className={cn(\r\n \"transition-all duration-700 ease-out\",\r\n isComplete ? \"stroke-success\" : isError ? \"stroke-destructive\" : variantColors[variant],\r\n \"drop-shadow-sm\"\r\n )}\r\n strokeLinecap=\"round\"\r\n style={{\r\n filter: `drop-shadow(0 0 4px ${\r\n isComplete ? \"hsl(var(--success) / 0.3)\" : \r\n isError ? \"hsl(var(--destructive) / 0.3)\" : \r\n \"hsl(var(--primary) / 0.2)\"\r\n })`\r\n }}\r\n />\r\n </svg>\r\n \r\n {/* Content */}\r\n <div className=\"absolute inset-0 flex flex-col items-center justify-center text-center\">\r\n {children ? children : (\r\n <>\r\n {getContentIcon()}\r\n {showValue && !indeterminate && (\r\n <span className={cn(\r\n \"text-sm font-semibold\",\r\n isComplete ? \"text-success\" : isError ? \"text-destructive\" : \"text-foreground\"\r\n )}>\r\n {isComplete ? \"✓\" : isError ? \"✗\" : `${Math.round(percentage)}%`}\r\n </span>\r\n )}\r\n {indeterminate && (\r\n <Clock className=\"w-4 h-4 text-muted-foreground animate-pulse\" />\r\n )}\r\n </>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\n// Multi-step Progress Component\r\ninterface StepProgressProps {\r\n steps: string[];\r\n currentStep: number;\r\n className?: string;\r\n variant?: \"default\" | \"primary\" | \"success\" | \"warning\" | \"danger\" | \"info\";\r\n size?: \"sm\" | \"md\" | \"lg\";\r\n}\r\n\r\nexport const StepProgress: React.FC<StepProgressProps> = ({\n steps,\r\n currentStep,\r\n className,\r\n variant = \"primary\",\r\n size = \"md\"\r\n}) => {\r\n const stepSizes = {\r\n sm: \"w-6 h-6 text-xs\",\r\n md: \"w-8 h-8 text-sm\", \r\n lg: \"w-10 h-10 text-base\"\r\n };\r\n\r\n const getStepStatus = (stepIndex: number) => {\r\n if (stepIndex < currentStep) return \"completed\";\r\n if (stepIndex === currentStep) return \"current\";\r\n return \"upcoming\";\r\n };\r\n\r\n return (\n <div className={cn(\"w-full\", className)} role=\"list\" aria-label=\"Progress steps\">\n <div className=\"flex items-center justify-between\">\n {steps.map((step, index) => {\n const status = getStepStatus(index);\n \n return (\n <div key={step} className=\"flex items-center\" role=\"listitem\" aria-current={status === \"current\" ? \"step\" : undefined}>\n {/* Step Circle */}\n <div\n className={cn(\n \"rounded-full border-2 flex items-center justify-center font-medium transition-all duration-300\",\n \"shadow-sm hover:shadow-md\",\n stepSizes[size],\n status === \"completed\" && [\n \"border-success bg-success text-success-foreground\",\n \"shadow-success/20\"\n ],\n status === \"current\" && [\n \"border-primary bg-primary/10 text-primary\",\n \"ring-2 ring-primary/20 ring-offset-2\",\n \"shadow-primary/20\"\n ],\n status === \"upcoming\" && [\n \"border-muted-foreground/30 text-muted-foreground bg-background\",\n \"hover:border-muted-foreground/50\"\n ]\n )}\n >\n {status === \"completed\" ? <Check className=\"w-3 h-3\" /> : index + 1}\n </div>\n \n {/* Step Label */}\n <span\n className={cn(\n \"ml-2 text-sm font-medium transition-colors duration-200\",\n status === \"completed\" && variantStyles[variant].replace(\"bg-\", \"text-\"),\n status === \"current\" && \"text-foreground\",\n status === \"upcoming\" && \"text-muted-foreground\"\n )}\n >\n {step}\n </span>\n \r\n {/* Connector Line */}\r\n {index < steps.length - 1 && (\r\n <div\r\n className={cn(\r\n \"flex-1 h-0.5 mx-4 transition-colors duration-200\",\r\n index < currentStep ? variantStyles[variant] : \"bg-muted\"\r\n )}\r\n />\r\n )}\r\n </div>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\n// Mini Progress - compact version for tight spaces\r\ninterface MiniProgressProps {\r\n value: number;\r\n max?: number;\r\n className?: string;\r\n variant?: \"default\" | \"primary\" | \"success\" | \"warning\" | \"danger\" | \"info\";\r\n showValue?: boolean;\r\n}\r\n\r\nexport const MiniProgress: React.FC<MiniProgressProps> = ({\n value,\r\n max = 100,\r\n className,\r\n variant = \"primary\",\r\n showValue = false\r\n}) => {\n const percentage = Math.min(Math.max((value / max) * 100, 0), 100);\n\n return (\n <div className={cn(\"flex items-center gap-2\", className)}>\n <div\n className=\"flex-1 h-1.5 bg-muted/50 rounded-full overflow-hidden\"\n role=\"progressbar\"\n aria-valuemin={0}\n aria-valuemax={max}\n aria-valuenow={Math.round(percentage)}\n >\n <div\n className={cn(\n \"h-full transition-all duration-500 ease-out rounded-full\",\n variantStyles[variant]\n )}\n style={{ width: `${percentage}%` }}\n />\n </div>\n {showValue && (\r\n <span className=\"text-xs font-medium text-muted-foreground min-w-10 text-right\">\r\n {Math.round(percentage)}%\r\n </span>\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\n// Battery Progress - for battery/power indicators\r\ninterface BatteryProgressProps {\r\n value: number;\r\n max?: number;\r\n className?: string;\r\n charging?: boolean;\r\n showValue?: boolean;\r\n}\r\n\r\nexport const BatteryProgress: React.FC<BatteryProgressProps> = ({\n value,\r\n max = 100,\r\n className,\r\n charging = false,\r\n showValue = false\r\n}) => {\n const percentage = Math.min(Math.max((value / max) * 100, 0), 100);\n const getVariant = () => {\n if (charging) return \"info\";\r\n if (percentage <= 20) return \"danger\";\r\n if (percentage <= 50) return \"warning\";\r\n return \"success\";\r\n };\r\n\r\n return (\n <div className={cn(\"flex items-center gap-2\", className)}>\n <div className=\"relative\" role=\"progressbar\" aria-label=\"Battery level\" aria-valuemin={0} aria-valuemax={max} aria-valuenow={Math.round(percentage)}>\n {/* Battery outline */}\n <div className=\"w-6 h-3 border-2 border-foreground/20 rounded-sm relative\">\n <div className=\"absolute -right-1 top-0.5 w-0.5 h-1 bg-foreground/20 rounded-r-sm\" />\r\n {/* Battery fill */}\r\n <div\r\n className={cn(\r\n \"h-full transition-all duration-500 ease-out rounded-sm\",\r\n variantStyles[getVariant()],\r\n charging && \"animate-pulse\"\r\n )}\r\n style={{ width: `${percentage}%` }}\r\n />\r\n </div>\r\n {charging && (\r\n <div className=\"absolute inset-0 flex items-center justify-center\">\r\n <div className=\"w-2 h-2 text-info-foreground\">⚡</div>\r\n </div>\r\n )}\r\n </div>\r\n {showValue && (\r\n <span className={cn(\r\n \"text-xs font-medium\",\r\n percentage <= 20 ? \"text-destructive\" : \"text-muted-foreground\"\r\n )}>\r\n {Math.round(percentage)}%\r\n </span>\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\n// Segmented Progress - for multi-segment indicators\r\ninterface SegmentedProgressProps {\r\n segments: number;\r\n activeSegments: number;\r\n className?: string;\r\n variant?: \"default\" | \"primary\" | \"success\" | \"warning\" | \"danger\" | \"info\";\r\n size?: \"sm\" | \"md\" | \"lg\";\r\n}\r\n\r\nexport const SegmentedProgress: React.FC<SegmentedProgressProps> = ({\n segments,\r\n activeSegments,\r\n className,\r\n variant = \"primary\",\r\n size = \"md\"\r\n}) => {\n const segmentSizes = {\r\n sm: \"h-1\",\r\n md: \"h-2\", \r\n lg: \"h-3\"\r\n };\r\n\r\n return (\n <div\n className={cn(\"flex gap-1\", className)}\n role=\"progressbar\"\n aria-valuemin={0}\n aria-valuemax={segments}\n aria-valuenow={activeSegments}\n >\n {Array.from({ length: segments }, (_, index) => (\r\n <div\r\n key={index}\r\n className={cn(\r\n \"flex-1 rounded-full transition-all duration-300\",\r\n segmentSizes[size],\r\n index < activeSegments \r\n ? variantStyles[variant]\r\n : \"bg-muted/50\"\r\n )}\r\n />\r\n ))}\r\n </div>\r\n );\r\n};\r\n\r\n// Loading Progress - for file uploads, downloads etc\r\ninterface LoadingProgressProps {\r\n value: number;\r\n max?: number;\r\n className?: string;\r\n variant?: \"default\" | \"primary\" | \"success\" | \"warning\" | \"danger\" | \"info\";\r\n label?: string;\r\n status?: \"loading\" | \"complete\" | \"error\" | \"paused\";\r\n speed?: string;\r\n timeRemaining?: string;\r\n}\r\n\r\nexport const LoadingProgress: React.FC<LoadingProgressProps> = ({\n value,\r\n max = 100,\r\n className,\r\n variant = \"primary\",\r\n label,\r\n status = \"loading\",\r\n speed,\r\n timeRemaining\r\n}) => {\n const percentage = Math.min(Math.max((value / max) * 100, 0), 100);\n \n const getStatusIcon = () => {\n switch (status) {\r\n case \"complete\": return <Check className=\"w-4 h-4 text-success\" />;\r\n case \"error\": return <X className=\"w-4 h-4 text-destructive\" />;\r\n case \"paused\": return <Clock className=\"w-4 h-4 text-warning\" />;\r\n default: return <div className=\"w-2 h-2 bg-primary rounded-full animate-bounce\" />;\r\n }\r\n };\r\n\r\n const getStatusColor = () => {\r\n switch (status) {\r\n case \"complete\": return \"success\";\r\n case \"error\": return \"danger\";\r\n case \"paused\": return \"warning\";\r\n default: return variant;\r\n }\r\n };\r\n\r\n return (\n <div className={cn(\"w-full space-y-2\", className)}>\n {/* Header */}\n <div className=\"flex items-center justify-between text-sm\">\n <div className=\"flex items-center gap-2\">\n {getStatusIcon()}\n {label && <span className=\"font-medium text-foreground\">{label}</span>}\n </div>\n <span className=\"text-muted-foreground\">\n {status === \"complete\" ? \"Complete\" : `${Math.round(percentage)}%`}\n </span>\n </div>\n\n {/* Progress Bar */}\n <div\n className=\"w-full h-2 bg-muted/50 rounded-full overflow-hidden\"\n role=\"progressbar\"\n aria-valuemin={0}\n aria-valuemax={max}\n aria-valuenow={Math.round(percentage)}\n aria-label={label || \"Loading progress\"}\n >\n <div\n className={cn(\n \"h-full transition-all duration-300 ease-out rounded-full\",\n variantStyles[getStatusColor()],\n status === \"loading\" && \"animate-pulse\"\n )}\n style={{ width: `${percentage}%` }}\n />\n </div>\n\r\n {/* Footer */}\r\n {(speed || timeRemaining) && (\r\n <div className=\"flex justify-between text-xs text-muted-foreground\">\r\n {speed && <span>{speed}</span>}\r\n {timeRemaining && <span>{timeRemaining}</span>}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\nexport default Progress;\n","\"use client\";\r\n\r\nimport * as React from \"react\";\r\nimport { createPortal } from \"react-dom\";\r\nimport { cn } from \"@/lib/utils/cn\";\r\nimport { X } from \"lucide-react\";\r\n\r\ninterface ModalProps {\r\n isOpen: boolean;\r\n onClose: () => void;\r\n children: React.ReactNode;\r\n title?: string;\r\n description?: string;\r\n className?: string;\r\n contentClassName?: string;\r\n overlayClassName?: string;\r\n showCloseButton?: boolean;\r\n closeOnOverlayClick?: boolean;\r\n closeOnEsc?: boolean;\r\n size?: \"sm\" | \"md\" | \"lg\" | \"xl\" | \"full\";\r\n noPadding?: boolean;\r\n fullWidth?: boolean;\r\n width?: string | number;\r\n height?: string | number;\r\n}\r\n\r\nconst sizeStyles = {\r\n sm: \"max-w-sm\",\r\n md: \"max-w-md\",\r\n lg: \"max-w-lg\",\r\n xl: \"max-w-xl\",\r\n full: \"max-w-full\",\r\n};\r\n\r\nconst Modal: React.FC<ModalProps> = ({\r\n isOpen,\r\n onClose,\r\n children,\r\n title,\r\n description,\r\n className,\r\n contentClassName,\r\n overlayClassName,\r\n showCloseButton = true,\r\n closeOnOverlayClick = true,\r\n closeOnEsc = true,\r\n size = \"md\",\r\n noPadding = false,\r\n fullWidth = false,\r\n width,\r\n height,\r\n}) => {\r\n const [isMounted, setIsMounted] = React.useState(false);\r\n const [isVisible, setIsVisible] = React.useState(false);\r\n const [isAnimating, setIsAnimating] = React.useState(true);\r\n // Track if mousedown started outside modal content\r\n const mouseDownTarget = React.useRef<EventTarget | null>(null);\r\n const modalContentRef = React.useRef<HTMLDivElement>(null);\r\n\r\n React.useEffect(() => {\r\n setIsMounted(true);\r\n return () => setIsMounted(false);\r\n }, []);\r\n\r\n // Animation handling\r\n React.useEffect(() => {\r\n if (isOpen) {\r\n setIsVisible(true);\r\n setIsAnimating(true);\r\n // Start animation on next frame\r\n requestAnimationFrame(() => {\r\n setIsAnimating(false);\r\n });\r\n } else if (isVisible) {\r\n setIsAnimating(true);\r\n // Hide after animation completes\r\n const hideTimer = setTimeout(() => {\r\n setIsVisible(false);\r\n }, 200);\r\n return () => clearTimeout(hideTimer);\r\n }\r\n }, [isOpen, isVisible]);\r\n\r\n // Handle escape key\r\n React.useEffect(() => {\r\n if (!isOpen || !closeOnEsc) return;\r\n\r\n const handleEscape = (event: KeyboardEvent) => {\r\n if (event.key === \"Escape\") {\r\n onClose();\r\n }\r\n };\r\n\r\n document.addEventListener(\"keydown\", handleEscape);\r\n return () => document.removeEventListener(\"keydown\", handleEscape);\r\n }, [isOpen, closeOnEsc, onClose]);\r\n\r\n // Prevent body scroll when modal is open\r\n React.useEffect(() => {\r\n if (isOpen) {\r\n document.body.style.overflow = \"hidden\";\r\n } else {\r\n document.body.style.overflow = \"unset\";\r\n }\r\n\r\n return () => {\r\n document.body.style.overflow = \"unset\";\r\n };\r\n }, [isOpen]);\r\n\r\n // Check if an element is inside a portal (datepicker, popover, dropdown, etc.)\r\n const isInsidePortal = (element: Node | null): boolean => {\r\n if (!element) return false;\r\n let current = element as HTMLElement | null;\r\n while (current) {\r\n // Check for common portal indicators (data attributes, z-index patterns)\r\n if (\r\n current.hasAttribute?.(\"data-datepicker\") ||\r\n current.hasAttribute?.(\"data-popover\") ||\r\n current.hasAttribute?.(\"data-dropdown\") ||\r\n current.hasAttribute?.(\"data-dropdown-menu\") ||\r\n current.hasAttribute?.(\"data-radix-popper-content-wrapper\") ||\r\n current.hasAttribute?.(\"data-radix-portal\") ||\r\n current.getAttribute?.(\"role\") === \"listbox\" ||\r\n current.getAttribute?.(\"role\") === \"dialog\" ||\r\n current.classList?.contains(\"datepicker-portal\") ||\r\n current.classList?.contains(\"popover-portal\")\r\n ) {\r\n return true;\r\n }\r\n current = current.parentElement;\r\n }\r\n return false;\r\n };\r\n\r\n const handleOverlayMouseDown = (event: React.MouseEvent) => {\r\n // Store the mousedown target\r\n mouseDownTarget.current = event.target;\r\n };\r\n\r\n const handleOverlayMouseUp = (event: React.MouseEvent) => {\r\n // Check if both mousedown and mouseup occurred outside modal content\r\n const modalContent = modalContentRef.current;\r\n const mouseDownTarget_ = mouseDownTarget.current as Node;\r\n const mouseUpTarget = event.target as Node;\r\n\r\n // Don't close if clicking inside a portal element (datepicker, popover, etc.)\r\n if (isInsidePortal(mouseDownTarget_) || isInsidePortal(mouseUpTarget)) {\r\n mouseDownTarget.current = null;\r\n return;\r\n }\r\n\r\n const mouseDownOutside = modalContent && !modalContent.contains(mouseDownTarget_);\r\n const mouseUpOutside = modalContent && !modalContent.contains(mouseUpTarget);\r\n\r\n if (closeOnOverlayClick && mouseDownOutside && mouseUpOutside) {\r\n onClose();\r\n }\r\n mouseDownTarget.current = null;\r\n };\r\n\r\n if (!isMounted || (!isOpen && !isVisible)) {\r\n return null;\r\n }\r\n\r\n const maxWidthClass = width ? \"max-w-none\" : fullWidth ? \"max-w-full\" : sizeStyles[size];\r\n\r\n const modalContent = (\r\n <div\r\n className={cn(\"fixed inset-0 z-9999 flex items-center justify-center\", overlayClassName)}\r\n onMouseDown={handleOverlayMouseDown}\r\n onMouseUp={handleOverlayMouseUp}\r\n >\r\n {/* Overlay */}\r\n <div\r\n className=\"absolute inset-0 bg-background/80 backdrop-blur-sm transition-opacity duration-200 ease-out\"\r\n style={{\r\n opacity: isOpen && !isAnimating ? 1 : 0,\r\n }}\r\n />\r\n\r\n {/* Modal */}\r\n <div\r\n ref={modalContentRef}\r\n className={cn(\r\n \"relative w-full rounded-lg bg-card text-card-foreground shadow-xl\",\r\n \"transition-all duration-200 ease-out\",\r\n maxWidthClass,\r\n fullWidth && \"mx-0\",\r\n className\r\n )}\r\n style={{\r\n opacity: isOpen && !isAnimating ? 1 : 0,\r\n transform: isOpen && !isAnimating ? \"scale(1)\" : \"scale(0.9)\",\r\n // Thêm dòng này để tạo hiệu ứng nảy\r\n transition: \"all 300ms cubic-bezier(0.34, 1.76, 0.64, 1)\",\r\n width,\r\n height,\r\n }}\r\n onClick={(e) => e.stopPropagation()}\r\n >\r\n {/* Header */}\r\n {(title || description || showCloseButton) && (\r\n <div className=\"flex items-start justify-between p-6 pb-0\">\r\n <div className=\"space-y-1.5\">\r\n {title && <h2 className=\"text-lg font-semibold leading-none tracking-tight\">{title}</h2>}\r\n {description && <p className=\"text-sm text-muted-foreground\">{description}</p>}\r\n </div>\r\n {showCloseButton && (\r\n <button\r\n onClick={onClose}\r\n className={cn(\r\n \"rounded-sm opacity-70 ring-offset-background transition-opacity\",\r\n \"hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2\",\r\n \"disabled:pointer-events-none \"\r\n )}\r\n >\r\n <X className=\"h-4 w-4 cursor-pointer\" />\r\n </button>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* Content */}\r\n <div className={cn(\"p-6\", noPadding && \"p-0\", contentClassName)}>{children}</div>\r\n </div>\r\n </div>\r\n );\r\n\r\n return typeof window !== \"undefined\" ? createPortal(modalContent, document.body) : null;\r\n};\r\n\r\nexport default Modal;\r\n","\"use client\";\n\nimport React, { createContext, useContext, useState, useCallback, useEffect, useRef } from \"react\";\nimport { cn } from \"@/lib/utils/cn\";\nimport { X, CheckCircle, AlertCircle, Info, AlertTriangle } from \"lucide-react\";\n\ntype ToastType = \"success\" | \"error\" | \"warning\" | \"info\";\ntype ToastPosition = \"top-right\" | \"top-left\" | \"bottom-right\" | \"bottom-left\" | \"top-center\" | \"bottom-center\";\n\ninterface Toast {\n id: string;\n type: ToastType;\n title?: string;\n message: string;\n duration?: number;\n action?: {\n label: string;\n onClick: () => void;\n };\n dismissible?: boolean;\n}\n\ninterface ToastContextType {\n addToast: (toast: Omit<Toast, \"id\">) => void;\n removeToast: (id: string) => void;\n toasts: Toast[];\n}\n\nconst ToastContext = createContext<ToastContextType | 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\ninterface ToastProviderProps {\n children: React.ReactNode;\n position?: ToastPosition;\n maxToasts?: number;\n}\n\nexport const ToastProvider: React.FC<ToastProviderProps> = ({ children, position = \"top-right\", maxToasts = 5 }) => {\n const [toasts, setToasts] = useState<Toast[]>([]);\n const idRef = useRef(0);\n\n const removeToast = useCallback((id: string) => {\n setToasts((prev) => prev.filter((toast) => toast.id !== id));\n }, []);\n\n const addToast = useCallback(\n (toast: Omit<Toast, \"id\">) => {\n const id = `toast-${++idRef.current}`;\n const newToast = { ...toast, id };\n\n setToasts((prev) => {\n const updated = [newToast, ...prev];\n return updated.slice(0, maxToasts);\n });\n\n // Auto-dismiss handled by ToastComponent so pause-on-hover works consistently.\n },\n [maxToasts, removeToast]\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 transform -translate-x-1/2\",\n \"bottom-center\": \"bottom-4 left-1/2 transform -translate-x-1/2\",\n };\n\n return (\n <ToastContext.Provider value={{ addToast, removeToast, toasts }}>\n {children}\n <div className={cn(\"fixed z-99999 flex flex-col gap-2 pointer-events-none\", positionClasses[position])} aria-live=\"polite\" aria-atomic>\n {toasts.map((toast) => (\n <ToastComponent key={toast.id} toast={toast} onRemove={removeToast} />\n ))}\n </div>\n </ToastContext.Provider>\n );\n};\n\ninterface ToastComponentProps {\n toast: Toast;\n onRemove: (id: string) => void;\n}\n\nconst ToastComponent: React.FC<ToastComponentProps> = ({ toast, onRemove }) => {\n const [isVisible, setIsVisible] = useState(false);\n const [progress, setProgress] = useState(100);\n const [paused, setPaused] = useState(false);\n const total = toast.duration && toast.duration > 0 ? toast.duration : 5000;\n const endTsRef = useRef<number>(Date.now() + total);\n const remainingRef = useRef<number>(total);\n const pausedRef = useRef(false);\n\n const handleRemove = useCallback(() => {\n setIsVisible(false);\n setTimeout(() => onRemove(toast.id), 150);\n }, [onRemove, toast.id]);\n\n useEffect(() => {\n setIsVisible(true);\n if (toast.duration === 0) return;\n remainingRef.current = total;\n endTsRef.current = Date.now() + total;\n const intervalId = window.setInterval(() => {\n if (!pausedRef.current) {\n const remain = Math.max(endTsRef.current - Date.now(), 0);\n remainingRef.current = remain;\n setProgress((remain / total) * 100);\n if (remain === 0) {\n handleRemove();\n }\n }\n }, 50);\n return () => window.clearInterval(intervalId);\n }, [handleRemove, toast.duration, total]);\n\n const typeConfig = {\n success: {\n icon: CheckCircle,\n containerClassName: \"bg-success/5 border-success/30\",\n iconClassName: \"text-success\",\n iconBgClassName: \"bg-success/15\",\n accentBarClassName: \"bg-success\",\n },\n error: {\n icon: AlertCircle,\n containerClassName: \"bg-destructive/5 border-destructive/30\",\n iconClassName: \"text-destructive\",\n iconBgClassName: \"bg-destructive/15\",\n accentBarClassName: \"bg-destructive\",\n },\n warning: {\n icon: AlertTriangle,\n containerClassName: \"bg-warning/5 border-warning/30\",\n iconClassName: \"text-warning\",\n iconBgClassName: \"bg-warning/15\",\n accentBarClassName: \"bg-warning\",\n },\n info: {\n icon: Info,\n containerClassName: \"bg-info/5 border-info/30\",\n iconClassName: \"text-info\",\n iconBgClassName: \"bg-info/15\",\n accentBarClassName: \"bg-info\",\n },\n };\n\n const config = typeConfig[toast.type];\n const Icon = config.icon;\n\n return (\n <div\n className={cn(\n \"relative w-80 rounded-r-lg border border-l-0 backdrop-blur-md transition-all duration-300 pointer-events-auto overflow-hidden\",\n \"bg-card shadow-xl\",\n \"animate-in slide-in-from-right-full\",\n config.containerClassName,\n isVisible ? \"opacity-100 translate-x-0\" : \"opacity-0 translate-x-full\"\n )}\n role=\"status\"\n aria-live={toast.type === \"error\" ? \"assertive\" : \"polite\"}\n onMouseEnter={() => {\n if (toast.duration === 0) return;\n pausedRef.current = true;\n remainingRef.current = Math.max(endTsRef.current - Date.now(), 0);\n setPaused(true);\n }}\n onMouseLeave={() => {\n if (toast.duration === 0) return;\n pausedRef.current = false;\n endTsRef.current = Date.now() + remainingRef.current;\n setPaused(false);\n }}\n >\n {/* Accent bar - straight edge, not affected by rounded corners */}\n <div className={cn(\"absolute left-0 top-0 bottom-0 w-1\", config.accentBarClassName)} />\n\n <div className=\"flex items-start gap-3 p-4 pl-5\">\n <div className={cn(\"flex items-center justify-center w-8 h-8 rounded-full shrink-0\", config.iconBgClassName)}>\n <Icon className={cn(\"h-4 w-4\", config.iconClassName)} />\n </div>\n\n <div className=\"flex-1 space-y-1\">\n {toast.title && <h4 className=\"font-medium text-sm leading-none\">{toast.title}</h4>}\n <p className=\"text-sm text-muted-foreground leading-relaxed\">{toast.message}</p>\n {toast.action && (\n <button\n onClick={() => {\n toast.action!.onClick();\n handleRemove();\n }}\n className=\"text-sm font-medium hover:underline focus:outline-none\"\n >\n {toast.action.label}\n </button>\n )}\n </div>\n\n {(toast.dismissible ?? true) && (\n <button\n onClick={handleRemove}\n className={cn(\n \"rounded-md p-1 hover:bg-accent hover:text-accent-foreground\",\n \"transition-colors duration-200 focus:outline-none focus:ring-2 focus:ring-primary/50\"\n )}\n aria-label=\"Close toast\"\n >\n <X className=\"h-4 w-4\" />\n </button>\n )}\n </div>\n {/* Progress bar */}\n {toast.duration !== 0 && (\n <div className=\"absolute left-0 right-0 bottom-0 h-1 bg-transparent\">\n <div\n className={cn(\n \"h-full bg-current/30\",\n toast.type === \"success\" && \"bg-success\",\n toast.type === \"error\" && \"bg-destructive\",\n toast.type === \"warning\" && \"bg-warning\",\n toast.type === \"info\" && \"bg-info\"\n )}\n style={{ width: `${progress}%`, transition: paused ? \"none\" : \"width 100ms linear\" }}\n />\n </div>\n )}\n </div>\n );\n};\n\nexport default ToastProvider;\n","\"use client\";\r\n\r\nimport * as React from \"react\";\r\nimport { createPortal } from \"react-dom\";\r\nimport { cn } from \"@/lib/utils/cn\";\r\n\r\ninterface TooltipProps {\r\n children: React.ReactElement;\r\n content: React.ReactNode;\r\n placement?: \"top\" | \"right\" | \"bottom\" | \"left\";\r\n delay?: number | { open?: number; close?: number };\r\n className?: string;\r\n disabled?: boolean;\r\n variant?: \"default\" | \"info\" | \"warning\" | \"error\" | \"success\";\r\n}\r\n\r\nconst variantStyles = {\r\n default: \"bg-popover text-popover-foreground border-border\",\r\n info: \"bg-info text-info-foreground border-info/20\",\r\n warning: \"bg-warning text-warning-foreground border-warning/20\",\r\n error: \"bg-destructive text-destructive-foreground border-destructive/20\",\r\n success: \"bg-success text-success-foreground border-success/20\",\r\n};\r\n\r\nexport const Tooltip: React.FC<TooltipProps> = ({\r\n children,\r\n content,\r\n placement = \"top\",\r\n delay = { open: 700, close: 300 },\r\n className,\r\n disabled = false,\r\n variant = \"default\",\r\n}) => {\r\n const [isOpen, setIsOpen] = React.useState(false);\r\n const [position, setPosition] = React.useState<{ top: number; left: number } | null>(null);\r\n const [isMounted, setIsMounted] = React.useState(false);\r\n const triggerRef = React.useRef<HTMLElement>(null);\r\n const timeoutRef = React.useRef<NodeJS.Timeout | undefined>(undefined);\r\n\r\n // Ensure client-side only\r\n React.useEffect(() => {\r\n setIsMounted(true);\r\n }, []);\r\n\r\n const delayOpen = typeof delay === \"object\" ? delay.open || 700 : delay;\r\n const delayClose = typeof delay === \"object\" ? delay.close || 300 : delay;\r\n\r\n const calculatePosition = () => {\r\n if (!triggerRef.current) return;\r\n\r\n const rect = triggerRef.current.getBoundingClientRect();\r\n\r\n let top = rect.top;\r\n let left = rect.left;\r\n\r\n const OFFSET = 8;\r\n\r\n switch (placement) {\r\n case \"top\":\r\n top = rect.top - OFFSET;\r\n left = rect.left + rect.width / 2;\r\n break;\r\n case \"bottom\":\r\n top = rect.bottom + OFFSET;\r\n left = rect.left + rect.width / 2;\r\n break;\r\n case \"left\":\r\n top = rect.top + rect.height / 2;\r\n left = rect.left - OFFSET;\r\n break;\r\n case \"right\":\r\n top = rect.top + rect.height / 2;\r\n left = rect.right + OFFSET;\r\n break;\r\n }\r\n\r\n // Ensure tooltip stays within viewport\r\n const viewportWidth = window.innerWidth;\r\n const viewportHeight = window.innerHeight;\r\n\r\n // For horizontal centering, ensure it doesn't go off-screen\r\n if (placement === \"top\" || placement === \"bottom\") {\r\n const tooltipWidth = 200; // approximate width\r\n const minLeft = tooltipWidth / 2;\r\n const maxLeft = viewportWidth - tooltipWidth / 2;\r\n left = Math.max(minLeft, Math.min(left, maxLeft));\r\n }\r\n\r\n setPosition({ top, left });\r\n };\r\n\r\n const handleMouseEnter = () => {\r\n if (disabled) return;\r\n clearTimeout(timeoutRef.current);\r\n timeoutRef.current = setTimeout(() => {\r\n calculatePosition();\r\n setIsOpen(true);\r\n }, delayOpen);\r\n };\r\n\r\n const handleMouseLeave = () => {\r\n clearTimeout(timeoutRef.current);\r\n timeoutRef.current = setTimeout(() => {\r\n setIsOpen(false);\r\n }, delayClose);\r\n };\r\n\r\n const handleFocus = () => {\r\n if (disabled) return;\r\n calculatePosition();\r\n setIsOpen(true);\r\n };\r\n\r\n const handleBlur = () => {\r\n setIsOpen(false);\r\n };\r\n\r\n if (disabled || !content) {\r\n return children;\r\n }\r\n\r\n return (\r\n <>\r\n {React.cloneElement(children, {\r\n ref: triggerRef,\r\n onMouseEnter: handleMouseEnter,\r\n onMouseLeave: handleMouseLeave,\r\n onFocus: handleFocus,\r\n onBlur: handleBlur,\r\n } as any)}\r\n {isMounted &&\r\n isOpen &&\r\n position &&\r\n createPortal(\r\n <div\r\n style={{\r\n position: \"fixed\",\r\n top: position.top,\r\n left: position.left,\r\n transform:\r\n placement === \"top\"\r\n ? \"translate(-50%, -100%)\"\r\n : placement === \"bottom\"\r\n ? \"translateX(-50%)\"\r\n : placement === \"left\"\r\n ? \"translate(-100%, -50%)\"\r\n : placement === \"right\"\r\n ? \"translateY(-50%)\"\r\n : \"none\",\r\n zIndex: 99999,\r\n opacity: 1,\r\n transition: \"opacity 150ms\",\r\n pointerEvents: \"none\",\r\n }}\r\n className={cn(\r\n \"px-3 py-2 text-sm font-medium rounded-lg shadow-lg border\",\r\n \"max-w-xs wrap-break-word backdrop-blur-sm\",\r\n variantStyles[variant],\r\n className\r\n )}\r\n >\r\n {content}\r\n </div>,\r\n document.body\r\n )}\r\n </>\r\n );\r\n};\r\n","\"use client\";\r\n\r\nimport * as React from \"react\";\r\nimport { createPortal } from \"react-dom\";\r\nimport { cn } from \"@/lib/utils/cn\";\r\nimport { useShadCNAnimations } from \"@/lib/utils/shadcn-animations\";\r\n\r\ninterface PopoverProps {\n trigger: React.ReactElement;\n children: React.ReactNode;\n className?: string;\n contentClassName?: string;\n placement?: \"top\" | \"bottom\" | \"left\" | \"right\" | \"top-start\" | \"bottom-start\" | \"top-end\" | \"bottom-end\";\n modal?: boolean;\n disabled?: boolean;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n matchTriggerWidth?: boolean;\n contentWidth?: number; // optional fixed width\n}\n\r\nexport const Popover: React.FC<PopoverProps> = ({\n trigger,\n children, \n className,\n contentClassName,\n placement = \"bottom\",\n modal = false,\n disabled = false,\n open,\n onOpenChange,\n matchTriggerWidth = false,\n contentWidth\n}) => {\n const [internalOpen, setInternalOpen] = React.useState(false);\n const [dropdownPosition, setDropdownPosition] = React.useState<{top: number, left: number, width?: number, alignEnd?: boolean} | null>(null);\n const triggerRef = React.useRef<HTMLElement>(null);\n\r\n // Inject ShadCN animations\r\n useShadCNAnimations();\r\n \r\n const isOpen = open !== undefined ? open : internalOpen;\r\n const setIsOpen = onOpenChange || setInternalOpen;\r\n\r\n // Calculate positioning synchronously on open to avoid flicker\r\n const calculatePosition = React.useCallback(() => {\n if (!triggerRef.current) return null;\n const rect = triggerRef.current.getBoundingClientRect();\n const scrollTop = window.pageYOffset || document.documentElement.scrollTop;\n const scrollLeft = window.pageXOffset || document.documentElement.scrollLeft;\n\n let top = rect.bottom + scrollTop + 4;\n let left = rect.left + scrollLeft;\n let alignEnd = false;\n const width = matchTriggerWidth ? rect.width : contentWidth;\n\r\n switch (placement) {\r\n case 'top':\r\n case 'top-start':\r\n top = rect.top + scrollTop - 4;\r\n break;\r\n case 'top-end':\n top = rect.top + scrollTop - 4;\n left = rect.right + scrollLeft;\n alignEnd = true;\n break;\n case 'bottom':\n case 'bottom-start':\n top = rect.bottom + scrollTop + 4;\n break;\n case 'bottom-end':\n top = rect.bottom + scrollTop + 4;\n left = rect.right + scrollLeft;\n alignEnd = true;\n break;\n case 'left':\r\n top = rect.top + scrollTop;\r\n left = rect.left + scrollLeft - 4;\r\n break;\r\n case 'right':\r\n top = rect.top + scrollTop;\r\n left = rect.right + scrollLeft + 4;\r\n break;\r\n }\r\n\r\n return {\n top,\n left,\n width,\n alignEnd,\n };\n }, [placement, matchTriggerWidth, contentWidth]);\n\r\n // Reposition on resize/scroll while open\r\n React.useEffect(() => {\r\n if (!isOpen) return;\r\n const handler = () => {\r\n const pos = calculatePosition();\r\n if (pos) setDropdownPosition(pos);\r\n };\r\n window.addEventListener('resize', handler);\r\n // With absolute positioning, scrolling the page moves the popover along.\r\n // Still, listen to scroll to adjust for nested scrolling containers.\r\n window.addEventListener('scroll', handler, true);\r\n return () => {\r\n window.removeEventListener('resize', handler);\r\n window.removeEventListener('scroll', handler, true);\r\n };\r\n }, [isOpen, calculatePosition]);\r\n\r\n // Handle clicks outside\r\n React.useEffect(() => {\r\n if (!isOpen) return;\r\n\r\n const handleClickOutside = (event: MouseEvent) => {\r\n const target = event.target as Node;\r\n if (triggerRef.current && !triggerRef.current.contains(target)) {\r\n const dropdown = document.querySelector('[data-popover]') as Element;\r\n if (dropdown && !dropdown.contains(target)) {\r\n setIsOpen(false);\r\n }\r\n }\r\n };\r\n\r\n const handleEscape = (event: KeyboardEvent) => {\r\n if (event.key === 'Escape') {\r\n setIsOpen(false);\r\n }\r\n };\r\n\r\n if (typeof document !== 'undefined') {\r\n document.addEventListener('mousedown', handleClickOutside);\r\n document.addEventListener('keydown', handleEscape);\r\n \r\n return () => {\r\n document.removeEventListener('mousedown', handleClickOutside);\r\n document.removeEventListener('keydown', handleEscape);\r\n };\r\n }\r\n }, [isOpen, setIsOpen]);\r\n\r\n const handleTriggerClick = () => {\r\n if (!disabled) {\r\n const next = !isOpen;\r\n if (next) {\r\n const pos = calculatePosition();\r\n if (pos) setDropdownPosition(pos);\r\n }\r\n setIsOpen(next);\r\n }\r\n };\r\n\r\n const popoverContent = isOpen && dropdownPosition ? (\n <div\n data-popover\n style={{\n position: 'absolute',\n top: dropdownPosition?.top || 0,\n left: dropdownPosition?.left || 0,\n width: dropdownPosition?.width || undefined,\n transform: dropdownPosition?.alignEnd ? 'translateX(-100%)' : undefined,\n zIndex: 9999,\n }}\n data-state=\"open\"\n role=\"dialog\"\n aria-modal={modal || undefined}\n className={cn(\r\n \"z-9999\",\r\n // shadcn-like enter animation\r\n \"data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95\",\r\n className\r\n )}\r\n >\r\n <div\r\n className={cn(\r\n \"rounded-md border bg-popover text-popover-foreground shadow-md\",\r\n \"backdrop-blur-sm bg-popover/95 border-border/60 p-4\",\r\n contentClassName\r\n )}\r\n tabIndex={-1}\r\n >\r\n {children}\r\n </div>\r\n </div>\r\n ) : null;\r\n\r\n return (\r\n <>\r\n {(() => {\r\n const triggerEl = trigger as React.ReactElement<any>;\r\n return React.cloneElement(triggerEl, {\r\n ref: triggerRef,\r\n onClick: (e: React.MouseEvent) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n handleTriggerClick();\r\n // Call original onClick if exists\r\n if (triggerEl.props && typeof triggerEl.props.onClick === 'function') {\r\n triggerEl.props.onClick(e);\r\n }\r\n },\r\n 'aria-expanded': isOpen,\r\n 'aria-haspopup': 'dialog',\r\n className: cn(\r\n triggerEl.props?.className,\r\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background rounded-md'\r\n )\r\n } as any);\r\n })()}\r\n {isOpen && dropdownPosition && typeof window !== 'undefined' && createPortal(popoverContent, document.body)}\r\n </>\r\n );\r\n};\r\n","// ShadCN UI Animation Styles - Enhanced with smooth spring-like animations\r\nexport const shadcnAnimationStyles = `\r\n /* ============================================\r\n * DROPDOWN / POPOVER ANIMATIONS\r\n * Uses spring-like cubic-bezier for natural feel\r\n * ============================================ */\r\n \r\n /* Native-like Combobox Animation - Mimics browser default select */\r\n [data-state=\"open\"][data-combobox-dropdown] {\r\n animation: comboboxOpen 150ms cubic-bezier(0.2, 0, 0, 1);\r\n transform-origin: top center;\r\n }\r\n\r\n [data-state=\"closed\"][data-combobox-dropdown] {\r\n animation: comboboxClose 120ms cubic-bezier(0.4, 0, 1, 1);\r\n transform-origin: top center;\r\n }\r\n\r\n @keyframes comboboxOpen {\r\n 0% {\r\n opacity: 0;\r\n transform: translateY(-4px) scaleY(0.9);\r\n }\r\n 100% {\r\n opacity: 1;\r\n transform: translateY(0) scaleY(1);\r\n }\r\n }\r\n\r\n @keyframes comboboxClose {\r\n 0% {\r\n opacity: 1;\r\n transform: translateY(0) scaleY(1);\r\n }\r\n 100% {\r\n opacity: 0;\r\n transform: translateY(-4px) scaleY(0.9);\r\n }\r\n }\r\n\r\n /* Generic dropdown open/close */\r\n [data-state=\"open\"] {\r\n animation: slideDownAndFade 220ms cubic-bezier(0.16, 1, 0.3, 1);\r\n }\r\n \r\n [data-state=\"closed\"] {\r\n animation: slideUpAndFade 180ms cubic-bezier(0.4, 0, 0.2, 1);\r\n }\r\n \r\n @keyframes slideDownAndFade {\r\n from {\r\n opacity: 0;\r\n transform: translateY(-4px) scale(0.98);\r\n }\r\n to {\r\n opacity: 1;\r\n transform: translateY(0) scale(1);\r\n }\r\n }\r\n \r\n @keyframes slideUpAndFade {\r\n from {\r\n opacity: 1;\r\n transform: translateY(0) scale(1);\r\n }\r\n to {\r\n opacity: 0;\r\n transform: translateY(-4px) scale(0.98);\r\n }\r\n }\r\n \r\n /* ============================================\r\n * DROPDOWN ITEMS - Native-like instant appearance\r\n * ============================================ */\r\n\r\n /* Fast staggered animation for native feel */\r\n .dropdown-item {\r\n opacity: 0;\r\n animation: itemFadeIn 120ms cubic-bezier(0.2, 0, 0, 1) forwards;\r\n }\r\n\r\n @keyframes itemFadeIn {\r\n 0% {\r\n opacity: 0;\r\n transform: translateY(-2px);\r\n }\r\n 100% {\r\n opacity: 1;\r\n transform: translateY(0);\r\n }\r\n }\r\n\r\n /* Subtle hover effect */\r\n .dropdown-item {\r\n transition: background-color 100ms ease;\r\n }\r\n \r\n /* ============================================\r\n * TOOLTIP / SIDE ANIMATIONS\r\n * ============================================ */\r\n \r\n [data-side=\"top\"] {\r\n animation: slideFromBottom 200ms cubic-bezier(0.16, 1, 0.3, 1);\r\n }\r\n \r\n [data-side=\"bottom\"] {\r\n animation: slideFromTop 200ms cubic-bezier(0.16, 1, 0.3, 1);\r\n }\r\n \r\n [data-side=\"left\"] {\r\n animation: slideFromRight 200ms cubic-bezier(0.16, 1, 0.3, 1);\r\n }\r\n \r\n [data-side=\"right\"] {\r\n animation: slideFromLeft 200ms cubic-bezier(0.16, 1, 0.3, 1);\r\n }\r\n \r\n @keyframes slideFromTop {\r\n from {\r\n opacity: 0;\r\n transform: translateY(-6px) scale(0.96);\r\n }\r\n to {\r\n opacity: 1;\r\n transform: translateY(0) scale(1);\r\n }\r\n }\r\n \r\n @keyframes slideFromBottom {\r\n from {\r\n opacity: 0;\r\n transform: translateY(6px) scale(0.96);\r\n }\r\n to {\r\n opacity: 1;\r\n transform: translateY(0) scale(1);\r\n }\r\n }\r\n \r\n @keyframes slideFromLeft {\r\n from {\r\n opacity: 0;\r\n transform: translateX(-6px) scale(0.96);\r\n }\r\n to {\r\n opacity: 1;\r\n transform: translateX(0) scale(1);\r\n }\r\n }\r\n \r\n @keyframes slideFromRight {\r\n from {\r\n opacity: 0;\r\n transform: translateX(6px) scale(0.96);\r\n }\r\n to {\r\n opacity: 1;\r\n transform: translateX(0) scale(1);\r\n }\r\n }\r\n \r\n /* ============================================\r\n * UTILITY ANIMATIONS\r\n * ============================================ */\r\n \r\n .animate-bounce-subtle {\r\n animation: bounceSubtle 600ms cubic-bezier(0.34, 1.56, 0.64, 1);\r\n }\r\n \r\n @keyframes bounceSubtle {\r\n 0%, 100% {\r\n transform: translateY(0);\r\n }\r\n 50% {\r\n transform: translateY(-4px);\r\n }\r\n }\r\n \r\n .animate-scale-in {\r\n animation: scaleIn 200ms cubic-bezier(0.34, 1.56, 0.64, 1);\r\n }\r\n \r\n @keyframes scaleIn {\r\n from {\r\n opacity: 0;\r\n transform: scale(0.9);\r\n }\r\n to {\r\n opacity: 1;\r\n transform: scale(1);\r\n }\r\n }\r\n \r\n /* Smooth backdrop blur transition */\r\n .backdrop-animate {\r\n transition: backdrop-filter 200ms ease, background-color 200ms ease;\r\n }\r\n`;\r\n\r\n// Hook to inject ShadCN animation styles\r\nexport const useShadCNAnimations = () => {\r\n if (typeof document !== \"undefined\") {\r\n const styleId = \"shadcn-animations\";\r\n if (!document.getElementById(styleId)) {\r\n const styleElement = document.createElement(\"style\");\r\n styleElement.id = styleId;\r\n styleElement.textContent = shadcnAnimationStyles;\r\n document.head.appendChild(styleElement);\r\n }\r\n }\r\n};\r\n","\"use client\";\r\n\r\nimport * as React from \"react\";\r\nimport { createPortal } from \"react-dom\";\r\nimport { cn } from \"@/lib/utils/cn\";\r\nimport { X } from \"lucide-react\";\r\nimport Button from \"./Button\";\r\n\r\ninterface SheetProps {\r\n open: boolean;\r\n onOpenChange: (open: boolean) => void;\r\n side?: \"left\" | \"right\" | \"top\" | \"bottom\";\r\n size?: \"sm\" | \"md\" | \"lg\" | \"xl\" | \"full\";\r\n variant?: \"default\" | \"overlay\" | \"push\";\r\n children: React.ReactNode;\r\n title?: React.ReactNode;\r\n description?: React.ReactNode;\r\n className?: string;\r\n showClose?: boolean;\r\n closeOnOutsideClick?: boolean;\r\n closeOnEscape?: boolean;\r\n header?: React.ReactNode;\r\n footer?: React.ReactNode;\r\n}\r\n\r\nconst sizeStyles = {\r\n sm: {\r\n right: \"w-[300px]\",\r\n left: \"w-[300px]\",\r\n top: \"h-[200px]\",\r\n bottom: \"h-[200px]\",\r\n },\r\n md: {\r\n right: \"w-[400px]\",\r\n left: \"w-[400px]\",\r\n top: \"h-[300px]\",\r\n bottom: \"h-[300px]\",\r\n },\r\n lg: {\r\n right: \"w-[500px]\",\r\n left: \"w-[500px]\",\r\n top: \"h-[400px]\",\r\n bottom: \"h-[400px]\",\r\n },\r\n xl: {\r\n right: \"w-[600px]\",\r\n left: \"w-[600px]\",\r\n top: \"h-[500px]\",\r\n bottom: \"h-[500px]\",\r\n },\r\n full: {\r\n right: \"w-full\",\r\n left: \"w-full\",\r\n top: \"h-full\",\r\n bottom: \"h-full\",\r\n },\r\n};\r\n\r\nconst positionStyles = {\r\n right: \"right-0 top-0 h-full\",\r\n left: \"left-0 top-0 h-full\",\r\n top: \"top-0 left-0 w-full\",\r\n bottom: \"bottom-0 left-0 w-full\",\r\n};\r\n\r\nconst animationStyles = {\r\n right: {\r\n initial: \"translate-x-full\",\r\n animate: \"translate-x-0\",\r\n exit: \"translate-x-full\",\r\n },\r\n left: {\r\n initial: \"-translate-x-full\",\r\n animate: \"translate-x-0\",\r\n exit: \"-translate-x-full\",\r\n },\r\n top: {\r\n initial: \"-translate-y-full\",\r\n animate: \"translate-y-0\",\r\n exit: \"-translate-y-full\",\r\n },\r\n bottom: {\r\n initial: \"translate-y-full\",\r\n animate: \"translate-y-0\",\r\n exit: \"translate-y-full\",\r\n },\r\n};\r\n\r\nexport const Sheet: React.FC<SheetProps> = ({\r\n open,\r\n onOpenChange,\r\n side = \"right\",\r\n size = \"md\",\r\n variant = \"default\",\r\n children,\r\n title,\r\n description,\r\n className,\r\n showClose = true,\r\n closeOnOutsideClick = true,\r\n closeOnEscape = true,\r\n header,\r\n footer,\r\n}) => {\r\n const [mounted, setMounted] = React.useState(false);\r\n const [isAnimating, setIsAnimating] = React.useState(true);\r\n const [isVisible, setIsVisible] = React.useState(false);\r\n\r\n React.useEffect(() => {\r\n setMounted(true);\r\n }, []);\r\n\r\n // Handle escape key\r\n React.useEffect(() => {\r\n if (!closeOnEscape) return;\r\n\r\n const handleEscape = (e: KeyboardEvent) => {\r\n if (e.key === \"Escape\" && open) {\r\n onOpenChange(false);\r\n }\r\n };\r\n\r\n document.addEventListener(\"keydown\", handleEscape);\r\n return () => document.removeEventListener(\"keydown\", handleEscape);\r\n }, [open, closeOnEscape, onOpenChange]);\r\n\r\n // Prevent body scroll when sheet is open\r\n React.useEffect(() => {\r\n if (open) {\r\n document.body.style.overflow = \"hidden\";\r\n } else {\r\n document.body.style.overflow = \"unset\";\r\n }\r\n\r\n return () => {\r\n document.body.style.overflow = \"unset\";\r\n };\r\n }, [open]);\r\n\r\n // Animation handling\r\n React.useEffect(() => {\r\n if (open) {\r\n setIsVisible(true);\r\n setIsAnimating(true);\r\n // Start animation on next frame to avoid flicker\r\n requestAnimationFrame(() => {\r\n setIsAnimating(false);\r\n });\r\n } else if (isVisible) {\r\n setIsAnimating(true);\r\n // Hide after animation completes\r\n const hideTimer = setTimeout(() => {\r\n setIsVisible(false);\r\n }, 300);\r\n return () => clearTimeout(hideTimer);\r\n }\r\n }, [open, isVisible]);\r\n\r\n const handleOverlayClick = (e: React.MouseEvent) => {\r\n if (closeOnOutsideClick && e.target === e.currentTarget) {\r\n onOpenChange(false);\r\n }\r\n };\r\n\r\n const handleClose = () => {\r\n onOpenChange(false);\r\n };\r\n\r\n if (!mounted || (!open && !isVisible)) return null;\r\n\r\n const sheetContent = (\r\n <div className=\"fixed inset-0 z-50\">\r\n {/* Overlay */}\r\n <div\r\n className={cn(\r\n \"fixed inset-0 transition-all duration-300 ease-out\",\r\n variant === \"overlay\" ? \"bg-background/95 backdrop-blur-sm\" : \"bg-background/80 backdrop-blur-sm\",\r\n open && !isAnimating ? \"opacity-100\" : \"opacity-0\"\r\n )}\r\n onClick={handleOverlayClick}\r\n />\r\n\r\n {/* Sheet */}\r\n <div\r\n className={cn(\r\n \"fixed flex flex-col bg-background text-foreground shadow-2xl\",\r\n \"border-border transition-all duration-300 ease-out\",\r\n positionStyles[side],\r\n sizeStyles[size][side],\r\n // Borders based on side\r\n side === \"right\" && \"border-l\",\r\n side === \"left\" && \"border-r\",\r\n side === \"top\" && \"border-b\",\r\n side === \"bottom\" && \"border-t\",\r\n // Animation classes - smooth slide in/out\r\n open && !isAnimating ? animationStyles[side].animate : animationStyles[side].initial,\r\n className\r\n )}\r\n style={{\r\n transform:\r\n open && !isAnimating\r\n ? \"translate(0, 0)\"\r\n : side === \"right\"\r\n ? \"translateX(100%)\"\r\n : side === \"left\"\r\n ? \"translateX(-100%)\"\r\n : side === \"top\"\r\n ? \"translateY(-100%)\"\r\n : \"translateY(100%)\",\r\n transition: \"transform 300ms cubic-bezier(0.4, 0, 0.2, 1)\",\r\n }}\r\n >\r\n {/* Header */}\r\n {(title || description || header || showClose) && (\r\n <div className=\"shrink-0 border-b border-border\">\r\n {header || (\r\n <div className=\"flex items-center justify-between p-4\">\r\n <div className=\"flex-1\">\r\n {title && <h2 className=\"text-lg font-semibold text-foreground\">{title}</h2>}\r\n {description && <p className=\"text-sm text-muted-foreground mt-1\">{description}</p>}\r\n </div>\r\n {showClose && <Button variant=\"ghost\" size=\"sm\" onClick={handleClose} className=\"h-8 w-8 p-0 rounded-md cursor-pointer\" icon={X} />}\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* Content */}\r\n <div\r\n className=\"flex-1 overflow-auto p-4\"\r\n style={{\r\n opacity: open && !isAnimating ? 1 : 0,\r\n transform: open && !isAnimating ? \"translateY(0)\" : \"translateY(20px)\",\r\n transition: \"opacity 400ms ease-out 100ms, transform 400ms ease-out 100ms\",\r\n }}\r\n >\r\n {children}\r\n </div>\r\n\r\n {/* Footer */}\r\n {footer && <div className=\"shrink-0 border-t border-border p-4\">{footer}</div>}\r\n </div>\r\n </div>\r\n );\r\n\r\n return typeof window !== \"undefined\" ? createPortal(sheetContent, document.body) : null;\r\n};\r\n\r\n// Specialized Sheet components\r\ninterface DrawerProps extends Omit<SheetProps, \"side\"> {\r\n placement?: \"left\" | \"right\";\r\n}\r\n\r\nexport const Drawer: React.FC<DrawerProps> = ({ placement = \"right\", ...props }) => {\r\n return <Sheet {...props} side={placement} variant=\"overlay\" />;\r\n};\r\n\r\ninterface SlideOverProps extends Omit<SheetProps, \"side\" | \"variant\"> {}\r\n\r\nexport const SlideOver: React.FC<SlideOverProps> = (props) => {\r\n return <Sheet {...props} side=\"right\" variant=\"overlay\" size=\"lg\" />;\r\n};\r\n\r\ninterface BottomSheetProps extends Omit<SheetProps, \"side\"> {\r\n snapPoints?: string[];\r\n defaultSnap?: number;\r\n}\r\n\r\nexport const BottomSheet: React.FC<BottomSheetProps> = ({ snapPoints = [\"25%\", \"50%\", \"90%\"], defaultSnap = 1, ...props }) => {\r\n return <Sheet {...props} side=\"bottom\" variant=\"overlay\" className={cn(\"rounded-t-lg\", props.className)} />;\r\n};\r\n\r\ninterface SidebarSheetProps extends Omit<SheetProps, \"side\" | \"variant\"> {\r\n navigation?: React.ReactNode;\r\n}\r\n\r\nexport const SidebarSheet: React.FC<SidebarSheetProps> = ({ navigation, children, ...props }) => {\r\n return (\r\n <Sheet {...props} side=\"left\" variant=\"push\" size=\"md\">\r\n {navigation && <div className=\"border-b border-border pb-4 mb-4\">{navigation}</div>}\r\n {children}\r\n </Sheet>\r\n );\r\n};\r\n","// components/ui/Alert.tsx\nimport { cn } from \"@/lib/utils/cn\";\nimport { ReactNode, useState } from \"react\";\nimport { Info, AlertTriangle, CheckCircle, XCircle, X } from \"lucide-react\";\nimport { useTranslations } from \"@/lib/i18n/translation-adapter\";\n\ntype AlertVariant = \"default\" | \"info\" | \"success\" | \"warning\" | \"error\";\n\nconst variantConfig: Record<\n AlertVariant,\n {\n icon: typeof Info;\n containerClassName: string;\n iconClassName: string;\n iconBgClassName: string;\n accentBarClassName: string;\n }\n> = {\n default: {\n icon: Info,\n containerClassName: \"bg-muted/50 border-border\",\n iconClassName: \"text-muted-foreground\",\n iconBgClassName: \"bg-muted\",\n accentBarClassName: \"bg-muted-foreground\",\n },\n info: {\n icon: Info,\n containerClassName: \"bg-info/5 border-info/30\",\n iconClassName: \"text-info\",\n iconBgClassName: \"bg-info/15\",\n accentBarClassName: \"bg-info\",\n },\n success: {\n icon: CheckCircle,\n containerClassName: \"bg-success/5 border-success/30\",\n iconClassName: \"text-success\",\n iconBgClassName: \"bg-success/15\",\n accentBarClassName: \"bg-success\",\n },\n warning: {\n icon: AlertTriangle,\n containerClassName: \"bg-warning/5 border-warning/30\",\n iconClassName: \"text-warning\",\n iconBgClassName: \"bg-warning/15\",\n accentBarClassName: \"bg-warning\",\n },\n error: {\n icon: XCircle,\n containerClassName: \"bg-destructive/5 border-destructive/30\",\n iconClassName: \"text-destructive\",\n iconBgClassName: \"bg-destructive/15\",\n accentBarClassName: \"bg-destructive\",\n },\n};\n\ninterface AlertProps {\n title?: string;\n description?: ReactNode;\n variant?: AlertVariant;\n className?: string;\n icon?: ReactNode;\n dismissible?: boolean;\n onClose?: () => void;\n actions?: ReactNode;\n closeAriaLabel?: string;\n}\n\nconst Alert = ({ title, description, variant = \"default\", className, icon, dismissible = false, onClose, actions, closeAriaLabel }: AlertProps) => {\n const [open, setOpen] = useState(true);\n const t = useTranslations(\"Common\");\n\n if (!open) return null;\n\n const handleClose = () => {\n setOpen(false);\n onClose?.();\n };\n\n const config = variantConfig[variant];\n const Icon = config.icon;\n\n return (\n <div\n className={cn(\n \"relative w-full rounded-r-lg border border-l-0 overflow-hidden\",\n \"flex items-start gap-3 p-4 pl-5\",\n \"backdrop-blur-md\",\n config.containerClassName,\n className\n )}\n role=\"alert\"\n aria-live={variant === \"error\" ? \"assertive\" : \"polite\"}\n >\n {/* Accent bar - straight edge, not affected by rounded corners */}\n <div className={cn(\"absolute left-0 top-0 bottom-0 w-1\", config.accentBarClassName)} />\n\n <div className={cn(\"flex items-center justify-center w-8 h-8 rounded-full shrink-0\", config.iconBgClassName)}>\n {icon ?? <Icon className={cn(\"h-4 w-4\", config.iconClassName)} />}\n </div>\n\n <div className=\"flex-1 min-w-0\">\n {title && <p className=\"font-semibold text-sm leading-none mb-1 text-foreground\">{title}</p>}\n {description &&\n (typeof description === \"string\" ? (\n <p className=\"text-sm text-muted-foreground leading-relaxed wrap-break-word\">{description}</p>\n ) : (\n <div className=\"text-sm text-muted-foreground leading-relaxed wrap-break-word\">{description}</div>\n ))}\n {actions && <div className=\"mt-2 flex flex-wrap gap-2\">{actions}</div>}\n </div>\n\n {dismissible && (\n <button\n onClick={handleClose}\n className=\"rounded-md p-1 hover:bg-accent focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n aria-label={closeAriaLabel || t(\"closeAlert\")}\n >\n <X className=\"h-4 w-4\" />\n </button>\n )}\n </div>\n );\n};\n\nexport default Alert;\n","\"use client\";\r\n\r\nimport React, { useEffect, useState } from \"react\";\r\nimport { cn } from \"@/lib/utils/cn\";\r\nimport { Activity } from \"lucide-react\";\r\nimport { loading, LoadingState } from \"@/lib/utils/loading\";\r\nimport { useTranslations } from \"@/lib/i18n/translation-adapter\";\r\n\r\ninterface GlobalLoadingProps {\r\n className?: string;\r\n backdrop?: boolean;\r\n position?: \"fixed\" | \"absolute\";\r\n size?: \"sm\" | \"md\" | \"lg\";\r\n}\r\n\r\n/**\r\n * Component GlobalLoading - tự động lắng nghe singleton loading state\r\n * Chỉ cần gắn 1 lần ở root của app\r\n */\r\nexport const GlobalLoading: React.FC<GlobalLoadingProps> = ({ className, backdrop = true, position = \"fixed\", size = \"lg\" }) => {\r\n const [state, setState] = useState<LoadingState>(() => loading.getState());\r\n\r\n useEffect(() => {\r\n // Subscribe to loading state changes\r\n const unsubscribe = loading.subscribe(setState);\r\n return unsubscribe;\r\n }, []);\r\n\r\n if (!state.isVisible) return null;\r\n\r\n return (\r\n <div\r\n className={cn(\r\n \"inset-0 z-100000 flex items-center justify-center\",\r\n position === \"fixed\" ? \"fixed\" : \"absolute\",\r\n backdrop && \"bg-background/90 backdrop-blur-sm\",\r\n className\r\n )}\r\n role=\"dialog\"\r\n aria-modal\r\n aria-label=\"Loading\"\r\n >\r\n <div\r\n className=\"flex items-center justify-center space-x-3 backdrop-blur-sm rounded-lg px-6 py-4 shadow-lg\"\r\n role=\"status\"\r\n aria-live=\"assertive\"\r\n aria-busy\r\n >\r\n <Activity className=\"w-6 h-6 animate-spin text-primary-background\" aria-hidden />\r\n {state.text && <span className=\"text-base font-medium text-foreground\">{state.text}</span>}\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\ninterface PageLoadingProps {\r\n message?: string;\r\n className?: string;\r\n}\r\n\r\nexport const PageLoading: React.FC<PageLoadingProps> = ({ message, className }) => {\r\n const t = useTranslations(\"Loading\");\r\n const defaultMessage = message || t(\"loadingPage\");\r\n return (\r\n <div className={cn(\"min-h-screen flex items-center justify-center bg-background\", className)}>\r\n <div className=\"text-center space-y-4\">\r\n <Activity className=\"w-8 h-8 animate-spin text-primary mx-auto\" />\r\n <div>\r\n <p className=\"text-lg font-medium text-foreground\">{defaultMessage}</p>\r\n <p className=\"text-sm text-muted-foreground mt-2\">{t(\"pleaseWait\")}</p>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\n// Inline loading component cho buttons hoặc containers nhỏ\r\ninterface InlineLoadingProps {\r\n isLoading: boolean;\r\n text?: string;\r\n className?: string;\r\n size?: \"sm\" | \"md\" | \"lg\";\r\n}\r\n\r\nexport const InlineLoading: React.FC<InlineLoadingProps> = ({ isLoading, text, className, size = \"md\" }) => {\r\n if (!isLoading) return null;\r\n\r\n const sizeClasses = {\r\n sm: \"w-4 h-4\",\r\n md: \"w-6 h-6\",\r\n lg: \"w-8 h-8\",\r\n };\r\n\r\n return (\r\n <div className={cn(\"flex items-center justify-center space-x-2\", className)}>\r\n <Activity className={cn(\"animate-spin text-primary\", sizeClasses[size])} />\r\n {text && <span className=\"text-sm text-muted-foreground animate-pulse\">{text}</span>}\r\n </div>\r\n );\r\n};\r\n\r\n// Button loading wrapper\r\ninterface ButtonLoadingProps {\r\n isLoading: boolean;\r\n children: React.ReactNode;\r\n className?: string;\r\n disabled?: boolean;\r\n loadingText?: string;\r\n}\r\n\r\nexport const ButtonLoading: React.FC<ButtonLoadingProps> = ({ isLoading, children, className, disabled, loadingText }) => {\r\n // Avoid nested <button> by wrapping with a div and cloning child to disable it when loading\r\n const child = React.isValidElement(children)\r\n ? React.cloneElement(children as any, {\r\n disabled: ((children as any).props?.disabled ?? false) || disabled || isLoading,\r\n \"aria-busy\": isLoading || undefined,\r\n })\r\n : children;\r\n\r\n return (\r\n <div className={cn(\"relative inline-block\", isLoading && \"cursor-not-allowed\", className)}>\r\n {isLoading && (\r\n <div className=\"absolute inset-0 flex items-center justify-center pointer-events-none\">\r\n <Activity className=\"w-4 h-4 animate-spin text-primary-foreground\" />\r\n {loadingText && <span className=\"ml-2 text-sm\">{loadingText}</span>}\r\n </div>\r\n )}\r\n\r\n <div className={cn(isLoading && \"opacity-50 pointer-events-none\")}>{child}</div>\r\n </div>\r\n );\r\n};\r\n","/**\r\n * Singleton Loading Manager - Đơn giản và dễ sử dụng\r\n * Chỉ cần gọi loading.show() và loading.hide() từ bất kỳ đâu\r\n */\r\n\r\ntype LoadingState = {\r\n isVisible: boolean;\r\n text?: string;\r\n};\r\n\r\nclass LoadingManager {\r\n private state: LoadingState = { isVisible: false };\r\n private listeners: Set<(state: LoadingState) => void> = new Set();\r\n\r\n /**\r\n * Hiển thị loading với text tùy chọn\r\n */\r\n show(text?: string) {\r\n this.state = { isVisible: true, text };\r\n this.notifyListeners();\r\n }\r\n\r\n /**\r\n * Ẩn loading\r\n */\r\n hide() {\r\n this.state = { isVisible: false, text: undefined };\r\n this.notifyListeners();\r\n }\r\n\r\n\r\n /**\r\n * Lấy state hiện tại\r\n */\r\n getState(): LoadingState {\r\n return { ...this.state };\r\n }\r\n\r\n /**\r\n * Subscribe để nhận thông báo khi state thay đổi\r\n */\r\n subscribe(listener: (state: LoadingState) => void): () => void {\r\n this.listeners.add(listener);\r\n // Trả về function để unsubscribe\r\n return () => {\r\n this.listeners.delete(listener);\r\n };\r\n }\r\n\r\n private notifyListeners() {\r\n this.listeners.forEach(listener => listener(this.state));\r\n }\r\n}\r\n\r\n// Singleton instance - export để dùng trực tiếp\r\nexport const loading = new LoadingManager();\r\n\r\n// Export type cho TypeScript\r\nexport type { LoadingState };","import * as React from \"react\";\r\nimport { cn } from \"@/lib/utils/cn\";\r\nimport Link from \"next/link\";\r\nimport { ChevronRight, Home, MoreHorizontal } from \"lucide-react\";\r\n\r\ninterface BreadcrumbItem {\r\n label: string;\r\n href?: string;\r\n icon?: React.ComponentType<{ className?: string }>;\r\n disabled?: boolean;\r\n}\r\n\r\ninterface BreadcrumbProps {\r\n items: BreadcrumbItem[];\r\n className?: string;\r\n separator?: React.ComponentType<{ className?: string }> | string;\r\n size?: \"sm\" | \"md\" | \"lg\";\r\n variant?: \"default\" | \"simple\" | \"slash\" | \"arrow\" | \"pill\";\r\n maxItems?: number;\r\n showHome?: boolean;\r\n homeHref?: string;\r\n collapsible?: boolean;\r\n}\r\n\r\nconst sizeStyles = {\r\n sm: {\r\n text: \"text-xs\",\r\n spacing: \"space-x-0.5\",\r\n padding: \"px-1.5 py-0.5\",\r\n icon: \"h-3 w-3\"\r\n },\r\n md: {\r\n text: \"text-sm\", \r\n spacing: \"space-x-1\",\r\n padding: \"px-2 py-1\",\r\n icon: \"h-4 w-4\"\r\n },\r\n lg: {\r\n text: \"text-base\",\r\n spacing: \"space-x-1.5\", \r\n padding: \"px-3 py-1.5\",\r\n icon: \"h-5 w-5\"\r\n }\r\n};\r\n\r\nconst variantStyles = {\r\n default: \"text-muted-foreground hover:text-foreground\",\r\n simple: \"text-muted-foreground hover:text-foreground underline-offset-4 hover:underline\",\r\n slash: \"text-muted-foreground hover:text-foreground\",\r\n arrow: \"text-muted-foreground hover:text-foreground\",\r\n pill: \"text-muted-foreground hover:text-foreground hover:bg-accent rounded-md transition-colors\"\r\n};\r\n\r\nexport const Breadcrumb: React.FC<BreadcrumbProps> = ({\r\n items,\r\n className,\r\n separator = ChevronRight,\r\n size = \"md\",\r\n variant = \"default\",\r\n maxItems = 5,\r\n showHome = false,\r\n homeHref = \"/\",\r\n collapsible = true\r\n}) => {\r\n const [isCollapsed, setIsCollapsed] = React.useState(false);\r\n \r\n React.useEffect(() => {\r\n if (collapsible && items.length > maxItems) {\r\n setIsCollapsed(true);\r\n }\r\n }, [items.length, maxItems, collapsible]);\r\n\r\n const getSeparator = () => {\r\n if (typeof separator === 'string') {\r\n return <span className=\"text-muted-foreground\">{separator}</span>;\r\n }\r\n \r\n if (variant === \"slash\") {\r\n return <span className=\"text-muted-foreground\">/</span>;\r\n }\r\n \r\n if (variant === \"arrow\") {\r\n return <span className=\"text-muted-foreground\">→</span>;\r\n }\r\n \r\n const SeparatorComponent = separator;\r\n return <SeparatorComponent className={cn(\"text-muted-foreground\", sizeStyles[size].icon)} />;\r\n };\r\n\r\n const processedItems = React.useMemo(() => {\r\n let finalItems = [...items];\r\n \r\n if (showHome && finalItems[0]?.href !== homeHref) {\r\n finalItems.unshift({\r\n label: \"Home\",\r\n href: homeHref,\r\n icon: Home\r\n });\r\n }\r\n\r\n if (isCollapsed && finalItems.length > maxItems) {\r\n const firstItems = finalItems.slice(0, 1);\r\n const lastItems = finalItems.slice(-(maxItems - 2));\r\n finalItems = [...firstItems, { label: \"...\", disabled: true }, ...lastItems];\r\n }\r\n\r\n return finalItems;\r\n }, [items, showHome, homeHref, isCollapsed, maxItems]);\r\n\r\n const handleCollapseToggle = () => {\r\n setIsCollapsed(!isCollapsed);\r\n };\r\n\r\n return (\r\n <nav \r\n className={cn(\"flex w-full items-center\", sizeStyles[size].text, className)} \r\n aria-label=\"Breadcrumb navigation\"\r\n >\r\n <ol className={cn(\"flex items-center\", sizeStyles[size].spacing)}>\r\n {processedItems.map((item, index) => {\r\n const isLast = index === processedItems.length - 1;\r\n const isCollapsedIndicator = item.label === \"...\";\r\n const Icon = item.icon;\r\n\r\n return (\r\n <li key={`${item.label}-${index}`} className=\"flex items-center\">\r\n {isCollapsedIndicator ? (\r\n <button\r\n onClick={handleCollapseToggle}\r\n className={cn(\r\n \"inline-flex items-center gap-1 transition-all duration-200\",\r\n \"hover:bg-accent rounded-md\",\r\n sizeStyles[size].padding,\r\n \"focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-1\"\r\n )}\r\n aria-label=\"Show all breadcrumb items\"\r\n >\r\n <MoreHorizontal className={sizeStyles[size].icon} />\r\n </button>\r\n ) : item.href && !isLast && !item.disabled ? (\r\n <Link \r\n href={item.href}\r\n className={cn(\r\n \"inline-flex items-center gap-1 font-medium transition-all duration-200\",\r\n variantStyles[variant],\r\n variant === \"pill\" && sizeStyles[size].padding,\r\n \"focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-1 rounded-sm\"\r\n )}\r\n >\r\n {Icon && <Icon className={sizeStyles[size].icon} />}\r\n <span>{item.label}</span>\r\n </Link>\r\n ) : (\r\n <span \r\n className={cn(\r\n \"inline-flex items-center gap-1 font-medium\",\r\n isLast \r\n ? \"text-foreground\" \r\n : item.disabled \r\n ? \"text-muted-foreground/60 cursor-not-allowed\"\r\n : \"text-muted-foreground\",\r\n variant === \"pill\" && !isLast && sizeStyles[size].padding\r\n )}\r\n aria-current={isLast ? \"page\" : undefined}\r\n >\r\n {Icon && <Icon className={sizeStyles[size].icon} />}\r\n <span>{item.label}</span>\r\n </span>\r\n )}\r\n\r\n {!isLast && (\r\n <span \r\n className={cn(\"mx-1\", sizeStyles[size].spacing)} \r\n role=\"presentation\"\r\n aria-hidden=\"true\"\r\n >\r\n {getSeparator()}\r\n </span>\r\n )}\r\n </li>\r\n );\r\n })}\r\n </ol>\r\n </nav>\r\n );\r\n};\r\n\r\n// Specialized Breadcrumb components\r\ninterface SimpleBreadcrumbProps {\r\n items: string[];\r\n baseHref?: string;\r\n className?: string;\r\n}\r\n\r\nexport const SimpleBreadcrumb: React.FC<SimpleBreadcrumbProps> = ({\r\n items,\r\n baseHref = \"\",\r\n className\r\n}) => {\r\n const breadcrumbItems = items.map((item, index) => ({\r\n label: item,\r\n href: index < items.length - 1 ? `${baseHref}/${item.toLowerCase()}` : undefined\r\n }));\r\n\r\n return (\r\n <Breadcrumb \r\n items={breadcrumbItems}\r\n variant=\"simple\"\r\n className={className}\r\n />\r\n );\r\n};\r\n\r\ninterface IconBreadcrumbProps extends Omit<BreadcrumbProps, 'items'> {\r\n items: Array<{\r\n label: string;\r\n href?: string;\r\n icon: React.ComponentType<{ className?: string }>;\r\n }>;\r\n}\r\n\r\nexport const IconBreadcrumb: React.FC<IconBreadcrumbProps> = ({\r\n items,\r\n ...props\r\n}) => {\r\n return <Breadcrumb items={items} {...props} />;\r\n};\r\n\r\ninterface CompactBreadcrumbProps extends BreadcrumbProps {\r\n alwaysShowFirst?: boolean;\r\n alwaysShowLast?: boolean;\r\n}\r\n\r\nexport const CompactBreadcrumb: React.FC<CompactBreadcrumbProps> = ({\r\n alwaysShowFirst = true,\r\n alwaysShowLast = true,\r\n maxItems = 3,\r\n ...props\r\n}) => {\r\n return (\r\n <Breadcrumb \r\n {...props}\r\n maxItems={maxItems}\r\n collapsible={true}\r\n size=\"sm\"\r\n variant=\"pill\"\r\n />\r\n );\r\n};\r\n\r\nexport default Breadcrumb;\r\n","\"use client\";\r\n\r\nimport * as React from \"react\";\r\nimport { cn } from \"@/lib/utils/cn\";\r\n\r\ninterface Tab {\r\n label: string;\r\n value: string;\r\n content: React.ReactNode;\r\n icon?: React.ComponentType<{ className?: string }>;\r\n disabled?: boolean;\r\n}\r\n\r\ninterface TabsProps {\r\n tabs: Tab[];\r\n defaultValue?: string;\r\n className?: string;\r\n variant?: \"default\" | \"pills\" | \"underline\" | \"card\" | \"underline-card\";\r\n size?: \"sm\" | \"md\" | \"lg\";\r\n orientation?: \"horizontal\" | \"vertical\";\r\n onTabChange?: (value: string) => void;\r\n stretch?: boolean; // evenly distribute tabs (horizontal)\r\n}\r\n\r\nconst sizeStyles = {\r\n sm: {\r\n tab: \"py-1.5 px-3 text-xs\",\r\n content: \"mt-3 p-3\",\r\n },\r\n md: {\r\n tab: \"py-2 px-4 text-sm\",\r\n content: \"mt-4 p-4\",\r\n },\r\n lg: {\r\n tab: \"py-3 px-6 text-base\",\r\n content: \"mt-6 p-6\",\r\n },\r\n};\r\n\r\nconst variantStyles = {\r\n default: {\r\n container: \"border-b border-border\",\r\n tab: \"border-b-2 border-transparent hover:border-border/60\",\r\n activeTab: \"border-primary text-primary\",\r\n inactiveTab: \"text-muted-foreground hover:text-foreground\",\r\n },\r\n pills: {\r\n container: \"bg-muted p-1 rounded-lg\",\r\n tab: \"rounded-md transition-all duration-200\",\r\n activeTab: \"bg-background text-foreground shadow-sm\",\r\n inactiveTab: \"text-muted-foreground hover:text-foreground hover:bg-background/50\",\r\n },\r\n underline: {\r\n container: \"relative border-b border-border\",\r\n tab: \"relative transition-colors duration-200 pb-3 border-b-2 border-transparent hover:border-border/60\",\r\n activeTab: \"text-primary border-primary font-medium\",\r\n inactiveTab: \"text-muted-foreground hover:text-foreground\",\r\n },\r\n card: {\r\n container: \"space-y-1\",\r\n tab: \"rounded-lg border border-transparent transition-all duration-200\",\r\n activeTab: \"bg-primary text-primary-foreground border-primary\",\r\n inactiveTab: \"text-muted-foreground hover:text-foreground hover:bg-accent/50 hover:border-border hover:shadow-sm\",\r\n },\r\n \"underline-card\": {\r\n container: \"border-b border-border bg-card rounded-t-lg\",\r\n tab: \"relative transition-all duration-200 pb-3 px-4 border-b-2 border-transparent hover:border-primary/50 hover:bg-accent/30\",\r\n activeTab: \"text-primary border-primary font-medium bg-accent/20\",\r\n inactiveTab: \"text-muted-foreground hover:text-foreground\",\r\n },\r\n};\r\n\r\nexport const Tabs: React.FC<TabsProps> = ({ \r\n tabs, \r\n defaultValue, \r\n className,\r\n variant = \"default\",\r\n size = \"md\",\r\n orientation = \"horizontal\",\r\n onTabChange,\r\n stretch = false\r\n}) => {\r\n const [active, setActive] = React.useState<string>(defaultValue || tabs[0]?.value);\r\n const [underlineStyle, setUnderlineStyle] = React.useState<React.CSSProperties>({});\r\n const tabRefs = React.useRef<(HTMLButtonElement | null)[]>([]);\r\n // Generate a deterministic base id from tab values to avoid SSR/client mismatch\n const baseId = React.useMemo(() => {\n const key = tabs.map((t) => t.value).join(\"-\");\n return `tabs-${key || 'default'}`;\n }, [tabs]);\n\r\n const handleTabChange = (value: string) => {\r\n setActive(value);\r\n onTabChange?.(value);\r\n };\r\n\r\n // Update underline position for underline variant\r\n React.useEffect(() => {\r\n if (variant === \"underline\" && orientation === \"horizontal\") {\r\n const activeIndex = tabs.findIndex(tab => tab.value === active);\r\n const activeTab = tabRefs.current[activeIndex];\r\n \r\n if (activeTab) {\r\n const { offsetLeft, offsetWidth } = activeTab;\r\n setUnderlineStyle({\r\n left: offsetLeft,\r\n width: offsetWidth,\r\n });\r\n }\r\n }\r\n }, [active, variant, orientation, tabs]);\r\n\r\n const containerClasses = cn(\r\n \"w-full\",\r\n orientation === \"horizontal\" ? \"flex space-x-1 overflow-x-auto\" : \"flex flex-col space-y-1\",\r\n variantStyles[variant].container,\r\n className\r\n );\r\n\r\n const activeTab = tabs.find((tab) => tab.value === active);\r\n\r\n return (\r\n <div className={cn(\"w-full\", orientation === \"vertical\" && \"flex gap-6\")}>\r\n {/* Tab List */}\r\n <div className={containerClasses} role=\"tablist\" aria-orientation={orientation}>\r\n {tabs.map((tab, index) => {\r\n const isActive = active === tab.value;\r\n const Icon = tab.icon;\r\n const tabId = `${baseId}-tab-${index}`;\r\n const panelId = `${baseId}-panel-${index}`;\r\n \r\n return (\r\n <button\r\n key={tab.value}\r\n ref={(el) => { tabRefs.current[index] = el; }}\r\n onClick={() => !tab.disabled && handleTabChange(tab.value)}\r\n disabled={tab.disabled}\r\n style={{\r\n boxShadow: 'none',\r\n transform: 'none',\r\n outline: 'none',\r\n border: 'none'\r\n }}\r\n className={cn(\r\n \"font-medium transition-all duration-200 cursor-pointer flex items-center gap-2\",\r\n \"focus:outline-none focus-visible:outline-none\",\r\n \"disabled:opacity-50 disabled:cursor-not-allowed\",\r\n \"border-0 bg-transparent outline-none\", // Reset button default styles\r\n sizeStyles[size].tab,\r\n variantStyles[variant].tab,\r\n isActive\r\n ? variantStyles[variant].activeTab\r\n : variantStyles[variant].inactiveTab,\r\n orientation === \"vertical\" && \"justify-start w-full\",\r\n stretch && orientation === \"horizontal\" && \"flex-1 justify-center\"\r\n )}\r\n role=\"tab\"\r\n id={tabId}\r\n aria-selected={isActive}\r\n aria-controls={panelId}\r\n tabIndex={isActive ? 0 : -1}\r\n onKeyDown={(e) => {\r\n const count = tabs.length;\r\n const idx = tabs.findIndex(t => t.value === active);\r\n let next = idx;\r\n if (orientation === 'horizontal') {\r\n if (e.key === 'ArrowRight') next = (idx + 1) % count;\r\n if (e.key === 'ArrowLeft') next = (idx - 1 + count) % count;\r\n } else {\r\n if (e.key === 'ArrowDown') next = (idx + 1) % count;\r\n if (e.key === 'ArrowUp') next = (idx - 1 + count) % count;\r\n }\r\n if (e.key === 'Home') next = 0;\r\n if (e.key === 'End') next = count - 1;\r\n if (next !== idx) {\r\n e.preventDefault();\r\n const nextVal = tabs[next].value;\r\n handleTabChange(nextVal);\r\n tabRefs.current[next]?.focus();\r\n }\r\n }}\r\n >\r\n {Icon && <Icon className=\"h-4 w-4\" />}\r\n {tab.label}\r\n </button>\r\n );\r\n })}\r\n \r\n {/* Underline indicator for underline variant */}\r\n {variant === \"underline\" && orientation === \"horizontal\" && (\r\n <div \r\n className=\"absolute bottom-0 h-0.5 bg-primary transition-all duration-300 ease-out\"\r\n style={underlineStyle}\r\n />\r\n )}\r\n </div>\r\n\r\n {/* Tab Content */}\r\n <div\r\n role=\"tabpanel\"\r\n id={`${baseId}-panel-${tabs.findIndex(t => t.value === active)}`}\r\n aria-labelledby={`${baseId}-tab-${tabs.findIndex(t => t.value === active)}`}\r\n className={cn(\r\n \"bg-card rounded-lg border border-border shadow-sm text-card-foreground transition-all duration-200\",\r\n sizeStyles[size].content,\r\n orientation === \"vertical\" && \"flex-1\"\r\n )}\r\n tabIndex={0}\r\n >\r\n {activeTab?.content}\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\n// Additional Tab components for specific use cases\r\ninterface SimpleTabsProps {\r\n tabs: Array<{\r\n label: string;\r\n value: string;\r\n content: React.ReactNode;\r\n }>;\r\n defaultValue?: string;\r\n className?: string;\r\n}\r\n\r\nexport const SimpleTabs: React.FC<SimpleTabsProps> = ({ tabs, defaultValue, className }) => {\r\n return (\r\n <Tabs \r\n tabs={tabs} \r\n defaultValue={defaultValue} \r\n className={className}\r\n variant=\"default\"\r\n size=\"sm\"\r\n />\r\n );\r\n};\r\n\r\ninterface PillTabsProps extends TabsProps {\r\n contained?: boolean;\r\n}\r\n\r\nexport const PillTabs: React.FC<PillTabsProps> = ({ contained = true, ...props }) => {\r\n return (\r\n <Tabs \r\n {...props}\r\n variant=\"pills\"\r\n className={cn(contained && \"max-w-fit\", props.className)}\r\n />\r\n );\r\n};\r\n\r\ninterface VerticalTabsProps extends TabsProps {\r\n sidebarWidth?: string;\r\n}\r\n\r\nexport const VerticalTabs: React.FC<VerticalTabsProps> = ({ \r\n sidebarWidth = \"w-48\", \r\n className,\r\n ...props \r\n}) => {\r\n return (\r\n <div className={cn(\"flex gap-6\", className)}>\r\n <div className={cn(sidebarWidth, \"shrink-0\")}>\r\n <Tabs \r\n {...props}\r\n orientation=\"vertical\"\r\n variant=\"card\"\r\n className=\"w-full\"\r\n />\r\n </div>\r\n </div>\r\n );\r\n};\r\n","\"use client\";\r\n\r\nimport { cn } from \"@/lib/utils/cn\";\r\nimport { useShadCNAnimations } from \"@/lib/utils/shadcn-animations\";\r\nimport React, { useState } from \"react\";\r\nimport { createPortal } from \"react-dom\";\r\n\r\ninterface DropdownMenuProps {\r\n trigger: React.ReactElement;\r\n children?: React.ReactNode;\r\n className?: string;\r\n contentClassName?: string;\r\n placement?: \"top\" | \"bottom\" | \"left\" | \"right\" | \"top-start\" | \"bottom-start\" | \"top-end\" | \"bottom-end\";\r\n closeOnSelect?: boolean;\r\n disabled?: boolean;\r\n // Alternative API props\r\n isOpen?: boolean;\r\n onOpenChange?: (open: boolean) => void;\r\n items?: Array<{\r\n label: string;\r\n icon?: React.ComponentType<any>;\r\n onClick: () => void;\r\n disabled?: boolean;\r\n destructive?: boolean;\r\n }>;\r\n}\r\n\r\nconst DropdownMenu: React.FC<DropdownMenuProps> = ({\r\n trigger,\r\n children,\r\n className,\r\n contentClassName,\r\n placement = \"bottom-start\",\r\n closeOnSelect = true,\r\n disabled = false,\r\n isOpen,\r\n onOpenChange,\r\n items,\r\n}) => {\r\n const [internalOpen, setInternalOpen] = useState(false);\r\n const [position, setPosition] = useState<{ top: number; left: number } | null>(null);\r\n const triggerRef = React.useRef<HTMLElement>(null);\r\n const contentRef = React.useRef<HTMLDivElement>(null);\r\n const itemsRef = React.useRef<HTMLButtonElement[]>([]);\r\n const [activeIndex, setActiveIndex] = useState<number>(-1);\r\n\r\n // Inject ShadCN animations\r\n useShadCNAnimations();\r\n\r\n const open = isOpen !== undefined ? isOpen : internalOpen;\r\n const setOpen = onOpenChange || setInternalOpen;\r\n\r\n // Calculate position\r\n React.useEffect(() => {\r\n if (open && triggerRef.current && contentRef.current) {\r\n const rect = triggerRef.current.getBoundingClientRect();\r\n const menuRect = contentRef.current.getBoundingClientRect();\r\n const viewportHeight = window.innerHeight;\r\n\r\n let top = rect.bottom + 4;\r\n let left = rect.left;\r\n\r\n // Auto-flip to top if dropdown would go below viewport\r\n if (rect.bottom + menuRect.height > viewportHeight && rect.top > menuRect.height) {\r\n top = rect.top - menuRect.height - 4;\r\n }\r\n\r\n switch (placement) {\r\n case \"top\":\r\n case \"top-start\":\r\n top = rect.top - menuRect.height - 4;\r\n break;\r\n case \"top-end\":\r\n top = rect.top - menuRect.height - 4;\r\n left = rect.right - menuRect.width;\r\n break;\r\n case \"bottom\":\r\n case \"bottom-start\":\r\n // Auto-flip logic above already handles this\r\n break;\r\n case \"bottom-end\":\r\n left = rect.right - menuRect.width;\r\n break;\r\n case \"left\":\r\n top = rect.top;\r\n left = rect.left - menuRect.width - 4;\r\n break;\r\n case \"right\":\r\n top = rect.top;\r\n left = rect.right + 4;\r\n break;\r\n }\r\n\r\n setPosition({ top, left });\r\n }\r\n // Reset keyboard focus index when opened\r\n if (open) setActiveIndex(-1);\r\n }, [open, placement]);\r\n\r\n // Handle clicks outside\r\n React.useEffect(() => {\r\n if (!open) return;\r\n\r\n const handleClickOutside = (event: MouseEvent) => {\r\n const target = event.target as Node;\r\n if (triggerRef.current && !triggerRef.current.contains(target)) {\r\n const dropdown = document.querySelector(\"[data-dropdown-menu]\") as Element;\r\n if (dropdown && !dropdown.contains(target)) {\r\n setOpen(false);\r\n }\r\n }\r\n };\r\n\r\n const handleEscape = (event: KeyboardEvent) => {\r\n if (event.key === \"Escape\") {\r\n setOpen(false);\r\n }\r\n };\r\n\r\n document.addEventListener(\"mousedown\", handleClickOutside);\r\n document.addEventListener(\"keydown\", handleEscape);\r\n const handleKeyNav = (e: KeyboardEvent) => {\r\n if (!contentRef.current) return;\r\n const enabled = itemsRef.current.filter((el) => el && !el.disabled);\r\n if (enabled.length === 0) return;\r\n if (e.key === \"ArrowDown\") {\r\n e.preventDefault();\r\n const next = (activeIndex + 1 + enabled.length) % enabled.length;\r\n setActiveIndex(next);\r\n enabled[next]?.focus();\r\n } else if (e.key === \"ArrowUp\") {\r\n e.preventDefault();\r\n const prev = (activeIndex - 1 + enabled.length) % enabled.length;\r\n setActiveIndex(prev);\r\n enabled[prev]?.focus();\r\n } else if (e.key === \"Home\") {\r\n e.preventDefault();\r\n setActiveIndex(0);\r\n enabled[0]?.focus();\r\n } else if (e.key === \"End\") {\r\n e.preventDefault();\r\n setActiveIndex(enabled.length - 1);\r\n enabled[enabled.length - 1]?.focus();\r\n }\r\n };\r\n document.addEventListener(\"keydown\", handleKeyNav);\r\n\r\n return () => {\r\n document.removeEventListener(\"mousedown\", handleClickOutside);\r\n document.removeEventListener(\"keydown\", handleEscape);\r\n document.removeEventListener(\"keydown\", handleKeyNav);\r\n };\r\n }, [open, setOpen, activeIndex]);\r\n\r\n const handleTriggerClick = () => {\r\n if (!disabled) {\r\n setOpen(!open);\r\n }\r\n };\r\n\r\n const handleItemClick = (itemOnClick: () => void) => {\r\n itemOnClick();\r\n if (closeOnSelect) {\r\n setOpen(false);\r\n }\r\n };\r\n\r\n const dropdownContent = open ? (\r\n <div\r\n data-dropdown-menu\r\n data-combobox-dropdown\r\n ref={contentRef}\r\n style={{\r\n position: \"fixed\",\r\n top: position?.top ?? -9999,\r\n left: position?.left ?? -9999,\r\n zIndex: 9999,\r\n visibility: position ? \"visible\" : \"hidden\",\r\n transformOrigin: \"top center\",\r\n }}\r\n data-state={open ? \"open\" : \"closed\"}\r\n role=\"menu\"\r\n className={cn(\"z-9999 min-w-40\", className)}\r\n >\r\n <div\r\n className={cn(\r\n \"rounded-md border bg-popover text-popover-foreground shadow-md\",\r\n \"backdrop-blur-sm bg-popover/95 border-border/60 p-1\",\r\n contentClassName\r\n )}\r\n >\r\n {items\r\n ? items.map((item, index) => {\r\n const IconComponent = item.icon;\r\n return (\r\n <button\r\n key={index}\r\n ref={(el) => {\r\n if (el) itemsRef.current[index] = el;\r\n }}\r\n onClick={() => handleItemClick(item.onClick)}\r\n disabled={item.disabled}\r\n role=\"menuitem\"\r\n tabIndex={-1}\r\n style={{\r\n animationDelay: open ? `${Math.min(index * 20, 200)}ms` : \"0ms\",\r\n }}\r\n className={cn(\r\n \"dropdown-item flex w-full items-center gap-2 px-2.5 py-1.5 text-sm rounded-sm\",\r\n \"outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background\",\r\n \"hover:bg-accent hover:text-accent-foreground\",\r\n \"focus:bg-accent focus:text-accent-foreground\",\r\n \"disabled:opacity-50 disabled:cursor-not-allowed\",\r\n item.destructive && \"text-destructive hover:bg-destructive/10 focus:bg-destructive/10\"\r\n )}\r\n >\r\n {IconComponent && <IconComponent className=\"h-4 w-4\" />}\r\n {item.label}\r\n </button>\r\n );\r\n })\r\n : children}\r\n </div>\r\n </div>\r\n ) : null;\r\n\r\n return (\r\n <>\r\n {React.cloneElement(trigger, {\r\n ref: triggerRef,\r\n onClick: handleTriggerClick,\r\n \"aria-expanded\": open,\r\n \"aria-haspopup\": \"menu\",\r\n className: cn(\r\n // keep original classes on trigger\r\n (trigger.props as any)?.className,\r\n // ensure focus-visible ring for trigger too\r\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background rounded-md\"\r\n ),\r\n } as any)}\r\n {dropdownContent && typeof window !== \"undefined\" && createPortal(dropdownContent, document.body)}\r\n </>\r\n );\r\n};\r\n\r\n// Additional components for backward compatibility\r\nexport const DropdownMenuItem: React.FC<{\r\n children: React.ReactNode;\r\n onClick?: () => void;\r\n disabled?: boolean;\r\n destructive?: boolean;\r\n className?: string;\r\n}> = ({ children, onClick, disabled, destructive, className }) => (\r\n <button\r\n onClick={onClick}\r\n disabled={disabled}\r\n className={cn(\r\n \"flex w-full items-center gap-2 px-3 py-2 text-sm rounded-md transition-colors\",\r\n \"hover:bg-accent hover:text-accent-foreground\",\r\n \"focus:bg-accent focus:text-accent-foreground focus:outline-none\",\r\n \"disabled:opacity-50 disabled:cursor-not-allowed\",\r\n destructive && \"text-destructive hover:bg-destructive/10 focus:bg-destructive/10\",\r\n className\r\n )}\r\n >\r\n {children}\r\n </button>\r\n);\r\n\r\nexport const DropdownMenuSeparator: React.FC<{ className?: string }> = ({ className }) => <div className={cn(\"h-px bg-border my-1\", className)} />;\r\n\r\nexport const SelectDropdown: React.FC<{\r\n options: string[];\r\n value?: string;\r\n onChange: (value: string) => void;\r\n placeholder?: string;\r\n className?: string;\r\n}> = ({ options, value, onChange, placeholder = \"Select...\", className }) => (\r\n <DropdownMenu\r\n trigger={\r\n <button\r\n className={cn(\r\n \"inline-flex items-center justify-between gap-2 px-3 py-2 text-sm rounded-md border bg-background border-border/60\",\r\n \"hover:bg-accent/50\",\r\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background\",\r\n className\r\n )}\r\n >\r\n <span className=\"truncate max-w-64 text-foreground/90\">{value || placeholder}</span>\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"none\" className=\"opacity-70\">\r\n <path d=\"M6 8l4 4 4-4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\r\n </svg>\r\n </button>\r\n }\r\n items={options.map((option) => ({\r\n label: option,\r\n onClick: () => onChange(option),\r\n }))}\r\n />\r\n);\r\n\r\nexport { DropdownMenu };\r\nexport default DropdownMenu;\r\n","\"use client\";\r\n\r\nimport * as React from \"react\";\r\nimport { cn } from \"@/lib/utils/cn\";\r\nimport { ChevronLeft, ChevronRight, MoreHorizontal, ChevronsLeft, ChevronsRight } from \"lucide-react\";\r\nimport Button from \"./Button\";\r\nimport { Combobox } from \"./Combobox\";\r\nimport { useTranslations } from \"@/lib/i18n/translation-adapter\";\r\n\r\nexport interface PaginationProps {\r\n page: number;\r\n totalPages: number;\r\n onChange: (page: number) => void;\r\n className?: string;\r\n size?: \"sm\" | \"md\" | \"lg\";\r\n variant?: \"default\" | \"outline\" | \"ghost\";\r\n showFirstLast?: boolean;\r\n showPrevNext?: boolean;\r\n showPageNumbers?: boolean;\r\n showInfo?: boolean;\r\n disabled?: boolean;\r\n alignment?: \"left\" | \"center\" | \"right\";\r\n // For page size selector\r\n pageSize?: number;\r\n pageSizeOptions?: number[];\r\n onPageSizeChange?: (size: number) => void;\r\n totalItems?: number;\r\n labels?: {\r\n navigationLabel?: string;\r\n showingResults?: (ctx: { startItem: number; endItem: number; totalItems?: number }) => string;\r\n firstPage?: string;\r\n previousPage?: string;\r\n previous?: string;\r\n nextPage?: string;\r\n next?: string;\r\n lastPage?: string;\r\n itemsPerPage?: string;\r\n search?: string;\r\n noOptions?: string;\r\n pageNumber?: (page: number) => string;\r\n };\r\n}\r\n\r\nexport const Pagination: React.FC<PaginationProps> = ({\r\n page,\r\n totalPages,\r\n onChange,\r\n className,\r\n size = \"md\",\r\n variant = \"outline\",\r\n showFirstLast = true,\r\n showPrevNext = true,\r\n showPageNumbers = true,\r\n showInfo = false,\r\n disabled = false,\r\n alignment = \"left\",\r\n pageSize,\r\n pageSizeOptions,\r\n onPageSizeChange,\r\n totalItems,\r\n labels,\r\n}) => {\r\n const t = useTranslations(\"Pagination\");\r\n\r\n const getTextAlignmentClass = (align: \"left\" | \"center\" | \"right\") => {\r\n switch (align) {\r\n case \"left\":\r\n return \"text-left\";\r\n case \"center\":\r\n return \"text-center\";\r\n case \"right\":\r\n return \"text-right\";\r\n }\r\n };\r\n\r\n const textAlignmentClass = getTextAlignmentClass(alignment);\r\n\r\n const createPageArray = () => {\r\n const delta = 2;\r\n const range: (number | string)[] = [];\r\n const left = Math.max(2, page - delta);\r\n const right = Math.min(totalPages - 1, page + delta);\r\n\r\n range.push(1);\r\n if (left > 2) range.push(\"...\");\r\n\r\n for (let i = left; i <= right; i++) {\r\n range.push(i);\r\n }\r\n\r\n if (right < totalPages - 1) range.push(\"...\");\r\n if (totalPages > 1) range.push(totalPages);\r\n\r\n return range;\r\n };\r\n\r\n // Helper function to get button variant based on active state\r\n const getButtonVariant = (isActive: boolean) => {\r\n if (isActive) return \"primary\";\r\n return variant === \"default\" ? \"default\" : variant;\r\n };\r\n\r\n // Keyboard navigation\r\n React.useEffect(() => {\r\n if (disabled) return;\r\n\r\n const handleKey = (e: KeyboardEvent) => {\r\n if (e.target && (e.target as HTMLElement).tagName === \"INPUT\") return; // Don't interfere with input fields\r\n\r\n if (e.key === \"ArrowRight\" || e.key === \"PageDown\") {\r\n e.preventDefault();\r\n onChange(Math.min(totalPages, page + 1));\r\n }\r\n if (e.key === \"ArrowLeft\" || e.key === \"PageUp\") {\r\n e.preventDefault();\r\n onChange(Math.max(1, page - 1));\r\n }\r\n if (e.key === \"Home\") {\r\n e.preventDefault();\r\n onChange(1);\r\n }\r\n if (e.key === \"End\") {\r\n e.preventDefault();\r\n onChange(totalPages);\r\n }\r\n };\r\n\r\n window.addEventListener(\"keydown\", handleKey);\r\n return () => window.removeEventListener(\"keydown\", handleKey);\r\n }, [page, totalPages, onChange, disabled]);\r\n\r\n // Calculate display info\r\n const startItem = totalItems ? (page - 1) * (pageSize || 10) + 1 : null;\r\n const endItem = totalItems ? Math.min(page * (pageSize || 10), totalItems) : null;\r\n\r\n // Convert pageSize options to string array for Combobox\r\n const pageSizeOptionsStrings = pageSizeOptions?.map((size) => size.toString()) || [];\r\n\r\n const handlePageSizeChange = (value: string) => {\r\n if (onPageSizeChange) {\r\n onPageSizeChange(Number(value));\r\n }\r\n };\r\n\r\n if (totalPages <= 1) return null;\r\n\r\n return (\r\n <nav className={cn(\"flex flex-col gap-4\", className)} aria-label={labels?.navigationLabel || t(\"navigationLabel\")}>\r\n {/* Info Display */}\r\n {showInfo && totalItems && (\r\n <div className={cn(\"text-sm text-muted-foreground\", textAlignmentClass)}>\r\n {labels?.showingResults\r\n ? labels.showingResults({ startItem: startItem || 0, endItem: endItem || 0, totalItems })\r\n : t(\"showingResults\", { startItem: startItem || 0, endItem: endItem || 0, totalItems })}\r\n </div>\r\n )}\r\n\r\n <div\r\n className={cn(\"flex items-center justify-between\", {\r\n \"flex-row-reverse\": alignment === \"right\" || alignment === \"center\",\r\n })}\r\n >\r\n <div className={cn(\"flex items-center gap-1\")}>\r\n {/* First Page */}\r\n {showFirstLast && (\r\n <Button\r\n variant={getButtonVariant(false)}\r\n size={size}\r\n icon={ChevronsLeft}\r\n onClick={() => onChange(1)}\r\n disabled={disabled || page === 1}\r\n className=\"hidden sm:flex\"\r\n title={labels?.firstPage || t(\"firstPage\")}\r\n aria-label={labels?.firstPage || t(\"firstPage\")}\r\n aria-disabled={disabled || page === 1}\r\n />\r\n )}\r\n\r\n {/* Previous Page */}\r\n {showPrevNext && (\r\n <Button\r\n variant={getButtonVariant(false)}\r\n size={size}\r\n icon={ChevronLeft}\r\n onClick={() => onChange(Math.max(1, page - 1))}\r\n disabled={disabled || page === 1}\r\n title={labels?.previousPage || t(\"previousPage\")}\r\n aria-label={labels?.previousPage || t(\"previousPage\")}\r\n aria-disabled={disabled || page === 1}\r\n >\r\n <span className=\"hidden sm:inline\">{labels?.previous || t(\"previous\")}</span>\r\n </Button>\r\n )}\r\n\r\n {/* Page Numbers */}\r\n {showPageNumbers &&\r\n createPageArray().map((p, i) => {\r\n if (p === \"...\") {\r\n return <Button key={i} variant=\"ghost\" size={size} disabled icon={MoreHorizontal} className=\"cursor-default\" />;\r\n }\r\n\r\n const pageNumber = p as number;\r\n const isActive = page === pageNumber;\r\n\r\n return (\r\n <Button\r\n key={i}\r\n variant={getButtonVariant(isActive)}\r\n size={size}\r\n onClick={() => onChange(pageNumber)}\r\n disabled={disabled}\r\n className={cn(\"min-w-10\", isActive && \"font-semibold\")}\r\n aria-label={labels?.pageNumber ? labels.pageNumber(pageNumber) : t(\"pageNumber\", { page: pageNumber })}\r\n aria-current={isActive ? \"page\" : undefined}\r\n >\r\n {pageNumber}\r\n </Button>\r\n );\r\n })}\r\n\r\n {/* Next Page */}\r\n {showPrevNext && (\r\n <Button\r\n variant={getButtonVariant(false)}\r\n size={size}\r\n iconRight={ChevronRight}\r\n onClick={() => onChange(Math.min(totalPages, page + 1))}\r\n disabled={disabled || page === totalPages}\r\n title={labels?.nextPage || t(\"nextPage\")}\r\n aria-label={labels?.nextPage || t(\"nextPage\")}\r\n aria-disabled={disabled || page === totalPages}\r\n >\r\n <span className=\"hidden sm:inline\">{labels?.next || t(\"next\")}</span>\r\n </Button>\r\n )}\r\n\r\n {/* Last Page */}\r\n {showFirstLast && (\r\n <Button\r\n variant={getButtonVariant(false)}\r\n size={size}\r\n icon={ChevronsRight}\r\n onClick={() => onChange(totalPages)}\r\n disabled={disabled || page === totalPages}\r\n className=\"hidden sm:flex\"\r\n title={labels?.lastPage || t(\"lastPage\")}\r\n aria-label={labels?.lastPage || t(\"lastPage\")}\r\n aria-disabled={disabled || page === totalPages}\r\n />\r\n )}\r\n </div>\r\n\r\n {/* Page Size Selector */}\r\n {pageSizeOptions && onPageSizeChange && (\r\n <div className={cn(\"flex items-center gap-2 text-sm\")}>\r\n <span className=\"text-muted-foreground\">{labels?.itemsPerPage || t(\"itemsPerPage\")}:</span>\r\n <div className=\"w-20\">\r\n <Combobox\r\n options={pageSizeOptionsStrings}\r\n value={pageSize?.toString() || \"10\"}\r\n onChange={handlePageSizeChange}\r\n placeholder=\"10\"\r\n searchPlaceholder={labels?.search || t(\"search\")}\r\n emptyText={labels?.noOptions || t(\"noOptions\")}\r\n disabled={disabled}\r\n />\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n </nav>\r\n );\r\n};\r\n\r\n// Simple Pagination - minimal version with just prev/next\r\nexport interface SimplePaginationProps {\r\n page: number;\r\n totalPages: number;\r\n onChange: (page: number) => void;\r\n className?: string;\r\n size?: \"sm\" | \"md\" | \"lg\";\r\n variant?: \"default\" | \"outline\" | \"ghost\";\r\n disabled?: boolean;\r\n showInfo?: boolean;\r\n totalItems?: number;\r\n pageSize?: number;\r\n}\r\n\r\nexport const SimplePagination: React.FC<SimplePaginationProps> = ({\r\n page,\r\n totalPages,\r\n onChange,\r\n className,\r\n size = \"md\",\r\n variant = \"outline\",\r\n disabled = false,\r\n showInfo = false,\r\n totalItems,\r\n pageSize = 10,\r\n}) => {\r\n if (totalPages <= 1) return null;\r\n\r\n return (\r\n <div className={cn(\"flex flex-col gap-2\", className)}>\r\n {showInfo && totalItems && (\r\n <div className=\"text-sm text-muted-foreground text-center\">\r\n Page {page} of {totalPages} ({totalItems} total items)\r\n </div>\r\n )}\r\n\r\n <div className=\"flex items-center justify-between\">\r\n <Button variant={variant} size={size} icon={ChevronLeft} onClick={() => onChange(Math.max(1, page - 1))} disabled={disabled || page === 1}>\r\n Previous\r\n </Button>\r\n\r\n <div className=\"flex items-center gap-2 text-sm text-muted-foreground\">\r\n <span>Page</span>\r\n <span className=\"font-medium text-foreground\">{page}</span>\r\n <span>of</span>\r\n <span className=\"font-medium text-foreground\">{totalPages}</span>\r\n </div>\r\n\r\n <Button\r\n variant={variant}\r\n size={size}\r\n iconRight={ChevronRight}\r\n onClick={() => onChange(Math.min(totalPages, page + 1))}\r\n disabled={disabled || page === totalPages}\r\n >\r\n Next\r\n </Button>\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\n// Compact Pagination - icon only version\r\nexport interface CompactPaginationProps {\r\n page: number;\r\n totalPages: number;\r\n onChange: (page: number) => void;\r\n className?: string;\r\n variant?: \"default\" | \"outline\" | \"ghost\";\r\n disabled?: boolean;\r\n}\r\n\r\nexport const CompactPagination: React.FC<CompactPaginationProps> = ({\r\n page,\r\n totalPages,\r\n onChange,\r\n className,\r\n variant = \"outline\",\r\n disabled = false,\r\n}) => {\r\n if (totalPages <= 1) return null;\r\n\r\n return (\r\n <nav className={cn(\"flex items-center gap-1\", className)} aria-label=\"Compact Pagination\">\r\n <Button\r\n variant={variant}\r\n size=\"icon\"\r\n icon={ChevronsLeft}\r\n onClick={() => onChange(1)}\r\n disabled={disabled || page === 1}\r\n title=\"First page\"\r\n aria-label=\"First page\"\r\n />\r\n <Button\r\n variant={variant}\r\n size=\"icon\"\r\n icon={ChevronLeft}\r\n onClick={() => onChange(Math.max(1, page - 1))}\r\n disabled={disabled || page === 1}\r\n title=\"Previous page\"\r\n />\r\n\r\n <div className=\"px-2 py-1 text-sm text-muted-foreground min-w-16 text-center\">\r\n {page} / {totalPages}\r\n </div>\r\n\r\n <Button\r\n variant={variant}\r\n size=\"icon\"\r\n icon={ChevronRight}\r\n onClick={() => onChange(Math.min(totalPages, page + 1))}\r\n disabled={disabled || page === totalPages}\r\n title=\"Next page\"\r\n />\r\n <Button\r\n variant={variant}\r\n size=\"icon\"\r\n icon={ChevronsRight}\r\n onClick={() => onChange(totalPages)}\r\n disabled={disabled || page === totalPages}\r\n title=\"Last page\"\r\n />\r\n </nav>\r\n );\r\n};\r\n","\"use client\";\r\n\r\nimport * as React from \"react\";\r\nimport { useId } from \"react\";\r\nimport { createPortal } from \"react-dom\";\r\nimport { cn } from \"@/lib/utils/cn\";\r\nimport { ChevronDown, Search, SearchX, Check, X, Loader2 } from \"lucide-react\";\r\nimport { useShadCNAnimations } from \"@/lib/utils/shadcn-animations\";\r\n\r\n// --- PROPS ---\r\nexport type ComboboxOption = string | { label: string; value: any };\r\n\r\nexport interface ComboboxProps {\r\n id?: string;\r\n options: ComboboxOption[];\r\n value?: any;\r\n onChange: (value: any) => void;\r\n placeholder?: string;\r\n className?: string;\r\n disabled?: boolean;\r\n size?: \"sm\" | \"md\" | \"lg\";\r\n variant?: \"default\" | \"outline\" | \"ghost\";\r\n allowClear?: boolean;\r\n searchPlaceholder?: string;\r\n emptyText?: string;\r\n usePortal?: boolean;\r\n label?: string;\r\n required?: boolean;\r\n fontBold?: boolean;\r\n loading?: boolean;\r\n loadingText?: string;\r\n}\r\n\r\n// Helper functions\r\nconst getOptionLabel = (option: ComboboxOption): string => {\r\n return typeof option === \"string\" ? option : option.label;\r\n};\r\n\r\nconst getOptionValue = (option: ComboboxOption): any => {\r\n return typeof option === \"string\" ? option : option.value;\r\n};\r\n\r\nconst findOptionByValue = (options: ComboboxOption[], value: any): ComboboxOption | undefined => {\r\n return options.find((opt) => getOptionValue(opt) === value);\r\n};\r\n\r\n// --- MAIN COMPONENT ---\r\nexport const Combobox: React.FC<ComboboxProps> = ({\r\n id,\r\n options,\r\n value,\r\n onChange,\r\n placeholder = \"Select...\",\r\n searchPlaceholder = \"Search...\",\r\n emptyText = \"No results found\",\r\n className,\r\n disabled = false,\r\n size = \"md\",\r\n allowClear = false,\r\n usePortal = true,\r\n label,\r\n required,\r\n fontBold = false,\r\n loading = false,\r\n loadingText = \"Loading...\",\r\n}) => {\r\n const [open, setOpen] = React.useState(false);\r\n const [query, setQuery] = React.useState(\"\");\r\n const [activeIndex, setActiveIndex] = React.useState<number | null>(null);\r\n\r\n // Inject ShadCN animations\r\n useShadCNAnimations();\r\n\r\n const listRef = React.useRef<(HTMLLIElement | null)[]>([]);\r\n const inputRef = React.useRef<HTMLInputElement>(null);\r\n\r\n // Stable ids for accessibility\r\n const autoId = useId();\r\n const resolvedId = id ? String(id) : `combobox-${autoId}`;\r\n const labelId = label ? `${resolvedId}-label` : undefined;\r\n\r\n // Enable search only when options length > 10\r\n const enableSearch = options.length > 10;\r\n\r\n // Filter options based on query (only when search enabled)\r\n const filteredOptions = React.useMemo(\r\n () => (enableSearch ? options.filter((o) => getOptionLabel(o).toLowerCase().includes(query.toLowerCase())) : options),\r\n [options, query, enableSearch]\r\n );\r\n\r\n // Manual positioning\r\n const [dropdownPosition, setDropdownPosition] = React.useState<{ top: number; left: number; width: number } | null>(null);\r\n const triggerRef = React.useRef<HTMLButtonElement>(null);\r\n const dropdownRef = React.useRef<HTMLDivElement | null>(null);\r\n\r\n // Calculate positioning synchronously on open to avoid flicker\r\n const calculatePosition = React.useCallback(() => {\r\n if (!triggerRef.current) return null;\r\n const rect = triggerRef.current.getBoundingClientRect();\r\n const scrollTop = window.pageYOffset || document.documentElement.scrollTop;\r\n const scrollLeft = window.pageXOffset || document.documentElement.scrollLeft;\r\n return {\r\n top: rect.bottom + scrollTop + 4,\r\n left: rect.left + scrollLeft,\r\n width: rect.width,\r\n };\r\n }, []);\r\n\r\n // Reposition on resize/scroll while open\r\n React.useEffect(() => {\r\n if (!open) return;\r\n const handler = () => {\r\n const pos = calculatePosition();\r\n if (pos) setDropdownPosition(pos);\r\n };\r\n window.addEventListener(\"resize\", handler);\r\n window.addEventListener(\"scroll\", handler, true);\r\n return () => {\r\n window.removeEventListener(\"resize\", handler);\r\n window.removeEventListener(\"scroll\", handler, true);\r\n };\r\n }, [open, calculatePosition]);\r\n\r\n // Handle clicks outside\r\n React.useEffect(() => {\r\n if (!open) return;\r\n\r\n const handleClickOutside = (event: MouseEvent) => {\r\n const target = event.target as Node;\r\n const triggerEl = triggerRef.current;\r\n const dropdownEl = dropdownRef.current;\r\n if (triggerEl && !triggerEl.contains(target) && dropdownEl && !dropdownEl.contains(target)) {\r\n setOpen(false);\r\n }\r\n };\r\n\r\n const handleEscape = (event: KeyboardEvent) => {\r\n if (event.key === \"Escape\") {\r\n setOpen(false);\r\n }\r\n };\r\n\r\n document.addEventListener(\"mousedown\", handleClickOutside);\r\n document.addEventListener(\"keydown\", handleEscape);\r\n\r\n return () => {\r\n document.removeEventListener(\"mousedown\", handleClickOutside);\r\n document.removeEventListener(\"keydown\", handleEscape);\r\n };\r\n }, [open]);\r\n\r\n // Event Handlers\r\n const handleSelect = (option: ComboboxOption) => {\r\n const val = getOptionValue(option);\r\n if (val !== undefined && val !== null) {\r\n onChange(val);\r\n setOpen(false);\r\n triggerRef.current?.focus();\r\n }\r\n };\r\n\r\n const handleClear = (e: React.MouseEvent) => {\r\n e.stopPropagation();\r\n onChange(null);\r\n setOpen(false);\r\n };\r\n\r\n // Reset state when dropdown closes và focus input khi mở\r\n React.useEffect(() => {\r\n if (!open) {\r\n setQuery(\"\");\r\n setActiveIndex(null);\r\n } else if (enableSearch) {\r\n setTimeout(() => {\r\n inputRef.current?.focus();\r\n }, 100);\r\n }\r\n }, [open, enableSearch]);\r\n\r\n // Get display value\r\n const selectedOption = findOptionByValue(options, value);\r\n const displayValue = selectedOption ? getOptionLabel(selectedOption) : \"\";\r\n\r\n const dropdownContent = (\r\n <div\r\n data-combobox-dropdown\r\n ref={dropdownRef}\r\n style={{\r\n position: \"absolute\",\r\n top: dropdownPosition?.top || 0,\r\n left: dropdownPosition?.left || 0,\r\n width: dropdownPosition?.width || 200,\r\n zIndex: 9999,\r\n transformOrigin: \"top center\",\r\n }}\r\n data-state={open ? \"open\" : \"closed\"}\r\n role=\"listbox\"\r\n id={`${resolvedId}-listbox`}\r\n className=\"z-9999\"\r\n >\r\n <div className={cn(\"rounded-md border bg-popover text-popover-foreground shadow-md\", \"backdrop-blur-sm bg-popover/95 border-border/60\")}>\r\n {/* Search Input (only when many options) */}\r\n {enableSearch && (\r\n <div className=\"relative p-3 border-b border-border/50 bg-muted/20\">\r\n <Search className=\"absolute left-6 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground transition-colors\" />\r\n <input\r\n ref={inputRef}\r\n value={query}\r\n onChange={(e) => {\r\n setQuery(e.target.value);\r\n setActiveIndex(null);\r\n }}\r\n onKeyDown={(e) => {\r\n if (e.key === \"ArrowDown\") {\r\n e.preventDefault();\r\n setActiveIndex((prev) => {\r\n const next = prev === null ? 0 : prev + 1;\r\n return next >= filteredOptions.length ? 0 : next;\r\n });\r\n } else if (e.key === \"ArrowUp\") {\r\n e.preventDefault();\r\n setActiveIndex((prev) => {\r\n const next = prev === null ? filteredOptions.length - 1 : prev - 1;\r\n return next < 0 ? filteredOptions.length - 1 : next;\r\n });\r\n } else if (e.key === \"Enter\") {\r\n e.preventDefault();\r\n if (activeIndex !== null && filteredOptions[activeIndex]) {\r\n handleSelect(filteredOptions[activeIndex]);\r\n }\r\n } else if (e.key === \"Escape\") {\r\n e.preventDefault();\r\n setOpen(false);\r\n }\r\n }}\r\n placeholder={searchPlaceholder}\r\n className=\"w-full rounded-md bg-background/50 py-2 pl-8 pr-3 text-sm border-0 focus:outline-none focus:bg-background/80 transition-colors placeholder:text-muted-foreground/60\"\r\n aria-autocomplete=\"list\"\r\n aria-activedescendant={activeIndex != null ? `combobox-item-${activeIndex}` : undefined}\r\n />\r\n </div>\r\n )}\r\n\r\n {/* Options List */}\r\n <div className=\"max-h-64 overflow-y-auto overscroll-contain\">\r\n <ul className=\"p-1 space-y-1\">\r\n {loading ? (\r\n <li className=\"px-3 py-8 text-center\">\r\n <div className=\"flex flex-col items-center gap-2 animate-in fade-in-0 zoom-in-95 duration-300\">\r\n <Loader2 className=\"h-6 w-6 animate-spin text-primary\" />\r\n <span className=\"text-sm text-muted-foreground\">{loadingText || \"Loading...\"}</span>\r\n </div>\r\n </li>\r\n ) : filteredOptions.length > 0 ? (\r\n filteredOptions.map((item, index) => {\r\n const itemValue = getOptionValue(item);\r\n const itemLabel = getOptionLabel(item);\r\n const isSelected = itemValue === value;\r\n\r\n return (\r\n <li\r\n key={`${itemValue}-${index}`}\r\n ref={(node) => {\r\n listRef.current[index] = node;\r\n }}\r\n id={`combobox-item-${index}`}\r\n role=\"option\"\r\n tabIndex={-1}\r\n aria-selected={isSelected}\r\n onClick={() => handleSelect(item)}\r\n style={{\r\n animationDelay: open ? `${Math.min(index * 20, 200)}ms` : \"0ms\",\r\n }}\r\n className={cn(\r\n \"dropdown-item group flex cursor-pointer items-center justify-between rounded-sm px-2.5 py-1.5 text-sm\",\r\n \"outline-none focus:outline-none focus-visible:outline-none\",\r\n \"hover:bg-accent hover:text-accent-foreground\",\r\n \"focus:bg-accent focus:text-accent-foreground\",\r\n \"data-disabled:pointer-events-none data-disabled:opacity-50\",\r\n index === activeIndex && \"bg-accent text-accent-foreground\",\r\n isSelected && \"bg-accent text-accent-foreground\"\r\n )}\r\n >\r\n <span className=\"truncate\">{itemLabel}</span>\r\n {isSelected && <Check className=\"h-4 w-4 text-primary\" />}\r\n </li>\r\n );\r\n })\r\n ) : (\r\n <li className=\"px-3 py-8 text-center text-muted-foreground text-sm\">\r\n <div className=\"flex flex-col items-center gap-2 animate-in fade-in-0 zoom-in-95 duration-300\">\r\n <SearchX className=\"h-8 w-8 opacity-40 text-muted-foreground\" />\r\n <span className=\"text-sm\">{emptyText}</span>\r\n {query && (\r\n <button type=\"button\" onClick={() => setQuery(\"\")} className=\"text-xs text-primary hover:underline\">\r\n Clear search\r\n </button>\r\n )}\r\n </div>\r\n </li>\r\n )}\r\n </ul>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n\r\n // Size styles for trigger\r\n const sizeStyles = {\r\n // Keep consistent with Input size heights\r\n sm: \"h-8 py-1.5 text-sm md:h-7 md:text-xs\",\r\n md: \"h-10 py-2 text-sm\",\r\n lg: \"h-12 py-3 text-base\",\r\n } as const;\r\n\r\n const labelSize = size === \"sm\" ? \"text-xs\" : size === \"lg\" ? \"text-base\" : \"text-sm\";\r\n\r\n // Radius consistent with Input: sm => rounded-md, md/lg => rounded-lg\r\n const radiusClass = size === \"sm\" ? \"rounded-md\" : \"rounded-lg\";\r\n\r\n const verticalGap = size === \"sm\" ? \"space-y-1.5\" : \"space-y-2\";\r\n\r\n return (\r\n <div className={cn(\"w-full group\", verticalGap)}>\r\n {label && (\r\n <div className=\"flex items-center justify-between\">\r\n <label\r\n id={labelId}\r\n // Clicking the label should focus/open the trigger\r\n onClick={() => triggerRef.current?.focus()}\r\n className={cn(\r\n labelSize,\r\n \"font-medium transition-colors duration-200\",\r\n disabled ? \"text-muted-foreground\" : \"text-foreground group-focus-within:text-primary\"\r\n )}\r\n >\r\n {label}\r\n {required && <span className=\"text-destructive ml-1\">*</span>}\r\n </label>\r\n </div>\r\n )}\r\n {/* Trigger Button */}\r\n <button\r\n ref={triggerRef}\r\n type=\"button\"\r\n disabled={disabled}\r\n role=\"combobox\"\r\n aria-haspopup=\"listbox\"\r\n aria-expanded={open}\r\n aria-controls={`${resolvedId}-listbox`}\r\n id={resolvedId}\r\n aria-labelledby={labelId}\r\n onClick={() => {\r\n const next = !open;\r\n if (next) {\r\n const pos = calculatePosition();\r\n if (pos) setDropdownPosition(pos);\r\n }\r\n setOpen(next);\r\n }}\r\n className={cn(\r\n \"flex w-full items-center justify-between border border-input bg-background px-3\",\r\n radiusClass,\r\n sizeStyles[size],\r\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background\",\r\n \"disabled:cursor-not-allowed disabled:opacity-50\",\r\n \"hover:bg-accent/5 transition-colors hover:border-primary/40 focus:border-primary\",\r\n className\r\n )}\r\n >\r\n <span className={cn(\"truncate\", !displayValue && \"text-muted-foreground\", fontBold && \"font-bold\")}>{displayValue || placeholder}</span>\r\n\r\n <div className=\"flex items-center gap-1 ml-2\">\r\n {allowClear && value && !disabled && (\r\n // FIX: Use a div instead of a nested button\r\n <div\r\n role=\"button\"\r\n tabIndex={0}\r\n aria-label=\"Clear selection\"\r\n onClick={handleClear}\r\n onKeyDown={(e) => (e.key === \"Enter\" || e.key === \" \") && handleClear(e as any)}\r\n className=\"opacity-0 group-hover:opacity-100 transition-opacity p-0.5 rounded hover:bg-destructive/10 text-muted-foreground hover:text-destructive\"\r\n >\r\n <X className=\"h-3 w-3\" />\r\n </div>\r\n )}\r\n <ChevronDown className={cn(\"h-4 w-4 text-muted-foreground transition-all duration-200\", open && \"rotate-180 scale-110 text-primary\")} />\r\n </div>\r\n </button>\r\n\r\n {/* Dropdown Portal or Inline */}\r\n {usePortal\r\n ? open && dropdownPosition && typeof window !== \"undefined\" && createPortal(dropdownContent, document.body)\r\n : open && dropdownPosition && dropdownContent}\r\n </div>\r\n );\r\n};\r\n","// components/ui/Section.tsx\r\nimport React from \"react\";\r\nimport { cn } from \"@/lib/utils/cn\";\r\n\r\ntype GradientDirection = \"to-r\" | \"to-l\" | \"to-b\" | \"to-t\" | \"to-br\" | \"to-bl\" | \"to-tr\" | \"to-tl\";\r\n\r\ninterface SectionProps extends React.HTMLAttributes<HTMLElement> {\r\n children: React.ReactNode;\r\n className?: string;\r\n variant?: \"default\" | \"muted\" | \"primary\" | \"accent\" | \"gradient\";\r\n spacing?: \"sm\" | \"md\" | \"lg\" | \"xl\";\r\n fullWidth?: boolean;\r\n /** Hiển thị viền mỏng xám nhạt giống Card */\r\n outlined?: boolean;\r\n /** Gradient start color (Tailwind class like 'from-purple-500') */\r\n gradientFrom?: string;\r\n /** Gradient end color (Tailwind class like 'to-pink-500') */\r\n gradientTo?: string;\r\n /** Gradient direction */\r\n gradientDirection?: GradientDirection;\r\n}\r\n\r\nconst gradientDirectionMap: Record<GradientDirection, string> = {\r\n \"to-r\": \"bg-linear-to-r\",\r\n \"to-l\": \"bg-linear-to-l\",\r\n \"to-b\": \"bg-linear-to-b\",\r\n \"to-t\": \"bg-linear-to-t\",\r\n \"to-br\": \"bg-linear-to-br\",\r\n \"to-bl\": \"bg-linear-to-bl\",\r\n \"to-tr\": \"bg-linear-to-tr\",\r\n \"to-tl\": \"bg-linear-to-tl\",\r\n};\r\n\r\nconst Section = React.forwardRef<HTMLElement, SectionProps>(\r\n (\r\n {\r\n children,\r\n className,\r\n variant = \"default\",\r\n spacing = \"lg\",\r\n fullWidth = false,\r\n outlined = false,\r\n gradientFrom = \"from-primary/20\",\r\n gradientTo = \"to-accent/20\",\r\n gradientDirection = \"to-br\",\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n const variantClasses = {\r\n default: \"bg-background\",\r\n muted: \"bg-muted/30\",\r\n primary: \"bg-primary/5\",\r\n accent: \"bg-accent/10\",\r\n gradient: \"\",\r\n };\r\n\r\n const spacingClasses = {\r\n sm: \"py-6\",\r\n md: \"py-8\",\r\n lg: \"py-12\",\r\n xl: \"py-16\",\r\n };\r\n\r\n const getGradientClasses = () => {\r\n if (variant !== \"gradient\") return \"\";\r\n return cn(gradientDirectionMap[gradientDirection], gradientFrom, gradientTo);\r\n };\r\n\r\n return (\r\n <section\r\n ref={ref}\r\n className={cn(\r\n variant === \"gradient\" ? getGradientClasses() : variantClasses[variant],\r\n spacingClasses[spacing],\r\n outlined && \"rounded-lg border border-border/60\",\r\n !fullWidth && \"container mx-auto px-4 md:px-6\",\r\n className\r\n )}\r\n {...props}\r\n >\r\n {children}\r\n </section>\r\n );\r\n }\r\n);\r\n\r\nSection.displayName = \"Section\";\r\n\r\nexport default Section;\r\n","import { cn } from \"@/lib/utils/cn\";\nimport { forwardRef, HTMLAttributes } from \"react\";\n\r\ninterface ScrollAreaProps extends HTMLAttributes<HTMLDivElement> {\r\n className?: string;\r\n}\r\n\r\n// Wrap the scrollable viewport in an overflow-hidden container so rounded corners\n// cleanly clip the scrollbar at the edges.\nexport const ScrollArea = forwardRef<HTMLDivElement, ScrollAreaProps>(({ className, children, ...props }, ref) => {\n return (\n <div ref={ref} className={cn(\"relative overflow-hidden bg-background\", className)} {...props}>\n <div className={cn(\"h-full w-full overflow-y-auto scroll-area-viewport\")}>{children}</div>\n </div>\n );\n});\n\r\nScrollArea.displayName = \"ScrollArea\";\r\n","\"use client\";\r\n\r\nimport * as React from \"react\";\r\nimport { useId } from \"react\";\r\nimport { createPortal } from \"react-dom\";\r\nimport { cn } from \"@/lib/utils/cn\";\r\nimport { Calendar, ChevronLeft, ChevronRight, X as XIcon } from \"lucide-react\";\r\nimport Button from \"./Button\";\r\nimport { useShadCNAnimations } from \"@/lib/utils/shadcn-animations\";\r\nimport { useTranslations, useLocale } from \"@/lib/i18n/translation-adapter\";\r\nimport { LOCALE } from \"@/lib/constants/enum\";\r\nimport { formatDate as formatDateUtil, formatDateShort } from \"@/lib/utils/date\";\r\n\r\nexport interface DatePickerProps {\r\n id?: string;\r\n value?: Date;\r\n onChange: (date: Date | undefined) => void;\r\n placeholder?: string;\r\n className?: string;\r\n disabled?: boolean;\r\n size?: \"sm\" | \"md\";\r\n label?: string;\r\n required?: boolean;\r\n todayLabel?: string;\r\n clearLabel?: string;\r\n weekdayLabels?: string[];\r\n}\r\n\r\nexport const DatePicker: React.FC<DatePickerProps> = ({\r\n id,\r\n value,\r\n onChange,\r\n placeholder,\r\n className,\r\n disabled = false,\r\n size = \"md\",\r\n label,\r\n required,\r\n todayLabel,\r\n clearLabel,\r\n weekdayLabels,\r\n}) => {\r\n const t = useTranslations(\"DatePicker\");\r\n const locale = useLocale();\r\n const [isOpen, setIsOpen] = React.useState(false);\r\n const [dropdownPosition, setDropdownPosition] = React.useState<{ top: number; left: number; width: number } | null>(null);\r\n const [viewDate, setViewDate] = React.useState(value || new Date());\r\n const triggerRef = React.useRef<HTMLButtonElement>(null);\r\n const dropdownRef = React.useRef<HTMLDivElement>(null);\r\n\r\n // Inject ShadCN animations\r\n useShadCNAnimations();\r\n\r\n // Calculate positioning synchronously on open to avoid flicker\r\n const calculatePosition = React.useCallback(() => {\r\n if (!triggerRef.current) return null;\r\n const rect = triggerRef.current.getBoundingClientRect();\r\n const scrollTop = window.pageYOffset || document.documentElement.scrollTop;\r\n const scrollLeft = window.pageXOffset || document.documentElement.scrollLeft;\r\n return {\r\n top: rect.bottom + scrollTop + 4,\r\n left: rect.left + scrollLeft,\r\n width: rect.width,\r\n };\r\n }, []);\r\n\r\n // Reposition on resize/scroll while open\r\n React.useEffect(() => {\r\n if (!isOpen) return;\r\n const handler = () => {\r\n const pos = calculatePosition();\r\n if (pos) setDropdownPosition(pos);\r\n };\r\n window.addEventListener(\"resize\", handler);\r\n window.addEventListener(\"scroll\", handler, true);\r\n return () => {\r\n window.removeEventListener(\"resize\", handler);\r\n window.removeEventListener(\"scroll\", handler, true);\r\n };\r\n }, [isOpen, calculatePosition]);\r\n\r\n // Keep calendar month synced with current value or today\r\n React.useEffect(() => {\r\n if (value) {\r\n setViewDate(value);\r\n } else {\r\n setViewDate(new Date());\r\n }\r\n }, [value]);\r\n\r\n // Handle clicks outside\r\n React.useEffect(() => {\r\n if (!isOpen) return;\r\n\r\n const handleClickOutside = (event: MouseEvent) => {\r\n const target = event.target as Node;\r\n const trigger = triggerRef.current;\r\n const dropdown = dropdownRef.current;\r\n if (!trigger || !dropdown) return;\r\n const clickedOutsideTrigger = !trigger.contains(target);\r\n const clickedOutsideDropdown = !dropdown.contains(target);\r\n if (clickedOutsideTrigger && clickedOutsideDropdown) {\r\n setIsOpen(false);\r\n }\r\n };\r\n\r\n const handleEscape = (event: KeyboardEvent) => {\r\n if (event.key === \"Escape\") {\r\n setIsOpen(false);\r\n }\r\n };\r\n\r\n document.addEventListener(\"mousedown\", handleClickOutside);\r\n document.addEventListener(\"keydown\", handleEscape);\r\n\r\n return () => {\r\n document.removeEventListener(\"mousedown\", handleClickOutside);\r\n document.removeEventListener(\"keydown\", handleEscape);\r\n };\r\n }, [isOpen]);\r\n\r\n const handleDateSelect = (date: Date) => {\r\n // Preserve time from existing value if it's not midnight; otherwise use current time\r\n let selectedDate: Date;\r\n if (value && (value.getHours() !== 0 || value.getMinutes() !== 0 || value.getSeconds() !== 0)) {\r\n selectedDate = new Date(date.getFullYear(), date.getMonth(), date.getDate(), value.getHours(), value.getMinutes(), value.getSeconds());\r\n } else {\r\n const now = new Date();\r\n selectedDate = new Date(date.getFullYear(), date.getMonth(), date.getDate(), now.getHours(), now.getMinutes(), now.getSeconds());\r\n }\r\n onChange(selectedDate);\r\n setIsOpen(false);\r\n };\r\n\r\n const formatDateDisplay = (date: Date): string => {\r\n // Use locale for date formatting\r\n return date.toLocaleDateString(locale === \"vi\" ? \"vi-VN\" : \"en-US\", {\r\n day: \"numeric\",\r\n month: \"long\",\r\n year: \"numeric\",\r\n });\r\n };\r\n\r\n const getDaysInMonth = (date: Date): number => {\r\n return new Date(date.getFullYear(), date.getMonth() + 1, 0).getDate();\r\n };\r\n\r\n const getFirstDayOfMonth = (date: Date): number => {\r\n return new Date(date.getFullYear(), date.getMonth(), 1).getDay();\r\n };\r\n\r\n const navigateMonth = (direction: \"prev\" | \"next\") => {\r\n setViewDate((prev) => {\r\n const newDate = new Date(prev);\r\n newDate.setMonth(prev.getMonth() + (direction === \"next\" ? 1 : -1));\r\n return newDate;\r\n });\r\n };\r\n\r\n const renderCalendar = () => {\r\n const daysInMonth = getDaysInMonth(viewDate);\r\n const firstDayOfMonth = getFirstDayOfMonth(viewDate);\r\n const days = [];\r\n\r\n // Empty cells for days before the first day of the month\r\n for (let i = 0; i < firstDayOfMonth; i++) {\r\n days.push(<div key={`empty-${i}`} className=\"w-8 h-8\" />);\r\n }\r\n\r\n // Days of the month\r\n for (let day = 1; day <= daysInMonth; day++) {\r\n const date = new Date(viewDate.getFullYear(), viewDate.getMonth(), day);\r\n const isSelected =\r\n value && date.getDate() === value.getDate() && date.getMonth() === value.getMonth() && date.getFullYear() === value.getFullYear();\r\n const isToday = date.toDateString() === new Date().toDateString();\r\n\r\n // Calculate which row this day is in (0-based)\r\n const totalDaysFromStart = firstDayOfMonth + day - 1;\r\n const rowIndex = Math.floor(totalDaysFromStart / 7);\r\n\r\n days.push(\r\n <button\r\n key={day}\r\n onClick={() => handleDateSelect(date)}\r\n style={{\r\n animationDelay: isOpen ? `${rowIndex * 50}ms` : \"0ms\",\r\n }}\r\n className={cn(\r\n size === \"sm\" ? \"w-7 h-7 text-[12px]\" : \"w-8 h-8 text-sm\",\r\n \"datepicker-day rounded-md focus:outline-none\",\r\n \"transition-colors\",\r\n isSelected\r\n ? \"bg-primary! text-primary-foreground font-bold ring-2 ring-primary-foreground/60 shadow-lg scale-105 z-10 hover:bg-primary! focus:bg-primary! focus:text-primary-foreground\"\r\n : \"hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground\",\r\n isToday && !isSelected && \"bg-accent text-accent-foreground font-semibold\"\r\n )}\r\n >\r\n {day}\r\n </button>\r\n );\r\n }\r\n\r\n return days;\r\n };\r\n\r\n const datePickerContent =\r\n isOpen && dropdownPosition ? (\r\n <div\r\n data-datepicker\r\n style={{\r\n position: \"absolute\",\r\n top: dropdownPosition?.top || 0,\r\n left: dropdownPosition?.left || 0,\r\n width: size === \"sm\" ? dropdownPosition?.width || 224 : dropdownPosition?.width || 256,\r\n zIndex: 9999,\r\n pointerEvents: \"none\",\r\n }}\r\n data-state={isOpen ? \"open\" : \"closed\"}\r\n className={cn(\r\n \"z-9999\",\r\n \"data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95\",\r\n \"data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95\"\r\n )}\r\n >\r\n <div\r\n ref={dropdownRef}\r\n className={cn(\r\n \"rounded-md border bg-popover text-popover-foreground shadow-md\",\r\n \"backdrop-blur-sm bg-popover/95 border-border/60\",\r\n size === \"sm\" ? \"p-3 w-56\" : \"p-4 w-64\"\r\n )}\r\n style={{ pointerEvents: \"auto\" }}\r\n >\r\n {/* Header */}\r\n <div className=\"flex items-center justify-between mb-4\">\r\n <Button variant=\"ghost\" size=\"sm\" onClick={() => navigateMonth(\"prev\")} className=\"p-1 h-auto\">\r\n <ChevronLeft className=\"h-4 w-4\" />\r\n </Button>\r\n <div className=\"text-sm font-semibold\">\r\n {viewDate.toLocaleDateString(locale === \"vi\" ? \"vi-VN\" : \"en-US\", { month: \"long\", year: \"numeric\" })}\r\n </div>\r\n <Button variant=\"ghost\" size=\"sm\" onClick={() => navigateMonth(\"next\")} className=\"p-1 h-auto\">\r\n <ChevronRight className=\"h-4 w-4\" />\r\n </Button>\r\n </div>\r\n\r\n <div className={cn(\"grid grid-cols-7 gap-1\", size === \"sm\" ? \"mb-1\" : \"mb-2\")}>\r\n {(weekdayLabels || (locale === \"vi\" ? [\"CN\", \"T2\", \"T3\", \"T4\", \"T5\", \"T6\", \"T7\"] : [\"Su\", \"Mo\", \"Tu\", \"We\", \"Th\", \"Fr\", \"Sa\"])).map(\r\n (day) => (\r\n <div key={day} className={cn(\"text-muted-foreground text-center font-medium\", size === \"sm\" ? \"text-[10px] py-0.5\" : \"text-xs py-1\")}>\r\n {day}\r\n </div>\r\n )\r\n )}\r\n </div>\r\n\r\n {/* Calendar grid */}\r\n <div className=\"grid grid-cols-7 gap-1\">{renderCalendar()}</div>\r\n <div className=\"flex items-center justify-end mt-2\">\r\n <Button\r\n variant=\"outline\"\r\n size=\"sm\"\r\n onClick={() => {\r\n onChange(undefined);\r\n setIsOpen(false);\r\n setViewDate(new Date());\r\n }}\r\n >\r\n {clearLabel || t(\"clear\")}\r\n </Button>\r\n </div>\r\n </div>\r\n </div>\r\n ) : null;\r\n\r\n const autoId = useId();\r\n const resolvedId = id ? String(id) : `datepicker-${autoId}`;\r\n const labelId = label ? `${resolvedId}-label` : undefined;\r\n const labelSize = size === \"sm\" ? \"text-xs\" : \"text-sm\";\r\n\r\n // Radius consistent with Input: sm => rounded-md, md => rounded-lg\r\n const radiusClass = size === \"sm\" ? \"rounded-md\" : \"rounded-lg\";\r\n const verticalGap = size === \"sm\" ? \"space-y-1.5\" : \"space-y-2\";\r\n\r\n return (\r\n <div className={cn(\"w-full group\", verticalGap)}>\r\n {label && (\r\n <div className=\"flex items-center justify-between\">\r\n <label\r\n id={labelId}\r\n onClick={() => triggerRef.current?.focus()}\r\n className={cn(\r\n labelSize,\r\n \"font-medium transition-colors duration-200\",\r\n disabled ? \"text-muted-foreground\" : \"text-foreground group-focus-within:text-primary\"\r\n )}\r\n >\r\n {label}\r\n {required && <span className=\"text-destructive ml-1\">*</span>}\r\n </label>\r\n </div>\r\n )}\r\n <button\r\n ref={triggerRef}\r\n type=\"button\"\r\n disabled={disabled}\r\n id={resolvedId}\r\n aria-labelledby={labelId}\r\n onClick={() => {\r\n const next = !isOpen;\r\n if (next) {\r\n const pos = calculatePosition();\r\n if (pos) setDropdownPosition(pos);\r\n }\r\n setIsOpen(next);\r\n }}\r\n className={cn(\r\n cn(\r\n \"flex w-full items-center justify-between border border-input bg-background\",\r\n radiusClass,\r\n size === \"sm\" ? \"px-2.5 py-1.5 text-sm h-8 md:h-7 md:text-xs md:py-1\" : \"px-3 py-2 text-sm h-10\"\r\n ),\r\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background\",\r\n \"disabled:opacity-50 disabled:cursor-not-allowed\",\r\n \"hover:bg-accent/5 transition-colors\",\r\n className\r\n )}\r\n >\r\n <span className={cn(\"truncate\", !value && \"text-muted-foreground\")}>\r\n {value ? formatDateDisplay(value) : placeholder || t(\"placeholder\")}\r\n </span>\r\n {value && (\r\n <span\r\n role=\"button\"\r\n aria-label={clearLabel || t(\"clear\")}\r\n tabIndex={0}\r\n onClick={(e) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n onChange(undefined);\r\n setViewDate(new Date());\r\n }}\r\n onKeyDown={(e) => {\r\n if (e.key === \"Enter\" || e.key === \" \") {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n onChange(undefined);\r\n setViewDate(new Date());\r\n }\r\n }}\r\n className=\"absolute right-8 inline-flex items-center justify-center rounded-sm text-muted-foreground hover:text-foreground hover:bg-accent/50 transition-colors cursor-pointer\"\r\n style={{ width: 20, height: 20 }}\r\n >\r\n <XIcon className=\"h-3.5 w-3.5\" />\r\n </span>\r\n )}\r\n <Calendar className=\"h-4 w-4 text-muted-foreground ml-2\" />\r\n </button>\r\n\r\n {isOpen && dropdownPosition && typeof window !== \"undefined\" && createPortal(datePickerContent, document.body)}\r\n </div>\r\n );\r\n};\r\n\r\n// Additional components for backward compatibility\r\nexport const DateRangePicker: React.FC<{\r\n startDate?: Date;\r\n endDate?: Date;\r\n onChange: (start: Date, end: Date) => void;\r\n placeholder?: string;\r\n className?: string;\r\n}> = ({ startDate, endDate, onChange, placeholder = \"Select date range...\", className }) => {\r\n const locale = useLocale();\r\n const [isOpen, setIsOpen] = React.useState(false);\r\n const [dropdownPosition, setDropdownPosition] = React.useState<{ top: number; left: number; width: number } | null>(null);\r\n const triggerRef = React.useRef<HTMLButtonElement>(null);\r\n const panelRef = React.useRef<HTMLDivElement>(null);\r\n\r\n // Use passed-in props as the source of truth, but manage a temporary state for selection.\r\n const [viewDate, setViewDate] = React.useState<Date>(startDate || new Date());\r\n const [tempStart, setTempStart] = React.useState<Date | null>(startDate || null);\r\n const [tempEnd, setTempEnd] = React.useState<Date | null>(endDate || null);\r\n const [hoveredDate, setHoveredDate] = React.useState<Date | null>(null);\r\n\r\n // Sync temp state with props\r\n React.useEffect(() => {\r\n setTempStart(startDate || null);\r\n }, [startDate]);\r\n\r\n React.useEffect(() => {\r\n setTempEnd(endDate || null);\r\n }, [endDate]);\r\n\r\n const calculatePosition = React.useCallback(() => {\r\n if (!triggerRef.current) return null;\r\n const rect = triggerRef.current.getBoundingClientRect();\r\n const scrollTop = window.pageYOffset || document.documentElement.scrollTop;\r\n const scrollLeft = window.pageXOffset || document.documentElement.scrollLeft;\r\n return { top: rect.bottom + scrollTop + 4, left: rect.left + scrollLeft, width: rect.width };\r\n }, []);\r\n\r\n // Reposition on resize/scroll\r\n React.useEffect(() => {\r\n if (!isOpen) return;\r\n const handler = () => {\r\n const pos = calculatePosition();\r\n if (pos) setDropdownPosition(pos);\r\n };\r\n window.addEventListener(\"resize\", handler);\r\n window.addEventListener(\"scroll\", handler, true);\r\n return () => {\r\n window.removeEventListener(\"resize\", handler);\r\n window.removeEventListener(\"scroll\", handler, true);\r\n };\r\n }, [isOpen, calculatePosition]);\r\n\r\n // Handle clicks outside to close\r\n React.useEffect(() => {\r\n if (!isOpen) return;\r\n const handleClickOutside = (event: MouseEvent) => {\r\n if (\r\n triggerRef.current &&\r\n !triggerRef.current.contains(event.target as Node) &&\r\n panelRef.current &&\r\n !panelRef.current.contains(event.target as Node)\r\n ) {\r\n setIsOpen(false);\r\n }\r\n };\r\n const handleEscape = (event: KeyboardEvent) => {\r\n if (event.key === \"Escape\") setIsOpen(false);\r\n };\r\n document.addEventListener(\"mousedown\", handleClickOutside);\r\n document.addEventListener(\"keydown\", handleEscape);\r\n return () => {\r\n document.removeEventListener(\"mousedown\", handleClickOutside);\r\n document.removeEventListener(\"keydown\", handleEscape);\r\n };\r\n }, [isOpen]);\r\n\r\n const isSameDay = (a: Date | null, b: Date | null) => {\r\n if (!a || !b) return false;\r\n return a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth() && a.getDate() === b.getDate();\r\n };\r\n const inRange = (d: Date, s: Date, e: Date) => d > s && d < e;\r\n const getDaysInMonth = (d: Date) => new Date(d.getFullYear(), d.getMonth() + 1, 0).getDate();\r\n const getFirstDayOfMonth = (d: Date) => new Date(d.getFullYear(), d.getMonth(), 1).getDay();\r\n\r\n const handleSelect = (date: Date) => {\r\n if (!tempStart || (tempStart && tempEnd)) {\r\n setTempStart(date);\r\n setTempEnd(null);\r\n setHoveredDate(null);\r\n } else if (tempStart && !tempEnd) {\r\n if (date < tempStart) {\r\n setTempStart(date);\r\n } else {\r\n setTempEnd(date);\r\n onChange(tempStart, date);\r\n setIsOpen(false);\r\n }\r\n }\r\n };\r\n\r\n const renderGrid = () => {\r\n const nodes: React.ReactNode[] = [];\r\n const daysInMonth = getDaysInMonth(viewDate);\r\n const firstDay = getFirstDayOfMonth(viewDate);\r\n for (let i = 0; i < firstDay; i++) nodes.push(<div key={`e-${i}`} className=\"w-8 h-8\" />);\r\n\r\n for (let d = 1; d <= daysInMonth; d++) {\r\n const date = new Date(viewDate.getFullYear(), viewDate.getMonth(), d);\r\n\r\n const isSelectedStart = isSameDay(date, tempStart);\r\n const isSelectedEnd = isSameDay(date, tempEnd);\r\n\r\n const isHovering = hoveredDate && tempStart && !tempEnd;\r\n\r\n let isInRange = false;\r\n let isRangeStart = false;\r\n let isRangeEnd = false;\r\n\r\n if (tempStart && tempEnd) {\r\n if (isSameDay(date, tempStart)) isRangeStart = true;\r\n if (isSameDay(date, tempEnd)) isRangeEnd = true;\r\n if (inRange(date, tempStart, tempEnd)) isInRange = true;\r\n } else if (isHovering) {\r\n if (hoveredDate > tempStart) {\r\n if (isSameDay(date, tempStart)) isRangeStart = true;\r\n if (isSameDay(date, hoveredDate)) isRangeEnd = true;\r\n if (inRange(date, tempStart, hoveredDate)) isInRange = true;\r\n } else {\r\n if (isSameDay(date, hoveredDate)) isRangeStart = true;\r\n if (isSameDay(date, tempStart)) isRangeEnd = true;\r\n if (inRange(date, hoveredDate, tempStart)) isInRange = true;\r\n }\r\n }\r\n\r\n nodes.push(\r\n <button\r\n key={d}\r\n onClick={() => handleSelect(date)}\r\n onMouseEnter={() => tempStart && !tempEnd && setHoveredDate(date)}\r\n onMouseLeave={() => tempStart && !tempEnd && setHoveredDate(null)}\r\n className={cn(\r\n \"w-8 h-8 text-sm transition-all duration-200 focus:outline-none relative font-medium\",\r\n // Default state\r\n !isInRange && !isRangeStart && !isRangeEnd && \"hover:bg-accent hover:text-accent-foreground rounded-md\",\r\n\r\n // Range selection styling - smooth continuous background\r\n isInRange && \"bg-primary/15 text-foreground shadow-sm\",\r\n (isRangeStart || isRangeEnd) && \"bg-primary text-primary-foreground hover:bg-primary/90 shadow-sm\",\r\n\r\n // Only round the actual start and end of the range\r\n isRangeStart && !isRangeEnd && \"rounded-l-md rounded-r-none\",\r\n isRangeEnd && !isRangeStart && \"rounded-r-md rounded-l-none\",\r\n isRangeStart && isRangeEnd && \"rounded-md\", // Single day selection\r\n\r\n // Hover effects for range\r\n isInRange && \"hover:bg-primary/25\",\r\n\r\n \"focus:bg-accent focus:text-accent-foreground focus:z-10 focus:shadow-md\"\r\n )}\r\n >\r\n {d}\r\n </button>\r\n );\r\n }\r\n return nodes;\r\n };\r\n\r\n const panel =\r\n isOpen && dropdownPosition ? (\r\n <div\r\n style={{ position: \"absolute\", top: dropdownPosition.top, left: dropdownPosition.left, width: dropdownPosition.width || 256, zIndex: 9999 }}\r\n data-state={isOpen ? \"open\" : \"closed\"}\r\n className={cn(\r\n \"z-9999\",\r\n \"data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95\",\r\n \"data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95\"\r\n )}\r\n >\r\n <div\r\n ref={panelRef}\r\n className={cn(\"rounded-md border bg-popover text-popover-foreground shadow-md\", \"backdrop-blur-sm bg-popover/95 border-border/60 p-4 w-64\")}\r\n >\r\n <div className=\"flex items-center justify-between mb-3\">\r\n <Button\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n onClick={() => setViewDate(new Date(viewDate.getFullYear(), viewDate.getMonth() - 1, 1))}\r\n className=\"p-1 h-auto\"\r\n >\r\n <ChevronLeft className=\"h-4 w-4\" />\r\n </Button>\r\n <div className=\"text-sm font-semibold\">\r\n {viewDate.toLocaleDateString(locale === \"vi\" ? \"vi-VN\" : \"en-US\", { month: \"long\", year: \"numeric\" })}\r\n </div>\r\n <Button\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n onClick={() => setViewDate(new Date(viewDate.getFullYear(), viewDate.getMonth() + 1, 1))}\r\n className=\"p-1 h-auto\"\r\n >\r\n <ChevronRight className=\"h-4 w-4\" />\r\n </Button>\r\n </div>\r\n <div className=\"grid grid-cols-7 gap-1 mb-2\">\r\n {(locale === \"vi\" ? [\"CN\", \"T2\", \"T3\", \"T4\", \"T5\", \"T6\", \"T7\"] : [\"Su\", \"Mo\", \"Tu\", \"We\", \"Th\", \"Fr\", \"Sa\"]).map((d) => (\r\n <div key={d} className=\"text-xs text-muted-foreground text-center py-1 font-medium\">\r\n {d}\r\n </div>\r\n ))}\r\n </div>\r\n <div className=\"grid grid-cols-7\">{renderGrid()}</div>\r\n </div>\r\n </div>\r\n ) : null;\r\n\r\n const displayFormat = (date: Date) => formatDateShort(date);\r\n\r\n const label =\r\n tempStart && tempEnd ? `${displayFormat(tempStart)} - ${displayFormat(tempEnd)}` : tempStart ? `${displayFormat(tempStart)} - ...` : placeholder;\r\n\r\n return (\r\n <>\r\n <button\r\n ref={triggerRef}\r\n type=\"button\"\r\n onClick={() => {\r\n const next = !isOpen;\r\n if (next) {\r\n const pos = calculatePosition();\r\n if (pos) setDropdownPosition(pos);\r\n }\r\n setIsOpen(next);\r\n }}\r\n className={cn(\r\n \"flex w-full items-center justify-between rounded-md border border-input bg-background px-3 py-2 text-sm\",\r\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background\",\r\n className\r\n )}\r\n >\r\n <span className={cn(\"truncate\", !tempStart && !tempEnd && \"text-muted-foreground\")}>{label}</span>\r\n <Calendar className=\"h-4 w-4 text-muted-foreground ml-2\" />\r\n </button>\r\n {isOpen && dropdownPosition && typeof window !== \"undefined\" && createPortal(panel, document.body)}\r\n </>\r\n );\r\n};\r\n\r\nexport const CompactDatePicker: React.FC<{\r\n value?: Date;\r\n onChange: (date?: Date) => void;\r\n className?: string;\r\n}> = ({ value, onChange, className }) => {\r\n return (\r\n <DatePicker\r\n value={value}\r\n onChange={onChange as (d: Date | undefined) => void}\r\n size=\"sm\"\r\n className={cn(\"max-w-56\", className)}\r\n placeholder=\"Date\"\r\n />\r\n );\r\n};\r\n","/**\n * Date formatting utilities for Vietnamese locale\n * Provides consistent date/time formatting across the application\n */\n\n/**\n * Format date to Vietnamese readable format\n * Example: \"25 tháng 12, 2024\"\n */\nexport function formatDate(date: string | Date | null | undefined): string {\n if (!date) return \"\";\n const d = new Date(date);\n if (isNaN(d.getTime())) return \"\";\n\n return d.toLocaleDateString(\"vi-VN\", {\n day: \"numeric\",\n month: \"long\",\n year: \"numeric\",\n });\n}\n\n/**\n * Format date to short format\n * Example: \"25/12/2024\"\n */\nexport function formatDateShort(date: string | Date | null | undefined): string {\n if (!date) return \"\";\n const d = new Date(date);\n if (isNaN(d.getTime())) return \"\";\n\n return d.toLocaleDateString(\"vi-VN\", {\n day: \"2-digit\",\n month: \"2-digit\",\n year: \"numeric\",\n });\n}\n\n/**\n * Format time only\n * Example: \"14:30\"\n */\nexport function formatTime(date: string | Date | null | undefined): string {\n if (!date) return \"\";\n const d = new Date(date);\n if (isNaN(d.getTime())) return \"\";\n\n return d.toLocaleTimeString(\"vi-VN\", {\n hour: \"2-digit\",\n minute: \"2-digit\",\n });\n}\n\n/**\n * Format date and time\n * Example: \"25/12/2024 14:30\"\n */\nexport function formatDateTime(date: string | Date | null | undefined): string {\n if (!date) return \"\";\n const d = new Date(date);\n if (isNaN(d.getTime())) return \"\";\n\n return d.toLocaleString(\"vi-VN\", {\n day: \"2-digit\",\n month: \"2-digit\",\n year: \"numeric\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n });\n}\n\n/**\n * Format date with time - more readable\n * Example: \"25 tháng 12, 2024 lúc 14:30\"\n */\nexport function formatDateTimeLong(date: string | Date | null | undefined): string {\n if (!date) return \"\";\n const d = new Date(date);\n if (isNaN(d.getTime())) return \"\";\n\n const dateStr = d.toLocaleDateString(\"vi-VN\", {\n day: \"numeric\",\n month: \"long\",\n year: \"numeric\",\n });\n\n const timeStr = d.toLocaleTimeString(\"vi-VN\", {\n hour: \"2-digit\",\n minute: \"2-digit\",\n });\n\n return `${dateStr} lúc ${timeStr}`;\n}\n\n/**\n * Format relative time (time ago)\n * Example: \"2 giờ trước\", \"3 ngày trước\", \"1 tuần trước\"\n */\nexport function formatTimeAgo(date: string | Date | null | undefined): string {\n if (!date) return \"\";\n const d = new Date(date);\n if (isNaN(d.getTime())) return \"\";\n\n const now = new Date();\n const diffMs = now.getTime() - d.getTime();\n const diffSec = Math.floor(diffMs / 1000);\n const diffMin = Math.floor(diffSec / 60);\n const diffHour = Math.floor(diffMin / 60);\n const diffDay = Math.floor(diffHour / 24);\n const diffWeek = Math.floor(diffDay / 7);\n const diffMonth = Math.floor(diffDay / 30);\n const diffYear = Math.floor(diffDay / 365);\n\n if (diffSec < 60) return \"Vừa xong\";\n if (diffMin < 60) return `${diffMin} phút trước`;\n if (diffHour < 24) return `${diffHour} giờ trước`;\n if (diffDay < 7) return `${diffDay} ngày trước`;\n if (diffWeek < 4) return `${diffWeek} tuần trước`;\n if (diffMonth < 12) return `${diffMonth} tháng trước`;\n return `${diffYear} năm trước`;\n}\n\n/**\n * Format date range\n * Example: \"25/12/2024 - 31/12/2024\"\n */\nexport function formatDateRange(\n startDate: string | Date | null | undefined,\n endDate: string | Date | null | undefined\n): string {\n const start = formatDateShort(startDate);\n const end = formatDateShort(endDate);\n\n if (!start && !end) return \"\";\n if (!start) return `Đến ${end}`;\n if (!end) return `Từ ${start}`;\n\n return `${start} - ${end}`;\n}\n\n/**\n * Check if date is today\n */\nexport function isToday(date: string | Date | null | undefined): boolean {\n if (!date) return false;\n const d = new Date(date);\n if (isNaN(d.getTime())) return false;\n\n const today = new Date();\n return (\n d.getDate() === today.getDate() &&\n d.getMonth() === today.getMonth() &&\n d.getFullYear() === today.getFullYear()\n );\n}\n\n/**\n * Check if date is yesterday\n */\nexport function isYesterday(date: string | Date | null | undefined): boolean {\n if (!date) return false;\n const d = new Date(date);\n if (isNaN(d.getTime())) return false;\n\n const yesterday = new Date();\n yesterday.setDate(yesterday.getDate() - 1);\n\n return (\n d.getDate() === yesterday.getDate() &&\n d.getMonth() === yesterday.getMonth() &&\n d.getFullYear() === yesterday.getFullYear()\n );\n}\n\n/**\n * Smart date formatting - shows relative time for recent dates, full date for older ones\n * Example:\n * - \"Vừa xong\" (< 1 min)\n * - \"5 phút trước\" (< 1 hour)\n * - \"Hôm nay lúc 14:30\" (today)\n * - \"Hôm qua lúc 14:30\" (yesterday)\n * - \"25/12/2024 14:30\" (older)\n */\nexport function formatDateSmart(date: string | Date | null | undefined): string {\n if (!date) return \"\";\n const d = new Date(date);\n if (isNaN(d.getTime())) return \"\";\n\n const now = new Date();\n const diffMs = now.getTime() - d.getTime();\n const diffHour = Math.floor(diffMs / (1000 * 60 * 60));\n\n // Less than 1 hour ago - show relative time\n if (diffHour < 1) {\n return formatTimeAgo(date);\n }\n\n // Today - show \"Hôm nay lúc HH:MM\"\n if (isToday(date)) {\n return `Hôm nay lúc ${formatTime(date)}`;\n }\n\n // Yesterday - show \"Hôm qua lúc HH:MM\"\n if (isYesterday(date)) {\n return `Hôm qua lúc ${formatTime(date)}`;\n }\n\n // Less than 7 days - show relative\n if (diffHour < 24 * 7) {\n return formatTimeAgo(date);\n }\n\n // Older - show full date with time\n return formatDateTime(date);\n}\n\n/**\n * Format date for input[type=\"date\"]\n * Example: \"2024-12-25\"\n */\nexport function formatDateForInput(date: string | Date | null | undefined): string {\n if (!date) return \"\";\n const d = new Date(date);\n if (isNaN(d.getTime())) return \"\";\n\n const year = d.getFullYear();\n const month = String(d.getMonth() + 1).padStart(2, '0');\n const day = String(d.getDate()).padStart(2, '0');\n\n return `${year}-${month}-${day}`;\n}\n\n/**\n * Format date for input[type=\"datetime-local\"]\n * Example: \"2024-12-25T14:30\"\n */\nexport function formatDateTimeForInput(date: string | Date | null | undefined): string {\n if (!date) return \"\";\n const d = new Date(date);\n if (isNaN(d.getTime())) return \"\";\n\n const dateStr = formatDateForInput(date);\n const hours = String(d.getHours()).padStart(2, '0');\n const minutes = String(d.getMinutes()).padStart(2, '0');\n\n return `${dateStr}T${hours}:${minutes}`;\n}\n\n/**\n * Get day of week in Vietnamese\n * Example: \"Thứ Hai\", \"Thứ Ba\", ...\n */\nexport function getDayOfWeek(date: string | Date | null | undefined): string {\n if (!date) return \"\";\n const d = new Date(date);\n if (isNaN(d.getTime())) return \"\";\n\n const days = [\n \"Chủ Nhật\",\n \"Thứ Hai\",\n \"Thứ Ba\",\n \"Thứ Tư\",\n \"Thứ Năm\",\n \"Thứ Sáu\",\n \"Thứ Bảy\",\n ];\n\n return days[d.getDay()];\n}\n\n/**\n * Format with day of week\n * Example: \"Thứ Hai, 25/12/2024\"\n */\nexport function formatDateWithDay(date: string | Date | null | undefined): string {\n if (!date) return \"\";\n const dayOfWeek = getDayOfWeek(date);\n const dateStr = formatDateShort(date);\n\n return `${dayOfWeek}, ${dateStr}`;\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"@/lib/utils/cn\";\nimport { Popover } from \"./Popover\";\nimport { Clock, X, Check } from \"lucide-react\";\nimport Input from \"./Input\";\n\ntype TimeFormat = \"24\" | \"12\";\ntype TimePickerVariant = \"default\" | \"compact\" | \"inline\";\n\nexport interface TimePickerProps extends Omit<React.HTMLAttributes<HTMLDivElement>, \"onChange\"> {\n value?: string; // e.g. \"14:05\" or \"02:05 PM\"\n defaultValue?: string;\n onChange?: (value: string | undefined) => void;\n placeholder?: string;\n disabled?: boolean;\n size?: \"sm\" | \"md\" | \"lg\";\n label?: string;\n required?: boolean;\n format?: TimeFormat; // 24 or 12\n includeSeconds?: boolean;\n minuteStep?: number; // default 5\n secondStep?: number; // default 5\n clearable?: boolean;\n /** Visual variant of the picker */\n variant?: TimePickerVariant;\n /** Show \"Now\" button */\n showNow?: boolean;\n /** Show time presets (Morning, Afternoon, Evening) */\n showPresets?: boolean;\n /** Enable manual input */\n allowManualInput?: boolean;\n /** Custom presets with labels and times */\n customPresets?: Array<{ label: string; time: string }>;\n /** Minimum allowed time (e.g., \"09:00\") */\n minTime?: string;\n /** Maximum allowed time (e.g., \"18:00\") */\n maxTime?: string;\n /** Disabled times function or array */\n disabledTimes?: ((time: string) => boolean) | string[];\n /** Show validation feedback */\n error?: string;\n /** Success state */\n success?: boolean;\n /** Helper text */\n helperText?: string;\n /** Enable smooth animations */\n animate?: boolean;\n /** Callback when popover opens */\n onOpen?: () => void;\n /** Callback when popover closes */\n onClose?: () => void;\n}\n\ntype Parts = { h: number; m: number; s: number; p?: \"AM\" | \"PM\" };\n\nconst pad = (n: number) => n.toString().padStart(2, \"0\");\n\nfunction parseTime(input?: string, fmt: TimeFormat = \"24\", includeSeconds?: boolean): Parts | null {\n if (!input) return null;\n try {\n const s = input.trim().toUpperCase();\n const ampm = s.endsWith(\"AM\") || s.endsWith(\"PM\");\n const clean = s.replace(/\\s*(AM|PM)\\s*$/, \"\");\n const segs = clean.split(\":\");\n const h = Number(segs[0]);\n const m = Number(segs[1] ?? 0);\n const sec = Number(segs[2] ?? 0);\n if (Number.isNaN(h) || Number.isNaN(m) || Number.isNaN(sec)) return null;\n if (fmt === \"12\" || ampm) {\n const p = s.endsWith(\"PM\") ? \"PM\" : \"AM\";\n return { h: Math.max(1, Math.min(12, h)), m: Math.max(0, Math.min(59, m)), s: Math.max(0, Math.min(59, sec)), p };\n }\n return { h: Math.max(0, Math.min(23, h)), m: Math.max(0, Math.min(59, m)), s: Math.max(0, Math.min(59, sec)) };\n } catch (error) {\n console.error(\"Error parsing time:\", error);\n return null;\n }\n}\n\nfunction formatTime({ h, m, s, p }: Parts, fmt: TimeFormat, includeSeconds?: boolean): string {\n if (fmt === \"12\") {\n const period = p || (h >= 12 ? \"PM\" : \"AM\");\n const hr12 = h % 12 === 0 ? 12 : h % 12;\n const base = `${pad(hr12)}:${pad(m)}`;\n return includeSeconds ? `${base}:${pad(s)} ${period}` : `${base} ${period}`;\n }\n const base = `${pad(h)}:${pad(m)}`;\n return includeSeconds ? `${base}:${pad(s)}` : base;\n}\n\n// Time presets\nconst PRESETS = {\n morning: { h: 9, m: 0, s: 0 },\n afternoon: { h: 14, m: 0, s: 0 },\n evening: { h: 18, m: 0, s: 0 },\n night: { h: 21, m: 0, s: 0 },\n};\n\nexport default function TimePicker({\n value,\n defaultValue,\n onChange,\n placeholder = \"Select time\",\n disabled = false,\n size = \"md\",\n label,\n required,\n format = \"24\",\n includeSeconds = false,\n minuteStep = 5,\n secondStep = 5,\n clearable = true,\n variant = \"default\",\n showNow = false,\n showPresets = false,\n allowManualInput = false,\n customPresets = [],\n minTime,\n maxTime,\n disabledTimes,\n error,\n success,\n helperText,\n animate = true,\n onOpen,\n onClose,\n className,\n ...rest\n}: TimePickerProps) {\n const isControlled = value !== undefined;\n const now = new Date();\n const initial: Parts =\n parseTime(isControlled ? value : defaultValue, format, includeSeconds) ||\n (format === \"12\"\n ? { h: ((now.getHours() % 12) || 12), m: now.getMinutes(), s: now.getSeconds(), p: now.getHours() >= 12 ? \"PM\" : \"AM\" }\n : { h: now.getHours(), m: now.getMinutes(), s: now.getSeconds() });\n\n const [open, setOpen] = React.useState(false);\n const [parts, setParts] = React.useState<Parts>(initial);\n const [manualInput, setManualInput] = React.useState(\"\");\n const [focusedColumn, setFocusedColumn] = React.useState<\"hour\" | \"minute\" | \"second\" | \"period\" | null>(null);\n\n const hourScrollRef = React.useRef<HTMLDivElement>(null);\n const minuteScrollRef = React.useRef<HTMLDivElement>(null);\n const secondScrollRef = React.useRef<HTMLDivElement>(null);\n\n React.useEffect(() => {\n if (isControlled) {\n const parsed = parseTime(value, format, includeSeconds);\n if (parsed) setParts(parsed);\n }\n }, [value, isControlled, format, includeSeconds]);\n\n // Smooth scroll to selected time\n React.useEffect(() => {\n if (!open) return;\n const scrollToSelected = (ref: React.RefObject<HTMLDivElement | null>, targetValue: number, step: number) => {\n if (!ref.current) return;\n const buttons = ref.current.querySelectorAll(\"button\");\n const targetIndex = Math.floor(targetValue / step);\n const targetButton = buttons[targetIndex];\n if (targetButton) {\n targetButton.scrollIntoView({ behavior: animate ? \"smooth\" : \"auto\", block: \"center\" });\n }\n };\n\n setTimeout(() => {\n scrollToSelected(hourScrollRef, parts.h, 1);\n scrollToSelected(minuteScrollRef, parts.m, minuteStep);\n if (includeSeconds) scrollToSelected(secondScrollRef, parts.s, secondStep);\n }, 50);\n }, [open, parts.h, parts.m, parts.s, minuteStep, secondStep, includeSeconds, animate]);\n\n // Check if time is disabled\n const isTimeDisabled = React.useCallback((timeStr: string): boolean => {\n if (!disabledTimes) return false;\n if (typeof disabledTimes === \"function\") return disabledTimes(timeStr);\n return disabledTimes.includes(timeStr);\n }, [disabledTimes]);\n\n // Check if time is within range\n const isTimeInRange = React.useCallback((timeStr: string): boolean => {\n if (!minTime && !maxTime) return true;\n const parsed = parseTime(timeStr, format, includeSeconds);\n if (!parsed) return true;\n\n if (minTime) {\n const min = parseTime(minTime, format, includeSeconds);\n if (min) {\n const currentMinutes = parsed.h * 60 + parsed.m;\n const minMinutes = min.h * 60 + min.m;\n if (currentMinutes < minMinutes) return false;\n }\n }\n\n if (maxTime) {\n const max = parseTime(maxTime, format, includeSeconds);\n if (max) {\n const currentMinutes = parsed.h * 60 + parsed.m;\n const maxMinutes = max.h * 60 + max.m;\n if (currentMinutes > maxMinutes) return false;\n }\n }\n\n return true;\n }, [minTime, maxTime, format, includeSeconds]);\n\n const emit = (next: Parts | undefined) => {\n const timeStr = next ? formatTime(next, format, includeSeconds) : undefined;\n if (timeStr && !isTimeInRange(timeStr)) return;\n if (timeStr && isTimeDisabled(timeStr)) return;\n onChange?.(timeStr);\n };\n\n const handleOpenChange = (newOpen: boolean) => {\n setOpen(newOpen);\n if (newOpen) {\n onOpen?.();\n } else {\n onClose?.();\n setFocusedColumn(null);\n }\n };\n\n // Keyboard navigation\n const handleKeyDown = (e: React.KeyboardEvent, column: \"hour\" | \"minute\" | \"second\" | \"period\") => {\n if (![\"ArrowUp\", \"ArrowDown\", \"ArrowLeft\", \"ArrowRight\", \"Home\", \"End\", \"PageUp\", \"PageDown\"].includes(e.key)) return;\n e.preventDefault();\n\n let newParts = { ...parts };\n\n switch (column) {\n case \"hour\":\n if (e.key === \"ArrowUp\") newParts.h = format === \"24\" ? (parts.h + 1) % 24 : (parts.h % 12) + 1;\n if (e.key === \"ArrowDown\") newParts.h = format === \"24\" ? (parts.h - 1 + 24) % 24 : ((parts.h - 2 + 12) % 12) + 1;\n if (e.key === \"Home\") newParts.h = format === \"24\" ? 0 : 1;\n if (e.key === \"End\") newParts.h = format === \"24\" ? 23 : 12;\n if (e.key === \"PageUp\") newParts.h = format === \"24\" ? (parts.h + 6) % 24 : (parts.h % 12) + 3;\n if (e.key === \"PageDown\") newParts.h = format === \"24\" ? (parts.h - 6 + 24) % 24 : ((parts.h - 4 + 12) % 12) + 1;\n if (e.key === \"ArrowRight\") setFocusedColumn(\"minute\");\n break;\n case \"minute\":\n if (e.key === \"ArrowUp\") newParts.m = (parts.m + minuteStep) % 60;\n if (e.key === \"ArrowDown\") newParts.m = (parts.m - minuteStep + 60) % 60;\n if (e.key === \"Home\") newParts.m = 0;\n if (e.key === \"End\") newParts.m = 59 - (59 % minuteStep);\n if (e.key === \"PageUp\") newParts.m = (parts.m + minuteStep * 3) % 60;\n if (e.key === \"PageDown\") newParts.m = (parts.m - minuteStep * 3 + 60) % 60;\n if (e.key === \"ArrowLeft\") setFocusedColumn(\"hour\");\n if (e.key === \"ArrowRight\") setFocusedColumn(includeSeconds ? \"second\" : format === \"12\" ? \"period\" : null);\n break;\n case \"second\":\n if (e.key === \"ArrowUp\") newParts.s = (parts.s + secondStep) % 60;\n if (e.key === \"ArrowDown\") newParts.s = (parts.s - secondStep + 60) % 60;\n if (e.key === \"Home\") newParts.s = 0;\n if (e.key === \"End\") newParts.s = 59 - (59 % secondStep);\n if (e.key === \"PageUp\") newParts.s = (parts.s + secondStep * 3) % 60;\n if (e.key === \"PageDown\") newParts.s = (parts.s - secondStep * 3 + 60) % 60;\n if (e.key === \"ArrowLeft\") setFocusedColumn(\"minute\");\n if (e.key === \"ArrowRight\" && format === \"12\") setFocusedColumn(\"period\");\n break;\n case \"period\":\n if (e.key === \"ArrowUp\" || e.key === \"ArrowDown\" || e.key === \"Home\" || e.key === \"End\") {\n newParts.p = newParts.p === \"AM\" ? \"PM\" : \"AM\";\n }\n if (e.key === \"ArrowLeft\") setFocusedColumn(includeSeconds ? \"second\" : \"minute\");\n break;\n }\n\n setParts(newParts);\n emit(newParts);\n };\n\n const setNow = () => {\n const now = new Date();\n const h = now.getHours();\n const m = now.getMinutes();\n const s = now.getSeconds();\n let next: Parts;\n if (format === \"12\") {\n next = { h: h % 12 || 12, m, s, p: h >= 12 ? \"PM\" : \"AM\" };\n } else {\n next = { h, m, s };\n }\n setParts(next);\n emit(next);\n };\n\n const setPreset = (preset: keyof typeof PRESETS) => {\n const { h, m, s } = PRESETS[preset];\n let next: Parts;\n if (format === \"12\") {\n next = { h: h % 12 || 12, m, s, p: h >= 12 ? \"PM\" : \"AM\" };\n } else {\n next = { h, m, s };\n }\n setParts(next);\n emit(next);\n };\n\n const handleManualInput = (input: string) => {\n setManualInput(input);\n const parsed = parseTime(input, format, includeSeconds);\n if (parsed) {\n const timeStr = formatTime(parsed, format, includeSeconds);\n if (isTimeInRange(timeStr) && !isTimeDisabled(timeStr)) {\n setParts(parsed);\n emit(parsed);\n }\n }\n };\n\n const handleCustomPreset = (time: string) => {\n const parsed = parseTime(time, format, includeSeconds);\n if (parsed) {\n setParts(parsed);\n emit(parsed);\n }\n };\n\n const hours: number[] = format === \"24\" ? Array.from({ length: 24 }, (_, i) => i) : Array.from({ length: 12 }, (_, i) => (i + 1));\n const minutes: number[] = Array.from({ length: Math.ceil(60 / minuteStep) }, (_, i) => Math.min(59, i * minuteStep));\n const seconds: number[] = Array.from({ length: Math.ceil(60 / secondStep) }, (_, i) => Math.min(59, i * secondStep));\n\n const sizeClasses = {\n sm: { label: \"text-xs\", height: \"h-8\", padding: \"px-2.5 py-1.5\", text: \"text-xs\", icon: \"w-3.5 h-3.5\" },\n md: { label: \"text-sm\", height: \"h-10\", padding: \"px-3 py-2\", text: \"text-sm\", icon: \"w-4 h-4\" },\n lg: { label: \"text-base\", height: \"h-12\", padding: \"px-4 py-3\", text: \"text-base\", icon: \"w-5 h-5\" },\n };\n\n const sz = sizeClasses[size];\n const radiusClass = size === \"sm\" ? \"rounded-md\" : \"rounded-lg\";\n\n const display = formatTime(parts, format, includeSeconds);\n\n const trigger = variant === \"inline\" ? null : (\n <button\n type=\"button\"\n disabled={disabled}\n aria-label=\"Select time\"\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n className={cn(\n \"flex w-full items-center justify-between border bg-background\",\n sz.height,\n sz.padding,\n sz.text,\n radiusClass,\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background\",\n \"disabled:opacity-50 disabled:cursor-not-allowed\",\n \"transition-all duration-200\",\n error && \"border-destructive focus-visible:ring-destructive\",\n success && \"border-green-500 focus-visible:ring-green-500\",\n !error && !success && \"border-input hover:bg-accent/5\",\n animate && !disabled && \"hover:shadow-md\",\n className\n )}\n >\n <div className=\"flex items-center gap-2\">\n <Clock className={cn(sz.icon, error ? \"text-destructive\" : success ? \"text-green-500\" : \"text-muted-foreground\")} />\n <span className={cn(\"truncate\", !value && !defaultValue && \"text-muted-foreground\")}>\n {value || defaultValue ? display : placeholder}\n </span>\n </div>\n <span className={cn(\"ml-2 transition-transform duration-200\", open && \"rotate-180\")}>\n <svg className={sz.icon} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 9l-7 7-7-7\" />\n </svg>\n </span>\n </button>\n );\n\n const contentWidth = variant === \"compact\" ? 240 : variant === \"inline\" ? 320 : includeSeconds ? 340 : 300;\n\n const timePickerContent = (\n <div className=\"space-y-3\">\n {/* Manual Input */}\n {allowManualInput && (\n <div>\n <Input\n placeholder={format === \"12\" ? \"02:30 PM\" : \"14:30\"}\n value={manualInput || display}\n onChange={(e) => handleManualInput(e.target.value)}\n size=\"sm\"\n variant=\"outlined\"\n />\n </div>\n )}\n\n {/* Presets */}\n {showPresets && (\n <div className=\"grid grid-cols-2 gap-2\">\n {Object.keys(PRESETS).map((preset) => (\n <button\n key={preset}\n type=\"button\"\n className={cn(\n \"px-2 py-1.5 text-xs rounded-md border border-border hover:bg-accent/10 capitalize transition-all\",\n animate && \"hover:scale-105 active:scale-95\"\n )}\n onClick={() => setPreset(preset as keyof typeof PRESETS)}\n aria-label={`Set time to ${preset}`}\n >\n {preset}\n </button>\n ))}\n </div>\n )}\n\n {/* Custom Presets */}\n {customPresets && customPresets.length > 0 && (\n <div className=\"grid grid-cols-2 gap-2\">\n {customPresets.map((preset, idx) => (\n <button\n key={idx}\n type=\"button\"\n className={cn(\n \"px-2 py-1.5 text-xs rounded-md border border-border hover:bg-accent/10 transition-all\",\n animate && \"hover:scale-105 active:scale-95\"\n )}\n onClick={() => handleCustomPreset(preset.time)}\n aria-label={`Set time to ${preset.label}`}\n >\n {preset.label}\n </button>\n ))}\n </div>\n )}\n\n {/* Time Selector */}\n <div className=\"flex gap-3\">\n {/* Hours */}\n <div className=\"flex-1 min-w-[70px]\">\n <div className=\"text-xs font-semibold text-muted-foreground mb-2 text-center\">Hour</div>\n <div\n ref={hourScrollRef}\n className=\"max-h-48 overflow-y-auto pr-1 space-y-1 scrollbar-thin scroll-smooth\"\n role=\"listbox\"\n aria-label=\"Select hour\"\n tabIndex={focusedColumn === \"hour\" ? 0 : -1}\n onKeyDown={(e) => handleKeyDown(e, \"hour\")}\n onFocus={() => setFocusedColumn(\"hour\")}\n >\n {hours.map((h) => {\n const isSelected = (format === \"24\" && parts.h === h) || (format === \"12\" && (parts.h % 12 || 12) === (h % 12 || 12));\n return (\n <button\n key={h}\n type=\"button\"\n role=\"option\"\n aria-selected={isSelected}\n className={cn(\n \"w-full text-center px-3 py-2 rounded-md transition-all text-sm font-medium\",\n \"hover:bg-accent hover:scale-105 active:scale-95 focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1\",\n isSelected && \"bg-primary text-primary-foreground shadow-md\",\n !isSelected && \"text-foreground/80\",\n animate && \"transition-transform duration-150\"\n )}\n onClick={() => {\n const nextH = format === \"24\" ? h : ((parts.p === \"PM\" ? (h % 12) + 12 : (h % 12))) % 24;\n const next = { ...parts, h: format === \"24\" ? h : (nextH === 0 && parts.p === \"AM\" ? 0 : nextH || (parts.p === \"PM\" ? 12 : 0)) };\n setParts(next);\n emit(next);\n }}\n >\n {pad(h)}\n </button>\n );\n })}\n </div>\n </div>\n\n {/* Visual separator */}\n <div className=\"w-px bg-border/50 self-stretch my-8\" />\n\n {/* Minutes */}\n <div className=\"flex-1 min-w-[70px]\">\n <div className=\"text-xs font-semibold text-muted-foreground mb-2 text-center\">Min</div>\n <div\n ref={minuteScrollRef}\n className=\"max-h-48 overflow-y-auto pr-1 space-y-1 scrollbar-thin scroll-smooth\"\n role=\"listbox\"\n aria-label=\"Select minute\"\n tabIndex={focusedColumn === \"minute\" ? 0 : -1}\n onKeyDown={(e) => handleKeyDown(e, \"minute\")}\n onFocus={() => setFocusedColumn(\"minute\")}\n >\n {minutes.map((m) => {\n const isSelected = parts.m === m;\n return (\n <button\n key={m}\n type=\"button\"\n role=\"option\"\n aria-selected={isSelected}\n className={cn(\n \"w-full text-center px-3 py-2 rounded-md transition-all text-sm font-medium\",\n \"hover:bg-accent hover:scale-105 active:scale-95 focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1\",\n isSelected && \"bg-primary text-primary-foreground shadow-md\",\n !isSelected && \"text-foreground/80\",\n animate && \"transition-transform duration-150\"\n )}\n onClick={() => {\n const next = { ...parts, m };\n setParts(next);\n emit(next);\n }}\n >\n {pad(m)}\n </button>\n );\n })}\n </div>\n </div>\n\n {/* Visual separator */}\n <div className=\"w-px bg-border/50 self-stretch my-8\" />\n\n {/* Seconds */}\n {includeSeconds && (\n <>\n <div className=\"flex-1 min-w-[70px]\">\n <div className=\"text-xs font-semibold text-muted-foreground mb-2 text-center\">Sec</div>\n <div\n ref={secondScrollRef}\n className=\"max-h-48 overflow-y-auto pr-1 space-y-1 scrollbar-thin scroll-smooth\"\n role=\"listbox\"\n aria-label=\"Select second\"\n tabIndex={focusedColumn === \"second\" ? 0 : -1}\n onKeyDown={(e) => handleKeyDown(e, \"second\")}\n onFocus={() => setFocusedColumn(\"second\")}\n >\n {seconds.map((s) => {\n const isSelected = parts.s === s;\n return (\n <button\n key={s}\n type=\"button\"\n role=\"option\"\n aria-selected={isSelected}\n className={cn(\n \"w-full text-center px-3 py-2 rounded-md transition-all text-sm font-medium\",\n \"hover:bg-accent hover:scale-105 active:scale-95 focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1\",\n isSelected && \"bg-primary text-primary-foreground shadow-md\",\n !isSelected && \"text-foreground/80\",\n animate && \"transition-transform duration-150\"\n )}\n onClick={() => {\n const next = { ...parts, s };\n setParts(next);\n emit(next);\n }}\n >\n {pad(s)}\n </button>\n );\n })}\n </div>\n </div>\n {/* Visual separator */}\n <div className=\"w-px bg-border/50 self-stretch my-8\" />\n </>\n )}\n\n {/* AM/PM */}\n {format === \"12\" && (\n <div className=\"w-20\">\n <div className=\"text-xs font-semibold text-muted-foreground mb-2 text-center\">Period</div>\n <div\n className=\"flex flex-col gap-2\"\n role=\"radiogroup\"\n aria-label=\"Select AM or PM\"\n tabIndex={focusedColumn === \"period\" ? 0 : -1}\n onKeyDown={(e) => handleKeyDown(e, \"period\")}\n onFocus={() => setFocusedColumn(\"period\")}\n >\n {[\"AM\", \"PM\"].map((p) => {\n const isSelected = parts.p === p;\n return (\n <button\n key={p}\n type=\"button\"\n role=\"radio\"\n aria-checked={isSelected}\n className={cn(\n \"px-4 py-3 rounded-md transition-all text-sm font-semibold\",\n \"hover:bg-accent hover:scale-105 active:scale-95 focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1\",\n isSelected && \"bg-primary text-primary-foreground shadow-md\",\n !isSelected && \"text-foreground/80 border border-border\",\n animate && \"transition-transform duration-150\"\n )}\n onClick={() => {\n const pVal = p as \"AM\" | \"PM\";\n let hour = parts.h;\n if (pVal === \"AM\" && hour >= 12) hour -= 12;\n if (pVal === \"PM\" && hour < 12) hour += 12;\n const next = { ...parts, p: pVal, h: hour };\n setParts(next);\n emit(next);\n }}\n >\n {p}\n </button>\n );\n })}\n </div>\n </div>\n )}\n </div>\n\n {/* Action Buttons */}\n {(showNow || clearable) && (\n <div className=\"flex items-center justify-between gap-2 pt-3 border-t border-border\">\n {showNow && (\n <button\n type=\"button\"\n className={cn(\n \"px-3 py-2 text-xs rounded-md border border-border hover:bg-accent/10 transition-all flex items-center gap-2 font-medium\",\n animate && \"hover:scale-105 active:scale-95\"\n )}\n onClick={() => {\n setNow();\n if (variant === \"compact\") handleOpenChange(false);\n }}\n aria-label=\"Set current time\"\n >\n <Clock className=\"w-3.5 h-3.5\" />\n Now\n </button>\n )}\n <div className=\"flex-1\" />\n {clearable && (\n <button\n type=\"button\"\n className={cn(\n \"px-3 py-2 text-xs rounded-md border border-border hover:bg-destructive/10 hover:text-destructive transition-all flex items-center gap-2 font-medium\",\n animate && \"hover:scale-105 active:scale-95\"\n )}\n onClick={() => {\n setParts(initial);\n emit(undefined);\n handleOpenChange(false);\n }}\n aria-label=\"Clear selected time\"\n >\n <X className=\"w-3.5 h-3.5\" />\n Clear\n </button>\n )}\n </div>\n )}\n </div>\n );\n\n // Inline variant renders content directly without popover\n if (variant === \"inline\") {\n return (\n <div className=\"w-full\" {...rest}>\n {label && (\n <div className=\"flex items-center justify-between mb-2\">\n <label className={cn(sz.label, \"font-medium\", disabled ? \"text-muted-foreground\" : \"text-foreground\")}>\n {label}\n {required && <span className=\"text-destructive ml-1\">*</span>}\n </label>\n </div>\n )}\n <div className={cn(\"p-3 rounded-lg border border-border bg-card shadow-sm\", className)}>{timePickerContent}</div>\n </div>\n );\n }\n\n return (\n <div className=\"w-full\" {...rest}>\n {label && (\n <div className=\"flex items-center justify-between mb-1.5\">\n <label\n className={cn(sz.label, \"font-medium\", disabled ? \"text-muted-foreground\" : \"text-foreground\", \"cursor-pointer\")}\n onClick={() => !disabled && handleOpenChange(true)}\n >\n {label}\n {required && <span className=\"text-destructive ml-1\">*</span>}\n </label>\n </div>\n )}\n\n <Popover\n trigger={trigger!}\n open={open}\n onOpenChange={handleOpenChange}\n placement=\"bottom-start\"\n matchTriggerWidth={variant === \"compact\"}\n contentWidth={contentWidth}\n contentClassName={cn(\n \"p-4 rounded-lg border bg-popover shadow-xl backdrop-blur-md\",\n error && \"border-destructive\",\n success && \"border-green-500\",\n !error && !success && \"border-border\",\n animate && \"animate-in fade-in-0 zoom-in-95 duration-200\"\n )}\n >\n {timePickerContent}\n </Popover>\n\n {/* Validation and Helper Text */}\n {(error || success || helperText) && (\n <div className={cn(\"mt-1.5 flex items-start gap-1.5\", sz.label)}>\n {error && (\n <div className=\"flex items-center gap-1.5 text-destructive\">\n <X className=\"w-3.5 h-3.5 shrink-0\" />\n <span>{error}</span>\n </div>\n )}\n {success && !error && (\n <div className=\"flex items-center gap-1.5 text-green-600\">\n <Check className=\"w-3.5 h-3.5 shrink-0\" />\n <span>Valid time selected</span>\n </div>\n )}\n {helperText && !error && !success && <span className=\"text-muted-foreground\">{helperText}</span>}\n </div>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"@/lib/utils/cn\";\nimport { ChevronLeft, ChevronRight, Calendar as CalendarIcon } from \"lucide-react\";\nimport Button from \"./Button\";\n\ntype SelectMode = \"single\" | \"multiple\" | \"range\";\ntype Variant = \"default\" | \"bordered\" | \"card\" | \"minimal\";\ntype DisplayMode = \"month\" | \"week\" | \"year\";\n\nexport interface CalendarEvent {\n date: Date | string;\n title?: string;\n color?: string; // dot color\n badge?: string; // badge text\n}\n\nexport interface CalendarProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'defaultValue' | 'value' | 'onSelect'> {\n month?: Date; // visible month\n defaultMonth?: Date;\n onMonthChange?: (next: Date) => void;\n value?: Date | Date[] | { start?: Date; end?: Date };\n defaultValue?: Date | Date[] | { start?: Date; end?: Date };\n onSelect?: (value: Date | Date[] | { start?: Date; end?: Date }) => void;\n selectMode?: SelectMode;\n weekStartsOn?: 0 | 1 | 2 | 3 | 4 | 5 | 6; // 0=Sun\n showWeekdays?: boolean;\n showHeader?: boolean;\n size?: \"sm\" | \"md\" | \"lg\" | \"xl\";\n variant?: Variant;\n events?: CalendarEvent[];\n renderDay?: (args: { date: Date; isCurrentMonth: boolean; isToday: boolean; isSelected: boolean; events: CalendarEvent[] }) => React.ReactNode;\n labels?: { weekdays?: string[]; month?: (date: Date) => string; prev?: string; next?: string; today?: string; clear?: string };\n /** Display mode: month grid, single week, or year */\n display?: DisplayMode;\n /** Number of months to render side-by-side (month mode only) */\n months?: number;\n /** Show \"Today\" button */\n showToday?: boolean;\n /** Show \"Clear\" button */\n showClear?: boolean;\n /** Minimum selectable date */\n minDate?: Date;\n /** Maximum selectable date */\n maxDate?: Date;\n /** Disabled dates */\n disabledDates?: Date[] | ((date: Date) => boolean);\n /** Dense mode with less padding */\n dense?: boolean;\n /** Animate transitions */\n animate?: boolean;\n /** Show event badges */\n showEventBadges?: boolean;\n /** Highlight weekends */\n highlightWeekends?: boolean;\n}\n\nfunction startOfMonth(d: Date) { return new Date(d.getFullYear(), d.getMonth(), 1); }\nfunction endOfMonth(d: Date) { return new Date(d.getFullYear(), d.getMonth() + 1, 0); }\nfunction addMonths(d: Date, n: number) { const nd = new Date(d); nd.setMonth(d.getMonth() + n); return nd; }\nfunction isSameDay(a: Date, b: Date) { return a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth() && a.getDate() === b.getDate(); }\nfunction toDate(x: Date | string) { return x instanceof Date ? x : new Date(x); }\nfunction addDays(d: Date, n: number) { const nd = new Date(d); nd.setDate(d.getDate() + n); return nd; }\nfunction startOfWeek(d: Date, weekStartsOn: number) {\n const day = d.getDay();\n const diff = (day - weekStartsOn + 7) % 7;\n const s = new Date(d);\n s.setDate(d.getDate() - diff);\n return new Date(s.getFullYear(), s.getMonth(), s.getDate());\n}\n\nfunction getMonthGrid(view: Date, weekStartsOn: number) {\n const start = startOfMonth(view);\n const end = endOfMonth(view);\n const startDay = (start.getDay() - weekStartsOn + 7) % 7; // 0..6 offset\n const days: Date[] = [];\n // Fill leading days from previous month\n for (let i = 0; i < startDay; i++) {\n const d = new Date(start);\n d.setDate(d.getDate() - (startDay - i));\n days.push(d);\n }\n // Current month\n for (let d = 1; d <= end.getDate(); d++) {\n days.push(new Date(view.getFullYear(), view.getMonth(), d));\n }\n // Trailing days to complete weeks (6 rows max)\n while (days.length % 7 !== 0) {\n const last = days[days.length - 1];\n const next = new Date(last);\n next.setDate(last.getDate() + 1);\n days.push(next);\n }\n return days;\n}\n\nexport default function Calendar({\n month,\n defaultMonth,\n onMonthChange,\n value,\n defaultValue,\n onSelect,\n selectMode = \"single\",\n weekStartsOn = 0,\n showWeekdays = true,\n showHeader = true,\n size = \"md\",\n variant = \"default\",\n events = [],\n renderDay,\n labels,\n className,\n display = \"month\",\n months = 1,\n showToday = false,\n showClear = false,\n minDate,\n maxDate,\n disabledDates,\n dense = false,\n animate = false,\n showEventBadges = false,\n highlightWeekends = false,\n ...rest\n}: CalendarProps) {\n const isControlledMonth = month != null;\n const [view, setView] = React.useState<Date>(() => month ?? defaultMonth ?? new Date());\n React.useEffect(() => { if (isControlledMonth && month) setView(month); }, [isControlledMonth, month]);\n\n const isControlledValue = value !== undefined;\n const [internal, setInternal] = React.useState<CalendarProps[\"value\"] | undefined>(defaultValue);\n const selected = isControlledValue ? value : internal;\n\n const goByView = (delta: number) => {\n const next = display === \"week\" ? addDays(view, delta * 7) : addMonths(view, delta);\n if (!isControlledMonth) setView(next);\n if (display === \"month\") onMonthChange?.(next);\n };\n\n const weekNames = labels?.weekdays ?? [\"Su\",\"Mo\",\"Tu\",\"We\",\"Th\",\"Fr\",\"Sa\"];\n const rotate = (arr: string[], n: number) => arr.slice(n).concat(arr.slice(0, n));\n const weekdays = rotate(weekNames, weekStartsOn);\n\n const days = getMonthGrid(view, weekStartsOn);\n const today = new Date();\n\n const byDay = React.useMemo(() => {\n const map = new Map<string, CalendarEvent[]>();\n for (const e of events) {\n const d = toDate(e.date);\n const k = `${d.getFullYear()}-${d.getMonth()}-${d.getDate()}`;\n if (!map.has(k)) map.set(k, []);\n map.get(k)!.push(e);\n }\n return map;\n }, [events]);\n\n const isSelected = (d: Date): boolean => {\n if (!selected) return false;\n if (selectMode === \"single\" && selected instanceof Date) return isSameDay(selected, d);\n if (selectMode === \"multiple\" && Array.isArray(selected)) return selected.some((x) => isSameDay(x as Date, d));\n if (selectMode === \"range\" && !Array.isArray(selected) && typeof selected === \"object\") {\n const s = (selected as any).start as Date | undefined;\n const e = (selected as any).end as Date | undefined;\n if (s && e) return d >= new Date(s.getFullYear(), s.getMonth(), s.getDate()) && d <= new Date(e.getFullYear(), e.getMonth(), e.getDate());\n if (s) return isSameDay(s, d);\n if (e) return isSameDay(e, d);\n }\n return false;\n };\n\n const commit = (next: CalendarProps[\"value\"]) => {\n if (!isControlledValue) setInternal(next);\n onSelect?.(next!);\n };\n\n const handleClickDay = (d: Date) => {\n if (selectMode === \"single\") {\n commit(d);\n return;\n }\n if (selectMode === \"multiple\") {\n const arr = Array.isArray(selected) ? (selected as Date[]) : [];\n const exists = arr.some((x) => isSameDay(x, d));\n const next = exists ? arr.filter((x) => !isSameDay(x, d)) : [...arr, d];\n commit(next);\n return;\n }\n if (selectMode === \"range\") {\n const cur = (!Array.isArray(selected) && typeof selected === \"object\") ? (selected as any) : {};\n const s = cur.start as Date | undefined;\n const e = cur.end as Date | undefined;\n if (!s || (s && e)) {\n commit({ start: d, end: undefined });\n } else if (s && !e) {\n if (d < s) commit({ start: d, end: s }); else commit({ start: s, end: d });\n }\n }\n };\n\n const isDateDisabled = React.useCallback((d: Date): boolean => {\n if (minDate && d < new Date(minDate.getFullYear(), minDate.getMonth(), minDate.getDate())) return true;\n if (maxDate && d > new Date(maxDate.getFullYear(), maxDate.getMonth(), maxDate.getDate())) return true;\n if (Array.isArray(disabledDates)) {\n return disabledDates.some((dd) => isSameDay(dd, d));\n }\n if (typeof disabledDates === \"function\") {\n return disabledDates(d);\n }\n return false;\n }, [minDate, maxDate, disabledDates]);\n\n const SIZE_STYLES = {\n sm: { day: \"w-8 h-8 text-[12px]\", grid: dense ? \"gap-0.5\" : \"gap-1\", head: \"text-[11px]\", header: \"text-sm\" },\n md: { day: \"w-9 h-9 text-sm\", grid: dense ? \"gap-1\" : \"gap-1.5\", head: \"text-xs\", header: \"text-sm\" },\n lg: { day: \"w-11 h-11 text-base\", grid: dense ? \"gap-1.5\" : \"gap-2\", head: \"text-sm\", header: \"text-base\" },\n xl: { day: \"w-14 h-14 text-lg\", grid: dense ? \"gap-2\" : \"gap-2.5\", head: \"text-base\", header: \"text-lg\" },\n };\n const sz = SIZE_STYLES[size];\n\n const VARIANT_STYLES = {\n default: \"border border-border rounded-lg bg-card\",\n bordered: \"border-2 border-border rounded-xl bg-card shadow-sm\",\n card: \"border border-border rounded-xl bg-card shadow-lg\",\n minimal: \"bg-transparent\",\n };\n\n const weekDays = React.useMemo(() => {\n const s = startOfWeek(view, weekStartsOn);\n return Array.from({ length: 7 }, (_, i) => addDays(s, i));\n }, [view, weekStartsOn]);\n\n const renderMonth = (monthDate: Date) => {\n const monthDays = getMonthGrid(monthDate, weekStartsOn);\n const monthLabel = labels?.month ? labels.month(monthDate) : monthDate.toLocaleDateString(\"en-US\", { month: \"long\", year: \"numeric\" });\n return (\n <div>\n {months > 1 && (\n <div className=\"flex items-center justify-center mb-2 text-sm font-semibold\">{monthLabel}</div>\n )}\n {showWeekdays && (\n <div className={cn(\"grid grid-cols-7\", sz.grid, \"mb-1 text-center text-muted-foreground font-medium\")}> \n {weekdays.map((w) => (\n <div key={`${monthLabel}-${w}`} className={cn(sz.head)}>{w}</div>\n ))}\n </div>\n )}\n <div className={cn(\"grid grid-cols-7\", sz.grid)}>\n {monthDays.map((d, idx) => {\n const inMonth = d.getMonth() === monthDate.getMonth();\n const isToday = isSameDay(d, today);\n const selectedDay = isSelected(d);\n const k = `${d.getFullYear()}-${d.getMonth()}-${d.getDate()}`;\n const dayEvents = byDay.get(k) || [];\n const disabled = isDateDisabled(d);\n return (\n <button\n key={`${monthLabel}-${idx}`}\n onClick={() => handleClickDay(d)}\n disabled={disabled}\n className={cn(\n \"rounded-md flex items-center justify-center relative\",\n sz.day,\n !inMonth && \"text-muted-foreground/60\",\n disabled && \"opacity-40 cursor-not-allowed\",\n isToday && !selectedDay && \"ring-1 ring-primary/50\",\n selectedDay && \"bg-primary text-primary-foreground hover:bg-primary/90\",\n !selectedDay && \"hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground\"\n )}\n title={d.toDateString()}\n >\n {d.getDate()}\n {dayEvents.length > 0 && (\n <span className=\"absolute -bottom-1 inline-flex gap-0.5\">\n {dayEvents.slice(0,3).map((e, i) => (\n <span key={i} className=\"h-1.5 w-1.5 rounded-full\" style={{ backgroundColor: e.color || \"hsl(var(--primary))\" }} />\n ))}\n </span>\n )}\n </button>\n );\n })}\n </div>\n </div>\n );\n };\n\n // Navigation bounds\n const minBound = React.useMemo(() => (minDate ? new Date(minDate.getFullYear(), minDate.getMonth(), minDate.getDate()) : undefined), [minDate]);\n const maxBound = React.useMemo(() => (maxDate ? new Date(maxDate.getFullYear(), maxDate.getMonth(), maxDate.getDate()) : undefined), [maxDate]);\n const prevDisabled = React.useMemo(() => {\n if (!minBound) return false;\n if (display === 'week') {\n const start = startOfWeek(view, weekStartsOn);\n const prevEnd = addDays(start, -1);\n return prevEnd < minBound;\n }\n const prevEnd = endOfMonth(addMonths(view, -1));\n return prevEnd < minBound;\n }, [display, view, weekStartsOn, minBound]);\n const nextDisabled = React.useMemo(() => {\n if (!maxBound) return false;\n if (display === 'week') {\n const start = startOfWeek(view, weekStartsOn);\n const nextStart = addDays(start, 7);\n return nextStart > maxBound;\n }\n const nextStart = startOfMonth(addMonths(view, 1));\n return nextStart > maxBound;\n }, [display, view, weekStartsOn, maxBound]);\n\n return (\n <div className={cn(\"w-full\", className)} {...rest}>\n {showHeader && (\n <div className=\"flex items-center justify-between mb-2\">\n <button onClick={() => goByView(-1)} disabled={prevDisabled} className={cn(\"p-1 rounded-md hover:bg-accent\", prevDisabled && \"opacity-40 cursor-not-allowed hover:bg-transparent\")} aria-label={labels?.prev || (display === 'week' ? \"Previous week\" : \"Previous month\")}>\n <ChevronLeft className=\"h-4 w-4\" />\n </button>\n <div className=\"text-sm font-semibold\">\n {display === 'week'\n ? `${(labels?.month ? labels.month(weekDays[0]) : weekDays[0].toLocaleDateString(\"en-US\", { month: \"short\" }))} ${weekDays[0].getDate()} – ${(labels?.month ? labels.month(weekDays[6]) : weekDays[6].toLocaleDateString(\"en-US\", { month: \"short\" }))} ${weekDays[6].getDate()}`\n : (labels?.month ? labels.month(view) : view.toLocaleDateString(\"en-US\", { month: \"long\", year: \"numeric\" }))}\n </div>\n <button onClick={() => goByView(1)} disabled={nextDisabled} className={cn(\"p-1 rounded-md hover:bg-accent\", nextDisabled && \"opacity-40 cursor-not-allowed hover:bg-transparent\")} aria-label={labels?.next || (display === 'week' ? \"Next week\" : \"Next month\")}>\n <ChevronRight className=\"h-4 w-4\" />\n </button>\n </div>\n )}\n\n {display === 'week' ? (\n <>\n {showWeekdays && (\n <div className={cn(\"grid grid-cols-7\", sz.grid, \"mb-1 text-center text-muted-foreground font-medium\")}>\n {weekdays.map((w) => (\n <div key={`w-${w}`} className={cn(sz.head)}>{w}</div>\n ))}\n </div>\n )}\n <div className={cn(\"grid grid-cols-7\", sz.grid)}>\n {weekDays.map((d, idx) => {\n const inMonth = true; // week mode emphasizes the 7-day window, no dimming\n const isToday = isSameDay(d, today);\n const selectedDay = isSelected(d);\n const k = `${d.getFullYear()}-${d.getMonth()}-${d.getDate()}`;\n const dayEvents = byDay.get(k) || [];\n const disabled = isDateDisabled(d);\n return (\n <button\n key={`wd-${idx}`}\n onClick={() => handleClickDay(d)}\n disabled={disabled}\n className={cn(\n \"rounded-md flex items-center justify-center relative\",\n sz.day,\n disabled && \"opacity-40 cursor-not-allowed\",\n isToday && !selectedDay && \"ring-1 ring-primary/50\",\n selectedDay && \"bg-primary text-primary-foreground hover:bg-primary/90\",\n !selectedDay && \"hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground\"\n )}\n title={d.toDateString()}\n >\n {d.getDate()}\n {dayEvents.length > 0 && (\n <span className=\"absolute -bottom-1 inline-flex gap-0.5\">\n {dayEvents.slice(0,3).map((e, i) => (\n <span key={i} className=\"h-1.5 w-1.5 rounded-full\" style={{ backgroundColor: e.color || \"hsl(var(--primary))\" }} />\n ))}\n </span>\n )}\n </button>\n );\n })}\n </div>\n </>\n ) : (\n <div className={cn(months > 1 ? \"grid md:grid-cols-2 lg:grid-cols-3 gap-4\" : \"\")}>\n {Array.from({ length: Math.max(1, months) }, (_, i) => (\n <React.Fragment key={`cal-month-${view.getFullYear()}-${view.getMonth()}-${i}`}>\n {renderMonth(addMonths(view, i))}\n </React.Fragment>\n ))}\n </div>\n )}\n </div>\n );\n}\n\n// types exported above\n","\"use client\";\n\nimport * as React from \"react\";\nimport { useId } from \"react\";\nimport { createPortal } from \"react-dom\";\n// Removed floating-ui dependencies\nimport { cn } from \"@/lib/utils/cn\";\nimport { ChevronDown, Search, Check, SearchX, Loader2 } from \"lucide-react\";\nimport { useShadCNAnimations } from \"@/lib/utils/shadcn-animations\";\n\nexport interface MultiComboboxOption {\n value: string;\n label: string;\n}\n\nexport interface MultiComboboxProps {\n id?: string;\n options: Array<string | MultiComboboxOption>;\n value: string[];\n onChange: (value: string[]) => void;\n placeholder?: string;\n maxSelected?: number;\n disabledOptions?: string[];\n showTags?: boolean;\n showClear?: boolean;\n className?: string;\n disabled?: boolean;\n size?: \"sm\" | \"md\" | \"lg\";\n label?: string;\n title?: string;\n required?: boolean;\n displayFormat?: (option: MultiComboboxOption) => string;\n loading?: boolean;\n loadingText?: string;\n emptyText?: string;\n}\n\nexport const MultiCombobox: React.FC<MultiComboboxProps> = ({\n id,\n options,\n value,\n onChange,\n placeholder = \"Search...\",\n maxSelected,\n disabledOptions = [],\n showTags = true,\n showClear = true,\n className,\n disabled = false,\n size = \"md\",\n label,\n title,\n required,\n displayFormat = (option) => option.label,\n loading = false,\n loadingText = \"Loading...\",\n emptyText = \"No results found\",\n}) => {\n const [query, setQuery] = React.useState(\"\");\n const [open, setOpen] = React.useState(false);\n const [activeIndex, setActiveIndex] = React.useState<number | null>(null);\n const inputRef = React.useRef<HTMLInputElement>(null);\n const listRef = React.useRef<Array<HTMLElement | null>>([]);\n\n // Manual positioning\n const [dropdownPosition, setDropdownPosition] = React.useState<{ top: number; left: number; width: number } | null>(null);\n const triggerRef = React.useRef<HTMLButtonElement>(null);\n const dropdownRef = React.useRef<HTMLDivElement | null>(null);\n\n // Inject ShadCN animations\n useShadCNAnimations();\n\n // Calculate positioning synchronously on open to avoid flicker\n const calculatePosition = React.useCallback(() => {\n if (!triggerRef.current) return null;\n const rect = triggerRef.current.getBoundingClientRect();\n const scrollTop = window.pageYOffset || document.documentElement.scrollTop;\n const scrollLeft = window.pageXOffset || document.documentElement.scrollLeft;\n return {\n top: rect.bottom + scrollTop + 4,\n left: rect.left + scrollLeft,\n width: rect.width,\n };\n }, []);\n\n // Reposition on resize/scroll while open\n React.useEffect(() => {\n if (!open) return;\n const handler = () => {\n const pos = calculatePosition();\n if (pos) setDropdownPosition(pos);\n };\n window.addEventListener(\"resize\", handler);\n window.addEventListener(\"scroll\", handler, true);\n return () => {\n window.removeEventListener(\"resize\", handler);\n window.removeEventListener(\"scroll\", handler, true);\n };\n }, [open, calculatePosition]);\n\n // Handle clicks outside\n React.useEffect(() => {\n if (!open) return;\n\n const handleClickOutside = (event: MouseEvent) => {\n const target = event.target as Node;\n const triggerEl = triggerRef.current;\n const dropdownEl = dropdownRef.current;\n\n if (triggerEl && !triggerEl.contains(target) && dropdownEl && !dropdownEl.contains(target)) {\n setOpen(false);\n }\n };\n\n const handleEscape = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n setOpen(false);\n }\n };\n\n document.addEventListener(\"mousedown\", handleClickOutside);\n document.addEventListener(\"keydown\", handleEscape);\n\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside);\n document.removeEventListener(\"keydown\", handleEscape);\n };\n }, [open]);\n\n // Normalize options to objects { value, label } to support both string[] and object[] APIs\n const normalizedOptions = React.useMemo<MultiComboboxOption[]>(\n () => options.map((o) => (typeof o === \"string\" ? { value: o, label: o } : { value: o.value, label: o.label })),\n [options]\n );\n\n // Enable search only if options.length > 10\n const enableSearch = normalizedOptions.length > 10;\n\n const filtered = React.useMemo(\n () => (enableSearch ? normalizedOptions.filter((opt) => opt.label.toLowerCase().includes(query.toLowerCase())) : normalizedOptions),\n [normalizedOptions, query, enableSearch]\n );\n\n const toggleSelect = (optionValue: string) => {\n if (disabledOptions.includes(optionValue)) return;\n if (value.includes(optionValue)) {\n onChange(value.filter((v) => v !== optionValue));\n } else {\n if (!maxSelected || value.length < maxSelected) {\n onChange([...value, optionValue]);\n }\n }\n };\n\n const handleRemove = (val: string) => {\n onChange(value.filter((v) => v !== val));\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (!open) setOpen(true);\n\n if (e.key === \"Enter\") {\n e.preventDefault();\n if (activeIndex !== null && filtered[activeIndex]) {\n toggleSelect(filtered[activeIndex].value);\n }\n }\n };\n\n const handleClearAll = () => {\n onChange([]);\n };\n\n // Auto-focus input when dropdown opens (only if search is enabled)\n React.useEffect(() => {\n if (open && enableSearch) {\n // Focus input after dropdown is positioned\n setTimeout(() => {\n inputRef.current?.focus();\n }, 100);\n }\n }, [open, enableSearch]);\n\n // Size styles to align with Input defaults\n const sizeStyles = {\n sm: {\n trigger: \"h-8 px-3 py-1.5 text-sm md:h-7 md:text-xs\",\n icon: \"h-4 w-4\",\n search: \"px-8 py-1.5 text-xs\",\n item: \"text-xs px-3 py-1.5\",\n tag: \"px-2 py-0.5 text-[10px]\",\n },\n md: {\n trigger: \"h-10 px-4 py-2 text-sm\",\n icon: \"h-4 w-4\",\n search: \"px-8 py-2 text-sm\",\n item: \"text-sm px-3 py-2\",\n tag: \"px-2 py-1 text-xs\",\n },\n lg: {\n trigger: \"h-12 px-5 py-3 text-base\",\n icon: \"h-5 w-5\",\n search: \"px-8 py-3 text-base\",\n item: \"text-base px-3 py-3\",\n tag: \"px-2.5 py-1 text-sm\",\n },\n } as const;\n\n const autoId = useId();\n const resolvedId = id ? String(id) : `multicombobox-${autoId}`;\n const labelId = label ? `${resolvedId}-label` : undefined;\n const labelSize = size === \"sm\" ? \"text-xs\" : size === \"lg\" ? \"text-base\" : \"text-sm\";\n\n return (\n <div className={cn(\"w-full space-y-2 group\", className)}>\n {/* Title */}\n {title && (\n <div className=\"flex items-center justify-between\">\n <label\n className={cn(\n size === \"sm\" ? \"text-xs\" : size === \"lg\" ? \"text-base\" : \"text-sm\",\n \"font-medium transition-colors duration-200\",\n disabled ? \"text-muted-foreground\" : \"text-foreground group-focus-within:text-primary\"\n )}\n >\n {title}\n {required && <span className=\"text-destructive ml-1\">*</span>}\n </label>\n </div>\n )}\n\n {/* Label */}\n {label && (\n <label\n id={labelId}\n onClick={() => triggerRef.current?.focus()}\n className={cn(\n labelSize,\n \"font-medium transition-colors duration-200\",\n disabled ? \"text-muted-foreground\" : \"text-foreground group-focus-within:text-primary\"\n )}\n >\n {label}\n {required && <span className=\"text-destructive ml-1\">*</span>}\n </label>\n )}\n\n <div className=\"relative w-full\" />\n\n <button\n ref={triggerRef}\n type=\"button\"\n disabled={disabled}\n id={resolvedId}\n aria-labelledby={labelId}\n onClick={() => {\n const next = !open;\n if (next) {\n const pos = calculatePosition();\n if (pos) setDropdownPosition(pos);\n }\n setOpen(next);\n }}\n className={cn(\n \"flex w-full items-center gap-2 rounded-lg border border-input bg-background shadow-sm min-h-10\",\n \"px-3 py-2\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background\",\n \"disabled:cursor-not-allowed disabled:opacity-50\"\n )}\n >\n <div className=\"flex items-center gap-1 flex-wrap min-h-6 flex-1\">\n {value.length > 0 ? (\n showTags ? (\n value.map((itemValue) => {\n const option = normalizedOptions.find((o) => o.value === itemValue);\n return (\n <span key={itemValue} className=\"inline-flex items-center gap-1 bg-accent text-accent-foreground rounded px-2 py-1 text-xs\">\n <span className=\"truncate max-w-[120px]\">{option ? displayFormat(option) : itemValue}</span>\n <span\n role=\"button\"\n tabIndex={0}\n aria-label={`Remove ${option ? displayFormat(option) : itemValue}`}\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n handleRemove(itemValue);\n }}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n e.stopPropagation();\n handleRemove(itemValue);\n }\n }}\n className=\"hover:text-destructive transition-colors cursor-pointer select-none\"\n >\n ×\n </span>\n </span>\n );\n })\n ) : (\n <span className=\"truncate text-sm\">{value.length} selected</span>\n )\n ) : (\n <span className=\"text-muted-foreground\">{placeholder || \"Select...\"}</span>\n )}\n </div>\n <ChevronDown\n className={cn(\"opacity-50 transition-all duration-200\", sizeStyles[size].icon, open && \"rotate-180 scale-110 text-primary opacity-100\")}\n />\n </button>\n\n {open && dropdownPosition && typeof window !== \"undefined\"\n ? createPortal(\n <div\n ref={dropdownRef}\n data-combobox-dropdown\n style={{\n position: \"absolute\",\n top: dropdownPosition?.top || 0,\n left: dropdownPosition?.left || 0,\n width: dropdownPosition?.width || 200,\n zIndex: 9999,\n transformOrigin: \"top center\",\n }}\n data-state={open ? \"open\" : \"closed\"}\n className=\"z-9999\"\n >\n <div\n className={cn(\"rounded-md border bg-popover text-popover-foreground shadow-md\", \"backdrop-blur-sm bg-popover/95 border-border/60\")}\n >\n {/* Clear all button in dropdown */}\n {showClear && value.length > 0 && (\n <div className=\"px-3 py-2 border-b border-border/60 flex justify-end\">\n <button\n type=\"button\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n handleClearAll();\n }}\n className=\"text-xs text-muted-foreground hover:underline cursor-pointer\"\n >\n Clear all\n </button>\n </div>\n )}\n\n {enableSearch && (\n <div className=\"relative border-b border-border/60\">\n <Search className={cn(\"absolute left-2 top-2.5 text-muted-foreground\", sizeStyles[size].icon)} />\n <input\n ref={inputRef}\n value={query}\n onChange={(e) => {\n setQuery(e.target.value);\n setActiveIndex(null);\n }}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n className={cn(\"w-full rounded-t-md bg-transparent focus:outline-none cursor-text\", sizeStyles[size].search)}\n />\n </div>\n )}\n\n <ul className={cn(\"max-h-60 overflow-y-auto p-1\", size === \"lg\" ? \"text-base\" : size === \"sm\" ? \"text-xs\" : \"text-sm\")}>\n {loading ? (\n <li className=\"px-3 py-8 text-center\">\n <div className=\"flex flex-col items-center gap-2 animate-in fade-in-0 zoom-in-95 duration-300\">\n <Loader2 className=\"h-6 w-6 animate-spin text-primary\" />\n <span className=\"text-muted-foreground\">{loadingText}</span>\n </div>\n </li>\n ) : filtered.length ? (\n filtered.map((item, index) => {\n const isSelected = value.includes(item.value);\n const isDisabled = disabledOptions.includes(item.value);\n\n return (\n <li\n key={item.value}\n ref={(node) => {\n listRef.current[index] = node;\n }}\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n toggleSelect(item.value);\n inputRef.current?.focus();\n }}\n style={{\n animationDelay: open ? `${Math.min(index * 20, 200)}ms` : \"0ms\",\n }}\n className={cn(\n \"dropdown-item flex cursor-pointer items-center justify-between rounded-sm transition-colors\",\n sizeStyles[size].item,\n \"hover:bg-accent hover:text-accent-foreground\",\n index === activeIndex && \"bg-accent text-accent-foreground\",\n isDisabled && \"opacity-50 cursor-not-allowed pointer-events-none\"\n )}\n >\n {item.label}\n {isSelected && <Check className={sizeStyles[size].icon} />}\n </li>\n );\n })\n ) : (\n <li\n className={cn(\n \"px-3 py-8 text-center text-muted-foreground\",\n size === \"lg\" ? \"text-base\" : size === \"sm\" ? \"text-xs\" : \"text-sm\"\n )}\n >\n <div className=\"flex flex-col items-center gap-2 animate-in fade-in-0 zoom-in-95 duration-300\">\n <SearchX className=\"h-8 w-8 opacity-40 text-muted-foreground\" />\n <span>{emptyText}</span>\n {query && (\n <button type=\"button\" onClick={() => setQuery(\"\")} className=\"text-xs text-primary hover:underline\">\n Clear search\n </button>\n )}\n </div>\n </li>\n )}\n </ul>\n </div>\n </div>,\n document.body\n )\n : null}\n </div>\n );\n};\n","\"use client\";\r\n\r\nimport * as React from \"react\";\r\nimport { cn } from \"@/lib/utils/cn\";\r\n\r\ninterface RadioGroupContextType {\r\n value?: string;\r\n onValueChange?: (value: string) => void;\r\n name?: string;\r\n disabled?: boolean;\r\n size?: \"sm\" | \"md\" | \"lg\";\r\n variant?: \"default\" | \"card\" | \"button\";\r\n}\r\n\r\nconst RadioGroupContext = React.createContext<RadioGroupContextType | undefined>(undefined);\r\n\r\nconst useRadioGroup = () => {\r\n const context = React.useContext(RadioGroupContext);\r\n if (!context) {\r\n throw new Error(\"RadioGroupItem must be used within a RadioGroup\");\r\n }\r\n return context;\r\n};\r\n\r\ninterface RadioGroupProps {\r\n value?: string;\r\n defaultValue?: string;\r\n onValueChange?: (value: string) => void;\r\n name?: string;\r\n disabled?: boolean;\r\n orientation?: \"horizontal\" | \"vertical\";\r\n size?: \"sm\" | \"md\" | \"lg\";\r\n variant?: \"default\" | \"card\" | \"button\";\r\n className?: string;\r\n children: React.ReactNode;\r\n required?: boolean;\r\n error?: boolean;\r\n errorMessage?: string;\r\n}\r\n\r\nexport const RadioGroup = React.forwardRef<HTMLDivElement, RadioGroupProps>(\r\n ({ \r\n value, \r\n defaultValue, \r\n onValueChange, \r\n name, \r\n disabled = false, \r\n orientation = \"vertical\",\r\n size = \"md\",\r\n variant = \"default\",\r\n className, \r\n children,\r\n required = false,\r\n error = false,\r\n errorMessage\r\n }, ref) => {\r\n const [internalValue, setInternalValue] = React.useState(defaultValue || \"\");\r\n const isControlled = value !== undefined;\r\n const currentValue = isControlled ? value : internalValue;\r\n\r\n const handleValueChange = (newValue: string) => {\r\n if (!disabled) {\r\n if (!isControlled) {\r\n setInternalValue(newValue);\r\n }\r\n onValueChange?.(newValue);\r\n }\r\n };\r\n\r\n // Generate unique name if not provided\r\n const uniqueId = React.useId();\r\n const radioName = name || `radio-group-${uniqueId}`;\r\n\r\n return (\r\n <RadioGroupContext.Provider\r\n value={{\r\n value: currentValue,\r\n onValueChange: handleValueChange,\r\n name: radioName,\r\n disabled,\r\n size,\r\n variant\r\n }}\r\n >\r\n <div className=\"space-y-2\">\r\n <div\r\n ref={ref}\r\n className={cn(\r\n \"grid gap-2\",\r\n orientation === \"horizontal\" ? \"grid-flow-col auto-cols-max\" : \"grid-cols-1\",\r\n error && \"ring-2 ring-destructive/20 rounded-md p-2\",\r\n className\r\n )}\r\n role=\"radiogroup\"\r\n aria-disabled={disabled}\r\n aria-required={required}\r\n aria-invalid={error}\r\n >\r\n {children}\r\n </div>\r\n {error && errorMessage && (\r\n <p className=\"text-sm text-destructive mt-1\">{errorMessage}</p>\r\n )}\r\n </div>\r\n </RadioGroupContext.Provider>\r\n );\r\n }\r\n);\r\n\r\nRadioGroup.displayName = \"RadioGroup\";\r\n\r\ninterface RadioGroupItemProps {\r\n value: string;\r\n id?: string;\r\n disabled?: boolean;\r\n className?: string;\r\n children?: React.ReactNode;\r\n label?: string;\r\n description?: string;\r\n icon?: React.ComponentType<{ className?: string }>;\r\n}\r\n\r\nconst sizeStyles = {\r\n sm: {\r\n radio: \"h-3 w-3\",\r\n dot: \"w-1.5 h-1.5\",\r\n text: \"text-xs\",\r\n padding: \"p-2\"\r\n },\r\n md: {\r\n radio: \"h-4 w-4\", \r\n dot: \"w-2 h-2\",\r\n text: \"text-sm\",\r\n padding: \"p-3\"\r\n },\r\n lg: {\r\n radio: \"h-5 w-5\",\r\n dot: \"w-2.5 h-2.5\", \r\n text: \"text-base\",\r\n padding: \"p-4\"\r\n }\r\n};\r\n\r\nexport const RadioGroupItem = React.forwardRef<HTMLButtonElement, RadioGroupItemProps>(\r\n ({ value, id, disabled, className, children, label, description, icon }, ref) => {\r\n const { \r\n value: selectedValue, \r\n onValueChange, \r\n name, \r\n disabled: groupDisabled,\r\n size = \"md\",\r\n variant = \"default\"\r\n } = useRadioGroup();\r\n \r\n const isDisabled = disabled || groupDisabled;\r\n const isSelected = selectedValue === value;\r\n const Icon = icon;\r\n\r\n const radioId = id || `radio-${value}`;\r\n\r\n if (variant === \"card\") {\r\n return (\r\n <div\r\n className={cn(\r\n \"relative rounded-lg border transition-all duration-200 cursor-pointer\",\r\n \"hover:bg-accent/50 focus-within:ring-2 focus-within:ring-ring focus-within:ring-offset-2\",\r\n isSelected && \"border-primary bg-primary/5 ring-1 ring-primary/20\",\r\n isDisabled && \"cursor-not-allowed opacity-50\",\r\n sizeStyles[size].padding,\r\n className\r\n )}\r\n >\r\n <div className=\"flex items-start gap-3\">\r\n <button\r\n ref={ref}\r\n type=\"button\"\r\n role=\"radio\"\r\n aria-checked={isSelected}\r\n data-state={isSelected ? \"checked\" : \"unchecked\"}\r\n value={value}\r\n id={radioId}\r\n disabled={isDisabled}\r\n className={cn(\r\n \"aspect-square rounded-full border border-primary text-primary ring-offset-background\",\r\n \"focus:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\",\r\n \"disabled:cursor-not-allowed disabled:opacity-50\",\r\n \"transition-all duration-200 mt-0.5\",\r\n sizeStyles[size].radio\r\n )}\r\n onClick={() => onValueChange?.(value)}\r\n >\r\n <span \r\n className={cn(\r\n \"flex items-center justify-center w-full h-full rounded-full transition-all duration-200\",\r\n isSelected && \"bg-primary\"\r\n )}\r\n >\r\n {isSelected && (\r\n <span className={cn(\"bg-primary-foreground rounded-full\", sizeStyles[size].dot)} />\r\n )}\r\n </span>\r\n </button>\r\n \r\n <div className=\"flex-1 min-w-0\">\r\n <div className=\"flex items-center gap-2\">\r\n {Icon && <Icon className=\"h-4 w-4 text-foreground\" />}\r\n <label \r\n htmlFor={radioId}\r\n className={cn(\r\n \"font-medium text-foreground cursor-pointer\",\r\n sizeStyles[size].text\r\n )}\r\n >\r\n {label || children}\r\n </label>\r\n </div>\r\n {description && (\r\n <p className=\"text-muted-foreground mt-1 text-xs\">\r\n {description}\r\n </p>\r\n )}\r\n </div>\r\n </div>\r\n \r\n <input\r\n type=\"radio\"\r\n name={name}\r\n value={value}\r\n checked={isSelected}\r\n onChange={() => {}} // Controlled by button click\r\n className=\"sr-only\"\r\n tabIndex={-1}\r\n />\r\n </div>\r\n );\r\n }\r\n\r\n if (variant === \"button\") {\r\n return (\r\n <button\r\n ref={ref}\r\n type=\"button\"\r\n role=\"radio\"\r\n aria-checked={isSelected}\r\n data-state={isSelected ? \"checked\" : \"unchecked\"}\r\n value={value}\r\n id={radioId}\r\n disabled={isDisabled}\r\n className={cn(\r\n \"inline-flex items-center justify-center gap-2 rounded-md border font-medium transition-all duration-200\",\r\n \"focus:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\",\r\n \"disabled:cursor-not-allowed disabled:opacity-50\",\r\n isSelected \r\n ? \"border-primary bg-primary text-primary-foreground shadow-sm\"\r\n : \"border-border bg-background hover:bg-accent hover:text-accent-foreground\",\r\n sizeStyles[size].padding,\r\n sizeStyles[size].text,\r\n className\r\n )}\r\n onClick={() => onValueChange?.(value)}\r\n >\r\n {Icon && <Icon className=\"h-4 w-4\" />}\r\n {label || children}\r\n <input\r\n type=\"radio\"\r\n name={name}\r\n value={value}\r\n checked={isSelected}\r\n onChange={() => {}} // Controlled by button click\r\n className=\"sr-only\"\r\n tabIndex={-1}\r\n />\r\n </button>\r\n );\r\n }\r\n\r\n // Default variant\r\n return (\r\n <div className={cn(\"flex items-center gap-2\", className)}>\r\n <button\r\n ref={ref}\r\n type=\"button\"\r\n role=\"radio\"\r\n aria-checked={isSelected}\r\n data-state={isSelected ? \"checked\" : \"unchecked\"}\r\n value={value}\r\n id={radioId}\r\n disabled={isDisabled}\r\n className={cn(\r\n \"aspect-square rounded-full border border-primary text-primary ring-offset-background\",\r\n \"focus:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\",\r\n \"disabled:cursor-not-allowed disabled:opacity-50\",\r\n \"transition-all duration-200 hover:border-primary/80\",\r\n sizeStyles[size].radio\r\n )}\r\n onClick={() => onValueChange?.(value)}\r\n >\r\n <span \r\n className={cn(\r\n \"flex items-center justify-center w-full h-full rounded-full transition-all duration-200\",\r\n isSelected && \"bg-primary\"\r\n )}\r\n >\r\n {isSelected && (\r\n <span className={cn(\"bg-primary-foreground rounded-full\", sizeStyles[size].dot)} />\r\n )}\r\n </span>\r\n </button>\r\n \r\n {(label || children) && (\r\n <label \r\n htmlFor={radioId}\r\n className={cn(\r\n \"font-medium text-foreground cursor-pointer flex-1\",\r\n \"disabled:cursor-not-allowed disabled:opacity-50\",\r\n sizeStyles[size].text,\r\n isDisabled && \"cursor-not-allowed opacity-50\"\r\n )}\r\n >\r\n <div className=\"flex items-center gap-2\">\r\n {Icon && <Icon className=\"h-4 w-4\" />}\r\n <span>{label || children}</span>\r\n </div>\r\n {description && (\r\n <p className=\"text-muted-foreground mt-0.5 text-xs\">\r\n {description}\r\n </p>\r\n )}\r\n </label>\r\n )}\r\n \r\n <input\r\n type=\"radio\"\r\n name={name}\r\n value={value}\r\n checked={isSelected}\r\n onChange={() => {}} // Controlled by button click\r\n className=\"sr-only\"\r\n tabIndex={-1}\r\n />\r\n </div>\r\n );\r\n }\r\n);\r\n\r\nRadioGroupItem.displayName = \"RadioGroupItem\";\r\n\r\n// Simplified Radio Group with predefined items\r\ninterface SimpleRadioGroupProps {\r\n items: Array<{\r\n value: string;\r\n label: string;\r\n description?: string;\r\n disabled?: boolean;\r\n icon?: React.ComponentType<{ className?: string }>;\r\n }>;\r\n value?: string;\r\n defaultValue?: string;\r\n onValueChange?: (value: string) => void;\r\n name?: string;\r\n disabled?: boolean;\r\n orientation?: \"horizontal\" | \"vertical\";\r\n size?: \"sm\" | \"md\" | \"lg\";\r\n variant?: \"default\" | \"card\" | \"button\";\r\n className?: string;\r\n required?: boolean;\r\n error?: boolean;\r\n errorMessage?: string;\r\n}\r\n\r\nexport const SimpleRadioGroup: React.FC<SimpleRadioGroupProps> = ({\r\n items,\r\n value,\r\n defaultValue,\r\n onValueChange,\r\n name,\r\n disabled = false,\r\n orientation = \"vertical\",\r\n size = \"md\",\r\n variant = \"default\",\r\n className,\r\n required = false,\r\n error = false,\r\n errorMessage\r\n}) => {\r\n return (\r\n <RadioGroup\r\n value={value}\r\n defaultValue={defaultValue}\r\n onValueChange={onValueChange}\r\n name={name}\r\n disabled={disabled}\r\n orientation={orientation}\r\n size={size}\r\n variant={variant}\r\n className={className}\r\n required={required}\r\n error={error}\r\n errorMessage={errorMessage}\r\n >\r\n {items.map((item) => (\r\n <RadioGroupItem\r\n key={item.value}\r\n value={item.value}\r\n label={item.label}\r\n description={item.description}\r\n disabled={item.disabled}\r\n icon={item.icon}\r\n />\r\n ))}\r\n </RadioGroup>\r\n );\r\n};\r\n\r\n// Legacy component for backward compatibility\r\nexport const RadioGroupWithLabel = SimpleRadioGroup;\r\n\r\n// Button-style Radio Group (connected buttons)\r\ninterface RadioButtonGroupProps {\r\n items: Array<{\r\n value: string;\r\n label: string;\r\n icon?: React.ComponentType<{ className?: string }>;\r\n disabled?: boolean;\r\n }>;\r\n value?: string;\r\n defaultValue?: string;\r\n onValueChange?: (value: string) => void;\r\n name?: string;\r\n disabled?: boolean;\r\n size?: \"sm\" | \"md\" | \"lg\";\r\n variant?: \"default\" | \"outline\" | \"solid\";\r\n className?: string;\r\n fullWidth?: boolean;\r\n}\r\n\r\nexport const RadioButtonGroup: React.FC<RadioButtonGroupProps> = ({\r\n items,\r\n value,\r\n defaultValue,\r\n onValueChange,\r\n name,\r\n disabled = false,\r\n size = \"md\",\r\n variant = \"default\",\r\n className,\r\n fullWidth = false\r\n}) => {\r\n const [internalValue, setInternalValue] = React.useState(defaultValue || \"\");\r\n const isControlled = value !== undefined;\r\n const currentValue = isControlled ? value : internalValue;\r\n\r\n const handleValueChange = (newValue: string) => {\r\n if (!disabled) {\r\n if (!isControlled) {\r\n setInternalValue(newValue);\r\n }\r\n onValueChange?.(newValue);\r\n }\r\n };\r\n\r\n const sizeClasses = {\r\n sm: \"px-3 py-1.5 text-xs\",\r\n md: \"px-4 py-2 text-sm\",\r\n lg: \"px-6 py-3 text-base\"\r\n };\r\n\r\n const variantClasses = {\r\n default: {\r\n container: \"bg-muted rounded-md p-1\",\r\n base: \"bg-transparent hover:bg-background/50\",\r\n selected: \"bg-background text-foreground shadow-sm\"\r\n },\r\n outline: {\r\n container: \"border border-border rounded-md overflow-hidden\",\r\n base: \"bg-background border-r border-border hover:bg-accent\",\r\n selected: \"bg-primary text-primary-foreground border-primary\"\r\n },\r\n solid: {\r\n container: \"border border-border rounded-md overflow-hidden\",\r\n base: \"bg-background hover:bg-accent\",\r\n selected: \"bg-primary text-primary-foreground\"\r\n }\r\n };\r\n\r\n const uniqueId = React.useId();\r\n const radioName = name || `radio-button-group-${uniqueId}`;\r\n\r\n return (\r\n <div \r\n className={cn(\r\n \"inline-flex\",\r\n variantClasses[variant].container,\r\n fullWidth && \"w-full\",\r\n className\r\n )}\r\n role=\"radiogroup\"\r\n >\r\n {items.map((item, index) => {\r\n const isSelected = currentValue === item.value;\r\n const isDisabled = item.disabled || disabled;\r\n const Icon = item.icon;\r\n const isLast = index === items.length - 1;\r\n\r\n return (\r\n <button\r\n key={item.value}\r\n type=\"button\"\r\n disabled={isDisabled}\r\n role=\"radio\"\r\n aria-checked={isSelected}\r\n className={cn(\r\n \"relative inline-flex items-center justify-center gap-2 font-medium transition-all duration-200\",\r\n \"focus:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1\",\r\n \"disabled:cursor-not-allowed disabled:opacity-50\",\r\n sizeClasses[size],\r\n isSelected \r\n ? variantClasses[variant].selected \r\n : variantClasses[variant].base,\r\n variant === \"outline\" && !isLast && \"border-r border-border\",\r\n variant === \"default\" && \"rounded-sm\",\r\n fullWidth && \"flex-1\"\r\n )}\r\n onClick={() => handleValueChange(item.value)}\r\n >\r\n {Icon && <Icon className=\"w-4 h-4\" />}\r\n {item.label}\r\n <input\r\n type=\"radio\"\r\n name={radioName}\r\n value={item.value}\r\n checked={isSelected}\r\n onChange={() => {}} // Controlled by button click\r\n className=\"sr-only\"\r\n tabIndex={-1}\r\n />\r\n </button>\r\n );\r\n })}\r\n </div>\r\n );\r\n};\r\n\r\n// Segmented Control (iOS-style)\r\ninterface SegmentedControlProps extends Omit<RadioButtonGroupProps, 'variant'> {}\r\n\r\nexport const SegmentedControl: React.FC<SegmentedControlProps> = (props) => {\r\n return <RadioButtonGroup {...props} variant=\"default\" />;\r\n};\r\n\r\n// Toggle Group (Connected outline buttons)\r\ninterface ToggleGroupProps extends Omit<RadioButtonGroupProps, 'variant'> {}\r\n\r\nexport const ToggleGroup: React.FC<ToggleGroupProps> = (props) => {\r\n return <RadioButtonGroup {...props} variant=\"outline\" />;\r\n};\r\n\r\nexport default RadioGroup;","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"@/lib/utils/cn\";\n\ninterface SliderProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, \"onChange\" | \"size\"> {\n value?: number;\n defaultValue?: number;\n min?: number;\n max?: number;\n step?: number;\n onChange?: (value: number) => void;\n onValueChange?: (value: number) => void; // Alternative prop name for consistency\n onMouseUp?: () => void; // Called when mouse is released\n onTouchEnd?: () => void; // Called when touch ends\n label?: React.ReactNode;\n labelClassName?: string;\n containerClassName?: string;\n trackClassName?: string;\n thumbClassName?: string;\n showValue?: boolean;\n valueClassName?: string;\n formatValue?: (value: number) => string;\n size?: \"sm\" | \"md\" | \"lg\";\n disabled?: boolean;\n orientation?: \"horizontal\" | \"vertical\";\n noFocus?: boolean; // remove focus ring/outline styling\n}\n\nconst SIZE_STYLES = {\n sm: {\n track: \"h-1\",\n thumb: \"w-3 h-3\",\n container: \"py-1\",\n },\n md: {\n track: \"h-2\",\n thumb: \"w-4 h-4\",\n container: \"py-2\",\n },\n lg: {\n track: \"h-3\",\n thumb: \"w-5 h-5\",\n container: \"py-3\",\n },\n};\n\nconst Slider = React.forwardRef<HTMLInputElement, SliderProps>(\n (\n {\n className,\n value,\n defaultValue = 0,\n min = 0,\n max = 100,\n step = 1,\n onChange,\n onValueChange,\n onMouseUp,\n onTouchEnd,\n label,\n labelClassName,\n containerClassName,\n trackClassName,\n thumbClassName,\n showValue = false,\n valueClassName,\n formatValue,\n size = \"md\",\n disabled = false,\n orientation = \"horizontal\",\n noFocus = true,\n ...props\n },\n ref\n ) => {\n const [internalValue, setInternalValue] = React.useState<number>(defaultValue);\n\n const isControlled = value !== undefined;\n const currentValue = isControlled ? value : internalValue;\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const newValue = Number(e.target.value);\n\n if (!isControlled) {\n setInternalValue(newValue);\n }\n\n onChange?.(newValue);\n onValueChange?.(newValue);\n };\n\n // Calculate the percentage for visual feedback\n const percentage = ((currentValue - min) / (max - min)) * 100;\n\n const sizeStyles = SIZE_STYLES[size];\n\n const displayValue = formatValue ? formatValue(currentValue) : currentValue.toString();\n\n if (orientation === \"vertical\") {\n // Vertical slider implementation would go here\n // For now, defaulting to horizontal\n }\n\n return (\n <div className={cn(\"w-full space-y-2\", containerClassName)}>\n {/* Label and value display */}\n {(label || showValue) && (\n <div className=\"flex items-center justify-between\">\n {label && <label className={cn(\"text-sm font-medium text-foreground\", labelClassName)}>{label}</label>}\n {showValue && <span className={cn(\"text-xs font-mono text-muted-foreground min-w-8 text-right\", valueClassName)}>{displayValue}</span>}\n </div>\n )}\n\n {/* Slider container */}\n <div className={cn(\"relative flex items-center\", sizeStyles.container)}>\n {/* Track background */}\n <div className={cn(\"w-full rounded-full bg-secondary relative overflow-hidden\", sizeStyles.track, trackClassName)}>\n {/* Progress fill */}\n <div className=\"absolute left-0 top-0 h-full bg-primary rounded-full\" style={{ width: `${percentage}%` }} />\n </div>\n\n {/* Actual input element */}\n <input\n ref={ref}\n type=\"range\"\n min={min}\n max={max}\n step={step}\n value={currentValue}\n onChange={handleChange}\n onMouseUp={onMouseUp}\n onTouchEnd={onTouchEnd}\n disabled={disabled}\n className={cn(\n // Base styles\n \"absolute w-full h-full appearance-none bg-transparent cursor-pointer\",\n !noFocus && \"focus:outline-none focus:ring-2 focus:ring-primary focus:ring-offset-2 focus:ring-offset-background rounded-full\",\n noFocus && \"outline-none ring-0 focus:outline-none focus:ring-0 focus-visible:outline-none\",\n\n // Webkit styles for thumb\n \"[&::-webkit-slider-thumb]:appearance-none\",\n \"[&::-webkit-slider-thumb]:bg-primary\",\n \"[&::-webkit-slider-thumb]:border-2 [&::-webkit-slider-thumb]:border-background\",\n \"[&::-webkit-slider-thumb]:rounded-full\",\n \"[&::-webkit-slider-thumb]:shadow-md\",\n \"[&::-webkit-slider-thumb]:cursor-pointer\",\n \"[&::-webkit-slider-thumb]:transition-all [&::-webkit-slider-thumb]:duration-150\",\n size === \"sm\" && \"[&::-webkit-slider-thumb]:w-3 [&::-webkit-slider-thumb]:h-3\",\n size === \"md\" && \"[&::-webkit-slider-thumb]:w-4 [&::-webkit-slider-thumb]:h-4\",\n size === \"lg\" && \"[&::-webkit-slider-thumb]:w-5 [&::-webkit-slider-thumb]:h-5\",\n\n // Firefox styles for thumb\n \"[&::-moz-range-thumb]:bg-primary\",\n \"[&::-moz-range-thumb]:border-2 [&::-moz-range-thumb]:border-background\",\n \"[&::-moz-range-thumb]:rounded-full\",\n \"[&::-moz-range-thumb]:shadow-md\",\n \"[&::-moz-range-thumb]:cursor-pointer\",\n \"[&::-moz-range-thumb]:transition-all [&::-moz-range-thumb]:duration-150\",\n size === \"sm\" && \"[&::-moz-range-thumb]:w-3 [&::-moz-range-thumb]:h-3\",\n size === \"md\" && \"[&::-moz-range-thumb]:w-4 [&::-moz-range-thumb]:h-4\",\n size === \"lg\" && \"[&::-moz-range-thumb]:w-5 [&::-moz-range-thumb]:h-5\",\n\n // Remove default track in Firefox\n \"[&::-moz-range-track]:bg-transparent\",\n \"[&::-moz-range-track]:border-transparent\",\n\n // Hover effects\n \"hover:[&::-webkit-slider-thumb]:scale-110 hover:[&::-webkit-slider-thumb]:shadow-lg\",\n \"hover:[&::-moz-range-thumb]:scale-110 hover:[&::-moz-range-thumb]:shadow-lg\",\n\n // Disabled styles\n disabled && [\n \"cursor-not-allowed opacity-50\",\n \"[&::-webkit-slider-thumb]:cursor-not-allowed [&::-webkit-slider-thumb]:opacity-50\",\n \"[&::-moz-range-thumb]:cursor-not-allowed [&::-moz-range-thumb]:opacity-50\",\n ],\n\n className,\n thumbClassName\n )}\n {...props}\n />\n </div>\n </div>\n );\n }\n);\n\nSlider.displayName = \"Slider\";\n\nexport { Slider };\nexport type { SliderProps };\n","\"use client\";\n\nimport Button from \"@/components/ui/Button\";\nimport { Slider } from \"@/components/ui/Slider\";\nimport { cn } from \"@/lib/utils/cn\";\nimport { Dot, Maximize2, Pause, Play, RotateCcw, RotateCw, Volume2, VolumeX } from \"lucide-react\";\nimport React from \"react\";\n\ninterface OverlayControlsProps {\n mode: \"live\" | \"review\";\n value: number;\n max: number;\n step?: number;\n onChange: (v: number) => void;\n onCommit?: (v: number) => void; // Called when user releases drag\n playing?: boolean; // review only\n onTogglePlay?: () => void; // review only\n onGoLive?: () => void; // review only: exit to live\n // Volume controls (review)\n volume?: number; // 0..1\n muted?: boolean;\n onVolumeChange?: (v: number) => void;\n onToggleMute?: () => void;\n // Playback rate (review)\n rate?: number;\n onChangeRate?: (r: number) => void;\n // Fullscreen toggle (review)\n onToggleFullscreen?: () => void;\n showOnHover?: boolean; // live: true -> only show when parent has group-hover\n className?: string;\n showTime?: boolean; // review: show current/total label\n // Skip controls (review)\n skipSeconds?: number; // default 10s\n onSkip?: (seconds: number) => void; // positive = forward, negative = backward\n // Preview thumbnail\n onSeekPreview?: (time: number) => string | undefined; // return thumbnail URL for given time\n // Auto-hide behavior\n autoHide?: boolean; // default false for review, true for live\n autoHideDelay?: number; // ms, default 3000\n // Keyboard shortcuts\n enableKeyboardShortcuts?: boolean; // default true\n}\n\nexport default function OverlayControls({\n mode,\n value,\n max,\n step = 0.1,\n onChange,\n onCommit,\n playing = false,\n onTogglePlay,\n onGoLive,\n volume,\n muted,\n onVolumeChange,\n onToggleMute,\n rate = 1,\n onChangeRate,\n onToggleFullscreen,\n showOnHover = false,\n className,\n showTime,\n skipSeconds = 10,\n onSkip,\n onSeekPreview,\n autoHide = false,\n autoHideDelay = 3000,\n enableKeyboardShortcuts = true,\n}: OverlayControlsProps) {\n const hoverClasses = showOnHover\n ? \"opacity-0 pointer-events-none group-hover:opacity-100 group-hover:pointer-events-auto\"\n : \"opacity-100 pointer-events-auto\";\n\n const showControlsBar = mode === \"review\";\n const [rateOpen, setRateOpen] = React.useState(false);\n const rateWrapRef = React.useRef<HTMLDivElement | null>(null);\n\n // Auto-hide state\n const [controlsVisible, setControlsVisible] = React.useState(true);\n const hideTimerRef = React.useRef<NodeJS.Timeout | null>(null);\n\n // Preview thumbnail state\n const [previewData, setPreviewData] = React.useState<{ time: number; x: number; url?: string } | null>(null);\n const sliderRef = React.useRef<HTMLDivElement | null>(null);\n\n // Track the current dragging value\n const [isDragging, setIsDragging] = React.useState(false);\n const [dragValue, setDragValue] = React.useState(value);\n\n // Update dragValue when value prop changes (from external source)\n React.useEffect(() => {\n if (!isDragging) {\n setDragValue(value);\n }\n }, [value, isDragging]);\n\n // Keyboard feedback state\n const [keyboardFeedback, setKeyboardFeedback] = React.useState<{\n type: \"play\" | \"pause\" | \"seek\" | \"volume\" | \"mute\" | \"unmute\";\n value?: number; // For seek: accumulated seconds, for volume: percentage\n } | null>(null);\n const feedbackTimerRef = React.useRef<NodeJS.Timeout | null>(null);\n const seekAccumulatorRef = React.useRef<number>(0);\n const seekAccumulatorTimerRef = React.useRef<NodeJS.Timeout | null>(null);\n\n // Close rate dropdown on outside click\n React.useEffect(() => {\n const onDocDown = (e: MouseEvent) => {\n if (!rateOpen) return;\n const wrap = rateWrapRef.current;\n if (wrap && !wrap.contains(e.target as Node)) {\n setRateOpen(false);\n }\n };\n document.addEventListener(\"mousedown\", onDocDown);\n return () => document.removeEventListener(\"mousedown\", onDocDown);\n }, [rateOpen]);\n\n // Auto-hide controls\n React.useEffect(() => {\n if (!autoHide || showOnHover) return;\n\n const resetTimer = () => {\n if (hideTimerRef.current) clearTimeout(hideTimerRef.current);\n setControlsVisible(true);\n hideTimerRef.current = setTimeout(() => {\n setControlsVisible(false);\n }, autoHideDelay);\n };\n\n const handleMouseMove = () => resetTimer();\n const handleMouseLeave = () => {\n if (hideTimerRef.current) clearTimeout(hideTimerRef.current);\n hideTimerRef.current = setTimeout(() => {\n setControlsVisible(false);\n }, autoHideDelay);\n };\n\n resetTimer();\n document.addEventListener(\"mousemove\", handleMouseMove);\n\n return () => {\n if (hideTimerRef.current) clearTimeout(hideTimerRef.current);\n document.removeEventListener(\"mousemove\", handleMouseMove);\n };\n }, [autoHide, autoHideDelay, showOnHover]);\n\n // Helper to show keyboard feedback\n const showFeedback = (type: \"play\" | \"pause\" | \"seek\" | \"volume\" | \"mute\" | \"unmute\", value?: number) => {\n if (feedbackTimerRef.current) clearTimeout(feedbackTimerRef.current);\n setKeyboardFeedback({ type, value });\n feedbackTimerRef.current = setTimeout(() => {\n setKeyboardFeedback(null);\n }, 800);\n };\n\n // Helper for seek accumulation\n const accumulateSeek = (seconds: number) => {\n if (seekAccumulatorTimerRef.current) clearTimeout(seekAccumulatorTimerRef.current);\n seekAccumulatorRef.current += seconds;\n showFeedback(\"seek\", seekAccumulatorRef.current);\n seekAccumulatorTimerRef.current = setTimeout(() => {\n seekAccumulatorRef.current = 0;\n }, 1000);\n };\n\n // Keyboard shortcuts\n React.useEffect(() => {\n if (!enableKeyboardShortcuts) return;\n\n const handleKeyDown = (e: KeyboardEvent) => {\n // Ignore if user is typing in an input\n if (e.target instanceof HTMLInputElement || e.target instanceof HTMLTextAreaElement) return;\n\n switch (e.key) {\n case \" \":\n case \"k\":\n e.preventDefault();\n onTogglePlay?.();\n showFeedback(playing ? \"pause\" : \"play\");\n break;\n case \"ArrowLeft\":\n e.preventDefault();\n if (e.shiftKey) {\n // Shift + Left: skip backward\n onSkip?.(-skipSeconds);\n accumulateSeek(-skipSeconds);\n } else {\n // Left: seek backward 5s\n {\n const newTime = Math.max(0, value - 5);\n onChange(newTime);\n onCommit?.(newTime);\n }\n accumulateSeek(-5);\n }\n break;\n case \"ArrowRight\":\n e.preventDefault();\n if (e.shiftKey) {\n // Shift + Right: skip forward\n onSkip?.(skipSeconds);\n accumulateSeek(skipSeconds);\n } else {\n // Right: seek forward 5s\n {\n const newTime = Math.min(max, value + 5);\n onChange(newTime);\n onCommit?.(newTime);\n }\n accumulateSeek(5);\n }\n break;\n case \"ArrowUp\":\n e.preventDefault();\n if (onVolumeChange && volume !== undefined) {\n const newVolume = Math.min(1, volume + 0.05);\n onVolumeChange(newVolume);\n showFeedback(\"volume\", Math.round(newVolume * 100));\n }\n break;\n case \"ArrowDown\":\n e.preventDefault();\n if (onVolumeChange && volume !== undefined) {\n const newVolume = Math.max(0, volume - 0.05);\n onVolumeChange(newVolume);\n showFeedback(\"volume\", Math.round(newVolume * 100));\n }\n break;\n case \"f\":\n case \"F\":\n if (!e.ctrlKey && !e.metaKey) {\n e.preventDefault();\n onToggleFullscreen?.();\n }\n break;\n case \"m\":\n case \"M\":\n e.preventDefault();\n onToggleMute?.();\n showFeedback(muted ? \"unmute\" : \"mute\");\n break;\n case \"j\":\n e.preventDefault();\n onSkip?.(-skipSeconds);\n accumulateSeek(-skipSeconds);\n break;\n case \"l\":\n e.preventDefault();\n onSkip?.(skipSeconds);\n accumulateSeek(skipSeconds);\n break;\n default:\n // 0-9 keys: jump to percentage\n if (e.key >= \"0\" && e.key <= \"9\") {\n e.preventDefault();\n const percent = parseInt(e.key) * 10;\n const newTime = (percent / 100) * max;\n onChange(newTime);\n onCommit?.(newTime);\n }\n break;\n }\n };\n\n document.addEventListener(\"keydown\", handleKeyDown);\n return () => document.removeEventListener(\"keydown\", handleKeyDown);\n }, [\n enableKeyboardShortcuts,\n mode,\n onTogglePlay,\n onSkip,\n skipSeconds,\n onChange,\n value,\n max,\n onVolumeChange,\n volume,\n onToggleFullscreen,\n onToggleMute,\n playing,\n muted,\n ]);\n\n const formatTime = (sec: number) => {\n if (!isFinite(sec) || sec < 0) return \"0:00\";\n const h = Math.floor(sec / 3600);\n const m = Math.floor((sec % 3600) / 60);\n const s = Math.floor(sec % 60);\n if (h > 0) return `${h}:${String(m).padStart(2, \"0\")}:${String(s).padStart(2, \"0\")}`;\n return `${m}:${String(s).padStart(2, \"0\")}`;\n };\n\n // Handle slider hover for preview\n const handleSliderMouseMove = (e: React.MouseEvent<HTMLDivElement>) => {\n if (!sliderRef.current) return;\n\n const rect = sliderRef.current.getBoundingClientRect();\n const x = e.clientX - rect.left;\n const percent = Math.max(0, Math.min(1, x / rect.width));\n const time = percent * max;\n\n // Always show preview, optionally with thumbnail if onSeekPreview is provided\n const thumbnailUrl = onSeekPreview ? onSeekPreview(time) : undefined;\n setPreviewData({ time, x: e.clientX - rect.left, url: thumbnailUrl });\n };\n\n const handleSliderMouseLeave = () => {\n setPreviewData(null);\n };\n\n return (\n <>\n {/* Keyboard feedback overlay */}\n {keyboardFeedback && (\n <div\n className={cn(\n \"absolute inset-0 flex items-center pointer-events-none z-50\",\n keyboardFeedback.type === \"seek\" && (keyboardFeedback.value ?? 0) > 0\n ? \"justify-end pr-32\"\n : keyboardFeedback.type === \"seek\" && (keyboardFeedback.value ?? 0) < 0\n ? \"justify-start pl-32\"\n : \"justify-center\"\n )}\n >\n <div className=\"bg-black/50 backdrop-blur-sm rounded-xl px-6 py-4 shadow-xl border border-white/10 animate-in fade-in zoom-in duration-200\">\n {keyboardFeedback.type === \"play\" && <Play className=\"w-16 h-16 text-white\" fill=\"white\" />}\n {keyboardFeedback.type === \"pause\" && <Pause className=\"w-16 h-16 text-white\" fill=\"white\" />}\n {keyboardFeedback.type === \"seek\" && (\n <div className=\"flex items-center gap-3\">\n {(keyboardFeedback.value ?? 0) > 0 ? <RotateCw className=\"w-12 h-12 text-white\" /> : <RotateCcw className=\"w-12 h-12 text-white\" />}\n <span className=\"text-3xl font-bold text-white\">\n {keyboardFeedback.value && keyboardFeedback.value > 0 ? \"+\" : \"\"}\n {keyboardFeedback.value}s\n </span>\n </div>\n )}\n {keyboardFeedback.type === \"volume\" && (\n <div className=\"flex items-center gap-3\">\n <Volume2 className=\"w-12 h-12 text-white\" />\n <div className=\"flex flex-col gap-1.5\">\n <span className=\"text-2xl font-bold text-white\">{keyboardFeedback.value}%</span>\n <div className=\"w-32 h-1.5 bg-white/30 rounded-full overflow-hidden\">\n <div className=\"h-full bg-white rounded-full transition-all\" style={{ width: `${keyboardFeedback.value}%` }} />\n </div>\n </div>\n </div>\n )}\n {keyboardFeedback.type === \"mute\" && <VolumeX className=\"w-16 h-16 text-white\" />}\n {keyboardFeedback.type === \"unmute\" && <Volume2 className=\"w-16 h-16 text-white\" />}\n </div>\n </div>\n )}\n\n <div\n className={cn(\n \"absolute bottom-0 left-0 right-0 pb-2 pt-8 bg-linear-to-t from-black/40 to-transparent z-20 transition-opacity duration-200\",\n hoverClasses,\n autoHide && !controlsVisible && \"opacity-0 pointer-events-none\",\n className\n )}\n >\n <div className=\"px-4\">\n <div ref={sliderRef} onMouseMove={handleSliderMouseMove} onMouseLeave={handleSliderMouseLeave} className=\"relative\">\n <Slider\n min={0}\n max={max || 0}\n step={step}\n value={dragValue}\n onValueChange={(v) => {\n setIsDragging(true);\n setDragValue(v);\n onChange(v);\n }}\n onMouseUp={() => {\n onCommit?.(dragValue);\n setIsDragging(false);\n }}\n onTouchEnd={() => {\n onCommit?.(dragValue);\n setIsDragging(false);\n }}\n trackClassName=\"bg-muted\"\n size=\"sm\"\n noFocus\n />\n\n {/* Preview thumbnail */}\n {previewData && (\n <div className=\"absolute bottom-full mb-2 transform -translate-x-1/2 pointer-events-none z-30\" style={{ left: `${previewData.x}px` }}>\n {previewData.url ? (\n <div className=\"bg-background/95 backdrop-blur rounded-md border border-border shadow-lg overflow-hidden\">\n <img src={previewData.url} alt=\"Preview\" className=\"w-40 h-24 object-cover\" />\n <div className=\"px-2 py-1 text-xs font-mono text-center bg-background/80\">{formatTime(previewData.time)}</div>\n </div>\n ) : (\n <div className=\"px-3 py-1.5 rounded-md bg-background/90 backdrop-blur border border-border shadow-lg\">\n <div className=\"text-xs font-mono text-center\">{formatTime(previewData.time)}</div>\n </div>\n )}\n </div>\n )}\n </div>\n\n {showControlsBar && (\n <div className=\"mt-2 flex items-center justify-between gap-2\">\n <div className=\"flex items-center gap-2\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={onTogglePlay}\n title={playing ? \"Tạm dừng\" : \"Phát\"}\n className=\"bg-background/60 hover:bg-background/80 border-transparent shadow-sm outline-none focus:outline-none focus:ring-0\"\n >\n {playing ? <Pause className=\"w-4 h-4\" /> : <Play className=\"w-4 h-4\" />}\n </Button>\n\n {/* Skip backward button */}\n {onSkip && (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={() => onSkip(-skipSeconds)}\n title={`Lùi ${skipSeconds}s`}\n className=\"bg-background/60 hover:bg-background/80 border-transparent shadow-sm outline-none focus:outline-none focus:ring-0\"\n >\n <RotateCcw className=\"w-4 h-4\" />\n </Button>\n )}\n\n {/* Skip forward button */}\n {onSkip && (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={() => onSkip(skipSeconds)}\n title={`Tua ${skipSeconds}s`}\n className=\"bg-background/60 hover:bg-background/80 border-transparent shadow-sm outline-none focus:outline-none focus:ring-0\"\n >\n <RotateCw className=\"w-4 h-4\" />\n </Button>\n )}\n\n {(showTime ?? true) && (\n <span className=\"px-3 py-1 rounded-full text-xs font-mono bg-background/60 text-foreground shadow-sm border border-border whitespace-nowrap\">\n {formatTime(dragValue)} / {formatTime(max)}\n </span>\n )}\n\n {/* Volume control */}\n <div className=\"flex items-center gap-2\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={onToggleMute}\n title={muted ? \"Bật tiếng\" : \"Tắt tiếng\"}\n className=\"bg-background/60 hover:bg-background/80 border-transparent shadow-sm outline-none focus:outline-none focus:ring-0\"\n >\n {muted || (volume ?? 1) === 0 ? <VolumeX className=\"w-4 h-4\" /> : <Volume2 className=\"w-4 h-4\" />}\n </Button>\n <div className=\"w-24\">\n <Slider\n min={0}\n max={1}\n step={0.05}\n value={Math.max(0, Math.min(volume ?? 1, 1))}\n onValueChange={(v) => onVolumeChange?.(v)}\n trackClassName=\"bg-muted\"\n size=\"sm\"\n noFocus\n />\n </div>\n </div>\n </div>\n\n <div className=\"flex items-center gap-2 relative\">\n {onGoLive && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={onGoLive}\n title=\"Trực tiếp (về Live)\"\n className=\"bg-background/60 hover:bg-background/80 border-transparent shadow-sm outline-none focus:outline-none focus:ring-0\"\n >\n <Dot className=\"w-10 h-10 text-destructive\" />\n Trực tiếp\n </Button>\n )}\n {onChangeRate && (\n <div className=\"relative\" ref={rateWrapRef}>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setRateOpen((o) => !o)}\n title=\"Tốc độ phát\"\n className=\"bg-background/60 hover:bg-background/80 border-transparent shadow-sm outline-none focus:outline-none focus:ring-0\"\n >\n {rate}x\n </Button>\n {rateOpen && (\n <div className=\"absolute bottom-9 right-0 bg-background/90 backdrop-blur rounded-md border border-border shadow-lg p-1 z-30\">\n {[0.5, 0.75, 1, 1.25, 1.5].map((r) => (\n <button\n key={r}\n onClick={() => {\n onChangeRate(r);\n setRateOpen(false);\n }}\n className={cn(\"block w-full text-left px-3 py-1 text-sm rounded hover:bg-accent\", rate === r && \"bg-accent\")}\n >\n {r}x\n </button>\n ))}\n </div>\n )}\n </div>\n )}\n {onToggleFullscreen && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={onToggleFullscreen}\n title=\"Toàn màn hình\"\n className=\"px-3 bg-background/60 hover:bg-background/80 border-transparent shadow-sm outline-none focus:outline-none focus:ring-0\"\n >\n <Maximize2 className=\"w-4 h-4\" />\n </Button>\n )}\n </div>\n </div>\n )}\n </div>\n </div>\n </>\n );\n}\n\n","\"use client\";\r\n\r\nimport React, { useState } from \"react\";\r\nimport { ChevronRight, ChevronDown, Check } from \"lucide-react\";\r\nimport { cn } from \"@/lib/utils/cn\";\r\n\r\ninterface Category {\r\n id: number;\r\n name: string;\r\n parent_id?: number | null;\r\n}\r\n\r\ninterface CategoryTreeSelectProps {\r\n categories: Category[];\r\n value: number[];\r\n onChange: (selectedIds: number[]) => void;\r\n placeholder?: string;\r\n disabled?: boolean;\r\n}\r\n\r\nexport function CategoryTreeSelect({ categories, value, onChange, placeholder = \"Chọn danh mục\", disabled }: CategoryTreeSelectProps) {\r\n const [isOpen, setIsOpen] = useState(false);\r\n const [expandedNodes, setExpandedNodes] = useState<Set<number>>(new Set());\r\n\r\n // Build tree structure\r\n const parentCategories = categories.filter((c) => !c.parent_id);\r\n const childrenMap = new Map<number, Category[]>();\r\n\r\n categories.forEach((cat) => {\r\n if (cat.parent_id) {\r\n if (!childrenMap.has(cat.parent_id)) {\r\n childrenMap.set(cat.parent_id, []);\r\n }\r\n childrenMap.get(cat.parent_id)!.push(cat);\r\n }\r\n });\r\n\r\n const toggleExpand = (id: number) => {\r\n const newExpanded = new Set(expandedNodes);\r\n if (newExpanded.has(id)) {\r\n newExpanded.delete(id);\r\n } else {\r\n newExpanded.add(id);\r\n }\r\n setExpandedNodes(newExpanded);\r\n };\r\n\r\n const handleSelect = (categoryId: number, category: Category) => {\r\n const newSelected = new Set(value);\r\n\r\n if (newSelected.has(categoryId)) {\r\n // Unselect\r\n newSelected.delete(categoryId);\r\n\r\n // Also unselect children if it's a parent\r\n const children = childrenMap.get(categoryId) || [];\r\n children.forEach((child) => newSelected.delete(child.id));\r\n } else {\r\n // Select\r\n newSelected.add(categoryId);\r\n\r\n // Also select parent if this is a child\r\n if (category.parent_id) {\r\n newSelected.add(category.parent_id);\r\n }\r\n }\r\n\r\n onChange(Array.from(newSelected));\r\n };\r\n\r\n const renderCategory = (category: Category, level: number = 0) => {\r\n const children = childrenMap.get(category.id) || [];\r\n const hasChildren = children.length > 0;\r\n const isExpanded = expandedNodes.has(category.id);\r\n const isSelected = value.includes(category.id);\r\n\r\n return (\r\n <div key={category.id}>\r\n <div\n className={cn(\n \"relative flex items-center gap-2 px-3 py-2 cursor-pointer rounded-md transition-colors\",\n \"hover:bg-accent\",\n // Selected state: subtle bg + square left indicator, avoid left rounding\n isSelected && \"bg-primary/10 rounded-r-md\"\n )}\n style={{ paddingLeft: `${level * 1.5 + 0.75}rem` }}\n >\n {isSelected && (\n <span\n aria-hidden\n className=\"absolute left-0 top-0 bottom-0 w-1 bg-primary\"\n />\n )}\n {hasChildren ? (\r\n <button\r\n type=\"button\"\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n toggleExpand(category.id);\r\n }}\r\n className=\"p-0.5 hover:bg-accent rounded\"\r\n >\r\n {isExpanded ? <ChevronDown className=\"w-4 h-4\" /> : <ChevronRight className=\"w-4 h-4\" />}\r\n </button>\r\n ) : (\r\n <span className=\"w-5\" />\r\n )}\r\n\r\n <div\r\n onClick={() => handleSelect(category.id, category)}\r\n className=\"flex items-center gap-2 flex-1\"\r\n >\r\n <div\r\n className={cn(\r\n \"w-4 h-4 border-2 rounded flex items-center justify-center transition-colors\",\r\n isSelected ? \"bg-primary border-primary\" : \"border-muted-foreground/30\"\r\n )}\r\n >\r\n {isSelected && <Check className=\"w-3 h-3 text-primary-foreground\" />}\r\n </div>\r\n\r\n <span className={cn(\"text-sm\", isSelected && \"font-medium text-primary\")}>{category.name}</span>\r\n </div>\r\n </div>\r\n\r\n {hasChildren && isExpanded && (\r\n <div>\r\n {children.map((child) => renderCategory(child, level + 1))}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n };\r\n\r\n const selectedCount = value.length;\r\n const displayText = selectedCount > 0 ? `Đã chọn ${selectedCount} danh mục` : placeholder;\r\n\r\n return (\n <div className=\"relative\">\n <button\n type=\"button\"\n onClick={() => !disabled && setIsOpen(!isOpen)}\n disabled={disabled}\n className={cn(\n // Match Combobox trigger outline + focus styles\n \"flex w-full items-center justify-between px-3 bg-background border border-input\",\n \"rounded-md h-10 py-2 text-sm\",\n \"hover:bg-accent/5 transition-colors hover:border-primary/40 focus:border-primary\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background\",\n disabled && \"opacity-50 cursor-not-allowed\",\n isOpen && \"border-primary\"\n )}\n >\n <span className={cn(\"text-sm\", selectedCount === 0 && \"text-muted-foreground\")}>{displayText}</span>\n <ChevronDown className={cn(\"w-4 h-4 transition-transform\", isOpen && \"transform rotate-180\")} />\n </button>\n\n {isOpen && !disabled && (\n <>\n <div className=\"fixed inset-0 z-10\" onClick={() => setIsOpen(false)} />\n <div\n className={cn(\n \"absolute z-20 mt-1 w-full max-h-80 overflow-auto\",\n \"rounded-md border bg-popover text-popover-foreground shadow-md\",\n \"backdrop-blur-sm bg-popover/95 border-border/60\"\n )}\n >\n <div className=\"p-1\">\n {parentCategories.length === 0 ? (\r\n <div className=\"px-3 py-2 text-sm text-muted-foreground\">Không có danh mục nào</div>\r\n ) : (\r\n parentCategories.map((cat) => renderCategory(cat))\r\n )}\r\n </div>\r\n </div>\r\n </>\r\n )}\r\n </div>\r\n );\r\n}\r\n","// components/ui/ImageUpload.tsx\r\n\"use client\";\r\n\r\nimport { useState, useRef, useCallback } from \"react\";\r\nimport { Upload, X, Image as ImageIcon, Loader2, Check } from \"lucide-react\";\r\nimport { cn } from \"@/lib/utils/cn\";\r\nimport Button from \"./Button\";\r\nimport { useToast } from \"./Toast\";\r\nimport { useTranslations } from \"@/lib/i18n/translation-adapter\";\r\n\r\n// Upload interface for basic setup\r\ninterface UploadedImage {\r\n id: number;\r\n path: string;\r\n url: string;\r\n originalName: string;\r\n size: number;\r\n mimeType: string;\r\n width?: number;\r\n height?: number;\r\n formattedSize?: string;\r\n}\r\n\r\ninterface ImageUploadProps {\r\n onUpload?: (image: UploadedImage) => void;\r\n onRemove?: (imageId: string) => void;\r\n maxSize?: number; // in MB\r\n accept?: string;\r\n multiple?: boolean;\r\n disabled?: boolean;\r\n className?: string;\r\n showPreview?: boolean;\r\n previewSize?: \"sm\" | \"md\" | \"lg\";\r\n dragDropText?: string;\r\n browseText?: string;\r\n supportedFormatsText?: string;\r\n}\r\n\r\nexport default function ImageUpload({\r\n onUpload,\r\n onRemove,\r\n maxSize = parseInt(process.env.NEXT_PUBLIC_MAX_FILE_SIZE || \"10485760\") / (1024 * 1024), // Convert bytes to MB\r\n accept = \"image/*\",\r\n multiple = false,\r\n disabled = false,\r\n className,\r\n showPreview = true,\r\n previewSize = \"md\",\r\n dragDropText,\r\n browseText,\r\n supportedFormatsText,\r\n}: ImageUploadProps) {\r\n const [isDragging, setIsDragging] = useState(false);\r\n const [uploading, setUploading] = useState(false);\r\n const [uploadedImages, setUploadedImages] = useState<UploadedImage[]>([]);\r\n const fileInputRef = useRef<HTMLInputElement>(null);\r\n const { addToast } = useToast();\r\n const t = useTranslations(\"OCR.imageUpload\");\r\n\r\n const previewSizes = {\r\n sm: \"w-16 h-16\",\r\n md: \"w-24 h-24\",\r\n lg: \"w-32 h-32\",\r\n };\r\n\r\n const handleDragOver = useCallback(\r\n (e: React.DragEvent) => {\r\n e.preventDefault();\r\n if (!disabled) {\r\n setIsDragging(true);\r\n }\r\n },\r\n [disabled]\r\n );\r\n\r\n const handleDragLeave = useCallback((e: React.DragEvent) => {\r\n e.preventDefault();\r\n setIsDragging(false);\r\n }, []);\r\n\r\n const handleFiles = useCallback(\r\n async (files: File[]) => {\r\n if (files.length === 0) return;\r\n\r\n // Validate files\r\n const validFiles = files.filter((file) => {\r\n // Check file size\r\n if (file.size > maxSize * 1024 * 1024) {\r\n addToast({\r\n type: \"error\",\r\n message: `File \"${file.name}\" is too large. Max size: ${maxSize}MB`,\r\n });\r\n return false;\r\n }\r\n\r\n // Check file type\r\n if (!file.type.startsWith(\"image/\")) {\r\n addToast({\r\n type: \"error\",\r\n message: `File \"${file.name}\" is not a valid image`,\r\n });\r\n return false;\r\n }\r\n\r\n return true;\r\n });\r\n\r\n if (validFiles.length === 0) return;\r\n\r\n setUploading(true);\r\n\r\n try {\r\n // Upload files one by one\r\n for (const file of validFiles) {\r\n const formData = new FormData();\r\n formData.append(\"file\", file);\r\n\r\n // const response = await callApi<UploadedImage>(API_ROUTES.UPLOAD.IMAGE, HTTP_METHOD_ENUM.POST, formData);\r\n const response = {\r\n id: Date.now(),\r\n path: \"\",\r\n url: URL.createObjectURL(file),\r\n originalName: file.name,\r\n size: file.size,\r\n mimeType: file.type,\r\n width: 0,\r\n height: 0,\r\n formattedSize: `${(file.size / 1024).toFixed(1)} KB`,\r\n };\r\n\r\n const newImage: UploadedImage = {\r\n id: response.id,\r\n path: response.path,\r\n url: response.url,\r\n originalName: response.originalName,\r\n size: response.size,\r\n mimeType: response.mimeType,\r\n width: response.width,\r\n height: response.height,\r\n formattedSize: response.formattedSize,\r\n };\r\n\r\n setUploadedImages((prev) => [...prev, newImage]);\r\n onUpload?.(newImage);\r\n\r\n addToast({\r\n type: \"success\",\r\n message: `\"${file.name}\" uploaded successfully`,\r\n });\r\n }\r\n } catch (error: any) {\r\n console.error(\"Upload error:\", error);\r\n addToast({\r\n type: \"error\",\r\n message: error.message || \"Upload failed\",\r\n });\r\n } finally {\r\n setUploading(false);\r\n }\r\n },\r\n [maxSize, addToast, onUpload]\r\n );\r\n\r\n const handleDrop = useCallback(\r\n (e: React.DragEvent) => {\r\n e.preventDefault();\r\n setIsDragging(false);\r\n\r\n if (disabled) return;\r\n\r\n const files = Array.from(e.dataTransfer.files);\r\n handleFiles(files);\r\n },\r\n [disabled, handleFiles]\r\n );\r\n\r\n const handleFileSelect = useCallback(\r\n (e: React.ChangeEvent<HTMLInputElement>) => {\r\n const files = Array.from(e.target.files || []);\r\n handleFiles(files);\r\n\r\n // Reset input value so same file can be selected again\r\n if (fileInputRef.current) {\r\n fileInputRef.current.value = \"\";\r\n }\r\n },\r\n [handleFiles]\r\n );\r\n\r\n const handleRemoveImage = (imageId: string | number) => {\r\n setUploadedImages((prev) => prev.filter((img) => img.id !== Number(imageId)));\r\n onRemove?.(String(imageId));\r\n };\r\n\r\n const handleBrowseClick = () => {\r\n fileInputRef.current?.click();\r\n };\r\n\r\n return (\r\n <div className={cn(\"space-y-4\", className)}>\r\n {/* Upload Area */}\r\n <div\r\n className={cn(\r\n \"relative border-2 border-dashed rounded-lg p-8 text-center transition-all duration-200\",\r\n isDragging && !disabled ? \"border-primary bg-primary/5 scale-[1.02]\" : \"border-border hover:border-primary/50\",\r\n disabled && \"opacity-50 cursor-not-allowed\",\r\n uploading && \"pointer-events-none\"\r\n )}\r\n onDragOver={handleDragOver}\r\n onDragLeave={handleDragLeave}\r\n onDrop={handleDrop}\r\n >\r\n {uploading && (\r\n <div className=\"absolute inset-0 bg-background/80 flex items-center justify-center rounded-lg\">\r\n <div className=\"flex items-center gap-3\">\r\n <Loader2 className=\"w-6 h-6 animate-spin text-primary\" />\r\n <span className=\"text-sm font-medium\">Uploading...</span>\r\n </div>\r\n </div>\r\n )}\r\n\r\n <div className=\"space-y-4\">\r\n <div className=\"mx-auto w-12 h-12 bg-primary/10 rounded-full flex items-center justify-center\">\r\n <Upload className=\"w-6 h-6 text-primary\" />\r\n </div>\r\n\r\n <div className=\"space-y-2\">\r\n <p className=\"text-muted-foreground\">{dragDropText || t(\"dragDropText\")}</p>\r\n\r\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={handleBrowseClick} disabled={disabled || uploading}>\r\n {browseText || t(\"browseFiles\")}\r\n </Button>\r\n </div>\r\n\r\n <p className=\"text-xs text-muted-foreground\">{supportedFormatsText || t(\"supportedFormats\")}</p>\r\n </div>\r\n\r\n <input\r\n ref={fileInputRef}\r\n type=\"file\"\r\n accept={accept}\r\n multiple={multiple}\r\n onChange={handleFileSelect}\r\n className=\"hidden\"\r\n disabled={disabled}\r\n />\r\n </div>\r\n\r\n {/* Preview Area */}\r\n {showPreview && uploadedImages.length > 0 && (\r\n <div className=\"space-y-3\">\r\n <h4 className=\"text-sm font-medium\">Uploaded Images</h4>\r\n\r\n <div className=\"grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 gap-4\">\r\n {uploadedImages.map((image) => (\r\n <div key={image.id} className=\"relative group bg-card border border-border rounded-lg p-3\">\r\n {/* Remove Button */}\r\n <Button\r\n variant=\"danger\"\r\n size=\"icon\"\r\n className=\"absolute -top-2 -right-2 w-6 h-6 opacity-0 group-hover:opacity-100 transition-opacity z-10\"\r\n onClick={() => handleRemoveImage(image.id)}\r\n >\r\n <X className=\"w-3 h-3\" />\r\n </Button>\r\n\r\n {/* Image Preview */}\r\n <div className={cn(\"mx-auto mb-2 overflow-hidden rounded-md\", previewSizes[previewSize])}>\r\n {/* eslint-disable-next-line @next/next/no-img-element */}\r\n <img\r\n src={image.url}\r\n alt={image.originalName}\r\n className=\"w-full h-full object-cover\"\r\n onError={(e) => {\r\n // Fallback to file icon if image fails to load\r\n const target = e.target as HTMLImageElement;\r\n target.style.display = \"none\";\r\n target.nextElementSibling?.classList.remove(\"hidden\");\r\n }}\r\n />\r\n <div className=\"hidden w-full h-full bg-muted flex items-center justify-center\">\r\n <ImageIcon className=\"w-8 h-8 text-muted-foreground\" />\r\n </div>\r\n </div>\r\n\r\n {/* Image Info */}\r\n <div className=\"space-y-1\">\r\n <p className=\"text-xs font-medium truncate\" title={image.originalName}>\r\n {image.originalName}\r\n </p>\r\n <p className=\"text-xs text-muted-foreground\">{image.formattedSize}</p>\r\n {image.width && image.height && (\r\n <p className=\"text-xs text-muted-foreground\">\r\n {image.width} × {image.height}\r\n </p>\r\n )}\r\n </div>\r\n\r\n {/* Success Indicator */}\r\n <div className=\"absolute top-1 left-1 w-5 h-5 bg-success rounded-full flex items-center justify-center\">\r\n <Check className=\"w-3 h-3 text-success-foreground\" />\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n","\"use client\";\r\n\r\nimport * as React from \"react\";\r\nimport { ChevronLeft, ChevronRight } from \"lucide-react\";\r\nimport Button from \"./Button\";\r\nimport { cn } from \"@/lib/utils/cn\";\r\n\r\ntype AnimationVariant = \"slide\" | \"fade\" | \"scale\";\r\ntype Orientation = \"horizontal\" | \"vertical\";\r\n\r\ninterface CarouselProps {\r\n children: React.ReactNode[];\r\n autoScroll?: boolean;\r\n autoScrollInterval?: number;\r\n animation?: AnimationVariant;\r\n orientation?: Orientation;\r\n showArrows?: boolean;\r\n showDots?: boolean;\r\n showProgress?: boolean;\r\n showThumbnails?: boolean;\r\n loop?: boolean;\r\n slidesToShow?: number;\r\n slidesToScroll?: number;\r\n className?: string;\r\n containerClassName?: string;\r\n slideClassName?: string;\r\n onSlideChange?: (index: number) => void;\r\n thumbnailRenderer?: (child: React.ReactNode, index: number) => React.ReactNode;\r\n ariaLabel?: string;\r\n}\r\n\r\nexport function Carousel({\r\n children,\r\n autoScroll = true,\r\n autoScrollInterval = 5000,\r\n animation = \"slide\",\r\n orientation = \"horizontal\",\r\n showArrows = true,\r\n showDots = true,\r\n showProgress = false,\r\n showThumbnails = false,\r\n loop = true,\r\n slidesToShow = 1,\r\n slidesToScroll = 1,\r\n className,\r\n containerClassName,\r\n slideClassName,\r\n onSlideChange,\r\n thumbnailRenderer,\r\n ariaLabel = \"Carousel\",\r\n}: CarouselProps) {\r\n const [currentIndex, setCurrentIndex] = React.useState(0);\r\n const [isPaused, setIsPaused] = React.useState(false);\r\n const [isDragging, setIsDragging] = React.useState(false);\r\n const [startPos, setStartPos] = React.useState(0);\r\n const [currentTranslate, setCurrentTranslate] = React.useState(0);\r\n const [prevTranslate, setPrevTranslate] = React.useState(0);\r\n // Progress bar handled via rAF to avoid frequent React state updates\n const progressElRef = React.useRef<HTMLDivElement | null>(null);\n\r\n const carouselRef = React.useRef<HTMLDivElement>(null);\r\n const rafRef = React.useRef<number | null>(null);\n\r\n const totalSlides = React.Children.count(children);\r\n const maxIndex = Math.max(0, totalSlides - slidesToShow);\r\n const isHorizontal = orientation === \"horizontal\";\r\n\r\n const scrollPrev = React.useCallback(() => {\r\n setCurrentIndex((prev) => {\r\n if (prev === 0) {\r\n return loop ? maxIndex : 0;\r\n }\r\n return Math.max(0, prev - slidesToScroll);\r\n });\r\n }, [loop, maxIndex, slidesToScroll]);\r\n\r\n const scrollNext = React.useCallback(() => {\r\n setCurrentIndex((prev) => {\r\n if (prev >= maxIndex) {\r\n return loop ? 0 : maxIndex;\r\n }\r\n return Math.min(maxIndex, prev + slidesToScroll);\r\n });\r\n }, [loop, maxIndex, slidesToScroll]);\r\n\r\n const scrollTo = React.useCallback(\r\n (index: number) => {\r\n setCurrentIndex(Math.min(maxIndex, Math.max(0, index)));\r\n },\r\n [maxIndex]\r\n );\r\n\r\n // Keyboard navigation\r\n React.useEffect(() => {\r\n const handleKeyDown = (e: KeyboardEvent) => {\r\n if (e.key === \"ArrowLeft\" || e.key === \"ArrowUp\") {\r\n e.preventDefault();\r\n scrollPrev();\r\n } else if (e.key === \"ArrowRight\" || e.key === \"ArrowDown\") {\r\n e.preventDefault();\r\n scrollNext();\r\n } else if (e.key === \"Home\") {\r\n e.preventDefault();\r\n scrollTo(0);\r\n } else if (e.key === \"End\") {\r\n e.preventDefault();\r\n scrollTo(maxIndex);\r\n }\r\n };\r\n\r\n const carousel = carouselRef.current;\r\n if (carousel) {\r\n carousel.addEventListener(\"keydown\", handleKeyDown);\r\n return () => carousel.removeEventListener(\"keydown\", handleKeyDown);\r\n }\r\n }, [scrollPrev, scrollNext, scrollTo, maxIndex]);\r\n\r\n // Auto scroll with progress (requestAnimationFrame)\n React.useEffect(() => {\n // Cleanup helper\n const stop = () => {\n if (rafRef.current != null) {\n cancelAnimationFrame(rafRef.current);\n rafRef.current = null;\n }\n if (progressElRef.current) progressElRef.current.style.width = '0%';\n };\n\n if (!autoScroll || isPaused || totalSlides <= slidesToShow) {\n stop();\n return;\n }\n\n let start = performance.now();\n const tick = (now: number) => {\n const elapsed = now - start;\n const ratio = Math.min(1, elapsed / autoScrollInterval);\n if (progressElRef.current) {\n progressElRef.current.style.width = `${ratio * 100}%`;\n }\n if (ratio >= 1) {\n // Advance slide and restart cycle\n scrollNext();\n start = performance.now();\n }\n rafRef.current = requestAnimationFrame(tick);\n };\n rafRef.current = requestAnimationFrame(tick);\n\n return stop;\n }, [autoScroll, isPaused, totalSlides, slidesToShow, autoScrollInterval, scrollNext]);\n\r\n // Touch/Mouse drag handlers\r\n const getPositionX = (event: TouchEvent | MouseEvent) => {\r\n return event.type.includes(\"mouse\") ? (event as MouseEvent).pageX : (event as TouchEvent).touches[0].clientX;\r\n };\r\n\r\n const getPositionY = (event: TouchEvent | MouseEvent) => {\r\n return event.type.includes(\"mouse\") ? (event as MouseEvent).pageY : (event as TouchEvent).touches[0].clientY;\r\n };\r\n\r\n const touchStart = (event: React.TouchEvent | React.MouseEvent) => {\r\n setIsDragging(true);\r\n const pos = isHorizontal ? getPositionX(event.nativeEvent) : getPositionY(event.nativeEvent);\r\n setStartPos(pos);\r\n setPrevTranslate(currentTranslate);\r\n };\r\n\r\n const touchMove = (event: React.TouchEvent | React.MouseEvent) => {\r\n if (!isDragging) return;\r\n const pos = isHorizontal ? getPositionX(event.nativeEvent) : getPositionY(event.nativeEvent);\r\n const currentPosition = pos;\r\n setCurrentTranslate(prevTranslate + currentPosition - startPos);\r\n };\r\n\r\n const touchEnd = () => {\r\n if (!isDragging) return;\r\n setIsDragging(false);\r\n\r\n const movedBy = currentTranslate - prevTranslate;\r\n const threshold = 50;\r\n\r\n if (movedBy < -threshold && currentIndex < maxIndex) {\r\n scrollNext();\r\n } else if (movedBy > threshold && currentIndex > 0) {\r\n scrollPrev();\r\n }\r\n\r\n setCurrentTranslate(0);\r\n setPrevTranslate(0);\r\n };\r\n\r\n // Call onSlideChange callback\r\n React.useEffect(() => {\r\n onSlideChange?.(currentIndex);\r\n }, [currentIndex, onSlideChange]);\r\n\r\n const getAnimationStyles = (): React.CSSProperties => {\r\n const baseTransform = isHorizontal\r\n ? `translateX(-${currentIndex * (100 / slidesToShow)}%)`\r\n : `translateY(-${currentIndex * (100 / slidesToShow)}%)`;\r\n\r\n if (animation === \"fade\") {\r\n return {\r\n transition: \"opacity 500ms ease-in-out\",\r\n };\r\n }\r\n\r\n if (animation === \"scale\") {\r\n return {\r\n transform: baseTransform,\r\n transition: \"transform 500ms ease-in-out, scale 500ms ease-in-out\",\r\n };\r\n }\r\n\r\n return {\r\n transform: baseTransform,\r\n transition: isDragging ? \"none\" : \"transform 500ms ease-in-out\",\r\n };\r\n };\r\n\r\n const slideWidth = 100 / slidesToShow;\r\n\r\n return (\r\n <div\r\n ref={carouselRef}\r\n className={cn(\"relative w-full overflow-hidden focus:outline-none focus:ring-2 focus:ring-primary focus:ring-offset-2 rounded-lg\", className)}\r\n onMouseEnter={() => setIsPaused(true)}\r\n onMouseLeave={() => setIsPaused(false)}\r\n role=\"region\"\r\n aria-label={ariaLabel}\r\n aria-roledescription=\"carousel\"\r\n tabIndex={0}\r\n >\r\n {/* Progress bar */}\r\n {showProgress && autoScroll && (\n <div className=\"absolute top-0 left-0 right-0 h-1 bg-muted z-20\">\n <div ref={progressElRef} className=\"h-full bg-primary\" style={{ width: '0%' }} />\n </div>\n )}\n\r\n {/* Slides container */}\r\n <div\r\n className={cn(\"flex\", isHorizontal ? \"flex-row\" : \"flex-col\", containerClassName)}\r\n style={getAnimationStyles()}\r\n onTouchStart={touchStart}\r\n onTouchMove={touchMove}\r\n onTouchEnd={touchEnd}\r\n onMouseDown={touchStart}\r\n onMouseMove={touchMove}\r\n onMouseUp={touchEnd}\r\n onMouseLeave={touchEnd}\r\n role=\"group\"\r\n aria-atomic=\"false\"\r\n aria-live={autoScroll ? \"off\" : \"polite\"}\r\n >\r\n {React.Children.map(children, (child, idx) => (\r\n <div\r\n key={idx}\r\n className={cn(\r\n \"shrink-0\",\r\n isHorizontal ? \"h-full\" : \"w-full\",\r\n animation === \"fade\" && idx !== currentIndex && \"opacity-0\",\r\n animation === \"scale\" && idx !== currentIndex && \"scale-95\",\r\n slideClassName\r\n )}\r\n style={{\r\n [isHorizontal ? \"width\" : \"height\"]: `${slideWidth}%`,\r\n }}\r\n role=\"group\"\r\n aria-roledescription=\"slide\"\r\n aria-label={`${idx + 1} of ${totalSlides}`}\r\n aria-hidden={idx < currentIndex || idx >= currentIndex + slidesToShow}\r\n >\r\n {child}\r\n </div>\r\n ))}\r\n </div>\r\n\r\n {/* Navigation arrows */}\r\n {showArrows && totalSlides > slidesToShow && (\r\n <>\r\n <Button\r\n onClick={scrollPrev}\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n icon={ChevronLeft}\r\n noHoverOverlay\r\n disabled={!loop && currentIndex === 0}\r\n className={cn(\r\n \"absolute top-1/2 -translate-y-1/2 hover:-translate-y-1/2 active:-translate-y-1/2 z-10 rounded-full will-change-transform backdrop-blur-0 hover:backdrop-blur-0 hover:bg-transparent border-0\",\r\n isHorizontal ? \"left-4\" : \"top-4 left-1/2 -translate-x-1/2 rotate-90\"\r\n )}\r\n aria-label=\"Previous slide\"\r\n />\r\n\r\n <Button\r\n onClick={scrollNext}\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n icon={ChevronRight}\r\n noHoverOverlay\r\n disabled={!loop && currentIndex >= maxIndex}\r\n className={cn(\r\n \"absolute top-1/2 -translate-y-1/2 hover:-translate-y-1/2 active:-translate-y-1/2 z-10 rounded-full will-change-transform backdrop-blur-0 hover:backdrop-blur-0 hover:bg-transparent border-0\",\r\n isHorizontal ? \"right-4\" : \"bottom-4 left-1/2 -translate-x-1/2 rotate-90\"\r\n )}\r\n aria-label=\"Next slide\"\r\n />\r\n </>\r\n )}\r\n\r\n {/* Dots indicators */}\r\n {showDots && totalSlides > slidesToShow && (\r\n <div\r\n className={cn(\r\n \"absolute flex gap-2 z-10\",\r\n isHorizontal ? \"bottom-4 left-1/2 -translate-x-1/2 flex-row\" : \"right-4 top-1/2 -translate-y-1/2 flex-col\"\r\n )}\r\n role=\"tablist\"\r\n aria-label=\"Carousel pagination\"\r\n >\r\n {Array.from({ length: maxIndex + 1 }, (_, idx) => (\r\n <button\r\n key={idx}\r\n onClick={() => scrollTo(idx)}\r\n className={cn(\r\n \"rounded-full transition-all focus:outline-none focus:ring-2 focus:ring-primary focus:ring-offset-2\",\r\n isHorizontal ? \"w-2 h-2\" : \"w-2 h-2\",\r\n idx === currentIndex ? `bg-primary ${isHorizontal ? \"w-6\" : \"h-6\"}` : \"bg-muted-foreground/50 hover:bg-muted-foreground/75\"\r\n )}\r\n aria-label={`Go to slide ${idx + 1}`}\r\n aria-selected={idx === currentIndex}\r\n role=\"tab\"\r\n />\r\n ))}\r\n </div>\r\n )}\r\n\r\n {/* Thumbnail navigation */}\r\n {showThumbnails && totalSlides > slidesToShow && (\r\n <div\r\n className={cn(\r\n \"absolute bottom-0 left-0 right-0 flex gap-2 p-4 bg-linear-to-t from-black/50 to-transparent overflow-x-auto\",\r\n isHorizontal ? \"flex-row\" : \"flex-col\"\r\n )}\r\n >\r\n {React.Children.map(children, (child, idx) => (\r\n <button\r\n key={idx}\r\n onClick={() => scrollTo(idx)}\r\n className={cn(\r\n \"shrink-0 w-16 h-16 rounded-md overflow-hidden border-2 transition-all focus:outline-none focus:ring-2 focus:ring-primary\",\r\n idx === currentIndex ? \"border-primary scale-110\" : \"border-transparent opacity-70 hover:opacity-100\"\r\n )}\r\n aria-label={`Thumbnail ${idx + 1}`}\r\n >\r\n {thumbnailRenderer ? thumbnailRenderer(child, idx) : child}\r\n </button>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\nexport default Carousel;\r\n","\"use client\";\n\nimport React from \"react\";\nimport { cn } from \"@/lib/utils/cn\";\n\nexport type IconComponent = React.ComponentType<{ className?: string }>;\n\nexport interface FallingIconsProps {\n icon?: IconComponent;\n imageUrl?: string; // Custom image URL to use instead of icon\n count?: number;\n className?: string;\n areaClassName?: string;\n colorClassName?: string;\n zIndex?: number;\n speedRange?: [number, number]; // seconds\n sizeRange?: [number, number]; // px\n horizontalDrift?: number; // px amplitude\n spin?: boolean;\n fullScreen?: boolean;\n // Randomize properties again each time a particle finishes a fall\n randomizeEachLoop?: boolean;\n // Modern UI enhancements\n glow?: boolean; // Add glow/shadow effect\n glowColor?: string; // Custom glow color\n glowIntensity?: number; // 0-1\n trail?: boolean; // Add particle trail effect\n trailLength?: number; // Number of trail particles (1-5)\n physics?: {\n gravity?: number; // 0.5-2, default 1\n windDirection?: number; // -1 (left) to 1 (right), default 0\n windStrength?: number; // 0-1\n rotation?: boolean; // Physics-based rotation\n };\n easingFunction?: \"linear\" | \"ease\" | \"ease-in\" | \"ease-out\" | \"ease-in-out\" | \"bounce\" | \"elastic\";\n}\n\ntype Particle = {\n leftPct: number;\n size: number;\n fallDur: number;\n delay: number;\n driftAmp: number;\n spinDur: number;\n key: number;\n};\n\nconst DEFAULT_COUNT = 24;\nconst DEFAULT_SPEED_RANGE: [number, number] = [6, 14];\nconst DEFAULT_SIZE_RANGE: [number, number] = [14, 28];\n\nexport default function FallingIcons({\n icon: Icon,\n imageUrl,\n count = DEFAULT_COUNT,\n className,\n areaClassName,\n colorClassName,\n zIndex = 10,\n speedRange = DEFAULT_SPEED_RANGE,\n sizeRange = DEFAULT_SIZE_RANGE,\n horizontalDrift = 24,\n spin = true,\n fullScreen = false,\n randomizeEachLoop = true,\n // Modern UI enhancements\n glow = false,\n glowColor = \"currentColor\",\n glowIntensity = 0.5,\n trail = false,\n trailLength = 3,\n physics,\n easingFunction = \"linear\",\n}: FallingIconsProps) {\n const uid = React.useId().replace(/[:]/g, \"\");\n const containerRef = React.useRef<HTMLDivElement | null>(null);\n const [fallDist, setFallDist] = React.useState<number | null>(null);\n const idRef = React.useRef(1);\n\n // Physics calculations\n const gravity = physics?.gravity ?? 1;\n const windDirection = physics?.windDirection ?? 0;\n const windStrength = physics?.windStrength ?? 0;\n const physicsRotation = physics?.rotation ?? false;\n\n // Easing function mapping\n const easingMap: Record<string, string> = {\n linear: \"linear\",\n ease: \"ease\",\n \"ease-in\": \"ease-in\",\n \"ease-out\": \"ease-out\",\n \"ease-in-out\": \"ease-in-out\",\n bounce: \"cubic-bezier(0.68, -0.55, 0.265, 1.55)\",\n elastic: \"cubic-bezier(0.175, 0.885, 0.32, 1.275)\",\n };\n\n const makeParticle = React.useCallback((): Particle => {\n const rnd = (min: number, max: number) => min + Math.random() * (max - min);\n return {\n leftPct: rnd(0, 100),\n size: rnd(sizeRange[0], sizeRange[1]),\n fallDur: rnd(speedRange[0], speedRange[1]) / gravity, // Apply gravity to speed\n delay: rnd(-10, 0),\n driftAmp: rnd(horizontalDrift * 0.5, horizontalDrift) + (windDirection * windStrength * 50), // Apply wind\n spinDur: rnd(2, 6),\n key: idRef.current++,\n };\n }, [sizeRange, speedRange, horizontalDrift, gravity, windDirection, windStrength]);\n\n const [particles, setParticles] = React.useState<Particle[]>([]);\n\n // Initialize particles\n React.useEffect(() => {\n const arr: Particle[] = Array.from({ length: Math.max(0, count) }).map(() => makeParticle());\n setParticles(arr);\n }, [count, makeParticle]);\n\n // Measure container height to drive fall distance in px\n React.useEffect(() => {\n if (fullScreen) {\n const measure = () => setFallDist(window.innerHeight + 200);\n measure();\n window.addEventListener(\"resize\", measure);\n return () => window.removeEventListener(\"resize\", measure);\n }\n\n const el = containerRef.current;\n if (!el) return;\n const measure = () => setFallDist(el.offsetHeight + 200);\n measure();\n const ResizeObserverCtor: any = (window as any).ResizeObserver;\n if (ResizeObserverCtor) {\n const ro: any = new ResizeObserverCtor(measure);\n ro.observe(el);\n return () => ro.disconnect();\n }\n window.addEventListener(\"resize\", measure);\n return () => window.removeEventListener(\"resize\", measure);\n }, [fullScreen]);\n\n const FallName = `uv-fall-${uid}`;\n const SwayName = `uv-sway-${uid}`;\n const SpinName = `uv-spin-${uid}`;\n const PopName = `uv-pop-${uid}`;\n const PhysicsSpinName = `uv-physics-spin-${uid}`;\n\n // Calculate glow styles\n const glowStyles = React.useMemo(() => {\n if (!glow) return {};\n const intensity = Math.max(0, Math.min(1, glowIntensity));\n return {\n filter: `drop-shadow(0 0 ${4 * intensity}px ${glowColor}) drop-shadow(0 0 ${8 * intensity}px ${glowColor})`,\n };\n }, [glow, glowColor, glowIntensity]);\n\n // Provide a minimal fallback icon (circle) if none is passed\n const FallbackIcon = React.useMemo<IconComponent>(() => (props) => (\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\" {...props}>\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n </svg>\n ), []);\n\n // Use custom image if provided, otherwise use icon\n const TheIcon = imageUrl\n ? ({ className: imgClassName }: { className?: string }) => (\n <img\n src={imageUrl}\n alt=\"\"\n className={cn(\"w-full h-full object-cover rounded-sm\", imgClassName)}\n draggable={false}\n />\n )\n : (Icon || FallbackIcon);\n\n return (\n <div\n ref={containerRef}\n className={cn(\n fullScreen\n ? \"fixed inset-0 overflow-hidden pointer-events-none\"\n : \"relative w-full h-full overflow-hidden\",\n areaClassName\n )}\n style={{ zIndex }}\n >\n <style>{`\n @keyframes ${FallName} {\n 0% { transform: translate3d(0, -10vh, 0); opacity: 0; }\n 10% { opacity: 1; }\n 100% { transform: translate3d(0, var(--fall, 120vh), 0); opacity: 0.95; }\n }\n @keyframes ${SwayName} {\n 0% { transform: translateX(0); }\n 50% { transform: translateX(var(--amp, 16px)); }\n 100% { transform: translateX(0); }\n }\n @keyframes ${SpinName} {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n }\n @keyframes ${PopName} {\n 0% { opacity: 1; transform: scale(1); }\n 100% { opacity: 0; transform: scale(0.3); }\n }\n @keyframes ${PhysicsSpinName} {\n 0% { transform: rotate(0deg) scale(1); }\n 25% { transform: rotate(90deg) scale(1.05); }\n 50% { transform: rotate(180deg) scale(1); }\n 75% { transform: rotate(270deg) scale(1.05); }\n 100% { transform: rotate(360deg) scale(1); }\n }\n @media (prefers-reduced-motion: reduce) {\n .uv-falling-particle {\n animation-duration: 0.01ms !important;\n animation-iteration-count: 1 !important;\n }\n }\n `}</style>\n\n <div\n className={cn(\n \"absolute inset-0 pointer-events-none\",\n className\n )}\n aria-hidden\n >\n {particles.map((p, i) => {\n const swayDuration = p.fallDur * (0.8 + (i % 5) * 0.05);\n const spinDuration = Math.max(1, p.spinDur);\n const handlePop: React.MouseEventHandler<HTMLSpanElement> = () => {\n // Replace particle to simulate vanish + respawn\n setParticles((prev) => {\n const next = prev.slice();\n const np = makeParticle();\n np.delay = -Math.random() * 8;\n next[i] = np;\n return next;\n });\n };\n\n // Render trail particles\n const trailParticles = trail ? Array.from({ length: Math.min(5, Math.max(1, trailLength)) }) : [];\n\n return (\n <React.Fragment key={p.key}>\n {/* Trail particles */}\n {trail && trailParticles.map((_, trailIndex) => {\n const trailDelay = p.delay - (trailIndex + 1) * 0.15;\n const trailOpacity = 1 - (trailIndex + 1) * (1 / (trailParticles.length + 1));\n const trailScale = 1 - (trailIndex + 1) * 0.15;\n\n return (\n <span\n key={`${p.key}-trail-${trailIndex}`}\n className={cn(\"absolute top-0 will-change-transform pointer-events-none uv-falling-particle\", colorClassName)}\n style={{\n left: `${p.leftPct}%`,\n animationDelay: `${trailDelay}s`,\n animationDuration: `${p.fallDur}s`,\n animationName: FallName,\n animationTimingFunction: easingMap[easingFunction] || \"linear\",\n animationIterationCount: \"infinite\",\n opacity: trailOpacity * 0.4,\n [\"--fall\" as any]: `${fallDist ?? (typeof window !== 'undefined' ? window.innerHeight + 200 : 1200)}px`,\n } as React.CSSProperties}\n >\n <span\n className=\"inline-block uv-sway\"\n style={{\n transform: `translateX(-50%) scale(${trailScale})`,\n animationName: SwayName,\n animationDuration: `${swayDuration}s`,\n animationTimingFunction: \"ease-in-out\",\n animationIterationCount: \"infinite\",\n [\"--amp\" as any]: `${Math.round(p.driftAmp)}px`,\n } as React.CSSProperties}\n >\n <span\n className=\"block\"\n style={{\n width: p.size,\n height: p.size,\n ...glowStyles,\n } as React.CSSProperties}\n >\n <TheIcon className={cn(\"w-full h-full text-primary/70\", colorClassName)} />\n </span>\n </span>\n </span>\n );\n })}\n\n {/* Main particle */}\n <span\n className={cn(\"absolute top-0 will-change-transform pointer-events-auto uv-falling-particle\", colorClassName)}\n style={{\n left: `${p.leftPct}%`,\n animationDelay: `${p.delay}s`,\n animationDuration: `${p.fallDur}s`,\n animationName: FallName,\n animationTimingFunction: easingMap[easingFunction] || \"linear\",\n animationIterationCount: \"infinite\",\n [\"--fall\" as any]: `${fallDist ?? (typeof window !== 'undefined' ? window.innerHeight + 200 : 1200)}px`,\n } as React.CSSProperties}\n onMouseEnter={handlePop}\n onAnimationIteration={(ev: React.AnimationEvent<HTMLSpanElement>) => {\n // Ignore bubbled events from inner sway/spin animations\n if (ev.currentTarget !== ev.target) return;\n if (!randomizeEachLoop) return;\n if (ev.animationName !== FallName) return;\n setParticles((prev) => {\n const next = prev.slice();\n const np = makeParticle();\n // Start immediately on next cycle\n np.delay = -Math.random() * 4;\n next[i] = np;\n return next;\n });\n }}\n >\n <span\n className=\"inline-block uv-sway\"\n style={{\n transform: `translateX(-50%)`,\n animationName: SwayName,\n animationDuration: `${swayDuration}s`,\n animationTimingFunction: \"ease-in-out\",\n animationIterationCount: \"infinite\",\n [\"--amp\" as any]: `${Math.round(p.driftAmp)}px`,\n } as React.CSSProperties}\n >\n <span\n className={cn(\n \"block uv-spin hover:animate-[var(--popName)_0.35s_ease-out_forwards]\",\n physicsRotation\n ? \"animate-[var(--physicsSpinName)_var(--spinDur)_ease-in-out_infinite]\"\n : spin && \"animate-[var(--spinName)_var(--spinDur)_linear_infinite]\"\n )}\n style={{\n width: p.size,\n height: p.size,\n [\"--spinName\" as any]: SpinName,\n [\"--physicsSpinName\" as any]: PhysicsSpinName,\n [\"--spinDur\" as any]: `${spinDuration}s`,\n [\"--popName\" as any]: PopName,\n ...glowStyles,\n } as React.CSSProperties}\n >\n <TheIcon className={cn(\"w-full h-full text-primary/70\", colorClassName)} />\n </span>\n </span>\n </span>\n </React.Fragment>\n );\n })}\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"@/lib/utils/cn\";\nimport { ChevronRight } from \"lucide-react\";\n\ntype Variant = \"plain\" | \"outlined\" | \"soft\" | \"bordered\" | \"card\" | \"flush\" | \"striped\";\ntype Size = \"xs\" | \"sm\" | \"md\" | \"lg\";\n\nexport interface ListProps extends React.HTMLAttributes<HTMLUListElement> {\n as?: \"ul\" | \"ol\" | \"div\";\n ordered?: boolean;\n variant?: Variant;\n size?: Size;\n divided?: boolean;\n inset?: boolean; // inner padding around items\n hoverable?: boolean;\n /** Show loading skeleton */\n loading?: boolean;\n /** Number of skeleton items to show */\n loadingCount?: number;\n /** Show empty state when no children */\n emptyText?: string;\n /** Make items more compact */\n dense?: boolean;\n}\n\nexport interface ListItemProps extends React.HTMLAttributes<HTMLLIElement> {\n as?: \"li\" | \"div\" | \"a\" | \"button\";\n selected?: boolean;\n disabled?: boolean;\n href?: string;\n label?: React.ReactNode;\n description?: React.ReactNode;\n leftIcon?: React.ComponentType<{ className?: string }>;\n rightIcon?: React.ComponentType<{ className?: string }>;\n /** Show avatar on the left */\n avatar?: string | React.ReactNode;\n /** Show badge/tag */\n badge?: React.ReactNode;\n /** Badge color variant */\n badgeVariant?: \"default\" | \"success\" | \"warning\" | \"error\" | \"info\";\n /** Action button on hover */\n action?: React.ReactNode;\n /** Make item collapsible */\n collapsible?: boolean;\n /** Expanded state for collapsible */\n expanded?: boolean;\n /** Callback when expanded state changes */\n onExpandChange?: (expanded: boolean) => void;\n /** Content to show when expanded */\n expandContent?: React.ReactNode;\n}\n\nconst SIZE_STYLES: Record<Size, { itemPad: string; densePad: string; label: string; desc: string; icon: string; avatar: string }> = {\n xs: { itemPad: \"px-2 py-1.5\", densePad: \"px-2 py-1\", label: \"text-xs\", desc: \"text-[11px]\", icon: \"h-3.5 w-3.5\", avatar: \"h-6 w-6\" },\n sm: { itemPad: \"px-3 py-2\", densePad: \"px-3 py-1.5\", label: \"text-[13px]\", desc: \"text-[12px]\", icon: \"h-4 w-4\", avatar: \"h-8 w-8\" },\n md: { itemPad: \"px-4 py-2.5\", densePad: \"px-4 py-2\", label: \"text-sm\", desc: \"text-xs\", icon: \"h-5 w-5\", avatar: \"h-10 w-10\" },\n lg: { itemPad: \"px-5 py-3\", densePad: \"px-5 py-2.5\", label: \"text-base\", desc: \"text-sm\", icon: \"h-5 w-5\", avatar: \"h-12 w-12\" },\n};\n\nconst BADGE_VARIANTS = {\n default: \"bg-muted text-muted-foreground\",\n success: \"bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400\",\n warning: \"bg-yellow-100 text-yellow-700 dark:bg-yellow-900/30 dark:text-yellow-400\",\n error: \"bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-400\",\n info: \"bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-400\",\n};\n\n// Skeleton component for loading state\nconst ListItemSkeleton: React.FC<{ size: Size }> = ({ size }) => {\n const sz = SIZE_STYLES[size];\n return (\n <div className={cn(\"flex items-center gap-3 animate-pulse\", sz.itemPad)}>\n <div className={cn(\"rounded-full bg-muted shrink-0\", sz.avatar)} />\n <div className=\"flex-1 space-y-2\">\n <div className=\"h-4 bg-muted rounded w-3/4\" />\n <div className=\"h-3 bg-muted rounded w-1/2\" />\n </div>\n </div>\n );\n};\n\nconst ListRoot = React.forwardRef<HTMLUListElement, ListProps>(\n (\n {\n as = \"ul\",\n ordered,\n variant = \"plain\",\n size = \"md\",\n divided = false,\n inset = false,\n hoverable = true,\n loading = false,\n loadingCount = 3,\n emptyText,\n dense = false,\n className,\n children,\n ...rest\n },\n ref\n ) => {\n const Comp: any = ordered ? \"ol\" : as;\n const childCount = React.Children.count(children);\n const hasChildren = childCount > 0;\n\n // Variant styles\n const variantClasses = {\n plain: \"\",\n outlined: \"rounded-lg md:rounded-xl bg-card text-card-foreground border border-border shadow-sm\",\n soft: \"rounded-lg bg-muted/40 border border-border/60\",\n bordered: \"border border-border rounded-lg\",\n card: \"rounded-lg bg-card shadow-md border border-border\",\n flush: \"\",\n striped: \"rounded-lg border border-border overflow-hidden\",\n };\n\n // Loading state\n if (loading) {\n return (\n <Comp ref={ref} className={cn(\"group/list\", variantClasses[variant], inset && \"p-1.5 md:p-2\", divided && \"divide-y divide-border/60\", className)} {...rest}>\n {Array.from({ length: loadingCount }).map((_, i) => (\n <ListItemSkeleton key={i} size={size} />\n ))}\n </Comp>\n );\n }\n\n // Empty state\n if (!hasChildren && emptyText) {\n return (\n <Comp ref={ref} className={cn(\"group/list\", variantClasses[variant], inset && \"p-1.5 md:p-2\", className)} {...rest}>\n <div className=\"text-center py-8 text-muted-foreground text-sm\">{emptyText}</div>\n </Comp>\n );\n }\n\n return (\n <Comp\n ref={ref}\n className={cn(\n \"group/list\",\n variantClasses[variant],\n inset && \"p-1.5 md:p-2\",\n divided && \"divide-y divide-border/60\",\n variant === \"striped\" && \"[&>*:nth-child(even)]:bg-muted/30\",\n className\n )}\n {...rest}\n >\n {React.Children.map(children, (child, idx) => {\n if (!React.isValidElement(child)) return child;\n const childClass = cn(\n (child.props as any)?.className,\n hoverable && variant !== \"flush\" && \"hover:bg-accent/50 focus:bg-accent/60 focus:outline-none transition-colors\",\n variant === \"flush\" && \"hover:bg-accent/30\"\n );\n return React.cloneElement(child as any, {\n className: childClass,\n \"data-first\": idx === 0 ? \"true\" : undefined,\n \"data-last\": idx === childCount - 1 ? \"true\" : undefined,\n \"data-size\": size,\n \"data-dense\": dense ? \"true\" : undefined,\n });\n })}\n </Comp>\n );\n }\n);\n\nListRoot.displayName = \"List\";\n\nexport const ListItem = React.forwardRef<HTMLLIElement, ListItemProps>(\n (\n {\n as = \"li\",\n selected = false,\n disabled = false,\n href,\n label,\n description,\n leftIcon: Left,\n rightIcon: Right,\n avatar,\n badge,\n badgeVariant = \"default\",\n action,\n collapsible = false,\n expanded: controlledExpanded,\n onExpandChange,\n expandContent,\n className,\n children,\n ...rest\n },\n ref\n ) => {\n const [internalExpanded, setInternalExpanded] = React.useState(false);\n const isExpanded = controlledExpanded !== undefined ? controlledExpanded : internalExpanded;\n\n const sizeAttr = (rest as any)[\"data-size\"] as Size | undefined;\n const denseAttr = (rest as any)[\"data-dense\"] as string | undefined;\n const isDense = denseAttr === \"true\";\n const resolvedSize: Size = sizeAttr && (sizeAttr === \"xs\" || sizeAttr === \"sm\" || sizeAttr === \"md\" || sizeAttr === \"lg\") ? sizeAttr : \"md\";\n const sz = SIZE_STYLES[resolvedSize];\n const padding = isDense ? sz.densePad : sz.itemPad;\n\n const toggleExpanded = () => {\n const newExpanded = !isExpanded;\n if (onExpandChange) {\n onExpandChange(newExpanded);\n } else {\n setInternalExpanded(newExpanded);\n }\n };\n\n const headerProps = collapsible\n ? {\n role: \"button\" as const,\n tabIndex: disabled ? -1 : 0,\n onClick: disabled ? undefined : () => toggleExpanded(),\n onKeyDown: (e: React.KeyboardEvent<HTMLDivElement>) => {\n if (disabled) return;\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n toggleExpanded();\n }\n },\n }\n : {};\n\n const inner = (\n <>\n <div\n className={cn(\"flex items-center gap-3\", padding, \"group/item relative\")}\n {...headerProps}\n >\n {/* Avatar */}\n {avatar && (\n <div className={cn(\"shrink-0\", sz.avatar)}>\n {typeof avatar === \"string\" ? (\n <img src={avatar} alt=\"\" className={cn(\"rounded-full object-cover\", sz.avatar)} />\n ) : (\n avatar\n )}\n </div>\n )}\n\n {/* Left Icon */}\n {Left && !avatar && (\n <span className={cn(\"text-muted-foreground shrink-0\", sz.icon)}>\n <Left className={cn(sz.icon)} />\n </span>\n )}\n\n {/* Content */}\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-2\">\n {label && <div className={cn(sz.label, \"text-foreground font-medium truncate\")}>{label}</div>}\n {badge && (\n <span className={cn(\"px-2 py-0.5 rounded-full text-[11px] font-medium shrink-0\", BADGE_VARIANTS[badgeVariant])}>{badge}</span>\n )}\n </div>\n {description && <div className={cn(sz.desc, \"text-muted-foreground truncate mt-0.5\")}>{description}</div>}\n {children && <div className=\"mt-1\">{children}</div>}\n </div>\n\n {/* Action Button */}\n {action && <div className=\"opacity-0 group-hover/item:opacity-100 transition-opacity shrink-0\">{action}</div>}\n\n {/* Right Icon or Collapsible Icon */}\n {collapsible ? (\n <span\n className={cn(\n \"text-muted-foreground shrink-0 transition-transform cursor-pointer select-none\",\n sz.icon,\n isExpanded && \"rotate-90\"\n )}\n >\n <ChevronRight className={cn(sz.icon)} />\n </span>\n ) : (\n Right && (\n <span className={cn(\"text-muted-foreground shrink-0\", sz.icon)}>\n <Right className={cn(sz.icon)} />\n </span>\n )\n )}\n </div>\n\n {/* Expanded Content */}\n {collapsible && isExpanded && expandContent && (\n <div className={cn(\"border-t border-border/50 bg-muted/20\", padding, \"pt-3\")}>{expandContent}</div>\n )}\n </>\n );\n\n const baseCls = cn(\n \"relative w-full\",\n selected && \"bg-primary/10 ring-1 ring-primary/30\",\n disabled && \"opacity-60 cursor-not-allowed\",\n className\n );\n\n if (href) {\n const A: any = as === \"a\" ? \"a\" : \"a\";\n return (\n <A ref={ref as any} href={href} className={cn(baseCls, \"block\")} {...(rest as any)}>\n {inner}\n </A>\n );\n }\n if (as === \"button\" && !collapsible) {\n return (\n <button\n ref={ref as any}\n type=\"button\"\n className={cn(baseCls, \"text-left block w-full\")}\n {...(rest as any)}\n >\n {inner}\n </button>\n );\n }\n if (collapsible) {\n // For collapsible items, only the chevron icon handles toggle.\n // The container itself is non-clickable so clicking expandContent\n // doesn't collapse the section.\n return (\n <div\n ref={ref as any}\n className={cn(baseCls, \"text-left block w-full\")}\n {...(rest as any)}\n >\n {inner}\n </div>\n );\n }\n const Comp: any = as;\n return (\n <Comp ref={ref as any} className={baseCls} {...rest}>\n {inner}\n </Comp>\n );\n }\n);\n\nListItem.displayName = \"List.Item\";\n\nconst List = Object.assign(ListRoot, { Item: ListItem });\n\nexport default List;\n","\"use client\";\n\nimport * as React from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { cn } from \"@/lib/utils/cn\";\n\ntype WatermarkPreset = \"confidential\" | \"draft\" | \"sample\" | \"copyright\" | \"doNotCopy\" | \"internal\";\ntype WatermarkPattern = \"diagonal\" | \"grid\" | \"straight\";\ntype AnimationVariant = \"fade\" | \"slide\" | \"scale\" | \"pulse\" | \"none\";\n\nexport interface WatermarkProps extends React.HTMLAttributes<HTMLDivElement> {\n text?: string | string[]; // text watermark (support multi-line)\n image?: string; // image src watermark\n width?: number; // pattern tile width (content box)\n height?: number; // pattern tile height (content box)\n gapX?: number; // horizontal gap between tiles\n gapY?: number; // vertical gap between tiles\n rotate?: number; // degrees\n fontSize?: number;\n fontFamily?: string;\n fontWeight?: number | string;\n fontStyle?: \"normal\" | \"italic\";\n color?: string; // text color\n /** Use gradient colors */\n gradient?: string;\n opacity?: number; // overall layer opacity (0..1)\n offsetLeft?: number; // background-position x\n offsetTop?: number; // background-position y\n zIndex?: number;\n fullPage?: boolean; // fixed overlay over entire viewport\n /** Preset watermark styles */\n preset?: WatermarkPreset;\n /** Pattern layout */\n pattern?: WatermarkPattern;\n /** Enable interactive mode (click to toggle) */\n interactive?: boolean;\n /** Animation effect */\n animate?: boolean;\n /** Animation variant */\n animationVariant?: AnimationVariant;\n /** Enable backdrop blur */\n blur?: boolean;\n /** Blur amount in pixels */\n blurAmount?: number;\n /** Enable text shadow */\n textShadow?: boolean;\n /** Text shadow color */\n shadowColor?: string;\n /** Enable dark mode auto-adjust */\n darkMode?: boolean;\n /** Class for the overlay layer */\n overlayClassName?: string;\n /** ARIA label for accessibility */\n ariaLabel?: string;\n}\n\n// Preset configurations\nconst PRESETS: Record<WatermarkPreset, { text: string; color: string; rotate: number; fontSize: number; fontWeight: string }> = {\n confidential: { text: \"CONFIDENTIAL\", color: \"rgba(220, 38, 38, 0.15)\", rotate: -22, fontSize: 16, fontWeight: \"bold\" },\n draft: { text: \"DRAFT\", color: \"rgba(59, 130, 246, 0.15)\", rotate: -22, fontSize: 18, fontWeight: \"bold\" },\n sample: { text: \"SAMPLE\", color: \"rgba(168, 85, 247, 0.15)\", rotate: -22, fontSize: 16, fontWeight: \"600\" },\n copyright: { text: \"© Copyright\", color: \"rgba(0, 0, 0, 0.1)\", rotate: 0, fontSize: 12, fontWeight: \"normal\" },\n doNotCopy: { text: \"DO NOT COPY\", color: \"rgba(234, 88, 12, 0.15)\", rotate: -22, fontSize: 14, fontWeight: \"bold\" },\n internal: { text: \"INTERNAL USE ONLY\", color: \"rgba(156, 163, 175, 0.15)\", rotate: -22, fontSize: 13, fontWeight: \"600\" },\n};\n\nfunction useWatermarkDataURL(opts: {\n text?: string | string[];\n image?: string;\n width?: number;\n height?: number;\n gapX?: number;\n gapY?: number;\n rotate?: number;\n fontSize?: number;\n fontFamily?: string;\n fontWeight?: number | string;\n fontStyle?: \"normal\" | \"italic\";\n color?: string;\n gradient?: string;\n pattern?: WatermarkPattern;\n textShadow?: boolean;\n shadowColor?: string;\n}) {\n const [url, setUrl] = React.useState<string | null>(null);\n React.useEffect(() => {\n let cancelled = false;\n\n const text = opts.text;\n const image = opts.image;\n const width = opts.width ?? 180;\n const height = opts.height ?? 100;\n const gapX = opts.gapX ?? 16;\n const gapY = opts.gapY ?? 16;\n const rotate = opts.rotate ?? -22;\n const fontSize = opts.fontSize ?? 14;\n const fontFamily = opts.fontFamily ?? \"ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial\";\n const fontWeight = opts.fontWeight ?? \"normal\";\n const fontStyle = opts.fontStyle ?? \"normal\";\n const color = opts.color ?? \"rgba(0,0,0,0.15)\";\n const gradient = opts.gradient;\n const pattern = opts.pattern ?? \"diagonal\";\n\n const tileW = width + gapX;\n const tileH = height + gapY;\n const canvas = document.createElement(\"canvas\");\n canvas.width = tileW;\n canvas.height = tileH;\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) return;\n\n const drawText = () => {\n ctx.clearRect(0, 0, tileW, tileH);\n ctx.save();\n\n // Grid pattern: no translate, draw at fixed positions\n if (pattern === \"grid\") {\n ctx.translate(width / 2, height / 2);\n } else {\n ctx.translate(tileW / 2, tileH / 2);\n }\n\n // Apply rotation based on pattern\n if (pattern === \"diagonal\") {\n ctx.rotate((rotate * Math.PI) / 180);\n } else if (pattern === \"straight\" || pattern === \"grid\") {\n // No rotation for straight and grid patterns\n }\n\n if (text) {\n const textLines = Array.isArray(text) ? text : [text];\n ctx.font = `${fontStyle} ${fontWeight} ${fontSize}px ${fontFamily}`;\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"middle\";\n\n // Add text shadow if enabled\n if (opts.textShadow) {\n const shadowCol = opts.shadowColor || \"rgba(255, 255, 255, 0.5)\";\n ctx.shadowColor = shadowCol;\n ctx.shadowBlur = 8;\n ctx.shadowOffsetX = 0;\n ctx.shadowOffsetY = 0;\n }\n\n // Use gradient if provided\n if (gradient) {\n const splitStops = (input: string) => {\n const s = input.trim();\n // Handle CSS like: linear-gradient(to bottom, rgba(...), #fff)\n let inside = s;\n const lg = s.toLowerCase();\n if (lg.startsWith(\"linear-gradient\")) {\n const start = s.indexOf(\"(\");\n const end = s.lastIndexOf(\")\");\n if (start >= 0 && end > start) inside = s.slice(start + 1, end);\n }\n const parts: string[] = [];\n let buf = \"\";\n let depth = 0;\n for (let i = 0; i < inside.length; i++) {\n const ch = inside[i];\n if (ch === \"(\") depth++;\n if (ch === \")\") depth = Math.max(0, depth - 1);\n if (ch === \",\" && depth === 0) {\n parts.push(buf.trim());\n buf = \"\";\n } else {\n buf += ch;\n }\n }\n if (buf.trim()) parts.push(buf.trim());\n // If first looks like direction/angle, drop it\n if (parts.length > 0) {\n const first = parts[0].toLowerCase();\n if (first.startsWith(\"to \") || first.endsWith(\"deg\") || first.endsWith(\"rad\")) {\n parts.shift();\n }\n }\n return parts.filter(Boolean);\n };\n\n const stops = splitStops(gradient);\n const gradientObj = ctx.createLinearGradient(0, -height / 2, 0, height / 2);\n stops.forEach((c, i) => {\n // Support optional \"color percent\" syntax\n const tokens = c.split(/\\s+/).filter(Boolean);\n const col = tokens[0];\n const pos = tokens[1] ? parseFloat(tokens[1]) / 100 : i / Math.max(1, (stops.length - 1));\n try {\n gradientObj.addColorStop(isFinite(pos) ? Math.min(Math.max(pos, 0), 1) : i / Math.max(1, (stops.length - 1)), col);\n } catch {\n // Fallback: ignore invalid stop\n }\n });\n ctx.fillStyle = gradientObj;\n } else {\n ctx.fillStyle = color;\n }\n\n // Draw multi-line text\n const lineHeight = fontSize * 1.2;\n const totalHeight = textLines.length * lineHeight;\n const startY = -(totalHeight / 2) + lineHeight / 2;\n\n textLines.forEach((line, index) => {\n const y = startY + index * lineHeight;\n ctx.fillText(line, 0, y, width);\n });\n }\n ctx.restore();\n if (!cancelled) setUrl(canvas.toDataURL());\n };\n\n if (image) {\n const img = new Image();\n img.crossOrigin = \"anonymous\";\n img.onload = () => {\n ctx!.clearRect(0, 0, tileW, tileH);\n ctx!.save();\n ctx!.translate(tileW / 2, tileH / 2);\n ctx!.rotate((rotate * Math.PI) / 180);\n const drawW = width;\n const drawH = height;\n ctx!.drawImage(img, -drawW / 2, -drawH / 2, drawW, drawH);\n ctx!.restore();\n if (!cancelled) setUrl(canvas.toDataURL());\n };\n img.onerror = drawText;\n img.src = image;\n } else {\n drawText();\n }\n\n return () => {\n cancelled = true;\n };\n }, [opts.text, opts.image, opts.width, opts.height, opts.gapX, opts.gapY, opts.rotate, opts.fontSize, opts.fontFamily, opts.fontWeight, opts.fontStyle, opts.color, opts.gradient, opts.pattern, opts.textShadow, opts.shadowColor]);\n\n return url;\n}\n\n// Animation variants CSS classes\nconst getAnimationClass = (variant: AnimationVariant, visible: boolean) => {\n if (variant === \"none\") return \"\";\n\n const animations = {\n fade: visible ? \"animate-in fade-in duration-300\" : \"animate-out fade-out duration-300\",\n slide: visible ? \"animate-in slide-in-from-top duration-500\" : \"animate-out slide-out-to-top duration-500\",\n scale: visible ? \"animate-in zoom-in duration-300\" : \"animate-out zoom-out duration-300\",\n pulse: visible ? \"animate-pulse\" : \"opacity-0\",\n };\n\n return animations[variant] || \"\";\n};\n\nconst Watermark: React.FC<WatermarkProps> = ({\n text: textProp,\n image,\n width = 180,\n height = 100,\n gapX = 16,\n gapY = 16,\n rotate: rotateProp,\n fontSize: fontSizeProp,\n fontFamily = \"ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial\",\n fontWeight: fontWeightProp,\n fontStyle: fontStyleProp,\n color: colorProp,\n gradient,\n opacity = 1,\n offsetLeft = 0,\n offsetTop = 0,\n zIndex = 40,\n fullPage = false,\n preset,\n pattern = \"diagonal\",\n interactive = false,\n animate = false,\n animationVariant = \"fade\",\n blur = false,\n blurAmount = 4,\n textShadow = false,\n shadowColor,\n darkMode = false,\n overlayClassName,\n ariaLabel,\n className,\n style,\n children,\n ...rest\n}) => {\n const [visible, setVisible] = React.useState(true);\n const [isDark, setIsDark] = React.useState(false);\n\n // Detect dark mode\n React.useEffect(() => {\n if (!darkMode) return;\n\n const checkDarkMode = () => {\n const isDarkMode =\n document.documentElement.classList.contains(\"dark\") ||\n window.matchMedia(\"(prefers-color-scheme: dark)\").matches;\n setIsDark(isDarkMode);\n };\n\n checkDarkMode();\n\n // Listen for theme changes\n const observer = new MutationObserver(checkDarkMode);\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: [\"class\"],\n });\n\n const mediaQuery = window.matchMedia(\"(prefers-color-scheme: dark)\");\n mediaQuery.addEventListener(\"change\", checkDarkMode);\n\n return () => {\n observer.disconnect();\n mediaQuery.removeEventListener(\"change\", checkDarkMode);\n };\n }, [darkMode]);\n\n // Apply preset if provided\n const presetConfig = preset ? PRESETS[preset] : null;\n const text = textProp ?? presetConfig?.text;\n const color = colorProp ?? presetConfig?.color ?? \"rgba(0,0,0,0.15)\";\n const rotate = rotateProp ?? presetConfig?.rotate ?? -22;\n const fontSize = fontSizeProp ?? presetConfig?.fontSize ?? 14;\n const fontWeight = fontWeightProp ?? presetConfig?.fontWeight ?? \"normal\";\n const fontStyle = fontStyleProp ?? \"normal\";\n\n // Adjust opacity for dark mode\n const finalOpacity = darkMode && isDark ? opacity * 1.3 : opacity;\n\n const dataURL = useWatermarkDataURL({\n text,\n image,\n width,\n height,\n gapX,\n gapY,\n rotate,\n fontSize,\n fontFamily,\n fontWeight,\n fontStyle,\n color,\n gradient,\n pattern,\n textShadow,\n shadowColor,\n });\n\n const overlayStyle: React.CSSProperties = {\n position: fullPage ? (\"fixed\" as const) : (\"absolute\" as const),\n top: 0,\n left: 0,\n zIndex,\n opacity: visible ? finalOpacity : 0,\n backgroundRepeat: \"repeat\",\n backgroundPosition: `${offsetLeft}px ${offsetTop}px`,\n transition: animate && animationVariant === \"fade\" ? \"opacity 0.3s ease\" : undefined,\n };\n if (fullPage) {\n (overlayStyle as any).right = 0;\n (overlayStyle as any).bottom = 0;\n } else {\n overlayStyle.width = \"100%\";\n overlayStyle.height = \"100%\";\n }\n if (dataURL) overlayStyle.backgroundImage = `url(${dataURL})`;\n\n const animationClass = animate ? getAnimationClass(animationVariant, visible) : \"\";\n const blurClass = blur ? `backdrop-blur-[${blurAmount}px]` : \"\";\n\n const overlay = (\n <div\n role={interactive ? \"button\" : undefined}\n aria-label={ariaLabel || (interactive ? \"Toggle watermark visibility\" : \"Watermark overlay\")}\n aria-hidden={!interactive}\n tabIndex={interactive ? 0 : undefined}\n className={cn(\n interactive ? \"cursor-pointer\" : \"pointer-events-none\",\n blurClass,\n animationClass,\n overlayClassName\n )}\n style={overlayStyle}\n onClick={interactive ? () => setVisible(!visible) : undefined}\n onKeyDown={\n interactive\n ? (e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n setVisible(!visible);\n }\n }\n : undefined\n }\n />\n );\n\n if (fullPage) {\n return (\n <>\n {children}\n {typeof window !== \"undefined\" ? createPortal(overlay, document.body) : null}\n </>\n );\n }\n\n return (\n <div className={cn(\"relative\", className)} style={style} {...rest}>\n {children}\n {overlay}\n </div>\n );\n};\n\nexport default Watermark;\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"@/lib/utils/cn\";\nimport { ChevronDown } from \"lucide-react\";\n\ntype Align = \"left\" | \"right\" | \"alternate\";\ntype Variant = \"default\" | \"outlined\" | \"card\" | \"minimal\" | \"modern\" | \"gradient\";\ntype Size = \"sm\" | \"md\" | \"lg\" | \"xl\";\ntype Mode = \"vertical\" | \"horizontal\";\ntype LineStyle = \"solid\" | \"dashed\" | \"dotted\";\n\nexport interface TimelineProps extends React.HTMLAttributes<HTMLDivElement> {\n align?: Align;\n variant?: Variant;\n size?: Size;\n mode?: Mode;\n lineColor?: string;\n lineStyle?: LineStyle;\n items?: TimelineItemProps[];\n itemClassName?: string;\n /** Animate items on mount */\n animate?: boolean;\n /** Compact spacing */\n dense?: boolean;\n /** Show connecting line */\n showLine?: boolean;\n}\n\nexport interface TimelineItemProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'> {\n title?: React.ReactNode;\n description?: React.ReactNode;\n time?: React.ReactNode;\n icon?: React.ComponentType<{ className?: string }>;\n status?: \"default\" | \"primary\" | \"success\" | \"warning\" | \"error\" | \"info\";\n // Override dot and line color\n color?: string;\n // Mark current/active step\n active?: boolean;\n /** Custom dot content */\n dot?: React.ReactNode;\n /** Make item collapsible */\n collapsible?: boolean;\n /** Expanded state for collapsible */\n expanded?: boolean;\n /** Callback when expanded state changes */\n onExpandChange?: (expanded: boolean) => void;\n /** Content to show when expanded */\n expandContent?: React.ReactNode;\n /** Custom badge/tag */\n badge?: React.ReactNode;\n}\n\nconst SIZE_STYLE: Record<Size, { dot: string; iconDot: string; padY: string; densePadY: string; title: string; desc: string; time: string; icon: string }> = {\n sm: { dot: \"h-2.5 w-2.5\", iconDot: \"h-6 w-6\", padY: \"py-3\", densePadY: \"py-2\", title: \"text-sm\", desc: \"text-xs\", time: \"text-[11px]\", icon: \"h-3.5 w-3.5\" },\n md: { dot: \"h-3 w-3\", iconDot: \"h-8 w-8\", padY: \"py-4\", densePadY: \"py-2.5\", title: \"text-base\", desc: \"text-sm\", time: \"text-xs\", icon: \"h-4 w-4\" },\n lg: { dot: \"h-3.5 w-3.5\", iconDot: \"h-10 w-10\", padY: \"py-5\", densePadY: \"py-3\", title: \"text-lg\", desc: \"text-sm\", time: \"text-xs\", icon: \"h-5 w-5\" },\n xl: { dot: \"h-4 w-4\", iconDot: \"h-12 w-12\", padY: \"py-6\", densePadY: \"py-3.5\", title: \"text-xl\", desc: \"text-base\", time: \"text-sm\", icon: \"h-6 w-6\" },\n};\n\nconst STATUS_COLOR: Record<NonNullable<TimelineItemProps[\"status\"]>, string> = {\n default: \"bg-muted/60\",\n primary: \"bg-primary\",\n success: \"bg-green-500\",\n warning: \"bg-yellow-500\",\n error: \"bg-red-500\",\n info: \"bg-blue-500\",\n};\n\nconst TimelineContext = React.createContext<{\n align: Align;\n variant: Variant;\n size: Size;\n mode: Mode;\n lineColor?: string;\n lineStyle: LineStyle;\n itemClassName?: string;\n animate: boolean;\n dense: boolean;\n showLine: boolean;\n} | null>(null);\n\nconst LINE_STYLE_MAP: Record<LineStyle, string> = {\n solid: \"border-solid\",\n dashed: \"border-dashed\",\n dotted: \"border-dotted\",\n};\n\nconst Marker: React.FC<{\n index: number;\n last: boolean;\n size: Size;\n color?: string;\n status?: TimelineItemProps[\"status\"];\n lineColor?: string;\n lineStyle: LineStyle;\n active?: boolean;\n dot?: React.ReactNode;\n icon?: React.ComponentType<{ className?: string }>;\n showLine: boolean;\n}> = ({ index, last, size, color, status = \"default\", lineColor, lineStyle, active, dot, icon: Icon, showLine }) => {\n const sz = SIZE_STYLE[size];\n const dotColor = color ? `background:${color}` : undefined;\n const cls = color ? undefined : STATUS_COLOR[status];\n\n return (\n <div className=\"flex flex-col items-center\">\n {/* Dot */}\n {dot ? (\n <div className=\"flex items-center justify-center\">{dot}</div>\n ) : Icon ? (\n <div\n className={cn(\"rounded-full ring-2 ring-background flex items-center justify-center\", sz.iconDot, cls, active && \"ring-primary/40 ring-4\")}\n style={dotColor ? ({ background: color } as React.CSSProperties) : undefined}\n >\n <Icon className={cn(\"text-white\", sz.icon)} />\n </div>\n ) : (\n <div\n className={cn(\"rounded-full ring-2 ring-background\", sz.dot, cls, active && \"ring-primary/40 ring-4 scale-125\")}\n style={dotColor ? ({ background: color } as React.CSSProperties) : undefined}\n />\n )}\n {/* Line */}\n {!last && showLine && (\n <div\n className={cn(\"flex-1 border-l-2\", LINE_STYLE_MAP[lineStyle])}\n style={{ borderColor: lineColor || \"hsl(var(--border))\" }}\n />\n )}\n </div>\n );\n};\n\nconst TimelineRoot = React.forwardRef<HTMLDivElement, TimelineProps>(\n (\n {\n align = \"left\",\n variant = \"default\",\n size = \"md\",\n mode = \"vertical\",\n lineColor,\n lineStyle = \"solid\",\n items,\n itemClassName,\n animate = false,\n dense = false,\n showLine = true,\n className,\n children,\n ...rest\n },\n ref\n ) => {\n const content = items\n ? items.map((it, i) => (\n <TimelineItem key={i} {...it} className={cn(itemClassName, it.className)} data-index={i} data-last={i === (items?.length ?? 0) - 1} />\n ))\n : children;\n\n return (\n <TimelineContext.Provider value={{ align, variant, size, mode, lineColor, lineStyle, itemClassName, animate, dense, showLine }}>\n <div\n ref={ref}\n className={cn(\n \"relative\",\n mode === \"horizontal\" && \"flex gap-4 overflow-x-auto\",\n mode === \"vertical\" && \"space-y-0\",\n className\n )}\n {...rest}\n >\n {mode === \"vertical\" ? <div className=\"space-y-0\">{content}</div> : content}\n </div>\n </TimelineContext.Provider>\n );\n }\n);\n\nTimelineRoot.displayName = \"Timeline\";\n\nexport const TimelineItem = React.forwardRef<HTMLDivElement, TimelineItemProps>(\n (\n {\n title,\n description,\n time,\n icon: Icon,\n status = \"default\",\n color,\n active = false,\n dot,\n collapsible = false,\n expanded: controlledExpanded,\n onExpandChange,\n expandContent,\n badge,\n className,\n children,\n ...rest\n },\n ref\n ) => {\n const ctx = React.useContext(TimelineContext)!;\n const idx = (rest as any)[\"data-index\"] as number | undefined;\n const isLast = Boolean((rest as any)[\"data-last\"]);\n const sz = SIZE_STYLE[ctx.size];\n const [internalExpanded, setInternalExpanded] = React.useState(false);\n const isExpanded = controlledExpanded !== undefined ? controlledExpanded : internalExpanded;\n\n const toggleExpanded = () => {\n const newExpanded = !isExpanded;\n if (onExpandChange) {\n onExpandChange(newExpanded);\n } else {\n setInternalExpanded(newExpanded);\n }\n };\n\n const padding = ctx.dense ? sz.densePadY : sz.padY;\n\n // Variant styles for content box\n const variantClasses = {\n default: \"\",\n outlined: \"rounded-lg border border-border bg-card shadow-sm px-4 py-3\",\n card: \"rounded-xl border border-border bg-card shadow-md px-5 py-4\",\n minimal: \"border-l-2 pl-4 py-2\",\n modern: \"rounded-lg bg-linear-to-r from-card to-muted/20 border border-border/50 px-5 py-4 backdrop-blur-sm\",\n gradient: \"rounded-xl bg-linear-to-br from-primary/10 via-card to-accent/10 border border-primary/20 px-5 py-4 shadow-lg\",\n };\n\n const contentBox = (\n <div className={cn(\"min-w-0 flex-1\", variantClasses[ctx.variant])}>\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"flex-1 min-w-0\">\n {title && (\n <div className=\"flex items-center gap-2\">\n <div className={cn(\"font-semibold text-foreground\", sz.title)}>{title}</div>\n {badge && <span className=\"px-2 py-0.5 rounded-full text-[10px] font-medium bg-primary/10 text-primary\">{badge}</span>}\n </div>\n )}\n {description && <div className={cn(\"text-muted-foreground mt-1\", sz.desc)}>{description}</div>}\n {children && <div className=\"mt-2\">{children}</div>}\n </div>\n {collapsible && (\n <button\n type=\"button\"\n onClick={toggleExpanded}\n className={cn(\"text-muted-foreground hover:text-foreground transition-transform p-1\", isExpanded && \"rotate-180\")}\n >\n <ChevronDown className=\"h-4 w-4\" />\n </button>\n )}\n </div>\n {time && <div className={cn(\"mt-2 text-muted-foreground flex items-center gap-1\", sz.time)}>{time}</div>}\n {/* Expanded Content */}\n {collapsible && isExpanded && expandContent && (\n <div className=\"mt-3 pt-3 border-t border-border/50 text-sm\">{expandContent}</div>\n )}\n </div>\n );\n\n const markerWidth = Icon || dot ? \"w-auto\" : \"w-6\";\n\n const leftSide = (\n <div className={cn(\"flex items-stretch gap-4\", padding, ctx.animate && \"animate-in slide-in-from-left duration-500\")} style={{ animationDelay: ctx.animate ? `${(idx ?? 0) * 100}ms` : undefined }}>\n <div className={cn(\"shrink-0 flex items-stretch\", markerWidth)}>\n <Marker index={idx ?? 0} last={isLast} size={ctx.size} color={color} status={status} lineColor={ctx.lineColor} lineStyle={ctx.lineStyle} active={active} dot={dot} icon={Icon} showLine={ctx.showLine} />\n </div>\n <div className=\"flex-1\">{contentBox}</div>\n </div>\n );\n\n const rightSide = (\n <div className={cn(\"flex items-stretch gap-4\", padding, ctx.animate && \"animate-in slide-in-from-right duration-500\")} style={{ animationDelay: ctx.animate ? `${(idx ?? 0) * 100}ms` : undefined }}>\n <div className=\"flex-1 flex justify-end\">{contentBox}</div>\n <div className={cn(\"shrink-0 flex items-stretch\", markerWidth)}>\n <Marker index={idx ?? 0} last={isLast} size={ctx.size} color={color} status={status} lineColor={ctx.lineColor} lineStyle={ctx.lineStyle} active={active} dot={dot} icon={Icon} showLine={ctx.showLine} />\n </div>\n </div>\n );\n\n const horizontalItem = (\n <div\n className={cn(\n \"flex flex-col items-center gap-2 min-w-[200px]\",\n ctx.animate && \"animate-in fade-in-50 zoom-in-95 duration-500\"\n )}\n style={{ animationDelay: ctx.animate ? `${(idx ?? 0) * 100}ms` : undefined }}\n >\n <Marker index={idx ?? 0} last={isLast} size={ctx.size} color={color} status={status} lineColor={ctx.lineColor} lineStyle={ctx.lineStyle} active={active} dot={dot} icon={Icon} showLine={false} />\n {!isLast && ctx.showLine && (\n <div className={cn(\"h-px w-full border-t-2\", LINE_STYLE_MAP[ctx.lineStyle])} style={{ borderColor: ctx.lineColor || \"hsl(var(--border))\" }} />\n )}\n {contentBox}\n </div>\n );\n\n if (ctx.mode === \"horizontal\") {\n return (\n <div ref={ref} className={cn(\"relative\", className)} {...rest}>\n {horizontalItem}\n </div>\n );\n }\n\n let row = leftSide;\n if (ctx.align === \"right\") row = rightSide;\n if (ctx.align === \"alternate\") row = (idx ?? 0) % 2 === 0 ? leftSide : rightSide;\n\n return (\n <div ref={ref} className={cn(\"relative\", className)} {...rest}>\n {row}\n </div>\n );\n }\n);\n\nTimelineItem.displayName = \"Timeline.Item\";\n\nconst Timeline = Object.assign(TimelineRoot, { Item: TimelineItem });\n\nexport default Timeline;\n","\"use client\";\n\nimport * as React from \"react\";\nimport { Popover } from \"./Popover\";\nimport Input from \"./Input\";\nimport { Slider } from \"./Slider\";\nimport { cn } from \"@/lib/utils/cn\";\nimport { Pipette, X, Copy, Check, Palette, History } from \"lucide-react\";\n\ntype OutputFormat = \"hex\" | \"rgba\" | \"hsl\" | \"hsla\";\ntype ColorPickerSize = \"sm\" | \"md\" | \"lg\";\ntype ColorPickerVariant = \"default\" | \"compact\" | \"full\" | \"minimal\";\n\nexport interface ColorPickerProps extends Omit<React.HTMLAttributes<HTMLDivElement>, \"onChange\"> {\n value?: string;\n defaultValue?: string;\n onChange?: (value: string) => void;\n disabled?: boolean;\n withAlpha?: boolean;\n format?: OutputFormat;\n presets?: string[];\n /** Class for the trigger button */\n triggerClassName?: string;\n /** Class for the popover content panel */\n contentClassName?: string;\n /** Show a clear button to reset to empty */\n clearable?: boolean;\n /** Show copy to clipboard button */\n copyable?: boolean;\n /** Size variant of the picker */\n size?: ColorPickerSize;\n /** Visual variant of the picker */\n variant?: ColorPickerVariant;\n /** Show recent colors history */\n showRecent?: boolean;\n /** Show color harmony suggestions */\n showHarmony?: boolean;\n /** Max recent colors to remember */\n maxRecent?: number;\n}\n\ntype RGBA = { r: number; g: number; b: number; a: number };\ntype HSLA = { h: number; s: number; l: number; a: number };\n\nconst clamp = (n: number, min: number, max: number) => Math.max(min, Math.min(max, n));\n\nfunction hexToRgb(hex: string): { r: number; g: number; b: number } | null {\n const str = hex.replace(/^#/, \"\").trim();\n if (str.length === 3) {\n const r = parseInt(str[0] + str[0], 16);\n const g = parseInt(str[1] + str[1], 16);\n const b = parseInt(str[2] + str[2], 16);\n return { r, g, b };\n }\n if (str.length === 6) {\n const r = parseInt(str.slice(0, 2), 16);\n const g = parseInt(str.slice(2, 4), 16);\n const b = parseInt(str.slice(4, 6), 16);\n return { r, g, b };\n }\n return null;\n}\n\nfunction rgbToHex(r: number, g: number, b: number) {\n return `#${[r, g, b]\n .map((v) => clamp(Math.round(v), 0, 255).toString(16).padStart(2, \"0\"))\n .join(\"\")}`;\n}\n\nfunction rgbToHsl(r: number, g: number, b: number): { h: number; s: number; l: number } {\n r /= 255;\n g /= 255;\n b /= 255;\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n let h = 0,\n s = 0;\n const l = (max + min) / 2;\n\n if (max !== min) {\n const d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n switch (max) {\n case r:\n h = ((g - b) / d + (g < b ? 6 : 0)) / 6;\n break;\n case g:\n h = ((b - r) / d + 2) / 6;\n break;\n case b:\n h = ((r - g) / d + 4) / 6;\n break;\n }\n }\n return { h: h * 360, s: s * 100, l: l * 100 };\n}\n\nfunction hslToRgb(h: number, s: number, l: number): { r: number; g: number; b: number } {\n h /= 360;\n s /= 100;\n l /= 100;\n let r, g, b;\n\n if (s === 0) {\n r = g = b = l;\n } else {\n const hue2rgb = (p: number, q: number, t: number) => {\n if (t < 0) t += 1;\n if (t > 1) t -= 1;\n if (t < 1 / 6) return p + (q - p) * 6 * t;\n if (t < 1 / 2) return q;\n if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;\n return p;\n };\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n const p = 2 * l - q;\n r = hue2rgb(p, q, h + 1 / 3);\n g = hue2rgb(p, q, h);\n b = hue2rgb(p, q, h - 1 / 3);\n }\n return { r: Math.round(r * 255), g: Math.round(g * 255), b: Math.round(b * 255) };\n}\n\nfunction parseAnyColor(input?: string): RGBA | null {\n if (!input) return null;\n const s = input.trim();\n if (s.startsWith(\"#\")) {\n const rgb = hexToRgb(s);\n if (!rgb) return null;\n return { ...rgb, a: 1 };\n }\n // rgba(r,g,b,a)\n const rgbaMatch = s.match(/rgba?\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})(?:\\s*,\\s*(\\d*\\.?\\d+))?\\s*\\)/i);\n if (rgbaMatch) {\n const r = clamp(parseInt(rgbaMatch[1], 10), 0, 255);\n const g = clamp(parseInt(rgbaMatch[2], 10), 0, 255);\n const b = clamp(parseInt(rgbaMatch[3], 10), 0, 255);\n const a = rgbaMatch[4] != null ? clamp(parseFloat(rgbaMatch[4]), 0, 1) : 1;\n return { r, g, b, a };\n }\n // hsla(h,s%,l%,a)\n const hslaMatch = s.match(/hsla?\\(\\s*(\\d{1,3}(?:\\.\\d+)?)\\s*,?\\s*(\\d{1,3}(?:\\.\\d+)?)%?\\s*,?\\s*(\\d{1,3}(?:\\.\\d+)?)%?(?:\\s*,?\\s*(\\d*\\.?\\d+))?\\s*\\)/i);\n if (hslaMatch) {\n const h = parseFloat(hslaMatch[1]);\n const sl = parseFloat(hslaMatch[2]);\n const l = parseFloat(hslaMatch[3]);\n const a = hslaMatch[4] != null ? clamp(parseFloat(hslaMatch[4]), 0, 1) : 1;\n const rgb = hslToRgb(h, sl, l);\n return { ...rgb, a };\n }\n return null;\n}\n\nfunction formatOutput({ r, g, b, a }: RGBA, withAlpha: boolean, format: OutputFormat) {\n if (format === \"hex\" && (!withAlpha || a === 1)) {\n return rgbToHex(r, g, b);\n }\n if (format === \"hsl\" || format === \"hsla\") {\n const hsl = rgbToHsl(r, g, b);\n if (format === \"hsla\" || withAlpha) {\n return `hsla(${Math.round(hsl.h)}, ${Math.round(hsl.s)}%, ${Math.round(hsl.l)}%, ${clamp(a, 0, 1)})`;\n }\n return `hsl(${Math.round(hsl.h)}, ${Math.round(hsl.s)}%, ${Math.round(hsl.l)}%)`;\n }\n if (withAlpha || a !== 1) {\n return `rgba(${clamp(r, 0, 255)}, ${clamp(g, 0, 255)}, ${clamp(b, 0, 255)}, ${clamp(a, 0, 1)})`;\n }\n return rgbToHex(r, g, b);\n}\n\n// Generate color harmony\nfunction getColorHarmony(rgba: RGBA): { complementary: string; triadic: string[]; analogous: string[] } {\n const hsl = rgbToHsl(rgba.r, rgba.g, rgba.b);\n\n // Complementary: opposite on color wheel\n const compH = (hsl.h + 180) % 360;\n const compRgb = hslToRgb(compH, hsl.s, hsl.l);\n\n // Triadic: 120 degrees apart\n const tri1H = (hsl.h + 120) % 360;\n const tri2H = (hsl.h + 240) % 360;\n const tri1Rgb = hslToRgb(tri1H, hsl.s, hsl.l);\n const tri2Rgb = hslToRgb(tri2H, hsl.s, hsl.l);\n\n // Analogous: 30 degrees apart\n const ana1H = (hsl.h + 30) % 360;\n const ana2H = (hsl.h - 30 + 360) % 360;\n const ana1Rgb = hslToRgb(ana1H, hsl.s, hsl.l);\n const ana2Rgb = hslToRgb(ana2H, hsl.s, hsl.l);\n\n return {\n complementary: rgbToHex(compRgb.r, compRgb.g, compRgb.b),\n triadic: [rgbToHex(tri1Rgb.r, tri1Rgb.g, tri1Rgb.b), rgbToHex(tri2Rgb.r, tri2Rgb.g, tri2Rgb.b)],\n analogous: [rgbToHex(ana1Rgb.r, ana1Rgb.g, ana1Rgb.b), rgbToHex(ana2Rgb.r, ana2Rgb.g, ana2Rgb.b)],\n };\n}\n\nconst DEFAULT_PRESETS = [\n \"#000000\", \"#ffffff\", \"#f87171\", \"#fb923c\", \"#fbbf24\", \"#34d399\", \"#60a5fa\", \"#a78bfa\", \"#f472b6\",\n \"#111827\", \"#4b5563\", \"#9ca3af\", \"#d1d5db\", \"#e5e7eb\", \"#f3f4f6\",\n];\n\nconst Swatch: React.FC<{ color: string; onClick?: () => void; ariaLabel?: string; size?: \"sm\" | \"md\" | \"lg\" }> = ({\n color,\n onClick,\n ariaLabel,\n size = \"md\"\n}) => {\n const sizeClasses = {\n sm: \"h-5 w-5\",\n md: \"h-6 w-6\",\n lg: \"h-8 w-8\",\n };\n return (\n <button\n type=\"button\"\n className={cn(\n sizeClasses[size],\n \"rounded-md border border-border shadow-sm hover:scale-110 transition-transform\",\n onClick && \"cursor-pointer\"\n )}\n style={{ backgroundColor: color }}\n onClick={onClick}\n aria-label={ariaLabel}\n />\n );\n};\n\nexport default function ColorPicker({\n value,\n defaultValue = \"#4f46e5\",\n onChange,\n disabled = false,\n withAlpha = false,\n format = \"hex\",\n presets,\n className,\n triggerClassName,\n contentClassName,\n clearable = false,\n copyable = true,\n size = \"md\",\n variant = \"default\",\n showRecent = false,\n showHarmony = false,\n maxRecent = 8,\n ...rest\n}: ColorPickerProps) {\n const isControlled = value !== undefined;\n const initial = parseAnyColor(isControlled ? value! : defaultValue) || { r: 79, g: 70, b: 229, a: 1 };\n const [rgba, setRgba] = React.useState<RGBA>(initial);\n const [open, setOpen] = React.useState(false);\n const [text, setText] = React.useState(() => formatOutput(initial, withAlpha, format));\n const [copied, setCopied] = React.useState(false);\n const [recentColors, setRecentColors] = React.useState<string[]>([]);\n\n React.useEffect(() => {\n if (isControlled) {\n const parsed = parseAnyColor(value);\n if (parsed) {\n setRgba(parsed);\n setText(formatOutput(parsed, withAlpha, format));\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [value]);\n\n const emit = (next: RGBA) => {\n const out = formatOutput(next, withAlpha, format);\n if (!isControlled) setText(out);\n onChange?.(out);\n\n // Add to recent colors\n if (showRecent) {\n const hexColor = rgbToHex(next.r, next.g, next.b);\n setRecentColors((prev) => {\n const filtered = prev.filter((c) => c !== hexColor);\n return [hexColor, ...filtered].slice(0, maxRecent);\n });\n }\n };\n\n const copyToClipboard = async () => {\n try {\n await navigator.clipboard.writeText(text);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n } catch (err) {\n console.error(\"Failed to copy:\", err);\n }\n };\n\n const handleHexChange = (raw: string) => {\n setText(raw);\n const parsed = parseAnyColor(raw);\n if (parsed) {\n setRgba((prev) => ({ ...parsed, a: withAlpha ? parsed.a : 1 }));\n emit({ ...parsed, a: withAlpha ? parsed.a : 1 });\n }\n };\n\n const handleNativeChange: React.ChangeEventHandler<HTMLInputElement> = (e) => {\n const hex = e.target.value || \"#000000\";\n const rgb = hexToRgb(hex) || { r: 0, g: 0, b: 0 };\n const next = { ...rgba, ...rgb };\n setRgba(next);\n emit(next);\n };\n\n const setAlpha = (aPct: number) => {\n const a = clamp(aPct / 100, 0, 1);\n const next = { ...rgba, a };\n setRgba(next);\n emit(next);\n };\n\n const tryEyedropper = async () => {\n // @ts-ignore\n if (typeof window !== \"undefined\" && window.EyeDropper) {\n // @ts-ignore\n const eye = new window.EyeDropper();\n try {\n const res = await eye.open();\n const rgb = hexToRgb(res.sRGBHex);\n if (rgb) {\n const next = { r: rgb.r, g: rgb.g, b: rgb.b, a: rgba.a };\n setRgba(next);\n emit(next);\n }\n } catch {}\n }\n };\n\n const clear = () => {\n setText(\"\");\n const next = { r: 0, g: 0, b: 0, a: 0 };\n setRgba(next);\n onChange?.(\"\");\n };\n\n const swatches = presets && presets.length ? presets : DEFAULT_PRESETS;\n const hexForInput = rgbToHex(rgba.r, rgba.g, rgba.b);\n const alphaPct = Math.round(rgba.a * 100);\n const harmony = showHarmony ? getColorHarmony(rgba) : null;\n\n const sizeClasses = {\n sm: \"h-8 text-xs\",\n md: \"h-10 text-sm\",\n lg: \"h-12 text-base\",\n };\n\n const swatchSize = size === \"sm\" ? \"sm\" : size === \"lg\" ? \"lg\" : \"md\";\n\n const trigger = (\n <button\n type=\"button\"\n disabled={disabled}\n className={cn(\n \"w-full px-3 rounded-lg border border-input bg-background flex items-center justify-between\",\n sizeClasses[size],\n \"hover:border-accent-foreground/30 transition-colors\",\n disabled && \"opacity-50 cursor-not-allowed\",\n triggerClassName\n )}\n aria-label=\"Open color picker\"\n >\n <div className=\"flex items-center gap-2\">\n <span\n className={cn(\n \"rounded border border-border shadow-sm\",\n size === \"sm\" ? \"h-4 w-4\" : size === \"lg\" ? \"h-6 w-6\" : \"h-5 w-5\"\n )}\n style={{ backgroundColor: withAlpha ? `rgba(${rgba.r}, ${rgba.g}, ${rgba.b}, ${rgba.a})` : hexForInput }}\n />\n <span className=\"font-mono text-muted-foreground\">{text}</span>\n </div>\n <Pipette className={cn(size === \"sm\" ? \"w-3.5 h-3.5\" : size === \"lg\" ? \"w-5 h-5\" : \"w-4 h-4\", \"text-muted-foreground\")} />\n </button>\n );\n\n const contentWidthByVariant = {\n minimal: 240,\n compact: 280,\n default: 320,\n full: 360,\n };\n\n return (\n <div className={cn(\"inline-block w-full\", className)} {...rest}>\n <Popover\n trigger={trigger}\n open={open}\n onOpenChange={setOpen}\n placement=\"bottom-start\"\n matchTriggerWidth={variant === \"minimal\"}\n contentWidth={contentWidthByVariant[variant]}\n contentClassName={cn(\"p-3 rounded-lg border border-border bg-card shadow-lg\", contentClassName)}\n >\n <div className=\"space-y-3\">\n {/* Native input + eyedropper + copy + clear */}\n {variant !== \"minimal\" && (\n <div className=\"flex items-center gap-2\">\n <input type=\"color\" value={hexForInput} onChange={handleNativeChange} className=\"h-9 w-9 rounded-md cursor-pointer border border-border\" />\n <button\n type=\"button\"\n onClick={tryEyedropper}\n className={cn(\"h-9 px-3 rounded-md border border-border text-xs hover:bg-accent/10 transition-colors flex items-center gap-1.5\")}\n >\n <Pipette className=\"w-3.5 h-3.5\" />\n {variant === \"full\" && \"Pick\"}\n </button>\n {copyable && (\n <button\n type=\"button\"\n onClick={copyToClipboard}\n className={cn(\n \"h-9 px-3 rounded-md border border-border text-xs hover:bg-accent/10 transition-colors flex items-center gap-1.5\",\n copied && \"bg-green-500/10 border-green-500/30\"\n )}\n >\n {copied ? <Check className=\"w-3.5 h-3.5 text-green-600\" /> : <Copy className=\"w-3.5 h-3.5\" />}\n {variant === \"full\" && (copied ? \"Copied!\" : \"Copy\")}\n </button>\n )}\n {clearable && (\n <button\n type=\"button\"\n onClick={clear}\n className=\"ml-auto h-9 px-2 rounded-md border border-border text-xs hover:bg-destructive/10 transition-colors flex items-center gap-1\"\n >\n <X className=\"w-3.5 h-3.5\" />\n {variant === \"full\" && \"Clear\"}\n </button>\n )}\n </div>\n )}\n\n {/* Color value input */}\n <div className=\"flex items-center gap-2\">\n <Input\n value={text}\n onChange={(e) => handleHexChange(e.target.value)}\n placeholder={\n format === \"hsl\" || format === \"hsla\"\n ? \"hsl(240, 82%, 59%)\"\n : withAlpha || format === \"rgba\"\n ? \"rgba(79,70,229,1)\"\n : \"#4f46e5\"\n }\n variant=\"outlined\"\n size=\"sm\"\n className=\"flex-1\"\n />\n {variant === \"minimal\" && copyable && (\n <button\n type=\"button\"\n onClick={copyToClipboard}\n className={cn(\n \"h-9 w-9 rounded-md border border-border hover:bg-accent/10 transition-colors flex items-center justify-center\",\n copied && \"bg-green-500/10 border-green-500/30\"\n )}\n >\n {copied ? <Check className=\"w-3.5 h-3.5 text-green-600\" /> : <Copy className=\"w-3.5 h-3.5\" />}\n </button>\n )}\n </div>\n\n {/* Alpha slider */}\n {withAlpha && (\n <div className=\"pt-1\">\n <Slider min={0} max={100} step={1} value={alphaPct} onChange={(v) => setAlpha(v)} label=\"Alpha\" showValue formatValue={(v) => `${v}%`} size=\"sm\" />\n </div>\n )}\n\n {/* Presets */}\n {variant !== \"minimal\" && (\n <div>\n <div className=\"text-xs font-medium text-muted-foreground mb-2 flex items-center gap-1.5\">\n <Palette className=\"w-3.5 h-3.5\" /> Presets\n </div>\n <div className=\"grid grid-cols-8 gap-2\">\n {swatches.map((c) => (\n <Swatch\n key={c}\n color={c}\n ariaLabel={c}\n size={swatchSize}\n onClick={() => {\n const rgb = hexToRgb(c)!;\n const next = { r: rgb.r, g: rgb.g, b: rgb.b, a: rgba.a };\n setRgba(next);\n emit(next);\n }}\n />\n ))}\n </div>\n </div>\n )}\n\n {/* Recent colors */}\n {showRecent && recentColors.length > 0 && (\n <div>\n <div className=\"text-xs font-medium text-muted-foreground mb-2 flex items-center gap-1.5\">\n <History className=\"w-3.5 h-3.5\" /> Recent\n </div>\n <div className=\"flex gap-2 flex-wrap\">\n {recentColors.map((c, i) => (\n <Swatch\n key={`${c}-${i}`}\n color={c}\n ariaLabel={c}\n size={swatchSize}\n onClick={() => {\n const rgb = hexToRgb(c)!;\n const next = { r: rgb.r, g: rgb.g, b: rgb.b, a: rgba.a };\n setRgba(next);\n emit(next);\n }}\n />\n ))}\n </div>\n </div>\n )}\n\n {/* Color Harmony */}\n {showHarmony && harmony && variant !== \"minimal\" && (\n <div>\n <div className=\"text-xs font-medium text-muted-foreground mb-2\">Harmony</div>\n <div className=\"space-y-2\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs text-muted-foreground w-24\">Complementary</span>\n <Swatch\n color={harmony.complementary}\n ariaLabel=\"Complementary\"\n size={swatchSize}\n onClick={() => {\n const rgb = hexToRgb(harmony.complementary)!;\n const next = { r: rgb.r, g: rgb.g, b: rgb.b, a: rgba.a };\n setRgba(next);\n emit(next);\n }}\n />\n <span className=\"text-xs font-mono text-muted-foreground\">{harmony.complementary}</span>\n </div>\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs text-muted-foreground w-24\">Triadic</span>\n <div className=\"flex gap-2\">\n {harmony.triadic.map((c) => (\n <Swatch\n key={c}\n color={c}\n ariaLabel={c}\n size={swatchSize}\n onClick={() => {\n const rgb = hexToRgb(c)!;\n const next = { r: rgb.r, g: rgb.g, b: rgb.b, a: rgba.a };\n setRgba(next);\n emit(next);\n }}\n />\n ))}\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs text-muted-foreground w-24\">Analogous</span>\n <div className=\"flex gap-2\">\n {harmony.analogous.map((c) => (\n <Swatch\n key={c}\n color={c}\n ariaLabel={c}\n size={swatchSize}\n onClick={() => {\n const rgb = hexToRgb(c)!;\n const next = { r: rgb.r, g: rgb.g, b: rgb.b, a: rgba.a };\n setRgba(next);\n emit(next);\n }}\n />\n ))}\n </div>\n </div>\n </div>\n </div>\n )}\n </div>\n </Popover>\n </div>\n );\n}\n","import React, { useId } from \"react\";\nimport { cn } from \"@/lib/utils/cn\";\n\ntype Breakpoint = \"sm\" | \"md\" | \"lg\" | \"xl\" | \"2xl\";\n\ntype ResponsiveConfig = Partial<{\n columns: number | string;\n rows: number | string;\n minColumnWidth: number | string;\n gap: number | string;\n gapX: number | string;\n gapY: number | string;\n}>;\n\ntype GridVariant = \"default\" | \"bordered\" | \"card\" | \"flat\" | \"glass\";\ntype GridAutoFlow = \"row\" | \"column\" | \"row dense\" | \"column dense\";\n\nexport interface GridProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Number of columns or full template string. Default: 12 (1fr each). */\n columns?: number | string;\n /** Number of rows or full template string. */\n rows?: number | string;\n /** Overall gap (shorthand). */\n gap?: number | string;\n /** Horizontal gap. */\n gapX?: number | string;\n /** Vertical gap. */\n gapY?: number | string;\n /** Auto rows value (e.g. 'minmax(100px, auto)'). */\n autoRows?: string;\n /** Auto columns value (e.g. 'minmax(100px, 1fr)'). */\n autoColumns?: string;\n /** Grid auto-flow direction and density. */\n autoFlow?: GridAutoFlow;\n /** Use auto-fit with a min width to create responsive columns. */\n minColumnWidth?: number | string;\n /** CSS grid-template-areas. Provide full string or joined lines. */\n areas?: string | string[];\n /** Item alignment within cells. */\n alignItems?: React.CSSProperties[\"alignItems\"];\n justifyItems?: React.CSSProperties[\"justifyItems\"];\n /** Grid content alignment. */\n alignContent?: React.CSSProperties[\"alignContent\"];\n justifyContent?: React.CSSProperties[\"justifyContent\"];\n /** Responsive overrides by breakpoint (Tailwind defaults). */\n responsive?: Partial<Record<Breakpoint, ResponsiveConfig>>;\n /** Visual variant style. */\n variant?: GridVariant;\n /** Enable smooth animations for grid layout changes. */\n animated?: boolean;\n /** Apply Card-like outline (rounded + border + bg-card). @deprecated Use variant=\"card\" instead */\n outlined?: boolean;\n}\n\nexport interface GridItemProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Column span (e.g., 3 => span 3). */\n colSpan?: number | string;\n /** Row span. */\n rowSpan?: number | string;\n /** Column start line. */\n colStart?: number | string;\n /** Column end line. */\n colEnd?: number | string;\n /** Row start line. */\n rowStart?: number | string;\n /** Row end line. */\n rowEnd?: number | string;\n /** Named area (must match container areas). */\n area?: string;\n /** Item alignment override. */\n alignSelf?: React.CSSProperties[\"alignSelf\"];\n justifySelf?: React.CSSProperties[\"justifySelf\"];\n /** Order of the item in the grid. */\n order?: number;\n /** Add hover effect. */\n hoverable?: boolean;\n /** Add animation delay (in ms). */\n animationDelay?: number;\n}\n\nconst BP_MIN: Record<Breakpoint, number> = {\n sm: 640,\n md: 768,\n lg: 1024,\n xl: 1280,\n \"2xl\": 1536,\n};\n\nfunction toTemplateCols(columns?: number | string, minColumnWidth?: number | string) {\n if (minColumnWidth != null) {\n const v = typeof minColumnWidth === \"number\" ? `${minColumnWidth}px` : String(minColumnWidth);\n return `repeat(auto-fit, minmax(${v}, 1fr))`;\n }\n if (typeof columns === \"number\") return `repeat(${columns}, minmax(0, 1fr))`;\n if (columns) return String(columns);\n return `repeat(12, minmax(0, 1fr))`;\n}\n\nfunction toTemplateRows(rows?: number | string) {\n if (typeof rows === \"number\") return `repeat(${rows}, minmax(0, auto))`;\n if (rows) return String(rows);\n return undefined;\n}\n\nfunction joinAreas(areas?: string | string[]) {\n if (!areas) return undefined;\n return Array.isArray(areas) ? areas.join(\" \") : areas;\n}\n\nfunction getVariantClasses(variant: GridVariant = \"default\", outlined?: boolean): string {\n // Handle deprecated outlined prop\n if (outlined) {\n return \"rounded-lg md:rounded-xl bg-card text-card-foreground border border-border shadow-sm\";\n }\n\n const variants: Record<GridVariant, string> = {\n default: \"\",\n bordered: \"border border-border rounded-lg\",\n card: \"rounded-lg md:rounded-xl bg-card text-card-foreground border border-border shadow-sm\",\n flat: \"bg-muted/30 rounded-lg\",\n glass: \"bg-background/80 backdrop-blur-sm border border-border/50 rounded-lg shadow-lg\",\n };\n\n return variants[variant] || \"\";\n}\n\nconst GridRoot = React.forwardRef<HTMLDivElement, GridProps>(\n (\n {\n columns,\n rows,\n gap,\n gapX,\n gapY,\n autoRows,\n autoColumns,\n autoFlow,\n minColumnWidth,\n areas,\n alignItems,\n justifyItems,\n alignContent,\n justifyContent,\n responsive,\n variant = \"default\",\n animated = false,\n outlined = false,\n className,\n style,\n children,\n ...rest\n },\n ref\n ) => {\n const id = useId().replace(/[:]/g, \"\");\n const baseClass = `uv-grid-${id}`;\n\n const baseCols = toTemplateCols(columns, minColumnWidth);\n const baseRows = toTemplateRows(rows);\n const baseAreas = joinAreas(areas);\n\n let css = `.${baseClass}{display:grid;`;\n if (baseCols) css += `grid-template-columns:${baseCols};`;\n if (baseRows) css += `grid-template-rows:${baseRows};`;\n if (baseAreas) css += `grid-template-areas:${baseAreas};`;\n if (autoRows) css += `grid-auto-rows:${autoRows};`;\n if (autoColumns) css += `grid-auto-columns:${autoColumns};`;\n if (autoFlow) css += `grid-auto-flow:${autoFlow};`;\n if (alignItems) css += `align-items:${alignItems};`;\n if (justifyItems) css += `justify-items:${justifyItems};`;\n if (alignContent) css += `align-content:${alignContent};`;\n if (justifyContent) css += `justify-content:${justifyContent};`;\n if (animated) css += `transition:all 0.3s cubic-bezier(0.4, 0, 0.2, 1);`;\n css += `}`;\n\n const toVal = (v?: number | string) => (typeof v === \"number\" ? `${v}px` : v);\n const g = toVal(gap);\n const gx = toVal(gapX);\n const gy = toVal(gapY);\n if (g) css += `.${baseClass}{gap:${g};}`;\n if (gx) css += `.${baseClass}{column-gap:${gx};}`;\n if (gy) css += `.${baseClass}{row-gap:${gy};}`;\n\n if (responsive) {\n (Object.keys(responsive) as Breakpoint[]).forEach((bp) => {\n const conf = responsive[bp];\n if (!conf) return;\n const cols = toTemplateCols(conf.columns, conf.minColumnWidth);\n const rws = toTemplateRows(conf.rows);\n const rg = toVal(conf.gap);\n const rgx = toVal(conf.gapX);\n const rgy = toVal(conf.gapY);\n css += `@media (min-width:${BP_MIN[bp]}px){.${baseClass}{`;\n if (cols) css += `grid-template-columns:${cols};`;\n if (rws) css += `grid-template-rows:${rws};`;\n if (rg) css += `gap:${rg};`;\n if (rgx) css += `column-gap:${rgx};`;\n if (rgy) css += `row-gap:${rgy};`;\n css += `}}`;\n });\n }\n\n return (\n <div\n ref={ref}\n className={cn(\n baseClass,\n getVariantClasses(variant, outlined),\n animated && \"transition-all duration-300 ease-in-out\",\n className\n )}\n style={style}\n {...rest}\n >\n <style dangerouslySetInnerHTML={{ __html: css }} />\n {children}\n </div>\n );\n }\n);\n\nGridRoot.displayName = \"Grid\";\n\nexport const GridItem = React.forwardRef<HTMLDivElement, GridItemProps>(\n (\n {\n colSpan,\n rowSpan,\n colStart,\n colEnd,\n rowStart,\n rowEnd,\n area,\n alignSelf,\n justifySelf,\n order,\n hoverable = false,\n animationDelay,\n style,\n className,\n ...rest\n },\n ref\n ) => {\n const st: React.CSSProperties = { ...style };\n if (colSpan != null) st.gridColumn = `span ${colSpan} / span ${colSpan}`;\n if (rowSpan != null) st.gridRow = `span ${rowSpan} / span ${rowSpan}`;\n if (colStart != null) st.gridColumnStart = colStart as any;\n if (colEnd != null) st.gridColumnEnd = colEnd as any;\n if (rowStart != null) st.gridRowStart = rowStart as any;\n if (rowEnd != null) st.gridRowEnd = rowEnd as any;\n if (area) st.gridArea = area;\n if (alignSelf) st.alignSelf = alignSelf;\n if (justifySelf) st.justifySelf = justifySelf;\n if (order != null) st.order = order;\n if (animationDelay != null) {\n st.animationDelay = `${animationDelay}ms`;\n st.opacity = 0;\n st.animation = `uvGridItemFadeIn 0.5s ease-out forwards`;\n }\n\n return (\n <>\n {animationDelay != null && (\n <style\n dangerouslySetInnerHTML={{\n __html: `@keyframes uvGridItemFadeIn{from{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}`,\n }}\n />\n )}\n <div\n ref={ref}\n className={cn(\n hoverable && \"transition-all duration-200 hover:scale-[1.02] hover:shadow-md cursor-pointer\",\n className\n )}\n style={st}\n {...rest}\n />\n </>\n );\n }\n);\n\nGridItem.displayName = \"Grid.Item\";\n\nconst Grid = Object.assign(GridRoot, { Item: GridItem });\n\nexport default Grid;\n","\"use client\";\r\n\r\nimport { useEffect, useState } from \"react\";\r\n\r\ninterface ClientOnlyProps {\r\n children: React.ReactNode;\r\n fallback?: React.ReactNode;\r\n}\r\n\r\nexport default function ClientOnly({ children, fallback = null }: ClientOnlyProps) {\r\n const [hasMounted, setHasMounted] = useState(false);\r\n\r\n useEffect(() => {\r\n setHasMounted(true);\r\n }, []);\r\n\r\n if (!hasMounted) {\r\n return <>{fallback}</>;\r\n }\r\n\r\n return <>{children}</>;\r\n}","\"use client\";\r\n\r\nimport React from 'react';\r\nimport { cn } from '@/lib/utils/cn';\r\nimport { Activity } from 'lucide-react';\r\n\r\ninterface LoadingSpinnerProps {\n size?: 'sm' | 'md' | 'lg';\n className?: string;\n color?: 'primary' | 'foreground' | 'muted';\n}\n\r\nexport const LoadingSpinner: React.FC<LoadingSpinnerProps> = ({ \n size = 'md', \n className,\n color = 'primary'\n}) => {\n const sizeClasses = {\r\n sm: 'h-4 w-4',\r\n md: 'h-6 w-6', \r\n lg: 'h-8 w-8'\r\n };\r\n\r\n const colorClasses = {\r\n primary: 'text-primary',\r\n foreground: 'text-foreground',\r\n muted: 'text-muted-foreground'\r\n };\r\n\r\n return (\n <Activity \n className={cn(\n 'animate-spin',\n sizeClasses[size],\n colorClasses[color],\n className\n )} \n />\n );\n};\n\r\ninterface LoadingDotsProps {\n className?: string;\n color?: 'primary' | 'foreground' | 'muted';\n}\n\r\nexport const LoadingDots: React.FC<LoadingDotsProps> = ({ \n className,\n color = 'primary'\n}) => {\n const colorClasses = {\r\n primary: 'bg-primary',\r\n foreground: 'bg-foreground',\r\n muted: 'bg-muted-foreground'\r\n };\r\n\r\n return (\n <div className={cn('flex items-center space-x-1', className)}>\n {[0, 1, 2].map((i) => (\n <div\n key={i}\n className={cn(\n 'h-2 w-2 rounded-full animate-pulse',\n colorClasses[color]\n )}\n style={{\n animationDelay: `${i * 0.2}s`,\n animationDuration: '1.4s'\n }}\n />\n ))}\n </div>\n );\n};\n\r\ninterface LoadingBarProps {\n progress?: number; // 0-100\n className?: string;\n animated?: boolean;\n label?: string;\n}\n\r\nexport const LoadingBar: React.FC<LoadingBarProps> = ({ \n progress,\n className,\n animated = true,\n label\n}) => {\n const pct = progress ? Math.min(Math.max(progress, 0), 100) : undefined;\n return (\n <div\n className={cn('w-full bg-muted rounded-full h-2', className)}\n role=\"progressbar\"\n aria-valuemin={0}\n aria-valuemax={pct === undefined ? undefined : 100}\n aria-valuenow={pct === undefined ? undefined : Math.round(pct)}\n aria-label={label || 'Loading'}\n >\n <div\n className={cn(\n 'bg-primary h-2 rounded-full transition-all duration-300',\n animated && !progress && 'animate-pulse'\n )}\n style={{\n width: pct !== undefined ? `${pct}%` : '30%'\n }}\n />\n </div>\n );\n};\n\r\ninterface InlineLoadingProps {\n message?: string;\n size?: 'sm' | 'md' | 'lg';\n variant?: 'spinner' | 'dots';\n className?: string;\n}\n\r\nexport const InlineLoading: React.FC<InlineLoadingProps> = ({\n message = '',\n size = 'md',\n variant = 'spinner',\n className\n}) => {\n return (\n <div className={cn('flex items-center gap-2', className)}>\n {variant === 'spinner' ? (\n <LoadingSpinner size={size} />\n ) : (\n <LoadingDots />\n )}\n {message && message.trim() && (\n <span className=\"text-sm text-muted-foreground\">\n {message}\n </span>\n )}\n </div>\n );\n};\n","import React from \"react\";\r\nimport { cn } from \"@/lib/utils/cn\";\r\n\r\ninterface TableProps extends React.HTMLAttributes<HTMLTableElement> {\r\n containerClassName?: string;\r\n}\r\n\r\nconst Table = React.forwardRef<HTMLTableElement, TableProps>(({ className, containerClassName, ...props }, ref) => (\r\n <div\r\n className={cn(\r\n \"relative w-full overflow-auto\",\r\n \"rounded-lg md:rounded-xl border border-border\",\r\n \"bg-card text-card-foreground shadow-sm\",\r\n \"backdrop-blur-sm transition-all duration-300\",\r\n containerClassName\r\n )}\r\n >\r\n <table ref={ref} className={cn(\"w-full caption-bottom text-sm\", className)} {...props} />\r\n </div>\r\n));\r\nTable.displayName = \"Table\";\r\n\r\ninterface TableHeaderProps extends React.HTMLAttributes<HTMLTableSectionElement> {\r\n filterRow?: React.ReactNode;\r\n}\r\n\r\nconst TableHeader = React.forwardRef<HTMLTableSectionElement, TableHeaderProps>(({ className, children, filterRow, ...props }, ref) => (\r\n <thead ref={ref} className={cn(\"[&_tr]:border-b [&_tr]:border-border\", \"bg-muted/50\", className)} {...props}>\r\n {children}\r\n {filterRow}\r\n </thead>\r\n));\r\nTableHeader.displayName = \"TableHeader\";\r\n\r\nconst TableBody = React.forwardRef<HTMLTableSectionElement, React.HTMLAttributes<HTMLTableSectionElement>>(({ className, ...props }, ref) => (\r\n <tbody ref={ref} className={cn(\"[&_tr:last-child]:border-0\", className)} {...props} />\r\n));\r\nTableBody.displayName = \"TableBody\";\r\n\r\nconst TableFooter = React.forwardRef<HTMLTableSectionElement, React.HTMLAttributes<HTMLTableSectionElement>>(({ className, ...props }, ref) => (\r\n <tfoot ref={ref} className={cn(\"border-t bg-muted/50 font-medium [&>tr]:last:border-b-0\", className)} {...props} />\r\n));\r\nTableFooter.displayName = \"TableFooter\";\r\n\r\nconst TableRow = React.forwardRef<HTMLTableRowElement, React.HTMLAttributes<HTMLTableRowElement>>(({ className, ...props }, ref) => (\r\n <tr\r\n ref={ref}\r\n className={cn(\r\n \"border-b border-border transition-all duration-300\",\r\n \"hover:bg-muted/30 hover:shadow-sm\",\r\n \"data-[state=selected]:bg-muted/50\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n));\r\nTableRow.displayName = \"TableRow\";\r\n\r\nconst TableHead = React.forwardRef<HTMLTableCellElement, React.ThHTMLAttributes<HTMLTableCellElement>>(({ className, ...props }, ref) => (\r\n <th\r\n ref={ref}\r\n className={cn(\"h-12 px-4 text-left align-middle font-medium text-muted-foreground [&:has([role=checkbox])]:pr-0\", className)}\r\n {...props}\r\n />\r\n));\r\nTableHead.displayName = \"TableHead\";\r\n\r\nconst TableCell = React.forwardRef<HTMLTableCellElement, React.TdHTMLAttributes<HTMLTableCellElement>>(({ className, ...props }, ref) => (\r\n <td ref={ref} className={cn(\"p-4 align-middle [&:has([role=checkbox])]:pr-0\", className)} {...props} />\r\n));\r\nTableCell.displayName = \"TableCell\";\r\n\r\nconst TableCaption = React.forwardRef<HTMLTableCaptionElement, React.HTMLAttributes<HTMLTableCaptionElement>>(({ className, ...props }, ref) => (\r\n <caption ref={ref} className={cn(\"mt-4 text-sm text-muted-foreground\", className)} {...props} />\r\n));\r\nTableCaption.displayName = \"TableCaption\";\r\n\r\nexport { Table, TableHeader, TableBody, TableFooter, TableHead, TableRow, TableCell, TableCaption };\r\n","\"use client\";\n\nimport Button from \"@/components/ui/Button\";\nimport { Combobox } from \"@/components/ui/Combobox\";\nimport { DatePicker } from \"@/components/ui/DatePicker\";\nimport DropdownMenu, { DropdownMenuItem } from \"@/components/ui/DropdownMenu\";\nimport Input from \"@/components/ui/Input\";\nimport { Pagination } from \"@/components/ui/Pagination\";\nimport { Popover } from \"@/components/ui/Popover\";\nimport { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from \"@/components/ui/Table\";\nimport { cn } from \"@/lib/utils/cn\";\nimport { Filter as FilterIcon } from \"lucide-react\";\nimport React from \"react\";\nimport { useTranslations } from \"@/lib/i18n/translation-adapter\";\n\ntype FilterType = \"text\" | \"select\" | \"date\";\n\nexport type DataTableColumn<T> = {\n key: string; // unique key\n title: React.ReactNode;\n dataIndex?: keyof T | string;\n width?: number | string;\n align?: \"left\" | \"center\" | \"right\";\n sortable?: boolean;\n filter?: { type: FilterType; options?: string[]; placeholder?: string };\n render?: (value: any, record: T, index: number) => React.ReactNode;\n visible?: boolean; // default true\n};\n\nexport type Sorter = { key: string; order: \"asc\" | \"desc\" } | null;\n\nexport interface DataTableQuery {\n filters: Record<string, any>;\n sort?: Sorter;\n page: number;\n pageSize: number;\n}\n\ninterface DataTableProps<T> {\n columns: DataTableColumn<T>[];\n data: T[];\n rowKey?: ((row: T) => string | number) | keyof T;\n loading?: boolean;\n total?: number;\n page?: number;\n pageSize?: number;\n pageSizeOptions?: number[]; // show page size selector if provided\n onQueryChange?: (q: DataTableQuery) => void; // server-side\n caption?: React.ReactNode;\n toolbar?: React.ReactNode;\n enableColumnVisibilityToggle?: boolean;\n enableDensityToggle?: boolean;\n enableHeaderAlignToggle?: boolean;\n striped?: boolean; // Bật/tắt màu nền sẽn kẽ cho các dòng\n /** Hiển thị đường kẻ dọc ngăn cách giữa các cột */\n columnDividers?: boolean;\n className?: string;\n /** Key để lưu pageSize vào localStorage. Nếu không cung cấp, pageSize sẽ không được persist */\n storageKey?: string;\n labels?: {\n density?: string;\n columns?: string;\n compact?: string;\n normal?: string;\n comfortable?: string;\n headerAlign?: string;\n alignLeft?: string;\n alignCenter?: string;\n alignRight?: string;\n };\n}\n\nfunction useDebounced<T>(value: T, delay = 300) {\n const [debounced, setDebounced] = React.useState(value);\n React.useEffect(() => {\n const id = setTimeout(() => setDebounced(value), delay);\n return () => clearTimeout(id);\n }, [value, delay]);\n return debounced;\n}\n\nexport function DataTable<T extends Record<string, any>>({\n columns,\n data,\n rowKey,\n loading,\n total = 0,\n page = 1,\n pageSize = 20,\n pageSizeOptions,\n onQueryChange,\n caption,\n toolbar,\n enableColumnVisibilityToggle = true,\n enableDensityToggle = true,\n enableHeaderAlignToggle = false,\n striped = true, // Mặc định bật màu nền sẽn kẽ cho các dòng\n columnDividers = false,\n className,\n storageKey,\n labels,\n}: DataTableProps<T>) {\n const t = useTranslations(\"Common\");\n const [headerAlign, setHeaderAlign] = React.useState<\"left\" | \"center\" | \"right\">(\"left\");\n const [visibleCols, setVisibleCols] = React.useState<string[]>(() => columns.filter((c) => c.visible !== false).map((c) => c.key));\n const [filters, setFilters] = React.useState<Record<string, any>>({});\n const [sort, setSort] = React.useState<Sorter>(null);\n const [density, setDensity] = React.useState<\"compact\" | \"normal\" | \"comfortable\">(\"normal\");\n const [curPage, setCurPage] = React.useState(page);\n\n // Track if component has mounted to prevent initial onQueryChange trigger\n const hasMounted = React.useRef(false);\n\n // Track if we loaded from localStorage to prevent prop override\n const loadedFromStorage = React.useRef(false);\n\n // Đọc pageSize từ localStorage nếu có storageKey\n const getInitialPageSize = React.useCallback(() => {\n if (typeof window === \"undefined\" || !storageKey) return pageSize;\n try {\n const saved = localStorage.getItem(`datatable_${storageKey}_pageSize`);\n if (saved) {\n const parsed = parseInt(saved, 10);\n if (!isNaN(parsed) && parsed > 0) {\n loadedFromStorage.current = true;\n return parsed;\n }\n }\n } catch {\n // localStorage không khả dụng\n }\n return pageSize;\n }, [storageKey, pageSize]);\n\n const [curPageSize, setCurPageSize] = React.useState(getInitialPageSize);\n\n // Lưu pageSize vào localStorage khi thay đổi (chỉ sau khi đã mount)\n React.useEffect(() => {\n if (typeof window === \"undefined\" || !storageKey) return;\n if (!hasMounted.current) return; // Không lưu khi mount lần đầu\n try {\n localStorage.setItem(`datatable_${storageKey}_pageSize`, String(curPageSize));\n } catch {\n // localStorage không khả dụng\n }\n }, [curPageSize, storageKey]);\n\n React.useEffect(() => {\n const newColKeys = columns.filter((c) => c.visible !== false).map((c) => c.key);\n setVisibleCols((prev) => {\n const uniqueKeys = new Set([...prev, ...newColKeys]);\n return [...uniqueKeys].filter((k) => columns.some((c) => c.key === k));\n });\n }, [columns]);\n\n const debouncedFilters = useDebounced(filters, 350);\n\n // Keep internal state in sync when parent controls page/pageSize\n React.useEffect(() => {\n setCurPage(page);\n }, [page]);\n\n // Chỉ sync pageSize từ parent nếu KHÔNG có storageKey hoặc chưa load từ localStorage\n React.useEffect(() => {\n if (storageKey && loadedFromStorage.current) {\n // Đã load từ localStorage, không ghi đè bằng prop\n return;\n }\n setCurPageSize(pageSize);\n }, [pageSize, storageKey]);\n\n // Emit query changes to parent (server-side mode)\n // Sử dụng hasMounted để tránh trigger onQueryChange khi mount lần đầu với giá trị từ localStorage\n React.useEffect(() => {\n if (!onQueryChange) return;\n\n // Không trigger onQueryChange lần đầu nếu đang dùng localStorage\n // để tránh infinite loop khi parent re-render\n if (!hasMounted.current) {\n hasMounted.current = true;\n return;\n }\n\n onQueryChange({ filters: debouncedFilters, sort, page: curPage, pageSize: curPageSize });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [debouncedFilters, sort, curPage, curPageSize]);\n\n const densityRowClass = density === \"compact\" ? \"h-9\" : density === \"comfortable\" ? \"h-14\" : \"h-12\";\n const cellPadding = density === \"compact\" ? \"py-1.5 px-3\" : density === \"comfortable\" ? \"py-3 px-4\" : \"py-2.5 px-4\";\n\n const visibleColumns = columns.filter((c) => visibleCols.includes(c.key));\n\n const getRowKey = (row: T, idx: number) => {\n if (!rowKey) return String(idx);\n if (typeof rowKey === \"function\") return String(rowKey(row));\n return String(row[rowKey as keyof T]);\n };\n\n const renderFilterControl = (col: DataTableColumn<T>) => {\n if (!col.filter) return null;\n const k = col.key;\n const commonProps = {\n className: \"h-8 w-full text-sm\",\n } as any;\n if (col.filter.type === \"text\") {\n return (\n <Input\n {...commonProps}\n placeholder={col.filter.placeholder || `Search ${String(col.title)}`}\n value={filters[k] || \"\"}\n onChange={(e) => {\n setCurPage(1);\n setFilters((f) => ({ ...f, [k]: e.target.value }));\n }}\n />\n );\n }\n if (col.filter.type === \"select\") {\n const options = col.filter.options || [];\n return (\n <Combobox\n options={[\"\", ...options]}\n size=\"sm\"\n className=\"w-full\"\n value={filters[k] ?? \"\"}\n onChange={(v) => {\n setCurPage(1);\n setFilters((f) => ({ ...f, [k]: v || undefined }));\n }}\n placeholder={col.filter.placeholder || `Select ${String(col.title)}`}\n />\n );\n }\n if (col.filter.type === \"date\") {\n return (\n <DatePicker\n placeholder={col.filter.placeholder || `Select ${String(col.title)}`}\n value={filters[k] || null}\n onChange={(d) => {\n setCurPage(1);\n setFilters((f) => ({ ...f, [k]: d ? (d as any) : undefined }));\n }}\n />\n );\n }\n return null;\n };\n\n const renderHeader = (\n <TableRow>\n {visibleColumns.map((col, colIdx) => (\n <TableHead\n key={col.key}\n style={{ width: col.width }}\n className={\n cn(\n // Use column-specific align if defined, otherwise use global headerAlign\n (col.align === \"right\" || (!col.align && headerAlign === \"right\")) && \"text-right\",\n (col.align === \"center\" || (!col.align && headerAlign === \"center\")) && \"text-center\",\n columnDividers && colIdx > 0 && \"border-l border-border/60\"\n ) as string\n }\n >\n {(() => {\n const isRightAlign = col.align === \"right\" || (!col.align && headerAlign === \"right\");\n const isCenterAlign = col.align === \"center\" || (!col.align && headerAlign === \"center\");\n\n const titleContent = (\n <div className=\"flex items-center gap-1 min-w-0 shrink\">\n <span className=\"truncate font-medium text-sm\">{col.title}</span>\n {col.sortable && (\n <button\n className={cn(\n \"p-1 rounded-sm transition-all duration-200 hover:bg-accent\",\n sort?.key === col.key ? \"opacity-100 bg-accent\" : \"opacity-60 hover:opacity-100\"\n )}\n onClick={() => {\n setCurPage(1);\n setSort((s) => {\n if (!s || s.key !== col.key) return { key: col.key, order: \"asc\" };\n if (s.order === \"asc\") return { key: col.key, order: \"desc\" };\n return null;\n });\n }}\n aria-label=\"Sort\"\n title={`Sort by ${String(col.title)}`}\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 20 20\" fill=\"none\" className=\"inline-block\">\n <path\n d=\"M7 8l3-3 3 3\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n opacity={sort?.key === col.key && sort.order === \"asc\" ? 1 : 0.4}\n />\n <path\n d=\"M7 12l3 3 3-3\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n opacity={sort?.key === col.key && sort.order === \"desc\" ? 1 : 0.4}\n />\n </svg>\n </button>\n )}\n </div>\n );\n\n const filterContent = col.filter && (\n <Popover\n placement={isRightAlign ? \"bottom-end\" : \"bottom-start\"}\n trigger={\n <button\n className={cn(\n \"p-1.5 rounded-md hover:bg-accent text-muted-foreground hover:text-foreground transition-colors\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background\",\n filters[col.key] && \"bg-accent text-foreground\"\n )}\n aria-label=\"Filter\"\n title=\"Filter\"\n >\n <FilterIcon className=\"h-4 w-4\" />\n </button>\n }\n >\n <div className=\"w-48 p-2 space-y-2\">\n <div className=\"text-xs font-medium text-muted-foreground mb-2\">Filter {col.title}</div>\n {renderFilterControl(col)}\n {filters[col.key] && (\n <button\n onClick={() => {\n setCurPage(1);\n setFilters((f) => {\n const newFilters = { ...f };\n delete newFilters[col.key];\n return newFilters;\n });\n }}\n className=\"text-xs text-destructive hover:underline\"\n >\n Clear filter\n </button>\n )}\n </div>\n </Popover>\n );\n\n return (\n <div\n className={cn(\n \"flex items-center gap-2 select-none min-h-10\",\n isRightAlign && \"justify-end\",\n isCenterAlign && \"justify-center\",\n !isRightAlign && !isCenterAlign && \"justify-between\"\n )}\n >\n {/* Khi căn phải: filter trước, title sau (đối xứng với căn trái) */}\n {isRightAlign ? (\n <>\n {filterContent}\n {titleContent}\n </>\n ) : (\n <>\n {titleContent}\n {filterContent}\n </>\n )}\n </div>\n );\n })()}\n </TableHead>\n ))}\n </TableRow>\n );\n\n const isServerMode = Boolean(onQueryChange);\n\n const processedData = React.useMemo(() => {\n if (isServerMode) return data;\n\n let result = [...data];\n\n // 1. Filter\n if (Object.keys(filters).length > 0) {\n result = result.filter((row) => {\n return Object.entries(filters).every(([key, value]) => {\n if (value === undefined || value === null || value === \"\") return true;\n\n const col = columns.find((c) => c.key === key);\n const rowValue = col?.dataIndex ? row[col.dataIndex as keyof T] : row[key];\n\n // Handle Date objects or specific types if needed\n if (col?.filter?.type === \"date\" && value instanceof Date) {\n // Simple date comparison (ignoring time for now or exact match)\n // For now, let's convert both to string or use a specific comparator\n // This is a basic implementation\n return new Date(rowValue).toDateString() === value.toDateString();\n }\n\n return String(rowValue ?? \"\")\n .toLowerCase()\n .includes(String(value).toLowerCase());\n });\n });\n }\n\n // 2. Sort\n if (sort) {\n result.sort((a, b) => {\n const col = columns.find((c) => c.key === sort.key);\n const aValue = col?.dataIndex ? a[col.dataIndex as keyof T] : a[sort.key];\n const bValue = col?.dataIndex ? b[col.dataIndex as keyof T] : b[sort.key];\n\n if (aValue === bValue) return 0;\n\n // Handle numbers\n if (typeof aValue === \"number\" && typeof bValue === \"number\") {\n return sort.order === \"asc\" ? aValue - bValue : bValue - aValue;\n }\n\n // Handle strings\n const compare = String(aValue).localeCompare(String(bValue));\n return sort.order === \"asc\" ? compare : -compare;\n });\n }\n\n return result;\n }, [data, isServerMode, filters, sort, columns]);\n\n const totalItems = isServerMode ? total : processedData.length;\n\n const displayedData = isServerMode\n ? data\n : React.useMemo(() => {\n const start = (curPage - 1) * curPageSize;\n // Ensure we don't slice out of bounds if page is too high for filtered results\n if (start >= processedData.length && curPage > 1) {\n // This effect will be handled by the pagination component or we should reset page here?\n // Ideally setCurPage(1) should happen when filter changes, which is already done in renderFilterControl\n }\n return processedData.slice(start, start + curPageSize);\n }, [processedData, curPage, curPageSize]);\n\n return (\n <div className={cn(\"space-y-2\", className)}>\n <div className=\"flex items-center justify-between gap-4 mb-1\">\n <div className=\"text-sm text-muted-foreground\">{caption}</div>\n <div className=\"flex items-center gap-2\">\n {enableDensityToggle && (\n <DropdownMenu\n trigger={\n <Button variant=\"ghost\" size=\"sm\" className=\"h-8 px-2\">\n <svg className=\"w-4 h-4 mr-1\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 6h16M4 10h16M4 14h16M4 18h16\" />\n </svg>\n {labels?.density || t(\"density\")}\n </Button>\n }\n items={[\n { label: (labels?.compact || t(\"compact\")) as string, onClick: () => setDensity(\"compact\") },\n { label: (labels?.normal || t(\"normal\")) as string, onClick: () => setDensity(\"normal\") },\n { label: (labels?.comfortable || t(\"comfortable\")) as string, onClick: () => setDensity(\"comfortable\") },\n ]}\n />\n )}\n {enableColumnVisibilityToggle && (\n <DropdownMenu\n trigger={\n <Button variant=\"ghost\" size=\"sm\" className=\"h-8 px-2\">\n <svg className=\"w-4 h-4 mr-1\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M9 17V7m0 10a2 2 0 01-2 2H5a2 2 0 01-2-2V7a2 2 0 012-2h2a2 2 0 012 2m0 10a2 2 0 002 2h2a2 2 0 002-2M9 7a2 2 0 012-2h2a2 2 0 012 2m0 10V7m0 10a2 2 0 002 2h2a2 2 0 002-2V7a2 2 0 00-2-2h-2a2 2 0 00-2 2\"\n />\n </svg>\n {labels?.columns || t(\"columns\")}\n </Button>\n }\n >\n {columns.map((c) => (\n <DropdownMenuItem\n key={c.key}\n onClick={() => {\n setVisibleCols((prev) => (prev.includes(c.key) ? prev.filter((k) => k !== c.key) : [...prev, c.key]));\n }}\n >\n <input type=\"checkbox\" className=\"mr-2 rounded border-border\" readOnly checked={visibleCols.includes(c.key)} />\n <span className=\"truncate\">{c.title as any}</span>\n </DropdownMenuItem>\n ))}\n </DropdownMenu>\n )}\n {enableHeaderAlignToggle && (\n <DropdownMenu\n trigger={\n <Button variant=\"ghost\" size=\"sm\" className=\"h-8 px-2\">\n <svg className=\"w-4 h-4 mr-1\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 6h16M4 12h10M4 18h16\" />\n </svg>\n {labels?.headerAlign || t(\"headerAlign\")}\n </Button>\n }\n items={[\n { label: (labels?.alignLeft || t(\"alignLeft\")) as string, onClick: () => setHeaderAlign(\"left\") },\n { label: (labels?.alignCenter || t(\"alignCenter\")) as string, onClick: () => setHeaderAlign(\"center\") },\n { label: (labels?.alignRight || t(\"alignRight\")) as string, onClick: () => setHeaderAlign(\"right\") },\n ]}\n />\n )}\n {toolbar}\n </div>\n </div>\n\n <div className={cn(\"relative rounded-md border border-border/50 overflow-hidden\", loading && \"opacity-60 pointer-events-none\")}>\n <Table\n containerClassName=\"border-0 md:border-0 rounded-none md:rounded-none shadow-none bg-transparent\"\n className=\"[&_thead]:sticky [&_thead]:top-0 [&_thead]:z-5 [&_thead]:bg-background [&_thead]:backdrop-blur-sm\"\n >\n <TableHeader>{renderHeader}</TableHeader>\n <TableBody>\n {loading ? (\n <TableRow>\n <TableCell colSpan={visibleColumns.length} className=\"text-center py-8\">\n <div className=\"flex items-center justify-center gap-2 text-muted-foreground\">\n <svg className=\"animate-spin h-4 w-4\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle className=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"4\"></circle>\n <path\n className=\"opacity-75\"\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\n ></path>\n </svg>\n <span className=\"text-sm\">Loading...</span>\n </div>\n </TableCell>\n </TableRow>\n ) : !displayedData || displayedData.length === 0 ? (\n <TableRow>\n <TableCell colSpan={visibleColumns.length} className=\"text-center py-6 text-muted-foreground\">\n No data\n </TableCell>\n </TableRow>\n ) : (\n displayedData.map((row, idx) => {\n const isLastRow = idx === displayedData.length - 1;\n return (\n <TableRow key={getRowKey(row, idx)} className={cn(densityRowClass, striped && idx % 2 === 0 && \"bg-muted/50\")}>\n {visibleColumns.map((col, colIdx) => {\n const value = col.dataIndex ? row[col.dataIndex as keyof T] : undefined;\n return (\n <TableCell\n key={col.key}\n className={\n cn(\n cellPadding,\n col.align === \"right\" && \"text-right\",\n col.align === \"center\" && \"text-center\",\n columnDividers && colIdx > 0 && \"border-l border-border/60\",\n isLastRow && col === visibleColumns[0] && \"rounded-bl-md\",\n isLastRow && col === visibleColumns[visibleColumns.length - 1] && \"rounded-br-md\"\n ) as string\n }\n >\n {col.render ? col.render(value, row, idx) : String(value ?? \"\")}\n </TableCell>\n );\n })}\n </TableRow>\n );\n })\n )}\n </TableBody>\n </Table>\n </div>\n\n {totalItems > 0 && (\n <div className=\"border-t bg-muted/30 p-4 rounded-b-md\">\n <Pagination\n page={curPage}\n totalPages={Math.ceil(totalItems / curPageSize)}\n onChange={(p) => setCurPage(p)}\n className=\"\"\n showInfo\n totalItems={totalItems}\n pageSize={curPageSize}\n pageSizeOptions={pageSizeOptions}\n onPageSizeChange={(s) => {\n setCurPage(1);\n setCurPageSize(s);\n }}\n />\n </div>\n )}\n </div>\n );\n}\n\nexport default DataTable;\n","\"use client\";\n\nimport * as React from \"react\";\n// Remove radix-ui imports as they are no longer needed\nimport { Controller, ControllerProps, FieldPath, FieldValues, FormProvider, useFormContext, useForm, SubmitHandler } from \"react-hook-form\";\nimport { useTranslations } from \"@/lib/i18n/translation-adapter\";\n\nimport { cn } from \"@/lib/utils/cn\";\nimport { Label } from \"@/components/ui/label\";\nimport Input from \"@/components/ui/Input\";\nimport Button from \"@/components/ui/Button\";\nimport { Checkbox } from \"@/components/ui/CheckBox\";\n\n// Form wrapper with validation support\ninterface FormWrapperProps<T extends FieldValues = FieldValues> {\n children: React.ReactNode;\n onSubmit: SubmitHandler<T>;\n initialValues?: Partial<T>;\n validationSchema?: Record<string, any>; // Simple validation schema\n className?: string;\n size?: \"sm\" | \"md\" | \"lg\"; // unify inner control sizes\n}\n\n// Provide form-level config (e.g., size) to inner controls\ntype FormConfig = { size: \"sm\" | \"md\" | \"lg\" };\nconst FormConfigContext = React.createContext<FormConfig>({ size: \"md\" });\n\nconst FormWrapper = <T extends FieldValues = FieldValues>({\n children,\n onSubmit,\n initialValues,\n validationSchema,\n className,\n size = \"md\",\n ...props\n}: FormWrapperProps<T>) => {\n const methods = useForm<T>({\n defaultValues: initialValues as any,\n });\n\n // Keep form in sync when initialValues change\n React.useEffect(() => {\n if (initialValues) {\n methods.reset(initialValues as any);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [JSON.stringify(initialValues)]);\n\n // Extract DOM-unsafe props\n const { validationSchema: _, ...formProps } = props as any;\n\n return (\n <FormProvider {...methods}>\n <FormConfigContext.Provider value={{ size }}>\n <form onSubmit={methods.handleSubmit(onSubmit)} className={className} {...formProps}>\n {children}\n </form>\n </FormConfigContext.Provider>\n </FormProvider>\n );\n};\n\n// For backward compatibility, let Form be the wrapper by default\nconst Form = FormWrapper;\n\ntype FormFieldContextValue<TFieldValues extends FieldValues = FieldValues, TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>> = {\n name: TName;\n};\n\nconst FormFieldContext = React.createContext<FormFieldContextValue>({} as FormFieldContextValue);\n\nconst FormField = <TFieldValues extends FieldValues = FieldValues, TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>>({\n ...props\n}: ControllerProps<TFieldValues, TName>) => {\n return (\n <FormFieldContext.Provider value={{ name: props.name }}>\n <Controller {...props} />\n </FormFieldContext.Provider>\n );\n};\n\nconst useFormField = () => {\n const fieldContext = React.useContext(FormFieldContext);\n const itemContext = React.useContext(FormItemContext);\n const { getFieldState, formState } = useFormContext();\n\n if (!fieldContext) {\n // Only access i18n when we actually need the message, to avoid\n // requiring the 'Form' namespace in all consumers.\n try {\n const t = useTranslations(\"Form\");\n throw new Error(t(\"validation.mustBeUsedWithinForm\"));\n } catch {\n throw new Error(\"useFormField must be used within FormField\");\n }\n }\n\n const fieldState = getFieldState(fieldContext.name, formState);\n\n const { id } = itemContext;\n\n return {\n id,\n name: fieldContext.name,\n formItemId: `${id}-form-item`,\n formDescriptionId: `${id}-form-item-description`,\n formMessageId: `${id}-form-item-message`,\n ...fieldState,\n };\n};\n\nconst FormItemContext = React.createContext<FormItemContextValue>({} as FormItemContextValue);\n\ntype FormItemContextValue = {\n id: string;\n};\n\nconst FormItem = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(({ className, ...props }, ref) => {\n const id = React.useId();\n\n return (\n <FormItemContext.Provider value={{ id }}>\n <div ref={ref} className={cn(\"space-y-2\", className)} {...props} />\n </FormItemContext.Provider>\n );\n});\nFormItem.displayName = \"FormItem\";\n\nconst FormLabel = React.forwardRef<HTMLLabelElement, React.LabelHTMLAttributes<HTMLLabelElement> & { required?: boolean }>(\n ({ className, children, required, ...props }, ref) => {\n const { error, formItemId } = useFormField();\n const config = React.useContext(FormConfigContext);\n const sizeClass = config.size === \"sm\" ? \"text-xs\" : config.size === \"lg\" ? \"text-base\" : \"text-sm\";\n\n return (\n <Label ref={ref} className={cn(sizeClass, error && \"text-destructive\", className)} htmlFor={formItemId} {...props}>\n {children}\n {required && <span className=\"text-destructive ml-1\">*</span>}\n </Label>\n );\n }\n);\nFormLabel.displayName = \"FormLabel\";\n\nconst FormControl = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(({ ...props }, ref) => {\n const { error, formItemId, formDescriptionId, formMessageId } = useFormField();\n\n return (\n <div\n ref={ref}\n id={formItemId}\n aria-describedby={!error ? `${formDescriptionId}` : `${formDescriptionId} ${formMessageId}`}\n aria-invalid={!!error}\n {...props}\n />\n );\n});\nFormControl.displayName = \"FormControl\";\n\nconst FormDescription = React.forwardRef<HTMLParagraphElement, React.HTMLAttributes<HTMLParagraphElement>>(({ className, ...props }, ref) => {\n const { formDescriptionId } = useFormField();\n\n return <p ref={ref} id={formDescriptionId} className={cn(\"text-sm text-muted-foreground\", className)} {...props} />;\n});\nFormDescription.displayName = \"FormDescription\";\n\nconst FormMessage = React.forwardRef<HTMLParagraphElement, React.HTMLAttributes<HTMLParagraphElement>>(({ className, children, ...props }, ref) => {\n const { error, formMessageId } = useFormField();\n const body = error ? String(error?.message) : children;\n\n if (!body) {\n return null;\n }\n\n return (\n <p ref={ref} id={formMessageId} className={cn(\"text-sm font-medium text-destructive\", className)} {...props}>\n {body}\n </p>\n );\n});\nFormMessage.displayName = \"FormMessage\";\n\n// Additional form components for compatibility\nconst FormInput = React.forwardRef<HTMLInputElement, React.ComponentProps<typeof Input> & { name: string }>(({ name, ...props }, ref) => (\n <FormConfigContext.Consumer>\n {({ size }) => (\n <FormField\n name={name}\n render={({ field }) => (\n <FormItem>\n <FormControl>\n <Input size={props.size ?? size} {...field} {...props} />\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n )}\n </FormConfigContext.Consumer>\n));\nFormInput.displayName = \"FormInput\";\n\nconst FormCheckbox = React.forwardRef<HTMLInputElement, React.ComponentProps<typeof Checkbox> & { name: string }>(({ name, ...props }, ref) => (\n <FormConfigContext.Consumer>\n {({ size }) => (\n <FormField\n name={name}\n render={({ field }) => (\n <FormItem>\n <FormControl>\n <Checkbox\n ref={ref}\n checked={field.value}\n onChange={(e) => field.onChange(e.target.checked)}\n labelClassName={cn(\n // align label text size with inputs/buttons by form size\n size === \"sm\" ? \"text-xs\" : size === \"lg\" ? \"text-base\" : \"text-sm\",\n (props as any).labelClassName\n )}\n {...props}\n />\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n )}\n </FormConfigContext.Consumer>\n));\nFormCheckbox.displayName = \"FormCheckbox\";\n\nconst FormActions = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(({ className, ...props }, ref) => (\n <div ref={ref} className={cn(\"flex gap-2 justify-end\", className)} {...props} />\n));\nFormActions.displayName = \"FormActions\";\n\nconst FormSubmitButton = React.forwardRef<HTMLButtonElement, React.ComponentProps<typeof Button> & { loading?: boolean }>(\n ({ children, loading, ...props }, ref) => (\n <FormConfigContext.Consumer>\n {({ size }) => (\n <Button ref={ref} type=\"submit\" size={(props.size as any) ?? size} disabled={loading} {...props}>\n {children}\n </Button>\n )}\n </FormConfigContext.Consumer>\n )\n);\nFormSubmitButton.displayName = \"FormSubmitButton\";\n\nexport {\n useFormField,\n Form,\n FormItem,\n FormLabel,\n FormControl,\n FormDescription,\n FormField,\n FormMessage,\n FormInput,\n FormCheckbox,\n FormActions,\n FormSubmitButton,\n};\n","\"use client\";\r\n\r\nimport { ExternalLink } from \"lucide-react\";\r\nimport Button from \"@/components/ui/Button\";\r\nimport Modal from \"@/components/ui/Modal\";\r\nimport { cn } from \"@/lib/utils/cn\";\r\nimport { useTranslations } from \"@/lib/i18n/translation-adapter\";\r\n\r\ninterface NotificationItem {\r\n id: number;\r\n title?: string;\r\n body?: string;\r\n type?: string;\r\n is_read: boolean;\r\n created_at: string;\r\n metadata?: any;\r\n}\r\n\r\ninterface NotificationModalProps {\r\n isOpen: boolean;\r\n onClose: () => void;\r\n notification: NotificationItem | null;\r\n titleText?: string;\r\n openLinkText?: string;\r\n closeText?: string;\r\n}\r\n\r\nexport function NotificationModal({ isOpen, onClose, notification, titleText, openLinkText, closeText }: NotificationModalProps) {\r\n const t = useTranslations(\"Common\");\r\n\r\n if (!notification) return null;\r\n\r\n const formatTime = (dateString: string) => {\r\n const date = new Date(dateString);\r\n return date.toLocaleString(undefined, {\r\n year: \"numeric\",\r\n month: \"2-digit\",\r\n day: \"2-digit\",\r\n hour: \"2-digit\",\r\n minute: \"2-digit\",\r\n });\r\n };\r\n\r\n const hasLink = notification.metadata?.link;\r\n\r\n const handleLinkClick = () => {\r\n if (hasLink) {\r\n window.open(notification.metadata.link, \"_blank\");\r\n onClose();\r\n }\r\n };\r\n\r\n return (\r\n <Modal isOpen={isOpen} onClose={onClose} title={titleText || t(\"notifications\")} size=\"md\">\r\n <div className=\"space-y-4\">\r\n {/* Status indicator */}\r\n <div className=\"flex items-center gap-2 pb-2 border-b border-border\">\r\n <div className={cn(\"w-2 h-2 rounded-full\", !notification.is_read ? \"bg-primary\" : \"bg-border\")} />\r\n <span className=\"text-xs text-muted-foreground\">{!notification.is_read ? t(\"newNotification\") : t(\"readStatus\")}</span>\r\n </div>\r\n\r\n {notification.title && <h3 className=\"text-lg font-semibold text-foreground\">{notification.title}</h3>}\r\n\r\n {notification.body && <div className=\"text-sm text-muted-foreground whitespace-pre-wrap leading-relaxed\">{notification.body}</div>}\r\n\r\n <div className=\"text-xs text-muted-foreground border-t border-border pt-2\">{formatTime(notification.created_at)}</div>\r\n\r\n {/* Actions */}\r\n <div className=\"flex gap-2 justify-end pt-2\">\r\n {hasLink && (\r\n <Button variant=\"primary\" size=\"sm\" onClick={handleLinkClick} className=\"gap-2\">\r\n <ExternalLink className=\"w-4 h-4\" />\r\n {openLinkText || t(\"openLink\")}\r\n </Button>\r\n )}\r\n <Button variant=\"ghost\" size=\"sm\" onClick={onClose}>\r\n {closeText || t(\"close\")}\r\n </Button>\r\n </div>\r\n </div>\r\n </Modal>\r\n );\r\n}\r\n\r\nexport default NotificationModal;\r\n","\"use client\";\n\nimport Link from \"next/link\";\nimport { usePathname } from \"next/navigation\";\nimport { Phone } from \"lucide-react\";\nimport { cn } from \"@/lib/utils/cn\";\n\ninterface FloatingContactsProps {\n className?: string;\n}\n\n// Brand icons as inline SVGs\nfunction MessengerIcon(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg viewBox=\"0 0 24 24\" width={24} height={24} aria-hidden=\"true\" {...props}>\n <path\n d=\"M12 2C6.477 2 2 6.145 2 11.235c0 2.93 1.35 5.542 3.464 7.25v3.515l3.344-1.836c.894.247 1.843.375 2.192.375 5.523 0 10-4.145 10-9.235S17.523 2 12 2zm.994 12.444l-2.563-2.73-5.004 2.73 5.507-5.84 2.626 2.729 4.942-2.729-5.508 5.84z\"\n fill=\"white\"\n />\n </svg>\n );\n}\n\nfunction ZaloIcon(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg viewBox=\"0 0 48 48\" width={20} height={20} aria-hidden=\"true\" {...props}>\n <path\n fill=\"white\"\n d=\"M24 4C12.954 4 4 12.954 4 24s8.954 20 20 20 20-8.954 20-20S35.046 4 24 4zm6.164 27.602h-4.239c-.405 0-.732-.328-.732-.732v-7.596l-2.646 7.933c-.096.288-.366.482-.67.482h-1.773c-.304 0-.574-.194-.67-.482l-2.647-7.933v7.596c0 .405-.327.732-.732.732h-2.873c-.405 0-.732-.328-.732-.732V17.134c0-.405.327-.732.732-.732h3.91c.32 0 .602.208.698.514l2.68 8.042 2.68-8.042c.096-.306.378-.514.698-.514h3.91c.405 0 .732.327.732.732v14.466c0 .404-.327.732-.732.732z\"\n />\n </svg>\n );\n}\n\nfunction InstagramIcon(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg viewBox=\"0 0 24 24\" width={20} height={20} aria-hidden=\"true\" fill=\"white\" {...props}>\n <path d=\"M12 2.163c3.204 0 3.584.012 4.85.07 3.252.148 4.771 1.691 4.919 4.919.058 1.265.069 1.645.069 4.849 0 3.205-.012 3.584-.069 4.849-.149 3.225-1.664 4.771-4.919 4.919-1.266.058-1.644.07-4.85.07-3.204 0-3.584-.012-4.849-.07-3.26-.149-4.771-1.699-4.919-4.92-.058-1.265-.07-1.644-.07-4.849 0-3.204.013-3.583.07-4.849.149-3.227 1.664-4.771 4.919-4.919 1.266-.057 1.645-.069 4.849-.069zm0-2.163c-3.259 0-3.667.014-4.947.072-4.358.2-6.78 2.618-6.98 6.98-.059 1.281-.073 1.689-.073 4.948 0 3.259.014 3.668.072 4.948.2 4.358 2.618 6.78 6.98 6.98 1.281.058 1.689.072 4.948.072 3.259 0 3.668-.014 4.948-.072 4.354-.2 6.782-2.618 6.979-6.98.059-1.28.073-1.689.073-4.948 0-3.259-.014-3.667-.072-4.947-.196-4.354-2.617-6.78-6.979-6.98-1.281-.059-1.69-.073-4.949-.073zm0 5.838c-3.403 0-6.162 2.759-6.162 6.162s2.759 6.163 6.162 6.163 6.162-2.759 6.162-6.163c0-3.403-2.759-6.162-6.162-6.162zm0 10.162c-2.209 0-4-1.79-4-4 0-2.209 1.791-4 4-4s4 1.791 4 4c0 2.21-1.791 4-4 4zm6.406-11.845c-.796 0-1.441.645-1.441 1.44s.645 1.44 1.441 1.44c.795 0 1.439-.645 1.439-1.44s-.644-1.44-1.439-1.44z\" />\n </svg>\n );\n}\n\nexport default function FloatingContacts({ className }: FloatingContactsProps) {\n const pathname = usePathname();\n if (pathname?.includes(\"/admin\")) return null;\n\n const hotline = process.env.NEXT_PUBLIC_HOTLINE || \"0962209870\";\n const zalo = process.env.NEXT_PUBLIC_ZALO || \"0356611301\";\n const messenger = process.env.NEXT_PUBLIC_MESSENGER_URL || \"https://m.me/thejojoflowers\";\n const instagram = process.env.NEXT_PUBLIC_INSTAGRAM_URL || \"https://www.instagram.com/thejojoflowers\";\n\n // Order: Zalo → Messenger → Instagram (phone rendered first)\n const moreItems = [\n {\n key: \"zalo\",\n href: `https://zalo.me/${zalo.replace(/\\D/g, \"\")}`,\n label: \"Zalo\",\n bg: \"bg-[#0068FF]\",\n Icon: ZaloIcon,\n external: true,\n },\n {\n key: \"messenger\",\n href: messenger,\n label: \"Messenger\",\n bg: \"bg-[#0084FF]\",\n Icon: MessengerIcon,\n external: true,\n },\n {\n key: \"instagram\",\n href: instagram,\n label: \"Instagram\",\n bg: \"bg-[#E1306C]\",\n Icon: InstagramIcon,\n external: true,\n },\n ];\n\n return (\n <div className={cn(\"fixed bottom-6 right-4 z-100000\", \"flex flex-col items-end gap-3\", className)} aria-label=\"Quick contacts\">\n {/* Phone on top */}\n <Link\n href={`tel:${hotline.replace(/\\D/g, \"\")}`}\n aria-label=\"Gọi\"\n className={cn(\n \"w-12 h-12 rounded-full text-white shadow-lg leading-none\",\n \"grid place-items-center\",\n \"hover:scale-105 active:scale-95 transition-transform\",\n \"bg-[#22c55e]\"\n )}\n >\n <Phone className=\"w-6 h-6\" />\n </Link>\n\n {/* Then Zalo → Messenger → Instagram */}\n {moreItems.map(({ key, href, label, bg, Icon, external }) => (\n <Link\n key={key}\n href={href}\n {...(external ? { target: \"_blank\", rel: \"noopener noreferrer\" } : {})}\n aria-label={label}\n className={cn(\n \"w-12 h-12 rounded-full text-white shadow-lg leading-none\",\n \"grid place-items-center\",\n \"hover:scale-105 active:scale-95 transition-transform\",\n bg\n )}\n >\n <Icon className=\"w-6 h-6\" />\n </Link>\n ))}\n </div>\n );\n}\n","\"use client\";\n\nimport Card from \"@/components/ui/Card\";\nimport { cn } from \"@/lib/utils/cn\";\nimport { Ban, Lock, ShieldAlert } from \"lucide-react\";\nimport React from \"react\";\n\ntype Variant = \"destructive\" | \"warning\" | \"info\";\n\ninterface AccessDeniedProps {\n title?: string;\n description?: string;\n variant?: Variant;\n icon?: React.ComponentType<{ className?: string }>;\n className?: string;\n children?: React.ReactNode; // actions\n}\n\nconst VARIANT_STYLES: Record<Variant, { bg: string; border: string; text: string }> = {\n destructive: { bg: \"bg-destructive/5\", border: \"border-destructive/20\", text: \"text-destructive\" },\n warning: { bg: \"bg-warning/5\", border: \"border-warning/20\", text: \"text-warning\" },\n info: { bg: \"bg-info/5\", border: \"border-info/20\", text: \"text-info\" },\n};\n\nconst DEFAULT_ICONS: Record<Variant, React.ComponentType<{ className?: string }>> = {\n destructive: ShieldAlert,\n warning: Ban,\n info: Lock,\n};\n\nexport default function AccessDenied({\n title = \"Access Restricted\",\n description = \"You do not have permission to access this area.\",\n variant = \"destructive\",\n icon: Icon,\n className,\n children,\n}: AccessDeniedProps) {\n const styles = VARIANT_STYLES[variant];\n const UsedIcon = Icon || DEFAULT_ICONS[variant];\n\n return (\n <Card className={cn(\"p-8 text-center shadow-sm\", styles.bg, styles.border, className)}>\n <div className=\"flex flex-col items-center gap-4\">\n <div className={cn(\"p-3 rounded-lg\", styles.bg.replace(\"/5\", \"/10\"))}>\n <UsedIcon className={cn(\"w-8 h-8\", styles.text)} />\n </div>\n <div>\n <h3 className={cn(\"font-semibold mb-2\", styles.text)}>{title}</h3>\n <p className={cn(styles.text.replace(\"text-\", \"text-\") + \"/80\", \"text-sm\")}>{description}</p>\n </div>\n {children && <div className=\"mt-2 flex flex-wrap gap-2 justify-center\">{children}</div>}\n </div>\n </Card>\n );\n}\n","\"use client\";\n\nimport { Moon, Sun, Monitor } from \"lucide-react\";\nimport Button from \"./Button\";\nimport { cn } from \"@/lib/utils/cn\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\n\nexport type ThemeMode = \"light\" | \"dark\" | \"system\";\n\nexport interface ThemeToggleHeadlessProps {\n theme: ThemeMode;\n onChange: (theme: ThemeMode) => void;\n labels?: {\n heading?: string;\n light?: string;\n dark?: string;\n system?: string;\n };\n className?: string;\n}\n\nexport default function ThemeToggleHeadless({\n theme,\n onChange,\n labels,\n className,\n}: ThemeToggleHeadlessProps) {\n const [isOpen, setIsOpen] = useState(false);\n const [mounted, setMounted] = useState(false);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const [dropdownPosition, setDropdownPosition] = useState<{ top: number; left: number; width: number } | null>(null);\n\n useEffect(() => setMounted(true), []);\n\n const themes = [\n { value: \"light\" as const, label: labels?.light ?? \"Light\", icon: Sun },\n { value: \"dark\" as const, label: labels?.dark ?? \"Dark\", icon: Moon },\n { value: \"system\" as const, label: labels?.system ?? \"System\", icon: Monitor },\n ];\n\n const current = mounted ? themes.find((t) => t.value === theme) || themes[2] : themes[2];\n const CurrentIcon = current.icon;\n\n const calculatePosition = () => {\n const rect = triggerRef.current?.getBoundingClientRect();\n if (!rect) return null;\n const scrollTop = window.pageYOffset || document.documentElement.scrollTop;\n const scrollLeft = window.pageXOffset || document.documentElement.scrollLeft;\n const width = 192; // w-48\n const left = rect.right + scrollLeft - width;\n const top = rect.bottom + scrollTop + 8;\n return { top, left, width };\n };\n\n return (\n <div className={cn(\"relative\", className)}>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n ref={triggerRef}\n onClick={() => {\n const next = !isOpen;\n if (next) {\n const pos = calculatePosition();\n if (pos) setDropdownPosition(pos);\n }\n setIsOpen(next);\n }}\n className=\"bg-muted hover:bg-accent\"\n aria-haspopup=\"menu\"\n aria-expanded={isOpen}\n aria-label={labels?.heading ?? \"Theme\"}\n >\n <CurrentIcon className=\"h-5 w-5\" />\n </Button>\n\n {isOpen && (\n <>\n {typeof window !== \"undefined\" &&\n createPortal(<div className=\"fixed inset-0 z-9998\" onClick={() => setIsOpen(false)} />, document.body)}\n\n {typeof window !== \"undefined\" && dropdownPosition &&\n createPortal(\n <div\n className=\"z-9999 bg-card border border-border rounded-lg shadow-lg overflow-hidden\"\n style={{ position: \"absolute\", top: dropdownPosition.top, left: dropdownPosition.left, width: dropdownPosition.width }}\n onMouseDown={(e) => e.stopPropagation()}\n role=\"menu\"\n >\n <div className=\"p-2\">\n <div className=\"px-3 py-2 text-sm font-medium text-muted-foreground border-b border-border mb-2\">\n {labels?.heading ?? \"Theme\"}\n </div>\n {themes.map((opt) => {\n const Icon = opt.icon;\n const active = theme === opt.value;\n return (\n <Button\n key={opt.value}\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => {\n onChange(opt.value);\n setIsOpen(false);\n }}\n className={cn(\n \"w-full justify-start gap-3 h-auto py-2 px-3\",\n active && \"bg-primary/10 text-primary\"\n )}\n role=\"menuitemradio\"\n aria-checked={active}\n >\n <Icon className=\"h-4 w-4\" />\n <span className=\"flex-1 text-left\">{opt.label}</span>\n {active && <div className=\"w-2 h-2 rounded-full bg-primary\" />}\n </Button>\n );\n })}\n </div>\n </div>,\n document.body\n )}\n </>\n )}\n </div>\n );\n}\n\n","\"use client\";\n\nimport React, { useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { Globe } from \"lucide-react\";\nimport Button from \"./Button\";\nimport { cn } from \"@/lib/utils/cn\";\n\nexport interface LanguageOption {\n code: string;\n name: string;\n flag?: string;\n}\n\nexport interface LanguageSwitcherHeadlessProps {\n locales: LanguageOption[];\n currentLocale: string;\n onSwitch: (code: string) => void;\n labels?: { heading?: string };\n className?: string;\n}\n\nexport default function LanguageSwitcherHeadless({\n locales,\n currentLocale,\n onSwitch,\n labels,\n className,\n}: LanguageSwitcherHeadlessProps) {\n const [isOpen, setIsOpen] = useState(false);\n const [dropdownPosition, setDropdownPosition] = useState<{ top: number; left: number; width: number } | null>(null);\n const triggerButtonRef = useRef<HTMLButtonElement>(null);\n\n const currentLanguage = locales.find((l) => l.code === currentLocale) || locales[0];\n\n const calculatePosition = () => {\n const rect = triggerButtonRef.current?.getBoundingClientRect();\n if (!rect) return null;\n const scrollTop = window.pageYOffset || document.documentElement.scrollTop;\n const scrollLeft = window.pageXOffset || document.documentElement.scrollLeft;\n const width = 192; // w-48\n const left = rect.right + scrollLeft - width;\n const top = rect.bottom + scrollTop + 8;\n return { top, left, width };\n };\n\n return (\n <div className={cn(\"relative\", className)}>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n ref={triggerButtonRef}\n onClick={() => {\n const next = !isOpen;\n if (next) {\n const pos = calculatePosition();\n if (pos) setDropdownPosition(pos);\n }\n setIsOpen(next);\n }}\n className=\"bg-muted hover:bg-accent\"\n aria-haspopup=\"menu\"\n aria-expanded={isOpen}\n aria-label={labels?.heading ?? \"Language\"}\n title={labels?.heading ?? \"Language\"}\n >\n <Globe className=\"h-5 w-5\" />\n </Button>\n\n {isOpen && (\n <>\n {typeof window !== \"undefined\" && createPortal(<div className=\"fixed inset-0 z-9998\" onClick={() => setIsOpen(false)} />, document.body)}\n {typeof window !== \"undefined\" && dropdownPosition &&\n createPortal(\n <div\n className=\"z-9999 bg-card border border-border rounded-lg shadow-lg overflow-hidden\"\n style={{ position: \"absolute\", top: dropdownPosition.top, left: dropdownPosition.left, width: dropdownPosition.width }}\n onMouseDown={(e) => e.stopPropagation()}\n role=\"menu\"\n >\n <div className=\"p-2\">\n <div className=\"px-3 py-2 text-sm font-medium text-muted-foreground border-b border-border mb-2\">\n {labels?.heading ?? \"Language\"}\n </div>\n\n {locales.map((language) => (\n <Button\n key={language.code}\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => {\n onSwitch(language.code);\n setIsOpen(false);\n }}\n className={cn(\"w-full justify-start gap-3 h-auto py-2 px-3\", currentLocale === language.code && \"bg-primary/10 text-primary\")}\n role=\"menuitemradio\"\n aria-checked={currentLocale === language.code}\n >\n {language.flag && <span className=\"text-lg\">{language.flag}</span>}\n <span className=\"flex-1 text-left\">{language.name}</span>\n {currentLocale === language.code && <div className=\"w-2 h-2 rounded-full bg-primary\" />}\n </Button>\n ))}\n </div>\n </div>,\n document.body\n )}\n </>\n )}\n </div>\n );\n}\n\n","import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\n/**\n * Utility function to merge Tailwind CSS classes.\n * Combines clsx for conditional classes and tailwind-merge for deduplication.\n *\n * @param inputs - Class values to merge\n * @returns Merged class string\n *\n * @example\n * ```tsx\n * cn(\"px-4 py-2\", isActive && \"bg-primary\", className)\n * // => \"px-4 py-2 bg-primary your-custom-class\"\n * ```\n */\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","/**\n * Date formatting utilities with locale support\n * Provides consistent date/time formatting across the application\n *\n * @example\n * ```tsx\n * import { DateUtils } from \"@underverse-ui/underverse\";\n *\n * // Format date with default locale (en)\n * DateUtils.formatDate(new Date()); // \"December 25, 2024\"\n *\n * // Format date with Vietnamese locale\n * DateUtils.formatDate(new Date(), \"vi\"); // \"25 tháng 12, 2024\"\n * ```\n */\n\nexport type SupportedLocale = \"en\" | \"vi\" | \"ko\" | \"ja\";\n\nconst localeMap: Record<SupportedLocale, string> = {\n en: \"en-US\",\n vi: \"vi-VN\",\n ko: \"ko-KR\",\n ja: \"ja-JP\",\n};\n\n/**\n * Get the browser locale string for a supported locale\n */\nfunction getLocaleString(locale: SupportedLocale = \"en\"): string {\n return localeMap[locale] || localeMap.en;\n}\n\n/**\n * Format date to readable format\n * @example\n * formatDate(new Date(), \"vi\") // \"25 tháng 12, 2024\"\n * formatDate(new Date(), \"en\") // \"December 25, 2024\"\n */\nexport function formatDate(date: string | Date | null | undefined, locale: SupportedLocale = \"en\"): string {\n if (!date) return \"\";\n const d = new Date(date);\n if (isNaN(d.getTime())) return \"\";\n\n return d.toLocaleDateString(getLocaleString(locale), {\n day: \"numeric\",\n month: \"long\",\n year: \"numeric\",\n });\n}\n\n/**\n * Format date to short format\n * @example\n * formatDateShort(new Date(), \"vi\") // \"25/12/2024\"\n * formatDateShort(new Date(), \"en\") // \"12/25/2024\"\n */\nexport function formatDateShort(date: string | Date | null | undefined, locale: SupportedLocale = \"en\"): string {\n if (!date) return \"\";\n const d = new Date(date);\n if (isNaN(d.getTime())) return \"\";\n\n return d.toLocaleDateString(getLocaleString(locale), {\n day: \"2-digit\",\n month: \"2-digit\",\n year: \"numeric\",\n });\n}\n\n/**\n * Format time only\n * @example formatTime(new Date()) // \"14:30\"\n */\nexport function formatTime(date: string | Date | null | undefined, locale: SupportedLocale = \"en\"): string {\n if (!date) return \"\";\n const d = new Date(date);\n if (isNaN(d.getTime())) return \"\";\n\n return d.toLocaleTimeString(getLocaleString(locale), {\n hour: \"2-digit\",\n minute: \"2-digit\",\n });\n}\n\n/**\n * Format date and time\n * @example\n * formatDateTime(new Date(), \"vi\") // \"25/12/2024 14:30\"\n */\nexport function formatDateTime(date: string | Date | null | undefined, locale: SupportedLocale = \"en\"): string {\n if (!date) return \"\";\n const d = new Date(date);\n if (isNaN(d.getTime())) return \"\";\n\n return d.toLocaleString(getLocaleString(locale), {\n day: \"2-digit\",\n month: \"2-digit\",\n year: \"numeric\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n });\n}\n\n/**\n * Format relative time (time ago)\n * @example\n * formatTimeAgo(new Date(Date.now() - 60000), \"vi\") // \"1 phút trước\"\n * formatTimeAgo(new Date(Date.now() - 60000), \"en\") // \"1 minute ago\"\n */\nexport function formatTimeAgo(date: string | Date | null | undefined, locale: SupportedLocale = \"en\"): string {\n if (!date) return \"\";\n const d = new Date(date);\n if (isNaN(d.getTime())) return \"\";\n\n const now = new Date();\n const diffMs = now.getTime() - d.getTime();\n const diffSec = Math.floor(diffMs / 1000);\n const diffMin = Math.floor(diffSec / 60);\n const diffHour = Math.floor(diffMin / 60);\n const diffDay = Math.floor(diffHour / 24);\n const diffWeek = Math.floor(diffDay / 7);\n const diffMonth = Math.floor(diffDay / 30);\n const diffYear = Math.floor(diffDay / 365);\n\n const labels = {\n en: {\n justNow: \"Just now\",\n minute: (n: number) => `${n} minute${n > 1 ? \"s\" : \"\"} ago`,\n hour: (n: number) => `${n} hour${n > 1 ? \"s\" : \"\"} ago`,\n day: (n: number) => `${n} day${n > 1 ? \"s\" : \"\"} ago`,\n week: (n: number) => `${n} week${n > 1 ? \"s\" : \"\"} ago`,\n month: (n: number) => `${n} month${n > 1 ? \"s\" : \"\"} ago`,\n year: (n: number) => `${n} year${n > 1 ? \"s\" : \"\"} ago`,\n },\n vi: {\n justNow: \"Vừa xong\",\n minute: (n: number) => `${n} phút trước`,\n hour: (n: number) => `${n} giờ trước`,\n day: (n: number) => `${n} ngày trước`,\n week: (n: number) => `${n} tuần trước`,\n month: (n: number) => `${n} tháng trước`,\n year: (n: number) => `${n} năm trước`,\n },\n ko: {\n justNow: \"방금 전\",\n minute: (n: number) => `${n}분 전`,\n hour: (n: number) => `${n}시간 전`,\n day: (n: number) => `${n}일 전`,\n week: (n: number) => `${n}주 전`,\n month: (n: number) => `${n}개월 전`,\n year: (n: number) => `${n}년 전`,\n },\n ja: {\n justNow: \"たった今\",\n minute: (n: number) => `${n}分前`,\n hour: (n: number) => `${n}時間前`,\n day: (n: number) => `${n}日前`,\n week: (n: number) => `${n}週間前`,\n month: (n: number) => `${n}ヶ月前`,\n year: (n: number) => `${n}年前`,\n },\n };\n\n const l = labels[locale] || labels.en;\n\n if (diffSec < 60) return l.justNow;\n if (diffMin < 60) return l.minute(diffMin);\n if (diffHour < 24) return l.hour(diffHour);\n if (diffDay < 7) return l.day(diffDay);\n if (diffWeek < 4) return l.week(diffWeek);\n if (diffMonth < 12) return l.month(diffMonth);\n return l.year(diffYear);\n}\n\n/**\n * Check if date is today\n */\nexport function isToday(date: string | Date | null | undefined): boolean {\n if (!date) return false;\n const d = new Date(date);\n if (isNaN(d.getTime())) return false;\n\n const today = new Date();\n return d.getDate() === today.getDate() && d.getMonth() === today.getMonth() && d.getFullYear() === today.getFullYear();\n}\n\n/**\n * Check if date is yesterday\n */\nexport function isYesterday(date: string | Date | null | undefined): boolean {\n if (!date) return false;\n const d = new Date(date);\n if (isNaN(d.getTime())) return false;\n\n const yesterday = new Date();\n yesterday.setDate(yesterday.getDate() - 1);\n\n return d.getDate() === yesterday.getDate() && d.getMonth() === yesterday.getMonth() && d.getFullYear() === yesterday.getFullYear();\n}\n\n/**\n * Format date for input[type=\"date\"]\n * @example formatDateForInput(new Date()) // \"2024-12-25\"\n */\nexport function formatDateForInput(date: string | Date | null | undefined): string {\n if (!date) return \"\";\n const d = new Date(date);\n if (isNaN(d.getTime())) return \"\";\n\n const year = d.getFullYear();\n const month = String(d.getMonth() + 1).padStart(2, \"0\");\n const day = String(d.getDate()).padStart(2, \"0\");\n\n return `${year}-${month}-${day}`;\n}\n\n/**\n * Format date for input[type=\"datetime-local\"]\n * @example formatDateTimeForInput(new Date()) // \"2024-12-25T14:30\"\n */\nexport function formatDateTimeForInput(date: string | Date | null | undefined): string {\n if (!date) return \"\";\n const d = new Date(date);\n if (isNaN(d.getTime())) return \"\";\n\n const dateStr = formatDateForInput(date);\n const hours = String(d.getHours()).padStart(2, \"0\");\n const minutes = String(d.getMinutes()).padStart(2, \"0\");\n\n return `${dateStr}T${hours}:${minutes}`;\n}\n\n/**\n * Get day of week\n * @example\n * getDayOfWeek(new Date(), \"vi\") // \"Thứ Hai\"\n * getDayOfWeek(new Date(), \"en\") // \"Monday\"\n */\nexport function getDayOfWeek(date: string | Date | null | undefined, locale: SupportedLocale = \"en\"): string {\n if (!date) return \"\";\n const d = new Date(date);\n if (isNaN(d.getTime())) return \"\";\n\n return d.toLocaleDateString(getLocaleString(locale), {\n weekday: \"long\",\n });\n}\n\n/**\n * Format with day of week\n * @example\n * formatDateWithDay(new Date(), \"vi\") // \"Thứ Hai, 25/12/2024\"\n * formatDateWithDay(new Date(), \"en\") // \"Monday, 12/25/2024\"\n */\nexport function formatDateWithDay(date: string | Date | null | undefined, locale: SupportedLocale = \"en\"): string {\n if (!date) return \"\";\n const dayOfWeek = getDayOfWeek(date, locale);\n const dateStr = formatDateShort(date, locale);\n\n return `${dayOfWeek}, ${dateStr}`;\n}\n\n/**\n * Smart date formatting - shows relative time for recent dates, full date for older ones\n * @example\n * formatDateSmart(new Date(), \"vi\")\n * // \"Vừa xong\" (< 1 min)\n * // \"5 phút trước\" (< 1 hour)\n * // \"Hôm nay lúc 14:30\" (today)\n * // \"Hôm qua lúc 14:30\" (yesterday)\n * // \"25/12/2024 14:30\" (older)\n */\nexport function formatDateSmart(date: string | Date | null | undefined, locale: SupportedLocale = \"en\"): string {\n if (!date) return \"\";\n const d = new Date(date);\n if (isNaN(d.getTime())) return \"\";\n\n const now = new Date();\n const diffMs = now.getTime() - d.getTime();\n const diffHour = Math.floor(diffMs / (1000 * 60 * 60));\n\n const labels = {\n en: {\n today: \"Today at\",\n yesterday: \"Yesterday at\",\n },\n vi: {\n today: \"Hôm nay lúc\",\n yesterday: \"Hôm qua lúc\",\n },\n ko: {\n today: \"오늘\",\n yesterday: \"어제\",\n },\n ja: {\n today: \"今日\",\n yesterday: \"昨日\",\n },\n };\n\n const l = labels[locale] || labels.en;\n\n // Less than 1 hour ago - show relative time\n if (diffHour < 1) {\n return formatTimeAgo(date, locale);\n }\n\n // Today\n if (isToday(date)) {\n return `${l.today} ${formatTime(date, locale)}`;\n }\n\n // Yesterday\n if (isYesterday(date)) {\n return `${l.yesterday} ${formatTime(date, locale)}`;\n }\n\n // Less than 7 days - show relative\n if (diffHour < 24 * 7) {\n return formatTimeAgo(date, locale);\n }\n\n // Older - show full date with time\n return formatDateTime(date, locale);\n}\n","/**\n * ShadCN UI Animation Styles - Enhanced with smooth spring-like animations\n *\n * This module provides animation utilities used by Underverse UI components.\n * It can be used standalone or with the useShadCNAnimations hook.\n *\n * @example\n * ```tsx\n * import { useShadCNAnimations } from \"@underverse-ui/underverse\";\n *\n * function MyComponent() {\n * useShadCNAnimations(); // Injects animation styles\n * return <div data-state=\"open\">Animated content</div>;\n * }\n * ```\n */\n\nexport const shadcnAnimationStyles = `\n /* ============================================\n * DROPDOWN / POPOVER ANIMATIONS\n * Uses spring-like cubic-bezier for natural feel\n * ============================================ */\n \n /* Native-like Combobox Animation - Mimics browser default select */\n [data-state=\"open\"][data-combobox-dropdown] {\n animation: comboboxOpen 150ms cubic-bezier(0.2, 0, 0, 1);\n transform-origin: top center;\n }\n\n [data-state=\"closed\"][data-combobox-dropdown] {\n animation: comboboxClose 120ms cubic-bezier(0.4, 0, 1, 1);\n transform-origin: top center;\n }\n\n @keyframes comboboxOpen {\n 0% {\n opacity: 0;\n transform: translateY(-4px) scaleY(0.9);\n }\n 100% {\n opacity: 1;\n transform: translateY(0) scaleY(1);\n }\n }\n\n @keyframes comboboxClose {\n 0% {\n opacity: 1;\n transform: translateY(0) scaleY(1);\n }\n 100% {\n opacity: 0;\n transform: translateY(-4px) scaleY(0.9);\n }\n }\n\n /* Generic dropdown open/close */\n [data-state=\"open\"] {\n animation: slideDownAndFade 220ms cubic-bezier(0.16, 1, 0.3, 1);\n }\n \n [data-state=\"closed\"] {\n animation: slideUpAndFade 180ms cubic-bezier(0.4, 0, 0.2, 1);\n }\n \n @keyframes slideDownAndFade {\n from {\n opacity: 0;\n transform: translateY(-4px) scale(0.98);\n }\n to {\n opacity: 1;\n transform: translateY(0) scale(1);\n }\n }\n \n @keyframes slideUpAndFade {\n from {\n opacity: 1;\n transform: translateY(0) scale(1);\n }\n to {\n opacity: 0;\n transform: translateY(-4px) scale(0.98);\n }\n }\n \n /* ============================================\n * DROPDOWN ITEMS - Native-like instant appearance\n * ============================================ */\n\n /* Fast staggered animation for native feel */\n .dropdown-item {\n opacity: 0;\n animation: itemFadeIn 120ms cubic-bezier(0.2, 0, 0, 1) forwards;\n }\n\n @keyframes itemFadeIn {\n from {\n opacity: 0;\n transform: translateX(-4px);\n }\n to {\n opacity: 1;\n transform: translateX(0);\n }\n }\n\n /* Item stagger delays - minimal for speed */\n .dropdown-item:nth-child(1) { animation-delay: 0ms; }\n .dropdown-item:nth-child(2) { animation-delay: 15ms; }\n .dropdown-item:nth-child(3) { animation-delay: 30ms; }\n .dropdown-item:nth-child(4) { animation-delay: 45ms; }\n .dropdown-item:nth-child(5) { animation-delay: 60ms; }\n .dropdown-item:nth-child(6) { animation-delay: 75ms; }\n .dropdown-item:nth-child(7) { animation-delay: 90ms; }\n .dropdown-item:nth-child(8) { animation-delay: 105ms; }\n .dropdown-item:nth-child(n+9) { animation-delay: 120ms; }\n\n /* ============================================\n * DATEPICKER ANIMATIONS\n * ============================================ */\n\n .datepicker-day {\n opacity: 0;\n animation: dayFadeIn 200ms cubic-bezier(0.16, 1, 0.3, 1) forwards;\n }\n\n @keyframes dayFadeIn {\n from {\n opacity: 0;\n transform: scale(0.8);\n }\n to {\n opacity: 1;\n transform: scale(1);\n }\n }\n\n /* ============================================\n * TOOLTIP ANIMATIONS\n * ============================================ */\n\n [data-tooltip] {\n animation: tooltipIn 150ms cubic-bezier(0.16, 1, 0.3, 1);\n }\n\n @keyframes tooltipIn {\n from {\n opacity: 0;\n transform: scale(0.95);\n }\n to {\n opacity: 1;\n transform: scale(1);\n }\n }\n\n /* ============================================\n * MODAL / DIALOG ANIMATIONS\n * ============================================ */\n\n .modal-content {\n animation: scaleIn 200ms cubic-bezier(0.34, 1.56, 0.64, 1);\n }\n \n @keyframes scaleIn {\n from {\n opacity: 0;\n transform: scale(0.9);\n }\n to {\n opacity: 1;\n transform: scale(1);\n }\n }\n \n /* Smooth backdrop blur transition */\n .backdrop-animate {\n transition: backdrop-filter 200ms ease, background-color 200ms ease;\n }\n`;\n\n/**\n * Hook to inject ShadCN animation styles into the document head.\n * Call this hook in components that need animations.\n * The styles are only injected once, even if called multiple times.\n *\n * @example\n * ```tsx\n * function Dropdown() {\n * useShadCNAnimations();\n * return <div data-state=\"open\">...</div>;\n * }\n * ```\n */\nexport function useShadCNAnimations(): void {\n if (typeof document !== \"undefined\") {\n const styleId = \"shadcn-animations\";\n if (!document.getElementById(styleId)) {\n const styleElement = document.createElement(\"style\");\n styleElement.id = styleId;\n styleElement.textContent = shadcnAnimationStyles;\n document.head.appendChild(styleElement);\n }\n }\n}\n\n/**\n * Manually inject animation styles.\n * Useful for non-React environments or SSR.\n */\nexport function injectAnimationStyles(): void {\n useShadCNAnimations();\n}\n\n/**\n * Get the animation styles as a string.\n * Useful for including in a style tag or CSS file.\n */\nexport function getAnimationStyles(): string {\n return shadcnAnimationStyles;\n}\n","export const VARIANT_STYLES_ALERT = {\n // Use system colors for background + border; leave text colors to content\n default: \"border border-border bg-card/60 backdrop-blur-sm\",\n info: \"border border-info/30 bg-info/10 backdrop-blur-sm\",\n success: \"border border-success/30 bg-success/10 backdrop-blur-sm\",\n warning: \"border border-warning/30 bg-warning/10 backdrop-blur-sm\",\n error: \"border border-destructive/30 bg-destructive/10 backdrop-blur-sm\",\n};\n\r\n// const variantIcons: Record<AlertVariant, ReactNode> = {\r\n// default: <Info className=\"h-4 w-4\" />,\r\n// info: <Info className=\"h-4 w-4 text-blue-500\" />,\r\n// success: <CheckCircle2 className=\"h-4 w-4 text-green-500\" />,\r\n// warning: <AlertTriangle className=\"h-4 w-4 text-yellow-500\" />,\r\n// error: <XCircle className=\"h-4 w-4 text-red-500\" />,\r\n// };\r\n","\"use client\";\n\nimport * as React from \"react\";\nimport enLocale from \"../../locales/en.json\";\nimport viLocale from \"../../locales/vi.json\";\nimport koLocale from \"../../locales/ko.json\";\nimport jaLocale from \"../../locales/ja.json\";\n\nexport type Locale = \"en\" | \"vi\" | \"ko\" | \"ja\";\nexport type Translations = Record<string, Record<string, string | Record<string, string>>>;\n\ninterface TranslationContextType {\n locale: Locale;\n t: (namespace: string) => (key: string) => string;\n}\n\nconst defaultTranslations: Record<Locale, Translations> = {\n en: enLocale as Translations,\n vi: viLocale as Translations,\n ko: koLocale as Translations,\n ja: jaLocale as Translations,\n};\n\nconst TranslationContext = React.createContext<TranslationContextType | null>(null);\n\nexport interface TranslationProviderProps {\n children: React.ReactNode;\n /** Current locale. Defaults to \"en\" */\n locale?: Locale;\n /** Custom translations to merge with defaults */\n translations?: Partial<Record<Locale, Translations>>;\n}\n\n/**\n * TranslationProvider for Underverse UI components.\n *\n * This provider is OPTIONAL. Components will use English fallback texts\n * when no provider is available.\n *\n * @example\n * ```tsx\n * // Basic usage\n * <TranslationProvider locale=\"vi\">\n * <App />\n * </TranslationProvider>\n *\n * // With custom translations\n * <TranslationProvider\n * locale=\"vi\"\n * translations={{\n * vi: { DatePicker: { clear: \"Xóa ngay\" } }\n * }}\n * >\n * <App />\n * </TranslationProvider>\n * ```\n */\nexport const TranslationProvider: React.FC<TranslationProviderProps> = ({ children, locale = \"en\", translations }) => {\n const t = React.useCallback(\n (namespace: string) => {\n return (key: string): string => {\n // Merge custom translations with defaults\n const mergedTranslations = {\n ...defaultTranslations[locale],\n ...translations?.[locale],\n };\n\n // Handle nested namespaces like \"OCR.imageUpload\"\n const parts = namespace.split(\".\");\n let current: unknown = mergedTranslations;\n\n for (const part of parts) {\n if (current && typeof current === \"object\" && part in current) {\n current = (current as Record<string, unknown>)[part];\n } else {\n return key; // Fallback to key\n }\n }\n\n if (current && typeof current === \"object\" && key in current) {\n const value = (current as Record<string, unknown>)[key];\n return typeof value === \"string\" ? value : key;\n }\n\n return key; // Fallback to key\n };\n },\n [locale, translations]\n );\n\n return <TranslationContext.Provider value={{ locale, t }}>{children}</TranslationContext.Provider>;\n};\n\n/**\n * Hook to get translations for a specific namespace.\n * Falls back to the key itself when TranslationProvider is not available.\n *\n * @param namespace - The translation namespace (e.g., \"DatePicker\", \"Common\")\n * @returns A function that takes a key and returns the translated string\n *\n * @example\n * ```tsx\n * const t = useTranslations(\"DatePicker\");\n * console.log(t(\"clear\")); // \"Clear\" or \"Xóa\" depending on locale\n * ```\n */\nexport const useUnderverseTranslations = (namespace: string) => {\n const context = React.useContext(TranslationContext);\n\n // Fallback for when provider is not available - use English defaults\n if (!context) {\n return (key: string): string => {\n const parts = namespace.split(\".\");\n let current: unknown = defaultTranslations.en;\n\n for (const part of parts) {\n if (current && typeof current === \"object\" && part in current) {\n current = (current as Record<string, unknown>)[part];\n } else {\n return key;\n }\n }\n\n if (current && typeof current === \"object\" && key in current) {\n const value = (current as Record<string, unknown>)[key];\n return typeof value === \"string\" ? value : key;\n }\n\n return key;\n };\n }\n\n return context.t(namespace);\n};\n\n/**\n * Hook to get the current locale.\n * Falls back to \"en\" when TranslationProvider is not available.\n *\n * @returns The current locale (\"en\" or \"vi\")\n */\nexport const useUnderverseLocale = (): Locale => {\n const context = React.useContext(TranslationContext);\n return context?.locale || \"en\";\n};\n\nexport default TranslationProvider;\n","{\n \"Common\": {\n \"close\": \"Close\",\n \"closeAlert\": \"Close alert\",\n \"notifications\": \"Notifications\",\n \"newNotification\": \"New\",\n \"readStatus\": \"Read\",\n \"openLink\": \"Open link\",\n \"theme\": \"Theme\",\n \"lightTheme\": \"Light\",\n \"darkTheme\": \"Dark\",\n \"systemTheme\": \"System\",\n \"density\": \"Density\",\n \"compact\": \"Compact\",\n \"normal\": \"Normal\",\n \"comfortable\": \"Comfortable\",\n \"columns\": \"Columns\"\n },\n \"ValidationInput\": {\n \"required\": \"This field is required\",\n \"typeMismatch\": \"Invalid format\",\n \"pattern\": \"Invalid pattern\",\n \"tooShort\": \"Too short\",\n \"tooLong\": \"Too long\",\n \"rangeUnderflow\": \"Below minimum\",\n \"rangeOverflow\": \"Above maximum\",\n \"stepMismatch\": \"Step mismatch\",\n \"badInput\": \"Bad input\",\n \"invalid\": \"Invalid value\"\n },\n \"Loading\": {\n \"loadingPage\": \"Loading page\",\n \"pleaseWait\": \"Please wait\"\n },\n \"DatePicker\": {\n \"placeholder\": \"Select date\",\n \"today\": \"Today\",\n \"clear\": \"Clear\"\n },\n \"Pagination\": {\n \"navigationLabel\": \"Pagination navigation\",\n \"showingResults\": \"Showing {startItem}–{endItem} of {totalItems}\",\n \"firstPage\": \"First page\",\n \"previousPage\": \"Previous page\",\n \"previous\": \"Previous\",\n \"nextPage\": \"Next page\",\n \"next\": \"Next\",\n \"lastPage\": \"Last page\",\n \"pageNumber\": \"Page {page}\",\n \"itemsPerPage\": \"Items per page\",\n \"search\": \"Search\",\n \"noOptions\": \"No options\"\n },\n \"OCR\": {\n \"imageUpload\": {\n \"dragDropText\": \"Drag & drop files here\",\n \"browseFiles\": \"Browse files\",\n \"supportedFormats\": \"Supported formats: images\"\n }\n }\n}\n\n","{\n \"Common\": {\n \"close\": \"Đóng\",\n \"closeAlert\": \"Đóng cảnh báo\",\n \"notifications\": \"Thông báo\",\n \"newNotification\": \"Mới\",\n \"readStatus\": \"Đã đọc\",\n \"openLink\": \"Mở liên kết\",\n \"theme\": \"Chủ đề\",\n \"lightTheme\": \"Giao diện sáng\",\n \"darkTheme\": \"Giao diện tối\",\n \"systemTheme\": \"Theo hệ thống\",\n \"density\": \"Mật độ\",\n \"compact\": \"Gọn\",\n \"normal\": \"Thường\",\n \"comfortable\": \"Thoải mái\",\n \"columns\": \"Cột\"\n },\n \"ValidationInput\": {\n \"required\": \"Trường này là bắt buộc\",\n \"typeMismatch\": \"Định dạng không hợp lệ\",\n \"pattern\": \"Sai mẫu\",\n \"tooShort\": \"Quá ngắn\",\n \"tooLong\": \"Quá dài\",\n \"rangeUnderflow\": \"Nhỏ hơn giá trị tối thiểu\",\n \"rangeOverflow\": \"Lớn hơn giá trị tối đa\",\n \"stepMismatch\": \"Sai bước\",\n \"badInput\": \"Giá trị không hợp lệ\",\n \"invalid\": \"Giá trị không hợp lệ\"\n },\n \"Loading\": {\n \"loadingPage\": \"Đang tải trang\",\n \"pleaseWait\": \"Vui lòng chờ\"\n },\n \"DatePicker\": {\n \"placeholder\": \"Chọn ngày\",\n \"today\": \"Hôm nay\",\n \"clear\": \"Xóa\"\n },\n \"Pagination\": {\n \"navigationLabel\": \"Điều hướng phân trang\",\n \"showingResults\": \"Hiển thị {startItem}–{endItem} trong tổng {totalItems}\",\n \"firstPage\": \"Trang đầu\",\n \"previousPage\": \"Trang trước\",\n \"previous\": \"Trước\",\n \"nextPage\": \"Trang sau\",\n \"next\": \"Sau\",\n \"lastPage\": \"Trang cuối\",\n \"pageNumber\": \"Trang {page}\",\n \"itemsPerPage\": \"Số mục/trang\",\n \"search\": \"Tìm kiếm\",\n \"noOptions\": \"Không có lựa chọn\"\n },\n \"OCR\": {\n \"imageUpload\": {\n \"dragDropText\": \"Kéo & thả ảnh vào đây\",\n \"browseFiles\": \"Chọn tệp\",\n \"supportedFormats\": \"Hỗ trợ các định dạng ảnh\"\n }\n }\n}\n\n","{\n \"Common\": {\n \"close\": \"닫기\",\n \"closeAlert\": \"알림 닫기\",\n \"notifications\": \"알림\",\n \"newNotification\": \"새로운\",\n \"readStatus\": \"읽음\",\n \"openLink\": \"링크 열기\",\n \"theme\": \"테마\",\n \"lightTheme\": \"라이트\",\n \"darkTheme\": \"다크\",\n \"systemTheme\": \"시스템\",\n \"density\": \"밀도\",\n \"compact\": \"컴팩트\",\n \"normal\": \"보통\",\n \"comfortable\": \"여유\",\n \"columns\": \"열\"\n },\n \"ValidationInput\": {\n \"required\": \"필수 입력 항목입니다\",\n \"typeMismatch\": \"형식이 올바르지 않습니다\",\n \"pattern\": \"패턴이 일치하지 않습니다\",\n \"tooShort\": \"너무 짧습니다\",\n \"tooLong\": \"너무 깁니다\",\n \"rangeUnderflow\": \"최솟값보다 작습니다\",\n \"rangeOverflow\": \"최댓값을 초과했습니다\",\n \"stepMismatch\": \"단계가 일치하지 않습니다\",\n \"badInput\": \"잘못된 입력입니다\",\n \"invalid\": \"유효하지 않은 값입니다\"\n },\n \"Loading\": {\n \"loadingPage\": \"페이지 로딩 중\",\n \"pleaseWait\": \"잠시만 기다려 주세요\"\n },\n \"DatePicker\": {\n \"placeholder\": \"날짜 선택\",\n \"today\": \"오늘\",\n \"clear\": \"지우기\"\n },\n \"Pagination\": {\n \"navigationLabel\": \"페이지 네비게이션\",\n \"showingResults\": \"{startItem}–{endItem} / 총 {totalItems}개\",\n \"firstPage\": \"첫 페이지\",\n \"previousPage\": \"이전 페이지\",\n \"previous\": \"이전\",\n \"nextPage\": \"다음 페이지\",\n \"next\": \"다음\",\n \"lastPage\": \"마지막 페이지\",\n \"pageNumber\": \"{page}페이지\",\n \"itemsPerPage\": \"페이지당 항목 수\",\n \"search\": \"검색\",\n \"noOptions\": \"옵션 없음\"\n },\n \"OCR\": {\n \"imageUpload\": {\n \"dragDropText\": \"여기에 파일을 드래그 앤 드롭하세요\",\n \"browseFiles\": \"파일 찾아보기\",\n \"supportedFormats\": \"지원 형식: 이미지\"\n }\n }\n}\n","{\n \"Common\": {\n \"close\": \"閉じる\",\n \"closeAlert\": \"アラートを閉じる\",\n \"notifications\": \"通知\",\n \"newNotification\": \"新規\",\n \"readStatus\": \"既読\",\n \"openLink\": \"リンクを開く\",\n \"theme\": \"テーマ\",\n \"lightTheme\": \"ライト\",\n \"darkTheme\": \"ダーク\",\n \"systemTheme\": \"システム\",\n \"density\": \"密度\",\n \"compact\": \"コンパクト\",\n \"normal\": \"通常\",\n \"comfortable\": \"ゆったり\",\n \"columns\": \"列\"\n },\n \"ValidationInput\": {\n \"required\": \"この項目は必須です\",\n \"typeMismatch\": \"形式が正しくありません\",\n \"pattern\": \"パターンが一致しません\",\n \"tooShort\": \"短すぎます\",\n \"tooLong\": \"長すぎます\",\n \"rangeUnderflow\": \"最小値より小さいです\",\n \"rangeOverflow\": \"最大値を超えています\",\n \"stepMismatch\": \"ステップが一致しません\",\n \"badInput\": \"入力が無効です\",\n \"invalid\": \"無効な値です\"\n },\n \"Loading\": {\n \"loadingPage\": \"ページを読み込み中\",\n \"pleaseWait\": \"しばらくお待ちください\"\n },\n \"DatePicker\": {\n \"placeholder\": \"日付を選択\",\n \"today\": \"今日\",\n \"clear\": \"クリア\"\n },\n \"Pagination\": {\n \"navigationLabel\": \"ページナビゲーション\",\n \"showingResults\": \"{startItem}–{endItem} / 全{totalItems}件\",\n \"firstPage\": \"最初のページ\",\n \"previousPage\": \"前のページ\",\n \"previous\": \"前へ\",\n \"nextPage\": \"次のページ\",\n \"next\": \"次へ\",\n \"lastPage\": \"最後のページ\",\n \"pageNumber\": \"{page}ページ\",\n \"itemsPerPage\": \"1ページあたりの項目数\",\n \"search\": \"検索\",\n \"noOptions\": \"オプションなし\"\n },\n \"OCR\": {\n \"imageUpload\": {\n \"dragDropText\": \"ここにファイルをドラッグ&ドロップ\",\n \"browseFiles\": \"ファイルを参照\",\n \"supportedFormats\": \"対応形式:画像\"\n }\n }\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { useUnderverseTranslations, useUnderverseLocale, type Locale } from \"../contexts/TranslationContext\";\n\n/**\n * Try to dynamically import next-intl hooks.\n * This allows the package to work with or without next-intl.\n */\nlet nextIntlHooks: {\n useTranslations?: (namespace: string) => (key: string) => string;\n useLocale?: () => string;\n} | null = null;\n\n// Try to load next-intl at module initialization\ntry {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const nextIntl = require(\"next-intl\");\n nextIntlHooks = {\n useTranslations: nextIntl.useTranslations,\n useLocale: nextIntl.useLocale,\n };\n} catch {\n // next-intl not available, will use internal translations\n nextIntlHooks = null;\n}\n\n/**\n * Context to force using internal translations even when next-intl is available.\n * Useful for testing or when you want to use the package's built-in translations.\n */\nconst ForceInternalContext = React.createContext(false);\n\nexport const ForceInternalTranslationsProvider: React.FC<{ children: React.ReactNode }> = ({ children }) => {\n return <ForceInternalContext.Provider value={true}>{children}</ForceInternalContext.Provider>;\n};\n\n/**\n * Smart translation hook that:\n * 1. Uses next-intl if available and not forced to use internal\n * 2. Falls back to internal TranslationContext\n * 3. Falls back to English defaults if no provider is available\n *\n * @param namespace - The translation namespace (e.g., \"DatePicker\", \"Common\")\n * @returns A function that takes a key and returns the translated string\n *\n * @example\n * ```tsx\n * // Works in Next.js with next-intl\n * // Works in React without next-intl\n * // Works without any provider (English fallback)\n * const t = useSmartTranslations(\"DatePicker\");\n * console.log(t(\"clear\")); // \"Clear\" or translated value\n * ```\n */\nexport function useSmartTranslations(namespace: string): (key: string) => string {\n const forceInternal = React.useContext(ForceInternalContext);\n const internalT = useUnderverseTranslations(namespace);\n\n // If forced to use internal or next-intl is not available, use internal\n if (forceInternal || !nextIntlHooks?.useTranslations) {\n return internalT;\n }\n\n // Try to use next-intl\n try {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n const nextIntlT = nextIntlHooks.useTranslations(namespace);\n return nextIntlT;\n } catch {\n // If next-intl throws (e.g., no provider), fall back to internal\n return internalT;\n }\n}\n\n/**\n * Smart locale hook that:\n * 1. Uses next-intl if available\n * 2. Falls back to internal TranslationContext\n * 3. Falls back to \"en\" if no provider is available\n *\n * @returns The current locale\n */\nexport function useSmartLocale(): Locale {\n const forceInternal = React.useContext(ForceInternalContext);\n const internalLocale = useUnderverseLocale();\n\n // If forced to use internal or next-intl is not available, use internal\n if (forceInternal || !nextIntlHooks?.useLocale) {\n return internalLocale;\n }\n\n // Try to use next-intl\n try {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n const nextIntlLocale = nextIntlHooks.useLocale();\n return (nextIntlLocale as Locale) || internalLocale;\n } catch {\n // If next-intl throws (e.g., no provider), fall back to internal\n return internalLocale;\n }\n}\n\nexport default useSmartTranslations;\n"],"mappings":"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","names":["Calendar","cn","shadcnAnimationStyles","useShadCNAnimations","loading","import_jsx_runtime","import_react","import_jsx_runtime","React","import_lucide_react","import_jsx_runtime","import_react","React","import_jsx_runtime","import_lucide_react","import_jsx_runtime","loading","variantStyles","sizeStyles","React","import_react","import_lucide_react","import_jsx_runtime","loading","sizeStyles","import_react","import_jsx_runtime","Textarea","sizeClasses","React","import_jsx_runtime","sizeClasses","React","import_jsx_runtime","import_react","import_jsx_runtime","React","Image","import_jsx_runtime","import_jsx_runtime","sizeClasses","_","import_react","import_lucide_react","import_jsx_runtime","variantStyles","sizeStyles","React","React","import_lucide_react","import_jsx_runtime","sizeStyles","modalContent","import_react","import_lucide_react","import_jsx_runtime","React","import_react_dom","import_jsx_runtime","variantStyles","React","import_react_dom","import_jsx_runtime","React","import_react_dom","import_lucide_react","import_jsx_runtime","sizeStyles","positionStyles","import_react","import_lucide_react","import_jsx_runtime","import_react","import_lucide_react","import_jsx_runtime","sizeClasses","React","React","import_lucide_react","import_jsx_runtime","sizeStyles","variantStyles","Link","React","import_jsx_runtime","sizeStyles","variantStyles","activeTab","import_react","import_react_dom","import_jsx_runtime","React","React","import_lucide_react","React","import_react","import_react_dom","import_lucide_react","import_jsx_runtime","loading","sizeStyles","import_jsx_runtime","size","import_react","import_jsx_runtime","React","import_react","import_jsx_runtime","React","import_react","import_react_dom","import_lucide_react","import_jsx_runtime","isToday","XIcon","isSameDay","React","import_lucide_react","import_jsx_runtime","base","now","sizeClasses","React","import_lucide_react","import_jsx_runtime","Calendar","SIZE_STYLES","VARIANT_STYLES","isToday","prevEnd","nextStart","React","import_react","import_react_dom","import_lucide_react","import_jsx_runtime","loading","sizeStyles","React","import_jsx_runtime","sizeStyles","React","import_jsx_runtime","sizeStyles","import_lucide_react","import_react","import_jsx_runtime","React","value","formatTime","import_react","import_lucide_react","import_jsx_runtime","import_react","import_lucide_react","import_jsx_runtime","ImageIcon","React","import_lucide_react","import_jsx_runtime","getAnimationStyles","import_react","import_jsx_runtime","React","measure","React","import_lucide_react","import_jsx_runtime","SIZE_STYLES","loading","React","import_react_dom","import_jsx_runtime","PRESETS","React","import_lucide_react","import_jsx_runtime","React","import_lucide_react","import_jsx_runtime","p","q","sizeClasses","import_react","import_jsx_runtime","React","import_react","import_jsx_runtime","import_lucide_react","import_jsx_runtime","sizeClasses","import_react","import_jsx_runtime","React","import_lucide_react","import_react","import_jsx_runtime","React","loading","FilterIcon","React","import_jsx_runtime","loading","import_lucide_react","import_jsx_runtime","formatTime","import_link","import_lucide_react","import_jsx_runtime","Link","import_lucide_react","import_jsx_runtime","import_lucide_react","import_react","import_react_dom","import_jsx_runtime","import_react","import_react_dom","import_lucide_react","import_jsx_runtime","import_clsx","import_tailwind_merge","cn","formatDateShort","formatTime","shadcnAnimationStyles","useShadCNAnimations","React","import_jsx_runtime","defaultTranslations","TranslationContext","React","import_jsx_runtime"]}
1
+ {"version":3,"sources":["../src/index.ts","../../../components/ui/Button.tsx","../../../lib/constants/constants-ui/button.ts","../../../lib/utils/cn.ts","../../../components/ui/Badge.tsx","../../../components/ui/Card.tsx","../../../components/ui/CheckBox.tsx","../../../components/ui/Input.tsx","../../../lib/i18n/translation-adapter.tsx","../../../components/ui/TagInput.tsx","../../../components/ui/Textarea.tsx","../../../components/ui/Switch.tsx","../../../components/ui/label.tsx","../../../components/ui/SmartImage.tsx","../../../components/ui/Avatar.tsx","../../../components/ui/Skeleton.tsx","../../../components/ui/Progress.tsx","../../../components/ui/Modal.tsx","../../../components/ui/Toast.tsx","../../../components/ui/Tooltip.tsx","../../../components/ui/Popover.tsx","../../../lib/utils/shadcn-animations.ts","../../../components/ui/Sheet.tsx","../../../components/ui/Alert.tsx","../../../components/ui/GlobalLoading.tsx","../../../lib/utils/loading.ts","../../../components/ui/Breadcrumb.tsx","../../../components/ui/Tab.tsx","../../../components/ui/DropdownMenu.tsx","../../../components/ui/Pagination.tsx","../../../components/ui/Combobox.tsx","../../../components/ui/Section.tsx","../../../components/ui/ScrollArea.tsx","../../../components/ui/DatePicker.tsx","../../../lib/utils/date.ts","../../../components/ui/TimePicker.tsx","../../../components/ui/Calendar.tsx","../../../components/ui/MultiCombobox.tsx","../../../components/ui/RadioGroup.tsx","../../../components/ui/Slider.tsx","../../../components/ui/OverlayControls.tsx","../../../components/ui/CategoryTreeSelect.tsx","../../../components/ui/ImageUpload.tsx","../../../components/ui/Carousel.tsx","../../../components/ui/FallingIcons.tsx","../../../components/ui/List.tsx","../../../components/ui/Watermark.tsx","../../../components/ui/Timeline.tsx","../../../components/ui/ColorPicker.tsx","../../../components/ui/Grid.tsx","../../../components/ui/LineChart.tsx","../../../components/ui/ChartTooltip.tsx","../../../components/ui/BarChart.tsx","../../../components/ui/PieChart.tsx","../../../components/ui/AreaChart.tsx","../../../components/ui/Sparkline.tsx","../../../components/ui/RadarChart.tsx","../../../components/ui/GaugeChart.tsx","../../../components/ui/ClientOnly.tsx","../../../components/ui/Loading.tsx","../../../components/ui/Table.tsx","../../../components/ui/DataTable.tsx","../../../components/ui/Form.tsx","../../../components/ui/NotificationModal.tsx","../../../components/ui/FloatingContacts.tsx","../../../components/ui/AccessDenied.tsx","../../../components/ui/ThemeToggleHeadless.tsx","../../../components/ui/LanguageSwitcherHeadless.tsx","../src/utils/cn.ts","../src/utils/date.ts","../src/utils/animations.ts","../../../lib/constants/constants-ui/alert.ts","../src/contexts/TranslationContext.tsx","../locales/en.json","../locales/vi.json","../locales/ko.json","../locales/ja.json","../src/hooks/useSmartTranslations.tsx"],"sourcesContent":["// Re-export UI components from the app source so we can bundle them here.\n// Note: Components that are coupled to app-specific APIs are intentionally excluded.\n\n// Core primitives\nexport { default as Button } from \"../../../components/ui/Button\";\nexport type { ButtonProps } from \"../../../components/ui/Button\";\nexport { default as Badge } from \"../../../components/ui/Badge\";\nexport {\n Badge as BadgeBase,\n NotificationBadge,\n StatusBadge,\n TagBadge,\n InteractiveBadge,\n GradientBadge,\n PulseBadge,\n} from \"../../../components/ui/Badge\";\nexport { default as Card } from \"../../../components/ui/Card\";\nexport { Checkbox } from \"../../../components/ui/CheckBox\";\nexport type { CheckboxProps } from \"../../../components/ui/CheckBox\";\nexport { default as Input } from \"../../../components/ui/Input\";\nexport type { InputProps } from \"../../../components/ui/Input\";\nexport { PasswordInput, NumberInput, SearchInput } from \"../../../components/ui/Input\";\nexport { default as TagInput, TagInput as TagInputBase } from \"../../../components/ui/TagInput\";\nexport type { TagInputProps } from \"../../../components/ui/TagInput\";\nexport { default as Textarea } from \"../../../components/ui/Textarea\";\nexport { default as Switch } from \"../../../components/ui/Switch\";\nexport { Label } from \"../../../components/ui/label\";\nexport { default as Avatar } from \"../../../components/ui/Avatar\";\nexport { default as Skeleton } from \"../../../components/ui/Skeleton\";\nexport * from \"../../../components/ui/Skeleton\";\nexport * from \"../../../components/ui/Progress\";\n\n// Feedback / overlays\nexport { default as Modal } from \"../../../components/ui/Modal\";\nexport { default as ToastProvider, useToast } from \"../../../components/ui/Toast\";\nexport { Tooltip } from \"../../../components/ui/Tooltip\";\nexport { Popover } from \"../../../components/ui/Popover\";\nexport { Sheet, Drawer, SlideOver, BottomSheet, SidebarSheet } from \"../../../components/ui/Sheet\";\nexport { default as Alert } from \"../../../components/ui/Alert\";\nexport { GlobalLoading, PageLoading, InlineLoading, ButtonLoading } from \"../../../components/ui/GlobalLoading\";\n\n// Navigation / structure\nexport { default as Breadcrumb } from \"../../../components/ui/Breadcrumb\";\nexport { Tabs, SimpleTabs, PillTabs, VerticalTabs } from \"../../../components/ui/Tab\";\nexport { default as DropdownMenu } from \"../../../components/ui/DropdownMenu\";\nexport { DropdownMenuItem, DropdownMenuSeparator, SelectDropdown } from \"../../../components/ui/DropdownMenu\";\nexport { Pagination, SimplePagination, CompactPagination } from \"../../../components/ui/Pagination\";\nexport type { PaginationProps, SimplePaginationProps, CompactPaginationProps } from \"../../../components/ui/Pagination\";\nexport { default as Section } from \"../../../components/ui/Section\";\nexport { ScrollArea } from \"../../../components/ui/ScrollArea\";\n\n// Pickers / inputs\nexport { DatePicker, DateRangePicker } from \"../../../components/ui/DatePicker\";\nexport type { DatePickerProps } from \"../../../components/ui/DatePicker\";\nexport { default as TimePicker } from \"../../../components/ui/TimePicker\";\nexport type { TimePickerProps } from \"../../../components/ui/TimePicker\";\nexport { default as Calendar } from \"../../../components/ui/Calendar\";\nexport type { CalendarProps, CalendarEvent } from \"../../../components/ui/Calendar\";\nexport { Combobox } from \"../../../components/ui/Combobox\";\nexport type { ComboboxProps } from \"../../../components/ui/Combobox\";\nexport { MultiCombobox } from \"../../../components/ui/MultiCombobox\";\nexport type { MultiComboboxProps } from \"../../../components/ui/MultiCombobox\";\nexport { RadioGroup, RadioGroupItem } from \"../../../components/ui/RadioGroup\";\nexport { Slider } from \"../../../components/ui/Slider\";\nexport { default as OverlayControls } from \"../../../components/ui/OverlayControls\";\nexport { CategoryTreeSelect } from \"../../../components/ui/CategoryTreeSelect\";\n\n// Media\nexport { default as SmartImage } from \"../../../components/ui/SmartImage\";\nexport { default as ImageUpload } from \"../../../components/ui/ImageUpload\";\nexport { Carousel } from \"../../../components/ui/Carousel\";\nexport { default as FallingIcons } from \"../../../components/ui/FallingIcons\";\nexport { default as List } from \"../../../components/ui/List\";\nexport { ListItem } from \"../../../components/ui/List\";\nexport { default as Watermark } from \"../../../components/ui/Watermark\";\nexport type { WatermarkProps } from \"../../../components/ui/Watermark\";\nexport { default as Timeline } from \"../../../components/ui/Timeline\";\nexport { TimelineItem } from \"../../../components/ui/Timeline\";\nexport { default as ColorPicker } from \"../../../components/ui/ColorPicker\";\nexport type { ColorPickerProps } from \"../../../components/ui/ColorPicker\";\nexport { default as Grid } from \"../../../components/ui/Grid\";\nexport { GridItem } from \"../../../components/ui/Grid\";\nexport type { GridProps, GridItemProps } from \"../../../components/ui/Grid\";\n\n// Charts (pure SVG, no external dependencies)\nexport { LineChart } from \"../../../components/ui/LineChart\";\nexport type { LineChartProps, LineChartDataPoint } from \"../../../components/ui/LineChart\";\nexport { BarChart } from \"../../../components/ui/BarChart\";\nexport type { BarChartProps, BarChartDataPoint } from \"../../../components/ui/BarChart\";\nexport { PieChart } from \"../../../components/ui/PieChart\";\nexport type { PieChartProps, PieChartDataPoint } from \"../../../components/ui/PieChart\";\nexport { AreaChart } from \"../../../components/ui/AreaChart\";\nexport type { AreaChartProps, AreaChartDataPoint, AreaChartSeries } from \"../../../components/ui/AreaChart\";\nexport { Sparkline } from \"../../../components/ui/Sparkline\";\nexport type { SparklineProps, SparklineDataPoint } from \"../../../components/ui/Sparkline\";\nexport { RadarChart } from \"../../../components/ui/RadarChart\";\nexport type { RadarChartProps, RadarChartDataPoint, RadarChartSeries } from \"../../../components/ui/RadarChart\";\nexport { GaugeChart } from \"../../../components/ui/GaugeChart\";\nexport type { GaugeChartProps } from \"../../../components/ui/GaugeChart\";\n\n// Misc\nexport { default as ClientOnly } from \"../../../components/ui/ClientOnly\";\nexport * from \"../../../components/ui/Loading\";\n// ThemeToggle depends on app-specific ThemeContext, not exported to keep package neutral\nexport { default as DataTable } from \"../../../components/ui/DataTable\";\nexport type { DataTableColumn, DataTableQuery, Sorter } from \"../../../components/ui/DataTable\";\nexport * from \"../../../components/ui/Table\";\nexport * from \"../../../components/ui/Form\";\nexport { default as NotificationModal } from \"../../../components/ui/NotificationModal\";\nexport { default as FloatingContacts } from \"../../../components/ui/FloatingContacts\";\nexport { default as AccessDenied } from \"../../../components/ui/AccessDenied\";\n\n// Headless, package-safe utilities\n// Export headless components under simple names\nexport { default as ThemeToggle } from \"../../../components/ui/ThemeToggleHeadless\";\nexport type { ThemeToggleHeadlessProps as ThemeToggleProps, ThemeMode } from \"../../../components/ui/ThemeToggleHeadless\";\nexport { default as LanguageSwitcher } from \"../../../components/ui/LanguageSwitcherHeadless\";\nexport type { LanguageSwitcherHeadlessProps as LanguageSwitcherProps, LanguageOption } from \"../../../components/ui/LanguageSwitcherHeadless\";\n\n// Back-compat (optional): keep headless aliases\nexport { default as ThemeToggleHeadless } from \"../../../components/ui/ThemeToggleHeadless\";\nexport type { ThemeToggleHeadlessProps } from \"../../../components/ui/ThemeToggleHeadless\";\nexport { default as LanguageSwitcherHeadless } from \"../../../components/ui/LanguageSwitcherHeadless\";\nexport type { LanguageSwitcherHeadlessProps } from \"../../../components/ui/LanguageSwitcherHeadless\";\n\n// ============================================================================\n// UTILITIES (standalone, no Next.js dependencies)\n// ============================================================================\n\n// Class name utility (cn)\nexport { cn } from \"../../../lib/utils/cn\";\nexport { cn as cnLocal } from \"./utils/cn\";\n\n// Date utilities with locale support (standalone)\nexport * as DateUtils from \"./utils/date\";\nexport type { SupportedLocale } from \"./utils/date\";\n\n// Animation utilities\nexport { shadcnAnimationStyles, useShadCNAnimations, injectAnimationStyles, getAnimationStyles } from \"./utils/animations\";\n\n// Constants for styling\nexport { VARIANT_STYLES_BTN, SIZE_STYLES_BTN } from \"../../../lib/constants/constants-ui/button\";\nexport { VARIANT_STYLES_ALERT } from \"../../../lib/constants/constants-ui/alert\";\n\n// ============================================================================\n// TRANSLATION SYSTEM (for React/Next.js without next-intl)\n// ============================================================================\n// TranslationProvider - Optional context for i18n support\n// When not wrapped in TranslationProvider, components use English fallback texts\nexport { TranslationProvider, useUnderverseTranslations, useUnderverseLocale } from \"./contexts/TranslationContext\";\nexport type { Locale, Translations, TranslationProviderProps } from \"./contexts/TranslationContext\";\n\n// UnderverseProvider - Alternative name for TranslationProvider (for standalone React usage)\nexport {\n UnderverseProvider,\n useTranslations as useUnderverseI18n,\n useLocale as useUnderverseI18nLocale,\n} from \"../../../lib/i18n/translation-adapter\";\nexport type { UnderverseProviderProps } from \"../../../lib/i18n/translation-adapter\";\n\n// Smart hooks that auto-detect next-intl or fallback to internal translations\nexport { useSmartTranslations, useSmartLocale, ForceInternalTranslationsProvider } from \"./hooks/useSmartTranslations\";\n\n// Excluded: NotificationBell (depends on project-specific API, auth, and sockets)\n\n// i18n messages for next-intl consumers\n// Provide ready-to-merge messages so apps can easily integrate underverse UI texts.\nimport en from \"../locales/en.json\";\nimport vi from \"../locales/vi.json\";\nimport ko from \"../locales/ko.json\";\nimport ja from \"../locales/ja.json\";\n\nexport const underverseMessages = { en, vi, ko, ja } as const;\nexport type UnderverseLocale = keyof typeof underverseMessages;\nexport function getUnderverseMessages(locale: UnderverseLocale = \"en\") {\n return underverseMessages[locale] || underverseMessages.en;\n}\n","\"use client\";\n\nimport React, { forwardRef, useCallback, useRef, useState } from \"react\";\nimport { VARIANT_STYLES_BTN, SIZE_STYLES_BTN } from \"@/lib/constants/constants-ui/button\";\nimport { cn } from \"@/lib/utils/cn\";\nimport { Activity } from \"lucide-react\";\n\n// Khai báo kiểu cho props\nexport interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n onClick?: (event: React.MouseEvent<HTMLButtonElement>) => void;\n children?: React.ReactNode;\n type?: \"button\" | \"submit\" | \"reset\";\n icon?: React.ComponentType<{ className?: string }>;\n iconRight?: React.ComponentType<{ className?: string }>;\n variant?: keyof typeof VARIANT_STYLES_BTN;\n size?: keyof typeof SIZE_STYLES_BTN;\n className?: string;\n iConClassName?: string;\n disabled?: boolean;\n loading?: boolean;\n fullWidth?: boolean;\n title?: string;\n // Nâng cấp: tuỳ biến spinner & UX khi loading\n spinner?: React.ComponentType<{ className?: string }>;\n loadingText?: React.ReactNode;\n preserveChildrenOnLoading?: boolean; // giữ nguyên children khi loading\n // Chống double-click vô ý\n preventDoubleClick?: boolean;\n lockMs?: number; // thời gian khóa nếu onClick không trả Promise\n // Layout flexibility\n asContainer?: boolean; // cho phép children tự do layout (không force items-center)\n // Ngăn xuống dòng khiến icon nằm trên, text nằm dưới\n noWrap?: boolean; // mặc định: true\n // Tắt overlay gradient hover mặc định\n noHoverOverlay?: boolean;\n // Bật nền gradient (alias cho variant=\"gradient\")\n gradient?: boolean;\n}\n\n// Sử dụng forwardRef để chuyển tiếp ref\nconst Button = forwardRef<HTMLButtonElement, ButtonProps>(\n (\n {\n onClick,\n children,\n type = \"button\",\n icon: Icon,\n iconRight: IconRight,\n variant = \"default\",\n size = \"md\",\n className = \"\",\n iConClassName = \"\",\n disabled = false,\n loading = false,\n fullWidth = false,\n title,\n spinner: Spinner,\n loadingText,\n preserveChildrenOnLoading = false,\n // custom behavior props (do not forward to DOM)\n preventDoubleClick = false,\n lockMs = 600,\n asContainer = false,\n noWrap = true,\n noHoverOverlay = false,\n gradient = false,\n ...rest\n },\n ref\n ) => {\n const baseStyles = asContainer\n ? \"relative inline-flex justify-center rounded-md font-medium transition-colors duration-150 ease-soft outline-none focus:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background active:translate-y-px\"\n : \"relative inline-flex items-center justify-center gap-2 rounded-md font-medium overflow-hidden transition-colors duration-150 ease-soft outline-none focus:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background active:translate-y-px\";\n\n const finalVariant = gradient ? \"gradient\" : variant;\n const variantStyle = VARIANT_STYLES_BTN[finalVariant] || VARIANT_STYLES_BTN.default;\n const sizeStyle = SIZE_STYLES_BTN[size] || SIZE_STYLES_BTN.md;\n\n const SpinnerIcon = Spinner ?? Activity;\n const [locked, setLocked] = useState(false);\n const lockTimer = useRef<NodeJS.Timeout | null>(null);\n\n const handleClick = useCallback(async (e: React.MouseEvent<HTMLButtonElement>) => {\n if (disabled || loading) return;\n\n if (preventDoubleClick) {\n if (locked) return;\n setLocked(true);\n try {\n const result = onClick?.(e) as unknown;\n if (result && typeof (result as any) === \"object\" && typeof (result as any).then === \"function\") {\n await (result as any);\n setLocked(false);\n } else {\n const ms = lockMs ?? 600;\n if (lockTimer.current) clearTimeout(lockTimer.current);\n lockTimer.current = setTimeout(() => setLocked(false), ms);\n }\n } catch (err) {\n setLocked(false);\n throw err;\n }\n } else {\n onClick?.(e);\n }\n }, [disabled, loading, onClick, locked, preventDoubleClick, lockMs]);\n\n const computedDisabled = disabled || loading || (preventDoubleClick ? locked : false);\n\n return (\n <button\n ref={ref}\n type={type}\n onClick={handleClick}\n title={title}\n className={cn(\n baseStyles,\n variantStyle,\n sizeStyle,\n \"group\",\n noWrap && \"whitespace-nowrap\",\n {\n \"cursor-pointer hover:opacity-95\": !computedDisabled,\n \"opacity-50 cursor-not-allowed\": computedDisabled,\n \"w-full\": fullWidth,\n },\n className\n )}\n disabled={computedDisabled}\n aria-disabled={computedDisabled}\n aria-busy={loading}\n data-variant={variant}\n data-size={size}\n data-locked={preventDoubleClick ? (locked ? \"true\" : \"false\") : undefined}\n aria-label={(rest as any)[\"aria-label\"] || title}\n {...rest}\n >\n {!noHoverOverlay && (\n <span className=\"absolute inset-0 bg-linear-to-r from-primary-foreground/20 to-transparent opacity-0 group-hover:opacity-100 transition-opacity duration-200 dark:hidden\" />\n )}\n {loading ? (\n <>\n <SpinnerIcon className=\"w-4 h-4 animate-spin\" />\n {loadingText && (\n <span className=\"ml-2\" aria-live=\"polite\">\n {loadingText}\n </span>\n )}\n {preserveChildrenOnLoading && !loadingText && (\n <span className=\"ml-2 opacity-70\" aria-hidden>\n {children}\n </span>\n )}\n </>\n ) : (\n <>\n {Icon && <Icon className={cn(\"transition-transform duration-200\", iConClassName ? iConClassName : \"w-5 h-5\")} />}\n {children}\n {IconRight && <IconRight className=\"w-4 h-4 transition-transform duration-200\" />}\n </>\n )}\n </button>\n );\n }\n);\n\nButton.displayName = \"Button\";\n\nexport default Button;\n","export const VARIANT_STYLES_BTN = {\n // Mặc định: tối giản, rõ ràng, dùng tokens hệ màu\n default:\n \"bg-background/80 backdrop-blur-sm text-foreground border border-border hover:bg-accent/50 focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background\",\n\n // Viền: trong suốt, viền tinh tế, hover nhẹ\n outline:\n \"bg-transparent backdrop-blur-sm border border-input hover:bg-accent/40 hover:text-accent-foreground focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background\",\n\n // Primary: dùng brand, bỏ hiệu ứng scale/shadow mạnh\n primary:\n \"bg-primary text-primary-foreground hover:bg-primary/90 shadow-sm border border-primary/20 focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background\",\n\n secondary:\n \"bg-secondary text-secondary-foreground hover:bg-secondary/90 shadow-sm border border-secondary/20 focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background\",\n\n success:\n \"bg-success text-success-foreground hover:bg-success/90 shadow-sm border border-success/20 focus-visible:ring-2 focus-visible:ring-success/60 focus-visible:ring-offset-2 focus-visible:ring-offset-background\",\n\n danger:\n \"bg-destructive text-destructive-foreground hover:bg-destructive/90 shadow-sm border border-destructive/20 focus-visible:ring-2 focus-visible:ring-destructive/60 focus-visible:ring-offset-2 focus-visible:ring-offset-background\",\n\n // Alias for shadcn-style prop naming used in some components\n destructive:\n \"bg-destructive text-destructive-foreground hover:bg-destructive/90 shadow-sm border border-destructive/20 focus-visible:ring-2 focus-visible:ring-destructive/60 focus-visible:ring-offset-2 focus-visible:ring-offset-background\",\n\n warning:\n \"bg-warning text-warning-foreground hover:bg-warning/90 shadow-sm border border-warning/20 focus-visible:ring-2 focus-visible:ring-warning/50 focus-visible:ring-offset-2 focus-visible:ring-offset-background\",\n\n info: \"bg-info text-info-foreground hover:bg-info/90 shadow-sm border border-info/20 focus-visible:ring-2 focus-visible:ring-info/60 focus-visible:ring-offset-2 focus-visible:ring-offset-background\",\n\n // Ghost: minimal\n ghost: \"bg-transparent hover:bg-accent/20 hover:text-accent-foreground backdrop-blur-sm transition-colors\",\n\n // Link: chỉ văn bản\n link: \"text-primary bg-transparent underline-offset-4 hover:underline hover:text-primary/85 transition-colors\",\n\n // Gradient: tuỳ chọn, giảm shadow\n gradient: \"bg-linear-to-r from-primary via-secondary to-accent text-primary-foreground hover:opacity-90 shadow-sm border border-primary/10\",\n};\n\nexport const SIZE_STYLES_BTN = {\n sm: \"px-3 py-1.5 text-sm h-8 min-w-8 md:px-2.5 md:py-1 md:h-7 md:text-xs\",\n md: \"px-4 py-2 text-sm h-10 min-w-10 md:px-3 md:py-1.5 md:h-9\",\n lg: \"px-6 py-3 text-base h-12 min-w-12 md:px-4 md:py-2 md:h-10 md:text-sm\",\n smx: \"px-3.5 py-1.5 text-[13px] h-9 min-w-9 md:px-3 md:py-1 md:h-8 md:text-xs\",\n icon: \"w-11 h-11 p-0 rounded-full flex items-center justify-center md:w-10 md:h-10\",\n};\n","import { clsx, type ClassValue } from \"clsx\";\r\nimport { twMerge } from \"tailwind-merge\";\r\n\r\nexport function cn(...inputs: ClassValue[]) {\r\n return twMerge(clsx(...inputs));\r\n}\r\n","import * as React from \"react\";\r\nimport { cn } from \"@/lib/utils/cn\";\r\n\r\ninterface BadgeProps {\n children?: React.ReactNode;\n variant?: \"default\" | \"primary\" | \"secondary\" | \"success\" | \"warning\" | \"danger\" | \"destructive\" | \"info\" | \"outline\" | \"ghost\" | \"transparent\" | \"gradient\";\n size?: \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n className?: string;\n dot?: boolean;\n count?: number;\n maxCount?: number;\n showZero?: boolean;\n pulse?: boolean;\n removable?: boolean;\n onRemove?: () => void;\n icon?: React.ComponentType<{ className?: string }>;\n clickable?: boolean;\n onClick?: () => void;\n}\n\r\nconst variantStyles = {\n default: \"bg-muted text-muted-foreground border-border/50 hover:bg-muted/80\",\n primary: \"bg-primary text-primary-foreground border-primary/20 hover:bg-primary/90\",\n secondary: \"bg-secondary text-secondary-foreground border-secondary/20 hover:bg-secondary/90\",\n success: \"bg-success text-success-foreground border-success/20 hover:bg-success/90\",\n warning: \"bg-warning text-warning-foreground border-warning/20 hover:bg-warning/90\",\n danger: \"bg-destructive text-destructive-foreground border-destructive/20 hover:bg-destructive/90\",\n destructive: \"bg-destructive text-destructive-foreground border-destructive/20 hover:bg-destructive/90\",\n info: \"bg-info text-info-foreground border-info/20 hover:bg-info/90\",\n outline: \"bg-transparent text-foreground border-border hover:bg-accent/50\",\n ghost: \"bg-transparent hover:bg-accent/20 hover:text-accent-foreground border-transparent transition-colors\",\n transparent: \"bg-transparent text-foreground border-transparent hover:bg-accent/30\",\n gradient: \"bg-linear-to-r from-primary to-secondary text-primary-foreground border-transparent hover:from-primary/90 hover:to-secondary/90\",\n};\n\r\nconst sizeStyles = {\r\n xs: \"px-1.5 py-0.5 text-xs font-medium min-h-[18px]\",\r\n sm: \"px-2 py-0.5 text-xs font-medium min-h-[20px]\",\r\n md: \"px-2.5 py-1 text-xs font-medium min-h-[24px]\",\r\n lg: \"px-3 py-1.5 text-sm font-medium min-h-[28px]\",\r\n xl: \"px-4 py-2 text-sm font-semibold min-h-[32px]\",\r\n};\r\n\r\nconst dotSizeStyles = {\r\n xs: \"w-1.5 h-1.5\",\r\n sm: \"w-2 h-2\",\r\n md: \"w-2.5 h-2.5\",\r\n lg: \"w-3 h-3\",\r\n xl: \"w-4 h-4\",\r\n};\r\n\r\nexport const Badge: React.FC<BadgeProps> = ({\r\n children,\r\n variant = \"default\",\r\n size = \"md\",\r\n className,\r\n dot = false,\r\n count,\r\n maxCount = 99,\r\n showZero = false,\r\n pulse = false,\r\n removable = false,\r\n onRemove,\r\n icon,\r\n clickable = false,\r\n onClick,\r\n}) => {\r\n const isCountBadge = typeof count === \"number\";\r\n const shouldShowCount = isCountBadge && (count > 0 || showZero);\r\n const displayCount = count && count > maxCount ? `${maxCount}+` : count;\r\n const Icon = icon;\r\n\r\n const handleClick = (e: React.MouseEvent) => {\r\n if (clickable && onClick) {\r\n e.preventDefault();\r\n onClick();\r\n }\r\n };\r\n\r\n const handleRemove = (e: React.MouseEvent) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n onRemove?.();\r\n };\r\n\r\n const baseClasses = cn(\r\n \"inline-flex items-center border transition-all duration-200\",\r\n \"focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-1\",\r\n clickable && \"cursor-pointer hover:shadow-sm active:scale-95\",\r\n pulse && \"animate-pulse\",\r\n variantStyles[variant]\r\n );\r\n\r\n if (dot) {\r\n return (\r\n <span\r\n className={cn(\r\n \"inline-flex rounded-full border\",\r\n dotSizeStyles[size],\r\n variantStyles[variant],\r\n pulse && \"animate-pulse\",\r\n clickable && \"cursor-pointer hover:scale-110\",\r\n className\r\n )}\r\n onClick={handleClick}\r\n />\r\n );\r\n }\r\n\r\n if (shouldShowCount) {\r\n return (\r\n <span\r\n className={cn(\r\n baseClasses,\r\n \"justify-center rounded-full\",\r\n \"min-w-6 h-6 px-1.5 text-xs font-bold\",\r\n size === \"xs\" && \"min-w-5 h-5 px-1 text-xs\",\r\n size === \"sm\" && \"min-w-6 h-6 px-1.5 text-xs\",\r\n size === \"md\" && \"min-w-7 h-7 px-2 text-xs\",\r\n size === \"lg\" && \"min-w-8 h-8 px-2.5 text-sm\",\r\n size === \"xl\" && \"min-w-9 h-9 px-3 text-sm\",\r\n className\r\n )}\r\n onClick={handleClick}\r\n role=\"status\"\r\n aria-live=\"polite\"\r\n >\r\n {displayCount}\r\n </span>\r\n );\r\n }\r\n\r\n return (\r\n <span className={cn(baseClasses, \"rounded-md gap-1\", sizeStyles[size], className)} onClick={handleClick} role=\"status\">\r\n {Icon && (\r\n <Icon\r\n className={cn(\r\n \"shrink-0\",\r\n size === \"xs\" && \"h-3 w-3\",\r\n size === \"sm\" && \"h-3 w-3\",\r\n size === \"md\" && \"h-4 w-4\",\r\n size === \"lg\" && \"h-4 w-4\",\r\n size === \"xl\" && \"h-5 w-5\"\r\n )}\r\n />\r\n )}\r\n\r\n {children}\r\n\r\n {removable && (\r\n <button\r\n onClick={handleRemove}\r\n className={cn(\r\n \"ml-1 rounded-full hover:bg-accent focus:outline-none focus:bg-accent\",\r\n \"transition-colors duration-150 shrink-0\",\r\n size === \"xs\" && \"h-3 w-3\",\r\n size === \"sm\" && \"h-3 w-3\",\r\n size === \"md\" && \"h-4 w-4\",\r\n size === \"lg\" && \"h-4 w-4\",\r\n size === \"xl\" && \"h-5 w-5\"\r\n )}\r\n aria-label=\"Remove badge\"\r\n >\r\n <svg className=\"h-full w-full\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6 18L18 6M6 6l12 12\" />\r\n </svg>\r\n </button>\r\n )}\r\n </span>\r\n );\r\n};\r\n\r\n// Notification Badge component - wrapper for positioning badges over other elements\r\ninterface NotificationBadgeProps {\r\n children: React.ReactNode;\r\n count?: number;\r\n maxCount?: number;\r\n showZero?: boolean;\r\n dot?: boolean;\r\n variant?: BadgeProps[\"variant\"];\r\n size?: BadgeProps[\"size\"];\r\n className?: string;\r\n badgeClassName?: string;\r\n position?: \"top-right\" | \"top-left\" | \"bottom-right\" | \"bottom-left\";\r\n pulse?: boolean;\r\n}\r\n\r\nconst positionStyles = {\r\n \"top-right\": \"-top-1 -right-1\",\r\n \"top-left\": \"-top-1 -left-1\",\r\n \"bottom-right\": \"-bottom-1 -right-1\",\r\n \"bottom-left\": \"-bottom-1 -left-1\",\r\n};\r\n\r\nexport const NotificationBadge: React.FC<NotificationBadgeProps> = ({\r\n children,\r\n count,\r\n maxCount = 99,\r\n showZero = false,\r\n dot = false,\r\n variant = \"danger\",\r\n size = \"sm\",\r\n className,\r\n badgeClassName,\r\n position = \"top-right\",\r\n pulse = false,\r\n}) => {\r\n const shouldShow = dot || (typeof count === \"number\" && (count > 0 || showZero));\r\n\r\n return (\r\n <div className={cn(\"relative inline-flex\", className)}>\r\n {children}\r\n {shouldShow && (\r\n <Badge\r\n count={count}\r\n maxCount={maxCount}\r\n showZero={showZero}\r\n dot={dot}\r\n variant={variant}\r\n size={size}\r\n pulse={pulse}\r\n className={cn(\"absolute transform scale-100 transition-transform duration-200\", positionStyles[position], \"shadow-sm\", badgeClassName)}\r\n aria-live=\"polite\"\r\n />\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\n// Specialized Badge components\r\ninterface StatusBadgeProps extends Omit<BadgeProps, \"variant\"> {\r\n status?: \"online\" | \"offline\" | \"busy\" | \"away\" | \"idle\";\r\n}\r\n\r\nexport const StatusBadge: React.FC<StatusBadgeProps> = ({ status = \"offline\", ...props }) => {\r\n const statusVariants = {\r\n online: \"success\",\r\n offline: \"default\",\r\n busy: \"danger\",\r\n away: \"warning\",\r\n idle: \"info\",\r\n } as const;\r\n\r\n return <Badge {...props} variant={statusVariants[status]} dot={true} pulse={status === \"online\"} />;\r\n};\r\n\r\ninterface TagBadgeProps extends Omit<BadgeProps, \"removable\"> {\r\n tags?: string[];\r\n onTagRemove?: (tag: string) => void;\r\n maxTags?: number;\r\n}\r\n\r\nexport const TagBadge: React.FC<TagBadgeProps> = ({ tags = [], onTagRemove, maxTags = 3, size = \"sm\", variant = \"outline\", className, ...props }) => {\r\n const displayTags = tags.slice(0, maxTags);\r\n const remainingCount = tags.length - maxTags;\r\n\r\n return (\r\n <div className={cn(\"flex flex-wrap gap-1\", className)}>\r\n {displayTags.map((tag, index) => (\r\n <Badge key={`${tag}-${index}`} {...props} variant={variant} size={size} removable={!!onTagRemove} onRemove={() => onTagRemove?.(tag)}>\r\n {tag}\r\n </Badge>\r\n ))}\r\n {remainingCount > 0 && (\r\n <Badge variant=\"ghost\" size={size}>\r\n +{remainingCount}\r\n </Badge>\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\ninterface InteractiveBadgeProps extends BadgeProps {\r\n active?: boolean;\r\n disabled?: boolean;\r\n}\r\n\r\nexport const InteractiveBadge: React.FC<InteractiveBadgeProps> = ({ active = false, disabled = false, variant = \"outline\", className, ...props }) => {\r\n return (\r\n <Badge\r\n {...props}\r\n variant={active ? \"primary\" : variant}\r\n clickable={!disabled}\r\n className={cn(\"select-none\", disabled && \"opacity-50 cursor-not-allowed\", !disabled && !active && \"hover:border-primary/50\", className)}\r\n />\r\n );\r\n};\r\n\r\ninterface GradientBadgeProps extends Omit<BadgeProps, \"variant\"> {\r\n from?: string;\r\n to?: string;\r\n}\r\n\r\nexport const GradientBadge: React.FC<GradientBadgeProps> = ({ from = \"from-primary\", to = \"to-secondary\", className, ...props }) => {\r\n return (\r\n <Badge\r\n {...props}\r\n variant=\"transparent\"\r\n className={cn(`bg-linear-to-r ${from} ${to} text-primary-foreground border-transparent`, \"hover:opacity-90\", className)}\r\n />\r\n );\r\n};\r\n\r\ninterface PulseBadgeProps extends BadgeProps {\r\n speed?: \"slow\" | \"normal\" | \"fast\";\r\n}\r\n\r\nexport const PulseBadge: React.FC<PulseBadgeProps> = ({ speed = \"normal\", className, ...props }) => {\r\n const speedClasses = {\r\n slow: \"animate-pulse [animation-duration:2s]\",\r\n normal: \"animate-pulse\",\r\n fast: \"animate-pulse [animation-duration:0.5s]\",\r\n };\r\n\r\n return <Badge {...props} pulse={false} className={cn(speedClasses[speed], className)} />;\r\n};\r\n\r\nexport default Badge;\r\n","\"use client\";\n// components/ui/Card.tsx\nimport React, { useState } from \"react\";\nimport { cn } from \"@/lib/utils/cn\";\n\n// Helper to detect padding classes per direction\nconst getPaddingInfo = (className?: string) => {\n if (!className) return { hasAll: false, hasX: false, hasY: false };\n\n // Check for all-direction padding (p-)\n const hasAll = /\\b(p)-\\d+|\\b(p)-\\[/.test(className) || /\\bmd:p-|lg:p-|sm:p-|xl:p-/.test(className);\n\n // Check for X-axis padding (px-, pl-, pr-, ps-, pe-)\n const hasX = /\\b(px|pl|pr|ps|pe)-/.test(className);\n\n // Check for Y-axis padding (py-, pt-, pb-)\n const hasY = /\\b(py|pt|pb)-/.test(className);\n\n return { hasAll, hasX, hasY };\n};\n\ninterface CardProps extends React.HTMLAttributes<HTMLDivElement> {\n title?: string;\n description?: string;\n footer?: React.ReactNode;\n className?: string;\n children?: React.ReactNode;\n hoverable?: boolean;\n clickable?: boolean;\n innerClassName?: string; // class for inner rounded wrapper\n contentClassName?: string; // class for content wrapper (if padding class provided, overrides default)\n noPadding?: boolean; // remove default body padding\n}\n\nconst Card = ({\n title,\n description,\n children,\n footer,\n className,\n hoverable = false,\n clickable = false,\n innerClassName,\n contentClassName,\n noPadding = false,\n onClick,\n ...rest\n}: CardProps) => {\n const [isHovered, setIsHovered] = useState(false);\n\n return (\n <div\n className={cn(\n \"rounded-lg md:rounded-xl bg-card text-card-foreground transition-all duration-300 ease-soft\",\n \"shadow-sm md:hover:shadow-md mx-2 md:mx-0 border border-border\",\n hoverable && \"md:hover:-translate-y-0.5 md:hover:border-primary/15\",\n clickable && \"cursor-pointer active:translate-y-px md:hover:bg-accent/5\",\n \"backdrop-blur-sm\",\n className\n )}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n onClick={onClick}\n {...rest}\n >\n <div className={cn(\"relative overflow-hidden rounded-xl\", innerClassName)}>\n {(hoverable || clickable) && (\n <div\n className={cn(\n \"absolute inset-0 bg-linear-to-br from-primary/5 to-transparent transition-opacity duration-300\",\n isHovered ? \"opacity-100\" : \"opacity-0\"\n )}\n />\n )}\n\n {(title || description) && (\n <div className=\"relative flex flex-col space-y-2 p-4 md:p-6\">\n {title && (\n <h3\n className={cn(\n \"text-base md:text-lg font-semibold leading-none tracking-tight transition-colors duration-200\",\n isHovered && hoverable && \"text-primary\"\n )}\n >\n {title}\n </h3>\n )}\n {description && <p className=\"text-sm md:text-base text-muted-foreground leading-relaxed\">{description}</p>}\n </div>\n )}\n\n {children &&\n (() => {\n const padding = getPaddingInfo(contentClassName);\n const skipAllPadding = noPadding || padding.hasAll;\n // Default X: px-4 md:px-6, Default Y: pt-0 pb-4 md:pb-6\n const defaultPaddingX = !skipAllPadding && !padding.hasX ? \"px-4 md:px-6\" : \"\";\n const defaultPaddingY = !skipAllPadding && !padding.hasY ? \"pt-0 pb-4 md:pb-6\" : \"\";\n\n return <div className={cn(\"relative\", defaultPaddingX, defaultPaddingY, contentClassName)}>{children}</div>;\n })()}\n {footer && <div className=\"relative flex items-center p-4 md:p-6 pt-0 border-t border-border mt-4\">{footer}</div>}\n </div>\n </div>\n );\n};\n\nexport default Card;\n","\"use client\";\r\n\r\nimport * as React from \"react\";\r\nimport { cn } from \"@/lib/utils/cn\";\r\nimport { Check } from \"lucide-react\";\r\n\r\nexport interface CheckboxProps extends React.InputHTMLAttributes<HTMLInputElement> {\n label?: React.ReactNode;\r\n labelClassName?: string;\r\n containerClassName?: string;\r\n}\r\n\r\nconst Checkbox = React.forwardRef<HTMLInputElement, CheckboxProps>(\r\n ({ className, label, labelClassName, containerClassName, checked, defaultChecked, onChange, ...props }, ref) => {\r\n const [internalChecked, setInternalChecked] = React.useState<boolean>(defaultChecked ?? false);\r\n\r\n const isControlled = checked !== undefined;\r\n const isChecked = isControlled ? checked : internalChecked;\r\n\r\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n if (!isControlled) {\r\n setInternalChecked(e.target.checked);\r\n }\r\n onChange?.(e);\r\n };\r\n\r\n return (\r\n <label className={cn(\"inline-flex items-center gap-2 cursor-pointer select-none\", containerClassName)}>\r\n <input type=\"checkbox\" ref={ref} checked={isChecked} onChange={handleChange} className=\"hidden\" {...props} />\r\n <div\r\n className={cn(\r\n \"w-5 h-5 border rounded-sm flex items-center justify-center transition-all duration-200 ease-soft\",\r\n \"hover:shadow-sm active:scale-95\",\r\n isChecked \r\n ? \"bg-primary border-primary shadow-md text-primary-foreground\" \r\n : \"bg-background border-input hover:border-accent-foreground/30 hover:bg-accent/10\"\r\n )}\r\n >\r\n {isChecked && <Check className=\"w-4 h-4\" />}\r\n </div>\r\n {label && <span className={cn(\"text-sm text-foreground\", labelClassName)}>{label}</span>}\r\n </label>\r\n );\r\n }\r\n);\r\n\r\nCheckbox.displayName = \"Checkbox\";\r\n\r\nexport { Checkbox };\r\n","// components/ui/Input.tsx\r\n\"use client\";\r\n\r\nimport React, { forwardRef, InputHTMLAttributes, useId, useState } from \"react\";\r\nimport { useTranslations } from \"@/lib/i18n/translation-adapter\";\r\nimport { cn } from \"@/lib/utils/cn\";\r\nimport { Eye, EyeOff, Search, X, AlertCircle, CheckCircle, Loader2 } from \"lucide-react\";\r\n\r\nexport interface InputProps extends Omit<InputHTMLAttributes<HTMLInputElement>, \"size\"> {\r\n label?: string;\r\n error?: string;\r\n description?: string;\r\n variant?: \"default\" | \"filled\" | \"outlined\" | \"minimal\";\r\n size?: \"sm\" | \"md\" | \"lg\";\r\n leftIcon?: React.ComponentType<{ className?: string }>;\r\n rightIcon?: React.ComponentType<{ className?: string }>;\r\n clearable?: boolean;\r\n loading?: boolean;\r\n success?: boolean;\r\n onClear?: () => void;\r\n hint?: string;\r\n counter?: boolean;\r\n maxLength?: number;\r\n}\r\n\r\nconst Input = forwardRef<HTMLInputElement, InputProps>(\r\n (\r\n {\r\n label,\r\n error,\r\n description,\r\n className,\r\n required,\r\n variant = \"default\",\r\n size = \"md\",\r\n leftIcon: LeftIcon,\r\n rightIcon: RightIcon,\r\n clearable = false,\r\n loading = false,\r\n success = false,\r\n onClear,\r\n hint,\r\n counter = false,\r\n type = \"text\",\r\n value,\r\n maxLength,\r\n ...rest\r\n },\r\n ref\r\n ) => {\r\n const [localError, setLocalError] = useState<string | undefined>(error);\r\n const [showPassword, setShowPassword] = useState(false);\r\n const [isFocused, setIsFocused] = useState(false);\r\n const tv = useTranslations(\"ValidationInput\");\r\n const autoId = useId();\r\n // Only attach a generated id when we need to reference it (label/description/error)\r\n const needsId = !!(label || description || hint || error);\r\n const resolvedId = (rest.id as string) || (needsId ? `input-${autoId}` : undefined);\r\n\r\n const errMsg = error || localError;\r\n const hasValue = value !== undefined && value !== null && value !== \"\";\r\n const charCount = typeof value === \"string\" ? value.length : 0;\r\n const errorId = errMsg && resolvedId ? `${resolvedId}-error` : undefined;\r\n const descId = !errMsg && (description || hint) && resolvedId ? `${resolvedId}-desc` : undefined;\r\n const containerSpacing = size === \"sm\" ? \"space-y-1.5\" : \"space-y-2\";\r\n\r\n // Variant styles\r\n const variantStyles = {\r\n default: {\r\n container: \"bg-background border border-input hover:border-accent-foreground/20\",\r\n focus:\r\n \"focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-1 focus-visible:ring-offset-background focus-visible:border-transparent\",\r\n error:\r\n \"border-destructive focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-destructive focus-visible:ring-offset-1 focus-visible:ring-offset-background focus-visible:border-transparent\",\r\n },\r\n filled: {\r\n container: \"bg-muted/50 border border-transparent hover:bg-muted/70\",\r\n focus:\r\n \"focus-visible:outline-none focus-visible:bg-background focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-1 focus-visible:ring-offset-background focus-visible:border-transparent\",\r\n error:\r\n \"bg-destructive/10 border-destructive focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-destructive focus-visible:ring-offset-1 focus-visible:ring-offset-background focus-visible:border-transparent\",\r\n },\r\n outlined: {\r\n container: \"bg-transparent border border-border hover:border-accent-foreground/30\",\r\n focus:\r\n \"focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-1 focus-visible:ring-offset-background focus-visible:border-transparent\",\r\n error:\r\n \"border-destructive focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-destructive focus-visible:ring-offset-1 focus-visible:ring-offset-background focus-visible:border-transparent\",\r\n },\r\n minimal: {\r\n container: \"bg-transparent border-0 border-b border-border hover:border-accent-foreground/30\",\r\n focus: \"focus-visible:outline-none focus-visible:border-ring focus-visible:ring-0 rounded-none\",\r\n error: \"border-destructive focus-visible:outline-none focus-visible:border-destructive\",\r\n },\r\n };\r\n\r\n // Size styles\r\n const sizeStyles = {\r\n sm: {\r\n input: \"px-3 py-1.5 text-sm h-8 md:h-7 md:py-1 md:text-xs\",\r\n icon: \"w-4 h-4\",\r\n button: \"h-7 w-7\",\r\n },\r\n md: {\r\n input: \"px-4 py-2 text-sm h-10\",\r\n icon: \"w-5 h-5\",\r\n button: \"h-8 w-8\",\r\n },\r\n lg: {\r\n input: \"px-5 py-4 text-base h-12\",\r\n icon: \"w-6 h-6\",\r\n button: \"h-10 w-10\",\r\n },\r\n };\r\n\r\n const getErrorKey = (v: ValidityState) => {\r\n if (v.valueMissing) return \"required\";\r\n if (v.typeMismatch) return \"typeMismatch\";\r\n if (v.patternMismatch) return \"pattern\";\r\n if (v.tooShort) return \"tooShort\";\r\n if (v.tooLong) return \"tooLong\";\r\n if (v.rangeUnderflow) return \"rangeUnderflow\";\r\n if (v.rangeOverflow) return \"rangeOverflow\";\r\n if (v.stepMismatch) return \"stepMismatch\";\r\n if (v.badInput) return \"badInput\";\r\n return \"invalid\";\r\n };\r\n\r\n // Status icon\r\n const getStatusIcon = () => {\r\n if (loading) return <Loader2 className={cn(\"animate-spin text-muted-foreground\", sizeStyles[size].icon)} />;\r\n if (success) return <CheckCircle className={cn(\"text-success\", sizeStyles[size].icon)} />;\r\n if (errMsg) return <AlertCircle className={cn(\"text-destructive\", sizeStyles[size].icon)} />;\r\n return null;\r\n };\r\n\r\n // Password toggle for password inputs\r\n const showPasswordToggle = type === \"password\";\r\n const actualType = showPasswordToggle && showPassword ? \"text\" : type;\r\n\r\n // Extract handlers and disabled state\r\n const { onFocus: onFocusProp, onBlur: onBlurProp, disabled } = rest;\r\n\r\n // Filter out custom props to create clean HTML attributes\r\n const {\r\n label: _label,\r\n error: _error,\r\n description: _description,\r\n variant: _variant,\r\n size: _size,\r\n leftIcon: _leftIcon,\r\n rightIcon: _rightIcon,\r\n clearable: _clearable,\r\n loading: _loading,\r\n success: _success,\r\n onClear: _onClear,\r\n hint: _hint,\r\n counter: _counter,\r\n ...restInput\r\n } = rest as any;\r\n\r\n const handleFocus: React.FocusEventHandler<HTMLInputElement> = (e) => {\r\n setIsFocused(true);\r\n onFocusProp?.(e);\r\n };\r\n\r\n const handleBlur: React.FocusEventHandler<HTMLInputElement> = (e) => {\r\n setIsFocused(false);\r\n onBlurProp?.(e);\r\n };\r\n\r\n // Radius by size for visual consistency with Combobox/DatePicker\r\n const radiusClass = size === \"sm\" ? \"rounded-md\" : \"rounded-lg\";\r\n\r\n return (\r\n <div className={cn(\"w-full group\", containerSpacing)}>\r\n {/* Label */}\r\n {label && (\r\n <div className=\"flex items-center justify-between\">\r\n <label\r\n className={cn(\r\n // Label size follows input size\r\n size === \"sm\" ? \"text-xs\" : size === \"lg\" ? \"text-base\" : \"text-sm\",\r\n \"font-medium transition-colors duration-200\",\r\n // default color and highlight while any descendant focused\r\n disabled ? \"text-muted-foreground\" : cn(\"text-foreground group-focus-within:text-primary\", success && \"text-primary\"),\r\n errMsg && \"text-destructive\"\r\n )}\r\n >\r\n {label}\r\n {required && <span className=\"text-destructive ml-1\">*</span>}\r\n </label>\r\n\r\n {counter && maxLength && (\r\n <span\r\n className={cn(\r\n \"text-xs transition-colors duration-200\",\r\n charCount > maxLength * 0.9 ? \"text-warning\" : \"text-muted-foreground\",\r\n charCount >= maxLength && \"text-destructive\"\r\n )}\r\n >\r\n {charCount}/{maxLength}\r\n </span>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* Input Container */}\r\n <div className=\"relative group\">\r\n {/* Left Icon */}\r\n {LeftIcon && (\r\n <div\r\n className={cn(\r\n \"absolute left-3 top-1/2 -translate-y-1/2 z-10\",\r\n \"text-muted-foreground transition-colors duration-200\",\r\n // highlight icon when input (or controls) focused\r\n \"group-focus-within:text-primary\"\r\n )}\r\n >\r\n <LeftIcon className={sizeStyles[size].icon} />\r\n </div>\r\n )}\r\n\r\n <input\r\n ref={ref}\r\n type={actualType}\r\n // NOTE: Only controlled when `value` prop is provided.\r\n {...(value !== undefined ? { value } : {})}\r\n maxLength={maxLength}\r\n required={required}\r\n id={resolvedId}\r\n autoComplete={type === \"password\" ? \"current-password\" : type === \"email\" ? \"email\" : rest.autoComplete}\r\n onFocus={handleFocus}\r\n onBlur={handleBlur}\r\n onInvalid={(e) => {\r\n e.preventDefault();\r\n const key = getErrorKey(e.currentTarget.validity);\r\n setLocalError(tv(key));\r\n }}\r\n onInput={() => setLocalError(undefined)}\r\n aria-invalid={!!errMsg}\r\n aria-describedby={[errorId, descId].filter(Boolean).join(\" \") || undefined}\r\n className={cn(\r\n \"w-full text-foreground transition-all duration-200 ease-out\",\r\n \"placeholder:text-muted-foreground focus:outline-none focus-visible:outline-none\",\r\n \"disabled:cursor-not-allowed disabled:opacity-50\",\r\n\r\n // Size styles\r\n sizeStyles[size].input,\r\n radiusClass,\r\n\r\n // Icon padding adjustments\r\n LeftIcon && \"pl-10\",\r\n (RightIcon || showPasswordToggle || clearable || loading || success || errMsg) && \"pr-10\",\r\n\r\n // Variant styles\r\n variantStyles[variant].container,\r\n errMsg ? variantStyles[variant].error : variantStyles[variant].focus,\r\n\r\n // Reduce visual weight for sm: no default drop shadows\r\n size !== \"sm\" && variant !== \"minimal\" && \"shadow-sm\",\r\n size !== \"sm\" && isFocused && \"shadow-md\",\r\n\r\n className\r\n )}\r\n disabled={disabled}\r\n {...restInput}\r\n />\r\n\r\n {/* Right Icons */}\r\n <div className=\"absolute right-3 top-1/2 -translate-y-1/2 flex items-center gap-1\">\r\n {/* Status Icon */}\r\n {getStatusIcon()}\r\n\r\n {/* Custom Right Icon */}\r\n {RightIcon && !loading && !success && !errMsg && <RightIcon className={cn(\"text-muted-foreground\", sizeStyles[size].icon)} />}\r\n\r\n {/* Clear Button */}\r\n {clearable && hasValue && !loading && (\r\n <button\r\n type=\"button\"\r\n onClick={() => {\r\n if (onClear) return onClear();\r\n (rest.onChange as any)?.({ target: { value: \"\" } });\r\n }}\r\n className={cn(\r\n \"flex items-center justify-center text-muted-foreground hover:text-foreground transition-colors rounded-sm\",\r\n \"focus:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1\",\r\n \"active:bg-accent active:text-accent-foreground\",\r\n sizeStyles[size].button\r\n )}\r\n tabIndex={0}\r\n aria-label=\"Clear input\"\r\n >\r\n <X className={sizeStyles[size].icon} />\r\n </button>\r\n )}\r\n\r\n {/* Password Toggle */}\r\n {showPasswordToggle && (\r\n <button\r\n type=\"button\"\r\n onClick={() => setShowPassword(!showPassword)}\r\n className={cn(\r\n \"flex items-center justify-center text-muted-foreground hover:text-foreground transition-colors rounded-full\",\r\n \"focus:outline-none focus-visible:ring-1 focus-visible:ring-ring/40\",\r\n \"active:bg-accent/50 active:text-accent-foreground\",\r\n sizeStyles[size].button\r\n )}\r\n tabIndex={0}\r\n aria-label={showPassword ? \"Hide password\" : \"Show password\"}\r\n >\r\n {showPassword ? <EyeOff className={sizeStyles[size].icon} /> : <Eye className={sizeStyles[size].icon} />}\r\n </button>\r\n )}\r\n </div>\r\n\r\n {/* Focus Indicator for minimal variant */}\r\n {variant === \"minimal\" && (\r\n <div\r\n className={cn(\r\n \"absolute bottom-0 left-0 h-0.5 bg-linear-to-r from-primary to-primary/60 transition-all duration-300\",\r\n // default hidden\r\n \"w-0 opacity-0\",\r\n // expand underline when focused within input container\r\n \"group-focus-within:w-full group-focus-within:opacity-100\"\r\n )}\r\n />\r\n )}\r\n </div>\r\n\r\n {/* Error Message */}\r\n {errMsg && (\r\n <div id={errorId} className=\"flex items-center gap-2 text-sm text-destructive animate-in slide-in-from-top-1 duration-200\">\r\n <AlertCircle className=\"w-4 h-4 shrink-0\" />\r\n <span>{errMsg}</span>\r\n </div>\r\n )}\r\n\r\n {/* Description/Hint */}\r\n {(description || hint) && !errMsg && (\r\n <p\r\n id={descId}\r\n className={cn(\r\n \"text-xs transition-colors duration-200\",\r\n // follow focus state of the whole field area\r\n \"text-muted-foreground group-focus-within:text-primary/70\"\r\n )}\r\n >\r\n {hint || description}\r\n </p>\r\n )}\r\n </div>\r\n );\r\n }\r\n);\r\n\r\nInput.displayName = \"Input\";\r\n\r\n// Search Input - specialized for search functionality\r\ninterface SearchInputProps extends Omit<InputProps, \"leftIcon\" | \"type\"> {\r\n onSearch?: (value: string) => void;\r\n searchDelay?: number;\r\n}\r\n\r\nexport const SearchInput = forwardRef<HTMLInputElement, SearchInputProps>(\r\n ({ onSearch, searchDelay = 300, placeholder = \"Search...\", ...props }, ref) => {\r\n const [searchValue, setSearchValue] = useState(props.value || \"\");\r\n\r\n // Debounced search\r\n React.useEffect(() => {\r\n if (!onSearch) return;\r\n\r\n const timer = setTimeout(() => {\r\n onSearch(searchValue as string);\r\n }, searchDelay);\r\n\r\n return () => clearTimeout(timer);\r\n }, [searchValue, onSearch, searchDelay]);\r\n\r\n return (\r\n <Input\r\n ref={ref}\r\n type=\"search\"\r\n leftIcon={Search}\r\n placeholder={placeholder}\r\n clearable\r\n value={searchValue}\r\n onChange={(e) => setSearchValue(e.target.value)}\r\n onClear={() => setSearchValue(\"\")}\r\n {...props}\r\n />\r\n );\r\n }\r\n);\r\n\r\nSearchInput.displayName = \"SearchInput\";\r\n\r\n// Password Input - enhanced password field\r\ninterface PasswordInputProps extends Omit<InputProps, \"type\"> {\r\n showStrength?: boolean;\r\n strengthLabels?: string[];\r\n}\r\n\r\nexport const PasswordInput = forwardRef<HTMLInputElement, PasswordInputProps>(\r\n ({ showStrength = false, strengthLabels = [\"Weak\", \"Fair\", \"Good\", \"Strong\"], ...props }, ref) => {\r\n const getPasswordStrength = (password: string): number => {\r\n let score = 0;\r\n if (password.length >= 8) score++;\r\n if (/[a-z]/.test(password)) score++;\r\n if (/[A-Z]/.test(password)) score++;\r\n if (/[0-9]/.test(password)) score++;\r\n if (/[^A-Za-z0-9]/.test(password)) score++;\r\n return Math.min(score, 4);\r\n };\r\n\r\n const strength = showStrength && typeof props.value === \"string\" ? getPasswordStrength(props.value) : 0;\r\n const strengthColors = [\"bg-destructive\", \"bg-warning\", \"bg-warning\", \"bg-success\"];\r\n const strengthLabel = strengthLabels[strength - 1];\r\n\r\n return (\r\n <div className=\"space-y-2\">\r\n <Input ref={ref} type=\"password\" {...props} />\r\n\r\n {showStrength && props.value && (\r\n <div className=\"space-y-1\">\r\n <div className=\"flex gap-1\">\r\n {[1, 2, 3, 4].map((level) => (\r\n <div\r\n key={level}\r\n className={cn(\r\n \"h-1 flex-1 rounded-full transition-colors duration-300\",\r\n level <= strength ? strengthColors[strength - 1] : \"bg-muted\"\r\n )}\r\n />\r\n ))}\r\n </div>\r\n {strengthLabel && (\r\n <p\r\n className={cn(\r\n \"text-xs font-medium\",\r\n strength <= 1 ? \"text-destructive\" : strength <= 2 ? \"text-warning\" : strength <= 3 ? \"text-warning\" : \"text-success\"\r\n )}\r\n >\r\n {strengthLabel}\r\n </p>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n }\r\n);\r\n\r\nPasswordInput.displayName = \"PasswordInput\";\r\n\r\n// Number Input - enhanced numeric input\r\ninterface NumberInputProps extends Omit<InputProps, \"type\" | \"value\" | \"onChange\"> {\r\n min?: number;\r\n max?: number;\r\n step?: number;\r\n showSteppers?: boolean;\r\n onIncrement?: () => void;\r\n onDecrement?: () => void;\r\n formatThousands?: boolean;\r\n locale?: string;\r\n value?: number | string;\r\n onChange?: React.ChangeEventHandler<HTMLInputElement>;\r\n}\r\n\r\nexport const NumberInput = forwardRef<HTMLInputElement, NumberInputProps>(\r\n (\r\n { min, max, step = 1, showSteppers = true, onIncrement, onDecrement, formatThousands = false, locale = \"vi-VN\", value, onChange, ...props },\r\n ref\r\n ) => {\r\n const toNumber = (v: any): number => {\r\n if (v === \"\" || v === undefined || v === null) return 0;\r\n const n = Number(v);\r\n return Number.isFinite(n) ? n : 0;\r\n };\r\n\r\n const format = React.useCallback((n: number) => new Intl.NumberFormat(locale, { maximumFractionDigits: 0 }).format(n), [locale]);\r\n\r\n const parse = (s: string) => {\r\n // Remove all non-digits; treat empty as NaN\r\n const digits = (s || \"\").replace(/\\D+/g, \"\");\r\n return digits ? Number(digits) : NaN;\r\n };\r\n\r\n const [displayValue, setDisplayValue] = React.useState<string>(\r\n formatThousands ? (value !== undefined && value !== null && value !== \"\" ? format(toNumber(value)) : \"\") : String(value ?? \"\")\r\n );\r\n\r\n const currentValue = toNumber(value);\r\n\r\n React.useEffect(() => {\r\n if (formatThousands) {\r\n const next = value === \"\" || value === undefined || value === null ? \"\" : format(toNumber(value));\r\n setDisplayValue((prev) => (prev === next ? prev : next));\r\n } else {\r\n const next = String(value ?? \"\");\r\n setDisplayValue((prev) => (prev === next ? prev : next));\r\n }\r\n }, [value, formatThousands, locale, format]);\r\n\r\n const handleIncrement = () => {\r\n if (onIncrement) {\r\n onIncrement();\r\n } else if (onChange) {\r\n const newValue = Math.min(currentValue + step, max ?? Infinity);\r\n if (formatThousands) setDisplayValue(format(newValue));\r\n onChange({ target: { value: newValue.toString() } } as any);\r\n }\r\n };\r\n\r\n const handleDecrement = () => {\r\n if (onDecrement) {\r\n onDecrement();\r\n } else if (onChange) {\r\n const newValue = Math.max(currentValue - step, min ?? -Infinity);\r\n if (formatThousands) setDisplayValue(format(newValue));\r\n onChange({ target: { value: newValue.toString() } } as any);\r\n }\r\n };\r\n\r\n return (\r\n <div className=\"relative\">\r\n <Input\r\n ref={ref}\r\n type={formatThousands ? \"text\" : \"number\"}\r\n min={min}\r\n max={max}\r\n step={step}\r\n rightIcon={showSteppers ? undefined : props.rightIcon}\r\n value={displayValue}\r\n onChange={(e) => {\r\n if (!onChange) return;\r\n if (!formatThousands) return onChange(e);\r\n const raw = e.target.value;\r\n const parsed = parse(raw);\r\n if (Number.isNaN(parsed)) {\r\n setDisplayValue(\"\");\r\n onChange({ target: { value: \"\" } } as any);\r\n } else {\r\n const bounded = Math.min(Math.max(parsed, min ?? -Infinity), max ?? Infinity);\r\n setDisplayValue(format(bounded));\r\n onChange({ target: { value: bounded.toString() } } as any);\r\n }\r\n }}\r\n {...props}\r\n className={cn(\r\n showSteppers && [\r\n \"pr-12\",\r\n // Hide native browser steppers\r\n \"[&::-webkit-outer-spin-button]:appearance-none\",\r\n \"[&::-webkit-inner-spin-button]:appearance-none\",\r\n \"[&::-webkit-inner-spin-button]:m-0\",\r\n \"appearance-none\",\r\n ],\r\n props.className\r\n )}\r\n />\r\n {showSteppers && (\r\n <div className=\"absolute right-2 top-1/2 -translate-y-1/2 flex flex-col gap-0.5\">\r\n <button\r\n type=\"button\"\r\n onClick={handleIncrement}\r\n disabled={max !== undefined && currentValue >= max}\r\n className={cn(\r\n \"flex items-center justify-center w-4 h-4 rounded-sm transition-colors\",\r\n \"hover:bg-accent focus:outline-none focus:bg-accent\",\r\n \"disabled:opacity-50 disabled:cursor-not-allowed disabled:hover:bg-transparent\",\r\n \"text-muted-foreground hover:text-foreground\"\r\n )}\r\n aria-label=\"Increase value\"\r\n >\r\n <svg width=\"8\" height=\"8\" viewBox=\"0 0 8 8\" fill=\"none\" className=\"shrink-0\">\r\n <path d=\"M4 2L6 6H2L4 2Z\" fill=\"currentColor\" />\r\n </svg>\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={handleDecrement}\r\n disabled={min !== undefined && currentValue <= min}\r\n className={cn(\r\n \"flex items-center justify-center w-4 h-4 rounded-sm transition-colors\",\r\n \"hover:bg-accent focus:outline-none focus:bg-accent\",\r\n \"disabled:opacity-50 disabled:cursor-not-allowed disabled:hover:bg-transparent\",\r\n \"text-muted-foreground hover:text-foreground\"\r\n )}\r\n aria-label=\"Decrease value\"\r\n >\r\n <svg width=\"8\" height=\"8\" viewBox=\"0 0 8 8\" fill=\"none\" className=\"shrink-0\">\r\n <path d=\"M4 6L2 2H6L4 6Z\" fill=\"currentColor\" />\r\n </svg>\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n }\r\n);\r\n\r\nNumberInput.displayName = \"NumberInput\";\r\n\r\n// Textarea - multi-line text input\r\ninterface TextareaProps extends React.TextareaHTMLAttributes<HTMLTextAreaElement> {\r\n label?: string;\r\n error?: string;\r\n description?: string;\r\n variant?: \"default\" | \"filled\" | \"outlined\" | \"minimal\";\r\n resize?: \"none\" | \"vertical\" | \"horizontal\" | \"both\";\r\n counter?: boolean;\r\n}\r\n\r\nexport const Textarea = forwardRef<HTMLTextAreaElement, TextareaProps>(\r\n (\r\n { label, error, description, variant = \"default\", resize = \"vertical\", counter = false, className, required, value, maxLength, ...props },\r\n ref\r\n ) => {\r\n const [isFocused, setIsFocused] = useState(false);\r\n const charCount = typeof value === \"string\" ? value.length : 0;\r\n\r\n const variantStyles = {\r\n default:\r\n \"bg-background border border-input hover:border-accent-foreground/20 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-1 focus-visible:ring-offset-background focus-visible:border-transparent\",\r\n filled:\r\n \"bg-muted/50 border border-transparent hover:bg-muted/70 focus-visible:outline-none focus-visible:bg-background focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-1 focus-visible:ring-offset-background focus-visible:border-transparent\",\r\n outlined:\r\n \"bg-transparent border border-border hover:border-accent-foreground/30 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-1 focus-visible:ring-offset-background focus-visible:border-transparent\",\r\n minimal:\r\n \"bg-transparent border-0 border-b border-border hover:border-accent-foreground/30 focus-visible:outline-none focus-visible:border-ring focus-visible:ring-0 rounded-none\",\r\n };\r\n\r\n const resizeClasses = {\r\n none: \"resize-none\",\r\n vertical: \"resize-y\",\r\n horizontal: \"resize-x\",\r\n both: \"resize\",\r\n };\r\n\r\n return (\r\n <div className=\"w-full space-y-2\">\r\n {/* Label */}\r\n {label && (\r\n <div className=\"flex items-center justify-between\">\r\n <label\r\n className={cn(\r\n \"text-sm font-medium transition-colors duration-200\",\r\n isFocused ? \"text-primary\" : \"text-foreground\",\r\n error && \"text-destructive\"\r\n )}\r\n >\r\n {label}\r\n {required && <span className=\"text-destructive ml-1\">*</span>}\r\n </label>\r\n\r\n {counter && maxLength && (\r\n <span\r\n className={cn(\r\n \"text-xs transition-colors duration-200\",\r\n charCount > maxLength * 0.9 ? \"text-warning\" : \"text-muted-foreground\",\r\n charCount >= maxLength && \"text-destructive\"\r\n )}\r\n >\r\n {charCount}/{maxLength}\r\n </span>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* Textarea */}\r\n <textarea\r\n ref={ref}\r\n value={value}\r\n maxLength={maxLength}\r\n required={required}\r\n onFocus={() => setIsFocused(true)}\r\n onBlur={() => setIsFocused(false)}\r\n className={cn(\r\n \"w-full rounded-lg px-4 py-3 text-sm text-foreground transition-all duration-200\",\r\n \"placeholder:text-muted-foreground focus:outline-none min-h-[80px]\",\r\n \"disabled:cursor-not-allowed disabled:opacity-50\",\r\n variantStyles[variant],\r\n // DÒNG NÀY ĐÃ ĐƯỢC CẬP NHẬT:\r\n error &&\r\n \"border-destructive focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-destructive focus-visible:ring-offset-1 focus-visible:ring-offset-background focus-visible:border-transparent\",\r\n resizeClasses[resize],\r\n isFocused && \"shadow-md\",\r\n variant !== \"minimal\" && \"shadow-sm\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n\r\n {/* Error Message */}\r\n {error && (\r\n <div className=\"flex items-center gap-2 text-sm text-destructive animate-in slide-in-from-top-1 duration-200\">\r\n <AlertCircle className=\"w-4 h-4 shrink-0\" />\r\n <span>{error}</span>\r\n </div>\r\n )}\r\n\r\n {/* Description */}\r\n {description && !error && (\r\n <p className={cn(\"text-xs transition-colors duration-200\", isFocused ? \"text-primary/70\" : \"text-muted-foreground\")}>{description}</p>\r\n )}\r\n </div>\r\n );\r\n }\r\n);\r\n\r\nTextarea.displayName = \"Textarea\";\r\n\r\nexport default Input;\r\n","\"use client\";\n\n/**\n * Translation adapter for Underverse UI components.\n *\n * This module provides a unified translation interface that:\n * 1. Uses next-intl when available (for Next.js projects)\n * 2. Falls back to @underverse-ui/underverse's internal translations\n *\n * Components should import from this file instead of directly from next-intl\n * to ensure compatibility with both Next.js and React projects.\n */\n\nimport * as React from \"react\";\n\n// ============================================================================\n// Default translations (fallback when next-intl is not available)\n// ============================================================================\ntype TranslationValue = string | Record<string, string>;\ntype NamespaceTranslations = Record<string, TranslationValue>;\ntype LocaleTranslations = Record<string, NamespaceTranslations>;\n\nconst defaultTranslations: Record<string, LocaleTranslations> = {\n en: {\n Common: {\n close: \"Close\",\n closeAlert: \"Close alert\",\n notifications: \"Notifications\",\n newNotification: \"New\",\n readStatus: \"Read\",\n openLink: \"Open link\",\n theme: \"Theme\",\n lightTheme: \"Light\",\n darkTheme: \"Dark\",\n systemTheme: \"System\",\n density: \"Density\",\n compact: \"Compact\",\n normal: \"Normal\",\n comfortable: \"Comfortable\",\n columns: \"Columns\",\n },\n ValidationInput: {\n required: \"This field is required\",\n typeMismatch: \"Invalid format\",\n pattern: \"Invalid pattern\",\n tooShort: \"Too short\",\n tooLong: \"Too long\",\n rangeUnderflow: \"Below minimum\",\n rangeOverflow: \"Above maximum\",\n stepMismatch: \"Step mismatch\",\n badInput: \"Bad input\",\n invalid: \"Invalid value\",\n },\n Loading: {\n loadingPage: \"Loading page\",\n pleaseWait: \"Please wait\",\n },\n DatePicker: {\n placeholder: \"Select date\",\n today: \"Today\",\n clear: \"Clear\",\n },\n Pagination: {\n navigationLabel: \"Pagination navigation\",\n showingResults: \"Showing {startItem}–{endItem} of {totalItems}\",\n firstPage: \"First page\",\n previousPage: \"Previous page\",\n previous: \"Previous\",\n nextPage: \"Next page\",\n next: \"Next\",\n lastPage: \"Last page\",\n pageNumber: \"Page {page}\",\n itemsPerPage: \"Items per page\",\n search: \"Search\",\n noOptions: \"No options\",\n },\n Form: {\n required: \"This field is required\",\n },\n OCR: {\n imageUpload: {\n dragDropText: \"Drag & drop files here\",\n browseFiles: \"Browse files\",\n supportedFormats: \"Supported formats: images\",\n },\n },\n },\n vi: {\n Common: {\n close: \"Đóng\",\n closeAlert: \"Đóng cảnh báo\",\n notifications: \"Thông báo\",\n newNotification: \"Mới\",\n readStatus: \"Đã đọc\",\n openLink: \"Mở liên kết\",\n theme: \"Chủ đề\",\n lightTheme: \"Giao diện sáng\",\n darkTheme: \"Giao diện tối\",\n systemTheme: \"Theo hệ thống\",\n density: \"Mật độ\",\n compact: \"Gọn\",\n normal: \"Thường\",\n comfortable: \"Thoải mái\",\n columns: \"Cột\",\n },\n ValidationInput: {\n required: \"Trường này là bắt buộc\",\n typeMismatch: \"Định dạng không hợp lệ\",\n pattern: \"Sai mẫu\",\n tooShort: \"Quá ngắn\",\n tooLong: \"Quá dài\",\n rangeUnderflow: \"Nhỏ hơn giá trị tối thiểu\",\n rangeOverflow: \"Lớn hơn giá trị tối đa\",\n stepMismatch: \"Sai bước\",\n badInput: \"Giá trị không hợp lệ\",\n invalid: \"Giá trị không hợp lệ\",\n },\n Loading: {\n loadingPage: \"Đang tải trang\",\n pleaseWait: \"Vui lòng chờ\",\n },\n DatePicker: {\n placeholder: \"Chọn ngày\",\n today: \"Hôm nay\",\n clear: \"Xóa\",\n },\n Pagination: {\n navigationLabel: \"Điều hướng phân trang\",\n showingResults: \"Hiển thị {startItem}–{endItem} trong tổng {totalItems}\",\n firstPage: \"Trang đầu\",\n previousPage: \"Trang trước\",\n previous: \"Trước\",\n nextPage: \"Trang sau\",\n next: \"Sau\",\n lastPage: \"Trang cuối\",\n pageNumber: \"Trang {page}\",\n itemsPerPage: \"Số mục/trang\",\n search: \"Tìm kiếm\",\n noOptions: \"Không có lựa chọn\",\n },\n Form: {\n required: \"Trường này là bắt buộc\",\n },\n OCR: {\n imageUpload: {\n dragDropText: \"Kéo & thả ảnh vào đây\",\n browseFiles: \"Chọn tệp\",\n supportedFormats: \"Hỗ trợ các định dạng ảnh\",\n },\n },\n },\n ko: {\n Common: {\n close: \"닫기\",\n closeAlert: \"알림 닫기\",\n notifications: \"알림\",\n newNotification: \"새로운\",\n readStatus: \"읽음\",\n openLink: \"링크 열기\",\n theme: \"테마\",\n lightTheme: \"라이트\",\n darkTheme: \"다크\",\n systemTheme: \"시스템\",\n density: \"밀도\",\n compact: \"컴팩트\",\n normal: \"보통\",\n comfortable: \"여유\",\n columns: \"열\",\n },\n ValidationInput: {\n required: \"필수 입력 항목입니다\",\n typeMismatch: \"형식이 올바르지 않습니다\",\n pattern: \"패턴이 일치하지 않습니다\",\n tooShort: \"너무 짧습니다\",\n tooLong: \"너무 깁니다\",\n rangeUnderflow: \"최솟값보다 작습니다\",\n rangeOverflow: \"최댓값을 초과했습니다\",\n stepMismatch: \"단계가 일치하지 않습니다\",\n badInput: \"잘못된 입력입니다\",\n invalid: \"유효하지 않은 값입니다\",\n },\n Loading: {\n loadingPage: \"페이지 로딩 중\",\n pleaseWait: \"잠시만 기다려 주세요\",\n },\n DatePicker: {\n placeholder: \"날짜 선택\",\n today: \"오늘\",\n clear: \"지우기\",\n },\n Pagination: {\n navigationLabel: \"페이지 네비게이션\",\n showingResults: \"{startItem}–{endItem} / 총 {totalItems}개\",\n firstPage: \"첫 페이지\",\n previousPage: \"이전 페이지\",\n previous: \"이전\",\n nextPage: \"다음 페이지\",\n next: \"다음\",\n lastPage: \"마지막 페이지\",\n pageNumber: \"{page}페이지\",\n itemsPerPage: \"페이지당 항목 수\",\n search: \"검색\",\n noOptions: \"옵션 없음\",\n },\n Form: {\n required: \"필수 입력 항목입니다\",\n },\n OCR: {\n imageUpload: {\n dragDropText: \"여기에 파일을 드래그 앤 드롭하세요\",\n browseFiles: \"파일 찾아보기\",\n supportedFormats: \"지원 형식: 이미지\",\n },\n },\n },\n ja: {\n Common: {\n close: \"閉じる\",\n closeAlert: \"アラートを閉じる\",\n notifications: \"通知\",\n newNotification: \"新規\",\n readStatus: \"既読\",\n openLink: \"リンクを開く\",\n theme: \"テーマ\",\n lightTheme: \"ライト\",\n darkTheme: \"ダーク\",\n systemTheme: \"システム\",\n density: \"密度\",\n compact: \"コンパクト\",\n normal: \"通常\",\n comfortable: \"ゆったり\",\n columns: \"列\",\n },\n ValidationInput: {\n required: \"この項目は必須です\",\n typeMismatch: \"形式が正しくありません\",\n pattern: \"パターンが一致しません\",\n tooShort: \"短すぎます\",\n tooLong: \"長すぎます\",\n rangeUnderflow: \"最小値より小さいです\",\n rangeOverflow: \"最大値を超えています\",\n stepMismatch: \"ステップが一致しません\",\n badInput: \"入力が無効です\",\n invalid: \"無効な値です\",\n },\n Loading: {\n loadingPage: \"ページを読み込み中\",\n pleaseWait: \"しばらくお待ちください\",\n },\n DatePicker: {\n placeholder: \"日付を選択\",\n today: \"今日\",\n clear: \"クリア\",\n },\n Pagination: {\n navigationLabel: \"ページナビゲーション\",\n showingResults: \"{startItem}–{endItem} / 全{totalItems}件\",\n firstPage: \"最初のページ\",\n previousPage: \"前のページ\",\n previous: \"前へ\",\n nextPage: \"次のページ\",\n next: \"次へ\",\n lastPage: \"最後のページ\",\n pageNumber: \"{page}ページ\",\n itemsPerPage: \"1ページあたりの項目数\",\n search: \"検索\",\n noOptions: \"オプションなし\",\n },\n Form: {\n required: \"この項目は必須です\",\n },\n OCR: {\n imageUpload: {\n dragDropText: \"ここにファイルをドラッグ&ドロップ\",\n browseFiles: \"ファイルを参照\",\n supportedFormats: \"対応形式:画像\",\n },\n },\n },\n};\n\n// ============================================================================\n// Translation Context (for standalone React usage)\n// ============================================================================\ntype Locale = \"en\" | \"vi\" | \"ko\" | \"ja\";\n\ninterface TranslationContextType {\n locale: Locale;\n t: (namespace: string) => (key: string) => string;\n}\n\nconst TranslationContext = React.createContext<TranslationContextType | null>(null);\n\nexport interface UnderverseProviderProps {\n children: React.ReactNode;\n /** Current locale. Defaults to \"en\" */\n locale?: Locale;\n /** Custom translations to merge with defaults */\n translations?: Record<string, Record<string, string | Record<string, string>>>;\n}\n\n/**\n * UnderverseProvider for standalone React usage (without next-intl).\n * Wrap your app with this provider to enable translations.\n *\n * @example\n * ```tsx\n * // For React (Vite, CRA, etc.) - without next-intl\n * import { UnderverseProvider, DatePicker } from \"@underverse-ui/underverse\";\n *\n * function App() {\n * return (\n * <UnderverseProvider locale=\"vi\">\n * <DatePicker onChange={(date) => console.log(date)} />\n * </UnderverseProvider>\n * );\n * }\n * ```\n */\nexport const UnderverseProvider: React.FC<UnderverseProviderProps> = ({ children, locale = \"en\", translations }) => {\n const t = React.useCallback(\n (namespace: string) => {\n return (key: string): string => {\n const mergedTranslations = {\n ...defaultTranslations[locale],\n ...translations,\n };\n\n // Handle nested namespaces like \"OCR.imageUpload\"\n const parts = namespace.split(\".\");\n let current: unknown = mergedTranslations;\n\n for (const part of parts) {\n if (current && typeof current === \"object\" && part in current) {\n current = (current as Record<string, unknown>)[part];\n } else {\n return key;\n }\n }\n\n if (current && typeof current === \"object\" && key in current) {\n const value = (current as Record<string, unknown>)[key];\n return typeof value === \"string\" ? value : key;\n }\n\n return key;\n };\n },\n [locale, translations]\n );\n\n return <TranslationContext.Provider value={{ locale, t }}>{children}</TranslationContext.Provider>;\n};\n\n// ============================================================================\n// Try to detect next-intl\n// ============================================================================\nlet nextIntlAvailable = false;\nlet nextIntlUseTranslations: ((namespace: string) => (key: string) => string) | null = null;\nlet nextIntlUseLocale: (() => string) | null = null;\n\ntry {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const nextIntl = require(\"next-intl\");\n if (nextIntl && typeof nextIntl.useTranslations === \"function\") {\n nextIntlAvailable = true;\n nextIntlUseTranslations = nextIntl.useTranslations;\n nextIntlUseLocale = nextIntl.useLocale;\n }\n} catch {\n // next-intl not available\n}\n\n// ============================================================================\n// Smart hooks that auto-detect translation system\n// ============================================================================\n\n/**\n * Interpolate placeholders in a string.\n * Replaces {key} with the corresponding value from params.\n */\nfunction interpolate(template: string, params?: Record<string, unknown>): string {\n if (!params) return template;\n return template.replace(/\\{(\\w+)\\}/g, (_, key) => {\n const value = params[key];\n return value !== undefined ? String(value) : `{${key}}`;\n });\n}\n\n/**\n * Internal fallback translation function.\n */\nfunction getInternalTranslation(namespace: string, locale: Locale): (key: string, params?: Record<string, unknown>) => string {\n return (key: string, params?: Record<string, unknown>): string => {\n const localeTranslations = defaultTranslations[locale] || defaultTranslations.en;\n const parts = namespace.split(\".\");\n let current: unknown = localeTranslations;\n\n for (const part of parts) {\n if (current && typeof current === \"object\" && part in current) {\n current = (current as Record<string, unknown>)[part];\n } else {\n return interpolate(key, params);\n }\n }\n\n if (current && typeof current === \"object\" && key in current) {\n const value = (current as Record<string, unknown>)[key];\n return typeof value === \"string\" ? interpolate(value, params) : interpolate(key, params);\n }\n\n return interpolate(key, params);\n };\n}\n\n/**\n * Smart translation hook that works with both next-intl and standalone React.\n *\n * Priority:\n * 1. next-intl (if available and in NextIntlClientProvider)\n * 2. UnderverseProvider context\n * 3. English fallback defaults\n *\n * @param namespace - The translation namespace (e.g., \"DatePicker\", \"Common\")\n */\nexport function useTranslations(namespace: string): (key: string, params?: Record<string, unknown>) => string {\n const underverseContext = React.useContext(TranslationContext);\n\n // If UnderverseProvider is available, use it\n if (underverseContext) {\n return (key: string, params?: Record<string, unknown>) => {\n const result = underverseContext.t(namespace)(key);\n return interpolate(result, params);\n };\n }\n\n // Try next-intl if available\n if (nextIntlAvailable && nextIntlUseTranslations) {\n try {\n // This will throw if not wrapped in NextIntlClientProvider\n // eslint-disable-next-line react-hooks/rules-of-hooks\n const nextIntlT = nextIntlUseTranslations(namespace);\n // next-intl's t function already supports params\n return nextIntlT as (key: string, params?: Record<string, unknown>) => string;\n } catch {\n // Fall through to default\n }\n }\n\n // Fallback to English defaults\n return getInternalTranslation(namespace, \"en\");\n}\n\n/**\n * Smart locale hook that works with both next-intl and standalone React.\n */\nexport function useLocale(): Locale {\n const underverseContext = React.useContext(TranslationContext);\n\n // If UnderverseProvider is available, use it\n if (underverseContext) {\n return underverseContext.locale;\n }\n\n // Try next-intl if available\n if (nextIntlAvailable && nextIntlUseLocale) {\n try {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n const locale = nextIntlUseLocale();\n return (locale === \"vi\" ? \"vi\" : \"en\") as Locale;\n } catch {\n // Fall through to default\n }\n }\n\n // Fallback to English\n return \"en\";\n}\n\nexport type { Locale };\n","\"use client\";\n\nimport React, { forwardRef, useState, useRef, useId } from \"react\";\nimport { cn } from \"@/lib/utils/cn\";\nimport { X, Search, Loader2 } from \"lucide-react\";\nimport Button from \"./Button\";\n\nexport interface TagInputProps {\n /** Danh sách tags hiện tại */\n value: string[];\n\n /** Callback khi danh sách tags thay đổi */\n onChange: (tags: string[]) => void;\n\n /** Callback khi user muốn tìm kiếm (Ctrl+Enter hoặc click Search) */\n onSearch: (tags: string[]) => void;\n\n /** Callback when all tags are cleared */\n onClear?: () => void;\n\n /** Placeholder khi chưa có tags */\n placeholder?: string;\n\n /** Placeholder khi đã có tags */\n placeholderWithTags?: string;\n\n /** Label hiển thị phía trên input */\n label?: string;\n\n /** Ẩn nút Search */\n hideSearchButton?: boolean;\n\n /** Ẩn nút Clear All */\n hideClearButton?: boolean;\n\n /** Custom class cho container */\n className?: string;\n\n /** Size: 'sm' | 'md' | 'lg' */\n size?: \"sm\" | \"md\" | \"lg\";\n\n /** Disabled state */\n disabled?: boolean;\n\n /** Loading state - hiển thị spinner trên nút Search */\n loading?: boolean;\n\n /** Maximum number of tags allowed */\n maxTags?: number;\n\n /** i18n labels - no external dependency required */\n labels?: {\n search?: string;\n clearAll?: string;\n placeholder?: string;\n placeholderWithTags?: string;\n moreCount?: string; // e.g. \"+{count} more\" - use {count} as placeholder\n };\n\n /** Maximum visible tags before showing \"+N more\" badge */\n maxVisibleTags?: number;\n}\n\nconst TagInput = forwardRef<HTMLInputElement, TagInputProps>(\n (\n {\n value = [],\n onChange,\n onSearch,\n onClear,\n placeholder,\n placeholderWithTags,\n label,\n hideSearchButton = false,\n hideClearButton = false,\n className,\n size = \"md\",\n disabled = false,\n loading = false,\n maxTags,\n maxVisibleTags,\n labels,\n },\n ref\n ) => {\n const [inputValue, setInputValue] = useState(\"\");\n const [isFocused, setIsFocused] = useState(false);\n const inputRef = useRef<HTMLInputElement>(null);\n const autoId = useId();\n const inputId = `tag-input-${autoId}`;\n\n // Use props > labels > defaults (no external i18n dependency)\n const defaultPlaceholder = placeholder ?? labels?.placeholder ?? \"Enter value and press Enter...\";\n const defaultPlaceholderWithTags = placeholderWithTags ?? labels?.placeholderWithTags ?? \"Ctrl+Enter to search\";\n const searchLabel = labels?.search ?? \"Search\";\n const clearAllLabel = labels?.clearAll ?? \"Clear all\";\n\n // Check if max tags reached\n const isMaxReached = maxTags !== undefined && value.length >= maxTags;\n\n // Calculate visible tags and hidden count\n const [isExpanded, setIsExpanded] = useState(false);\n const hiddenCount = maxVisibleTags !== undefined && !isExpanded ? Math.max(0, value.length - maxVisibleTags) : 0;\n const visibleTags = hiddenCount > 0 ? value.slice(0, maxVisibleTags) : value;\n const moreLabel = labels?.moreCount?.replace(\"{count}\", String(hiddenCount)) ?? `+${hiddenCount} more`;\n\n // Size styles\n const sizeStyles = {\n sm: {\n container: \"min-h-8 p-1.5 gap-1\",\n input: \"text-xs\",\n tag: \"px-1.5 py-0.5 text-xs gap-1\",\n tagIcon: \"h-3 w-3\",\n button: \"h-7 text-xs px-2\",\n },\n md: {\n container: \"min-h-10 p-2 gap-1.5\",\n input: \"text-sm\",\n tag: \"px-2 py-1 text-sm gap-1.5\",\n tagIcon: \"h-3.5 w-3.5\",\n button: \"h-8 text-sm px-3\",\n },\n lg: {\n container: \"min-h-12 p-2.5 gap-2\",\n input: \"text-base\",\n tag: \"px-2.5 py-1.5 text-base gap-2\",\n tagIcon: \"h-4 w-4\",\n button: \"h-9 text-base px-4\",\n },\n };\n\n const addTag = (tagValue: string) => {\n const trimmed = tagValue.trim();\n if (!trimmed) return false;\n\n // Check for duplicates\n if (value.includes(trimmed)) return false;\n\n // Check max tags limit\n if (isMaxReached) return false;\n\n onChange([...value, trimmed]);\n setInputValue(\"\");\n return true;\n };\n\n const removeTag = (index: number) => {\n const newTags = value.filter((_, i) => i !== index);\n onChange(newTags);\n };\n\n const clearAll = () => {\n onChange([]);\n setInputValue(\"\");\n onClear?.();\n inputRef.current?.focus();\n };\n\n const triggerSearch = () => {\n // Add current input if exists before searching\n const trimmed = inputValue.trim();\n let finalTags = [...value];\n if (trimmed && !value.includes(trimmed) && !isMaxReached) {\n finalTags = [...value, trimmed];\n onChange(finalTags);\n setInputValue(\"\");\n }\n onSearch(finalTags);\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n\n // Check for Ctrl+Enter or Cmd+Enter for search\n if (e.ctrlKey || e.metaKey) {\n triggerSearch();\n return; // Exit early to prevent other actions\n }\n\n // Check for Shift+Enter for batch adding tags\n if (e.shiftKey) {\n const tagsToAdd = inputValue\n .split(/\\s+/) // Split by one or more whitespace\n .map((t) => t.trim())\n .filter((t) => t.length > 0 && !value.includes(t)); // Remove empty or duplicate\n\n if (tagsToAdd.length > 0) {\n // Check max tags limit\n const availableSlots = maxTags !== undefined ? maxTags - value.length : Infinity;\n\n if (availableSlots > 0) {\n const tagsToInsert = tagsToAdd.slice(0, availableSlots);\n onChange([...value, ...tagsToInsert]);\n setInputValue(\"\");\n }\n }\n return;\n }\n\n // Default behavior: just add single tag\n addTag(inputValue);\n } else if (e.key === \"Backspace\" && inputValue === \"\" && value.length > 0) {\n // Remove last tag when backspace on empty input\n removeTag(value.length - 1);\n }\n };\n\n const handleContainerClick = () => {\n inputRef.current?.focus();\n };\n\n const currentPlaceholder = value.length > 0 ? defaultPlaceholderWithTags : defaultPlaceholder;\n\n return (\n <div className={cn(\"w-full space-y-2\", className)}>\n {/* Label */}\n {label && (\n <label\n htmlFor={inputId}\n className={cn(\n \"block font-medium transition-colors duration-200\",\n size === \"sm\" ? \"text-xs\" : size === \"lg\" ? \"text-base\" : \"text-sm\",\n disabled ? \"text-muted-foreground\" : isFocused ? \"text-primary\" : \"text-foreground\"\n )}\n >\n {label}\n {maxTags !== undefined && (\n <span className=\"ml-2 text-muted-foreground font-normal\">\n ({value.length}/{maxTags})\n </span>\n )}\n </label>\n )}\n\n {/* Input Container with Tags */}\n <div\n onClick={handleContainerClick}\n className={cn(\n \"flex flex-wrap items-center cursor-text\",\n \"bg-background border border-input rounded-lg\",\n \"transition-all duration-200\",\n \"hover:border-accent-foreground/20\",\n isFocused && \"ring-1 ring-ring ring-offset-1 ring-offset-background border-transparent shadow-md\",\n disabled && \"opacity-50 cursor-not-allowed\",\n sizeStyles[size].container\n )}\n >\n {/* Tags */}\n {visibleTags.map((tag, index) => (\n <span\n key={`${tag}-${index}`}\n className={cn(\n \"inline-flex items-center rounded-md\",\n \"bg-primary/10 text-primary font-mono\",\n \"animate-in fade-in-0 zoom-in-95 duration-200\",\n sizeStyles[size].tag\n )}\n >\n <span className=\"truncate max-w-50\">{tag}</span>\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n removeTag(index);\n }}\n disabled={disabled}\n className={cn(\n \"flex items-center justify-center rounded-sm\",\n \"text-primary/70 hover:text-primary hover:bg-primary/20\",\n \"transition-colors duration-150\",\n \"focus:outline-none focus-visible:ring-1 focus-visible:ring-primary\",\n \"disabled:pointer-events-none\"\n )}\n aria-label={`Remove ${tag}`}\n >\n <X className={sizeStyles[size].tagIcon} />\n </button>\n </span>\n ))}\n\n {/* +N more badge */}\n {hiddenCount > 0 && (\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n setIsExpanded(true);\n }}\n className={cn(\n \"inline-flex items-center rounded-md cursor-pointer\",\n \"bg-muted text-muted-foreground hover:bg-muted/80\",\n \"transition-colors duration-150\",\n \"focus:outline-none focus-visible:ring-1 focus-visible:ring-ring\",\n sizeStyles[size].tag\n )}\n title={value.slice(maxVisibleTags).join(\", \")}\n >\n {moreLabel}\n </button>\n )}\n\n {/* Collapse button when expanded */}\n {isExpanded && maxVisibleTags !== undefined && value.length > maxVisibleTags && (\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n setIsExpanded(false);\n }}\n className={cn(\n \"inline-flex items-center rounded-md cursor-pointer\",\n \"bg-muted/50 text-muted-foreground hover:bg-muted/80\",\n \"transition-colors duration-150\",\n \"focus:outline-none focus-visible:ring-1 focus-visible:ring-ring\",\n sizeStyles[size].tag\n )}\n >\n Show less\n </button>\n )}\n\n {/* Input */}\n <input\n ref={(node) => {\n // Handle both refs\n (inputRef as React.MutableRefObject<HTMLInputElement | null>).current = node;\n if (typeof ref === \"function\") {\n ref(node);\n } else if (ref) {\n ref.current = node;\n }\n }}\n id={inputId}\n type=\"text\"\n value={inputValue}\n onChange={(e) => setInputValue(e.target.value)}\n onKeyDown={handleKeyDown}\n onFocus={() => setIsFocused(true)}\n onBlur={() => setIsFocused(false)}\n placeholder={isMaxReached ? `Max ${maxTags} tags` : currentPlaceholder}\n disabled={disabled || isMaxReached}\n className={cn(\n \"flex-1 min-w-30 bg-transparent outline-none\",\n \"placeholder:text-muted-foreground\",\n \"disabled:cursor-not-allowed\",\n sizeStyles[size].input\n )}\n aria-label={label || \"Tag input\"}\n />\n </div>\n\n {/* Action Buttons */}\n {(!hideSearchButton || !hideClearButton) && (\n <div className=\"flex items-center gap-2\">\n {!hideSearchButton && (\n <Button\n type=\"button\"\n variant=\"default\"\n size={size === \"lg\" ? \"md\" : size}\n onClick={triggerSearch}\n disabled={disabled || loading}\n className={sizeStyles[size].button}\n >\n {loading ? <Loader2 className=\"h-4 w-4 animate-spin mr-1.5\" /> : <Search className=\"h-4 w-4 mr-1.5\" />}\n {searchLabel}\n </Button>\n )}\n\n {!hideClearButton && value.length > 0 && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size={size === \"lg\" ? \"md\" : size}\n onClick={clearAll}\n disabled={disabled}\n className={cn(sizeStyles[size].button, \"text-muted-foreground hover:text-foreground\")}\n >\n {clearAllLabel}\n </Button>\n )}\n </div>\n )}\n </div>\n );\n }\n);\n\nTagInput.displayName = \"TagInput\";\n\nexport { TagInput };\nexport default TagInput;\n// CI Trigger Test\n","\"use client\";\r\n\r\nimport { forwardRef, TextareaHTMLAttributes, useState } from \"react\";\r\nimport { cn } from \"@/lib/utils/cn\";\r\n\r\nexport interface TextareaProps extends TextareaHTMLAttributes<HTMLTextAreaElement> {\r\n label?: string;\r\n error?: string;\r\n description?: string;\r\n variant?: \"default\" | \"filled\" | \"outlined\";\r\n size?: \"sm\" | \"md\" | \"lg\";\r\n}\r\n\r\nconst Textarea = forwardRef<HTMLTextAreaElement, TextareaProps>(\r\n ({ label, error, description, className, required, variant = \"default\", size = \"md\", ...rest }, ref) => {\r\n const [isFocused, setIsFocused] = useState(false);\r\n\r\n const sizeClasses = {\r\n sm: \"px-3 py-2 text-sm min-h-[80px]\",\r\n md: \"px-4 py-3 text-sm min-h-[100px]\", \r\n lg: \"px-5 py-4 text-base min-h-[120px]\"\r\n };\r\n\r\n const variantClasses = {\r\n default: cn(\r\n \"border border-input bg-background\",\r\n \"hover:border-accent-foreground/20\",\r\n \"focus:border-primary focus:ring-2 focus:ring-primary/20\"\r\n ),\r\n filled: cn(\r\n \"border-0 bg-muted\",\r\n \"hover:bg-muted/80\",\r\n \"focus:bg-background focus:ring-2 focus:ring-primary/20\"\r\n ),\r\n outlined: cn(\r\n \"border-2 border-border bg-transparent\",\r\n \"hover:border-primary/50\",\r\n \"focus:border-primary focus:ring-0\"\r\n )\r\n };\r\n\r\n return (\r\n <div className=\"w-full space-y-2\">\r\n {label && (\r\n <div className=\"flex items-center\">\r\n <label className={cn(\r\n \"text-sm font-medium transition-colors duration-200\",\r\n isFocused ? \"text-primary\" : \"text-foreground\",\r\n error && \"text-destructive\"\r\n )}>\r\n {label}\r\n {required && <span className=\"text-destructive ml-1\">*</span>}\r\n </label>\r\n {error && (\r\n <span className=\"text-xs text-destructive ml-auto animate-in slide-in-from-right-2 duration-200\" aria-live=\"polite\" role=\"alert\">\r\n {error}\r\n </span>\r\n )}\r\n </div>\r\n )}\r\n\r\n <div className=\"relative group\">\r\n <textarea\r\n ref={ref}\r\n required={required}\r\n aria-invalid={!!error}\r\n onFocus={() => setIsFocused(true)}\r\n onBlur={() => setIsFocused(false)}\r\n className={cn(\r\n \"w-full rounded-lg transition-all duration-200 ease-soft resize-y\",\r\n \"text-foreground placeholder:text-muted-foreground\",\r\n \"focus:outline-none shadow-sm focus:shadow-md\",\r\n \"backdrop-blur-sm\",\r\n sizeClasses[size],\r\n error \r\n ? \"border-destructive focus:ring-destructive/20 focus:border-destructive\" \r\n : variantClasses[variant],\r\n \"disabled:cursor-not-allowed disabled:opacity-50\",\r\n className\r\n )}\r\n {...rest}\r\n />\r\n \r\n {/* Focus indicator line */}\r\n {variant === \"default\" && (\r\n <div className={cn(\r\n \"absolute bottom-0 left-0 h-0.5 bg-linear-to-r from-primary to-primary/60 transition-all duration-300 ease-soft\",\r\n isFocused ? \"w-full opacity-100\" : \"w-0 opacity-0\"\r\n )} />\r\n )}\r\n \r\n {/* Focus glow effect */}\r\n {isFocused && variant !== \"outlined\" && (\r\n <div className=\"absolute inset-0 rounded-lg bg-primary/5 -z-10 animate-pulse\" />\r\n )}\r\n </div>\r\n\r\n {description && (\r\n <p className={cn(\r\n \"text-xs transition-colors duration-200\",\r\n isFocused ? \"text-primary/70\" : \"text-muted-foreground\",\r\n error && \"text-destructive/70\"\r\n )}>\r\n {description}\r\n </p>\r\n )}\r\n </div>\r\n );\r\n }\r\n);\r\n\r\nTextarea.displayName = \"Textarea\";\r\nexport default Textarea;","\"use client\";\r\n\r\nimport * as React from \"react\";\nimport { cn } from \"@/lib/utils/cn\";\n\r\ninterface SwitchProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size'> {\r\n checked: boolean;\r\n onCheckedChange: (checked: boolean) => void;\r\n label?: string;\r\n size?: \"sm\" | \"md\" | \"lg\";\r\n variant?: \"default\" | \"success\" | \"warning\" | \"danger\";\r\n disabled?: boolean;\r\n}\r\n\r\nexport const Switch: React.FC<SwitchProps> = ({\n checked,\n onCheckedChange,\n label,\n size = \"md\",\n variant = \"default\",\n disabled = false,\n className,\n ...props\n}) => {\n const [isPressed, setIsPressed] = React.useState(false);\n\r\n const sizeClasses = {\r\n sm: {\r\n track: \"w-8 h-4\",\r\n handle: \"w-3 h-3\",\r\n translate: \"translate-x-4\"\r\n },\r\n md: {\r\n track: \"w-11 h-6\", \r\n handle: \"w-5 h-5\",\r\n translate: \"translate-x-5\"\r\n },\r\n lg: {\r\n track: \"w-14 h-8\",\r\n handle: \"w-7 h-7\", \r\n translate: \"translate-x-6\"\r\n }\r\n };\r\n\r\n const variantClasses = {\n default: {\n active: \"bg-primary border-primary\",\n inactive: \"bg-input border-input\",\n },\n success: {\n active: \"bg-success border-success\",\n inactive: \"bg-input border-input\",\n },\n warning: {\n active: \"bg-warning border-warning\",\n inactive: \"bg-input border-input\",\n },\n danger: {\n active: \"bg-destructive border-destructive\",\n inactive: \"bg-input border-input\",\n },\n } as const;\n\r\n return (\r\n <label \r\n className={cn(\r\n \"inline-flex items-center gap-3 cursor-pointer select-none\",\r\n disabled && \"cursor-not-allowed opacity-50\",\r\n className\r\n )}\r\n >\r\n <div\n className={cn(\n \"relative inline-flex rounded-full align-middle\",\n sizeClasses[size].track,\n // Focus ring styled like shadcn (via peer-visible)\n \"peer-focus-visible:ring-2 peer-focus-visible:ring-ring peer-focus-visible:ring-offset-2 peer-focus-visible:ring-offset-background\",\n disabled && \"opacity-50\",\n )}\n >\n <input \n type=\"checkbox\" \n className=\"sr-only peer\"\n checked={checked} \n disabled={disabled}\n onChange={(e) => !disabled && onCheckedChange(e.target.checked)}\n {...props} \n />\n \n {/* Background track */}\n <div \n className={cn(\n \"block w-full h-full rounded-full transition-colors duration-200 ease-out border\",\n checked ? variantClasses[variant].active : variantClasses[variant].inactive\n )} \n />\n \n {/* Handle */}\n <div\n className={cn(\n \"absolute top-0.5 left-0.5 rounded-full transition-transform duration-200 ease-out shadow-sm\",\n sizeClasses[size].handle,\n \"bg-background border border-border\",\n checked ? sizeClasses[size].translate : \"translate-x-0\",\n !disabled && \"hover:scale-[1.02]\",\n isPressed && \"scale-95\",\n disabled && \"opacity-70\"\n )}\n onMouseDown={() => !disabled && setIsPressed(true)}\n onMouseUp={() => setIsPressed(false)}\n onMouseLeave={() => setIsPressed(false)}\n >\n {/* empty thumb */}\n </div>\n </div>\n \r\n {label && (\r\n <span\n className={cn(\n \"text-sm font-medium text-foreground transition-colors\",\n disabled && \"text-muted-foreground\"\n )}\n >\n {label}\n </span>\n )}\n </label>\n );\n};\n\r\nSwitch.displayName = \"Switch\";\r\nexport default Switch;\r\n","\"use client\"\r\n\r\nimport * as React from \"react\"\r\nimport { cva, type VariantProps } from \"class-variance-authority\"\r\n\r\nimport { cn } from \"@/lib/utils/cn\"\r\n\r\nconst labelVariants = cva(\r\n \"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\"\r\n)\r\n\r\nconst Label = React.forwardRef<\r\n HTMLLabelElement,\r\n React.LabelHTMLAttributes<HTMLLabelElement> &\r\n VariantProps<typeof labelVariants>\r\n>(({ className, ...props }, ref) => (\r\n <label\r\n ref={ref}\r\n className={cn(labelVariants(), className)}\r\n {...props}\r\n />\r\n))\r\nLabel.displayName = \"Label\"\r\n\r\nexport { Label }","\"use client\";\n\nimport Image, { ImageProps } from \"next/image\";\nimport React from \"react\";\nimport { cn } from \"@/lib/utils/cn\";\n\ntype Fit = \"cover\" | \"contain\";\n\ninterface SmartImageProps {\n src: string | undefined | null;\n alt: string;\n className?: string;\n /**\n * Aspect ratio utility class, e.g. `aspect-square`, `aspect-4/3`.\n * If provided with `fill`, the wrapper enforces the ratio.\n */\n ratioClass?: string;\n /**\n * Rounded corners; defaults to `rounded-lg` to match project style.\n */\n roundedClass?: string;\n /**\n * When true, uses fill layout; otherwise width/height if provided.\n */\n fill?: boolean;\n width?: number;\n height?: number;\n sizes?: string;\n priority?: boolean;\n quality?: number;\n fit?: Fit;\n /** Control object position, e.g. 'center', 'top', 'left', '50% 50%'. */\n objectPosition?: React.CSSProperties[\"objectPosition\"];\n /** Optional fallback src if original fails. */\n fallbackSrc?: string;\n}\n\nconst DEFAULT_FALLBACK = \"/images/products/hoa-hong-do.png\";\n\n// Cache các URL đã lỗi để không gọi lại nhiều lần\nconst FAILED_SRCS = new Set<string>();\n\nexport default function SmartImage({\n src,\n alt,\n className,\n ratioClass,\n roundedClass = \"rounded-lg\",\n fill = true,\n width,\n height,\n sizes = \"(max-width: 768px) 100vw, 33vw\",\n priority = false,\n quality = 80,\n fit = \"cover\",\n objectPosition,\n fallbackSrc = DEFAULT_FALLBACK,\n}: SmartImageProps) {\n const normalize = (input?: string | null) => {\n if (!input || input.length === 0) return fallbackSrc;\n const raw = input.trim();\n // Proactively convert local product JPGs -> PNG to avoid 404s\n if (raw.startsWith(\"/images/products/\") && /\\.(jpg|jpeg)($|\\?)/i.test(raw)) {\n return raw.replace(/\\.(jpg|jpeg)(?=$|\\?)/i, \".png\");\n }\n // Hỗ trợ protocol-relative //host/path -> https://host/path\n if (raw.startsWith(\"//\")) {\n return `https:${raw}`;\n }\n // Cho phép absolute http(s), data:, blob:\n if (/^(https?:|data:|blob:)/i.test(raw)) {\n return FAILED_SRCS.has(raw) ? fallbackSrc : raw;\n }\n // Cho phép path bắt đầu bằng /\n if (raw.startsWith(\"/\")) {\n return FAILED_SRCS.has(raw) ? fallbackSrc : raw;\n }\n // Các đường dẫn tương đối (vd: \"invalid-url.jpg\") -> thêm leading slash để tránh lỗi Next Image\n const normalized = `/${raw.replace(/^\\.\\/?/, \"\")}`;\n return FAILED_SRCS.has(normalized) ? fallbackSrc : normalized;\n };\n\n const [resolvedSrc, setResolvedSrc] = React.useState<string>(() => normalize(src));\n\n // Keep internal resolved source in sync when `src` prop changes\n React.useEffect(() => {\n setResolvedSrc(normalize(src));\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [src]);\n\n const handleError: NonNullable<ImageProps[\"onError\"]> = () => {\n // Ghi nhớ URL lỗi để lần sau bỏ qua\n if (resolvedSrc && resolvedSrc !== fallbackSrc) FAILED_SRCS.add(resolvedSrc);\n if (resolvedSrc.endsWith(\".jpg\")) {\n const next = resolvedSrc.replace(/\\.jpg($|\\?)/, \".png$1\");\n setResolvedSrc(next);\n } else if (resolvedSrc !== fallbackSrc) {\n setResolvedSrc(fallbackSrc);\n }\n };\n\n const Wrapper = ({ children }: { children: React.ReactNode }) => (\n <div\n className={cn(\n \"relative overflow-hidden bg-muted/30\",\n // remove any default focus outline/ring for visual consistency with Card\n \"outline-none focus:outline-none focus-visible:outline-none ring-0 focus:ring-0\",\n ratioClass,\n roundedClass,\n className\n )}\n >\n {children}\n </div>\n );\n\n if (fill) {\n return (\n <Wrapper>\n <Image\n src={resolvedSrc}\n alt={alt}\n fill\n sizes={sizes}\n onError={handleError}\n priority={priority}\n quality={quality}\n style={{ objectFit: fit, objectPosition }}\n />\n </Wrapper>\n );\n }\n\n return (\n <div\n className={cn(\n \"relative overflow-hidden bg-muted/30\",\n \"outline-none focus:outline-none focus-visible:outline-none ring-0 focus:ring-0\",\n roundedClass,\n className\n )}\n >\n <Image\n src={resolvedSrc}\n alt={alt}\n width={width}\n height={height}\n sizes={sizes}\n onError={handleError}\n priority={priority}\n quality={quality}\n style={{ objectFit: fit, objectPosition, width: \"100%\", height: \"100%\" }}\n />\n </div>\n );\n}\n","import * as React from \"react\";\nimport { cn } from \"@/lib/utils/cn\";\nimport SmartImage from \"@/components/ui/SmartImage\";\n\r\ninterface AvatarProps extends React.HTMLAttributes<HTMLDivElement> {\r\n src?: string;\r\n alt?: string;\r\n fallback?: string;\r\n size?: \"sm\" | \"md\" | \"lg\";\r\n onClick?: () => void; // 👈 thêm onClick rõ ràng\r\n}\r\n\r\nconst sizeClasses: Record<NonNullable<AvatarProps[\"size\"]>, string> = {\r\n sm: \"h-8 w-8 text-sm\",\r\n md: \"h-10 w-10 text-base\",\r\n lg: \"h-14 w-14 text-lg\",\r\n};\r\n\r\nexport const Avatar = ({ src, alt = \"avatar\", fallback = \"?\", size = \"md\", className, onClick, ...props }: AvatarProps) => {\n // Check if src is valid (not empty string, null, or undefined)\n const hasValidSrc = !!(src && src.trim().length > 0);\n\r\n return (\r\n <div\r\n className={cn(\r\n \"relative inline-flex items-center justify-center overflow-hidden rounded-full bg-muted text-foreground select-none transition-all duration-200 ease-soft\",\r\n onClick && \"cursor-pointer hover:ring-2 hover:ring-primary/50 hover:ring-offset-2 hover:shadow-lg active:scale-95\",\r\n sizeClasses[size],\r\n className\r\n )}\r\n onClick={onClick}\r\n {...props}\r\n >\r\n {hasValidSrc && (\n <div className=\"absolute inset-0\">\n <SmartImage\n src={src!}\n alt={alt}\n fill\n // match container size instead of using aspect ratio padding\n ratioClass={undefined}\n className=\"h-full w-full\"\n roundedClass=\"rounded-full\"\n fit=\"cover\"\n objectPosition=\"center\"\n quality={80}\n />\n </div>\n )}\n\r\n {/* Fallback text with better styling */}\r\n {!hasValidSrc && (\n <span\n className={cn(\n \"font-bold uppercase bg-linear-to-br from-primary to-primary/80 bg-clip-text text-transparent\",\n \"transition-all duration-200 animate-fade-in\"\n )}\n >\n {fallback}\n </span>\n )}\n\r\n {/* Online indicator (optional) */}\r\n <div className=\"absolute bottom-0 right-0 w-3 h-3 bg-success border-2 border-background rounded-full opacity-0 group-hover:opacity-100 transition-opacity duration-200\" />\n </div>\r\n );\r\n};\r\n\r\nexport default Avatar;\r\n","import React from \"react\";\r\nimport { cn } from \"@/lib/utils/cn\";\r\n\r\ninterface SkeletonProps {\r\n className?: string;\r\n width?: string | number;\r\n height?: string | number;\r\n variant?: \"rectangular\" | \"circular\" | \"rounded\" | \"text\";\r\n animation?: \"pulse\" | \"wave\" | \"none\";\r\n lines?: number;\r\n}\r\n\r\nexport const Skeleton: React.FC<SkeletonProps> = ({\r\n className,\r\n width,\r\n height,\r\n variant = \"rectangular\",\r\n animation = \"pulse\",\r\n lines = 1\r\n}) => {\r\n const variantClasses = {\r\n rectangular: \"rounded-md\",\r\n circular: \"rounded-full\",\r\n rounded: \"rounded-lg\", \r\n text: \"rounded\"\r\n };\r\n\r\n const animationClasses = {\r\n pulse: \"animate-pulse\",\r\n wave: \"animate-shimmer bg-linear-to-r from-muted via-muted/50 to-muted bg-size-[200%_100%]\",\r\n none: \"\"\r\n };\r\n\r\n if (variant === \"text\" && lines > 1) {\r\n return (\r\n <div className={cn(\"space-y-2\", className)}>\r\n {Array.from({ length: lines }).map((_, index) => (\r\n <div\r\n key={index}\r\n className={cn(\r\n \"h-4 bg-muted\",\r\n variantClasses[variant],\r\n animationClasses[animation],\r\n index === lines - 1 && \"w-3/4\" // Last line is shorter\r\n )}\r\n style={{\r\n width: index === lines - 1 ? undefined : width,\r\n height: height\r\n }}\r\n />\r\n ))}\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div\r\n className={cn(\r\n \"bg-muted\",\r\n variantClasses[variant],\r\n animationClasses[animation],\r\n className\r\n )}\r\n style={{ width, height }}\r\n />\r\n );\r\n};\r\n\r\n// Pre-built skeleton components for common use cases\r\nexport const SkeletonAvatar: React.FC<{ size?: \"sm\" | \"md\" | \"lg\"; className?: string }> = ({ \r\n size = \"md\", \r\n className \r\n}) => {\r\n const sizeClasses = {\r\n sm: \"w-8 h-8\",\r\n md: \"w-10 h-10\",\r\n lg: \"w-12 h-12\"\r\n };\r\n\r\n return (\r\n <Skeleton\r\n variant=\"circular\"\r\n className={cn(sizeClasses[size], className)}\r\n />\r\n );\r\n};\r\n\r\nexport const SkeletonButton: React.FC<{ size?: \"sm\" | \"md\" | \"lg\"; className?: string }> = ({ \r\n size = \"md\", \r\n className \r\n}) => {\r\n const sizeClasses = {\r\n sm: \"h-8 w-20\",\r\n md: \"h-10 w-24\",\r\n lg: \"h-12 w-28\"\r\n };\r\n\r\n return (\r\n <Skeleton\r\n variant=\"rounded\"\r\n className={cn(sizeClasses[size], className)}\r\n />\r\n );\r\n};\r\n\r\nexport const SkeletonText: React.FC<{ \r\n lines?: number; \r\n className?: string;\r\n width?: string;\r\n}> = ({ \r\n lines = 3, \r\n className,\r\n width = \"100%\"\r\n}) => {\r\n return (\r\n <Skeleton\r\n variant=\"text\"\r\n lines={lines}\r\n width={width}\r\n className={className}\r\n />\r\n );\r\n};\r\n\r\n// Complex skeleton layouts\nexport const SkeletonCard: React.FC<{ \n showAvatar?: boolean;\n showImage?: boolean;\n textLines?: number;\n className?: string;\n children?: React.ReactNode;\n}> = ({ \n showAvatar = true,\n showImage = false, \n textLines = 3,\n className,\n children\n}) => {\n if (children) {\n return (\n <div className={cn(\"p-4 space-y-4 rounded-lg bg-card outline-none focus:outline-none\", className)}>\n {children}\n </div>\n );\n }\n\n return (\n <div className={cn(\"p-4 space-y-4 rounded-lg bg-card outline-none focus:outline-none\", className)}>\n {/* Header with avatar */}\n {showAvatar && (\n <div className=\"flex items-center space-x-3\">\n <SkeletonAvatar />\n <div className=\"space-y-2\">\n <Skeleton className=\"h-4 w-24\" />\n <Skeleton className=\"h-3 w-16\" />\n </div>\n </div>\n )}\n\n {/* Image */}\n {showImage && (\n <Skeleton className=\"h-48 w-full rounded-md\" />\n )}\n\n {/* Text content */}\n <SkeletonText lines={textLines} />\n\n {/* Actions */}\n <div className=\"flex space-x-2\">\n <SkeletonButton size=\"sm\" />\n <SkeletonButton size=\"sm\" />\n </div>\n </div>\n );\n};\n\r\nexport const SkeletonPost: React.FC<{ className?: string }> = ({ className }) => {\n return (\n <div className={cn(\"p-6 space-y-4 rounded-xl bg-card outline-none focus:outline-none\", className)}>\n {/* Post header */}\r\n <div className=\"flex items-center space-x-3\">\r\n <SkeletonAvatar size=\"lg\" />\r\n <div className=\"space-y-2\">\r\n <Skeleton className=\"h-4 w-32\" />\r\n <Skeleton className=\"h-3 w-20\" />\r\n </div>\r\n </div>\r\n\r\n {/* Post content */}\r\n <SkeletonText lines={2} />\r\n\r\n {/* Post image */}\r\n <Skeleton className=\"h-64 w-full rounded-lg\" />\r\n\r\n {/* Post stats */}\r\n <div className=\"flex items-center space-x-4\">\r\n <Skeleton className=\"h-3 w-16\" />\r\n <Skeleton className=\"h-3 w-20\" />\r\n <Skeleton className=\"h-3 w-12\" />\r\n </div>\r\n\r\n {/* Post actions */}\r\n <div className=\"flex items-center justify-between pt-2\">\n <div className=\"flex space-x-4\">\n <Skeleton className=\"h-8 w-16\" />\n <Skeleton className=\"h-8 w-20\" />\n <Skeleton className=\"h-8 w-16\" />\n </div>\n </div>\n </div>\n );\n};\n\r\nexport const SkeletonMessage: React.FC<{ \r\n own?: boolean; \r\n showAvatar?: boolean;\r\n className?: string;\r\n}> = ({ \r\n own = false, \r\n showAvatar = true,\r\n className \r\n}) => {\r\n return (\r\n <div className={cn(\r\n \"flex items-end space-x-2\",\r\n own && \"flex-row-reverse space-x-reverse\",\r\n className\r\n )}>\r\n {showAvatar && !own && <SkeletonAvatar size=\"sm\" />}\r\n <div className={cn(\r\n \"max-w-xs space-y-1\",\r\n own ? \"items-end\" : \"items-start\"\r\n )}>\r\n <Skeleton className={cn(\r\n \"h-10 rounded-2xl\",\r\n own ? \"w-32 bg-primary/20\" : \"w-40 bg-muted\"\r\n )} />\r\n <Skeleton className=\"h-3 w-12\" />\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nexport const SkeletonList: React.FC<{ \r\n items?: number;\r\n itemHeight?: number;\r\n showAvatar?: boolean;\r\n className?: string;\r\n}> = ({ \r\n items = 5, \r\n itemHeight = 60,\r\n showAvatar = true,\r\n className \r\n}) => {\r\n return (\r\n <div className={cn(\"space-y-3\", className)}>\r\n {Array.from({ length: items }).map((_, index) => (\r\n <div key={index} className=\"flex items-center space-x-3 p-3 rounded-lg\">\r\n {showAvatar && <SkeletonAvatar />}\r\n <div className=\"flex-1 space-y-2\">\r\n <Skeleton className=\"h-4 w-3/4\" />\r\n <Skeleton className=\"h-3 w-1/2\" />\r\n </div>\r\n <Skeleton className=\"h-6 w-16\" />\r\n </div>\r\n ))}\r\n </div>\r\n );\r\n};\r\n\r\nexport const SkeletonTable: React.FC<{ \r\n rows?: number;\r\n columns?: number;\r\n className?: string;\r\n}> = ({ \r\n rows = 5, \r\n columns = 4,\r\n className \r\n}) => {\r\n return (\n <div className={cn(\"space-y-3\", className)}>\n {/* Header */}\n <div className=\"flex space-x-4 p-3\">\n {Array.from({ length: columns }).map((_, index) => (\n <Skeleton key={index} className=\"h-4 flex-1\" />\n ))}\n </div>\n \r\n {/* Rows */}\r\n {Array.from({ length: rows }).map((_, rowIndex) => (\r\n <div key={rowIndex} className=\"flex space-x-4 p-3\">\r\n {Array.from({ length: columns }).map((_, colIndex) => (\r\n <Skeleton key={colIndex} className=\"h-4 flex-1\" />\r\n ))}\r\n </div>\r\n ))}\r\n </div>\r\n );\r\n};\r\n\r\nexport default Skeleton;\n","import React from \"react\";\r\nimport { cn } from \"@/lib/utils/cn\";\r\nimport { Check, X, Clock, AlertTriangle } from \"lucide-react\";\r\n\r\ninterface ProgressProps {\r\n value: number;\r\n max?: number;\r\n className?: string;\r\n variant?: \"default\" | \"primary\" | \"success\" | \"warning\" | \"danger\" | \"info\";\r\n size?: \"sm\" | \"md\" | \"lg\" | \"xl\";\r\n showValue?: boolean;\r\n label?: string;\r\n animated?: boolean;\r\n striped?: boolean;\r\n indeterminate?: boolean;\r\n description?: string;\r\n status?: \"normal\" | \"error\" | \"complete\";\r\n}\r\n\r\nconst variantStyles = {\r\n default: \"bg-muted-foreground\",\r\n primary: \"bg-linear-to-r from-primary via-primary/90 to-primary\",\r\n success: \"bg-linear-to-r from-success via-success/90 to-success shadow-sm shadow-success/20\", \r\n warning: \"bg-linear-to-r from-warning via-warning/90 to-warning shadow-sm shadow-warning/20\",\r\n danger: \"bg-linear-to-r from-destructive via-destructive/90 to-destructive shadow-sm shadow-destructive/20\",\r\n info: \"bg-linear-to-r from-info via-info/90 to-info shadow-sm shadow-info/20\"\r\n};\r\n\r\nconst sizeStyles = {\r\n sm: \"h-1.5\",\r\n md: \"h-2.5\",\r\n lg: \"h-3.5\",\r\n xl: \"h-4\"\r\n};\r\n\r\nexport const Progress: React.FC<ProgressProps> = ({\n value,\r\n max = 100,\r\n className,\r\n variant = \"primary\",\r\n size = \"md\",\r\n showValue = false,\r\n label,\r\n animated = false,\r\n striped = false,\r\n indeterminate = false,\r\n description,\r\n status = \"normal\"\r\n}) => {\n const percentage = Math.min(Math.max((value / max) * 100, 0), 100);\n const isComplete = status === \"complete\" || percentage >= 100;\n const isError = status === \"error\";\n const labelId = React.useId();\n const descId = React.useId();\n\r\n // Status icon\r\n const getStatusIcon = () => {\r\n if (isComplete) return <Check className=\"w-4 h-4 text-success\" />;\r\n if (isError) return <X className=\"w-4 h-4 text-destructive\" />;\r\n if (animated || indeterminate) return <Clock className=\"w-4 h-4 text-muted-foreground animate-spin\" />;\r\n return null;\r\n };\r\n\r\n return (\r\n <div className={cn(\"w-full space-y-3\", className)}>\r\n {/* Header */}\r\n {(label || showValue || description) && (\r\n <div className=\"space-y-1\">\r\n <div className=\"flex justify-between items-center\">\r\n <div className=\"flex items-center gap-2\">\n {label && <span id={labelId} className=\"font-medium text-foreground\">{label}</span>}\n {getStatusIcon()}\n </div>\n {showValue && !indeterminate && (\r\n <span className={cn(\r\n \"text-sm font-medium\",\r\n isComplete ? \"text-success\" : isError ? \"text-destructive\" : \"text-muted-foreground\"\r\n )}>\r\n {isComplete ? \"Complete\" : isError ? \"Error\" : `${Math.round(percentage)}%`}\r\n </span>\r\n )}\r\n </div>\r\n {description && (\n <p id={descId} className=\"text-sm text-muted-foreground\">{description}</p>\n )}\n </div>\n )}\n \r\n {/* Progress Bar */}\r\n <div\n role=\"progressbar\"\n aria-valuemin={0}\n aria-valuemax={indeterminate ? undefined : max}\n aria-valuenow={indeterminate ? undefined : Math.round(percentage)}\n aria-labelledby={label ? labelId : undefined}\n aria-describedby={description ? descId : undefined}\n className={cn(\n \"w-full bg-muted/50 rounded-full overflow-hidden backdrop-blur-sm\",\n \"border border-border/50\",\n sizeStyles[size]\n )}\n >\n <div\r\n className={cn(\r\n \"h-full transition-all duration-700 ease-out rounded-full relative\",\r\n \"before:absolute before:inset-0 before:rounded-full before:opacity-30\",\r\n indeterminate && \"animate-pulse\",\r\n !indeterminate && variantStyles[variant],\r\n isComplete && \"bg-linear-to-r from-success via-success/90 to-success shadow-sm shadow-success/20\",\r\n isError && \"bg-linear-to-r from-destructive via-destructive/90 to-destructive shadow-sm shadow-destructive/20\",\r\n striped && \"bg-linear-to-r from-transparent via-primary-foreground/20 to-transparent bg-size-[1rem_1rem]\",\r\n animated && !indeterminate && \"before:animate-pulse\",\r\n // Shimmer effect for indeterminate\r\n indeterminate && \"bg-linear-to-r from-muted via-primary/50 to-muted bg-size-[200%_100%] animate-[shimmer_2s_infinite]\"\r\n )}\r\n style={{ \r\n width: indeterminate ? \"100%\" : `${percentage}%`,\r\n backgroundImage: striped ? \"linear-gradient(45deg, hsl(var(--foreground) / 0.15) 25%, transparent 25%, transparent 50%, hsl(var(--foreground) / 0.15) 50%, hsl(var(--foreground) / 0.15) 75%, transparent 75%, transparent)\" : undefined\r\n }}\r\n />\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\n// Circular Progress Component\r\ninterface CircularProgressProps {\r\n value: number;\r\n max?: number;\r\n size?: number;\r\n strokeWidth?: number;\r\n className?: string;\r\n variant?: \"default\" | \"primary\" | \"success\" | \"warning\" | \"danger\" | \"info\";\r\n showValue?: boolean;\r\n children?: React.ReactNode;\r\n indeterminate?: boolean;\r\n status?: \"normal\" | \"error\" | \"complete\";\r\n trackColor?: string;\r\n}\r\n\r\nexport const CircularProgress: React.FC<CircularProgressProps> = ({\n value,\r\n max = 100,\r\n size = 64,\r\n strokeWidth = 4,\r\n className,\r\n variant = \"primary\",\r\n showValue = false,\r\n children,\r\n indeterminate = false,\r\n status = \"normal\",\r\n trackColor = \"stroke-muted/20\"\r\n}) => {\n const percentage = Math.min(Math.max((value / max) * 100, 0), 100);\r\n const radius = (size - strokeWidth) / 2;\r\n const circumference = radius * Math.PI * 2;\r\n const offset = circumference - (percentage / 100) * circumference;\r\n const isComplete = status === \"complete\" || percentage >= 100;\r\n const isError = status === \"error\";\r\n\r\n const variantColors = {\r\n default: \"stroke-muted-foreground\",\r\n primary: \"stroke-primary\",\r\n success: \"stroke-success\",\r\n warning: \"stroke-warning\", \r\n danger: \"stroke-destructive\",\r\n info: \"stroke-info\"\r\n };\r\n\r\n const getContentIcon = () => {\r\n if (isComplete) return <Check className=\"w-5 h-5 text-success\" />;\r\n if (isError) return <X className=\"w-5 h-5 text-destructive\" />;\r\n return null;\r\n };\r\n\r\n return (\n <div\n className={cn(\"relative inline-flex items-center justify-center\", className)}\n role=\"progressbar\"\n aria-valuemin={0}\n aria-valuemax={indeterminate ? undefined : max}\n aria-valuenow={indeterminate ? undefined : Math.round(percentage)}\n aria-label={children ? undefined : \"Progress\"}\n >\n <svg\r\n width={size}\r\n height={size}\r\n className={cn(\r\n \"transform -rotate-90\",\r\n indeterminate && \"animate-spin\"\r\n )}\r\n style={{ animationDuration: indeterminate ? \"2s\" : undefined }}\r\n >\r\n {/* Background circle */}\r\n <circle\r\n cx={size / 2}\r\n cy={size / 2}\r\n r={radius}\r\n stroke=\"currentColor\"\r\n strokeWidth={strokeWidth}\r\n fill=\"transparent\"\r\n className={trackColor}\r\n />\r\n \r\n {/* Progress circle */}\r\n <circle\r\n cx={size / 2}\r\n cy={size / 2}\r\n r={radius}\r\n strokeWidth={strokeWidth}\r\n fill=\"transparent\"\r\n strokeDasharray={circumference}\r\n strokeDashoffset={indeterminate ? circumference * 0.25 : offset}\r\n className={cn(\r\n \"transition-all duration-700 ease-out\",\r\n isComplete ? \"stroke-success\" : isError ? \"stroke-destructive\" : variantColors[variant],\r\n \"drop-shadow-sm\"\r\n )}\r\n strokeLinecap=\"round\"\r\n style={{\r\n filter: `drop-shadow(0 0 4px ${\r\n isComplete ? \"hsl(var(--success) / 0.3)\" : \r\n isError ? \"hsl(var(--destructive) / 0.3)\" : \r\n \"hsl(var(--primary) / 0.2)\"\r\n })`\r\n }}\r\n />\r\n </svg>\r\n \r\n {/* Content */}\r\n <div className=\"absolute inset-0 flex flex-col items-center justify-center text-center\">\r\n {children ? children : (\r\n <>\r\n {getContentIcon()}\r\n {showValue && !indeterminate && (\r\n <span className={cn(\r\n \"text-sm font-semibold\",\r\n isComplete ? \"text-success\" : isError ? \"text-destructive\" : \"text-foreground\"\r\n )}>\r\n {isComplete ? \"✓\" : isError ? \"✗\" : `${Math.round(percentage)}%`}\r\n </span>\r\n )}\r\n {indeterminate && (\r\n <Clock className=\"w-4 h-4 text-muted-foreground animate-pulse\" />\r\n )}\r\n </>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\n// Multi-step Progress Component\r\ninterface StepProgressProps {\r\n steps: string[];\r\n currentStep: number;\r\n className?: string;\r\n variant?: \"default\" | \"primary\" | \"success\" | \"warning\" | \"danger\" | \"info\";\r\n size?: \"sm\" | \"md\" | \"lg\";\r\n}\r\n\r\nexport const StepProgress: React.FC<StepProgressProps> = ({\n steps,\r\n currentStep,\r\n className,\r\n variant = \"primary\",\r\n size = \"md\"\r\n}) => {\r\n const stepSizes = {\r\n sm: \"w-6 h-6 text-xs\",\r\n md: \"w-8 h-8 text-sm\", \r\n lg: \"w-10 h-10 text-base\"\r\n };\r\n\r\n const getStepStatus = (stepIndex: number) => {\r\n if (stepIndex < currentStep) return \"completed\";\r\n if (stepIndex === currentStep) return \"current\";\r\n return \"upcoming\";\r\n };\r\n\r\n return (\n <div className={cn(\"w-full\", className)} role=\"list\" aria-label=\"Progress steps\">\n <div className=\"flex items-center justify-between\">\n {steps.map((step, index) => {\n const status = getStepStatus(index);\n \n return (\n <div key={step} className=\"flex items-center\" role=\"listitem\" aria-current={status === \"current\" ? \"step\" : undefined}>\n {/* Step Circle */}\n <div\n className={cn(\n \"rounded-full border-2 flex items-center justify-center font-medium transition-all duration-300\",\n \"shadow-sm hover:shadow-md\",\n stepSizes[size],\n status === \"completed\" && [\n \"border-success bg-success text-success-foreground\",\n \"shadow-success/20\"\n ],\n status === \"current\" && [\n \"border-primary bg-primary/10 text-primary\",\n \"ring-2 ring-primary/20 ring-offset-2\",\n \"shadow-primary/20\"\n ],\n status === \"upcoming\" && [\n \"border-muted-foreground/30 text-muted-foreground bg-background\",\n \"hover:border-muted-foreground/50\"\n ]\n )}\n >\n {status === \"completed\" ? <Check className=\"w-3 h-3\" /> : index + 1}\n </div>\n \n {/* Step Label */}\n <span\n className={cn(\n \"ml-2 text-sm font-medium transition-colors duration-200\",\n status === \"completed\" && variantStyles[variant].replace(\"bg-\", \"text-\"),\n status === \"current\" && \"text-foreground\",\n status === \"upcoming\" && \"text-muted-foreground\"\n )}\n >\n {step}\n </span>\n \r\n {/* Connector Line */}\r\n {index < steps.length - 1 && (\r\n <div\r\n className={cn(\r\n \"flex-1 h-0.5 mx-4 transition-colors duration-200\",\r\n index < currentStep ? variantStyles[variant] : \"bg-muted\"\r\n )}\r\n />\r\n )}\r\n </div>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\n// Mini Progress - compact version for tight spaces\r\ninterface MiniProgressProps {\r\n value: number;\r\n max?: number;\r\n className?: string;\r\n variant?: \"default\" | \"primary\" | \"success\" | \"warning\" | \"danger\" | \"info\";\r\n showValue?: boolean;\r\n}\r\n\r\nexport const MiniProgress: React.FC<MiniProgressProps> = ({\n value,\r\n max = 100,\r\n className,\r\n variant = \"primary\",\r\n showValue = false\r\n}) => {\n const percentage = Math.min(Math.max((value / max) * 100, 0), 100);\n\n return (\n <div className={cn(\"flex items-center gap-2\", className)}>\n <div\n className=\"flex-1 h-1.5 bg-muted/50 rounded-full overflow-hidden\"\n role=\"progressbar\"\n aria-valuemin={0}\n aria-valuemax={max}\n aria-valuenow={Math.round(percentage)}\n >\n <div\n className={cn(\n \"h-full transition-all duration-500 ease-out rounded-full\",\n variantStyles[variant]\n )}\n style={{ width: `${percentage}%` }}\n />\n </div>\n {showValue && (\r\n <span className=\"text-xs font-medium text-muted-foreground min-w-10 text-right\">\r\n {Math.round(percentage)}%\r\n </span>\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\n// Battery Progress - for battery/power indicators\r\ninterface BatteryProgressProps {\r\n value: number;\r\n max?: number;\r\n className?: string;\r\n charging?: boolean;\r\n showValue?: boolean;\r\n}\r\n\r\nexport const BatteryProgress: React.FC<BatteryProgressProps> = ({\n value,\r\n max = 100,\r\n className,\r\n charging = false,\r\n showValue = false\r\n}) => {\n const percentage = Math.min(Math.max((value / max) * 100, 0), 100);\n const getVariant = () => {\n if (charging) return \"info\";\r\n if (percentage <= 20) return \"danger\";\r\n if (percentage <= 50) return \"warning\";\r\n return \"success\";\r\n };\r\n\r\n return (\n <div className={cn(\"flex items-center gap-2\", className)}>\n <div className=\"relative\" role=\"progressbar\" aria-label=\"Battery level\" aria-valuemin={0} aria-valuemax={max} aria-valuenow={Math.round(percentage)}>\n {/* Battery outline */}\n <div className=\"w-6 h-3 border-2 border-foreground/20 rounded-sm relative\">\n <div className=\"absolute -right-1 top-0.5 w-0.5 h-1 bg-foreground/20 rounded-r-sm\" />\r\n {/* Battery fill */}\r\n <div\r\n className={cn(\r\n \"h-full transition-all duration-500 ease-out rounded-sm\",\r\n variantStyles[getVariant()],\r\n charging && \"animate-pulse\"\r\n )}\r\n style={{ width: `${percentage}%` }}\r\n />\r\n </div>\r\n {charging && (\r\n <div className=\"absolute inset-0 flex items-center justify-center\">\r\n <div className=\"w-2 h-2 text-info-foreground\">⚡</div>\r\n </div>\r\n )}\r\n </div>\r\n {showValue && (\r\n <span className={cn(\r\n \"text-xs font-medium\",\r\n percentage <= 20 ? \"text-destructive\" : \"text-muted-foreground\"\r\n )}>\r\n {Math.round(percentage)}%\r\n </span>\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\n// Segmented Progress - for multi-segment indicators\r\ninterface SegmentedProgressProps {\r\n segments: number;\r\n activeSegments: number;\r\n className?: string;\r\n variant?: \"default\" | \"primary\" | \"success\" | \"warning\" | \"danger\" | \"info\";\r\n size?: \"sm\" | \"md\" | \"lg\";\r\n}\r\n\r\nexport const SegmentedProgress: React.FC<SegmentedProgressProps> = ({\n segments,\r\n activeSegments,\r\n className,\r\n variant = \"primary\",\r\n size = \"md\"\r\n}) => {\n const segmentSizes = {\r\n sm: \"h-1\",\r\n md: \"h-2\", \r\n lg: \"h-3\"\r\n };\r\n\r\n return (\n <div\n className={cn(\"flex gap-1\", className)}\n role=\"progressbar\"\n aria-valuemin={0}\n aria-valuemax={segments}\n aria-valuenow={activeSegments}\n >\n {Array.from({ length: segments }, (_, index) => (\r\n <div\r\n key={index}\r\n className={cn(\r\n \"flex-1 rounded-full transition-all duration-300\",\r\n segmentSizes[size],\r\n index < activeSegments \r\n ? variantStyles[variant]\r\n : \"bg-muted/50\"\r\n )}\r\n />\r\n ))}\r\n </div>\r\n );\r\n};\r\n\r\n// Loading Progress - for file uploads, downloads etc\r\ninterface LoadingProgressProps {\r\n value: number;\r\n max?: number;\r\n className?: string;\r\n variant?: \"default\" | \"primary\" | \"success\" | \"warning\" | \"danger\" | \"info\";\r\n label?: string;\r\n status?: \"loading\" | \"complete\" | \"error\" | \"paused\";\r\n speed?: string;\r\n timeRemaining?: string;\r\n}\r\n\r\nexport const LoadingProgress: React.FC<LoadingProgressProps> = ({\n value,\r\n max = 100,\r\n className,\r\n variant = \"primary\",\r\n label,\r\n status = \"loading\",\r\n speed,\r\n timeRemaining\r\n}) => {\n const percentage = Math.min(Math.max((value / max) * 100, 0), 100);\n \n const getStatusIcon = () => {\n switch (status) {\r\n case \"complete\": return <Check className=\"w-4 h-4 text-success\" />;\r\n case \"error\": return <X className=\"w-4 h-4 text-destructive\" />;\r\n case \"paused\": return <Clock className=\"w-4 h-4 text-warning\" />;\r\n default: return <div className=\"w-2 h-2 bg-primary rounded-full animate-bounce\" />;\r\n }\r\n };\r\n\r\n const getStatusColor = () => {\r\n switch (status) {\r\n case \"complete\": return \"success\";\r\n case \"error\": return \"danger\";\r\n case \"paused\": return \"warning\";\r\n default: return variant;\r\n }\r\n };\r\n\r\n return (\n <div className={cn(\"w-full space-y-2\", className)}>\n {/* Header */}\n <div className=\"flex items-center justify-between text-sm\">\n <div className=\"flex items-center gap-2\">\n {getStatusIcon()}\n {label && <span className=\"font-medium text-foreground\">{label}</span>}\n </div>\n <span className=\"text-muted-foreground\">\n {status === \"complete\" ? \"Complete\" : `${Math.round(percentage)}%`}\n </span>\n </div>\n\n {/* Progress Bar */}\n <div\n className=\"w-full h-2 bg-muted/50 rounded-full overflow-hidden\"\n role=\"progressbar\"\n aria-valuemin={0}\n aria-valuemax={max}\n aria-valuenow={Math.round(percentage)}\n aria-label={label || \"Loading progress\"}\n >\n <div\n className={cn(\n \"h-full transition-all duration-300 ease-out rounded-full\",\n variantStyles[getStatusColor()],\n status === \"loading\" && \"animate-pulse\"\n )}\n style={{ width: `${percentage}%` }}\n />\n </div>\n\r\n {/* Footer */}\r\n {(speed || timeRemaining) && (\r\n <div className=\"flex justify-between text-xs text-muted-foreground\">\r\n {speed && <span>{speed}</span>}\r\n {timeRemaining && <span>{timeRemaining}</span>}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\nexport default Progress;\n","\"use client\";\r\n\r\nimport * as React from \"react\";\r\nimport { createPortal } from \"react-dom\";\r\nimport { cn } from \"@/lib/utils/cn\";\r\nimport { X } from \"lucide-react\";\r\n\r\ninterface ModalProps {\r\n isOpen: boolean;\r\n onClose: () => void;\r\n children: React.ReactNode;\r\n title?: string;\r\n description?: string;\r\n className?: string;\r\n contentClassName?: string;\r\n overlayClassName?: string;\r\n showCloseButton?: boolean;\r\n closeOnOverlayClick?: boolean;\r\n closeOnEsc?: boolean;\r\n size?: \"sm\" | \"md\" | \"lg\" | \"xl\" | \"full\";\r\n noPadding?: boolean;\r\n fullWidth?: boolean;\r\n width?: string | number;\r\n height?: string | number;\r\n}\r\n\r\nconst sizeStyles = {\r\n sm: \"max-w-sm\",\r\n md: \"max-w-md\",\r\n lg: \"max-w-lg\",\r\n xl: \"max-w-xl\",\r\n full: \"max-w-full\",\r\n};\r\n\r\nconst Modal: React.FC<ModalProps> = ({\r\n isOpen,\r\n onClose,\r\n children,\r\n title,\r\n description,\r\n className,\r\n contentClassName,\r\n overlayClassName,\r\n showCloseButton = true,\r\n closeOnOverlayClick = true,\r\n closeOnEsc = true,\r\n size = \"md\",\r\n noPadding = false,\r\n fullWidth = false,\r\n width,\r\n height,\r\n}) => {\r\n const [isMounted, setIsMounted] = React.useState(false);\r\n const [isVisible, setIsVisible] = React.useState(false);\r\n const [isAnimating, setIsAnimating] = React.useState(true);\r\n // Track if mousedown started outside modal content\r\n const mouseDownTarget = React.useRef<EventTarget | null>(null);\r\n const modalContentRef = React.useRef<HTMLDivElement>(null);\r\n\r\n React.useEffect(() => {\r\n setIsMounted(true);\r\n return () => setIsMounted(false);\r\n }, []);\r\n\r\n // Animation handling\r\n React.useEffect(() => {\r\n if (isOpen) {\r\n setIsVisible(true);\r\n setIsAnimating(true);\r\n // Start animation on next frame\r\n requestAnimationFrame(() => {\r\n setIsAnimating(false);\r\n });\r\n } else if (isVisible) {\r\n setIsAnimating(true);\r\n // Hide after animation completes\r\n const hideTimer = setTimeout(() => {\r\n setIsVisible(false);\r\n }, 200);\r\n return () => clearTimeout(hideTimer);\r\n }\r\n }, [isOpen, isVisible]);\r\n\r\n // Handle escape key\r\n React.useEffect(() => {\r\n if (!isOpen || !closeOnEsc) return;\r\n\r\n const handleEscape = (event: KeyboardEvent) => {\r\n if (event.key === \"Escape\") {\r\n onClose();\r\n }\r\n };\r\n\r\n document.addEventListener(\"keydown\", handleEscape);\r\n return () => document.removeEventListener(\"keydown\", handleEscape);\r\n }, [isOpen, closeOnEsc, onClose]);\r\n\r\n // Prevent body scroll when modal is open\r\n React.useEffect(() => {\r\n if (isOpen) {\r\n document.body.style.overflow = \"hidden\";\r\n } else {\r\n document.body.style.overflow = \"unset\";\r\n }\r\n\r\n return () => {\r\n document.body.style.overflow = \"unset\";\r\n };\r\n }, [isOpen]);\r\n\r\n // Check if an element is inside a portal (datepicker, popover, dropdown, etc.)\r\n const isInsidePortal = (element: Node | null): boolean => {\r\n if (!element) return false;\r\n let current = element as HTMLElement | null;\r\n while (current) {\r\n // Check for common portal indicators (data attributes, z-index patterns)\r\n if (\r\n current.hasAttribute?.(\"data-datepicker\") ||\r\n current.hasAttribute?.(\"data-popover\") ||\r\n current.hasAttribute?.(\"data-dropdown\") ||\r\n current.hasAttribute?.(\"data-dropdown-menu\") ||\r\n current.hasAttribute?.(\"data-radix-popper-content-wrapper\") ||\r\n current.hasAttribute?.(\"data-radix-portal\") ||\r\n current.getAttribute?.(\"role\") === \"listbox\" ||\r\n current.getAttribute?.(\"role\") === \"dialog\" ||\r\n current.classList?.contains(\"datepicker-portal\") ||\r\n current.classList?.contains(\"popover-portal\")\r\n ) {\r\n return true;\r\n }\r\n current = current.parentElement;\r\n }\r\n return false;\r\n };\r\n\r\n const handleOverlayMouseDown = (event: React.MouseEvent) => {\r\n // Store the mousedown target\r\n mouseDownTarget.current = event.target;\r\n };\r\n\r\n const handleOverlayMouseUp = (event: React.MouseEvent) => {\r\n // Check if both mousedown and mouseup occurred outside modal content\r\n const modalContent = modalContentRef.current;\r\n const mouseDownTarget_ = mouseDownTarget.current as Node;\r\n const mouseUpTarget = event.target as Node;\r\n\r\n // Don't close if clicking inside a portal element (datepicker, popover, etc.)\r\n if (isInsidePortal(mouseDownTarget_) || isInsidePortal(mouseUpTarget)) {\r\n mouseDownTarget.current = null;\r\n return;\r\n }\r\n\r\n const mouseDownOutside = modalContent && !modalContent.contains(mouseDownTarget_);\r\n const mouseUpOutside = modalContent && !modalContent.contains(mouseUpTarget);\r\n\r\n if (closeOnOverlayClick && mouseDownOutside && mouseUpOutside) {\r\n onClose();\r\n }\r\n mouseDownTarget.current = null;\r\n };\r\n\r\n if (!isMounted || (!isOpen && !isVisible)) {\r\n return null;\r\n }\r\n\r\n const maxWidthClass = width ? \"max-w-none\" : fullWidth ? \"max-w-full\" : sizeStyles[size];\r\n\r\n const modalContent = (\r\n <div\r\n className={cn(\"fixed inset-0 z-9999 flex items-center justify-center\", overlayClassName)}\r\n onMouseDown={handleOverlayMouseDown}\r\n onMouseUp={handleOverlayMouseUp}\r\n >\r\n {/* Overlay */}\r\n <div\r\n className=\"absolute inset-0 bg-background/80 backdrop-blur-sm transition-opacity duration-200 ease-out\"\r\n style={{\r\n opacity: isOpen && !isAnimating ? 1 : 0,\r\n }}\r\n />\r\n\r\n {/* Modal */}\r\n <div\r\n ref={modalContentRef}\r\n className={cn(\r\n \"relative w-full rounded-lg bg-card text-card-foreground shadow-xl\",\r\n \"transition-all duration-200 ease-out\",\r\n maxWidthClass,\r\n fullWidth && \"mx-0\",\r\n className\r\n )}\r\n style={{\r\n opacity: isOpen && !isAnimating ? 1 : 0,\r\n transform: isOpen && !isAnimating ? \"scale(1)\" : \"scale(0.9)\",\r\n // Thêm dòng này để tạo hiệu ứng nảy\r\n transition: \"all 300ms cubic-bezier(0.34, 1.76, 0.64, 1)\",\r\n width,\r\n height,\r\n }}\r\n onClick={(e) => e.stopPropagation()}\r\n >\r\n {/* Header */}\r\n {(title || description || showCloseButton) && (\r\n <div className=\"flex items-start justify-between p-6 pb-0\">\r\n <div className=\"space-y-1.5\">\r\n {title && <h2 className=\"text-lg font-semibold leading-none tracking-tight\">{title}</h2>}\r\n {description && <p className=\"text-sm text-muted-foreground\">{description}</p>}\r\n </div>\r\n {showCloseButton && (\r\n <button\r\n onClick={onClose}\r\n className={cn(\r\n \"rounded-sm opacity-70 ring-offset-background transition-opacity\",\r\n \"hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2\",\r\n \"disabled:pointer-events-none \"\r\n )}\r\n >\r\n <X className=\"h-4 w-4 cursor-pointer\" />\r\n </button>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* Content */}\r\n <div className={cn(\"p-6\", noPadding && \"p-0\", contentClassName)}>{children}</div>\r\n </div>\r\n </div>\r\n );\r\n\r\n return typeof window !== \"undefined\" ? createPortal(modalContent, document.body) : null;\r\n};\r\n\r\nexport default Modal;\r\n","\"use client\";\n\nimport React, { createContext, useContext, useState, useCallback, useEffect, useRef } from \"react\";\nimport { cn } from \"@/lib/utils/cn\";\nimport { X, CheckCircle, AlertCircle, Info, AlertTriangle } from \"lucide-react\";\n\ntype ToastType = \"success\" | \"error\" | \"warning\" | \"info\";\ntype ToastPosition = \"top-right\" | \"top-left\" | \"bottom-right\" | \"bottom-left\" | \"top-center\" | \"bottom-center\";\n\ninterface Toast {\n id: string;\n type: ToastType;\n title?: string;\n message: string;\n duration?: number;\n action?: {\n label: string;\n onClick: () => void;\n };\n dismissible?: boolean;\n}\n\ninterface ToastContextType {\n addToast: (toast: Omit<Toast, \"id\">) => void;\n removeToast: (id: string) => void;\n toasts: Toast[];\n}\n\nconst ToastContext = createContext<ToastContextType | 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\ninterface ToastProviderProps {\n children: React.ReactNode;\n position?: ToastPosition;\n maxToasts?: number;\n}\n\nexport const ToastProvider: React.FC<ToastProviderProps> = ({ children, position = \"top-right\", maxToasts = 5 }) => {\n const [toasts, setToasts] = useState<Toast[]>([]);\n const idRef = useRef(0);\n\n const removeToast = useCallback((id: string) => {\n setToasts((prev) => prev.filter((toast) => toast.id !== id));\n }, []);\n\n const addToast = useCallback(\n (toast: Omit<Toast, \"id\">) => {\n const id = `toast-${++idRef.current}`;\n const newToast = { ...toast, id };\n\n setToasts((prev) => {\n const updated = [newToast, ...prev];\n return updated.slice(0, maxToasts);\n });\n\n // Auto-dismiss handled by ToastComponent so pause-on-hover works consistently.\n },\n [maxToasts, removeToast]\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 transform -translate-x-1/2\",\n \"bottom-center\": \"bottom-4 left-1/2 transform -translate-x-1/2\",\n };\n\n return (\n <ToastContext.Provider value={{ addToast, removeToast, toasts }}>\n {children}\n <div className={cn(\"fixed z-99999 flex flex-col gap-2 pointer-events-none\", positionClasses[position])} aria-live=\"polite\" aria-atomic>\n {toasts.map((toast) => (\n <ToastComponent key={toast.id} toast={toast} onRemove={removeToast} />\n ))}\n </div>\n </ToastContext.Provider>\n );\n};\n\ninterface ToastComponentProps {\n toast: Toast;\n onRemove: (id: string) => void;\n}\n\nconst ToastComponent: React.FC<ToastComponentProps> = ({ toast, onRemove }) => {\n const [isVisible, setIsVisible] = useState(false);\n const [progress, setProgress] = useState(100);\n const [paused, setPaused] = useState(false);\n const total = toast.duration && toast.duration > 0 ? toast.duration : 5000;\n const endTsRef = useRef<number>(Date.now() + total);\n const remainingRef = useRef<number>(total);\n const pausedRef = useRef(false);\n\n const handleRemove = useCallback(() => {\n setIsVisible(false);\n setTimeout(() => onRemove(toast.id), 150);\n }, [onRemove, toast.id]);\n\n useEffect(() => {\n setIsVisible(true);\n if (toast.duration === 0) return;\n remainingRef.current = total;\n endTsRef.current = Date.now() + total;\n const intervalId = window.setInterval(() => {\n if (!pausedRef.current) {\n const remain = Math.max(endTsRef.current - Date.now(), 0);\n remainingRef.current = remain;\n setProgress((remain / total) * 100);\n if (remain === 0) {\n handleRemove();\n }\n }\n }, 50);\n return () => window.clearInterval(intervalId);\n }, [handleRemove, toast.duration, total]);\n\n const typeConfig = {\n success: {\n icon: CheckCircle,\n containerClassName: \"bg-success/5 border-success/30\",\n iconClassName: \"text-success\",\n iconBgClassName: \"bg-success/15\",\n accentBarClassName: \"bg-success\",\n },\n error: {\n icon: AlertCircle,\n containerClassName: \"bg-destructive/5 border-destructive/30\",\n iconClassName: \"text-destructive\",\n iconBgClassName: \"bg-destructive/15\",\n accentBarClassName: \"bg-destructive\",\n },\n warning: {\n icon: AlertTriangle,\n containerClassName: \"bg-warning/5 border-warning/30\",\n iconClassName: \"text-warning\",\n iconBgClassName: \"bg-warning/15\",\n accentBarClassName: \"bg-warning\",\n },\n info: {\n icon: Info,\n containerClassName: \"bg-info/5 border-info/30\",\n iconClassName: \"text-info\",\n iconBgClassName: \"bg-info/15\",\n accentBarClassName: \"bg-info\",\n },\n };\n\n const config = typeConfig[toast.type];\n const Icon = config.icon;\n\n return (\n <div\n className={cn(\n \"relative w-80 rounded-r-lg border border-l-0 backdrop-blur-md transition-all duration-300 pointer-events-auto overflow-hidden\",\n \"bg-card shadow-xl\",\n \"animate-in slide-in-from-right-full\",\n config.containerClassName,\n isVisible ? \"opacity-100 translate-x-0\" : \"opacity-0 translate-x-full\"\n )}\n role=\"status\"\n aria-live={toast.type === \"error\" ? \"assertive\" : \"polite\"}\n onMouseEnter={() => {\n if (toast.duration === 0) return;\n pausedRef.current = true;\n remainingRef.current = Math.max(endTsRef.current - Date.now(), 0);\n setPaused(true);\n }}\n onMouseLeave={() => {\n if (toast.duration === 0) return;\n pausedRef.current = false;\n endTsRef.current = Date.now() + remainingRef.current;\n setPaused(false);\n }}\n >\n {/* Accent bar - straight edge, not affected by rounded corners */}\n <div className={cn(\"absolute left-0 top-0 bottom-0 w-1\", config.accentBarClassName)} />\n\n <div className=\"flex items-start gap-3 p-4 pl-5\">\n <div className={cn(\"flex items-center justify-center w-8 h-8 rounded-full shrink-0\", config.iconBgClassName)}>\n <Icon className={cn(\"h-4 w-4\", config.iconClassName)} />\n </div>\n\n <div className=\"flex-1 space-y-1\">\n {toast.title && <h4 className=\"font-medium text-sm leading-none\">{toast.title}</h4>}\n <p className=\"text-sm text-muted-foreground leading-relaxed\">{toast.message}</p>\n {toast.action && (\n <button\n onClick={() => {\n toast.action!.onClick();\n handleRemove();\n }}\n className=\"text-sm font-medium hover:underline focus:outline-none\"\n >\n {toast.action.label}\n </button>\n )}\n </div>\n\n {(toast.dismissible ?? true) && (\n <button\n onClick={handleRemove}\n className={cn(\n \"rounded-md p-1 hover:bg-accent hover:text-accent-foreground\",\n \"transition-colors duration-200 focus:outline-none focus:ring-2 focus:ring-primary/50\"\n )}\n aria-label=\"Close toast\"\n >\n <X className=\"h-4 w-4\" />\n </button>\n )}\n </div>\n {/* Progress bar */}\n {toast.duration !== 0 && (\n <div className=\"absolute left-0 right-0 bottom-0 h-1 bg-transparent\">\n <div\n className={cn(\n \"h-full bg-current/30\",\n toast.type === \"success\" && \"bg-success\",\n toast.type === \"error\" && \"bg-destructive\",\n toast.type === \"warning\" && \"bg-warning\",\n toast.type === \"info\" && \"bg-info\"\n )}\n style={{ width: `${progress}%`, transition: paused ? \"none\" : \"width 100ms linear\" }}\n />\n </div>\n )}\n </div>\n );\n};\n\nexport default ToastProvider;\n","\"use client\";\r\n\r\nimport * as React from \"react\";\r\nimport { createPortal } from \"react-dom\";\r\nimport { cn } from \"@/lib/utils/cn\";\r\n\r\ninterface TooltipProps {\r\n children: React.ReactElement;\r\n content: React.ReactNode;\r\n placement?: \"top\" | \"right\" | \"bottom\" | \"left\";\r\n delay?: number | { open?: number; close?: number };\r\n className?: string;\r\n disabled?: boolean;\r\n variant?: \"default\" | \"info\" | \"warning\" | \"error\" | \"success\";\r\n}\r\n\r\nconst variantStyles = {\r\n default: \"bg-popover text-popover-foreground border-border\",\r\n info: \"bg-info text-info-foreground border-info/20\",\r\n warning: \"bg-warning text-warning-foreground border-warning/20\",\r\n error: \"bg-destructive text-destructive-foreground border-destructive/20\",\r\n success: \"bg-success text-success-foreground border-success/20\",\r\n};\r\n\r\nexport const Tooltip: React.FC<TooltipProps> = ({\r\n children,\r\n content,\r\n placement = \"top\",\r\n delay = { open: 700, close: 300 },\r\n className,\r\n disabled = false,\r\n variant = \"default\",\r\n}) => {\r\n const [isOpen, setIsOpen] = React.useState(false);\r\n const [position, setPosition] = React.useState<{ top: number; left: number } | null>(null);\r\n const [isMounted, setIsMounted] = React.useState(false);\r\n const triggerRef = React.useRef<HTMLElement>(null);\r\n const timeoutRef = React.useRef<NodeJS.Timeout | undefined>(undefined);\r\n\r\n // Ensure client-side only\r\n React.useEffect(() => {\r\n setIsMounted(true);\r\n }, []);\r\n\r\n const delayOpen = typeof delay === \"object\" ? delay.open || 700 : delay;\r\n const delayClose = typeof delay === \"object\" ? delay.close || 300 : delay;\r\n\r\n const calculatePosition = () => {\r\n if (!triggerRef.current) return;\r\n\r\n const rect = triggerRef.current.getBoundingClientRect();\r\n\r\n let top = rect.top;\r\n let left = rect.left;\r\n\r\n const OFFSET = 8;\r\n\r\n switch (placement) {\r\n case \"top\":\r\n top = rect.top - OFFSET;\r\n left = rect.left + rect.width / 2;\r\n break;\r\n case \"bottom\":\r\n top = rect.bottom + OFFSET;\r\n left = rect.left + rect.width / 2;\r\n break;\r\n case \"left\":\r\n top = rect.top + rect.height / 2;\r\n left = rect.left - OFFSET;\r\n break;\r\n case \"right\":\r\n top = rect.top + rect.height / 2;\r\n left = rect.right + OFFSET;\r\n break;\r\n }\r\n\r\n // Ensure tooltip stays within viewport\r\n const viewportWidth = window.innerWidth;\r\n const viewportHeight = window.innerHeight;\r\n\r\n // For horizontal centering, ensure it doesn't go off-screen\r\n if (placement === \"top\" || placement === \"bottom\") {\r\n const tooltipWidth = 200; // approximate width\r\n const minLeft = tooltipWidth / 2;\r\n const maxLeft = viewportWidth - tooltipWidth / 2;\r\n left = Math.max(minLeft, Math.min(left, maxLeft));\r\n }\r\n\r\n setPosition({ top, left });\r\n };\r\n\r\n const handleMouseEnter = () => {\r\n if (disabled) return;\r\n clearTimeout(timeoutRef.current);\r\n timeoutRef.current = setTimeout(() => {\r\n calculatePosition();\r\n setIsOpen(true);\r\n }, delayOpen);\r\n };\r\n\r\n const handleMouseLeave = () => {\r\n clearTimeout(timeoutRef.current);\r\n timeoutRef.current = setTimeout(() => {\r\n setIsOpen(false);\r\n }, delayClose);\r\n };\r\n\r\n const handleFocus = () => {\r\n if (disabled) return;\r\n calculatePosition();\r\n setIsOpen(true);\r\n };\r\n\r\n const handleBlur = () => {\r\n setIsOpen(false);\r\n };\r\n\r\n if (disabled || !content) {\r\n return children;\r\n }\r\n\r\n return (\r\n <>\r\n {React.cloneElement(children, {\r\n ref: triggerRef,\r\n onMouseEnter: handleMouseEnter,\r\n onMouseLeave: handleMouseLeave,\r\n onFocus: handleFocus,\r\n onBlur: handleBlur,\r\n } as any)}\r\n {isMounted &&\r\n isOpen &&\r\n position &&\r\n createPortal(\r\n <div\r\n style={{\r\n position: \"fixed\",\r\n top: position.top,\r\n left: position.left,\r\n transform:\r\n placement === \"top\"\r\n ? \"translate(-50%, -100%)\"\r\n : placement === \"bottom\"\r\n ? \"translateX(-50%)\"\r\n : placement === \"left\"\r\n ? \"translate(-100%, -50%)\"\r\n : placement === \"right\"\r\n ? \"translateY(-50%)\"\r\n : \"none\",\r\n zIndex: 99999,\r\n opacity: 1,\r\n transition: \"opacity 150ms\",\r\n pointerEvents: \"none\",\r\n }}\r\n className={cn(\r\n \"px-3 py-2 text-sm font-medium rounded-lg shadow-lg border\",\r\n \"max-w-xs wrap-break-word backdrop-blur-sm\",\r\n variantStyles[variant],\r\n className\r\n )}\r\n >\r\n {content}\r\n </div>,\r\n document.body\r\n )}\r\n </>\r\n );\r\n};\r\n","\"use client\";\r\n\r\nimport * as React from \"react\";\r\nimport { createPortal } from \"react-dom\";\r\nimport { cn } from \"@/lib/utils/cn\";\r\nimport { useShadCNAnimations } from \"@/lib/utils/shadcn-animations\";\r\n\r\ninterface PopoverProps {\n trigger: React.ReactElement;\n children: React.ReactNode;\n className?: string;\n contentClassName?: string;\n placement?: \"top\" | \"bottom\" | \"left\" | \"right\" | \"top-start\" | \"bottom-start\" | \"top-end\" | \"bottom-end\";\n modal?: boolean;\n disabled?: boolean;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n matchTriggerWidth?: boolean;\n contentWidth?: number; // optional fixed width\n}\n\r\nexport const Popover: React.FC<PopoverProps> = ({\n trigger,\n children, \n className,\n contentClassName,\n placement = \"bottom\",\n modal = false,\n disabled = false,\n open,\n onOpenChange,\n matchTriggerWidth = false,\n contentWidth\n}) => {\n const [internalOpen, setInternalOpen] = React.useState(false);\n const [dropdownPosition, setDropdownPosition] = React.useState<{top: number, left: number, width?: number, alignEnd?: boolean} | null>(null);\n const triggerRef = React.useRef<HTMLElement>(null);\n\r\n // Inject ShadCN animations\r\n useShadCNAnimations();\r\n \r\n const isOpen = open !== undefined ? open : internalOpen;\r\n const setIsOpen = onOpenChange || setInternalOpen;\r\n\r\n // Calculate positioning synchronously on open to avoid flicker\r\n const calculatePosition = React.useCallback(() => {\n if (!triggerRef.current) return null;\n const rect = triggerRef.current.getBoundingClientRect();\n const scrollTop = window.pageYOffset || document.documentElement.scrollTop;\n const scrollLeft = window.pageXOffset || document.documentElement.scrollLeft;\n\n let top = rect.bottom + scrollTop + 4;\n let left = rect.left + scrollLeft;\n let alignEnd = false;\n const width = matchTriggerWidth ? rect.width : contentWidth;\n\r\n switch (placement) {\r\n case 'top':\r\n case 'top-start':\r\n top = rect.top + scrollTop - 4;\r\n break;\r\n case 'top-end':\n top = rect.top + scrollTop - 4;\n left = rect.right + scrollLeft;\n alignEnd = true;\n break;\n case 'bottom':\n case 'bottom-start':\n top = rect.bottom + scrollTop + 4;\n break;\n case 'bottom-end':\n top = rect.bottom + scrollTop + 4;\n left = rect.right + scrollLeft;\n alignEnd = true;\n break;\n case 'left':\r\n top = rect.top + scrollTop;\r\n left = rect.left + scrollLeft - 4;\r\n break;\r\n case 'right':\r\n top = rect.top + scrollTop;\r\n left = rect.right + scrollLeft + 4;\r\n break;\r\n }\r\n\r\n return {\n top,\n left,\n width,\n alignEnd,\n };\n }, [placement, matchTriggerWidth, contentWidth]);\n\r\n // Reposition on resize/scroll while open\r\n React.useEffect(() => {\r\n if (!isOpen) return;\r\n const handler = () => {\r\n const pos = calculatePosition();\r\n if (pos) setDropdownPosition(pos);\r\n };\r\n window.addEventListener('resize', handler);\r\n // With absolute positioning, scrolling the page moves the popover along.\r\n // Still, listen to scroll to adjust for nested scrolling containers.\r\n window.addEventListener('scroll', handler, true);\r\n return () => {\r\n window.removeEventListener('resize', handler);\r\n window.removeEventListener('scroll', handler, true);\r\n };\r\n }, [isOpen, calculatePosition]);\r\n\r\n // Handle clicks outside\r\n React.useEffect(() => {\r\n if (!isOpen) return;\r\n\r\n const handleClickOutside = (event: MouseEvent) => {\r\n const target = event.target as Node;\r\n if (triggerRef.current && !triggerRef.current.contains(target)) {\r\n const dropdown = document.querySelector('[data-popover]') as Element;\r\n if (dropdown && !dropdown.contains(target)) {\r\n setIsOpen(false);\r\n }\r\n }\r\n };\r\n\r\n const handleEscape = (event: KeyboardEvent) => {\r\n if (event.key === 'Escape') {\r\n setIsOpen(false);\r\n }\r\n };\r\n\r\n if (typeof document !== 'undefined') {\r\n document.addEventListener('mousedown', handleClickOutside);\r\n document.addEventListener('keydown', handleEscape);\r\n \r\n return () => {\r\n document.removeEventListener('mousedown', handleClickOutside);\r\n document.removeEventListener('keydown', handleEscape);\r\n };\r\n }\r\n }, [isOpen, setIsOpen]);\r\n\r\n const handleTriggerClick = () => {\r\n if (!disabled) {\r\n const next = !isOpen;\r\n if (next) {\r\n const pos = calculatePosition();\r\n if (pos) setDropdownPosition(pos);\r\n }\r\n setIsOpen(next);\r\n }\r\n };\r\n\r\n const popoverContent = isOpen && dropdownPosition ? (\n <div\n data-popover\n style={{\n position: 'absolute',\n top: dropdownPosition?.top || 0,\n left: dropdownPosition?.left || 0,\n width: dropdownPosition?.width || undefined,\n transform: dropdownPosition?.alignEnd ? 'translateX(-100%)' : undefined,\n zIndex: 9999,\n }}\n data-state=\"open\"\n role=\"dialog\"\n aria-modal={modal || undefined}\n className={cn(\r\n \"z-9999\",\r\n // shadcn-like enter animation\r\n \"data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95\",\r\n className\r\n )}\r\n >\r\n <div\r\n className={cn(\r\n \"rounded-md border bg-popover text-popover-foreground shadow-md\",\r\n \"backdrop-blur-sm bg-popover/95 border-border/60 p-4\",\r\n contentClassName\r\n )}\r\n tabIndex={-1}\r\n >\r\n {children}\r\n </div>\r\n </div>\r\n ) : null;\r\n\r\n return (\r\n <>\r\n {(() => {\r\n const triggerEl = trigger as React.ReactElement<any>;\r\n return React.cloneElement(triggerEl, {\r\n ref: triggerRef,\r\n onClick: (e: React.MouseEvent) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n handleTriggerClick();\r\n // Call original onClick if exists\r\n if (triggerEl.props && typeof triggerEl.props.onClick === 'function') {\r\n triggerEl.props.onClick(e);\r\n }\r\n },\r\n 'aria-expanded': isOpen,\r\n 'aria-haspopup': 'dialog',\r\n className: cn(\r\n triggerEl.props?.className,\r\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background rounded-md'\r\n )\r\n } as any);\r\n })()}\r\n {isOpen && dropdownPosition && typeof window !== 'undefined' && createPortal(popoverContent, document.body)}\r\n </>\r\n );\r\n};\r\n","// ShadCN UI Animation Styles - Enhanced with smooth spring-like animations\r\nexport const shadcnAnimationStyles = `\r\n /* ============================================\r\n * DROPDOWN / POPOVER ANIMATIONS\r\n * Uses spring-like cubic-bezier for natural feel\r\n * ============================================ */\r\n \r\n /* Native-like Combobox Animation - Mimics browser default select */\r\n [data-state=\"open\"][data-combobox-dropdown] {\r\n animation: comboboxOpen 150ms cubic-bezier(0.2, 0, 0, 1);\r\n transform-origin: top center;\r\n }\r\n\r\n [data-state=\"closed\"][data-combobox-dropdown] {\r\n animation: comboboxClose 120ms cubic-bezier(0.4, 0, 1, 1);\r\n transform-origin: top center;\r\n }\r\n\r\n @keyframes comboboxOpen {\r\n 0% {\r\n opacity: 0;\r\n transform: translateY(-4px) scaleY(0.9);\r\n }\r\n 100% {\r\n opacity: 1;\r\n transform: translateY(0) scaleY(1);\r\n }\r\n }\r\n\r\n @keyframes comboboxClose {\r\n 0% {\r\n opacity: 1;\r\n transform: translateY(0) scaleY(1);\r\n }\r\n 100% {\r\n opacity: 0;\r\n transform: translateY(-4px) scaleY(0.9);\r\n }\r\n }\r\n\r\n /* Generic dropdown open/close */\r\n [data-state=\"open\"] {\r\n animation: slideDownAndFade 220ms cubic-bezier(0.16, 1, 0.3, 1);\r\n }\r\n \r\n [data-state=\"closed\"] {\r\n animation: slideUpAndFade 180ms cubic-bezier(0.4, 0, 0.2, 1);\r\n }\r\n \r\n @keyframes slideDownAndFade {\r\n from {\r\n opacity: 0;\r\n transform: translateY(-4px) scale(0.98);\r\n }\r\n to {\r\n opacity: 1;\r\n transform: translateY(0) scale(1);\r\n }\r\n }\r\n \r\n @keyframes slideUpAndFade {\r\n from {\r\n opacity: 1;\r\n transform: translateY(0) scale(1);\r\n }\r\n to {\r\n opacity: 0;\r\n transform: translateY(-4px) scale(0.98);\r\n }\r\n }\r\n \r\n /* ============================================\r\n * DROPDOWN ITEMS - Native-like instant appearance\r\n * ============================================ */\r\n\r\n /* Fast staggered animation for native feel */\r\n .dropdown-item {\r\n opacity: 0;\r\n animation: itemFadeIn 120ms cubic-bezier(0.2, 0, 0, 1) forwards;\r\n }\r\n\r\n @keyframes itemFadeIn {\r\n 0% {\r\n opacity: 0;\r\n transform: translateY(-2px);\r\n }\r\n 100% {\r\n opacity: 1;\r\n transform: translateY(0);\r\n }\r\n }\r\n\r\n /* Subtle hover effect */\r\n .dropdown-item {\r\n transition: background-color 100ms ease;\r\n }\r\n \r\n /* ============================================\r\n * TOOLTIP / SIDE ANIMATIONS\r\n * ============================================ */\r\n \r\n [data-side=\"top\"] {\r\n animation: slideFromBottom 200ms cubic-bezier(0.16, 1, 0.3, 1);\r\n }\r\n \r\n [data-side=\"bottom\"] {\r\n animation: slideFromTop 200ms cubic-bezier(0.16, 1, 0.3, 1);\r\n }\r\n \r\n [data-side=\"left\"] {\r\n animation: slideFromRight 200ms cubic-bezier(0.16, 1, 0.3, 1);\r\n }\r\n \r\n [data-side=\"right\"] {\r\n animation: slideFromLeft 200ms cubic-bezier(0.16, 1, 0.3, 1);\r\n }\r\n \r\n @keyframes slideFromTop {\r\n from {\r\n opacity: 0;\r\n transform: translateY(-6px) scale(0.96);\r\n }\r\n to {\r\n opacity: 1;\r\n transform: translateY(0) scale(1);\r\n }\r\n }\r\n \r\n @keyframes slideFromBottom {\r\n from {\r\n opacity: 0;\r\n transform: translateY(6px) scale(0.96);\r\n }\r\n to {\r\n opacity: 1;\r\n transform: translateY(0) scale(1);\r\n }\r\n }\r\n \r\n @keyframes slideFromLeft {\r\n from {\r\n opacity: 0;\r\n transform: translateX(-6px) scale(0.96);\r\n }\r\n to {\r\n opacity: 1;\r\n transform: translateX(0) scale(1);\r\n }\r\n }\r\n \r\n @keyframes slideFromRight {\r\n from {\r\n opacity: 0;\r\n transform: translateX(6px) scale(0.96);\r\n }\r\n to {\r\n opacity: 1;\r\n transform: translateX(0) scale(1);\r\n }\r\n }\r\n \r\n /* ============================================\r\n * UTILITY ANIMATIONS\r\n * ============================================ */\r\n \r\n .animate-bounce-subtle {\r\n animation: bounceSubtle 600ms cubic-bezier(0.34, 1.56, 0.64, 1);\r\n }\r\n \r\n @keyframes bounceSubtle {\r\n 0%, 100% {\r\n transform: translateY(0);\r\n }\r\n 50% {\r\n transform: translateY(-4px);\r\n }\r\n }\r\n \r\n .animate-scale-in {\r\n animation: scaleIn 200ms cubic-bezier(0.34, 1.56, 0.64, 1);\r\n }\r\n \r\n @keyframes scaleIn {\r\n from {\r\n opacity: 0;\r\n transform: scale(0.9);\r\n }\r\n to {\r\n opacity: 1;\r\n transform: scale(1);\r\n }\r\n }\r\n \r\n /* Smooth backdrop blur transition */\r\n .backdrop-animate {\r\n transition: backdrop-filter 200ms ease, background-color 200ms ease;\r\n }\r\n`;\r\n\r\n// Hook to inject ShadCN animation styles\r\nexport const useShadCNAnimations = () => {\r\n if (typeof document !== \"undefined\") {\r\n const styleId = \"shadcn-animations\";\r\n if (!document.getElementById(styleId)) {\r\n const styleElement = document.createElement(\"style\");\r\n styleElement.id = styleId;\r\n styleElement.textContent = shadcnAnimationStyles;\r\n document.head.appendChild(styleElement);\r\n }\r\n }\r\n};\r\n","\"use client\";\r\n\r\nimport * as React from \"react\";\r\nimport { createPortal } from \"react-dom\";\r\nimport { cn } from \"@/lib/utils/cn\";\r\nimport { X } from \"lucide-react\";\r\nimport Button from \"./Button\";\r\n\r\ninterface SheetProps {\r\n open: boolean;\r\n onOpenChange: (open: boolean) => void;\r\n side?: \"left\" | \"right\" | \"top\" | \"bottom\";\r\n size?: \"sm\" | \"md\" | \"lg\" | \"xl\" | \"full\";\r\n variant?: \"default\" | \"overlay\" | \"push\";\r\n children: React.ReactNode;\r\n title?: React.ReactNode;\r\n description?: React.ReactNode;\r\n className?: string;\r\n showClose?: boolean;\r\n closeOnOutsideClick?: boolean;\r\n closeOnEscape?: boolean;\r\n header?: React.ReactNode;\r\n footer?: React.ReactNode;\r\n}\r\n\r\nconst sizeStyles = {\r\n sm: {\r\n right: \"w-[300px]\",\r\n left: \"w-[300px]\",\r\n top: \"h-[200px]\",\r\n bottom: \"h-[200px]\",\r\n },\r\n md: {\r\n right: \"w-[400px]\",\r\n left: \"w-[400px]\",\r\n top: \"h-[300px]\",\r\n bottom: \"h-[300px]\",\r\n },\r\n lg: {\r\n right: \"w-[500px]\",\r\n left: \"w-[500px]\",\r\n top: \"h-[400px]\",\r\n bottom: \"h-[400px]\",\r\n },\r\n xl: {\r\n right: \"w-[600px]\",\r\n left: \"w-[600px]\",\r\n top: \"h-[500px]\",\r\n bottom: \"h-[500px]\",\r\n },\r\n full: {\r\n right: \"w-full\",\r\n left: \"w-full\",\r\n top: \"h-full\",\r\n bottom: \"h-full\",\r\n },\r\n};\r\n\r\nconst positionStyles = {\r\n right: \"right-0 top-0 h-full\",\r\n left: \"left-0 top-0 h-full\",\r\n top: \"top-0 left-0 w-full\",\r\n bottom: \"bottom-0 left-0 w-full\",\r\n};\r\n\r\nconst animationStyles = {\r\n right: {\r\n initial: \"translate-x-full\",\r\n animate: \"translate-x-0\",\r\n exit: \"translate-x-full\",\r\n },\r\n left: {\r\n initial: \"-translate-x-full\",\r\n animate: \"translate-x-0\",\r\n exit: \"-translate-x-full\",\r\n },\r\n top: {\r\n initial: \"-translate-y-full\",\r\n animate: \"translate-y-0\",\r\n exit: \"-translate-y-full\",\r\n },\r\n bottom: {\r\n initial: \"translate-y-full\",\r\n animate: \"translate-y-0\",\r\n exit: \"translate-y-full\",\r\n },\r\n};\r\n\r\nexport const Sheet: React.FC<SheetProps> = ({\r\n open,\r\n onOpenChange,\r\n side = \"right\",\r\n size = \"md\",\r\n variant = \"default\",\r\n children,\r\n title,\r\n description,\r\n className,\r\n showClose = true,\r\n closeOnOutsideClick = true,\r\n closeOnEscape = true,\r\n header,\r\n footer,\r\n}) => {\r\n const [mounted, setMounted] = React.useState(false);\r\n const [isAnimating, setIsAnimating] = React.useState(true);\r\n const [isVisible, setIsVisible] = React.useState(false);\r\n\r\n React.useEffect(() => {\r\n setMounted(true);\r\n }, []);\r\n\r\n // Handle escape key\r\n React.useEffect(() => {\r\n if (!closeOnEscape) return;\r\n\r\n const handleEscape = (e: KeyboardEvent) => {\r\n if (e.key === \"Escape\" && open) {\r\n onOpenChange(false);\r\n }\r\n };\r\n\r\n document.addEventListener(\"keydown\", handleEscape);\r\n return () => document.removeEventListener(\"keydown\", handleEscape);\r\n }, [open, closeOnEscape, onOpenChange]);\r\n\r\n // Prevent body scroll when sheet is open\r\n React.useEffect(() => {\r\n if (open) {\r\n document.body.style.overflow = \"hidden\";\r\n } else {\r\n document.body.style.overflow = \"unset\";\r\n }\r\n\r\n return () => {\r\n document.body.style.overflow = \"unset\";\r\n };\r\n }, [open]);\r\n\r\n // Animation handling\r\n React.useEffect(() => {\r\n if (open) {\r\n setIsVisible(true);\r\n setIsAnimating(true);\r\n // Start animation on next frame to avoid flicker\r\n requestAnimationFrame(() => {\r\n setIsAnimating(false);\r\n });\r\n } else if (isVisible) {\r\n setIsAnimating(true);\r\n // Hide after animation completes\r\n const hideTimer = setTimeout(() => {\r\n setIsVisible(false);\r\n }, 300);\r\n return () => clearTimeout(hideTimer);\r\n }\r\n }, [open, isVisible]);\r\n\r\n const handleOverlayClick = (e: React.MouseEvent) => {\r\n if (closeOnOutsideClick && e.target === e.currentTarget) {\r\n onOpenChange(false);\r\n }\r\n };\r\n\r\n const handleClose = () => {\r\n onOpenChange(false);\r\n };\r\n\r\n if (!mounted || (!open && !isVisible)) return null;\r\n\r\n const sheetContent = (\r\n <div className=\"fixed inset-0 z-50\">\r\n {/* Overlay */}\r\n <div\r\n className={cn(\r\n \"fixed inset-0 transition-all duration-300 ease-out\",\r\n variant === \"overlay\" ? \"bg-background/95 backdrop-blur-sm\" : \"bg-background/80 backdrop-blur-sm\",\r\n open && !isAnimating ? \"opacity-100\" : \"opacity-0\"\r\n )}\r\n onClick={handleOverlayClick}\r\n />\r\n\r\n {/* Sheet */}\r\n <div\r\n className={cn(\r\n \"fixed flex flex-col bg-background text-foreground shadow-2xl\",\r\n \"border-border transition-all duration-300 ease-out\",\r\n positionStyles[side],\r\n sizeStyles[size][side],\r\n // Borders based on side\r\n side === \"right\" && \"border-l\",\r\n side === \"left\" && \"border-r\",\r\n side === \"top\" && \"border-b\",\r\n side === \"bottom\" && \"border-t\",\r\n // Animation classes - smooth slide in/out\r\n open && !isAnimating ? animationStyles[side].animate : animationStyles[side].initial,\r\n className\r\n )}\r\n style={{\r\n transform:\r\n open && !isAnimating\r\n ? \"translate(0, 0)\"\r\n : side === \"right\"\r\n ? \"translateX(100%)\"\r\n : side === \"left\"\r\n ? \"translateX(-100%)\"\r\n : side === \"top\"\r\n ? \"translateY(-100%)\"\r\n : \"translateY(100%)\",\r\n transition: \"transform 300ms cubic-bezier(0.4, 0, 0.2, 1)\",\r\n }}\r\n >\r\n {/* Header */}\r\n {(title || description || header || showClose) && (\r\n <div className=\"shrink-0 border-b border-border\">\r\n {header || (\r\n <div className=\"flex items-center justify-between p-4\">\r\n <div className=\"flex-1\">\r\n {title && <h2 className=\"text-lg font-semibold text-foreground\">{title}</h2>}\r\n {description && <p className=\"text-sm text-muted-foreground mt-1\">{description}</p>}\r\n </div>\r\n {showClose && <Button variant=\"ghost\" size=\"sm\" onClick={handleClose} className=\"h-8 w-8 p-0 rounded-md cursor-pointer\" icon={X} />}\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* Content */}\r\n <div\r\n className=\"flex-1 overflow-auto p-4\"\r\n style={{\r\n opacity: open && !isAnimating ? 1 : 0,\r\n transform: open && !isAnimating ? \"translateY(0)\" : \"translateY(20px)\",\r\n transition: \"opacity 400ms ease-out 100ms, transform 400ms ease-out 100ms\",\r\n }}\r\n >\r\n {children}\r\n </div>\r\n\r\n {/* Footer */}\r\n {footer && <div className=\"shrink-0 border-t border-border p-4\">{footer}</div>}\r\n </div>\r\n </div>\r\n );\r\n\r\n return typeof window !== \"undefined\" ? createPortal(sheetContent, document.body) : null;\r\n};\r\n\r\n// Specialized Sheet components\r\ninterface DrawerProps extends Omit<SheetProps, \"side\"> {\r\n placement?: \"left\" | \"right\";\r\n}\r\n\r\nexport const Drawer: React.FC<DrawerProps> = ({ placement = \"right\", ...props }) => {\r\n return <Sheet {...props} side={placement} variant=\"overlay\" />;\r\n};\r\n\r\ninterface SlideOverProps extends Omit<SheetProps, \"side\" | \"variant\"> {}\r\n\r\nexport const SlideOver: React.FC<SlideOverProps> = (props) => {\r\n return <Sheet {...props} side=\"right\" variant=\"overlay\" size=\"lg\" />;\r\n};\r\n\r\ninterface BottomSheetProps extends Omit<SheetProps, \"side\"> {\r\n snapPoints?: string[];\r\n defaultSnap?: number;\r\n}\r\n\r\nexport const BottomSheet: React.FC<BottomSheetProps> = ({ snapPoints = [\"25%\", \"50%\", \"90%\"], defaultSnap = 1, ...props }) => {\r\n return <Sheet {...props} side=\"bottom\" variant=\"overlay\" className={cn(\"rounded-t-lg\", props.className)} />;\r\n};\r\n\r\ninterface SidebarSheetProps extends Omit<SheetProps, \"side\" | \"variant\"> {\r\n navigation?: React.ReactNode;\r\n}\r\n\r\nexport const SidebarSheet: React.FC<SidebarSheetProps> = ({ navigation, children, ...props }) => {\r\n return (\r\n <Sheet {...props} side=\"left\" variant=\"push\" size=\"md\">\r\n {navigation && <div className=\"border-b border-border pb-4 mb-4\">{navigation}</div>}\r\n {children}\r\n </Sheet>\r\n );\r\n};\r\n","// components/ui/Alert.tsx\nimport { cn } from \"@/lib/utils/cn\";\nimport { ReactNode, useState } from \"react\";\nimport { Info, AlertTriangle, CheckCircle, XCircle, X } from \"lucide-react\";\nimport { useTranslations } from \"@/lib/i18n/translation-adapter\";\n\ntype AlertVariant = \"default\" | \"info\" | \"success\" | \"warning\" | \"error\";\n\nconst variantConfig: Record<\n AlertVariant,\n {\n icon: typeof Info;\n containerClassName: string;\n iconClassName: string;\n iconBgClassName: string;\n accentBarClassName: string;\n }\n> = {\n default: {\n icon: Info,\n containerClassName: \"bg-muted/50 border-border\",\n iconClassName: \"text-muted-foreground\",\n iconBgClassName: \"bg-muted\",\n accentBarClassName: \"bg-muted-foreground\",\n },\n info: {\n icon: Info,\n containerClassName: \"bg-info/5 border-info/30\",\n iconClassName: \"text-info\",\n iconBgClassName: \"bg-info/15\",\n accentBarClassName: \"bg-info\",\n },\n success: {\n icon: CheckCircle,\n containerClassName: \"bg-success/5 border-success/30\",\n iconClassName: \"text-success\",\n iconBgClassName: \"bg-success/15\",\n accentBarClassName: \"bg-success\",\n },\n warning: {\n icon: AlertTriangle,\n containerClassName: \"bg-warning/5 border-warning/30\",\n iconClassName: \"text-warning\",\n iconBgClassName: \"bg-warning/15\",\n accentBarClassName: \"bg-warning\",\n },\n error: {\n icon: XCircle,\n containerClassName: \"bg-destructive/5 border-destructive/30\",\n iconClassName: \"text-destructive\",\n iconBgClassName: \"bg-destructive/15\",\n accentBarClassName: \"bg-destructive\",\n },\n};\n\ninterface AlertProps {\n title?: string;\n description?: ReactNode;\n variant?: AlertVariant;\n className?: string;\n icon?: ReactNode;\n dismissible?: boolean;\n onClose?: () => void;\n actions?: ReactNode;\n closeAriaLabel?: string;\n}\n\nconst Alert = ({ title, description, variant = \"default\", className, icon, dismissible = false, onClose, actions, closeAriaLabel }: AlertProps) => {\n const [open, setOpen] = useState(true);\n const t = useTranslations(\"Common\");\n\n if (!open) return null;\n\n const handleClose = () => {\n setOpen(false);\n onClose?.();\n };\n\n const config = variantConfig[variant];\n const Icon = config.icon;\n\n return (\n <div\n className={cn(\n \"relative w-full rounded-r-lg border border-l-0 overflow-hidden\",\n \"flex items-start gap-3 p-4 pl-5\",\n \"backdrop-blur-md\",\n config.containerClassName,\n className\n )}\n role=\"alert\"\n aria-live={variant === \"error\" ? \"assertive\" : \"polite\"}\n >\n {/* Accent bar - straight edge, not affected by rounded corners */}\n <div className={cn(\"absolute left-0 top-0 bottom-0 w-1\", config.accentBarClassName)} />\n\n <div className={cn(\"flex items-center justify-center w-8 h-8 rounded-full shrink-0\", config.iconBgClassName)}>\n {icon ?? <Icon className={cn(\"h-4 w-4\", config.iconClassName)} />}\n </div>\n\n <div className=\"flex-1 min-w-0\">\n {title && <p className=\"font-semibold text-sm leading-none mb-1 text-foreground\">{title}</p>}\n {description &&\n (typeof description === \"string\" ? (\n <p className=\"text-sm text-muted-foreground leading-relaxed wrap-break-word\">{description}</p>\n ) : (\n <div className=\"text-sm text-muted-foreground leading-relaxed wrap-break-word\">{description}</div>\n ))}\n {actions && <div className=\"mt-2 flex flex-wrap gap-2\">{actions}</div>}\n </div>\n\n {dismissible && (\n <button\n onClick={handleClose}\n className=\"rounded-md p-1 hover:bg-accent focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n aria-label={closeAriaLabel || t(\"closeAlert\")}\n >\n <X className=\"h-4 w-4\" />\n </button>\n )}\n </div>\n );\n};\n\nexport default Alert;\n","\"use client\";\r\n\r\nimport React, { useEffect, useState } from \"react\";\r\nimport { cn } from \"@/lib/utils/cn\";\r\nimport { Activity } from \"lucide-react\";\r\nimport { loading, LoadingState } from \"@/lib/utils/loading\";\r\nimport { useTranslations } from \"@/lib/i18n/translation-adapter\";\r\n\r\ninterface GlobalLoadingProps {\r\n className?: string;\r\n backdrop?: boolean;\r\n position?: \"fixed\" | \"absolute\";\r\n size?: \"sm\" | \"md\" | \"lg\";\r\n}\r\n\r\n/**\r\n * Component GlobalLoading - tự động lắng nghe singleton loading state\r\n * Chỉ cần gắn 1 lần ở root của app\r\n */\r\nexport const GlobalLoading: React.FC<GlobalLoadingProps> = ({ className, backdrop = true, position = \"fixed\", size = \"lg\" }) => {\r\n const [state, setState] = useState<LoadingState>(() => loading.getState());\r\n\r\n useEffect(() => {\r\n // Subscribe to loading state changes\r\n const unsubscribe = loading.subscribe(setState);\r\n return unsubscribe;\r\n }, []);\r\n\r\n if (!state.isVisible) return null;\r\n\r\n return (\r\n <div\r\n className={cn(\r\n \"inset-0 z-100000 flex items-center justify-center\",\r\n position === \"fixed\" ? \"fixed\" : \"absolute\",\r\n backdrop && \"bg-background/90 backdrop-blur-sm\",\r\n className\r\n )}\r\n role=\"dialog\"\r\n aria-modal\r\n aria-label=\"Loading\"\r\n >\r\n <div\r\n className=\"flex items-center justify-center space-x-3 backdrop-blur-sm rounded-lg px-6 py-4 shadow-lg\"\r\n role=\"status\"\r\n aria-live=\"assertive\"\r\n aria-busy\r\n >\r\n <Activity className=\"w-6 h-6 animate-spin text-primary-background\" aria-hidden />\r\n {state.text && <span className=\"text-base font-medium text-foreground\">{state.text}</span>}\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\ninterface PageLoadingProps {\r\n message?: string;\r\n className?: string;\r\n}\r\n\r\nexport const PageLoading: React.FC<PageLoadingProps> = ({ message, className }) => {\r\n const t = useTranslations(\"Loading\");\r\n const defaultMessage = message || t(\"loadingPage\");\r\n return (\r\n <div className={cn(\"min-h-screen flex items-center justify-center bg-background\", className)}>\r\n <div className=\"text-center space-y-4\">\r\n <Activity className=\"w-8 h-8 animate-spin text-primary mx-auto\" />\r\n <div>\r\n <p className=\"text-lg font-medium text-foreground\">{defaultMessage}</p>\r\n <p className=\"text-sm text-muted-foreground mt-2\">{t(\"pleaseWait\")}</p>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\n// Inline loading component cho buttons hoặc containers nhỏ\r\ninterface InlineLoadingProps {\r\n isLoading: boolean;\r\n text?: string;\r\n className?: string;\r\n size?: \"sm\" | \"md\" | \"lg\";\r\n}\r\n\r\nexport const InlineLoading: React.FC<InlineLoadingProps> = ({ isLoading, text, className, size = \"md\" }) => {\r\n if (!isLoading) return null;\r\n\r\n const sizeClasses = {\r\n sm: \"w-4 h-4\",\r\n md: \"w-6 h-6\",\r\n lg: \"w-8 h-8\",\r\n };\r\n\r\n return (\r\n <div className={cn(\"flex items-center justify-center space-x-2\", className)}>\r\n <Activity className={cn(\"animate-spin text-primary\", sizeClasses[size])} />\r\n {text && <span className=\"text-sm text-muted-foreground animate-pulse\">{text}</span>}\r\n </div>\r\n );\r\n};\r\n\r\n// Button loading wrapper\r\ninterface ButtonLoadingProps {\r\n isLoading: boolean;\r\n children: React.ReactNode;\r\n className?: string;\r\n disabled?: boolean;\r\n loadingText?: string;\r\n}\r\n\r\nexport const ButtonLoading: React.FC<ButtonLoadingProps> = ({ isLoading, children, className, disabled, loadingText }) => {\r\n // Avoid nested <button> by wrapping with a div and cloning child to disable it when loading\r\n const child = React.isValidElement(children)\r\n ? React.cloneElement(children as any, {\r\n disabled: ((children as any).props?.disabled ?? false) || disabled || isLoading,\r\n \"aria-busy\": isLoading || undefined,\r\n })\r\n : children;\r\n\r\n return (\r\n <div className={cn(\"relative inline-block\", isLoading && \"cursor-not-allowed\", className)}>\r\n {isLoading && (\r\n <div className=\"absolute inset-0 flex items-center justify-center pointer-events-none\">\r\n <Activity className=\"w-4 h-4 animate-spin text-primary-foreground\" />\r\n {loadingText && <span className=\"ml-2 text-sm\">{loadingText}</span>}\r\n </div>\r\n )}\r\n\r\n <div className={cn(isLoading && \"opacity-50 pointer-events-none\")}>{child}</div>\r\n </div>\r\n );\r\n};\r\n","/**\r\n * Singleton Loading Manager - Đơn giản và dễ sử dụng\r\n * Chỉ cần gọi loading.show() và loading.hide() từ bất kỳ đâu\r\n */\r\n\r\ntype LoadingState = {\r\n isVisible: boolean;\r\n text?: string;\r\n};\r\n\r\nclass LoadingManager {\r\n private state: LoadingState = { isVisible: false };\r\n private listeners: Set<(state: LoadingState) => void> = new Set();\r\n\r\n /**\r\n * Hiển thị loading với text tùy chọn\r\n */\r\n show(text?: string) {\r\n this.state = { isVisible: true, text };\r\n this.notifyListeners();\r\n }\r\n\r\n /**\r\n * Ẩn loading\r\n */\r\n hide() {\r\n this.state = { isVisible: false, text: undefined };\r\n this.notifyListeners();\r\n }\r\n\r\n\r\n /**\r\n * Lấy state hiện tại\r\n */\r\n getState(): LoadingState {\r\n return { ...this.state };\r\n }\r\n\r\n /**\r\n * Subscribe để nhận thông báo khi state thay đổi\r\n */\r\n subscribe(listener: (state: LoadingState) => void): () => void {\r\n this.listeners.add(listener);\r\n // Trả về function để unsubscribe\r\n return () => {\r\n this.listeners.delete(listener);\r\n };\r\n }\r\n\r\n private notifyListeners() {\r\n this.listeners.forEach(listener => listener(this.state));\r\n }\r\n}\r\n\r\n// Singleton instance - export để dùng trực tiếp\r\nexport const loading = new LoadingManager();\r\n\r\n// Export type cho TypeScript\r\nexport type { LoadingState };","import * as React from \"react\";\r\nimport { cn } from \"@/lib/utils/cn\";\r\nimport Link from \"next/link\";\r\nimport { ChevronRight, Home, MoreHorizontal } from \"lucide-react\";\r\n\r\ninterface BreadcrumbItem {\r\n label: string;\r\n href?: string;\r\n icon?: React.ComponentType<{ className?: string }>;\r\n disabled?: boolean;\r\n}\r\n\r\ninterface BreadcrumbProps {\r\n items: BreadcrumbItem[];\r\n className?: string;\r\n separator?: React.ComponentType<{ className?: string }> | string;\r\n size?: \"sm\" | \"md\" | \"lg\";\r\n variant?: \"default\" | \"simple\" | \"slash\" | \"arrow\" | \"pill\";\r\n maxItems?: number;\r\n showHome?: boolean;\r\n homeHref?: string;\r\n collapsible?: boolean;\r\n}\r\n\r\nconst sizeStyles = {\r\n sm: {\r\n text: \"text-xs\",\r\n spacing: \"space-x-0.5\",\r\n padding: \"px-1.5 py-0.5\",\r\n icon: \"h-3 w-3\"\r\n },\r\n md: {\r\n text: \"text-sm\", \r\n spacing: \"space-x-1\",\r\n padding: \"px-2 py-1\",\r\n icon: \"h-4 w-4\"\r\n },\r\n lg: {\r\n text: \"text-base\",\r\n spacing: \"space-x-1.5\", \r\n padding: \"px-3 py-1.5\",\r\n icon: \"h-5 w-5\"\r\n }\r\n};\r\n\r\nconst variantStyles = {\r\n default: \"text-muted-foreground hover:text-foreground\",\r\n simple: \"text-muted-foreground hover:text-foreground underline-offset-4 hover:underline\",\r\n slash: \"text-muted-foreground hover:text-foreground\",\r\n arrow: \"text-muted-foreground hover:text-foreground\",\r\n pill: \"text-muted-foreground hover:text-foreground hover:bg-accent rounded-md transition-colors\"\r\n};\r\n\r\nexport const Breadcrumb: React.FC<BreadcrumbProps> = ({\r\n items,\r\n className,\r\n separator = ChevronRight,\r\n size = \"md\",\r\n variant = \"default\",\r\n maxItems = 5,\r\n showHome = false,\r\n homeHref = \"/\",\r\n collapsible = true\r\n}) => {\r\n const [isCollapsed, setIsCollapsed] = React.useState(false);\r\n \r\n React.useEffect(() => {\r\n if (collapsible && items.length > maxItems) {\r\n setIsCollapsed(true);\r\n }\r\n }, [items.length, maxItems, collapsible]);\r\n\r\n const getSeparator = () => {\r\n if (typeof separator === 'string') {\r\n return <span className=\"text-muted-foreground\">{separator}</span>;\r\n }\r\n \r\n if (variant === \"slash\") {\r\n return <span className=\"text-muted-foreground\">/</span>;\r\n }\r\n \r\n if (variant === \"arrow\") {\r\n return <span className=\"text-muted-foreground\">→</span>;\r\n }\r\n \r\n const SeparatorComponent = separator;\r\n return <SeparatorComponent className={cn(\"text-muted-foreground\", sizeStyles[size].icon)} />;\r\n };\r\n\r\n const processedItems = React.useMemo(() => {\r\n let finalItems = [...items];\r\n \r\n if (showHome && finalItems[0]?.href !== homeHref) {\r\n finalItems.unshift({\r\n label: \"Home\",\r\n href: homeHref,\r\n icon: Home\r\n });\r\n }\r\n\r\n if (isCollapsed && finalItems.length > maxItems) {\r\n const firstItems = finalItems.slice(0, 1);\r\n const lastItems = finalItems.slice(-(maxItems - 2));\r\n finalItems = [...firstItems, { label: \"...\", disabled: true }, ...lastItems];\r\n }\r\n\r\n return finalItems;\r\n }, [items, showHome, homeHref, isCollapsed, maxItems]);\r\n\r\n const handleCollapseToggle = () => {\r\n setIsCollapsed(!isCollapsed);\r\n };\r\n\r\n return (\r\n <nav \r\n className={cn(\"flex w-full items-center\", sizeStyles[size].text, className)} \r\n aria-label=\"Breadcrumb navigation\"\r\n >\r\n <ol className={cn(\"flex items-center\", sizeStyles[size].spacing)}>\r\n {processedItems.map((item, index) => {\r\n const isLast = index === processedItems.length - 1;\r\n const isCollapsedIndicator = item.label === \"...\";\r\n const Icon = item.icon;\r\n\r\n return (\r\n <li key={`${item.label}-${index}`} className=\"flex items-center\">\r\n {isCollapsedIndicator ? (\r\n <button\r\n onClick={handleCollapseToggle}\r\n className={cn(\r\n \"inline-flex items-center gap-1 transition-all duration-200\",\r\n \"hover:bg-accent rounded-md\",\r\n sizeStyles[size].padding,\r\n \"focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-1\"\r\n )}\r\n aria-label=\"Show all breadcrumb items\"\r\n >\r\n <MoreHorizontal className={sizeStyles[size].icon} />\r\n </button>\r\n ) : item.href && !isLast && !item.disabled ? (\r\n <Link \r\n href={item.href}\r\n className={cn(\r\n \"inline-flex items-center gap-1 font-medium transition-all duration-200\",\r\n variantStyles[variant],\r\n variant === \"pill\" && sizeStyles[size].padding,\r\n \"focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-1 rounded-sm\"\r\n )}\r\n >\r\n {Icon && <Icon className={sizeStyles[size].icon} />}\r\n <span>{item.label}</span>\r\n </Link>\r\n ) : (\r\n <span \r\n className={cn(\r\n \"inline-flex items-center gap-1 font-medium\",\r\n isLast \r\n ? \"text-foreground\" \r\n : item.disabled \r\n ? \"text-muted-foreground/60 cursor-not-allowed\"\r\n : \"text-muted-foreground\",\r\n variant === \"pill\" && !isLast && sizeStyles[size].padding\r\n )}\r\n aria-current={isLast ? \"page\" : undefined}\r\n >\r\n {Icon && <Icon className={sizeStyles[size].icon} />}\r\n <span>{item.label}</span>\r\n </span>\r\n )}\r\n\r\n {!isLast && (\r\n <span \r\n className={cn(\"mx-1\", sizeStyles[size].spacing)} \r\n role=\"presentation\"\r\n aria-hidden=\"true\"\r\n >\r\n {getSeparator()}\r\n </span>\r\n )}\r\n </li>\r\n );\r\n })}\r\n </ol>\r\n </nav>\r\n );\r\n};\r\n\r\n// Specialized Breadcrumb components\r\ninterface SimpleBreadcrumbProps {\r\n items: string[];\r\n baseHref?: string;\r\n className?: string;\r\n}\r\n\r\nexport const SimpleBreadcrumb: React.FC<SimpleBreadcrumbProps> = ({\r\n items,\r\n baseHref = \"\",\r\n className\r\n}) => {\r\n const breadcrumbItems = items.map((item, index) => ({\r\n label: item,\r\n href: index < items.length - 1 ? `${baseHref}/${item.toLowerCase()}` : undefined\r\n }));\r\n\r\n return (\r\n <Breadcrumb \r\n items={breadcrumbItems}\r\n variant=\"simple\"\r\n className={className}\r\n />\r\n );\r\n};\r\n\r\ninterface IconBreadcrumbProps extends Omit<BreadcrumbProps, 'items'> {\r\n items: Array<{\r\n label: string;\r\n href?: string;\r\n icon: React.ComponentType<{ className?: string }>;\r\n }>;\r\n}\r\n\r\nexport const IconBreadcrumb: React.FC<IconBreadcrumbProps> = ({\r\n items,\r\n ...props\r\n}) => {\r\n return <Breadcrumb items={items} {...props} />;\r\n};\r\n\r\ninterface CompactBreadcrumbProps extends BreadcrumbProps {\r\n alwaysShowFirst?: boolean;\r\n alwaysShowLast?: boolean;\r\n}\r\n\r\nexport const CompactBreadcrumb: React.FC<CompactBreadcrumbProps> = ({\r\n alwaysShowFirst = true,\r\n alwaysShowLast = true,\r\n maxItems = 3,\r\n ...props\r\n}) => {\r\n return (\r\n <Breadcrumb \r\n {...props}\r\n maxItems={maxItems}\r\n collapsible={true}\r\n size=\"sm\"\r\n variant=\"pill\"\r\n />\r\n );\r\n};\r\n\r\nexport default Breadcrumb;\r\n","\"use client\";\r\n\r\nimport * as React from \"react\";\r\nimport { cn } from \"@/lib/utils/cn\";\r\n\r\ninterface Tab {\r\n label: string;\r\n value: string;\r\n content: React.ReactNode;\r\n icon?: React.ComponentType<{ className?: string }>;\r\n disabled?: boolean;\r\n}\r\n\r\ninterface TabsProps {\r\n tabs: Tab[];\r\n defaultValue?: string;\r\n className?: string;\r\n variant?: \"default\" | \"pills\" | \"underline\" | \"card\" | \"underline-card\";\r\n size?: \"sm\" | \"md\" | \"lg\";\r\n orientation?: \"horizontal\" | \"vertical\";\r\n onTabChange?: (value: string) => void;\r\n stretch?: boolean; // evenly distribute tabs (horizontal)\r\n}\r\n\r\nconst sizeStyles = {\r\n sm: {\r\n tab: \"py-1.5 px-3 text-xs\",\r\n content: \"mt-3 p-3\",\r\n },\r\n md: {\r\n tab: \"py-2 px-4 text-sm\",\r\n content: \"mt-4 p-4\",\r\n },\r\n lg: {\r\n tab: \"py-3 px-6 text-base\",\r\n content: \"mt-6 p-6\",\r\n },\r\n};\r\n\r\nconst variantStyles = {\r\n default: {\r\n container: \"border-b border-border\",\r\n tab: \"border-b-2 border-transparent hover:border-border/60\",\r\n activeTab: \"border-primary text-primary\",\r\n inactiveTab: \"text-muted-foreground hover:text-foreground\",\r\n },\r\n pills: {\r\n container: \"bg-muted p-1 rounded-lg\",\r\n tab: \"rounded-md transition-all duration-200\",\r\n activeTab: \"bg-background text-foreground shadow-sm\",\r\n inactiveTab: \"text-muted-foreground hover:text-foreground hover:bg-background/50\",\r\n },\r\n underline: {\r\n container: \"relative border-b border-border\",\r\n tab: \"relative transition-colors duration-200 pb-3 border-b-2 border-transparent hover:border-border/60\",\r\n activeTab: \"text-primary border-primary font-medium\",\r\n inactiveTab: \"text-muted-foreground hover:text-foreground\",\r\n },\r\n card: {\r\n container: \"space-y-1\",\r\n tab: \"rounded-lg border border-transparent transition-all duration-200\",\r\n activeTab: \"bg-primary text-primary-foreground border-primary\",\r\n inactiveTab: \"text-muted-foreground hover:text-foreground hover:bg-accent/50 hover:border-border hover:shadow-sm\",\r\n },\r\n \"underline-card\": {\r\n container: \"border-b border-border bg-card rounded-t-lg\",\r\n tab: \"relative transition-all duration-200 pb-3 px-4 border-b-2 border-transparent hover:border-primary/50 hover:bg-accent/30\",\r\n activeTab: \"text-primary border-primary font-medium bg-accent/20\",\r\n inactiveTab: \"text-muted-foreground hover:text-foreground\",\r\n },\r\n};\r\n\r\nexport const Tabs: React.FC<TabsProps> = ({ \r\n tabs, \r\n defaultValue, \r\n className,\r\n variant = \"default\",\r\n size = \"md\",\r\n orientation = \"horizontal\",\r\n onTabChange,\r\n stretch = false\r\n}) => {\r\n const [active, setActive] = React.useState<string>(defaultValue || tabs[0]?.value);\r\n const [underlineStyle, setUnderlineStyle] = React.useState<React.CSSProperties>({});\r\n const tabRefs = React.useRef<(HTMLButtonElement | null)[]>([]);\r\n // Generate a deterministic base id from tab values to avoid SSR/client mismatch\n const baseId = React.useMemo(() => {\n const key = tabs.map((t) => t.value).join(\"-\");\n return `tabs-${key || 'default'}`;\n }, [tabs]);\n\r\n const handleTabChange = (value: string) => {\r\n setActive(value);\r\n onTabChange?.(value);\r\n };\r\n\r\n // Update underline position for underline variant\r\n React.useEffect(() => {\r\n if (variant === \"underline\" && orientation === \"horizontal\") {\r\n const activeIndex = tabs.findIndex(tab => tab.value === active);\r\n const activeTab = tabRefs.current[activeIndex];\r\n \r\n if (activeTab) {\r\n const { offsetLeft, offsetWidth } = activeTab;\r\n setUnderlineStyle({\r\n left: offsetLeft,\r\n width: offsetWidth,\r\n });\r\n }\r\n }\r\n }, [active, variant, orientation, tabs]);\r\n\r\n const containerClasses = cn(\r\n \"w-full\",\r\n orientation === \"horizontal\" ? \"flex space-x-1 overflow-x-auto\" : \"flex flex-col space-y-1\",\r\n variantStyles[variant].container,\r\n className\r\n );\r\n\r\n const activeTab = tabs.find((tab) => tab.value === active);\r\n\r\n return (\r\n <div className={cn(\"w-full\", orientation === \"vertical\" && \"flex gap-6\")}>\r\n {/* Tab List */}\r\n <div className={containerClasses} role=\"tablist\" aria-orientation={orientation}>\r\n {tabs.map((tab, index) => {\r\n const isActive = active === tab.value;\r\n const Icon = tab.icon;\r\n const tabId = `${baseId}-tab-${index}`;\r\n const panelId = `${baseId}-panel-${index}`;\r\n \r\n return (\r\n <button\r\n key={tab.value}\r\n ref={(el) => { tabRefs.current[index] = el; }}\r\n onClick={() => !tab.disabled && handleTabChange(tab.value)}\r\n disabled={tab.disabled}\r\n style={{\r\n boxShadow: 'none',\r\n transform: 'none',\r\n outline: 'none',\r\n border: 'none'\r\n }}\r\n className={cn(\r\n \"font-medium transition-all duration-200 cursor-pointer flex items-center gap-2\",\r\n \"focus:outline-none focus-visible:outline-none\",\r\n \"disabled:opacity-50 disabled:cursor-not-allowed\",\r\n \"border-0 bg-transparent outline-none\", // Reset button default styles\r\n sizeStyles[size].tab,\r\n variantStyles[variant].tab,\r\n isActive\r\n ? variantStyles[variant].activeTab\r\n : variantStyles[variant].inactiveTab,\r\n orientation === \"vertical\" && \"justify-start w-full\",\r\n stretch && orientation === \"horizontal\" && \"flex-1 justify-center\"\r\n )}\r\n role=\"tab\"\r\n id={tabId}\r\n aria-selected={isActive}\r\n aria-controls={panelId}\r\n tabIndex={isActive ? 0 : -1}\r\n onKeyDown={(e) => {\r\n const count = tabs.length;\r\n const idx = tabs.findIndex(t => t.value === active);\r\n let next = idx;\r\n if (orientation === 'horizontal') {\r\n if (e.key === 'ArrowRight') next = (idx + 1) % count;\r\n if (e.key === 'ArrowLeft') next = (idx - 1 + count) % count;\r\n } else {\r\n if (e.key === 'ArrowDown') next = (idx + 1) % count;\r\n if (e.key === 'ArrowUp') next = (idx - 1 + count) % count;\r\n }\r\n if (e.key === 'Home') next = 0;\r\n if (e.key === 'End') next = count - 1;\r\n if (next !== idx) {\r\n e.preventDefault();\r\n const nextVal = tabs[next].value;\r\n handleTabChange(nextVal);\r\n tabRefs.current[next]?.focus();\r\n }\r\n }}\r\n >\r\n {Icon && <Icon className=\"h-4 w-4\" />}\r\n {tab.label}\r\n </button>\r\n );\r\n })}\r\n \r\n {/* Underline indicator for underline variant */}\r\n {variant === \"underline\" && orientation === \"horizontal\" && (\r\n <div \r\n className=\"absolute bottom-0 h-0.5 bg-primary transition-all duration-300 ease-out\"\r\n style={underlineStyle}\r\n />\r\n )}\r\n </div>\r\n\r\n {/* Tab Content */}\r\n <div\r\n role=\"tabpanel\"\r\n id={`${baseId}-panel-${tabs.findIndex(t => t.value === active)}`}\r\n aria-labelledby={`${baseId}-tab-${tabs.findIndex(t => t.value === active)}`}\r\n className={cn(\r\n \"bg-card rounded-lg border border-border shadow-sm text-card-foreground transition-all duration-200\",\r\n sizeStyles[size].content,\r\n orientation === \"vertical\" && \"flex-1\"\r\n )}\r\n tabIndex={0}\r\n >\r\n {activeTab?.content}\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\n// Additional Tab components for specific use cases\r\ninterface SimpleTabsProps {\r\n tabs: Array<{\r\n label: string;\r\n value: string;\r\n content: React.ReactNode;\r\n }>;\r\n defaultValue?: string;\r\n className?: string;\r\n}\r\n\r\nexport const SimpleTabs: React.FC<SimpleTabsProps> = ({ tabs, defaultValue, className }) => {\r\n return (\r\n <Tabs \r\n tabs={tabs} \r\n defaultValue={defaultValue} \r\n className={className}\r\n variant=\"default\"\r\n size=\"sm\"\r\n />\r\n );\r\n};\r\n\r\ninterface PillTabsProps extends TabsProps {\r\n contained?: boolean;\r\n}\r\n\r\nexport const PillTabs: React.FC<PillTabsProps> = ({ contained = true, ...props }) => {\r\n return (\r\n <Tabs \r\n {...props}\r\n variant=\"pills\"\r\n className={cn(contained && \"max-w-fit\", props.className)}\r\n />\r\n );\r\n};\r\n\r\ninterface VerticalTabsProps extends TabsProps {\r\n sidebarWidth?: string;\r\n}\r\n\r\nexport const VerticalTabs: React.FC<VerticalTabsProps> = ({ \r\n sidebarWidth = \"w-48\", \r\n className,\r\n ...props \r\n}) => {\r\n return (\r\n <div className={cn(\"flex gap-6\", className)}>\r\n <div className={cn(sidebarWidth, \"shrink-0\")}>\r\n <Tabs \r\n {...props}\r\n orientation=\"vertical\"\r\n variant=\"card\"\r\n className=\"w-full\"\r\n />\r\n </div>\r\n </div>\r\n );\r\n};\r\n","\"use client\";\r\n\r\nimport { cn } from \"@/lib/utils/cn\";\r\nimport { useShadCNAnimations } from \"@/lib/utils/shadcn-animations\";\r\nimport React, { useState } from \"react\";\r\nimport { createPortal } from \"react-dom\";\r\n\r\ninterface DropdownMenuProps {\r\n trigger: React.ReactElement;\r\n children?: React.ReactNode;\r\n className?: string;\r\n contentClassName?: string;\r\n placement?: \"top\" | \"bottom\" | \"left\" | \"right\" | \"top-start\" | \"bottom-start\" | \"top-end\" | \"bottom-end\";\r\n closeOnSelect?: boolean;\r\n disabled?: boolean;\r\n // Alternative API props\r\n isOpen?: boolean;\r\n onOpenChange?: (open: boolean) => void;\r\n items?: Array<{\r\n label: string;\r\n icon?: React.ComponentType<any>;\r\n onClick: () => void;\r\n disabled?: boolean;\r\n destructive?: boolean;\r\n }>;\r\n}\r\n\r\nconst DropdownMenu: React.FC<DropdownMenuProps> = ({\r\n trigger,\r\n children,\r\n className,\r\n contentClassName,\r\n placement = \"bottom-start\",\r\n closeOnSelect = true,\r\n disabled = false,\r\n isOpen,\r\n onOpenChange,\r\n items,\r\n}) => {\r\n const [internalOpen, setInternalOpen] = useState(false);\r\n const [position, setPosition] = useState<{ top: number; left: number } | null>(null);\r\n const triggerRef = React.useRef<HTMLElement>(null);\r\n const contentRef = React.useRef<HTMLDivElement>(null);\r\n const itemsRef = React.useRef<HTMLButtonElement[]>([]);\r\n const [activeIndex, setActiveIndex] = useState<number>(-1);\r\n\r\n // Inject ShadCN animations\r\n useShadCNAnimations();\r\n\r\n const open = isOpen !== undefined ? isOpen : internalOpen;\r\n const setOpen = onOpenChange || setInternalOpen;\r\n\r\n // Calculate position\r\n React.useEffect(() => {\r\n if (open && triggerRef.current && contentRef.current) {\r\n const rect = triggerRef.current.getBoundingClientRect();\r\n const menuRect = contentRef.current.getBoundingClientRect();\r\n const viewportHeight = window.innerHeight;\r\n\r\n let top = rect.bottom + 4;\r\n let left = rect.left;\r\n\r\n // Auto-flip to top if dropdown would go below viewport\r\n if (rect.bottom + menuRect.height > viewportHeight && rect.top > menuRect.height) {\r\n top = rect.top - menuRect.height - 4;\r\n }\r\n\r\n switch (placement) {\r\n case \"top\":\r\n case \"top-start\":\r\n top = rect.top - menuRect.height - 4;\r\n break;\r\n case \"top-end\":\r\n top = rect.top - menuRect.height - 4;\r\n left = rect.right - menuRect.width;\r\n break;\r\n case \"bottom\":\r\n case \"bottom-start\":\r\n // Auto-flip logic above already handles this\r\n break;\r\n case \"bottom-end\":\r\n left = rect.right - menuRect.width;\r\n break;\r\n case \"left\":\r\n top = rect.top;\r\n left = rect.left - menuRect.width - 4;\r\n break;\r\n case \"right\":\r\n top = rect.top;\r\n left = rect.right + 4;\r\n break;\r\n }\r\n\r\n setPosition({ top, left });\r\n }\r\n // Reset keyboard focus index when opened\r\n if (open) setActiveIndex(-1);\r\n }, [open, placement]);\r\n\r\n // Handle clicks outside\r\n React.useEffect(() => {\r\n if (!open) return;\r\n\r\n const handleClickOutside = (event: MouseEvent) => {\r\n const target = event.target as Node;\r\n if (triggerRef.current && !triggerRef.current.contains(target)) {\r\n const dropdown = document.querySelector(\"[data-dropdown-menu]\") as Element;\r\n if (dropdown && !dropdown.contains(target)) {\r\n setOpen(false);\r\n }\r\n }\r\n };\r\n\r\n const handleEscape = (event: KeyboardEvent) => {\r\n if (event.key === \"Escape\") {\r\n setOpen(false);\r\n }\r\n };\r\n\r\n document.addEventListener(\"mousedown\", handleClickOutside);\r\n document.addEventListener(\"keydown\", handleEscape);\r\n const handleKeyNav = (e: KeyboardEvent) => {\r\n if (!contentRef.current) return;\r\n const enabled = itemsRef.current.filter((el) => el && !el.disabled);\r\n if (enabled.length === 0) return;\r\n if (e.key === \"ArrowDown\") {\r\n e.preventDefault();\r\n const next = (activeIndex + 1 + enabled.length) % enabled.length;\r\n setActiveIndex(next);\r\n enabled[next]?.focus();\r\n } else if (e.key === \"ArrowUp\") {\r\n e.preventDefault();\r\n const prev = (activeIndex - 1 + enabled.length) % enabled.length;\r\n setActiveIndex(prev);\r\n enabled[prev]?.focus();\r\n } else if (e.key === \"Home\") {\r\n e.preventDefault();\r\n setActiveIndex(0);\r\n enabled[0]?.focus();\r\n } else if (e.key === \"End\") {\r\n e.preventDefault();\r\n setActiveIndex(enabled.length - 1);\r\n enabled[enabled.length - 1]?.focus();\r\n }\r\n };\r\n document.addEventListener(\"keydown\", handleKeyNav);\r\n\r\n return () => {\r\n document.removeEventListener(\"mousedown\", handleClickOutside);\r\n document.removeEventListener(\"keydown\", handleEscape);\r\n document.removeEventListener(\"keydown\", handleKeyNav);\r\n };\r\n }, [open, setOpen, activeIndex]);\r\n\r\n const handleTriggerClick = () => {\r\n if (!disabled) {\r\n setOpen(!open);\r\n }\r\n };\r\n\r\n const handleItemClick = (itemOnClick: () => void) => {\r\n itemOnClick();\r\n if (closeOnSelect) {\r\n setOpen(false);\r\n }\r\n };\r\n\r\n const dropdownContent = open ? (\r\n <div\r\n data-dropdown-menu\r\n data-combobox-dropdown\r\n ref={contentRef}\r\n style={{\r\n position: \"fixed\",\r\n top: position?.top ?? -9999,\r\n left: position?.left ?? -9999,\r\n zIndex: 9999,\r\n visibility: position ? \"visible\" : \"hidden\",\r\n transformOrigin: \"top center\",\r\n }}\r\n data-state={open ? \"open\" : \"closed\"}\r\n role=\"menu\"\r\n className={cn(\"z-9999 min-w-40\", className)}\r\n >\r\n <div\r\n className={cn(\r\n \"rounded-md border bg-popover text-popover-foreground shadow-md\",\r\n \"backdrop-blur-sm bg-popover/95 border-border/60 p-1\",\r\n contentClassName\r\n )}\r\n >\r\n {items\r\n ? items.map((item, index) => {\r\n const IconComponent = item.icon;\r\n return (\r\n <button\r\n key={index}\r\n ref={(el) => {\r\n if (el) itemsRef.current[index] = el;\r\n }}\r\n onClick={() => handleItemClick(item.onClick)}\r\n disabled={item.disabled}\r\n role=\"menuitem\"\r\n tabIndex={-1}\r\n style={{\r\n animationDelay: open ? `${Math.min(index * 20, 200)}ms` : \"0ms\",\r\n }}\r\n className={cn(\r\n \"dropdown-item flex w-full items-center gap-2 px-2.5 py-1.5 text-sm rounded-sm\",\r\n \"outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background\",\r\n \"hover:bg-accent hover:text-accent-foreground\",\r\n \"focus:bg-accent focus:text-accent-foreground\",\r\n \"disabled:opacity-50 disabled:cursor-not-allowed\",\r\n item.destructive && \"text-destructive hover:bg-destructive/10 focus:bg-destructive/10\"\r\n )}\r\n >\r\n {IconComponent && <IconComponent className=\"h-4 w-4\" />}\r\n {item.label}\r\n </button>\r\n );\r\n })\r\n : children}\r\n </div>\r\n </div>\r\n ) : null;\r\n\r\n return (\r\n <>\r\n {React.cloneElement(trigger, {\r\n ref: triggerRef,\r\n onClick: handleTriggerClick,\r\n \"aria-expanded\": open,\r\n \"aria-haspopup\": \"menu\",\r\n className: cn(\r\n // keep original classes on trigger\r\n (trigger.props as any)?.className,\r\n // ensure focus-visible ring for trigger too\r\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background rounded-md\"\r\n ),\r\n } as any)}\r\n {dropdownContent && typeof window !== \"undefined\" && createPortal(dropdownContent, document.body)}\r\n </>\r\n );\r\n};\r\n\r\n// Additional components for backward compatibility\r\nexport const DropdownMenuItem: React.FC<{\r\n children: React.ReactNode;\r\n onClick?: () => void;\r\n disabled?: boolean;\r\n destructive?: boolean;\r\n className?: string;\r\n}> = ({ children, onClick, disabled, destructive, className }) => (\r\n <button\r\n onClick={onClick}\r\n disabled={disabled}\r\n className={cn(\r\n \"flex w-full items-center gap-2 px-3 py-2 text-sm rounded-md transition-colors\",\r\n \"hover:bg-accent hover:text-accent-foreground\",\r\n \"focus:bg-accent focus:text-accent-foreground focus:outline-none\",\r\n \"disabled:opacity-50 disabled:cursor-not-allowed\",\r\n destructive && \"text-destructive hover:bg-destructive/10 focus:bg-destructive/10\",\r\n className\r\n )}\r\n >\r\n {children}\r\n </button>\r\n);\r\n\r\nexport const DropdownMenuSeparator: React.FC<{ className?: string }> = ({ className }) => <div className={cn(\"h-px bg-border my-1\", className)} />;\r\n\r\nexport const SelectDropdown: React.FC<{\r\n options: string[];\r\n value?: string;\r\n onChange: (value: string) => void;\r\n placeholder?: string;\r\n className?: string;\r\n}> = ({ options, value, onChange, placeholder = \"Select...\", className }) => (\r\n <DropdownMenu\r\n trigger={\r\n <button\r\n className={cn(\r\n \"inline-flex items-center justify-between gap-2 px-3 py-2 text-sm rounded-md border bg-background border-border/60\",\r\n \"hover:bg-accent/50\",\r\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background\",\r\n className\r\n )}\r\n >\r\n <span className=\"truncate max-w-64 text-foreground/90\">{value || placeholder}</span>\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"none\" className=\"opacity-70\">\r\n <path d=\"M6 8l4 4 4-4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\r\n </svg>\r\n </button>\r\n }\r\n items={options.map((option) => ({\r\n label: option,\r\n onClick: () => onChange(option),\r\n }))}\r\n />\r\n);\r\n\r\nexport { DropdownMenu };\r\nexport default DropdownMenu;\r\n","\"use client\";\r\n\r\nimport * as React from \"react\";\r\nimport { cn } from \"@/lib/utils/cn\";\r\nimport { ChevronLeft, ChevronRight, MoreHorizontal, ChevronsLeft, ChevronsRight } from \"lucide-react\";\r\nimport Button from \"./Button\";\r\nimport { Combobox } from \"./Combobox\";\r\nimport { useTranslations } from \"@/lib/i18n/translation-adapter\";\r\n\r\nexport interface PaginationProps {\r\n page: number;\r\n totalPages: number;\r\n onChange: (page: number) => void;\r\n className?: string;\r\n size?: \"sm\" | \"md\" | \"lg\";\r\n variant?: \"default\" | \"outline\" | \"ghost\";\r\n showFirstLast?: boolean;\r\n showPrevNext?: boolean;\r\n showPageNumbers?: boolean;\r\n showInfo?: boolean;\r\n disabled?: boolean;\r\n alignment?: \"left\" | \"center\" | \"right\";\r\n // For page size selector\r\n pageSize?: number;\r\n pageSizeOptions?: number[];\r\n onPageSizeChange?: (size: number) => void;\r\n totalItems?: number;\r\n labels?: {\r\n navigationLabel?: string;\r\n showingResults?: (ctx: { startItem: number; endItem: number; totalItems?: number }) => string;\r\n firstPage?: string;\r\n previousPage?: string;\r\n previous?: string;\r\n nextPage?: string;\r\n next?: string;\r\n lastPage?: string;\r\n itemsPerPage?: string;\r\n search?: string;\r\n noOptions?: string;\r\n pageNumber?: (page: number) => string;\r\n };\r\n}\r\n\r\nexport const Pagination: React.FC<PaginationProps> = ({\r\n page,\r\n totalPages,\r\n onChange,\r\n className,\r\n size = \"md\",\r\n variant = \"outline\",\r\n showFirstLast = true,\r\n showPrevNext = true,\r\n showPageNumbers = true,\r\n showInfo = false,\r\n disabled = false,\r\n alignment = \"left\",\r\n pageSize,\r\n pageSizeOptions,\r\n onPageSizeChange,\r\n totalItems,\r\n labels,\r\n}) => {\r\n const t = useTranslations(\"Pagination\");\r\n\r\n const getTextAlignmentClass = (align: \"left\" | \"center\" | \"right\") => {\r\n switch (align) {\r\n case \"left\":\r\n return \"text-left\";\r\n case \"center\":\r\n return \"text-center\";\r\n case \"right\":\r\n return \"text-right\";\r\n }\r\n };\r\n\r\n const textAlignmentClass = getTextAlignmentClass(alignment);\r\n\r\n const createPageArray = () => {\r\n const delta = 2;\r\n const range: (number | string)[] = [];\r\n const left = Math.max(2, page - delta);\r\n const right = Math.min(totalPages - 1, page + delta);\r\n\r\n range.push(1);\r\n if (left > 2) range.push(\"...\");\r\n\r\n for (let i = left; i <= right; i++) {\r\n range.push(i);\r\n }\r\n\r\n if (right < totalPages - 1) range.push(\"...\");\r\n if (totalPages > 1) range.push(totalPages);\r\n\r\n return range;\r\n };\r\n\r\n // Helper function to get button variant based on active state\r\n const getButtonVariant = (isActive: boolean) => {\r\n if (isActive) return \"primary\";\r\n return variant === \"default\" ? \"default\" : variant;\r\n };\r\n\r\n // Keyboard navigation\r\n React.useEffect(() => {\r\n if (disabled) return;\r\n\r\n const handleKey = (e: KeyboardEvent) => {\r\n if (e.target && (e.target as HTMLElement).tagName === \"INPUT\") return; // Don't interfere with input fields\r\n\r\n if (e.key === \"ArrowRight\" || e.key === \"PageDown\") {\r\n e.preventDefault();\r\n onChange(Math.min(totalPages, page + 1));\r\n }\r\n if (e.key === \"ArrowLeft\" || e.key === \"PageUp\") {\r\n e.preventDefault();\r\n onChange(Math.max(1, page - 1));\r\n }\r\n if (e.key === \"Home\") {\r\n e.preventDefault();\r\n onChange(1);\r\n }\r\n if (e.key === \"End\") {\r\n e.preventDefault();\r\n onChange(totalPages);\r\n }\r\n };\r\n\r\n window.addEventListener(\"keydown\", handleKey);\r\n return () => window.removeEventListener(\"keydown\", handleKey);\r\n }, [page, totalPages, onChange, disabled]);\r\n\r\n // Calculate display info\r\n const startItem = totalItems ? (page - 1) * (pageSize || 10) + 1 : null;\r\n const endItem = totalItems ? Math.min(page * (pageSize || 10), totalItems) : null;\r\n\r\n // Convert pageSize options to string array for Combobox\r\n const pageSizeOptionsStrings = pageSizeOptions?.map((size) => size.toString()) || [];\r\n\r\n const handlePageSizeChange = (value: string) => {\r\n if (onPageSizeChange) {\r\n onPageSizeChange(Number(value));\r\n }\r\n };\r\n\r\n if (totalPages <= 1) return null;\r\n\r\n return (\r\n <nav className={cn(\"flex flex-col gap-4\", className)} aria-label={labels?.navigationLabel || t(\"navigationLabel\")}>\r\n {/* Info Display */}\r\n {showInfo && totalItems && (\r\n <div className={cn(\"text-sm text-muted-foreground\", textAlignmentClass)}>\r\n {labels?.showingResults\r\n ? labels.showingResults({ startItem: startItem || 0, endItem: endItem || 0, totalItems })\r\n : t(\"showingResults\", { startItem: startItem || 0, endItem: endItem || 0, totalItems })}\r\n </div>\r\n )}\r\n\r\n <div\r\n className={cn(\"flex items-center justify-between\", {\r\n \"flex-row-reverse\": alignment === \"right\" || alignment === \"center\",\r\n })}\r\n >\r\n <div className={cn(\"flex items-center gap-1\")}>\r\n {/* First Page */}\r\n {showFirstLast && (\r\n <Button\r\n variant={getButtonVariant(false)}\r\n size={size}\r\n icon={ChevronsLeft}\r\n onClick={() => onChange(1)}\r\n disabled={disabled || page === 1}\r\n className=\"hidden sm:flex\"\r\n title={labels?.firstPage || t(\"firstPage\")}\r\n aria-label={labels?.firstPage || t(\"firstPage\")}\r\n aria-disabled={disabled || page === 1}\r\n />\r\n )}\r\n\r\n {/* Previous Page */}\r\n {showPrevNext && (\r\n <Button\r\n variant={getButtonVariant(false)}\r\n size={size}\r\n icon={ChevronLeft}\r\n onClick={() => onChange(Math.max(1, page - 1))}\r\n disabled={disabled || page === 1}\r\n title={labels?.previousPage || t(\"previousPage\")}\r\n aria-label={labels?.previousPage || t(\"previousPage\")}\r\n aria-disabled={disabled || page === 1}\r\n >\r\n <span className=\"hidden sm:inline\">{labels?.previous || t(\"previous\")}</span>\r\n </Button>\r\n )}\r\n\r\n {/* Page Numbers */}\r\n {showPageNumbers &&\r\n createPageArray().map((p, i) => {\r\n if (p === \"...\") {\r\n return <Button key={i} variant=\"ghost\" size={size} disabled icon={MoreHorizontal} className=\"cursor-default\" />;\r\n }\r\n\r\n const pageNumber = p as number;\r\n const isActive = page === pageNumber;\r\n\r\n return (\r\n <Button\r\n key={i}\r\n variant={getButtonVariant(isActive)}\r\n size={size}\r\n onClick={() => onChange(pageNumber)}\r\n disabled={disabled}\r\n className={cn(\"min-w-10\", isActive && \"font-semibold\")}\r\n aria-label={labels?.pageNumber ? labels.pageNumber(pageNumber) : t(\"pageNumber\", { page: pageNumber })}\r\n aria-current={isActive ? \"page\" : undefined}\r\n >\r\n {pageNumber}\r\n </Button>\r\n );\r\n })}\r\n\r\n {/* Next Page */}\r\n {showPrevNext && (\r\n <Button\r\n variant={getButtonVariant(false)}\r\n size={size}\r\n iconRight={ChevronRight}\r\n onClick={() => onChange(Math.min(totalPages, page + 1))}\r\n disabled={disabled || page === totalPages}\r\n title={labels?.nextPage || t(\"nextPage\")}\r\n aria-label={labels?.nextPage || t(\"nextPage\")}\r\n aria-disabled={disabled || page === totalPages}\r\n >\r\n <span className=\"hidden sm:inline\">{labels?.next || t(\"next\")}</span>\r\n </Button>\r\n )}\r\n\r\n {/* Last Page */}\r\n {showFirstLast && (\r\n <Button\r\n variant={getButtonVariant(false)}\r\n size={size}\r\n icon={ChevronsRight}\r\n onClick={() => onChange(totalPages)}\r\n disabled={disabled || page === totalPages}\r\n className=\"hidden sm:flex\"\r\n title={labels?.lastPage || t(\"lastPage\")}\r\n aria-label={labels?.lastPage || t(\"lastPage\")}\r\n aria-disabled={disabled || page === totalPages}\r\n />\r\n )}\r\n </div>\r\n\r\n {/* Page Size Selector */}\r\n {pageSizeOptions && onPageSizeChange && (\r\n <div className={cn(\"flex items-center gap-2 text-sm\")}>\r\n <span className=\"text-muted-foreground\">{labels?.itemsPerPage || t(\"itemsPerPage\")}:</span>\r\n <div className=\"w-20\">\r\n <Combobox\r\n options={pageSizeOptionsStrings}\r\n value={pageSize?.toString() || \"10\"}\r\n onChange={handlePageSizeChange}\r\n placeholder=\"10\"\r\n searchPlaceholder={labels?.search || t(\"search\")}\r\n emptyText={labels?.noOptions || t(\"noOptions\")}\r\n disabled={disabled}\r\n />\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n </nav>\r\n );\r\n};\r\n\r\n// Simple Pagination - minimal version with just prev/next\r\nexport interface SimplePaginationProps {\r\n page: number;\r\n totalPages: number;\r\n onChange: (page: number) => void;\r\n className?: string;\r\n size?: \"sm\" | \"md\" | \"lg\";\r\n variant?: \"default\" | \"outline\" | \"ghost\";\r\n disabled?: boolean;\r\n showInfo?: boolean;\r\n totalItems?: number;\r\n pageSize?: number;\r\n}\r\n\r\nexport const SimplePagination: React.FC<SimplePaginationProps> = ({\r\n page,\r\n totalPages,\r\n onChange,\r\n className,\r\n size = \"md\",\r\n variant = \"outline\",\r\n disabled = false,\r\n showInfo = false,\r\n totalItems,\r\n pageSize = 10,\r\n}) => {\r\n if (totalPages <= 1) return null;\r\n\r\n return (\r\n <div className={cn(\"flex flex-col gap-2\", className)}>\r\n {showInfo && totalItems && (\r\n <div className=\"text-sm text-muted-foreground text-center\">\r\n Page {page} of {totalPages} ({totalItems} total items)\r\n </div>\r\n )}\r\n\r\n <div className=\"flex items-center justify-between\">\r\n <Button variant={variant} size={size} icon={ChevronLeft} onClick={() => onChange(Math.max(1, page - 1))} disabled={disabled || page === 1}>\r\n Previous\r\n </Button>\r\n\r\n <div className=\"flex items-center gap-2 text-sm text-muted-foreground\">\r\n <span>Page</span>\r\n <span className=\"font-medium text-foreground\">{page}</span>\r\n <span>of</span>\r\n <span className=\"font-medium text-foreground\">{totalPages}</span>\r\n </div>\r\n\r\n <Button\r\n variant={variant}\r\n size={size}\r\n iconRight={ChevronRight}\r\n onClick={() => onChange(Math.min(totalPages, page + 1))}\r\n disabled={disabled || page === totalPages}\r\n >\r\n Next\r\n </Button>\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\n// Compact Pagination - icon only version\r\nexport interface CompactPaginationProps {\r\n page: number;\r\n totalPages: number;\r\n onChange: (page: number) => void;\r\n className?: string;\r\n variant?: \"default\" | \"outline\" | \"ghost\";\r\n disabled?: boolean;\r\n}\r\n\r\nexport const CompactPagination: React.FC<CompactPaginationProps> = ({\r\n page,\r\n totalPages,\r\n onChange,\r\n className,\r\n variant = \"outline\",\r\n disabled = false,\r\n}) => {\r\n if (totalPages <= 1) return null;\r\n\r\n return (\r\n <nav className={cn(\"flex items-center gap-1\", className)} aria-label=\"Compact Pagination\">\r\n <Button\r\n variant={variant}\r\n size=\"icon\"\r\n icon={ChevronsLeft}\r\n onClick={() => onChange(1)}\r\n disabled={disabled || page === 1}\r\n title=\"First page\"\r\n aria-label=\"First page\"\r\n />\r\n <Button\r\n variant={variant}\r\n size=\"icon\"\r\n icon={ChevronLeft}\r\n onClick={() => onChange(Math.max(1, page - 1))}\r\n disabled={disabled || page === 1}\r\n title=\"Previous page\"\r\n />\r\n\r\n <div className=\"px-2 py-1 text-sm text-muted-foreground min-w-16 text-center\">\r\n {page} / {totalPages}\r\n </div>\r\n\r\n <Button\r\n variant={variant}\r\n size=\"icon\"\r\n icon={ChevronRight}\r\n onClick={() => onChange(Math.min(totalPages, page + 1))}\r\n disabled={disabled || page === totalPages}\r\n title=\"Next page\"\r\n />\r\n <Button\r\n variant={variant}\r\n size=\"icon\"\r\n icon={ChevronsRight}\r\n onClick={() => onChange(totalPages)}\r\n disabled={disabled || page === totalPages}\r\n title=\"Last page\"\r\n />\r\n </nav>\r\n );\r\n};\r\n","\"use client\";\r\n\r\nimport * as React from \"react\";\r\nimport { useId } from \"react\";\r\nimport { createPortal } from \"react-dom\";\r\nimport { cn } from \"@/lib/utils/cn\";\r\nimport { ChevronDown, Search, SearchX, Check, X, Loader2 } from \"lucide-react\";\r\nimport { useShadCNAnimations } from \"@/lib/utils/shadcn-animations\";\r\n\r\n// --- PROPS ---\r\nexport type ComboboxOption = string | { label: string; value: any };\r\n\r\nexport interface ComboboxProps {\r\n id?: string;\r\n options: ComboboxOption[];\r\n value?: any;\r\n onChange: (value: any) => void;\r\n placeholder?: string;\r\n className?: string;\r\n disabled?: boolean;\r\n size?: \"sm\" | \"md\" | \"lg\";\r\n variant?: \"default\" | \"outline\" | \"ghost\";\r\n allowClear?: boolean;\r\n searchPlaceholder?: string;\r\n emptyText?: string;\r\n usePortal?: boolean;\r\n label?: string;\r\n required?: boolean;\r\n fontBold?: boolean;\r\n loading?: boolean;\r\n loadingText?: string;\r\n}\r\n\r\n// Helper functions\r\nconst getOptionLabel = (option: ComboboxOption): string => {\r\n return typeof option === \"string\" ? option : option.label;\r\n};\r\n\r\nconst getOptionValue = (option: ComboboxOption): any => {\r\n return typeof option === \"string\" ? option : option.value;\r\n};\r\n\r\nconst findOptionByValue = (options: ComboboxOption[], value: any): ComboboxOption | undefined => {\r\n return options.find((opt) => getOptionValue(opt) === value);\r\n};\r\n\r\n// --- MAIN COMPONENT ---\r\nexport const Combobox: React.FC<ComboboxProps> = ({\r\n id,\r\n options,\r\n value,\r\n onChange,\r\n placeholder = \"Select...\",\r\n searchPlaceholder = \"Search...\",\r\n emptyText = \"No results found\",\r\n className,\r\n disabled = false,\r\n size = \"md\",\r\n allowClear = false,\r\n usePortal = true,\r\n label,\r\n required,\r\n fontBold = false,\r\n loading = false,\r\n loadingText = \"Loading...\",\r\n}) => {\r\n const [open, setOpen] = React.useState(false);\r\n const [query, setQuery] = React.useState(\"\");\r\n const [activeIndex, setActiveIndex] = React.useState<number | null>(null);\r\n\r\n // Inject ShadCN animations\r\n useShadCNAnimations();\r\n\r\n const listRef = React.useRef<(HTMLLIElement | null)[]>([]);\r\n const inputRef = React.useRef<HTMLInputElement>(null);\r\n\r\n // Stable ids for accessibility\r\n const autoId = useId();\r\n const resolvedId = id ? String(id) : `combobox-${autoId}`;\r\n const labelId = label ? `${resolvedId}-label` : undefined;\r\n\r\n // Enable search only when options length > 10\r\n const enableSearch = options.length > 10;\r\n\r\n // Filter options based on query (only when search enabled)\r\n const filteredOptions = React.useMemo(\r\n () => (enableSearch ? options.filter((o) => getOptionLabel(o).toLowerCase().includes(query.toLowerCase())) : options),\r\n [options, query, enableSearch]\r\n );\r\n\r\n // Manual positioning\r\n const [dropdownPosition, setDropdownPosition] = React.useState<{ top: number; left: number; width: number } | null>(null);\r\n const triggerRef = React.useRef<HTMLButtonElement>(null);\r\n const dropdownRef = React.useRef<HTMLDivElement | null>(null);\r\n\r\n // Calculate positioning synchronously on open to avoid flicker\r\n const calculatePosition = React.useCallback(() => {\r\n if (!triggerRef.current) return null;\r\n const rect = triggerRef.current.getBoundingClientRect();\r\n const scrollTop = window.pageYOffset || document.documentElement.scrollTop;\r\n const scrollLeft = window.pageXOffset || document.documentElement.scrollLeft;\r\n return {\r\n top: rect.bottom + scrollTop + 4,\r\n left: rect.left + scrollLeft,\r\n width: rect.width,\r\n };\r\n }, []);\r\n\r\n // Reposition on resize/scroll while open\r\n React.useEffect(() => {\r\n if (!open) return;\r\n const handler = () => {\r\n const pos = calculatePosition();\r\n if (pos) setDropdownPosition(pos);\r\n };\r\n window.addEventListener(\"resize\", handler);\r\n window.addEventListener(\"scroll\", handler, true);\r\n return () => {\r\n window.removeEventListener(\"resize\", handler);\r\n window.removeEventListener(\"scroll\", handler, true);\r\n };\r\n }, [open, calculatePosition]);\r\n\r\n // Handle clicks outside\r\n React.useEffect(() => {\r\n if (!open) return;\r\n\r\n const handleClickOutside = (event: MouseEvent) => {\r\n const target = event.target as Node;\r\n const triggerEl = triggerRef.current;\r\n const dropdownEl = dropdownRef.current;\r\n if (triggerEl && !triggerEl.contains(target) && dropdownEl && !dropdownEl.contains(target)) {\r\n setOpen(false);\r\n }\r\n };\r\n\r\n const handleEscape = (event: KeyboardEvent) => {\r\n if (event.key === \"Escape\") {\r\n setOpen(false);\r\n }\r\n };\r\n\r\n document.addEventListener(\"mousedown\", handleClickOutside);\r\n document.addEventListener(\"keydown\", handleEscape);\r\n\r\n return () => {\r\n document.removeEventListener(\"mousedown\", handleClickOutside);\r\n document.removeEventListener(\"keydown\", handleEscape);\r\n };\r\n }, [open]);\r\n\r\n // Event Handlers\r\n const handleSelect = (option: ComboboxOption) => {\r\n const val = getOptionValue(option);\r\n if (val !== undefined && val !== null) {\r\n onChange(val);\r\n setOpen(false);\r\n triggerRef.current?.focus();\r\n }\r\n };\r\n\r\n const handleClear = (e: React.MouseEvent) => {\r\n e.stopPropagation();\r\n onChange(null);\r\n setOpen(false);\r\n };\r\n\r\n // Reset state when dropdown closes và focus input khi mở\r\n React.useEffect(() => {\r\n if (!open) {\r\n setQuery(\"\");\r\n setActiveIndex(null);\r\n } else if (enableSearch) {\r\n setTimeout(() => {\r\n inputRef.current?.focus();\r\n }, 100);\r\n }\r\n }, [open, enableSearch]);\r\n\r\n // Get display value\r\n const selectedOption = findOptionByValue(options, value);\r\n const displayValue = selectedOption ? getOptionLabel(selectedOption) : \"\";\r\n\r\n const dropdownContent = (\r\n <div\r\n data-combobox-dropdown\r\n ref={dropdownRef}\r\n style={{\r\n position: \"absolute\",\r\n top: dropdownPosition?.top || 0,\r\n left: dropdownPosition?.left || 0,\r\n width: dropdownPosition?.width || 200,\r\n zIndex: 9999,\r\n transformOrigin: \"top center\",\r\n }}\r\n data-state={open ? \"open\" : \"closed\"}\r\n role=\"listbox\"\r\n id={`${resolvedId}-listbox`}\r\n className=\"z-9999\"\r\n >\r\n <div className={cn(\"rounded-md border bg-popover text-popover-foreground shadow-md\", \"backdrop-blur-sm bg-popover/95 border-border/60\")}>\r\n {/* Search Input (only when many options) */}\r\n {enableSearch && (\r\n <div className=\"relative p-3 border-b border-border/50 bg-muted/20\">\r\n <Search className=\"absolute left-6 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground transition-colors\" />\r\n <input\r\n ref={inputRef}\r\n value={query}\r\n onChange={(e) => {\r\n setQuery(e.target.value);\r\n setActiveIndex(null);\r\n }}\r\n onKeyDown={(e) => {\r\n if (e.key === \"ArrowDown\") {\r\n e.preventDefault();\r\n setActiveIndex((prev) => {\r\n const next = prev === null ? 0 : prev + 1;\r\n return next >= filteredOptions.length ? 0 : next;\r\n });\r\n } else if (e.key === \"ArrowUp\") {\r\n e.preventDefault();\r\n setActiveIndex((prev) => {\r\n const next = prev === null ? filteredOptions.length - 1 : prev - 1;\r\n return next < 0 ? filteredOptions.length - 1 : next;\r\n });\r\n } else if (e.key === \"Enter\") {\r\n e.preventDefault();\r\n if (activeIndex !== null && filteredOptions[activeIndex]) {\r\n handleSelect(filteredOptions[activeIndex]);\r\n }\r\n } else if (e.key === \"Escape\") {\r\n e.preventDefault();\r\n setOpen(false);\r\n }\r\n }}\r\n placeholder={searchPlaceholder}\r\n className=\"w-full rounded-md bg-background/50 py-2 pl-8 pr-3 text-sm border-0 focus:outline-none focus:bg-background/80 transition-colors placeholder:text-muted-foreground/60\"\r\n aria-autocomplete=\"list\"\r\n aria-activedescendant={activeIndex != null ? `combobox-item-${activeIndex}` : undefined}\r\n />\r\n </div>\r\n )}\r\n\r\n {/* Options List */}\r\n <div className=\"max-h-64 overflow-y-auto overscroll-contain\">\r\n <ul className=\"p-1 space-y-1\">\r\n {loading ? (\r\n <li className=\"px-3 py-8 text-center\">\r\n <div className=\"flex flex-col items-center gap-2 animate-in fade-in-0 zoom-in-95 duration-300\">\r\n <Loader2 className=\"h-6 w-6 animate-spin text-primary\" />\r\n <span className=\"text-sm text-muted-foreground\">{loadingText || \"Loading...\"}</span>\r\n </div>\r\n </li>\r\n ) : filteredOptions.length > 0 ? (\r\n filteredOptions.map((item, index) => {\r\n const itemValue = getOptionValue(item);\r\n const itemLabel = getOptionLabel(item);\r\n const isSelected = itemValue === value;\r\n\r\n return (\r\n <li\r\n key={`${itemValue}-${index}`}\r\n ref={(node) => {\r\n listRef.current[index] = node;\r\n }}\r\n id={`combobox-item-${index}`}\r\n role=\"option\"\r\n tabIndex={-1}\r\n aria-selected={isSelected}\r\n onClick={() => handleSelect(item)}\r\n style={{\r\n animationDelay: open ? `${Math.min(index * 20, 200)}ms` : \"0ms\",\r\n }}\r\n className={cn(\r\n \"dropdown-item group flex cursor-pointer items-center justify-between rounded-sm px-2.5 py-1.5 text-sm\",\r\n \"outline-none focus:outline-none focus-visible:outline-none\",\r\n \"hover:bg-accent hover:text-accent-foreground\",\r\n \"focus:bg-accent focus:text-accent-foreground\",\r\n \"data-disabled:pointer-events-none data-disabled:opacity-50\",\r\n index === activeIndex && \"bg-accent text-accent-foreground\",\r\n isSelected && \"bg-accent text-accent-foreground\"\r\n )}\r\n >\r\n <span className=\"truncate\">{itemLabel}</span>\r\n {isSelected && <Check className=\"h-4 w-4 text-primary\" />}\r\n </li>\r\n );\r\n })\r\n ) : (\r\n <li className=\"px-3 py-8 text-center text-muted-foreground text-sm\">\r\n <div className=\"flex flex-col items-center gap-2 animate-in fade-in-0 zoom-in-95 duration-300\">\r\n <SearchX className=\"h-8 w-8 opacity-40 text-muted-foreground\" />\r\n <span className=\"text-sm\">{emptyText}</span>\r\n {query && (\r\n <button type=\"button\" onClick={() => setQuery(\"\")} className=\"text-xs text-primary hover:underline\">\r\n Clear search\r\n </button>\r\n )}\r\n </div>\r\n </li>\r\n )}\r\n </ul>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n\r\n // Size styles for trigger\r\n const sizeStyles = {\r\n // Keep consistent with Input size heights\r\n sm: \"h-8 py-1.5 text-sm md:h-7 md:text-xs\",\r\n md: \"h-10 py-2 text-sm\",\r\n lg: \"h-12 py-3 text-base\",\r\n } as const;\r\n\r\n const labelSize = size === \"sm\" ? \"text-xs\" : size === \"lg\" ? \"text-base\" : \"text-sm\";\r\n\r\n // Radius consistent with Input: sm => rounded-md, md/lg => rounded-lg\r\n const radiusClass = size === \"sm\" ? \"rounded-md\" : \"rounded-lg\";\r\n\r\n const verticalGap = size === \"sm\" ? \"space-y-1.5\" : \"space-y-2\";\r\n\r\n return (\r\n <div className={cn(\"w-full group\", verticalGap)}>\r\n {label && (\r\n <div className=\"flex items-center justify-between\">\r\n <label\r\n id={labelId}\r\n // Clicking the label should focus/open the trigger\r\n onClick={() => triggerRef.current?.focus()}\r\n className={cn(\r\n labelSize,\r\n \"font-medium transition-colors duration-200\",\r\n disabled ? \"text-muted-foreground\" : \"text-foreground group-focus-within:text-primary\"\r\n )}\r\n >\r\n {label}\r\n {required && <span className=\"text-destructive ml-1\">*</span>}\r\n </label>\r\n </div>\r\n )}\r\n {/* Trigger Button */}\r\n <button\r\n ref={triggerRef}\r\n type=\"button\"\r\n disabled={disabled}\r\n role=\"combobox\"\r\n aria-haspopup=\"listbox\"\r\n aria-expanded={open}\r\n aria-controls={`${resolvedId}-listbox`}\r\n id={resolvedId}\r\n aria-labelledby={labelId}\r\n onClick={() => {\r\n const next = !open;\r\n if (next) {\r\n const pos = calculatePosition();\r\n if (pos) setDropdownPosition(pos);\r\n }\r\n setOpen(next);\r\n }}\r\n className={cn(\r\n \"flex w-full items-center justify-between border border-input bg-background px-3\",\r\n radiusClass,\r\n sizeStyles[size],\r\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background\",\r\n \"disabled:cursor-not-allowed disabled:opacity-50\",\r\n \"hover:bg-accent/5 transition-colors hover:border-primary/40 focus:border-primary\",\r\n className\r\n )}\r\n >\r\n <span className={cn(\"truncate\", !displayValue && \"text-muted-foreground\", fontBold && \"font-bold\")}>{displayValue || placeholder}</span>\r\n\r\n <div className=\"flex items-center gap-1 ml-2\">\r\n {allowClear && value && !disabled && (\r\n // FIX: Use a div instead of a nested button\r\n <div\r\n role=\"button\"\r\n tabIndex={0}\r\n aria-label=\"Clear selection\"\r\n onClick={handleClear}\r\n onKeyDown={(e) => (e.key === \"Enter\" || e.key === \" \") && handleClear(e as any)}\r\n className=\"opacity-0 group-hover:opacity-100 transition-opacity p-0.5 rounded hover:bg-destructive/10 text-muted-foreground hover:text-destructive\"\r\n >\r\n <X className=\"h-3 w-3\" />\r\n </div>\r\n )}\r\n <ChevronDown className={cn(\"h-4 w-4 text-muted-foreground transition-all duration-200\", open && \"rotate-180 scale-110 text-primary\")} />\r\n </div>\r\n </button>\r\n\r\n {/* Dropdown Portal or Inline */}\r\n {usePortal\r\n ? open && dropdownPosition && typeof window !== \"undefined\" && createPortal(dropdownContent, document.body)\r\n : open && dropdownPosition && dropdownContent}\r\n </div>\r\n );\r\n};\r\n","// components/ui/Section.tsx\r\nimport React from \"react\";\r\nimport { cn } from \"@/lib/utils/cn\";\r\n\r\ntype GradientDirection = \"to-r\" | \"to-l\" | \"to-b\" | \"to-t\" | \"to-br\" | \"to-bl\" | \"to-tr\" | \"to-tl\";\r\n\r\ninterface SectionProps extends React.HTMLAttributes<HTMLElement> {\r\n children: React.ReactNode;\r\n className?: string;\r\n variant?: \"default\" | \"muted\" | \"primary\" | \"accent\" | \"gradient\";\r\n spacing?: \"sm\" | \"md\" | \"lg\" | \"xl\";\r\n fullWidth?: boolean;\r\n /** Hiển thị viền mỏng xám nhạt giống Card */\r\n outlined?: boolean;\r\n /** Gradient start color (Tailwind class like 'from-purple-500') */\r\n gradientFrom?: string;\r\n /** Gradient end color (Tailwind class like 'to-pink-500') */\r\n gradientTo?: string;\r\n /** Gradient direction */\r\n gradientDirection?: GradientDirection;\r\n}\r\n\r\nconst gradientDirectionMap: Record<GradientDirection, string> = {\r\n \"to-r\": \"bg-linear-to-r\",\r\n \"to-l\": \"bg-linear-to-l\",\r\n \"to-b\": \"bg-linear-to-b\",\r\n \"to-t\": \"bg-linear-to-t\",\r\n \"to-br\": \"bg-linear-to-br\",\r\n \"to-bl\": \"bg-linear-to-bl\",\r\n \"to-tr\": \"bg-linear-to-tr\",\r\n \"to-tl\": \"bg-linear-to-tl\",\r\n};\r\n\r\nconst Section = React.forwardRef<HTMLElement, SectionProps>(\r\n (\r\n {\r\n children,\r\n className,\r\n variant = \"default\",\r\n spacing = \"lg\",\r\n fullWidth = false,\r\n outlined = false,\r\n gradientFrom = \"from-primary/20\",\r\n gradientTo = \"to-accent/20\",\r\n gradientDirection = \"to-br\",\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n const variantClasses = {\r\n default: \"bg-background\",\r\n muted: \"bg-muted/30\",\r\n primary: \"bg-primary/5\",\r\n accent: \"bg-accent/10\",\r\n gradient: \"\",\r\n };\r\n\r\n const spacingClasses = {\r\n sm: \"py-6\",\r\n md: \"py-8\",\r\n lg: \"py-12\",\r\n xl: \"py-16\",\r\n };\r\n\r\n const getGradientClasses = () => {\r\n if (variant !== \"gradient\") return \"\";\r\n return cn(gradientDirectionMap[gradientDirection], gradientFrom, gradientTo);\r\n };\r\n\r\n return (\r\n <section\r\n ref={ref}\r\n className={cn(\r\n variant === \"gradient\" ? getGradientClasses() : variantClasses[variant],\r\n spacingClasses[spacing],\r\n outlined && \"rounded-lg border border-border/60\",\r\n !fullWidth && \"container mx-auto px-4 md:px-6\",\r\n className\r\n )}\r\n {...props}\r\n >\r\n {children}\r\n </section>\r\n );\r\n }\r\n);\r\n\r\nSection.displayName = \"Section\";\r\n\r\nexport default Section;\r\n","import { cn } from \"@/lib/utils/cn\";\nimport { forwardRef, HTMLAttributes } from \"react\";\n\r\ninterface ScrollAreaProps extends HTMLAttributes<HTMLDivElement> {\r\n className?: string;\r\n}\r\n\r\n// Wrap the scrollable viewport in an overflow-hidden container so rounded corners\n// cleanly clip the scrollbar at the edges.\nexport const ScrollArea = forwardRef<HTMLDivElement, ScrollAreaProps>(({ className, children, ...props }, ref) => {\n return (\n <div ref={ref} className={cn(\"relative overflow-hidden bg-background\", className)} {...props}>\n <div className={cn(\"h-full w-full overflow-y-auto scroll-area-viewport\")}>{children}</div>\n </div>\n );\n});\n\r\nScrollArea.displayName = \"ScrollArea\";\r\n","\"use client\";\r\n\r\nimport * as React from \"react\";\r\nimport { useId } from \"react\";\r\nimport { createPortal } from \"react-dom\";\r\nimport { cn } from \"@/lib/utils/cn\";\r\nimport { Calendar, ChevronLeft, ChevronRight, X as XIcon } from \"lucide-react\";\r\nimport Button from \"./Button\";\r\nimport { useShadCNAnimations } from \"@/lib/utils/shadcn-animations\";\r\nimport { useTranslations, useLocale } from \"@/lib/i18n/translation-adapter\";\r\nimport { LOCALE } from \"@/lib/constants/enum\";\r\nimport { formatDate as formatDateUtil, formatDateShort } from \"@/lib/utils/date\";\r\n\r\nexport interface DatePickerProps {\r\n id?: string;\r\n value?: Date;\r\n onChange: (date: Date | undefined) => void;\r\n placeholder?: string;\r\n className?: string;\r\n disabled?: boolean;\r\n size?: \"sm\" | \"md\";\r\n label?: string;\r\n required?: boolean;\r\n todayLabel?: string;\r\n clearLabel?: string;\r\n weekdayLabels?: string[];\r\n}\r\n\r\nexport const DatePicker: React.FC<DatePickerProps> = ({\r\n id,\r\n value,\r\n onChange,\r\n placeholder,\r\n className,\r\n disabled = false,\r\n size = \"md\",\r\n label,\r\n required,\r\n todayLabel,\r\n clearLabel,\r\n weekdayLabels,\r\n}) => {\r\n const t = useTranslations(\"DatePicker\");\r\n const locale = useLocale();\r\n const [isOpen, setIsOpen] = React.useState(false);\r\n const [dropdownPosition, setDropdownPosition] = React.useState<{ top: number; left: number; width: number } | null>(null);\r\n const [viewDate, setViewDate] = React.useState(value || new Date());\r\n const triggerRef = React.useRef<HTMLButtonElement>(null);\r\n const dropdownRef = React.useRef<HTMLDivElement>(null);\r\n\r\n // Inject ShadCN animations\r\n useShadCNAnimations();\r\n\r\n // Calculate positioning synchronously on open to avoid flicker\r\n const calculatePosition = React.useCallback(() => {\r\n if (!triggerRef.current) return null;\r\n const rect = triggerRef.current.getBoundingClientRect();\r\n const scrollTop = window.pageYOffset || document.documentElement.scrollTop;\r\n const scrollLeft = window.pageXOffset || document.documentElement.scrollLeft;\r\n return {\r\n top: rect.bottom + scrollTop + 4,\r\n left: rect.left + scrollLeft,\r\n width: rect.width,\r\n };\r\n }, []);\r\n\r\n // Reposition on resize/scroll while open\r\n React.useEffect(() => {\r\n if (!isOpen) return;\r\n const handler = () => {\r\n const pos = calculatePosition();\r\n if (pos) setDropdownPosition(pos);\r\n };\r\n window.addEventListener(\"resize\", handler);\r\n window.addEventListener(\"scroll\", handler, true);\r\n return () => {\r\n window.removeEventListener(\"resize\", handler);\r\n window.removeEventListener(\"scroll\", handler, true);\r\n };\r\n }, [isOpen, calculatePosition]);\r\n\r\n // Keep calendar month synced with current value or today\r\n React.useEffect(() => {\r\n if (value) {\r\n setViewDate(value);\r\n } else {\r\n setViewDate(new Date());\r\n }\r\n }, [value]);\r\n\r\n // Handle clicks outside\r\n React.useEffect(() => {\r\n if (!isOpen) return;\r\n\r\n const handleClickOutside = (event: MouseEvent) => {\r\n const target = event.target as Node;\r\n const trigger = triggerRef.current;\r\n const dropdown = dropdownRef.current;\r\n if (!trigger || !dropdown) return;\r\n const clickedOutsideTrigger = !trigger.contains(target);\r\n const clickedOutsideDropdown = !dropdown.contains(target);\r\n if (clickedOutsideTrigger && clickedOutsideDropdown) {\r\n setIsOpen(false);\r\n }\r\n };\r\n\r\n const handleEscape = (event: KeyboardEvent) => {\r\n if (event.key === \"Escape\") {\r\n setIsOpen(false);\r\n }\r\n };\r\n\r\n document.addEventListener(\"mousedown\", handleClickOutside);\r\n document.addEventListener(\"keydown\", handleEscape);\r\n\r\n return () => {\r\n document.removeEventListener(\"mousedown\", handleClickOutside);\r\n document.removeEventListener(\"keydown\", handleEscape);\r\n };\r\n }, [isOpen]);\r\n\r\n const handleDateSelect = (date: Date) => {\r\n // Preserve time from existing value if it's not midnight; otherwise use current time\r\n let selectedDate: Date;\r\n if (value && (value.getHours() !== 0 || value.getMinutes() !== 0 || value.getSeconds() !== 0)) {\r\n selectedDate = new Date(date.getFullYear(), date.getMonth(), date.getDate(), value.getHours(), value.getMinutes(), value.getSeconds());\r\n } else {\r\n const now = new Date();\r\n selectedDate = new Date(date.getFullYear(), date.getMonth(), date.getDate(), now.getHours(), now.getMinutes(), now.getSeconds());\r\n }\r\n onChange(selectedDate);\r\n setIsOpen(false);\r\n };\r\n\r\n const formatDateDisplay = (date: Date): string => {\r\n // Use locale for date formatting\r\n return date.toLocaleDateString(locale === \"vi\" ? \"vi-VN\" : \"en-US\", {\r\n day: \"numeric\",\r\n month: \"long\",\r\n year: \"numeric\",\r\n });\r\n };\r\n\r\n const getDaysInMonth = (date: Date): number => {\r\n return new Date(date.getFullYear(), date.getMonth() + 1, 0).getDate();\r\n };\r\n\r\n const getFirstDayOfMonth = (date: Date): number => {\r\n return new Date(date.getFullYear(), date.getMonth(), 1).getDay();\r\n };\r\n\r\n const navigateMonth = (direction: \"prev\" | \"next\") => {\r\n setViewDate((prev) => {\r\n const newDate = new Date(prev);\r\n newDate.setMonth(prev.getMonth() + (direction === \"next\" ? 1 : -1));\r\n return newDate;\r\n });\r\n };\r\n\r\n const renderCalendar = () => {\r\n const daysInMonth = getDaysInMonth(viewDate);\r\n const firstDayOfMonth = getFirstDayOfMonth(viewDate);\r\n const days = [];\r\n\r\n // Empty cells for days before the first day of the month\r\n for (let i = 0; i < firstDayOfMonth; i++) {\r\n days.push(<div key={`empty-${i}`} className=\"w-8 h-8\" />);\r\n }\r\n\r\n // Days of the month\r\n for (let day = 1; day <= daysInMonth; day++) {\r\n const date = new Date(viewDate.getFullYear(), viewDate.getMonth(), day);\r\n const isSelected =\r\n value && date.getDate() === value.getDate() && date.getMonth() === value.getMonth() && date.getFullYear() === value.getFullYear();\r\n const isToday = date.toDateString() === new Date().toDateString();\r\n\r\n // Calculate which row this day is in (0-based)\r\n const totalDaysFromStart = firstDayOfMonth + day - 1;\r\n const rowIndex = Math.floor(totalDaysFromStart / 7);\r\n\r\n days.push(\r\n <button\r\n key={day}\r\n onClick={() => handleDateSelect(date)}\r\n style={{\r\n animationDelay: isOpen ? `${rowIndex * 50}ms` : \"0ms\",\r\n }}\r\n className={cn(\r\n size === \"sm\" ? \"w-7 h-7 text-[12px]\" : \"w-8 h-8 text-sm\",\r\n \"datepicker-day rounded-md focus:outline-none\",\r\n \"transition-colors\",\r\n isSelected\r\n ? \"bg-primary! text-primary-foreground font-bold ring-2 ring-primary-foreground/60 shadow-lg scale-105 z-10 hover:bg-primary! focus:bg-primary! focus:text-primary-foreground\"\r\n : \"hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground\",\r\n isToday && !isSelected && \"bg-accent text-accent-foreground font-semibold\"\r\n )}\r\n >\r\n {day}\r\n </button>\r\n );\r\n }\r\n\r\n return days;\r\n };\r\n\r\n const datePickerContent =\r\n isOpen && dropdownPosition ? (\r\n <div\r\n data-datepicker\r\n style={{\r\n position: \"absolute\",\r\n top: dropdownPosition?.top || 0,\r\n left: dropdownPosition?.left || 0,\r\n width: size === \"sm\" ? dropdownPosition?.width || 224 : dropdownPosition?.width || 256,\r\n zIndex: 9999,\r\n pointerEvents: \"none\",\r\n }}\r\n data-state={isOpen ? \"open\" : \"closed\"}\r\n className={cn(\r\n \"z-9999\",\r\n \"data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95\",\r\n \"data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95\"\r\n )}\r\n >\r\n <div\r\n ref={dropdownRef}\r\n className={cn(\r\n \"rounded-md border bg-popover text-popover-foreground shadow-md\",\r\n \"backdrop-blur-sm bg-popover/95 border-border/60\",\r\n size === \"sm\" ? \"p-3 w-56\" : \"p-4 w-64\"\r\n )}\r\n style={{ pointerEvents: \"auto\" }}\r\n >\r\n {/* Header */}\r\n <div className=\"flex items-center justify-between mb-4\">\r\n <Button variant=\"ghost\" size=\"sm\" onClick={() => navigateMonth(\"prev\")} className=\"p-1 h-auto\">\r\n <ChevronLeft className=\"h-4 w-4\" />\r\n </Button>\r\n <div className=\"text-sm font-semibold\">\r\n {viewDate.toLocaleDateString(locale === \"vi\" ? \"vi-VN\" : \"en-US\", { month: \"long\", year: \"numeric\" })}\r\n </div>\r\n <Button variant=\"ghost\" size=\"sm\" onClick={() => navigateMonth(\"next\")} className=\"p-1 h-auto\">\r\n <ChevronRight className=\"h-4 w-4\" />\r\n </Button>\r\n </div>\r\n\r\n <div className={cn(\"grid grid-cols-7 gap-1\", size === \"sm\" ? \"mb-1\" : \"mb-2\")}>\r\n {(weekdayLabels || (locale === \"vi\" ? [\"CN\", \"T2\", \"T3\", \"T4\", \"T5\", \"T6\", \"T7\"] : [\"Su\", \"Mo\", \"Tu\", \"We\", \"Th\", \"Fr\", \"Sa\"])).map(\r\n (day) => (\r\n <div key={day} className={cn(\"text-muted-foreground text-center font-medium\", size === \"sm\" ? \"text-[10px] py-0.5\" : \"text-xs py-1\")}>\r\n {day}\r\n </div>\r\n )\r\n )}\r\n </div>\r\n\r\n {/* Calendar grid */}\r\n <div className=\"grid grid-cols-7 gap-1\">{renderCalendar()}</div>\r\n <div className=\"flex items-center justify-end mt-2\">\r\n <Button\r\n variant=\"outline\"\r\n size=\"sm\"\r\n onClick={() => {\r\n onChange(undefined);\r\n setIsOpen(false);\r\n setViewDate(new Date());\r\n }}\r\n >\r\n {clearLabel || t(\"clear\")}\r\n </Button>\r\n </div>\r\n </div>\r\n </div>\r\n ) : null;\r\n\r\n const autoId = useId();\r\n const resolvedId = id ? String(id) : `datepicker-${autoId}`;\r\n const labelId = label ? `${resolvedId}-label` : undefined;\r\n const labelSize = size === \"sm\" ? \"text-xs\" : \"text-sm\";\r\n\r\n // Radius consistent with Input: sm => rounded-md, md => rounded-lg\r\n const radiusClass = size === \"sm\" ? \"rounded-md\" : \"rounded-lg\";\r\n const verticalGap = size === \"sm\" ? \"space-y-1.5\" : \"space-y-2\";\r\n\r\n return (\r\n <div className={cn(\"w-full group\", verticalGap)}>\r\n {label && (\r\n <div className=\"flex items-center justify-between\">\r\n <label\r\n id={labelId}\r\n onClick={() => triggerRef.current?.focus()}\r\n className={cn(\r\n labelSize,\r\n \"font-medium transition-colors duration-200\",\r\n disabled ? \"text-muted-foreground\" : \"text-foreground group-focus-within:text-primary\"\r\n )}\r\n >\r\n {label}\r\n {required && <span className=\"text-destructive ml-1\">*</span>}\r\n </label>\r\n </div>\r\n )}\r\n <button\r\n ref={triggerRef}\r\n type=\"button\"\r\n disabled={disabled}\r\n id={resolvedId}\r\n aria-labelledby={labelId}\r\n onClick={() => {\r\n const next = !isOpen;\r\n if (next) {\r\n const pos = calculatePosition();\r\n if (pos) setDropdownPosition(pos);\r\n }\r\n setIsOpen(next);\r\n }}\r\n className={cn(\r\n cn(\r\n \"flex w-full items-center justify-between border border-input bg-background\",\r\n radiusClass,\r\n size === \"sm\" ? \"px-2.5 py-1.5 text-sm h-8 md:h-7 md:text-xs md:py-1\" : \"px-3 py-2 text-sm h-10\"\r\n ),\r\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background\",\r\n \"disabled:opacity-50 disabled:cursor-not-allowed\",\r\n \"hover:bg-accent/5 transition-colors\",\r\n className\r\n )}\r\n >\r\n <span className={cn(\"truncate\", !value && \"text-muted-foreground\")}>\r\n {value ? formatDateDisplay(value) : placeholder || t(\"placeholder\")}\r\n </span>\r\n {value && (\r\n <span\r\n role=\"button\"\r\n aria-label={clearLabel || t(\"clear\")}\r\n tabIndex={0}\r\n onClick={(e) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n onChange(undefined);\r\n setViewDate(new Date());\r\n }}\r\n onKeyDown={(e) => {\r\n if (e.key === \"Enter\" || e.key === \" \") {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n onChange(undefined);\r\n setViewDate(new Date());\r\n }\r\n }}\r\n className=\"absolute right-8 inline-flex items-center justify-center rounded-sm text-muted-foreground hover:text-foreground hover:bg-accent/50 transition-colors cursor-pointer\"\r\n style={{ width: 20, height: 20 }}\r\n >\r\n <XIcon className=\"h-3.5 w-3.5\" />\r\n </span>\r\n )}\r\n <Calendar className=\"h-4 w-4 text-muted-foreground ml-2\" />\r\n </button>\r\n\r\n {isOpen && dropdownPosition && typeof window !== \"undefined\" && createPortal(datePickerContent, document.body)}\r\n </div>\r\n );\r\n};\r\n\r\n// Additional components for backward compatibility\r\nexport const DateRangePicker: React.FC<{\r\n startDate?: Date;\r\n endDate?: Date;\r\n onChange: (start: Date, end: Date) => void;\r\n placeholder?: string;\r\n className?: string;\r\n}> = ({ startDate, endDate, onChange, placeholder = \"Select date range...\", className }) => {\r\n const locale = useLocale();\r\n const [isOpen, setIsOpen] = React.useState(false);\r\n const [dropdownPosition, setDropdownPosition] = React.useState<{ top: number; left: number; width: number } | null>(null);\r\n const triggerRef = React.useRef<HTMLButtonElement>(null);\r\n const panelRef = React.useRef<HTMLDivElement>(null);\r\n\r\n // Use passed-in props as the source of truth, but manage a temporary state for selection.\r\n const [viewDate, setViewDate] = React.useState<Date>(startDate || new Date());\r\n const [tempStart, setTempStart] = React.useState<Date | null>(startDate || null);\r\n const [tempEnd, setTempEnd] = React.useState<Date | null>(endDate || null);\r\n const [hoveredDate, setHoveredDate] = React.useState<Date | null>(null);\r\n\r\n // Sync temp state with props\r\n React.useEffect(() => {\r\n setTempStart(startDate || null);\r\n }, [startDate]);\r\n\r\n React.useEffect(() => {\r\n setTempEnd(endDate || null);\r\n }, [endDate]);\r\n\r\n const calculatePosition = React.useCallback(() => {\r\n if (!triggerRef.current) return null;\r\n const rect = triggerRef.current.getBoundingClientRect();\r\n const scrollTop = window.pageYOffset || document.documentElement.scrollTop;\r\n const scrollLeft = window.pageXOffset || document.documentElement.scrollLeft;\r\n return { top: rect.bottom + scrollTop + 4, left: rect.left + scrollLeft, width: rect.width };\r\n }, []);\r\n\r\n // Reposition on resize/scroll\r\n React.useEffect(() => {\r\n if (!isOpen) return;\r\n const handler = () => {\r\n const pos = calculatePosition();\r\n if (pos) setDropdownPosition(pos);\r\n };\r\n window.addEventListener(\"resize\", handler);\r\n window.addEventListener(\"scroll\", handler, true);\r\n return () => {\r\n window.removeEventListener(\"resize\", handler);\r\n window.removeEventListener(\"scroll\", handler, true);\r\n };\r\n }, [isOpen, calculatePosition]);\r\n\r\n // Handle clicks outside to close\r\n React.useEffect(() => {\r\n if (!isOpen) return;\r\n const handleClickOutside = (event: MouseEvent) => {\r\n if (\r\n triggerRef.current &&\r\n !triggerRef.current.contains(event.target as Node) &&\r\n panelRef.current &&\r\n !panelRef.current.contains(event.target as Node)\r\n ) {\r\n setIsOpen(false);\r\n }\r\n };\r\n const handleEscape = (event: KeyboardEvent) => {\r\n if (event.key === \"Escape\") setIsOpen(false);\r\n };\r\n document.addEventListener(\"mousedown\", handleClickOutside);\r\n document.addEventListener(\"keydown\", handleEscape);\r\n return () => {\r\n document.removeEventListener(\"mousedown\", handleClickOutside);\r\n document.removeEventListener(\"keydown\", handleEscape);\r\n };\r\n }, [isOpen]);\r\n\r\n const isSameDay = (a: Date | null, b: Date | null) => {\r\n if (!a || !b) return false;\r\n return a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth() && a.getDate() === b.getDate();\r\n };\r\n const inRange = (d: Date, s: Date, e: Date) => d > s && d < e;\r\n const getDaysInMonth = (d: Date) => new Date(d.getFullYear(), d.getMonth() + 1, 0).getDate();\r\n const getFirstDayOfMonth = (d: Date) => new Date(d.getFullYear(), d.getMonth(), 1).getDay();\r\n\r\n const handleSelect = (date: Date) => {\r\n if (!tempStart || (tempStart && tempEnd)) {\r\n setTempStart(date);\r\n setTempEnd(null);\r\n setHoveredDate(null);\r\n } else if (tempStart && !tempEnd) {\r\n if (date < tempStart) {\r\n setTempStart(date);\r\n } else {\r\n setTempEnd(date);\r\n onChange(tempStart, date);\r\n setIsOpen(false);\r\n }\r\n }\r\n };\r\n\r\n const renderGrid = () => {\r\n const nodes: React.ReactNode[] = [];\r\n const daysInMonth = getDaysInMonth(viewDate);\r\n const firstDay = getFirstDayOfMonth(viewDate);\r\n for (let i = 0; i < firstDay; i++) nodes.push(<div key={`e-${i}`} className=\"w-8 h-8\" />);\r\n\r\n for (let d = 1; d <= daysInMonth; d++) {\r\n const date = new Date(viewDate.getFullYear(), viewDate.getMonth(), d);\r\n\r\n const isSelectedStart = isSameDay(date, tempStart);\r\n const isSelectedEnd = isSameDay(date, tempEnd);\r\n\r\n const isHovering = hoveredDate && tempStart && !tempEnd;\r\n\r\n let isInRange = false;\r\n let isRangeStart = false;\r\n let isRangeEnd = false;\r\n\r\n if (tempStart && tempEnd) {\r\n if (isSameDay(date, tempStart)) isRangeStart = true;\r\n if (isSameDay(date, tempEnd)) isRangeEnd = true;\r\n if (inRange(date, tempStart, tempEnd)) isInRange = true;\r\n } else if (isHovering) {\r\n if (hoveredDate > tempStart) {\r\n if (isSameDay(date, tempStart)) isRangeStart = true;\r\n if (isSameDay(date, hoveredDate)) isRangeEnd = true;\r\n if (inRange(date, tempStart, hoveredDate)) isInRange = true;\r\n } else {\r\n if (isSameDay(date, hoveredDate)) isRangeStart = true;\r\n if (isSameDay(date, tempStart)) isRangeEnd = true;\r\n if (inRange(date, hoveredDate, tempStart)) isInRange = true;\r\n }\r\n }\r\n\r\n nodes.push(\r\n <button\r\n key={d}\r\n onClick={() => handleSelect(date)}\r\n onMouseEnter={() => tempStart && !tempEnd && setHoveredDate(date)}\r\n onMouseLeave={() => tempStart && !tempEnd && setHoveredDate(null)}\r\n className={cn(\r\n \"w-8 h-8 text-sm transition-all duration-200 focus:outline-none relative font-medium\",\r\n // Default state\r\n !isInRange && !isRangeStart && !isRangeEnd && \"hover:bg-accent hover:text-accent-foreground rounded-md\",\r\n\r\n // Range selection styling - smooth continuous background\r\n isInRange && \"bg-primary/15 text-foreground shadow-sm\",\r\n (isRangeStart || isRangeEnd) && \"bg-primary text-primary-foreground hover:bg-primary/90 shadow-sm\",\r\n\r\n // Only round the actual start and end of the range\r\n isRangeStart && !isRangeEnd && \"rounded-l-md rounded-r-none\",\r\n isRangeEnd && !isRangeStart && \"rounded-r-md rounded-l-none\",\r\n isRangeStart && isRangeEnd && \"rounded-md\", // Single day selection\r\n\r\n // Hover effects for range\r\n isInRange && \"hover:bg-primary/25\",\r\n\r\n \"focus:bg-accent focus:text-accent-foreground focus:z-10 focus:shadow-md\"\r\n )}\r\n >\r\n {d}\r\n </button>\r\n );\r\n }\r\n return nodes;\r\n };\r\n\r\n const panel =\r\n isOpen && dropdownPosition ? (\r\n <div\r\n style={{ position: \"absolute\", top: dropdownPosition.top, left: dropdownPosition.left, width: dropdownPosition.width || 256, zIndex: 9999 }}\r\n data-state={isOpen ? \"open\" : \"closed\"}\r\n className={cn(\r\n \"z-9999\",\r\n \"data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95\",\r\n \"data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95\"\r\n )}\r\n >\r\n <div\r\n ref={panelRef}\r\n className={cn(\"rounded-md border bg-popover text-popover-foreground shadow-md\", \"backdrop-blur-sm bg-popover/95 border-border/60 p-4 w-64\")}\r\n >\r\n <div className=\"flex items-center justify-between mb-3\">\r\n <Button\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n onClick={() => setViewDate(new Date(viewDate.getFullYear(), viewDate.getMonth() - 1, 1))}\r\n className=\"p-1 h-auto\"\r\n >\r\n <ChevronLeft className=\"h-4 w-4\" />\r\n </Button>\r\n <div className=\"text-sm font-semibold\">\r\n {viewDate.toLocaleDateString(locale === \"vi\" ? \"vi-VN\" : \"en-US\", { month: \"long\", year: \"numeric\" })}\r\n </div>\r\n <Button\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n onClick={() => setViewDate(new Date(viewDate.getFullYear(), viewDate.getMonth() + 1, 1))}\r\n className=\"p-1 h-auto\"\r\n >\r\n <ChevronRight className=\"h-4 w-4\" />\r\n </Button>\r\n </div>\r\n <div className=\"grid grid-cols-7 gap-1 mb-2\">\r\n {(locale === \"vi\" ? [\"CN\", \"T2\", \"T3\", \"T4\", \"T5\", \"T6\", \"T7\"] : [\"Su\", \"Mo\", \"Tu\", \"We\", \"Th\", \"Fr\", \"Sa\"]).map((d) => (\r\n <div key={d} className=\"text-xs text-muted-foreground text-center py-1 font-medium\">\r\n {d}\r\n </div>\r\n ))}\r\n </div>\r\n <div className=\"grid grid-cols-7\">{renderGrid()}</div>\r\n </div>\r\n </div>\r\n ) : null;\r\n\r\n const displayFormat = (date: Date) => formatDateShort(date);\r\n\r\n const label =\r\n tempStart && tempEnd ? `${displayFormat(tempStart)} - ${displayFormat(tempEnd)}` : tempStart ? `${displayFormat(tempStart)} - ...` : placeholder;\r\n\r\n return (\r\n <>\r\n <button\r\n ref={triggerRef}\r\n type=\"button\"\r\n onClick={() => {\r\n const next = !isOpen;\r\n if (next) {\r\n const pos = calculatePosition();\r\n if (pos) setDropdownPosition(pos);\r\n }\r\n setIsOpen(next);\r\n }}\r\n className={cn(\r\n \"flex w-full items-center justify-between rounded-md border border-input bg-background px-3 py-2 text-sm\",\r\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background\",\r\n className\r\n )}\r\n >\r\n <span className={cn(\"truncate\", !tempStart && !tempEnd && \"text-muted-foreground\")}>{label}</span>\r\n <Calendar className=\"h-4 w-4 text-muted-foreground ml-2\" />\r\n </button>\r\n {isOpen && dropdownPosition && typeof window !== \"undefined\" && createPortal(panel, document.body)}\r\n </>\r\n );\r\n};\r\n\r\nexport const CompactDatePicker: React.FC<{\r\n value?: Date;\r\n onChange: (date?: Date) => void;\r\n className?: string;\r\n}> = ({ value, onChange, className }) => {\r\n return (\r\n <DatePicker\r\n value={value}\r\n onChange={onChange as (d: Date | undefined) => void}\r\n size=\"sm\"\r\n className={cn(\"max-w-56\", className)}\r\n placeholder=\"Date\"\r\n />\r\n );\r\n};\r\n","/**\n * Date formatting utilities for Vietnamese locale\n * Provides consistent date/time formatting across the application\n */\n\n/**\n * Format date to Vietnamese readable format\n * Example: \"25 tháng 12, 2024\"\n */\nexport function formatDate(date: string | Date | null | undefined): string {\n if (!date) return \"\";\n const d = new Date(date);\n if (isNaN(d.getTime())) return \"\";\n\n return d.toLocaleDateString(\"vi-VN\", {\n day: \"numeric\",\n month: \"long\",\n year: \"numeric\",\n });\n}\n\n/**\n * Format date to short format\n * Example: \"25/12/2024\"\n */\nexport function formatDateShort(date: string | Date | null | undefined): string {\n if (!date) return \"\";\n const d = new Date(date);\n if (isNaN(d.getTime())) return \"\";\n\n return d.toLocaleDateString(\"vi-VN\", {\n day: \"2-digit\",\n month: \"2-digit\",\n year: \"numeric\",\n });\n}\n\n/**\n * Format time only\n * Example: \"14:30\"\n */\nexport function formatTime(date: string | Date | null | undefined): string {\n if (!date) return \"\";\n const d = new Date(date);\n if (isNaN(d.getTime())) return \"\";\n\n return d.toLocaleTimeString(\"vi-VN\", {\n hour: \"2-digit\",\n minute: \"2-digit\",\n });\n}\n\n/**\n * Format date and time\n * Example: \"25/12/2024 14:30\"\n */\nexport function formatDateTime(date: string | Date | null | undefined): string {\n if (!date) return \"\";\n const d = new Date(date);\n if (isNaN(d.getTime())) return \"\";\n\n return d.toLocaleString(\"vi-VN\", {\n day: \"2-digit\",\n month: \"2-digit\",\n year: \"numeric\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n });\n}\n\n/**\n * Format date with time - more readable\n * Example: \"25 tháng 12, 2024 lúc 14:30\"\n */\nexport function formatDateTimeLong(date: string | Date | null | undefined): string {\n if (!date) return \"\";\n const d = new Date(date);\n if (isNaN(d.getTime())) return \"\";\n\n const dateStr = d.toLocaleDateString(\"vi-VN\", {\n day: \"numeric\",\n month: \"long\",\n year: \"numeric\",\n });\n\n const timeStr = d.toLocaleTimeString(\"vi-VN\", {\n hour: \"2-digit\",\n minute: \"2-digit\",\n });\n\n return `${dateStr} lúc ${timeStr}`;\n}\n\n/**\n * Format relative time (time ago)\n * Example: \"2 giờ trước\", \"3 ngày trước\", \"1 tuần trước\"\n */\nexport function formatTimeAgo(date: string | Date | null | undefined): string {\n if (!date) return \"\";\n const d = new Date(date);\n if (isNaN(d.getTime())) return \"\";\n\n const now = new Date();\n const diffMs = now.getTime() - d.getTime();\n const diffSec = Math.floor(diffMs / 1000);\n const diffMin = Math.floor(diffSec / 60);\n const diffHour = Math.floor(diffMin / 60);\n const diffDay = Math.floor(diffHour / 24);\n const diffWeek = Math.floor(diffDay / 7);\n const diffMonth = Math.floor(diffDay / 30);\n const diffYear = Math.floor(diffDay / 365);\n\n if (diffSec < 60) return \"Vừa xong\";\n if (diffMin < 60) return `${diffMin} phút trước`;\n if (diffHour < 24) return `${diffHour} giờ trước`;\n if (diffDay < 7) return `${diffDay} ngày trước`;\n if (diffWeek < 4) return `${diffWeek} tuần trước`;\n if (diffMonth < 12) return `${diffMonth} tháng trước`;\n return `${diffYear} năm trước`;\n}\n\n/**\n * Format date range\n * Example: \"25/12/2024 - 31/12/2024\"\n */\nexport function formatDateRange(\n startDate: string | Date | null | undefined,\n endDate: string | Date | null | undefined\n): string {\n const start = formatDateShort(startDate);\n const end = formatDateShort(endDate);\n\n if (!start && !end) return \"\";\n if (!start) return `Đến ${end}`;\n if (!end) return `Từ ${start}`;\n\n return `${start} - ${end}`;\n}\n\n/**\n * Check if date is today\n */\nexport function isToday(date: string | Date | null | undefined): boolean {\n if (!date) return false;\n const d = new Date(date);\n if (isNaN(d.getTime())) return false;\n\n const today = new Date();\n return (\n d.getDate() === today.getDate() &&\n d.getMonth() === today.getMonth() &&\n d.getFullYear() === today.getFullYear()\n );\n}\n\n/**\n * Check if date is yesterday\n */\nexport function isYesterday(date: string | Date | null | undefined): boolean {\n if (!date) return false;\n const d = new Date(date);\n if (isNaN(d.getTime())) return false;\n\n const yesterday = new Date();\n yesterday.setDate(yesterday.getDate() - 1);\n\n return (\n d.getDate() === yesterday.getDate() &&\n d.getMonth() === yesterday.getMonth() &&\n d.getFullYear() === yesterday.getFullYear()\n );\n}\n\n/**\n * Smart date formatting - shows relative time for recent dates, full date for older ones\n * Example:\n * - \"Vừa xong\" (< 1 min)\n * - \"5 phút trước\" (< 1 hour)\n * - \"Hôm nay lúc 14:30\" (today)\n * - \"Hôm qua lúc 14:30\" (yesterday)\n * - \"25/12/2024 14:30\" (older)\n */\nexport function formatDateSmart(date: string | Date | null | undefined): string {\n if (!date) return \"\";\n const d = new Date(date);\n if (isNaN(d.getTime())) return \"\";\n\n const now = new Date();\n const diffMs = now.getTime() - d.getTime();\n const diffHour = Math.floor(diffMs / (1000 * 60 * 60));\n\n // Less than 1 hour ago - show relative time\n if (diffHour < 1) {\n return formatTimeAgo(date);\n }\n\n // Today - show \"Hôm nay lúc HH:MM\"\n if (isToday(date)) {\n return `Hôm nay lúc ${formatTime(date)}`;\n }\n\n // Yesterday - show \"Hôm qua lúc HH:MM\"\n if (isYesterday(date)) {\n return `Hôm qua lúc ${formatTime(date)}`;\n }\n\n // Less than 7 days - show relative\n if (diffHour < 24 * 7) {\n return formatTimeAgo(date);\n }\n\n // Older - show full date with time\n return formatDateTime(date);\n}\n\n/**\n * Format date for input[type=\"date\"]\n * Example: \"2024-12-25\"\n */\nexport function formatDateForInput(date: string | Date | null | undefined): string {\n if (!date) return \"\";\n const d = new Date(date);\n if (isNaN(d.getTime())) return \"\";\n\n const year = d.getFullYear();\n const month = String(d.getMonth() + 1).padStart(2, '0');\n const day = String(d.getDate()).padStart(2, '0');\n\n return `${year}-${month}-${day}`;\n}\n\n/**\n * Format date for input[type=\"datetime-local\"]\n * Example: \"2024-12-25T14:30\"\n */\nexport function formatDateTimeForInput(date: string | Date | null | undefined): string {\n if (!date) return \"\";\n const d = new Date(date);\n if (isNaN(d.getTime())) return \"\";\n\n const dateStr = formatDateForInput(date);\n const hours = String(d.getHours()).padStart(2, '0');\n const minutes = String(d.getMinutes()).padStart(2, '0');\n\n return `${dateStr}T${hours}:${minutes}`;\n}\n\n/**\n * Get day of week in Vietnamese\n * Example: \"Thứ Hai\", \"Thứ Ba\", ...\n */\nexport function getDayOfWeek(date: string | Date | null | undefined): string {\n if (!date) return \"\";\n const d = new Date(date);\n if (isNaN(d.getTime())) return \"\";\n\n const days = [\n \"Chủ Nhật\",\n \"Thứ Hai\",\n \"Thứ Ba\",\n \"Thứ Tư\",\n \"Thứ Năm\",\n \"Thứ Sáu\",\n \"Thứ Bảy\",\n ];\n\n return days[d.getDay()];\n}\n\n/**\n * Format with day of week\n * Example: \"Thứ Hai, 25/12/2024\"\n */\nexport function formatDateWithDay(date: string | Date | null | undefined): string {\n if (!date) return \"\";\n const dayOfWeek = getDayOfWeek(date);\n const dateStr = formatDateShort(date);\n\n return `${dayOfWeek}, ${dateStr}`;\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"@/lib/utils/cn\";\nimport { Popover } from \"./Popover\";\nimport { Clock, X, Check } from \"lucide-react\";\nimport Input from \"./Input\";\n\ntype TimeFormat = \"24\" | \"12\";\ntype TimePickerVariant = \"default\" | \"compact\" | \"inline\";\n\nexport interface TimePickerProps extends Omit<React.HTMLAttributes<HTMLDivElement>, \"onChange\"> {\n value?: string; // e.g. \"14:05\" or \"02:05 PM\"\n defaultValue?: string;\n onChange?: (value: string | undefined) => void;\n placeholder?: string;\n disabled?: boolean;\n size?: \"sm\" | \"md\" | \"lg\";\n label?: string;\n required?: boolean;\n format?: TimeFormat; // 24 or 12\n includeSeconds?: boolean;\n minuteStep?: number; // default 5\n secondStep?: number; // default 5\n clearable?: boolean;\n /** Visual variant of the picker */\n variant?: TimePickerVariant;\n /** Show \"Now\" button */\n showNow?: boolean;\n /** Show time presets (Morning, Afternoon, Evening) */\n showPresets?: boolean;\n /** Enable manual input */\n allowManualInput?: boolean;\n /** Custom presets with labels and times */\n customPresets?: Array<{ label: string; time: string }>;\n /** Minimum allowed time (e.g., \"09:00\") */\n minTime?: string;\n /** Maximum allowed time (e.g., \"18:00\") */\n maxTime?: string;\n /** Disabled times function or array */\n disabledTimes?: ((time: string) => boolean) | string[];\n /** Show validation feedback */\n error?: string;\n /** Success state */\n success?: boolean;\n /** Helper text */\n helperText?: string;\n /** Enable smooth animations */\n animate?: boolean;\n /** Callback when popover opens */\n onOpen?: () => void;\n /** Callback when popover closes */\n onClose?: () => void;\n}\n\ntype Parts = { h: number; m: number; s: number; p?: \"AM\" | \"PM\" };\n\nconst pad = (n: number) => n.toString().padStart(2, \"0\");\n\nfunction parseTime(input?: string, fmt: TimeFormat = \"24\", includeSeconds?: boolean): Parts | null {\n if (!input) return null;\n try {\n const s = input.trim().toUpperCase();\n const ampm = s.endsWith(\"AM\") || s.endsWith(\"PM\");\n const clean = s.replace(/\\s*(AM|PM)\\s*$/, \"\");\n const segs = clean.split(\":\");\n const h = Number(segs[0]);\n const m = Number(segs[1] ?? 0);\n const sec = Number(segs[2] ?? 0);\n if (Number.isNaN(h) || Number.isNaN(m) || Number.isNaN(sec)) return null;\n if (fmt === \"12\" || ampm) {\n const p = s.endsWith(\"PM\") ? \"PM\" : \"AM\";\n return { h: Math.max(1, Math.min(12, h)), m: Math.max(0, Math.min(59, m)), s: Math.max(0, Math.min(59, sec)), p };\n }\n return { h: Math.max(0, Math.min(23, h)), m: Math.max(0, Math.min(59, m)), s: Math.max(0, Math.min(59, sec)) };\n } catch (error) {\n console.error(\"Error parsing time:\", error);\n return null;\n }\n}\n\nfunction formatTime({ h, m, s, p }: Parts, fmt: TimeFormat, includeSeconds?: boolean): string {\n if (fmt === \"12\") {\n const period = p || (h >= 12 ? \"PM\" : \"AM\");\n const hr12 = h % 12 === 0 ? 12 : h % 12;\n const base = `${pad(hr12)}:${pad(m)}`;\n return includeSeconds ? `${base}:${pad(s)} ${period}` : `${base} ${period}`;\n }\n const base = `${pad(h)}:${pad(m)}`;\n return includeSeconds ? `${base}:${pad(s)}` : base;\n}\n\n// Time presets\nconst PRESETS = {\n morning: { h: 9, m: 0, s: 0 },\n afternoon: { h: 14, m: 0, s: 0 },\n evening: { h: 18, m: 0, s: 0 },\n night: { h: 21, m: 0, s: 0 },\n};\n\nexport default function TimePicker({\n value,\n defaultValue,\n onChange,\n placeholder = \"Select time\",\n disabled = false,\n size = \"md\",\n label,\n required,\n format = \"24\",\n includeSeconds = false,\n minuteStep = 5,\n secondStep = 5,\n clearable = true,\n variant = \"default\",\n showNow = false,\n showPresets = false,\n allowManualInput = false,\n customPresets = [],\n minTime,\n maxTime,\n disabledTimes,\n error,\n success,\n helperText,\n animate = true,\n onOpen,\n onClose,\n className,\n ...rest\n}: TimePickerProps) {\n const isControlled = value !== undefined;\n const now = new Date();\n const initial: Parts =\n parseTime(isControlled ? value : defaultValue, format, includeSeconds) ||\n (format === \"12\"\n ? { h: ((now.getHours() % 12) || 12), m: now.getMinutes(), s: now.getSeconds(), p: now.getHours() >= 12 ? \"PM\" : \"AM\" }\n : { h: now.getHours(), m: now.getMinutes(), s: now.getSeconds() });\n\n const [open, setOpen] = React.useState(false);\n const [parts, setParts] = React.useState<Parts>(initial);\n const [manualInput, setManualInput] = React.useState(\"\");\n const [focusedColumn, setFocusedColumn] = React.useState<\"hour\" | \"minute\" | \"second\" | \"period\" | null>(null);\n\n const hourScrollRef = React.useRef<HTMLDivElement>(null);\n const minuteScrollRef = React.useRef<HTMLDivElement>(null);\n const secondScrollRef = React.useRef<HTMLDivElement>(null);\n\n React.useEffect(() => {\n if (isControlled) {\n const parsed = parseTime(value, format, includeSeconds);\n if (parsed) setParts(parsed);\n }\n }, [value, isControlled, format, includeSeconds]);\n\n // Smooth scroll to selected time\n React.useEffect(() => {\n if (!open) return;\n const scrollToSelected = (ref: React.RefObject<HTMLDivElement | null>, targetValue: number, step: number) => {\n if (!ref.current) return;\n const buttons = ref.current.querySelectorAll(\"button\");\n const targetIndex = Math.floor(targetValue / step);\n const targetButton = buttons[targetIndex];\n if (targetButton) {\n targetButton.scrollIntoView({ behavior: animate ? \"smooth\" : \"auto\", block: \"center\" });\n }\n };\n\n setTimeout(() => {\n scrollToSelected(hourScrollRef, parts.h, 1);\n scrollToSelected(minuteScrollRef, parts.m, minuteStep);\n if (includeSeconds) scrollToSelected(secondScrollRef, parts.s, secondStep);\n }, 50);\n }, [open, parts.h, parts.m, parts.s, minuteStep, secondStep, includeSeconds, animate]);\n\n // Check if time is disabled\n const isTimeDisabled = React.useCallback((timeStr: string): boolean => {\n if (!disabledTimes) return false;\n if (typeof disabledTimes === \"function\") return disabledTimes(timeStr);\n return disabledTimes.includes(timeStr);\n }, [disabledTimes]);\n\n // Check if time is within range\n const isTimeInRange = React.useCallback((timeStr: string): boolean => {\n if (!minTime && !maxTime) return true;\n const parsed = parseTime(timeStr, format, includeSeconds);\n if (!parsed) return true;\n\n if (minTime) {\n const min = parseTime(minTime, format, includeSeconds);\n if (min) {\n const currentMinutes = parsed.h * 60 + parsed.m;\n const minMinutes = min.h * 60 + min.m;\n if (currentMinutes < minMinutes) return false;\n }\n }\n\n if (maxTime) {\n const max = parseTime(maxTime, format, includeSeconds);\n if (max) {\n const currentMinutes = parsed.h * 60 + parsed.m;\n const maxMinutes = max.h * 60 + max.m;\n if (currentMinutes > maxMinutes) return false;\n }\n }\n\n return true;\n }, [minTime, maxTime, format, includeSeconds]);\n\n const emit = (next: Parts | undefined) => {\n const timeStr = next ? formatTime(next, format, includeSeconds) : undefined;\n if (timeStr && !isTimeInRange(timeStr)) return;\n if (timeStr && isTimeDisabled(timeStr)) return;\n onChange?.(timeStr);\n };\n\n const handleOpenChange = (newOpen: boolean) => {\n setOpen(newOpen);\n if (newOpen) {\n onOpen?.();\n } else {\n onClose?.();\n setFocusedColumn(null);\n }\n };\n\n // Keyboard navigation\n const handleKeyDown = (e: React.KeyboardEvent, column: \"hour\" | \"minute\" | \"second\" | \"period\") => {\n if (![\"ArrowUp\", \"ArrowDown\", \"ArrowLeft\", \"ArrowRight\", \"Home\", \"End\", \"PageUp\", \"PageDown\"].includes(e.key)) return;\n e.preventDefault();\n\n let newParts = { ...parts };\n\n switch (column) {\n case \"hour\":\n if (e.key === \"ArrowUp\") newParts.h = format === \"24\" ? (parts.h + 1) % 24 : (parts.h % 12) + 1;\n if (e.key === \"ArrowDown\") newParts.h = format === \"24\" ? (parts.h - 1 + 24) % 24 : ((parts.h - 2 + 12) % 12) + 1;\n if (e.key === \"Home\") newParts.h = format === \"24\" ? 0 : 1;\n if (e.key === \"End\") newParts.h = format === \"24\" ? 23 : 12;\n if (e.key === \"PageUp\") newParts.h = format === \"24\" ? (parts.h + 6) % 24 : (parts.h % 12) + 3;\n if (e.key === \"PageDown\") newParts.h = format === \"24\" ? (parts.h - 6 + 24) % 24 : ((parts.h - 4 + 12) % 12) + 1;\n if (e.key === \"ArrowRight\") setFocusedColumn(\"minute\");\n break;\n case \"minute\":\n if (e.key === \"ArrowUp\") newParts.m = (parts.m + minuteStep) % 60;\n if (e.key === \"ArrowDown\") newParts.m = (parts.m - minuteStep + 60) % 60;\n if (e.key === \"Home\") newParts.m = 0;\n if (e.key === \"End\") newParts.m = 59 - (59 % minuteStep);\n if (e.key === \"PageUp\") newParts.m = (parts.m + minuteStep * 3) % 60;\n if (e.key === \"PageDown\") newParts.m = (parts.m - minuteStep * 3 + 60) % 60;\n if (e.key === \"ArrowLeft\") setFocusedColumn(\"hour\");\n if (e.key === \"ArrowRight\") setFocusedColumn(includeSeconds ? \"second\" : format === \"12\" ? \"period\" : null);\n break;\n case \"second\":\n if (e.key === \"ArrowUp\") newParts.s = (parts.s + secondStep) % 60;\n if (e.key === \"ArrowDown\") newParts.s = (parts.s - secondStep + 60) % 60;\n if (e.key === \"Home\") newParts.s = 0;\n if (e.key === \"End\") newParts.s = 59 - (59 % secondStep);\n if (e.key === \"PageUp\") newParts.s = (parts.s + secondStep * 3) % 60;\n if (e.key === \"PageDown\") newParts.s = (parts.s - secondStep * 3 + 60) % 60;\n if (e.key === \"ArrowLeft\") setFocusedColumn(\"minute\");\n if (e.key === \"ArrowRight\" && format === \"12\") setFocusedColumn(\"period\");\n break;\n case \"period\":\n if (e.key === \"ArrowUp\" || e.key === \"ArrowDown\" || e.key === \"Home\" || e.key === \"End\") {\n newParts.p = newParts.p === \"AM\" ? \"PM\" : \"AM\";\n }\n if (e.key === \"ArrowLeft\") setFocusedColumn(includeSeconds ? \"second\" : \"minute\");\n break;\n }\n\n setParts(newParts);\n emit(newParts);\n };\n\n const setNow = () => {\n const now = new Date();\n const h = now.getHours();\n const m = now.getMinutes();\n const s = now.getSeconds();\n let next: Parts;\n if (format === \"12\") {\n next = { h: h % 12 || 12, m, s, p: h >= 12 ? \"PM\" : \"AM\" };\n } else {\n next = { h, m, s };\n }\n setParts(next);\n emit(next);\n };\n\n const setPreset = (preset: keyof typeof PRESETS) => {\n const { h, m, s } = PRESETS[preset];\n let next: Parts;\n if (format === \"12\") {\n next = { h: h % 12 || 12, m, s, p: h >= 12 ? \"PM\" : \"AM\" };\n } else {\n next = { h, m, s };\n }\n setParts(next);\n emit(next);\n };\n\n const handleManualInput = (input: string) => {\n setManualInput(input);\n const parsed = parseTime(input, format, includeSeconds);\n if (parsed) {\n const timeStr = formatTime(parsed, format, includeSeconds);\n if (isTimeInRange(timeStr) && !isTimeDisabled(timeStr)) {\n setParts(parsed);\n emit(parsed);\n }\n }\n };\n\n const handleCustomPreset = (time: string) => {\n const parsed = parseTime(time, format, includeSeconds);\n if (parsed) {\n setParts(parsed);\n emit(parsed);\n }\n };\n\n const hours: number[] = format === \"24\" ? Array.from({ length: 24 }, (_, i) => i) : Array.from({ length: 12 }, (_, i) => (i + 1));\n const minutes: number[] = Array.from({ length: Math.ceil(60 / minuteStep) }, (_, i) => Math.min(59, i * minuteStep));\n const seconds: number[] = Array.from({ length: Math.ceil(60 / secondStep) }, (_, i) => Math.min(59, i * secondStep));\n\n const sizeClasses = {\n sm: { label: \"text-xs\", height: \"h-8\", padding: \"px-2.5 py-1.5\", text: \"text-xs\", icon: \"w-3.5 h-3.5\" },\n md: { label: \"text-sm\", height: \"h-10\", padding: \"px-3 py-2\", text: \"text-sm\", icon: \"w-4 h-4\" },\n lg: { label: \"text-base\", height: \"h-12\", padding: \"px-4 py-3\", text: \"text-base\", icon: \"w-5 h-5\" },\n };\n\n const sz = sizeClasses[size];\n const radiusClass = size === \"sm\" ? \"rounded-md\" : \"rounded-lg\";\n\n const display = formatTime(parts, format, includeSeconds);\n\n const trigger = variant === \"inline\" ? null : (\n <button\n type=\"button\"\n disabled={disabled}\n aria-label=\"Select time\"\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n className={cn(\n \"flex w-full items-center justify-between border bg-background\",\n sz.height,\n sz.padding,\n sz.text,\n radiusClass,\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background\",\n \"disabled:opacity-50 disabled:cursor-not-allowed\",\n \"transition-all duration-200\",\n error && \"border-destructive focus-visible:ring-destructive\",\n success && \"border-green-500 focus-visible:ring-green-500\",\n !error && !success && \"border-input hover:bg-accent/5\",\n animate && !disabled && \"hover:shadow-md\",\n className\n )}\n >\n <div className=\"flex items-center gap-2\">\n <Clock className={cn(sz.icon, error ? \"text-destructive\" : success ? \"text-green-500\" : \"text-muted-foreground\")} />\n <span className={cn(\"truncate\", !value && !defaultValue && \"text-muted-foreground\")}>\n {value || defaultValue ? display : placeholder}\n </span>\n </div>\n <span className={cn(\"ml-2 transition-transform duration-200\", open && \"rotate-180\")}>\n <svg className={sz.icon} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 9l-7 7-7-7\" />\n </svg>\n </span>\n </button>\n );\n\n const contentWidth = variant === \"compact\" ? 240 : variant === \"inline\" ? 320 : includeSeconds ? 340 : 300;\n\n const timePickerContent = (\n <div className=\"space-y-3\">\n {/* Manual Input */}\n {allowManualInput && (\n <div>\n <Input\n placeholder={format === \"12\" ? \"02:30 PM\" : \"14:30\"}\n value={manualInput || display}\n onChange={(e) => handleManualInput(e.target.value)}\n size=\"sm\"\n variant=\"outlined\"\n />\n </div>\n )}\n\n {/* Presets */}\n {showPresets && (\n <div className=\"grid grid-cols-2 gap-2\">\n {Object.keys(PRESETS).map((preset) => (\n <button\n key={preset}\n type=\"button\"\n className={cn(\n \"px-2 py-1.5 text-xs rounded-md border border-border hover:bg-accent/10 capitalize transition-all\",\n animate && \"hover:scale-105 active:scale-95\"\n )}\n onClick={() => setPreset(preset as keyof typeof PRESETS)}\n aria-label={`Set time to ${preset}`}\n >\n {preset}\n </button>\n ))}\n </div>\n )}\n\n {/* Custom Presets */}\n {customPresets && customPresets.length > 0 && (\n <div className=\"grid grid-cols-2 gap-2\">\n {customPresets.map((preset, idx) => (\n <button\n key={idx}\n type=\"button\"\n className={cn(\n \"px-2 py-1.5 text-xs rounded-md border border-border hover:bg-accent/10 transition-all\",\n animate && \"hover:scale-105 active:scale-95\"\n )}\n onClick={() => handleCustomPreset(preset.time)}\n aria-label={`Set time to ${preset.label}`}\n >\n {preset.label}\n </button>\n ))}\n </div>\n )}\n\n {/* Time Selector */}\n <div className=\"flex gap-3\">\n {/* Hours */}\n <div className=\"flex-1 min-w-[70px]\">\n <div className=\"text-xs font-semibold text-muted-foreground mb-2 text-center\">Hour</div>\n <div\n ref={hourScrollRef}\n className=\"max-h-48 overflow-y-auto pr-1 space-y-1 scrollbar-thin scroll-smooth\"\n role=\"listbox\"\n aria-label=\"Select hour\"\n tabIndex={focusedColumn === \"hour\" ? 0 : -1}\n onKeyDown={(e) => handleKeyDown(e, \"hour\")}\n onFocus={() => setFocusedColumn(\"hour\")}\n >\n {hours.map((h) => {\n const isSelected = (format === \"24\" && parts.h === h) || (format === \"12\" && (parts.h % 12 || 12) === (h % 12 || 12));\n return (\n <button\n key={h}\n type=\"button\"\n role=\"option\"\n aria-selected={isSelected}\n className={cn(\n \"w-full text-center px-3 py-2 rounded-md transition-all text-sm font-medium\",\n \"hover:bg-accent hover:scale-105 active:scale-95 focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1\",\n isSelected && \"bg-primary text-primary-foreground shadow-md\",\n !isSelected && \"text-foreground/80\",\n animate && \"transition-transform duration-150\"\n )}\n onClick={() => {\n const nextH = format === \"24\" ? h : ((parts.p === \"PM\" ? (h % 12) + 12 : (h % 12))) % 24;\n const next = { ...parts, h: format === \"24\" ? h : (nextH === 0 && parts.p === \"AM\" ? 0 : nextH || (parts.p === \"PM\" ? 12 : 0)) };\n setParts(next);\n emit(next);\n }}\n >\n {pad(h)}\n </button>\n );\n })}\n </div>\n </div>\n\n {/* Visual separator */}\n <div className=\"w-px bg-border/50 self-stretch my-8\" />\n\n {/* Minutes */}\n <div className=\"flex-1 min-w-[70px]\">\n <div className=\"text-xs font-semibold text-muted-foreground mb-2 text-center\">Min</div>\n <div\n ref={minuteScrollRef}\n className=\"max-h-48 overflow-y-auto pr-1 space-y-1 scrollbar-thin scroll-smooth\"\n role=\"listbox\"\n aria-label=\"Select minute\"\n tabIndex={focusedColumn === \"minute\" ? 0 : -1}\n onKeyDown={(e) => handleKeyDown(e, \"minute\")}\n onFocus={() => setFocusedColumn(\"minute\")}\n >\n {minutes.map((m) => {\n const isSelected = parts.m === m;\n return (\n <button\n key={m}\n type=\"button\"\n role=\"option\"\n aria-selected={isSelected}\n className={cn(\n \"w-full text-center px-3 py-2 rounded-md transition-all text-sm font-medium\",\n \"hover:bg-accent hover:scale-105 active:scale-95 focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1\",\n isSelected && \"bg-primary text-primary-foreground shadow-md\",\n !isSelected && \"text-foreground/80\",\n animate && \"transition-transform duration-150\"\n )}\n onClick={() => {\n const next = { ...parts, m };\n setParts(next);\n emit(next);\n }}\n >\n {pad(m)}\n </button>\n );\n })}\n </div>\n </div>\n\n {/* Visual separator */}\n <div className=\"w-px bg-border/50 self-stretch my-8\" />\n\n {/* Seconds */}\n {includeSeconds && (\n <>\n <div className=\"flex-1 min-w-[70px]\">\n <div className=\"text-xs font-semibold text-muted-foreground mb-2 text-center\">Sec</div>\n <div\n ref={secondScrollRef}\n className=\"max-h-48 overflow-y-auto pr-1 space-y-1 scrollbar-thin scroll-smooth\"\n role=\"listbox\"\n aria-label=\"Select second\"\n tabIndex={focusedColumn === \"second\" ? 0 : -1}\n onKeyDown={(e) => handleKeyDown(e, \"second\")}\n onFocus={() => setFocusedColumn(\"second\")}\n >\n {seconds.map((s) => {\n const isSelected = parts.s === s;\n return (\n <button\n key={s}\n type=\"button\"\n role=\"option\"\n aria-selected={isSelected}\n className={cn(\n \"w-full text-center px-3 py-2 rounded-md transition-all text-sm font-medium\",\n \"hover:bg-accent hover:scale-105 active:scale-95 focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1\",\n isSelected && \"bg-primary text-primary-foreground shadow-md\",\n !isSelected && \"text-foreground/80\",\n animate && \"transition-transform duration-150\"\n )}\n onClick={() => {\n const next = { ...parts, s };\n setParts(next);\n emit(next);\n }}\n >\n {pad(s)}\n </button>\n );\n })}\n </div>\n </div>\n {/* Visual separator */}\n <div className=\"w-px bg-border/50 self-stretch my-8\" />\n </>\n )}\n\n {/* AM/PM */}\n {format === \"12\" && (\n <div className=\"w-20\">\n <div className=\"text-xs font-semibold text-muted-foreground mb-2 text-center\">Period</div>\n <div\n className=\"flex flex-col gap-2\"\n role=\"radiogroup\"\n aria-label=\"Select AM or PM\"\n tabIndex={focusedColumn === \"period\" ? 0 : -1}\n onKeyDown={(e) => handleKeyDown(e, \"period\")}\n onFocus={() => setFocusedColumn(\"period\")}\n >\n {[\"AM\", \"PM\"].map((p) => {\n const isSelected = parts.p === p;\n return (\n <button\n key={p}\n type=\"button\"\n role=\"radio\"\n aria-checked={isSelected}\n className={cn(\n \"px-4 py-3 rounded-md transition-all text-sm font-semibold\",\n \"hover:bg-accent hover:scale-105 active:scale-95 focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1\",\n isSelected && \"bg-primary text-primary-foreground shadow-md\",\n !isSelected && \"text-foreground/80 border border-border\",\n animate && \"transition-transform duration-150\"\n )}\n onClick={() => {\n const pVal = p as \"AM\" | \"PM\";\n let hour = parts.h;\n if (pVal === \"AM\" && hour >= 12) hour -= 12;\n if (pVal === \"PM\" && hour < 12) hour += 12;\n const next = { ...parts, p: pVal, h: hour };\n setParts(next);\n emit(next);\n }}\n >\n {p}\n </button>\n );\n })}\n </div>\n </div>\n )}\n </div>\n\n {/* Action Buttons */}\n {(showNow || clearable) && (\n <div className=\"flex items-center justify-between gap-2 pt-3 border-t border-border\">\n {showNow && (\n <button\n type=\"button\"\n className={cn(\n \"px-3 py-2 text-xs rounded-md border border-border hover:bg-accent/10 transition-all flex items-center gap-2 font-medium\",\n animate && \"hover:scale-105 active:scale-95\"\n )}\n onClick={() => {\n setNow();\n if (variant === \"compact\") handleOpenChange(false);\n }}\n aria-label=\"Set current time\"\n >\n <Clock className=\"w-3.5 h-3.5\" />\n Now\n </button>\n )}\n <div className=\"flex-1\" />\n {clearable && (\n <button\n type=\"button\"\n className={cn(\n \"px-3 py-2 text-xs rounded-md border border-border hover:bg-destructive/10 hover:text-destructive transition-all flex items-center gap-2 font-medium\",\n animate && \"hover:scale-105 active:scale-95\"\n )}\n onClick={() => {\n setParts(initial);\n emit(undefined);\n handleOpenChange(false);\n }}\n aria-label=\"Clear selected time\"\n >\n <X className=\"w-3.5 h-3.5\" />\n Clear\n </button>\n )}\n </div>\n )}\n </div>\n );\n\n // Inline variant renders content directly without popover\n if (variant === \"inline\") {\n return (\n <div className=\"w-full\" {...rest}>\n {label && (\n <div className=\"flex items-center justify-between mb-2\">\n <label className={cn(sz.label, \"font-medium\", disabled ? \"text-muted-foreground\" : \"text-foreground\")}>\n {label}\n {required && <span className=\"text-destructive ml-1\">*</span>}\n </label>\n </div>\n )}\n <div className={cn(\"p-3 rounded-lg border border-border bg-card shadow-sm\", className)}>{timePickerContent}</div>\n </div>\n );\n }\n\n return (\n <div className=\"w-full\" {...rest}>\n {label && (\n <div className=\"flex items-center justify-between mb-1.5\">\n <label\n className={cn(sz.label, \"font-medium\", disabled ? \"text-muted-foreground\" : \"text-foreground\", \"cursor-pointer\")}\n onClick={() => !disabled && handleOpenChange(true)}\n >\n {label}\n {required && <span className=\"text-destructive ml-1\">*</span>}\n </label>\n </div>\n )}\n\n <Popover\n trigger={trigger!}\n open={open}\n onOpenChange={handleOpenChange}\n placement=\"bottom-start\"\n matchTriggerWidth={variant === \"compact\"}\n contentWidth={contentWidth}\n contentClassName={cn(\n \"p-4 rounded-lg border bg-popover shadow-xl backdrop-blur-md\",\n error && \"border-destructive\",\n success && \"border-green-500\",\n !error && !success && \"border-border\",\n animate && \"animate-in fade-in-0 zoom-in-95 duration-200\"\n )}\n >\n {timePickerContent}\n </Popover>\n\n {/* Validation and Helper Text */}\n {(error || success || helperText) && (\n <div className={cn(\"mt-1.5 flex items-start gap-1.5\", sz.label)}>\n {error && (\n <div className=\"flex items-center gap-1.5 text-destructive\">\n <X className=\"w-3.5 h-3.5 shrink-0\" />\n <span>{error}</span>\n </div>\n )}\n {success && !error && (\n <div className=\"flex items-center gap-1.5 text-green-600\">\n <Check className=\"w-3.5 h-3.5 shrink-0\" />\n <span>Valid time selected</span>\n </div>\n )}\n {helperText && !error && !success && <span className=\"text-muted-foreground\">{helperText}</span>}\n </div>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"@/lib/utils/cn\";\nimport { ChevronLeft, ChevronRight, Calendar as CalendarIcon } from \"lucide-react\";\nimport Button from \"./Button\";\n\ntype SelectMode = \"single\" | \"multiple\" | \"range\";\ntype Variant = \"default\" | \"bordered\" | \"card\" | \"minimal\";\ntype DisplayMode = \"month\" | \"week\" | \"year\";\n\nexport interface CalendarEvent {\n date: Date | string;\n title?: string;\n color?: string; // dot color\n badge?: string; // badge text\n}\n\nexport interface CalendarProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'defaultValue' | 'value' | 'onSelect'> {\n month?: Date; // visible month\n defaultMonth?: Date;\n onMonthChange?: (next: Date) => void;\n value?: Date | Date[] | { start?: Date; end?: Date };\n defaultValue?: Date | Date[] | { start?: Date; end?: Date };\n onSelect?: (value: Date | Date[] | { start?: Date; end?: Date }) => void;\n selectMode?: SelectMode;\n weekStartsOn?: 0 | 1 | 2 | 3 | 4 | 5 | 6; // 0=Sun\n showWeekdays?: boolean;\n showHeader?: boolean;\n size?: \"sm\" | \"md\" | \"lg\" | \"xl\";\n variant?: Variant;\n events?: CalendarEvent[];\n renderDay?: (args: { date: Date; isCurrentMonth: boolean; isToday: boolean; isSelected: boolean; events: CalendarEvent[] }) => React.ReactNode;\n labels?: { weekdays?: string[]; month?: (date: Date) => string; prev?: string; next?: string; today?: string; clear?: string };\n /** Display mode: month grid, single week, or year */\n display?: DisplayMode;\n /** Number of months to render side-by-side (month mode only) */\n months?: number;\n /** Show \"Today\" button */\n showToday?: boolean;\n /** Show \"Clear\" button */\n showClear?: boolean;\n /** Minimum selectable date */\n minDate?: Date;\n /** Maximum selectable date */\n maxDate?: Date;\n /** Disabled dates */\n disabledDates?: Date[] | ((date: Date) => boolean);\n /** Dense mode with less padding */\n dense?: boolean;\n /** Animate transitions */\n animate?: boolean;\n /** Show event badges */\n showEventBadges?: boolean;\n /** Highlight weekends */\n highlightWeekends?: boolean;\n}\n\nfunction startOfMonth(d: Date) { return new Date(d.getFullYear(), d.getMonth(), 1); }\nfunction endOfMonth(d: Date) { return new Date(d.getFullYear(), d.getMonth() + 1, 0); }\nfunction addMonths(d: Date, n: number) { const nd = new Date(d); nd.setMonth(d.getMonth() + n); return nd; }\nfunction isSameDay(a: Date, b: Date) { return a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth() && a.getDate() === b.getDate(); }\nfunction toDate(x: Date | string) { return x instanceof Date ? x : new Date(x); }\nfunction addDays(d: Date, n: number) { const nd = new Date(d); nd.setDate(d.getDate() + n); return nd; }\nfunction startOfWeek(d: Date, weekStartsOn: number) {\n const day = d.getDay();\n const diff = (day - weekStartsOn + 7) % 7;\n const s = new Date(d);\n s.setDate(d.getDate() - diff);\n return new Date(s.getFullYear(), s.getMonth(), s.getDate());\n}\n\nfunction getMonthGrid(view: Date, weekStartsOn: number) {\n const start = startOfMonth(view);\n const end = endOfMonth(view);\n const startDay = (start.getDay() - weekStartsOn + 7) % 7; // 0..6 offset\n const days: Date[] = [];\n // Fill leading days from previous month\n for (let i = 0; i < startDay; i++) {\n const d = new Date(start);\n d.setDate(d.getDate() - (startDay - i));\n days.push(d);\n }\n // Current month\n for (let d = 1; d <= end.getDate(); d++) {\n days.push(new Date(view.getFullYear(), view.getMonth(), d));\n }\n // Trailing days to complete weeks (6 rows max)\n while (days.length % 7 !== 0) {\n const last = days[days.length - 1];\n const next = new Date(last);\n next.setDate(last.getDate() + 1);\n days.push(next);\n }\n return days;\n}\n\nexport default function Calendar({\n month,\n defaultMonth,\n onMonthChange,\n value,\n defaultValue,\n onSelect,\n selectMode = \"single\",\n weekStartsOn = 0,\n showWeekdays = true,\n showHeader = true,\n size = \"md\",\n variant = \"default\",\n events = [],\n renderDay,\n labels,\n className,\n display = \"month\",\n months = 1,\n showToday = false,\n showClear = false,\n minDate,\n maxDate,\n disabledDates,\n dense = false,\n animate = false,\n showEventBadges = false,\n highlightWeekends = false,\n ...rest\n}: CalendarProps) {\n const isControlledMonth = month != null;\n const [view, setView] = React.useState<Date>(() => month ?? defaultMonth ?? new Date());\n React.useEffect(() => { if (isControlledMonth && month) setView(month); }, [isControlledMonth, month]);\n\n const isControlledValue = value !== undefined;\n const [internal, setInternal] = React.useState<CalendarProps[\"value\"] | undefined>(defaultValue);\n const selected = isControlledValue ? value : internal;\n\n const goByView = (delta: number) => {\n const next = display === \"week\" ? addDays(view, delta * 7) : addMonths(view, delta);\n if (!isControlledMonth) setView(next);\n if (display === \"month\") onMonthChange?.(next);\n };\n\n const weekNames = labels?.weekdays ?? [\"Su\",\"Mo\",\"Tu\",\"We\",\"Th\",\"Fr\",\"Sa\"];\n const rotate = (arr: string[], n: number) => arr.slice(n).concat(arr.slice(0, n));\n const weekdays = rotate(weekNames, weekStartsOn);\n\n const days = getMonthGrid(view, weekStartsOn);\n const today = new Date();\n\n const byDay = React.useMemo(() => {\n const map = new Map<string, CalendarEvent[]>();\n for (const e of events) {\n const d = toDate(e.date);\n const k = `${d.getFullYear()}-${d.getMonth()}-${d.getDate()}`;\n if (!map.has(k)) map.set(k, []);\n map.get(k)!.push(e);\n }\n return map;\n }, [events]);\n\n const isSelected = (d: Date): boolean => {\n if (!selected) return false;\n if (selectMode === \"single\" && selected instanceof Date) return isSameDay(selected, d);\n if (selectMode === \"multiple\" && Array.isArray(selected)) return selected.some((x) => isSameDay(x as Date, d));\n if (selectMode === \"range\" && !Array.isArray(selected) && typeof selected === \"object\") {\n const s = (selected as any).start as Date | undefined;\n const e = (selected as any).end as Date | undefined;\n if (s && e) return d >= new Date(s.getFullYear(), s.getMonth(), s.getDate()) && d <= new Date(e.getFullYear(), e.getMonth(), e.getDate());\n if (s) return isSameDay(s, d);\n if (e) return isSameDay(e, d);\n }\n return false;\n };\n\n const commit = (next: CalendarProps[\"value\"]) => {\n if (!isControlledValue) setInternal(next);\n onSelect?.(next!);\n };\n\n const handleClickDay = (d: Date) => {\n if (selectMode === \"single\") {\n commit(d);\n return;\n }\n if (selectMode === \"multiple\") {\n const arr = Array.isArray(selected) ? (selected as Date[]) : [];\n const exists = arr.some((x) => isSameDay(x, d));\n const next = exists ? arr.filter((x) => !isSameDay(x, d)) : [...arr, d];\n commit(next);\n return;\n }\n if (selectMode === \"range\") {\n const cur = (!Array.isArray(selected) && typeof selected === \"object\") ? (selected as any) : {};\n const s = cur.start as Date | undefined;\n const e = cur.end as Date | undefined;\n if (!s || (s && e)) {\n commit({ start: d, end: undefined });\n } else if (s && !e) {\n if (d < s) commit({ start: d, end: s }); else commit({ start: s, end: d });\n }\n }\n };\n\n const isDateDisabled = React.useCallback((d: Date): boolean => {\n if (minDate && d < new Date(minDate.getFullYear(), minDate.getMonth(), minDate.getDate())) return true;\n if (maxDate && d > new Date(maxDate.getFullYear(), maxDate.getMonth(), maxDate.getDate())) return true;\n if (Array.isArray(disabledDates)) {\n return disabledDates.some((dd) => isSameDay(dd, d));\n }\n if (typeof disabledDates === \"function\") {\n return disabledDates(d);\n }\n return false;\n }, [minDate, maxDate, disabledDates]);\n\n const SIZE_STYLES = {\n sm: { day: \"w-8 h-8 text-[12px]\", grid: dense ? \"gap-0.5\" : \"gap-1\", head: \"text-[11px]\", header: \"text-sm\" },\n md: { day: \"w-9 h-9 text-sm\", grid: dense ? \"gap-1\" : \"gap-1.5\", head: \"text-xs\", header: \"text-sm\" },\n lg: { day: \"w-11 h-11 text-base\", grid: dense ? \"gap-1.5\" : \"gap-2\", head: \"text-sm\", header: \"text-base\" },\n xl: { day: \"w-14 h-14 text-lg\", grid: dense ? \"gap-2\" : \"gap-2.5\", head: \"text-base\", header: \"text-lg\" },\n };\n const sz = SIZE_STYLES[size];\n\n const VARIANT_STYLES = {\n default: \"border border-border rounded-lg bg-card\",\n bordered: \"border-2 border-border rounded-xl bg-card shadow-sm\",\n card: \"border border-border rounded-xl bg-card shadow-lg\",\n minimal: \"bg-transparent\",\n };\n\n const weekDays = React.useMemo(() => {\n const s = startOfWeek(view, weekStartsOn);\n return Array.from({ length: 7 }, (_, i) => addDays(s, i));\n }, [view, weekStartsOn]);\n\n const renderMonth = (monthDate: Date) => {\n const monthDays = getMonthGrid(monthDate, weekStartsOn);\n const monthLabel = labels?.month ? labels.month(monthDate) : monthDate.toLocaleDateString(\"en-US\", { month: \"long\", year: \"numeric\" });\n return (\n <div>\n {months > 1 && (\n <div className=\"flex items-center justify-center mb-2 text-sm font-semibold\">{monthLabel}</div>\n )}\n {showWeekdays && (\n <div className={cn(\"grid grid-cols-7\", sz.grid, \"mb-1 text-center text-muted-foreground font-medium\")}> \n {weekdays.map((w) => (\n <div key={`${monthLabel}-${w}`} className={cn(sz.head)}>{w}</div>\n ))}\n </div>\n )}\n <div className={cn(\"grid grid-cols-7\", sz.grid)}>\n {monthDays.map((d, idx) => {\n const inMonth = d.getMonth() === monthDate.getMonth();\n const isToday = isSameDay(d, today);\n const selectedDay = isSelected(d);\n const k = `${d.getFullYear()}-${d.getMonth()}-${d.getDate()}`;\n const dayEvents = byDay.get(k) || [];\n const disabled = isDateDisabled(d);\n return (\n <button\n key={`${monthLabel}-${idx}`}\n onClick={() => handleClickDay(d)}\n disabled={disabled}\n className={cn(\n \"rounded-md flex items-center justify-center relative\",\n sz.day,\n !inMonth && \"text-muted-foreground/60\",\n disabled && \"opacity-40 cursor-not-allowed\",\n isToday && !selectedDay && \"ring-1 ring-primary/50\",\n selectedDay && \"bg-primary text-primary-foreground hover:bg-primary/90\",\n !selectedDay && \"hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground\"\n )}\n title={d.toDateString()}\n >\n {d.getDate()}\n {dayEvents.length > 0 && (\n <span className=\"absolute -bottom-1 inline-flex gap-0.5\">\n {dayEvents.slice(0,3).map((e, i) => (\n <span key={i} className=\"h-1.5 w-1.5 rounded-full\" style={{ backgroundColor: e.color || \"hsl(var(--primary))\" }} />\n ))}\n </span>\n )}\n </button>\n );\n })}\n </div>\n </div>\n );\n };\n\n // Navigation bounds\n const minBound = React.useMemo(() => (minDate ? new Date(minDate.getFullYear(), minDate.getMonth(), minDate.getDate()) : undefined), [minDate]);\n const maxBound = React.useMemo(() => (maxDate ? new Date(maxDate.getFullYear(), maxDate.getMonth(), maxDate.getDate()) : undefined), [maxDate]);\n const prevDisabled = React.useMemo(() => {\n if (!minBound) return false;\n if (display === 'week') {\n const start = startOfWeek(view, weekStartsOn);\n const prevEnd = addDays(start, -1);\n return prevEnd < minBound;\n }\n const prevEnd = endOfMonth(addMonths(view, -1));\n return prevEnd < minBound;\n }, [display, view, weekStartsOn, minBound]);\n const nextDisabled = React.useMemo(() => {\n if (!maxBound) return false;\n if (display === 'week') {\n const start = startOfWeek(view, weekStartsOn);\n const nextStart = addDays(start, 7);\n return nextStart > maxBound;\n }\n const nextStart = startOfMonth(addMonths(view, 1));\n return nextStart > maxBound;\n }, [display, view, weekStartsOn, maxBound]);\n\n return (\n <div className={cn(\"w-full\", className)} {...rest}>\n {showHeader && (\n <div className=\"flex items-center justify-between mb-2\">\n <button onClick={() => goByView(-1)} disabled={prevDisabled} className={cn(\"p-1 rounded-md hover:bg-accent\", prevDisabled && \"opacity-40 cursor-not-allowed hover:bg-transparent\")} aria-label={labels?.prev || (display === 'week' ? \"Previous week\" : \"Previous month\")}>\n <ChevronLeft className=\"h-4 w-4\" />\n </button>\n <div className=\"text-sm font-semibold\">\n {display === 'week'\n ? `${(labels?.month ? labels.month(weekDays[0]) : weekDays[0].toLocaleDateString(\"en-US\", { month: \"short\" }))} ${weekDays[0].getDate()} – ${(labels?.month ? labels.month(weekDays[6]) : weekDays[6].toLocaleDateString(\"en-US\", { month: \"short\" }))} ${weekDays[6].getDate()}`\n : (labels?.month ? labels.month(view) : view.toLocaleDateString(\"en-US\", { month: \"long\", year: \"numeric\" }))}\n </div>\n <button onClick={() => goByView(1)} disabled={nextDisabled} className={cn(\"p-1 rounded-md hover:bg-accent\", nextDisabled && \"opacity-40 cursor-not-allowed hover:bg-transparent\")} aria-label={labels?.next || (display === 'week' ? \"Next week\" : \"Next month\")}>\n <ChevronRight className=\"h-4 w-4\" />\n </button>\n </div>\n )}\n\n {display === 'week' ? (\n <>\n {showWeekdays && (\n <div className={cn(\"grid grid-cols-7\", sz.grid, \"mb-1 text-center text-muted-foreground font-medium\")}>\n {weekdays.map((w) => (\n <div key={`w-${w}`} className={cn(sz.head)}>{w}</div>\n ))}\n </div>\n )}\n <div className={cn(\"grid grid-cols-7\", sz.grid)}>\n {weekDays.map((d, idx) => {\n const inMonth = true; // week mode emphasizes the 7-day window, no dimming\n const isToday = isSameDay(d, today);\n const selectedDay = isSelected(d);\n const k = `${d.getFullYear()}-${d.getMonth()}-${d.getDate()}`;\n const dayEvents = byDay.get(k) || [];\n const disabled = isDateDisabled(d);\n return (\n <button\n key={`wd-${idx}`}\n onClick={() => handleClickDay(d)}\n disabled={disabled}\n className={cn(\n \"rounded-md flex items-center justify-center relative\",\n sz.day,\n disabled && \"opacity-40 cursor-not-allowed\",\n isToday && !selectedDay && \"ring-1 ring-primary/50\",\n selectedDay && \"bg-primary text-primary-foreground hover:bg-primary/90\",\n !selectedDay && \"hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground\"\n )}\n title={d.toDateString()}\n >\n {d.getDate()}\n {dayEvents.length > 0 && (\n <span className=\"absolute -bottom-1 inline-flex gap-0.5\">\n {dayEvents.slice(0,3).map((e, i) => (\n <span key={i} className=\"h-1.5 w-1.5 rounded-full\" style={{ backgroundColor: e.color || \"hsl(var(--primary))\" }} />\n ))}\n </span>\n )}\n </button>\n );\n })}\n </div>\n </>\n ) : (\n <div className={cn(months > 1 ? \"grid md:grid-cols-2 lg:grid-cols-3 gap-4\" : \"\")}>\n {Array.from({ length: Math.max(1, months) }, (_, i) => (\n <React.Fragment key={`cal-month-${view.getFullYear()}-${view.getMonth()}-${i}`}>\n {renderMonth(addMonths(view, i))}\n </React.Fragment>\n ))}\n </div>\n )}\n </div>\n );\n}\n\n// types exported above\n","\"use client\";\n\nimport * as React from \"react\";\nimport { useId } from \"react\";\nimport { createPortal } from \"react-dom\";\n// Removed floating-ui dependencies\nimport { cn } from \"@/lib/utils/cn\";\nimport { ChevronDown, Search, Check, SearchX, Loader2 } from \"lucide-react\";\nimport { useShadCNAnimations } from \"@/lib/utils/shadcn-animations\";\n\nexport interface MultiComboboxOption {\n value: string;\n label: string;\n}\n\nexport interface MultiComboboxProps {\n id?: string;\n options: Array<string | MultiComboboxOption>;\n value: string[];\n onChange: (value: string[]) => void;\n placeholder?: string;\n maxSelected?: number;\n disabledOptions?: string[];\n showTags?: boolean;\n showClear?: boolean;\n className?: string;\n disabled?: boolean;\n size?: \"sm\" | \"md\" | \"lg\";\n label?: string;\n title?: string;\n required?: boolean;\n displayFormat?: (option: MultiComboboxOption) => string;\n loading?: boolean;\n loadingText?: string;\n emptyText?: string;\n}\n\nexport const MultiCombobox: React.FC<MultiComboboxProps> = ({\n id,\n options,\n value,\n onChange,\n placeholder = \"Search...\",\n maxSelected,\n disabledOptions = [],\n showTags = true,\n showClear = true,\n className,\n disabled = false,\n size = \"md\",\n label,\n title,\n required,\n displayFormat = (option) => option.label,\n loading = false,\n loadingText = \"Loading...\",\n emptyText = \"No results found\",\n}) => {\n const [query, setQuery] = React.useState(\"\");\n const [open, setOpen] = React.useState(false);\n const [activeIndex, setActiveIndex] = React.useState<number | null>(null);\n const inputRef = React.useRef<HTMLInputElement>(null);\n const listRef = React.useRef<Array<HTMLElement | null>>([]);\n\n // Manual positioning\n const [dropdownPosition, setDropdownPosition] = React.useState<{ top: number; left: number; width: number } | null>(null);\n const triggerRef = React.useRef<HTMLButtonElement>(null);\n const dropdownRef = React.useRef<HTMLDivElement | null>(null);\n\n // Inject ShadCN animations\n useShadCNAnimations();\n\n // Calculate positioning synchronously on open to avoid flicker\n const calculatePosition = React.useCallback(() => {\n if (!triggerRef.current) return null;\n const rect = triggerRef.current.getBoundingClientRect();\n const scrollTop = window.pageYOffset || document.documentElement.scrollTop;\n const scrollLeft = window.pageXOffset || document.documentElement.scrollLeft;\n return {\n top: rect.bottom + scrollTop + 4,\n left: rect.left + scrollLeft,\n width: rect.width,\n };\n }, []);\n\n // Reposition on resize/scroll while open\n React.useEffect(() => {\n if (!open) return;\n const handler = () => {\n const pos = calculatePosition();\n if (pos) setDropdownPosition(pos);\n };\n window.addEventListener(\"resize\", handler);\n window.addEventListener(\"scroll\", handler, true);\n return () => {\n window.removeEventListener(\"resize\", handler);\n window.removeEventListener(\"scroll\", handler, true);\n };\n }, [open, calculatePosition]);\n\n // Handle clicks outside\n React.useEffect(() => {\n if (!open) return;\n\n const handleClickOutside = (event: MouseEvent) => {\n const target = event.target as Node;\n const triggerEl = triggerRef.current;\n const dropdownEl = dropdownRef.current;\n\n if (triggerEl && !triggerEl.contains(target) && dropdownEl && !dropdownEl.contains(target)) {\n setOpen(false);\n }\n };\n\n const handleEscape = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n setOpen(false);\n }\n };\n\n document.addEventListener(\"mousedown\", handleClickOutside);\n document.addEventListener(\"keydown\", handleEscape);\n\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside);\n document.removeEventListener(\"keydown\", handleEscape);\n };\n }, [open]);\n\n // Normalize options to objects { value, label } to support both string[] and object[] APIs\n const normalizedOptions = React.useMemo<MultiComboboxOption[]>(\n () => options.map((o) => (typeof o === \"string\" ? { value: o, label: o } : { value: o.value, label: o.label })),\n [options]\n );\n\n // Enable search only if options.length > 10\n const enableSearch = normalizedOptions.length > 10;\n\n const filtered = React.useMemo(\n () => (enableSearch ? normalizedOptions.filter((opt) => opt.label.toLowerCase().includes(query.toLowerCase())) : normalizedOptions),\n [normalizedOptions, query, enableSearch]\n );\n\n const toggleSelect = (optionValue: string) => {\n if (disabledOptions.includes(optionValue)) return;\n if (value.includes(optionValue)) {\n onChange(value.filter((v) => v !== optionValue));\n } else {\n if (!maxSelected || value.length < maxSelected) {\n onChange([...value, optionValue]);\n }\n }\n };\n\n const handleRemove = (val: string) => {\n onChange(value.filter((v) => v !== val));\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (!open) setOpen(true);\n\n if (e.key === \"Enter\") {\n e.preventDefault();\n if (activeIndex !== null && filtered[activeIndex]) {\n toggleSelect(filtered[activeIndex].value);\n }\n }\n };\n\n const handleClearAll = () => {\n onChange([]);\n };\n\n // Auto-focus input when dropdown opens (only if search is enabled)\n React.useEffect(() => {\n if (open && enableSearch) {\n // Focus input after dropdown is positioned\n setTimeout(() => {\n inputRef.current?.focus();\n }, 100);\n }\n }, [open, enableSearch]);\n\n // Size styles to align with Input defaults\n const sizeStyles = {\n sm: {\n trigger: \"h-8 px-3 py-1.5 text-sm md:h-7 md:text-xs\",\n icon: \"h-4 w-4\",\n search: \"px-8 py-1.5 text-xs\",\n item: \"text-xs px-3 py-1.5\",\n tag: \"px-2 py-0.5 text-[10px]\",\n },\n md: {\n trigger: \"h-10 px-4 py-2 text-sm\",\n icon: \"h-4 w-4\",\n search: \"px-8 py-2 text-sm\",\n item: \"text-sm px-3 py-2\",\n tag: \"px-2 py-1 text-xs\",\n },\n lg: {\n trigger: \"h-12 px-5 py-3 text-base\",\n icon: \"h-5 w-5\",\n search: \"px-8 py-3 text-base\",\n item: \"text-base px-3 py-3\",\n tag: \"px-2.5 py-1 text-sm\",\n },\n } as const;\n\n const autoId = useId();\n const resolvedId = id ? String(id) : `multicombobox-${autoId}`;\n const labelId = label ? `${resolvedId}-label` : undefined;\n const labelSize = size === \"sm\" ? \"text-xs\" : size === \"lg\" ? \"text-base\" : \"text-sm\";\n\n return (\n <div className={cn(\"w-full space-y-2 group\", className)}>\n {/* Title */}\n {title && (\n <div className=\"flex items-center justify-between\">\n <label\n className={cn(\n size === \"sm\" ? \"text-xs\" : size === \"lg\" ? \"text-base\" : \"text-sm\",\n \"font-medium transition-colors duration-200\",\n disabled ? \"text-muted-foreground\" : \"text-foreground group-focus-within:text-primary\"\n )}\n >\n {title}\n {required && <span className=\"text-destructive ml-1\">*</span>}\n </label>\n </div>\n )}\n\n {/* Label */}\n {label && (\n <label\n id={labelId}\n onClick={() => triggerRef.current?.focus()}\n className={cn(\n labelSize,\n \"font-medium transition-colors duration-200\",\n disabled ? \"text-muted-foreground\" : \"text-foreground group-focus-within:text-primary\"\n )}\n >\n {label}\n {required && <span className=\"text-destructive ml-1\">*</span>}\n </label>\n )}\n\n <div className=\"relative w-full\" />\n\n <button\n ref={triggerRef}\n type=\"button\"\n disabled={disabled}\n id={resolvedId}\n aria-labelledby={labelId}\n onClick={() => {\n const next = !open;\n if (next) {\n const pos = calculatePosition();\n if (pos) setDropdownPosition(pos);\n }\n setOpen(next);\n }}\n className={cn(\n \"flex w-full items-center gap-2 rounded-lg border border-input bg-background shadow-sm min-h-10\",\n \"px-3 py-2\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background\",\n \"disabled:cursor-not-allowed disabled:opacity-50\"\n )}\n >\n <div className=\"flex items-center gap-1 flex-wrap min-h-6 flex-1\">\n {value.length > 0 ? (\n showTags ? (\n value.map((itemValue) => {\n const option = normalizedOptions.find((o) => o.value === itemValue);\n return (\n <span key={itemValue} className=\"inline-flex items-center gap-1 bg-accent text-accent-foreground rounded px-2 py-1 text-xs\">\n <span className=\"truncate max-w-[120px]\">{option ? displayFormat(option) : itemValue}</span>\n <span\n role=\"button\"\n tabIndex={0}\n aria-label={`Remove ${option ? displayFormat(option) : itemValue}`}\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n handleRemove(itemValue);\n }}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n e.stopPropagation();\n handleRemove(itemValue);\n }\n }}\n className=\"hover:text-destructive transition-colors cursor-pointer select-none\"\n >\n ×\n </span>\n </span>\n );\n })\n ) : (\n <span className=\"truncate text-sm\">{value.length} selected</span>\n )\n ) : (\n <span className=\"text-muted-foreground\">{placeholder || \"Select...\"}</span>\n )}\n </div>\n <ChevronDown\n className={cn(\"opacity-50 transition-all duration-200\", sizeStyles[size].icon, open && \"rotate-180 scale-110 text-primary opacity-100\")}\n />\n </button>\n\n {open && dropdownPosition && typeof window !== \"undefined\"\n ? createPortal(\n <div\n ref={dropdownRef}\n data-combobox-dropdown\n style={{\n position: \"absolute\",\n top: dropdownPosition?.top || 0,\n left: dropdownPosition?.left || 0,\n width: dropdownPosition?.width || 200,\n zIndex: 9999,\n transformOrigin: \"top center\",\n }}\n data-state={open ? \"open\" : \"closed\"}\n className=\"z-9999\"\n >\n <div\n className={cn(\"rounded-md border bg-popover text-popover-foreground shadow-md\", \"backdrop-blur-sm bg-popover/95 border-border/60\")}\n >\n {/* Clear all button in dropdown */}\n {showClear && value.length > 0 && (\n <div className=\"px-3 py-2 border-b border-border/60 flex justify-end\">\n <button\n type=\"button\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n handleClearAll();\n }}\n className=\"text-xs text-muted-foreground hover:underline cursor-pointer\"\n >\n Clear all\n </button>\n </div>\n )}\n\n {enableSearch && (\n <div className=\"relative border-b border-border/60\">\n <Search className={cn(\"absolute left-2 top-2.5 text-muted-foreground\", sizeStyles[size].icon)} />\n <input\n ref={inputRef}\n value={query}\n onChange={(e) => {\n setQuery(e.target.value);\n setActiveIndex(null);\n }}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n className={cn(\"w-full rounded-t-md bg-transparent focus:outline-none cursor-text\", sizeStyles[size].search)}\n />\n </div>\n )}\n\n <ul className={cn(\"max-h-60 overflow-y-auto p-1\", size === \"lg\" ? \"text-base\" : size === \"sm\" ? \"text-xs\" : \"text-sm\")}>\n {loading ? (\n <li className=\"px-3 py-8 text-center\">\n <div className=\"flex flex-col items-center gap-2 animate-in fade-in-0 zoom-in-95 duration-300\">\n <Loader2 className=\"h-6 w-6 animate-spin text-primary\" />\n <span className=\"text-muted-foreground\">{loadingText}</span>\n </div>\n </li>\n ) : filtered.length ? (\n filtered.map((item, index) => {\n const isSelected = value.includes(item.value);\n const isDisabled = disabledOptions.includes(item.value);\n\n return (\n <li\n key={item.value}\n ref={(node) => {\n listRef.current[index] = node;\n }}\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n toggleSelect(item.value);\n inputRef.current?.focus();\n }}\n style={{\n animationDelay: open ? `${Math.min(index * 20, 200)}ms` : \"0ms\",\n }}\n className={cn(\n \"dropdown-item flex cursor-pointer items-center justify-between rounded-sm transition-colors\",\n sizeStyles[size].item,\n \"hover:bg-accent hover:text-accent-foreground\",\n index === activeIndex && \"bg-accent text-accent-foreground\",\n isDisabled && \"opacity-50 cursor-not-allowed pointer-events-none\"\n )}\n >\n {item.label}\n {isSelected && <Check className={sizeStyles[size].icon} />}\n </li>\n );\n })\n ) : (\n <li\n className={cn(\n \"px-3 py-8 text-center text-muted-foreground\",\n size === \"lg\" ? \"text-base\" : size === \"sm\" ? \"text-xs\" : \"text-sm\"\n )}\n >\n <div className=\"flex flex-col items-center gap-2 animate-in fade-in-0 zoom-in-95 duration-300\">\n <SearchX className=\"h-8 w-8 opacity-40 text-muted-foreground\" />\n <span>{emptyText}</span>\n {query && (\n <button type=\"button\" onClick={() => setQuery(\"\")} className=\"text-xs text-primary hover:underline\">\n Clear search\n </button>\n )}\n </div>\n </li>\n )}\n </ul>\n </div>\n </div>,\n document.body\n )\n : null}\n </div>\n );\n};\n","\"use client\";\r\n\r\nimport * as React from \"react\";\r\nimport { cn } from \"@/lib/utils/cn\";\r\n\r\ninterface RadioGroupContextType {\r\n value?: string;\r\n onValueChange?: (value: string) => void;\r\n name?: string;\r\n disabled?: boolean;\r\n size?: \"sm\" | \"md\" | \"lg\";\r\n variant?: \"default\" | \"card\" | \"button\";\r\n}\r\n\r\nconst RadioGroupContext = React.createContext<RadioGroupContextType | undefined>(undefined);\r\n\r\nconst useRadioGroup = () => {\r\n const context = React.useContext(RadioGroupContext);\r\n if (!context) {\r\n throw new Error(\"RadioGroupItem must be used within a RadioGroup\");\r\n }\r\n return context;\r\n};\r\n\r\ninterface RadioGroupProps {\r\n value?: string;\r\n defaultValue?: string;\r\n onValueChange?: (value: string) => void;\r\n name?: string;\r\n disabled?: boolean;\r\n orientation?: \"horizontal\" | \"vertical\";\r\n size?: \"sm\" | \"md\" | \"lg\";\r\n variant?: \"default\" | \"card\" | \"button\";\r\n className?: string;\r\n children: React.ReactNode;\r\n required?: boolean;\r\n error?: boolean;\r\n errorMessage?: string;\r\n}\r\n\r\nexport const RadioGroup = React.forwardRef<HTMLDivElement, RadioGroupProps>(\r\n ({ \r\n value, \r\n defaultValue, \r\n onValueChange, \r\n name, \r\n disabled = false, \r\n orientation = \"vertical\",\r\n size = \"md\",\r\n variant = \"default\",\r\n className, \r\n children,\r\n required = false,\r\n error = false,\r\n errorMessage\r\n }, ref) => {\r\n const [internalValue, setInternalValue] = React.useState(defaultValue || \"\");\r\n const isControlled = value !== undefined;\r\n const currentValue = isControlled ? value : internalValue;\r\n\r\n const handleValueChange = (newValue: string) => {\r\n if (!disabled) {\r\n if (!isControlled) {\r\n setInternalValue(newValue);\r\n }\r\n onValueChange?.(newValue);\r\n }\r\n };\r\n\r\n // Generate unique name if not provided\r\n const uniqueId = React.useId();\r\n const radioName = name || `radio-group-${uniqueId}`;\r\n\r\n return (\r\n <RadioGroupContext.Provider\r\n value={{\r\n value: currentValue,\r\n onValueChange: handleValueChange,\r\n name: radioName,\r\n disabled,\r\n size,\r\n variant\r\n }}\r\n >\r\n <div className=\"space-y-2\">\r\n <div\r\n ref={ref}\r\n className={cn(\r\n \"grid gap-2\",\r\n orientation === \"horizontal\" ? \"grid-flow-col auto-cols-max\" : \"grid-cols-1\",\r\n error && \"ring-2 ring-destructive/20 rounded-md p-2\",\r\n className\r\n )}\r\n role=\"radiogroup\"\r\n aria-disabled={disabled}\r\n aria-required={required}\r\n aria-invalid={error}\r\n >\r\n {children}\r\n </div>\r\n {error && errorMessage && (\r\n <p className=\"text-sm text-destructive mt-1\">{errorMessage}</p>\r\n )}\r\n </div>\r\n </RadioGroupContext.Provider>\r\n );\r\n }\r\n);\r\n\r\nRadioGroup.displayName = \"RadioGroup\";\r\n\r\ninterface RadioGroupItemProps {\r\n value: string;\r\n id?: string;\r\n disabled?: boolean;\r\n className?: string;\r\n children?: React.ReactNode;\r\n label?: string;\r\n description?: string;\r\n icon?: React.ComponentType<{ className?: string }>;\r\n}\r\n\r\nconst sizeStyles = {\r\n sm: {\r\n radio: \"h-3 w-3\",\r\n dot: \"w-1.5 h-1.5\",\r\n text: \"text-xs\",\r\n padding: \"p-2\"\r\n },\r\n md: {\r\n radio: \"h-4 w-4\", \r\n dot: \"w-2 h-2\",\r\n text: \"text-sm\",\r\n padding: \"p-3\"\r\n },\r\n lg: {\r\n radio: \"h-5 w-5\",\r\n dot: \"w-2.5 h-2.5\", \r\n text: \"text-base\",\r\n padding: \"p-4\"\r\n }\r\n};\r\n\r\nexport const RadioGroupItem = React.forwardRef<HTMLButtonElement, RadioGroupItemProps>(\r\n ({ value, id, disabled, className, children, label, description, icon }, ref) => {\r\n const { \r\n value: selectedValue, \r\n onValueChange, \r\n name, \r\n disabled: groupDisabled,\r\n size = \"md\",\r\n variant = \"default\"\r\n } = useRadioGroup();\r\n \r\n const isDisabled = disabled || groupDisabled;\r\n const isSelected = selectedValue === value;\r\n const Icon = icon;\r\n\r\n const radioId = id || `radio-${value}`;\r\n\r\n if (variant === \"card\") {\r\n return (\r\n <div\r\n className={cn(\r\n \"relative rounded-lg border transition-all duration-200 cursor-pointer\",\r\n \"hover:bg-accent/50 focus-within:ring-2 focus-within:ring-ring focus-within:ring-offset-2\",\r\n isSelected && \"border-primary bg-primary/5 ring-1 ring-primary/20\",\r\n isDisabled && \"cursor-not-allowed opacity-50\",\r\n sizeStyles[size].padding,\r\n className\r\n )}\r\n >\r\n <div className=\"flex items-start gap-3\">\r\n <button\r\n ref={ref}\r\n type=\"button\"\r\n role=\"radio\"\r\n aria-checked={isSelected}\r\n data-state={isSelected ? \"checked\" : \"unchecked\"}\r\n value={value}\r\n id={radioId}\r\n disabled={isDisabled}\r\n className={cn(\r\n \"aspect-square rounded-full border border-primary text-primary ring-offset-background\",\r\n \"focus:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\",\r\n \"disabled:cursor-not-allowed disabled:opacity-50\",\r\n \"transition-all duration-200 mt-0.5\",\r\n sizeStyles[size].radio\r\n )}\r\n onClick={() => onValueChange?.(value)}\r\n >\r\n <span \r\n className={cn(\r\n \"flex items-center justify-center w-full h-full rounded-full transition-all duration-200\",\r\n isSelected && \"bg-primary\"\r\n )}\r\n >\r\n {isSelected && (\r\n <span className={cn(\"bg-primary-foreground rounded-full\", sizeStyles[size].dot)} />\r\n )}\r\n </span>\r\n </button>\r\n \r\n <div className=\"flex-1 min-w-0\">\r\n <div className=\"flex items-center gap-2\">\r\n {Icon && <Icon className=\"h-4 w-4 text-foreground\" />}\r\n <label \r\n htmlFor={radioId}\r\n className={cn(\r\n \"font-medium text-foreground cursor-pointer\",\r\n sizeStyles[size].text\r\n )}\r\n >\r\n {label || children}\r\n </label>\r\n </div>\r\n {description && (\r\n <p className=\"text-muted-foreground mt-1 text-xs\">\r\n {description}\r\n </p>\r\n )}\r\n </div>\r\n </div>\r\n \r\n <input\r\n type=\"radio\"\r\n name={name}\r\n value={value}\r\n checked={isSelected}\r\n onChange={() => {}} // Controlled by button click\r\n className=\"sr-only\"\r\n tabIndex={-1}\r\n />\r\n </div>\r\n );\r\n }\r\n\r\n if (variant === \"button\") {\r\n return (\r\n <button\r\n ref={ref}\r\n type=\"button\"\r\n role=\"radio\"\r\n aria-checked={isSelected}\r\n data-state={isSelected ? \"checked\" : \"unchecked\"}\r\n value={value}\r\n id={radioId}\r\n disabled={isDisabled}\r\n className={cn(\r\n \"inline-flex items-center justify-center gap-2 rounded-md border font-medium transition-all duration-200\",\r\n \"focus:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\",\r\n \"disabled:cursor-not-allowed disabled:opacity-50\",\r\n isSelected \r\n ? \"border-primary bg-primary text-primary-foreground shadow-sm\"\r\n : \"border-border bg-background hover:bg-accent hover:text-accent-foreground\",\r\n sizeStyles[size].padding,\r\n sizeStyles[size].text,\r\n className\r\n )}\r\n onClick={() => onValueChange?.(value)}\r\n >\r\n {Icon && <Icon className=\"h-4 w-4\" />}\r\n {label || children}\r\n <input\r\n type=\"radio\"\r\n name={name}\r\n value={value}\r\n checked={isSelected}\r\n onChange={() => {}} // Controlled by button click\r\n className=\"sr-only\"\r\n tabIndex={-1}\r\n />\r\n </button>\r\n );\r\n }\r\n\r\n // Default variant\r\n return (\r\n <div className={cn(\"flex items-center gap-2\", className)}>\r\n <button\r\n ref={ref}\r\n type=\"button\"\r\n role=\"radio\"\r\n aria-checked={isSelected}\r\n data-state={isSelected ? \"checked\" : \"unchecked\"}\r\n value={value}\r\n id={radioId}\r\n disabled={isDisabled}\r\n className={cn(\r\n \"aspect-square rounded-full border border-primary text-primary ring-offset-background\",\r\n \"focus:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\",\r\n \"disabled:cursor-not-allowed disabled:opacity-50\",\r\n \"transition-all duration-200 hover:border-primary/80\",\r\n sizeStyles[size].radio\r\n )}\r\n onClick={() => onValueChange?.(value)}\r\n >\r\n <span \r\n className={cn(\r\n \"flex items-center justify-center w-full h-full rounded-full transition-all duration-200\",\r\n isSelected && \"bg-primary\"\r\n )}\r\n >\r\n {isSelected && (\r\n <span className={cn(\"bg-primary-foreground rounded-full\", sizeStyles[size].dot)} />\r\n )}\r\n </span>\r\n </button>\r\n \r\n {(label || children) && (\r\n <label \r\n htmlFor={radioId}\r\n className={cn(\r\n \"font-medium text-foreground cursor-pointer flex-1\",\r\n \"disabled:cursor-not-allowed disabled:opacity-50\",\r\n sizeStyles[size].text,\r\n isDisabled && \"cursor-not-allowed opacity-50\"\r\n )}\r\n >\r\n <div className=\"flex items-center gap-2\">\r\n {Icon && <Icon className=\"h-4 w-4\" />}\r\n <span>{label || children}</span>\r\n </div>\r\n {description && (\r\n <p className=\"text-muted-foreground mt-0.5 text-xs\">\r\n {description}\r\n </p>\r\n )}\r\n </label>\r\n )}\r\n \r\n <input\r\n type=\"radio\"\r\n name={name}\r\n value={value}\r\n checked={isSelected}\r\n onChange={() => {}} // Controlled by button click\r\n className=\"sr-only\"\r\n tabIndex={-1}\r\n />\r\n </div>\r\n );\r\n }\r\n);\r\n\r\nRadioGroupItem.displayName = \"RadioGroupItem\";\r\n\r\n// Simplified Radio Group with predefined items\r\ninterface SimpleRadioGroupProps {\r\n items: Array<{\r\n value: string;\r\n label: string;\r\n description?: string;\r\n disabled?: boolean;\r\n icon?: React.ComponentType<{ className?: string }>;\r\n }>;\r\n value?: string;\r\n defaultValue?: string;\r\n onValueChange?: (value: string) => void;\r\n name?: string;\r\n disabled?: boolean;\r\n orientation?: \"horizontal\" | \"vertical\";\r\n size?: \"sm\" | \"md\" | \"lg\";\r\n variant?: \"default\" | \"card\" | \"button\";\r\n className?: string;\r\n required?: boolean;\r\n error?: boolean;\r\n errorMessage?: string;\r\n}\r\n\r\nexport const SimpleRadioGroup: React.FC<SimpleRadioGroupProps> = ({\r\n items,\r\n value,\r\n defaultValue,\r\n onValueChange,\r\n name,\r\n disabled = false,\r\n orientation = \"vertical\",\r\n size = \"md\",\r\n variant = \"default\",\r\n className,\r\n required = false,\r\n error = false,\r\n errorMessage\r\n}) => {\r\n return (\r\n <RadioGroup\r\n value={value}\r\n defaultValue={defaultValue}\r\n onValueChange={onValueChange}\r\n name={name}\r\n disabled={disabled}\r\n orientation={orientation}\r\n size={size}\r\n variant={variant}\r\n className={className}\r\n required={required}\r\n error={error}\r\n errorMessage={errorMessage}\r\n >\r\n {items.map((item) => (\r\n <RadioGroupItem\r\n key={item.value}\r\n value={item.value}\r\n label={item.label}\r\n description={item.description}\r\n disabled={item.disabled}\r\n icon={item.icon}\r\n />\r\n ))}\r\n </RadioGroup>\r\n );\r\n};\r\n\r\n// Legacy component for backward compatibility\r\nexport const RadioGroupWithLabel = SimpleRadioGroup;\r\n\r\n// Button-style Radio Group (connected buttons)\r\ninterface RadioButtonGroupProps {\r\n items: Array<{\r\n value: string;\r\n label: string;\r\n icon?: React.ComponentType<{ className?: string }>;\r\n disabled?: boolean;\r\n }>;\r\n value?: string;\r\n defaultValue?: string;\r\n onValueChange?: (value: string) => void;\r\n name?: string;\r\n disabled?: boolean;\r\n size?: \"sm\" | \"md\" | \"lg\";\r\n variant?: \"default\" | \"outline\" | \"solid\";\r\n className?: string;\r\n fullWidth?: boolean;\r\n}\r\n\r\nexport const RadioButtonGroup: React.FC<RadioButtonGroupProps> = ({\r\n items,\r\n value,\r\n defaultValue,\r\n onValueChange,\r\n name,\r\n disabled = false,\r\n size = \"md\",\r\n variant = \"default\",\r\n className,\r\n fullWidth = false\r\n}) => {\r\n const [internalValue, setInternalValue] = React.useState(defaultValue || \"\");\r\n const isControlled = value !== undefined;\r\n const currentValue = isControlled ? value : internalValue;\r\n\r\n const handleValueChange = (newValue: string) => {\r\n if (!disabled) {\r\n if (!isControlled) {\r\n setInternalValue(newValue);\r\n }\r\n onValueChange?.(newValue);\r\n }\r\n };\r\n\r\n const sizeClasses = {\r\n sm: \"px-3 py-1.5 text-xs\",\r\n md: \"px-4 py-2 text-sm\",\r\n lg: \"px-6 py-3 text-base\"\r\n };\r\n\r\n const variantClasses = {\r\n default: {\r\n container: \"bg-muted rounded-md p-1\",\r\n base: \"bg-transparent hover:bg-background/50\",\r\n selected: \"bg-background text-foreground shadow-sm\"\r\n },\r\n outline: {\r\n container: \"border border-border rounded-md overflow-hidden\",\r\n base: \"bg-background border-r border-border hover:bg-accent\",\r\n selected: \"bg-primary text-primary-foreground border-primary\"\r\n },\r\n solid: {\r\n container: \"border border-border rounded-md overflow-hidden\",\r\n base: \"bg-background hover:bg-accent\",\r\n selected: \"bg-primary text-primary-foreground\"\r\n }\r\n };\r\n\r\n const uniqueId = React.useId();\r\n const radioName = name || `radio-button-group-${uniqueId}`;\r\n\r\n return (\r\n <div \r\n className={cn(\r\n \"inline-flex\",\r\n variantClasses[variant].container,\r\n fullWidth && \"w-full\",\r\n className\r\n )}\r\n role=\"radiogroup\"\r\n >\r\n {items.map((item, index) => {\r\n const isSelected = currentValue === item.value;\r\n const isDisabled = item.disabled || disabled;\r\n const Icon = item.icon;\r\n const isLast = index === items.length - 1;\r\n\r\n return (\r\n <button\r\n key={item.value}\r\n type=\"button\"\r\n disabled={isDisabled}\r\n role=\"radio\"\r\n aria-checked={isSelected}\r\n className={cn(\r\n \"relative inline-flex items-center justify-center gap-2 font-medium transition-all duration-200\",\r\n \"focus:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1\",\r\n \"disabled:cursor-not-allowed disabled:opacity-50\",\r\n sizeClasses[size],\r\n isSelected \r\n ? variantClasses[variant].selected \r\n : variantClasses[variant].base,\r\n variant === \"outline\" && !isLast && \"border-r border-border\",\r\n variant === \"default\" && \"rounded-sm\",\r\n fullWidth && \"flex-1\"\r\n )}\r\n onClick={() => handleValueChange(item.value)}\r\n >\r\n {Icon && <Icon className=\"w-4 h-4\" />}\r\n {item.label}\r\n <input\r\n type=\"radio\"\r\n name={radioName}\r\n value={item.value}\r\n checked={isSelected}\r\n onChange={() => {}} // Controlled by button click\r\n className=\"sr-only\"\r\n tabIndex={-1}\r\n />\r\n </button>\r\n );\r\n })}\r\n </div>\r\n );\r\n};\r\n\r\n// Segmented Control (iOS-style)\r\ninterface SegmentedControlProps extends Omit<RadioButtonGroupProps, 'variant'> {}\r\n\r\nexport const SegmentedControl: React.FC<SegmentedControlProps> = (props) => {\r\n return <RadioButtonGroup {...props} variant=\"default\" />;\r\n};\r\n\r\n// Toggle Group (Connected outline buttons)\r\ninterface ToggleGroupProps extends Omit<RadioButtonGroupProps, 'variant'> {}\r\n\r\nexport const ToggleGroup: React.FC<ToggleGroupProps> = (props) => {\r\n return <RadioButtonGroup {...props} variant=\"outline\" />;\r\n};\r\n\r\nexport default RadioGroup;","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"@/lib/utils/cn\";\n\ninterface SliderProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, \"onChange\" | \"size\"> {\n value?: number;\n defaultValue?: number;\n min?: number;\n max?: number;\n step?: number;\n onChange?: (value: number) => void;\n onValueChange?: (value: number) => void; // Alternative prop name for consistency\n onMouseUp?: () => void; // Called when mouse is released\n onTouchEnd?: () => void; // Called when touch ends\n label?: React.ReactNode;\n labelClassName?: string;\n containerClassName?: string;\n trackClassName?: string;\n thumbClassName?: string;\n showValue?: boolean;\n valueClassName?: string;\n formatValue?: (value: number) => string;\n size?: \"sm\" | \"md\" | \"lg\";\n disabled?: boolean;\n orientation?: \"horizontal\" | \"vertical\";\n noFocus?: boolean; // remove focus ring/outline styling\n}\n\nconst SIZE_STYLES = {\n sm: {\n track: \"h-1\",\n thumb: \"w-3 h-3\",\n container: \"py-1\",\n },\n md: {\n track: \"h-2\",\n thumb: \"w-4 h-4\",\n container: \"py-2\",\n },\n lg: {\n track: \"h-3\",\n thumb: \"w-5 h-5\",\n container: \"py-3\",\n },\n};\n\nconst Slider = React.forwardRef<HTMLInputElement, SliderProps>(\n (\n {\n className,\n value,\n defaultValue = 0,\n min = 0,\n max = 100,\n step = 1,\n onChange,\n onValueChange,\n onMouseUp,\n onTouchEnd,\n label,\n labelClassName,\n containerClassName,\n trackClassName,\n thumbClassName,\n showValue = false,\n valueClassName,\n formatValue,\n size = \"md\",\n disabled = false,\n orientation = \"horizontal\",\n noFocus = true,\n ...props\n },\n ref\n ) => {\n const [internalValue, setInternalValue] = React.useState<number>(defaultValue);\n\n const isControlled = value !== undefined;\n const currentValue = isControlled ? value : internalValue;\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const newValue = Number(e.target.value);\n\n if (!isControlled) {\n setInternalValue(newValue);\n }\n\n onChange?.(newValue);\n onValueChange?.(newValue);\n };\n\n // Calculate the percentage for visual feedback\n const percentage = ((currentValue - min) / (max - min)) * 100;\n\n const sizeStyles = SIZE_STYLES[size];\n\n const displayValue = formatValue ? formatValue(currentValue) : currentValue.toString();\n\n if (orientation === \"vertical\") {\n // Vertical slider implementation would go here\n // For now, defaulting to horizontal\n }\n\n return (\n <div className={cn(\"w-full space-y-2\", containerClassName)}>\n {/* Label and value display */}\n {(label || showValue) && (\n <div className=\"flex items-center justify-between\">\n {label && <label className={cn(\"text-sm font-medium text-foreground\", labelClassName)}>{label}</label>}\n {showValue && <span className={cn(\"text-xs font-mono text-muted-foreground min-w-8 text-right\", valueClassName)}>{displayValue}</span>}\n </div>\n )}\n\n {/* Slider container */}\n <div className={cn(\"relative flex items-center\", sizeStyles.container)}>\n {/* Track background */}\n <div className={cn(\"w-full rounded-full bg-secondary relative overflow-hidden\", sizeStyles.track, trackClassName)}>\n {/* Progress fill */}\n <div className=\"absolute left-0 top-0 h-full bg-primary rounded-full\" style={{ width: `${percentage}%` }} />\n </div>\n\n {/* Actual input element */}\n <input\n ref={ref}\n type=\"range\"\n min={min}\n max={max}\n step={step}\n value={currentValue}\n onChange={handleChange}\n onMouseUp={onMouseUp}\n onTouchEnd={onTouchEnd}\n disabled={disabled}\n className={cn(\n // Base styles\n \"absolute w-full h-full appearance-none bg-transparent cursor-pointer\",\n !noFocus && \"focus:outline-none focus:ring-2 focus:ring-primary focus:ring-offset-2 focus:ring-offset-background rounded-full\",\n noFocus && \"outline-none ring-0 focus:outline-none focus:ring-0 focus-visible:outline-none\",\n\n // Webkit styles for thumb\n \"[&::-webkit-slider-thumb]:appearance-none\",\n \"[&::-webkit-slider-thumb]:bg-primary\",\n \"[&::-webkit-slider-thumb]:border-2 [&::-webkit-slider-thumb]:border-background\",\n \"[&::-webkit-slider-thumb]:rounded-full\",\n \"[&::-webkit-slider-thumb]:shadow-md\",\n \"[&::-webkit-slider-thumb]:cursor-pointer\",\n \"[&::-webkit-slider-thumb]:transition-all [&::-webkit-slider-thumb]:duration-150\",\n size === \"sm\" && \"[&::-webkit-slider-thumb]:w-3 [&::-webkit-slider-thumb]:h-3\",\n size === \"md\" && \"[&::-webkit-slider-thumb]:w-4 [&::-webkit-slider-thumb]:h-4\",\n size === \"lg\" && \"[&::-webkit-slider-thumb]:w-5 [&::-webkit-slider-thumb]:h-5\",\n\n // Firefox styles for thumb\n \"[&::-moz-range-thumb]:bg-primary\",\n \"[&::-moz-range-thumb]:border-2 [&::-moz-range-thumb]:border-background\",\n \"[&::-moz-range-thumb]:rounded-full\",\n \"[&::-moz-range-thumb]:shadow-md\",\n \"[&::-moz-range-thumb]:cursor-pointer\",\n \"[&::-moz-range-thumb]:transition-all [&::-moz-range-thumb]:duration-150\",\n size === \"sm\" && \"[&::-moz-range-thumb]:w-3 [&::-moz-range-thumb]:h-3\",\n size === \"md\" && \"[&::-moz-range-thumb]:w-4 [&::-moz-range-thumb]:h-4\",\n size === \"lg\" && \"[&::-moz-range-thumb]:w-5 [&::-moz-range-thumb]:h-5\",\n\n // Remove default track in Firefox\n \"[&::-moz-range-track]:bg-transparent\",\n \"[&::-moz-range-track]:border-transparent\",\n\n // Hover effects\n \"hover:[&::-webkit-slider-thumb]:scale-110 hover:[&::-webkit-slider-thumb]:shadow-lg\",\n \"hover:[&::-moz-range-thumb]:scale-110 hover:[&::-moz-range-thumb]:shadow-lg\",\n\n // Disabled styles\n disabled && [\n \"cursor-not-allowed opacity-50\",\n \"[&::-webkit-slider-thumb]:cursor-not-allowed [&::-webkit-slider-thumb]:opacity-50\",\n \"[&::-moz-range-thumb]:cursor-not-allowed [&::-moz-range-thumb]:opacity-50\",\n ],\n\n className,\n thumbClassName\n )}\n {...props}\n />\n </div>\n </div>\n );\n }\n);\n\nSlider.displayName = \"Slider\";\n\nexport { Slider };\nexport type { SliderProps };\n","\"use client\";\n\nimport Button from \"@/components/ui/Button\";\nimport { Slider } from \"@/components/ui/Slider\";\nimport { cn } from \"@/lib/utils/cn\";\nimport { Dot, Maximize2, Pause, Play, RotateCcw, RotateCw, Volume2, VolumeX } from \"lucide-react\";\nimport React from \"react\";\n\ninterface OverlayControlsProps {\n mode: \"live\" | \"review\";\n value: number;\n max: number;\n step?: number;\n onChange: (v: number) => void;\n onCommit?: (v: number) => void; // Called when user releases drag\n playing?: boolean; // review only\n onTogglePlay?: () => void; // review only\n onGoLive?: () => void; // review only: exit to live\n // Volume controls (review)\n volume?: number; // 0..1\n muted?: boolean;\n onVolumeChange?: (v: number) => void;\n onToggleMute?: () => void;\n // Playback rate (review)\n rate?: number;\n onChangeRate?: (r: number) => void;\n // Fullscreen toggle (review)\n onToggleFullscreen?: () => void;\n showOnHover?: boolean; // live: true -> only show when parent has group-hover\n className?: string;\n showTime?: boolean; // review: show current/total label\n // Skip controls (review)\n skipSeconds?: number; // default 10s\n onSkip?: (seconds: number) => void; // positive = forward, negative = backward\n // Preview thumbnail\n onSeekPreview?: (time: number) => string | undefined; // return thumbnail URL for given time\n // Auto-hide behavior\n autoHide?: boolean; // default false for review, true for live\n autoHideDelay?: number; // ms, default 3000\n // Keyboard shortcuts\n enableKeyboardShortcuts?: boolean; // default true\n}\n\nexport default function OverlayControls({\n mode,\n value,\n max,\n step = 0.1,\n onChange,\n onCommit,\n playing = false,\n onTogglePlay,\n onGoLive,\n volume,\n muted,\n onVolumeChange,\n onToggleMute,\n rate = 1,\n onChangeRate,\n onToggleFullscreen,\n showOnHover = false,\n className,\n showTime,\n skipSeconds = 10,\n onSkip,\n onSeekPreview,\n autoHide = false,\n autoHideDelay = 3000,\n enableKeyboardShortcuts = true,\n}: OverlayControlsProps) {\n const hoverClasses = showOnHover\n ? \"opacity-0 pointer-events-none group-hover:opacity-100 group-hover:pointer-events-auto\"\n : \"opacity-100 pointer-events-auto\";\n\n const showControlsBar = mode === \"review\";\n const [rateOpen, setRateOpen] = React.useState(false);\n const rateWrapRef = React.useRef<HTMLDivElement | null>(null);\n\n // Auto-hide state\n const [controlsVisible, setControlsVisible] = React.useState(true);\n const hideTimerRef = React.useRef<NodeJS.Timeout | null>(null);\n\n // Preview thumbnail state\n const [previewData, setPreviewData] = React.useState<{ time: number; x: number; url?: string } | null>(null);\n const sliderRef = React.useRef<HTMLDivElement | null>(null);\n\n // Track the current dragging value\n const [isDragging, setIsDragging] = React.useState(false);\n const [dragValue, setDragValue] = React.useState(value);\n\n // Update dragValue when value prop changes (from external source)\n React.useEffect(() => {\n if (!isDragging) {\n setDragValue(value);\n }\n }, [value, isDragging]);\n\n // Keyboard feedback state\n const [keyboardFeedback, setKeyboardFeedback] = React.useState<{\n type: \"play\" | \"pause\" | \"seek\" | \"volume\" | \"mute\" | \"unmute\";\n value?: number; // For seek: accumulated seconds, for volume: percentage\n } | null>(null);\n const feedbackTimerRef = React.useRef<NodeJS.Timeout | null>(null);\n const seekAccumulatorRef = React.useRef<number>(0);\n const seekAccumulatorTimerRef = React.useRef<NodeJS.Timeout | null>(null);\n\n // Close rate dropdown on outside click\n React.useEffect(() => {\n const onDocDown = (e: MouseEvent) => {\n if (!rateOpen) return;\n const wrap = rateWrapRef.current;\n if (wrap && !wrap.contains(e.target as Node)) {\n setRateOpen(false);\n }\n };\n document.addEventListener(\"mousedown\", onDocDown);\n return () => document.removeEventListener(\"mousedown\", onDocDown);\n }, [rateOpen]);\n\n // Auto-hide controls\n React.useEffect(() => {\n if (!autoHide || showOnHover) return;\n\n const resetTimer = () => {\n if (hideTimerRef.current) clearTimeout(hideTimerRef.current);\n setControlsVisible(true);\n hideTimerRef.current = setTimeout(() => {\n setControlsVisible(false);\n }, autoHideDelay);\n };\n\n const handleMouseMove = () => resetTimer();\n const handleMouseLeave = () => {\n if (hideTimerRef.current) clearTimeout(hideTimerRef.current);\n hideTimerRef.current = setTimeout(() => {\n setControlsVisible(false);\n }, autoHideDelay);\n };\n\n resetTimer();\n document.addEventListener(\"mousemove\", handleMouseMove);\n\n return () => {\n if (hideTimerRef.current) clearTimeout(hideTimerRef.current);\n document.removeEventListener(\"mousemove\", handleMouseMove);\n };\n }, [autoHide, autoHideDelay, showOnHover]);\n\n // Helper to show keyboard feedback\n const showFeedback = (type: \"play\" | \"pause\" | \"seek\" | \"volume\" | \"mute\" | \"unmute\", value?: number) => {\n if (feedbackTimerRef.current) clearTimeout(feedbackTimerRef.current);\n setKeyboardFeedback({ type, value });\n feedbackTimerRef.current = setTimeout(() => {\n setKeyboardFeedback(null);\n }, 800);\n };\n\n // Helper for seek accumulation\n const accumulateSeek = (seconds: number) => {\n if (seekAccumulatorTimerRef.current) clearTimeout(seekAccumulatorTimerRef.current);\n seekAccumulatorRef.current += seconds;\n showFeedback(\"seek\", seekAccumulatorRef.current);\n seekAccumulatorTimerRef.current = setTimeout(() => {\n seekAccumulatorRef.current = 0;\n }, 1000);\n };\n\n // Keyboard shortcuts\n React.useEffect(() => {\n if (!enableKeyboardShortcuts) return;\n\n const handleKeyDown = (e: KeyboardEvent) => {\n // Ignore if user is typing in an input\n if (e.target instanceof HTMLInputElement || e.target instanceof HTMLTextAreaElement) return;\n\n switch (e.key) {\n case \" \":\n case \"k\":\n e.preventDefault();\n onTogglePlay?.();\n showFeedback(playing ? \"pause\" : \"play\");\n break;\n case \"ArrowLeft\":\n e.preventDefault();\n if (e.shiftKey) {\n // Shift + Left: skip backward\n onSkip?.(-skipSeconds);\n accumulateSeek(-skipSeconds);\n } else {\n // Left: seek backward 5s\n {\n const newTime = Math.max(0, value - 5);\n onChange(newTime);\n onCommit?.(newTime);\n }\n accumulateSeek(-5);\n }\n break;\n case \"ArrowRight\":\n e.preventDefault();\n if (e.shiftKey) {\n // Shift + Right: skip forward\n onSkip?.(skipSeconds);\n accumulateSeek(skipSeconds);\n } else {\n // Right: seek forward 5s\n {\n const newTime = Math.min(max, value + 5);\n onChange(newTime);\n onCommit?.(newTime);\n }\n accumulateSeek(5);\n }\n break;\n case \"ArrowUp\":\n e.preventDefault();\n if (onVolumeChange && volume !== undefined) {\n const newVolume = Math.min(1, volume + 0.05);\n onVolumeChange(newVolume);\n showFeedback(\"volume\", Math.round(newVolume * 100));\n }\n break;\n case \"ArrowDown\":\n e.preventDefault();\n if (onVolumeChange && volume !== undefined) {\n const newVolume = Math.max(0, volume - 0.05);\n onVolumeChange(newVolume);\n showFeedback(\"volume\", Math.round(newVolume * 100));\n }\n break;\n case \"f\":\n case \"F\":\n if (!e.ctrlKey && !e.metaKey) {\n e.preventDefault();\n onToggleFullscreen?.();\n }\n break;\n case \"m\":\n case \"M\":\n e.preventDefault();\n onToggleMute?.();\n showFeedback(muted ? \"unmute\" : \"mute\");\n break;\n case \"j\":\n e.preventDefault();\n onSkip?.(-skipSeconds);\n accumulateSeek(-skipSeconds);\n break;\n case \"l\":\n e.preventDefault();\n onSkip?.(skipSeconds);\n accumulateSeek(skipSeconds);\n break;\n default:\n // 0-9 keys: jump to percentage\n if (e.key >= \"0\" && e.key <= \"9\") {\n e.preventDefault();\n const percent = parseInt(e.key) * 10;\n const newTime = (percent / 100) * max;\n onChange(newTime);\n onCommit?.(newTime);\n }\n break;\n }\n };\n\n document.addEventListener(\"keydown\", handleKeyDown);\n return () => document.removeEventListener(\"keydown\", handleKeyDown);\n }, [\n enableKeyboardShortcuts,\n mode,\n onTogglePlay,\n onSkip,\n skipSeconds,\n onChange,\n value,\n max,\n onVolumeChange,\n volume,\n onToggleFullscreen,\n onToggleMute,\n playing,\n muted,\n ]);\n\n const formatTime = (sec: number) => {\n if (!isFinite(sec) || sec < 0) return \"0:00\";\n const h = Math.floor(sec / 3600);\n const m = Math.floor((sec % 3600) / 60);\n const s = Math.floor(sec % 60);\n if (h > 0) return `${h}:${String(m).padStart(2, \"0\")}:${String(s).padStart(2, \"0\")}`;\n return `${m}:${String(s).padStart(2, \"0\")}`;\n };\n\n // Handle slider hover for preview\n const handleSliderMouseMove = (e: React.MouseEvent<HTMLDivElement>) => {\n if (!sliderRef.current) return;\n\n const rect = sliderRef.current.getBoundingClientRect();\n const x = e.clientX - rect.left;\n const percent = Math.max(0, Math.min(1, x / rect.width));\n const time = percent * max;\n\n // Always show preview, optionally with thumbnail if onSeekPreview is provided\n const thumbnailUrl = onSeekPreview ? onSeekPreview(time) : undefined;\n setPreviewData({ time, x: e.clientX - rect.left, url: thumbnailUrl });\n };\n\n const handleSliderMouseLeave = () => {\n setPreviewData(null);\n };\n\n return (\n <>\n {/* Keyboard feedback overlay */}\n {keyboardFeedback && (\n <div\n className={cn(\n \"absolute inset-0 flex items-center pointer-events-none z-50\",\n keyboardFeedback.type === \"seek\" && (keyboardFeedback.value ?? 0) > 0\n ? \"justify-end pr-32\"\n : keyboardFeedback.type === \"seek\" && (keyboardFeedback.value ?? 0) < 0\n ? \"justify-start pl-32\"\n : \"justify-center\"\n )}\n >\n <div className=\"bg-black/50 backdrop-blur-sm rounded-xl px-6 py-4 shadow-xl border border-white/10 animate-in fade-in zoom-in duration-200\">\n {keyboardFeedback.type === \"play\" && <Play className=\"w-16 h-16 text-white\" fill=\"white\" />}\n {keyboardFeedback.type === \"pause\" && <Pause className=\"w-16 h-16 text-white\" fill=\"white\" />}\n {keyboardFeedback.type === \"seek\" && (\n <div className=\"flex items-center gap-3\">\n {(keyboardFeedback.value ?? 0) > 0 ? <RotateCw className=\"w-12 h-12 text-white\" /> : <RotateCcw className=\"w-12 h-12 text-white\" />}\n <span className=\"text-3xl font-bold text-white\">\n {keyboardFeedback.value && keyboardFeedback.value > 0 ? \"+\" : \"\"}\n {keyboardFeedback.value}s\n </span>\n </div>\n )}\n {keyboardFeedback.type === \"volume\" && (\n <div className=\"flex items-center gap-3\">\n <Volume2 className=\"w-12 h-12 text-white\" />\n <div className=\"flex flex-col gap-1.5\">\n <span className=\"text-2xl font-bold text-white\">{keyboardFeedback.value}%</span>\n <div className=\"w-32 h-1.5 bg-white/30 rounded-full overflow-hidden\">\n <div className=\"h-full bg-white rounded-full transition-all\" style={{ width: `${keyboardFeedback.value}%` }} />\n </div>\n </div>\n </div>\n )}\n {keyboardFeedback.type === \"mute\" && <VolumeX className=\"w-16 h-16 text-white\" />}\n {keyboardFeedback.type === \"unmute\" && <Volume2 className=\"w-16 h-16 text-white\" />}\n </div>\n </div>\n )}\n\n <div\n className={cn(\n \"absolute bottom-0 left-0 right-0 pb-2 pt-8 bg-linear-to-t from-black/40 to-transparent z-20 transition-opacity duration-200\",\n hoverClasses,\n autoHide && !controlsVisible && \"opacity-0 pointer-events-none\",\n className\n )}\n >\n <div className=\"px-4\">\n <div ref={sliderRef} onMouseMove={handleSliderMouseMove} onMouseLeave={handleSliderMouseLeave} className=\"relative\">\n <Slider\n min={0}\n max={max || 0}\n step={step}\n value={dragValue}\n onValueChange={(v) => {\n setIsDragging(true);\n setDragValue(v);\n onChange(v);\n }}\n onMouseUp={() => {\n onCommit?.(dragValue);\n setIsDragging(false);\n }}\n onTouchEnd={() => {\n onCommit?.(dragValue);\n setIsDragging(false);\n }}\n trackClassName=\"bg-muted\"\n size=\"sm\"\n noFocus\n />\n\n {/* Preview thumbnail */}\n {previewData && (\n <div className=\"absolute bottom-full mb-2 transform -translate-x-1/2 pointer-events-none z-30\" style={{ left: `${previewData.x}px` }}>\n {previewData.url ? (\n <div className=\"bg-background/95 backdrop-blur rounded-md border border-border shadow-lg overflow-hidden\">\n <img src={previewData.url} alt=\"Preview\" className=\"w-40 h-24 object-cover\" />\n <div className=\"px-2 py-1 text-xs font-mono text-center bg-background/80\">{formatTime(previewData.time)}</div>\n </div>\n ) : (\n <div className=\"px-3 py-1.5 rounded-md bg-background/90 backdrop-blur border border-border shadow-lg\">\n <div className=\"text-xs font-mono text-center\">{formatTime(previewData.time)}</div>\n </div>\n )}\n </div>\n )}\n </div>\n\n {showControlsBar && (\n <div className=\"mt-2 flex items-center justify-between gap-2\">\n <div className=\"flex items-center gap-2\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={onTogglePlay}\n title={playing ? \"Tạm dừng\" : \"Phát\"}\n className=\"bg-background/60 hover:bg-background/80 border-transparent shadow-sm outline-none focus:outline-none focus:ring-0\"\n >\n {playing ? <Pause className=\"w-4 h-4\" /> : <Play className=\"w-4 h-4\" />}\n </Button>\n\n {/* Skip backward button */}\n {onSkip && (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={() => onSkip(-skipSeconds)}\n title={`Lùi ${skipSeconds}s`}\n className=\"bg-background/60 hover:bg-background/80 border-transparent shadow-sm outline-none focus:outline-none focus:ring-0\"\n >\n <RotateCcw className=\"w-4 h-4\" />\n </Button>\n )}\n\n {/* Skip forward button */}\n {onSkip && (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={() => onSkip(skipSeconds)}\n title={`Tua ${skipSeconds}s`}\n className=\"bg-background/60 hover:bg-background/80 border-transparent shadow-sm outline-none focus:outline-none focus:ring-0\"\n >\n <RotateCw className=\"w-4 h-4\" />\n </Button>\n )}\n\n {(showTime ?? true) && (\n <span className=\"px-3 py-1 rounded-full text-xs font-mono bg-background/60 text-foreground shadow-sm border border-border whitespace-nowrap\">\n {formatTime(dragValue)} / {formatTime(max)}\n </span>\n )}\n\n {/* Volume control */}\n <div className=\"flex items-center gap-2\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={onToggleMute}\n title={muted ? \"Bật tiếng\" : \"Tắt tiếng\"}\n className=\"bg-background/60 hover:bg-background/80 border-transparent shadow-sm outline-none focus:outline-none focus:ring-0\"\n >\n {muted || (volume ?? 1) === 0 ? <VolumeX className=\"w-4 h-4\" /> : <Volume2 className=\"w-4 h-4\" />}\n </Button>\n <div className=\"w-24\">\n <Slider\n min={0}\n max={1}\n step={0.05}\n value={Math.max(0, Math.min(volume ?? 1, 1))}\n onValueChange={(v) => onVolumeChange?.(v)}\n trackClassName=\"bg-muted\"\n size=\"sm\"\n noFocus\n />\n </div>\n </div>\n </div>\n\n <div className=\"flex items-center gap-2 relative\">\n {onGoLive && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={onGoLive}\n title=\"Trực tiếp (về Live)\"\n className=\"bg-background/60 hover:bg-background/80 border-transparent shadow-sm outline-none focus:outline-none focus:ring-0\"\n >\n <Dot className=\"w-10 h-10 text-destructive\" />\n Trực tiếp\n </Button>\n )}\n {onChangeRate && (\n <div className=\"relative\" ref={rateWrapRef}>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setRateOpen((o) => !o)}\n title=\"Tốc độ phát\"\n className=\"bg-background/60 hover:bg-background/80 border-transparent shadow-sm outline-none focus:outline-none focus:ring-0\"\n >\n {rate}x\n </Button>\n {rateOpen && (\n <div className=\"absolute bottom-9 right-0 bg-background/90 backdrop-blur rounded-md border border-border shadow-lg p-1 z-30\">\n {[0.5, 0.75, 1, 1.25, 1.5].map((r) => (\n <button\n key={r}\n onClick={() => {\n onChangeRate(r);\n setRateOpen(false);\n }}\n className={cn(\"block w-full text-left px-3 py-1 text-sm rounded hover:bg-accent\", rate === r && \"bg-accent\")}\n >\n {r}x\n </button>\n ))}\n </div>\n )}\n </div>\n )}\n {onToggleFullscreen && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={onToggleFullscreen}\n title=\"Toàn màn hình\"\n className=\"px-3 bg-background/60 hover:bg-background/80 border-transparent shadow-sm outline-none focus:outline-none focus:ring-0\"\n >\n <Maximize2 className=\"w-4 h-4\" />\n </Button>\n )}\n </div>\n </div>\n )}\n </div>\n </div>\n </>\n );\n}\n\n","\"use client\";\r\n\r\nimport React, { useState } from \"react\";\r\nimport { ChevronRight, ChevronDown, Check } from \"lucide-react\";\r\nimport { cn } from \"@/lib/utils/cn\";\r\n\r\ninterface Category {\r\n id: number;\r\n name: string;\r\n parent_id?: number | null;\r\n}\r\n\r\ninterface CategoryTreeSelectProps {\r\n categories: Category[];\r\n value: number[];\r\n onChange: (selectedIds: number[]) => void;\r\n placeholder?: string;\r\n disabled?: boolean;\r\n}\r\n\r\nexport function CategoryTreeSelect({ categories, value, onChange, placeholder = \"Chọn danh mục\", disabled }: CategoryTreeSelectProps) {\r\n const [isOpen, setIsOpen] = useState(false);\r\n const [expandedNodes, setExpandedNodes] = useState<Set<number>>(new Set());\r\n\r\n // Build tree structure\r\n const parentCategories = categories.filter((c) => !c.parent_id);\r\n const childrenMap = new Map<number, Category[]>();\r\n\r\n categories.forEach((cat) => {\r\n if (cat.parent_id) {\r\n if (!childrenMap.has(cat.parent_id)) {\r\n childrenMap.set(cat.parent_id, []);\r\n }\r\n childrenMap.get(cat.parent_id)!.push(cat);\r\n }\r\n });\r\n\r\n const toggleExpand = (id: number) => {\r\n const newExpanded = new Set(expandedNodes);\r\n if (newExpanded.has(id)) {\r\n newExpanded.delete(id);\r\n } else {\r\n newExpanded.add(id);\r\n }\r\n setExpandedNodes(newExpanded);\r\n };\r\n\r\n const handleSelect = (categoryId: number, category: Category) => {\r\n const newSelected = new Set(value);\r\n\r\n if (newSelected.has(categoryId)) {\r\n // Unselect\r\n newSelected.delete(categoryId);\r\n\r\n // Also unselect children if it's a parent\r\n const children = childrenMap.get(categoryId) || [];\r\n children.forEach((child) => newSelected.delete(child.id));\r\n } else {\r\n // Select\r\n newSelected.add(categoryId);\r\n\r\n // Also select parent if this is a child\r\n if (category.parent_id) {\r\n newSelected.add(category.parent_id);\r\n }\r\n }\r\n\r\n onChange(Array.from(newSelected));\r\n };\r\n\r\n const renderCategory = (category: Category, level: number = 0) => {\r\n const children = childrenMap.get(category.id) || [];\r\n const hasChildren = children.length > 0;\r\n const isExpanded = expandedNodes.has(category.id);\r\n const isSelected = value.includes(category.id);\r\n\r\n return (\r\n <div key={category.id}>\r\n <div\n className={cn(\n \"relative flex items-center gap-2 px-3 py-2 cursor-pointer rounded-md transition-colors\",\n \"hover:bg-accent\",\n // Selected state: subtle bg + square left indicator, avoid left rounding\n isSelected && \"bg-primary/10 rounded-r-md\"\n )}\n style={{ paddingLeft: `${level * 1.5 + 0.75}rem` }}\n >\n {isSelected && (\n <span\n aria-hidden\n className=\"absolute left-0 top-0 bottom-0 w-1 bg-primary\"\n />\n )}\n {hasChildren ? (\r\n <button\r\n type=\"button\"\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n toggleExpand(category.id);\r\n }}\r\n className=\"p-0.5 hover:bg-accent rounded\"\r\n >\r\n {isExpanded ? <ChevronDown className=\"w-4 h-4\" /> : <ChevronRight className=\"w-4 h-4\" />}\r\n </button>\r\n ) : (\r\n <span className=\"w-5\" />\r\n )}\r\n\r\n <div\r\n onClick={() => handleSelect(category.id, category)}\r\n className=\"flex items-center gap-2 flex-1\"\r\n >\r\n <div\r\n className={cn(\r\n \"w-4 h-4 border-2 rounded flex items-center justify-center transition-colors\",\r\n isSelected ? \"bg-primary border-primary\" : \"border-muted-foreground/30\"\r\n )}\r\n >\r\n {isSelected && <Check className=\"w-3 h-3 text-primary-foreground\" />}\r\n </div>\r\n\r\n <span className={cn(\"text-sm\", isSelected && \"font-medium text-primary\")}>{category.name}</span>\r\n </div>\r\n </div>\r\n\r\n {hasChildren && isExpanded && (\r\n <div>\r\n {children.map((child) => renderCategory(child, level + 1))}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n };\r\n\r\n const selectedCount = value.length;\r\n const displayText = selectedCount > 0 ? `Đã chọn ${selectedCount} danh mục` : placeholder;\r\n\r\n return (\n <div className=\"relative\">\n <button\n type=\"button\"\n onClick={() => !disabled && setIsOpen(!isOpen)}\n disabled={disabled}\n className={cn(\n // Match Combobox trigger outline + focus styles\n \"flex w-full items-center justify-between px-3 bg-background border border-input\",\n \"rounded-md h-10 py-2 text-sm\",\n \"hover:bg-accent/5 transition-colors hover:border-primary/40 focus:border-primary\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background\",\n disabled && \"opacity-50 cursor-not-allowed\",\n isOpen && \"border-primary\"\n )}\n >\n <span className={cn(\"text-sm\", selectedCount === 0 && \"text-muted-foreground\")}>{displayText}</span>\n <ChevronDown className={cn(\"w-4 h-4 transition-transform\", isOpen && \"transform rotate-180\")} />\n </button>\n\n {isOpen && !disabled && (\n <>\n <div className=\"fixed inset-0 z-10\" onClick={() => setIsOpen(false)} />\n <div\n className={cn(\n \"absolute z-20 mt-1 w-full max-h-80 overflow-auto\",\n \"rounded-md border bg-popover text-popover-foreground shadow-md\",\n \"backdrop-blur-sm bg-popover/95 border-border/60\"\n )}\n >\n <div className=\"p-1\">\n {parentCategories.length === 0 ? (\r\n <div className=\"px-3 py-2 text-sm text-muted-foreground\">Không có danh mục nào</div>\r\n ) : (\r\n parentCategories.map((cat) => renderCategory(cat))\r\n )}\r\n </div>\r\n </div>\r\n </>\r\n )}\r\n </div>\r\n );\r\n}\r\n","// components/ui/ImageUpload.tsx\r\n\"use client\";\r\n\r\nimport { useState, useRef, useCallback } from \"react\";\r\nimport { Upload, X, Image as ImageIcon, Loader2, Check } from \"lucide-react\";\r\nimport { cn } from \"@/lib/utils/cn\";\r\nimport Button from \"./Button\";\r\nimport { useToast } from \"./Toast\";\r\nimport { useTranslations } from \"@/lib/i18n/translation-adapter\";\r\n\r\n// Upload interface for basic setup\r\ninterface UploadedImage {\r\n id: number;\r\n path: string;\r\n url: string;\r\n originalName: string;\r\n size: number;\r\n mimeType: string;\r\n width?: number;\r\n height?: number;\r\n formattedSize?: string;\r\n}\r\n\r\ninterface ImageUploadProps {\r\n onUpload?: (image: UploadedImage) => void;\r\n onRemove?: (imageId: string) => void;\r\n maxSize?: number; // in MB\r\n accept?: string;\r\n multiple?: boolean;\r\n disabled?: boolean;\r\n className?: string;\r\n showPreview?: boolean;\r\n previewSize?: \"sm\" | \"md\" | \"lg\";\r\n dragDropText?: string;\r\n browseText?: string;\r\n supportedFormatsText?: string;\r\n}\r\n\r\nexport default function ImageUpload({\r\n onUpload,\r\n onRemove,\r\n maxSize = parseInt(process.env.NEXT_PUBLIC_MAX_FILE_SIZE || \"10485760\") / (1024 * 1024), // Convert bytes to MB\r\n accept = \"image/*\",\r\n multiple = false,\r\n disabled = false,\r\n className,\r\n showPreview = true,\r\n previewSize = \"md\",\r\n dragDropText,\r\n browseText,\r\n supportedFormatsText,\r\n}: ImageUploadProps) {\r\n const [isDragging, setIsDragging] = useState(false);\r\n const [uploading, setUploading] = useState(false);\r\n const [uploadedImages, setUploadedImages] = useState<UploadedImage[]>([]);\r\n const fileInputRef = useRef<HTMLInputElement>(null);\r\n const { addToast } = useToast();\r\n const t = useTranslations(\"OCR.imageUpload\");\r\n\r\n const previewSizes = {\r\n sm: \"w-16 h-16\",\r\n md: \"w-24 h-24\",\r\n lg: \"w-32 h-32\",\r\n };\r\n\r\n const handleDragOver = useCallback(\r\n (e: React.DragEvent) => {\r\n e.preventDefault();\r\n if (!disabled) {\r\n setIsDragging(true);\r\n }\r\n },\r\n [disabled]\r\n );\r\n\r\n const handleDragLeave = useCallback((e: React.DragEvent) => {\r\n e.preventDefault();\r\n setIsDragging(false);\r\n }, []);\r\n\r\n const handleFiles = useCallback(\r\n async (files: File[]) => {\r\n if (files.length === 0) return;\r\n\r\n // Validate files\r\n const validFiles = files.filter((file) => {\r\n // Check file size\r\n if (file.size > maxSize * 1024 * 1024) {\r\n addToast({\r\n type: \"error\",\r\n message: `File \"${file.name}\" is too large. Max size: ${maxSize}MB`,\r\n });\r\n return false;\r\n }\r\n\r\n // Check file type\r\n if (!file.type.startsWith(\"image/\")) {\r\n addToast({\r\n type: \"error\",\r\n message: `File \"${file.name}\" is not a valid image`,\r\n });\r\n return false;\r\n }\r\n\r\n return true;\r\n });\r\n\r\n if (validFiles.length === 0) return;\r\n\r\n setUploading(true);\r\n\r\n try {\r\n // Upload files one by one\r\n for (const file of validFiles) {\r\n const formData = new FormData();\r\n formData.append(\"file\", file);\r\n\r\n // const response = await callApi<UploadedImage>(API_ROUTES.UPLOAD.IMAGE, HTTP_METHOD_ENUM.POST, formData);\r\n const response = {\r\n id: Date.now(),\r\n path: \"\",\r\n url: URL.createObjectURL(file),\r\n originalName: file.name,\r\n size: file.size,\r\n mimeType: file.type,\r\n width: 0,\r\n height: 0,\r\n formattedSize: `${(file.size / 1024).toFixed(1)} KB`,\r\n };\r\n\r\n const newImage: UploadedImage = {\r\n id: response.id,\r\n path: response.path,\r\n url: response.url,\r\n originalName: response.originalName,\r\n size: response.size,\r\n mimeType: response.mimeType,\r\n width: response.width,\r\n height: response.height,\r\n formattedSize: response.formattedSize,\r\n };\r\n\r\n setUploadedImages((prev) => [...prev, newImage]);\r\n onUpload?.(newImage);\r\n\r\n addToast({\r\n type: \"success\",\r\n message: `\"${file.name}\" uploaded successfully`,\r\n });\r\n }\r\n } catch (error: any) {\r\n console.error(\"Upload error:\", error);\r\n addToast({\r\n type: \"error\",\r\n message: error.message || \"Upload failed\",\r\n });\r\n } finally {\r\n setUploading(false);\r\n }\r\n },\r\n [maxSize, addToast, onUpload]\r\n );\r\n\r\n const handleDrop = useCallback(\r\n (e: React.DragEvent) => {\r\n e.preventDefault();\r\n setIsDragging(false);\r\n\r\n if (disabled) return;\r\n\r\n const files = Array.from(e.dataTransfer.files);\r\n handleFiles(files);\r\n },\r\n [disabled, handleFiles]\r\n );\r\n\r\n const handleFileSelect = useCallback(\r\n (e: React.ChangeEvent<HTMLInputElement>) => {\r\n const files = Array.from(e.target.files || []);\r\n handleFiles(files);\r\n\r\n // Reset input value so same file can be selected again\r\n if (fileInputRef.current) {\r\n fileInputRef.current.value = \"\";\r\n }\r\n },\r\n [handleFiles]\r\n );\r\n\r\n const handleRemoveImage = (imageId: string | number) => {\r\n setUploadedImages((prev) => prev.filter((img) => img.id !== Number(imageId)));\r\n onRemove?.(String(imageId));\r\n };\r\n\r\n const handleBrowseClick = () => {\r\n fileInputRef.current?.click();\r\n };\r\n\r\n return (\r\n <div className={cn(\"space-y-4\", className)}>\r\n {/* Upload Area */}\r\n <div\r\n className={cn(\r\n \"relative border-2 border-dashed rounded-lg p-8 text-center transition-all duration-200\",\r\n isDragging && !disabled ? \"border-primary bg-primary/5 scale-[1.02]\" : \"border-border hover:border-primary/50\",\r\n disabled && \"opacity-50 cursor-not-allowed\",\r\n uploading && \"pointer-events-none\"\r\n )}\r\n onDragOver={handleDragOver}\r\n onDragLeave={handleDragLeave}\r\n onDrop={handleDrop}\r\n >\r\n {uploading && (\r\n <div className=\"absolute inset-0 bg-background/80 flex items-center justify-center rounded-lg\">\r\n <div className=\"flex items-center gap-3\">\r\n <Loader2 className=\"w-6 h-6 animate-spin text-primary\" />\r\n <span className=\"text-sm font-medium\">Uploading...</span>\r\n </div>\r\n </div>\r\n )}\r\n\r\n <div className=\"space-y-4\">\r\n <div className=\"mx-auto w-12 h-12 bg-primary/10 rounded-full flex items-center justify-center\">\r\n <Upload className=\"w-6 h-6 text-primary\" />\r\n </div>\r\n\r\n <div className=\"space-y-2\">\r\n <p className=\"text-muted-foreground\">{dragDropText || t(\"dragDropText\")}</p>\r\n\r\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={handleBrowseClick} disabled={disabled || uploading}>\r\n {browseText || t(\"browseFiles\")}\r\n </Button>\r\n </div>\r\n\r\n <p className=\"text-xs text-muted-foreground\">{supportedFormatsText || t(\"supportedFormats\")}</p>\r\n </div>\r\n\r\n <input\r\n ref={fileInputRef}\r\n type=\"file\"\r\n accept={accept}\r\n multiple={multiple}\r\n onChange={handleFileSelect}\r\n className=\"hidden\"\r\n disabled={disabled}\r\n />\r\n </div>\r\n\r\n {/* Preview Area */}\r\n {showPreview && uploadedImages.length > 0 && (\r\n <div className=\"space-y-3\">\r\n <h4 className=\"text-sm font-medium\">Uploaded Images</h4>\r\n\r\n <div className=\"grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 gap-4\">\r\n {uploadedImages.map((image) => (\r\n <div key={image.id} className=\"relative group bg-card border border-border rounded-lg p-3\">\r\n {/* Remove Button */}\r\n <Button\r\n variant=\"danger\"\r\n size=\"icon\"\r\n className=\"absolute -top-2 -right-2 w-6 h-6 opacity-0 group-hover:opacity-100 transition-opacity z-10\"\r\n onClick={() => handleRemoveImage(image.id)}\r\n >\r\n <X className=\"w-3 h-3\" />\r\n </Button>\r\n\r\n {/* Image Preview */}\r\n <div className={cn(\"mx-auto mb-2 overflow-hidden rounded-md\", previewSizes[previewSize])}>\r\n {/* eslint-disable-next-line @next/next/no-img-element */}\r\n <img\r\n src={image.url}\r\n alt={image.originalName}\r\n className=\"w-full h-full object-cover\"\r\n onError={(e) => {\r\n // Fallback to file icon if image fails to load\r\n const target = e.target as HTMLImageElement;\r\n target.style.display = \"none\";\r\n target.nextElementSibling?.classList.remove(\"hidden\");\r\n }}\r\n />\r\n <div className=\"hidden w-full h-full bg-muted flex items-center justify-center\">\r\n <ImageIcon className=\"w-8 h-8 text-muted-foreground\" />\r\n </div>\r\n </div>\r\n\r\n {/* Image Info */}\r\n <div className=\"space-y-1\">\r\n <p className=\"text-xs font-medium truncate\" title={image.originalName}>\r\n {image.originalName}\r\n </p>\r\n <p className=\"text-xs text-muted-foreground\">{image.formattedSize}</p>\r\n {image.width && image.height && (\r\n <p className=\"text-xs text-muted-foreground\">\r\n {image.width} × {image.height}\r\n </p>\r\n )}\r\n </div>\r\n\r\n {/* Success Indicator */}\r\n <div className=\"absolute top-1 left-1 w-5 h-5 bg-success rounded-full flex items-center justify-center\">\r\n <Check className=\"w-3 h-3 text-success-foreground\" />\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n","\"use client\";\r\n\r\nimport * as React from \"react\";\r\nimport { ChevronLeft, ChevronRight } from \"lucide-react\";\r\nimport Button from \"./Button\";\r\nimport { cn } from \"@/lib/utils/cn\";\r\n\r\ntype AnimationVariant = \"slide\" | \"fade\" | \"scale\";\r\ntype Orientation = \"horizontal\" | \"vertical\";\r\n\r\ninterface CarouselProps {\r\n children: React.ReactNode[];\r\n autoScroll?: boolean;\r\n autoScrollInterval?: number;\r\n animation?: AnimationVariant;\r\n orientation?: Orientation;\r\n showArrows?: boolean;\r\n showDots?: boolean;\r\n showProgress?: boolean;\r\n showThumbnails?: boolean;\r\n loop?: boolean;\r\n slidesToShow?: number;\r\n slidesToScroll?: number;\r\n className?: string;\r\n containerClassName?: string;\r\n slideClassName?: string;\r\n onSlideChange?: (index: number) => void;\r\n thumbnailRenderer?: (child: React.ReactNode, index: number) => React.ReactNode;\r\n ariaLabel?: string;\r\n}\r\n\r\nexport function Carousel({\r\n children,\r\n autoScroll = true,\r\n autoScrollInterval = 5000,\r\n animation = \"slide\",\r\n orientation = \"horizontal\",\r\n showArrows = true,\r\n showDots = true,\r\n showProgress = false,\r\n showThumbnails = false,\r\n loop = true,\r\n slidesToShow = 1,\r\n slidesToScroll = 1,\r\n className,\r\n containerClassName,\r\n slideClassName,\r\n onSlideChange,\r\n thumbnailRenderer,\r\n ariaLabel = \"Carousel\",\r\n}: CarouselProps) {\r\n const [currentIndex, setCurrentIndex] = React.useState(0);\r\n const [isPaused, setIsPaused] = React.useState(false);\r\n const [isDragging, setIsDragging] = React.useState(false);\r\n const [startPos, setStartPos] = React.useState(0);\r\n const [currentTranslate, setCurrentTranslate] = React.useState(0);\r\n const [prevTranslate, setPrevTranslate] = React.useState(0);\r\n // Progress bar handled via rAF to avoid frequent React state updates\n const progressElRef = React.useRef<HTMLDivElement | null>(null);\n\r\n const carouselRef = React.useRef<HTMLDivElement>(null);\r\n const rafRef = React.useRef<number | null>(null);\n\r\n const totalSlides = React.Children.count(children);\r\n const maxIndex = Math.max(0, totalSlides - slidesToShow);\r\n const isHorizontal = orientation === \"horizontal\";\r\n\r\n const scrollPrev = React.useCallback(() => {\r\n setCurrentIndex((prev) => {\r\n if (prev === 0) {\r\n return loop ? maxIndex : 0;\r\n }\r\n return Math.max(0, prev - slidesToScroll);\r\n });\r\n }, [loop, maxIndex, slidesToScroll]);\r\n\r\n const scrollNext = React.useCallback(() => {\r\n setCurrentIndex((prev) => {\r\n if (prev >= maxIndex) {\r\n return loop ? 0 : maxIndex;\r\n }\r\n return Math.min(maxIndex, prev + slidesToScroll);\r\n });\r\n }, [loop, maxIndex, slidesToScroll]);\r\n\r\n const scrollTo = React.useCallback(\r\n (index: number) => {\r\n setCurrentIndex(Math.min(maxIndex, Math.max(0, index)));\r\n },\r\n [maxIndex]\r\n );\r\n\r\n // Keyboard navigation\r\n React.useEffect(() => {\r\n const handleKeyDown = (e: KeyboardEvent) => {\r\n if (e.key === \"ArrowLeft\" || e.key === \"ArrowUp\") {\r\n e.preventDefault();\r\n scrollPrev();\r\n } else if (e.key === \"ArrowRight\" || e.key === \"ArrowDown\") {\r\n e.preventDefault();\r\n scrollNext();\r\n } else if (e.key === \"Home\") {\r\n e.preventDefault();\r\n scrollTo(0);\r\n } else if (e.key === \"End\") {\r\n e.preventDefault();\r\n scrollTo(maxIndex);\r\n }\r\n };\r\n\r\n const carousel = carouselRef.current;\r\n if (carousel) {\r\n carousel.addEventListener(\"keydown\", handleKeyDown);\r\n return () => carousel.removeEventListener(\"keydown\", handleKeyDown);\r\n }\r\n }, [scrollPrev, scrollNext, scrollTo, maxIndex]);\r\n\r\n // Auto scroll with progress (requestAnimationFrame)\n React.useEffect(() => {\n // Cleanup helper\n const stop = () => {\n if (rafRef.current != null) {\n cancelAnimationFrame(rafRef.current);\n rafRef.current = null;\n }\n if (progressElRef.current) progressElRef.current.style.width = '0%';\n };\n\n if (!autoScroll || isPaused || totalSlides <= slidesToShow) {\n stop();\n return;\n }\n\n let start = performance.now();\n const tick = (now: number) => {\n const elapsed = now - start;\n const ratio = Math.min(1, elapsed / autoScrollInterval);\n if (progressElRef.current) {\n progressElRef.current.style.width = `${ratio * 100}%`;\n }\n if (ratio >= 1) {\n // Advance slide and restart cycle\n scrollNext();\n start = performance.now();\n }\n rafRef.current = requestAnimationFrame(tick);\n };\n rafRef.current = requestAnimationFrame(tick);\n\n return stop;\n }, [autoScroll, isPaused, totalSlides, slidesToShow, autoScrollInterval, scrollNext]);\n\r\n // Touch/Mouse drag handlers\r\n const getPositionX = (event: TouchEvent | MouseEvent) => {\r\n return event.type.includes(\"mouse\") ? (event as MouseEvent).pageX : (event as TouchEvent).touches[0].clientX;\r\n };\r\n\r\n const getPositionY = (event: TouchEvent | MouseEvent) => {\r\n return event.type.includes(\"mouse\") ? (event as MouseEvent).pageY : (event as TouchEvent).touches[0].clientY;\r\n };\r\n\r\n const touchStart = (event: React.TouchEvent | React.MouseEvent) => {\r\n setIsDragging(true);\r\n const pos = isHorizontal ? getPositionX(event.nativeEvent) : getPositionY(event.nativeEvent);\r\n setStartPos(pos);\r\n setPrevTranslate(currentTranslate);\r\n };\r\n\r\n const touchMove = (event: React.TouchEvent | React.MouseEvent) => {\r\n if (!isDragging) return;\r\n const pos = isHorizontal ? getPositionX(event.nativeEvent) : getPositionY(event.nativeEvent);\r\n const currentPosition = pos;\r\n setCurrentTranslate(prevTranslate + currentPosition - startPos);\r\n };\r\n\r\n const touchEnd = () => {\r\n if (!isDragging) return;\r\n setIsDragging(false);\r\n\r\n const movedBy = currentTranslate - prevTranslate;\r\n const threshold = 50;\r\n\r\n if (movedBy < -threshold && currentIndex < maxIndex) {\r\n scrollNext();\r\n } else if (movedBy > threshold && currentIndex > 0) {\r\n scrollPrev();\r\n }\r\n\r\n setCurrentTranslate(0);\r\n setPrevTranslate(0);\r\n };\r\n\r\n // Call onSlideChange callback\r\n React.useEffect(() => {\r\n onSlideChange?.(currentIndex);\r\n }, [currentIndex, onSlideChange]);\r\n\r\n const getAnimationStyles = (): React.CSSProperties => {\r\n const baseTransform = isHorizontal\r\n ? `translateX(-${currentIndex * (100 / slidesToShow)}%)`\r\n : `translateY(-${currentIndex * (100 / slidesToShow)}%)`;\r\n\r\n if (animation === \"fade\") {\r\n return {\r\n transition: \"opacity 500ms ease-in-out\",\r\n };\r\n }\r\n\r\n if (animation === \"scale\") {\r\n return {\r\n transform: baseTransform,\r\n transition: \"transform 500ms ease-in-out, scale 500ms ease-in-out\",\r\n };\r\n }\r\n\r\n return {\r\n transform: baseTransform,\r\n transition: isDragging ? \"none\" : \"transform 500ms ease-in-out\",\r\n };\r\n };\r\n\r\n const slideWidth = 100 / slidesToShow;\r\n\r\n return (\r\n <div\r\n ref={carouselRef}\r\n className={cn(\"relative w-full overflow-hidden focus:outline-none focus:ring-2 focus:ring-primary focus:ring-offset-2 rounded-lg\", className)}\r\n onMouseEnter={() => setIsPaused(true)}\r\n onMouseLeave={() => setIsPaused(false)}\r\n role=\"region\"\r\n aria-label={ariaLabel}\r\n aria-roledescription=\"carousel\"\r\n tabIndex={0}\r\n >\r\n {/* Progress bar */}\r\n {showProgress && autoScroll && (\n <div className=\"absolute top-0 left-0 right-0 h-1 bg-muted z-20\">\n <div ref={progressElRef} className=\"h-full bg-primary\" style={{ width: '0%' }} />\n </div>\n )}\n\r\n {/* Slides container */}\r\n <div\r\n className={cn(\"flex\", isHorizontal ? \"flex-row\" : \"flex-col\", containerClassName)}\r\n style={getAnimationStyles()}\r\n onTouchStart={touchStart}\r\n onTouchMove={touchMove}\r\n onTouchEnd={touchEnd}\r\n onMouseDown={touchStart}\r\n onMouseMove={touchMove}\r\n onMouseUp={touchEnd}\r\n onMouseLeave={touchEnd}\r\n role=\"group\"\r\n aria-atomic=\"false\"\r\n aria-live={autoScroll ? \"off\" : \"polite\"}\r\n >\r\n {React.Children.map(children, (child, idx) => (\r\n <div\r\n key={idx}\r\n className={cn(\r\n \"shrink-0\",\r\n isHorizontal ? \"h-full\" : \"w-full\",\r\n animation === \"fade\" && idx !== currentIndex && \"opacity-0\",\r\n animation === \"scale\" && idx !== currentIndex && \"scale-95\",\r\n slideClassName\r\n )}\r\n style={{\r\n [isHorizontal ? \"width\" : \"height\"]: `${slideWidth}%`,\r\n }}\r\n role=\"group\"\r\n aria-roledescription=\"slide\"\r\n aria-label={`${idx + 1} of ${totalSlides}`}\r\n aria-hidden={idx < currentIndex || idx >= currentIndex + slidesToShow}\r\n >\r\n {child}\r\n </div>\r\n ))}\r\n </div>\r\n\r\n {/* Navigation arrows */}\r\n {showArrows && totalSlides > slidesToShow && (\r\n <>\r\n <Button\r\n onClick={scrollPrev}\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n icon={ChevronLeft}\r\n noHoverOverlay\r\n disabled={!loop && currentIndex === 0}\r\n className={cn(\r\n \"absolute top-1/2 -translate-y-1/2 hover:-translate-y-1/2 active:-translate-y-1/2 z-10 rounded-full will-change-transform backdrop-blur-0 hover:backdrop-blur-0 hover:bg-transparent border-0\",\r\n isHorizontal ? \"left-4\" : \"top-4 left-1/2 -translate-x-1/2 rotate-90\"\r\n )}\r\n aria-label=\"Previous slide\"\r\n />\r\n\r\n <Button\r\n onClick={scrollNext}\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n icon={ChevronRight}\r\n noHoverOverlay\r\n disabled={!loop && currentIndex >= maxIndex}\r\n className={cn(\r\n \"absolute top-1/2 -translate-y-1/2 hover:-translate-y-1/2 active:-translate-y-1/2 z-10 rounded-full will-change-transform backdrop-blur-0 hover:backdrop-blur-0 hover:bg-transparent border-0\",\r\n isHorizontal ? \"right-4\" : \"bottom-4 left-1/2 -translate-x-1/2 rotate-90\"\r\n )}\r\n aria-label=\"Next slide\"\r\n />\r\n </>\r\n )}\r\n\r\n {/* Dots indicators */}\r\n {showDots && totalSlides > slidesToShow && (\r\n <div\r\n className={cn(\r\n \"absolute flex gap-2 z-10\",\r\n isHorizontal ? \"bottom-4 left-1/2 -translate-x-1/2 flex-row\" : \"right-4 top-1/2 -translate-y-1/2 flex-col\"\r\n )}\r\n role=\"tablist\"\r\n aria-label=\"Carousel pagination\"\r\n >\r\n {Array.from({ length: maxIndex + 1 }, (_, idx) => (\r\n <button\r\n key={idx}\r\n onClick={() => scrollTo(idx)}\r\n className={cn(\r\n \"rounded-full transition-all focus:outline-none focus:ring-2 focus:ring-primary focus:ring-offset-2\",\r\n isHorizontal ? \"w-2 h-2\" : \"w-2 h-2\",\r\n idx === currentIndex ? `bg-primary ${isHorizontal ? \"w-6\" : \"h-6\"}` : \"bg-muted-foreground/50 hover:bg-muted-foreground/75\"\r\n )}\r\n aria-label={`Go to slide ${idx + 1}`}\r\n aria-selected={idx === currentIndex}\r\n role=\"tab\"\r\n />\r\n ))}\r\n </div>\r\n )}\r\n\r\n {/* Thumbnail navigation */}\r\n {showThumbnails && totalSlides > slidesToShow && (\r\n <div\r\n className={cn(\r\n \"absolute bottom-0 left-0 right-0 flex gap-2 p-4 bg-linear-to-t from-black/50 to-transparent overflow-x-auto\",\r\n isHorizontal ? \"flex-row\" : \"flex-col\"\r\n )}\r\n >\r\n {React.Children.map(children, (child, idx) => (\r\n <button\r\n key={idx}\r\n onClick={() => scrollTo(idx)}\r\n className={cn(\r\n \"shrink-0 w-16 h-16 rounded-md overflow-hidden border-2 transition-all focus:outline-none focus:ring-2 focus:ring-primary\",\r\n idx === currentIndex ? \"border-primary scale-110\" : \"border-transparent opacity-70 hover:opacity-100\"\r\n )}\r\n aria-label={`Thumbnail ${idx + 1}`}\r\n >\r\n {thumbnailRenderer ? thumbnailRenderer(child, idx) : child}\r\n </button>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\nexport default Carousel;\r\n","\"use client\";\n\nimport React from \"react\";\nimport { cn } from \"@/lib/utils/cn\";\n\nexport type IconComponent = React.ComponentType<{ className?: string }>;\n\nexport interface FallingIconsProps {\n icon?: IconComponent;\n imageUrl?: string; // Custom image URL to use instead of icon\n count?: number;\n className?: string;\n areaClassName?: string;\n colorClassName?: string;\n zIndex?: number;\n speedRange?: [number, number]; // seconds\n sizeRange?: [number, number]; // px\n horizontalDrift?: number; // px amplitude\n spin?: boolean;\n fullScreen?: boolean;\n // Randomize properties again each time a particle finishes a fall\n randomizeEachLoop?: boolean;\n // Modern UI enhancements\n glow?: boolean; // Add glow/shadow effect\n glowColor?: string; // Custom glow color\n glowIntensity?: number; // 0-1\n trail?: boolean; // Add particle trail effect\n trailLength?: number; // Number of trail particles (1-5)\n physics?: {\n gravity?: number; // 0.5-2, default 1\n windDirection?: number; // -1 (left) to 1 (right), default 0\n windStrength?: number; // 0-1\n rotation?: boolean; // Physics-based rotation\n };\n easingFunction?: \"linear\" | \"ease\" | \"ease-in\" | \"ease-out\" | \"ease-in-out\" | \"bounce\" | \"elastic\";\n}\n\ntype Particle = {\n leftPct: number;\n size: number;\n fallDur: number;\n delay: number;\n driftAmp: number;\n spinDur: number;\n key: number;\n};\n\nconst DEFAULT_COUNT = 24;\nconst DEFAULT_SPEED_RANGE: [number, number] = [6, 14];\nconst DEFAULT_SIZE_RANGE: [number, number] = [14, 28];\n\nexport default function FallingIcons({\n icon: Icon,\n imageUrl,\n count = DEFAULT_COUNT,\n className,\n areaClassName,\n colorClassName,\n zIndex = 10,\n speedRange = DEFAULT_SPEED_RANGE,\n sizeRange = DEFAULT_SIZE_RANGE,\n horizontalDrift = 24,\n spin = true,\n fullScreen = false,\n randomizeEachLoop = true,\n // Modern UI enhancements\n glow = false,\n glowColor = \"currentColor\",\n glowIntensity = 0.5,\n trail = false,\n trailLength = 3,\n physics,\n easingFunction = \"linear\",\n}: FallingIconsProps) {\n const uid = React.useId().replace(/[:]/g, \"\");\n const containerRef = React.useRef<HTMLDivElement | null>(null);\n const [fallDist, setFallDist] = React.useState<number | null>(null);\n const idRef = React.useRef(1);\n\n // Physics calculations\n const gravity = physics?.gravity ?? 1;\n const windDirection = physics?.windDirection ?? 0;\n const windStrength = physics?.windStrength ?? 0;\n const physicsRotation = physics?.rotation ?? false;\n\n // Easing function mapping\n const easingMap: Record<string, string> = {\n linear: \"linear\",\n ease: \"ease\",\n \"ease-in\": \"ease-in\",\n \"ease-out\": \"ease-out\",\n \"ease-in-out\": \"ease-in-out\",\n bounce: \"cubic-bezier(0.68, -0.55, 0.265, 1.55)\",\n elastic: \"cubic-bezier(0.175, 0.885, 0.32, 1.275)\",\n };\n\n const makeParticle = React.useCallback((): Particle => {\n const rnd = (min: number, max: number) => min + Math.random() * (max - min);\n return {\n leftPct: rnd(0, 100),\n size: rnd(sizeRange[0], sizeRange[1]),\n fallDur: rnd(speedRange[0], speedRange[1]) / gravity, // Apply gravity to speed\n delay: rnd(-10, 0),\n driftAmp: rnd(horizontalDrift * 0.5, horizontalDrift) + (windDirection * windStrength * 50), // Apply wind\n spinDur: rnd(2, 6),\n key: idRef.current++,\n };\n }, [sizeRange, speedRange, horizontalDrift, gravity, windDirection, windStrength]);\n\n const [particles, setParticles] = React.useState<Particle[]>([]);\n\n // Initialize particles\n React.useEffect(() => {\n const arr: Particle[] = Array.from({ length: Math.max(0, count) }).map(() => makeParticle());\n setParticles(arr);\n }, [count, makeParticle]);\n\n // Measure container height to drive fall distance in px\n React.useEffect(() => {\n if (fullScreen) {\n const measure = () => setFallDist(window.innerHeight + 200);\n measure();\n window.addEventListener(\"resize\", measure);\n return () => window.removeEventListener(\"resize\", measure);\n }\n\n const el = containerRef.current;\n if (!el) return;\n const measure = () => setFallDist(el.offsetHeight + 200);\n measure();\n const ResizeObserverCtor: any = (window as any).ResizeObserver;\n if (ResizeObserverCtor) {\n const ro: any = new ResizeObserverCtor(measure);\n ro.observe(el);\n return () => ro.disconnect();\n }\n window.addEventListener(\"resize\", measure);\n return () => window.removeEventListener(\"resize\", measure);\n }, [fullScreen]);\n\n const FallName = `uv-fall-${uid}`;\n const SwayName = `uv-sway-${uid}`;\n const SpinName = `uv-spin-${uid}`;\n const PopName = `uv-pop-${uid}`;\n const PhysicsSpinName = `uv-physics-spin-${uid}`;\n\n // Calculate glow styles\n const glowStyles = React.useMemo(() => {\n if (!glow) return {};\n const intensity = Math.max(0, Math.min(1, glowIntensity));\n return {\n filter: `drop-shadow(0 0 ${4 * intensity}px ${glowColor}) drop-shadow(0 0 ${8 * intensity}px ${glowColor})`,\n };\n }, [glow, glowColor, glowIntensity]);\n\n // Provide a minimal fallback icon (circle) if none is passed\n const FallbackIcon = React.useMemo<IconComponent>(() => (props) => (\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\" {...props}>\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n </svg>\n ), []);\n\n // Use custom image if provided, otherwise use icon\n const TheIcon = imageUrl\n ? ({ className: imgClassName }: { className?: string }) => (\n <img\n src={imageUrl}\n alt=\"\"\n className={cn(\"w-full h-full object-cover rounded-sm\", imgClassName)}\n draggable={false}\n />\n )\n : (Icon || FallbackIcon);\n\n return (\n <div\n ref={containerRef}\n className={cn(\n fullScreen\n ? \"fixed inset-0 overflow-hidden pointer-events-none\"\n : \"relative w-full h-full overflow-hidden\",\n areaClassName\n )}\n style={{ zIndex }}\n >\n <style>{`\n @keyframes ${FallName} {\n 0% { transform: translate3d(0, -10vh, 0); opacity: 0; }\n 10% { opacity: 1; }\n 100% { transform: translate3d(0, var(--fall, 120vh), 0); opacity: 0.95; }\n }\n @keyframes ${SwayName} {\n 0% { transform: translateX(0); }\n 50% { transform: translateX(var(--amp, 16px)); }\n 100% { transform: translateX(0); }\n }\n @keyframes ${SpinName} {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n }\n @keyframes ${PopName} {\n 0% { opacity: 1; transform: scale(1); }\n 100% { opacity: 0; transform: scale(0.3); }\n }\n @keyframes ${PhysicsSpinName} {\n 0% { transform: rotate(0deg) scale(1); }\n 25% { transform: rotate(90deg) scale(1.05); }\n 50% { transform: rotate(180deg) scale(1); }\n 75% { transform: rotate(270deg) scale(1.05); }\n 100% { transform: rotate(360deg) scale(1); }\n }\n @media (prefers-reduced-motion: reduce) {\n .uv-falling-particle {\n animation-duration: 0.01ms !important;\n animation-iteration-count: 1 !important;\n }\n }\n `}</style>\n\n <div\n className={cn(\n \"absolute inset-0 pointer-events-none\",\n className\n )}\n aria-hidden\n >\n {particles.map((p, i) => {\n const swayDuration = p.fallDur * (0.8 + (i % 5) * 0.05);\n const spinDuration = Math.max(1, p.spinDur);\n const handlePop: React.MouseEventHandler<HTMLSpanElement> = () => {\n // Replace particle to simulate vanish + respawn\n setParticles((prev) => {\n const next = prev.slice();\n const np = makeParticle();\n np.delay = -Math.random() * 8;\n next[i] = np;\n return next;\n });\n };\n\n // Render trail particles\n const trailParticles = trail ? Array.from({ length: Math.min(5, Math.max(1, trailLength)) }) : [];\n\n return (\n <React.Fragment key={p.key}>\n {/* Trail particles */}\n {trail && trailParticles.map((_, trailIndex) => {\n const trailDelay = p.delay - (trailIndex + 1) * 0.15;\n const trailOpacity = 1 - (trailIndex + 1) * (1 / (trailParticles.length + 1));\n const trailScale = 1 - (trailIndex + 1) * 0.15;\n\n return (\n <span\n key={`${p.key}-trail-${trailIndex}`}\n className={cn(\"absolute top-0 will-change-transform pointer-events-none uv-falling-particle\", colorClassName)}\n style={{\n left: `${p.leftPct}%`,\n animationDelay: `${trailDelay}s`,\n animationDuration: `${p.fallDur}s`,\n animationName: FallName,\n animationTimingFunction: easingMap[easingFunction] || \"linear\",\n animationIterationCount: \"infinite\",\n opacity: trailOpacity * 0.4,\n [\"--fall\" as any]: `${fallDist ?? (typeof window !== 'undefined' ? window.innerHeight + 200 : 1200)}px`,\n } as React.CSSProperties}\n >\n <span\n className=\"inline-block uv-sway\"\n style={{\n transform: `translateX(-50%) scale(${trailScale})`,\n animationName: SwayName,\n animationDuration: `${swayDuration}s`,\n animationTimingFunction: \"ease-in-out\",\n animationIterationCount: \"infinite\",\n [\"--amp\" as any]: `${Math.round(p.driftAmp)}px`,\n } as React.CSSProperties}\n >\n <span\n className=\"block\"\n style={{\n width: p.size,\n height: p.size,\n ...glowStyles,\n } as React.CSSProperties}\n >\n <TheIcon className={cn(\"w-full h-full text-primary/70\", colorClassName)} />\n </span>\n </span>\n </span>\n );\n })}\n\n {/* Main particle */}\n <span\n className={cn(\"absolute top-0 will-change-transform pointer-events-auto uv-falling-particle\", colorClassName)}\n style={{\n left: `${p.leftPct}%`,\n animationDelay: `${p.delay}s`,\n animationDuration: `${p.fallDur}s`,\n animationName: FallName,\n animationTimingFunction: easingMap[easingFunction] || \"linear\",\n animationIterationCount: \"infinite\",\n [\"--fall\" as any]: `${fallDist ?? (typeof window !== 'undefined' ? window.innerHeight + 200 : 1200)}px`,\n } as React.CSSProperties}\n onMouseEnter={handlePop}\n onAnimationIteration={(ev: React.AnimationEvent<HTMLSpanElement>) => {\n // Ignore bubbled events from inner sway/spin animations\n if (ev.currentTarget !== ev.target) return;\n if (!randomizeEachLoop) return;\n if (ev.animationName !== FallName) return;\n setParticles((prev) => {\n const next = prev.slice();\n const np = makeParticle();\n // Start immediately on next cycle\n np.delay = -Math.random() * 4;\n next[i] = np;\n return next;\n });\n }}\n >\n <span\n className=\"inline-block uv-sway\"\n style={{\n transform: `translateX(-50%)`,\n animationName: SwayName,\n animationDuration: `${swayDuration}s`,\n animationTimingFunction: \"ease-in-out\",\n animationIterationCount: \"infinite\",\n [\"--amp\" as any]: `${Math.round(p.driftAmp)}px`,\n } as React.CSSProperties}\n >\n <span\n className={cn(\n \"block uv-spin hover:animate-[var(--popName)_0.35s_ease-out_forwards]\",\n physicsRotation\n ? \"animate-[var(--physicsSpinName)_var(--spinDur)_ease-in-out_infinite]\"\n : spin && \"animate-[var(--spinName)_var(--spinDur)_linear_infinite]\"\n )}\n style={{\n width: p.size,\n height: p.size,\n [\"--spinName\" as any]: SpinName,\n [\"--physicsSpinName\" as any]: PhysicsSpinName,\n [\"--spinDur\" as any]: `${spinDuration}s`,\n [\"--popName\" as any]: PopName,\n ...glowStyles,\n } as React.CSSProperties}\n >\n <TheIcon className={cn(\"w-full h-full text-primary/70\", colorClassName)} />\n </span>\n </span>\n </span>\n </React.Fragment>\n );\n })}\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"@/lib/utils/cn\";\nimport { ChevronRight } from \"lucide-react\";\n\ntype Variant = \"plain\" | \"outlined\" | \"soft\" | \"bordered\" | \"card\" | \"flush\" | \"striped\";\ntype Size = \"xs\" | \"sm\" | \"md\" | \"lg\";\n\nexport interface ListProps extends React.HTMLAttributes<HTMLUListElement> {\n as?: \"ul\" | \"ol\" | \"div\";\n ordered?: boolean;\n variant?: Variant;\n size?: Size;\n divided?: boolean;\n inset?: boolean; // inner padding around items\n hoverable?: boolean;\n /** Show loading skeleton */\n loading?: boolean;\n /** Number of skeleton items to show */\n loadingCount?: number;\n /** Show empty state when no children */\n emptyText?: string;\n /** Make items more compact */\n dense?: boolean;\n}\n\nexport interface ListItemProps extends React.HTMLAttributes<HTMLLIElement> {\n as?: \"li\" | \"div\" | \"a\" | \"button\";\n selected?: boolean;\n disabled?: boolean;\n href?: string;\n label?: React.ReactNode;\n description?: React.ReactNode;\n leftIcon?: React.ComponentType<{ className?: string }>;\n rightIcon?: React.ComponentType<{ className?: string }>;\n /** Show avatar on the left */\n avatar?: string | React.ReactNode;\n /** Show badge/tag */\n badge?: React.ReactNode;\n /** Badge color variant */\n badgeVariant?: \"default\" | \"success\" | \"warning\" | \"error\" | \"info\";\n /** Action button on hover */\n action?: React.ReactNode;\n /** Make item collapsible */\n collapsible?: boolean;\n /** Expanded state for collapsible */\n expanded?: boolean;\n /** Callback when expanded state changes */\n onExpandChange?: (expanded: boolean) => void;\n /** Content to show when expanded */\n expandContent?: React.ReactNode;\n}\n\nconst SIZE_STYLES: Record<Size, { itemPad: string; densePad: string; label: string; desc: string; icon: string; avatar: string }> = {\n xs: { itemPad: \"px-2 py-1.5\", densePad: \"px-2 py-1\", label: \"text-xs\", desc: \"text-[11px]\", icon: \"h-3.5 w-3.5\", avatar: \"h-6 w-6\" },\n sm: { itemPad: \"px-3 py-2\", densePad: \"px-3 py-1.5\", label: \"text-[13px]\", desc: \"text-[12px]\", icon: \"h-4 w-4\", avatar: \"h-8 w-8\" },\n md: { itemPad: \"px-4 py-2.5\", densePad: \"px-4 py-2\", label: \"text-sm\", desc: \"text-xs\", icon: \"h-5 w-5\", avatar: \"h-10 w-10\" },\n lg: { itemPad: \"px-5 py-3\", densePad: \"px-5 py-2.5\", label: \"text-base\", desc: \"text-sm\", icon: \"h-5 w-5\", avatar: \"h-12 w-12\" },\n};\n\nconst BADGE_VARIANTS = {\n default: \"bg-muted text-muted-foreground\",\n success: \"bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400\",\n warning: \"bg-yellow-100 text-yellow-700 dark:bg-yellow-900/30 dark:text-yellow-400\",\n error: \"bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-400\",\n info: \"bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-400\",\n};\n\n// Skeleton component for loading state\nconst ListItemSkeleton: React.FC<{ size: Size }> = ({ size }) => {\n const sz = SIZE_STYLES[size];\n return (\n <div className={cn(\"flex items-center gap-3 animate-pulse\", sz.itemPad)}>\n <div className={cn(\"rounded-full bg-muted shrink-0\", sz.avatar)} />\n <div className=\"flex-1 space-y-2\">\n <div className=\"h-4 bg-muted rounded w-3/4\" />\n <div className=\"h-3 bg-muted rounded w-1/2\" />\n </div>\n </div>\n );\n};\n\nconst ListRoot = React.forwardRef<HTMLUListElement, ListProps>(\n (\n {\n as = \"ul\",\n ordered,\n variant = \"plain\",\n size = \"md\",\n divided = false,\n inset = false,\n hoverable = true,\n loading = false,\n loadingCount = 3,\n emptyText,\n dense = false,\n className,\n children,\n ...rest\n },\n ref\n ) => {\n const Comp: any = ordered ? \"ol\" : as;\n const childCount = React.Children.count(children);\n const hasChildren = childCount > 0;\n\n // Variant styles\n const variantClasses = {\n plain: \"\",\n outlined: \"rounded-lg md:rounded-xl bg-card text-card-foreground border border-border shadow-sm\",\n soft: \"rounded-lg bg-muted/40 border border-border/60\",\n bordered: \"border border-border rounded-lg\",\n card: \"rounded-lg bg-card shadow-md border border-border\",\n flush: \"\",\n striped: \"rounded-lg border border-border overflow-hidden\",\n };\n\n // Loading state\n if (loading) {\n return (\n <Comp ref={ref} className={cn(\"group/list\", variantClasses[variant], inset && \"p-1.5 md:p-2\", divided && \"divide-y divide-border/60\", className)} {...rest}>\n {Array.from({ length: loadingCount }).map((_, i) => (\n <ListItemSkeleton key={i} size={size} />\n ))}\n </Comp>\n );\n }\n\n // Empty state\n if (!hasChildren && emptyText) {\n return (\n <Comp ref={ref} className={cn(\"group/list\", variantClasses[variant], inset && \"p-1.5 md:p-2\", className)} {...rest}>\n <div className=\"text-center py-8 text-muted-foreground text-sm\">{emptyText}</div>\n </Comp>\n );\n }\n\n return (\n <Comp\n ref={ref}\n className={cn(\n \"group/list\",\n variantClasses[variant],\n inset && \"p-1.5 md:p-2\",\n divided && \"divide-y divide-border/60\",\n variant === \"striped\" && \"[&>*:nth-child(even)]:bg-muted/30\",\n className\n )}\n {...rest}\n >\n {React.Children.map(children, (child, idx) => {\n if (!React.isValidElement(child)) return child;\n const childClass = cn(\n (child.props as any)?.className,\n hoverable && variant !== \"flush\" && \"hover:bg-accent/50 focus:bg-accent/60 focus:outline-none transition-colors\",\n variant === \"flush\" && \"hover:bg-accent/30\"\n );\n return React.cloneElement(child as any, {\n className: childClass,\n \"data-first\": idx === 0 ? \"true\" : undefined,\n \"data-last\": idx === childCount - 1 ? \"true\" : undefined,\n \"data-size\": size,\n \"data-dense\": dense ? \"true\" : undefined,\n });\n })}\n </Comp>\n );\n }\n);\n\nListRoot.displayName = \"List\";\n\nexport const ListItem = React.forwardRef<HTMLLIElement, ListItemProps>(\n (\n {\n as = \"li\",\n selected = false,\n disabled = false,\n href,\n label,\n description,\n leftIcon: Left,\n rightIcon: Right,\n avatar,\n badge,\n badgeVariant = \"default\",\n action,\n collapsible = false,\n expanded: controlledExpanded,\n onExpandChange,\n expandContent,\n className,\n children,\n ...rest\n },\n ref\n ) => {\n const [internalExpanded, setInternalExpanded] = React.useState(false);\n const isExpanded = controlledExpanded !== undefined ? controlledExpanded : internalExpanded;\n\n const sizeAttr = (rest as any)[\"data-size\"] as Size | undefined;\n const denseAttr = (rest as any)[\"data-dense\"] as string | undefined;\n const isDense = denseAttr === \"true\";\n const resolvedSize: Size = sizeAttr && (sizeAttr === \"xs\" || sizeAttr === \"sm\" || sizeAttr === \"md\" || sizeAttr === \"lg\") ? sizeAttr : \"md\";\n const sz = SIZE_STYLES[resolvedSize];\n const padding = isDense ? sz.densePad : sz.itemPad;\n\n const toggleExpanded = () => {\n const newExpanded = !isExpanded;\n if (onExpandChange) {\n onExpandChange(newExpanded);\n } else {\n setInternalExpanded(newExpanded);\n }\n };\n\n const headerProps = collapsible\n ? {\n role: \"button\" as const,\n tabIndex: disabled ? -1 : 0,\n onClick: disabled ? undefined : () => toggleExpanded(),\n onKeyDown: (e: React.KeyboardEvent<HTMLDivElement>) => {\n if (disabled) return;\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n toggleExpanded();\n }\n },\n }\n : {};\n\n const inner = (\n <>\n <div\n className={cn(\"flex items-center gap-3\", padding, \"group/item relative\")}\n {...headerProps}\n >\n {/* Avatar */}\n {avatar && (\n <div className={cn(\"shrink-0\", sz.avatar)}>\n {typeof avatar === \"string\" ? (\n <img src={avatar} alt=\"\" className={cn(\"rounded-full object-cover\", sz.avatar)} />\n ) : (\n avatar\n )}\n </div>\n )}\n\n {/* Left Icon */}\n {Left && !avatar && (\n <span className={cn(\"text-muted-foreground shrink-0\", sz.icon)}>\n <Left className={cn(sz.icon)} />\n </span>\n )}\n\n {/* Content */}\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-2\">\n {label && <div className={cn(sz.label, \"text-foreground font-medium truncate\")}>{label}</div>}\n {badge && (\n <span className={cn(\"px-2 py-0.5 rounded-full text-[11px] font-medium shrink-0\", BADGE_VARIANTS[badgeVariant])}>{badge}</span>\n )}\n </div>\n {description && <div className={cn(sz.desc, \"text-muted-foreground truncate mt-0.5\")}>{description}</div>}\n {children && <div className=\"mt-1\">{children}</div>}\n </div>\n\n {/* Action Button */}\n {action && <div className=\"opacity-0 group-hover/item:opacity-100 transition-opacity shrink-0\">{action}</div>}\n\n {/* Right Icon or Collapsible Icon */}\n {collapsible ? (\n <span\n className={cn(\n \"text-muted-foreground shrink-0 transition-transform cursor-pointer select-none\",\n sz.icon,\n isExpanded && \"rotate-90\"\n )}\n >\n <ChevronRight className={cn(sz.icon)} />\n </span>\n ) : (\n Right && (\n <span className={cn(\"text-muted-foreground shrink-0\", sz.icon)}>\n <Right className={cn(sz.icon)} />\n </span>\n )\n )}\n </div>\n\n {/* Expanded Content */}\n {collapsible && isExpanded && expandContent && (\n <div className={cn(\"border-t border-border/50 bg-muted/20\", padding, \"pt-3\")}>{expandContent}</div>\n )}\n </>\n );\n\n const baseCls = cn(\n \"relative w-full\",\n selected && \"bg-primary/10 ring-1 ring-primary/30\",\n disabled && \"opacity-60 cursor-not-allowed\",\n className\n );\n\n if (href) {\n const A: any = as === \"a\" ? \"a\" : \"a\";\n return (\n <A ref={ref as any} href={href} className={cn(baseCls, \"block\")} {...(rest as any)}>\n {inner}\n </A>\n );\n }\n if (as === \"button\" && !collapsible) {\n return (\n <button\n ref={ref as any}\n type=\"button\"\n className={cn(baseCls, \"text-left block w-full\")}\n {...(rest as any)}\n >\n {inner}\n </button>\n );\n }\n if (collapsible) {\n // For collapsible items, only the chevron icon handles toggle.\n // The container itself is non-clickable so clicking expandContent\n // doesn't collapse the section.\n return (\n <div\n ref={ref as any}\n className={cn(baseCls, \"text-left block w-full\")}\n {...(rest as any)}\n >\n {inner}\n </div>\n );\n }\n const Comp: any = as;\n return (\n <Comp ref={ref as any} className={baseCls} {...rest}>\n {inner}\n </Comp>\n );\n }\n);\n\nListItem.displayName = \"List.Item\";\n\nconst List = Object.assign(ListRoot, { Item: ListItem });\n\nexport default List;\n","\"use client\";\n\nimport * as React from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { cn } from \"@/lib/utils/cn\";\n\ntype WatermarkPreset = \"confidential\" | \"draft\" | \"sample\" | \"copyright\" | \"doNotCopy\" | \"internal\";\ntype WatermarkPattern = \"diagonal\" | \"grid\" | \"straight\";\ntype AnimationVariant = \"fade\" | \"slide\" | \"scale\" | \"pulse\" | \"none\";\n\nexport interface WatermarkProps extends React.HTMLAttributes<HTMLDivElement> {\n text?: string | string[]; // text watermark (support multi-line)\n image?: string; // image src watermark\n width?: number; // pattern tile width (content box)\n height?: number; // pattern tile height (content box)\n gapX?: number; // horizontal gap between tiles\n gapY?: number; // vertical gap between tiles\n rotate?: number; // degrees\n fontSize?: number;\n fontFamily?: string;\n fontWeight?: number | string;\n fontStyle?: \"normal\" | \"italic\";\n color?: string; // text color\n /** Use gradient colors */\n gradient?: string;\n opacity?: number; // overall layer opacity (0..1)\n offsetLeft?: number; // background-position x\n offsetTop?: number; // background-position y\n zIndex?: number;\n fullPage?: boolean; // fixed overlay over entire viewport\n /** Preset watermark styles */\n preset?: WatermarkPreset;\n /** Pattern layout */\n pattern?: WatermarkPattern;\n /** Enable interactive mode (click to toggle) */\n interactive?: boolean;\n /** Animation effect */\n animate?: boolean;\n /** Animation variant */\n animationVariant?: AnimationVariant;\n /** Enable backdrop blur */\n blur?: boolean;\n /** Blur amount in pixels */\n blurAmount?: number;\n /** Enable text shadow */\n textShadow?: boolean;\n /** Text shadow color */\n shadowColor?: string;\n /** Enable dark mode auto-adjust */\n darkMode?: boolean;\n /** Class for the overlay layer */\n overlayClassName?: string;\n /** ARIA label for accessibility */\n ariaLabel?: string;\n}\n\n// Preset configurations\nconst PRESETS: Record<WatermarkPreset, { text: string; color: string; rotate: number; fontSize: number; fontWeight: string }> = {\n confidential: { text: \"CONFIDENTIAL\", color: \"rgba(220, 38, 38, 0.15)\", rotate: -22, fontSize: 16, fontWeight: \"bold\" },\n draft: { text: \"DRAFT\", color: \"rgba(59, 130, 246, 0.15)\", rotate: -22, fontSize: 18, fontWeight: \"bold\" },\n sample: { text: \"SAMPLE\", color: \"rgba(168, 85, 247, 0.15)\", rotate: -22, fontSize: 16, fontWeight: \"600\" },\n copyright: { text: \"© Copyright\", color: \"rgba(0, 0, 0, 0.1)\", rotate: 0, fontSize: 12, fontWeight: \"normal\" },\n doNotCopy: { text: \"DO NOT COPY\", color: \"rgba(234, 88, 12, 0.15)\", rotate: -22, fontSize: 14, fontWeight: \"bold\" },\n internal: { text: \"INTERNAL USE ONLY\", color: \"rgba(156, 163, 175, 0.15)\", rotate: -22, fontSize: 13, fontWeight: \"600\" },\n};\n\nfunction useWatermarkDataURL(opts: {\n text?: string | string[];\n image?: string;\n width?: number;\n height?: number;\n gapX?: number;\n gapY?: number;\n rotate?: number;\n fontSize?: number;\n fontFamily?: string;\n fontWeight?: number | string;\n fontStyle?: \"normal\" | \"italic\";\n color?: string;\n gradient?: string;\n pattern?: WatermarkPattern;\n textShadow?: boolean;\n shadowColor?: string;\n}) {\n const [url, setUrl] = React.useState<string | null>(null);\n React.useEffect(() => {\n let cancelled = false;\n\n const text = opts.text;\n const image = opts.image;\n const width = opts.width ?? 180;\n const height = opts.height ?? 100;\n const gapX = opts.gapX ?? 16;\n const gapY = opts.gapY ?? 16;\n const rotate = opts.rotate ?? -22;\n const fontSize = opts.fontSize ?? 14;\n const fontFamily = opts.fontFamily ?? \"ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial\";\n const fontWeight = opts.fontWeight ?? \"normal\";\n const fontStyle = opts.fontStyle ?? \"normal\";\n const color = opts.color ?? \"rgba(0,0,0,0.15)\";\n const gradient = opts.gradient;\n const pattern = opts.pattern ?? \"diagonal\";\n\n const tileW = width + gapX;\n const tileH = height + gapY;\n const canvas = document.createElement(\"canvas\");\n canvas.width = tileW;\n canvas.height = tileH;\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) return;\n\n const drawText = () => {\n ctx.clearRect(0, 0, tileW, tileH);\n ctx.save();\n\n // Grid pattern: no translate, draw at fixed positions\n if (pattern === \"grid\") {\n ctx.translate(width / 2, height / 2);\n } else {\n ctx.translate(tileW / 2, tileH / 2);\n }\n\n // Apply rotation based on pattern\n if (pattern === \"diagonal\") {\n ctx.rotate((rotate * Math.PI) / 180);\n } else if (pattern === \"straight\" || pattern === \"grid\") {\n // No rotation for straight and grid patterns\n }\n\n if (text) {\n const textLines = Array.isArray(text) ? text : [text];\n ctx.font = `${fontStyle} ${fontWeight} ${fontSize}px ${fontFamily}`;\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"middle\";\n\n // Add text shadow if enabled\n if (opts.textShadow) {\n const shadowCol = opts.shadowColor || \"rgba(255, 255, 255, 0.5)\";\n ctx.shadowColor = shadowCol;\n ctx.shadowBlur = 8;\n ctx.shadowOffsetX = 0;\n ctx.shadowOffsetY = 0;\n }\n\n // Use gradient if provided\n if (gradient) {\n const splitStops = (input: string) => {\n const s = input.trim();\n // Handle CSS like: linear-gradient(to bottom, rgba(...), #fff)\n let inside = s;\n const lg = s.toLowerCase();\n if (lg.startsWith(\"linear-gradient\")) {\n const start = s.indexOf(\"(\");\n const end = s.lastIndexOf(\")\");\n if (start >= 0 && end > start) inside = s.slice(start + 1, end);\n }\n const parts: string[] = [];\n let buf = \"\";\n let depth = 0;\n for (let i = 0; i < inside.length; i++) {\n const ch = inside[i];\n if (ch === \"(\") depth++;\n if (ch === \")\") depth = Math.max(0, depth - 1);\n if (ch === \",\" && depth === 0) {\n parts.push(buf.trim());\n buf = \"\";\n } else {\n buf += ch;\n }\n }\n if (buf.trim()) parts.push(buf.trim());\n // If first looks like direction/angle, drop it\n if (parts.length > 0) {\n const first = parts[0].toLowerCase();\n if (first.startsWith(\"to \") || first.endsWith(\"deg\") || first.endsWith(\"rad\")) {\n parts.shift();\n }\n }\n return parts.filter(Boolean);\n };\n\n const stops = splitStops(gradient);\n const gradientObj = ctx.createLinearGradient(0, -height / 2, 0, height / 2);\n stops.forEach((c, i) => {\n // Support optional \"color percent\" syntax\n const tokens = c.split(/\\s+/).filter(Boolean);\n const col = tokens[0];\n const pos = tokens[1] ? parseFloat(tokens[1]) / 100 : i / Math.max(1, (stops.length - 1));\n try {\n gradientObj.addColorStop(isFinite(pos) ? Math.min(Math.max(pos, 0), 1) : i / Math.max(1, (stops.length - 1)), col);\n } catch {\n // Fallback: ignore invalid stop\n }\n });\n ctx.fillStyle = gradientObj;\n } else {\n ctx.fillStyle = color;\n }\n\n // Draw multi-line text\n const lineHeight = fontSize * 1.2;\n const totalHeight = textLines.length * lineHeight;\n const startY = -(totalHeight / 2) + lineHeight / 2;\n\n textLines.forEach((line, index) => {\n const y = startY + index * lineHeight;\n ctx.fillText(line, 0, y, width);\n });\n }\n ctx.restore();\n if (!cancelled) setUrl(canvas.toDataURL());\n };\n\n if (image) {\n const img = new Image();\n img.crossOrigin = \"anonymous\";\n img.onload = () => {\n ctx!.clearRect(0, 0, tileW, tileH);\n ctx!.save();\n ctx!.translate(tileW / 2, tileH / 2);\n ctx!.rotate((rotate * Math.PI) / 180);\n const drawW = width;\n const drawH = height;\n ctx!.drawImage(img, -drawW / 2, -drawH / 2, drawW, drawH);\n ctx!.restore();\n if (!cancelled) setUrl(canvas.toDataURL());\n };\n img.onerror = drawText;\n img.src = image;\n } else {\n drawText();\n }\n\n return () => {\n cancelled = true;\n };\n }, [opts.text, opts.image, opts.width, opts.height, opts.gapX, opts.gapY, opts.rotate, opts.fontSize, opts.fontFamily, opts.fontWeight, opts.fontStyle, opts.color, opts.gradient, opts.pattern, opts.textShadow, opts.shadowColor]);\n\n return url;\n}\n\n// Animation variants CSS classes\nconst getAnimationClass = (variant: AnimationVariant, visible: boolean) => {\n if (variant === \"none\") return \"\";\n\n const animations = {\n fade: visible ? \"animate-in fade-in duration-300\" : \"animate-out fade-out duration-300\",\n slide: visible ? \"animate-in slide-in-from-top duration-500\" : \"animate-out slide-out-to-top duration-500\",\n scale: visible ? \"animate-in zoom-in duration-300\" : \"animate-out zoom-out duration-300\",\n pulse: visible ? \"animate-pulse\" : \"opacity-0\",\n };\n\n return animations[variant] || \"\";\n};\n\nconst Watermark: React.FC<WatermarkProps> = ({\n text: textProp,\n image,\n width = 180,\n height = 100,\n gapX = 16,\n gapY = 16,\n rotate: rotateProp,\n fontSize: fontSizeProp,\n fontFamily = \"ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial\",\n fontWeight: fontWeightProp,\n fontStyle: fontStyleProp,\n color: colorProp,\n gradient,\n opacity = 1,\n offsetLeft = 0,\n offsetTop = 0,\n zIndex = 40,\n fullPage = false,\n preset,\n pattern = \"diagonal\",\n interactive = false,\n animate = false,\n animationVariant = \"fade\",\n blur = false,\n blurAmount = 4,\n textShadow = false,\n shadowColor,\n darkMode = false,\n overlayClassName,\n ariaLabel,\n className,\n style,\n children,\n ...rest\n}) => {\n const [visible, setVisible] = React.useState(true);\n const [isDark, setIsDark] = React.useState(false);\n\n // Detect dark mode\n React.useEffect(() => {\n if (!darkMode) return;\n\n const checkDarkMode = () => {\n const isDarkMode =\n document.documentElement.classList.contains(\"dark\") ||\n window.matchMedia(\"(prefers-color-scheme: dark)\").matches;\n setIsDark(isDarkMode);\n };\n\n checkDarkMode();\n\n // Listen for theme changes\n const observer = new MutationObserver(checkDarkMode);\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: [\"class\"],\n });\n\n const mediaQuery = window.matchMedia(\"(prefers-color-scheme: dark)\");\n mediaQuery.addEventListener(\"change\", checkDarkMode);\n\n return () => {\n observer.disconnect();\n mediaQuery.removeEventListener(\"change\", checkDarkMode);\n };\n }, [darkMode]);\n\n // Apply preset if provided\n const presetConfig = preset ? PRESETS[preset] : null;\n const text = textProp ?? presetConfig?.text;\n const color = colorProp ?? presetConfig?.color ?? \"rgba(0,0,0,0.15)\";\n const rotate = rotateProp ?? presetConfig?.rotate ?? -22;\n const fontSize = fontSizeProp ?? presetConfig?.fontSize ?? 14;\n const fontWeight = fontWeightProp ?? presetConfig?.fontWeight ?? \"normal\";\n const fontStyle = fontStyleProp ?? \"normal\";\n\n // Adjust opacity for dark mode\n const finalOpacity = darkMode && isDark ? opacity * 1.3 : opacity;\n\n const dataURL = useWatermarkDataURL({\n text,\n image,\n width,\n height,\n gapX,\n gapY,\n rotate,\n fontSize,\n fontFamily,\n fontWeight,\n fontStyle,\n color,\n gradient,\n pattern,\n textShadow,\n shadowColor,\n });\n\n const overlayStyle: React.CSSProperties = {\n position: fullPage ? (\"fixed\" as const) : (\"absolute\" as const),\n top: 0,\n left: 0,\n zIndex,\n opacity: visible ? finalOpacity : 0,\n backgroundRepeat: \"repeat\",\n backgroundPosition: `${offsetLeft}px ${offsetTop}px`,\n transition: animate && animationVariant === \"fade\" ? \"opacity 0.3s ease\" : undefined,\n };\n if (fullPage) {\n (overlayStyle as any).right = 0;\n (overlayStyle as any).bottom = 0;\n } else {\n overlayStyle.width = \"100%\";\n overlayStyle.height = \"100%\";\n }\n if (dataURL) overlayStyle.backgroundImage = `url(${dataURL})`;\n\n const animationClass = animate ? getAnimationClass(animationVariant, visible) : \"\";\n const blurClass = blur ? `backdrop-blur-[${blurAmount}px]` : \"\";\n\n const overlay = (\n <div\n role={interactive ? \"button\" : undefined}\n aria-label={ariaLabel || (interactive ? \"Toggle watermark visibility\" : \"Watermark overlay\")}\n aria-hidden={!interactive}\n tabIndex={interactive ? 0 : undefined}\n className={cn(\n interactive ? \"cursor-pointer\" : \"pointer-events-none\",\n blurClass,\n animationClass,\n overlayClassName\n )}\n style={overlayStyle}\n onClick={interactive ? () => setVisible(!visible) : undefined}\n onKeyDown={\n interactive\n ? (e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n setVisible(!visible);\n }\n }\n : undefined\n }\n />\n );\n\n if (fullPage) {\n return (\n <>\n {children}\n {typeof window !== \"undefined\" ? createPortal(overlay, document.body) : null}\n </>\n );\n }\n\n return (\n <div className={cn(\"relative\", className)} style={style} {...rest}>\n {children}\n {overlay}\n </div>\n );\n};\n\nexport default Watermark;\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"@/lib/utils/cn\";\nimport { ChevronDown } from \"lucide-react\";\n\ntype Align = \"left\" | \"right\" | \"alternate\";\ntype Variant = \"default\" | \"outlined\" | \"card\" | \"minimal\" | \"modern\" | \"gradient\";\ntype Size = \"sm\" | \"md\" | \"lg\" | \"xl\";\ntype Mode = \"vertical\" | \"horizontal\";\ntype LineStyle = \"solid\" | \"dashed\" | \"dotted\";\n\nexport interface TimelineProps extends React.HTMLAttributes<HTMLDivElement> {\n align?: Align;\n variant?: Variant;\n size?: Size;\n mode?: Mode;\n lineColor?: string;\n lineStyle?: LineStyle;\n items?: TimelineItemProps[];\n itemClassName?: string;\n /** Animate items on mount */\n animate?: boolean;\n /** Compact spacing */\n dense?: boolean;\n /** Show connecting line */\n showLine?: boolean;\n}\n\nexport interface TimelineItemProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'> {\n title?: React.ReactNode;\n description?: React.ReactNode;\n time?: React.ReactNode;\n icon?: React.ComponentType<{ className?: string }>;\n status?: \"default\" | \"primary\" | \"success\" | \"warning\" | \"error\" | \"info\";\n // Override dot and line color\n color?: string;\n // Mark current/active step\n active?: boolean;\n /** Custom dot content */\n dot?: React.ReactNode;\n /** Make item collapsible */\n collapsible?: boolean;\n /** Expanded state for collapsible */\n expanded?: boolean;\n /** Callback when expanded state changes */\n onExpandChange?: (expanded: boolean) => void;\n /** Content to show when expanded */\n expandContent?: React.ReactNode;\n /** Custom badge/tag */\n badge?: React.ReactNode;\n}\n\nconst SIZE_STYLE: Record<Size, { dot: string; iconDot: string; padY: string; densePadY: string; title: string; desc: string; time: string; icon: string }> = {\n sm: { dot: \"h-2.5 w-2.5\", iconDot: \"h-6 w-6\", padY: \"py-3\", densePadY: \"py-2\", title: \"text-sm\", desc: \"text-xs\", time: \"text-[11px]\", icon: \"h-3.5 w-3.5\" },\n md: { dot: \"h-3 w-3\", iconDot: \"h-8 w-8\", padY: \"py-4\", densePadY: \"py-2.5\", title: \"text-base\", desc: \"text-sm\", time: \"text-xs\", icon: \"h-4 w-4\" },\n lg: { dot: \"h-3.5 w-3.5\", iconDot: \"h-10 w-10\", padY: \"py-5\", densePadY: \"py-3\", title: \"text-lg\", desc: \"text-sm\", time: \"text-xs\", icon: \"h-5 w-5\" },\n xl: { dot: \"h-4 w-4\", iconDot: \"h-12 w-12\", padY: \"py-6\", densePadY: \"py-3.5\", title: \"text-xl\", desc: \"text-base\", time: \"text-sm\", icon: \"h-6 w-6\" },\n};\n\nconst STATUS_COLOR: Record<NonNullable<TimelineItemProps[\"status\"]>, string> = {\n default: \"bg-muted/60\",\n primary: \"bg-primary\",\n success: \"bg-green-500\",\n warning: \"bg-yellow-500\",\n error: \"bg-red-500\",\n info: \"bg-blue-500\",\n};\n\nconst TimelineContext = React.createContext<{\n align: Align;\n variant: Variant;\n size: Size;\n mode: Mode;\n lineColor?: string;\n lineStyle: LineStyle;\n itemClassName?: string;\n animate: boolean;\n dense: boolean;\n showLine: boolean;\n} | null>(null);\n\nconst LINE_STYLE_MAP: Record<LineStyle, string> = {\n solid: \"border-solid\",\n dashed: \"border-dashed\",\n dotted: \"border-dotted\",\n};\n\nconst Marker: React.FC<{\n index: number;\n last: boolean;\n size: Size;\n color?: string;\n status?: TimelineItemProps[\"status\"];\n lineColor?: string;\n lineStyle: LineStyle;\n active?: boolean;\n dot?: React.ReactNode;\n icon?: React.ComponentType<{ className?: string }>;\n showLine: boolean;\n}> = ({ index, last, size, color, status = \"default\", lineColor, lineStyle, active, dot, icon: Icon, showLine }) => {\n const sz = SIZE_STYLE[size];\n const dotColor = color ? `background:${color}` : undefined;\n const cls = color ? undefined : STATUS_COLOR[status];\n\n return (\n <div className=\"flex flex-col items-center\">\n {/* Dot */}\n {dot ? (\n <div className=\"flex items-center justify-center\">{dot}</div>\n ) : Icon ? (\n <div\n className={cn(\"rounded-full ring-2 ring-background flex items-center justify-center\", sz.iconDot, cls, active && \"ring-primary/40 ring-4\")}\n style={dotColor ? ({ background: color } as React.CSSProperties) : undefined}\n >\n <Icon className={cn(\"text-white\", sz.icon)} />\n </div>\n ) : (\n <div\n className={cn(\"rounded-full ring-2 ring-background\", sz.dot, cls, active && \"ring-primary/40 ring-4 scale-125\")}\n style={dotColor ? ({ background: color } as React.CSSProperties) : undefined}\n />\n )}\n {/* Line */}\n {!last && showLine && (\n <div\n className={cn(\"flex-1 border-l-2\", LINE_STYLE_MAP[lineStyle])}\n style={{ borderColor: lineColor || \"hsl(var(--border))\" }}\n />\n )}\n </div>\n );\n};\n\nconst TimelineRoot = React.forwardRef<HTMLDivElement, TimelineProps>(\n (\n {\n align = \"left\",\n variant = \"default\",\n size = \"md\",\n mode = \"vertical\",\n lineColor,\n lineStyle = \"solid\",\n items,\n itemClassName,\n animate = false,\n dense = false,\n showLine = true,\n className,\n children,\n ...rest\n },\n ref\n ) => {\n const content = items\n ? items.map((it, i) => (\n <TimelineItem key={i} {...it} className={cn(itemClassName, it.className)} data-index={i} data-last={i === (items?.length ?? 0) - 1} />\n ))\n : children;\n\n return (\n <TimelineContext.Provider value={{ align, variant, size, mode, lineColor, lineStyle, itemClassName, animate, dense, showLine }}>\n <div\n ref={ref}\n className={cn(\n \"relative\",\n mode === \"horizontal\" && \"flex gap-4 overflow-x-auto\",\n mode === \"vertical\" && \"space-y-0\",\n className\n )}\n {...rest}\n >\n {mode === \"vertical\" ? <div className=\"space-y-0\">{content}</div> : content}\n </div>\n </TimelineContext.Provider>\n );\n }\n);\n\nTimelineRoot.displayName = \"Timeline\";\n\nexport const TimelineItem = React.forwardRef<HTMLDivElement, TimelineItemProps>(\n (\n {\n title,\n description,\n time,\n icon: Icon,\n status = \"default\",\n color,\n active = false,\n dot,\n collapsible = false,\n expanded: controlledExpanded,\n onExpandChange,\n expandContent,\n badge,\n className,\n children,\n ...rest\n },\n ref\n ) => {\n const ctx = React.useContext(TimelineContext)!;\n const idx = (rest as any)[\"data-index\"] as number | undefined;\n const isLast = Boolean((rest as any)[\"data-last\"]);\n const sz = SIZE_STYLE[ctx.size];\n const [internalExpanded, setInternalExpanded] = React.useState(false);\n const isExpanded = controlledExpanded !== undefined ? controlledExpanded : internalExpanded;\n\n const toggleExpanded = () => {\n const newExpanded = !isExpanded;\n if (onExpandChange) {\n onExpandChange(newExpanded);\n } else {\n setInternalExpanded(newExpanded);\n }\n };\n\n const padding = ctx.dense ? sz.densePadY : sz.padY;\n\n // Variant styles for content box\n const variantClasses = {\n default: \"\",\n outlined: \"rounded-lg border border-border bg-card shadow-sm px-4 py-3\",\n card: \"rounded-xl border border-border bg-card shadow-md px-5 py-4\",\n minimal: \"border-l-2 pl-4 py-2\",\n modern: \"rounded-lg bg-linear-to-r from-card to-muted/20 border border-border/50 px-5 py-4 backdrop-blur-sm\",\n gradient: \"rounded-xl bg-linear-to-br from-primary/10 via-card to-accent/10 border border-primary/20 px-5 py-4 shadow-lg\",\n };\n\n const contentBox = (\n <div className={cn(\"min-w-0 flex-1\", variantClasses[ctx.variant])}>\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"flex-1 min-w-0\">\n {title && (\n <div className=\"flex items-center gap-2\">\n <div className={cn(\"font-semibold text-foreground\", sz.title)}>{title}</div>\n {badge && <span className=\"px-2 py-0.5 rounded-full text-[10px] font-medium bg-primary/10 text-primary\">{badge}</span>}\n </div>\n )}\n {description && <div className={cn(\"text-muted-foreground mt-1\", sz.desc)}>{description}</div>}\n {children && <div className=\"mt-2\">{children}</div>}\n </div>\n {collapsible && (\n <button\n type=\"button\"\n onClick={toggleExpanded}\n className={cn(\"text-muted-foreground hover:text-foreground transition-transform p-1\", isExpanded && \"rotate-180\")}\n >\n <ChevronDown className=\"h-4 w-4\" />\n </button>\n )}\n </div>\n {time && <div className={cn(\"mt-2 text-muted-foreground flex items-center gap-1\", sz.time)}>{time}</div>}\n {/* Expanded Content */}\n {collapsible && isExpanded && expandContent && (\n <div className=\"mt-3 pt-3 border-t border-border/50 text-sm\">{expandContent}</div>\n )}\n </div>\n );\n\n const markerWidth = Icon || dot ? \"w-auto\" : \"w-6\";\n\n const leftSide = (\n <div className={cn(\"flex items-stretch gap-4\", padding, ctx.animate && \"animate-in slide-in-from-left duration-500\")} style={{ animationDelay: ctx.animate ? `${(idx ?? 0) * 100}ms` : undefined }}>\n <div className={cn(\"shrink-0 flex items-stretch\", markerWidth)}>\n <Marker index={idx ?? 0} last={isLast} size={ctx.size} color={color} status={status} lineColor={ctx.lineColor} lineStyle={ctx.lineStyle} active={active} dot={dot} icon={Icon} showLine={ctx.showLine} />\n </div>\n <div className=\"flex-1\">{contentBox}</div>\n </div>\n );\n\n const rightSide = (\n <div className={cn(\"flex items-stretch gap-4\", padding, ctx.animate && \"animate-in slide-in-from-right duration-500\")} style={{ animationDelay: ctx.animate ? `${(idx ?? 0) * 100}ms` : undefined }}>\n <div className=\"flex-1 flex justify-end\">{contentBox}</div>\n <div className={cn(\"shrink-0 flex items-stretch\", markerWidth)}>\n <Marker index={idx ?? 0} last={isLast} size={ctx.size} color={color} status={status} lineColor={ctx.lineColor} lineStyle={ctx.lineStyle} active={active} dot={dot} icon={Icon} showLine={ctx.showLine} />\n </div>\n </div>\n );\n\n const horizontalItem = (\n <div\n className={cn(\n \"flex flex-col items-center gap-2 min-w-[200px]\",\n ctx.animate && \"animate-in fade-in-50 zoom-in-95 duration-500\"\n )}\n style={{ animationDelay: ctx.animate ? `${(idx ?? 0) * 100}ms` : undefined }}\n >\n <Marker index={idx ?? 0} last={isLast} size={ctx.size} color={color} status={status} lineColor={ctx.lineColor} lineStyle={ctx.lineStyle} active={active} dot={dot} icon={Icon} showLine={false} />\n {!isLast && ctx.showLine && (\n <div className={cn(\"h-px w-full border-t-2\", LINE_STYLE_MAP[ctx.lineStyle])} style={{ borderColor: ctx.lineColor || \"hsl(var(--border))\" }} />\n )}\n {contentBox}\n </div>\n );\n\n if (ctx.mode === \"horizontal\") {\n return (\n <div ref={ref} className={cn(\"relative\", className)} {...rest}>\n {horizontalItem}\n </div>\n );\n }\n\n let row = leftSide;\n if (ctx.align === \"right\") row = rightSide;\n if (ctx.align === \"alternate\") row = (idx ?? 0) % 2 === 0 ? leftSide : rightSide;\n\n return (\n <div ref={ref} className={cn(\"relative\", className)} {...rest}>\n {row}\n </div>\n );\n }\n);\n\nTimelineItem.displayName = \"Timeline.Item\";\n\nconst Timeline = Object.assign(TimelineRoot, { Item: TimelineItem });\n\nexport default Timeline;\n","\"use client\";\n\nimport * as React from \"react\";\nimport { Popover } from \"./Popover\";\nimport Input from \"./Input\";\nimport { Slider } from \"./Slider\";\nimport { cn } from \"@/lib/utils/cn\";\nimport { Pipette, X, Copy, Check, Palette, History } from \"lucide-react\";\n\ntype OutputFormat = \"hex\" | \"rgba\" | \"hsl\" | \"hsla\";\ntype ColorPickerSize = \"sm\" | \"md\" | \"lg\";\ntype ColorPickerVariant = \"default\" | \"compact\" | \"full\" | \"minimal\";\n\nexport interface ColorPickerProps extends Omit<React.HTMLAttributes<HTMLDivElement>, \"onChange\"> {\n value?: string;\n defaultValue?: string;\n onChange?: (value: string) => void;\n disabled?: boolean;\n withAlpha?: boolean;\n format?: OutputFormat;\n presets?: string[];\n /** Class for the trigger button */\n triggerClassName?: string;\n /** Class for the popover content panel */\n contentClassName?: string;\n /** Show a clear button to reset to empty */\n clearable?: boolean;\n /** Show copy to clipboard button */\n copyable?: boolean;\n /** Size variant of the picker */\n size?: ColorPickerSize;\n /** Visual variant of the picker */\n variant?: ColorPickerVariant;\n /** Show recent colors history */\n showRecent?: boolean;\n /** Show color harmony suggestions */\n showHarmony?: boolean;\n /** Max recent colors to remember */\n maxRecent?: number;\n}\n\ntype RGBA = { r: number; g: number; b: number; a: number };\ntype HSLA = { h: number; s: number; l: number; a: number };\n\nconst clamp = (n: number, min: number, max: number) => Math.max(min, Math.min(max, n));\n\nfunction hexToRgb(hex: string): { r: number; g: number; b: number } | null {\n const str = hex.replace(/^#/, \"\").trim();\n if (str.length === 3) {\n const r = parseInt(str[0] + str[0], 16);\n const g = parseInt(str[1] + str[1], 16);\n const b = parseInt(str[2] + str[2], 16);\n return { r, g, b };\n }\n if (str.length === 6) {\n const r = parseInt(str.slice(0, 2), 16);\n const g = parseInt(str.slice(2, 4), 16);\n const b = parseInt(str.slice(4, 6), 16);\n return { r, g, b };\n }\n return null;\n}\n\nfunction rgbToHex(r: number, g: number, b: number) {\n return `#${[r, g, b]\n .map((v) => clamp(Math.round(v), 0, 255).toString(16).padStart(2, \"0\"))\n .join(\"\")}`;\n}\n\nfunction rgbToHsl(r: number, g: number, b: number): { h: number; s: number; l: number } {\n r /= 255;\n g /= 255;\n b /= 255;\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n let h = 0,\n s = 0;\n const l = (max + min) / 2;\n\n if (max !== min) {\n const d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n switch (max) {\n case r:\n h = ((g - b) / d + (g < b ? 6 : 0)) / 6;\n break;\n case g:\n h = ((b - r) / d + 2) / 6;\n break;\n case b:\n h = ((r - g) / d + 4) / 6;\n break;\n }\n }\n return { h: h * 360, s: s * 100, l: l * 100 };\n}\n\nfunction hslToRgb(h: number, s: number, l: number): { r: number; g: number; b: number } {\n h /= 360;\n s /= 100;\n l /= 100;\n let r, g, b;\n\n if (s === 0) {\n r = g = b = l;\n } else {\n const hue2rgb = (p: number, q: number, t: number) => {\n if (t < 0) t += 1;\n if (t > 1) t -= 1;\n if (t < 1 / 6) return p + (q - p) * 6 * t;\n if (t < 1 / 2) return q;\n if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;\n return p;\n };\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n const p = 2 * l - q;\n r = hue2rgb(p, q, h + 1 / 3);\n g = hue2rgb(p, q, h);\n b = hue2rgb(p, q, h - 1 / 3);\n }\n return { r: Math.round(r * 255), g: Math.round(g * 255), b: Math.round(b * 255) };\n}\n\nfunction parseAnyColor(input?: string): RGBA | null {\n if (!input) return null;\n const s = input.trim();\n if (s.startsWith(\"#\")) {\n const rgb = hexToRgb(s);\n if (!rgb) return null;\n return { ...rgb, a: 1 };\n }\n // rgba(r,g,b,a)\n const rgbaMatch = s.match(/rgba?\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})(?:\\s*,\\s*(\\d*\\.?\\d+))?\\s*\\)/i);\n if (rgbaMatch) {\n const r = clamp(parseInt(rgbaMatch[1], 10), 0, 255);\n const g = clamp(parseInt(rgbaMatch[2], 10), 0, 255);\n const b = clamp(parseInt(rgbaMatch[3], 10), 0, 255);\n const a = rgbaMatch[4] != null ? clamp(parseFloat(rgbaMatch[4]), 0, 1) : 1;\n return { r, g, b, a };\n }\n // hsla(h,s%,l%,a)\n const hslaMatch = s.match(/hsla?\\(\\s*(\\d{1,3}(?:\\.\\d+)?)\\s*,?\\s*(\\d{1,3}(?:\\.\\d+)?)%?\\s*,?\\s*(\\d{1,3}(?:\\.\\d+)?)%?(?:\\s*,?\\s*(\\d*\\.?\\d+))?\\s*\\)/i);\n if (hslaMatch) {\n const h = parseFloat(hslaMatch[1]);\n const sl = parseFloat(hslaMatch[2]);\n const l = parseFloat(hslaMatch[3]);\n const a = hslaMatch[4] != null ? clamp(parseFloat(hslaMatch[4]), 0, 1) : 1;\n const rgb = hslToRgb(h, sl, l);\n return { ...rgb, a };\n }\n return null;\n}\n\nfunction formatOutput({ r, g, b, a }: RGBA, withAlpha: boolean, format: OutputFormat) {\n if (format === \"hex\" && (!withAlpha || a === 1)) {\n return rgbToHex(r, g, b);\n }\n if (format === \"hsl\" || format === \"hsla\") {\n const hsl = rgbToHsl(r, g, b);\n if (format === \"hsla\" || withAlpha) {\n return `hsla(${Math.round(hsl.h)}, ${Math.round(hsl.s)}%, ${Math.round(hsl.l)}%, ${clamp(a, 0, 1)})`;\n }\n return `hsl(${Math.round(hsl.h)}, ${Math.round(hsl.s)}%, ${Math.round(hsl.l)}%)`;\n }\n if (withAlpha || a !== 1) {\n return `rgba(${clamp(r, 0, 255)}, ${clamp(g, 0, 255)}, ${clamp(b, 0, 255)}, ${clamp(a, 0, 1)})`;\n }\n return rgbToHex(r, g, b);\n}\n\n// Generate color harmony\nfunction getColorHarmony(rgba: RGBA): { complementary: string; triadic: string[]; analogous: string[] } {\n const hsl = rgbToHsl(rgba.r, rgba.g, rgba.b);\n\n // Complementary: opposite on color wheel\n const compH = (hsl.h + 180) % 360;\n const compRgb = hslToRgb(compH, hsl.s, hsl.l);\n\n // Triadic: 120 degrees apart\n const tri1H = (hsl.h + 120) % 360;\n const tri2H = (hsl.h + 240) % 360;\n const tri1Rgb = hslToRgb(tri1H, hsl.s, hsl.l);\n const tri2Rgb = hslToRgb(tri2H, hsl.s, hsl.l);\n\n // Analogous: 30 degrees apart\n const ana1H = (hsl.h + 30) % 360;\n const ana2H = (hsl.h - 30 + 360) % 360;\n const ana1Rgb = hslToRgb(ana1H, hsl.s, hsl.l);\n const ana2Rgb = hslToRgb(ana2H, hsl.s, hsl.l);\n\n return {\n complementary: rgbToHex(compRgb.r, compRgb.g, compRgb.b),\n triadic: [rgbToHex(tri1Rgb.r, tri1Rgb.g, tri1Rgb.b), rgbToHex(tri2Rgb.r, tri2Rgb.g, tri2Rgb.b)],\n analogous: [rgbToHex(ana1Rgb.r, ana1Rgb.g, ana1Rgb.b), rgbToHex(ana2Rgb.r, ana2Rgb.g, ana2Rgb.b)],\n };\n}\n\nconst DEFAULT_PRESETS = [\n \"#000000\", \"#ffffff\", \"#f87171\", \"#fb923c\", \"#fbbf24\", \"#34d399\", \"#60a5fa\", \"#a78bfa\", \"#f472b6\",\n \"#111827\", \"#4b5563\", \"#9ca3af\", \"#d1d5db\", \"#e5e7eb\", \"#f3f4f6\",\n];\n\nconst Swatch: React.FC<{ color: string; onClick?: () => void; ariaLabel?: string; size?: \"sm\" | \"md\" | \"lg\" }> = ({\n color,\n onClick,\n ariaLabel,\n size = \"md\"\n}) => {\n const sizeClasses = {\n sm: \"h-5 w-5\",\n md: \"h-6 w-6\",\n lg: \"h-8 w-8\",\n };\n return (\n <button\n type=\"button\"\n className={cn(\n sizeClasses[size],\n \"rounded-md border border-border shadow-sm hover:scale-110 transition-transform\",\n onClick && \"cursor-pointer\"\n )}\n style={{ backgroundColor: color }}\n onClick={onClick}\n aria-label={ariaLabel}\n />\n );\n};\n\nexport default function ColorPicker({\n value,\n defaultValue = \"#4f46e5\",\n onChange,\n disabled = false,\n withAlpha = false,\n format = \"hex\",\n presets,\n className,\n triggerClassName,\n contentClassName,\n clearable = false,\n copyable = true,\n size = \"md\",\n variant = \"default\",\n showRecent = false,\n showHarmony = false,\n maxRecent = 8,\n ...rest\n}: ColorPickerProps) {\n const isControlled = value !== undefined;\n const initial = parseAnyColor(isControlled ? value! : defaultValue) || { r: 79, g: 70, b: 229, a: 1 };\n const [rgba, setRgba] = React.useState<RGBA>(initial);\n const [open, setOpen] = React.useState(false);\n const [text, setText] = React.useState(() => formatOutput(initial, withAlpha, format));\n const [copied, setCopied] = React.useState(false);\n const [recentColors, setRecentColors] = React.useState<string[]>([]);\n\n React.useEffect(() => {\n if (isControlled) {\n const parsed = parseAnyColor(value);\n if (parsed) {\n setRgba(parsed);\n setText(formatOutput(parsed, withAlpha, format));\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [value]);\n\n const emit = (next: RGBA) => {\n const out = formatOutput(next, withAlpha, format);\n if (!isControlled) setText(out);\n onChange?.(out);\n\n // Add to recent colors\n if (showRecent) {\n const hexColor = rgbToHex(next.r, next.g, next.b);\n setRecentColors((prev) => {\n const filtered = prev.filter((c) => c !== hexColor);\n return [hexColor, ...filtered].slice(0, maxRecent);\n });\n }\n };\n\n const copyToClipboard = async () => {\n try {\n await navigator.clipboard.writeText(text);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n } catch (err) {\n console.error(\"Failed to copy:\", err);\n }\n };\n\n const handleHexChange = (raw: string) => {\n setText(raw);\n const parsed = parseAnyColor(raw);\n if (parsed) {\n setRgba((prev) => ({ ...parsed, a: withAlpha ? parsed.a : 1 }));\n emit({ ...parsed, a: withAlpha ? parsed.a : 1 });\n }\n };\n\n const handleNativeChange: React.ChangeEventHandler<HTMLInputElement> = (e) => {\n const hex = e.target.value || \"#000000\";\n const rgb = hexToRgb(hex) || { r: 0, g: 0, b: 0 };\n const next = { ...rgba, ...rgb };\n setRgba(next);\n emit(next);\n };\n\n const setAlpha = (aPct: number) => {\n const a = clamp(aPct / 100, 0, 1);\n const next = { ...rgba, a };\n setRgba(next);\n emit(next);\n };\n\n const tryEyedropper = async () => {\n // @ts-ignore\n if (typeof window !== \"undefined\" && window.EyeDropper) {\n // @ts-ignore\n const eye = new window.EyeDropper();\n try {\n const res = await eye.open();\n const rgb = hexToRgb(res.sRGBHex);\n if (rgb) {\n const next = { r: rgb.r, g: rgb.g, b: rgb.b, a: rgba.a };\n setRgba(next);\n emit(next);\n }\n } catch {}\n }\n };\n\n const clear = () => {\n setText(\"\");\n const next = { r: 0, g: 0, b: 0, a: 0 };\n setRgba(next);\n onChange?.(\"\");\n };\n\n const swatches = presets && presets.length ? presets : DEFAULT_PRESETS;\n const hexForInput = rgbToHex(rgba.r, rgba.g, rgba.b);\n const alphaPct = Math.round(rgba.a * 100);\n const harmony = showHarmony ? getColorHarmony(rgba) : null;\n\n const sizeClasses = {\n sm: \"h-8 text-xs\",\n md: \"h-10 text-sm\",\n lg: \"h-12 text-base\",\n };\n\n const swatchSize = size === \"sm\" ? \"sm\" : size === \"lg\" ? \"lg\" : \"md\";\n\n const trigger = (\n <button\n type=\"button\"\n disabled={disabled}\n className={cn(\n \"w-full px-3 rounded-lg border border-input bg-background flex items-center justify-between\",\n sizeClasses[size],\n \"hover:border-accent-foreground/30 transition-colors\",\n disabled && \"opacity-50 cursor-not-allowed\",\n triggerClassName\n )}\n aria-label=\"Open color picker\"\n >\n <div className=\"flex items-center gap-2\">\n <span\n className={cn(\n \"rounded border border-border shadow-sm\",\n size === \"sm\" ? \"h-4 w-4\" : size === \"lg\" ? \"h-6 w-6\" : \"h-5 w-5\"\n )}\n style={{ backgroundColor: withAlpha ? `rgba(${rgba.r}, ${rgba.g}, ${rgba.b}, ${rgba.a})` : hexForInput }}\n />\n <span className=\"font-mono text-muted-foreground\">{text}</span>\n </div>\n <Pipette className={cn(size === \"sm\" ? \"w-3.5 h-3.5\" : size === \"lg\" ? \"w-5 h-5\" : \"w-4 h-4\", \"text-muted-foreground\")} />\n </button>\n );\n\n const contentWidthByVariant = {\n minimal: 240,\n compact: 280,\n default: 320,\n full: 360,\n };\n\n return (\n <div className={cn(\"inline-block w-full\", className)} {...rest}>\n <Popover\n trigger={trigger}\n open={open}\n onOpenChange={setOpen}\n placement=\"bottom-start\"\n matchTriggerWidth={variant === \"minimal\"}\n contentWidth={contentWidthByVariant[variant]}\n contentClassName={cn(\"p-3 rounded-lg border border-border bg-card shadow-lg\", contentClassName)}\n >\n <div className=\"space-y-3\">\n {/* Native input + eyedropper + copy + clear */}\n {variant !== \"minimal\" && (\n <div className=\"flex items-center gap-2\">\n <input type=\"color\" value={hexForInput} onChange={handleNativeChange} className=\"h-9 w-9 rounded-md cursor-pointer border border-border\" />\n <button\n type=\"button\"\n onClick={tryEyedropper}\n className={cn(\"h-9 px-3 rounded-md border border-border text-xs hover:bg-accent/10 transition-colors flex items-center gap-1.5\")}\n >\n <Pipette className=\"w-3.5 h-3.5\" />\n {variant === \"full\" && \"Pick\"}\n </button>\n {copyable && (\n <button\n type=\"button\"\n onClick={copyToClipboard}\n className={cn(\n \"h-9 px-3 rounded-md border border-border text-xs hover:bg-accent/10 transition-colors flex items-center gap-1.5\",\n copied && \"bg-green-500/10 border-green-500/30\"\n )}\n >\n {copied ? <Check className=\"w-3.5 h-3.5 text-green-600\" /> : <Copy className=\"w-3.5 h-3.5\" />}\n {variant === \"full\" && (copied ? \"Copied!\" : \"Copy\")}\n </button>\n )}\n {clearable && (\n <button\n type=\"button\"\n onClick={clear}\n className=\"ml-auto h-9 px-2 rounded-md border border-border text-xs hover:bg-destructive/10 transition-colors flex items-center gap-1\"\n >\n <X className=\"w-3.5 h-3.5\" />\n {variant === \"full\" && \"Clear\"}\n </button>\n )}\n </div>\n )}\n\n {/* Color value input */}\n <div className=\"flex items-center gap-2\">\n <Input\n value={text}\n onChange={(e) => handleHexChange(e.target.value)}\n placeholder={\n format === \"hsl\" || format === \"hsla\"\n ? \"hsl(240, 82%, 59%)\"\n : withAlpha || format === \"rgba\"\n ? \"rgba(79,70,229,1)\"\n : \"#4f46e5\"\n }\n variant=\"outlined\"\n size=\"sm\"\n className=\"flex-1\"\n />\n {variant === \"minimal\" && copyable && (\n <button\n type=\"button\"\n onClick={copyToClipboard}\n className={cn(\n \"h-9 w-9 rounded-md border border-border hover:bg-accent/10 transition-colors flex items-center justify-center\",\n copied && \"bg-green-500/10 border-green-500/30\"\n )}\n >\n {copied ? <Check className=\"w-3.5 h-3.5 text-green-600\" /> : <Copy className=\"w-3.5 h-3.5\" />}\n </button>\n )}\n </div>\n\n {/* Alpha slider */}\n {withAlpha && (\n <div className=\"pt-1\">\n <Slider min={0} max={100} step={1} value={alphaPct} onChange={(v) => setAlpha(v)} label=\"Alpha\" showValue formatValue={(v) => `${v}%`} size=\"sm\" />\n </div>\n )}\n\n {/* Presets */}\n {variant !== \"minimal\" && (\n <div>\n <div className=\"text-xs font-medium text-muted-foreground mb-2 flex items-center gap-1.5\">\n <Palette className=\"w-3.5 h-3.5\" /> Presets\n </div>\n <div className=\"grid grid-cols-8 gap-2\">\n {swatches.map((c) => (\n <Swatch\n key={c}\n color={c}\n ariaLabel={c}\n size={swatchSize}\n onClick={() => {\n const rgb = hexToRgb(c)!;\n const next = { r: rgb.r, g: rgb.g, b: rgb.b, a: rgba.a };\n setRgba(next);\n emit(next);\n }}\n />\n ))}\n </div>\n </div>\n )}\n\n {/* Recent colors */}\n {showRecent && recentColors.length > 0 && (\n <div>\n <div className=\"text-xs font-medium text-muted-foreground mb-2 flex items-center gap-1.5\">\n <History className=\"w-3.5 h-3.5\" /> Recent\n </div>\n <div className=\"flex gap-2 flex-wrap\">\n {recentColors.map((c, i) => (\n <Swatch\n key={`${c}-${i}`}\n color={c}\n ariaLabel={c}\n size={swatchSize}\n onClick={() => {\n const rgb = hexToRgb(c)!;\n const next = { r: rgb.r, g: rgb.g, b: rgb.b, a: rgba.a };\n setRgba(next);\n emit(next);\n }}\n />\n ))}\n </div>\n </div>\n )}\n\n {/* Color Harmony */}\n {showHarmony && harmony && variant !== \"minimal\" && (\n <div>\n <div className=\"text-xs font-medium text-muted-foreground mb-2\">Harmony</div>\n <div className=\"space-y-2\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs text-muted-foreground w-24\">Complementary</span>\n <Swatch\n color={harmony.complementary}\n ariaLabel=\"Complementary\"\n size={swatchSize}\n onClick={() => {\n const rgb = hexToRgb(harmony.complementary)!;\n const next = { r: rgb.r, g: rgb.g, b: rgb.b, a: rgba.a };\n setRgba(next);\n emit(next);\n }}\n />\n <span className=\"text-xs font-mono text-muted-foreground\">{harmony.complementary}</span>\n </div>\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs text-muted-foreground w-24\">Triadic</span>\n <div className=\"flex gap-2\">\n {harmony.triadic.map((c) => (\n <Swatch\n key={c}\n color={c}\n ariaLabel={c}\n size={swatchSize}\n onClick={() => {\n const rgb = hexToRgb(c)!;\n const next = { r: rgb.r, g: rgb.g, b: rgb.b, a: rgba.a };\n setRgba(next);\n emit(next);\n }}\n />\n ))}\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs text-muted-foreground w-24\">Analogous</span>\n <div className=\"flex gap-2\">\n {harmony.analogous.map((c) => (\n <Swatch\n key={c}\n color={c}\n ariaLabel={c}\n size={swatchSize}\n onClick={() => {\n const rgb = hexToRgb(c)!;\n const next = { r: rgb.r, g: rgb.g, b: rgb.b, a: rgba.a };\n setRgba(next);\n emit(next);\n }}\n />\n ))}\n </div>\n </div>\n </div>\n </div>\n )}\n </div>\n </Popover>\n </div>\n );\n}\n","import React, { useId } from \"react\";\nimport { cn } from \"@/lib/utils/cn\";\n\ntype Breakpoint = \"sm\" | \"md\" | \"lg\" | \"xl\" | \"2xl\";\n\ntype ResponsiveConfig = Partial<{\n columns: number | string;\n rows: number | string;\n minColumnWidth: number | string;\n gap: number | string;\n gapX: number | string;\n gapY: number | string;\n}>;\n\ntype GridVariant = \"default\" | \"bordered\" | \"card\" | \"flat\" | \"glass\";\ntype GridAutoFlow = \"row\" | \"column\" | \"row dense\" | \"column dense\";\n\nexport interface GridProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Number of columns or full template string. Default: 12 (1fr each). */\n columns?: number | string;\n /** Number of rows or full template string. */\n rows?: number | string;\n /** Overall gap (shorthand). */\n gap?: number | string;\n /** Horizontal gap. */\n gapX?: number | string;\n /** Vertical gap. */\n gapY?: number | string;\n /** Auto rows value (e.g. 'minmax(100px, auto)'). */\n autoRows?: string;\n /** Auto columns value (e.g. 'minmax(100px, 1fr)'). */\n autoColumns?: string;\n /** Grid auto-flow direction and density. */\n autoFlow?: GridAutoFlow;\n /** Use auto-fit with a min width to create responsive columns. */\n minColumnWidth?: number | string;\n /** CSS grid-template-areas. Provide full string or joined lines. */\n areas?: string | string[];\n /** Item alignment within cells. */\n alignItems?: React.CSSProperties[\"alignItems\"];\n justifyItems?: React.CSSProperties[\"justifyItems\"];\n /** Grid content alignment. */\n alignContent?: React.CSSProperties[\"alignContent\"];\n justifyContent?: React.CSSProperties[\"justifyContent\"];\n /** Responsive overrides by breakpoint (Tailwind defaults). */\n responsive?: Partial<Record<Breakpoint, ResponsiveConfig>>;\n /** Visual variant style. */\n variant?: GridVariant;\n /** Enable smooth animations for grid layout changes. */\n animated?: boolean;\n /** Apply Card-like outline (rounded + border + bg-card). @deprecated Use variant=\"card\" instead */\n outlined?: boolean;\n}\n\nexport interface GridItemProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Column span (e.g., 3 => span 3). */\n colSpan?: number | string;\n /** Row span. */\n rowSpan?: number | string;\n /** Column start line. */\n colStart?: number | string;\n /** Column end line. */\n colEnd?: number | string;\n /** Row start line. */\n rowStart?: number | string;\n /** Row end line. */\n rowEnd?: number | string;\n /** Named area (must match container areas). */\n area?: string;\n /** Item alignment override. */\n alignSelf?: React.CSSProperties[\"alignSelf\"];\n justifySelf?: React.CSSProperties[\"justifySelf\"];\n /** Order of the item in the grid. */\n order?: number;\n /** Add hover effect. */\n hoverable?: boolean;\n /** Add animation delay (in ms). */\n animationDelay?: number;\n}\n\nconst BP_MIN: Record<Breakpoint, number> = {\n sm: 640,\n md: 768,\n lg: 1024,\n xl: 1280,\n \"2xl\": 1536,\n};\n\nfunction toTemplateCols(columns?: number | string, minColumnWidth?: number | string) {\n if (minColumnWidth != null) {\n const v = typeof minColumnWidth === \"number\" ? `${minColumnWidth}px` : String(minColumnWidth);\n return `repeat(auto-fit, minmax(${v}, 1fr))`;\n }\n if (typeof columns === \"number\") return `repeat(${columns}, minmax(0, 1fr))`;\n if (columns) return String(columns);\n return `repeat(12, minmax(0, 1fr))`;\n}\n\nfunction toTemplateRows(rows?: number | string) {\n if (typeof rows === \"number\") return `repeat(${rows}, minmax(0, auto))`;\n if (rows) return String(rows);\n return undefined;\n}\n\nfunction joinAreas(areas?: string | string[]) {\n if (!areas) return undefined;\n return Array.isArray(areas) ? areas.join(\" \") : areas;\n}\n\nfunction getVariantClasses(variant: GridVariant = \"default\", outlined?: boolean): string {\n // Handle deprecated outlined prop\n if (outlined) {\n return \"rounded-lg md:rounded-xl bg-card text-card-foreground border border-border shadow-sm\";\n }\n\n const variants: Record<GridVariant, string> = {\n default: \"\",\n bordered: \"border border-border rounded-lg\",\n card: \"rounded-lg md:rounded-xl bg-card text-card-foreground border border-border shadow-sm\",\n flat: \"bg-muted/30 rounded-lg\",\n glass: \"bg-background/80 backdrop-blur-sm border border-border/50 rounded-lg shadow-lg\",\n };\n\n return variants[variant] || \"\";\n}\n\nconst GridRoot = React.forwardRef<HTMLDivElement, GridProps>(\n (\n {\n columns,\n rows,\n gap,\n gapX,\n gapY,\n autoRows,\n autoColumns,\n autoFlow,\n minColumnWidth,\n areas,\n alignItems,\n justifyItems,\n alignContent,\n justifyContent,\n responsive,\n variant = \"default\",\n animated = false,\n outlined = false,\n className,\n style,\n children,\n ...rest\n },\n ref\n ) => {\n const id = useId().replace(/[:]/g, \"\");\n const baseClass = `uv-grid-${id}`;\n\n const baseCols = toTemplateCols(columns, minColumnWidth);\n const baseRows = toTemplateRows(rows);\n const baseAreas = joinAreas(areas);\n\n let css = `.${baseClass}{display:grid;`;\n if (baseCols) css += `grid-template-columns:${baseCols};`;\n if (baseRows) css += `grid-template-rows:${baseRows};`;\n if (baseAreas) css += `grid-template-areas:${baseAreas};`;\n if (autoRows) css += `grid-auto-rows:${autoRows};`;\n if (autoColumns) css += `grid-auto-columns:${autoColumns};`;\n if (autoFlow) css += `grid-auto-flow:${autoFlow};`;\n if (alignItems) css += `align-items:${alignItems};`;\n if (justifyItems) css += `justify-items:${justifyItems};`;\n if (alignContent) css += `align-content:${alignContent};`;\n if (justifyContent) css += `justify-content:${justifyContent};`;\n if (animated) css += `transition:all 0.3s cubic-bezier(0.4, 0, 0.2, 1);`;\n css += `}`;\n\n const toVal = (v?: number | string) => (typeof v === \"number\" ? `${v}px` : v);\n const g = toVal(gap);\n const gx = toVal(gapX);\n const gy = toVal(gapY);\n if (g) css += `.${baseClass}{gap:${g};}`;\n if (gx) css += `.${baseClass}{column-gap:${gx};}`;\n if (gy) css += `.${baseClass}{row-gap:${gy};}`;\n\n if (responsive) {\n (Object.keys(responsive) as Breakpoint[]).forEach((bp) => {\n const conf = responsive[bp];\n if (!conf) return;\n const cols = toTemplateCols(conf.columns, conf.minColumnWidth);\n const rws = toTemplateRows(conf.rows);\n const rg = toVal(conf.gap);\n const rgx = toVal(conf.gapX);\n const rgy = toVal(conf.gapY);\n css += `@media (min-width:${BP_MIN[bp]}px){.${baseClass}{`;\n if (cols) css += `grid-template-columns:${cols};`;\n if (rws) css += `grid-template-rows:${rws};`;\n if (rg) css += `gap:${rg};`;\n if (rgx) css += `column-gap:${rgx};`;\n if (rgy) css += `row-gap:${rgy};`;\n css += `}}`;\n });\n }\n\n return (\n <div\n ref={ref}\n className={cn(\n baseClass,\n getVariantClasses(variant, outlined),\n animated && \"transition-all duration-300 ease-in-out\",\n className\n )}\n style={style}\n {...rest}\n >\n <style dangerouslySetInnerHTML={{ __html: css }} />\n {children}\n </div>\n );\n }\n);\n\nGridRoot.displayName = \"Grid\";\n\nexport const GridItem = React.forwardRef<HTMLDivElement, GridItemProps>(\n (\n {\n colSpan,\n rowSpan,\n colStart,\n colEnd,\n rowStart,\n rowEnd,\n area,\n alignSelf,\n justifySelf,\n order,\n hoverable = false,\n animationDelay,\n style,\n className,\n ...rest\n },\n ref\n ) => {\n const st: React.CSSProperties = { ...style };\n if (colSpan != null) st.gridColumn = `span ${colSpan} / span ${colSpan}`;\n if (rowSpan != null) st.gridRow = `span ${rowSpan} / span ${rowSpan}`;\n if (colStart != null) st.gridColumnStart = colStart as any;\n if (colEnd != null) st.gridColumnEnd = colEnd as any;\n if (rowStart != null) st.gridRowStart = rowStart as any;\n if (rowEnd != null) st.gridRowEnd = rowEnd as any;\n if (area) st.gridArea = area;\n if (alignSelf) st.alignSelf = alignSelf;\n if (justifySelf) st.justifySelf = justifySelf;\n if (order != null) st.order = order;\n if (animationDelay != null) {\n st.animationDelay = `${animationDelay}ms`;\n st.opacity = 0;\n st.animation = `uvGridItemFadeIn 0.5s ease-out forwards`;\n }\n\n return (\n <>\n {animationDelay != null && (\n <style\n dangerouslySetInnerHTML={{\n __html: `@keyframes uvGridItemFadeIn{from{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}`,\n }}\n />\n )}\n <div\n ref={ref}\n className={cn(\n hoverable && \"transition-all duration-200 hover:scale-[1.02] hover:shadow-md cursor-pointer\",\n className\n )}\n style={st}\n {...rest}\n />\n </>\n );\n }\n);\n\nGridItem.displayName = \"Grid.Item\";\n\nconst Grid = Object.assign(GridRoot, { Item: GridItem });\n\nexport default Grid;\n","\"use client\";\n\nimport React, { useMemo, useState, useRef } from \"react\";\nimport { ChartTooltip } from \"./ChartTooltip\";\n\nexport interface LineChartDataPoint {\n label: string;\n value: number;\n}\n\nexport interface LineChartProps {\n data: LineChartDataPoint[];\n width?: number;\n height?: number;\n color?: string;\n fillColor?: string;\n showDots?: boolean;\n showGrid?: boolean;\n showLabels?: boolean;\n showValues?: boolean;\n animated?: boolean;\n curved?: boolean;\n className?: string;\n}\n\nexport function LineChart({\n data,\n width = 400,\n height = 200,\n color = \"currentColor\",\n fillColor,\n showDots = true,\n showGrid = true,\n showLabels = true,\n showValues = false,\n animated = true,\n curved = true,\n className = \"\",\n}: LineChartProps) {\n const svgRef = useRef<SVGSVGElement>(null);\n const padding = { top: 20, right: 20, bottom: 40, left: 40 };\n const chartWidth = width - padding.left - padding.right;\n const chartHeight = height - padding.top - padding.bottom;\n\n const [hoveredPoint, setHoveredPoint] = useState<{\n x: number;\n y: number;\n label: string;\n value: number;\n } | null>(null);\n\n const { minValue, maxValue, points, linePath, areaPath } = useMemo(() => {\n if (!data.length) return { minValue: 0, maxValue: 0, points: [], linePath: \"\", areaPath: \"\" };\n\n const values = data.map((d) => d.value);\n const min = Math.min(...values);\n const max = Math.max(...values);\n const range = max - min || 1;\n\n const pts = data.map((d, i) => ({\n x: padding.left + (i / (data.length - 1 || 1)) * chartWidth,\n y: padding.top + chartHeight - ((d.value - min) / range) * chartHeight,\n ...d,\n }));\n\n let path = \"\";\n let area = \"\";\n\n if (curved && pts.length > 2) {\n // Catmull-Rom spline for smooth curves\n path = `M ${pts[0].x} ${pts[0].y}`;\n area = `M ${pts[0].x} ${padding.top + chartHeight} L ${pts[0].x} ${pts[0].y}`;\n\n for (let i = 0; i < pts.length - 1; i++) {\n const p0 = pts[Math.max(0, i - 1)];\n const p1 = pts[i];\n const p2 = pts[i + 1];\n const p3 = pts[Math.min(pts.length - 1, i + 2)];\n\n const cp1x = p1.x + (p2.x - p0.x) / 6;\n const cp1y = p1.y + (p2.y - p0.y) / 6;\n const cp2x = p2.x - (p3.x - p1.x) / 6;\n const cp2y = p2.y - (p3.y - p1.y) / 6;\n\n path += ` C ${cp1x} ${cp1y}, ${cp2x} ${cp2y}, ${p2.x} ${p2.y}`;\n area += ` C ${cp1x} ${cp1y}, ${cp2x} ${cp2y}, ${p2.x} ${p2.y}`;\n }\n area += ` L ${pts[pts.length - 1].x} ${padding.top + chartHeight} Z`;\n } else {\n path = pts.map((p, i) => `${i === 0 ? \"M\" : \"L\"} ${p.x} ${p.y}`).join(\" \");\n area =\n `M ${pts[0].x} ${padding.top + chartHeight} ` +\n pts.map((p) => `L ${p.x} ${p.y}`).join(\" \") +\n ` L ${pts[pts.length - 1].x} ${padding.top + chartHeight} Z`;\n }\n\n return { minValue: min, maxValue: max, points: pts, linePath: path, areaPath: area };\n }, [data, chartWidth, chartHeight, curved, padding.left, padding.top]);\n\n const gridLines = useMemo(() => {\n const lines = [];\n const steps = 5;\n for (let i = 0; i <= steps; i++) {\n const y = padding.top + (i / steps) * chartHeight;\n const value = maxValue - (i / steps) * (maxValue - minValue);\n lines.push({ y, value });\n }\n return lines;\n }, [minValue, maxValue, chartHeight, padding.top]);\n\n return (\n <>\n <svg ref={svgRef} width={width} height={height} className={`overflow-visible ${className}`} style={{ fontFamily: \"inherit\" }}>\n {/* Grid */}\n {showGrid && (\n <g className=\"text-muted-foreground/20\">\n {gridLines.map((line, i) => (\n <g key={i}>\n <line x1={padding.left} y1={line.y} x2={width - padding.right} y2={line.y} stroke=\"currentColor\" strokeDasharray=\"4 4\" />\n <text x={padding.left - 8} y={line.y + 4} textAnchor=\"end\" fontSize=\"10\" fill=\"currentColor\" className=\"text-muted-foreground\">\n {line.value.toFixed(0)}\n </text>\n </g>\n ))}\n </g>\n )}\n\n {/* Area fill */}\n {fillColor && areaPath && <path d={areaPath} fill={fillColor} opacity={0.2} className={animated ? \"animate-[fadeIn_0.6s_ease-out]\" : \"\"} />}\n\n {/* Line */}\n {linePath && (\n <path\n d={linePath}\n fill=\"none\"\n stroke={color}\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={animated ? \"animate-[drawLine_1s_ease-out]\" : \"\"}\n style={\n animated\n ? {\n strokeDasharray: 1000,\n strokeDashoffset: 0,\n animation: \"drawLine 1s ease-out forwards\",\n }\n : undefined\n }\n />\n )}\n\n {/* Dots */}\n {showDots &&\n points.map((point, i) => (\n <g\n key={i}\n onMouseEnter={() => setHoveredPoint({ x: point.x, y: point.y, label: point.label, value: point.value })}\n onMouseLeave={() => setHoveredPoint(null)}\n className=\"cursor-pointer\"\n >\n <circle\n cx={point.x}\n cy={point.y}\n r={hoveredPoint?.x === point.x ? 6 : 4}\n fill={color}\n className={`transition-all duration-150 ${animated ? \"animate-[scaleIn_0.3s_ease-out]\" : \"\"}`}\n style={animated ? { animationDelay: `${i * 0.05}s`, animationFillMode: \"both\" } : undefined}\n />\n <circle cx={point.x} cy={point.y} r={16} fill=\"transparent\" />\n {showValues && (\n <text x={point.x} y={point.y - 12} textAnchor=\"middle\" fontSize=\"10\" fontWeight=\"500\" className=\"text-foreground\" fill=\"currentColor\">\n {point.value}\n </text>\n )}\n </g>\n ))}\n\n {/* Hover crosshair */}\n {hoveredPoint && (\n <g className=\"pointer-events-none\">\n <line\n x1={hoveredPoint.x}\n y1={padding.top}\n x2={hoveredPoint.x}\n y2={padding.top + chartHeight}\n stroke={color}\n strokeWidth={1}\n strokeDasharray=\"4 4\"\n opacity={0.5}\n />\n <line\n x1={padding.left}\n y1={hoveredPoint.y}\n x2={padding.left + chartWidth}\n y2={hoveredPoint.y}\n stroke={color}\n strokeWidth={1}\n strokeDasharray=\"4 4\"\n opacity={0.5}\n />\n </g>\n )}\n\n {/* X-axis labels */}\n {showLabels &&\n points.map((point, i) => (\n <text key={i} x={point.x} y={height - 10} textAnchor=\"middle\" fontSize=\"10\" className=\"text-muted-foreground\" fill=\"currentColor\">\n {point.label}\n </text>\n ))}\n\n <style>{`\n @keyframes drawLine {\n from { stroke-dashoffset: 1000; }\n to { stroke-dashoffset: 0; }\n }\n @keyframes scaleIn {\n from { transform: scale(0); opacity: 0; }\n to { transform: scale(1); opacity: 1; }\n }\n @keyframes fadeIn {\n from { opacity: 0; }\n to { opacity: 0.2; }\n }\n `}</style>\n </svg>\n\n {/* Tooltip with Portal */}\n <ChartTooltip\n x={hoveredPoint?.x ?? 0}\n y={hoveredPoint?.y ?? 0}\n visible={!!hoveredPoint}\n label={hoveredPoint?.label}\n value={hoveredPoint?.value}\n color={color}\n containerRef={svgRef}\n />\n </>\n );\n}\n\nexport default LineChart;\n","\"use client\";\n\nimport React, { useEffect, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { cn } from \"@/lib/utils/cn\";\n\nexport interface ChartTooltipItem {\n label: string;\n value: string | number;\n color?: string;\n}\n\nexport interface ChartTooltipProps {\n x: number;\n y: number;\n visible: boolean;\n label?: string;\n value?: string | number;\n color?: string;\n secondaryLabel?: string;\n secondaryValue?: string | number;\n items?: ChartTooltipItem[];\n /** Reference element to calculate absolute position from SVG coordinates */\n containerRef?: React.RefObject<HTMLElement | SVGSVGElement | null>;\n}\n\nexport function ChartTooltip({ x, y, visible, label, value, color, secondaryLabel, secondaryValue, items, containerRef }: ChartTooltipProps) {\n const [isMounted, setIsMounted] = useState(false);\n const [position, setPosition] = useState<{ top: number; left: number } | null>(null);\n\n useEffect(() => {\n setIsMounted(true);\n }, []);\n\n useEffect(() => {\n if (visible && containerRef?.current) {\n const rect = containerRef.current.getBoundingClientRect();\n setPosition({\n top: rect.top + y,\n left: rect.left + x,\n });\n }\n }, [visible, x, y, containerRef]);\n\n if (!visible || !isMounted || !position) return null;\n\n const tooltipContent = (\n <div\n style={{\n position: \"fixed\",\n top: position.top,\n left: position.left + 12,\n zIndex: 99999,\n pointerEvents: \"none\",\n animation: \"chartTooltipFadeIn 0.15s ease-out\",\n }}\n >\n <div\n className={cn(\"bg-popover text-popover-foreground border border-border\", \"rounded-lg shadow-xl px-3 py-2 text-sm\", \"backdrop-blur-sm\")}\n style={{\n minWidth: \"80px\",\n width: \"max-content\",\n boxShadow: \"0 10px 25px -3px rgba(0, 0, 0, 0.5), 0 4px 10px -2px rgba(0, 0, 0, 0.3)\",\n }}\n >\n {label && <div className=\"text-muted-foreground text-xs mb-1\">{label}</div>}\n\n {items && items.length > 0 ? (\n <div className=\"flex flex-col gap-1\">\n {items.map((item, i) => (\n <div key={i} className=\"flex items-center gap-2\">\n {item.color && <div className=\"w-2 h-2 rounded-full shrink-0\" style={{ backgroundColor: item.color }} />}\n <span className=\"text-muted-foreground\">{item.label}:</span>\n <span className=\"font-semibold ml-auto\">{item.value}</span>\n </div>\n ))}\n </div>\n ) : (\n <>\n <div className=\"flex items-center gap-2\">\n {color && <div className=\"w-2 h-2 rounded-full shrink-0\" style={{ backgroundColor: color }} />}\n <span className=\"font-semibold\">{value}</span>\n </div>\n {secondaryLabel && (\n <div className=\"text-muted-foreground text-xs mt-1\">\n {secondaryLabel}: {secondaryValue}\n </div>\n )}\n </>\n )}\n </div>\n <style>{`\n @keyframes chartTooltipFadeIn {\n from { opacity: 0; transform: translateX(-5px); }\n to { opacity: 1; transform: translateX(0); }\n }\n `}</style>\n </div>\n );\n\n return createPortal(tooltipContent, document.body);\n}\n\nexport default ChartTooltip;\n","\"use client\";\n\nimport React, { useMemo, useState, useRef } from \"react\";\nimport { ChartTooltip } from \"./ChartTooltip\";\n\nexport interface BarChartDataPoint {\n label: string;\n value: number;\n color?: string;\n}\n\nexport interface BarChartProps {\n data: BarChartDataPoint[];\n width?: number;\n height?: number;\n color?: string;\n showLabels?: boolean;\n showValues?: boolean;\n showGrid?: boolean;\n horizontal?: boolean;\n animated?: boolean;\n barRadius?: number;\n barGap?: number;\n className?: string;\n}\n\nexport function BarChart({\n data,\n width = 400,\n height = 200,\n color = \"currentColor\",\n showLabels = true,\n showValues = true,\n showGrid = true,\n horizontal = false,\n animated = true,\n barRadius = 4,\n barGap = 0.3,\n className = \"\",\n}: BarChartProps) {\n const svgRef = useRef<SVGSVGElement>(null);\n const padding = horizontal ? { top: 20, right: 40, bottom: 20, left: 80 } : { top: 20, right: 20, bottom: 40, left: 40 };\n\n const chartWidth = width - padding.left - padding.right;\n const chartHeight = height - padding.top - padding.bottom;\n\n const [hoveredBar, setHoveredBar] = useState<{\n x: number;\n y: number;\n label: string;\n value: number;\n color?: string;\n } | null>(null);\n\n const { maxValue, bars, gridLines } = useMemo(() => {\n if (!data.length) return { maxValue: 0, bars: [], gridLines: [] };\n\n const max = Math.max(...data.map((d) => d.value));\n const barCount = data.length;\n\n const barsData = data.map((d, i) => {\n if (horizontal) {\n const barHeight = (chartHeight / barCount) * (1 - barGap);\n const gap = (chartHeight / barCount) * barGap;\n return {\n x: padding.left,\n y: padding.top + i * (barHeight + gap) + gap / 2,\n width: (d.value / max) * chartWidth,\n height: barHeight,\n ...d,\n };\n } else {\n const barWidth = (chartWidth / barCount) * (1 - barGap);\n const gap = (chartWidth / barCount) * barGap;\n return {\n x: padding.left + i * (barWidth + gap) + gap / 2,\n y: padding.top + chartHeight - (d.value / max) * chartHeight,\n width: barWidth,\n height: (d.value / max) * chartHeight,\n ...d,\n };\n }\n });\n\n const lines = [];\n const steps = 5;\n for (let i = 0; i <= steps; i++) {\n const value = (i / steps) * max;\n if (horizontal) {\n lines.push({\n x: padding.left + (i / steps) * chartWidth,\n y1: padding.top,\n y2: height - padding.bottom,\n value,\n });\n } else {\n lines.push({\n y: padding.top + chartHeight - (i / steps) * chartHeight,\n x1: padding.left,\n x2: width - padding.right,\n value,\n });\n }\n }\n\n return { maxValue: max, bars: barsData, gridLines: lines };\n }, [data, chartWidth, chartHeight, horizontal, barGap, padding, width, height]);\n\n return (\n <>\n <svg ref={svgRef} width={width} height={height} className={`overflow-visible ${className}`} style={{ fontFamily: \"inherit\" }}>\n {/* Grid */}\n {showGrid && (\n <g className=\"text-muted-foreground/20\">\n {gridLines.map((line, i) => (\n <g key={i}>\n {horizontal ? (\n <>\n <line x1={line.x} y1={line.y1} x2={line.x} y2={line.y2} stroke=\"currentColor\" strokeDasharray=\"4 4\" />\n <text x={line.x} y={height - 8} textAnchor=\"middle\" fontSize=\"10\" className=\"text-muted-foreground\" fill=\"currentColor\">\n {line.value.toFixed(0)}\n </text>\n </>\n ) : (\n <>\n <line x1={line.x1} y1={line.y} x2={line.x2} y2={line.y} stroke=\"currentColor\" strokeDasharray=\"4 4\" />\n <text x={padding.left - 8} y={line.y! + 4} textAnchor=\"end\" fontSize=\"10\" className=\"text-muted-foreground\" fill=\"currentColor\">\n {line.value.toFixed(0)}\n </text>\n </>\n )}\n </g>\n ))}\n </g>\n )}\n\n {/* Bars */}\n {bars.map((bar, i) => (\n <g\n key={i}\n onMouseEnter={() =>\n setHoveredBar({\n x: horizontal ? bar.x + bar.width : bar.x + bar.width / 2,\n y: horizontal ? bar.y + bar.height / 2 : bar.y,\n label: bar.label,\n value: bar.value,\n color: bar.color || color,\n })\n }\n onMouseLeave={() => setHoveredBar(null)}\n className=\"cursor-pointer\"\n >\n <rect\n x={bar.x}\n y={horizontal ? bar.y : bar.y}\n width={animated && !horizontal ? 0 : bar.width}\n height={animated && horizontal ? bar.height : horizontal ? bar.height : 0}\n rx={barRadius}\n ry={barRadius}\n fill={bar.color || color}\n className={`transition-all duration-150 ${hoveredBar?.label === bar.label ? \"opacity-80\" : \"\"}`}\n style={\n animated\n ? {\n animation: horizontal ? `growWidth 0.5s ease-out ${i * 0.1}s forwards` : `growHeight 0.5s ease-out ${i * 0.1}s forwards`,\n ...(horizontal ? { width: 0 } : { height: 0, y: padding.top + chartHeight }),\n }\n : undefined\n }\n >\n <animate\n attributeName={horizontal ? \"width\" : \"height\"}\n from=\"0\"\n to={horizontal ? bar.width : bar.height}\n dur=\"0.5s\"\n begin={`${i * 0.1}s`}\n fill=\"freeze\"\n />\n {!horizontal && (\n <animate attributeName=\"y\" from={padding.top + chartHeight} to={bar.y} dur=\"0.5s\" begin={`${i * 0.1}s`} fill=\"freeze\" />\n )}\n </rect>\n\n {/* Values */}\n {showValues && (\n <text\n x={horizontal ? bar.x + bar.width + 8 : bar.x + bar.width / 2}\n y={horizontal ? bar.y + bar.height / 2 + 4 : bar.y - 8}\n textAnchor={horizontal ? \"start\" : \"middle\"}\n fontSize=\"11\"\n fontWeight=\"500\"\n className=\"text-foreground\"\n fill=\"currentColor\"\n style={animated ? { opacity: 0, animation: `fadeIn 0.3s ease-out ${i * 0.1 + 0.3}s forwards` } : undefined}\n >\n {bar.value}\n </text>\n )}\n\n {/* Labels */}\n {showLabels && (\n <text\n x={horizontal ? padding.left - 8 : bar.x + bar.width / 2}\n y={horizontal ? bar.y + bar.height / 2 + 4 : height - 10}\n textAnchor={horizontal ? \"end\" : \"middle\"}\n fontSize=\"10\"\n className=\"text-muted-foreground\"\n fill=\"currentColor\"\n >\n {bar.label}\n </text>\n )}\n </g>\n ))}\n\n <style>{`\n @keyframes growHeight {\n from { height: 0; }\n }\n @keyframes growWidth {\n from { width: 0; }\n }\n @keyframes fadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n }\n `}</style>\n </svg>\n\n {/* Tooltip with Portal */}\n <ChartTooltip\n x={hoveredBar?.x ?? 0}\n y={hoveredBar?.y ?? 0}\n visible={!!hoveredBar}\n label={hoveredBar?.label}\n value={hoveredBar?.value}\n color={hoveredBar?.color}\n containerRef={svgRef}\n />\n </>\n );\n}\n\nexport default BarChart;\n","\"use client\";\n\nimport React, { useMemo, useState, useRef } from \"react\";\nimport { ChartTooltip } from \"./ChartTooltip\";\n\nexport interface PieChartDataPoint {\n label: string;\n value: number;\n color: string;\n}\n\nexport interface PieChartProps {\n data: PieChartDataPoint[];\n size?: number;\n donut?: boolean;\n donutWidth?: number;\n showLabels?: boolean;\n showLegend?: boolean;\n showPercentage?: boolean;\n animated?: boolean;\n startAngle?: number;\n className?: string;\n}\n\nexport function PieChart({\n data,\n size = 200,\n donut = false,\n donutWidth = 40,\n showLabels = true,\n showLegend = true,\n showPercentage = true,\n animated = true,\n startAngle = -90,\n className = \"\",\n}: PieChartProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n const center = size / 2;\n const radius = size / 2 - 10;\n const innerRadius = donut ? radius - donutWidth : 0;\n\n const { segments, total } = useMemo(() => {\n if (!data.length) return { segments: [], total: 0 };\n\n const sum = data.reduce((acc, d) => acc + d.value, 0);\n let currentAngle = startAngle;\n\n const segs = data.map((d, i) => {\n const percentage = d.value / sum;\n const angle = percentage * 360;\n const startRad = (currentAngle * Math.PI) / 180;\n const endRad = ((currentAngle + angle) * Math.PI) / 180;\n const midRad = ((currentAngle + angle / 2) * Math.PI) / 180;\n\n // Large arc flag\n const largeArc = angle > 180 ? 1 : 0;\n\n // Start and end points for outer arc\n const x1 = center + radius * Math.cos(startRad);\n const y1 = center + radius * Math.sin(startRad);\n const x2 = center + radius * Math.cos(endRad);\n const y2 = center + radius * Math.sin(endRad);\n\n // Start and end points for inner arc (donut)\n const x3 = center + innerRadius * Math.cos(endRad);\n const y3 = center + innerRadius * Math.sin(endRad);\n const x4 = center + innerRadius * Math.cos(startRad);\n const y4 = center + innerRadius * Math.sin(startRad);\n\n // Label position\n const labelRadius = radius + 20;\n const labelX = center + labelRadius * Math.cos(midRad);\n const labelY = center + labelRadius * Math.sin(midRad);\n\n let path: string;\n if (donut) {\n path = [\n `M ${x1} ${y1}`,\n `A ${radius} ${radius} 0 ${largeArc} 1 ${x2} ${y2}`,\n `L ${x3} ${y3}`,\n `A ${innerRadius} ${innerRadius} 0 ${largeArc} 0 ${x4} ${y4}`,\n \"Z\",\n ].join(\" \");\n } else {\n path = [`M ${center} ${center}`, `L ${x1} ${y1}`, `A ${radius} ${radius} 0 ${largeArc} 1 ${x2} ${y2}`, \"Z\"].join(\" \");\n }\n\n currentAngle += angle;\n\n return {\n path,\n ...d,\n percentage,\n labelX,\n labelY,\n midAngle: currentAngle - angle / 2,\n };\n });\n\n return { segments: segs, total: sum };\n }, [data, center, radius, innerRadius, donut, startAngle]);\n\n const [hoveredSegment, setHoveredSegment] = useState<{\n x: number;\n y: number;\n label: string;\n value: number;\n percentage: number;\n color: string;\n } | null>(null);\n\n return (\n <div ref={containerRef} className={`relative flex items-center gap-6 ${className}`}>\n <svg width={size + 40} height={size + 40} className=\"overflow-visible\" style={{ fontFamily: \"inherit\" }}>\n <g transform={`translate(20, 20)`}>\n {segments.map((seg, i) => (\n <g\n key={i}\n onMouseEnter={() =>\n setHoveredSegment({\n x: seg.labelX + 20,\n y: seg.labelY + 20,\n label: seg.label,\n value: seg.value,\n percentage: seg.percentage,\n color: seg.color,\n })\n }\n onMouseLeave={() => setHoveredSegment(null)}\n >\n <path\n d={seg.path}\n fill={seg.color}\n className={`transition-all duration-150 cursor-pointer ${hoveredSegment?.label === seg.label ? \"opacity-80\" : \"\"}`}\n style={{\n transformOrigin: `${center}px ${center}px`,\n transform: hoveredSegment?.label === seg.label ? \"scale(1.05)\" : \"scale(1)\",\n ...(animated\n ? {\n opacity: hoveredSegment?.label === seg.label ? 0.8 : 0,\n animation: `pieSlice 0.5s ease-out ${i * 0.1}s forwards`,\n }\n : undefined),\n }}\n />\n\n {/* Label with percentage */}\n {showLabels && (\n <text\n x={seg.labelX}\n y={seg.labelY}\n textAnchor={seg.labelX > center ? \"start\" : \"end\"}\n fontSize=\"10\"\n className=\"text-foreground\"\n fill=\"currentColor\"\n style={animated ? { opacity: 0, animation: `fadeIn 0.3s ease-out ${i * 0.1 + 0.3}s forwards` } : undefined}\n >\n {showPercentage ? `${(seg.percentage * 100).toFixed(0)}%` : seg.value}\n </text>\n )}\n </g>\n ))}\n\n {/* Center text for donut */}\n {donut && (\n <g>\n <text x={center} y={center - 5} textAnchor=\"middle\" fontSize=\"12\" className=\"text-muted-foreground\" fill=\"currentColor\">\n Total\n </text>\n <text x={center} y={center + 15} textAnchor=\"middle\" fontSize=\"18\" fontWeight=\"600\" className=\"text-foreground\" fill=\"currentColor\">\n {total}\n </text>\n </g>\n )}\n </g>\n\n <style>{`\n @keyframes pieSlice {\n from {\n opacity: 0;\n transform: scale(0);\n }\n to {\n opacity: 1;\n transform: scale(1);\n }\n }\n @keyframes fadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n }\n `}</style>\n </svg>\n\n {/* Legend */}\n {showLegend && (\n <div className=\"flex flex-col gap-2\">\n {segments.map((seg, i) => (\n <div\n key={i}\n className=\"flex items-center gap-2 text-sm\"\n style={animated ? { opacity: 0, animation: `fadeIn 0.3s ease-out ${i * 0.1 + 0.3}s forwards` } : undefined}\n >\n <div className=\"w-3 h-3 rounded-sm shrink-0\" style={{ backgroundColor: seg.color }} />\n <span className=\"text-muted-foreground\">{seg.label}</span>\n <span className=\"text-foreground font-medium ml-auto\">{showPercentage ? `${(seg.percentage * 100).toFixed(0)}%` : seg.value}</span>\n </div>\n ))}\n </div>\n )}\n\n {/* Tooltip with Portal */}\n <ChartTooltip\n x={hoveredSegment?.x ?? center}\n y={hoveredSegment?.y ?? center}\n visible={!!hoveredSegment}\n label={hoveredSegment?.label}\n value={`${hoveredSegment?.value} (${((hoveredSegment?.percentage ?? 0) * 100).toFixed(1)}%)`}\n color={hoveredSegment?.color}\n containerRef={containerRef}\n />\n </div>\n );\n}\n\nexport default PieChart;\n","\"use client\";\n\nimport React, { useMemo, useState, useRef } from \"react\";\nimport { ChartTooltip } from \"./ChartTooltip\";\n\nexport interface AreaChartDataPoint {\n label: string;\n value: number;\n}\n\nexport interface AreaChartSeries {\n name: string;\n data: AreaChartDataPoint[];\n color: string;\n fillOpacity?: number;\n}\n\nexport interface AreaChartProps {\n series: AreaChartSeries[];\n width?: number;\n height?: number;\n showDots?: boolean;\n showGrid?: boolean;\n showLabels?: boolean;\n showLegend?: boolean;\n animated?: boolean;\n stacked?: boolean;\n curved?: boolean;\n className?: string;\n}\n\nfunction getCatmullRomSpline(points: { x: number; y: number }[]): string {\n if (points.length < 2) return \"\";\n if (points.length === 2) {\n return `M ${points[0].x} ${points[0].y} L ${points[1].x} ${points[1].y}`;\n }\n\n let path = `M ${points[0].x} ${points[0].y}`;\n\n for (let i = 0; i < points.length - 1; i++) {\n const p0 = points[Math.max(0, i - 1)];\n const p1 = points[i];\n const p2 = points[i + 1];\n const p3 = points[Math.min(points.length - 1, i + 2)];\n\n const tension = 0.5;\n\n const cp1x = p1.x + ((p2.x - p0.x) * tension) / 6;\n const cp1y = p1.y + ((p2.y - p0.y) * tension) / 6;\n const cp2x = p2.x - ((p3.x - p1.x) * tension) / 6;\n const cp2y = p2.y - ((p3.y - p1.y) * tension) / 6;\n\n path += ` C ${cp1x} ${cp1y}, ${cp2x} ${cp2y}, ${p2.x} ${p2.y}`;\n }\n\n return path;\n}\n\nexport function AreaChart({\n series,\n width = 400,\n height = 200,\n showDots = true,\n showGrid = true,\n showLabels = true,\n showLegend = true,\n animated = true,\n stacked = false,\n curved = true,\n className = \"\",\n}: AreaChartProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n const padding = { top: 20, right: 20, bottom: 40, left: 50 };\n const chartWidth = width - padding.left - padding.right;\n const chartHeight = height - padding.top - padding.bottom;\n\n const [hoveredPoint, setHoveredPoint] = useState<{\n x: number;\n y: number;\n label: string;\n items: { label: string; value: number; color: string }[];\n } | null>(null);\n\n const { processedSeries, gridLines, maxValue, labels } = useMemo(() => {\n if (!series.length || !series[0]?.data?.length) {\n return { processedSeries: [], gridLines: [], maxValue: 0, labels: [] };\n }\n\n const allLabels = series[0].data.map((d) => d.label);\n const dataLength = series[0].data.length;\n\n // Calculate max value\n let max = 0;\n if (stacked) {\n for (let i = 0; i < dataLength; i++) {\n const stackedValue = series.reduce((sum, s) => sum + (s.data[i]?.value || 0), 0);\n max = Math.max(max, stackedValue);\n }\n } else {\n max = Math.max(...series.flatMap((s) => s.data.map((d) => d.value)));\n }\n\n // Process series into drawable paths\n const processed = series.map((s, seriesIndex) => {\n const points = s.data.map((d, i) => {\n const x = padding.left + (i / (dataLength - 1)) * chartWidth;\n let y: number;\n\n if (stacked && seriesIndex > 0) {\n // Add previous series values for stacking\n const stackedBase = series.slice(0, seriesIndex).reduce((sum, prevS) => sum + (prevS.data[i]?.value || 0), 0);\n const stackedValue = stackedBase + d.value;\n y = padding.top + chartHeight - (stackedValue / max) * chartHeight;\n } else {\n y = padding.top + chartHeight - (d.value / max) * chartHeight;\n }\n\n return { x, y, value: d.value, label: d.label };\n });\n\n const linePath = curved ? getCatmullRomSpline(points) : `M ${points.map((p) => `${p.x} ${p.y}`).join(\" L \")}`;\n\n // Create area path\n let areaPath: string;\n if (stacked && seriesIndex > 0) {\n const prevSeriesPoints = series\n .slice(0, seriesIndex)\n .reduce((acc, prevS) => {\n return prevS.data.map((d, i) => {\n const prevVal = acc[i] || 0;\n return prevVal + d.value;\n });\n }, [] as number[])\n .map((val, i) => ({\n x: padding.left + (i / (dataLength - 1)) * chartWidth,\n y: padding.top + chartHeight - (val / max) * chartHeight,\n }));\n\n const reversedPrevPoints = [...prevSeriesPoints].reverse();\n areaPath = `${linePath} L ${reversedPrevPoints.map((p) => `${p.x} ${p.y}`).join(\" L \")} Z`;\n } else {\n areaPath = `${linePath} L ${padding.left + chartWidth} ${padding.top + chartHeight} L ${padding.left} ${padding.top + chartHeight} Z`;\n }\n\n return {\n ...s,\n points,\n linePath,\n areaPath,\n lineLength: points.reduce((acc, p, i) => {\n if (i === 0) return 0;\n const prev = points[i - 1];\n return acc + Math.sqrt(Math.pow(p.x - prev.x, 2) + Math.pow(p.y - prev.y, 2));\n }, 0),\n };\n });\n\n // Grid lines\n const lines = [];\n const steps = 5;\n for (let i = 0; i <= steps; i++) {\n const value = (i / steps) * max;\n lines.push({\n y: padding.top + chartHeight - (i / steps) * chartHeight,\n value,\n });\n }\n\n return { processedSeries: processed, gridLines: lines, maxValue: max, labels: allLabels };\n }, [series, chartWidth, chartHeight, padding, stacked, curved]);\n\n return (\n <div ref={containerRef} className={`relative flex flex-col gap-4 ${className}`}>\n <svg width={width} height={height} className=\"overflow-visible\" style={{ fontFamily: \"inherit\" }}>\n {/* Grid */}\n {showGrid && (\n <g className=\"text-muted-foreground/20\">\n {gridLines.map((line, i) => (\n <g key={i}>\n <line x1={padding.left} y1={line.y} x2={width - padding.right} y2={line.y} stroke=\"currentColor\" strokeDasharray=\"4 4\" />\n <text x={padding.left - 8} y={line.y + 4} textAnchor=\"end\" fontSize=\"10\" className=\"text-muted-foreground\" fill=\"currentColor\">\n {line.value.toFixed(0)}\n </text>\n </g>\n ))}\n </g>\n )}\n\n {/* Areas (render in reverse order for proper stacking) */}\n {[...processedSeries].reverse().map((s, i) => (\n <path\n key={`area-${i}`}\n d={s.areaPath}\n fill={s.color}\n fillOpacity={s.fillOpacity ?? 0.3}\n className=\"transition-all duration-300\"\n style={\n animated\n ? {\n opacity: 0,\n animation: `fadeIn 0.5s ease-out ${i * 0.1}s forwards`,\n }\n : undefined\n }\n />\n ))}\n\n {/* Lines */}\n {processedSeries.map((s, i) => (\n <path\n key={`line-${i}`}\n d={s.linePath}\n fill=\"none\"\n stroke={s.color}\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n style={\n animated\n ? {\n strokeDasharray: s.lineLength,\n strokeDashoffset: s.lineLength,\n animation: `drawLine 1s ease-out ${i * 0.1}s forwards`,\n }\n : undefined\n }\n />\n ))}\n\n {/* Dots */}\n {showDots &&\n processedSeries.map((s, seriesIdx) =>\n s.points.map((point, i) => (\n <g\n key={`dot-${seriesIdx}-${i}`}\n onMouseEnter={() => {\n const items = processedSeries.map((ps) => ({\n label: ps.name,\n value: ps.points[i]?.value ?? 0,\n color: ps.color,\n }));\n setHoveredPoint({\n x: point.x,\n y: point.y,\n label: point.label,\n items,\n });\n }}\n onMouseLeave={() => setHoveredPoint(null)}\n className=\"cursor-pointer\"\n >\n <circle\n cx={point.x}\n cy={point.y}\n r={hoveredPoint?.x === point.x ? 6 : 4}\n fill={s.color}\n className=\"transition-all duration-150\"\n style={\n animated\n ? {\n transform: \"scale(0)\",\n opacity: 0,\n transformOrigin: `${point.x}px ${point.y}px`,\n animation: `dotPop 0.3s ease-out ${seriesIdx * 0.1 + i * 0.05 + 0.5}s forwards`,\n }\n : undefined\n }\n />\n <circle cx={point.x} cy={point.y} r={12} fill=\"transparent\" />\n </g>\n ))\n )}\n\n {/* X-axis labels */}\n {showLabels && (\n <g className=\"text-muted-foreground\">\n {labels.map((label, i) => {\n const x = padding.left + (i / (labels.length - 1)) * chartWidth;\n return (\n <text key={i} x={x} y={height - 10} textAnchor=\"middle\" fontSize=\"10\" fill=\"currentColor\">\n {label}\n </text>\n );\n })}\n </g>\n )}\n\n {/* Hover crosshair */}\n {hoveredPoint && (\n <g className=\"pointer-events-none\">\n <line\n x1={hoveredPoint.x}\n y1={padding.top}\n x2={hoveredPoint.x}\n y2={padding.top + chartHeight}\n stroke=\"currentColor\"\n strokeWidth={1}\n strokeDasharray=\"4 4\"\n opacity={0.3}\n className=\"text-foreground\"\n />\n </g>\n )}\n\n <style>{`\n @keyframes drawLine {\n to {\n stroke-dashoffset: 0;\n }\n }\n @keyframes fadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n }\n @keyframes dotPop {\n from {\n transform: scale(0);\n opacity: 0;\n }\n to {\n transform: scale(1);\n opacity: 1;\n }\n }\n `}</style>\n </svg>\n\n {/* Legend */}\n {showLegend && (\n <div className=\"flex items-center justify-center gap-6\">\n {series.map((s, i) => (\n <div\n key={i}\n className=\"flex items-center gap-2 text-sm\"\n style={animated ? { opacity: 0, animation: `fadeIn 0.3s ease-out ${i * 0.1 + 0.5}s forwards` } : undefined}\n >\n <div className=\"w-3 h-3 rounded-sm\" style={{ backgroundColor: s.color }} />\n <span className=\"text-muted-foreground\">{s.name}</span>\n </div>\n ))}\n </div>\n )}\n\n {/* Tooltip with Portal */}\n <ChartTooltip\n x={hoveredPoint?.x ?? 0}\n y={hoveredPoint?.y ?? 0}\n visible={!!hoveredPoint}\n label={hoveredPoint?.label}\n items={hoveredPoint?.items}\n containerRef={containerRef}\n />\n </div>\n );\n}\n\nexport default AreaChart;\n","\"use client\";\n\nimport React, { useMemo } from \"react\";\n\nexport interface SparklineDataPoint {\n value: number;\n}\n\nexport interface SparklineProps {\n data: SparklineDataPoint[] | number[];\n width?: number;\n height?: number;\n color?: string;\n fillColor?: string;\n showFill?: boolean;\n showDots?: boolean;\n showEndDot?: boolean;\n animated?: boolean;\n curved?: boolean;\n strokeWidth?: number;\n className?: string;\n}\n\nfunction getCatmullRomSpline(points: { x: number; y: number }[]): string {\n if (points.length < 2) return \"\";\n if (points.length === 2) {\n return `M ${points[0].x} ${points[0].y} L ${points[1].x} ${points[1].y}`;\n }\n\n let path = `M ${points[0].x} ${points[0].y}`;\n\n for (let i = 0; i < points.length - 1; i++) {\n const p0 = points[Math.max(0, i - 1)];\n const p1 = points[i];\n const p2 = points[i + 1];\n const p3 = points[Math.min(points.length - 1, i + 2)];\n\n const tension = 0.5;\n\n const cp1x = p1.x + ((p2.x - p0.x) * tension) / 6;\n const cp1y = p1.y + ((p2.y - p0.y) * tension) / 6;\n const cp2x = p2.x - ((p3.x - p1.x) * tension) / 6;\n const cp2y = p2.y - ((p3.y - p1.y) * tension) / 6;\n\n path += ` C ${cp1x} ${cp1y}, ${cp2x} ${cp2y}, ${p2.x} ${p2.y}`;\n }\n\n return path;\n}\n\nexport function Sparkline({\n data,\n width = 100,\n height = 30,\n color = \"currentColor\",\n fillColor,\n showFill = true,\n showDots = false,\n showEndDot = true,\n animated = true,\n curved = true,\n strokeWidth = 2,\n className = \"\",\n}: SparklineProps) {\n const padding = 4;\n const chartWidth = width - padding * 2;\n const chartHeight = height - padding * 2;\n\n const { points, linePath, areaPath, lineLength, trend } = useMemo(() => {\n const normalizedData = data.map((d) => (typeof d === \"number\" ? d : d.value));\n if (!normalizedData.length) {\n return { points: [], linePath: \"\", areaPath: \"\", lineLength: 0, trend: 0 };\n }\n\n const min = Math.min(...normalizedData);\n const max = Math.max(...normalizedData);\n const range = max - min || 1;\n\n const pts = normalizedData.map((value, i) => ({\n x: padding + (i / (normalizedData.length - 1)) * chartWidth,\n y: padding + chartHeight - ((value - min) / range) * chartHeight,\n value,\n }));\n\n const line = curved ? getCatmullRomSpline(pts) : `M ${pts.map((p) => `${p.x} ${p.y}`).join(\" L \")}`;\n\n const area = `${line} L ${padding + chartWidth} ${padding + chartHeight} L ${padding} ${padding + chartHeight} Z`;\n\n const length = pts.reduce((acc, p, i) => {\n if (i === 0) return 0;\n const prev = pts[i - 1];\n return acc + Math.sqrt(Math.pow(p.x - prev.x, 2) + Math.pow(p.y - prev.y, 2));\n }, 0);\n\n // Calculate trend (last - first)\n const trendValue = normalizedData[normalizedData.length - 1] - normalizedData[0];\n\n return { points: pts, linePath: line, areaPath: area, lineLength: length, trend: trendValue };\n }, [data, chartWidth, chartHeight, padding, curved]);\n\n const effectiveFillColor = fillColor || color;\n\n return (\n <svg width={width} height={height} className={`overflow-visible ${className}`} style={{ fontFamily: \"inherit\" }}>\n {/* Area fill */}\n {showFill && (\n <path\n d={areaPath}\n fill={effectiveFillColor}\n fillOpacity={0.1}\n style={animated ? { opacity: 0, animation: \"fadeIn 0.5s ease-out 0.3s forwards\" } : undefined}\n />\n )}\n\n {/* Line */}\n <path\n d={linePath}\n fill=\"none\"\n stroke={color}\n strokeWidth={strokeWidth}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n style={\n animated\n ? {\n strokeDasharray: lineLength,\n strokeDashoffset: lineLength,\n animation: \"drawLine 0.8s ease-out forwards\",\n }\n : undefined\n }\n />\n\n {/* All dots */}\n {showDots &&\n points.map((point, i) => (\n <circle\n key={i}\n cx={point.x}\n cy={point.y}\n r={2}\n fill={color}\n style={\n animated\n ? {\n opacity: 0,\n animation: `fadeIn 0.3s ease-out ${i * 0.05 + 0.5}s forwards`,\n }\n : undefined\n }\n />\n ))}\n\n {/* End dot only */}\n {showEndDot && !showDots && points.length > 0 && (\n <circle\n cx={points[points.length - 1].x}\n cy={points[points.length - 1].y}\n r={3}\n fill={color}\n style={\n animated\n ? {\n opacity: 0,\n transform: \"scale(0)\",\n transformOrigin: `${points[points.length - 1].x}px ${points[points.length - 1].y}px`,\n animation: \"dotPop 0.3s ease-out 0.6s forwards\",\n }\n : undefined\n }\n />\n )}\n\n <style>{`\n @keyframes drawLine {\n to {\n stroke-dashoffset: 0;\n }\n }\n @keyframes fadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n }\n @keyframes dotPop {\n from {\n transform: scale(0);\n opacity: 0;\n }\n to {\n transform: scale(1);\n opacity: 1;\n }\n }\n `}</style>\n </svg>\n );\n}\n\nexport default Sparkline;\n","\"use client\";\n\nimport React, { useMemo, useState, useRef } from \"react\";\nimport { ChartTooltip } from \"./ChartTooltip\";\n\nexport interface RadarChartDataPoint {\n axis: string;\n value: number;\n}\n\nexport interface RadarChartSeries {\n name: string;\n data: RadarChartDataPoint[];\n color: string;\n fillOpacity?: number;\n}\n\nexport interface RadarChartProps {\n series: RadarChartSeries[];\n size?: number;\n levels?: number;\n showLabels?: boolean;\n showLegend?: boolean;\n showValues?: boolean;\n animated?: boolean;\n className?: string;\n}\n\nexport function RadarChart({\n series,\n size = 300,\n levels = 5,\n showLabels = true,\n showLegend = true,\n showValues = false,\n animated = true,\n className = \"\",\n}: RadarChartProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n const center = size / 2;\n const radius = size / 2 - 40;\n\n const [hoveredPoint, setHoveredPoint] = useState<{\n x: number;\n y: number;\n axis: string;\n items: { label: string; value: number; color: string }[];\n } | null>(null);\n\n const { axes, processedSeries, levelPaths } = useMemo(() => {\n if (!series.length || !series[0]?.data?.length) {\n return { axes: [], processedSeries: [], levelPaths: [] };\n }\n\n const axisLabels = series[0].data.map((d) => d.axis);\n const axisCount = axisLabels.length;\n const angleStep = (2 * Math.PI) / axisCount;\n\n // Calculate max value across all series\n const maxValue = Math.max(...series.flatMap((s) => s.data.map((d) => d.value)));\n\n // Create axis lines\n const axesData = axisLabels.map((label, i) => {\n const angle = i * angleStep - Math.PI / 2;\n const x = center + radius * Math.cos(angle);\n const y = center + radius * Math.sin(angle);\n const labelX = center + (radius + 20) * Math.cos(angle);\n const labelY = center + (radius + 20) * Math.sin(angle);\n return { label, x, y, labelX, labelY, angle };\n });\n\n // Create level polygons (grid)\n const levelsData = [];\n for (let l = 1; l <= levels; l++) {\n const levelRadius = (l / levels) * radius;\n const points = axisLabels.map((_, i) => {\n const angle = i * angleStep - Math.PI / 2;\n return {\n x: center + levelRadius * Math.cos(angle),\n y: center + levelRadius * Math.sin(angle),\n };\n });\n levelsData.push({\n path: `M ${points.map((p) => `${p.x} ${p.y}`).join(\" L \")} Z`,\n level: l,\n value: (l / levels) * maxValue,\n });\n }\n\n // Process series into polygon paths\n const processed = series.map((s) => {\n const points = s.data.map((d, i) => {\n const angle = i * angleStep - Math.PI / 2;\n const r = (d.value / maxValue) * radius;\n return {\n x: center + r * Math.cos(angle),\n y: center + r * Math.sin(angle),\n value: d.value,\n };\n });\n\n return {\n ...s,\n points,\n path: `M ${points.map((p) => `${p.x} ${p.y}`).join(\" L \")} Z`,\n };\n });\n\n return { axes: axesData, processedSeries: processed, levelPaths: levelsData };\n }, [series, center, radius, levels]);\n\n return (\n <div ref={containerRef} className={`relative flex flex-col gap-4 ${className}`}>\n <svg width={size} height={size} className=\"overflow-visible\" style={{ fontFamily: \"inherit\" }}>\n {/* Grid levels */}\n <g className=\"text-muted-foreground/20\">\n {levelPaths.map((level, i) => (\n <path key={i} d={level.path} fill=\"none\" stroke=\"currentColor\" strokeWidth={1} />\n ))}\n </g>\n\n {/* Axis lines */}\n <g className=\"text-muted-foreground/30\">\n {axes.map((axis, i) => (\n <line key={i} x1={center} y1={center} x2={axis.x} y2={axis.y} stroke=\"currentColor\" strokeWidth={1} />\n ))}\n </g>\n\n {/* Data polygons */}\n {processedSeries.map((s, i) => (\n <g key={i}>\n <path\n d={s.path}\n fill={s.color}\n fillOpacity={s.fillOpacity ?? 0.2}\n stroke={s.color}\n strokeWidth={2}\n strokeLinejoin=\"round\"\n className=\"transition-all duration-300\"\n style={\n animated\n ? {\n opacity: 0,\n transform: \"scale(0)\",\n transformOrigin: `${center}px ${center}px`,\n animation: `radarPop 0.5s ease-out ${i * 0.15}s forwards`,\n }\n : undefined\n }\n />\n\n {/* Data points */}\n {s.points.map((point, j) => (\n <g\n key={j}\n onMouseEnter={() => {\n const items = processedSeries.map((ps) => ({\n label: ps.name,\n value: ps.points[j]?.value ?? 0,\n color: ps.color,\n }));\n setHoveredPoint({\n x: point.x,\n y: point.y,\n axis: series[0]?.data[j]?.axis ?? \"\",\n items,\n });\n }}\n onMouseLeave={() => setHoveredPoint(null)}\n className=\"cursor-pointer\"\n >\n <circle\n cx={point.x}\n cy={point.y}\n r={hoveredPoint?.axis === series[0]?.data[j]?.axis ? 6 : 4}\n fill={s.color}\n className=\"transition-all duration-150\"\n style={\n animated\n ? {\n opacity: 0,\n transform: \"scale(0)\",\n transformOrigin: `${point.x}px ${point.y}px`,\n animation: `dotPop 0.3s ease-out ${i * 0.15 + j * 0.05 + 0.3}s forwards`,\n }\n : undefined\n }\n />\n <circle cx={point.x} cy={point.y} r={12} fill=\"transparent\" />\n </g>\n ))}\n\n {/* Values */}\n {showValues &&\n s.points.map((point, j) => (\n <text\n key={`val-${j}`}\n x={point.x}\n y={point.y - 10}\n textAnchor=\"middle\"\n fontSize=\"10\"\n fontWeight=\"500\"\n className=\"text-foreground\"\n fill=\"currentColor\"\n style={animated ? { opacity: 0, animation: `fadeIn 0.3s ease-out ${i * 0.15 + 0.5}s forwards` } : undefined}\n >\n {point.value}\n </text>\n ))}\n </g>\n ))}\n\n {/* Axis labels */}\n {showLabels && (\n <g className=\"text-muted-foreground\">\n {axes.map((axis, i) => (\n <text key={i} x={axis.labelX} y={axis.labelY} textAnchor=\"middle\" dominantBaseline=\"middle\" fontSize=\"11\" fill=\"currentColor\">\n {axis.label}\n </text>\n ))}\n </g>\n )}\n\n <style>{`\n @keyframes radarPop {\n from {\n opacity: 0;\n transform: scale(0);\n }\n to {\n opacity: 1;\n transform: scale(1);\n }\n }\n @keyframes dotPop {\n from {\n transform: scale(0);\n opacity: 0;\n }\n to {\n transform: scale(1);\n opacity: 1;\n }\n }\n @keyframes fadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n }\n `}</style>\n </svg>\n\n {/* Legend */}\n {showLegend && (\n <div className=\"flex items-center justify-center gap-6\">\n {series.map((s, i) => (\n <div\n key={i}\n className=\"flex items-center gap-2 text-sm\"\n style={animated ? { opacity: 0, animation: `fadeIn 0.3s ease-out ${i * 0.1 + 0.5}s forwards` } : undefined}\n >\n <div className=\"w-3 h-3 rounded-sm\" style={{ backgroundColor: s.color }} />\n <span className=\"text-muted-foreground\">{s.name}</span>\n </div>\n ))}\n </div>\n )}\n\n {/* Tooltip with Portal */}\n <ChartTooltip\n x={hoveredPoint?.x ?? 0}\n y={hoveredPoint?.y ?? 0}\n visible={!!hoveredPoint}\n label={hoveredPoint?.axis}\n items={hoveredPoint?.items}\n containerRef={containerRef}\n />\n </div>\n );\n}\n\nexport default RadarChart;\n","\"use client\";\n\nimport React, { useMemo } from \"react\";\n\nexport interface GaugeChartProps {\n value: number;\n min?: number;\n max?: number;\n size?: number;\n thickness?: number;\n color?: string;\n backgroundColor?: string;\n showValue?: boolean;\n showMinMax?: boolean;\n label?: string;\n animated?: boolean;\n startAngle?: number;\n endAngle?: number;\n className?: string;\n}\n\nexport function GaugeChart({\n value,\n min = 0,\n max = 100,\n size = 200,\n thickness = 20,\n color = \"currentColor\",\n backgroundColor,\n showValue = true,\n showMinMax = true,\n label,\n animated = true,\n startAngle = -135,\n endAngle = 135,\n className = \"\",\n}: GaugeChartProps) {\n const center = size / 2;\n const radius = center - thickness / 2 - 10;\n\n const { backgroundPath, valuePath, percentage, needleAngle } = useMemo(() => {\n const normalizedValue = Math.min(Math.max(value, min), max);\n const pct = (normalizedValue - min) / (max - min);\n const totalAngle = endAngle - startAngle;\n const currentAngle = startAngle + pct * totalAngle;\n\n const polarToCartesian = (angle: number) => {\n const radians = (angle * Math.PI) / 180;\n return {\n x: center + radius * Math.cos(radians),\n y: center + radius * Math.sin(radians),\n };\n };\n\n const createArc = (start: number, end: number) => {\n const startPoint = polarToCartesian(start);\n const endPoint = polarToCartesian(end);\n const largeArc = Math.abs(end - start) > 180 ? 1 : 0;\n return `M ${startPoint.x} ${startPoint.y} A ${radius} ${radius} 0 ${largeArc} 1 ${endPoint.x} ${endPoint.y}`;\n };\n\n return {\n backgroundPath: createArc(startAngle, endAngle),\n valuePath: createArc(startAngle, currentAngle),\n percentage: pct,\n needleAngle: currentAngle,\n };\n }, [value, min, max, center, radius, startAngle, endAngle]);\n\n const needleLength = radius - 10;\n const needleAngleRad = (needleAngle * Math.PI) / 180;\n const needleX = center + needleLength * Math.cos(needleAngleRad);\n const needleY = center + needleLength * Math.sin(needleAngleRad);\n\n return (\n <svg width={size} height={size * 0.7} className={`overflow-visible ${className}`} style={{ fontFamily: \"inherit\" }}>\n {/* Background arc */}\n <path\n d={backgroundPath}\n fill=\"none\"\n stroke={backgroundColor || \"currentColor\"}\n strokeWidth={thickness}\n strokeLinecap=\"round\"\n className={!backgroundColor ? \"text-muted-foreground/20\" : \"\"}\n />\n\n {/* Value arc */}\n <path\n d={valuePath}\n fill=\"none\"\n stroke={color}\n strokeWidth={thickness}\n strokeLinecap=\"round\"\n style={\n animated\n ? {\n strokeDasharray: \"1000\",\n strokeDashoffset: 1000,\n animation: \"drawArc 1s ease-out forwards\",\n }\n : undefined\n }\n />\n\n {/* Needle */}\n <g\n style={\n animated\n ? {\n transform: `rotate(${startAngle}deg)`,\n transformOrigin: `${center}px ${center}px`,\n animation: `needleRotate 1s ease-out forwards`,\n [\"--needle-end\" as string]: `${needleAngle}deg`,\n }\n : {\n transform: `rotate(${needleAngle}deg)`,\n transformOrigin: `${center}px ${center}px`,\n }\n }\n >\n <line x1={center} y1={center} x2={center + needleLength} y2={center} stroke={color} strokeWidth={3} strokeLinecap=\"round\" />\n <circle cx={center} cy={center} r={8} fill={color} />\n <circle cx={center} cy={center} r={4} className=\"text-background\" fill=\"currentColor\" />\n </g>\n\n {/* Min/Max labels */}\n {showMinMax && (\n <g className=\"text-muted-foreground\">\n <text\n x={center + (radius + 20) * Math.cos((startAngle * Math.PI) / 180)}\n y={center + (radius + 20) * Math.sin((startAngle * Math.PI) / 180) + 5}\n textAnchor=\"middle\"\n fontSize=\"10\"\n fill=\"currentColor\"\n >\n {min}\n </text>\n <text\n x={center + (radius + 20) * Math.cos((endAngle * Math.PI) / 180)}\n y={center + (radius + 20) * Math.sin((endAngle * Math.PI) / 180) + 5}\n textAnchor=\"middle\"\n fontSize=\"10\"\n fill=\"currentColor\"\n >\n {max}\n </text>\n </g>\n )}\n\n {/* Center value */}\n {showValue && (\n <g>\n <text\n x={center}\n y={center + 35}\n textAnchor=\"middle\"\n fontSize=\"24\"\n fontWeight=\"600\"\n className=\"text-foreground\"\n fill=\"currentColor\"\n style={animated ? { opacity: 0, animation: \"fadeIn 0.5s ease-out 0.5s forwards\" } : undefined}\n >\n {value}\n </text>\n {label && (\n <text\n x={center}\n y={center + 55}\n textAnchor=\"middle\"\n fontSize=\"12\"\n className=\"text-muted-foreground\"\n fill=\"currentColor\"\n style={animated ? { opacity: 0, animation: \"fadeIn 0.5s ease-out 0.6s forwards\" } : undefined}\n >\n {label}\n </text>\n )}\n </g>\n )}\n\n <style>{`\n @keyframes drawArc {\n to {\n stroke-dashoffset: 0;\n }\n }\n @keyframes needleRotate {\n to {\n transform: rotate(var(--needle-end));\n }\n }\n @keyframes fadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n }\n `}</style>\n </svg>\n );\n}\n\nexport default GaugeChart;\n","\"use client\";\r\n\r\nimport { useEffect, useState } from \"react\";\r\n\r\ninterface ClientOnlyProps {\r\n children: React.ReactNode;\r\n fallback?: React.ReactNode;\r\n}\r\n\r\nexport default function ClientOnly({ children, fallback = null }: ClientOnlyProps) {\r\n const [hasMounted, setHasMounted] = useState(false);\r\n\r\n useEffect(() => {\r\n setHasMounted(true);\r\n }, []);\r\n\r\n if (!hasMounted) {\r\n return <>{fallback}</>;\r\n }\r\n\r\n return <>{children}</>;\r\n}","\"use client\";\r\n\r\nimport React from 'react';\r\nimport { cn } from '@/lib/utils/cn';\r\nimport { Activity } from 'lucide-react';\r\n\r\ninterface LoadingSpinnerProps {\n size?: 'sm' | 'md' | 'lg';\n className?: string;\n color?: 'primary' | 'foreground' | 'muted';\n}\n\r\nexport const LoadingSpinner: React.FC<LoadingSpinnerProps> = ({ \n size = 'md', \n className,\n color = 'primary'\n}) => {\n const sizeClasses = {\r\n sm: 'h-4 w-4',\r\n md: 'h-6 w-6', \r\n lg: 'h-8 w-8'\r\n };\r\n\r\n const colorClasses = {\r\n primary: 'text-primary',\r\n foreground: 'text-foreground',\r\n muted: 'text-muted-foreground'\r\n };\r\n\r\n return (\n <Activity \n className={cn(\n 'animate-spin',\n sizeClasses[size],\n colorClasses[color],\n className\n )} \n />\n );\n};\n\r\ninterface LoadingDotsProps {\n className?: string;\n color?: 'primary' | 'foreground' | 'muted';\n}\n\r\nexport const LoadingDots: React.FC<LoadingDotsProps> = ({ \n className,\n color = 'primary'\n}) => {\n const colorClasses = {\r\n primary: 'bg-primary',\r\n foreground: 'bg-foreground',\r\n muted: 'bg-muted-foreground'\r\n };\r\n\r\n return (\n <div className={cn('flex items-center space-x-1', className)}>\n {[0, 1, 2].map((i) => (\n <div\n key={i}\n className={cn(\n 'h-2 w-2 rounded-full animate-pulse',\n colorClasses[color]\n )}\n style={{\n animationDelay: `${i * 0.2}s`,\n animationDuration: '1.4s'\n }}\n />\n ))}\n </div>\n );\n};\n\r\ninterface LoadingBarProps {\n progress?: number; // 0-100\n className?: string;\n animated?: boolean;\n label?: string;\n}\n\r\nexport const LoadingBar: React.FC<LoadingBarProps> = ({ \n progress,\n className,\n animated = true,\n label\n}) => {\n const pct = progress ? Math.min(Math.max(progress, 0), 100) : undefined;\n return (\n <div\n className={cn('w-full bg-muted rounded-full h-2', className)}\n role=\"progressbar\"\n aria-valuemin={0}\n aria-valuemax={pct === undefined ? undefined : 100}\n aria-valuenow={pct === undefined ? undefined : Math.round(pct)}\n aria-label={label || 'Loading'}\n >\n <div\n className={cn(\n 'bg-primary h-2 rounded-full transition-all duration-300',\n animated && !progress && 'animate-pulse'\n )}\n style={{\n width: pct !== undefined ? `${pct}%` : '30%'\n }}\n />\n </div>\n );\n};\n\r\ninterface InlineLoadingProps {\n message?: string;\n size?: 'sm' | 'md' | 'lg';\n variant?: 'spinner' | 'dots';\n className?: string;\n}\n\r\nexport const InlineLoading: React.FC<InlineLoadingProps> = ({\n message = '',\n size = 'md',\n variant = 'spinner',\n className\n}) => {\n return (\n <div className={cn('flex items-center gap-2', className)}>\n {variant === 'spinner' ? (\n <LoadingSpinner size={size} />\n ) : (\n <LoadingDots />\n )}\n {message && message.trim() && (\n <span className=\"text-sm text-muted-foreground\">\n {message}\n </span>\n )}\n </div>\n );\n};\n","import React from \"react\";\r\nimport { cn } from \"@/lib/utils/cn\";\r\n\r\ninterface TableProps extends React.HTMLAttributes<HTMLTableElement> {\r\n containerClassName?: string;\r\n}\r\n\r\nconst Table = React.forwardRef<HTMLTableElement, TableProps>(({ className, containerClassName, ...props }, ref) => (\r\n <div\r\n className={cn(\r\n \"relative w-full overflow-auto\",\r\n \"rounded-lg md:rounded-xl border border-border\",\r\n \"bg-card text-card-foreground shadow-sm\",\r\n \"backdrop-blur-sm transition-all duration-300\",\r\n containerClassName\r\n )}\r\n >\r\n <table ref={ref} className={cn(\"w-full caption-bottom text-sm\", className)} {...props} />\r\n </div>\r\n));\r\nTable.displayName = \"Table\";\r\n\r\ninterface TableHeaderProps extends React.HTMLAttributes<HTMLTableSectionElement> {\r\n filterRow?: React.ReactNode;\r\n}\r\n\r\nconst TableHeader = React.forwardRef<HTMLTableSectionElement, TableHeaderProps>(({ className, children, filterRow, ...props }, ref) => (\r\n <thead ref={ref} className={cn(\"[&_tr]:border-b [&_tr]:border-border\", \"bg-muted/50\", className)} {...props}>\r\n {children}\r\n {filterRow}\r\n </thead>\r\n));\r\nTableHeader.displayName = \"TableHeader\";\r\n\r\nconst TableBody = React.forwardRef<HTMLTableSectionElement, React.HTMLAttributes<HTMLTableSectionElement>>(({ className, ...props }, ref) => (\r\n <tbody ref={ref} className={cn(\"[&_tr:last-child]:border-0\", className)} {...props} />\r\n));\r\nTableBody.displayName = \"TableBody\";\r\n\r\nconst TableFooter = React.forwardRef<HTMLTableSectionElement, React.HTMLAttributes<HTMLTableSectionElement>>(({ className, ...props }, ref) => (\r\n <tfoot ref={ref} className={cn(\"border-t bg-muted/50 font-medium [&>tr]:last:border-b-0\", className)} {...props} />\r\n));\r\nTableFooter.displayName = \"TableFooter\";\r\n\r\nconst TableRow = React.forwardRef<HTMLTableRowElement, React.HTMLAttributes<HTMLTableRowElement>>(({ className, ...props }, ref) => (\r\n <tr\r\n ref={ref}\r\n className={cn(\r\n \"border-b border-border transition-all duration-300\",\r\n \"hover:bg-muted/30 hover:shadow-sm\",\r\n \"data-[state=selected]:bg-muted/50\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n));\r\nTableRow.displayName = \"TableRow\";\r\n\r\nconst TableHead = React.forwardRef<HTMLTableCellElement, React.ThHTMLAttributes<HTMLTableCellElement>>(({ className, ...props }, ref) => (\r\n <th\r\n ref={ref}\r\n className={cn(\"h-12 px-4 text-left align-middle font-medium text-muted-foreground [&:has([role=checkbox])]:pr-0\", className)}\r\n {...props}\r\n />\r\n));\r\nTableHead.displayName = \"TableHead\";\r\n\r\nconst TableCell = React.forwardRef<HTMLTableCellElement, React.TdHTMLAttributes<HTMLTableCellElement>>(({ className, ...props }, ref) => (\r\n <td ref={ref} className={cn(\"p-4 align-middle [&:has([role=checkbox])]:pr-0\", className)} {...props} />\r\n));\r\nTableCell.displayName = \"TableCell\";\r\n\r\nconst TableCaption = React.forwardRef<HTMLTableCaptionElement, React.HTMLAttributes<HTMLTableCaptionElement>>(({ className, ...props }, ref) => (\r\n <caption ref={ref} className={cn(\"mt-4 text-sm text-muted-foreground\", className)} {...props} />\r\n));\r\nTableCaption.displayName = \"TableCaption\";\r\n\r\nexport { Table, TableHeader, TableBody, TableFooter, TableHead, TableRow, TableCell, TableCaption };\r\n","\"use client\";\n\nimport Button from \"@/components/ui/Button\";\nimport { Combobox } from \"@/components/ui/Combobox\";\nimport { DatePicker } from \"@/components/ui/DatePicker\";\nimport DropdownMenu, { DropdownMenuItem } from \"@/components/ui/DropdownMenu\";\nimport Input from \"@/components/ui/Input\";\nimport { Pagination } from \"@/components/ui/Pagination\";\nimport { Popover } from \"@/components/ui/Popover\";\nimport { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from \"@/components/ui/Table\";\nimport { cn } from \"@/lib/utils/cn\";\nimport { Filter as FilterIcon } from \"lucide-react\";\nimport React from \"react\";\nimport { useTranslations } from \"@/lib/i18n/translation-adapter\";\n\ntype FilterType = \"text\" | \"select\" | \"date\";\n\nexport type DataTableColumn<T> = {\n key: string; // unique key\n title: React.ReactNode;\n dataIndex?: keyof T | string;\n width?: number | string;\n align?: \"left\" | \"center\" | \"right\";\n sortable?: boolean;\n filter?: { type: FilterType; options?: string[]; placeholder?: string };\n render?: (value: any, record: T, index: number) => React.ReactNode;\n visible?: boolean; // default true\n};\n\nexport type Sorter = { key: string; order: \"asc\" | \"desc\" } | null;\n\nexport interface DataTableQuery {\n filters: Record<string, any>;\n sort?: Sorter;\n page: number;\n pageSize: number;\n}\n\ninterface DataTableProps<T> {\n columns: DataTableColumn<T>[];\n data: T[];\n rowKey?: ((row: T) => string | number) | keyof T;\n loading?: boolean;\n total?: number;\n page?: number;\n pageSize?: number;\n pageSizeOptions?: number[]; // show page size selector if provided\n onQueryChange?: (q: DataTableQuery) => void; // server-side\n caption?: React.ReactNode;\n toolbar?: React.ReactNode;\n enableColumnVisibilityToggle?: boolean;\n enableDensityToggle?: boolean;\n enableHeaderAlignToggle?: boolean;\n striped?: boolean; // Bật/tắt màu nền sẽn kẽ cho các dòng\n /** Hiển thị đường kẻ dọc ngăn cách giữa các cột */\n columnDividers?: boolean;\n className?: string;\n /** Key để lưu pageSize vào localStorage. Nếu không cung cấp, pageSize sẽ không được persist */\n storageKey?: string;\n labels?: {\n density?: string;\n columns?: string;\n compact?: string;\n normal?: string;\n comfortable?: string;\n headerAlign?: string;\n alignLeft?: string;\n alignCenter?: string;\n alignRight?: string;\n };\n}\n\nfunction useDebounced<T>(value: T, delay = 300) {\n const [debounced, setDebounced] = React.useState(value);\n React.useEffect(() => {\n const id = setTimeout(() => setDebounced(value), delay);\n return () => clearTimeout(id);\n }, [value, delay]);\n return debounced;\n}\n\nexport function DataTable<T extends Record<string, any>>({\n columns,\n data,\n rowKey,\n loading,\n total = 0,\n page = 1,\n pageSize = 20,\n pageSizeOptions,\n onQueryChange,\n caption,\n toolbar,\n enableColumnVisibilityToggle = true,\n enableDensityToggle = true,\n enableHeaderAlignToggle = false,\n striped = true, // Mặc định bật màu nền sẽn kẽ cho các dòng\n columnDividers = false,\n className,\n storageKey,\n labels,\n}: DataTableProps<T>) {\n const t = useTranslations(\"Common\");\n const [headerAlign, setHeaderAlign] = React.useState<\"left\" | \"center\" | \"right\">(\"left\");\n const [visibleCols, setVisibleCols] = React.useState<string[]>(() => columns.filter((c) => c.visible !== false).map((c) => c.key));\n const [filters, setFilters] = React.useState<Record<string, any>>({});\n const [sort, setSort] = React.useState<Sorter>(null);\n const [density, setDensity] = React.useState<\"compact\" | \"normal\" | \"comfortable\">(\"normal\");\n const [curPage, setCurPage] = React.useState(page);\n\n // Track if component has mounted to prevent initial onQueryChange trigger\n const hasMounted = React.useRef(false);\n\n // Track if we loaded from localStorage to prevent prop override\n const loadedFromStorage = React.useRef(false);\n\n // Đọc pageSize từ localStorage nếu có storageKey\n const getInitialPageSize = React.useCallback(() => {\n if (typeof window === \"undefined\" || !storageKey) return pageSize;\n try {\n const saved = localStorage.getItem(`datatable_${storageKey}_pageSize`);\n if (saved) {\n const parsed = parseInt(saved, 10);\n if (!isNaN(parsed) && parsed > 0) {\n loadedFromStorage.current = true;\n return parsed;\n }\n }\n } catch {\n // localStorage không khả dụng\n }\n return pageSize;\n }, [storageKey, pageSize]);\n\n const [curPageSize, setCurPageSize] = React.useState(getInitialPageSize);\n\n // Lưu pageSize vào localStorage khi thay đổi (chỉ sau khi đã mount)\n React.useEffect(() => {\n if (typeof window === \"undefined\" || !storageKey) return;\n if (!hasMounted.current) return; // Không lưu khi mount lần đầu\n try {\n localStorage.setItem(`datatable_${storageKey}_pageSize`, String(curPageSize));\n } catch {\n // localStorage không khả dụng\n }\n }, [curPageSize, storageKey]);\n\n React.useEffect(() => {\n const newColKeys = columns.filter((c) => c.visible !== false).map((c) => c.key);\n setVisibleCols((prev) => {\n const uniqueKeys = new Set([...prev, ...newColKeys]);\n return [...uniqueKeys].filter((k) => columns.some((c) => c.key === k));\n });\n }, [columns]);\n\n const debouncedFilters = useDebounced(filters, 350);\n\n // Keep internal state in sync when parent controls page/pageSize\n React.useEffect(() => {\n setCurPage(page);\n }, [page]);\n\n // Chỉ sync pageSize từ parent nếu KHÔNG có storageKey hoặc chưa load từ localStorage\n React.useEffect(() => {\n if (storageKey && loadedFromStorage.current) {\n // Đã load từ localStorage, không ghi đè bằng prop\n return;\n }\n setCurPageSize(pageSize);\n }, [pageSize, storageKey]);\n\n // Emit query changes to parent (server-side mode)\n // Sử dụng hasMounted để tránh trigger onQueryChange khi mount lần đầu với giá trị từ localStorage\n React.useEffect(() => {\n if (!onQueryChange) return;\n\n // Không trigger onQueryChange lần đầu nếu đang dùng localStorage\n // để tránh infinite loop khi parent re-render\n if (!hasMounted.current) {\n hasMounted.current = true;\n return;\n }\n\n onQueryChange({ filters: debouncedFilters, sort, page: curPage, pageSize: curPageSize });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [debouncedFilters, sort, curPage, curPageSize]);\n\n const densityRowClass = density === \"compact\" ? \"h-9\" : density === \"comfortable\" ? \"h-14\" : \"h-12\";\n const cellPadding = density === \"compact\" ? \"py-1.5 px-3\" : density === \"comfortable\" ? \"py-3 px-4\" : \"py-2.5 px-4\";\n\n const visibleColumns = columns.filter((c) => visibleCols.includes(c.key));\n\n const getRowKey = (row: T, idx: number) => {\n if (!rowKey) return String(idx);\n if (typeof rowKey === \"function\") return String(rowKey(row));\n return String(row[rowKey as keyof T]);\n };\n\n const renderFilterControl = (col: DataTableColumn<T>) => {\n if (!col.filter) return null;\n const k = col.key;\n const commonProps = {\n className: \"h-8 w-full text-sm\",\n } as any;\n if (col.filter.type === \"text\") {\n return (\n <Input\n {...commonProps}\n placeholder={col.filter.placeholder || `Search ${String(col.title)}`}\n value={filters[k] || \"\"}\n onChange={(e) => {\n setCurPage(1);\n setFilters((f) => ({ ...f, [k]: e.target.value }));\n }}\n />\n );\n }\n if (col.filter.type === \"select\") {\n const options = col.filter.options || [];\n return (\n <Combobox\n options={[\"\", ...options]}\n size=\"sm\"\n className=\"w-full\"\n value={filters[k] ?? \"\"}\n onChange={(v) => {\n setCurPage(1);\n setFilters((f) => ({ ...f, [k]: v || undefined }));\n }}\n placeholder={col.filter.placeholder || `Select ${String(col.title)}`}\n />\n );\n }\n if (col.filter.type === \"date\") {\n return (\n <DatePicker\n placeholder={col.filter.placeholder || `Select ${String(col.title)}`}\n value={filters[k] || null}\n onChange={(d) => {\n setCurPage(1);\n setFilters((f) => ({ ...f, [k]: d ? (d as any) : undefined }));\n }}\n />\n );\n }\n return null;\n };\n\n const renderHeader = (\n <TableRow>\n {visibleColumns.map((col, colIdx) => (\n <TableHead\n key={col.key}\n style={{ width: col.width }}\n className={\n cn(\n // Use column-specific align if defined, otherwise use global headerAlign\n (col.align === \"right\" || (!col.align && headerAlign === \"right\")) && \"text-right\",\n (col.align === \"center\" || (!col.align && headerAlign === \"center\")) && \"text-center\",\n columnDividers && colIdx > 0 && \"border-l border-border/60\"\n ) as string\n }\n >\n {(() => {\n const isRightAlign = col.align === \"right\" || (!col.align && headerAlign === \"right\");\n const isCenterAlign = col.align === \"center\" || (!col.align && headerAlign === \"center\");\n\n const titleContent = (\n <div className=\"flex items-center gap-1 min-w-0 shrink\">\n <span className=\"truncate font-medium text-sm\">{col.title}</span>\n {col.sortable && (\n <button\n className={cn(\n \"p-1 rounded-sm transition-all duration-200 hover:bg-accent\",\n sort?.key === col.key ? \"opacity-100 bg-accent\" : \"opacity-60 hover:opacity-100\"\n )}\n onClick={() => {\n setCurPage(1);\n setSort((s) => {\n if (!s || s.key !== col.key) return { key: col.key, order: \"asc\" };\n if (s.order === \"asc\") return { key: col.key, order: \"desc\" };\n return null;\n });\n }}\n aria-label=\"Sort\"\n title={`Sort by ${String(col.title)}`}\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 20 20\" fill=\"none\" className=\"inline-block\">\n <path\n d=\"M7 8l3-3 3 3\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n opacity={sort?.key === col.key && sort.order === \"asc\" ? 1 : 0.4}\n />\n <path\n d=\"M7 12l3 3 3-3\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n opacity={sort?.key === col.key && sort.order === \"desc\" ? 1 : 0.4}\n />\n </svg>\n </button>\n )}\n </div>\n );\n\n const filterContent = col.filter && (\n <Popover\n placement={isRightAlign ? \"bottom-end\" : \"bottom-start\"}\n trigger={\n <button\n className={cn(\n \"p-1.5 rounded-md hover:bg-accent text-muted-foreground hover:text-foreground transition-colors\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background\",\n filters[col.key] && \"bg-accent text-foreground\"\n )}\n aria-label=\"Filter\"\n title=\"Filter\"\n >\n <FilterIcon className=\"h-4 w-4\" />\n </button>\n }\n >\n <div className=\"w-48 p-2 space-y-2\">\n <div className=\"text-xs font-medium text-muted-foreground mb-2\">Filter {col.title}</div>\n {renderFilterControl(col)}\n {filters[col.key] && (\n <button\n onClick={() => {\n setCurPage(1);\n setFilters((f) => {\n const newFilters = { ...f };\n delete newFilters[col.key];\n return newFilters;\n });\n }}\n className=\"text-xs text-destructive hover:underline\"\n >\n Clear filter\n </button>\n )}\n </div>\n </Popover>\n );\n\n return (\n <div\n className={cn(\n \"flex items-center gap-2 select-none min-h-10\",\n isRightAlign && \"justify-end\",\n isCenterAlign && \"justify-center\",\n !isRightAlign && !isCenterAlign && \"justify-between\"\n )}\n >\n {/* Khi căn phải: filter trước, title sau (đối xứng với căn trái) */}\n {isRightAlign ? (\n <>\n {filterContent}\n {titleContent}\n </>\n ) : (\n <>\n {titleContent}\n {filterContent}\n </>\n )}\n </div>\n );\n })()}\n </TableHead>\n ))}\n </TableRow>\n );\n\n const isServerMode = Boolean(onQueryChange);\n\n const processedData = React.useMemo(() => {\n if (isServerMode) return data;\n\n let result = [...data];\n\n // 1. Filter\n if (Object.keys(filters).length > 0) {\n result = result.filter((row) => {\n return Object.entries(filters).every(([key, value]) => {\n if (value === undefined || value === null || value === \"\") return true;\n\n const col = columns.find((c) => c.key === key);\n const rowValue = col?.dataIndex ? row[col.dataIndex as keyof T] : row[key];\n\n // Handle Date objects or specific types if needed\n if (col?.filter?.type === \"date\" && value instanceof Date) {\n // Simple date comparison (ignoring time for now or exact match)\n // For now, let's convert both to string or use a specific comparator\n // This is a basic implementation\n return new Date(rowValue).toDateString() === value.toDateString();\n }\n\n return String(rowValue ?? \"\")\n .toLowerCase()\n .includes(String(value).toLowerCase());\n });\n });\n }\n\n // 2. Sort\n if (sort) {\n result.sort((a, b) => {\n const col = columns.find((c) => c.key === sort.key);\n const aValue = col?.dataIndex ? a[col.dataIndex as keyof T] : a[sort.key];\n const bValue = col?.dataIndex ? b[col.dataIndex as keyof T] : b[sort.key];\n\n if (aValue === bValue) return 0;\n\n // Handle numbers\n if (typeof aValue === \"number\" && typeof bValue === \"number\") {\n return sort.order === \"asc\" ? aValue - bValue : bValue - aValue;\n }\n\n // Handle strings\n const compare = String(aValue).localeCompare(String(bValue));\n return sort.order === \"asc\" ? compare : -compare;\n });\n }\n\n return result;\n }, [data, isServerMode, filters, sort, columns]);\n\n const totalItems = isServerMode ? total : processedData.length;\n\n const displayedData = isServerMode\n ? data\n : React.useMemo(() => {\n const start = (curPage - 1) * curPageSize;\n // Ensure we don't slice out of bounds if page is too high for filtered results\n if (start >= processedData.length && curPage > 1) {\n // This effect will be handled by the pagination component or we should reset page here?\n // Ideally setCurPage(1) should happen when filter changes, which is already done in renderFilterControl\n }\n return processedData.slice(start, start + curPageSize);\n }, [processedData, curPage, curPageSize]);\n\n return (\n <div className={cn(\"space-y-2\", className)}>\n <div className=\"flex items-center justify-between gap-4 mb-1\">\n <div className=\"text-sm text-muted-foreground\">{caption}</div>\n <div className=\"flex items-center gap-2\">\n {enableDensityToggle && (\n <DropdownMenu\n trigger={\n <Button variant=\"ghost\" size=\"sm\" className=\"h-8 px-2\">\n <svg className=\"w-4 h-4 mr-1\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 6h16M4 10h16M4 14h16M4 18h16\" />\n </svg>\n {labels?.density || t(\"density\")}\n </Button>\n }\n items={[\n { label: (labels?.compact || t(\"compact\")) as string, onClick: () => setDensity(\"compact\") },\n { label: (labels?.normal || t(\"normal\")) as string, onClick: () => setDensity(\"normal\") },\n { label: (labels?.comfortable || t(\"comfortable\")) as string, onClick: () => setDensity(\"comfortable\") },\n ]}\n />\n )}\n {enableColumnVisibilityToggle && (\n <DropdownMenu\n trigger={\n <Button variant=\"ghost\" size=\"sm\" className=\"h-8 px-2\">\n <svg className=\"w-4 h-4 mr-1\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M9 17V7m0 10a2 2 0 01-2 2H5a2 2 0 01-2-2V7a2 2 0 012-2h2a2 2 0 012 2m0 10a2 2 0 002 2h2a2 2 0 002-2M9 7a2 2 0 012-2h2a2 2 0 012 2m0 10V7m0 10a2 2 0 002 2h2a2 2 0 002-2V7a2 2 0 00-2-2h-2a2 2 0 00-2 2\"\n />\n </svg>\n {labels?.columns || t(\"columns\")}\n </Button>\n }\n >\n {columns.map((c) => (\n <DropdownMenuItem\n key={c.key}\n onClick={() => {\n setVisibleCols((prev) => (prev.includes(c.key) ? prev.filter((k) => k !== c.key) : [...prev, c.key]));\n }}\n >\n <input type=\"checkbox\" className=\"mr-2 rounded border-border\" readOnly checked={visibleCols.includes(c.key)} />\n <span className=\"truncate\">{c.title as any}</span>\n </DropdownMenuItem>\n ))}\n </DropdownMenu>\n )}\n {enableHeaderAlignToggle && (\n <DropdownMenu\n trigger={\n <Button variant=\"ghost\" size=\"sm\" className=\"h-8 px-2\">\n <svg className=\"w-4 h-4 mr-1\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 6h16M4 12h10M4 18h16\" />\n </svg>\n {labels?.headerAlign || t(\"headerAlign\")}\n </Button>\n }\n items={[\n { label: (labels?.alignLeft || t(\"alignLeft\")) as string, onClick: () => setHeaderAlign(\"left\") },\n { label: (labels?.alignCenter || t(\"alignCenter\")) as string, onClick: () => setHeaderAlign(\"center\") },\n { label: (labels?.alignRight || t(\"alignRight\")) as string, onClick: () => setHeaderAlign(\"right\") },\n ]}\n />\n )}\n {toolbar}\n </div>\n </div>\n\n <div className={cn(\"relative rounded-md border border-border/50 overflow-hidden\", loading && \"opacity-60 pointer-events-none\")}>\n <Table\n containerClassName=\"border-0 md:border-0 rounded-none md:rounded-none shadow-none bg-transparent\"\n className=\"[&_thead]:sticky [&_thead]:top-0 [&_thead]:z-5 [&_thead]:bg-background [&_thead]:backdrop-blur-sm\"\n >\n <TableHeader>{renderHeader}</TableHeader>\n <TableBody>\n {loading ? (\n <TableRow>\n <TableCell colSpan={visibleColumns.length} className=\"text-center py-8\">\n <div className=\"flex items-center justify-center gap-2 text-muted-foreground\">\n <svg className=\"animate-spin h-4 w-4\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle className=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"4\"></circle>\n <path\n className=\"opacity-75\"\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\n ></path>\n </svg>\n <span className=\"text-sm\">Loading...</span>\n </div>\n </TableCell>\n </TableRow>\n ) : !displayedData || displayedData.length === 0 ? (\n <TableRow>\n <TableCell colSpan={visibleColumns.length} className=\"text-center py-6 text-muted-foreground\">\n No data\n </TableCell>\n </TableRow>\n ) : (\n displayedData.map((row, idx) => {\n const isLastRow = idx === displayedData.length - 1;\n return (\n <TableRow key={getRowKey(row, idx)} className={cn(densityRowClass, striped && idx % 2 === 0 && \"bg-muted/50\")}>\n {visibleColumns.map((col, colIdx) => {\n const value = col.dataIndex ? row[col.dataIndex as keyof T] : undefined;\n return (\n <TableCell\n key={col.key}\n className={\n cn(\n cellPadding,\n col.align === \"right\" && \"text-right\",\n col.align === \"center\" && \"text-center\",\n columnDividers && colIdx > 0 && \"border-l border-border/60\",\n isLastRow && col === visibleColumns[0] && \"rounded-bl-md\",\n isLastRow && col === visibleColumns[visibleColumns.length - 1] && \"rounded-br-md\"\n ) as string\n }\n >\n {col.render ? col.render(value, row, idx) : String(value ?? \"\")}\n </TableCell>\n );\n })}\n </TableRow>\n );\n })\n )}\n </TableBody>\n </Table>\n </div>\n\n {totalItems > 0 && (\n <div className=\"border-t bg-muted/30 p-4 rounded-b-md\">\n <Pagination\n page={curPage}\n totalPages={Math.ceil(totalItems / curPageSize)}\n onChange={(p) => setCurPage(p)}\n className=\"\"\n showInfo\n totalItems={totalItems}\n pageSize={curPageSize}\n pageSizeOptions={pageSizeOptions}\n onPageSizeChange={(s) => {\n setCurPage(1);\n setCurPageSize(s);\n }}\n />\n </div>\n )}\n </div>\n );\n}\n\nexport default DataTable;\n","\"use client\";\n\nimport * as React from \"react\";\n// Remove radix-ui imports as they are no longer needed\nimport { Controller, ControllerProps, FieldPath, FieldValues, FormProvider, useFormContext, useForm, SubmitHandler } from \"react-hook-form\";\nimport { useTranslations } from \"@/lib/i18n/translation-adapter\";\n\nimport { cn } from \"@/lib/utils/cn\";\nimport { Label } from \"@/components/ui/label\";\nimport Input from \"@/components/ui/Input\";\nimport Button from \"@/components/ui/Button\";\nimport { Checkbox } from \"@/components/ui/CheckBox\";\n\n// Form wrapper with validation support\ninterface FormWrapperProps<T extends FieldValues = FieldValues> {\n children: React.ReactNode;\n onSubmit: SubmitHandler<T>;\n initialValues?: Partial<T>;\n validationSchema?: Record<string, any>; // Simple validation schema\n className?: string;\n size?: \"sm\" | \"md\" | \"lg\"; // unify inner control sizes\n}\n\n// Provide form-level config (e.g., size) to inner controls\ntype FormConfig = { size: \"sm\" | \"md\" | \"lg\" };\nconst FormConfigContext = React.createContext<FormConfig>({ size: \"md\" });\n\nconst FormWrapper = <T extends FieldValues = FieldValues>({\n children,\n onSubmit,\n initialValues,\n validationSchema,\n className,\n size = \"md\",\n ...props\n}: FormWrapperProps<T>) => {\n const methods = useForm<T>({\n defaultValues: initialValues as any,\n });\n\n // Keep form in sync when initialValues change\n React.useEffect(() => {\n if (initialValues) {\n methods.reset(initialValues as any);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [JSON.stringify(initialValues)]);\n\n // Extract DOM-unsafe props\n const { validationSchema: _, ...formProps } = props as any;\n\n return (\n <FormProvider {...methods}>\n <FormConfigContext.Provider value={{ size }}>\n <form onSubmit={methods.handleSubmit(onSubmit)} className={className} {...formProps}>\n {children}\n </form>\n </FormConfigContext.Provider>\n </FormProvider>\n );\n};\n\n// For backward compatibility, let Form be the wrapper by default\nconst Form = FormWrapper;\n\ntype FormFieldContextValue<TFieldValues extends FieldValues = FieldValues, TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>> = {\n name: TName;\n};\n\nconst FormFieldContext = React.createContext<FormFieldContextValue>({} as FormFieldContextValue);\n\nconst FormField = <TFieldValues extends FieldValues = FieldValues, TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>>({\n ...props\n}: ControllerProps<TFieldValues, TName>) => {\n return (\n <FormFieldContext.Provider value={{ name: props.name }}>\n <Controller {...props} />\n </FormFieldContext.Provider>\n );\n};\n\nconst useFormField = () => {\n const fieldContext = React.useContext(FormFieldContext);\n const itemContext = React.useContext(FormItemContext);\n const { getFieldState, formState } = useFormContext();\n\n if (!fieldContext) {\n // Only access i18n when we actually need the message, to avoid\n // requiring the 'Form' namespace in all consumers.\n try {\n const t = useTranslations(\"Form\");\n throw new Error(t(\"validation.mustBeUsedWithinForm\"));\n } catch {\n throw new Error(\"useFormField must be used within FormField\");\n }\n }\n\n const fieldState = getFieldState(fieldContext.name, formState);\n\n const { id } = itemContext;\n\n return {\n id,\n name: fieldContext.name,\n formItemId: `${id}-form-item`,\n formDescriptionId: `${id}-form-item-description`,\n formMessageId: `${id}-form-item-message`,\n ...fieldState,\n };\n};\n\nconst FormItemContext = React.createContext<FormItemContextValue>({} as FormItemContextValue);\n\ntype FormItemContextValue = {\n id: string;\n};\n\nconst FormItem = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(({ className, ...props }, ref) => {\n const id = React.useId();\n\n return (\n <FormItemContext.Provider value={{ id }}>\n <div ref={ref} className={cn(\"space-y-2\", className)} {...props} />\n </FormItemContext.Provider>\n );\n});\nFormItem.displayName = \"FormItem\";\n\nconst FormLabel = React.forwardRef<HTMLLabelElement, React.LabelHTMLAttributes<HTMLLabelElement> & { required?: boolean }>(\n ({ className, children, required, ...props }, ref) => {\n const { error, formItemId } = useFormField();\n const config = React.useContext(FormConfigContext);\n const sizeClass = config.size === \"sm\" ? \"text-xs\" : config.size === \"lg\" ? \"text-base\" : \"text-sm\";\n\n return (\n <Label ref={ref} className={cn(sizeClass, error && \"text-destructive\", className)} htmlFor={formItemId} {...props}>\n {children}\n {required && <span className=\"text-destructive ml-1\">*</span>}\n </Label>\n );\n }\n);\nFormLabel.displayName = \"FormLabel\";\n\nconst FormControl = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(({ ...props }, ref) => {\n const { error, formItemId, formDescriptionId, formMessageId } = useFormField();\n\n return (\n <div\n ref={ref}\n id={formItemId}\n aria-describedby={!error ? `${formDescriptionId}` : `${formDescriptionId} ${formMessageId}`}\n aria-invalid={!!error}\n {...props}\n />\n );\n});\nFormControl.displayName = \"FormControl\";\n\nconst FormDescription = React.forwardRef<HTMLParagraphElement, React.HTMLAttributes<HTMLParagraphElement>>(({ className, ...props }, ref) => {\n const { formDescriptionId } = useFormField();\n\n return <p ref={ref} id={formDescriptionId} className={cn(\"text-sm text-muted-foreground\", className)} {...props} />;\n});\nFormDescription.displayName = \"FormDescription\";\n\nconst FormMessage = React.forwardRef<HTMLParagraphElement, React.HTMLAttributes<HTMLParagraphElement>>(({ className, children, ...props }, ref) => {\n const { error, formMessageId } = useFormField();\n const body = error ? String(error?.message) : children;\n\n if (!body) {\n return null;\n }\n\n return (\n <p ref={ref} id={formMessageId} className={cn(\"text-sm font-medium text-destructive\", className)} {...props}>\n {body}\n </p>\n );\n});\nFormMessage.displayName = \"FormMessage\";\n\n// Additional form components for compatibility\nconst FormInput = React.forwardRef<HTMLInputElement, React.ComponentProps<typeof Input> & { name: string }>(({ name, ...props }, ref) => (\n <FormConfigContext.Consumer>\n {({ size }) => (\n <FormField\n name={name}\n render={({ field }) => (\n <FormItem>\n <FormControl>\n <Input size={props.size ?? size} {...field} {...props} />\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n )}\n </FormConfigContext.Consumer>\n));\nFormInput.displayName = \"FormInput\";\n\nconst FormCheckbox = React.forwardRef<HTMLInputElement, React.ComponentProps<typeof Checkbox> & { name: string }>(({ name, ...props }, ref) => (\n <FormConfigContext.Consumer>\n {({ size }) => (\n <FormField\n name={name}\n render={({ field }) => (\n <FormItem>\n <FormControl>\n <Checkbox\n ref={ref}\n checked={field.value}\n onChange={(e) => field.onChange(e.target.checked)}\n labelClassName={cn(\n // align label text size with inputs/buttons by form size\n size === \"sm\" ? \"text-xs\" : size === \"lg\" ? \"text-base\" : \"text-sm\",\n (props as any).labelClassName\n )}\n {...props}\n />\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n )}\n </FormConfigContext.Consumer>\n));\nFormCheckbox.displayName = \"FormCheckbox\";\n\nconst FormActions = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(({ className, ...props }, ref) => (\n <div ref={ref} className={cn(\"flex gap-2 justify-end\", className)} {...props} />\n));\nFormActions.displayName = \"FormActions\";\n\nconst FormSubmitButton = React.forwardRef<HTMLButtonElement, React.ComponentProps<typeof Button> & { loading?: boolean }>(\n ({ children, loading, ...props }, ref) => (\n <FormConfigContext.Consumer>\n {({ size }) => (\n <Button ref={ref} type=\"submit\" size={(props.size as any) ?? size} disabled={loading} {...props}>\n {children}\n </Button>\n )}\n </FormConfigContext.Consumer>\n )\n);\nFormSubmitButton.displayName = \"FormSubmitButton\";\n\nexport {\n useFormField,\n Form,\n FormItem,\n FormLabel,\n FormControl,\n FormDescription,\n FormField,\n FormMessage,\n FormInput,\n FormCheckbox,\n FormActions,\n FormSubmitButton,\n};\n","\"use client\";\r\n\r\nimport { ExternalLink } from \"lucide-react\";\r\nimport Button from \"@/components/ui/Button\";\r\nimport Modal from \"@/components/ui/Modal\";\r\nimport { cn } from \"@/lib/utils/cn\";\r\nimport { useTranslations } from \"@/lib/i18n/translation-adapter\";\r\n\r\ninterface NotificationItem {\r\n id: number;\r\n title?: string;\r\n body?: string;\r\n type?: string;\r\n is_read: boolean;\r\n created_at: string;\r\n metadata?: any;\r\n}\r\n\r\ninterface NotificationModalProps {\r\n isOpen: boolean;\r\n onClose: () => void;\r\n notification: NotificationItem | null;\r\n titleText?: string;\r\n openLinkText?: string;\r\n closeText?: string;\r\n}\r\n\r\nexport function NotificationModal({ isOpen, onClose, notification, titleText, openLinkText, closeText }: NotificationModalProps) {\r\n const t = useTranslations(\"Common\");\r\n\r\n if (!notification) return null;\r\n\r\n const formatTime = (dateString: string) => {\r\n const date = new Date(dateString);\r\n return date.toLocaleString(undefined, {\r\n year: \"numeric\",\r\n month: \"2-digit\",\r\n day: \"2-digit\",\r\n hour: \"2-digit\",\r\n minute: \"2-digit\",\r\n });\r\n };\r\n\r\n const hasLink = notification.metadata?.link;\r\n\r\n const handleLinkClick = () => {\r\n if (hasLink) {\r\n window.open(notification.metadata.link, \"_blank\");\r\n onClose();\r\n }\r\n };\r\n\r\n return (\r\n <Modal isOpen={isOpen} onClose={onClose} title={titleText || t(\"notifications\")} size=\"md\">\r\n <div className=\"space-y-4\">\r\n {/* Status indicator */}\r\n <div className=\"flex items-center gap-2 pb-2 border-b border-border\">\r\n <div className={cn(\"w-2 h-2 rounded-full\", !notification.is_read ? \"bg-primary\" : \"bg-border\")} />\r\n <span className=\"text-xs text-muted-foreground\">{!notification.is_read ? t(\"newNotification\") : t(\"readStatus\")}</span>\r\n </div>\r\n\r\n {notification.title && <h3 className=\"text-lg font-semibold text-foreground\">{notification.title}</h3>}\r\n\r\n {notification.body && <div className=\"text-sm text-muted-foreground whitespace-pre-wrap leading-relaxed\">{notification.body}</div>}\r\n\r\n <div className=\"text-xs text-muted-foreground border-t border-border pt-2\">{formatTime(notification.created_at)}</div>\r\n\r\n {/* Actions */}\r\n <div className=\"flex gap-2 justify-end pt-2\">\r\n {hasLink && (\r\n <Button variant=\"primary\" size=\"sm\" onClick={handleLinkClick} className=\"gap-2\">\r\n <ExternalLink className=\"w-4 h-4\" />\r\n {openLinkText || t(\"openLink\")}\r\n </Button>\r\n )}\r\n <Button variant=\"ghost\" size=\"sm\" onClick={onClose}>\r\n {closeText || t(\"close\")}\r\n </Button>\r\n </div>\r\n </div>\r\n </Modal>\r\n );\r\n}\r\n\r\nexport default NotificationModal;\r\n","\"use client\";\n\nimport Link from \"next/link\";\nimport { usePathname } from \"next/navigation\";\nimport { Phone } from \"lucide-react\";\nimport { cn } from \"@/lib/utils/cn\";\n\ninterface FloatingContactsProps {\n className?: string;\n}\n\n// Brand icons as inline SVGs\nfunction MessengerIcon(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg viewBox=\"0 0 24 24\" width={24} height={24} aria-hidden=\"true\" {...props}>\n <path\n d=\"M12 2C6.477 2 2 6.145 2 11.235c0 2.93 1.35 5.542 3.464 7.25v3.515l3.344-1.836c.894.247 1.843.375 2.192.375 5.523 0 10-4.145 10-9.235S17.523 2 12 2zm.994 12.444l-2.563-2.73-5.004 2.73 5.507-5.84 2.626 2.729 4.942-2.729-5.508 5.84z\"\n fill=\"white\"\n />\n </svg>\n );\n}\n\nfunction ZaloIcon(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg viewBox=\"0 0 48 48\" width={20} height={20} aria-hidden=\"true\" {...props}>\n <path\n fill=\"white\"\n d=\"M24 4C12.954 4 4 12.954 4 24s8.954 20 20 20 20-8.954 20-20S35.046 4 24 4zm6.164 27.602h-4.239c-.405 0-.732-.328-.732-.732v-7.596l-2.646 7.933c-.096.288-.366.482-.67.482h-1.773c-.304 0-.574-.194-.67-.482l-2.647-7.933v7.596c0 .405-.327.732-.732.732h-2.873c-.405 0-.732-.328-.732-.732V17.134c0-.405.327-.732.732-.732h3.91c.32 0 .602.208.698.514l2.68 8.042 2.68-8.042c.096-.306.378-.514.698-.514h3.91c.405 0 .732.327.732.732v14.466c0 .404-.327.732-.732.732z\"\n />\n </svg>\n );\n}\n\nfunction InstagramIcon(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg viewBox=\"0 0 24 24\" width={20} height={20} aria-hidden=\"true\" fill=\"white\" {...props}>\n <path d=\"M12 2.163c3.204 0 3.584.012 4.85.07 3.252.148 4.771 1.691 4.919 4.919.058 1.265.069 1.645.069 4.849 0 3.205-.012 3.584-.069 4.849-.149 3.225-1.664 4.771-4.919 4.919-1.266.058-1.644.07-4.85.07-3.204 0-3.584-.012-4.849-.07-3.26-.149-4.771-1.699-4.919-4.92-.058-1.265-.07-1.644-.07-4.849 0-3.204.013-3.583.07-4.849.149-3.227 1.664-4.771 4.919-4.919 1.266-.057 1.645-.069 4.849-.069zm0-2.163c-3.259 0-3.667.014-4.947.072-4.358.2-6.78 2.618-6.98 6.98-.059 1.281-.073 1.689-.073 4.948 0 3.259.014 3.668.072 4.948.2 4.358 2.618 6.78 6.98 6.98 1.281.058 1.689.072 4.948.072 3.259 0 3.668-.014 4.948-.072 4.354-.2 6.782-2.618 6.979-6.98.059-1.28.073-1.689.073-4.948 0-3.259-.014-3.667-.072-4.947-.196-4.354-2.617-6.78-6.979-6.98-1.281-.059-1.69-.073-4.949-.073zm0 5.838c-3.403 0-6.162 2.759-6.162 6.162s2.759 6.163 6.162 6.163 6.162-2.759 6.162-6.163c0-3.403-2.759-6.162-6.162-6.162zm0 10.162c-2.209 0-4-1.79-4-4 0-2.209 1.791-4 4-4s4 1.791 4 4c0 2.21-1.791 4-4 4zm6.406-11.845c-.796 0-1.441.645-1.441 1.44s.645 1.44 1.441 1.44c.795 0 1.439-.645 1.439-1.44s-.644-1.44-1.439-1.44z\" />\n </svg>\n );\n}\n\nexport default function FloatingContacts({ className }: FloatingContactsProps) {\n const pathname = usePathname();\n if (pathname?.includes(\"/admin\")) return null;\n\n const hotline = process.env.NEXT_PUBLIC_HOTLINE || \"0962209870\";\n const zalo = process.env.NEXT_PUBLIC_ZALO || \"0356611301\";\n const messenger = process.env.NEXT_PUBLIC_MESSENGER_URL || \"https://m.me/thejojoflowers\";\n const instagram = process.env.NEXT_PUBLIC_INSTAGRAM_URL || \"https://www.instagram.com/thejojoflowers\";\n\n // Order: Zalo → Messenger → Instagram (phone rendered first)\n const moreItems = [\n {\n key: \"zalo\",\n href: `https://zalo.me/${zalo.replace(/\\D/g, \"\")}`,\n label: \"Zalo\",\n bg: \"bg-[#0068FF]\",\n Icon: ZaloIcon,\n external: true,\n },\n {\n key: \"messenger\",\n href: messenger,\n label: \"Messenger\",\n bg: \"bg-[#0084FF]\",\n Icon: MessengerIcon,\n external: true,\n },\n {\n key: \"instagram\",\n href: instagram,\n label: \"Instagram\",\n bg: \"bg-[#E1306C]\",\n Icon: InstagramIcon,\n external: true,\n },\n ];\n\n return (\n <div className={cn(\"fixed bottom-6 right-4 z-100000\", \"flex flex-col items-end gap-3\", className)} aria-label=\"Quick contacts\">\n {/* Phone on top */}\n <Link\n href={`tel:${hotline.replace(/\\D/g, \"\")}`}\n aria-label=\"Gọi\"\n className={cn(\n \"w-12 h-12 rounded-full text-white shadow-lg leading-none\",\n \"grid place-items-center\",\n \"hover:scale-105 active:scale-95 transition-transform\",\n \"bg-[#22c55e]\"\n )}\n >\n <Phone className=\"w-6 h-6\" />\n </Link>\n\n {/* Then Zalo → Messenger → Instagram */}\n {moreItems.map(({ key, href, label, bg, Icon, external }) => (\n <Link\n key={key}\n href={href}\n {...(external ? { target: \"_blank\", rel: \"noopener noreferrer\" } : {})}\n aria-label={label}\n className={cn(\n \"w-12 h-12 rounded-full text-white shadow-lg leading-none\",\n \"grid place-items-center\",\n \"hover:scale-105 active:scale-95 transition-transform\",\n bg\n )}\n >\n <Icon className=\"w-6 h-6\" />\n </Link>\n ))}\n </div>\n );\n}\n","\"use client\";\n\nimport Card from \"@/components/ui/Card\";\nimport { cn } from \"@/lib/utils/cn\";\nimport { Ban, Lock, ShieldAlert } from \"lucide-react\";\nimport React from \"react\";\n\ntype Variant = \"destructive\" | \"warning\" | \"info\";\n\ninterface AccessDeniedProps {\n title?: string;\n description?: string;\n variant?: Variant;\n icon?: React.ComponentType<{ className?: string }>;\n className?: string;\n children?: React.ReactNode; // actions\n}\n\nconst VARIANT_STYLES: Record<Variant, { bg: string; border: string; text: string }> = {\n destructive: { bg: \"bg-destructive/5\", border: \"border-destructive/20\", text: \"text-destructive\" },\n warning: { bg: \"bg-warning/5\", border: \"border-warning/20\", text: \"text-warning\" },\n info: { bg: \"bg-info/5\", border: \"border-info/20\", text: \"text-info\" },\n};\n\nconst DEFAULT_ICONS: Record<Variant, React.ComponentType<{ className?: string }>> = {\n destructive: ShieldAlert,\n warning: Ban,\n info: Lock,\n};\n\nexport default function AccessDenied({\n title = \"Access Restricted\",\n description = \"You do not have permission to access this area.\",\n variant = \"destructive\",\n icon: Icon,\n className,\n children,\n}: AccessDeniedProps) {\n const styles = VARIANT_STYLES[variant];\n const UsedIcon = Icon || DEFAULT_ICONS[variant];\n\n return (\n <Card className={cn(\"p-8 text-center shadow-sm\", styles.bg, styles.border, className)}>\n <div className=\"flex flex-col items-center gap-4\">\n <div className={cn(\"p-3 rounded-lg\", styles.bg.replace(\"/5\", \"/10\"))}>\n <UsedIcon className={cn(\"w-8 h-8\", styles.text)} />\n </div>\n <div>\n <h3 className={cn(\"font-semibold mb-2\", styles.text)}>{title}</h3>\n <p className={cn(styles.text.replace(\"text-\", \"text-\") + \"/80\", \"text-sm\")}>{description}</p>\n </div>\n {children && <div className=\"mt-2 flex flex-wrap gap-2 justify-center\">{children}</div>}\n </div>\n </Card>\n );\n}\n","\"use client\";\n\nimport { Moon, Sun, Monitor } from \"lucide-react\";\nimport Button from \"./Button\";\nimport { cn } from \"@/lib/utils/cn\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\n\nexport type ThemeMode = \"light\" | \"dark\" | \"system\";\n\nexport interface ThemeToggleHeadlessProps {\n theme: ThemeMode;\n onChange: (theme: ThemeMode) => void;\n labels?: {\n heading?: string;\n light?: string;\n dark?: string;\n system?: string;\n };\n className?: string;\n}\n\nexport default function ThemeToggleHeadless({\n theme,\n onChange,\n labels,\n className,\n}: ThemeToggleHeadlessProps) {\n const [isOpen, setIsOpen] = useState(false);\n const [mounted, setMounted] = useState(false);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const [dropdownPosition, setDropdownPosition] = useState<{ top: number; left: number; width: number } | null>(null);\n\n useEffect(() => setMounted(true), []);\n\n const themes = [\n { value: \"light\" as const, label: labels?.light ?? \"Light\", icon: Sun },\n { value: \"dark\" as const, label: labels?.dark ?? \"Dark\", icon: Moon },\n { value: \"system\" as const, label: labels?.system ?? \"System\", icon: Monitor },\n ];\n\n const current = mounted ? themes.find((t) => t.value === theme) || themes[2] : themes[2];\n const CurrentIcon = current.icon;\n\n const calculatePosition = () => {\n const rect = triggerRef.current?.getBoundingClientRect();\n if (!rect) return null;\n const scrollTop = window.pageYOffset || document.documentElement.scrollTop;\n const scrollLeft = window.pageXOffset || document.documentElement.scrollLeft;\n const width = 192; // w-48\n const left = rect.right + scrollLeft - width;\n const top = rect.bottom + scrollTop + 8;\n return { top, left, width };\n };\n\n return (\n <div className={cn(\"relative\", className)}>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n ref={triggerRef}\n onClick={() => {\n const next = !isOpen;\n if (next) {\n const pos = calculatePosition();\n if (pos) setDropdownPosition(pos);\n }\n setIsOpen(next);\n }}\n className=\"bg-muted hover:bg-accent\"\n aria-haspopup=\"menu\"\n aria-expanded={isOpen}\n aria-label={labels?.heading ?? \"Theme\"}\n >\n <CurrentIcon className=\"h-5 w-5\" />\n </Button>\n\n {isOpen && (\n <>\n {typeof window !== \"undefined\" &&\n createPortal(<div className=\"fixed inset-0 z-9998\" onClick={() => setIsOpen(false)} />, document.body)}\n\n {typeof window !== \"undefined\" && dropdownPosition &&\n createPortal(\n <div\n className=\"z-9999 bg-card border border-border rounded-lg shadow-lg overflow-hidden\"\n style={{ position: \"absolute\", top: dropdownPosition.top, left: dropdownPosition.left, width: dropdownPosition.width }}\n onMouseDown={(e) => e.stopPropagation()}\n role=\"menu\"\n >\n <div className=\"p-2\">\n <div className=\"px-3 py-2 text-sm font-medium text-muted-foreground border-b border-border mb-2\">\n {labels?.heading ?? \"Theme\"}\n </div>\n {themes.map((opt) => {\n const Icon = opt.icon;\n const active = theme === opt.value;\n return (\n <Button\n key={opt.value}\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => {\n onChange(opt.value);\n setIsOpen(false);\n }}\n className={cn(\n \"w-full justify-start gap-3 h-auto py-2 px-3\",\n active && \"bg-primary/10 text-primary\"\n )}\n role=\"menuitemradio\"\n aria-checked={active}\n >\n <Icon className=\"h-4 w-4\" />\n <span className=\"flex-1 text-left\">{opt.label}</span>\n {active && <div className=\"w-2 h-2 rounded-full bg-primary\" />}\n </Button>\n );\n })}\n </div>\n </div>,\n document.body\n )}\n </>\n )}\n </div>\n );\n}\n\n","\"use client\";\n\nimport React, { useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { Globe } from \"lucide-react\";\nimport Button from \"./Button\";\nimport { cn } from \"@/lib/utils/cn\";\n\nexport interface LanguageOption {\n code: string;\n name: string;\n flag?: string;\n}\n\nexport interface LanguageSwitcherHeadlessProps {\n locales: LanguageOption[];\n currentLocale: string;\n onSwitch: (code: string) => void;\n labels?: { heading?: string };\n className?: string;\n}\n\nexport default function LanguageSwitcherHeadless({\n locales,\n currentLocale,\n onSwitch,\n labels,\n className,\n}: LanguageSwitcherHeadlessProps) {\n const [isOpen, setIsOpen] = useState(false);\n const [dropdownPosition, setDropdownPosition] = useState<{ top: number; left: number; width: number } | null>(null);\n const triggerButtonRef = useRef<HTMLButtonElement>(null);\n\n const currentLanguage = locales.find((l) => l.code === currentLocale) || locales[0];\n\n const calculatePosition = () => {\n const rect = triggerButtonRef.current?.getBoundingClientRect();\n if (!rect) return null;\n const scrollTop = window.pageYOffset || document.documentElement.scrollTop;\n const scrollLeft = window.pageXOffset || document.documentElement.scrollLeft;\n const width = 192; // w-48\n const left = rect.right + scrollLeft - width;\n const top = rect.bottom + scrollTop + 8;\n return { top, left, width };\n };\n\n return (\n <div className={cn(\"relative\", className)}>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n ref={triggerButtonRef}\n onClick={() => {\n const next = !isOpen;\n if (next) {\n const pos = calculatePosition();\n if (pos) setDropdownPosition(pos);\n }\n setIsOpen(next);\n }}\n className=\"bg-muted hover:bg-accent\"\n aria-haspopup=\"menu\"\n aria-expanded={isOpen}\n aria-label={labels?.heading ?? \"Language\"}\n title={labels?.heading ?? \"Language\"}\n >\n <Globe className=\"h-5 w-5\" />\n </Button>\n\n {isOpen && (\n <>\n {typeof window !== \"undefined\" && createPortal(<div className=\"fixed inset-0 z-9998\" onClick={() => setIsOpen(false)} />, document.body)}\n {typeof window !== \"undefined\" && dropdownPosition &&\n createPortal(\n <div\n className=\"z-9999 bg-card border border-border rounded-lg shadow-lg overflow-hidden\"\n style={{ position: \"absolute\", top: dropdownPosition.top, left: dropdownPosition.left, width: dropdownPosition.width }}\n onMouseDown={(e) => e.stopPropagation()}\n role=\"menu\"\n >\n <div className=\"p-2\">\n <div className=\"px-3 py-2 text-sm font-medium text-muted-foreground border-b border-border mb-2\">\n {labels?.heading ?? \"Language\"}\n </div>\n\n {locales.map((language) => (\n <Button\n key={language.code}\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => {\n onSwitch(language.code);\n setIsOpen(false);\n }}\n className={cn(\"w-full justify-start gap-3 h-auto py-2 px-3\", currentLocale === language.code && \"bg-primary/10 text-primary\")}\n role=\"menuitemradio\"\n aria-checked={currentLocale === language.code}\n >\n {language.flag && <span className=\"text-lg\">{language.flag}</span>}\n <span className=\"flex-1 text-left\">{language.name}</span>\n {currentLocale === language.code && <div className=\"w-2 h-2 rounded-full bg-primary\" />}\n </Button>\n ))}\n </div>\n </div>,\n document.body\n )}\n </>\n )}\n </div>\n );\n}\n\n","import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\n/**\n * Utility function to merge Tailwind CSS classes.\n * Combines clsx for conditional classes and tailwind-merge for deduplication.\n *\n * @param inputs - Class values to merge\n * @returns Merged class string\n *\n * @example\n * ```tsx\n * cn(\"px-4 py-2\", isActive && \"bg-primary\", className)\n * // => \"px-4 py-2 bg-primary your-custom-class\"\n * ```\n */\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","/**\n * Date formatting utilities with locale support\n * Provides consistent date/time formatting across the application\n *\n * @example\n * ```tsx\n * import { DateUtils } from \"@underverse-ui/underverse\";\n *\n * // Format date with default locale (en)\n * DateUtils.formatDate(new Date()); // \"December 25, 2024\"\n *\n * // Format date with Vietnamese locale\n * DateUtils.formatDate(new Date(), \"vi\"); // \"25 tháng 12, 2024\"\n * ```\n */\n\nexport type SupportedLocale = \"en\" | \"vi\" | \"ko\" | \"ja\";\n\nconst localeMap: Record<SupportedLocale, string> = {\n en: \"en-US\",\n vi: \"vi-VN\",\n ko: \"ko-KR\",\n ja: \"ja-JP\",\n};\n\n/**\n * Get the browser locale string for a supported locale\n */\nfunction getLocaleString(locale: SupportedLocale = \"en\"): string {\n return localeMap[locale] || localeMap.en;\n}\n\n/**\n * Format date to readable format\n * @example\n * formatDate(new Date(), \"vi\") // \"25 tháng 12, 2024\"\n * formatDate(new Date(), \"en\") // \"December 25, 2024\"\n */\nexport function formatDate(date: string | Date | null | undefined, locale: SupportedLocale = \"en\"): string {\n if (!date) return \"\";\n const d = new Date(date);\n if (isNaN(d.getTime())) return \"\";\n\n return d.toLocaleDateString(getLocaleString(locale), {\n day: \"numeric\",\n month: \"long\",\n year: \"numeric\",\n });\n}\n\n/**\n * Format date to short format\n * @example\n * formatDateShort(new Date(), \"vi\") // \"25/12/2024\"\n * formatDateShort(new Date(), \"en\") // \"12/25/2024\"\n */\nexport function formatDateShort(date: string | Date | null | undefined, locale: SupportedLocale = \"en\"): string {\n if (!date) return \"\";\n const d = new Date(date);\n if (isNaN(d.getTime())) return \"\";\n\n return d.toLocaleDateString(getLocaleString(locale), {\n day: \"2-digit\",\n month: \"2-digit\",\n year: \"numeric\",\n });\n}\n\n/**\n * Format time only\n * @example formatTime(new Date()) // \"14:30\"\n */\nexport function formatTime(date: string | Date | null | undefined, locale: SupportedLocale = \"en\"): string {\n if (!date) return \"\";\n const d = new Date(date);\n if (isNaN(d.getTime())) return \"\";\n\n return d.toLocaleTimeString(getLocaleString(locale), {\n hour: \"2-digit\",\n minute: \"2-digit\",\n });\n}\n\n/**\n * Format date and time\n * @example\n * formatDateTime(new Date(), \"vi\") // \"25/12/2024 14:30\"\n */\nexport function formatDateTime(date: string | Date | null | undefined, locale: SupportedLocale = \"en\"): string {\n if (!date) return \"\";\n const d = new Date(date);\n if (isNaN(d.getTime())) return \"\";\n\n return d.toLocaleString(getLocaleString(locale), {\n day: \"2-digit\",\n month: \"2-digit\",\n year: \"numeric\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n });\n}\n\n/**\n * Format relative time (time ago)\n * @example\n * formatTimeAgo(new Date(Date.now() - 60000), \"vi\") // \"1 phút trước\"\n * formatTimeAgo(new Date(Date.now() - 60000), \"en\") // \"1 minute ago\"\n */\nexport function formatTimeAgo(date: string | Date | null | undefined, locale: SupportedLocale = \"en\"): string {\n if (!date) return \"\";\n const d = new Date(date);\n if (isNaN(d.getTime())) return \"\";\n\n const now = new Date();\n const diffMs = now.getTime() - d.getTime();\n const diffSec = Math.floor(diffMs / 1000);\n const diffMin = Math.floor(diffSec / 60);\n const diffHour = Math.floor(diffMin / 60);\n const diffDay = Math.floor(diffHour / 24);\n const diffWeek = Math.floor(diffDay / 7);\n const diffMonth = Math.floor(diffDay / 30);\n const diffYear = Math.floor(diffDay / 365);\n\n const labels = {\n en: {\n justNow: \"Just now\",\n minute: (n: number) => `${n} minute${n > 1 ? \"s\" : \"\"} ago`,\n hour: (n: number) => `${n} hour${n > 1 ? \"s\" : \"\"} ago`,\n day: (n: number) => `${n} day${n > 1 ? \"s\" : \"\"} ago`,\n week: (n: number) => `${n} week${n > 1 ? \"s\" : \"\"} ago`,\n month: (n: number) => `${n} month${n > 1 ? \"s\" : \"\"} ago`,\n year: (n: number) => `${n} year${n > 1 ? \"s\" : \"\"} ago`,\n },\n vi: {\n justNow: \"Vừa xong\",\n minute: (n: number) => `${n} phút trước`,\n hour: (n: number) => `${n} giờ trước`,\n day: (n: number) => `${n} ngày trước`,\n week: (n: number) => `${n} tuần trước`,\n month: (n: number) => `${n} tháng trước`,\n year: (n: number) => `${n} năm trước`,\n },\n ko: {\n justNow: \"방금 전\",\n minute: (n: number) => `${n}분 전`,\n hour: (n: number) => `${n}시간 전`,\n day: (n: number) => `${n}일 전`,\n week: (n: number) => `${n}주 전`,\n month: (n: number) => `${n}개월 전`,\n year: (n: number) => `${n}년 전`,\n },\n ja: {\n justNow: \"たった今\",\n minute: (n: number) => `${n}分前`,\n hour: (n: number) => `${n}時間前`,\n day: (n: number) => `${n}日前`,\n week: (n: number) => `${n}週間前`,\n month: (n: number) => `${n}ヶ月前`,\n year: (n: number) => `${n}年前`,\n },\n };\n\n const l = labels[locale] || labels.en;\n\n if (diffSec < 60) return l.justNow;\n if (diffMin < 60) return l.minute(diffMin);\n if (diffHour < 24) return l.hour(diffHour);\n if (diffDay < 7) return l.day(diffDay);\n if (diffWeek < 4) return l.week(diffWeek);\n if (diffMonth < 12) return l.month(diffMonth);\n return l.year(diffYear);\n}\n\n/**\n * Check if date is today\n */\nexport function isToday(date: string | Date | null | undefined): boolean {\n if (!date) return false;\n const d = new Date(date);\n if (isNaN(d.getTime())) return false;\n\n const today = new Date();\n return d.getDate() === today.getDate() && d.getMonth() === today.getMonth() && d.getFullYear() === today.getFullYear();\n}\n\n/**\n * Check if date is yesterday\n */\nexport function isYesterday(date: string | Date | null | undefined): boolean {\n if (!date) return false;\n const d = new Date(date);\n if (isNaN(d.getTime())) return false;\n\n const yesterday = new Date();\n yesterday.setDate(yesterday.getDate() - 1);\n\n return d.getDate() === yesterday.getDate() && d.getMonth() === yesterday.getMonth() && d.getFullYear() === yesterday.getFullYear();\n}\n\n/**\n * Format date for input[type=\"date\"]\n * @example formatDateForInput(new Date()) // \"2024-12-25\"\n */\nexport function formatDateForInput(date: string | Date | null | undefined): string {\n if (!date) return \"\";\n const d = new Date(date);\n if (isNaN(d.getTime())) return \"\";\n\n const year = d.getFullYear();\n const month = String(d.getMonth() + 1).padStart(2, \"0\");\n const day = String(d.getDate()).padStart(2, \"0\");\n\n return `${year}-${month}-${day}`;\n}\n\n/**\n * Format date for input[type=\"datetime-local\"]\n * @example formatDateTimeForInput(new Date()) // \"2024-12-25T14:30\"\n */\nexport function formatDateTimeForInput(date: string | Date | null | undefined): string {\n if (!date) return \"\";\n const d = new Date(date);\n if (isNaN(d.getTime())) return \"\";\n\n const dateStr = formatDateForInput(date);\n const hours = String(d.getHours()).padStart(2, \"0\");\n const minutes = String(d.getMinutes()).padStart(2, \"0\");\n\n return `${dateStr}T${hours}:${minutes}`;\n}\n\n/**\n * Get day of week\n * @example\n * getDayOfWeek(new Date(), \"vi\") // \"Thứ Hai\"\n * getDayOfWeek(new Date(), \"en\") // \"Monday\"\n */\nexport function getDayOfWeek(date: string | Date | null | undefined, locale: SupportedLocale = \"en\"): string {\n if (!date) return \"\";\n const d = new Date(date);\n if (isNaN(d.getTime())) return \"\";\n\n return d.toLocaleDateString(getLocaleString(locale), {\n weekday: \"long\",\n });\n}\n\n/**\n * Format with day of week\n * @example\n * formatDateWithDay(new Date(), \"vi\") // \"Thứ Hai, 25/12/2024\"\n * formatDateWithDay(new Date(), \"en\") // \"Monday, 12/25/2024\"\n */\nexport function formatDateWithDay(date: string | Date | null | undefined, locale: SupportedLocale = \"en\"): string {\n if (!date) return \"\";\n const dayOfWeek = getDayOfWeek(date, locale);\n const dateStr = formatDateShort(date, locale);\n\n return `${dayOfWeek}, ${dateStr}`;\n}\n\n/**\n * Smart date formatting - shows relative time for recent dates, full date for older ones\n * @example\n * formatDateSmart(new Date(), \"vi\")\n * // \"Vừa xong\" (< 1 min)\n * // \"5 phút trước\" (< 1 hour)\n * // \"Hôm nay lúc 14:30\" (today)\n * // \"Hôm qua lúc 14:30\" (yesterday)\n * // \"25/12/2024 14:30\" (older)\n */\nexport function formatDateSmart(date: string | Date | null | undefined, locale: SupportedLocale = \"en\"): string {\n if (!date) return \"\";\n const d = new Date(date);\n if (isNaN(d.getTime())) return \"\";\n\n const now = new Date();\n const diffMs = now.getTime() - d.getTime();\n const diffHour = Math.floor(diffMs / (1000 * 60 * 60));\n\n const labels = {\n en: {\n today: \"Today at\",\n yesterday: \"Yesterday at\",\n },\n vi: {\n today: \"Hôm nay lúc\",\n yesterday: \"Hôm qua lúc\",\n },\n ko: {\n today: \"오늘\",\n yesterday: \"어제\",\n },\n ja: {\n today: \"今日\",\n yesterday: \"昨日\",\n },\n };\n\n const l = labels[locale] || labels.en;\n\n // Less than 1 hour ago - show relative time\n if (diffHour < 1) {\n return formatTimeAgo(date, locale);\n }\n\n // Today\n if (isToday(date)) {\n return `${l.today} ${formatTime(date, locale)}`;\n }\n\n // Yesterday\n if (isYesterday(date)) {\n return `${l.yesterday} ${formatTime(date, locale)}`;\n }\n\n // Less than 7 days - show relative\n if (diffHour < 24 * 7) {\n return formatTimeAgo(date, locale);\n }\n\n // Older - show full date with time\n return formatDateTime(date, locale);\n}\n","/**\n * ShadCN UI Animation Styles - Enhanced with smooth spring-like animations\n *\n * This module provides animation utilities used by Underverse UI components.\n * It can be used standalone or with the useShadCNAnimations hook.\n *\n * @example\n * ```tsx\n * import { useShadCNAnimations } from \"@underverse-ui/underverse\";\n *\n * function MyComponent() {\n * useShadCNAnimations(); // Injects animation styles\n * return <div data-state=\"open\">Animated content</div>;\n * }\n * ```\n */\n\nexport const shadcnAnimationStyles = `\n /* ============================================\n * DROPDOWN / POPOVER ANIMATIONS\n * Uses spring-like cubic-bezier for natural feel\n * ============================================ */\n \n /* Native-like Combobox Animation - Mimics browser default select */\n [data-state=\"open\"][data-combobox-dropdown] {\n animation: comboboxOpen 150ms cubic-bezier(0.2, 0, 0, 1);\n transform-origin: top center;\n }\n\n [data-state=\"closed\"][data-combobox-dropdown] {\n animation: comboboxClose 120ms cubic-bezier(0.4, 0, 1, 1);\n transform-origin: top center;\n }\n\n @keyframes comboboxOpen {\n 0% {\n opacity: 0;\n transform: translateY(-4px) scaleY(0.9);\n }\n 100% {\n opacity: 1;\n transform: translateY(0) scaleY(1);\n }\n }\n\n @keyframes comboboxClose {\n 0% {\n opacity: 1;\n transform: translateY(0) scaleY(1);\n }\n 100% {\n opacity: 0;\n transform: translateY(-4px) scaleY(0.9);\n }\n }\n\n /* Generic dropdown open/close */\n [data-state=\"open\"] {\n animation: slideDownAndFade 220ms cubic-bezier(0.16, 1, 0.3, 1);\n }\n \n [data-state=\"closed\"] {\n animation: slideUpAndFade 180ms cubic-bezier(0.4, 0, 0.2, 1);\n }\n \n @keyframes slideDownAndFade {\n from {\n opacity: 0;\n transform: translateY(-4px) scale(0.98);\n }\n to {\n opacity: 1;\n transform: translateY(0) scale(1);\n }\n }\n \n @keyframes slideUpAndFade {\n from {\n opacity: 1;\n transform: translateY(0) scale(1);\n }\n to {\n opacity: 0;\n transform: translateY(-4px) scale(0.98);\n }\n }\n \n /* ============================================\n * DROPDOWN ITEMS - Native-like instant appearance\n * ============================================ */\n\n /* Fast staggered animation for native feel */\n .dropdown-item {\n opacity: 0;\n animation: itemFadeIn 120ms cubic-bezier(0.2, 0, 0, 1) forwards;\n }\n\n @keyframes itemFadeIn {\n from {\n opacity: 0;\n transform: translateX(-4px);\n }\n to {\n opacity: 1;\n transform: translateX(0);\n }\n }\n\n /* Item stagger delays - minimal for speed */\n .dropdown-item:nth-child(1) { animation-delay: 0ms; }\n .dropdown-item:nth-child(2) { animation-delay: 15ms; }\n .dropdown-item:nth-child(3) { animation-delay: 30ms; }\n .dropdown-item:nth-child(4) { animation-delay: 45ms; }\n .dropdown-item:nth-child(5) { animation-delay: 60ms; }\n .dropdown-item:nth-child(6) { animation-delay: 75ms; }\n .dropdown-item:nth-child(7) { animation-delay: 90ms; }\n .dropdown-item:nth-child(8) { animation-delay: 105ms; }\n .dropdown-item:nth-child(n+9) { animation-delay: 120ms; }\n\n /* ============================================\n * DATEPICKER ANIMATIONS\n * ============================================ */\n\n .datepicker-day {\n opacity: 0;\n animation: dayFadeIn 200ms cubic-bezier(0.16, 1, 0.3, 1) forwards;\n }\n\n @keyframes dayFadeIn {\n from {\n opacity: 0;\n transform: scale(0.8);\n }\n to {\n opacity: 1;\n transform: scale(1);\n }\n }\n\n /* ============================================\n * TOOLTIP ANIMATIONS\n * ============================================ */\n\n [data-tooltip] {\n animation: tooltipIn 150ms cubic-bezier(0.16, 1, 0.3, 1);\n }\n\n @keyframes tooltipIn {\n from {\n opacity: 0;\n transform: scale(0.95);\n }\n to {\n opacity: 1;\n transform: scale(1);\n }\n }\n\n /* ============================================\n * MODAL / DIALOG ANIMATIONS\n * ============================================ */\n\n .modal-content {\n animation: scaleIn 200ms cubic-bezier(0.34, 1.56, 0.64, 1);\n }\n \n @keyframes scaleIn {\n from {\n opacity: 0;\n transform: scale(0.9);\n }\n to {\n opacity: 1;\n transform: scale(1);\n }\n }\n \n /* Smooth backdrop blur transition */\n .backdrop-animate {\n transition: backdrop-filter 200ms ease, background-color 200ms ease;\n }\n`;\n\n/**\n * Hook to inject ShadCN animation styles into the document head.\n * Call this hook in components that need animations.\n * The styles are only injected once, even if called multiple times.\n *\n * @example\n * ```tsx\n * function Dropdown() {\n * useShadCNAnimations();\n * return <div data-state=\"open\">...</div>;\n * }\n * ```\n */\nexport function useShadCNAnimations(): void {\n if (typeof document !== \"undefined\") {\n const styleId = \"shadcn-animations\";\n if (!document.getElementById(styleId)) {\n const styleElement = document.createElement(\"style\");\n styleElement.id = styleId;\n styleElement.textContent = shadcnAnimationStyles;\n document.head.appendChild(styleElement);\n }\n }\n}\n\n/**\n * Manually inject animation styles.\n * Useful for non-React environments or SSR.\n */\nexport function injectAnimationStyles(): void {\n useShadCNAnimations();\n}\n\n/**\n * Get the animation styles as a string.\n * Useful for including in a style tag or CSS file.\n */\nexport function getAnimationStyles(): string {\n return shadcnAnimationStyles;\n}\n","export const VARIANT_STYLES_ALERT = {\n // Use system colors for background + border; leave text colors to content\n default: \"border border-border bg-card/60 backdrop-blur-sm\",\n info: \"border border-info/30 bg-info/10 backdrop-blur-sm\",\n success: \"border border-success/30 bg-success/10 backdrop-blur-sm\",\n warning: \"border border-warning/30 bg-warning/10 backdrop-blur-sm\",\n error: \"border border-destructive/30 bg-destructive/10 backdrop-blur-sm\",\n};\n\r\n// const variantIcons: Record<AlertVariant, ReactNode> = {\r\n// default: <Info className=\"h-4 w-4\" />,\r\n// info: <Info className=\"h-4 w-4 text-blue-500\" />,\r\n// success: <CheckCircle2 className=\"h-4 w-4 text-green-500\" />,\r\n// warning: <AlertTriangle className=\"h-4 w-4 text-yellow-500\" />,\r\n// error: <XCircle className=\"h-4 w-4 text-red-500\" />,\r\n// };\r\n","\"use client\";\n\nimport * as React from \"react\";\nimport enLocale from \"../../locales/en.json\";\nimport viLocale from \"../../locales/vi.json\";\nimport koLocale from \"../../locales/ko.json\";\nimport jaLocale from \"../../locales/ja.json\";\n\nexport type Locale = \"en\" | \"vi\" | \"ko\" | \"ja\";\nexport type Translations = Record<string, Record<string, string | Record<string, string>>>;\n\ninterface TranslationContextType {\n locale: Locale;\n t: (namespace: string) => (key: string) => string;\n}\n\nconst defaultTranslations: Record<Locale, Translations> = {\n en: enLocale as Translations,\n vi: viLocale as Translations,\n ko: koLocale as Translations,\n ja: jaLocale as Translations,\n};\n\nconst TranslationContext = React.createContext<TranslationContextType | null>(null);\n\nexport interface TranslationProviderProps {\n children: React.ReactNode;\n /** Current locale. Defaults to \"en\" */\n locale?: Locale;\n /** Custom translations to merge with defaults */\n translations?: Partial<Record<Locale, Translations>>;\n}\n\n/**\n * TranslationProvider for Underverse UI components.\n *\n * This provider is OPTIONAL. Components will use English fallback texts\n * when no provider is available.\n *\n * @example\n * ```tsx\n * // Basic usage\n * <TranslationProvider locale=\"vi\">\n * <App />\n * </TranslationProvider>\n *\n * // With custom translations\n * <TranslationProvider\n * locale=\"vi\"\n * translations={{\n * vi: { DatePicker: { clear: \"Xóa ngay\" } }\n * }}\n * >\n * <App />\n * </TranslationProvider>\n * ```\n */\nexport const TranslationProvider: React.FC<TranslationProviderProps> = ({ children, locale = \"en\", translations }) => {\n const t = React.useCallback(\n (namespace: string) => {\n return (key: string): string => {\n // Merge custom translations with defaults\n const mergedTranslations = {\n ...defaultTranslations[locale],\n ...translations?.[locale],\n };\n\n // Handle nested namespaces like \"OCR.imageUpload\"\n const parts = namespace.split(\".\");\n let current: unknown = mergedTranslations;\n\n for (const part of parts) {\n if (current && typeof current === \"object\" && part in current) {\n current = (current as Record<string, unknown>)[part];\n } else {\n return key; // Fallback to key\n }\n }\n\n if (current && typeof current === \"object\" && key in current) {\n const value = (current as Record<string, unknown>)[key];\n return typeof value === \"string\" ? value : key;\n }\n\n return key; // Fallback to key\n };\n },\n [locale, translations]\n );\n\n return <TranslationContext.Provider value={{ locale, t }}>{children}</TranslationContext.Provider>;\n};\n\n/**\n * Hook to get translations for a specific namespace.\n * Falls back to the key itself when TranslationProvider is not available.\n *\n * @param namespace - The translation namespace (e.g., \"DatePicker\", \"Common\")\n * @returns A function that takes a key and returns the translated string\n *\n * @example\n * ```tsx\n * const t = useTranslations(\"DatePicker\");\n * console.log(t(\"clear\")); // \"Clear\" or \"Xóa\" depending on locale\n * ```\n */\nexport const useUnderverseTranslations = (namespace: string) => {\n const context = React.useContext(TranslationContext);\n\n // Fallback for when provider is not available - use English defaults\n if (!context) {\n return (key: string): string => {\n const parts = namespace.split(\".\");\n let current: unknown = defaultTranslations.en;\n\n for (const part of parts) {\n if (current && typeof current === \"object\" && part in current) {\n current = (current as Record<string, unknown>)[part];\n } else {\n return key;\n }\n }\n\n if (current && typeof current === \"object\" && key in current) {\n const value = (current as Record<string, unknown>)[key];\n return typeof value === \"string\" ? value : key;\n }\n\n return key;\n };\n }\n\n return context.t(namespace);\n};\n\n/**\n * Hook to get the current locale.\n * Falls back to \"en\" when TranslationProvider is not available.\n *\n * @returns The current locale (\"en\" or \"vi\")\n */\nexport const useUnderverseLocale = (): Locale => {\n const context = React.useContext(TranslationContext);\n return context?.locale || \"en\";\n};\n\nexport default TranslationProvider;\n","{\n \"Common\": {\n \"close\": \"Close\",\n \"closeAlert\": \"Close alert\",\n \"notifications\": \"Notifications\",\n \"newNotification\": \"New\",\n \"readStatus\": \"Read\",\n \"openLink\": \"Open link\",\n \"theme\": \"Theme\",\n \"lightTheme\": \"Light\",\n \"darkTheme\": \"Dark\",\n \"systemTheme\": \"System\",\n \"density\": \"Density\",\n \"compact\": \"Compact\",\n \"normal\": \"Normal\",\n \"comfortable\": \"Comfortable\",\n \"columns\": \"Columns\"\n },\n \"ValidationInput\": {\n \"required\": \"This field is required\",\n \"typeMismatch\": \"Invalid format\",\n \"pattern\": \"Invalid pattern\",\n \"tooShort\": \"Too short\",\n \"tooLong\": \"Too long\",\n \"rangeUnderflow\": \"Below minimum\",\n \"rangeOverflow\": \"Above maximum\",\n \"stepMismatch\": \"Step mismatch\",\n \"badInput\": \"Bad input\",\n \"invalid\": \"Invalid value\"\n },\n \"Loading\": {\n \"loadingPage\": \"Loading page\",\n \"pleaseWait\": \"Please wait\"\n },\n \"DatePicker\": {\n \"placeholder\": \"Select date\",\n \"today\": \"Today\",\n \"clear\": \"Clear\"\n },\n \"Pagination\": {\n \"navigationLabel\": \"Pagination navigation\",\n \"showingResults\": \"Showing {startItem}–{endItem} of {totalItems}\",\n \"firstPage\": \"First page\",\n \"previousPage\": \"Previous page\",\n \"previous\": \"Previous\",\n \"nextPage\": \"Next page\",\n \"next\": \"Next\",\n \"lastPage\": \"Last page\",\n \"pageNumber\": \"Page {page}\",\n \"itemsPerPage\": \"Items per page\",\n \"search\": \"Search\",\n \"noOptions\": \"No options\"\n },\n \"OCR\": {\n \"imageUpload\": {\n \"dragDropText\": \"Drag & drop files here\",\n \"browseFiles\": \"Browse files\",\n \"supportedFormats\": \"Supported formats: images\"\n }\n }\n}\n\n","{\n \"Common\": {\n \"close\": \"Đóng\",\n \"closeAlert\": \"Đóng cảnh báo\",\n \"notifications\": \"Thông báo\",\n \"newNotification\": \"Mới\",\n \"readStatus\": \"Đã đọc\",\n \"openLink\": \"Mở liên kết\",\n \"theme\": \"Chủ đề\",\n \"lightTheme\": \"Giao diện sáng\",\n \"darkTheme\": \"Giao diện tối\",\n \"systemTheme\": \"Theo hệ thống\",\n \"density\": \"Mật độ\",\n \"compact\": \"Gọn\",\n \"normal\": \"Thường\",\n \"comfortable\": \"Thoải mái\",\n \"columns\": \"Cột\"\n },\n \"ValidationInput\": {\n \"required\": \"Trường này là bắt buộc\",\n \"typeMismatch\": \"Định dạng không hợp lệ\",\n \"pattern\": \"Sai mẫu\",\n \"tooShort\": \"Quá ngắn\",\n \"tooLong\": \"Quá dài\",\n \"rangeUnderflow\": \"Nhỏ hơn giá trị tối thiểu\",\n \"rangeOverflow\": \"Lớn hơn giá trị tối đa\",\n \"stepMismatch\": \"Sai bước\",\n \"badInput\": \"Giá trị không hợp lệ\",\n \"invalid\": \"Giá trị không hợp lệ\"\n },\n \"Loading\": {\n \"loadingPage\": \"Đang tải trang\",\n \"pleaseWait\": \"Vui lòng chờ\"\n },\n \"DatePicker\": {\n \"placeholder\": \"Chọn ngày\",\n \"today\": \"Hôm nay\",\n \"clear\": \"Xóa\"\n },\n \"Pagination\": {\n \"navigationLabel\": \"Điều hướng phân trang\",\n \"showingResults\": \"Hiển thị {startItem}–{endItem} trong tổng {totalItems}\",\n \"firstPage\": \"Trang đầu\",\n \"previousPage\": \"Trang trước\",\n \"previous\": \"Trước\",\n \"nextPage\": \"Trang sau\",\n \"next\": \"Sau\",\n \"lastPage\": \"Trang cuối\",\n \"pageNumber\": \"Trang {page}\",\n \"itemsPerPage\": \"Số mục/trang\",\n \"search\": \"Tìm kiếm\",\n \"noOptions\": \"Không có lựa chọn\"\n },\n \"OCR\": {\n \"imageUpload\": {\n \"dragDropText\": \"Kéo & thả ảnh vào đây\",\n \"browseFiles\": \"Chọn tệp\",\n \"supportedFormats\": \"Hỗ trợ các định dạng ảnh\"\n }\n }\n}\n\n","{\n \"Common\": {\n \"close\": \"닫기\",\n \"closeAlert\": \"알림 닫기\",\n \"notifications\": \"알림\",\n \"newNotification\": \"새로운\",\n \"readStatus\": \"읽음\",\n \"openLink\": \"링크 열기\",\n \"theme\": \"테마\",\n \"lightTheme\": \"라이트\",\n \"darkTheme\": \"다크\",\n \"systemTheme\": \"시스템\",\n \"density\": \"밀도\",\n \"compact\": \"컴팩트\",\n \"normal\": \"보통\",\n \"comfortable\": \"여유\",\n \"columns\": \"열\"\n },\n \"ValidationInput\": {\n \"required\": \"필수 입력 항목입니다\",\n \"typeMismatch\": \"형식이 올바르지 않습니다\",\n \"pattern\": \"패턴이 일치하지 않습니다\",\n \"tooShort\": \"너무 짧습니다\",\n \"tooLong\": \"너무 깁니다\",\n \"rangeUnderflow\": \"최솟값보다 작습니다\",\n \"rangeOverflow\": \"최댓값을 초과했습니다\",\n \"stepMismatch\": \"단계가 일치하지 않습니다\",\n \"badInput\": \"잘못된 입력입니다\",\n \"invalid\": \"유효하지 않은 값입니다\"\n },\n \"Loading\": {\n \"loadingPage\": \"페이지 로딩 중\",\n \"pleaseWait\": \"잠시만 기다려 주세요\"\n },\n \"DatePicker\": {\n \"placeholder\": \"날짜 선택\",\n \"today\": \"오늘\",\n \"clear\": \"지우기\"\n },\n \"Pagination\": {\n \"navigationLabel\": \"페이지 네비게이션\",\n \"showingResults\": \"{startItem}–{endItem} / 총 {totalItems}개\",\n \"firstPage\": \"첫 페이지\",\n \"previousPage\": \"이전 페이지\",\n \"previous\": \"이전\",\n \"nextPage\": \"다음 페이지\",\n \"next\": \"다음\",\n \"lastPage\": \"마지막 페이지\",\n \"pageNumber\": \"{page}페이지\",\n \"itemsPerPage\": \"페이지당 항목 수\",\n \"search\": \"검색\",\n \"noOptions\": \"옵션 없음\"\n },\n \"OCR\": {\n \"imageUpload\": {\n \"dragDropText\": \"여기에 파일을 드래그 앤 드롭하세요\",\n \"browseFiles\": \"파일 찾아보기\",\n \"supportedFormats\": \"지원 형식: 이미지\"\n }\n }\n}\n","{\n \"Common\": {\n \"close\": \"閉じる\",\n \"closeAlert\": \"アラートを閉じる\",\n \"notifications\": \"通知\",\n \"newNotification\": \"新規\",\n \"readStatus\": \"既読\",\n \"openLink\": \"リンクを開く\",\n \"theme\": \"テーマ\",\n \"lightTheme\": \"ライト\",\n \"darkTheme\": \"ダーク\",\n \"systemTheme\": \"システム\",\n \"density\": \"密度\",\n \"compact\": \"コンパクト\",\n \"normal\": \"通常\",\n \"comfortable\": \"ゆったり\",\n \"columns\": \"列\"\n },\n \"ValidationInput\": {\n \"required\": \"この項目は必須です\",\n \"typeMismatch\": \"形式が正しくありません\",\n \"pattern\": \"パターンが一致しません\",\n \"tooShort\": \"短すぎます\",\n \"tooLong\": \"長すぎます\",\n \"rangeUnderflow\": \"最小値より小さいです\",\n \"rangeOverflow\": \"最大値を超えています\",\n \"stepMismatch\": \"ステップが一致しません\",\n \"badInput\": \"入力が無効です\",\n \"invalid\": \"無効な値です\"\n },\n \"Loading\": {\n \"loadingPage\": \"ページを読み込み中\",\n \"pleaseWait\": \"しばらくお待ちください\"\n },\n \"DatePicker\": {\n \"placeholder\": \"日付を選択\",\n \"today\": \"今日\",\n \"clear\": \"クリア\"\n },\n \"Pagination\": {\n \"navigationLabel\": \"ページナビゲーション\",\n \"showingResults\": \"{startItem}–{endItem} / 全{totalItems}件\",\n \"firstPage\": \"最初のページ\",\n \"previousPage\": \"前のページ\",\n \"previous\": \"前へ\",\n \"nextPage\": \"次のページ\",\n \"next\": \"次へ\",\n \"lastPage\": \"最後のページ\",\n \"pageNumber\": \"{page}ページ\",\n \"itemsPerPage\": \"1ページあたりの項目数\",\n \"search\": \"検索\",\n \"noOptions\": \"オプションなし\"\n },\n \"OCR\": {\n \"imageUpload\": {\n \"dragDropText\": \"ここにファイルをドラッグ&ドロップ\",\n \"browseFiles\": \"ファイルを参照\",\n \"supportedFormats\": \"対応形式:画像\"\n }\n }\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { useUnderverseTranslations, useUnderverseLocale, type Locale } from \"../contexts/TranslationContext\";\n\n/**\n * Try to dynamically import next-intl hooks.\n * This allows the package to work with or without next-intl.\n */\nlet nextIntlHooks: {\n useTranslations?: (namespace: string) => (key: string) => string;\n useLocale?: () => string;\n} | null = null;\n\n// Try to load next-intl at module initialization\ntry {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const nextIntl = require(\"next-intl\");\n nextIntlHooks = {\n useTranslations: nextIntl.useTranslations,\n useLocale: nextIntl.useLocale,\n };\n} catch {\n // next-intl not available, will use internal translations\n nextIntlHooks = null;\n}\n\n/**\n * Context to force using internal translations even when next-intl is available.\n * Useful for testing or when you want to use the package's built-in translations.\n */\nconst ForceInternalContext = React.createContext(false);\n\nexport const ForceInternalTranslationsProvider: React.FC<{ children: React.ReactNode }> = ({ children }) => {\n return <ForceInternalContext.Provider value={true}>{children}</ForceInternalContext.Provider>;\n};\n\n/**\n * Smart translation hook that:\n * 1. Uses next-intl if available and not forced to use internal\n * 2. Falls back to internal TranslationContext\n * 3. Falls back to English defaults if no provider is available\n *\n * @param namespace - The translation namespace (e.g., \"DatePicker\", \"Common\")\n * @returns A function that takes a key and returns the translated string\n *\n * @example\n * ```tsx\n * // Works in Next.js with next-intl\n * // Works in React without next-intl\n * // Works without any provider (English fallback)\n * const t = useSmartTranslations(\"DatePicker\");\n * console.log(t(\"clear\")); // \"Clear\" or translated value\n * ```\n */\nexport function useSmartTranslations(namespace: string): (key: string) => string {\n const forceInternal = React.useContext(ForceInternalContext);\n const internalT = useUnderverseTranslations(namespace);\n\n // If forced to use internal or next-intl is not available, use internal\n if (forceInternal || !nextIntlHooks?.useTranslations) {\n return internalT;\n }\n\n // Try to use next-intl\n try {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n const nextIntlT = nextIntlHooks.useTranslations(namespace);\n return nextIntlT;\n } catch {\n // If next-intl throws (e.g., no provider), fall back to internal\n return internalT;\n }\n}\n\n/**\n * Smart locale hook that:\n * 1. Uses next-intl if available\n * 2. Falls back to internal TranslationContext\n * 3. Falls back to \"en\" if no provider is available\n *\n * @returns The current locale\n */\nexport function useSmartLocale(): Locale {\n const forceInternal = React.useContext(ForceInternalContext);\n const internalLocale = useUnderverseLocale();\n\n // If forced to use internal or next-intl is not available, use internal\n if (forceInternal || !nextIntlHooks?.useLocale) {\n return internalLocale;\n }\n\n // Try to use next-intl\n try {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n const nextIntlLocale = nextIntlHooks.useLocale();\n return (nextIntlLocale as Locale) || internalLocale;\n } catch {\n // If next-intl throws (e.g., no provider), fall back to internal\n return internalLocale;\n }\n}\n\nexport default useSmartTranslations;\n"],"mappings":"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","names":["Calendar","cn","shadcnAnimationStyles","useShadCNAnimations","loading","import_jsx_runtime","import_react","import_jsx_runtime","React","import_lucide_react","import_jsx_runtime","import_react","React","import_jsx_runtime","import_lucide_react","import_jsx_runtime","loading","variantStyles","sizeStyles","React","import_react","import_lucide_react","import_jsx_runtime","loading","sizeStyles","import_react","import_jsx_runtime","Textarea","sizeClasses","React","import_jsx_runtime","sizeClasses","React","import_jsx_runtime","import_react","import_jsx_runtime","React","Image","import_jsx_runtime","import_jsx_runtime","sizeClasses","_","import_react","import_lucide_react","import_jsx_runtime","variantStyles","sizeStyles","React","React","import_lucide_react","import_jsx_runtime","sizeStyles","modalContent","import_react","import_lucide_react","import_jsx_runtime","React","import_react_dom","import_jsx_runtime","variantStyles","React","import_react_dom","import_jsx_runtime","React","import_react_dom","import_lucide_react","import_jsx_runtime","sizeStyles","positionStyles","import_react","import_lucide_react","import_jsx_runtime","import_react","import_lucide_react","import_jsx_runtime","sizeClasses","React","React","import_lucide_react","import_jsx_runtime","sizeStyles","variantStyles","Link","React","import_jsx_runtime","sizeStyles","variantStyles","activeTab","import_react","import_react_dom","import_jsx_runtime","React","React","import_lucide_react","React","import_react","import_react_dom","import_lucide_react","import_jsx_runtime","loading","sizeStyles","import_jsx_runtime","size","import_react","import_jsx_runtime","React","import_react","import_jsx_runtime","React","import_react","import_react_dom","import_lucide_react","import_jsx_runtime","isToday","XIcon","isSameDay","React","import_lucide_react","import_jsx_runtime","base","now","sizeClasses","React","import_lucide_react","import_jsx_runtime","Calendar","SIZE_STYLES","VARIANT_STYLES","isToday","prevEnd","nextStart","React","import_react","import_react_dom","import_lucide_react","import_jsx_runtime","loading","sizeStyles","React","import_jsx_runtime","sizeStyles","React","import_jsx_runtime","sizeStyles","import_lucide_react","import_react","import_jsx_runtime","React","value","formatTime","import_react","import_lucide_react","import_jsx_runtime","import_react","import_lucide_react","import_jsx_runtime","ImageIcon","React","import_lucide_react","import_jsx_runtime","getAnimationStyles","import_react","import_jsx_runtime","React","measure","React","import_lucide_react","import_jsx_runtime","SIZE_STYLES","loading","React","import_react_dom","import_jsx_runtime","PRESETS","React","import_lucide_react","import_jsx_runtime","React","import_lucide_react","import_jsx_runtime","p","q","sizeClasses","import_react","import_jsx_runtime","React","import_react","import_react","import_react_dom","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","getCatmullRomSpline","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_lucide_react","import_jsx_runtime","sizeClasses","import_react","import_jsx_runtime","React","import_lucide_react","import_react","import_jsx_runtime","React","loading","FilterIcon","React","import_jsx_runtime","loading","import_lucide_react","import_jsx_runtime","formatTime","import_link","import_lucide_react","import_jsx_runtime","Link","import_lucide_react","import_jsx_runtime","import_lucide_react","import_react","import_react_dom","import_jsx_runtime","import_react","import_react_dom","import_lucide_react","import_jsx_runtime","import_clsx","import_tailwind_merge","cn","formatDateShort","formatTime","shadcnAnimationStyles","useShadCNAnimations","React","import_jsx_runtime","defaultTranslations","TranslationContext","React","import_jsx_runtime"]}