@hua-labs/ui 1.0.0 → 1.1.0-alpha.0.1
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/README.md +891 -213
- package/dist/ComponentLayout-BxCenSAm.d.mts +73 -0
- package/dist/advanced/dashboard.d.ts +7 -0
- package/dist/advanced/dashboard.d.ts.map +1 -0
- package/dist/advanced/motion.d.ts +2 -0
- package/dist/advanced/motion.d.ts.map +1 -0
- package/dist/advanced-dashboard.d.mts +4 -0
- package/dist/advanced-dashboard.js +2 -0
- package/dist/advanced-dashboard.js.map +1 -0
- package/dist/advanced-dashboard.mjs +2 -0
- package/dist/advanced-dashboard.mjs.map +1 -0
- package/dist/advanced-motion.d.mts +93 -0
- package/dist/advanced-motion.js +2 -0
- package/dist/advanced-motion.js.map +1 -0
- package/dist/advanced-motion.mjs +2 -0
- package/dist/advanced-motion.mjs.map +1 -0
- package/dist/advanced.d.mts +734 -0
- package/dist/advanced.d.ts +17 -0
- package/dist/advanced.d.ts.map +1 -0
- package/dist/advanced.js +2 -0
- package/dist/advanced.js.map +1 -0
- package/dist/advanced.mjs +2 -0
- package/dist/advanced.mjs.map +1 -0
- package/dist/chunk-6NXF6ATP.mjs +2 -0
- package/dist/chunk-6NXF6ATP.mjs.map +1 -0
- package/dist/chunk-ACEKLG37.mjs +2 -0
- package/dist/chunk-ACEKLG37.mjs.map +1 -0
- package/dist/chunk-DMYT7RZ4.mjs +2 -0
- package/dist/chunk-DMYT7RZ4.mjs.map +1 -0
- package/dist/chunk-KHEJZ3U4.mjs +2 -0
- package/dist/chunk-KHEJZ3U4.mjs.map +1 -0
- package/dist/chunk-QXBMXCML.mjs +2 -0
- package/dist/chunk-QXBMXCML.mjs.map +1 -0
- package/dist/chunk-SGCVGEDR.mjs +2 -0
- package/dist/chunk-SGCVGEDR.mjs.map +1 -0
- package/dist/chunk-UUHAXGMO.mjs +2 -0
- package/dist/chunk-UUHAXGMO.mjs.map +1 -0
- package/dist/chunk-VPOFRDYL.mjs +2 -0
- package/dist/chunk-VPOFRDYL.mjs.map +1 -0
- package/dist/chunk-YY6ZBUVJ.mjs +2 -0
- package/dist/chunk-YY6ZBUVJ.mjs.map +1 -0
- package/dist/chunk-ZQAAB3P4.mjs +2 -0
- package/dist/chunk-ZQAAB3P4.mjs.map +1 -0
- package/dist/components/Accordion.d.ts +109 -1
- package/dist/components/Accordion.d.ts.map +1 -1
- package/dist/components/Action.d.ts +68 -0
- package/dist/components/Action.d.ts.map +1 -0
- package/dist/components/ActionToolbar.d.ts +65 -0
- package/dist/components/ActionToolbar.d.ts.map +1 -0
- package/dist/components/Alert.d.ts +49 -0
- package/dist/components/Alert.d.ts.map +1 -1
- package/dist/components/Autocomplete.d.ts +88 -0
- package/dist/components/Autocomplete.d.ts.map +1 -0
- package/dist/components/Avatar.d.ts +71 -1
- package/dist/components/Avatar.d.ts.map +1 -1
- package/dist/components/Badge.d.ts +32 -2
- package/dist/components/Badge.d.ts.map +1 -1
- package/dist/components/Bookmark.d.ts +49 -0
- package/dist/components/Bookmark.d.ts.map +1 -0
- package/dist/components/BottomSheet.d.ts +91 -1
- package/dist/components/BottomSheet.d.ts.map +1 -1
- package/dist/components/Breadcrumb.d.ts +73 -14
- package/dist/components/Breadcrumb.d.ts.map +1 -1
- package/dist/components/Button.d.ts +82 -7
- package/dist/components/Button.d.ts.map +1 -1
- package/dist/components/Card.d.ts +122 -5
- package/dist/components/Card.d.ts.map +1 -1
- package/dist/components/ChatMessage.d.ts +67 -1
- package/dist/components/ChatMessage.d.ts.map +1 -1
- package/dist/components/Checkbox.d.ts +48 -2
- package/dist/components/Checkbox.d.ts.map +1 -1
- package/dist/components/Command.d.ts +82 -1
- package/dist/components/Command.d.ts.map +1 -1
- package/dist/components/ComponentLayout.d.ts +72 -0
- package/dist/components/ComponentLayout.d.ts.map +1 -0
- package/dist/components/ConfirmModal.d.ts +66 -1
- package/dist/components/ConfirmModal.d.ts.map +1 -1
- package/dist/components/Container.d.ts +39 -0
- package/dist/components/Container.d.ts.map +1 -1
- package/dist/components/ContextMenu.d.ts +51 -1
- package/dist/components/ContextMenu.d.ts.map +1 -1
- package/dist/components/DatePicker.d.ts +62 -0
- package/dist/components/DatePicker.d.ts.map +1 -0
- package/dist/components/Divider.d.ts +13 -3
- package/dist/components/Divider.d.ts.map +1 -1
- package/dist/components/Drawer.d.ts +103 -1
- package/dist/components/Drawer.d.ts.map +1 -1
- package/dist/components/Dropdown.d.ts +51 -1
- package/dist/components/Dropdown.d.ts.map +1 -1
- package/dist/components/EmotionAnalysis.d.ts +59 -1
- package/dist/components/EmotionAnalysis.d.ts.map +1 -1
- package/dist/components/EmotionButton.d.ts +35 -1
- package/dist/components/EmotionButton.d.ts.map +1 -1
- package/dist/components/EmotionMeter.d.ts +38 -2
- package/dist/components/EmotionMeter.d.ts.map +1 -1
- package/dist/components/EmotionSelector.d.ts +51 -1
- package/dist/components/EmotionSelector.d.ts.map +1 -1
- package/dist/components/FeatureCard.d.ts +61 -0
- package/dist/components/FeatureCard.d.ts.map +1 -0
- package/dist/components/Form.d.ts +114 -0
- package/dist/components/Form.d.ts.map +1 -0
- package/dist/components/Grid.d.ts +42 -1
- package/dist/components/Grid.d.ts.map +1 -1
- package/dist/components/HeroSection.d.ts +77 -0
- package/dist/components/HeroSection.d.ts.map +1 -0
- package/dist/components/Icon/Icon.d.ts +159 -0
- package/dist/components/Icon/Icon.d.ts.map +1 -0
- package/dist/components/Icon/IconProvider.d.ts +94 -0
- package/dist/components/Icon/IconProvider.d.ts.map +1 -0
- package/dist/components/Icon/icon-store.d.ts +21 -0
- package/dist/components/Icon/icon-store.d.ts.map +1 -0
- package/dist/components/Icon/index.d.ts +10 -0
- package/dist/components/Icon/index.d.ts.map +1 -0
- package/dist/components/InfoCard.d.ts +48 -0
- package/dist/components/InfoCard.d.ts.map +1 -0
- package/dist/components/Input.d.ts +40 -8
- package/dist/components/Input.d.ts.map +1 -1
- package/dist/components/Label.d.ts +50 -0
- package/dist/components/Label.d.ts.map +1 -0
- package/dist/components/LanguageToggle.d.ts +41 -1
- package/dist/components/LanguageToggle.d.ts.map +1 -1
- package/dist/components/Link.d.ts +52 -0
- package/dist/components/Link.d.ts.map +1 -0
- package/dist/components/LoadingSpinner.d.ts +44 -5
- package/dist/components/LoadingSpinner.d.ts.map +1 -1
- package/dist/components/Menu.d.ts +92 -1
- package/dist/components/Menu.d.ts.map +1 -1
- package/dist/components/Modal.d.ts +67 -5
- package/dist/components/Modal.d.ts.map +1 -1
- package/dist/components/Navigation.d.ts +72 -0
- package/dist/components/Navigation.d.ts.map +1 -0
- package/dist/components/PageNavigation.d.ts +48 -0
- package/dist/components/PageNavigation.d.ts.map +1 -0
- package/dist/components/PageTransition.d.ts +44 -1
- package/dist/components/PageTransition.d.ts.map +1 -1
- package/dist/components/Pagination.d.ts +52 -1
- package/dist/components/Pagination.d.ts.map +1 -1
- package/dist/components/Panel.d.ts +99 -0
- package/dist/components/Panel.d.ts.map +1 -0
- package/dist/components/Popover.d.ts +46 -1
- package/dist/components/Popover.d.ts.map +1 -1
- package/dist/components/Progress.d.ts +52 -3
- package/dist/components/Progress.d.ts.map +1 -1
- package/dist/components/Radio.d.ts +44 -2
- package/dist/components/Radio.d.ts.map +1 -1
- package/dist/components/ScrollArea.d.ts +53 -1
- package/dist/components/ScrollArea.d.ts.map +1 -1
- package/dist/components/ScrollIndicator.d.ts +43 -1
- package/dist/components/ScrollIndicator.d.ts.map +1 -1
- package/dist/components/ScrollProgress.d.ts +37 -0
- package/dist/components/ScrollProgress.d.ts.map +1 -1
- package/dist/components/ScrollToTop.d.ts +48 -11
- package/dist/components/ScrollToTop.d.ts.map +1 -1
- package/dist/components/SectionHeader.d.ts +42 -0
- package/dist/components/SectionHeader.d.ts.map +1 -0
- package/dist/components/Select.d.ts +59 -2
- package/dist/components/Select.d.ts.map +1 -1
- package/dist/components/Skeleton.d.ts +44 -1
- package/dist/components/Skeleton.d.ts.map +1 -1
- package/dist/components/Slider.d.ts +75 -0
- package/dist/components/Slider.d.ts.map +1 -0
- package/dist/components/Stack.d.ts +42 -1
- package/dist/components/Stack.d.ts.map +1 -1
- package/dist/components/StatsPanel.d.ts +72 -0
- package/dist/components/StatsPanel.d.ts.map +1 -0
- package/dist/components/Switch.d.ts +48 -2
- package/dist/components/Switch.d.ts.map +1 -1
- package/dist/components/Table.d.ts +206 -0
- package/dist/components/Table.d.ts.map +1 -0
- package/dist/components/Tabs.d.ts +123 -10
- package/dist/components/Tabs.d.ts.map +1 -1
- package/dist/components/Textarea.d.ts +48 -2
- package/dist/components/Textarea.d.ts.map +1 -1
- package/dist/components/ThemeProvider.d.ts +67 -2
- package/dist/components/ThemeProvider.d.ts.map +1 -1
- package/dist/components/ThemeToggle.d.ts +44 -0
- package/dist/components/ThemeToggle.d.ts.map +1 -1
- package/dist/components/Toast.d.ts +75 -1
- package/dist/components/Toast.d.ts.map +1 -1
- package/dist/components/Toggle.d.ts +62 -0
- package/dist/components/Toggle.d.ts.map +1 -0
- package/dist/components/Tooltip.d.ts +48 -1
- package/dist/components/Tooltip.d.ts.map +1 -1
- package/dist/components/Upload.d.ts +87 -0
- package/dist/components/Upload.d.ts.map +1 -0
- package/dist/components/advanced/AdvancedPageTransition.d.ts +25 -0
- package/dist/components/advanced/AdvancedPageTransition.d.ts.map +1 -0
- package/dist/components/advanced/index.d.ts +4 -0
- package/dist/components/advanced/index.d.ts.map +1 -0
- package/dist/components/advanced/usePageTransition.d.ts +33 -0
- package/dist/components/advanced/usePageTransition.d.ts.map +1 -0
- package/dist/components/advanced/usePageTransitionManager.d.ts +44 -0
- package/dist/components/advanced/usePageTransitionManager.d.ts.map +1 -0
- package/dist/components/dashboard/ActivityFeed.d.ts +87 -0
- package/dist/components/dashboard/ActivityFeed.d.ts.map +1 -0
- package/dist/components/dashboard/BarChart.d.ts +82 -0
- package/dist/components/dashboard/BarChart.d.ts.map +1 -0
- package/dist/components/dashboard/DashboardGrid.d.ts +44 -0
- package/dist/components/dashboard/DashboardGrid.d.ts.map +1 -0
- package/dist/components/dashboard/DashboardSidebar.d.ts +105 -0
- package/dist/components/dashboard/DashboardSidebar.d.ts.map +1 -0
- package/dist/components/dashboard/DashboardToolbar.d.ts +120 -0
- package/dist/components/dashboard/DashboardToolbar.d.ts.map +1 -0
- package/dist/components/dashboard/EmptyState.d.ts +61 -0
- package/dist/components/dashboard/EmptyState.d.ts.map +1 -0
- package/dist/components/dashboard/MembershipBadge.d.ts +45 -0
- package/dist/components/dashboard/MembershipBadge.d.ts.map +1 -0
- package/dist/components/dashboard/MerchantList.d.ts +98 -0
- package/dist/components/dashboard/MerchantList.d.ts.map +1 -0
- package/dist/components/dashboard/MetricCard.d.ts +75 -0
- package/dist/components/dashboard/MetricCard.d.ts.map +1 -0
- package/dist/components/dashboard/MiniBarChart.d.ts +60 -0
- package/dist/components/dashboard/MiniBarChart.d.ts.map +1 -0
- package/dist/components/dashboard/NotificationCard.d.ts +89 -0
- package/dist/components/dashboard/NotificationCard.d.ts.map +1 -0
- package/dist/components/dashboard/ProfileCard.d.ts +82 -0
- package/dist/components/dashboard/ProfileCard.d.ts.map +1 -0
- package/dist/components/dashboard/ProgressCard.d.ts +71 -0
- package/dist/components/dashboard/ProgressCard.d.ts.map +1 -0
- package/dist/components/dashboard/QuickActionCard.d.ts +63 -0
- package/dist/components/dashboard/QuickActionCard.d.ts.map +1 -0
- package/dist/components/dashboard/RoutingBreakdownCard.d.ts +88 -0
- package/dist/components/dashboard/RoutingBreakdownCard.d.ts.map +1 -0
- package/dist/components/dashboard/SettlementTimeline.d.ts +90 -0
- package/dist/components/dashboard/SettlementTimeline.d.ts.map +1 -0
- package/dist/components/dashboard/StatCard.d.ts +70 -0
- package/dist/components/dashboard/StatCard.d.ts.map +1 -0
- package/dist/components/dashboard/SummaryCard.d.ts +73 -0
- package/dist/components/dashboard/SummaryCard.d.ts.map +1 -0
- package/dist/components/dashboard/TransactionDetailDrawer.d.ts +183 -0
- package/dist/components/dashboard/TransactionDetailDrawer.d.ts.map +1 -0
- package/dist/components/dashboard/TransactionsTable.d.ts +137 -0
- package/dist/components/dashboard/TransactionsTable.d.ts.map +1 -0
- package/dist/components/dashboard/TrendChart.d.ts +75 -0
- package/dist/components/dashboard/TrendChart.d.ts.map +1 -0
- package/dist/components/dashboard/index.d.ts +41 -0
- package/dist/components/dashboard/index.d.ts.map +1 -0
- package/dist/components/scrollbar/scrollbar.d.ts +12 -0
- package/dist/components/scrollbar/scrollbar.d.ts.map +1 -0
- package/dist/dashboard-QMssHf5j.d.mts +1801 -0
- package/dist/feedback.d.mts +103 -0
- package/dist/feedback.d.ts +21 -0
- package/dist/feedback.d.ts.map +1 -0
- package/dist/feedback.js +2 -0
- package/dist/feedback.js.map +1 -0
- package/dist/feedback.mjs +2 -0
- package/dist/feedback.mjs.map +1 -0
- package/dist/form.d.mts +803 -0
- package/dist/form.d.ts +42 -0
- package/dist/form.d.ts.map +1 -0
- package/dist/form.js +2 -0
- package/dist/form.js.map +1 -0
- package/dist/form.mjs +2 -0
- package/dist/form.mjs.map +1 -0
- package/dist/hooks/useScrollToggle.d.ts +12 -0
- package/dist/hooks/useScrollToggle.d.ts.map +1 -0
- package/dist/icons-DoSGIez_.d.mts +135 -0
- package/dist/index.d.mts +3770 -0
- package/dist/index.d.ts +76 -38
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +37 -49
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +37 -0
- package/dist/index.mjs.map +1 -0
- package/dist/lib/icon-aliases.d.ts +24 -0
- package/dist/lib/icon-aliases.d.ts.map +1 -0
- package/dist/lib/icon-names.d.ts +47 -0
- package/dist/lib/icon-names.d.ts.map +1 -0
- package/dist/lib/icon-providers.d.ts +560 -0
- package/dist/lib/icon-providers.d.ts.map +1 -0
- package/dist/lib/icons.d.ts +113 -24
- package/dist/lib/icons.d.ts.map +1 -1
- package/dist/lib/phosphor-icons.d.ts +6 -0
- package/dist/lib/phosphor-icons.d.ts.map +1 -0
- package/dist/lib/styles/colors.d.ts +131 -0
- package/dist/lib/styles/colors.d.ts.map +1 -0
- package/dist/lib/styles/index.d.ts +8 -0
- package/dist/lib/styles/index.d.ts.map +1 -0
- package/dist/lib/styles/utils.d.ts +87 -0
- package/dist/lib/styles/utils.d.ts.map +1 -0
- package/dist/lib/styles/variants.d.ts +79 -0
- package/dist/lib/styles/variants.d.ts.map +1 -0
- package/dist/lib/types/common.d.ts +80 -0
- package/dist/lib/types/common.d.ts.map +1 -0
- package/dist/lib/types/index.d.ts +6 -0
- package/dist/lib/types/index.d.ts.map +1 -0
- package/dist/lib/utils.d.ts +73 -1
- package/dist/lib/utils.d.ts.map +1 -1
- package/dist/navigation.d.mts +105 -0
- package/dist/navigation.d.ts +22 -0
- package/dist/navigation.d.ts.map +1 -0
- package/dist/navigation.js +2 -0
- package/dist/navigation.js.map +1 -0
- package/dist/navigation.mjs +2 -0
- package/dist/navigation.mjs.map +1 -0
- package/package.json +85 -19
- package/src/styles/toast.css +23 -0
- package/dist/components/Accordion.js +0 -84
- package/dist/components/Alert.js +0 -61
- package/dist/components/Avatar.js +0 -18
- package/dist/components/Badge.js +0 -15
- package/dist/components/BottomSheet.js +0 -96
- package/dist/components/Breadcrumb.js +0 -47
- package/dist/components/Button.js +0 -23
- package/dist/components/Card.js +0 -18
- package/dist/components/ChatMessage.js +0 -59
- package/dist/components/Checkbox.js +0 -30
- package/dist/components/Command.js +0 -119
- package/dist/components/ConfirmModal.js +0 -53
- package/dist/components/Container.js +0 -23
- package/dist/components/ContextMenu.js +0 -110
- package/dist/components/Divider.js +0 -39
- package/dist/components/Drawer.js +0 -79
- package/dist/components/Dropdown.js +0 -174
- package/dist/components/EmotionAnalysis.js +0 -40
- package/dist/components/EmotionButton.js +0 -16
- package/dist/components/EmotionMeter.js +0 -21
- package/dist/components/EmotionSelector.js +0 -46
- package/dist/components/Grid.js +0 -44
- package/dist/components/Icon.d.ts +0 -26
- package/dist/components/Icon.d.ts.map +0 -1
- package/dist/components/Icon.js +0 -48
- package/dist/components/Input.js +0 -25
- package/dist/components/LanguageToggle.js +0 -61
- package/dist/components/LoadingSpinner.js +0 -37
- package/dist/components/Menu.js +0 -122
- package/dist/components/Modal.js +0 -62
- package/dist/components/PageTransition.js +0 -39
- package/dist/components/Pagination.js +0 -87
- package/dist/components/Popover.js +0 -159
- package/dist/components/Progress.js +0 -51
- package/dist/components/Radio.js +0 -29
- package/dist/components/ScrollArea.js +0 -42
- package/dist/components/ScrollIndicator.js +0 -60
- package/dist/components/ScrollProgress.js +0 -39
- package/dist/components/ScrollToTop.js +0 -46
- package/dist/components/Select.js +0 -29
- package/dist/components/Skeleton.js +0 -71
- package/dist/components/Stack.js +0 -34
- package/dist/components/Switch.js +0 -29
- package/dist/components/Tabs.js +0 -117
- package/dist/components/Textarea.js +0 -31
- package/dist/components/ThemeProvider.js +0 -76
- package/dist/components/ThemeToggle.js +0 -49
- package/dist/components/Toast.js +0 -138
- package/dist/components/Tooltip.js +0 -102
- package/dist/lib/icons.js +0 -321
- package/dist/lib/utils.js +0 -5
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/lib/icons.ts","../src/lib/icon-aliases.ts","../src/components/Icon/icon-store.ts","../src/components/Icon/IconProvider.tsx","../src/lib/icon-providers.ts","../src/components/Icon/Icon.tsx"],"names":["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","iconCategories","ICON_ALIASES","resolveIconAlias","iconName","getIconAliases","_","target","alias","defaultIconConfig","getDefaultStrokeWidth","set","IconContext","createContext","IconProvider","weight","size","color","strokeWidth","children","value","jsx","useIconContext","useContext","PhosphorIcons","PROJECT_ICONS","initPhosphorIcons","getIconFromProvider","provider","iconMapping","getIconDirect","mappedName","LucideIcons","lucideName","camelCaseName","match","p1","phosphorName1","phosphorName2","word","IconComponent","React","name","className","emotion","status","animated","pulse","spin","bounce","variant","ariaLabel","ariaHidden","ref","_a","config","iconSet","iconSize","iconWeight","iconColor","iconStrokeWidth","isClient","setIsClient","phosphorReady","setPhosphorReady","variantClasses","mergeMap","merge","iconProps","animationClasses","accessibilityProps","MemoizedIcon","prevProps","nextProps","Icon","EmotionIcon","props","StatusIcon","LoadingIcon","SuccessIcon","ErrorIcon"],"mappings":"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","file":"chunk-DMYT7RZ4.mjs","sourcesContent":["/**\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 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","/**\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","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"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import {a}from'./chunk-UUHAXGMO.mjs';import C,{useState,useRef,useEffect,useCallback}from'react';import {jsxs,jsx}from'react/jsx-runtime';var S=C.forwardRef(({children:s,className:i,type:M="fade",duration:l=500,easing:T="smooth",delay:x=0,autoStart:E=true,onStart:g,onComplete:p,showProgress:f=false,progressClassName:H},y)=>{let[c,d]=useState(false),[r,e]=useState(0),[A,m]=useState(false),w=useRef(null),t=useRef(null),a$1=b=>({linear:n=>n,"ease-in":n=>n*n,"ease-out":n=>1-Math.pow(1-n,2),"ease-in-out":n=>n<.5?2*n*n:1-Math.pow(-2*n+2,2)/2,bounce:n=>n<.36363636363636365?7.5625*n*n:n<.7272727272727273?7.5625*(n-=.5454545454545454)*n+.75:n<.9090909090909091?7.5625*(n-=.8181818181818182)*n+.9375:7.5625*(n-=.9545454545454546)*n+.984375,elastic:n=>Math.pow(2,-10*n)*Math.sin((n-.075)*(2*Math.PI)/.3)+1,smooth:n=>n*n*(3-2*n)})[b],o=b=>{t.current||(t.current=b);let N=b-t.current,n=a$1(T),D=Math.min(N/l,1);D=n(D),e(D),d(D>.1),D<1?w.current=requestAnimationFrame(o):(m(false),e(1),p==null||p());},u=()=>{m(true),e(0),g==null||g(),t.current=null,w.current=requestAnimationFrame(o);};useEffect(()=>{if(E){let b=setTimeout(()=>{u();},x);return ()=>clearTimeout(b)}},[E,x]),useEffect(()=>()=>{w.current&&cancelAnimationFrame(w.current);},[]);let v=(()=>{switch(M){case "fade":return {opacity:c?1:0,transform:"none"};case "slide":return {opacity:c?1:0,transform:`translateX(${(1-r)*100}%)`};case "slide-up":return {opacity:c?1:0,transform:`translateY(${(1-r)*100}%)`};case "slide-down":return {opacity:c?1:0,transform:`translateY(-${(1-r)*100}%)`};case "slide-left":return {opacity:c?1:0,transform:`translateX(-${(1-r)*100}%)`};case "slide-right":return {opacity:c?1:0,transform:`translateX(${(1-r)*100}%)`};case "scale":return {opacity:c?1:0,transform:`scale(${.8+r*.2})`};case "flip":return {opacity:c?1:0,transform:`perspective(1000px) rotateY(${(1-r)*90}deg)`};case "morph":return {opacity:c?1:0,transform:`scale(${.9+r*.1}) rotate(${(1-r)*5}deg)`};case "cube":return {opacity:c?1:0,transform:`perspective(1000px) rotateX(${(1-r)*90}deg) rotateY(${(1-r)*45}deg)`};case "zoom":return {opacity:c?1:0,transform:`scale(${.5+r*.5})`};default:return {opacity:c?1:0,transform:"none"}}})();return jsxs("div",{className:"relative",children:[f&&jsxs("div",{className:a("fixed top-4 right-4 z-50 bg-white dark:bg-gray-800 rounded-lg px-3 py-2 shadow-lg border",H),children:[jsxs("div",{className:"text-sm font-medium text-gray-700 dark:text-gray-300",children:["Progress: ",Math.round(r*100),"%"]}),jsx("div",{className:"w-24 h-2 bg-gray-200 dark:bg-gray-700 rounded-full mt-2",children:jsx("div",{className:"h-full bg-blue-500 rounded-full transition-all duration-100",style:{width:`${r*100}%`}})})]}),jsx("div",{ref:y,className:a("transition-all duration-500 ease-out",i),style:{...v,transitionDuration:`${l}ms`,transitionTimingFunction:T==="smooth"?"cubic-bezier(0.4, 0, 0.2, 1)":T==="bounce"?"cubic-bezier(0.68, -0.55, 0.265, 1.55)":T==="elastic"?"cubic-bezier(0.175, 0.885, 0.32, 1.275)":T},children:s})]})});S.displayName="AdvancedPageTransition";var I=C.forwardRef((s,i)=>jsx(S,{ref:i,type:"fade",...s})),X=C.forwardRef((s,i)=>jsx(S,{ref:i,type:"slide",...s})),Y=C.forwardRef((s,i)=>jsx(S,{ref:i,type:"scale",...s})),Z=C.forwardRef((s,i)=>jsx(S,{ref:i,type:"flip",...s})),J=C.forwardRef((s,i)=>jsx(S,{ref:i,type:"morph",...s})),_=C.forwardRef((s,i)=>jsx(S,{ref:i,type:"cube",...s})),B=C.forwardRef((s,i)=>jsx(S,{ref:i,type:"zoom",...s}));I.displayName="FadePageTransition";X.displayName="SlidePageTransition";Y.displayName="ScalePageTransition";Z.displayName="FlipPageTransition";J.displayName="MorphPageTransition";_.displayName="CubePageTransition";B.displayName="ZoomPageTransition";var Q=(s={})=>{let[i,M]=useState({isTransitioning:false,isVisible:false,currentStep:0,progress:0}),l=useRef(null),T=useRef(null),x=useRef({type:"fade",duration:500,easing:"smooth",delay:0,stagger:0,direction:"forward",...s}),E=useCallback(d=>({linear:e=>e,"ease-in":e=>e*e,"ease-out":e=>1-Math.pow(1-e,2),"ease-in-out":e=>e<.5?2*e*e:1-Math.pow(-2*e+2,2)/2,bounce:e=>e<.36363636363636365?7.5625*e*e:e<.7272727272727273?7.5625*(e-=.5454545454545454)*e+.75:e<.9090909090909091?7.5625*(e-=.8181818181818182)*e+.9375:7.5625*(e-=.9545454545454546)*e+.984375,elastic:e=>Math.pow(2,-10*e)*Math.sin((e-.075)*(2*Math.PI)/.3)+1,smooth:e=>e*e*(3-2*e)})[d],[]),g=useCallback(d=>{var w;T.current||(T.current=d);let r=d-T.current,e=x.current,A=E(e.easing),m=Math.min(r/e.duration,1);m=A(m),M(t=>({...t,progress:m,isVisible:e.direction==="forward"?m>.1:m<.9,currentStep:Math.floor(m*10)})),m<1?l.current=requestAnimationFrame(g):(M(t=>({...t,isTransitioning:false,progress:e.direction==="forward"?1:0})),(w=e.onComplete)==null||w.call(e));},[E]),p=useCallback(async d=>new Promise(r=>{var A;d&&(x.current={...x.current,...d});let e=x.current;e.onComplete=()=>r(),M(m=>({...m,isTransitioning:true,progress:e.direction==="forward"?0:1})),T.current=null,(A=e.onStart)==null||A.call(e),e.delay?setTimeout(()=>{l.current=requestAnimationFrame(g);},e.delay):l.current=requestAnimationFrame(g);}),[g]),f=useCallback(async()=>new Promise(d=>{let r=x.current;r.direction="backward",r.onComplete=()=>d(),p();}),[p]),H=useCallback(()=>{l.current&&cancelAnimationFrame(l.current);},[]),y=useCallback(()=>{i.isTransitioning&&(l.current=requestAnimationFrame(g));},[i.isTransitioning,g]),c=useCallback(()=>{l.current&&cancelAnimationFrame(l.current),M({isTransitioning:false,isVisible:false,currentStep:0,progress:0});},[]);return useEffect(()=>()=>{l.current&&cancelAnimationFrame(l.current);},[]),[i,{start:p,reverse:f,pause:H,resume:y,reset:c}]};var j=(s={})=>{let{defaultType:i="fade",defaultDuration:M=500,defaultEasing:l="smooth",enableHistory:T=true,enableProgress:x=true,enableDebug:E=false}=s,[g,p]=useState({isTransitioning:false,currentTransition:null,transitionHistory:[],totalTransitions:0,averageDuration:0}),f=useRef(new Map),H=useRef(0),y=useCallback((t,a)=>{E&&console.log(`[PageTransitionManager] ${t}`,a);},[E]),c=useCallback(t=>{p(a=>{let o=T?[...a.transitionHistory,t]:a.transitionHistory,u=o.length,P=o.reduce((v,b)=>v+b.duration,0)/u;return {...a,totalTransitions:u,averageDuration:P,transitionHistory:o}});},[T]),d=useCallback(async t=>{let a=`transition_${++H.current}`,o={type:i,duration:M,easing:l,...t},u={id:a,type:o.type,duration:o.duration,easing:o.easing,timestamp:Date.now(),status:"pending"};y("Starting transition",{id:a,config:o}),p(v=>({...v,isTransitioning:true,currentTransition:u}));let P=setTimeout(()=>{var b;let v={...u,status:"completed"};p(N=>({...N,isTransitioning:false,currentTransition:null})),c(v),f.current.delete(a),y("Transition completed",{id:a}),(b=o.onComplete)==null||b.call(o);},o.duration);return f.current.set(a,{timer:P,config:o}),setTimeout(()=>{p(v=>({...v,currentTransition:{...v.currentTransition,status:"active"}}));},50),a},[i,M,l,y,c]),r=useCallback(t=>{let a=f.current.get(t);a&&(clearTimeout(a.timer),f.current.delete(t),p(o=>{var u;return {...o,isTransitioning:f.current.size>0,currentTransition:((u=o.currentTransition)==null?void 0:u.id)===t?null:o.currentTransition}}),y("Transition cancelled",{id:t}));},[y]),e=useCallback(()=>{f.current.forEach(({timer:t},a)=>{clearTimeout(t),y("Transition paused",{id:a});});},[y]),A=useCallback(()=>{f.current.forEach(({config:t},a)=>{d(t);});},[d]),m=useCallback(()=>{p(t=>({...t,transitionHistory:[],totalTransitions:0,averageDuration:0})),y("History cleared");},[y]),w=useCallback(()=>{let{transitionHistory:t}=g,a=t.reduce((u,P)=>(u[P.type]=(u[P.type]||0)+1,u),{}),o=t.reduce((u,P)=>(u[P.status]=(u[P.status]||0)+1,u),{});return {total:t.length,average:g.averageDuration,byType:a,byStatus:o}},[g]);return useEffect(()=>()=>{f.current.forEach(({timer:t})=>{clearTimeout(t);}),f.current.clear();},[]),[g,{startTransition:d,cancelTransition:r,pauseAll:e,resumeAll:A,clearHistory:m,getTransitionStats:w}]};export{S as a,I as b,X as c,Y as d,Z as e,J as f,_ as g,B as h,Q as i,j};//# sourceMappingURL=chunk-KHEJZ3U4.mjs.map
|
|
2
|
+
//# sourceMappingURL=chunk-KHEJZ3U4.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/advanced/AdvancedPageTransition.tsx","../src/components/advanced/usePageTransition.ts","../src/components/advanced/usePageTransitionManager.ts"],"names":["AdvancedPageTransition","React","children","className","type","duration","easing","delay","autoStart","onStart","onComplete","showProgress","progressClassName","ref","isVisible","setIsVisible","useState","progress","setProgress","isTransitioning","setIsTransitioning","animationRef","useRef","startTimeRef","getEasingFunction","easingType","t","animate","timestamp","elapsed","easingFunction","currentProgress","startTransition","useEffect","timer","transitionStyles","jsxs","merge","jsx","FadePageTransition","props","SlidePageTransition","ScalePageTransition","FlipPageTransition","MorphPageTransition","CubePageTransition","ZoomPageTransition","usePageTransition","initialConfig","state","setState","configRef","useCallback","_a","config","prev","start","resolve","finalConfig","reverse","pause","resume","reset","usePageTransitionManager","defaultType","defaultDuration","defaultEasing","enableHistory","enableProgress","enableDebug","activeTransitionsRef","transitionCounterRef","logDebug","message","data","updateStats","newTransition","newHistory","total","average","sum","transitionId","fullConfig","transitionEvent","completedEvent","cancelTransition","id","transition","pauseAll","resumeAll","clearHistory","getTransitionStats","transitionHistory","byType","acc","byStatus"],"mappings":"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","file":"chunk-KHEJZ3U4.mjs","sourcesContent":["'use client'\n\nimport React, { useState, useEffect, useRef } from 'react'\nimport { merge } from '../../lib/utils'\n\nexport type TransitionType = \n | 'fade' \n | 'slide' \n | 'scale' \n | 'flip' \n | 'morph' \n | 'cube' \n | 'zoom' \n | 'slide-up' \n | 'slide-down' \n | 'slide-left' \n | 'slide-right'\n\nexport type TransitionEasing = \n | 'linear' \n | 'ease-in' \n | 'ease-out' \n | 'ease-in-out' \n | 'bounce' \n | 'elastic' \n | 'smooth'\n\nexport interface AdvancedPageTransitionProps {\n children: React.ReactNode\n className?: string\n type?: TransitionType\n duration?: number\n easing?: TransitionEasing\n delay?: number\n autoStart?: boolean\n onStart?: () => void\n onComplete?: () => void\n showProgress?: boolean\n progressClassName?: string\n}\n\nexport const AdvancedPageTransition = React.forwardRef<HTMLDivElement, AdvancedPageTransitionProps>(({\n children,\n className,\n type = 'fade',\n duration = 500,\n easing = 'smooth',\n delay = 0,\n autoStart = true,\n onStart,\n onComplete,\n showProgress = false,\n progressClassName\n}, ref) => {\n const [isVisible, setIsVisible] = useState(false)\n const [progress, setProgress] = useState(0)\n const [isTransitioning, setIsTransitioning] = useState(false)\n const animationRef = useRef<number | null>(null)\n const startTimeRef = useRef<number | null>(null)\n\n const getEasingFunction = (easingType: TransitionEasing) => {\n const easingFunctions = {\n linear: (t: number) => t,\n 'ease-in': (t: number) => t * t,\n 'ease-out': (t: number) => 1 - Math.pow(1 - t, 2),\n 'ease-in-out': (t: number) => t < 0.5 ? 2 * t * t : 1 - Math.pow(-2 * t + 2, 2) / 2,\n bounce: (t: number) => {\n if (t < 1 / 2.75) return 7.5625 * t * t\n if (t < 2 / 2.75) return 7.5625 * (t -= 1.5 / 2.75) * t + 0.75\n if (t < 2.5 / 2.75) return 7.5625 * (t -= 2.25 / 2.75) * t + 0.9375\n return 7.5625 * (t -= 2.625 / 2.75) * t + 0.984375\n },\n elastic: (t: number) => {\n return Math.pow(2, -10 * t) * Math.sin((t - 0.075) * (2 * Math.PI) / 0.3) + 1\n },\n smooth: (t: number) => {\n return t * t * (3 - 2 * t)\n }\n }\n return easingFunctions[easingType]\n }\n\n const animate = (timestamp: number) => {\n if (!startTimeRef.current) {\n startTimeRef.current = timestamp\n }\n\n const elapsed = timestamp - startTimeRef.current\n const easingFunction = getEasingFunction(easing)\n \n let currentProgress = Math.min(elapsed / duration, 1)\n currentProgress = easingFunction(currentProgress)\n\n setProgress(currentProgress)\n setIsVisible(currentProgress > 0.1)\n\n if (currentProgress < 1) {\n animationRef.current = requestAnimationFrame(animate)\n } else {\n setIsTransitioning(false)\n setProgress(1)\n onComplete?.()\n }\n }\n\n const startTransition = () => {\n setIsTransitioning(true)\n setProgress(0)\n onStart?.()\n \n startTimeRef.current = null\n animationRef.current = requestAnimationFrame(animate)\n }\n\n useEffect(() => {\n if (autoStart) {\n const timer = setTimeout(() => {\n startTransition()\n }, delay)\n \n return () => clearTimeout(timer)\n }\n }, [autoStart, delay])\n\n useEffect(() => {\n return () => {\n if (animationRef.current) {\n cancelAnimationFrame(animationRef.current)\n }\n }\n }, [])\n\n const getTransitionStyles = () => {\n switch (type) {\n case 'fade':\n return {\n opacity: isVisible ? 1 : 0,\n transform: 'none'\n }\n \n case 'slide':\n return {\n opacity: isVisible ? 1 : 0,\n transform: `translateX(${(1 - progress) * 100}%)`\n }\n \n case 'slide-up':\n return {\n opacity: isVisible ? 1 : 0,\n transform: `translateY(${(1 - progress) * 100}%)`\n }\n \n case 'slide-down':\n return {\n opacity: isVisible ? 1 : 0,\n transform: `translateY(-${(1 - progress) * 100}%)`\n }\n \n case 'slide-left':\n return {\n opacity: isVisible ? 1 : 0,\n transform: `translateX(-${(1 - progress) * 100}%)`\n }\n \n case 'slide-right':\n return {\n opacity: isVisible ? 1 : 0,\n transform: `translateX(${(1 - progress) * 100}%)`\n }\n \n case 'scale':\n return {\n opacity: isVisible ? 1 : 0,\n transform: `scale(${0.8 + progress * 0.2})`\n }\n \n case 'flip':\n return {\n opacity: isVisible ? 1 : 0,\n transform: `perspective(1000px) rotateY(${(1 - progress) * 90}deg)`\n }\n \n case 'morph':\n return {\n opacity: isVisible ? 1 : 0,\n transform: `scale(${0.9 + progress * 0.1}) rotate(${(1 - progress) * 5}deg)`\n }\n \n case 'cube':\n return {\n opacity: isVisible ? 1 : 0,\n transform: `perspective(1000px) rotateX(${(1 - progress) * 90}deg) rotateY(${(1 - progress) * 45}deg)`\n }\n \n case 'zoom':\n return {\n opacity: isVisible ? 1 : 0,\n transform: `scale(${0.5 + progress * 0.5})`\n }\n \n default:\n return {\n opacity: isVisible ? 1 : 0,\n transform: 'none'\n }\n }\n }\n\n const transitionStyles = getTransitionStyles()\n\n return (\n <div className=\"relative\">\n {showProgress && (\n <div className={merge(\n 'fixed top-4 right-4 z-50 bg-white dark:bg-gray-800 rounded-lg px-3 py-2 shadow-lg border',\n progressClassName\n )}>\n <div className=\"text-sm font-medium text-gray-700 dark:text-gray-300\">\n Progress: {Math.round(progress * 100)}%\n </div>\n <div className=\"w-24 h-2 bg-gray-200 dark:bg-gray-700 rounded-full mt-2\">\n <div \n className=\"h-full bg-blue-500 rounded-full transition-all duration-100\"\n style={{ width: `${progress * 100}%` }}\n />\n </div>\n </div>\n )}\n \n <div\n ref={ref}\n className={merge(\n 'transition-all duration-500 ease-out',\n className\n )}\n style={{\n ...transitionStyles,\n transitionDuration: `${duration}ms`,\n transitionTimingFunction: easing === 'smooth' \n ? 'cubic-bezier(0.4, 0, 0.2, 1)'\n : easing === 'bounce'\n ? 'cubic-bezier(0.68, -0.55, 0.265, 1.55)'\n : easing === 'elastic'\n ? 'cubic-bezier(0.175, 0.885, 0.32, 1.275)'\n : easing\n }}\n >\n {children}\n </div>\n </div>\n )\n})\n\nAdvancedPageTransition.displayName = 'AdvancedPageTransition'\n\n// 편의 컴포넌트들\nexport const FadePageTransition = React.forwardRef<HTMLDivElement, Omit<AdvancedPageTransitionProps, 'type'>>((props, ref) => (\n <AdvancedPageTransition ref={ref} type=\"fade\" {...props} />\n))\n\nexport const SlidePageTransition = React.forwardRef<HTMLDivElement, Omit<AdvancedPageTransitionProps, 'type'>>((props, ref) => (\n <AdvancedPageTransition ref={ref} type=\"slide\" {...props} />\n))\n\nexport const ScalePageTransition = React.forwardRef<HTMLDivElement, Omit<AdvancedPageTransitionProps, 'type'>>((props, ref) => (\n <AdvancedPageTransition ref={ref} type=\"scale\" {...props} />\n))\n\nexport const FlipPageTransition = React.forwardRef<HTMLDivElement, Omit<AdvancedPageTransitionProps, 'type'>>((props, ref) => (\n <AdvancedPageTransition ref={ref} type=\"flip\" {...props} />\n))\n\nexport const MorphPageTransition = React.forwardRef<HTMLDivElement, Omit<AdvancedPageTransitionProps, 'type'>>((props, ref) => (\n <AdvancedPageTransition ref={ref} type=\"morph\" {...props} />\n))\n\nexport const CubePageTransition = React.forwardRef<HTMLDivElement, Omit<AdvancedPageTransitionProps, 'type'>>((props, ref) => (\n <AdvancedPageTransition ref={ref} type=\"cube\" {...props} />\n))\n\nexport const ZoomPageTransition = React.forwardRef<HTMLDivElement, Omit<AdvancedPageTransitionProps, 'type'>>((props, ref) => (\n <AdvancedPageTransition ref={ref} type=\"zoom\" {...props} />\n))\n\n// displayName 설정\nFadePageTransition.displayName = 'FadePageTransition'\nSlidePageTransition.displayName = 'SlidePageTransition'\nScalePageTransition.displayName = 'ScalePageTransition'\nFlipPageTransition.displayName = 'FlipPageTransition'\nMorphPageTransition.displayName = 'MorphPageTransition'\nCubePageTransition.displayName = 'CubePageTransition'\nZoomPageTransition.displayName = 'ZoomPageTransition'\n","'use client'\n\nimport { useState, useEffect, useCallback, useRef } from 'react'\n\nexport type TransitionType = \n | 'fade' \n | 'slide' \n | 'scale' \n | 'flip' \n | 'morph' \n | 'cube' \n | 'zoom' \n | 'slide-up' \n | 'slide-down' \n | 'slide-left' \n | 'slide-right'\n\nexport type TransitionEasing = \n | 'linear' \n | 'ease-in' \n | 'ease-out' \n | 'ease-in-out' \n | 'bounce' \n | 'elastic' \n | 'smooth'\n\nexport interface TransitionConfig {\n type: TransitionType\n duration: number\n easing: TransitionEasing\n delay?: number\n stagger?: number\n direction?: 'forward' | 'backward'\n onStart?: () => void\n onComplete?: () => void\n onReverse?: () => void\n}\n\nexport interface PageTransitionState {\n isTransitioning: boolean\n isVisible: boolean\n currentStep: number\n progress: number\n}\n\nexport interface PageTransitionControls {\n start: (config?: Partial<TransitionConfig>) => Promise<void>\n reverse: () => Promise<void>\n pause: () => void\n resume: () => void\n reset: () => void\n}\n\nexport const usePageTransition = (\n initialConfig: Partial<TransitionConfig> = {}\n): [PageTransitionState, PageTransitionControls] => {\n const [state, setState] = useState<PageTransitionState>({\n isTransitioning: false,\n isVisible: false,\n currentStep: 0,\n progress: 0\n })\n\n const animationRef = useRef<number | null>(null)\n const startTimeRef = useRef<number | null>(null)\n const configRef = useRef<TransitionConfig>({\n type: 'fade',\n duration: 500,\n easing: 'smooth',\n delay: 0,\n stagger: 0,\n direction: 'forward',\n ...initialConfig\n })\n\n const getEasingFunction = useCallback((easing: TransitionEasing) => {\n const easingFunctions = {\n linear: (t: number) => t,\n 'ease-in': (t: number) => t * t,\n 'ease-out': (t: number) => 1 - Math.pow(1 - t, 2),\n 'ease-in-out': (t: number) => t < 0.5 ? 2 * t * t : 1 - Math.pow(-2 * t + 2, 2) / 2,\n bounce: (t: number) => {\n if (t < 1 / 2.75) return 7.5625 * t * t\n if (t < 2 / 2.75) return 7.5625 * (t -= 1.5 / 2.75) * t + 0.75\n if (t < 2.5 / 2.75) return 7.5625 * (t -= 2.25 / 2.75) * t + 0.9375\n return 7.5625 * (t -= 2.625 / 2.75) * t + 0.984375\n },\n elastic: (t: number) => {\n return Math.pow(2, -10 * t) * Math.sin((t - 0.075) * (2 * Math.PI) / 0.3) + 1\n },\n smooth: (t: number) => {\n return t * t * (3 - 2 * t)\n }\n }\n return easingFunctions[easing]\n }, [])\n\n const animate = useCallback((timestamp: number) => {\n if (!startTimeRef.current) {\n startTimeRef.current = timestamp\n }\n\n const elapsed = timestamp - startTimeRef.current\n const config = configRef.current\n const easing = getEasingFunction(config.easing)\n \n let progress = Math.min(elapsed / config.duration, 1)\n progress = easing(progress)\n\n setState(prev => ({\n ...prev,\n progress,\n isVisible: config.direction === 'forward' ? progress > 0.1 : progress < 0.9,\n currentStep: Math.floor(progress * 10)\n }))\n\n if (progress < 1) {\n animationRef.current = requestAnimationFrame(animate)\n } else {\n setState(prev => ({\n ...prev,\n isTransitioning: false,\n progress: config.direction === 'forward' ? 1 : 0\n }))\n config.onComplete?.()\n }\n }, [getEasingFunction])\n\n const start = useCallback(async (config?: Partial<TransitionConfig>) => {\n return new Promise<void>((resolve) => {\n if (config) {\n configRef.current = { ...configRef.current, ...config }\n }\n\n const finalConfig = configRef.current\n finalConfig.onComplete = () => resolve()\n\n setState(prev => ({\n ...prev,\n isTransitioning: true,\n progress: finalConfig.direction === 'forward' ? 0 : 1\n }))\n\n startTimeRef.current = null\n finalConfig.onStart?.()\n \n if (finalConfig.delay) {\n setTimeout(() => {\n animationRef.current = requestAnimationFrame(animate)\n }, finalConfig.delay)\n } else {\n animationRef.current = requestAnimationFrame(animate)\n }\n })\n }, [animate])\n\n const reverse = useCallback(async () => {\n return new Promise<void>((resolve) => {\n const config = configRef.current\n config.direction = 'backward'\n config.onComplete = () => resolve()\n \n start()\n })\n }, [start])\n\n const pause = useCallback(() => {\n if (animationRef.current) {\n cancelAnimationFrame(animationRef.current)\n }\n }, [])\n\n const resume = useCallback(() => {\n if (state.isTransitioning) {\n animationRef.current = requestAnimationFrame(animate)\n }\n }, [state.isTransitioning, animate])\n\n const reset = useCallback(() => {\n if (animationRef.current) {\n cancelAnimationFrame(animationRef.current)\n }\n setState({\n isTransitioning: false,\n isVisible: false,\n currentStep: 0,\n progress: 0\n })\n }, [])\n\n useEffect(() => {\n return () => {\n if (animationRef.current) {\n cancelAnimationFrame(animationRef.current)\n }\n }\n }, [])\n\n return [state, { start, reverse, pause, resume, reset }]\n}\n\n// 특정 전환 타입을 위한 편의 훅들\nexport const useFadeTransition = (config?: Partial<TransitionConfig>) => {\n return usePageTransition({ type: 'fade', duration: 400, ...config })\n}\n\nexport const useSlideTransition = (config?: Partial<TransitionConfig>) => {\n return usePageTransition({ type: 'slide', duration: 600, ...config })\n}\n\nexport const useScaleTransition = (config?: Partial<TransitionConfig>) => {\n return usePageTransition({ type: 'scale', duration: 500, ...config })\n}\n\nexport const useMorphTransition = (config?: Partial<TransitionConfig>) => {\n return usePageTransition({ type: 'morph', duration: 800, ...config })\n}\n\nexport const useCubeTransition = (config?: Partial<TransitionConfig>) => {\n return usePageTransition({ type: 'cube', duration: 1000, ...config })\n}\n","'use client'\n\nimport { useState, useCallback, useRef, useEffect } from 'react'\nimport { TransitionType, TransitionEasing, TransitionConfig } from './usePageTransition'\n\nexport interface PageTransitionManagerConfig {\n defaultType?: TransitionType\n defaultDuration?: number\n defaultEasing?: TransitionEasing\n enableHistory?: boolean\n enableProgress?: boolean\n enableDebug?: boolean\n}\n\nexport interface PageTransitionEvent {\n id: string\n type: TransitionType\n duration: number\n easing: TransitionEasing\n timestamp: number\n status: 'pending' | 'active' | 'completed' | 'failed'\n}\n\nexport interface PageTransitionManagerState {\n isTransitioning: boolean\n currentTransition: PageTransitionEvent | null\n transitionHistory: PageTransitionEvent[]\n totalTransitions: number\n averageDuration: number\n}\n\nexport interface PageTransitionManagerControls {\n startTransition: (config: Partial<TransitionConfig>) => Promise<string>\n cancelTransition: (id: string) => void\n pauseAll: () => void\n resumeAll: () => void\n clearHistory: () => void\n getTransitionStats: () => {\n total: number\n average: number\n byType: Record<TransitionType, number>\n byStatus: Record<string, number>\n }\n}\n\nexport const usePageTransitionManager = (\n config: PageTransitionManagerConfig = {}\n): [PageTransitionManagerState, PageTransitionManagerControls] => {\n const {\n defaultType = 'fade',\n defaultDuration = 500,\n defaultEasing = 'smooth',\n enableHistory = true,\n enableProgress = true,\n enableDebug = false\n } = config\n\n const [state, setState] = useState<PageTransitionManagerState>({\n isTransitioning: false,\n currentTransition: null,\n transitionHistory: [],\n totalTransitions: 0,\n averageDuration: 0\n })\n\n const activeTransitionsRef = useRef<Map<string, { timer: NodeJS.Timeout; config: TransitionConfig }>>(new Map())\n const transitionCounterRef = useRef(0)\n\n const logDebug = useCallback((message: string, data?: unknown) => {\n if (enableDebug) {\n console.log(`[PageTransitionManager] ${message}`, data)\n }\n }, [enableDebug])\n\n const updateStats = useCallback((newTransition: PageTransitionEvent) => {\n setState(prev => {\n const newHistory = enableHistory ? [...prev.transitionHistory, newTransition] : prev.transitionHistory\n const total = newHistory.length\n const average = newHistory.reduce((sum, t) => sum + t.duration, 0) / total\n\n return {\n ...prev,\n totalTransitions: total,\n averageDuration: average,\n transitionHistory: newHistory\n }\n })\n }, [enableHistory])\n\n const startTransition = useCallback(async (config: Partial<TransitionConfig>): Promise<string> => {\n const transitionId = `transition_${++transitionCounterRef.current}`\n const fullConfig: TransitionConfig = {\n type: defaultType,\n duration: defaultDuration,\n easing: defaultEasing,\n ...config\n }\n\n const transitionEvent: PageTransitionEvent = {\n id: transitionId,\n type: fullConfig.type,\n duration: fullConfig.duration,\n easing: fullConfig.easing,\n timestamp: Date.now(),\n status: 'pending'\n }\n\n logDebug('Starting transition', { id: transitionId, config: fullConfig })\n\n setState(prev => ({\n ...prev,\n isTransitioning: true,\n currentTransition: transitionEvent\n }))\n\n // 실제 전환 로직을 시뮬레이션 (실제로는 usePageTransition과 연동)\n const timer = setTimeout(() => {\n const completedEvent: PageTransitionEvent = {\n ...transitionEvent,\n status: 'completed'\n }\n\n setState(prev => ({\n ...prev,\n isTransitioning: false,\n currentTransition: null\n }))\n\n updateStats(completedEvent)\n activeTransitionsRef.current.delete(transitionId)\n logDebug('Transition completed', { id: transitionId })\n\n fullConfig.onComplete?.()\n }, fullConfig.duration)\n\n activeTransitionsRef.current.set(transitionId, { timer, config: fullConfig })\n\n // 진행 상태 업데이트\n setTimeout(() => {\n setState(prev => ({\n ...prev,\n currentTransition: {\n ...prev.currentTransition!,\n status: 'active'\n }\n }))\n }, 50)\n\n return transitionId\n }, [defaultType, defaultDuration, defaultEasing, logDebug, updateStats])\n\n const cancelTransition = useCallback((id: string) => {\n const transition = activeTransitionsRef.current.get(id)\n if (transition) {\n clearTimeout(transition.timer)\n activeTransitionsRef.current.delete(id)\n\n setState(prev => ({\n ...prev,\n isTransitioning: activeTransitionsRef.current.size > 0,\n currentTransition: prev.currentTransition?.id === id ? null : prev.currentTransition\n }))\n\n logDebug('Transition cancelled', { id })\n }\n }, [logDebug])\n\n const pauseAll = useCallback(() => {\n activeTransitionsRef.current.forEach(({ timer }, id) => {\n clearTimeout(timer)\n logDebug('Transition paused', { id })\n })\n }, [logDebug])\n\n const resumeAll = useCallback(() => {\n activeTransitionsRef.current.forEach(({ config }, id) => {\n startTransition(config)\n })\n }, [startTransition])\n\n const clearHistory = useCallback(() => {\n setState(prev => ({\n ...prev,\n transitionHistory: [],\n totalTransitions: 0,\n averageDuration: 0\n }))\n logDebug('History cleared')\n }, [logDebug])\n\n const getTransitionStats = useCallback(() => {\n const { transitionHistory } = state\n const byType = transitionHistory.reduce((acc, t) => {\n acc[t.type] = (acc[t.type] || 0) + 1\n return acc\n }, {} as Record<TransitionType, number>)\n\n const byStatus = transitionHistory.reduce((acc, t) => {\n acc[t.status] = (acc[t.status] || 0) + 1\n return acc\n }, {} as Record<string, number>)\n\n return {\n total: transitionHistory.length,\n average: state.averageDuration,\n byType,\n byStatus\n }\n }, [state])\n\n useEffect(() => {\n return () => {\n // 컴포넌트 언마운트 시 모든 타이머 정리\n activeTransitionsRef.current.forEach(({ timer }) => {\n clearTimeout(timer)\n })\n activeTransitionsRef.current.clear()\n }\n }, [])\n\n return [state, {\n startTransition,\n cancelTransition,\n pauseAll,\n resumeAll,\n clearHistory,\n getTransitionStats\n }]\n}\n\n// 특정 전환 타입을 위한 편의 훅들\nexport const useFadeTransitionManager = (config?: PageTransitionManagerConfig) => {\n return usePageTransitionManager({ ...config, defaultType: 'fade' })\n}\n\nexport const useSlideTransitionManager = (config?: PageTransitionManagerConfig) => {\n return usePageTransitionManager({ ...config, defaultType: 'slide' })\n}\n\nexport const useScaleTransitionManager = (config?: PageTransitionManagerConfig) => {\n return usePageTransitionManager({ ...config, defaultType: 'scale' })\n}\n\nexport const useMorphTransitionManager = (config?: PageTransitionManagerConfig) => {\n return usePageTransitionManager({ ...config, defaultType: 'morph' })\n}\n\nexport const useCubeTransitionManager = (config?: PageTransitionManagerConfig) => {\n return usePageTransitionManager({ ...config, defaultType: 'cube' })\n}\n"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import {a}from'./chunk-UUHAXGMO.mjs';import h,{createContext,useContext,useState,useCallback}from'react';import {jsxs,jsx}from'react/jsx-runtime';var b=createContext(void 0);function P(){let e=useContext(b);if(!e)throw new Error("useToast must be used within a ToastProvider");return e}function I({children:e,maxToasts:n=5,position:a="top-right"}){let[r,s]=useState([]),i=useCallback(o=>{s(u=>u.filter(g=>g.id!==o));},[]),c=useCallback(o=>{let u=Math.random().toString(36).substr(2,9),g={...o,id:u};s(f=>[...f,g].slice(-n)),o.duration!==0&&setTimeout(()=>{i(u);},o.duration||5e3);},[n,i]),m=useCallback(()=>{s([]);},[]);return jsxs(b.Provider,{value:{toasts:r,addToast:c,removeToast:i,clearToasts:m},children:[e,jsx(v,{toasts:r,removeToast:i,position:a})]})}function v({toasts:e,removeToast:n,position:a$1}){let r={"top-right":"top-4 right-4","top-left":"top-4 left-4","bottom-right":"bottom-4 right-4","bottom-left":"bottom-4 left-4","top-center":"top-4 left-1/2 transform -translate-x-1/2","bottom-center":"bottom-4 left-1/2 transform -translate-x-1/2"};return e.length===0?null:jsx("div",{className:a("fixed z-50 space-y-3 max-w-sm",r[a$1]),children:e.map(s=>jsx(w,{toast:s,onRemove:n},s.id))})}function w({toast:e,onRemove:n}){let[a$1,r]=useState(false);h.useEffect(()=>{r(true);},[]);let s=()=>{r(false),setTimeout(()=>n(e.id),300);},i=o=>{switch(o){case "success":return "bg-green-50 dark:bg-green-900/20 border-green-200 dark:border-green-800 text-green-800 dark:text-green-200";case "error":return "bg-red-50 dark:bg-red-900/20 border-red-200 dark:border-red-800 text-red-800 dark:text-red-200";case "warning":return "bg-yellow-50 dark:bg-yellow-900/20 border-yellow-200 dark:border-yellow-800 text-yellow-800 dark:text-yellow-200";case "info":return "bg-blue-50 dark:bg-blue-900/20 border-blue-200 dark:border-blue-800 text-blue-800 dark:text-blue-200"}},c=o=>{switch(o){case "success":return "text-green-500 dark:text-green-400";case "error":return "text-red-500 dark:text-red-400";case "warning":return "text-yellow-500 dark:text-yellow-400";case "info":return "text-blue-500 dark:text-blue-400"}},m=o=>{switch(o){case "success":return jsx("svg",{className:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M5 13l4 4L19 7"})});case "error":return jsx("svg",{className:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M6 18L18 6M6 6l12 12"})});case "warning":return jsx("svg",{className:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.964-.833-2.732 0L3.732 16.5c-.77.833.192 2.5 1.732 2.5z"})});case "info":return jsx("svg",{className:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"})})}};return jsxs("div",{className:a("flex items-start p-4 rounded-xl border shadow-lg backdrop-blur-sm transition-all duration-300 transform",i(e.type),a$1?"translate-x-0 opacity-100 scale-100":"translate-x-full opacity-0 scale-95"),style:{animation:a$1?"slideInRight 0.3s cubic-bezier(0.16, 1, 0.3, 1)":void 0},children:[jsxs("div",{className:a("flex-shrink-0 mr-3",c(e.type)),children:[" ",m(e.type)]}),jsxs("div",{className:"flex-1 min-w-0",children:[e.title&&jsxs("h4",{className:"text-sm font-semibold mb-1",children:[" ",e.title]}),jsx("p",{className:"text-sm leading-relaxed",children:e.message}),e.action&&jsx("button",{onClick:e.action.onClick,className:"mt-3 text-sm font-medium underline hover:no-underline transition-all duration-200",children:e.action.label})]}),jsxs("div",{className:"flex-shrink-0 ml-4",children:[" ",jsx("button",{onClick:s,className:a("inline-flex rounded-md p-1.5 focus:outline-none focus:ring-2 focus:ring-offset-2 transition-all duration-200 hover:bg-black/5 dark:hover:bg-white/5",c(e.type)),"aria-label":"\uB2EB\uAE30",children:jsx("svg",{className:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M6 18L18 6M6 6l12 12"})})})]})]})}export{P as a,I as b};//# sourceMappingURL=chunk-QXBMXCML.mjs.map
|
|
2
|
+
//# sourceMappingURL=chunk-QXBMXCML.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/Toast.tsx"],"names":["ToastContext","createContext","useToast","context","useContext","ToastProvider","children","maxToasts","position","toasts","setToasts","useState","removeToast","useCallback","id","prev","toast","addToast","newToast","clearToasts","jsxs","jsx","ToastContainer","positionClasses","merge","ToastItem","onRemove","isVisible","setIsVisible","React","handleRemove","getToastStyles","type","getIconStyles","getToastIcon"],"mappings":"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","file":"chunk-QXBMXCML.mjs","sourcesContent":["\"use client\"\n\nimport React from \"react\"\nimport { createContext, useContext, useState, useCallback } from \"react\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * Toast 메시지 타입 / Toast message type\n * @typedef {Object} Toast\n * @property {string} id - Toast 고유 ID / Toast unique ID\n * @property {\"success\" | \"error\" | \"warning\" | \"info\"} type - Toast 타입 / Toast type\n * @property {string} [title] - Toast 제목 / Toast title\n * @property {string} message - Toast 메시지 / Toast message\n * @property {number} [duration] - 표시 시간(ms), 0이면 자동 제거 안 함 / Display duration (ms), 0 means no auto-remove\n * @property {Object} [action] - 액션 버튼 / Action button\n * @property {string} action.label - 액션 버튼 레이블 / Action button label\n * @property {() => void} action.onClick - 액션 버튼 클릭 핸들러 / Action button click handler\n */\nexport interface Toast {\n id: string\n type: \"success\" | \"error\" | \"warning\" | \"info\"\n title?: string\n message: string\n duration?: number\n action?: {\n label: string\n onClick: () => void\n }\n}\n\n// Toast Context 타입\ninterface ToastContextType {\n toasts: Toast[]\n addToast: (toast: Omit<Toast, \"id\">) => void\n removeToast: (id: string) => void\n clearToasts: () => void\n}\n\n// Toast Context 생성\nconst ToastContext = createContext<ToastContextType | undefined>(undefined)\n\n/**\n * useToast Hook\n * \n * Toast를 추가, 제거, 초기화하는 훅입니다.\n * ToastProvider 내부에서만 사용 가능합니다.\n * \n * Hook for adding, removing, and clearing toasts.\n * Can only be used within ToastProvider.\n * \n * @example\n * const { addToast, removeToast, clearToasts } = useToast()\n * \n * addToast({\n * type: \"success\",\n * message: \"저장되었습니다\",\n * duration: 3000\n * })\n * \n * @returns {ToastContextType} Toast 컨텍스트 값 / Toast context value\n * @throws {Error} ToastProvider 외부에서 사용 시 에러 발생 / Error when used outside ToastProvider\n */\nexport function useToast(): ToastContextType {\n const context = useContext(ToastContext)\n if (!context) {\n throw new Error(\"useToast must be used within a ToastProvider\")\n }\n return context\n}\n\n/**\n * ToastProvider 컴포넌트의 props / ToastProvider component props\n * @typedef {Object} ToastProviderProps\n * @property {React.ReactNode} children - 자식 컴포넌트 / Child components\n * @property {number} [maxToasts=5] - 최대 Toast 개수 / Maximum number of toasts\n * @property {\"top-right\" | \"top-left\" | \"bottom-right\" | \"bottom-left\" | \"top-center\" | \"bottom-center\"} [position=\"top-right\"] - Toast 표시 위치 / Toast display position\n */\ninterface ToastProviderProps {\n children: React.ReactNode\n maxToasts?: number\n position?: \"top-right\" | \"top-left\" | \"bottom-right\" | \"bottom-left\" | \"top-center\" | \"bottom-center\"\n}\n\n/**\n * ToastProvider 컴포넌트 / ToastProvider component\n * \n * Toast 시스템의 컨텍스트를 제공하는 Provider 컴포넌트입니다.\n * 앱의 루트 레벨에서 사용하여 전역 Toast 기능을 활성화합니다.\n * \n * Provider component that provides context for the Toast system.\n * Use at the root level of your app to enable global Toast functionality.\n * \n * @component\n * @example\n * // App.tsx\n * <ToastProvider position=\"top-center\" maxToasts={3}>\n * <App />\n * </ToastProvider>\n * \n * @example\n * // 컴포넌트에서 사용 / Usage in component\n * const { addToast } = useToast()\n * \n * const handleSave = () => {\n * addToast({\n * type: \"success\",\n * message: \"저장되었습니다\",\n * title: \"성공\"\n * })\n * }\n * \n * @param {ToastProviderProps} props - ToastProvider 컴포넌트의 props / ToastProvider component props\n * @returns {JSX.Element} ToastProvider 컴포넌트 / ToastProvider component\n * \n * @todo 접근성 개선: ToastItem에 role=\"alert\" 또는 role=\"status\" 추가 필요 / Accessibility: Add role=\"alert\" or role=\"status\" to ToastItem\n * @todo 접근성 개선: aria-live=\"polite\" 또는 aria-live=\"assertive\" 추가 필요 / Accessibility: Add aria-live=\"polite\" or aria-live=\"assertive\"\n */\nexport function ToastProvider({ \n children, \n maxToasts = 5,\n position = \"top-right\" \n}: ToastProviderProps) {\n const [toasts, setToasts] = useState<Toast[]>([])\n\n const removeToast = useCallback((id: string) => {\n setToasts(prev => prev.filter(toast => toast.id !== id))\n }, [])\n\n const addToast = useCallback((toast: Omit<Toast, \"id\">) => {\n const id = Math.random().toString(36).substr(2, 9)\n const newToast: Toast = { ...toast, id }\n \n setToasts(prev => {\n const updatedToasts = [...prev, newToast]\n return updatedToasts.slice(-maxToasts) // 최대 개수 제한\n })\n \n // 자동 제거\n if (toast.duration !== 0) {\n setTimeout(() => {\n removeToast(id)\n }, toast.duration || 5000)\n }\n }, [maxToasts, removeToast])\n\n const clearToasts = useCallback(() => {\n setToasts([])\n }, [])\n\n return (\n <ToastContext.Provider value={{ toasts, addToast, removeToast, clearToasts }}>\n {children}\n <ToastContainer toasts={toasts} removeToast={removeToast} position={position} />\n </ToastContext.Provider>\n )\n}\n\n// Toast Container Props\ninterface ToastContainerProps {\n toasts: Toast[]\n removeToast: (id: string) => void\n position: string\n}\n\n// Toast Container\nfunction ToastContainer({ toasts, removeToast, position }: ToastContainerProps) {\n const positionClasses = {\n \"top-right\": \"top-4 right-4\",\n \"top-left\": \"top-4 left-4\",\n \"bottom-right\": \"bottom-4 right-4\",\n \"bottom-left\": \"bottom-4 left-4\",\n \"top-center\": \"top-4 left-1/2 transform -translate-x-1/2\",\n \"bottom-center\": \"bottom-4 left-1/2 transform -translate-x-1/2\"\n }\n\n if (toasts.length === 0) return null\n\n return (\n <div className={merge(\n \"fixed z-50 space-y-3 max-w-sm\", // 12px 간격\n positionClasses[position as keyof typeof positionClasses]\n )}>\n {toasts.map((toast) => (\n <ToastItem key={toast.id} toast={toast} onRemove={removeToast} />\n ))}\n </div>\n )\n}\n\n// Toast Item Props\ninterface ToastItemProps {\n toast: Toast\n onRemove: (id: string) => void\n}\n\n// Toast Item\nfunction ToastItem({ toast, onRemove }: ToastItemProps) {\n const [isVisible, setIsVisible] = useState(false)\n\n React.useEffect(() => {\n setIsVisible(true)\n }, [])\n\n const handleRemove = () => {\n setIsVisible(false)\n setTimeout(() => onRemove(toast.id), 300)\n }\n\n const getToastStyles = (type: Toast[\"type\"]) => {\n switch (type) {\n case \"success\":\n return \"bg-green-50 dark:bg-green-900/20 border-green-200 dark:border-green-800 text-green-800 dark:text-green-200\"\n case \"error\":\n return \"bg-red-50 dark:bg-red-900/20 border-red-200 dark:border-red-800 text-red-800 dark:text-red-200\"\n case \"warning\":\n return \"bg-yellow-50 dark:bg-yellow-900/20 border-yellow-200 dark:border-yellow-800 text-yellow-800 dark:text-yellow-200\"\n case \"info\":\n return \"bg-blue-50 dark:bg-blue-900/20 border-blue-200 dark:border-blue-800 text-blue-800 dark:text-blue-200\"\n }\n }\n\n const getIconStyles = (type: Toast[\"type\"]) => {\n switch (type) {\n case \"success\":\n return \"text-green-500 dark:text-green-400\"\n case \"error\":\n return \"text-red-500 dark:text-red-400\"\n case \"warning\":\n return \"text-yellow-500 dark:text-yellow-400\"\n case \"info\":\n return \"text-blue-500 dark:text-blue-400\"\n }\n }\n\n const getToastIcon = (type: Toast[\"type\"]) => {\n switch (type) {\n case \"success\":\n return (\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 13l4 4L19 7\" />\n </svg>\n )\n case \"error\":\n return (\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n )\n case \"warning\":\n return (\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.964-.833-2.732 0L3.732 16.5c-.77.833.192 2.5 1.732 2.5z\" />\n </svg>\n )\n case \"info\":\n return (\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n )\n }\n }\n\n return (\n <div\n className={merge(\n \"flex items-start p-4 rounded-xl border shadow-lg backdrop-blur-sm transition-all duration-300 transform\",\n getToastStyles(toast.type),\n isVisible \n ? \"translate-x-0 opacity-100 scale-100\" \n : \"translate-x-full opacity-0 scale-95\"\n )}\n style={{\n animation: isVisible ? \"slideInRight 0.3s cubic-bezier(0.16, 1, 0.3, 1)\" : undefined\n }}\n >\n {/* 아이콘 */}\n <div className={merge(\"flex-shrink-0 mr-3\", getIconStyles(toast.type))}> {/* 12px 여백 */}\n {getToastIcon(toast.type)}\n </div>\n\n {/* 내용 */}\n <div className=\"flex-1 min-w-0\">\n {toast.title && (\n <h4 className=\"text-sm font-semibold mb-1\"> {/* 4px 여백 */}\n {toast.title}\n </h4>\n )}\n <p className=\"text-sm leading-relaxed\">\n {toast.message}\n </p>\n \n {/* 액션 버튼 */}\n {toast.action && (\n <button\n onClick={toast.action.onClick}\n className=\"mt-3 text-sm font-medium underline hover:no-underline transition-all duration-200\" // 12px 여백\n >\n {toast.action.label}\n </button>\n )}\n </div>\n\n {/* 닫기 버튼 */}\n <div className=\"flex-shrink-0 ml-4\"> {/* 16px 여백 */}\n <button\n onClick={handleRemove}\n className={merge(\n \"inline-flex rounded-md p-1.5 focus:outline-none focus:ring-2 focus:ring-offset-2 transition-all duration-200 hover:bg-black/5 dark:hover:bg-white/5\",\n getIconStyles(toast.type)\n )}\n aria-label=\"닫기\"\n >\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </div>\n </div>\n )\n}\n\n// 편의 함수들\nexport const showToast = (toast: Omit<Toast, \"id\">) => {\n // 이 함수는 ToastProvider 내부에서만 사용 가능\n console.warn(\"showToast is deprecated. Use useToast hook instead.\")\n}\n\nexport const showSuccessToast = (message: string, title?: string, duration?: number) => {\n console.warn(\"showSuccessToast is deprecated. Use useToast hook instead.\")\n}\n\nexport const showErrorToast = (message: string, title?: string, duration?: number) => {\n console.warn(\"showErrorToast is deprecated. Use useToast hook instead.\")\n}\n\nexport const showWarningToast = (message: string, title?: string, duration?: number) => {\n console.warn(\"showWarningToast is deprecated. Use useToast hook instead.\")\n}\n\nexport const showInfoToast = (message: string, title?: string, duration?: number) => {\n console.warn(\"showInfoToast is deprecated. Use useToast hook instead.\")\n} "]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import {l}from'./chunk-DMYT7RZ4.mjs';import {a}from'./chunk-UUHAXGMO.mjs';import u from'react';import {jsx,jsxs}from'react/jsx-runtime';var j=u.forwardRef(({className:e,variant:t="default",size:r="md",...l},o)=>{let d=()=>{switch(t){case "bordered":return "border border-slate-200 dark:border-slate-700 divide-x divide-slate-200 dark:divide-slate-700";case "striped":return "divide-y divide-slate-200 dark:divide-slate-700";default:return ""}},p=()=>{switch(r){case "sm":return "text-sm";case "lg":return "text-base";default:return "text-sm"}};return jsx("div",{className:"w-full overflow-auto",children:jsx("table",{ref:o,className:a("w-full caption-bottom",d(),p(),e),...l})})});j.displayName="Table";var ee=u.forwardRef(({className:e,...t},r)=>jsx("thead",{ref:r,className:a("[&_tr]:border-b",e),...t}));ee.displayName="TableHeader";var te=u.forwardRef(({className:e,...t},r)=>jsx("tbody",{ref:r,className:a("[&_tr:last-child]:border-0",e),...t}));te.displayName="TableBody";var re=u.forwardRef(({className:e,...t},r)=>jsx("tfoot",{ref:r,className:a("border-t bg-slate-50 dark:bg-slate-800/50 font-medium [&>tr]:last:border-b-0",e),...t}));re.displayName="TableFooter";var ae=u.forwardRef(({className:e,variant:t="default",...r},l)=>jsx("tr",{ref:l,className:a("border-b transition-colors data-[state=selected]:bg-slate-50 dark:data-[state=selected]:bg-slate-800/50",t==="hover"?"hover:bg-slate-50 dark:hover:bg-slate-800/50":"",e),...r}));ae.displayName="TableRow";var se=u.forwardRef(({className:e,...t},r)=>jsx("th",{ref:r,className:a("h-12 px-4 text-left align-middle font-medium text-slate-500 dark:text-slate-400 [&:has([role=checkbox])]:pr-0",e),...t}));se.displayName="TableHead";var oe=u.forwardRef(({className:e,...t},r)=>jsx("td",{ref:r,className:a("p-4 align-middle [&:has([role=checkbox])]:pr-0",e),...t}));oe.displayName="TableCell";var le=u.forwardRef(({className:e,...t},r)=>jsx("caption",{ref:r,className:a("mt-4 text-sm text-slate-500 dark:text-slate-400",e),...t}));le.displayName="TableCaption";var ne=u.memo(u.forwardRef(({className:e,variant:t="default",...r},l)=>{let o=u.useMemo(()=>({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",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",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",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",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",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"}),[]);return jsx("div",{ref:l,className:a("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",o[t],e),...r})}));ne.displayName="Badge";var _=u.forwardRef(({className:e,variant:t="text",width:r,height:l,animation:o="pulse",...d},p)=>{let b=()=>{switch(t){case "circular":return "rounded-full";case "rounded":return "rounded-lg";case "rectangular":return "rounded-none";default:return "rounded"}},S=()=>{switch(o){case "wave":return "animate-pulse bg-gradient-to-r from-gray-200 via-gray-300 to-gray-200 bg-[length:200%_100%] animate-shimmer";case "shimmer":return "bg-gradient-to-r from-gray-200 via-gray-300 to-gray-200 bg-[length:200%_100%] animate-shimmer";default:return "animate-pulse bg-gray-200 dark:bg-gray-700"}},N=(()=>{switch(t){case "circular":return {width:"40px",height:"40px"};case "text":return {width:"100%",height:"1em"};case "rounded":return {width:"100%",height:"200px"};case "rectangular":return {width:"100%",height:"200px"};default:return {width:"100%",height:"1em"}}})(),y=r||N.width,k=l||N.height;return jsx("div",{ref:p,className:a("block",b(),S(),e),style:{width:typeof y=="number"?`${y}px`:y,height:typeof k=="number"?`${k}px`:k},...d})});_.displayName="Skeleton";var i=u.forwardRef(({className:e,...t},r)=>jsx(_,{ref:r,variant:"text",className:e,...t}));i.displayName="SkeletonText";var $=u.forwardRef(({className:e,...t},r)=>jsx(_,{ref:r,variant:"circular",className:e,...t}));$.displayName="SkeletonCircle";var de=u.forwardRef(({className:e,...t},r)=>jsx(_,{ref:r,variant:"rectangular",className:e,...t}));de.displayName="SkeletonRectangle";var G=u.forwardRef(({className:e,...t},r)=>jsx(_,{ref:r,variant:"rounded",className:e,...t}));G.displayName="SkeletonRounded";var ce=u.forwardRef(({className:e,...t},r)=>jsxs("div",{ref:r,className:a("space-y-4 p-6",e),...t,children:[jsxs("div",{className:"flex items-center space-x-4",children:[" ",jsx($,{className:"w-12 h-12"})," ",jsxs("div",{className:"space-y-2 flex-1",children:[" ",jsx(i,{className:"h-4 w-3/4"})," ",jsx(i,{className:"h-3 w-1/2"})," "]})]}),jsx(G,{className:"w-full h-32"})," ",jsxs("div",{className:"space-y-2",children:[" ",jsx(i,{className:"h-4 w-full"}),jsx(i,{className:"h-4 w-5/6"}),jsx(i,{className:"h-4 w-4/6"})]})]}));ce.displayName="SkeletonCard";var me=u.forwardRef(({className:e,...t},r)=>jsxs("div",{ref:r,className:a("flex items-center space-x-4",e),...t,children:[jsx($,{className:"w-12 h-12"})," ",jsxs("div",{className:"space-y-2 flex-1",children:[" ",jsx(i,{className:"h-4 w-3/4"}),jsx(i,{className:"h-3 w-1/2"})]})]}));me.displayName="SkeletonAvatar";var fe=u.forwardRef(({className:e,...t},r)=>jsxs("div",{ref:r,className:a("space-y-2",e),...t,children:[jsx(G,{className:"w-full h-48"})," ",jsx(i,{className:"h-4 w-1/2"})]}));fe.displayName="SkeletonImage";var ue=u.forwardRef(({className:e,...t},r)=>jsxs("div",{ref:r,className:a("space-y-4",e),...t,children:[jsxs("div",{className:"flex items-center space-x-4",children:[" ",jsx($,{className:"w-16 h-16"})," ",jsxs("div",{className:"space-y-2 flex-1",children:[" ",jsx(i,{className:"h-5 w-1/2"}),jsx(i,{className:"h-3 w-1/3"})]})]}),jsxs("div",{className:"space-y-2",children:[" ",jsx(i,{className:"h-4 w-full"}),jsx(i,{className:"h-4 w-5/6"})]})]}));ue.displayName="SkeletonUserProfile";var pe=u.forwardRef(({className:e,...t},r)=>jsx("div",{ref:r,className:a("space-y-4",e),...t,children:Array.from({length:3}).map((l,o)=>jsxs("div",{className:"flex items-center space-x-4",children:[" ",jsx($,{className:"w-10 h-10"})," ",jsxs("div",{className:"space-y-2 flex-1",children:[" ",jsx(i,{className:"h-4 w-3/4"}),jsx(i,{className:"h-3 w-1/2"})]})]},o))}));pe.displayName="SkeletonList";var be=u.forwardRef(({className:e,...t},r)=>jsxs("div",{ref:r,className:a("space-y-4",e),...t,children:[jsxs("div",{className:"flex space-x-4",children:[" ",jsx(i,{className:"h-4 w-1/4"}),jsx(i,{className:"h-4 w-1/4"}),jsx(i,{className:"h-4 w-1/4"}),jsx(i,{className:"h-4 w-1/4"})]}),Array.from({length:5}).map((l,o)=>jsxs("div",{className:"flex space-x-4",children:[" ",jsx(i,{className:"h-4 w-1/4"}),jsx(i,{className:"h-4 w-1/4"}),jsx(i,{className:"h-4 w-1/4"}),jsx(i,{className:"h-4 w-1/4"})]},o))]}));be.displayName="SkeletonTable";var U=u.forwardRef(({className:e,content:t,children:r,position:l="top",variant:o="default",delay:d=300,disabled:p=false,...b},S)=>{let[A,N]=u.useState(false),[y,k]=u.useState({x:0,y:0}),T=u.useRef(void 0),g=u.useRef(null),D=F=>{var n;if(p)return;let f=F.currentTarget.getBoundingClientRect();(n=g.current)==null?void 0:n.getBoundingClientRect();let z=0,I=0;switch(l){case "top":z=f.left+f.width/2,I=f.top-8;break;case "bottom":z=f.left+f.width/2,I=f.bottom+8;break;case "left":z=f.left-8,I=f.top+f.height/2;break;case "right":z=f.right+8,I=f.top+f.height/2;break}k({x:z,y:I}),T.current=window.setTimeout(()=>{N(true);},d);},R=()=>{T.current&&clearTimeout(T.current),N(false);};u.useEffect(()=>()=>{T.current&&clearTimeout(T.current);},[]);let L=()=>{switch(o){case "light":return "bg-white text-gray-900 border border-gray-200 shadow-lg";case "dark":return "bg-gray-900 text-white shadow-lg";default:return "bg-gray-800 text-white shadow-lg"}},m=()=>{switch(l){case "top":return "top-full left-1/2 -translate-x-1/2 border-t-gray-800 dark:border-t-gray-800";case "bottom":return "bottom-full left-1/2 -translate-x-1/2 border-b-gray-800 dark:border-b-gray-800";case "left":return "left-full top-1/2 -translate-y-1/2 border-l-gray-800 dark:border-l-gray-800";case "right":return "right-full top-1/2 -translate-y-1/2 border-r-gray-800 dark:border-r-gray-800";default:return "top-full left-1/2 -translate-x-1/2 border-t-gray-800 dark:border-t-gray-800"}};return jsxs("div",{ref:S,className:a("relative inline-block",e),onMouseEnter:D,onMouseLeave:R,...b,children:[r,A&&jsxs("div",{ref:g,className:a("fixed z-50 px-3 py-2 text-sm rounded-lg whitespace-nowrap pointer-events-none",L()),style:{left:`${y.x}px`,top:`${y.y}px`,transform:"translate(-50%, -50%)"},children:[t,jsx("div",{className:a("absolute w-0 h-0 border-4 border-transparent",m())})]})]})});U.displayName="Tooltip";var ge=u.forwardRef(({className:e,...t},r)=>jsx(U,{ref:r,variant:"light",className:e,...t}));ge.displayName="TooltipLight";var he=u.forwardRef(({className:e,...t},r)=>jsx(U,{ref:r,variant:"dark",className:e,...t}));he.displayName="TooltipDark";var we=u.forwardRef(({className:e,trigger:t,children:r,open:l,onOpenChange:o,placement:d="bottom",align:p="start",offset:b=8,disabled:S=false,showArrow:A=true,...N},y)=>{let[k,T]=u.useState(false),[g,D]=u.useState({x:0,y:0}),R=u.useRef(null),L=u.useRef(null),O=l!==void 0,m=O?l:k,F=n=>{S||(O||T(n),o==null||o(n));},f=()=>{F(!m);},B=u.useCallback(()=>{if(!R.current||!L.current)return;let n=R.current.getBoundingClientRect(),h=L.current.getBoundingClientRect(),J=window.innerWidth,Q=window.innerHeight,w=0,v=0;switch(d){case "top":w=n.left,v=n.top-b;break;case "bottom":w=n.left,v=n.bottom+b;break;case "left":w=n.left-b,v=n.top;break;case "right":w=n.right+b,v=n.top;break}switch(p){case "center":d==="top"||d==="bottom"?w=n.left+n.width/2-h.width/2:v=n.top+n.height/2-h.height/2;break;case "end":d==="top"||d==="bottom"?w=n.right-h.width:v=n.bottom-h.height;break;}w<8&&(w=8),w+h.width>J-8&&(w=J-h.width-8),v<8&&(v=8),v+h.height>Q-8&&(v=Q-h.height-8),D({x:w,y:v});},[d,p,b]);u.useEffect(()=>{if(m)return B(),window.addEventListener("resize",B),window.addEventListener("scroll",B),()=>{window.removeEventListener("resize",B),window.removeEventListener("scroll",B);}},[m,B]),u.useEffect(()=>{let n=h=>{R.current&&L.current&&!R.current.contains(h.target)&&!L.current.contains(h.target)&&F(false);};if(m)return document.addEventListener("mousedown",n),()=>{document.removeEventListener("mousedown",n);}},[m]);let z=()=>{switch(d){case "top":return "bottom-full left-0 mb-2";case "bottom":return "top-full left-0 mt-2";case "left":return "right-full top-0 mr-2";case "right":return "left-full top-0 ml-2";default:return "top-full left-0 mt-2"}},I=()=>{switch(d){case "top":return "top-full left-4 -translate-x-1/2 border-t-gray-100 dark:border-t-gray-800";case "bottom":return "bottom-full left-4 -translate-x-1/2 border-b-gray-100 dark:border-b-gray-800";case "left":return "left-full top-4 -translate-y-1/2 border-l-gray-100 dark:border-l-gray-800";case "right":return "right-full top-4 -translate-y-1/2 border-r-gray-100 dark:border-r-gray-800";default:return "bottom-full left-4 -translate-x-1/2 border-b-gray-100 dark:border-b-gray-800"}};return jsxs("div",{ref:y,className:a("relative",e),...N,children:[jsx("div",{ref:R,onClick:f,className:"inline-block cursor-pointer",children:t}),m&&jsxs("div",{ref:L,className:a("absolute z-50 bg-white dark:bg-gray-800 rounded-lg shadow-xl backdrop-blur-sm","min-w-[200px] py-2",z()),style:{transform:`translate(${g.x}px, ${g.y}px)`,boxShadow:"0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04)"},children:[A&&jsx("div",{className:a("absolute w-0 h-0 border-4 border-transparent",I())}),jsx("div",{className:"relative z-10",children:r})]})]})});we.displayName="Dropdown";var ve=u.forwardRef(({className:e,icon:t,variant:r="default",children:l,disabled:o,...d},p)=>jsxs("button",{ref:p,className:a("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",(()=>{switch(r){case "destructive":return "text-red-600 dark:text-red-400 hover:bg-red-50 dark:hover:bg-red-900/20";case "disabled":return "text-gray-400 dark:text-gray-500 cursor-not-allowed";default:return "text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700"}})(),e),disabled:o||r==="disabled",...d,children:[t&&jsx("div",{className:"flex-shrink-0 w-4 h-4",children:t}),jsx("span",{className:"flex-1 text-left",children:l})]}));ve.displayName="DropdownItem";var xe=u.forwardRef(({className:e,...t},r)=>jsx("div",{ref:r,className:a("h-px bg-gray-200 dark:bg-gray-700 my-2",e),...t}));xe.displayName="DropdownSeparator";var ye=u.forwardRef(({className:e,children:t,...r},l)=>jsx("div",{ref:l,className:a("px-4 py-2 text-xs font-semibold text-gray-500 dark:text-gray-400 uppercase tracking-wide",e),...r,children:t}));ye.displayName="DropdownLabel";var Te=u.forwardRef(({className:e,children:t,...r},l)=>jsx("div",{ref:l,className:a("py-1",e),...r,children:t}));Te.displayName="DropdownMenu";var Ne=u.forwardRef(({className:e,children:t,...r},l)=>jsx("div",{ref:l,className:a("space-y-1",e),...r,children:t}));Ne.displayName="DropdownGroup";var ke=u.forwardRef(({open:e,onOpenChange:t,children:r,className:l,side:o="right",size:d="md",showBackdrop:p=true,backdropClassName:b,closeOnBackdropClick:S=true,closeOnEscape:A=true,...N},y)=>{let[k,T]=u.useState(false),[g,D]=u.useState(false);if(u.useEffect(()=>{if(e){T(true),D(true);let m=setTimeout(()=>D(false),50);return ()=>clearTimeout(m)}else {D(true);let m=setTimeout(()=>{T(false),D(false);},300);return ()=>clearTimeout(m)}},[e]),u.useEffect(()=>{if(!A)return;let m=F=>{F.key==="Escape"&&e&&t(false);};return e&&(document.addEventListener("keydown",m),document.body.style.overflow="hidden"),()=>{document.removeEventListener("keydown",m),document.body.style.overflow="";}},[e,A,t]),!k)return null;let R={sm:o==="left"||o==="right"?"w-80":"h-64",md:o==="left"||o==="right"?"w-96":"h-96",lg:o==="left"||o==="right"?"w-[28rem]":"h-[32rem]",xl:o==="left"||o==="right"?"w-[32rem]":"h-[40rem]",full:o==="left"||o==="right"?"w-full":"h-full"},L={left:"left-0 top-0 h-full translate-x-0",right:"right-0 top-0 h-full translate-x-0",top:"top-0 left-0 w-full translate-y-0",bottom:"bottom-0 left-0 w-full translate-y-0"},O={left:g?e?"translate-x-0":"-translate-x-full":"",right:g?e?"translate-x-0":"translate-x-full":"",top:g?e?"translate-y-0":"-translate-y-full":"",bottom:g?e?"translate-y-0":"translate-y-full":""};return jsxs("div",{className:"fixed inset-0 z-50",children:[p&&jsx("div",{className:a("absolute inset-0 bg-black/60 backdrop-blur-md transition-opacity duration-300",g?e?"opacity-100":"opacity-0":"",b),onClick:S?()=>t(false):void 0}),jsx("div",{ref:y,className:a("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",R[d],L[o],O[o],l),...N,children:r})]})});ke.displayName="Drawer";var Re=u.forwardRef(({children:e,className:t,showCloseButton:r=true,onClose:l$1,...o},d)=>jsxs("div",{ref:d,className:a("flex items-center justify-between p-6 border-b border-gray-200/50 dark:border-gray-700/50",t),...o,children:[jsx("div",{className:"flex-1",children:e}),r&&jsx("button",{onClick:l$1,className:"p-2 rounded-lg hover:bg-gray-100/80 dark:hover:bg-gray-800/80 transition-colors",children:jsx(l,{name:"close",size:20})})]}));Re.displayName="DrawerHeader";var Le=u.forwardRef(({children:e,className:t,...r},l)=>jsx("div",{ref:l,className:a("flex-1 p-6 overflow-y-auto",t),...r,children:e}));Le.displayName="DrawerContent";var He=u.forwardRef(({children:e,className:t,...r},l)=>jsx("div",{ref:l,className:a("flex items-center justify-end gap-3 p-6 border-t border-gray-200/50 dark:border-gray-700/50",t),...r,children:e}));He.displayName="DrawerFooter";export{ye as A,Te as B,Ne as C,ke as D,Re as E,Le as F,He as G,j as a,ee as b,te as c,re as d,ae as e,se as f,oe as g,le as h,ne as i,_ as j,i as k,$ as l,de as m,G as n,ce as o,me as p,fe as q,ue as r,pe as s,be as t,U as u,ge as v,he as w,we as x,ve as y,xe as z};//# sourceMappingURL=chunk-SGCVGEDR.mjs.map
|
|
2
|
+
//# sourceMappingURL=chunk-SGCVGEDR.mjs.map
|