@hua-labs/ui 2.0.1 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (127) hide show
  1. package/README.md +1 -1
  2. package/dist/{Switch-O4TpMKfQ.d.mts → Switch-Dzm5TLR3.d.mts} +1 -1
  3. package/dist/advanced/dashboard.d.ts.map +1 -1
  4. package/dist/advanced-dashboard.js +1 -1
  5. package/dist/advanced-dashboard.js.map +1 -1
  6. package/dist/advanced-dashboard.mjs +1 -1
  7. package/dist/advanced-emotion.js +1 -1
  8. package/dist/advanced-emotion.js.map +1 -1
  9. package/dist/advanced-emotion.mjs +1 -1
  10. package/dist/advanced-motion.js +5 -5
  11. package/dist/advanced-motion.js.map +1 -1
  12. package/dist/advanced-motion.mjs +1 -1
  13. package/dist/advanced.js +7 -7
  14. package/dist/advanced.js.map +1 -1
  15. package/dist/advanced.mjs +1 -1
  16. package/dist/chunk-BXX2TZUB.mjs +3 -0
  17. package/dist/chunk-BXX2TZUB.mjs.map +1 -0
  18. package/dist/{chunk-ECLIPN34.mjs → chunk-COR6CDMA.mjs} +3 -3
  19. package/dist/{chunk-ECLIPN34.mjs.map → chunk-COR6CDMA.mjs.map} +1 -1
  20. package/dist/chunk-HN5LSP6L.mjs +3 -0
  21. package/dist/chunk-HN5LSP6L.mjs.map +1 -0
  22. package/dist/{chunk-T3GU5BJ3.mjs → chunk-LOYAJIWO.mjs} +2 -2
  23. package/dist/{chunk-T3GU5BJ3.mjs.map → chunk-LOYAJIWO.mjs.map} +1 -1
  24. package/dist/{chunk-TOANBEPN.mjs → chunk-NBJUE7NR.mjs} +2 -2
  25. package/dist/{chunk-TOANBEPN.mjs.map → chunk-NBJUE7NR.mjs.map} +1 -1
  26. package/dist/{chunk-5BMH7223.mjs → chunk-PYBYZVSL.mjs} +2 -2
  27. package/dist/{chunk-5BMH7223.mjs.map → chunk-PYBYZVSL.mjs.map} +1 -1
  28. package/dist/{chunk-PQ3DBOMK.mjs → chunk-QQCELXFD.mjs} +2 -2
  29. package/dist/{chunk-PQ3DBOMK.mjs.map → chunk-QQCELXFD.mjs.map} +1 -1
  30. package/dist/{chunk-OI66ZLUB.mjs → chunk-UWHCM3S6.mjs} +2 -2
  31. package/dist/{chunk-OI66ZLUB.mjs.map → chunk-UWHCM3S6.mjs.map} +1 -1
  32. package/dist/{chunk-MYFMKCYX.mjs → chunk-XV3Y7QVU.mjs} +2 -2
  33. package/dist/{chunk-MYFMKCYX.mjs.map → chunk-XV3Y7QVU.mjs.map} +1 -1
  34. package/dist/components/Avatar.d.ts +1 -1
  35. package/dist/components/Avatar.d.ts.map +1 -1
  36. package/dist/components/Badge.d.ts +1 -1
  37. package/dist/components/Badge.d.ts.map +1 -1
  38. package/dist/components/Button.variants.d.ts +1 -1
  39. package/dist/components/Button.variants.d.ts.map +1 -1
  40. package/dist/components/Card.d.ts +1 -1
  41. package/dist/components/Card.d.ts.map +1 -1
  42. package/dist/components/CodeBlock.d.ts +1 -1
  43. package/dist/components/Container.d.ts +1 -1
  44. package/dist/components/Container.d.ts.map +1 -1
  45. package/dist/components/Grid.d.ts +1 -1
  46. package/dist/components/Grid.d.ts.map +1 -1
  47. package/dist/components/Icon/Icon.d.ts.map +1 -1
  48. package/dist/components/Input.d.ts +1 -1
  49. package/dist/components/Input.d.ts.map +1 -1
  50. package/dist/components/Label.d.ts +1 -1
  51. package/dist/components/Label.d.ts.map +1 -1
  52. package/dist/components/Link.d.ts +1 -1
  53. package/dist/components/Link.d.ts.map +1 -1
  54. package/dist/components/Panel.d.ts +1 -1
  55. package/dist/components/Panel.d.ts.map +1 -1
  56. package/dist/components/Progress.d.ts +2 -2
  57. package/dist/components/Progress.d.ts.map +1 -1
  58. package/dist/components/Select.d.ts +1 -1
  59. package/dist/components/Select.d.ts.map +1 -1
  60. package/dist/components/Skeleton.d.ts +1 -1
  61. package/dist/components/Skeleton.d.ts.map +1 -1
  62. package/dist/components/Stack.d.ts +1 -1
  63. package/dist/components/Stack.d.ts.map +1 -1
  64. package/dist/components/Textarea.d.ts +1 -1
  65. package/dist/components/Textarea.d.ts.map +1 -1
  66. package/dist/components/icons/essential.d.ts +68 -0
  67. package/dist/components/icons/essential.d.ts.map +1 -0
  68. package/dist/components/icons-bold/essential.d.ts +68 -0
  69. package/dist/components/icons-bold/essential.d.ts.map +1 -0
  70. package/dist/data.d.mts +1 -1
  71. package/dist/data.js.map +1 -1
  72. package/dist/data.mjs.map +1 -1
  73. package/dist/form.d.mts +1 -1
  74. package/dist/form.js +1 -1
  75. package/dist/form.js.map +1 -1
  76. package/dist/form.mjs +1 -1
  77. package/dist/iconsax-extended.d.ts +19 -0
  78. package/dist/iconsax-extended.d.ts.map +1 -0
  79. package/dist/iconsax-extended.js +3 -0
  80. package/dist/iconsax-extended.js.map +1 -0
  81. package/dist/iconsax-extended.mjs +4 -0
  82. package/dist/iconsax-extended.mjs.map +1 -0
  83. package/dist/iconsax.d.ts +10 -11
  84. package/dist/iconsax.d.ts.map +1 -1
  85. package/dist/iconsax.js +2 -2
  86. package/dist/iconsax.js.map +1 -1
  87. package/dist/iconsax.mjs +2 -2
  88. package/dist/iconsax.mjs.map +1 -1
  89. package/dist/index.d.mts +2 -2
  90. package/dist/index.js +4 -4
  91. package/dist/index.js.map +1 -1
  92. package/dist/index.mjs +1 -1
  93. package/dist/interactive.js +1 -1
  94. package/dist/interactive.js.map +1 -1
  95. package/dist/interactive.mjs +1 -1
  96. package/dist/lib/iconsax-loader.d.ts +15 -45
  97. package/dist/lib/iconsax-loader.d.ts.map +1 -1
  98. package/dist/navigation.js +2 -2
  99. package/dist/navigation.js.map +1 -1
  100. package/dist/navigation.mjs +1 -1
  101. package/dist/overlay.js +1 -1
  102. package/dist/overlay.js.map +1 -1
  103. package/dist/overlay.mjs +1 -1
  104. package/dist/sdui.js +3 -3
  105. package/dist/sdui.js.map +1 -1
  106. package/dist/sdui.mjs +1 -1
  107. package/package.json +23 -7
  108. package/src/components/icons/essential.ts +195 -0
  109. package/src/components/icons-bold/essential.ts +195 -0
  110. package/LICENSE +0 -21
  111. package/dist/chunk-AANHUMJ2.mjs +0 -3
  112. package/dist/chunk-AANHUMJ2.mjs.map +0 -1
  113. package/dist/chunk-FSL373O6.mjs +0 -3
  114. package/dist/chunk-FSL373O6.mjs.map +0 -1
  115. package/dist/components/icons/Frame2.d.ts +0 -4
  116. package/dist/components/icons/Frame2.d.ts.map +0 -1
  117. package/dist/components/icons/Group.d.ts +0 -4
  118. package/dist/components/icons/Group.d.ts.map +0 -1
  119. package/dist/components/icons/Group1.d.ts +0 -4
  120. package/dist/components/icons/Group1.d.ts.map +0 -1
  121. package/dist/components/icons/GroupCopy.d.ts +0 -4
  122. package/dist/components/icons/GroupCopy.d.ts.map +0 -1
  123. package/dist/iconsax.d.mts +0 -160
  124. package/src/components/icons/Frame2.tsx +0 -28
  125. package/src/components/icons/Group.tsx +0 -35
  126. package/src/components/icons/Group1.tsx +0 -21
  127. package/src/components/icons/GroupCopy.tsx +0 -21
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/lib/utils.ts","../src/components/Button.variants.ts","../src/lib/Slot.tsx","../src/components/Button.tsx","../src/components/Action.tsx","../src/lib/styles/cva-base.ts","../src/components/Input.tsx","../src/components/NumberInput.tsx","../src/components/Link.tsx","../src/lib/icons.ts","../src/lib/case-utils.ts","../src/lib/icon-providers.ts","../src/lib/icon-aliases.ts","../src/lib/normalize-icon-name.ts","../src/components/Icon/icon-store.ts","../src/components/Icon/IconProvider.tsx","../src/components/Icon/Icon.tsx","../src/components/Avatar.tsx","../src/components/Modal.tsx","../src/components/Container.tsx","../src/components/Grid.tsx","../src/components/Stack.tsx","../src/components/Divider.tsx","../src/components/Card.tsx","../src/components/Panel.tsx","../src/components/ActionToolbar.tsx","../src/components/Breadcrumb.tsx","../src/components/ComponentLayout.tsx","../src/components/Badge.tsx","../src/components/Progress.tsx","../src/components/Skeleton.tsx","../src/components/Alert.tsx","../src/components/Toast.tsx","../src/components/LoadingSpinner.tsx","../src/components/Tooltip.tsx","../src/components/Label.tsx","../src/components/Switch.tsx","../src/components/Toggle.tsx","../src/components/ScrollArea.tsx","../src/hooks/useScrollToggle.ts","../src/components/ScrollToTop.tsx","../src/components/ThemeProvider.tsx","../src/components/ThemeToggle.tsx","../src/lib/icon-names.ts","../src/lib/styles/colors.ts","../src/lib/styles/variants.ts","../src/lib/styles/utils.ts","../src/lib/motion/presets.ts","../src/lib/motion/useMicroMotion.ts","../src/hooks/useInView.ts","../src/hooks/useScrollProgress.ts","../src/hooks/useMouse.ts","../src/hooks/useReducedMotion.ts","../src/hooks/useWindowSize.ts"],"names":["merge","inputs","twMerge","clsx","mergeIf","condition","trueClass","falseClass","formatRelativeTime","timestamp","locale","date","diff","minutes","hours","days","mergeMap","classMap","classes","className","cn","springTransition","buttonVariants","cva","gradientPresets","composeRefs","refs","node","ref","composeEventHandlers","parentHandler","childHandler","event","mergeClassName","slotClassName","childClassName","mergeStyle","slotStyle","childStyle","mergeProps","slotProps","childProps","mergedProps","propName","slotValue","childValue","isSlottable","child","React","Slot","children","forwardedRef","childArray","childRef","mergedRef","isBrowser","useReducedMotion","reduce","setReduce","_a","mq","onChange","ButtonInner","variant","size","loading","icon","iconPosition","gradient","customGradient","rounded","shadow","hover","fullWidth","iconOnly","disabled","asChild","rest","reduced","gradientClass","base","content","jsxs","Fragment","jsx","onClick","target","rel","href","_ariaLabel","anchorClassName","anchorProps","isDisabled","handleAnchorClick","e","buttonClassName","btnProps","Button","Action","actionType","feedback","particleEffect","rippleEffect","soundEffect","hapticFeedback","transparency","blurIntensity","glowIntensity","glowColor","runEffects","AudioContextClass","audioContext","oscillator","gainNode","button","rect","x","y","ripple","style","i","particle","angle","velocity","vx","vy","styleVars","cls","anchorRest","btnRest","FORM_STATE","inputVariants","Input","type","error","success","props","ariaInvalid","isInvalid","NumberInput","controlledValue","defaultValue","min","max","step","showButtons","buttonLayout","internalValue","setInternalValue","isControlled","currentValue","updateValue","newValue","clampedValue","increment","decrement","handleInputChange","inputValue","handleBlur","handleKeyDown","sizes","buttonBase","canDecrement","canIncrement","ChevronUp","ChevronDown","Minus","Plus","linkVariants","Link","external","icons","House","ArrowLeft","ArrowRight","ArrowUp","ArrowDown","ListIcon","X","MagnifyingGlass","Gear","ArrowSquareOut","CaretLeft","CaretRight","CaretDown","CaretUp","Pencil","Trash","Download","Upload","ArrowClockwise","FloppyDisk","Copy","SpinnerGap","CheckCircle","XCircle","WarningCircle","Info","Check","Circle","Question","User","Users","UserPlus","SignIn","SignOut","Eye","EyeSlash","ChartBar","TrendUp","Pulse","Database","Lightning","FileText","File","Folder","Book","BookOpen","Envelope","ChatCircle","Phone","Image","Video","Camera","Smiley","SmileySad","SmileyMeh","Lock","LockOpen","Shield","Wallet","Key","Clock","Calendar","CalendarPlus","Bell","Heart","Star","Bookmark","Share","Monitor","Sun","Moon","Lightbulb","Brain","Flag","Square","Sparkle","Globe","DeviceMobile","Ticket","Clipboard","WifiHigh","WifiSlash","Cpu","MaskHappy","TextB","TextItalic","TextStrikethrough","TextHOne","Code","FileCode","Quotes","List","ListNumbers","emotionIcons","statusIcons","iconCategories","toCamelCase","str","word","index","PhosphorIcons","LucideIcons","iconsaxResolver","getIconsaxResolver","PROJECT_ICONS","initPhosphorIcons","initLucideIcons","getIconFromProvider","iconName","provider","iconMapping","getIconDirect","mappedName","phosphorName1","phosphorName2","lucideName","camelCaseName","match","getIconNameForProvider","ICON_ALIASES","resolveIconAlias","getIconAliases","_","alias","normalizeIconName","camelCased","aliasTarget","defaultIconConfig","getDefaultStrokeWidth","set","IconContext","createContext","IconProvider","weight","iconsaxVariant","color","strokeWidth","value","useIconContext","useContext","IconComponent","name","emotion","status","animated","pulse","spin","bounce","ariaLabel","ariaHidden","_b","config","iconSet","iconSize","iconWeight","iconColor","iconStrokeWidth","isClient","setIsClient","providerReady","setProviderReady","resolvedIcon","baseName","normalized","providerName","iconsaxIcon","variantClasses","ResolvedIcon","iconProps","animationClasses","accessibilityProps","MemoizedIcon","prevProps","nextProps","Icon","EmotionIcon","StatusIcon","LoadingIcon","SuccessIcon","ErrorIcon","avatarVariants","Avatar","src","alt","fallbackText","imgError","setImgError","useState","getFallbackContent","showImage","AvatarImage","AvatarFallback","useCombinedRefs","Modal","isOpen","onClose","closable","closeOnOverlayClick","title","description","showBackdrop","backdropClassName","centered","_closable","modalRef","combinedRef","handleEscape","scrollbarWidth","handleOverlayClick","sizeClasses","generatedTitleId","generatedDescId","titleId","descriptionId","mounted","setMounted","modalContent","createPortal","containerVariants","Container","padding","fluid","gridVariants","RESPONSIVE_COLS","GAP_X","GAP_Y","Grid","cols","gap","gapX","gapY","responsive","stackVariants","SPACING","Stack","direction","spacing","align","justify","wrap","ORIENTATION","getSizeClass","orientation","getVariantClass","getColorClass","DividerComponent","Divider","cardVariants","Card","hoverable","CardHeader","CardTitle","CardDescription","CardContent","CardFooter","panelStyleVariants","Panel","effect","borderOpacity","shadowOpacity","_hoverEffect","animationEffect","customPadding","customRounded","background","gradientColors","patternType","backgroundImage","backgroundVideo","interactive","hoverScale","hoverRotate","hoverGlow","cardProps","patternBackground","backgroundStyles","styles","hoverClasses","panelClasses","ActionToolbarComponent","isSelectMode","totalCount","selectedCount","actions","selectModeActions","onToggleSelectMode","onToggleSelectAll","onCancelSelect","getBadgeColor","useCallback","renderButton","action","key","ActionToolbar","Breadcrumb","items","maxItems","showHomeIcon","homeLabel","separator","variantStyles","renderedItems","displayItems","firstItem","lastItems","item","isCurrent","BreadcrumbItem","itemsCount","ComponentLayout","prevPage","nextPage","breadcrumbItems","badgeVariants","Badge","progressBarVariants","progressTrackVariants","Progress","showValue","striped","label","percentage","ProgressSuccess","ProgressWarning","ProgressError","ProgressInfo","ProgressWrapper","ProgressGroup","skeletonVariants","Skeleton","width","height","animation","getAnimationStyle","SkeletonText","SkeletonCircle","SkeletonRectangle","SkeletonRounded","SkeletonCard","SkeletonAvatar","SkeletonImage","SkeletonUserProfile","SkeletonList","SkeletonTable","Alert","getVariantClasses","getIconClasses","getDefaultIcon","AlertSuccess","AlertWarning","AlertError","AlertInfo","ToastContext","useToast","context","noopAddToast","noopRemoveToast","noopClearToasts","useToastSafe","ToastProvider","maxToasts","position","toasts","setToasts","removeToast","id","prev","toast","addToast","newToast","clearToasts","ToastContainer","positionClasses","ToastItem","onRemove","isVisible","setIsVisible","handleRemove","getToastStyles","getIconStyles","getToastIcon","LoadingSpinner","text","spinnerColors","renderSpinner","Tooltip","delay","coords","setCoords","timeoutRef","tooltipRef","showTooltip","_tooltipRect","hideTooltip","getArrowClasses","TooltipLight","TooltipDark","labelVariants","Label","required","Switch","generatedId","switchId","labelId","thumbSizes","thumbTranslate","stateClasses","Toggle","controlledPressed","onPressedChange","internalPressed","setInternalPressed","pressed","handleClick","ScrollArea","scrollHideDelay","showScrollbar","setShowScrollbar","handleMouseEnter","handleMouseLeave","ScrollBar","useScrollToggle","options","threshold","showOnMount","smooth","useEffect","toggleVisibility","ScrollToTop","scrollToTop","initialState","ThemeProviderContext","ThemeProvider","defaultTheme","storageKey","enableSystem","enableTransition","theme","setTheme","resolvedTheme","setResolvedTheme","savedTheme","root","systemTheme","mediaQuery","handleChange","newTheme","useTheme","ThemeToggle","showLabel","iconSizes","renderIcon","iconNames","iconProviderMapping","isValidIconName","mapping","colorShades","colorClass","shade","prefix","withDarkMode","lightClass","darkClass","defaultColorConfig","gradientConfig","createColorStyles","_c","_d","_e","_f","_g","_h","_i","_j","_k","_l","_m","_n","_o","finalConfig","defaultBorder","defaultBg","defaultStyle","gradientFrom","gradientTo","gradientBorder","gradientStyle","outlineBorder","outlineBg","outlineText","outlineStyle","elevatedBorder","elevatedBg","elevatedShadow","elevatedStyle","iconBg","iconText","iconStyle","badgeBg","badgeText","badgeStyle","colorStylesCache","useColorStyles","cacheKey","createVariantStyles","colorStyles","baseClasses","createSizeStyles","createRoundedStyles","createShadowStyles","HUA_SPRING_EASING","createHoverStyles","reducedMotion","createGradient","from","to","withOpacity","opacity","isTextWhite","isGradientVariant","sm","md","lg","xl","conditionalClass","EASING_FUNCTIONS","DURATIONS","HUA_DEFAULT_MOTION","COMPONENT_MOTION_DEFAULTS","CSS_MOTION_VARS","useMicroMotion","preset","duration","scale","translateY","translateX","rotate","enableHover","enablePress","enableFocus","state","setState","animationTimeoutRef","useRef","setAnimating","isAnimating","handlers","useMemo","transforms","easing","getMicroMotionClasses","enableActive","durationClass","useInView","rootMargin","triggerOnce","inView","setInView","entry","setEntry","frozenRef","element","observer","isInView","useScrollProgress","throttle","progress","setProgress","scrollY","setScrollY","scrollX","setScrollX","isScrolling","setIsScrolling","setDirection","lastScrollY","scrollTimeout","lastUpdate","calculateProgress","now","scrollTop","docHeight","newProgress","scrollHeight","useMouse","touch","moveTimeout","handleMove","clientX","clientY","elementX","elementY","elementPositionX","elementPositionY","isInside","handleMouseMove","handleTouchMove","prefersReducedMotion","setPrefersReducedMotion","useWindowSize","mobileBreakpoint","tabletBreakpoint","setSize","updateSize","timeoutId","handleResize"],"mappings":"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","file":"index.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 ","import { cva } from 'class-variance-authority'\n\n/**\n * HUA Spring Easing transition — 시그니처 \"쫀득한\" 느낌\n * cubic-bezier(0.34, 1.56, 0.64, 1)\n */\nconst springTransition =\n '[transition:transform_180ms_cubic-bezier(0.34,1.56,0.64,1),box-shadow_200ms_ease-out]'\n\nexport const buttonVariants = cva(\n // ── base ──\n 'inline-flex items-center justify-center whitespace-nowrap font-medium transition-all duration-200 disabled:pointer-events-none disabled:opacity-50 min-w-fit focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-[var(--color-ring)] focus-visible:ring-offset-2 focus-visible:ring-offset-[var(--color-background)]',\n {\n variants: {\n /** 스타일 변형 */\n variant: {\n default:\n 'bg-[var(--color-primary)] text-[var(--color-primary-foreground)] hover:opacity-90',\n destructive:\n 'bg-[var(--color-destructive)] text-[var(--color-destructive-foreground)] hover:opacity-90 focus-visible:ring-[var(--color-destructive)]',\n outline:\n 'border-2 border-[var(--color-border)] bg-transparent text-[var(--color-foreground)] hover:bg-[var(--color-accent)] hover:text-[var(--color-accent-foreground)] focus-visible:ring-offset-0',\n secondary:\n 'bg-[var(--color-secondary)] text-[var(--color-secondary-foreground)] hover:opacity-80',\n ghost:\n 'bg-transparent text-[var(--color-foreground)] hover:bg-[var(--color-accent)] hover:text-[var(--color-accent-foreground)] focus-visible:ring-offset-0',\n link:\n 'bg-transparent text-[var(--color-primary)] underline hover:opacity-80 focus-visible:ring-offset-0',\n gradient:\n 'bg-gradient-to-r from-[var(--btn-gradient-from,theme(colors.teal.500))] to-[var(--btn-gradient-to,theme(colors.cyan.500))] text-white hover:shadow-lg',\n neon:\n 'bg-slate-900 dark:bg-slate-950 text-teal-400 border border-teal-500/50 shadow-lg shadow-[var(--btn-neon-glow,theme(colors.teal.500/20%))] hover:shadow-[var(--btn-neon-glow,theme(colors.teal.500/40%))] hover:border-teal-400',\n glass:\n 'bg-white/50 dark:bg-slate-900/50 backdrop-blur-md border border-slate-200/50 dark:border-slate-700/50 text-slate-900 dark:text-slate-100 hover:bg-white/70 dark:hover:bg-slate-900/70',\n },\n /** 크기 */\n size: {\n sm: 'h-8 px-4 py-2 text-sm',\n md: 'h-10 px-6 py-2 text-base',\n lg: 'h-12 px-8 py-3 text-lg',\n xl: 'h-14 px-10 py-4 text-xl',\n icon: 'h-10 w-10 p-0',\n },\n /** 모서리 둥글기 */\n rounded: {\n sm: 'rounded',\n md: 'rounded-md',\n lg: 'rounded-lg',\n full: 'rounded-full',\n },\n /** 그림자 */\n shadow: {\n none: '',\n sm: 'shadow-sm',\n md: 'shadow-md',\n lg: 'shadow-lg',\n xl: 'shadow-xl',\n },\n /** 호버 효과 — springy가 HUA-UI 시그니처 */\n hover: {\n springy: `hover:scale-[1.015] hover:shadow-md active:scale-[0.985] ${springTransition} transform-gpu`,\n scale:\n 'hover:scale-[1.015] active:scale-[0.985] transition-transform duration-150 ease-out transform-gpu',\n glow: 'hover:shadow-lg hover:shadow-primary/25 transition-shadow duration-200',\n slide: `hover:-translate-y-0.5 hover:shadow-md ${springTransition} transform-gpu`,\n none: '',\n },\n /** 전체 너비 */\n fullWidth: {\n true: 'w-full',\n false: '',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'md',\n rounded: 'md',\n shadow: 'md',\n hover: 'springy',\n fullWidth: false,\n },\n }\n)\n\n/** Gradient 프리셋 */\nexport const gradientPresets: Record<string, string> = {\n blue: 'from-teal-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\nexport type { VariantProps } from 'class-variance-authority'\n","\"use client\";\n\nimport React from \"react\";\nimport { clsx } from \"clsx\";\n\n/**\n * Slot 컴포넌트\n *\n * Radix UI의 asChild 패턴을 구현합니다.\n * 자식 요소의 props와 ref를 병합하여 하나의 요소로 렌더링합니다.\n *\n * @example\n * // Button에서 asChild 사용\n * <Button asChild>\n * <Link href=\"/home\">홈으로</Link>\n * </Button>\n *\n * @see https://www.radix-ui.com/primitives/docs/utilities/slot\n */\n\ntype SlotProps = React.HTMLAttributes<HTMLElement> & {\n children?: React.ReactNode;\n};\n\n/**\n * 여러 ref를 하나로 합칩니다\n */\nfunction composeRefs<T>(\n ...refs: (React.Ref<T> | undefined)[]\n): React.RefCallback<T> {\n return (node) => {\n refs.forEach((ref) => {\n if (typeof ref === \"function\") {\n ref(node);\n } else if (ref != null) {\n (ref as React.MutableRefObject<T | null>).current = node;\n }\n });\n };\n}\n\n/**\n * 이벤트 핸들러를 합성합니다\n * \n * 부모(slot) 핸들러를 먼저 실행하고, 그 다음 자식 핸들러를 실행합니다.\n * defaultPrevented가 true이면 자식 핸들러는 실행하지 않습니다.\n */\nfunction composeEventHandlers<E>(\n parentHandler?: (event: E) => void,\n childHandler?: (event: E) => void\n): (event: E) => void {\n return (event) => {\n parentHandler?.(event);\n if (!(event as unknown as { defaultPrevented: boolean }).defaultPrevented) {\n childHandler?.(event);\n }\n };\n}\n\n/**\n * className을 병합합니다\n */\nfunction mergeClassName(\n slotClassName?: string,\n childClassName?: string\n): string | undefined {\n if (!slotClassName && !childClassName) return undefined;\n return clsx(slotClassName, childClassName);\n}\n\n/**\n * style을 병합합니다\n */\nfunction mergeStyle(\n slotStyle?: React.CSSProperties,\n childStyle?: React.CSSProperties\n): React.CSSProperties | undefined {\n if (!slotStyle && !childStyle) return undefined;\n return { ...slotStyle, ...childStyle };\n}\n\n/**\n * props를 병합합니다 (이벤트 핸들러, className, style 등)\n */\nfunction mergeProps(\n slotProps: Record<string, unknown>,\n childProps: Record<string, unknown>\n): Record<string, unknown> {\n const mergedProps: Record<string, unknown> = { ...slotProps };\n\n for (const propName in childProps) {\n const slotValue = slotProps[propName];\n const childValue = childProps[propName];\n\n // 이벤트 핸들러 병합 (부모(slot) → 자식 순서)\n if (/^on[A-Z]/.test(propName)) {\n if (slotValue && childValue) {\n mergedProps[propName] = composeEventHandlers(\n slotValue as (event: unknown) => void,\n childValue as (event: unknown) => void\n );\n } else {\n mergedProps[propName] = childValue || slotValue;\n }\n }\n // className 병합\n else if (propName === \"className\") {\n mergedProps[propName] = mergeClassName(\n slotValue as string | undefined,\n childValue as string | undefined\n );\n }\n // style 병합\n else if (propName === \"style\") {\n mergedProps[propName] = mergeStyle(\n slotValue as React.CSSProperties | undefined,\n childValue as React.CSSProperties | undefined\n );\n }\n // 그 외: 자식 값 우선\n else {\n mergedProps[propName] = childValue !== undefined ? childValue : slotValue;\n }\n }\n\n return mergedProps;\n}\n\n/**\n * 유효한 단일 React 요소인지 확인\n */\nfunction isSlottable(child: React.ReactNode): child is React.ReactElement {\n return React.isValidElement(child);\n}\n\n/**\n * Slot 컴포넌트\n *\n * 자식 요소에 부모의 props를 주입합니다.\n * asChild 패턴을 구현할 때 사용합니다.\n */\nconst Slot = React.forwardRef<HTMLElement, SlotProps>(\n ({ children, ...slotProps }, forwardedRef) => {\n const childArray = React.Children.toArray(children);\n\n // 유효한 단일 자식이 있는지 확인\n if (childArray.length !== 1) {\n if (process.env.NODE_ENV !== \"production\") {\n console.warn(\n \"[Slot] asChild는 정확히 하나의 자식 요소가 필요합니다.\"\n );\n }\n return null;\n }\n\n const child = childArray[0];\n\n if (!isSlottable(child)) {\n if (process.env.NODE_ENV !== \"production\") {\n console.warn(\"[Slot] 자식은 유효한 React 요소여야 합니다.\");\n }\n return null;\n }\n\n // 자식 요소의 props와 ref 추출\n const childProps = child.props as Record<string, unknown>;\n const childRef = (child as unknown as { ref?: React.Ref<HTMLElement> }).ref;\n\n // props와 ref 병합\n const mergedProps = mergeProps(slotProps, childProps);\n const mergedRef = composeRefs(forwardedRef, childRef);\n\n return React.cloneElement(child, {\n ...mergedProps,\n ref: mergedRef,\n } as React.Attributes);\n }\n);\n\nSlot.displayName = \"Slot\";\n\nexport { Slot, composeRefs, mergeProps };\nexport type { SlotProps };\n","\"use client\";\n\nimport React from \"react\";\nimport { merge } from \"../lib/utils\";\nimport { buttonVariants, gradientPresets } from \"./Button.variants\";\nimport { Slot } from \"../lib/Slot\";\n\n/**\n * 버튼 스타일 변형 / Button style variant\n */\ntype Variant =\n | \"default\" | \"destructive\" | \"outline\" | \"secondary\"\n | \"ghost\" | \"link\" | \"gradient\" | \"neon\" | \"glass\";\n\n/**\n * 버튼 크기 / Button size\n */\ntype Size = \"sm\" | \"md\" | \"lg\" | \"xl\" | \"icon\";\n\n/**\n * 버튼 모서리 둥글기 / Button border radius\n */\ntype Rounded = \"sm\" | \"md\" | \"lg\" | \"full\";\n\n/**\n * 버튼 그림자 / Button shadow\n */\ntype Shadow = \"none\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n\n/**\n * 버튼 호버 효과 / Button hover effect\n * \"springy\"가 HUA-UI 시그니처 - 공 튕기듯 미세한 반동\n */\ntype Hover = \"springy\" | \"scale\" | \"glow\" | \"slide\" | \"none\";\n\n/**\n * 그라디언트 색상 이름 / Gradient color name\n */\ntype GradientName = \"blue\" | \"purple\" | \"green\" | \"orange\" | \"pink\" | \"custom\";\n\n/**\n * Button 컴포넌트의 공통 props / Common props for Button component\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 asChild?: 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 */\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 * @example\n * <Button onClick={() => console.log('클릭')}>클릭하세요</Button>\n * <Button variant=\"destructive\" size=\"lg\">삭제</Button>\n * <Button variant=\"gradient\" gradient=\"purple\">그라디언트</Button>\n * <Button href=\"/about\" variant=\"link\">자세히 보기</Button>\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 = \"springy\",\n fullWidth,\n iconOnly,\n className,\n children,\n disabled,\n asChild = false,\n ...rest\n },\n ref\n) {\n const reduced = useReducedMotion();\n\n // gradient variant: 커스텀 그라디언트 클래스 처리\n const gradientClass =\n variant === \"gradient\"\n ? customGradient\n ? `bg-gradient-to-r ${customGradient}`\n : `bg-gradient-to-r ${gradientPresets[gradient] || gradientPresets.blue}`\n : undefined;\n\n const base = merge(\n buttonVariants({\n variant,\n size,\n rounded,\n shadow,\n hover: reduced ? \"none\" : hover,\n fullWidth: fullWidth ?? false,\n }),\n gradientClass,\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 console.warn(\"[Button] iconOnly 사용 시 aria-label을 제공하세요.\");\n }\n\n // asChild 모드: Slot을 사용하여 자식 요소에 props 병합\n if (asChild) {\n const slotProps = {\n className: base,\n ref,\n disabled: disabled || loading,\n \"aria-busy\": loading || undefined,\n \"aria-disabled\": (disabled || loading) || undefined,\n ...rest,\n };\n return <Slot {...slotProps}>{children}</Slot>;\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","\"use client\";\n\nimport React from \"react\";\nimport { merge } from \"../lib/utils\";\nimport { Button, type ButtonProps } from \"./Button\";\n\n/** Action 전용 옵션(버튼 공통 옵션은 ButtonProps에서 상속) */\ntype ActionKind =\n | \"primary\" | \"secondary\" | \"tertiary\"\n | \"magical\" | \"cyberpunk\" | \"ninja\" | \"wizard\" | \"sniper\";\ntype FeedbackKind = \"ripple\" | \"particle\" | \"sound\" | \"haptic\" | \"glitch\" | \"sparkle\" | \"smoke\";\n\ntype ActionExtras = {\n actionType?: ActionKind;\n feedback?: FeedbackKind;\n\n particleEffect?: boolean;\n rippleEffect?: boolean;\n soundEffect?: boolean;\n hapticFeedback?: boolean;\n\n transparency?: number; // 0~1\n blurIntensity?: number; // px\n glowIntensity?: number; // px\n glowColor?: string; // css color\n};\n\n/**\n * Action 컴포넌트의 props / Action component props\n * @typedef {Object} ActionProps\n * @property {ActionKind} [actionType=\"primary\"] - Action 타입 / Action type\n * @property {FeedbackKind} [feedback=\"ripple\"] - 피드백 타입 / Feedback type\n * @property {boolean} [particleEffect=false] - 파티클 효과 활성화 / Enable particle effect\n * @property {boolean} [rippleEffect=false] - 리플 효과 활성화 / Enable ripple effect\n * @property {boolean} [soundEffect=false] - 사운드 효과 활성화 / Enable sound effect\n * @property {boolean} [hapticFeedback=false] - 햅틱 피드백 활성화 / Enable haptic feedback\n * @property {number} [transparency=1] - 투명도 (0-1) / Transparency (0-1)\n * @property {number} [blurIntensity=0] - blur 강도 (px) / Blur intensity (px)\n * @property {number} [glowIntensity=0] - 글로우 강도 (px) / Glow intensity (px)\n * @property {string} [glowColor=\"rgba(91,140,255,.8)\"] - 글로우 색상 / Glow color\n * @extends {ButtonProps}\n */\nexport type ActionProps = ButtonProps & ActionExtras;\n\ntype AnchorEl = HTMLAnchorElement;\ntype ButtonEl = HTMLButtonElement;\ntype AnchorOrButton = AnchorEl | ButtonEl;\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 * Action 컴포넌트 / Action component\n * \n * 고급 효과를 가진 액션 버튼 컴포넌트입니다.\n * Button 컴포넌트를 기반으로 하며, 파티클, 리플, 사운드, 햅틱 피드백 등을 지원합니다.\n * \n * Action button component with advanced effects.\n * Based on Button component, supports particle, ripple, sound, haptic feedback, etc.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Action>클릭</Action>\n * \n * @example\n * // 고급 효과 / Advanced effects\n * <Action \n * actionType=\"magical\"\n * feedback=\"particle\"\n * particleEffect\n * rippleEffect\n * >\n * 마법 버튼\n * </Action>\n * \n * @param {ActionProps} props - Action 컴포넌트의 props / Action component props\n * @param {React.Ref<AnchorOrButton>} ref - button 또는 anchor 요소 ref / button or anchor element ref\n * @returns {JSX.Element} Action 컴포넌트 / Action component\n */\nexport const Action = React.forwardRef<AnchorOrButton, ActionProps>(\n (\n {\n className,\n children,\n actionType = \"primary\",\n feedback = \"ripple\",\n particleEffect = false,\n rippleEffect = false,\n soundEffect = false,\n hapticFeedback = false,\n transparency = 1,\n blurIntensity = 0,\n glowIntensity = 0,\n glowColor = \"rgba(91,140,255,.8)\",\n loading = false,\n iconOnly = false,\n disabled,\n ...rest\n },\n ref\n ) => {\n const reduced = useReducedMotion();\n\n const runEffects = React.useCallback((event: React.MouseEvent) => {\n if (hapticFeedback && isBrowser && \"vibrate\" in navigator && !reduced) {\n try { navigator.vibrate?.(30); } catch { /* ignore */ }\n }\n \n if (soundEffect && !reduced && isBrowser) {\n // 간단한 클릭 사운드 효과 (선택적)\n try {\n const AudioContextClass = window.AudioContext || (window as typeof window & { webkitAudioContext?: typeof AudioContext }).webkitAudioContext;\n if (!AudioContextClass) return;\n const audioContext = new AudioContextClass();\n const oscillator = audioContext.createOscillator();\n const gainNode = audioContext.createGain();\n \n oscillator.connect(gainNode);\n gainNode.connect(audioContext.destination);\n \n oscillator.frequency.value = 800;\n oscillator.type = 'sine';\n gainNode.gain.setValueAtTime(0.1, audioContext.currentTime);\n gainNode.gain.exponentialRampToValueAtTime(0.01, audioContext.currentTime + 0.1);\n \n oscillator.start(audioContext.currentTime);\n oscillator.stop(audioContext.currentTime + 0.1);\n } catch {\n // 오디오 컨텍스트를 지원하지 않는 환경에서는 무시\n }\n }\n \n if (rippleEffect && !reduced && event.currentTarget) {\n // Ripple 효과: 클릭 위치에 원형 애니메이션 생성\n const button = event.currentTarget as HTMLElement;\n const rect = button.getBoundingClientRect();\n const x = event.clientX - rect.left;\n const y = event.clientY - rect.top;\n const size = Math.max(rect.width, rect.height);\n \n const ripple = document.createElement('span');\n ripple.style.cssText = `\n position: absolute;\n border-radius: 50%;\n background: rgba(255, 255, 255, 0.6);\n width: ${size}px;\n height: ${size}px;\n left: ${x - size / 2}px;\n top: ${y - size / 2}px;\n pointer-events: none;\n animation: ripple-animation 0.6s ease-out;\n `;\n \n // CSS 애니메이션 정의 (한 번만)\n if (!document.getElementById('ripple-animation-style')) {\n const style = document.createElement('style');\n style.id = 'ripple-animation-style';\n style.textContent = `\n @keyframes ripple-animation {\n to {\n transform: scale(4);\n opacity: 0;\n }\n }\n `;\n document.head.appendChild(style);\n }\n \n button.style.position = 'relative';\n button.style.overflow = 'hidden';\n button.appendChild(ripple);\n \n setTimeout(() => {\n ripple.remove();\n }, 600);\n }\n \n if (particleEffect && !reduced && event.currentTarget) {\n // 간단한 파티클 효과: 클릭 위치에서 작은 원들이 퍼져나감\n const button = event.currentTarget as HTMLElement;\n const rect = button.getBoundingClientRect();\n const x = event.clientX - rect.left;\n const y = event.clientY - rect.top;\n \n for (let i = 0; i < 5; i++) {\n const particle = document.createElement('span');\n const angle = (Math.PI * 2 * i) / 5;\n const velocity = 30 + Math.random() * 20;\n const vx = Math.cos(angle) * velocity;\n const vy = Math.sin(angle) * velocity;\n \n particle.style.cssText = `\n position: absolute;\n width: 4px;\n height: 4px;\n background: ${glowColor || 'rgba(91,140,255,0.8)'};\n border-radius: 50%;\n left: ${x}px;\n top: ${y}px;\n pointer-events: none;\n animation: particle-animation-${i} 0.5s ease-out forwards;\n `;\n \n // CSS 애니메이션 정의\n if (!document.getElementById(`particle-animation-${i}`)) {\n const style = document.createElement('style');\n style.id = `particle-animation-${i}`;\n style.textContent = `\n @keyframes particle-animation-${i} {\n to {\n transform: translate(${vx}px, ${vy}px) scale(0);\n opacity: 0;\n }\n }\n `;\n document.head.appendChild(style);\n }\n \n button.style.position = 'relative';\n button.appendChild(particle);\n \n setTimeout(() => {\n particle.remove();\n }, 500);\n }\n }\n }, [hapticFeedback, soundEffect, rippleEffect, particleEffect, reduced, glowColor]);\n\n const styleVars = React.useMemo<React.CSSProperties>(() => ({\n \"--action-opacity\": String(transparency),\n \"--action-blur\": `${blurIntensity}px`,\n \"--action-glow-size\": `${glowIntensity}px`,\n \"--action-glow-color\": glowColor,\n }) as React.CSSProperties, [transparency, blurIntensity, glowIntensity, glowColor]);\n\n const cls = React.useMemo(\n () =>\n merge(\n \"hua-action relative inline-flex items-center rounded-xl px-4 py-2 font-medium\",\n \"focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-primary/60\",\n loading && \"cursor-wait opacity-80\",\n iconOnly && \"justify-center\",\n className\n ),\n [className, loading, iconOnly]\n );\n\n /** 분기 1) href가 있으면 앵커 브랜치 */\n if (\"href\" in rest && rest.href) {\n const { onClick, href, ...anchorRest } = rest as Extract<ButtonProps, { href: string }>;\n\n const handleClick: React.MouseEventHandler<AnchorEl> = (e) => {\n if (disabled || loading) { e.preventDefault(); e.stopPropagation(); return; }\n runEffects(e);\n onClick?.(e);\n };\n\n return (\n <Button\n ref={ref as React.Ref<AnchorEl>}\n href={href}\n className={cls}\n style={styleVars}\n onClick={handleClick}\n aria-busy={loading || undefined}\n aria-label={iconOnly ? (anchorRest[\"aria-label\"] as string) : undefined}\n data-action={actionType}\n data-feedback={feedback}\n data-reduced-motion={reduced ? \"true\" : \"false\"}\n disabled={disabled}\n {...anchorRest}\n >\n {children}\n </Button>\n );\n }\n\n /** 분기 2) 기본 버튼 브랜치 */\n const { onClick, ...btnRest } = rest as Extract<ButtonProps, { href?: undefined }>;\n\n const handleClick: React.MouseEventHandler<ButtonEl> = (e) => {\n if (disabled || loading) return;\n runEffects(e);\n onClick?.(e);\n };\n\n return (\n <Button\n ref={ref as React.Ref<ButtonEl>}\n className={cls}\n style={styleVars}\n onClick={handleClick}\n disabled={disabled}\n aria-busy={loading || undefined}\n aria-label={iconOnly ? (btnRest[\"aria-label\"] as string) : undefined}\n data-action={actionType}\n data-feedback={feedback}\n data-reduced-motion={reduced ? \"true\" : \"false\"}\n {...btnRest}\n >\n {children}\n </Button>\n );\n }\n);\n\nAction.displayName = \"Action\";\n","/**\n * CVA 공통 상수 — 전 컴포넌트에서 재사용\n *\n * 모든 CVA variant 정의에서 import하여 사용합니다.\n * @example\n * import { SHARED_DISABLED, SHARED_FOCUS } from '../lib/styles/cva-base'\n */\n\n/** 비활성 상태 공통 스타일 */\nexport const SHARED_DISABLED =\n 'disabled:pointer-events-none disabled:opacity-50' as const\n\n/** 포커스 링 공통 스타일 */\nexport const SHARED_FOCUS =\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2' as const\n\n/** 트랜지션 공통 스타일 */\nexport const SHARED_TRANSITION =\n 'transition-colors duration-150' as const\n\n/** 글래스모피즘 공통 스타일 */\nexport const SHARED_GLASS =\n 'backdrop-blur-md border-white/20 bg-white/10 dark:bg-white/5' as const\n\n/**\n * 폼 상태 스타일 (error / success)\n * Input, Select, Textarea, Switch 등 전체 폼 컴포넌트에서 사용\n */\nexport const FORM_STATE = {\n error: 'border-destructive focus-visible:ring-destructive',\n success: 'border-green-500 focus-visible:ring-green-500',\n} as const\n\n/**\n * HUA 시그니처 스프링 이징\n * cubic-bezier(0.34, 1.56, 0.64, 1) — \"쫀득한\" 느낌\n */\nexport const HUA_SPRING_EASING =\n 'cubic-bezier(0.34, 1.56, 0.64, 1)' as const\n\n/** 마이크로 모션 기본 트랜지션 */\nexport const SHARED_MICRO_MOTION =\n 'transition-all duration-[180ms]' as const\n","\"use client\"\n\nimport React from \"react\"\nimport { cva } from \"class-variance-authority\"\nimport { merge } from \"../lib/utils\"\nimport { FORM_STATE } from \"../lib/styles/cva-base\"\n\nexport const inputVariants = cva(\n \"flex h-10 w-full rounded-md border 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-1 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 transition-all duration-200 hover:border-accent-foreground hover:shadow-sm\",\n {\n variants: {\n variant: {\n default: \"border-input bg-background\",\n outline: \"border-2 border-input bg-transparent\",\n filled: \"border-transparent bg-secondary/50\",\n glass: \"border-white/20 bg-white/10 text-white placeholder:text-white/50 backdrop-blur-sm\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\n/**\n * Input 컴포넌트의 props / Input component props\n */\nexport interface InputProps extends React.InputHTMLAttributes<HTMLInputElement> {\n variant?: \"default\" | \"outline\" | \"filled\" | \"glass\"\n error?: boolean\n success?: boolean\n}\n\n/**\n * Input 컴포넌트 / Input component\n *\n * 표준 HTML input 요소를 래핑한 스타일링된 입력 필드 컴포넌트입니다.\n *\n * @example\n * <Input type=\"text\" placeholder=\"이름을 입력하세요\" />\n * <Input type=\"email\" error placeholder=\"이메일\" />\n */\nconst Input = React.forwardRef<HTMLInputElement, InputProps>(\n ({ className, type, variant = \"default\", error, success, ...props }, ref) => {\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 <input\n type={type}\n className={merge(\n inputVariants({ variant }),\n isInvalid && FORM_STATE.error,\n success && FORM_STATE.success,\n className\n )}\n ref={ref}\n aria-invalid={isInvalid || undefined}\n {...props}\n />\n )\n }\n)\nInput.displayName = \"Input\"\n\nexport { Input }\n","\"use client\";\n\nimport React from \"react\";\nimport { merge } from \"../lib/utils\";\n\n/**\n * NumberInput 컴포넌트의 props / NumberInput component props\n * @typedef {Object} NumberInputProps\n * @property {number} [value] - 현재 값 / Current value\n * @property {number} [defaultValue=0] - 기본 값 / Default value\n * @property {number} [min] - 최소 값 / Minimum value\n * @property {number} [max] - 최대 값 / Maximum value\n * @property {number} [step=1] - 증감 단위 / Step amount\n * @property {(value: number) => void} [onChange] - 값 변경 콜백 / Value change callback\n * @property {boolean} [disabled=false] - 비활성화 / Disabled state\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - 크기 / Size\n * @property {boolean} [showButtons=true] - +/- 버튼 표시 / Show +/- buttons\n * @property {\"horizontal\" | \"vertical\"} [buttonLayout=\"horizontal\"] - 버튼 배치 / Button layout\n * @property {string} [className] - 추가 CSS 클래스 / Additional CSS class\n */\nexport interface NumberInputProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, \"onChange\" | \"value\" | \"defaultValue\" | \"size\" | \"type\"> {\n value?: number;\n defaultValue?: number;\n min?: number;\n max?: number;\n step?: number;\n onChange?: (value: number) => void;\n disabled?: boolean;\n size?: \"sm\" | \"md\" | \"lg\";\n showButtons?: boolean;\n buttonLayout?: \"horizontal\" | \"vertical\";\n}\n\n/**\n * NumberInput 컴포넌트 / NumberInput component\n *\n * 숫자 입력을 위한 컴포넌트로, 커스텀 +/- 버튼을 제공합니다.\n * 브라우저 기본 스피너 대신 스타일링된 버튼을 사용합니다.\n *\n * Number input component with custom +/- buttons.\n * Uses styled buttons instead of browser default spinners.\n *\n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <NumberInput value={count} onChange={setCount} />\n *\n * @example\n * // 범위 지정 / With range\n * <NumberInput min={0} max={100} step={5} />\n *\n * @example\n * // 세로 버튼 / Vertical buttons\n * <NumberInput buttonLayout=\"vertical\" />\n */\nconst NumberInput = React.forwardRef<HTMLInputElement, NumberInputProps>(\n (\n {\n value: controlledValue,\n defaultValue = 0,\n min,\n max,\n step = 1,\n onChange,\n disabled = false,\n size = \"md\",\n showButtons = true,\n buttonLayout = \"horizontal\",\n className,\n ...props\n },\n ref\n ) => {\n const [internalValue, setInternalValue] = React.useState(defaultValue);\n const isControlled = controlledValue !== undefined;\n const currentValue = isControlled ? controlledValue : internalValue;\n\n const updateValue = React.useCallback(\n (newValue: number) => {\n // Clamp to min/max\n let clampedValue = newValue;\n if (min !== undefined) clampedValue = Math.max(min, clampedValue);\n if (max !== undefined) clampedValue = Math.min(max, clampedValue);\n\n if (!isControlled) {\n setInternalValue(clampedValue);\n }\n onChange?.(clampedValue);\n },\n [isControlled, min, max, onChange]\n );\n\n const increment = () => {\n if (disabled) return;\n updateValue(currentValue + step);\n };\n\n const decrement = () => {\n if (disabled) return;\n updateValue(currentValue - step);\n };\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const inputValue = e.target.value;\n // Allow empty string, minus sign alone (for typing negative numbers), or valid numbers\n if (inputValue === \"\" || inputValue === \"-\") {\n return;\n }\n const newValue = parseFloat(inputValue);\n if (!isNaN(newValue)) {\n // If min is set, enforce it on direct input\n if (min !== undefined && newValue < min) {\n updateValue(min);\n } else {\n updateValue(newValue);\n }\n }\n };\n\n const handleBlur = (e: React.FocusEvent<HTMLInputElement>) => {\n // On blur, ensure value is within bounds\n if (min !== undefined && currentValue < min) {\n updateValue(min);\n }\n if (max !== undefined && currentValue > max) {\n updateValue(max);\n }\n props.onBlur?.(e);\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"ArrowUp\") {\n e.preventDefault();\n increment();\n } else if (e.key === \"ArrowDown\") {\n e.preventDefault();\n decrement();\n }\n };\n\n // Spacing system: 4px grid\n // sm: h-8 (32px), px-2 (8px), gap-1 (4px)\n // md: h-10 (40px), px-3 (12px), gap-2 (8px)\n // lg: h-12 (48px), px-4 (16px), gap-2 (8px)\n const sizeClasses = {\n sm: {\n input: \"h-8 text-sm px-2 py-1\",\n button: \"w-8 h-8 text-sm\",\n wrapper: \"gap-1\",\n },\n md: {\n input: \"h-10 text-sm px-3 py-2\",\n button: \"w-10 h-10 text-sm\",\n wrapper: \"gap-2\",\n },\n lg: {\n input: \"h-12 text-base px-4 py-2.5\",\n button: \"w-12 h-12 text-base\",\n wrapper: \"gap-2\",\n },\n };\n\n const sizes = sizeClasses[size];\n\n const buttonBase = merge(\n \"flex items-center justify-center rounded-md border border-input bg-background\",\n \"hover:bg-secondary hover:border-primary/50 active:scale-95\",\n \"transition-all duration-150\",\n \"disabled:opacity-50 disabled:cursor-not-allowed disabled:hover:bg-background\",\n \"focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-2\",\n sizes.button\n );\n\n const canDecrement = min === undefined || currentValue > min;\n const canIncrement = max === undefined || currentValue < max;\n\n if (buttonLayout === \"vertical\") {\n return (\n <div className={merge(\"inline-flex items-center\", sizes.wrapper, className)}>\n <div className=\"flex flex-col gap-0.5\">\n <button\n type=\"button\"\n onClick={increment}\n disabled={disabled || !canIncrement}\n className={merge(buttonBase, \"rounded-b-none h-[calc(50%-1px)]\")}\n aria-label=\"Increase\"\n >\n <ChevronUp className=\"w-3 h-3\" />\n </button>\n <button\n type=\"button\"\n onClick={decrement}\n disabled={disabled || !canDecrement}\n className={merge(buttonBase, \"rounded-t-none h-[calc(50%-1px)]\")}\n aria-label=\"Decrease\"\n >\n <ChevronDown className=\"w-3 h-3\" />\n </button>\n </div>\n <input\n ref={ref}\n type=\"text\"\n inputMode=\"numeric\"\n pattern={min !== undefined && min >= 0 ? \"[0-9]*\" : \"-?[0-9]*\"}\n value={currentValue}\n onChange={handleInputChange}\n onKeyDown={handleKeyDown}\n onBlur={handleBlur}\n disabled={disabled}\n className={merge(\n \"w-16 text-center rounded-md border border-input bg-background\",\n \"focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-2\",\n \"disabled:cursor-not-allowed disabled:opacity-50\",\n \"[appearance:textfield] [&::-webkit-outer-spin-button]:appearance-none [&::-webkit-inner-spin-button]:appearance-none\",\n sizes.input\n )}\n {...props}\n />\n </div>\n );\n }\n\n return (\n <div className={merge(\"inline-flex items-center\", sizes.wrapper, className)}>\n {showButtons && (\n <button\n type=\"button\"\n onClick={decrement}\n disabled={disabled || !canDecrement}\n className={buttonBase}\n aria-label=\"Decrease\"\n >\n <Minus className=\"w-3.5 h-3.5\" />\n </button>\n )}\n <input\n ref={ref}\n type=\"text\"\n inputMode=\"numeric\"\n pattern={min !== undefined && min >= 0 ? \"[0-9]*\" : \"-?[0-9]*\"}\n value={currentValue}\n onChange={handleInputChange}\n onKeyDown={handleKeyDown}\n onBlur={handleBlur}\n disabled={disabled}\n className={merge(\n \"w-16 text-center rounded-md border border-input bg-background\",\n \"focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-2\",\n \"disabled:cursor-not-allowed disabled:opacity-50\",\n \"[appearance:textfield] [&::-webkit-outer-spin-button]:appearance-none [&::-webkit-inner-spin-button]:appearance-none\",\n sizes.input\n )}\n {...props}\n />\n {showButtons && (\n <button\n type=\"button\"\n onClick={increment}\n disabled={disabled || !canIncrement}\n className={buttonBase}\n aria-label=\"Increase\"\n >\n <Plus className=\"w-3.5 h-3.5\" />\n </button>\n )}\n </div>\n );\n }\n);\n\nNumberInput.displayName = \"NumberInput\";\n\n// Simple icon components to avoid external dependency\nfunction Minus({ className }: { className?: string }) {\n return (\n <svg\n className={className}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M20 12H4\" />\n </svg>\n );\n}\n\nfunction Plus({ className }: { className?: string }) {\n return (\n <svg\n className={className}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 4v16m8-8H4\" />\n </svg>\n );\n}\n\nfunction ChevronUp({ className }: { className?: string }) {\n return (\n <svg\n className={className}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 15l7-7 7 7\" />\n </svg>\n );\n}\n\nfunction ChevronDown({ className }: { className?: string }) {\n return (\n <svg\n className={className}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 9l-7 7-7-7\" />\n </svg>\n );\n}\n\nexport { NumberInput };\n","\"use client\"\n\nimport React from \"react\"\nimport { cva } from \"class-variance-authority\"\nimport { merge } from \"../lib/utils\"\n\nexport const linkVariants = cva(\n \"transition-colors duration-200\",\n {\n variants: {\n variant: {\n default: \"text-foreground hover:text-muted-foreground\",\n primary: \"text-primary hover:text-primary/80\",\n secondary: \"text-muted-foreground hover:text-foreground\",\n ghost: \"text-muted-foreground hover:text-foreground\",\n underline: \"text-primary hover:text-primary/80 underline hover:no-underline\",\n },\n size: {\n sm: \"text-sm\",\n md: \"text-base\",\n lg: \"text-lg\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"md\",\n },\n }\n)\n\n/**\n * Link 컴포넌트의 props / Link component props\n */\nexport interface LinkProps {\n href: string\n children: React.ReactNode\n variant?: \"default\" | \"primary\" | \"secondary\" | \"ghost\" | \"underline\"\n size?: \"sm\" | \"md\" | \"lg\"\n external?: boolean\n className?: string\n onClick?: () => void\n}\n\n/**\n * Link 컴포넌트 / Link component\n *\n * 링크를 표시하는 컴포넌트입니다.\n * 외부 링크의 경우 자동으로 `target=\"_blank\"`와 `rel=\"noopener noreferrer\"`를 설정합니다.\n *\n * @example\n * <Link href=\"/about\">소개</Link>\n * <Link href=\"https://example.com\" external>외부 사이트</Link>\n * <Link href=\"/contact\" variant=\"primary\" size=\"lg\">문의하기</Link>\n */\nexport function Link({\n href,\n children,\n className,\n variant = \"default\",\n size = \"md\",\n external = false,\n onClick\n}: LinkProps) {\n return (\n <a\n href={href}\n className={merge(linkVariants({ variant, size }), className)}\n target={external ? \"_blank\" : undefined}\n rel={external ? \"noopener noreferrer\" : undefined}\n onClick={onClick}\n >\n {children}\n </a>\n )\n} ","/**\n * Core Icons (Phosphor 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 House,\n ArrowLeft,\n ArrowRight,\n ArrowUp,\n ArrowDown,\n List as ListIcon,\n X,\n MagnifyingGlass,\n Gear,\n ArrowSquareOut,\n CaretLeft,\n CaretRight,\n CaretDown,\n CaretUp,\n\n // Actions\n Pencil,\n Trash,\n Plus,\n Minus,\n Download,\n Upload,\n ArrowClockwise,\n FloppyDisk,\n Copy,\n\n // Text Formatting (Markdown Toolbar)\n TextB,\n TextItalic,\n TextStrikethrough,\n TextHOne,\n Link,\n Code,\n FileCode,\n Quotes,\n List,\n ListNumbers,\n\n // Status & Feedback\n SpinnerGap,\n CheckCircle,\n XCircle,\n WarningCircle,\n Info,\n Check,\n Circle,\n Question,\n\n // User & Auth\n User,\n Users,\n UserPlus,\n SignIn,\n SignOut,\n Eye,\n EyeSlash,\n\n // Data & Analytics\n ChartBar,\n TrendUp,\n Pulse,\n Database,\n Lightning,\n\n // Files & Content\n FileText,\n File,\n Folder,\n Book,\n BookOpen,\n\n // Communication\n Envelope,\n ChatCircle,\n Phone,\n\n // Media\n Image,\n Video,\n Camera,\n\n // Emotions\n Smiley,\n SmileySad,\n SmileyMeh,\n\n // Security\n Lock,\n LockOpen,\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 Sparkle,\n Globe,\n DeviceMobile,\n Ticket,\n Clipboard,\n WifiHigh,\n WifiSlash,\n Cpu,\n MaskHappy,\n} from '@phosphor-icons/react/dist/ssr'\n\n// 핵심 아이콘 객체 (키는 기존과 동일, 값만 Phosphor로 교체)\nexport const icons = {\n // Navigation\n home: House,\n arrowLeft: ArrowLeft,\n arrowRight: ArrowRight,\n arrowUp: ArrowUp,\n arrowDown: ArrowDown,\n menu: ListIcon,\n close: X,\n search: MagnifyingGlass,\n settings: Gear,\n externalLink: ArrowSquareOut,\n chevronLeft: CaretLeft,\n chevronRight: CaretRight,\n chevronDown: CaretDown,\n chevronUp: CaretUp,\n\n // Actions\n edit: Pencil,\n delete: Trash,\n add: Plus,\n remove: Minus,\n download: Download,\n upload: Upload,\n refresh: ArrowClockwise,\n save: FloppyDisk,\n copy: Copy,\n\n // Status & Feedback\n loader: SpinnerGap,\n success: CheckCircle,\n error: XCircle,\n alertCircle: WarningCircle,\n warning: WarningCircle,\n info: Info,\n check: Check,\n circle: Circle,\n helpCircle: Question,\n\n // User & Auth\n user: User,\n users: Users,\n userPlus: UserPlus,\n logIn: SignIn,\n logOut: SignOut,\n eye: Eye,\n eyeOff: EyeSlash,\n\n // Data & Analytics\n chart: ChartBar,\n barChart: ChartBar,\n trendingUp: TrendUp,\n activity: Pulse,\n database: Database,\n zap: Lightning,\n\n // Files & Content\n fileText: FileText,\n file: File,\n folder: Folder,\n book: Book,\n bookOpen: BookOpen,\n\n // Communication\n mail: Envelope,\n message: ChatCircle,\n phone: Phone,\n\n // Media\n image: Image,\n video: Video,\n camera: Camera,\n\n // Emotions\n smile: Smiley,\n frown: SmileySad,\n meh: SmileyMeh,\n\n // Security\n lock: Lock,\n unlock: LockOpen,\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 sparkle: Sparkle,\n sparkles: Sparkle,\n globe: Globe,\n smartphone: DeviceMobile,\n deviceMobile: DeviceMobile,\n floppyDisk: FloppyDisk,\n\n // Connectivity\n ticket: Ticket,\n clipboard: Clipboard,\n wifi: WifiHigh,\n wifiOff: WifiSlash,\n cpu: Cpu,\n mask: MaskHappy,\n\n // Text Formatting (Markdown Toolbar)\n bold: TextB,\n italic: TextItalic,\n strikethrough: TextStrikethrough,\n heading: TextHOne,\n link: Link,\n code: Code,\n fileCode: FileCode,\n quote: Quotes,\n list: List,\n listOrdered: ListNumbers,\n minus: Minus,\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',\n angry: 'frown',\n love: 'heart',\n like: 'heart',\n dislike: '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 * Case Conversion Utilities\n *\n * 문자열 케이스 변환 유틸리티 함수들입니다.\n * Utility functions for string case conversion.\n */\n\n/**\n * 문자열을 camelCase로 변환합니다.\n * Converts a string to camelCase.\n *\n * @param str - 변환할 문자열 / String to convert\n * @returns camelCase 문자열 / camelCase string\n *\n * @example\n * toCamelCase('arrow-left') // 'arrowLeft'\n * toCamelCase('arrow_left') // 'arrowLeft'\n * toCamelCase('ArrowLeft') // 'arrowLeft'\n * toCamelCase('arrowLeft') // 'arrowLeft'\n * toCamelCase('HEART') // 'heart'\n */\nexport function toCamelCase(str: string): string {\n if (!str) return str\n\n // 이미 camelCase인지 확인 (kebab/snake가 아니고 첫 글자가 소문자)\n if (!/[-_]/.test(str) && /^[a-z]/.test(str)) {\n return str\n }\n\n // 전체가 대문자인 경우 (HEART, USER 등) → 전체 소문자로\n if (/^[A-Z]+$/.test(str)) {\n return str.toLowerCase()\n }\n\n // PascalCase를 camelCase로 변환 (ArrowLeft → arrowLeft)\n if (/^[A-Z]/.test(str) && !/[-_]/.test(str)) {\n return str.charAt(0).toLowerCase() + str.slice(1)\n }\n\n // kebab-case 또는 snake_case를 camelCase로 변환\n return str\n .split(/[-_]/)\n .map((word, index) => {\n if (index === 0) {\n return word.toLowerCase()\n }\n return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()\n })\n .join('')\n}\n\n/**\n * 문자열을 PascalCase로 변환합니다.\n * Converts a string to PascalCase.\n *\n * @param str - 변환할 문자열 / String to convert\n * @returns PascalCase 문자열 / PascalCase string\n *\n * @example\n * toPascalCase('arrow-left') // 'ArrowLeft'\n * toPascalCase('arrow_left') // 'ArrowLeft'\n * toPascalCase('arrowLeft') // 'ArrowLeft'\n * toPascalCase('ArrowLeft') // 'ArrowLeft'\n */\nexport function toPascalCase(str: string): string {\n if (!str) return str\n\n // 이미 PascalCase인지 확인\n if (/^[A-Z]/.test(str) && !/[-_]/.test(str)) {\n return str\n }\n\n // kebab-case 또는 snake_case가 포함된 경우\n if (/[-_]/.test(str)) {\n return str\n .split(/[-_]/)\n .map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join('')\n }\n\n // camelCase를 PascalCase로 변환\n return str.charAt(0).toUpperCase() + str.slice(1)\n}\n","/**\n * Icon Provider System\n *\n * 각 프로바이더별 로딩 전략 / Loading strategies per provider:\n *\n * 1. Phosphor Icons (https://phosphoricons.com) - default\n * - Official package: @phosphor-icons/react (MIT License)\n * - icons.ts에서 정적 import (SSR-safe /dist/ssr)\n * - PROJECT_ICONS 매핑으로 통합 이름 지원\n * - 폴백: initPhosphorIcons()로 동적 namespace 조회\n *\n * 2. Lucide Icons (https://lucide.dev) - deprecated, backward compat\n * - initLucideIcons() 호출 시에만 로드 / Lazy loaded on demand\n * - 향후 제거 예정 / Will be removed in future\n *\n * 3. Iconsax Icons (https://iconsax.io) - separate entry\n * - '@hua-labs/ui/iconsax'에서 import 시 자동 등록\n * - 코어 번들에 포함되지 않음 / Not in core bundle\n * - registerIconsaxResolver()로 lazy 연결\n */\n\nimport { toPascalCase } from './case-utils'\n\n// Phosphor Icons - lazy loaded (전체 namespace import 방지, createContext SSR 이슈)\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet PhosphorIcons: any = null\n\n// Lucide Icons - lazy loaded (하위호환, deprecated)\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet LucideIcons: any = null\n\n// Iconsax resolver - registered lazily when iconsax entry is loaded\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet iconsaxResolver: ((name: string, variant?: string) => any) | null = null\n\n/**\n * Register iconsax resolver (called from iconsax entry point).\n * Allows the core Icon component to resolve iconsax icons\n * without statically importing the iconsax bundle.\n */\nexport function registerIconsaxResolver(resolver: typeof iconsaxResolver) {\n iconsaxResolver = resolver\n}\n\n/**\n * Get registered iconsax resolver\n */\nexport function getIconsaxResolver() {\n return iconsaxResolver\n}\n\n// Icon Provider Type\nexport type IconProvider = 'lucide' | 'phosphor' | 'iconsax'\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', iconsax: 'Home2' },\n 'layout-dashboard': { lucide: 'LayoutDashboard', phosphor: 'SquaresFour' },\n 'folder': { lucide: 'Folder', phosphor: 'Folder', iconsax: 'Folder' },\n 'alert-circle': { lucide: 'AlertCircle', phosphor: 'WarningCircle', iconsax: 'Danger' },\n 'alertCircle': { lucide: 'AlertCircle', phosphor: 'WarningCircle', iconsax: 'Danger' },\n 'columns': { lucide: 'Columns', phosphor: 'Columns' },\n 'users': { lucide: 'Users', phosphor: 'Users', iconsax: 'People' },\n 'settings': { lucide: 'Settings', phosphor: 'Gear' },\n 'menu': { lucide: 'Menu', phosphor: 'List', iconsax: 'Menu' },\n 'close': { lucide: 'X', phosphor: 'X', iconsax: 'CloseCircle' },\n 'chevronLeft': { lucide: 'ChevronLeft', phosphor: 'CaretLeft', iconsax: 'ArrowLeft2' },\n 'chevronRight': { lucide: 'ChevronRight', phosphor: 'CaretRight', iconsax: 'ArrowRight2' },\n 'chevronDown': { lucide: 'ChevronDown', phosphor: 'CaretDown', iconsax: 'ArrowDown2' },\n 'chevronUp': { lucide: 'ChevronUp', phosphor: 'CaretUp', iconsax: 'ArrowUp2' },\n 'arrowLeft': { lucide: 'ArrowLeft', phosphor: 'ArrowLeft', iconsax: 'ArrowLeft' },\n 'arrowRight': { lucide: 'ArrowRight', phosphor: 'ArrowRight', iconsax: 'ArrowRight' },\n 'arrowUp': { lucide: 'ArrowUp', phosphor: 'ArrowUp', iconsax: 'ArrowUp' },\n 'arrowDown': { lucide: 'ArrowDown', phosphor: 'ArrowDown', iconsax: 'ArrowDown' },\n\n // Actions\n 'add': { lucide: 'Plus', phosphor: 'Plus', iconsax: 'Add' },\n 'edit': { lucide: 'Edit', phosphor: 'Pencil' },\n 'pencil': { lucide: 'Pencil', phosphor: 'Pencil' },\n 'delete': { lucide: 'Trash2', phosphor: 'Trash', iconsax: 'Trash' },\n 'trash': { lucide: 'Trash2', phosphor: 'Trash', iconsax: 'Trash' },\n 'upload': { lucide: 'Upload', phosphor: 'Upload', iconsax: 'Upload' },\n 'download': { lucide: 'Download', phosphor: 'Download', iconsax: 'Download' },\n 'x': { lucide: 'X', phosphor: 'X' },\n 'check': { lucide: 'Check', phosphor: 'Check', iconsax: 'Check' },\n 'search': { lucide: 'Search', phosphor: 'MagnifyingGlass', iconsax: 'SearchNormal' },\n 'share': { lucide: 'Share', phosphor: 'Share' },\n 'copy': { lucide: 'Copy', phosphor: 'Copy' },\n 'save': { lucide: 'Save', phosphor: 'FloppyDisk' },\n\n // Status & Feedback\n 'loader': { lucide: 'Loader2', phosphor: 'Spinner' },\n 'loader2': { lucide: 'Loader2', phosphor: 'Spinner' },\n 'check-circle': { lucide: 'CheckCircle', phosphor: 'CheckCircle', iconsax: 'TickCircle' },\n 'checkCircle': { lucide: 'CheckCircle', phosphor: 'CheckCircle', iconsax: 'TickCircle' },\n 'success': { lucide: 'CheckCircle', phosphor: 'CheckCircle', iconsax: 'TickCircle' },\n 'error': { lucide: 'XCircle', phosphor: 'XCircle', iconsax: 'CloseCircle' },\n 'warning': { lucide: 'AlertCircle', phosphor: 'WarningCircle', iconsax: 'Warning2' },\n 'info': { lucide: 'Info', phosphor: 'Info', iconsax: 'InfoCircle' },\n 'refresh': { lucide: 'RefreshCw', phosphor: 'ArrowClockwise', iconsax: 'Refresh' },\n 'refreshCw': { lucide: 'RefreshCw', phosphor: 'ArrowClockwise', iconsax: 'Refresh' },\n 'bell': { lucide: 'Bell', phosphor: 'Bell', iconsax: 'Bell' },\n 'heart': { lucide: 'Heart', phosphor: 'Heart', iconsax: 'Heart' },\n 'star': { lucide: 'Star', phosphor: 'Star', iconsax: 'Star' },\n 'bookmark': { lucide: 'Bookmark', phosphor: 'Bookmark' },\n\n // User & Auth\n 'user': { lucide: 'User', phosphor: 'User', iconsax: 'User' },\n 'userPlus': { lucide: 'UserPlus', phosphor: 'UserPlus', iconsax: 'UserAdd' },\n 'logIn': { lucide: 'LogIn', phosphor: 'SignIn', iconsax: 'Login' },\n 'logOut': { lucide: 'LogOut', phosphor: 'SignOut', iconsax: 'Logout' },\n 'chrome': { lucide: 'Chrome', phosphor: 'ChromeLogo', iconsax: 'Chrome' },\n 'github': { lucide: 'Github', phosphor: 'GithubLogo' },\n 'message': { lucide: 'MessageCircle', phosphor: 'ChatCircle' },\n\n // Content\n 'messageSquare': { lucide: 'MessageSquare', phosphor: 'ChatSquare' },\n 'message-square': { lucide: 'MessageSquare', phosphor: 'ChatSquare' },\n 'inbox': { lucide: 'Inbox', phosphor: 'Inbox' },\n 'calendar': { lucide: 'Calendar', phosphor: 'Calendar' },\n 'calendarPlus': { lucide: 'CalendarPlus', phosphor: 'CalendarPlus' },\n 'checkSquare': { lucide: 'CheckSquare', phosphor: 'CheckSquare', iconsax: 'TickSquare' },\n 'clock': { lucide: 'Clock', phosphor: 'Clock' },\n 'book': { lucide: 'Book', phosphor: 'Book', iconsax: 'Book' },\n 'bookOpen': { lucide: 'BookOpen', phosphor: 'BookOpen', iconsax: 'Book' },\n\n // Theme & UI\n 'monitor': { lucide: 'Monitor', phosphor: 'Monitor', iconsax: 'Monitor' },\n 'sun': { lucide: 'Sun', phosphor: 'Sun', iconsax: 'Sun' },\n 'moon': { lucide: 'Moon', phosphor: 'Moon', iconsax: 'Moon' },\n\n // AI & Features\n 'sparkle': { lucide: 'Sparkle', phosphor: 'Sparkle' },\n 'sparkles': { lucide: 'Sparkles', phosphor: 'Sparkle' },\n 'lightbulb': { lucide: 'Lightbulb', phosphor: 'Lightbulb' },\n 'brain': { lucide: 'Brain', phosphor: 'Brain' },\n 'zap': { lucide: 'Zap', phosphor: 'Lightning' },\n\n // Device & Platform\n 'globe': { lucide: 'Globe', phosphor: 'Globe', iconsax: 'Global' },\n 'deviceMobile': { lucide: 'Smartphone', phosphor: 'DeviceMobile' },\n 'smartphone': { lucide: 'Smartphone', phosphor: 'DeviceMobile' },\n 'floppyDisk': { lucide: 'Save', phosphor: 'FloppyDisk' },\n\n // Data & Analytics\n 'chart': { lucide: 'BarChart3', phosphor: 'ChartBar' },\n 'barChart': { lucide: 'BarChart', phosphor: 'ChartBar' },\n 'trendingUp': { lucide: 'TrendingUp', phosphor: 'TrendUp' },\n 'trendingDown': { lucide: 'TrendingDown', phosphor: 'TrendDown' },\n 'activity': { lucide: 'Activity', phosphor: 'Pulse' },\n 'database': { lucide: 'Database', phosphor: 'Database' },\n 'dollarSign': { lucide: 'DollarSign', phosphor: 'CurrencyDollar' },\n 'dollar': { lucide: 'DollarSign', phosphor: 'CurrencyDollar' },\n 'currency': { lucide: 'DollarSign', phosphor: 'CurrencyDollar' },\n\n 'layers': { lucide: 'Layers', phosphor: 'Stack' },\n 'ban': { lucide: 'Ban', phosphor: 'Prohibit' },\n\n // Security\n 'lock': { lucide: 'Lock', phosphor: 'Lock', iconsax: 'Lock' },\n 'unlock': { lucide: 'Unlock', phosphor: 'LockOpen', iconsax: 'Unlock' },\n 'shield': { lucide: 'Shield', phosphor: 'Shield', iconsax: 'Shield' },\n 'key': { lucide: 'Key', phosphor: 'Key' },\n\n // Media\n 'play': { lucide: 'Play', phosphor: 'Play', iconsax: 'Play' },\n 'pause': { lucide: 'Pause', phosphor: 'Pause', iconsax: 'Pause' },\n 'image': { lucide: 'Image', phosphor: 'Image', iconsax: 'Image' },\n 'video': { lucide: 'Video', phosphor: 'Video', iconsax: 'Video' },\n 'camera': { lucide: 'Camera', phosphor: 'Camera', iconsax: 'Camera' },\n\n // Files\n 'fileText': { lucide: 'FileText', phosphor: 'FileText' },\n 'file': { lucide: 'File', phosphor: 'File' },\n\n // Navigation\n 'externalLink': { lucide: 'ExternalLink', phosphor: 'ArrowSquareOut' },\n 'link': { lucide: 'Link', phosphor: 'Link', iconsax: 'Link' },\n 'moreHorizontal': { lucide: 'MoreHorizontal', phosphor: 'DotsThreeOutline' },\n 'moreVertical': { lucide: 'MoreVertical', phosphor: 'DotsThreeVertical' },\n\n // Priority\n 'remove': { lucide: 'Minus', phosphor: 'Minus', iconsax: 'Minus' },\n\n // Eye (password)\n 'eye': { lucide: 'Eye', phosphor: 'Eye', iconsax: 'Eye' },\n 'eyeOff': { lucide: 'EyeOff', phosphor: 'EyeSlash', iconsax: 'EyeSlash' },\n\n // Emotions\n 'smile': { lucide: 'Smile', phosphor: 'Smiley', iconsax: 'EmojiHappy' },\n 'frown': { lucide: 'Frown', phosphor: 'SmileySad', iconsax: 'EmojiSad' },\n 'meh': { lucide: 'Meh', phosphor: 'SmileyMeh', iconsax: 'EmojiNormal' },\n\n // Social\n 'mail': { lucide: 'Mail', phosphor: 'Envelope' },\n 'phone': { lucide: 'Phone', phosphor: 'Phone' },\n\n // Additional\n 'flag': { lucide: 'Flag', phosphor: 'Flag', iconsax: 'Flag' },\n 'rocket': { lucide: 'Rocket', phosphor: 'Rocket', iconsax: 'Rocket' },\n\n // Connectivity & Misc\n 'ticket': { lucide: 'Ticket', phosphor: 'Ticket', iconsax: 'Ticket' },\n 'clipboard': { lucide: 'ClipboardList', phosphor: 'Clipboard', iconsax: 'Sticker' },\n 'wifi': { lucide: 'Wifi', phosphor: 'WifiHigh', iconsax: 'Wifi' },\n 'wifiOff': { lucide: 'WifiOff', phosphor: 'WifiSlash' },\n 'cpu': { lucide: 'Cpu', phosphor: 'Cpu', iconsax: 'Computing' },\n 'mask': { lucide: 'Drama', phosphor: 'MaskHappy', iconsax: 'EmojiHappy' },\n\n // Text Formatting (Markdown Toolbar)\n 'bold': { lucide: 'Bold', phosphor: 'TextB' },\n 'italic': { lucide: 'Italic', phosphor: 'TextItalic' },\n 'strikethrough': { lucide: 'Strikethrough', phosphor: 'TextStrikethrough' },\n 'heading': { lucide: 'Heading', phosphor: 'TextHOne' },\n 'code': { lucide: 'Code', phosphor: 'Code', iconsax: 'Code' },\n 'fileCode': { lucide: 'FileCode', phosphor: 'FileCode' },\n 'quote': { lucide: 'Quote', phosphor: 'Quotes', iconsax: 'QuoteUp' },\n 'list': { lucide: 'List', phosphor: 'List' },\n 'listOrdered': { lucide: 'ListOrdered', phosphor: 'ListNumbers' },\n 'minus': { lucide: 'Minus', phosphor: 'Minus', iconsax: 'Minus' },\n} as const\n\n/**\n * Initialize Phosphor Icons (lazy load for fallback/dynamic lookup)\n * icons.ts의 개별 import와 별개로, PROJECT_ICONS fallback용\n */\nexport async function initPhosphorIcons() {\n if (typeof window === 'undefined') return null\n\n if (!PhosphorIcons) {\n try {\n const phosphorModule = await import('@phosphor-icons/react')\n PhosphorIcons = phosphorModule\n } catch {\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 * Initialize Lucide Icons (lazy load)\n */\nexport async function initLucideIcons() {\n if (typeof window === 'undefined') return null\n\n if (!LucideIcons) {\n try {\n const lucideModule = await import('lucide-react')\n LucideIcons = lucideModule\n } catch {\n console.warn('Lucide Icons not available. Install lucide-react to use lucide provider.')\n return null\n }\n }\n return LucideIcons\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 = 'phosphor'\n): 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 as Record<string, string | undefined>)[provider]\n\n switch (provider) {\n case 'phosphor':\n if (!mappedName || !PhosphorIcons) return null\n return PhosphorIcons?.[mappedName] || null\n\n case 'lucide':\n if (!mappedName || !LucideIcons) {\n return null\n }\n return LucideIcons?.[mappedName] || null\n\n case 'iconsax': {\n if (!iconsaxResolver) return null\n const iconsaxName = mappedName || toPascalCase(iconName)\n return iconsaxResolver(iconsaxName) || null\n }\n\n default:\n return null\n }\n}\n\n/**\n * Direct icon lookup (fallback for icons not in PROJECT_ICONS)\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\n): React.ComponentType<Record<string, unknown>> | null {\n switch (provider) {\n case 'phosphor': {\n if (!PhosphorIcons) return null\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\n case 'lucide': {\n if (!LucideIcons) {\n return null\n }\n const lucideName = iconName.charAt(0).toUpperCase() + iconName.slice(1)\n const camelCaseName = iconName.replace(/([A-Z])/g, (match) =>\n match === iconName[0] ? match.toLowerCase() : match\n )\n return LucideIcons?.[lucideName] ||\n LucideIcons?.[iconName] ||\n LucideIcons?.[camelCaseName] ||\n null\n }\n\n case 'iconsax': {\n if (!iconsaxResolver) return null\n const iconsaxName = toPascalCase(iconName)\n return iconsaxResolver(iconsaxName) || null\n }\n\n default:\n return null\n }\n}\n\n/**\n * Get icon name for 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\n): string {\n const iconMapping = PROJECT_ICONS[iconName as keyof typeof PROJECT_ICONS]\n if (iconMapping) {\n const mappedName = (iconMapping as Record<string, string | undefined>)[provider]\n if (mappedName) {\n return mappedName\n }\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 // kebab-case → camelCase mappings (자동 변환 지원)\n 'arrow-left': 'arrowLeft',\n 'arrow-right': 'arrowRight',\n 'arrow-up': 'arrowUp',\n 'arrow-down': 'arrowDown',\n 'chevron-left': 'chevronLeft',\n 'chevron-right': 'chevronRight',\n 'chevron-up': 'chevronUp',\n 'chevron-down': 'chevronDown',\n 'external-link': 'externalLink',\n 'more-horizontal': 'moreHorizontal',\n 'more-vertical': 'moreVertical',\n 'user-plus': 'userPlus',\n 'log-in': 'logIn',\n 'log-out': 'logOut',\n 'check-circle': 'checkCircle',\n 'check-square': 'checkSquare',\n 'alert-circle': 'alertCircle',\n 'eye-off': 'eyeOff',\n 'file-text': 'fileText',\n 'book-open': 'bookOpen',\n 'bar-chart': 'barChart',\n 'trending-up': 'trendingUp',\n 'trending-down': 'trendingDown',\n 'message-square': 'messageSquare',\n 'calendar-plus': 'calendarPlus',\n 'refresh-cw': 'refreshCw',\n 'dollar-sign': 'dollarSign',\n 'layout-dashboard': 'layoutDashboard',\n 'device-mobile': 'deviceMobile',\n 'floppy-disk': 'floppyDisk',\n\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 Name Normalization System\n *\n * 아이콘 이름 정규화를 위한 통합 시스템입니다.\n *\n * Features:\n * - kebab-case → camelCase conversion\n * - snake_case → camelCase conversion\n * - PascalCase → camelCase conversion\n * - Alias resolution\n * - Provider-specific name mapping\n */\n\nimport { ICON_ALIASES } from './icon-aliases'\nimport { toCamelCase, toPascalCase } from './case-utils'\n\n// Re-export case utils for backward compatibility\nexport { toCamelCase, toPascalCase } from './case-utils'\n\n// IconProvider type (avoid circular dependency with icon-providers.ts)\nexport type IconProviderType = 'lucide' | 'phosphor' | 'iconsax'\n\n/**\n * 정규화 결과 인터페이스\n */\nexport interface NormalizeResult {\n /** 정규화된 아이콘 이름 (camelCase) */\n normalized: string\n /** 원본 이름이 alias였는지 여부 */\n wasAlias: boolean\n /** 원본 alias 이름 (alias였던 경우) */\n originalAlias?: string\n}\n\n/**\n * 아이콘 이름을 정규화합니다.\n *\n * @example\n * normalizeIconName('arrow-left') // { normalized: 'arrowLeft', wasAlias: false }\n * normalizeIconName('back') // { normalized: 'arrowLeft', wasAlias: true, originalAlias: 'back' }\n * normalizeIconName('ArrowLeft') // { normalized: 'arrowLeft', wasAlias: false }\n */\nexport function normalizeIconName(iconName: string): NormalizeResult {\n if (!iconName || typeof iconName !== 'string') {\n return { normalized: iconName || '', wasAlias: false }\n }\n\n const camelCased = toCamelCase(iconName)\n const aliasTarget = ICON_ALIASES[iconName] || ICON_ALIASES[camelCased]\n\n if (aliasTarget) {\n return {\n normalized: aliasTarget,\n wasAlias: true,\n originalAlias: iconName\n }\n }\n\n return {\n normalized: camelCased,\n wasAlias: false\n }\n}\n\n/**\n * 프로바이더별 아이콘 이름을 반환합니다.\n *\n * @example\n * getProviderIconName('arrowLeft', 'lucide') // 'ArrowLeft'\n * getProviderIconName('heart', 'iconsax') // 'Heart'\n */\nexport function getProviderIconName(\n normalizedName: string,\n provider: IconProviderType\n): string {\n switch (provider) {\n case 'lucide':\n case 'phosphor':\n case 'iconsax':\n return toPascalCase(normalizedName)\n default:\n return normalizedName\n }\n}\n","/**\n * Icon Config Types\n *\n * Icon 시스템의 설정 타입 정의\n * 상태관리는 서비스 레벨에서 관리 (Zustand 등)\n */\n\nexport type IconSet = 'lucide' | 'phosphor' | 'iconsax'\n\nexport type PhosphorWeight = 'thin' | 'light' | 'regular' | 'bold' | 'duotone' | 'fill'\n\nexport type IconsaxVariant = 'line' | 'bold'\n\nexport interface IconConfig {\n set: IconSet\n weight: PhosphorWeight\n size: number\n color: string\n strokeWidth?: number // Lucide용\n iconsaxVariant?: IconsaxVariant // Iconsax용 (line | bold)\n}\n\nexport const defaultIconConfig: IconConfig = {\n set: 'lucide',\n weight: 'regular',\n size: 20,\n color: 'currentColor',\n strokeWidth: 1.25,\n iconsaxVariant: 'line',\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 'iconsax':\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 *\n * @example\n * ```tsx\n * <IconProvider set=\"phosphor\" weight=\"regular\" size={20}>\n * <App />\n * </IconProvider>\n * ```\n */\n\nimport React, { createContext, useContext } from 'react'\nimport { type IconConfig, type IconSet, type PhosphorWeight, type IconsaxVariant, defaultIconConfig } from './icon-store'\n\n/**\n * IconProvider 컴포넌트 Props\n */\nexport interface IconProviderProps {\n /** 아이콘 세트 (lucide, phosphor, iconsax) */\n set?: IconSet\n /** Phosphor 아이콘 weight */\n weight?: PhosphorWeight\n /** Iconsax 아이콘 변형 (line, bold) */\n iconsaxVariant?: IconsaxVariant\n /** 기본 아이콘 크기 */\n size?: number\n /** 기본 아이콘 색상 */\n color?: string\n /** Lucide/Iconsax 아이콘 stroke width */\n strokeWidth?: number\n /** 자식 컴포넌트 */\n children: React.ReactNode\n}\n\ninterface IconContextValue extends IconConfig {}\n\nconst IconContext = createContext<IconContextValue>(defaultIconConfig)\n\nexport function IconProvider({\n set = defaultIconConfig.set,\n weight = defaultIconConfig.weight,\n iconsaxVariant = defaultIconConfig.iconsaxVariant,\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 iconsaxVariant,\n size,\n color,\n strokeWidth,\n }\n\n return (\n <IconContext.Provider value={value}>\n {children}\n </IconContext.Provider>\n )\n}\n\nexport function useIconContext(): IconContextValue {\n return useContext(IconContext)\n}\n\n// Re-export types for convenience\nexport type { IconSet, PhosphorWeight, IconsaxVariant, IconConfig } from './icon-store'\nexport { defaultIconConfig, getDefaultStrokeWidth } from './icon-store'\n","import React from 'react'\nimport type { IconProps as PhosphorIconProps } from '@phosphor-icons/react'\nimport { merge, mergeMap } from '../../lib/utils'\nimport { icons, IconName, emotionIcons, statusIcons } from '../../lib/icons'\nimport { getIconFromProvider, getIconsaxResolver, initPhosphorIcons, initLucideIcons, getIconNameForProvider } from '../../lib/icon-providers'\nimport { normalizeIconName } from '../../lib/normalize-icon-name'\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 */\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 */\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' | 'inherit'\n /** Phosphor 아이콘 weight 오버라이드 / Phosphor icon weight override */\n weight?: PhosphorWeight\n /** 스크린 리더용 라벨 / Screen reader label */\n 'aria-label'?: string\n /** 장식용 아이콘 / Decorative icon (hidden from screen readers) */\n 'aria-hidden'?: boolean\n}\n\n/**\n * Icon 컴포넌트\n *\n * 다중 아이콘 라이브러리(Phosphor, Lucide, Iconsax)를 지원하는 통합 아이콘 컴포넌트.\n * IconProvider를 통해 전역 설정을 관리하며, 개별 아이콘에서도 오버라이드 가능.\n *\n * Iconsax는 별도 entry('@hua-labs/ui/iconsax')를 import해야 동작합니다.\n *\n * @example\n * ```tsx\n * <Icon name=\"heart\" />\n * <Icon name=\"user\" size={24} />\n * <Icon name=\"check\" variant=\"success\" />\n * <Icon name=\"loader\" spin />\n * ```\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 const config = useIconContext()\n\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 const iconsaxVariant = config.iconsaxVariant ?? 'line'\n\n const [isClient, setIsClient] = React.useState(false)\n const [providerReady, setProviderReady] = React.useState(false)\n\n React.useEffect(() => {\n setIsClient(true)\n\n // Provider별 lazy load 초기화\n if (iconSet === 'lucide') {\n initLucideIcons().then(() => setProviderReady(true))\n } else if (iconSet === 'phosphor') {\n initPhosphorIcons().then(() => setProviderReady(true))\n } else {\n setProviderReady(true)\n }\n }, [iconSet])\n\n // 통합 정규화\n const resolvedIcon = React.useMemo(() => {\n const baseName = emotion ? emotionIcons[emotion] :\n status ? statusIcons[status] : name\n const { normalized } = normalizeIconName(baseName)\n const providerName = getIconNameForProvider(normalized, iconSet)\n return { normalized, providerName }\n }, [name, emotion, status, iconSet])\n\n const iconName = resolvedIcon.normalized as AllIconName\n\n // Iconsax: resolver를 통해 가져오기 (iconsax entry import 시 자동 등록됨)\n const iconsaxIcon = React.useMemo(() => {\n if (iconSet === 'iconsax' && isClient) {\n const resolver = getIconsaxResolver()\n if (resolver) {\n return resolver(resolvedIcon.providerName, iconsaxVariant)\n }\n }\n return null\n }, [iconSet, resolvedIcon.providerName, isClient, iconsaxVariant])\n\n // 색상 변형 클래스\n const variantClasses = mergeMap({\n 'text-current': variant === 'default',\n 'text-primary': variant === 'primary',\n 'text-muted-foreground': variant === 'secondary' || variant === 'muted',\n 'text-green-600 dark:text-green-400': variant === 'success',\n 'text-yellow-600 dark:text-yellow-400': variant === 'warning',\n 'text-destructive': variant === 'error',\n })\n\n // 서버사이드에서는 빈 span 반환\n if (!isClient) {\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<PhosphorIconProps | React.SVGProps<SVGSVGElement> | Record<string, unknown>>\n let ResolvedIcon: IconComponentType | null = null\n\n if (iconSet === 'phosphor') {\n // 1. icons.ts에서 먼저 찾기 (Phosphor 아이콘이 기본, 정적 import)\n ResolvedIcon = (icons[iconName as IconName] || null) as IconComponentType | null\n // 2. 없으면 동적으로 Phosphor namespace에서 가져오기 (fallback, providerReady 필요)\n if (!ResolvedIcon && providerReady) {\n ResolvedIcon = getIconFromProvider(iconName, iconSet) as IconComponentType | null\n }\n } else if (iconSet === 'iconsax') {\n ResolvedIcon = iconsaxIcon as IconComponentType | null\n if (!ResolvedIcon) {\n ResolvedIcon = getIconFromProvider(iconName, iconSet) as IconComponentType | null\n }\n } else {\n // Lucide나 다른 provider\n ResolvedIcon = getIconFromProvider(iconName, iconSet) as IconComponentType | null\n }\n\n if (!ResolvedIcon) {\n // iconsax resolver 미등록 시 조용히 처리\n if (iconSet !== 'iconsax' || getIconsaxResolver()) {\n console.warn(`Icon \"${iconName}\" not found for provider \"${iconSet}\"`)\n }\n return (\n <span\n ref={ref}\n className={merge(\n 'inline-flex items-center justify-center rounded-full border-2 border-dashed border-border',\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-muted-foreground\" aria-hidden=\"true\">\n ?\n </span>\n </span>\n )\n }\n\n // 세트별 props 준비\n type IconPropsType = PhosphorIconProps & {\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 if (iconSet === 'phosphor') {\n iconProps.weight = iconWeight\n } else {\n iconProps.strokeWidth = iconStrokeWidth\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 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 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 {ResolvedIcon && React.createElement(ResolvedIcon, {\n ...iconProps,\n className: variantClasses,\n 'aria-hidden': true\n } as React.ComponentProps<typeof ResolvedIcon>)}\n </span>\n )\n})\n\nIconComponent.displayName = 'Icon'\n\nconst MemoizedIcon = React.memo(IconComponent, (prevProps, nextProps) => {\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\nexport const Icon = MemoizedIcon as typeof IconComponent\nIcon.displayName = 'Icon'\n\nexport const EmotionIcon = React.forwardRef<HTMLSpanElement, Omit<IconProps, 'name'> & { emotion: keyof typeof emotionIcons }>(\n (props, ref) => <Icon ref={ref} name=\"smile\" {...props} />\n)\nEmotionIcon.displayName = 'EmotionIcon'\n\nexport const StatusIcon = React.forwardRef<HTMLSpanElement, Omit<IconProps, 'name'> & { status: keyof typeof statusIcons }>(\n (props, ref) => <Icon ref={ref} name=\"info\" {...props} />\n)\nStatusIcon.displayName = 'StatusIcon'\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)\nLoadingIcon.displayName = 'LoadingIcon'\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)\nSuccessIcon.displayName = 'SuccessIcon'\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)\nErrorIcon.displayName = 'ErrorIcon'\n","\"use client\"\n\nimport React, { useState } from \"react\"\nimport { cva } from \"class-variance-authority\"\nimport { merge } from \"../lib/utils\"\n\nexport const avatarVariants = cva(\n \"relative flex shrink-0 overflow-hidden rounded-full\",\n {\n variants: {\n size: {\n sm: \"w-8 h-8 text-xs\",\n md: \"w-10 h-10 text-sm\",\n lg: \"w-12 h-12 text-base\",\n },\n variant: {\n default: \"\",\n glass: \"ring-1 ring-white/30 backdrop-blur-sm\",\n },\n },\n defaultVariants: {\n size: \"md\",\n variant: \"default\",\n },\n }\n)\n\n/**\n * Avatar 컴포넌트의 props / Avatar component props\n */\nexport interface AvatarProps extends React.HTMLAttributes<HTMLDivElement> {\n size?: \"sm\" | \"md\" | \"lg\"\n variant?: \"default\" | \"glass\"\n src?: string\n alt?: string\n fallbackText?: string\n}\n\nexport interface AvatarImageProps extends React.ImgHTMLAttributes<HTMLImageElement> {}\nexport interface AvatarFallbackProps extends React.HTMLAttributes<HTMLDivElement> {}\n\n/**\n * Avatar 컴포넌트 / Avatar component\n *\n * 사용자 프로필 이미지를 표시하는 컴포넌트입니다.\n *\n * @example\n * <Avatar src=\"/user.jpg\" alt=\"사용자\" />\n * <Avatar alt=\"홍길동\">홍</Avatar>\n * <Avatar variant=\"glass\" size=\"lg\" src=\"/user.jpg\" alt=\"사용자\" />\n */\nconst Avatar = React.forwardRef<HTMLDivElement, AvatarProps>(\n ({ className, size = \"md\", variant = \"default\", src, alt, fallbackText, children, ...props }, ref) => {\n const [imgError, setImgError] = useState(false)\n\n const getFallbackContent = () => {\n if (fallbackText) return fallbackText\n if (children) return children\n if (alt) return alt.charAt(0).toUpperCase()\n return \"U\"\n }\n\n const showImage = src && !imgError\n\n return (\n <div\n ref={ref}\n className={merge(avatarVariants({ size, variant }), className)}\n {...props}\n >\n {showImage ? (\n <AvatarImage\n src={src}\n alt={alt || \"avatar\"}\n onError={() => setImgError(true)}\n />\n ) : (\n <AvatarFallback>\n {getFallbackContent()}\n </AvatarFallback>\n )}\n </div>\n )\n }\n)\nAvatar.displayName = \"Avatar\"\n\nconst AvatarImage = React.forwardRef<HTMLImageElement, AvatarImageProps>(\n ({ className, ...props }, ref) => (\n <img\n ref={ref}\n className={merge(\"aspect-square h-full w-full object-cover object-center\", className)}\n {...props}\n />\n )\n)\nAvatarImage.displayName = \"AvatarImage\"\n\nconst AvatarFallback = React.forwardRef<HTMLDivElement, AvatarFallbackProps>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\n \"flex h-full w-full items-center justify-center rounded-full bg-primary text-primary-foreground font-semibold\",\n className\n )}\n {...props}\n />\n )\n)\nAvatarFallback.displayName = \"AvatarFallback\"\n\nexport { Avatar, AvatarImage, AvatarFallback } ","\"use client\"\n\nimport React from \"react\"\nimport { createPortal } from \"react-dom\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * Modal 컴포넌트의 props / Modal component props\n * @typedef {Object} ModalProps\n * @property {boolean} isOpen - 모달 열림/닫힘 상태 / Modal open/close state\n * @property {() => void} onClose - 모달 닫기 콜백 함수 / Modal close callback function\n * @property {React.ReactNode} children - 모달 내용 / Modal content\n * @property {\"sm\" | \"md\" | \"lg\" | \"xl\" | \"2xl\" | \"3xl\"} [size=\"md\"] - 모달 크기 / Modal size\n * @property {boolean} [closable=true] - 닫기 버튼 표시 여부 / Show close button\n * @property {boolean} [closeOnOverlayClick=true] - 오버레이 클릭 시 닫기 여부 / Close on overlay click\n * @property {string} [title] - 모달 제목 / Modal title\n * @property {string} [description] - 모달 설명 / Modal description\n * @property {boolean} [showBackdrop=true] - 배경 오버레이 표시 여부 / Show backdrop overlay\n * @property {string} [backdropClassName] - 배경 오버레이 추가 CSS 클래스 / Additional CSS class for backdrop\n * @property {boolean} [centered=true] - 모달을 화면 중앙에 배치할지 여부 / Center modal on screen\n * @property {string} [className] - 모달 컨테이너 추가 CSS 클래스 / Additional CSS class for modal container\n */\nexport interface ModalProps {\n /** 모달 열림/닫힘 상태 / Modal open/close state */\n isOpen: boolean\n /** 모달 닫기 콜백 함수 / Modal close callback function */\n onClose: () => void\n /** 모달 내용 / Modal content */\n children: React.ReactNode\n /** 모달 크기 / Modal size */\n size?: \"sm\" | \"md\" | \"lg\" | \"xl\" | \"2xl\" | \"3xl\"\n /** 닫기 버튼 표시 여부 / Show close button */\n closable?: boolean\n /** 오버레이 클릭 시 닫기 여부 / Close on overlay click */\n closeOnOverlayClick?: boolean\n /** 모달 제목 / Modal title */\n title?: string\n /** 모달 설명 / Modal description */\n description?: string\n /** 배경 오버레이 표시 여부 / Show backdrop overlay */\n showBackdrop?: boolean\n /** 배경 오버레이 추가 CSS 클래스 / Additional CSS class for backdrop */\n backdropClassName?: string\n /** 모달을 화면 중앙에 배치할지 여부 / Center modal on screen */\n centered?: boolean\n /** 모달 컨테이너 추가 CSS 클래스 / Additional CSS class for modal container */\n className?: string\n}\n\n// Ref 병합 유틸리티\nfunction useCombinedRefs<T>(...refs: (React.Ref<T> | undefined)[]): React.RefCallback<T> {\n return React.useCallback(\n (node: T) => {\n refs.forEach((ref) => {\n if (!ref) return;\n if (typeof ref === \"function\") {\n ref(node);\n } else {\n (ref as React.MutableRefObject<T | null>).current = node;\n }\n });\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n refs\n );\n}\n\n/**\n * Modal 컴포넌트 / Modal component\n * \n * 오버레이와 함께 표시되는 모달 다이얼로그 컴포넌트입니다.\n * ESC 키로 닫기, 오버레이 클릭으로 닫기, 접근성 속성(ARIA)을 지원합니다.\n * \n * Modal dialog component displayed with overlay.\n * Supports closing with ESC key, overlay click, and ARIA accessibility attributes.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * const [isOpen, setIsOpen] = useState(false)\n * \n * <Modal isOpen={isOpen} onClose={() => setIsOpen(false)}>\n * <p>모달 내용</p>\n * </Modal>\n * \n * @example\n * // 제목과 설명 포함 / With title and description\n * <Modal\n * isOpen={isOpen}\n * onClose={() => setIsOpen(false)}\n * title=\"확인\"\n * description=\"이 작업을 계속하시겠습니까?\"\n * >\n * <Button onClick={handleConfirm}>확인</Button>\n * </Modal>\n * \n * @example\n * // 큰 크기 모달 / Large size modal\n * <Modal\n * isOpen={isOpen}\n * onClose={() => setIsOpen(false)}\n * size=\"xl\"\n * closeOnOverlayClick={false}\n * >\n * <div>큰 모달 내용</div>\n * </Modal>\n * \n * @param {ModalProps} props - Modal 컴포넌트의 props / Modal component props\n * @param {React.Ref<HTMLDivElement>} ref - 모달 컨테이너 ref / Modal container ref\n * @returns {JSX.Element} Modal 컴포넌트 / Modal component\n */\nexport const Modal = React.forwardRef<HTMLDivElement, ModalProps>(\n ({\n className,\n isOpen,\n onClose,\n children,\n size = \"md\",\n closable,\n closeOnOverlayClick = true,\n title,\n description,\n showBackdrop = true,\n backdropClassName,\n centered = true\n }, ref) => {\n const _closable = closable ?? true\n const modalRef = React.useRef<HTMLDivElement>(null)\n const combinedRef = useCombinedRefs(ref, modalRef)\n\n // ESC 키로 모달 닫기 및 스크롤 잠금 (화면 흔들림 방지)\n React.useEffect(() => {\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n onClose()\n }\n }\n\n if (isOpen) {\n document.addEventListener(\"keydown\", handleEscape)\n // 스크롤바 너비 계산하여 padding 추가 (화면 흔들림 방지)\n const scrollbarWidth = window.innerWidth - document.documentElement.clientWidth\n document.body.style.overflow = \"hidden\"\n document.body.style.paddingRight = `${scrollbarWidth}px`\n }\n\n return () => {\n document.removeEventListener(\"keydown\", handleEscape)\n document.body.style.overflow = \"unset\"\n document.body.style.paddingRight = \"unset\"\n }\n }, [isOpen, onClose])\n\n // 모달 외부 클릭으로 닫기\n const handleOverlayClick = (e: React.MouseEvent) => {\n if (closeOnOverlayClick && e.target === e.currentTarget) {\n onClose()\n }\n }\n\n // 모달 크기 클래스 (max-w 기반, 콘텐츠에 맞게 자연스럽게 축소)\n const sizeClasses = {\n sm: \"max-w-xs\", // 320px\n md: \"max-w-sm\", // 384px\n lg: \"max-w-md\", // 448px\n xl: \"max-w-lg\", // 512px\n \"2xl\": \"max-w-xl\", // 576px\n \"3xl\": \"max-w-2xl\" // 672px\n }\n\n // 접근성을 위한 ID 생성\n const generatedTitleId = React.useId()\n const generatedDescId = React.useId()\n const titleId = title ? `modal-title-${generatedTitleId}` : undefined;\n const descriptionId = description ? `modal-description-${generatedDescId}` : undefined;\n\n // SSR에서는 document가 없으므로 체크\n const [mounted, setMounted] = React.useState(false)\n React.useEffect(() => {\n setMounted(true)\n }, [])\n\n if (!isOpen) return null\n\n const modalContent = (\n <div\n className={merge(\n \"fixed inset-0 z-50 overflow-y-auto\",\n className\n )}\n onClick={handleOverlayClick}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={titleId}\n aria-describedby={descriptionId}\n >\n {/* 배경 오버레이 - pointer-events-none으로 클릭이 뒤로 전달됨 */}\n {showBackdrop && (\n <div className={merge(\n \"fixed inset-0 bg-black/60 backdrop-blur-md transition-opacity duration-300 pointer-events-none\",\n backdropClassName\n )} />\n )}\n\n {/* 센터링 컨테이너 */}\n <div className={merge(\n \"flex h-full justify-center p-4\",\n centered ? \"items-center\" : \"items-start pt-16\"\n )}>\n {/* 모달 컨테이너 */}\n {/* CSS 변수 기반 배경색 (Tailwind v4 dark: + bg-* 충돌 우회) */}\n <div\n ref={combinedRef}\n className={merge(\n \"relative bg-[var(--modal-bg)] rounded-lg shadow-2xl border border-[var(--modal-border)] transform transition-all duration-300 ease-out\",\n sizeClasses[size]\n )}\n style={{\n animation: \"modalSlideIn 0.3s cubic-bezier(0.16, 1, 0.3, 1)\"\n }}\n >\n \n {/* 헤더 */}\n {title && (\n <div className=\"relative z-10 px-6 pt-6 pb-4 border-b border-border/50\">\n {/* 타이틀과 닫기 버튼 - 같은 줄, 양쪽 끝 */}\n <div className=\"flex items-center justify-between gap-4 mb-2\">\n <h2 id={titleId} className=\"text-xl font-semibold text-foreground flex-1 min-w-0\">{title}</h2>\n {/* 닫기 버튼 - 타이틀과 같은 계층의 오른쪽 끝 */}\n {_closable && (\n <button\n onClick={onClose}\n className=\"flex-shrink-0 p-2 text-muted-foreground hover:text-foreground transition-all duration-200 rounded-full hover:bg-muted focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-2 z-20\"\n aria-label=\"닫기\"\n >\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n )}\n </div>\n {/* 설명 - 아래 줄 */}\n {description && (\n <p id={descriptionId} className=\"text-sm text-muted-foreground\">{description}</p>\n )}\n </div>\n )}\n\n {/* 타이틀이 없을 때만 별도 닫기 버튼 */}\n {!title && _closable && (\n <button\n onClick={onClose}\n className=\"absolute top-4 right-4 p-2 text-muted-foreground hover:text-foreground transition-all duration-200 rounded-full hover:bg-muted focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-2 z-20\"\n aria-label=\"닫기\"\n >\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n )}\n \n {/* 모달 내용 */}\n <div className={`relative z-10 ${title ? 'px-6 mb-6' : 'p-6'}`}>\n {children}\n </div>\n </div>\n </div>\n </div>\n )\n\n // 브라우저에서만 createPortal 사용 (SSR 호환)\n if (mounted && typeof document !== 'undefined') {\n return createPortal(modalContent, document.body)\n }\n\n // SSR fallback - 그냥 렌더링 (첫 렌더링에는 보이지 않음)\n return null\n})\n\nModal.displayName = \"Modal\" ","\"use client\"\n\nimport React from \"react\"\nimport { cva } from \"class-variance-authority\"\nimport { merge } from \"../lib/utils\"\n\nexport const containerVariants = cva(\n \"w-full\",\n {\n variants: {\n size: {\n sm: \"max-w-2xl\",\n md: \"max-w-4xl\",\n lg: \"max-w-6xl\",\n xl: \"max-w-7xl\",\n full: \"max-w-full\",\n },\n padding: {\n none: \"\",\n sm: \"px-3 sm:px-4 py-6 sm:py-8\",\n md: \"px-4 sm:px-6 py-8 sm:py-12\",\n lg: \"px-4 sm:px-6 lg:px-8 py-10 sm:py-16\",\n xl: \"px-6 sm:px-8 lg:px-12 py-12 sm:py-20\",\n },\n },\n defaultVariants: {\n size: \"lg\",\n padding: \"md\",\n },\n }\n)\n\n/**\n * Container 컴포넌트의 props\n */\nexport interface ContainerProps extends React.HTMLAttributes<HTMLDivElement> {\n size?: \"sm\" | \"md\" | \"lg\" | \"xl\" | \"full\"\n padding?: \"none\" | \"sm\" | \"md\" | \"lg\" | \"xl\"\n centered?: boolean\n fluid?: boolean\n}\n\n/**\n * Container 컴포넌트\n *\n * 콘텐츠를 감싸는 컨테이너 컴포넌트입니다.\n * 반응형 최대 너비와 패딩을 제공하여 일관된 레이아웃을 구성합니다.\n *\n * @example\n * <Container><h1>제목</h1></Container>\n * <Container size=\"sm\" padding=\"none\"><div>콘텐츠</div></Container>\n * <Container fluid padding=\"xl\"><div>전체 너비</div></Container>\n */\nconst Container = React.forwardRef<HTMLDivElement, ContainerProps>(\n ({\n className,\n size = \"lg\",\n padding = \"md\",\n centered = true,\n fluid = false,\n ...props\n }, ref) => {\n return (\n <div\n ref={ref}\n className={merge(\n containerVariants({ size: fluid ? undefined : size, padding }),\n fluid && \"max-w-full\",\n centered && \"mx-auto\",\n className\n )}\n {...props}\n />\n )\n }\n)\nContainer.displayName = \"Container\"\n\nexport { Container } ","\"use client\"\n\nimport React from \"react\"\nimport { cva } from \"class-variance-authority\"\nimport { merge } from \"../lib/utils\"\n\nexport const gridVariants = cva(\n \"grid\",\n {\n variants: {\n gap: {\n none: \"gap-0\",\n sm: \"gap-4\",\n md: \"gap-6\",\n lg: \"gap-8\",\n xl: \"gap-12\",\n },\n },\n defaultVariants: {\n gap: \"md\",\n },\n }\n)\n\n// Responsive cols 맵 — CVA는 동적 값(1-12)에 부적합하므로 별도 맵\nconst RESPONSIVE_COLS: Record<number, string> = {\n 1: \"grid-cols-1\",\n 2: \"grid-cols-1 sm:grid-cols-2\",\n 3: \"grid-cols-1 sm:grid-cols-2 lg:grid-cols-3\",\n 4: \"grid-cols-1 sm:grid-cols-2 lg:grid-cols-4\",\n 5: \"grid-cols-1 sm:grid-cols-2 lg:grid-cols-5\",\n 6: \"grid-cols-1 sm:grid-cols-2 lg:grid-cols-6\",\n 7: \"grid-cols-1 sm:grid-cols-2 lg:grid-cols-7\",\n 8: \"grid-cols-1 sm:grid-cols-2 lg:grid-cols-8\",\n 9: \"grid-cols-1 sm:grid-cols-2 lg:grid-cols-9\",\n 10: \"grid-cols-1 sm:grid-cols-2 lg:grid-cols-10\",\n 11: \"grid-cols-1 sm:grid-cols-2 lg:grid-cols-11\",\n 12: \"grid-cols-1 sm:grid-cols-2 lg:grid-cols-12\",\n}\n\nconst GAP_X: Record<string, string> = { none: \"gap-x-0\", sm: \"gap-x-4\", md: \"gap-x-6\", lg: \"gap-x-8\", xl: \"gap-x-12\" }\nconst GAP_Y: Record<string, string> = { none: \"gap-y-0\", sm: \"gap-y-4\", md: \"gap-y-6\", lg: \"gap-y-8\", xl: \"gap-y-12\" }\n\n/**\n * Grid 컴포넌트의 props\n */\nexport interface GridProps extends React.HTMLAttributes<HTMLDivElement> {\n cols?: 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12\n gap?: \"none\" | \"sm\" | \"md\" | \"lg\" | \"xl\"\n gapX?: \"none\" | \"sm\" | \"md\" | \"lg\" | \"xl\"\n gapY?: \"none\" | \"sm\" | \"md\" | \"lg\" | \"xl\"\n responsive?: boolean\n}\n\n/**\n * Grid 컴포넌트\n *\n * CSS Grid를 사용한 그리드 레이아웃 컴포넌트입니다.\n *\n * @example\n * <Grid cols={3} gap=\"md\"><div>1</div><div>2</div><div>3</div></Grid>\n * <Grid cols={4} gapX=\"lg\" gapY=\"sm\">{items}</Grid>\n * <Grid cols={6} responsive={false} gap=\"lg\"><div>고정 6열</div></Grid>\n */\nconst Grid = React.forwardRef<HTMLDivElement, GridProps>(\n ({\n className,\n cols = 1,\n gap = \"md\",\n gapX,\n gapY,\n responsive = true,\n ...props\n }, ref) => {\n return (\n <div\n ref={ref}\n className={merge(\n gridVariants({ gap: gapX ? undefined : gap }),\n responsive ? RESPONSIVE_COLS[cols] : `grid-cols-${cols}`,\n gapX && GAP_X[gapX],\n gapY && GAP_Y[gapY],\n className\n )}\n {...props}\n />\n )\n }\n)\nGrid.displayName = \"Grid\"\n\nexport { Grid } ","\"use client\"\n\nimport React from \"react\"\nimport { cva } from \"class-variance-authority\"\nimport { merge } from \"../lib/utils\"\n\nexport const stackVariants = cva(\n \"\",\n {\n variants: {\n direction: {\n vertical: \"flex flex-col\",\n horizontal: \"flex flex-row\",\n },\n align: {\n start: \"items-start\",\n center: \"items-center\",\n end: \"items-end\",\n stretch: \"items-stretch\",\n },\n justify: {\n start: \"justify-start\",\n center: \"justify-center\",\n end: \"justify-end\",\n between: \"justify-between\",\n around: \"justify-around\",\n evenly: \"justify-evenly\",\n },\n },\n defaultVariants: {\n direction: \"vertical\",\n align: \"start\",\n justify: \"start\",\n },\n }\n)\n\n// Spacing은 direction 의존적이라 CVA compound variant보다 맵이 더 명확\nconst SPACING = {\n vertical: { none: \"\", sm: \"space-y-4\", md: \"space-y-6\", lg: \"space-y-8\", xl: \"space-y-12\" },\n horizontal: { none: \"\", sm: \"space-x-4\", md: \"space-x-6\", lg: \"space-x-8\", xl: \"space-x-12\" },\n} as const\n\n/**\n * Stack 컴포넌트의 props\n */\nexport interface StackProps extends React.HTMLAttributes<HTMLDivElement> {\n direction?: \"vertical\" | \"horizontal\"\n spacing?: \"none\" | \"sm\" | \"md\" | \"lg\" | \"xl\"\n align?: \"start\" | \"center\" | \"end\" | \"stretch\"\n justify?: \"start\" | \"center\" | \"end\" | \"between\" | \"around\" | \"evenly\"\n wrap?: boolean\n}\n\n/**\n * Stack 컴포넌트\n *\n * Flexbox를 사용한 스택 레이아웃 컴포넌트입니다.\n *\n * @example\n * <Stack spacing=\"md\"><div>1</div><div>2</div></Stack>\n * <Stack direction=\"horizontal\" spacing=\"lg\" align=\"center\" justify=\"between\">{...}</Stack>\n * <Stack direction=\"horizontal\" wrap spacing=\"sm\">{tags}</Stack>\n */\nconst Stack = React.forwardRef<HTMLDivElement, StackProps>(\n ({\n className,\n direction = \"vertical\",\n spacing = \"md\",\n align = \"start\",\n justify = \"start\",\n wrap = false,\n ...props\n }, ref) => {\n return (\n <div\n ref={ref}\n className={merge(\n stackVariants({ direction, align, justify }),\n SPACING[direction][spacing],\n wrap && \"flex-wrap\",\n className\n )}\n {...props}\n />\n )\n }\n)\nStack.displayName = \"Stack\"\n\nexport { Stack } ","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * Divider 컴포넌트의 props / Divider component props\n */\nexport interface DividerProps extends React.HTMLAttributes<HTMLDivElement> {\n orientation?: \"horizontal\" | \"vertical\"\n variant?: \"solid\" | \"dashed\" | \"dotted\" | \"gradient\" | \"glass\"\n size?: \"sm\" | \"md\" | \"lg\"\n spacing?: \"none\" | \"sm\" | \"md\" | \"lg\" | \"xl\"\n color?: \"default\" | \"muted\" | \"primary\" | \"secondary\"\n}\n\n// Divider는 orientation × variant × color 의 조합이 동적이라 CVA compound variants보다\n// 런타임 조합이 더 명확함. 색상만 시맨틱 토큰으로 교체.\n\nconst ORIENTATION = {\n horizontal: \"w-full\",\n vertical: \"h-full\",\n} as const\n\nconst SPACING = {\n horizontal: { none: \"\", sm: \"my-4\", md: \"my-6\", lg: \"my-8\", xl: \"my-12\" },\n vertical: { none: \"\", sm: \"mx-4\", md: \"mx-6\", lg: \"mx-8\", xl: \"mx-12\" },\n} as const\n\nfunction getSizeClass(orientation: \"horizontal\" | \"vertical\", variant: string, size: \"sm\" | \"md\" | \"lg\") {\n const useBorder = variant === \"dashed\" || variant === \"dotted\"\n if (useBorder) {\n const map = {\n horizontal: { sm: \"border-t\", md: \"border-t-2\", lg: \"border-t-4\" },\n vertical: { sm: \"border-l\", md: \"border-l-2\", lg: \"border-l-4\" },\n } as const\n return map[orientation][size]\n }\n const map = {\n horizontal: { sm: \"h-px\", md: \"h-0.5\", lg: \"h-1\" },\n vertical: { sm: \"w-px\", md: \"w-0.5\", lg: \"w-1\" },\n } as const\n return map[orientation][size]\n}\n\nfunction getVariantClass(orientation: \"horizontal\" | \"vertical\", variant: string) {\n switch (variant) {\n case \"dashed\": return \"border-dashed\"\n case \"dotted\": return \"border-dotted\"\n case \"gradient\":\n return orientation === \"horizontal\"\n ? \"bg-gradient-to-r from-transparent via-border to-transparent\"\n : \"bg-gradient-to-b from-transparent via-border to-transparent\"\n case \"glass\":\n return orientation === \"horizontal\"\n ? \"bg-gradient-to-r from-transparent via-white/30 to-transparent\"\n : \"bg-gradient-to-b from-transparent via-white/30 to-transparent\"\n default: return \"\"\n }\n}\n\nfunction getColorClass(variant: string, color: \"default\" | \"muted\" | \"primary\" | \"secondary\") {\n const useBorder = variant === \"dashed\" || variant === \"dotted\"\n if (useBorder) {\n return {\n default: \"border-border\",\n muted: \"border-muted\",\n primary: \"border-primary/30\",\n secondary: \"border-secondary\",\n }[color]\n }\n return {\n default: \"bg-border\",\n muted: \"bg-muted\",\n primary: \"bg-primary/30\",\n secondary: \"bg-secondary\",\n }[color]\n}\n\n/**\n * Divider 컴포넌트 / Divider component\n *\n * 콘텐츠를 구분하는 구분선 컴포넌트입니다.\n *\n * @example\n * <Divider />\n * <Divider orientation=\"vertical\" />\n * <Divider variant=\"dashed\" spacing=\"lg\" />\n * <Divider variant=\"gradient\" color=\"primary\" />\n */\nconst DividerComponent = React.forwardRef<HTMLDivElement, DividerProps>(\n ({\n className,\n orientation = \"horizontal\",\n variant = \"solid\",\n size = \"md\",\n spacing = \"md\",\n color = \"default\",\n ...props\n }, ref) => {\n return (\n <div\n ref={ref}\n className={merge(\n \"flex-shrink-0\",\n ORIENTATION[orientation],\n getSizeClass(orientation, variant, size),\n variant === \"gradient\" ? getVariantClass(orientation, variant) : getColorClass(variant, color),\n variant !== \"gradient\" && getVariantClass(orientation, variant),\n SPACING[orientation][spacing],\n className\n )}\n {...props}\n />\n )\n }\n)\n\nDividerComponent.displayName = \"Divider\"\n\nconst Divider = React.memo(DividerComponent)\n\nexport { Divider } ","\"use client\"\n\nimport React from \"react\"\nimport { cva } from \"class-variance-authority\"\nimport { merge } from \"../lib/utils\"\n\nexport const cardVariants = cva(\n \"rounded-lg\",\n {\n variants: {\n variant: {\n default: \"bg-card text-card-foreground border border-border\",\n outline: \"bg-transparent border-2 border-border\",\n elevated: \"bg-card text-card-foreground shadow-lg border border-border\",\n },\n shadow: {\n none: \"shadow-none\",\n sm: \"shadow-sm\",\n md: \"shadow-md\",\n lg: \"shadow-lg\",\n },\n padding: {\n none: \"\",\n sm: \"p-3\",\n md: \"p-4\",\n lg: \"p-6\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n padding: \"none\",\n },\n }\n)\n\n/**\n * Card 컴포넌트의 props / Card component props\n */\nexport interface CardProps extends React.HTMLAttributes<HTMLDivElement> {\n variant?: \"default\" | \"outline\" | \"elevated\"\n shadow?: \"none\" | \"sm\" | \"md\" | \"lg\"\n padding?: \"none\" | \"sm\" | \"md\" | \"lg\"\n hoverable?: boolean\n}\n\n/**\n * Card 컴포넌트 / Card component\n *\n * 콘텐츠를 카드 형태로 표시하는 컴포넌트입니다.\n *\n * @example\n * <Card>\n * <CardHeader><CardTitle>제목</CardTitle></CardHeader>\n * <CardContent><p>내용</p></CardContent>\n * </Card>\n */\nconst Card = React.forwardRef<HTMLDivElement, CardProps>(\n ({ className, variant = \"default\", shadow, padding = \"none\", hoverable, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={merge(\n cardVariants({ variant, shadow, padding }),\n hoverable && \"transition-shadow hover:shadow-lg cursor-pointer\",\n className\n )}\n {...props}\n />\n )\n }\n)\n\nCard.displayName = \"Card\"\n\nexport interface CardHeaderProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nconst CardHeader = React.forwardRef<HTMLDivElement, CardHeaderProps>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"flex flex-col space-y-1 p-3\", className)}\n {...props}\n />\n )\n)\n\nCardHeader.displayName = \"CardHeader\"\n\nexport interface CardTitleProps extends React.HTMLAttributes<HTMLHeadingElement> {}\n\nconst CardTitle = React.forwardRef<HTMLParagraphElement, CardTitleProps>(\n ({ className, ...props }, ref) => (\n <h3\n ref={ref}\n className={merge(\n \"text-base md:text-lg font-semibold leading-tight tracking-tight\",\n className\n )}\n {...props}\n />\n )\n)\n\nCardTitle.displayName = \"CardTitle\"\n\nexport interface CardDescriptionProps extends React.HTMLAttributes<HTMLParagraphElement> {}\n\nconst CardDescription = React.forwardRef<HTMLParagraphElement, CardDescriptionProps>(\n ({ className, ...props }, ref) => (\n <p\n ref={ref}\n className={merge(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n )\n)\n\nCardDescription.displayName = \"CardDescription\"\n\nexport interface CardContentProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nconst CardContent = React.forwardRef<HTMLDivElement, CardContentProps>(\n ({ className, ...props }, ref) => (\n <div ref={ref} className={merge(\"px-3 pb-3\", className)} {...props} />\n )\n)\n\nCardContent.displayName = \"CardContent\"\n\nexport interface CardFooterProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nconst CardFooter = React.forwardRef<HTMLDivElement, CardFooterProps>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"flex items-center px-3 pb-3\", className)}\n {...props}\n />\n )\n)\n\nCardFooter.displayName = \"CardFooter\"\n\nexport { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent }\n","\"use client\"\n\nimport React from \"react\"\nimport { cva } from \"class-variance-authority\"\nimport { merge } from \"../lib/utils\"\nimport { Card, CardProps } from \"./Card\"\n\nexport const panelStyleVariants = cva(\n \"transition-all duration-300\",\n {\n variants: {\n style: {\n default: \"bg-card text-card-foreground border border-border\",\n solid: \"bg-card text-card-foreground border border-border\",\n glass: \"bg-white/60 dark:bg-white/10 backdrop-blur-md border border-border/50 dark:border-white/20\",\n outline: \"bg-transparent border border-border\",\n elevated: \"bg-card text-card-foreground shadow-lg border border-border\",\n neon: \"bg-muted/50 dark:bg-background border border-cyan-300/30 dark:border-cyan-400/30 shadow-lg shadow-cyan-200/20 dark:shadow-cyan-400/20\",\n holographic: \"bg-gradient-to-br from-white/20 via-purple-500/20 to-cyan-500/20 backdrop-blur-sm border border-white/30\",\n cyberpunk: \"bg-card dark:bg-background border-2 border-pink-400 dark:border-pink-500 shadow-lg shadow-pink-300/30 dark:shadow-pink-500/30\",\n minimal: \"bg-card dark:bg-background border border-border shadow-sm\",\n luxury: \"bg-gradient-to-br from-amber-50 to-yellow-100 dark:from-amber-950 dark:to-yellow-950 border border-amber-200 dark:border-amber-800 shadow-xl\",\n },\n effect: {\n none: \"\",\n glow: \"shadow-2xl shadow-primary/20 dark:shadow-primary/20\",\n shadow: \"shadow-xl\",\n gradient: \"bg-gradient-to-r from-primary/10 via-purple-500/10 to-cyan-500/10\",\n animated: \"animate-pulse\",\n },\n padding: {\n none: \"p-0\",\n small: \"p-3\",\n sm: \"p-3\",\n medium: \"p-6\",\n md: \"p-6\",\n large: \"p-8\",\n lg: \"p-8\",\n xl: \"p-12\",\n custom: \"\",\n },\n rounded: {\n none: \"rounded-none\",\n sm: \"rounded-sm\",\n md: \"rounded-md\",\n lg: \"rounded-lg\",\n xl: \"rounded-xl\",\n full: \"rounded-full\",\n custom: \"\",\n },\n },\n defaultVariants: {\n style: \"default\",\n effect: \"none\",\n padding: \"md\",\n rounded: \"lg\",\n },\n }\n)\n\n/**\n * Panel 컴포넌트의 props / Panel component props\n */\nexport interface PanelProps extends Omit<CardProps, 'variant' | 'style' | 'padding'> {\n style?: \"default\" | \"solid\" | \"glass\" | \"outline\" | \"elevated\" | \"neon\" | \"holographic\" | \"cyberpunk\" | \"minimal\" | \"luxury\"\n effect?: \"none\" | \"glow\" | \"shadow\" | \"gradient\" | \"animated\"\n\n transparency?: number\n blurIntensity?: number\n borderOpacity?: number\n shadowOpacity?: number\n glowIntensity?: number\n glowColor?: string\n\n particleEffect?: boolean\n hoverEffect?: boolean\n animationEffect?: boolean\n\n padding?: \"none\" | \"small\" | \"sm\" | \"medium\" | \"md\" | \"large\" | \"lg\" | \"xl\" | \"custom\"\n customPadding?: string\n rounded?: \"none\" | \"sm\" | \"md\" | \"lg\" | \"xl\" | \"full\" | \"custom\"\n customRounded?: string\n\n background?: \"solid\" | \"gradient\" | \"pattern\" | \"image\" | \"video\"\n gradientColors?: string[]\n patternType?: \"dots\" | \"lines\" | \"grid\" | \"waves\" | \"custom\"\n backgroundImage?: string\n backgroundVideo?: string\n\n interactive?: boolean\n hoverScale?: number\n hoverRotate?: number\n hoverGlow?: boolean\n}\n\n/**\n * Panel 컴포넌트 / Panel component\n *\n * Card를 확장한 고급 스타일링 패널 컴포넌트입니다.\n *\n * @example\n * <Panel><div>내용</div></Panel>\n * <Panel style=\"glass\" effect=\"glow\"><div>Glass 패널</div></Panel>\n * <Panel style=\"neon\" interactive hoverGlow><div>호버 효과</div></Panel>\n */\nconst Panel = React.forwardRef<HTMLDivElement, PanelProps>(\n ({\n className,\n style = \"default\",\n effect = \"none\",\n transparency = 1,\n blurIntensity = 0,\n borderOpacity = 1,\n shadowOpacity = 1,\n glowIntensity = 0,\n glowColor = \"blue\",\n particleEffect = false,\n hoverEffect: _hoverEffect = false,\n animationEffect = false,\n padding = \"md\",\n customPadding,\n rounded = \"lg\",\n customRounded,\n background = \"solid\",\n gradientColors = [\"#3B82F6\", \"#8B5CF6\"],\n patternType = \"dots\",\n backgroundImage,\n backgroundVideo,\n interactive = false,\n hoverScale = 1.05,\n hoverRotate = 0,\n hoverGlow = false,\n children,\n ...cardProps\n }, ref): React.ReactElement => {\n\n // 패턴 배경 생성\n const patternBackground = React.useMemo(() => {\n switch (patternType) {\n case \"dots\":\n return \"radial-gradient(circle, #000 1px, transparent 1px)\"\n case \"lines\":\n return \"linear-gradient(45deg, #000 1px, transparent 1px)\"\n case \"grid\":\n return \"linear-gradient(#000 1px, transparent 1px), linear-gradient(90deg, #000 1px, transparent 1px)\"\n case \"waves\":\n return \"repeating-linear-gradient(45deg, transparent, transparent 10px, rgba(0,0,0,0.1) 10px, rgba(0,0,0,0.1) 20px)\"\n default:\n return \"\"\n }\n }, [patternType])\n\n // 배경 스타일 생성\n const backgroundStyles = React.useMemo((): React.CSSProperties => {\n const styles: React.CSSProperties = {\n opacity: transparency,\n }\n\n if (blurIntensity > 0) {\n styles.backdropFilter = `blur(${blurIntensity}px)`\n }\n\n if (borderOpacity < 1) {\n styles.borderColor = `rgba(0, 0, 0, ${borderOpacity})`\n }\n\n if (shadowOpacity < 1) {\n styles.boxShadow = `0 4px 6px -1px rgba(0, 0, 0, ${shadowOpacity * 0.1})`\n }\n\n if (glowIntensity > 0) {\n styles.boxShadow = `${styles.boxShadow || ''}, 0 0 ${glowIntensity * 10}px ${glowColor}`\n }\n\n switch (background) {\n case \"gradient\":\n styles.background = `linear-gradient(135deg, ${gradientColors.join(', ')})`\n break\n case \"pattern\":\n styles.backgroundImage = patternBackground\n break\n case \"image\":\n if (backgroundImage) {\n styles.backgroundImage = `url(${backgroundImage})`\n styles.backgroundSize = 'cover'\n styles.backgroundPosition = 'center'\n }\n break\n case \"video\":\n break\n }\n\n return styles\n }, [transparency, blurIntensity, borderOpacity, shadowOpacity, glowIntensity, glowColor, background, gradientColors, patternBackground, backgroundImage])\n\n // 호버 효과 클래스 생성\n const hoverClasses = React.useMemo(() => {\n if (!interactive) return \"\"\n\n const classes = []\n\n if (hoverScale !== 1) {\n classes.push(`hover:scale-${hoverScale}`)\n }\n\n if (hoverRotate !== 0) {\n classes.push(`hover:rotate-${hoverRotate}`)\n }\n\n if (hoverGlow) {\n classes.push(\"hover:shadow-2xl hover:shadow-cyan-500/30\")\n }\n\n return classes.join(\" \")\n }, [interactive, hoverScale, hoverRotate, hoverGlow])\n\n // Panel 전용 클래스들\n const panelClasses = React.useMemo(() => merge(\n \"panel-component\",\n `panel-${style}`,\n `panel-effect-${effect}`,\n panelStyleVariants({\n style,\n effect,\n padding: customPadding ? \"custom\" : padding,\n rounded: customRounded ? \"custom\" : rounded,\n }),\n customPadding,\n customRounded,\n hoverClasses,\n className\n ), [style, effect, padding, customPadding, rounded, customRounded, hoverClasses, className])\n \n return (\n <div className=\"relative\">\n {/* 비디오 배경 */}\n {background === \"video\" && backgroundVideo && (\n <video\n className=\"absolute inset-0 w-full h-full object-cover rounded-lg\"\n autoPlay\n muted\n loop\n playsInline\n >\n <source src={backgroundVideo} type=\"video/mp4\" />\n </video>\n )}\n \n {/* 파티클 효과 */}\n {particleEffect && (\n <div className=\"absolute inset-0 pointer-events-none\">\n {/* 파티클 효과 렌더링 */}\n </div>\n )}\n \n {/* 메인 Panel */}\n <Card\n ref={ref}\n className={panelClasses}\n style={backgroundStyles}\n {...cardProps}\n >\n {children}\n </Card>\n \n {/* 애니메이션 효과 */}\n {animationEffect && (\n <div className=\"absolute inset-0 pointer-events-none\">\n {/* 애니메이션 효과 렌더링 */}\n </div>\n )}\n </div>\n )\n }\n)\n\nPanel.displayName = \"Panel\"\n\nexport { Panel } ","\"use client\";\n\nimport React, { useCallback } from 'react';\nimport { Button } from './Button';\nimport { Icon } from './Icon';\nimport type { IconName } from '../lib/icons';\nimport { merge } from '../lib/utils';\n\n/**\n * ActionButton 인터페이스\n * @typedef {Object} ActionButton\n * @property {string} label - 버튼 라벨 (데스크톱)\n * @property {string} [labelMobile] - 버튼 라벨 (모바일, 없으면 label 사용)\n * @property {IconName} [icon] - 버튼 아이콘\n * @property {() => void} onClick - 클릭 핸들러\n * @property {boolean} [disabled] - 비활성화 여부\n * @property {'default' | 'outline' | 'destructive' | 'ghost'} [variant='outline'] - 버튼 스타일\n * @property {Object} [badge] - 배지 정보\n * @property {number} badge.count - 배지 숫자\n * @property {'blue' | 'red' | 'gray' | 'green'} [badge.color='gray'] - 배지 색상\n * @property {string} [className] - 추가 CSS 클래스\n */\nexport interface ActionButton {\n label: string;\n labelMobile?: string; // 모바일에서 표시할 짧은 텍스트\n icon?: IconName;\n onClick: () => void;\n disabled?: boolean;\n variant?: 'default' | 'outline' | 'destructive' | 'ghost';\n badge?: {\n count: number;\n color?: 'blue' | 'red' | 'gray' | 'green';\n };\n className?: string;\n}\n\n/**\n * ActionToolbar 컴포넌트의 props / ActionToolbar component props\n * @typedef {Object} ActionToolbarProps\n * @property {boolean} [isSelectMode=false] - 선택 모드 활성화 여부 / Enable select mode\n * @property {number} [totalCount=0] - 전체 항목 개수 / Total item count\n * @property {number} [selectedCount=0] - 선택된 항목 개수 / Selected item count\n * @property {ActionButton[]} [actions=[]] - 일반 모드 액션 버튼들 / Normal mode action buttons\n * @property {ActionButton[]} [selectModeActions=[]] - 선택 모드 액션 버튼들 / Select mode action buttons\n * @property {() => void} [onToggleSelectMode] - 선택 모드 토글 함수 / Toggle select mode function\n * @property {() => void} [onToggleSelectAll] - 전체 선택/해제 함수 / Toggle select all function\n * @property {() => void} [onCancelSelect] - 선택 모드 취소 함수 / Cancel select mode function\n * @property {boolean} [loading=false] - 로딩 상태 / Loading state\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface ActionToolbarProps extends React.HTMLAttributes<HTMLDivElement> {\n /** 선택 모드 활성화 여부 */\n isSelectMode?: boolean;\n /** 전체 항목 개수 */\n totalCount?: number;\n /** 선택된 항목 개수 */\n selectedCount?: number;\n /** 일반 모드 액션 버튼들 */\n actions?: ActionButton[];\n /** 선택 모드 액션 버튼들 */\n selectModeActions?: ActionButton[];\n /** 선택 모드 토글 함수 */\n onToggleSelectMode?: () => void;\n /** 전체 선택/해제 함수 */\n onToggleSelectAll?: () => void;\n /** 선택 모드 취소 함수 */\n onCancelSelect?: () => void;\n /** 로딩 상태 */\n loading?: boolean;\n}\n\n/**\n * ActionToolbar 컴포넌트 / ActionToolbar component\n * \n * 범용 액션 툴바 컴포넌트입니다.\n * 알림, 로그 관리, 대시보드 등에서 재사용 가능한 액션 버튼 영역을 제공합니다.\n * 선택 모드, 일괄 액션, 반응형 레이아웃을 지원합니다.\n * \n * Universal action toolbar component.\n * Provides reusable action button area for notifications, log management, dashboard, etc.\n * Supports select mode, batch actions, and responsive layout.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * ```tsx\n * <ActionToolbar\n * isSelectMode={isSelectMode}\n * totalCount={notifications.length}\n * selectedCount={selectedIds.size}\n * actions={[\n * {\n * label: \"모두 읽음\",\n * labelMobile: \"읽음\",\n * icon: \"check\",\n * onClick: handleMarkAllAsRead,\n * disabled: unreadCount === 0,\n * badge: { count: unreadCount, color: 'blue' }\n * }\n * ]}\n * selectModeActions={[\n * {\n * label: \"선택 삭제\",\n * labelMobile: \"삭제\",\n * icon: \"delete\",\n * onClick: handleDeleteSelected,\n * disabled: selectedIds.size === 0,\n * badge: { count: selectedIds.size, color: 'red' }\n * }\n * ]}\n * onToggleSelectMode={() => setIsSelectMode(true)}\n * onToggleSelectAll={handleToggleSelectAll}\n * onCancelSelect={() => {\n * setIsSelectMode(false);\n * setSelectedIds(new Set());\n * }}\n * />\n * ```\n * \n * @param {ActionToolbarProps} props - ActionToolbar 컴포넌트의 props / ActionToolbar component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} ActionToolbar 컴포넌트 / ActionToolbar component\n */\nconst ActionToolbarComponent = React.forwardRef<HTMLDivElement, ActionToolbarProps>(\n (\n {\n isSelectMode = false,\n totalCount = 0,\n selectedCount = 0,\n actions = [],\n selectModeActions = [],\n onToggleSelectMode,\n onToggleSelectAll,\n onCancelSelect,\n loading = false,\n className,\n ...props\n },\n ref\n ) => {\n const getBadgeColor = useCallback((color?: string) => {\n switch (color) {\n case 'red':\n return 'bg-red-100 dark:bg-red-900 text-red-700 dark:text-red-300';\n case 'blue':\n return 'bg-indigo-100 dark:bg-indigo-900 text-indigo-700 dark:text-indigo-300';\n case 'green':\n return 'bg-green-100 dark:bg-green-900 text-green-700 dark:text-green-300';\n case 'gray':\n default:\n return 'bg-muted text-muted-foreground';\n }\n }, []);\n\n const renderButton = useCallback((action: ActionButton, key: string) => (\n <Button\n key={key}\n variant={action.variant || 'outline'}\n size=\"sm\"\n onClick={action.onClick}\n disabled={action.disabled || loading}\n className={merge('flex-1 sm:flex-initial', action.className)}\n >\n {action.icon && <Icon name={action.icon} className=\"h-4 w-4 sm:h-3.5 sm:w-3.5 mr-1 sm:mr-1.5\" />}\n <span className=\"hidden sm:inline\">{action.label}</span>\n <span className=\"sm:hidden\">{action.labelMobile || action.label}</span>\n {action.badge && action.badge.count > 0 && (\n <span className={merge('ml-1.5', getBadgeColor(action.badge.color), 'px-1.5 py-0.5 rounded-full text-xs font-semibold')}>\n {action.badge.count}\n </span>\n )}\n </Button>\n ), [getBadgeColor, loading]);\n\n return (\n <div\n ref={ref}\n className={merge(\n 'mb-4 bg-background rounded-lg shadow-sm border border-border p-3 sm:p-4',\n className\n )}\n {...props}\n >\n {isSelectMode ? (\n <div className=\"flex flex-wrap items-center gap-2\">\n {/* 전체 선택/해제 버튼 */}\n {onToggleSelectAll && (\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={onToggleSelectAll}\n className=\"flex-1 sm:flex-initial min-w-[100px]\"\n >\n <Icon name={selectedCount === totalCount ? \"square\" : \"check\"} className=\"h-4 w-4 sm:h-3.5 sm:w-3.5 mr-1 sm:mr-1.5\" />\n <span className=\"hidden sm:inline\">{selectedCount === totalCount ? '전체 해제' : '전체 선택'}</span>\n <span className=\"sm:hidden\">{selectedCount === totalCount ? '해제' : '전체'}</span>\n </Button>\n )}\n \n {/* 선택 모드 액션 버튼들 */}\n {selectModeActions.map((action, index) => (\n <div key={`select-action-${index}`} className={merge('flex-1 sm:flex-initial min-w-[100px]', action.className)}>\n {renderButton(action, `select-${index}`)}\n </div>\n ))}\n \n {/* 취소 버튼 */}\n {onCancelSelect && (\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={onCancelSelect}\n className=\"flex-1 sm:flex-initial min-w-[80px]\"\n >\n 취소\n </Button>\n )}\n </div>\n ) : (\n <div className=\"flex flex-wrap items-center gap-2\">\n {/* 선택 모드 진입 버튼 */}\n {onToggleSelectMode && (\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={onToggleSelectMode}\n disabled={totalCount === 0}\n className=\"flex-1 sm:flex-initial min-w-[80px] sm:min-w-[auto] px-2 sm:px-3\"\n title={totalCount === 0 ? \"항목이 없습니다\" : \"여러 항목 선택\"}\n >\n <Icon name=\"check\" className=\"h-4 w-4 sm:h-3.5 sm:w-3.5\" />\n <span className=\"hidden sm:inline ml-1.5 sm:ml-2\">선택</span>\n </Button>\n )}\n \n {/* 일반 모드 액션 버튼들 */}\n {actions.map((action, index) => (\n <div key={`action-${index}`} className={merge('flex-1 sm:flex-initial min-w-[100px]', action.className)}>\n {renderButton(action, `action-${index}`)}\n </div>\n ))}\n </div>\n )}\n </div>\n );\n }\n);\n\nActionToolbarComponent.displayName = 'ActionToolbar';\n\nexport const ActionToolbar = React.memo(ActionToolbarComponent);\n\n","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\nimport { Icon } from \"./Icon\"\nimport type { IconName } from \"../lib/icons\"\n\n/**\n * Breadcrumb 항목 타입 / Breadcrumb item type\n */\nexport interface BreadcrumbItemData {\n label: string\n href?: string\n icon?: IconName\n}\n\n/**\n * Breadcrumb 컴포넌트의 props / Breadcrumb component props\n * @typedef {Object} BreadcrumbProps\n * @property {React.ReactNode} [children] - BreadcrumbItem 컴포넌트들 / BreadcrumbItem components\n * @property {BreadcrumbItemData[]} [items] - Breadcrumb 항목 배열 (children 대신 사용 가능) / Breadcrumb items array (alternative to children)\n * @property {number} [maxItems] - 최대 표시할 항목 수 (긴 경로 처리) / Maximum number of items to display (for long paths)\n * @property {boolean} [showHomeIcon] - 홈 아이콘 표시 여부 / Show home icon\n * @property {string} [homeLabel] - 홈 라벨 (기본: \"Home\") / Home label (default: \"Home\")\n * @property {React.ReactNode} [separator] - 항목 사이 구분자 (기본: chevronRight 아이콘) / Separator between items (default: chevronRight icon)\n * @property {'default' | 'subtle' | 'transparent' | 'glass'} [variant='default'] - Breadcrumb 스타일 변형 / Breadcrumb style variant\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface BreadcrumbProps extends React.HTMLAttributes<HTMLDivElement> {\n children?: React.ReactNode\n items?: BreadcrumbItemData[]\n maxItems?: number\n showHomeIcon?: boolean\n homeLabel?: string\n separator?: React.ReactNode\n variant?: 'default' | 'subtle' | 'transparent' | 'glass'\n}\n\n/**\n * BreadcrumbItem 컴포넌트의 props / BreadcrumbItem component props\n * @typedef {Object} BreadcrumbItemProps\n * @property {string} [href] - 링크 URL (없으면 일반 텍스트) / Link URL (plain text if not provided)\n * @property {boolean} [isCurrent=false] - 현재 페이지 여부 / Current page indicator\n * @property {React.ReactNode} children - 항목 텍스트 / Item text\n * @property {string} [className] - 추가 CSS 클래스 / Additional CSS class\n */\nexport interface BreadcrumbItemProps {\n href?: string\n isCurrent?: boolean\n children: React.ReactNode\n className?: string\n}\n\n/**\n * Breadcrumb 컴포넌트 / Breadcrumb component\n * \n * 네비게이션 경로를 표시하는 breadcrumb 컴포넌트입니다.\n * 현재 위치와 경로를 시각적으로 표현합니다.\n * \n * Breadcrumb component for displaying navigation paths.\n * Visually represents current location and path.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Breadcrumb>\n * <BreadcrumbItem href=\"/\">홈</BreadcrumbItem>\n * <BreadcrumbItem href=\"/products\">상품</BreadcrumbItem>\n * <BreadcrumbItem isCurrent>상세</BreadcrumbItem>\n * </Breadcrumb>\n * \n * @example\n * // 커스텀 구분자 / Custom separator\n * <Breadcrumb separator={<span>/</span>}>\n * <BreadcrumbItem href=\"/\">홈</BreadcrumbItem>\n * <BreadcrumbItem isCurrent>현재</BreadcrumbItem>\n * </Breadcrumb>\n * \n * @param {BreadcrumbProps} props - Breadcrumb 컴포넌트의 props / Breadcrumb component props\n * @param {React.Ref<HTMLDivElement>} ref - nav 요소 ref / nav element ref\n * @returns {JSX.Element} Breadcrumb 컴포넌트 / Breadcrumb component\n */\nconst Breadcrumb = React.forwardRef<HTMLDivElement, BreadcrumbProps>(\n ({ \n className, \n children, \n items,\n maxItems,\n showHomeIcon,\n homeLabel = \"Home\",\n separator = <Icon name=\"chevronRight\" className=\"w-3 h-3 text-muted-foreground flex-shrink-0\" />, \n variant = 'default', \n ...props \n }, ref) => {\n const variantStyles = {\n default: \"inline-flex items-center text-sm w-fit\",\n subtle: \"inline-flex items-center text-xs bg-background/40 backdrop-blur-md rounded-md px-3 py-2 border border-border/30 w-fit shadow-sm\",\n transparent: \"inline-flex items-center text-xs w-fit\",\n glass: \"inline-flex items-center text-xs bg-background/30 backdrop-blur-lg rounded-lg px-4 py-2 border border-border/25 w-fit shadow-lg\"\n }\n \n // items prop이 있으면 BreadcrumbItem으로 변환\n const renderItems = () => {\n if (items) {\n let displayItems = [...items]\n \n // maxItems 처리\n if (maxItems && displayItems.length > maxItems) {\n const firstItem = displayItems[0]\n const lastItems = displayItems.slice(-(maxItems - 1))\n displayItems = [firstItem, { label: '...', href: undefined }, ...lastItems]\n }\n \n // 마지막 항목은 isCurrent로 표시\n return displayItems.map((item, index) => {\n const isLast = index === displayItems.length - 1\n const isCurrent = isLast && !item.href\n \n return (\n <BreadcrumbItem\n key={index}\n href={item.href}\n isCurrent={isCurrent}\n >\n {item.icon && (\n <Icon name={item.icon} className=\"w-4 h-4 mr-1\" />\n )}\n {item.label}\n </BreadcrumbItem>\n )\n })\n }\n \n // children이 있으면 그대로 사용\n if (children) {\n return React.Children.map(children, (child, index) => {\n if (React.isValidElement(child)) {\n return (\n <li key={index} className=\"flex items-center\">\n {child}\n {index < React.Children.count(children) - 1 && (\n <span className=\"mx-3 text-muted-foreground flex items-center justify-center\" aria-hidden=\"true\">\n {separator}\n </span>\n )}\n </li>\n )\n }\n return child\n })\n }\n \n return null\n }\n \n const renderedItems = renderItems()\n const itemsCount = items ? items.length : (children ? React.Children.count(children) : 0)\n \n return (\n <nav\n ref={ref}\n aria-label=\"Breadcrumb\"\n className={merge(variantStyles[variant], className)}\n {...props}\n >\n <ol className=\"inline-flex items-center\">\n {showHomeIcon && (\n <li className=\"flex items-center\">\n <BreadcrumbItem href=\"/\">\n <Icon name=\"home\" className=\"w-4 h-4 mr-1\" />\n {homeLabel}\n </BreadcrumbItem>\n {itemsCount > 0 && (\n <span className=\"mx-3 text-muted-foreground flex items-center justify-center\" aria-hidden=\"true\">\n {separator}\n </span>\n )}\n </li>\n )}\n {items ? (\n renderedItems?.map((item, index) => (\n <li key={index} className=\"flex items-center\">\n {item}\n {index < (renderedItems?.length || 0) - 1 && (\n <span className=\"mx-3 text-muted-foreground flex items-center justify-center\" aria-hidden=\"true\">\n {separator}\n </span>\n )}\n </li>\n ))\n ) : (\n renderedItems\n )}\n </ol>\n </nav>\n )\n }\n)\nBreadcrumb.displayName = \"Breadcrumb\"\n\n/**\n * BreadcrumbItem 컴포넌트\n * Breadcrumb의 개별 항목을 표시합니다.\n * \n * @component\n * @param {BreadcrumbItemProps} props - BreadcrumbItem 컴포넌트의 props\n * @param {React.Ref<HTMLLIElement>} ref - li 요소 ref\n * @returns {JSX.Element} BreadcrumbItem 컴포넌트\n */\nconst BreadcrumbItem = React.forwardRef<HTMLLIElement, BreadcrumbItemProps>(\n ({ className, href, isCurrent = false, children, ...props }, ref) => {\n if (isCurrent) {\n return (\n <span\n ref={ref}\n aria-current=\"page\"\n className={merge(\n \"text-muted-foreground font-medium\",\n className\n )}\n {...props}\n >\n {children}\n </span>\n )\n }\n\n if (href) {\n return (\n <a\n href={href}\n className={merge(\n \"text-muted-foreground hover:text-foreground transition-colors\",\n className\n )}\n {...props}\n >\n {children}\n </a>\n )\n }\n\n return (\n <span\n ref={ref}\n className={merge(\n \"text-muted-foreground\",\n className\n )}\n {...props}\n >\n {children}\n </span>\n )\n }\n)\nBreadcrumbItem.displayName = \"BreadcrumbItem\"\n\nexport { Breadcrumb, BreadcrumbItem } ","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\nimport { Breadcrumb, BreadcrumbItem } from \"./Breadcrumb\"\n\n/**\n * ComponentLayout 컴포넌트의 props / ComponentLayout component props\n * @typedef {Object} ComponentLayoutProps\n * @property {string} title - 페이지 제목 / Page title\n * @property {string} description - 페이지 설명 / Page description\n * @property {React.ReactNode} children - 페이지 내용 / Page content\n * @property {Object} [prevPage] - 이전 페이지 정보 / Previous page information\n * @property {string} prevPage.title - 이전 페이지 제목 / Previous page title\n * @property {string} prevPage.href - 이전 페이지 링크 / Previous page link\n * @property {Object} [nextPage] - 다음 페이지 정보 / Next page information\n * @property {string} nextPage.title - 다음 페이지 제목 / Next page title\n * @property {string} nextPage.href - 다음 페이지 링크 / Next page link\n * @property {Array<Object>} [breadcrumbItems] - Breadcrumb 항목들 / Breadcrumb items\n * @property {string} breadcrumbItems[].label - Breadcrumb 라벨 / Breadcrumb label\n * @property {string} [breadcrumbItems[].href] - Breadcrumb 링크 / Breadcrumb link\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface ComponentLayoutProps extends React.HTMLAttributes<HTMLDivElement> {\n title: string\n description: string\n children: React.ReactNode\n prevPage?: {\n title: string\n href: string\n }\n nextPage?: {\n title: string\n href: string\n }\n breadcrumbItems?: Array<{\n label: string\n href?: string\n }>\n}\n\n/**\n * ComponentLayout 컴포넌트 / ComponentLayout component\n * \n * 컴포넌트 문서 페이지 레이아웃을 제공하는 컴포넌트입니다.\n * 제목, 설명, Breadcrumb, 이전/다음 페이지 네비게이션을 포함합니다.\n * \n * Component that provides layout for component documentation pages.\n * Includes title, description, Breadcrumb, and previous/next page navigation.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <ComponentLayout\n * title=\"Button 컴포넌트\"\n * description=\"버튼 컴포넌트 사용법\"\n * >\n * <Button>예제</Button>\n * </ComponentLayout>\n * \n * @example\n * // 이전/다음 페이지 네비게이션 포함 / With previous/next page navigation\n * <ComponentLayout\n * title=\"Input 컴포넌트\"\n * description=\"입력 컴포넌트 사용법\"\n * prevPage={{ title: \"Button\", href: \"/components/button\" }}\n * nextPage={{ title: \"Select\", href: \"/components/select\" }}\n * >\n * <Input placeholder=\"입력하세요\" />\n * </ComponentLayout>\n * \n * @param {ComponentLayoutProps} props - ComponentLayout 컴포넌트의 props / ComponentLayout component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} ComponentLayout 컴포넌트 / ComponentLayout component\n */\nconst ComponentLayout = React.forwardRef<HTMLDivElement, ComponentLayoutProps>(\n ({ \n className, \n title, \n description, \n children, \n prevPage, \n nextPage,\n breadcrumbItems = [\n { label: \"Components\", href: \"/components\" }\n ],\n ...props \n }, ref) => {\n return (\n <div className=\"relative min-h-screen\">\n {/* 고정된 페이지 네비게이션 - 위쪽 */}\n <div className=\"fixed right-4 top-4 z-50 hidden lg:block\">\n <div className=\"flex flex-col space-y-4\">\n {prevPage && (\n <a\n href={prevPage.href}\n className=\"group p-3 bg-white/80 backdrop-blur-sm border border-border rounded-full shadow-lg hover:shadow-2xl hover:bg-white/90 active:scale-95 transition-all duration-200\"\n title={`이전: ${prevPage.title}`}\n >\n <svg\n className=\"w-5 h-5 text-muted-foreground group-hover:text-indigo-600 group-active:text-indigo-800 transition-colors\" \n fill=\"none\" \n stroke=\"currentColor\" \n viewBox=\"0 0 24 24\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 15l7-7 7 7\" />\n </svg>\n </a>\n )}\n </div>\n </div>\n\n {/* 고정된 페이지 네비게이션 - 아래쪽 */}\n <div className=\"fixed right-4 bottom-4 z-50 hidden lg:block\">\n <div className=\"flex flex-col space-y-4\">\n {nextPage && (\n <a\n href={nextPage.href}\n className=\"group p-3 bg-white/80 backdrop-blur-sm border border-border rounded-full shadow-lg hover:shadow-2xl hover:bg-white/90 active:scale-95 transition-all duration-200\"\n title={`다음: ${nextPage.title}`}\n >\n <svg\n className=\"w-5 h-5 text-muted-foreground group-hover:text-indigo-600 group-active:text-indigo-800 transition-colors\" \n fill=\"none\" \n stroke=\"currentColor\" \n viewBox=\"0 0 24 24\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 9l-7 7-7-7\" />\n </svg>\n </a>\n )}\n </div>\n </div>\n\n {/* 메인 콘텐츠 */}\n <div\n ref={ref}\n className={merge(\"container mx-auto px-4 py-8\", className)}\n {...props}\n >\n <div className=\"max-w-4xl mx-auto\">\n {/* 브레드크럼 */}\n <Breadcrumb className=\"mb-6\">\n {breadcrumbItems.map((item, index) => (\n <BreadcrumbItem \n key={index}\n href={item.href}\n isCurrent={index === breadcrumbItems.length - 1}\n >\n {item.label}\n </BreadcrumbItem>\n ))}\n </Breadcrumb>\n\n {/* 페이지 헤더 */}\n <div className=\"mb-8\">\n <h1 className=\"text-4xl font-bold mb-4\">{title}</h1>\n <p className=\"text-lg text-muted-foreground\">\n {description}\n </p>\n </div>\n\n {/* 페이지 콘텐츠 */}\n <div className=\"space-y-8\">\n {children}\n </div>\n\n {/* 모바일 페이지 네비게이션 */}\n <div className=\"mt-12 lg:hidden\">\n <div className=\"flex items-center justify-between py-4 border-t border-border\">\n {prevPage && (\n <a\n href={prevPage.href}\n className=\"flex items-center text-sm text-muted-foreground hover:text-foreground transition-colors\"\n >\n <svg className=\"w-4 h-4 mr-2\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 19l-7-7 7-7\" />\n </svg>\n {prevPage.title}\n </a>\n )}\n {nextPage && (\n <a\n href={nextPage.href}\n className=\"flex items-center text-sm text-muted-foreground hover:text-foreground transition-colors\"\n >\n {nextPage.title}\n <svg className=\"w-4 h-4 ml-2\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 5l7 7-7 7\" />\n </svg>\n </a>\n )}\n </div>\n </div>\n </div>\n </div>\n </div>\n )\n }\n)\nComponentLayout.displayName = \"ComponentLayout\"\n\nexport { ComponentLayout } ","\"use client\"\n\nimport React from \"react\"\nimport { cva } from \"class-variance-authority\"\nimport { merge } from \"../lib/utils\"\n\nexport const badgeVariants = cva(\n \"inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors duration-200 ease-in-out focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-2\",\n {\n variants: {\n variant: {\n default: \"bg-[var(--badge-default-bg)] text-[var(--badge-default-text)] hover:opacity-80\",\n secondary: \"bg-[var(--badge-secondary-bg)] text-[var(--badge-secondary-text)] hover:opacity-80\",\n destructive: \"bg-[var(--badge-destructive-bg)] text-slate-50 hover:opacity-80\",\n error: \"bg-[var(--badge-destructive-bg)] text-slate-50 hover:opacity-80\",\n outline: \"bg-transparent text-[var(--badge-outline-text)] border border-[var(--badge-outline-border)] hover:bg-[var(--badge-outline-hover-bg)]\",\n glass: \"bg-[var(--badge-glass-bg)] backdrop-blur-sm border border-[var(--badge-glass-border)] text-[var(--badge-glass-text)] hover:opacity-80\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\n/**\n * Badge 컴포넌트의 props / Badge component props\n */\nexport interface BadgeProps extends React.HTMLAttributes<HTMLDivElement> {\n variant?: \"default\" | \"secondary\" | \"destructive\" | \"error\" | \"outline\" | \"glass\"\n}\n\n/**\n * Badge 컴포넌트 / Badge component\n *\n * 상태나 카테고리를 표시하는 작은 배지 컴포넌트입니다.\n *\n * @example\n * <Badge>New</Badge>\n * <Badge variant=\"destructive\">완료</Badge>\n * <Badge variant=\"outline\">대기</Badge>\n */\nconst Badge = React.memo(React.forwardRef<HTMLDivElement, BadgeProps>(\n ({ className, variant = \"default\", ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={merge(badgeVariants({ variant }), className)}\n {...props}\n />\n )\n }\n))\nBadge.displayName = \"Badge\"\n\nexport { Badge }\n","\"use client\"\n\nimport React from \"react\"\nimport { cva } from \"class-variance-authority\"\nimport { merge } from \"../lib/utils\"\n\nexport const progressBarVariants = cva(\n \"h-full rounded-full transition-all duration-300 ease-out\",\n {\n variants: {\n variant: {\n default: \"bg-foreground\",\n success: \"bg-[var(--progress-success)]\",\n warning: \"bg-[var(--progress-warning)]\",\n error: \"bg-[var(--progress-error)]\",\n info: \"bg-[var(--progress-info)]\",\n glass: \"bg-white/50 backdrop-blur-sm\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nexport const progressTrackVariants = cva(\n \"relative w-full overflow-hidden rounded-full\",\n {\n variants: {\n variant: {\n default: \"bg-[var(--progress-track)] dark:bg-[var(--progress-track)]\",\n success: \"bg-[var(--progress-track)] dark:bg-[var(--progress-track)]\",\n warning: \"bg-[var(--progress-track)] dark:bg-[var(--progress-track)]\",\n error: \"bg-[var(--progress-track)] dark:bg-[var(--progress-track)]\",\n info: \"bg-[var(--progress-track)] dark:bg-[var(--progress-track)]\",\n glass: \"bg-white/10 backdrop-blur-sm border border-white/20 dark:bg-slate-800/10 dark:border-slate-700/50\",\n },\n size: {\n sm: \"h-2\",\n md: \"h-3\",\n lg: \"h-4\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"md\",\n },\n }\n)\n\n/**\n * Progress 컴포넌트의 props\n */\nexport interface ProgressProps extends React.HTMLAttributes<HTMLDivElement> {\n value?: number\n max?: number\n size?: \"sm\" | \"md\" | \"lg\"\n variant?: \"default\" | \"success\" | \"warning\" | \"error\" | \"info\" | \"glass\"\n showValue?: boolean\n animated?: boolean\n striped?: boolean\n label?: string\n description?: string\n}\n\n/**\n * Progress 컴포넌트 / Progress component\n *\n * 진행률을 표시하는 프로그레스 바 컴포넌트입니다.\n *\n * @example\n * <Progress value={50} />\n * <Progress value={75} variant=\"success\" label=\"업로드\" showValue />\n * <Progress value={90} variant=\"warning\" striped animated />\n */\nconst Progress = React.forwardRef<HTMLDivElement, ProgressProps>(\n ({\n className,\n value = 0,\n max = 100,\n size = \"md\",\n variant = \"default\",\n showValue = false,\n animated = true,\n striped = false,\n label,\n description,\n ...props\n }, ref) => {\n const percentage = Math.min(Math.max((value / max) * 100, 0), 100)\n\n return (\n <div className={merge(\"w-full\", className)} {...props}>\n {(label || showValue) && (\n <div className=\"flex items-center justify-between mb-2\">\n {label && (\n <span className=\"text-sm font-medium text-foreground\">\n {label}\n </span>\n )}\n {showValue && (\n <span className=\"text-sm text-muted-foreground\">\n {Math.round(percentage)}%\n </span>\n )}\n </div>\n )}\n\n <div\n ref={ref}\n className={progressTrackVariants({ variant, size })}\n >\n <div\n className={merge(\n progressBarVariants({ variant }),\n striped && \"bg-gradient-to-r from-transparent via-white/20 to-transparent bg-[length:20px_100%] animate-pulse\",\n animated && \"animate-pulse\"\n )}\n style={{\n width: `${percentage}%`,\n transition: animated ? \"width 0.3s ease-out\" : \"none\"\n }}\n />\n </div>\n\n {description && (\n <p className=\"mt-2 text-xs text-muted-foreground\">\n {description}\n </p>\n )}\n </div>\n )\n }\n)\nProgress.displayName = \"Progress\"\n\n// 편의 컴포넌트들\nexport const ProgressSuccess = React.forwardRef<HTMLDivElement, Omit<ProgressProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Progress ref={ref} variant=\"success\" className={className} {...props} />\n )\n)\nProgressSuccess.displayName = \"ProgressSuccess\"\n\nexport const ProgressWarning = React.forwardRef<HTMLDivElement, Omit<ProgressProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Progress ref={ref} variant=\"warning\" className={className} {...props} />\n )\n)\nProgressWarning.displayName = \"ProgressWarning\"\n\nexport const ProgressError = React.forwardRef<HTMLDivElement, Omit<ProgressProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Progress ref={ref} variant=\"error\" className={className} {...props} />\n )\n)\nProgressError.displayName = \"ProgressError\"\n\nexport const ProgressInfo = React.forwardRef<HTMLDivElement, Omit<ProgressProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Progress ref={ref} variant=\"info\" className={className} {...props} />\n )\n)\nProgressInfo.displayName = \"ProgressInfo\"\n\n// 복합 Progress 컴포넌트들\nexport const ProgressWrapper = React.forwardRef<HTMLDivElement, ProgressProps & { title?: string }>(\n ({ title, className, ...props }, ref) => (\n <div className={merge(\"p-4 bg-card rounded-lg border border-border\", className)}>\n {title && (\n <h3 className=\"text-sm font-semibold text-foreground mb-3\">\n {title}\n </h3>\n )}\n <Progress ref={ref} {...props} />\n </div>\n )\n)\nProgressWrapper.displayName = \"ProgressWrapper\"\n\nexport const ProgressGroup = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, children, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"space-y-4\", className)}\n {...props}\n >\n {children}\n </div>\n )\n)\nProgressGroup.displayName = \"ProgressGroup\"\n\nexport { Progress }\n","\"use client\"\n\nimport React from \"react\"\nimport { cva } from \"class-variance-authority\"\nimport { merge } from \"../lib/utils\"\n\nexport const skeletonVariants = cva(\n \"block\",\n {\n variants: {\n variant: {\n text: \"rounded w-full h-4\",\n circular: \"rounded-full w-10 h-10\",\n rounded: \"rounded-lg w-full h-[200px]\",\n rectangular: \"rounded-none w-full h-[200px]\",\n },\n animation: {\n pulse: \"animate-pulse bg-muted\",\n wave: \"bg-muted\",\n shimmer: \"bg-muted\",\n },\n },\n defaultVariants: {\n variant: \"text\",\n animation: \"pulse\",\n },\n }\n)\n\n/**\n * Skeleton 컴포넌트의 props\n */\nexport interface SkeletonProps extends React.HTMLAttributes<HTMLDivElement> {\n variant?: \"text\" | \"circular\" | \"rectangular\" | \"rounded\"\n width?: string | number\n height?: string | number\n animation?: \"pulse\" | \"wave\" | \"shimmer\"\n className?: string\n}\n\n/**\n * Skeleton 컴포넌트 / Skeleton component\n *\n * 로딩 중 콘텐츠의 플레이스홀더를 표시하는 스켈레톤 컴포넌트입니다.\n *\n * @example\n * <Skeleton />\n * <Skeleton variant=\"circular\" width={40} height={40} />\n * <Skeleton variant=\"rounded\" width=\"100%\" height={200} animation=\"wave\" />\n */\nconst Skeleton = React.forwardRef<HTMLDivElement, SkeletonProps>(\n ({\n className,\n variant = \"text\",\n width,\n height,\n animation = \"pulse\",\n ...props\n }, ref) => {\n const getAnimationStyle = (): React.CSSProperties => {\n if (animation === \"wave\" || animation === \"shimmer\") {\n return {\n background: \"linear-gradient(90deg, hsl(var(--muted)) 0%, hsl(var(--muted-foreground) / 0.2) 50%, hsl(var(--muted)) 100%)\",\n backgroundSize: \"200% 100%\",\n animation: \"shimmer 1.5s ease-in-out infinite\",\n }\n }\n return {}\n }\n\n return (\n <>\n {(animation === \"wave\" || animation === \"shimmer\") && (\n <style>{`\n @keyframes shimmer {\n 0% { background-position: 200% 0; }\n 100% { background-position: -200% 0; }\n }\n `}</style>\n )}\n <div\n ref={ref}\n className={merge(\n skeletonVariants({ variant, animation }),\n className\n )}\n style={{\n ...(width != null ? { width: typeof width === \"number\" ? `${width}px` : width } : {}),\n ...(height != null ? { height: typeof height === \"number\" ? `${height}px` : height } : {}),\n ...getAnimationStyle(),\n }}\n {...props}\n />\n </>\n )\n }\n)\nSkeleton.displayName = \"Skeleton\"\n\n// 편의 컴포넌트들\nexport const SkeletonText = React.forwardRef<HTMLDivElement, Omit<SkeletonProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Skeleton ref={ref} variant=\"text\" className={className} {...props} />\n )\n)\nSkeletonText.displayName = \"SkeletonText\"\n\nexport const SkeletonCircle = React.forwardRef<HTMLDivElement, Omit<SkeletonProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Skeleton ref={ref} variant=\"circular\" className={className} {...props} />\n )\n)\nSkeletonCircle.displayName = \"SkeletonCircle\"\n\nexport const SkeletonRectangle = React.forwardRef<HTMLDivElement, Omit<SkeletonProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Skeleton ref={ref} variant=\"rectangular\" className={className} {...props} />\n )\n)\nSkeletonRectangle.displayName = \"SkeletonRectangle\"\n\nexport const SkeletonRounded = React.forwardRef<HTMLDivElement, Omit<SkeletonProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Skeleton ref={ref} variant=\"rounded\" className={className} {...props} />\n )\n)\nSkeletonRounded.displayName = \"SkeletonRounded\"\n\n// 복합 스켈레톤 컴포넌트들\nexport const SkeletonCard = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"space-y-4 p-6\", className)} // 16px 간격, 24px 패딩\n {...props}\n >\n <div className=\"flex items-center space-x-4\"> {/* 16px 간격 */}\n <SkeletonCircle className=\"w-12 h-12\" /> {/* 48px 크기 */}\n <div className=\"space-y-2 flex-1\"> {/* 8px 간격 */}\n <SkeletonText className=\"h-4 w-3/4\" /> {/* 16px 높이, 75% 너비 */}\n <SkeletonText className=\"h-3 w-1/2\" /> {/* 12px 높이, 50% 너비 */}\n </div>\n </div>\n <SkeletonRounded className=\"w-full h-32\" /> {/* 128px 높이 */}\n <div className=\"space-y-2\"> {/* 8px 간격 */}\n <SkeletonText className=\"h-4 w-full\" />\n <SkeletonText className=\"h-4 w-5/6\" />\n <SkeletonText className=\"h-4 w-4/6\" />\n </div>\n </div>\n )\n)\nSkeletonCard.displayName = \"SkeletonCard\"\n\nexport const SkeletonAvatar = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"flex items-center space-x-4\", className)} // 16px 간격\n {...props}\n >\n <SkeletonCircle className=\"w-12 h-12\" /> {/* 48px 크기 */}\n <div className=\"space-y-2 flex-1\"> {/* 8px 간격 */}\n <SkeletonText className=\"h-4 w-3/4\" />\n <SkeletonText className=\"h-3 w-1/2\" />\n </div>\n </div>\n )\n)\nSkeletonAvatar.displayName = \"SkeletonAvatar\"\n\nexport const SkeletonImage = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"space-y-2\", className)} // 8px 간격\n {...props}\n >\n <SkeletonRounded className=\"w-full h-48\" /> {/* 192px 높이 */}\n <SkeletonText className=\"h-4 w-1/2\" />\n </div>\n )\n)\nSkeletonImage.displayName = \"SkeletonImage\"\n\nexport const SkeletonUserProfile = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"space-y-4\", className)} // 16px 간격\n {...props}\n >\n <div className=\"flex items-center space-x-4\"> {/* 16px 간격 */}\n <SkeletonCircle className=\"w-16 h-16\" /> {/* 64px 크기 */}\n <div className=\"space-y-2 flex-1\"> {/* 8px 간격 */}\n <SkeletonText className=\"h-5 w-1/2\" />\n <SkeletonText className=\"h-3 w-1/3\" />\n </div>\n </div>\n <div className=\"space-y-2\"> {/* 8px 간격 */}\n <SkeletonText className=\"h-4 w-full\" />\n <SkeletonText className=\"h-4 w-5/6\" />\n </div>\n </div>\n )\n)\nSkeletonUserProfile.displayName = \"SkeletonUserProfile\"\n\nexport const SkeletonList = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"space-y-4\", className)} // 16px 간격\n {...props}\n >\n {Array.from({ length: 3 }).map((_, index) => (\n <div key={index} className=\"flex items-center space-x-4\"> {/* 16px 간격 */}\n <SkeletonCircle className=\"w-10 h-10\" /> {/* 40px 크기 */}\n <div className=\"space-y-2 flex-1\"> {/* 8px 간격 */}\n <SkeletonText className=\"h-4 w-3/4\" />\n <SkeletonText className=\"h-3 w-1/2\" />\n </div>\n </div>\n ))}\n </div>\n )\n)\nSkeletonList.displayName = \"SkeletonList\"\n\nexport const SkeletonTable = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"space-y-4\", className)} // 16px 간격\n {...props}\n >\n {/* 헤더 */}\n <div className=\"flex space-x-4\"> {/* 16px 간격 */}\n <SkeletonText className=\"h-4 w-1/4\" />\n <SkeletonText className=\"h-4 w-1/4\" />\n <SkeletonText className=\"h-4 w-1/4\" />\n <SkeletonText className=\"h-4 w-1/4\" />\n </div>\n {/* 행들 */}\n {Array.from({ length: 5 }).map((_, index) => (\n <div key={index} className=\"flex space-x-4\"> {/* 16px 간격 */}\n <SkeletonText className=\"h-4 w-1/4\" />\n <SkeletonText className=\"h-4 w-1/4\" />\n <SkeletonText className=\"h-4 w-1/4\" />\n <SkeletonText className=\"h-4 w-1/4\" />\n </div>\n ))}\n </div>\n )\n)\nSkeletonTable.displayName = \"SkeletonTable\"\n\nexport { Skeleton } ","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * Alert 컴포넌트의 props\n * @typedef {Object} AlertProps\n * @property {\"default\" | \"success\" | \"warning\" | \"error\" | \"info\"} [variant=\"default\"] - Alert 스타일 변형\n * @property {string} [title] - Alert 제목\n * @property {string} [description] - Alert 설명\n * @property {React.ReactNode} [icon] - 커스텀 아이콘\n * @property {React.ReactNode} [action] - 액션 버튼/요소\n * @property {boolean} [closable=false] - 닫기 버튼 표시 여부\n * @property {() => void} [onClose] - 닫기 버튼 클릭 시 호출되는 콜백\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface AlertProps extends React.HTMLAttributes<HTMLDivElement> {\n variant?: \"default\" | \"success\" | \"warning\" | \"error\" | \"info\"\n title?: string\n description?: string\n icon?: React.ReactNode\n action?: React.ReactNode\n closable?: boolean\n onClose?: () => void\n}\n\n/**\n * Alert 컴포넌트 / Alert component\n * \n * 사용자에게 중요한 정보나 경고를 표시하는 컴포넌트입니다.\n * 다양한 변형(variant)을 지원하며, 아이콘, 제목, 설명, 액션 버튼을 포함할 수 있습니다.\n * \n * Component for displaying important information or warnings to users.\n * Supports various variants and can include icons, titles, descriptions, and action buttons.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Alert variant=\"info\" title=\"정보\" description=\"이것은 정보 메시지입니다.\" />\n * \n * @example\n * // 닫기 버튼 포함 / With close button\n * <Alert \n * variant=\"warning\" \n * title=\"경고\" \n * closable \n * onClose={() => console.log('닫기')}\n * />\n * \n * @example\n * // 커스텀 아이콘과 액션 / Custom icon and action\n * <Alert \n * variant=\"success\"\n * icon={<Icon name=\"check\" />}\n * action={<Button size=\"sm\">확인</Button>}\n * >\n * 작업이 완료되었습니다.\n * </Alert>\n * \n * @param {AlertProps} props - Alert 컴포넌트의 props / Alert component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} Alert 컴포넌트 / Alert component\n */\nconst Alert = React.forwardRef<HTMLDivElement, AlertProps>(\n ({ \n className, \n variant = \"default\",\n title,\n description,\n icon,\n action,\n closable = false,\n onClose,\n children,\n ...props \n }, ref) => {\n const getVariantClasses = () => {\n switch (variant) {\n case \"success\":\n return \"bg-green-500/10 backdrop-blur-sm border-green-400/30 text-green-200 dark:bg-green-500/10 dark:border-green-400/30 dark:text-green-200\"\n case \"warning\":\n return \"bg-yellow-500/10 backdrop-blur-sm border-yellow-400/30 text-yellow-200 dark:bg-yellow-500/10 dark:border-yellow-400/30 dark:text-yellow-200\"\n case \"error\":\n return \"bg-red-500/10 backdrop-blur-sm border-red-400/30 text-red-200 dark:bg-red-500/10 dark:border-red-400/30 dark:text-red-200\"\n case \"info\":\n return \"bg-indigo-500/10 backdrop-blur-sm border-cyan-400/30 text-cyan-200 dark:bg-indigo-500/10 dark:border-cyan-400/30 dark:text-cyan-200\"\n default:\n return \"bg-white/10 backdrop-blur-sm border-white/30 text-white dark:bg-slate-800/20 dark:border-slate-700/50 dark:text-slate-200\"\n }\n }\n\n const getIconClasses = () => {\n switch (variant) {\n case \"success\":\n return \"text-green-500 dark:text-green-400\"\n case \"warning\":\n return \"text-yellow-500 dark:text-yellow-400\"\n case \"error\":\n return \"text-red-500 dark:text-red-400\"\n case \"info\":\n return \"text-cyan-500 dark:text-cyan-400\"\n default:\n return \"text-muted-foreground\"\n }\n }\n\n const getDefaultIcon = () => {\n switch (variant) {\n case \"success\":\n return (\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 13l4 4L19 7\" />\n </svg>\n )\n case \"warning\":\n return (\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.964-.833-2.732 0L3.732 16.5c-.77.833.192 2.5 1.732 2.5z\" />\n </svg>\n )\n case \"error\":\n return (\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n )\n case \"info\":\n return (\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n )\n default:\n return null\n }\n }\n\n return (\n <div\n ref={ref}\n className={merge(\n \"relative rounded-lg border p-4\", // 16px 패딩\n getVariantClasses(),\n className\n )}\n {...props}\n >\n <div className=\"flex items-start gap-3\"> {/* 12px 간격 */}\n {/* 아이콘 */}\n {(icon || getDefaultIcon()) && (\n <div className={merge(\"flex-shrink-0 mt-0.5\", getIconClasses())}>\n {icon || getDefaultIcon()}\n </div>\n )}\n\n {/* 내용 */}\n <div className=\"flex-1 min-w-0\">\n {title && (\n <h4 className=\"text-sm font-semibold mb-1\"> {/* 4px 여백 */}\n {title}\n </h4>\n )}\n {description && (\n <p className=\"text-sm leading-relaxed\">\n {description}\n </p>\n )}\n {children && (\n <div className=\"mt-2\"> {/* 8px 여백 */}\n {children}\n </div>\n )}\n </div>\n\n {/* 액션 */}\n {(action || closable) && (\n <div className=\"flex-shrink-0 flex items-center gap-2\"> {/* 8px 간격 */}\n {action}\n {closable && (\n <button\n onClick={onClose}\n className={merge(\n \"inline-flex rounded-md p-1.5 transition-colors duration-200 ease-in-out hover:bg-black/5 dark:hover:bg-white/5 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-offset-2\",\n getIconClasses()\n )}\n aria-label=\"닫기\"\n >\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n )}\n </div>\n )}\n </div>\n </div>\n )\n }\n)\nAlert.displayName = \"Alert\"\n\n// 편의 컴포넌트들\nexport const AlertSuccess = React.forwardRef<HTMLDivElement, Omit<AlertProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Alert ref={ref} variant=\"success\" className={className} {...props} />\n )\n)\nAlertSuccess.displayName = \"AlertSuccess\"\n\nexport const AlertWarning = React.forwardRef<HTMLDivElement, Omit<AlertProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Alert ref={ref} variant=\"warning\" className={className} {...props} />\n )\n)\nAlertWarning.displayName = \"AlertWarning\"\n\nexport const AlertError = React.forwardRef<HTMLDivElement, Omit<AlertProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Alert ref={ref} variant=\"error\" className={className} {...props} />\n )\n)\nAlertError.displayName = \"AlertError\"\n\nexport const AlertInfo = React.forwardRef<HTMLDivElement, Omit<AlertProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Alert ref={ref} variant=\"info\" className={className} {...props} />\n )\n)\nAlertInfo.displayName = \"AlertInfo\"\n\nexport { Alert } ","\"use client\"\n\nimport React from \"react\"\nimport { createContext, useContext, useState, useCallback } from \"react\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * Toast 메시지 타입 / Toast message type\n * @typedef {Object} Toast\n * @property {string} id - Toast 고유 ID / Toast unique ID\n * @property {\"success\" | \"error\" | \"warning\" | \"info\"} type - Toast 타입 / Toast type\n * @property {string} [title] - Toast 제목 / Toast title\n * @property {string} message - Toast 메시지 / Toast message\n * @property {number} [duration] - 표시 시간(ms), 0이면 자동 제거 안 함 / Display duration (ms), 0 means no auto-remove\n * @property {Object} [action] - 액션 버튼 / Action button\n * @property {string} action.label - 액션 버튼 레이블 / Action button label\n * @property {() => void} action.onClick - 액션 버튼 클릭 핸들러 / Action button click handler\n */\nexport interface Toast {\n id: string\n type: \"success\" | \"error\" | \"warning\" | \"info\"\n title?: string\n message: string\n duration?: number\n action?: {\n label: string\n onClick: () => void\n }\n}\n\n// Toast Context 타입\ninterface ToastContextType {\n toasts: Toast[]\n addToast: (toast: Omit<Toast, \"id\">) => void\n removeToast: (id: string) => void\n clearToasts: () => void\n}\n\n// Toast Context 생성\nconst ToastContext = createContext<ToastContextType | undefined>(undefined)\n\n/**\n * useToast Hook\n *\n * Toast를 추가, 제거, 초기화하는 훅입니다.\n * ToastProvider 내부에서만 사용 가능합니다.\n *\n * Hook for adding, removing, and clearing toasts.\n * Can only be used within ToastProvider.\n *\n * @example\n * const { addToast, removeToast, clearToasts } = useToast()\n *\n * addToast({\n * type: \"success\",\n * message: \"저장되었습니다\",\n * duration: 3000\n * })\n *\n * @returns {ToastContextType} Toast 컨텍스트 값 / Toast context value\n * @throws {Error} ToastProvider 외부에서 사용 시 에러 발생 / Error when used outside ToastProvider\n */\nexport function useToast(): ToastContextType {\n const context = useContext(ToastContext)\n if (!context) {\n throw new Error(\"useToast must be used within a ToastProvider\")\n }\n return context\n}\n\n// No-op functions for safe toast hook\nconst noopAddToast = () => {}\nconst noopRemoveToast = () => {}\nconst noopClearToasts = () => {}\n\n/**\n * useToastSafe Hook\n *\n * ToastProvider 없이도 안전하게 사용할 수 있는 useToast 훅입니다.\n * Provider가 없으면 no-op 함수를 반환합니다.\n *\n * Safe version of useToast that works without ToastProvider.\n * Returns no-op functions when used outside ToastProvider.\n *\n * @example\n * const { addToast } = useToastSafe()\n *\n * // 안전하게 호출 가능 - Provider 없으면 아무 일도 안 함\n * addToast({ type: \"success\", message: \"저장됨\" })\n *\n * @returns {ToastContextType} Toast 컨텍스트 값 또는 no-op 함수들\n */\nexport function useToastSafe(): ToastContextType {\n const context = useContext(ToastContext)\n if (!context) {\n return {\n toasts: [],\n addToast: noopAddToast,\n removeToast: noopRemoveToast,\n clearToasts: noopClearToasts,\n }\n }\n return context\n}\n\n/**\n * ToastProvider 컴포넌트의 props / ToastProvider component props\n * @typedef {Object} ToastProviderProps\n * @property {React.ReactNode} children - 자식 컴포넌트 / Child components\n * @property {number} [maxToasts=5] - 최대 Toast 개수 / Maximum number of toasts\n * @property {\"top-right\" | \"top-left\" | \"bottom-right\" | \"bottom-left\" | \"top-center\" | \"bottom-center\"} [position=\"top-right\"] - Toast 표시 위치 / Toast display position\n */\ninterface ToastProviderProps {\n children: React.ReactNode\n maxToasts?: number\n position?: \"top-right\" | \"top-left\" | \"bottom-right\" | \"bottom-left\" | \"top-center\" | \"bottom-center\"\n}\n\n/**\n * ToastProvider 컴포넌트 / ToastProvider component\n * \n * Toast 시스템의 컨텍스트를 제공하는 Provider 컴포넌트입니다.\n * 앱의 루트 레벨에서 사용하여 전역 Toast 기능을 활성화합니다.\n * \n * Provider component that provides context for the Toast system.\n * Use at the root level of your app to enable global Toast functionality.\n * \n * @component\n * @example\n * // App.tsx\n * <ToastProvider position=\"top-center\" maxToasts={3}>\n * <App />\n * </ToastProvider>\n * \n * @example\n * // 컴포넌트에서 사용 / Usage in component\n * const { addToast } = useToast()\n * \n * const handleSave = () => {\n * addToast({\n * type: \"success\",\n * message: \"저장되었습니다\",\n * title: \"성공\"\n * })\n * }\n * \n * @param {ToastProviderProps} props - ToastProvider 컴포넌트의 props / ToastProvider component props\n * @returns {JSX.Element} ToastProvider 컴포넌트 / ToastProvider component\n * \n * @todo 접근성 개선: ToastItem에 role=\"alert\" 또는 role=\"status\" 추가 필요 / Accessibility: Add role=\"alert\" or role=\"status\" to ToastItem\n * @todo 접근성 개선: aria-live=\"polite\" 또는 aria-live=\"assertive\" 추가 필요 / Accessibility: Add aria-live=\"polite\" or aria-live=\"assertive\"\n */\nexport function ToastProvider({\n children,\n maxToasts = 5,\n position = \"top-right\"\n}: ToastProviderProps) {\n const [toasts, setToasts] = useState<Toast[]>([])\n\n const removeToast = useCallback((id: string) => {\n setToasts(prev => prev.filter(toast => toast.id !== id))\n }, [])\n\n const addToast = useCallback((toast: Omit<Toast, \"id\">) => {\n const id = Math.random().toString(36).substr(2, 9)\n const newToast: Toast = { ...toast, id }\n\n setToasts(prev => {\n const updatedToasts = [...prev, newToast]\n return updatedToasts.slice(-maxToasts) // 최대 개수 제한\n })\n\n // 자동 제거\n if (toast.duration !== 0) {\n setTimeout(() => {\n removeToast(id)\n }, toast.duration || 5000)\n }\n }, [maxToasts, removeToast])\n\n const clearToasts = useCallback(() => {\n setToasts([])\n }, [])\n\n return (\n <ToastContext.Provider value={{ toasts, addToast, removeToast, clearToasts }}>\n {children}\n <ToastContainer toasts={toasts} removeToast={removeToast} position={position} />\n </ToastContext.Provider>\n )\n}\n\n// Toast Container Props\ninterface ToastContainerProps {\n toasts: Toast[]\n removeToast: (id: string) => void\n position: string\n}\n\n// Toast Container\nfunction ToastContainer({ toasts, removeToast, position }: ToastContainerProps) {\n const positionClasses = {\n \"top-right\": \"top-4 right-4\",\n \"top-left\": \"top-4 left-4\",\n \"bottom-right\": \"bottom-4 right-4\",\n \"bottom-left\": \"bottom-4 left-4\",\n \"top-center\": \"top-4 left-1/2 transform -translate-x-1/2\",\n \"bottom-center\": \"bottom-4 left-1/2 transform -translate-x-1/2\"\n }\n\n if (toasts.length === 0) return null\n\n return (\n <div className={merge(\n \"fixed z-50 space-y-3 max-w-sm\", // 12px 간격\n positionClasses[position as keyof typeof positionClasses]\n )}>\n {toasts.map((toast) => (\n <ToastItem key={toast.id} toast={toast} onRemove={removeToast} />\n ))}\n </div>\n )\n}\n\n// Toast Item Props\ninterface ToastItemProps {\n toast: Toast\n onRemove: (id: string) => void\n}\n\n// Toast Item\nfunction ToastItem({ toast, onRemove }: ToastItemProps) {\n const [isVisible, setIsVisible] = useState(false)\n\n React.useEffect(() => {\n setIsVisible(true)\n }, [])\n\n const handleRemove = () => {\n setIsVisible(false)\n setTimeout(() => onRemove(toast.id), 300)\n }\n\n // CSS 변수 기반 배경색 (Tailwind v4 dark: variant + bg-color 충돌 우회)\n // 앱에서 --toast-*-bg 변수 정의 필요\n const getToastStyles = (type: Toast[\"type\"]) => {\n switch (type) {\n case \"success\":\n return \"bg-[var(--toast-success-bg)] border-green-300 dark:border-green-700 text-green-800 dark:text-green-200 shadow-lg shadow-green-100/50 dark:shadow-none\"\n case \"error\":\n return \"bg-[var(--toast-error-bg)] border-red-300 dark:border-red-700 text-red-800 dark:text-red-200 shadow-lg shadow-red-100/50 dark:shadow-none\"\n case \"warning\":\n return \"bg-[var(--toast-warning-bg)] border-yellow-300 dark:border-yellow-700 text-yellow-800 dark:text-yellow-200 shadow-lg shadow-yellow-100/50 dark:shadow-none\"\n case \"info\":\n return \"bg-[var(--toast-info-bg)] border-indigo-300 dark:border-indigo-700 text-cyan-800 dark:text-cyan-200 shadow-lg shadow-indigo-100/50 dark:shadow-none\"\n }\n }\n\n const getIconStyles = (type: Toast[\"type\"]) => {\n switch (type) {\n case \"success\":\n return \"text-green-500 dark:text-green-400\"\n case \"error\":\n return \"text-red-500 dark:text-red-400\"\n case \"warning\":\n return \"text-yellow-500 dark:text-yellow-400\"\n case \"info\":\n return \"text-cyan-500 dark:text-cyan-400\"\n }\n }\n\n const getToastIcon = (type: Toast[\"type\"]) => {\n switch (type) {\n case \"success\":\n return (\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 13l4 4L19 7\" />\n </svg>\n )\n case \"error\":\n return (\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n )\n case \"warning\":\n return (\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.964-.833-2.732 0L3.732 16.5c-.77.833.192 2.5 1.732 2.5z\" />\n </svg>\n )\n case \"info\":\n return (\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n )\n }\n }\n\n return (\n <div\n className={merge(\n \"flex items-start p-4 rounded-xl border backdrop-blur-sm transition-all duration-300 transform\",\n getToastStyles(toast.type),\n isVisible\n ? \"translate-x-0 opacity-100 scale-100\"\n : \"translate-x-full opacity-0 scale-95\"\n )}\n style={{\n animation: isVisible ? \"slideInRight 0.3s cubic-bezier(0.16, 1, 0.3, 1)\" : undefined\n }}\n >\n {/* 아이콘 */}\n <div className={merge(\"flex-shrink-0 mr-3\", getIconStyles(toast.type))}> {/* 12px 여백 */}\n {getToastIcon(toast.type)}\n </div>\n\n {/* 내용 */}\n <div className=\"flex-1 min-w-0\">\n {toast.title && (\n <h4 className=\"text-sm font-semibold mb-1\"> {/* 4px 여백 */}\n {toast.title}\n </h4>\n )}\n <p className=\"text-sm leading-relaxed\">\n {toast.message}\n </p>\n\n {/* 액션 버튼 */}\n {toast.action && (\n <button\n onClick={toast.action.onClick}\n className=\"mt-3 text-sm font-medium underline hover:no-underline transition-all duration-200\" // 12px 여백\n >\n {toast.action.label}\n </button>\n )}\n </div>\n\n {/* 닫기 버튼 */}\n <div className=\"flex-shrink-0 ml-4\"> {/* 16px 여백 */}\n <button\n onClick={handleRemove}\n className={merge(\n \"inline-flex rounded-md p-1.5 transition-colors duration-200 ease-in-out hover:bg-black/5 dark:hover:bg-white/10 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-offset-2\",\n getIconStyles(toast.type)\n )}\n aria-label=\"닫기\"\n >\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </div>\n </div>\n )\n}\n\n// 편의 함수들 (ToastProvider 내부에서만 사용 가능 - 스텁 함수)\nexport const showToast = (_toast: Omit<Toast, \"id\">) => {\n // ToastProvider 컨텍스트 필요\n}\n\nexport const showSuccessToast = (_message: string, _title?: string, _duration?: number) => {\n // ToastProvider 컨텍스트 필요\n}\n\nexport const showErrorToast = (_message: string, _title?: string, _duration?: number) => {\n // ToastProvider 컨텍스트 필요\n}\n\nexport const showWarningToast = (_message: string, _title?: string, _duration?: number) => {\n // ToastProvider 컨텍스트 필요\n}\n\nexport const showInfoToast = (_message: string, _title?: string, _duration?: number) => {\n // ToastProvider 컨텍스트 필요\n} ","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * LoadingSpinner 컴포넌트의 props / LoadingSpinner component props\n * @typedef {Object} LoadingSpinnerProps\n * @property {\"sm\" | \"md\" | \"lg\" | \"xl\"} [size=\"md\"] - Spinner 크기 / Spinner size\n * @property {\"default\" | \"dots\" | \"bars\" | \"ring\" | \"ripple\"} [variant=\"default\"] - Spinner 애니메이션 타입 / Spinner animation type\n * @property {string} [text] - Spinner 아래 표시할 텍스트 / Text to display below spinner\n * @property {\"default\" | \"primary\" | \"secondary\" | \"success\" | \"warning\" | \"error\" | \"glass\"} [color=\"default\"] - Spinner 색상 / Spinner color\n * @property {string} [className] - 추가 CSS 클래스 / Additional CSS class\n */\nexport interface LoadingSpinnerProps {\n size?: \"sm\" | \"md\" | \"lg\" | \"xl\"\n variant?: \"default\" | \"dots\" | \"bars\" | \"ring\" | \"ripple\"\n text?: string\n color?: \"default\" | \"primary\" | \"secondary\" | \"success\" | \"warning\" | \"error\" | \"glass\"\n className?: string\n}\n\n/**\n * LoadingSpinner 컴포넌트 / LoadingSpinner component\n * \n * 로딩 상태를 표시하는 스피너 컴포넌트입니다.\n * 다양한 애니메이션 타입과 크기를 지원합니다.\n * \n * Spinner component that displays loading state.\n * Supports various animation types and sizes.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <LoadingSpinner />\n * \n * @example\n * // 텍스트와 함께 / With text\n * <LoadingSpinner \n * text=\"로딩 중...\"\n * size=\"lg\"\n * color=\"primary\"\n * />\n * \n * @example\n * // 다양한 애니메이션 / Various animations\n * <LoadingSpinner variant=\"dots\" />\n * <LoadingSpinner variant=\"bars\" color=\"success\" />\n * <LoadingSpinner variant=\"ripple\" size=\"xl\" />\n * \n * @param {LoadingSpinnerProps} props - LoadingSpinner 컴포넌트의 props / LoadingSpinner component props\n * @returns {JSX.Element} LoadingSpinner 컴포넌트 / LoadingSpinner component\n */\nexport function LoadingSpinner({ \n className, \n size = \"md\", \n variant = \"default\", \n text, \n color = \"default\" \n}: LoadingSpinnerProps) {\n const sizeClasses = {\n sm: \"w-6 h-6\", // 24px - 더 넉넉한 크기\n md: \"w-8 h-8\", // 32px - 더 넉넉한 크기\n lg: \"w-12 h-12\", // 48px - 더 넉넉한 크기\n xl: \"w-16 h-16\" // 64px - 더 넉넉한 크기\n }\n\n // LoadingSpinner는 border 색상을 사용하므로 특화 색상 시스템 사용\n // 다크모드: track(배경)은 밝게, spinner(회전부)는 더 밝게 → 대비 확보\n const spinnerColors: Record<string, string> = {\n default: \"border-muted-foreground/30 border-t-muted-foreground dark:border-muted-foreground/20 dark:border-t-muted-foreground/80\",\n primary: \"border-primary/30 border-t-primary dark:border-primary/20 dark:border-t-primary/80\",\n secondary: \"border-muted-foreground/30 border-t-muted-foreground dark:border-muted-foreground/20 dark:border-t-muted-foreground/80\",\n success: \"border-green-300 border-t-green-600 dark:border-green-500/50 dark:border-t-green-300\",\n warning: \"border-yellow-300 border-t-yellow-600 dark:border-yellow-500/50 dark:border-t-yellow-300\",\n error: \"border-red-300 border-t-red-600 dark:border-red-500/50 dark:border-t-red-300\",\n glass: \"border-white/50 border-t-white/90 dark:border-slate-400/60 dark:border-t-slate-100\"\n }\n\n const renderSpinner = () => {\n switch (variant) {\n case \"dots\":\n // 순차 점멸 애니메이션 (... 형태)\n return (\n <>\n <style>{`\n @keyframes dotPulse {\n 0%, 80%, 100% { opacity: 0.3; }\n 40% { opacity: 1; }\n }\n `}</style>\n <div className=\"flex space-x-1 items-center\">\n <div className=\"w-2 h-2 bg-current rounded-full\" style={{ animation: 'dotPulse 1.4s ease-in-out infinite', animationDelay: '0ms' }} />\n <div className=\"w-2 h-2 bg-current rounded-full\" style={{ animation: 'dotPulse 1.4s ease-in-out infinite', animationDelay: '200ms' }} />\n <div className=\"w-2 h-2 bg-current rounded-full\" style={{ animation: 'dotPulse 1.4s ease-in-out infinite', animationDelay: '400ms' }} />\n </div>\n </>\n )\n case \"bars\":\n return (\n <>\n <style>{`\n @keyframes barWave {\n 0%, 40%, 100% { transform: scaleY(0.4); }\n 20% { transform: scaleY(1); }\n }\n `}</style>\n <div className=\"flex space-x-0.5 h-full items-center\">\n <div className=\"w-1 h-full bg-current rounded-sm origin-bottom\" style={{ animation: 'barWave 1.2s ease-in-out infinite', animationDelay: '0ms' }} />\n <div className=\"w-1 h-full bg-current rounded-sm origin-bottom\" style={{ animation: 'barWave 1.2s ease-in-out infinite', animationDelay: '100ms' }} />\n <div className=\"w-1 h-full bg-current rounded-sm origin-bottom\" style={{ animation: 'barWave 1.2s ease-in-out infinite', animationDelay: '200ms' }} />\n <div className=\"w-1 h-full bg-current rounded-sm origin-bottom\" style={{ animation: 'barWave 1.2s ease-in-out infinite', animationDelay: '300ms' }} />\n <div className=\"w-1 h-full bg-current rounded-sm origin-bottom\" style={{ animation: 'barWave 1.2s ease-in-out infinite', animationDelay: '400ms' }} />\n </div>\n </>\n )\n case \"ring\":\n return (\n <div className={merge(\n \"w-full h-full animate-spin rounded-full\",\n size === \"xl\" ? \"border-[3px]\" : size === \"lg\" ? \"border-[2.5px]\" : \"border-2\",\n spinnerColors[color] || spinnerColors.default\n )} />\n )\n case \"ripple\":\n return (\n <div className=\"relative w-full h-full\">\n <div className={merge(\n \"absolute inset-0 rounded-full border-2 animate-ping\",\n spinnerColors[color] || spinnerColors.default\n )} />\n <div className={merge(\n \"w-full h-full rounded-full border-2\",\n spinnerColors[color] || spinnerColors.default\n )} />\n </div>\n )\n default:\n return (\n <div className={merge(\n \"w-full h-full animate-spin rounded-full\",\n size === \"xl\" ? \"border-[3px]\" : size === \"lg\" ? \"border-[2.5px]\" : \"border-2\",\n spinnerColors[color] || spinnerColors.default\n )} />\n )\n }\n }\n\n return (\n <div className={merge(\"flex flex-col items-center justify-center\", className)}>\n <div className={merge(sizeClasses[size], \"text-muted-foreground\")}>\n {renderSpinner()}\n </div>\n {text && (\n <p className=\"mt-3 text-sm text-muted-foreground text-center\">\n {text}\n </p>\n )}\n </div>\n )\n} ","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * Tooltip 컴포넌트의 props / Tooltip component props\n * @typedef {Object} TooltipProps\n * @property {string} content - Tooltip 내용 / Tooltip content\n * @property {React.ReactNode} children - Tooltip이 연결될 요소 / Element to attach tooltip to\n * @property {\"top\" | \"bottom\" | \"left\" | \"right\"} [position=\"top\"] - Tooltip 표시 위치 / Tooltip display position\n * @property {\"default\" | \"light\" | \"dark\"} [variant=\"default\"] - Tooltip 스타일 변형 / Tooltip style variant\n * @property {number} [delay=300] - Tooltip 표시 지연 시간(ms) / Tooltip display delay (ms)\n * @property {boolean} [disabled=false] - Tooltip 비활성화 여부 / Disable tooltip\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface TooltipProps extends React.HTMLAttributes<HTMLDivElement> {\n content: string\n children: React.ReactNode\n position?: \"top\" | \"bottom\" | \"left\" | \"right\"\n variant?: \"default\" | \"light\" | \"dark\"\n delay?: number\n disabled?: boolean\n}\n\n/**\n * Tooltip 컴포넌트 / Tooltip component\n * \n * 호버 시 추가 정보를 표시하는 툴팁 컴포넌트입니다.\n * 마우스 호버 시 지연 시간 후 표시됩니다.\n * \n * Tooltip component that displays additional information on hover.\n * Appears after a delay when the mouse hovers over the element.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Tooltip content=\"이것은 도움말입니다\">\n * <Button>호버하세요</Button>\n * </Tooltip>\n * \n * @example\n * // 다양한 위치 / Different positions\n * <Tooltip content=\"위치 변경\" position=\"bottom\">\n * <Icon name=\"info\" />\n * </Tooltip>\n * \n * @example\n * // 커스텀 스타일 / Custom styles\n * <Tooltip content=\"라이트 스타일\" variant=\"light\" delay={500}>\n * <span>호버</span>\n * </Tooltip>\n * \n * @param {TooltipProps} props - Tooltip 컴포넌트의 props / Tooltip component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} Tooltip 컴포넌트 / Tooltip component\n * \n * @todo 접근성 개선: role=\"tooltip\" 추가 필요 / Accessibility: Add role=\"tooltip\"\n * @todo 접근성 개선: aria-describedby 연결 필요 / Accessibility: Connect aria-describedby\n * @todo 접근성 개선: 키보드 포커스 시 Tooltip 표시 필요 / Accessibility: Show tooltip on keyboard focus\n */\nconst Tooltip = React.forwardRef<HTMLDivElement, TooltipProps>(\n ({ \n className, \n content,\n children,\n position = \"top\",\n variant = \"default\",\n delay = 300,\n disabled = false,\n ...props \n }, ref) => {\n const [isVisible, setIsVisible] = React.useState(false)\n const [coords, setCoords] = React.useState({ x: 0, y: 0 })\n const timeoutRef = React.useRef<number | undefined>(undefined)\n const tooltipRef = React.useRef<HTMLDivElement>(null)\n\n const showTooltip = (e: React.MouseEvent) => {\n if (disabled) return\n \n const rect = e.currentTarget.getBoundingClientRect()\n const _tooltipRect = tooltipRef.current?.getBoundingClientRect()\n \n let x = 0\n let y = 0\n \n switch (position) {\n case \"top\":\n x = rect.left + rect.width / 2\n y = rect.top - 8 // 8px 간격\n break\n case \"bottom\":\n x = rect.left + rect.width / 2\n y = rect.bottom + 8 // 8px 간격\n break\n case \"left\":\n x = rect.left - 8 // 8px 간격\n y = rect.top + rect.height / 2\n break\n case \"right\":\n x = rect.right + 8 // 8px 간격\n y = rect.top + rect.height / 2\n break\n }\n \n setCoords({ x, y })\n \n timeoutRef.current = window.setTimeout(() => {\n setIsVisible(true)\n }, delay)\n }\n\n const hideTooltip = () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current)\n }\n setIsVisible(false)\n }\n\n React.useEffect(() => {\n return () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current)\n }\n }\n }, [])\n\n const getVariantClasses = () => {\n switch (variant) {\n case \"light\":\n return \"bg-popover text-popover-foreground border border-border shadow-lg\"\n case \"dark\":\n return \"bg-gray-900 text-white shadow-lg\"\n default:\n return \"bg-gray-800 text-white shadow-lg\"\n }\n }\n\n const _getPositionClasses = () => {\n switch (position) {\n case \"top\":\n return \"bottom-full left-1/2 -translate-x-1/2 mb-2\" // 8px 간격\n case \"bottom\":\n return \"top-full left-1/2 -translate-x-1/2 mt-2\" // 8px 간격\n case \"left\":\n return \"right-full top-1/2 -translate-y-1/2 mr-2\" // 8px 간격\n case \"right\":\n return \"left-full top-1/2 -translate-y-1/2 ml-2\" // 8px 간격\n default:\n return \"bottom-full left-1/2 -translate-x-1/2 mb-2\"\n }\n }\n\n const getArrowClasses = () => {\n switch (position) {\n case \"top\":\n return \"top-full left-1/2 -translate-x-1/2 border-t-gray-800 dark:border-t-gray-800\"\n case \"bottom\":\n return \"bottom-full left-1/2 -translate-x-1/2 border-b-gray-800 dark:border-b-gray-800\"\n case \"left\":\n return \"left-full top-1/2 -translate-y-1/2 border-l-gray-800 dark:border-l-gray-800\"\n case \"right\":\n return \"right-full top-1/2 -translate-y-1/2 border-r-gray-800 dark:border-r-gray-800\"\n default:\n return \"top-full left-1/2 -translate-x-1/2 border-t-gray-800 dark:border-t-gray-800\"\n }\n }\n\n return (\n <div\n ref={ref}\n className={merge(\"relative inline-block\", className)}\n onMouseEnter={showTooltip}\n onMouseLeave={hideTooltip}\n {...props}\n >\n {children}\n \n {isVisible && (\n <div\n ref={tooltipRef}\n className={merge(\n \"fixed z-50 px-3 py-2 text-sm rounded-lg whitespace-nowrap pointer-events-none\", // 12px, 8px 패딩\n getVariantClasses()\n )}\n style={{\n left: `${coords.x}px`,\n top: `${coords.y}px`,\n transform: 'translate(-50%, -50%)'\n }}\n >\n {content}\n {/* 화살표 */}\n <div\n className={merge(\n \"absolute w-0 h-0 border-4 border-transparent\",\n getArrowClasses()\n )}\n />\n </div>\n )}\n </div>\n )\n }\n)\nTooltip.displayName = \"Tooltip\"\n\n// 편의 컴포넌트들\nexport const TooltipLight = React.forwardRef<HTMLDivElement, Omit<TooltipProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Tooltip ref={ref} variant=\"light\" className={className} {...props} />\n )\n)\nTooltipLight.displayName = \"TooltipLight\"\n\nexport const TooltipDark = React.forwardRef<HTMLDivElement, Omit<TooltipProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Tooltip ref={ref} variant=\"dark\" className={className} {...props} />\n )\n)\nTooltipDark.displayName = \"TooltipDark\"\n\nexport { Tooltip } ","\"use client\"\n\nimport React from \"react\"\nimport { cva } from \"class-variance-authority\"\nimport { merge } from \"../lib/utils\"\n\nexport const labelVariants = cva(\n \"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\",\n {\n variants: {\n variant: {\n default: \"text-foreground\",\n glass: \"text-white\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\n/**\n * Label 컴포넌트의 props / Label component props\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 * @example\n * <Label htmlFor=\"email\">이메일</Label>\n * <Label required htmlFor=\"name\">이름</Label>\n * <Label error htmlFor=\"password\">비밀번호</Label>\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 return (\n <label\n ref={ref}\n className={merge(\n labelVariants({ variant }),\n error && (variant === \"glass\" ? \"text-red-400\" : \"text-destructive\"),\n disabled && (variant === \"glass\" ? \"text-white/50\" : \"text-muted-foreground\"),\n className\n )}\n aria-required={required ? true : undefined}\n {...props}\n >\n {children}\n {required && (\n <span className={variant === \"glass\" ? \"text-red-400 ml-1\" : \"text-destructive 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 * 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 generatedId = React.useId()\n const switchId = id || generatedId\n const labelId = label ? `${switchId}-label` : undefined\n const descriptionId = description ? `${switchId}-description` : undefined\n // Track sizes - proper proportions for smooth toggle\n const sizeClasses = {\n sm: \"w-9 h-5\",\n md: \"w-11 h-6\",\n lg: \"w-14 h-8\"\n }\n\n // Thumb sizes - slightly smaller than track height for padding\n const thumbSizes = {\n sm: \"w-4 h-4\",\n md: \"w-5 h-5\",\n lg: \"w-7 h-7\"\n }\n\n // Thumb position when checked - calculated for proper alignment\n const thumbTranslate = {\n sm: \"peer-checked:translate-x-4\",\n md: \"peer-checked:translate-x-5\",\n lg: \"peer-checked:translate-x-6\"\n }\n\n const variantClasses = {\n default: \"bg-muted peer-checked:bg-primary\",\n outline: \"bg-transparent border-2 border-input peer-checked:border-primary peer-checked:bg-primary\",\n filled: \"bg-secondary peer-checked:bg-primary\",\n glass: \"bg-white/20 backdrop-blur-sm border border-white/30 peer-checked:bg-primary/50 peer-checked:border-primary/30\",\n }\n\n const stateClasses = error\n ? \"bg-destructive/20 peer-checked:bg-destructive\"\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-1 peer-focus:ring-ring 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 absolute rounded-full bg-white shadow-md ring-0\",\n \"transition-all duration-200 ease-out\",\n \"top-1/2 -translate-y-1/2 left-0.5\",\n thumbSizes[size],\n thumbTranslate[size]\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-foreground cursor-pointer\">\n {label}\n </label>\n )}\n {description && (\n <p id={descriptionId} className=\"text-sm text-muted-foreground\">\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 * Toggle 컴포넌트의 props / Toggle component props\n * @typedef {Object} ToggleProps\n * @property {\"default\" | \"outline\" | \"filled\" | \"ghost\" | \"glass\"} [variant=\"default\"] - Toggle 스타일 변형 / Toggle style variant\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - Toggle 크기 / Toggle size\n * @property {boolean} [pressed] - 제어 모드에서 눌림 상태 / Pressed state in controlled mode\n * @property {(pressed: boolean) => void} [onPressedChange] - 상태 변경 콜백 / State change callback\n * @property {string} [label] - Toggle 라벨 텍스트 / Toggle label text\n * @property {string} [description] - Toggle 설명 텍스트 / Toggle description text\n * @property {React.ReactNode} [icon] - 아이콘 / Icon\n * @property {\"left\" | \"right\"} [iconPosition=\"left\"] - 아이콘 위치 / Icon position\n * @extends {Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'size'>}\n */\nexport interface ToggleProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'size'> {\n variant?: \"default\" | \"outline\" | \"filled\" | \"ghost\" | \"glass\"\n size?: \"sm\" | \"md\" | \"lg\"\n pressed?: boolean\n onPressedChange?: (pressed: boolean) => void\n label?: string\n description?: string\n icon?: React.ReactNode\n iconPosition?: \"left\" | \"right\"\n}\n\n/**\n * Toggle 컴포넌트 / Toggle component\n * \n * 눌림 상태를 가지는 토글 버튼 컴포넌트입니다.\n * Switch와 달리 버튼 형태로 표시되며, 여러 개를 그룹으로 사용할 수 있습니다.\n * \n * Toggle button component with pressed state.\n * Unlike Switch, displayed as a button and can be used in groups.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Toggle label=\"알림\" />\n * \n * @example\n * // 제어 모드 / Controlled mode\n * const [pressed, setPressed] = useState(false)\n * <Toggle \n * pressed={pressed}\n * onPressedChange={setPressed}\n * label=\"다크 모드\"\n * icon={<Icon name=\"moon\" />}\n * />\n * \n * @example\n * // 아이콘만 / Icon only\n * <Toggle \n * icon={<Icon name=\"heart\" />}\n * variant=\"ghost\"\n * />\n * \n * @param {ToggleProps} props - Toggle 컴포넌트의 props / Toggle component props\n * @param {React.Ref<HTMLButtonElement>} ref - button 요소 ref / button element ref\n * @returns {JSX.Element} Toggle 컴포넌트 / Toggle component\n */\nconst Toggle = React.forwardRef<HTMLButtonElement, ToggleProps>(\n ({ \n className, \n variant = \"default\",\n size = \"md\",\n pressed: controlledPressed,\n onPressedChange,\n label,\n description,\n icon,\n iconPosition = \"left\",\n onClick,\n ...props \n }, ref) => {\n const [internalPressed, setInternalPressed] = React.useState(false)\n const isControlled = controlledPressed !== undefined\n const pressed = isControlled ? controlledPressed : internalPressed\n\n const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {\n if (!isControlled) {\n setInternalPressed(!pressed)\n }\n onPressedChange?.(!pressed)\n onClick?.(e)\n }\n\n const sizeClasses = {\n sm: \"h-7 px-3 text-sm\",\n md: \"h-9 px-4 text-base\",\n lg: \"h-11 px-5 text-lg\"\n }\n\n const variantClasses = {\n default: pressed\n ? \"bg-primary text-primary-foreground hover:bg-primary/80\"\n : \"bg-muted text-foreground hover:bg-muted/80\",\n outline: pressed\n ? \"border-2 border-primary bg-primary/10 text-primary hover:bg-primary/15\"\n : \"border-2 border-border bg-transparent text-foreground hover:bg-muted\",\n filled: pressed\n ? \"bg-primary text-primary-foreground hover:bg-primary/80\"\n : \"bg-muted/50 text-foreground hover:bg-muted\",\n ghost: pressed\n ? \"bg-primary/10 text-primary hover:bg-primary/15\"\n : \"bg-transparent text-foreground hover:bg-muted\",\n glass: pressed\n ? \"bg-white/20 backdrop-blur-sm border border-white/30 text-white hover:bg-white/30 dark:bg-primary/20 dark:border-primary/50 dark:hover:bg-primary/30\"\n : \"bg-white/10 backdrop-blur-sm border border-white/20 text-white hover:bg-white/20 dark:bg-muted/10 dark:border-border/50 dark:text-foreground dark:hover:bg-muted/20\"\n }\n\n return (\n <div className=\"flex items-start space-x-3\">\n <button\n type=\"button\"\n ref={ref}\n className={merge(\n \"inline-flex items-center justify-center gap-2 rounded-md font-medium transition-all duration-200\",\n \"focus:outline-none focus:ring-1 focus:ring-ring focus:ring-offset-2\",\n \"disabled:cursor-not-allowed disabled:opacity-50\",\n sizeClasses[size],\n variantClasses[variant],\n className\n )}\n onClick={handleClick}\n aria-pressed={pressed}\n {...props}\n >\n {icon && iconPosition === \"left\" && (\n <span className=\"flex-shrink-0\">{icon}</span>\n )}\n {label && <span>{label}</span>}\n {icon && iconPosition === \"right\" && (\n <span className=\"flex-shrink-0\">{icon}</span>\n )}\n </button>\n {description && (\n <div className=\"flex flex-col\">\n <p className=\"text-sm text-muted-foreground\">\n {description}\n </p>\n </div>\n )}\n </div>\n )\n }\n)\nToggle.displayName = \"Toggle\"\n\nexport { Toggle }\n\n","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * ScrollArea 컴포넌트의 props / ScrollArea component props\n * @typedef {Object} ScrollAreaProps\n * @property {React.ReactNode} children - 스크롤 영역 내용 / Scroll area content\n * @property {string} [className] - 추가 CSS 클래스 / Additional CSS class\n * @property {\"vertical\" | \"horizontal\" | \"both\"} [orientation=\"vertical\"] - 스크롤 방향 / Scroll direction\n * @property {number} [scrollHideDelay=600] - 스크롤바 숨김 지연 시간 (ms) / Scrollbar hide delay (ms)\n * @property {\"auto\" | \"always\" | \"scroll\" | \"hover\"} [type=\"hover\"] - 스크롤바 표시 타입 / Scrollbar display type\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\ninterface ScrollAreaProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode\n className?: string\n orientation?: \"vertical\" | \"horizontal\" | \"both\"\n scrollHideDelay?: number\n type?: \"auto\" | \"always\" | \"scroll\" | \"hover\"\n}\n\n/**\n * ScrollArea 컴포넌트 / ScrollArea component\n * \n * 커스텀 스크롤바를 가진 스크롤 영역 컴포넌트입니다.\n * 호버 시 스크롤바를 표시하거나 항상 표시할 수 있습니다.\n * \n * Scroll area component with custom scrollbar.\n * Can display scrollbar on hover or always.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <ScrollArea className=\"h-64\">\n * <div>긴 내용...</div>\n * </ScrollArea>\n * \n * @example\n * // 가로 스크롤, 항상 표시 / Horizontal scroll, always visible\n * <ScrollArea orientation=\"horizontal\" type=\"always\">\n * <div className=\"flex space-x-4\">...</div>\n * </ScrollArea>\n * \n * @param {ScrollAreaProps} props - ScrollArea 컴포넌트의 props / ScrollArea component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} ScrollArea 컴포넌트 / ScrollArea component\n */\nconst ScrollArea = React.forwardRef<HTMLDivElement, ScrollAreaProps>(\n ({ \n children, \n className, \n orientation = \"vertical\",\n scrollHideDelay = 600,\n type = \"hover\",\n ...props \n }, ref) => {\n const [showScrollbar, setShowScrollbar] = React.useState(false)\n const timeoutRef = React.useRef<ReturnType<typeof setTimeout> | undefined>(undefined)\n\n const handleMouseEnter = () => {\n if (type === \"hover\" || type === \"always\") {\n setShowScrollbar(true)\n }\n }\n\n const handleMouseLeave = () => {\n if (type === \"hover\") {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current)\n }\n timeoutRef.current = setTimeout(() => {\n setShowScrollbar(false)\n }, scrollHideDelay)\n }\n }\n\n React.useEffect(() => {\n if (type === \"always\") {\n setShowScrollbar(true)\n }\n }, [type])\n\n React.useEffect(() => {\n return () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current)\n }\n }\n }, [])\n\n return (\n <div\n ref={ref}\n className={merge(\n \"relative overflow-auto scrollbar-thin\",\n orientation === \"vertical\" && \"overflow-y-auto overflow-x-hidden\",\n orientation === \"horizontal\" && \"overflow-x-auto overflow-y-hidden\",\n orientation === \"both\" && \"overflow-auto\",\n showScrollbar ? \"scrollbar-visible\" : \"scrollbar-hidden\",\n className\n )}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n {...props}\n >\n {children}\n </div>\n )\n }\n)\n\nScrollArea.displayName = \"ScrollArea\"\n\n/**\n * ScrollBar 컴포넌트의 props / ScrollBar component props\n * @typedef {Object} ScrollBarProps\n * @property {\"vertical\" | \"horizontal\"} [orientation=\"vertical\"] - 스크롤바 방향 / Scrollbar direction\n * @property {string} [className] - 추가 CSS 클래스 / Additional CSS class\n */\ninterface ScrollBarProps {\n orientation?: \"vertical\" | \"horizontal\"\n className?: string\n}\n\n/**\n * ScrollBar 컴포넌트 / ScrollBar component\n * 커스텀 스크롤바를 표시합니다.\n * Displays a custom scrollbar.\n * \n * @component\n * @param {ScrollBarProps} props - ScrollBar 컴포넌트의 props / ScrollBar component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} ScrollBar 컴포넌트 / ScrollBar component\n */\nconst ScrollBar = React.forwardRef<HTMLDivElement, ScrollBarProps>(\n ({ orientation = \"vertical\", className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={merge(\n \"flex touch-none select-none transition-colors duration-150 ease-out\",\n orientation === \"vertical\" && \"h-full w-2.5 border-l border-l-transparent p-[1px]\",\n orientation === \"horizontal\" && \"h-2.5 flex-col border-t border-t-transparent p-[1px]\",\n className\n )}\n {...props}\n />\n )\n }\n)\n\nScrollBar.displayName = \"ScrollBar\"\n\nexport { ScrollArea, ScrollBar } ","import { useEffect, useState } from \"react\"\n\ninterface ScrollToggleOptions {\n threshold?: number\n showOnMount?: boolean\n smooth?: boolean\n}\n\nexport function useScrollToggle(options: ScrollToggleOptions = {}) {\n const {\n threshold = 400,\n showOnMount = false,\n smooth = true,\n } = options\n\n const [isVisible, setIsVisible] = useState(showOnMount)\n const [mounted, setMounted] = useState(false)\n\n useEffect(() => {\n setMounted(true)\n }, [])\n\n useEffect(() => {\n if (!mounted) return\n\n const toggleVisibility = () => {\n if (typeof window === \"undefined\") return\n setIsVisible(window.pageYOffset > threshold)\n }\n\n toggleVisibility()\n window.addEventListener(\"scroll\", toggleVisibility, { passive: true })\n window.addEventListener(\"resize\", toggleVisibility, { passive: true })\n\n return () => {\n window.removeEventListener(\"scroll\", toggleVisibility)\n window.removeEventListener(\"resize\", toggleVisibility)\n }\n }, [threshold, mounted])\n\n const scrollToTop = () => {\n if (typeof window === \"undefined\") return\n if (smooth) {\n window.scrollTo({ top: 0, behavior: \"smooth\" })\n } else {\n window.scrollTo(0, 0)\n }\n }\n\n return {\n isVisible,\n scrollToTop,\n mounted,\n }\n}\n\n","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\nimport { Icon } from \"./Icon\"\nimport { IconName } from \"../lib/icons\"\nimport { useScrollToggle } from \"../hooks/useScrollToggle\"\n\n/**\n * ScrollToTop 컴포넌트의 props / ScrollToTop component props\n * @typedef {Object} ScrollToTopProps\n * @property {number} [threshold=400] - 표시 임계값 (px, 이 값 이상 스크롤 시 표시) / Display threshold (px, shows when scrolled beyond this value)\n * @property {boolean} [smooth=true] - 부드러운 스크롤 여부 / Smooth scroll\n * @property {string} [className] - 추가 CSS 클래스 / Additional CSS class\n * @property {IconName} [icon='arrowUp'] - 아이콘 이름 / Icon name\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - 버튼 크기 / Button size\n * @property {\"default\" | \"primary\" | \"secondary\" | \"outline\" | \"ghost\"} [variant=\"default\"] - 버튼 스타일 변형 / Button style variant\n * @property {boolean} [showOnMount=false] - 마운트 시 즉시 표시 여부 / Show immediately on mount\n * @extends {React.HTMLAttributes<HTMLButtonElement>}\n */\nexport interface ScrollToTopProps extends React.HTMLAttributes<HTMLButtonElement> {\n threshold?: number\n smooth?: boolean\n className?: string\n icon?: IconName\n size?: \"sm\" | \"md\" | \"lg\"\n variant?: \"default\" | \"primary\" | \"secondary\" | \"outline\" | \"ghost\"\n showOnMount?: boolean\n}\n\n/**\n * ScrollToTop 컴포넌트 / ScrollToTop component\n * \n * 페이지 상단으로 스크롤하는 버튼 컴포넌트입니다.\n * 지정된 임계값 이상 스크롤 시 자동으로 표시됩니다.\n * \n * Button component that scrolls to top of page.\n * Automatically appears when scrolled beyond specified threshold.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <ScrollToTop />\n * \n * @example\n * // 커스텀 설정 / Custom settings\n * <ScrollToTop \n * threshold={500}\n * variant=\"primary\"\n * size=\"lg\"\n * icon=\"arrowUp\"\n * />\n * \n * @param {ScrollToTopProps} props - ScrollToTop 컴포넌트의 props / ScrollToTop component props\n * @returns {JSX.Element} ScrollToTop 컴포넌트 / ScrollToTop component\n */\nconst ScrollToTop = ({ \n className, \n threshold = 400, \n smooth = true, \n icon = \"arrowUp\",\n size = \"md\",\n variant = \"default\",\n showOnMount = false,\n ...props \n}: ScrollToTopProps) => {\n // HUA Motion의 useScrollToggle 훅 사용\n const { isVisible, scrollToTop, mounted: _mounted } = useScrollToggle({\n threshold,\n showOnMount,\n smooth\n })\n\n const sizeClasses = {\n sm: \"w-8 h-8 sm:w-10 sm:h-10\",\n md: \"w-10 h-10 sm:w-12 sm:h-12\", \n lg: \"w-12 h-12 sm:w-14 sm:h-14\"\n }\n\n\n\n const variantClasses = {\n default: \"bg-white/20 backdrop-blur-md border border-white/30 text-white hover:bg-white/30 dark:bg-muted/20 dark:border-border/50 dark:text-foreground dark:hover:bg-muted/30\",\n primary: \"bg-primary/70 backdrop-blur-md border border-primary/40 text-white hover:bg-primary/80 transition-all duration-300 dark:bg-primary/70 dark:border-primary/40 dark:hover:bg-primary/80\",\n secondary: \"bg-muted/80 backdrop-blur-md border border-border text-foreground hover:bg-muted/90 dark:bg-muted/50 dark:border-border dark:text-foreground dark:hover:bg-muted/60\",\n outline: \"border border-white/40 bg-white/15 backdrop-blur-md text-white hover:bg-white/25 dark:border-border/50 dark:bg-muted/15 dark:text-foreground dark:hover:bg-muted/25\",\n ghost: \"bg-transparent hover:bg-white/15 backdrop-blur-md text-white dark:text-foreground dark:hover:bg-muted/25\"\n }\n\n return (\n <button\n onClick={scrollToTop}\n className={merge(\n \"fixed z-[9999] rounded-full transition-all duration-500 ease-in-out\",\n \"flex items-center justify-center\",\n \"focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-offset-1 focus-visible:ring-ring/50\",\n \"transform hover:scale-105 active:scale-95\",\n // 페이드 애니메이션\n isVisible \n ? \"opacity-100 translate-y-0 pointer-events-auto\" \n : \"opacity-0 translate-y-4 pointer-events-none\",\n className,\n sizeClasses[size],\n variantClasses[variant]\n )}\n aria-label=\"Scroll to top\"\n {...props}\n >\n <Icon name={icon} className=\"w-5 h-5\" />\n </button>\n )\n}\n\nexport { ScrollToTop } ","\"use client\"\n\nimport React, { createContext, useContext, useEffect, useState } from \"react\"\n\ntype Theme = \"light\" | \"dark\" | \"system\"\n\n/**\n * ThemeProvider 컴포넌트의 props / ThemeProvider component props\n * @typedef {Object} ThemeProviderProps\n * @property {React.ReactNode} children - 자식 컴포넌트 / Child components\n * @property {\"light\" | \"dark\" | \"system\"} [defaultTheme=\"light\"] - 기본 테마 / Default theme\n * @property {string} [storageKey=\"hua-ui-theme\"] - localStorage 키 / localStorage key\n * @property {boolean} [enableSystem=true] - 시스템 테마 감지 활성화 / Enable system theme detection\n * @property {boolean} [enableTransition=true] - 테마 전환 애니메이션 활성화 / Enable theme transition animation\n */\nexport interface ThemeProviderProps {\n children: React.ReactNode\n defaultTheme?: Theme\n storageKey?: string\n enableSystem?: boolean\n enableTransition?: boolean\n}\n\n/**\n * ThemeProvider의 상태 타입 / ThemeProvider state type\n * @typedef {Object} ThemeProviderState\n * @property {\"light\" | \"dark\" | \"system\"} theme - 현재 테마 / Current theme\n * @property {(theme: \"light\" | \"dark\" | \"system\") => void} setTheme - 테마 설정 함수 / Theme setter function\n * @property {\"light\" | \"dark\"} resolvedTheme - 실제 적용된 테마 (system일 경우 시스템 테마) / Actually applied theme (system theme when system is selected)\n * @property {() => void} toggleTheme - 테마 토글 함수 / Theme toggle function\n */\nexport interface ThemeProviderState {\n theme: Theme\n setTheme: (theme: Theme) => void\n resolvedTheme: \"light\" | \"dark\"\n toggleTheme: () => void\n}\n\nconst initialState: ThemeProviderState = {\n theme: \"system\",\n setTheme: () => null,\n resolvedTheme: \"light\",\n toggleTheme: () => null,\n}\n\nconst ThemeProviderContext = createContext<ThemeProviderState>(initialState)\n\n/**\n * ThemeProvider 컴포넌트 / ThemeProvider component\n * \n * 테마 관리를 위한 Context Provider 컴포넌트입니다.\n * localStorage에 테마를 저장하고, 시스템 테마를 감지할 수 있습니다.\n * useTheme 훅을 통해 테마 상태에 접근할 수 있습니다.\n * \n * Context Provider component for theme management.\n * Saves theme to localStorage and can detect system theme.\n * Access theme state through useTheme hook.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <ThemeProvider>\n * <App />\n * </ThemeProvider>\n * \n * @example\n * // 커스텀 설정 / Custom settings\n * <ThemeProvider\n * defaultTheme=\"dark\"\n * storageKey=\"my-app-theme\"\n * enableSystem={true}\n * enableTransition={true}\n * >\n * <App />\n * </ThemeProvider>\n * \n * @param {ThemeProviderProps} props - ThemeProvider 컴포넌트의 props / ThemeProvider component props\n * @returns {JSX.Element} ThemeProvider 컴포넌트 / ThemeProvider component\n */\nexport function ThemeProvider({\n children,\n defaultTheme = \"light\", // system에서 light로 변경\n storageKey = \"hua-ui-theme\",\n enableSystem = true,\n enableTransition = true,\n ...props\n}: ThemeProviderProps): React.ReactElement {\n const [theme, setTheme] = useState<Theme>(defaultTheme)\n const [resolvedTheme, setResolvedTheme] = useState<\"light\" | \"dark\">(\"light\")\n\n useEffect(() => {\n // localStorage에서 테마 가져오기 (클라이언트에서만)\n if (typeof window !== 'undefined') {\n const savedTheme = localStorage.getItem(storageKey) as Theme\n if (savedTheme) {\n setTheme(savedTheme)\n }\n }\n }, [storageKey])\n\n useEffect(() => {\n const root = window.document.documentElement\n\n root.classList.remove(\"light\", \"dark\")\n\n if (theme === \"system\" && enableSystem) {\n const systemTheme = window.matchMedia(\"(prefers-color-scheme: dark)\")\n .matches\n ? \"dark\"\n : \"light\"\n\n root.classList.add(systemTheme)\n setResolvedTheme(systemTheme)\n } else {\n root.classList.add(theme)\n setResolvedTheme(theme as \"light\" | \"dark\")\n }\n\n if (enableTransition) {\n root.classList.add(\"transition-colors\", \"duration-300\")\n }\n }, [theme, enableSystem, enableTransition])\n\n useEffect(() => {\n if (theme === \"system\" && enableSystem) {\n const mediaQuery = window.matchMedia(\"(prefers-color-scheme: dark)\")\n\n const handleChange = () => {\n const systemTheme = mediaQuery.matches ? \"dark\" : \"light\"\n setResolvedTheme(systemTheme)\n document.documentElement.classList.remove(\"light\", \"dark\")\n document.documentElement.classList.add(systemTheme)\n }\n\n mediaQuery.addEventListener(\"change\", handleChange)\n return () => mediaQuery.removeEventListener(\"change\", handleChange)\n }\n }, [theme, enableSystem])\n\n const value = {\n theme,\n setTheme: (theme: Theme) => {\n if (typeof window !== 'undefined') {\n localStorage.setItem(storageKey, theme)\n }\n setTheme(theme)\n },\n resolvedTheme,\n toggleTheme: () => {\n const newTheme = resolvedTheme === \"light\" ? \"dark\" : \"light\"\n if (typeof window !== 'undefined') {\n localStorage.setItem(storageKey, newTheme)\n }\n setTheme(newTheme)\n },\n }\n\n return (\n <ThemeProviderContext.Provider {...props} value={value}>\n {children}\n </ThemeProviderContext.Provider>\n )\n}\n\n/**\n * useTheme 훅 / useTheme hook\n * \n * ThemeProvider의 테마 상태에 접근하는 훅입니다.\n * ThemeProvider 내부에서만 사용할 수 있습니다.\n * \n * Hook to access ThemeProvider's theme state.\n * Can only be used inside ThemeProvider.\n * \n * @example\n * const { theme, setTheme, resolvedTheme, toggleTheme } = useTheme()\n * \n * @returns {ThemeProviderState} 테마 상태와 함수들 / Theme state and functions\n * @throws {Error} ThemeProvider 외부에서 사용 시 에러 발생 / Error when used outside ThemeProvider\n */\nexport const useTheme = () => {\n const context = useContext(ThemeProviderContext)\n\n if (context === undefined)\n throw new Error(\"useTheme must be used within a ThemeProvider\")\n\n return context\n} ","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\nimport { Icon } from \"./Icon\"\nimport { useTheme } from \"./ThemeProvider\"\n\n/**\n * ThemeToggle 컴포넌트의 props / ThemeToggle component props\n * @typedef {Object} ThemeToggleProps\n * @property {string} [className] - 추가 CSS 클래스 / Additional CSS class\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - Toggle 크기 / Toggle size\n * @property {\"button\" | \"icon\" | \"switch\"} [variant=\"button\"] - Toggle 스타일 변형 / Toggle style variant\n * @property {boolean} [showLabel=false] - 라벨 표시 여부 / Show label\n * @property {Object} [label] - 커스텀 라벨 텍스트 / Custom label text\n * @property {string} [label.light=\"라이트\"] - 라이트 모드 라벨 / Light mode label\n * @property {string} [label.dark=\"다크\"] - 다크 모드 라벨 / Dark mode label\n * @property {string} [label.system=\"시스템\"] - 시스템 모드 라벨 / System mode label\n */\ninterface ThemeToggleProps {\n className?: string\n size?: \"sm\" | \"md\" | \"lg\"\n variant?: \"button\" | \"icon\" | \"switch\"\n showLabel?: boolean\n label?: {\n light?: string\n dark?: string\n system?: string\n }\n}\n\n/**\n * ThemeToggle 컴포넌트 / ThemeToggle component\n * \n * 테마를 전환하는 토글 컴포넌트입니다.\n * ThemeProvider와 함께 사용하며, light/dark/system 테마를 지원합니다.\n * \n * Toggle component for switching themes.\n * Used with ThemeProvider, supports light/dark/system themes.\n * \n * @component\n * @example\n * // 기본 사용 (버튼 스타일) / Basic usage (button style)\n * <ThemeToggle />\n * \n * @example\n * // 아이콘만 표시 / Icon only\n * <ThemeToggle variant=\"icon\" size=\"lg\" />\n * \n * @example\n * // Switch 스타일 / Switch style\n * <ThemeToggle variant=\"switch\" />\n * \n * @example\n * // 라벨과 함께 / With label\n * <ThemeToggle \n * showLabel\n * label={{ light: \"밝게\", dark: \"어둡게\" }}\n * />\n * \n * @param {ThemeToggleProps} props - ThemeToggle 컴포넌트의 props / ThemeToggle component props\n * @returns {JSX.Element} ThemeToggle 컴포넌트 / ThemeToggle component\n */\nexport function ThemeToggle({\n className,\n size = \"md\",\n variant = \"button\",\n showLabel = false,\n label = {\n light: \"라이트\",\n dark: \"다크\",\n system: \"시스템\"\n },\n ...props\n}: ThemeToggleProps) {\n const { theme, setTheme, resolvedTheme } = useTheme()\n\n const sizeClasses = {\n sm: \"h-10 w-10\", // 40px - 더 넉넉한 크기\n md: \"h-12 w-12\", // 48px - 더 넉넉한 크기\n lg: \"h-14 w-14\" // 56px - 더 넉넉한 크기\n }\n\n const iconSizes = {\n sm: 16,\n md: 20,\n lg: 24\n }\n\n const renderIcon = () => {\n if (theme === \"system\") {\n return <Icon name=\"monitor\" size={iconSizes[size]} />\n }\n return resolvedTheme === \"dark\" ? (\n <Icon name=\"moon\" size={iconSizes[size]} />\n ) : (\n <Icon name=\"sun\" size={iconSizes[size]} className=\"text-amber-600\" />\n )\n }\n\n const handleClick = () => {\n if (theme === \"system\") {\n setTheme(\"light\")\n } else if (theme === \"light\") {\n setTheme(\"dark\")\n } else if (theme === \"dark\") {\n setTheme(\"light\") // dark → light로 직접 전환\n }\n }\n\n if (variant === \"icon\") {\n return (\n <button\n onClick={handleClick}\n className={merge(\n \"inline-flex items-center justify-center rounded-lg transition-all duration-300 hover:bg-muted focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring/50 focus-visible:ring-offset-2\",\n sizeClasses[size],\n className\n )}\n {...props}\n >\n <div className=\"relative flex items-center justify-center w-full h-full\">\n <div\n className={merge(\n \"absolute inset-0 flex items-center justify-center transition-all duration-300\",\n resolvedTheme === \"dark\" ? \"rotate-0 opacity-100\" : \"rotate-90 opacity-0\"\n )}\n >\n <Icon name=\"moon\" size={iconSizes[size]} className=\"text-indigo-500\" />\n </div>\n <div\n className={merge(\n \"absolute inset-0 flex items-center justify-center transition-all duration-300\",\n resolvedTheme === \"dark\" ? \"rotate-90 opacity-0\" : \"rotate-0 opacity-100\"\n )}\n >\n <Icon name=\"sun\" size={iconSizes[size]} className=\"text-amber-600 dark:text-yellow-500\" />\n </div>\n </div>\n </button>\n )\n }\n\n if (variant === \"switch\") {\n return (\n <button\n onClick={handleClick}\n className={merge(\n \"relative inline-flex h-6 w-11 items-center rounded-full transition-colors duration-300 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring/50 focus-visible:ring-offset-2\",\n resolvedTheme === \"dark\" \n ? \"bg-primary\"\n : \"bg-muted\",\n className\n )}\n {...props}\n >\n <span\n className={merge(\n \"inline-block h-4 w-4 transform rounded-full bg-white transition-transform duration-300 shadow-lg\",\n resolvedTheme === \"dark\" ? \"translate-x-6\" : \"translate-x-1\"\n )}\n />\n <div className=\"absolute inset-0 flex items-center justify-between px-1.5\">\n <Icon name=\"sun\" size={12} className=\"text-amber-600 dark:text-yellow-500 opacity-0\" />\n <Icon name=\"moon\" size={12} className=\"text-indigo-500 opacity-0\" />\n </div>\n </button>\n )\n }\n\n return (\n <button\n onClick={handleClick}\n className={merge(\n \"inline-flex items-center gap-3 rounded-lg px-4 py-3 text-sm font-medium transition-all duration-300 hover:bg-muted focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring/50 focus-visible:ring-offset-2\", // 12px 간격, 16px, 12px 패딩\n className\n )}\n {...props}\n >\n {renderIcon()}\n {showLabel && (\n <span className=\"text-foreground\">\n {theme === \"system\" ? label.system : theme === \"dark\" ? label.dark : label.light}\n </span>\n )}\n </button>\n )\n} ","/**\n * Icon Names - 자동완성 지원\n * \n * 이 파일은 TypeScript 자동완성을 위한 아이콘 이름 목록입니다.\n * 실제 아이콘은 icons.ts와 PROJECT_ICONS에서 관리됩니다.\n */\n\nimport type { IconName } from './icons'\nimport { PROJECT_ICONS } from './icon-providers'\n\n/**\n * PROJECT_ICONS에 정의된 모든 아이콘 이름\n */\nexport type ProjectIconName = keyof typeof PROJECT_ICONS\n\n/**\n * 사용 가능한 모든 아이콘 이름 (icons.ts + PROJECT_ICONS)\n */\nexport type AllIconName = IconName | ProjectIconName\n\n/**\n * 아이콘 이름 목록 (자동완성용)\n */\nexport const iconNames = [\n // Navigation\n 'home', 'menu', 'close', 'search', 'settings', 'user', 'bell',\n 'arrowLeft', 'arrowRight', 'arrowUp', 'arrowDown',\n 'chevronLeft', 'chevronRight', 'chevronUp', 'chevronDown',\n \n // Actions\n 'add', 'edit', 'delete', 'remove', 'check', 'share', 'download', 'upload',\n 'save', 'copy', 'refresh', 'search',\n \n // Status & Feedback\n 'loader', 'success', 'error', 'warning', 'info', 'alertCircle',\n 'heart', 'star', 'bookmark',\n \n // User & Auth\n 'logIn', 'logOut', 'shield', 'key', 'lock', 'unlock',\n 'eye', 'eyeOff', 'users', 'userPlus',\n \n // Data & Analytics\n 'chart', 'barChart', 'pieChart', 'trendingUp', 'trendingDown',\n 'activity', 'database', 'zap', 'circle', 'dollarSign', 'dollar', 'currency',\n \n // Files & Content\n 'fileText', 'file', 'folder', 'book', 'bookOpen',\n 'image', 'video', 'camera',\n \n // Communication\n 'message', 'messageSquare', 'phone', 'mail', 'send',\n \n // Media\n 'play', 'pause', 'mic', 'headphones',\n \n // Emotions\n 'smile', 'frown', 'meh', 'laugh', 'angry',\n 'thumbsUp', 'thumbsDown',\n \n // Time & Date\n 'clock', 'timer', 'calendar', 'calendarDays',\n \n // UI & Theme\n 'monitor', 'sun', 'moon', 'sparkle', 'sparkles', 'lightbulb', 'brain',\n\n // Device & Platform\n 'globe', 'deviceMobile', 'smartphone', 'floppyDisk',\n \n // Navigation Extended\n 'externalLink', 'link', 'moreHorizontal', 'moreVertical',\n\n // Additional\n 'rocket',\n\n // Connectivity & Misc\n 'ticket', 'clipboard', 'wifi', 'wifiOff', 'cpu', 'mask',\n] as const\n\n/**\n * 프로바이더별 아이콘 이름 매핑 (참고용)\n * \n * @example\n * // Lucide 아이콘 사용\n * <Icon name=\"home\" provider=\"lucide\" /> // Lucide: Home\n * \n * // Phosphor 아이콘 사용\n * <Icon name=\"home\" provider=\"phosphor\" /> // Phosphor: House\n * \n * // Iconsax 아이콘 사용 (requires '@hua-labs/ui/iconsax' import)\n * <Icon name=\"home\" provider=\"iconsax\" /> // Iconsax: Home2\n */\nexport const iconProviderMapping: Record<string, {\n lucide: string\n phosphor: string\n iconsax?: string\n}> = PROJECT_ICONS\n\n/**\n * 아이콘 이름이 유효한지 확인\n */\nexport function isValidIconName(name: string): name is AllIconName {\n return name in PROJECT_ICONS || (iconNames as readonly string[]).includes(name)\n}\n\n/**\n * 프로바이더별 아이콘 이름 가져오기\n */\nexport function getIconNameForProvider(\n iconName: string,\n provider: 'lucide' | 'phosphor' | 'iconsax'\n): string | null {\n const mapping = PROJECT_ICONS[iconName as keyof typeof PROJECT_ICONS]\n if (!mapping) return null\n\n return (mapping as Record<string, string>)[provider] || null\n}\n\n\n","/**\n * HUA UI 공통 색상 시스템\n * 중앙화된 색상 팔레트와 스타일 생성 유틸리티\n */\n\nimport type { Color } from \"../types/common\";\nimport { merge } from \"../utils\";\n\n/**\n * Tailwind CSS 색상 클래스 매핑\n * 각 색상의 50-900 단계를 정의합니다.\n */\nconst colorShades = {\n 50: \"50\",\n 100: \"100\",\n 200: \"200\",\n 300: \"300\",\n 400: \"400\",\n 500: \"500\",\n 600: \"600\",\n 700: \"700\",\n 800: \"800\",\n 900: \"900\",\n} as const;\n\ntype ColorShade = keyof typeof colorShades;\n\n/**\n * 색상별 클래스 생성 헬퍼\n */\nfunction colorClass(color: Color, shade: ColorShade, prefix: string = \"\"): string {\n return `${prefix}${color}-${colorShades[shade]}`;\n}\n\n/**\n * 다크 모드 지원 클래스 생성\n */\nfunction withDarkMode(lightClass: string, darkClass: string): string {\n return `${lightClass} dark:${darkClass}`;\n}\n\n/**\n * 색상 스타일 설정 인터페이스\n */\nexport interface ColorStyleConfig {\n /** 기본 variant 스타일 */\n default?: {\n border?: { light: ColorShade; dark?: ColorShade };\n background?: { light: ColorShade; dark?: ColorShade; opacity?: string };\n };\n /** 그라데이션 variant 스타일 */\n gradient?: {\n from?: ColorShade;\n to?: ColorShade;\n border?: { light: ColorShade; dark?: ColorShade };\n };\n /** 아웃라인 variant 스타일 */\n outline?: {\n border?: { light: ColorShade; dark?: ColorShade };\n background?: string;\n text?: { light: ColorShade; dark?: ColorShade };\n };\n /** Elevated variant 스타일 */\n elevated?: {\n border?: { light: ColorShade; dark?: ColorShade };\n background?: { light: string; dark: string };\n shadow?: string;\n };\n /** 아이콘 스타일 */\n icon?: {\n background?: { light: ColorShade; dark?: ColorShade; opacity?: string };\n text?: { light: ColorShade; dark?: ColorShade };\n };\n /** 배지 스타일 */\n badge?: {\n background?: { light: ColorShade; dark?: ColorShade; opacity?: string };\n text?: { light: ColorShade; dark?: ColorShade };\n };\n}\n\n/**\n * 생성된 색상 스타일 인터페이스\n */\nexport interface ColorStyles {\n default: string;\n gradient: string;\n outline: string;\n elevated: string;\n icon: string;\n badge: string;\n}\n\n/**\n * 기본 색상 스타일 설정\n * 각 색상에 대한 기본 스타일 템플릿\n */\nconst defaultColorConfig: Omit<ColorStyleConfig, \"gradient\"> = {\n default: {\n border: { light: 200, dark: 700 },\n background: { light: 50, dark: 900, opacity: \"50\" },\n },\n outline: {\n border: { light: 300, dark: 600 },\n background: \"transparent\",\n text: { light: 600, dark: 400 },\n },\n elevated: {\n border: { light: 200, dark: 700 },\n background: { light: \"white\", dark: \"gray-800\" },\n shadow: \"lg\",\n },\n icon: {\n background: { light: 100, dark: 900, opacity: \"30\" },\n text: { light: 600, dark: 400 },\n },\n badge: {\n background: { light: 50, dark: 900, opacity: \"30\" },\n text: { light: 700, dark: 300 },\n },\n};\n\n/**\n * 그라데이션 스타일 설정\n */\nconst gradientConfig: ColorStyleConfig[\"gradient\"] = {\n from: 500,\n to: 600,\n border: { light: 400, dark: 500 },\n};\n\n/**\n * 색상 스타일 생성 함수\n * \n * @param color - 색상 이름\n * @param config - 커스텀 스타일 설정 (선택사항)\n * @returns 생성된 색상 스타일 객체\n * \n * @example\n * ```tsx\n * const styles = createColorStyles(\"blue\");\n * // styles.default, styles.gradient, styles.outline 등 사용 가능\n * ```\n */\nexport function createColorStyles(\n color: Color,\n config?: Partial<ColorStyleConfig>\n): ColorStyles {\n const finalConfig: ColorStyleConfig = {\n default: config?.default || defaultColorConfig.default,\n gradient: config?.gradient || gradientConfig,\n outline: config?.outline || defaultColorConfig.outline,\n elevated: config?.elevated || defaultColorConfig.elevated,\n icon: config?.icon || defaultColorConfig.icon,\n badge: config?.badge || defaultColorConfig.badge,\n };\n\n // Default variant\n const defaultBorder = finalConfig.default?.border\n ? withDarkMode(\n `border-${colorClass(color, finalConfig.default.border.light)}`,\n `border-${colorClass(color, finalConfig.default.border.dark || finalConfig.default.border.light)}`\n )\n : \"\";\n \n const defaultBg = finalConfig.default?.background\n ? withDarkMode(\n `bg-${colorClass(color, finalConfig.default.background.light)}${finalConfig.default.background.opacity ? `/${finalConfig.default.background.opacity}` : \"\"}`,\n `bg-${colorClass(color, finalConfig.default.background.dark || finalConfig.default.background.light)}${finalConfig.default.background.opacity ? `/${finalConfig.default.background.opacity}` : \"\"}`\n )\n : \"\";\n\n const defaultStyle = merge(defaultBorder, defaultBg);\n\n // Gradient variant\n const gradientFrom = finalConfig.gradient?.from\n ? `from-${colorClass(color, finalConfig.gradient.from)}`\n : \"\";\n const gradientTo = finalConfig.gradient?.to\n ? `to-${colorClass(color, finalConfig.gradient.to)}`\n : \"\";\n const gradientBorder = finalConfig.gradient?.border\n ? withDarkMode(\n `border-${colorClass(color, finalConfig.gradient.border.light)}`,\n `border-${colorClass(color, finalConfig.gradient.border.dark || finalConfig.gradient.border.light)}`\n )\n : \"\";\n \n const gradientStyle = merge(\n \"bg-gradient-to-br\",\n gradientFrom,\n gradientTo,\n gradientBorder\n );\n\n // Outline variant\n const outlineBorder = finalConfig.outline?.border\n ? `border-2 ${withDarkMode(\n `border-${colorClass(color, finalConfig.outline.border.light)}`,\n `border-${colorClass(color, finalConfig.outline.border.dark || finalConfig.outline.border.light)}`\n )}`\n : \"\";\n const outlineBg = finalConfig.outline?.background || \"bg-transparent\";\n const outlineText = finalConfig.outline?.text\n ? withDarkMode(\n `text-${colorClass(color, finalConfig.outline.text.light)}`,\n `text-${colorClass(color, finalConfig.outline.text.dark || finalConfig.outline.text.light)}`\n )\n : \"\";\n \n const outlineStyle = merge(outlineBorder, outlineBg, outlineText);\n\n // Elevated variant\n const elevatedBorder = finalConfig.elevated?.border\n ? withDarkMode(\n `border-${colorClass(color, finalConfig.elevated.border.light)}`,\n `border-${colorClass(color, finalConfig.elevated.border.dark || finalConfig.elevated.border.light)}`\n )\n : \"\";\n const elevatedBg = finalConfig.elevated?.background\n ? withDarkMode(\n `bg-${finalConfig.elevated.background.light}`,\n `bg-${finalConfig.elevated.background.dark}`\n )\n : \"\";\n const elevatedShadow = finalConfig.elevated?.shadow\n ? `shadow-${finalConfig.elevated.shadow}`\n : \"\";\n \n const elevatedStyle = merge(elevatedBorder, elevatedBg, elevatedShadow);\n\n // Icon style\n const iconBg = finalConfig.icon?.background\n ? withDarkMode(\n `bg-${colorClass(color, finalConfig.icon.background.light)}${finalConfig.icon.background.opacity ? `/${finalConfig.icon.background.opacity}` : \"\"}`,\n `bg-${colorClass(color, finalConfig.icon.background.dark || finalConfig.icon.background.light)}${finalConfig.icon.background.opacity ? `/${finalConfig.icon.background.opacity}` : \"\"}`\n )\n : \"\";\n const iconText = finalConfig.icon?.text\n ? withDarkMode(\n `text-${colorClass(color, finalConfig.icon.text.light)}`,\n `text-${colorClass(color, finalConfig.icon.text.dark || finalConfig.icon.text.light)}`\n )\n : \"\";\n \n const iconStyle = merge(iconBg, iconText);\n\n // Badge style\n const badgeBg = finalConfig.badge?.background\n ? withDarkMode(\n `bg-${colorClass(color, finalConfig.badge.background.light)}${finalConfig.badge.background.opacity ? `/${finalConfig.badge.background.opacity}` : \"\"}`,\n `bg-${colorClass(color, finalConfig.badge.background.dark || finalConfig.badge.background.light)}${finalConfig.badge.background.opacity ? `/${finalConfig.badge.background.opacity}` : \"\"}`\n )\n : \"\";\n const badgeText = finalConfig.badge?.text\n ? withDarkMode(\n `text-${colorClass(color, finalConfig.badge.text.light)}`,\n `text-${colorClass(color, finalConfig.badge.text.dark || finalConfig.badge.text.light)}`\n )\n : \"\";\n \n const badgeStyle = merge(badgeBg, badgeText);\n\n return {\n default: defaultStyle,\n gradient: gradientStyle,\n outline: outlineStyle,\n elevated: elevatedStyle,\n icon: iconStyle,\n badge: badgeStyle,\n };\n}\n\n/**\n * 색상 스타일 캐시\n * 동일한 색상과 설정에 대해 재사용하여 성능 최적화\n */\nconst colorStylesCache = new Map<string, ColorStyles>();\n\n/**\n * 메모이제이션된 색상 스타일 생성 함수\n * \n * @param color - 색상 이름\n * @param config - 커스텀 스타일 설정 (선택사항)\n * @returns 생성된 색상 스타일 객체\n */\nexport function useColorStyles(\n color: Color,\n config?: Partial<ColorStyleConfig>\n): ColorStyles {\n const cacheKey = `${color}-${JSON.stringify(config || {})}`;\n \n if (!colorStylesCache.has(cacheKey)) {\n colorStylesCache.set(cacheKey, createColorStyles(color, config));\n }\n \n return colorStylesCache.get(cacheKey)!;\n}\n\n","/**\n * HUA UI 공통 Variant 시스템\n * 컴포넌트 variant 스타일 생성 유틸리티\n */\n\nimport type { ExtendedVariant, Size } from \"../types/common\";\nimport type { ColorStyles } from \"./colors\";\nimport { merge } from \"../utils\";\n\n/**\n * Variant 스타일 생성 함수\n * \n * @param variant - Variant 타입\n * @param colorStyles - 색상 스타일 객체\n * @returns 생성된 variant 클래스 문자열\n * \n * @example\n * ```tsx\n * const colorStyles = useColorStyles(\"blue\");\n * const variantClass = createVariantStyles(\"elevated\", colorStyles);\n * ```\n */\nexport function createVariantStyles(\n variant: ExtendedVariant,\n colorStyles: ColorStyles\n): string {\n const baseClasses = \"rounded-2xl border transition-all duration-200\";\n \n switch (variant) {\n case \"default\":\n return merge(baseClasses, colorStyles.default);\n \n case \"gradient\":\n return merge(baseClasses, \"text-white\", colorStyles.gradient);\n \n case \"outline\":\n return merge(baseClasses, colorStyles.outline);\n \n case \"elevated\":\n return merge(baseClasses, colorStyles.elevated);\n \n default:\n return baseClasses;\n }\n}\n\n/**\n * Size 스타일 설정 인터페이스\n */\nexport interface SizeStyles {\n container: string;\n icon: string;\n iconContainer: string;\n text: string;\n title: string;\n description: string;\n}\n\n/**\n * Size 스타일 생성 함수\n * \n * @param size - 크기 타입\n * @returns 생성된 size 스타일 객체\n * \n * @example\n * ```tsx\n * const sizeStyles = createSizeStyles(\"md\");\n * // sizeStyles.container, sizeStyles.icon 등 사용 가능\n * ```\n */\nexport function createSizeStyles(size: Size = \"md\"): SizeStyles {\n const sizeMap: Record<Size, SizeStyles> = {\n sm: {\n container: \"p-4\",\n icon: \"h-4 w-4\",\n iconContainer: \"w-8 h-8\",\n text: \"text-xs\",\n title: \"text-xs\",\n description: \"text-xs\",\n },\n md: {\n container: \"p-6\",\n icon: \"h-6 w-6\",\n iconContainer: \"w-12 h-12\",\n text: \"text-base\",\n title: \"text-sm\",\n description: \"text-sm\",\n },\n lg: {\n container: \"p-8\",\n icon: \"h-8 w-8\",\n iconContainer: \"w-16 h-16\",\n text: \"text-lg\",\n title: \"text-base\",\n description: \"text-base\",\n },\n xl: {\n container: \"p-10\",\n icon: \"h-10 w-10\",\n iconContainer: \"w-20 h-20\",\n text: \"text-xl\",\n title: \"text-lg\",\n description: \"text-lg\",\n },\n };\n \n return sizeMap[size];\n}\n\n/**\n * Rounded 스타일 타입\n */\nexport type Rounded = \"sm\" | \"md\" | \"lg\" | \"xl\" | \"full\" | \"none\";\n\n/**\n * Rounded 스타일 생성 함수\n * \n * @param rounded - Rounded 타입\n * @returns 생성된 rounded 클래스 문자열\n */\nexport function createRoundedStyles(rounded: Rounded = \"md\"): string {\n const roundedMap: Record<Rounded, string> = {\n sm: \"rounded\",\n md: \"rounded-md\",\n lg: \"rounded-lg\",\n xl: \"rounded-xl\",\n full: \"rounded-full\",\n none: \"rounded-none\",\n };\n \n return roundedMap[rounded];\n}\n\n/**\n * Shadow 스타일 타입\n */\nexport type Shadow = \"none\" | \"sm\" | \"md\" | \"lg\" | \"xl\" | \"2xl\";\n\n/**\n * Shadow 스타일 생성 함수\n * \n * @param shadow - Shadow 타입\n * @returns 생성된 shadow 클래스 문자열\n */\nexport function createShadowStyles(shadow: Shadow = \"md\"): string {\n if (shadow === \"none\") return \"\";\n \n return `shadow-${shadow}`;\n}\n\n/**\n * Hover 효과 타입\n */\nexport type HoverEffect = \"scale\" | \"glow\" | \"slide\" | \"springy\" | \"none\";\n\n/**\n * HUA-UI 스프링 이징\n * 공 튕기듯 아주 미세한 반동 - cubic-bezier(0.34, 1.56, 0.64, 1)\n */\nexport const HUA_SPRING_EASING = \"cubic-bezier(0.34, 1.56, 0.64, 1)\";\n\n/**\n * Hover 효과 스타일 생성 함수\n *\n * @param hover - Hover 효과 타입\n * @param reducedMotion - 애니메이션 축소 설정 여부\n * @returns 생성된 hover 클래스 문자열\n *\n * @description\n * HUA-UI 시그니처: \"스륵 부드럽고 아주 미세하게 쫀득\"\n * - 스프링 이징으로 미세한 반동 효과\n * - 1.5% 스케일 변화로 자연스러운 피드백\n */\nexport function createHoverStyles(\n hover: HoverEffect = \"springy\",\n reducedMotion: boolean = false\n): string {\n if (reducedMotion || hover === \"none\") return \"\";\n\n // 스프링 이징 스타일 (Tailwind arbitrary value)\n // HUA-UI 시그니처: 아주 미세한 스프링 반동 (쫀득한 느낌)\n const springTransition = \"[transition:transform_180ms_cubic-bezier(0.34,1.56,0.64,1),box-shadow_200ms_ease-out]\";\n\n const hoverMap: Record<HoverEffect, string> = {\n // HUA-UI 시그니처 스프링 효과 (기본값)\n // scale 1.5% + 미세한 shadow 추가로 입체감\n springy: `hover:scale-[1.015] hover:shadow-md active:scale-[0.985] ${springTransition} transform-gpu`,\n // scale만 (스프링 없음)\n scale: \"hover:scale-[1.015] active:scale-[0.985] transition-transform duration-150 ease-out transform-gpu\",\n // 글로우 효과 - shadow 강화\n glow: \"hover:shadow-lg hover:shadow-primary/25 transition-shadow duration-200\",\n // 슬라이드 효과 - 위로 살짝 뜨는 느낌 + shadow\n slide: `hover:-translate-y-0.5 hover:shadow-md ${springTransition} transform-gpu`,\n none: \"\",\n };\n\n return hoverMap[hover];\n}\n\n","/**\n * HUA UI 스타일 유틸리티 함수\n * 다크 모드, 그라데이션 등 공통 스타일 유틸리티\n */\n\nimport { merge } from \"../utils\";\n\n/**\n * 다크 모드 지원 클래스 생성\n * \n * @param lightClass - 라이트 모드 클래스\n * @param darkClass - 다크 모드 클래스\n * @returns 다크 모드 지원 클래스 문자열\n * \n * @example\n * ```tsx\n * withDarkMode(\"bg-white\", \"bg-gray-900\")\n * // \"bg-white dark:bg-gray-900\"\n * ```\n */\nexport function withDarkMode(lightClass: string, darkClass: string): string {\n return `${lightClass} dark:${darkClass}`;\n}\n\n/**\n * 그라데이션 클래스 생성\n * \n * @param from - 시작 색상\n * @param to - 끝 색상\n * @param direction - 그라데이션 방향 (기본값: \"to-r\")\n * @returns 그라데이션 클래스 문자열\n * \n * @example\n * ```tsx\n * createGradient(\"blue-500\", \"purple-600\")\n * // \"bg-gradient-to-r from-blue-500 to-purple-600\"\n * ```\n */\nexport function createGradient(\n from: string,\n to: string,\n direction: \"to-r\" | \"to-l\" | \"to-b\" | \"to-t\" | \"to-br\" | \"to-bl\" | \"to-tr\" | \"to-tl\" = \"to-r\"\n): string {\n return merge(`bg-gradient-${direction}`, `from-${from}`, `to-${to}`);\n}\n\n/**\n * 불투명도가 포함된 색상 클래스 생성\n * \n * @param color - 색상 클래스 (예: \"blue-500\")\n * @param opacity - 불투명도 (0-100)\n * @returns 불투명도가 포함된 색상 클래스\n * \n * @example\n * ```tsx\n * withOpacity(\"blue-500\", 50)\n * // \"blue-500/50\"\n * ```\n */\nexport function withOpacity(color: string, opacity: number): string {\n return `${color}/${opacity}`;\n}\n\n/**\n * 텍스트 색상이 그라데이션 variant일 때 흰색으로 변경하는지 확인\n * \n * @param variant - Variant 타입\n * @returns 텍스트가 흰색이어야 하는지 여부\n */\nexport function isTextWhite(variant: string): boolean {\n return variant === \"gradient\" || variant === \"solid\";\n}\n\n/**\n * 그라데이션 variant인지 확인\n * \n * @param variant - Variant 타입\n * @returns 그라데이션 variant인지 여부\n */\nexport function isGradientVariant(variant: string): boolean {\n return variant === \"gradient\";\n}\n\n/**\n * 반응형 클래스 생성 헬퍼\n * \n * @param base - 기본 클래스\n * @param sm - 작은 화면 클래스\n * @param md - 중간 화면 클래스\n * @param lg - 큰 화면 클래스\n * @param xl - 매우 큰 화면 클래스\n * @returns 반응형 클래스 문자열\n * \n * @example\n * ```tsx\n * responsive(\"text-sm\", \"md:text-base\", \"lg:text-lg\")\n * ```\n */\nexport function responsive(\n base: string,\n sm?: string,\n md?: string,\n lg?: string,\n xl?: string\n): string {\n return merge(\n base,\n sm && `sm:${sm}`,\n md && `md:${md}`,\n lg && `lg:${lg}`,\n xl && `xl:${xl}`\n );\n}\n\n/**\n * 조건부 클래스 적용\n * \n * @param condition - 조건\n * @param trueClass - 조건이 true일 때 적용할 클래스\n * @param falseClass - 조건이 false일 때 적용할 클래스 (선택사항)\n * @returns 조건에 따라 선택된 클래스\n */\nexport function conditionalClass(\n condition: boolean,\n trueClass: string,\n falseClass?: string\n): string {\n return condition ? trueClass : (falseClass || \"\");\n}\n\n","/**\n * HUA-UI 마이크로 모션 프리셋\n *\n * 핵심 철학: \"스륵 부드럽고 아주 조금 쫀득\"\n * - 스륵: 자연스럽고 부드러운 시작/끝\n * - 쫀득: 약간의 오버슈트로 생동감\n */\n\nimport type { MicroMotionPreset, SpringConfig, MicroMotionConfig } from './types'\n\n/**\n * 스프링 물리 프리셋\n * CSS cubic-bezier로 근사화된 값들\n */\nexport const SPRING_CONFIGS: Record<MicroMotionPreset, SpringConfig> = {\n subtle: {\n stiffness: 400,\n damping: 30,\n mass: 1,\n },\n soft: {\n stiffness: 300,\n damping: 25,\n mass: 1,\n },\n springy: {\n stiffness: 350,\n damping: 20,\n mass: 0.8,\n },\n bouncy: {\n stiffness: 400,\n damping: 15,\n mass: 0.7,\n },\n snappy: {\n stiffness: 500,\n damping: 35,\n mass: 0.5,\n },\n}\n\n/**\n * CSS easing 함수 (스프링 근사)\n * 각 프리셋에 맞는 cubic-bezier 값\n */\nexport const EASING_FUNCTIONS: Record<MicroMotionPreset, string> = {\n // 미세한 반응 - 거의 linear에 가까움\n subtle: 'cubic-bezier(0.25, 0.1, 0.25, 1)',\n // 부드러운 ease-out\n soft: 'cubic-bezier(0.22, 1, 0.36, 1)',\n // 약간의 오버슈트 (쫀득!)\n springy: 'cubic-bezier(0.34, 1.56, 0.64, 1)',\n // 더 큰 오버슈트\n bouncy: 'cubic-bezier(0.68, -0.55, 0.265, 1.55)',\n // 빠르고 날카로운\n snappy: 'cubic-bezier(0.19, 1, 0.22, 1)',\n}\n\n/**\n * 기본 지속시간 (ms)\n */\nexport const DURATIONS: Record<MicroMotionPreset, number> = {\n subtle: 150,\n soft: 250,\n springy: 300,\n bouncy: 400,\n snappy: 180,\n}\n\n/**\n * HUA-UI 기본 마이크로 모션 설정\n * \"스륵 쫀득\"의 정수 - 아주 미세하게!\n */\nexport const HUA_DEFAULT_MOTION: MicroMotionConfig = {\n preset: 'springy',\n duration: 180,\n scale: 0.008, // 0.8% 스케일 변화 (아주아주 미세)\n translateY: -0.5, // 0.5px 위로 살짝\n}\n\n/**\n * 컴포넌트별 기본 모션 설정\n * 아주 미세한 반동으로 생동감 있게\n */\nexport const COMPONENT_MOTION_DEFAULTS = {\n button: {\n preset: 'springy' as MicroMotionPreset,\n duration: 180,\n scale: 0.008, // 0.8% - 아주아주 미세\n translateY: -0.5, // 0.5px\n },\n card: {\n preset: 'soft' as MicroMotionPreset,\n duration: 220,\n scale: 0.005, // 0.5%\n translateY: -1,\n },\n menuItem: {\n preset: 'subtle' as MicroMotionPreset,\n duration: 150,\n translateX: 1, // 1px\n },\n modal: {\n preset: 'springy' as MicroMotionPreset,\n duration: 250,\n scale: 0.01,\n },\n dropdown: {\n preset: 'soft' as MicroMotionPreset,\n duration: 180,\n translateY: -2,\n },\n tooltip: {\n preset: 'snappy' as MicroMotionPreset,\n duration: 120,\n scale: 0.02,\n },\n checkbox: {\n preset: 'springy' as MicroMotionPreset,\n duration: 200,\n scale: 0.03, // 체크박스는 조금 더\n },\n switch: {\n preset: 'springy' as MicroMotionPreset,\n duration: 180,\n },\n}\n\n/**\n * CSS 변수로 사용할 수 있는 기본값들\n * 미세한 스프링 반동 느낌\n */\nexport const CSS_MOTION_VARS = {\n '--hua-motion-duration': '180ms',\n '--hua-motion-easing': EASING_FUNCTIONS.springy,\n '--hua-motion-scale-hover': '1.008', // 0.8% 확대 (아주아주 미세)\n '--hua-motion-scale-active': '0.992', // 0.8% 축소\n '--hua-motion-translate-y': '-0.5px',\n} as const\n","'use client'\n\nimport { useState, useCallback, useMemo, useRef, useEffect } from 'react'\nimport type {\n MicroMotionConfig,\n MicroMotionState,\n MicroMotionStyle,\n MicroMotionPreset,\n} from './types'\nimport { EASING_FUNCTIONS, DURATIONS, HUA_DEFAULT_MOTION } from './presets'\n\nexport interface UseMicroMotionOptions extends MicroMotionConfig {\n /** hover 시 모션 활성화 */\n enableHover?: boolean\n /** press 시 모션 활성화 */\n enablePress?: boolean\n /** focus 시 모션 활성화 */\n enableFocus?: boolean\n}\n\nexport interface UseMicroMotionReturn {\n /** 모션 상태 */\n state: MicroMotionState\n /** 적용할 스타일 */\n style: MicroMotionStyle\n /** 이벤트 핸들러들 */\n handlers: {\n onMouseEnter: () => void\n onMouseLeave: () => void\n onMouseDown: () => void\n onMouseUp: () => void\n onFocus: () => void\n onBlur: () => void\n }\n /** CSS 클래스 (Tailwind 호환) */\n className: string\n}\n\n/**\n * HUA-UI 마이크로 모션 훅\n *\n * \"스륵 부드럽고 쫀득\" 모션을 적용하는 훅\n *\n * @example\n * ```tsx\n * const { handlers, style, className } = useMicroMotion({ preset: 'springy' })\n *\n * return (\n * <button\n * {...handlers}\n * style={style}\n * className={className}\n * >\n * Click me\n * </button>\n * )\n * ```\n */\nexport function useMicroMotion(\n options: UseMicroMotionOptions = {}\n): UseMicroMotionReturn {\n const {\n preset = HUA_DEFAULT_MOTION.preset || 'springy',\n duration = DURATIONS[preset as MicroMotionPreset] || 200,\n delay = 0,\n scale = HUA_DEFAULT_MOTION.scale || 0.02,\n translateY = HUA_DEFAULT_MOTION.translateY || 0,\n translateX = 0,\n rotate = 0,\n disabled = false,\n enableHover = true,\n enablePress = true,\n enableFocus = false,\n } = options\n\n const [state, setState] = useState<MicroMotionState>({\n isHovered: false,\n isPressed: false,\n isFocused: false,\n isAnimating: false,\n })\n\n const animationTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n // 애니메이션 상태 업데이트\n const setAnimating = useCallback((isAnimating: boolean) => {\n if (animationTimeoutRef.current) {\n clearTimeout(animationTimeoutRef.current)\n }\n\n if (isAnimating) {\n setState(prev => ({ ...prev, isAnimating: true }))\n animationTimeoutRef.current = setTimeout(() => {\n setState(prev => ({ ...prev, isAnimating: false }))\n }, duration + delay)\n } else {\n setState(prev => ({ ...prev, isAnimating: false }))\n }\n }, [duration, delay])\n\n // 이벤트 핸들러들\n const handlers = useMemo(() => ({\n onMouseEnter: () => {\n if (disabled || !enableHover) return\n setState(prev => ({ ...prev, isHovered: true }))\n setAnimating(true)\n },\n onMouseLeave: () => {\n if (disabled) return\n setState(prev => ({ ...prev, isHovered: false, isPressed: false }))\n setAnimating(true)\n },\n onMouseDown: () => {\n if (disabled || !enablePress) return\n setState(prev => ({ ...prev, isPressed: true }))\n setAnimating(true)\n },\n onMouseUp: () => {\n if (disabled) return\n setState(prev => ({ ...prev, isPressed: false }))\n setAnimating(true)\n },\n onFocus: () => {\n if (disabled || !enableFocus) return\n setState(prev => ({ ...prev, isFocused: true }))\n setAnimating(true)\n },\n onBlur: () => {\n if (disabled) return\n setState(prev => ({ ...prev, isFocused: false }))\n setAnimating(true)\n },\n }), [disabled, enableHover, enablePress, enableFocus, setAnimating])\n\n // 스타일 계산\n const style = useMemo<MicroMotionStyle>(() => {\n if (disabled) {\n return {\n transform: 'none',\n transition: 'none',\n willChange: 'auto',\n }\n }\n\n const transforms: string[] = []\n const easing = EASING_FUNCTIONS[preset as MicroMotionPreset] || EASING_FUNCTIONS.springy\n\n // Hover 상태\n if (state.isHovered && !state.isPressed) {\n if (scale) transforms.push(`scale(${1 + scale})`)\n if (translateY) transforms.push(`translateY(${translateY}px)`)\n if (translateX) transforms.push(`translateX(${translateX}px)`)\n if (rotate) transforms.push(`rotate(${rotate}deg)`)\n }\n\n // Press 상태 (hover보다 우선)\n if (state.isPressed) {\n // 눌렸을 때는 살짝 작아지고 내려감\n if (scale) transforms.push(`scale(${1 - scale * 0.5})`)\n if (translateY) transforms.push(`translateY(${Math.abs(translateY) * 0.5}px)`)\n }\n\n // Focus 상태\n if (state.isFocused && !state.isHovered && !state.isPressed) {\n if (scale) transforms.push(`scale(${1 + scale * 0.5})`)\n }\n\n return {\n transform: transforms.length > 0 ? transforms.join(' ') : 'none',\n transition: `transform ${duration}ms ${easing} ${delay}ms`,\n willChange: state.isAnimating ? 'transform' : 'auto',\n }\n }, [state, disabled, preset, duration, delay, scale, translateY, translateX, rotate])\n\n // Tailwind 호환 클래스\n const className = useMemo(() => {\n if (disabled) return ''\n\n const classes: string[] = [\n 'transform-gpu', // GPU 가속\n ]\n\n return classes.join(' ')\n }, [disabled])\n\n // 클린업\n useEffect(() => {\n return () => {\n if (animationTimeoutRef.current) {\n clearTimeout(animationTimeoutRef.current)\n }\n }\n }, [])\n\n return {\n state,\n style,\n handlers,\n className,\n }\n}\n\n/**\n * 간단한 CSS-only 마이크로 모션 클래스 생성기\n *\n * motion-core 없이도 \"스륵 쫀득\" 느낌을 주는 Tailwind 클래스\n */\nexport function getMicroMotionClasses(\n preset: MicroMotionPreset = 'springy',\n options: {\n enableHover?: boolean\n enableActive?: boolean\n enableFocus?: boolean\n } = {}\n): string {\n const { enableHover = true, enableActive = true, enableFocus = false } = options\n\n const baseClasses = ['transform-gpu', 'transition-transform']\n\n // 지속시간\n const durationClass = {\n subtle: 'duration-150',\n soft: 'duration-250',\n springy: 'duration-200',\n bouncy: 'duration-300',\n snappy: 'duration-150',\n }[preset]\n\n baseClasses.push(durationClass)\n\n // Hover 효과\n if (enableHover) {\n baseClasses.push('hover:scale-[1.02]', 'hover:-translate-y-0.5')\n }\n\n // Active 효과\n if (enableActive) {\n baseClasses.push('active:scale-[0.98]', 'active:translate-y-0')\n }\n\n // Focus 효과\n if (enableFocus) {\n baseClasses.push('focus:scale-[1.01]')\n }\n\n return baseClasses.join(' ')\n}\n","\"use client\";\n\nimport { useRef, useState, useEffect, useCallback } from \"react\";\n\n/**\n * useInView 훅의 옵션 / useInView hook options\n * @property {number} [threshold=0] - 뷰포트 진입 임계값 (0-1) / Viewport entry threshold\n * @property {string} [rootMargin=\"0px\"] - 루트 마진 / Root margin\n * @property {boolean} [triggerOnce=false] - 한 번만 트리거 / Trigger only once\n * @property {(entry: IntersectionObserverEntry) => void} [onChange] - 상태 변경 콜백 / State change callback\n */\nexport interface UseInViewOptions {\n threshold?: number | number[];\n rootMargin?: string;\n triggerOnce?: boolean;\n onChange?: (entry: IntersectionObserverEntry) => void;\n}\n\n/**\n * useInView 훅의 반환값 / useInView hook return value\n */\nexport interface UseInViewReturn<T extends HTMLElement = HTMLElement> {\n ref: React.RefObject<T | null>;\n inView: boolean;\n entry: IntersectionObserverEntry | null;\n}\n\n/**\n * useInView 훅 / useInView hook\n *\n * 요소가 뷰포트에 진입했는지 감지하는 훅입니다.\n * 애니메이션 트리거, 레이지 로딩, 무한 스크롤 등에 사용합니다.\n *\n * Hook that detects when an element enters the viewport.\n * Used for animation triggers, lazy loading, infinite scroll, etc.\n *\n * @example\n * // 기본 사용 / Basic usage\n * const { ref, inView } = useInView();\n *\n * return (\n * <div ref={ref} className={inView ? \"animate-in\" : \"opacity-0\"}>\n * Content\n * </div>\n * );\n *\n * @example\n * // 한 번만 트리거 / Trigger once\n * const { ref, inView } = useInView({ triggerOnce: true, threshold: 0.5 });\n */\nexport function useInView<T extends HTMLElement = HTMLElement>(\n options: UseInViewOptions = {}\n): UseInViewReturn<T> {\n const {\n threshold = 0,\n rootMargin = \"0px\",\n triggerOnce = false,\n onChange,\n } = options;\n\n const ref = useRef<T>(null);\n const [inView, setInView] = useState(false);\n const [entry, setEntry] = useState<IntersectionObserverEntry | null>(null);\n const frozenRef = useRef(false);\n\n useEffect(() => {\n const element = ref.current;\n if (!element) return;\n\n // Skip if already triggered once\n if (triggerOnce && frozenRef.current) return;\n\n const observer = new IntersectionObserver(\n ([entry]) => {\n const isInView = entry.isIntersecting;\n\n // Handle triggerOnce\n if (triggerOnce && isInView) {\n frozenRef.current = true;\n }\n\n setInView(isInView);\n setEntry(entry);\n onChange?.(entry);\n },\n { threshold, rootMargin }\n );\n\n observer.observe(element);\n\n return () => {\n observer.disconnect();\n };\n }, [threshold, rootMargin, triggerOnce, onChange]);\n\n return { ref, inView, entry };\n}\n\nexport default useInView;\n","\"use client\";\n\nimport { useState, useEffect, useRef, useCallback } from \"react\";\n\n/**\n * useScrollProgress 훅의 옵션 / useScrollProgress hook options\n * @property {\"page\" | \"element\"} [target=\"page\"] - 추적 대상 / Tracking target\n * @property {number} [throttle=16] - 쓰로틀 간격 (ms) / Throttle interval\n */\nexport interface UseScrollProgressOptions {\n target?: \"page\" | \"element\";\n throttle?: number;\n}\n\n/**\n * useScrollProgress 훅의 반환값 / useScrollProgress hook return value\n */\nexport interface UseScrollProgressReturn<T extends HTMLElement = HTMLElement> {\n ref: React.RefObject<T | null>;\n progress: number;\n scrollY: number;\n scrollX: number;\n isScrolling: boolean;\n direction: \"up\" | \"down\" | null;\n}\n\n/**\n * useScrollProgress 훅 / useScrollProgress hook\n *\n * 페이지 또는 요소의 스크롤 진행률을 추적하는 훅입니다.\n * 스크롤 기반 애니메이션, 진행률 표시 등에 사용합니다.\n *\n * Hook that tracks scroll progress of page or element.\n * Used for scroll-based animations, progress indicators, etc.\n *\n * @example\n * // 페이지 스크롤 / Page scroll\n * const { progress, direction } = useScrollProgress();\n *\n * return (\n * <div style={{ width: `${progress * 100}%` }} className=\"progress-bar\" />\n * );\n *\n * @example\n * // 요소 스크롤 / Element scroll\n * const { ref, progress } = useScrollProgress({ target: \"element\" });\n *\n * return (\n * <div ref={ref} className=\"overflow-auto h-[400px]\">\n * <p>Progress: {Math.round(progress * 100)}%</p>\n * </div>\n * );\n */\nexport function useScrollProgress<T extends HTMLElement = HTMLElement>(\n options: UseScrollProgressOptions = {}\n): UseScrollProgressReturn<T> {\n const { target = \"page\", throttle = 16 } = options;\n\n const ref = useRef<T>(null);\n const [progress, setProgress] = useState(0);\n const [scrollY, setScrollY] = useState(0);\n const [scrollX, setScrollX] = useState(0);\n const [isScrolling, setIsScrolling] = useState(false);\n const [direction, setDirection] = useState<\"up\" | \"down\" | null>(null);\n\n const lastScrollY = useRef(0);\n const scrollTimeout = useRef<ReturnType<typeof setTimeout> | null>(null);\n const lastUpdate = useRef(0);\n\n const calculateProgress = useCallback(() => {\n const now = Date.now();\n if (now - lastUpdate.current < throttle) return;\n lastUpdate.current = now;\n\n if (target === \"page\") {\n const scrollTop = window.scrollY;\n const docHeight = document.documentElement.scrollHeight - window.innerHeight;\n const newProgress = docHeight > 0 ? Math.min(scrollTop / docHeight, 1) : 0;\n\n setProgress(newProgress);\n setScrollY(scrollTop);\n setScrollX(window.scrollX);\n setDirection(scrollTop > lastScrollY.current ? \"down\" : \"up\");\n lastScrollY.current = scrollTop;\n } else if (ref.current) {\n const element = ref.current;\n const scrollTop = element.scrollTop;\n const scrollHeight = element.scrollHeight - element.clientHeight;\n const newProgress = scrollHeight > 0 ? Math.min(scrollTop / scrollHeight, 1) : 0;\n\n setProgress(newProgress);\n setScrollY(scrollTop);\n setScrollX(element.scrollLeft);\n setDirection(scrollTop > lastScrollY.current ? \"down\" : \"up\");\n lastScrollY.current = scrollTop;\n }\n\n setIsScrolling(true);\n if (scrollTimeout.current) clearTimeout(scrollTimeout.current);\n scrollTimeout.current = setTimeout(() => {\n setIsScrolling(false);\n }, 150);\n }, [target, throttle]);\n\n useEffect(() => {\n if (target === \"page\") {\n // Initial calculation\n calculateProgress();\n\n window.addEventListener(\"scroll\", calculateProgress, { passive: true });\n window.addEventListener(\"resize\", calculateProgress, { passive: true });\n\n return () => {\n window.removeEventListener(\"scroll\", calculateProgress);\n window.removeEventListener(\"resize\", calculateProgress);\n if (scrollTimeout.current) clearTimeout(scrollTimeout.current);\n };\n } else {\n const element = ref.current;\n if (!element) return;\n\n element.addEventListener(\"scroll\", calculateProgress, { passive: true });\n\n return () => {\n element.removeEventListener(\"scroll\", calculateProgress);\n if (scrollTimeout.current) clearTimeout(scrollTimeout.current);\n };\n }\n }, [target, calculateProgress]);\n\n return { ref, progress, scrollY, scrollX, isScrolling, direction };\n}\n\nexport default useScrollProgress;\n","\"use client\";\n\nimport { useState, useEffect, useRef, useCallback } from \"react\";\n\n/**\n * useMouse 훅의 옵션 / useMouse hook options\n * @property {\"page\" | \"element\" | \"viewport\"} [type=\"page\"] - 좌표 타입 / Coordinate type\n * @property {boolean} [touch=false] - 터치 이벤트 포함 / Include touch events\n * @property {number} [throttle=0] - 쓰로틀 간격 (ms) / Throttle interval\n */\nexport interface UseMouseOptions {\n type?: \"page\" | \"element\" | \"viewport\";\n touch?: boolean;\n throttle?: number;\n}\n\n/**\n * useMouse 훅의 반환값 / useMouse hook return value\n */\nexport interface UseMouseReturn<T extends HTMLElement = HTMLElement> {\n ref: React.RefObject<T | null>;\n x: number;\n y: number;\n elementX: number;\n elementY: number;\n elementPositionX: number;\n elementPositionY: number;\n isInside: boolean;\n isMoving: boolean;\n}\n\n/**\n * useMouse 훅 / useMouse hook\n *\n * 마우스 위치를 추적하는 훅입니다.\n * 커서 효과, 마우스 따라다니는 요소 등에 사용합니다.\n *\n * Hook that tracks mouse position.\n * Used for cursor effects, mouse-following elements, etc.\n *\n * @example\n * // 전역 마우스 위치 / Global mouse position\n * const { x, y } = useMouse();\n *\n * return (\n * <div style={{ transform: `translate(${x}px, ${y}px)` }} className=\"cursor\" />\n * );\n *\n * @example\n * // 요소 내 상대 위치 / Relative position in element\n * const { ref, elementX, elementY, isInside } = useMouse({ type: \"element\" });\n *\n * return (\n * <div ref={ref} className=\"relative\">\n * {isInside && (\n * <div style={{ left: elementX, top: elementY }} className=\"spotlight\" />\n * )}\n * </div>\n * );\n */\nexport function useMouse<T extends HTMLElement = HTMLElement>(\n options: UseMouseOptions = {}\n): UseMouseReturn<T> {\n const { type = \"page\", touch = false, throttle = 0 } = options;\n\n const ref = useRef<T>(null);\n const [state, setState] = useState({\n x: 0,\n y: 0,\n elementX: 0,\n elementY: 0,\n elementPositionX: 0,\n elementPositionY: 0,\n isInside: false,\n isMoving: false,\n });\n\n const lastUpdate = useRef(0);\n const moveTimeout = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const handleMove = useCallback(\n (clientX: number, clientY: number) => {\n const now = Date.now();\n if (throttle > 0 && now - lastUpdate.current < throttle) return;\n lastUpdate.current = now;\n\n let x = clientX;\n let y = clientY;\n let elementX = 0;\n let elementY = 0;\n let elementPositionX = 0;\n let elementPositionY = 0;\n let isInside = false;\n\n // Calculate page coordinates\n if (type === \"page\") {\n x = clientX + window.scrollX;\n y = clientY + window.scrollY;\n }\n\n // Calculate element-relative coordinates\n if (ref.current) {\n const rect = ref.current.getBoundingClientRect();\n elementX = clientX - rect.left;\n elementY = clientY - rect.top;\n elementPositionX = elementX / rect.width; // 0-1 normalized\n elementPositionY = elementY / rect.height; // 0-1 normalized\n isInside =\n clientX >= rect.left &&\n clientX <= rect.right &&\n clientY >= rect.top &&\n clientY <= rect.bottom;\n }\n\n setState({\n x,\n y,\n elementX,\n elementY,\n elementPositionX,\n elementPositionY,\n isInside,\n isMoving: true,\n });\n\n if (moveTimeout.current) clearTimeout(moveTimeout.current);\n moveTimeout.current = setTimeout(() => {\n setState((prev) => ({ ...prev, isMoving: false }));\n }, 150);\n },\n [type, throttle]\n );\n\n useEffect(() => {\n const handleMouseMove = (e: MouseEvent) => {\n handleMove(e.clientX, e.clientY);\n };\n\n const handleTouchMove = (e: TouchEvent) => {\n if (e.touches.length > 0) {\n handleMove(e.touches[0].clientX, e.touches[0].clientY);\n }\n };\n\n window.addEventListener(\"mousemove\", handleMouseMove, { passive: true });\n if (touch) {\n window.addEventListener(\"touchmove\", handleTouchMove, { passive: true });\n }\n\n return () => {\n window.removeEventListener(\"mousemove\", handleMouseMove);\n if (touch) {\n window.removeEventListener(\"touchmove\", handleTouchMove);\n }\n if (moveTimeout.current) clearTimeout(moveTimeout.current);\n };\n }, [handleMove, touch]);\n\n return {\n ref,\n ...state,\n };\n}\n\nexport default useMouse;\n","\"use client\";\n\nimport { useState, useEffect } from \"react\";\n\n/**\n * useReducedMotion 훅 / useReducedMotion hook\n *\n * 사용자의 모션 감소 선호 설정을 감지하는 훅입니다.\n * 접근성을 위해 애니메이션을 조건부로 적용할 때 사용합니다.\n *\n * Hook that detects user's reduced motion preference.\n * Used for conditionally applying animations for accessibility.\n *\n * @returns {boolean} 모션 감소 선호 여부 / Whether reduced motion is preferred\n *\n * @example\n * const prefersReducedMotion = useReducedMotion();\n *\n * return (\n * <div\n * className={prefersReducedMotion ? \"\" : \"animate-bounce\"}\n * style={{ transition: prefersReducedMotion ? \"none\" : \"all 0.3s\" }}\n * >\n * Content\n * </div>\n * );\n *\n * @example\n * // 조건부 애니메이션 / Conditional animation\n * const prefersReducedMotion = useReducedMotion();\n *\n * const variants = {\n * initial: { opacity: 0, y: prefersReducedMotion ? 0 : 20 },\n * animate: { opacity: 1, y: 0 },\n * };\n */\nexport function useReducedMotion(): boolean {\n const [prefersReducedMotion, setPrefersReducedMotion] = useState(false);\n\n useEffect(() => {\n // Check if window is available (SSR safety)\n if (typeof window === \"undefined\") return;\n\n const mediaQuery = window.matchMedia(\"(prefers-reduced-motion: reduce)\");\n\n // Set initial value\n setPrefersReducedMotion(mediaQuery.matches);\n\n // Listen for changes\n const handleChange = (e: MediaQueryListEvent) => {\n setPrefersReducedMotion(e.matches);\n };\n\n mediaQuery.addEventListener(\"change\", handleChange);\n\n return () => {\n mediaQuery.removeEventListener(\"change\", handleChange);\n };\n }, []);\n\n return prefersReducedMotion;\n}\n\nexport default useReducedMotion;\n","\"use client\";\n\nimport { useState, useEffect, useCallback } from \"react\";\n\n/**\n * useWindowSize 훅의 반환값 / useWindowSize hook return value\n */\nexport interface UseWindowSizeReturn {\n width: number;\n height: number;\n isMobile: boolean;\n isTablet: boolean;\n isDesktop: boolean;\n}\n\n/**\n * useWindowSize 훅의 옵션 / useWindowSize hook options\n */\nexport interface UseWindowSizeOptions {\n throttle?: number;\n mobileBreakpoint?: number;\n tabletBreakpoint?: number;\n}\n\n/**\n * useWindowSize 훅 / useWindowSize hook\n *\n * 윈도우 크기를 추적하는 훅입니다.\n * 반응형 애니메이션, 조건부 렌더링 등에 사용합니다.\n *\n * Hook that tracks window size.\n * Used for responsive animations, conditional rendering, etc.\n *\n * @example\n * const { width, height, isMobile } = useWindowSize();\n *\n * return (\n * <div style={{ fontSize: isMobile ? \"14px\" : \"16px\" }}>\n * Window: {width} x {height}\n * </div>\n * );\n */\nexport function useWindowSize(options: UseWindowSizeOptions = {}): UseWindowSizeReturn {\n const {\n throttle = 100,\n mobileBreakpoint = 768,\n tabletBreakpoint = 1024,\n } = options;\n\n const [size, setSize] = useState<UseWindowSizeReturn>({\n width: typeof window !== \"undefined\" ? window.innerWidth : 0,\n height: typeof window !== \"undefined\" ? window.innerHeight : 0,\n isMobile: false,\n isTablet: false,\n isDesktop: true,\n });\n\n const updateSize = useCallback(() => {\n const width = window.innerWidth;\n const height = window.innerHeight;\n\n setSize({\n width,\n height,\n isMobile: width < mobileBreakpoint,\n isTablet: width >= mobileBreakpoint && width < tabletBreakpoint,\n isDesktop: width >= tabletBreakpoint,\n });\n }, [mobileBreakpoint, tabletBreakpoint]);\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n\n // Initial update\n updateSize();\n\n let timeoutId: NodeJS.Timeout;\n\n const handleResize = () => {\n clearTimeout(timeoutId);\n timeoutId = setTimeout(updateSize, throttle);\n };\n\n window.addEventListener(\"resize\", handleResize, { passive: true });\n\n return () => {\n window.removeEventListener(\"resize\", handleResize);\n clearTimeout(timeoutId);\n };\n }, [updateSize, throttle]);\n\n return size;\n}\n\nexport default useWindowSize;\n"]}
1
+ {"version":3,"sources":["../src/lib/utils.ts","../src/components/Button.variants.ts","../src/lib/Slot.tsx","../src/components/Button.tsx","../src/components/Action.tsx","../src/lib/styles/cva-base.ts","../src/components/Input.tsx","../src/components/NumberInput.tsx","../src/components/Link.tsx","../src/lib/icons.ts","../src/lib/case-utils.ts","../src/lib/icon-providers.ts","../src/lib/icon-aliases.ts","../src/lib/normalize-icon-name.ts","../src/components/Icon/icon-store.ts","../src/components/Icon/IconProvider.tsx","../src/components/Icon/Icon.tsx","../src/components/Avatar.tsx","../src/components/Modal.tsx","../src/components/Container.tsx","../src/components/Grid.tsx","../src/components/Stack.tsx","../src/components/Divider.tsx","../src/components/Card.tsx","../src/components/Panel.tsx","../src/components/ActionToolbar.tsx","../src/components/Breadcrumb.tsx","../src/components/ComponentLayout.tsx","../src/components/Badge.tsx","../src/components/Progress.tsx","../src/components/Skeleton.tsx","../src/components/Alert.tsx","../src/components/Toast.tsx","../src/components/LoadingSpinner.tsx","../src/components/Tooltip.tsx","../src/components/Label.tsx","../src/components/Switch.tsx","../src/components/Toggle.tsx","../src/components/ScrollArea.tsx","../src/hooks/useScrollToggle.ts","../src/components/ScrollToTop.tsx","../src/components/ThemeProvider.tsx","../src/components/ThemeToggle.tsx","../src/lib/icon-names.ts","../src/lib/styles/colors.ts","../src/lib/styles/variants.ts","../src/lib/styles/utils.ts","../src/lib/motion/presets.ts","../src/lib/motion/useMicroMotion.ts","../src/hooks/useInView.ts","../src/hooks/useScrollProgress.ts","../src/hooks/useMouse.ts","../src/hooks/useReducedMotion.ts","../src/hooks/useWindowSize.ts"],"names":["merge","inputs","twMerge","clsx","mergeIf","condition","trueClass","falseClass","formatRelativeTime","timestamp","locale","date","diff","minutes","hours","days","mergeMap","classMap","classes","className","cn","springTransition","buttonVariants","cva","gradientPresets","composeRefs","refs","node","ref","composeEventHandlers","parentHandler","childHandler","event","mergeClassName","slotClassName","childClassName","mergeStyle","slotStyle","childStyle","mergeProps","slotProps","childProps","mergedProps","propName","slotValue","childValue","isSlottable","child","React","Slot","children","forwardedRef","childArray","childRef","mergedRef","isBrowser","useReducedMotion","reduce","setReduce","_a","mq","onChange","ButtonInner","variant","size","loading","icon","iconPosition","gradient","customGradient","rounded","shadow","hover","fullWidth","iconOnly","disabled","asChild","rest","reduced","gradientClass","base","content","jsxs","Fragment","jsx","onClick","target","rel","href","_ariaLabel","anchorClassName","anchorProps","isDisabled","handleAnchorClick","e","buttonClassName","btnProps","Button","Action","actionType","feedback","particleEffect","rippleEffect","soundEffect","hapticFeedback","transparency","blurIntensity","glowIntensity","glowColor","runEffects","AudioContextClass","audioContext","oscillator","gainNode","button","rect","x","y","ripple","style","i","particle","angle","velocity","vx","vy","styleVars","cls","anchorRest","btnRest","FORM_STATE","inputVariants","Input","type","error","success","props","ariaInvalid","isInvalid","NumberInput","controlledValue","defaultValue","min","max","step","showButtons","buttonLayout","internalValue","setInternalValue","isControlled","currentValue","updateValue","newValue","clampedValue","increment","decrement","handleInputChange","inputValue","handleBlur","handleKeyDown","sizes","buttonBase","canDecrement","canIncrement","ChevronUp","ChevronDown","Minus","Plus","linkVariants","Link","external","icons","House","ArrowLeft","ArrowRight","ArrowUp","ArrowDown","ListIcon","X","MagnifyingGlass","Gear","ArrowSquareOut","CaretLeft","CaretRight","CaretDown","CaretUp","Pencil","Trash","Download","Upload","ArrowClockwise","FloppyDisk","Copy","SpinnerGap","CheckCircle","XCircle","WarningCircle","Info","Check","Circle","Question","User","Users","UserPlus","SignIn","SignOut","Eye","EyeSlash","ChartBar","TrendUp","Pulse","Database","Lightning","FileText","File","Folder","Book","BookOpen","Envelope","ChatCircle","Phone","Image","Video","Camera","Smiley","SmileySad","SmileyMeh","Lock","LockOpen","Shield","Wallet","Key","Clock","Calendar","CalendarPlus","Bell","Heart","Star","Bookmark","Share","Monitor","Sun","Moon","Lightbulb","Brain","Flag","Square","Sparkle","Globe","DeviceMobile","Ticket","Clipboard","WifiHigh","WifiSlash","Cpu","MaskHappy","TextB","TextItalic","TextStrikethrough","TextHOne","Code","FileCode","Quotes","List","ListNumbers","emotionIcons","statusIcons","iconCategories","toCamelCase","str","word","index","PhosphorIcons","LucideIcons","PROJECT_ICONS","initPhosphorIcons","initLucideIcons","getIconFromProvider","iconName","provider","iconMapping","getIconDirect","mappedName","phosphorName1","phosphorName2","lucideName","camelCaseName","match","getIconNameForProvider","ICON_ALIASES","resolveIconAlias","getIconAliases","_","alias","normalizeIconName","camelCased","aliasTarget","defaultIconConfig","getDefaultStrokeWidth","set","IconContext","createContext","IconProvider","weight","iconsaxVariant","color","strokeWidth","value","useIconContext","useContext","IconComponent","name","emotion","status","animated","pulse","spin","bounce","ariaLabel","ariaHidden","_b","config","iconSet","iconSize","iconWeight","iconColor","iconStrokeWidth","isClient","setIsClient","providerReady","setProviderReady","resolvedIcon","baseName","normalized","providerName","iconsaxIcon","variantClasses","ResolvedIcon","iconProps","animationClasses","accessibilityProps","MemoizedIcon","prevProps","nextProps","Icon","EmotionIcon","StatusIcon","LoadingIcon","SuccessIcon","ErrorIcon","avatarVariants","Avatar","src","alt","fallbackText","imgError","setImgError","useState","getFallbackContent","showImage","AvatarImage","AvatarFallback","useCombinedRefs","Modal","isOpen","onClose","closable","closeOnOverlayClick","title","description","showBackdrop","backdropClassName","centered","_closable","modalRef","combinedRef","handleEscape","scrollbarWidth","handleOverlayClick","sizeClasses","generatedTitleId","generatedDescId","titleId","descriptionId","mounted","setMounted","modalContent","createPortal","containerVariants","Container","padding","fluid","gridVariants","RESPONSIVE_COLS","GAP_X","GAP_Y","Grid","cols","gap","gapX","gapY","responsive","stackVariants","SPACING","Stack","direction","spacing","align","justify","wrap","ORIENTATION","getSizeClass","orientation","getVariantClass","getColorClass","DividerComponent","Divider","cardVariants","Card","hoverable","CardHeader","CardTitle","CardDescription","CardContent","CardFooter","panelStyleVariants","Panel","effect","borderOpacity","shadowOpacity","_hoverEffect","animationEffect","customPadding","customRounded","background","gradientColors","patternType","backgroundImage","backgroundVideo","interactive","hoverScale","hoverRotate","hoverGlow","cardProps","patternBackground","backgroundStyles","styles","hoverClasses","panelClasses","ActionToolbarComponent","isSelectMode","totalCount","selectedCount","actions","selectModeActions","onToggleSelectMode","onToggleSelectAll","onCancelSelect","getBadgeColor","useCallback","renderButton","action","key","ActionToolbar","Breadcrumb","items","maxItems","showHomeIcon","homeLabel","separator","variantStyles","renderedItems","displayItems","firstItem","lastItems","item","isCurrent","BreadcrumbItem","itemsCount","ComponentLayout","prevPage","nextPage","breadcrumbItems","badgeVariants","Badge","progressBarVariants","progressTrackVariants","Progress","showValue","striped","label","percentage","ProgressSuccess","ProgressWarning","ProgressError","ProgressInfo","ProgressWrapper","ProgressGroup","skeletonVariants","Skeleton","width","height","animation","getAnimationStyle","SkeletonText","SkeletonCircle","SkeletonRectangle","SkeletonRounded","SkeletonCard","SkeletonAvatar","SkeletonImage","SkeletonUserProfile","SkeletonList","SkeletonTable","Alert","getVariantClasses","getIconClasses","getDefaultIcon","AlertSuccess","AlertWarning","AlertError","AlertInfo","ToastContext","useToast","context","noopAddToast","noopRemoveToast","noopClearToasts","useToastSafe","ToastProvider","maxToasts","position","toasts","setToasts","removeToast","id","prev","toast","addToast","newToast","clearToasts","ToastContainer","positionClasses","ToastItem","onRemove","isVisible","setIsVisible","handleRemove","getToastStyles","getIconStyles","getToastIcon","LoadingSpinner","text","spinnerColors","renderSpinner","Tooltip","delay","coords","setCoords","timeoutRef","tooltipRef","showTooltip","_tooltipRect","hideTooltip","getArrowClasses","TooltipLight","TooltipDark","labelVariants","Label","required","Switch","generatedId","switchId","labelId","thumbSizes","thumbTranslate","stateClasses","Toggle","controlledPressed","onPressedChange","internalPressed","setInternalPressed","pressed","handleClick","ScrollArea","scrollHideDelay","showScrollbar","setShowScrollbar","handleMouseEnter","handleMouseLeave","ScrollBar","useScrollToggle","options","threshold","showOnMount","smooth","useEffect","toggleVisibility","ScrollToTop","scrollToTop","initialState","ThemeProviderContext","ThemeProvider","defaultTheme","storageKey","enableSystem","enableTransition","theme","setTheme","resolvedTheme","setResolvedTheme","savedTheme","root","systemTheme","mediaQuery","handleChange","newTheme","useTheme","ThemeToggle","showLabel","iconSizes","renderIcon","iconNames","iconProviderMapping","isValidIconName","mapping","colorShades","colorClass","shade","prefix","withDarkMode","lightClass","darkClass","defaultColorConfig","gradientConfig","createColorStyles","_c","_d","_e","_f","_g","_h","_i","_j","_k","_l","_m","_n","_o","finalConfig","defaultBorder","defaultBg","defaultStyle","gradientFrom","gradientTo","gradientBorder","gradientStyle","outlineBorder","outlineBg","outlineText","outlineStyle","elevatedBorder","elevatedBg","elevatedShadow","elevatedStyle","iconBg","iconText","iconStyle","badgeBg","badgeText","badgeStyle","colorStylesCache","useColorStyles","cacheKey","createVariantStyles","colorStyles","baseClasses","createSizeStyles","createRoundedStyles","createShadowStyles","HUA_SPRING_EASING","createHoverStyles","reducedMotion","createGradient","from","to","withOpacity","opacity","isTextWhite","isGradientVariant","sm","md","lg","xl","conditionalClass","EASING_FUNCTIONS","DURATIONS","HUA_DEFAULT_MOTION","COMPONENT_MOTION_DEFAULTS","CSS_MOTION_VARS","useMicroMotion","preset","duration","scale","translateY","translateX","rotate","enableHover","enablePress","enableFocus","state","setState","animationTimeoutRef","useRef","setAnimating","isAnimating","handlers","useMemo","transforms","easing","getMicroMotionClasses","enableActive","durationClass","useInView","rootMargin","triggerOnce","inView","setInView","entry","setEntry","frozenRef","element","observer","isInView","useScrollProgress","throttle","progress","setProgress","scrollY","setScrollY","scrollX","setScrollX","isScrolling","setIsScrolling","setDirection","lastScrollY","scrollTimeout","lastUpdate","calculateProgress","now","scrollTop","docHeight","newProgress","scrollHeight","useMouse","touch","moveTimeout","handleMove","clientX","clientY","elementX","elementY","elementPositionX","elementPositionY","isInside","handleMouseMove","handleTouchMove","prefersReducedMotion","setPrefersReducedMotion","useWindowSize","mobileBreakpoint","tabletBreakpoint","setSize","updateSize","timeoutId","handleResize"],"mappings":"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","file":"index.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 ","import { cva } from 'class-variance-authority'\n\n/**\n * HUA Spring Easing transition — 시그니처 \"쫀득한\" 느낌\n * cubic-bezier(0.34, 1.56, 0.64, 1)\n */\nconst springTransition =\n '[transition:transform_180ms_cubic-bezier(0.34,1.56,0.64,1),box-shadow_200ms_ease-out]'\n\nexport const buttonVariants = cva(\n // ── base ──\n 'inline-flex items-center justify-center whitespace-nowrap font-medium transition-all duration-200 disabled:pointer-events-none disabled:opacity-50 min-w-fit focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-[var(--color-ring)] focus-visible:ring-offset-2 focus-visible:ring-offset-[var(--color-background)]',\n {\n variants: {\n /** 스타일 변형 */\n variant: {\n default:\n 'bg-[var(--color-primary)] text-[var(--color-primary-foreground)] hover:opacity-90',\n destructive:\n 'bg-[var(--color-destructive)] text-[var(--color-destructive-foreground)] hover:opacity-90 focus-visible:ring-[var(--color-destructive)]',\n outline:\n 'border-2 border-[var(--color-border)] bg-transparent text-[var(--color-foreground)] hover:bg-[var(--color-accent)] hover:text-[var(--color-accent-foreground)] focus-visible:ring-offset-0',\n secondary:\n 'bg-[var(--color-secondary)] text-[var(--color-secondary-foreground)] hover:opacity-80',\n ghost:\n 'bg-transparent text-[var(--color-foreground)] hover:bg-[var(--color-accent)] hover:text-[var(--color-accent-foreground)] focus-visible:ring-offset-0',\n link:\n 'bg-transparent text-[var(--color-primary)] underline hover:opacity-80 focus-visible:ring-offset-0',\n gradient:\n 'bg-gradient-to-r from-[var(--btn-gradient-from,theme(colors.teal.500))] to-[var(--btn-gradient-to,theme(colors.cyan.500))] text-white hover:shadow-lg',\n neon:\n 'bg-slate-900 dark:bg-slate-950 text-teal-400 border border-teal-500/50 shadow-lg shadow-[var(--btn-neon-glow,theme(colors.teal.500/20%))] hover:shadow-[var(--btn-neon-glow,theme(colors.teal.500/40%))] hover:border-teal-400',\n glass:\n 'bg-white/50 dark:bg-slate-900/50 backdrop-blur-md border border-slate-200/50 dark:border-slate-700/50 text-slate-900 dark:text-slate-100 hover:bg-white/70 dark:hover:bg-slate-900/70',\n },\n /** 크기 */\n size: {\n sm: 'h-8 px-4 py-2 text-sm',\n md: 'h-10 px-6 py-2 text-base',\n lg: 'h-12 px-8 py-3 text-lg',\n xl: 'h-14 px-10 py-4 text-xl',\n icon: 'h-10 w-10 p-0',\n },\n /** 모서리 둥글기 */\n rounded: {\n sm: 'rounded',\n md: 'rounded-md',\n lg: 'rounded-lg',\n full: 'rounded-full',\n },\n /** 그림자 */\n shadow: {\n none: '',\n sm: 'shadow-sm',\n md: 'shadow-md',\n lg: 'shadow-lg',\n xl: 'shadow-xl',\n },\n /** 호버 효과 — springy가 HUA-UI 시그니처 */\n hover: {\n springy: `hover:scale-[1.015] hover:shadow-md active:scale-[0.985] ${springTransition} transform-gpu`,\n scale:\n 'hover:scale-[1.015] active:scale-[0.985] transition-transform duration-150 ease-out transform-gpu',\n glow: 'hover:shadow-lg hover:shadow-primary/25 transition-shadow duration-200',\n slide: `hover:-translate-y-0.5 hover:shadow-md ${springTransition} transform-gpu`,\n none: '',\n },\n /** 전체 너비 */\n fullWidth: {\n true: 'w-full',\n false: '',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'md',\n rounded: 'md',\n shadow: 'md',\n hover: 'springy',\n fullWidth: false,\n },\n }\n)\n\n/** Gradient 프리셋 */\nexport const gradientPresets: Record<string, string> = {\n blue: 'from-teal-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\nexport type { VariantProps } from 'class-variance-authority'\n","\"use client\";\n\nimport React from \"react\";\nimport { clsx } from \"clsx\";\n\n/**\n * Slot 컴포넌트\n *\n * Radix UI의 asChild 패턴을 구현합니다.\n * 자식 요소의 props와 ref를 병합하여 하나의 요소로 렌더링합니다.\n *\n * @example\n * // Button에서 asChild 사용\n * <Button asChild>\n * <Link href=\"/home\">홈으로</Link>\n * </Button>\n *\n * @see https://www.radix-ui.com/primitives/docs/utilities/slot\n */\n\ntype SlotProps = React.HTMLAttributes<HTMLElement> & {\n children?: React.ReactNode;\n};\n\n/**\n * 여러 ref를 하나로 합칩니다\n */\nfunction composeRefs<T>(\n ...refs: (React.Ref<T> | undefined)[]\n): React.RefCallback<T> {\n return (node) => {\n refs.forEach((ref) => {\n if (typeof ref === \"function\") {\n ref(node);\n } else if (ref != null) {\n (ref as React.MutableRefObject<T | null>).current = node;\n }\n });\n };\n}\n\n/**\n * 이벤트 핸들러를 합성합니다\n * \n * 부모(slot) 핸들러를 먼저 실행하고, 그 다음 자식 핸들러를 실행합니다.\n * defaultPrevented가 true이면 자식 핸들러는 실행하지 않습니다.\n */\nfunction composeEventHandlers<E>(\n parentHandler?: (event: E) => void,\n childHandler?: (event: E) => void\n): (event: E) => void {\n return (event) => {\n parentHandler?.(event);\n if (!(event as unknown as { defaultPrevented: boolean }).defaultPrevented) {\n childHandler?.(event);\n }\n };\n}\n\n/**\n * className을 병합합니다\n */\nfunction mergeClassName(\n slotClassName?: string,\n childClassName?: string\n): string | undefined {\n if (!slotClassName && !childClassName) return undefined;\n return clsx(slotClassName, childClassName);\n}\n\n/**\n * style을 병합합니다\n */\nfunction mergeStyle(\n slotStyle?: React.CSSProperties,\n childStyle?: React.CSSProperties\n): React.CSSProperties | undefined {\n if (!slotStyle && !childStyle) return undefined;\n return { ...slotStyle, ...childStyle };\n}\n\n/**\n * props를 병합합니다 (이벤트 핸들러, className, style 등)\n */\nfunction mergeProps(\n slotProps: Record<string, unknown>,\n childProps: Record<string, unknown>\n): Record<string, unknown> {\n const mergedProps: Record<string, unknown> = { ...slotProps };\n\n for (const propName in childProps) {\n const slotValue = slotProps[propName];\n const childValue = childProps[propName];\n\n // 이벤트 핸들러 병합 (부모(slot) → 자식 순서)\n if (/^on[A-Z]/.test(propName)) {\n if (slotValue && childValue) {\n mergedProps[propName] = composeEventHandlers(\n slotValue as (event: unknown) => void,\n childValue as (event: unknown) => void\n );\n } else {\n mergedProps[propName] = childValue || slotValue;\n }\n }\n // className 병합\n else if (propName === \"className\") {\n mergedProps[propName] = mergeClassName(\n slotValue as string | undefined,\n childValue as string | undefined\n );\n }\n // style 병합\n else if (propName === \"style\") {\n mergedProps[propName] = mergeStyle(\n slotValue as React.CSSProperties | undefined,\n childValue as React.CSSProperties | undefined\n );\n }\n // 그 외: 자식 값 우선\n else {\n mergedProps[propName] = childValue !== undefined ? childValue : slotValue;\n }\n }\n\n return mergedProps;\n}\n\n/**\n * 유효한 단일 React 요소인지 확인\n */\nfunction isSlottable(child: React.ReactNode): child is React.ReactElement {\n return React.isValidElement(child);\n}\n\n/**\n * Slot 컴포넌트\n *\n * 자식 요소에 부모의 props를 주입합니다.\n * asChild 패턴을 구현할 때 사용합니다.\n */\nconst Slot = React.forwardRef<HTMLElement, SlotProps>(\n ({ children, ...slotProps }, forwardedRef) => {\n const childArray = React.Children.toArray(children);\n\n // 유효한 단일 자식이 있는지 확인\n if (childArray.length !== 1) {\n if (process.env.NODE_ENV !== \"production\") {\n console.warn(\n \"[Slot] asChild는 정확히 하나의 자식 요소가 필요합니다.\"\n );\n }\n return null;\n }\n\n const child = childArray[0];\n\n if (!isSlottable(child)) {\n if (process.env.NODE_ENV !== \"production\") {\n console.warn(\"[Slot] 자식은 유효한 React 요소여야 합니다.\");\n }\n return null;\n }\n\n // 자식 요소의 props와 ref 추출\n const childProps = child.props as Record<string, unknown>;\n const childRef = (child as unknown as { ref?: React.Ref<HTMLElement> }).ref;\n\n // props와 ref 병합\n const mergedProps = mergeProps(slotProps, childProps);\n const mergedRef = composeRefs(forwardedRef, childRef);\n\n return React.cloneElement(child, {\n ...mergedProps,\n ref: mergedRef,\n } as React.Attributes);\n }\n);\n\nSlot.displayName = \"Slot\";\n\nexport { Slot, composeRefs, mergeProps };\nexport type { SlotProps };\n","\"use client\";\n\nimport React from \"react\";\nimport { merge } from \"../lib/utils\";\nimport { buttonVariants, gradientPresets } from \"./Button.variants\";\nimport { Slot } from \"../lib/Slot\";\n\n/**\n * 버튼 스타일 변형 / Button style variant\n */\ntype Variant =\n | \"default\" | \"destructive\" | \"outline\" | \"secondary\"\n | \"ghost\" | \"link\" | \"gradient\" | \"neon\" | \"glass\";\n\n/**\n * 버튼 크기 / Button size\n */\ntype Size = \"sm\" | \"md\" | \"lg\" | \"xl\" | \"icon\";\n\n/**\n * 버튼 모서리 둥글기 / Button border radius\n */\ntype Rounded = \"sm\" | \"md\" | \"lg\" | \"full\";\n\n/**\n * 버튼 그림자 / Button shadow\n */\ntype Shadow = \"none\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n\n/**\n * 버튼 호버 효과 / Button hover effect\n * \"springy\"가 HUA-UI 시그니처 - 공 튕기듯 미세한 반동\n */\ntype Hover = \"springy\" | \"scale\" | \"glow\" | \"slide\" | \"none\";\n\n/**\n * 그라디언트 색상 이름 / Gradient color name\n */\ntype GradientName = \"blue\" | \"purple\" | \"green\" | \"orange\" | \"pink\" | \"custom\";\n\n/**\n * Button 컴포넌트의 공통 props / Common props for Button component\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 asChild?: 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 */\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 * @example\n * <Button onClick={() => console.log('클릭')}>클릭하세요</Button>\n * <Button variant=\"destructive\" size=\"lg\">삭제</Button>\n * <Button variant=\"gradient\" gradient=\"purple\">그라디언트</Button>\n * <Button href=\"/about\" variant=\"link\">자세히 보기</Button>\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 = \"springy\",\n fullWidth,\n iconOnly,\n className,\n children,\n disabled,\n asChild = false,\n ...rest\n },\n ref\n) {\n const reduced = useReducedMotion();\n\n // gradient variant: 커스텀 그라디언트 클래스 처리\n const gradientClass =\n variant === \"gradient\"\n ? customGradient\n ? `bg-gradient-to-r ${customGradient}`\n : `bg-gradient-to-r ${gradientPresets[gradient] || gradientPresets.blue}`\n : undefined;\n\n const base = merge(\n buttonVariants({\n variant,\n size,\n rounded,\n shadow,\n hover: reduced ? \"none\" : hover,\n fullWidth: fullWidth ?? false,\n }),\n gradientClass,\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 console.warn(\"[Button] iconOnly 사용 시 aria-label을 제공하세요.\");\n }\n\n // asChild 모드: Slot을 사용하여 자식 요소에 props 병합\n if (asChild) {\n const slotProps = {\n className: base,\n ref,\n disabled: disabled || loading,\n \"aria-busy\": loading || undefined,\n \"aria-disabled\": (disabled || loading) || undefined,\n ...rest,\n };\n return <Slot {...slotProps}>{children}</Slot>;\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","\"use client\";\n\nimport React from \"react\";\nimport { merge } from \"../lib/utils\";\nimport { Button, type ButtonProps } from \"./Button\";\n\n/** Action 전용 옵션(버튼 공통 옵션은 ButtonProps에서 상속) */\ntype ActionKind =\n | \"primary\" | \"secondary\" | \"tertiary\"\n | \"magical\" | \"cyberpunk\" | \"ninja\" | \"wizard\" | \"sniper\";\ntype FeedbackKind = \"ripple\" | \"particle\" | \"sound\" | \"haptic\" | \"glitch\" | \"sparkle\" | \"smoke\";\n\ntype ActionExtras = {\n actionType?: ActionKind;\n feedback?: FeedbackKind;\n\n particleEffect?: boolean;\n rippleEffect?: boolean;\n soundEffect?: boolean;\n hapticFeedback?: boolean;\n\n transparency?: number; // 0~1\n blurIntensity?: number; // px\n glowIntensity?: number; // px\n glowColor?: string; // css color\n};\n\n/**\n * Action 컴포넌트의 props / Action component props\n * @typedef {Object} ActionProps\n * @property {ActionKind} [actionType=\"primary\"] - Action 타입 / Action type\n * @property {FeedbackKind} [feedback=\"ripple\"] - 피드백 타입 / Feedback type\n * @property {boolean} [particleEffect=false] - 파티클 효과 활성화 / Enable particle effect\n * @property {boolean} [rippleEffect=false] - 리플 효과 활성화 / Enable ripple effect\n * @property {boolean} [soundEffect=false] - 사운드 효과 활성화 / Enable sound effect\n * @property {boolean} [hapticFeedback=false] - 햅틱 피드백 활성화 / Enable haptic feedback\n * @property {number} [transparency=1] - 투명도 (0-1) / Transparency (0-1)\n * @property {number} [blurIntensity=0] - blur 강도 (px) / Blur intensity (px)\n * @property {number} [glowIntensity=0] - 글로우 강도 (px) / Glow intensity (px)\n * @property {string} [glowColor=\"rgba(91,140,255,.8)\"] - 글로우 색상 / Glow color\n * @extends {ButtonProps}\n */\nexport type ActionProps = ButtonProps & ActionExtras;\n\ntype AnchorEl = HTMLAnchorElement;\ntype ButtonEl = HTMLButtonElement;\ntype AnchorOrButton = AnchorEl | ButtonEl;\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 * Action 컴포넌트 / Action component\n * \n * 고급 효과를 가진 액션 버튼 컴포넌트입니다.\n * Button 컴포넌트를 기반으로 하며, 파티클, 리플, 사운드, 햅틱 피드백 등을 지원합니다.\n * \n * Action button component with advanced effects.\n * Based on Button component, supports particle, ripple, sound, haptic feedback, etc.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Action>클릭</Action>\n * \n * @example\n * // 고급 효과 / Advanced effects\n * <Action \n * actionType=\"magical\"\n * feedback=\"particle\"\n * particleEffect\n * rippleEffect\n * >\n * 마법 버튼\n * </Action>\n * \n * @param {ActionProps} props - Action 컴포넌트의 props / Action component props\n * @param {React.Ref<AnchorOrButton>} ref - button 또는 anchor 요소 ref / button or anchor element ref\n * @returns {JSX.Element} Action 컴포넌트 / Action component\n */\nexport const Action = React.forwardRef<AnchorOrButton, ActionProps>(\n (\n {\n className,\n children,\n actionType = \"primary\",\n feedback = \"ripple\",\n particleEffect = false,\n rippleEffect = false,\n soundEffect = false,\n hapticFeedback = false,\n transparency = 1,\n blurIntensity = 0,\n glowIntensity = 0,\n glowColor = \"rgba(91,140,255,.8)\",\n loading = false,\n iconOnly = false,\n disabled,\n ...rest\n },\n ref\n ) => {\n const reduced = useReducedMotion();\n\n const runEffects = React.useCallback((event: React.MouseEvent) => {\n if (hapticFeedback && isBrowser && \"vibrate\" in navigator && !reduced) {\n try { navigator.vibrate?.(30); } catch { /* ignore */ }\n }\n \n if (soundEffect && !reduced && isBrowser) {\n // 간단한 클릭 사운드 효과 (선택적)\n try {\n const AudioContextClass = window.AudioContext || (window as typeof window & { webkitAudioContext?: typeof AudioContext }).webkitAudioContext;\n if (!AudioContextClass) return;\n const audioContext = new AudioContextClass();\n const oscillator = audioContext.createOscillator();\n const gainNode = audioContext.createGain();\n \n oscillator.connect(gainNode);\n gainNode.connect(audioContext.destination);\n \n oscillator.frequency.value = 800;\n oscillator.type = 'sine';\n gainNode.gain.setValueAtTime(0.1, audioContext.currentTime);\n gainNode.gain.exponentialRampToValueAtTime(0.01, audioContext.currentTime + 0.1);\n \n oscillator.start(audioContext.currentTime);\n oscillator.stop(audioContext.currentTime + 0.1);\n } catch {\n // 오디오 컨텍스트를 지원하지 않는 환경에서는 무시\n }\n }\n \n if (rippleEffect && !reduced && event.currentTarget) {\n // Ripple 효과: 클릭 위치에 원형 애니메이션 생성\n const button = event.currentTarget as HTMLElement;\n const rect = button.getBoundingClientRect();\n const x = event.clientX - rect.left;\n const y = event.clientY - rect.top;\n const size = Math.max(rect.width, rect.height);\n \n const ripple = document.createElement('span');\n ripple.style.cssText = `\n position: absolute;\n border-radius: 50%;\n background: rgba(255, 255, 255, 0.6);\n width: ${size}px;\n height: ${size}px;\n left: ${x - size / 2}px;\n top: ${y - size / 2}px;\n pointer-events: none;\n animation: ripple-animation 0.6s ease-out;\n `;\n \n // CSS 애니메이션 정의 (한 번만)\n if (!document.getElementById('ripple-animation-style')) {\n const style = document.createElement('style');\n style.id = 'ripple-animation-style';\n style.textContent = `\n @keyframes ripple-animation {\n to {\n transform: scale(4);\n opacity: 0;\n }\n }\n `;\n document.head.appendChild(style);\n }\n \n button.style.position = 'relative';\n button.style.overflow = 'hidden';\n button.appendChild(ripple);\n \n setTimeout(() => {\n ripple.remove();\n }, 600);\n }\n \n if (particleEffect && !reduced && event.currentTarget) {\n // 간단한 파티클 효과: 클릭 위치에서 작은 원들이 퍼져나감\n const button = event.currentTarget as HTMLElement;\n const rect = button.getBoundingClientRect();\n const x = event.clientX - rect.left;\n const y = event.clientY - rect.top;\n \n for (let i = 0; i < 5; i++) {\n const particle = document.createElement('span');\n const angle = (Math.PI * 2 * i) / 5;\n const velocity = 30 + Math.random() * 20;\n const vx = Math.cos(angle) * velocity;\n const vy = Math.sin(angle) * velocity;\n \n particle.style.cssText = `\n position: absolute;\n width: 4px;\n height: 4px;\n background: ${glowColor || 'rgba(91,140,255,0.8)'};\n border-radius: 50%;\n left: ${x}px;\n top: ${y}px;\n pointer-events: none;\n animation: particle-animation-${i} 0.5s ease-out forwards;\n `;\n \n // CSS 애니메이션 정의\n if (!document.getElementById(`particle-animation-${i}`)) {\n const style = document.createElement('style');\n style.id = `particle-animation-${i}`;\n style.textContent = `\n @keyframes particle-animation-${i} {\n to {\n transform: translate(${vx}px, ${vy}px) scale(0);\n opacity: 0;\n }\n }\n `;\n document.head.appendChild(style);\n }\n \n button.style.position = 'relative';\n button.appendChild(particle);\n \n setTimeout(() => {\n particle.remove();\n }, 500);\n }\n }\n }, [hapticFeedback, soundEffect, rippleEffect, particleEffect, reduced, glowColor]);\n\n const styleVars = React.useMemo<React.CSSProperties>(() => ({\n \"--action-opacity\": String(transparency),\n \"--action-blur\": `${blurIntensity}px`,\n \"--action-glow-size\": `${glowIntensity}px`,\n \"--action-glow-color\": glowColor,\n }) as React.CSSProperties, [transparency, blurIntensity, glowIntensity, glowColor]);\n\n const cls = React.useMemo(\n () =>\n merge(\n \"hua-action relative inline-flex items-center rounded-xl px-4 py-2 font-medium\",\n \"focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-primary/60\",\n loading && \"cursor-wait opacity-80\",\n iconOnly && \"justify-center\",\n className\n ),\n [className, loading, iconOnly]\n );\n\n /** 분기 1) href가 있으면 앵커 브랜치 */\n if (\"href\" in rest && rest.href) {\n const { onClick, href, ...anchorRest } = rest as Extract<ButtonProps, { href: string }>;\n\n const handleClick: React.MouseEventHandler<AnchorEl> = (e) => {\n if (disabled || loading) { e.preventDefault(); e.stopPropagation(); return; }\n runEffects(e);\n onClick?.(e);\n };\n\n return (\n <Button\n ref={ref as React.Ref<AnchorEl>}\n href={href}\n className={cls}\n style={styleVars}\n onClick={handleClick}\n aria-busy={loading || undefined}\n aria-label={iconOnly ? (anchorRest[\"aria-label\"] as string) : undefined}\n data-action={actionType}\n data-feedback={feedback}\n data-reduced-motion={reduced ? \"true\" : \"false\"}\n disabled={disabled}\n {...anchorRest}\n >\n {children}\n </Button>\n );\n }\n\n /** 분기 2) 기본 버튼 브랜치 */\n const { onClick, ...btnRest } = rest as Extract<ButtonProps, { href?: undefined }>;\n\n const handleClick: React.MouseEventHandler<ButtonEl> = (e) => {\n if (disabled || loading) return;\n runEffects(e);\n onClick?.(e);\n };\n\n return (\n <Button\n ref={ref as React.Ref<ButtonEl>}\n className={cls}\n style={styleVars}\n onClick={handleClick}\n disabled={disabled}\n aria-busy={loading || undefined}\n aria-label={iconOnly ? (btnRest[\"aria-label\"] as string) : undefined}\n data-action={actionType}\n data-feedback={feedback}\n data-reduced-motion={reduced ? \"true\" : \"false\"}\n {...btnRest}\n >\n {children}\n </Button>\n );\n }\n);\n\nAction.displayName = \"Action\";\n","/**\n * CVA 공통 상수 — 전 컴포넌트에서 재사용\n *\n * 모든 CVA variant 정의에서 import하여 사용합니다.\n * @example\n * import { SHARED_DISABLED, SHARED_FOCUS } from '../lib/styles/cva-base'\n */\n\n/** 비활성 상태 공통 스타일 */\nexport const SHARED_DISABLED =\n 'disabled:pointer-events-none disabled:opacity-50' as const\n\n/** 포커스 링 공통 스타일 */\nexport const SHARED_FOCUS =\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2' as const\n\n/** 트랜지션 공통 스타일 */\nexport const SHARED_TRANSITION =\n 'transition-colors duration-150' as const\n\n/** 글래스모피즘 공통 스타일 */\nexport const SHARED_GLASS =\n 'backdrop-blur-md border-white/20 bg-white/10 dark:bg-white/5' as const\n\n/**\n * 폼 상태 스타일 (error / success)\n * Input, Select, Textarea, Switch 등 전체 폼 컴포넌트에서 사용\n */\nexport const FORM_STATE = {\n error: 'border-destructive focus-visible:ring-destructive',\n success: 'border-green-500 focus-visible:ring-green-500',\n} as const\n\n/**\n * HUA 시그니처 스프링 이징\n * cubic-bezier(0.34, 1.56, 0.64, 1) — \"쫀득한\" 느낌\n */\nexport const HUA_SPRING_EASING =\n 'cubic-bezier(0.34, 1.56, 0.64, 1)' as const\n\n/** 마이크로 모션 기본 트랜지션 */\nexport const SHARED_MICRO_MOTION =\n 'transition-all duration-[180ms]' as const\n","\"use client\"\n\nimport React from \"react\"\nimport { cva } from \"class-variance-authority\"\nimport { merge } from \"../lib/utils\"\nimport { FORM_STATE } from \"../lib/styles/cva-base\"\n\nexport const inputVariants = cva(\n \"flex h-10 w-full rounded-md border 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-1 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 transition-all duration-200 hover:border-accent-foreground hover:shadow-sm\",\n {\n variants: {\n variant: {\n default: \"border-input bg-background\",\n outline: \"border-2 border-input bg-transparent\",\n filled: \"border-transparent bg-secondary/50\",\n glass: \"border-white/20 bg-white/10 text-white placeholder:text-white/50 backdrop-blur-sm\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\n/**\n * Input 컴포넌트의 props / Input component props\n */\nexport interface InputProps extends React.InputHTMLAttributes<HTMLInputElement> {\n variant?: \"default\" | \"outline\" | \"filled\" | \"glass\"\n error?: boolean\n success?: boolean\n}\n\n/**\n * Input 컴포넌트 / Input component\n *\n * 표준 HTML input 요소를 래핑한 스타일링된 입력 필드 컴포넌트입니다.\n *\n * @example\n * <Input type=\"text\" placeholder=\"이름을 입력하세요\" />\n * <Input type=\"email\" error placeholder=\"이메일\" />\n */\nconst Input = React.forwardRef<HTMLInputElement, InputProps>(\n ({ className, type, variant = \"default\", error, success, ...props }, ref) => {\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 <input\n type={type}\n className={merge(\n inputVariants({ variant }),\n isInvalid && FORM_STATE.error,\n success && FORM_STATE.success,\n className\n )}\n ref={ref}\n aria-invalid={isInvalid || undefined}\n {...props}\n />\n )\n }\n)\nInput.displayName = \"Input\"\n\nexport { Input }\n","\"use client\";\n\nimport React from \"react\";\nimport { merge } from \"../lib/utils\";\n\n/**\n * NumberInput 컴포넌트의 props / NumberInput component props\n * @typedef {Object} NumberInputProps\n * @property {number} [value] - 현재 값 / Current value\n * @property {number} [defaultValue=0] - 기본 값 / Default value\n * @property {number} [min] - 최소 값 / Minimum value\n * @property {number} [max] - 최대 값 / Maximum value\n * @property {number} [step=1] - 증감 단위 / Step amount\n * @property {(value: number) => void} [onChange] - 값 변경 콜백 / Value change callback\n * @property {boolean} [disabled=false] - 비활성화 / Disabled state\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - 크기 / Size\n * @property {boolean} [showButtons=true] - +/- 버튼 표시 / Show +/- buttons\n * @property {\"horizontal\" | \"vertical\"} [buttonLayout=\"horizontal\"] - 버튼 배치 / Button layout\n * @property {string} [className] - 추가 CSS 클래스 / Additional CSS class\n */\nexport interface NumberInputProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, \"onChange\" | \"value\" | \"defaultValue\" | \"size\" | \"type\"> {\n value?: number;\n defaultValue?: number;\n min?: number;\n max?: number;\n step?: number;\n onChange?: (value: number) => void;\n disabled?: boolean;\n size?: \"sm\" | \"md\" | \"lg\";\n showButtons?: boolean;\n buttonLayout?: \"horizontal\" | \"vertical\";\n}\n\n/**\n * NumberInput 컴포넌트 / NumberInput component\n *\n * 숫자 입력을 위한 컴포넌트로, 커스텀 +/- 버튼을 제공합니다.\n * 브라우저 기본 스피너 대신 스타일링된 버튼을 사용합니다.\n *\n * Number input component with custom +/- buttons.\n * Uses styled buttons instead of browser default spinners.\n *\n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <NumberInput value={count} onChange={setCount} />\n *\n * @example\n * // 범위 지정 / With range\n * <NumberInput min={0} max={100} step={5} />\n *\n * @example\n * // 세로 버튼 / Vertical buttons\n * <NumberInput buttonLayout=\"vertical\" />\n */\nconst NumberInput = React.forwardRef<HTMLInputElement, NumberInputProps>(\n (\n {\n value: controlledValue,\n defaultValue = 0,\n min,\n max,\n step = 1,\n onChange,\n disabled = false,\n size = \"md\",\n showButtons = true,\n buttonLayout = \"horizontal\",\n className,\n ...props\n },\n ref\n ) => {\n const [internalValue, setInternalValue] = React.useState(defaultValue);\n const isControlled = controlledValue !== undefined;\n const currentValue = isControlled ? controlledValue : internalValue;\n\n const updateValue = React.useCallback(\n (newValue: number) => {\n // Clamp to min/max\n let clampedValue = newValue;\n if (min !== undefined) clampedValue = Math.max(min, clampedValue);\n if (max !== undefined) clampedValue = Math.min(max, clampedValue);\n\n if (!isControlled) {\n setInternalValue(clampedValue);\n }\n onChange?.(clampedValue);\n },\n [isControlled, min, max, onChange]\n );\n\n const increment = () => {\n if (disabled) return;\n updateValue(currentValue + step);\n };\n\n const decrement = () => {\n if (disabled) return;\n updateValue(currentValue - step);\n };\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const inputValue = e.target.value;\n // Allow empty string, minus sign alone (for typing negative numbers), or valid numbers\n if (inputValue === \"\" || inputValue === \"-\") {\n return;\n }\n const newValue = parseFloat(inputValue);\n if (!isNaN(newValue)) {\n // If min is set, enforce it on direct input\n if (min !== undefined && newValue < min) {\n updateValue(min);\n } else {\n updateValue(newValue);\n }\n }\n };\n\n const handleBlur = (e: React.FocusEvent<HTMLInputElement>) => {\n // On blur, ensure value is within bounds\n if (min !== undefined && currentValue < min) {\n updateValue(min);\n }\n if (max !== undefined && currentValue > max) {\n updateValue(max);\n }\n props.onBlur?.(e);\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"ArrowUp\") {\n e.preventDefault();\n increment();\n } else if (e.key === \"ArrowDown\") {\n e.preventDefault();\n decrement();\n }\n };\n\n // Spacing system: 4px grid\n // sm: h-8 (32px), px-2 (8px), gap-1 (4px)\n // md: h-10 (40px), px-3 (12px), gap-2 (8px)\n // lg: h-12 (48px), px-4 (16px), gap-2 (8px)\n const sizeClasses = {\n sm: {\n input: \"h-8 text-sm px-2 py-1\",\n button: \"w-8 h-8 text-sm\",\n wrapper: \"gap-1\",\n },\n md: {\n input: \"h-10 text-sm px-3 py-2\",\n button: \"w-10 h-10 text-sm\",\n wrapper: \"gap-2\",\n },\n lg: {\n input: \"h-12 text-base px-4 py-2.5\",\n button: \"w-12 h-12 text-base\",\n wrapper: \"gap-2\",\n },\n };\n\n const sizes = sizeClasses[size];\n\n const buttonBase = merge(\n \"flex items-center justify-center rounded-md border border-input bg-background\",\n \"hover:bg-secondary hover:border-primary/50 active:scale-95\",\n \"transition-all duration-150\",\n \"disabled:opacity-50 disabled:cursor-not-allowed disabled:hover:bg-background\",\n \"focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-2\",\n sizes.button\n );\n\n const canDecrement = min === undefined || currentValue > min;\n const canIncrement = max === undefined || currentValue < max;\n\n if (buttonLayout === \"vertical\") {\n return (\n <div className={merge(\"inline-flex items-center\", sizes.wrapper, className)}>\n <div className=\"flex flex-col gap-0.5\">\n <button\n type=\"button\"\n onClick={increment}\n disabled={disabled || !canIncrement}\n className={merge(buttonBase, \"rounded-b-none h-[calc(50%-1px)]\")}\n aria-label=\"Increase\"\n >\n <ChevronUp className=\"w-3 h-3\" />\n </button>\n <button\n type=\"button\"\n onClick={decrement}\n disabled={disabled || !canDecrement}\n className={merge(buttonBase, \"rounded-t-none h-[calc(50%-1px)]\")}\n aria-label=\"Decrease\"\n >\n <ChevronDown className=\"w-3 h-3\" />\n </button>\n </div>\n <input\n ref={ref}\n type=\"text\"\n inputMode=\"numeric\"\n pattern={min !== undefined && min >= 0 ? \"[0-9]*\" : \"-?[0-9]*\"}\n value={currentValue}\n onChange={handleInputChange}\n onKeyDown={handleKeyDown}\n onBlur={handleBlur}\n disabled={disabled}\n className={merge(\n \"w-16 text-center rounded-md border border-input bg-background\",\n \"focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-2\",\n \"disabled:cursor-not-allowed disabled:opacity-50\",\n \"[appearance:textfield] [&::-webkit-outer-spin-button]:appearance-none [&::-webkit-inner-spin-button]:appearance-none\",\n sizes.input\n )}\n {...props}\n />\n </div>\n );\n }\n\n return (\n <div className={merge(\"inline-flex items-center\", sizes.wrapper, className)}>\n {showButtons && (\n <button\n type=\"button\"\n onClick={decrement}\n disabled={disabled || !canDecrement}\n className={buttonBase}\n aria-label=\"Decrease\"\n >\n <Minus className=\"w-3.5 h-3.5\" />\n </button>\n )}\n <input\n ref={ref}\n type=\"text\"\n inputMode=\"numeric\"\n pattern={min !== undefined && min >= 0 ? \"[0-9]*\" : \"-?[0-9]*\"}\n value={currentValue}\n onChange={handleInputChange}\n onKeyDown={handleKeyDown}\n onBlur={handleBlur}\n disabled={disabled}\n className={merge(\n \"w-16 text-center rounded-md border border-input bg-background\",\n \"focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-2\",\n \"disabled:cursor-not-allowed disabled:opacity-50\",\n \"[appearance:textfield] [&::-webkit-outer-spin-button]:appearance-none [&::-webkit-inner-spin-button]:appearance-none\",\n sizes.input\n )}\n {...props}\n />\n {showButtons && (\n <button\n type=\"button\"\n onClick={increment}\n disabled={disabled || !canIncrement}\n className={buttonBase}\n aria-label=\"Increase\"\n >\n <Plus className=\"w-3.5 h-3.5\" />\n </button>\n )}\n </div>\n );\n }\n);\n\nNumberInput.displayName = \"NumberInput\";\n\n// Simple icon components to avoid external dependency\nfunction Minus({ className }: { className?: string }) {\n return (\n <svg\n className={className}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M20 12H4\" />\n </svg>\n );\n}\n\nfunction Plus({ className }: { className?: string }) {\n return (\n <svg\n className={className}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 4v16m8-8H4\" />\n </svg>\n );\n}\n\nfunction ChevronUp({ className }: { className?: string }) {\n return (\n <svg\n className={className}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 15l7-7 7 7\" />\n </svg>\n );\n}\n\nfunction ChevronDown({ className }: { className?: string }) {\n return (\n <svg\n className={className}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 9l-7 7-7-7\" />\n </svg>\n );\n}\n\nexport { NumberInput };\n","\"use client\"\n\nimport React from \"react\"\nimport { cva } from \"class-variance-authority\"\nimport { merge } from \"../lib/utils\"\n\nexport const linkVariants = cva(\n \"transition-colors duration-200\",\n {\n variants: {\n variant: {\n default: \"text-foreground hover:text-muted-foreground\",\n primary: \"text-primary hover:text-primary/80\",\n secondary: \"text-muted-foreground hover:text-foreground\",\n ghost: \"text-muted-foreground hover:text-foreground\",\n underline: \"text-primary hover:text-primary/80 underline hover:no-underline\",\n },\n size: {\n sm: \"text-sm\",\n md: \"text-base\",\n lg: \"text-lg\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"md\",\n },\n }\n)\n\n/**\n * Link 컴포넌트의 props / Link component props\n */\nexport interface LinkProps {\n href: string\n children: React.ReactNode\n variant?: \"default\" | \"primary\" | \"secondary\" | \"ghost\" | \"underline\"\n size?: \"sm\" | \"md\" | \"lg\"\n external?: boolean\n className?: string\n onClick?: () => void\n}\n\n/**\n * Link 컴포넌트 / Link component\n *\n * 링크를 표시하는 컴포넌트입니다.\n * 외부 링크의 경우 자동으로 `target=\"_blank\"`와 `rel=\"noopener noreferrer\"`를 설정합니다.\n *\n * @example\n * <Link href=\"/about\">소개</Link>\n * <Link href=\"https://example.com\" external>외부 사이트</Link>\n * <Link href=\"/contact\" variant=\"primary\" size=\"lg\">문의하기</Link>\n */\nexport function Link({\n href,\n children,\n className,\n variant = \"default\",\n size = \"md\",\n external = false,\n onClick\n}: LinkProps) {\n return (\n <a\n href={href}\n className={merge(linkVariants({ variant, size }), className)}\n target={external ? \"_blank\" : undefined}\n rel={external ? \"noopener noreferrer\" : undefined}\n onClick={onClick}\n >\n {children}\n </a>\n )\n} ","/**\n * Core Icons (Phosphor 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 House,\n ArrowLeft,\n ArrowRight,\n ArrowUp,\n ArrowDown,\n List as ListIcon,\n X,\n MagnifyingGlass,\n Gear,\n ArrowSquareOut,\n CaretLeft,\n CaretRight,\n CaretDown,\n CaretUp,\n\n // Actions\n Pencil,\n Trash,\n Plus,\n Minus,\n Download,\n Upload,\n ArrowClockwise,\n FloppyDisk,\n Copy,\n\n // Text Formatting (Markdown Toolbar)\n TextB,\n TextItalic,\n TextStrikethrough,\n TextHOne,\n Link,\n Code,\n FileCode,\n Quotes,\n List,\n ListNumbers,\n\n // Status & Feedback\n SpinnerGap,\n CheckCircle,\n XCircle,\n WarningCircle,\n Info,\n Check,\n Circle,\n Question,\n\n // User & Auth\n User,\n Users,\n UserPlus,\n SignIn,\n SignOut,\n Eye,\n EyeSlash,\n\n // Data & Analytics\n ChartBar,\n TrendUp,\n Pulse,\n Database,\n Lightning,\n\n // Files & Content\n FileText,\n File,\n Folder,\n Book,\n BookOpen,\n\n // Communication\n Envelope,\n ChatCircle,\n Phone,\n\n // Media\n Image,\n Video,\n Camera,\n\n // Emotions\n Smiley,\n SmileySad,\n SmileyMeh,\n\n // Security\n Lock,\n LockOpen,\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 Sparkle,\n Globe,\n DeviceMobile,\n Ticket,\n Clipboard,\n WifiHigh,\n WifiSlash,\n Cpu,\n MaskHappy,\n} from '@phosphor-icons/react/dist/ssr'\n\n// 핵심 아이콘 객체 (키는 기존과 동일, 값만 Phosphor로 교체)\nexport const icons = {\n // Navigation\n home: House,\n arrowLeft: ArrowLeft,\n arrowRight: ArrowRight,\n arrowUp: ArrowUp,\n arrowDown: ArrowDown,\n menu: ListIcon,\n close: X,\n search: MagnifyingGlass,\n settings: Gear,\n externalLink: ArrowSquareOut,\n chevronLeft: CaretLeft,\n chevronRight: CaretRight,\n chevronDown: CaretDown,\n chevronUp: CaretUp,\n\n // Actions\n edit: Pencil,\n delete: Trash,\n add: Plus,\n remove: Minus,\n download: Download,\n upload: Upload,\n refresh: ArrowClockwise,\n save: FloppyDisk,\n copy: Copy,\n\n // Status & Feedback\n loader: SpinnerGap,\n success: CheckCircle,\n error: XCircle,\n alertCircle: WarningCircle,\n warning: WarningCircle,\n info: Info,\n check: Check,\n circle: Circle,\n helpCircle: Question,\n\n // User & Auth\n user: User,\n users: Users,\n userPlus: UserPlus,\n logIn: SignIn,\n logOut: SignOut,\n eye: Eye,\n eyeOff: EyeSlash,\n\n // Data & Analytics\n chart: ChartBar,\n barChart: ChartBar,\n trendingUp: TrendUp,\n activity: Pulse,\n database: Database,\n zap: Lightning,\n\n // Files & Content\n fileText: FileText,\n file: File,\n folder: Folder,\n book: Book,\n bookOpen: BookOpen,\n\n // Communication\n mail: Envelope,\n message: ChatCircle,\n phone: Phone,\n\n // Media\n image: Image,\n video: Video,\n camera: Camera,\n\n // Emotions\n smile: Smiley,\n frown: SmileySad,\n meh: SmileyMeh,\n\n // Security\n lock: Lock,\n unlock: LockOpen,\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 sparkle: Sparkle,\n sparkles: Sparkle,\n globe: Globe,\n smartphone: DeviceMobile,\n deviceMobile: DeviceMobile,\n floppyDisk: FloppyDisk,\n\n // Connectivity\n ticket: Ticket,\n clipboard: Clipboard,\n wifi: WifiHigh,\n wifiOff: WifiSlash,\n cpu: Cpu,\n mask: MaskHappy,\n\n // Text Formatting (Markdown Toolbar)\n bold: TextB,\n italic: TextItalic,\n strikethrough: TextStrikethrough,\n heading: TextHOne,\n link: Link,\n code: Code,\n fileCode: FileCode,\n quote: Quotes,\n list: List,\n listOrdered: ListNumbers,\n minus: Minus,\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',\n angry: 'frown',\n love: 'heart',\n like: 'heart',\n dislike: '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 * Case Conversion Utilities\n *\n * 문자열 케이스 변환 유틸리티 함수들입니다.\n * Utility functions for string case conversion.\n */\n\n/**\n * 문자열을 camelCase로 변환합니다.\n * Converts a string to camelCase.\n *\n * @param str - 변환할 문자열 / String to convert\n * @returns camelCase 문자열 / camelCase string\n *\n * @example\n * toCamelCase('arrow-left') // 'arrowLeft'\n * toCamelCase('arrow_left') // 'arrowLeft'\n * toCamelCase('ArrowLeft') // 'arrowLeft'\n * toCamelCase('arrowLeft') // 'arrowLeft'\n * toCamelCase('HEART') // 'heart'\n */\nexport function toCamelCase(str: string): string {\n if (!str) return str\n\n // 이미 camelCase인지 확인 (kebab/snake가 아니고 첫 글자가 소문자)\n if (!/[-_]/.test(str) && /^[a-z]/.test(str)) {\n return str\n }\n\n // 전체가 대문자인 경우 (HEART, USER 등) → 전체 소문자로\n if (/^[A-Z]+$/.test(str)) {\n return str.toLowerCase()\n }\n\n // PascalCase를 camelCase로 변환 (ArrowLeft → arrowLeft)\n if (/^[A-Z]/.test(str) && !/[-_]/.test(str)) {\n return str.charAt(0).toLowerCase() + str.slice(1)\n }\n\n // kebab-case 또는 snake_case를 camelCase로 변환\n return str\n .split(/[-_]/)\n .map((word, index) => {\n if (index === 0) {\n return word.toLowerCase()\n }\n return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()\n })\n .join('')\n}\n\n/**\n * 문자열을 PascalCase로 변환합니다.\n * Converts a string to PascalCase.\n *\n * @param str - 변환할 문자열 / String to convert\n * @returns PascalCase 문자열 / PascalCase string\n *\n * @example\n * toPascalCase('arrow-left') // 'ArrowLeft'\n * toPascalCase('arrow_left') // 'ArrowLeft'\n * toPascalCase('arrowLeft') // 'ArrowLeft'\n * toPascalCase('ArrowLeft') // 'ArrowLeft'\n */\nexport function toPascalCase(str: string): string {\n if (!str) return str\n\n // 이미 PascalCase인지 확인\n if (/^[A-Z]/.test(str) && !/[-_]/.test(str)) {\n return str\n }\n\n // kebab-case 또는 snake_case가 포함된 경우\n if (/[-_]/.test(str)) {\n return str\n .split(/[-_]/)\n .map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join('')\n }\n\n // camelCase를 PascalCase로 변환\n return str.charAt(0).toUpperCase() + str.slice(1)\n}\n","/**\n * Icon Provider System\n *\n * 각 프로바이더별 로딩 전략 / Loading strategies per provider:\n *\n * 1. Phosphor Icons (https://phosphoricons.com) - default\n * - Official package: @phosphor-icons/react (MIT License)\n * - icons.ts에서 정적 import (SSR-safe /dist/ssr)\n * - PROJECT_ICONS 매핑으로 통합 이름 지원\n * - 폴백: initPhosphorIcons()로 동적 namespace 조회\n *\n * 2. Lucide Icons (https://lucide.dev) - deprecated, backward compat\n * - initLucideIcons() 호출 시에만 로드 / Lazy loaded on demand\n * - 향후 제거 예정 / Will be removed in future\n *\n * 3. Iconsax Icons (https://iconsax.io) - separate entry\n * - '@hua-labs/ui/iconsax'에서 import 시 자동 등록\n * - 코어 번들에 포함되지 않음 / Not in core bundle\n * - registerIconsaxResolver()로 lazy 연결\n */\n\nimport { toPascalCase } from './case-utils'\n\n// Phosphor Icons - lazy loaded (전체 namespace import 방지, createContext SSR 이슈)\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet PhosphorIcons: any = null\n\n// Lucide Icons - lazy loaded (하위호환, deprecated)\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet LucideIcons: any = null\n\n// Iconsax resolver - registered lazily when iconsax entry is loaded\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet iconsaxResolver: ((name: string, variant?: string) => any) | null = null\n\n/**\n * Register iconsax resolver (called from iconsax entry point).\n * Allows the core Icon component to resolve iconsax icons\n * without statically importing the iconsax bundle.\n */\nexport function registerIconsaxResolver(resolver: typeof iconsaxResolver) {\n iconsaxResolver = resolver\n}\n\n/**\n * Get registered iconsax resolver\n */\nexport function getIconsaxResolver() {\n return iconsaxResolver\n}\n\n// Icon Provider Type\nexport type IconProvider = 'lucide' | 'phosphor' | 'iconsax'\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', iconsax: 'Home2' },\n 'layout-dashboard': { lucide: 'LayoutDashboard', phosphor: 'SquaresFour' },\n 'folder': { lucide: 'Folder', phosphor: 'Folder', iconsax: 'Folder' },\n 'alert-circle': { lucide: 'AlertCircle', phosphor: 'WarningCircle', iconsax: 'Danger' },\n 'alertCircle': { lucide: 'AlertCircle', phosphor: 'WarningCircle', iconsax: 'Danger' },\n 'columns': { lucide: 'Columns', phosphor: 'Columns' },\n 'users': { lucide: 'Users', phosphor: 'Users', iconsax: 'People' },\n 'settings': { lucide: 'Settings', phosphor: 'Gear' },\n 'menu': { lucide: 'Menu', phosphor: 'List', iconsax: 'Menu' },\n 'close': { lucide: 'X', phosphor: 'X', iconsax: 'CloseCircle' },\n 'chevronLeft': { lucide: 'ChevronLeft', phosphor: 'CaretLeft', iconsax: 'ArrowLeft2' },\n 'chevronRight': { lucide: 'ChevronRight', phosphor: 'CaretRight', iconsax: 'ArrowRight2' },\n 'chevronDown': { lucide: 'ChevronDown', phosphor: 'CaretDown', iconsax: 'ArrowDown2' },\n 'chevronUp': { lucide: 'ChevronUp', phosphor: 'CaretUp', iconsax: 'ArrowUp2' },\n 'arrowLeft': { lucide: 'ArrowLeft', phosphor: 'ArrowLeft', iconsax: 'ArrowLeft' },\n 'arrowRight': { lucide: 'ArrowRight', phosphor: 'ArrowRight', iconsax: 'ArrowRight' },\n 'arrowUp': { lucide: 'ArrowUp', phosphor: 'ArrowUp', iconsax: 'ArrowUp' },\n 'arrowDown': { lucide: 'ArrowDown', phosphor: 'ArrowDown', iconsax: 'ArrowDown' },\n\n // Actions\n 'add': { lucide: 'Plus', phosphor: 'Plus', iconsax: 'Add' },\n 'edit': { lucide: 'Edit', phosphor: 'Pencil' },\n 'pencil': { lucide: 'Pencil', phosphor: 'Pencil' },\n 'delete': { lucide: 'Trash2', phosphor: 'Trash', iconsax: 'Trash' },\n 'trash': { lucide: 'Trash2', phosphor: 'Trash', iconsax: 'Trash' },\n 'upload': { lucide: 'Upload', phosphor: 'Upload', iconsax: 'Upload' },\n 'download': { lucide: 'Download', phosphor: 'Download', iconsax: 'Download' },\n 'x': { lucide: 'X', phosphor: 'X' },\n 'check': { lucide: 'Check', phosphor: 'Check', iconsax: 'Check' },\n 'search': { lucide: 'Search', phosphor: 'MagnifyingGlass', iconsax: 'SearchNormal' },\n 'share': { lucide: 'Share', phosphor: 'Share' },\n 'copy': { lucide: 'Copy', phosphor: 'Copy' },\n 'save': { lucide: 'Save', phosphor: 'FloppyDisk' },\n\n // Status & Feedback\n 'loader': { lucide: 'Loader2', phosphor: 'Spinner' },\n 'loader2': { lucide: 'Loader2', phosphor: 'Spinner' },\n 'check-circle': { lucide: 'CheckCircle', phosphor: 'CheckCircle', iconsax: 'TickCircle' },\n 'checkCircle': { lucide: 'CheckCircle', phosphor: 'CheckCircle', iconsax: 'TickCircle' },\n 'success': { lucide: 'CheckCircle', phosphor: 'CheckCircle', iconsax: 'TickCircle' },\n 'error': { lucide: 'XCircle', phosphor: 'XCircle', iconsax: 'CloseCircle' },\n 'warning': { lucide: 'AlertCircle', phosphor: 'WarningCircle', iconsax: 'Warning2' },\n 'info': { lucide: 'Info', phosphor: 'Info', iconsax: 'InfoCircle' },\n 'refresh': { lucide: 'RefreshCw', phosphor: 'ArrowClockwise', iconsax: 'Refresh' },\n 'refreshCw': { lucide: 'RefreshCw', phosphor: 'ArrowClockwise', iconsax: 'Refresh' },\n 'bell': { lucide: 'Bell', phosphor: 'Bell', iconsax: 'Bell' },\n 'heart': { lucide: 'Heart', phosphor: 'Heart', iconsax: 'Heart' },\n 'star': { lucide: 'Star', phosphor: 'Star', iconsax: 'Star' },\n 'bookmark': { lucide: 'Bookmark', phosphor: 'Bookmark' },\n\n // User & Auth\n 'user': { lucide: 'User', phosphor: 'User', iconsax: 'User' },\n 'userPlus': { lucide: 'UserPlus', phosphor: 'UserPlus', iconsax: 'UserAdd' },\n 'logIn': { lucide: 'LogIn', phosphor: 'SignIn', iconsax: 'Login' },\n 'logOut': { lucide: 'LogOut', phosphor: 'SignOut', iconsax: 'Logout' },\n 'chrome': { lucide: 'Chrome', phosphor: 'ChromeLogo', iconsax: 'Chrome' },\n 'github': { lucide: 'Github', phosphor: 'GithubLogo' },\n 'message': { lucide: 'MessageCircle', phosphor: 'ChatCircle' },\n\n // Content\n 'messageSquare': { lucide: 'MessageSquare', phosphor: 'ChatSquare' },\n 'message-square': { lucide: 'MessageSquare', phosphor: 'ChatSquare' },\n 'inbox': { lucide: 'Inbox', phosphor: 'Inbox' },\n 'calendar': { lucide: 'Calendar', phosphor: 'Calendar' },\n 'calendarPlus': { lucide: 'CalendarPlus', phosphor: 'CalendarPlus' },\n 'checkSquare': { lucide: 'CheckSquare', phosphor: 'CheckSquare', iconsax: 'TickSquare' },\n 'clock': { lucide: 'Clock', phosphor: 'Clock' },\n 'book': { lucide: 'Book', phosphor: 'Book', iconsax: 'Book' },\n 'bookOpen': { lucide: 'BookOpen', phosphor: 'BookOpen', iconsax: 'Book' },\n\n // Theme & UI\n 'monitor': { lucide: 'Monitor', phosphor: 'Monitor', iconsax: 'Monitor' },\n 'sun': { lucide: 'Sun', phosphor: 'Sun', iconsax: 'Sun' },\n 'moon': { lucide: 'Moon', phosphor: 'Moon', iconsax: 'Moon' },\n\n // AI & Features\n 'sparkle': { lucide: 'Sparkle', phosphor: 'Sparkle' },\n 'sparkles': { lucide: 'Sparkles', phosphor: 'Sparkle' },\n 'lightbulb': { lucide: 'Lightbulb', phosphor: 'Lightbulb' },\n 'brain': { lucide: 'Brain', phosphor: 'Brain' },\n 'zap': { lucide: 'Zap', phosphor: 'Lightning' },\n\n // Device & Platform\n 'globe': { lucide: 'Globe', phosphor: 'Globe', iconsax: 'Global' },\n 'deviceMobile': { lucide: 'Smartphone', phosphor: 'DeviceMobile' },\n 'smartphone': { lucide: 'Smartphone', phosphor: 'DeviceMobile' },\n 'floppyDisk': { lucide: 'Save', phosphor: 'FloppyDisk' },\n\n // Data & Analytics\n 'chart': { lucide: 'BarChart3', phosphor: 'ChartBar' },\n 'barChart': { lucide: 'BarChart', phosphor: 'ChartBar' },\n 'trendingUp': { lucide: 'TrendingUp', phosphor: 'TrendUp' },\n 'trendingDown': { lucide: 'TrendingDown', phosphor: 'TrendDown' },\n 'activity': { lucide: 'Activity', phosphor: 'Pulse' },\n 'database': { lucide: 'Database', phosphor: 'Database' },\n 'dollarSign': { lucide: 'DollarSign', phosphor: 'CurrencyDollar' },\n 'dollar': { lucide: 'DollarSign', phosphor: 'CurrencyDollar' },\n 'currency': { lucide: 'DollarSign', phosphor: 'CurrencyDollar' },\n\n 'layers': { lucide: 'Layers', phosphor: 'Stack' },\n 'ban': { lucide: 'Ban', phosphor: 'Prohibit' },\n\n // Security\n 'lock': { lucide: 'Lock', phosphor: 'Lock', iconsax: 'Lock' },\n 'unlock': { lucide: 'Unlock', phosphor: 'LockOpen', iconsax: 'Unlock' },\n 'shield': { lucide: 'Shield', phosphor: 'Shield', iconsax: 'Shield' },\n 'key': { lucide: 'Key', phosphor: 'Key' },\n\n // Media\n 'play': { lucide: 'Play', phosphor: 'Play', iconsax: 'Play' },\n 'pause': { lucide: 'Pause', phosphor: 'Pause', iconsax: 'Pause' },\n 'image': { lucide: 'Image', phosphor: 'Image', iconsax: 'Image' },\n 'video': { lucide: 'Video', phosphor: 'Video', iconsax: 'Video' },\n 'camera': { lucide: 'Camera', phosphor: 'Camera', iconsax: 'Camera' },\n\n // Files\n 'fileText': { lucide: 'FileText', phosphor: 'FileText' },\n 'file': { lucide: 'File', phosphor: 'File' },\n\n // Navigation\n 'externalLink': { lucide: 'ExternalLink', phosphor: 'ArrowSquareOut' },\n 'link': { lucide: 'Link', phosphor: 'Link', iconsax: 'Link' },\n 'moreHorizontal': { lucide: 'MoreHorizontal', phosphor: 'DotsThreeOutline' },\n 'moreVertical': { lucide: 'MoreVertical', phosphor: 'DotsThreeVertical' },\n\n // Priority\n 'remove': { lucide: 'Minus', phosphor: 'Minus', iconsax: 'Minus' },\n\n // Eye (password)\n 'eye': { lucide: 'Eye', phosphor: 'Eye', iconsax: 'Eye' },\n 'eyeOff': { lucide: 'EyeOff', phosphor: 'EyeSlash', iconsax: 'EyeSlash' },\n\n // Emotions\n 'smile': { lucide: 'Smile', phosphor: 'Smiley', iconsax: 'EmojiHappy' },\n 'frown': { lucide: 'Frown', phosphor: 'SmileySad', iconsax: 'EmojiSad' },\n 'meh': { lucide: 'Meh', phosphor: 'SmileyMeh', iconsax: 'EmojiNormal' },\n\n // Social\n 'mail': { lucide: 'Mail', phosphor: 'Envelope' },\n 'phone': { lucide: 'Phone', phosphor: 'Phone' },\n\n // Additional\n 'flag': { lucide: 'Flag', phosphor: 'Flag', iconsax: 'Flag' },\n 'rocket': { lucide: 'Rocket', phosphor: 'Rocket', iconsax: 'Rocket' },\n\n // Connectivity & Misc\n 'ticket': { lucide: 'Ticket', phosphor: 'Ticket', iconsax: 'Ticket' },\n 'clipboard': { lucide: 'ClipboardList', phosphor: 'Clipboard', iconsax: 'Sticker' },\n 'wifi': { lucide: 'Wifi', phosphor: 'WifiHigh', iconsax: 'Wifi' },\n 'wifiOff': { lucide: 'WifiOff', phosphor: 'WifiSlash' },\n 'cpu': { lucide: 'Cpu', phosphor: 'Cpu', iconsax: 'Computing' },\n 'mask': { lucide: 'Drama', phosphor: 'MaskHappy', iconsax: 'EmojiHappy' },\n\n // Text Formatting (Markdown Toolbar)\n 'bold': { lucide: 'Bold', phosphor: 'TextB' },\n 'italic': { lucide: 'Italic', phosphor: 'TextItalic' },\n 'strikethrough': { lucide: 'Strikethrough', phosphor: 'TextStrikethrough' },\n 'heading': { lucide: 'Heading', phosphor: 'TextHOne' },\n 'code': { lucide: 'Code', phosphor: 'Code', iconsax: 'Code' },\n 'fileCode': { lucide: 'FileCode', phosphor: 'FileCode' },\n 'quote': { lucide: 'Quote', phosphor: 'Quotes', iconsax: 'QuoteUp' },\n 'list': { lucide: 'List', phosphor: 'List' },\n 'listOrdered': { lucide: 'ListOrdered', phosphor: 'ListNumbers' },\n 'minus': { lucide: 'Minus', phosphor: 'Minus', iconsax: 'Minus' },\n} as const\n\n/**\n * Initialize Phosphor Icons (lazy load for fallback/dynamic lookup)\n * icons.ts의 개별 import와 별개로, PROJECT_ICONS fallback용\n */\nexport async function initPhosphorIcons() {\n if (typeof window === 'undefined') return null\n\n if (!PhosphorIcons) {\n try {\n const phosphorModule = await import('@phosphor-icons/react')\n PhosphorIcons = phosphorModule\n } catch {\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 * Initialize Lucide Icons (lazy load)\n */\nexport async function initLucideIcons() {\n if (typeof window === 'undefined') return null\n\n if (!LucideIcons) {\n try {\n const lucideModule = await import('lucide-react')\n LucideIcons = lucideModule\n } catch {\n console.warn('Lucide Icons not available. Install lucide-react to use lucide provider.')\n return null\n }\n }\n return LucideIcons\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 = 'phosphor'\n): 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 as Record<string, string | undefined>)[provider]\n\n switch (provider) {\n case 'phosphor':\n if (!mappedName || !PhosphorIcons) return null\n return PhosphorIcons?.[mappedName] || null\n\n case 'lucide':\n if (!mappedName || !LucideIcons) {\n return null\n }\n return LucideIcons?.[mappedName] || null\n\n case 'iconsax': {\n if (!iconsaxResolver) return null\n const iconsaxName = mappedName || toPascalCase(iconName)\n return iconsaxResolver(iconsaxName) || null\n }\n\n default:\n return null\n }\n}\n\n/**\n * Direct icon lookup (fallback for icons not in PROJECT_ICONS)\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\n): React.ComponentType<Record<string, unknown>> | null {\n switch (provider) {\n case 'phosphor': {\n if (!PhosphorIcons) return null\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\n case 'lucide': {\n if (!LucideIcons) {\n return null\n }\n const lucideName = iconName.charAt(0).toUpperCase() + iconName.slice(1)\n const camelCaseName = iconName.replace(/([A-Z])/g, (match) =>\n match === iconName[0] ? match.toLowerCase() : match\n )\n return LucideIcons?.[lucideName] ||\n LucideIcons?.[iconName] ||\n LucideIcons?.[camelCaseName] ||\n null\n }\n\n case 'iconsax': {\n if (!iconsaxResolver) return null\n const iconsaxName = toPascalCase(iconName)\n return iconsaxResolver(iconsaxName) || null\n }\n\n default:\n return null\n }\n}\n\n/**\n * Get icon name for 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\n): string {\n const iconMapping = PROJECT_ICONS[iconName as keyof typeof PROJECT_ICONS]\n if (iconMapping) {\n const mappedName = (iconMapping as Record<string, string | undefined>)[provider]\n if (mappedName) {\n return mappedName\n }\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 // kebab-case → camelCase mappings (자동 변환 지원)\n 'arrow-left': 'arrowLeft',\n 'arrow-right': 'arrowRight',\n 'arrow-up': 'arrowUp',\n 'arrow-down': 'arrowDown',\n 'chevron-left': 'chevronLeft',\n 'chevron-right': 'chevronRight',\n 'chevron-up': 'chevronUp',\n 'chevron-down': 'chevronDown',\n 'external-link': 'externalLink',\n 'more-horizontal': 'moreHorizontal',\n 'more-vertical': 'moreVertical',\n 'user-plus': 'userPlus',\n 'log-in': 'logIn',\n 'log-out': 'logOut',\n 'check-circle': 'checkCircle',\n 'check-square': 'checkSquare',\n 'alert-circle': 'alertCircle',\n 'eye-off': 'eyeOff',\n 'file-text': 'fileText',\n 'book-open': 'bookOpen',\n 'bar-chart': 'barChart',\n 'trending-up': 'trendingUp',\n 'trending-down': 'trendingDown',\n 'message-square': 'messageSquare',\n 'calendar-plus': 'calendarPlus',\n 'refresh-cw': 'refreshCw',\n 'dollar-sign': 'dollarSign',\n 'layout-dashboard': 'layoutDashboard',\n 'device-mobile': 'deviceMobile',\n 'floppy-disk': 'floppyDisk',\n\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 Name Normalization System\n *\n * 아이콘 이름 정규화를 위한 통합 시스템입니다.\n *\n * Features:\n * - kebab-case → camelCase conversion\n * - snake_case → camelCase conversion\n * - PascalCase → camelCase conversion\n * - Alias resolution\n * - Provider-specific name mapping\n */\n\nimport { ICON_ALIASES } from './icon-aliases'\nimport { toCamelCase, toPascalCase } from './case-utils'\n\n// Re-export case utils for backward compatibility\nexport { toCamelCase, toPascalCase } from './case-utils'\n\n// IconProvider type (avoid circular dependency with icon-providers.ts)\nexport type IconProviderType = 'lucide' | 'phosphor' | 'iconsax'\n\n/**\n * 정규화 결과 인터페이스\n */\nexport interface NormalizeResult {\n /** 정규화된 아이콘 이름 (camelCase) */\n normalized: string\n /** 원본 이름이 alias였는지 여부 */\n wasAlias: boolean\n /** 원본 alias 이름 (alias였던 경우) */\n originalAlias?: string\n}\n\n/**\n * 아이콘 이름을 정규화합니다.\n *\n * @example\n * normalizeIconName('arrow-left') // { normalized: 'arrowLeft', wasAlias: false }\n * normalizeIconName('back') // { normalized: 'arrowLeft', wasAlias: true, originalAlias: 'back' }\n * normalizeIconName('ArrowLeft') // { normalized: 'arrowLeft', wasAlias: false }\n */\nexport function normalizeIconName(iconName: string): NormalizeResult {\n if (!iconName || typeof iconName !== 'string') {\n return { normalized: iconName || '', wasAlias: false }\n }\n\n const camelCased = toCamelCase(iconName)\n const aliasTarget = ICON_ALIASES[iconName] || ICON_ALIASES[camelCased]\n\n if (aliasTarget) {\n return {\n normalized: aliasTarget,\n wasAlias: true,\n originalAlias: iconName\n }\n }\n\n return {\n normalized: camelCased,\n wasAlias: false\n }\n}\n\n/**\n * 프로바이더별 아이콘 이름을 반환합니다.\n *\n * @example\n * getProviderIconName('arrowLeft', 'lucide') // 'ArrowLeft'\n * getProviderIconName('heart', 'iconsax') // 'Heart'\n */\nexport function getProviderIconName(\n normalizedName: string,\n provider: IconProviderType\n): string {\n switch (provider) {\n case 'lucide':\n case 'phosphor':\n case 'iconsax':\n return toPascalCase(normalizedName)\n default:\n return normalizedName\n }\n}\n","/**\n * Icon Config Types\n *\n * Icon 시스템의 설정 타입 정의\n * 상태관리는 서비스 레벨에서 관리 (Zustand 등)\n */\n\nexport type IconSet = 'lucide' | 'phosphor' | 'iconsax'\n\nexport type PhosphorWeight = 'thin' | 'light' | 'regular' | 'bold' | 'duotone' | 'fill'\n\nexport type IconsaxVariant = 'line' | 'bold'\n\nexport interface IconConfig {\n set: IconSet\n weight: PhosphorWeight\n size: number\n color: string\n strokeWidth?: number // Lucide용\n iconsaxVariant?: IconsaxVariant // Iconsax용 (line | bold)\n}\n\nexport const defaultIconConfig: IconConfig = {\n set: 'lucide',\n weight: 'regular',\n size: 20,\n color: 'currentColor',\n strokeWidth: 1.25,\n iconsaxVariant: 'line',\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 'iconsax':\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 *\n * @example\n * ```tsx\n * <IconProvider set=\"phosphor\" weight=\"regular\" size={20}>\n * <App />\n * </IconProvider>\n * ```\n */\n\nimport React, { createContext, useContext } from 'react'\nimport { type IconConfig, type IconSet, type PhosphorWeight, type IconsaxVariant, defaultIconConfig } from './icon-store'\n\n/**\n * IconProvider 컴포넌트 Props\n */\nexport interface IconProviderProps {\n /** 아이콘 세트 (lucide, phosphor, iconsax) */\n set?: IconSet\n /** Phosphor 아이콘 weight */\n weight?: PhosphorWeight\n /** Iconsax 아이콘 변형 (line, bold) */\n iconsaxVariant?: IconsaxVariant\n /** 기본 아이콘 크기 */\n size?: number\n /** 기본 아이콘 색상 */\n color?: string\n /** Lucide/Iconsax 아이콘 stroke width */\n strokeWidth?: number\n /** 자식 컴포넌트 */\n children: React.ReactNode\n}\n\ninterface IconContextValue extends IconConfig {}\n\nconst IconContext = createContext<IconContextValue>(defaultIconConfig)\n\nexport function IconProvider({\n set = defaultIconConfig.set,\n weight = defaultIconConfig.weight,\n iconsaxVariant = defaultIconConfig.iconsaxVariant,\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 iconsaxVariant,\n size,\n color,\n strokeWidth,\n }\n\n return (\n <IconContext.Provider value={value}>\n {children}\n </IconContext.Provider>\n )\n}\n\nexport function useIconContext(): IconContextValue {\n return useContext(IconContext)\n}\n\n// Re-export types for convenience\nexport type { IconSet, PhosphorWeight, IconsaxVariant, IconConfig } from './icon-store'\nexport { defaultIconConfig, getDefaultStrokeWidth } from './icon-store'\n","import React from 'react'\nimport type { IconProps as PhosphorIconProps } from '@phosphor-icons/react'\nimport { merge, mergeMap } from '../../lib/utils'\nimport { icons, IconName, emotionIcons, statusIcons } from '../../lib/icons'\nimport { getIconFromProvider, getIconsaxResolver, initPhosphorIcons, initLucideIcons, getIconNameForProvider } from '../../lib/icon-providers'\nimport { normalizeIconName } from '../../lib/normalize-icon-name'\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 */\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 */\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' | 'inherit'\n /** Phosphor 아이콘 weight 오버라이드 / Phosphor icon weight override */\n weight?: PhosphorWeight\n /** 스크린 리더용 라벨 / Screen reader label */\n 'aria-label'?: string\n /** 장식용 아이콘 / Decorative icon (hidden from screen readers) */\n 'aria-hidden'?: boolean\n}\n\n/**\n * Icon 컴포넌트\n *\n * 다중 아이콘 라이브러리(Phosphor, Lucide, Iconsax)를 지원하는 통합 아이콘 컴포넌트.\n * IconProvider를 통해 전역 설정을 관리하며, 개별 아이콘에서도 오버라이드 가능.\n *\n * Iconsax는 별도 entry('@hua-labs/ui/iconsax')를 import해야 동작합니다.\n *\n * @example\n * ```tsx\n * <Icon name=\"heart\" />\n * <Icon name=\"user\" size={24} />\n * <Icon name=\"check\" variant=\"success\" />\n * <Icon name=\"loader\" spin />\n * ```\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 const config = useIconContext()\n\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 const iconsaxVariant = config.iconsaxVariant ?? 'line'\n\n const [isClient, setIsClient] = React.useState(false)\n const [providerReady, setProviderReady] = React.useState(false)\n\n React.useEffect(() => {\n setIsClient(true)\n\n // Provider별 lazy load 초기화\n if (iconSet === 'lucide') {\n initLucideIcons().then(() => setProviderReady(true))\n } else if (iconSet === 'phosphor') {\n initPhosphorIcons().then(() => setProviderReady(true))\n } else {\n setProviderReady(true)\n }\n }, [iconSet])\n\n // 통합 정규화\n const resolvedIcon = React.useMemo(() => {\n const baseName = emotion ? emotionIcons[emotion] :\n status ? statusIcons[status] : name\n const { normalized } = normalizeIconName(baseName)\n const providerName = getIconNameForProvider(normalized, iconSet)\n return { normalized, providerName }\n }, [name, emotion, status, iconSet])\n\n const iconName = resolvedIcon.normalized as AllIconName\n\n // Iconsax: resolver를 통해 가져오기 (iconsax entry import 시 자동 등록됨)\n const iconsaxIcon = React.useMemo(() => {\n if (iconSet === 'iconsax' && isClient) {\n const resolver = getIconsaxResolver()\n if (resolver) {\n return resolver(resolvedIcon.providerName, iconsaxVariant)\n }\n }\n return null\n }, [iconSet, resolvedIcon.providerName, isClient, iconsaxVariant])\n\n // 색상 변형 클래스\n const variantClasses = mergeMap({\n 'text-current': variant === 'default',\n 'text-primary': variant === 'primary',\n 'text-muted-foreground': variant === 'secondary' || variant === 'muted',\n 'text-green-600 dark:text-green-400': variant === 'success',\n 'text-yellow-600 dark:text-yellow-400': variant === 'warning',\n 'text-destructive': variant === 'error',\n })\n\n // 서버사이드에서는 빈 span 반환\n if (!isClient) {\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<PhosphorIconProps | React.SVGProps<SVGSVGElement> | Record<string, unknown>>\n let ResolvedIcon: IconComponentType | null = null\n\n if (iconSet === 'phosphor') {\n // 1. icons.ts에서 먼저 찾기 (Phosphor 아이콘이 기본, 정적 import)\n ResolvedIcon = (icons[iconName as IconName] || null) as IconComponentType | null\n // 2. 없으면 동적으로 Phosphor namespace에서 가져오기 (fallback, providerReady 필요)\n if (!ResolvedIcon && providerReady) {\n ResolvedIcon = getIconFromProvider(iconName, iconSet) as IconComponentType | null\n }\n } else if (iconSet === 'iconsax') {\n ResolvedIcon = iconsaxIcon as IconComponentType | null\n if (!ResolvedIcon) {\n ResolvedIcon = getIconFromProvider(iconName, iconSet) as IconComponentType | null\n }\n } else {\n // Lucide나 다른 provider\n ResolvedIcon = getIconFromProvider(iconName, iconSet) as IconComponentType | null\n }\n\n if (!ResolvedIcon) {\n if (iconSet === 'iconsax' && !getIconsaxResolver()) {\n if (process.env.NODE_ENV === 'development') {\n console.warn(\n `Icon \"${iconName}\" — iconsax resolver not registered. ` +\n `Use HuaProvider with icons.set='iconsax', or add: import '@hua-labs/ui/iconsax'`\n )\n }\n } else {\n console.warn(`Icon \"${iconName}\" not found for provider \"${iconSet}\"`)\n }\n return (\n <span\n ref={ref}\n className={merge(\n 'inline-flex items-center justify-center rounded-full border-2 border-dashed border-border',\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-muted-foreground\" aria-hidden=\"true\">\n ?\n </span>\n </span>\n )\n }\n\n // 세트별 props 준비\n type IconPropsType = PhosphorIconProps & {\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 if (iconSet === 'phosphor') {\n iconProps.weight = iconWeight\n } else {\n iconProps.strokeWidth = iconStrokeWidth\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 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 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 {ResolvedIcon && React.createElement(ResolvedIcon, {\n ...iconProps,\n className: variantClasses,\n 'aria-hidden': true\n } as React.ComponentProps<typeof ResolvedIcon>)}\n </span>\n )\n})\n\nIconComponent.displayName = 'Icon'\n\nconst MemoizedIcon = React.memo(IconComponent, (prevProps, nextProps) => {\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\nexport const Icon = MemoizedIcon as typeof IconComponent\nIcon.displayName = 'Icon'\n\nexport const EmotionIcon = React.forwardRef<HTMLSpanElement, Omit<IconProps, 'name'> & { emotion: keyof typeof emotionIcons }>(\n (props, ref) => <Icon ref={ref} name=\"smile\" {...props} />\n)\nEmotionIcon.displayName = 'EmotionIcon'\n\nexport const StatusIcon = React.forwardRef<HTMLSpanElement, Omit<IconProps, 'name'> & { status: keyof typeof statusIcons }>(\n (props, ref) => <Icon ref={ref} name=\"info\" {...props} />\n)\nStatusIcon.displayName = 'StatusIcon'\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)\nLoadingIcon.displayName = 'LoadingIcon'\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)\nSuccessIcon.displayName = 'SuccessIcon'\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)\nErrorIcon.displayName = 'ErrorIcon'\n","\"use client\"\n\nimport React, { useState } from \"react\"\nimport { cva } from \"class-variance-authority\"\nimport { merge } from \"../lib/utils\"\n\nexport const avatarVariants = cva(\n \"relative flex shrink-0 overflow-hidden rounded-full\",\n {\n variants: {\n size: {\n sm: \"w-8 h-8 text-xs\",\n md: \"w-10 h-10 text-sm\",\n lg: \"w-12 h-12 text-base\",\n },\n variant: {\n default: \"\",\n glass: \"ring-1 ring-white/30 backdrop-blur-sm\",\n },\n },\n defaultVariants: {\n size: \"md\",\n variant: \"default\",\n },\n }\n)\n\n/**\n * Avatar 컴포넌트의 props / Avatar component props\n */\nexport interface AvatarProps extends React.HTMLAttributes<HTMLDivElement> {\n size?: \"sm\" | \"md\" | \"lg\"\n variant?: \"default\" | \"glass\"\n src?: string\n alt?: string\n fallbackText?: string\n}\n\nexport interface AvatarImageProps extends React.ImgHTMLAttributes<HTMLImageElement> {}\nexport interface AvatarFallbackProps extends React.HTMLAttributes<HTMLDivElement> {}\n\n/**\n * Avatar 컴포넌트 / Avatar component\n *\n * 사용자 프로필 이미지를 표시하는 컴포넌트입니다.\n *\n * @example\n * <Avatar src=\"/user.jpg\" alt=\"사용자\" />\n * <Avatar alt=\"홍길동\">홍</Avatar>\n * <Avatar variant=\"glass\" size=\"lg\" src=\"/user.jpg\" alt=\"사용자\" />\n */\nconst Avatar = React.forwardRef<HTMLDivElement, AvatarProps>(\n ({ className, size = \"md\", variant = \"default\", src, alt, fallbackText, children, ...props }, ref) => {\n const [imgError, setImgError] = useState(false)\n\n const getFallbackContent = () => {\n if (fallbackText) return fallbackText\n if (children) return children\n if (alt) return alt.charAt(0).toUpperCase()\n return \"U\"\n }\n\n const showImage = src && !imgError\n\n return (\n <div\n ref={ref}\n className={merge(avatarVariants({ size, variant }), className)}\n {...props}\n >\n {showImage ? (\n <AvatarImage\n src={src}\n alt={alt || \"avatar\"}\n onError={() => setImgError(true)}\n />\n ) : (\n <AvatarFallback>\n {getFallbackContent()}\n </AvatarFallback>\n )}\n </div>\n )\n }\n)\nAvatar.displayName = \"Avatar\"\n\nconst AvatarImage = React.forwardRef<HTMLImageElement, AvatarImageProps>(\n ({ className, ...props }, ref) => (\n <img\n ref={ref}\n className={merge(\"aspect-square h-full w-full object-cover object-center\", className)}\n {...props}\n />\n )\n)\nAvatarImage.displayName = \"AvatarImage\"\n\nconst AvatarFallback = React.forwardRef<HTMLDivElement, AvatarFallbackProps>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\n \"flex h-full w-full items-center justify-center rounded-full bg-primary text-primary-foreground font-semibold\",\n className\n )}\n {...props}\n />\n )\n)\nAvatarFallback.displayName = \"AvatarFallback\"\n\nexport { Avatar, AvatarImage, AvatarFallback } ","\"use client\"\n\nimport React from \"react\"\nimport { createPortal } from \"react-dom\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * Modal 컴포넌트의 props / Modal component props\n * @typedef {Object} ModalProps\n * @property {boolean} isOpen - 모달 열림/닫힘 상태 / Modal open/close state\n * @property {() => void} onClose - 모달 닫기 콜백 함수 / Modal close callback function\n * @property {React.ReactNode} children - 모달 내용 / Modal content\n * @property {\"sm\" | \"md\" | \"lg\" | \"xl\" | \"2xl\" | \"3xl\"} [size=\"md\"] - 모달 크기 / Modal size\n * @property {boolean} [closable=true] - 닫기 버튼 표시 여부 / Show close button\n * @property {boolean} [closeOnOverlayClick=true] - 오버레이 클릭 시 닫기 여부 / Close on overlay click\n * @property {string} [title] - 모달 제목 / Modal title\n * @property {string} [description] - 모달 설명 / Modal description\n * @property {boolean} [showBackdrop=true] - 배경 오버레이 표시 여부 / Show backdrop overlay\n * @property {string} [backdropClassName] - 배경 오버레이 추가 CSS 클래스 / Additional CSS class for backdrop\n * @property {boolean} [centered=true] - 모달을 화면 중앙에 배치할지 여부 / Center modal on screen\n * @property {string} [className] - 모달 컨테이너 추가 CSS 클래스 / Additional CSS class for modal container\n */\nexport interface ModalProps {\n /** 모달 열림/닫힘 상태 / Modal open/close state */\n isOpen: boolean\n /** 모달 닫기 콜백 함수 / Modal close callback function */\n onClose: () => void\n /** 모달 내용 / Modal content */\n children: React.ReactNode\n /** 모달 크기 / Modal size */\n size?: \"sm\" | \"md\" | \"lg\" | \"xl\" | \"2xl\" | \"3xl\"\n /** 닫기 버튼 표시 여부 / Show close button */\n closable?: boolean\n /** 오버레이 클릭 시 닫기 여부 / Close on overlay click */\n closeOnOverlayClick?: boolean\n /** 모달 제목 / Modal title */\n title?: string\n /** 모달 설명 / Modal description */\n description?: string\n /** 배경 오버레이 표시 여부 / Show backdrop overlay */\n showBackdrop?: boolean\n /** 배경 오버레이 추가 CSS 클래스 / Additional CSS class for backdrop */\n backdropClassName?: string\n /** 모달을 화면 중앙에 배치할지 여부 / Center modal on screen */\n centered?: boolean\n /** 모달 컨테이너 추가 CSS 클래스 / Additional CSS class for modal container */\n className?: string\n}\n\n// Ref 병합 유틸리티\nfunction useCombinedRefs<T>(...refs: (React.Ref<T> | undefined)[]): React.RefCallback<T> {\n return React.useCallback(\n (node: T) => {\n refs.forEach((ref) => {\n if (!ref) return;\n if (typeof ref === \"function\") {\n ref(node);\n } else {\n (ref as React.MutableRefObject<T | null>).current = node;\n }\n });\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n refs\n );\n}\n\n/**\n * Modal 컴포넌트 / Modal component\n * \n * 오버레이와 함께 표시되는 모달 다이얼로그 컴포넌트입니다.\n * ESC 키로 닫기, 오버레이 클릭으로 닫기, 접근성 속성(ARIA)을 지원합니다.\n * \n * Modal dialog component displayed with overlay.\n * Supports closing with ESC key, overlay click, and ARIA accessibility attributes.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * const [isOpen, setIsOpen] = useState(false)\n * \n * <Modal isOpen={isOpen} onClose={() => setIsOpen(false)}>\n * <p>모달 내용</p>\n * </Modal>\n * \n * @example\n * // 제목과 설명 포함 / With title and description\n * <Modal\n * isOpen={isOpen}\n * onClose={() => setIsOpen(false)}\n * title=\"확인\"\n * description=\"이 작업을 계속하시겠습니까?\"\n * >\n * <Button onClick={handleConfirm}>확인</Button>\n * </Modal>\n * \n * @example\n * // 큰 크기 모달 / Large size modal\n * <Modal\n * isOpen={isOpen}\n * onClose={() => setIsOpen(false)}\n * size=\"xl\"\n * closeOnOverlayClick={false}\n * >\n * <div>큰 모달 내용</div>\n * </Modal>\n * \n * @param {ModalProps} props - Modal 컴포넌트의 props / Modal component props\n * @param {React.Ref<HTMLDivElement>} ref - 모달 컨테이너 ref / Modal container ref\n * @returns {JSX.Element} Modal 컴포넌트 / Modal component\n */\nexport const Modal = React.forwardRef<HTMLDivElement, ModalProps>(\n ({\n className,\n isOpen,\n onClose,\n children,\n size = \"md\",\n closable,\n closeOnOverlayClick = true,\n title,\n description,\n showBackdrop = true,\n backdropClassName,\n centered = true\n }, ref) => {\n const _closable = closable ?? true\n const modalRef = React.useRef<HTMLDivElement>(null)\n const combinedRef = useCombinedRefs(ref, modalRef)\n\n // ESC 키로 모달 닫기 및 스크롤 잠금 (화면 흔들림 방지)\n React.useEffect(() => {\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n onClose()\n }\n }\n\n if (isOpen) {\n document.addEventListener(\"keydown\", handleEscape)\n // 스크롤바 너비 계산하여 padding 추가 (화면 흔들림 방지)\n const scrollbarWidth = window.innerWidth - document.documentElement.clientWidth\n document.body.style.overflow = \"hidden\"\n document.body.style.paddingRight = `${scrollbarWidth}px`\n }\n\n return () => {\n document.removeEventListener(\"keydown\", handleEscape)\n document.body.style.overflow = \"unset\"\n document.body.style.paddingRight = \"unset\"\n }\n }, [isOpen, onClose])\n\n // 모달 외부 클릭으로 닫기\n const handleOverlayClick = (e: React.MouseEvent) => {\n if (closeOnOverlayClick && e.target === e.currentTarget) {\n onClose()\n }\n }\n\n // 모달 크기 클래스 (max-w 기반, 콘텐츠에 맞게 자연스럽게 축소)\n const sizeClasses = {\n sm: \"max-w-xs\", // 320px\n md: \"max-w-sm\", // 384px\n lg: \"max-w-md\", // 448px\n xl: \"max-w-lg\", // 512px\n \"2xl\": \"max-w-xl\", // 576px\n \"3xl\": \"max-w-2xl\" // 672px\n }\n\n // 접근성을 위한 ID 생성\n const generatedTitleId = React.useId()\n const generatedDescId = React.useId()\n const titleId = title ? `modal-title-${generatedTitleId}` : undefined;\n const descriptionId = description ? `modal-description-${generatedDescId}` : undefined;\n\n // SSR에서는 document가 없으므로 체크\n const [mounted, setMounted] = React.useState(false)\n React.useEffect(() => {\n setMounted(true)\n }, [])\n\n if (!isOpen) return null\n\n const modalContent = (\n <div\n className={merge(\n \"fixed inset-0 z-50 overflow-y-auto\",\n className\n )}\n onClick={handleOverlayClick}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={titleId}\n aria-describedby={descriptionId}\n >\n {/* 배경 오버레이 - pointer-events-none으로 클릭이 뒤로 전달됨 */}\n {showBackdrop && (\n <div className={merge(\n \"fixed inset-0 bg-black/60 backdrop-blur-md transition-opacity duration-300 pointer-events-none\",\n backdropClassName\n )} />\n )}\n\n {/* 센터링 컨테이너 */}\n <div className={merge(\n \"flex h-full justify-center p-4\",\n centered ? \"items-center\" : \"items-start pt-16\"\n )}>\n {/* 모달 컨테이너 */}\n {/* CSS 변수 기반 배경색 (Tailwind v4 dark: + bg-* 충돌 우회) */}\n <div\n ref={combinedRef}\n className={merge(\n \"relative bg-[var(--modal-bg)] rounded-lg shadow-2xl border border-[var(--modal-border)] transform transition-all duration-300 ease-out\",\n sizeClasses[size]\n )}\n style={{\n animation: \"modalSlideIn 0.3s cubic-bezier(0.16, 1, 0.3, 1)\"\n }}\n >\n \n {/* 헤더 */}\n {title && (\n <div className=\"relative z-10 px-6 pt-6 pb-4 border-b border-border/50\">\n {/* 타이틀과 닫기 버튼 - 같은 줄, 양쪽 끝 */}\n <div className=\"flex items-center justify-between gap-4 mb-2\">\n <h2 id={titleId} className=\"text-xl font-semibold text-foreground flex-1 min-w-0\">{title}</h2>\n {/* 닫기 버튼 - 타이틀과 같은 계층의 오른쪽 끝 */}\n {_closable && (\n <button\n onClick={onClose}\n className=\"flex-shrink-0 p-2 text-muted-foreground hover:text-foreground transition-all duration-200 rounded-full hover:bg-muted focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-2 z-20\"\n aria-label=\"닫기\"\n >\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n )}\n </div>\n {/* 설명 - 아래 줄 */}\n {description && (\n <p id={descriptionId} className=\"text-sm text-muted-foreground\">{description}</p>\n )}\n </div>\n )}\n\n {/* 타이틀이 없을 때만 별도 닫기 버튼 */}\n {!title && _closable && (\n <button\n onClick={onClose}\n className=\"absolute top-4 right-4 p-2 text-muted-foreground hover:text-foreground transition-all duration-200 rounded-full hover:bg-muted focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-2 z-20\"\n aria-label=\"닫기\"\n >\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n )}\n \n {/* 모달 내용 */}\n <div className={`relative z-10 ${title ? 'px-6 mb-6' : 'p-6'}`}>\n {children}\n </div>\n </div>\n </div>\n </div>\n )\n\n // 브라우저에서만 createPortal 사용 (SSR 호환)\n if (mounted && typeof document !== 'undefined') {\n return createPortal(modalContent, document.body)\n }\n\n // SSR fallback - 그냥 렌더링 (첫 렌더링에는 보이지 않음)\n return null\n})\n\nModal.displayName = \"Modal\" ","\"use client\"\n\nimport React from \"react\"\nimport { cva } from \"class-variance-authority\"\nimport { merge } from \"../lib/utils\"\n\nexport const containerVariants = cva(\n \"w-full\",\n {\n variants: {\n size: {\n sm: \"max-w-2xl\",\n md: \"max-w-4xl\",\n lg: \"max-w-6xl\",\n xl: \"max-w-7xl\",\n full: \"max-w-full\",\n },\n padding: {\n none: \"\",\n sm: \"px-3 sm:px-4 py-6 sm:py-8\",\n md: \"px-4 sm:px-6 py-8 sm:py-12\",\n lg: \"px-4 sm:px-6 lg:px-8 py-10 sm:py-16\",\n xl: \"px-6 sm:px-8 lg:px-12 py-12 sm:py-20\",\n },\n },\n defaultVariants: {\n size: \"lg\",\n padding: \"md\",\n },\n }\n)\n\n/**\n * Container 컴포넌트의 props\n */\nexport interface ContainerProps extends React.HTMLAttributes<HTMLDivElement> {\n size?: \"sm\" | \"md\" | \"lg\" | \"xl\" | \"full\"\n padding?: \"none\" | \"sm\" | \"md\" | \"lg\" | \"xl\"\n centered?: boolean\n fluid?: boolean\n}\n\n/**\n * Container 컴포넌트\n *\n * 콘텐츠를 감싸는 컨테이너 컴포넌트입니다.\n * 반응형 최대 너비와 패딩을 제공하여 일관된 레이아웃을 구성합니다.\n *\n * @example\n * <Container><h1>제목</h1></Container>\n * <Container size=\"sm\" padding=\"none\"><div>콘텐츠</div></Container>\n * <Container fluid padding=\"xl\"><div>전체 너비</div></Container>\n */\nconst Container = React.forwardRef<HTMLDivElement, ContainerProps>(\n ({\n className,\n size = \"lg\",\n padding = \"md\",\n centered = true,\n fluid = false,\n ...props\n }, ref) => {\n return (\n <div\n ref={ref}\n className={merge(\n containerVariants({ size: fluid ? undefined : size, padding }),\n fluid && \"max-w-full\",\n centered && \"mx-auto\",\n className\n )}\n {...props}\n />\n )\n }\n)\nContainer.displayName = \"Container\"\n\nexport { Container } ","\"use client\"\n\nimport React from \"react\"\nimport { cva } from \"class-variance-authority\"\nimport { merge } from \"../lib/utils\"\n\nexport const gridVariants = cva(\n \"grid\",\n {\n variants: {\n gap: {\n none: \"gap-0\",\n sm: \"gap-4\",\n md: \"gap-6\",\n lg: \"gap-8\",\n xl: \"gap-12\",\n },\n },\n defaultVariants: {\n gap: \"md\",\n },\n }\n)\n\n// Responsive cols 맵 — CVA는 동적 값(1-12)에 부적합하므로 별도 맵\nconst RESPONSIVE_COLS: Record<number, string> = {\n 1: \"grid-cols-1\",\n 2: \"grid-cols-1 sm:grid-cols-2\",\n 3: \"grid-cols-1 sm:grid-cols-2 lg:grid-cols-3\",\n 4: \"grid-cols-1 sm:grid-cols-2 lg:grid-cols-4\",\n 5: \"grid-cols-1 sm:grid-cols-2 lg:grid-cols-5\",\n 6: \"grid-cols-1 sm:grid-cols-2 lg:grid-cols-6\",\n 7: \"grid-cols-1 sm:grid-cols-2 lg:grid-cols-7\",\n 8: \"grid-cols-1 sm:grid-cols-2 lg:grid-cols-8\",\n 9: \"grid-cols-1 sm:grid-cols-2 lg:grid-cols-9\",\n 10: \"grid-cols-1 sm:grid-cols-2 lg:grid-cols-10\",\n 11: \"grid-cols-1 sm:grid-cols-2 lg:grid-cols-11\",\n 12: \"grid-cols-1 sm:grid-cols-2 lg:grid-cols-12\",\n}\n\nconst GAP_X: Record<string, string> = { none: \"gap-x-0\", sm: \"gap-x-4\", md: \"gap-x-6\", lg: \"gap-x-8\", xl: \"gap-x-12\" }\nconst GAP_Y: Record<string, string> = { none: \"gap-y-0\", sm: \"gap-y-4\", md: \"gap-y-6\", lg: \"gap-y-8\", xl: \"gap-y-12\" }\n\n/**\n * Grid 컴포넌트의 props\n */\nexport interface GridProps extends React.HTMLAttributes<HTMLDivElement> {\n cols?: 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12\n gap?: \"none\" | \"sm\" | \"md\" | \"lg\" | \"xl\"\n gapX?: \"none\" | \"sm\" | \"md\" | \"lg\" | \"xl\"\n gapY?: \"none\" | \"sm\" | \"md\" | \"lg\" | \"xl\"\n responsive?: boolean\n}\n\n/**\n * Grid 컴포넌트\n *\n * CSS Grid를 사용한 그리드 레이아웃 컴포넌트입니다.\n *\n * @example\n * <Grid cols={3} gap=\"md\"><div>1</div><div>2</div><div>3</div></Grid>\n * <Grid cols={4} gapX=\"lg\" gapY=\"sm\">{items}</Grid>\n * <Grid cols={6} responsive={false} gap=\"lg\"><div>고정 6열</div></Grid>\n */\nconst Grid = React.forwardRef<HTMLDivElement, GridProps>(\n ({\n className,\n cols = 1,\n gap = \"md\",\n gapX,\n gapY,\n responsive = true,\n ...props\n }, ref) => {\n return (\n <div\n ref={ref}\n className={merge(\n gridVariants({ gap: gapX ? undefined : gap }),\n responsive ? RESPONSIVE_COLS[cols] : `grid-cols-${cols}`,\n gapX && GAP_X[gapX],\n gapY && GAP_Y[gapY],\n className\n )}\n {...props}\n />\n )\n }\n)\nGrid.displayName = \"Grid\"\n\nexport { Grid } ","\"use client\"\n\nimport React from \"react\"\nimport { cva } from \"class-variance-authority\"\nimport { merge } from \"../lib/utils\"\n\nexport const stackVariants = cva(\n \"\",\n {\n variants: {\n direction: {\n vertical: \"flex flex-col\",\n horizontal: \"flex flex-row\",\n },\n align: {\n start: \"items-start\",\n center: \"items-center\",\n end: \"items-end\",\n stretch: \"items-stretch\",\n },\n justify: {\n start: \"justify-start\",\n center: \"justify-center\",\n end: \"justify-end\",\n between: \"justify-between\",\n around: \"justify-around\",\n evenly: \"justify-evenly\",\n },\n },\n defaultVariants: {\n direction: \"vertical\",\n align: \"start\",\n justify: \"start\",\n },\n }\n)\n\n// Spacing은 direction 의존적이라 CVA compound variant보다 맵이 더 명확\nconst SPACING = {\n vertical: { none: \"\", sm: \"space-y-4\", md: \"space-y-6\", lg: \"space-y-8\", xl: \"space-y-12\" },\n horizontal: { none: \"\", sm: \"space-x-4\", md: \"space-x-6\", lg: \"space-x-8\", xl: \"space-x-12\" },\n} as const\n\n/**\n * Stack 컴포넌트의 props\n */\nexport interface StackProps extends React.HTMLAttributes<HTMLDivElement> {\n direction?: \"vertical\" | \"horizontal\"\n spacing?: \"none\" | \"sm\" | \"md\" | \"lg\" | \"xl\"\n align?: \"start\" | \"center\" | \"end\" | \"stretch\"\n justify?: \"start\" | \"center\" | \"end\" | \"between\" | \"around\" | \"evenly\"\n wrap?: boolean\n}\n\n/**\n * Stack 컴포넌트\n *\n * Flexbox를 사용한 스택 레이아웃 컴포넌트입니다.\n *\n * @example\n * <Stack spacing=\"md\"><div>1</div><div>2</div></Stack>\n * <Stack direction=\"horizontal\" spacing=\"lg\" align=\"center\" justify=\"between\">{...}</Stack>\n * <Stack direction=\"horizontal\" wrap spacing=\"sm\">{tags}</Stack>\n */\nconst Stack = React.forwardRef<HTMLDivElement, StackProps>(\n ({\n className,\n direction = \"vertical\",\n spacing = \"md\",\n align = \"start\",\n justify = \"start\",\n wrap = false,\n ...props\n }, ref) => {\n return (\n <div\n ref={ref}\n className={merge(\n stackVariants({ direction, align, justify }),\n SPACING[direction][spacing],\n wrap && \"flex-wrap\",\n className\n )}\n {...props}\n />\n )\n }\n)\nStack.displayName = \"Stack\"\n\nexport { Stack } ","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * Divider 컴포넌트의 props / Divider component props\n */\nexport interface DividerProps extends React.HTMLAttributes<HTMLDivElement> {\n orientation?: \"horizontal\" | \"vertical\"\n variant?: \"solid\" | \"dashed\" | \"dotted\" | \"gradient\" | \"glass\"\n size?: \"sm\" | \"md\" | \"lg\"\n spacing?: \"none\" | \"sm\" | \"md\" | \"lg\" | \"xl\"\n color?: \"default\" | \"muted\" | \"primary\" | \"secondary\"\n}\n\n// Divider는 orientation × variant × color 의 조합이 동적이라 CVA compound variants보다\n// 런타임 조합이 더 명확함. 색상만 시맨틱 토큰으로 교체.\n\nconst ORIENTATION = {\n horizontal: \"w-full\",\n vertical: \"h-full\",\n} as const\n\nconst SPACING = {\n horizontal: { none: \"\", sm: \"my-4\", md: \"my-6\", lg: \"my-8\", xl: \"my-12\" },\n vertical: { none: \"\", sm: \"mx-4\", md: \"mx-6\", lg: \"mx-8\", xl: \"mx-12\" },\n} as const\n\nfunction getSizeClass(orientation: \"horizontal\" | \"vertical\", variant: string, size: \"sm\" | \"md\" | \"lg\") {\n const useBorder = variant === \"dashed\" || variant === \"dotted\"\n if (useBorder) {\n const map = {\n horizontal: { sm: \"border-t\", md: \"border-t-2\", lg: \"border-t-4\" },\n vertical: { sm: \"border-l\", md: \"border-l-2\", lg: \"border-l-4\" },\n } as const\n return map[orientation][size]\n }\n const map = {\n horizontal: { sm: \"h-px\", md: \"h-0.5\", lg: \"h-1\" },\n vertical: { sm: \"w-px\", md: \"w-0.5\", lg: \"w-1\" },\n } as const\n return map[orientation][size]\n}\n\nfunction getVariantClass(orientation: \"horizontal\" | \"vertical\", variant: string) {\n switch (variant) {\n case \"dashed\": return \"border-dashed\"\n case \"dotted\": return \"border-dotted\"\n case \"gradient\":\n return orientation === \"horizontal\"\n ? \"bg-gradient-to-r from-transparent via-border to-transparent\"\n : \"bg-gradient-to-b from-transparent via-border to-transparent\"\n case \"glass\":\n return orientation === \"horizontal\"\n ? \"bg-gradient-to-r from-transparent via-white/30 to-transparent\"\n : \"bg-gradient-to-b from-transparent via-white/30 to-transparent\"\n default: return \"\"\n }\n}\n\nfunction getColorClass(variant: string, color: \"default\" | \"muted\" | \"primary\" | \"secondary\") {\n const useBorder = variant === \"dashed\" || variant === \"dotted\"\n if (useBorder) {\n return {\n default: \"border-border\",\n muted: \"border-muted\",\n primary: \"border-primary/30\",\n secondary: \"border-secondary\",\n }[color]\n }\n return {\n default: \"bg-border\",\n muted: \"bg-muted\",\n primary: \"bg-primary/30\",\n secondary: \"bg-secondary\",\n }[color]\n}\n\n/**\n * Divider 컴포넌트 / Divider component\n *\n * 콘텐츠를 구분하는 구분선 컴포넌트입니다.\n *\n * @example\n * <Divider />\n * <Divider orientation=\"vertical\" />\n * <Divider variant=\"dashed\" spacing=\"lg\" />\n * <Divider variant=\"gradient\" color=\"primary\" />\n */\nconst DividerComponent = React.forwardRef<HTMLDivElement, DividerProps>(\n ({\n className,\n orientation = \"horizontal\",\n variant = \"solid\",\n size = \"md\",\n spacing = \"md\",\n color = \"default\",\n ...props\n }, ref) => {\n return (\n <div\n ref={ref}\n className={merge(\n \"flex-shrink-0\",\n ORIENTATION[orientation],\n getSizeClass(orientation, variant, size),\n variant === \"gradient\" ? getVariantClass(orientation, variant) : getColorClass(variant, color),\n variant !== \"gradient\" && getVariantClass(orientation, variant),\n SPACING[orientation][spacing],\n className\n )}\n {...props}\n />\n )\n }\n)\n\nDividerComponent.displayName = \"Divider\"\n\nconst Divider = React.memo(DividerComponent)\n\nexport { Divider } ","\"use client\"\n\nimport React from \"react\"\nimport { cva } from \"class-variance-authority\"\nimport { merge } from \"../lib/utils\"\n\nexport const cardVariants = cva(\n \"rounded-lg\",\n {\n variants: {\n variant: {\n default: \"bg-card text-card-foreground border border-border\",\n outline: \"bg-transparent border-2 border-border\",\n elevated: \"bg-card text-card-foreground shadow-lg border border-border\",\n },\n shadow: {\n none: \"shadow-none\",\n sm: \"shadow-sm\",\n md: \"shadow-md\",\n lg: \"shadow-lg\",\n },\n padding: {\n none: \"\",\n sm: \"p-3\",\n md: \"p-4\",\n lg: \"p-6\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n padding: \"none\",\n },\n }\n)\n\n/**\n * Card 컴포넌트의 props / Card component props\n */\nexport interface CardProps extends React.HTMLAttributes<HTMLDivElement> {\n variant?: \"default\" | \"outline\" | \"elevated\"\n shadow?: \"none\" | \"sm\" | \"md\" | \"lg\"\n padding?: \"none\" | \"sm\" | \"md\" | \"lg\"\n hoverable?: boolean\n}\n\n/**\n * Card 컴포넌트 / Card component\n *\n * 콘텐츠를 카드 형태로 표시하는 컴포넌트입니다.\n *\n * @example\n * <Card>\n * <CardHeader><CardTitle>제목</CardTitle></CardHeader>\n * <CardContent><p>내용</p></CardContent>\n * </Card>\n */\nconst Card = React.forwardRef<HTMLDivElement, CardProps>(\n ({ className, variant = \"default\", shadow, padding = \"none\", hoverable, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={merge(\n cardVariants({ variant, shadow, padding }),\n \"transition-[transform,box-shadow,border-color] duration-200 ease-out\",\n hoverable && \"hover:-translate-y-0.5 hover:shadow-lg hover:border-primary/30 cursor-pointer active:translate-y-0 active:shadow-md\",\n className\n )}\n {...props}\n />\n )\n }\n)\n\nCard.displayName = \"Card\"\n\nexport interface CardHeaderProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nconst CardHeader = React.forwardRef<HTMLDivElement, CardHeaderProps>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"flex flex-col space-y-1 p-3\", className)}\n {...props}\n />\n )\n)\n\nCardHeader.displayName = \"CardHeader\"\n\nexport interface CardTitleProps extends React.HTMLAttributes<HTMLHeadingElement> {}\n\nconst CardTitle = React.forwardRef<HTMLParagraphElement, CardTitleProps>(\n ({ className, ...props }, ref) => (\n <h3\n ref={ref}\n className={merge(\n \"text-base md:text-lg font-semibold leading-tight tracking-tight\",\n className\n )}\n {...props}\n />\n )\n)\n\nCardTitle.displayName = \"CardTitle\"\n\nexport interface CardDescriptionProps extends React.HTMLAttributes<HTMLParagraphElement> {}\n\nconst CardDescription = React.forwardRef<HTMLParagraphElement, CardDescriptionProps>(\n ({ className, ...props }, ref) => (\n <p\n ref={ref}\n className={merge(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n )\n)\n\nCardDescription.displayName = \"CardDescription\"\n\nexport interface CardContentProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nconst CardContent = React.forwardRef<HTMLDivElement, CardContentProps>(\n ({ className, ...props }, ref) => (\n <div ref={ref} className={merge(\"px-3 pb-3\", className)} {...props} />\n )\n)\n\nCardContent.displayName = \"CardContent\"\n\nexport interface CardFooterProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nconst CardFooter = React.forwardRef<HTMLDivElement, CardFooterProps>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"flex items-center px-3 pb-3\", className)}\n {...props}\n />\n )\n)\n\nCardFooter.displayName = \"CardFooter\"\n\nexport { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent }\n","\"use client\"\n\nimport React from \"react\"\nimport { cva } from \"class-variance-authority\"\nimport { merge } from \"../lib/utils\"\nimport { Card, CardProps } from \"./Card\"\n\nexport const panelStyleVariants = cva(\n \"transition-all duration-300\",\n {\n variants: {\n style: {\n default: \"bg-card text-card-foreground border border-border\",\n solid: \"bg-card text-card-foreground border border-border\",\n glass: \"bg-white/60 dark:bg-white/10 backdrop-blur-md border border-border/50 dark:border-white/20\",\n outline: \"bg-transparent border border-border\",\n elevated: \"bg-card text-card-foreground shadow-lg border border-border\",\n neon: \"bg-muted/50 dark:bg-background border border-cyan-300/30 dark:border-cyan-400/30 shadow-lg shadow-cyan-200/20 dark:shadow-cyan-400/20\",\n holographic: \"bg-gradient-to-br from-white/20 via-purple-500/20 to-cyan-500/20 backdrop-blur-sm border border-white/30\",\n cyberpunk: \"bg-card dark:bg-background border-2 border-pink-400 dark:border-pink-500 shadow-lg shadow-pink-300/30 dark:shadow-pink-500/30\",\n minimal: \"bg-card dark:bg-background border border-border shadow-sm\",\n luxury: \"bg-gradient-to-br from-amber-50 to-yellow-100 dark:from-amber-950 dark:to-yellow-950 border border-amber-200 dark:border-amber-800 shadow-xl\",\n },\n effect: {\n none: \"\",\n glow: \"shadow-2xl shadow-primary/20 dark:shadow-primary/20\",\n shadow: \"shadow-xl\",\n gradient: \"bg-gradient-to-r from-primary/10 via-purple-500/10 to-cyan-500/10\",\n animated: \"animate-pulse\",\n },\n padding: {\n none: \"p-0\",\n small: \"p-3\",\n sm: \"p-3\",\n medium: \"p-6\",\n md: \"p-6\",\n large: \"p-8\",\n lg: \"p-8\",\n xl: \"p-12\",\n custom: \"\",\n },\n rounded: {\n none: \"rounded-none\",\n sm: \"rounded-sm\",\n md: \"rounded-md\",\n lg: \"rounded-lg\",\n xl: \"rounded-xl\",\n full: \"rounded-full\",\n custom: \"\",\n },\n },\n defaultVariants: {\n style: \"default\",\n effect: \"none\",\n padding: \"md\",\n rounded: \"lg\",\n },\n }\n)\n\n/**\n * Panel 컴포넌트의 props / Panel component props\n */\nexport interface PanelProps extends Omit<CardProps, 'variant' | 'style' | 'padding'> {\n style?: \"default\" | \"solid\" | \"glass\" | \"outline\" | \"elevated\" | \"neon\" | \"holographic\" | \"cyberpunk\" | \"minimal\" | \"luxury\"\n effect?: \"none\" | \"glow\" | \"shadow\" | \"gradient\" | \"animated\"\n\n transparency?: number\n blurIntensity?: number\n borderOpacity?: number\n shadowOpacity?: number\n glowIntensity?: number\n glowColor?: string\n\n particleEffect?: boolean\n hoverEffect?: boolean\n animationEffect?: boolean\n\n padding?: \"none\" | \"small\" | \"sm\" | \"medium\" | \"md\" | \"large\" | \"lg\" | \"xl\" | \"custom\"\n customPadding?: string\n rounded?: \"none\" | \"sm\" | \"md\" | \"lg\" | \"xl\" | \"full\" | \"custom\"\n customRounded?: string\n\n background?: \"solid\" | \"gradient\" | \"pattern\" | \"image\" | \"video\"\n gradientColors?: string[]\n patternType?: \"dots\" | \"lines\" | \"grid\" | \"waves\" | \"custom\"\n backgroundImage?: string\n backgroundVideo?: string\n\n interactive?: boolean\n hoverScale?: number\n hoverRotate?: number\n hoverGlow?: boolean\n}\n\n/**\n * Panel 컴포넌트 / Panel component\n *\n * Card를 확장한 고급 스타일링 패널 컴포넌트입니다.\n *\n * @example\n * <Panel><div>내용</div></Panel>\n * <Panel style=\"glass\" effect=\"glow\"><div>Glass 패널</div></Panel>\n * <Panel style=\"neon\" interactive hoverGlow><div>호버 효과</div></Panel>\n */\nconst Panel = React.forwardRef<HTMLDivElement, PanelProps>(\n ({\n className,\n style = \"default\",\n effect = \"none\",\n transparency = 1,\n blurIntensity = 0,\n borderOpacity = 1,\n shadowOpacity = 1,\n glowIntensity = 0,\n glowColor = \"blue\",\n particleEffect = false,\n hoverEffect: _hoverEffect = false,\n animationEffect = false,\n padding = \"md\",\n customPadding,\n rounded = \"lg\",\n customRounded,\n background = \"solid\",\n gradientColors = [\"#3B82F6\", \"#8B5CF6\"],\n patternType = \"dots\",\n backgroundImage,\n backgroundVideo,\n interactive = false,\n hoverScale = 1.05,\n hoverRotate = 0,\n hoverGlow = false,\n children,\n ...cardProps\n }, ref): React.ReactElement => {\n\n // 패턴 배경 생성\n const patternBackground = React.useMemo(() => {\n switch (patternType) {\n case \"dots\":\n return \"radial-gradient(circle, #000 1px, transparent 1px)\"\n case \"lines\":\n return \"linear-gradient(45deg, #000 1px, transparent 1px)\"\n case \"grid\":\n return \"linear-gradient(#000 1px, transparent 1px), linear-gradient(90deg, #000 1px, transparent 1px)\"\n case \"waves\":\n return \"repeating-linear-gradient(45deg, transparent, transparent 10px, rgba(0,0,0,0.1) 10px, rgba(0,0,0,0.1) 20px)\"\n default:\n return \"\"\n }\n }, [patternType])\n\n // 배경 스타일 생성\n const backgroundStyles = React.useMemo((): React.CSSProperties => {\n const styles: React.CSSProperties = {\n opacity: transparency,\n }\n\n if (blurIntensity > 0) {\n styles.backdropFilter = `blur(${blurIntensity}px)`\n }\n\n if (borderOpacity < 1) {\n styles.borderColor = `rgba(0, 0, 0, ${borderOpacity})`\n }\n\n if (shadowOpacity < 1) {\n styles.boxShadow = `0 4px 6px -1px rgba(0, 0, 0, ${shadowOpacity * 0.1})`\n }\n\n if (glowIntensity > 0) {\n styles.boxShadow = `${styles.boxShadow || ''}, 0 0 ${glowIntensity * 10}px ${glowColor}`\n }\n\n switch (background) {\n case \"gradient\":\n styles.background = `linear-gradient(135deg, ${gradientColors.join(', ')})`\n break\n case \"pattern\":\n styles.backgroundImage = patternBackground\n break\n case \"image\":\n if (backgroundImage) {\n styles.backgroundImage = `url(${backgroundImage})`\n styles.backgroundSize = 'cover'\n styles.backgroundPosition = 'center'\n }\n break\n case \"video\":\n break\n }\n\n return styles\n }, [transparency, blurIntensity, borderOpacity, shadowOpacity, glowIntensity, glowColor, background, gradientColors, patternBackground, backgroundImage])\n\n // 호버 효과 클래스 생성\n const hoverClasses = React.useMemo(() => {\n if (!interactive) return \"\"\n\n const classes = []\n\n if (hoverScale !== 1) {\n classes.push(`hover:scale-${hoverScale}`)\n }\n\n if (hoverRotate !== 0) {\n classes.push(`hover:rotate-${hoverRotate}`)\n }\n\n if (hoverGlow) {\n classes.push(\"hover:shadow-2xl hover:shadow-cyan-500/30\")\n }\n\n return classes.join(\" \")\n }, [interactive, hoverScale, hoverRotate, hoverGlow])\n\n // Panel 전용 클래스들\n const panelClasses = React.useMemo(() => merge(\n \"panel-component\",\n `panel-${style}`,\n `panel-effect-${effect}`,\n panelStyleVariants({\n style,\n effect,\n padding: customPadding ? \"custom\" : padding,\n rounded: customRounded ? \"custom\" : rounded,\n }),\n customPadding,\n customRounded,\n hoverClasses,\n className\n ), [style, effect, padding, customPadding, rounded, customRounded, hoverClasses, className])\n \n return (\n <div className=\"relative\">\n {/* 비디오 배경 */}\n {background === \"video\" && backgroundVideo && (\n <video\n className=\"absolute inset-0 w-full h-full object-cover rounded-lg\"\n autoPlay\n muted\n loop\n playsInline\n >\n <source src={backgroundVideo} type=\"video/mp4\" />\n </video>\n )}\n \n {/* 파티클 효과 */}\n {particleEffect && (\n <div className=\"absolute inset-0 pointer-events-none\">\n {/* 파티클 효과 렌더링 */}\n </div>\n )}\n \n {/* 메인 Panel */}\n <Card\n ref={ref}\n className={panelClasses}\n style={backgroundStyles}\n {...cardProps}\n >\n {children}\n </Card>\n \n {/* 애니메이션 효과 */}\n {animationEffect && (\n <div className=\"absolute inset-0 pointer-events-none\">\n {/* 애니메이션 효과 렌더링 */}\n </div>\n )}\n </div>\n )\n }\n)\n\nPanel.displayName = \"Panel\"\n\nexport { Panel } ","\"use client\";\n\nimport React, { useCallback } from 'react';\nimport { Button } from './Button';\nimport { Icon } from './Icon';\nimport type { IconName } from '../lib/icons';\nimport { merge } from '../lib/utils';\n\n/**\n * ActionButton 인터페이스\n * @typedef {Object} ActionButton\n * @property {string} label - 버튼 라벨 (데스크톱)\n * @property {string} [labelMobile] - 버튼 라벨 (모바일, 없으면 label 사용)\n * @property {IconName} [icon] - 버튼 아이콘\n * @property {() => void} onClick - 클릭 핸들러\n * @property {boolean} [disabled] - 비활성화 여부\n * @property {'default' | 'outline' | 'destructive' | 'ghost'} [variant='outline'] - 버튼 스타일\n * @property {Object} [badge] - 배지 정보\n * @property {number} badge.count - 배지 숫자\n * @property {'blue' | 'red' | 'gray' | 'green'} [badge.color='gray'] - 배지 색상\n * @property {string} [className] - 추가 CSS 클래스\n */\nexport interface ActionButton {\n label: string;\n labelMobile?: string; // 모바일에서 표시할 짧은 텍스트\n icon?: IconName;\n onClick: () => void;\n disabled?: boolean;\n variant?: 'default' | 'outline' | 'destructive' | 'ghost';\n badge?: {\n count: number;\n color?: 'blue' | 'red' | 'gray' | 'green';\n };\n className?: string;\n}\n\n/**\n * ActionToolbar 컴포넌트의 props / ActionToolbar component props\n * @typedef {Object} ActionToolbarProps\n * @property {boolean} [isSelectMode=false] - 선택 모드 활성화 여부 / Enable select mode\n * @property {number} [totalCount=0] - 전체 항목 개수 / Total item count\n * @property {number} [selectedCount=0] - 선택된 항목 개수 / Selected item count\n * @property {ActionButton[]} [actions=[]] - 일반 모드 액션 버튼들 / Normal mode action buttons\n * @property {ActionButton[]} [selectModeActions=[]] - 선택 모드 액션 버튼들 / Select mode action buttons\n * @property {() => void} [onToggleSelectMode] - 선택 모드 토글 함수 / Toggle select mode function\n * @property {() => void} [onToggleSelectAll] - 전체 선택/해제 함수 / Toggle select all function\n * @property {() => void} [onCancelSelect] - 선택 모드 취소 함수 / Cancel select mode function\n * @property {boolean} [loading=false] - 로딩 상태 / Loading state\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface ActionToolbarProps extends React.HTMLAttributes<HTMLDivElement> {\n /** 선택 모드 활성화 여부 */\n isSelectMode?: boolean;\n /** 전체 항목 개수 */\n totalCount?: number;\n /** 선택된 항목 개수 */\n selectedCount?: number;\n /** 일반 모드 액션 버튼들 */\n actions?: ActionButton[];\n /** 선택 모드 액션 버튼들 */\n selectModeActions?: ActionButton[];\n /** 선택 모드 토글 함수 */\n onToggleSelectMode?: () => void;\n /** 전체 선택/해제 함수 */\n onToggleSelectAll?: () => void;\n /** 선택 모드 취소 함수 */\n onCancelSelect?: () => void;\n /** 로딩 상태 */\n loading?: boolean;\n}\n\n/**\n * ActionToolbar 컴포넌트 / ActionToolbar component\n * \n * 범용 액션 툴바 컴포넌트입니다.\n * 알림, 로그 관리, 대시보드 등에서 재사용 가능한 액션 버튼 영역을 제공합니다.\n * 선택 모드, 일괄 액션, 반응형 레이아웃을 지원합니다.\n * \n * Universal action toolbar component.\n * Provides reusable action button area for notifications, log management, dashboard, etc.\n * Supports select mode, batch actions, and responsive layout.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * ```tsx\n * <ActionToolbar\n * isSelectMode={isSelectMode}\n * totalCount={notifications.length}\n * selectedCount={selectedIds.size}\n * actions={[\n * {\n * label: \"모두 읽음\",\n * labelMobile: \"읽음\",\n * icon: \"check\",\n * onClick: handleMarkAllAsRead,\n * disabled: unreadCount === 0,\n * badge: { count: unreadCount, color: 'blue' }\n * }\n * ]}\n * selectModeActions={[\n * {\n * label: \"선택 삭제\",\n * labelMobile: \"삭제\",\n * icon: \"delete\",\n * onClick: handleDeleteSelected,\n * disabled: selectedIds.size === 0,\n * badge: { count: selectedIds.size, color: 'red' }\n * }\n * ]}\n * onToggleSelectMode={() => setIsSelectMode(true)}\n * onToggleSelectAll={handleToggleSelectAll}\n * onCancelSelect={() => {\n * setIsSelectMode(false);\n * setSelectedIds(new Set());\n * }}\n * />\n * ```\n * \n * @param {ActionToolbarProps} props - ActionToolbar 컴포넌트의 props / ActionToolbar component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} ActionToolbar 컴포넌트 / ActionToolbar component\n */\nconst ActionToolbarComponent = React.forwardRef<HTMLDivElement, ActionToolbarProps>(\n (\n {\n isSelectMode = false,\n totalCount = 0,\n selectedCount = 0,\n actions = [],\n selectModeActions = [],\n onToggleSelectMode,\n onToggleSelectAll,\n onCancelSelect,\n loading = false,\n className,\n ...props\n },\n ref\n ) => {\n const getBadgeColor = useCallback((color?: string) => {\n switch (color) {\n case 'red':\n return 'bg-red-100 dark:bg-red-900 text-red-700 dark:text-red-300';\n case 'blue':\n return 'bg-indigo-100 dark:bg-indigo-900 text-indigo-700 dark:text-indigo-300';\n case 'green':\n return 'bg-green-100 dark:bg-green-900 text-green-700 dark:text-green-300';\n case 'gray':\n default:\n return 'bg-muted text-muted-foreground';\n }\n }, []);\n\n const renderButton = useCallback((action: ActionButton, key: string) => (\n <Button\n key={key}\n variant={action.variant || 'outline'}\n size=\"sm\"\n onClick={action.onClick}\n disabled={action.disabled || loading}\n className={merge('flex-1 sm:flex-initial', action.className)}\n >\n {action.icon && <Icon name={action.icon} className=\"h-4 w-4 sm:h-3.5 sm:w-3.5 mr-1 sm:mr-1.5\" />}\n <span className=\"hidden sm:inline\">{action.label}</span>\n <span className=\"sm:hidden\">{action.labelMobile || action.label}</span>\n {action.badge && action.badge.count > 0 && (\n <span className={merge('ml-1.5', getBadgeColor(action.badge.color), 'px-1.5 py-0.5 rounded-full text-xs font-semibold')}>\n {action.badge.count}\n </span>\n )}\n </Button>\n ), [getBadgeColor, loading]);\n\n return (\n <div\n ref={ref}\n className={merge(\n 'mb-4 bg-background rounded-lg shadow-sm border border-border p-3 sm:p-4',\n className\n )}\n {...props}\n >\n {isSelectMode ? (\n <div className=\"flex flex-wrap items-center gap-2\">\n {/* 전체 선택/해제 버튼 */}\n {onToggleSelectAll && (\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={onToggleSelectAll}\n className=\"flex-1 sm:flex-initial min-w-[100px]\"\n >\n <Icon name={selectedCount === totalCount ? \"square\" : \"check\"} className=\"h-4 w-4 sm:h-3.5 sm:w-3.5 mr-1 sm:mr-1.5\" />\n <span className=\"hidden sm:inline\">{selectedCount === totalCount ? '전체 해제' : '전체 선택'}</span>\n <span className=\"sm:hidden\">{selectedCount === totalCount ? '해제' : '전체'}</span>\n </Button>\n )}\n \n {/* 선택 모드 액션 버튼들 */}\n {selectModeActions.map((action, index) => (\n <div key={`select-action-${index}`} className={merge('flex-1 sm:flex-initial min-w-[100px]', action.className)}>\n {renderButton(action, `select-${index}`)}\n </div>\n ))}\n \n {/* 취소 버튼 */}\n {onCancelSelect && (\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={onCancelSelect}\n className=\"flex-1 sm:flex-initial min-w-[80px]\"\n >\n 취소\n </Button>\n )}\n </div>\n ) : (\n <div className=\"flex flex-wrap items-center gap-2\">\n {/* 선택 모드 진입 버튼 */}\n {onToggleSelectMode && (\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={onToggleSelectMode}\n disabled={totalCount === 0}\n className=\"flex-1 sm:flex-initial min-w-[80px] sm:min-w-[auto] px-2 sm:px-3\"\n title={totalCount === 0 ? \"항목이 없습니다\" : \"여러 항목 선택\"}\n >\n <Icon name=\"check\" className=\"h-4 w-4 sm:h-3.5 sm:w-3.5\" />\n <span className=\"hidden sm:inline ml-1.5 sm:ml-2\">선택</span>\n </Button>\n )}\n \n {/* 일반 모드 액션 버튼들 */}\n {actions.map((action, index) => (\n <div key={`action-${index}`} className={merge('flex-1 sm:flex-initial min-w-[100px]', action.className)}>\n {renderButton(action, `action-${index}`)}\n </div>\n ))}\n </div>\n )}\n </div>\n );\n }\n);\n\nActionToolbarComponent.displayName = 'ActionToolbar';\n\nexport const ActionToolbar = React.memo(ActionToolbarComponent);\n\n","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\nimport { Icon } from \"./Icon\"\nimport type { IconName } from \"../lib/icons\"\n\n/**\n * Breadcrumb 항목 타입 / Breadcrumb item type\n */\nexport interface BreadcrumbItemData {\n label: string\n href?: string\n icon?: IconName\n}\n\n/**\n * Breadcrumb 컴포넌트의 props / Breadcrumb component props\n * @typedef {Object} BreadcrumbProps\n * @property {React.ReactNode} [children] - BreadcrumbItem 컴포넌트들 / BreadcrumbItem components\n * @property {BreadcrumbItemData[]} [items] - Breadcrumb 항목 배열 (children 대신 사용 가능) / Breadcrumb items array (alternative to children)\n * @property {number} [maxItems] - 최대 표시할 항목 수 (긴 경로 처리) / Maximum number of items to display (for long paths)\n * @property {boolean} [showHomeIcon] - 홈 아이콘 표시 여부 / Show home icon\n * @property {string} [homeLabel] - 홈 라벨 (기본: \"Home\") / Home label (default: \"Home\")\n * @property {React.ReactNode} [separator] - 항목 사이 구분자 (기본: chevronRight 아이콘) / Separator between items (default: chevronRight icon)\n * @property {'default' | 'subtle' | 'transparent' | 'glass'} [variant='default'] - Breadcrumb 스타일 변형 / Breadcrumb style variant\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface BreadcrumbProps extends React.HTMLAttributes<HTMLDivElement> {\n children?: React.ReactNode\n items?: BreadcrumbItemData[]\n maxItems?: number\n showHomeIcon?: boolean\n homeLabel?: string\n separator?: React.ReactNode\n variant?: 'default' | 'subtle' | 'transparent' | 'glass'\n}\n\n/**\n * BreadcrumbItem 컴포넌트의 props / BreadcrumbItem component props\n * @typedef {Object} BreadcrumbItemProps\n * @property {string} [href] - 링크 URL (없으면 일반 텍스트) / Link URL (plain text if not provided)\n * @property {boolean} [isCurrent=false] - 현재 페이지 여부 / Current page indicator\n * @property {React.ReactNode} children - 항목 텍스트 / Item text\n * @property {string} [className] - 추가 CSS 클래스 / Additional CSS class\n */\nexport interface BreadcrumbItemProps {\n href?: string\n isCurrent?: boolean\n children: React.ReactNode\n className?: string\n}\n\n/**\n * Breadcrumb 컴포넌트 / Breadcrumb component\n * \n * 네비게이션 경로를 표시하는 breadcrumb 컴포넌트입니다.\n * 현재 위치와 경로를 시각적으로 표현합니다.\n * \n * Breadcrumb component for displaying navigation paths.\n * Visually represents current location and path.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Breadcrumb>\n * <BreadcrumbItem href=\"/\">홈</BreadcrumbItem>\n * <BreadcrumbItem href=\"/products\">상품</BreadcrumbItem>\n * <BreadcrumbItem isCurrent>상세</BreadcrumbItem>\n * </Breadcrumb>\n * \n * @example\n * // 커스텀 구분자 / Custom separator\n * <Breadcrumb separator={<span>/</span>}>\n * <BreadcrumbItem href=\"/\">홈</BreadcrumbItem>\n * <BreadcrumbItem isCurrent>현재</BreadcrumbItem>\n * </Breadcrumb>\n * \n * @param {BreadcrumbProps} props - Breadcrumb 컴포넌트의 props / Breadcrumb component props\n * @param {React.Ref<HTMLDivElement>} ref - nav 요소 ref / nav element ref\n * @returns {JSX.Element} Breadcrumb 컴포넌트 / Breadcrumb component\n */\nconst Breadcrumb = React.forwardRef<HTMLDivElement, BreadcrumbProps>(\n ({ \n className, \n children, \n items,\n maxItems,\n showHomeIcon,\n homeLabel = \"Home\",\n separator = <Icon name=\"chevronRight\" className=\"w-3 h-3 text-muted-foreground flex-shrink-0\" />, \n variant = 'default', \n ...props \n }, ref) => {\n const variantStyles = {\n default: \"inline-flex items-center text-sm w-fit\",\n subtle: \"inline-flex items-center text-xs bg-background/40 backdrop-blur-md rounded-md px-3 py-2 border border-border/30 w-fit shadow-sm\",\n transparent: \"inline-flex items-center text-xs w-fit\",\n glass: \"inline-flex items-center text-xs bg-background/30 backdrop-blur-lg rounded-lg px-4 py-2 border border-border/25 w-fit shadow-lg\"\n }\n \n // items prop이 있으면 BreadcrumbItem으로 변환\n const renderItems = () => {\n if (items) {\n let displayItems = [...items]\n \n // maxItems 처리\n if (maxItems && displayItems.length > maxItems) {\n const firstItem = displayItems[0]\n const lastItems = displayItems.slice(-(maxItems - 1))\n displayItems = [firstItem, { label: '...', href: undefined }, ...lastItems]\n }\n \n // 마지막 항목은 isCurrent로 표시\n return displayItems.map((item, index) => {\n const isLast = index === displayItems.length - 1\n const isCurrent = isLast && !item.href\n \n return (\n <BreadcrumbItem\n key={index}\n href={item.href}\n isCurrent={isCurrent}\n >\n {item.icon && (\n <Icon name={item.icon} className=\"w-4 h-4 mr-1\" />\n )}\n {item.label}\n </BreadcrumbItem>\n )\n })\n }\n \n // children이 있으면 그대로 사용\n if (children) {\n return React.Children.map(children, (child, index) => {\n if (React.isValidElement(child)) {\n return (\n <li key={index} className=\"flex items-center\">\n {child}\n {index < React.Children.count(children) - 1 && (\n <span className=\"mx-3 text-muted-foreground flex items-center justify-center\" aria-hidden=\"true\">\n {separator}\n </span>\n )}\n </li>\n )\n }\n return child\n })\n }\n \n return null\n }\n \n const renderedItems = renderItems()\n const itemsCount = items ? items.length : (children ? React.Children.count(children) : 0)\n \n return (\n <nav\n ref={ref}\n aria-label=\"Breadcrumb\"\n className={merge(variantStyles[variant], className)}\n {...props}\n >\n <ol className=\"inline-flex items-center\">\n {showHomeIcon && (\n <li className=\"flex items-center\">\n <BreadcrumbItem href=\"/\">\n <Icon name=\"home\" className=\"w-4 h-4 mr-1\" />\n {homeLabel}\n </BreadcrumbItem>\n {itemsCount > 0 && (\n <span className=\"mx-3 text-muted-foreground flex items-center justify-center\" aria-hidden=\"true\">\n {separator}\n </span>\n )}\n </li>\n )}\n {items ? (\n renderedItems?.map((item, index) => (\n <li key={index} className=\"flex items-center\">\n {item}\n {index < (renderedItems?.length || 0) - 1 && (\n <span className=\"mx-3 text-muted-foreground flex items-center justify-center\" aria-hidden=\"true\">\n {separator}\n </span>\n )}\n </li>\n ))\n ) : (\n renderedItems\n )}\n </ol>\n </nav>\n )\n }\n)\nBreadcrumb.displayName = \"Breadcrumb\"\n\n/**\n * BreadcrumbItem 컴포넌트\n * Breadcrumb의 개별 항목을 표시합니다.\n * \n * @component\n * @param {BreadcrumbItemProps} props - BreadcrumbItem 컴포넌트의 props\n * @param {React.Ref<HTMLLIElement>} ref - li 요소 ref\n * @returns {JSX.Element} BreadcrumbItem 컴포넌트\n */\nconst BreadcrumbItem = React.forwardRef<HTMLLIElement, BreadcrumbItemProps>(\n ({ className, href, isCurrent = false, children, ...props }, ref) => {\n if (isCurrent) {\n return (\n <span\n ref={ref}\n aria-current=\"page\"\n className={merge(\n \"text-muted-foreground font-medium\",\n className\n )}\n {...props}\n >\n {children}\n </span>\n )\n }\n\n if (href) {\n return (\n <a\n href={href}\n className={merge(\n \"text-muted-foreground hover:text-foreground transition-colors\",\n className\n )}\n {...props}\n >\n {children}\n </a>\n )\n }\n\n return (\n <span\n ref={ref}\n className={merge(\n \"text-muted-foreground\",\n className\n )}\n {...props}\n >\n {children}\n </span>\n )\n }\n)\nBreadcrumbItem.displayName = \"BreadcrumbItem\"\n\nexport { Breadcrumb, BreadcrumbItem } ","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\nimport { Breadcrumb, BreadcrumbItem } from \"./Breadcrumb\"\n\n/**\n * ComponentLayout 컴포넌트의 props / ComponentLayout component props\n * @typedef {Object} ComponentLayoutProps\n * @property {string} title - 페이지 제목 / Page title\n * @property {string} description - 페이지 설명 / Page description\n * @property {React.ReactNode} children - 페이지 내용 / Page content\n * @property {Object} [prevPage] - 이전 페이지 정보 / Previous page information\n * @property {string} prevPage.title - 이전 페이지 제목 / Previous page title\n * @property {string} prevPage.href - 이전 페이지 링크 / Previous page link\n * @property {Object} [nextPage] - 다음 페이지 정보 / Next page information\n * @property {string} nextPage.title - 다음 페이지 제목 / Next page title\n * @property {string} nextPage.href - 다음 페이지 링크 / Next page link\n * @property {Array<Object>} [breadcrumbItems] - Breadcrumb 항목들 / Breadcrumb items\n * @property {string} breadcrumbItems[].label - Breadcrumb 라벨 / Breadcrumb label\n * @property {string} [breadcrumbItems[].href] - Breadcrumb 링크 / Breadcrumb link\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface ComponentLayoutProps extends React.HTMLAttributes<HTMLDivElement> {\n title: string\n description: string\n children: React.ReactNode\n prevPage?: {\n title: string\n href: string\n }\n nextPage?: {\n title: string\n href: string\n }\n breadcrumbItems?: Array<{\n label: string\n href?: string\n }>\n}\n\n/**\n * ComponentLayout 컴포넌트 / ComponentLayout component\n * \n * 컴포넌트 문서 페이지 레이아웃을 제공하는 컴포넌트입니다.\n * 제목, 설명, Breadcrumb, 이전/다음 페이지 네비게이션을 포함합니다.\n * \n * Component that provides layout for component documentation pages.\n * Includes title, description, Breadcrumb, and previous/next page navigation.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <ComponentLayout\n * title=\"Button 컴포넌트\"\n * description=\"버튼 컴포넌트 사용법\"\n * >\n * <Button>예제</Button>\n * </ComponentLayout>\n * \n * @example\n * // 이전/다음 페이지 네비게이션 포함 / With previous/next page navigation\n * <ComponentLayout\n * title=\"Input 컴포넌트\"\n * description=\"입력 컴포넌트 사용법\"\n * prevPage={{ title: \"Button\", href: \"/components/button\" }}\n * nextPage={{ title: \"Select\", href: \"/components/select\" }}\n * >\n * <Input placeholder=\"입력하세요\" />\n * </ComponentLayout>\n * \n * @param {ComponentLayoutProps} props - ComponentLayout 컴포넌트의 props / ComponentLayout component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} ComponentLayout 컴포넌트 / ComponentLayout component\n */\nconst ComponentLayout = React.forwardRef<HTMLDivElement, ComponentLayoutProps>(\n ({ \n className, \n title, \n description, \n children, \n prevPage, \n nextPage,\n breadcrumbItems = [\n { label: \"Components\", href: \"/components\" }\n ],\n ...props \n }, ref) => {\n return (\n <div className=\"relative min-h-screen\">\n {/* 고정된 페이지 네비게이션 - 위쪽 */}\n <div className=\"fixed right-4 top-4 z-50 hidden lg:block\">\n <div className=\"flex flex-col space-y-4\">\n {prevPage && (\n <a\n href={prevPage.href}\n className=\"group p-3 bg-white/80 backdrop-blur-sm border border-border rounded-full shadow-lg hover:shadow-2xl hover:bg-white/90 active:scale-95 transition-all duration-200\"\n title={`이전: ${prevPage.title}`}\n >\n <svg\n className=\"w-5 h-5 text-muted-foreground group-hover:text-indigo-600 group-active:text-indigo-800 transition-colors\" \n fill=\"none\" \n stroke=\"currentColor\" \n viewBox=\"0 0 24 24\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 15l7-7 7 7\" />\n </svg>\n </a>\n )}\n </div>\n </div>\n\n {/* 고정된 페이지 네비게이션 - 아래쪽 */}\n <div className=\"fixed right-4 bottom-4 z-50 hidden lg:block\">\n <div className=\"flex flex-col space-y-4\">\n {nextPage && (\n <a\n href={nextPage.href}\n className=\"group p-3 bg-white/80 backdrop-blur-sm border border-border rounded-full shadow-lg hover:shadow-2xl hover:bg-white/90 active:scale-95 transition-all duration-200\"\n title={`다음: ${nextPage.title}`}\n >\n <svg\n className=\"w-5 h-5 text-muted-foreground group-hover:text-indigo-600 group-active:text-indigo-800 transition-colors\" \n fill=\"none\" \n stroke=\"currentColor\" \n viewBox=\"0 0 24 24\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 9l-7 7-7-7\" />\n </svg>\n </a>\n )}\n </div>\n </div>\n\n {/* 메인 콘텐츠 */}\n <div\n ref={ref}\n className={merge(\"container mx-auto px-4 py-8\", className)}\n {...props}\n >\n <div className=\"max-w-4xl mx-auto\">\n {/* 브레드크럼 */}\n <Breadcrumb className=\"mb-6\">\n {breadcrumbItems.map((item, index) => (\n <BreadcrumbItem \n key={index}\n href={item.href}\n isCurrent={index === breadcrumbItems.length - 1}\n >\n {item.label}\n </BreadcrumbItem>\n ))}\n </Breadcrumb>\n\n {/* 페이지 헤더 */}\n <div className=\"mb-8\">\n <h1 className=\"text-4xl font-bold mb-4\">{title}</h1>\n <p className=\"text-lg text-muted-foreground\">\n {description}\n </p>\n </div>\n\n {/* 페이지 콘텐츠 */}\n <div className=\"space-y-8\">\n {children}\n </div>\n\n {/* 모바일 페이지 네비게이션 */}\n <div className=\"mt-12 lg:hidden\">\n <div className=\"flex items-center justify-between py-4 border-t border-border\">\n {prevPage && (\n <a\n href={prevPage.href}\n className=\"flex items-center text-sm text-muted-foreground hover:text-foreground transition-colors\"\n >\n <svg className=\"w-4 h-4 mr-2\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 19l-7-7 7-7\" />\n </svg>\n {prevPage.title}\n </a>\n )}\n {nextPage && (\n <a\n href={nextPage.href}\n className=\"flex items-center text-sm text-muted-foreground hover:text-foreground transition-colors\"\n >\n {nextPage.title}\n <svg className=\"w-4 h-4 ml-2\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 5l7 7-7 7\" />\n </svg>\n </a>\n )}\n </div>\n </div>\n </div>\n </div>\n </div>\n )\n }\n)\nComponentLayout.displayName = \"ComponentLayout\"\n\nexport { ComponentLayout } ","\"use client\"\n\nimport React from \"react\"\nimport { cva } from \"class-variance-authority\"\nimport { merge } from \"../lib/utils\"\n\nexport const badgeVariants = cva(\n \"inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors duration-200 ease-in-out focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-2\",\n {\n variants: {\n variant: {\n default: \"bg-[var(--badge-default-bg)] text-[var(--badge-default-text)] hover:opacity-80\",\n secondary: \"bg-[var(--badge-secondary-bg)] text-[var(--badge-secondary-text)] hover:opacity-80\",\n destructive: \"bg-[var(--badge-destructive-bg)] text-slate-50 hover:opacity-80\",\n error: \"bg-[var(--badge-destructive-bg)] text-slate-50 hover:opacity-80\",\n outline: \"bg-transparent text-[var(--badge-outline-text)] border border-[var(--badge-outline-border)] hover:bg-[var(--badge-outline-hover-bg)]\",\n glass: \"bg-[var(--badge-glass-bg)] backdrop-blur-sm border border-[var(--badge-glass-border)] text-[var(--badge-glass-text)] hover:opacity-80\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\n/**\n * Badge 컴포넌트의 props / Badge component props\n */\nexport interface BadgeProps extends React.HTMLAttributes<HTMLDivElement> {\n variant?: \"default\" | \"secondary\" | \"destructive\" | \"error\" | \"outline\" | \"glass\"\n}\n\n/**\n * Badge 컴포넌트 / Badge component\n *\n * 상태나 카테고리를 표시하는 작은 배지 컴포넌트입니다.\n *\n * @example\n * <Badge>New</Badge>\n * <Badge variant=\"destructive\">완료</Badge>\n * <Badge variant=\"outline\">대기</Badge>\n */\nconst Badge = React.memo(React.forwardRef<HTMLDivElement, BadgeProps>(\n ({ className, variant = \"default\", ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={merge(badgeVariants({ variant }), className)}\n {...props}\n />\n )\n }\n))\nBadge.displayName = \"Badge\"\n\nexport { Badge }\n","\"use client\"\n\nimport React from \"react\"\nimport { cva } from \"class-variance-authority\"\nimport { merge } from \"../lib/utils\"\n\nexport const progressBarVariants = cva(\n \"h-full rounded-full transition-all duration-300 ease-out\",\n {\n variants: {\n variant: {\n default: \"bg-foreground\",\n success: \"bg-[var(--progress-success)]\",\n warning: \"bg-[var(--progress-warning)]\",\n error: \"bg-[var(--progress-error)]\",\n info: \"bg-[var(--progress-info)]\",\n glass: \"bg-white/50 backdrop-blur-sm\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nexport const progressTrackVariants = cva(\n \"relative w-full overflow-hidden rounded-full\",\n {\n variants: {\n variant: {\n default: \"bg-[var(--progress-track)] dark:bg-[var(--progress-track)]\",\n success: \"bg-[var(--progress-track)] dark:bg-[var(--progress-track)]\",\n warning: \"bg-[var(--progress-track)] dark:bg-[var(--progress-track)]\",\n error: \"bg-[var(--progress-track)] dark:bg-[var(--progress-track)]\",\n info: \"bg-[var(--progress-track)] dark:bg-[var(--progress-track)]\",\n glass: \"bg-white/10 backdrop-blur-sm border border-white/20 dark:bg-slate-800/10 dark:border-slate-700/50\",\n },\n size: {\n sm: \"h-2\",\n md: \"h-3\",\n lg: \"h-4\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"md\",\n },\n }\n)\n\n/**\n * Progress 컴포넌트의 props\n */\nexport interface ProgressProps extends React.HTMLAttributes<HTMLDivElement> {\n value?: number\n max?: number\n size?: \"sm\" | \"md\" | \"lg\"\n variant?: \"default\" | \"success\" | \"warning\" | \"error\" | \"info\" | \"glass\"\n showValue?: boolean\n animated?: boolean\n striped?: boolean\n label?: string\n description?: string\n}\n\n/**\n * Progress 컴포넌트 / Progress component\n *\n * 진행률을 표시하는 프로그레스 바 컴포넌트입니다.\n *\n * @example\n * <Progress value={50} />\n * <Progress value={75} variant=\"success\" label=\"업로드\" showValue />\n * <Progress value={90} variant=\"warning\" striped animated />\n */\nconst Progress = React.forwardRef<HTMLDivElement, ProgressProps>(\n ({\n className,\n value = 0,\n max = 100,\n size = \"md\",\n variant = \"default\",\n showValue = false,\n animated = true,\n striped = false,\n label,\n description,\n ...props\n }, ref) => {\n const percentage = Math.min(Math.max((value / max) * 100, 0), 100)\n\n return (\n <div className={merge(\"w-full\", className)} {...props}>\n {(label || showValue) && (\n <div className=\"flex items-center justify-between mb-2\">\n {label && (\n <span className=\"text-sm font-medium text-foreground\">\n {label}\n </span>\n )}\n {showValue && (\n <span className=\"text-sm text-muted-foreground\">\n {Math.round(percentage)}%\n </span>\n )}\n </div>\n )}\n\n <div\n ref={ref}\n className={progressTrackVariants({ variant, size })}\n >\n <div\n className={merge(\n progressBarVariants({ variant }),\n striped && \"bg-gradient-to-r from-transparent via-white/20 to-transparent bg-[length:20px_100%] animate-pulse\",\n animated && \"animate-pulse\"\n )}\n style={{\n width: `${percentage}%`,\n transition: animated ? \"width 0.3s ease-out\" : \"none\"\n }}\n />\n </div>\n\n {description && (\n <p className=\"mt-2 text-xs text-muted-foreground\">\n {description}\n </p>\n )}\n </div>\n )\n }\n)\nProgress.displayName = \"Progress\"\n\n// 편의 컴포넌트들\nexport const ProgressSuccess = React.forwardRef<HTMLDivElement, Omit<ProgressProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Progress ref={ref} variant=\"success\" className={className} {...props} />\n )\n)\nProgressSuccess.displayName = \"ProgressSuccess\"\n\nexport const ProgressWarning = React.forwardRef<HTMLDivElement, Omit<ProgressProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Progress ref={ref} variant=\"warning\" className={className} {...props} />\n )\n)\nProgressWarning.displayName = \"ProgressWarning\"\n\nexport const ProgressError = React.forwardRef<HTMLDivElement, Omit<ProgressProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Progress ref={ref} variant=\"error\" className={className} {...props} />\n )\n)\nProgressError.displayName = \"ProgressError\"\n\nexport const ProgressInfo = React.forwardRef<HTMLDivElement, Omit<ProgressProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Progress ref={ref} variant=\"info\" className={className} {...props} />\n )\n)\nProgressInfo.displayName = \"ProgressInfo\"\n\n// 복합 Progress 컴포넌트들\nexport const ProgressWrapper = React.forwardRef<HTMLDivElement, ProgressProps & { title?: string }>(\n ({ title, className, ...props }, ref) => (\n <div className={merge(\"p-4 bg-card rounded-lg border border-border\", className)}>\n {title && (\n <h3 className=\"text-sm font-semibold text-foreground mb-3\">\n {title}\n </h3>\n )}\n <Progress ref={ref} {...props} />\n </div>\n )\n)\nProgressWrapper.displayName = \"ProgressWrapper\"\n\nexport const ProgressGroup = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, children, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"space-y-4\", className)}\n {...props}\n >\n {children}\n </div>\n )\n)\nProgressGroup.displayName = \"ProgressGroup\"\n\nexport { Progress }\n","\"use client\"\n\nimport React from \"react\"\nimport { cva } from \"class-variance-authority\"\nimport { merge } from \"../lib/utils\"\n\nexport const skeletonVariants = cva(\n \"block\",\n {\n variants: {\n variant: {\n text: \"rounded w-full h-4\",\n circular: \"rounded-full w-10 h-10\",\n rounded: \"rounded-lg w-full h-[200px]\",\n rectangular: \"rounded-none w-full h-[200px]\",\n },\n animation: {\n pulse: \"animate-pulse bg-muted\",\n wave: \"bg-muted\",\n shimmer: \"bg-muted\",\n },\n },\n defaultVariants: {\n variant: \"text\",\n animation: \"pulse\",\n },\n }\n)\n\n/**\n * Skeleton 컴포넌트의 props\n */\nexport interface SkeletonProps extends React.HTMLAttributes<HTMLDivElement> {\n variant?: \"text\" | \"circular\" | \"rectangular\" | \"rounded\"\n width?: string | number\n height?: string | number\n animation?: \"pulse\" | \"wave\" | \"shimmer\"\n className?: string\n}\n\n/**\n * Skeleton 컴포넌트 / Skeleton component\n *\n * 로딩 중 콘텐츠의 플레이스홀더를 표시하는 스켈레톤 컴포넌트입니다.\n *\n * @example\n * <Skeleton />\n * <Skeleton variant=\"circular\" width={40} height={40} />\n * <Skeleton variant=\"rounded\" width=\"100%\" height={200} animation=\"wave\" />\n */\nconst Skeleton = React.forwardRef<HTMLDivElement, SkeletonProps>(\n ({\n className,\n variant = \"text\",\n width,\n height,\n animation = \"pulse\",\n ...props\n }, ref) => {\n const getAnimationStyle = (): React.CSSProperties => {\n if (animation === \"wave\" || animation === \"shimmer\") {\n return {\n background: \"linear-gradient(90deg, hsl(var(--muted)) 0%, hsl(var(--muted-foreground) / 0.2) 50%, hsl(var(--muted)) 100%)\",\n backgroundSize: \"200% 100%\",\n animation: \"shimmer 1.5s ease-in-out infinite\",\n }\n }\n return {}\n }\n\n return (\n <>\n {(animation === \"wave\" || animation === \"shimmer\") && (\n <style>{`\n @keyframes shimmer {\n 0% { background-position: 200% 0; }\n 100% { background-position: -200% 0; }\n }\n `}</style>\n )}\n <div\n ref={ref}\n className={merge(\n skeletonVariants({ variant, animation }),\n className\n )}\n style={{\n ...(width != null ? { width: typeof width === \"number\" ? `${width}px` : width } : {}),\n ...(height != null ? { height: typeof height === \"number\" ? `${height}px` : height } : {}),\n ...getAnimationStyle(),\n }}\n {...props}\n />\n </>\n )\n }\n)\nSkeleton.displayName = \"Skeleton\"\n\n// 편의 컴포넌트들\nexport const SkeletonText = React.forwardRef<HTMLDivElement, Omit<SkeletonProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Skeleton ref={ref} variant=\"text\" className={className} {...props} />\n )\n)\nSkeletonText.displayName = \"SkeletonText\"\n\nexport const SkeletonCircle = React.forwardRef<HTMLDivElement, Omit<SkeletonProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Skeleton ref={ref} variant=\"circular\" className={className} {...props} />\n )\n)\nSkeletonCircle.displayName = \"SkeletonCircle\"\n\nexport const SkeletonRectangle = React.forwardRef<HTMLDivElement, Omit<SkeletonProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Skeleton ref={ref} variant=\"rectangular\" className={className} {...props} />\n )\n)\nSkeletonRectangle.displayName = \"SkeletonRectangle\"\n\nexport const SkeletonRounded = React.forwardRef<HTMLDivElement, Omit<SkeletonProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Skeleton ref={ref} variant=\"rounded\" className={className} {...props} />\n )\n)\nSkeletonRounded.displayName = \"SkeletonRounded\"\n\n// 복합 스켈레톤 컴포넌트들\nexport const SkeletonCard = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"space-y-4 p-6\", className)} // 16px 간격, 24px 패딩\n {...props}\n >\n <div className=\"flex items-center space-x-4\"> {/* 16px 간격 */}\n <SkeletonCircle className=\"w-12 h-12\" /> {/* 48px 크기 */}\n <div className=\"space-y-2 flex-1\"> {/* 8px 간격 */}\n <SkeletonText className=\"h-4 w-3/4\" /> {/* 16px 높이, 75% 너비 */}\n <SkeletonText className=\"h-3 w-1/2\" /> {/* 12px 높이, 50% 너비 */}\n </div>\n </div>\n <SkeletonRounded className=\"w-full h-32\" /> {/* 128px 높이 */}\n <div className=\"space-y-2\"> {/* 8px 간격 */}\n <SkeletonText className=\"h-4 w-full\" />\n <SkeletonText className=\"h-4 w-5/6\" />\n <SkeletonText className=\"h-4 w-4/6\" />\n </div>\n </div>\n )\n)\nSkeletonCard.displayName = \"SkeletonCard\"\n\nexport const SkeletonAvatar = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"flex items-center space-x-4\", className)} // 16px 간격\n {...props}\n >\n <SkeletonCircle className=\"w-12 h-12\" /> {/* 48px 크기 */}\n <div className=\"space-y-2 flex-1\"> {/* 8px 간격 */}\n <SkeletonText className=\"h-4 w-3/4\" />\n <SkeletonText className=\"h-3 w-1/2\" />\n </div>\n </div>\n )\n)\nSkeletonAvatar.displayName = \"SkeletonAvatar\"\n\nexport const SkeletonImage = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"space-y-2\", className)} // 8px 간격\n {...props}\n >\n <SkeletonRounded className=\"w-full h-48\" /> {/* 192px 높이 */}\n <SkeletonText className=\"h-4 w-1/2\" />\n </div>\n )\n)\nSkeletonImage.displayName = \"SkeletonImage\"\n\nexport const SkeletonUserProfile = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"space-y-4\", className)} // 16px 간격\n {...props}\n >\n <div className=\"flex items-center space-x-4\"> {/* 16px 간격 */}\n <SkeletonCircle className=\"w-16 h-16\" /> {/* 64px 크기 */}\n <div className=\"space-y-2 flex-1\"> {/* 8px 간격 */}\n <SkeletonText className=\"h-5 w-1/2\" />\n <SkeletonText className=\"h-3 w-1/3\" />\n </div>\n </div>\n <div className=\"space-y-2\"> {/* 8px 간격 */}\n <SkeletonText className=\"h-4 w-full\" />\n <SkeletonText className=\"h-4 w-5/6\" />\n </div>\n </div>\n )\n)\nSkeletonUserProfile.displayName = \"SkeletonUserProfile\"\n\nexport const SkeletonList = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"space-y-4\", className)} // 16px 간격\n {...props}\n >\n {Array.from({ length: 3 }).map((_, index) => (\n <div key={index} className=\"flex items-center space-x-4\"> {/* 16px 간격 */}\n <SkeletonCircle className=\"w-10 h-10\" /> {/* 40px 크기 */}\n <div className=\"space-y-2 flex-1\"> {/* 8px 간격 */}\n <SkeletonText className=\"h-4 w-3/4\" />\n <SkeletonText className=\"h-3 w-1/2\" />\n </div>\n </div>\n ))}\n </div>\n )\n)\nSkeletonList.displayName = \"SkeletonList\"\n\nexport const SkeletonTable = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={merge(\"space-y-4\", className)} // 16px 간격\n {...props}\n >\n {/* 헤더 */}\n <div className=\"flex space-x-4\"> {/* 16px 간격 */}\n <SkeletonText className=\"h-4 w-1/4\" />\n <SkeletonText className=\"h-4 w-1/4\" />\n <SkeletonText className=\"h-4 w-1/4\" />\n <SkeletonText className=\"h-4 w-1/4\" />\n </div>\n {/* 행들 */}\n {Array.from({ length: 5 }).map((_, index) => (\n <div key={index} className=\"flex space-x-4\"> {/* 16px 간격 */}\n <SkeletonText className=\"h-4 w-1/4\" />\n <SkeletonText className=\"h-4 w-1/4\" />\n <SkeletonText className=\"h-4 w-1/4\" />\n <SkeletonText className=\"h-4 w-1/4\" />\n </div>\n ))}\n </div>\n )\n)\nSkeletonTable.displayName = \"SkeletonTable\"\n\nexport { Skeleton } ","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * Alert 컴포넌트의 props\n * @typedef {Object} AlertProps\n * @property {\"default\" | \"success\" | \"warning\" | \"error\" | \"info\"} [variant=\"default\"] - Alert 스타일 변형\n * @property {string} [title] - Alert 제목\n * @property {string} [description] - Alert 설명\n * @property {React.ReactNode} [icon] - 커스텀 아이콘\n * @property {React.ReactNode} [action] - 액션 버튼/요소\n * @property {boolean} [closable=false] - 닫기 버튼 표시 여부\n * @property {() => void} [onClose] - 닫기 버튼 클릭 시 호출되는 콜백\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface AlertProps extends React.HTMLAttributes<HTMLDivElement> {\n variant?: \"default\" | \"success\" | \"warning\" | \"error\" | \"info\"\n title?: string\n description?: string\n icon?: React.ReactNode\n action?: React.ReactNode\n closable?: boolean\n onClose?: () => void\n}\n\n/**\n * Alert 컴포넌트 / Alert component\n * \n * 사용자에게 중요한 정보나 경고를 표시하는 컴포넌트입니다.\n * 다양한 변형(variant)을 지원하며, 아이콘, 제목, 설명, 액션 버튼을 포함할 수 있습니다.\n * \n * Component for displaying important information or warnings to users.\n * Supports various variants and can include icons, titles, descriptions, and action buttons.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Alert variant=\"info\" title=\"정보\" description=\"이것은 정보 메시지입니다.\" />\n * \n * @example\n * // 닫기 버튼 포함 / With close button\n * <Alert \n * variant=\"warning\" \n * title=\"경고\" \n * closable \n * onClose={() => console.log('닫기')}\n * />\n * \n * @example\n * // 커스텀 아이콘과 액션 / Custom icon and action\n * <Alert \n * variant=\"success\"\n * icon={<Icon name=\"check\" />}\n * action={<Button size=\"sm\">확인</Button>}\n * >\n * 작업이 완료되었습니다.\n * </Alert>\n * \n * @param {AlertProps} props - Alert 컴포넌트의 props / Alert component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} Alert 컴포넌트 / Alert component\n */\nconst Alert = React.forwardRef<HTMLDivElement, AlertProps>(\n ({ \n className, \n variant = \"default\",\n title,\n description,\n icon,\n action,\n closable = false,\n onClose,\n children,\n ...props \n }, ref) => {\n const getVariantClasses = () => {\n switch (variant) {\n case \"success\":\n return \"bg-green-500/10 backdrop-blur-sm border-green-400/30 text-green-200 dark:bg-green-500/10 dark:border-green-400/30 dark:text-green-200\"\n case \"warning\":\n return \"bg-yellow-500/10 backdrop-blur-sm border-yellow-400/30 text-yellow-200 dark:bg-yellow-500/10 dark:border-yellow-400/30 dark:text-yellow-200\"\n case \"error\":\n return \"bg-red-500/10 backdrop-blur-sm border-red-400/30 text-red-200 dark:bg-red-500/10 dark:border-red-400/30 dark:text-red-200\"\n case \"info\":\n return \"bg-indigo-500/10 backdrop-blur-sm border-cyan-400/30 text-cyan-200 dark:bg-indigo-500/10 dark:border-cyan-400/30 dark:text-cyan-200\"\n default:\n return \"bg-white/10 backdrop-blur-sm border-white/30 text-white dark:bg-slate-800/20 dark:border-slate-700/50 dark:text-slate-200\"\n }\n }\n\n const getIconClasses = () => {\n switch (variant) {\n case \"success\":\n return \"text-green-500 dark:text-green-400\"\n case \"warning\":\n return \"text-yellow-500 dark:text-yellow-400\"\n case \"error\":\n return \"text-red-500 dark:text-red-400\"\n case \"info\":\n return \"text-cyan-500 dark:text-cyan-400\"\n default:\n return \"text-muted-foreground\"\n }\n }\n\n const getDefaultIcon = () => {\n switch (variant) {\n case \"success\":\n return (\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 13l4 4L19 7\" />\n </svg>\n )\n case \"warning\":\n return (\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.964-.833-2.732 0L3.732 16.5c-.77.833.192 2.5 1.732 2.5z\" />\n </svg>\n )\n case \"error\":\n return (\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n )\n case \"info\":\n return (\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n )\n default:\n return null\n }\n }\n\n return (\n <div\n ref={ref}\n className={merge(\n \"relative rounded-lg border p-4\", // 16px 패딩\n getVariantClasses(),\n className\n )}\n {...props}\n >\n <div className=\"flex items-start gap-3\"> {/* 12px 간격 */}\n {/* 아이콘 */}\n {(icon || getDefaultIcon()) && (\n <div className={merge(\"flex-shrink-0 mt-0.5\", getIconClasses())}>\n {icon || getDefaultIcon()}\n </div>\n )}\n\n {/* 내용 */}\n <div className=\"flex-1 min-w-0\">\n {title && (\n <h4 className=\"text-sm font-semibold mb-1\"> {/* 4px 여백 */}\n {title}\n </h4>\n )}\n {description && (\n <p className=\"text-sm leading-relaxed\">\n {description}\n </p>\n )}\n {children && (\n <div className=\"mt-2\"> {/* 8px 여백 */}\n {children}\n </div>\n )}\n </div>\n\n {/* 액션 */}\n {(action || closable) && (\n <div className=\"flex-shrink-0 flex items-center gap-2\"> {/* 8px 간격 */}\n {action}\n {closable && (\n <button\n onClick={onClose}\n className={merge(\n \"inline-flex rounded-md p-1.5 transition-colors duration-200 ease-in-out hover:bg-black/5 dark:hover:bg-white/5 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-offset-2\",\n getIconClasses()\n )}\n aria-label=\"닫기\"\n >\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n )}\n </div>\n )}\n </div>\n </div>\n )\n }\n)\nAlert.displayName = \"Alert\"\n\n// 편의 컴포넌트들\nexport const AlertSuccess = React.forwardRef<HTMLDivElement, Omit<AlertProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Alert ref={ref} variant=\"success\" className={className} {...props} />\n )\n)\nAlertSuccess.displayName = \"AlertSuccess\"\n\nexport const AlertWarning = React.forwardRef<HTMLDivElement, Omit<AlertProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Alert ref={ref} variant=\"warning\" className={className} {...props} />\n )\n)\nAlertWarning.displayName = \"AlertWarning\"\n\nexport const AlertError = React.forwardRef<HTMLDivElement, Omit<AlertProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Alert ref={ref} variant=\"error\" className={className} {...props} />\n )\n)\nAlertError.displayName = \"AlertError\"\n\nexport const AlertInfo = React.forwardRef<HTMLDivElement, Omit<AlertProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Alert ref={ref} variant=\"info\" className={className} {...props} />\n )\n)\nAlertInfo.displayName = \"AlertInfo\"\n\nexport { Alert } ","\"use client\"\n\nimport React from \"react\"\nimport { createContext, useContext, useState, useCallback } from \"react\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * Toast 메시지 타입 / Toast message type\n * @typedef {Object} Toast\n * @property {string} id - Toast 고유 ID / Toast unique ID\n * @property {\"success\" | \"error\" | \"warning\" | \"info\"} type - Toast 타입 / Toast type\n * @property {string} [title] - Toast 제목 / Toast title\n * @property {string} message - Toast 메시지 / Toast message\n * @property {number} [duration] - 표시 시간(ms), 0이면 자동 제거 안 함 / Display duration (ms), 0 means no auto-remove\n * @property {Object} [action] - 액션 버튼 / Action button\n * @property {string} action.label - 액션 버튼 레이블 / Action button label\n * @property {() => void} action.onClick - 액션 버튼 클릭 핸들러 / Action button click handler\n */\nexport interface Toast {\n id: string\n type: \"success\" | \"error\" | \"warning\" | \"info\"\n title?: string\n message: string\n duration?: number\n action?: {\n label: string\n onClick: () => void\n }\n}\n\n// Toast Context 타입\ninterface ToastContextType {\n toasts: Toast[]\n addToast: (toast: Omit<Toast, \"id\">) => void\n removeToast: (id: string) => void\n clearToasts: () => void\n}\n\n// Toast Context 생성\nconst ToastContext = createContext<ToastContextType | undefined>(undefined)\n\n/**\n * useToast Hook\n *\n * Toast를 추가, 제거, 초기화하는 훅입니다.\n * ToastProvider 내부에서만 사용 가능합니다.\n *\n * Hook for adding, removing, and clearing toasts.\n * Can only be used within ToastProvider.\n *\n * @example\n * const { addToast, removeToast, clearToasts } = useToast()\n *\n * addToast({\n * type: \"success\",\n * message: \"저장되었습니다\",\n * duration: 3000\n * })\n *\n * @returns {ToastContextType} Toast 컨텍스트 값 / Toast context value\n * @throws {Error} ToastProvider 외부에서 사용 시 에러 발생 / Error when used outside ToastProvider\n */\nexport function useToast(): ToastContextType {\n const context = useContext(ToastContext)\n if (!context) {\n throw new Error(\"useToast must be used within a ToastProvider\")\n }\n return context\n}\n\n// No-op functions for safe toast hook\nconst noopAddToast = () => {}\nconst noopRemoveToast = () => {}\nconst noopClearToasts = () => {}\n\n/**\n * useToastSafe Hook\n *\n * ToastProvider 없이도 안전하게 사용할 수 있는 useToast 훅입니다.\n * Provider가 없으면 no-op 함수를 반환합니다.\n *\n * Safe version of useToast that works without ToastProvider.\n * Returns no-op functions when used outside ToastProvider.\n *\n * @example\n * const { addToast } = useToastSafe()\n *\n * // 안전하게 호출 가능 - Provider 없으면 아무 일도 안 함\n * addToast({ type: \"success\", message: \"저장됨\" })\n *\n * @returns {ToastContextType} Toast 컨텍스트 값 또는 no-op 함수들\n */\nexport function useToastSafe(): ToastContextType {\n const context = useContext(ToastContext)\n if (!context) {\n return {\n toasts: [],\n addToast: noopAddToast,\n removeToast: noopRemoveToast,\n clearToasts: noopClearToasts,\n }\n }\n return context\n}\n\n/**\n * ToastProvider 컴포넌트의 props / ToastProvider component props\n * @typedef {Object} ToastProviderProps\n * @property {React.ReactNode} children - 자식 컴포넌트 / Child components\n * @property {number} [maxToasts=5] - 최대 Toast 개수 / Maximum number of toasts\n * @property {\"top-right\" | \"top-left\" | \"bottom-right\" | \"bottom-left\" | \"top-center\" | \"bottom-center\"} [position=\"top-right\"] - Toast 표시 위치 / Toast display position\n */\ninterface ToastProviderProps {\n children: React.ReactNode\n maxToasts?: number\n position?: \"top-right\" | \"top-left\" | \"bottom-right\" | \"bottom-left\" | \"top-center\" | \"bottom-center\"\n}\n\n/**\n * ToastProvider 컴포넌트 / ToastProvider component\n * \n * Toast 시스템의 컨텍스트를 제공하는 Provider 컴포넌트입니다.\n * 앱의 루트 레벨에서 사용하여 전역 Toast 기능을 활성화합니다.\n * \n * Provider component that provides context for the Toast system.\n * Use at the root level of your app to enable global Toast functionality.\n * \n * @component\n * @example\n * // App.tsx\n * <ToastProvider position=\"top-center\" maxToasts={3}>\n * <App />\n * </ToastProvider>\n * \n * @example\n * // 컴포넌트에서 사용 / Usage in component\n * const { addToast } = useToast()\n * \n * const handleSave = () => {\n * addToast({\n * type: \"success\",\n * message: \"저장되었습니다\",\n * title: \"성공\"\n * })\n * }\n * \n * @param {ToastProviderProps} props - ToastProvider 컴포넌트의 props / ToastProvider component props\n * @returns {JSX.Element} ToastProvider 컴포넌트 / ToastProvider component\n * \n * @todo 접근성 개선: ToastItem에 role=\"alert\" 또는 role=\"status\" 추가 필요 / Accessibility: Add role=\"alert\" or role=\"status\" to ToastItem\n * @todo 접근성 개선: aria-live=\"polite\" 또는 aria-live=\"assertive\" 추가 필요 / Accessibility: Add aria-live=\"polite\" or aria-live=\"assertive\"\n */\nexport function ToastProvider({\n children,\n maxToasts = 5,\n position = \"top-right\"\n}: ToastProviderProps) {\n const [toasts, setToasts] = useState<Toast[]>([])\n\n const removeToast = useCallback((id: string) => {\n setToasts(prev => prev.filter(toast => toast.id !== id))\n }, [])\n\n const addToast = useCallback((toast: Omit<Toast, \"id\">) => {\n const id = Math.random().toString(36).substr(2, 9)\n const newToast: Toast = { ...toast, id }\n\n setToasts(prev => {\n const updatedToasts = [...prev, newToast]\n return updatedToasts.slice(-maxToasts) // 최대 개수 제한\n })\n\n // 자동 제거\n if (toast.duration !== 0) {\n setTimeout(() => {\n removeToast(id)\n }, toast.duration || 5000)\n }\n }, [maxToasts, removeToast])\n\n const clearToasts = useCallback(() => {\n setToasts([])\n }, [])\n\n return (\n <ToastContext.Provider value={{ toasts, addToast, removeToast, clearToasts }}>\n {children}\n <ToastContainer toasts={toasts} removeToast={removeToast} position={position} />\n </ToastContext.Provider>\n )\n}\n\n// Toast Container Props\ninterface ToastContainerProps {\n toasts: Toast[]\n removeToast: (id: string) => void\n position: string\n}\n\n// Toast Container\nfunction ToastContainer({ toasts, removeToast, position }: ToastContainerProps) {\n const positionClasses = {\n \"top-right\": \"top-4 right-4\",\n \"top-left\": \"top-4 left-4\",\n \"bottom-right\": \"bottom-4 right-4\",\n \"bottom-left\": \"bottom-4 left-4\",\n \"top-center\": \"top-4 left-1/2 transform -translate-x-1/2\",\n \"bottom-center\": \"bottom-4 left-1/2 transform -translate-x-1/2\"\n }\n\n if (toasts.length === 0) return null\n\n return (\n <div className={merge(\n \"fixed z-50 space-y-3 max-w-sm\", // 12px 간격\n positionClasses[position as keyof typeof positionClasses]\n )}>\n {toasts.map((toast) => (\n <ToastItem key={toast.id} toast={toast} onRemove={removeToast} />\n ))}\n </div>\n )\n}\n\n// Toast Item Props\ninterface ToastItemProps {\n toast: Toast\n onRemove: (id: string) => void\n}\n\n// Toast Item\nfunction ToastItem({ toast, onRemove }: ToastItemProps) {\n const [isVisible, setIsVisible] = useState(false)\n\n React.useEffect(() => {\n setIsVisible(true)\n }, [])\n\n const handleRemove = () => {\n setIsVisible(false)\n setTimeout(() => onRemove(toast.id), 300)\n }\n\n // CSS 변수 기반 배경색 (Tailwind v4 dark: variant + bg-color 충돌 우회)\n // 앱에서 --toast-*-bg 변수 정의 필요\n const getToastStyles = (type: Toast[\"type\"]) => {\n switch (type) {\n case \"success\":\n return \"bg-[var(--toast-success-bg)] border-green-300 dark:border-green-700 text-green-800 dark:text-green-200 shadow-lg shadow-green-100/50 dark:shadow-none\"\n case \"error\":\n return \"bg-[var(--toast-error-bg)] border-red-300 dark:border-red-700 text-red-800 dark:text-red-200 shadow-lg shadow-red-100/50 dark:shadow-none\"\n case \"warning\":\n return \"bg-[var(--toast-warning-bg)] border-yellow-300 dark:border-yellow-700 text-yellow-800 dark:text-yellow-200 shadow-lg shadow-yellow-100/50 dark:shadow-none\"\n case \"info\":\n return \"bg-[var(--toast-info-bg)] border-indigo-300 dark:border-indigo-700 text-cyan-800 dark:text-cyan-200 shadow-lg shadow-indigo-100/50 dark:shadow-none\"\n }\n }\n\n const getIconStyles = (type: Toast[\"type\"]) => {\n switch (type) {\n case \"success\":\n return \"text-green-500 dark:text-green-400\"\n case \"error\":\n return \"text-red-500 dark:text-red-400\"\n case \"warning\":\n return \"text-yellow-500 dark:text-yellow-400\"\n case \"info\":\n return \"text-cyan-500 dark:text-cyan-400\"\n }\n }\n\n const getToastIcon = (type: Toast[\"type\"]) => {\n switch (type) {\n case \"success\":\n return (\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 13l4 4L19 7\" />\n </svg>\n )\n case \"error\":\n return (\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n )\n case \"warning\":\n return (\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.964-.833-2.732 0L3.732 16.5c-.77.833.192 2.5 1.732 2.5z\" />\n </svg>\n )\n case \"info\":\n return (\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n )\n }\n }\n\n return (\n <div\n className={merge(\n \"flex items-start p-4 rounded-xl border backdrop-blur-sm transition-all duration-300 transform\",\n getToastStyles(toast.type),\n isVisible\n ? \"translate-x-0 opacity-100 scale-100\"\n : \"translate-x-full opacity-0 scale-95\"\n )}\n style={{\n animation: isVisible ? \"slideInRight 0.3s cubic-bezier(0.16, 1, 0.3, 1)\" : undefined\n }}\n >\n {/* 아이콘 */}\n <div className={merge(\"flex-shrink-0 mr-3\", getIconStyles(toast.type))}> {/* 12px 여백 */}\n {getToastIcon(toast.type)}\n </div>\n\n {/* 내용 */}\n <div className=\"flex-1 min-w-0\">\n {toast.title && (\n <h4 className=\"text-sm font-semibold mb-1\"> {/* 4px 여백 */}\n {toast.title}\n </h4>\n )}\n <p className=\"text-sm leading-relaxed\">\n {toast.message}\n </p>\n\n {/* 액션 버튼 */}\n {toast.action && (\n <button\n onClick={toast.action.onClick}\n className=\"mt-3 text-sm font-medium underline hover:no-underline transition-all duration-200\" // 12px 여백\n >\n {toast.action.label}\n </button>\n )}\n </div>\n\n {/* 닫기 버튼 */}\n <div className=\"flex-shrink-0 ml-4\"> {/* 16px 여백 */}\n <button\n onClick={handleRemove}\n className={merge(\n \"inline-flex rounded-md p-1.5 transition-colors duration-200 ease-in-out hover:bg-black/5 dark:hover:bg-white/10 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-offset-2\",\n getIconStyles(toast.type)\n )}\n aria-label=\"닫기\"\n >\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </div>\n </div>\n )\n}\n\n// 편의 함수들 (ToastProvider 내부에서만 사용 가능 - 스텁 함수)\nexport const showToast = (_toast: Omit<Toast, \"id\">) => {\n // ToastProvider 컨텍스트 필요\n}\n\nexport const showSuccessToast = (_message: string, _title?: string, _duration?: number) => {\n // ToastProvider 컨텍스트 필요\n}\n\nexport const showErrorToast = (_message: string, _title?: string, _duration?: number) => {\n // ToastProvider 컨텍스트 필요\n}\n\nexport const showWarningToast = (_message: string, _title?: string, _duration?: number) => {\n // ToastProvider 컨텍스트 필요\n}\n\nexport const showInfoToast = (_message: string, _title?: string, _duration?: number) => {\n // ToastProvider 컨텍스트 필요\n} ","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * LoadingSpinner 컴포넌트의 props / LoadingSpinner component props\n * @typedef {Object} LoadingSpinnerProps\n * @property {\"sm\" | \"md\" | \"lg\" | \"xl\"} [size=\"md\"] - Spinner 크기 / Spinner size\n * @property {\"default\" | \"dots\" | \"bars\" | \"ring\" | \"ripple\"} [variant=\"default\"] - Spinner 애니메이션 타입 / Spinner animation type\n * @property {string} [text] - Spinner 아래 표시할 텍스트 / Text to display below spinner\n * @property {\"default\" | \"primary\" | \"secondary\" | \"success\" | \"warning\" | \"error\" | \"glass\"} [color=\"default\"] - Spinner 색상 / Spinner color\n * @property {string} [className] - 추가 CSS 클래스 / Additional CSS class\n */\nexport interface LoadingSpinnerProps {\n size?: \"sm\" | \"md\" | \"lg\" | \"xl\"\n variant?: \"default\" | \"dots\" | \"bars\" | \"ring\" | \"ripple\"\n text?: string\n color?: \"default\" | \"primary\" | \"secondary\" | \"success\" | \"warning\" | \"error\" | \"glass\"\n className?: string\n}\n\n/**\n * LoadingSpinner 컴포넌트 / LoadingSpinner component\n * \n * 로딩 상태를 표시하는 스피너 컴포넌트입니다.\n * 다양한 애니메이션 타입과 크기를 지원합니다.\n * \n * Spinner component that displays loading state.\n * Supports various animation types and sizes.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <LoadingSpinner />\n * \n * @example\n * // 텍스트와 함께 / With text\n * <LoadingSpinner \n * text=\"로딩 중...\"\n * size=\"lg\"\n * color=\"primary\"\n * />\n * \n * @example\n * // 다양한 애니메이션 / Various animations\n * <LoadingSpinner variant=\"dots\" />\n * <LoadingSpinner variant=\"bars\" color=\"success\" />\n * <LoadingSpinner variant=\"ripple\" size=\"xl\" />\n * \n * @param {LoadingSpinnerProps} props - LoadingSpinner 컴포넌트의 props / LoadingSpinner component props\n * @returns {JSX.Element} LoadingSpinner 컴포넌트 / LoadingSpinner component\n */\nexport function LoadingSpinner({ \n className, \n size = \"md\", \n variant = \"default\", \n text, \n color = \"default\" \n}: LoadingSpinnerProps) {\n const sizeClasses = {\n sm: \"w-6 h-6\", // 24px - 더 넉넉한 크기\n md: \"w-8 h-8\", // 32px - 더 넉넉한 크기\n lg: \"w-12 h-12\", // 48px - 더 넉넉한 크기\n xl: \"w-16 h-16\" // 64px - 더 넉넉한 크기\n }\n\n // LoadingSpinner는 border 색상을 사용하므로 특화 색상 시스템 사용\n // 다크모드: track(배경)은 밝게, spinner(회전부)는 더 밝게 → 대비 확보\n const spinnerColors: Record<string, string> = {\n default: \"border-muted-foreground/30 border-t-muted-foreground dark:border-muted-foreground/20 dark:border-t-muted-foreground/80\",\n primary: \"border-primary/30 border-t-primary dark:border-primary/20 dark:border-t-primary/80\",\n secondary: \"border-muted-foreground/30 border-t-muted-foreground dark:border-muted-foreground/20 dark:border-t-muted-foreground/80\",\n success: \"border-green-300 border-t-green-600 dark:border-green-500/50 dark:border-t-green-300\",\n warning: \"border-yellow-300 border-t-yellow-600 dark:border-yellow-500/50 dark:border-t-yellow-300\",\n error: \"border-red-300 border-t-red-600 dark:border-red-500/50 dark:border-t-red-300\",\n glass: \"border-white/50 border-t-white/90 dark:border-slate-400/60 dark:border-t-slate-100\"\n }\n\n const renderSpinner = () => {\n switch (variant) {\n case \"dots\":\n // 순차 점멸 애니메이션 (... 형태)\n return (\n <>\n <style>{`\n @keyframes dotPulse {\n 0%, 80%, 100% { opacity: 0.3; }\n 40% { opacity: 1; }\n }\n `}</style>\n <div className=\"flex space-x-1 items-center\">\n <div className=\"w-2 h-2 bg-current rounded-full\" style={{ animation: 'dotPulse 1.4s ease-in-out infinite', animationDelay: '0ms' }} />\n <div className=\"w-2 h-2 bg-current rounded-full\" style={{ animation: 'dotPulse 1.4s ease-in-out infinite', animationDelay: '200ms' }} />\n <div className=\"w-2 h-2 bg-current rounded-full\" style={{ animation: 'dotPulse 1.4s ease-in-out infinite', animationDelay: '400ms' }} />\n </div>\n </>\n )\n case \"bars\":\n return (\n <>\n <style>{`\n @keyframes barWave {\n 0%, 40%, 100% { transform: scaleY(0.4); }\n 20% { transform: scaleY(1); }\n }\n `}</style>\n <div className=\"flex space-x-0.5 h-full items-center\">\n <div className=\"w-1 h-full bg-current rounded-sm origin-bottom\" style={{ animation: 'barWave 1.2s ease-in-out infinite', animationDelay: '0ms' }} />\n <div className=\"w-1 h-full bg-current rounded-sm origin-bottom\" style={{ animation: 'barWave 1.2s ease-in-out infinite', animationDelay: '100ms' }} />\n <div className=\"w-1 h-full bg-current rounded-sm origin-bottom\" style={{ animation: 'barWave 1.2s ease-in-out infinite', animationDelay: '200ms' }} />\n <div className=\"w-1 h-full bg-current rounded-sm origin-bottom\" style={{ animation: 'barWave 1.2s ease-in-out infinite', animationDelay: '300ms' }} />\n <div className=\"w-1 h-full bg-current rounded-sm origin-bottom\" style={{ animation: 'barWave 1.2s ease-in-out infinite', animationDelay: '400ms' }} />\n </div>\n </>\n )\n case \"ring\":\n return (\n <div className={merge(\n \"w-full h-full animate-spin rounded-full\",\n size === \"xl\" ? \"border-[3px]\" : size === \"lg\" ? \"border-[2.5px]\" : \"border-2\",\n spinnerColors[color] || spinnerColors.default\n )} />\n )\n case \"ripple\":\n return (\n <div className=\"relative w-full h-full\">\n <div className={merge(\n \"absolute inset-0 rounded-full border-2 animate-ping\",\n spinnerColors[color] || spinnerColors.default\n )} />\n <div className={merge(\n \"w-full h-full rounded-full border-2\",\n spinnerColors[color] || spinnerColors.default\n )} />\n </div>\n )\n default:\n return (\n <div className={merge(\n \"w-full h-full animate-spin rounded-full\",\n size === \"xl\" ? \"border-[3px]\" : size === \"lg\" ? \"border-[2.5px]\" : \"border-2\",\n spinnerColors[color] || spinnerColors.default\n )} />\n )\n }\n }\n\n return (\n <div className={merge(\"flex flex-col items-center justify-center\", className)}>\n <div className={merge(sizeClasses[size], \"text-muted-foreground\")}>\n {renderSpinner()}\n </div>\n {text && (\n <p className=\"mt-3 text-sm text-muted-foreground text-center\">\n {text}\n </p>\n )}\n </div>\n )\n} ","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * Tooltip 컴포넌트의 props / Tooltip component props\n * @typedef {Object} TooltipProps\n * @property {string} content - Tooltip 내용 / Tooltip content\n * @property {React.ReactNode} children - Tooltip이 연결될 요소 / Element to attach tooltip to\n * @property {\"top\" | \"bottom\" | \"left\" | \"right\"} [position=\"top\"] - Tooltip 표시 위치 / Tooltip display position\n * @property {\"default\" | \"light\" | \"dark\"} [variant=\"default\"] - Tooltip 스타일 변형 / Tooltip style variant\n * @property {number} [delay=300] - Tooltip 표시 지연 시간(ms) / Tooltip display delay (ms)\n * @property {boolean} [disabled=false] - Tooltip 비활성화 여부 / Disable tooltip\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\nexport interface TooltipProps extends React.HTMLAttributes<HTMLDivElement> {\n content: string\n children: React.ReactNode\n position?: \"top\" | \"bottom\" | \"left\" | \"right\"\n variant?: \"default\" | \"light\" | \"dark\"\n delay?: number\n disabled?: boolean\n}\n\n/**\n * Tooltip 컴포넌트 / Tooltip component\n * \n * 호버 시 추가 정보를 표시하는 툴팁 컴포넌트입니다.\n * 마우스 호버 시 지연 시간 후 표시됩니다.\n * \n * Tooltip component that displays additional information on hover.\n * Appears after a delay when the mouse hovers over the element.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Tooltip content=\"이것은 도움말입니다\">\n * <Button>호버하세요</Button>\n * </Tooltip>\n * \n * @example\n * // 다양한 위치 / Different positions\n * <Tooltip content=\"위치 변경\" position=\"bottom\">\n * <Icon name=\"info\" />\n * </Tooltip>\n * \n * @example\n * // 커스텀 스타일 / Custom styles\n * <Tooltip content=\"라이트 스타일\" variant=\"light\" delay={500}>\n * <span>호버</span>\n * </Tooltip>\n * \n * @param {TooltipProps} props - Tooltip 컴포넌트의 props / Tooltip component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} Tooltip 컴포넌트 / Tooltip component\n * \n * @todo 접근성 개선: role=\"tooltip\" 추가 필요 / Accessibility: Add role=\"tooltip\"\n * @todo 접근성 개선: aria-describedby 연결 필요 / Accessibility: Connect aria-describedby\n * @todo 접근성 개선: 키보드 포커스 시 Tooltip 표시 필요 / Accessibility: Show tooltip on keyboard focus\n */\nconst Tooltip = React.forwardRef<HTMLDivElement, TooltipProps>(\n ({ \n className, \n content,\n children,\n position = \"top\",\n variant = \"default\",\n delay = 300,\n disabled = false,\n ...props \n }, ref) => {\n const [isVisible, setIsVisible] = React.useState(false)\n const [coords, setCoords] = React.useState({ x: 0, y: 0 })\n const timeoutRef = React.useRef<number | undefined>(undefined)\n const tooltipRef = React.useRef<HTMLDivElement>(null)\n\n const showTooltip = (e: React.MouseEvent) => {\n if (disabled) return\n \n const rect = e.currentTarget.getBoundingClientRect()\n const _tooltipRect = tooltipRef.current?.getBoundingClientRect()\n \n let x = 0\n let y = 0\n \n switch (position) {\n case \"top\":\n x = rect.left + rect.width / 2\n y = rect.top - 8 // 8px 간격\n break\n case \"bottom\":\n x = rect.left + rect.width / 2\n y = rect.bottom + 8 // 8px 간격\n break\n case \"left\":\n x = rect.left - 8 // 8px 간격\n y = rect.top + rect.height / 2\n break\n case \"right\":\n x = rect.right + 8 // 8px 간격\n y = rect.top + rect.height / 2\n break\n }\n \n setCoords({ x, y })\n \n timeoutRef.current = window.setTimeout(() => {\n setIsVisible(true)\n }, delay)\n }\n\n const hideTooltip = () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current)\n }\n setIsVisible(false)\n }\n\n React.useEffect(() => {\n return () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current)\n }\n }\n }, [])\n\n const getVariantClasses = () => {\n switch (variant) {\n case \"light\":\n return \"bg-popover text-popover-foreground border border-border shadow-lg\"\n case \"dark\":\n return \"bg-gray-900 text-white shadow-lg\"\n default:\n return \"bg-gray-800 text-white shadow-lg\"\n }\n }\n\n const _getPositionClasses = () => {\n switch (position) {\n case \"top\":\n return \"bottom-full left-1/2 -translate-x-1/2 mb-2\" // 8px 간격\n case \"bottom\":\n return \"top-full left-1/2 -translate-x-1/2 mt-2\" // 8px 간격\n case \"left\":\n return \"right-full top-1/2 -translate-y-1/2 mr-2\" // 8px 간격\n case \"right\":\n return \"left-full top-1/2 -translate-y-1/2 ml-2\" // 8px 간격\n default:\n return \"bottom-full left-1/2 -translate-x-1/2 mb-2\"\n }\n }\n\n const getArrowClasses = () => {\n switch (position) {\n case \"top\":\n return \"top-full left-1/2 -translate-x-1/2 border-t-gray-800 dark:border-t-gray-800\"\n case \"bottom\":\n return \"bottom-full left-1/2 -translate-x-1/2 border-b-gray-800 dark:border-b-gray-800\"\n case \"left\":\n return \"left-full top-1/2 -translate-y-1/2 border-l-gray-800 dark:border-l-gray-800\"\n case \"right\":\n return \"right-full top-1/2 -translate-y-1/2 border-r-gray-800 dark:border-r-gray-800\"\n default:\n return \"top-full left-1/2 -translate-x-1/2 border-t-gray-800 dark:border-t-gray-800\"\n }\n }\n\n return (\n <div\n ref={ref}\n className={merge(\"relative inline-block\", className)}\n onMouseEnter={showTooltip}\n onMouseLeave={hideTooltip}\n {...props}\n >\n {children}\n \n {isVisible && (\n <div\n ref={tooltipRef}\n className={merge(\n \"fixed z-50 px-3 py-2 text-sm rounded-lg whitespace-nowrap pointer-events-none\", // 12px, 8px 패딩\n getVariantClasses()\n )}\n style={{\n left: `${coords.x}px`,\n top: `${coords.y}px`,\n transform: 'translate(-50%, -50%)'\n }}\n >\n {content}\n {/* 화살표 */}\n <div\n className={merge(\n \"absolute w-0 h-0 border-4 border-transparent\",\n getArrowClasses()\n )}\n />\n </div>\n )}\n </div>\n )\n }\n)\nTooltip.displayName = \"Tooltip\"\n\n// 편의 컴포넌트들\nexport const TooltipLight = React.forwardRef<HTMLDivElement, Omit<TooltipProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Tooltip ref={ref} variant=\"light\" className={className} {...props} />\n )\n)\nTooltipLight.displayName = \"TooltipLight\"\n\nexport const TooltipDark = React.forwardRef<HTMLDivElement, Omit<TooltipProps, \"variant\">>(\n ({ className, ...props }, ref) => (\n <Tooltip ref={ref} variant=\"dark\" className={className} {...props} />\n )\n)\nTooltipDark.displayName = \"TooltipDark\"\n\nexport { Tooltip } ","\"use client\"\n\nimport React from \"react\"\nimport { cva } from \"class-variance-authority\"\nimport { merge } from \"../lib/utils\"\n\nexport const labelVariants = cva(\n \"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\",\n {\n variants: {\n variant: {\n default: \"text-foreground\",\n glass: \"text-white\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\n/**\n * Label 컴포넌트의 props / Label component props\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 * @example\n * <Label htmlFor=\"email\">이메일</Label>\n * <Label required htmlFor=\"name\">이름</Label>\n * <Label error htmlFor=\"password\">비밀번호</Label>\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 return (\n <label\n ref={ref}\n className={merge(\n labelVariants({ variant }),\n error && (variant === \"glass\" ? \"text-red-400\" : \"text-destructive\"),\n disabled && (variant === \"glass\" ? \"text-white/50\" : \"text-muted-foreground\"),\n className\n )}\n aria-required={required ? true : undefined}\n {...props}\n >\n {children}\n {required && (\n <span className={variant === \"glass\" ? \"text-red-400 ml-1\" : \"text-destructive 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 * 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 generatedId = React.useId()\n const switchId = id || generatedId\n const labelId = label ? `${switchId}-label` : undefined\n const descriptionId = description ? `${switchId}-description` : undefined\n // Track sizes - proper proportions for smooth toggle\n const sizeClasses = {\n sm: \"w-9 h-5\",\n md: \"w-11 h-6\",\n lg: \"w-14 h-8\"\n }\n\n // Thumb sizes - slightly smaller than track height for padding\n const thumbSizes = {\n sm: \"w-4 h-4\",\n md: \"w-5 h-5\",\n lg: \"w-7 h-7\"\n }\n\n // Thumb position when checked - calculated for proper alignment\n const thumbTranslate = {\n sm: \"peer-checked:translate-x-4\",\n md: \"peer-checked:translate-x-5\",\n lg: \"peer-checked:translate-x-6\"\n }\n\n const variantClasses = {\n default: \"bg-muted peer-checked:bg-primary\",\n outline: \"bg-transparent border-2 border-input peer-checked:border-primary peer-checked:bg-primary\",\n filled: \"bg-secondary peer-checked:bg-primary\",\n glass: \"bg-white/20 backdrop-blur-sm border border-white/30 peer-checked:bg-primary/50 peer-checked:border-primary/30\",\n }\n\n const stateClasses = error\n ? \"bg-destructive/20 peer-checked:bg-destructive\"\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-1 peer-focus:ring-ring 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 absolute rounded-full bg-white shadow-md ring-0\",\n \"transition-all duration-200 ease-out\",\n \"top-1/2 -translate-y-1/2 left-0.5\",\n thumbSizes[size],\n thumbTranslate[size]\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-foreground cursor-pointer\">\n {label}\n </label>\n )}\n {description && (\n <p id={descriptionId} className=\"text-sm text-muted-foreground\">\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 * Toggle 컴포넌트의 props / Toggle component props\n * @typedef {Object} ToggleProps\n * @property {\"default\" | \"outline\" | \"filled\" | \"ghost\" | \"glass\"} [variant=\"default\"] - Toggle 스타일 변형 / Toggle style variant\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - Toggle 크기 / Toggle size\n * @property {boolean} [pressed] - 제어 모드에서 눌림 상태 / Pressed state in controlled mode\n * @property {(pressed: boolean) => void} [onPressedChange] - 상태 변경 콜백 / State change callback\n * @property {string} [label] - Toggle 라벨 텍스트 / Toggle label text\n * @property {string} [description] - Toggle 설명 텍스트 / Toggle description text\n * @property {React.ReactNode} [icon] - 아이콘 / Icon\n * @property {\"left\" | \"right\"} [iconPosition=\"left\"] - 아이콘 위치 / Icon position\n * @extends {Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'size'>}\n */\nexport interface ToggleProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'size'> {\n variant?: \"default\" | \"outline\" | \"filled\" | \"ghost\" | \"glass\"\n size?: \"sm\" | \"md\" | \"lg\"\n pressed?: boolean\n onPressedChange?: (pressed: boolean) => void\n label?: string\n description?: string\n icon?: React.ReactNode\n iconPosition?: \"left\" | \"right\"\n}\n\n/**\n * Toggle 컴포넌트 / Toggle component\n * \n * 눌림 상태를 가지는 토글 버튼 컴포넌트입니다.\n * Switch와 달리 버튼 형태로 표시되며, 여러 개를 그룹으로 사용할 수 있습니다.\n * \n * Toggle button component with pressed state.\n * Unlike Switch, displayed as a button and can be used in groups.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <Toggle label=\"알림\" />\n * \n * @example\n * // 제어 모드 / Controlled mode\n * const [pressed, setPressed] = useState(false)\n * <Toggle \n * pressed={pressed}\n * onPressedChange={setPressed}\n * label=\"다크 모드\"\n * icon={<Icon name=\"moon\" />}\n * />\n * \n * @example\n * // 아이콘만 / Icon only\n * <Toggle \n * icon={<Icon name=\"heart\" />}\n * variant=\"ghost\"\n * />\n * \n * @param {ToggleProps} props - Toggle 컴포넌트의 props / Toggle component props\n * @param {React.Ref<HTMLButtonElement>} ref - button 요소 ref / button element ref\n * @returns {JSX.Element} Toggle 컴포넌트 / Toggle component\n */\nconst Toggle = React.forwardRef<HTMLButtonElement, ToggleProps>(\n ({ \n className, \n variant = \"default\",\n size = \"md\",\n pressed: controlledPressed,\n onPressedChange,\n label,\n description,\n icon,\n iconPosition = \"left\",\n onClick,\n ...props \n }, ref) => {\n const [internalPressed, setInternalPressed] = React.useState(false)\n const isControlled = controlledPressed !== undefined\n const pressed = isControlled ? controlledPressed : internalPressed\n\n const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {\n if (!isControlled) {\n setInternalPressed(!pressed)\n }\n onPressedChange?.(!pressed)\n onClick?.(e)\n }\n\n const sizeClasses = {\n sm: \"h-7 px-3 text-sm\",\n md: \"h-9 px-4 text-base\",\n lg: \"h-11 px-5 text-lg\"\n }\n\n const variantClasses = {\n default: pressed\n ? \"bg-primary text-primary-foreground hover:bg-primary/80\"\n : \"bg-muted text-foreground hover:bg-muted/80\",\n outline: pressed\n ? \"border-2 border-primary bg-primary/10 text-primary hover:bg-primary/15\"\n : \"border-2 border-border bg-transparent text-foreground hover:bg-muted\",\n filled: pressed\n ? \"bg-primary text-primary-foreground hover:bg-primary/80\"\n : \"bg-muted/50 text-foreground hover:bg-muted\",\n ghost: pressed\n ? \"bg-primary/10 text-primary hover:bg-primary/15\"\n : \"bg-transparent text-foreground hover:bg-muted\",\n glass: pressed\n ? \"bg-white/20 backdrop-blur-sm border border-white/30 text-white hover:bg-white/30 dark:bg-primary/20 dark:border-primary/50 dark:hover:bg-primary/30\"\n : \"bg-white/10 backdrop-blur-sm border border-white/20 text-white hover:bg-white/20 dark:bg-muted/10 dark:border-border/50 dark:text-foreground dark:hover:bg-muted/20\"\n }\n\n return (\n <div className=\"flex items-start space-x-3\">\n <button\n type=\"button\"\n ref={ref}\n className={merge(\n \"inline-flex items-center justify-center gap-2 rounded-md font-medium transition-all duration-200\",\n \"focus:outline-none focus:ring-1 focus:ring-ring focus:ring-offset-2\",\n \"disabled:cursor-not-allowed disabled:opacity-50\",\n sizeClasses[size],\n variantClasses[variant],\n className\n )}\n onClick={handleClick}\n aria-pressed={pressed}\n {...props}\n >\n {icon && iconPosition === \"left\" && (\n <span className=\"flex-shrink-0\">{icon}</span>\n )}\n {label && <span>{label}</span>}\n {icon && iconPosition === \"right\" && (\n <span className=\"flex-shrink-0\">{icon}</span>\n )}\n </button>\n {description && (\n <div className=\"flex flex-col\">\n <p className=\"text-sm text-muted-foreground\">\n {description}\n </p>\n </div>\n )}\n </div>\n )\n }\n)\nToggle.displayName = \"Toggle\"\n\nexport { Toggle }\n\n","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\n\n/**\n * ScrollArea 컴포넌트의 props / ScrollArea component props\n * @typedef {Object} ScrollAreaProps\n * @property {React.ReactNode} children - 스크롤 영역 내용 / Scroll area content\n * @property {string} [className] - 추가 CSS 클래스 / Additional CSS class\n * @property {\"vertical\" | \"horizontal\" | \"both\"} [orientation=\"vertical\"] - 스크롤 방향 / Scroll direction\n * @property {number} [scrollHideDelay=600] - 스크롤바 숨김 지연 시간 (ms) / Scrollbar hide delay (ms)\n * @property {\"auto\" | \"always\" | \"scroll\" | \"hover\"} [type=\"hover\"] - 스크롤바 표시 타입 / Scrollbar display type\n * @extends {React.HTMLAttributes<HTMLDivElement>}\n */\ninterface ScrollAreaProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode\n className?: string\n orientation?: \"vertical\" | \"horizontal\" | \"both\"\n scrollHideDelay?: number\n type?: \"auto\" | \"always\" | \"scroll\" | \"hover\"\n}\n\n/**\n * ScrollArea 컴포넌트 / ScrollArea component\n * \n * 커스텀 스크롤바를 가진 스크롤 영역 컴포넌트입니다.\n * 호버 시 스크롤바를 표시하거나 항상 표시할 수 있습니다.\n * \n * Scroll area component with custom scrollbar.\n * Can display scrollbar on hover or always.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <ScrollArea className=\"h-64\">\n * <div>긴 내용...</div>\n * </ScrollArea>\n * \n * @example\n * // 가로 스크롤, 항상 표시 / Horizontal scroll, always visible\n * <ScrollArea orientation=\"horizontal\" type=\"always\">\n * <div className=\"flex space-x-4\">...</div>\n * </ScrollArea>\n * \n * @param {ScrollAreaProps} props - ScrollArea 컴포넌트의 props / ScrollArea component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} ScrollArea 컴포넌트 / ScrollArea component\n */\nconst ScrollArea = React.forwardRef<HTMLDivElement, ScrollAreaProps>(\n ({ \n children, \n className, \n orientation = \"vertical\",\n scrollHideDelay = 600,\n type = \"hover\",\n ...props \n }, ref) => {\n const [showScrollbar, setShowScrollbar] = React.useState(false)\n const timeoutRef = React.useRef<ReturnType<typeof setTimeout> | undefined>(undefined)\n\n const handleMouseEnter = () => {\n if (type === \"hover\" || type === \"always\") {\n setShowScrollbar(true)\n }\n }\n\n const handleMouseLeave = () => {\n if (type === \"hover\") {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current)\n }\n timeoutRef.current = setTimeout(() => {\n setShowScrollbar(false)\n }, scrollHideDelay)\n }\n }\n\n React.useEffect(() => {\n if (type === \"always\") {\n setShowScrollbar(true)\n }\n }, [type])\n\n React.useEffect(() => {\n return () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current)\n }\n }\n }, [])\n\n return (\n <div\n ref={ref}\n className={merge(\n \"relative overflow-auto scrollbar-thin\",\n orientation === \"vertical\" && \"overflow-y-auto overflow-x-hidden\",\n orientation === \"horizontal\" && \"overflow-x-auto overflow-y-hidden\",\n orientation === \"both\" && \"overflow-auto\",\n showScrollbar ? \"scrollbar-visible\" : \"scrollbar-hidden\",\n className\n )}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n {...props}\n >\n {children}\n </div>\n )\n }\n)\n\nScrollArea.displayName = \"ScrollArea\"\n\n/**\n * ScrollBar 컴포넌트의 props / ScrollBar component props\n * @typedef {Object} ScrollBarProps\n * @property {\"vertical\" | \"horizontal\"} [orientation=\"vertical\"] - 스크롤바 방향 / Scrollbar direction\n * @property {string} [className] - 추가 CSS 클래스 / Additional CSS class\n */\ninterface ScrollBarProps {\n orientation?: \"vertical\" | \"horizontal\"\n className?: string\n}\n\n/**\n * ScrollBar 컴포넌트 / ScrollBar component\n * 커스텀 스크롤바를 표시합니다.\n * Displays a custom scrollbar.\n * \n * @component\n * @param {ScrollBarProps} props - ScrollBar 컴포넌트의 props / ScrollBar component props\n * @param {React.Ref<HTMLDivElement>} ref - div 요소 ref / div element ref\n * @returns {JSX.Element} ScrollBar 컴포넌트 / ScrollBar component\n */\nconst ScrollBar = React.forwardRef<HTMLDivElement, ScrollBarProps>(\n ({ orientation = \"vertical\", className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={merge(\n \"flex touch-none select-none transition-colors duration-150 ease-out\",\n orientation === \"vertical\" && \"h-full w-2.5 border-l border-l-transparent p-[1px]\",\n orientation === \"horizontal\" && \"h-2.5 flex-col border-t border-t-transparent p-[1px]\",\n className\n )}\n {...props}\n />\n )\n }\n)\n\nScrollBar.displayName = \"ScrollBar\"\n\nexport { ScrollArea, ScrollBar } ","import { useEffect, useState } from \"react\"\n\ninterface ScrollToggleOptions {\n threshold?: number\n showOnMount?: boolean\n smooth?: boolean\n}\n\nexport function useScrollToggle(options: ScrollToggleOptions = {}) {\n const {\n threshold = 400,\n showOnMount = false,\n smooth = true,\n } = options\n\n const [isVisible, setIsVisible] = useState(showOnMount)\n const [mounted, setMounted] = useState(false)\n\n useEffect(() => {\n setMounted(true)\n }, [])\n\n useEffect(() => {\n if (!mounted) return\n\n const toggleVisibility = () => {\n if (typeof window === \"undefined\") return\n setIsVisible(window.pageYOffset > threshold)\n }\n\n toggleVisibility()\n window.addEventListener(\"scroll\", toggleVisibility, { passive: true })\n window.addEventListener(\"resize\", toggleVisibility, { passive: true })\n\n return () => {\n window.removeEventListener(\"scroll\", toggleVisibility)\n window.removeEventListener(\"resize\", toggleVisibility)\n }\n }, [threshold, mounted])\n\n const scrollToTop = () => {\n if (typeof window === \"undefined\") return\n if (smooth) {\n window.scrollTo({ top: 0, behavior: \"smooth\" })\n } else {\n window.scrollTo(0, 0)\n }\n }\n\n return {\n isVisible,\n scrollToTop,\n mounted,\n }\n}\n\n","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\nimport { Icon } from \"./Icon\"\nimport { IconName } from \"../lib/icons\"\nimport { useScrollToggle } from \"../hooks/useScrollToggle\"\n\n/**\n * ScrollToTop 컴포넌트의 props / ScrollToTop component props\n * @typedef {Object} ScrollToTopProps\n * @property {number} [threshold=400] - 표시 임계값 (px, 이 값 이상 스크롤 시 표시) / Display threshold (px, shows when scrolled beyond this value)\n * @property {boolean} [smooth=true] - 부드러운 스크롤 여부 / Smooth scroll\n * @property {string} [className] - 추가 CSS 클래스 / Additional CSS class\n * @property {IconName} [icon='arrowUp'] - 아이콘 이름 / Icon name\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - 버튼 크기 / Button size\n * @property {\"default\" | \"primary\" | \"secondary\" | \"outline\" | \"ghost\"} [variant=\"default\"] - 버튼 스타일 변형 / Button style variant\n * @property {boolean} [showOnMount=false] - 마운트 시 즉시 표시 여부 / Show immediately on mount\n * @extends {React.HTMLAttributes<HTMLButtonElement>}\n */\nexport interface ScrollToTopProps extends React.HTMLAttributes<HTMLButtonElement> {\n threshold?: number\n smooth?: boolean\n className?: string\n icon?: IconName\n size?: \"sm\" | \"md\" | \"lg\"\n variant?: \"default\" | \"primary\" | \"secondary\" | \"outline\" | \"ghost\"\n showOnMount?: boolean\n}\n\n/**\n * ScrollToTop 컴포넌트 / ScrollToTop component\n * \n * 페이지 상단으로 스크롤하는 버튼 컴포넌트입니다.\n * 지정된 임계값 이상 스크롤 시 자동으로 표시됩니다.\n * \n * Button component that scrolls to top of page.\n * Automatically appears when scrolled beyond specified threshold.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <ScrollToTop />\n * \n * @example\n * // 커스텀 설정 / Custom settings\n * <ScrollToTop \n * threshold={500}\n * variant=\"primary\"\n * size=\"lg\"\n * icon=\"arrowUp\"\n * />\n * \n * @param {ScrollToTopProps} props - ScrollToTop 컴포넌트의 props / ScrollToTop component props\n * @returns {JSX.Element} ScrollToTop 컴포넌트 / ScrollToTop component\n */\nconst ScrollToTop = ({ \n className, \n threshold = 400, \n smooth = true, \n icon = \"arrowUp\",\n size = \"md\",\n variant = \"default\",\n showOnMount = false,\n ...props \n}: ScrollToTopProps) => {\n // HUA Motion의 useScrollToggle 훅 사용\n const { isVisible, scrollToTop, mounted: _mounted } = useScrollToggle({\n threshold,\n showOnMount,\n smooth\n })\n\n const sizeClasses = {\n sm: \"w-8 h-8 sm:w-10 sm:h-10\",\n md: \"w-10 h-10 sm:w-12 sm:h-12\", \n lg: \"w-12 h-12 sm:w-14 sm:h-14\"\n }\n\n\n\n const variantClasses = {\n default: \"bg-white/20 backdrop-blur-md border border-white/30 text-white hover:bg-white/30 dark:bg-muted/20 dark:border-border/50 dark:text-foreground dark:hover:bg-muted/30\",\n primary: \"bg-primary/70 backdrop-blur-md border border-primary/40 text-white hover:bg-primary/80 transition-all duration-300 dark:bg-primary/70 dark:border-primary/40 dark:hover:bg-primary/80\",\n secondary: \"bg-muted/80 backdrop-blur-md border border-border text-foreground hover:bg-muted/90 dark:bg-muted/50 dark:border-border dark:text-foreground dark:hover:bg-muted/60\",\n outline: \"border border-white/40 bg-white/15 backdrop-blur-md text-white hover:bg-white/25 dark:border-border/50 dark:bg-muted/15 dark:text-foreground dark:hover:bg-muted/25\",\n ghost: \"bg-transparent hover:bg-white/15 backdrop-blur-md text-white dark:text-foreground dark:hover:bg-muted/25\"\n }\n\n return (\n <button\n onClick={scrollToTop}\n className={merge(\n \"fixed z-[9999] rounded-full transition-all duration-500 ease-in-out\",\n \"flex items-center justify-center\",\n \"focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-offset-1 focus-visible:ring-ring/50\",\n \"transform hover:scale-105 active:scale-95\",\n // 페이드 애니메이션\n isVisible \n ? \"opacity-100 translate-y-0 pointer-events-auto\" \n : \"opacity-0 translate-y-4 pointer-events-none\",\n className,\n sizeClasses[size],\n variantClasses[variant]\n )}\n aria-label=\"Scroll to top\"\n {...props}\n >\n <Icon name={icon} className=\"w-5 h-5\" />\n </button>\n )\n}\n\nexport { ScrollToTop } ","\"use client\"\n\nimport React, { createContext, useContext, useEffect, useState } from \"react\"\n\ntype Theme = \"light\" | \"dark\" | \"system\"\n\n/**\n * ThemeProvider 컴포넌트의 props / ThemeProvider component props\n * @typedef {Object} ThemeProviderProps\n * @property {React.ReactNode} children - 자식 컴포넌트 / Child components\n * @property {\"light\" | \"dark\" | \"system\"} [defaultTheme=\"light\"] - 기본 테마 / Default theme\n * @property {string} [storageKey=\"hua-ui-theme\"] - localStorage 키 / localStorage key\n * @property {boolean} [enableSystem=true] - 시스템 테마 감지 활성화 / Enable system theme detection\n * @property {boolean} [enableTransition=true] - 테마 전환 애니메이션 활성화 / Enable theme transition animation\n */\nexport interface ThemeProviderProps {\n children: React.ReactNode\n defaultTheme?: Theme\n storageKey?: string\n enableSystem?: boolean\n enableTransition?: boolean\n}\n\n/**\n * ThemeProvider의 상태 타입 / ThemeProvider state type\n * @typedef {Object} ThemeProviderState\n * @property {\"light\" | \"dark\" | \"system\"} theme - 현재 테마 / Current theme\n * @property {(theme: \"light\" | \"dark\" | \"system\") => void} setTheme - 테마 설정 함수 / Theme setter function\n * @property {\"light\" | \"dark\"} resolvedTheme - 실제 적용된 테마 (system일 경우 시스템 테마) / Actually applied theme (system theme when system is selected)\n * @property {() => void} toggleTheme - 테마 토글 함수 / Theme toggle function\n */\nexport interface ThemeProviderState {\n theme: Theme\n setTheme: (theme: Theme) => void\n resolvedTheme: \"light\" | \"dark\"\n toggleTheme: () => void\n}\n\nconst initialState: ThemeProviderState = {\n theme: \"system\",\n setTheme: () => null,\n resolvedTheme: \"light\",\n toggleTheme: () => null,\n}\n\nconst ThemeProviderContext = createContext<ThemeProviderState>(initialState)\n\n/**\n * ThemeProvider 컴포넌트 / ThemeProvider component\n * \n * 테마 관리를 위한 Context Provider 컴포넌트입니다.\n * localStorage에 테마를 저장하고, 시스템 테마를 감지할 수 있습니다.\n * useTheme 훅을 통해 테마 상태에 접근할 수 있습니다.\n * \n * Context Provider component for theme management.\n * Saves theme to localStorage and can detect system theme.\n * Access theme state through useTheme hook.\n * \n * @component\n * @example\n * // 기본 사용 / Basic usage\n * <ThemeProvider>\n * <App />\n * </ThemeProvider>\n * \n * @example\n * // 커스텀 설정 / Custom settings\n * <ThemeProvider\n * defaultTheme=\"dark\"\n * storageKey=\"my-app-theme\"\n * enableSystem={true}\n * enableTransition={true}\n * >\n * <App />\n * </ThemeProvider>\n * \n * @param {ThemeProviderProps} props - ThemeProvider 컴포넌트의 props / ThemeProvider component props\n * @returns {JSX.Element} ThemeProvider 컴포넌트 / ThemeProvider component\n */\nexport function ThemeProvider({\n children,\n defaultTheme = \"light\", // system에서 light로 변경\n storageKey = \"hua-ui-theme\",\n enableSystem = true,\n enableTransition = true,\n ...props\n}: ThemeProviderProps): React.ReactElement {\n const [theme, setTheme] = useState<Theme>(defaultTheme)\n const [resolvedTheme, setResolvedTheme] = useState<\"light\" | \"dark\">(\"light\")\n\n useEffect(() => {\n // localStorage에서 테마 가져오기 (클라이언트에서만)\n if (typeof window !== 'undefined') {\n const savedTheme = localStorage.getItem(storageKey) as Theme\n if (savedTheme) {\n setTheme(savedTheme)\n }\n }\n }, [storageKey])\n\n useEffect(() => {\n const root = window.document.documentElement\n\n root.classList.remove(\"light\", \"dark\")\n\n if (theme === \"system\" && enableSystem) {\n const systemTheme = window.matchMedia(\"(prefers-color-scheme: dark)\")\n .matches\n ? \"dark\"\n : \"light\"\n\n root.classList.add(systemTheme)\n setResolvedTheme(systemTheme)\n } else {\n root.classList.add(theme)\n setResolvedTheme(theme as \"light\" | \"dark\")\n }\n\n if (enableTransition) {\n root.classList.add(\"transition-colors\", \"duration-300\")\n }\n }, [theme, enableSystem, enableTransition])\n\n useEffect(() => {\n if (theme === \"system\" && enableSystem) {\n const mediaQuery = window.matchMedia(\"(prefers-color-scheme: dark)\")\n\n const handleChange = () => {\n const systemTheme = mediaQuery.matches ? \"dark\" : \"light\"\n setResolvedTheme(systemTheme)\n document.documentElement.classList.remove(\"light\", \"dark\")\n document.documentElement.classList.add(systemTheme)\n }\n\n mediaQuery.addEventListener(\"change\", handleChange)\n return () => mediaQuery.removeEventListener(\"change\", handleChange)\n }\n }, [theme, enableSystem])\n\n const value = {\n theme,\n setTheme: (theme: Theme) => {\n if (typeof window !== 'undefined') {\n localStorage.setItem(storageKey, theme)\n }\n setTheme(theme)\n },\n resolvedTheme,\n toggleTheme: () => {\n const newTheme = resolvedTheme === \"light\" ? \"dark\" : \"light\"\n if (typeof window !== 'undefined') {\n localStorage.setItem(storageKey, newTheme)\n }\n setTheme(newTheme)\n },\n }\n\n return (\n <ThemeProviderContext.Provider {...props} value={value}>\n {children}\n </ThemeProviderContext.Provider>\n )\n}\n\n/**\n * useTheme 훅 / useTheme hook\n * \n * ThemeProvider의 테마 상태에 접근하는 훅입니다.\n * ThemeProvider 내부에서만 사용할 수 있습니다.\n * \n * Hook to access ThemeProvider's theme state.\n * Can only be used inside ThemeProvider.\n * \n * @example\n * const { theme, setTheme, resolvedTheme, toggleTheme } = useTheme()\n * \n * @returns {ThemeProviderState} 테마 상태와 함수들 / Theme state and functions\n * @throws {Error} ThemeProvider 외부에서 사용 시 에러 발생 / Error when used outside ThemeProvider\n */\nexport const useTheme = () => {\n const context = useContext(ThemeProviderContext)\n\n if (context === undefined)\n throw new Error(\"useTheme must be used within a ThemeProvider\")\n\n return context\n} ","\"use client\"\n\nimport React from \"react\"\nimport { merge } from \"../lib/utils\"\nimport { Icon } from \"./Icon\"\nimport { useTheme } from \"./ThemeProvider\"\n\n/**\n * ThemeToggle 컴포넌트의 props / ThemeToggle component props\n * @typedef {Object} ThemeToggleProps\n * @property {string} [className] - 추가 CSS 클래스 / Additional CSS class\n * @property {\"sm\" | \"md\" | \"lg\"} [size=\"md\"] - Toggle 크기 / Toggle size\n * @property {\"button\" | \"icon\" | \"switch\"} [variant=\"button\"] - Toggle 스타일 변형 / Toggle style variant\n * @property {boolean} [showLabel=false] - 라벨 표시 여부 / Show label\n * @property {Object} [label] - 커스텀 라벨 텍스트 / Custom label text\n * @property {string} [label.light=\"라이트\"] - 라이트 모드 라벨 / Light mode label\n * @property {string} [label.dark=\"다크\"] - 다크 모드 라벨 / Dark mode label\n * @property {string} [label.system=\"시스템\"] - 시스템 모드 라벨 / System mode label\n */\ninterface ThemeToggleProps {\n className?: string\n size?: \"sm\" | \"md\" | \"lg\"\n variant?: \"button\" | \"icon\" | \"switch\"\n showLabel?: boolean\n label?: {\n light?: string\n dark?: string\n system?: string\n }\n}\n\n/**\n * ThemeToggle 컴포넌트 / ThemeToggle component\n * \n * 테마를 전환하는 토글 컴포넌트입니다.\n * ThemeProvider와 함께 사용하며, light/dark/system 테마를 지원합니다.\n * \n * Toggle component for switching themes.\n * Used with ThemeProvider, supports light/dark/system themes.\n * \n * @component\n * @example\n * // 기본 사용 (버튼 스타일) / Basic usage (button style)\n * <ThemeToggle />\n * \n * @example\n * // 아이콘만 표시 / Icon only\n * <ThemeToggle variant=\"icon\" size=\"lg\" />\n * \n * @example\n * // Switch 스타일 / Switch style\n * <ThemeToggle variant=\"switch\" />\n * \n * @example\n * // 라벨과 함께 / With label\n * <ThemeToggle \n * showLabel\n * label={{ light: \"밝게\", dark: \"어둡게\" }}\n * />\n * \n * @param {ThemeToggleProps} props - ThemeToggle 컴포넌트의 props / ThemeToggle component props\n * @returns {JSX.Element} ThemeToggle 컴포넌트 / ThemeToggle component\n */\nexport function ThemeToggle({\n className,\n size = \"md\",\n variant = \"button\",\n showLabel = false,\n label = {\n light: \"라이트\",\n dark: \"다크\",\n system: \"시스템\"\n },\n ...props\n}: ThemeToggleProps) {\n const { theme, setTheme, resolvedTheme } = useTheme()\n\n const sizeClasses = {\n sm: \"h-10 w-10\", // 40px - 더 넉넉한 크기\n md: \"h-12 w-12\", // 48px - 더 넉넉한 크기\n lg: \"h-14 w-14\" // 56px - 더 넉넉한 크기\n }\n\n const iconSizes = {\n sm: 16,\n md: 20,\n lg: 24\n }\n\n const renderIcon = () => {\n if (theme === \"system\") {\n return <Icon name=\"monitor\" size={iconSizes[size]} />\n }\n return resolvedTheme === \"dark\" ? (\n <Icon name=\"moon\" size={iconSizes[size]} />\n ) : (\n <Icon name=\"sun\" size={iconSizes[size]} className=\"text-amber-600\" />\n )\n }\n\n const handleClick = () => {\n if (theme === \"system\") {\n setTheme(\"light\")\n } else if (theme === \"light\") {\n setTheme(\"dark\")\n } else if (theme === \"dark\") {\n setTheme(\"light\") // dark → light로 직접 전환\n }\n }\n\n if (variant === \"icon\") {\n return (\n <button\n onClick={handleClick}\n className={merge(\n \"inline-flex items-center justify-center rounded-lg transition-all duration-300 hover:bg-muted focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring/50 focus-visible:ring-offset-2\",\n sizeClasses[size],\n className\n )}\n {...props}\n >\n <div className=\"relative flex items-center justify-center w-full h-full\">\n <div\n className={merge(\n \"absolute inset-0 flex items-center justify-center transition-all duration-300\",\n resolvedTheme === \"dark\" ? \"rotate-0 opacity-100\" : \"rotate-90 opacity-0\"\n )}\n >\n <Icon name=\"moon\" size={iconSizes[size]} className=\"text-indigo-500\" />\n </div>\n <div\n className={merge(\n \"absolute inset-0 flex items-center justify-center transition-all duration-300\",\n resolvedTheme === \"dark\" ? \"rotate-90 opacity-0\" : \"rotate-0 opacity-100\"\n )}\n >\n <Icon name=\"sun\" size={iconSizes[size]} className=\"text-amber-600 dark:text-yellow-500\" />\n </div>\n </div>\n </button>\n )\n }\n\n if (variant === \"switch\") {\n return (\n <button\n onClick={handleClick}\n className={merge(\n \"relative inline-flex h-6 w-11 items-center rounded-full transition-colors duration-300 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring/50 focus-visible:ring-offset-2\",\n resolvedTheme === \"dark\" \n ? \"bg-primary\"\n : \"bg-muted\",\n className\n )}\n {...props}\n >\n <span\n className={merge(\n \"inline-block h-4 w-4 transform rounded-full bg-white transition-transform duration-300 shadow-lg\",\n resolvedTheme === \"dark\" ? \"translate-x-6\" : \"translate-x-1\"\n )}\n />\n <div className=\"absolute inset-0 flex items-center justify-between px-1.5\">\n <Icon name=\"sun\" size={12} className=\"text-amber-600 dark:text-yellow-500 opacity-0\" />\n <Icon name=\"moon\" size={12} className=\"text-indigo-500 opacity-0\" />\n </div>\n </button>\n )\n }\n\n return (\n <button\n onClick={handleClick}\n className={merge(\n \"inline-flex items-center gap-3 rounded-lg px-4 py-3 text-sm font-medium transition-all duration-300 hover:bg-muted focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring/50 focus-visible:ring-offset-2\", // 12px 간격, 16px, 12px 패딩\n className\n )}\n {...props}\n >\n {renderIcon()}\n {showLabel && (\n <span className=\"text-foreground\">\n {theme === \"system\" ? label.system : theme === \"dark\" ? label.dark : label.light}\n </span>\n )}\n </button>\n )\n} ","/**\n * Icon Names - 자동완성 지원\n * \n * 이 파일은 TypeScript 자동완성을 위한 아이콘 이름 목록입니다.\n * 실제 아이콘은 icons.ts와 PROJECT_ICONS에서 관리됩니다.\n */\n\nimport type { IconName } from './icons'\nimport { PROJECT_ICONS } from './icon-providers'\n\n/**\n * PROJECT_ICONS에 정의된 모든 아이콘 이름\n */\nexport type ProjectIconName = keyof typeof PROJECT_ICONS\n\n/**\n * 사용 가능한 모든 아이콘 이름 (icons.ts + PROJECT_ICONS)\n */\nexport type AllIconName = IconName | ProjectIconName\n\n/**\n * 아이콘 이름 목록 (자동완성용)\n */\nexport const iconNames = [\n // Navigation\n 'home', 'menu', 'close', 'search', 'settings', 'user', 'bell',\n 'arrowLeft', 'arrowRight', 'arrowUp', 'arrowDown',\n 'chevronLeft', 'chevronRight', 'chevronUp', 'chevronDown',\n \n // Actions\n 'add', 'edit', 'delete', 'remove', 'check', 'share', 'download', 'upload',\n 'save', 'copy', 'refresh', 'search',\n \n // Status & Feedback\n 'loader', 'success', 'error', 'warning', 'info', 'alertCircle',\n 'heart', 'star', 'bookmark',\n \n // User & Auth\n 'logIn', 'logOut', 'shield', 'key', 'lock', 'unlock',\n 'eye', 'eyeOff', 'users', 'userPlus',\n \n // Data & Analytics\n 'chart', 'barChart', 'pieChart', 'trendingUp', 'trendingDown',\n 'activity', 'database', 'zap', 'circle', 'dollarSign', 'dollar', 'currency',\n \n // Files & Content\n 'fileText', 'file', 'folder', 'book', 'bookOpen',\n 'image', 'video', 'camera',\n \n // Communication\n 'message', 'messageSquare', 'phone', 'mail', 'send',\n \n // Media\n 'play', 'pause', 'mic', 'headphones',\n \n // Emotions\n 'smile', 'frown', 'meh', 'laugh', 'angry',\n 'thumbsUp', 'thumbsDown',\n \n // Time & Date\n 'clock', 'timer', 'calendar', 'calendarDays',\n \n // UI & Theme\n 'monitor', 'sun', 'moon', 'sparkle', 'sparkles', 'lightbulb', 'brain',\n\n // Device & Platform\n 'globe', 'deviceMobile', 'smartphone', 'floppyDisk',\n \n // Navigation Extended\n 'externalLink', 'link', 'moreHorizontal', 'moreVertical',\n\n // Additional\n 'rocket',\n\n // Connectivity & Misc\n 'ticket', 'clipboard', 'wifi', 'wifiOff', 'cpu', 'mask',\n] as const\n\n/**\n * 프로바이더별 아이콘 이름 매핑 (참고용)\n * \n * @example\n * // Lucide 아이콘 사용\n * <Icon name=\"home\" provider=\"lucide\" /> // Lucide: Home\n * \n * // Phosphor 아이콘 사용\n * <Icon name=\"home\" provider=\"phosphor\" /> // Phosphor: House\n * \n * // Iconsax 아이콘 사용 (requires '@hua-labs/ui/iconsax' import)\n * <Icon name=\"home\" provider=\"iconsax\" /> // Iconsax: Home2\n */\nexport const iconProviderMapping: Record<string, {\n lucide: string\n phosphor: string\n iconsax?: string\n}> = PROJECT_ICONS\n\n/**\n * 아이콘 이름이 유효한지 확인\n */\nexport function isValidIconName(name: string): name is AllIconName {\n return name in PROJECT_ICONS || (iconNames as readonly string[]).includes(name)\n}\n\n/**\n * 프로바이더별 아이콘 이름 가져오기\n */\nexport function getIconNameForProvider(\n iconName: string,\n provider: 'lucide' | 'phosphor' | 'iconsax'\n): string | null {\n const mapping = PROJECT_ICONS[iconName as keyof typeof PROJECT_ICONS]\n if (!mapping) return null\n\n return (mapping as Record<string, string>)[provider] || null\n}\n\n\n","/**\n * HUA UI 공통 색상 시스템\n * 중앙화된 색상 팔레트와 스타일 생성 유틸리티\n */\n\nimport type { Color } from \"../types/common\";\nimport { merge } from \"../utils\";\n\n/**\n * Tailwind CSS 색상 클래스 매핑\n * 각 색상의 50-900 단계를 정의합니다.\n */\nconst colorShades = {\n 50: \"50\",\n 100: \"100\",\n 200: \"200\",\n 300: \"300\",\n 400: \"400\",\n 500: \"500\",\n 600: \"600\",\n 700: \"700\",\n 800: \"800\",\n 900: \"900\",\n} as const;\n\ntype ColorShade = keyof typeof colorShades;\n\n/**\n * 색상별 클래스 생성 헬퍼\n */\nfunction colorClass(color: Color, shade: ColorShade, prefix: string = \"\"): string {\n return `${prefix}${color}-${colorShades[shade]}`;\n}\n\n/**\n * 다크 모드 지원 클래스 생성\n */\nfunction withDarkMode(lightClass: string, darkClass: string): string {\n return `${lightClass} dark:${darkClass}`;\n}\n\n/**\n * 색상 스타일 설정 인터페이스\n */\nexport interface ColorStyleConfig {\n /** 기본 variant 스타일 */\n default?: {\n border?: { light: ColorShade; dark?: ColorShade };\n background?: { light: ColorShade; dark?: ColorShade; opacity?: string };\n };\n /** 그라데이션 variant 스타일 */\n gradient?: {\n from?: ColorShade;\n to?: ColorShade;\n border?: { light: ColorShade; dark?: ColorShade };\n };\n /** 아웃라인 variant 스타일 */\n outline?: {\n border?: { light: ColorShade; dark?: ColorShade };\n background?: string;\n text?: { light: ColorShade; dark?: ColorShade };\n };\n /** Elevated variant 스타일 */\n elevated?: {\n border?: { light: ColorShade; dark?: ColorShade };\n background?: { light: string; dark: string };\n shadow?: string;\n };\n /** 아이콘 스타일 */\n icon?: {\n background?: { light: ColorShade; dark?: ColorShade; opacity?: string };\n text?: { light: ColorShade; dark?: ColorShade };\n };\n /** 배지 스타일 */\n badge?: {\n background?: { light: ColorShade; dark?: ColorShade; opacity?: string };\n text?: { light: ColorShade; dark?: ColorShade };\n };\n}\n\n/**\n * 생성된 색상 스타일 인터페이스\n */\nexport interface ColorStyles {\n default: string;\n gradient: string;\n outline: string;\n elevated: string;\n icon: string;\n badge: string;\n}\n\n/**\n * 기본 색상 스타일 설정\n * 각 색상에 대한 기본 스타일 템플릿\n */\nconst defaultColorConfig: Omit<ColorStyleConfig, \"gradient\"> = {\n default: {\n border: { light: 200, dark: 700 },\n background: { light: 50, dark: 900, opacity: \"50\" },\n },\n outline: {\n border: { light: 300, dark: 600 },\n background: \"transparent\",\n text: { light: 600, dark: 400 },\n },\n elevated: {\n border: { light: 200, dark: 700 },\n background: { light: \"white\", dark: \"gray-800\" },\n shadow: \"lg\",\n },\n icon: {\n background: { light: 100, dark: 900, opacity: \"30\" },\n text: { light: 600, dark: 400 },\n },\n badge: {\n background: { light: 50, dark: 900, opacity: \"30\" },\n text: { light: 700, dark: 300 },\n },\n};\n\n/**\n * 그라데이션 스타일 설정\n */\nconst gradientConfig: ColorStyleConfig[\"gradient\"] = {\n from: 500,\n to: 600,\n border: { light: 400, dark: 500 },\n};\n\n/**\n * 색상 스타일 생성 함수\n * \n * @param color - 색상 이름\n * @param config - 커스텀 스타일 설정 (선택사항)\n * @returns 생성된 색상 스타일 객체\n * \n * @example\n * ```tsx\n * const styles = createColorStyles(\"blue\");\n * // styles.default, styles.gradient, styles.outline 등 사용 가능\n * ```\n */\nexport function createColorStyles(\n color: Color,\n config?: Partial<ColorStyleConfig>\n): ColorStyles {\n const finalConfig: ColorStyleConfig = {\n default: config?.default || defaultColorConfig.default,\n gradient: config?.gradient || gradientConfig,\n outline: config?.outline || defaultColorConfig.outline,\n elevated: config?.elevated || defaultColorConfig.elevated,\n icon: config?.icon || defaultColorConfig.icon,\n badge: config?.badge || defaultColorConfig.badge,\n };\n\n // Default variant\n const defaultBorder = finalConfig.default?.border\n ? withDarkMode(\n `border-${colorClass(color, finalConfig.default.border.light)}`,\n `border-${colorClass(color, finalConfig.default.border.dark || finalConfig.default.border.light)}`\n )\n : \"\";\n \n const defaultBg = finalConfig.default?.background\n ? withDarkMode(\n `bg-${colorClass(color, finalConfig.default.background.light)}${finalConfig.default.background.opacity ? `/${finalConfig.default.background.opacity}` : \"\"}`,\n `bg-${colorClass(color, finalConfig.default.background.dark || finalConfig.default.background.light)}${finalConfig.default.background.opacity ? `/${finalConfig.default.background.opacity}` : \"\"}`\n )\n : \"\";\n\n const defaultStyle = merge(defaultBorder, defaultBg);\n\n // Gradient variant\n const gradientFrom = finalConfig.gradient?.from\n ? `from-${colorClass(color, finalConfig.gradient.from)}`\n : \"\";\n const gradientTo = finalConfig.gradient?.to\n ? `to-${colorClass(color, finalConfig.gradient.to)}`\n : \"\";\n const gradientBorder = finalConfig.gradient?.border\n ? withDarkMode(\n `border-${colorClass(color, finalConfig.gradient.border.light)}`,\n `border-${colorClass(color, finalConfig.gradient.border.dark || finalConfig.gradient.border.light)}`\n )\n : \"\";\n \n const gradientStyle = merge(\n \"bg-gradient-to-br\",\n gradientFrom,\n gradientTo,\n gradientBorder\n );\n\n // Outline variant\n const outlineBorder = finalConfig.outline?.border\n ? `border-2 ${withDarkMode(\n `border-${colorClass(color, finalConfig.outline.border.light)}`,\n `border-${colorClass(color, finalConfig.outline.border.dark || finalConfig.outline.border.light)}`\n )}`\n : \"\";\n const outlineBg = finalConfig.outline?.background || \"bg-transparent\";\n const outlineText = finalConfig.outline?.text\n ? withDarkMode(\n `text-${colorClass(color, finalConfig.outline.text.light)}`,\n `text-${colorClass(color, finalConfig.outline.text.dark || finalConfig.outline.text.light)}`\n )\n : \"\";\n \n const outlineStyle = merge(outlineBorder, outlineBg, outlineText);\n\n // Elevated variant\n const elevatedBorder = finalConfig.elevated?.border\n ? withDarkMode(\n `border-${colorClass(color, finalConfig.elevated.border.light)}`,\n `border-${colorClass(color, finalConfig.elevated.border.dark || finalConfig.elevated.border.light)}`\n )\n : \"\";\n const elevatedBg = finalConfig.elevated?.background\n ? withDarkMode(\n `bg-${finalConfig.elevated.background.light}`,\n `bg-${finalConfig.elevated.background.dark}`\n )\n : \"\";\n const elevatedShadow = finalConfig.elevated?.shadow\n ? `shadow-${finalConfig.elevated.shadow}`\n : \"\";\n \n const elevatedStyle = merge(elevatedBorder, elevatedBg, elevatedShadow);\n\n // Icon style\n const iconBg = finalConfig.icon?.background\n ? withDarkMode(\n `bg-${colorClass(color, finalConfig.icon.background.light)}${finalConfig.icon.background.opacity ? `/${finalConfig.icon.background.opacity}` : \"\"}`,\n `bg-${colorClass(color, finalConfig.icon.background.dark || finalConfig.icon.background.light)}${finalConfig.icon.background.opacity ? `/${finalConfig.icon.background.opacity}` : \"\"}`\n )\n : \"\";\n const iconText = finalConfig.icon?.text\n ? withDarkMode(\n `text-${colorClass(color, finalConfig.icon.text.light)}`,\n `text-${colorClass(color, finalConfig.icon.text.dark || finalConfig.icon.text.light)}`\n )\n : \"\";\n \n const iconStyle = merge(iconBg, iconText);\n\n // Badge style\n const badgeBg = finalConfig.badge?.background\n ? withDarkMode(\n `bg-${colorClass(color, finalConfig.badge.background.light)}${finalConfig.badge.background.opacity ? `/${finalConfig.badge.background.opacity}` : \"\"}`,\n `bg-${colorClass(color, finalConfig.badge.background.dark || finalConfig.badge.background.light)}${finalConfig.badge.background.opacity ? `/${finalConfig.badge.background.opacity}` : \"\"}`\n )\n : \"\";\n const badgeText = finalConfig.badge?.text\n ? withDarkMode(\n `text-${colorClass(color, finalConfig.badge.text.light)}`,\n `text-${colorClass(color, finalConfig.badge.text.dark || finalConfig.badge.text.light)}`\n )\n : \"\";\n \n const badgeStyle = merge(badgeBg, badgeText);\n\n return {\n default: defaultStyle,\n gradient: gradientStyle,\n outline: outlineStyle,\n elevated: elevatedStyle,\n icon: iconStyle,\n badge: badgeStyle,\n };\n}\n\n/**\n * 색상 스타일 캐시\n * 동일한 색상과 설정에 대해 재사용하여 성능 최적화\n */\nconst colorStylesCache = new Map<string, ColorStyles>();\n\n/**\n * 메모이제이션된 색상 스타일 생성 함수\n * \n * @param color - 색상 이름\n * @param config - 커스텀 스타일 설정 (선택사항)\n * @returns 생성된 색상 스타일 객체\n */\nexport function useColorStyles(\n color: Color,\n config?: Partial<ColorStyleConfig>\n): ColorStyles {\n const cacheKey = `${color}-${JSON.stringify(config || {})}`;\n \n if (!colorStylesCache.has(cacheKey)) {\n colorStylesCache.set(cacheKey, createColorStyles(color, config));\n }\n \n return colorStylesCache.get(cacheKey)!;\n}\n\n","/**\n * HUA UI 공통 Variant 시스템\n * 컴포넌트 variant 스타일 생성 유틸리티\n */\n\nimport type { ExtendedVariant, Size } from \"../types/common\";\nimport type { ColorStyles } from \"./colors\";\nimport { merge } from \"../utils\";\n\n/**\n * Variant 스타일 생성 함수\n * \n * @param variant - Variant 타입\n * @param colorStyles - 색상 스타일 객체\n * @returns 생성된 variant 클래스 문자열\n * \n * @example\n * ```tsx\n * const colorStyles = useColorStyles(\"blue\");\n * const variantClass = createVariantStyles(\"elevated\", colorStyles);\n * ```\n */\nexport function createVariantStyles(\n variant: ExtendedVariant,\n colorStyles: ColorStyles\n): string {\n const baseClasses = \"rounded-2xl border transition-all duration-200\";\n \n switch (variant) {\n case \"default\":\n return merge(baseClasses, colorStyles.default);\n \n case \"gradient\":\n return merge(baseClasses, \"text-white\", colorStyles.gradient);\n \n case \"outline\":\n return merge(baseClasses, colorStyles.outline);\n \n case \"elevated\":\n return merge(baseClasses, colorStyles.elevated);\n \n default:\n return baseClasses;\n }\n}\n\n/**\n * Size 스타일 설정 인터페이스\n */\nexport interface SizeStyles {\n container: string;\n icon: string;\n iconContainer: string;\n text: string;\n title: string;\n description: string;\n}\n\n/**\n * Size 스타일 생성 함수\n * \n * @param size - 크기 타입\n * @returns 생성된 size 스타일 객체\n * \n * @example\n * ```tsx\n * const sizeStyles = createSizeStyles(\"md\");\n * // sizeStyles.container, sizeStyles.icon 등 사용 가능\n * ```\n */\nexport function createSizeStyles(size: Size = \"md\"): SizeStyles {\n const sizeMap: Record<Size, SizeStyles> = {\n sm: {\n container: \"p-4\",\n icon: \"h-4 w-4\",\n iconContainer: \"w-8 h-8\",\n text: \"text-xs\",\n title: \"text-xs\",\n description: \"text-xs\",\n },\n md: {\n container: \"p-6\",\n icon: \"h-6 w-6\",\n iconContainer: \"w-12 h-12\",\n text: \"text-base\",\n title: \"text-sm\",\n description: \"text-sm\",\n },\n lg: {\n container: \"p-8\",\n icon: \"h-8 w-8\",\n iconContainer: \"w-16 h-16\",\n text: \"text-lg\",\n title: \"text-base\",\n description: \"text-base\",\n },\n xl: {\n container: \"p-10\",\n icon: \"h-10 w-10\",\n iconContainer: \"w-20 h-20\",\n text: \"text-xl\",\n title: \"text-lg\",\n description: \"text-lg\",\n },\n };\n \n return sizeMap[size];\n}\n\n/**\n * Rounded 스타일 타입\n */\nexport type Rounded = \"sm\" | \"md\" | \"lg\" | \"xl\" | \"full\" | \"none\";\n\n/**\n * Rounded 스타일 생성 함수\n * \n * @param rounded - Rounded 타입\n * @returns 생성된 rounded 클래스 문자열\n */\nexport function createRoundedStyles(rounded: Rounded = \"md\"): string {\n const roundedMap: Record<Rounded, string> = {\n sm: \"rounded\",\n md: \"rounded-md\",\n lg: \"rounded-lg\",\n xl: \"rounded-xl\",\n full: \"rounded-full\",\n none: \"rounded-none\",\n };\n \n return roundedMap[rounded];\n}\n\n/**\n * Shadow 스타일 타입\n */\nexport type Shadow = \"none\" | \"sm\" | \"md\" | \"lg\" | \"xl\" | \"2xl\";\n\n/**\n * Shadow 스타일 생성 함수\n * \n * @param shadow - Shadow 타입\n * @returns 생성된 shadow 클래스 문자열\n */\nexport function createShadowStyles(shadow: Shadow = \"md\"): string {\n if (shadow === \"none\") return \"\";\n \n return `shadow-${shadow}`;\n}\n\n/**\n * Hover 효과 타입\n */\nexport type HoverEffect = \"scale\" | \"glow\" | \"slide\" | \"springy\" | \"none\";\n\n/**\n * HUA-UI 스프링 이징\n * 공 튕기듯 아주 미세한 반동 - cubic-bezier(0.34, 1.56, 0.64, 1)\n */\nexport const HUA_SPRING_EASING = \"cubic-bezier(0.34, 1.56, 0.64, 1)\";\n\n/**\n * Hover 효과 스타일 생성 함수\n *\n * @param hover - Hover 효과 타입\n * @param reducedMotion - 애니메이션 축소 설정 여부\n * @returns 생성된 hover 클래스 문자열\n *\n * @description\n * HUA-UI 시그니처: \"스륵 부드럽고 아주 미세하게 쫀득\"\n * - 스프링 이징으로 미세한 반동 효과\n * - 1.5% 스케일 변화로 자연스러운 피드백\n */\nexport function createHoverStyles(\n hover: HoverEffect = \"springy\",\n reducedMotion: boolean = false\n): string {\n if (reducedMotion || hover === \"none\") return \"\";\n\n // 스프링 이징 스타일 (Tailwind arbitrary value)\n // HUA-UI 시그니처: 아주 미세한 스프링 반동 (쫀득한 느낌)\n const springTransition = \"[transition:transform_180ms_cubic-bezier(0.34,1.56,0.64,1),box-shadow_200ms_ease-out]\";\n\n const hoverMap: Record<HoverEffect, string> = {\n // HUA-UI 시그니처 스프링 효과 (기본값)\n // scale 1.5% + 미세한 shadow 추가로 입체감\n springy: `hover:scale-[1.015] hover:shadow-md active:scale-[0.985] ${springTransition} transform-gpu`,\n // scale만 (스프링 없음)\n scale: \"hover:scale-[1.015] active:scale-[0.985] transition-transform duration-150 ease-out transform-gpu\",\n // 글로우 효과 - shadow 강화\n glow: \"hover:shadow-lg hover:shadow-primary/25 transition-shadow duration-200\",\n // 슬라이드 효과 - 위로 살짝 뜨는 느낌 + shadow\n slide: `hover:-translate-y-0.5 hover:shadow-md ${springTransition} transform-gpu`,\n none: \"\",\n };\n\n return hoverMap[hover];\n}\n\n","/**\n * HUA UI 스타일 유틸리티 함수\n * 다크 모드, 그라데이션 등 공통 스타일 유틸리티\n */\n\nimport { merge } from \"../utils\";\n\n/**\n * 다크 모드 지원 클래스 생성\n * \n * @param lightClass - 라이트 모드 클래스\n * @param darkClass - 다크 모드 클래스\n * @returns 다크 모드 지원 클래스 문자열\n * \n * @example\n * ```tsx\n * withDarkMode(\"bg-white\", \"bg-gray-900\")\n * // \"bg-white dark:bg-gray-900\"\n * ```\n */\nexport function withDarkMode(lightClass: string, darkClass: string): string {\n return `${lightClass} dark:${darkClass}`;\n}\n\n/**\n * 그라데이션 클래스 생성\n * \n * @param from - 시작 색상\n * @param to - 끝 색상\n * @param direction - 그라데이션 방향 (기본값: \"to-r\")\n * @returns 그라데이션 클래스 문자열\n * \n * @example\n * ```tsx\n * createGradient(\"blue-500\", \"purple-600\")\n * // \"bg-gradient-to-r from-blue-500 to-purple-600\"\n * ```\n */\nexport function createGradient(\n from: string,\n to: string,\n direction: \"to-r\" | \"to-l\" | \"to-b\" | \"to-t\" | \"to-br\" | \"to-bl\" | \"to-tr\" | \"to-tl\" = \"to-r\"\n): string {\n return merge(`bg-gradient-${direction}`, `from-${from}`, `to-${to}`);\n}\n\n/**\n * 불투명도가 포함된 색상 클래스 생성\n * \n * @param color - 색상 클래스 (예: \"blue-500\")\n * @param opacity - 불투명도 (0-100)\n * @returns 불투명도가 포함된 색상 클래스\n * \n * @example\n * ```tsx\n * withOpacity(\"blue-500\", 50)\n * // \"blue-500/50\"\n * ```\n */\nexport function withOpacity(color: string, opacity: number): string {\n return `${color}/${opacity}`;\n}\n\n/**\n * 텍스트 색상이 그라데이션 variant일 때 흰색으로 변경하는지 확인\n * \n * @param variant - Variant 타입\n * @returns 텍스트가 흰색이어야 하는지 여부\n */\nexport function isTextWhite(variant: string): boolean {\n return variant === \"gradient\" || variant === \"solid\";\n}\n\n/**\n * 그라데이션 variant인지 확인\n * \n * @param variant - Variant 타입\n * @returns 그라데이션 variant인지 여부\n */\nexport function isGradientVariant(variant: string): boolean {\n return variant === \"gradient\";\n}\n\n/**\n * 반응형 클래스 생성 헬퍼\n * \n * @param base - 기본 클래스\n * @param sm - 작은 화면 클래스\n * @param md - 중간 화면 클래스\n * @param lg - 큰 화면 클래스\n * @param xl - 매우 큰 화면 클래스\n * @returns 반응형 클래스 문자열\n * \n * @example\n * ```tsx\n * responsive(\"text-sm\", \"md:text-base\", \"lg:text-lg\")\n * ```\n */\nexport function responsive(\n base: string,\n sm?: string,\n md?: string,\n lg?: string,\n xl?: string\n): string {\n return merge(\n base,\n sm && `sm:${sm}`,\n md && `md:${md}`,\n lg && `lg:${lg}`,\n xl && `xl:${xl}`\n );\n}\n\n/**\n * 조건부 클래스 적용\n * \n * @param condition - 조건\n * @param trueClass - 조건이 true일 때 적용할 클래스\n * @param falseClass - 조건이 false일 때 적용할 클래스 (선택사항)\n * @returns 조건에 따라 선택된 클래스\n */\nexport function conditionalClass(\n condition: boolean,\n trueClass: string,\n falseClass?: string\n): string {\n return condition ? trueClass : (falseClass || \"\");\n}\n\n","/**\n * HUA-UI 마이크로 모션 프리셋\n *\n * 핵심 철학: \"스륵 부드럽고 아주 조금 쫀득\"\n * - 스륵: 자연스럽고 부드러운 시작/끝\n * - 쫀득: 약간의 오버슈트로 생동감\n */\n\nimport type { MicroMotionPreset, SpringConfig, MicroMotionConfig } from './types'\n\n/**\n * 스프링 물리 프리셋\n * CSS cubic-bezier로 근사화된 값들\n */\nexport const SPRING_CONFIGS: Record<MicroMotionPreset, SpringConfig> = {\n subtle: {\n stiffness: 400,\n damping: 30,\n mass: 1,\n },\n soft: {\n stiffness: 300,\n damping: 25,\n mass: 1,\n },\n springy: {\n stiffness: 350,\n damping: 20,\n mass: 0.8,\n },\n bouncy: {\n stiffness: 400,\n damping: 15,\n mass: 0.7,\n },\n snappy: {\n stiffness: 500,\n damping: 35,\n mass: 0.5,\n },\n}\n\n/**\n * CSS easing 함수 (스프링 근사)\n * 각 프리셋에 맞는 cubic-bezier 값\n */\nexport const EASING_FUNCTIONS: Record<MicroMotionPreset, string> = {\n // 미세한 반응 - 거의 linear에 가까움\n subtle: 'cubic-bezier(0.25, 0.1, 0.25, 1)',\n // 부드러운 ease-out\n soft: 'cubic-bezier(0.22, 1, 0.36, 1)',\n // 약간의 오버슈트 (쫀득!)\n springy: 'cubic-bezier(0.34, 1.56, 0.64, 1)',\n // 더 큰 오버슈트\n bouncy: 'cubic-bezier(0.68, -0.55, 0.265, 1.55)',\n // 빠르고 날카로운\n snappy: 'cubic-bezier(0.19, 1, 0.22, 1)',\n}\n\n/**\n * 기본 지속시간 (ms)\n */\nexport const DURATIONS: Record<MicroMotionPreset, number> = {\n subtle: 150,\n soft: 250,\n springy: 300,\n bouncy: 400,\n snappy: 180,\n}\n\n/**\n * HUA-UI 기본 마이크로 모션 설정\n * \"스륵 쫀득\"의 정수 - 아주 미세하게!\n */\nexport const HUA_DEFAULT_MOTION: MicroMotionConfig = {\n preset: 'springy',\n duration: 180,\n scale: 0.008, // 0.8% 스케일 변화 (아주아주 미세)\n translateY: -0.5, // 0.5px 위로 살짝\n}\n\n/**\n * 컴포넌트별 기본 모션 설정\n * 아주 미세한 반동으로 생동감 있게\n */\nexport const COMPONENT_MOTION_DEFAULTS = {\n button: {\n preset: 'springy' as MicroMotionPreset,\n duration: 180,\n scale: 0.008, // 0.8% - 아주아주 미세\n translateY: -0.5, // 0.5px\n },\n card: {\n preset: 'soft' as MicroMotionPreset,\n duration: 220,\n scale: 0.005, // 0.5%\n translateY: -1,\n },\n menuItem: {\n preset: 'subtle' as MicroMotionPreset,\n duration: 150,\n translateX: 1, // 1px\n },\n modal: {\n preset: 'springy' as MicroMotionPreset,\n duration: 250,\n scale: 0.01,\n },\n dropdown: {\n preset: 'soft' as MicroMotionPreset,\n duration: 180,\n translateY: -2,\n },\n tooltip: {\n preset: 'snappy' as MicroMotionPreset,\n duration: 120,\n scale: 0.02,\n },\n checkbox: {\n preset: 'springy' as MicroMotionPreset,\n duration: 200,\n scale: 0.03, // 체크박스는 조금 더\n },\n switch: {\n preset: 'springy' as MicroMotionPreset,\n duration: 180,\n },\n}\n\n/**\n * CSS 변수로 사용할 수 있는 기본값들\n * 미세한 스프링 반동 느낌\n */\nexport const CSS_MOTION_VARS = {\n '--hua-motion-duration': '180ms',\n '--hua-motion-easing': EASING_FUNCTIONS.springy,\n '--hua-motion-scale-hover': '1.008', // 0.8% 확대 (아주아주 미세)\n '--hua-motion-scale-active': '0.992', // 0.8% 축소\n '--hua-motion-translate-y': '-0.5px',\n} as const\n","'use client'\n\nimport { useState, useCallback, useMemo, useRef, useEffect } from 'react'\nimport type {\n MicroMotionConfig,\n MicroMotionState,\n MicroMotionStyle,\n MicroMotionPreset,\n} from './types'\nimport { EASING_FUNCTIONS, DURATIONS, HUA_DEFAULT_MOTION } from './presets'\n\nexport interface UseMicroMotionOptions extends MicroMotionConfig {\n /** hover 시 모션 활성화 */\n enableHover?: boolean\n /** press 시 모션 활성화 */\n enablePress?: boolean\n /** focus 시 모션 활성화 */\n enableFocus?: boolean\n}\n\nexport interface UseMicroMotionReturn {\n /** 모션 상태 */\n state: MicroMotionState\n /** 적용할 스타일 */\n style: MicroMotionStyle\n /** 이벤트 핸들러들 */\n handlers: {\n onMouseEnter: () => void\n onMouseLeave: () => void\n onMouseDown: () => void\n onMouseUp: () => void\n onFocus: () => void\n onBlur: () => void\n }\n /** CSS 클래스 (Tailwind 호환) */\n className: string\n}\n\n/**\n * HUA-UI 마이크로 모션 훅\n *\n * \"스륵 부드럽고 쫀득\" 모션을 적용하는 훅\n *\n * @example\n * ```tsx\n * const { handlers, style, className } = useMicroMotion({ preset: 'springy' })\n *\n * return (\n * <button\n * {...handlers}\n * style={style}\n * className={className}\n * >\n * Click me\n * </button>\n * )\n * ```\n */\nexport function useMicroMotion(\n options: UseMicroMotionOptions = {}\n): UseMicroMotionReturn {\n const {\n preset = HUA_DEFAULT_MOTION.preset || 'springy',\n duration = DURATIONS[preset as MicroMotionPreset] || 200,\n delay = 0,\n scale = HUA_DEFAULT_MOTION.scale || 0.02,\n translateY = HUA_DEFAULT_MOTION.translateY || 0,\n translateX = 0,\n rotate = 0,\n disabled = false,\n enableHover = true,\n enablePress = true,\n enableFocus = false,\n } = options\n\n const [state, setState] = useState<MicroMotionState>({\n isHovered: false,\n isPressed: false,\n isFocused: false,\n isAnimating: false,\n })\n\n const animationTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n // 애니메이션 상태 업데이트\n const setAnimating = useCallback((isAnimating: boolean) => {\n if (animationTimeoutRef.current) {\n clearTimeout(animationTimeoutRef.current)\n }\n\n if (isAnimating) {\n setState(prev => ({ ...prev, isAnimating: true }))\n animationTimeoutRef.current = setTimeout(() => {\n setState(prev => ({ ...prev, isAnimating: false }))\n }, duration + delay)\n } else {\n setState(prev => ({ ...prev, isAnimating: false }))\n }\n }, [duration, delay])\n\n // 이벤트 핸들러들\n const handlers = useMemo(() => ({\n onMouseEnter: () => {\n if (disabled || !enableHover) return\n setState(prev => ({ ...prev, isHovered: true }))\n setAnimating(true)\n },\n onMouseLeave: () => {\n if (disabled) return\n setState(prev => ({ ...prev, isHovered: false, isPressed: false }))\n setAnimating(true)\n },\n onMouseDown: () => {\n if (disabled || !enablePress) return\n setState(prev => ({ ...prev, isPressed: true }))\n setAnimating(true)\n },\n onMouseUp: () => {\n if (disabled) return\n setState(prev => ({ ...prev, isPressed: false }))\n setAnimating(true)\n },\n onFocus: () => {\n if (disabled || !enableFocus) return\n setState(prev => ({ ...prev, isFocused: true }))\n setAnimating(true)\n },\n onBlur: () => {\n if (disabled) return\n setState(prev => ({ ...prev, isFocused: false }))\n setAnimating(true)\n },\n }), [disabled, enableHover, enablePress, enableFocus, setAnimating])\n\n // 스타일 계산\n const style = useMemo<MicroMotionStyle>(() => {\n if (disabled) {\n return {\n transform: 'none',\n transition: 'none',\n willChange: 'auto',\n }\n }\n\n const transforms: string[] = []\n const easing = EASING_FUNCTIONS[preset as MicroMotionPreset] || EASING_FUNCTIONS.springy\n\n // Hover 상태\n if (state.isHovered && !state.isPressed) {\n if (scale) transforms.push(`scale(${1 + scale})`)\n if (translateY) transforms.push(`translateY(${translateY}px)`)\n if (translateX) transforms.push(`translateX(${translateX}px)`)\n if (rotate) transforms.push(`rotate(${rotate}deg)`)\n }\n\n // Press 상태 (hover보다 우선)\n if (state.isPressed) {\n // 눌렸을 때는 살짝 작아지고 내려감\n if (scale) transforms.push(`scale(${1 - scale * 0.5})`)\n if (translateY) transforms.push(`translateY(${Math.abs(translateY) * 0.5}px)`)\n }\n\n // Focus 상태\n if (state.isFocused && !state.isHovered && !state.isPressed) {\n if (scale) transforms.push(`scale(${1 + scale * 0.5})`)\n }\n\n return {\n transform: transforms.length > 0 ? transforms.join(' ') : 'none',\n transition: `transform ${duration}ms ${easing} ${delay}ms`,\n willChange: state.isAnimating ? 'transform' : 'auto',\n }\n }, [state, disabled, preset, duration, delay, scale, translateY, translateX, rotate])\n\n // Tailwind 호환 클래스\n const className = useMemo(() => {\n if (disabled) return ''\n\n const classes: string[] = [\n 'transform-gpu', // GPU 가속\n ]\n\n return classes.join(' ')\n }, [disabled])\n\n // 클린업\n useEffect(() => {\n return () => {\n if (animationTimeoutRef.current) {\n clearTimeout(animationTimeoutRef.current)\n }\n }\n }, [])\n\n return {\n state,\n style,\n handlers,\n className,\n }\n}\n\n/**\n * 간단한 CSS-only 마이크로 모션 클래스 생성기\n *\n * motion-core 없이도 \"스륵 쫀득\" 느낌을 주는 Tailwind 클래스\n */\nexport function getMicroMotionClasses(\n preset: MicroMotionPreset = 'springy',\n options: {\n enableHover?: boolean\n enableActive?: boolean\n enableFocus?: boolean\n } = {}\n): string {\n const { enableHover = true, enableActive = true, enableFocus = false } = options\n\n const baseClasses = ['transform-gpu', 'transition-transform']\n\n // 지속시간\n const durationClass = {\n subtle: 'duration-150',\n soft: 'duration-250',\n springy: 'duration-200',\n bouncy: 'duration-300',\n snappy: 'duration-150',\n }[preset]\n\n baseClasses.push(durationClass)\n\n // Hover 효과\n if (enableHover) {\n baseClasses.push('hover:scale-[1.02]', 'hover:-translate-y-0.5')\n }\n\n // Active 효과\n if (enableActive) {\n baseClasses.push('active:scale-[0.98]', 'active:translate-y-0')\n }\n\n // Focus 효과\n if (enableFocus) {\n baseClasses.push('focus:scale-[1.01]')\n }\n\n return baseClasses.join(' ')\n}\n","\"use client\";\n\nimport { useRef, useState, useEffect, useCallback } from \"react\";\n\n/**\n * useInView 훅의 옵션 / useInView hook options\n * @property {number} [threshold=0] - 뷰포트 진입 임계값 (0-1) / Viewport entry threshold\n * @property {string} [rootMargin=\"0px\"] - 루트 마진 / Root margin\n * @property {boolean} [triggerOnce=false] - 한 번만 트리거 / Trigger only once\n * @property {(entry: IntersectionObserverEntry) => void} [onChange] - 상태 변경 콜백 / State change callback\n */\nexport interface UseInViewOptions {\n threshold?: number | number[];\n rootMargin?: string;\n triggerOnce?: boolean;\n onChange?: (entry: IntersectionObserverEntry) => void;\n}\n\n/**\n * useInView 훅의 반환값 / useInView hook return value\n */\nexport interface UseInViewReturn<T extends HTMLElement = HTMLElement> {\n ref: React.RefObject<T | null>;\n inView: boolean;\n entry: IntersectionObserverEntry | null;\n}\n\n/**\n * useInView 훅 / useInView hook\n *\n * 요소가 뷰포트에 진입했는지 감지하는 훅입니다.\n * 애니메이션 트리거, 레이지 로딩, 무한 스크롤 등에 사용합니다.\n *\n * Hook that detects when an element enters the viewport.\n * Used for animation triggers, lazy loading, infinite scroll, etc.\n *\n * @example\n * // 기본 사용 / Basic usage\n * const { ref, inView } = useInView();\n *\n * return (\n * <div ref={ref} className={inView ? \"animate-in\" : \"opacity-0\"}>\n * Content\n * </div>\n * );\n *\n * @example\n * // 한 번만 트리거 / Trigger once\n * const { ref, inView } = useInView({ triggerOnce: true, threshold: 0.5 });\n */\nexport function useInView<T extends HTMLElement = HTMLElement>(\n options: UseInViewOptions = {}\n): UseInViewReturn<T> {\n const {\n threshold = 0,\n rootMargin = \"0px\",\n triggerOnce = false,\n onChange,\n } = options;\n\n const ref = useRef<T>(null);\n const [inView, setInView] = useState(false);\n const [entry, setEntry] = useState<IntersectionObserverEntry | null>(null);\n const frozenRef = useRef(false);\n\n useEffect(() => {\n const element = ref.current;\n if (!element) return;\n\n // Skip if already triggered once\n if (triggerOnce && frozenRef.current) return;\n\n const observer = new IntersectionObserver(\n ([entry]) => {\n const isInView = entry.isIntersecting;\n\n // Handle triggerOnce\n if (triggerOnce && isInView) {\n frozenRef.current = true;\n }\n\n setInView(isInView);\n setEntry(entry);\n onChange?.(entry);\n },\n { threshold, rootMargin }\n );\n\n observer.observe(element);\n\n return () => {\n observer.disconnect();\n };\n }, [threshold, rootMargin, triggerOnce, onChange]);\n\n return { ref, inView, entry };\n}\n\nexport default useInView;\n","\"use client\";\n\nimport { useState, useEffect, useRef, useCallback } from \"react\";\n\n/**\n * useScrollProgress 훅의 옵션 / useScrollProgress hook options\n * @property {\"page\" | \"element\"} [target=\"page\"] - 추적 대상 / Tracking target\n * @property {number} [throttle=16] - 쓰로틀 간격 (ms) / Throttle interval\n */\nexport interface UseScrollProgressOptions {\n target?: \"page\" | \"element\";\n throttle?: number;\n}\n\n/**\n * useScrollProgress 훅의 반환값 / useScrollProgress hook return value\n */\nexport interface UseScrollProgressReturn<T extends HTMLElement = HTMLElement> {\n ref: React.RefObject<T | null>;\n progress: number;\n scrollY: number;\n scrollX: number;\n isScrolling: boolean;\n direction: \"up\" | \"down\" | null;\n}\n\n/**\n * useScrollProgress 훅 / useScrollProgress hook\n *\n * 페이지 또는 요소의 스크롤 진행률을 추적하는 훅입니다.\n * 스크롤 기반 애니메이션, 진행률 표시 등에 사용합니다.\n *\n * Hook that tracks scroll progress of page or element.\n * Used for scroll-based animations, progress indicators, etc.\n *\n * @example\n * // 페이지 스크롤 / Page scroll\n * const { progress, direction } = useScrollProgress();\n *\n * return (\n * <div style={{ width: `${progress * 100}%` }} className=\"progress-bar\" />\n * );\n *\n * @example\n * // 요소 스크롤 / Element scroll\n * const { ref, progress } = useScrollProgress({ target: \"element\" });\n *\n * return (\n * <div ref={ref} className=\"overflow-auto h-[400px]\">\n * <p>Progress: {Math.round(progress * 100)}%</p>\n * </div>\n * );\n */\nexport function useScrollProgress<T extends HTMLElement = HTMLElement>(\n options: UseScrollProgressOptions = {}\n): UseScrollProgressReturn<T> {\n const { target = \"page\", throttle = 16 } = options;\n\n const ref = useRef<T>(null);\n const [progress, setProgress] = useState(0);\n const [scrollY, setScrollY] = useState(0);\n const [scrollX, setScrollX] = useState(0);\n const [isScrolling, setIsScrolling] = useState(false);\n const [direction, setDirection] = useState<\"up\" | \"down\" | null>(null);\n\n const lastScrollY = useRef(0);\n const scrollTimeout = useRef<ReturnType<typeof setTimeout> | null>(null);\n const lastUpdate = useRef(0);\n\n const calculateProgress = useCallback(() => {\n const now = Date.now();\n if (now - lastUpdate.current < throttle) return;\n lastUpdate.current = now;\n\n if (target === \"page\") {\n const scrollTop = window.scrollY;\n const docHeight = document.documentElement.scrollHeight - window.innerHeight;\n const newProgress = docHeight > 0 ? Math.min(scrollTop / docHeight, 1) : 0;\n\n setProgress(newProgress);\n setScrollY(scrollTop);\n setScrollX(window.scrollX);\n setDirection(scrollTop > lastScrollY.current ? \"down\" : \"up\");\n lastScrollY.current = scrollTop;\n } else if (ref.current) {\n const element = ref.current;\n const scrollTop = element.scrollTop;\n const scrollHeight = element.scrollHeight - element.clientHeight;\n const newProgress = scrollHeight > 0 ? Math.min(scrollTop / scrollHeight, 1) : 0;\n\n setProgress(newProgress);\n setScrollY(scrollTop);\n setScrollX(element.scrollLeft);\n setDirection(scrollTop > lastScrollY.current ? \"down\" : \"up\");\n lastScrollY.current = scrollTop;\n }\n\n setIsScrolling(true);\n if (scrollTimeout.current) clearTimeout(scrollTimeout.current);\n scrollTimeout.current = setTimeout(() => {\n setIsScrolling(false);\n }, 150);\n }, [target, throttle]);\n\n useEffect(() => {\n if (target === \"page\") {\n // Initial calculation\n calculateProgress();\n\n window.addEventListener(\"scroll\", calculateProgress, { passive: true });\n window.addEventListener(\"resize\", calculateProgress, { passive: true });\n\n return () => {\n window.removeEventListener(\"scroll\", calculateProgress);\n window.removeEventListener(\"resize\", calculateProgress);\n if (scrollTimeout.current) clearTimeout(scrollTimeout.current);\n };\n } else {\n const element = ref.current;\n if (!element) return;\n\n element.addEventListener(\"scroll\", calculateProgress, { passive: true });\n\n return () => {\n element.removeEventListener(\"scroll\", calculateProgress);\n if (scrollTimeout.current) clearTimeout(scrollTimeout.current);\n };\n }\n }, [target, calculateProgress]);\n\n return { ref, progress, scrollY, scrollX, isScrolling, direction };\n}\n\nexport default useScrollProgress;\n","\"use client\";\n\nimport { useState, useEffect, useRef, useCallback } from \"react\";\n\n/**\n * useMouse 훅의 옵션 / useMouse hook options\n * @property {\"page\" | \"element\" | \"viewport\"} [type=\"page\"] - 좌표 타입 / Coordinate type\n * @property {boolean} [touch=false] - 터치 이벤트 포함 / Include touch events\n * @property {number} [throttle=0] - 쓰로틀 간격 (ms) / Throttle interval\n */\nexport interface UseMouseOptions {\n type?: \"page\" | \"element\" | \"viewport\";\n touch?: boolean;\n throttle?: number;\n}\n\n/**\n * useMouse 훅의 반환값 / useMouse hook return value\n */\nexport interface UseMouseReturn<T extends HTMLElement = HTMLElement> {\n ref: React.RefObject<T | null>;\n x: number;\n y: number;\n elementX: number;\n elementY: number;\n elementPositionX: number;\n elementPositionY: number;\n isInside: boolean;\n isMoving: boolean;\n}\n\n/**\n * useMouse 훅 / useMouse hook\n *\n * 마우스 위치를 추적하는 훅입니다.\n * 커서 효과, 마우스 따라다니는 요소 등에 사용합니다.\n *\n * Hook that tracks mouse position.\n * Used for cursor effects, mouse-following elements, etc.\n *\n * @example\n * // 전역 마우스 위치 / Global mouse position\n * const { x, y } = useMouse();\n *\n * return (\n * <div style={{ transform: `translate(${x}px, ${y}px)` }} className=\"cursor\" />\n * );\n *\n * @example\n * // 요소 내 상대 위치 / Relative position in element\n * const { ref, elementX, elementY, isInside } = useMouse({ type: \"element\" });\n *\n * return (\n * <div ref={ref} className=\"relative\">\n * {isInside && (\n * <div style={{ left: elementX, top: elementY }} className=\"spotlight\" />\n * )}\n * </div>\n * );\n */\nexport function useMouse<T extends HTMLElement = HTMLElement>(\n options: UseMouseOptions = {}\n): UseMouseReturn<T> {\n const { type = \"page\", touch = false, throttle = 0 } = options;\n\n const ref = useRef<T>(null);\n const [state, setState] = useState({\n x: 0,\n y: 0,\n elementX: 0,\n elementY: 0,\n elementPositionX: 0,\n elementPositionY: 0,\n isInside: false,\n isMoving: false,\n });\n\n const lastUpdate = useRef(0);\n const moveTimeout = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const handleMove = useCallback(\n (clientX: number, clientY: number) => {\n const now = Date.now();\n if (throttle > 0 && now - lastUpdate.current < throttle) return;\n lastUpdate.current = now;\n\n let x = clientX;\n let y = clientY;\n let elementX = 0;\n let elementY = 0;\n let elementPositionX = 0;\n let elementPositionY = 0;\n let isInside = false;\n\n // Calculate page coordinates\n if (type === \"page\") {\n x = clientX + window.scrollX;\n y = clientY + window.scrollY;\n }\n\n // Calculate element-relative coordinates\n if (ref.current) {\n const rect = ref.current.getBoundingClientRect();\n elementX = clientX - rect.left;\n elementY = clientY - rect.top;\n elementPositionX = elementX / rect.width; // 0-1 normalized\n elementPositionY = elementY / rect.height; // 0-1 normalized\n isInside =\n clientX >= rect.left &&\n clientX <= rect.right &&\n clientY >= rect.top &&\n clientY <= rect.bottom;\n }\n\n setState({\n x,\n y,\n elementX,\n elementY,\n elementPositionX,\n elementPositionY,\n isInside,\n isMoving: true,\n });\n\n if (moveTimeout.current) clearTimeout(moveTimeout.current);\n moveTimeout.current = setTimeout(() => {\n setState((prev) => ({ ...prev, isMoving: false }));\n }, 150);\n },\n [type, throttle]\n );\n\n useEffect(() => {\n const handleMouseMove = (e: MouseEvent) => {\n handleMove(e.clientX, e.clientY);\n };\n\n const handleTouchMove = (e: TouchEvent) => {\n if (e.touches.length > 0) {\n handleMove(e.touches[0].clientX, e.touches[0].clientY);\n }\n };\n\n window.addEventListener(\"mousemove\", handleMouseMove, { passive: true });\n if (touch) {\n window.addEventListener(\"touchmove\", handleTouchMove, { passive: true });\n }\n\n return () => {\n window.removeEventListener(\"mousemove\", handleMouseMove);\n if (touch) {\n window.removeEventListener(\"touchmove\", handleTouchMove);\n }\n if (moveTimeout.current) clearTimeout(moveTimeout.current);\n };\n }, [handleMove, touch]);\n\n return {\n ref,\n ...state,\n };\n}\n\nexport default useMouse;\n","\"use client\";\n\nimport { useState, useEffect } from \"react\";\n\n/**\n * useReducedMotion 훅 / useReducedMotion hook\n *\n * 사용자의 모션 감소 선호 설정을 감지하는 훅입니다.\n * 접근성을 위해 애니메이션을 조건부로 적용할 때 사용합니다.\n *\n * Hook that detects user's reduced motion preference.\n * Used for conditionally applying animations for accessibility.\n *\n * @returns {boolean} 모션 감소 선호 여부 / Whether reduced motion is preferred\n *\n * @example\n * const prefersReducedMotion = useReducedMotion();\n *\n * return (\n * <div\n * className={prefersReducedMotion ? \"\" : \"animate-bounce\"}\n * style={{ transition: prefersReducedMotion ? \"none\" : \"all 0.3s\" }}\n * >\n * Content\n * </div>\n * );\n *\n * @example\n * // 조건부 애니메이션 / Conditional animation\n * const prefersReducedMotion = useReducedMotion();\n *\n * const variants = {\n * initial: { opacity: 0, y: prefersReducedMotion ? 0 : 20 },\n * animate: { opacity: 1, y: 0 },\n * };\n */\nexport function useReducedMotion(): boolean {\n const [prefersReducedMotion, setPrefersReducedMotion] = useState(false);\n\n useEffect(() => {\n // Check if window is available (SSR safety)\n if (typeof window === \"undefined\") return;\n\n const mediaQuery = window.matchMedia(\"(prefers-reduced-motion: reduce)\");\n\n // Set initial value\n setPrefersReducedMotion(mediaQuery.matches);\n\n // Listen for changes\n const handleChange = (e: MediaQueryListEvent) => {\n setPrefersReducedMotion(e.matches);\n };\n\n mediaQuery.addEventListener(\"change\", handleChange);\n\n return () => {\n mediaQuery.removeEventListener(\"change\", handleChange);\n };\n }, []);\n\n return prefersReducedMotion;\n}\n\nexport default useReducedMotion;\n","\"use client\";\n\nimport { useState, useEffect, useCallback } from \"react\";\n\n/**\n * useWindowSize 훅의 반환값 / useWindowSize hook return value\n */\nexport interface UseWindowSizeReturn {\n width: number;\n height: number;\n isMobile: boolean;\n isTablet: boolean;\n isDesktop: boolean;\n}\n\n/**\n * useWindowSize 훅의 옵션 / useWindowSize hook options\n */\nexport interface UseWindowSizeOptions {\n throttle?: number;\n mobileBreakpoint?: number;\n tabletBreakpoint?: number;\n}\n\n/**\n * useWindowSize 훅 / useWindowSize hook\n *\n * 윈도우 크기를 추적하는 훅입니다.\n * 반응형 애니메이션, 조건부 렌더링 등에 사용합니다.\n *\n * Hook that tracks window size.\n * Used for responsive animations, conditional rendering, etc.\n *\n * @example\n * const { width, height, isMobile } = useWindowSize();\n *\n * return (\n * <div style={{ fontSize: isMobile ? \"14px\" : \"16px\" }}>\n * Window: {width} x {height}\n * </div>\n * );\n */\nexport function useWindowSize(options: UseWindowSizeOptions = {}): UseWindowSizeReturn {\n const {\n throttle = 100,\n mobileBreakpoint = 768,\n tabletBreakpoint = 1024,\n } = options;\n\n const [size, setSize] = useState<UseWindowSizeReturn>({\n width: typeof window !== \"undefined\" ? window.innerWidth : 0,\n height: typeof window !== \"undefined\" ? window.innerHeight : 0,\n isMobile: false,\n isTablet: false,\n isDesktop: true,\n });\n\n const updateSize = useCallback(() => {\n const width = window.innerWidth;\n const height = window.innerHeight;\n\n setSize({\n width,\n height,\n isMobile: width < mobileBreakpoint,\n isTablet: width >= mobileBreakpoint && width < tabletBreakpoint,\n isDesktop: width >= tabletBreakpoint,\n });\n }, [mobileBreakpoint, tabletBreakpoint]);\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n\n // Initial update\n updateSize();\n\n let timeoutId: NodeJS.Timeout;\n\n const handleResize = () => {\n clearTimeout(timeoutId);\n timeoutId = setTimeout(updateSize, throttle);\n };\n\n window.addEventListener(\"resize\", handleResize, { passive: true });\n\n return () => {\n window.removeEventListener(\"resize\", handleResize);\n clearTimeout(timeoutId);\n };\n }, [updateSize, throttle]);\n\n return size;\n}\n\nexport default useWindowSize;\n"]}