@hua-labs/ui 1.1.0-alpha.0.1 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/advanced-dashboard.js.map +1 -1
- package/dist/advanced-dashboard.mjs +1 -1
- package/dist/advanced.js.map +1 -1
- package/dist/advanced.mjs +1 -1
- package/dist/{chunk-VPOFRDYL.mjs → chunk-627HOIRV.mjs} +2 -2
- package/dist/{chunk-VPOFRDYL.mjs.map → chunk-627HOIRV.mjs.map} +1 -1
- package/dist/{chunk-SGCVGEDR.mjs → chunk-E5PN4LUS.mjs} +2 -2
- package/dist/{chunk-SGCVGEDR.mjs.map → chunk-E5PN4LUS.mjs.map} +1 -1
- package/dist/{chunk-ZQAAB3P4.mjs → chunk-MXGXBG63.mjs} +2 -2
- package/dist/{chunk-ZQAAB3P4.mjs.map → chunk-MXGXBG63.mjs.map} +1 -1
- package/dist/{chunk-YY6ZBUVJ.mjs → chunk-R5KCFRYV.mjs} +2 -2
- package/dist/{chunk-YY6ZBUVJ.mjs.map → chunk-R5KCFRYV.mjs.map} +1 -1
- package/dist/{chunk-DMYT7RZ4.mjs → chunk-UGSYQDR4.mjs} +2 -2
- package/dist/{chunk-DMYT7RZ4.mjs.map → chunk-UGSYQDR4.mjs.map} +1 -1
- package/dist/{chunk-6NXF6ATP.mjs → chunk-ZFS4B5QT.mjs} +2 -2
- package/dist/{chunk-6NXF6ATP.mjs.map → chunk-ZFS4B5QT.mjs.map} +1 -1
- package/dist/form.js.map +1 -1
- package/dist/form.mjs +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/lib/icon-providers.d.ts +2 -3
- package/dist/lib/icon-providers.d.ts.map +1 -1
- package/dist/navigation.js.map +1 -1
- package/dist/navigation.mjs +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/lib/utils.ts","../src/lib/icons.ts","../src/lib/icon-providers.ts","../src/lib/icon-aliases.ts","../src/components/Icon/icon-store.ts","../src/components/Icon/IconProvider.tsx","../src/components/Icon/Icon.tsx","../src/lib/styles/colors.ts","../src/lib/styles/variants.ts","../src/components/dashboard/StatCard.tsx","../src/components/dashboard/QuickActionCard.tsx","../src/components/dashboard/DashboardGrid.tsx","../src/components/dashboard/ActivityFeed.tsx","../src/components/dashboard/ProfileCard.tsx","../src/components/dashboard/MembershipBadge.tsx","../src/components/dashboard/MiniBarChart.tsx","../src/components/dashboard/SummaryCard.tsx","../src/components/dashboard/NotificationCard.tsx","../src/components/dashboard/MetricCard.tsx","../src/components/dashboard/ProgressCard.tsx","../src/components/dashboard/EmptyState.tsx","../src/components/Tooltip.tsx","../src/components/dashboard/DashboardSidebar.tsx","../src/components/Table.tsx","../src/components/Badge.tsx","../src/components/Skeleton.tsx","../src/components/dashboard/TransactionsTable.tsx","../src/components/Button.tsx","../src/components/Dropdown.tsx","../src/components/dashboard/DashboardToolbar.tsx","../src/components/dashboard/TrendChart.tsx","../src/components/Drawer.tsx","../src/components/dashboard/TransactionDetailDrawer.tsx","../src/components/dashboard/SettlementTimeline.tsx","../src/components/dashboard/RoutingBreakdownCard.tsx","../src/components/dashboard/MerchantList.tsx","../src/components/StatsPanel.tsx","../src/components/SectionHeader.tsx"],"names":["merge","inputs","twMerge","clsx","formatRelativeTime","timestamp","locale","date","diff","minutes","hours","days","mergeMap","classMap","classes","condition","className","icons","Home","ArrowLeft","ArrowRight","ArrowUp","ArrowDown","Menu","X","Search","Settings","ExternalLink","ChevronLeft","ChevronRight","ChevronDown","ChevronUp","Edit","Trash2","Plus","Minus","Download","Upload","RefreshCw","Save","Copy","Loader2","CheckCircle","XCircle","AlertCircle","Info","Check","Circle","HelpCircle","User","Users","UserPlus","LogIn","LogOut","Eye","EyeOff","BarChart3","TrendingUp","Activity","Database","Zap","FileText","File","Folder","Book","BookOpen","Mail","MessageCircle","Phone","Image","Video","Camera","Smile","Frown","Meh","Lock","Unlock","Shield","Wallet","Key","Clock","Calendar","CalendarPlus","Bell","Heart","Star","Bookmark","Share","Monitor","Sun","Moon","Lightbulb","Brain","Flag","Square","emotionIcons","statusIcons","PhosphorIcons","PROJECT_ICONS","initPhosphorIcons","getIconFromProvider","iconName","provider","iconMapping","getIconDirect","mappedName","LucideIcons","lucideName","camelCaseName","match","p1","phosphorName1","phosphorName2","word","ICON_ALIASES","resolveIconAlias","defaultIconConfig","IconContext","createContext","useIconContext","useContext","IconComponent","React","name","size","emotion","status","weight","animated","pulse","spin","bounce","variant","ariaLabel","ariaHidden","ref","_a","config","iconSet","iconSize","iconWeight","iconColor","iconStrokeWidth","isClient","setIsClient","phosphorReady","setPhosphorReady","variantClasses","jsx","iconProps","animationClasses","accessibilityProps","MemoizedIcon","prevProps","nextProps","Icon","EmotionIcon","props","StatusIcon","LoadingIcon","SuccessIcon","ErrorIcon","colorShades","colorClass","color","shade","prefix","withDarkMode","lightClass","darkClass","defaultColorConfig","gradientConfig","createColorStyles","_b","_c","_d","_e","_f","_g","_h","_i","_j","_k","_l","_m","_n","_o","finalConfig","defaultBorder","defaultBg","defaultStyle","gradientFrom","gradientTo","gradientBorder","gradientStyle","outlineBorder","outlineBg","outlineText","outlineStyle","elevatedBorder","elevatedBg","elevatedShadow","elevatedStyle","iconBg","iconText","iconStyle","badgeBg","badgeText","badgeStyle","colorStylesCache","useColorStyles","cacheKey","createVariantStyles","colorStyles","baseClasses","StatCard","title","value","description","icon","trend","loading","emptyState","isGradient","isTextWhite","variantClass","useMemo","baseClass","formatValue","val","jsxs","QuickActionCard","href","onClick","content","Fragment","gapClasses","columnClasses","fixedColumnClasses","DashboardGrid","columns","gap","responsive","children","gridClasses","ActivityFeed","items","emptyMessage","showHeader","maxItems","onViewAll","viewAllLabel","displayItems","hasMore","item","key","tierStyles","tierLabels","ProfileCard","email","avatar","avatarAlt","greeting","memberSince","membershipTier","membershipLabel","onSettingsClick","settingsHref","showAvatar","showMembership","showSettings","formatDate","tier","tierStyle","tierLabel","part","index","isEmoji","tierConfig","sizeClasses","MembershipBadge","label","showIcon","sizeStyle","displayLabel","getIcon","chartColors","MiniBarChart","data","labels","maxValue","height","showTooltip","showStats","highlightToday","todayIndex","colors","calculatedMax","fixedMax","todayIdx","calculateHeight","total","sum","average","max","chartLabel","isToday","barHeight","barColor","defaultVariantGradients","buttonGradients","SummaryCard","subtitle","badge","footer","showAction","actionLabel","typeStyles","defaultTypeStyles","NotificationCard","showCount","getTypeStyles","type","typeStyle","MetricCard","chartData","chartLabels","showChart","progressColors","sizeStyles","ProgressCard","current","unit","showPercentage","showLabel","sizes","percentage","variantStyles","DashboardEmptyState","actionText","actionHref","actionOnClick","styles","actionButton","Tooltip","position","delay","disabled","isVisible","setIsVisible","coords","setCoords","timeoutRef","tooltipRef","e","rect","tooltipRect","x","y","hideTooltip","getVariantClasses","getArrowClasses","TooltipLight","TooltipDark","DEFAULT_COLLAPSED","DEFAULT_EXPANDED","DashboardSidebar","logo","productSwitcher","sections","footerActions","isCollapsed","defaultCollapsed","onToggleCollapsed","collapsedWidth","expandedWidth","mobileBreakpoint","overlayBackground","internalCollapsed","setInternalCollapsed","isMobileOpen","setIsMobileOpen","isMobile","setIsMobile","collapsed","checkMobile","toggleCollapsed","next","widthStyle","sidebarContent","section","itemNode","Table","getSizeClasses","TableHeader","TableBody","TableFooter","TableRow","TableHead","TableCell","TableCaption","Badge","Skeleton","width","animation","getAnimationClasses","defaultDims","finalWidth","finalHeight","SkeletonText","SkeletonCircle","SkeletonRectangle","SkeletonRounded","SkeletonCard","SkeletonAvatar","SkeletonImage","SkeletonUserProfile","SkeletonList","_","SkeletonTable","STATUS_STYLES","DEFAULT_COLUMNS","TransactionsTable","rows","isLoading","caption","filters","onRowClick","highlightRow","statusLabels","statusRenderer","amountFormatter","methodFormatter","dateFormatter","defaultCurrency","rowActionLabel","rowActionHint","columnList","hasRows","tableId","rowActionHintId","getRowActionLabel","row","renderStatus","renderAmount","currency","renderMethod","renderDate","renderCell","column","clickable","handleRowKeyDown","event","rowLabel","isBrowser","useReducedMotion","reduce","setReduce","mq","onChange","ButtonInner","iconPosition","gradient","customGradient","rounded","shadow","hover","fullWidth","iconOnly","rest","reduced","getGradientClass","roundedClasses","shadowClasses","hoverClasses","base","target","rel","anchorClassName","anchorProps","isDisabled","handleAnchorClick","buttonClassName","btnProps","Button","g","Dropdown","trigger","controlledOpen","onOpenChange","placement","align","offset","showArrow","internalOpen","setInternalOpen","triggerRef","dropdownRef","isControlled","isOpen","handleOpenChange","newOpen","handleTriggerClick","updatePosition","triggerRect","dropdownRect","viewportWidth","viewportHeight","handleClickOutside","getPlacementClasses","DropdownItem","DropdownSeparator","DropdownLabel","DropdownMenu","DropdownGroup","actionAppearance","ToolbarButton","appearance","DashboardToolbar","meta","dateRange","actions","onRefresh","lastUpdated","containerClasses","preset","action","PRESET_PALETTES","TrendChart","series","categories","palette","showLegend","showDots","paletteColors","safeCategories","denominator","s","points","point","i","pathData","p","areaData","idx","Drawer","open","side","showBackdrop","backdropClassName","closeOnBackdropClick","closeOnEscape","isAnimating","setIsAnimating","timer","handleEscape","sideClasses","transformClasses","DrawerHeader","showCloseButton","onClose","DrawerContent","DrawerFooter","formatAmount","amount","parsed","getEventColor","getSettlementBadge","TransactionDetailDrawer","transaction","metadata","settlement","fees","events","summary","statusStyle","fee","STATUS_CONFIG","SettlementTimeline","highlightedId","hasItems","statusConfig","isHighlighted","showConnector","itemLabel","DEFAULT_COLORS","STATUS_BADGES","formatPercentage","RoutingBreakdownCard","segments","totalLabel","totalValue","highlightId","formatter","hasSegments","segment","badgeClass","customContent","HEALTH_BADGES","formatPercent","formatVolume","MerchantList","onMerchantSelect","merchant","approval","volume","merchantLabel","StatsPanel","baseCardClass","accentStyles","gridCols","SectionHeader"],"mappings":"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","file":"advanced-dashboard.js","sourcesContent":["import { type ClassValue, clsx } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\n/**\n * HUA UI의 스마트 클래스 병합 유틸리티\n * clsx와 tailwind-merge를 결합하여 중복 클래스를 자동으로 해결합니다.\n * \n * @param inputs - 병합할 클래스 값들\n * @returns 병합된 클래스 문자열\n * \n * @example\n * ```tsx\n * merge(\"px-2 py-1\", \"px-4\") // \"py-1 px-4\"\n * merge(\"text-red-500\", \"text-blue-500\") // \"text-blue-500\"\n * merge(\"bg-white\", \"dark:bg-slate-900\") // \"bg-white dark:bg-slate-900\"\n * ```\n */\nexport function merge(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n\n/**\n * 조건부 클래스 병합 유틸리티\n * 조건에 따라 클래스를 선택적으로 병합합니다.\n * \n * @param condition - 클래스를 적용할 조건\n * @param trueClass - 조건이 true일 때 적용할 클래스\n * @param falseClass - 조건이 false일 때 적용할 클래스 (선택사항)\n * @returns 병합된 클래스 문자열\n * \n * @example\n * ```tsx\n * mergeIf(isActive, \"bg-blue-500\", \"bg-gray-200\")\n * mergeIf(isLoading, \"opacity-50 cursor-not-allowed\")\n * ```\n */\nexport function mergeIf(\n condition: boolean,\n trueClass: ClassValue,\n falseClass?: ClassValue\n) {\n return merge(condition ? trueClass : falseClass || \"\")\n}\n\n/**\n * 상대 시간 포맷팅 유틸리티\n * \n * 날짜를 상대 시간 형식으로 포맷팅합니다 (예: \"방금 전\", \"5분 전\", \"2시간 전\", \"3일 전\").\n * 7일 이상 경과한 경우 절대 날짜를 반환합니다.\n * \n * Formats a date as relative time (e.g., \"방금 전\", \"5분 전\", \"2시간 전\", \"3일 전\").\n * Returns absolute date for dates older than 7 days.\n * \n * @param timestamp - 포맷팅할 날짜 (Date 객체 또는 ISO 문자열) / Date to format (Date object or ISO string)\n * @param locale - 로케일 (기본값: \"ko-KR\") / Locale (default: \"ko-KR\")\n * @returns 포맷팅된 상대 시간 문자열 / Formatted relative time string\n * \n * @example\n * ```tsx\n * formatRelativeTime(new Date()) // \"방금 전\"\n * formatRelativeTime(new Date(Date.now() - 5 * 60000)) // \"5분 전\"\n * formatRelativeTime(new Date(Date.now() - 2 * 3600000)) // \"2시간 전\"\n * formatRelativeTime(new Date(Date.now() - 3 * 86400000)) // \"3일 전\"\n * formatRelativeTime(new Date(\"2024-01-01\")) // \"2024. 1. 1.\" (7일 이상 경과)\n * ```\n */\nexport function formatRelativeTime(timestamp: Date | string, locale = \"ko-KR\"): string {\n const date = typeof timestamp === \"string\" ? new Date(timestamp) : timestamp;\n const now = new Date();\n const diff = now.getTime() - date.getTime();\n const minutes = Math.floor(diff / 60000);\n const hours = Math.floor(diff / 3600000);\n const days = Math.floor(diff / 86400000);\n\n if (minutes < 1) return locale === \"ko-KR\" ? \"방금 전\" : \"just now\";\n if (minutes < 60) return locale === \"ko-KR\" ? `${minutes}분 전` : `${minutes}m ago`;\n if (hours < 24) return locale === \"ko-KR\" ? `${hours}시간 전` : `${hours}h ago`;\n if (days < 7) return locale === \"ko-KR\" ? `${days}일 전` : `${days}d ago`;\n return date.toLocaleDateString(locale);\n}\n\n/**\n * 객체 기반 클래스 병합 유틸리티\n * 객체의 키-값 쌍을 기반으로 조건부 클래스를 병합합니다.\n * \n * @param classMap - 클래스 맵 객체\n * @returns 병합된 클래스 문자열\n * \n * @example\n * ```tsx\n * mergeMap({\n * \"bg-blue-500\": isPrimary,\n * \"bg-gray-500\": !isPrimary,\n * \"text-white\": true,\n * \"opacity-50\": isDisabled\n * })\n * ```\n */\nexport function mergeMap(classMap: Record<string, boolean | undefined | null>) {\n const classes = Object.entries(classMap)\n .filter(([, condition]) => condition)\n .map(([className]) => className)\n \n return merge(...classes)\n}\n\n// 하위 호환성을 위해 cn도 export (점진적 마이그레이션 지원)\nexport const cn = merge ","/**\n * Core Icons\n * \n * 핵심 아이콘만 포함하여 번들 크기를 최적화합니다.\n * 나머지 아이콘은 동적 fallback으로 처리됩니다.\n * \n * 포함 기준:\n * 1. sum-diary에서 실제 사용 중인 아이콘\n * 2. UI 컴포넌트에서 자주 사용되는 아이콘\n * 3. 각 카테고리의 대표 아이콘\n * \n * 새로운 아이콘이 필요하면 동적 fallback이 자동으로 처리합니다.\n */\n\nimport {\n // Navigation\n Home,\n ArrowLeft,\n ArrowRight,\n ArrowUp,\n ArrowDown,\n Menu,\n X,\n Search,\n Settings,\n ExternalLink,\n ChevronLeft,\n ChevronRight,\n ChevronDown,\n ChevronUp,\n \n // Actions\n Edit,\n Trash2,\n Plus,\n Minus,\n Download,\n Upload,\n RefreshCw,\n Save,\n Copy,\n \n // Status & Feedback\n Loader2,\n CheckCircle,\n XCircle,\n AlertCircle,\n Info,\n Check,\n Circle,\n HelpCircle,\n \n // User & Auth\n User,\n Users,\n UserPlus,\n LogIn,\n LogOut,\n Eye,\n EyeOff,\n \n // Data & Analytics\n BarChart3,\n TrendingUp,\n Activity,\n Database,\n Zap,\n \n // Files & Content\n FileText,\n File,\n Folder,\n Book,\n BookOpen,\n \n // Communication\n Mail,\n MessageCircle,\n Phone,\n \n // Media\n Image,\n Video,\n Camera,\n \n // Emotions\n Smile,\n Frown,\n Meh,\n \n // Security\n Lock,\n Unlock,\n Shield,\n Wallet,\n Key,\n \n // Time & Date\n Clock,\n Calendar,\n CalendarPlus,\n \n // UI Elements\n Bell,\n Heart,\n Star,\n Bookmark,\n Share,\n \n // Theme\n Monitor,\n Sun,\n Moon,\n \n // Additional\n Lightbulb,\n Brain,\n Flag,\n Square,\n} from 'lucide-react'\n\n// 핵심 아이콘 객체\nexport const icons = {\n // Navigation\n home: Home,\n arrowLeft: ArrowLeft,\n arrowRight: ArrowRight,\n arrowUp: ArrowUp,\n arrowDown: ArrowDown,\n menu: Menu,\n close: X,\n search: Search,\n settings: Settings,\n externalLink: ExternalLink,\n chevronLeft: ChevronLeft,\n chevronRight: ChevronRight,\n chevronDown: ChevronDown,\n chevronUp: ChevronUp,\n \n // Actions\n edit: Edit,\n delete: Trash2,\n add: Plus,\n remove: Minus,\n download: Download,\n upload: Upload,\n refresh: RefreshCw,\n save: Save,\n copy: Copy,\n \n // Status & Feedback\n loader: Loader2,\n success: CheckCircle,\n error: XCircle,\n alertCircle: AlertCircle,\n warning: AlertCircle, // warning은 alertCircle과 동일\n info: Info,\n check: Check,\n circle: Circle,\n helpCircle: HelpCircle,\n \n // User & Auth\n user: User,\n users: Users,\n userPlus: UserPlus,\n logIn: LogIn,\n logOut: LogOut,\n eye: Eye,\n eyeOff: EyeOff,\n \n // Data & Analytics\n chart: BarChart3,\n barChart: BarChart3,\n trendingUp: TrendingUp,\n activity: Activity,\n database: Database,\n zap: Zap,\n \n // Files & Content\n fileText: FileText,\n file: File,\n folder: Folder,\n book: Book,\n bookOpen: BookOpen,\n \n // Communication\n mail: Mail,\n message: MessageCircle,\n phone: Phone,\n \n // Media\n image: Image,\n video: Video,\n camera: Camera,\n \n // Emotions\n smile: Smile,\n frown: Frown,\n meh: Meh,\n \n // Security\n lock: Lock,\n unlock: Unlock,\n shield: Shield,\n wallet: Wallet,\n key: Key,\n \n // Time & Date\n clock: Clock,\n calendar: Calendar,\n calendarPlus: CalendarPlus,\n \n // UI Elements\n bell: Bell,\n heart: Heart,\n star: Star,\n bookmark: Bookmark,\n share: Share,\n \n // Theme\n monitor: Monitor,\n sun: Sun,\n moon: Moon,\n \n // Additional\n lightbulb: Lightbulb,\n brain: Brain,\n flag: Flag,\n square: Square,\n} as const\n\n// 아이콘 이름 타입\nexport type IconName = keyof typeof icons\n\n// 감정별 아이콘 매핑\nexport const emotionIcons = {\n happy: 'smile',\n sad: 'frown',\n neutral: 'meh',\n excited: 'smile', // laugh 대신 smile 사용\n angry: 'frown', // angry 대신 frown 사용\n love: 'heart',\n like: 'heart', // thumbsUp 대신 heart 사용\n dislike: 'frown', // thumbsDown 대신 frown 사용\n} as const\n\n// 상태별 아이콘 매핑\nexport const statusIcons = {\n loading: 'loader',\n success: 'success',\n error: 'error',\n warning: 'warning',\n info: 'info',\n locked: 'lock',\n unlocked: 'unlock',\n visible: 'eye',\n hidden: 'eyeOff',\n} as const\n\n// 아이콘 카테고리별 그룹화 (참고용)\nexport const iconCategories = {\n navigation: ['home', 'arrowLeft', 'arrowRight', 'arrowUp', 'arrowDown', 'menu', 'close', 'search', 'settings', 'externalLink', 'chevronLeft', 'chevronRight', 'chevronDown', 'chevronUp'],\n actions: ['edit', 'delete', 'add', 'remove', 'download', 'upload', 'refresh', 'save', 'copy'],\n status: ['loader', 'success', 'error', 'alertCircle', 'warning', 'info', 'check', 'circle'],\n user: ['user', 'users', 'userPlus', 'logIn', 'logOut', 'eye', 'eyeOff'],\n data: ['chart', 'barChart', 'trendingUp', 'activity', 'database', 'zap'],\n files: ['fileText', 'file', 'folder', 'book'],\n communication: ['mail', 'message', 'phone'],\n media: ['image', 'video', 'camera'],\n emotions: ['smile', 'frown', 'meh'],\n security: ['lock', 'unlock', 'shield'],\n time: ['clock', 'calendar'],\n ui: ['bell', 'heart', 'star', 'bookmark', 'share'],\n theme: ['monitor', 'sun', 'moon'],\n} as const\n","/**\n * Icon Provider System\n * \n * Supports multiple icon libraries:\n * - Lucide Icons (default)\n * - Phosphor Icons\n * - Untitled Icons (SVG-based)\n * \n * Only imports icons that are actually used in the project for optimal bundle size.\n */\n\nimport * as LucideIcons from 'lucide-react'\nimport type { LucideIcon } from 'lucide-react'\n\n// Phosphor Icons - lazy loaded, tree-shakeable\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet PhosphorIcons: any = null\n\n// Icon Provider Type (deprecated: IconSet 사용 권장)\n// @deprecated Use IconSet from './components/Icon/icon-store' instead\nexport type IconProvider = 'lucide' | 'phosphor' | 'untitled'\n\n// Icon Provider Configuration\nexport interface IconProviderConfig {\n /** @deprecated Use IconSet from './components/Icon/icon-store' instead */\n provider: IconProvider\n prefix?: string\n}\n\n/**\n * Project-specific icon list\n * These are the icons actually used in SumUp project\n * Only these icons will be loaded for optimal bundle size\n */\nexport const PROJECT_ICONS = {\n // Navigation & Layout\n 'home': { lucide: 'Home', phosphor: 'House', untitled: 'home' },\n 'layout-dashboard': { lucide: 'LayoutDashboard', phosphor: 'SquaresFour', untitled: 'layout-dashboard' },\n 'folder': { lucide: 'Folder', phosphor: 'Folder', untitled: 'folder' },\n 'alert-circle': { lucide: 'AlertCircle', phosphor: 'WarningCircle', untitled: 'alert-circle' },\n 'alertCircle': { lucide: 'AlertCircle', phosphor: 'WarningCircle', untitled: 'alert-circle' },\n 'columns': { lucide: 'Columns', phosphor: 'Columns', untitled: 'columns' },\n 'users': { lucide: 'Users', phosphor: 'Users', untitled: 'users' },\n 'settings': { lucide: 'Settings', phosphor: 'Gear', untitled: 'settings' },\n 'menu': { lucide: 'Menu', phosphor: 'List', untitled: 'menu' },\n 'close': { lucide: 'X', phosphor: 'X', untitled: 'close' },\n 'chevronLeft': { lucide: 'ChevronLeft', phosphor: 'CaretLeft', untitled: 'chevron-left' },\n 'chevronRight': { lucide: 'ChevronRight', phosphor: 'CaretRight', untitled: 'chevron-right' },\n 'chevronDown': { lucide: 'ChevronDown', phosphor: 'CaretDown', untitled: 'chevron-down' },\n 'chevronUp': { lucide: 'ChevronUp', phosphor: 'CaretUp', untitled: 'chevron-up' },\n 'arrowLeft': { lucide: 'ArrowLeft', phosphor: 'ArrowLeft', untitled: 'arrow-left' },\n 'arrowRight': { lucide: 'ArrowRight', phosphor: 'ArrowRight', untitled: 'arrow-right' },\n 'arrowUp': { lucide: 'ArrowUp', phosphor: 'ArrowUp', untitled: 'arrow-up' },\n 'arrowDown': { lucide: 'ArrowDown', phosphor: 'ArrowDown', untitled: 'arrow-down' },\n \n // Actions\n 'add': { lucide: 'Plus', phosphor: 'Plus', untitled: 'add' },\n 'edit': { lucide: 'Edit', phosphor: 'Pencil', untitled: 'edit' },\n 'pencil': { lucide: 'Pencil', phosphor: 'Pencil', untitled: 'pencil' },\n 'delete': { lucide: 'Trash2', phosphor: 'Trash', untitled: 'trash' },\n 'trash': { lucide: 'Trash2', phosphor: 'Trash', untitled: 'trash' },\n 'upload': { lucide: 'Upload', phosphor: 'Upload', untitled: 'upload' },\n 'download': { lucide: 'Download', phosphor: 'Download', untitled: 'download' },\n 'x': { lucide: 'X', phosphor: 'X', untitled: 'close' },\n 'check': { lucide: 'Check', phosphor: 'Check', untitled: 'check' },\n 'search': { lucide: 'Search', phosphor: 'MagnifyingGlass', untitled: 'search' },\n 'share': { lucide: 'Share', phosphor: 'Share', untitled: 'share' },\n 'copy': { lucide: 'Copy', phosphor: 'Copy', untitled: 'copy' },\n 'save': { lucide: 'Save', phosphor: 'FloppyDisk', untitled: 'save' },\n \n // Status & Feedback\n 'loader': { lucide: 'Loader2', phosphor: 'Spinner', untitled: 'loader' },\n 'loader2': { lucide: 'Loader2', phosphor: 'Spinner', untitled: 'loader' },\n 'check-circle': { lucide: 'CheckCircle', phosphor: 'CheckCircle', untitled: 'check-circle' },\n 'checkCircle': { lucide: 'CheckCircle', phosphor: 'CheckCircle', untitled: 'check-circle' },\n 'success': { lucide: 'CheckCircle', phosphor: 'CheckCircle', untitled: 'check-circle' },\n 'error': { lucide: 'XCircle', phosphor: 'XCircle', untitled: 'error' },\n 'warning': { lucide: 'AlertCircle', phosphor: 'WarningCircle', untitled: 'warning' },\n 'info': { lucide: 'Info', phosphor: 'Info', untitled: 'info' },\n 'refresh': { lucide: 'RefreshCw', phosphor: 'ArrowClockwise', untitled: 'refresh' },\n 'refreshCw': { lucide: 'RefreshCw', phosphor: 'ArrowClockwise', untitled: 'refresh' },\n 'bell': { lucide: 'Bell', phosphor: 'Bell', untitled: 'bell' },\n 'heart': { lucide: 'Heart', phosphor: 'Heart', untitled: 'heart' },\n 'star': { lucide: 'Star', phosphor: 'Star', untitled: 'star' },\n 'bookmark': { lucide: 'Bookmark', phosphor: 'Bookmark', untitled: 'bookmark' },\n \n // User & Auth\n 'user': { lucide: 'User', phosphor: 'User', untitled: 'user' },\n 'userPlus': { lucide: 'UserPlus', phosphor: 'UserPlus', untitled: 'user-plus' },\n 'logIn': { lucide: 'LogIn', phosphor: 'SignIn', untitled: 'log-in' },\n 'logOut': { lucide: 'LogOut', phosphor: 'SignOut', untitled: 'log-out' },\n 'chrome': { lucide: 'Chrome', phosphor: 'ChromeLogo', untitled: 'chrome' },\n 'github': { lucide: 'Github', phosphor: 'GithubLogo', untitled: 'github' },\n 'message': { lucide: 'MessageCircle', phosphor: 'ChatCircle', untitled: 'message' },\n \n // Content\n 'messageSquare': { lucide: 'MessageSquare', phosphor: 'ChatSquare', untitled: 'message-square' },\n 'message-square': { lucide: 'MessageSquare', phosphor: 'ChatSquare', untitled: 'message-square' },\n 'inbox': { lucide: 'Inbox', phosphor: 'Inbox', untitled: 'inbox' },\n 'calendar': { lucide: 'Calendar', phosphor: 'Calendar', untitled: 'calendar' },\n 'calendarPlus': { lucide: 'CalendarPlus', phosphor: 'CalendarPlus', untitled: 'calendar-plus' },\n 'checkSquare': { lucide: 'CheckSquare', phosphor: 'CheckSquare', untitled: 'check-square' },\n 'clock': { lucide: 'Clock', phosphor: 'Clock', untitled: 'clock' },\n 'book': { lucide: 'Book', phosphor: 'Book', untitled: 'book' },\n 'bookOpen': { lucide: 'BookOpen', phosphor: 'BookOpen', untitled: 'book-open' },\n \n // Theme & UI\n 'monitor': { lucide: 'Monitor', phosphor: 'Monitor', untitled: 'monitor' },\n 'sun': { lucide: 'Sun', phosphor: 'Sun', untitled: 'sun' },\n 'moon': { lucide: 'Moon', phosphor: 'Moon', untitled: 'moon' },\n \n // AI & Features\n 'sparkles': { lucide: 'Sparkles', phosphor: 'Sparkle', untitled: 'sparkles' },\n 'lightbulb': { lucide: 'Lightbulb', phosphor: 'Lightbulb', untitled: 'lightbulb' },\n 'brain': { lucide: 'Brain', phosphor: 'Brain', untitled: 'brain' },\n 'zap': { lucide: 'Zap', phosphor: 'Lightning', untitled: 'zap' },\n \n // Data & Analytics\n 'chart': { lucide: 'BarChart3', phosphor: 'ChartBar', untitled: 'chart' },\n 'barChart': { lucide: 'BarChart', phosphor: 'ChartBar', untitled: 'bar-chart' },\n 'trendingUp': { lucide: 'TrendingUp', phosphor: 'TrendUp', untitled: 'trending-up' },\n 'trendingDown': { lucide: 'TrendingDown', phosphor: 'TrendDown', untitled: 'trending-down' },\n 'activity': { lucide: 'Activity', phosphor: 'Activity', untitled: 'activity' },\n 'database': { lucide: 'Database', phosphor: 'Database', untitled: 'database' },\n 'dollarSign': { lucide: 'DollarSign', phosphor: 'CurrencyDollar', untitled: 'dollar-sign' },\n 'dollar': { lucide: 'DollarSign', phosphor: 'CurrencyDollar', untitled: 'dollar-sign' },\n 'currency': { lucide: 'DollarSign', phosphor: 'CurrencyDollar', untitled: 'currency' },\n \n // Security\n 'lock': { lucide: 'Lock', phosphor: 'Lock', untitled: 'lock' },\n 'unlock': { lucide: 'Unlock', phosphor: 'LockOpen', untitled: 'unlock' },\n 'shield': { lucide: 'Shield', phosphor: 'Shield', untitled: 'shield' },\n 'key': { lucide: 'Key', phosphor: 'Key', untitled: 'key' },\n \n // Media\n 'play': { lucide: 'Play', phosphor: 'Play', untitled: 'play' },\n 'pause': { lucide: 'Pause', phosphor: 'Pause', untitled: 'pause' },\n 'image': { lucide: 'Image', phosphor: 'Image', untitled: 'image' },\n 'video': { lucide: 'Video', phosphor: 'Video', untitled: 'video' },\n 'camera': { lucide: 'Camera', phosphor: 'Camera', untitled: 'camera' },\n \n // Files\n 'fileText': { lucide: 'FileText', phosphor: 'FileText', untitled: 'file-text' },\n 'file': { lucide: 'File', phosphor: 'File', untitled: 'file' },\n \n // Navigation\n 'externalLink': { lucide: 'ExternalLink', phosphor: 'ArrowSquareOut', untitled: 'external-link' },\n 'link': { lucide: 'Link', phosphor: 'Link', untitled: 'link' },\n 'moreHorizontal': { lucide: 'MoreHorizontal', phosphor: 'DotsThreeOutline', untitled: 'more-horizontal' },\n 'moreVertical': { lucide: 'MoreVertical', phosphor: 'DotsThreeVertical', untitled: 'more-vertical' },\n \n // Priority\n 'remove': { lucide: 'Minus', phosphor: 'Minus', untitled: 'remove' },\n \n // Eye (password)\n 'eye': { lucide: 'Eye', phosphor: 'Eye', untitled: 'eye' },\n 'eyeOff': { lucide: 'EyeOff', phosphor: 'EyeSlash', untitled: 'eye-off' },\n \n // Emotions\n 'smile': { lucide: 'Smile', phosphor: 'Smiley', untitled: 'smile' },\n 'frown': { lucide: 'Frown', phosphor: 'SmileySad', untitled: 'frown' },\n 'meh': { lucide: 'Meh', phosphor: 'SmileyMeh', untitled: 'meh' },\n \n // Social\n 'mail': { lucide: 'Mail', phosphor: 'Envelope', untitled: 'mail' },\n 'phone': { lucide: 'Phone', phosphor: 'Phone', untitled: 'phone' },\n \n // Additional\n 'flag': { lucide: 'Flag', phosphor: 'Flag', untitled: 'flag' },\n} as const\n\n/**\n * Initialize Phosphor Icons (lazy load)\n * Only loads when Phosphor provider is used\n * Uses tree-shaking to only include used icons\n */\nexport async function initPhosphorIcons() {\n if (typeof window === 'undefined') return null\n \n if (!PhosphorIcons) {\n try {\n // Dynamic import with tree-shaking support\n // Only icons actually used will be included in bundle\n const phosphorModule = await import('@phosphor-icons/react')\n PhosphorIcons = phosphorModule\n } catch (error) {\n console.warn('Phosphor Icons not available. Install @phosphor-icons/react to use.')\n return null\n }\n }\n return PhosphorIcons\n}\n\n/**\n * Get icon from provider\n * Only resolves icons that are in PROJECT_ICONS for optimal bundle size\n * \n * @param iconName - 아이콘 이름 / Icon name\n * @param provider - 아이콘 프로바이더 (deprecated: IconSet 사용 권장) / Icon provider (deprecated: use IconSet instead)\n * @returns 아이콘 컴포넌트 또는 null / Icon component or null\n */\nexport function getIconFromProvider(\n iconName: string,\n provider: IconProvider | 'lucide' | 'phosphor' | 'untitled' = 'lucide'\n): LucideIcon | React.ComponentType<Record<string, unknown>> | null {\n // Check if icon is in project icon list\n const iconMapping = PROJECT_ICONS[iconName as keyof typeof PROJECT_ICONS]\n \n if (!iconMapping) {\n // Fallback to direct lookup for backward compatibility\n return getIconDirect(iconName, provider)\n }\n \n const mappedName = iconMapping[provider]\n \n switch (provider) {\n case 'lucide':\n return (LucideIcons as unknown as Record<string, LucideIcon>)[mappedName] || null\n \n case 'phosphor':\n if (!PhosphorIcons) {\n return null\n }\n return PhosphorIcons?.[mappedName] || null\n \n case 'untitled':\n // Untitled Icons are SVG-based, handled separately\n return null\n \n default:\n return null\n }\n}\n\n/**\n * Direct icon lookup (fallback for icons not in PROJECT_ICONS)\n * \n * 동적으로 Lucide 아이콘을 가져옵니다.\n * icons.ts에 없는 아이콘도 사용 가능하도록 합니다.\n * \n * Dynamically loads Lucide icons.\n * Allows using icons not in icons.ts.\n * \n * @param iconName - 아이콘 이름 / Icon name\n * @param provider - 아이콘 프로바이더 (deprecated: IconSet 사용 권장) / Icon provider (deprecated: use IconSet instead)\n * @returns 아이콘 컴포넌트 또는 null / Icon component or null\n */\nfunction getIconDirect(\n iconName: string,\n provider: IconProvider | 'lucide' | 'phosphor' | 'untitled'\n): LucideIcon | React.ComponentType<Record<string, unknown>> | null {\n switch (provider) {\n case 'lucide':\n // icons.ts에 없는 아이콘을 동적으로 찾기\n // PascalCase 변환 시도\n const lucideName = iconName.charAt(0).toUpperCase() + iconName.slice(1)\n // camelCase도 시도\n const camelCaseName = iconName.replace(/([A-Z])/g, (match, p1) => \n match === iconName[0] ? match.toLowerCase() : match\n )\n \n return (LucideIcons as unknown as Record<string, LucideIcon>)[lucideName] || \n (LucideIcons as unknown as Record<string, LucideIcon>)[iconName] || \n (LucideIcons as unknown as Record<string, LucideIcon>)[camelCaseName] || \n null\n \n case 'phosphor':\n if (!PhosphorIcons) {\n return null\n }\n const phosphorName1 = iconName.charAt(0).toUpperCase() + iconName.slice(1)\n const phosphorName2 = iconName\n .split(/(?=[A-Z])/)\n .map(word => word.charAt(0).toUpperCase() + word.slice(1))\n .join('')\n return PhosphorIcons?.[phosphorName1] || \n PhosphorIcons?.[phosphorName2] ||\n PhosphorIcons?.[iconName] ||\n null\n \n case 'untitled':\n return null\n \n default:\n return null\n }\n}\n\n/**\n * Get icon name for provider\n * \n * 프로바이더별 아이콘 이름을 가져옵니다.\n * Gets icon name for the specified provider.\n * \n * @param iconName - 아이콘 이름 / Icon name\n * @param provider - 아이콘 프로바이더 (deprecated: IconSet 사용 권장) / Icon provider (deprecated: use IconSet instead)\n * @returns 프로바이더별 아이콘 이름 / Icon name for provider\n */\nexport function getIconNameForProvider(\n iconName: string,\n provider: IconProvider | 'lucide' | 'phosphor' | 'untitled'\n): string {\n const iconMapping = PROJECT_ICONS[iconName as keyof typeof PROJECT_ICONS]\n if (iconMapping && iconMapping[provider]) {\n return iconMapping[provider]\n }\n return iconName\n}\n\n/**\n * Get all project icon names\n */\nexport function getProjectIconNames(): string[] {\n return Object.keys(PROJECT_ICONS)\n}\n","/**\n * Icon Aliases\n * \n * 여러 이름이 같은 아이콘을 가리키도록 하는 alias 시스템\n * DX 향상을 위해 직관적인 이름들을 지원합니다.\n */\n\nexport const ICON_ALIASES: Record<string, string> = {\n // Navigation aliases\n 'back': 'arrowLeft',\n 'prev': 'arrowLeft',\n 'previous': 'arrowLeft',\n 'forward': 'arrowRight',\n 'next': 'arrowRight',\n \n // Close aliases\n 'close': 'x',\n 'cancel': 'x',\n \n // Delete aliases\n 'remove': 'delete',\n 'trash': 'delete',\n \n // Add aliases\n 'plus': 'add',\n 'new': 'add',\n \n // Edit aliases\n 'pencil': 'edit',\n 'modify': 'edit',\n \n // Save aliases\n 'store': 'save',\n 'floppy': 'save',\n \n // Search aliases\n 'magnify': 'search',\n \n // User aliases\n 'person': 'user',\n 'account': 'user',\n 'profile': 'user',\n \n // Settings aliases\n 'gear': 'settings',\n 'config': 'settings',\n 'preferences': 'settings',\n \n // Home aliases\n 'house': 'home',\n 'main': 'home',\n \n // Check aliases\n 'done': 'check',\n 'complete': 'check',\n 'tick': 'check',\n \n // Info aliases\n 'information': 'info',\n 'help': 'info',\n \n // Warning aliases\n 'alert': 'warning',\n 'caution': 'warning',\n \n // Success aliases\n 'checkmark': 'success',\n 'checkCircle': 'success',\n \n // Error aliases\n 'fail': 'error',\n 'cross': 'error',\n 'xCircle': 'error',\n \n // Loading aliases\n 'spinner': 'loader',\n 'loading': 'loader',\n 'wait': 'loader',\n \n // Refresh aliases\n 'reload': 'refresh',\n 'update': 'refresh',\n 'sync': 'refresh',\n \n // Eye aliases\n 'show': 'eye',\n 'view': 'eye',\n 'hide': 'eyeOff',\n 'hidden': 'eyeOff',\n \n // Lock aliases\n 'secure': 'lock',\n 'locked': 'lock',\n 'unsecure': 'unlock',\n 'unlocked': 'unlock',\n \n // Download aliases\n 'get': 'download',\n 'fetch': 'download',\n \n // Upload aliases\n 'post': 'upload',\n \n // Share aliases\n 'send': 'share',\n 'export': 'share',\n \n // Copy aliases\n 'duplicate': 'copy',\n 'clone': 'copy',\n \n // Mail aliases\n 'email': 'mail',\n 'envelope': 'mail',\n \n // Message aliases\n 'chat': 'message',\n 'comment': 'message',\n 'talk': 'message',\n \n // Calendar aliases\n 'date': 'calendar',\n 'schedule': 'calendar',\n \n // Clock aliases\n 'time': 'clock',\n 'watch': 'clock',\n \n // File aliases\n 'document': 'fileText',\n 'doc': 'fileText',\n 'text': 'fileText',\n \n // Folder aliases\n 'directory': 'folder',\n 'dir': 'folder',\n \n // Image aliases\n 'picture': 'image',\n 'img': 'image',\n \n // Video aliases\n 'movie': 'video',\n 'film': 'video',\n \n // Camera aliases\n 'photo': 'camera',\n 'capture': 'camera',\n \n // Play aliases\n 'start': 'play',\n 'run': 'play',\n \n // Pause aliases\n 'stop': 'pause',\n 'halt': 'pause',\n \n // Heart aliases\n 'like': 'heart',\n 'love': 'heart',\n \n // Star aliases\n 'favorite': 'star',\n \n // Bookmark aliases\n 'saveBookmark': 'bookmark',\n \n // Bell aliases\n 'notification': 'bell',\n 'notify': 'bell',\n 'alarm': 'bell',\n \n // Settings aliases\n 'prefs': 'settings',\n \n // Search aliases (duplicate removed - see line 37)\n 'lookup': 'search',\n \n // More aliases\n 'dots': 'moreHorizontal',\n 'moreMenu': 'moreHorizontal',\n 'moreOptions': 'moreVertical',\n \n // External link aliases\n 'external': 'externalLink',\n 'outbound': 'externalLink',\n 'open': 'externalLink',\n \n // Link aliases\n 'url': 'link',\n 'hyperlink': 'link',\n \n // Chart aliases\n 'graph': 'barChart',\n 'stats': 'barChart',\n 'analytics': 'barChart',\n \n // Database aliases\n 'db': 'database',\n 'storage': 'database',\n \n // Activity aliases\n 'pulse': 'activity',\n 'monitor': 'activity',\n \n // Trending aliases\n 'up': 'trendingUp',\n 'down': 'trendingDown',\n \n // Zap aliases\n 'lightning': 'zap',\n 'bolt': 'zap',\n 'flash': 'zap',\n \n // Shield aliases\n 'security': 'shield',\n 'protect': 'shield',\n \n // Key aliases\n 'password': 'key',\n 'secret': 'key',\n \n // Log in aliases\n 'signin': 'logIn',\n 'login': 'logIn',\n 'enter': 'logIn',\n \n // Log out aliases\n 'signout': 'logOut',\n 'logout': 'logOut',\n 'exit': 'logOut',\n \n // Users aliases\n 'people': 'users',\n 'group': 'users',\n 'team': 'users',\n \n // User plus aliases\n 'addUser': 'userPlus',\n 'invite': 'userPlus',\n \n // Book aliases\n 'read': 'book',\n 'library': 'book',\n \n // Book open aliases\n 'reading': 'bookOpen',\n 'openBook': 'bookOpen',\n \n // Sun aliases\n 'light': 'sun',\n 'day': 'sun',\n \n // Moon aliases\n 'dark': 'moon',\n 'night': 'moon',\n \n // Monitor aliases\n 'screen': 'monitor',\n 'display': 'monitor',\n \n // Brain aliases\n 'ai': 'brain',\n 'intelligence': 'brain',\n 'think': 'brain',\n \n // Lightbulb aliases\n 'idea': 'lightbulb',\n 'bulb': 'lightbulb',\n 'inspiration': 'lightbulb',\n \n // Sparkles aliases\n 'magic': 'sparkles',\n 'stars': 'sparkles',\n 'glitter': 'sparkles',\n} as const\n\n/**\n * Resolve icon alias to actual icon name\n * \n * @param iconName - 아이콘 이름 또는 별칭 / Icon name or alias\n * @returns 실제 아이콘 이름 / Actual icon name\n * @throws {TypeError} iconName이 문자열이 아닌 경우\n */\nexport function resolveIconAlias(iconName: string): string {\n if (typeof iconName !== 'string') {\n throw new TypeError('iconName must be a string');\n }\n return ICON_ALIASES[iconName] || iconName;\n}\n\n/**\n * Get all aliases for an icon name\n * \n * @param iconName - 아이콘 이름 / Icon name\n * @returns 해당 아이콘의 모든 별칭 배열 / Array of all aliases for the icon\n * @throws {TypeError} iconName이 문자열이 아닌 경우\n */\nexport function getIconAliases(iconName: string): string[] {\n if (typeof iconName !== 'string') {\n throw new TypeError('iconName must be a string');\n }\n return Object.entries(ICON_ALIASES)\n .filter(([_, target]) => target === iconName)\n .map(([alias]) => alias);\n}\n\n\n","/**\n * Icon Config Types\n * \n * Icon 시스템의 설정 타입 정의\n * 상태관리는 서비스 레벨에서 관리 (Zustand 등)\n */\n\nexport type IconSet = 'lucide' | 'phosphor' | 'untitled'\n\nexport type PhosphorWeight = 'thin' | 'light' | 'regular' | 'bold' | 'duotone' | 'fill'\n\nexport interface IconConfig {\n set: IconSet\n weight: PhosphorWeight\n size: number\n color: string\n strokeWidth?: number // Lucide/Untitled용\n}\n\nexport const defaultIconConfig: IconConfig = {\n set: 'phosphor',\n weight: 'regular',\n size: 20,\n color: 'currentColor',\n strokeWidth: 1.25,\n}\n\n/**\n * 세트별 기본 strokeWidth\n */\nexport const getDefaultStrokeWidth = (set: IconSet): number => {\n switch (set) {\n case 'lucide':\n return 1.25\n case 'phosphor':\n return 1.25 // Phosphor는 weight 사용\n case 'untitled':\n return 1.5\n default:\n return 1.25\n }\n}\n","'use client'\n\n/**\n * IconProvider - Icon 시스템 전역 설정 Provider\n * \n * React Context를 사용하여 전역 아이콘 설정을 제공합니다.\n * 서비스 레벨에서 Zustand 등으로 상태관리 후 props로 전달 가능합니다.\n * \n * IconProvider - Global Icon Settings Provider\n * \n * Provides global icon settings using React Context API.\n * Can be integrated with state management (e.g., Zustand) at the service level.\n */\n\nimport React, { createContext, useContext } from 'react'\nimport { type IconConfig, type IconSet, type PhosphorWeight, defaultIconConfig } from './icon-store'\n\n/**\n * IconProvider 컴포넌트 Props\n * \n * IconProvider component props interface.\n * \n * @interface IconProviderProps\n */\nexport interface IconProviderProps {\n /** 아이콘 세트 (lucide, phosphor, untitled) / Icon set (lucide, phosphor, untitled) */\n set?: IconSet\n /** Phosphor 아이콘 weight (thin, light, regular, bold, duotone, fill) / Phosphor icon weight */\n weight?: PhosphorWeight\n /** 기본 아이콘 크기 / Default icon size */\n size?: number\n /** 기본 아이콘 색상 / Default icon color */\n color?: string\n /** Lucide/Untitled 아이콘 stroke width / Lucide/Untitled icon stroke width */\n strokeWidth?: number\n /** 자식 컴포넌트 / Child components */\n children: React.ReactNode\n}\n\ninterface IconContextValue extends IconConfig {}\n\nconst IconContext = createContext<IconContextValue>(defaultIconConfig)\n\n/**\n * IconProvider 컴포넌트\n * \n * 전역 아이콘 설정을 Context로 제공합니다.\n * 서비스에서 Zustand로 관리한 값을 props로 전달할 수 있습니다.\n * \n * IconProvider component\n * \n * Provides global icon settings through Context API.\n * Can receive values managed by Zustand at the service level.\n * \n * @component\n * @example\n * ```tsx\n * // 기본 사용 / Basic usage\n * <IconProvider set=\"phosphor\" weight=\"regular\" size={20}>\n * <App />\n * </IconProvider>\n * \n * // Zustand와 함께 사용 / With Zustand\n * const iconConfig = useIconStore(state => state.iconConfig)\n * <IconProvider {...iconConfig}>\n * <App />\n * </IconProvider>\n * \n * // Lucide 아이콘 사용 / Using Lucide icons\n * <IconProvider set=\"lucide\" size={24} strokeWidth={1.5}>\n * <App />\n * </IconProvider>\n * ```\n * \n * @param props - IconProvider 컴포넌트 props / IconProvider component props\n * @returns IconProvider 컴포넌트 / IconProvider component\n */\nexport function IconProvider({\n set = defaultIconConfig.set,\n weight = defaultIconConfig.weight,\n size = defaultIconConfig.size,\n color = defaultIconConfig.color,\n strokeWidth = defaultIconConfig.strokeWidth,\n children,\n}: IconProviderProps) {\n const value: IconContextValue = {\n set,\n weight,\n size,\n color,\n strokeWidth,\n }\n\n return (\n <IconContext.Provider value={value}>\n {children}\n </IconContext.Provider>\n )\n}\n\n/**\n * useIconContext Hook\n * \n * Icon Context를 사용하는 Hook입니다.\n * Icon 컴포넌트 내부에서 사용됩니다.\n * \n * Hook to use Icon Context.\n * Used internally by Icon component.\n * \n * @returns Icon 설정 값 / Icon configuration value\n * \n * @example\n * ```tsx\n * // Icon 컴포넌트 내부에서 사용 / Used inside Icon component\n * const config = useIconContext()\n * const iconSet = config.set\n * const iconSize = config.size\n * ```\n */\nexport function useIconContext(): IconContextValue {\n return useContext(IconContext)\n}\n\n// Re-export types for convenience\nexport type { IconSet, PhosphorWeight, IconConfig } from './icon-store'\nexport { defaultIconConfig, getDefaultStrokeWidth } from './icon-store'\n\n","import React from 'react'\nimport type { LucideProps } from 'lucide-react'\nimport { merge, mergeMap } from '../../lib/utils'\nimport { icons, IconName, emotionIcons, statusIcons } from '../../lib/icons'\nimport { getIconFromProvider, initPhosphorIcons } from '../../lib/icon-providers'\nimport { resolveIconAlias } from '../../lib/icon-aliases'\nimport { useIconContext, type IconSet } from './IconProvider'\nimport { type PhosphorWeight } from './icon-store'\nimport type { AllIconName } from '../../lib/icon-names'\n\n/**\n * Icon 컴포넌트 Props\n * \n * Icon component props interface.\n * \n * @interface IconProps\n */\nexport interface IconProps {\n /** 아이콘 이름 / Icon name */\n name: AllIconName\n /** 아이콘 크기 (숫자 또는 문자열) / Icon size (number or string) */\n size?: number | string\n /** 추가 CSS 클래스 / Additional CSS classes */\n className?: string\n /** 감정 아이콘 타입 / Emotion icon type */\n emotion?: keyof typeof emotionIcons\n /** 상태 아이콘 타입 / Status icon type */\n status?: keyof typeof statusIcons\n /** 아이콘 프로바이더 오버라이드 (전역 설정 무시) / Icon provider override (ignores global config) */\n provider?: IconSet\n /** 부드러운 애니메이션 효과 / Smooth animation effect */\n animated?: boolean\n /** 펄스 애니메이션 / Pulse animation */\n pulse?: boolean\n /** 회전 애니메이션 / Spin animation */\n spin?: boolean\n /** 바운스 애니메이션 / Bounce animation */\n bounce?: boolean\n /** 색상 변형 / Color variant */\n variant?: 'default' | 'primary' | 'secondary' | 'success' | 'warning' | 'error' | 'muted'\n /** Phosphor 아이콘 weight 오버라이드 / Phosphor icon weight override */\n weight?: PhosphorWeight\n /** 스크린 리더용 라벨 (의미 있는 아이콘인 경우) / Screen reader label (for meaningful icons) */\n 'aria-label'?: string\n /** 장식용 아이콘인 경우 true (스크린 리더에서 숨김) / Set to true for decorative icons (hidden from screen readers) */\n 'aria-hidden'?: boolean\n}\n\n/**\n * Icon 컴포넌트\n * \n * 다중 아이콘 라이브러리(Lucide, Phosphor, Untitled)를 지원하는 통합 아이콘 컴포넌트입니다.\n * IconProvider를 통해 전역 설정을 관리할 수 있으며, 개별 아이콘에서도 설정을 오버라이드할 수 있습니다.\n * \n * Icon component that supports multiple icon libraries (Lucide, Phosphor, Untitled).\n * Global settings can be managed through IconProvider, and individual icons can override settings.\n * \n * @component\n * @example\n * ```tsx\n * // 기본 사용 / Basic usage\n * <Icon name=\"heart\" />\n * \n * // 크기 지정 / Specify size\n * <Icon name=\"user\" size={24} />\n * \n * // 색상 변형 / Color variant\n * <Icon name=\"check\" variant=\"success\" />\n * \n * // 애니메이션 / Animation\n * <Icon name=\"loader\" spin />\n * <Icon name=\"heart\" pulse />\n * \n * // 접근성 / Accessibility\n * <Icon name=\"search\" aria-label=\"검색\" />\n * <Icon name=\"decorative-icon\" aria-hidden />\n * \n * // 감정 아이콘 / Emotion icon\n * <Icon emotion=\"happy\" />\n * \n * // 상태 아이콘 / Status icon\n * <Icon status=\"loading\" spin />\n * ```\n * \n * @param props - Icon 컴포넌트 props / Icon component props\n * @returns Icon 컴포넌트 / Icon component\n */\nconst IconComponent = React.forwardRef<HTMLSpanElement, IconProps>(({\n name,\n size,\n className,\n emotion,\n status,\n provider,\n weight,\n animated = false,\n pulse = false,\n spin = false,\n bounce = false,\n variant = 'default',\n 'aria-label': ariaLabel,\n 'aria-hidden': ariaHidden\n}, ref) => {\n // Context에서 전역 설정 가져오기\n const config = useIconContext()\n \n // prop으로 오버라이드 가능, 없으면 Context에서 가져옴\n const iconSet = provider || config.set\n const iconSize = size ?? config.size\n const iconWeight = weight || config.weight\n const iconColor = config.color\n const iconStrokeWidth = config.strokeWidth ?? 1.25\n \n // 클라이언트 사이드에서만 아이콘 렌더링 (hydration 오류 방지)\n const [isClient, setIsClient] = React.useState(false)\n const [phosphorReady, setPhosphorReady] = React.useState(false)\n \n React.useEffect(() => {\n setIsClient(true)\n \n // Phosphor Icons 초기화 (provider가 phosphor일 때만)\n if (iconSet === 'phosphor') {\n initPhosphorIcons().then(() => {\n setPhosphorReady(true)\n })\n } else {\n setPhosphorReady(true)\n }\n }, [iconSet])\n\n // 감정이나 상태가 지정되면 해당 아이콘으로 오버라이드\n let iconName = emotion ? emotionIcons[emotion] : \n status ? statusIcons[status] : \n name\n \n // Alias 해결 (back, prev → arrowLeft 등)\n iconName = resolveIconAlias(iconName) as AllIconName\n \n // 색상 변형 클래스 (먼저 선언 - fallback에서 사용)\n const variantClasses = mergeMap({\n 'text-gray-900 dark:text-white': variant === 'default',\n 'text-blue-600 dark:text-blue-400': variant === 'primary',\n 'text-gray-600 dark:text-gray-400': variant === 'secondary',\n 'text-green-600 dark:text-green-400': variant === 'success',\n 'text-yellow-600 dark:text-yellow-400': variant === 'warning',\n 'text-red-600 dark:text-red-400': variant === 'error',\n 'text-gray-500 dark:text-gray-500': variant === 'muted',\n })\n \n // 서버사이드에서는 빈 span 반환 (hydration 오류 방지)\n // Return empty span on server-side (prevent hydration errors)\n if (!isClient || (iconSet === 'phosphor' && !phosphorReady)) {\n return (\n <span\n style={{ width: iconSize, height: iconSize }}\n className={merge(variantClasses, className)}\n aria-hidden={ariaHidden !== undefined ? ariaHidden : true}\n aria-label={ariaLabel}\n />\n )\n }\n\n // Provider에 따라 아이콘 가져오기\n type IconComponentType = React.ComponentType<LucideProps | React.SVGProps<SVGSVGElement> | Record<string, unknown>>\n let IconComponent: IconComponentType | null = null\n \n if (iconSet === 'lucide') {\n // 1. icons.ts에서 먼저 찾기 (실제 사용되는 아이콘만 포함)\n // 타입 단언: AllIconName에는 있지만 icons 객체에 없는 경우를 위해\n IconComponent = (icons[iconName as IconName] || null) as IconComponentType | null\n \n // 2. 없으면 동적으로 Lucide에서 가져오기 (fallback)\n if (!IconComponent) {\n IconComponent = getIconFromProvider(iconName, iconSet) as IconComponentType | null\n }\n } else {\n // Phosphor나 다른 provider는 getIconFromProvider 사용\n // phosphorReady가 true일 때만 호출됨 (위에서 체크)\n IconComponent = getIconFromProvider(iconName, iconSet) as IconComponentType | null\n }\n \n if (!IconComponent) {\n console.warn(`Icon \"${iconName}\" not found for provider \"${iconSet}\"`)\n // Fallback: 빈 원형 아이콘 표시 (에러 표시)\n // Fallback: display empty circle icon (error indicator)\n return (\n <span\n ref={ref}\n className={merge(\n 'inline-flex items-center justify-center rounded-full border-2 border-dashed border-gray-300 dark:border-gray-600',\n variantClasses,\n className\n )}\n style={{ width: iconSize, height: iconSize }}\n aria-label={ariaLabel || `아이콘을 찾을 수 없음: ${iconName}`}\n title={`Icon not found: ${iconName}`}\n >\n <span className=\"text-xs text-gray-400 dark:text-gray-500\" aria-hidden=\"true\">\n ?\n </span>\n </span>\n )\n }\n \n // 세트별 props 준비\n type IconPropsType = LucideProps & {\n size?: number\n width?: number | string\n height?: number | string\n color?: string\n weight?: PhosphorWeight\n strokeWidth?: number\n }\n \n const iconProps: IconPropsType = {\n size: typeof iconSize === 'number' ? iconSize : undefined,\n width: typeof iconSize === 'string' ? iconSize : iconSize,\n height: typeof iconSize === 'string' ? iconSize : iconSize,\n color: iconColor,\n } as IconPropsType\n \n // Phosphor는 weight 사용\n if (iconSet === 'phosphor') {\n iconProps.weight = iconWeight\n } else {\n // Lucide/Untitled는 strokeWidth 사용\n iconProps.strokeWidth = iconStrokeWidth\n }\n\n // 애니메이션 클래스 생성\n const animationClasses = mergeMap({\n 'animate-pulse': pulse,\n 'animate-spin': spin,\n 'animate-bounce': bounce,\n 'transition-all duration-200 ease-in-out': animated,\n })\n\n // 접근성 속성 결정 / Determine accessibility attributes\n // aria-label이 제공되면 사용, 없으면 aria-hidden이 true인지 확인\n // If aria-label is provided, use it; otherwise check if aria-hidden is true\n const accessibilityProps: React.AriaAttributes = {}\n \n if (ariaLabel) {\n accessibilityProps['aria-label'] = ariaLabel\n accessibilityProps['aria-hidden'] = false\n } else if (ariaHidden !== undefined) {\n accessibilityProps['aria-hidden'] = ariaHidden\n } else {\n // 기본값: 장식용으로 간주 (의미 있는 아이콘은 명시적으로 aria-label 제공 필요)\n // Default: considered decorative (meaningful icons should explicitly provide aria-label)\n accessibilityProps['aria-hidden'] = true\n }\n\n return (\n <span\n ref={ref}\n className={merge(\n 'inline-flex items-center justify-center',\n animationClasses,\n variantClasses,\n className\n )}\n style={{ width: iconSize, height: iconSize }}\n {...accessibilityProps}\n >\n {IconComponent && React.createElement(IconComponent, { \n ...iconProps,\n className: variantClasses,\n 'aria-hidden': true // SVG 내부 요소는 항상 숨김 (외부 span이 접근성 담당)\n } as React.ComponentProps<typeof IconComponent>)}\n </span>\n )\n})\n\nIconComponent.displayName = 'Icon'\n\n// 성능 최적화: React.memo 적용\n// Performance optimization: Apply React.memo\n// forwardRef와 함께 사용할 때는 React.memo로 감싸기\n// When using with forwardRef, wrap with React.memo\nconst MemoizedIcon = React.memo(IconComponent, (prevProps, nextProps) => {\n // props 비교 함수: 변경된 props만 체크\n // Props comparison function: only check changed props\n return (\n prevProps.name === nextProps.name &&\n prevProps.size === nextProps.size &&\n prevProps.className === nextProps.className &&\n prevProps.emotion === nextProps.emotion &&\n prevProps.status === nextProps.status &&\n prevProps.provider === nextProps.provider &&\n prevProps.animated === nextProps.animated &&\n prevProps.pulse === nextProps.pulse &&\n prevProps.spin === nextProps.spin &&\n prevProps.bounce === nextProps.bounce &&\n prevProps.variant === nextProps.variant &&\n prevProps.weight === nextProps.weight &&\n prevProps['aria-label'] === nextProps['aria-label'] &&\n prevProps['aria-hidden'] === nextProps['aria-hidden']\n )\n})\n\n// 타입 안전성을 위해 export\n// Export for type safety\nexport const Icon = MemoizedIcon as typeof IconComponent\n\nIcon.displayName = 'Icon'\n\n/**\n * EmotionIcon 컴포넌트\n * \n * 감정을 표현하는 아이콘 컴포넌트입니다.\n * Icon component for expressing emotions.\n * \n * @component\n * @example\n * ```tsx\n * <EmotionIcon emotion=\"happy\" />\n * <EmotionIcon emotion=\"sad\" size={24} />\n * ```\n */\nexport const EmotionIcon = React.forwardRef<HTMLSpanElement, Omit<IconProps, 'name'> & { emotion: keyof typeof emotionIcons }>(\n (props, ref) => <Icon ref={ref} name=\"smile\" {...props} />\n)\n\nEmotionIcon.displayName = 'EmotionIcon'\n\n/**\n * StatusIcon 컴포넌트\n * \n * 상태를 표현하는 아이콘 컴포넌트입니다.\n * Icon component for expressing status.\n * \n * @component\n * @example\n * ```tsx\n * <StatusIcon status=\"loading\" spin />\n * <StatusIcon status=\"success\" variant=\"success\" />\n * ```\n */\nexport const StatusIcon = React.forwardRef<HTMLSpanElement, Omit<IconProps, 'name'> & { status: keyof typeof statusIcons }>(\n (props, ref) => <Icon ref={ref} name=\"info\" {...props} />\n)\n\nStatusIcon.displayName = 'StatusIcon'\n\n/**\n * LoadingIcon 컴포넌트\n * \n * 로딩 상태를 표시하는 전용 아이콘 컴포넌트입니다.\n * Dedicated icon component for displaying loading status.\n * \n * @component\n * @example\n * ```tsx\n * <LoadingIcon />\n * <LoadingIcon size={32} />\n * ```\n */\nexport const LoadingIcon = React.forwardRef<HTMLDivElement, Omit<IconProps, 'name' | 'status'>>(\n (props, ref) => (\n <Icon ref={ref} name=\"loader\" status=\"loading\" spin aria-label=\"로딩 중\" {...props} />\n )\n)\n\nLoadingIcon.displayName = 'LoadingIcon'\n\n/**\n * SuccessIcon 컴포넌트\n * \n * 성공 상태를 표시하는 전용 아이콘 컴포넌트입니다.\n * Dedicated icon component for displaying success status.\n * \n * @component\n * @example\n * ```tsx\n * <SuccessIcon />\n * <SuccessIcon size={24} />\n * ```\n */\nexport const SuccessIcon = React.forwardRef<HTMLDivElement, Omit<IconProps, 'name' | 'status'>>(\n (props, ref) => (\n <Icon ref={ref} name=\"check\" status=\"success\" variant=\"success\" aria-label=\"성공\" {...props} />\n )\n)\n\nSuccessIcon.displayName = 'SuccessIcon'\n\n/**\n * ErrorIcon 컴포넌트\n * \n * 에러 상태를 표시하는 전용 아이콘 컴포넌트입니다.\n * Dedicated icon component for displaying error status.\n * \n * @component\n * @example\n * ```tsx\n * <ErrorIcon />\n * <ErrorIcon size={24} />\n * ```\n */\nexport const ErrorIcon = React.forwardRef<HTMLDivElement, Omit<IconProps, 'name' | 'status'>>(\n (props, ref) => (\n <Icon ref={ref} name=\"alertCircle\" status=\"error\" variant=\"error\" aria-label=\"오류\" {...props} />\n )\n)\n\nErrorIcon.displayName = 'ErrorIcon'\n\n","/**\n * HUA UI 공통 색상 시스템\n * 중앙화된 색상 팔레트와 스타일 생성 유틸리티\n */\n\nimport type { Color } from \"../types/common\";\nimport { merge } from \"../utils\";\n\n/**\n * Tailwind CSS 색상 클래스 매핑\n * 각 색상의 50-900 단계를 정의합니다.\n */\nconst colorShades = {\n 50: \"50\",\n 100: \"100\",\n 200: \"200\",\n 300: \"300\",\n 400: \"400\",\n 500: \"500\",\n 600: \"600\",\n 700: \"700\",\n 800: \"800\",\n 900: \"900\",\n} as const;\n\ntype ColorShade = keyof typeof colorShades;\n\n/**\n * 색상별 클래스 생성 헬퍼\n */\nfunction colorClass(color: Color, shade: ColorShade, prefix: string = \"\"): string {\n return `${prefix}${color}-${colorShades[shade]}`;\n}\n\n/**\n * 다크 모드 지원 클래스 생성\n */\nfunction withDarkMode(lightClass: string, darkClass: string): string {\n return `${lightClass} dark:${darkClass}`;\n}\n\n/**\n * 색상 스타일 설정 인터페이스\n */\nexport interface ColorStyleConfig {\n /** 기본 variant 스타일 */\n default?: {\n border?: { light: ColorShade; dark?: ColorShade };\n background?: { light: ColorShade; dark?: ColorShade; opacity?: string };\n };\n /** 그라데이션 variant 스타일 */\n gradient?: {\n from?: ColorShade;\n to?: ColorShade;\n border?: { light: ColorShade; dark?: ColorShade };\n };\n /** 아웃라인 variant 스타일 */\n outline?: {\n border?: { light: ColorShade; dark?: ColorShade };\n background?: string;\n text?: { light: ColorShade; dark?: ColorShade };\n };\n /** Elevated variant 스타일 */\n elevated?: {\n border?: { light: ColorShade; dark?: ColorShade };\n background?: { light: string; dark: string };\n shadow?: string;\n };\n /** 아이콘 스타일 */\n icon?: {\n background?: { light: ColorShade; dark?: ColorShade; opacity?: string };\n text?: { light: ColorShade; dark?: ColorShade };\n };\n /** 배지 스타일 */\n badge?: {\n background?: { light: ColorShade; dark?: ColorShade; opacity?: string };\n text?: { light: ColorShade; dark?: ColorShade };\n };\n}\n\n/**\n * 생성된 색상 스타일 인터페이스\n */\nexport interface ColorStyles {\n default: string;\n gradient: string;\n outline: string;\n elevated: string;\n icon: string;\n badge: string;\n}\n\n/**\n * 기본 색상 스타일 설정\n * 각 색상에 대한 기본 스타일 템플릿\n */\nconst defaultColorConfig: Omit<ColorStyleConfig, \"gradient\"> = {\n default: {\n border: { light: 200, dark: 700 },\n background: { light: 50, dark: 900, opacity: \"50\" },\n },\n outline: {\n border: { light: 300, dark: 600 },\n background: \"transparent\",\n text: { light: 600, dark: 400 },\n },\n elevated: {\n border: { light: 200, dark: 700 },\n background: { light: \"white\", dark: \"gray-800\" },\n shadow: \"lg\",\n },\n icon: {\n background: { light: 100, dark: 900, opacity: \"30\" },\n text: { light: 600, dark: 400 },\n },\n badge: {\n background: { light: 50, dark: 900, opacity: \"30\" },\n text: { light: 700, dark: 300 },\n },\n};\n\n/**\n * 그라데이션 스타일 설정\n */\nconst gradientConfig: ColorStyleConfig[\"gradient\"] = {\n from: 500,\n to: 600,\n border: { light: 400, dark: 500 },\n};\n\n/**\n * 색상 스타일 생성 함수\n * \n * @param color - 색상 이름\n * @param config - 커스텀 스타일 설정 (선택사항)\n * @returns 생성된 색상 스타일 객체\n * \n * @example\n * ```tsx\n * const styles = createColorStyles(\"blue\");\n * // styles.default, styles.gradient, styles.outline 등 사용 가능\n * ```\n */\nexport function createColorStyles(\n color: Color,\n config?: Partial<ColorStyleConfig>\n): ColorStyles {\n const finalConfig: ColorStyleConfig = {\n default: config?.default || defaultColorConfig.default,\n gradient: config?.gradient || gradientConfig,\n outline: config?.outline || defaultColorConfig.outline,\n elevated: config?.elevated || defaultColorConfig.elevated,\n icon: config?.icon || defaultColorConfig.icon,\n badge: config?.badge || defaultColorConfig.badge,\n };\n\n // Default variant\n const defaultBorder = finalConfig.default?.border\n ? withDarkMode(\n `border-${colorClass(color, finalConfig.default.border.light)}`,\n `border-${colorClass(color, finalConfig.default.border.dark || finalConfig.default.border.light)}`\n )\n : \"\";\n \n const defaultBg = finalConfig.default?.background\n ? withDarkMode(\n `bg-${colorClass(color, finalConfig.default.background.light)}${finalConfig.default.background.opacity ? `/${finalConfig.default.background.opacity}` : \"\"}`,\n `bg-${colorClass(color, finalConfig.default.background.dark || finalConfig.default.background.light)}${finalConfig.default.background.opacity ? `/${finalConfig.default.background.opacity}` : \"\"}`\n )\n : \"\";\n\n const defaultStyle = merge(defaultBorder, defaultBg);\n\n // Gradient variant\n const gradientFrom = finalConfig.gradient?.from\n ? `from-${colorClass(color, finalConfig.gradient.from)}`\n : \"\";\n const gradientTo = finalConfig.gradient?.to\n ? `to-${colorClass(color, finalConfig.gradient.to)}`\n : \"\";\n const gradientBorder = finalConfig.gradient?.border\n ? withDarkMode(\n `border-${colorClass(color, finalConfig.gradient.border.light)}`,\n `border-${colorClass(color, finalConfig.gradient.border.dark || finalConfig.gradient.border.light)}`\n )\n : \"\";\n \n const gradientStyle = merge(\n \"bg-gradient-to-br\",\n gradientFrom,\n gradientTo,\n gradientBorder\n );\n\n // Outline variant\n const outlineBorder = finalConfig.outline?.border\n ? `border-2 ${withDarkMode(\n `border-${colorClass(color, finalConfig.outline.border.light)}`,\n `border-${colorClass(color, finalConfig.outline.border.dark || finalConfig.outline.border.light)}`\n )}`\n : \"\";\n const outlineBg = finalConfig.outline?.background || \"bg-transparent\";\n const outlineText = finalConfig.outline?.text\n ? withDarkMode(\n `text-${colorClass(color, finalConfig.outline.text.light)}`,\n `text-${colorClass(color, finalConfig.outline.text.dark || finalConfig.outline.text.light)}`\n )\n : \"\";\n \n const outlineStyle = merge(outlineBorder, outlineBg, outlineText);\n\n // Elevated variant\n const elevatedBorder = finalConfig.elevated?.border\n ? withDarkMode(\n `border-${colorClass(color, finalConfig.elevated.border.light)}`,\n `border-${colorClass(color, finalConfig.elevated.border.dark || finalConfig.elevated.border.light)}`\n )\n : \"\";\n const elevatedBg = finalConfig.elevated?.background\n ? withDarkMode(\n `bg-${finalConfig.elevated.background.light}`,\n `bg-${finalConfig.elevated.background.dark}`\n )\n : \"\";\n const elevatedShadow = finalConfig.elevated?.shadow\n ? `shadow-${finalConfig.elevated.shadow}`\n : \"\";\n \n const elevatedStyle = merge(elevatedBorder, elevatedBg, elevatedShadow);\n\n // Icon style\n const iconBg = finalConfig.icon?.background\n ? withDarkMode(\n `bg-${colorClass(color, finalConfig.icon.background.light)}${finalConfig.icon.background.opacity ? `/${finalConfig.icon.background.opacity}` : \"\"}`,\n `bg-${colorClass(color, finalConfig.icon.background.dark || finalConfig.icon.background.light)}${finalConfig.icon.background.opacity ? `/${finalConfig.icon.background.opacity}` : \"\"}`\n )\n : \"\";\n const iconText = finalConfig.icon?.text\n ? withDarkMode(\n `text-${colorClass(color, finalConfig.icon.text.light)}`,\n `text-${colorClass(color, finalConfig.icon.text.dark || finalConfig.icon.text.light)}`\n )\n : \"\";\n \n const iconStyle = merge(iconBg, iconText);\n\n // Badge style\n const badgeBg = finalConfig.badge?.background\n ? withDarkMode(\n `bg-${colorClass(color, finalConfig.badge.background.light)}${finalConfig.badge.background.opacity ? `/${finalConfig.badge.background.opacity}` : \"\"}`,\n `bg-${colorClass(color, finalConfig.badge.background.dark || finalConfig.badge.background.light)}${finalConfig.badge.background.opacity ? `/${finalConfig.badge.background.opacity}` : \"\"}`\n )\n : \"\";\n const badgeText = finalConfig.badge?.text\n ? withDarkMode(\n `text-${colorClass(color, finalConfig.badge.text.light)}`,\n `text-${colorClass(color, finalConfig.badge.text.dark || finalConfig.badge.text.light)}`\n )\n : \"\";\n \n const badgeStyle = merge(badgeBg, badgeText);\n\n return {\n default: defaultStyle,\n gradient: gradientStyle,\n outline: outlineStyle,\n elevated: elevatedStyle,\n icon: iconStyle,\n badge: badgeStyle,\n };\n}\n\n/**\n * 색상 스타일 캐시\n * 동일한 색상과 설정에 대해 재사용하여 성능 최적화\n */\nconst colorStylesCache = new Map<string, ColorStyles>();\n\n/**\n * 메모이제이션된 색상 스타일 생성 함수\n * \n * @param color - 색상 이름\n * @param config - 커스텀 스타일 설정 (선택사항)\n * @returns 생성된 색상 스타일 객체\n */\nexport function useColorStyles(\n color: Color,\n config?: Partial<ColorStyleConfig>\n): ColorStyles {\n const cacheKey = `${color}-${JSON.stringify(config || {})}`;\n \n if (!colorStylesCache.has(cacheKey)) {\n colorStylesCache.set(cacheKey, createColorStyles(color, config));\n }\n \n return colorStylesCache.get(cacheKey)!;\n}\n\n","/**\n * HUA UI 공통 Variant 시스템\n * 컴포넌트 variant 스타일 생성 유틸리티\n */\n\nimport type { ExtendedVariant, Size } from \"../types/common\";\nimport type { ColorStyles } from \"./colors\";\nimport { merge } from \"../utils\";\n\n/**\n * Variant 스타일 생성 함수\n * \n * @param variant - Variant 타입\n * @param colorStyles - 색상 스타일 객체\n * @returns 생성된 variant 클래스 문자열\n * \n * @example\n * ```tsx\n * const colorStyles = useColorStyles(\"blue\");\n * const variantClass = createVariantStyles(\"elevated\", colorStyles);\n * ```\n */\nexport function createVariantStyles(\n variant: ExtendedVariant,\n colorStyles: ColorStyles\n): string {\n const baseClasses = \"rounded-2xl border transition-all duration-200\";\n \n switch (variant) {\n case \"default\":\n return merge(baseClasses, colorStyles.default);\n \n case \"gradient\":\n return merge(baseClasses, \"text-white\", colorStyles.gradient);\n \n case \"outline\":\n return merge(baseClasses, colorStyles.outline);\n \n case \"elevated\":\n return merge(baseClasses, colorStyles.elevated);\n \n default:\n return baseClasses;\n }\n}\n\n/**\n * Size 스타일 설정 인터페이스\n */\nexport interface SizeStyles {\n container: string;\n icon: string;\n iconContainer: string;\n text: string;\n title: string;\n description: string;\n}\n\n/**\n * Size 스타일 생성 함수\n * \n * @param size - 크기 타입\n * @returns 생성된 size 스타일 객체\n * \n * @example\n * ```tsx\n * const sizeStyles = createSizeStyles(\"md\");\n * // sizeStyles.container, sizeStyles.icon 등 사용 가능\n * ```\n */\nexport function createSizeStyles(size: Size = \"md\"): SizeStyles {\n const sizeMap: Record<Size, SizeStyles> = {\n sm: {\n container: \"p-4\",\n icon: \"h-4 w-4\",\n iconContainer: \"w-8 h-8\",\n text: \"text-xs\",\n title: \"text-xs\",\n description: \"text-xs\",\n },\n md: {\n container: \"p-6\",\n icon: \"h-6 w-6\",\n iconContainer: \"w-12 h-12\",\n text: \"text-base\",\n title: \"text-sm\",\n description: \"text-sm\",\n },\n lg: {\n container: \"p-8\",\n icon: \"h-8 w-8\",\n iconContainer: \"w-16 h-16\",\n text: \"text-lg\",\n title: \"text-base\",\n description: \"text-base\",\n },\n xl: {\n container: \"p-10\",\n icon: \"h-10 w-10\",\n iconContainer: \"w-20 h-20\",\n text: \"text-xl\",\n title: \"text-lg\",\n description: \"text-lg\",\n },\n };\n \n return sizeMap[size];\n}\n\n/**\n * Rounded 스타일 타입\n */\nexport type Rounded = \"sm\" | \"md\" | \"lg\" | \"xl\" | \"full\" | \"none\";\n\n/**\n * Rounded 스타일 생성 함수\n * \n * @param rounded - Rounded 타입\n * @returns 생성된 rounded 클래스 문자열\n */\nexport function createRoundedStyles(rounded: Rounded = \"md\"): string {\n const roundedMap: Record<Rounded, string> = {\n sm: \"rounded\",\n md: \"rounded-md\",\n lg: \"rounded-lg\",\n xl: \"rounded-xl\",\n full: \"rounded-full\",\n none: \"rounded-none\",\n };\n \n return roundedMap[rounded];\n}\n\n/**\n * Shadow 스타일 타입\n */\nexport type Shadow = \"none\" | \"sm\" | \"md\" | \"lg\" | \"xl\" | \"2xl\";\n\n/**\n * Shadow 스타일 생성 함수\n * \n * @param shadow - Shadow 타입\n * @returns 생성된 shadow 클래스 문자열\n */\nexport function createShadowStyles(shadow: Shadow = \"md\"): string {\n if (shadow === \"none\") return \"\";\n \n return `shadow-${shadow}`;\n}\n\n/**\n * Hover 효과 타입\n */\nexport type HoverEffect = \"scale\" | \"glow\" | \"slide\" | \"none\";\n\n/**\n * Hover 효과 스타일 생성 함수\n * \n * @param hover - Hover 효과 타입\n * @param reducedMotion - 애니메이션 축소 설정 여부\n * @returns 생성된 hover 클래스 문자열\n */\nexport function createHoverStyles(\n hover: HoverEffect = \"scale\",\n reducedMotion: boolean = false\n): string {\n if (reducedMotion || hover === \"none\") return \"\";\n \n const hoverMap: Record<HoverEffect, string> = {\n scale: \"hover:scale-105 transition-transform duration-200\",\n glow: \"hover:shadow-2xl hover:shadow-blue-500/25 dark:hover:shadow-cyan-400/25 transition-shadow duration-300\",\n slide: \"hover:-translate-y-1 transition-transform duration-200\",\n none: \"\",\n };\n \n return hoverMap[hover];\n}\n\n","\"use client\";\n\nimport React, { useMemo } from \"react\";\nimport { merge } from \"../../lib/utils\";\nimport { Icon } from \"../Icon\";\nimport type { IconName } from \"../../lib/icons\";\nimport { useColorStyles } from \"../../lib/styles/colors\";\nimport { createVariantStyles } from \"../../lib/styles/variants\";\nimport type { Color } from \"../../lib/types/common\";\n\n/**\n * StatCard 컴포넌트의 props / StatCard component props\n * @typedef {Object} StatCardProps\n * @property {string} title - 카드 제목 / Card title\n * @property {string | number | null | undefined} value - 통계 값 / Statistic value\n * @property {string} [description] - 카드 설명 / Card description\n * @property {IconName | React.ReactNode} [icon] - 아이콘 / Icon\n * @property {Object} [trend] - 추세 정보 / Trend information\n * @property {number} trend.value - 추세 값 / Trend value\n * @property {string} trend.label - 추세 라벨 / Trend label\n * @property {boolean} [trend.positive] - 긍정적 추세 여부 / Positive trend\n * @property {\"default\" | \"gradient\" | \"outline\" | \"elevated\"} [variant=\"default\"] - 카드 스타일 변형 / Card style variant\n * @property {\"blue\" | \"purple\" | \"green\" | \"orange\" | \"red\" | \"indigo\" | \"pink\" | \"gray\"} [color] - 카드 색상 / Card color\n * @property {boolean} [loading] - 로딩 상태 / Loading state\n * @property {React.ReactNode} [emptyState] - 빈 상태 컴포넌트 / Empty state component\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface StatCardProps extends React.HTMLAttributes<HTMLDivElement> {\n title: string;\n value: string | number | null | undefined;\n description?: string;\n icon?: IconName | React.ReactNode;\n trend?: {\n value: number;\n label: string;\n positive?: boolean;\n };\n variant?: \"default\" | \"gradient\" | \"outline\" | \"elevated\";\n color?: Color;\n loading?: boolean;\n emptyState?: React.ReactNode;\n}\n\n\n/**\n * StatCard 컴포넌트 / StatCard component\n * \n * 통계 정보를 표시하는 카드 컴포넌트입니다.\n * 제목, 값, 설명, 아이콘, 추세 정보를 포함할 수 있습니다.\n * \n * Card component that displays statistic information.\n * Can include title, value, description, icon, and trend information.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <StatCard\n * title=\"총 사용자\"\n * value=\"1,234\"\n * description=\"지난 달 대비\"\n * icon=\"users\"\n * />\n * \n * @example\n * // 추세 정보 포함 / With trend information\n * <StatCard\n * title=\"매출\"\n * value=\"₩1,000,000\"\n * trend={{ value: 12.5, label: \"전월 대비\", positive: true }}\n * color=\"green\"\n * variant=\"gradient\"\n * />\n * \n * @param {StatCardProps} props - StatCard 컴포넌트의 props / StatCard component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} StatCard 컴포넌트 / StatCard component\n */\nexport const StatCard = React.forwardRef<HTMLDivElement, StatCardProps>(\n (\n {\n title,\n value,\n description,\n icon,\n trend,\n variant = \"elevated\",\n color = \"blue\",\n loading = false,\n emptyState,\n className,\n ...props\n },\n ref\n ) => {\n // 공통 색상 시스템 사용\n const colorStyles = useColorStyles(color);\n const isGradient = variant === \"gradient\";\n const isTextWhite = isGradient;\n\n // Variant 스타일 생성 (elevated는 rounded-3xl로 커스터마이징)\n const variantClass = useMemo(() => {\n const baseClass = createVariantStyles(variant, colorStyles);\n // elevated variant는 rounded-3xl 사용\n if (variant === \"elevated\") {\n return baseClass.replace(\"rounded-2xl\", \"rounded-3xl\");\n }\n return baseClass;\n }, [variant, colorStyles]);\n\n const formatValue = (val: string | number): string => {\n if (typeof val === \"number\") {\n return val.toLocaleString();\n }\n return val;\n };\n\n if (!loading && (value === null || value === undefined || value === \"\")) {\n return emptyState ? (\n <div className={className} {...props}>\n {emptyState}\n </div>\n ) : (\n <div className={merge(\"rounded-2xl border border-slate-100 dark:border-slate-800 p-6\", className)} {...props}>\n <h3 className=\"text-sm font-medium text-slate-500 dark:text-slate-400\">{title}</h3>\n <p className=\"mt-2 text-sm text-slate-400\">데이터가 없습니다.</p>\n </div>\n );\n }\n\n return (\n <div\n ref={ref}\n className={merge(\n \"p-6 transition-all duration-200 hover:shadow-xl\",\n variantClass,\n className\n )}\n {...props}\n >\n <div className=\"flex items-start justify-between mb-4\">\n {/* 아이콘 */}\n {icon && (\n <div className={merge(\n \"w-12 h-12 rounded-lg flex items-center justify-center flex-shrink-0\",\n isGradient ? \"bg-white/20\" : colorStyles.icon\n )}>\n {typeof icon === \"string\" ? (\n <Icon\n name={icon as IconName}\n className={merge(\n \"w-6 h-6\",\n isTextWhite ? \"text-white\" : \"\"\n )}\n />\n ) : (\n icon\n )}\n </div>\n )}\n\n {/* 배지 */}\n {title && (\n <span className={merge(\n \"text-sm px-3 py-1 rounded-full font-medium\",\n isGradient ? \"bg-white/20 text-white\" : colorStyles.badge\n )}>\n {title}\n </span>\n )}\n </div>\n\n {/* 값 */}\n {loading ? (\n <div className=\"h-10 bg-gray-200 dark:bg-gray-700 rounded animate-pulse mb-2\" />\n ) : (\n <h3 className={merge(\n \"text-3xl font-bold mb-1\",\n isTextWhite ? \"text-white\" : \"text-gray-800 dark:text-white\"\n )}>\n {formatValue(value ?? 0)}\n </h3>\n )}\n\n {/* 설명 */}\n {description && (\n <p className={merge(\n \"text-sm\",\n isTextWhite ? \"text-white/90\" : \"text-gray-600 dark:text-gray-300\"\n )}>\n {description}\n </p>\n )}\n\n {/* 트렌드 */}\n {trend && !loading && (\n <div className=\"mt-3 flex items-center gap-1\">\n <span\n className={merge(\n \"text-xs font-medium\",\n trend.positive !== false\n ? \"text-green-600 dark:text-green-400\"\n : \"text-red-600 dark:text-red-400\"\n )}\n >\n {trend.positive !== false ? \"↑\" : \"↓\"} {Math.abs(trend.value)}%\n </span>\n <span className={merge(\n \"text-xs\",\n isTextWhite ? \"text-white/70\" : \"text-gray-500 dark:text-gray-400\"\n )}>\n {trend.label}\n </span>\n </div>\n )}\n </div>\n );\n }\n);\n\nStatCard.displayName = \"StatCard\";\n\n","\"use client\";\n\nimport React, { useMemo } from \"react\";\nimport { merge } from \"../../lib/utils\";\nimport { Icon } from \"../Icon\";\nimport type { IconName } from \"../../lib/icons\";\nimport { useColorStyles } from \"../../lib/styles/colors\";\nimport type { Color } from \"../../lib/types/common\";\n\n/**\n * QuickActionCard 컴포넌트의 props / QuickActionCard component props\n * @typedef {Object} QuickActionCardProps\n * @property {string} title - 카드 제목 / Card title\n * @property {string} [description] - 카드 설명 / Card description\n * @property {IconName | React.ReactNode} [icon] - 아이콘 / Icon\n * @property {string} [href] - 링크 URL / Link URL\n * @property {() => void} [onClick] - 클릭 핸들러 / Click handler\n * @property {\"gradient\" | \"outline\" | \"solid\"} [variant=\"gradient\"] - 카드 스타일 변형 / Card style variant\n * @property {\"blue\" | \"purple\" | \"green\" | \"orange\" | \"red\" | \"indigo\" | \"pink\" | \"gray\"} [color=\"blue\"] - 카드 색상 / Card color\n * @property {boolean} [loading] - 로딩 상태 / Loading state\n * @extends {React.HTMLAttributes<HTMLAnchorElement | HTMLButtonElement>}\n */\nexport interface QuickActionCardProps extends React.HTMLAttributes<HTMLAnchorElement | HTMLButtonElement> {\n title: string;\n description?: string;\n icon?: IconName | React.ReactNode;\n href?: string;\n onClick?: () => void;\n variant?: \"gradient\" | \"outline\" | \"solid\";\n color?: Color;\n loading?: boolean;\n}\n\n\n/**\n * QuickActionCard 컴포넌트 / QuickActionCard component\n * \n * 빠른 액션을 수행하는 카드 컴포넌트입니다.\n * 링크나 버튼으로 동작하며, 클릭 가능한 액션 카드로 사용됩니다.\n * \n * Card component for quick actions.\n * Works as a link or button, used as a clickable action card.\n * \n * @component\n * @example\n * // 링크 카드 / Link card\n * <QuickActionCard\n * title=\"새 주문 생성\"\n * description=\"주문을 빠르게 생성하세요\"\n * icon=\"plus\"\n * href=\"/orders/new\"\n * color=\"blue\"\n * />\n * \n * @example\n * // 버튼 카드 / Button card\n * <QuickActionCard\n * title=\"리포트 다운로드\"\n * description=\"최신 리포트를 다운로드하세요\"\n * icon=\"download\"\n * onClick={handleDownload}\n * variant=\"outline\"\n * color=\"green\"\n * />\n * \n * @param {QuickActionCardProps} props - QuickActionCard 컴포넌트의 props / QuickActionCard component props\n * @param {React.Ref<HTMLAnchorElement | HTMLButtonElement>} ref - anchor 또는 button 요소 ref / anchor or button element ref\n * @returns {JSX.Element} QuickActionCard 컴포넌트 / QuickActionCard component\n */\nexport const QuickActionCard = React.forwardRef<\n HTMLAnchorElement | HTMLButtonElement,\n QuickActionCardProps\n>(\n (\n {\n title,\n description,\n icon,\n href,\n onClick,\n variant = \"gradient\",\n color = \"blue\",\n loading = false,\n className,\n ...props\n },\n ref\n ) => {\n // 공통 색상 시스템 사용\n const colorStyles = useColorStyles(color);\n const isGradient = variant === \"gradient\";\n const isTextWhite = isGradient || variant === \"solid\";\n\n // Variant 스타일 생성 (QuickActionCard는 gradient, outline, solid만 사용)\n const variantClass = useMemo(() => {\n if (variant === \"gradient\") {\n // gradient는 공통 시스템 사용\n return `text-white ${colorStyles.gradient}`;\n } else if (variant === \"outline\") {\n // outline은 공통 시스템 사용\n return colorStyles.outline;\n } else {\n // solid는 별도 처리 (정적 클래스 사용)\n const solidClasses: Record<Color, string> = {\n blue: \"text-white bg-blue-600 hover:bg-blue-700\",\n purple: \"text-white bg-purple-600 hover:bg-purple-700\",\n green: \"text-white bg-green-600 hover:bg-green-700\",\n orange: \"text-white bg-orange-600 hover:bg-orange-700\",\n red: \"text-white bg-red-600 hover:bg-red-700\",\n indigo: \"text-white bg-indigo-600 hover:bg-indigo-700\",\n pink: \"text-white bg-pink-600 hover:bg-pink-700\",\n gray: \"text-white bg-gray-600 hover:bg-gray-700\",\n };\n return solidClasses[color];\n }\n }, [variant, colorStyles, color]);\n\n const baseClasses = merge(\n \"rounded-2xl p-6 transition-all shadow-lg hover:shadow-xl text-center\",\n variantClass,\n className\n );\n\n const content = (\n <>\n {/* 아이콘 */}\n {icon && (\n <div className={merge(\n \"w-12 h-12 rounded-lg flex items-center justify-center mx-auto mb-2\",\n isGradient || variant === \"solid\"\n ? \"bg-white/20\"\n : variant === \"outline\"\n ? colorStyles.icon\n : \"\"\n )}>\n {typeof icon === \"string\" ? (\n <Icon\n name={icon as IconName}\n className={merge(\n \"w-6 h-6\",\n isTextWhite ? \"text-white\" : \"\"\n )}\n />\n ) : (\n icon\n )}\n </div>\n )}\n\n {/* 제목 */}\n <h3 className={merge(\n \"text-xl font-semibold mb-1\",\n isTextWhite ? \"text-white\" : \"\"\n )}>\n {title}\n </h3>\n\n {/* 설명 */}\n {description && (\n <p className={merge(\n \"text-sm\",\n isTextWhite ? \"text-white/90\" : \"text-gray-600 dark:text-gray-300\"\n )}>\n {description}\n </p>\n )}\n\n {loading && (\n <div className=\"mt-2 h-4 bg-white/20 rounded animate-pulse\" />\n )}\n </>\n );\n\n if (href) {\n return (\n <a\n ref={ref as React.Ref<HTMLAnchorElement>}\n href={href}\n className={baseClasses}\n {...(props as React.AnchorHTMLAttributes<HTMLAnchorElement>)}\n >\n {content}\n </a>\n );\n }\n\n return (\n <button\n ref={ref as React.Ref<HTMLButtonElement>}\n onClick={onClick}\n className={baseClasses}\n {...(props as React.ButtonHTMLAttributes<HTMLButtonElement>)}\n >\n {content}\n </button>\n );\n }\n);\n\nQuickActionCard.displayName = \"QuickActionCard\";\n\n","\"use client\";\n\nimport React from \"react\";\nimport { merge } from \"../../lib/utils\";\n\n/**\n * DashboardGrid 컴포넌트의 props\n * @typedef {Object} DashboardGridProps\n * @property {1 | 2 | 3 | 4 | 5 | 6} [columns=4] - 그리드 컬럼 수\n * @property {\"sm\" | \"md\" | \"lg\" | \"xl\"} [gap=\"md\"] - 그리드 간격\n * @property {boolean} [responsive=true] - 반응형 여부\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface DashboardGridProps extends React.HTMLAttributes<HTMLDivElement> {\n columns?: 1 | 2 | 3 | 4 | 5 | 6;\n gap?: \"sm\" | \"md\" | \"lg\" | \"xl\";\n responsive?: boolean;\n}\n\nconst gapClasses = {\n sm: \"gap-3\",\n md: \"gap-6\",\n lg: \"gap-8\",\n xl: \"gap-12\",\n};\n\nconst columnClasses = {\n 1: \"grid-cols-1\",\n 2: \"grid-cols-1 md:grid-cols-2\",\n 3: \"grid-cols-1 md:grid-cols-2 lg:grid-cols-3\",\n 4: \"grid-cols-1 md:grid-cols-2 lg:grid-cols-4\",\n 5: \"grid-cols-1 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-5\",\n 6: \"grid-cols-1 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-6\",\n};\n\n// 비반응형용 고정 클래스 (Tailwind 동적 클래스 생성 문제 해결)\nconst fixedColumnClasses: Record<1 | 2 | 3 | 4 | 5 | 6, string> = {\n 1: \"grid-cols-1\",\n 2: \"grid-cols-2\",\n 3: \"grid-cols-3\",\n 4: \"grid-cols-4\",\n 5: \"grid-cols-5\",\n 6: \"grid-cols-6\",\n};\n\n/**\n * DashboardGrid 컴포넌트\n * \n * 대시보드 그리드 레이아웃을 제공하는 컴포넌트입니다.\n * 반응형 그리드를 지원하며, 다양한 컬럼 수와 간격을 설정할 수 있습니다.\n * \n * Dashboard grid layout component.\n * Supports responsive grid with configurable column count and gap sizes.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <DashboardGrid columns={4}>\n * <StatCard title=\"항목 1\" value=\"100\" />\n * <StatCard title=\"항목 2\" value=\"200\" />\n * </DashboardGrid>\n * \n * @example\n * // 반응형 그리드 / Responsive grid\n * <DashboardGrid columns={3} gap=\"lg\" responsive>\n * <MetricCard title=\"메트릭 1\" value=\"1,000\" />\n * <MetricCard title=\"메트릭 2\" value=\"2,000\" />\n * </DashboardGrid>\n * \n * @param {DashboardGridProps} props - DashboardGrid 컴포넌트의 props / DashboardGrid component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} DashboardGrid 컴포넌트 / DashboardGrid component\n */\nexport const DashboardGrid = React.forwardRef<HTMLDivElement, DashboardGridProps>(\n (\n {\n columns = 4,\n gap = \"md\",\n responsive = true,\n className,\n children,\n ...props\n },\n ref\n ) => {\n const gridClasses = responsive\n ? columnClasses[columns]\n : fixedColumnClasses[columns];\n\n return (\n <div\n ref={ref}\n className={merge(\n \"grid\",\n gridClasses,\n gapClasses[gap],\n className\n )}\n {...props}\n >\n {children}\n </div>\n );\n }\n);\n\nDashboardGrid.displayName = \"DashboardGrid\";\n\n","\"use client\";\n\nimport React from \"react\";\nimport { merge, formatRelativeTime } from \"../../lib/utils\";\nimport { Icon } from \"../Icon\";\nimport type { IconName } from \"../../lib/icons\";\n\n/**\n * ActivityItem 인터페이스 / ActivityItem interface\n * @typedef {Object} ActivityItem\n * @property {string} id - 활동 항목 고유 ID / Activity item unique ID\n * @property {string} title - 활동 제목 / Activity title\n * @property {string} [description] - 활동 설명 / Activity description\n * @property {Date | string} timestamp - 활동 타임스탬프 / Activity timestamp\n * @property {IconName | React.ReactNode} [icon] - 아이콘 / Icon\n * @property {string | React.ReactNode} [badge] - 배지 / Badge\n * @property {() => void} [onClick] - 클릭 핸들러 / Click handler\n * @property {Record<string, unknown>} [metadata] - 추가 메타데이터 / Additional metadata\n */\nexport interface ActivityItem {\n id: string;\n title: string;\n description?: string;\n timestamp: Date | string;\n icon?: IconName | React.ReactNode;\n badge?: string | React.ReactNode;\n onClick?: () => void;\n metadata?: Record<string, unknown>;\n}\n\n/**\n * ActivityFeed 컴포넌트의 props / ActivityFeed component props\n * @typedef {Object} ActivityFeedProps\n * @property {string} [title] - 피드 제목 / Feed title\n * @property {ActivityItem[]} items - 활동 항목 배열 / Activity items array\n * @property {string} [emptyMessage=\"활동 내역이 없습니다.\"] - 빈 상태 메시지 / Empty state message\n * @property {boolean} [showHeader=true] - 헤더 표시 여부 / Show header\n * @property {number} [maxItems] - 최대 표시 항목 수 / Maximum items to display\n * @property {() => void} [onViewAll] - 전체 보기 핸들러 / View all handler\n * @property {string} [viewAllLabel=\"전체 보기\"] - 전체 보기 라벨 / View all label\n * @property {React.ReactNode} [emptyState] - 빈 상태 컴포넌트 / Empty state component\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface ActivityFeedProps extends React.HTMLAttributes<HTMLDivElement> {\n title?: string;\n items: ActivityItem[];\n emptyMessage?: string;\n showHeader?: boolean;\n maxItems?: number;\n onViewAll?: () => void;\n viewAllLabel?: string;\n emptyState?: React.ReactNode;\n}\n\n/**\n * ActivityFeed 컴포넌트 / ActivityFeed component\n * \n * 활동 내역을 표시하는 피드 컴포넌트입니다.\n * 타임스탬프를 상대 시간으로 표시하며, 최대 항목 수 제한을 지원합니다.\n * \n * Feed component that displays activity history.\n * Shows timestamps as relative time and supports maximum items limit.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <ActivityFeed\n * title=\"최근 활동\"\n * items={[\n * {\n * id: \"1\",\n * title: \"새 주문 생성\",\n * description: \"주문 #1234\",\n * timestamp: new Date(),\n * icon: \"shoppingCart\"\n * }\n * ]}\n * />\n * \n * @example\n * // 최대 항목 수 제한 / Maximum items limit\n * <ActivityFeed\n * title=\"활동 내역\"\n * items={activities}\n * maxItems={10}\n * onViewAll={() => navigate(\"/activities\")}\n * />\n * \n * @param {ActivityFeedProps} props - ActivityFeed 컴포넌트의 props / ActivityFeed component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} ActivityFeed 컴포넌트 / ActivityFeed component\n */\nexport const ActivityFeed = React.forwardRef<HTMLDivElement, ActivityFeedProps>(\n (\n {\n title,\n items,\n emptyMessage = \"활동 내역이 없습니다.\",\n showHeader = true,\n maxItems,\n onViewAll,\n viewAllLabel = \"전체 보기\",\n emptyState,\n className,\n ...props\n },\n ref\n ) => {\n const displayItems = maxItems ? items.slice(0, maxItems) : items;\n const hasMore = maxItems && items.length > maxItems;\n\n return (\n <div\n ref={ref}\n className={merge(\n \"bg-white dark:bg-gray-800 rounded-2xl shadow-lg border border-gray-200 dark:border-gray-700\",\n className\n )}\n {...props}\n >\n {/* 헤더 */}\n {showHeader && title && (\n <div className=\"flex items-center justify-between p-6 border-b border-gray-200 dark:border-gray-700\">\n <h2 className=\"text-xl font-bold text-gray-800 dark:text-white flex items-center\">\n {title}\n </h2>\n {onViewAll && (\n <button\n onClick={onViewAll}\n aria-label={`${viewAllLabel} - ${title || \"활동 내역\"}`}\n className=\"text-purple-600 dark:text-purple-400 hover:text-purple-700 dark:hover:text-purple-300 font-medium text-sm transition-colors\"\n >\n {viewAllLabel} →\n </button>\n )}\n </div>\n )}\n\n {/* 활동 목록 */}\n {displayItems.length > 0 ? (\n <div className=\"divide-y divide-gray-200 dark:divide-gray-700\">\n {displayItems.map((item) => (\n <div\n key={item.id}\n onClick={item.onClick}\n className={merge(\n \"p-4 transition-colors\",\n item.onClick && \"hover:bg-gray-50 dark:hover:bg-gray-700/50 cursor-pointer group\"\n )}\n >\n <div className=\"flex items-start justify-between mb-2\">\n <div className=\"flex-1 min-w-0\">\n {/* 아이콘과 제목 */}\n <div className=\"flex items-start gap-3\">\n {item.icon && (\n <div className=\"w-8 h-8 rounded-lg bg-purple-100 dark:bg-purple-900/30 flex items-center justify-center flex-shrink-0 mt-0.5\">\n {typeof item.icon === \"string\" ? (\n <Icon\n name={item.icon as IconName}\n className=\"w-4 h-4 text-purple-600 dark:text-purple-400\"\n />\n ) : (\n item.icon\n )}\n </div>\n )}\n <div className=\"flex-1 min-w-0\">\n <h3 className=\"text-base font-semibold text-gray-800 dark:text-white mb-1 truncate\">\n {item.title}\n </h3>\n {item.description && (\n <p className=\"text-sm text-gray-600 dark:text-gray-300 line-clamp-2\">\n {item.description}\n </p>\n )}\n </div>\n </div>\n </div>\n\n {/* 배지 */}\n {item.badge && (\n <div className=\"ml-2 flex-shrink-0\">\n {typeof item.badge === \"string\" ? (\n <span className=\"px-2 py-1 rounded-full text-xs font-medium bg-green-100 dark:bg-green-900/30 text-green-700 dark:text-green-300\">\n {item.badge}\n </span>\n ) : (\n item.badge\n )}\n </div>\n )}\n </div>\n\n {/* 메타데이터 */}\n {item.metadata && Object.keys(item.metadata).length > 0 && (\n <div className=\"flex items-center gap-1 flex-wrap mt-2\">\n {Object.entries(item.metadata).map(([key, value]) => (\n <span\n key={key}\n className=\"text-xs bg-purple-100 dark:bg-purple-900/30 text-purple-700 dark:text-purple-300 px-2 py-0.5 rounded\"\n >\n {key}: {String(value)}\n </span>\n ))}\n </div>\n )}\n\n {/* 타임스탬프 */}\n <p className=\"text-xs text-gray-500 dark:text-gray-400 mt-2\">\n <time dateTime={item.timestamp instanceof Date ? item.timestamp.toISOString() : typeof item.timestamp === 'string' ? item.timestamp : undefined}>\n {formatRelativeTime(item.timestamp)}\n </time>\n </p>\n </div>\n ))}\n\n {/* 더 보기 */}\n {hasMore && (\n <div className=\"p-4 text-center border-t border-gray-200 dark:border-gray-700\">\n <button\n onClick={onViewAll}\n aria-label={`더 많은 활동 보기 - ${items.length - (maxItems || 0)}개 더`}\n className=\"inline-flex items-center text-sm text-purple-600 dark:text-purple-400 hover:text-purple-700 dark:hover:text-purple-300 font-medium transition-colors\"\n >\n <span>더 많은 활동 보기</span>\n <span className=\"ml-1\">({items.length - (maxItems || 0)}개 더)</span>\n <span className=\"ml-1\">→</span>\n </button>\n </div>\n )}\n </div>\n ) : emptyState ? (\n emptyState\n ) : (\n <div className=\"text-center py-8\">\n <span className=\"text-4xl mb-3 block\">📭</span>\n <p className=\"text-gray-500 dark:text-gray-400 text-sm\">{emptyMessage}</p>\n </div>\n )}\n </div>\n );\n }\n);\n\nActivityFeed.displayName = \"ActivityFeed\";\n\n","\"use client\";\n\nimport React from \"react\";\nimport { merge } from \"../../lib/utils\";\nimport { Icon } from \"../Icon\";\nimport type { IconName } from \"../../lib/icons\";\n\n/**\n * 멤버십 등급 인터페이스\n * @typedef {Object} MembershipTier\n * @property {\"basic\" | \"pro\" | \"premium\" | \"admin\"} tier - 등급\n * @property {string} label - 등급 라벨\n */\nexport interface MembershipTier {\n tier: \"basic\" | \"pro\" | \"premium\" | \"admin\";\n label: string;\n}\n\n/**\n * ProfileCard 컴포넌트의 props / ProfileCard component props\n * @typedef {Object} ProfileCardProps\n * @property {string} name - 사용자 이름 / User name\n * @property {string} [email] - 이메일 / Email\n * @property {string} [avatar] - 아바타 이미지 URL / Avatar image URL\n * @property {string} [avatarAlt] - 아바타 대체 텍스트 / Avatar alt text\n * @property {string} [greeting] - 인사말 / Greeting\n * @property {Date | string} [memberSince] - 가입일 / Member since date\n * @property {MembershipTier[\"tier\"]} [membershipTier] - 멤버십 등급 / Membership tier\n * @property {string} [membershipLabel] - 멤버십 라벨 / Membership label\n * @property {() => void} [onSettingsClick] - 설정 클릭 핸들러 / Settings click handler\n * @property {string} [settingsHref] - 설정 링크 URL / Settings link URL\n * @property {\"default\" | \"gradient\" | \"minimal\"} [variant=\"default\"] - 스타일 변형 / Style variant\n * @property {boolean} [showAvatar=true] - 아바타 표시 여부 / Show avatar\n * @property {boolean} [showMembership=true] - 멤버십 표시 여부 / Show membership\n * @property {boolean} [showSettings=true] - 설정 버튼 표시 여부 / Show settings button\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface ProfileCardProps extends React.HTMLAttributes<HTMLDivElement> {\n name: string;\n email?: string;\n avatar?: string;\n avatarAlt?: string;\n greeting?: string;\n memberSince?: Date | string;\n membershipTier?: MembershipTier[\"tier\"];\n membershipLabel?: string;\n onSettingsClick?: () => void;\n settingsHref?: string;\n variant?: \"default\" | \"gradient\" | \"minimal\";\n showAvatar?: boolean;\n showMembership?: boolean;\n showSettings?: boolean;\n}\n\nconst tierStyles = {\n basic: {\n badge: \"bg-gradient-to-r from-blue-500 to-cyan-500 text-white\",\n icon: \"text-blue-600 dark:text-blue-400\",\n },\n pro: {\n badge: \"bg-gradient-to-r from-purple-500 to-pink-500 text-white\",\n icon: \"text-purple-600 dark:text-purple-400\",\n },\n premium: {\n badge: \"bg-gradient-to-r from-yellow-400 to-orange-500 text-white\",\n icon: \"text-yellow-600 dark:text-yellow-400\",\n },\n admin: {\n badge: \"bg-gradient-to-r from-red-500 to-pink-500 text-white\",\n icon: \"text-red-600 dark:text-red-400\",\n },\n};\n\nconst tierLabels = {\n basic: \"Basic\",\n pro: \"Pro\",\n premium: \"Premium\",\n admin: \"Admin\",\n};\n\n/**\n * ProfileCard 컴포넌트\n * \n * 사용자 프로필 정보를 표시하는 카드 컴포넌트입니다.\n * 아바타, 이름, 이메일, 멤버십 등급 등을 표시할 수 있습니다.\n * \n * Card component that displays user profile information.\n * Can show avatar, name, email, membership tier, and more.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <ProfileCard\n * name=\"홍길동\"\n * email=\"hong@example.com\"\n * avatar=\"/avatar.jpg\"\n * membershipTier=\"premium\"\n * memberSince={new Date(\"2024-01-01\")}\n * />\n * \n * @example\n * // 그라디언트 스타일 / Gradient style\n * <ProfileCard\n * name=\"김철수\"\n * greeting=\"안녕하세요\"\n * variant=\"gradient\"\n * membershipTier=\"pro\"\n * onSettingsClick={() => navigate(\"/settings\")}\n * />\n * \n * @param {ProfileCardProps} props - ProfileCard 컴포넌트의 props / ProfileCard component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} ProfileCard 컴포넌트 / ProfileCard component\n */\nexport const ProfileCard = React.forwardRef<HTMLDivElement, ProfileCardProps>(\n (\n {\n name,\n email,\n avatar,\n avatarAlt,\n greeting,\n memberSince,\n membershipTier,\n membershipLabel,\n onSettingsClick,\n settingsHref,\n variant = \"default\",\n showAvatar = true,\n showMembership = true,\n showSettings = true,\n className,\n ...props\n },\n ref\n ) => {\n const formatDate = (date: Date | string): string => {\n const d = typeof date === \"string\" ? new Date(date) : date;\n return d.toLocaleDateString(\"ko-KR\", {\n year: \"numeric\",\n month: \"long\",\n day: \"numeric\",\n });\n };\n\n const tier = membershipTier || \"basic\";\n const tierStyle = tierStyles[tier];\n const tierLabel = membershipLabel || tierLabels[tier];\n\n const variantClasses = {\n default: \"bg-white dark:bg-gray-800 rounded-2xl shadow-lg border border-gray-200 dark:border-gray-700\",\n gradient: \"bg-gradient-to-br from-blue-50 via-purple-50 to-pink-50 dark:from-gray-800 dark:via-gray-800 dark:to-gray-900 rounded-2xl shadow-xl border border-white/20 dark:border-gray-700/20\",\n minimal: \"bg-transparent\",\n };\n\n return (\n <div\n ref={ref}\n className={merge(\n \"relative overflow-hidden p-6\",\n variantClasses[variant],\n className\n )}\n {...props}\n >\n {/* 그라데이션 배경 장식 (gradient variant일 때) */}\n {variant === \"gradient\" && (\n <>\n <div className=\"absolute inset-0 bg-gradient-to-br from-blue-500 via-purple-500 to-pink-500 opacity-10 dark:opacity-20\"></div>\n <div className=\"absolute inset-0 bg-gradient-to-tr from-cyan-400 via-blue-500 to-purple-600 opacity-5 dark:opacity-15\"></div>\n </>\n )}\n\n <div className=\"relative flex items-start gap-6\">\n {/* 설정 아이콘 */}\n {showSettings && (onSettingsClick || settingsHref) && (\n <div className=\"absolute top-0 right-0\">\n {settingsHref ? (\n <a\n href={settingsHref}\n className=\"p-2 text-gray-400 dark:text-gray-300 hover:text-blue-600 dark:hover:text-blue-400 transition-colors\"\n title=\"설정\"\n >\n <Icon name=\"settings\" className=\"w-6 h-6\" />\n </a>\n ) : (\n <button\n onClick={onSettingsClick}\n className=\"p-2 text-gray-400 dark:text-gray-300 hover:text-blue-600 dark:hover:text-blue-400 transition-colors\"\n title=\"설정\"\n >\n <Icon name=\"settings\" className=\"w-6 h-6\" />\n </button>\n )}\n </div>\n )}\n\n {/* 아바타 */}\n {showAvatar && (\n <div className=\"relative flex-shrink-0\">\n {avatar ? (\n <img\n src={avatar}\n alt={avatarAlt || name}\n className=\"w-20 h-20 rounded-full border-4 border-white dark:border-gray-700 shadow-lg object-cover\"\n />\n ) : (\n <div className=\"w-20 h-20 rounded-full bg-gradient-to-br from-blue-500 to-purple-600 flex items-center justify-center border-4 border-white dark:border-gray-700 shadow-lg\">\n <span className=\"text-2xl font-bold text-white\">\n {name.charAt(0).toUpperCase()}\n </span>\n </div>\n )}\n </div>\n )}\n\n {/* 정보 */}\n <div className=\"flex-1 min-w-0\">\n {/* 인사말 */}\n {greeting && (\n <div className=\"text-lg sm:text-xl font-semibold mb-2\">\n {greeting.split(\" \").map((part, index) => {\n const isEmoji = /[\\u{1F600}-\\u{1F64F}]|[\\u{1F300}-\\u{1F5FF}]|[\\u{1F680}-\\u{1F6FF}]|[\\u{1F1E0}-\\u{1F1FF}]|[\\u{2600}-\\u{26FF}]|[\\u{2700}-\\u{27BF}]/u.test(part);\n return (\n <span key={index}>\n {isEmoji ? (\n <span className=\"text-gray-900 dark:text-white\">{part}</span>\n ) : (\n <span className=\"text-xl sm:text-2xl font-bold bg-gradient-to-r from-blue-500 to-purple-500 bg-clip-text text-transparent\">\n {part}\n </span>\n )}\n {index < greeting.split(\" \").length - 1 && \" \"}\n </span>\n );\n })}\n </div>\n )}\n\n {/* 이름과 멤버십 뱃지 */}\n <div className=\"flex flex-wrap items-center gap-2 sm:gap-3 mb-2\">\n <span className=\"text-xl sm:text-2xl font-bold text-gray-900 dark:text-white truncate\">\n {name}!\n </span>\n {showMembership && membershipTier && (\n <span\n className={merge(\n \"inline-flex items-center px-3 py-1 rounded-full text-xs font-semibold shadow-lg\",\n tierStyle.badge\n )}\n >\n <svg className=\"w-3 h-3 mr-1\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n {tier === \"premium\" ? (\n <path d=\"M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z\" />\n ) : tier === \"admin\" ? (\n <path fillRule=\"evenodd\" d=\"M11.49 3.17c-.38-1.56-2.6-1.56-2.98 0a1.532 1.532 0 01-2.286.948c-1.372-.836-2.942.734-2.106 2.106.54.886.061 2.042-.947 2.287-1.561.379-1.561 2.6 0 2.978a1.532 1.532 0 012.287.947c.379 1.561 2.6 1.561 2.978 0a1.533 1.533 0 012.287-.947c1.372.836 2.942-.734 2.106-2.106a1.533 1.533 0 01.947-2.287c1.561-.379 1.561-2.6 0-2.978a1.532 1.532 0 01-.947-2.287c.836-1.372-.734-2.942-2.106-2.106a1.532 1.532 0 01-2.287-.947zM10 13a3 3 0 100-6 3 3 0 000 6z\" clipRule=\"evenodd\" />\n ) : (\n <path fillRule=\"evenodd\" d=\"M6.267 3.455a3.066 3.066 0 001.745-.723 3.066 3.066 0 013.976 0 3.066 3.066 0 001.745.723 3.066 3.066 0 012.812 2.812c.051.643.304 1.254.723 1.745a3.066 3.066 0 010 3.976 3.066 3.066 0 00-.723 1.745 3.066 3.066 0 01-2.812 2.812 3.066 3.066 0 00-1.745.723 3.066 3.066 0 01-3.976 0 3.066 3.066 0 00-1.745-.723 3.066 3.066 0 01-2.812-2.812 3.066 3.066 0 00-.723-1.745 3.066 3.066 0 010-3.976 3.066 3.066 0 00.723-1.745 3.066 3.066 0 012.812-2.812zm7.44 5.252a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z\" clipRule=\"evenodd\" />\n )}\n </svg>\n {tierLabel}\n </span>\n )}\n </div>\n\n {/* 이메일 */}\n {email && (\n <div className=\"text-gray-600 dark:text-gray-400 text-sm mb-1 truncate\">\n {email}\n </div>\n )}\n\n {/* 가입일 */}\n {memberSince && (\n <div className=\"text-gray-400 text-xs flex items-center gap-1\">\n <Icon name=\"clock\" className=\"w-3 h-3\" />\n 가입일 {formatDate(memberSince)}\n </div>\n )}\n </div>\n </div>\n </div>\n );\n }\n);\n\nProfileCard.displayName = \"ProfileCard\";\n\n","\"use client\";\n\nimport React from \"react\";\nimport { merge } from \"../../lib/utils\";\n\n/**\n * MembershipBadge 컴포넌트의 props / MembershipBadge component props\n * @typedef {Object} MembershipBadgeProps\n * @property {\"basic\" | \"pro\" | \"premium\" | \"admin\"} tier - 멤버십 등급 / Membership tier\n * @property {string} [label] - 커스텀 라벨 (기본값: 등급별 라벨) / Custom label (default: tier-specific label)\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - 배지 크기 / Badge size\n * @property {boolean} [showIcon=true] - 아이콘 표시 여부 / Show icon\n * @extends {React.HTMLAttributes<HTMLSpanElement>}\n */\nexport interface MembershipBadgeProps extends React.HTMLAttributes<HTMLSpanElement> {\n tier: \"basic\" | \"pro\" | \"premium\" | \"admin\";\n label?: string;\n size?: \"sm\" | \"md\" | \"lg\";\n showIcon?: boolean;\n}\n\nconst tierConfig = {\n basic: {\n gradient: \"bg-gradient-to-r from-blue-500 to-cyan-500\",\n label: \"Basic\",\n },\n pro: {\n gradient: \"bg-gradient-to-r from-purple-500 to-pink-500\",\n label: \"Pro\",\n },\n premium: {\n gradient: \"bg-gradient-to-r from-yellow-400 to-orange-500\",\n label: \"Premium\",\n },\n admin: {\n gradient: \"bg-gradient-to-r from-red-500 to-pink-500\",\n label: \"Admin\",\n },\n};\n\nconst sizeClasses = {\n sm: {\n container: \"px-2 py-0.5 text-xs\",\n icon: \"w-2.5 h-2.5\",\n },\n md: {\n container: \"px-3 py-1 text-xs\",\n icon: \"w-3 h-3\",\n },\n lg: {\n container: \"px-4 py-1.5 text-sm\",\n icon: \"w-4 h-4\",\n },\n};\n\n/**\n * MembershipBadge 컴포넌트\n * \n * 멤버십 등급을 표시하는 배지 컴포넌트입니다.\n * 등급별로 다른 그라디언트 색상과 아이콘을 제공합니다.\n * \n * Badge component that displays membership tier.\n * Provides different gradient colors and icons for each tier.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <MembershipBadge tier=\"premium\" />\n * \n * @example\n * // 커스텀 라벨과 크기 / Custom label and size\n * <MembershipBadge\n * tier=\"pro\"\n * label=\"프로 플랜\"\n * size=\"lg\"\n * showIcon={false}\n * />\n * \n * @param {MembershipBadgeProps} props - MembershipBadge 컴포넌트의 props / MembershipBadge component props\n * @param {React.Ref<HTMLSpanElement>} ref - span 요소 ref / span element ref\n * @returns {JSX.Element} MembershipBadge 컴포넌트 / MembershipBadge component\n */\nexport const MembershipBadge = React.forwardRef<HTMLSpanElement, MembershipBadgeProps>(\n (\n {\n tier,\n label,\n size = \"md\",\n showIcon = true,\n className,\n ...props\n },\n ref\n ) => {\n const config = tierConfig[tier];\n const sizeStyle = sizeClasses[size];\n const displayLabel = label || config.label;\n\n const getIcon = () => {\n if (!showIcon) return null;\n\n if (tier === \"premium\") {\n return (\n <svg className={sizeStyle.icon} fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path d=\"M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z\" />\n </svg>\n );\n }\n\n if (tier === \"admin\") {\n return (\n <svg className={sizeStyle.icon} fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fillRule=\"evenodd\" d=\"M11.49 3.17c-.38-1.56-2.6-1.56-2.98 0a1.532 1.532 0 01-2.286.948c-1.372-.836-2.942.734-2.106 2.106.54.886.061 2.042-.947 2.287-1.561.379-1.561 2.6 0 2.978a1.532 1.532 0 012.287.947c.379 1.561 2.6 1.561 2.978 0a1.533 1.533 0 012.287-.947c1.372.836 2.942-.734 2.106-2.106a1.533 1.533 0 01.947-2.287c1.561-.379 1.561-2.6 0-2.978a1.532 1.532 0 01-.947-2.287c.836-1.372-.734-2.942-2.106-2.106a1.532 1.532 0 01-2.287-.947zM10 13a3 3 0 100-6 3 3 0 000 6z\" clipRule=\"evenodd\" />\n </svg>\n );\n }\n\n return (\n <svg className={sizeStyle.icon} fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fillRule=\"evenodd\" d=\"M6.267 3.455a3.066 3.066 0 001.745-.723 3.066 3.066 0 013.976 0 3.066 3.066 0 001.745.723 3.066 3.066 0 012.812 2.812c.051.643.304 1.254.723 1.745a3.066 3.066 0 010 3.976 3.066 3.066 0 00-.723 1.745 3.066 3.066 0 01-2.812 2.812 3.066 3.066 0 00-1.745.723 3.066 3.066 0 01-3.976 0 3.066 3.066 0 00-1.745-.723 3.066 3.066 0 01-2.812-2.812 3.066 3.066 0 00-.723-1.745 3.066 3.066 0 010-3.976 3.066 3.066 0 00.723-1.745 3.066 3.066 0 012.812-2.812zm7.44 5.252a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z\" clipRule=\"evenodd\" />\n </svg>\n );\n };\n\n return (\n <span\n ref={ref}\n className={merge(\n \"inline-flex items-center rounded-full font-semibold text-white shadow-lg\",\n config.gradient,\n sizeStyle.container,\n className\n )}\n {...props}\n >\n {showIcon && <span className=\"mr-1\">{getIcon()}</span>}\n {displayLabel}\n </span>\n );\n }\n);\n\nMembershipBadge.displayName = \"MembershipBadge\";\n\n","\"use client\";\n\nimport React from \"react\";\nimport { merge } from \"../../lib/utils\";\nimport type { Color } from \"../../lib/types/common\";\n\n/**\n * MiniBarChart 컴포넌트의 props\n * @typedef {Object} MiniBarChartProps\n * @property {number[]} data - 차트 데이터 배열\n * @property {string[]} [labels] - 라벨 배열\n * @property {number} [maxValue] - 최대값 (자동 계산 시 생략)\n * @property {number} [height=160] - 차트 높이 (px)\n * @property {boolean} [showTooltip=true] - 툴팁 표시 여부\n * @property {boolean} [showStats=true] - 통계 정보 표시 여부\n * @property {\"blue\" | \"purple\" | \"green\" | \"orange\" | \"red\" | \"indigo\" | \"pink\" | \"gray\"} [color=\"blue\"] - 색상\n * @property {boolean} [highlightToday=true] - 오늘 항목 강조 여부\n * @property {number} [todayIndex] - 오늘 인덱스 (기본값: 마지막 항목)\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface MiniBarChartProps extends React.HTMLAttributes<HTMLDivElement> {\n data: number[];\n labels?: string[];\n maxValue?: number;\n height?: number;\n showTooltip?: boolean;\n showStats?: boolean;\n color?: Color;\n highlightToday?: boolean;\n todayIndex?: number;\n}\n\n// 차트 전용 색상 (막대 그래프용 그라데이션)\nconst chartColors: Record<Color, { default: string; highlight: string }> = {\n blue: {\n default: \"bg-gradient-to-t from-blue-500 to-blue-400\",\n highlight: \"bg-gradient-to-t from-blue-600 to-blue-500 shadow-lg\",\n },\n purple: {\n default: \"bg-gradient-to-t from-purple-500 to-purple-400\",\n highlight: \"bg-gradient-to-t from-purple-600 to-purple-500 shadow-lg\",\n },\n green: {\n default: \"bg-gradient-to-t from-green-500 to-green-400\",\n highlight: \"bg-gradient-to-t from-green-600 to-green-500 shadow-lg\",\n },\n orange: {\n default: \"bg-gradient-to-t from-orange-500 to-orange-400\",\n highlight: \"bg-gradient-to-t from-orange-600 to-orange-500 shadow-lg\",\n },\n red: {\n default: \"bg-gradient-to-t from-red-500 to-red-400\",\n highlight: \"bg-gradient-to-t from-red-600 to-red-500 shadow-lg\",\n },\n indigo: {\n default: \"bg-gradient-to-t from-indigo-500 to-indigo-400\",\n highlight: \"bg-gradient-to-t from-indigo-600 to-indigo-500 shadow-lg\",\n },\n pink: {\n default: \"bg-gradient-to-t from-pink-500 to-pink-400\",\n highlight: \"bg-gradient-to-t from-pink-600 to-pink-500 shadow-lg\",\n },\n gray: {\n default: \"bg-gradient-to-t from-gray-500 to-gray-400\",\n highlight: \"bg-gradient-to-t from-gray-600 to-gray-500 shadow-lg\",\n },\n};\n\n/**\n * MiniBarChart 컴포넌트\n * \n * 작은 막대 그래프 차트 컴포넌트입니다.\n * 간단한 데이터 시각화에 적합하며, 오늘 항목 강조 기능을 제공합니다.\n * \n * Small bar chart component for simple data visualization.\n * Suitable for compact displays with today's item highlight feature.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <MiniBarChart\n * data={[10, 20, 15, 30, 25, 40, 35]}\n * labels={[\"월\", \"화\", \"수\", \"목\", \"금\", \"토\", \"일\"]}\n * />\n * \n * @example\n * // 커스텀 색상과 통계 / Custom color and stats\n * <MiniBarChart\n * data={dailyData}\n * color=\"purple\"\n * showStats={true}\n * highlightToday={true}\n * todayIndex={6}\n * />\n * \n * @param {MiniBarChartProps} props - MiniBarChart 컴포넌트의 props / MiniBarChart component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} MiniBarChart 컴포넌트 / MiniBarChart component\n */\nexport const MiniBarChart = React.forwardRef<HTMLDivElement, MiniBarChartProps>(\n (\n {\n data,\n labels,\n maxValue,\n height = 160,\n showTooltip = true,\n showStats = true,\n color = \"blue\",\n highlightToday = true,\n todayIndex,\n className,\n ...props\n },\n ref\n ) => {\n const colors = chartColors[color];\n const calculatedMax = maxValue || Math.max(...data, 1);\n const fixedMax = Math.max(calculatedMax, 10);\n const todayIdx = todayIndex !== undefined ? todayIndex : data.length - 1;\n\n const calculateHeight = (value: number): number => {\n if (fixedMax === 0) return 8;\n return Math.max((value / fixedMax) * height, 8);\n };\n\n const total = data.reduce((sum, val) => sum + val, 0);\n const average = data.length > 0 ? Math.round(total / data.length) : 0;\n const max = Math.max(...data);\n\n const chartId = React.useId();\n const chartLabel = labels && labels.length > 0\n ? `미니 막대 그래프 - ${labels.length}개 항목, 최대값 ${max.toLocaleString()}, 평균 ${average.toLocaleString()}`\n : `미니 막대 그래프 - ${data.length}개 항목, 최대값 ${max.toLocaleString()}, 평균 ${average.toLocaleString()}`;\n\n return (\n <div\n ref={ref}\n role=\"img\"\n aria-label={chartLabel}\n className={merge(\"w-full\", className)}\n {...props}\n >\n {/* 그래프 영역 */}\n <div\n className=\"flex items-end justify-between gap-2 px-2 relative\"\n style={{ height: `${height + 40}px` }}\n >\n {/* 기준선 */}\n <div className=\"absolute inset-x-2 bottom-8 border-t border-gray-200 dark:border-gray-700 opacity-50\"></div>\n\n {data.map((value, index) => {\n const isToday = highlightToday && index === todayIdx;\n const barHeight = calculateHeight(value);\n const barColor = isToday ? colors.highlight : colors.default;\n\n return (\n <div\n key={index}\n className=\"flex flex-col items-center flex-1 group relative\"\n >\n {/* 툴팁 */}\n {showTooltip && (\n <div className=\"absolute bottom-full left-1/2 transform -translate-x-1/2 mb-2 px-2 py-1 bg-gray-900 dark:bg-gray-700 text-white text-xs rounded opacity-0 group-hover:opacity-100 transition-opacity duration-200 pointer-events-none whitespace-nowrap z-10\">\n {value}개\n <div className=\"absolute top-full left-1/2 transform -translate-x-1/2 w-0 h-0 border-l-4 border-r-4 border-t-4 border-transparent border-t-gray-900 dark:border-t-gray-700\"></div>\n </div>\n )}\n\n {/* 값 표시 (호버 시) */}\n <div className=\"text-xs font-medium text-gray-700 dark:text-gray-300 mb-1 opacity-0 group-hover:opacity-100 transition-opacity duration-200\">\n {value}\n </div>\n\n {/* 막대 */}\n <div className=\"relative w-full flex-1 flex items-end\">\n <div\n className={merge(\n \"w-full rounded-t-lg transition-all duration-500 ease-out group-hover:scale-105\",\n barColor\n )}\n style={{\n height: `${barHeight}px`,\n minHeight: \"8px\",\n }}\n >\n {/* 막대 위 점 */}\n {value > 0 && (\n <div className=\"absolute -top-1 left-1/2 transform -translate-x-1/2 w-2 h-2 bg-white dark:bg-gray-800 rounded-full shadow-sm\"></div>\n )}\n </div>\n </div>\n\n {/* 라벨 */}\n {labels && labels[index] && (\n <div\n className={merge(\n \"text-xs font-medium mt-2 transition-colors duration-200\",\n isToday\n ? \"text-purple-600 dark:text-purple-400\"\n : \"text-gray-500 dark:text-gray-400\"\n )}\n >\n {labels[index]}\n </div>\n )}\n </div>\n );\n })}\n </div>\n\n {/* 통계 정보 */}\n {showStats && (\n <div className=\"mt-4 flex justify-between items-center text-xs text-gray-500 dark:text-gray-400 px-2\">\n <div>\n 총: {total}\n </div>\n <div>\n 평균: {average}\n </div>\n <div>\n 최고: {max}\n </div>\n </div>\n )}\n </div>\n );\n }\n);\n\nMiniBarChart.displayName = \"MiniBarChart\";\n\n","\"use client\";\n\nimport React, { useMemo } from \"react\";\nimport { merge } from \"../../lib/utils\";\nimport { Icon } from \"../Icon\";\nimport type { IconName } from \"../../lib/icons\";\nimport { useColorStyles } from \"../../lib/styles/colors\";\nimport { createVariantStyles } from \"../../lib/styles/variants\";\nimport type { Color } from \"../../lib/types/common\";\n\n/**\n * SummaryCard 컴포넌트의 props\n * @typedef {Object} SummaryCardProps\n * @property {string} title - 카드 제목\n * @property {string | number} value - 요약 값\n * @property {string} [subtitle] - 부제목\n * @property {IconName | React.ReactNode} [icon] - 아이콘\n * @property {\"blue\" | \"purple\" | \"green\" | \"orange\" | \"red\" | \"indigo\" | \"pink\" | \"gray\"} [color] - 카드 색상\n * @property {\"default\" | \"gradient\" | \"outline\"} [variant=\"default\"] - 카드 스타일 변형\n * @property {string} [href] - 링크 URL\n * @property {() => void} [onClick] - 클릭 핸들러\n * @property {boolean} [loading] - 로딩 상태\n * @property {string | React.ReactNode} [badge] - 배지\n * @property {React.ReactNode} [footer] - 푸터 콘텐츠\n * @property {boolean} [showAction] - 액션 버튼 표시 여부\n * @property {string} [actionLabel] - 액션 버튼 라벨\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface SummaryCardProps extends React.HTMLAttributes<HTMLDivElement> {\n title: string;\n value: string | number;\n subtitle?: string;\n icon?: IconName | React.ReactNode;\n color?: Color;\n variant?: \"default\" | \"gradient\" | \"outline\";\n href?: string;\n onClick?: () => void;\n loading?: boolean;\n badge?: string | React.ReactNode;\n footer?: React.ReactNode;\n showAction?: boolean;\n actionLabel?: string;\n}\n\n// SummaryCard는 default variant가 특별한 그라데이션을 사용하므로 별도 처리\nconst defaultVariantGradients: Record<Color, string> = {\n blue: \"bg-gradient-to-br from-blue-50 to-indigo-100 dark:from-blue-900/20 dark:to-indigo-900/20\",\n purple: \"bg-gradient-to-br from-purple-50 to-pink-100 dark:from-purple-900/20 dark:to-pink-900/20\",\n green: \"bg-gradient-to-br from-green-50 to-emerald-100 dark:from-green-900/20 dark:to-emerald-900/20\",\n orange: \"bg-gradient-to-br from-orange-50 to-amber-100 dark:from-orange-900/20 dark:to-amber-900/20\",\n red: \"bg-gradient-to-br from-red-50 to-rose-100 dark:from-red-900/20 dark:to-rose-900/20\",\n indigo: \"bg-gradient-to-br from-indigo-50 to-blue-100 dark:from-indigo-900/20 dark:to-blue-900/20\",\n pink: \"bg-gradient-to-br from-pink-50 to-rose-100 dark:from-pink-900/20 dark:to-rose-900/20\",\n gray: \"bg-gradient-to-br from-gray-50 to-gray-100 dark:from-gray-900/20 dark:to-gray-800/20\",\n};\n\nconst buttonGradients: Record<Color, string> = {\n blue: \"bg-gradient-to-r from-blue-600 to-indigo-600 hover:from-blue-700 hover:to-indigo-700\",\n purple: \"bg-gradient-to-r from-purple-600 to-pink-600 hover:from-purple-700 hover:to-pink-700\",\n green: \"bg-gradient-to-r from-green-600 to-emerald-600 hover:from-green-700 hover:to-emerald-700\",\n orange: \"bg-gradient-to-r from-orange-600 to-amber-600 hover:from-orange-700 hover:to-amber-700\",\n red: \"bg-gradient-to-r from-red-600 to-rose-600 hover:from-red-700 hover:to-rose-700\",\n indigo: \"bg-gradient-to-r from-indigo-600 to-blue-600 hover:from-indigo-700 hover:to-blue-700\",\n pink: \"bg-gradient-to-r from-pink-600 to-rose-600 hover:from-pink-700 hover:to-rose-700\",\n gray: \"bg-gradient-to-r from-gray-600 to-gray-700 hover:from-gray-700 hover:to-gray-800\",\n};\n\n/**\n * SummaryCard 컴포넌트 / SummaryCard component\n * \n * 요약 정보를 표시하는 카드 컴포넌트입니다.\n * 제목, 값, 부제목, 아이콘을 포함하며, 클릭 가능한 링크나 액션 버튼을 지원합니다.\n * \n * Card component that displays summary information.\n * Includes title, value, subtitle, icon, and supports clickable links or action buttons.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <SummaryCard\n * title=\"총 매출\"\n * value=\"₩10,000,000\"\n * subtitle=\"이번 달\"\n * icon=\"dollarSign\"\n * />\n * \n * @example\n * // 클릭 가능한 카드 / Clickable card\n * <SummaryCard\n * title=\"주문\"\n * value=\"1,234\"\n * href=\"/orders\"\n * showAction\n * actionLabel=\"자세히 보기\"\n * color=\"blue\"\n * variant=\"gradient\"\n * />\n * \n * @param {SummaryCardProps} props - SummaryCard 컴포넌트의 props / SummaryCard component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} SummaryCard 컴포넌트 / SummaryCard component\n */\nexport const SummaryCard = React.forwardRef<HTMLDivElement, SummaryCardProps>(\n (\n {\n title,\n value,\n subtitle,\n icon,\n color = \"blue\",\n variant = \"default\",\n href,\n onClick,\n loading = false,\n badge,\n footer,\n showAction = true,\n actionLabel = \"자세히 보기\",\n className,\n ...props\n },\n ref\n ) => {\n // 공통 색상 시스템 사용\n const colorStyles = useColorStyles(color);\n const isGradient = variant === \"gradient\";\n const isTextWhite = isGradient;\n\n // Variant 스타일 생성 (default는 특별한 그라데이션 사용)\n const variantClass = useMemo(() => {\n if (variant === \"default\") {\n return `rounded-xl shadow-lg ${defaultVariantGradients[color]}`;\n } else if (variant === \"gradient\") {\n return `rounded-xl shadow-xl text-white ${colorStyles.gradient}`;\n } else {\n return `rounded-xl ${colorStyles.outline}`;\n }\n }, [variant, colorStyles, color]);\n\n const formatValue = (val: string | number): string => {\n if (typeof val === \"number\") {\n return val.toLocaleString();\n }\n return val;\n };\n\n const content = (\n <div\n ref={ref}\n className={merge(\n \"p-6 flex flex-col min-h-[220px] relative overflow-hidden group hover:shadow-xl transition-all duration-300\",\n variantClass,\n className\n )}\n {...props}\n >\n {/* 배경 장식 */}\n {/* 배경 장식 - 정적 클래스 사용 */}\n <div className={merge(\n \"absolute top-0 right-0 w-32 h-32 bg-gradient-to-bl to-transparent rounded-full -translate-y-16 translate-x-16\",\n color === \"blue\" ? \"from-blue-400/10\" :\n color === \"purple\" ? \"from-purple-400/10\" :\n color === \"green\" ? \"from-green-400/10\" :\n color === \"orange\" ? \"from-orange-400/10\" :\n color === \"red\" ? \"from-red-400/10\" :\n color === \"indigo\" ? \"from-indigo-400/10\" :\n color === \"pink\" ? \"from-pink-400/10\" :\n \"from-gray-400/10\"\n )}></div>\n <div className={merge(\n \"absolute bottom-0 left-0 w-24 h-24 bg-gradient-to-tr to-transparent rounded-full translate-y-12 -translate-x-12\",\n color === \"blue\" ? \"from-blue-400/10\" :\n color === \"purple\" ? \"from-purple-400/10\" :\n color === \"green\" ? \"from-green-400/10\" :\n color === \"orange\" ? \"from-orange-400/10\" :\n color === \"red\" ? \"from-red-400/10\" :\n color === \"indigo\" ? \"from-indigo-400/10\" :\n color === \"pink\" ? \"from-pink-400/10\" :\n \"from-gray-400/10\"\n )}></div>\n\n {/* 헤더 */}\n <div className=\"flex items-center justify-between mb-4 relative z-10\">\n <div className=\"flex items-center\">\n {icon && (\n <div className={merge(\n \"p-2 rounded-lg\",\n isGradient ? \"bg-white/20\" : colorStyles.icon\n )}>\n {typeof icon === \"string\" ? (\n <Icon\n name={icon as IconName}\n className={merge(\n \"w-6 h-6\",\n isTextWhite ? \"text-white\" : \"\"\n )}\n />\n ) : (\n icon\n )}\n </div>\n )}\n <span className={merge(\n \"text-lg font-semibold ml-3\",\n isTextWhite ? \"text-white\" : \"text-gray-900 dark:text-white\"\n )}>\n {title}\n </span>\n </div>\n {badge && (\n <div className=\"text-xs font-medium\">\n {typeof badge === \"string\" ? (\n <span className={merge(\n \"px-2 py-1 rounded-full\",\n isGradient ? \"bg-white/20 text-white\" : \"bg-white/50 dark:bg-gray-800/50 text-gray-700 dark:text-gray-300\"\n )}>\n {badge}\n </span>\n ) : (\n badge\n )}\n </div>\n )}\n </div>\n\n {/* 값 */}\n <div className=\"flex-1 flex flex-col justify-center relative z-10\">\n {loading ? (\n <div className=\"h-10 bg-gray-200 dark:bg-gray-700 rounded animate-pulse mb-2\" />\n ) : (\n <>\n <div className={merge(\n \"text-3xl font-bold mb-2\",\n isTextWhite ? \"text-white\" : \"text-gray-900 dark:text-white\"\n )}>\n {formatValue(value)}\n </div>\n {subtitle && (\n <div className={merge(\n \"text-sm mb-4\",\n isTextWhite ? \"text-white/90\" : \"text-gray-600 dark:text-gray-400\"\n )}>\n {subtitle}\n </div>\n )}\n </>\n )}\n </div>\n\n {/* 푸터 */}\n {footer && (\n <div className=\"relative z-10 mb-4\">\n {footer}\n </div>\n )}\n\n {/* 액션 버튼 */}\n {showAction && (href || onClick) && (\n <div className=\"relative z-10\">\n {href ? (\n <a\n href={href}\n className={merge(\n \"block w-full text-center py-3 rounded-lg font-semibold text-white hover:shadow-lg transition-all duration-200 group-hover:scale-[1.02]\",\n buttonGradients[color]\n )}\n >\n {actionLabel}\n </a>\n ) : (\n <button\n onClick={onClick}\n className={merge(\n \"block w-full text-center py-3 rounded-lg font-semibold text-white hover:shadow-lg transition-all duration-200 group-hover:scale-[1.02]\",\n buttonGradients[color]\n )}\n >\n {actionLabel}\n </button>\n )}\n </div>\n )}\n </div>\n );\n\n return content;\n }\n);\n\nSummaryCard.displayName = \"SummaryCard\";\n\n","\"use client\";\n\nimport React from \"react\";\nimport { merge, formatRelativeTime } from \"../../lib/utils\";\nimport { Icon } from \"../Icon\";\nimport type { IconName } from \"../../lib/icons\";\n\n/**\n * NotificationItem 인터페이스\n * @typedef {Object} NotificationItem\n * @property {string} id - 알림 고유 ID\n * @property {string} title - 알림 제목\n * @property {string} message - 알림 메시지\n * @property {Date | string} timestamp - 알림 타임스탬프\n * @property {\"info\" | \"warning\" | \"error\" | \"success\"} [type] - 알림 타입\n * @property {IconName | React.ReactNode} [icon] - 아이콘\n * @property {() => void} [onClick] - 클릭 핸들러\n * @property {string} [href] - 링크 URL\n */\nexport interface NotificationItem {\n id: string;\n title: string;\n message: string;\n timestamp: Date | string;\n type?: \"info\" | \"warning\" | \"error\" | \"success\";\n icon?: IconName | React.ReactNode;\n onClick?: () => void;\n href?: string;\n}\n\n/**\n * NotificationCard 컴포넌트의 props / NotificationCard component props\n * @typedef {Object} NotificationCardProps\n * @property {string} [title=\"알림 및 공지\"] - 카드 제목 / Card title\n * @property {NotificationItem[]} items - 알림 항목 배열 / Notification items array\n * @property {string} [emptyMessage=\"알림이 없습니다.\"] - 빈 상태 메시지 / Empty state message\n * @property {number} [maxItems] - 최대 표시 항목 수 / Maximum items to display\n * @property {() => void} [onViewAll] - 전체 보기 핸들러 / View all handler\n * @property {string} [viewAllLabel=\"모든 알림 보기\"] - 전체 보기 라벨 / View all label\n * @property {boolean} [showHeader=true] - 헤더 표시 여부 / Show header\n * @property {boolean} [showCount=true] - 개수 표시 여부 / Show count\n * @property {React.ReactNode} [emptyState] - 빈 상태 컴포넌트 / Empty state component\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface NotificationCardProps extends React.HTMLAttributes<HTMLDivElement> {\n title?: string;\n items: NotificationItem[];\n emptyMessage?: string;\n maxItems?: number;\n onViewAll?: () => void;\n viewAllLabel?: string;\n showHeader?: boolean;\n showCount?: boolean;\n emptyState?: React.ReactNode;\n}\n\nconst typeStyles = {\n info: {\n container: \"bg-gradient-to-r from-blue-50 to-indigo-50 dark:from-blue-900/20 dark:to-indigo-900/20\",\n border: \"border-blue-200/50 dark:border-blue-700/30\",\n dot: \"bg-blue-500\",\n },\n warning: {\n container: \"bg-gradient-to-r from-orange-50 to-red-50 dark:from-orange-900/20 dark:to-red-900/20\",\n border: \"border-orange-200/50 dark:border-orange-700/30\",\n dot: \"bg-red-500\",\n },\n error: {\n container: \"bg-gradient-to-r from-red-50 to-rose-50 dark:from-red-900/20 dark:to-rose-900/20\",\n border: \"border-red-200/50 dark:border-red-700/30\",\n dot: \"bg-red-600\",\n },\n success: {\n container: \"bg-gradient-to-r from-green-50 to-emerald-50 dark:from-green-900/20 dark:to-emerald-900/20\",\n border: \"border-green-200/50 dark:border-green-700/30\",\n dot: \"bg-green-500\",\n },\n};\n\nconst defaultTypeStyles = {\n container: \"bg-gradient-to-r from-gray-50 to-gray-100 dark:from-gray-900/20 dark:to-gray-800/20\",\n border: \"border-gray-200/50 dark:border-gray-700/30\",\n dot: \"bg-gray-500\",\n};\n\n/**\n * NotificationCard 컴포넌트 / NotificationCard component\n * \n * 알림 목록을 표시하는 카드 컴포넌트입니다.\n * 여러 알림 항목을 표시하며, 타입별로 다른 스타일을 적용할 수 있습니다.\n * \n * Card component that displays a list of notifications.\n * Shows multiple notification items and can apply different styles by type.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <NotificationCard\n * items={[\n * {\n * id: \"1\",\n * title: \"새 주문\",\n * message: \"주문 #1234가 생성되었습니다\",\n * timestamp: new Date(),\n * type: \"success\"\n * }\n * ]}\n * />\n * \n * @example\n * // 최대 항목 수 제한 / Maximum items limit\n * <NotificationCard\n * title=\"최근 알림\"\n * items={notifications}\n * maxItems={5}\n * onViewAll={() => navigate(\"/notifications\")}\n * showCount\n * />\n * \n * @param {NotificationCardProps} props - NotificationCard 컴포넌트의 props / NotificationCard component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} NotificationCard 컴포넌트 / NotificationCard component\n */\nexport const NotificationCard = React.forwardRef<HTMLDivElement, NotificationCardProps>(\n (\n {\n title = \"알림 및 공지\",\n items,\n emptyMessage = \"알림이 없습니다.\",\n maxItems,\n onViewAll,\n viewAllLabel = \"모든 알림 보기\",\n showHeader = true,\n showCount = true,\n emptyState,\n className,\n ...props\n },\n ref\n ) => {\n const displayItems = maxItems ? items.slice(0, maxItems) : items;\n const hasMore = maxItems && items.length > maxItems;\n\n\n const getTypeStyles = (type?: NotificationItem[\"type\"]) => {\n if (!type) return defaultTypeStyles;\n return typeStyles[type];\n };\n\n return (\n <div\n ref={ref}\n className={merge(\n \"bg-white dark:bg-gray-800 rounded-xl shadow p-6\",\n className\n )}\n {...props}\n >\n {/* 헤더 */}\n {showHeader && (\n <div className=\"flex items-center justify-between mb-4\">\n <div className=\"flex items-center\">\n <div className=\"p-2 bg-orange-500/10 rounded-lg mr-3\">\n <Icon name=\"bell\" className=\"w-6 h-6 text-orange-600 dark:text-orange-400\" />\n </div>\n <h3 className=\"text-lg font-semibold text-gray-900 dark:text-white\">\n {title}\n </h3>\n </div>\n {showCount && items.length > 0 && (\n <span className=\"inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium bg-orange-100 text-orange-800 dark:bg-orange-900/30 dark:text-orange-300\">\n {items.length}개\n </span>\n )}\n </div>\n )}\n\n {/* 알림 목록 */}\n {displayItems.length > 0 ? (\n <div className=\"space-y-3\">\n {displayItems.map((item) => {\n const typeStyle = getTypeStyles(item.type);\n const content = (\n <div\n className={merge(\n \"p-3 rounded-lg border\",\n typeStyle.container,\n typeStyle.border,\n (item.onClick || item.href) && \"cursor-pointer hover:shadow-md transition-all duration-200\"\n )}\n >\n <div className=\"flex items-start\">\n <div className={merge(\n \"w-2 h-2 rounded-full mt-2 mr-3 flex-shrink-0\",\n typeStyle.dot\n )}></div>\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center justify-between mb-1\">\n <span className=\"text-sm font-semibold text-gray-900 dark:text-white\">\n {item.title}\n </span>\n <time \n dateTime={item.timestamp instanceof Date ? item.timestamp.toISOString() : typeof item.timestamp === 'string' ? item.timestamp : undefined}\n className=\"text-xs text-gray-500 dark:text-gray-400 ml-2 flex-shrink-0\"\n >\n {formatRelativeTime(item.timestamp)}\n </time>\n </div>\n <p className=\"text-xs text-gray-600 dark:text-gray-400\">\n {item.message}\n </p>\n </div>\n </div>\n </div>\n );\n\n if (item.href) {\n return (\n <a key={item.id} href={item.href}>\n {content}\n </a>\n );\n }\n\n if (item.onClick) {\n return (\n <div key={item.id} onClick={item.onClick}>\n {content}\n </div>\n );\n }\n\n return <div key={item.id}>{content}</div>;\n })}\n </div>\n ) : emptyState ? (\n emptyState\n ) : (\n <div className=\"text-center py-8\">\n <Icon name=\"bell\" className=\"w-12 h-12 text-gray-400 dark:text-gray-500 mx-auto mb-3\" />\n <p className=\"text-gray-500 dark:text-gray-400 text-sm\">{emptyMessage}</p>\n </div>\n )}\n\n {/* 더 보기 */}\n {hasMore && onViewAll && (\n <div className=\"mt-4 text-center\">\n <button\n onClick={onViewAll}\n className=\"text-sm text-gray-400 dark:text-gray-500 hover:text-gray-600 dark:hover:text-gray-300 font-medium transition-colors\"\n >\n {viewAllLabel} ({items.length - (maxItems || 0)}개 더)\n </button>\n </div>\n )}\n </div>\n );\n }\n);\n\nNotificationCard.displayName = \"NotificationCard\";\n\n","\"use client\";\n\nimport React, { useMemo } from \"react\";\nimport { merge } from \"../../lib/utils\";\nimport { Icon } from \"../Icon\";\nimport type { IconName } from \"../../lib/icons\";\nimport { MiniBarChart } from \"./MiniBarChart\";\nimport { useColorStyles } from \"../../lib/styles/colors\";\nimport { createVariantStyles } from \"../../lib/styles/variants\";\nimport type { Color } from \"../../lib/types/common\";\n\n/**\n * MetricCard 컴포넌트의 props / MetricCard component props\n * @typedef {Object} MetricCardProps\n * @property {string} title - 카드 제목 / Card title\n * @property {string | number} value - 메트릭 값 / Metric value\n * @property {string} [description] - 카드 설명 / Card description\n * @property {IconName | React.ReactNode} [icon] - 아이콘 / Icon\n * @property {Object} [trend] - 추세 정보 / Trend information\n * @property {number} trend.value - 추세 값 / Trend value\n * @property {string} trend.label - 추세 라벨 / Trend label\n * @property {boolean} [trend.positive] - 긍정적 추세 여부 / Positive trend\n * @property {number[]} [chartData] - 차트 데이터 / Chart data\n * @property {string[]} [chartLabels] - 차트 라벨 / Chart labels\n * @property {\"default\" | \"gradient\" | \"outline\" | \"elevated\"} [variant=\"default\"] - 카드 스타일 변형 / Card style variant\n * @property {\"blue\" | \"purple\" | \"green\" | \"orange\" | \"red\" | \"indigo\" | \"pink\" | \"gray\"} [color] - 카드 색상 / Card color\n * @property {boolean} [loading] - 로딩 상태 / Loading state\n * @property {boolean} [showChart] - 차트 표시 여부 / Show chart\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface MetricCardProps extends React.HTMLAttributes<HTMLDivElement> {\n title: string;\n value: string | number;\n description?: string;\n icon?: IconName | React.ReactNode;\n trend?: {\n value: number;\n label: string;\n positive?: boolean;\n };\n chartData?: number[];\n chartLabels?: string[];\n variant?: \"default\" | \"gradient\" | \"outline\" | \"elevated\";\n color?: Color;\n loading?: boolean;\n showChart?: boolean;\n}\n\n\n/**\n * MetricCard 컴포넌트 / MetricCard component\n * \n * 메트릭 정보를 표시하는 카드 컴포넌트입니다.\n * StatCard와 유사하지만 차트 데이터를 포함할 수 있습니다.\n * \n * Card component that displays metric information.\n * Similar to StatCard but can include chart data.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <MetricCard\n * title=\"페이지뷰\"\n * value=\"10,234\"\n * description=\"오늘\"\n * icon=\"eye\"\n * />\n * \n * @example\n * // 차트 포함 / With chart\n * <MetricCard\n * title=\"방문자\"\n * value=\"5,678\"\n * chartData={[100, 200, 150, 300, 250]}\n * chartLabels={[\"월\", \"화\", \"수\", \"목\", \"금\"]}\n * showChart\n * color=\"blue\"\n * />\n * \n * @param {MetricCardProps} props - MetricCard 컴포넌트의 props / MetricCard component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} MetricCard 컴포넌트 / MetricCard component\n */\nexport const MetricCard = React.forwardRef<HTMLDivElement, MetricCardProps>(\n (\n {\n title,\n value,\n description,\n icon,\n trend,\n chartData,\n chartLabels,\n variant = \"elevated\",\n color = \"blue\",\n loading = false,\n showChart = false,\n className,\n ...props\n },\n ref\n ) => {\n // 공통 색상 시스템 사용\n const colorStyles = useColorStyles(color);\n const isGradient = variant === \"gradient\";\n const isTextWhite = isGradient;\n\n // Variant 스타일 생성 (elevated는 rounded-3xl로 커스터마이징)\n const variantClass = useMemo(() => {\n const baseClass = createVariantStyles(variant, colorStyles);\n // elevated variant는 rounded-3xl 사용\n if (variant === \"elevated\") {\n return baseClass.replace(\"rounded-2xl\", \"rounded-3xl\");\n }\n return baseClass;\n }, [variant, colorStyles]);\n\n const formatValue = (val: string | number): string => {\n if (typeof val === \"number\") {\n return val.toLocaleString();\n }\n return val;\n };\n\n return (\n <div\n ref={ref}\n className={merge(\n \"p-6 transition-all duration-200 hover:shadow-xl\",\n variantClass,\n className\n )}\n {...props}\n >\n <div className=\"flex items-start justify-between mb-4\">\n {/* 아이콘 */}\n {icon && (\n <div className={merge(\n \"w-12 h-12 rounded-lg flex items-center justify-center flex-shrink-0\",\n isGradient ? \"bg-white/20\" : colorStyles.icon\n )}>\n {typeof icon === \"string\" ? (\n <Icon\n name={icon as IconName}\n className={merge(\n \"w-6 h-6\",\n isTextWhite ? \"text-white\" : \"\"\n )}\n />\n ) : (\n icon\n )}\n </div>\n )}\n\n {/* 배지 */}\n {title && (\n <span className={merge(\n \"text-sm px-3 py-1 rounded-full font-medium\",\n isGradient ? \"bg-white/20 text-white\" : colorStyles.badge\n )}>\n {title}\n </span>\n )}\n </div>\n\n {/* 값 */}\n {loading ? (\n <div className=\"h-10 bg-gray-200 dark:bg-gray-700 rounded animate-pulse mb-2\" />\n ) : (\n <h3 className={merge(\n \"text-3xl font-bold mb-1\",\n isTextWhite ? \"text-white\" : \"text-gray-800 dark:text-white\"\n )}>\n {formatValue(value)}\n </h3>\n )}\n\n {/* 설명 */}\n {description && (\n <p className={merge(\n \"text-sm mb-3\",\n isTextWhite ? \"text-white/90\" : \"text-gray-600 dark:text-gray-300\"\n )}>\n {description}\n </p>\n )}\n\n {/* 차트 */}\n {showChart && chartData && chartData.length > 0 && (\n <div className=\"mt-4 mb-3\">\n <MiniBarChart\n data={chartData}\n labels={chartLabels}\n color={color}\n height={100}\n showStats={false}\n />\n </div>\n )}\n\n {/* 트렌드 */}\n {trend && !loading && (\n <div className=\"mt-3 flex items-center gap-1\">\n <span\n className={merge(\n \"text-xs font-medium\",\n trend.positive !== false\n ? \"text-green-600 dark:text-green-400\"\n : \"text-red-600 dark:text-red-400\"\n )}\n >\n {trend.positive !== false ? \"↑\" : \"↓\"} {Math.abs(trend.value)}%\n </span>\n <span className={merge(\n \"text-xs\",\n isTextWhite ? \"text-white/70\" : \"text-gray-500 dark:text-gray-400\"\n )}>\n {trend.label}\n </span>\n </div>\n )}\n </div>\n );\n }\n);\n\nMetricCard.displayName = \"MetricCard\";\n\n","\"use client\";\n\nimport React, { useMemo } from \"react\";\nimport { merge } from \"../../lib/utils\";\nimport { Icon } from \"../Icon\";\nimport type { IconName } from \"../../lib/icons\";\nimport { useColorStyles } from \"../../lib/styles/colors\";\nimport { createVariantStyles } from \"../../lib/styles/variants\";\nimport type { Color } from \"../../lib/types/common\";\n\n/**\n * ProgressCard 컴포넌트의 props / ProgressCard component props\n * @typedef {Object} ProgressCardProps\n * @property {string} title - 카드 제목 / Card title\n * @property {number} current - 현재 값 / Current value\n * @property {number} total - 전체 값 / Total value\n * @property {string} [unit] - 단위 / Unit\n * @property {string} [description] - 카드 설명 / Card description\n * @property {IconName | React.ReactNode} [icon] - 아이콘 / Icon\n * @property {\"blue\" | \"purple\" | \"green\" | \"orange\" | \"red\" | \"indigo\" | \"pink\" | \"gray\"} [color] - 카드 색상 / Card color\n * @property {\"default\" | \"gradient\" | \"outline\" | \"elevated\"} [variant=\"default\"] - 카드 스타일 변형 / Card style variant\n * @property {boolean} [showPercentage] - 퍼센트 표시 여부 / Show percentage\n * @property {boolean} [showLabel] - 라벨 표시 여부 / Show label\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - 카드 크기 / Card size\n * @property {boolean} [loading] - 로딩 상태 / Loading state\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface ProgressCardProps extends React.HTMLAttributes<HTMLDivElement> {\n title: string;\n current: number;\n total: number;\n unit?: string;\n description?: string;\n icon?: IconName | React.ReactNode;\n color?: Color;\n variant?: \"default\" | \"gradient\" | \"outline\" | \"elevated\";\n showPercentage?: boolean;\n showLabel?: boolean;\n size?: \"sm\" | \"md\" | \"lg\";\n loading?: boolean;\n}\n\n// Progress bar 색상은 별도 처리\nconst progressColors: Record<Color, string> = {\n blue: \"bg-blue-500\",\n purple: \"bg-purple-500\",\n green: \"bg-green-500\",\n orange: \"bg-orange-500\",\n red: \"bg-red-500\",\n indigo: \"bg-indigo-500\",\n pink: \"bg-pink-500\",\n gray: \"bg-gray-500\",\n};\n\nconst sizeStyles = {\n sm: {\n container: \"p-4\",\n icon: \"w-8 h-8\",\n iconSize: \"w-4 h-4\",\n title: \"text-sm\",\n value: \"text-xl\",\n progress: \"h-1.5\",\n },\n md: {\n container: \"p-6\",\n icon: \"w-12 h-12\",\n iconSize: \"w-6 h-6\",\n title: \"text-base\",\n value: \"text-2xl\",\n progress: \"h-2\",\n },\n lg: {\n container: \"p-8\",\n icon: \"w-16 h-16\",\n iconSize: \"w-8 h-8\",\n title: \"text-lg\",\n value: \"text-3xl\",\n progress: \"h-3\",\n },\n};\n\n/**\n * ProgressCard 컴포넌트 / ProgressCard component\n * \n * 진행률을 표시하는 카드 컴포넌트입니다.\n * 현재 값과 전체 값을 비교하여 진행률을 시각적으로 표시합니다.\n * \n * Card component that displays progress.\n * Compares current value with total value to visually display progress.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <ProgressCard\n * title=\"목표 달성률\"\n * current={75}\n * total={100}\n * unit=\"%\"\n * description=\"이번 달 목표\"\n * />\n * \n * @example\n * // 퍼센트 표시 / Show percentage\n * <ProgressCard\n * title=\"판매 진행률\"\n * current={150}\n * total={200}\n * showPercentage\n * color=\"green\"\n * variant=\"gradient\"\n * />\n * \n * @param {ProgressCardProps} props - ProgressCard 컴포넌트의 props / ProgressCard component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} ProgressCard 컴포넌트 / ProgressCard component\n */\nexport const ProgressCard = React.forwardRef<HTMLDivElement, ProgressCardProps>(\n (\n {\n title,\n current,\n total,\n unit = \"\",\n description,\n icon,\n color = \"blue\",\n variant = \"elevated\",\n showPercentage = true,\n showLabel = true,\n size = \"md\",\n loading = false,\n className,\n ...props\n },\n ref\n ) => {\n const colorStyles = useColorStyles(color);\n const sizes = sizeStyles[size];\n const percentage = total > 0 ? Math.min(Math.max((current / total) * 100, 0), 100) : 0;\n const isGradient = variant === \"gradient\";\n\n const variantClasses = {\n default: `rounded-2xl border ${colorStyles.default}`,\n gradient: `rounded-2xl border text-white ${colorStyles.gradient}`,\n outline: `rounded-2xl border-2 ${colorStyles.outline}`,\n elevated: `rounded-3xl border ${colorStyles.elevated}`,\n };\n\n const variantClass = variantClasses[variant];\n\n return (\n <div\n ref={ref}\n className={merge(\n \"transition-all duration-200 hover:shadow-xl\",\n variantClass,\n sizes.container,\n className\n )}\n {...props}\n >\n <div className=\"flex items-start justify-between mb-4\">\n {/* 아이콘 */}\n {icon && (\n <div\n className={merge(\n \"rounded-lg flex items-center justify-center flex-shrink-0\",\n sizes.icon,\n isGradient ? \"bg-white/20\" : colorStyles.icon\n )}\n >\n {typeof icon === \"string\" ? (\n <Icon\n name={icon as IconName}\n className={merge(\n sizes.iconSize,\n isGradient ? \"text-white\" : \"\"\n )}\n />\n ) : (\n icon\n )}\n </div>\n )}\n\n {/* 제목 */}\n <div className=\"flex-1 ml-4\">\n <h3\n className={merge(\n \"font-semibold mb-1\",\n sizes.title,\n isGradient ? \"text-white\" : \"text-gray-800 dark:text-white\"\n )}\n >\n {title}\n </h3>\n {description && (\n <p\n className={merge(\n \"text-sm\",\n isGradient ? \"text-white/90\" : \"text-gray-600 dark:text-gray-400\"\n )}\n >\n {description}\n </p>\n )}\n </div>\n </div>\n\n {/* 진행률 표시 */}\n {loading ? (\n <div className=\"space-y-2\">\n <div className=\"h-4 bg-gray-200 dark:bg-gray-700 rounded animate-pulse\" />\n <div className=\"h-2 bg-gray-200 dark:bg-gray-700 rounded animate-pulse\" />\n </div>\n ) : (\n <>\n {/* 값 표시 */}\n <div className=\"flex items-baseline justify-between mb-2\">\n <span\n className={merge(\n \"font-bold\",\n sizes.value,\n isGradient ? \"text-white\" : `text-${color}-600 dark:text-${color}-400`\n )}\n >\n {current.toLocaleString()}\n {unit && <span className=\"text-sm ml-1\">{unit}</span>}\n </span>\n {showLabel && (\n <span\n className={merge(\n \"text-sm\",\n isGradient ? \"text-white/80\" : \"text-gray-600 dark:text-gray-400\"\n )}\n >\n / {total.toLocaleString()}\n {unit && <span className=\"ml-1\">{unit}</span>}\n </span>\n )}\n </div>\n\n {/* 진행률 바 */}\n <div className=\"w-full bg-gray-200 dark:bg-gray-700 rounded-full overflow-hidden\">\n <div\n className={merge(\n \"rounded-full transition-all duration-500\",\n sizes.progress,\n isGradient\n ? `bg-gradient-to-r ${colorStyles.gradient.replace(\"bg-gradient-to-br\", \"bg-gradient-to-r\").trim()}`\n : progressColors[color]\n )}\n style={{ width: `${percentage}%` }}\n />\n </div>\n\n {/* 퍼센트 표시 */}\n {showPercentage && (\n <div className=\"mt-2 flex justify-end\">\n <span\n className={merge(\n \"text-xs font-semibold\",\n isGradient ? \"text-white/90\" : `text-${color}-600 dark:text-${color}-400`\n )}\n >\n {percentage.toFixed(1)}%\n </span>\n </div>\n )}\n </>\n )}\n </div>\n );\n }\n);\n\nProgressCard.displayName = \"ProgressCard\";\n\n","\"use client\";\n\nimport React from \"react\";\nimport { merge } from \"../../lib/utils\";\nimport { Icon } from \"../Icon\";\nimport type { IconName } from \"../../lib/icons\";\n\n/**\n * DashboardEmptyState 컴포넌트의 props / DashboardEmptyState component props\n * @typedef {Object} DashboardEmptyStateProps\n * @property {IconName | React.ReactNode} [icon=\"inbox\"] - 아이콘 / Icon\n * @property {string} title - 제목 / Title\n * @property {string} [description] - 설명 / Description\n * @property {string} [actionText] - 액션 버튼 텍스트 / Action button text\n * @property {string} [actionHref] - 액션 버튼 링크 URL / Action button link URL\n * @property {() => void} [actionOnClick] - 액션 버튼 클릭 핸들러 / Action button click handler\n * @property {\"default\" | \"warning\" | \"info\" | \"error\" | \"success\"} [variant=\"default\"] - 스타일 변형 / Style variant\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - 크기 / Size\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface DashboardEmptyStateProps extends React.HTMLAttributes<HTMLDivElement> {\n icon?: IconName | React.ReactNode;\n title: string;\n description?: string;\n actionText?: string;\n actionHref?: string;\n actionOnClick?: () => void;\n variant?: \"default\" | \"warning\" | \"info\" | \"error\" | \"success\";\n size?: \"sm\" | \"md\" | \"lg\";\n}\n\nconst variantStyles = {\n default: {\n icon: \"text-gray-400 dark:text-gray-500\",\n title: \"text-gray-900 dark:text-white\",\n description: \"text-gray-600 dark:text-gray-400\",\n },\n warning: {\n icon: \"text-yellow-500 dark:text-yellow-400\",\n title: \"text-gray-900 dark:text-white\",\n description: \"text-gray-600 dark:text-gray-400\",\n },\n info: {\n icon: \"text-blue-500 dark:text-blue-400\",\n title: \"text-gray-900 dark:text-white\",\n description: \"text-gray-600 dark:text-gray-400\",\n },\n error: {\n icon: \"text-red-500 dark:text-red-400\",\n title: \"text-gray-900 dark:text-white\",\n description: \"text-gray-600 dark:text-gray-400\",\n },\n success: {\n icon: \"text-green-500 dark:text-green-400\",\n title: \"text-gray-900 dark:text-white\",\n description: \"text-gray-600 dark:text-gray-400\",\n },\n};\n\nconst sizeStyles = {\n sm: {\n container: \"py-8\",\n icon: \"w-8 h-8 mb-3\",\n title: \"text-base\",\n description: \"text-sm\",\n button: \"text-sm px-4 py-2\",\n },\n md: {\n container: \"py-12\",\n icon: \"w-12 h-12 mb-4\",\n title: \"text-lg\",\n description: \"text-sm\",\n button: \"text-sm px-6 py-2\",\n },\n lg: {\n container: \"py-16\",\n icon: \"w-16 h-16 mb-6\",\n title: \"text-xl\",\n description: \"text-base\",\n button: \"text-base px-8 py-3\",\n },\n};\n\n/**\n * DashboardEmptyState 컴포넌트\n * \n * 대시보드에서 빈 상태를 표시하는 컴포넌트입니다.\n * 데이터가 없을 때 사용자에게 안내 메시지와 액션을 제공합니다.\n * \n * Empty state component for dashboards.\n * Displays a message and action when there is no data to show.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <DashboardEmptyState\n * icon=\"inbox\"\n * title=\"데이터가 없습니다\"\n * description=\"새로운 데이터를 추가해보세요\"\n * actionText=\"데이터 추가\"\n * actionOnClick={handleAdd}\n * />\n * \n * @example\n * // 경고 스타일 / Warning style\n * <DashboardEmptyState\n * icon=\"warning\"\n * title=\"오류가 발생했습니다\"\n * description=\"잠시 후 다시 시도해주세요\"\n * variant=\"warning\"\n * size=\"lg\"\n * />\n * \n * @param {DashboardEmptyStateProps} props - DashboardEmptyState 컴포넌트의 props / DashboardEmptyState component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} DashboardEmptyState 컴포넌트 / DashboardEmptyState component\n */\nexport const DashboardEmptyState = React.forwardRef<HTMLDivElement, DashboardEmptyStateProps>(\n (\n {\n icon = \"inbox\",\n title,\n description,\n actionText,\n actionHref,\n actionOnClick,\n variant = \"default\",\n size = \"md\",\n className,\n ...props\n },\n ref\n ) => {\n const styles = variantStyles[variant];\n const sizes = sizeStyles[size];\n\n const actionButton = actionText && (actionHref || actionOnClick) && (\n <div className=\"mt-6\">\n {actionHref ? (\n <a\n href={actionHref}\n aria-label={actionText}\n className={merge(\n \"inline-flex items-center justify-center rounded-lg font-medium bg-gray-100 dark:bg-gray-800 text-gray-700 dark:text-gray-300 hover:bg-gray-200 dark:hover:bg-gray-700 border border-gray-300 dark:border-gray-600 transition-colors duration-200\",\n sizes.button\n )}\n >\n {actionText}\n </a>\n ) : (\n <button\n onClick={actionOnClick}\n aria-label={actionText}\n className={merge(\n \"inline-flex items-center justify-center rounded-lg font-medium bg-gray-100 dark:bg-gray-800 text-gray-700 dark:text-gray-300 hover:bg-gray-200 dark:hover:bg-gray-700 border border-gray-300 dark:border-gray-600 transition-colors duration-200\",\n sizes.button\n )}\n >\n {actionText}\n </button>\n )}\n </div>\n );\n\n return (\n <div\n ref={ref}\n className={merge(\n \"text-center\",\n sizes.container,\n className\n )}\n {...props}\n >\n {/* 아이콘 */}\n {icon && (\n <div className={merge(\"mx-auto\", styles.icon)}>\n {typeof icon === \"string\" ? (\n <Icon name={icon as IconName} className={merge(\"w-full h-full\", styles.icon)} />\n ) : (\n icon\n )}\n </div>\n )}\n\n {/* 제목 */}\n <h3 className={merge(\"font-semibold mb-2\", styles.title, sizes.title)}>\n {title}\n </h3>\n\n {/* 설명 */}\n {description && (\n <p className={merge(\"mb-4\", styles.description, sizes.description)}>\n {description}\n </p>\n )}\n\n {/* 액션 버튼 */}\n {actionButton}\n </div>\n );\n }\n);\n\nDashboardEmptyState.displayName = \"DashboardEmptyState\";\n\n","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * Tooltip 컴포넌트의 props / Tooltip component props\n * @typedef {Object} TooltipProps\n * @property {string} content - Tooltip 내용 / Tooltip content\n * @property {React.ReactNode} children - Tooltip이 연결될 요소 / Element to attach tooltip to\n * @property {\"top\" | \"bottom\" | \"left\" | \"right\"} [position=\"top\"] - Tooltip 표시 위치 / Tooltip display position\n * @property {\"default\" | \"light\" | \"dark\"} [variant=\"default\"] - Tooltip 스타일 변형 / Tooltip style variant\n * @property {number} [delay=300] - Tooltip 표시 지연 시간(ms) / Tooltip display delay (ms)\n * @property {boolean} [disabled=false] - Tooltip 비활성화 여부 / Disable tooltip\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface TooltipProps extends React.HTMLAttributes<HTMLDivElement> {\n content: string\n children: React.ReactNode\n position?: \"top\" | \"bottom\" | \"left\" | \"right\"\n variant?: \"default\" | \"light\" | \"dark\"\n delay?: number\n disabled?: boolean\n}\n\n/**\n * Tooltip 컴포넌트 / Tooltip component\n * \n * 호버 시 추가 정보를 표시하는 툴팁 컴포넌트입니다.\n * 마우스 호버 시 지연 시간 후 표시됩니다.\n * \n * Tooltip component that displays additional information on hover.\n * Appears after a delay when the mouse hovers over the element.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Tooltip content=\"이것은 도움말입니다\">\n * <Button>호버하세요</Button>\n * </Tooltip>\n * \n * @example\n * // 다양한 위치 / Different positions\n * <Tooltip content=\"위치 변경\" position=\"bottom\">\n * <Icon name=\"info\" />\n * </Tooltip>\n * \n * @example\n * // 커스텀 스타일 / Custom styles\n * <Tooltip content=\"라이트 스타일\" variant=\"light\" delay={500}>\n * <span>호버</span>\n * </Tooltip>\n * \n * @param {TooltipProps} props - Tooltip 컴포넌트의 props / Tooltip component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} Tooltip 컴포넌트 / Tooltip component\n * \n * @todo 접근성 개선: role=\"tooltip\" 추가 필요 / Accessibility: Add role=\"tooltip\"\n * @todo 접근성 개선: aria-describedby 연결 필요 / Accessibility: Connect aria-describedby\n * @todo 접근성 개선: 키보드 포커스 시 Tooltip 표시 필요 / Accessibility: Show tooltip on keyboard focus\n */\nconst Tooltip = React.forwardRef<HTMLDivElement, TooltipProps>(\n ({ \n className, \n content,\n children,\n position = \"top\",\n variant = \"default\",\n delay = 300,\n disabled = false,\n ...props \n }, ref) => {\n const [isVisible, setIsVisible] = React.useState(false)\n const [coords, setCoords] = React.useState({ x: 0, y: 0 })\n const timeoutRef = React.useRef<number | undefined>(undefined)\n const tooltipRef = React.useRef<HTMLDivElement>(null)\n\n const showTooltip = (e: React.MouseEvent) => {\n if (disabled) return\n \n const rect = e.currentTarget.getBoundingClientRect()\n const tooltipRect = tooltipRef.current?.getBoundingClientRect()\n \n let x = 0\n let y = 0\n \n switch (position) {\n case \"top\":\n x = rect.left + rect.width / 2\n y = rect.top - 8 // 8px 간격\n break\n case \"bottom\":\n x = rect.left + rect.width / 2\n y = rect.bottom + 8 // 8px 간격\n break\n case \"left\":\n x = rect.left - 8 // 8px 간격\n y = rect.top + rect.height / 2\n break\n case \"right\":\n x = rect.right + 8 // 8px 간격\n y = rect.top + rect.height / 2\n break\n }\n \n setCoords({ x, y })\n \n timeoutRef.current = window.setTimeout(() => {\n setIsVisible(true)\n }, delay)\n }\n\n const hideTooltip = () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current)\n }\n setIsVisible(false)\n }\n\n React.useEffect(() => {\n return () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current)\n }\n }\n }, [])\n\n const getVariantClasses = () => {\n switch (variant) {\n case \"light\":\n return \"bg-white text-gray-900 border border-gray-200 shadow-lg\"\n case \"dark\":\n return \"bg-gray-900 text-white shadow-lg\"\n default:\n return \"bg-gray-800 text-white shadow-lg\"\n }\n }\n\n const getPositionClasses = () => {\n switch (position) {\n case \"top\":\n return \"bottom-full left-1/2 -translate-x-1/2 mb-2\" // 8px 간격\n case \"bottom\":\n return \"top-full left-1/2 -translate-x-1/2 mt-2\" // 8px 간격\n case \"left\":\n return \"right-full top-1/2 -translate-y-1/2 mr-2\" // 8px 간격\n case \"right\":\n return \"left-full top-1/2 -translate-y-1/2 ml-2\" // 8px 간격\n default:\n return \"bottom-full left-1/2 -translate-x-1/2 mb-2\"\n }\n }\n\n const getArrowClasses = () => {\n switch (position) {\n case \"top\":\n return \"top-full left-1/2 -translate-x-1/2 border-t-gray-800 dark:border-t-gray-800\"\n case \"bottom\":\n return \"bottom-full left-1/2 -translate-x-1/2 border-b-gray-800 dark:border-b-gray-800\"\n case \"left\":\n return \"left-full top-1/2 -translate-y-1/2 border-l-gray-800 dark:border-l-gray-800\"\n case \"right\":\n return \"right-full top-1/2 -translate-y-1/2 border-r-gray-800 dark:border-r-gray-800\"\n default:\n return \"top-full left-1/2 -translate-x-1/2 border-t-gray-800 dark:border-t-gray-800\"\n }\n }\n\n return (\n <div\n ref={ref}\n className={merge(\"relative inline-block\", className)}\n onMouseEnter={showTooltip}\n onMouseLeave={hideTooltip}\n {...props}\n >\n {children}\n \n {isVisible && (\n <div\n ref={tooltipRef}\n className={merge(\n \"fixed z-50 px-3 py-2 text-sm rounded-lg whitespace-nowrap pointer-events-none\", // 12px, 8px 패딩\n getVariantClasses()\n )}\n style={{\n left: `${coords.x}px`,\n top: `${coords.y}px`,\n transform: 'translate(-50%, -50%)'\n }}\n >\n {content}\n {/* 화살표 */}\n <div\n className={merge(\n \"absolute w-0 h-0 border-4 border-transparent\",\n getArrowClasses()\n )}\n />\n </div>\n )}\n </div>\n )\n }\n)\nTooltip.displayName = \"Tooltip\"\n\n// 편의 컴포넌트들\nexport const TooltipLight = React.forwardRef<HTMLDivElement, Omit<TooltipProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Tooltip ref={ref} variant=\"light\" className={className} {...props} />\n )\n)\nTooltipLight.displayName = \"TooltipLight\"\n\nexport const TooltipDark = React.forwardRef<HTMLDivElement, Omit<TooltipProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Tooltip ref={ref} variant=\"dark\" className={className} {...props} />\n )\n)\nTooltipDark.displayName = \"TooltipDark\"\n\nexport { Tooltip } ","\"use client\";\n\nimport React from \"react\";\nimport { merge } from \"../../lib/utils\";\nimport { Icon } from \"../Icon\";\nimport type { IconName } from \"../../lib/icons\";\nimport { Tooltip } from \"../Tooltip\";\n\n/**\n * 사이드바 네비게이션 아이템 인터페이스 / SidebarNavItem interface\n * @typedef {Object} SidebarNavItem\n * @property {string} id - 아이템 고유 ID / Item unique ID\n * @property {string} label - 아이템 라벨 / Item label\n * @property {string} [href] - 링크 URL / Link URL\n * @property {IconName | React.ReactNode} [icon] - 아이콘 / Icon\n * @property {React.ReactNode} [badge] - 배지 / Badge\n * @property {boolean} [active] - 활성 상태 / Active state\n * @property {() => void} [onClick] - 클릭 핸들러 / Click handler\n */\nexport interface SidebarNavItem {\n id: string;\n label: string;\n href?: string;\n icon?: IconName | React.ReactNode;\n badge?: React.ReactNode;\n active?: boolean;\n onClick?: () => void;\n}\n\n/**\n * 사이드바 섹션 인터페이스 / SidebarSection interface\n * @typedef {Object} SidebarSection\n * @property {string} id - 섹션 고유 ID / Section unique ID\n * @property {string} [label] - 섹션 라벨 / Section label\n * @property {SidebarNavItem[]} items - 섹션 내 아이템 배열 / Items array in section\n */\nexport interface SidebarSection {\n id: string;\n label?: string;\n items: SidebarNavItem[];\n}\n\n/**\n * DashboardSidebar 컴포넌트의 props / DashboardSidebar component props\n * @typedef {Object} DashboardSidebarProps\n * @property {React.ReactNode} [logo] - 로고 컴포넌트 / Logo component\n * @property {React.ReactNode} [productSwitcher] - 제품 전환 컴포넌트 / Product switcher component\n * @property {SidebarSection[]} sections - 사이드바 섹션 배열 / Sidebar sections array\n * @property {React.ReactNode} [footerActions] - 푸터 액션 컴포넌트 / Footer actions component\n * @property {boolean} [isCollapsed] - 접힘 상태 (제어) / Collapsed state (controlled)\n * @property {boolean} [defaultCollapsed=false] - 기본 접힘 상태 / Default collapsed state\n * @property {(collapsed: boolean) => void} [onToggleCollapsed] - 접힘 상태 변경 핸들러 / Collapsed state change handler\n * @property {number} [collapsedWidth=72] - 접힘 상태 너비 (px) / Collapsed width (px)\n * @property {number} [expandedWidth=264] - 펼침 상태 너비 (px) / Expanded width (px)\n * @property {number} [mobileBreakpoint=1024] - 모바일 브레이크포인트 (px) / Mobile breakpoint (px)\n * @property {string} [overlayBackground] - 모바일 오버레이 배경색 / Mobile overlay background color\n * @extends {React.HTMLAttributes<HTMLElement>}\n */\nexport interface DashboardSidebarProps extends React.HTMLAttributes<HTMLElement> {\n logo?: React.ReactNode;\n productSwitcher?: React.ReactNode;\n sections: SidebarSection[];\n footerActions?: React.ReactNode;\n isCollapsed?: boolean;\n defaultCollapsed?: boolean;\n onToggleCollapsed?: (collapsed: boolean) => void;\n collapsedWidth?: number;\n expandedWidth?: number;\n mobileBreakpoint?: number;\n overlayBackground?: string;\n}\n\nconst DEFAULT_COLLAPSED = 72;\nconst DEFAULT_EXPANDED = 264;\n\n/**\n * DashboardSidebar 컴포넌트\n * \n * 대시보드용 사이드바 네비게이션 컴포넌트입니다.\n * 접기/펼치기 기능과 모바일 반응형을 지원하며, 섹션별로 네비게이션 아이템을 구성할 수 있습니다.\n * \n * Sidebar navigation component for dashboards.\n * Supports collapse/expand functionality and mobile responsiveness, with section-based navigation items.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <DashboardSidebar\n * logo={<Logo />}\n * sections={[\n * {\n * id: \"main\",\n * label: \"메인\",\n * items: [\n * { id: \"dashboard\", label: \"대시보드\", href: \"/dashboard\", icon: \"layout\" },\n * { id: \"transactions\", label: \"거래\", href: \"/transactions\", icon: \"creditCard\" }\n * ]\n * }\n * ]}\n * />\n * \n * @example\n * // 접힘 상태 제어 / Collapse state control\n * <DashboardSidebar\n * sections={sections}\n * isCollapsed={collapsed}\n * onToggleCollapsed={setCollapsed}\n * collapsedWidth={80}\n * expandedWidth={280}\n * />\n * \n * @param {DashboardSidebarProps} props - DashboardSidebar 컴포넌트의 props / DashboardSidebar component props\n * @param {React.Ref<HTMLElement>} ref - aside 요소 ref / aside element ref\n * @returns {JSX.Element} DashboardSidebar 컴포넌트 / DashboardSidebar component\n */\nexport const DashboardSidebar = React.forwardRef<HTMLElement, DashboardSidebarProps>(\n (\n {\n logo,\n productSwitcher,\n sections,\n footerActions,\n isCollapsed,\n defaultCollapsed = false,\n onToggleCollapsed,\n collapsedWidth = DEFAULT_COLLAPSED,\n expandedWidth = DEFAULT_EXPANDED,\n mobileBreakpoint = 1024,\n overlayBackground = \"rgba(15, 23, 42, 0.45)\",\n className,\n ...props\n },\n ref\n ) => {\n const [internalCollapsed, setInternalCollapsed] = React.useState(defaultCollapsed);\n const [isMobileOpen, setIsMobileOpen] = React.useState(false);\n const [isMobile, setIsMobile] = React.useState(false);\n const collapsed = typeof isCollapsed === \"boolean\" ? isCollapsed : internalCollapsed;\n\n React.useEffect(() => {\n const checkMobile = () => setIsMobile(window.innerWidth <= mobileBreakpoint);\n checkMobile();\n window.addEventListener(\"resize\", checkMobile);\n return () => window.removeEventListener(\"resize\", checkMobile);\n }, [mobileBreakpoint]);\n\n const toggleCollapsed = () => {\n const next = !collapsed;\n setInternalCollapsed(next);\n onToggleCollapsed?.(next);\n };\n\n const widthStyle = collapsed ? collapsedWidth : expandedWidth;\n\n const sidebarContent = (\n <aside\n ref={ref}\n role=\"navigation\"\n aria-label=\"대시보드 네비게이션\"\n className={merge(\n \"flex h-full flex-col border-r border-slate-200/60 bg-white/95 px-3 py-4 shadow-sm dark:border-slate-800 dark:bg-slate-950/80 backdrop-blur transition-[width] duration-200\",\n className\n )}\n style={{ width: widthStyle, minWidth: widthStyle }}\n {...props}\n >\n <div className=\"mb-6 flex items-center justify-between gap-2 px-1\">\n <div className=\"flex items-center gap-2\">\n {logo}\n {!collapsed && productSwitcher}\n </div>\n <button\n type=\"button\"\n onClick={toggleCollapsed}\n aria-label={collapsed ? \"사이드바 펼치기\" : \"사이드바 접기\"}\n aria-expanded={!collapsed}\n className=\"inline-flex h-8 w-8 items-center justify-center rounded-full border border-slate-200 text-slate-500 transition-colors hover:bg-slate-100 dark:border-slate-700 dark:text-slate-300 dark:hover:bg-slate-800\"\n >\n <Icon name={collapsed ? \"chevronRight\" : \"chevronLeft\"} className=\"h-4 w-4\" />\n <span className=\"sr-only\">사이드바 토글</span>\n </button>\n </div>\n\n <div className=\"flex-1 space-y-6 overflow-y-auto\">\n {sections.map((section) => (\n <div key={section.id} className=\"space-y-2\">\n {!collapsed && section.label && (\n <div className=\"px-3 text-xs font-medium uppercase tracking-wide text-slate-400 dark:text-slate-500\" role=\"heading\" aria-level={2}>\n {section.label}\n </div>\n )}\n <nav className=\"space-y-1\" aria-label={section.label || \"네비게이션\"}>\n {section.items.map((item) => {\n const baseClasses = merge(\n \"group flex w-full items-center rounded-xl px-3 py-2 text-sm font-medium transition focus:outline-none focus-visible:ring-2 focus-visible:ring-blue-500/70\",\n item.active\n ? \"bg-blue-50 text-blue-600 dark:bg-blue-500/15 dark:text-blue-200\"\n : \"text-slate-600 hover:bg-slate-100 dark:text-slate-300 dark:hover:bg-slate-800\"\n );\n\n const content = (\n <>\n {item.icon && (\n <span className=\"mr-3\">\n {typeof item.icon === \"string\" ? (\n <Icon name={item.icon as IconName} className=\"h-5 w-5\" />\n ) : (\n item.icon\n )}\n </span>\n )}\n {!collapsed && (\n <>\n <span className=\"flex-1 text-left\">{item.label}</span>\n {item.badge && <span className=\"text-xs text-slate-400\">{item.badge}</span>}\n </>\n )}\n </>\n );\n\n const itemNode = item.href ? (\n <a\n key={item.id}\n href={item.href}\n className={baseClasses}\n aria-current={item.active ? \"page\" : undefined}\n >\n {content}\n </a>\n ) : (\n <button\n key={item.id}\n type=\"button\"\n onClick={item.onClick}\n className={baseClasses}\n aria-pressed={item.active}\n >\n {content}\n </button>\n );\n\n if (collapsed) {\n return (\n <Tooltip key={item.id} content={item.label}>\n {itemNode}\n </Tooltip>\n );\n }\n\n return itemNode;\n })}\n </nav>\n </div>\n ))}\n </div>\n\n <div className=\"mt-4 border-t border-slate-100 pt-4 dark:border-slate-800\">\n {footerActions}\n <div className=\"mt-2 hidden text-xs text-slate-400 lg:block\">\n <span>ⓒ HUA Labs</span>\n </div>\n </div>\n\n </aside>\n );\n\n return (\n <>\n {isMobile ? (\n <>\n <button\n className=\"inline-flex items-center gap-2 rounded-full border border-slate-200 px-3 py-2 text-sm text-slate-600 shadow-sm dark:border-slate-700 dark:text-slate-200\"\n onClick={() => setIsMobileOpen(true)}\n >\n <Icon name=\"menu\" className=\"h-4 w-4\" />\n 메뉴\n </button>\n {isMobileOpen && (\n <div className=\"fixed inset-0 z-40 flex\">\n <div\n className=\"absolute inset-0\"\n style={{ backgroundColor: overlayBackground }}\n onClick={() => setIsMobileOpen(false)}\n />\n <div className=\"relative z-50 h-full\">\n {sidebarContent}\n <button\n className=\"absolute top-4 right-4 rounded-full border border-slate-200 bg-white p-2 shadow-sm dark:border-slate-700 dark:bg-slate-900\"\n onClick={() => setIsMobileOpen(false)}\n >\n <Icon name=\"close\" className=\"h-4 w-4\" />\n </button>\n </div>\n </div>\n )}\n </>\n ) : (\n sidebarContent\n )}\n </>\n );\n }\n);\n\nDashboardSidebar.displayName = \"DashboardSidebar\";\n","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * Table 컴포넌트의 props / Table component props\n * @typedef {Object} TableProps\n * @property {React.ReactNode} children - TableHeader, TableBody, TableFooter 등 / TableHeader, TableBody, TableFooter, etc.\n * @property {\"default\" | \"bordered\" | \"striped\"} [variant=\"default\"] - Table 스타일 변형 / Table style variant\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - Table 크기 / Table size\n * @extends {React.HTMLAttributes<HTMLTableElement>}\n */\nexport interface TableProps extends React.HTMLAttributes<HTMLTableElement> {\n children: React.ReactNode\n variant?: \"default\" | \"bordered\" | \"striped\"\n size?: \"sm\" | \"md\" | \"lg\"\n}\n\n/**\n * TableHeader 컴포넌트의 props / TableHeader component props\n * @typedef {Object} TableHeaderProps\n * @property {React.ReactNode} children - TableHead 컴포넌트들 / TableHead components\n * @extends {React.HTMLAttributes<HTMLTableSectionElement>}\n */\nexport interface TableHeaderProps extends React.HTMLAttributes<HTMLTableSectionElement> {\n children: React.ReactNode\n}\n\n/**\n * TableBody 컴포넌트의 props / TableBody component props\n * @typedef {Object} TableBodyProps\n * @property {React.ReactNode} children - TableRow 컴포넌트들 / TableRow components\n * @extends {React.HTMLAttributes<HTMLTableSectionElement>}\n */\nexport interface TableBodyProps extends React.HTMLAttributes<HTMLTableSectionElement> {\n children: React.ReactNode\n}\n\n/**\n * TableFooter 컴포넌트의 props / TableFooter component props\n * @typedef {Object} TableFooterProps\n * @property {React.ReactNode} children - TableRow 컴포넌트들 / TableRow components\n * @extends {React.HTMLAttributes<HTMLTableSectionElement>}\n */\nexport interface TableFooterProps extends React.HTMLAttributes<HTMLTableSectionElement> {\n children: React.ReactNode\n}\n\n/**\n * TableRow 컴포넌트의 props / TableRow component props\n * @typedef {Object} TableRowProps\n * @property {React.ReactNode} children - TableHead 또는 TableCell 컴포넌트들 / TableHead or TableCell components\n * @property {\"default\" | \"hover\"} [variant=\"default\"] - Row 스타일 변형 / Row style variant\n * @extends {React.HTMLAttributes<HTMLTableRowElement>}\n */\nexport interface TableRowProps extends React.HTMLAttributes<HTMLTableRowElement> {\n children: React.ReactNode\n variant?: \"default\" | \"hover\"\n}\n\n/**\n * TableHead 컴포넌트의 props / TableHead component props\n * @typedef {Object} TableHeadProps\n * @property {React.ReactNode} children - 헤더 셀 내용 / Header cell content\n * @extends {React.ThHTMLAttributes<HTMLTableCellElement>}\n */\nexport interface TableHeadProps extends React.ThHTMLAttributes<HTMLTableCellElement> {\n children: React.ReactNode\n}\n\n/**\n * TableCell 컴포넌트의 props / TableCell component props\n * @typedef {Object} TableCellProps\n * @property {React.ReactNode} children - 셀 내용 / Cell content\n * @extends {React.TdHTMLAttributes<HTMLTableCellElement>}\n */\nexport interface TableCellProps extends React.TdHTMLAttributes<HTMLTableCellElement> {\n children: React.ReactNode\n}\n\n/**\n * Table 컴포넌트 / Table component\n * \n * 데이터를 표 형태로 표시하는 테이블 컴포넌트입니다.\n * TableHeader, TableBody, TableFooter, TableRow, TableHead, TableCell과 함께 사용합니다.\n * \n * Table component that displays data in tabular format.\n * Used with TableHeader, TableBody, TableFooter, TableRow, TableHead, and TableCell.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Table>\n * <TableHeader>\n * <TableRow>\n * <TableHead>이름</TableHead>\n * <TableHead>나이</TableHead>\n * </TableRow>\n * </TableHeader>\n * <TableBody>\n * <TableRow>\n * <TableCell>홍길동</TableCell>\n * <TableCell>30</TableCell>\n * </TableRow>\n * </TableBody>\n * </Table>\n * \n * @example\n * // Bordered 스타일 / Bordered style\n * <Table variant=\"bordered\">\n * <TableHeader>\n * <TableRow>\n * <TableHead>항목</TableHead>\n * </TableRow>\n * </TableHeader>\n * <TableBody>\n * <TableRow>\n * <TableCell>값</TableCell>\n * </TableRow>\n * </TableBody>\n * </Table>\n * \n * @example\n * // Striped 스타일, 호버 효과 / Striped style with hover effect\n * <Table variant=\"striped\">\n * <TableBody>\n * <TableRow variant=\"hover\">\n * <TableCell>데이터</TableCell>\n * </TableRow>\n * </TableBody>\n * </Table>\n * \n * @param {TableProps} props - Table 컴포넌트의 props / Table component props\n * @param {React.Ref<HTMLTableElement>} ref - table 요소 ref / table element ref\n * @returns {JSX.Element} Table 컴포넌트 / Table component\n */\nconst Table = React.forwardRef<HTMLTableElement, TableProps>(\n ({ className, variant = \"default\", size = \"md\", ...props }, ref) => {\n const getVariantClasses = () => {\n switch (variant) {\n case \"bordered\":\n return \"border border-slate-200 dark:border-slate-700 divide-x divide-slate-200 dark:divide-slate-700\"\n case \"striped\":\n return \"divide-y divide-slate-200 dark:divide-slate-700\"\n default:\n return \"\"\n }\n }\n\n const getSizeClasses = () => {\n switch (size) {\n case \"sm\":\n return \"text-sm\"\n case \"lg\":\n return \"text-base\"\n default:\n return \"text-sm\"\n }\n }\n\n return (\n <div className=\"w-full overflow-auto\">\n <table\n ref={ref}\n className={merge(\n \"w-full caption-bottom\",\n getVariantClasses(),\n getSizeClasses(),\n className\n )}\n {...props}\n />\n </div>\n )\n }\n)\nTable.displayName = \"Table\"\n\n/**\n * TableHeader 컴포넌트 / TableHeader component\n * 테이블의 헤더 영역을 표시합니다.\n * Displays the header area of a table.\n * \n * @component\n * @param {TableHeaderProps} props - TableHeader 컴포넌트의 props / TableHeader component props\n * @param {React.Ref<HTMLTableSectionElement>} ref - thead 요소 ref / thead element ref\n * @returns {JSX.Element} TableHeader 컴포넌트 / TableHeader component\n */\nconst TableHeader = React.forwardRef<HTMLTableSectionElement, TableHeaderProps>(\n ({ className, ...props }, ref) => (\n <thead ref={ref} className={merge(\"[&_tr]:border-b\", className)} {...props} />\n )\n)\nTableHeader.displayName = \"TableHeader\"\n\n/**\n * TableBody 컴포넌트 / TableBody component\n * 테이블의 본문 영역을 표시합니다.\n * Displays the body area of a table.\n * \n * @component\n * @param {TableBodyProps} props - TableBody 컴포넌트의 props / TableBody component props\n * @param {React.Ref<HTMLTableSectionElement>} ref - tbody 요소 ref / tbody element ref\n * @returns {JSX.Element} TableBody 컴포넌트 / TableBody component\n */\nconst TableBody = React.forwardRef<HTMLTableSectionElement, TableBodyProps>(\n ({ className, ...props }, ref) => (\n <tbody\n ref={ref}\n className={merge(\"[&_tr:last-child]:border-0\", className)}\n {...props}\n />\n )\n)\nTableBody.displayName = \"TableBody\"\n\n/**\n * TableFooter 컴포넌트 / TableFooter component\n * 테이블의 푸터 영역을 표시합니다.\n * Displays the footer area of a table.\n * \n * @component\n * @param {TableFooterProps} props - TableFooter 컴포넌트의 props / TableFooter component props\n * @param {React.Ref<HTMLTableSectionElement>} ref - tfoot 요소 ref / tfoot element ref\n * @returns {JSX.Element} TableFooter 컴포넌트 / TableFooter component\n */\nconst TableFooter = React.forwardRef<HTMLTableSectionElement, TableFooterProps>(\n ({ className, ...props }, ref) => (\n <tfoot\n ref={ref}\n className={merge(\n \"border-t bg-slate-50 dark:bg-slate-800/50 font-medium [&>tr]:last:border-b-0\",\n className\n )}\n {...props}\n />\n )\n)\nTableFooter.displayName = \"TableFooter\"\n\n/**\n * TableRow 컴포넌트 / TableRow component\n * 테이블의 행을 표시합니다.\n * Displays a table row.\n * \n * @component\n * @param {TableRowProps} props - TableRow 컴포넌트의 props / TableRow component props\n * @param {React.Ref<HTMLTableRowElement>} ref - tr 요소 ref / tr element ref\n * @returns {JSX.Element} TableRow 컴포넌트 / TableRow component\n */\nconst TableRow = React.forwardRef<HTMLTableRowElement, TableRowProps>(\n ({ className, variant = \"default\", ...props }, ref) => {\n const getVariantClasses = () => {\n switch (variant) {\n case \"hover\":\n return \"hover:bg-slate-50 dark:hover:bg-slate-800/50\"\n default:\n return \"\"\n }\n }\n\n return (\n <tr\n ref={ref}\n className={merge(\n \"border-b transition-colors data-[state=selected]:bg-slate-50 dark:data-[state=selected]:bg-slate-800/50\",\n getVariantClasses(),\n className\n )}\n {...props}\n />\n )\n }\n)\nTableRow.displayName = \"TableRow\"\n\n/**\n * TableHead 컴포넌트 / TableHead component\n * 테이블의 헤더 셀을 표시합니다.\n * Displays a table header cell.\n * \n * @component\n * @param {TableHeadProps} props - TableHead 컴포넌트의 props / TableHead component props\n * @param {React.Ref<HTMLTableCellElement>} ref - th 요소 ref / th element ref\n * @returns {JSX.Element} TableHead 컴포넌트 / TableHead component\n */\nconst TableHead = React.forwardRef<HTMLTableCellElement, TableHeadProps>(\n ({ className, ...props }, ref) => (\n <th\n ref={ref}\n className={merge(\n \"h-12 px-4 text-left align-middle font-medium text-slate-500 dark:text-slate-400 [&:has([role=checkbox])]:pr-0\",\n className\n )}\n {...props}\n />\n )\n)\nTableHead.displayName = \"TableHead\"\n\n/**\n * TableCell 컴포넌트 / TableCell component\n * 테이블의 데이터 셀을 표시합니다.\n * Displays a table data cell.\n * \n * @component\n * @param {TableCellProps} props - TableCell 컴포넌트의 props / TableCell component props\n * @param {React.Ref<HTMLTableCellElement>} ref - td 요소 ref / td element ref\n * @returns {JSX.Element} TableCell 컴포넌트 / TableCell component\n */\nconst TableCell = React.forwardRef<HTMLTableCellElement, TableCellProps>(\n ({ className, ...props }, ref) => (\n <td\n ref={ref}\n className={merge(\"p-4 align-middle [&:has([role=checkbox])]:pr-0\", className)}\n {...props}\n />\n )\n)\nTableCell.displayName = \"TableCell\"\n\n/**\n * TableCaption 컴포넌트 / TableCaption component\n * 테이블의 캡션을 표시합니다.\n * Displays a table caption.\n * \n * @component\n * @param {React.HTMLAttributes<HTMLTableCaptionElement>} props - TableCaption 컴포넌트의 props / TableCaption component props\n * @param {React.Ref<HTMLTableCaptionElement>} ref - caption 요소 ref / caption element ref\n * @returns {JSX.Element} TableCaption 컴포넌트 / TableCaption component\n */\nconst TableCaption = React.forwardRef<HTMLTableCaptionElement, React.HTMLAttributes<HTMLTableCaptionElement>>(\n ({ className, ...props }, ref) => (\n <caption\n ref={ref}\n className={merge(\"mt-4 text-sm text-slate-500 dark:text-slate-400\", className)}\n {...props}\n />\n )\n)\nTableCaption.displayName = \"TableCaption\"\n\nexport {\n Table,\n TableHeader,\n TableBody,\n TableFooter,\n TableHead,\n TableRow,\n TableCell,\n TableCaption,\n} ","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * Badge 컴포넌트의 props / Badge component props\n * @typedef {Object} BadgeProps\n * @property {\"default\" | \"secondary\" | \"destructive\" | \"error\" | \"outline\" | \"glass\"} [variant=\"default\"] - Badge 스타일 변형 / Badge style variant\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface BadgeProps extends React.HTMLAttributes<HTMLDivElement> {\n variant?: \"default\" | \"secondary\" | \"destructive\" | \"error\" | \"outline\" | \"glass\"\n}\n\n/**\n * Badge 컴포넌트 / Badge component\n * \n * 상태나 카테고리를 표시하는 작은 배지 컴포넌트입니다.\n * React.memo로 최적화되어 있어 불필요한 리렌더링을 방지합니다.\n * \n * Small badge component for displaying status or category.\n * Optimized with React.memo to prevent unnecessary re-renders.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Badge>New</Badge>\n * \n * @example\n * // 다양한 변형 / Various variants\n * <Badge variant=\"destructive\">완료</Badge>\n * <Badge variant=\"error\">오류</Badge>\n * <Badge variant=\"outline\">대기</Badge>\n * \n * @param {BadgeProps} props - Badge 컴포넌트의 props / Badge component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} Badge 컴포넌트 / Badge component\n */\nconst Badge = React.memo(React.forwardRef<HTMLDivElement, BadgeProps>(\n ({ className, variant = \"default\", ...props }, ref) => {\n const variantClasses = React.useMemo(() => ({\n default: \"bg-slate-900 text-slate-50 hover:bg-slate-900/80 dark:bg-slate-50 dark:text-slate-900 dark:hover:bg-slate-50/80\",\n secondary: \"bg-slate-100 text-slate-900 hover:bg-slate-100/80 dark:bg-slate-800 dark:text-slate-50 dark:hover:bg-slate-800/80\",\n destructive: \"bg-red-500 text-slate-50 hover:bg-red-500/80 dark:bg-red-900 dark:text-slate-50 dark:hover:bg-red-900/80\",\n error: \"bg-red-500 text-slate-50 hover:bg-red-500/80 dark:bg-red-900 dark:text-slate-50 dark:hover:bg-red-900/80\", // error는 destructive와 동일\n outline: \"text-slate-950 border border-slate-200 hover:bg-slate-100 hover:text-slate-900 dark:border-slate-800 dark:text-slate-50 dark:hover:bg-slate-800 dark:hover:text-slate-50\",\n glass: \"bg-white/20 backdrop-blur-sm border border-white/30 text-white hover:bg-white/30 dark:bg-slate-800/20 dark:border-slate-700/50 dark:text-slate-200 dark:hover:bg-slate-700/30\"\n }), [])\n\n return (\n <div\n ref={ref}\n className={merge(\n \"inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-gray-400 focus:ring-offset-2\",\n variantClasses[variant],\n className\n )}\n {...props}\n />\n )\n }\n))\nBadge.displayName = \"Badge\"\n\nexport { Badge } ","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * Skeleton 컴포넌트의 props\n * @typedef {Object} SkeletonProps\n * @property {\"text\" | \"circular\" | \"rectangular\" | \"rounded\"} [variant=\"text\"] - Skeleton 모양\n * @property {string | number} [width] - 너비 (기본값: variant에 따라 다름)\n * @property {string | number} [height] - 높이 (기본값: variant에 따라 다름)\n * @property {\"pulse\" | \"wave\" | \"shimmer\"} [animation=\"pulse\"] - 애니메이션 타입\n * @property {string} [className] - 추가 CSS 클래스\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface SkeletonProps extends React.HTMLAttributes<HTMLDivElement> {\n variant?: \"text\" | \"circular\" | \"rectangular\" | \"rounded\"\n width?: string | number\n height?: string | number\n animation?: \"pulse\" | \"wave\" | \"shimmer\"\n className?: string\n}\n\n/**\n * Skeleton 컴포넌트 / Skeleton component\n * \n * 로딩 중 콘텐츠의 플레이스홀더를 표시하는 스켈레톤 컴포넌트입니다.\n * 다양한 모양과 애니메이션을 지원합니다.\n * \n * Skeleton component that displays placeholders for content while loading.\n * Supports various shapes and animations.\n * \n * @component\n * @example\n * // 기본 사용 (텍스트) / Basic usage (text)\n * <Skeleton />\n * \n * @example\n * // 원형 아바타 / Circular avatar\n * <Skeleton variant=\"circular\" width={40} height={40} />\n * \n * @example\n * // Wave 애니메이션 / Wave animation\n * <Skeleton \n * variant=\"rounded\" \n * width=\"100%\" \n * height={200}\n * animation=\"wave\"\n * />\n * \n * @param {SkeletonProps} props - Skeleton 컴포넌트의 props / Skeleton component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} Skeleton 컴포넌트 / Skeleton component\n */\nconst Skeleton = React.forwardRef<HTMLDivElement, SkeletonProps>(\n ({ \n className, \n variant = \"text\",\n width,\n height,\n animation = \"pulse\",\n ...props \n }, ref) => {\n const getVariantClasses = () => {\n switch (variant) {\n case \"circular\":\n return \"rounded-full\"\n case \"rounded\":\n return \"rounded-lg\"\n case \"rectangular\":\n return \"rounded-none\"\n case \"text\":\n default:\n return \"rounded\"\n }\n }\n\n const getAnimationClasses = () => {\n switch (animation) {\n case \"wave\":\n return \"animate-pulse bg-gradient-to-r from-gray-200 via-gray-300 to-gray-200 bg-[length:200%_100%] animate-shimmer\"\n case \"shimmer\":\n return \"bg-gradient-to-r from-gray-200 via-gray-300 to-gray-200 bg-[length:200%_100%] animate-shimmer\"\n case \"pulse\":\n default:\n return \"animate-pulse bg-gray-200 dark:bg-gray-700\"\n }\n }\n\n const getDefaultDimensions = () => {\n switch (variant) {\n case \"circular\":\n return { width: \"40px\", height: \"40px\" }\n case \"text\":\n return { width: \"100%\", height: \"1em\" }\n case \"rounded\":\n return { width: \"100%\", height: \"200px\" }\n case \"rectangular\":\n return { width: \"100%\", height: \"200px\" }\n default:\n return { width: \"100%\", height: \"1em\" }\n }\n }\n\n const defaultDims = getDefaultDimensions()\n const finalWidth = width || defaultDims.width\n const finalHeight = height || defaultDims.height\n\n return (\n <div\n ref={ref}\n className={merge(\n \"block\",\n getVariantClasses(),\n getAnimationClasses(),\n className\n )}\n style={{\n width: typeof finalWidth === \"number\" ? `${finalWidth}px` : finalWidth,\n height: typeof finalHeight === \"number\" ? `${finalHeight}px` : finalHeight,\n }}\n {...props}\n />\n )\n }\n)\nSkeleton.displayName = \"Skeleton\"\n\n// 편의 컴포넌트들\nexport const SkeletonText = React.forwardRef<HTMLDivElement, Omit<SkeletonProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Skeleton ref={ref} variant=\"text\" className={className} {...props} />\n )\n)\nSkeletonText.displayName = \"SkeletonText\"\n\nexport const SkeletonCircle = React.forwardRef<HTMLDivElement, Omit<SkeletonProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Skeleton ref={ref} variant=\"circular\" className={className} {...props} />\n )\n)\nSkeletonCircle.displayName = \"SkeletonCircle\"\n\nexport const SkeletonRectangle = React.forwardRef<HTMLDivElement, Omit<SkeletonProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Skeleton ref={ref} variant=\"rectangular\" className={className} {...props} />\n )\n)\nSkeletonRectangle.displayName = \"SkeletonRectangle\"\n\nexport const SkeletonRounded = React.forwardRef<HTMLDivElement, Omit<SkeletonProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Skeleton ref={ref} variant=\"rounded\" className={className} {...props} />\n )\n)\nSkeletonRounded.displayName = \"SkeletonRounded\"\n\n// 복합 스켈레톤 컴포넌트들\nexport const SkeletonCard = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"space-y-4 p-6\", className)} // 16px 간격, 24px 패딩\n {...props}\n >\n <div className=\"flex items-center space-x-4\"> {/* 16px 간격 */}\n <SkeletonCircle className=\"w-12 h-12\" /> {/* 48px 크기 */}\n <div className=\"space-y-2 flex-1\"> {/* 8px 간격 */}\n <SkeletonText className=\"h-4 w-3/4\" /> {/* 16px 높이, 75% 너비 */}\n <SkeletonText className=\"h-3 w-1/2\" /> {/* 12px 높이, 50% 너비 */}\n </div>\n </div>\n <SkeletonRounded className=\"w-full h-32\" /> {/* 128px 높이 */}\n <div className=\"space-y-2\"> {/* 8px 간격 */}\n <SkeletonText className=\"h-4 w-full\" />\n <SkeletonText className=\"h-4 w-5/6\" />\n <SkeletonText className=\"h-4 w-4/6\" />\n </div>\n </div>\n )\n)\nSkeletonCard.displayName = \"SkeletonCard\"\n\nexport const SkeletonAvatar = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"flex items-center space-x-4\", className)} // 16px 간격\n {...props}\n >\n <SkeletonCircle className=\"w-12 h-12\" /> {/* 48px 크기 */}\n <div className=\"space-y-2 flex-1\"> {/* 8px 간격 */}\n <SkeletonText className=\"h-4 w-3/4\" />\n <SkeletonText className=\"h-3 w-1/2\" />\n </div>\n </div>\n )\n)\nSkeletonAvatar.displayName = \"SkeletonAvatar\"\n\nexport const SkeletonImage = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"space-y-2\", className)} // 8px 간격\n {...props}\n >\n <SkeletonRounded className=\"w-full h-48\" /> {/* 192px 높이 */}\n <SkeletonText className=\"h-4 w-1/2\" />\n </div>\n )\n)\nSkeletonImage.displayName = \"SkeletonImage\"\n\nexport const SkeletonUserProfile = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"space-y-4\", className)} // 16px 간격\n {...props}\n >\n <div className=\"flex items-center space-x-4\"> {/* 16px 간격 */}\n <SkeletonCircle className=\"w-16 h-16\" /> {/* 64px 크기 */}\n <div className=\"space-y-2 flex-1\"> {/* 8px 간격 */}\n <SkeletonText className=\"h-5 w-1/2\" />\n <SkeletonText className=\"h-3 w-1/3\" />\n </div>\n </div>\n <div className=\"space-y-2\"> {/* 8px 간격 */}\n <SkeletonText className=\"h-4 w-full\" />\n <SkeletonText className=\"h-4 w-5/6\" />\n </div>\n </div>\n )\n)\nSkeletonUserProfile.displayName = \"SkeletonUserProfile\"\n\nexport const SkeletonList = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"space-y-4\", className)} // 16px 간격\n {...props}\n >\n {Array.from({ length: 3 }).map((_, index) => (\n <div key={index} className=\"flex items-center space-x-4\"> {/* 16px 간격 */}\n <SkeletonCircle className=\"w-10 h-10\" /> {/* 40px 크기 */}\n <div className=\"space-y-2 flex-1\"> {/* 8px 간격 */}\n <SkeletonText className=\"h-4 w-3/4\" />\n <SkeletonText className=\"h-3 w-1/2\" />\n </div>\n </div>\n ))}\n </div>\n )\n)\nSkeletonList.displayName = \"SkeletonList\"\n\nexport const SkeletonTable = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"space-y-4\", className)} // 16px 간격\n {...props}\n >\n {/* 헤더 */}\n <div className=\"flex space-x-4\"> {/* 16px 간격 */}\n <SkeletonText className=\"h-4 w-1/4\" />\n <SkeletonText className=\"h-4 w-1/4\" />\n <SkeletonText className=\"h-4 w-1/4\" />\n <SkeletonText className=\"h-4 w-1/4\" />\n </div>\n {/* 행들 */}\n {Array.from({ length: 5 }).map((_, index) => (\n <div key={index} className=\"flex space-x-4\"> {/* 16px 간격 */}\n <SkeletonText className=\"h-4 w-1/4\" />\n <SkeletonText className=\"h-4 w-1/4\" />\n <SkeletonText className=\"h-4 w-1/4\" />\n <SkeletonText className=\"h-4 w-1/4\" />\n </div>\n ))}\n </div>\n )\n)\nSkeletonTable.displayName = \"SkeletonTable\"\n\nexport { Skeleton } ","\"use client\";\n\nimport React from \"react\";\nimport { merge } from \"../../lib/utils\";\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n TableCaption,\n} from \"../Table\";\nimport { Badge } from \"../Badge\";\nimport { SkeletonTable } from \"../Skeleton\";\nimport { DashboardEmptyState } from \"./EmptyState\";\n\nexport type TransactionStatus =\n | \"approved\"\n | \"pending\"\n | \"failed\"\n | \"refunded\"\n | \"cancelled\"\n | \"review\";\n\nexport type TransactionColumnKey =\n | \"id\"\n | \"merchant\"\n | \"amount\"\n | \"status\"\n | \"method\"\n | \"date\"\n | \"fee\"\n | \"customer\";\n\n/**\n * 거래 테이블 행 인터페이스\n * @typedef {Object} TransactionRow\n * @property {string} id - 거래 ID\n * @property {string} merchant - 가맹점\n * @property {number} amount - 거래 금액\n * @property {string} [currency] - 통화\n * @property {TransactionStatus} status - 거래 상태\n * @property {string} [method] - 결제수단\n * @property {string | Date} date - 거래 일시\n * @property {string} [customer] - 고객 정보\n * @property {number} [fee] - 수수료\n * @property {string} [reference] - 참조 번호\n */\nexport interface TransactionRow {\n id: string;\n merchant: string;\n amount: number;\n currency?: string;\n status: TransactionStatus;\n method?: string;\n date: string | Date;\n customer?: string;\n fee?: number;\n reference?: string;\n [key: string]: unknown;\n}\n\n/**\n * 거래 테이블 컬럼 설정 인터페이스\n * @typedef {Object} TransactionColumnConfig\n * @property {TransactionColumnKey} key - 컬럼 키\n * @property {string} [label] - 컬럼 라벨\n * @property {\"left\" | \"center\" | \"right\"} [align] - 정렬\n * @property {string} [width] - 컬럼 너비\n * @property {(row: TransactionRow) => React.ReactNode} [render] - 커스텀 렌더러\n */\nexport interface TransactionColumnConfig {\n key: TransactionColumnKey;\n label?: string;\n align?: \"left\" | \"center\" | \"right\";\n width?: string;\n render?: (row: TransactionRow) => React.ReactNode;\n}\n\n/**\n * TransactionsTable 컴포넌트의 props\n * @typedef {Object} TransactionsTableProps\n * @property {TransactionRow[]} rows - 거래 행 배열\n * @property {TransactionColumnConfig[]} [columns] - 컬럼 설정 배열\n * @property {boolean} [isLoading=false] - 로딩 상태\n * @property {number} [loadingRows] - 로딩 행 수\n * @property {React.ReactNode} [caption] - 테이블 캡션\n * @property {React.ReactNode} [filters] - 필터 컴포넌트\n * @property {React.ReactNode} [emptyState] - 빈 상태 컴포넌트\n * @property {(row: TransactionRow) => void} [onRowClick] - 행 클릭 핸들러\n * @property {(row: TransactionRow) => boolean} [highlightRow] - 행 강조 조건\n * @property {Partial<Record<TransactionStatus, string>>} [statusLabels] - 상태 라벨 커스터마이징\n * @property {(status: TransactionStatus, row: TransactionRow) => React.ReactNode} [statusRenderer] - 상태 커스텀 렌더러\n * @property {(row: TransactionRow) => React.ReactNode} [amountFormatter] - 금액 커스텀 포맷터\n * @property {(row: TransactionRow) => React.ReactNode} [methodFormatter] - 결제수단 커스텀 포맷터\n * @property {(row: TransactionRow) => React.ReactNode} [dateFormatter] - 날짜 커스텀 포맷터\n * @property {string} [locale=\"ko-KR\"] - 로케일\n * @property {string} [defaultCurrency=\"KRW\"] - 기본 통화\n * @property {string} [className] - 추가 클래스명\n * @property {React.ReactNode} [footer] - 푸터 컴포넌트\n * @property {(row: TransactionRow) => string} [rowActionLabel] - 행 액션 라벨 생성 함수\n * @property {string} [rowActionHint] - 행 액션 힌트 텍스트\n */\nexport interface TransactionsTableProps {\n rows: TransactionRow[];\n columns?: TransactionColumnConfig[];\n isLoading?: boolean;\n loadingRows?: number;\n caption?: React.ReactNode;\n filters?: React.ReactNode;\n emptyState?: React.ReactNode;\n onRowClick?: (row: TransactionRow) => void;\n highlightRow?: (row: TransactionRow) => boolean;\n statusLabels?: Partial<Record<TransactionStatus, string>>;\n statusRenderer?: (status: TransactionStatus, row: TransactionRow) => React.ReactNode;\n amountFormatter?: (row: TransactionRow) => React.ReactNode;\n methodFormatter?: (row: TransactionRow) => React.ReactNode;\n dateFormatter?: (row: TransactionRow) => React.ReactNode;\n locale?: string;\n defaultCurrency?: string;\n className?: string;\n footer?: React.ReactNode;\n rowActionLabel?: (row: TransactionRow) => string;\n rowActionHint?: string;\n}\n\nconst STATUS_STYLES: Record<TransactionStatus, { label: string; badge: string }> = {\n approved: {\n label: \"승인\",\n badge: \"bg-emerald-100 text-emerald-700 dark:bg-emerald-500/15 dark:text-emerald-200\",\n },\n pending: {\n label: \"대기\",\n badge: \"bg-amber-100 text-amber-700 dark:bg-amber-500/15 dark:text-amber-200\",\n },\n failed: {\n label: \"실패\",\n badge: \"bg-rose-100 text-rose-700 dark:bg-rose-500/15 dark:text-rose-200\",\n },\n refunded: {\n label: \"환불\",\n badge: \"bg-sky-100 text-sky-700 dark:bg-sky-500/15 dark:text-sky-200\",\n },\n cancelled: {\n label: \"취소\",\n badge: \"bg-slate-100 text-slate-700 dark:bg-slate-500/15 dark:text-slate-200\",\n },\n review: {\n label: \"검토중\",\n badge: \"bg-violet-100 text-violet-700 dark:bg-violet-500/15 dark:text-violet-200\",\n },\n};\n\nconst DEFAULT_COLUMNS: TransactionColumnConfig[] = [\n { key: \"id\", label: \"거래 ID\", width: \"160px\" },\n { key: \"merchant\", label: \"가맹점\" },\n { key: \"amount\", label: \"금액\", align: \"right\", width: \"140px\" },\n { key: \"status\", label: \"상태\", width: \"120px\" },\n { key: \"method\", label: \"결제수단\", width: \"120px\" },\n { key: \"date\", label: \"거래 일시\", width: \"180px\" },\n];\n\n/**\n * TransactionsTable 컴포넌트\n * \n * 거래 목록을 테이블 형태로 표시하는 컴포넌트입니다.\n * 정렬, 필터링, 커스텀 렌더링 등을 지원합니다.\n * \n * Table component that displays transaction list.\n * Supports sorting, filtering, and custom rendering.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <TransactionsTable\n * rows={[\n * {\n * id: \"tx_123\",\n * merchant: \"가맹점 A\",\n * amount: 100000,\n * status: \"approved\",\n * method: \"카드\",\n * date: new Date()\n * }\n * ]}\n * onRowClick={(row) => console.log(row)}\n * />\n * \n * @example\n * // 커스텀 컬럼과 포맷터 / Custom columns and formatters\n * <TransactionsTable\n * rows={transactions}\n * columns={[\n * { key: \"id\", label: \"ID\" },\n * { key: \"amount\", label: \"금액\", align: \"right\" },\n * { key: \"status\", label: \"상태\" }\n * ]}\n * amountFormatter={(row) => `₩${row.amount.toLocaleString()}`}\n * statusRenderer={(status) => <CustomBadge status={status} />}\n * isLoading={loading}\n * />\n * \n * @param {TransactionsTableProps} props - TransactionsTable 컴포넌트의 props / TransactionsTable component props\n * @returns {JSX.Element} TransactionsTable 컴포넌트 / TransactionsTable component\n */\nexport const TransactionsTable: React.FC<TransactionsTableProps> = ({\n rows,\n columns = DEFAULT_COLUMNS,\n isLoading = false,\n caption,\n filters,\n emptyState,\n onRowClick,\n highlightRow,\n statusLabels,\n statusRenderer,\n amountFormatter,\n methodFormatter,\n dateFormatter,\n locale = \"ko-KR\",\n defaultCurrency = \"KRW\",\n className,\n footer,\n rowActionLabel,\n rowActionHint,\n}) => {\n const columnList = columns.length > 0 ? columns : DEFAULT_COLUMNS;\n const hasRows = rows.length > 0;\n const tableId = React.useId();\n const rowActionHintId = rowActionHint ? `${tableId}-row-action-hint` : undefined;\n\n const getRowActionLabel = React.useCallback(\n (row: TransactionRow) => {\n if (rowActionLabel) return rowActionLabel(row);\n const baseLabel = row.id ? `거래 ${row.id}` : \"거래 행\";\n return `${baseLabel} 상세 보기`;\n },\n [rowActionLabel]\n );\n\n const renderStatus = (status: TransactionStatus, row: TransactionRow) => {\n if (statusRenderer) return statusRenderer(status, row);\n const config = STATUS_STYLES[status] || STATUS_STYLES.pending;\n const label = statusLabels?.[status] ?? config.label;\n return (\n <Badge className={merge(\"font-medium px-3 py-1 rounded-full text-xs\", config.badge)}>\n {label}\n </Badge>\n );\n };\n\n const renderAmount = (row: TransactionRow) => {\n if (amountFormatter) return amountFormatter(row);\n const currency = row.currency || defaultCurrency;\n try {\n return (\n <span className=\"font-semibold text-slate-900 dark:text-slate-100\">\n {new Intl.NumberFormat(locale, {\n style: \"currency\",\n currency,\n maximumFractionDigits: 2,\n }).format(row.amount)}\n </span>\n );\n } catch {\n return `${row.amount.toLocaleString(locale)} ${currency}`;\n }\n };\n\n const renderMethod = (row: TransactionRow) => {\n if (methodFormatter) return methodFormatter(row);\n return row.method ?? \"-\";\n };\n\n const renderDate = (row: TransactionRow) => {\n if (dateFormatter) return dateFormatter(row);\n const dateObj = row.date instanceof Date ? row.date : new Date(row.date);\n return dateObj.toLocaleString(locale, { dateStyle: \"medium\", timeStyle: \"short\" });\n };\n\n const renderCell = (column: TransactionColumnConfig, row: TransactionRow) => {\n if (column.render) return column.render(row);\n\n switch (column.key) {\n case \"id\":\n return (\n <div className=\"flex flex-col\">\n <span className=\"font-medium text-slate-900 dark:text-slate-100\">{row.id}</span>\n {row.reference && (\n <span className=\"text-xs text-slate-500 dark:text-slate-400\">{row.reference}</span>\n )}\n </div>\n );\n case \"merchant\":\n return (\n <div className=\"flex flex-col\">\n <span className=\"font-medium text-slate-900 dark:text-slate-100\">{row.merchant}</span>\n {row.customer && (\n <span className=\"text-xs text-slate-500 dark:text-slate-400\">{row.customer}</span>\n )}\n </div>\n );\n case \"amount\":\n return (\n <div className=\"flex flex-col items-end\">\n {renderAmount(row)}\n {typeof row.fee === \"number\" && (\n <span className=\"text-xs text-slate-500 dark:text-slate-400\">\n 수수료 {row.fee.toLocaleString(locale)}\n </span>\n )}\n </div>\n );\n case \"status\":\n return renderStatus(row.status, row);\n case \"method\":\n return <span className=\"text-slate-700 dark:text-slate-300\">{renderMethod(row)}</span>;\n case \"date\":\n return <span className=\"text-slate-700 dark:text-slate-300\">{renderDate(row)}</span>;\n case \"customer\":\n return row.customer ?? \"-\";\n case \"fee\":\n return typeof row.fee === \"number\" ? row.fee.toLocaleString(locale) : \"-\";\n default:\n return \"-\";\n }\n };\n\n return (\n <div className={merge(\"rounded-2xl border border-slate-200/60 dark:border-slate-800 bg-white dark:bg-slate-900\", className)}>\n {filters && (\n <div className=\"border-b border-slate-100 dark:border-slate-800 px-4 sm:px-6 py-4\">{filters}</div>\n )}\n <div className=\"p-4 sm:p-6\">\n <div className=\"rounded-xl border border-slate-100 dark:border-slate-800 overflow-hidden\">\n <Table\n role=\"table\"\n aria-label={caption ? (typeof caption === \"string\" ? caption : \"거래 목록 테이블\") : \"거래 목록 테이블\"}\n >\n {caption && <TableCaption>{caption}</TableCaption>}\n <TableHeader className=\"bg-slate-50/60 dark:bg-slate-900/40\">\n <TableRow className=\"text-xs uppercase tracking-wide text-slate-500 dark:text-slate-400\">\n {columnList.map((column) => (\n <TableHead\n key={column.key}\n style={{ width: column.width }}\n className={merge(\n column.align === \"right\"\n ? \"text-right\"\n : column.align === \"center\"\n ? \"text-center\"\n : \"text-left\",\n \"text-xs font-semibold\"\n )}\n >\n {column.label}\n </TableHead>\n ))}\n </TableRow>\n </TableHeader>\n <TableBody>\n {isLoading && (\n <TableRow>\n <TableCell colSpan={columnList.length}>\n <SkeletonTable className=\"py-4\" />\n </TableCell>\n </TableRow>\n )}\n {!isLoading && !hasRows && (\n <TableRow>\n <TableCell colSpan={columnList.length}>\n {emptyState || (\n <DashboardEmptyState\n title=\"거래 데이터가 없습니다\"\n description=\"필터를 조정하거나 날짜 범위를 변경해보세요.\"\n icon=\"database-backup\"\n size=\"md\"\n />\n )}\n </TableCell>\n </TableRow>\n )}\n {!isLoading &&\n rows.map((row) => {\n const clickable = Boolean(onRowClick);\n const handleRowKeyDown = (event: React.KeyboardEvent<HTMLTableRowElement>) => {\n if (!onRowClick) return;\n if (event.key === \"Enter\" || event.key === \" \" || event.key === \"Spacebar\") {\n event.preventDefault();\n onRowClick(row);\n }\n };\n const rowLabel = clickable ? getRowActionLabel(row) : undefined;\n return (\n <TableRow\n key={row.id}\n tabIndex={clickable ? 0 : undefined}\n role={clickable ? \"button\" : undefined}\n onKeyDown={clickable ? handleRowKeyDown : undefined}\n onClick={onRowClick ? () => onRowClick(row) : undefined}\n aria-label={rowLabel}\n aria-describedby={clickable && rowActionHintId ? rowActionHintId : undefined}\n className={merge(\n \"text-sm focus:outline-none focus-visible:ring-2 focus-visible:ring-blue-500/70\",\n clickable && \"cursor-pointer hover:bg-slate-50 dark:hover:bg-slate-800/60\",\n highlightRow?.(row) && \"bg-blue-50/60 dark:bg-blue-900/20\"\n )}\n >\n {columnList.map((column) => (\n <TableCell\n key={column.key}\n className={merge(\n column.align === \"right\"\n ? \"text-right\"\n : column.align === \"center\"\n ? \"text-center\"\n : \"text-left\",\n \"align-middle\"\n )}\n >\n {renderCell(column, row)}\n </TableCell>\n ))}\n </TableRow>\n );\n })}\n </TableBody>\n </Table>\n {!isLoading && hasRows && footer && (\n <div className=\"border-t border-slate-100 dark:border-slate-800 bg-slate-50/50 dark:bg-slate-900/50 px-4 py-3 text-sm text-slate-600 dark:text-slate-300\">\n {footer}\n </div>\n )}\n </div>\n </div>\n {rowActionHint && (\n <p id={rowActionHintId} className=\"sr-only\">\n {rowActionHint}\n </p>\n )}\n </div>\n );\n};\n\nTransactionsTable.displayName = \"TransactionsTable\";\n\n","\"use client\";\n\nimport React from \"react\";\nimport { merge } from \"../lib/utils\";\n\n/**\n * 버튼 스타일 변형 / Button style variant\n * @typedef {\"default\" | \"destructive\" | \"outline\" | \"secondary\" | \"ghost\" | \"link\" | \"gradient\" | \"neon\" | \"glass\"} Variant\n */\ntype Variant =\n | \"default\" | \"destructive\" | \"outline\" | \"secondary\"\n | \"ghost\" | \"link\" | \"gradient\" | \"neon\" | \"glass\";\n\n/**\n * 버튼 크기 / Button size\n * @typedef {\"sm\" | \"md\" | \"lg\" | \"xl\" | \"icon\"} Size\n */\ntype Size = \"sm\" | \"md\" | \"lg\" | \"xl\" | \"icon\";\n\n/**\n * 버튼 모서리 둥글기 / Button border radius\n * @typedef {\"sm\" | \"md\" | \"lg\" | \"full\"} Rounded\n */\ntype Rounded = \"sm\" | \"md\" | \"lg\" | \"full\";\n\n/**\n * 버튼 그림자 / Button shadow\n * @typedef {\"none\" | \"sm\" | \"md\" | \"lg\" | \"xl\"} Shadow\n */\ntype Shadow = \"none\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n\n/**\n * 버튼 호버 효과 / Button hover effect\n * @typedef {\"scale\" | \"glow\" | \"slide\" | \"none\"} Hover\n */\ntype Hover = \"scale\" | \"glow\" | \"slide\" | \"none\";\n\n/**\n * 그라디언트 색상 이름 / Gradient color name\n * @typedef {\"blue\" | \"purple\" | \"green\" | \"orange\" | \"pink\" | \"custom\"} GradientName\n */\ntype GradientName = \"blue\" | \"purple\" | \"green\" | \"orange\" | \"pink\" | \"custom\";\n\n/**\n * Button 컴포넌트의 공통 props / Common props for Button component\n * @typedef {Object} CommonProps\n * @property {Variant} [variant=\"default\"] - 버튼 스타일 변형 / Button style variant\n * @property {Size} [size=\"md\"] - 버튼 크기 / Button size\n * @property {boolean} [loading=false] - 로딩 상태 (스피너 표시) / Loading state (shows spinner)\n * @property {React.ReactNode} [icon] - 아이콘 요소 / Icon element\n * @property {\"left\" | \"right\"} [iconPosition=\"left\"] - 아이콘 위치 / Icon position\n * @property {GradientName} [gradient=\"blue\"] - 그라디언트 색상 (variant=\"gradient\"일 때) / Gradient color (when variant=\"gradient\")\n * @property {string} [customGradient] - 커스텀 그라디언트 클래스 (variant=\"gradient\"일 때) / Custom gradient class (when variant=\"gradient\")\n * @property {Rounded} [rounded=\"md\"] - 모서리 둥글기 / Border radius\n * @property {Shadow} [shadow=\"md\"] - 그림자 크기 / Shadow size\n * @property {Hover} [hover=\"scale\"] - 호버 효과 / Hover effect\n * @property {boolean} [fullWidth=false] - 전체 너비 사용 / Use full width\n * @property {boolean} [iconOnly=false] - 아이콘만 표시 (aria-label 필수) / Icon only (aria-label required)\n * @property {string} [aria-label] - 접근성을 위한 레이블 (iconOnly일 때 필수) / Accessibility label (required when iconOnly)\n * @property {string} [className] - 추가 CSS 클래스 / Additional CSS class\n * @property {boolean} [disabled=false] - 비활성화 상태 / Disabled state\n */\ntype CommonProps = {\n variant?: Variant;\n size?: Size;\n loading?: boolean;\n icon?: React.ReactNode;\n iconPosition?: \"left\" | \"right\";\n gradient?: GradientName;\n customGradient?: string;\n rounded?: Rounded;\n shadow?: Shadow;\n hover?: Hover;\n fullWidth?: boolean;\n iconOnly?: boolean;\n \"aria-label\"?: string;\n className?: string;\n disabled?: boolean; // <-- 요놈 추가\n};\n\ntype AnchorProps = CommonProps &\n Omit<React.AnchorHTMLAttributes<HTMLAnchorElement>, \"className\"> & {\n href: string;\n };\n\ntype NativeButtonProps = CommonProps &\n Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, \"className\" | \"type\"> & {\n href?: undefined;\n };\n\n/**\n * Button 컴포넌트의 props 타입 / Button component props type\n * href가 제공되면 앵커 태그로, 그렇지 않으면 버튼 태그로 렌더링됩니다.\n * Renders as anchor tag if href is provided, otherwise as button tag.\n * @typedef {AnchorProps | NativeButtonProps} ButtonProps\n */\nexport type ButtonProps = AnchorProps | NativeButtonProps;\n\ntype AnchorOrButton = HTMLAnchorElement | HTMLButtonElement;\n\nconst isBrowser = typeof window !== \"undefined\";\nfunction useReducedMotion() {\n const [reduce, setReduce] = React.useState(false);\n React.useEffect(() => {\n if (!isBrowser || !(\"matchMedia\" in window)) return;\n const mq = window.matchMedia(\"(prefers-reduced-motion: reduce)\");\n const onChange = () => setReduce(!!mq.matches);\n onChange();\n mq.addEventListener?.(\"change\", onChange);\n return () => mq.removeEventListener?.(\"change\", onChange);\n }, []);\n return reduce;\n}\n\n/**\n * Button 컴포넌트 / Button component\n * \n * 다양한 스타일과 크기를 지원하는 범용 버튼 컴포넌트입니다.\n * href prop을 제공하면 앵커 태그로, 그렇지 않으면 버튼 태그로 렌더링됩니다.\n * \n * Universal button component supporting various styles and sizes.\n * Renders as anchor tag if href prop is provided, otherwise as button tag.\n * \n * @component\n * @example\n * // 기본 버튼 / Basic button\n * <Button onClick={() => console.log('클릭')}>클릭하세요</Button>\n * \n * @example\n * // 다양한 변형 / Various variants\n * <Button variant=\"destructive\" size=\"lg\">삭제</Button>\n * <Button variant=\"outline\" size=\"sm\">취소</Button>\n * <Button variant=\"ghost\">보기</Button>\n * \n * @example\n * // 아이콘과 함께 사용 / With icon\n * <Button icon={<Icon name=\"download\" />} iconPosition=\"left\">\n * 다운로드\n * </Button>\n * \n * @example\n * // 로딩 상태 / Loading state\n * <Button loading disabled>저장 중...</Button>\n * \n * @example\n * // 링크 버튼 / Link button\n * <Button href=\"/about\" variant=\"link\">자세히 보기</Button>\n * \n * @example\n * // 아이콘만 표시 (aria-label 필수) / Icon only (aria-label required)\n * <Button iconOnly aria-label=\"닫기\" icon={<Icon name=\"close\" />} />\n * \n * @param {ButtonProps} props - Button 컴포넌트의 props / Button component props\n * @param {React.Ref<HTMLAnchorElement | HTMLButtonElement>} ref - ref 객체 / ref object\n * @returns {JSX.Element} Button 컴포넌트 / Button component\n */\nconst ButtonInner = React.forwardRef<AnchorOrButton, ButtonProps>(function ButtonInner(\n {\n variant = \"default\",\n size = \"md\",\n loading = false,\n icon,\n iconPosition = \"left\",\n gradient = \"blue\",\n customGradient,\n rounded = \"md\",\n shadow = \"md\",\n hover = \"scale\",\n fullWidth,\n iconOnly,\n className,\n children,\n disabled,\n ...rest\n },\n ref\n) {\n const reduced = useReducedMotion();\n\n const variantClasses: Record<Variant, string> = {\n default:\n \"bg-blue-600 text-white hover:bg-blue-700 dark:bg-blue-500 dark:hover:bg-blue-600\",\n destructive:\n \"bg-red-600 text-white hover:bg-red-700 dark:bg-red-500 dark:hover:bg-red-600\",\n outline:\n \"border-2 border-blue-600 bg-transparent text-blue-600 hover:bg-blue-50 dark:border-blue-400 dark:text-blue-400 dark:hover:bg-blue-900/20\",\n secondary:\n \"bg-gray-200 text-gray-900 hover:bg-gray-300 dark:bg-gray-700 dark:text-white dark:hover:bg-gray-600\",\n ghost:\n \"bg-transparent text-gray-700 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-800\",\n link:\n \"bg-transparent text-blue-600 underline hover:text-blue-700 dark:text-blue-400 dark:hover:text-blue-300\",\n gradient: `bg-gradient-to-r ${customGradient || getGradientClass(gradient)} text-white hover:shadow-lg`,\n neon:\n \"bg-gray-900 text-cyan-400 border border-cyan-400/30 shadow-lg shadow-cyan-400/20 hover:shadow-cyan-400/40\",\n glass:\n \"bg-white/10 backdrop-blur-md border border-white/20 text-white hover:bg-white/20\",\n };\n\n const sizeClasses: Record<Size, string> = {\n sm: \"h-8 px-3 py-1 text-sm\",\n md: \"h-10 px-4 py-2 text-base\",\n lg: \"h-12 px-6 py-3 text-lg\",\n xl: \"h-14 px-8 py-4 text-xl\",\n icon: \"h-10 w-10 p-0\",\n };\n\n const roundedClasses: Record<Rounded, string> = {\n sm: \"rounded\",\n md: \"rounded-md\",\n lg: \"rounded-lg\",\n full: \"rounded-full\",\n };\n\n const shadowClasses: Record<Shadow, string> = {\n none: \"\",\n sm: \"shadow-sm\",\n md: \"shadow-md\",\n lg: \"shadow-lg\",\n xl: \"shadow-xl\",\n };\n\n const hoverClasses: Record<Hover, string> = {\n scale: reduced ? \"\" : \"hover:scale-105 transition-transform duration-200\",\n glow: reduced ? \"\" : \"hover:shadow-2xl hover:shadow-blue-500/25 dark:hover:shadow-cyan-400/25 transition-shadow duration-300\",\n slide: reduced ? \"\" : \"hover:-translate-y-1 transition-transform duration-200\",\n none: \"\",\n };\n\n // variant별 포커스 스타일\n const focusClasses: Record<Variant, string> = {\n default: \"focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-blue-500 focus-visible:ring-offset-1\",\n destructive: \"focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-red-500 focus-visible:ring-offset-1\",\n outline: \"focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-blue-300 dark:focus-visible:ring-blue-600 focus-visible:ring-offset-0\",\n secondary: \"focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-gray-400 focus-visible:ring-offset-1\",\n ghost: \"focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-gray-300 dark:focus-visible:ring-gray-600 focus-visible:ring-offset-0\",\n link: \"focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-blue-400 focus-visible:ring-offset-0\",\n gradient: \"focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-blue-500 focus-visible:ring-offset-1\",\n neon: \"focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-cyan-400 focus-visible:ring-offset-1\",\n glass: \"focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-blue-400/50 focus-visible:ring-offset-0\",\n };\n\n const base = merge(\n \"inline-flex items-center justify-center whitespace-nowrap font-medium transition-all duration-200\",\n focusClasses[variant],\n \"disabled:pointer-events-none disabled:opacity-50 min-w-fit\",\n fullWidth && \"w-full\",\n variantClasses[variant],\n sizeClasses[size],\n roundedClasses[rounded],\n shadowClasses[shadow],\n hoverClasses[hover],\n className\n );\n\n const Spinner = (\n <span role=\"status\" aria-live=\"polite\" className=\"-ml-1 mr-2 inline-flex\">\n <svg className=\"animate-spin h-4 w-4\" viewBox=\"0 0 24 24\" fill=\"none\">\n <circle className=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"4\" />\n <path className=\"opacity-75\" fill=\"currentColor\" 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 </svg>\n <span className=\"sr-only\">로딩 중</span>\n </span>\n );\n\n const content = (\n <>\n {loading && Spinner}\n {!loading && icon && iconPosition === \"left\" && <span className=\"mr-2\">{icon}</span>}\n {children}\n {!loading && icon && iconPosition === \"right\" && <span className=\"ml-2\">{icon}</span>}\n </>\n );\n\n if (iconOnly && !(\"aria-label\" in rest) && process.env.NODE_ENV !== \"production\") {\n // eslint-disable-next-line no-console\n console.warn(\"[Button] iconOnly 사용 시 aria-label을 제공하세요.\");\n }\n\n // 앵커 모드\n if (\"href\" in rest && rest.href) {\n const { onClick, target, rel, href, \"aria-label\": ariaLabel, className: anchorClassName, ...anchorProps } = rest as AnchorProps;\n const isDisabled = !!disabled || loading;\n\n const handleAnchorClick: React.MouseEventHandler<HTMLAnchorElement> = (e) => {\n if (isDisabled) { e.preventDefault(); e.stopPropagation(); return; }\n onClick?.(e);\n };\n\n return (\n <a\n ref={ref as React.Ref<HTMLAnchorElement>}\n href={href}\n className={merge(base, anchorClassName)}\n onClick={handleAnchorClick}\n aria-busy={loading || undefined}\n aria-disabled={isDisabled || undefined}\n tabIndex={isDisabled ? -1 : anchorProps.tabIndex}\n target={target}\n rel={target === \"_blank\" ? rel ?? \"noopener noreferrer\" : rel}\n {...anchorProps}\n >\n {content}\n </a>\n );\n }\n\n // 버튼 모드\n const { className: buttonClassName, ...btnProps } = rest as NativeButtonProps;\n const isDisabled = !!disabled || loading;\n return (\n <button\n ref={ref as React.Ref<HTMLButtonElement>}\n className={merge(base, buttonClassName)}\n type=\"button\" // 폼 기본 제출 방지\n disabled={isDisabled}\n aria-busy={loading || undefined}\n aria-disabled={isDisabled || undefined}\n {...btnProps}\n >\n {content}\n </button>\n );\n});\n\nButtonInner.displayName = \"Button\";\n\nexport const Button = ButtonInner;\n\nfunction getGradientClass(gradient: GradientName): string {\n const g: Record<Exclude<GradientName, \"custom\">, string> = {\n blue: \"from-blue-500 to-cyan-500\",\n purple: \"from-purple-500 to-pink-500\",\n green: \"from-green-500 to-emerald-500 dark:from-green-400 dark:to-emerald-400\",\n orange: \"from-orange-500 to-red-500 dark:from-orange-300 dark:to-red-300\",\n pink: \"from-pink-500 to-rose-500\",\n };\n return g[gradient as keyof typeof g] || g.blue;\n}\n","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * Dropdown 컴포넌트의 props / Dropdown component props\n * @typedef {Object} DropdownProps\n * @property {React.ReactNode} trigger - Dropdown을 열기 위한 트리거 요소 / Trigger element to open dropdown\n * @property {React.ReactNode} children - Dropdown 내용 / Dropdown content\n * @property {boolean} [open] - 제어 모드에서 열림/닫힘 상태 / Open/close state in controlled mode\n * @property {(open: boolean) => void} [onOpenChange] - 상태 변경 콜백 / State change callback\n * @property {\"top\" | \"bottom\" | \"left\" | \"right\"} [placement=\"bottom\"] - Dropdown 표시 위치 / Dropdown display position\n * @property {\"start\" | \"center\" | \"end\"} [align=\"start\"] - Dropdown 정렬 / Dropdown alignment\n * @property {number} [offset=8] - 트리거와 Dropdown 사이 간격 (px) / Spacing between trigger and dropdown (px)\n * @property {boolean} [disabled=false] - Dropdown 비활성화 여부 / Disable dropdown\n * @property {boolean} [showArrow=true] - 화살표 표시 여부 / Show arrow\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface DropdownProps extends React.HTMLAttributes<HTMLDivElement> {\n trigger: React.ReactNode\n children: React.ReactNode\n open?: boolean\n onOpenChange?: (open: boolean) => void\n placement?: \"top\" | \"bottom\" | \"left\" | \"right\"\n align?: \"start\" | \"center\" | \"end\"\n offset?: number\n disabled?: boolean\n showArrow?: boolean\n}\n\n/**\n * Dropdown 컴포넌트 / Dropdown component\n * \n * 트리거 요소를 클릭하면 표시되는 드롭다운 메뉴 컴포넌트입니다.\n * 외부 클릭 시 자동으로 닫히며, 뷰포트 경계를 자동으로 감지하여 위치를 조정합니다.\n * \n * Dropdown menu component that appears when the trigger element is clicked.\n * Automatically closes on outside click and adjusts position by detecting viewport boundaries.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Dropdown trigger={<Button>메뉴</Button>}>\n * <Menu>\n * <MenuItem>항목 1</MenuItem>\n * <MenuItem>항목 2</MenuItem>\n * </Menu>\n * </Dropdown>\n * \n * @example\n * // 제어 모드, 화살표 없음 / Controlled mode, no arrow\n * const [open, setOpen] = useState(false)\n * <Dropdown \n * open={open}\n * onOpenChange={setOpen}\n * trigger={<Button>제어 모드</Button>}\n * placement=\"top\"\n * showArrow={false}\n * >\n * <div className=\"p-4\">내용</div>\n * </Dropdown>\n * \n * @param {DropdownProps} props - Dropdown 컴포넌트의 props / Dropdown component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} Dropdown 컴포넌트 / Dropdown component\n */\nconst Dropdown = React.forwardRef<HTMLDivElement, DropdownProps>(\n ({ \n className, \n trigger,\n children,\n open: controlledOpen,\n onOpenChange,\n placement = \"bottom\",\n align = \"start\",\n offset = 8,\n disabled = false,\n showArrow = true,\n ...props \n }, ref) => {\n const [internalOpen, setInternalOpen] = React.useState(false)\n const [coords, setCoords] = React.useState({ x: 0, y: 0 })\n const triggerRef = React.useRef<HTMLDivElement>(null)\n const dropdownRef = React.useRef<HTMLDivElement>(null)\n const isControlled = controlledOpen !== undefined\n const isOpen = isControlled ? controlledOpen : internalOpen\n\n const handleOpenChange = (newOpen: boolean) => {\n if (disabled) return\n \n if (!isControlled) {\n setInternalOpen(newOpen)\n }\n onOpenChange?.(newOpen)\n }\n\n const handleTriggerClick = () => {\n handleOpenChange(!isOpen)\n }\n\n const updatePosition = React.useCallback(() => {\n if (!triggerRef.current || !dropdownRef.current) return\n\n const triggerRect = triggerRef.current.getBoundingClientRect()\n const dropdownRect = dropdownRef.current.getBoundingClientRect()\n const viewportWidth = window.innerWidth\n const viewportHeight = window.innerHeight\n\n let x = 0\n let y = 0\n\n // 기본 위치 계산\n switch (placement) {\n case \"top\":\n x = triggerRect.left\n y = triggerRect.top - offset\n break\n case \"bottom\":\n x = triggerRect.left\n y = triggerRect.bottom + offset\n break\n case \"left\":\n x = triggerRect.left - offset\n y = triggerRect.top\n break\n case \"right\":\n x = triggerRect.right + offset\n y = triggerRect.top\n break\n }\n\n // 정렬 조정\n switch (align) {\n case \"center\":\n if (placement === \"top\" || placement === \"bottom\") {\n x = triggerRect.left + triggerRect.width / 2 - dropdownRect.width / 2\n } else {\n y = triggerRect.top + triggerRect.height / 2 - dropdownRect.height / 2\n }\n break\n case \"end\":\n if (placement === \"top\" || placement === \"bottom\") {\n x = triggerRect.right - dropdownRect.width\n } else {\n y = triggerRect.bottom - dropdownRect.height\n }\n break\n case \"start\":\n default:\n // 기본값은 이미 start 정렬\n break\n }\n\n // 뷰포트 경계 확인 및 조정\n if (x < 8) x = 8 // 8px 여백\n if (x + dropdownRect.width > viewportWidth - 8) {\n x = viewportWidth - dropdownRect.width - 8 // 8px 여백\n }\n if (y < 8) y = 8 // 8px 여백\n if (y + dropdownRect.height > viewportHeight - 8) {\n y = viewportHeight - dropdownRect.height - 8 // 8px 여백\n }\n\n setCoords({ x, y })\n }, [placement, align, offset])\n\n React.useEffect(() => {\n if (isOpen) {\n updatePosition()\n window.addEventListener('resize', updatePosition)\n window.addEventListener('scroll', updatePosition)\n \n return () => {\n window.removeEventListener('resize', updatePosition)\n window.removeEventListener('scroll', updatePosition)\n }\n }\n }, [isOpen, updatePosition])\n\n React.useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n triggerRef.current && \n dropdownRef.current && \n !triggerRef.current.contains(event.target as Node) &&\n !dropdownRef.current.contains(event.target as Node)\n ) {\n handleOpenChange(false)\n }\n }\n\n if (isOpen) {\n document.addEventListener('mousedown', handleClickOutside)\n return () => {\n document.removeEventListener('mousedown', handleClickOutside)\n }\n }\n }, [isOpen])\n\n const getPlacementClasses = () => {\n switch (placement) {\n case \"top\":\n return \"bottom-full left-0 mb-2\" // 8px 간격\n case \"bottom\":\n return \"top-full left-0 mt-2\" // 8px 간격\n case \"left\":\n return \"right-full top-0 mr-2\" // 8px 간격\n case \"right\":\n return \"left-full top-0 ml-2\" // 8px 간격\n default:\n return \"top-full left-0 mt-2\"\n }\n }\n\n const getArrowClasses = () => {\n switch (placement) {\n case \"top\":\n return \"top-full left-4 -translate-x-1/2 border-t-gray-100 dark:border-t-gray-800\"\n case \"bottom\":\n return \"bottom-full left-4 -translate-x-1/2 border-b-gray-100 dark:border-b-gray-800\"\n case \"left\":\n return \"left-full top-4 -translate-y-1/2 border-l-gray-100 dark:border-l-gray-800\"\n case \"right\":\n return \"right-full top-4 -translate-y-1/2 border-r-gray-100 dark:border-r-gray-800\"\n default:\n return \"bottom-full left-4 -translate-x-1/2 border-b-gray-100 dark:border-b-gray-800\"\n }\n }\n\n return (\n <div ref={ref} className={merge(\"relative\", className)} {...props}>\n {/* 트리거 */}\n <div\n ref={triggerRef}\n onClick={handleTriggerClick}\n className=\"inline-block cursor-pointer\"\n >\n {trigger}\n </div>\n\n {/* 드롭다운 */}\n {isOpen && (\n <div\n ref={dropdownRef}\n className={merge(\n \"absolute z-50 bg-white dark:bg-gray-800 rounded-lg shadow-xl backdrop-blur-sm\", // 보더 대신 섀도우 사용\n \"min-w-[200px] py-2\", // 16px 패딩\n getPlacementClasses()\n )}\n style={{\n transform: `translate(${coords.x}px, ${coords.y}px)`,\n boxShadow: \"0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04)\"\n }}\n >\n {/* 화살표 */}\n {showArrow && (\n <div\n className={merge(\n \"absolute w-0 h-0 border-4 border-transparent\",\n getArrowClasses()\n )}\n />\n )}\n \n {/* 내용 */}\n <div className=\"relative z-10\">\n {children}\n </div>\n </div>\n )}\n </div>\n )\n }\n)\nDropdown.displayName = \"Dropdown\"\n\n// 드롭다운 아이템 컴포넌트들\nexport interface DropdownItemProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n icon?: React.ReactNode\n variant?: \"default\" | \"destructive\" | \"disabled\"\n}\n\nconst DropdownItem = React.forwardRef<HTMLButtonElement, DropdownItemProps>(\n ({ \n className, \n icon,\n variant = \"default\",\n children,\n disabled,\n ...props \n }, ref) => {\n const getVariantClasses = () => {\n switch (variant) {\n case \"destructive\":\n return \"text-red-600 dark:text-red-400 hover:bg-red-50 dark:hover:bg-red-900/20\"\n case \"disabled\":\n return \"text-gray-400 dark:text-gray-500 cursor-not-allowed\"\n default:\n return \"text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700\"\n }\n }\n\n return (\n <button\n ref={ref}\n className={merge(\n \"w-full flex items-center gap-3 px-4 py-3 text-sm font-medium transition-colors focus:outline-none focus:bg-gray-100 dark:focus:bg-gray-700\", // 16px, 12px 패딩\n getVariantClasses(),\n className\n )}\n disabled={disabled || variant === \"disabled\"}\n {...props}\n >\n {icon && (\n <div className=\"flex-shrink-0 w-4 h-4\">\n {icon}\n </div>\n )}\n <span className=\"flex-1 text-left\">{children}</span>\n </button>\n )\n }\n)\nDropdownItem.displayName = \"DropdownItem\"\n\nexport interface DropdownSeparatorProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nconst DropdownSeparator = React.forwardRef<HTMLDivElement, DropdownSeparatorProps>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"h-px bg-gray-200 dark:bg-gray-700 my-2\", className)} // 8px 여백\n {...props}\n />\n )\n)\nDropdownSeparator.displayName = \"DropdownSeparator\"\n\nexport interface DropdownLabelProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nconst DropdownLabel = React.forwardRef<HTMLDivElement, DropdownLabelProps>(\n ({ className, children, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"px-4 py-2 text-xs font-semibold text-gray-500 dark:text-gray-400 uppercase tracking-wide\", className)} // 16px, 8px 패딩\n {...props}\n >\n {children}\n </div>\n )\n)\nDropdownLabel.displayName = \"DropdownLabel\"\n\n// 편의 컴포넌트들\nconst DropdownMenu = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, children, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"py-1\", className)} // 4px 패딩\n {...props}\n >\n {children}\n </div>\n )\n)\nDropdownMenu.displayName = \"DropdownMenu\"\n\nconst DropdownGroup = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, children, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"space-y-1\", className)} // 4px 간격\n {...props}\n >\n {children}\n </div>\n )\n)\nDropdownGroup.displayName = \"DropdownGroup\"\n\nexport { Dropdown, DropdownItem, DropdownSeparator, DropdownLabel, DropdownMenu, DropdownGroup } ","\"use client\";\n\nimport React from \"react\";\nimport { merge } from \"../../lib/utils\";\nimport { Button } from \"../Button\";\nimport { Dropdown, DropdownItem, DropdownMenu } from \"../Dropdown\";\nimport { Icon } from \"../Icon\";\nimport type { IconName } from \"../../lib/icons\";\n\ntype ToolbarVariant = \"plain\" | \"cards\";\n\n/**\n * 툴바 액션 인터페이스 / ToolbarAction interface\n * @typedef {Object} ToolbarAction\n * @property {string} label - 액션 라벨 / Action label\n * @property {() => void} [onClick] - 클릭 핸들러 / Click handler\n * @property {string} [href] - 링크 URL / Link URL\n * @property {IconName | React.ReactNode} [icon] - 아이콘 / Icon\n * @property {\"primary\" | \"secondary\" | \"ghost\"} [appearance=\"secondary\"] - 액션 스타일 / Action style\n * @property {boolean} [loading] - 로딩 상태 / Loading state\n */\nexport interface ToolbarAction {\n label: string;\n onClick?: () => void;\n href?: string;\n icon?: IconName | React.ReactNode;\n appearance?: \"primary\" | \"secondary\" | \"ghost\";\n loading?: boolean;\n}\n\n/**\n * 날짜 프리셋 인터페이스 / DatePreset interface\n * @typedef {Object} DatePreset\n * @property {string} label - 프리셋 라벨 / Preset label\n * @property {string} value - 프리셋 값 / Preset value\n */\nexport interface DatePreset {\n label: string;\n value: string;\n}\n\n/**\n * 날짜 범위 설정 인터페이스 / DateRangeConfig interface\n * @typedef {Object} DateRangeConfig\n * @property {{ from: Date; to: Date } | null} value - 날짜 범위 값 / Date range value\n * @property {DatePreset[]} [presets] - 날짜 프리셋 배열 / Date preset array\n * @property {(preset: DatePreset) => void} [onSelectPreset] - 프리셋 선택 핸들러 / Preset selection handler\n * @property {() => void} [onCustomRange] - 커스텀 범위 선택 핸들러 / Custom range selection handler\n * @property {string} [display] - 표시 텍스트 / Display text\n */\nexport interface DateRangeConfig {\n value: { from: Date; to: Date } | null;\n presets?: DatePreset[];\n onSelectPreset?: (preset: DatePreset) => void;\n onCustomRange?: () => void;\n display?: string;\n}\n\n/**\n * DashboardToolbar 컴포넌트의 props / DashboardToolbar component props\n * @typedef {Object} DashboardToolbarProps\n * @property {React.ReactNode} [title] - 툴바 제목 / Toolbar title\n * @property {React.ReactNode} [description] - 툴바 설명 / Toolbar description\n * @property {React.ReactNode} [meta] - 메타 정보 / Meta information\n * @property {\"plain\" | \"cards\"} [variant=\"cards\"] - 툴바 스타일 변형 / Toolbar style variant\n * @property {DateRangeConfig} [dateRange] - 날짜 범위 설정 / Date range configuration\n * @property {React.ReactNode} [filters] - 필터 컴포넌트 / Filter component\n * @property {ToolbarAction[]} [actions] - 액션 버튼 배열 / Action buttons array\n * @property {() => void} [onRefresh] - 새로고침 핸들러 / Refresh handler\n * @property {string} [lastUpdated] - 마지막 업데이트 시간 / Last updated time\n * @extends {Omit<React.HTMLAttributes<HTMLDivElement>, \"title\">}\n */\nexport interface DashboardToolbarProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, \"title\"> {\n title?: React.ReactNode;\n description?: React.ReactNode;\n meta?: React.ReactNode;\n variant?: ToolbarVariant;\n dateRange?: DateRangeConfig;\n filters?: React.ReactNode;\n actions?: ToolbarAction[];\n onRefresh?: () => void;\n lastUpdated?: string;\n}\n\nconst actionAppearance = {\n primary: \"bg-blue-600 text-white hover:bg-blue-700\",\n secondary:\n \"border border-slate-200 text-slate-800 hover:bg-slate-50 dark:border-slate-700 dark:text-white dark:hover:bg-slate-800\",\n ghost: \"text-slate-600 hover:text-slate-900 dark:text-slate-300 dark:hover:text-white\",\n};\n\nconst ToolbarButton: React.FC<ToolbarAction> = ({\n label,\n onClick,\n href,\n icon,\n appearance = \"secondary\",\n loading,\n}) => {\n const content = (\n <>\n {icon &&\n (typeof icon === \"string\" ? (\n <Icon name={icon as IconName} className=\"h-4 w-4\" />\n ) : (\n icon\n ))}\n <span>{label}</span>\n </>\n );\n\n const className = merge(\n \"inline-flex items-center gap-2 rounded-lg px-3 py-2 text-sm font-medium transition-colors\",\n actionAppearance[appearance]\n );\n\n if (href) {\n return (\n <a className={className} href={href}>\n {content}\n </a>\n );\n }\n\n return (\n <button className={className} onClick={onClick} disabled={loading}>\n {content}\n </button>\n );\n};\n\n/**\n * DashboardToolbar 컴포넌트\n * \n * 대시보드 상단 툴바 컴포넌트입니다.\n * 제목, 설명, 필터, 날짜 범위 선택, 액션 버튼 등을 포함할 수 있습니다.\n * \n * Top toolbar component for dashboards.\n * Can include title, description, filters, date range selection, and action buttons.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <DashboardToolbar\n * title=\"거래 대시보드\"\n * description=\"전체 거래 현황을 확인하세요\"\n * actions={[\n * { label: \"내보내기\", icon: \"download\", onClick: handleExport },\n * { label: \"필터\", icon: \"funnel\", onClick: handleFilter }\n * ]}\n * onRefresh={handleRefresh}\n * />\n * \n * @example\n * // 날짜 범위 포함 / With date range\n * <DashboardToolbar\n * title=\"매출 분석\"\n * dateRange={{\n * value: { from: new Date(\"2024-01-01\"), to: new Date(\"2024-12-31\") },\n * presets: [\n * { label: \"오늘\", value: \"today\" },\n * { label: \"이번 주\", value: \"thisWeek\" },\n * { label: \"이번 달\", value: \"thisMonth\" }\n * ],\n * onSelectPreset: handlePresetSelect,\n * onCustomRange: handleCustomRange\n * }}\n * />\n * \n * @param {DashboardToolbarProps} props - DashboardToolbar 컴포넌트의 props / DashboardToolbar component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} DashboardToolbar 컴포넌트 / DashboardToolbar component\n */\nexport const DashboardToolbar = React.forwardRef<HTMLDivElement, DashboardToolbarProps>(\n (\n {\n title,\n description,\n meta,\n variant = \"cards\",\n dateRange,\n filters,\n actions,\n onRefresh,\n lastUpdated,\n className,\n ...props\n },\n ref\n ) => {\n const containerClasses = merge(\n \"w-full\",\n variant === \"cards\"\n ? \"rounded-2xl border border-slate-200/70 dark:border-slate-800 bg-white dark:bg-slate-900 shadow-sm\"\n : \"\"\n );\n\n return (\n <div ref={ref} className={merge(containerClasses, className)} {...props}>\n <div className=\"flex flex-col gap-4 px-4 py-4 sm:px-6 sm:py-5\">\n <div className=\"flex flex-col gap-2 sm:flex-row sm:items-center sm:justify-between\">\n <div>\n {title && (\n <div className=\"text-xl font-semibold text-slate-900 dark:text-slate-50\">\n {title}\n </div>\n )}\n {description && (\n <p className=\"text-sm text-slate-500 dark:text-slate-400\">{description}</p>\n )}\n </div>\n <div className=\"flex flex-wrap gap-2\">\n {dateRange && (\n <Dropdown\n trigger={\n <Button \n variant=\"outline\" \n size=\"sm\" \n className=\"gap-2\"\n aria-label={`날짜 범위 선택: ${dateRange.display || \"날짜 범위\"}`}\n >\n <Icon name=\"calendar\" className=\"h-4 w-4\" />\n {dateRange.display || \"날짜 범위\"}\n </Button>\n }\n >\n <DropdownMenu className=\"max-h-64 overflow-auto\">\n {dateRange.presets?.map((preset) => (\n <DropdownItem\n key={preset.value}\n onClick={() => dateRange.onSelectPreset?.(preset)}\n >\n {preset.label}\n </DropdownItem>\n ))}\n {dateRange.onCustomRange && (\n <DropdownItem onClick={dateRange.onCustomRange}>\n 사용자 지정...\n </DropdownItem>\n )}\n </DropdownMenu>\n </Dropdown>\n )}\n {onRefresh && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"gap-2 text-slate-500 hover:text-slate-900 dark:text-slate-400 dark:hover:text-white\"\n onClick={onRefresh}\n aria-label=\"데이터 새로고침\"\n >\n <Icon name=\"refresh\" className=\"h-4 w-4\" />\n 새로고침\n </Button>\n )}\n </div>\n </div>\n\n {(filters || meta || lastUpdated) && (\n <div className=\"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between border-t border-slate-100 dark:border-slate-800 pt-3\">\n <div className=\"flex flex-wrap items-center gap-3 text-sm text-slate-600 dark:text-slate-300\">\n {filters}\n {meta}\n </div>\n {lastUpdated && (\n <span className=\"text-xs text-slate-400\">업데이트: {lastUpdated}</span>\n )}\n </div>\n )}\n\n {actions && actions.length > 0 && (\n <div className=\"flex flex-wrap justify-end gap-2 border-t border-slate-100 dark:border-slate-800 pt-4\">\n {actions.map((action) => (\n <ToolbarButton key={action.label} {...action} />\n ))}\n </div>\n )}\n </div>\n </div>\n );\n }\n);\n\nDashboardToolbar.displayName = \"DashboardToolbar\";\n\n","\"use client\";\n\nimport React from \"react\";\nimport { merge } from \"../../lib/utils\";\n\nexport type TrendSeriesPalette = \"approval\" | \"settlement\" | \"custom\";\n\n/**\n * 트렌드 시리즈 인터페이스\n * @typedef {Object} TrendSeries\n * @property {string} label - 시리즈 라벨\n * @property {number[]} data - 데이터 배열\n * @property {string} [color] - 커스텀 색상\n * @property {boolean} [area] - 영역 채우기 여부\n */\nexport interface TrendSeries {\n label: string;\n data: number[];\n color?: string;\n area?: boolean;\n}\n\n/**\n * TrendChart 컴포넌트의 props / TrendChart component props\n * @typedef {Object} TrendChartProps\n * @property {TrendSeries[]} series - 시리즈 배열 / Series array\n * @property {string[]} categories - 카테고리 배열 / Categories array\n * @property {TrendSeriesPalette} [palette=\"approval\"] - 색상 팔레트 / Color palette\n * @property {number} [height=200] - 차트 높이 (px) / Chart height (px)\n * @property {boolean} [showLegend=true] - 범례 표시 여부 / Show legend\n * @property {boolean} [showDots=true] - 점 표시 여부 / Show dots\n * @property {boolean} [showTooltip=false] - 툴팁 표시 여부 / Show tooltip\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface TrendChartProps extends React.HTMLAttributes<HTMLDivElement> {\n series: TrendSeries[];\n categories: string[];\n palette?: TrendSeriesPalette;\n height?: number;\n showLegend?: boolean;\n showDots?: boolean;\n showTooltip?: boolean;\n}\n\nconst PRESET_PALETTES: Record<TrendSeriesPalette, string[]> = {\n approval: [\"#22c55e\", \"#f97316\", \"#ef4444\"],\n settlement: [\"#6366f1\", \"#0ea5e9\", \"#14b8a6\"],\n custom: [\"#0ea5e9\"],\n};\n\n/**\n * TrendChart 컴포넌트\n * \n * 트렌드 데이터를 선 그래프로 표시하는 컴포넌트입니다.\n * 여러 시리즈를 동시에 표시할 수 있으며, 영역 채우기 옵션을 제공합니다.\n * \n * Line chart component that displays trend data.\n * Can display multiple series simultaneously with area fill option.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <TrendChart\n * series={[\n * { label: \"승인\", data: [10, 20, 15, 30, 25] },\n * { label: \"거부\", data: [5, 10, 8, 15, 12] }\n * ]}\n * categories={[\"월\", \"화\", \"수\", \"목\", \"금\"]}\n * palette=\"approval\"\n * />\n * \n * @example\n * // 영역 채우기와 커스텀 색상 / Area fill and custom color\n * <TrendChart\n * series={[\n * { label: \"정산\", data: [100, 200, 150], area: true, color: \"#6366f1\" }\n * ]}\n * categories={[\"1월\", \"2월\", \"3월\"]}\n * palette=\"settlement\"\n * showDots={true}\n * showTooltip={true}\n * />\n * \n * @param {TrendChartProps} props - TrendChart 컴포넌트의 props / TrendChart component props\n * @returns {JSX.Element} TrendChart 컴포넌트 / TrendChart component\n */\nexport const TrendChart: React.FC<TrendChartProps> = ({\n series,\n categories,\n palette = \"approval\",\n height = 200,\n showLegend = true,\n showDots = true,\n showTooltip = false,\n className,\n ...props\n}) => {\n const paletteColors = PRESET_PALETTES[palette] || PRESET_PALETTES.approval;\n const safeCategories = categories.length > 0 ? categories : [\"—\"];\n const denominator = Math.max(safeCategories.length - 1, 1);\n\n const maxValue = Math.max(...series.flatMap((s) => s.data), 10);\n\n const chartId = React.useId();\n const chartLabel = series.length > 0\n ? `트렌드 차트 - ${series.length}개 시리즈, ${safeCategories.length}개 카테고리, 최대값 ${maxValue.toLocaleString()}`\n : `트렌드 차트 - ${safeCategories.length}개 카테고리`;\n\n return (\n <div\n role=\"img\"\n aria-label={chartLabel}\n className={merge(\n \"rounded-2xl border border-slate-100 dark:border-slate-800 bg-white dark:bg-slate-900 p-4\",\n className\n )}\n {...props}\n >\n <div className=\"relative\" style={{ height }}>\n {series.map((s, index) => {\n const color = s.color || paletteColors[index % paletteColors.length];\n const points = s.data.map((point, i) => ({\n x: (i / denominator) * 100,\n y: 100 - (point / maxValue) * 100,\n value: point,\n label: safeCategories[i] ?? safeCategories[safeCategories.length - 1] ?? \"\",\n }));\n\n if (points.length === 0) {\n return null;\n }\n\n const pathData = points\n .map((p, i) => `${i === 0 ? \"M\" : \"L\"} ${p.x},${p.y}`)\n .join(\" \");\n\n const areaData = `${pathData} L 100,100 L 0,100 Z`;\n\n return (\n <svg\n key={s.label}\n viewBox=\"0 0 100 100\"\n preserveAspectRatio=\"none\"\n className=\"absolute inset-0 h-full w-full\"\n >\n {s.area && (\n <path\n d={areaData}\n fill={color}\n opacity={0.08}\n stroke=\"none\"\n />\n )}\n <path\n d={pathData}\n fill=\"none\"\n stroke={color}\n strokeWidth={2}\n strokeLinejoin=\"round\"\n strokeLinecap=\"round\"\n />\n {showDots &&\n points.map((p, i) => (\n <circle\n key={`${s.label}-${i}`}\n cx={p.x}\n cy={p.y}\n r={1.2}\n fill=\"#fff\"\n stroke={color}\n strokeWidth={0.8}\n >\n {showTooltip && (\n <title>\n {s.label} · {p.label}: {p.value.toLocaleString()}\n </title>\n )}\n </circle>\n ))}\n </svg>\n );\n })}\n <div className=\"absolute inset-x-0 bottom-0 flex text-[10px] text-slate-400\">\n {safeCategories.map((label, idx) => (\n <div key={label} className=\"flex-1 text-center\">\n {label}\n </div>\n ))}\n </div>\n </div>\n\n {showLegend && (\n <div \n className=\"mt-4 flex flex-wrap gap-4 text-sm text-slate-600 dark:text-slate-300\"\n role=\"list\"\n aria-label=\"차트 범례\"\n >\n {series.map((s, index) => {\n const color = s.color || paletteColors[index % paletteColors.length];\n return (\n <div \n key={s.label} \n role=\"listitem\"\n className=\"flex items-center gap-2\"\n tabIndex={0}\n aria-label={`${s.label} 시리즈`}\n onKeyDown={(e) => {\n // 키보드 네비게이션 지원\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n // 범례 클릭 시 해당 시리즈 강조 등의 기능 추가 가능\n }\n }}\n >\n <span\n className=\"inline-block h-2 w-2 rounded-full\"\n style={{ backgroundColor: color }}\n aria-hidden=\"true\"\n />\n <span>{s.label}</span>\n </div>\n );\n })}\n </div>\n )}\n </div>\n );\n};\n\nTrendChart.displayName = \"TrendChart\";\n\n","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\nimport { Icon } from \"./Icon\"\n\n/**\n * Drawer 컴포넌트의 props / Drawer component props\n * @typedef {Object} DrawerProps\n * @property {boolean} open - Drawer 열림/닫힘 상태 / Drawer open/close state\n * @property {(open: boolean) => void} onOpenChange - 상태 변경 콜백 / State change callback\n * @property {React.ReactNode} children - Drawer 내용 / Drawer content\n * @property {string} [className] - 추가 CSS 클래스 / Additional CSS class\n * @property {\"left\" | \"right\" | \"top\" | \"bottom\"} [side=\"right\"] - Drawer 표시 위치 / Drawer display position\n * @property {\"sm\" | \"md\" | \"lg\" | \"xl\" | \"full\"} [size=\"md\"] - Drawer 크기 / Drawer size\n * @property {boolean} [showBackdrop=true] - 배경 오버레이 표시 여부 / Show backdrop overlay\n * @property {string} [backdropClassName] - 배경 오버레이 추가 CSS 클래스 / Backdrop overlay additional CSS class\n * @property {boolean} [closeOnBackdropClick=true] - 배경 클릭 시 닫기 여부 / Close on backdrop click\n * @property {boolean} [closeOnEscape=true] - ESC 키로 닫기 여부 / Close on ESC key\n */\ninterface DrawerProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n children: React.ReactNode\n className?: string\n side?: \"left\" | \"right\" | \"top\" | \"bottom\"\n size?: \"sm\" | \"md\" | \"lg\" | \"xl\" | \"full\"\n showBackdrop?: boolean\n backdropClassName?: string\n closeOnBackdropClick?: boolean\n closeOnEscape?: boolean\n}\n\n/**\n * Drawer 컴포넌트 / Drawer component\n * \n * 사이드에서 슬라이드되는 패널 컴포넌트입니다.\n * Modal과 유사하지만 특정 방향에서 슬라이드되는 애니메이션을 제공합니다.\n * ESC 키로 닫기, 배경 클릭으로 닫기 기능을 지원합니다.\n * \n * Panel component that slides from the side.\n * Similar to Modal but provides slide animation from a specific direction.\n * Supports closing with ESC key and backdrop click.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * const [open, setOpen] = useState(false)\n * \n * <Drawer open={open} onOpenChange={setOpen}>\n * <DrawerHeader>제목</DrawerHeader>\n * <DrawerContent>내용</DrawerContent>\n * <DrawerFooter>\n * <Button onClick={() => setOpen(false)}>닫기</Button>\n * </DrawerFooter>\n * </Drawer>\n * \n * @example\n * // 왼쪽에서 열기 / Open from left\n * <Drawer open={open} onOpenChange={setOpen} side=\"left\" size=\"lg\">\n * <DrawerContent>사이드바 내용</DrawerContent>\n * </Drawer>\n * \n * @param {DrawerProps} props - Drawer 컴포넌트의 props / Drawer component props\n * @param {React.Ref<HTMLDivElement>} ref - Drawer 컨테이너 ref / Drawer container ref\n * @returns {JSX.Element} Drawer 컴포넌트 / Drawer component\n * \n * @todo 접근성 개선: role=\"dialog\", aria-modal=\"true\" 추가 필요 / Accessibility: Add role=\"dialog\", aria-modal=\"true\"\n * @todo 접근성 개선: aria-labelledby, aria-describedby 연결 필요 / Accessibility: Connect aria-labelledby, aria-describedby\n */\nconst Drawer = React.forwardRef<HTMLDivElement, DrawerProps>(\n ({ \n open, \n onOpenChange, \n children, \n className,\n side = \"right\",\n size = \"md\",\n showBackdrop = true,\n backdropClassName,\n closeOnBackdropClick = true,\n closeOnEscape = true,\n ...props \n }, ref) => {\n const [isVisible, setIsVisible] = React.useState(false)\n const [isAnimating, setIsAnimating] = React.useState(false)\n\n React.useEffect(() => {\n if (open) {\n setIsVisible(true)\n setIsAnimating(true)\n // 애니메이션 시작을 위한 지연\n const timer = setTimeout(() => setIsAnimating(false), 50)\n return () => clearTimeout(timer)\n } else {\n setIsAnimating(true)\n const timer = setTimeout(() => {\n setIsVisible(false)\n setIsAnimating(false)\n }, 300) // 애니메이션 완료 후 숨김\n return () => clearTimeout(timer)\n }\n }, [open])\n\n React.useEffect(() => {\n if (!closeOnEscape) return\n\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === \"Escape\" && open) {\n onOpenChange(false)\n }\n }\n\n if (open) {\n document.addEventListener(\"keydown\", handleEscape)\n document.body.style.overflow = \"hidden\"\n }\n\n return () => {\n document.removeEventListener(\"keydown\", handleEscape)\n document.body.style.overflow = \"\"\n }\n }, [open, closeOnEscape, onOpenChange])\n\n if (!isVisible) return null\n\n const sizeClasses = {\n sm: side === \"left\" || side === \"right\" ? \"w-80\" : \"h-64\",\n md: side === \"left\" || side === \"right\" ? \"w-96\" : \"h-96\",\n lg: side === \"left\" || side === \"right\" ? \"w-[28rem]\" : \"h-[32rem]\",\n xl: side === \"left\" || side === \"right\" ? \"w-[32rem]\" : \"h-[40rem]\",\n full: side === \"left\" || side === \"right\" ? \"w-full\" : \"h-full\"\n }\n\n const sideClasses = {\n left: \"left-0 top-0 h-full translate-x-0\",\n right: \"right-0 top-0 h-full translate-x-0\",\n top: \"top-0 left-0 w-full translate-y-0\",\n bottom: \"bottom-0 left-0 w-full translate-y-0\"\n }\n\n const transformClasses = {\n left: isAnimating ? (open ? \"translate-x-0\" : \"-translate-x-full\") : \"\",\n right: isAnimating ? (open ? \"translate-x-0\" : \"translate-x-full\") : \"\",\n top: isAnimating ? (open ? \"translate-y-0\" : \"-translate-y-full\") : \"\",\n bottom: isAnimating ? (open ? \"translate-y-0\" : \"translate-y-full\") : \"\"\n }\n\n return (\n <div className=\"fixed inset-0 z-50\">\n {/* Backdrop */}\n {showBackdrop && (\n <div\n className={merge(\n \"absolute inset-0 bg-black/60 backdrop-blur-md transition-opacity duration-300\",\n isAnimating ? (open ? \"opacity-100\" : \"opacity-0\") : \"\",\n backdropClassName\n )}\n onClick={closeOnBackdropClick ? () => onOpenChange(false) : undefined}\n />\n )}\n\n {/* Drawer Content */}\n <div\n ref={ref}\n className={merge(\n \"absolute bg-white/95 dark:!bg-gray-800/95 backdrop-blur-xl border border-gray-200/50 dark:!border-gray-600/50 shadow-2xl transition-transform duration-300 ease-out\",\n sizeClasses[size],\n sideClasses[side],\n transformClasses[side],\n className\n )}\n {...props}\n >\n {children}\n </div>\n </div>\n )\n }\n)\nDrawer.displayName = \"Drawer\"\n\n/**\n * DrawerHeader 컴포넌트의 props / DrawerHeader component props\n * @typedef {Object} DrawerHeaderProps\n * @property {React.ReactNode} children - 헤더 내용 / Header content\n * @property {string} [className] - 추가 CSS 클래스 / Additional CSS class\n * @property {boolean} [showCloseButton=true] - 닫기 버튼 표시 여부 / Show close button\n * @property {() => void} [onClose] - 닫기 버튼 클릭 콜백 / Close button click callback\n */\ninterface DrawerHeaderProps {\n children: React.ReactNode\n className?: string\n showCloseButton?: boolean\n onClose?: () => void\n}\n\n/**\n * DrawerHeader 컴포넌트 / DrawerHeader component\n * Drawer의 헤더 영역을 표시합니다.\n * Displays the header area of a Drawer.\n * \n * @component\n * @param {DrawerHeaderProps} props - DrawerHeader 컴포넌트의 props / DrawerHeader component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} DrawerHeader 컴포넌트 / DrawerHeader component\n */\nconst DrawerHeader = React.forwardRef<HTMLDivElement, DrawerHeaderProps>(\n ({ children, className, showCloseButton = true, onClose, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={merge(\"flex items-center justify-between p-6 border-b border-gray-200/50 dark:border-gray-700/50\", className)}\n {...props}\n >\n <div className=\"flex-1\">{children}</div>\n {showCloseButton && (\n <button\n onClick={onClose}\n className=\"p-2 rounded-lg hover:bg-gray-100/80 dark:hover:bg-gray-800/80 transition-colors\"\n >\n <Icon name=\"close\" size={20} />\n </button>\n )}\n </div>\n )\n }\n)\nDrawerHeader.displayName = \"DrawerHeader\"\n\n/**\n * DrawerContent 컴포넌트의 props / DrawerContent component props\n * @typedef {Object} DrawerContentProps\n * @property {React.ReactNode} children - 콘텐츠 / Content\n * @property {string} [className] - 추가 CSS 클래스 / Additional CSS class\n */\ninterface DrawerContentProps {\n children: React.ReactNode\n className?: string\n}\n\n/**\n * DrawerContent 컴포넌트 / DrawerContent component\n * Drawer의 메인 콘텐츠 영역을 표시합니다.\n * Displays the main content area of a Drawer.\n * \n * @component\n * @param {DrawerContentProps} props - DrawerContent 컴포넌트의 props / DrawerContent component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} DrawerContent 컴포넌트 / DrawerContent component\n */\nconst DrawerContent = React.forwardRef<HTMLDivElement, DrawerContentProps>(\n ({ children, className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={merge(\"flex-1 p-6 overflow-y-auto\", className)}\n {...props}\n >\n {children}\n </div>\n )\n }\n)\nDrawerContent.displayName = \"DrawerContent\"\n\n/**\n * DrawerFooter 컴포넌트의 props / DrawerFooter component props\n * @typedef {Object} DrawerFooterProps\n * @property {React.ReactNode} children - 푸터 내용 / Footer content\n * @property {string} [className] - 추가 CSS 클래스 / Additional CSS class\n */\ninterface DrawerFooterProps {\n children: React.ReactNode\n className?: string\n}\n\n/**\n * DrawerFooter 컴포넌트 / DrawerFooter component\n * Drawer의 푸터 영역을 표시합니다. 주로 액션 버튼을 배치합니다.\n * Displays the footer area of a Drawer. Typically used for action buttons.\n * \n * @component\n * @param {DrawerFooterProps} props - DrawerFooter 컴포넌트의 props / DrawerFooter component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} DrawerFooter 컴포넌트 / DrawerFooter component\n */\nconst DrawerFooter = React.forwardRef<HTMLDivElement, DrawerFooterProps>(\n ({ children, className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={merge(\"flex items-center justify-end gap-3 p-6 border-t border-gray-200/50 dark:border-gray-700/50\", className)}\n {...props}\n >\n {children}\n </div>\n )\n }\n)\nDrawerFooter.displayName = \"DrawerFooter\"\n\nexport { Drawer, DrawerHeader, DrawerContent, DrawerFooter } ","\"use client\";\n\nimport React from \"react\";\nimport { Drawer, DrawerHeader, DrawerContent, DrawerFooter } from \"../Drawer\";\nimport { Badge } from \"../Badge\";\nimport { Icon } from \"../Icon\";\nimport type { IconName } from \"../../lib/icons\";\nimport { merge } from \"../../lib/utils\";\nimport { DashboardEmptyState } from \"./EmptyState\";\nimport type { TransactionStatus } from \"./TransactionsTable\";\n\nconst STATUS_STYLES: Record<TransactionStatus, { label: string; badge: string }> = {\n approved: { label: \"승인\", badge: \"bg-emerald-100 text-emerald-700 dark:bg-emerald-500/15 dark:text-emerald-200\" },\n pending: { label: \"대기\", badge: \"bg-amber-100 text-amber-700 dark:bg-amber-500/15 dark:text-amber-200\" },\n failed: { label: \"실패\", badge: \"bg-rose-100 text-rose-700 dark:bg-rose-500/15 dark:text-rose-200\" },\n refunded: { label: \"환불\", badge: \"bg-sky-100 text-sky-700 dark:bg-sky-500/15 dark:text-sky-200\" },\n cancelled: { label: \"취소\", badge: \"bg-slate-100 text-slate-700 dark:bg-slate-500/15 dark:text-slate-200\" },\n review: { label: \"검토중\", badge: \"bg-violet-100 text-violet-700 dark:bg-violet-500/15 dark:text-violet-200\" },\n};\n\n/**\n * 거래 상세 정보 인터페이스 / TransactionDetail interface\n * @typedef {Object} TransactionDetail\n * @property {string} id - 거래 ID / Transaction ID\n * @property {TransactionStatus} status - 거래 상태 / Transaction status\n * @property {number} amount - 거래 금액 / Transaction amount\n * @property {string} [currency] - 통화 / Currency\n * @property {string} [merchant] - 가맹점 / Merchant\n * @property {string} [method] - 결제수단 / Payment method\n * @property {string | Date} [createdAt] - 생성일시 / Created date\n * @property {string | Date} [approvedAt] - 승인일시 / Approved date\n * @property {string} [customer] - 고객 정보 / Customer information\n * @property {string} [reference] - 참조 번호 / Reference number\n */\nexport interface TransactionDetail {\n id: string;\n status: TransactionStatus;\n amount: number;\n currency?: string;\n merchant?: string;\n method?: string;\n createdAt?: string | Date;\n approvedAt?: string | Date;\n customer?: string;\n reference?: string;\n}\n\n/**\n * 거래 메타데이터 아이템 인터페이스 / TransactionMetadataItem interface\n * @typedef {Object} TransactionMetadataItem\n * @property {string} label - 라벨 / Label\n * @property {React.ReactNode} value - 값 / Value\n * @property {IconName} [icon] - 아이콘 / Icon\n */\nexport interface TransactionMetadataItem {\n label: string;\n value: React.ReactNode;\n icon?: IconName;\n}\n\nexport type SettlementStatus = \"pending\" | \"processing\" | \"completed\" | \"failed\";\n\n/**\n * 정산 정보 인터페이스 / SettlementInfo interface\n * @typedef {Object} SettlementInfo\n * @property {SettlementStatus} [status] - 정산 상태 / Settlement status\n * @property {number} [amount] - 정산 금액 / Settlement amount\n * @property {string} [currency] - 통화 / Currency\n * @property {string | Date} [scheduledDate] - 예정일 / Scheduled date\n * @property {string} [expectedPayout] - 예상 지급액 / Expected payout\n * @property {string} [bankAccount] - 계좌 정보 / Bank account information\n * @property {string} [reference] - 참조 번호 / Reference number\n * @property {string} [note] - 메모 / Note\n */\nexport interface SettlementInfo {\n status?: SettlementStatus;\n amount?: number;\n currency?: string;\n scheduledDate?: string | Date;\n expectedPayout?: string;\n bankAccount?: string;\n reference?: string;\n note?: string;\n}\n\n/**\n * 수수료 내역 인터페이스 / FeeBreakdown interface\n * @typedef {Object} FeeBreakdown\n * @property {string} label - 수수료 라벨 / Fee label\n * @property {number} amount - 수수료 금액 / Fee amount\n * @property {string} [currency] - 통화 / Currency\n * @property {string} [description] - 설명 / Description\n */\nexport interface FeeBreakdown {\n label: string;\n amount: number;\n currency?: string;\n description?: string;\n}\n\n/**\n * 거래 이벤트 인터페이스 / TransactionEvent interface\n * @typedef {Object} TransactionEvent\n * @property {string} id - 이벤트 ID / Event ID\n * @property {string} title - 이벤트 제목 / Event title\n * @property {string} [description] - 설명 / Description\n * @property {string | Date} timestamp - 타임스탬프 / Timestamp\n * @property {\"success\" | \"warning\" | \"error\" | \"info\"} [status] - 이벤트 상태 / Event status\n * @property {IconName} [icon] - 아이콘 / Icon\n * @property {string} [actor] - 실행자 / Actor\n */\nexport interface TransactionEvent {\n id: string;\n title: string;\n description?: string;\n timestamp: string | Date;\n status?: \"success\" | \"warning\" | \"error\" | \"info\";\n icon?: IconName;\n actor?: string;\n}\n\n/**\n * TransactionDetailDrawer 컴포넌트의 props / TransactionDetailDrawer component props\n * @typedef {Object} TransactionDetailDrawerProps\n * @property {boolean} open - 드로어 열림 상태 / Drawer open state\n * @property {() => void} onClose - 닫기 핸들러 / Close handler\n * @property {TransactionDetail} [transaction] - 거래 상세 정보 / Transaction detail information\n * @property {TransactionMetadataItem[]} [metadata=[]] - 메타데이터 배열 / Metadata array\n * @property {SettlementInfo} [settlement] - 정산 정보 / Settlement information\n * @property {FeeBreakdown[]} [fees=[]] - 수수료 내역 배열 / Fee breakdown array\n * @property {TransactionEvent[]} [events=[]] - 이벤트 로그 배열 / Event log array\n * @property {React.ReactNode} [actions] - 액션 컴포넌트 / Actions component\n * @property {React.ReactNode} [summary] - 요약 컴포넌트 / Summary component\n * @property {boolean} [loading=false] - 로딩 상태 / Loading state\n * @property {string} [locale=\"ko-KR\"] - 로케일 / Locale\n * @property {string} [defaultCurrency=\"KRW\"] - 기본 통화 / Default currency\n * @property {React.ReactNode} [emptyState] - 빈 상태 컴포넌트 / Empty state component\n * @property {string} [className] - 추가 클래스명 / Additional class name\n */\nexport interface TransactionDetailDrawerProps {\n open: boolean;\n onClose: () => void;\n transaction?: TransactionDetail;\n metadata?: TransactionMetadataItem[];\n settlement?: SettlementInfo;\n fees?: FeeBreakdown[];\n events?: TransactionEvent[];\n actions?: React.ReactNode;\n summary?: React.ReactNode;\n loading?: boolean;\n locale?: string;\n defaultCurrency?: string;\n emptyState?: React.ReactNode;\n className?: string;\n}\n\nconst formatAmount = (amount?: number, currency?: string, locale = \"ko-KR\") => {\n if (typeof amount !== \"number\") return \"-\";\n try {\n return new Intl.NumberFormat(locale, {\n style: \"currency\",\n currency: currency ?? \"KRW\",\n maximumFractionDigits: 2,\n }).format(amount);\n } catch {\n return `${amount.toLocaleString(locale)} ${currency ?? \"\"}`.trim();\n }\n};\n\nconst formatDate = (date?: string | Date, locale = \"ko-KR\") => {\n if (!date) return \"-\";\n const parsed = date instanceof Date ? date : new Date(date);\n if (Number.isNaN(parsed.getTime())) return \"-\";\n return parsed.toLocaleString(locale, { dateStyle: \"medium\", timeStyle: \"short\" });\n};\n\nconst getEventColor = (status?: TransactionEvent[\"status\"]) => {\n switch (status) {\n case \"success\":\n return \"bg-emerald-50 text-emerald-700 dark:bg-emerald-500/20 dark:text-emerald-100\";\n case \"warning\":\n return \"bg-amber-50 text-amber-700 dark:bg-amber-500/20 dark:text-amber-100\";\n case \"error\":\n return \"bg-rose-50 text-rose-700 dark:bg-rose-500/20 dark:text-rose-100\";\n default:\n return \"bg-slate-50 text-slate-600 dark:bg-slate-800/50 dark:text-slate-100\";\n }\n};\n\nconst getSettlementBadge = (status?: SettlementStatus) => {\n switch (status) {\n case \"completed\":\n return \"bg-emerald-50 text-emerald-700 dark:bg-emerald-500/20 dark:text-emerald-100\";\n case \"processing\":\n return \"bg-sky-50 text-sky-700 dark:bg-sky-500/20 dark:text-sky-100\";\n case \"failed\":\n return \"bg-rose-50 text-rose-700 dark:bg-rose-500/20 dark:text-rose-100\";\n case \"pending\":\n return \"bg-amber-50 text-amber-700 dark:bg-amber-500/20 dark:text-amber-100\";\n default:\n return \"bg-slate-50 text-slate-600 dark:bg-slate-800/50 dark:text-slate-100\";\n }\n};\n\n/**\n * TransactionDetailDrawer 컴포넌트\n * \n * 거래 상세 정보를 표시하는 드로어 컴포넌트입니다.\n * 거래 정보, 정산 정보, 수수료 내역, 이벤트 로그 등을 포함합니다.\n * \n * Drawer component that displays detailed transaction information.\n * Includes transaction details, settlement info, fee breakdown, and event logs.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <TransactionDetailDrawer\n * open={isOpen}\n * onClose={() => setIsOpen(false)}\n * transaction={{\n * id: \"tx_123\",\n * status: \"approved\",\n * amount: 100000,\n * currency: \"KRW\",\n * merchant: \"가맹점 A\"\n * }}\n * metadata={[\n * { label: \"거래 ID\", value: \"tx_123\", icon: \"creditCard\" },\n * { label: \"고객\", value: \"홍길동\", icon: \"user\" }\n * ]}\n * />\n * \n * @example\n * // 정산 정보 포함 / With settlement info\n * <TransactionDetailDrawer\n * open={isOpen}\n * onClose={handleClose}\n * transaction={transaction}\n * settlement={{\n * status: \"processing\",\n * amount: 95000,\n * currency: \"KRW\",\n * scheduledDate: new Date(\"2024-01-15\")\n * }}\n * fees={[\n * { label: \"수수료\", amount: 5000, currency: \"KRW\" }\n * ]}\n * events={eventLogs}\n * />\n * \n * @param {TransactionDetailDrawerProps} props - TransactionDetailDrawer 컴포넌트의 props / TransactionDetailDrawer component props\n * @returns {JSX.Element} TransactionDetailDrawer 컴포넌트 / TransactionDetailDrawer component\n */\nexport const TransactionDetailDrawer: React.FC<TransactionDetailDrawerProps> = ({\n open,\n onClose,\n transaction,\n metadata = [],\n settlement,\n fees = [],\n events = [],\n actions,\n summary,\n loading = false,\n locale = \"ko-KR\",\n defaultCurrency = \"KRW\",\n emptyState,\n className,\n}) => {\n const statusStyle = transaction && STATUS_STYLES[transaction.status];\n\n return (\n <Drawer\n open={open}\n onOpenChange={(next) => {\n if (!next) {\n onClose();\n }\n }}\n className={className}\n >\n <DrawerHeader onClose={onClose}>\n <div className=\"space-y-1\">\n <div className=\"flex items-center gap-2 text-xs uppercase tracking-wide text-slate-400\">\n <span>거래 상세</span>\n {transaction?.reference && (\n <span className=\"rounded-full bg-slate-100 px-2 py-0.5 text-slate-500\">{transaction.reference}</span>\n )}\n </div>\n <div className=\"flex items-center gap-3\">\n <p className=\"text-lg font-semibold text-slate-900 dark:text-white\">{transaction?.id ?? \"—\"}</p>\n {statusStyle && (\n <Badge className={merge(\"font-medium px-3 py-1 text-xs rounded-full\", statusStyle.badge)}>\n {statusStyle.label}\n </Badge>\n )}\n </div>\n <p className=\"text-sm text-slate-500 dark:text-slate-400\">\n {transaction?.merchant ?? \"가맹점 정보 없음\"} · {transaction?.method ?? \"결제수단 미지정\"}\n </p>\n </div>\n </DrawerHeader>\n\n <DrawerContent className=\"space-y-6\">\n {loading ? (\n <div className=\"space-y-4\">\n {[...Array(3)].map((_, idx) => (\n <div key={idx} className=\"h-20 rounded-2xl border border-slate-100 dark:border-slate-800 animate-pulse bg-slate-50/60 dark:bg-slate-900/40\" />\n ))}\n </div>\n ) : (\n <>\n <section \n className=\"grid gap-4 rounded-2xl border border-slate-100 dark:border-slate-800 bg-white dark:bg-slate-900/40 p-4 md:grid-cols-2\"\n aria-label=\"거래 요약 정보\"\n >\n <div className=\"space-y-1\">\n <p className=\"text-xs uppercase text-slate-400\">거래 금액</p>\n <p className=\"text-2xl font-semibold text-slate-900 dark:text-white\">\n {formatAmount(transaction?.amount, transaction?.currency ?? defaultCurrency, locale)}\n </p>\n <p className=\"text-xs text-slate-400\">\n 생성 <time dateTime={transaction?.createdAt instanceof Date ? transaction.createdAt.toISOString() : typeof transaction?.createdAt === 'string' ? transaction.createdAt : undefined}>\n {formatDate(transaction?.createdAt, locale)}\n </time>\n </p>\n </div>\n <div className=\"space-y-2\">\n <p className=\"text-xs uppercase text-slate-400\">요약</p>\n {summary ?? (\n <p className=\"text-sm text-slate-600 dark:text-slate-300\">\n {transaction?.customer ?? \"고객 정보 없음\"} / {transaction?.method ?? \"결제수단 미지정\"}\n </p>\n )}\n </div>\n </section>\n\n {metadata.length > 0 && (\n <section \n className=\"rounded-2xl border border-slate-100 dark:border-slate-800 bg-white dark:bg-slate-900/40 p-4\"\n aria-label=\"거래 세부 정보\"\n role=\"region\"\n >\n <h3 className=\"mb-3 text-sm font-semibold text-slate-900 dark:text-white\">세부 정보</h3>\n <dl className=\"grid gap-4 sm:grid-cols-2\">\n {metadata.map((item) => (\n <div key={item.label} className=\"flex items-center gap-3\">\n {item.icon && (\n <span className=\"rounded-lg bg-slate-100 p-2 text-slate-500 dark:bg-slate-800/80\" aria-hidden=\"true\">\n <Icon name={item.icon} className=\"h-4 w-4\" />\n </span>\n )}\n <div>\n <dt className=\"text-xs uppercase text-slate-400\">{item.label}</dt>\n <dd className=\"text-sm text-slate-700 dark:text-slate-200\">{item.value}</dd>\n </div>\n </div>\n ))}\n </dl>\n </section>\n )}\n\n {settlement && (\n <section \n className=\"rounded-2xl border border-slate-100 dark:border-slate-800 bg-white dark:bg-slate-900/40 p-4\"\n aria-label=\"정산 정보\"\n role=\"region\"\n >\n <div className=\"mb-4 flex items-center justify-between\">\n <div>\n <h3 className=\"text-sm font-semibold text-slate-900 dark:text-white\">정산 정보</h3>\n {settlement.note && <p className=\"text-xs text-slate-500\">{settlement.note}</p>}\n </div>\n {settlement.status && (\n <span \n className={merge(\"rounded-full px-3 py-1 text-xs font-medium\", getSettlementBadge(settlement.status))}\n aria-label={`정산 상태: ${settlement.status}`}\n >\n {settlement.status}\n </span>\n )}\n </div>\n <dl className=\"grid gap-4 md:grid-cols-2\">\n <div>\n <dt className=\"text-xs uppercase text-slate-400\">정산 금액</dt>\n <dd className=\"text-sm text-slate-700 dark:text-slate-200\">\n {formatAmount(settlement.amount, settlement.currency ?? defaultCurrency, locale)}\n </dd>\n </div>\n <div>\n <dt className=\"text-xs uppercase text-slate-400\">예정일</dt>\n <dd className=\"text-sm text-slate-700 dark:text-slate-200\">\n {settlement.scheduledDate && (\n <time dateTime={settlement.scheduledDate instanceof Date ? settlement.scheduledDate.toISOString() : typeof settlement.scheduledDate === 'string' ? settlement.scheduledDate : undefined}>\n {formatDate(settlement.scheduledDate, locale)}\n </time>\n )}\n </dd>\n </div>\n {settlement.bankAccount && (\n <div>\n <dt className=\"text-xs uppercase text-slate-400\">계좌</dt>\n <dd className=\"text-sm text-slate-700 dark:text-slate-200\">{settlement.bankAccount}</dd>\n </div>\n )}\n {settlement.expectedPayout && (\n <div>\n <dt className=\"text-xs uppercase text-slate-400\">예상 지급</dt>\n <dd className=\"text-sm text-slate-700 dark:text-slate-200\">{settlement.expectedPayout}</dd>\n </div>\n )}\n </dl>\n </section>\n )}\n\n {fees.length > 0 && (\n <section \n className=\"rounded-2xl border border-slate-100 dark:border-slate-800 bg-white dark:bg-slate-900/40 p-4\"\n aria-label=\"수수료 내역\"\n role=\"region\"\n >\n <h3 className=\"mb-3 text-sm font-semibold text-slate-900 dark:text-white\">수수료</h3>\n <dl className=\"space-y-3\">\n {fees.map((fee) => (\n <div key={fee.label} className=\"flex items-center justify-between text-sm text-slate-700 dark:text-slate-200\">\n <div>\n <dt className=\"font-medium\">{fee.label}</dt>\n {fee.description && <dd className=\"text-xs text-slate-400\">{fee.description}</dd>}\n </div>\n <dd>{formatAmount(fee.amount, fee.currency ?? defaultCurrency, locale)}</dd>\n </div>\n ))}\n </dl>\n </section>\n )}\n\n <section \n className=\"rounded-2xl border border-slate-100 dark:border-slate-800 bg-white dark:bg-slate-900/40 p-4\"\n aria-label=\"이벤트 로그\"\n role=\"region\"\n >\n <h3 className=\"mb-4 text-sm font-semibold text-slate-900 dark:text-white\">이벤트 로그</h3>\n {events.length === 0 ? (\n emptyState ?? (\n <DashboardEmptyState\n icon=\"activity\"\n title=\"이벤트가 없습니다\"\n description=\"승인/정산 등 상태 변화가 발생하면 자동으로 표시됩니다.\"\n size=\"sm\"\n />\n )\n ) : (\n <ol className=\"space-y-3\" role=\"list\" aria-label=\"이벤트 목록\">\n {events.map((event) => (\n <li\n key={event.id}\n role=\"listitem\"\n className=\"flex items-start gap-3 rounded-xl border border-slate-100 dark:border-slate-800 p-3\"\n >\n <div className={merge(\"rounded-lg p-2\", getEventColor(event.status))} aria-hidden=\"true\">\n <Icon name={event.icon ?? \"activity\"} className=\"h-4 w-4\" />\n </div>\n <div className=\"flex-1\">\n <div className=\"flex items-center justify-between text-sm font-medium text-slate-900 dark:text-white\">\n <span>{event.title}</span>\n <time \n dateTime={event.timestamp instanceof Date ? event.timestamp.toISOString() : typeof event.timestamp === 'string' ? event.timestamp : undefined}\n className=\"text-xs text-slate-400\"\n >\n {formatDate(event.timestamp, locale)}\n </time>\n </div>\n {event.description && (\n <p className=\"text-xs text-slate-500 dark:text-slate-300\">{event.description}</p>\n )}\n {event.actor && (\n <p className=\"text-xs text-slate-400 mt-1\" aria-label={`실행자: ${event.actor}`}>\n by {event.actor}\n </p>\n )}\n </div>\n </li>\n ))}\n </ol>\n )}\n </section>\n </>\n )}\n </DrawerContent>\n\n {actions && <DrawerFooter>{actions}</DrawerFooter>}\n </Drawer>\n );\n};\n\nTransactionDetailDrawer.displayName = \"TransactionDetailDrawer\";\n\n","\"use client\";\n\nimport React from \"react\";\nimport { merge } from \"../../lib/utils\";\nimport { Icon } from \"../Icon\";\nimport type { IconName } from \"../../lib/icons\";\nimport { DashboardEmptyState } from \"./EmptyState\";\n\nexport type SettlementTimelineStatus = \"pending\" | \"processing\" | \"completed\" | \"failed\";\n\n/**\n * 정산 타임라인 아이템 인터페이스 / SettlementTimelineItem interface\n * @typedef {Object} SettlementTimelineItem\n * @property {string} id - 아이템 고유 ID / Item unique ID\n * @property {string} title - 제목 / Title\n * @property {string} [description] - 설명 / Description\n * @property {SettlementTimelineStatus} status - 상태 / Status\n * @property {number} [amount] - 금액 / Amount\n * @property {string} [currency] - 통화 / Currency\n * @property {string | Date} [date] - 날짜 / Date\n * @property {string} [meta] - 메타 정보 / Meta information\n * @property {IconName} [icon] - 아이콘 / Icon\n */\nexport interface SettlementTimelineItem {\n id: string;\n title: string;\n description?: string;\n status: SettlementTimelineStatus;\n amount?: number;\n currency?: string;\n date?: string | Date;\n meta?: string;\n icon?: IconName;\n}\n\n/**\n * SettlementTimeline 컴포넌트의 props / SettlementTimeline component props\n * @typedef {Object} SettlementTimelineProps\n * @property {SettlementTimelineItem[]} items - 타임라인 아이템 배열 / Timeline items array\n * @property {string} [highlightedId] - 강조할 아이템 ID / Highlighted item ID\n * @property {string} [locale=\"ko-KR\"] - 로케일 / Locale\n * @property {string} [defaultCurrency=\"KRW\"] - 기본 통화 / Default currency\n * @property {React.ReactNode} [emptyState] - 빈 상태 컴포넌트 / Empty state component\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface SettlementTimelineProps extends React.HTMLAttributes<HTMLDivElement> {\n items: SettlementTimelineItem[];\n highlightedId?: string;\n locale?: string;\n defaultCurrency?: string;\n emptyState?: React.ReactNode;\n}\n\nconst STATUS_CONFIG: Record<\n SettlementTimelineStatus,\n { dot: string; border: string; text: string; label: string }\n> = {\n completed: {\n dot: \"bg-emerald-500 border-emerald-500 shadow-[0_0_8px_rgba(16,185,129,0.5)]\",\n border: \"border-emerald-200 dark:border-emerald-500/40\",\n text: \"text-emerald-700 dark:text-emerald-300\",\n label: \"정산 완료\",\n },\n processing: {\n dot: \"bg-sky-500 border-sky-500 shadow-[0_0_8px_rgba(14,165,233,0.5)] animate-pulse\",\n border: \"border-sky-200 dark:border-sky-500/40\",\n text: \"text-sky-700 dark:text-sky-200\",\n label: \"처리 중\",\n },\n pending: {\n dot: \"bg-amber-400 border-amber-400\",\n border: \"border-amber-200 dark:border-amber-500/40\",\n text: \"text-amber-700 dark:text-amber-200\",\n label: \"대기\",\n },\n failed: {\n dot: \"bg-rose-500 border-rose-500\",\n border: \"border-rose-200 dark:border-rose-500/40\",\n text: \"text-rose-700 dark:text-rose-300\",\n label: \"실패\",\n },\n};\n\nconst formatAmount = (amount?: number, currency?: string, locale = \"ko-KR\") => {\n if (typeof amount !== \"number\") return undefined;\n const unit = currency ?? \"KRW\";\n try {\n return new Intl.NumberFormat(locale, {\n style: \"currency\",\n currency: unit,\n maximumFractionDigits: 2,\n }).format(amount);\n } catch {\n return `${amount.toLocaleString(locale)} ${unit}`;\n }\n};\n\nconst formatDate = (value?: string | Date, locale = \"ko-KR\") => {\n if (!value) return undefined;\n const parsed = value instanceof Date ? value : new Date(value);\n if (Number.isNaN(parsed.getTime())) return undefined;\n return parsed.toLocaleString(locale, { dateStyle: \"medium\", timeStyle: \"short\" });\n};\n\n/**\n * SettlementTimeline 컴포넌트\n * \n * 정산 처리 단계를 타임라인 형태로 표시하는 컴포넌트입니다.\n * 각 단계의 상태, 금액, 날짜를 시각적으로 표시합니다.\n * \n * Timeline component that displays settlement processing stages.\n * Visually shows status, amount, and date for each stage.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <SettlementTimeline\n * items={[\n * {\n * id: \"1\",\n * title: \"정산 요청\",\n * status: \"completed\",\n * amount: 1000000,\n * currency: \"KRW\",\n * date: new Date(\"2024-01-01\")\n * },\n * {\n * id: \"2\",\n * title: \"처리 중\",\n * status: \"processing\",\n * amount: 1000000,\n * currency: \"KRW\"\n * }\n * ]}\n * />\n * \n * @example\n * // 강조 기능 / Highlight feature\n * <SettlementTimeline\n * items={timelineItems}\n * highlightedId=\"2\"\n * locale=\"en-US\"\n * defaultCurrency=\"USD\"\n * />\n * \n * @param {SettlementTimelineProps} props - SettlementTimeline 컴포넌트의 props / SettlementTimeline component props\n * @returns {JSX.Element} SettlementTimeline 컴포넌트 / SettlementTimeline component\n */\nexport const SettlementTimeline: React.FC<SettlementTimelineProps> = ({\n items,\n highlightedId,\n locale = \"ko-KR\",\n defaultCurrency = \"KRW\",\n emptyState,\n className,\n ...props\n}) => {\n const hasItems = items.length > 0;\n\n return (\n <div\n className={merge(\n \"rounded-2xl border border-slate-100 dark:border-slate-800 bg-white dark:bg-slate-900/50 p-4\",\n className\n )}\n {...props}\n >\n <div className=\"mb-4 flex items-center justify-between\">\n <div>\n <p className=\"text-sm font-semibold text-slate-900 dark:text-white\">정산 타임라인</p>\n <p className=\"text-xs text-slate-500\">처리 단계별 상태와 금액을 확인하세요.</p>\n </div>\n </div>\n\n {!hasItems\n ? emptyState ?? (\n <DashboardEmptyState\n icon=\"calendar-clock\"\n title=\"정산 단계가 없습니다\"\n description=\"정산 요청이 생성되면 자동으로 단계가 채워집니다.\"\n size=\"sm\"\n />\n )\n : (\n <ol className=\"space-y-4\" role=\"list\" aria-label=\"정산 타임라인\">\n {items.map((item, index) => {\n const statusConfig = STATUS_CONFIG[item.status];\n const amount = formatAmount(item.amount, item.currency ?? defaultCurrency, locale);\n const date = formatDate(item.date, locale);\n const isHighlighted = highlightedId === item.id;\n const showConnector = index !== items.length - 1;\n\n const itemLabel = `${item.title}, 상태: ${statusConfig.label}${amount ? `, 금액: ${amount}` : ''}${date ? `, 날짜: ${date}` : ''}`;\n\n return (\n <li \n key={item.id} \n role=\"listitem\"\n aria-label={itemLabel}\n className=\"relative flex gap-4\"\n >\n <div className=\"flex flex-col items-center\">\n <span\n className={merge(\n \"z-10 h-3.5 w-3.5 rounded-full border-2 bg-white shadow\",\n statusConfig.dot,\n isHighlighted && \"scale-110\"\n )}\n aria-label={`${statusConfig.label} 상태`}\n />\n {showConnector && (\n <span className=\"mt-1 flex-1 w-px bg-slate-200 dark:bg-slate-700\" aria-hidden=\"true\" />\n )}\n </div>\n\n <div\n className={merge(\n \"flex-1 rounded-xl border p-4\",\n statusConfig.border,\n isHighlighted && \"border-2 shadow-sm\"\n )}\n >\n <div className=\"flex flex-wrap items-center gap-2\">\n <span className=\"text-sm font-semibold text-slate-900 dark:text-white\">{item.title}</span>\n <span className={merge(\"text-xs font-medium rounded-full px-2 py-0.5\", statusConfig.text)}>\n {statusConfig.label}\n </span>\n {item.meta && (\n <span className=\"text-xs text-slate-500 dark:text-slate-300\">{item.meta}</span>\n )}\n </div>\n {item.description && (\n <p className=\"mt-1 text-sm text-slate-600 dark:text-slate-300\">{item.description}</p>\n )}\n <div className=\"mt-3 flex flex-wrap gap-4 text-xs text-slate-500 dark:text-slate-300\">\n {amount && (\n <div className=\"flex items-center gap-1 text-sm text-slate-700 dark:text-slate-100\">\n <Icon name=\"wallet\" className=\"h-3.5 w-3.5 text-slate-400\" />\n {amount}\n </div>\n )}\n {date && (\n <div className=\"flex items-center gap-1\">\n <Icon name=\"clock\" className=\"h-3.5 w-3.5 text-slate-400\" aria-hidden={true} />\n <time dateTime={item.date instanceof Date ? item.date.toISOString() : typeof item.date === 'string' ? item.date : undefined}>\n {date}\n </time>\n </div>\n )}\n </div>\n </div>\n </li>\n );\n })}\n </ol>\n )}\n </div>\n );\n};\n\nSettlementTimeline.displayName = \"SettlementTimeline\";\n\n","\"use client\";\n\nimport React from \"react\";\nimport { merge } from \"../../lib/utils\";\nimport { DashboardEmptyState } from \"./EmptyState\";\nimport { Icon } from \"../Icon\";\nimport type { IconName } from \"../../lib/icons\";\n\ntype RoutingStatus = \"normal\" | \"warning\" | \"critical\";\n\n/**\n * 라우팅 분할 세그먼트 인터페이스 / RoutingBreakdownSegment interface\n * @typedef {Object} RoutingBreakdownSegment\n * @property {string} id - 세그먼트 고유 ID / Segment unique ID\n * @property {string} label - 세그먼트 라벨 / Segment label\n * @property {number} value - 세그먼트 값 / Segment value\n * @property {string} [color] - 커스텀 색상 / Custom color\n * @property {RoutingStatus} [status] - 상태 / Status\n * @property {string} [icon] - 아이콘 이름 / Icon name\n * @property {string} [detail] - 상세 정보 / Detail information\n */\nexport interface RoutingBreakdownSegment {\n id: string;\n label: string;\n value: number;\n color?: string;\n status?: RoutingStatus;\n icon?: string;\n detail?: string;\n}\n\n/**\n * RoutingBreakdownCard 컴포넌트의 props / RoutingBreakdownCard component props\n * @typedef {Object} RoutingBreakdownCardProps\n * @property {string} [title=\"PG / 결제수단 비중\"] - 카드 제목 / Card title\n * @property {string} [description=\"라우팅별 처리 비율과 상태\"] - 카드 설명 / Card description\n * @property {RoutingBreakdownSegment[]} segments - 세그먼트 배열 / Segments array\n * @property {string} [totalLabel=\"총 거래\"] - 총계 라벨 / Total label\n * @property {React.ReactNode} [totalValue] - 총계 값 / Total value\n * @property {string} [highlightId] - 강조할 세그먼트 ID / Highlighted segment ID\n * @property {React.ReactNode} [actions] - 액션 컴포넌트 / Actions component\n * @property {React.ReactNode} [emptyState] - 빈 상태 컴포넌트 / Empty state component\n * @property {(segment: RoutingBreakdownSegment, percentage: number) => React.ReactNode} [formatter] - 커스텀 포맷터 / Custom formatter\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface RoutingBreakdownCardProps extends React.HTMLAttributes<HTMLDivElement> {\n title?: string;\n description?: string;\n segments: RoutingBreakdownSegment[];\n totalLabel?: string;\n totalValue?: React.ReactNode;\n highlightId?: string;\n actions?: React.ReactNode;\n emptyState?: React.ReactNode;\n formatter?: (segment: RoutingBreakdownSegment, percentage: number) => React.ReactNode;\n}\n\nconst DEFAULT_COLORS = [\"#0ea5e9\", \"#6366f1\", \"#22c55e\", \"#f97316\", \"#a855f7\", \"#ef4444\"];\n\nconst STATUS_BADGES: Record<RoutingStatus, string> = {\n normal: \"bg-emerald-50 text-emerald-700 dark:bg-emerald-500/20 dark:text-emerald-100\",\n warning: \"bg-amber-50 text-amber-700 dark:bg-amber-500/20 dark:text-amber-100\",\n critical: \"bg-rose-50 text-rose-700 dark:bg-rose-500/20 dark:text-rose-100\",\n};\n\nconst formatPercentage = (value: number, total: number) => {\n if (total <= 0) return \"0%\";\n return `${Math.round((value / total) * 1000) / 10}%`;\n};\n\n/**\n * RoutingBreakdownCard 컴포넌트\n * \n * PG 라우팅 또는 결제수단별 비중을 표시하는 카드 컴포넌트입니다.\n * 진행 바와 세그먼트별 상세 정보를 제공합니다.\n * \n * Card component that displays PG routing or payment method breakdown.\n * Provides progress bar and detailed information for each segment.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <RoutingBreakdownCard\n * title=\"PG 라우팅 비중\"\n * segments={[\n * { id: \"pg1\", label: \"PG A\", value: 5000, status: \"normal\" },\n * { id: \"pg2\", label: \"PG B\", value: 3000, status: \"warning\" },\n * { id: \"pg3\", label: \"PG C\", value: 2000, status: \"normal\" }\n * ]}\n * totalValue=\"10,000\"\n * />\n * \n * @example\n * // 강조 기능 / Highlight feature\n * <RoutingBreakdownCard\n * segments={segments}\n * highlightId=\"pg1\"\n * formatter={(segment, percentage) => (\n * <div>\n * <span>{segment.value.toLocaleString()}</span>\n * <span>{percentage}%</span>\n * </div>\n * )}\n * />\n * \n * @param {RoutingBreakdownCardProps} props - RoutingBreakdownCard 컴포넌트의 props / RoutingBreakdownCard component props\n * @returns {JSX.Element} RoutingBreakdownCard 컴포넌트 / RoutingBreakdownCard component\n */\nexport const RoutingBreakdownCard: React.FC<RoutingBreakdownCardProps> = ({\n title = \"PG / 결제수단 비중\",\n description = \"라우팅별 처리 비율과 상태\",\n segments,\n totalLabel = \"총 거래\",\n totalValue,\n highlightId,\n actions,\n emptyState,\n formatter,\n className,\n ...props\n}) => {\n const hasSegments = segments.length > 0;\n const total = segments.reduce((sum, segment) => sum + segment.value, 0);\n\n return (\n <div\n className={merge(\n \"rounded-2xl border border-slate-100 dark:border-slate-800 bg-white dark:bg-slate-900/60 p-5\",\n className\n )}\n {...props}\n >\n <div className=\"flex flex-wrap items-center justify-between gap-3\">\n <div>\n <p className=\"text-sm font-semibold text-slate-900 dark:text-white\">{title}</p>\n <p className=\"text-xs text-slate-500\">{description}</p>\n </div>\n {actions && <div className=\"text-xs text-slate-500\">{actions}</div>}\n </div>\n\n {!hasSegments ? (\n emptyState ?? (\n <DashboardEmptyState\n icon=\"pie-chart\"\n title=\"라우팅 데이터가 없습니다\"\n description=\"PG 라우팅 혹은 결제수단 정보가 수집되면 자동으로 표시됩니다.\"\n size=\"sm\"\n className=\"mt-4\"\n />\n )\n ) : (\n <>\n <div className=\"mt-4\">\n <div className=\"flex h-3 overflow-hidden rounded-full bg-slate-100 dark:bg-slate-800\">\n {segments.map((segment, index) => {\n const width = total === 0 ? 0 : (segment.value / total) * 100;\n const color = segment.color ?? DEFAULT_COLORS[index % DEFAULT_COLORS.length];\n return (\n <div\n key={segment.id}\n className=\"h-full transition-all\"\n style={{\n width: `${width}%`,\n backgroundColor: color,\n opacity: highlightId && highlightId !== segment.id ? 0.4 : 1,\n }}\n aria-label={`${segment.label} ${formatPercentage(segment.value, total)}`}\n />\n );\n })}\n </div>\n <div className=\"mt-2 text-xs text-slate-500\">\n {totalLabel}: {totalValue ?? total.toLocaleString()}\n </div>\n </div>\n\n <div className=\"mt-4 space-y-3\">\n {segments.map((segment, index) => {\n const color = segment.color ?? DEFAULT_COLORS[index % DEFAULT_COLORS.length];\n const percentage = total === 0 ? 0 : (segment.value / total) * 100;\n const badgeClass = segment.status ? STATUS_BADGES[segment.status] : null;\n const customContent = formatter?.(segment, percentage);\n\n return (\n <div\n key={segment.id}\n className={merge(\n \"flex flex-wrap items-center gap-3 rounded-xl border border-slate-100 dark:border-slate-800 p-3 transition hover:border-slate-200 dark:hover:border-slate-700\",\n highlightId === segment.id && \"border-2 border-slate-200 dark:border-slate-600\"\n )}\n >\n <div className=\"flex items-center gap-2 min-w-[3rem]\">\n {segment.icon && (\n <span className=\"rounded-lg bg-slate-100 dark:bg-slate-800 p-1.5 text-slate-500\">\n <Icon name={segment.icon as IconName} className=\"h-4 w-4\" />\n </span>\n )}\n <div\n className=\"h-2 w-12 rounded-full\"\n style={{ backgroundColor: color }}\n aria-hidden=\"true\"\n />\n </div>\n <div className=\"flex-1\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <span className=\"text-sm font-medium text-slate-900 dark:text-white\">{segment.label}</span>\n {badgeClass && (\n <span className={merge(\"rounded-full px-2 py-0.5 text-[11px] font-medium\", badgeClass)}>\n {segment.status === \"critical\"\n ? \"장애\"\n : segment.status === \"warning\"\n ? \"감시\"\n : \"정상\"}\n </span>\n )}\n </div>\n <div className=\"text-xs text-slate-500 dark:text-slate-300\">\n {segment.detail}\n </div>\n </div>\n {customContent ?? (\n <div className=\"text-right text-sm text-slate-700 dark:text-slate-100\">\n <div className=\"font-semibold\">{segment.value.toLocaleString()}</div>\n <div className=\"text-xs text-slate-500\">{formatPercentage(segment.value, total)}</div>\n </div>\n )}\n </div>\n );\n })}\n </div>\n </>\n )}\n </div>\n );\n};\n\nRoutingBreakdownCard.displayName = \"RoutingBreakdownCard\";\n\n","\"use client\";\n\nimport React from \"react\";\nimport { merge } from \"../../lib/utils\";\nimport { Badge } from \"../Badge\";\nimport { Icon } from \"../Icon\";\nimport type { IconName } from \"../../lib/icons\";\nimport { DashboardEmptyState } from \"./EmptyState\";\nimport { Skeleton } from \"../Skeleton\";\n\nexport type MerchantHealth = \"normal\" | \"warning\" | \"critical\";\n\n/**\n * 가맹점 리스트 아이템 인터페이스 / MerchantListItem interface\n * @typedef {Object} MerchantListItem\n * @property {string} id - 가맹점 고유 ID / Merchant unique ID\n * @property {string} name - 가맹점 이름 / Merchant name\n * @property {string} [status] - 상태 / Status\n * @property {MerchantHealth} [health] - 건강 상태 / Health status\n * @property {number} [approvalRate] - 승인률 (0-1) / Approval rate (0-1)\n * @property {number} [volume] - 거래량 / Transaction volume\n * @property {string} [currency] - 통화 / Currency\n * @property {string} [category] - 카테고리 / Category\n * @property {string} [region] - 지역 / Region\n * @property {string | Date} [updatedAt] - 업데이트 시간 / Updated time\n * @property {string} [tag] - 태그 / Tag\n * @property {IconName | React.ReactNode} [icon] - 아이콘 / Icon\n * @property {Array<{ label: string; value: React.ReactNode }>} [metadata] - 메타데이터 / Metadata\n */\nexport interface MerchantListItem {\n id: string;\n name: string;\n status?: string;\n health?: MerchantHealth;\n approvalRate?: number;\n volume?: number;\n currency?: string;\n category?: string;\n region?: string;\n updatedAt?: string | Date;\n tag?: string;\n icon?: IconName | React.ReactNode;\n metadata?: Array<{ label: string; value: React.ReactNode }>;\n}\n\n/**\n * MerchantList 컴포넌트의 props / MerchantList component props\n * @typedef {Object} MerchantListProps\n * @property {MerchantListItem[]} items - 가맹점 아이템 배열 / Merchant items array\n * @property {boolean} [isLoading=false] - 로딩 상태 / Loading state\n * @property {React.ReactNode} [filters] - 필터 컴포넌트 / Filter component\n * @property {React.ReactNode} [emptyState] - 빈 상태 컴포넌트 / Empty state component\n * @property {(merchant: MerchantListItem) => void} [onMerchantSelect] - 가맹점 선택 핸들러 / Merchant selection handler\n * @property {string} [locale=\"ko-KR\"] - 로케일 / Locale\n * @property {string} [defaultCurrency=\"KRW\"] - 기본 통화 / Default currency\n * @extends {Omit<React.HTMLAttributes<HTMLDivElement>, \"onSelect\">}\n */\nexport interface MerchantListProps extends Omit<React.HTMLAttributes<HTMLDivElement>, \"onSelect\"> {\n items: MerchantListItem[];\n isLoading?: boolean;\n filters?: React.ReactNode;\n emptyState?: React.ReactNode;\n onMerchantSelect?: (merchant: MerchantListItem) => void;\n locale?: string;\n defaultCurrency?: string;\n}\n\nconst HEALTH_BADGES: Record<MerchantHealth, string> = {\n normal: \"bg-emerald-50 text-emerald-700 dark:bg-emerald-500/20 dark:text-emerald-100\",\n warning: \"bg-amber-50 text-amber-700 dark:bg-amber-500/20 dark:text-amber-100\",\n critical: \"bg-rose-50 text-rose-700 dark:bg-rose-500/20 dark:text-rose-100\",\n};\n\nconst formatPercent = (value?: number) => {\n if (typeof value !== \"number\") return undefined;\n return `${(Math.round(value * 10) / 10).toFixed(1)}%`;\n};\n\nconst formatVolume = (value?: number, currency?: string, locale = \"ko-KR\") => {\n if (typeof value !== \"number\") return undefined;\n const unit = currency ?? \"KRW\";\n try {\n return new Intl.NumberFormat(locale, {\n style: \"currency\",\n currency: unit,\n maximumFractionDigits: 0,\n }).format(value);\n } catch {\n return `${value.toLocaleString(locale)} ${unit}`;\n }\n};\n\n/**\n * MerchantList 컴포넌트\n * \n * 가맹점 목록을 표시하는 컴포넌트입니다.\n * 가맹점 정보, 건강 상태, 승인률, 거래량 등을 카드 형태로 표시합니다.\n * \n * Component that displays a list of merchants.\n * Shows merchant information, health status, approval rate, and transaction volume in card format.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <MerchantList\n * items={[\n * {\n * id: \"1\",\n * name: \"가맹점 A\",\n * health: \"normal\",\n * approvalRate: 0.985,\n * volume: 1000000,\n * currency: \"KRW\"\n * }\n * ]}\n * onMerchantSelect={(merchant) => console.log(merchant)}\n * />\n * \n * @example\n * // 로딩 상태 / Loading state\n * <MerchantList\n * items={merchants}\n * isLoading={true}\n * filters={<FilterComponent />}\n * />\n * \n * @param {MerchantListProps} props - MerchantList 컴포넌트의 props / MerchantList component props\n * @returns {JSX.Element} MerchantList 컴포넌트 / MerchantList component\n */\nexport const MerchantList: React.FC<MerchantListProps> = ({\n items,\n isLoading = false,\n filters,\n emptyState,\n onMerchantSelect,\n locale = \"ko-KR\",\n defaultCurrency = \"KRW\",\n className,\n ...props\n}) => {\n const hasItems = items.length > 0;\n\n return (\n <div\n className={merge(\n \"rounded-2xl border border-slate-100 dark:border-slate-800 bg-white dark:bg-slate-900/50\",\n className\n )}\n {...props}\n >\n {filters && (\n <div className=\"border-b border-slate-100 dark:border-slate-800 px-4 py-3 md:px-6\">{filters}</div>\n )}\n\n <div className=\"p-4 md:p-6\">\n {isLoading ? (\n <div className=\"space-y-3\">\n {[...Array(3)].map((_, idx) => (\n <Skeleton key={idx} className=\"h-20 rounded-2xl\" />\n ))}\n </div>\n ) : !hasItems ? (\n emptyState ?? (\n <DashboardEmptyState\n icon=\"store\"\n title=\"가맹점이 없습니다\"\n description=\"검색어를 변경하거나 새로운 가맹점을 온보딩하세요.\"\n size=\"sm\"\n className=\"py-6\"\n />\n )\n ) : (\n <div className=\"space-y-3\" role=\"list\" aria-label=\"가맹점 목록\">\n {items.map((merchant) => {\n const approval = formatPercent(merchant.approvalRate);\n const volume = formatVolume(merchant.volume, merchant.currency ?? defaultCurrency, locale);\n const badgeClass = merchant.health ? HEALTH_BADGES[merchant.health] : undefined;\n\n const merchantLabel = `${merchant.name}${merchant.status ? `, 상태: ${merchant.status}` : ''}${merchant.health ? `, 건강 상태: ${merchant.health === \"critical\" ? \"위험\" : merchant.health === \"warning\" ? \"감시\" : \"정상\"}` : ''}${volume ? `, 거래량: ${volume}` : ''}${approval ? `, 승인률: ${approval}` : ''}`;\n\n return (\n <button\n key={merchant.id}\n type=\"button\"\n role=\"button\"\n onClick={onMerchantSelect ? () => onMerchantSelect(merchant) : undefined}\n disabled={!onMerchantSelect}\n aria-label={onMerchantSelect ? `${merchantLabel} - 클릭하여 상세 정보 보기` : merchantLabel}\n className={merge(\n \"w-full rounded-2xl border border-slate-100 dark:border-slate-800 bg-white/90 dark:bg-slate-900/60 p-4 text-left shadow-sm transition hover:border-slate-200 dark:hover:border-slate-700 focus:outline-none focus-visible:ring-2 focus-visible:ring-blue-500/70\",\n onMerchantSelect ? \"cursor-pointer\" : \"cursor-default opacity-60\"\n )}\n >\n <div className=\"flex flex-wrap items-center gap-3\">\n {merchant.icon && (\n <div className=\"rounded-xl bg-slate-100 dark:bg-slate-800 p-2 text-slate-500\">\n {typeof merchant.icon === \"string\" ? (\n <Icon name={merchant.icon as IconName} className=\"h-5 w-5\" />\n ) : (\n merchant.icon\n )}\n </div>\n )}\n <div className=\"flex-1\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <p className=\"text-sm font-semibold text-slate-900 dark:text-white\">{merchant.name}</p>\n {merchant.status && (\n <Badge className=\"bg-slate-100 text-slate-600 dark:bg-slate-800 dark:text-slate-100\">\n {merchant.status}\n </Badge>\n )}\n {merchant.tag && (\n <span className=\"rounded-full bg-slate-50 px-2 py-0.5 text-[11px] text-slate-500 dark:bg-slate-800/80\">\n {merchant.tag}\n </span>\n )}\n {badgeClass && (\n <span className={merge(\"rounded-full px-2 py-0.5 text-[11px] font-medium\", badgeClass)}>\n {merchant.health === \"critical\"\n ? \"위험\"\n : merchant.health === \"warning\"\n ? \"감시\"\n : \"정상\"}\n </span>\n )}\n </div>\n <div className=\"text-xs text-slate-500 dark:text-slate-300\">\n {merchant.category ?? \"카테고리 미정\"} · {merchant.region ?? \"지역 정보 없음\"}\n </div>\n </div>\n <div className=\"text-right text-sm text-slate-900 dark:text-white\">\n {volume && <div className=\"font-semibold\">{volume}</div>}\n {approval && <div className=\"text-xs text-slate-500\">승인률 {approval}</div>}\n </div>\n </div>\n\n {merchant.metadata && merchant.metadata.length > 0 && (\n <div className=\"mt-3 grid gap-3 text-xs text-slate-500 dark:text-slate-300 sm:grid-cols-2\">\n {merchant.metadata.map((meta) => (\n <div key={meta.label} className=\"flex items-center gap-2\">\n <span className=\"text-slate-400\">{meta.label}</span>\n <span className=\"text-slate-700 dark:text-slate-100\">{meta.value}</span>\n </div>\n ))}\n </div>\n )}\n </button>\n );\n })}\n </div>\n )}\n </div>\n </div>\n );\n};\n\nMerchantList.displayName = \"MerchantList\";\n\n","\"use client\";\n\nimport React from \"react\";\nimport { merge } from \"../lib/utils\";\n\n/**\n * StatsPanelItem 인터페이스 / StatsPanelItem interface\n * @typedef {Object} StatsPanelItem\n * @property {string} label - 통계 항목 라벨 / Stat item label\n * @property {string | React.ReactNode} value - 통계 값 / Stat value\n * @property {string | React.ReactNode} [description] - 통계 설명 / Stat description\n * @property {\"up\" | \"down\" | \"neutral\"} [trend] - 추세 방향 / Trend direction\n * @property {string} [trendValue] - 추세 값 / Trend value\n * @property {\"primary\" | \"secondary\" | \"neutral\" | \"warning\"} [accent] - 강조 색상 / Accent color\n * @property {React.ReactNode} [icon] - 아이콘 / Icon\n */\nexport interface StatsPanelItem {\n label: string;\n value: string | React.ReactNode;\n description?: string | React.ReactNode;\n trend?: \"up\" | \"down\" | \"neutral\";\n trendValue?: string;\n accent?: \"primary\" | \"secondary\" | \"neutral\" | \"warning\";\n icon?: React.ReactNode;\n}\n\n/**\n * StatsPanel 컴포넌트의 props / StatsPanel component props\n * @typedef {Object} StatsPanelProps\n * @property {string} [title] - 패널 제목 / Panel title\n * @property {StatsPanelItem[]} items - 통계 항목 배열 / Stat items array\n * @property {1 | 2 | 3 | 4} [columns=4] - 그리드 컬럼 수 / Grid column count\n * @property {boolean} [loading=false] - 로딩 상태 / Loading state\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface StatsPanelProps extends React.HTMLAttributes<HTMLDivElement> {\n title?: string;\n items: StatsPanelItem[];\n columns?: 1 | 2 | 3 | 4;\n loading?: boolean;\n}\n\n/**\n * StatsPanel 컴포넌트 / StatsPanel component\n * \n * 통계 정보를 표시하는 패널 컴포넌트입니다.\n * 여러 통계 항목을 그리드 형태로 표시하며, 추세 정보를 포함할 수 있습니다.\n * \n * Panel component that displays statistics.\n * Shows multiple stat items in grid format and can include trend information.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <StatsPanel\n * items={[\n * { label: \"총 사용자\", value: \"1,234\", trend: \"up\", trendValue: \"+12%\" },\n * { label: \"활성 사용자\", value: \"567\", trend: \"down\", trendValue: \"-5%\" }\n * ]}\n * />\n * \n * @example\n * // 2열 그리드, 제목 포함 / 2-column grid with title\n * <StatsPanel\n * title=\"통계\"\n * columns={2}\n * items={[\n * { label: \"항목 1\", value: \"100\", accent: \"primary\" },\n * { label: \"항목 2\", value: \"200\", accent: \"secondary\" }\n * ]}\n * />\n * \n * @param {StatsPanelProps} props - StatsPanel 컴포넌트의 props / StatsPanel component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} StatsPanel 컴포넌트 / StatsPanel component\n */\nexport const StatsPanel = React.forwardRef<HTMLDivElement, StatsPanelProps>(\n (\n {\n title,\n items,\n columns = 4,\n loading = false,\n className,\n ...props\n },\n ref\n ) => {\n const baseCardClass =\n \"rounded-2xl border border-[var(--border-subtle)] bg-[var(--surface)] text-[var(--text-strong)] shadow-sm transition-colors\";\n\n const accentStyles: Record<\n NonNullable<StatsPanelItem[\"accent\"]>,\n {\n card: string;\n label: string;\n value: string;\n icon: string;\n iconWrapper: string;\n }\n > = {\n primary: {\n card: `${baseCardClass} ring-1 ring-[rgba(0,82,204,0.18)] dark:ring-[rgba(59,130,246,0.28)] bg-gradient-to-br from-[rgba(0,82,204,0.08)] via-transparent to-transparent dark:from-[rgba(59,130,246,0.18)]`,\n label: \"text-[var(--brand-primary)]\",\n value: \"text-[var(--text-strong)]\",\n icon: \"text-[var(--brand-primary)]\",\n iconWrapper: \"bg-[rgba(0,82,204,0.12)] dark:bg-[rgba(59,130,246,0.25)]\",\n },\n secondary: {\n card: `${baseCardClass} ring-1 ring-[rgba(11,122,91,0.18)] dark:ring-[rgba(52,211,153,0.25)] bg-gradient-to-br from-[rgba(0,200,151,0.08)] via-transparent to-transparent dark:from-[rgba(52,211,153,0.16)]`,\n label: \"text-[var(--brand-secondary)]\",\n value: \"text-[var(--text-strong)]\",\n icon: \"text-[var(--brand-secondary)]\",\n iconWrapper: \"bg-[rgba(0,200,151,0.12)] dark:bg-[rgba(52,211,153,0.22)]\",\n },\n warning: {\n card: `${baseCardClass} ring-1 ring-[rgba(245,158,11,0.2)] dark:ring-[rgba(251,191,36,0.32)] bg-gradient-to-br from-[rgba(245,158,11,0.1)] via-transparent to-transparent dark:from-[rgba(251,191,36,0.2)]`,\n label: \"text-amber-600\",\n value: \"text-[var(--text-strong)]\",\n icon: \"text-amber-600\",\n iconWrapper: \"bg-[rgba(245,158,11,0.15)] dark:bg-[rgba(251,191,36,0.25)]\",\n },\n neutral: {\n card: baseCardClass,\n label: \"text-[var(--text-muted)]\",\n value: \"text-[var(--text-strong)]\",\n icon: \"text-[var(--text-muted)]\",\n iconWrapper: \"bg-[var(--surface-muted)]\",\n },\n };\n\n const gridCols = {\n 1: \"grid-cols-1\",\n 2: \"grid-cols-1 lg:grid-cols-2\",\n 3: \"grid-cols-1 lg:grid-cols-2 xl:grid-cols-3\",\n 4: \"grid-cols-1 lg:grid-cols-2 xl:grid-cols-4\",\n }[columns];\n\n return (\n <div\n ref={ref}\n className={merge(\"w-full\", className)}\n {...props}\n >\n {title && (\n <h2 className=\"mb-4 text-lg font-semibold text-gray-900 dark:text-slate-50\">\n {title}\n </h2>\n )}\n <div\n className={merge(\"grid gap-5\", gridCols)}\n >\n {loading ? (\n Array.from({ length: columns }).map((_, i) => (\n <div\n key={i}\n className=\"animate-pulse rounded-2xl border border-[var(--border-subtle)] bg-[var(--surface)] p-6\"\n >\n <div className=\"mb-2 h-4 w-20 rounded bg-[var(--surface-muted)]/80\" />\n <div className=\"mb-1 h-8 w-24 rounded bg-[var(--surface-muted)]/80\" />\n <div className=\"h-3 w-32 rounded bg-[var(--surface-muted)]/80\" />\n </div>\n ))\n ) : (\n items.map((item, index) => (\n <div\n key={index}\n className={merge(\n \"rounded-xl transition-all duration-200 p-6\",\n accentStyles[item.accent ?? \"neutral\"].card\n )}\n >\n <div className=\"mb-3 flex items-start justify-between gap-4\">\n <div\n className={merge(\n \"text-sm font-medium\",\n accentStyles[item.accent ?? \"neutral\"].label\n )}\n >\n {item.label}\n </div>\n {item.icon && (\n <div\n className={merge(\n \"inline-flex h-10 w-10 items-center justify-center rounded-xl text-base font-semibold\",\n accentStyles[item.accent ?? \"neutral\"].iconWrapper,\n accentStyles[item.accent ?? \"neutral\"].icon\n )}\n >\n {item.icon}\n </div>\n )}\n </div>\n <div\n className={merge(\n \"text-2xl font-semibold leading-tight mb-2\",\n accentStyles[item.accent ?? \"neutral\"].value\n )}\n >\n {item.value}\n </div>\n {item.description && (\n <div className=\"mt-1 text-xs text-gray-500 dark:text-slate-400\">\n {item.description}\n </div>\n )}\n {item.trend && item.trendValue && (\n <div\n className={merge(\n \"mt-2 flex items-center gap-1 text-xs\",\n item.trend === \"up\"\n ? \"text-green-600 dark:text-green-400\"\n : item.trend === \"down\"\n ? \"text-red-600 dark:text-red-400\"\n : \"text-gray-500 dark:text-slate-400\"\n )}\n >\n {item.trend === \"up\" && \"↑\"}\n {item.trend === \"down\" && \"↓\"}\n {item.trendValue}\n </div>\n )}\n </div>\n ))\n )}\n </div>\n </div>\n );\n }\n);\n\nStatsPanel.displayName = \"StatsPanel\";\n\n","\"use client\";\n\nimport React from \"react\";\nimport { merge } from \"../lib/utils\";\n\n/**\n * SectionHeader 컴포넌트의 props / SectionHeader component props\n * @typedef {Object} SectionHeaderProps\n * @property {string} title - 섹션 제목 / Section title\n * @property {string} [description] - 섹션 설명 / Section description\n * @property {React.ReactNode} [action] - 액션 버튼 또는 요소 / Action button or element\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface SectionHeaderProps extends React.HTMLAttributes<HTMLDivElement> {\n title: string;\n description?: string;\n action?: React.ReactNode;\n}\n\n/**\n * SectionHeader 컴포넌트 / SectionHeader component\n * \n * 섹션의 헤더를 표시하는 컴포넌트입니다.\n * 제목, 설명, 액션 버튼을 포함할 수 있습니다.\n * \n * Component that displays section header.\n * Can include title, description, and action button.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <SectionHeader title=\"섹션 제목\" />\n * \n * @example\n * // 설명과 액션 포함 / With description and action\n * <SectionHeader\n * title=\"알림\"\n * description=\"최근 알림 목록\"\n * action={<Button>모두 읽음</Button>}\n * />\n * \n * @param {SectionHeaderProps} props - SectionHeader 컴포넌트의 props / SectionHeader component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} SectionHeader 컴포넌트 / SectionHeader component\n */\nexport const SectionHeader = React.forwardRef<HTMLDivElement, SectionHeaderProps>(\n (\n {\n title,\n description,\n action,\n className,\n ...props\n },\n ref\n ) => {\n return (\n <div\n ref={ref}\n className={merge(\n \"flex items-center justify-between border-b border-gray-100 bg-transparent px-6 py-4 text-gray-900 dark:border-slate-800 dark:text-slate-50\",\n className\n )}\n {...props}\n >\n <div className=\"flex-1\">\n <h3 className=\"text-base font-semibold text-inherit\">\n {title}\n </h3>\n {description && (\n <p className=\"mt-1 text-sm text-gray-500 dark:text-slate-400\">\n {description}\n </p>\n )}\n </div>\n {action && (\n <div className=\"flex-shrink-0 ml-4\">\n {action}\n </div>\n )}\n </div>\n );\n }\n);\n\nSectionHeader.displayName = \"SectionHeader\";\n\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/lib/utils.ts","../src/lib/icons.ts","../src/lib/icon-providers.ts","../src/lib/icon-aliases.ts","../src/components/Icon/icon-store.ts","../src/components/Icon/IconProvider.tsx","../src/components/Icon/Icon.tsx","../src/lib/styles/colors.ts","../src/lib/styles/variants.ts","../src/components/dashboard/StatCard.tsx","../src/components/dashboard/QuickActionCard.tsx","../src/components/dashboard/DashboardGrid.tsx","../src/components/dashboard/ActivityFeed.tsx","../src/components/dashboard/ProfileCard.tsx","../src/components/dashboard/MembershipBadge.tsx","../src/components/dashboard/MiniBarChart.tsx","../src/components/dashboard/SummaryCard.tsx","../src/components/dashboard/NotificationCard.tsx","../src/components/dashboard/MetricCard.tsx","../src/components/dashboard/ProgressCard.tsx","../src/components/dashboard/EmptyState.tsx","../src/components/Tooltip.tsx","../src/components/dashboard/DashboardSidebar.tsx","../src/components/Table.tsx","../src/components/Badge.tsx","../src/components/Skeleton.tsx","../src/components/dashboard/TransactionsTable.tsx","../src/components/Button.tsx","../src/components/Dropdown.tsx","../src/components/dashboard/DashboardToolbar.tsx","../src/components/dashboard/TrendChart.tsx","../src/components/Drawer.tsx","../src/components/dashboard/TransactionDetailDrawer.tsx","../src/components/dashboard/SettlementTimeline.tsx","../src/components/dashboard/RoutingBreakdownCard.tsx","../src/components/dashboard/MerchantList.tsx","../src/components/StatsPanel.tsx","../src/components/SectionHeader.tsx"],"names":["merge","inputs","twMerge","clsx","formatRelativeTime","timestamp","locale","date","diff","minutes","hours","days","mergeMap","classMap","classes","condition","className","icons","Home","ArrowLeft","ArrowRight","ArrowUp","ArrowDown","Menu","X","Search","Settings","ExternalLink","ChevronLeft","ChevronRight","ChevronDown","ChevronUp","Edit","Trash2","Plus","Minus","Download","Upload","RefreshCw","Save","Copy","Loader2","CheckCircle","XCircle","AlertCircle","Info","Check","Circle","HelpCircle","User","Users","UserPlus","LogIn","LogOut","Eye","EyeOff","BarChart3","TrendingUp","Activity","Database","Zap","FileText","File","Folder","Book","BookOpen","Mail","MessageCircle","Phone","Image","Video","Camera","Smile","Frown","Meh","Lock","Unlock","Shield","Wallet","Key","Clock","Calendar","CalendarPlus","Bell","Heart","Star","Bookmark","Share","Monitor","Sun","Moon","Lightbulb","Brain","Flag","Square","emotionIcons","statusIcons","PhosphorIcons","PROJECT_ICONS","initPhosphorIcons","getIconFromProvider","iconName","provider","iconMapping","getIconDirect","mappedName","LucideIcons","lucideName","camelCaseName","match","p1","phosphorName1","phosphorName2","word","ICON_ALIASES","resolveIconAlias","defaultIconConfig","IconContext","createContext","useIconContext","useContext","IconComponent","React","name","size","emotion","status","weight","animated","pulse","spin","bounce","variant","ariaLabel","ariaHidden","ref","_a","config","iconSet","iconSize","iconWeight","iconColor","iconStrokeWidth","isClient","setIsClient","phosphorReady","setPhosphorReady","variantClasses","jsx","iconProps","animationClasses","accessibilityProps","MemoizedIcon","prevProps","nextProps","Icon","EmotionIcon","props","StatusIcon","LoadingIcon","SuccessIcon","ErrorIcon","colorShades","colorClass","color","shade","prefix","withDarkMode","lightClass","darkClass","defaultColorConfig","gradientConfig","createColorStyles","_b","_c","_d","_e","_f","_g","_h","_i","_j","_k","_l","_m","_n","_o","finalConfig","defaultBorder","defaultBg","defaultStyle","gradientFrom","gradientTo","gradientBorder","gradientStyle","outlineBorder","outlineBg","outlineText","outlineStyle","elevatedBorder","elevatedBg","elevatedShadow","elevatedStyle","iconBg","iconText","iconStyle","badgeBg","badgeText","badgeStyle","colorStylesCache","useColorStyles","cacheKey","createVariantStyles","colorStyles","baseClasses","StatCard","title","value","description","icon","trend","loading","emptyState","isGradient","isTextWhite","variantClass","useMemo","baseClass","formatValue","val","jsxs","QuickActionCard","href","onClick","content","Fragment","gapClasses","columnClasses","fixedColumnClasses","DashboardGrid","columns","gap","responsive","children","gridClasses","ActivityFeed","items","emptyMessage","showHeader","maxItems","onViewAll","viewAllLabel","displayItems","hasMore","item","key","tierStyles","tierLabels","ProfileCard","email","avatar","avatarAlt","greeting","memberSince","membershipTier","membershipLabel","onSettingsClick","settingsHref","showAvatar","showMembership","showSettings","formatDate","tier","tierStyle","tierLabel","part","index","isEmoji","tierConfig","sizeClasses","MembershipBadge","label","showIcon","sizeStyle","displayLabel","getIcon","chartColors","MiniBarChart","data","labels","maxValue","height","showTooltip","showStats","highlightToday","todayIndex","colors","calculatedMax","fixedMax","todayIdx","calculateHeight","total","sum","average","max","chartLabel","isToday","barHeight","barColor","defaultVariantGradients","buttonGradients","SummaryCard","subtitle","badge","footer","showAction","actionLabel","typeStyles","defaultTypeStyles","NotificationCard","showCount","getTypeStyles","type","typeStyle","MetricCard","chartData","chartLabels","showChart","progressColors","sizeStyles","ProgressCard","current","unit","showPercentage","showLabel","sizes","percentage","variantStyles","DashboardEmptyState","actionText","actionHref","actionOnClick","styles","actionButton","Tooltip","position","delay","disabled","isVisible","setIsVisible","coords","setCoords","timeoutRef","tooltipRef","e","rect","tooltipRect","x","y","hideTooltip","getVariantClasses","getArrowClasses","TooltipLight","TooltipDark","DEFAULT_COLLAPSED","DEFAULT_EXPANDED","DashboardSidebar","logo","productSwitcher","sections","footerActions","isCollapsed","defaultCollapsed","onToggleCollapsed","collapsedWidth","expandedWidth","mobileBreakpoint","overlayBackground","internalCollapsed","setInternalCollapsed","isMobileOpen","setIsMobileOpen","isMobile","setIsMobile","collapsed","checkMobile","toggleCollapsed","next","widthStyle","sidebarContent","section","itemNode","Table","getSizeClasses","TableHeader","TableBody","TableFooter","TableRow","TableHead","TableCell","TableCaption","Badge","Skeleton","width","animation","getAnimationClasses","defaultDims","finalWidth","finalHeight","SkeletonText","SkeletonCircle","SkeletonRectangle","SkeletonRounded","SkeletonCard","SkeletonAvatar","SkeletonImage","SkeletonUserProfile","SkeletonList","_","SkeletonTable","STATUS_STYLES","DEFAULT_COLUMNS","TransactionsTable","rows","isLoading","caption","filters","onRowClick","highlightRow","statusLabels","statusRenderer","amountFormatter","methodFormatter","dateFormatter","defaultCurrency","rowActionLabel","rowActionHint","columnList","hasRows","tableId","rowActionHintId","getRowActionLabel","row","renderStatus","renderAmount","currency","renderMethod","renderDate","renderCell","column","clickable","handleRowKeyDown","event","rowLabel","isBrowser","useReducedMotion","reduce","setReduce","mq","onChange","ButtonInner","iconPosition","gradient","customGradient","rounded","shadow","hover","fullWidth","iconOnly","rest","reduced","getGradientClass","roundedClasses","shadowClasses","hoverClasses","base","target","rel","anchorClassName","anchorProps","isDisabled","handleAnchorClick","buttonClassName","btnProps","Button","g","Dropdown","trigger","controlledOpen","onOpenChange","placement","align","offset","showArrow","internalOpen","setInternalOpen","triggerRef","dropdownRef","isControlled","isOpen","handleOpenChange","newOpen","handleTriggerClick","updatePosition","triggerRect","dropdownRect","viewportWidth","viewportHeight","handleClickOutside","getPlacementClasses","DropdownItem","DropdownSeparator","DropdownLabel","DropdownMenu","DropdownGroup","actionAppearance","ToolbarButton","appearance","DashboardToolbar","meta","dateRange","actions","onRefresh","lastUpdated","containerClasses","preset","action","PRESET_PALETTES","TrendChart","series","categories","palette","showLegend","showDots","paletteColors","safeCategories","denominator","s","points","point","i","pathData","p","areaData","idx","Drawer","open","side","showBackdrop","backdropClassName","closeOnBackdropClick","closeOnEscape","isAnimating","setIsAnimating","timer","handleEscape","sideClasses","transformClasses","DrawerHeader","showCloseButton","onClose","DrawerContent","DrawerFooter","formatAmount","amount","parsed","getEventColor","getSettlementBadge","TransactionDetailDrawer","transaction","metadata","settlement","fees","events","summary","statusStyle","fee","STATUS_CONFIG","SettlementTimeline","highlightedId","hasItems","statusConfig","isHighlighted","showConnector","itemLabel","DEFAULT_COLORS","STATUS_BADGES","formatPercentage","RoutingBreakdownCard","segments","totalLabel","totalValue","highlightId","formatter","hasSegments","segment","badgeClass","customContent","HEALTH_BADGES","formatPercent","formatVolume","MerchantList","onMerchantSelect","merchant","approval","volume","merchantLabel","StatsPanel","baseCardClass","accentStyles","gridCols","SectionHeader"],"mappings":"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","file":"advanced-dashboard.js","sourcesContent":["import { type ClassValue, clsx } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\n/**\n * HUA UI의 스마트 클래스 병합 유틸리티\n * clsx와 tailwind-merge를 결합하여 중복 클래스를 자동으로 해결합니다.\n * \n * @param inputs - 병합할 클래스 값들\n * @returns 병합된 클래스 문자열\n * \n * @example\n * ```tsx\n * merge(\"px-2 py-1\", \"px-4\") // \"py-1 px-4\"\n * merge(\"text-red-500\", \"text-blue-500\") // \"text-blue-500\"\n * merge(\"bg-white\", \"dark:bg-slate-900\") // \"bg-white dark:bg-slate-900\"\n * ```\n */\nexport function merge(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n\n/**\n * 조건부 클래스 병합 유틸리티\n * 조건에 따라 클래스를 선택적으로 병합합니다.\n * \n * @param condition - 클래스를 적용할 조건\n * @param trueClass - 조건이 true일 때 적용할 클래스\n * @param falseClass - 조건이 false일 때 적용할 클래스 (선택사항)\n * @returns 병합된 클래스 문자열\n * \n * @example\n * ```tsx\n * mergeIf(isActive, \"bg-blue-500\", \"bg-gray-200\")\n * mergeIf(isLoading, \"opacity-50 cursor-not-allowed\")\n * ```\n */\nexport function mergeIf(\n condition: boolean,\n trueClass: ClassValue,\n falseClass?: ClassValue\n) {\n return merge(condition ? trueClass : falseClass || \"\")\n}\n\n/**\n * 상대 시간 포맷팅 유틸리티\n * \n * 날짜를 상대 시간 형식으로 포맷팅합니다 (예: \"방금 전\", \"5분 전\", \"2시간 전\", \"3일 전\").\n * 7일 이상 경과한 경우 절대 날짜를 반환합니다.\n * \n * Formats a date as relative time (e.g., \"방금 전\", \"5분 전\", \"2시간 전\", \"3일 전\").\n * Returns absolute date for dates older than 7 days.\n * \n * @param timestamp - 포맷팅할 날짜 (Date 객체 또는 ISO 문자열) / Date to format (Date object or ISO string)\n * @param locale - 로케일 (기본값: \"ko-KR\") / Locale (default: \"ko-KR\")\n * @returns 포맷팅된 상대 시간 문자열 / Formatted relative time string\n * \n * @example\n * ```tsx\n * formatRelativeTime(new Date()) // \"방금 전\"\n * formatRelativeTime(new Date(Date.now() - 5 * 60000)) // \"5분 전\"\n * formatRelativeTime(new Date(Date.now() - 2 * 3600000)) // \"2시간 전\"\n * formatRelativeTime(new Date(Date.now() - 3 * 86400000)) // \"3일 전\"\n * formatRelativeTime(new Date(\"2024-01-01\")) // \"2024. 1. 1.\" (7일 이상 경과)\n * ```\n */\nexport function formatRelativeTime(timestamp: Date | string, locale = \"ko-KR\"): string {\n const date = typeof timestamp === \"string\" ? new Date(timestamp) : timestamp;\n const now = new Date();\n const diff = now.getTime() - date.getTime();\n const minutes = Math.floor(diff / 60000);\n const hours = Math.floor(diff / 3600000);\n const days = Math.floor(diff / 86400000);\n\n if (minutes < 1) return locale === \"ko-KR\" ? \"방금 전\" : \"just now\";\n if (minutes < 60) return locale === \"ko-KR\" ? `${minutes}분 전` : `${minutes}m ago`;\n if (hours < 24) return locale === \"ko-KR\" ? `${hours}시간 전` : `${hours}h ago`;\n if (days < 7) return locale === \"ko-KR\" ? `${days}일 전` : `${days}d ago`;\n return date.toLocaleDateString(locale);\n}\n\n/**\n * 객체 기반 클래스 병합 유틸리티\n * 객체의 키-값 쌍을 기반으로 조건부 클래스를 병합합니다.\n * \n * @param classMap - 클래스 맵 객체\n * @returns 병합된 클래스 문자열\n * \n * @example\n * ```tsx\n * mergeMap({\n * \"bg-blue-500\": isPrimary,\n * \"bg-gray-500\": !isPrimary,\n * \"text-white\": true,\n * \"opacity-50\": isDisabled\n * })\n * ```\n */\nexport function mergeMap(classMap: Record<string, boolean | undefined | null>) {\n const classes = Object.entries(classMap)\n .filter(([, condition]) => condition)\n .map(([className]) => className)\n \n return merge(...classes)\n}\n\n// 하위 호환성을 위해 cn도 export (점진적 마이그레이션 지원)\nexport const cn = merge ","/**\n * Core Icons\n * \n * 핵심 아이콘만 포함하여 번들 크기를 최적화합니다.\n * 나머지 아이콘은 동적 fallback으로 처리됩니다.\n * \n * 포함 기준:\n * 1. sum-diary에서 실제 사용 중인 아이콘\n * 2. UI 컴포넌트에서 자주 사용되는 아이콘\n * 3. 각 카테고리의 대표 아이콘\n * \n * 새로운 아이콘이 필요하면 동적 fallback이 자동으로 처리합니다.\n */\n\nimport {\n // Navigation\n Home,\n ArrowLeft,\n ArrowRight,\n ArrowUp,\n ArrowDown,\n Menu,\n X,\n Search,\n Settings,\n ExternalLink,\n ChevronLeft,\n ChevronRight,\n ChevronDown,\n ChevronUp,\n \n // Actions\n Edit,\n Trash2,\n Plus,\n Minus,\n Download,\n Upload,\n RefreshCw,\n Save,\n Copy,\n \n // Status & Feedback\n Loader2,\n CheckCircle,\n XCircle,\n AlertCircle,\n Info,\n Check,\n Circle,\n HelpCircle,\n \n // User & Auth\n User,\n Users,\n UserPlus,\n LogIn,\n LogOut,\n Eye,\n EyeOff,\n \n // Data & Analytics\n BarChart3,\n TrendingUp,\n Activity,\n Database,\n Zap,\n \n // Files & Content\n FileText,\n File,\n Folder,\n Book,\n BookOpen,\n \n // Communication\n Mail,\n MessageCircle,\n Phone,\n \n // Media\n Image,\n Video,\n Camera,\n \n // Emotions\n Smile,\n Frown,\n Meh,\n \n // Security\n Lock,\n Unlock,\n Shield,\n Wallet,\n Key,\n \n // Time & Date\n Clock,\n Calendar,\n CalendarPlus,\n \n // UI Elements\n Bell,\n Heart,\n Star,\n Bookmark,\n Share,\n \n // Theme\n Monitor,\n Sun,\n Moon,\n \n // Additional\n Lightbulb,\n Brain,\n Flag,\n Square,\n} from 'lucide-react'\n\n// 핵심 아이콘 객체\nexport const icons = {\n // Navigation\n home: Home,\n arrowLeft: ArrowLeft,\n arrowRight: ArrowRight,\n arrowUp: ArrowUp,\n arrowDown: ArrowDown,\n menu: Menu,\n close: X,\n search: Search,\n settings: Settings,\n externalLink: ExternalLink,\n chevronLeft: ChevronLeft,\n chevronRight: ChevronRight,\n chevronDown: ChevronDown,\n chevronUp: ChevronUp,\n \n // Actions\n edit: Edit,\n delete: Trash2,\n add: Plus,\n remove: Minus,\n download: Download,\n upload: Upload,\n refresh: RefreshCw,\n save: Save,\n copy: Copy,\n \n // Status & Feedback\n loader: Loader2,\n success: CheckCircle,\n error: XCircle,\n alertCircle: AlertCircle,\n warning: AlertCircle, // warning은 alertCircle과 동일\n info: Info,\n check: Check,\n circle: Circle,\n helpCircle: HelpCircle,\n \n // User & Auth\n user: User,\n users: Users,\n userPlus: UserPlus,\n logIn: LogIn,\n logOut: LogOut,\n eye: Eye,\n eyeOff: EyeOff,\n \n // Data & Analytics\n chart: BarChart3,\n barChart: BarChart3,\n trendingUp: TrendingUp,\n activity: Activity,\n database: Database,\n zap: Zap,\n \n // Files & Content\n fileText: FileText,\n file: File,\n folder: Folder,\n book: Book,\n bookOpen: BookOpen,\n \n // Communication\n mail: Mail,\n message: MessageCircle,\n phone: Phone,\n \n // Media\n image: Image,\n video: Video,\n camera: Camera,\n \n // Emotions\n smile: Smile,\n frown: Frown,\n meh: Meh,\n \n // Security\n lock: Lock,\n unlock: Unlock,\n shield: Shield,\n wallet: Wallet,\n key: Key,\n \n // Time & Date\n clock: Clock,\n calendar: Calendar,\n calendarPlus: CalendarPlus,\n \n // UI Elements\n bell: Bell,\n heart: Heart,\n star: Star,\n bookmark: Bookmark,\n share: Share,\n \n // Theme\n monitor: Monitor,\n sun: Sun,\n moon: Moon,\n \n // Additional\n lightbulb: Lightbulb,\n brain: Brain,\n flag: Flag,\n square: Square,\n} as const\n\n// 아이콘 이름 타입\nexport type IconName = keyof typeof icons\n\n// 감정별 아이콘 매핑\nexport const emotionIcons = {\n happy: 'smile',\n sad: 'frown',\n neutral: 'meh',\n excited: 'smile', // laugh 대신 smile 사용\n angry: 'frown', // angry 대신 frown 사용\n love: 'heart',\n like: 'heart', // thumbsUp 대신 heart 사용\n dislike: 'frown', // thumbsDown 대신 frown 사용\n} as const\n\n// 상태별 아이콘 매핑\nexport const statusIcons = {\n loading: 'loader',\n success: 'success',\n error: 'error',\n warning: 'warning',\n info: 'info',\n locked: 'lock',\n unlocked: 'unlock',\n visible: 'eye',\n hidden: 'eyeOff',\n} as const\n\n// 아이콘 카테고리별 그룹화 (참고용)\nexport const iconCategories = {\n navigation: ['home', 'arrowLeft', 'arrowRight', 'arrowUp', 'arrowDown', 'menu', 'close', 'search', 'settings', 'externalLink', 'chevronLeft', 'chevronRight', 'chevronDown', 'chevronUp'],\n actions: ['edit', 'delete', 'add', 'remove', 'download', 'upload', 'refresh', 'save', 'copy'],\n status: ['loader', 'success', 'error', 'alertCircle', 'warning', 'info', 'check', 'circle'],\n user: ['user', 'users', 'userPlus', 'logIn', 'logOut', 'eye', 'eyeOff'],\n data: ['chart', 'barChart', 'trendingUp', 'activity', 'database', 'zap'],\n files: ['fileText', 'file', 'folder', 'book'],\n communication: ['mail', 'message', 'phone'],\n media: ['image', 'video', 'camera'],\n emotions: ['smile', 'frown', 'meh'],\n security: ['lock', 'unlock', 'shield'],\n time: ['clock', 'calendar'],\n ui: ['bell', 'heart', 'star', 'bookmark', 'share'],\n theme: ['monitor', 'sun', 'moon'],\n} as const\n","/**\n * Icon Provider System\n * \n * Supports multiple icon libraries:\n * - Lucide Icons (default)\n * - Phosphor Icons\n * - Untitled Icons (SVG-based)\n * \n * Only imports icons that are actually used in the project for optimal bundle size.\n */\n\nimport * as LucideIcons from 'lucide-react'\nimport type { LucideIcon } from 'lucide-react'\n\n// Phosphor Icons - lazy loaded, tree-shakeable\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet PhosphorIcons: any = null\n\n// Icon Provider Type\nexport type IconProvider = 'lucide' | 'phosphor' | 'untitled'\n\n// Icon Provider Configuration\nexport interface IconProviderConfig {\n provider: IconProvider\n prefix?: string\n}\n\n/**\n * Project-specific icon list\n * These are the icons actually used in SumUp project\n * Only these icons will be loaded for optimal bundle size\n */\nexport const PROJECT_ICONS = {\n // Navigation & Layout\n 'home': { lucide: 'Home', phosphor: 'House', untitled: 'home' },\n 'layout-dashboard': { lucide: 'LayoutDashboard', phosphor: 'SquaresFour', untitled: 'layout-dashboard' },\n 'folder': { lucide: 'Folder', phosphor: 'Folder', untitled: 'folder' },\n 'alert-circle': { lucide: 'AlertCircle', phosphor: 'WarningCircle', untitled: 'alert-circle' },\n 'alertCircle': { lucide: 'AlertCircle', phosphor: 'WarningCircle', untitled: 'alert-circle' },\n 'columns': { lucide: 'Columns', phosphor: 'Columns', untitled: 'columns' },\n 'users': { lucide: 'Users', phosphor: 'Users', untitled: 'users' },\n 'settings': { lucide: 'Settings', phosphor: 'Gear', untitled: 'settings' },\n 'menu': { lucide: 'Menu', phosphor: 'List', untitled: 'menu' },\n 'close': { lucide: 'X', phosphor: 'X', untitled: 'close' },\n 'chevronLeft': { lucide: 'ChevronLeft', phosphor: 'CaretLeft', untitled: 'chevron-left' },\n 'chevronRight': { lucide: 'ChevronRight', phosphor: 'CaretRight', untitled: 'chevron-right' },\n 'chevronDown': { lucide: 'ChevronDown', phosphor: 'CaretDown', untitled: 'chevron-down' },\n 'chevronUp': { lucide: 'ChevronUp', phosphor: 'CaretUp', untitled: 'chevron-up' },\n 'arrowLeft': { lucide: 'ArrowLeft', phosphor: 'ArrowLeft', untitled: 'arrow-left' },\n 'arrowRight': { lucide: 'ArrowRight', phosphor: 'ArrowRight', untitled: 'arrow-right' },\n 'arrowUp': { lucide: 'ArrowUp', phosphor: 'ArrowUp', untitled: 'arrow-up' },\n 'arrowDown': { lucide: 'ArrowDown', phosphor: 'ArrowDown', untitled: 'arrow-down' },\n\n // Actions\n 'add': { lucide: 'Plus', phosphor: 'Plus', untitled: 'add' },\n 'edit': { lucide: 'Edit', phosphor: 'Pencil', untitled: 'edit' },\n 'pencil': { lucide: 'Pencil', phosphor: 'Pencil', untitled: 'pencil' },\n 'delete': { lucide: 'Trash2', phosphor: 'Trash', untitled: 'trash' },\n 'trash': { lucide: 'Trash2', phosphor: 'Trash', untitled: 'trash' },\n 'upload': { lucide: 'Upload', phosphor: 'Upload', untitled: 'upload' },\n 'download': { lucide: 'Download', phosphor: 'Download', untitled: 'download' },\n 'x': { lucide: 'X', phosphor: 'X', untitled: 'close' },\n 'check': { lucide: 'Check', phosphor: 'Check', untitled: 'check' },\n 'search': { lucide: 'Search', phosphor: 'MagnifyingGlass', untitled: 'search' },\n 'share': { lucide: 'Share', phosphor: 'Share', untitled: 'share' },\n 'copy': { lucide: 'Copy', phosphor: 'Copy', untitled: 'copy' },\n 'save': { lucide: 'Save', phosphor: 'FloppyDisk', untitled: 'save' },\n\n // Status & Feedback\n 'loader': { lucide: 'Loader2', phosphor: 'Spinner', untitled: 'loader' },\n 'loader2': { lucide: 'Loader2', phosphor: 'Spinner', untitled: 'loader' },\n 'check-circle': { lucide: 'CheckCircle', phosphor: 'CheckCircle', untitled: 'check-circle' },\n 'checkCircle': { lucide: 'CheckCircle', phosphor: 'CheckCircle', untitled: 'check-circle' },\n 'success': { lucide: 'CheckCircle', phosphor: 'CheckCircle', untitled: 'check-circle' },\n 'error': { lucide: 'XCircle', phosphor: 'XCircle', untitled: 'error' },\n 'warning': { lucide: 'AlertCircle', phosphor: 'WarningCircle', untitled: 'warning' },\n 'info': { lucide: 'Info', phosphor: 'Info', untitled: 'info' },\n 'refresh': { lucide: 'RefreshCw', phosphor: 'ArrowClockwise', untitled: 'refresh' },\n 'refreshCw': { lucide: 'RefreshCw', phosphor: 'ArrowClockwise', untitled: 'refresh' },\n 'bell': { lucide: 'Bell', phosphor: 'Bell', untitled: 'bell' },\n 'heart': { lucide: 'Heart', phosphor: 'Heart', untitled: 'heart' },\n 'star': { lucide: 'Star', phosphor: 'Star', untitled: 'star' },\n 'bookmark': { lucide: 'Bookmark', phosphor: 'Bookmark', untitled: 'bookmark' },\n\n // User & Auth\n 'user': { lucide: 'User', phosphor: 'User', untitled: 'user' },\n 'userPlus': { lucide: 'UserPlus', phosphor: 'UserPlus', untitled: 'user-plus' },\n 'logIn': { lucide: 'LogIn', phosphor: 'SignIn', untitled: 'log-in' },\n 'logOut': { lucide: 'LogOut', phosphor: 'SignOut', untitled: 'log-out' },\n 'chrome': { lucide: 'Chrome', phosphor: 'ChromeLogo', untitled: 'chrome' },\n 'github': { lucide: 'Github', phosphor: 'GithubLogo', untitled: 'github' },\n 'message': { lucide: 'MessageCircle', phosphor: 'ChatCircle', untitled: 'message' },\n\n // Content\n 'messageSquare': { lucide: 'MessageSquare', phosphor: 'ChatSquare', untitled: 'message-square' },\n 'message-square': { lucide: 'MessageSquare', phosphor: 'ChatSquare', untitled: 'message-square' },\n 'inbox': { lucide: 'Inbox', phosphor: 'Inbox', untitled: 'inbox' },\n 'calendar': { lucide: 'Calendar', phosphor: 'Calendar', untitled: 'calendar' },\n 'calendarPlus': { lucide: 'CalendarPlus', phosphor: 'CalendarPlus', untitled: 'calendar-plus' },\n 'checkSquare': { lucide: 'CheckSquare', phosphor: 'CheckSquare', untitled: 'check-square' },\n 'clock': { lucide: 'Clock', phosphor: 'Clock', untitled: 'clock' },\n 'book': { lucide: 'Book', phosphor: 'Book', untitled: 'book' },\n 'bookOpen': { lucide: 'BookOpen', phosphor: 'BookOpen', untitled: 'book-open' },\n\n // Theme & UI\n 'monitor': { lucide: 'Monitor', phosphor: 'Monitor', untitled: 'monitor' },\n 'sun': { lucide: 'Sun', phosphor: 'Sun', untitled: 'sun' },\n 'moon': { lucide: 'Moon', phosphor: 'Moon', untitled: 'moon' },\n\n // AI & Features\n 'sparkles': { lucide: 'Sparkles', phosphor: 'Sparkle', untitled: 'sparkles' },\n 'lightbulb': { lucide: 'Lightbulb', phosphor: 'Lightbulb', untitled: 'lightbulb' },\n 'brain': { lucide: 'Brain', phosphor: 'Brain', untitled: 'brain' },\n 'zap': { lucide: 'Zap', phosphor: 'Lightning', untitled: 'zap' },\n\n // Data & Analytics\n 'chart': { lucide: 'BarChart3', phosphor: 'ChartBar', untitled: 'chart' },\n 'barChart': { lucide: 'BarChart', phosphor: 'ChartBar', untitled: 'bar-chart' },\n 'trendingUp': { lucide: 'TrendingUp', phosphor: 'TrendUp', untitled: 'trending-up' },\n 'trendingDown': { lucide: 'TrendingDown', phosphor: 'TrendDown', untitled: 'trending-down' },\n 'activity': { lucide: 'Activity', phosphor: 'Activity', untitled: 'activity' },\n 'database': { lucide: 'Database', phosphor: 'Database', untitled: 'database' },\n 'dollarSign': { lucide: 'DollarSign', phosphor: 'CurrencyDollar', untitled: 'dollar-sign' },\n 'dollar': { lucide: 'DollarSign', phosphor: 'CurrencyDollar', untitled: 'dollar-sign' },\n 'currency': { lucide: 'DollarSign', phosphor: 'CurrencyDollar', untitled: 'currency' },\n\n // Security\n 'lock': { lucide: 'Lock', phosphor: 'Lock', untitled: 'lock' },\n 'unlock': { lucide: 'Unlock', phosphor: 'LockOpen', untitled: 'unlock' },\n 'shield': { lucide: 'Shield', phosphor: 'Shield', untitled: 'shield' },\n 'key': { lucide: 'Key', phosphor: 'Key', untitled: 'key' },\n\n // Media\n 'play': { lucide: 'Play', phosphor: 'Play', untitled: 'play' },\n 'pause': { lucide: 'Pause', phosphor: 'Pause', untitled: 'pause' },\n 'image': { lucide: 'Image', phosphor: 'Image', untitled: 'image' },\n 'video': { lucide: 'Video', phosphor: 'Video', untitled: 'video' },\n 'camera': { lucide: 'Camera', phosphor: 'Camera', untitled: 'camera' },\n\n // Files\n 'fileText': { lucide: 'FileText', phosphor: 'FileText', untitled: 'file-text' },\n 'file': { lucide: 'File', phosphor: 'File', untitled: 'file' },\n\n // Navigation\n 'externalLink': { lucide: 'ExternalLink', phosphor: 'ArrowSquareOut', untitled: 'external-link' },\n 'link': { lucide: 'Link', phosphor: 'Link', untitled: 'link' },\n 'moreHorizontal': { lucide: 'MoreHorizontal', phosphor: 'DotsThreeOutline', untitled: 'more-horizontal' },\n 'moreVertical': { lucide: 'MoreVertical', phosphor: 'DotsThreeVertical', untitled: 'more-vertical' },\n\n // Priority\n 'remove': { lucide: 'Minus', phosphor: 'Minus', untitled: 'remove' },\n\n // Eye (password)\n 'eye': { lucide: 'Eye', phosphor: 'Eye', untitled: 'eye' },\n 'eyeOff': { lucide: 'EyeOff', phosphor: 'EyeSlash', untitled: 'eye-off' },\n\n // Emotions\n 'smile': { lucide: 'Smile', phosphor: 'Smiley', untitled: 'smile' },\n 'frown': { lucide: 'Frown', phosphor: 'SmileySad', untitled: 'frown' },\n 'meh': { lucide: 'Meh', phosphor: 'SmileyMeh', untitled: 'meh' },\n\n // Social\n 'mail': { lucide: 'Mail', phosphor: 'Envelope', untitled: 'mail' },\n 'phone': { lucide: 'Phone', phosphor: 'Phone', untitled: 'phone' },\n\n // Additional\n 'flag': { lucide: 'Flag', phosphor: 'Flag', untitled: 'flag' },\n} as const\n\n/**\n * Initialize Phosphor Icons (lazy load)\n * Only loads when Phosphor provider is used\n * Uses tree-shaking to only include used icons\n */\nexport async function initPhosphorIcons() {\n if (typeof window === 'undefined') return null\n\n if (!PhosphorIcons) {\n try {\n // Dynamic import with tree-shaking support\n // Only icons actually used will be included in bundle\n const phosphorModule = await import('@phosphor-icons/react')\n PhosphorIcons = phosphorModule\n } catch (error) {\n console.warn('Phosphor Icons not available. Install @phosphor-icons/react to use.')\n return null\n }\n }\n return PhosphorIcons\n}\n\n/**\n * Get icon from provider\n * Only resolves icons that are in PROJECT_ICONS for optimal bundle size\n * \n * @param iconName - 아이콘 이름 / Icon name\n * @param provider - 아이콘 프로바이더 / Icon provider\n * @returns 아이콘 컴포넌트 또는 null / Icon component or null\n */\nexport function getIconFromProvider(\n iconName: string,\n provider: IconProvider | 'lucide' | 'phosphor' | 'untitled' = 'lucide'\n): LucideIcon | React.ComponentType<Record<string, unknown>> | null {\n // Check if icon is in project icon list\n const iconMapping = PROJECT_ICONS[iconName as keyof typeof PROJECT_ICONS]\n\n if (!iconMapping) {\n // Fallback to direct lookup for backward compatibility\n return getIconDirect(iconName, provider)\n }\n\n const mappedName = iconMapping[provider]\n\n switch (provider) {\n case 'lucide':\n return (LucideIcons as unknown as Record<string, LucideIcon>)[mappedName] || null\n\n case 'phosphor':\n if (!PhosphorIcons) {\n return null\n }\n return PhosphorIcons?.[mappedName] || null\n\n case 'untitled':\n // Untitled Icons are SVG-based, handled separately\n return null\n\n default:\n return null\n }\n}\n\n/**\n * Direct icon lookup (fallback for icons not in PROJECT_ICONS)\n * \n * 동적으로 Lucide 아이콘을 가져옵니다.\n * icons.ts에 없는 아이콘도 사용 가능하도록 합니다.\n * \n * Dynamically loads Lucide icons.\n * Allows using icons not in icons.ts.\n * \n * @param iconName - 아이콘 이름 / Icon name\n * @param provider - 아이콘 프로바이더 / Icon provider\n * @returns 아이콘 컴포넌트 또는 null / Icon component or null\n */\nfunction getIconDirect(\n iconName: string,\n provider: IconProvider | 'lucide' | 'phosphor' | 'untitled'\n): LucideIcon | React.ComponentType<Record<string, unknown>> | null {\n switch (provider) {\n case 'lucide':\n // icons.ts에 없는 아이콘을 동적으로 찾기\n // PascalCase 변환 시도\n const lucideName = iconName.charAt(0).toUpperCase() + iconName.slice(1)\n // camelCase도 시도\n const camelCaseName = iconName.replace(/([A-Z])/g, (match, p1) =>\n match === iconName[0] ? match.toLowerCase() : match\n )\n\n return (LucideIcons as unknown as Record<string, LucideIcon>)[lucideName] ||\n (LucideIcons as unknown as Record<string, LucideIcon>)[iconName] ||\n (LucideIcons as unknown as Record<string, LucideIcon>)[camelCaseName] ||\n null\n\n case 'phosphor':\n if (!PhosphorIcons) {\n return null\n }\n const phosphorName1 = iconName.charAt(0).toUpperCase() + iconName.slice(1)\n const phosphorName2 = iconName\n .split(/(?=[A-Z])/)\n .map(word => word.charAt(0).toUpperCase() + word.slice(1))\n .join('')\n return PhosphorIcons?.[phosphorName1] ||\n PhosphorIcons?.[phosphorName2] ||\n PhosphorIcons?.[iconName] ||\n null\n\n case 'untitled':\n return null\n\n default:\n return null\n }\n}\n\n/**\n * Get icon name for provider\n * \n * 프로바이더별 아이콘 이름을 가져옵니다.\n * Gets icon name for the specified provider.\n * \n * @param iconName - 아이콘 이름 / Icon name\n * @param provider - 아이콘 프로바이더 / Icon provider\n * @returns 프로바이더별 아이콘 이름 / Icon name for provider\n */\nexport function getIconNameForProvider(\n iconName: string,\n provider: IconProvider | 'lucide' | 'phosphor' | 'untitled'\n): string {\n const iconMapping = PROJECT_ICONS[iconName as keyof typeof PROJECT_ICONS]\n if (iconMapping && iconMapping[provider]) {\n return iconMapping[provider]\n }\n return iconName\n}\n\n/**\n * Get all project icon names\n */\nexport function getProjectIconNames(): string[] {\n return Object.keys(PROJECT_ICONS)\n}\n","/**\n * Icon Aliases\n * \n * 여러 이름이 같은 아이콘을 가리키도록 하는 alias 시스템\n * DX 향상을 위해 직관적인 이름들을 지원합니다.\n */\n\nexport const ICON_ALIASES: Record<string, string> = {\n // Navigation aliases\n 'back': 'arrowLeft',\n 'prev': 'arrowLeft',\n 'previous': 'arrowLeft',\n 'forward': 'arrowRight',\n 'next': 'arrowRight',\n \n // Close aliases\n 'close': 'x',\n 'cancel': 'x',\n \n // Delete aliases\n 'remove': 'delete',\n 'trash': 'delete',\n \n // Add aliases\n 'plus': 'add',\n 'new': 'add',\n \n // Edit aliases\n 'pencil': 'edit',\n 'modify': 'edit',\n \n // Save aliases\n 'store': 'save',\n 'floppy': 'save',\n \n // Search aliases\n 'magnify': 'search',\n \n // User aliases\n 'person': 'user',\n 'account': 'user',\n 'profile': 'user',\n \n // Settings aliases\n 'gear': 'settings',\n 'config': 'settings',\n 'preferences': 'settings',\n \n // Home aliases\n 'house': 'home',\n 'main': 'home',\n \n // Check aliases\n 'done': 'check',\n 'complete': 'check',\n 'tick': 'check',\n \n // Info aliases\n 'information': 'info',\n 'help': 'info',\n \n // Warning aliases\n 'alert': 'warning',\n 'caution': 'warning',\n \n // Success aliases\n 'checkmark': 'success',\n 'checkCircle': 'success',\n \n // Error aliases\n 'fail': 'error',\n 'cross': 'error',\n 'xCircle': 'error',\n \n // Loading aliases\n 'spinner': 'loader',\n 'loading': 'loader',\n 'wait': 'loader',\n \n // Refresh aliases\n 'reload': 'refresh',\n 'update': 'refresh',\n 'sync': 'refresh',\n \n // Eye aliases\n 'show': 'eye',\n 'view': 'eye',\n 'hide': 'eyeOff',\n 'hidden': 'eyeOff',\n \n // Lock aliases\n 'secure': 'lock',\n 'locked': 'lock',\n 'unsecure': 'unlock',\n 'unlocked': 'unlock',\n \n // Download aliases\n 'get': 'download',\n 'fetch': 'download',\n \n // Upload aliases\n 'post': 'upload',\n \n // Share aliases\n 'send': 'share',\n 'export': 'share',\n \n // Copy aliases\n 'duplicate': 'copy',\n 'clone': 'copy',\n \n // Mail aliases\n 'email': 'mail',\n 'envelope': 'mail',\n \n // Message aliases\n 'chat': 'message',\n 'comment': 'message',\n 'talk': 'message',\n \n // Calendar aliases\n 'date': 'calendar',\n 'schedule': 'calendar',\n \n // Clock aliases\n 'time': 'clock',\n 'watch': 'clock',\n \n // File aliases\n 'document': 'fileText',\n 'doc': 'fileText',\n 'text': 'fileText',\n \n // Folder aliases\n 'directory': 'folder',\n 'dir': 'folder',\n \n // Image aliases\n 'picture': 'image',\n 'img': 'image',\n \n // Video aliases\n 'movie': 'video',\n 'film': 'video',\n \n // Camera aliases\n 'photo': 'camera',\n 'capture': 'camera',\n \n // Play aliases\n 'start': 'play',\n 'run': 'play',\n \n // Pause aliases\n 'stop': 'pause',\n 'halt': 'pause',\n \n // Heart aliases\n 'like': 'heart',\n 'love': 'heart',\n \n // Star aliases\n 'favorite': 'star',\n \n // Bookmark aliases\n 'saveBookmark': 'bookmark',\n \n // Bell aliases\n 'notification': 'bell',\n 'notify': 'bell',\n 'alarm': 'bell',\n \n // Settings aliases\n 'prefs': 'settings',\n \n // Search aliases (duplicate removed - see line 37)\n 'lookup': 'search',\n \n // More aliases\n 'dots': 'moreHorizontal',\n 'moreMenu': 'moreHorizontal',\n 'moreOptions': 'moreVertical',\n \n // External link aliases\n 'external': 'externalLink',\n 'outbound': 'externalLink',\n 'open': 'externalLink',\n \n // Link aliases\n 'url': 'link',\n 'hyperlink': 'link',\n \n // Chart aliases\n 'graph': 'barChart',\n 'stats': 'barChart',\n 'analytics': 'barChart',\n \n // Database aliases\n 'db': 'database',\n 'storage': 'database',\n \n // Activity aliases\n 'pulse': 'activity',\n 'monitor': 'activity',\n \n // Trending aliases\n 'up': 'trendingUp',\n 'down': 'trendingDown',\n \n // Zap aliases\n 'lightning': 'zap',\n 'bolt': 'zap',\n 'flash': 'zap',\n \n // Shield aliases\n 'security': 'shield',\n 'protect': 'shield',\n \n // Key aliases\n 'password': 'key',\n 'secret': 'key',\n \n // Log in aliases\n 'signin': 'logIn',\n 'login': 'logIn',\n 'enter': 'logIn',\n \n // Log out aliases\n 'signout': 'logOut',\n 'logout': 'logOut',\n 'exit': 'logOut',\n \n // Users aliases\n 'people': 'users',\n 'group': 'users',\n 'team': 'users',\n \n // User plus aliases\n 'addUser': 'userPlus',\n 'invite': 'userPlus',\n \n // Book aliases\n 'read': 'book',\n 'library': 'book',\n \n // Book open aliases\n 'reading': 'bookOpen',\n 'openBook': 'bookOpen',\n \n // Sun aliases\n 'light': 'sun',\n 'day': 'sun',\n \n // Moon aliases\n 'dark': 'moon',\n 'night': 'moon',\n \n // Monitor aliases\n 'screen': 'monitor',\n 'display': 'monitor',\n \n // Brain aliases\n 'ai': 'brain',\n 'intelligence': 'brain',\n 'think': 'brain',\n \n // Lightbulb aliases\n 'idea': 'lightbulb',\n 'bulb': 'lightbulb',\n 'inspiration': 'lightbulb',\n \n // Sparkles aliases\n 'magic': 'sparkles',\n 'stars': 'sparkles',\n 'glitter': 'sparkles',\n} as const\n\n/**\n * Resolve icon alias to actual icon name\n * \n * @param iconName - 아이콘 이름 또는 별칭 / Icon name or alias\n * @returns 실제 아이콘 이름 / Actual icon name\n * @throws {TypeError} iconName이 문자열이 아닌 경우\n */\nexport function resolveIconAlias(iconName: string): string {\n if (typeof iconName !== 'string') {\n throw new TypeError('iconName must be a string');\n }\n return ICON_ALIASES[iconName] || iconName;\n}\n\n/**\n * Get all aliases for an icon name\n * \n * @param iconName - 아이콘 이름 / Icon name\n * @returns 해당 아이콘의 모든 별칭 배열 / Array of all aliases for the icon\n * @throws {TypeError} iconName이 문자열이 아닌 경우\n */\nexport function getIconAliases(iconName: string): string[] {\n if (typeof iconName !== 'string') {\n throw new TypeError('iconName must be a string');\n }\n return Object.entries(ICON_ALIASES)\n .filter(([_, target]) => target === iconName)\n .map(([alias]) => alias);\n}\n\n\n","/**\n * Icon Config Types\n * \n * Icon 시스템의 설정 타입 정의\n * 상태관리는 서비스 레벨에서 관리 (Zustand 등)\n */\n\nexport type IconSet = 'lucide' | 'phosphor' | 'untitled'\n\nexport type PhosphorWeight = 'thin' | 'light' | 'regular' | 'bold' | 'duotone' | 'fill'\n\nexport interface IconConfig {\n set: IconSet\n weight: PhosphorWeight\n size: number\n color: string\n strokeWidth?: number // Lucide/Untitled용\n}\n\nexport const defaultIconConfig: IconConfig = {\n set: 'phosphor',\n weight: 'regular',\n size: 20,\n color: 'currentColor',\n strokeWidth: 1.25,\n}\n\n/**\n * 세트별 기본 strokeWidth\n */\nexport const getDefaultStrokeWidth = (set: IconSet): number => {\n switch (set) {\n case 'lucide':\n return 1.25\n case 'phosphor':\n return 1.25 // Phosphor는 weight 사용\n case 'untitled':\n return 1.5\n default:\n return 1.25\n }\n}\n","'use client'\n\n/**\n * IconProvider - Icon 시스템 전역 설정 Provider\n * \n * React Context를 사용하여 전역 아이콘 설정을 제공합니다.\n * 서비스 레벨에서 Zustand 등으로 상태관리 후 props로 전달 가능합니다.\n * \n * IconProvider - Global Icon Settings Provider\n * \n * Provides global icon settings using React Context API.\n * Can be integrated with state management (e.g., Zustand) at the service level.\n */\n\nimport React, { createContext, useContext } from 'react'\nimport { type IconConfig, type IconSet, type PhosphorWeight, defaultIconConfig } from './icon-store'\n\n/**\n * IconProvider 컴포넌트 Props\n * \n * IconProvider component props interface.\n * \n * @interface IconProviderProps\n */\nexport interface IconProviderProps {\n /** 아이콘 세트 (lucide, phosphor, untitled) / Icon set (lucide, phosphor, untitled) */\n set?: IconSet\n /** Phosphor 아이콘 weight (thin, light, regular, bold, duotone, fill) / Phosphor icon weight */\n weight?: PhosphorWeight\n /** 기본 아이콘 크기 / Default icon size */\n size?: number\n /** 기본 아이콘 색상 / Default icon color */\n color?: string\n /** Lucide/Untitled 아이콘 stroke width / Lucide/Untitled icon stroke width */\n strokeWidth?: number\n /** 자식 컴포넌트 / Child components */\n children: React.ReactNode\n}\n\ninterface IconContextValue extends IconConfig {}\n\nconst IconContext = createContext<IconContextValue>(defaultIconConfig)\n\n/**\n * IconProvider 컴포넌트\n * \n * 전역 아이콘 설정을 Context로 제공합니다.\n * 서비스에서 Zustand로 관리한 값을 props로 전달할 수 있습니다.\n * \n * IconProvider component\n * \n * Provides global icon settings through Context API.\n * Can receive values managed by Zustand at the service level.\n * \n * @component\n * @example\n * ```tsx\n * // 기본 사용 / Basic usage\n * <IconProvider set=\"phosphor\" weight=\"regular\" size={20}>\n * <App />\n * </IconProvider>\n * \n * // Zustand와 함께 사용 / With Zustand\n * const iconConfig = useIconStore(state => state.iconConfig)\n * <IconProvider {...iconConfig}>\n * <App />\n * </IconProvider>\n * \n * // Lucide 아이콘 사용 / Using Lucide icons\n * <IconProvider set=\"lucide\" size={24} strokeWidth={1.5}>\n * <App />\n * </IconProvider>\n * ```\n * \n * @param props - IconProvider 컴포넌트 props / IconProvider component props\n * @returns IconProvider 컴포넌트 / IconProvider component\n */\nexport function IconProvider({\n set = defaultIconConfig.set,\n weight = defaultIconConfig.weight,\n size = defaultIconConfig.size,\n color = defaultIconConfig.color,\n strokeWidth = defaultIconConfig.strokeWidth,\n children,\n}: IconProviderProps) {\n const value: IconContextValue = {\n set,\n weight,\n size,\n color,\n strokeWidth,\n }\n\n return (\n <IconContext.Provider value={value}>\n {children}\n </IconContext.Provider>\n )\n}\n\n/**\n * useIconContext Hook\n * \n * Icon Context를 사용하는 Hook입니다.\n * Icon 컴포넌트 내부에서 사용됩니다.\n * \n * Hook to use Icon Context.\n * Used internally by Icon component.\n * \n * @returns Icon 설정 값 / Icon configuration value\n * \n * @example\n * ```tsx\n * // Icon 컴포넌트 내부에서 사용 / Used inside Icon component\n * const config = useIconContext()\n * const iconSet = config.set\n * const iconSize = config.size\n * ```\n */\nexport function useIconContext(): IconContextValue {\n return useContext(IconContext)\n}\n\n// Re-export types for convenience\nexport type { IconSet, PhosphorWeight, IconConfig } from './icon-store'\nexport { defaultIconConfig, getDefaultStrokeWidth } from './icon-store'\n\n","import React from 'react'\nimport type { LucideProps } from 'lucide-react'\nimport { merge, mergeMap } from '../../lib/utils'\nimport { icons, IconName, emotionIcons, statusIcons } from '../../lib/icons'\nimport { getIconFromProvider, initPhosphorIcons } from '../../lib/icon-providers'\nimport { resolveIconAlias } from '../../lib/icon-aliases'\nimport { useIconContext, type IconSet } from './IconProvider'\nimport { type PhosphorWeight } from './icon-store'\nimport type { AllIconName } from '../../lib/icon-names'\n\n/**\n * Icon 컴포넌트 Props\n * \n * Icon component props interface.\n * \n * @interface IconProps\n */\nexport interface IconProps {\n /** 아이콘 이름 / Icon name */\n name: AllIconName\n /** 아이콘 크기 (숫자 또는 문자열) / Icon size (number or string) */\n size?: number | string\n /** 추가 CSS 클래스 / Additional CSS classes */\n className?: string\n /** 감정 아이콘 타입 / Emotion icon type */\n emotion?: keyof typeof emotionIcons\n /** 상태 아이콘 타입 / Status icon type */\n status?: keyof typeof statusIcons\n /** 아이콘 프로바이더 오버라이드 (전역 설정 무시) / Icon provider override (ignores global config) */\n provider?: IconSet\n /** 부드러운 애니메이션 효과 / Smooth animation effect */\n animated?: boolean\n /** 펄스 애니메이션 / Pulse animation */\n pulse?: boolean\n /** 회전 애니메이션 / Spin animation */\n spin?: boolean\n /** 바운스 애니메이션 / Bounce animation */\n bounce?: boolean\n /** 색상 변형 / Color variant */\n variant?: 'default' | 'primary' | 'secondary' | 'success' | 'warning' | 'error' | 'muted'\n /** Phosphor 아이콘 weight 오버라이드 / Phosphor icon weight override */\n weight?: PhosphorWeight\n /** 스크린 리더용 라벨 (의미 있는 아이콘인 경우) / Screen reader label (for meaningful icons) */\n 'aria-label'?: string\n /** 장식용 아이콘인 경우 true (스크린 리더에서 숨김) / Set to true for decorative icons (hidden from screen readers) */\n 'aria-hidden'?: boolean\n}\n\n/**\n * Icon 컴포넌트\n * \n * 다중 아이콘 라이브러리(Lucide, Phosphor, Untitled)를 지원하는 통합 아이콘 컴포넌트입니다.\n * IconProvider를 통해 전역 설정을 관리할 수 있으며, 개별 아이콘에서도 설정을 오버라이드할 수 있습니다.\n * \n * Icon component that supports multiple icon libraries (Lucide, Phosphor, Untitled).\n * Global settings can be managed through IconProvider, and individual icons can override settings.\n * \n * @component\n * @example\n * ```tsx\n * // 기본 사용 / Basic usage\n * <Icon name=\"heart\" />\n * \n * // 크기 지정 / Specify size\n * <Icon name=\"user\" size={24} />\n * \n * // 색상 변형 / Color variant\n * <Icon name=\"check\" variant=\"success\" />\n * \n * // 애니메이션 / Animation\n * <Icon name=\"loader\" spin />\n * <Icon name=\"heart\" pulse />\n * \n * // 접근성 / Accessibility\n * <Icon name=\"search\" aria-label=\"검색\" />\n * <Icon name=\"decorative-icon\" aria-hidden />\n * \n * // 감정 아이콘 / Emotion icon\n * <Icon emotion=\"happy\" />\n * \n * // 상태 아이콘 / Status icon\n * <Icon status=\"loading\" spin />\n * ```\n * \n * @param props - Icon 컴포넌트 props / Icon component props\n * @returns Icon 컴포넌트 / Icon component\n */\nconst IconComponent = React.forwardRef<HTMLSpanElement, IconProps>(({\n name,\n size,\n className,\n emotion,\n status,\n provider,\n weight,\n animated = false,\n pulse = false,\n spin = false,\n bounce = false,\n variant = 'default',\n 'aria-label': ariaLabel,\n 'aria-hidden': ariaHidden\n}, ref) => {\n // Context에서 전역 설정 가져오기\n const config = useIconContext()\n \n // prop으로 오버라이드 가능, 없으면 Context에서 가져옴\n const iconSet = provider || config.set\n const iconSize = size ?? config.size\n const iconWeight = weight || config.weight\n const iconColor = config.color\n const iconStrokeWidth = config.strokeWidth ?? 1.25\n \n // 클라이언트 사이드에서만 아이콘 렌더링 (hydration 오류 방지)\n const [isClient, setIsClient] = React.useState(false)\n const [phosphorReady, setPhosphorReady] = React.useState(false)\n \n React.useEffect(() => {\n setIsClient(true)\n \n // Phosphor Icons 초기화 (provider가 phosphor일 때만)\n if (iconSet === 'phosphor') {\n initPhosphorIcons().then(() => {\n setPhosphorReady(true)\n })\n } else {\n setPhosphorReady(true)\n }\n }, [iconSet])\n\n // 감정이나 상태가 지정되면 해당 아이콘으로 오버라이드\n let iconName = emotion ? emotionIcons[emotion] : \n status ? statusIcons[status] : \n name\n \n // Alias 해결 (back, prev → arrowLeft 등)\n iconName = resolveIconAlias(iconName) as AllIconName\n \n // 색상 변형 클래스 (먼저 선언 - fallback에서 사용)\n const variantClasses = mergeMap({\n 'text-gray-900 dark:text-white': variant === 'default',\n 'text-blue-600 dark:text-blue-400': variant === 'primary',\n 'text-gray-600 dark:text-gray-400': variant === 'secondary',\n 'text-green-600 dark:text-green-400': variant === 'success',\n 'text-yellow-600 dark:text-yellow-400': variant === 'warning',\n 'text-red-600 dark:text-red-400': variant === 'error',\n 'text-gray-500 dark:text-gray-500': variant === 'muted',\n })\n \n // 서버사이드에서는 빈 span 반환 (hydration 오류 방지)\n // Return empty span on server-side (prevent hydration errors)\n if (!isClient || (iconSet === 'phosphor' && !phosphorReady)) {\n return (\n <span\n style={{ width: iconSize, height: iconSize }}\n className={merge(variantClasses, className)}\n aria-hidden={ariaHidden !== undefined ? ariaHidden : true}\n aria-label={ariaLabel}\n />\n )\n }\n\n // Provider에 따라 아이콘 가져오기\n type IconComponentType = React.ComponentType<LucideProps | React.SVGProps<SVGSVGElement> | Record<string, unknown>>\n let IconComponent: IconComponentType | null = null\n \n if (iconSet === 'lucide') {\n // 1. icons.ts에서 먼저 찾기 (실제 사용되는 아이콘만 포함)\n // 타입 단언: AllIconName에는 있지만 icons 객체에 없는 경우를 위해\n IconComponent = (icons[iconName as IconName] || null) as IconComponentType | null\n \n // 2. 없으면 동적으로 Lucide에서 가져오기 (fallback)\n if (!IconComponent) {\n IconComponent = getIconFromProvider(iconName, iconSet) as IconComponentType | null\n }\n } else {\n // Phosphor나 다른 provider는 getIconFromProvider 사용\n // phosphorReady가 true일 때만 호출됨 (위에서 체크)\n IconComponent = getIconFromProvider(iconName, iconSet) as IconComponentType | null\n }\n \n if (!IconComponent) {\n console.warn(`Icon \"${iconName}\" not found for provider \"${iconSet}\"`)\n // Fallback: 빈 원형 아이콘 표시 (에러 표시)\n // Fallback: display empty circle icon (error indicator)\n return (\n <span\n ref={ref}\n className={merge(\n 'inline-flex items-center justify-center rounded-full border-2 border-dashed border-gray-300 dark:border-gray-600',\n variantClasses,\n className\n )}\n style={{ width: iconSize, height: iconSize }}\n aria-label={ariaLabel || `아이콘을 찾을 수 없음: ${iconName}`}\n title={`Icon not found: ${iconName}`}\n >\n <span className=\"text-xs text-gray-400 dark:text-gray-500\" aria-hidden=\"true\">\n ?\n </span>\n </span>\n )\n }\n \n // 세트별 props 준비\n type IconPropsType = LucideProps & {\n size?: number\n width?: number | string\n height?: number | string\n color?: string\n weight?: PhosphorWeight\n strokeWidth?: number\n }\n \n const iconProps: IconPropsType = {\n size: typeof iconSize === 'number' ? iconSize : undefined,\n width: typeof iconSize === 'string' ? iconSize : iconSize,\n height: typeof iconSize === 'string' ? iconSize : iconSize,\n color: iconColor,\n } as IconPropsType\n \n // Phosphor는 weight 사용\n if (iconSet === 'phosphor') {\n iconProps.weight = iconWeight\n } else {\n // Lucide/Untitled는 strokeWidth 사용\n iconProps.strokeWidth = iconStrokeWidth\n }\n\n // 애니메이션 클래스 생성\n const animationClasses = mergeMap({\n 'animate-pulse': pulse,\n 'animate-spin': spin,\n 'animate-bounce': bounce,\n 'transition-all duration-200 ease-in-out': animated,\n })\n\n // 접근성 속성 결정 / Determine accessibility attributes\n // aria-label이 제공되면 사용, 없으면 aria-hidden이 true인지 확인\n // If aria-label is provided, use it; otherwise check if aria-hidden is true\n const accessibilityProps: React.AriaAttributes = {}\n \n if (ariaLabel) {\n accessibilityProps['aria-label'] = ariaLabel\n accessibilityProps['aria-hidden'] = false\n } else if (ariaHidden !== undefined) {\n accessibilityProps['aria-hidden'] = ariaHidden\n } else {\n // 기본값: 장식용으로 간주 (의미 있는 아이콘은 명시적으로 aria-label 제공 필요)\n // Default: considered decorative (meaningful icons should explicitly provide aria-label)\n accessibilityProps['aria-hidden'] = true\n }\n\n return (\n <span\n ref={ref}\n className={merge(\n 'inline-flex items-center justify-center',\n animationClasses,\n variantClasses,\n className\n )}\n style={{ width: iconSize, height: iconSize }}\n {...accessibilityProps}\n >\n {IconComponent && React.createElement(IconComponent, { \n ...iconProps,\n className: variantClasses,\n 'aria-hidden': true // SVG 내부 요소는 항상 숨김 (외부 span이 접근성 담당)\n } as React.ComponentProps<typeof IconComponent>)}\n </span>\n )\n})\n\nIconComponent.displayName = 'Icon'\n\n// 성능 최적화: React.memo 적용\n// Performance optimization: Apply React.memo\n// forwardRef와 함께 사용할 때는 React.memo로 감싸기\n// When using with forwardRef, wrap with React.memo\nconst MemoizedIcon = React.memo(IconComponent, (prevProps, nextProps) => {\n // props 비교 함수: 변경된 props만 체크\n // Props comparison function: only check changed props\n return (\n prevProps.name === nextProps.name &&\n prevProps.size === nextProps.size &&\n prevProps.className === nextProps.className &&\n prevProps.emotion === nextProps.emotion &&\n prevProps.status === nextProps.status &&\n prevProps.provider === nextProps.provider &&\n prevProps.animated === nextProps.animated &&\n prevProps.pulse === nextProps.pulse &&\n prevProps.spin === nextProps.spin &&\n prevProps.bounce === nextProps.bounce &&\n prevProps.variant === nextProps.variant &&\n prevProps.weight === nextProps.weight &&\n prevProps['aria-label'] === nextProps['aria-label'] &&\n prevProps['aria-hidden'] === nextProps['aria-hidden']\n )\n})\n\n// 타입 안전성을 위해 export\n// Export for type safety\nexport const Icon = MemoizedIcon as typeof IconComponent\n\nIcon.displayName = 'Icon'\n\n/**\n * EmotionIcon 컴포넌트\n * \n * 감정을 표현하는 아이콘 컴포넌트입니다.\n * Icon component for expressing emotions.\n * \n * @component\n * @example\n * ```tsx\n * <EmotionIcon emotion=\"happy\" />\n * <EmotionIcon emotion=\"sad\" size={24} />\n * ```\n */\nexport const EmotionIcon = React.forwardRef<HTMLSpanElement, Omit<IconProps, 'name'> & { emotion: keyof typeof emotionIcons }>(\n (props, ref) => <Icon ref={ref} name=\"smile\" {...props} />\n)\n\nEmotionIcon.displayName = 'EmotionIcon'\n\n/**\n * StatusIcon 컴포넌트\n * \n * 상태를 표현하는 아이콘 컴포넌트입니다.\n * Icon component for expressing status.\n * \n * @component\n * @example\n * ```tsx\n * <StatusIcon status=\"loading\" spin />\n * <StatusIcon status=\"success\" variant=\"success\" />\n * ```\n */\nexport const StatusIcon = React.forwardRef<HTMLSpanElement, Omit<IconProps, 'name'> & { status: keyof typeof statusIcons }>(\n (props, ref) => <Icon ref={ref} name=\"info\" {...props} />\n)\n\nStatusIcon.displayName = 'StatusIcon'\n\n/**\n * LoadingIcon 컴포넌트\n * \n * 로딩 상태를 표시하는 전용 아이콘 컴포넌트입니다.\n * Dedicated icon component for displaying loading status.\n * \n * @component\n * @example\n * ```tsx\n * <LoadingIcon />\n * <LoadingIcon size={32} />\n * ```\n */\nexport const LoadingIcon = React.forwardRef<HTMLDivElement, Omit<IconProps, 'name' | 'status'>>(\n (props, ref) => (\n <Icon ref={ref} name=\"loader\" status=\"loading\" spin aria-label=\"로딩 중\" {...props} />\n )\n)\n\nLoadingIcon.displayName = 'LoadingIcon'\n\n/**\n * SuccessIcon 컴포넌트\n * \n * 성공 상태를 표시하는 전용 아이콘 컴포넌트입니다.\n * Dedicated icon component for displaying success status.\n * \n * @component\n * @example\n * ```tsx\n * <SuccessIcon />\n * <SuccessIcon size={24} />\n * ```\n */\nexport const SuccessIcon = React.forwardRef<HTMLDivElement, Omit<IconProps, 'name' | 'status'>>(\n (props, ref) => (\n <Icon ref={ref} name=\"check\" status=\"success\" variant=\"success\" aria-label=\"성공\" {...props} />\n )\n)\n\nSuccessIcon.displayName = 'SuccessIcon'\n\n/**\n * ErrorIcon 컴포넌트\n * \n * 에러 상태를 표시하는 전용 아이콘 컴포넌트입니다.\n * Dedicated icon component for displaying error status.\n * \n * @component\n * @example\n * ```tsx\n * <ErrorIcon />\n * <ErrorIcon size={24} />\n * ```\n */\nexport const ErrorIcon = React.forwardRef<HTMLDivElement, Omit<IconProps, 'name' | 'status'>>(\n (props, ref) => (\n <Icon ref={ref} name=\"alertCircle\" status=\"error\" variant=\"error\" aria-label=\"오류\" {...props} />\n )\n)\n\nErrorIcon.displayName = 'ErrorIcon'\n\n","/**\n * HUA UI 공통 색상 시스템\n * 중앙화된 색상 팔레트와 스타일 생성 유틸리티\n */\n\nimport type { Color } from \"../types/common\";\nimport { merge } from \"../utils\";\n\n/**\n * Tailwind CSS 색상 클래스 매핑\n * 각 색상의 50-900 단계를 정의합니다.\n */\nconst colorShades = {\n 50: \"50\",\n 100: \"100\",\n 200: \"200\",\n 300: \"300\",\n 400: \"400\",\n 500: \"500\",\n 600: \"600\",\n 700: \"700\",\n 800: \"800\",\n 900: \"900\",\n} as const;\n\ntype ColorShade = keyof typeof colorShades;\n\n/**\n * 색상별 클래스 생성 헬퍼\n */\nfunction colorClass(color: Color, shade: ColorShade, prefix: string = \"\"): string {\n return `${prefix}${color}-${colorShades[shade]}`;\n}\n\n/**\n * 다크 모드 지원 클래스 생성\n */\nfunction withDarkMode(lightClass: string, darkClass: string): string {\n return `${lightClass} dark:${darkClass}`;\n}\n\n/**\n * 색상 스타일 설정 인터페이스\n */\nexport interface ColorStyleConfig {\n /** 기본 variant 스타일 */\n default?: {\n border?: { light: ColorShade; dark?: ColorShade };\n background?: { light: ColorShade; dark?: ColorShade; opacity?: string };\n };\n /** 그라데이션 variant 스타일 */\n gradient?: {\n from?: ColorShade;\n to?: ColorShade;\n border?: { light: ColorShade; dark?: ColorShade };\n };\n /** 아웃라인 variant 스타일 */\n outline?: {\n border?: { light: ColorShade; dark?: ColorShade };\n background?: string;\n text?: { light: ColorShade; dark?: ColorShade };\n };\n /** Elevated variant 스타일 */\n elevated?: {\n border?: { light: ColorShade; dark?: ColorShade };\n background?: { light: string; dark: string };\n shadow?: string;\n };\n /** 아이콘 스타일 */\n icon?: {\n background?: { light: ColorShade; dark?: ColorShade; opacity?: string };\n text?: { light: ColorShade; dark?: ColorShade };\n };\n /** 배지 스타일 */\n badge?: {\n background?: { light: ColorShade; dark?: ColorShade; opacity?: string };\n text?: { light: ColorShade; dark?: ColorShade };\n };\n}\n\n/**\n * 생성된 색상 스타일 인터페이스\n */\nexport interface ColorStyles {\n default: string;\n gradient: string;\n outline: string;\n elevated: string;\n icon: string;\n badge: string;\n}\n\n/**\n * 기본 색상 스타일 설정\n * 각 색상에 대한 기본 스타일 템플릿\n */\nconst defaultColorConfig: Omit<ColorStyleConfig, \"gradient\"> = {\n default: {\n border: { light: 200, dark: 700 },\n background: { light: 50, dark: 900, opacity: \"50\" },\n },\n outline: {\n border: { light: 300, dark: 600 },\n background: \"transparent\",\n text: { light: 600, dark: 400 },\n },\n elevated: {\n border: { light: 200, dark: 700 },\n background: { light: \"white\", dark: \"gray-800\" },\n shadow: \"lg\",\n },\n icon: {\n background: { light: 100, dark: 900, opacity: \"30\" },\n text: { light: 600, dark: 400 },\n },\n badge: {\n background: { light: 50, dark: 900, opacity: \"30\" },\n text: { light: 700, dark: 300 },\n },\n};\n\n/**\n * 그라데이션 스타일 설정\n */\nconst gradientConfig: ColorStyleConfig[\"gradient\"] = {\n from: 500,\n to: 600,\n border: { light: 400, dark: 500 },\n};\n\n/**\n * 색상 스타일 생성 함수\n * \n * @param color - 색상 이름\n * @param config - 커스텀 스타일 설정 (선택사항)\n * @returns 생성된 색상 스타일 객체\n * \n * @example\n * ```tsx\n * const styles = createColorStyles(\"blue\");\n * // styles.default, styles.gradient, styles.outline 등 사용 가능\n * ```\n */\nexport function createColorStyles(\n color: Color,\n config?: Partial<ColorStyleConfig>\n): ColorStyles {\n const finalConfig: ColorStyleConfig = {\n default: config?.default || defaultColorConfig.default,\n gradient: config?.gradient || gradientConfig,\n outline: config?.outline || defaultColorConfig.outline,\n elevated: config?.elevated || defaultColorConfig.elevated,\n icon: config?.icon || defaultColorConfig.icon,\n badge: config?.badge || defaultColorConfig.badge,\n };\n\n // Default variant\n const defaultBorder = finalConfig.default?.border\n ? withDarkMode(\n `border-${colorClass(color, finalConfig.default.border.light)}`,\n `border-${colorClass(color, finalConfig.default.border.dark || finalConfig.default.border.light)}`\n )\n : \"\";\n \n const defaultBg = finalConfig.default?.background\n ? withDarkMode(\n `bg-${colorClass(color, finalConfig.default.background.light)}${finalConfig.default.background.opacity ? `/${finalConfig.default.background.opacity}` : \"\"}`,\n `bg-${colorClass(color, finalConfig.default.background.dark || finalConfig.default.background.light)}${finalConfig.default.background.opacity ? `/${finalConfig.default.background.opacity}` : \"\"}`\n )\n : \"\";\n\n const defaultStyle = merge(defaultBorder, defaultBg);\n\n // Gradient variant\n const gradientFrom = finalConfig.gradient?.from\n ? `from-${colorClass(color, finalConfig.gradient.from)}`\n : \"\";\n const gradientTo = finalConfig.gradient?.to\n ? `to-${colorClass(color, finalConfig.gradient.to)}`\n : \"\";\n const gradientBorder = finalConfig.gradient?.border\n ? withDarkMode(\n `border-${colorClass(color, finalConfig.gradient.border.light)}`,\n `border-${colorClass(color, finalConfig.gradient.border.dark || finalConfig.gradient.border.light)}`\n )\n : \"\";\n \n const gradientStyle = merge(\n \"bg-gradient-to-br\",\n gradientFrom,\n gradientTo,\n gradientBorder\n );\n\n // Outline variant\n const outlineBorder = finalConfig.outline?.border\n ? `border-2 ${withDarkMode(\n `border-${colorClass(color, finalConfig.outline.border.light)}`,\n `border-${colorClass(color, finalConfig.outline.border.dark || finalConfig.outline.border.light)}`\n )}`\n : \"\";\n const outlineBg = finalConfig.outline?.background || \"bg-transparent\";\n const outlineText = finalConfig.outline?.text\n ? withDarkMode(\n `text-${colorClass(color, finalConfig.outline.text.light)}`,\n `text-${colorClass(color, finalConfig.outline.text.dark || finalConfig.outline.text.light)}`\n )\n : \"\";\n \n const outlineStyle = merge(outlineBorder, outlineBg, outlineText);\n\n // Elevated variant\n const elevatedBorder = finalConfig.elevated?.border\n ? withDarkMode(\n `border-${colorClass(color, finalConfig.elevated.border.light)}`,\n `border-${colorClass(color, finalConfig.elevated.border.dark || finalConfig.elevated.border.light)}`\n )\n : \"\";\n const elevatedBg = finalConfig.elevated?.background\n ? withDarkMode(\n `bg-${finalConfig.elevated.background.light}`,\n `bg-${finalConfig.elevated.background.dark}`\n )\n : \"\";\n const elevatedShadow = finalConfig.elevated?.shadow\n ? `shadow-${finalConfig.elevated.shadow}`\n : \"\";\n \n const elevatedStyle = merge(elevatedBorder, elevatedBg, elevatedShadow);\n\n // Icon style\n const iconBg = finalConfig.icon?.background\n ? withDarkMode(\n `bg-${colorClass(color, finalConfig.icon.background.light)}${finalConfig.icon.background.opacity ? `/${finalConfig.icon.background.opacity}` : \"\"}`,\n `bg-${colorClass(color, finalConfig.icon.background.dark || finalConfig.icon.background.light)}${finalConfig.icon.background.opacity ? `/${finalConfig.icon.background.opacity}` : \"\"}`\n )\n : \"\";\n const iconText = finalConfig.icon?.text\n ? withDarkMode(\n `text-${colorClass(color, finalConfig.icon.text.light)}`,\n `text-${colorClass(color, finalConfig.icon.text.dark || finalConfig.icon.text.light)}`\n )\n : \"\";\n \n const iconStyle = merge(iconBg, iconText);\n\n // Badge style\n const badgeBg = finalConfig.badge?.background\n ? withDarkMode(\n `bg-${colorClass(color, finalConfig.badge.background.light)}${finalConfig.badge.background.opacity ? `/${finalConfig.badge.background.opacity}` : \"\"}`,\n `bg-${colorClass(color, finalConfig.badge.background.dark || finalConfig.badge.background.light)}${finalConfig.badge.background.opacity ? `/${finalConfig.badge.background.opacity}` : \"\"}`\n )\n : \"\";\n const badgeText = finalConfig.badge?.text\n ? withDarkMode(\n `text-${colorClass(color, finalConfig.badge.text.light)}`,\n `text-${colorClass(color, finalConfig.badge.text.dark || finalConfig.badge.text.light)}`\n )\n : \"\";\n \n const badgeStyle = merge(badgeBg, badgeText);\n\n return {\n default: defaultStyle,\n gradient: gradientStyle,\n outline: outlineStyle,\n elevated: elevatedStyle,\n icon: iconStyle,\n badge: badgeStyle,\n };\n}\n\n/**\n * 색상 스타일 캐시\n * 동일한 색상과 설정에 대해 재사용하여 성능 최적화\n */\nconst colorStylesCache = new Map<string, ColorStyles>();\n\n/**\n * 메모이제이션된 색상 스타일 생성 함수\n * \n * @param color - 색상 이름\n * @param config - 커스텀 스타일 설정 (선택사항)\n * @returns 생성된 색상 스타일 객체\n */\nexport function useColorStyles(\n color: Color,\n config?: Partial<ColorStyleConfig>\n): ColorStyles {\n const cacheKey = `${color}-${JSON.stringify(config || {})}`;\n \n if (!colorStylesCache.has(cacheKey)) {\n colorStylesCache.set(cacheKey, createColorStyles(color, config));\n }\n \n return colorStylesCache.get(cacheKey)!;\n}\n\n","/**\n * HUA UI 공통 Variant 시스템\n * 컴포넌트 variant 스타일 생성 유틸리티\n */\n\nimport type { ExtendedVariant, Size } from \"../types/common\";\nimport type { ColorStyles } from \"./colors\";\nimport { merge } from \"../utils\";\n\n/**\n * Variant 스타일 생성 함수\n * \n * @param variant - Variant 타입\n * @param colorStyles - 색상 스타일 객체\n * @returns 생성된 variant 클래스 문자열\n * \n * @example\n * ```tsx\n * const colorStyles = useColorStyles(\"blue\");\n * const variantClass = createVariantStyles(\"elevated\", colorStyles);\n * ```\n */\nexport function createVariantStyles(\n variant: ExtendedVariant,\n colorStyles: ColorStyles\n): string {\n const baseClasses = \"rounded-2xl border transition-all duration-200\";\n \n switch (variant) {\n case \"default\":\n return merge(baseClasses, colorStyles.default);\n \n case \"gradient\":\n return merge(baseClasses, \"text-white\", colorStyles.gradient);\n \n case \"outline\":\n return merge(baseClasses, colorStyles.outline);\n \n case \"elevated\":\n return merge(baseClasses, colorStyles.elevated);\n \n default:\n return baseClasses;\n }\n}\n\n/**\n * Size 스타일 설정 인터페이스\n */\nexport interface SizeStyles {\n container: string;\n icon: string;\n iconContainer: string;\n text: string;\n title: string;\n description: string;\n}\n\n/**\n * Size 스타일 생성 함수\n * \n * @param size - 크기 타입\n * @returns 생성된 size 스타일 객체\n * \n * @example\n * ```tsx\n * const sizeStyles = createSizeStyles(\"md\");\n * // sizeStyles.container, sizeStyles.icon 등 사용 가능\n * ```\n */\nexport function createSizeStyles(size: Size = \"md\"): SizeStyles {\n const sizeMap: Record<Size, SizeStyles> = {\n sm: {\n container: \"p-4\",\n icon: \"h-4 w-4\",\n iconContainer: \"w-8 h-8\",\n text: \"text-xs\",\n title: \"text-xs\",\n description: \"text-xs\",\n },\n md: {\n container: \"p-6\",\n icon: \"h-6 w-6\",\n iconContainer: \"w-12 h-12\",\n text: \"text-base\",\n title: \"text-sm\",\n description: \"text-sm\",\n },\n lg: {\n container: \"p-8\",\n icon: \"h-8 w-8\",\n iconContainer: \"w-16 h-16\",\n text: \"text-lg\",\n title: \"text-base\",\n description: \"text-base\",\n },\n xl: {\n container: \"p-10\",\n icon: \"h-10 w-10\",\n iconContainer: \"w-20 h-20\",\n text: \"text-xl\",\n title: \"text-lg\",\n description: \"text-lg\",\n },\n };\n \n return sizeMap[size];\n}\n\n/**\n * Rounded 스타일 타입\n */\nexport type Rounded = \"sm\" | \"md\" | \"lg\" | \"xl\" | \"full\" | \"none\";\n\n/**\n * Rounded 스타일 생성 함수\n * \n * @param rounded - Rounded 타입\n * @returns 생성된 rounded 클래스 문자열\n */\nexport function createRoundedStyles(rounded: Rounded = \"md\"): string {\n const roundedMap: Record<Rounded, string> = {\n sm: \"rounded\",\n md: \"rounded-md\",\n lg: \"rounded-lg\",\n xl: \"rounded-xl\",\n full: \"rounded-full\",\n none: \"rounded-none\",\n };\n \n return roundedMap[rounded];\n}\n\n/**\n * Shadow 스타일 타입\n */\nexport type Shadow = \"none\" | \"sm\" | \"md\" | \"lg\" | \"xl\" | \"2xl\";\n\n/**\n * Shadow 스타일 생성 함수\n * \n * @param shadow - Shadow 타입\n * @returns 생성된 shadow 클래스 문자열\n */\nexport function createShadowStyles(shadow: Shadow = \"md\"): string {\n if (shadow === \"none\") return \"\";\n \n return `shadow-${shadow}`;\n}\n\n/**\n * Hover 효과 타입\n */\nexport type HoverEffect = \"scale\" | \"glow\" | \"slide\" | \"none\";\n\n/**\n * Hover 효과 스타일 생성 함수\n * \n * @param hover - Hover 효과 타입\n * @param reducedMotion - 애니메이션 축소 설정 여부\n * @returns 생성된 hover 클래스 문자열\n */\nexport function createHoverStyles(\n hover: HoverEffect = \"scale\",\n reducedMotion: boolean = false\n): string {\n if (reducedMotion || hover === \"none\") return \"\";\n \n const hoverMap: Record<HoverEffect, string> = {\n scale: \"hover:scale-105 transition-transform duration-200\",\n glow: \"hover:shadow-2xl hover:shadow-blue-500/25 dark:hover:shadow-cyan-400/25 transition-shadow duration-300\",\n slide: \"hover:-translate-y-1 transition-transform duration-200\",\n none: \"\",\n };\n \n return hoverMap[hover];\n}\n\n","\"use client\";\n\nimport React, { useMemo } from \"react\";\nimport { merge } from \"../../lib/utils\";\nimport { Icon } from \"../Icon\";\nimport type { IconName } from \"../../lib/icons\";\nimport { useColorStyles } from \"../../lib/styles/colors\";\nimport { createVariantStyles } from \"../../lib/styles/variants\";\nimport type { Color } from \"../../lib/types/common\";\n\n/**\n * StatCard 컴포넌트의 props / StatCard component props\n * @typedef {Object} StatCardProps\n * @property {string} title - 카드 제목 / Card title\n * @property {string | number | null | undefined} value - 통계 값 / Statistic value\n * @property {string} [description] - 카드 설명 / Card description\n * @property {IconName | React.ReactNode} [icon] - 아이콘 / Icon\n * @property {Object} [trend] - 추세 정보 / Trend information\n * @property {number} trend.value - 추세 값 / Trend value\n * @property {string} trend.label - 추세 라벨 / Trend label\n * @property {boolean} [trend.positive] - 긍정적 추세 여부 / Positive trend\n * @property {\"default\" | \"gradient\" | \"outline\" | \"elevated\"} [variant=\"default\"] - 카드 스타일 변형 / Card style variant\n * @property {\"blue\" | \"purple\" | \"green\" | \"orange\" | \"red\" | \"indigo\" | \"pink\" | \"gray\"} [color] - 카드 색상 / Card color\n * @property {boolean} [loading] - 로딩 상태 / Loading state\n * @property {React.ReactNode} [emptyState] - 빈 상태 컴포넌트 / Empty state component\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface StatCardProps extends React.HTMLAttributes<HTMLDivElement> {\n title: string;\n value: string | number | null | undefined;\n description?: string;\n icon?: IconName | React.ReactNode;\n trend?: {\n value: number;\n label: string;\n positive?: boolean;\n };\n variant?: \"default\" | \"gradient\" | \"outline\" | \"elevated\";\n color?: Color;\n loading?: boolean;\n emptyState?: React.ReactNode;\n}\n\n\n/**\n * StatCard 컴포넌트 / StatCard component\n * \n * 통계 정보를 표시하는 카드 컴포넌트입니다.\n * 제목, 값, 설명, 아이콘, 추세 정보를 포함할 수 있습니다.\n * \n * Card component that displays statistic information.\n * Can include title, value, description, icon, and trend information.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <StatCard\n * title=\"총 사용자\"\n * value=\"1,234\"\n * description=\"지난 달 대비\"\n * icon=\"users\"\n * />\n * \n * @example\n * // 추세 정보 포함 / With trend information\n * <StatCard\n * title=\"매출\"\n * value=\"₩1,000,000\"\n * trend={{ value: 12.5, label: \"전월 대비\", positive: true }}\n * color=\"green\"\n * variant=\"gradient\"\n * />\n * \n * @param {StatCardProps} props - StatCard 컴포넌트의 props / StatCard component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} StatCard 컴포넌트 / StatCard component\n */\nexport const StatCard = React.forwardRef<HTMLDivElement, StatCardProps>(\n (\n {\n title,\n value,\n description,\n icon,\n trend,\n variant = \"elevated\",\n color = \"blue\",\n loading = false,\n emptyState,\n className,\n ...props\n },\n ref\n ) => {\n // 공통 색상 시스템 사용\n const colorStyles = useColorStyles(color);\n const isGradient = variant === \"gradient\";\n const isTextWhite = isGradient;\n\n // Variant 스타일 생성 (elevated는 rounded-3xl로 커스터마이징)\n const variantClass = useMemo(() => {\n const baseClass = createVariantStyles(variant, colorStyles);\n // elevated variant는 rounded-3xl 사용\n if (variant === \"elevated\") {\n return baseClass.replace(\"rounded-2xl\", \"rounded-3xl\");\n }\n return baseClass;\n }, [variant, colorStyles]);\n\n const formatValue = (val: string | number): string => {\n if (typeof val === \"number\") {\n return val.toLocaleString();\n }\n return val;\n };\n\n if (!loading && (value === null || value === undefined || value === \"\")) {\n return emptyState ? (\n <div className={className} {...props}>\n {emptyState}\n </div>\n ) : (\n <div className={merge(\"rounded-2xl border border-slate-100 dark:border-slate-800 p-6\", className)} {...props}>\n <h3 className=\"text-sm font-medium text-slate-500 dark:text-slate-400\">{title}</h3>\n <p className=\"mt-2 text-sm text-slate-400\">데이터가 없습니다.</p>\n </div>\n );\n }\n\n return (\n <div\n ref={ref}\n className={merge(\n \"p-6 transition-all duration-200 hover:shadow-xl\",\n variantClass,\n className\n )}\n {...props}\n >\n <div className=\"flex items-start justify-between mb-4\">\n {/* 아이콘 */}\n {icon && (\n <div className={merge(\n \"w-12 h-12 rounded-lg flex items-center justify-center flex-shrink-0\",\n isGradient ? \"bg-white/20\" : colorStyles.icon\n )}>\n {typeof icon === \"string\" ? (\n <Icon\n name={icon as IconName}\n className={merge(\n \"w-6 h-6\",\n isTextWhite ? \"text-white\" : \"\"\n )}\n />\n ) : (\n icon\n )}\n </div>\n )}\n\n {/* 배지 */}\n {title && (\n <span className={merge(\n \"text-sm px-3 py-1 rounded-full font-medium\",\n isGradient ? \"bg-white/20 text-white\" : colorStyles.badge\n )}>\n {title}\n </span>\n )}\n </div>\n\n {/* 값 */}\n {loading ? (\n <div className=\"h-10 bg-gray-200 dark:bg-gray-700 rounded animate-pulse mb-2\" />\n ) : (\n <h3 className={merge(\n \"text-3xl font-bold mb-1\",\n isTextWhite ? \"text-white\" : \"text-gray-800 dark:text-white\"\n )}>\n {formatValue(value ?? 0)}\n </h3>\n )}\n\n {/* 설명 */}\n {description && (\n <p className={merge(\n \"text-sm\",\n isTextWhite ? \"text-white/90\" : \"text-gray-600 dark:text-gray-300\"\n )}>\n {description}\n </p>\n )}\n\n {/* 트렌드 */}\n {trend && !loading && (\n <div className=\"mt-3 flex items-center gap-1\">\n <span\n className={merge(\n \"text-xs font-medium\",\n trend.positive !== false\n ? \"text-green-600 dark:text-green-400\"\n : \"text-red-600 dark:text-red-400\"\n )}\n >\n {trend.positive !== false ? \"↑\" : \"↓\"} {Math.abs(trend.value)}%\n </span>\n <span className={merge(\n \"text-xs\",\n isTextWhite ? \"text-white/70\" : \"text-gray-500 dark:text-gray-400\"\n )}>\n {trend.label}\n </span>\n </div>\n )}\n </div>\n );\n }\n);\n\nStatCard.displayName = \"StatCard\";\n\n","\"use client\";\n\nimport React, { useMemo } from \"react\";\nimport { merge } from \"../../lib/utils\";\nimport { Icon } from \"../Icon\";\nimport type { IconName } from \"../../lib/icons\";\nimport { useColorStyles } from \"../../lib/styles/colors\";\nimport type { Color } from \"../../lib/types/common\";\n\n/**\n * QuickActionCard 컴포넌트의 props / QuickActionCard component props\n * @typedef {Object} QuickActionCardProps\n * @property {string} title - 카드 제목 / Card title\n * @property {string} [description] - 카드 설명 / Card description\n * @property {IconName | React.ReactNode} [icon] - 아이콘 / Icon\n * @property {string} [href] - 링크 URL / Link URL\n * @property {() => void} [onClick] - 클릭 핸들러 / Click handler\n * @property {\"gradient\" | \"outline\" | \"solid\"} [variant=\"gradient\"] - 카드 스타일 변형 / Card style variant\n * @property {\"blue\" | \"purple\" | \"green\" | \"orange\" | \"red\" | \"indigo\" | \"pink\" | \"gray\"} [color=\"blue\"] - 카드 색상 / Card color\n * @property {boolean} [loading] - 로딩 상태 / Loading state\n * @extends {React.HTMLAttributes<HTMLAnchorElement | HTMLButtonElement>}\n */\nexport interface QuickActionCardProps extends React.HTMLAttributes<HTMLAnchorElement | HTMLButtonElement> {\n title: string;\n description?: string;\n icon?: IconName | React.ReactNode;\n href?: string;\n onClick?: () => void;\n variant?: \"gradient\" | \"outline\" | \"solid\";\n color?: Color;\n loading?: boolean;\n}\n\n\n/**\n * QuickActionCard 컴포넌트 / QuickActionCard component\n * \n * 빠른 액션을 수행하는 카드 컴포넌트입니다.\n * 링크나 버튼으로 동작하며, 클릭 가능한 액션 카드로 사용됩니다.\n * \n * Card component for quick actions.\n * Works as a link or button, used as a clickable action card.\n * \n * @component\n * @example\n * // 링크 카드 / Link card\n * <QuickActionCard\n * title=\"새 주문 생성\"\n * description=\"주문을 빠르게 생성하세요\"\n * icon=\"plus\"\n * href=\"/orders/new\"\n * color=\"blue\"\n * />\n * \n * @example\n * // 버튼 카드 / Button card\n * <QuickActionCard\n * title=\"리포트 다운로드\"\n * description=\"최신 리포트를 다운로드하세요\"\n * icon=\"download\"\n * onClick={handleDownload}\n * variant=\"outline\"\n * color=\"green\"\n * />\n * \n * @param {QuickActionCardProps} props - QuickActionCard 컴포넌트의 props / QuickActionCard component props\n * @param {React.Ref<HTMLAnchorElement | HTMLButtonElement>} ref - anchor 또는 button 요소 ref / anchor or button element ref\n * @returns {JSX.Element} QuickActionCard 컴포넌트 / QuickActionCard component\n */\nexport const QuickActionCard = React.forwardRef<\n HTMLAnchorElement | HTMLButtonElement,\n QuickActionCardProps\n>(\n (\n {\n title,\n description,\n icon,\n href,\n onClick,\n variant = \"gradient\",\n color = \"blue\",\n loading = false,\n className,\n ...props\n },\n ref\n ) => {\n // 공통 색상 시스템 사용\n const colorStyles = useColorStyles(color);\n const isGradient = variant === \"gradient\";\n const isTextWhite = isGradient || variant === \"solid\";\n\n // Variant 스타일 생성 (QuickActionCard는 gradient, outline, solid만 사용)\n const variantClass = useMemo(() => {\n if (variant === \"gradient\") {\n // gradient는 공통 시스템 사용\n return `text-white ${colorStyles.gradient}`;\n } else if (variant === \"outline\") {\n // outline은 공통 시스템 사용\n return colorStyles.outline;\n } else {\n // solid는 별도 처리 (정적 클래스 사용)\n const solidClasses: Record<Color, string> = {\n blue: \"text-white bg-blue-600 hover:bg-blue-700\",\n purple: \"text-white bg-purple-600 hover:bg-purple-700\",\n green: \"text-white bg-green-600 hover:bg-green-700\",\n orange: \"text-white bg-orange-600 hover:bg-orange-700\",\n red: \"text-white bg-red-600 hover:bg-red-700\",\n indigo: \"text-white bg-indigo-600 hover:bg-indigo-700\",\n pink: \"text-white bg-pink-600 hover:bg-pink-700\",\n gray: \"text-white bg-gray-600 hover:bg-gray-700\",\n };\n return solidClasses[color];\n }\n }, [variant, colorStyles, color]);\n\n const baseClasses = merge(\n \"rounded-2xl p-6 transition-all shadow-lg hover:shadow-xl text-center\",\n variantClass,\n className\n );\n\n const content = (\n <>\n {/* 아이콘 */}\n {icon && (\n <div className={merge(\n \"w-12 h-12 rounded-lg flex items-center justify-center mx-auto mb-2\",\n isGradient || variant === \"solid\"\n ? \"bg-white/20\"\n : variant === \"outline\"\n ? colorStyles.icon\n : \"\"\n )}>\n {typeof icon === \"string\" ? (\n <Icon\n name={icon as IconName}\n className={merge(\n \"w-6 h-6\",\n isTextWhite ? \"text-white\" : \"\"\n )}\n />\n ) : (\n icon\n )}\n </div>\n )}\n\n {/* 제목 */}\n <h3 className={merge(\n \"text-xl font-semibold mb-1\",\n isTextWhite ? \"text-white\" : \"\"\n )}>\n {title}\n </h3>\n\n {/* 설명 */}\n {description && (\n <p className={merge(\n \"text-sm\",\n isTextWhite ? \"text-white/90\" : \"text-gray-600 dark:text-gray-300\"\n )}>\n {description}\n </p>\n )}\n\n {loading && (\n <div className=\"mt-2 h-4 bg-white/20 rounded animate-pulse\" />\n )}\n </>\n );\n\n if (href) {\n return (\n <a\n ref={ref as React.Ref<HTMLAnchorElement>}\n href={href}\n className={baseClasses}\n {...(props as React.AnchorHTMLAttributes<HTMLAnchorElement>)}\n >\n {content}\n </a>\n );\n }\n\n return (\n <button\n ref={ref as React.Ref<HTMLButtonElement>}\n onClick={onClick}\n className={baseClasses}\n {...(props as React.ButtonHTMLAttributes<HTMLButtonElement>)}\n >\n {content}\n </button>\n );\n }\n);\n\nQuickActionCard.displayName = \"QuickActionCard\";\n\n","\"use client\";\n\nimport React from \"react\";\nimport { merge } from \"../../lib/utils\";\n\n/**\n * DashboardGrid 컴포넌트의 props\n * @typedef {Object} DashboardGridProps\n * @property {1 | 2 | 3 | 4 | 5 | 6} [columns=4] - 그리드 컬럼 수\n * @property {\"sm\" | \"md\" | \"lg\" | \"xl\"} [gap=\"md\"] - 그리드 간격\n * @property {boolean} [responsive=true] - 반응형 여부\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface DashboardGridProps extends React.HTMLAttributes<HTMLDivElement> {\n columns?: 1 | 2 | 3 | 4 | 5 | 6;\n gap?: \"sm\" | \"md\" | \"lg\" | \"xl\";\n responsive?: boolean;\n}\n\nconst gapClasses = {\n sm: \"gap-3\",\n md: \"gap-6\",\n lg: \"gap-8\",\n xl: \"gap-12\",\n};\n\nconst columnClasses = {\n 1: \"grid-cols-1\",\n 2: \"grid-cols-1 md:grid-cols-2\",\n 3: \"grid-cols-1 md:grid-cols-2 lg:grid-cols-3\",\n 4: \"grid-cols-1 md:grid-cols-2 lg:grid-cols-4\",\n 5: \"grid-cols-1 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-5\",\n 6: \"grid-cols-1 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-6\",\n};\n\n// 비반응형용 고정 클래스 (Tailwind 동적 클래스 생성 문제 해결)\nconst fixedColumnClasses: Record<1 | 2 | 3 | 4 | 5 | 6, string> = {\n 1: \"grid-cols-1\",\n 2: \"grid-cols-2\",\n 3: \"grid-cols-3\",\n 4: \"grid-cols-4\",\n 5: \"grid-cols-5\",\n 6: \"grid-cols-6\",\n};\n\n/**\n * DashboardGrid 컴포넌트\n * \n * 대시보드 그리드 레이아웃을 제공하는 컴포넌트입니다.\n * 반응형 그리드를 지원하며, 다양한 컬럼 수와 간격을 설정할 수 있습니다.\n * \n * Dashboard grid layout component.\n * Supports responsive grid with configurable column count and gap sizes.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <DashboardGrid columns={4}>\n * <StatCard title=\"항목 1\" value=\"100\" />\n * <StatCard title=\"항목 2\" value=\"200\" />\n * </DashboardGrid>\n * \n * @example\n * // 반응형 그리드 / Responsive grid\n * <DashboardGrid columns={3} gap=\"lg\" responsive>\n * <MetricCard title=\"메트릭 1\" value=\"1,000\" />\n * <MetricCard title=\"메트릭 2\" value=\"2,000\" />\n * </DashboardGrid>\n * \n * @param {DashboardGridProps} props - DashboardGrid 컴포넌트의 props / DashboardGrid component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} DashboardGrid 컴포넌트 / DashboardGrid component\n */\nexport const DashboardGrid = React.forwardRef<HTMLDivElement, DashboardGridProps>(\n (\n {\n columns = 4,\n gap = \"md\",\n responsive = true,\n className,\n children,\n ...props\n },\n ref\n ) => {\n const gridClasses = responsive\n ? columnClasses[columns]\n : fixedColumnClasses[columns];\n\n return (\n <div\n ref={ref}\n className={merge(\n \"grid\",\n gridClasses,\n gapClasses[gap],\n className\n )}\n {...props}\n >\n {children}\n </div>\n );\n }\n);\n\nDashboardGrid.displayName = \"DashboardGrid\";\n\n","\"use client\";\n\nimport React from \"react\";\nimport { merge, formatRelativeTime } from \"../../lib/utils\";\nimport { Icon } from \"../Icon\";\nimport type { IconName } from \"../../lib/icons\";\n\n/**\n * ActivityItem 인터페이스 / ActivityItem interface\n * @typedef {Object} ActivityItem\n * @property {string} id - 활동 항목 고유 ID / Activity item unique ID\n * @property {string} title - 활동 제목 / Activity title\n * @property {string} [description] - 활동 설명 / Activity description\n * @property {Date | string} timestamp - 활동 타임스탬프 / Activity timestamp\n * @property {IconName | React.ReactNode} [icon] - 아이콘 / Icon\n * @property {string | React.ReactNode} [badge] - 배지 / Badge\n * @property {() => void} [onClick] - 클릭 핸들러 / Click handler\n * @property {Record<string, unknown>} [metadata] - 추가 메타데이터 / Additional metadata\n */\nexport interface ActivityItem {\n id: string;\n title: string;\n description?: string;\n timestamp: Date | string;\n icon?: IconName | React.ReactNode;\n badge?: string | React.ReactNode;\n onClick?: () => void;\n metadata?: Record<string, unknown>;\n}\n\n/**\n * ActivityFeed 컴포넌트의 props / ActivityFeed component props\n * @typedef {Object} ActivityFeedProps\n * @property {string} [title] - 피드 제목 / Feed title\n * @property {ActivityItem[]} items - 활동 항목 배열 / Activity items array\n * @property {string} [emptyMessage=\"활동 내역이 없습니다.\"] - 빈 상태 메시지 / Empty state message\n * @property {boolean} [showHeader=true] - 헤더 표시 여부 / Show header\n * @property {number} [maxItems] - 최대 표시 항목 수 / Maximum items to display\n * @property {() => void} [onViewAll] - 전체 보기 핸들러 / View all handler\n * @property {string} [viewAllLabel=\"전체 보기\"] - 전체 보기 라벨 / View all label\n * @property {React.ReactNode} [emptyState] - 빈 상태 컴포넌트 / Empty state component\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface ActivityFeedProps extends React.HTMLAttributes<HTMLDivElement> {\n title?: string;\n items: ActivityItem[];\n emptyMessage?: string;\n showHeader?: boolean;\n maxItems?: number;\n onViewAll?: () => void;\n viewAllLabel?: string;\n emptyState?: React.ReactNode;\n}\n\n/**\n * ActivityFeed 컴포넌트 / ActivityFeed component\n * \n * 활동 내역을 표시하는 피드 컴포넌트입니다.\n * 타임스탬프를 상대 시간으로 표시하며, 최대 항목 수 제한을 지원합니다.\n * \n * Feed component that displays activity history.\n * Shows timestamps as relative time and supports maximum items limit.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <ActivityFeed\n * title=\"최근 활동\"\n * items={[\n * {\n * id: \"1\",\n * title: \"새 주문 생성\",\n * description: \"주문 #1234\",\n * timestamp: new Date(),\n * icon: \"shoppingCart\"\n * }\n * ]}\n * />\n * \n * @example\n * // 최대 항목 수 제한 / Maximum items limit\n * <ActivityFeed\n * title=\"활동 내역\"\n * items={activities}\n * maxItems={10}\n * onViewAll={() => navigate(\"/activities\")}\n * />\n * \n * @param {ActivityFeedProps} props - ActivityFeed 컴포넌트의 props / ActivityFeed component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} ActivityFeed 컴포넌트 / ActivityFeed component\n */\nexport const ActivityFeed = React.forwardRef<HTMLDivElement, ActivityFeedProps>(\n (\n {\n title,\n items,\n emptyMessage = \"활동 내역이 없습니다.\",\n showHeader = true,\n maxItems,\n onViewAll,\n viewAllLabel = \"전체 보기\",\n emptyState,\n className,\n ...props\n },\n ref\n ) => {\n const displayItems = maxItems ? items.slice(0, maxItems) : items;\n const hasMore = maxItems && items.length > maxItems;\n\n return (\n <div\n ref={ref}\n className={merge(\n \"bg-white dark:bg-gray-800 rounded-2xl shadow-lg border border-gray-200 dark:border-gray-700\",\n className\n )}\n {...props}\n >\n {/* 헤더 */}\n {showHeader && title && (\n <div className=\"flex items-center justify-between p-6 border-b border-gray-200 dark:border-gray-700\">\n <h2 className=\"text-xl font-bold text-gray-800 dark:text-white flex items-center\">\n {title}\n </h2>\n {onViewAll && (\n <button\n onClick={onViewAll}\n aria-label={`${viewAllLabel} - ${title || \"활동 내역\"}`}\n className=\"text-purple-600 dark:text-purple-400 hover:text-purple-700 dark:hover:text-purple-300 font-medium text-sm transition-colors\"\n >\n {viewAllLabel} →\n </button>\n )}\n </div>\n )}\n\n {/* 활동 목록 */}\n {displayItems.length > 0 ? (\n <div className=\"divide-y divide-gray-200 dark:divide-gray-700\">\n {displayItems.map((item) => (\n <div\n key={item.id}\n onClick={item.onClick}\n className={merge(\n \"p-4 transition-colors\",\n item.onClick && \"hover:bg-gray-50 dark:hover:bg-gray-700/50 cursor-pointer group\"\n )}\n >\n <div className=\"flex items-start justify-between mb-2\">\n <div className=\"flex-1 min-w-0\">\n {/* 아이콘과 제목 */}\n <div className=\"flex items-start gap-3\">\n {item.icon && (\n <div className=\"w-8 h-8 rounded-lg bg-purple-100 dark:bg-purple-900/30 flex items-center justify-center flex-shrink-0 mt-0.5\">\n {typeof item.icon === \"string\" ? (\n <Icon\n name={item.icon as IconName}\n className=\"w-4 h-4 text-purple-600 dark:text-purple-400\"\n />\n ) : (\n item.icon\n )}\n </div>\n )}\n <div className=\"flex-1 min-w-0\">\n <h3 className=\"text-base font-semibold text-gray-800 dark:text-white mb-1 truncate\">\n {item.title}\n </h3>\n {item.description && (\n <p className=\"text-sm text-gray-600 dark:text-gray-300 line-clamp-2\">\n {item.description}\n </p>\n )}\n </div>\n </div>\n </div>\n\n {/* 배지 */}\n {item.badge && (\n <div className=\"ml-2 flex-shrink-0\">\n {typeof item.badge === \"string\" ? (\n <span className=\"px-2 py-1 rounded-full text-xs font-medium bg-green-100 dark:bg-green-900/30 text-green-700 dark:text-green-300\">\n {item.badge}\n </span>\n ) : (\n item.badge\n )}\n </div>\n )}\n </div>\n\n {/* 메타데이터 */}\n {item.metadata && Object.keys(item.metadata).length > 0 && (\n <div className=\"flex items-center gap-1 flex-wrap mt-2\">\n {Object.entries(item.metadata).map(([key, value]) => (\n <span\n key={key}\n className=\"text-xs bg-purple-100 dark:bg-purple-900/30 text-purple-700 dark:text-purple-300 px-2 py-0.5 rounded\"\n >\n {key}: {String(value)}\n </span>\n ))}\n </div>\n )}\n\n {/* 타임스탬프 */}\n <p className=\"text-xs text-gray-500 dark:text-gray-400 mt-2\">\n <time dateTime={item.timestamp instanceof Date ? item.timestamp.toISOString() : typeof item.timestamp === 'string' ? item.timestamp : undefined}>\n {formatRelativeTime(item.timestamp)}\n </time>\n </p>\n </div>\n ))}\n\n {/* 더 보기 */}\n {hasMore && (\n <div className=\"p-4 text-center border-t border-gray-200 dark:border-gray-700\">\n <button\n onClick={onViewAll}\n aria-label={`더 많은 활동 보기 - ${items.length - (maxItems || 0)}개 더`}\n className=\"inline-flex items-center text-sm text-purple-600 dark:text-purple-400 hover:text-purple-700 dark:hover:text-purple-300 font-medium transition-colors\"\n >\n <span>더 많은 활동 보기</span>\n <span className=\"ml-1\">({items.length - (maxItems || 0)}개 더)</span>\n <span className=\"ml-1\">→</span>\n </button>\n </div>\n )}\n </div>\n ) : emptyState ? (\n emptyState\n ) : (\n <div className=\"text-center py-8\">\n <span className=\"text-4xl mb-3 block\">📭</span>\n <p className=\"text-gray-500 dark:text-gray-400 text-sm\">{emptyMessage}</p>\n </div>\n )}\n </div>\n );\n }\n);\n\nActivityFeed.displayName = \"ActivityFeed\";\n\n","\"use client\";\n\nimport React from \"react\";\nimport { merge } from \"../../lib/utils\";\nimport { Icon } from \"../Icon\";\nimport type { IconName } from \"../../lib/icons\";\n\n/**\n * 멤버십 등급 인터페이스\n * @typedef {Object} MembershipTier\n * @property {\"basic\" | \"pro\" | \"premium\" | \"admin\"} tier - 등급\n * @property {string} label - 등급 라벨\n */\nexport interface MembershipTier {\n tier: \"basic\" | \"pro\" | \"premium\" | \"admin\";\n label: string;\n}\n\n/**\n * ProfileCard 컴포넌트의 props / ProfileCard component props\n * @typedef {Object} ProfileCardProps\n * @property {string} name - 사용자 이름 / User name\n * @property {string} [email] - 이메일 / Email\n * @property {string} [avatar] - 아바타 이미지 URL / Avatar image URL\n * @property {string} [avatarAlt] - 아바타 대체 텍스트 / Avatar alt text\n * @property {string} [greeting] - 인사말 / Greeting\n * @property {Date | string} [memberSince] - 가입일 / Member since date\n * @property {MembershipTier[\"tier\"]} [membershipTier] - 멤버십 등급 / Membership tier\n * @property {string} [membershipLabel] - 멤버십 라벨 / Membership label\n * @property {() => void} [onSettingsClick] - 설정 클릭 핸들러 / Settings click handler\n * @property {string} [settingsHref] - 설정 링크 URL / Settings link URL\n * @property {\"default\" | \"gradient\" | \"minimal\"} [variant=\"default\"] - 스타일 변형 / Style variant\n * @property {boolean} [showAvatar=true] - 아바타 표시 여부 / Show avatar\n * @property {boolean} [showMembership=true] - 멤버십 표시 여부 / Show membership\n * @property {boolean} [showSettings=true] - 설정 버튼 표시 여부 / Show settings button\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface ProfileCardProps extends React.HTMLAttributes<HTMLDivElement> {\n name: string;\n email?: string;\n avatar?: string;\n avatarAlt?: string;\n greeting?: string;\n memberSince?: Date | string;\n membershipTier?: MembershipTier[\"tier\"];\n membershipLabel?: string;\n onSettingsClick?: () => void;\n settingsHref?: string;\n variant?: \"default\" | \"gradient\" | \"minimal\";\n showAvatar?: boolean;\n showMembership?: boolean;\n showSettings?: boolean;\n}\n\nconst tierStyles = {\n basic: {\n badge: \"bg-gradient-to-r from-blue-500 to-cyan-500 text-white\",\n icon: \"text-blue-600 dark:text-blue-400\",\n },\n pro: {\n badge: \"bg-gradient-to-r from-purple-500 to-pink-500 text-white\",\n icon: \"text-purple-600 dark:text-purple-400\",\n },\n premium: {\n badge: \"bg-gradient-to-r from-yellow-400 to-orange-500 text-white\",\n icon: \"text-yellow-600 dark:text-yellow-400\",\n },\n admin: {\n badge: \"bg-gradient-to-r from-red-500 to-pink-500 text-white\",\n icon: \"text-red-600 dark:text-red-400\",\n },\n};\n\nconst tierLabels = {\n basic: \"Basic\",\n pro: \"Pro\",\n premium: \"Premium\",\n admin: \"Admin\",\n};\n\n/**\n * ProfileCard 컴포넌트\n * \n * 사용자 프로필 정보를 표시하는 카드 컴포넌트입니다.\n * 아바타, 이름, 이메일, 멤버십 등급 등을 표시할 수 있습니다.\n * \n * Card component that displays user profile information.\n * Can show avatar, name, email, membership tier, and more.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <ProfileCard\n * name=\"홍길동\"\n * email=\"hong@example.com\"\n * avatar=\"/avatar.jpg\"\n * membershipTier=\"premium\"\n * memberSince={new Date(\"2024-01-01\")}\n * />\n * \n * @example\n * // 그라디언트 스타일 / Gradient style\n * <ProfileCard\n * name=\"김철수\"\n * greeting=\"안녕하세요\"\n * variant=\"gradient\"\n * membershipTier=\"pro\"\n * onSettingsClick={() => navigate(\"/settings\")}\n * />\n * \n * @param {ProfileCardProps} props - ProfileCard 컴포넌트의 props / ProfileCard component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} ProfileCard 컴포넌트 / ProfileCard component\n */\nexport const ProfileCard = React.forwardRef<HTMLDivElement, ProfileCardProps>(\n (\n {\n name,\n email,\n avatar,\n avatarAlt,\n greeting,\n memberSince,\n membershipTier,\n membershipLabel,\n onSettingsClick,\n settingsHref,\n variant = \"default\",\n showAvatar = true,\n showMembership = true,\n showSettings = true,\n className,\n ...props\n },\n ref\n ) => {\n const formatDate = (date: Date | string): string => {\n const d = typeof date === \"string\" ? new Date(date) : date;\n return d.toLocaleDateString(\"ko-KR\", {\n year: \"numeric\",\n month: \"long\",\n day: \"numeric\",\n });\n };\n\n const tier = membershipTier || \"basic\";\n const tierStyle = tierStyles[tier];\n const tierLabel = membershipLabel || tierLabels[tier];\n\n const variantClasses = {\n default: \"bg-white dark:bg-gray-800 rounded-2xl shadow-lg border border-gray-200 dark:border-gray-700\",\n gradient: \"bg-gradient-to-br from-blue-50 via-purple-50 to-pink-50 dark:from-gray-800 dark:via-gray-800 dark:to-gray-900 rounded-2xl shadow-xl border border-white/20 dark:border-gray-700/20\",\n minimal: \"bg-transparent\",\n };\n\n return (\n <div\n ref={ref}\n className={merge(\n \"relative overflow-hidden p-6\",\n variantClasses[variant],\n className\n )}\n {...props}\n >\n {/* 그라데이션 배경 장식 (gradient variant일 때) */}\n {variant === \"gradient\" && (\n <>\n <div className=\"absolute inset-0 bg-gradient-to-br from-blue-500 via-purple-500 to-pink-500 opacity-10 dark:opacity-20\"></div>\n <div className=\"absolute inset-0 bg-gradient-to-tr from-cyan-400 via-blue-500 to-purple-600 opacity-5 dark:opacity-15\"></div>\n </>\n )}\n\n <div className=\"relative flex items-start gap-6\">\n {/* 설정 아이콘 */}\n {showSettings && (onSettingsClick || settingsHref) && (\n <div className=\"absolute top-0 right-0\">\n {settingsHref ? (\n <a\n href={settingsHref}\n className=\"p-2 text-gray-400 dark:text-gray-300 hover:text-blue-600 dark:hover:text-blue-400 transition-colors\"\n title=\"설정\"\n >\n <Icon name=\"settings\" className=\"w-6 h-6\" />\n </a>\n ) : (\n <button\n onClick={onSettingsClick}\n className=\"p-2 text-gray-400 dark:text-gray-300 hover:text-blue-600 dark:hover:text-blue-400 transition-colors\"\n title=\"설정\"\n >\n <Icon name=\"settings\" className=\"w-6 h-6\" />\n </button>\n )}\n </div>\n )}\n\n {/* 아바타 */}\n {showAvatar && (\n <div className=\"relative flex-shrink-0\">\n {avatar ? (\n <img\n src={avatar}\n alt={avatarAlt || name}\n className=\"w-20 h-20 rounded-full border-4 border-white dark:border-gray-700 shadow-lg object-cover\"\n />\n ) : (\n <div className=\"w-20 h-20 rounded-full bg-gradient-to-br from-blue-500 to-purple-600 flex items-center justify-center border-4 border-white dark:border-gray-700 shadow-lg\">\n <span className=\"text-2xl font-bold text-white\">\n {name.charAt(0).toUpperCase()}\n </span>\n </div>\n )}\n </div>\n )}\n\n {/* 정보 */}\n <div className=\"flex-1 min-w-0\">\n {/* 인사말 */}\n {greeting && (\n <div className=\"text-lg sm:text-xl font-semibold mb-2\">\n {greeting.split(\" \").map((part, index) => {\n const isEmoji = /[\\u{1F600}-\\u{1F64F}]|[\\u{1F300}-\\u{1F5FF}]|[\\u{1F680}-\\u{1F6FF}]|[\\u{1F1E0}-\\u{1F1FF}]|[\\u{2600}-\\u{26FF}]|[\\u{2700}-\\u{27BF}]/u.test(part);\n return (\n <span key={index}>\n {isEmoji ? (\n <span className=\"text-gray-900 dark:text-white\">{part}</span>\n ) : (\n <span className=\"text-xl sm:text-2xl font-bold bg-gradient-to-r from-blue-500 to-purple-500 bg-clip-text text-transparent\">\n {part}\n </span>\n )}\n {index < greeting.split(\" \").length - 1 && \" \"}\n </span>\n );\n })}\n </div>\n )}\n\n {/* 이름과 멤버십 뱃지 */}\n <div className=\"flex flex-wrap items-center gap-2 sm:gap-3 mb-2\">\n <span className=\"text-xl sm:text-2xl font-bold text-gray-900 dark:text-white truncate\">\n {name}!\n </span>\n {showMembership && membershipTier && (\n <span\n className={merge(\n \"inline-flex items-center px-3 py-1 rounded-full text-xs font-semibold shadow-lg\",\n tierStyle.badge\n )}\n >\n <svg className=\"w-3 h-3 mr-1\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n {tier === \"premium\" ? (\n <path d=\"M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z\" />\n ) : tier === \"admin\" ? (\n <path fillRule=\"evenodd\" d=\"M11.49 3.17c-.38-1.56-2.6-1.56-2.98 0a1.532 1.532 0 01-2.286.948c-1.372-.836-2.942.734-2.106 2.106.54.886.061 2.042-.947 2.287-1.561.379-1.561 2.6 0 2.978a1.532 1.532 0 012.287.947c.379 1.561 2.6 1.561 2.978 0a1.533 1.533 0 012.287-.947c1.372.836 2.942-.734 2.106-2.106a1.533 1.533 0 01.947-2.287c1.561-.379 1.561-2.6 0-2.978a1.532 1.532 0 01-.947-2.287c.836-1.372-.734-2.942-2.106-2.106a1.532 1.532 0 01-2.287-.947zM10 13a3 3 0 100-6 3 3 0 000 6z\" clipRule=\"evenodd\" />\n ) : (\n <path fillRule=\"evenodd\" d=\"M6.267 3.455a3.066 3.066 0 001.745-.723 3.066 3.066 0 013.976 0 3.066 3.066 0 001.745.723 3.066 3.066 0 012.812 2.812c.051.643.304 1.254.723 1.745a3.066 3.066 0 010 3.976 3.066 3.066 0 00-.723 1.745 3.066 3.066 0 01-2.812 2.812 3.066 3.066 0 00-1.745.723 3.066 3.066 0 01-3.976 0 3.066 3.066 0 00-1.745-.723 3.066 3.066 0 01-2.812-2.812 3.066 3.066 0 00-.723-1.745 3.066 3.066 0 010-3.976 3.066 3.066 0 00.723-1.745 3.066 3.066 0 012.812-2.812zm7.44 5.252a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z\" clipRule=\"evenodd\" />\n )}\n </svg>\n {tierLabel}\n </span>\n )}\n </div>\n\n {/* 이메일 */}\n {email && (\n <div className=\"text-gray-600 dark:text-gray-400 text-sm mb-1 truncate\">\n {email}\n </div>\n )}\n\n {/* 가입일 */}\n {memberSince && (\n <div className=\"text-gray-400 text-xs flex items-center gap-1\">\n <Icon name=\"clock\" className=\"w-3 h-3\" />\n 가입일 {formatDate(memberSince)}\n </div>\n )}\n </div>\n </div>\n </div>\n );\n }\n);\n\nProfileCard.displayName = \"ProfileCard\";\n\n","\"use client\";\n\nimport React from \"react\";\nimport { merge } from \"../../lib/utils\";\n\n/**\n * MembershipBadge 컴포넌트의 props / MembershipBadge component props\n * @typedef {Object} MembershipBadgeProps\n * @property {\"basic\" | \"pro\" | \"premium\" | \"admin\"} tier - 멤버십 등급 / Membership tier\n * @property {string} [label] - 커스텀 라벨 (기본값: 등급별 라벨) / Custom label (default: tier-specific label)\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - 배지 크기 / Badge size\n * @property {boolean} [showIcon=true] - 아이콘 표시 여부 / Show icon\n * @extends {React.HTMLAttributes<HTMLSpanElement>}\n */\nexport interface MembershipBadgeProps extends React.HTMLAttributes<HTMLSpanElement> {\n tier: \"basic\" | \"pro\" | \"premium\" | \"admin\";\n label?: string;\n size?: \"sm\" | \"md\" | \"lg\";\n showIcon?: boolean;\n}\n\nconst tierConfig = {\n basic: {\n gradient: \"bg-gradient-to-r from-blue-500 to-cyan-500\",\n label: \"Basic\",\n },\n pro: {\n gradient: \"bg-gradient-to-r from-purple-500 to-pink-500\",\n label: \"Pro\",\n },\n premium: {\n gradient: \"bg-gradient-to-r from-yellow-400 to-orange-500\",\n label: \"Premium\",\n },\n admin: {\n gradient: \"bg-gradient-to-r from-red-500 to-pink-500\",\n label: \"Admin\",\n },\n};\n\nconst sizeClasses = {\n sm: {\n container: \"px-2 py-0.5 text-xs\",\n icon: \"w-2.5 h-2.5\",\n },\n md: {\n container: \"px-3 py-1 text-xs\",\n icon: \"w-3 h-3\",\n },\n lg: {\n container: \"px-4 py-1.5 text-sm\",\n icon: \"w-4 h-4\",\n },\n};\n\n/**\n * MembershipBadge 컴포넌트\n * \n * 멤버십 등급을 표시하는 배지 컴포넌트입니다.\n * 등급별로 다른 그라디언트 색상과 아이콘을 제공합니다.\n * \n * Badge component that displays membership tier.\n * Provides different gradient colors and icons for each tier.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <MembershipBadge tier=\"premium\" />\n * \n * @example\n * // 커스텀 라벨과 크기 / Custom label and size\n * <MembershipBadge\n * tier=\"pro\"\n * label=\"프로 플랜\"\n * size=\"lg\"\n * showIcon={false}\n * />\n * \n * @param {MembershipBadgeProps} props - MembershipBadge 컴포넌트의 props / MembershipBadge component props\n * @param {React.Ref<HTMLSpanElement>} ref - span 요소 ref / span element ref\n * @returns {JSX.Element} MembershipBadge 컴포넌트 / MembershipBadge component\n */\nexport const MembershipBadge = React.forwardRef<HTMLSpanElement, MembershipBadgeProps>(\n (\n {\n tier,\n label,\n size = \"md\",\n showIcon = true,\n className,\n ...props\n },\n ref\n ) => {\n const config = tierConfig[tier];\n const sizeStyle = sizeClasses[size];\n const displayLabel = label || config.label;\n\n const getIcon = () => {\n if (!showIcon) return null;\n\n if (tier === \"premium\") {\n return (\n <svg className={sizeStyle.icon} fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path d=\"M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z\" />\n </svg>\n );\n }\n\n if (tier === \"admin\") {\n return (\n <svg className={sizeStyle.icon} fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fillRule=\"evenodd\" d=\"M11.49 3.17c-.38-1.56-2.6-1.56-2.98 0a1.532 1.532 0 01-2.286.948c-1.372-.836-2.942.734-2.106 2.106.54.886.061 2.042-.947 2.287-1.561.379-1.561 2.6 0 2.978a1.532 1.532 0 012.287.947c.379 1.561 2.6 1.561 2.978 0a1.533 1.533 0 012.287-.947c1.372.836 2.942-.734 2.106-2.106a1.533 1.533 0 01.947-2.287c1.561-.379 1.561-2.6 0-2.978a1.532 1.532 0 01-.947-2.287c.836-1.372-.734-2.942-2.106-2.106a1.532 1.532 0 01-2.287-.947zM10 13a3 3 0 100-6 3 3 0 000 6z\" clipRule=\"evenodd\" />\n </svg>\n );\n }\n\n return (\n <svg className={sizeStyle.icon} fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fillRule=\"evenodd\" d=\"M6.267 3.455a3.066 3.066 0 001.745-.723 3.066 3.066 0 013.976 0 3.066 3.066 0 001.745.723 3.066 3.066 0 012.812 2.812c.051.643.304 1.254.723 1.745a3.066 3.066 0 010 3.976 3.066 3.066 0 00-.723 1.745 3.066 3.066 0 01-2.812 2.812 3.066 3.066 0 00-1.745.723 3.066 3.066 0 01-3.976 0 3.066 3.066 0 00-1.745-.723 3.066 3.066 0 01-2.812-2.812 3.066 3.066 0 00-.723-1.745 3.066 3.066 0 010-3.976 3.066 3.066 0 00.723-1.745 3.066 3.066 0 012.812-2.812zm7.44 5.252a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z\" clipRule=\"evenodd\" />\n </svg>\n );\n };\n\n return (\n <span\n ref={ref}\n className={merge(\n \"inline-flex items-center rounded-full font-semibold text-white shadow-lg\",\n config.gradient,\n sizeStyle.container,\n className\n )}\n {...props}\n >\n {showIcon && <span className=\"mr-1\">{getIcon()}</span>}\n {displayLabel}\n </span>\n );\n }\n);\n\nMembershipBadge.displayName = \"MembershipBadge\";\n\n","\"use client\";\n\nimport React from \"react\";\nimport { merge } from \"../../lib/utils\";\nimport type { Color } from \"../../lib/types/common\";\n\n/**\n * MiniBarChart 컴포넌트의 props\n * @typedef {Object} MiniBarChartProps\n * @property {number[]} data - 차트 데이터 배열\n * @property {string[]} [labels] - 라벨 배열\n * @property {number} [maxValue] - 최대값 (자동 계산 시 생략)\n * @property {number} [height=160] - 차트 높이 (px)\n * @property {boolean} [showTooltip=true] - 툴팁 표시 여부\n * @property {boolean} [showStats=true] - 통계 정보 표시 여부\n * @property {\"blue\" | \"purple\" | \"green\" | \"orange\" | \"red\" | \"indigo\" | \"pink\" | \"gray\"} [color=\"blue\"] - 색상\n * @property {boolean} [highlightToday=true] - 오늘 항목 강조 여부\n * @property {number} [todayIndex] - 오늘 인덱스 (기본값: 마지막 항목)\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface MiniBarChartProps extends React.HTMLAttributes<HTMLDivElement> {\n data: number[];\n labels?: string[];\n maxValue?: number;\n height?: number;\n showTooltip?: boolean;\n showStats?: boolean;\n color?: Color;\n highlightToday?: boolean;\n todayIndex?: number;\n}\n\n// 차트 전용 색상 (막대 그래프용 그라데이션)\nconst chartColors: Record<Color, { default: string; highlight: string }> = {\n blue: {\n default: \"bg-gradient-to-t from-blue-500 to-blue-400\",\n highlight: \"bg-gradient-to-t from-blue-600 to-blue-500 shadow-lg\",\n },\n purple: {\n default: \"bg-gradient-to-t from-purple-500 to-purple-400\",\n highlight: \"bg-gradient-to-t from-purple-600 to-purple-500 shadow-lg\",\n },\n green: {\n default: \"bg-gradient-to-t from-green-500 to-green-400\",\n highlight: \"bg-gradient-to-t from-green-600 to-green-500 shadow-lg\",\n },\n orange: {\n default: \"bg-gradient-to-t from-orange-500 to-orange-400\",\n highlight: \"bg-gradient-to-t from-orange-600 to-orange-500 shadow-lg\",\n },\n red: {\n default: \"bg-gradient-to-t from-red-500 to-red-400\",\n highlight: \"bg-gradient-to-t from-red-600 to-red-500 shadow-lg\",\n },\n indigo: {\n default: \"bg-gradient-to-t from-indigo-500 to-indigo-400\",\n highlight: \"bg-gradient-to-t from-indigo-600 to-indigo-500 shadow-lg\",\n },\n pink: {\n default: \"bg-gradient-to-t from-pink-500 to-pink-400\",\n highlight: \"bg-gradient-to-t from-pink-600 to-pink-500 shadow-lg\",\n },\n gray: {\n default: \"bg-gradient-to-t from-gray-500 to-gray-400\",\n highlight: \"bg-gradient-to-t from-gray-600 to-gray-500 shadow-lg\",\n },\n};\n\n/**\n * MiniBarChart 컴포넌트\n * \n * 작은 막대 그래프 차트 컴포넌트입니다.\n * 간단한 데이터 시각화에 적합하며, 오늘 항목 강조 기능을 제공합니다.\n * \n * Small bar chart component for simple data visualization.\n * Suitable for compact displays with today's item highlight feature.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <MiniBarChart\n * data={[10, 20, 15, 30, 25, 40, 35]}\n * labels={[\"월\", \"화\", \"수\", \"목\", \"금\", \"토\", \"일\"]}\n * />\n * \n * @example\n * // 커스텀 색상과 통계 / Custom color and stats\n * <MiniBarChart\n * data={dailyData}\n * color=\"purple\"\n * showStats={true}\n * highlightToday={true}\n * todayIndex={6}\n * />\n * \n * @param {MiniBarChartProps} props - MiniBarChart 컴포넌트의 props / MiniBarChart component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} MiniBarChart 컴포넌트 / MiniBarChart component\n */\nexport const MiniBarChart = React.forwardRef<HTMLDivElement, MiniBarChartProps>(\n (\n {\n data,\n labels,\n maxValue,\n height = 160,\n showTooltip = true,\n showStats = true,\n color = \"blue\",\n highlightToday = true,\n todayIndex,\n className,\n ...props\n },\n ref\n ) => {\n const colors = chartColors[color];\n const calculatedMax = maxValue || Math.max(...data, 1);\n const fixedMax = Math.max(calculatedMax, 10);\n const todayIdx = todayIndex !== undefined ? todayIndex : data.length - 1;\n\n const calculateHeight = (value: number): number => {\n if (fixedMax === 0) return 8;\n return Math.max((value / fixedMax) * height, 8);\n };\n\n const total = data.reduce((sum, val) => sum + val, 0);\n const average = data.length > 0 ? Math.round(total / data.length) : 0;\n const max = Math.max(...data);\n\n const chartId = React.useId();\n const chartLabel = labels && labels.length > 0\n ? `미니 막대 그래프 - ${labels.length}개 항목, 최대값 ${max.toLocaleString()}, 평균 ${average.toLocaleString()}`\n : `미니 막대 그래프 - ${data.length}개 항목, 최대값 ${max.toLocaleString()}, 평균 ${average.toLocaleString()}`;\n\n return (\n <div\n ref={ref}\n role=\"img\"\n aria-label={chartLabel}\n className={merge(\"w-full\", className)}\n {...props}\n >\n {/* 그래프 영역 */}\n <div\n className=\"flex items-end justify-between gap-2 px-2 relative\"\n style={{ height: `${height + 40}px` }}\n >\n {/* 기준선 */}\n <div className=\"absolute inset-x-2 bottom-8 border-t border-gray-200 dark:border-gray-700 opacity-50\"></div>\n\n {data.map((value, index) => {\n const isToday = highlightToday && index === todayIdx;\n const barHeight = calculateHeight(value);\n const barColor = isToday ? colors.highlight : colors.default;\n\n return (\n <div\n key={index}\n className=\"flex flex-col items-center flex-1 group relative\"\n >\n {/* 툴팁 */}\n {showTooltip && (\n <div className=\"absolute bottom-full left-1/2 transform -translate-x-1/2 mb-2 px-2 py-1 bg-gray-900 dark:bg-gray-700 text-white text-xs rounded opacity-0 group-hover:opacity-100 transition-opacity duration-200 pointer-events-none whitespace-nowrap z-10\">\n {value}개\n <div className=\"absolute top-full left-1/2 transform -translate-x-1/2 w-0 h-0 border-l-4 border-r-4 border-t-4 border-transparent border-t-gray-900 dark:border-t-gray-700\"></div>\n </div>\n )}\n\n {/* 값 표시 (호버 시) */}\n <div className=\"text-xs font-medium text-gray-700 dark:text-gray-300 mb-1 opacity-0 group-hover:opacity-100 transition-opacity duration-200\">\n {value}\n </div>\n\n {/* 막대 */}\n <div className=\"relative w-full flex-1 flex items-end\">\n <div\n className={merge(\n \"w-full rounded-t-lg transition-all duration-500 ease-out group-hover:scale-105\",\n barColor\n )}\n style={{\n height: `${barHeight}px`,\n minHeight: \"8px\",\n }}\n >\n {/* 막대 위 점 */}\n {value > 0 && (\n <div className=\"absolute -top-1 left-1/2 transform -translate-x-1/2 w-2 h-2 bg-white dark:bg-gray-800 rounded-full shadow-sm\"></div>\n )}\n </div>\n </div>\n\n {/* 라벨 */}\n {labels && labels[index] && (\n <div\n className={merge(\n \"text-xs font-medium mt-2 transition-colors duration-200\",\n isToday\n ? \"text-purple-600 dark:text-purple-400\"\n : \"text-gray-500 dark:text-gray-400\"\n )}\n >\n {labels[index]}\n </div>\n )}\n </div>\n );\n })}\n </div>\n\n {/* 통계 정보 */}\n {showStats && (\n <div className=\"mt-4 flex justify-between items-center text-xs text-gray-500 dark:text-gray-400 px-2\">\n <div>\n 총: {total}\n </div>\n <div>\n 평균: {average}\n </div>\n <div>\n 최고: {max}\n </div>\n </div>\n )}\n </div>\n );\n }\n);\n\nMiniBarChart.displayName = \"MiniBarChart\";\n\n","\"use client\";\n\nimport React, { useMemo } from \"react\";\nimport { merge } from \"../../lib/utils\";\nimport { Icon } from \"../Icon\";\nimport type { IconName } from \"../../lib/icons\";\nimport { useColorStyles } from \"../../lib/styles/colors\";\nimport { createVariantStyles } from \"../../lib/styles/variants\";\nimport type { Color } from \"../../lib/types/common\";\n\n/**\n * SummaryCard 컴포넌트의 props\n * @typedef {Object} SummaryCardProps\n * @property {string} title - 카드 제목\n * @property {string | number} value - 요약 값\n * @property {string} [subtitle] - 부제목\n * @property {IconName | React.ReactNode} [icon] - 아이콘\n * @property {\"blue\" | \"purple\" | \"green\" | \"orange\" | \"red\" | \"indigo\" | \"pink\" | \"gray\"} [color] - 카드 색상\n * @property {\"default\" | \"gradient\" | \"outline\"} [variant=\"default\"] - 카드 스타일 변형\n * @property {string} [href] - 링크 URL\n * @property {() => void} [onClick] - 클릭 핸들러\n * @property {boolean} [loading] - 로딩 상태\n * @property {string | React.ReactNode} [badge] - 배지\n * @property {React.ReactNode} [footer] - 푸터 콘텐츠\n * @property {boolean} [showAction] - 액션 버튼 표시 여부\n * @property {string} [actionLabel] - 액션 버튼 라벨\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface SummaryCardProps extends React.HTMLAttributes<HTMLDivElement> {\n title: string;\n value: string | number;\n subtitle?: string;\n icon?: IconName | React.ReactNode;\n color?: Color;\n variant?: \"default\" | \"gradient\" | \"outline\";\n href?: string;\n onClick?: () => void;\n loading?: boolean;\n badge?: string | React.ReactNode;\n footer?: React.ReactNode;\n showAction?: boolean;\n actionLabel?: string;\n}\n\n// SummaryCard는 default variant가 특별한 그라데이션을 사용하므로 별도 처리\nconst defaultVariantGradients: Record<Color, string> = {\n blue: \"bg-gradient-to-br from-blue-50 to-indigo-100 dark:from-blue-900/20 dark:to-indigo-900/20\",\n purple: \"bg-gradient-to-br from-purple-50 to-pink-100 dark:from-purple-900/20 dark:to-pink-900/20\",\n green: \"bg-gradient-to-br from-green-50 to-emerald-100 dark:from-green-900/20 dark:to-emerald-900/20\",\n orange: \"bg-gradient-to-br from-orange-50 to-amber-100 dark:from-orange-900/20 dark:to-amber-900/20\",\n red: \"bg-gradient-to-br from-red-50 to-rose-100 dark:from-red-900/20 dark:to-rose-900/20\",\n indigo: \"bg-gradient-to-br from-indigo-50 to-blue-100 dark:from-indigo-900/20 dark:to-blue-900/20\",\n pink: \"bg-gradient-to-br from-pink-50 to-rose-100 dark:from-pink-900/20 dark:to-rose-900/20\",\n gray: \"bg-gradient-to-br from-gray-50 to-gray-100 dark:from-gray-900/20 dark:to-gray-800/20\",\n};\n\nconst buttonGradients: Record<Color, string> = {\n blue: \"bg-gradient-to-r from-blue-600 to-indigo-600 hover:from-blue-700 hover:to-indigo-700\",\n purple: \"bg-gradient-to-r from-purple-600 to-pink-600 hover:from-purple-700 hover:to-pink-700\",\n green: \"bg-gradient-to-r from-green-600 to-emerald-600 hover:from-green-700 hover:to-emerald-700\",\n orange: \"bg-gradient-to-r from-orange-600 to-amber-600 hover:from-orange-700 hover:to-amber-700\",\n red: \"bg-gradient-to-r from-red-600 to-rose-600 hover:from-red-700 hover:to-rose-700\",\n indigo: \"bg-gradient-to-r from-indigo-600 to-blue-600 hover:from-indigo-700 hover:to-blue-700\",\n pink: \"bg-gradient-to-r from-pink-600 to-rose-600 hover:from-pink-700 hover:to-rose-700\",\n gray: \"bg-gradient-to-r from-gray-600 to-gray-700 hover:from-gray-700 hover:to-gray-800\",\n};\n\n/**\n * SummaryCard 컴포넌트 / SummaryCard component\n * \n * 요약 정보를 표시하는 카드 컴포넌트입니다.\n * 제목, 값, 부제목, 아이콘을 포함하며, 클릭 가능한 링크나 액션 버튼을 지원합니다.\n * \n * Card component that displays summary information.\n * Includes title, value, subtitle, icon, and supports clickable links or action buttons.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <SummaryCard\n * title=\"총 매출\"\n * value=\"₩10,000,000\"\n * subtitle=\"이번 달\"\n * icon=\"dollarSign\"\n * />\n * \n * @example\n * // 클릭 가능한 카드 / Clickable card\n * <SummaryCard\n * title=\"주문\"\n * value=\"1,234\"\n * href=\"/orders\"\n * showAction\n * actionLabel=\"자세히 보기\"\n * color=\"blue\"\n * variant=\"gradient\"\n * />\n * \n * @param {SummaryCardProps} props - SummaryCard 컴포넌트의 props / SummaryCard component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} SummaryCard 컴포넌트 / SummaryCard component\n */\nexport const SummaryCard = React.forwardRef<HTMLDivElement, SummaryCardProps>(\n (\n {\n title,\n value,\n subtitle,\n icon,\n color = \"blue\",\n variant = \"default\",\n href,\n onClick,\n loading = false,\n badge,\n footer,\n showAction = true,\n actionLabel = \"자세히 보기\",\n className,\n ...props\n },\n ref\n ) => {\n // 공통 색상 시스템 사용\n const colorStyles = useColorStyles(color);\n const isGradient = variant === \"gradient\";\n const isTextWhite = isGradient;\n\n // Variant 스타일 생성 (default는 특별한 그라데이션 사용)\n const variantClass = useMemo(() => {\n if (variant === \"default\") {\n return `rounded-xl shadow-lg ${defaultVariantGradients[color]}`;\n } else if (variant === \"gradient\") {\n return `rounded-xl shadow-xl text-white ${colorStyles.gradient}`;\n } else {\n return `rounded-xl ${colorStyles.outline}`;\n }\n }, [variant, colorStyles, color]);\n\n const formatValue = (val: string | number): string => {\n if (typeof val === \"number\") {\n return val.toLocaleString();\n }\n return val;\n };\n\n const content = (\n <div\n ref={ref}\n className={merge(\n \"p-6 flex flex-col min-h-[220px] relative overflow-hidden group hover:shadow-xl transition-all duration-300\",\n variantClass,\n className\n )}\n {...props}\n >\n {/* 배경 장식 */}\n {/* 배경 장식 - 정적 클래스 사용 */}\n <div className={merge(\n \"absolute top-0 right-0 w-32 h-32 bg-gradient-to-bl to-transparent rounded-full -translate-y-16 translate-x-16\",\n color === \"blue\" ? \"from-blue-400/10\" :\n color === \"purple\" ? \"from-purple-400/10\" :\n color === \"green\" ? \"from-green-400/10\" :\n color === \"orange\" ? \"from-orange-400/10\" :\n color === \"red\" ? \"from-red-400/10\" :\n color === \"indigo\" ? \"from-indigo-400/10\" :\n color === \"pink\" ? \"from-pink-400/10\" :\n \"from-gray-400/10\"\n )}></div>\n <div className={merge(\n \"absolute bottom-0 left-0 w-24 h-24 bg-gradient-to-tr to-transparent rounded-full translate-y-12 -translate-x-12\",\n color === \"blue\" ? \"from-blue-400/10\" :\n color === \"purple\" ? \"from-purple-400/10\" :\n color === \"green\" ? \"from-green-400/10\" :\n color === \"orange\" ? \"from-orange-400/10\" :\n color === \"red\" ? \"from-red-400/10\" :\n color === \"indigo\" ? \"from-indigo-400/10\" :\n color === \"pink\" ? \"from-pink-400/10\" :\n \"from-gray-400/10\"\n )}></div>\n\n {/* 헤더 */}\n <div className=\"flex items-center justify-between mb-4 relative z-10\">\n <div className=\"flex items-center\">\n {icon && (\n <div className={merge(\n \"p-2 rounded-lg\",\n isGradient ? \"bg-white/20\" : colorStyles.icon\n )}>\n {typeof icon === \"string\" ? (\n <Icon\n name={icon as IconName}\n className={merge(\n \"w-6 h-6\",\n isTextWhite ? \"text-white\" : \"\"\n )}\n />\n ) : (\n icon\n )}\n </div>\n )}\n <span className={merge(\n \"text-lg font-semibold ml-3\",\n isTextWhite ? \"text-white\" : \"text-gray-900 dark:text-white\"\n )}>\n {title}\n </span>\n </div>\n {badge && (\n <div className=\"text-xs font-medium\">\n {typeof badge === \"string\" ? (\n <span className={merge(\n \"px-2 py-1 rounded-full\",\n isGradient ? \"bg-white/20 text-white\" : \"bg-white/50 dark:bg-gray-800/50 text-gray-700 dark:text-gray-300\"\n )}>\n {badge}\n </span>\n ) : (\n badge\n )}\n </div>\n )}\n </div>\n\n {/* 값 */}\n <div className=\"flex-1 flex flex-col justify-center relative z-10\">\n {loading ? (\n <div className=\"h-10 bg-gray-200 dark:bg-gray-700 rounded animate-pulse mb-2\" />\n ) : (\n <>\n <div className={merge(\n \"text-3xl font-bold mb-2\",\n isTextWhite ? \"text-white\" : \"text-gray-900 dark:text-white\"\n )}>\n {formatValue(value)}\n </div>\n {subtitle && (\n <div className={merge(\n \"text-sm mb-4\",\n isTextWhite ? \"text-white/90\" : \"text-gray-600 dark:text-gray-400\"\n )}>\n {subtitle}\n </div>\n )}\n </>\n )}\n </div>\n\n {/* 푸터 */}\n {footer && (\n <div className=\"relative z-10 mb-4\">\n {footer}\n </div>\n )}\n\n {/* 액션 버튼 */}\n {showAction && (href || onClick) && (\n <div className=\"relative z-10\">\n {href ? (\n <a\n href={href}\n className={merge(\n \"block w-full text-center py-3 rounded-lg font-semibold text-white hover:shadow-lg transition-all duration-200 group-hover:scale-[1.02]\",\n buttonGradients[color]\n )}\n >\n {actionLabel}\n </a>\n ) : (\n <button\n onClick={onClick}\n className={merge(\n \"block w-full text-center py-3 rounded-lg font-semibold text-white hover:shadow-lg transition-all duration-200 group-hover:scale-[1.02]\",\n buttonGradients[color]\n )}\n >\n {actionLabel}\n </button>\n )}\n </div>\n )}\n </div>\n );\n\n return content;\n }\n);\n\nSummaryCard.displayName = \"SummaryCard\";\n\n","\"use client\";\n\nimport React from \"react\";\nimport { merge, formatRelativeTime } from \"../../lib/utils\";\nimport { Icon } from \"../Icon\";\nimport type { IconName } from \"../../lib/icons\";\n\n/**\n * NotificationItem 인터페이스\n * @typedef {Object} NotificationItem\n * @property {string} id - 알림 고유 ID\n * @property {string} title - 알림 제목\n * @property {string} message - 알림 메시지\n * @property {Date | string} timestamp - 알림 타임스탬프\n * @property {\"info\" | \"warning\" | \"error\" | \"success\"} [type] - 알림 타입\n * @property {IconName | React.ReactNode} [icon] - 아이콘\n * @property {() => void} [onClick] - 클릭 핸들러\n * @property {string} [href] - 링크 URL\n */\nexport interface NotificationItem {\n id: string;\n title: string;\n message: string;\n timestamp: Date | string;\n type?: \"info\" | \"warning\" | \"error\" | \"success\";\n icon?: IconName | React.ReactNode;\n onClick?: () => void;\n href?: string;\n}\n\n/**\n * NotificationCard 컴포넌트의 props / NotificationCard component props\n * @typedef {Object} NotificationCardProps\n * @property {string} [title=\"알림 및 공지\"] - 카드 제목 / Card title\n * @property {NotificationItem[]} items - 알림 항목 배열 / Notification items array\n * @property {string} [emptyMessage=\"알림이 없습니다.\"] - 빈 상태 메시지 / Empty state message\n * @property {number} [maxItems] - 최대 표시 항목 수 / Maximum items to display\n * @property {() => void} [onViewAll] - 전체 보기 핸들러 / View all handler\n * @property {string} [viewAllLabel=\"모든 알림 보기\"] - 전체 보기 라벨 / View all label\n * @property {boolean} [showHeader=true] - 헤더 표시 여부 / Show header\n * @property {boolean} [showCount=true] - 개수 표시 여부 / Show count\n * @property {React.ReactNode} [emptyState] - 빈 상태 컴포넌트 / Empty state component\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface NotificationCardProps extends React.HTMLAttributes<HTMLDivElement> {\n title?: string;\n items: NotificationItem[];\n emptyMessage?: string;\n maxItems?: number;\n onViewAll?: () => void;\n viewAllLabel?: string;\n showHeader?: boolean;\n showCount?: boolean;\n emptyState?: React.ReactNode;\n}\n\nconst typeStyles = {\n info: {\n container: \"bg-gradient-to-r from-blue-50 to-indigo-50 dark:from-blue-900/20 dark:to-indigo-900/20\",\n border: \"border-blue-200/50 dark:border-blue-700/30\",\n dot: \"bg-blue-500\",\n },\n warning: {\n container: \"bg-gradient-to-r from-orange-50 to-red-50 dark:from-orange-900/20 dark:to-red-900/20\",\n border: \"border-orange-200/50 dark:border-orange-700/30\",\n dot: \"bg-red-500\",\n },\n error: {\n container: \"bg-gradient-to-r from-red-50 to-rose-50 dark:from-red-900/20 dark:to-rose-900/20\",\n border: \"border-red-200/50 dark:border-red-700/30\",\n dot: \"bg-red-600\",\n },\n success: {\n container: \"bg-gradient-to-r from-green-50 to-emerald-50 dark:from-green-900/20 dark:to-emerald-900/20\",\n border: \"border-green-200/50 dark:border-green-700/30\",\n dot: \"bg-green-500\",\n },\n};\n\nconst defaultTypeStyles = {\n container: \"bg-gradient-to-r from-gray-50 to-gray-100 dark:from-gray-900/20 dark:to-gray-800/20\",\n border: \"border-gray-200/50 dark:border-gray-700/30\",\n dot: \"bg-gray-500\",\n};\n\n/**\n * NotificationCard 컴포넌트 / NotificationCard component\n * \n * 알림 목록을 표시하는 카드 컴포넌트입니다.\n * 여러 알림 항목을 표시하며, 타입별로 다른 스타일을 적용할 수 있습니다.\n * \n * Card component that displays a list of notifications.\n * Shows multiple notification items and can apply different styles by type.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <NotificationCard\n * items={[\n * {\n * id: \"1\",\n * title: \"새 주문\",\n * message: \"주문 #1234가 생성되었습니다\",\n * timestamp: new Date(),\n * type: \"success\"\n * }\n * ]}\n * />\n * \n * @example\n * // 최대 항목 수 제한 / Maximum items limit\n * <NotificationCard\n * title=\"최근 알림\"\n * items={notifications}\n * maxItems={5}\n * onViewAll={() => navigate(\"/notifications\")}\n * showCount\n * />\n * \n * @param {NotificationCardProps} props - NotificationCard 컴포넌트의 props / NotificationCard component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} NotificationCard 컴포넌트 / NotificationCard component\n */\nexport const NotificationCard = React.forwardRef<HTMLDivElement, NotificationCardProps>(\n (\n {\n title = \"알림 및 공지\",\n items,\n emptyMessage = \"알림이 없습니다.\",\n maxItems,\n onViewAll,\n viewAllLabel = \"모든 알림 보기\",\n showHeader = true,\n showCount = true,\n emptyState,\n className,\n ...props\n },\n ref\n ) => {\n const displayItems = maxItems ? items.slice(0, maxItems) : items;\n const hasMore = maxItems && items.length > maxItems;\n\n\n const getTypeStyles = (type?: NotificationItem[\"type\"]) => {\n if (!type) return defaultTypeStyles;\n return typeStyles[type];\n };\n\n return (\n <div\n ref={ref}\n className={merge(\n \"bg-white dark:bg-gray-800 rounded-xl shadow p-6\",\n className\n )}\n {...props}\n >\n {/* 헤더 */}\n {showHeader && (\n <div className=\"flex items-center justify-between mb-4\">\n <div className=\"flex items-center\">\n <div className=\"p-2 bg-orange-500/10 rounded-lg mr-3\">\n <Icon name=\"bell\" className=\"w-6 h-6 text-orange-600 dark:text-orange-400\" />\n </div>\n <h3 className=\"text-lg font-semibold text-gray-900 dark:text-white\">\n {title}\n </h3>\n </div>\n {showCount && items.length > 0 && (\n <span className=\"inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium bg-orange-100 text-orange-800 dark:bg-orange-900/30 dark:text-orange-300\">\n {items.length}개\n </span>\n )}\n </div>\n )}\n\n {/* 알림 목록 */}\n {displayItems.length > 0 ? (\n <div className=\"space-y-3\">\n {displayItems.map((item) => {\n const typeStyle = getTypeStyles(item.type);\n const content = (\n <div\n className={merge(\n \"p-3 rounded-lg border\",\n typeStyle.container,\n typeStyle.border,\n (item.onClick || item.href) && \"cursor-pointer hover:shadow-md transition-all duration-200\"\n )}\n >\n <div className=\"flex items-start\">\n <div className={merge(\n \"w-2 h-2 rounded-full mt-2 mr-3 flex-shrink-0\",\n typeStyle.dot\n )}></div>\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center justify-between mb-1\">\n <span className=\"text-sm font-semibold text-gray-900 dark:text-white\">\n {item.title}\n </span>\n <time \n dateTime={item.timestamp instanceof Date ? item.timestamp.toISOString() : typeof item.timestamp === 'string' ? item.timestamp : undefined}\n className=\"text-xs text-gray-500 dark:text-gray-400 ml-2 flex-shrink-0\"\n >\n {formatRelativeTime(item.timestamp)}\n </time>\n </div>\n <p className=\"text-xs text-gray-600 dark:text-gray-400\">\n {item.message}\n </p>\n </div>\n </div>\n </div>\n );\n\n if (item.href) {\n return (\n <a key={item.id} href={item.href}>\n {content}\n </a>\n );\n }\n\n if (item.onClick) {\n return (\n <div key={item.id} onClick={item.onClick}>\n {content}\n </div>\n );\n }\n\n return <div key={item.id}>{content}</div>;\n })}\n </div>\n ) : emptyState ? (\n emptyState\n ) : (\n <div className=\"text-center py-8\">\n <Icon name=\"bell\" className=\"w-12 h-12 text-gray-400 dark:text-gray-500 mx-auto mb-3\" />\n <p className=\"text-gray-500 dark:text-gray-400 text-sm\">{emptyMessage}</p>\n </div>\n )}\n\n {/* 더 보기 */}\n {hasMore && onViewAll && (\n <div className=\"mt-4 text-center\">\n <button\n onClick={onViewAll}\n className=\"text-sm text-gray-400 dark:text-gray-500 hover:text-gray-600 dark:hover:text-gray-300 font-medium transition-colors\"\n >\n {viewAllLabel} ({items.length - (maxItems || 0)}개 더)\n </button>\n </div>\n )}\n </div>\n );\n }\n);\n\nNotificationCard.displayName = \"NotificationCard\";\n\n","\"use client\";\n\nimport React, { useMemo } from \"react\";\nimport { merge } from \"../../lib/utils\";\nimport { Icon } from \"../Icon\";\nimport type { IconName } from \"../../lib/icons\";\nimport { MiniBarChart } from \"./MiniBarChart\";\nimport { useColorStyles } from \"../../lib/styles/colors\";\nimport { createVariantStyles } from \"../../lib/styles/variants\";\nimport type { Color } from \"../../lib/types/common\";\n\n/**\n * MetricCard 컴포넌트의 props / MetricCard component props\n * @typedef {Object} MetricCardProps\n * @property {string} title - 카드 제목 / Card title\n * @property {string | number} value - 메트릭 값 / Metric value\n * @property {string} [description] - 카드 설명 / Card description\n * @property {IconName | React.ReactNode} [icon] - 아이콘 / Icon\n * @property {Object} [trend] - 추세 정보 / Trend information\n * @property {number} trend.value - 추세 값 / Trend value\n * @property {string} trend.label - 추세 라벨 / Trend label\n * @property {boolean} [trend.positive] - 긍정적 추세 여부 / Positive trend\n * @property {number[]} [chartData] - 차트 데이터 / Chart data\n * @property {string[]} [chartLabels] - 차트 라벨 / Chart labels\n * @property {\"default\" | \"gradient\" | \"outline\" | \"elevated\"} [variant=\"default\"] - 카드 스타일 변형 / Card style variant\n * @property {\"blue\" | \"purple\" | \"green\" | \"orange\" | \"red\" | \"indigo\" | \"pink\" | \"gray\"} [color] - 카드 색상 / Card color\n * @property {boolean} [loading] - 로딩 상태 / Loading state\n * @property {boolean} [showChart] - 차트 표시 여부 / Show chart\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface MetricCardProps extends React.HTMLAttributes<HTMLDivElement> {\n title: string;\n value: string | number;\n description?: string;\n icon?: IconName | React.ReactNode;\n trend?: {\n value: number;\n label: string;\n positive?: boolean;\n };\n chartData?: number[];\n chartLabels?: string[];\n variant?: \"default\" | \"gradient\" | \"outline\" | \"elevated\";\n color?: Color;\n loading?: boolean;\n showChart?: boolean;\n}\n\n\n/**\n * MetricCard 컴포넌트 / MetricCard component\n * \n * 메트릭 정보를 표시하는 카드 컴포넌트입니다.\n * StatCard와 유사하지만 차트 데이터를 포함할 수 있습니다.\n * \n * Card component that displays metric information.\n * Similar to StatCard but can include chart data.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <MetricCard\n * title=\"페이지뷰\"\n * value=\"10,234\"\n * description=\"오늘\"\n * icon=\"eye\"\n * />\n * \n * @example\n * // 차트 포함 / With chart\n * <MetricCard\n * title=\"방문자\"\n * value=\"5,678\"\n * chartData={[100, 200, 150, 300, 250]}\n * chartLabels={[\"월\", \"화\", \"수\", \"목\", \"금\"]}\n * showChart\n * color=\"blue\"\n * />\n * \n * @param {MetricCardProps} props - MetricCard 컴포넌트의 props / MetricCard component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} MetricCard 컴포넌트 / MetricCard component\n */\nexport const MetricCard = React.forwardRef<HTMLDivElement, MetricCardProps>(\n (\n {\n title,\n value,\n description,\n icon,\n trend,\n chartData,\n chartLabels,\n variant = \"elevated\",\n color = \"blue\",\n loading = false,\n showChart = false,\n className,\n ...props\n },\n ref\n ) => {\n // 공통 색상 시스템 사용\n const colorStyles = useColorStyles(color);\n const isGradient = variant === \"gradient\";\n const isTextWhite = isGradient;\n\n // Variant 스타일 생성 (elevated는 rounded-3xl로 커스터마이징)\n const variantClass = useMemo(() => {\n const baseClass = createVariantStyles(variant, colorStyles);\n // elevated variant는 rounded-3xl 사용\n if (variant === \"elevated\") {\n return baseClass.replace(\"rounded-2xl\", \"rounded-3xl\");\n }\n return baseClass;\n }, [variant, colorStyles]);\n\n const formatValue = (val: string | number): string => {\n if (typeof val === \"number\") {\n return val.toLocaleString();\n }\n return val;\n };\n\n return (\n <div\n ref={ref}\n className={merge(\n \"p-6 transition-all duration-200 hover:shadow-xl\",\n variantClass,\n className\n )}\n {...props}\n >\n <div className=\"flex items-start justify-between mb-4\">\n {/* 아이콘 */}\n {icon && (\n <div className={merge(\n \"w-12 h-12 rounded-lg flex items-center justify-center flex-shrink-0\",\n isGradient ? \"bg-white/20\" : colorStyles.icon\n )}>\n {typeof icon === \"string\" ? (\n <Icon\n name={icon as IconName}\n className={merge(\n \"w-6 h-6\",\n isTextWhite ? \"text-white\" : \"\"\n )}\n />\n ) : (\n icon\n )}\n </div>\n )}\n\n {/* 배지 */}\n {title && (\n <span className={merge(\n \"text-sm px-3 py-1 rounded-full font-medium\",\n isGradient ? \"bg-white/20 text-white\" : colorStyles.badge\n )}>\n {title}\n </span>\n )}\n </div>\n\n {/* 값 */}\n {loading ? (\n <div className=\"h-10 bg-gray-200 dark:bg-gray-700 rounded animate-pulse mb-2\" />\n ) : (\n <h3 className={merge(\n \"text-3xl font-bold mb-1\",\n isTextWhite ? \"text-white\" : \"text-gray-800 dark:text-white\"\n )}>\n {formatValue(value)}\n </h3>\n )}\n\n {/* 설명 */}\n {description && (\n <p className={merge(\n \"text-sm mb-3\",\n isTextWhite ? \"text-white/90\" : \"text-gray-600 dark:text-gray-300\"\n )}>\n {description}\n </p>\n )}\n\n {/* 차트 */}\n {showChart && chartData && chartData.length > 0 && (\n <div className=\"mt-4 mb-3\">\n <MiniBarChart\n data={chartData}\n labels={chartLabels}\n color={color}\n height={100}\n showStats={false}\n />\n </div>\n )}\n\n {/* 트렌드 */}\n {trend && !loading && (\n <div className=\"mt-3 flex items-center gap-1\">\n <span\n className={merge(\n \"text-xs font-medium\",\n trend.positive !== false\n ? \"text-green-600 dark:text-green-400\"\n : \"text-red-600 dark:text-red-400\"\n )}\n >\n {trend.positive !== false ? \"↑\" : \"↓\"} {Math.abs(trend.value)}%\n </span>\n <span className={merge(\n \"text-xs\",\n isTextWhite ? \"text-white/70\" : \"text-gray-500 dark:text-gray-400\"\n )}>\n {trend.label}\n </span>\n </div>\n )}\n </div>\n );\n }\n);\n\nMetricCard.displayName = \"MetricCard\";\n\n","\"use client\";\n\nimport React, { useMemo } from \"react\";\nimport { merge } from \"../../lib/utils\";\nimport { Icon } from \"../Icon\";\nimport type { IconName } from \"../../lib/icons\";\nimport { useColorStyles } from \"../../lib/styles/colors\";\nimport { createVariantStyles } from \"../../lib/styles/variants\";\nimport type { Color } from \"../../lib/types/common\";\n\n/**\n * ProgressCard 컴포넌트의 props / ProgressCard component props\n * @typedef {Object} ProgressCardProps\n * @property {string} title - 카드 제목 / Card title\n * @property {number} current - 현재 값 / Current value\n * @property {number} total - 전체 값 / Total value\n * @property {string} [unit] - 단위 / Unit\n * @property {string} [description] - 카드 설명 / Card description\n * @property {IconName | React.ReactNode} [icon] - 아이콘 / Icon\n * @property {\"blue\" | \"purple\" | \"green\" | \"orange\" | \"red\" | \"indigo\" | \"pink\" | \"gray\"} [color] - 카드 색상 / Card color\n * @property {\"default\" | \"gradient\" | \"outline\" | \"elevated\"} [variant=\"default\"] - 카드 스타일 변형 / Card style variant\n * @property {boolean} [showPercentage] - 퍼센트 표시 여부 / Show percentage\n * @property {boolean} [showLabel] - 라벨 표시 여부 / Show label\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - 카드 크기 / Card size\n * @property {boolean} [loading] - 로딩 상태 / Loading state\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface ProgressCardProps extends React.HTMLAttributes<HTMLDivElement> {\n title: string;\n current: number;\n total: number;\n unit?: string;\n description?: string;\n icon?: IconName | React.ReactNode;\n color?: Color;\n variant?: \"default\" | \"gradient\" | \"outline\" | \"elevated\";\n showPercentage?: boolean;\n showLabel?: boolean;\n size?: \"sm\" | \"md\" | \"lg\";\n loading?: boolean;\n}\n\n// Progress bar 색상은 별도 처리\nconst progressColors: Record<Color, string> = {\n blue: \"bg-blue-500\",\n purple: \"bg-purple-500\",\n green: \"bg-green-500\",\n orange: \"bg-orange-500\",\n red: \"bg-red-500\",\n indigo: \"bg-indigo-500\",\n pink: \"bg-pink-500\",\n gray: \"bg-gray-500\",\n};\n\nconst sizeStyles = {\n sm: {\n container: \"p-4\",\n icon: \"w-8 h-8\",\n iconSize: \"w-4 h-4\",\n title: \"text-sm\",\n value: \"text-xl\",\n progress: \"h-1.5\",\n },\n md: {\n container: \"p-6\",\n icon: \"w-12 h-12\",\n iconSize: \"w-6 h-6\",\n title: \"text-base\",\n value: \"text-2xl\",\n progress: \"h-2\",\n },\n lg: {\n container: \"p-8\",\n icon: \"w-16 h-16\",\n iconSize: \"w-8 h-8\",\n title: \"text-lg\",\n value: \"text-3xl\",\n progress: \"h-3\",\n },\n};\n\n/**\n * ProgressCard 컴포넌트 / ProgressCard component\n * \n * 진행률을 표시하는 카드 컴포넌트입니다.\n * 현재 값과 전체 값을 비교하여 진행률을 시각적으로 표시합니다.\n * \n * Card component that displays progress.\n * Compares current value with total value to visually display progress.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <ProgressCard\n * title=\"목표 달성률\"\n * current={75}\n * total={100}\n * unit=\"%\"\n * description=\"이번 달 목표\"\n * />\n * \n * @example\n * // 퍼센트 표시 / Show percentage\n * <ProgressCard\n * title=\"판매 진행률\"\n * current={150}\n * total={200}\n * showPercentage\n * color=\"green\"\n * variant=\"gradient\"\n * />\n * \n * @param {ProgressCardProps} props - ProgressCard 컴포넌트의 props / ProgressCard component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} ProgressCard 컴포넌트 / ProgressCard component\n */\nexport const ProgressCard = React.forwardRef<HTMLDivElement, ProgressCardProps>(\n (\n {\n title,\n current,\n total,\n unit = \"\",\n description,\n icon,\n color = \"blue\",\n variant = \"elevated\",\n showPercentage = true,\n showLabel = true,\n size = \"md\",\n loading = false,\n className,\n ...props\n },\n ref\n ) => {\n const colorStyles = useColorStyles(color);\n const sizes = sizeStyles[size];\n const percentage = total > 0 ? Math.min(Math.max((current / total) * 100, 0), 100) : 0;\n const isGradient = variant === \"gradient\";\n\n const variantClasses = {\n default: `rounded-2xl border ${colorStyles.default}`,\n gradient: `rounded-2xl border text-white ${colorStyles.gradient}`,\n outline: `rounded-2xl border-2 ${colorStyles.outline}`,\n elevated: `rounded-3xl border ${colorStyles.elevated}`,\n };\n\n const variantClass = variantClasses[variant];\n\n return (\n <div\n ref={ref}\n className={merge(\n \"transition-all duration-200 hover:shadow-xl\",\n variantClass,\n sizes.container,\n className\n )}\n {...props}\n >\n <div className=\"flex items-start justify-between mb-4\">\n {/* 아이콘 */}\n {icon && (\n <div\n className={merge(\n \"rounded-lg flex items-center justify-center flex-shrink-0\",\n sizes.icon,\n isGradient ? \"bg-white/20\" : colorStyles.icon\n )}\n >\n {typeof icon === \"string\" ? (\n <Icon\n name={icon as IconName}\n className={merge(\n sizes.iconSize,\n isGradient ? \"text-white\" : \"\"\n )}\n />\n ) : (\n icon\n )}\n </div>\n )}\n\n {/* 제목 */}\n <div className=\"flex-1 ml-4\">\n <h3\n className={merge(\n \"font-semibold mb-1\",\n sizes.title,\n isGradient ? \"text-white\" : \"text-gray-800 dark:text-white\"\n )}\n >\n {title}\n </h3>\n {description && (\n <p\n className={merge(\n \"text-sm\",\n isGradient ? \"text-white/90\" : \"text-gray-600 dark:text-gray-400\"\n )}\n >\n {description}\n </p>\n )}\n </div>\n </div>\n\n {/* 진행률 표시 */}\n {loading ? (\n <div className=\"space-y-2\">\n <div className=\"h-4 bg-gray-200 dark:bg-gray-700 rounded animate-pulse\" />\n <div className=\"h-2 bg-gray-200 dark:bg-gray-700 rounded animate-pulse\" />\n </div>\n ) : (\n <>\n {/* 값 표시 */}\n <div className=\"flex items-baseline justify-between mb-2\">\n <span\n className={merge(\n \"font-bold\",\n sizes.value,\n isGradient ? \"text-white\" : `text-${color}-600 dark:text-${color}-400`\n )}\n >\n {current.toLocaleString()}\n {unit && <span className=\"text-sm ml-1\">{unit}</span>}\n </span>\n {showLabel && (\n <span\n className={merge(\n \"text-sm\",\n isGradient ? \"text-white/80\" : \"text-gray-600 dark:text-gray-400\"\n )}\n >\n / {total.toLocaleString()}\n {unit && <span className=\"ml-1\">{unit}</span>}\n </span>\n )}\n </div>\n\n {/* 진행률 바 */}\n <div className=\"w-full bg-gray-200 dark:bg-gray-700 rounded-full overflow-hidden\">\n <div\n className={merge(\n \"rounded-full transition-all duration-500\",\n sizes.progress,\n isGradient\n ? `bg-gradient-to-r ${colorStyles.gradient.replace(\"bg-gradient-to-br\", \"bg-gradient-to-r\").trim()}`\n : progressColors[color]\n )}\n style={{ width: `${percentage}%` }}\n />\n </div>\n\n {/* 퍼센트 표시 */}\n {showPercentage && (\n <div className=\"mt-2 flex justify-end\">\n <span\n className={merge(\n \"text-xs font-semibold\",\n isGradient ? \"text-white/90\" : `text-${color}-600 dark:text-${color}-400`\n )}\n >\n {percentage.toFixed(1)}%\n </span>\n </div>\n )}\n </>\n )}\n </div>\n );\n }\n);\n\nProgressCard.displayName = \"ProgressCard\";\n\n","\"use client\";\n\nimport React from \"react\";\nimport { merge } from \"../../lib/utils\";\nimport { Icon } from \"../Icon\";\nimport type { IconName } from \"../../lib/icons\";\n\n/**\n * DashboardEmptyState 컴포넌트의 props / DashboardEmptyState component props\n * @typedef {Object} DashboardEmptyStateProps\n * @property {IconName | React.ReactNode} [icon=\"inbox\"] - 아이콘 / Icon\n * @property {string} title - 제목 / Title\n * @property {string} [description] - 설명 / Description\n * @property {string} [actionText] - 액션 버튼 텍스트 / Action button text\n * @property {string} [actionHref] - 액션 버튼 링크 URL / Action button link URL\n * @property {() => void} [actionOnClick] - 액션 버튼 클릭 핸들러 / Action button click handler\n * @property {\"default\" | \"warning\" | \"info\" | \"error\" | \"success\"} [variant=\"default\"] - 스타일 변형 / Style variant\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - 크기 / Size\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface DashboardEmptyStateProps extends React.HTMLAttributes<HTMLDivElement> {\n icon?: IconName | React.ReactNode;\n title: string;\n description?: string;\n actionText?: string;\n actionHref?: string;\n actionOnClick?: () => void;\n variant?: \"default\" | \"warning\" | \"info\" | \"error\" | \"success\";\n size?: \"sm\" | \"md\" | \"lg\";\n}\n\nconst variantStyles = {\n default: {\n icon: \"text-gray-400 dark:text-gray-500\",\n title: \"text-gray-900 dark:text-white\",\n description: \"text-gray-600 dark:text-gray-400\",\n },\n warning: {\n icon: \"text-yellow-500 dark:text-yellow-400\",\n title: \"text-gray-900 dark:text-white\",\n description: \"text-gray-600 dark:text-gray-400\",\n },\n info: {\n icon: \"text-blue-500 dark:text-blue-400\",\n title: \"text-gray-900 dark:text-white\",\n description: \"text-gray-600 dark:text-gray-400\",\n },\n error: {\n icon: \"text-red-500 dark:text-red-400\",\n title: \"text-gray-900 dark:text-white\",\n description: \"text-gray-600 dark:text-gray-400\",\n },\n success: {\n icon: \"text-green-500 dark:text-green-400\",\n title: \"text-gray-900 dark:text-white\",\n description: \"text-gray-600 dark:text-gray-400\",\n },\n};\n\nconst sizeStyles = {\n sm: {\n container: \"py-8\",\n icon: \"w-8 h-8 mb-3\",\n title: \"text-base\",\n description: \"text-sm\",\n button: \"text-sm px-4 py-2\",\n },\n md: {\n container: \"py-12\",\n icon: \"w-12 h-12 mb-4\",\n title: \"text-lg\",\n description: \"text-sm\",\n button: \"text-sm px-6 py-2\",\n },\n lg: {\n container: \"py-16\",\n icon: \"w-16 h-16 mb-6\",\n title: \"text-xl\",\n description: \"text-base\",\n button: \"text-base px-8 py-3\",\n },\n};\n\n/**\n * DashboardEmptyState 컴포넌트\n * \n * 대시보드에서 빈 상태를 표시하는 컴포넌트입니다.\n * 데이터가 없을 때 사용자에게 안내 메시지와 액션을 제공합니다.\n * \n * Empty state component for dashboards.\n * Displays a message and action when there is no data to show.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <DashboardEmptyState\n * icon=\"inbox\"\n * title=\"데이터가 없습니다\"\n * description=\"새로운 데이터를 추가해보세요\"\n * actionText=\"데이터 추가\"\n * actionOnClick={handleAdd}\n * />\n * \n * @example\n * // 경고 스타일 / Warning style\n * <DashboardEmptyState\n * icon=\"warning\"\n * title=\"오류가 발생했습니다\"\n * description=\"잠시 후 다시 시도해주세요\"\n * variant=\"warning\"\n * size=\"lg\"\n * />\n * \n * @param {DashboardEmptyStateProps} props - DashboardEmptyState 컴포넌트의 props / DashboardEmptyState component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} DashboardEmptyState 컴포넌트 / DashboardEmptyState component\n */\nexport const DashboardEmptyState = React.forwardRef<HTMLDivElement, DashboardEmptyStateProps>(\n (\n {\n icon = \"inbox\",\n title,\n description,\n actionText,\n actionHref,\n actionOnClick,\n variant = \"default\",\n size = \"md\",\n className,\n ...props\n },\n ref\n ) => {\n const styles = variantStyles[variant];\n const sizes = sizeStyles[size];\n\n const actionButton = actionText && (actionHref || actionOnClick) && (\n <div className=\"mt-6\">\n {actionHref ? (\n <a\n href={actionHref}\n aria-label={actionText}\n className={merge(\n \"inline-flex items-center justify-center rounded-lg font-medium bg-gray-100 dark:bg-gray-800 text-gray-700 dark:text-gray-300 hover:bg-gray-200 dark:hover:bg-gray-700 border border-gray-300 dark:border-gray-600 transition-colors duration-200\",\n sizes.button\n )}\n >\n {actionText}\n </a>\n ) : (\n <button\n onClick={actionOnClick}\n aria-label={actionText}\n className={merge(\n \"inline-flex items-center justify-center rounded-lg font-medium bg-gray-100 dark:bg-gray-800 text-gray-700 dark:text-gray-300 hover:bg-gray-200 dark:hover:bg-gray-700 border border-gray-300 dark:border-gray-600 transition-colors duration-200\",\n sizes.button\n )}\n >\n {actionText}\n </button>\n )}\n </div>\n );\n\n return (\n <div\n ref={ref}\n className={merge(\n \"text-center\",\n sizes.container,\n className\n )}\n {...props}\n >\n {/* 아이콘 */}\n {icon && (\n <div className={merge(\"mx-auto\", styles.icon)}>\n {typeof icon === \"string\" ? (\n <Icon name={icon as IconName} className={merge(\"w-full h-full\", styles.icon)} />\n ) : (\n icon\n )}\n </div>\n )}\n\n {/* 제목 */}\n <h3 className={merge(\"font-semibold mb-2\", styles.title, sizes.title)}>\n {title}\n </h3>\n\n {/* 설명 */}\n {description && (\n <p className={merge(\"mb-4\", styles.description, sizes.description)}>\n {description}\n </p>\n )}\n\n {/* 액션 버튼 */}\n {actionButton}\n </div>\n );\n }\n);\n\nDashboardEmptyState.displayName = \"DashboardEmptyState\";\n\n","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * Tooltip 컴포넌트의 props / Tooltip component props\n * @typedef {Object} TooltipProps\n * @property {string} content - Tooltip 내용 / Tooltip content\n * @property {React.ReactNode} children - Tooltip이 연결될 요소 / Element to attach tooltip to\n * @property {\"top\" | \"bottom\" | \"left\" | \"right\"} [position=\"top\"] - Tooltip 표시 위치 / Tooltip display position\n * @property {\"default\" | \"light\" | \"dark\"} [variant=\"default\"] - Tooltip 스타일 변형 / Tooltip style variant\n * @property {number} [delay=300] - Tooltip 표시 지연 시간(ms) / Tooltip display delay (ms)\n * @property {boolean} [disabled=false] - Tooltip 비활성화 여부 / Disable tooltip\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface TooltipProps extends React.HTMLAttributes<HTMLDivElement> {\n content: string\n children: React.ReactNode\n position?: \"top\" | \"bottom\" | \"left\" | \"right\"\n variant?: \"default\" | \"light\" | \"dark\"\n delay?: number\n disabled?: boolean\n}\n\n/**\n * Tooltip 컴포넌트 / Tooltip component\n * \n * 호버 시 추가 정보를 표시하는 툴팁 컴포넌트입니다.\n * 마우스 호버 시 지연 시간 후 표시됩니다.\n * \n * Tooltip component that displays additional information on hover.\n * Appears after a delay when the mouse hovers over the element.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Tooltip content=\"이것은 도움말입니다\">\n * <Button>호버하세요</Button>\n * </Tooltip>\n * \n * @example\n * // 다양한 위치 / Different positions\n * <Tooltip content=\"위치 변경\" position=\"bottom\">\n * <Icon name=\"info\" />\n * </Tooltip>\n * \n * @example\n * // 커스텀 스타일 / Custom styles\n * <Tooltip content=\"라이트 스타일\" variant=\"light\" delay={500}>\n * <span>호버</span>\n * </Tooltip>\n * \n * @param {TooltipProps} props - Tooltip 컴포넌트의 props / Tooltip component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} Tooltip 컴포넌트 / Tooltip component\n * \n * @todo 접근성 개선: role=\"tooltip\" 추가 필요 / Accessibility: Add role=\"tooltip\"\n * @todo 접근성 개선: aria-describedby 연결 필요 / Accessibility: Connect aria-describedby\n * @todo 접근성 개선: 키보드 포커스 시 Tooltip 표시 필요 / Accessibility: Show tooltip on keyboard focus\n */\nconst Tooltip = React.forwardRef<HTMLDivElement, TooltipProps>(\n ({ \n className, \n content,\n children,\n position = \"top\",\n variant = \"default\",\n delay = 300,\n disabled = false,\n ...props \n }, ref) => {\n const [isVisible, setIsVisible] = React.useState(false)\n const [coords, setCoords] = React.useState({ x: 0, y: 0 })\n const timeoutRef = React.useRef<number | undefined>(undefined)\n const tooltipRef = React.useRef<HTMLDivElement>(null)\n\n const showTooltip = (e: React.MouseEvent) => {\n if (disabled) return\n \n const rect = e.currentTarget.getBoundingClientRect()\n const tooltipRect = tooltipRef.current?.getBoundingClientRect()\n \n let x = 0\n let y = 0\n \n switch (position) {\n case \"top\":\n x = rect.left + rect.width / 2\n y = rect.top - 8 // 8px 간격\n break\n case \"bottom\":\n x = rect.left + rect.width / 2\n y = rect.bottom + 8 // 8px 간격\n break\n case \"left\":\n x = rect.left - 8 // 8px 간격\n y = rect.top + rect.height / 2\n break\n case \"right\":\n x = rect.right + 8 // 8px 간격\n y = rect.top + rect.height / 2\n break\n }\n \n setCoords({ x, y })\n \n timeoutRef.current = window.setTimeout(() => {\n setIsVisible(true)\n }, delay)\n }\n\n const hideTooltip = () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current)\n }\n setIsVisible(false)\n }\n\n React.useEffect(() => {\n return () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current)\n }\n }\n }, [])\n\n const getVariantClasses = () => {\n switch (variant) {\n case \"light\":\n return \"bg-white text-gray-900 border border-gray-200 shadow-lg\"\n case \"dark\":\n return \"bg-gray-900 text-white shadow-lg\"\n default:\n return \"bg-gray-800 text-white shadow-lg\"\n }\n }\n\n const getPositionClasses = () => {\n switch (position) {\n case \"top\":\n return \"bottom-full left-1/2 -translate-x-1/2 mb-2\" // 8px 간격\n case \"bottom\":\n return \"top-full left-1/2 -translate-x-1/2 mt-2\" // 8px 간격\n case \"left\":\n return \"right-full top-1/2 -translate-y-1/2 mr-2\" // 8px 간격\n case \"right\":\n return \"left-full top-1/2 -translate-y-1/2 ml-2\" // 8px 간격\n default:\n return \"bottom-full left-1/2 -translate-x-1/2 mb-2\"\n }\n }\n\n const getArrowClasses = () => {\n switch (position) {\n case \"top\":\n return \"top-full left-1/2 -translate-x-1/2 border-t-gray-800 dark:border-t-gray-800\"\n case \"bottom\":\n return \"bottom-full left-1/2 -translate-x-1/2 border-b-gray-800 dark:border-b-gray-800\"\n case \"left\":\n return \"left-full top-1/2 -translate-y-1/2 border-l-gray-800 dark:border-l-gray-800\"\n case \"right\":\n return \"right-full top-1/2 -translate-y-1/2 border-r-gray-800 dark:border-r-gray-800\"\n default:\n return \"top-full left-1/2 -translate-x-1/2 border-t-gray-800 dark:border-t-gray-800\"\n }\n }\n\n return (\n <div\n ref={ref}\n className={merge(\"relative inline-block\", className)}\n onMouseEnter={showTooltip}\n onMouseLeave={hideTooltip}\n {...props}\n >\n {children}\n \n {isVisible && (\n <div\n ref={tooltipRef}\n className={merge(\n \"fixed z-50 px-3 py-2 text-sm rounded-lg whitespace-nowrap pointer-events-none\", // 12px, 8px 패딩\n getVariantClasses()\n )}\n style={{\n left: `${coords.x}px`,\n top: `${coords.y}px`,\n transform: 'translate(-50%, -50%)'\n }}\n >\n {content}\n {/* 화살표 */}\n <div\n className={merge(\n \"absolute w-0 h-0 border-4 border-transparent\",\n getArrowClasses()\n )}\n />\n </div>\n )}\n </div>\n )\n }\n)\nTooltip.displayName = \"Tooltip\"\n\n// 편의 컴포넌트들\nexport const TooltipLight = React.forwardRef<HTMLDivElement, Omit<TooltipProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Tooltip ref={ref} variant=\"light\" className={className} {...props} />\n )\n)\nTooltipLight.displayName = \"TooltipLight\"\n\nexport const TooltipDark = React.forwardRef<HTMLDivElement, Omit<TooltipProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Tooltip ref={ref} variant=\"dark\" className={className} {...props} />\n )\n)\nTooltipDark.displayName = \"TooltipDark\"\n\nexport { Tooltip } ","\"use client\";\n\nimport React from \"react\";\nimport { merge } from \"../../lib/utils\";\nimport { Icon } from \"../Icon\";\nimport type { IconName } from \"../../lib/icons\";\nimport { Tooltip } from \"../Tooltip\";\n\n/**\n * 사이드바 네비게이션 아이템 인터페이스 / SidebarNavItem interface\n * @typedef {Object} SidebarNavItem\n * @property {string} id - 아이템 고유 ID / Item unique ID\n * @property {string} label - 아이템 라벨 / Item label\n * @property {string} [href] - 링크 URL / Link URL\n * @property {IconName | React.ReactNode} [icon] - 아이콘 / Icon\n * @property {React.ReactNode} [badge] - 배지 / Badge\n * @property {boolean} [active] - 활성 상태 / Active state\n * @property {() => void} [onClick] - 클릭 핸들러 / Click handler\n */\nexport interface SidebarNavItem {\n id: string;\n label: string;\n href?: string;\n icon?: IconName | React.ReactNode;\n badge?: React.ReactNode;\n active?: boolean;\n onClick?: () => void;\n}\n\n/**\n * 사이드바 섹션 인터페이스 / SidebarSection interface\n * @typedef {Object} SidebarSection\n * @property {string} id - 섹션 고유 ID / Section unique ID\n * @property {string} [label] - 섹션 라벨 / Section label\n * @property {SidebarNavItem[]} items - 섹션 내 아이템 배열 / Items array in section\n */\nexport interface SidebarSection {\n id: string;\n label?: string;\n items: SidebarNavItem[];\n}\n\n/**\n * DashboardSidebar 컴포넌트의 props / DashboardSidebar component props\n * @typedef {Object} DashboardSidebarProps\n * @property {React.ReactNode} [logo] - 로고 컴포넌트 / Logo component\n * @property {React.ReactNode} [productSwitcher] - 제품 전환 컴포넌트 / Product switcher component\n * @property {SidebarSection[]} sections - 사이드바 섹션 배열 / Sidebar sections array\n * @property {React.ReactNode} [footerActions] - 푸터 액션 컴포넌트 / Footer actions component\n * @property {boolean} [isCollapsed] - 접힘 상태 (제어) / Collapsed state (controlled)\n * @property {boolean} [defaultCollapsed=false] - 기본 접힘 상태 / Default collapsed state\n * @property {(collapsed: boolean) => void} [onToggleCollapsed] - 접힘 상태 변경 핸들러 / Collapsed state change handler\n * @property {number} [collapsedWidth=72] - 접힘 상태 너비 (px) / Collapsed width (px)\n * @property {number} [expandedWidth=264] - 펼침 상태 너비 (px) / Expanded width (px)\n * @property {number} [mobileBreakpoint=1024] - 모바일 브레이크포인트 (px) / Mobile breakpoint (px)\n * @property {string} [overlayBackground] - 모바일 오버레이 배경색 / Mobile overlay background color\n * @extends {React.HTMLAttributes<HTMLElement>}\n */\nexport interface DashboardSidebarProps extends React.HTMLAttributes<HTMLElement> {\n logo?: React.ReactNode;\n productSwitcher?: React.ReactNode;\n sections: SidebarSection[];\n footerActions?: React.ReactNode;\n isCollapsed?: boolean;\n defaultCollapsed?: boolean;\n onToggleCollapsed?: (collapsed: boolean) => void;\n collapsedWidth?: number;\n expandedWidth?: number;\n mobileBreakpoint?: number;\n overlayBackground?: string;\n}\n\nconst DEFAULT_COLLAPSED = 72;\nconst DEFAULT_EXPANDED = 264;\n\n/**\n * DashboardSidebar 컴포넌트\n * \n * 대시보드용 사이드바 네비게이션 컴포넌트입니다.\n * 접기/펼치기 기능과 모바일 반응형을 지원하며, 섹션별로 네비게이션 아이템을 구성할 수 있습니다.\n * \n * Sidebar navigation component for dashboards.\n * Supports collapse/expand functionality and mobile responsiveness, with section-based navigation items.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <DashboardSidebar\n * logo={<Logo />}\n * sections={[\n * {\n * id: \"main\",\n * label: \"메인\",\n * items: [\n * { id: \"dashboard\", label: \"대시보드\", href: \"/dashboard\", icon: \"layout\" },\n * { id: \"transactions\", label: \"거래\", href: \"/transactions\", icon: \"creditCard\" }\n * ]\n * }\n * ]}\n * />\n * \n * @example\n * // 접힘 상태 제어 / Collapse state control\n * <DashboardSidebar\n * sections={sections}\n * isCollapsed={collapsed}\n * onToggleCollapsed={setCollapsed}\n * collapsedWidth={80}\n * expandedWidth={280}\n * />\n * \n * @param {DashboardSidebarProps} props - DashboardSidebar 컴포넌트의 props / DashboardSidebar component props\n * @param {React.Ref<HTMLElement>} ref - aside 요소 ref / aside element ref\n * @returns {JSX.Element} DashboardSidebar 컴포넌트 / DashboardSidebar component\n */\nexport const DashboardSidebar = React.forwardRef<HTMLElement, DashboardSidebarProps>(\n (\n {\n logo,\n productSwitcher,\n sections,\n footerActions,\n isCollapsed,\n defaultCollapsed = false,\n onToggleCollapsed,\n collapsedWidth = DEFAULT_COLLAPSED,\n expandedWidth = DEFAULT_EXPANDED,\n mobileBreakpoint = 1024,\n overlayBackground = \"rgba(15, 23, 42, 0.45)\",\n className,\n ...props\n },\n ref\n ) => {\n const [internalCollapsed, setInternalCollapsed] = React.useState(defaultCollapsed);\n const [isMobileOpen, setIsMobileOpen] = React.useState(false);\n const [isMobile, setIsMobile] = React.useState(false);\n const collapsed = typeof isCollapsed === \"boolean\" ? isCollapsed : internalCollapsed;\n\n React.useEffect(() => {\n const checkMobile = () => setIsMobile(window.innerWidth <= mobileBreakpoint);\n checkMobile();\n window.addEventListener(\"resize\", checkMobile);\n return () => window.removeEventListener(\"resize\", checkMobile);\n }, [mobileBreakpoint]);\n\n const toggleCollapsed = () => {\n const next = !collapsed;\n setInternalCollapsed(next);\n onToggleCollapsed?.(next);\n };\n\n const widthStyle = collapsed ? collapsedWidth : expandedWidth;\n\n const sidebarContent = (\n <aside\n ref={ref}\n role=\"navigation\"\n aria-label=\"대시보드 네비게이션\"\n className={merge(\n \"flex h-full flex-col border-r border-slate-200/60 bg-white/95 px-3 py-4 shadow-sm dark:border-slate-800 dark:bg-slate-950/80 backdrop-blur transition-[width] duration-200\",\n className\n )}\n style={{ width: widthStyle, minWidth: widthStyle }}\n {...props}\n >\n <div className=\"mb-6 flex items-center justify-between gap-2 px-1\">\n <div className=\"flex items-center gap-2\">\n {logo}\n {!collapsed && productSwitcher}\n </div>\n <button\n type=\"button\"\n onClick={toggleCollapsed}\n aria-label={collapsed ? \"사이드바 펼치기\" : \"사이드바 접기\"}\n aria-expanded={!collapsed}\n className=\"inline-flex h-8 w-8 items-center justify-center rounded-full border border-slate-200 text-slate-500 transition-colors hover:bg-slate-100 dark:border-slate-700 dark:text-slate-300 dark:hover:bg-slate-800\"\n >\n <Icon name={collapsed ? \"chevronRight\" : \"chevronLeft\"} className=\"h-4 w-4\" />\n <span className=\"sr-only\">사이드바 토글</span>\n </button>\n </div>\n\n <div className=\"flex-1 space-y-6 overflow-y-auto\">\n {sections.map((section) => (\n <div key={section.id} className=\"space-y-2\">\n {!collapsed && section.label && (\n <div className=\"px-3 text-xs font-medium uppercase tracking-wide text-slate-400 dark:text-slate-500\" role=\"heading\" aria-level={2}>\n {section.label}\n </div>\n )}\n <nav className=\"space-y-1\" aria-label={section.label || \"네비게이션\"}>\n {section.items.map((item) => {\n const baseClasses = merge(\n \"group flex w-full items-center rounded-xl px-3 py-2 text-sm font-medium transition focus:outline-none focus-visible:ring-2 focus-visible:ring-blue-500/70\",\n item.active\n ? \"bg-blue-50 text-blue-600 dark:bg-blue-500/15 dark:text-blue-200\"\n : \"text-slate-600 hover:bg-slate-100 dark:text-slate-300 dark:hover:bg-slate-800\"\n );\n\n const content = (\n <>\n {item.icon && (\n <span className=\"mr-3\">\n {typeof item.icon === \"string\" ? (\n <Icon name={item.icon as IconName} className=\"h-5 w-5\" />\n ) : (\n item.icon\n )}\n </span>\n )}\n {!collapsed && (\n <>\n <span className=\"flex-1 text-left\">{item.label}</span>\n {item.badge && <span className=\"text-xs text-slate-400\">{item.badge}</span>}\n </>\n )}\n </>\n );\n\n const itemNode = item.href ? (\n <a\n key={item.id}\n href={item.href}\n className={baseClasses}\n aria-current={item.active ? \"page\" : undefined}\n >\n {content}\n </a>\n ) : (\n <button\n key={item.id}\n type=\"button\"\n onClick={item.onClick}\n className={baseClasses}\n aria-pressed={item.active}\n >\n {content}\n </button>\n );\n\n if (collapsed) {\n return (\n <Tooltip key={item.id} content={item.label}>\n {itemNode}\n </Tooltip>\n );\n }\n\n return itemNode;\n })}\n </nav>\n </div>\n ))}\n </div>\n\n <div className=\"mt-4 border-t border-slate-100 pt-4 dark:border-slate-800\">\n {footerActions}\n <div className=\"mt-2 hidden text-xs text-slate-400 lg:block\">\n <span>ⓒ HUA Labs</span>\n </div>\n </div>\n\n </aside>\n );\n\n return (\n <>\n {isMobile ? (\n <>\n <button\n className=\"inline-flex items-center gap-2 rounded-full border border-slate-200 px-3 py-2 text-sm text-slate-600 shadow-sm dark:border-slate-700 dark:text-slate-200\"\n onClick={() => setIsMobileOpen(true)}\n >\n <Icon name=\"menu\" className=\"h-4 w-4\" />\n 메뉴\n </button>\n {isMobileOpen && (\n <div className=\"fixed inset-0 z-40 flex\">\n <div\n className=\"absolute inset-0\"\n style={{ backgroundColor: overlayBackground }}\n onClick={() => setIsMobileOpen(false)}\n />\n <div className=\"relative z-50 h-full\">\n {sidebarContent}\n <button\n className=\"absolute top-4 right-4 rounded-full border border-slate-200 bg-white p-2 shadow-sm dark:border-slate-700 dark:bg-slate-900\"\n onClick={() => setIsMobileOpen(false)}\n >\n <Icon name=\"close\" className=\"h-4 w-4\" />\n </button>\n </div>\n </div>\n )}\n </>\n ) : (\n sidebarContent\n )}\n </>\n );\n }\n);\n\nDashboardSidebar.displayName = \"DashboardSidebar\";\n","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * Table 컴포넌트의 props / Table component props\n * @typedef {Object} TableProps\n * @property {React.ReactNode} children - TableHeader, TableBody, TableFooter 등 / TableHeader, TableBody, TableFooter, etc.\n * @property {\"default\" | \"bordered\" | \"striped\"} [variant=\"default\"] - Table 스타일 변형 / Table style variant\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - Table 크기 / Table size\n * @extends {React.HTMLAttributes<HTMLTableElement>}\n */\nexport interface TableProps extends React.HTMLAttributes<HTMLTableElement> {\n children: React.ReactNode\n variant?: \"default\" | \"bordered\" | \"striped\"\n size?: \"sm\" | \"md\" | \"lg\"\n}\n\n/**\n * TableHeader 컴포넌트의 props / TableHeader component props\n * @typedef {Object} TableHeaderProps\n * @property {React.ReactNode} children - TableHead 컴포넌트들 / TableHead components\n * @extends {React.HTMLAttributes<HTMLTableSectionElement>}\n */\nexport interface TableHeaderProps extends React.HTMLAttributes<HTMLTableSectionElement> {\n children: React.ReactNode\n}\n\n/**\n * TableBody 컴포넌트의 props / TableBody component props\n * @typedef {Object} TableBodyProps\n * @property {React.ReactNode} children - TableRow 컴포넌트들 / TableRow components\n * @extends {React.HTMLAttributes<HTMLTableSectionElement>}\n */\nexport interface TableBodyProps extends React.HTMLAttributes<HTMLTableSectionElement> {\n children: React.ReactNode\n}\n\n/**\n * TableFooter 컴포넌트의 props / TableFooter component props\n * @typedef {Object} TableFooterProps\n * @property {React.ReactNode} children - TableRow 컴포넌트들 / TableRow components\n * @extends {React.HTMLAttributes<HTMLTableSectionElement>}\n */\nexport interface TableFooterProps extends React.HTMLAttributes<HTMLTableSectionElement> {\n children: React.ReactNode\n}\n\n/**\n * TableRow 컴포넌트의 props / TableRow component props\n * @typedef {Object} TableRowProps\n * @property {React.ReactNode} children - TableHead 또는 TableCell 컴포넌트들 / TableHead or TableCell components\n * @property {\"default\" | \"hover\"} [variant=\"default\"] - Row 스타일 변형 / Row style variant\n * @extends {React.HTMLAttributes<HTMLTableRowElement>}\n */\nexport interface TableRowProps extends React.HTMLAttributes<HTMLTableRowElement> {\n children: React.ReactNode\n variant?: \"default\" | \"hover\"\n}\n\n/**\n * TableHead 컴포넌트의 props / TableHead component props\n * @typedef {Object} TableHeadProps\n * @property {React.ReactNode} children - 헤더 셀 내용 / Header cell content\n * @extends {React.ThHTMLAttributes<HTMLTableCellElement>}\n */\nexport interface TableHeadProps extends React.ThHTMLAttributes<HTMLTableCellElement> {\n children: React.ReactNode\n}\n\n/**\n * TableCell 컴포넌트의 props / TableCell component props\n * @typedef {Object} TableCellProps\n * @property {React.ReactNode} children - 셀 내용 / Cell content\n * @extends {React.TdHTMLAttributes<HTMLTableCellElement>}\n */\nexport interface TableCellProps extends React.TdHTMLAttributes<HTMLTableCellElement> {\n children: React.ReactNode\n}\n\n/**\n * Table 컴포넌트 / Table component\n * \n * 데이터를 표 형태로 표시하는 테이블 컴포넌트입니다.\n * TableHeader, TableBody, TableFooter, TableRow, TableHead, TableCell과 함께 사용합니다.\n * \n * Table component that displays data in tabular format.\n * Used with TableHeader, TableBody, TableFooter, TableRow, TableHead, and TableCell.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Table>\n * <TableHeader>\n * <TableRow>\n * <TableHead>이름</TableHead>\n * <TableHead>나이</TableHead>\n * </TableRow>\n * </TableHeader>\n * <TableBody>\n * <TableRow>\n * <TableCell>홍길동</TableCell>\n * <TableCell>30</TableCell>\n * </TableRow>\n * </TableBody>\n * </Table>\n * \n * @example\n * // Bordered 스타일 / Bordered style\n * <Table variant=\"bordered\">\n * <TableHeader>\n * <TableRow>\n * <TableHead>항목</TableHead>\n * </TableRow>\n * </TableHeader>\n * <TableBody>\n * <TableRow>\n * <TableCell>값</TableCell>\n * </TableRow>\n * </TableBody>\n * </Table>\n * \n * @example\n * // Striped 스타일, 호버 효과 / Striped style with hover effect\n * <Table variant=\"striped\">\n * <TableBody>\n * <TableRow variant=\"hover\">\n * <TableCell>데이터</TableCell>\n * </TableRow>\n * </TableBody>\n * </Table>\n * \n * @param {TableProps} props - Table 컴포넌트의 props / Table component props\n * @param {React.Ref<HTMLTableElement>} ref - table 요소 ref / table element ref\n * @returns {JSX.Element} Table 컴포넌트 / Table component\n */\nconst Table = React.forwardRef<HTMLTableElement, TableProps>(\n ({ className, variant = \"default\", size = \"md\", ...props }, ref) => {\n const getVariantClasses = () => {\n switch (variant) {\n case \"bordered\":\n return \"border border-slate-200 dark:border-slate-700 divide-x divide-slate-200 dark:divide-slate-700\"\n case \"striped\":\n return \"divide-y divide-slate-200 dark:divide-slate-700\"\n default:\n return \"\"\n }\n }\n\n const getSizeClasses = () => {\n switch (size) {\n case \"sm\":\n return \"text-sm\"\n case \"lg\":\n return \"text-base\"\n default:\n return \"text-sm\"\n }\n }\n\n return (\n <div className=\"w-full overflow-auto\">\n <table\n ref={ref}\n className={merge(\n \"w-full caption-bottom\",\n getVariantClasses(),\n getSizeClasses(),\n className\n )}\n {...props}\n />\n </div>\n )\n }\n)\nTable.displayName = \"Table\"\n\n/**\n * TableHeader 컴포넌트 / TableHeader component\n * 테이블의 헤더 영역을 표시합니다.\n * Displays the header area of a table.\n * \n * @component\n * @param {TableHeaderProps} props - TableHeader 컴포넌트의 props / TableHeader component props\n * @param {React.Ref<HTMLTableSectionElement>} ref - thead 요소 ref / thead element ref\n * @returns {JSX.Element} TableHeader 컴포넌트 / TableHeader component\n */\nconst TableHeader = React.forwardRef<HTMLTableSectionElement, TableHeaderProps>(\n ({ className, ...props }, ref) => (\n <thead ref={ref} className={merge(\"[&_tr]:border-b\", className)} {...props} />\n )\n)\nTableHeader.displayName = \"TableHeader\"\n\n/**\n * TableBody 컴포넌트 / TableBody component\n * 테이블의 본문 영역을 표시합니다.\n * Displays the body area of a table.\n * \n * @component\n * @param {TableBodyProps} props - TableBody 컴포넌트의 props / TableBody component props\n * @param {React.Ref<HTMLTableSectionElement>} ref - tbody 요소 ref / tbody element ref\n * @returns {JSX.Element} TableBody 컴포넌트 / TableBody component\n */\nconst TableBody = React.forwardRef<HTMLTableSectionElement, TableBodyProps>(\n ({ className, ...props }, ref) => (\n <tbody\n ref={ref}\n className={merge(\"[&_tr:last-child]:border-0\", className)}\n {...props}\n />\n )\n)\nTableBody.displayName = \"TableBody\"\n\n/**\n * TableFooter 컴포넌트 / TableFooter component\n * 테이블의 푸터 영역을 표시합니다.\n * Displays the footer area of a table.\n * \n * @component\n * @param {TableFooterProps} props - TableFooter 컴포넌트의 props / TableFooter component props\n * @param {React.Ref<HTMLTableSectionElement>} ref - tfoot 요소 ref / tfoot element ref\n * @returns {JSX.Element} TableFooter 컴포넌트 / TableFooter component\n */\nconst TableFooter = React.forwardRef<HTMLTableSectionElement, TableFooterProps>(\n ({ className, ...props }, ref) => (\n <tfoot\n ref={ref}\n className={merge(\n \"border-t bg-slate-50 dark:bg-slate-800/50 font-medium [&>tr]:last:border-b-0\",\n className\n )}\n {...props}\n />\n )\n)\nTableFooter.displayName = \"TableFooter\"\n\n/**\n * TableRow 컴포넌트 / TableRow component\n * 테이블의 행을 표시합니다.\n * Displays a table row.\n * \n * @component\n * @param {TableRowProps} props - TableRow 컴포넌트의 props / TableRow component props\n * @param {React.Ref<HTMLTableRowElement>} ref - tr 요소 ref / tr element ref\n * @returns {JSX.Element} TableRow 컴포넌트 / TableRow component\n */\nconst TableRow = React.forwardRef<HTMLTableRowElement, TableRowProps>(\n ({ className, variant = \"default\", ...props }, ref) => {\n const getVariantClasses = () => {\n switch (variant) {\n case \"hover\":\n return \"hover:bg-slate-50 dark:hover:bg-slate-800/50\"\n default:\n return \"\"\n }\n }\n\n return (\n <tr\n ref={ref}\n className={merge(\n \"border-b transition-colors data-[state=selected]:bg-slate-50 dark:data-[state=selected]:bg-slate-800/50\",\n getVariantClasses(),\n className\n )}\n {...props}\n />\n )\n }\n)\nTableRow.displayName = \"TableRow\"\n\n/**\n * TableHead 컴포넌트 / TableHead component\n * 테이블의 헤더 셀을 표시합니다.\n * Displays a table header cell.\n * \n * @component\n * @param {TableHeadProps} props - TableHead 컴포넌트의 props / TableHead component props\n * @param {React.Ref<HTMLTableCellElement>} ref - th 요소 ref / th element ref\n * @returns {JSX.Element} TableHead 컴포넌트 / TableHead component\n */\nconst TableHead = React.forwardRef<HTMLTableCellElement, TableHeadProps>(\n ({ className, ...props }, ref) => (\n <th\n ref={ref}\n className={merge(\n \"h-12 px-4 text-left align-middle font-medium text-slate-500 dark:text-slate-400 [&:has([role=checkbox])]:pr-0\",\n className\n )}\n {...props}\n />\n )\n)\nTableHead.displayName = \"TableHead\"\n\n/**\n * TableCell 컴포넌트 / TableCell component\n * 테이블의 데이터 셀을 표시합니다.\n * Displays a table data cell.\n * \n * @component\n * @param {TableCellProps} props - TableCell 컴포넌트의 props / TableCell component props\n * @param {React.Ref<HTMLTableCellElement>} ref - td 요소 ref / td element ref\n * @returns {JSX.Element} TableCell 컴포넌트 / TableCell component\n */\nconst TableCell = React.forwardRef<HTMLTableCellElement, TableCellProps>(\n ({ className, ...props }, ref) => (\n <td\n ref={ref}\n className={merge(\"p-4 align-middle [&:has([role=checkbox])]:pr-0\", className)}\n {...props}\n />\n )\n)\nTableCell.displayName = \"TableCell\"\n\n/**\n * TableCaption 컴포넌트 / TableCaption component\n * 테이블의 캡션을 표시합니다.\n * Displays a table caption.\n * \n * @component\n * @param {React.HTMLAttributes<HTMLTableCaptionElement>} props - TableCaption 컴포넌트의 props / TableCaption component props\n * @param {React.Ref<HTMLTableCaptionElement>} ref - caption 요소 ref / caption element ref\n * @returns {JSX.Element} TableCaption 컴포넌트 / TableCaption component\n */\nconst TableCaption = React.forwardRef<HTMLTableCaptionElement, React.HTMLAttributes<HTMLTableCaptionElement>>(\n ({ className, ...props }, ref) => (\n <caption\n ref={ref}\n className={merge(\"mt-4 text-sm text-slate-500 dark:text-slate-400\", className)}\n {...props}\n />\n )\n)\nTableCaption.displayName = \"TableCaption\"\n\nexport {\n Table,\n TableHeader,\n TableBody,\n TableFooter,\n TableHead,\n TableRow,\n TableCell,\n TableCaption,\n} ","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * Badge 컴포넌트의 props / Badge component props\n * @typedef {Object} BadgeProps\n * @property {\"default\" | \"secondary\" | \"destructive\" | \"error\" | \"outline\" | \"glass\"} [variant=\"default\"] - Badge 스타일 변형 / Badge style variant\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface BadgeProps extends React.HTMLAttributes<HTMLDivElement> {\n variant?: \"default\" | \"secondary\" | \"destructive\" | \"error\" | \"outline\" | \"glass\"\n}\n\n/**\n * Badge 컴포넌트 / Badge component\n * \n * 상태나 카테고리를 표시하는 작은 배지 컴포넌트입니다.\n * React.memo로 최적화되어 있어 불필요한 리렌더링을 방지합니다.\n * \n * Small badge component for displaying status or category.\n * Optimized with React.memo to prevent unnecessary re-renders.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Badge>New</Badge>\n * \n * @example\n * // 다양한 변형 / Various variants\n * <Badge variant=\"destructive\">완료</Badge>\n * <Badge variant=\"error\">오류</Badge>\n * <Badge variant=\"outline\">대기</Badge>\n * \n * @param {BadgeProps} props - Badge 컴포넌트의 props / Badge component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} Badge 컴포넌트 / Badge component\n */\nconst Badge = React.memo(React.forwardRef<HTMLDivElement, BadgeProps>(\n ({ className, variant = \"default\", ...props }, ref) => {\n const variantClasses = React.useMemo(() => ({\n default: \"bg-slate-900 text-slate-50 hover:bg-slate-900/80 dark:bg-slate-50 dark:text-slate-900 dark:hover:bg-slate-50/80\",\n secondary: \"bg-slate-100 text-slate-900 hover:bg-slate-100/80 dark:bg-slate-800 dark:text-slate-50 dark:hover:bg-slate-800/80\",\n destructive: \"bg-red-500 text-slate-50 hover:bg-red-500/80 dark:bg-red-900 dark:text-slate-50 dark:hover:bg-red-900/80\",\n error: \"bg-red-500 text-slate-50 hover:bg-red-500/80 dark:bg-red-900 dark:text-slate-50 dark:hover:bg-red-900/80\", // error는 destructive와 동일\n outline: \"text-slate-950 border border-slate-200 hover:bg-slate-100 hover:text-slate-900 dark:border-slate-800 dark:text-slate-50 dark:hover:bg-slate-800 dark:hover:text-slate-50\",\n glass: \"bg-white/20 backdrop-blur-sm border border-white/30 text-white hover:bg-white/30 dark:bg-slate-800/20 dark:border-slate-700/50 dark:text-slate-200 dark:hover:bg-slate-700/30\"\n }), [])\n\n return (\n <div\n ref={ref}\n className={merge(\n \"inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-gray-400 focus:ring-offset-2\",\n variantClasses[variant],\n className\n )}\n {...props}\n />\n )\n }\n))\nBadge.displayName = \"Badge\"\n\nexport { Badge } ","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * Skeleton 컴포넌트의 props\n * @typedef {Object} SkeletonProps\n * @property {\"text\" | \"circular\" | \"rectangular\" | \"rounded\"} [variant=\"text\"] - Skeleton 모양\n * @property {string | number} [width] - 너비 (기본값: variant에 따라 다름)\n * @property {string | number} [height] - 높이 (기본값: variant에 따라 다름)\n * @property {\"pulse\" | \"wave\" | \"shimmer\"} [animation=\"pulse\"] - 애니메이션 타입\n * @property {string} [className] - 추가 CSS 클래스\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface SkeletonProps extends React.HTMLAttributes<HTMLDivElement> {\n variant?: \"text\" | \"circular\" | \"rectangular\" | \"rounded\"\n width?: string | number\n height?: string | number\n animation?: \"pulse\" | \"wave\" | \"shimmer\"\n className?: string\n}\n\n/**\n * Skeleton 컴포넌트 / Skeleton component\n * \n * 로딩 중 콘텐츠의 플레이스홀더를 표시하는 스켈레톤 컴포넌트입니다.\n * 다양한 모양과 애니메이션을 지원합니다.\n * \n * Skeleton component that displays placeholders for content while loading.\n * Supports various shapes and animations.\n * \n * @component\n * @example\n * // 기본 사용 (텍스트) / Basic usage (text)\n * <Skeleton />\n * \n * @example\n * // 원형 아바타 / Circular avatar\n * <Skeleton variant=\"circular\" width={40} height={40} />\n * \n * @example\n * // Wave 애니메이션 / Wave animation\n * <Skeleton \n * variant=\"rounded\" \n * width=\"100%\" \n * height={200}\n * animation=\"wave\"\n * />\n * \n * @param {SkeletonProps} props - Skeleton 컴포넌트의 props / Skeleton component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} Skeleton 컴포넌트 / Skeleton component\n */\nconst Skeleton = React.forwardRef<HTMLDivElement, SkeletonProps>(\n ({ \n className, \n variant = \"text\",\n width,\n height,\n animation = \"pulse\",\n ...props \n }, ref) => {\n const getVariantClasses = () => {\n switch (variant) {\n case \"circular\":\n return \"rounded-full\"\n case \"rounded\":\n return \"rounded-lg\"\n case \"rectangular\":\n return \"rounded-none\"\n case \"text\":\n default:\n return \"rounded\"\n }\n }\n\n const getAnimationClasses = () => {\n switch (animation) {\n case \"wave\":\n return \"animate-pulse bg-gradient-to-r from-gray-200 via-gray-300 to-gray-200 bg-[length:200%_100%] animate-shimmer\"\n case \"shimmer\":\n return \"bg-gradient-to-r from-gray-200 via-gray-300 to-gray-200 bg-[length:200%_100%] animate-shimmer\"\n case \"pulse\":\n default:\n return \"animate-pulse bg-gray-200 dark:bg-gray-700\"\n }\n }\n\n const getDefaultDimensions = () => {\n switch (variant) {\n case \"circular\":\n return { width: \"40px\", height: \"40px\" }\n case \"text\":\n return { width: \"100%\", height: \"1em\" }\n case \"rounded\":\n return { width: \"100%\", height: \"200px\" }\n case \"rectangular\":\n return { width: \"100%\", height: \"200px\" }\n default:\n return { width: \"100%\", height: \"1em\" }\n }\n }\n\n const defaultDims = getDefaultDimensions()\n const finalWidth = width || defaultDims.width\n const finalHeight = height || defaultDims.height\n\n return (\n <div\n ref={ref}\n className={merge(\n \"block\",\n getVariantClasses(),\n getAnimationClasses(),\n className\n )}\n style={{\n width: typeof finalWidth === \"number\" ? `${finalWidth}px` : finalWidth,\n height: typeof finalHeight === \"number\" ? `${finalHeight}px` : finalHeight,\n }}\n {...props}\n />\n )\n }\n)\nSkeleton.displayName = \"Skeleton\"\n\n// 편의 컴포넌트들\nexport const SkeletonText = React.forwardRef<HTMLDivElement, Omit<SkeletonProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Skeleton ref={ref} variant=\"text\" className={className} {...props} />\n )\n)\nSkeletonText.displayName = \"SkeletonText\"\n\nexport const SkeletonCircle = React.forwardRef<HTMLDivElement, Omit<SkeletonProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Skeleton ref={ref} variant=\"circular\" className={className} {...props} />\n )\n)\nSkeletonCircle.displayName = \"SkeletonCircle\"\n\nexport const SkeletonRectangle = React.forwardRef<HTMLDivElement, Omit<SkeletonProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Skeleton ref={ref} variant=\"rectangular\" className={className} {...props} />\n )\n)\nSkeletonRectangle.displayName = \"SkeletonRectangle\"\n\nexport const SkeletonRounded = React.forwardRef<HTMLDivElement, Omit<SkeletonProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Skeleton ref={ref} variant=\"rounded\" className={className} {...props} />\n )\n)\nSkeletonRounded.displayName = \"SkeletonRounded\"\n\n// 복합 스켈레톤 컴포넌트들\nexport const SkeletonCard = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"space-y-4 p-6\", className)} // 16px 간격, 24px 패딩\n {...props}\n >\n <div className=\"flex items-center space-x-4\"> {/* 16px 간격 */}\n <SkeletonCircle className=\"w-12 h-12\" /> {/* 48px 크기 */}\n <div className=\"space-y-2 flex-1\"> {/* 8px 간격 */}\n <SkeletonText className=\"h-4 w-3/4\" /> {/* 16px 높이, 75% 너비 */}\n <SkeletonText className=\"h-3 w-1/2\" /> {/* 12px 높이, 50% 너비 */}\n </div>\n </div>\n <SkeletonRounded className=\"w-full h-32\" /> {/* 128px 높이 */}\n <div className=\"space-y-2\"> {/* 8px 간격 */}\n <SkeletonText className=\"h-4 w-full\" />\n <SkeletonText className=\"h-4 w-5/6\" />\n <SkeletonText className=\"h-4 w-4/6\" />\n </div>\n </div>\n )\n)\nSkeletonCard.displayName = \"SkeletonCard\"\n\nexport const SkeletonAvatar = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"flex items-center space-x-4\", className)} // 16px 간격\n {...props}\n >\n <SkeletonCircle className=\"w-12 h-12\" /> {/* 48px 크기 */}\n <div className=\"space-y-2 flex-1\"> {/* 8px 간격 */}\n <SkeletonText className=\"h-4 w-3/4\" />\n <SkeletonText className=\"h-3 w-1/2\" />\n </div>\n </div>\n )\n)\nSkeletonAvatar.displayName = \"SkeletonAvatar\"\n\nexport const SkeletonImage = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"space-y-2\", className)} // 8px 간격\n {...props}\n >\n <SkeletonRounded className=\"w-full h-48\" /> {/* 192px 높이 */}\n <SkeletonText className=\"h-4 w-1/2\" />\n </div>\n )\n)\nSkeletonImage.displayName = \"SkeletonImage\"\n\nexport const SkeletonUserProfile = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"space-y-4\", className)} // 16px 간격\n {...props}\n >\n <div className=\"flex items-center space-x-4\"> {/* 16px 간격 */}\n <SkeletonCircle className=\"w-16 h-16\" /> {/* 64px 크기 */}\n <div className=\"space-y-2 flex-1\"> {/* 8px 간격 */}\n <SkeletonText className=\"h-5 w-1/2\" />\n <SkeletonText className=\"h-3 w-1/3\" />\n </div>\n </div>\n <div className=\"space-y-2\"> {/* 8px 간격 */}\n <SkeletonText className=\"h-4 w-full\" />\n <SkeletonText className=\"h-4 w-5/6\" />\n </div>\n </div>\n )\n)\nSkeletonUserProfile.displayName = \"SkeletonUserProfile\"\n\nexport const SkeletonList = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"space-y-4\", className)} // 16px 간격\n {...props}\n >\n {Array.from({ length: 3 }).map((_, index) => (\n <div key={index} className=\"flex items-center space-x-4\"> {/* 16px 간격 */}\n <SkeletonCircle className=\"w-10 h-10\" /> {/* 40px 크기 */}\n <div className=\"space-y-2 flex-1\"> {/* 8px 간격 */}\n <SkeletonText className=\"h-4 w-3/4\" />\n <SkeletonText className=\"h-3 w-1/2\" />\n </div>\n </div>\n ))}\n </div>\n )\n)\nSkeletonList.displayName = \"SkeletonList\"\n\nexport const SkeletonTable = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"space-y-4\", className)} // 16px 간격\n {...props}\n >\n {/* 헤더 */}\n <div className=\"flex space-x-4\"> {/* 16px 간격 */}\n <SkeletonText className=\"h-4 w-1/4\" />\n <SkeletonText className=\"h-4 w-1/4\" />\n <SkeletonText className=\"h-4 w-1/4\" />\n <SkeletonText className=\"h-4 w-1/4\" />\n </div>\n {/* 행들 */}\n {Array.from({ length: 5 }).map((_, index) => (\n <div key={index} className=\"flex space-x-4\"> {/* 16px 간격 */}\n <SkeletonText className=\"h-4 w-1/4\" />\n <SkeletonText className=\"h-4 w-1/4\" />\n <SkeletonText className=\"h-4 w-1/4\" />\n <SkeletonText className=\"h-4 w-1/4\" />\n </div>\n ))}\n </div>\n )\n)\nSkeletonTable.displayName = \"SkeletonTable\"\n\nexport { Skeleton } ","\"use client\";\n\nimport React from \"react\";\nimport { merge } from \"../../lib/utils\";\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n TableCaption,\n} from \"../Table\";\nimport { Badge } from \"../Badge\";\nimport { SkeletonTable } from \"../Skeleton\";\nimport { DashboardEmptyState } from \"./EmptyState\";\n\nexport type TransactionStatus =\n | \"approved\"\n | \"pending\"\n | \"failed\"\n | \"refunded\"\n | \"cancelled\"\n | \"review\";\n\nexport type TransactionColumnKey =\n | \"id\"\n | \"merchant\"\n | \"amount\"\n | \"status\"\n | \"method\"\n | \"date\"\n | \"fee\"\n | \"customer\";\n\n/**\n * 거래 테이블 행 인터페이스\n * @typedef {Object} TransactionRow\n * @property {string} id - 거래 ID\n * @property {string} merchant - 가맹점\n * @property {number} amount - 거래 금액\n * @property {string} [currency] - 통화\n * @property {TransactionStatus} status - 거래 상태\n * @property {string} [method] - 결제수단\n * @property {string | Date} date - 거래 일시\n * @property {string} [customer] - 고객 정보\n * @property {number} [fee] - 수수료\n * @property {string} [reference] - 참조 번호\n */\nexport interface TransactionRow {\n id: string;\n merchant: string;\n amount: number;\n currency?: string;\n status: TransactionStatus;\n method?: string;\n date: string | Date;\n customer?: string;\n fee?: number;\n reference?: string;\n [key: string]: unknown;\n}\n\n/**\n * 거래 테이블 컬럼 설정 인터페이스\n * @typedef {Object} TransactionColumnConfig\n * @property {TransactionColumnKey} key - 컬럼 키\n * @property {string} [label] - 컬럼 라벨\n * @property {\"left\" | \"center\" | \"right\"} [align] - 정렬\n * @property {string} [width] - 컬럼 너비\n * @property {(row: TransactionRow) => React.ReactNode} [render] - 커스텀 렌더러\n */\nexport interface TransactionColumnConfig {\n key: TransactionColumnKey;\n label?: string;\n align?: \"left\" | \"center\" | \"right\";\n width?: string;\n render?: (row: TransactionRow) => React.ReactNode;\n}\n\n/**\n * TransactionsTable 컴포넌트의 props\n * @typedef {Object} TransactionsTableProps\n * @property {TransactionRow[]} rows - 거래 행 배열\n * @property {TransactionColumnConfig[]} [columns] - 컬럼 설정 배열\n * @property {boolean} [isLoading=false] - 로딩 상태\n * @property {number} [loadingRows] - 로딩 행 수\n * @property {React.ReactNode} [caption] - 테이블 캡션\n * @property {React.ReactNode} [filters] - 필터 컴포넌트\n * @property {React.ReactNode} [emptyState] - 빈 상태 컴포넌트\n * @property {(row: TransactionRow) => void} [onRowClick] - 행 클릭 핸들러\n * @property {(row: TransactionRow) => boolean} [highlightRow] - 행 강조 조건\n * @property {Partial<Record<TransactionStatus, string>>} [statusLabels] - 상태 라벨 커스터마이징\n * @property {(status: TransactionStatus, row: TransactionRow) => React.ReactNode} [statusRenderer] - 상태 커스텀 렌더러\n * @property {(row: TransactionRow) => React.ReactNode} [amountFormatter] - 금액 커스텀 포맷터\n * @property {(row: TransactionRow) => React.ReactNode} [methodFormatter] - 결제수단 커스텀 포맷터\n * @property {(row: TransactionRow) => React.ReactNode} [dateFormatter] - 날짜 커스텀 포맷터\n * @property {string} [locale=\"ko-KR\"] - 로케일\n * @property {string} [defaultCurrency=\"KRW\"] - 기본 통화\n * @property {string} [className] - 추가 클래스명\n * @property {React.ReactNode} [footer] - 푸터 컴포넌트\n * @property {(row: TransactionRow) => string} [rowActionLabel] - 행 액션 라벨 생성 함수\n * @property {string} [rowActionHint] - 행 액션 힌트 텍스트\n */\nexport interface TransactionsTableProps {\n rows: TransactionRow[];\n columns?: TransactionColumnConfig[];\n isLoading?: boolean;\n loadingRows?: number;\n caption?: React.ReactNode;\n filters?: React.ReactNode;\n emptyState?: React.ReactNode;\n onRowClick?: (row: TransactionRow) => void;\n highlightRow?: (row: TransactionRow) => boolean;\n statusLabels?: Partial<Record<TransactionStatus, string>>;\n statusRenderer?: (status: TransactionStatus, row: TransactionRow) => React.ReactNode;\n amountFormatter?: (row: TransactionRow) => React.ReactNode;\n methodFormatter?: (row: TransactionRow) => React.ReactNode;\n dateFormatter?: (row: TransactionRow) => React.ReactNode;\n locale?: string;\n defaultCurrency?: string;\n className?: string;\n footer?: React.ReactNode;\n rowActionLabel?: (row: TransactionRow) => string;\n rowActionHint?: string;\n}\n\nconst STATUS_STYLES: Record<TransactionStatus, { label: string; badge: string }> = {\n approved: {\n label: \"승인\",\n badge: \"bg-emerald-100 text-emerald-700 dark:bg-emerald-500/15 dark:text-emerald-200\",\n },\n pending: {\n label: \"대기\",\n badge: \"bg-amber-100 text-amber-700 dark:bg-amber-500/15 dark:text-amber-200\",\n },\n failed: {\n label: \"실패\",\n badge: \"bg-rose-100 text-rose-700 dark:bg-rose-500/15 dark:text-rose-200\",\n },\n refunded: {\n label: \"환불\",\n badge: \"bg-sky-100 text-sky-700 dark:bg-sky-500/15 dark:text-sky-200\",\n },\n cancelled: {\n label: \"취소\",\n badge: \"bg-slate-100 text-slate-700 dark:bg-slate-500/15 dark:text-slate-200\",\n },\n review: {\n label: \"검토중\",\n badge: \"bg-violet-100 text-violet-700 dark:bg-violet-500/15 dark:text-violet-200\",\n },\n};\n\nconst DEFAULT_COLUMNS: TransactionColumnConfig[] = [\n { key: \"id\", label: \"거래 ID\", width: \"160px\" },\n { key: \"merchant\", label: \"가맹점\" },\n { key: \"amount\", label: \"금액\", align: \"right\", width: \"140px\" },\n { key: \"status\", label: \"상태\", width: \"120px\" },\n { key: \"method\", label: \"결제수단\", width: \"120px\" },\n { key: \"date\", label: \"거래 일시\", width: \"180px\" },\n];\n\n/**\n * TransactionsTable 컴포넌트\n * \n * 거래 목록을 테이블 형태로 표시하는 컴포넌트입니다.\n * 정렬, 필터링, 커스텀 렌더링 등을 지원합니다.\n * \n * Table component that displays transaction list.\n * Supports sorting, filtering, and custom rendering.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <TransactionsTable\n * rows={[\n * {\n * id: \"tx_123\",\n * merchant: \"가맹점 A\",\n * amount: 100000,\n * status: \"approved\",\n * method: \"카드\",\n * date: new Date()\n * }\n * ]}\n * onRowClick={(row) => console.log(row)}\n * />\n * \n * @example\n * // 커스텀 컬럼과 포맷터 / Custom columns and formatters\n * <TransactionsTable\n * rows={transactions}\n * columns={[\n * { key: \"id\", label: \"ID\" },\n * { key: \"amount\", label: \"금액\", align: \"right\" },\n * { key: \"status\", label: \"상태\" }\n * ]}\n * amountFormatter={(row) => `₩${row.amount.toLocaleString()}`}\n * statusRenderer={(status) => <CustomBadge status={status} />}\n * isLoading={loading}\n * />\n * \n * @param {TransactionsTableProps} props - TransactionsTable 컴포넌트의 props / TransactionsTable component props\n * @returns {JSX.Element} TransactionsTable 컴포넌트 / TransactionsTable component\n */\nexport const TransactionsTable: React.FC<TransactionsTableProps> = ({\n rows,\n columns = DEFAULT_COLUMNS,\n isLoading = false,\n caption,\n filters,\n emptyState,\n onRowClick,\n highlightRow,\n statusLabels,\n statusRenderer,\n amountFormatter,\n methodFormatter,\n dateFormatter,\n locale = \"ko-KR\",\n defaultCurrency = \"KRW\",\n className,\n footer,\n rowActionLabel,\n rowActionHint,\n}) => {\n const columnList = columns.length > 0 ? columns : DEFAULT_COLUMNS;\n const hasRows = rows.length > 0;\n const tableId = React.useId();\n const rowActionHintId = rowActionHint ? `${tableId}-row-action-hint` : undefined;\n\n const getRowActionLabel = React.useCallback(\n (row: TransactionRow) => {\n if (rowActionLabel) return rowActionLabel(row);\n const baseLabel = row.id ? `거래 ${row.id}` : \"거래 행\";\n return `${baseLabel} 상세 보기`;\n },\n [rowActionLabel]\n );\n\n const renderStatus = (status: TransactionStatus, row: TransactionRow) => {\n if (statusRenderer) return statusRenderer(status, row);\n const config = STATUS_STYLES[status] || STATUS_STYLES.pending;\n const label = statusLabels?.[status] ?? config.label;\n return (\n <Badge className={merge(\"font-medium px-3 py-1 rounded-full text-xs\", config.badge)}>\n {label}\n </Badge>\n );\n };\n\n const renderAmount = (row: TransactionRow) => {\n if (amountFormatter) return amountFormatter(row);\n const currency = row.currency || defaultCurrency;\n try {\n return (\n <span className=\"font-semibold text-slate-900 dark:text-slate-100\">\n {new Intl.NumberFormat(locale, {\n style: \"currency\",\n currency,\n maximumFractionDigits: 2,\n }).format(row.amount)}\n </span>\n );\n } catch {\n return `${row.amount.toLocaleString(locale)} ${currency}`;\n }\n };\n\n const renderMethod = (row: TransactionRow) => {\n if (methodFormatter) return methodFormatter(row);\n return row.method ?? \"-\";\n };\n\n const renderDate = (row: TransactionRow) => {\n if (dateFormatter) return dateFormatter(row);\n const dateObj = row.date instanceof Date ? row.date : new Date(row.date);\n return dateObj.toLocaleString(locale, { dateStyle: \"medium\", timeStyle: \"short\" });\n };\n\n const renderCell = (column: TransactionColumnConfig, row: TransactionRow) => {\n if (column.render) return column.render(row);\n\n switch (column.key) {\n case \"id\":\n return (\n <div className=\"flex flex-col\">\n <span className=\"font-medium text-slate-900 dark:text-slate-100\">{row.id}</span>\n {row.reference && (\n <span className=\"text-xs text-slate-500 dark:text-slate-400\">{row.reference}</span>\n )}\n </div>\n );\n case \"merchant\":\n return (\n <div className=\"flex flex-col\">\n <span className=\"font-medium text-slate-900 dark:text-slate-100\">{row.merchant}</span>\n {row.customer && (\n <span className=\"text-xs text-slate-500 dark:text-slate-400\">{row.customer}</span>\n )}\n </div>\n );\n case \"amount\":\n return (\n <div className=\"flex flex-col items-end\">\n {renderAmount(row)}\n {typeof row.fee === \"number\" && (\n <span className=\"text-xs text-slate-500 dark:text-slate-400\">\n 수수료 {row.fee.toLocaleString(locale)}\n </span>\n )}\n </div>\n );\n case \"status\":\n return renderStatus(row.status, row);\n case \"method\":\n return <span className=\"text-slate-700 dark:text-slate-300\">{renderMethod(row)}</span>;\n case \"date\":\n return <span className=\"text-slate-700 dark:text-slate-300\">{renderDate(row)}</span>;\n case \"customer\":\n return row.customer ?? \"-\";\n case \"fee\":\n return typeof row.fee === \"number\" ? row.fee.toLocaleString(locale) : \"-\";\n default:\n return \"-\";\n }\n };\n\n return (\n <div className={merge(\"rounded-2xl border border-slate-200/60 dark:border-slate-800 bg-white dark:bg-slate-900\", className)}>\n {filters && (\n <div className=\"border-b border-slate-100 dark:border-slate-800 px-4 sm:px-6 py-4\">{filters}</div>\n )}\n <div className=\"p-4 sm:p-6\">\n <div className=\"rounded-xl border border-slate-100 dark:border-slate-800 overflow-hidden\">\n <Table\n role=\"table\"\n aria-label={caption ? (typeof caption === \"string\" ? caption : \"거래 목록 테이블\") : \"거래 목록 테이블\"}\n >\n {caption && <TableCaption>{caption}</TableCaption>}\n <TableHeader className=\"bg-slate-50/60 dark:bg-slate-900/40\">\n <TableRow className=\"text-xs uppercase tracking-wide text-slate-500 dark:text-slate-400\">\n {columnList.map((column) => (\n <TableHead\n key={column.key}\n style={{ width: column.width }}\n className={merge(\n column.align === \"right\"\n ? \"text-right\"\n : column.align === \"center\"\n ? \"text-center\"\n : \"text-left\",\n \"text-xs font-semibold\"\n )}\n >\n {column.label}\n </TableHead>\n ))}\n </TableRow>\n </TableHeader>\n <TableBody>\n {isLoading && (\n <TableRow>\n <TableCell colSpan={columnList.length}>\n <SkeletonTable className=\"py-4\" />\n </TableCell>\n </TableRow>\n )}\n {!isLoading && !hasRows && (\n <TableRow>\n <TableCell colSpan={columnList.length}>\n {emptyState || (\n <DashboardEmptyState\n title=\"거래 데이터가 없습니다\"\n description=\"필터를 조정하거나 날짜 범위를 변경해보세요.\"\n icon=\"database-backup\"\n size=\"md\"\n />\n )}\n </TableCell>\n </TableRow>\n )}\n {!isLoading &&\n rows.map((row) => {\n const clickable = Boolean(onRowClick);\n const handleRowKeyDown = (event: React.KeyboardEvent<HTMLTableRowElement>) => {\n if (!onRowClick) return;\n if (event.key === \"Enter\" || event.key === \" \" || event.key === \"Spacebar\") {\n event.preventDefault();\n onRowClick(row);\n }\n };\n const rowLabel = clickable ? getRowActionLabel(row) : undefined;\n return (\n <TableRow\n key={row.id}\n tabIndex={clickable ? 0 : undefined}\n role={clickable ? \"button\" : undefined}\n onKeyDown={clickable ? handleRowKeyDown : undefined}\n onClick={onRowClick ? () => onRowClick(row) : undefined}\n aria-label={rowLabel}\n aria-describedby={clickable && rowActionHintId ? rowActionHintId : undefined}\n className={merge(\n \"text-sm focus:outline-none focus-visible:ring-2 focus-visible:ring-blue-500/70\",\n clickable && \"cursor-pointer hover:bg-slate-50 dark:hover:bg-slate-800/60\",\n highlightRow?.(row) && \"bg-blue-50/60 dark:bg-blue-900/20\"\n )}\n >\n {columnList.map((column) => (\n <TableCell\n key={column.key}\n className={merge(\n column.align === \"right\"\n ? \"text-right\"\n : column.align === \"center\"\n ? \"text-center\"\n : \"text-left\",\n \"align-middle\"\n )}\n >\n {renderCell(column, row)}\n </TableCell>\n ))}\n </TableRow>\n );\n })}\n </TableBody>\n </Table>\n {!isLoading && hasRows && footer && (\n <div className=\"border-t border-slate-100 dark:border-slate-800 bg-slate-50/50 dark:bg-slate-900/50 px-4 py-3 text-sm text-slate-600 dark:text-slate-300\">\n {footer}\n </div>\n )}\n </div>\n </div>\n {rowActionHint && (\n <p id={rowActionHintId} className=\"sr-only\">\n {rowActionHint}\n </p>\n )}\n </div>\n );\n};\n\nTransactionsTable.displayName = \"TransactionsTable\";\n\n","\"use client\";\n\nimport React from \"react\";\nimport { merge } from \"../lib/utils\";\n\n/**\n * 버튼 스타일 변형 / Button style variant\n * @typedef {\"default\" | \"destructive\" | \"outline\" | \"secondary\" | \"ghost\" | \"link\" | \"gradient\" | \"neon\" | \"glass\"} Variant\n */\ntype Variant =\n | \"default\" | \"destructive\" | \"outline\" | \"secondary\"\n | \"ghost\" | \"link\" | \"gradient\" | \"neon\" | \"glass\";\n\n/**\n * 버튼 크기 / Button size\n * @typedef {\"sm\" | \"md\" | \"lg\" | \"xl\" | \"icon\"} Size\n */\ntype Size = \"sm\" | \"md\" | \"lg\" | \"xl\" | \"icon\";\n\n/**\n * 버튼 모서리 둥글기 / Button border radius\n * @typedef {\"sm\" | \"md\" | \"lg\" | \"full\"} Rounded\n */\ntype Rounded = \"sm\" | \"md\" | \"lg\" | \"full\";\n\n/**\n * 버튼 그림자 / Button shadow\n * @typedef {\"none\" | \"sm\" | \"md\" | \"lg\" | \"xl\"} Shadow\n */\ntype Shadow = \"none\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n\n/**\n * 버튼 호버 효과 / Button hover effect\n * @typedef {\"scale\" | \"glow\" | \"slide\" | \"none\"} Hover\n */\ntype Hover = \"scale\" | \"glow\" | \"slide\" | \"none\";\n\n/**\n * 그라디언트 색상 이름 / Gradient color name\n * @typedef {\"blue\" | \"purple\" | \"green\" | \"orange\" | \"pink\" | \"custom\"} GradientName\n */\ntype GradientName = \"blue\" | \"purple\" | \"green\" | \"orange\" | \"pink\" | \"custom\";\n\n/**\n * Button 컴포넌트의 공통 props / Common props for Button component\n * @typedef {Object} CommonProps\n * @property {Variant} [variant=\"default\"] - 버튼 스타일 변형 / Button style variant\n * @property {Size} [size=\"md\"] - 버튼 크기 / Button size\n * @property {boolean} [loading=false] - 로딩 상태 (스피너 표시) / Loading state (shows spinner)\n * @property {React.ReactNode} [icon] - 아이콘 요소 / Icon element\n * @property {\"left\" | \"right\"} [iconPosition=\"left\"] - 아이콘 위치 / Icon position\n * @property {GradientName} [gradient=\"blue\"] - 그라디언트 색상 (variant=\"gradient\"일 때) / Gradient color (when variant=\"gradient\")\n * @property {string} [customGradient] - 커스텀 그라디언트 클래스 (variant=\"gradient\"일 때) / Custom gradient class (when variant=\"gradient\")\n * @property {Rounded} [rounded=\"md\"] - 모서리 둥글기 / Border radius\n * @property {Shadow} [shadow=\"md\"] - 그림자 크기 / Shadow size\n * @property {Hover} [hover=\"scale\"] - 호버 효과 / Hover effect\n * @property {boolean} [fullWidth=false] - 전체 너비 사용 / Use full width\n * @property {boolean} [iconOnly=false] - 아이콘만 표시 (aria-label 필수) / Icon only (aria-label required)\n * @property {string} [aria-label] - 접근성을 위한 레이블 (iconOnly일 때 필수) / Accessibility label (required when iconOnly)\n * @property {string} [className] - 추가 CSS 클래스 / Additional CSS class\n * @property {boolean} [disabled=false] - 비활성화 상태 / Disabled state\n */\ntype CommonProps = {\n variant?: Variant;\n size?: Size;\n loading?: boolean;\n icon?: React.ReactNode;\n iconPosition?: \"left\" | \"right\";\n gradient?: GradientName;\n customGradient?: string;\n rounded?: Rounded;\n shadow?: Shadow;\n hover?: Hover;\n fullWidth?: boolean;\n iconOnly?: boolean;\n \"aria-label\"?: string;\n className?: string;\n disabled?: boolean; // <-- 요놈 추가\n};\n\ntype AnchorProps = CommonProps &\n Omit<React.AnchorHTMLAttributes<HTMLAnchorElement>, \"className\"> & {\n href: string;\n };\n\ntype NativeButtonProps = CommonProps &\n Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, \"className\" | \"type\"> & {\n href?: undefined;\n };\n\n/**\n * Button 컴포넌트의 props 타입 / Button component props type\n * href가 제공되면 앵커 태그로, 그렇지 않으면 버튼 태그로 렌더링됩니다.\n * Renders as anchor tag if href is provided, otherwise as button tag.\n * @typedef {AnchorProps | NativeButtonProps} ButtonProps\n */\nexport type ButtonProps = AnchorProps | NativeButtonProps;\n\ntype AnchorOrButton = HTMLAnchorElement | HTMLButtonElement;\n\nconst isBrowser = typeof window !== \"undefined\";\nfunction useReducedMotion() {\n const [reduce, setReduce] = React.useState(false);\n React.useEffect(() => {\n if (!isBrowser || !(\"matchMedia\" in window)) return;\n const mq = window.matchMedia(\"(prefers-reduced-motion: reduce)\");\n const onChange = () => setReduce(!!mq.matches);\n onChange();\n mq.addEventListener?.(\"change\", onChange);\n return () => mq.removeEventListener?.(\"change\", onChange);\n }, []);\n return reduce;\n}\n\n/**\n * Button 컴포넌트 / Button component\n * \n * 다양한 스타일과 크기를 지원하는 범용 버튼 컴포넌트입니다.\n * href prop을 제공하면 앵커 태그로, 그렇지 않으면 버튼 태그로 렌더링됩니다.\n * \n * Universal button component supporting various styles and sizes.\n * Renders as anchor tag if href prop is provided, otherwise as button tag.\n * \n * @component\n * @example\n * // 기본 버튼 / Basic button\n * <Button onClick={() => console.log('클릭')}>클릭하세요</Button>\n * \n * @example\n * // 다양한 변형 / Various variants\n * <Button variant=\"destructive\" size=\"lg\">삭제</Button>\n * <Button variant=\"outline\" size=\"sm\">취소</Button>\n * <Button variant=\"ghost\">보기</Button>\n * \n * @example\n * // 아이콘과 함께 사용 / With icon\n * <Button icon={<Icon name=\"download\" />} iconPosition=\"left\">\n * 다운로드\n * </Button>\n * \n * @example\n * // 로딩 상태 / Loading state\n * <Button loading disabled>저장 중...</Button>\n * \n * @example\n * // 링크 버튼 / Link button\n * <Button href=\"/about\" variant=\"link\">자세히 보기</Button>\n * \n * @example\n * // 아이콘만 표시 (aria-label 필수) / Icon only (aria-label required)\n * <Button iconOnly aria-label=\"닫기\" icon={<Icon name=\"close\" />} />\n * \n * @param {ButtonProps} props - Button 컴포넌트의 props / Button component props\n * @param {React.Ref<HTMLAnchorElement | HTMLButtonElement>} ref - ref 객체 / ref object\n * @returns {JSX.Element} Button 컴포넌트 / Button component\n */\nconst ButtonInner = React.forwardRef<AnchorOrButton, ButtonProps>(function ButtonInner(\n {\n variant = \"default\",\n size = \"md\",\n loading = false,\n icon,\n iconPosition = \"left\",\n gradient = \"blue\",\n customGradient,\n rounded = \"md\",\n shadow = \"md\",\n hover = \"scale\",\n fullWidth,\n iconOnly,\n className,\n children,\n disabled,\n ...rest\n },\n ref\n) {\n const reduced = useReducedMotion();\n\n const variantClasses: Record<Variant, string> = {\n default:\n \"bg-blue-600 text-white hover:bg-blue-700 dark:bg-blue-500 dark:hover:bg-blue-600\",\n destructive:\n \"bg-red-600 text-white hover:bg-red-700 dark:bg-red-500 dark:hover:bg-red-600\",\n outline:\n \"border-2 border-blue-600 bg-transparent text-blue-600 hover:bg-blue-50 dark:border-blue-400 dark:text-blue-400 dark:hover:bg-blue-900/20\",\n secondary:\n \"bg-gray-200 text-gray-900 hover:bg-gray-300 dark:bg-gray-700 dark:text-white dark:hover:bg-gray-600\",\n ghost:\n \"bg-transparent text-gray-700 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-800\",\n link:\n \"bg-transparent text-blue-600 underline hover:text-blue-700 dark:text-blue-400 dark:hover:text-blue-300\",\n gradient: `bg-gradient-to-r ${customGradient || getGradientClass(gradient)} text-white hover:shadow-lg`,\n neon:\n \"bg-gray-900 text-cyan-400 border border-cyan-400/30 shadow-lg shadow-cyan-400/20 hover:shadow-cyan-400/40\",\n glass:\n \"bg-white/10 backdrop-blur-md border border-white/20 text-white hover:bg-white/20\",\n };\n\n const sizeClasses: Record<Size, string> = {\n sm: \"h-8 px-3 py-1 text-sm\",\n md: \"h-10 px-4 py-2 text-base\",\n lg: \"h-12 px-6 py-3 text-lg\",\n xl: \"h-14 px-8 py-4 text-xl\",\n icon: \"h-10 w-10 p-0\",\n };\n\n const roundedClasses: Record<Rounded, string> = {\n sm: \"rounded\",\n md: \"rounded-md\",\n lg: \"rounded-lg\",\n full: \"rounded-full\",\n };\n\n const shadowClasses: Record<Shadow, string> = {\n none: \"\",\n sm: \"shadow-sm\",\n md: \"shadow-md\",\n lg: \"shadow-lg\",\n xl: \"shadow-xl\",\n };\n\n const hoverClasses: Record<Hover, string> = {\n scale: reduced ? \"\" : \"hover:scale-105 transition-transform duration-200\",\n glow: reduced ? \"\" : \"hover:shadow-2xl hover:shadow-blue-500/25 dark:hover:shadow-cyan-400/25 transition-shadow duration-300\",\n slide: reduced ? \"\" : \"hover:-translate-y-1 transition-transform duration-200\",\n none: \"\",\n };\n\n // variant별 포커스 스타일\n const focusClasses: Record<Variant, string> = {\n default: \"focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-blue-500 focus-visible:ring-offset-1\",\n destructive: \"focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-red-500 focus-visible:ring-offset-1\",\n outline: \"focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-blue-300 dark:focus-visible:ring-blue-600 focus-visible:ring-offset-0\",\n secondary: \"focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-gray-400 focus-visible:ring-offset-1\",\n ghost: \"focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-gray-300 dark:focus-visible:ring-gray-600 focus-visible:ring-offset-0\",\n link: \"focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-blue-400 focus-visible:ring-offset-0\",\n gradient: \"focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-blue-500 focus-visible:ring-offset-1\",\n neon: \"focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-cyan-400 focus-visible:ring-offset-1\",\n glass: \"focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-blue-400/50 focus-visible:ring-offset-0\",\n };\n\n const base = merge(\n \"inline-flex items-center justify-center whitespace-nowrap font-medium transition-all duration-200\",\n focusClasses[variant],\n \"disabled:pointer-events-none disabled:opacity-50 min-w-fit\",\n fullWidth && \"w-full\",\n variantClasses[variant],\n sizeClasses[size],\n roundedClasses[rounded],\n shadowClasses[shadow],\n hoverClasses[hover],\n className\n );\n\n const Spinner = (\n <span role=\"status\" aria-live=\"polite\" className=\"-ml-1 mr-2 inline-flex\">\n <svg className=\"animate-spin h-4 w-4\" viewBox=\"0 0 24 24\" fill=\"none\">\n <circle className=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"4\" />\n <path className=\"opacity-75\" fill=\"currentColor\" 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 </svg>\n <span className=\"sr-only\">로딩 중</span>\n </span>\n );\n\n const content = (\n <>\n {loading && Spinner}\n {!loading && icon && iconPosition === \"left\" && <span className=\"mr-2\">{icon}</span>}\n {children}\n {!loading && icon && iconPosition === \"right\" && <span className=\"ml-2\">{icon}</span>}\n </>\n );\n\n if (iconOnly && !(\"aria-label\" in rest) && process.env.NODE_ENV !== \"production\") {\n // eslint-disable-next-line no-console\n console.warn(\"[Button] iconOnly 사용 시 aria-label을 제공하세요.\");\n }\n\n // 앵커 모드\n if (\"href\" in rest && rest.href) {\n const { onClick, target, rel, href, \"aria-label\": ariaLabel, className: anchorClassName, ...anchorProps } = rest as AnchorProps;\n const isDisabled = !!disabled || loading;\n\n const handleAnchorClick: React.MouseEventHandler<HTMLAnchorElement> = (e) => {\n if (isDisabled) { e.preventDefault(); e.stopPropagation(); return; }\n onClick?.(e);\n };\n\n return (\n <a\n ref={ref as React.Ref<HTMLAnchorElement>}\n href={href}\n className={merge(base, anchorClassName)}\n onClick={handleAnchorClick}\n aria-busy={loading || undefined}\n aria-disabled={isDisabled || undefined}\n tabIndex={isDisabled ? -1 : anchorProps.tabIndex}\n target={target}\n rel={target === \"_blank\" ? rel ?? \"noopener noreferrer\" : rel}\n {...anchorProps}\n >\n {content}\n </a>\n );\n }\n\n // 버튼 모드\n const { className: buttonClassName, ...btnProps } = rest as NativeButtonProps;\n const isDisabled = !!disabled || loading;\n return (\n <button\n ref={ref as React.Ref<HTMLButtonElement>}\n className={merge(base, buttonClassName)}\n type=\"button\" // 폼 기본 제출 방지\n disabled={isDisabled}\n aria-busy={loading || undefined}\n aria-disabled={isDisabled || undefined}\n {...btnProps}\n >\n {content}\n </button>\n );\n});\n\nButtonInner.displayName = \"Button\";\n\nexport const Button = ButtonInner;\n\nfunction getGradientClass(gradient: GradientName): string {\n const g: Record<Exclude<GradientName, \"custom\">, string> = {\n blue: \"from-blue-500 to-cyan-500\",\n purple: \"from-purple-500 to-pink-500\",\n green: \"from-green-500 to-emerald-500 dark:from-green-400 dark:to-emerald-400\",\n orange: \"from-orange-500 to-red-500 dark:from-orange-300 dark:to-red-300\",\n pink: \"from-pink-500 to-rose-500\",\n };\n return g[gradient as keyof typeof g] || g.blue;\n}\n","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * Dropdown 컴포넌트의 props / Dropdown component props\n * @typedef {Object} DropdownProps\n * @property {React.ReactNode} trigger - Dropdown을 열기 위한 트리거 요소 / Trigger element to open dropdown\n * @property {React.ReactNode} children - Dropdown 내용 / Dropdown content\n * @property {boolean} [open] - 제어 모드에서 열림/닫힘 상태 / Open/close state in controlled mode\n * @property {(open: boolean) => void} [onOpenChange] - 상태 변경 콜백 / State change callback\n * @property {\"top\" | \"bottom\" | \"left\" | \"right\"} [placement=\"bottom\"] - Dropdown 표시 위치 / Dropdown display position\n * @property {\"start\" | \"center\" | \"end\"} [align=\"start\"] - Dropdown 정렬 / Dropdown alignment\n * @property {number} [offset=8] - 트리거와 Dropdown 사이 간격 (px) / Spacing between trigger and dropdown (px)\n * @property {boolean} [disabled=false] - Dropdown 비활성화 여부 / Disable dropdown\n * @property {boolean} [showArrow=true] - 화살표 표시 여부 / Show arrow\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface DropdownProps extends React.HTMLAttributes<HTMLDivElement> {\n trigger: React.ReactNode\n children: React.ReactNode\n open?: boolean\n onOpenChange?: (open: boolean) => void\n placement?: \"top\" | \"bottom\" | \"left\" | \"right\"\n align?: \"start\" | \"center\" | \"end\"\n offset?: number\n disabled?: boolean\n showArrow?: boolean\n}\n\n/**\n * Dropdown 컴포넌트 / Dropdown component\n * \n * 트리거 요소를 클릭하면 표시되는 드롭다운 메뉴 컴포넌트입니다.\n * 외부 클릭 시 자동으로 닫히며, 뷰포트 경계를 자동으로 감지하여 위치를 조정합니다.\n * \n * Dropdown menu component that appears when the trigger element is clicked.\n * Automatically closes on outside click and adjusts position by detecting viewport boundaries.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Dropdown trigger={<Button>메뉴</Button>}>\n * <Menu>\n * <MenuItem>항목 1</MenuItem>\n * <MenuItem>항목 2</MenuItem>\n * </Menu>\n * </Dropdown>\n * \n * @example\n * // 제어 모드, 화살표 없음 / Controlled mode, no arrow\n * const [open, setOpen] = useState(false)\n * <Dropdown \n * open={open}\n * onOpenChange={setOpen}\n * trigger={<Button>제어 모드</Button>}\n * placement=\"top\"\n * showArrow={false}\n * >\n * <div className=\"p-4\">내용</div>\n * </Dropdown>\n * \n * @param {DropdownProps} props - Dropdown 컴포넌트의 props / Dropdown component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} Dropdown 컴포넌트 / Dropdown component\n */\nconst Dropdown = React.forwardRef<HTMLDivElement, DropdownProps>(\n ({ \n className, \n trigger,\n children,\n open: controlledOpen,\n onOpenChange,\n placement = \"bottom\",\n align = \"start\",\n offset = 8,\n disabled = false,\n showArrow = true,\n ...props \n }, ref) => {\n const [internalOpen, setInternalOpen] = React.useState(false)\n const [coords, setCoords] = React.useState({ x: 0, y: 0 })\n const triggerRef = React.useRef<HTMLDivElement>(null)\n const dropdownRef = React.useRef<HTMLDivElement>(null)\n const isControlled = controlledOpen !== undefined\n const isOpen = isControlled ? controlledOpen : internalOpen\n\n const handleOpenChange = (newOpen: boolean) => {\n if (disabled) return\n \n if (!isControlled) {\n setInternalOpen(newOpen)\n }\n onOpenChange?.(newOpen)\n }\n\n const handleTriggerClick = () => {\n handleOpenChange(!isOpen)\n }\n\n const updatePosition = React.useCallback(() => {\n if (!triggerRef.current || !dropdownRef.current) return\n\n const triggerRect = triggerRef.current.getBoundingClientRect()\n const dropdownRect = dropdownRef.current.getBoundingClientRect()\n const viewportWidth = window.innerWidth\n const viewportHeight = window.innerHeight\n\n let x = 0\n let y = 0\n\n // 기본 위치 계산\n switch (placement) {\n case \"top\":\n x = triggerRect.left\n y = triggerRect.top - offset\n break\n case \"bottom\":\n x = triggerRect.left\n y = triggerRect.bottom + offset\n break\n case \"left\":\n x = triggerRect.left - offset\n y = triggerRect.top\n break\n case \"right\":\n x = triggerRect.right + offset\n y = triggerRect.top\n break\n }\n\n // 정렬 조정\n switch (align) {\n case \"center\":\n if (placement === \"top\" || placement === \"bottom\") {\n x = triggerRect.left + triggerRect.width / 2 - dropdownRect.width / 2\n } else {\n y = triggerRect.top + triggerRect.height / 2 - dropdownRect.height / 2\n }\n break\n case \"end\":\n if (placement === \"top\" || placement === \"bottom\") {\n x = triggerRect.right - dropdownRect.width\n } else {\n y = triggerRect.bottom - dropdownRect.height\n }\n break\n case \"start\":\n default:\n // 기본값은 이미 start 정렬\n break\n }\n\n // 뷰포트 경계 확인 및 조정\n if (x < 8) x = 8 // 8px 여백\n if (x + dropdownRect.width > viewportWidth - 8) {\n x = viewportWidth - dropdownRect.width - 8 // 8px 여백\n }\n if (y < 8) y = 8 // 8px 여백\n if (y + dropdownRect.height > viewportHeight - 8) {\n y = viewportHeight - dropdownRect.height - 8 // 8px 여백\n }\n\n setCoords({ x, y })\n }, [placement, align, offset])\n\n React.useEffect(() => {\n if (isOpen) {\n updatePosition()\n window.addEventListener('resize', updatePosition)\n window.addEventListener('scroll', updatePosition)\n \n return () => {\n window.removeEventListener('resize', updatePosition)\n window.removeEventListener('scroll', updatePosition)\n }\n }\n }, [isOpen, updatePosition])\n\n React.useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n triggerRef.current && \n dropdownRef.current && \n !triggerRef.current.contains(event.target as Node) &&\n !dropdownRef.current.contains(event.target as Node)\n ) {\n handleOpenChange(false)\n }\n }\n\n if (isOpen) {\n document.addEventListener('mousedown', handleClickOutside)\n return () => {\n document.removeEventListener('mousedown', handleClickOutside)\n }\n }\n }, [isOpen])\n\n const getPlacementClasses = () => {\n switch (placement) {\n case \"top\":\n return \"bottom-full left-0 mb-2\" // 8px 간격\n case \"bottom\":\n return \"top-full left-0 mt-2\" // 8px 간격\n case \"left\":\n return \"right-full top-0 mr-2\" // 8px 간격\n case \"right\":\n return \"left-full top-0 ml-2\" // 8px 간격\n default:\n return \"top-full left-0 mt-2\"\n }\n }\n\n const getArrowClasses = () => {\n switch (placement) {\n case \"top\":\n return \"top-full left-4 -translate-x-1/2 border-t-gray-100 dark:border-t-gray-800\"\n case \"bottom\":\n return \"bottom-full left-4 -translate-x-1/2 border-b-gray-100 dark:border-b-gray-800\"\n case \"left\":\n return \"left-full top-4 -translate-y-1/2 border-l-gray-100 dark:border-l-gray-800\"\n case \"right\":\n return \"right-full top-4 -translate-y-1/2 border-r-gray-100 dark:border-r-gray-800\"\n default:\n return \"bottom-full left-4 -translate-x-1/2 border-b-gray-100 dark:border-b-gray-800\"\n }\n }\n\n return (\n <div ref={ref} className={merge(\"relative\", className)} {...props}>\n {/* 트리거 */}\n <div\n ref={triggerRef}\n onClick={handleTriggerClick}\n className=\"inline-block cursor-pointer\"\n >\n {trigger}\n </div>\n\n {/* 드롭다운 */}\n {isOpen && (\n <div\n ref={dropdownRef}\n className={merge(\n \"absolute z-50 bg-white dark:bg-gray-800 rounded-lg shadow-xl backdrop-blur-sm\", // 보더 대신 섀도우 사용\n \"min-w-[200px] py-2\", // 16px 패딩\n getPlacementClasses()\n )}\n style={{\n transform: `translate(${coords.x}px, ${coords.y}px)`,\n boxShadow: \"0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04)\"\n }}\n >\n {/* 화살표 */}\n {showArrow && (\n <div\n className={merge(\n \"absolute w-0 h-0 border-4 border-transparent\",\n getArrowClasses()\n )}\n />\n )}\n \n {/* 내용 */}\n <div className=\"relative z-10\">\n {children}\n </div>\n </div>\n )}\n </div>\n )\n }\n)\nDropdown.displayName = \"Dropdown\"\n\n// 드롭다운 아이템 컴포넌트들\nexport interface DropdownItemProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n icon?: React.ReactNode\n variant?: \"default\" | \"destructive\" | \"disabled\"\n}\n\nconst DropdownItem = React.forwardRef<HTMLButtonElement, DropdownItemProps>(\n ({ \n className, \n icon,\n variant = \"default\",\n children,\n disabled,\n ...props \n }, ref) => {\n const getVariantClasses = () => {\n switch (variant) {\n case \"destructive\":\n return \"text-red-600 dark:text-red-400 hover:bg-red-50 dark:hover:bg-red-900/20\"\n case \"disabled\":\n return \"text-gray-400 dark:text-gray-500 cursor-not-allowed\"\n default:\n return \"text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700\"\n }\n }\n\n return (\n <button\n ref={ref}\n className={merge(\n \"w-full flex items-center gap-3 px-4 py-3 text-sm font-medium transition-colors focus:outline-none focus:bg-gray-100 dark:focus:bg-gray-700\", // 16px, 12px 패딩\n getVariantClasses(),\n className\n )}\n disabled={disabled || variant === \"disabled\"}\n {...props}\n >\n {icon && (\n <div className=\"flex-shrink-0 w-4 h-4\">\n {icon}\n </div>\n )}\n <span className=\"flex-1 text-left\">{children}</span>\n </button>\n )\n }\n)\nDropdownItem.displayName = \"DropdownItem\"\n\nexport interface DropdownSeparatorProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nconst DropdownSeparator = React.forwardRef<HTMLDivElement, DropdownSeparatorProps>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"h-px bg-gray-200 dark:bg-gray-700 my-2\", className)} // 8px 여백\n {...props}\n />\n )\n)\nDropdownSeparator.displayName = \"DropdownSeparator\"\n\nexport interface DropdownLabelProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nconst DropdownLabel = React.forwardRef<HTMLDivElement, DropdownLabelProps>(\n ({ className, children, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"px-4 py-2 text-xs font-semibold text-gray-500 dark:text-gray-400 uppercase tracking-wide\", className)} // 16px, 8px 패딩\n {...props}\n >\n {children}\n </div>\n )\n)\nDropdownLabel.displayName = \"DropdownLabel\"\n\n// 편의 컴포넌트들\nconst DropdownMenu = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, children, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"py-1\", className)} // 4px 패딩\n {...props}\n >\n {children}\n </div>\n )\n)\nDropdownMenu.displayName = \"DropdownMenu\"\n\nconst DropdownGroup = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, children, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"space-y-1\", className)} // 4px 간격\n {...props}\n >\n {children}\n </div>\n )\n)\nDropdownGroup.displayName = \"DropdownGroup\"\n\nexport { Dropdown, DropdownItem, DropdownSeparator, DropdownLabel, DropdownMenu, DropdownGroup } ","\"use client\";\n\nimport React from \"react\";\nimport { merge } from \"../../lib/utils\";\nimport { Button } from \"../Button\";\nimport { Dropdown, DropdownItem, DropdownMenu } from \"../Dropdown\";\nimport { Icon } from \"../Icon\";\nimport type { IconName } from \"../../lib/icons\";\n\ntype ToolbarVariant = \"plain\" | \"cards\";\n\n/**\n * 툴바 액션 인터페이스 / ToolbarAction interface\n * @typedef {Object} ToolbarAction\n * @property {string} label - 액션 라벨 / Action label\n * @property {() => void} [onClick] - 클릭 핸들러 / Click handler\n * @property {string} [href] - 링크 URL / Link URL\n * @property {IconName | React.ReactNode} [icon] - 아이콘 / Icon\n * @property {\"primary\" | \"secondary\" | \"ghost\"} [appearance=\"secondary\"] - 액션 스타일 / Action style\n * @property {boolean} [loading] - 로딩 상태 / Loading state\n */\nexport interface ToolbarAction {\n label: string;\n onClick?: () => void;\n href?: string;\n icon?: IconName | React.ReactNode;\n appearance?: \"primary\" | \"secondary\" | \"ghost\";\n loading?: boolean;\n}\n\n/**\n * 날짜 프리셋 인터페이스 / DatePreset interface\n * @typedef {Object} DatePreset\n * @property {string} label - 프리셋 라벨 / Preset label\n * @property {string} value - 프리셋 값 / Preset value\n */\nexport interface DatePreset {\n label: string;\n value: string;\n}\n\n/**\n * 날짜 범위 설정 인터페이스 / DateRangeConfig interface\n * @typedef {Object} DateRangeConfig\n * @property {{ from: Date; to: Date } | null} value - 날짜 범위 값 / Date range value\n * @property {DatePreset[]} [presets] - 날짜 프리셋 배열 / Date preset array\n * @property {(preset: DatePreset) => void} [onSelectPreset] - 프리셋 선택 핸들러 / Preset selection handler\n * @property {() => void} [onCustomRange] - 커스텀 범위 선택 핸들러 / Custom range selection handler\n * @property {string} [display] - 표시 텍스트 / Display text\n */\nexport interface DateRangeConfig {\n value: { from: Date; to: Date } | null;\n presets?: DatePreset[];\n onSelectPreset?: (preset: DatePreset) => void;\n onCustomRange?: () => void;\n display?: string;\n}\n\n/**\n * DashboardToolbar 컴포넌트의 props / DashboardToolbar component props\n * @typedef {Object} DashboardToolbarProps\n * @property {React.ReactNode} [title] - 툴바 제목 / Toolbar title\n * @property {React.ReactNode} [description] - 툴바 설명 / Toolbar description\n * @property {React.ReactNode} [meta] - 메타 정보 / Meta information\n * @property {\"plain\" | \"cards\"} [variant=\"cards\"] - 툴바 스타일 변형 / Toolbar style variant\n * @property {DateRangeConfig} [dateRange] - 날짜 범위 설정 / Date range configuration\n * @property {React.ReactNode} [filters] - 필터 컴포넌트 / Filter component\n * @property {ToolbarAction[]} [actions] - 액션 버튼 배열 / Action buttons array\n * @property {() => void} [onRefresh] - 새로고침 핸들러 / Refresh handler\n * @property {string} [lastUpdated] - 마지막 업데이트 시간 / Last updated time\n * @extends {Omit<React.HTMLAttributes<HTMLDivElement>, \"title\">}\n */\nexport interface DashboardToolbarProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, \"title\"> {\n title?: React.ReactNode;\n description?: React.ReactNode;\n meta?: React.ReactNode;\n variant?: ToolbarVariant;\n dateRange?: DateRangeConfig;\n filters?: React.ReactNode;\n actions?: ToolbarAction[];\n onRefresh?: () => void;\n lastUpdated?: string;\n}\n\nconst actionAppearance = {\n primary: \"bg-blue-600 text-white hover:bg-blue-700\",\n secondary:\n \"border border-slate-200 text-slate-800 hover:bg-slate-50 dark:border-slate-700 dark:text-white dark:hover:bg-slate-800\",\n ghost: \"text-slate-600 hover:text-slate-900 dark:text-slate-300 dark:hover:text-white\",\n};\n\nconst ToolbarButton: React.FC<ToolbarAction> = ({\n label,\n onClick,\n href,\n icon,\n appearance = \"secondary\",\n loading,\n}) => {\n const content = (\n <>\n {icon &&\n (typeof icon === \"string\" ? (\n <Icon name={icon as IconName} className=\"h-4 w-4\" />\n ) : (\n icon\n ))}\n <span>{label}</span>\n </>\n );\n\n const className = merge(\n \"inline-flex items-center gap-2 rounded-lg px-3 py-2 text-sm font-medium transition-colors\",\n actionAppearance[appearance]\n );\n\n if (href) {\n return (\n <a className={className} href={href}>\n {content}\n </a>\n );\n }\n\n return (\n <button className={className} onClick={onClick} disabled={loading}>\n {content}\n </button>\n );\n};\n\n/**\n * DashboardToolbar 컴포넌트\n * \n * 대시보드 상단 툴바 컴포넌트입니다.\n * 제목, 설명, 필터, 날짜 범위 선택, 액션 버튼 등을 포함할 수 있습니다.\n * \n * Top toolbar component for dashboards.\n * Can include title, description, filters, date range selection, and action buttons.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <DashboardToolbar\n * title=\"거래 대시보드\"\n * description=\"전체 거래 현황을 확인하세요\"\n * actions={[\n * { label: \"내보내기\", icon: \"download\", onClick: handleExport },\n * { label: \"필터\", icon: \"funnel\", onClick: handleFilter }\n * ]}\n * onRefresh={handleRefresh}\n * />\n * \n * @example\n * // 날짜 범위 포함 / With date range\n * <DashboardToolbar\n * title=\"매출 분석\"\n * dateRange={{\n * value: { from: new Date(\"2024-01-01\"), to: new Date(\"2024-12-31\") },\n * presets: [\n * { label: \"오늘\", value: \"today\" },\n * { label: \"이번 주\", value: \"thisWeek\" },\n * { label: \"이번 달\", value: \"thisMonth\" }\n * ],\n * onSelectPreset: handlePresetSelect,\n * onCustomRange: handleCustomRange\n * }}\n * />\n * \n * @param {DashboardToolbarProps} props - DashboardToolbar 컴포넌트의 props / DashboardToolbar component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} DashboardToolbar 컴포넌트 / DashboardToolbar component\n */\nexport const DashboardToolbar = React.forwardRef<HTMLDivElement, DashboardToolbarProps>(\n (\n {\n title,\n description,\n meta,\n variant = \"cards\",\n dateRange,\n filters,\n actions,\n onRefresh,\n lastUpdated,\n className,\n ...props\n },\n ref\n ) => {\n const containerClasses = merge(\n \"w-full\",\n variant === \"cards\"\n ? \"rounded-2xl border border-slate-200/70 dark:border-slate-800 bg-white dark:bg-slate-900 shadow-sm\"\n : \"\"\n );\n\n return (\n <div ref={ref} className={merge(containerClasses, className)} {...props}>\n <div className=\"flex flex-col gap-4 px-4 py-4 sm:px-6 sm:py-5\">\n <div className=\"flex flex-col gap-2 sm:flex-row sm:items-center sm:justify-between\">\n <div>\n {title && (\n <div className=\"text-xl font-semibold text-slate-900 dark:text-slate-50\">\n {title}\n </div>\n )}\n {description && (\n <p className=\"text-sm text-slate-500 dark:text-slate-400\">{description}</p>\n )}\n </div>\n <div className=\"flex flex-wrap gap-2\">\n {dateRange && (\n <Dropdown\n trigger={\n <Button \n variant=\"outline\" \n size=\"sm\" \n className=\"gap-2\"\n aria-label={`날짜 범위 선택: ${dateRange.display || \"날짜 범위\"}`}\n >\n <Icon name=\"calendar\" className=\"h-4 w-4\" />\n {dateRange.display || \"날짜 범위\"}\n </Button>\n }\n >\n <DropdownMenu className=\"max-h-64 overflow-auto\">\n {dateRange.presets?.map((preset) => (\n <DropdownItem\n key={preset.value}\n onClick={() => dateRange.onSelectPreset?.(preset)}\n >\n {preset.label}\n </DropdownItem>\n ))}\n {dateRange.onCustomRange && (\n <DropdownItem onClick={dateRange.onCustomRange}>\n 사용자 지정...\n </DropdownItem>\n )}\n </DropdownMenu>\n </Dropdown>\n )}\n {onRefresh && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"gap-2 text-slate-500 hover:text-slate-900 dark:text-slate-400 dark:hover:text-white\"\n onClick={onRefresh}\n aria-label=\"데이터 새로고침\"\n >\n <Icon name=\"refresh\" className=\"h-4 w-4\" />\n 새로고침\n </Button>\n )}\n </div>\n </div>\n\n {(filters || meta || lastUpdated) && (\n <div className=\"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between border-t border-slate-100 dark:border-slate-800 pt-3\">\n <div className=\"flex flex-wrap items-center gap-3 text-sm text-slate-600 dark:text-slate-300\">\n {filters}\n {meta}\n </div>\n {lastUpdated && (\n <span className=\"text-xs text-slate-400\">업데이트: {lastUpdated}</span>\n )}\n </div>\n )}\n\n {actions && actions.length > 0 && (\n <div className=\"flex flex-wrap justify-end gap-2 border-t border-slate-100 dark:border-slate-800 pt-4\">\n {actions.map((action) => (\n <ToolbarButton key={action.label} {...action} />\n ))}\n </div>\n )}\n </div>\n </div>\n );\n }\n);\n\nDashboardToolbar.displayName = \"DashboardToolbar\";\n\n","\"use client\";\n\nimport React from \"react\";\nimport { merge } from \"../../lib/utils\";\n\nexport type TrendSeriesPalette = \"approval\" | \"settlement\" | \"custom\";\n\n/**\n * 트렌드 시리즈 인터페이스\n * @typedef {Object} TrendSeries\n * @property {string} label - 시리즈 라벨\n * @property {number[]} data - 데이터 배열\n * @property {string} [color] - 커스텀 색상\n * @property {boolean} [area] - 영역 채우기 여부\n */\nexport interface TrendSeries {\n label: string;\n data: number[];\n color?: string;\n area?: boolean;\n}\n\n/**\n * TrendChart 컴포넌트의 props / TrendChart component props\n * @typedef {Object} TrendChartProps\n * @property {TrendSeries[]} series - 시리즈 배열 / Series array\n * @property {string[]} categories - 카테고리 배열 / Categories array\n * @property {TrendSeriesPalette} [palette=\"approval\"] - 색상 팔레트 / Color palette\n * @property {number} [height=200] - 차트 높이 (px) / Chart height (px)\n * @property {boolean} [showLegend=true] - 범례 표시 여부 / Show legend\n * @property {boolean} [showDots=true] - 점 표시 여부 / Show dots\n * @property {boolean} [showTooltip=false] - 툴팁 표시 여부 / Show tooltip\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface TrendChartProps extends React.HTMLAttributes<HTMLDivElement> {\n series: TrendSeries[];\n categories: string[];\n palette?: TrendSeriesPalette;\n height?: number;\n showLegend?: boolean;\n showDots?: boolean;\n showTooltip?: boolean;\n}\n\nconst PRESET_PALETTES: Record<TrendSeriesPalette, string[]> = {\n approval: [\"#22c55e\", \"#f97316\", \"#ef4444\"],\n settlement: [\"#6366f1\", \"#0ea5e9\", \"#14b8a6\"],\n custom: [\"#0ea5e9\"],\n};\n\n/**\n * TrendChart 컴포넌트\n * \n * 트렌드 데이터를 선 그래프로 표시하는 컴포넌트입니다.\n * 여러 시리즈를 동시에 표시할 수 있으며, 영역 채우기 옵션을 제공합니다.\n * \n * Line chart component that displays trend data.\n * Can display multiple series simultaneously with area fill option.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <TrendChart\n * series={[\n * { label: \"승인\", data: [10, 20, 15, 30, 25] },\n * { label: \"거부\", data: [5, 10, 8, 15, 12] }\n * ]}\n * categories={[\"월\", \"화\", \"수\", \"목\", \"금\"]}\n * palette=\"approval\"\n * />\n * \n * @example\n * // 영역 채우기와 커스텀 색상 / Area fill and custom color\n * <TrendChart\n * series={[\n * { label: \"정산\", data: [100, 200, 150], area: true, color: \"#6366f1\" }\n * ]}\n * categories={[\"1월\", \"2월\", \"3월\"]}\n * palette=\"settlement\"\n * showDots={true}\n * showTooltip={true}\n * />\n * \n * @param {TrendChartProps} props - TrendChart 컴포넌트의 props / TrendChart component props\n * @returns {JSX.Element} TrendChart 컴포넌트 / TrendChart component\n */\nexport const TrendChart: React.FC<TrendChartProps> = ({\n series,\n categories,\n palette = \"approval\",\n height = 200,\n showLegend = true,\n showDots = true,\n showTooltip = false,\n className,\n ...props\n}) => {\n const paletteColors = PRESET_PALETTES[palette] || PRESET_PALETTES.approval;\n const safeCategories = categories.length > 0 ? categories : [\"—\"];\n const denominator = Math.max(safeCategories.length - 1, 1);\n\n const maxValue = Math.max(...series.flatMap((s) => s.data), 10);\n\n const chartId = React.useId();\n const chartLabel = series.length > 0\n ? `트렌드 차트 - ${series.length}개 시리즈, ${safeCategories.length}개 카테고리, 최대값 ${maxValue.toLocaleString()}`\n : `트렌드 차트 - ${safeCategories.length}개 카테고리`;\n\n return (\n <div\n role=\"img\"\n aria-label={chartLabel}\n className={merge(\n \"rounded-2xl border border-slate-100 dark:border-slate-800 bg-white dark:bg-slate-900 p-4\",\n className\n )}\n {...props}\n >\n <div className=\"relative\" style={{ height }}>\n {series.map((s, index) => {\n const color = s.color || paletteColors[index % paletteColors.length];\n const points = s.data.map((point, i) => ({\n x: (i / denominator) * 100,\n y: 100 - (point / maxValue) * 100,\n value: point,\n label: safeCategories[i] ?? safeCategories[safeCategories.length - 1] ?? \"\",\n }));\n\n if (points.length === 0) {\n return null;\n }\n\n const pathData = points\n .map((p, i) => `${i === 0 ? \"M\" : \"L\"} ${p.x},${p.y}`)\n .join(\" \");\n\n const areaData = `${pathData} L 100,100 L 0,100 Z`;\n\n return (\n <svg\n key={s.label}\n viewBox=\"0 0 100 100\"\n preserveAspectRatio=\"none\"\n className=\"absolute inset-0 h-full w-full\"\n >\n {s.area && (\n <path\n d={areaData}\n fill={color}\n opacity={0.08}\n stroke=\"none\"\n />\n )}\n <path\n d={pathData}\n fill=\"none\"\n stroke={color}\n strokeWidth={2}\n strokeLinejoin=\"round\"\n strokeLinecap=\"round\"\n />\n {showDots &&\n points.map((p, i) => (\n <circle\n key={`${s.label}-${i}`}\n cx={p.x}\n cy={p.y}\n r={1.2}\n fill=\"#fff\"\n stroke={color}\n strokeWidth={0.8}\n >\n {showTooltip && (\n <title>\n {s.label} · {p.label}: {p.value.toLocaleString()}\n </title>\n )}\n </circle>\n ))}\n </svg>\n );\n })}\n <div className=\"absolute inset-x-0 bottom-0 flex text-[10px] text-slate-400\">\n {safeCategories.map((label, idx) => (\n <div key={label} className=\"flex-1 text-center\">\n {label}\n </div>\n ))}\n </div>\n </div>\n\n {showLegend && (\n <div \n className=\"mt-4 flex flex-wrap gap-4 text-sm text-slate-600 dark:text-slate-300\"\n role=\"list\"\n aria-label=\"차트 범례\"\n >\n {series.map((s, index) => {\n const color = s.color || paletteColors[index % paletteColors.length];\n return (\n <div \n key={s.label} \n role=\"listitem\"\n className=\"flex items-center gap-2\"\n tabIndex={0}\n aria-label={`${s.label} 시리즈`}\n onKeyDown={(e) => {\n // 키보드 네비게이션 지원\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n // 범례 클릭 시 해당 시리즈 강조 등의 기능 추가 가능\n }\n }}\n >\n <span\n className=\"inline-block h-2 w-2 rounded-full\"\n style={{ backgroundColor: color }}\n aria-hidden=\"true\"\n />\n <span>{s.label}</span>\n </div>\n );\n })}\n </div>\n )}\n </div>\n );\n};\n\nTrendChart.displayName = \"TrendChart\";\n\n","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\nimport { Icon } from \"./Icon\"\n\n/**\n * Drawer 컴포넌트의 props / Drawer component props\n * @typedef {Object} DrawerProps\n * @property {boolean} open - Drawer 열림/닫힘 상태 / Drawer open/close state\n * @property {(open: boolean) => void} onOpenChange - 상태 변경 콜백 / State change callback\n * @property {React.ReactNode} children - Drawer 내용 / Drawer content\n * @property {string} [className] - 추가 CSS 클래스 / Additional CSS class\n * @property {\"left\" | \"right\" | \"top\" | \"bottom\"} [side=\"right\"] - Drawer 표시 위치 / Drawer display position\n * @property {\"sm\" | \"md\" | \"lg\" | \"xl\" | \"full\"} [size=\"md\"] - Drawer 크기 / Drawer size\n * @property {boolean} [showBackdrop=true] - 배경 오버레이 표시 여부 / Show backdrop overlay\n * @property {string} [backdropClassName] - 배경 오버레이 추가 CSS 클래스 / Backdrop overlay additional CSS class\n * @property {boolean} [closeOnBackdropClick=true] - 배경 클릭 시 닫기 여부 / Close on backdrop click\n * @property {boolean} [closeOnEscape=true] - ESC 키로 닫기 여부 / Close on ESC key\n */\ninterface DrawerProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n children: React.ReactNode\n className?: string\n side?: \"left\" | \"right\" | \"top\" | \"bottom\"\n size?: \"sm\" | \"md\" | \"lg\" | \"xl\" | \"full\"\n showBackdrop?: boolean\n backdropClassName?: string\n closeOnBackdropClick?: boolean\n closeOnEscape?: boolean\n}\n\n/**\n * Drawer 컴포넌트 / Drawer component\n * \n * 사이드에서 슬라이드되는 패널 컴포넌트입니다.\n * Modal과 유사하지만 특정 방향에서 슬라이드되는 애니메이션을 제공합니다.\n * ESC 키로 닫기, 배경 클릭으로 닫기 기능을 지원합니다.\n * \n * Panel component that slides from the side.\n * Similar to Modal but provides slide animation from a specific direction.\n * Supports closing with ESC key and backdrop click.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * const [open, setOpen] = useState(false)\n * \n * <Drawer open={open} onOpenChange={setOpen}>\n * <DrawerHeader>제목</DrawerHeader>\n * <DrawerContent>내용</DrawerContent>\n * <DrawerFooter>\n * <Button onClick={() => setOpen(false)}>닫기</Button>\n * </DrawerFooter>\n * </Drawer>\n * \n * @example\n * // 왼쪽에서 열기 / Open from left\n * <Drawer open={open} onOpenChange={setOpen} side=\"left\" size=\"lg\">\n * <DrawerContent>사이드바 내용</DrawerContent>\n * </Drawer>\n * \n * @param {DrawerProps} props - Drawer 컴포넌트의 props / Drawer component props\n * @param {React.Ref<HTMLDivElement>} ref - Drawer 컨테이너 ref / Drawer container ref\n * @returns {JSX.Element} Drawer 컴포넌트 / Drawer component\n * \n * @todo 접근성 개선: role=\"dialog\", aria-modal=\"true\" 추가 필요 / Accessibility: Add role=\"dialog\", aria-modal=\"true\"\n * @todo 접근성 개선: aria-labelledby, aria-describedby 연결 필요 / Accessibility: Connect aria-labelledby, aria-describedby\n */\nconst Drawer = React.forwardRef<HTMLDivElement, DrawerProps>(\n ({ \n open, \n onOpenChange, \n children, \n className,\n side = \"right\",\n size = \"md\",\n showBackdrop = true,\n backdropClassName,\n closeOnBackdropClick = true,\n closeOnEscape = true,\n ...props \n }, ref) => {\n const [isVisible, setIsVisible] = React.useState(false)\n const [isAnimating, setIsAnimating] = React.useState(false)\n\n React.useEffect(() => {\n if (open) {\n setIsVisible(true)\n setIsAnimating(true)\n // 애니메이션 시작을 위한 지연\n const timer = setTimeout(() => setIsAnimating(false), 50)\n return () => clearTimeout(timer)\n } else {\n setIsAnimating(true)\n const timer = setTimeout(() => {\n setIsVisible(false)\n setIsAnimating(false)\n }, 300) // 애니메이션 완료 후 숨김\n return () => clearTimeout(timer)\n }\n }, [open])\n\n React.useEffect(() => {\n if (!closeOnEscape) return\n\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === \"Escape\" && open) {\n onOpenChange(false)\n }\n }\n\n if (open) {\n document.addEventListener(\"keydown\", handleEscape)\n document.body.style.overflow = \"hidden\"\n }\n\n return () => {\n document.removeEventListener(\"keydown\", handleEscape)\n document.body.style.overflow = \"\"\n }\n }, [open, closeOnEscape, onOpenChange])\n\n if (!isVisible) return null\n\n const sizeClasses = {\n sm: side === \"left\" || side === \"right\" ? \"w-80\" : \"h-64\",\n md: side === \"left\" || side === \"right\" ? \"w-96\" : \"h-96\",\n lg: side === \"left\" || side === \"right\" ? \"w-[28rem]\" : \"h-[32rem]\",\n xl: side === \"left\" || side === \"right\" ? \"w-[32rem]\" : \"h-[40rem]\",\n full: side === \"left\" || side === \"right\" ? \"w-full\" : \"h-full\"\n }\n\n const sideClasses = {\n left: \"left-0 top-0 h-full translate-x-0\",\n right: \"right-0 top-0 h-full translate-x-0\",\n top: \"top-0 left-0 w-full translate-y-0\",\n bottom: \"bottom-0 left-0 w-full translate-y-0\"\n }\n\n const transformClasses = {\n left: isAnimating ? (open ? \"translate-x-0\" : \"-translate-x-full\") : \"\",\n right: isAnimating ? (open ? \"translate-x-0\" : \"translate-x-full\") : \"\",\n top: isAnimating ? (open ? \"translate-y-0\" : \"-translate-y-full\") : \"\",\n bottom: isAnimating ? (open ? \"translate-y-0\" : \"translate-y-full\") : \"\"\n }\n\n return (\n <div className=\"fixed inset-0 z-50\">\n {/* Backdrop */}\n {showBackdrop && (\n <div\n className={merge(\n \"absolute inset-0 bg-black/60 backdrop-blur-md transition-opacity duration-300\",\n isAnimating ? (open ? \"opacity-100\" : \"opacity-0\") : \"\",\n backdropClassName\n )}\n onClick={closeOnBackdropClick ? () => onOpenChange(false) : undefined}\n />\n )}\n\n {/* Drawer Content */}\n <div\n ref={ref}\n className={merge(\n \"absolute bg-white/95 dark:!bg-gray-800/95 backdrop-blur-xl border border-gray-200/50 dark:!border-gray-600/50 shadow-2xl transition-transform duration-300 ease-out\",\n sizeClasses[size],\n sideClasses[side],\n transformClasses[side],\n className\n )}\n {...props}\n >\n {children}\n </div>\n </div>\n )\n }\n)\nDrawer.displayName = \"Drawer\"\n\n/**\n * DrawerHeader 컴포넌트의 props / DrawerHeader component props\n * @typedef {Object} DrawerHeaderProps\n * @property {React.ReactNode} children - 헤더 내용 / Header content\n * @property {string} [className] - 추가 CSS 클래스 / Additional CSS class\n * @property {boolean} [showCloseButton=true] - 닫기 버튼 표시 여부 / Show close button\n * @property {() => void} [onClose] - 닫기 버튼 클릭 콜백 / Close button click callback\n */\ninterface DrawerHeaderProps {\n children: React.ReactNode\n className?: string\n showCloseButton?: boolean\n onClose?: () => void\n}\n\n/**\n * DrawerHeader 컴포넌트 / DrawerHeader component\n * Drawer의 헤더 영역을 표시합니다.\n * Displays the header area of a Drawer.\n * \n * @component\n * @param {DrawerHeaderProps} props - DrawerHeader 컴포넌트의 props / DrawerHeader component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} DrawerHeader 컴포넌트 / DrawerHeader component\n */\nconst DrawerHeader = React.forwardRef<HTMLDivElement, DrawerHeaderProps>(\n ({ children, className, showCloseButton = true, onClose, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={merge(\"flex items-center justify-between p-6 border-b border-gray-200/50 dark:border-gray-700/50\", className)}\n {...props}\n >\n <div className=\"flex-1\">{children}</div>\n {showCloseButton && (\n <button\n onClick={onClose}\n className=\"p-2 rounded-lg hover:bg-gray-100/80 dark:hover:bg-gray-800/80 transition-colors\"\n >\n <Icon name=\"close\" size={20} />\n </button>\n )}\n </div>\n )\n }\n)\nDrawerHeader.displayName = \"DrawerHeader\"\n\n/**\n * DrawerContent 컴포넌트의 props / DrawerContent component props\n * @typedef {Object} DrawerContentProps\n * @property {React.ReactNode} children - 콘텐츠 / Content\n * @property {string} [className] - 추가 CSS 클래스 / Additional CSS class\n */\ninterface DrawerContentProps {\n children: React.ReactNode\n className?: string\n}\n\n/**\n * DrawerContent 컴포넌트 / DrawerContent component\n * Drawer의 메인 콘텐츠 영역을 표시합니다.\n * Displays the main content area of a Drawer.\n * \n * @component\n * @param {DrawerContentProps} props - DrawerContent 컴포넌트의 props / DrawerContent component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} DrawerContent 컴포넌트 / DrawerContent component\n */\nconst DrawerContent = React.forwardRef<HTMLDivElement, DrawerContentProps>(\n ({ children, className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={merge(\"flex-1 p-6 overflow-y-auto\", className)}\n {...props}\n >\n {children}\n </div>\n )\n }\n)\nDrawerContent.displayName = \"DrawerContent\"\n\n/**\n * DrawerFooter 컴포넌트의 props / DrawerFooter component props\n * @typedef {Object} DrawerFooterProps\n * @property {React.ReactNode} children - 푸터 내용 / Footer content\n * @property {string} [className] - 추가 CSS 클래스 / Additional CSS class\n */\ninterface DrawerFooterProps {\n children: React.ReactNode\n className?: string\n}\n\n/**\n * DrawerFooter 컴포넌트 / DrawerFooter component\n * Drawer의 푸터 영역을 표시합니다. 주로 액션 버튼을 배치합니다.\n * Displays the footer area of a Drawer. Typically used for action buttons.\n * \n * @component\n * @param {DrawerFooterProps} props - DrawerFooter 컴포넌트의 props / DrawerFooter component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} DrawerFooter 컴포넌트 / DrawerFooter component\n */\nconst DrawerFooter = React.forwardRef<HTMLDivElement, DrawerFooterProps>(\n ({ children, className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={merge(\"flex items-center justify-end gap-3 p-6 border-t border-gray-200/50 dark:border-gray-700/50\", className)}\n {...props}\n >\n {children}\n </div>\n )\n }\n)\nDrawerFooter.displayName = \"DrawerFooter\"\n\nexport { Drawer, DrawerHeader, DrawerContent, DrawerFooter } ","\"use client\";\n\nimport React from \"react\";\nimport { Drawer, DrawerHeader, DrawerContent, DrawerFooter } from \"../Drawer\";\nimport { Badge } from \"../Badge\";\nimport { Icon } from \"../Icon\";\nimport type { IconName } from \"../../lib/icons\";\nimport { merge } from \"../../lib/utils\";\nimport { DashboardEmptyState } from \"./EmptyState\";\nimport type { TransactionStatus } from \"./TransactionsTable\";\n\nconst STATUS_STYLES: Record<TransactionStatus, { label: string; badge: string }> = {\n approved: { label: \"승인\", badge: \"bg-emerald-100 text-emerald-700 dark:bg-emerald-500/15 dark:text-emerald-200\" },\n pending: { label: \"대기\", badge: \"bg-amber-100 text-amber-700 dark:bg-amber-500/15 dark:text-amber-200\" },\n failed: { label: \"실패\", badge: \"bg-rose-100 text-rose-700 dark:bg-rose-500/15 dark:text-rose-200\" },\n refunded: { label: \"환불\", badge: \"bg-sky-100 text-sky-700 dark:bg-sky-500/15 dark:text-sky-200\" },\n cancelled: { label: \"취소\", badge: \"bg-slate-100 text-slate-700 dark:bg-slate-500/15 dark:text-slate-200\" },\n review: { label: \"검토중\", badge: \"bg-violet-100 text-violet-700 dark:bg-violet-500/15 dark:text-violet-200\" },\n};\n\n/**\n * 거래 상세 정보 인터페이스 / TransactionDetail interface\n * @typedef {Object} TransactionDetail\n * @property {string} id - 거래 ID / Transaction ID\n * @property {TransactionStatus} status - 거래 상태 / Transaction status\n * @property {number} amount - 거래 금액 / Transaction amount\n * @property {string} [currency] - 통화 / Currency\n * @property {string} [merchant] - 가맹점 / Merchant\n * @property {string} [method] - 결제수단 / Payment method\n * @property {string | Date} [createdAt] - 생성일시 / Created date\n * @property {string | Date} [approvedAt] - 승인일시 / Approved date\n * @property {string} [customer] - 고객 정보 / Customer information\n * @property {string} [reference] - 참조 번호 / Reference number\n */\nexport interface TransactionDetail {\n id: string;\n status: TransactionStatus;\n amount: number;\n currency?: string;\n merchant?: string;\n method?: string;\n createdAt?: string | Date;\n approvedAt?: string | Date;\n customer?: string;\n reference?: string;\n}\n\n/**\n * 거래 메타데이터 아이템 인터페이스 / TransactionMetadataItem interface\n * @typedef {Object} TransactionMetadataItem\n * @property {string} label - 라벨 / Label\n * @property {React.ReactNode} value - 값 / Value\n * @property {IconName} [icon] - 아이콘 / Icon\n */\nexport interface TransactionMetadataItem {\n label: string;\n value: React.ReactNode;\n icon?: IconName;\n}\n\nexport type SettlementStatus = \"pending\" | \"processing\" | \"completed\" | \"failed\";\n\n/**\n * 정산 정보 인터페이스 / SettlementInfo interface\n * @typedef {Object} SettlementInfo\n * @property {SettlementStatus} [status] - 정산 상태 / Settlement status\n * @property {number} [amount] - 정산 금액 / Settlement amount\n * @property {string} [currency] - 통화 / Currency\n * @property {string | Date} [scheduledDate] - 예정일 / Scheduled date\n * @property {string} [expectedPayout] - 예상 지급액 / Expected payout\n * @property {string} [bankAccount] - 계좌 정보 / Bank account information\n * @property {string} [reference] - 참조 번호 / Reference number\n * @property {string} [note] - 메모 / Note\n */\nexport interface SettlementInfo {\n status?: SettlementStatus;\n amount?: number;\n currency?: string;\n scheduledDate?: string | Date;\n expectedPayout?: string;\n bankAccount?: string;\n reference?: string;\n note?: string;\n}\n\n/**\n * 수수료 내역 인터페이스 / FeeBreakdown interface\n * @typedef {Object} FeeBreakdown\n * @property {string} label - 수수료 라벨 / Fee label\n * @property {number} amount - 수수료 금액 / Fee amount\n * @property {string} [currency] - 통화 / Currency\n * @property {string} [description] - 설명 / Description\n */\nexport interface FeeBreakdown {\n label: string;\n amount: number;\n currency?: string;\n description?: string;\n}\n\n/**\n * 거래 이벤트 인터페이스 / TransactionEvent interface\n * @typedef {Object} TransactionEvent\n * @property {string} id - 이벤트 ID / Event ID\n * @property {string} title - 이벤트 제목 / Event title\n * @property {string} [description] - 설명 / Description\n * @property {string | Date} timestamp - 타임스탬프 / Timestamp\n * @property {\"success\" | \"warning\" | \"error\" | \"info\"} [status] - 이벤트 상태 / Event status\n * @property {IconName} [icon] - 아이콘 / Icon\n * @property {string} [actor] - 실행자 / Actor\n */\nexport interface TransactionEvent {\n id: string;\n title: string;\n description?: string;\n timestamp: string | Date;\n status?: \"success\" | \"warning\" | \"error\" | \"info\";\n icon?: IconName;\n actor?: string;\n}\n\n/**\n * TransactionDetailDrawer 컴포넌트의 props / TransactionDetailDrawer component props\n * @typedef {Object} TransactionDetailDrawerProps\n * @property {boolean} open - 드로어 열림 상태 / Drawer open state\n * @property {() => void} onClose - 닫기 핸들러 / Close handler\n * @property {TransactionDetail} [transaction] - 거래 상세 정보 / Transaction detail information\n * @property {TransactionMetadataItem[]} [metadata=[]] - 메타데이터 배열 / Metadata array\n * @property {SettlementInfo} [settlement] - 정산 정보 / Settlement information\n * @property {FeeBreakdown[]} [fees=[]] - 수수료 내역 배열 / Fee breakdown array\n * @property {TransactionEvent[]} [events=[]] - 이벤트 로그 배열 / Event log array\n * @property {React.ReactNode} [actions] - 액션 컴포넌트 / Actions component\n * @property {React.ReactNode} [summary] - 요약 컴포넌트 / Summary component\n * @property {boolean} [loading=false] - 로딩 상태 / Loading state\n * @property {string} [locale=\"ko-KR\"] - 로케일 / Locale\n * @property {string} [defaultCurrency=\"KRW\"] - 기본 통화 / Default currency\n * @property {React.ReactNode} [emptyState] - 빈 상태 컴포넌트 / Empty state component\n * @property {string} [className] - 추가 클래스명 / Additional class name\n */\nexport interface TransactionDetailDrawerProps {\n open: boolean;\n onClose: () => void;\n transaction?: TransactionDetail;\n metadata?: TransactionMetadataItem[];\n settlement?: SettlementInfo;\n fees?: FeeBreakdown[];\n events?: TransactionEvent[];\n actions?: React.ReactNode;\n summary?: React.ReactNode;\n loading?: boolean;\n locale?: string;\n defaultCurrency?: string;\n emptyState?: React.ReactNode;\n className?: string;\n}\n\nconst formatAmount = (amount?: number, currency?: string, locale = \"ko-KR\") => {\n if (typeof amount !== \"number\") return \"-\";\n try {\n return new Intl.NumberFormat(locale, {\n style: \"currency\",\n currency: currency ?? \"KRW\",\n maximumFractionDigits: 2,\n }).format(amount);\n } catch {\n return `${amount.toLocaleString(locale)} ${currency ?? \"\"}`.trim();\n }\n};\n\nconst formatDate = (date?: string | Date, locale = \"ko-KR\") => {\n if (!date) return \"-\";\n const parsed = date instanceof Date ? date : new Date(date);\n if (Number.isNaN(parsed.getTime())) return \"-\";\n return parsed.toLocaleString(locale, { dateStyle: \"medium\", timeStyle: \"short\" });\n};\n\nconst getEventColor = (status?: TransactionEvent[\"status\"]) => {\n switch (status) {\n case \"success\":\n return \"bg-emerald-50 text-emerald-700 dark:bg-emerald-500/20 dark:text-emerald-100\";\n case \"warning\":\n return \"bg-amber-50 text-amber-700 dark:bg-amber-500/20 dark:text-amber-100\";\n case \"error\":\n return \"bg-rose-50 text-rose-700 dark:bg-rose-500/20 dark:text-rose-100\";\n default:\n return \"bg-slate-50 text-slate-600 dark:bg-slate-800/50 dark:text-slate-100\";\n }\n};\n\nconst getSettlementBadge = (status?: SettlementStatus) => {\n switch (status) {\n case \"completed\":\n return \"bg-emerald-50 text-emerald-700 dark:bg-emerald-500/20 dark:text-emerald-100\";\n case \"processing\":\n return \"bg-sky-50 text-sky-700 dark:bg-sky-500/20 dark:text-sky-100\";\n case \"failed\":\n return \"bg-rose-50 text-rose-700 dark:bg-rose-500/20 dark:text-rose-100\";\n case \"pending\":\n return \"bg-amber-50 text-amber-700 dark:bg-amber-500/20 dark:text-amber-100\";\n default:\n return \"bg-slate-50 text-slate-600 dark:bg-slate-800/50 dark:text-slate-100\";\n }\n};\n\n/**\n * TransactionDetailDrawer 컴포넌트\n * \n * 거래 상세 정보를 표시하는 드로어 컴포넌트입니다.\n * 거래 정보, 정산 정보, 수수료 내역, 이벤트 로그 등을 포함합니다.\n * \n * Drawer component that displays detailed transaction information.\n * Includes transaction details, settlement info, fee breakdown, and event logs.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <TransactionDetailDrawer\n * open={isOpen}\n * onClose={() => setIsOpen(false)}\n * transaction={{\n * id: \"tx_123\",\n * status: \"approved\",\n * amount: 100000,\n * currency: \"KRW\",\n * merchant: \"가맹점 A\"\n * }}\n * metadata={[\n * { label: \"거래 ID\", value: \"tx_123\", icon: \"creditCard\" },\n * { label: \"고객\", value: \"홍길동\", icon: \"user\" }\n * ]}\n * />\n * \n * @example\n * // 정산 정보 포함 / With settlement info\n * <TransactionDetailDrawer\n * open={isOpen}\n * onClose={handleClose}\n * transaction={transaction}\n * settlement={{\n * status: \"processing\",\n * amount: 95000,\n * currency: \"KRW\",\n * scheduledDate: new Date(\"2024-01-15\")\n * }}\n * fees={[\n * { label: \"수수료\", amount: 5000, currency: \"KRW\" }\n * ]}\n * events={eventLogs}\n * />\n * \n * @param {TransactionDetailDrawerProps} props - TransactionDetailDrawer 컴포넌트의 props / TransactionDetailDrawer component props\n * @returns {JSX.Element} TransactionDetailDrawer 컴포넌트 / TransactionDetailDrawer component\n */\nexport const TransactionDetailDrawer: React.FC<TransactionDetailDrawerProps> = ({\n open,\n onClose,\n transaction,\n metadata = [],\n settlement,\n fees = [],\n events = [],\n actions,\n summary,\n loading = false,\n locale = \"ko-KR\",\n defaultCurrency = \"KRW\",\n emptyState,\n className,\n}) => {\n const statusStyle = transaction && STATUS_STYLES[transaction.status];\n\n return (\n <Drawer\n open={open}\n onOpenChange={(next) => {\n if (!next) {\n onClose();\n }\n }}\n className={className}\n >\n <DrawerHeader onClose={onClose}>\n <div className=\"space-y-1\">\n <div className=\"flex items-center gap-2 text-xs uppercase tracking-wide text-slate-400\">\n <span>거래 상세</span>\n {transaction?.reference && (\n <span className=\"rounded-full bg-slate-100 px-2 py-0.5 text-slate-500\">{transaction.reference}</span>\n )}\n </div>\n <div className=\"flex items-center gap-3\">\n <p className=\"text-lg font-semibold text-slate-900 dark:text-white\">{transaction?.id ?? \"—\"}</p>\n {statusStyle && (\n <Badge className={merge(\"font-medium px-3 py-1 text-xs rounded-full\", statusStyle.badge)}>\n {statusStyle.label}\n </Badge>\n )}\n </div>\n <p className=\"text-sm text-slate-500 dark:text-slate-400\">\n {transaction?.merchant ?? \"가맹점 정보 없음\"} · {transaction?.method ?? \"결제수단 미지정\"}\n </p>\n </div>\n </DrawerHeader>\n\n <DrawerContent className=\"space-y-6\">\n {loading ? (\n <div className=\"space-y-4\">\n {[...Array(3)].map((_, idx) => (\n <div key={idx} className=\"h-20 rounded-2xl border border-slate-100 dark:border-slate-800 animate-pulse bg-slate-50/60 dark:bg-slate-900/40\" />\n ))}\n </div>\n ) : (\n <>\n <section \n className=\"grid gap-4 rounded-2xl border border-slate-100 dark:border-slate-800 bg-white dark:bg-slate-900/40 p-4 md:grid-cols-2\"\n aria-label=\"거래 요약 정보\"\n >\n <div className=\"space-y-1\">\n <p className=\"text-xs uppercase text-slate-400\">거래 금액</p>\n <p className=\"text-2xl font-semibold text-slate-900 dark:text-white\">\n {formatAmount(transaction?.amount, transaction?.currency ?? defaultCurrency, locale)}\n </p>\n <p className=\"text-xs text-slate-400\">\n 생성 <time dateTime={transaction?.createdAt instanceof Date ? transaction.createdAt.toISOString() : typeof transaction?.createdAt === 'string' ? transaction.createdAt : undefined}>\n {formatDate(transaction?.createdAt, locale)}\n </time>\n </p>\n </div>\n <div className=\"space-y-2\">\n <p className=\"text-xs uppercase text-slate-400\">요약</p>\n {summary ?? (\n <p className=\"text-sm text-slate-600 dark:text-slate-300\">\n {transaction?.customer ?? \"고객 정보 없음\"} / {transaction?.method ?? \"결제수단 미지정\"}\n </p>\n )}\n </div>\n </section>\n\n {metadata.length > 0 && (\n <section \n className=\"rounded-2xl border border-slate-100 dark:border-slate-800 bg-white dark:bg-slate-900/40 p-4\"\n aria-label=\"거래 세부 정보\"\n role=\"region\"\n >\n <h3 className=\"mb-3 text-sm font-semibold text-slate-900 dark:text-white\">세부 정보</h3>\n <dl className=\"grid gap-4 sm:grid-cols-2\">\n {metadata.map((item) => (\n <div key={item.label} className=\"flex items-center gap-3\">\n {item.icon && (\n <span className=\"rounded-lg bg-slate-100 p-2 text-slate-500 dark:bg-slate-800/80\" aria-hidden=\"true\">\n <Icon name={item.icon} className=\"h-4 w-4\" />\n </span>\n )}\n <div>\n <dt className=\"text-xs uppercase text-slate-400\">{item.label}</dt>\n <dd className=\"text-sm text-slate-700 dark:text-slate-200\">{item.value}</dd>\n </div>\n </div>\n ))}\n </dl>\n </section>\n )}\n\n {settlement && (\n <section \n className=\"rounded-2xl border border-slate-100 dark:border-slate-800 bg-white dark:bg-slate-900/40 p-4\"\n aria-label=\"정산 정보\"\n role=\"region\"\n >\n <div className=\"mb-4 flex items-center justify-between\">\n <div>\n <h3 className=\"text-sm font-semibold text-slate-900 dark:text-white\">정산 정보</h3>\n {settlement.note && <p className=\"text-xs text-slate-500\">{settlement.note}</p>}\n </div>\n {settlement.status && (\n <span \n className={merge(\"rounded-full px-3 py-1 text-xs font-medium\", getSettlementBadge(settlement.status))}\n aria-label={`정산 상태: ${settlement.status}`}\n >\n {settlement.status}\n </span>\n )}\n </div>\n <dl className=\"grid gap-4 md:grid-cols-2\">\n <div>\n <dt className=\"text-xs uppercase text-slate-400\">정산 금액</dt>\n <dd className=\"text-sm text-slate-700 dark:text-slate-200\">\n {formatAmount(settlement.amount, settlement.currency ?? defaultCurrency, locale)}\n </dd>\n </div>\n <div>\n <dt className=\"text-xs uppercase text-slate-400\">예정일</dt>\n <dd className=\"text-sm text-slate-700 dark:text-slate-200\">\n {settlement.scheduledDate && (\n <time dateTime={settlement.scheduledDate instanceof Date ? settlement.scheduledDate.toISOString() : typeof settlement.scheduledDate === 'string' ? settlement.scheduledDate : undefined}>\n {formatDate(settlement.scheduledDate, locale)}\n </time>\n )}\n </dd>\n </div>\n {settlement.bankAccount && (\n <div>\n <dt className=\"text-xs uppercase text-slate-400\">계좌</dt>\n <dd className=\"text-sm text-slate-700 dark:text-slate-200\">{settlement.bankAccount}</dd>\n </div>\n )}\n {settlement.expectedPayout && (\n <div>\n <dt className=\"text-xs uppercase text-slate-400\">예상 지급</dt>\n <dd className=\"text-sm text-slate-700 dark:text-slate-200\">{settlement.expectedPayout}</dd>\n </div>\n )}\n </dl>\n </section>\n )}\n\n {fees.length > 0 && (\n <section \n className=\"rounded-2xl border border-slate-100 dark:border-slate-800 bg-white dark:bg-slate-900/40 p-4\"\n aria-label=\"수수료 내역\"\n role=\"region\"\n >\n <h3 className=\"mb-3 text-sm font-semibold text-slate-900 dark:text-white\">수수료</h3>\n <dl className=\"space-y-3\">\n {fees.map((fee) => (\n <div key={fee.label} className=\"flex items-center justify-between text-sm text-slate-700 dark:text-slate-200\">\n <div>\n <dt className=\"font-medium\">{fee.label}</dt>\n {fee.description && <dd className=\"text-xs text-slate-400\">{fee.description}</dd>}\n </div>\n <dd>{formatAmount(fee.amount, fee.currency ?? defaultCurrency, locale)}</dd>\n </div>\n ))}\n </dl>\n </section>\n )}\n\n <section \n className=\"rounded-2xl border border-slate-100 dark:border-slate-800 bg-white dark:bg-slate-900/40 p-4\"\n aria-label=\"이벤트 로그\"\n role=\"region\"\n >\n <h3 className=\"mb-4 text-sm font-semibold text-slate-900 dark:text-white\">이벤트 로그</h3>\n {events.length === 0 ? (\n emptyState ?? (\n <DashboardEmptyState\n icon=\"activity\"\n title=\"이벤트가 없습니다\"\n description=\"승인/정산 등 상태 변화가 발생하면 자동으로 표시됩니다.\"\n size=\"sm\"\n />\n )\n ) : (\n <ol className=\"space-y-3\" role=\"list\" aria-label=\"이벤트 목록\">\n {events.map((event) => (\n <li\n key={event.id}\n role=\"listitem\"\n className=\"flex items-start gap-3 rounded-xl border border-slate-100 dark:border-slate-800 p-3\"\n >\n <div className={merge(\"rounded-lg p-2\", getEventColor(event.status))} aria-hidden=\"true\">\n <Icon name={event.icon ?? \"activity\"} className=\"h-4 w-4\" />\n </div>\n <div className=\"flex-1\">\n <div className=\"flex items-center justify-between text-sm font-medium text-slate-900 dark:text-white\">\n <span>{event.title}</span>\n <time \n dateTime={event.timestamp instanceof Date ? event.timestamp.toISOString() : typeof event.timestamp === 'string' ? event.timestamp : undefined}\n className=\"text-xs text-slate-400\"\n >\n {formatDate(event.timestamp, locale)}\n </time>\n </div>\n {event.description && (\n <p className=\"text-xs text-slate-500 dark:text-slate-300\">{event.description}</p>\n )}\n {event.actor && (\n <p className=\"text-xs text-slate-400 mt-1\" aria-label={`실행자: ${event.actor}`}>\n by {event.actor}\n </p>\n )}\n </div>\n </li>\n ))}\n </ol>\n )}\n </section>\n </>\n )}\n </DrawerContent>\n\n {actions && <DrawerFooter>{actions}</DrawerFooter>}\n </Drawer>\n );\n};\n\nTransactionDetailDrawer.displayName = \"TransactionDetailDrawer\";\n\n","\"use client\";\n\nimport React from \"react\";\nimport { merge } from \"../../lib/utils\";\nimport { Icon } from \"../Icon\";\nimport type { IconName } from \"../../lib/icons\";\nimport { DashboardEmptyState } from \"./EmptyState\";\n\nexport type SettlementTimelineStatus = \"pending\" | \"processing\" | \"completed\" | \"failed\";\n\n/**\n * 정산 타임라인 아이템 인터페이스 / SettlementTimelineItem interface\n * @typedef {Object} SettlementTimelineItem\n * @property {string} id - 아이템 고유 ID / Item unique ID\n * @property {string} title - 제목 / Title\n * @property {string} [description] - 설명 / Description\n * @property {SettlementTimelineStatus} status - 상태 / Status\n * @property {number} [amount] - 금액 / Amount\n * @property {string} [currency] - 통화 / Currency\n * @property {string | Date} [date] - 날짜 / Date\n * @property {string} [meta] - 메타 정보 / Meta information\n * @property {IconName} [icon] - 아이콘 / Icon\n */\nexport interface SettlementTimelineItem {\n id: string;\n title: string;\n description?: string;\n status: SettlementTimelineStatus;\n amount?: number;\n currency?: string;\n date?: string | Date;\n meta?: string;\n icon?: IconName;\n}\n\n/**\n * SettlementTimeline 컴포넌트의 props / SettlementTimeline component props\n * @typedef {Object} SettlementTimelineProps\n * @property {SettlementTimelineItem[]} items - 타임라인 아이템 배열 / Timeline items array\n * @property {string} [highlightedId] - 강조할 아이템 ID / Highlighted item ID\n * @property {string} [locale=\"ko-KR\"] - 로케일 / Locale\n * @property {string} [defaultCurrency=\"KRW\"] - 기본 통화 / Default currency\n * @property {React.ReactNode} [emptyState] - 빈 상태 컴포넌트 / Empty state component\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface SettlementTimelineProps extends React.HTMLAttributes<HTMLDivElement> {\n items: SettlementTimelineItem[];\n highlightedId?: string;\n locale?: string;\n defaultCurrency?: string;\n emptyState?: React.ReactNode;\n}\n\nconst STATUS_CONFIG: Record<\n SettlementTimelineStatus,\n { dot: string; border: string; text: string; label: string }\n> = {\n completed: {\n dot: \"bg-emerald-500 border-emerald-500 shadow-[0_0_8px_rgba(16,185,129,0.5)]\",\n border: \"border-emerald-200 dark:border-emerald-500/40\",\n text: \"text-emerald-700 dark:text-emerald-300\",\n label: \"정산 완료\",\n },\n processing: {\n dot: \"bg-sky-500 border-sky-500 shadow-[0_0_8px_rgba(14,165,233,0.5)] animate-pulse\",\n border: \"border-sky-200 dark:border-sky-500/40\",\n text: \"text-sky-700 dark:text-sky-200\",\n label: \"처리 중\",\n },\n pending: {\n dot: \"bg-amber-400 border-amber-400\",\n border: \"border-amber-200 dark:border-amber-500/40\",\n text: \"text-amber-700 dark:text-amber-200\",\n label: \"대기\",\n },\n failed: {\n dot: \"bg-rose-500 border-rose-500\",\n border: \"border-rose-200 dark:border-rose-500/40\",\n text: \"text-rose-700 dark:text-rose-300\",\n label: \"실패\",\n },\n};\n\nconst formatAmount = (amount?: number, currency?: string, locale = \"ko-KR\") => {\n if (typeof amount !== \"number\") return undefined;\n const unit = currency ?? \"KRW\";\n try {\n return new Intl.NumberFormat(locale, {\n style: \"currency\",\n currency: unit,\n maximumFractionDigits: 2,\n }).format(amount);\n } catch {\n return `${amount.toLocaleString(locale)} ${unit}`;\n }\n};\n\nconst formatDate = (value?: string | Date, locale = \"ko-KR\") => {\n if (!value) return undefined;\n const parsed = value instanceof Date ? value : new Date(value);\n if (Number.isNaN(parsed.getTime())) return undefined;\n return parsed.toLocaleString(locale, { dateStyle: \"medium\", timeStyle: \"short\" });\n};\n\n/**\n * SettlementTimeline 컴포넌트\n * \n * 정산 처리 단계를 타임라인 형태로 표시하는 컴포넌트입니다.\n * 각 단계의 상태, 금액, 날짜를 시각적으로 표시합니다.\n * \n * Timeline component that displays settlement processing stages.\n * Visually shows status, amount, and date for each stage.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <SettlementTimeline\n * items={[\n * {\n * id: \"1\",\n * title: \"정산 요청\",\n * status: \"completed\",\n * amount: 1000000,\n * currency: \"KRW\",\n * date: new Date(\"2024-01-01\")\n * },\n * {\n * id: \"2\",\n * title: \"처리 중\",\n * status: \"processing\",\n * amount: 1000000,\n * currency: \"KRW\"\n * }\n * ]}\n * />\n * \n * @example\n * // 강조 기능 / Highlight feature\n * <SettlementTimeline\n * items={timelineItems}\n * highlightedId=\"2\"\n * locale=\"en-US\"\n * defaultCurrency=\"USD\"\n * />\n * \n * @param {SettlementTimelineProps} props - SettlementTimeline 컴포넌트의 props / SettlementTimeline component props\n * @returns {JSX.Element} SettlementTimeline 컴포넌트 / SettlementTimeline component\n */\nexport const SettlementTimeline: React.FC<SettlementTimelineProps> = ({\n items,\n highlightedId,\n locale = \"ko-KR\",\n defaultCurrency = \"KRW\",\n emptyState,\n className,\n ...props\n}) => {\n const hasItems = items.length > 0;\n\n return (\n <div\n className={merge(\n \"rounded-2xl border border-slate-100 dark:border-slate-800 bg-white dark:bg-slate-900/50 p-4\",\n className\n )}\n {...props}\n >\n <div className=\"mb-4 flex items-center justify-between\">\n <div>\n <p className=\"text-sm font-semibold text-slate-900 dark:text-white\">정산 타임라인</p>\n <p className=\"text-xs text-slate-500\">처리 단계별 상태와 금액을 확인하세요.</p>\n </div>\n </div>\n\n {!hasItems\n ? emptyState ?? (\n <DashboardEmptyState\n icon=\"calendar-clock\"\n title=\"정산 단계가 없습니다\"\n description=\"정산 요청이 생성되면 자동으로 단계가 채워집니다.\"\n size=\"sm\"\n />\n )\n : (\n <ol className=\"space-y-4\" role=\"list\" aria-label=\"정산 타임라인\">\n {items.map((item, index) => {\n const statusConfig = STATUS_CONFIG[item.status];\n const amount = formatAmount(item.amount, item.currency ?? defaultCurrency, locale);\n const date = formatDate(item.date, locale);\n const isHighlighted = highlightedId === item.id;\n const showConnector = index !== items.length - 1;\n\n const itemLabel = `${item.title}, 상태: ${statusConfig.label}${amount ? `, 금액: ${amount}` : ''}${date ? `, 날짜: ${date}` : ''}`;\n\n return (\n <li \n key={item.id} \n role=\"listitem\"\n aria-label={itemLabel}\n className=\"relative flex gap-4\"\n >\n <div className=\"flex flex-col items-center\">\n <span\n className={merge(\n \"z-10 h-3.5 w-3.5 rounded-full border-2 bg-white shadow\",\n statusConfig.dot,\n isHighlighted && \"scale-110\"\n )}\n aria-label={`${statusConfig.label} 상태`}\n />\n {showConnector && (\n <span className=\"mt-1 flex-1 w-px bg-slate-200 dark:bg-slate-700\" aria-hidden=\"true\" />\n )}\n </div>\n\n <div\n className={merge(\n \"flex-1 rounded-xl border p-4\",\n statusConfig.border,\n isHighlighted && \"border-2 shadow-sm\"\n )}\n >\n <div className=\"flex flex-wrap items-center gap-2\">\n <span className=\"text-sm font-semibold text-slate-900 dark:text-white\">{item.title}</span>\n <span className={merge(\"text-xs font-medium rounded-full px-2 py-0.5\", statusConfig.text)}>\n {statusConfig.label}\n </span>\n {item.meta && (\n <span className=\"text-xs text-slate-500 dark:text-slate-300\">{item.meta}</span>\n )}\n </div>\n {item.description && (\n <p className=\"mt-1 text-sm text-slate-600 dark:text-slate-300\">{item.description}</p>\n )}\n <div className=\"mt-3 flex flex-wrap gap-4 text-xs text-slate-500 dark:text-slate-300\">\n {amount && (\n <div className=\"flex items-center gap-1 text-sm text-slate-700 dark:text-slate-100\">\n <Icon name=\"wallet\" className=\"h-3.5 w-3.5 text-slate-400\" />\n {amount}\n </div>\n )}\n {date && (\n <div className=\"flex items-center gap-1\">\n <Icon name=\"clock\" className=\"h-3.5 w-3.5 text-slate-400\" aria-hidden={true} />\n <time dateTime={item.date instanceof Date ? item.date.toISOString() : typeof item.date === 'string' ? item.date : undefined}>\n {date}\n </time>\n </div>\n )}\n </div>\n </div>\n </li>\n );\n })}\n </ol>\n )}\n </div>\n );\n};\n\nSettlementTimeline.displayName = \"SettlementTimeline\";\n\n","\"use client\";\n\nimport React from \"react\";\nimport { merge } from \"../../lib/utils\";\nimport { DashboardEmptyState } from \"./EmptyState\";\nimport { Icon } from \"../Icon\";\nimport type { IconName } from \"../../lib/icons\";\n\ntype RoutingStatus = \"normal\" | \"warning\" | \"critical\";\n\n/**\n * 라우팅 분할 세그먼트 인터페이스 / RoutingBreakdownSegment interface\n * @typedef {Object} RoutingBreakdownSegment\n * @property {string} id - 세그먼트 고유 ID / Segment unique ID\n * @property {string} label - 세그먼트 라벨 / Segment label\n * @property {number} value - 세그먼트 값 / Segment value\n * @property {string} [color] - 커스텀 색상 / Custom color\n * @property {RoutingStatus} [status] - 상태 / Status\n * @property {string} [icon] - 아이콘 이름 / Icon name\n * @property {string} [detail] - 상세 정보 / Detail information\n */\nexport interface RoutingBreakdownSegment {\n id: string;\n label: string;\n value: number;\n color?: string;\n status?: RoutingStatus;\n icon?: string;\n detail?: string;\n}\n\n/**\n * RoutingBreakdownCard 컴포넌트의 props / RoutingBreakdownCard component props\n * @typedef {Object} RoutingBreakdownCardProps\n * @property {string} [title=\"PG / 결제수단 비중\"] - 카드 제목 / Card title\n * @property {string} [description=\"라우팅별 처리 비율과 상태\"] - 카드 설명 / Card description\n * @property {RoutingBreakdownSegment[]} segments - 세그먼트 배열 / Segments array\n * @property {string} [totalLabel=\"총 거래\"] - 총계 라벨 / Total label\n * @property {React.ReactNode} [totalValue] - 총계 값 / Total value\n * @property {string} [highlightId] - 강조할 세그먼트 ID / Highlighted segment ID\n * @property {React.ReactNode} [actions] - 액션 컴포넌트 / Actions component\n * @property {React.ReactNode} [emptyState] - 빈 상태 컴포넌트 / Empty state component\n * @property {(segment: RoutingBreakdownSegment, percentage: number) => React.ReactNode} [formatter] - 커스텀 포맷터 / Custom formatter\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface RoutingBreakdownCardProps extends React.HTMLAttributes<HTMLDivElement> {\n title?: string;\n description?: string;\n segments: RoutingBreakdownSegment[];\n totalLabel?: string;\n totalValue?: React.ReactNode;\n highlightId?: string;\n actions?: React.ReactNode;\n emptyState?: React.ReactNode;\n formatter?: (segment: RoutingBreakdownSegment, percentage: number) => React.ReactNode;\n}\n\nconst DEFAULT_COLORS = [\"#0ea5e9\", \"#6366f1\", \"#22c55e\", \"#f97316\", \"#a855f7\", \"#ef4444\"];\n\nconst STATUS_BADGES: Record<RoutingStatus, string> = {\n normal: \"bg-emerald-50 text-emerald-700 dark:bg-emerald-500/20 dark:text-emerald-100\",\n warning: \"bg-amber-50 text-amber-700 dark:bg-amber-500/20 dark:text-amber-100\",\n critical: \"bg-rose-50 text-rose-700 dark:bg-rose-500/20 dark:text-rose-100\",\n};\n\nconst formatPercentage = (value: number, total: number) => {\n if (total <= 0) return \"0%\";\n return `${Math.round((value / total) * 1000) / 10}%`;\n};\n\n/**\n * RoutingBreakdownCard 컴포넌트\n * \n * PG 라우팅 또는 결제수단별 비중을 표시하는 카드 컴포넌트입니다.\n * 진행 바와 세그먼트별 상세 정보를 제공합니다.\n * \n * Card component that displays PG routing or payment method breakdown.\n * Provides progress bar and detailed information for each segment.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <RoutingBreakdownCard\n * title=\"PG 라우팅 비중\"\n * segments={[\n * { id: \"pg1\", label: \"PG A\", value: 5000, status: \"normal\" },\n * { id: \"pg2\", label: \"PG B\", value: 3000, status: \"warning\" },\n * { id: \"pg3\", label: \"PG C\", value: 2000, status: \"normal\" }\n * ]}\n * totalValue=\"10,000\"\n * />\n * \n * @example\n * // 강조 기능 / Highlight feature\n * <RoutingBreakdownCard\n * segments={segments}\n * highlightId=\"pg1\"\n * formatter={(segment, percentage) => (\n * <div>\n * <span>{segment.value.toLocaleString()}</span>\n * <span>{percentage}%</span>\n * </div>\n * )}\n * />\n * \n * @param {RoutingBreakdownCardProps} props - RoutingBreakdownCard 컴포넌트의 props / RoutingBreakdownCard component props\n * @returns {JSX.Element} RoutingBreakdownCard 컴포넌트 / RoutingBreakdownCard component\n */\nexport const RoutingBreakdownCard: React.FC<RoutingBreakdownCardProps> = ({\n title = \"PG / 결제수단 비중\",\n description = \"라우팅별 처리 비율과 상태\",\n segments,\n totalLabel = \"총 거래\",\n totalValue,\n highlightId,\n actions,\n emptyState,\n formatter,\n className,\n ...props\n}) => {\n const hasSegments = segments.length > 0;\n const total = segments.reduce((sum, segment) => sum + segment.value, 0);\n\n return (\n <div\n className={merge(\n \"rounded-2xl border border-slate-100 dark:border-slate-800 bg-white dark:bg-slate-900/60 p-5\",\n className\n )}\n {...props}\n >\n <div className=\"flex flex-wrap items-center justify-between gap-3\">\n <div>\n <p className=\"text-sm font-semibold text-slate-900 dark:text-white\">{title}</p>\n <p className=\"text-xs text-slate-500\">{description}</p>\n </div>\n {actions && <div className=\"text-xs text-slate-500\">{actions}</div>}\n </div>\n\n {!hasSegments ? (\n emptyState ?? (\n <DashboardEmptyState\n icon=\"pie-chart\"\n title=\"라우팅 데이터가 없습니다\"\n description=\"PG 라우팅 혹은 결제수단 정보가 수집되면 자동으로 표시됩니다.\"\n size=\"sm\"\n className=\"mt-4\"\n />\n )\n ) : (\n <>\n <div className=\"mt-4\">\n <div className=\"flex h-3 overflow-hidden rounded-full bg-slate-100 dark:bg-slate-800\">\n {segments.map((segment, index) => {\n const width = total === 0 ? 0 : (segment.value / total) * 100;\n const color = segment.color ?? DEFAULT_COLORS[index % DEFAULT_COLORS.length];\n return (\n <div\n key={segment.id}\n className=\"h-full transition-all\"\n style={{\n width: `${width}%`,\n backgroundColor: color,\n opacity: highlightId && highlightId !== segment.id ? 0.4 : 1,\n }}\n aria-label={`${segment.label} ${formatPercentage(segment.value, total)}`}\n />\n );\n })}\n </div>\n <div className=\"mt-2 text-xs text-slate-500\">\n {totalLabel}: {totalValue ?? total.toLocaleString()}\n </div>\n </div>\n\n <div className=\"mt-4 space-y-3\">\n {segments.map((segment, index) => {\n const color = segment.color ?? DEFAULT_COLORS[index % DEFAULT_COLORS.length];\n const percentage = total === 0 ? 0 : (segment.value / total) * 100;\n const badgeClass = segment.status ? STATUS_BADGES[segment.status] : null;\n const customContent = formatter?.(segment, percentage);\n\n return (\n <div\n key={segment.id}\n className={merge(\n \"flex flex-wrap items-center gap-3 rounded-xl border border-slate-100 dark:border-slate-800 p-3 transition hover:border-slate-200 dark:hover:border-slate-700\",\n highlightId === segment.id && \"border-2 border-slate-200 dark:border-slate-600\"\n )}\n >\n <div className=\"flex items-center gap-2 min-w-[3rem]\">\n {segment.icon && (\n <span className=\"rounded-lg bg-slate-100 dark:bg-slate-800 p-1.5 text-slate-500\">\n <Icon name={segment.icon as IconName} className=\"h-4 w-4\" />\n </span>\n )}\n <div\n className=\"h-2 w-12 rounded-full\"\n style={{ backgroundColor: color }}\n aria-hidden=\"true\"\n />\n </div>\n <div className=\"flex-1\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <span className=\"text-sm font-medium text-slate-900 dark:text-white\">{segment.label}</span>\n {badgeClass && (\n <span className={merge(\"rounded-full px-2 py-0.5 text-[11px] font-medium\", badgeClass)}>\n {segment.status === \"critical\"\n ? \"장애\"\n : segment.status === \"warning\"\n ? \"감시\"\n : \"정상\"}\n </span>\n )}\n </div>\n <div className=\"text-xs text-slate-500 dark:text-slate-300\">\n {segment.detail}\n </div>\n </div>\n {customContent ?? (\n <div className=\"text-right text-sm text-slate-700 dark:text-slate-100\">\n <div className=\"font-semibold\">{segment.value.toLocaleString()}</div>\n <div className=\"text-xs text-slate-500\">{formatPercentage(segment.value, total)}</div>\n </div>\n )}\n </div>\n );\n })}\n </div>\n </>\n )}\n </div>\n );\n};\n\nRoutingBreakdownCard.displayName = \"RoutingBreakdownCard\";\n\n","\"use client\";\n\nimport React from \"react\";\nimport { merge } from \"../../lib/utils\";\nimport { Badge } from \"../Badge\";\nimport { Icon } from \"../Icon\";\nimport type { IconName } from \"../../lib/icons\";\nimport { DashboardEmptyState } from \"./EmptyState\";\nimport { Skeleton } from \"../Skeleton\";\n\nexport type MerchantHealth = \"normal\" | \"warning\" | \"critical\";\n\n/**\n * 가맹점 리스트 아이템 인터페이스 / MerchantListItem interface\n * @typedef {Object} MerchantListItem\n * @property {string} id - 가맹점 고유 ID / Merchant unique ID\n * @property {string} name - 가맹점 이름 / Merchant name\n * @property {string} [status] - 상태 / Status\n * @property {MerchantHealth} [health] - 건강 상태 / Health status\n * @property {number} [approvalRate] - 승인률 (0-1) / Approval rate (0-1)\n * @property {number} [volume] - 거래량 / Transaction volume\n * @property {string} [currency] - 통화 / Currency\n * @property {string} [category] - 카테고리 / Category\n * @property {string} [region] - 지역 / Region\n * @property {string | Date} [updatedAt] - 업데이트 시간 / Updated time\n * @property {string} [tag] - 태그 / Tag\n * @property {IconName | React.ReactNode} [icon] - 아이콘 / Icon\n * @property {Array<{ label: string; value: React.ReactNode }>} [metadata] - 메타데이터 / Metadata\n */\nexport interface MerchantListItem {\n id: string;\n name: string;\n status?: string;\n health?: MerchantHealth;\n approvalRate?: number;\n volume?: number;\n currency?: string;\n category?: string;\n region?: string;\n updatedAt?: string | Date;\n tag?: string;\n icon?: IconName | React.ReactNode;\n metadata?: Array<{ label: string; value: React.ReactNode }>;\n}\n\n/**\n * MerchantList 컴포넌트의 props / MerchantList component props\n * @typedef {Object} MerchantListProps\n * @property {MerchantListItem[]} items - 가맹점 아이템 배열 / Merchant items array\n * @property {boolean} [isLoading=false] - 로딩 상태 / Loading state\n * @property {React.ReactNode} [filters] - 필터 컴포넌트 / Filter component\n * @property {React.ReactNode} [emptyState] - 빈 상태 컴포넌트 / Empty state component\n * @property {(merchant: MerchantListItem) => void} [onMerchantSelect] - 가맹점 선택 핸들러 / Merchant selection handler\n * @property {string} [locale=\"ko-KR\"] - 로케일 / Locale\n * @property {string} [defaultCurrency=\"KRW\"] - 기본 통화 / Default currency\n * @extends {Omit<React.HTMLAttributes<HTMLDivElement>, \"onSelect\">}\n */\nexport interface MerchantListProps extends Omit<React.HTMLAttributes<HTMLDivElement>, \"onSelect\"> {\n items: MerchantListItem[];\n isLoading?: boolean;\n filters?: React.ReactNode;\n emptyState?: React.ReactNode;\n onMerchantSelect?: (merchant: MerchantListItem) => void;\n locale?: string;\n defaultCurrency?: string;\n}\n\nconst HEALTH_BADGES: Record<MerchantHealth, string> = {\n normal: \"bg-emerald-50 text-emerald-700 dark:bg-emerald-500/20 dark:text-emerald-100\",\n warning: \"bg-amber-50 text-amber-700 dark:bg-amber-500/20 dark:text-amber-100\",\n critical: \"bg-rose-50 text-rose-700 dark:bg-rose-500/20 dark:text-rose-100\",\n};\n\nconst formatPercent = (value?: number) => {\n if (typeof value !== \"number\") return undefined;\n return `${(Math.round(value * 10) / 10).toFixed(1)}%`;\n};\n\nconst formatVolume = (value?: number, currency?: string, locale = \"ko-KR\") => {\n if (typeof value !== \"number\") return undefined;\n const unit = currency ?? \"KRW\";\n try {\n return new Intl.NumberFormat(locale, {\n style: \"currency\",\n currency: unit,\n maximumFractionDigits: 0,\n }).format(value);\n } catch {\n return `${value.toLocaleString(locale)} ${unit}`;\n }\n};\n\n/**\n * MerchantList 컴포넌트\n * \n * 가맹점 목록을 표시하는 컴포넌트입니다.\n * 가맹점 정보, 건강 상태, 승인률, 거래량 등을 카드 형태로 표시합니다.\n * \n * Component that displays a list of merchants.\n * Shows merchant information, health status, approval rate, and transaction volume in card format.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <MerchantList\n * items={[\n * {\n * id: \"1\",\n * name: \"가맹점 A\",\n * health: \"normal\",\n * approvalRate: 0.985,\n * volume: 1000000,\n * currency: \"KRW\"\n * }\n * ]}\n * onMerchantSelect={(merchant) => console.log(merchant)}\n * />\n * \n * @example\n * // 로딩 상태 / Loading state\n * <MerchantList\n * items={merchants}\n * isLoading={true}\n * filters={<FilterComponent />}\n * />\n * \n * @param {MerchantListProps} props - MerchantList 컴포넌트의 props / MerchantList component props\n * @returns {JSX.Element} MerchantList 컴포넌트 / MerchantList component\n */\nexport const MerchantList: React.FC<MerchantListProps> = ({\n items,\n isLoading = false,\n filters,\n emptyState,\n onMerchantSelect,\n locale = \"ko-KR\",\n defaultCurrency = \"KRW\",\n className,\n ...props\n}) => {\n const hasItems = items.length > 0;\n\n return (\n <div\n className={merge(\n \"rounded-2xl border border-slate-100 dark:border-slate-800 bg-white dark:bg-slate-900/50\",\n className\n )}\n {...props}\n >\n {filters && (\n <div className=\"border-b border-slate-100 dark:border-slate-800 px-4 py-3 md:px-6\">{filters}</div>\n )}\n\n <div className=\"p-4 md:p-6\">\n {isLoading ? (\n <div className=\"space-y-3\">\n {[...Array(3)].map((_, idx) => (\n <Skeleton key={idx} className=\"h-20 rounded-2xl\" />\n ))}\n </div>\n ) : !hasItems ? (\n emptyState ?? (\n <DashboardEmptyState\n icon=\"store\"\n title=\"가맹점이 없습니다\"\n description=\"검색어를 변경하거나 새로운 가맹점을 온보딩하세요.\"\n size=\"sm\"\n className=\"py-6\"\n />\n )\n ) : (\n <div className=\"space-y-3\" role=\"list\" aria-label=\"가맹점 목록\">\n {items.map((merchant) => {\n const approval = formatPercent(merchant.approvalRate);\n const volume = formatVolume(merchant.volume, merchant.currency ?? defaultCurrency, locale);\n const badgeClass = merchant.health ? HEALTH_BADGES[merchant.health] : undefined;\n\n const merchantLabel = `${merchant.name}${merchant.status ? `, 상태: ${merchant.status}` : ''}${merchant.health ? `, 건강 상태: ${merchant.health === \"critical\" ? \"위험\" : merchant.health === \"warning\" ? \"감시\" : \"정상\"}` : ''}${volume ? `, 거래량: ${volume}` : ''}${approval ? `, 승인률: ${approval}` : ''}`;\n\n return (\n <button\n key={merchant.id}\n type=\"button\"\n role=\"button\"\n onClick={onMerchantSelect ? () => onMerchantSelect(merchant) : undefined}\n disabled={!onMerchantSelect}\n aria-label={onMerchantSelect ? `${merchantLabel} - 클릭하여 상세 정보 보기` : merchantLabel}\n className={merge(\n \"w-full rounded-2xl border border-slate-100 dark:border-slate-800 bg-white/90 dark:bg-slate-900/60 p-4 text-left shadow-sm transition hover:border-slate-200 dark:hover:border-slate-700 focus:outline-none focus-visible:ring-2 focus-visible:ring-blue-500/70\",\n onMerchantSelect ? \"cursor-pointer\" : \"cursor-default opacity-60\"\n )}\n >\n <div className=\"flex flex-wrap items-center gap-3\">\n {merchant.icon && (\n <div className=\"rounded-xl bg-slate-100 dark:bg-slate-800 p-2 text-slate-500\">\n {typeof merchant.icon === \"string\" ? (\n <Icon name={merchant.icon as IconName} className=\"h-5 w-5\" />\n ) : (\n merchant.icon\n )}\n </div>\n )}\n <div className=\"flex-1\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <p className=\"text-sm font-semibold text-slate-900 dark:text-white\">{merchant.name}</p>\n {merchant.status && (\n <Badge className=\"bg-slate-100 text-slate-600 dark:bg-slate-800 dark:text-slate-100\">\n {merchant.status}\n </Badge>\n )}\n {merchant.tag && (\n <span className=\"rounded-full bg-slate-50 px-2 py-0.5 text-[11px] text-slate-500 dark:bg-slate-800/80\">\n {merchant.tag}\n </span>\n )}\n {badgeClass && (\n <span className={merge(\"rounded-full px-2 py-0.5 text-[11px] font-medium\", badgeClass)}>\n {merchant.health === \"critical\"\n ? \"위험\"\n : merchant.health === \"warning\"\n ? \"감시\"\n : \"정상\"}\n </span>\n )}\n </div>\n <div className=\"text-xs text-slate-500 dark:text-slate-300\">\n {merchant.category ?? \"카테고리 미정\"} · {merchant.region ?? \"지역 정보 없음\"}\n </div>\n </div>\n <div className=\"text-right text-sm text-slate-900 dark:text-white\">\n {volume && <div className=\"font-semibold\">{volume}</div>}\n {approval && <div className=\"text-xs text-slate-500\">승인률 {approval}</div>}\n </div>\n </div>\n\n {merchant.metadata && merchant.metadata.length > 0 && (\n <div className=\"mt-3 grid gap-3 text-xs text-slate-500 dark:text-slate-300 sm:grid-cols-2\">\n {merchant.metadata.map((meta) => (\n <div key={meta.label} className=\"flex items-center gap-2\">\n <span className=\"text-slate-400\">{meta.label}</span>\n <span className=\"text-slate-700 dark:text-slate-100\">{meta.value}</span>\n </div>\n ))}\n </div>\n )}\n </button>\n );\n })}\n </div>\n )}\n </div>\n </div>\n );\n};\n\nMerchantList.displayName = \"MerchantList\";\n\n","\"use client\";\n\nimport React from \"react\";\nimport { merge } from \"../lib/utils\";\n\n/**\n * StatsPanelItem 인터페이스 / StatsPanelItem interface\n * @typedef {Object} StatsPanelItem\n * @property {string} label - 통계 항목 라벨 / Stat item label\n * @property {string | React.ReactNode} value - 통계 값 / Stat value\n * @property {string | React.ReactNode} [description] - 통계 설명 / Stat description\n * @property {\"up\" | \"down\" | \"neutral\"} [trend] - 추세 방향 / Trend direction\n * @property {string} [trendValue] - 추세 값 / Trend value\n * @property {\"primary\" | \"secondary\" | \"neutral\" | \"warning\"} [accent] - 강조 색상 / Accent color\n * @property {React.ReactNode} [icon] - 아이콘 / Icon\n */\nexport interface StatsPanelItem {\n label: string;\n value: string | React.ReactNode;\n description?: string | React.ReactNode;\n trend?: \"up\" | \"down\" | \"neutral\";\n trendValue?: string;\n accent?: \"primary\" | \"secondary\" | \"neutral\" | \"warning\";\n icon?: React.ReactNode;\n}\n\n/**\n * StatsPanel 컴포넌트의 props / StatsPanel component props\n * @typedef {Object} StatsPanelProps\n * @property {string} [title] - 패널 제목 / Panel title\n * @property {StatsPanelItem[]} items - 통계 항목 배열 / Stat items array\n * @property {1 | 2 | 3 | 4} [columns=4] - 그리드 컬럼 수 / Grid column count\n * @property {boolean} [loading=false] - 로딩 상태 / Loading state\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface StatsPanelProps extends React.HTMLAttributes<HTMLDivElement> {\n title?: string;\n items: StatsPanelItem[];\n columns?: 1 | 2 | 3 | 4;\n loading?: boolean;\n}\n\n/**\n * StatsPanel 컴포넌트 / StatsPanel component\n * \n * 통계 정보를 표시하는 패널 컴포넌트입니다.\n * 여러 통계 항목을 그리드 형태로 표시하며, 추세 정보를 포함할 수 있습니다.\n * \n * Panel component that displays statistics.\n * Shows multiple stat items in grid format and can include trend information.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <StatsPanel\n * items={[\n * { label: \"총 사용자\", value: \"1,234\", trend: \"up\", trendValue: \"+12%\" },\n * { label: \"활성 사용자\", value: \"567\", trend: \"down\", trendValue: \"-5%\" }\n * ]}\n * />\n * \n * @example\n * // 2열 그리드, 제목 포함 / 2-column grid with title\n * <StatsPanel\n * title=\"통계\"\n * columns={2}\n * items={[\n * { label: \"항목 1\", value: \"100\", accent: \"primary\" },\n * { label: \"항목 2\", value: \"200\", accent: \"secondary\" }\n * ]}\n * />\n * \n * @param {StatsPanelProps} props - StatsPanel 컴포넌트의 props / StatsPanel component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} StatsPanel 컴포넌트 / StatsPanel component\n */\nexport const StatsPanel = React.forwardRef<HTMLDivElement, StatsPanelProps>(\n (\n {\n title,\n items,\n columns = 4,\n loading = false,\n className,\n ...props\n },\n ref\n ) => {\n const baseCardClass =\n \"rounded-2xl border border-[var(--border-subtle)] bg-[var(--surface)] text-[var(--text-strong)] shadow-sm transition-colors\";\n\n const accentStyles: Record<\n NonNullable<StatsPanelItem[\"accent\"]>,\n {\n card: string;\n label: string;\n value: string;\n icon: string;\n iconWrapper: string;\n }\n > = {\n primary: {\n card: `${baseCardClass} ring-1 ring-[rgba(0,82,204,0.18)] dark:ring-[rgba(59,130,246,0.28)] bg-gradient-to-br from-[rgba(0,82,204,0.08)] via-transparent to-transparent dark:from-[rgba(59,130,246,0.18)]`,\n label: \"text-[var(--brand-primary)]\",\n value: \"text-[var(--text-strong)]\",\n icon: \"text-[var(--brand-primary)]\",\n iconWrapper: \"bg-[rgba(0,82,204,0.12)] dark:bg-[rgba(59,130,246,0.25)]\",\n },\n secondary: {\n card: `${baseCardClass} ring-1 ring-[rgba(11,122,91,0.18)] dark:ring-[rgba(52,211,153,0.25)] bg-gradient-to-br from-[rgba(0,200,151,0.08)] via-transparent to-transparent dark:from-[rgba(52,211,153,0.16)]`,\n label: \"text-[var(--brand-secondary)]\",\n value: \"text-[var(--text-strong)]\",\n icon: \"text-[var(--brand-secondary)]\",\n iconWrapper: \"bg-[rgba(0,200,151,0.12)] dark:bg-[rgba(52,211,153,0.22)]\",\n },\n warning: {\n card: `${baseCardClass} ring-1 ring-[rgba(245,158,11,0.2)] dark:ring-[rgba(251,191,36,0.32)] bg-gradient-to-br from-[rgba(245,158,11,0.1)] via-transparent to-transparent dark:from-[rgba(251,191,36,0.2)]`,\n label: \"text-amber-600\",\n value: \"text-[var(--text-strong)]\",\n icon: \"text-amber-600\",\n iconWrapper: \"bg-[rgba(245,158,11,0.15)] dark:bg-[rgba(251,191,36,0.25)]\",\n },\n neutral: {\n card: baseCardClass,\n label: \"text-[var(--text-muted)]\",\n value: \"text-[var(--text-strong)]\",\n icon: \"text-[var(--text-muted)]\",\n iconWrapper: \"bg-[var(--surface-muted)]\",\n },\n };\n\n const gridCols = {\n 1: \"grid-cols-1\",\n 2: \"grid-cols-1 lg:grid-cols-2\",\n 3: \"grid-cols-1 lg:grid-cols-2 xl:grid-cols-3\",\n 4: \"grid-cols-1 lg:grid-cols-2 xl:grid-cols-4\",\n }[columns];\n\n return (\n <div\n ref={ref}\n className={merge(\"w-full\", className)}\n {...props}\n >\n {title && (\n <h2 className=\"mb-4 text-lg font-semibold text-gray-900 dark:text-slate-50\">\n {title}\n </h2>\n )}\n <div\n className={merge(\"grid gap-5\", gridCols)}\n >\n {loading ? (\n Array.from({ length: columns }).map((_, i) => (\n <div\n key={i}\n className=\"animate-pulse rounded-2xl border border-[var(--border-subtle)] bg-[var(--surface)] p-6\"\n >\n <div className=\"mb-2 h-4 w-20 rounded bg-[var(--surface-muted)]/80\" />\n <div className=\"mb-1 h-8 w-24 rounded bg-[var(--surface-muted)]/80\" />\n <div className=\"h-3 w-32 rounded bg-[var(--surface-muted)]/80\" />\n </div>\n ))\n ) : (\n items.map((item, index) => (\n <div\n key={index}\n className={merge(\n \"rounded-xl transition-all duration-200 p-6\",\n accentStyles[item.accent ?? \"neutral\"].card\n )}\n >\n <div className=\"mb-3 flex items-start justify-between gap-4\">\n <div\n className={merge(\n \"text-sm font-medium\",\n accentStyles[item.accent ?? \"neutral\"].label\n )}\n >\n {item.label}\n </div>\n {item.icon && (\n <div\n className={merge(\n \"inline-flex h-10 w-10 items-center justify-center rounded-xl text-base font-semibold\",\n accentStyles[item.accent ?? \"neutral\"].iconWrapper,\n accentStyles[item.accent ?? \"neutral\"].icon\n )}\n >\n {item.icon}\n </div>\n )}\n </div>\n <div\n className={merge(\n \"text-2xl font-semibold leading-tight mb-2\",\n accentStyles[item.accent ?? \"neutral\"].value\n )}\n >\n {item.value}\n </div>\n {item.description && (\n <div className=\"mt-1 text-xs text-gray-500 dark:text-slate-400\">\n {item.description}\n </div>\n )}\n {item.trend && item.trendValue && (\n <div\n className={merge(\n \"mt-2 flex items-center gap-1 text-xs\",\n item.trend === \"up\"\n ? \"text-green-600 dark:text-green-400\"\n : item.trend === \"down\"\n ? \"text-red-600 dark:text-red-400\"\n : \"text-gray-500 dark:text-slate-400\"\n )}\n >\n {item.trend === \"up\" && \"↑\"}\n {item.trend === \"down\" && \"↓\"}\n {item.trendValue}\n </div>\n )}\n </div>\n ))\n )}\n </div>\n </div>\n );\n }\n);\n\nStatsPanel.displayName = \"StatsPanel\";\n\n","\"use client\";\n\nimport React from \"react\";\nimport { merge } from \"../lib/utils\";\n\n/**\n * SectionHeader 컴포넌트의 props / SectionHeader component props\n * @typedef {Object} SectionHeaderProps\n * @property {string} title - 섹션 제목 / Section title\n * @property {string} [description] - 섹션 설명 / Section description\n * @property {React.ReactNode} [action] - 액션 버튼 또는 요소 / Action button or element\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface SectionHeaderProps extends React.HTMLAttributes<HTMLDivElement> {\n title: string;\n description?: string;\n action?: React.ReactNode;\n}\n\n/**\n * SectionHeader 컴포넌트 / SectionHeader component\n * \n * 섹션의 헤더를 표시하는 컴포넌트입니다.\n * 제목, 설명, 액션 버튼을 포함할 수 있습니다.\n * \n * Component that displays section header.\n * Can include title, description, and action button.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <SectionHeader title=\"섹션 제목\" />\n * \n * @example\n * // 설명과 액션 포함 / With description and action\n * <SectionHeader\n * title=\"알림\"\n * description=\"최근 알림 목록\"\n * action={<Button>모두 읽음</Button>}\n * />\n * \n * @param {SectionHeaderProps} props - SectionHeader 컴포넌트의 props / SectionHeader component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} SectionHeader 컴포넌트 / SectionHeader component\n */\nexport const SectionHeader = React.forwardRef<HTMLDivElement, SectionHeaderProps>(\n (\n {\n title,\n description,\n action,\n className,\n ...props\n },\n ref\n ) => {\n return (\n <div\n ref={ref}\n className={merge(\n \"flex items-center justify-between border-b border-gray-100 bg-transparent px-6 py-4 text-gray-900 dark:border-slate-800 dark:text-slate-50\",\n className\n )}\n {...props}\n >\n <div className=\"flex-1\">\n <h3 className=\"text-base font-semibold text-inherit\">\n {title}\n </h3>\n {description && (\n <p className=\"mt-1 text-sm text-gray-500 dark:text-slate-400\">\n {description}\n </p>\n )}\n </div>\n {action && (\n <div className=\"flex-shrink-0 ml-4\">\n {action}\n </div>\n )}\n </div>\n );\n }\n);\n\nSectionHeader.displayName = \"SectionHeader\";\n\n"]}
|