@hua-labs/ui 1.0.0 → 1.1.0-alpha.0.2
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 +897 -210
- 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-627HOIRV.mjs +2 -0
- package/dist/chunk-627HOIRV.mjs.map +1 -0
- package/dist/chunk-ACEKLG37.mjs +2 -0
- package/dist/chunk-ACEKLG37.mjs.map +1 -0
- package/dist/chunk-E5PN4LUS.mjs +2 -0
- package/dist/chunk-E5PN4LUS.mjs.map +1 -0
- package/dist/chunk-KHEJZ3U4.mjs +2 -0
- package/dist/chunk-KHEJZ3U4.mjs.map +1 -0
- package/dist/chunk-MXGXBG63.mjs +2 -0
- package/dist/chunk-MXGXBG63.mjs.map +1 -0
- package/dist/chunk-R5KCFRYV.mjs +2 -0
- package/dist/chunk-R5KCFRYV.mjs.map +1 -0
- package/dist/chunk-UGSYQDR4.mjs +2 -0
- package/dist/chunk-UGSYQDR4.mjs.map +1 -0
- package/dist/chunk-UUHAXGMO.mjs +2 -0
- package/dist/chunk-UUHAXGMO.mjs.map +1 -0
- package/dist/chunk-VU264VFN.mjs +2 -0
- package/dist/chunk-VU264VFN.mjs.map +1 -0
- package/dist/chunk-ZFS4B5QT.mjs +2 -0
- package/dist/chunk-ZFS4B5QT.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 +559 -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 +92 -25
- 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/components/Button.tsx"],"names":["isBrowser","useReducedMotion","reduce","setReduce","React","_a","mq","onChange","ButtonInner","variant","size","loading","icon","iconPosition","gradient","customGradient","rounded","shadow","hover","fullWidth","iconOnly","className","children","disabled","rest","ref","reduced","variantClasses","getGradientClass","sizeClasses","roundedClasses","shadowClasses","hoverClasses","base","merge","content","jsxs","Fragment","jsx","onClick","target","rel","href","ariaLabel","anchorClassName","anchorProps","isDisabled","handleAnchorClick","e","buttonClassName","btnProps","Button","g"],"mappings":"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","file":"chunk-ACEKLG37.mjs","sourcesContent":["\"use client\";\n\nimport React from \"react\";\nimport { merge } from \"../lib/utils\";\n\n/**\n * 버튼 스타일 변형 / Button style variant\n * @typedef {\"default\" | \"destructive\" | \"outline\" | \"secondary\" | \"ghost\" | \"link\" | \"gradient\" | \"neon\" | \"glass\"} Variant\n */\ntype Variant =\n | \"default\" | \"destructive\" | \"outline\" | \"secondary\"\n | \"ghost\" | \"link\" | \"gradient\" | \"neon\" | \"glass\";\n\n/**\n * 버튼 크기 / Button size\n * @typedef {\"sm\" | \"md\" | \"lg\" | \"xl\" | \"icon\"} Size\n */\ntype Size = \"sm\" | \"md\" | \"lg\" | \"xl\" | \"icon\";\n\n/**\n * 버튼 모서리 둥글기 / Button border radius\n * @typedef {\"sm\" | \"md\" | \"lg\" | \"full\"} Rounded\n */\ntype Rounded = \"sm\" | \"md\" | \"lg\" | \"full\";\n\n/**\n * 버튼 그림자 / Button shadow\n * @typedef {\"none\" | \"sm\" | \"md\" | \"lg\" | \"xl\"} Shadow\n */\ntype Shadow = \"none\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n\n/**\n * 버튼 호버 효과 / Button hover effect\n * @typedef {\"scale\" | \"glow\" | \"slide\" | \"none\"} Hover\n */\ntype Hover = \"scale\" | \"glow\" | \"slide\" | \"none\";\n\n/**\n * 그라디언트 색상 이름 / Gradient color name\n * @typedef {\"blue\" | \"purple\" | \"green\" | \"orange\" | \"pink\" | \"custom\"} GradientName\n */\ntype GradientName = \"blue\" | \"purple\" | \"green\" | \"orange\" | \"pink\" | \"custom\";\n\n/**\n * Button 컴포넌트의 공통 props / Common props for Button component\n * @typedef {Object} CommonProps\n * @property {Variant} [variant=\"default\"] - 버튼 스타일 변형 / Button style variant\n * @property {Size} [size=\"md\"] - 버튼 크기 / Button size\n * @property {boolean} [loading=false] - 로딩 상태 (스피너 표시) / Loading state (shows spinner)\n * @property {React.ReactNode} [icon] - 아이콘 요소 / Icon element\n * @property {\"left\" | \"right\"} [iconPosition=\"left\"] - 아이콘 위치 / Icon position\n * @property {GradientName} [gradient=\"blue\"] - 그라디언트 색상 (variant=\"gradient\"일 때) / Gradient color (when variant=\"gradient\")\n * @property {string} [customGradient] - 커스텀 그라디언트 클래스 (variant=\"gradient\"일 때) / Custom gradient class (when variant=\"gradient\")\n * @property {Rounded} [rounded=\"md\"] - 모서리 둥글기 / Border radius\n * @property {Shadow} [shadow=\"md\"] - 그림자 크기 / Shadow size\n * @property {Hover} [hover=\"scale\"] - 호버 효과 / Hover effect\n * @property {boolean} [fullWidth=false] - 전체 너비 사용 / Use full width\n * @property {boolean} [iconOnly=false] - 아이콘만 표시 (aria-label 필수) / Icon only (aria-label required)\n * @property {string} [aria-label] - 접근성을 위한 레이블 (iconOnly일 때 필수) / Accessibility label (required when iconOnly)\n * @property {string} [className] - 추가 CSS 클래스 / Additional CSS class\n * @property {boolean} [disabled=false] - 비활성화 상태 / Disabled state\n */\ntype CommonProps = {\n variant?: Variant;\n size?: Size;\n loading?: boolean;\n icon?: React.ReactNode;\n iconPosition?: \"left\" | \"right\";\n gradient?: GradientName;\n customGradient?: string;\n rounded?: Rounded;\n shadow?: Shadow;\n hover?: Hover;\n fullWidth?: boolean;\n iconOnly?: boolean;\n \"aria-label\"?: string;\n className?: string;\n disabled?: boolean; // <-- 요놈 추가\n};\n\ntype AnchorProps = CommonProps &\n Omit<React.AnchorHTMLAttributes<HTMLAnchorElement>, \"className\"> & {\n href: string;\n };\n\ntype NativeButtonProps = CommonProps &\n Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, \"className\" | \"type\"> & {\n href?: undefined;\n };\n\n/**\n * Button 컴포넌트의 props 타입 / Button component props type\n * href가 제공되면 앵커 태그로, 그렇지 않으면 버튼 태그로 렌더링됩니다.\n * Renders as anchor tag if href is provided, otherwise as button tag.\n * @typedef {AnchorProps | NativeButtonProps} ButtonProps\n */\nexport type ButtonProps = AnchorProps | NativeButtonProps;\n\ntype AnchorOrButton = HTMLAnchorElement | HTMLButtonElement;\n\nconst isBrowser = typeof window !== \"undefined\";\nfunction useReducedMotion() {\n const [reduce, setReduce] = React.useState(false);\n React.useEffect(() => {\n if (!isBrowser || !(\"matchMedia\" in window)) return;\n const mq = window.matchMedia(\"(prefers-reduced-motion: reduce)\");\n const onChange = () => setReduce(!!mq.matches);\n onChange();\n mq.addEventListener?.(\"change\", onChange);\n return () => mq.removeEventListener?.(\"change\", onChange);\n }, []);\n return reduce;\n}\n\n/**\n * Button 컴포넌트 / Button component\n * \n * 다양한 스타일과 크기를 지원하는 범용 버튼 컴포넌트입니다.\n * href prop을 제공하면 앵커 태그로, 그렇지 않으면 버튼 태그로 렌더링됩니다.\n * \n * Universal button component supporting various styles and sizes.\n * Renders as anchor tag if href prop is provided, otherwise as button tag.\n * \n * @component\n * @example\n * // 기본 버튼 / Basic button\n * <Button onClick={() => console.log('클릭')}>클릭하세요</Button>\n * \n * @example\n * // 다양한 변형 / Various variants\n * <Button variant=\"destructive\" size=\"lg\">삭제</Button>\n * <Button variant=\"outline\" size=\"sm\">취소</Button>\n * <Button variant=\"ghost\">보기</Button>\n * \n * @example\n * // 아이콘과 함께 사용 / With icon\n * <Button icon={<Icon name=\"download\" />} iconPosition=\"left\">\n * 다운로드\n * </Button>\n * \n * @example\n * // 로딩 상태 / Loading state\n * <Button loading disabled>저장 중...</Button>\n * \n * @example\n * // 링크 버튼 / Link button\n * <Button href=\"/about\" variant=\"link\">자세히 보기</Button>\n * \n * @example\n * // 아이콘만 표시 (aria-label 필수) / Icon only (aria-label required)\n * <Button iconOnly aria-label=\"닫기\" icon={<Icon name=\"close\" />} />\n * \n * @param {ButtonProps} props - Button 컴포넌트의 props / Button component props\n * @param {React.Ref<HTMLAnchorElement | HTMLButtonElement>} ref - ref 객체 / ref object\n * @returns {JSX.Element} Button 컴포넌트 / Button component\n */\nconst ButtonInner = React.forwardRef<AnchorOrButton, ButtonProps>(function ButtonInner(\n {\n variant = \"default\",\n size = \"md\",\n loading = false,\n icon,\n iconPosition = \"left\",\n gradient = \"blue\",\n customGradient,\n rounded = \"md\",\n shadow = \"md\",\n hover = \"scale\",\n fullWidth,\n iconOnly,\n className,\n children,\n disabled,\n ...rest\n },\n ref\n) {\n const reduced = useReducedMotion();\n\n const variantClasses: Record<Variant, string> = {\n default:\n \"bg-blue-600 text-white hover:bg-blue-700 dark:bg-blue-500 dark:hover:bg-blue-600\",\n destructive:\n \"bg-red-600 text-white hover:bg-red-700 dark:bg-red-500 dark:hover:bg-red-600\",\n outline:\n \"border-2 border-blue-600 bg-transparent text-blue-600 hover:bg-blue-50 dark:border-blue-400 dark:text-blue-400 dark:hover:bg-blue-900/20\",\n secondary:\n \"bg-gray-200 text-gray-900 hover:bg-gray-300 dark:bg-gray-700 dark:text-white dark:hover:bg-gray-600\",\n ghost:\n \"bg-transparent text-gray-700 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-800\",\n link:\n \"bg-transparent text-blue-600 underline hover:text-blue-700 dark:text-blue-400 dark:hover:text-blue-300\",\n gradient: `bg-gradient-to-r ${customGradient || getGradientClass(gradient)} text-white hover:shadow-lg`,\n neon:\n \"bg-gray-900 text-cyan-400 border border-cyan-400/30 shadow-lg shadow-cyan-400/20 hover:shadow-cyan-400/40\",\n glass:\n \"bg-white/10 backdrop-blur-md border border-white/20 text-white hover:bg-white/20\",\n };\n\n const sizeClasses: Record<Size, string> = {\n sm: \"h-8 px-3 py-1 text-sm\",\n md: \"h-10 px-4 py-2 text-base\",\n lg: \"h-12 px-6 py-3 text-lg\",\n xl: \"h-14 px-8 py-4 text-xl\",\n icon: \"h-10 w-10 p-0\",\n };\n\n const roundedClasses: Record<Rounded, string> = {\n sm: \"rounded\",\n md: \"rounded-md\",\n lg: \"rounded-lg\",\n full: \"rounded-full\",\n };\n\n const shadowClasses: Record<Shadow, string> = {\n none: \"\",\n sm: \"shadow-sm\",\n md: \"shadow-md\",\n lg: \"shadow-lg\",\n xl: \"shadow-xl\",\n };\n\n const hoverClasses: Record<Hover, string> = {\n scale: reduced ? \"\" : \"hover:scale-105 transition-transform duration-200\",\n glow: reduced ? \"\" : \"hover:shadow-2xl hover:shadow-blue-500/25 dark:hover:shadow-cyan-400/25 transition-shadow duration-300\",\n slide: reduced ? \"\" : \"hover:-translate-y-1 transition-transform duration-200\",\n none: \"\",\n };\n\n // variant별 포커스 스타일\n const focusClasses: Record<Variant, string> = {\n default: \"focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-blue-500 focus-visible:ring-offset-1\",\n destructive: \"focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-red-500 focus-visible:ring-offset-1\",\n outline: \"focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-blue-300 dark:focus-visible:ring-blue-600 focus-visible:ring-offset-0\",\n secondary: \"focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-gray-400 focus-visible:ring-offset-1\",\n ghost: \"focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-gray-300 dark:focus-visible:ring-gray-600 focus-visible:ring-offset-0\",\n link: \"focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-blue-400 focus-visible:ring-offset-0\",\n gradient: \"focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-blue-500 focus-visible:ring-offset-1\",\n neon: \"focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-cyan-400 focus-visible:ring-offset-1\",\n glass: \"focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-blue-400/50 focus-visible:ring-offset-0\",\n };\n\n const base = merge(\n \"inline-flex items-center justify-center whitespace-nowrap font-medium transition-all duration-200\",\n focusClasses[variant],\n \"disabled:pointer-events-none disabled:opacity-50 min-w-fit\",\n fullWidth && \"w-full\",\n variantClasses[variant],\n sizeClasses[size],\n roundedClasses[rounded],\n shadowClasses[shadow],\n hoverClasses[hover],\n className\n );\n\n const Spinner = (\n <span role=\"status\" aria-live=\"polite\" className=\"-ml-1 mr-2 inline-flex\">\n <svg className=\"animate-spin h-4 w-4\" viewBox=\"0 0 24 24\" fill=\"none\">\n <circle className=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"4\" />\n <path className=\"opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\" />\n </svg>\n <span className=\"sr-only\">로딩 중</span>\n </span>\n );\n\n const content = (\n <>\n {loading && Spinner}\n {!loading && icon && iconPosition === \"left\" && <span className=\"mr-2\">{icon}</span>}\n {children}\n {!loading && icon && iconPosition === \"right\" && <span className=\"ml-2\">{icon}</span>}\n </>\n );\n\n if (iconOnly && !(\"aria-label\" in rest) && process.env.NODE_ENV !== \"production\") {\n // eslint-disable-next-line no-console\n console.warn(\"[Button] iconOnly 사용 시 aria-label을 제공하세요.\");\n }\n\n // 앵커 모드\n if (\"href\" in rest && rest.href) {\n const { onClick, target, rel, href, \"aria-label\": ariaLabel, className: anchorClassName, ...anchorProps } = rest as AnchorProps;\n const isDisabled = !!disabled || loading;\n\n const handleAnchorClick: React.MouseEventHandler<HTMLAnchorElement> = (e) => {\n if (isDisabled) { e.preventDefault(); e.stopPropagation(); return; }\n onClick?.(e);\n };\n\n return (\n <a\n ref={ref as React.Ref<HTMLAnchorElement>}\n href={href}\n className={merge(base, anchorClassName)}\n onClick={handleAnchorClick}\n aria-busy={loading || undefined}\n aria-disabled={isDisabled || undefined}\n tabIndex={isDisabled ? -1 : anchorProps.tabIndex}\n target={target}\n rel={target === \"_blank\" ? rel ?? \"noopener noreferrer\" : rel}\n {...anchorProps}\n >\n {content}\n </a>\n );\n }\n\n // 버튼 모드\n const { className: buttonClassName, ...btnProps } = rest as NativeButtonProps;\n const isDisabled = !!disabled || loading;\n return (\n <button\n ref={ref as React.Ref<HTMLButtonElement>}\n className={merge(base, buttonClassName)}\n type=\"button\" // 폼 기본 제출 방지\n disabled={isDisabled}\n aria-busy={loading || undefined}\n aria-disabled={isDisabled || undefined}\n {...btnProps}\n >\n {content}\n </button>\n );\n});\n\nButtonInner.displayName = \"Button\";\n\nexport const Button = ButtonInner;\n\nfunction getGradientClass(gradient: GradientName): string {\n const g: Record<Exclude<GradientName, \"custom\">, string> = {\n blue: \"from-blue-500 to-cyan-500\",\n purple: \"from-purple-500 to-pink-500\",\n green: \"from-green-500 to-emerald-500 dark:from-green-400 dark:to-emerald-400\",\n orange: \"from-orange-500 to-red-500 dark:from-orange-300 dark:to-red-300\",\n pink: \"from-pink-500 to-rose-500\",\n };\n return g[gradient as keyof typeof g] || g.blue;\n}\n"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import {l}from'./chunk-UGSYQDR4.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-E5PN4LUS.mjs.map
|
|
2
|
+
//# sourceMappingURL=chunk-E5PN4LUS.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/Table.tsx","../src/components/Badge.tsx","../src/components/Skeleton.tsx","../src/components/Tooltip.tsx","../src/components/Dropdown.tsx","../src/components/Drawer.tsx"],"names":["Table","React","className","variant","size","props","ref","getVariantClasses","getSizeClasses","jsx","merge","TableHeader","TableBody","TableFooter","TableRow","TableHead","TableCell","TableCaption","Badge","variantClasses","Skeleton","width","height","animation","getAnimationClasses","defaultDims","finalWidth","finalHeight","SkeletonText","SkeletonCircle","SkeletonRectangle","SkeletonRounded","SkeletonCard","jsxs","SkeletonAvatar","SkeletonImage","SkeletonUserProfile","SkeletonList","_","index","SkeletonTable","Tooltip","content","children","position","delay","disabled","isVisible","setIsVisible","coords","setCoords","timeoutRef","tooltipRef","showTooltip","e","_a","rect","tooltipRect","x","y","hideTooltip","getArrowClasses","TooltipLight","TooltipDark","Dropdown","trigger","controlledOpen","onOpenChange","placement","align","offset","showArrow","internalOpen","setInternalOpen","triggerRef","dropdownRef","isControlled","isOpen","handleOpenChange","newOpen","handleTriggerClick","updatePosition","triggerRect","dropdownRect","viewportWidth","viewportHeight","handleClickOutside","event","getPlacementClasses","DropdownItem","icon","DropdownSeparator","DropdownLabel","DropdownMenu","DropdownGroup","Drawer","open","side","showBackdrop","backdropClassName","closeOnBackdropClick","closeOnEscape","isAnimating","setIsAnimating","timer","handleEscape","sizeClasses","sideClasses","transformClasses","DrawerHeader","showCloseButton","onClose","Icon","DrawerContent","DrawerFooter"],"mappings":"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","file":"chunk-E5PN4LUS.mjs","sourcesContent":["\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * Table 컴포넌트의 props / Table component props\n * @typedef {Object} TableProps\n * @property {React.ReactNode} children - TableHeader, TableBody, TableFooter 등 / TableHeader, TableBody, TableFooter, etc.\n * @property {\"default\" | \"bordered\" | \"striped\"} [variant=\"default\"] - Table 스타일 변형 / Table style variant\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - Table 크기 / Table size\n * @extends {React.HTMLAttributes<HTMLTableElement>}\n */\nexport interface TableProps extends React.HTMLAttributes<HTMLTableElement> {\n children: React.ReactNode\n variant?: \"default\" | \"bordered\" | \"striped\"\n size?: \"sm\" | \"md\" | \"lg\"\n}\n\n/**\n * TableHeader 컴포넌트의 props / TableHeader component props\n * @typedef {Object} TableHeaderProps\n * @property {React.ReactNode} children - TableHead 컴포넌트들 / TableHead components\n * @extends {React.HTMLAttributes<HTMLTableSectionElement>}\n */\nexport interface TableHeaderProps extends React.HTMLAttributes<HTMLTableSectionElement> {\n children: React.ReactNode\n}\n\n/**\n * TableBody 컴포넌트의 props / TableBody component props\n * @typedef {Object} TableBodyProps\n * @property {React.ReactNode} children - TableRow 컴포넌트들 / TableRow components\n * @extends {React.HTMLAttributes<HTMLTableSectionElement>}\n */\nexport interface TableBodyProps extends React.HTMLAttributes<HTMLTableSectionElement> {\n children: React.ReactNode\n}\n\n/**\n * TableFooter 컴포넌트의 props / TableFooter component props\n * @typedef {Object} TableFooterProps\n * @property {React.ReactNode} children - TableRow 컴포넌트들 / TableRow components\n * @extends {React.HTMLAttributes<HTMLTableSectionElement>}\n */\nexport interface TableFooterProps extends React.HTMLAttributes<HTMLTableSectionElement> {\n children: React.ReactNode\n}\n\n/**\n * TableRow 컴포넌트의 props / TableRow component props\n * @typedef {Object} TableRowProps\n * @property {React.ReactNode} children - TableHead 또는 TableCell 컴포넌트들 / TableHead or TableCell components\n * @property {\"default\" | \"hover\"} [variant=\"default\"] - Row 스타일 변형 / Row style variant\n * @extends {React.HTMLAttributes<HTMLTableRowElement>}\n */\nexport interface TableRowProps extends React.HTMLAttributes<HTMLTableRowElement> {\n children: React.ReactNode\n variant?: \"default\" | \"hover\"\n}\n\n/**\n * TableHead 컴포넌트의 props / TableHead component props\n * @typedef {Object} TableHeadProps\n * @property {React.ReactNode} children - 헤더 셀 내용 / Header cell content\n * @extends {React.ThHTMLAttributes<HTMLTableCellElement>}\n */\nexport interface TableHeadProps extends React.ThHTMLAttributes<HTMLTableCellElement> {\n children: React.ReactNode\n}\n\n/**\n * TableCell 컴포넌트의 props / TableCell component props\n * @typedef {Object} TableCellProps\n * @property {React.ReactNode} children - 셀 내용 / Cell content\n * @extends {React.TdHTMLAttributes<HTMLTableCellElement>}\n */\nexport interface TableCellProps extends React.TdHTMLAttributes<HTMLTableCellElement> {\n children: React.ReactNode\n}\n\n/**\n * Table 컴포넌트 / Table component\n * \n * 데이터를 표 형태로 표시하는 테이블 컴포넌트입니다.\n * TableHeader, TableBody, TableFooter, TableRow, TableHead, TableCell과 함께 사용합니다.\n * \n * Table component that displays data in tabular format.\n * Used with TableHeader, TableBody, TableFooter, TableRow, TableHead, and TableCell.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Table>\n * <TableHeader>\n * <TableRow>\n * <TableHead>이름</TableHead>\n * <TableHead>나이</TableHead>\n * </TableRow>\n * </TableHeader>\n * <TableBody>\n * <TableRow>\n * <TableCell>홍길동</TableCell>\n * <TableCell>30</TableCell>\n * </TableRow>\n * </TableBody>\n * </Table>\n * \n * @example\n * // Bordered 스타일 / Bordered style\n * <Table variant=\"bordered\">\n * <TableHeader>\n * <TableRow>\n * <TableHead>항목</TableHead>\n * </TableRow>\n * </TableHeader>\n * <TableBody>\n * <TableRow>\n * <TableCell>값</TableCell>\n * </TableRow>\n * </TableBody>\n * </Table>\n * \n * @example\n * // Striped 스타일, 호버 효과 / Striped style with hover effect\n * <Table variant=\"striped\">\n * <TableBody>\n * <TableRow variant=\"hover\">\n * <TableCell>데이터</TableCell>\n * </TableRow>\n * </TableBody>\n * </Table>\n * \n * @param {TableProps} props - Table 컴포넌트의 props / Table component props\n * @param {React.Ref<HTMLTableElement>} ref - table 요소 ref / table element ref\n * @returns {JSX.Element} Table 컴포넌트 / Table component\n */\nconst Table = React.forwardRef<HTMLTableElement, TableProps>(\n ({ className, variant = \"default\", size = \"md\", ...props }, ref) => {\n const getVariantClasses = () => {\n switch (variant) {\n case \"bordered\":\n return \"border border-slate-200 dark:border-slate-700 divide-x divide-slate-200 dark:divide-slate-700\"\n case \"striped\":\n return \"divide-y divide-slate-200 dark:divide-slate-700\"\n default:\n return \"\"\n }\n }\n\n const getSizeClasses = () => {\n switch (size) {\n case \"sm\":\n return \"text-sm\"\n case \"lg\":\n return \"text-base\"\n default:\n return \"text-sm\"\n }\n }\n\n return (\n <div className=\"w-full overflow-auto\">\n <table\n ref={ref}\n className={merge(\n \"w-full caption-bottom\",\n getVariantClasses(),\n getSizeClasses(),\n className\n )}\n {...props}\n />\n </div>\n )\n }\n)\nTable.displayName = \"Table\"\n\n/**\n * TableHeader 컴포넌트 / TableHeader component\n * 테이블의 헤더 영역을 표시합니다.\n * Displays the header area of a table.\n * \n * @component\n * @param {TableHeaderProps} props - TableHeader 컴포넌트의 props / TableHeader component props\n * @param {React.Ref<HTMLTableSectionElement>} ref - thead 요소 ref / thead element ref\n * @returns {JSX.Element} TableHeader 컴포넌트 / TableHeader component\n */\nconst TableHeader = React.forwardRef<HTMLTableSectionElement, TableHeaderProps>(\n ({ className, ...props }, ref) => (\n <thead ref={ref} className={merge(\"[&_tr]:border-b\", className)} {...props} />\n )\n)\nTableHeader.displayName = \"TableHeader\"\n\n/**\n * TableBody 컴포넌트 / TableBody component\n * 테이블의 본문 영역을 표시합니다.\n * Displays the body area of a table.\n * \n * @component\n * @param {TableBodyProps} props - TableBody 컴포넌트의 props / TableBody component props\n * @param {React.Ref<HTMLTableSectionElement>} ref - tbody 요소 ref / tbody element ref\n * @returns {JSX.Element} TableBody 컴포넌트 / TableBody component\n */\nconst TableBody = React.forwardRef<HTMLTableSectionElement, TableBodyProps>(\n ({ className, ...props }, ref) => (\n <tbody\n ref={ref}\n className={merge(\"[&_tr:last-child]:border-0\", className)}\n {...props}\n />\n )\n)\nTableBody.displayName = \"TableBody\"\n\n/**\n * TableFooter 컴포넌트 / TableFooter component\n * 테이블의 푸터 영역을 표시합니다.\n * Displays the footer area of a table.\n * \n * @component\n * @param {TableFooterProps} props - TableFooter 컴포넌트의 props / TableFooter component props\n * @param {React.Ref<HTMLTableSectionElement>} ref - tfoot 요소 ref / tfoot element ref\n * @returns {JSX.Element} TableFooter 컴포넌트 / TableFooter component\n */\nconst TableFooter = React.forwardRef<HTMLTableSectionElement, TableFooterProps>(\n ({ className, ...props }, ref) => (\n <tfoot\n ref={ref}\n className={merge(\n \"border-t bg-slate-50 dark:bg-slate-800/50 font-medium [&>tr]:last:border-b-0\",\n className\n )}\n {...props}\n />\n )\n)\nTableFooter.displayName = \"TableFooter\"\n\n/**\n * TableRow 컴포넌트 / TableRow component\n * 테이블의 행을 표시합니다.\n * Displays a table row.\n * \n * @component\n * @param {TableRowProps} props - TableRow 컴포넌트의 props / TableRow component props\n * @param {React.Ref<HTMLTableRowElement>} ref - tr 요소 ref / tr element ref\n * @returns {JSX.Element} TableRow 컴포넌트 / TableRow component\n */\nconst TableRow = React.forwardRef<HTMLTableRowElement, TableRowProps>(\n ({ className, variant = \"default\", ...props }, ref) => {\n const getVariantClasses = () => {\n switch (variant) {\n case \"hover\":\n return \"hover:bg-slate-50 dark:hover:bg-slate-800/50\"\n default:\n return \"\"\n }\n }\n\n return (\n <tr\n ref={ref}\n className={merge(\n \"border-b transition-colors data-[state=selected]:bg-slate-50 dark:data-[state=selected]:bg-slate-800/50\",\n getVariantClasses(),\n className\n )}\n {...props}\n />\n )\n }\n)\nTableRow.displayName = \"TableRow\"\n\n/**\n * TableHead 컴포넌트 / TableHead component\n * 테이블의 헤더 셀을 표시합니다.\n * Displays a table header cell.\n * \n * @component\n * @param {TableHeadProps} props - TableHead 컴포넌트의 props / TableHead component props\n * @param {React.Ref<HTMLTableCellElement>} ref - th 요소 ref / th element ref\n * @returns {JSX.Element} TableHead 컴포넌트 / TableHead component\n */\nconst TableHead = React.forwardRef<HTMLTableCellElement, TableHeadProps>(\n ({ className, ...props }, ref) => (\n <th\n ref={ref}\n className={merge(\n \"h-12 px-4 text-left align-middle font-medium text-slate-500 dark:text-slate-400 [&:has([role=checkbox])]:pr-0\",\n className\n )}\n {...props}\n />\n )\n)\nTableHead.displayName = \"TableHead\"\n\n/**\n * TableCell 컴포넌트 / TableCell component\n * 테이블의 데이터 셀을 표시합니다.\n * Displays a table data cell.\n * \n * @component\n * @param {TableCellProps} props - TableCell 컴포넌트의 props / TableCell component props\n * @param {React.Ref<HTMLTableCellElement>} ref - td 요소 ref / td element ref\n * @returns {JSX.Element} TableCell 컴포넌트 / TableCell component\n */\nconst TableCell = React.forwardRef<HTMLTableCellElement, TableCellProps>(\n ({ className, ...props }, ref) => (\n <td\n ref={ref}\n className={merge(\"p-4 align-middle [&:has([role=checkbox])]:pr-0\", className)}\n {...props}\n />\n )\n)\nTableCell.displayName = \"TableCell\"\n\n/**\n * TableCaption 컴포넌트 / TableCaption component\n * 테이블의 캡션을 표시합니다.\n * Displays a table caption.\n * \n * @component\n * @param {React.HTMLAttributes<HTMLTableCaptionElement>} props - TableCaption 컴포넌트의 props / TableCaption component props\n * @param {React.Ref<HTMLTableCaptionElement>} ref - caption 요소 ref / caption element ref\n * @returns {JSX.Element} TableCaption 컴포넌트 / TableCaption component\n */\nconst TableCaption = React.forwardRef<HTMLTableCaptionElement, React.HTMLAttributes<HTMLTableCaptionElement>>(\n ({ className, ...props }, ref) => (\n <caption\n ref={ref}\n className={merge(\"mt-4 text-sm text-slate-500 dark:text-slate-400\", className)}\n {...props}\n />\n )\n)\nTableCaption.displayName = \"TableCaption\"\n\nexport {\n Table,\n TableHeader,\n TableBody,\n TableFooter,\n TableHead,\n TableRow,\n TableCell,\n TableCaption,\n} ","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * Badge 컴포넌트의 props / Badge component props\n * @typedef {Object} BadgeProps\n * @property {\"default\" | \"secondary\" | \"destructive\" | \"error\" | \"outline\" | \"glass\"} [variant=\"default\"] - Badge 스타일 변형 / Badge style variant\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface BadgeProps extends React.HTMLAttributes<HTMLDivElement> {\n variant?: \"default\" | \"secondary\" | \"destructive\" | \"error\" | \"outline\" | \"glass\"\n}\n\n/**\n * Badge 컴포넌트 / Badge component\n * \n * 상태나 카테고리를 표시하는 작은 배지 컴포넌트입니다.\n * React.memo로 최적화되어 있어 불필요한 리렌더링을 방지합니다.\n * \n * Small badge component for displaying status or category.\n * Optimized with React.memo to prevent unnecessary re-renders.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Badge>New</Badge>\n * \n * @example\n * // 다양한 변형 / Various variants\n * <Badge variant=\"destructive\">완료</Badge>\n * <Badge variant=\"error\">오류</Badge>\n * <Badge variant=\"outline\">대기</Badge>\n * \n * @param {BadgeProps} props - Badge 컴포넌트의 props / Badge component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} Badge 컴포넌트 / Badge component\n */\nconst Badge = React.memo(React.forwardRef<HTMLDivElement, BadgeProps>(\n ({ className, variant = \"default\", ...props }, ref) => {\n const variantClasses = React.useMemo(() => ({\n default: \"bg-slate-900 text-slate-50 hover:bg-slate-900/80 dark:bg-slate-50 dark:text-slate-900 dark:hover:bg-slate-50/80\",\n secondary: \"bg-slate-100 text-slate-900 hover:bg-slate-100/80 dark:bg-slate-800 dark:text-slate-50 dark:hover:bg-slate-800/80\",\n destructive: \"bg-red-500 text-slate-50 hover:bg-red-500/80 dark:bg-red-900 dark:text-slate-50 dark:hover:bg-red-900/80\",\n error: \"bg-red-500 text-slate-50 hover:bg-red-500/80 dark:bg-red-900 dark:text-slate-50 dark:hover:bg-red-900/80\", // error는 destructive와 동일\n outline: \"text-slate-950 border border-slate-200 hover:bg-slate-100 hover:text-slate-900 dark:border-slate-800 dark:text-slate-50 dark:hover:bg-slate-800 dark:hover:text-slate-50\",\n glass: \"bg-white/20 backdrop-blur-sm border border-white/30 text-white hover:bg-white/30 dark:bg-slate-800/20 dark:border-slate-700/50 dark:text-slate-200 dark:hover:bg-slate-700/30\"\n }), [])\n\n return (\n <div\n ref={ref}\n className={merge(\n \"inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-gray-400 focus:ring-offset-2\",\n variantClasses[variant],\n className\n )}\n {...props}\n />\n )\n }\n))\nBadge.displayName = \"Badge\"\n\nexport { Badge } ","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * Skeleton 컴포넌트의 props\n * @typedef {Object} SkeletonProps\n * @property {\"text\" | \"circular\" | \"rectangular\" | \"rounded\"} [variant=\"text\"] - Skeleton 모양\n * @property {string | number} [width] - 너비 (기본값: variant에 따라 다름)\n * @property {string | number} [height] - 높이 (기본값: variant에 따라 다름)\n * @property {\"pulse\" | \"wave\" | \"shimmer\"} [animation=\"pulse\"] - 애니메이션 타입\n * @property {string} [className] - 추가 CSS 클래스\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface SkeletonProps extends React.HTMLAttributes<HTMLDivElement> {\n variant?: \"text\" | \"circular\" | \"rectangular\" | \"rounded\"\n width?: string | number\n height?: string | number\n animation?: \"pulse\" | \"wave\" | \"shimmer\"\n className?: string\n}\n\n/**\n * Skeleton 컴포넌트 / Skeleton component\n * \n * 로딩 중 콘텐츠의 플레이스홀더를 표시하는 스켈레톤 컴포넌트입니다.\n * 다양한 모양과 애니메이션을 지원합니다.\n * \n * Skeleton component that displays placeholders for content while loading.\n * Supports various shapes and animations.\n * \n * @component\n * @example\n * // 기본 사용 (텍스트) / Basic usage (text)\n * <Skeleton />\n * \n * @example\n * // 원형 아바타 / Circular avatar\n * <Skeleton variant=\"circular\" width={40} height={40} />\n * \n * @example\n * // Wave 애니메이션 / Wave animation\n * <Skeleton \n * variant=\"rounded\" \n * width=\"100%\" \n * height={200}\n * animation=\"wave\"\n * />\n * \n * @param {SkeletonProps} props - Skeleton 컴포넌트의 props / Skeleton component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} Skeleton 컴포넌트 / Skeleton component\n */\nconst Skeleton = React.forwardRef<HTMLDivElement, SkeletonProps>(\n ({ \n className, \n variant = \"text\",\n width,\n height,\n animation = \"pulse\",\n ...props \n }, ref) => {\n const getVariantClasses = () => {\n switch (variant) {\n case \"circular\":\n return \"rounded-full\"\n case \"rounded\":\n return \"rounded-lg\"\n case \"rectangular\":\n return \"rounded-none\"\n case \"text\":\n default:\n return \"rounded\"\n }\n }\n\n const getAnimationClasses = () => {\n switch (animation) {\n case \"wave\":\n return \"animate-pulse bg-gradient-to-r from-gray-200 via-gray-300 to-gray-200 bg-[length:200%_100%] animate-shimmer\"\n case \"shimmer\":\n return \"bg-gradient-to-r from-gray-200 via-gray-300 to-gray-200 bg-[length:200%_100%] animate-shimmer\"\n case \"pulse\":\n default:\n return \"animate-pulse bg-gray-200 dark:bg-gray-700\"\n }\n }\n\n const getDefaultDimensions = () => {\n switch (variant) {\n case \"circular\":\n return { width: \"40px\", height: \"40px\" }\n case \"text\":\n return { width: \"100%\", height: \"1em\" }\n case \"rounded\":\n return { width: \"100%\", height: \"200px\" }\n case \"rectangular\":\n return { width: \"100%\", height: \"200px\" }\n default:\n return { width: \"100%\", height: \"1em\" }\n }\n }\n\n const defaultDims = getDefaultDimensions()\n const finalWidth = width || defaultDims.width\n const finalHeight = height || defaultDims.height\n\n return (\n <div\n ref={ref}\n className={merge(\n \"block\",\n getVariantClasses(),\n getAnimationClasses(),\n className\n )}\n style={{\n width: typeof finalWidth === \"number\" ? `${finalWidth}px` : finalWidth,\n height: typeof finalHeight === \"number\" ? `${finalHeight}px` : finalHeight,\n }}\n {...props}\n />\n )\n }\n)\nSkeleton.displayName = \"Skeleton\"\n\n// 편의 컴포넌트들\nexport const SkeletonText = React.forwardRef<HTMLDivElement, Omit<SkeletonProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Skeleton ref={ref} variant=\"text\" className={className} {...props} />\n )\n)\nSkeletonText.displayName = \"SkeletonText\"\n\nexport const SkeletonCircle = React.forwardRef<HTMLDivElement, Omit<SkeletonProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Skeleton ref={ref} variant=\"circular\" className={className} {...props} />\n )\n)\nSkeletonCircle.displayName = \"SkeletonCircle\"\n\nexport const SkeletonRectangle = React.forwardRef<HTMLDivElement, Omit<SkeletonProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Skeleton ref={ref} variant=\"rectangular\" className={className} {...props} />\n )\n)\nSkeletonRectangle.displayName = \"SkeletonRectangle\"\n\nexport const SkeletonRounded = React.forwardRef<HTMLDivElement, Omit<SkeletonProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Skeleton ref={ref} variant=\"rounded\" className={className} {...props} />\n )\n)\nSkeletonRounded.displayName = \"SkeletonRounded\"\n\n// 복합 스켈레톤 컴포넌트들\nexport const SkeletonCard = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"space-y-4 p-6\", className)} // 16px 간격, 24px 패딩\n {...props}\n >\n <div className=\"flex items-center space-x-4\"> {/* 16px 간격 */}\n <SkeletonCircle className=\"w-12 h-12\" /> {/* 48px 크기 */}\n <div className=\"space-y-2 flex-1\"> {/* 8px 간격 */}\n <SkeletonText className=\"h-4 w-3/4\" /> {/* 16px 높이, 75% 너비 */}\n <SkeletonText className=\"h-3 w-1/2\" /> {/* 12px 높이, 50% 너비 */}\n </div>\n </div>\n <SkeletonRounded className=\"w-full h-32\" /> {/* 128px 높이 */}\n <div className=\"space-y-2\"> {/* 8px 간격 */}\n <SkeletonText className=\"h-4 w-full\" />\n <SkeletonText className=\"h-4 w-5/6\" />\n <SkeletonText className=\"h-4 w-4/6\" />\n </div>\n </div>\n )\n)\nSkeletonCard.displayName = \"SkeletonCard\"\n\nexport const SkeletonAvatar = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"flex items-center space-x-4\", className)} // 16px 간격\n {...props}\n >\n <SkeletonCircle className=\"w-12 h-12\" /> {/* 48px 크기 */}\n <div className=\"space-y-2 flex-1\"> {/* 8px 간격 */}\n <SkeletonText className=\"h-4 w-3/4\" />\n <SkeletonText className=\"h-3 w-1/2\" />\n </div>\n </div>\n )\n)\nSkeletonAvatar.displayName = \"SkeletonAvatar\"\n\nexport const SkeletonImage = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"space-y-2\", className)} // 8px 간격\n {...props}\n >\n <SkeletonRounded className=\"w-full h-48\" /> {/* 192px 높이 */}\n <SkeletonText className=\"h-4 w-1/2\" />\n </div>\n )\n)\nSkeletonImage.displayName = \"SkeletonImage\"\n\nexport const SkeletonUserProfile = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"space-y-4\", className)} // 16px 간격\n {...props}\n >\n <div className=\"flex items-center space-x-4\"> {/* 16px 간격 */}\n <SkeletonCircle className=\"w-16 h-16\" /> {/* 64px 크기 */}\n <div className=\"space-y-2 flex-1\"> {/* 8px 간격 */}\n <SkeletonText className=\"h-5 w-1/2\" />\n <SkeletonText className=\"h-3 w-1/3\" />\n </div>\n </div>\n <div className=\"space-y-2\"> {/* 8px 간격 */}\n <SkeletonText className=\"h-4 w-full\" />\n <SkeletonText className=\"h-4 w-5/6\" />\n </div>\n </div>\n )\n)\nSkeletonUserProfile.displayName = \"SkeletonUserProfile\"\n\nexport const SkeletonList = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"space-y-4\", className)} // 16px 간격\n {...props}\n >\n {Array.from({ length: 3 }).map((_, index) => (\n <div key={index} className=\"flex items-center space-x-4\"> {/* 16px 간격 */}\n <SkeletonCircle className=\"w-10 h-10\" /> {/* 40px 크기 */}\n <div className=\"space-y-2 flex-1\"> {/* 8px 간격 */}\n <SkeletonText className=\"h-4 w-3/4\" />\n <SkeletonText className=\"h-3 w-1/2\" />\n </div>\n </div>\n ))}\n </div>\n )\n)\nSkeletonList.displayName = \"SkeletonList\"\n\nexport const SkeletonTable = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"space-y-4\", className)} // 16px 간격\n {...props}\n >\n {/* 헤더 */}\n <div className=\"flex space-x-4\"> {/* 16px 간격 */}\n <SkeletonText className=\"h-4 w-1/4\" />\n <SkeletonText className=\"h-4 w-1/4\" />\n <SkeletonText className=\"h-4 w-1/4\" />\n <SkeletonText className=\"h-4 w-1/4\" />\n </div>\n {/* 행들 */}\n {Array.from({ length: 5 }).map((_, index) => (\n <div key={index} className=\"flex space-x-4\"> {/* 16px 간격 */}\n <SkeletonText className=\"h-4 w-1/4\" />\n <SkeletonText className=\"h-4 w-1/4\" />\n <SkeletonText className=\"h-4 w-1/4\" />\n <SkeletonText className=\"h-4 w-1/4\" />\n </div>\n ))}\n </div>\n )\n)\nSkeletonTable.displayName = \"SkeletonTable\"\n\nexport { Skeleton } ","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * Tooltip 컴포넌트의 props / Tooltip component props\n * @typedef {Object} TooltipProps\n * @property {string} content - Tooltip 내용 / Tooltip content\n * @property {React.ReactNode} children - Tooltip이 연결될 요소 / Element to attach tooltip to\n * @property {\"top\" | \"bottom\" | \"left\" | \"right\"} [position=\"top\"] - Tooltip 표시 위치 / Tooltip display position\n * @property {\"default\" | \"light\" | \"dark\"} [variant=\"default\"] - Tooltip 스타일 변형 / Tooltip style variant\n * @property {number} [delay=300] - Tooltip 표시 지연 시간(ms) / Tooltip display delay (ms)\n * @property {boolean} [disabled=false] - Tooltip 비활성화 여부 / Disable tooltip\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface TooltipProps extends React.HTMLAttributes<HTMLDivElement> {\n content: string\n children: React.ReactNode\n position?: \"top\" | \"bottom\" | \"left\" | \"right\"\n variant?: \"default\" | \"light\" | \"dark\"\n delay?: number\n disabled?: boolean\n}\n\n/**\n * Tooltip 컴포넌트 / Tooltip component\n * \n * 호버 시 추가 정보를 표시하는 툴팁 컴포넌트입니다.\n * 마우스 호버 시 지연 시간 후 표시됩니다.\n * \n * Tooltip component that displays additional information on hover.\n * Appears after a delay when the mouse hovers over the element.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Tooltip content=\"이것은 도움말입니다\">\n * <Button>호버하세요</Button>\n * </Tooltip>\n * \n * @example\n * // 다양한 위치 / Different positions\n * <Tooltip content=\"위치 변경\" position=\"bottom\">\n * <Icon name=\"info\" />\n * </Tooltip>\n * \n * @example\n * // 커스텀 스타일 / Custom styles\n * <Tooltip content=\"라이트 스타일\" variant=\"light\" delay={500}>\n * <span>호버</span>\n * </Tooltip>\n * \n * @param {TooltipProps} props - Tooltip 컴포넌트의 props / Tooltip component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} Tooltip 컴포넌트 / Tooltip component\n * \n * @todo 접근성 개선: role=\"tooltip\" 추가 필요 / Accessibility: Add role=\"tooltip\"\n * @todo 접근성 개선: aria-describedby 연결 필요 / Accessibility: Connect aria-describedby\n * @todo 접근성 개선: 키보드 포커스 시 Tooltip 표시 필요 / Accessibility: Show tooltip on keyboard focus\n */\nconst Tooltip = React.forwardRef<HTMLDivElement, TooltipProps>(\n ({ \n className, \n content,\n children,\n position = \"top\",\n variant = \"default\",\n delay = 300,\n disabled = false,\n ...props \n }, ref) => {\n const [isVisible, setIsVisible] = React.useState(false)\n const [coords, setCoords] = React.useState({ x: 0, y: 0 })\n const timeoutRef = React.useRef<number | undefined>(undefined)\n const tooltipRef = React.useRef<HTMLDivElement>(null)\n\n const showTooltip = (e: React.MouseEvent) => {\n if (disabled) return\n \n const rect = e.currentTarget.getBoundingClientRect()\n const tooltipRect = tooltipRef.current?.getBoundingClientRect()\n \n let x = 0\n let y = 0\n \n switch (position) {\n case \"top\":\n x = rect.left + rect.width / 2\n y = rect.top - 8 // 8px 간격\n break\n case \"bottom\":\n x = rect.left + rect.width / 2\n y = rect.bottom + 8 // 8px 간격\n break\n case \"left\":\n x = rect.left - 8 // 8px 간격\n y = rect.top + rect.height / 2\n break\n case \"right\":\n x = rect.right + 8 // 8px 간격\n y = rect.top + rect.height / 2\n break\n }\n \n setCoords({ x, y })\n \n timeoutRef.current = window.setTimeout(() => {\n setIsVisible(true)\n }, delay)\n }\n\n const hideTooltip = () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current)\n }\n setIsVisible(false)\n }\n\n React.useEffect(() => {\n return () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current)\n }\n }\n }, [])\n\n const getVariantClasses = () => {\n switch (variant) {\n case \"light\":\n return \"bg-white text-gray-900 border border-gray-200 shadow-lg\"\n case \"dark\":\n return \"bg-gray-900 text-white shadow-lg\"\n default:\n return \"bg-gray-800 text-white shadow-lg\"\n }\n }\n\n const getPositionClasses = () => {\n switch (position) {\n case \"top\":\n return \"bottom-full left-1/2 -translate-x-1/2 mb-2\" // 8px 간격\n case \"bottom\":\n return \"top-full left-1/2 -translate-x-1/2 mt-2\" // 8px 간격\n case \"left\":\n return \"right-full top-1/2 -translate-y-1/2 mr-2\" // 8px 간격\n case \"right\":\n return \"left-full top-1/2 -translate-y-1/2 ml-2\" // 8px 간격\n default:\n return \"bottom-full left-1/2 -translate-x-1/2 mb-2\"\n }\n }\n\n const getArrowClasses = () => {\n switch (position) {\n case \"top\":\n return \"top-full left-1/2 -translate-x-1/2 border-t-gray-800 dark:border-t-gray-800\"\n case \"bottom\":\n return \"bottom-full left-1/2 -translate-x-1/2 border-b-gray-800 dark:border-b-gray-800\"\n case \"left\":\n return \"left-full top-1/2 -translate-y-1/2 border-l-gray-800 dark:border-l-gray-800\"\n case \"right\":\n return \"right-full top-1/2 -translate-y-1/2 border-r-gray-800 dark:border-r-gray-800\"\n default:\n return \"top-full left-1/2 -translate-x-1/2 border-t-gray-800 dark:border-t-gray-800\"\n }\n }\n\n return (\n <div\n ref={ref}\n className={merge(\"relative inline-block\", className)}\n onMouseEnter={showTooltip}\n onMouseLeave={hideTooltip}\n {...props}\n >\n {children}\n \n {isVisible && (\n <div\n ref={tooltipRef}\n className={merge(\n \"fixed z-50 px-3 py-2 text-sm rounded-lg whitespace-nowrap pointer-events-none\", // 12px, 8px 패딩\n getVariantClasses()\n )}\n style={{\n left: `${coords.x}px`,\n top: `${coords.y}px`,\n transform: 'translate(-50%, -50%)'\n }}\n >\n {content}\n {/* 화살표 */}\n <div\n className={merge(\n \"absolute w-0 h-0 border-4 border-transparent\",\n getArrowClasses()\n )}\n />\n </div>\n )}\n </div>\n )\n }\n)\nTooltip.displayName = \"Tooltip\"\n\n// 편의 컴포넌트들\nexport const TooltipLight = React.forwardRef<HTMLDivElement, Omit<TooltipProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Tooltip ref={ref} variant=\"light\" className={className} {...props} />\n )\n)\nTooltipLight.displayName = \"TooltipLight\"\n\nexport const TooltipDark = React.forwardRef<HTMLDivElement, Omit<TooltipProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Tooltip ref={ref} variant=\"dark\" className={className} {...props} />\n )\n)\nTooltipDark.displayName = \"TooltipDark\"\n\nexport { Tooltip } ","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * Dropdown 컴포넌트의 props / Dropdown component props\n * @typedef {Object} DropdownProps\n * @property {React.ReactNode} trigger - Dropdown을 열기 위한 트리거 요소 / Trigger element to open dropdown\n * @property {React.ReactNode} children - Dropdown 내용 / Dropdown content\n * @property {boolean} [open] - 제어 모드에서 열림/닫힘 상태 / Open/close state in controlled mode\n * @property {(open: boolean) => void} [onOpenChange] - 상태 변경 콜백 / State change callback\n * @property {\"top\" | \"bottom\" | \"left\" | \"right\"} [placement=\"bottom\"] - Dropdown 표시 위치 / Dropdown display position\n * @property {\"start\" | \"center\" | \"end\"} [align=\"start\"] - Dropdown 정렬 / Dropdown alignment\n * @property {number} [offset=8] - 트리거와 Dropdown 사이 간격 (px) / Spacing between trigger and dropdown (px)\n * @property {boolean} [disabled=false] - Dropdown 비활성화 여부 / Disable dropdown\n * @property {boolean} [showArrow=true] - 화살표 표시 여부 / Show arrow\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface DropdownProps extends React.HTMLAttributes<HTMLDivElement> {\n trigger: React.ReactNode\n children: React.ReactNode\n open?: boolean\n onOpenChange?: (open: boolean) => void\n placement?: \"top\" | \"bottom\" | \"left\" | \"right\"\n align?: \"start\" | \"center\" | \"end\"\n offset?: number\n disabled?: boolean\n showArrow?: boolean\n}\n\n/**\n * Dropdown 컴포넌트 / Dropdown component\n * \n * 트리거 요소를 클릭하면 표시되는 드롭다운 메뉴 컴포넌트입니다.\n * 외부 클릭 시 자동으로 닫히며, 뷰포트 경계를 자동으로 감지하여 위치를 조정합니다.\n * \n * Dropdown menu component that appears when the trigger element is clicked.\n * Automatically closes on outside click and adjusts position by detecting viewport boundaries.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Dropdown trigger={<Button>메뉴</Button>}>\n * <Menu>\n * <MenuItem>항목 1</MenuItem>\n * <MenuItem>항목 2</MenuItem>\n * </Menu>\n * </Dropdown>\n * \n * @example\n * // 제어 모드, 화살표 없음 / Controlled mode, no arrow\n * const [open, setOpen] = useState(false)\n * <Dropdown \n * open={open}\n * onOpenChange={setOpen}\n * trigger={<Button>제어 모드</Button>}\n * placement=\"top\"\n * showArrow={false}\n * >\n * <div className=\"p-4\">내용</div>\n * </Dropdown>\n * \n * @param {DropdownProps} props - Dropdown 컴포넌트의 props / Dropdown component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} Dropdown 컴포넌트 / Dropdown component\n */\nconst Dropdown = React.forwardRef<HTMLDivElement, DropdownProps>(\n ({ \n className, \n trigger,\n children,\n open: controlledOpen,\n onOpenChange,\n placement = \"bottom\",\n align = \"start\",\n offset = 8,\n disabled = false,\n showArrow = true,\n ...props \n }, ref) => {\n const [internalOpen, setInternalOpen] = React.useState(false)\n const [coords, setCoords] = React.useState({ x: 0, y: 0 })\n const triggerRef = React.useRef<HTMLDivElement>(null)\n const dropdownRef = React.useRef<HTMLDivElement>(null)\n const isControlled = controlledOpen !== undefined\n const isOpen = isControlled ? controlledOpen : internalOpen\n\n const handleOpenChange = (newOpen: boolean) => {\n if (disabled) return\n \n if (!isControlled) {\n setInternalOpen(newOpen)\n }\n onOpenChange?.(newOpen)\n }\n\n const handleTriggerClick = () => {\n handleOpenChange(!isOpen)\n }\n\n const updatePosition = React.useCallback(() => {\n if (!triggerRef.current || !dropdownRef.current) return\n\n const triggerRect = triggerRef.current.getBoundingClientRect()\n const dropdownRect = dropdownRef.current.getBoundingClientRect()\n const viewportWidth = window.innerWidth\n const viewportHeight = window.innerHeight\n\n let x = 0\n let y = 0\n\n // 기본 위치 계산\n switch (placement) {\n case \"top\":\n x = triggerRect.left\n y = triggerRect.top - offset\n break\n case \"bottom\":\n x = triggerRect.left\n y = triggerRect.bottom + offset\n break\n case \"left\":\n x = triggerRect.left - offset\n y = triggerRect.top\n break\n case \"right\":\n x = triggerRect.right + offset\n y = triggerRect.top\n break\n }\n\n // 정렬 조정\n switch (align) {\n case \"center\":\n if (placement === \"top\" || placement === \"bottom\") {\n x = triggerRect.left + triggerRect.width / 2 - dropdownRect.width / 2\n } else {\n y = triggerRect.top + triggerRect.height / 2 - dropdownRect.height / 2\n }\n break\n case \"end\":\n if (placement === \"top\" || placement === \"bottom\") {\n x = triggerRect.right - dropdownRect.width\n } else {\n y = triggerRect.bottom - dropdownRect.height\n }\n break\n case \"start\":\n default:\n // 기본값은 이미 start 정렬\n break\n }\n\n // 뷰포트 경계 확인 및 조정\n if (x < 8) x = 8 // 8px 여백\n if (x + dropdownRect.width > viewportWidth - 8) {\n x = viewportWidth - dropdownRect.width - 8 // 8px 여백\n }\n if (y < 8) y = 8 // 8px 여백\n if (y + dropdownRect.height > viewportHeight - 8) {\n y = viewportHeight - dropdownRect.height - 8 // 8px 여백\n }\n\n setCoords({ x, y })\n }, [placement, align, offset])\n\n React.useEffect(() => {\n if (isOpen) {\n updatePosition()\n window.addEventListener('resize', updatePosition)\n window.addEventListener('scroll', updatePosition)\n \n return () => {\n window.removeEventListener('resize', updatePosition)\n window.removeEventListener('scroll', updatePosition)\n }\n }\n }, [isOpen, updatePosition])\n\n React.useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n triggerRef.current && \n dropdownRef.current && \n !triggerRef.current.contains(event.target as Node) &&\n !dropdownRef.current.contains(event.target as Node)\n ) {\n handleOpenChange(false)\n }\n }\n\n if (isOpen) {\n document.addEventListener('mousedown', handleClickOutside)\n return () => {\n document.removeEventListener('mousedown', handleClickOutside)\n }\n }\n }, [isOpen])\n\n const getPlacementClasses = () => {\n switch (placement) {\n case \"top\":\n return \"bottom-full left-0 mb-2\" // 8px 간격\n case \"bottom\":\n return \"top-full left-0 mt-2\" // 8px 간격\n case \"left\":\n return \"right-full top-0 mr-2\" // 8px 간격\n case \"right\":\n return \"left-full top-0 ml-2\" // 8px 간격\n default:\n return \"top-full left-0 mt-2\"\n }\n }\n\n const getArrowClasses = () => {\n switch (placement) {\n case \"top\":\n return \"top-full left-4 -translate-x-1/2 border-t-gray-100 dark:border-t-gray-800\"\n case \"bottom\":\n return \"bottom-full left-4 -translate-x-1/2 border-b-gray-100 dark:border-b-gray-800\"\n case \"left\":\n return \"left-full top-4 -translate-y-1/2 border-l-gray-100 dark:border-l-gray-800\"\n case \"right\":\n return \"right-full top-4 -translate-y-1/2 border-r-gray-100 dark:border-r-gray-800\"\n default:\n return \"bottom-full left-4 -translate-x-1/2 border-b-gray-100 dark:border-b-gray-800\"\n }\n }\n\n return (\n <div ref={ref} className={merge(\"relative\", className)} {...props}>\n {/* 트리거 */}\n <div\n ref={triggerRef}\n onClick={handleTriggerClick}\n className=\"inline-block cursor-pointer\"\n >\n {trigger}\n </div>\n\n {/* 드롭다운 */}\n {isOpen && (\n <div\n ref={dropdownRef}\n className={merge(\n \"absolute z-50 bg-white dark:bg-gray-800 rounded-lg shadow-xl backdrop-blur-sm\", // 보더 대신 섀도우 사용\n \"min-w-[200px] py-2\", // 16px 패딩\n getPlacementClasses()\n )}\n style={{\n transform: `translate(${coords.x}px, ${coords.y}px)`,\n boxShadow: \"0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04)\"\n }}\n >\n {/* 화살표 */}\n {showArrow && (\n <div\n className={merge(\n \"absolute w-0 h-0 border-4 border-transparent\",\n getArrowClasses()\n )}\n />\n )}\n \n {/* 내용 */}\n <div className=\"relative z-10\">\n {children}\n </div>\n </div>\n )}\n </div>\n )\n }\n)\nDropdown.displayName = \"Dropdown\"\n\n// 드롭다운 아이템 컴포넌트들\nexport interface DropdownItemProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n icon?: React.ReactNode\n variant?: \"default\" | \"destructive\" | \"disabled\"\n}\n\nconst DropdownItem = React.forwardRef<HTMLButtonElement, DropdownItemProps>(\n ({ \n className, \n icon,\n variant = \"default\",\n children,\n disabled,\n ...props \n }, ref) => {\n const getVariantClasses = () => {\n switch (variant) {\n case \"destructive\":\n return \"text-red-600 dark:text-red-400 hover:bg-red-50 dark:hover:bg-red-900/20\"\n case \"disabled\":\n return \"text-gray-400 dark:text-gray-500 cursor-not-allowed\"\n default:\n return \"text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700\"\n }\n }\n\n return (\n <button\n ref={ref}\n className={merge(\n \"w-full flex items-center gap-3 px-4 py-3 text-sm font-medium transition-colors focus:outline-none focus:bg-gray-100 dark:focus:bg-gray-700\", // 16px, 12px 패딩\n getVariantClasses(),\n className\n )}\n disabled={disabled || variant === \"disabled\"}\n {...props}\n >\n {icon && (\n <div className=\"flex-shrink-0 w-4 h-4\">\n {icon}\n </div>\n )}\n <span className=\"flex-1 text-left\">{children}</span>\n </button>\n )\n }\n)\nDropdownItem.displayName = \"DropdownItem\"\n\nexport interface DropdownSeparatorProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nconst DropdownSeparator = React.forwardRef<HTMLDivElement, DropdownSeparatorProps>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"h-px bg-gray-200 dark:bg-gray-700 my-2\", className)} // 8px 여백\n {...props}\n />\n )\n)\nDropdownSeparator.displayName = \"DropdownSeparator\"\n\nexport interface DropdownLabelProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nconst DropdownLabel = React.forwardRef<HTMLDivElement, DropdownLabelProps>(\n ({ className, children, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"px-4 py-2 text-xs font-semibold text-gray-500 dark:text-gray-400 uppercase tracking-wide\", className)} // 16px, 8px 패딩\n {...props}\n >\n {children}\n </div>\n )\n)\nDropdownLabel.displayName = \"DropdownLabel\"\n\n// 편의 컴포넌트들\nconst DropdownMenu = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, children, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"py-1\", className)} // 4px 패딩\n {...props}\n >\n {children}\n </div>\n )\n)\nDropdownMenu.displayName = \"DropdownMenu\"\n\nconst DropdownGroup = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, children, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"space-y-1\", className)} // 4px 간격\n {...props}\n >\n {children}\n </div>\n )\n)\nDropdownGroup.displayName = \"DropdownGroup\"\n\nexport { Dropdown, DropdownItem, DropdownSeparator, DropdownLabel, DropdownMenu, DropdownGroup } ","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\nimport { Icon } from \"./Icon\"\n\n/**\n * Drawer 컴포넌트의 props / Drawer component props\n * @typedef {Object} DrawerProps\n * @property {boolean} open - Drawer 열림/닫힘 상태 / Drawer open/close state\n * @property {(open: boolean) => void} onOpenChange - 상태 변경 콜백 / State change callback\n * @property {React.ReactNode} children - Drawer 내용 / Drawer content\n * @property {string} [className] - 추가 CSS 클래스 / Additional CSS class\n * @property {\"left\" | \"right\" | \"top\" | \"bottom\"} [side=\"right\"] - Drawer 표시 위치 / Drawer display position\n * @property {\"sm\" | \"md\" | \"lg\" | \"xl\" | \"full\"} [size=\"md\"] - Drawer 크기 / Drawer size\n * @property {boolean} [showBackdrop=true] - 배경 오버레이 표시 여부 / Show backdrop overlay\n * @property {string} [backdropClassName] - 배경 오버레이 추가 CSS 클래스 / Backdrop overlay additional CSS class\n * @property {boolean} [closeOnBackdropClick=true] - 배경 클릭 시 닫기 여부 / Close on backdrop click\n * @property {boolean} [closeOnEscape=true] - ESC 키로 닫기 여부 / Close on ESC key\n */\ninterface DrawerProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n children: React.ReactNode\n className?: string\n side?: \"left\" | \"right\" | \"top\" | \"bottom\"\n size?: \"sm\" | \"md\" | \"lg\" | \"xl\" | \"full\"\n showBackdrop?: boolean\n backdropClassName?: string\n closeOnBackdropClick?: boolean\n closeOnEscape?: boolean\n}\n\n/**\n * Drawer 컴포넌트 / Drawer component\n * \n * 사이드에서 슬라이드되는 패널 컴포넌트입니다.\n * Modal과 유사하지만 특정 방향에서 슬라이드되는 애니메이션을 제공합니다.\n * ESC 키로 닫기, 배경 클릭으로 닫기 기능을 지원합니다.\n * \n * Panel component that slides from the side.\n * Similar to Modal but provides slide animation from a specific direction.\n * Supports closing with ESC key and backdrop click.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * const [open, setOpen] = useState(false)\n * \n * <Drawer open={open} onOpenChange={setOpen}>\n * <DrawerHeader>제목</DrawerHeader>\n * <DrawerContent>내용</DrawerContent>\n * <DrawerFooter>\n * <Button onClick={() => setOpen(false)}>닫기</Button>\n * </DrawerFooter>\n * </Drawer>\n * \n * @example\n * // 왼쪽에서 열기 / Open from left\n * <Drawer open={open} onOpenChange={setOpen} side=\"left\" size=\"lg\">\n * <DrawerContent>사이드바 내용</DrawerContent>\n * </Drawer>\n * \n * @param {DrawerProps} props - Drawer 컴포넌트의 props / Drawer component props\n * @param {React.Ref<HTMLDivElement>} ref - Drawer 컨테이너 ref / Drawer container ref\n * @returns {JSX.Element} Drawer 컴포넌트 / Drawer component\n * \n * @todo 접근성 개선: role=\"dialog\", aria-modal=\"true\" 추가 필요 / Accessibility: Add role=\"dialog\", aria-modal=\"true\"\n * @todo 접근성 개선: aria-labelledby, aria-describedby 연결 필요 / Accessibility: Connect aria-labelledby, aria-describedby\n */\nconst Drawer = React.forwardRef<HTMLDivElement, DrawerProps>(\n ({ \n open, \n onOpenChange, \n children, \n className,\n side = \"right\",\n size = \"md\",\n showBackdrop = true,\n backdropClassName,\n closeOnBackdropClick = true,\n closeOnEscape = true,\n ...props \n }, ref) => {\n const [isVisible, setIsVisible] = React.useState(false)\n const [isAnimating, setIsAnimating] = React.useState(false)\n\n React.useEffect(() => {\n if (open) {\n setIsVisible(true)\n setIsAnimating(true)\n // 애니메이션 시작을 위한 지연\n const timer = setTimeout(() => setIsAnimating(false), 50)\n return () => clearTimeout(timer)\n } else {\n setIsAnimating(true)\n const timer = setTimeout(() => {\n setIsVisible(false)\n setIsAnimating(false)\n }, 300) // 애니메이션 완료 후 숨김\n return () => clearTimeout(timer)\n }\n }, [open])\n\n React.useEffect(() => {\n if (!closeOnEscape) return\n\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === \"Escape\" && open) {\n onOpenChange(false)\n }\n }\n\n if (open) {\n document.addEventListener(\"keydown\", handleEscape)\n document.body.style.overflow = \"hidden\"\n }\n\n return () => {\n document.removeEventListener(\"keydown\", handleEscape)\n document.body.style.overflow = \"\"\n }\n }, [open, closeOnEscape, onOpenChange])\n\n if (!isVisible) return null\n\n const sizeClasses = {\n sm: side === \"left\" || side === \"right\" ? \"w-80\" : \"h-64\",\n md: side === \"left\" || side === \"right\" ? \"w-96\" : \"h-96\",\n lg: side === \"left\" || side === \"right\" ? \"w-[28rem]\" : \"h-[32rem]\",\n xl: side === \"left\" || side === \"right\" ? \"w-[32rem]\" : \"h-[40rem]\",\n full: side === \"left\" || side === \"right\" ? \"w-full\" : \"h-full\"\n }\n\n const sideClasses = {\n left: \"left-0 top-0 h-full translate-x-0\",\n right: \"right-0 top-0 h-full translate-x-0\",\n top: \"top-0 left-0 w-full translate-y-0\",\n bottom: \"bottom-0 left-0 w-full translate-y-0\"\n }\n\n const transformClasses = {\n left: isAnimating ? (open ? \"translate-x-0\" : \"-translate-x-full\") : \"\",\n right: isAnimating ? (open ? \"translate-x-0\" : \"translate-x-full\") : \"\",\n top: isAnimating ? (open ? \"translate-y-0\" : \"-translate-y-full\") : \"\",\n bottom: isAnimating ? (open ? \"translate-y-0\" : \"translate-y-full\") : \"\"\n }\n\n return (\n <div className=\"fixed inset-0 z-50\">\n {/* Backdrop */}\n {showBackdrop && (\n <div\n className={merge(\n \"absolute inset-0 bg-black/60 backdrop-blur-md transition-opacity duration-300\",\n isAnimating ? (open ? \"opacity-100\" : \"opacity-0\") : \"\",\n backdropClassName\n )}\n onClick={closeOnBackdropClick ? () => onOpenChange(false) : undefined}\n />\n )}\n\n {/* Drawer Content */}\n <div\n ref={ref}\n className={merge(\n \"absolute bg-white/95 dark:!bg-gray-800/95 backdrop-blur-xl border border-gray-200/50 dark:!border-gray-600/50 shadow-2xl transition-transform duration-300 ease-out\",\n sizeClasses[size],\n sideClasses[side],\n transformClasses[side],\n className\n )}\n {...props}\n >\n {children}\n </div>\n </div>\n )\n }\n)\nDrawer.displayName = \"Drawer\"\n\n/**\n * DrawerHeader 컴포넌트의 props / DrawerHeader component props\n * @typedef {Object} DrawerHeaderProps\n * @property {React.ReactNode} children - 헤더 내용 / Header content\n * @property {string} [className] - 추가 CSS 클래스 / Additional CSS class\n * @property {boolean} [showCloseButton=true] - 닫기 버튼 표시 여부 / Show close button\n * @property {() => void} [onClose] - 닫기 버튼 클릭 콜백 / Close button click callback\n */\ninterface DrawerHeaderProps {\n children: React.ReactNode\n className?: string\n showCloseButton?: boolean\n onClose?: () => void\n}\n\n/**\n * DrawerHeader 컴포넌트 / DrawerHeader component\n * Drawer의 헤더 영역을 표시합니다.\n * Displays the header area of a Drawer.\n * \n * @component\n * @param {DrawerHeaderProps} props - DrawerHeader 컴포넌트의 props / DrawerHeader component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} DrawerHeader 컴포넌트 / DrawerHeader component\n */\nconst DrawerHeader = React.forwardRef<HTMLDivElement, DrawerHeaderProps>(\n ({ children, className, showCloseButton = true, onClose, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={merge(\"flex items-center justify-between p-6 border-b border-gray-200/50 dark:border-gray-700/50\", className)}\n {...props}\n >\n <div className=\"flex-1\">{children}</div>\n {showCloseButton && (\n <button\n onClick={onClose}\n className=\"p-2 rounded-lg hover:bg-gray-100/80 dark:hover:bg-gray-800/80 transition-colors\"\n >\n <Icon name=\"close\" size={20} />\n </button>\n )}\n </div>\n )\n }\n)\nDrawerHeader.displayName = \"DrawerHeader\"\n\n/**\n * DrawerContent 컴포넌트의 props / DrawerContent component props\n * @typedef {Object} DrawerContentProps\n * @property {React.ReactNode} children - 콘텐츠 / Content\n * @property {string} [className] - 추가 CSS 클래스 / Additional CSS class\n */\ninterface DrawerContentProps {\n children: React.ReactNode\n className?: string\n}\n\n/**\n * DrawerContent 컴포넌트 / DrawerContent component\n * Drawer의 메인 콘텐츠 영역을 표시합니다.\n * Displays the main content area of a Drawer.\n * \n * @component\n * @param {DrawerContentProps} props - DrawerContent 컴포넌트의 props / DrawerContent component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} DrawerContent 컴포넌트 / DrawerContent component\n */\nconst DrawerContent = React.forwardRef<HTMLDivElement, DrawerContentProps>(\n ({ children, className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={merge(\"flex-1 p-6 overflow-y-auto\", className)}\n {...props}\n >\n {children}\n </div>\n )\n }\n)\nDrawerContent.displayName = \"DrawerContent\"\n\n/**\n * DrawerFooter 컴포넌트의 props / DrawerFooter component props\n * @typedef {Object} DrawerFooterProps\n * @property {React.ReactNode} children - 푸터 내용 / Footer content\n * @property {string} [className] - 추가 CSS 클래스 / Additional CSS class\n */\ninterface DrawerFooterProps {\n children: React.ReactNode\n className?: string\n}\n\n/**\n * DrawerFooter 컴포넌트 / DrawerFooter component\n * Drawer의 푸터 영역을 표시합니다. 주로 액션 버튼을 배치합니다.\n * Displays the footer area of a Drawer. Typically used for action buttons.\n * \n * @component\n * @param {DrawerFooterProps} props - DrawerFooter 컴포넌트의 props / DrawerFooter component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} DrawerFooter 컴포넌트 / DrawerFooter component\n */\nconst DrawerFooter = React.forwardRef<HTMLDivElement, DrawerFooterProps>(\n ({ children, className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={merge(\"flex items-center justify-end gap-3 p-6 border-t border-gray-200/50 dark:border-gray-700/50\", className)}\n {...props}\n >\n {children}\n </div>\n )\n }\n)\nDrawerFooter.displayName = \"DrawerFooter\"\n\nexport { Drawer, DrawerHeader, DrawerContent, DrawerFooter } "]}
|
|
@@ -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 {l}from'./chunk-UGSYQDR4.mjs';import {a}from'./chunk-UUHAXGMO.mjs';import f,{useState,useEffect}from'react';import {jsxs,jsx}from'react/jsx-runtime';var M=f.forwardRef(({className:t,prevPage:e,nextPage:i,showOnMobile:o=false,...n},m)=>!e&&!i?null:jsxs("div",{ref:m,className:a("flex items-center justify-between py-4",!o&&"hidden md:flex",t),...n,children:[jsx("div",{className:"flex-1",children:e&&jsxs("a",{href:e.href,className:"group inline-flex items-center text-sm text-slate-600 hover:text-slate-900 dark:text-slate-400 dark:hover:text-slate-100 transition-colors",children:[jsx(l,{name:"chevronLeft",className:"w-4 h-4 mr-2 transition-transform group-hover:-translate-x-1"}),jsx("span",{className:"hidden sm:inline",children:e.title})]})}),jsx("div",{className:"flex-1 flex justify-end",children:i&&jsxs("a",{href:i.href,className:"group inline-flex items-center text-sm text-slate-600 hover:text-slate-900 dark:text-slate-400 dark:hover:text-slate-100 transition-colors",children:[jsx("span",{className:"hidden sm:inline mr-2",children:i.title}),jsx(l,{name:"chevronRight",className:"w-4 h-4 transition-transform group-hover:translate-x-1"})]})})]}));M.displayName="PageNavigation";function h({className:t,size:e="md",variant:i="default",text:o,color:n="default"}){let m={sm:"w-6 h-6",md:"w-8 h-8",lg:"w-12 h-12",xl:"w-16 h-16"},s={default:"border-gray-300 border-t-gray-600 dark:border-gray-600 dark:border-t-gray-300",primary:"border-blue-300 border-t-blue-600 dark:border-blue-600 dark:border-t-blue-300",secondary:"border-gray-300 border-t-gray-600 dark:border-gray-600 dark:border-t-gray-300",success:"border-green-300 border-t-green-600 dark:border-green-600 dark:border-t-green-300",warning:"border-yellow-300 border-t-yellow-600 dark:border-yellow-600 dark:border-t-yellow-300",error:"border-red-300 border-t-red-600 dark:border-red-600 dark:border-t-red-300",glass:"border-white/30 border-t-white/50 dark:border-slate-600/50 dark:border-t-slate-400/50"},d=()=>{switch(i){case "dots":return jsxs("div",{className:"flex space-x-1",children:[jsx("div",{className:"w-2 h-2 bg-current rounded-full animate-bounce"}),jsx("div",{className:"w-2 h-2 bg-current rounded-full animate-bounce delay-100"}),jsx("div",{className:"w-2 h-2 bg-current rounded-full animate-bounce delay-200"})]});case "bars":return jsxs("div",{className:"flex space-x-1 h-full items-end",children:[jsx("div",{className:"w-1 bg-current animate-pulse",style:{height:"60%"}}),jsx("div",{className:"w-1 bg-current animate-pulse delay-100",style:{height:"80%"}}),jsx("div",{className:"w-1 bg-current animate-pulse delay-200",style:{height:"40%"}}),jsx("div",{className:"w-1 bg-current animate-pulse delay-300",style:{height:"100%"}}),jsx("div",{className:"w-1 bg-current animate-pulse delay-500",style:{height:"70%"}})]});case "ring":return jsx("div",{className:a("animate-spin rounded-full border-2",s[n]||s.default)});case "ripple":return jsxs("div",{className:"relative",children:[jsx("div",{className:a("absolute inset-0 rounded-full border-2 animate-ping",s[n]||s.default)}),jsx("div",{className:a("rounded-full border-2",s[n]||s.default)})]});default:return jsx("div",{className:a("animate-spin rounded-full border-2",s[n]||s.default)})}};return jsxs("div",{className:a("flex flex-col items-center justify-center",t),children:[jsx("div",{className:a(m[e],"text-gray-600 dark:text-gray-400"),children:d()}),o&&jsx("p",{className:"mt-3 text-sm text-gray-600 dark:text-gray-400 text-center",children:o})]})}var u=f.forwardRef(({children:t,className:e,duration:i=300,variant:o="fade",loadingVariant:n="ripple",loadingText:m="\uD398\uC774\uC9C0 \uB85C\uB529 \uC911...",showLoading:s=true,onTransitionStart:d,onTransitionEnd:p},N)=>{let[w,k]=useState(true),[g,T]=useState(false);useEffect(()=>{let L=setTimeout(()=>{k(false),T(true),p==null||p();},i);return d==null||d(),()=>clearTimeout(L)},[i,d,p]);let P={fade:a("transition-opacity duration-300 ease-in-out",g?"opacity-100":"opacity-0"),slide:a("transition-transform duration-300 ease-in-out",g?"translate-x-0":"translate-x-full"),scale:a("transition-all duration-300 ease-in-out",g?"scale-100 opacity-100":"scale-95 opacity-0"),flip:a("transition-all duration-500 ease-in-out",g?"rotate-y-0 opacity-100":"rotate-y-90 opacity-0")};return w&&s?jsx("div",{className:a("flex flex-col items-center justify-center min-h-screen bg-gradient-to-br from-blue-50 to-purple-50 dark:from-slate-900 dark:to-slate-800",e),children:jsx(h,{size:"lg",variant:n,text:m})}):jsx("div",{ref:N,className:a("w-full",P[o],e),style:{transitionDuration:`${i}ms`},children:t})});u.displayName="PageTransition";var H=f.forwardRef((t,e)=>jsx(u,{ref:e,variant:"fade",...t})),S=f.forwardRef((t,e)=>jsx(u,{ref:e,variant:"slide",...t})),O=f.forwardRef((t,e)=>jsx(u,{ref:e,variant:"scale",...t})),E=f.forwardRef((t,e)=>jsx(u,{ref:e,variant:"flip",...t}));H.displayName="FadeTransition";S.displayName="SlideTransition";O.displayName="ScaleTransition";E.displayName="FlipTransition";export{M as a,h as b,u as c};//# sourceMappingURL=chunk-MXGXBG63.mjs.map
|
|
2
|
+
//# sourceMappingURL=chunk-MXGXBG63.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/PageNavigation.tsx","../src/components/LoadingSpinner.tsx","../src/components/PageTransition.tsx"],"names":["PageNavigation","React","className","prevPage","nextPage","showOnMobile","props","ref","jsxs","merge","jsx","Icon","LoadingSpinner","size","variant","text","color","sizeClasses","spinnerColors","renderSpinner","PageTransition","children","duration","loadingVariant","loadingText","showLoading","onTransitionStart","onTransitionEnd","isLoading","setIsLoading","useState","isVisible","setIsVisible","useEffect","timer","transitionClasses","FadeTransition","SlideTransition","ScaleTransition","FlipTransition"],"mappings":"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","file":"chunk-MXGXBG63.mjs","sourcesContent":["\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\nimport { Icon } from \"./Icon\"\n\n/**\n * PageNavigation 컴포넌트의 props / PageNavigation component props\n * @typedef {Object} PageNavigationProps\n * @property {Object} [prevPage] - 이전 페이지 정보 / Previous page information\n * @property {string} prevPage.title - 이전 페이지 제목 / Previous page title\n * @property {string} prevPage.href - 이전 페이지 링크 / Previous page link\n * @property {Object} [nextPage] - 다음 페이지 정보 / Next page information\n * @property {string} nextPage.title - 다음 페이지 제목 / Next page title\n * @property {string} nextPage.href - 다음 페이지 링크 / Next page link\n * @property {boolean} [showOnMobile=false] - 모바일에서 표시 여부 / Show on mobile\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface PageNavigationProps extends React.HTMLAttributes<HTMLDivElement> {\n prevPage?: {\n title: string\n href: string\n }\n nextPage?: {\n title: string\n href: string\n }\n showOnMobile?: boolean\n}\n\n/**\n * PageNavigation 컴포넌트 / PageNavigation component\n * \n * 이전/다음 페이지로 이동하는 네비게이션 컴포넌트입니다.\n * 문서 페이지나 가이드 페이지에서 사용하기 적합합니다.\n * \n * Navigation component for moving to previous/next pages.\n * Suitable for documentation or guide pages.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <PageNavigation\n * prevPage={{ title: \"이전 페이지\", href: \"/prev\" }}\n * nextPage={{ title: \"다음 페이지\", href: \"/next\" }}\n * />\n * \n * @param {PageNavigationProps} props - PageNavigation 컴포넌트의 props / PageNavigation component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} PageNavigation 컴포넌트 / PageNavigation component\n */\nconst PageNavigation = React.forwardRef<HTMLDivElement, PageNavigationProps>(\n ({ \n className, \n prevPage, \n nextPage, \n showOnMobile = false,\n ...props \n }, ref) => {\n if (!prevPage && !nextPage) {\n return null\n }\n\n return (\n <div\n ref={ref}\n className={merge(\n \"flex items-center justify-between py-4\",\n !showOnMobile && \"hidden md:flex\",\n className\n )}\n {...props}\n >\n {/* 이전 페이지 */}\n <div className=\"flex-1\">\n {prevPage && (\n <a\n href={prevPage.href}\n className=\"group inline-flex items-center text-sm text-slate-600 hover:text-slate-900 dark:text-slate-400 dark:hover:text-slate-100 transition-colors\"\n >\n <Icon \n name=\"chevronLeft\" \n className=\"w-4 h-4 mr-2 transition-transform group-hover:-translate-x-1\" \n />\n <span className=\"hidden sm:inline\">{prevPage.title}</span>\n </a>\n )}\n </div>\n\n {/* 다음 페이지 */}\n <div className=\"flex-1 flex justify-end\">\n {nextPage && (\n <a\n href={nextPage.href}\n className=\"group inline-flex items-center text-sm text-slate-600 hover:text-slate-900 dark:text-slate-400 dark:hover:text-slate-100 transition-colors\"\n >\n <span className=\"hidden sm:inline mr-2\">{nextPage.title}</span>\n <Icon \n name=\"chevronRight\" \n className=\"w-4 h-4 transition-transform group-hover:translate-x-1\" \n />\n </a>\n )}\n </div>\n </div>\n )\n }\n)\nPageNavigation.displayName = \"PageNavigation\"\n\nexport { PageNavigation } ","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * LoadingSpinner 컴포넌트의 props / LoadingSpinner component props\n * @typedef {Object} LoadingSpinnerProps\n * @property {\"sm\" | \"md\" | \"lg\" | \"xl\"} [size=\"md\"] - Spinner 크기 / Spinner size\n * @property {\"default\" | \"dots\" | \"bars\" | \"ring\" | \"ripple\"} [variant=\"default\"] - Spinner 애니메이션 타입 / Spinner animation type\n * @property {string} [text] - Spinner 아래 표시할 텍스트 / Text to display below spinner\n * @property {\"default\" | \"primary\" | \"secondary\" | \"success\" | \"warning\" | \"error\" | \"glass\"} [color=\"default\"] - Spinner 색상 / Spinner color\n * @property {string} [className] - 추가 CSS 클래스 / Additional CSS class\n */\nexport interface LoadingSpinnerProps {\n size?: \"sm\" | \"md\" | \"lg\" | \"xl\"\n variant?: \"default\" | \"dots\" | \"bars\" | \"ring\" | \"ripple\"\n text?: string\n color?: \"default\" | \"primary\" | \"secondary\" | \"success\" | \"warning\" | \"error\" | \"glass\"\n className?: string\n}\n\n/**\n * LoadingSpinner 컴포넌트 / LoadingSpinner component\n * \n * 로딩 상태를 표시하는 스피너 컴포넌트입니다.\n * 다양한 애니메이션 타입과 크기를 지원합니다.\n * \n * Spinner component that displays loading state.\n * Supports various animation types and sizes.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <LoadingSpinner />\n * \n * @example\n * // 텍스트와 함께 / With text\n * <LoadingSpinner \n * text=\"로딩 중...\"\n * size=\"lg\"\n * color=\"primary\"\n * />\n * \n * @example\n * // 다양한 애니메이션 / Various animations\n * <LoadingSpinner variant=\"dots\" />\n * <LoadingSpinner variant=\"bars\" color=\"success\" />\n * <LoadingSpinner variant=\"ripple\" size=\"xl\" />\n * \n * @param {LoadingSpinnerProps} props - LoadingSpinner 컴포넌트의 props / LoadingSpinner component props\n * @returns {JSX.Element} LoadingSpinner 컴포넌트 / LoadingSpinner component\n */\nexport function LoadingSpinner({ \n className, \n size = \"md\", \n variant = \"default\", \n text, \n color = \"default\" \n}: LoadingSpinnerProps) {\n const sizeClasses = {\n sm: \"w-6 h-6\", // 24px - 더 넉넉한 크기\n md: \"w-8 h-8\", // 32px - 더 넉넉한 크기\n lg: \"w-12 h-12\", // 48px - 더 넉넉한 크기\n xl: \"w-16 h-16\" // 64px - 더 넉넉한 크기\n }\n\n // LoadingSpinner는 border 색상을 사용하므로 특화 색상 시스템 사용\n const spinnerColors: Record<string, string> = {\n default: \"border-gray-300 border-t-gray-600 dark:border-gray-600 dark:border-t-gray-300\",\n primary: \"border-blue-300 border-t-blue-600 dark:border-blue-600 dark:border-t-blue-300\",\n secondary: \"border-gray-300 border-t-gray-600 dark:border-gray-600 dark:border-t-gray-300\",\n success: \"border-green-300 border-t-green-600 dark:border-green-600 dark:border-t-green-300\",\n warning: \"border-yellow-300 border-t-yellow-600 dark:border-yellow-600 dark:border-t-yellow-300\",\n error: \"border-red-300 border-t-red-600 dark:border-red-600 dark:border-t-red-300\",\n glass: \"border-white/30 border-t-white/50 dark:border-slate-600/50 dark:border-t-slate-400/50\"\n }\n\n const renderSpinner = () => {\n switch (variant) {\n case \"dots\":\n return (\n <div className=\"flex space-x-1\">\n <div className=\"w-2 h-2 bg-current rounded-full animate-bounce\" />\n <div className=\"w-2 h-2 bg-current rounded-full animate-bounce delay-100\" />\n <div className=\"w-2 h-2 bg-current rounded-full animate-bounce delay-200\" />\n </div>\n )\n case \"bars\":\n return (\n <div className=\"flex space-x-1 h-full items-end\">\n <div className=\"w-1 bg-current animate-pulse\" style={{ height: '60%' }} />\n <div className=\"w-1 bg-current animate-pulse delay-100\" style={{ height: '80%' }} />\n <div className=\"w-1 bg-current animate-pulse delay-200\" style={{ height: '40%' }} />\n <div className=\"w-1 bg-current animate-pulse delay-300\" style={{ height: '100%' }} />\n <div className=\"w-1 bg-current animate-pulse delay-500\" style={{ height: '70%' }} />\n </div>\n )\n case \"ring\":\n return (\n <div className={merge(\n \"animate-spin rounded-full border-2\",\n spinnerColors[color] || spinnerColors.default\n )} />\n )\n case \"ripple\":\n return (\n <div className=\"relative\">\n <div className={merge(\n \"absolute inset-0 rounded-full border-2 animate-ping\",\n spinnerColors[color] || spinnerColors.default\n )} />\n <div className={merge(\n \"rounded-full border-2\",\n spinnerColors[color] || spinnerColors.default\n )} />\n </div>\n )\n default:\n return (\n <div className={merge(\n \"animate-spin rounded-full border-2\",\n spinnerColors[color] || spinnerColors.default\n )} />\n )\n }\n }\n\n return (\n <div className={merge(\"flex flex-col items-center justify-center\", className)}>\n <div className={merge(sizeClasses[size], \"text-gray-600 dark:text-gray-400\")}>\n {renderSpinner()}\n </div>\n {text && (\n <p className=\"mt-3 text-sm text-gray-600 dark:text-gray-400 text-center\">\n {text}\n </p>\n )}\n </div>\n )\n} ","'use client'\n\nimport React, { useState, useEffect } from 'react'\nimport { merge } from '../lib/utils'\nimport { LoadingSpinner } from './LoadingSpinner'\n\n/**\n * PageTransition 컴포넌트의 props / PageTransition component props\n * @typedef {Object} PageTransitionProps\n * @property {React.ReactNode} children - 페이지 내용 / Page content\n * @property {string} [className] - 추가 CSS 클래스 / Additional CSS class\n * @property {number} [duration=300] - 전환 지속 시간 (ms) / Transition duration (ms)\n * @property {'fade' | 'slide' | 'scale' | 'flip'} [variant='fade'] - 전환 애니메이션 타입 / Transition animation type\n * @property {'default' | 'dots' | 'bars' | 'ring' | 'ripple'} [loadingVariant='ripple'] - 로딩 스피너 타입 / Loading spinner type\n * @property {string} [loadingText='페이지 로딩 중...'] - 로딩 텍스트 / Loading text\n * @property {boolean} [showLoading=true] - 로딩 표시 여부 / Show loading\n * @property {() => void} [onTransitionStart] - 전환 시작 콜백 / Transition start callback\n * @property {() => void} [onTransitionEnd] - 전환 종료 콜백 / Transition end callback\n */\nexport interface PageTransitionProps {\n children: React.ReactNode\n className?: string\n duration?: number\n variant?: 'fade' | 'slide' | 'scale' | 'flip'\n loadingVariant?: 'default' | 'dots' | 'bars' | 'ring' | 'ripple'\n loadingText?: string\n showLoading?: boolean\n onTransitionStart?: () => void\n onTransitionEnd?: () => void\n}\n\n/**\n * PageTransition 컴포넌트 / PageTransition component\n * \n * 페이지 전환 애니메이션을 제공하는 컴포넌트입니다.\n * 다양한 전환 효과와 로딩 스피너를 지원합니다.\n * \n * Component that provides page transition animations.\n * Supports various transition effects and loading spinners.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <PageTransition>\n * <div>페이지 내용</div>\n * </PageTransition>\n * \n * @example\n * // Slide 전환 / Slide transition\n * <PageTransition\n * variant=\"slide\"\n * duration={500}\n * loadingVariant=\"dots\"\n * >\n * <div>페이지 내용</div>\n * </PageTransition>\n * \n * @param {PageTransitionProps} props - PageTransition 컴포넌트의 props / PageTransition component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} PageTransition 컴포넌트 / PageTransition component\n */\nexport const PageTransition = React.forwardRef<HTMLDivElement, PageTransitionProps>(({\n children,\n className,\n duration = 300,\n variant = 'fade',\n loadingVariant = 'ripple',\n loadingText = '페이지 로딩 중...',\n showLoading = true,\n onTransitionStart,\n onTransitionEnd\n}, ref) => {\n const [isLoading, setIsLoading] = useState(true)\n const [isVisible, setIsVisible] = useState(false)\n\n useEffect(() => {\n const timer = setTimeout(() => {\n setIsLoading(false)\n setIsVisible(true)\n onTransitionEnd?.()\n }, duration)\n\n onTransitionStart?.()\n\n return () => clearTimeout(timer)\n }, [duration, onTransitionStart, onTransitionEnd])\n\n const transitionClasses = {\n fade: merge(\n 'transition-opacity duration-300 ease-in-out',\n isVisible ? 'opacity-100' : 'opacity-0'\n ),\n slide: merge(\n 'transition-transform duration-300 ease-in-out',\n isVisible ? 'translate-x-0' : 'translate-x-full'\n ),\n scale: merge(\n 'transition-all duration-300 ease-in-out',\n isVisible ? 'scale-100 opacity-100' : 'scale-95 opacity-0'\n ),\n flip: merge(\n 'transition-all duration-500 ease-in-out',\n isVisible ? 'rotate-y-0 opacity-100' : 'rotate-y-90 opacity-0'\n )\n }\n\n if (isLoading && showLoading) {\n return (\n <div className={merge('flex flex-col items-center justify-center min-h-screen bg-gradient-to-br from-blue-50 to-purple-50 dark:from-slate-900 dark:to-slate-800', className)}>\n <LoadingSpinner\n size=\"lg\"\n variant={loadingVariant}\n text={loadingText}\n />\n </div>\n )\n }\n\n return (\n <div\n ref={ref}\n className={merge(\n 'w-full',\n transitionClasses[variant],\n className\n )}\n style={{ transitionDuration: `${duration}ms` }}\n >\n {children}\n </div>\n )\n})\n\nPageTransition.displayName = 'PageTransition'\n\n// Convenience components for different transition types\nexport const FadeTransition = React.forwardRef<HTMLDivElement, Omit<PageTransitionProps, 'variant'>>((props, ref) => (\n <PageTransition ref={ref} variant=\"fade\" {...props} />\n))\n\nexport const SlideTransition = React.forwardRef<HTMLDivElement, Omit<PageTransitionProps, 'variant'>>((props, ref) => (\n <PageTransition ref={ref} variant=\"slide\" {...props} />\n))\n\nexport const ScaleTransition = React.forwardRef<HTMLDivElement, Omit<PageTransitionProps, 'variant'>>((props, ref) => (\n <PageTransition ref={ref} variant=\"scale\" {...props} />\n))\n\nexport const FlipTransition = React.forwardRef<HTMLDivElement, Omit<PageTransitionProps, 'variant'>>((props, ref) => (\n <PageTransition ref={ref} variant=\"flip\" {...props} />\n))\n\n// Add displayName for convenience components\nFadeTransition.displayName = 'FadeTransition'\nSlideTransition.displayName = 'SlideTransition'\nScaleTransition.displayName = 'ScaleTransition'\nFlipTransition.displayName = 'FlipTransition' "]}
|