@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
package/dist/form.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/lib/utils.ts","../src/components/Form.tsx","../src/components/Label.tsx","../src/components/Input.tsx","../src/components/Textarea.tsx","../src/lib/icons.ts","../src/lib/icon-providers.ts","../src/lib/icon-aliases.ts","../src/components/Icon/icon-store.ts","../src/components/Icon/IconProvider.tsx","../src/components/Icon/Icon.tsx","../src/components/Select.tsx","../src/components/Checkbox.tsx","../src/components/Radio.tsx","../src/components/Switch.tsx","../src/components/Slider.tsx","../src/components/Popover.tsx","../src/components/Button.tsx","../src/components/DatePicker.tsx","../src/components/Upload.tsx","../src/components/Autocomplete.tsx"],"names":["merge","inputs","twMerge","clsx","mergeMap","classMap","classes","condition","className","Form","React","children","onSubmit","variant","props","ref","jsx","e","FormField","error","required","errorId","enhancedChildren","child","childProps","childType","isFormComponent","typeObj","displayName","name","isNativeFormElement","existingAriaDescribedBy","ariaDescribedBy","jsxs","FormGroup","inline","Label","disabled","variantClasses","Input","type","ariaInvalid","isInvalid","Textarea","size","success","resize","sizeClasses","resizeClasses","stateClasses","icons","Home","ArrowLeft","ArrowRight","ArrowUp","ArrowDown","Menu","X","Search","Settings","ExternalLink","ChevronLeft","ChevronRight","ChevronDown","ChevronUp","Edit","Trash2","Plus","Minus","Download","Upload","RefreshCw","Save","Copy","Loader2","CheckCircle","XCircle","AlertCircle","Info","Check","Circle","HelpCircle","User","Users","UserPlus","LogIn","LogOut","Eye","EyeOff","BarChart3","TrendingUp","Activity","Database","Zap","FileText","File","Folder","Book","BookOpen","Mail","MessageCircle","Phone","Image","Video","Camera","Smile","Frown","Meh","Lock","Unlock","Shield","Wallet","Key","Clock","Calendar","CalendarPlus","Bell","Heart","Star","Bookmark","Share","Monitor","Sun","Moon","Lightbulb","Brain","Flag","Square","emotionIcons","statusIcons","PhosphorIcons","PROJECT_ICONS","initPhosphorIcons","getIconFromProvider","iconName","provider","iconMapping","getIconDirect","mappedName","LucideIcons","lucideName","camelCaseName","match","p1","phosphorName1","phosphorName2","word","ICON_ALIASES","resolveIconAlias","defaultIconConfig","IconContext","createContext","useIconContext","useContext","IconComponent","emotion","status","weight","animated","pulse","spin","bounce","ariaLabel","ariaHidden","_a","config","iconSet","iconSize","iconWeight","iconColor","iconStrokeWidth","isClient","setIsClient","phosphorReady","setPhosphorReady","iconProps","animationClasses","accessibilityProps","MemoizedIcon","prevProps","nextProps","Icon","EmotionIcon","StatusIcon","LoadingIcon","SuccessIcon","ErrorIcon","Select","leftIcon","placeholder","selectRef","combinedRef","node","isFocused","setIsFocused","SelectOption","Checkbox","label","description","id","checkboxId","labelId","descriptionId","iconSizes","isChecked","Radio","radioId","dotSizes","Switch","switchId","thumbSizes","Slider","showValue","showLabel","min","max","step","value","onValueChange","orientation","isRange","currentValue","handleChange","newValue","index","newRange","thumbVariantClasses","thumbSizeClasses","orientationClasses","renderSlider","renderValue","val","_","Popover","trigger","controlledOpen","onOpenChange","position","align","offset","internalOpen","setInternalOpen","triggerRef","popoverRef","isControlled","isOpen","handleOpenChange","newOpen","handleTriggerClick","handleClickOutside","event","getPositionClasses","baseClasses","getAlignmentClasses","getArrowClasses","PopoverTrigger","PopoverContent","isBrowser","useReducedMotion","reduce","setReduce","mq","onChange","ButtonInner","loading","icon","iconPosition","gradient","customGradient","rounded","shadow","hover","fullWidth","iconOnly","rest","reduced","getGradientClass","roundedClasses","shadowClasses","hoverClasses","base","content","Fragment","onClick","target","rel","href","anchorClassName","anchorProps","isDisabled","handleAnchorClick","buttonClassName","btnProps","Button","g","formatDate","date","format","locale","year","month","day","getDaysInMonth","getFirstDayOfMonth","DatePicker","minDate","maxDate","dateFormat","setIsOpen","currentMonth","setCurrentMonth","hoveredDate","setHoveredDate","displayDate","handleDateSelect","handlePrevMonth","handleNextMonth","handleToday","today","daysInMonth","firstDay","weekDays","isDateDisabled","isDateSelected","isToday","calendarDays","i","remainingDays","triggerButton","isCurrentMonth","isSelected","isTodayDate","isHovered","formatFileSize","bytes","k","sizes","getFileIcon","files","onRemove","multiple","accept","maxSize","maxFiles","dragDrop","fileInputRef","isDragging","setIsDragging","handleFileSelect","selectedFiles","fileArray","validFiles","file","handleClick","handleDragOver","handleDragLeave","handleDrop","handleRemove","Autocomplete","options","maxHeight","clearable","filterable","onSearch","emptyText","inputValue","setInputValue","filteredOptions","setFilteredOptions","selectedIndex","setSelectedIndex","isSearching","setIsSearching","inputRef","dropdownRef","selectedOption","opt","result","filtered","option","handleInputChange","handleInputFocus","handleInputBlur","handleOptionSelect","handleClear","handleKeyDown","prev","isValueSelected"],"mappings":"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","file":"form.js","sourcesContent":["import { type ClassValue, clsx } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\n/**\n * HUA UI의 스마트 클래스 병합 유틸리티\n * clsx와 tailwind-merge를 결합하여 중복 클래스를 자동으로 해결합니다.\n * \n * @param inputs - 병합할 클래스 값들\n * @returns 병합된 클래스 문자열\n * \n * @example\n * ```tsx\n * merge(\"px-2 py-1\", \"px-4\") // \"py-1 px-4\"\n * merge(\"text-red-500\", \"text-blue-500\") // \"text-blue-500\"\n * merge(\"bg-white\", \"dark:bg-slate-900\") // \"bg-white dark:bg-slate-900\"\n * ```\n */\nexport function merge(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n\n/**\n * 조건부 클래스 병합 유틸리티\n * 조건에 따라 클래스를 선택적으로 병합합니다.\n * \n * @param condition - 클래스를 적용할 조건\n * @param trueClass - 조건이 true일 때 적용할 클래스\n * @param falseClass - 조건이 false일 때 적용할 클래스 (선택사항)\n * @returns 병합된 클래스 문자열\n * \n * @example\n * ```tsx\n * mergeIf(isActive, \"bg-blue-500\", \"bg-gray-200\")\n * mergeIf(isLoading, \"opacity-50 cursor-not-allowed\")\n * ```\n */\nexport function mergeIf(\n condition: boolean,\n trueClass: ClassValue,\n falseClass?: ClassValue\n) {\n return merge(condition ? trueClass : falseClass || \"\")\n}\n\n/**\n * 상대 시간 포맷팅 유틸리티\n * \n * 날짜를 상대 시간 형식으로 포맷팅합니다 (예: \"방금 전\", \"5분 전\", \"2시간 전\", \"3일 전\").\n * 7일 이상 경과한 경우 절대 날짜를 반환합니다.\n * \n * Formats a date as relative time (e.g., \"방금 전\", \"5분 전\", \"2시간 전\", \"3일 전\").\n * Returns absolute date for dates older than 7 days.\n * \n * @param timestamp - 포맷팅할 날짜 (Date 객체 또는 ISO 문자열) / Date to format (Date object or ISO string)\n * @param locale - 로케일 (기본값: \"ko-KR\") / Locale (default: \"ko-KR\")\n * @returns 포맷팅된 상대 시간 문자열 / Formatted relative time string\n * \n * @example\n * ```tsx\n * formatRelativeTime(new Date()) // \"방금 전\"\n * formatRelativeTime(new Date(Date.now() - 5 * 60000)) // \"5분 전\"\n * formatRelativeTime(new Date(Date.now() - 2 * 3600000)) // \"2시간 전\"\n * formatRelativeTime(new Date(Date.now() - 3 * 86400000)) // \"3일 전\"\n * formatRelativeTime(new Date(\"2024-01-01\")) // \"2024. 1. 1.\" (7일 이상 경과)\n * ```\n */\nexport function formatRelativeTime(timestamp: Date | string, locale = \"ko-KR\"): string {\n const date = typeof timestamp === \"string\" ? new Date(timestamp) : timestamp;\n const now = new Date();\n const diff = now.getTime() - date.getTime();\n const minutes = Math.floor(diff / 60000);\n const hours = Math.floor(diff / 3600000);\n const days = Math.floor(diff / 86400000);\n\n if (minutes < 1) return locale === \"ko-KR\" ? \"방금 전\" : \"just now\";\n if (minutes < 60) return locale === \"ko-KR\" ? `${minutes}분 전` : `${minutes}m ago`;\n if (hours < 24) return locale === \"ko-KR\" ? `${hours}시간 전` : `${hours}h ago`;\n if (days < 7) return locale === \"ko-KR\" ? `${days}일 전` : `${days}d ago`;\n return date.toLocaleDateString(locale);\n}\n\n/**\n * 객체 기반 클래스 병합 유틸리티\n * 객체의 키-값 쌍을 기반으로 조건부 클래스를 병합합니다.\n * \n * @param classMap - 클래스 맵 객체\n * @returns 병합된 클래스 문자열\n * \n * @example\n * ```tsx\n * mergeMap({\n * \"bg-blue-500\": isPrimary,\n * \"bg-gray-500\": !isPrimary,\n * \"text-white\": true,\n * \"opacity-50\": isDisabled\n * })\n * ```\n */\nexport function mergeMap(classMap: Record<string, boolean | undefined | null>) {\n const classes = Object.entries(classMap)\n .filter(([, condition]) => condition)\n .map(([className]) => className)\n \n return merge(...classes)\n}\n\n// 하위 호환성을 위해 cn도 export (점진적 마이그레이션 지원)\nexport const cn = merge ","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * Form 컴포넌트의 props / Form component props\n * @typedef {Object} FormProps\n * @property {(e: React.FormEvent<HTMLFormElement>) => void} [onSubmit] - 폼 제출 핸들러 / Form submit handler\n * @property {\"default\" | \"glass\"} [variant=\"default\"] - Form 스타일 변형 / Form style variant\n * @extends {React.FormHTMLAttributes<HTMLFormElement>}\n */\nexport interface FormProps extends React.FormHTMLAttributes<HTMLFormElement> {\n onSubmit?: (e: React.FormEvent<HTMLFormElement>) => void\n variant?: \"default\" | \"glass\"\n}\n\n/**\n * FormField 컴포넌트의 props / FormField component props\n * @typedef {Object} FormFieldProps\n * @property {string} [error] - 에러 메시지 / Error message\n * @property {boolean} [required=false] - 필수 필드 여부 / Required field\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface FormFieldProps extends React.HTMLAttributes<HTMLDivElement> {\n error?: string\n required?: boolean\n}\n\n/**\n * FormGroup 컴포넌트의 props / FormGroup component props\n * @typedef {Object} FormGroupProps\n * @property {boolean} [inline=false] - 인라인 레이아웃 여부 / Inline layout\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface FormGroupProps extends React.HTMLAttributes<HTMLDivElement> {\n inline?: boolean\n}\n\n/**\n * Form 컴포넌트 / Form component\n * \n * 폼 컨테이너 컴포넌트입니다.\n * FormField, FormGroup과 함께 사용하여 구조화된 폼을 구성합니다.\n * \n * Form container component.\n * Used with FormField and FormGroup to create structured forms.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Form onSubmit={(e) => { e.preventDefault(); console.log('제출') }}>\n * <FormField>\n * <Label>이름</Label>\n * <Input />\n * </FormField>\n * </Form>\n * \n * @example\n * // Glass 스타일 / Glass style\n * <Form variant=\"glass\" onSubmit={handleSubmit}>\n * <FormGroup>\n * <FormField>\n * <Label>이메일</Label>\n * <Input type=\"email\" />\n * </FormField>\n * </FormGroup>\n * </Form>\n * \n * @param {FormProps} props - Form 컴포넌트의 props / Form component props\n * @param {React.Ref<HTMLFormElement>} ref - form 요소 ref / form element ref\n * @returns {JSX.Element} Form 컴포넌트 / Form component\n */\nconst Form = React.forwardRef<HTMLFormElement, FormProps>(\n ({ \n className, \n children, \n onSubmit,\n variant = \"default\",\n ...props \n }, ref) => {\n const handleSubmit = (e: React.FormEvent<HTMLFormElement>) => {\n e.preventDefault()\n onSubmit?.(e)\n }\n\n const variantClasses = {\n default: \"space-y-6\",\n glass: \"space-y-6 bg-white/10 backdrop-blur-sm border border-white/20 rounded-xl p-6 shadow-xl dark:bg-slate-800/20 dark:border-slate-700/50\"\n }\n\n return (\n <form\n ref={ref}\n onSubmit={handleSubmit}\n className={merge(variantClasses[variant], className)}\n {...props}\n >\n {children}\n </form>\n )\n }\n)\nForm.displayName = \"Form\"\n\n/**\n * FormField 컴포넌트 / FormField component\n * \n * 폼 필드를 감싸는 컨테이너입니다.\n * 에러 메시지를 표시하고 필수 필드 표시를 지원합니다.\n * \n * Container that wraps a form field.\n * Displays error messages and supports required field indication.\n * \n * @component\n * @example\n * <FormField error=\"이 필드는 필수입니다\" required>\n * <Label>이름</Label>\n * <Input />\n * </FormField>\n * \n * @param {FormFieldProps} props - FormField 컴포넌트의 props / FormField component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} FormField 컴포넌트 / FormField component\n */\nconst FormField = React.forwardRef<HTMLDivElement, FormFieldProps>(\n ({ \n className, \n children, \n error,\n required,\n ...props \n }, ref) => {\n const errorId = React.useId()\n\n // 자식 요소에 aria-describedby와 aria-invalid 연결\n // Connect aria-describedby and aria-invalid to child elements\n const enhancedChildren = React.Children.map(children, (child) => {\n if (React.isValidElement(child)) {\n const childProps = child.props as Record<string, unknown>\n const childType = child.type\n \n // Input, Select, Textarea 컴포넌트 확인\n // Check for Input, Select, Textarea components\n let isFormComponent = false\n if (typeof childType === 'object' && childType !== null) {\n const typeObj = childType as Record<string, unknown>\n const displayName = typeObj.displayName as string | undefined\n const name = typeObj.name as string | undefined\n isFormComponent = \n displayName === 'Input' || \n displayName === 'Select' || \n displayName === 'Textarea' ||\n name === 'Input' || \n name === 'Select' || \n name === 'Textarea'\n }\n \n // 네이티브 HTML 요소 확인\n // Check for native HTML elements\n const isNativeFormElement = \n typeof childType === 'string' &&\n ['input', 'select', 'textarea'].includes(childType.toLowerCase())\n \n if (isFormComponent || isNativeFormElement) {\n const existingAriaDescribedBy = childProps['aria-describedby'] as string | undefined\n const ariaDescribedBy = error \n ? existingAriaDescribedBy \n ? `${existingAriaDescribedBy} ${errorId}`\n : errorId\n : existingAriaDescribedBy\n \n return React.cloneElement(child, {\n 'aria-describedby': ariaDescribedBy,\n 'aria-invalid': error ? true : childProps['aria-invalid'],\n required: required || childProps.required,\n } as Record<string, unknown>)\n }\n }\n return child\n })\n\n return (\n <div\n ref={ref}\n className={merge(\"space-y-2\", className)}\n {...props}\n >\n {enhancedChildren}\n {error && (\n <p \n id={errorId}\n className=\"text-sm text-red-600 dark:text-red-400\"\n role=\"alert\"\n aria-live=\"polite\"\n >\n {error}\n </p>\n )}\n </div>\n )\n }\n)\nFormField.displayName = \"FormField\"\n\n/**\n * FormGroup 컴포넌트 / FormGroup component\n * \n * 여러 폼 필드를 그룹화하는 컨테이너입니다.\n * Container that groups multiple form fields.\n * \n * @component\n * @example\n * <FormGroup inline>\n * <FormField>\n * <Label>이름</Label>\n * <Input />\n * </FormField>\n * <FormField>\n * <Label>성</Label>\n * <Input />\n * </FormField>\n * </FormGroup>\n * \n * @param {FormGroupProps} props - FormGroup 컴포넌트의 props / FormGroup component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} FormGroup 컴포넌트 / FormGroup component\n */\nconst FormGroup = React.forwardRef<HTMLDivElement, FormGroupProps>(\n ({ \n className, \n children, \n inline = false,\n ...props \n }, ref) => {\n return (\n <div\n ref={ref}\n className={merge(\n inline ? \"flex gap-4\" : \"space-y-4\",\n className\n )}\n {...props}\n >\n {children}\n </div>\n )\n }\n)\nFormGroup.displayName = \"FormGroup\"\n\nexport { Form, FormField, FormGroup } ","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * Label 컴포넌트의 props / Label component props\n * @typedef {Object} LabelProps\n * @property {boolean} [required=false] - 필수 필드 여부 / Required field indicator\n * @property {boolean} [error=false] - 에러 상태 표시 / Error state\n * @property {boolean} [disabled=false] - 비활성화 상태 / Disabled state\n * @property {\"default\" | \"glass\"} [variant=\"default\"] - Label 스타일 변형 / Label style variant\n * @extends {React.LabelHTMLAttributes<HTMLLabelElement>}\n */\nexport interface LabelProps extends React.LabelHTMLAttributes<HTMLLabelElement> {\n required?: boolean\n error?: boolean\n disabled?: boolean\n variant?: \"default\" | \"glass\"\n}\n\n/**\n * Label 컴포넌트 / Label component\n * \n * 폼 필드의 레이블을 표시하는 컴포넌트입니다.\n * 필수 필드 표시와 에러 상태를 지원합니다.\n * \n * Component for displaying form field labels.\n * Supports required field indicator and error state.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Label htmlFor=\"email\">이메일</Label>\n * <Input id=\"email\" />\n * \n * @example\n * // 필수 필드 / Required field\n * <Label required htmlFor=\"name\">이름</Label>\n * <Input id=\"name\" required />\n * \n * @example\n * // 에러 상태 / Error state\n * <Label error htmlFor=\"password\">비밀번호</Label>\n * <Input id=\"password\" aria-invalid />\n * \n * @param {LabelProps} props - Label 컴포넌트의 props / Label component props\n * @param {React.Ref<HTMLLabelElement>} ref - label 요소 ref / label element ref\n * @returns {JSX.Element} Label 컴포넌트 / Label component\n * \n * @todo 접근성 개선: required일 때 aria-required=\"true\" 추가 필요 / Accessibility improvement: add aria-required=\"true\" when required\n */\nconst Label = React.forwardRef<HTMLLabelElement, LabelProps>(\n ({ \n className, \n children, \n required = false,\n error = false,\n disabled = false,\n variant = \"default\",\n ...props \n }, ref) => {\n const variantClasses = {\n default: merge(\n \"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\",\n error && \"text-red-600 dark:text-red-400\",\n disabled && \"text-slate-400 dark:text-slate-500\",\n !error && !disabled && \"text-slate-700 dark:text-slate-300\"\n ),\n glass: merge(\n \"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\",\n error && \"text-red-400\",\n disabled && \"text-white/50\",\n !error && !disabled && \"text-white\"\n )\n }\n\n return (\n <label\n ref={ref}\n className={merge(variantClasses[variant], className)}\n aria-required={required ? true : undefined}\n {...props}\n >\n {children}\n {required && (\n <span className={variant === \"glass\" ? \"text-red-400 ml-1\" : \"text-red-500 ml-1\"} aria-label=\"필수 필드\">*</span>\n )}\n </label>\n )\n }\n)\nLabel.displayName = \"Label\"\n\nexport { Label } ","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * Input 컴포넌트의 props / Input component props\n * HTML input 요소의 모든 표준 속성을 상속받습니다.\n * Inherits all standard attributes of HTML input element.\n * @typedef {Object} InputProps\n * @extends {React.InputHTMLAttributes<HTMLInputElement>}\n */\nexport interface InputProps extends React.InputHTMLAttributes<HTMLInputElement> {}\n\n/**\n * Input 컴포넌트 / Input component\n * \n * 표준 HTML input 요소를 래핑한 스타일링된 입력 필드 컴포넌트입니다.\n * 접근성 속성(aria-invalid)을 자동으로 처리합니다.\n * \n * Styled input field component wrapping standard HTML input element.\n * Automatically handles accessibility attributes (aria-invalid).\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Input type=\"text\" placeholder=\"이름을 입력하세요\" />\n * \n * @example\n * // 에러 상태 / Error state\n * <Input \n * type=\"email\" \n * placeholder=\"이메일\"\n * aria-invalid={true}\n * />\n * \n * @example\n * // ref 사용 / Using ref\n * const inputRef = useRef<HTMLInputElement>(null)\n * <Input ref={inputRef} type=\"text\" />\n * \n * @param {InputProps} props - Input 컴포넌트의 props / Input component props\n * @param {React.Ref<HTMLInputElement>} ref - input 요소 ref / input element ref\n * @returns {JSX.Element} Input 컴포넌트 / Input component\n */\nconst Input = React.forwardRef<HTMLInputElement, InputProps>(\n ({ className, type, ...props }, ref) => {\n // aria-invalid이 명시적으로 전달되지 않았고, error prop이 있으면 자동 설정\n const ariaInvalid = props[\"aria-invalid\" as keyof typeof props] as boolean | undefined;\n const isInvalid = ariaInvalid !== undefined ? ariaInvalid : false;\n \n return (\n <input\n type={type}\n className={merge(\n \"flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 transition-all duration-200 hover:border-blue-400 hover:shadow-sm\",\n isInvalid && \"border-red-500 focus-visible:ring-red-500\",\n className\n )}\n ref={ref}\n aria-invalid={isInvalid || undefined}\n {...props}\n />\n )\n }\n)\nInput.displayName = \"Input\"\n\nexport { Input } ","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * Textarea 컴포넌트의 props / Textarea component props\n * @typedef {Object} TextareaProps\n * @property {\"default\" | \"outline\" | \"filled\" | \"ghost\" | \"glass\"} [variant=\"default\"] - Textarea 스타일 변형 / Textarea style variant\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - Textarea 크기 / Textarea size\n * @property {boolean} [error=false] - 에러 상태 표시 / Error state\n * @property {boolean} [success=false] - 성공 상태 표시 / Success state\n * @property {\"none\" | \"vertical\" | \"horizontal\" | \"both\"} [resize=\"vertical\"] - 크기 조절 방향 / Resize direction\n * @extends {React.TextareaHTMLAttributes<HTMLTextAreaElement>}\n */\nexport interface TextareaProps extends React.TextareaHTMLAttributes<HTMLTextAreaElement> {\n variant?: \"default\" | \"outline\" | \"filled\" | \"ghost\" | \"glass\"\n size?: \"sm\" | \"md\" | \"lg\"\n error?: boolean\n success?: boolean\n resize?: \"none\" | \"vertical\" | \"horizontal\" | \"both\"\n}\n\n/**\n * Textarea 컴포넌트 / Textarea component\n * \n * 여러 줄 텍스트 입력을 위한 텍스트 영역 컴포넌트입니다.\n * 다양한 스타일 변형과 크기를 지원하며, 접근성 속성을 포함합니다.\n * \n * Text area component for multi-line text input.\n * Supports various style variants and sizes, includes accessibility attributes.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Textarea placeholder=\"내용을 입력하세요\" />\n * \n * @example\n * // 에러 상태 / Error state\n * <Textarea \n * error\n * placeholder=\"에러가 발생했습니다\"\n * aria-label=\"설명 입력\"\n * />\n * \n * @example\n * // 크기 조절 비활성화 / Disable resize\n * <Textarea \n * resize=\"none\"\n * rows={5}\n * placeholder=\"고정 크기 텍스트 영역\"\n * />\n * \n * @param {TextareaProps} props - Textarea 컴포넌트의 props / Textarea component props\n * @param {React.Ref<HTMLTextAreaElement>} ref - textarea 요소 ref / textarea element ref\n * @returns {JSX.Element} Textarea 컴포넌트 / Textarea component\n * \n * @todo 접근성 개선: aria-invalid 속성 자동 추가 필요 / Accessibility improvement: auto-add aria-invalid attribute\n */\nconst Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(\n ({ \n className, \n variant = \"default\",\n size = \"md\",\n error = false,\n success = false,\n resize = \"vertical\",\n ...props \n }, ref) => {\n const variantClasses = {\n default: \"border-gray-300 bg-white text-gray-900 placeholder-gray-500 focus:border-blue-500 focus:ring-blue-500 dark:border-gray-600 dark:bg-gray-800 dark:text-white dark:placeholder-gray-400 dark:focus:border-blue-400 dark:focus:ring-blue-400 transition-all duration-200 hover:border-blue-400 hover:shadow-sm\",\n outline: \"border-2 border-gray-200 bg-transparent text-gray-900 placeholder-gray-500 focus:border-blue-500 focus:ring-blue-500 dark:border-gray-700 dark:text-white dark:placeholder-gray-400 dark:focus:border-blue-400 dark:focus:ring-blue-400 transition-all duration-200 hover:border-blue-400 hover:shadow-sm\",\n filled: \"border-transparent bg-gray-50 text-gray-900 placeholder-gray-500 focus:bg-white focus:border-blue-500 focus:ring-blue-500 dark:bg-gray-700 dark:text-white dark:placeholder-gray-400 dark:focus:bg-gray-800 dark:focus:border-blue-400 dark:focus:ring-blue-400 transition-all duration-200 hover:bg-gray-100 dark:hover:bg-gray-600\",\n ghost: \"border-transparent bg-transparent text-gray-900 placeholder-gray-500 focus:bg-gray-50 focus:border-gray-300 focus:ring-gray-500 dark:text-white dark:placeholder-gray-400 dark:focus:bg-gray-800 dark:focus:border-gray-600 dark:focus:ring-gray-400 transition-all duration-200 hover:bg-gray-50 dark:hover:bg-gray-800\",\n glass: \"border-white/30 bg-white/10 backdrop-blur-sm text-white placeholder-white/60 focus:border-blue-400/50 focus:ring-blue-400/20 focus:bg-white/20 dark:border-slate-600/50 dark:bg-slate-800/10 dark:text-slate-200 dark:placeholder-slate-400 dark:focus:border-blue-400/50 dark:focus:ring-blue-400/20 dark:focus:bg-slate-700/20 transition-all duration-200 hover:border-blue-400/40 hover:bg-white/15 dark:hover:bg-slate-700/15\"\n }\n\n const sizeClasses = {\n sm: \"px-3 py-2 text-sm min-h-[80px]\",\n md: \"px-4 py-3 text-base min-h-[100px]\",\n lg: \"px-4 py-3 text-lg min-h-[120px]\"\n }\n\n const resizeClasses = {\n none: \"resize-none\",\n vertical: \"resize-y\",\n horizontal: \"resize-x\",\n both: \"resize\"\n }\n\n const stateClasses = error \n ? \"border-red-500 focus:border-red-500 focus:ring-red-500 dark:border-red-400 dark:focus:border-red-400 dark:focus:ring-red-400\"\n : success\n ? \"border-green-500 focus:border-green-500 focus:ring-green-500 dark:border-green-400 dark:focus:border-green-400 dark:focus:ring-green-400\"\n : \"\"\n \n // aria-invalid 자동 설정\n // Auto-set aria-invalid\n const ariaInvalid = props['aria-invalid' as keyof typeof props] as boolean | undefined\n const isInvalid = error || (ariaInvalid !== undefined ? ariaInvalid : false)\n\n return (\n <textarea\n className={merge(\n \"flex w-full rounded-md border transition-colors duration-200 focus:outline-none focus:ring-2 focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50\",\n variantClasses[variant],\n sizeClasses[size],\n resizeClasses[resize],\n stateClasses,\n className\n )}\n ref={ref}\n aria-invalid={isInvalid || undefined}\n {...props}\n />\n )\n }\n)\nTextarea.displayName = \"Textarea\"\n\nexport { Textarea } ","/**\n * Core Icons\n * \n * 핵심 아이콘만 포함하여 번들 크기를 최적화합니다.\n * 나머지 아이콘은 동적 fallback으로 처리됩니다.\n * \n * 포함 기준:\n * 1. sum-diary에서 실제 사용 중인 아이콘\n * 2. UI 컴포넌트에서 자주 사용되는 아이콘\n * 3. 각 카테고리의 대표 아이콘\n * \n * 새로운 아이콘이 필요하면 동적 fallback이 자동으로 처리합니다.\n */\n\nimport {\n // Navigation\n Home,\n ArrowLeft,\n ArrowRight,\n ArrowUp,\n ArrowDown,\n Menu,\n X,\n Search,\n Settings,\n ExternalLink,\n ChevronLeft,\n ChevronRight,\n ChevronDown,\n ChevronUp,\n \n // Actions\n Edit,\n Trash2,\n Plus,\n Minus,\n Download,\n Upload,\n RefreshCw,\n Save,\n Copy,\n \n // Status & Feedback\n Loader2,\n CheckCircle,\n XCircle,\n AlertCircle,\n Info,\n Check,\n Circle,\n HelpCircle,\n \n // User & Auth\n User,\n Users,\n UserPlus,\n LogIn,\n LogOut,\n Eye,\n EyeOff,\n \n // Data & Analytics\n BarChart3,\n TrendingUp,\n Activity,\n Database,\n Zap,\n \n // Files & Content\n FileText,\n File,\n Folder,\n Book,\n BookOpen,\n \n // Communication\n Mail,\n MessageCircle,\n Phone,\n \n // Media\n Image,\n Video,\n Camera,\n \n // Emotions\n Smile,\n Frown,\n Meh,\n \n // Security\n Lock,\n Unlock,\n Shield,\n Wallet,\n Key,\n \n // Time & Date\n Clock,\n Calendar,\n CalendarPlus,\n \n // UI Elements\n Bell,\n Heart,\n Star,\n Bookmark,\n Share,\n \n // Theme\n Monitor,\n Sun,\n Moon,\n \n // Additional\n Lightbulb,\n Brain,\n Flag,\n Square,\n} from 'lucide-react'\n\n// 핵심 아이콘 객체\nexport const icons = {\n // Navigation\n home: Home,\n arrowLeft: ArrowLeft,\n arrowRight: ArrowRight,\n arrowUp: ArrowUp,\n arrowDown: ArrowDown,\n menu: Menu,\n close: X,\n search: Search,\n settings: Settings,\n externalLink: ExternalLink,\n chevronLeft: ChevronLeft,\n chevronRight: ChevronRight,\n chevronDown: ChevronDown,\n chevronUp: ChevronUp,\n \n // Actions\n edit: Edit,\n delete: Trash2,\n add: Plus,\n remove: Minus,\n download: Download,\n upload: Upload,\n refresh: RefreshCw,\n save: Save,\n copy: Copy,\n \n // Status & Feedback\n loader: Loader2,\n success: CheckCircle,\n error: XCircle,\n alertCircle: AlertCircle,\n warning: AlertCircle, // warning은 alertCircle과 동일\n info: Info,\n check: Check,\n circle: Circle,\n helpCircle: HelpCircle,\n \n // User & Auth\n user: User,\n users: Users,\n userPlus: UserPlus,\n logIn: LogIn,\n logOut: LogOut,\n eye: Eye,\n eyeOff: EyeOff,\n \n // Data & Analytics\n chart: BarChart3,\n barChart: BarChart3,\n trendingUp: TrendingUp,\n activity: Activity,\n database: Database,\n zap: Zap,\n \n // Files & Content\n fileText: FileText,\n file: File,\n folder: Folder,\n book: Book,\n bookOpen: BookOpen,\n \n // Communication\n mail: Mail,\n message: MessageCircle,\n phone: Phone,\n \n // Media\n image: Image,\n video: Video,\n camera: Camera,\n \n // Emotions\n smile: Smile,\n frown: Frown,\n meh: Meh,\n \n // Security\n lock: Lock,\n unlock: Unlock,\n shield: Shield,\n wallet: Wallet,\n key: Key,\n \n // Time & Date\n clock: Clock,\n calendar: Calendar,\n calendarPlus: CalendarPlus,\n \n // UI Elements\n bell: Bell,\n heart: Heart,\n star: Star,\n bookmark: Bookmark,\n share: Share,\n \n // Theme\n monitor: Monitor,\n sun: Sun,\n moon: Moon,\n \n // Additional\n lightbulb: Lightbulb,\n brain: Brain,\n flag: Flag,\n square: Square,\n} as const\n\n// 아이콘 이름 타입\nexport type IconName = keyof typeof icons\n\n// 감정별 아이콘 매핑\nexport const emotionIcons = {\n happy: 'smile',\n sad: 'frown',\n neutral: 'meh',\n excited: 'smile', // laugh 대신 smile 사용\n angry: 'frown', // angry 대신 frown 사용\n love: 'heart',\n like: 'heart', // thumbsUp 대신 heart 사용\n dislike: 'frown', // thumbsDown 대신 frown 사용\n} as const\n\n// 상태별 아이콘 매핑\nexport const statusIcons = {\n loading: 'loader',\n success: 'success',\n error: 'error',\n warning: 'warning',\n info: 'info',\n locked: 'lock',\n unlocked: 'unlock',\n visible: 'eye',\n hidden: 'eyeOff',\n} as const\n\n// 아이콘 카테고리별 그룹화 (참고용)\nexport const iconCategories = {\n navigation: ['home', 'arrowLeft', 'arrowRight', 'arrowUp', 'arrowDown', 'menu', 'close', 'search', 'settings', 'externalLink', 'chevronLeft', 'chevronRight', 'chevronDown', 'chevronUp'],\n actions: ['edit', 'delete', 'add', 'remove', 'download', 'upload', 'refresh', 'save', 'copy'],\n status: ['loader', 'success', 'error', 'alertCircle', 'warning', 'info', 'check', 'circle'],\n user: ['user', 'users', 'userPlus', 'logIn', 'logOut', 'eye', 'eyeOff'],\n data: ['chart', 'barChart', 'trendingUp', 'activity', 'database', 'zap'],\n files: ['fileText', 'file', 'folder', 'book'],\n communication: ['mail', 'message', 'phone'],\n media: ['image', 'video', 'camera'],\n emotions: ['smile', 'frown', 'meh'],\n security: ['lock', 'unlock', 'shield'],\n time: ['clock', 'calendar'],\n ui: ['bell', 'heart', 'star', 'bookmark', 'share'],\n theme: ['monitor', 'sun', 'moon'],\n} as const\n","/**\n * Icon Provider System\n * \n * Supports multiple icon libraries:\n * - Lucide Icons (default)\n * - Phosphor Icons\n * - Untitled Icons (SVG-based)\n * \n * Only imports icons that are actually used in the project for optimal bundle size.\n */\n\nimport * as LucideIcons from 'lucide-react'\nimport type { LucideIcon } from 'lucide-react'\n\n// Phosphor Icons - lazy loaded, tree-shakeable\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet PhosphorIcons: any = null\n\n// Icon Provider Type\nexport type IconProvider = 'lucide' | 'phosphor' | 'untitled'\n\n// Icon Provider Configuration\nexport interface IconProviderConfig {\n provider: IconProvider\n prefix?: string\n}\n\n/**\n * Project-specific icon list\n * These are the icons actually used in SumUp project\n * Only these icons will be loaded for optimal bundle size\n */\nexport const PROJECT_ICONS = {\n // Navigation & Layout\n 'home': { lucide: 'Home', phosphor: 'House', untitled: 'home' },\n 'layout-dashboard': { lucide: 'LayoutDashboard', phosphor: 'SquaresFour', untitled: 'layout-dashboard' },\n 'folder': { lucide: 'Folder', phosphor: 'Folder', untitled: 'folder' },\n 'alert-circle': { lucide: 'AlertCircle', phosphor: 'WarningCircle', untitled: 'alert-circle' },\n 'alertCircle': { lucide: 'AlertCircle', phosphor: 'WarningCircle', untitled: 'alert-circle' },\n 'columns': { lucide: 'Columns', phosphor: 'Columns', untitled: 'columns' },\n 'users': { lucide: 'Users', phosphor: 'Users', untitled: 'users' },\n 'settings': { lucide: 'Settings', phosphor: 'Gear', untitled: 'settings' },\n 'menu': { lucide: 'Menu', phosphor: 'List', untitled: 'menu' },\n 'close': { lucide: 'X', phosphor: 'X', untitled: 'close' },\n 'chevronLeft': { lucide: 'ChevronLeft', phosphor: 'CaretLeft', untitled: 'chevron-left' },\n 'chevronRight': { lucide: 'ChevronRight', phosphor: 'CaretRight', untitled: 'chevron-right' },\n 'chevronDown': { lucide: 'ChevronDown', phosphor: 'CaretDown', untitled: 'chevron-down' },\n 'chevronUp': { lucide: 'ChevronUp', phosphor: 'CaretUp', untitled: 'chevron-up' },\n 'arrowLeft': { lucide: 'ArrowLeft', phosphor: 'ArrowLeft', untitled: 'arrow-left' },\n 'arrowRight': { lucide: 'ArrowRight', phosphor: 'ArrowRight', untitled: 'arrow-right' },\n 'arrowUp': { lucide: 'ArrowUp', phosphor: 'ArrowUp', untitled: 'arrow-up' },\n 'arrowDown': { lucide: 'ArrowDown', phosphor: 'ArrowDown', untitled: 'arrow-down' },\n\n // Actions\n 'add': { lucide: 'Plus', phosphor: 'Plus', untitled: 'add' },\n 'edit': { lucide: 'Edit', phosphor: 'Pencil', untitled: 'edit' },\n 'pencil': { lucide: 'Pencil', phosphor: 'Pencil', untitled: 'pencil' },\n 'delete': { lucide: 'Trash2', phosphor: 'Trash', untitled: 'trash' },\n 'trash': { lucide: 'Trash2', phosphor: 'Trash', untitled: 'trash' },\n 'upload': { lucide: 'Upload', phosphor: 'Upload', untitled: 'upload' },\n 'download': { lucide: 'Download', phosphor: 'Download', untitled: 'download' },\n 'x': { lucide: 'X', phosphor: 'X', untitled: 'close' },\n 'check': { lucide: 'Check', phosphor: 'Check', untitled: 'check' },\n 'search': { lucide: 'Search', phosphor: 'MagnifyingGlass', untitled: 'search' },\n 'share': { lucide: 'Share', phosphor: 'Share', untitled: 'share' },\n 'copy': { lucide: 'Copy', phosphor: 'Copy', untitled: 'copy' },\n 'save': { lucide: 'Save', phosphor: 'FloppyDisk', untitled: 'save' },\n\n // Status & Feedback\n 'loader': { lucide: 'Loader2', phosphor: 'Spinner', untitled: 'loader' },\n 'loader2': { lucide: 'Loader2', phosphor: 'Spinner', untitled: 'loader' },\n 'check-circle': { lucide: 'CheckCircle', phosphor: 'CheckCircle', untitled: 'check-circle' },\n 'checkCircle': { lucide: 'CheckCircle', phosphor: 'CheckCircle', untitled: 'check-circle' },\n 'success': { lucide: 'CheckCircle', phosphor: 'CheckCircle', untitled: 'check-circle' },\n 'error': { lucide: 'XCircle', phosphor: 'XCircle', untitled: 'error' },\n 'warning': { lucide: 'AlertCircle', phosphor: 'WarningCircle', untitled: 'warning' },\n 'info': { lucide: 'Info', phosphor: 'Info', untitled: 'info' },\n 'refresh': { lucide: 'RefreshCw', phosphor: 'ArrowClockwise', untitled: 'refresh' },\n 'refreshCw': { lucide: 'RefreshCw', phosphor: 'ArrowClockwise', untitled: 'refresh' },\n 'bell': { lucide: 'Bell', phosphor: 'Bell', untitled: 'bell' },\n 'heart': { lucide: 'Heart', phosphor: 'Heart', untitled: 'heart' },\n 'star': { lucide: 'Star', phosphor: 'Star', untitled: 'star' },\n 'bookmark': { lucide: 'Bookmark', phosphor: 'Bookmark', untitled: 'bookmark' },\n\n // User & Auth\n 'user': { lucide: 'User', phosphor: 'User', untitled: 'user' },\n 'userPlus': { lucide: 'UserPlus', phosphor: 'UserPlus', untitled: 'user-plus' },\n 'logIn': { lucide: 'LogIn', phosphor: 'SignIn', untitled: 'log-in' },\n 'logOut': { lucide: 'LogOut', phosphor: 'SignOut', untitled: 'log-out' },\n 'chrome': { lucide: 'Chrome', phosphor: 'ChromeLogo', untitled: 'chrome' },\n 'github': { lucide: 'Github', phosphor: 'GithubLogo', untitled: 'github' },\n 'message': { lucide: 'MessageCircle', phosphor: 'ChatCircle', untitled: 'message' },\n\n // Content\n 'messageSquare': { lucide: 'MessageSquare', phosphor: 'ChatSquare', untitled: 'message-square' },\n 'message-square': { lucide: 'MessageSquare', phosphor: 'ChatSquare', untitled: 'message-square' },\n 'inbox': { lucide: 'Inbox', phosphor: 'Inbox', untitled: 'inbox' },\n 'calendar': { lucide: 'Calendar', phosphor: 'Calendar', untitled: 'calendar' },\n 'calendarPlus': { lucide: 'CalendarPlus', phosphor: 'CalendarPlus', untitled: 'calendar-plus' },\n 'checkSquare': { lucide: 'CheckSquare', phosphor: 'CheckSquare', untitled: 'check-square' },\n 'clock': { lucide: 'Clock', phosphor: 'Clock', untitled: 'clock' },\n 'book': { lucide: 'Book', phosphor: 'Book', untitled: 'book' },\n 'bookOpen': { lucide: 'BookOpen', phosphor: 'BookOpen', untitled: 'book-open' },\n\n // Theme & UI\n 'monitor': { lucide: 'Monitor', phosphor: 'Monitor', untitled: 'monitor' },\n 'sun': { lucide: 'Sun', phosphor: 'Sun', untitled: 'sun' },\n 'moon': { lucide: 'Moon', phosphor: 'Moon', untitled: 'moon' },\n\n // AI & Features\n 'sparkles': { lucide: 'Sparkles', phosphor: 'Sparkle', untitled: 'sparkles' },\n 'lightbulb': { lucide: 'Lightbulb', phosphor: 'Lightbulb', untitled: 'lightbulb' },\n 'brain': { lucide: 'Brain', phosphor: 'Brain', untitled: 'brain' },\n 'zap': { lucide: 'Zap', phosphor: 'Lightning', untitled: 'zap' },\n\n // Data & Analytics\n 'chart': { lucide: 'BarChart3', phosphor: 'ChartBar', untitled: 'chart' },\n 'barChart': { lucide: 'BarChart', phosphor: 'ChartBar', untitled: 'bar-chart' },\n 'trendingUp': { lucide: 'TrendingUp', phosphor: 'TrendUp', untitled: 'trending-up' },\n 'trendingDown': { lucide: 'TrendingDown', phosphor: 'TrendDown', untitled: 'trending-down' },\n 'activity': { lucide: 'Activity', phosphor: 'Activity', untitled: 'activity' },\n 'database': { lucide: 'Database', phosphor: 'Database', untitled: 'database' },\n 'dollarSign': { lucide: 'DollarSign', phosphor: 'CurrencyDollar', untitled: 'dollar-sign' },\n 'dollar': { lucide: 'DollarSign', phosphor: 'CurrencyDollar', untitled: 'dollar-sign' },\n 'currency': { lucide: 'DollarSign', phosphor: 'CurrencyDollar', untitled: 'currency' },\n\n // Security\n 'lock': { lucide: 'Lock', phosphor: 'Lock', untitled: 'lock' },\n 'unlock': { lucide: 'Unlock', phosphor: 'LockOpen', untitled: 'unlock' },\n 'shield': { lucide: 'Shield', phosphor: 'Shield', untitled: 'shield' },\n 'key': { lucide: 'Key', phosphor: 'Key', untitled: 'key' },\n\n // Media\n 'play': { lucide: 'Play', phosphor: 'Play', untitled: 'play' },\n 'pause': { lucide: 'Pause', phosphor: 'Pause', untitled: 'pause' },\n 'image': { lucide: 'Image', phosphor: 'Image', untitled: 'image' },\n 'video': { lucide: 'Video', phosphor: 'Video', untitled: 'video' },\n 'camera': { lucide: 'Camera', phosphor: 'Camera', untitled: 'camera' },\n\n // Files\n 'fileText': { lucide: 'FileText', phosphor: 'FileText', untitled: 'file-text' },\n 'file': { lucide: 'File', phosphor: 'File', untitled: 'file' },\n\n // Navigation\n 'externalLink': { lucide: 'ExternalLink', phosphor: 'ArrowSquareOut', untitled: 'external-link' },\n 'link': { lucide: 'Link', phosphor: 'Link', untitled: 'link' },\n 'moreHorizontal': { lucide: 'MoreHorizontal', phosphor: 'DotsThreeOutline', untitled: 'more-horizontal' },\n 'moreVertical': { lucide: 'MoreVertical', phosphor: 'DotsThreeVertical', untitled: 'more-vertical' },\n\n // Priority\n 'remove': { lucide: 'Minus', phosphor: 'Minus', untitled: 'remove' },\n\n // Eye (password)\n 'eye': { lucide: 'Eye', phosphor: 'Eye', untitled: 'eye' },\n 'eyeOff': { lucide: 'EyeOff', phosphor: 'EyeSlash', untitled: 'eye-off' },\n\n // Emotions\n 'smile': { lucide: 'Smile', phosphor: 'Smiley', untitled: 'smile' },\n 'frown': { lucide: 'Frown', phosphor: 'SmileySad', untitled: 'frown' },\n 'meh': { lucide: 'Meh', phosphor: 'SmileyMeh', untitled: 'meh' },\n\n // Social\n 'mail': { lucide: 'Mail', phosphor: 'Envelope', untitled: 'mail' },\n 'phone': { lucide: 'Phone', phosphor: 'Phone', untitled: 'phone' },\n\n // Additional\n 'flag': { lucide: 'Flag', phosphor: 'Flag', untitled: 'flag' },\n} as const\n\n/**\n * Initialize Phosphor Icons (lazy load)\n * Only loads when Phosphor provider is used\n * Uses tree-shaking to only include used icons\n */\nexport async function initPhosphorIcons() {\n if (typeof window === 'undefined') return null\n\n if (!PhosphorIcons) {\n try {\n // Dynamic import with tree-shaking support\n // Only icons actually used will be included in bundle\n const phosphorModule = await import('@phosphor-icons/react')\n PhosphorIcons = phosphorModule\n } catch (error) {\n console.warn('Phosphor Icons not available. Install @phosphor-icons/react to use.')\n return null\n }\n }\n return PhosphorIcons\n}\n\n/**\n * Get icon from provider\n * Only resolves icons that are in PROJECT_ICONS for optimal bundle size\n * \n * @param iconName - 아이콘 이름 / Icon name\n * @param provider - 아이콘 프로바이더 / Icon provider\n * @returns 아이콘 컴포넌트 또는 null / Icon component or null\n */\nexport function getIconFromProvider(\n iconName: string,\n provider: IconProvider | 'lucide' | 'phosphor' | 'untitled' = 'lucide'\n): LucideIcon | React.ComponentType<Record<string, unknown>> | null {\n // Check if icon is in project icon list\n const iconMapping = PROJECT_ICONS[iconName as keyof typeof PROJECT_ICONS]\n\n if (!iconMapping) {\n // Fallback to direct lookup for backward compatibility\n return getIconDirect(iconName, provider)\n }\n\n const mappedName = iconMapping[provider]\n\n switch (provider) {\n case 'lucide':\n return (LucideIcons as unknown as Record<string, LucideIcon>)[mappedName] || null\n\n case 'phosphor':\n if (!PhosphorIcons) {\n return null\n }\n return PhosphorIcons?.[mappedName] || null\n\n case 'untitled':\n // Untitled Icons are SVG-based, handled separately\n return null\n\n default:\n return null\n }\n}\n\n/**\n * Direct icon lookup (fallback for icons not in PROJECT_ICONS)\n * \n * 동적으로 Lucide 아이콘을 가져옵니다.\n * icons.ts에 없는 아이콘도 사용 가능하도록 합니다.\n * \n * Dynamically loads Lucide icons.\n * Allows using icons not in icons.ts.\n * \n * @param iconName - 아이콘 이름 / Icon name\n * @param provider - 아이콘 프로바이더 / Icon provider\n * @returns 아이콘 컴포넌트 또는 null / Icon component or null\n */\nfunction getIconDirect(\n iconName: string,\n provider: IconProvider | 'lucide' | 'phosphor' | 'untitled'\n): LucideIcon | React.ComponentType<Record<string, unknown>> | null {\n switch (provider) {\n case 'lucide':\n // icons.ts에 없는 아이콘을 동적으로 찾기\n // PascalCase 변환 시도\n const lucideName = iconName.charAt(0).toUpperCase() + iconName.slice(1)\n // camelCase도 시도\n const camelCaseName = iconName.replace(/([A-Z])/g, (match, p1) =>\n match === iconName[0] ? match.toLowerCase() : match\n )\n\n return (LucideIcons as unknown as Record<string, LucideIcon>)[lucideName] ||\n (LucideIcons as unknown as Record<string, LucideIcon>)[iconName] ||\n (LucideIcons as unknown as Record<string, LucideIcon>)[camelCaseName] ||\n null\n\n case 'phosphor':\n if (!PhosphorIcons) {\n return null\n }\n const phosphorName1 = iconName.charAt(0).toUpperCase() + iconName.slice(1)\n const phosphorName2 = iconName\n .split(/(?=[A-Z])/)\n .map(word => word.charAt(0).toUpperCase() + word.slice(1))\n .join('')\n return PhosphorIcons?.[phosphorName1] ||\n PhosphorIcons?.[phosphorName2] ||\n PhosphorIcons?.[iconName] ||\n null\n\n case 'untitled':\n return null\n\n default:\n return null\n }\n}\n\n/**\n * Get icon name for provider\n * \n * 프로바이더별 아이콘 이름을 가져옵니다.\n * Gets icon name for the specified provider.\n * \n * @param iconName - 아이콘 이름 / Icon name\n * @param provider - 아이콘 프로바이더 / Icon provider\n * @returns 프로바이더별 아이콘 이름 / Icon name for provider\n */\nexport function getIconNameForProvider(\n iconName: string,\n provider: IconProvider | 'lucide' | 'phosphor' | 'untitled'\n): string {\n const iconMapping = PROJECT_ICONS[iconName as keyof typeof PROJECT_ICONS]\n if (iconMapping && iconMapping[provider]) {\n return iconMapping[provider]\n }\n return iconName\n}\n\n/**\n * Get all project icon names\n */\nexport function getProjectIconNames(): string[] {\n return Object.keys(PROJECT_ICONS)\n}\n","/**\n * Icon Aliases\n * \n * 여러 이름이 같은 아이콘을 가리키도록 하는 alias 시스템\n * DX 향상을 위해 직관적인 이름들을 지원합니다.\n */\n\nexport const ICON_ALIASES: Record<string, string> = {\n // Navigation aliases\n 'back': 'arrowLeft',\n 'prev': 'arrowLeft',\n 'previous': 'arrowLeft',\n 'forward': 'arrowRight',\n 'next': 'arrowRight',\n \n // Close aliases\n 'close': 'x',\n 'cancel': 'x',\n \n // Delete aliases\n 'remove': 'delete',\n 'trash': 'delete',\n \n // Add aliases\n 'plus': 'add',\n 'new': 'add',\n \n // Edit aliases\n 'pencil': 'edit',\n 'modify': 'edit',\n \n // Save aliases\n 'store': 'save',\n 'floppy': 'save',\n \n // Search aliases\n 'magnify': 'search',\n \n // User aliases\n 'person': 'user',\n 'account': 'user',\n 'profile': 'user',\n \n // Settings aliases\n 'gear': 'settings',\n 'config': 'settings',\n 'preferences': 'settings',\n \n // Home aliases\n 'house': 'home',\n 'main': 'home',\n \n // Check aliases\n 'done': 'check',\n 'complete': 'check',\n 'tick': 'check',\n \n // Info aliases\n 'information': 'info',\n 'help': 'info',\n \n // Warning aliases\n 'alert': 'warning',\n 'caution': 'warning',\n \n // Success aliases\n 'checkmark': 'success',\n 'checkCircle': 'success',\n \n // Error aliases\n 'fail': 'error',\n 'cross': 'error',\n 'xCircle': 'error',\n \n // Loading aliases\n 'spinner': 'loader',\n 'loading': 'loader',\n 'wait': 'loader',\n \n // Refresh aliases\n 'reload': 'refresh',\n 'update': 'refresh',\n 'sync': 'refresh',\n \n // Eye aliases\n 'show': 'eye',\n 'view': 'eye',\n 'hide': 'eyeOff',\n 'hidden': 'eyeOff',\n \n // Lock aliases\n 'secure': 'lock',\n 'locked': 'lock',\n 'unsecure': 'unlock',\n 'unlocked': 'unlock',\n \n // Download aliases\n 'get': 'download',\n 'fetch': 'download',\n \n // Upload aliases\n 'post': 'upload',\n \n // Share aliases\n 'send': 'share',\n 'export': 'share',\n \n // Copy aliases\n 'duplicate': 'copy',\n 'clone': 'copy',\n \n // Mail aliases\n 'email': 'mail',\n 'envelope': 'mail',\n \n // Message aliases\n 'chat': 'message',\n 'comment': 'message',\n 'talk': 'message',\n \n // Calendar aliases\n 'date': 'calendar',\n 'schedule': 'calendar',\n \n // Clock aliases\n 'time': 'clock',\n 'watch': 'clock',\n \n // File aliases\n 'document': 'fileText',\n 'doc': 'fileText',\n 'text': 'fileText',\n \n // Folder aliases\n 'directory': 'folder',\n 'dir': 'folder',\n \n // Image aliases\n 'picture': 'image',\n 'img': 'image',\n \n // Video aliases\n 'movie': 'video',\n 'film': 'video',\n \n // Camera aliases\n 'photo': 'camera',\n 'capture': 'camera',\n \n // Play aliases\n 'start': 'play',\n 'run': 'play',\n \n // Pause aliases\n 'stop': 'pause',\n 'halt': 'pause',\n \n // Heart aliases\n 'like': 'heart',\n 'love': 'heart',\n \n // Star aliases\n 'favorite': 'star',\n \n // Bookmark aliases\n 'saveBookmark': 'bookmark',\n \n // Bell aliases\n 'notification': 'bell',\n 'notify': 'bell',\n 'alarm': 'bell',\n \n // Settings aliases\n 'prefs': 'settings',\n \n // Search aliases (duplicate removed - see line 37)\n 'lookup': 'search',\n \n // More aliases\n 'dots': 'moreHorizontal',\n 'moreMenu': 'moreHorizontal',\n 'moreOptions': 'moreVertical',\n \n // External link aliases\n 'external': 'externalLink',\n 'outbound': 'externalLink',\n 'open': 'externalLink',\n \n // Link aliases\n 'url': 'link',\n 'hyperlink': 'link',\n \n // Chart aliases\n 'graph': 'barChart',\n 'stats': 'barChart',\n 'analytics': 'barChart',\n \n // Database aliases\n 'db': 'database',\n 'storage': 'database',\n \n // Activity aliases\n 'pulse': 'activity',\n 'monitor': 'activity',\n \n // Trending aliases\n 'up': 'trendingUp',\n 'down': 'trendingDown',\n \n // Zap aliases\n 'lightning': 'zap',\n 'bolt': 'zap',\n 'flash': 'zap',\n \n // Shield aliases\n 'security': 'shield',\n 'protect': 'shield',\n \n // Key aliases\n 'password': 'key',\n 'secret': 'key',\n \n // Log in aliases\n 'signin': 'logIn',\n 'login': 'logIn',\n 'enter': 'logIn',\n \n // Log out aliases\n 'signout': 'logOut',\n 'logout': 'logOut',\n 'exit': 'logOut',\n \n // Users aliases\n 'people': 'users',\n 'group': 'users',\n 'team': 'users',\n \n // User plus aliases\n 'addUser': 'userPlus',\n 'invite': 'userPlus',\n \n // Book aliases\n 'read': 'book',\n 'library': 'book',\n \n // Book open aliases\n 'reading': 'bookOpen',\n 'openBook': 'bookOpen',\n \n // Sun aliases\n 'light': 'sun',\n 'day': 'sun',\n \n // Moon aliases\n 'dark': 'moon',\n 'night': 'moon',\n \n // Monitor aliases\n 'screen': 'monitor',\n 'display': 'monitor',\n \n // Brain aliases\n 'ai': 'brain',\n 'intelligence': 'brain',\n 'think': 'brain',\n \n // Lightbulb aliases\n 'idea': 'lightbulb',\n 'bulb': 'lightbulb',\n 'inspiration': 'lightbulb',\n \n // Sparkles aliases\n 'magic': 'sparkles',\n 'stars': 'sparkles',\n 'glitter': 'sparkles',\n} as const\n\n/**\n * Resolve icon alias to actual icon name\n * \n * @param iconName - 아이콘 이름 또는 별칭 / Icon name or alias\n * @returns 실제 아이콘 이름 / Actual icon name\n * @throws {TypeError} iconName이 문자열이 아닌 경우\n */\nexport function resolveIconAlias(iconName: string): string {\n if (typeof iconName !== 'string') {\n throw new TypeError('iconName must be a string');\n }\n return ICON_ALIASES[iconName] || iconName;\n}\n\n/**\n * Get all aliases for an icon name\n * \n * @param iconName - 아이콘 이름 / Icon name\n * @returns 해당 아이콘의 모든 별칭 배열 / Array of all aliases for the icon\n * @throws {TypeError} iconName이 문자열이 아닌 경우\n */\nexport function getIconAliases(iconName: string): string[] {\n if (typeof iconName !== 'string') {\n throw new TypeError('iconName must be a string');\n }\n return Object.entries(ICON_ALIASES)\n .filter(([_, target]) => target === iconName)\n .map(([alias]) => alias);\n}\n\n\n","/**\n * Icon Config Types\n * \n * Icon 시스템의 설정 타입 정의\n * 상태관리는 서비스 레벨에서 관리 (Zustand 등)\n */\n\nexport type IconSet = 'lucide' | 'phosphor' | 'untitled'\n\nexport type PhosphorWeight = 'thin' | 'light' | 'regular' | 'bold' | 'duotone' | 'fill'\n\nexport interface IconConfig {\n set: IconSet\n weight: PhosphorWeight\n size: number\n color: string\n strokeWidth?: number // Lucide/Untitled용\n}\n\nexport const defaultIconConfig: IconConfig = {\n set: 'phosphor',\n weight: 'regular',\n size: 20,\n color: 'currentColor',\n strokeWidth: 1.25,\n}\n\n/**\n * 세트별 기본 strokeWidth\n */\nexport const getDefaultStrokeWidth = (set: IconSet): number => {\n switch (set) {\n case 'lucide':\n return 1.25\n case 'phosphor':\n return 1.25 // Phosphor는 weight 사용\n case 'untitled':\n return 1.5\n default:\n return 1.25\n }\n}\n","'use client'\n\n/**\n * IconProvider - Icon 시스템 전역 설정 Provider\n * \n * React Context를 사용하여 전역 아이콘 설정을 제공합니다.\n * 서비스 레벨에서 Zustand 등으로 상태관리 후 props로 전달 가능합니다.\n * \n * IconProvider - Global Icon Settings Provider\n * \n * Provides global icon settings using React Context API.\n * Can be integrated with state management (e.g., Zustand) at the service level.\n */\n\nimport React, { createContext, useContext } from 'react'\nimport { type IconConfig, type IconSet, type PhosphorWeight, defaultIconConfig } from './icon-store'\n\n/**\n * IconProvider 컴포넌트 Props\n * \n * IconProvider component props interface.\n * \n * @interface IconProviderProps\n */\nexport interface IconProviderProps {\n /** 아이콘 세트 (lucide, phosphor, untitled) / Icon set (lucide, phosphor, untitled) */\n set?: IconSet\n /** Phosphor 아이콘 weight (thin, light, regular, bold, duotone, fill) / Phosphor icon weight */\n weight?: PhosphorWeight\n /** 기본 아이콘 크기 / Default icon size */\n size?: number\n /** 기본 아이콘 색상 / Default icon color */\n color?: string\n /** Lucide/Untitled 아이콘 stroke width / Lucide/Untitled icon stroke width */\n strokeWidth?: number\n /** 자식 컴포넌트 / Child components */\n children: React.ReactNode\n}\n\ninterface IconContextValue extends IconConfig {}\n\nconst IconContext = createContext<IconContextValue>(defaultIconConfig)\n\n/**\n * IconProvider 컴포넌트\n * \n * 전역 아이콘 설정을 Context로 제공합니다.\n * 서비스에서 Zustand로 관리한 값을 props로 전달할 수 있습니다.\n * \n * IconProvider component\n * \n * Provides global icon settings through Context API.\n * Can receive values managed by Zustand at the service level.\n * \n * @component\n * @example\n * ```tsx\n * // 기본 사용 / Basic usage\n * <IconProvider set=\"phosphor\" weight=\"regular\" size={20}>\n * <App />\n * </IconProvider>\n * \n * // Zustand와 함께 사용 / With Zustand\n * const iconConfig = useIconStore(state => state.iconConfig)\n * <IconProvider {...iconConfig}>\n * <App />\n * </IconProvider>\n * \n * // Lucide 아이콘 사용 / Using Lucide icons\n * <IconProvider set=\"lucide\" size={24} strokeWidth={1.5}>\n * <App />\n * </IconProvider>\n * ```\n * \n * @param props - IconProvider 컴포넌트 props / IconProvider component props\n * @returns IconProvider 컴포넌트 / IconProvider component\n */\nexport function IconProvider({\n set = defaultIconConfig.set,\n weight = defaultIconConfig.weight,\n size = defaultIconConfig.size,\n color = defaultIconConfig.color,\n strokeWidth = defaultIconConfig.strokeWidth,\n children,\n}: IconProviderProps) {\n const value: IconContextValue = {\n set,\n weight,\n size,\n color,\n strokeWidth,\n }\n\n return (\n <IconContext.Provider value={value}>\n {children}\n </IconContext.Provider>\n )\n}\n\n/**\n * useIconContext Hook\n * \n * Icon Context를 사용하는 Hook입니다.\n * Icon 컴포넌트 내부에서 사용됩니다.\n * \n * Hook to use Icon Context.\n * Used internally by Icon component.\n * \n * @returns Icon 설정 값 / Icon configuration value\n * \n * @example\n * ```tsx\n * // Icon 컴포넌트 내부에서 사용 / Used inside Icon component\n * const config = useIconContext()\n * const iconSet = config.set\n * const iconSize = config.size\n * ```\n */\nexport function useIconContext(): IconContextValue {\n return useContext(IconContext)\n}\n\n// Re-export types for convenience\nexport type { IconSet, PhosphorWeight, IconConfig } from './icon-store'\nexport { defaultIconConfig, getDefaultStrokeWidth } from './icon-store'\n\n","import React from 'react'\nimport type { LucideProps } from 'lucide-react'\nimport { merge, mergeMap } from '../../lib/utils'\nimport { icons, IconName, emotionIcons, statusIcons } from '../../lib/icons'\nimport { getIconFromProvider, initPhosphorIcons } from '../../lib/icon-providers'\nimport { resolveIconAlias } from '../../lib/icon-aliases'\nimport { useIconContext, type IconSet } from './IconProvider'\nimport { type PhosphorWeight } from './icon-store'\nimport type { AllIconName } from '../../lib/icon-names'\n\n/**\n * Icon 컴포넌트 Props\n * \n * Icon component props interface.\n * \n * @interface IconProps\n */\nexport interface IconProps {\n /** 아이콘 이름 / Icon name */\n name: AllIconName\n /** 아이콘 크기 (숫자 또는 문자열) / Icon size (number or string) */\n size?: number | string\n /** 추가 CSS 클래스 / Additional CSS classes */\n className?: string\n /** 감정 아이콘 타입 / Emotion icon type */\n emotion?: keyof typeof emotionIcons\n /** 상태 아이콘 타입 / Status icon type */\n status?: keyof typeof statusIcons\n /** 아이콘 프로바이더 오버라이드 (전역 설정 무시) / Icon provider override (ignores global config) */\n provider?: IconSet\n /** 부드러운 애니메이션 효과 / Smooth animation effect */\n animated?: boolean\n /** 펄스 애니메이션 / Pulse animation */\n pulse?: boolean\n /** 회전 애니메이션 / Spin animation */\n spin?: boolean\n /** 바운스 애니메이션 / Bounce animation */\n bounce?: boolean\n /** 색상 변형 / Color variant */\n variant?: 'default' | 'primary' | 'secondary' | 'success' | 'warning' | 'error' | 'muted'\n /** Phosphor 아이콘 weight 오버라이드 / Phosphor icon weight override */\n weight?: PhosphorWeight\n /** 스크린 리더용 라벨 (의미 있는 아이콘인 경우) / Screen reader label (for meaningful icons) */\n 'aria-label'?: string\n /** 장식용 아이콘인 경우 true (스크린 리더에서 숨김) / Set to true for decorative icons (hidden from screen readers) */\n 'aria-hidden'?: boolean\n}\n\n/**\n * Icon 컴포넌트\n * \n * 다중 아이콘 라이브러리(Lucide, Phosphor, Untitled)를 지원하는 통합 아이콘 컴포넌트입니다.\n * IconProvider를 통해 전역 설정을 관리할 수 있으며, 개별 아이콘에서도 설정을 오버라이드할 수 있습니다.\n * \n * Icon component that supports multiple icon libraries (Lucide, Phosphor, Untitled).\n * Global settings can be managed through IconProvider, and individual icons can override settings.\n * \n * @component\n * @example\n * ```tsx\n * // 기본 사용 / Basic usage\n * <Icon name=\"heart\" />\n * \n * // 크기 지정 / Specify size\n * <Icon name=\"user\" size={24} />\n * \n * // 색상 변형 / Color variant\n * <Icon name=\"check\" variant=\"success\" />\n * \n * // 애니메이션 / Animation\n * <Icon name=\"loader\" spin />\n * <Icon name=\"heart\" pulse />\n * \n * // 접근성 / Accessibility\n * <Icon name=\"search\" aria-label=\"검색\" />\n * <Icon name=\"decorative-icon\" aria-hidden />\n * \n * // 감정 아이콘 / Emotion icon\n * <Icon emotion=\"happy\" />\n * \n * // 상태 아이콘 / Status icon\n * <Icon status=\"loading\" spin />\n * ```\n * \n * @param props - Icon 컴포넌트 props / Icon component props\n * @returns Icon 컴포넌트 / Icon component\n */\nconst IconComponent = React.forwardRef<HTMLSpanElement, IconProps>(({\n name,\n size,\n className,\n emotion,\n status,\n provider,\n weight,\n animated = false,\n pulse = false,\n spin = false,\n bounce = false,\n variant = 'default',\n 'aria-label': ariaLabel,\n 'aria-hidden': ariaHidden\n}, ref) => {\n // Context에서 전역 설정 가져오기\n const config = useIconContext()\n \n // prop으로 오버라이드 가능, 없으면 Context에서 가져옴\n const iconSet = provider || config.set\n const iconSize = size ?? config.size\n const iconWeight = weight || config.weight\n const iconColor = config.color\n const iconStrokeWidth = config.strokeWidth ?? 1.25\n \n // 클라이언트 사이드에서만 아이콘 렌더링 (hydration 오류 방지)\n const [isClient, setIsClient] = React.useState(false)\n const [phosphorReady, setPhosphorReady] = React.useState(false)\n \n React.useEffect(() => {\n setIsClient(true)\n \n // Phosphor Icons 초기화 (provider가 phosphor일 때만)\n if (iconSet === 'phosphor') {\n initPhosphorIcons().then(() => {\n setPhosphorReady(true)\n })\n } else {\n setPhosphorReady(true)\n }\n }, [iconSet])\n\n // 감정이나 상태가 지정되면 해당 아이콘으로 오버라이드\n let iconName = emotion ? emotionIcons[emotion] : \n status ? statusIcons[status] : \n name\n \n // Alias 해결 (back, prev → arrowLeft 등)\n iconName = resolveIconAlias(iconName) as AllIconName\n \n // 색상 변형 클래스 (먼저 선언 - fallback에서 사용)\n const variantClasses = mergeMap({\n 'text-gray-900 dark:text-white': variant === 'default',\n 'text-blue-600 dark:text-blue-400': variant === 'primary',\n 'text-gray-600 dark:text-gray-400': variant === 'secondary',\n 'text-green-600 dark:text-green-400': variant === 'success',\n 'text-yellow-600 dark:text-yellow-400': variant === 'warning',\n 'text-red-600 dark:text-red-400': variant === 'error',\n 'text-gray-500 dark:text-gray-500': variant === 'muted',\n })\n \n // 서버사이드에서는 빈 span 반환 (hydration 오류 방지)\n // Return empty span on server-side (prevent hydration errors)\n if (!isClient || (iconSet === 'phosphor' && !phosphorReady)) {\n return (\n <span\n style={{ width: iconSize, height: iconSize }}\n className={merge(variantClasses, className)}\n aria-hidden={ariaHidden !== undefined ? ariaHidden : true}\n aria-label={ariaLabel}\n />\n )\n }\n\n // Provider에 따라 아이콘 가져오기\n type IconComponentType = React.ComponentType<LucideProps | React.SVGProps<SVGSVGElement> | Record<string, unknown>>\n let IconComponent: IconComponentType | null = null\n \n if (iconSet === 'lucide') {\n // 1. icons.ts에서 먼저 찾기 (실제 사용되는 아이콘만 포함)\n // 타입 단언: AllIconName에는 있지만 icons 객체에 없는 경우를 위해\n IconComponent = (icons[iconName as IconName] || null) as IconComponentType | null\n \n // 2. 없으면 동적으로 Lucide에서 가져오기 (fallback)\n if (!IconComponent) {\n IconComponent = getIconFromProvider(iconName, iconSet) as IconComponentType | null\n }\n } else {\n // Phosphor나 다른 provider는 getIconFromProvider 사용\n // phosphorReady가 true일 때만 호출됨 (위에서 체크)\n IconComponent = getIconFromProvider(iconName, iconSet) as IconComponentType | null\n }\n \n if (!IconComponent) {\n console.warn(`Icon \"${iconName}\" not found for provider \"${iconSet}\"`)\n // Fallback: 빈 원형 아이콘 표시 (에러 표시)\n // Fallback: display empty circle icon (error indicator)\n return (\n <span\n ref={ref}\n className={merge(\n 'inline-flex items-center justify-center rounded-full border-2 border-dashed border-gray-300 dark:border-gray-600',\n variantClasses,\n className\n )}\n style={{ width: iconSize, height: iconSize }}\n aria-label={ariaLabel || `아이콘을 찾을 수 없음: ${iconName}`}\n title={`Icon not found: ${iconName}`}\n >\n <span className=\"text-xs text-gray-400 dark:text-gray-500\" aria-hidden=\"true\">\n ?\n </span>\n </span>\n )\n }\n \n // 세트별 props 준비\n type IconPropsType = LucideProps & {\n size?: number\n width?: number | string\n height?: number | string\n color?: string\n weight?: PhosphorWeight\n strokeWidth?: number\n }\n \n const iconProps: IconPropsType = {\n size: typeof iconSize === 'number' ? iconSize : undefined,\n width: typeof iconSize === 'string' ? iconSize : iconSize,\n height: typeof iconSize === 'string' ? iconSize : iconSize,\n color: iconColor,\n } as IconPropsType\n \n // Phosphor는 weight 사용\n if (iconSet === 'phosphor') {\n iconProps.weight = iconWeight\n } else {\n // Lucide/Untitled는 strokeWidth 사용\n iconProps.strokeWidth = iconStrokeWidth\n }\n\n // 애니메이션 클래스 생성\n const animationClasses = mergeMap({\n 'animate-pulse': pulse,\n 'animate-spin': spin,\n 'animate-bounce': bounce,\n 'transition-all duration-200 ease-in-out': animated,\n })\n\n // 접근성 속성 결정 / Determine accessibility attributes\n // aria-label이 제공되면 사용, 없으면 aria-hidden이 true인지 확인\n // If aria-label is provided, use it; otherwise check if aria-hidden is true\n const accessibilityProps: React.AriaAttributes = {}\n \n if (ariaLabel) {\n accessibilityProps['aria-label'] = ariaLabel\n accessibilityProps['aria-hidden'] = false\n } else if (ariaHidden !== undefined) {\n accessibilityProps['aria-hidden'] = ariaHidden\n } else {\n // 기본값: 장식용으로 간주 (의미 있는 아이콘은 명시적으로 aria-label 제공 필요)\n // Default: considered decorative (meaningful icons should explicitly provide aria-label)\n accessibilityProps['aria-hidden'] = true\n }\n\n return (\n <span\n ref={ref}\n className={merge(\n 'inline-flex items-center justify-center',\n animationClasses,\n variantClasses,\n className\n )}\n style={{ width: iconSize, height: iconSize }}\n {...accessibilityProps}\n >\n {IconComponent && React.createElement(IconComponent, { \n ...iconProps,\n className: variantClasses,\n 'aria-hidden': true // SVG 내부 요소는 항상 숨김 (외부 span이 접근성 담당)\n } as React.ComponentProps<typeof IconComponent>)}\n </span>\n )\n})\n\nIconComponent.displayName = 'Icon'\n\n// 성능 최적화: React.memo 적용\n// Performance optimization: Apply React.memo\n// forwardRef와 함께 사용할 때는 React.memo로 감싸기\n// When using with forwardRef, wrap with React.memo\nconst MemoizedIcon = React.memo(IconComponent, (prevProps, nextProps) => {\n // props 비교 함수: 변경된 props만 체크\n // Props comparison function: only check changed props\n return (\n prevProps.name === nextProps.name &&\n prevProps.size === nextProps.size &&\n prevProps.className === nextProps.className &&\n prevProps.emotion === nextProps.emotion &&\n prevProps.status === nextProps.status &&\n prevProps.provider === nextProps.provider &&\n prevProps.animated === nextProps.animated &&\n prevProps.pulse === nextProps.pulse &&\n prevProps.spin === nextProps.spin &&\n prevProps.bounce === nextProps.bounce &&\n prevProps.variant === nextProps.variant &&\n prevProps.weight === nextProps.weight &&\n prevProps['aria-label'] === nextProps['aria-label'] &&\n prevProps['aria-hidden'] === nextProps['aria-hidden']\n )\n})\n\n// 타입 안전성을 위해 export\n// Export for type safety\nexport const Icon = MemoizedIcon as typeof IconComponent\n\nIcon.displayName = 'Icon'\n\n/**\n * EmotionIcon 컴포넌트\n * \n * 감정을 표현하는 아이콘 컴포넌트입니다.\n * Icon component for expressing emotions.\n * \n * @component\n * @example\n * ```tsx\n * <EmotionIcon emotion=\"happy\" />\n * <EmotionIcon emotion=\"sad\" size={24} />\n * ```\n */\nexport const EmotionIcon = React.forwardRef<HTMLSpanElement, Omit<IconProps, 'name'> & { emotion: keyof typeof emotionIcons }>(\n (props, ref) => <Icon ref={ref} name=\"smile\" {...props} />\n)\n\nEmotionIcon.displayName = 'EmotionIcon'\n\n/**\n * StatusIcon 컴포넌트\n * \n * 상태를 표현하는 아이콘 컴포넌트입니다.\n * Icon component for expressing status.\n * \n * @component\n * @example\n * ```tsx\n * <StatusIcon status=\"loading\" spin />\n * <StatusIcon status=\"success\" variant=\"success\" />\n * ```\n */\nexport const StatusIcon = React.forwardRef<HTMLSpanElement, Omit<IconProps, 'name'> & { status: keyof typeof statusIcons }>(\n (props, ref) => <Icon ref={ref} name=\"info\" {...props} />\n)\n\nStatusIcon.displayName = 'StatusIcon'\n\n/**\n * LoadingIcon 컴포넌트\n * \n * 로딩 상태를 표시하는 전용 아이콘 컴포넌트입니다.\n * Dedicated icon component for displaying loading status.\n * \n * @component\n * @example\n * ```tsx\n * <LoadingIcon />\n * <LoadingIcon size={32} />\n * ```\n */\nexport const LoadingIcon = React.forwardRef<HTMLDivElement, Omit<IconProps, 'name' | 'status'>>(\n (props, ref) => (\n <Icon ref={ref} name=\"loader\" status=\"loading\" spin aria-label=\"로딩 중\" {...props} />\n )\n)\n\nLoadingIcon.displayName = 'LoadingIcon'\n\n/**\n * SuccessIcon 컴포넌트\n * \n * 성공 상태를 표시하는 전용 아이콘 컴포넌트입니다.\n * Dedicated icon component for displaying success status.\n * \n * @component\n * @example\n * ```tsx\n * <SuccessIcon />\n * <SuccessIcon size={24} />\n * ```\n */\nexport const SuccessIcon = React.forwardRef<HTMLDivElement, Omit<IconProps, 'name' | 'status'>>(\n (props, ref) => (\n <Icon ref={ref} name=\"check\" status=\"success\" variant=\"success\" aria-label=\"성공\" {...props} />\n )\n)\n\nSuccessIcon.displayName = 'SuccessIcon'\n\n/**\n * ErrorIcon 컴포넌트\n * \n * 에러 상태를 표시하는 전용 아이콘 컴포넌트입니다.\n * Dedicated icon component for displaying error status.\n * \n * @component\n * @example\n * ```tsx\n * <ErrorIcon />\n * <ErrorIcon size={24} />\n * ```\n */\nexport const ErrorIcon = React.forwardRef<HTMLDivElement, Omit<IconProps, 'name' | 'status'>>(\n (props, ref) => (\n <Icon ref={ref} name=\"alertCircle\" status=\"error\" variant=\"error\" aria-label=\"오류\" {...props} />\n )\n)\n\nErrorIcon.displayName = 'ErrorIcon'\n\n","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\nimport { Icon } from \"./Icon\"\n\n/**\n * Select 컴포넌트의 props / Select component props\n * @typedef {Object} SelectProps\n * @property {\"default\" | \"outline\" | \"filled\" | \"ghost\" | \"glass\"} [variant=\"default\"] - Select 스타일 변형 / Select style variant\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - Select 크기 / Select size\n * @property {boolean} [error=false] - 에러 상태 표시 / Error state\n * @property {boolean} [success=false] - 성공 상태 표시 / Success state\n * @property {React.ReactNode} [leftIcon] - 왼쪽 아이콘 / Left icon\n * @property {string} [placeholder] - 플레이스홀더 텍스트 / Placeholder text\n * @extends {Omit<React.SelectHTMLAttributes<HTMLSelectElement>, 'size'>}\n */\nexport interface SelectProps extends Omit<React.SelectHTMLAttributes<HTMLSelectElement>, 'size'> {\n variant?: \"default\" | \"outline\" | \"filled\" | \"ghost\" | \"glass\"\n size?: \"sm\" | \"md\" | \"lg\"\n error?: boolean\n success?: boolean\n leftIcon?: React.ReactNode\n placeholder?: string\n}\n\n/**\n * SelectOption 컴포넌트의 props / SelectOption component props\n * @typedef {Object} SelectOptionProps\n * @property {string} value - 옵션 값 / Option value\n * @property {React.ReactNode} children - 옵션 표시 텍스트 / Option display text\n * @extends {React.OptionHTMLAttributes<HTMLOptionElement>}\n */\nexport interface SelectOptionProps extends React.OptionHTMLAttributes<HTMLOptionElement> {\n value: string\n children: React.ReactNode\n}\n\n/**\n * Select 컴포넌트 / Select component\n * \n * 드롭다운 선택 메뉴를 제공하는 컴포넌트입니다.\n * 다양한 스타일 변형과 크기를 지원하며, 접근성 속성을 포함합니다.\n * \n * Dropdown selection menu component.\n * Supports various style variants and sizes, includes accessibility attributes.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Select>\n * <option value=\"option1\">옵션 1</option>\n * <option value=\"option2\">옵션 2</option>\n * </Select>\n * \n * @example\n * // 에러 상태와 아이콘 / Error state with icon\n * <Select \n * error \n * leftIcon={<Icon name=\"alert\" />}\n * aria-label=\"국가 선택\"\n * >\n * <option value=\"\">국가를 선택하세요</option>\n * <option value=\"kr\">한국</option>\n * <option value=\"us\">미국</option>\n * </Select>\n * \n * @example\n * // 다양한 변형 / Various variants\n * <Select variant=\"outline\" size=\"lg\">\n * <option value=\"1\">항목 1</option>\n * </Select>\n * \n * @param {SelectProps} props - Select 컴포넌트의 props / Select component props\n * @param {React.Ref<HTMLSelectElement>} ref - select 요소 ref / select element ref\n * @returns {JSX.Element} Select 컴포넌트 / Select component\n */\nconst Select = React.forwardRef<HTMLSelectElement, SelectProps>(\n ({ \n className, \n variant = \"default\",\n size = \"md\",\n error = false,\n success = false,\n leftIcon,\n placeholder,\n children,\n \"aria-label\": ariaLabel,\n \"aria-invalid\": ariaInvalid,\n ...props \n }, ref) => {\n const variantClasses = {\n default: \"border-gray-300 bg-white text-gray-900 focus:border-blue-500 focus:ring-blue-500 dark:border-gray-600 dark:bg-gray-800 dark:text-white dark:focus:border-blue-400 dark:focus:ring-blue-400\",\n outline: \"border-2 border-gray-200 bg-transparent text-gray-900 focus:border-blue-500 focus:ring-blue-500 dark:border-gray-700 dark:text-white dark:focus:border-blue-400 dark:focus:ring-blue-400\",\n filled: \"border-transparent bg-gray-50 text-gray-900 focus:bg-white focus:border-blue-500 focus:ring-blue-500 dark:bg-gray-700 dark:text-white dark:focus:bg-gray-800 dark:focus:border-blue-400 dark:focus:ring-blue-400\",\n ghost: \"border-transparent bg-transparent text-gray-900 focus:bg-gray-50 focus:border-gray-300 focus:ring-gray-500 dark:text-white dark:focus:bg-gray-800 dark:focus:border-gray-600 dark:focus:ring-gray-400\",\n glass: \"border-white/30 bg-white/10 backdrop-blur-sm text-white focus:border-blue-400/50 focus:ring-blue-400/20 focus:bg-white/20 dark:border-slate-600/50 dark:bg-slate-800/10 dark:text-slate-200 dark:focus:border-blue-400/50 dark:focus:ring-blue-400/20 dark:focus:bg-slate-700/20\"\n }\n\n const sizeClasses = {\n sm: \"h-8 px-3 text-sm\",\n md: \"h-10 px-4 text-base\",\n lg: \"h-12 px-4 text-lg\"\n }\n\n const stateClasses = error \n ? \"border-red-500 focus:border-red-500 focus:ring-red-500 dark:border-red-400 dark:focus:border-red-400 dark:focus:ring-red-400\"\n : success\n ? \"border-green-500 focus:border-green-500 focus:ring-green-500 dark:border-green-400 dark:focus:border-green-400 dark:focus:ring-green-400\"\n : \"\"\n\n const selectRef = React.useRef<HTMLSelectElement>(null)\n const combinedRef = React.useCallback((node: HTMLSelectElement | null) => {\n selectRef.current = node\n if (typeof ref === 'function') {\n ref(node)\n } else if (ref) {\n (ref as React.MutableRefObject<HTMLSelectElement | null>).current = node\n }\n }, [ref])\n \n const [isFocused, setIsFocused] = React.useState(false)\n\n return (\n <div className=\"relative\">\n {leftIcon && (\n <div className=\"absolute left-3 top-1/2 transform -translate-y-1/2 text-gray-400 dark:text-gray-500 pointer-events-none z-10\">\n {leftIcon}\n </div>\n )}\n <select\n ref={combinedRef}\n className={merge(\n \"flex w-full appearance-none rounded-md border transition-all duration-200\",\n \"focus:outline-none focus:ring-2 focus:ring-offset-2\",\n \"hover:border-blue-400 hover:shadow-sm\",\n \"disabled:cursor-not-allowed disabled:opacity-50 disabled:hover:border-gray-300\",\n variantClasses[variant],\n sizeClasses[size],\n stateClasses,\n leftIcon ? \"pl-10\" : \"\",\n \"pr-10\", // 화살표 아이콘을 위한 공간\n className\n )}\n aria-label={ariaLabel || (placeholder ? undefined : \"선택\")}\n aria-invalid={ariaInvalid !== undefined ? ariaInvalid : (error || undefined)}\n onFocus={(e) => {\n setIsFocused(true)\n props.onFocus?.(e)\n }}\n onBlur={(e) => {\n setIsFocused(false)\n props.onBlur?.(e)\n }}\n {...props}\n >\n {placeholder && (\n <option value=\"\" disabled>\n {placeholder}\n </option>\n )}\n {children}\n </select>\n <div className={merge(\n \"absolute right-3 top-1/2 transform -translate-y-1/2 text-gray-400 dark:text-gray-500 pointer-events-none transition-transform duration-200\",\n isFocused && \"rotate-180\"\n )}>\n <Icon name=\"chevronDown\" size={16} />\n </div>\n </div>\n )\n }\n)\nSelect.displayName = \"Select\"\n\nconst SelectOption = React.forwardRef<HTMLOptionElement, SelectOptionProps>(\n ({ className, ...props }, ref) => (\n <option\n className={className || \"\"}\n ref={ref}\n {...props}\n />\n )\n)\nSelectOption.displayName = \"SelectOption\"\n\nexport { Select, SelectOption } ","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\nimport { Icon } from \"./Icon\"\n\n/**\n * Checkbox 컴포넌트의 props / Checkbox component props\n * @typedef {Object} CheckboxProps\n * @property {\"default\" | \"outline\" | \"filled\" | \"glass\"} [variant=\"default\"] - Checkbox 스타일 변형 / Checkbox style variant\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - Checkbox 크기 / Checkbox size\n * @property {boolean} [error=false] - 에러 상태 표시 / Error state\n * @property {boolean} [success=false] - 성공 상태 표시 / Success state\n * @property {string} [label] - 체크박스 레이블 텍스트 / Checkbox label text\n * @property {string} [description] - 체크박스 설명 텍스트 / Checkbox description text\n * @extends {Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size'>}\n */\nexport interface CheckboxProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size'> {\n variant?: \"default\" | \"outline\" | \"filled\" | \"glass\"\n size?: \"sm\" | \"md\" | \"lg\"\n error?: boolean\n success?: boolean\n label?: string\n description?: string\n}\n\n/**\n * Checkbox 컴포넌트 / Checkbox component\n * \n * 체크박스 입력 필드를 제공하는 컴포넌트입니다.\n * ARIA 속성을 자동으로 설정하여 접근성을 지원합니다.\n * \n * Checkbox input field component.\n * Automatically sets ARIA attributes for accessibility support.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Checkbox label=\"이용약관에 동의합니다\" />\n * \n * @example\n * // 에러 상태와 설명 / Error state with description\n * <Checkbox \n * label=\"필수 항목\"\n * description=\"이 항목은 필수입니다\"\n * error\n * />\n * \n * @example\n * // 제어 컴포넌트 / Controlled component\n * const [checked, setChecked] = useState(false)\n * <Checkbox \n * checked={checked}\n * onChange={(e) => setChecked(e.target.checked)}\n * label=\"동의\"\n * />\n * \n * @param {CheckboxProps} props - Checkbox 컴포넌트의 props / Checkbox component props\n * @param {React.Ref<HTMLInputElement>} ref - input 요소 ref / input element ref\n * @returns {JSX.Element} Checkbox 컴포넌트 / Checkbox component\n */\nconst Checkbox = React.forwardRef<HTMLInputElement, CheckboxProps>(\n ({ \n className, \n variant = \"default\",\n size = \"md\",\n error = false,\n success = false,\n label,\n description,\n id,\n ...props \n }, ref) => {\n const checkboxId = id || React.useId()\n const labelId = label ? `${checkboxId}-label` : undefined\n const descriptionId = description ? `${checkboxId}-description` : undefined\n const sizeClasses = {\n sm: \"w-4 h-4\",\n md: \"w-5 h-5\",\n lg: \"w-6 h-6\"\n }\n\n const iconSizes = {\n sm: 12,\n md: 14,\n lg: 16\n }\n\n const variantClasses = {\n default: \"border-gray-300 bg-white text-blue-600 focus:ring-blue-500 dark:border-gray-600 dark:bg-gray-800 dark:focus:ring-blue-400\",\n outline: \"border-2 border-gray-200 bg-transparent text-blue-600 focus:ring-blue-500 dark:border-gray-700 dark:focus:ring-blue-400\",\n filled: \"border-transparent bg-gray-50 text-blue-600 focus:bg-white focus:ring-blue-500 dark:bg-gray-700 dark:focus:bg-gray-800 dark:focus:ring-blue-400\",\n glass: \"border-white/30 bg-white/10 backdrop-blur-sm text-white focus:ring-blue-400/50 focus:bg-white/20 dark:border-slate-600/50 dark:bg-slate-800/10 dark:focus:ring-blue-400/50 dark:focus:bg-slate-700/20\"\n }\n\n const stateClasses = error \n ? \"border-red-500 focus:ring-red-500 dark:border-red-400 dark:focus:ring-red-400\"\n : success\n ? \"border-green-500 focus:ring-green-500 dark:border-green-400 dark:focus:ring-green-400\"\n : \"\"\n\n const isChecked = props.checked ?? false;\n\n return (\n <div className=\"flex items-start space-x-3\">\n <div className=\"relative\">\n <input\n type=\"checkbox\"\n id={checkboxId}\n className={merge(\n \"peer absolute inset-0 w-full h-full opacity-0 cursor-pointer z-10\",\n className\n )}\n ref={ref}\n aria-checked={isChecked}\n aria-invalid={error}\n aria-label={!label ? props['aria-label'] : undefined}\n aria-labelledby={label ? labelId : undefined}\n aria-describedby={descriptionId}\n role=\"checkbox\"\n {...props}\n />\n <div\n className={merge(\n \"flex items-center justify-center rounded border transition-all duration-200 cursor-pointer relative\",\n \"peer-focus:outline-none peer-focus:ring-2 peer-focus:ring-offset-2\",\n \"peer-hover:border-blue-400 peer-hover:shadow-sm\",\n \"peer-disabled:cursor-not-allowed peer-disabled:opacity-50 peer-disabled:hover:border-gray-300\",\n sizeClasses[size],\n variantClasses[variant],\n stateClasses,\n isChecked && \"bg-blue-600 border-blue-600 dark:bg-blue-500 dark:border-blue-500 shadow-md shadow-blue-500/20\",\n !isChecked && \"bg-white dark:bg-gray-800\"\n )}\n >\n {/* 체크 아이콘으로 개선 */}\n <Icon \n name=\"check\" \n size={iconSizes[size]} \n className={merge(\n \"text-white transition-all duration-200\",\n isChecked ? \"opacity-100 scale-100\" : \"opacity-0 scale-0\"\n )}\n />\n </div>\n </div>\n {(label || description) && (\n <div className=\"flex flex-col\">\n {label && (\n <label htmlFor={checkboxId} id={labelId} className=\"text-sm font-medium text-gray-900 dark:text-white cursor-pointer\">\n {label}\n </label>\n )}\n {description && (\n <p id={descriptionId} className=\"text-sm text-gray-500 dark:text-gray-400\">\n {description}\n </p>\n )}\n </div>\n )}\n </div>\n )\n }\n)\nCheckbox.displayName = \"Checkbox\"\n\nexport { Checkbox } ","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * Radio 컴포넌트의 props / Radio component props\n * @typedef {Object} RadioProps\n * @property {\"default\" | \"outline\" | \"filled\" | \"glass\"} [variant=\"default\"] - Radio 스타일 변형 / Radio style variant\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - Radio 크기 / Radio size\n * @property {boolean} [error=false] - 에러 상태 표시 / Error state\n * @property {boolean} [success=false] - 성공 상태 표시 / Success state\n * @property {string} [label] - 라디오 버튼 레이블 텍스트 / Radio button label text\n * @property {string} [description] - 라디오 버튼 설명 텍스트 / Radio button description text\n * @extends {Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size'>}\n */\nexport interface RadioProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size'> {\n variant?: \"default\" | \"outline\" | \"filled\" | \"glass\"\n size?: \"sm\" | \"md\" | \"lg\"\n error?: boolean\n success?: boolean\n label?: string\n description?: string\n}\n\n/**\n * Radio 컴포넌트 / Radio component\n * \n * 라디오 버튼 입력 필드를 제공하는 컴포넌트입니다.\n * 같은 name 속성을 가진 여러 Radio는 그룹으로 동작합니다.\n * ARIA 속성을 자동으로 설정하여 접근성을 지원합니다.\n * \n * Radio button input field component.\n * Multiple Radio components with the same name attribute work as a group.\n * Automatically sets ARIA attributes for accessibility support.\n * \n * @component\n * @example\n * // 기본 사용 (그룹) / Basic usage (group)\n * <Radio name=\"option\" value=\"1\" label=\"옵션 1\" />\n * <Radio name=\"option\" value=\"2\" label=\"옵션 2\" />\n * <Radio name=\"option\" value=\"3\" label=\"옵션 3\" />\n * \n * @example\n * // 에러 상태 / Error state\n * <Radio \n * name=\"gender\"\n * value=\"male\"\n * label=\"남성\"\n * error\n * />\n * \n * @param {RadioProps} props - Radio 컴포넌트의 props / Radio component props\n * @param {React.Ref<HTMLInputElement>} ref - input 요소 ref / input element ref\n * @returns {JSX.Element} Radio 컴포넌트 / Radio component\n */\nconst Radio = React.forwardRef<HTMLInputElement, RadioProps>(\n ({ \n className, \n variant = \"default\",\n size = \"md\",\n error = false,\n success = false,\n label,\n description,\n id,\n ...props \n }, ref) => {\n const radioId = id || React.useId()\n const labelId = label ? `${radioId}-label` : undefined\n const descriptionId = description ? `${radioId}-description` : undefined\n const sizeClasses = {\n sm: \"w-4 h-4\",\n md: \"w-5 h-5\",\n lg: \"w-6 h-6\"\n }\n\n const dotSizes = {\n sm: \"w-1.5 h-1.5\",\n md: \"w-2 h-2\",\n lg: \"w-2.5 h-2.5\"\n }\n\n const variantClasses = {\n default: \"border-gray-300 bg-white text-blue-600 focus:ring-blue-500 dark:border-gray-600 dark:bg-gray-800 dark:focus:ring-blue-400\",\n outline: \"border-2 border-gray-200 bg-transparent text-blue-600 focus:ring-blue-500 dark:border-gray-700 dark:focus:ring-blue-400\",\n filled: \"border-transparent bg-gray-50 text-blue-600 focus:bg-white focus:ring-blue-500 dark:bg-gray-700 dark:focus:bg-gray-800 dark:focus:ring-blue-400\",\n glass: \"border-white/30 bg-white/10 backdrop-blur-sm text-white focus:ring-blue-400/50 focus:bg-white/20 dark:border-slate-600/50 dark:bg-slate-800/10 dark:focus:ring-blue-400/50 dark:focus:bg-slate-700/20\"\n }\n\n const stateClasses = error \n ? \"border-red-500 focus:ring-red-500 dark:border-red-400 dark:focus:ring-red-400\"\n : success\n ? \"border-green-500 focus:ring-green-500 dark:border-green-400 dark:focus:ring-green-400\"\n : \"\"\n\n return (\n <div className=\"flex items-start space-x-3\">\n <div className=\"relative\">\n <input\n type=\"radio\"\n id={radioId}\n className={merge(\n \"peer sr-only\",\n className\n )}\n ref={ref}\n aria-checked={props.checked ?? false}\n aria-invalid={error}\n aria-label={!label ? props['aria-label'] : undefined}\n aria-labelledby={label ? labelId : undefined}\n aria-describedby={descriptionId}\n role=\"radio\"\n {...props}\n />\n <div\n className={merge(\n \"flex items-center justify-center rounded-full border transition-all duration-200 cursor-pointer\",\n \"peer-focus:outline-none peer-focus:ring-2 peer-focus:ring-offset-2\",\n \"peer-disabled:cursor-not-allowed peer-disabled:opacity-50\",\n sizeClasses[size],\n variantClasses[variant],\n stateClasses,\n \"peer-checked:border-blue-600 dark:peer-checked:border-blue-500\"\n )}\n >\n <div\n className={merge(\n \"rounded-full bg-blue-600 dark:bg-blue-500 opacity-0 peer-checked:opacity-100 transition-opacity duration-200\",\n dotSizes[size]\n )}\n />\n </div>\n </div>\n {(label || description) && (\n <div className=\"flex flex-col\">\n {label && (\n <label htmlFor={radioId} id={labelId} className=\"text-sm font-medium text-gray-900 dark:text-white cursor-pointer\">\n {label}\n </label>\n )}\n {description && (\n <p id={descriptionId} className=\"text-sm text-gray-500 dark:text-gray-400\">\n {description}\n </p>\n )}\n </div>\n )}\n </div>\n )\n }\n)\nRadio.displayName = \"Radio\"\n\nexport { Radio } ","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * Switch 컴포넌트의 props / Switch component props\n * @typedef {Object} SwitchProps\n * @property {\"default\" | \"outline\" | \"filled\" | \"glass\"} [variant=\"default\"] - Switch 스타일 변형 / Switch style variant\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - Switch 크기 / Switch size\n * @property {boolean} [error=false] - 에러 상태 표시 / Error state\n * @property {boolean} [success=false] - 성공 상태 표시 / Success state\n * @property {string} [label] - 스위치 레이블 텍스트 / Switch label text\n * @property {string} [description] - 스위치 설명 텍스트 / Switch description text\n * @extends {Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size'>}\n */\nexport interface SwitchProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size'> {\n variant?: \"default\" | \"outline\" | \"filled\" | \"glass\"\n size?: \"sm\" | \"md\" | \"lg\"\n error?: boolean\n success?: boolean\n label?: string\n description?: string\n}\n\n/**\n * Switch 컴포넌트 / Switch component\n * \n * 토글 스위치 입력 필드를 제공하는 컴포넌트입니다.\n * ARIA 속성을 자동으로 설정하여 접근성을 지원합니다.\n * \n * Toggle switch input field component.\n * Automatically sets ARIA attributes for accessibility support.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Switch label=\"알림 받기\" />\n * \n * @example\n * // 제어 컴포넌트 / Controlled component\n * const [enabled, setEnabled] = useState(false)\n * <Switch \n * checked={enabled}\n * onChange={(e) => setEnabled(e.target.checked)}\n * label=\"다크 모드\"\n * />\n * \n * @example\n * // 에러 상태 / Error state\n * <Switch \n * label=\"필수 설정\"\n * description=\"이 설정을 활성화해야 합니다\"\n * error\n * />\n * \n * @param {SwitchProps} props - Switch 컴포넌트의 props / Switch component props\n * @param {React.Ref<HTMLInputElement>} ref - input 요소 ref / input element ref\n * @returns {JSX.Element} Switch 컴포넌트 / Switch component\n */\nconst Switch = React.forwardRef<HTMLInputElement, SwitchProps>(\n ({ \n className, \n variant = \"default\",\n size = \"md\",\n error = false,\n success = false,\n label,\n description,\n id,\n ...props \n }, ref) => {\n const switchId = id || React.useId()\n const labelId = label ? `${switchId}-label` : undefined\n const descriptionId = description ? `${switchId}-description` : undefined\n const sizeClasses = {\n sm: \"w-8 h-4\",\n md: \"w-11 h-6\",\n lg: \"w-14 h-7\"\n }\n\n const thumbSizes = {\n sm: \"w-3 h-3\",\n md: \"w-5 h-5\",\n lg: \"w-6 h-6\"\n }\n\n const variantClasses = {\n default: \"bg-gray-200 peer-checked:bg-blue-600 dark:bg-gray-700 dark:peer-checked:bg-blue-500\",\n outline: \"bg-transparent border-2 border-gray-300 peer-checked:border-blue-600 peer-checked:bg-blue-600 dark:border-gray-600 dark:peer-checked:border-blue-500 dark:peer-checked:bg-blue-500\",\n filled: \"bg-gray-100 peer-checked:bg-blue-600 dark:bg-gray-800 dark:peer-checked:bg-blue-500\",\n glass: \"bg-white/20 backdrop-blur-sm border border-white/30 peer-checked:bg-blue-400/50 peer-checked:border-blue-300/50 dark:bg-slate-800/20 dark:border-slate-700/50 dark:peer-checked:bg-blue-400/50 dark:peer-checked:border-blue-300/50\"\n }\n\n const stateClasses = error \n ? \"bg-red-200 peer-checked:bg-red-600 dark:bg-red-800 dark:peer-checked:bg-red-500\"\n : success\n ? \"bg-green-200 peer-checked:bg-green-600 dark:bg-green-800 dark:peer-checked:bg-green-500\"\n : \"\"\n\n return (\n <div className=\"flex items-start space-x-3\">\n <div className=\"relative\">\n <input\n type=\"checkbox\"\n id={switchId}\n className={merge(\n \"peer sr-only\",\n className\n )}\n ref={ref}\n aria-checked={props.checked ?? false}\n aria-invalid={error}\n aria-label={!label ? props['aria-label'] : undefined}\n aria-labelledby={label ? labelId : undefined}\n aria-describedby={descriptionId}\n role=\"switch\"\n {...props}\n />\n <div\n className={merge(\n \"relative inline-flex cursor-pointer items-center rounded-full transition-colors duration-200 ease-in-out\",\n \"peer-focus:outline-none peer-focus:ring-2 peer-focus:ring-blue-500 peer-focus:ring-offset-2\",\n \"peer-disabled:cursor-not-allowed peer-disabled:opacity-50\",\n sizeClasses[size],\n variantClasses[variant],\n stateClasses\n )}\n >\n <div\n className={merge(\n \"pointer-events-none block rounded-full bg-white shadow-lg ring-0 transition-transform duration-200 ease-in-out\",\n \"peer-checked:translate-x-full\",\n thumbSizes[size],\n size === \"sm\" ? \"translate-x-0.5 peer-checked:translate-x-4.5\" : \"\",\n size === \"md\" ? \"translate-x-0.5 peer-checked:translate-x-5.5\" : \"\",\n size === \"lg\" ? \"translate-x-0.5 peer-checked:translate-x-7\" : \"\"\n )}\n />\n </div>\n </div>\n {(label || description) && (\n <div className=\"flex flex-col\">\n {label && (\n <label htmlFor={switchId} id={labelId} className=\"text-sm font-medium text-gray-900 dark:text-white cursor-pointer\">\n {label}\n </label>\n )}\n {description && (\n <p id={descriptionId} className=\"text-sm text-gray-500 dark:text-gray-400\">\n {description}\n </p>\n )}\n </div>\n )}\n </div>\n )\n }\n)\nSwitch.displayName = \"Switch\"\n\nexport { Switch } ","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * Slider 컴포넌트의 props\n * @typedef {Object} SliderProps\n * @property {\"default\" | \"primary\" | \"success\" | \"warning\" | \"danger\"} [variant=\"default\"] - Slider 스타일 변형\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - Slider 크기\n * @property {boolean} [showValue=false] - 현재 값 표시 여부\n * @property {boolean} [showLabel=false] - 라벨 표시 여부\n * @property {string} [label] - 라벨 텍스트\n * @property {number} [min=0] - 최소값\n * @property {number} [max=100] - 최대값\n * @property {number} [step=1] - 단계값\n * @property {number | number[]} [value=0] - 현재 값 (배열이면 범위 슬라이더)\n * @property {(value: number | number[]) => void} [onValueChange] - 값 변경 콜백\n * @property {\"horizontal\" | \"vertical\"} [orientation=\"horizontal\"] - Slider 방향\n * @property {boolean} [disabled=false] - 비활성화 여부\n * @property {string} [className] - 추가 CSS 클래스\n * @extends {Omit<React.InputHTMLAttributes<HTMLInputElement>, 'type' | 'value' | 'onChange' | 'size'>}\n */\nexport interface SliderProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'type' | 'value' | 'onChange' | 'size'> {\n variant?: \"default\" | \"primary\" | \"success\" | \"warning\" | \"danger\"\n size?: \"sm\" | \"md\" | \"lg\"\n showValue?: boolean\n showLabel?: boolean\n label?: string\n min?: number\n max?: number\n step?: number\n value?: number | number[]\n onValueChange?: (value: number | number[]) => void\n orientation?: \"horizontal\" | \"vertical\"\n disabled?: boolean\n className?: string\n}\n\n/**\n * Slider 컴포넌트 / Slider component\n * \n * 숫자 값을 선택하는 슬라이더 컴포넌트입니다.\n * 단일 값 또는 범위 값을 선택할 수 있습니다.\n * \n * Slider component for selecting numeric values.\n * Supports single value or range value selection.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * const [value, setValue] = useState(50)\n * <Slider value={value} onValueChange={setValue} />\n * \n * @example\n * // 범위 슬라이더 / Range slider\n * const [range, setRange] = useState([20, 80])\n * <Slider \n * value={range} \n * onValueChange={setRange}\n * showValue\n * label=\"가격 범위\"\n * />\n * \n * @example\n * // 세로 슬라이더 / Vertical slider\n * <Slider \n * orientation=\"vertical\"\n * variant=\"primary\"\n * size=\"lg\"\n * className=\"h-64\"\n * />\n * \n * @param {SliderProps} props - Slider 컴포넌트의 props / Slider component props\n * @param {React.Ref<HTMLInputElement>} ref - input 요소 ref / input element ref\n * @returns {JSX.Element} Slider 컴포넌트 / Slider component\n */\nconst Slider = React.forwardRef<HTMLInputElement, SliderProps>(\n ({ \n className,\n variant = \"default\",\n size = \"md\",\n showValue = false,\n showLabel = false,\n label,\n min = 0,\n max = 100,\n step = 1,\n value = 0,\n onValueChange,\n orientation = \"horizontal\",\n disabled = false,\n ...props \n }, ref) => {\n const isRange = Array.isArray(value)\n const currentValue = isRange ? value : [value]\n \n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const newValue = parseFloat(e.target.value)\n if (onValueChange) {\n if (isRange) {\n // 범위 슬라이더의 경우, 어떤 슬라이더가 변경되었는지 확인\n const index = parseInt(e.target.dataset.index || \"0\")\n const newRange = [...currentValue]\n newRange[index] = newValue\n onValueChange(newRange)\n } else {\n onValueChange(newValue)\n }\n }\n }\n\n const variantClasses = {\n default: \"bg-gray-200 dark:bg-gray-700\",\n primary: \"bg-blue-200 dark:bg-blue-700\",\n success: \"bg-green-200 dark:bg-green-700\",\n warning: \"bg-yellow-200 dark:bg-yellow-700\",\n danger: \"bg-red-200 dark:bg-red-700\"\n }\n\n const thumbVariantClasses = {\n default: \"bg-gray-400 hover:bg-gray-500 dark:bg-gray-500 dark:hover:bg-gray-400\",\n primary: \"bg-blue-500 hover:bg-blue-600 dark:bg-blue-400 dark:hover:bg-blue-500\",\n success: \"bg-green-500 hover:bg-green-600 dark:bg-green-400 dark:hover:bg-green-500\",\n warning: \"bg-yellow-500 hover:bg-yellow-600 dark:bg-yellow-400 dark:hover:bg-yellow-500\",\n danger: \"bg-red-500 hover:bg-red-600 dark:bg-red-400 dark:hover:bg-red-500\"\n }\n\n const sizeClasses = {\n sm: orientation === \"horizontal\" ? \"h-1\" : \"w-1\",\n md: orientation === \"horizontal\" ? \"h-2\" : \"w-2\",\n lg: orientation === \"horizontal\" ? \"h-3\" : \"w-3\"\n }\n\n const thumbSizeClasses = {\n sm: \"w-3 h-3\",\n md: \"w-4 h-4\",\n lg: \"w-6 h-6\"\n }\n\n const orientationClasses = orientation === \"vertical\" \n ? \"flex-col h-full\" \n : \"flex-row w-full\"\n\n const renderSlider = (index: number = 0) => (\n <input\n key={index}\n ref={index === 0 ? ref : undefined}\n type=\"range\"\n min={min}\n max={max}\n step={step}\n value={currentValue[index]}\n onChange={handleChange}\n data-index={index}\n disabled={disabled}\n className={merge(\n \"appearance-none cursor-pointer rounded-full transition-all duration-200 focus:outline-none focus:ring-2 focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50\",\n sizeClasses[size],\n variantClasses[variant],\n orientation === \"vertical\" ? \"writing-mode: bt-lr; -webkit-appearance: slider-vertical\" : \"\",\n className\n )}\n style={{\n ...(orientation === \"vertical\" && {\n writingMode: \"vertical-rl\" as const,\n WebkitAppearance: \"slider-vertical\"\n })\n }}\n {...props}\n />\n )\n\n const renderValue = () => {\n if (!showValue) return null\n \n if (isRange) {\n return (\n <div className=\"flex gap-2 text-sm text-gray-600 dark:text-gray-400\">\n {currentValue.map((val, index) => (\n <span key={index} className=\"font-mono\">\n {val}\n </span>\n ))}\n </div>\n )\n }\n \n return (\n <span className=\"text-sm font-mono text-gray-600 dark:text-gray-400\">\n {currentValue[0]}\n </span>\n )\n }\n\n return (\n <div className={merge(\"flex items-center gap-4\", orientationClasses)}>\n {showLabel && label && (\n <label className=\"text-sm font-medium text-gray-700 dark:text-gray-300 min-w-0\">\n {label}\n </label>\n )}\n \n <div className=\"flex-1 relative\">\n <div className={merge(\"relative\", orientation === \"vertical\" ? \"h-full\" : \"w-full\")}>\n {/* 배경 트랙 */}\n <div className={merge(\n \"absolute rounded-full\",\n sizeClasses[size],\n variantClasses[variant],\n orientation === \"vertical\" ? \"w-full bottom-0\" : \"h-full left-0\"\n )} />\n \n {/* 활성 트랙 (값에 따른 채워진 부분) */}\n {isRange ? (\n // 범위 슬라이더\n <div className={merge(\n \"absolute rounded-full bg-blue-500 dark:bg-blue-400\",\n sizeClasses[size],\n orientation === \"vertical\" \n ? \"w-full bottom-0\" \n : \"h-full left-0\"\n )} style={{\n ...(orientation === \"vertical\" \n ? {\n bottom: `${(currentValue[0] - min) / (max - min) * 100}%`,\n height: `${(currentValue[1] - currentValue[0]) / (max - min) * 100}%`\n }\n : {\n left: `${(currentValue[0] - min) / (max - min) * 100}%`,\n width: `${(currentValue[1] - currentValue[0]) / (max - min) * 100}%`\n }\n )\n }} />\n ) : (\n // 단일 슬라이더\n <div className={merge(\n \"absolute rounded-full bg-blue-500 dark:bg-blue-400\",\n sizeClasses[size],\n orientation === \"vertical\" \n ? \"w-full bottom-0\" \n : \"h-full left-0\"\n )} style={{\n ...(orientation === \"vertical\"\n ? { height: `${(currentValue[0] - min) / (max - min) * 100}%` }\n : { width: `${(currentValue[0] - min) / (max - min) * 100}%` }\n )\n }} />\n )}\n \n {/* 슬라이더 핸들들 */}\n {isRange ? (\n // 범위 슬라이더 핸들\n currentValue.map((_, index) => (\n <div\n key={index}\n className={merge(\n \"absolute rounded-full border-2 border-white shadow-lg transition-all duration-200 hover:scale-110\",\n thumbSizeClasses[size],\n thumbVariantClasses[variant],\n orientation === \"vertical\" \n ? \"left-1/2 transform -translate-x-1/2\" \n : \"top-1/2 transform -translate-y-1/2\"\n )}\n style={{\n ...(orientation === \"vertical\"\n ? { bottom: `${(currentValue[index] - min) / (max - min) * 100}%` }\n : { left: `${(currentValue[index] - min) / (max - min) * 100}%` }\n )\n }}\n />\n ))\n ) : (\n // 단일 슬라이더 핸들\n <div\n className={merge(\n \"absolute rounded-full border-2 border-white shadow-lg transition-all duration-200 hover:scale-110\",\n thumbSizeClasses[size],\n thumbVariantClasses[variant],\n orientation === \"vertical\" \n ? \"left-1/2 transform -translate-x-1/2\" \n : \"top-1/2 transform -translate-y-1/2\"\n )}\n style={{\n ...(orientation === \"vertical\"\n ? { bottom: `${(currentValue[0] - min) / (max - min) * 100}%` }\n : { left: `${(currentValue[0] - min) / (max - min) * 100}%` }\n )\n }}\n />\n )}\n </div>\n \n {/* 실제 input 요소들 (숨김) */}\n <div className=\"absolute inset-0 opacity-0\">\n {isRange ? (\n currentValue.map((_, index) => renderSlider(index))\n ) : (\n renderSlider()\n )}\n </div>\n </div>\n \n {renderValue()}\n </div>\n )\n }\n)\nSlider.displayName = \"Slider\"\n\nexport { Slider }\n","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * Popover 컴포넌트의 props / Popover component props\n * @typedef {Object} PopoverProps\n * @property {React.ReactNode} children - Popover 내용 / Popover content\n * @property {React.ReactNode} trigger - Popover를 열기 위한 트리거 요소 / Trigger element to open popover\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\"} [position=\"bottom\"] - Popover 표시 위치 / Popover display position\n * @property {\"start\" | \"center\" | \"end\"} [align=\"center\"] - Popover 정렬 / Popover alignment\n * @property {number} [offset=8] - 트리거와 Popover 사이 간격 (px) / Spacing between trigger and popover (px)\n * @property {boolean} [disabled=false] - Popover 비활성화 여부 / Disable popover\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface PopoverProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode\n trigger: React.ReactNode\n open?: boolean\n onOpenChange?: (open: boolean) => void\n position?: \"top\" | \"bottom\" | \"left\" | \"right\"\n align?: \"start\" | \"center\" | \"end\"\n offset?: number\n disabled?: boolean\n}\n\n/**\n * Popover 컴포넌트 / Popover component\n * \n * 트리거 요소를 클릭하면 표시되는 팝오버 컴포넌트입니다.\n * 외부 클릭 시 자동으로 닫힙니다.\n * \n * Popover component that appears when the trigger element is clicked.\n * Automatically closes when clicking outside.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Popover trigger={<Button>열기</Button>}>\n * <div className=\"p-4\">Popover 내용</div>\n * </Popover>\n * \n * @example\n * // 제어 모드 / Controlled mode\n * const [open, setOpen] = useState(false)\n * <Popover \n * open={open}\n * onOpenChange={setOpen}\n * trigger={<Button>제어 모드</Button>}\n * position=\"top\"\n * >\n * <div className=\"p-4\">내용</div>\n * </Popover>\n * \n * @param {PopoverProps} props - Popover 컴포넌트의 props / Popover component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} Popover 컴포넌트 / Popover component\n */\nconst Popover = React.forwardRef<HTMLDivElement, PopoverProps>(\n ({ \n className, \n children,\n trigger,\n open: controlledOpen,\n onOpenChange,\n position = \"bottom\",\n align = \"center\",\n offset = 8,\n disabled = false,\n ...props \n }, ref) => {\n const [internalOpen, setInternalOpen] = React.useState(false)\n const triggerRef = React.useRef<HTMLDivElement>(null)\n const popoverRef = 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 React.useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n triggerRef.current && \n popoverRef.current && \n !triggerRef.current.contains(event.target as Node) &&\n !popoverRef.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 getPositionClasses = () => {\n const baseClasses = \"absolute z-50\"\n \n switch (position) {\n case \"top\":\n return merge(baseClasses, \"bottom-full left-0\", `mb-${Math.max(1, Math.floor(offset / 4))}`)\n case \"bottom\":\n return merge(baseClasses, \"top-full left-0\", `mt-${Math.max(1, Math.floor(offset / 4))}`)\n case \"left\":\n return merge(baseClasses, \"right-full top-0\", `mr-${Math.max(1, Math.floor(offset / 4))}`)\n case \"right\":\n return merge(baseClasses, \"left-full top-0\", `ml-${Math.max(1, Math.floor(offset / 4))}`)\n default:\n return merge(baseClasses, \"top-full left-0\", `mt-${Math.max(1, Math.floor(offset / 4))}`)\n }\n }\n\n const getAlignmentClasses = () => {\n switch (align) {\n case \"start\":\n if (position === \"top\" || position === \"bottom\") {\n return \"left-0\"\n } else {\n return \"top-0\"\n }\n case \"end\":\n if (position === \"top\" || position === \"bottom\") {\n return \"right-0\"\n } else {\n return \"bottom-0\"\n }\n case \"center\":\n default:\n if (position === \"top\" || position === \"bottom\") {\n return \"left-1/2 -translate-x-1/2\"\n } else {\n return \"top-1/2 -translate-y-1/2\"\n }\n }\n }\n\n const getArrowClasses = () => {\n const baseClasses = \"absolute w-0 h-0 border-4 border-transparent\"\n \n switch (position) {\n case \"top\":\n return `${baseClasses} top-full left-1/2 -translate-x-1/2 border-t-gray-200 dark:border-t-gray-700`\n case \"bottom\":\n return `${baseClasses} bottom-full left-1/2 -translate-x-1/2 border-b-gray-200 dark:border-b-gray-700`\n case \"left\":\n return `${baseClasses} left-full top-1/2 -translate-y-1/2 border-l-gray-200 dark:border-l-gray-700`\n case \"right\":\n return `${baseClasses} right-full top-1/2 -translate-y-1/2 border-r-gray-200 dark:border-r-gray-700`\n default:\n return `${baseClasses} bottom-full left-1/2 -translate-x-1/2 border-b-gray-200 dark:border-b-gray-700`\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={popoverRef}\n className={merge(\n \"bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-lg shadow-lg p-4 min-w-[200px]\",\n getPositionClasses(),\n getAlignmentClasses()\n )}\n >\n {/* 화살표 */}\n <div className={getArrowClasses()} />\n \n {/* 내용 */}\n <div className=\"relative z-10\">\n {children}\n </div>\n </div>\n )}\n </div>\n )\n }\n)\nPopover.displayName = \"Popover\"\n\n// 편의 컴포넌트들\nexport const PopoverTrigger = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, children, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"inline-block cursor-pointer\", className)}\n {...props}\n >\n {children}\n </div>\n )\n)\nPopoverTrigger.displayName = \"PopoverTrigger\"\n\nexport const PopoverContent = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, children, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-lg shadow-lg p-4\", className)}\n {...props}\n >\n {children}\n </div>\n )\n)\nPopoverContent.displayName = \"PopoverContent\"\n\nexport { Popover } ","\"use client\";\n\nimport React from \"react\";\nimport { merge } from \"../lib/utils\";\n\n/**\n * 버튼 스타일 변형 / Button style variant\n * @typedef {\"default\" | \"destructive\" | \"outline\" | \"secondary\" | \"ghost\" | \"link\" | \"gradient\" | \"neon\" | \"glass\"} Variant\n */\ntype Variant =\n | \"default\" | \"destructive\" | \"outline\" | \"secondary\"\n | \"ghost\" | \"link\" | \"gradient\" | \"neon\" | \"glass\";\n\n/**\n * 버튼 크기 / Button size\n * @typedef {\"sm\" | \"md\" | \"lg\" | \"xl\" | \"icon\"} Size\n */\ntype Size = \"sm\" | \"md\" | \"lg\" | \"xl\" | \"icon\";\n\n/**\n * 버튼 모서리 둥글기 / Button border radius\n * @typedef {\"sm\" | \"md\" | \"lg\" | \"full\"} Rounded\n */\ntype Rounded = \"sm\" | \"md\" | \"lg\" | \"full\";\n\n/**\n * 버튼 그림자 / Button shadow\n * @typedef {\"none\" | \"sm\" | \"md\" | \"lg\" | \"xl\"} Shadow\n */\ntype Shadow = \"none\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n\n/**\n * 버튼 호버 효과 / Button hover effect\n * @typedef {\"scale\" | \"glow\" | \"slide\" | \"none\"} Hover\n */\ntype Hover = \"scale\" | \"glow\" | \"slide\" | \"none\";\n\n/**\n * 그라디언트 색상 이름 / Gradient color name\n * @typedef {\"blue\" | \"purple\" | \"green\" | \"orange\" | \"pink\" | \"custom\"} GradientName\n */\ntype GradientName = \"blue\" | \"purple\" | \"green\" | \"orange\" | \"pink\" | \"custom\";\n\n/**\n * Button 컴포넌트의 공통 props / Common props for Button component\n * @typedef {Object} CommonProps\n * @property {Variant} [variant=\"default\"] - 버튼 스타일 변형 / Button style variant\n * @property {Size} [size=\"md\"] - 버튼 크기 / Button size\n * @property {boolean} [loading=false] - 로딩 상태 (스피너 표시) / Loading state (shows spinner)\n * @property {React.ReactNode} [icon] - 아이콘 요소 / Icon element\n * @property {\"left\" | \"right\"} [iconPosition=\"left\"] - 아이콘 위치 / Icon position\n * @property {GradientName} [gradient=\"blue\"] - 그라디언트 색상 (variant=\"gradient\"일 때) / Gradient color (when variant=\"gradient\")\n * @property {string} [customGradient] - 커스텀 그라디언트 클래스 (variant=\"gradient\"일 때) / Custom gradient class (when variant=\"gradient\")\n * @property {Rounded} [rounded=\"md\"] - 모서리 둥글기 / Border radius\n * @property {Shadow} [shadow=\"md\"] - 그림자 크기 / Shadow size\n * @property {Hover} [hover=\"scale\"] - 호버 효과 / Hover effect\n * @property {boolean} [fullWidth=false] - 전체 너비 사용 / Use full width\n * @property {boolean} [iconOnly=false] - 아이콘만 표시 (aria-label 필수) / Icon only (aria-label required)\n * @property {string} [aria-label] - 접근성을 위한 레이블 (iconOnly일 때 필수) / Accessibility label (required when iconOnly)\n * @property {string} [className] - 추가 CSS 클래스 / Additional CSS class\n * @property {boolean} [disabled=false] - 비활성화 상태 / Disabled state\n */\ntype CommonProps = {\n variant?: Variant;\n size?: Size;\n loading?: boolean;\n icon?: React.ReactNode;\n iconPosition?: \"left\" | \"right\";\n gradient?: GradientName;\n customGradient?: string;\n rounded?: Rounded;\n shadow?: Shadow;\n hover?: Hover;\n fullWidth?: boolean;\n iconOnly?: boolean;\n \"aria-label\"?: string;\n className?: string;\n disabled?: boolean; // <-- 요놈 추가\n};\n\ntype AnchorProps = CommonProps &\n Omit<React.AnchorHTMLAttributes<HTMLAnchorElement>, \"className\"> & {\n href: string;\n };\n\ntype NativeButtonProps = CommonProps &\n Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, \"className\" | \"type\"> & {\n href?: undefined;\n };\n\n/**\n * Button 컴포넌트의 props 타입 / Button component props type\n * href가 제공되면 앵커 태그로, 그렇지 않으면 버튼 태그로 렌더링됩니다.\n * Renders as anchor tag if href is provided, otherwise as button tag.\n * @typedef {AnchorProps | NativeButtonProps} ButtonProps\n */\nexport type ButtonProps = AnchorProps | NativeButtonProps;\n\ntype AnchorOrButton = HTMLAnchorElement | HTMLButtonElement;\n\nconst isBrowser = typeof window !== \"undefined\";\nfunction useReducedMotion() {\n const [reduce, setReduce] = React.useState(false);\n React.useEffect(() => {\n if (!isBrowser || !(\"matchMedia\" in window)) return;\n const mq = window.matchMedia(\"(prefers-reduced-motion: reduce)\");\n const onChange = () => setReduce(!!mq.matches);\n onChange();\n mq.addEventListener?.(\"change\", onChange);\n return () => mq.removeEventListener?.(\"change\", onChange);\n }, []);\n return reduce;\n}\n\n/**\n * Button 컴포넌트 / Button component\n * \n * 다양한 스타일과 크기를 지원하는 범용 버튼 컴포넌트입니다.\n * href prop을 제공하면 앵커 태그로, 그렇지 않으면 버튼 태그로 렌더링됩니다.\n * \n * Universal button component supporting various styles and sizes.\n * Renders as anchor tag if href prop is provided, otherwise as button tag.\n * \n * @component\n * @example\n * // 기본 버튼 / Basic button\n * <Button onClick={() => console.log('클릭')}>클릭하세요</Button>\n * \n * @example\n * // 다양한 변형 / Various variants\n * <Button variant=\"destructive\" size=\"lg\">삭제</Button>\n * <Button variant=\"outline\" size=\"sm\">취소</Button>\n * <Button variant=\"ghost\">보기</Button>\n * \n * @example\n * // 아이콘과 함께 사용 / With icon\n * <Button icon={<Icon name=\"download\" />} iconPosition=\"left\">\n * 다운로드\n * </Button>\n * \n * @example\n * // 로딩 상태 / Loading state\n * <Button loading disabled>저장 중...</Button>\n * \n * @example\n * // 링크 버튼 / Link button\n * <Button href=\"/about\" variant=\"link\">자세히 보기</Button>\n * \n * @example\n * // 아이콘만 표시 (aria-label 필수) / Icon only (aria-label required)\n * <Button iconOnly aria-label=\"닫기\" icon={<Icon name=\"close\" />} />\n * \n * @param {ButtonProps} props - Button 컴포넌트의 props / Button component props\n * @param {React.Ref<HTMLAnchorElement | HTMLButtonElement>} ref - ref 객체 / ref object\n * @returns {JSX.Element} Button 컴포넌트 / Button component\n */\nconst ButtonInner = React.forwardRef<AnchorOrButton, ButtonProps>(function ButtonInner(\n {\n variant = \"default\",\n size = \"md\",\n loading = false,\n icon,\n iconPosition = \"left\",\n gradient = \"blue\",\n customGradient,\n rounded = \"md\",\n shadow = \"md\",\n hover = \"scale\",\n fullWidth,\n iconOnly,\n className,\n children,\n disabled,\n ...rest\n },\n ref\n) {\n const reduced = useReducedMotion();\n\n const variantClasses: Record<Variant, string> = {\n default:\n \"bg-blue-600 text-white hover:bg-blue-700 dark:bg-blue-500 dark:hover:bg-blue-600\",\n destructive:\n \"bg-red-600 text-white hover:bg-red-700 dark:bg-red-500 dark:hover:bg-red-600\",\n outline:\n \"border-2 border-blue-600 bg-transparent text-blue-600 hover:bg-blue-50 dark:border-blue-400 dark:text-blue-400 dark:hover:bg-blue-900/20\",\n secondary:\n \"bg-gray-200 text-gray-900 hover:bg-gray-300 dark:bg-gray-700 dark:text-white dark:hover:bg-gray-600\",\n ghost:\n \"bg-transparent text-gray-700 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-800\",\n link:\n \"bg-transparent text-blue-600 underline hover:text-blue-700 dark:text-blue-400 dark:hover:text-blue-300\",\n gradient: `bg-gradient-to-r ${customGradient || getGradientClass(gradient)} text-white hover:shadow-lg`,\n neon:\n \"bg-gray-900 text-cyan-400 border border-cyan-400/30 shadow-lg shadow-cyan-400/20 hover:shadow-cyan-400/40\",\n glass:\n \"bg-white/10 backdrop-blur-md border border-white/20 text-white hover:bg-white/20\",\n };\n\n const sizeClasses: Record<Size, string> = {\n sm: \"h-8 px-3 py-1 text-sm\",\n md: \"h-10 px-4 py-2 text-base\",\n lg: \"h-12 px-6 py-3 text-lg\",\n xl: \"h-14 px-8 py-4 text-xl\",\n icon: \"h-10 w-10 p-0\",\n };\n\n const roundedClasses: Record<Rounded, string> = {\n sm: \"rounded\",\n md: \"rounded-md\",\n lg: \"rounded-lg\",\n full: \"rounded-full\",\n };\n\n const shadowClasses: Record<Shadow, string> = {\n none: \"\",\n sm: \"shadow-sm\",\n md: \"shadow-md\",\n lg: \"shadow-lg\",\n xl: \"shadow-xl\",\n };\n\n const hoverClasses: Record<Hover, string> = {\n scale: reduced ? \"\" : \"hover:scale-105 transition-transform duration-200\",\n glow: reduced ? \"\" : \"hover:shadow-2xl hover:shadow-blue-500/25 dark:hover:shadow-cyan-400/25 transition-shadow duration-300\",\n slide: reduced ? \"\" : \"hover:-translate-y-1 transition-transform duration-200\",\n none: \"\",\n };\n\n // variant별 포커스 스타일\n const focusClasses: Record<Variant, string> = {\n default: \"focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-blue-500 focus-visible:ring-offset-1\",\n destructive: \"focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-red-500 focus-visible:ring-offset-1\",\n outline: \"focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-blue-300 dark:focus-visible:ring-blue-600 focus-visible:ring-offset-0\",\n secondary: \"focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-gray-400 focus-visible:ring-offset-1\",\n ghost: \"focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-gray-300 dark:focus-visible:ring-gray-600 focus-visible:ring-offset-0\",\n link: \"focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-blue-400 focus-visible:ring-offset-0\",\n gradient: \"focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-blue-500 focus-visible:ring-offset-1\",\n neon: \"focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-cyan-400 focus-visible:ring-offset-1\",\n glass: \"focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-blue-400/50 focus-visible:ring-offset-0\",\n };\n\n const base = merge(\n \"inline-flex items-center justify-center whitespace-nowrap font-medium transition-all duration-200\",\n focusClasses[variant],\n \"disabled:pointer-events-none disabled:opacity-50 min-w-fit\",\n fullWidth && \"w-full\",\n variantClasses[variant],\n sizeClasses[size],\n roundedClasses[rounded],\n shadowClasses[shadow],\n hoverClasses[hover],\n className\n );\n\n const Spinner = (\n <span role=\"status\" aria-live=\"polite\" className=\"-ml-1 mr-2 inline-flex\">\n <svg className=\"animate-spin h-4 w-4\" viewBox=\"0 0 24 24\" fill=\"none\">\n <circle className=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"4\" />\n <path className=\"opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\" />\n </svg>\n <span className=\"sr-only\">로딩 중</span>\n </span>\n );\n\n const content = (\n <>\n {loading && Spinner}\n {!loading && icon && iconPosition === \"left\" && <span className=\"mr-2\">{icon}</span>}\n {children}\n {!loading && icon && iconPosition === \"right\" && <span className=\"ml-2\">{icon}</span>}\n </>\n );\n\n if (iconOnly && !(\"aria-label\" in rest) && process.env.NODE_ENV !== \"production\") {\n // eslint-disable-next-line no-console\n console.warn(\"[Button] iconOnly 사용 시 aria-label을 제공하세요.\");\n }\n\n // 앵커 모드\n if (\"href\" in rest && rest.href) {\n const { onClick, target, rel, href, \"aria-label\": ariaLabel, className: anchorClassName, ...anchorProps } = rest as AnchorProps;\n const isDisabled = !!disabled || loading;\n\n const handleAnchorClick: React.MouseEventHandler<HTMLAnchorElement> = (e) => {\n if (isDisabled) { e.preventDefault(); e.stopPropagation(); return; }\n onClick?.(e);\n };\n\n return (\n <a\n ref={ref as React.Ref<HTMLAnchorElement>}\n href={href}\n className={merge(base, anchorClassName)}\n onClick={handleAnchorClick}\n aria-busy={loading || undefined}\n aria-disabled={isDisabled || undefined}\n tabIndex={isDisabled ? -1 : anchorProps.tabIndex}\n target={target}\n rel={target === \"_blank\" ? rel ?? \"noopener noreferrer\" : rel}\n {...anchorProps}\n >\n {content}\n </a>\n );\n }\n\n // 버튼 모드\n const { className: buttonClassName, ...btnProps } = rest as NativeButtonProps;\n const isDisabled = !!disabled || loading;\n return (\n <button\n ref={ref as React.Ref<HTMLButtonElement>}\n className={merge(base, buttonClassName)}\n type=\"button\" // 폼 기본 제출 방지\n disabled={isDisabled}\n aria-busy={loading || undefined}\n aria-disabled={isDisabled || undefined}\n {...btnProps}\n >\n {content}\n </button>\n );\n});\n\nButtonInner.displayName = \"Button\";\n\nexport const Button = ButtonInner;\n\nfunction getGradientClass(gradient: GradientName): string {\n const g: Record<Exclude<GradientName, \"custom\">, string> = {\n blue: \"from-blue-500 to-cyan-500\",\n purple: \"from-purple-500 to-pink-500\",\n green: \"from-green-500 to-emerald-500 dark:from-green-400 dark:to-emerald-400\",\n orange: \"from-orange-500 to-red-500 dark:from-orange-300 dark:to-red-300\",\n pink: \"from-pink-500 to-rose-500\",\n };\n return g[gradient as keyof typeof g] || g.blue;\n}\n","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\nimport { Icon } from \"./Icon\"\nimport { Popover } from \"./Popover\"\nimport { Button } from \"./Button\"\n\n/**\n * DatePicker 컴포넌트의 props / DatePicker component props\n * @typedef {Object} DatePickerProps\n * @property {Date | null} [value] - 선택된 날짜 / Selected date\n * @property {(date: Date | null) => void} [onChange] - 날짜 변경 핸들러 / Date change handler\n * @property {Date} [minDate] - 최소 날짜 / Minimum date\n * @property {Date} [maxDate] - 최대 날짜 / Maximum date\n * @property {string} [placeholder=\"날짜를 선택하세요\"] - 플레이스홀더 / Placeholder\n * @property {boolean} [disabled=false] - 비활성화 상태 / Disabled state\n * @property {boolean} [error=false] - 에러 상태 / Error state\n * @property {string} [dateFormat=\"YYYY-MM-DD\"] - 날짜 포맷 / Date format\n * @property {string} [locale=\"ko-KR\"] - 로케일 / Locale\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - 크기 / Size\n * @property {string} [className] - 추가 클래스명 / Additional class name\n * @extends {Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'>}\n */\nexport interface DatePickerProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'> {\n value?: Date | null\n onChange?: (date: Date | null) => void\n minDate?: Date\n maxDate?: Date\n placeholder?: string\n disabled?: boolean\n error?: boolean\n dateFormat?: string\n locale?: string\n size?: \"sm\" | \"md\" | \"lg\"\n className?: string\n}\n\nconst sizeClasses = {\n sm: \"h-8 text-sm px-3\",\n md: \"h-10 text-sm px-4\",\n lg: \"h-12 text-base px-5\",\n}\n\nconst formatDate = (date: Date | null, format: string = \"YYYY-MM-DD\", locale: string = \"ko-KR\"): string => {\n if (!date) return \"\"\n \n const year = date.getFullYear()\n const month = String(date.getMonth() + 1).padStart(2, \"0\")\n const day = String(date.getDate()).padStart(2, \"0\")\n \n return format\n .replace(\"YYYY\", String(year))\n .replace(\"MM\", month)\n .replace(\"DD\", day)\n}\n\nconst getDaysInMonth = (year: number, month: number): number => {\n return new Date(year, month + 1, 0).getDate()\n}\n\nconst getFirstDayOfMonth = (year: number, month: number): number => {\n return new Date(year, month, 1).getDay()\n}\n\n/**\n * DatePicker 컴포넌트 / DatePicker component\n * \n * 날짜를 선택할 수 있는 컴포넌트입니다.\n * 캘린더 팝오버를 통해 직관적으로 날짜를 선택할 수 있습니다.\n * \n * Component for selecting dates.\n * Allows intuitive date selection through a calendar popover.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <DatePicker\n * value={selectedDate}\n * onChange={setSelectedDate}\n * />\n * \n * @example\n * // 날짜 범위 제한 / Date range restriction\n * <DatePicker\n * value={date}\n * onChange={setDate}\n * minDate={new Date(\"2024-01-01\")}\n * maxDate={new Date(\"2024-12-31\")}\n * placeholder=\"날짜 선택\"\n * />\n * \n * @param {DatePickerProps} props - DatePicker 컴포넌트의 props / DatePicker component props\n * @returns {JSX.Element} DatePicker 컴포넌트 / DatePicker component\n */\nexport const DatePicker = React.forwardRef<HTMLDivElement, DatePickerProps>(\n (\n {\n value,\n onChange,\n minDate,\n maxDate,\n placeholder = \"날짜를 선택하세요\",\n disabled = false,\n error = false,\n dateFormat = \"YYYY-MM-DD\",\n locale = \"ko-KR\",\n size = \"md\",\n className,\n ...props\n },\n ref\n ) => {\n const [isOpen, setIsOpen] = React.useState(false)\n const [currentMonth, setCurrentMonth] = React.useState(value ? new Date(value.getFullYear(), value.getMonth()) : new Date())\n const [hoveredDate, setHoveredDate] = React.useState<Date | null>(null)\n\n const displayDate = value ? formatDate(value, dateFormat, locale) : \"\"\n\n const handleDateSelect = (date: Date) => {\n if (minDate && date < minDate) return\n if (maxDate && date > maxDate) return\n onChange?.(date)\n setIsOpen(false)\n }\n\n const handlePrevMonth = () => {\n setCurrentMonth(new Date(currentMonth.getFullYear(), currentMonth.getMonth() - 1))\n }\n\n const handleNextMonth = () => {\n setCurrentMonth(new Date(currentMonth.getFullYear(), currentMonth.getMonth() + 1))\n }\n\n const handleToday = () => {\n const today = new Date()\n today.setHours(0, 0, 0, 0)\n handleDateSelect(today)\n }\n\n const year = currentMonth.getFullYear()\n const month = currentMonth.getMonth()\n const daysInMonth = getDaysInMonth(year, month)\n const firstDay = getFirstDayOfMonth(year, month)\n\n const weekDays = locale === \"ko-KR\" \n ? [\"일\", \"월\", \"화\", \"수\", \"목\", \"금\", \"토\"]\n : [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"]\n\n const isDateDisabled = (date: Date): boolean => {\n if (minDate && date < minDate) return true\n if (maxDate && date > maxDate) return true\n return false\n }\n\n const isDateSelected = (date: Date): boolean => {\n if (!value) return false\n return (\n date.getFullYear() === value.getFullYear() &&\n date.getMonth() === value.getMonth() &&\n date.getDate() === value.getDate()\n )\n }\n\n const isToday = (date: Date): boolean => {\n const today = new Date()\n return (\n date.getFullYear() === today.getFullYear() &&\n date.getMonth() === today.getMonth() &&\n date.getDate() === today.getDate()\n )\n }\n\n const calendarDays: (Date | null)[] = []\n \n // 이전 달의 마지막 날들\n for (let i = firstDay - 1; i >= 0; i--) {\n const date = new Date(year, month, -i)\n calendarDays.push(date)\n }\n \n // 현재 달의 날들\n for (let day = 1; day <= daysInMonth; day++) {\n calendarDays.push(new Date(year, month, day))\n }\n \n // 다음 달의 첫 날들 (캘린더를 6주로 채우기)\n const remainingDays = 42 - calendarDays.length\n for (let day = 1; day <= remainingDays; day++) {\n calendarDays.push(new Date(year, month + 1, day))\n }\n\n const triggerButton = (\n <button\n type=\"button\"\n disabled={disabled}\n className={merge(\n \"flex w-full items-center justify-between rounded-lg border bg-white px-4 py-2 text-left text-sm transition-colors\",\n \"hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2\",\n \"dark:bg-gray-800 dark:border-gray-700 dark:hover:bg-gray-700\",\n error && \"border-red-500 focus:ring-red-500\",\n disabled && \"cursor-not-allowed opacity-50\",\n sizeClasses[size]\n )}\n aria-label={displayDate || placeholder}\n >\n <span className={merge(\"flex-1\", !displayDate && \"text-gray-400 dark:text-gray-500\")}>\n {displayDate || placeholder}\n </span>\n <Icon \n name=\"calendar\" \n className={merge(\n \"ml-2 h-4 w-4 transition-transform\",\n isOpen && \"rotate-180\"\n )} \n />\n </button>\n )\n\n return (\n <div ref={ref} className={merge(\"relative\", className)} {...props}>\n <Popover \n open={isOpen} \n onOpenChange={setIsOpen}\n trigger={triggerButton}\n position=\"bottom\"\n align=\"start\"\n >\n <div className=\"w-auto p-0\">\n <div className=\"p-4\">\n {/* 헤더 */}\n <div className=\"flex items-center justify-between mb-4\">\n <button\n type=\"button\"\n onClick={handlePrevMonth}\n className=\"rounded-lg p-2 hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors\"\n aria-label=\"이전 달\"\n >\n <Icon name=\"chevronLeft\" className=\"h-4 w-4\" />\n </button>\n <div className=\"text-lg font-semibold text-gray-900 dark:text-white\">\n {year}년 {month + 1}월\n </div>\n <button\n type=\"button\"\n onClick={handleNextMonth}\n className=\"rounded-lg p-2 hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors\"\n aria-label=\"다음 달\"\n >\n <Icon name=\"chevronRight\" className=\"h-4 w-4\" />\n </button>\n </div>\n\n {/* 요일 헤더 */}\n <div className=\"grid grid-cols-7 gap-1 mb-2\">\n {weekDays.map((day, index) => (\n <div\n key={index}\n className={merge(\n \"text-center text-xs font-medium py-2\",\n index === 0 && \"text-red-500 dark:text-red-400\",\n index === 6 && \"text-blue-500 dark:text-blue-400\"\n )}\n >\n {day}\n </div>\n ))}\n </div>\n\n {/* 캘린더 그리드 */}\n <div className=\"grid grid-cols-7 gap-1\">\n {calendarDays.map((date, index) => {\n if (!date) return <div key={index} />\n \n const isCurrentMonth = date.getMonth() === month\n const isDisabled = isDateDisabled(date)\n const isSelected = isDateSelected(date)\n const isTodayDate = isToday(date)\n const isHovered = hoveredDate && \n date.getFullYear() === hoveredDate.getFullYear() &&\n date.getMonth() === hoveredDate.getMonth() &&\n date.getDate() === hoveredDate.getDate()\n\n return (\n <button\n key={index}\n type=\"button\"\n disabled={isDisabled}\n onClick={() => handleDateSelect(date)}\n onMouseEnter={() => setHoveredDate(date)}\n onMouseLeave={() => setHoveredDate(null)}\n className={merge(\n \"relative h-9 w-9 rounded-lg text-sm font-medium transition-all\",\n \"hover:bg-blue-50 dark:hover:bg-blue-900/20\",\n \"focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-1\",\n !isCurrentMonth && \"text-gray-400 dark:text-gray-500\",\n isDisabled && \"cursor-not-allowed opacity-30\",\n isSelected && \"bg-blue-600 text-white hover:bg-blue-700 shadow-md\",\n isTodayDate && !isSelected && \"ring-2 ring-blue-500\",\n isHovered && !isSelected && \"bg-blue-100 dark:bg-blue-900/30\"\n )}\n aria-label={`${year}년 ${month + 1}월 ${date.getDate()}일`}\n >\n {date.getDate()}\n </button>\n )\n })}\n </div>\n\n {/* 오늘 버튼 */}\n <div className=\"mt-4 pt-4 border-t border-gray-200 dark:border-gray-700\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={handleToday}\n className=\"w-full\"\n >\n 오늘\n </Button>\n </div>\n </div>\n </div>\n </Popover>\n </div>\n )\n }\n)\n\nDatePicker.displayName = \"DatePicker\"\n\n\n","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\nimport { Icon } from \"./Icon\"\nimport { Button } from \"./Button\"\nimport type { IconName } from \"../lib/icons\"\n\n/**\n * 업로드된 파일 정보 인터페이스 / Uploaded file information interface\n * @typedef {Object} UploadedFile\n * @property {string} id - 파일 고유 ID / File unique ID\n * @property {File} file - 파일 객체 / File object\n * @property {string} name - 파일 이름 / File name\n * @property {number} size - 파일 크기 (bytes) / File size in bytes\n * @property {string} type - 파일 타입 / File type\n * @property {number} [progress] - 업로드 진행률 (0-100) / Upload progress (0-100)\n * @property {\"pending\" | \"uploading\" | \"success\" | \"error\"} [status] - 업로드 상태 / Upload status\n * @property {string} [url] - 업로드된 파일 URL / Uploaded file URL\n * @property {string} [error] - 에러 메시지 / Error message\n */\nexport interface UploadedFile {\n id: string\n file: File\n name: string\n size: number\n type: string\n progress?: number\n status?: \"pending\" | \"uploading\" | \"success\" | \"error\"\n url?: string\n error?: string\n}\n\n/**\n * Upload 컴포넌트의 props / Upload component props\n * @typedef {Object} UploadProps\n * @property {UploadedFile[]} [files] - 업로드된 파일 목록 / Uploaded files list\n * @property {(files: File[]) => void} [onChange] - 파일 선택 핸들러 / File selection handler\n * @property {(file: UploadedFile) => void} [onRemove] - 파일 제거 핸들러 / File removal handler\n * @property {boolean} [multiple=false] - 다중 파일 선택 허용 / Allow multiple file selection\n * @property {string} [accept] - 허용할 파일 타입 (예: \"image/*\", \".pdf\") / Accepted file types\n * @property {number} [maxSize] - 최대 파일 크기 (bytes) / Maximum file size in bytes\n * @property {number} [maxFiles] - 최대 파일 개수 / Maximum number of files\n * @property {boolean} [disabled=false] - 비활성화 상태 / Disabled state\n * @property {boolean} [dragDrop=true] - 드래그 앤 드롭 활성화 / Enable drag and drop\n * @property {string} [placeholder=\"파일을 선택하거나 여기에 드래그하세요\"] - 플레이스홀더 / Placeholder\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - 크기 / Size\n * @property {string} [className] - 추가 클래스명 / Additional class name\n */\nexport interface UploadProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'> {\n files?: UploadedFile[]\n onChange?: (files: File[]) => void\n onRemove?: (file: UploadedFile) => void\n multiple?: boolean\n accept?: string\n maxSize?: number\n maxFiles?: number\n disabled?: boolean\n dragDrop?: boolean\n placeholder?: string\n size?: \"sm\" | \"md\" | \"lg\"\n className?: string\n}\n\nconst formatFileSize = (bytes: number): string => {\n if (bytes === 0) return \"0 Bytes\"\n const k = 1024\n const sizes = [\"Bytes\", \"KB\", \"MB\", \"GB\"]\n const i = Math.floor(Math.log(bytes) / Math.log(k))\n return Math.round(bytes / Math.pow(k, i) * 100) / 100 + \" \" + sizes[i]\n}\n\nconst getFileIcon = (type: string): IconName => {\n if (type.startsWith(\"image/\")) return \"image\"\n if (type.startsWith(\"video/\")) return \"video\"\n if (type.includes(\"pdf\")) return \"fileText\"\n if (type.includes(\"word\") || type.includes(\"document\")) return \"fileText\"\n if (type.includes(\"excel\") || type.includes(\"spreadsheet\")) return \"fileText\"\n return \"file\"\n}\n\n/**\n * Upload 컴포넌트 / Upload component\n * \n * 파일을 업로드할 수 있는 컴포넌트입니다.\n * 드래그 앤 드롭, 다중 파일 선택, 파일 크기 제한 등을 지원합니다.\n * \n * Component for uploading files.\n * Supports drag and drop, multiple file selection, file size limits, and more.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Upload\n * onChange={(files) => console.log(files)}\n * />\n * \n * @example\n * // 이미지만, 다중 선택 / Images only, multiple selection\n * <Upload\n * accept=\"image/*\"\n * multiple\n * maxSize={5 * 1024 * 1024} // 5MB\n * maxFiles={5}\n * files={uploadedFiles}\n * onRemove={(file) => handleRemove(file)}\n * />\n * \n * @param {UploadProps} props - Upload 컴포넌트의 props / Upload component props\n * @returns {JSX.Element} Upload 컴포넌트 / Upload component\n */\nexport const Upload = React.forwardRef<HTMLDivElement, UploadProps>(\n (\n {\n files = [],\n onChange,\n onRemove,\n multiple = false,\n accept,\n maxSize,\n maxFiles,\n disabled = false,\n dragDrop = true,\n placeholder = \"파일을 선택하거나 여기에 드래그하세요\",\n size = \"md\",\n className,\n ...props\n },\n ref\n ) => {\n const fileInputRef = React.useRef<HTMLInputElement>(null)\n const [isDragging, setIsDragging] = React.useState(false)\n\n const handleFileSelect = (selectedFiles: FileList | null) => {\n if (!selectedFiles || selectedFiles.length === 0) return\n\n const fileArray = Array.from(selectedFiles)\n \n // 파일 개수 체크\n if (maxFiles && files.length + fileArray.length > maxFiles) {\n alert(`최대 ${maxFiles}개의 파일만 업로드할 수 있습니다.`)\n return\n }\n\n // 파일 크기 체크\n const validFiles = fileArray.filter((file) => {\n if (maxSize && file.size > maxSize) {\n alert(`파일 크기는 ${formatFileSize(maxSize)}를 초과할 수 없습니다: ${file.name}`)\n return false\n }\n return true\n })\n\n if (validFiles.length > 0) {\n onChange?.(validFiles)\n }\n }\n\n const handleClick = () => {\n if (!disabled) {\n fileInputRef.current?.click()\n }\n }\n\n const handleDragOver = (e: React.DragEvent) => {\n e.preventDefault()\n if (!disabled && dragDrop) {\n setIsDragging(true)\n }\n }\n\n const handleDragLeave = (e: React.DragEvent) => {\n e.preventDefault()\n setIsDragging(false)\n }\n\n const handleDrop = (e: React.DragEvent) => {\n e.preventDefault()\n setIsDragging(false)\n if (!disabled && dragDrop) {\n handleFileSelect(e.dataTransfer.files)\n }\n }\n\n const handleRemove = (file: UploadedFile) => {\n onRemove?.(file)\n }\n\n const sizeClasses = {\n sm: \"p-4\",\n md: \"p-6\",\n lg: \"p-8\",\n }\n\n return (\n <div ref={ref} className={merge(\"w-full\", className)} {...props}>\n {/* 업로드 영역 */}\n <div\n onClick={handleClick}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n className={merge(\n \"relative border-2 border-dashed rounded-xl transition-all cursor-pointer\",\n \"bg-gray-50 dark:bg-gray-900/50\",\n \"border-gray-300 dark:border-gray-700\",\n isDragging && \"border-blue-500 bg-blue-50 dark:bg-blue-900/20\",\n disabled && \"cursor-not-allowed opacity-50\",\n sizeClasses[size]\n )}\n >\n <input\n ref={fileInputRef}\n type=\"file\"\n multiple={multiple}\n accept={accept}\n disabled={disabled}\n onChange={(e) => handleFileSelect(e.target.files)}\n className=\"hidden\"\n aria-label=\"파일 선택\"\n />\n \n <div className=\"flex flex-col items-center justify-center text-center\">\n <div className={merge(\n \"rounded-full bg-blue-100 dark:bg-blue-900/30 p-4 mb-4\",\n isDragging && \"bg-blue-200 dark:bg-blue-900/50\"\n )}>\n <Icon \n name=\"upload\" \n className={merge(\n \"h-8 w-8 text-blue-600 dark:text-blue-400\",\n isDragging && \"scale-110\"\n )} \n />\n </div>\n <p className=\"text-sm font-medium text-gray-700 dark:text-gray-300 mb-1\">\n {placeholder}\n </p>\n <p className=\"text-xs text-gray-500 dark:text-gray-400\">\n {accept && `지원 형식: ${accept}`}\n {maxSize && ` • 최대 크기: ${formatFileSize(maxSize)}`}\n {maxFiles && ` • 최대 ${maxFiles}개`}\n </p>\n </div>\n </div>\n\n {/* 파일 목록 */}\n {files.length > 0 && (\n <div className=\"mt-4 space-y-2\">\n {files.map((file) => (\n <div\n key={file.id}\n className={merge(\n \"flex items-center gap-3 p-3 rounded-lg border\",\n \"bg-white dark:bg-gray-800\",\n \"border-gray-200 dark:border-gray-700\",\n file.status === \"error\" && \"border-red-300 dark:border-red-700 bg-red-50 dark:bg-red-900/20\"\n )}\n >\n <div className=\"flex-shrink-0\">\n <div className=\"rounded-lg bg-gray-100 dark:bg-gray-700 p-2\">\n <Icon \n name={getFileIcon(file.type)} \n className=\"h-5 w-5 text-gray-600 dark:text-gray-400\" \n />\n </div>\n </div>\n \n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium text-gray-900 dark:text-white truncate\">\n {file.name}\n </p>\n <div className=\"flex items-center gap-2 mt-1\">\n <p className=\"text-xs text-gray-500 dark:text-gray-400\">\n {formatFileSize(file.size)}\n </p>\n {file.status === \"uploading\" && file.progress !== undefined && (\n <>\n <div className=\"flex-1 h-1.5 bg-gray-200 dark:bg-gray-700 rounded-full overflow-hidden\">\n <div\n className=\"h-full bg-blue-600 transition-all duration-300\"\n style={{ width: `${file.progress}%` }}\n />\n </div>\n <span className=\"text-xs text-gray-500 dark:text-gray-400\">\n {file.progress}%\n </span>\n </>\n )}\n {file.status === \"success\" && (\n <span className=\"text-xs text-green-600 dark:text-green-400 flex items-center gap-1\">\n <Icon name=\"check\" className=\"h-3 w-3\" />\n 완료\n </span>\n )}\n {file.status === \"error\" && (\n <span className=\"text-xs text-red-600 dark:text-red-400\">\n {file.error || \"업로드 실패\"}\n </span>\n )}\n </div>\n </div>\n\n {onRemove && (\n <button\n type=\"button\"\n onClick={() => handleRemove(file)}\n className=\"flex-shrink-0 rounded-lg p-1.5 hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors\"\n aria-label=\"파일 제거\"\n >\n <Icon name=\"close\" className=\"h-4 w-4 text-gray-500 dark:text-gray-400\" />\n </button>\n )}\n </div>\n ))}\n </div>\n )}\n </div>\n )\n }\n)\n\nUpload.displayName = \"Upload\"\n\n\n","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\nimport { Icon } from \"./Icon\"\nimport { Input } from \"./Input\"\n\n/**\n * Autocomplete 옵션 인터페이스 / Autocomplete option interface\n * @typedef {Object} AutocompleteOption\n * @property {string} value - 옵션 값 / Option value\n * @property {string} label - 옵션 라벨 / Option label\n * @property {string} [description] - 옵션 설명 / Option description\n * @property {React.ReactNode} [icon] - 옵션 아이콘 / Option icon\n * @property {Record<string, unknown>} [data] - 추가 데이터 / Additional data\n */\nexport interface AutocompleteOption {\n value: string\n label: string\n description?: string\n icon?: React.ReactNode\n data?: Record<string, unknown>\n}\n\n/**\n * Autocomplete 컴포넌트의 props / Autocomplete component props\n * @typedef {Object} AutocompleteProps\n * @property {AutocompleteOption[]} options - 옵션 목록 / Options list\n * @property {string} [value] - 선택된 값 / Selected value\n * @property {(value: string, option?: AutocompleteOption) => void} [onChange] - 값 변경 핸들러 / Value change handler\n * @property {string} [placeholder=\"검색하거나 선택하세요\"] - 플레이스홀더 / Placeholder\n * @property {boolean} [disabled=false] - 비활성화 상태 / Disabled state\n * @property {boolean} [error=false] - 에러 상태 / Error state\n * @property {boolean} [loading=false] - 로딩 상태 / Loading state\n * @property {number} [maxHeight=300] - 드롭다운 최대 높이 (px) / Dropdown max height in px\n * @property {boolean} [clearable=true] - 지우기 버튼 표시 / Show clear button\n * @property {boolean} [filterable=true] - 필터링 활성화 / Enable filtering\n * @property {(query: string) => AutocompleteOption[] | Promise<AutocompleteOption[]>} [onSearch] - 검색 핸들러 (비동기 지원) / Search handler (async support)\n * @property {React.ReactNode} [emptyText=\"결과가 없습니다\"] - 빈 결과 텍스트 / Empty result text\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - 크기 / Size\n * @property {string} [className] - 추가 클래스명 / Additional class name\n * @extends {Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'>}\n */\nexport interface AutocompleteProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'> {\n options: AutocompleteOption[]\n value?: string\n onChange?: (value: string, option?: AutocompleteOption) => void\n placeholder?: string\n disabled?: boolean\n error?: boolean\n loading?: boolean\n maxHeight?: number\n clearable?: boolean\n filterable?: boolean\n onSearch?: (query: string) => AutocompleteOption[] | Promise<AutocompleteOption[]>\n emptyText?: string\n size?: \"sm\" | \"md\" | \"lg\"\n className?: string\n}\n\nconst sizeClasses = {\n sm: \"h-8 text-sm\",\n md: \"h-10 text-sm\",\n lg: \"h-12 text-base\",\n}\n\n/**\n * Autocomplete 컴포넌트 / Autocomplete component\n * \n * 자동완성 입력 컴포넌트입니다.\n * 입력하면서 옵션을 필터링하고 선택할 수 있습니다.\n * \n * Autocomplete input component.\n * Filters and selects options as you type.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Autocomplete\n * options={[\n * { value: \"1\", label: \"옵션 1\" },\n * { value: \"2\", label: \"옵션 2\" }\n * ]}\n * onChange={(value) => console.log(value)}\n * />\n * \n * @example\n * // 비동기 검색 / Async search\n * <Autocomplete\n * options={options}\n * onSearch={async (query) => {\n * const results = await searchAPI(query)\n * return results\n * }}\n * loading={isLoading}\n * />\n * \n * @param {AutocompleteProps} props - Autocomplete 컴포넌트의 props / Autocomplete component props\n * @returns {JSX.Element} Autocomplete 컴포넌트 / Autocomplete component\n */\nexport const Autocomplete = React.forwardRef<HTMLDivElement, AutocompleteProps>(\n (\n {\n options,\n value,\n onChange,\n placeholder = \"검색하거나 선택하세요\",\n disabled = false,\n error = false,\n loading = false,\n maxHeight = 300,\n clearable = true,\n filterable = true,\n onSearch,\n emptyText = \"결과가 없습니다\",\n size = \"md\",\n className,\n ...props\n },\n ref\n ) => {\n const [isOpen, setIsOpen] = React.useState(false)\n const [inputValue, setInputValue] = React.useState(\"\")\n const [filteredOptions, setFilteredOptions] = React.useState<AutocompleteOption[]>(options)\n const [selectedIndex, setSelectedIndex] = React.useState(-1)\n const [isSearching, setIsSearching] = React.useState(false)\n \n const inputRef = React.useRef<HTMLInputElement>(null)\n const dropdownRef = React.useRef<HTMLDivElement>(null)\n\n const selectedOption = React.useMemo(() => {\n return options.find((opt) => opt.value === value)\n }, [options, value])\n\n // 초기 입력값 설정\n React.useEffect(() => {\n if (selectedOption) {\n setInputValue(selectedOption.label)\n } else if (!value) {\n setInputValue(\"\")\n }\n }, [selectedOption, value])\n\n // 옵션 필터링\n React.useEffect(() => {\n if (onSearch) {\n setIsSearching(true)\n const result = onSearch(inputValue)\n if (result instanceof Promise) {\n result.then((filtered) => {\n setFilteredOptions(filtered)\n setIsSearching(false)\n })\n } else {\n setFilteredOptions(result)\n setIsSearching(false)\n }\n } else if (filterable) {\n if (!inputValue.trim()) {\n setFilteredOptions(options)\n } else {\n const filtered = options.filter((option) =>\n option.label.toLowerCase().includes(inputValue.toLowerCase()) ||\n option.value.toLowerCase().includes(inputValue.toLowerCase()) ||\n option.description?.toLowerCase().includes(inputValue.toLowerCase())\n )\n setFilteredOptions(filtered)\n }\n } else {\n setFilteredOptions(options)\n }\n }, [inputValue, options, filterable, onSearch])\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const newValue = e.target.value\n setInputValue(newValue)\n setIsOpen(true)\n setSelectedIndex(-1)\n \n if (!newValue && clearable) {\n onChange?.(\"\")\n }\n }\n\n const handleInputFocus = () => {\n setIsOpen(true)\n }\n\n const handleInputBlur = (e: React.FocusEvent) => {\n // 드롭다운 클릭 시에는 닫지 않음\n if (dropdownRef.current?.contains(e.relatedTarget as Node)) {\n return\n }\n setIsOpen(false)\n setSelectedIndex(-1)\n \n // 선택된 옵션이 있으면 그 라벨로 복원\n if (selectedOption) {\n setInputValue(selectedOption.label)\n }\n }\n\n const handleOptionSelect = (option: AutocompleteOption) => {\n setInputValue(option.label)\n onChange?.(option.value, option)\n setIsOpen(false)\n inputRef.current?.blur()\n }\n\n const handleClear = () => {\n setInputValue(\"\")\n onChange?.(\"\")\n inputRef.current?.focus()\n }\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (!isOpen || filteredOptions.length === 0) {\n if (e.key === \"ArrowDown\") {\n setIsOpen(true)\n }\n return\n }\n\n switch (e.key) {\n case \"ArrowDown\":\n e.preventDefault()\n setSelectedIndex((prev) => \n prev < filteredOptions.length - 1 ? prev + 1 : prev\n )\n break\n case \"ArrowUp\":\n e.preventDefault()\n setSelectedIndex((prev) => (prev > 0 ? prev - 1 : -1))\n break\n case \"Enter\":\n e.preventDefault()\n if (selectedIndex >= 0 && filteredOptions[selectedIndex]) {\n handleOptionSelect(filteredOptions[selectedIndex])\n }\n break\n case \"Escape\":\n setIsOpen(false)\n inputRef.current?.blur()\n break\n }\n }\n\n return (\n <div ref={ref} className={merge(\"relative w-full\", className)} {...props}>\n <div className=\"relative\">\n <Input\n ref={inputRef}\n type=\"text\"\n value={inputValue}\n onChange={handleInputChange}\n onFocus={handleInputFocus}\n onBlur={handleInputBlur}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n disabled={disabled}\n aria-invalid={error}\n aria-autocomplete=\"list\"\n aria-expanded={isOpen}\n aria-controls=\"autocomplete-list\"\n className={merge(sizeClasses[size], \"pr-10\")}\n />\n \n <div className=\"absolute right-3 top-1/2 -translate-y-1/2 flex items-center gap-1\">\n {loading || isSearching ? (\n <Icon \n name=\"loader\"\n className=\"h-4 w-4 animate-spin text-gray-400\" \n />\n ) : clearable && inputValue ? (\n <button\n type=\"button\"\n onClick={handleClear}\n className=\"rounded p-1 hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors\"\n aria-label=\"지우기\"\n >\n <Icon name=\"close\" className=\"h-4 w-4 text-gray-400\" />\n </button>\n ) : (\n <Icon name=\"chevronDown\" className=\"h-4 w-4 text-gray-400\" />\n )}\n </div>\n </div>\n\n {/* 드롭다운 */}\n {isOpen && (\n <div\n ref={dropdownRef}\n id=\"autocomplete-list\"\n role=\"listbox\"\n className={merge(\n \"absolute z-50 w-full mt-1 rounded-lg border shadow-lg\",\n \"bg-white dark:bg-gray-800\",\n \"border-gray-200 dark:border-gray-700\",\n \"overflow-hidden\"\n )}\n style={{ maxHeight: `${maxHeight}px` }}\n >\n <div className=\"overflow-y-auto\" style={{ maxHeight: `${maxHeight}px` }}>\n {filteredOptions.length === 0 ? (\n <div className=\"px-4 py-8 text-center text-sm text-gray-500 dark:text-gray-400\">\n {emptyText}\n </div>\n ) : (\n filteredOptions.map((option, index) => {\n const isSelected = selectedIndex === index\n const isValueSelected = value === option.value\n\n return (\n <div\n key={option.value}\n role=\"option\"\n aria-selected={isValueSelected}\n onClick={() => handleOptionSelect(option)}\n onMouseEnter={() => setSelectedIndex(index)}\n className={merge(\n \"px-4 py-3 cursor-pointer transition-colors\",\n \"hover:bg-gray-100 dark:hover:bg-gray-700\",\n isSelected && \"bg-blue-50 dark:bg-blue-900/20\",\n isValueSelected && \"bg-blue-100 dark:bg-blue-900/30\"\n )}\n >\n <div className=\"flex items-center gap-3\">\n {option.icon && (\n <div className=\"flex-shrink-0 text-gray-400\">\n {option.icon}\n </div>\n )}\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2\">\n <p className=\"text-sm font-medium text-gray-900 dark:text-white\">\n {option.label}\n </p>\n {isValueSelected && (\n <Icon \n name=\"check\" \n className=\"h-4 w-4 text-blue-600 dark:text-blue-400 flex-shrink-0\" \n />\n )}\n </div>\n {option.description && (\n <p className=\"text-xs text-gray-500 dark:text-gray-400 mt-0.5\">\n {option.description}\n </p>\n )}\n </div>\n </div>\n </div>\n )\n })\n )}\n </div>\n </div>\n )}\n </div>\n )\n }\n)\n\nAutocomplete.displayName = \"Autocomplete\"\n\n\n"]}
|