@hua-labs/ui 2.0.2 → 2.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (214) hide show
  1. package/README.md +34 -161
  2. package/dist/{ComponentLayout-btJq4TjA.d.mts → ComponentLayout-DrZpz0yv.d.mts} +1 -1
  3. package/dist/Section-BWzyshgX.d.mts +67 -0
  4. package/dist/advanced/dashboard.d.ts.map +1 -1
  5. package/dist/advanced-dashboard.d.mts +1 -1
  6. package/dist/advanced-dashboard.js +4 -4
  7. package/dist/advanced-dashboard.js.map +1 -1
  8. package/dist/advanced-dashboard.mjs +3 -3
  9. package/dist/advanced-dashboard.mjs.map +1 -1
  10. package/dist/advanced-emotion.mjs +1 -1
  11. package/dist/advanced-motion.d.mts +65 -1
  12. package/dist/advanced-motion.js +14 -14
  13. package/dist/advanced-motion.js.map +1 -1
  14. package/dist/advanced-motion.mjs +1 -1
  15. package/dist/advanced.d.mts +4 -4
  16. package/dist/advanced.js +16 -16
  17. package/dist/advanced.js.map +1 -1
  18. package/dist/advanced.mjs +3 -3
  19. package/dist/advanced.mjs.map +1 -1
  20. package/dist/chunk-3CCF7U3P.mjs +3 -0
  21. package/dist/{chunk-IFSEJVOR.mjs.map → chunk-3CCF7U3P.mjs.map} +1 -1
  22. package/dist/chunk-3GAUTZXQ.mjs +3 -0
  23. package/dist/{chunk-X7ZIWYRC.mjs.map → chunk-3GAUTZXQ.mjs.map} +1 -1
  24. package/dist/chunk-42RGFEL2.mjs +3 -0
  25. package/dist/chunk-42RGFEL2.mjs.map +1 -0
  26. package/dist/chunk-4NJE7D6X.mjs +3 -0
  27. package/dist/chunk-4NJE7D6X.mjs.map +1 -0
  28. package/dist/chunk-6HVJFEDA.mjs +3 -0
  29. package/dist/{chunk-FSL373O6.mjs.map → chunk-6HVJFEDA.mjs.map} +1 -1
  30. package/dist/chunk-7OYT3QSY.mjs +3 -0
  31. package/dist/chunk-7OYT3QSY.mjs.map +1 -0
  32. package/dist/chunk-ANYZ56VB.mjs +3 -0
  33. package/dist/{chunk-QQCELXFD.mjs.map → chunk-ANYZ56VB.mjs.map} +1 -1
  34. package/dist/chunk-AOSXB5JJ.mjs +4 -0
  35. package/dist/{chunk-GLZKT7JN.mjs.map → chunk-AOSXB5JJ.mjs.map} +1 -1
  36. package/dist/chunk-B544MRF7.mjs +3 -0
  37. package/dist/{chunk-SDFHJ4GB.mjs.map → chunk-B544MRF7.mjs.map} +1 -1
  38. package/dist/chunk-CVWWS25A.mjs +3 -0
  39. package/dist/chunk-CVWWS25A.mjs.map +1 -0
  40. package/dist/chunk-DYNBM24D.mjs +3 -0
  41. package/dist/{chunk-OSCMSA2Q.mjs.map → chunk-DYNBM24D.mjs.map} +1 -1
  42. package/dist/{chunk-NBJUE7NR.mjs → chunk-FX57OSYG.mjs} +2 -2
  43. package/dist/{chunk-NBJUE7NR.mjs.map → chunk-FX57OSYG.mjs.map} +1 -1
  44. package/dist/chunk-IJSYSNM5.mjs +3 -0
  45. package/dist/{chunk-IN7RWQCJ.mjs.map → chunk-IJSYSNM5.mjs.map} +1 -1
  46. package/dist/chunk-KJZGOL2Z.mjs +3 -0
  47. package/dist/{chunk-LOYAJIWO.mjs.map → chunk-KJZGOL2Z.mjs.map} +1 -1
  48. package/dist/chunk-KYRIUUQP.mjs +3 -0
  49. package/dist/{chunk-PAEKNQWW.mjs.map → chunk-KYRIUUQP.mjs.map} +1 -1
  50. package/dist/chunk-LSA7DU3N.mjs +73 -0
  51. package/dist/chunk-LSA7DU3N.mjs.map +1 -0
  52. package/dist/chunk-MDLCJASB.mjs +3 -0
  53. package/dist/{chunk-LH77I6HO.mjs.map → chunk-MDLCJASB.mjs.map} +1 -1
  54. package/dist/chunk-N56BUOCD.mjs +3 -0
  55. package/dist/{chunk-XV3Y7QVU.mjs.map → chunk-N56BUOCD.mjs.map} +1 -1
  56. package/dist/chunk-OFYITQXI.mjs +13 -0
  57. package/dist/chunk-OFYITQXI.mjs.map +1 -0
  58. package/dist/chunk-OZNST3EZ.mjs +3 -0
  59. package/dist/{chunk-SGEP3CQE.mjs.map → chunk-OZNST3EZ.mjs.map} +1 -1
  60. package/dist/chunk-RS6RKW5U.mjs +13 -0
  61. package/dist/{chunk-6KTHJ3EL.mjs.map → chunk-RS6RKW5U.mjs.map} +1 -1
  62. package/dist/{chunk-C4OACMTB.mjs → chunk-TXBZZJNR.mjs} +2 -2
  63. package/dist/{chunk-C4OACMTB.mjs.map → chunk-TXBZZJNR.mjs.map} +1 -1
  64. package/dist/chunk-TZ4YSHMC.mjs +3 -0
  65. package/dist/{chunk-UWHCM3S6.mjs.map → chunk-TZ4YSHMC.mjs.map} +1 -1
  66. package/dist/chunk-U6CTBZ2U.mjs +3 -0
  67. package/dist/chunk-U6CTBZ2U.mjs.map +1 -0
  68. package/dist/{chunk-5BMH7223.mjs → chunk-WP7VFE77.mjs} +2 -2
  69. package/dist/{chunk-5BMH7223.mjs.map → chunk-WP7VFE77.mjs.map} +1 -1
  70. package/dist/{chunk-FFH4ZFKS.mjs → chunk-XCZMLKPK.mjs} +2 -2
  71. package/dist/{chunk-FFH4ZFKS.mjs.map → chunk-XCZMLKPK.mjs.map} +1 -1
  72. package/dist/chunk-XGHT7WMO.mjs +3 -0
  73. package/dist/chunk-XGHT7WMO.mjs.map +1 -0
  74. package/dist/chunk-XL4KTJ4L.mjs +3 -0
  75. package/dist/{chunk-VWSBJUNI.mjs.map → chunk-XL4KTJ4L.mjs.map} +1 -1
  76. package/dist/chunk-Z74YUUVT.mjs +3 -0
  77. package/dist/chunk-Z74YUUVT.mjs.map +1 -0
  78. package/dist/chunk-ZXZIHU7J.mjs +8 -0
  79. package/dist/{chunk-N7M6RIN4.mjs.map → chunk-ZXZIHU7J.mjs.map} +1 -1
  80. package/dist/components/DatePicker.d.ts.map +1 -1
  81. package/dist/components/Modal.d.ts.map +1 -1
  82. package/dist/components/Popover.d.ts +2 -0
  83. package/dist/components/Popover.d.ts.map +1 -1
  84. package/dist/components/Progress.d.ts +1 -0
  85. package/dist/components/Progress.d.ts.map +1 -1
  86. package/dist/components/Section.d.ts +44 -0
  87. package/dist/components/Section.d.ts.map +1 -0
  88. package/dist/components/advanced/AnimatedGradient.d.ts.map +1 -1
  89. package/dist/components/advanced/DotNav.d.ts +26 -0
  90. package/dist/components/advanced/DotNav.d.ts.map +1 -0
  91. package/dist/components/advanced/HorizontalScroll.d.ts +20 -0
  92. package/dist/components/advanced/HorizontalScroll.d.ts.map +1 -0
  93. package/dist/components/advanced/ImageReveal.d.ts +24 -0
  94. package/dist/components/advanced/ImageReveal.d.ts.map +1 -0
  95. package/dist/components/advanced/index.d.ts +6 -0
  96. package/dist/components/advanced/index.d.ts.map +1 -1
  97. package/dist/data.mjs +2 -2
  98. package/dist/data.mjs.map +1 -1
  99. package/dist/feedback.mjs +1 -1
  100. package/dist/form.js +3 -3
  101. package/dist/form.js.map +1 -1
  102. package/dist/form.mjs +4 -4
  103. package/dist/form.mjs.map +1 -1
  104. package/dist/{icons-Bj_nr8Ba.d.mts → icons-DmhQEH_E.d.mts} +6 -1
  105. package/dist/index.d.mts +9 -27
  106. package/dist/index.d.ts +4 -0
  107. package/dist/index.d.ts.map +1 -1
  108. package/dist/index.js +6 -6
  109. package/dist/index.js.map +1 -1
  110. package/dist/index.mjs +2 -2
  111. package/dist/index.mjs.map +1 -1
  112. package/dist/interactive.js +1 -1
  113. package/dist/interactive.js.map +1 -1
  114. package/dist/interactive.mjs +1 -1
  115. package/dist/interactive.mjs.map +1 -1
  116. package/dist/landing/LandingAbout.d.ts +3 -0
  117. package/dist/landing/LandingAbout.d.ts.map +1 -0
  118. package/dist/landing/LandingCTA.d.ts +3 -0
  119. package/dist/landing/LandingCTA.d.ts.map +1 -0
  120. package/dist/landing/LandingContact.d.ts +3 -0
  121. package/dist/landing/LandingContact.d.ts.map +1 -0
  122. package/dist/landing/LandingExperience.d.ts +3 -0
  123. package/dist/landing/LandingExperience.d.ts.map +1 -0
  124. package/dist/landing/LandingFeatures.d.ts +3 -0
  125. package/dist/landing/LandingFeatures.d.ts.map +1 -0
  126. package/dist/landing/LandingHero.d.ts +3 -0
  127. package/dist/landing/LandingHero.d.ts.map +1 -0
  128. package/dist/landing/LandingLogoCloud.d.ts +3 -0
  129. package/dist/landing/LandingLogoCloud.d.ts.map +1 -0
  130. package/dist/landing/LandingMetrics.d.ts +3 -0
  131. package/dist/landing/LandingMetrics.d.ts.map +1 -0
  132. package/dist/landing/LandingProjects.d.ts +3 -0
  133. package/dist/landing/LandingProjects.d.ts.map +1 -0
  134. package/dist/landing/LandingProvider.d.ts +4 -0
  135. package/dist/landing/LandingProvider.d.ts.map +1 -0
  136. package/dist/landing/LandingShowcase.d.ts +3 -0
  137. package/dist/landing/LandingShowcase.d.ts.map +1 -0
  138. package/dist/landing/LandingSkills.d.ts +3 -0
  139. package/dist/landing/LandingSkills.d.ts.map +1 -0
  140. package/dist/landing/LandingStats.d.ts +3 -0
  141. package/dist/landing/LandingStats.d.ts.map +1 -0
  142. package/dist/landing/LandingTestimonials.d.ts +3 -0
  143. package/dist/landing/LandingTestimonials.d.ts.map +1 -0
  144. package/dist/landing/index.d.ts +47 -0
  145. package/dist/landing/index.d.ts.map +1 -0
  146. package/dist/landing/themes/app.d.ts +3 -0
  147. package/dist/landing/themes/app.d.ts.map +1 -0
  148. package/dist/landing/themes/corporate.d.ts +3 -0
  149. package/dist/landing/themes/corporate.d.ts.map +1 -0
  150. package/dist/landing/themes/dashboard.d.ts +3 -0
  151. package/dist/landing/themes/dashboard.d.ts.map +1 -0
  152. package/dist/landing/themes/immersive.d.ts +3 -0
  153. package/dist/landing/themes/immersive.d.ts.map +1 -0
  154. package/dist/landing/themes/index.d.ts +15 -0
  155. package/dist/landing/themes/index.d.ts.map +1 -0
  156. package/dist/landing/themes/marketing.d.ts +3 -0
  157. package/dist/landing/themes/marketing.d.ts.map +1 -0
  158. package/dist/landing/themes/portfolio.d.ts +3 -0
  159. package/dist/landing/themes/portfolio.d.ts.map +1 -0
  160. package/dist/landing/themes/product.d.ts +3 -0
  161. package/dist/landing/themes/product.d.ts.map +1 -0
  162. package/dist/landing/types.d.ts +346 -0
  163. package/dist/landing/types.d.ts.map +1 -0
  164. package/dist/landing.d.mts +417 -0
  165. package/dist/landing.js +100 -0
  166. package/dist/landing.js.map +1 -0
  167. package/dist/landing.mjs +31 -0
  168. package/dist/landing.mjs.map +1 -0
  169. package/dist/lib/icons.d.ts +6 -1
  170. package/dist/lib/icons.d.ts.map +1 -1
  171. package/dist/navigation.d.mts +1 -1
  172. package/dist/navigation.js +2 -2
  173. package/dist/navigation.js.map +1 -1
  174. package/dist/navigation.mjs +1 -1
  175. package/dist/navigation.mjs.map +1 -1
  176. package/dist/overlay.d.mts +2 -0
  177. package/dist/overlay.js +1 -1
  178. package/dist/overlay.js.map +1 -1
  179. package/dist/overlay.mjs +1 -1
  180. package/dist/overlay.mjs.map +1 -1
  181. package/dist/sdui.js +4 -4
  182. package/dist/sdui.js.map +1 -1
  183. package/dist/sdui.mjs +1 -1
  184. package/dist/sdui.mjs.map +1 -1
  185. package/package.json +18 -7
  186. package/src/styles/landing.css +107 -0
  187. package/src/styles/utilities.css +58 -0
  188. package/dist/chunk-6KTHJ3EL.mjs +0 -13
  189. package/dist/chunk-COR6CDMA.mjs +0 -83
  190. package/dist/chunk-COR6CDMA.mjs.map +0 -1
  191. package/dist/chunk-FSL373O6.mjs +0 -3
  192. package/dist/chunk-GLZKT7JN.mjs +0 -4
  193. package/dist/chunk-HN5LSP6L.mjs +0 -3
  194. package/dist/chunk-HN5LSP6L.mjs.map +0 -1
  195. package/dist/chunk-IFSEJVOR.mjs +0 -3
  196. package/dist/chunk-IN7RWQCJ.mjs +0 -3
  197. package/dist/chunk-LH77I6HO.mjs +0 -3
  198. package/dist/chunk-LOYAJIWO.mjs +0 -3
  199. package/dist/chunk-LPAG7DCA.mjs +0 -3
  200. package/dist/chunk-LPAG7DCA.mjs.map +0 -1
  201. package/dist/chunk-N7M6RIN4.mjs +0 -8
  202. package/dist/chunk-OSCMSA2Q.mjs +0 -3
  203. package/dist/chunk-PAEKNQWW.mjs +0 -3
  204. package/dist/chunk-QQCELXFD.mjs +0 -3
  205. package/dist/chunk-RPUS7G7Q.mjs +0 -3
  206. package/dist/chunk-RPUS7G7Q.mjs.map +0 -1
  207. package/dist/chunk-SDFHJ4GB.mjs +0 -3
  208. package/dist/chunk-SGEP3CQE.mjs +0 -3
  209. package/dist/chunk-UUHAXGMO.mjs +0 -3
  210. package/dist/chunk-UUHAXGMO.mjs.map +0 -1
  211. package/dist/chunk-UWHCM3S6.mjs +0 -3
  212. package/dist/chunk-VWSBJUNI.mjs +0 -3
  213. package/dist/chunk-X7ZIWYRC.mjs +0 -3
  214. package/dist/chunk-XV3Y7QVU.mjs +0 -3
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/Action.tsx","../src/components/Link.tsx","../src/components/Grid.tsx","../src/components/Stack.tsx","../src/components/Divider.tsx","../src/components/Panel.tsx","../src/components/ActionToolbar.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/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":["isBrowser","useReducedMotion","reduce","setReduce","React","_a","mq","onChange","Action","className","children","actionType","feedback","particleEffect","rippleEffect","soundEffect","hapticFeedback","transparency","blurIntensity","glowIntensity","glowColor","loading","iconOnly","disabled","rest","ref","reduced","runEffects","event","AudioContextClass","audioContext","oscillator","gainNode","button","rect","x","y","size","ripple","style","i","particle","angle","velocity","vx","vy","styleVars","cls","merge","onClick","href","anchorRest","jsx","Button","e","btnRest","linkVariants","cva","Link","variant","external","gridVariants","RESPONSIVE_COLS","GAP_X","GAP_Y","Grid","cols","gap","gapX","gapY","responsive","props","stackVariants","SPACING","Stack","direction","spacing","align","justify","wrap","ORIENTATION","getSizeClass","orientation","getVariantClass","getColorClass","color","DividerComponent","Divider","panelStyleVariants","Panel","effect","borderOpacity","shadowOpacity","_hoverEffect","animationEffect","padding","customPadding","rounded","customRounded","background","gradientColors","patternType","backgroundImage","backgroundVideo","interactive","hoverScale","hoverRotate","hoverGlow","cardProps","patternBackground","backgroundStyles","styles","hoverClasses","classes","panelClasses","jsxs","Card","ActionToolbarComponent","isSelectMode","totalCount","selectedCount","actions","selectModeActions","onToggleSelectMode","onToggleSelectAll","onCancelSelect","getBadgeColor","useCallback","renderButton","action","key","Icon","index","ActionToolbar","Toggle","controlledPressed","onPressedChange","label","description","icon","iconPosition","internalPressed","setInternalPressed","isControlled","pressed","handleClick","sizeClasses","variantClasses","ScrollArea","scrollHideDelay","type","showScrollbar","setShowScrollbar","timeoutRef","handleMouseEnter","handleMouseLeave","ScrollBar","useScrollToggle","options","threshold","showOnMount","smooth","isVisible","setIsVisible","useState","mounted","setMounted","useEffect","toggleVisibility","ScrollToTop","scrollToTop","initialState","ThemeProviderContext","createContext","ThemeProvider","defaultTheme","storageKey","enableSystem","enableTransition","theme","setTheme","resolvedTheme","setResolvedTheme","savedTheme","root","systemTheme","mediaQuery","handleChange","value","newTheme","useTheme","context","useContext","ThemeToggle","showLabel","iconSizes","renderIcon","iconNames","iconProviderMapping","PROJECT_ICONS","isValidIconName","name","getIconNameForProvider","iconName","provider","mapping","withDarkMode","lightClass","darkClass","createGradient","from","to","withOpacity","opacity","isTextWhite","isGradientVariant","base","sm","md","lg","xl","conditionalClass","condition","trueClass","falseClass","EASING_FUNCTIONS","DURATIONS","HUA_DEFAULT_MOTION","COMPONENT_MOTION_DEFAULTS","CSS_MOTION_VARS","useMicroMotion","preset","duration","delay","scale","translateY","translateX","rotate","enableHover","enablePress","enableFocus","state","setState","animationTimeoutRef","useRef","setAnimating","isAnimating","prev","handlers","useMemo","transforms","easing","getMicroMotionClasses","enableActive","baseClasses","durationClass","useInView","rootMargin","triggerOnce","inView","setInView","entry","setEntry","frozenRef","element","observer","isInView","useScrollProgress","target","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","width","height","timeoutId","handleResize"],"mappings":"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","file":"index.mjs","sourcesContent":["\"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","\"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} ","\"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\"\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\"\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 { 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/components/Action.tsx","../src/components/Link.tsx","../src/components/Grid.tsx","../src/components/Stack.tsx","../src/components/Divider.tsx","../src/components/Panel.tsx","../src/components/ActionToolbar.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/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":["isBrowser","useReducedMotion","reduce","setReduce","React","_a","mq","onChange","Action","className","children","actionType","feedback","particleEffect","rippleEffect","soundEffect","hapticFeedback","transparency","blurIntensity","glowIntensity","glowColor","loading","iconOnly","disabled","rest","ref","reduced","runEffects","event","AudioContextClass","audioContext","oscillator","gainNode","button","rect","x","y","size","ripple","style","i","particle","angle","velocity","vx","vy","styleVars","cls","merge","onClick","href","anchorRest","jsx","Button","e","btnRest","linkVariants","cva","Link","variant","external","gridVariants","RESPONSIVE_COLS","GAP_X","GAP_Y","Grid","cols","gap","gapX","gapY","responsive","props","stackVariants","SPACING","Stack","direction","spacing","align","justify","wrap","ORIENTATION","getSizeClass","orientation","getVariantClass","getColorClass","color","DividerComponent","Divider","panelStyleVariants","Panel","effect","borderOpacity","shadowOpacity","_hoverEffect","animationEffect","padding","customPadding","rounded","customRounded","background","gradientColors","patternType","backgroundImage","backgroundVideo","interactive","hoverScale","hoverRotate","hoverGlow","cardProps","patternBackground","backgroundStyles","styles","hoverClasses","classes","panelClasses","jsxs","Card","ActionToolbarComponent","isSelectMode","totalCount","selectedCount","actions","selectModeActions","onToggleSelectMode","onToggleSelectAll","onCancelSelect","getBadgeColor","useCallback","renderButton","action","key","Icon","index","ActionToolbar","Toggle","controlledPressed","onPressedChange","label","description","icon","iconPosition","internalPressed","setInternalPressed","isControlled","pressed","handleClick","sizeClasses","variantClasses","ScrollArea","scrollHideDelay","type","showScrollbar","setShowScrollbar","timeoutRef","handleMouseEnter","handleMouseLeave","ScrollBar","useScrollToggle","options","threshold","showOnMount","smooth","isVisible","setIsVisible","useState","mounted","setMounted","useEffect","toggleVisibility","ScrollToTop","scrollToTop","initialState","ThemeProviderContext","createContext","ThemeProvider","defaultTheme","storageKey","enableSystem","enableTransition","theme","setTheme","resolvedTheme","setResolvedTheme","savedTheme","root","systemTheme","mediaQuery","handleChange","value","newTheme","useTheme","context","useContext","ThemeToggle","showLabel","iconSizes","renderIcon","iconNames","iconProviderMapping","PROJECT_ICONS","isValidIconName","name","getIconNameForProvider","iconName","provider","mapping","withDarkMode","lightClass","darkClass","createGradient","from","to","withOpacity","opacity","isTextWhite","isGradientVariant","base","sm","md","lg","xl","conditionalClass","condition","trueClass","falseClass","EASING_FUNCTIONS","DURATIONS","HUA_DEFAULT_MOTION","COMPONENT_MOTION_DEFAULTS","CSS_MOTION_VARS","useMicroMotion","preset","duration","delay","scale","translateY","translateX","rotate","enableHover","enablePress","enableFocus","state","setState","animationTimeoutRef","useRef","setAnimating","isAnimating","prev","handlers","useMemo","transforms","easing","getMicroMotionClasses","enableActive","baseClasses","durationClass","useInView","rootMargin","triggerOnce","inView","setInView","entry","setEntry","frozenRef","element","observer","isInView","useScrollProgress","target","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","width","height","timeoutId","handleResize"],"mappings":"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","file":"index.mjs","sourcesContent":["\"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","\"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} ","\"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\"\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\"\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 { 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"]}