@hua-labs/motion-core 2.2.3 → 2.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +128 -39
- package/dist/chunk-47QAGQLN.mjs +1057 -0
- package/dist/chunk-47QAGQLN.mjs.map +1 -0
- package/dist/chunk-LSIP7MB5.cjs +1090 -0
- package/dist/chunk-LSIP7MB5.cjs.map +1 -0
- package/dist/index.cjs +7532 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.mts +834 -642
- package/dist/index.d.ts +834 -642
- package/dist/index.mjs +4393 -1744
- package/dist/index.mjs.map +1 -1
- package/dist/native.cjs +692 -0
- package/dist/native.cjs.map +1 -0
- package/dist/native.d.mts +177 -0
- package/dist/native.d.ts +177 -0
- package/dist/native.mjs +555 -0
- package/dist/native.mjs.map +1 -0
- package/dist/springPhysics-DLyZ4nbx.d.mts +687 -0
- package/dist/springPhysics-DLyZ4nbx.d.ts +687 -0
- package/package.json +31 -11
- package/dist/index.js +0 -4756
- package/dist/index.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/hooks/useSimplePageMotion.ts","../src/hooks/usePageMotions.ts","../src/hooks/useSmartMotion.ts","../src/utils/sharedIntersectionObserver.ts","../src/hooks/useUnifiedMotion.ts","../src/hooks/useFadeIn.ts","../src/hooks/useSlideUp.ts","../src/hooks/useSlideLeft.ts","../src/hooks/useSlideRight.ts","../src/hooks/useScaleIn.ts","../src/hooks/useBounceIn.ts","../src/hooks/usePulse.ts","../src/hooks/useSpringMotion.ts","../src/hooks/useGradient.ts","../src/hooks/useHoverMotion.ts","../src/hooks/useClickToggle.ts","../src/hooks/useFocusToggle.ts","../src/hooks/useScrollReveal.ts","../src/utils/sharedScroll.ts","../src/hooks/useScrollProgress.ts","../src/hooks/useMotionState.ts","../src/hooks/useRepeat.ts","../src/hooks/useToggleMotion.ts","../src/hooks/useSlideDown.ts","../src/hooks/useInView.ts","../src/hooks/useMouse.ts","../src/hooks/useReducedMotion.ts","../src/hooks/useWindowSize.ts","../src/hooks/useGesture.ts","../src/hooks/useGestureMotion.ts","../src/hooks/useButtonEffect.ts","../src/hooks/useVisibilityToggle.ts","../src/hooks/useScrollToggle.ts","../src/hooks/useCardList.ts","../src/hooks/useLoadingSpinner.ts","../src/hooks/useNavigation.ts","../src/hooks/useSkeleton.ts","../src/hooks/useTypewriter.ts","../src/hooks/useCustomCursor.ts","../src/hooks/useMagneticCursor.ts","../src/hooks/useSmoothScroll.ts","../src/hooks/useElementProgress.ts","../src/hooks/useAutoFade.ts","../src/hooks/useAutoPlay.ts","../src/hooks/useAutoScale.ts","../src/hooks/useAutoSlide.ts","../src/hooks/useMotionOrchestra.ts","../src/hooks/useOrchestration.ts","../src/hooks/useSequence.ts","../src/hooks/useLayoutMotion.ts","../src/hooks/useKeyboardToggle.ts","../src/hooks/useScrollDirection.ts","../src/hooks/useStickyToggle.ts","../src/hooks/useInteractive.ts","../src/hooks/usePerformanceMonitor.ts","../src/hooks/useLanguageAwareMotion.ts","../src/hooks/useGameLoop.ts","../src/hooks/useMotion.ts","../src/hooks/useViewportToggle.ts","../src/hooks/useScrollPositionToggle.ts","../src/components/Motion.tsx","../src/hooks/useCountUp.ts","../src/hooks/useClipReveal.ts","../src/hooks/useBlurIn.ts","../src/hooks/useStagger.ts"],"names":["getPagePreset","useState","useRef","useCallback","getMotionPreset","mergeWithPreset","useEffect","motionStateManager","opacity","translateY","translateX","scale","MOTION_PRESETS","useMemo","useMotionProfile","base","getInitialTransform","getEasing","calculateSpring","entry","deltaX","deltaY","distance","velocity","onScroll","speed","from","to","applyEasing","jsx"],"mappings":"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","file":"index.cjs","sourcesContent":["// ========================================\n// 1단계: useSimplePageMotion (프리셋 기반) - 기존 방식\n// ========================================\n\nimport { useRef, useEffect, useState, useCallback } from 'react'\nimport type { PageType, PageMotionsConfig, PageMotionElement, PageMotionRef } from '../types'\nimport { getPagePreset, getMotionPreset, mergeWithPreset } from '../presets'\n\n/**\n * 1단계 API: 프리셋 기반 페이지 모션 (기존 방식)\n * \n * 사용법:\n * ```typescript\n * const motions = useSimplePageMotion('home')\n * ```\n * \n * 지원하는 페이지 타입:\n * - 'home': 홈페이지\n * - 'dashboard': 대시보드\n * - 'product': 제품 페이지\n * - 'blog': 블로그\n */\nexport function useSimplePageMotion(pageType: PageType) {\n const config = getPagePreset(pageType)\n return useSimplePageMotions(config)\n}\n\n/**\n * 1단계 내부 구현: 간단한 페이지 모션 (상태 관리자 없음)\n */\nfunction useSimplePageMotions(config: PageMotionsConfig) {\n const [motions, setMotions] = useState<Map<string, PageMotionRef>>(new Map())\n const observersRef = useRef<Map<string, IntersectionObserver>>(new Map())\n\n // 모션 값 계산\n const calculateMotionValues = useCallback((\n isVisible: boolean,\n elementConfig: PageMotionElement\n ) => {\n const preset = getMotionPreset(elementConfig.type)\n const mergedConfig = mergeWithPreset(preset, elementConfig)\n \n const opacity = isVisible ? 1 : 0\n const translateY = isVisible ? 0 : 20\n const translateX = 0\n const scale = isVisible ? 1 : 0.95\n\n return { opacity, translateY, translateX, scale }\n }, [])\n\n // 모션 초기화\n useEffect(() => {\n const newMotions = new Map<string, PageMotionRef>()\n \n Object.entries(config).forEach(([elementId, elementConfig]) => {\n const ref = { current: null }\n const { opacity, translateY, translateX, scale } = calculateMotionValues(false, elementConfig as any)\n\n newMotions.set(elementId, {\n ref,\n style: {\n opacity,\n transform: `translate(${translateX}px, ${translateY}px) scale(${scale})`,\n transition: `all ${elementConfig.duration || 700}ms ease-out`,\n pointerEvents: 'auto',\n willChange: 'transform, opacity'\n },\n isVisible: false,\n isHovered: false,\n isClicked: false\n })\n })\n\n setMotions(newMotions)\n }, [config, calculateMotionValues])\n\n // Intersection Observer 설정\n useEffect(() => {\n const visibleElements = new Set<string>()\n\n Object.entries(config).forEach(([elementId, elementConfig]) => {\n const observer = new IntersectionObserver(\n (entries) => {\n entries.forEach(entry => {\n if (entry.isIntersecting && !visibleElements.has(elementId)) {\n visibleElements.add(elementId)\n \n // 프리셋의 delay를 적용하여 모션 실행\n const preset = getMotionPreset(elementConfig.type)\n const mergedConfig = mergeWithPreset(preset, elementConfig)\n const delay = mergedConfig.delay || 0\n \n setTimeout(() => {\n const { opacity, translateY, translateX, scale } = calculateMotionValues(true, elementConfig as any)\n \n setMotions(prev => {\n const current = prev.get(elementId)\n if (!current) return prev\n\n const newMotion: PageMotionRef = {\n ...current,\n style: {\n ...current.style,\n opacity,\n transform: `translate(${translateX}px, ${translateY}px) scale(${scale})`\n },\n isVisible: true\n }\n\n const newMap = new Map(prev)\n newMap.set(elementId, newMotion)\n return newMap\n })\n \n if (process.env.NODE_ENV === 'development') {\n console.log('모션 실행:', elementId, 'delay:', delay)\n }\n }, delay)\n \n observer.unobserve(entry.target)\n }\n })\n },\n { threshold: elementConfig.threshold || 0.1 }\n )\n\n observersRef.current.set(elementId, observer)\n })\n\n // DOM이 렌더링된 후 observe 시작\n const timer = setTimeout(() => {\n Object.entries(config).forEach(([elementId]) => {\n const observer = observersRef.current.get(elementId)\n if (observer) {\n const element = document.querySelector(`[data-motion-id=\"${elementId}\"]`)\n if (element) {\n observer.observe(element)\n }\n }\n })\n }, 100)\n\n return () => {\n clearTimeout(timer)\n observersRef.current.forEach(observer => observer.disconnect())\n observersRef.current.clear()\n }\n }, [config, calculateMotionValues])\n\n // 모션 refs 반환\n const getPageMotionRefs = useCallback(() => {\n const result: Record<string, PageMotionRef> = {}\n motions.forEach((motion, elementId) => {\n result[elementId] = motion\n })\n return result\n }, [motions])\n\n return getPageMotionRefs()\n}\n\n/**\n * 커스텀 페이지 모션 설정\n * \n * 사용법:\n * ```typescript\n * const motions = useCustomPageMotion({\n * hero: { type: 'hero' },\n * title: { type: 'title' }\n * })\n * ```\n */\nexport function useCustomPageMotion(config: PageMotionsConfig) {\n return useSimplePageMotions(config)\n} ","// ========================================\n// 2단계: usePageMotions (페이지 레벨) - 상태 관리자 버전\n// ========================================\n\nimport { useRef, useEffect, useState, useCallback } from 'react'\nimport type { \n PageMotionsConfig, \n PageMotionElement, \n MotionState, \n PageMotionRef\n} from '../types'\nimport { getMotionPreset, mergeWithPreset } from '../presets'\nimport { motionStateManager } from '../managers/MotionStateManager'\n\n/**\n * 2단계 API: 페이지 레벨 모션 관리 (상태 관리자 버전)\n * \n * 사용법:\n * ```typescript\n * const motions = usePageMotions({\n * hero: { type: 'hero' },\n * title: { type: 'title' },\n * button: { type: 'button', hover: true, click: true }\n * })\n * ```\n */\nexport function usePageMotions(config: PageMotionsConfig) {\n const [motions, setMotions] = useState<Map<string, PageMotionRef>>(new Map())\n const observersRef = useRef<Map<string, IntersectionObserver>>(new Map())\n const unsubscribeRef = useRef<Map<string, () => void>>(new Map())\n const [resetKey, setResetKey] = useState(0)\n\n // 리셋 함수\n const reset = useCallback(() => {\n // 기존 observer들 정리\n observersRef.current.forEach(observer => observer.disconnect())\n observersRef.current.clear()\n \n // 구독 해제\n unsubscribeRef.current.forEach(unsubscribe => unsubscribe())\n unsubscribeRef.current.clear()\n \n // 상태 관리자 리셋\n motionStateManager.reset()\n \n // 모션 상태 초기화\n setMotions(new Map())\n \n // 리셋 키 증가로 useEffect 재실행\n setResetKey(prev => prev + 1)\n }, [])\n\n // 모션 값 계산\n const calculateMotionValues = useCallback((\n state: MotionState, \n elementConfig: PageMotionElement\n ) => {\n const preset = getMotionPreset(elementConfig.type)\n const mergedConfig = mergeWithPreset(preset, elementConfig)\n \n // 스크롤 리빌 모션 처리\n let opacity = state.finalVisibility ? 1 : 0\n let translateY = state.finalVisibility ? 0 : 20\n const translateX = 0\n let scale = state.finalVisibility ? 1 : 0.95\n\n // 호버 효과 (더 눈에 띄게)\n if (mergedConfig.hover && state.isHovered) {\n scale *= 1.1 // 10% 확대\n translateY -= 5 // 5px 위로\n opacity = 0.9 // 약간 투명도\n }\n\n // 클릭 효과 (더 눈에 띄게)\n if (mergedConfig.click && state.isClicked) {\n scale *= 0.9 // 10% 축소\n translateY += 3 // 3px 아래로\n opacity = 0.8 // 더 투명하게\n }\n\n return { opacity, translateY, translateX, scale }\n }, []) // 빈 의존성 배열로 고정\n\n // 모션 상태 업데이트\n const updateMotionState = useCallback((elementId: string, updates: Partial<MotionState>) => {\n const currentState = motionStateManager.getState(elementId)\n if (!currentState) return\n\n // 상태 관리자에 업데이트 적용\n if (updates.opacity !== undefined || updates.translateY !== undefined || \n updates.translateX !== undefined || updates.scale !== undefined) {\n motionStateManager.updateMotionValues(elementId, updates)\n }\n\n if (updates.isHovered !== undefined) {\n currentState.isHovered = updates.isHovered\n // 호버 상태 변경 시 리스너들에게 알림\n motionStateManager.notifyListeners(elementId, currentState)\n }\n\n if (updates.isClicked !== undefined) {\n currentState.isClicked = updates.isClicked\n // 클릭 상태 변경 시 리스너들에게 알림\n motionStateManager.notifyListeners(elementId, currentState)\n }\n }, []) // 빈 의존성 배열로 고정\n\n // 모션 초기화\n useEffect(() => {\n const newMotions = new Map<string, PageMotionRef>()\n \n // config가 유효하지 않으면 early return\n if (!config || typeof config !== 'object') {\n if (process.env.NODE_ENV === 'development') {\n console.warn('usePageMotions: config가 유효하지 않습니다:', config)\n }\n return\n }\n \n // 페이지별로 상태 관리자 초기화 (기존 상태 클리어)\n motionStateManager.reset()\n \n Object.entries(config).forEach(([elementId, elementConfig]) => {\n const ref = { current: null }\n \n // 상태 관리자에 요소 초기화\n motionStateManager.initializeElement(elementId, elementConfig as any)\n \n // 초기 상태 가져오기\n const initialState = motionStateManager.getState(elementId)!\n if (process.env.NODE_ENV === 'development') {\n console.log(`초기 상태 [${elementId}]:`, initialState)\n }\n const { opacity, translateY, translateX, scale } = calculateMotionValues(initialState, elementConfig)\n\n newMotions.set(elementId, {\n ref,\n style: {\n opacity,\n transform: `translate(${translateX}px, ${translateY}px) scale(${scale})`,\n transition: `all ${elementConfig.duration || 700}ms ease-out`,\n pointerEvents: 'auto',\n willChange: 'transform, opacity'\n },\n isVisible: initialState.finalVisibility,\n isHovered: initialState.isHovered,\n isClicked: initialState.isClicked\n })\n\n // 상태 변경 리스너 등록\n const unsubscribe = motionStateManager.subscribe(elementId, (newState) => {\n const { opacity, translateY, translateX, scale } = calculateMotionValues(newState, elementConfig as any)\n \n setMotions(prev => {\n const current = prev.get(elementId)\n if (!current) return prev\n\n // 변경 감지: 실제로 값이 변경되었을 때만 업데이트\n const transform = `translate(${translateX}px, ${translateY}px) scale(${scale})`\n const hasChanged = \n current.style.opacity !== opacity ||\n current.style.transform !== transform ||\n current.isVisible !== newState.finalVisibility ||\n current.isHovered !== newState.isHovered ||\n current.isClicked !== newState.isClicked\n\n // 변경이 없으면 이전 Map 반환 (불필요한 리렌더링 방지)\n if (!hasChanged) return prev\n\n const newMotion: PageMotionRef = {\n ...current,\n style: {\n ...current.style,\n opacity,\n transform\n },\n isVisible: newState.finalVisibility,\n isHovered: newState.isHovered,\n isClicked: newState.isClicked\n }\n\n // 변경된 항목만 업데이트하는 새 Map 생성\n const newMap = new Map(prev)\n newMap.set(elementId, newMotion)\n return newMap\n })\n })\n\n unsubscribeRef.current.set(elementId, unsubscribe)\n })\n\n setMotions(newMotions)\n\n // 클린업\n return () => {\n unsubscribeRef.current.forEach(unsubscribe => unsubscribe())\n unsubscribeRef.current.clear()\n // 페이지 언마운트 시 상태 관리자 클리어\n motionStateManager.reset()\n }\n }, [config, resetKey]) // resetKey 추가\n\n // Intersection Observer 설정\n useEffect(() => {\n const visibleElements = new Set<string>()\n\n // config가 유효하지 않으면 early return\n if (!config || typeof config !== 'object') {\n return\n }\n\n Object.entries(config).forEach(([elementId, elementConfig]) => {\n const observer = new IntersectionObserver(\n (entries) => {\n entries.forEach(entry => {\n if (entry.isIntersecting && !visibleElements.has(elementId)) {\n visibleElements.add(elementId)\n \n // 프리셋의 delay를 적용하여 모션 실행\n const preset = getMotionPreset(elementConfig.type)\n const mergedConfig = mergeWithPreset(preset, elementConfig)\n const delay = mergedConfig.delay || 0\n \n setTimeout(() => {\n // 외부 트리거로 가시성 설정\n motionStateManager.setTriggeredVisibility(elementId, true)\n if (process.env.NODE_ENV === 'development') {\n console.log('모션 실행:', elementId, 'delay:', delay)\n }\n }, delay)\n \n observer.unobserve(entry.target)\n }\n })\n },\n { \n threshold: elementConfig.threshold || 0.3, // 30% 보여야 실행\n rootMargin: '0px 0px -50px 0px' // 하단에서 50px 전에 실행\n }\n )\n\n observersRef.current.set(elementId, observer)\n })\n\n // DOM이 렌더링된 후 observe 시작\n const timer = setTimeout(() => {\n // config가 유효하지 않으면 early return\n if (!config || typeof config !== 'object') {\n return\n }\n \n Object.entries(config).forEach(([elementId]) => {\n const observer = observersRef.current.get(elementId)\n if (observer) {\n const element = document.querySelector(`[data-motion-id=\"${elementId}\"]`)\n if (element) {\n observer.observe(element)\n }\n }\n })\n }, 100)\n\n return () => {\n clearTimeout(timer)\n observersRef.current.forEach(observer => observer.disconnect())\n observersRef.current.clear()\n }\n }, [config, resetKey]) // resetKey 추가\n\n // 이벤트 리스너 설정\n useEffect(() => {\n // config가 유효하지 않으면 early return\n if (!config || typeof config !== 'object') {\n return\n }\n \n const handleMouseEnter = (event: MouseEvent) => {\n const target = event.target as HTMLElement\n if (!target) return\n \n // data-motion-id를 가진 요소나 그 하위 요소에서 찾기\n let element: HTMLElement | null = target\n let elementId: string | null = null\n \n while (element && element !== document.body) {\n if (element.getAttribute && typeof element.getAttribute === 'function') {\n elementId = element.getAttribute('data-motion-id')\n if (elementId) break\n }\n element = element.parentElement\n }\n \n if (elementId && config[elementId]?.hover) {\n if (process.env.NODE_ENV === 'development') {\n console.log('호버 시작:', elementId)\n }\n updateMotionState(elementId, { isHovered: true })\n }\n }\n\n const handleMouseLeave = (event: MouseEvent) => {\n const target = event.target as HTMLElement\n if (!target) return\n \n // data-motion-id를 가진 요소나 그 하위 요소에서 찾기\n let element: HTMLElement | null = target\n let elementId: string | null = null\n \n while (element && element !== document.body) {\n if (element.getAttribute && typeof element.getAttribute === 'function') {\n elementId = element.getAttribute('data-motion-id')\n if (elementId) break\n }\n element = element.parentElement\n }\n \n if (elementId && config[elementId]?.hover) {\n if (process.env.NODE_ENV === 'development') {\n console.log('호버 종료:', elementId)\n }\n updateMotionState(elementId, { isHovered: false })\n }\n }\n\n const handleMouseDown = (event: MouseEvent) => {\n const target = event.target as HTMLElement\n if (!target) return\n \n // data-motion-id를 가진 요소나 그 하위 요소에서 찾기\n let element: HTMLElement | null = target\n let elementId: string | null = null\n \n while (element && element !== document.body) {\n if (element.getAttribute && typeof element.getAttribute === 'function') {\n elementId = element.getAttribute('data-motion-id')\n if (elementId) break\n }\n element = element.parentElement\n }\n \n if (elementId && config[elementId]?.click) {\n if (process.env.NODE_ENV === 'development') {\n console.log('클릭 시작:', elementId)\n }\n updateMotionState(elementId, { isClicked: true })\n }\n }\n\n const handleMouseUp = (event: MouseEvent) => {\n const target = event.target as HTMLElement\n if (!target) return\n \n // data-motion-id를 가진 요소나 그 하위 요소에서 찾기\n let element: HTMLElement | null = target\n let elementId: string | null = null\n \n while (element && element !== document.body) {\n if (element.getAttribute && typeof element.getAttribute === 'function') {\n elementId = element.getAttribute('data-motion-id')\n if (elementId) break\n }\n element = element.parentElement\n }\n \n if (elementId && config[elementId]?.click) {\n if (process.env.NODE_ENV === 'development') {\n console.log('클릭 종료:', elementId)\n }\n updateMotionState(elementId, { isClicked: false })\n }\n }\n\n // 이벤트 위임: bubble phase 사용 (capture phase보다 성능 우수)\n // 각 요소에 직접 등록하는 대신 document에 한 번만 등록하여 메모리 효율성 향상\n const timer = setTimeout(() => {\n document.addEventListener('mouseenter', handleMouseEnter, false)\n document.addEventListener('mouseleave', handleMouseLeave, false)\n document.addEventListener('mousedown', handleMouseDown, false)\n document.addEventListener('mouseup', handleMouseUp, false)\n }, 200)\n\n return () => {\n clearTimeout(timer)\n document.removeEventListener('mouseenter', handleMouseEnter, false)\n document.removeEventListener('mouseleave', handleMouseLeave, false)\n document.removeEventListener('mousedown', handleMouseDown, false)\n document.removeEventListener('mouseup', handleMouseUp, false)\n }\n }, [config]) // config 직접 사용 (참조 안정성)\n\n // 디버그 모드 (개발 환경에서만) - 제거됨\n // useEffect(() => {\n // const isDevelopment = typeof window !== 'undefined' && window.location.hostname === 'localhost'\n // \n // if (isDevelopment) {\n // const interval = setInterval(() => {\n // motionStateManager.debug()\n // }, 5000)\n // \n // return () => clearInterval(interval)\n // }\n // }, [])\n\n // 모션 refs 반환\n const getPageMotionRefs = useCallback(() => {\n const result: Record<string, PageMotionRef> = {}\n motions.forEach((motion, elementId) => {\n result[elementId] = motion\n })\n return result\n }, [motions])\n\n return {\n ...getPageMotionRefs(),\n reset\n }\n} ","import { useRef, useEffect, useState, useCallback, useMemo } from 'react'\nimport { MOTION_PRESETS } from '../presets'\n\ntype MotionType = 'fadeIn' | 'slideUp' | 'slideLeft' | 'slideRight' | 'scaleIn' | 'bounceIn'\ntype ElementType = 'hero' | 'title' | 'button' | 'card' | 'text' | 'image'\n\ninterface SmartMotionOptions {\n type?: ElementType\n entrance?: MotionType\n hover?: boolean\n click?: boolean\n delay?: number\n duration?: number\n threshold?: number\n autoLanguageSync?: boolean\n}\n\ninterface SmartMotionState {\n isVisible: boolean\n isHovered: boolean\n isClicked: boolean\n opacity: number\n translateY: number\n translateX: number\n scale: number\n}\n\n/**\n * 3단계 API: 개별 요소 모션\n * \n * 사용법:\n * ```typescript\n * const heroRef = useSmartMotion({ type: 'hero' })\n * const titleRef = useSmartMotion({ type: 'title' })\n * const buttonRef = useSmartMotion({ type: 'button' })\n * ```\n */\nexport function useSmartMotion<T extends HTMLElement = HTMLDivElement>(options: SmartMotionOptions = {}): {\n ref: React.RefObject<T | null>;\n style: React.CSSProperties;\n isVisible: boolean;\n isHovered: boolean;\n isClicked: boolean;\n} {\n const {\n type = 'text',\n entrance: customEntrance,\n hover: customHover,\n click: customClick,\n delay: customDelay,\n duration: customDuration,\n threshold = 0.1,\n autoLanguageSync = false\n } = options\n\n // 프리셋 설정 (MOTION_PRESETS 재사용)\n const getPresetConfig = useCallback(() => {\n return MOTION_PRESETS[type] || MOTION_PRESETS.text\n }, [type])\n\n const preset = getPresetConfig()\n\n // 프리셋과 커스텀 옵션 병합\n const entrance = customEntrance || preset.entrance\n const hover = customHover !== undefined ? customHover : preset.hover\n const click = customClick !== undefined ? customClick : preset.click\n const delay = customDelay !== undefined ? customDelay : preset.delay\n const duration = customDuration !== undefined ? customDuration : preset.duration\n\n const elementRef = useRef<T | null>(null)\n \n // 초기 모션 값 계산\n const getInitialMotionValues = () => {\n const initialState = {\n isVisible: false,\n isHovered: false,\n isClicked: false,\n opacity: 0,\n translateY: 0,\n translateX: 0,\n scale: 1\n }\n \n // 초기 상태에 맞는 모션 값 설정\n switch (entrance) {\n case 'fadeIn':\n initialState.opacity = 0\n break\n case 'slideUp':\n initialState.opacity = 0\n initialState.translateY = 20\n break\n case 'slideLeft':\n initialState.opacity = 0\n initialState.translateX = -20\n break\n case 'slideRight':\n initialState.opacity = 0\n initialState.translateX = 20\n break\n case 'scaleIn':\n initialState.opacity = 0\n initialState.scale = 0.8\n break\n case 'bounceIn':\n initialState.opacity = 0\n initialState.scale = 0.5\n break\n }\n \n return initialState\n }\n \n const [state, setState] = useState<SmartMotionState>(() => {\n const initialValues = getInitialMotionValues()\n // threshold가 0이면 즉시 visible로 설정\n if (threshold === 0) {\n initialValues.isVisible = true\n initialValues.opacity = 1\n initialValues.translateY = 0\n initialValues.translateX = 0\n initialValues.scale = 1\n }\n return initialValues\n })\n\n // 모션 값 계산\n const calculateMotionValues = useCallback((currentState: SmartMotionState) => {\n const { isVisible, isHovered, isClicked } = currentState\n \n let opacity = 0\n let translateY = 0\n let translateX = 0\n let scale = 1\n\n // 진입 모션\n if (isVisible) {\n opacity = 1\n \n switch (entrance) {\n case 'fadeIn':\n // 기본값 유지\n break\n case 'slideUp':\n translateY = 0\n break\n case 'slideLeft':\n translateX = 0\n break\n case 'slideRight':\n translateX = 0\n break\n case 'scaleIn':\n scale = 1\n break\n case 'bounceIn':\n scale = 1\n break\n }\n } else {\n // 초기 상태\n switch (entrance) {\n case 'fadeIn':\n opacity = 0\n break\n case 'slideUp':\n opacity = 0\n translateY = 20\n break\n case 'slideLeft':\n opacity = 0\n translateX = -20\n break\n case 'slideRight':\n opacity = 0\n translateX = 20\n break\n case 'scaleIn':\n opacity = 0\n scale = 0.8\n break\n case 'bounceIn':\n opacity = 0\n scale = 0.5\n break\n }\n }\n\n // 호버 효과\n if (hover && isHovered) {\n scale *= 1.1 // 더 큰 확대\n translateY -= 5 // 더 큰 이동\n }\n\n // 클릭 효과\n if (click && isClicked) {\n scale *= 0.85 // 더 큰 축소\n translateY += 3 // 더 큰 이동\n }\n\n return { opacity, translateY, translateX, scale }\n }, [entrance, hover, click])\n\n // Intersection Observer\n useEffect(() => {\n if (!elementRef.current) return\n\n const observer = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n if (entry.isIntersecting) {\n setTimeout(() => {\n setState(prev => ({ ...prev, isVisible: true }))\n }, delay)\n }\n })\n },\n { threshold }\n )\n\n observer.observe(elementRef.current)\n\n return () => {\n observer.disconnect()\n }\n }, [delay, threshold])\n\n // 호버 이벤트\n useEffect(() => {\n if (!hover || !elementRef.current) return\n\n const element = elementRef.current\n\n const handleMouseEnter = () => {\n setState(prev => ({ ...prev, isHovered: true }))\n }\n\n const handleMouseLeave = () => {\n setState(prev => ({ ...prev, isHovered: false }))\n }\n\n element.addEventListener('mouseenter', handleMouseEnter)\n element.addEventListener('mouseleave', handleMouseLeave)\n\n return () => {\n element.removeEventListener('mouseenter', handleMouseEnter)\n element.removeEventListener('mouseleave', handleMouseLeave)\n }\n }, [hover])\n\n // 클릭 이벤트\n useEffect(() => {\n if (!click || !elementRef.current) return\n\n const element = elementRef.current\n\n const handleClick = () => {\n setState(prev => ({ ...prev, isClicked: true }))\n setTimeout(() => {\n setState(prev => ({ ...prev, isClicked: false }))\n }, 300) // 더 긴 지속시간\n }\n\n element.addEventListener('click', handleClick)\n\n return () => {\n element.removeEventListener('click', handleClick)\n }\n }, [click])\n\n // 상태 변경 시 모션 값 업데이트 (무한 루프 방지)\n useEffect(() => {\n setState(prev => {\n const { opacity, translateY, translateX, scale } = calculateMotionValues(prev)\n // 값이 실제로 변경되었을 때만 업데이트 (불필요한 리렌더링 방지)\n if (\n prev.opacity === opacity &&\n prev.translateY === translateY &&\n prev.translateX === translateX &&\n prev.scale === scale\n ) {\n return prev // 변경 없으면 이전 상태 반환\n }\n return { ...prev, opacity, translateY, translateX, scale }\n })\n }, [state.isVisible, state.isHovered, state.isClicked, calculateMotionValues])\n\n // 언어 변경 감지 (간단한 버전)\n useEffect(() => {\n if (!autoLanguageSync) return\n\n const handleLanguageChange = () => {\n // 언어 변경 시 모션 재시작\n setState(prev => ({ ...prev, isVisible: false }))\n setTimeout(() => {\n setState(prev => ({ ...prev, isVisible: true }))\n }, 100)\n }\n\n // 간단한 언어 변경 감지 (실제로는 i18n 훅과 연동 필요)\n window.addEventListener('storage', handleLanguageChange)\n\n return () => {\n window.removeEventListener('storage', handleLanguageChange)\n }\n }, [autoLanguageSync])\n\n // 스타일 메모이제이션으로 불필요한 리렌더링 방지\n const motionStyle: React.CSSProperties = useMemo(() => ({\n opacity: state.opacity,\n transform: `translate(${state.translateX}px, ${state.translateY}px) scale(${state.scale})`,\n transition: `all ${duration}ms ease-out`,\n // CSS transition과 충돌 방지\n pointerEvents: 'auto',\n // 강제로 스타일 적용\n willChange: 'transform, opacity'\n }), [state.opacity, state.translateX, state.translateY, state.scale, duration])\n\n return {\n ref: elementRef,\n style: motionStyle,\n isVisible: state.isVisible,\n isHovered: state.isHovered,\n isClicked: state.isClicked\n }\n}\n","/**\n * Shared IntersectionObserver Pool\n *\n * threshold|rootMargin 조합별로 하나의 IntersectionObserver를 공유합니다.\n * N개 훅 = K개 observer (K = 고유 옵션 조합 수, 보통 1~3).\n *\n * sharedScroll.ts와 동일한 singleton pool 패턴.\n *\n * @example\n * ```ts\n * useEffect(() => {\n * if (!ref.current) return\n * return observeElement(\n * ref.current,\n * (entry) => { if (entry.isIntersecting) start() },\n * { threshold: 0.1 },\n * true // once\n * )\n * }, [])\n * ```\n */\n\ntype EntryCallback = (entry: IntersectionObserverEntry) => void\n\ninterface Subscription {\n callback: EntryCallback\n once: boolean\n}\n\ninterface ObserverGroup {\n observer: IntersectionObserver\n /** element → 해당 element의 구독 목록 */\n elements: Map<Element, Subscription[]>\n}\n\n/** threshold|rootMargin 문자열 → ObserverGroup */\nconst pool = new Map<string, ObserverGroup>()\n\nfunction makeKey(threshold: number | number[], rootMargin: string): string {\n const th = Array.isArray(threshold) ? threshold.join(',') : String(threshold)\n return `${th}|${rootMargin}`\n}\n\nfunction handleIntersections(group: ObserverGroup, entries: IntersectionObserverEntry[]) {\n for (const entry of entries) {\n const subs = group.elements.get(entry.target)\n if (!subs) continue\n\n // snapshot — callback 내에서 unsubscribe 할 수 있으므로 복사\n const snapshot = [...subs]\n for (const sub of snapshot) {\n sub.callback(entry)\n\n // once 모드: 첫 intersecting 시 자동 정리\n if (sub.once && entry.isIntersecting) {\n removeSub(group, entry.target, sub)\n }\n }\n }\n}\n\nfunction removeSub(group: ObserverGroup, element: Element, sub: Subscription) {\n const subs = group.elements.get(element)\n if (!subs) return\n\n const idx = subs.indexOf(sub)\n if (idx >= 0) subs.splice(idx, 1)\n\n // element의 마지막 구독이 사라지면 unobserve\n if (subs.length === 0) {\n group.elements.delete(element)\n group.observer.unobserve(element)\n\n // observer에 관찰 중인 element가 없으면 disconnect + pool에서 제거\n if (group.elements.size === 0) {\n group.observer.disconnect()\n for (const [key, g] of pool) {\n if (g === group) {\n pool.delete(key)\n break\n }\n }\n }\n }\n}\n\n/**\n * element를 공유 IntersectionObserver에 등록.\n * 반환 함수를 호출하면 구독 해제.\n *\n * @param element - 관찰할 DOM element\n * @param callback - intersection 변화 시 호출되는 콜백 (해당 element의 entry만 전달)\n * @param options - threshold, rootMargin\n * @param once - true이면 첫 intersection 후 자동 unsubscribe\n * @returns unsubscribe 함수\n */\nexport function observeElement(\n element: Element,\n callback: EntryCallback,\n options?: { threshold?: number | number[]; rootMargin?: string },\n once?: boolean\n): () => void {\n // SSR guard\n if (typeof IntersectionObserver === 'undefined') {\n return () => {}\n }\n\n const threshold = options?.threshold ?? 0\n const rootMargin = options?.rootMargin ?? '0px'\n const key = makeKey(threshold, rootMargin)\n\n let group = pool.get(key)\n if (!group) {\n const observer = new IntersectionObserver(\n (entries) => handleIntersections(group!, entries),\n { threshold, rootMargin }\n )\n group = { observer, elements: new Map() }\n pool.set(key, group)\n }\n\n const sub: Subscription = { callback, once: once ?? false }\n\n const subs = group.elements.get(element)\n if (subs) {\n subs.push(sub)\n } else {\n group.elements.set(element, [sub])\n group.observer.observe(element)\n }\n\n let unsubscribed = false\n return () => {\n if (unsubscribed) return\n unsubscribed = true\n removeSub(group!, element, sub)\n }\n}\n\n// ─── Test Helpers ───\n\n/** 테스트용: observer pool 초기화 */\nexport function _resetObserverPool(): void {\n for (const group of pool.values()) {\n group.observer.disconnect()\n }\n pool.clear()\n}\n\n/** 테스트용: 현재 pool 상태 반환 */\nexport function _getObserverPool(): Map<string, ObserverGroup> {\n return pool\n}\n","/**\n * @hua-labs/motion-core - useUnifiedMotion\n *\n * 통합 Motion Hook - 단일 타입으로 여러 모션 효과 중 하나를 선택\n * 내부에서 선택된 type에 맞는 로직만 실행 (6개 훅 동시 호출 제거)\n */\n\nimport { useRef, useState, useEffect, useCallback, useMemo } from 'react'\nimport type { BaseMotionReturn, MotionElement, EntranceType, BaseMotionOptions } from '../types'\nimport { useMotionProfile } from '../profiles/MotionProfileContext'\nimport { observeElement } from '../utils/sharedIntersectionObserver'\n\nexport interface MotionEffects {\n fade?: boolean | { targetOpacity?: number }\n slide?: boolean | { direction?: 'up' | 'down' | 'left' | 'right'; distance?: number }\n scale?: boolean | { from?: number; to?: number }\n bounce?: boolean\n}\n\nexport interface UseUnifiedMotionOptions extends Omit<BaseMotionOptions, 'autoStart'> {\n /** Motion type to use (single effect mode) */\n type?: EntranceType\n /** Multiple effects to combine (multi-effect mode) */\n effects?: MotionEffects\n /** Auto start animation @default true */\n autoStart?: boolean\n /** Slide distance (px) for slide types @default 50 */\n distance?: number\n}\n\n// type별 초기 스타일 계산\nfunction getInitialStyle(type: EntranceType, distance: number) {\n switch (type) {\n case 'slideUp':\n return { opacity: 0, transform: `translateY(${distance}px)` }\n case 'slideLeft':\n return { opacity: 0, transform: `translateX(${distance}px)` }\n case 'slideRight':\n return { opacity: 0, transform: `translateX(-${distance}px)` }\n case 'scaleIn':\n return { opacity: 0, transform: 'scale(0)' }\n case 'bounceIn':\n return { opacity: 0, transform: 'scale(0)' }\n case 'fadeIn':\n default:\n return { opacity: 0, transform: 'none' }\n }\n}\n\nfunction getVisibleStyle() {\n return { opacity: 1, transform: 'none' }\n}\n\nfunction getEasingForType(type: EntranceType, easing?: string): string {\n if (easing) return easing\n if (type === 'bounceIn') return 'cubic-bezier(0.34, 1.56, 0.64, 1)'\n return 'ease-out'\n}\n\nfunction getMultiEffectInitialStyle(effects: MotionEffects, defaultDistance: number): Record<string, string | number> {\n const style: Record<string, string | number> = {}\n const transforms: string[] = []\n\n if (effects.fade) {\n style.opacity = 0\n }\n\n if (effects.slide) {\n const config = typeof effects.slide === 'object' ? effects.slide : {}\n const direction = config.direction ?? 'up'\n const distance = config.distance ?? defaultDistance\n switch (direction) {\n case 'up': transforms.push(`translateY(${distance}px)`); break\n case 'down': transforms.push(`translateY(-${distance}px)`); break\n case 'left': transforms.push(`translateX(${distance}px)`); break\n case 'right': transforms.push(`translateX(-${distance}px)`); break\n }\n if (!effects.fade) style.opacity = 0\n }\n\n if (effects.scale) {\n const config = typeof effects.scale === 'object' ? effects.scale : {}\n const from = config.from ?? 0.95\n transforms.push(`scale(${from})`)\n if (!effects.fade && !effects.slide) style.opacity = 0\n }\n\n if (effects.bounce) {\n transforms.push('scale(0)')\n if (!effects.fade && !effects.slide && !effects.scale) style.opacity = 0\n }\n\n if (transforms.length > 0) {\n style.transform = transforms.join(' ')\n } else {\n style.transform = 'none'\n }\n\n // fade만 있을 때 transform 기본값\n if (effects.fade && transforms.length === 0) {\n style.transform = 'none'\n }\n\n return style\n}\n\nfunction getMultiEffectVisibleStyle(effects: MotionEffects): Record<string, string | number> {\n const style: Record<string, string | number> = {}\n\n if (effects.fade) {\n const config = typeof effects.fade === 'object' ? effects.fade : {}\n style.opacity = config.targetOpacity ?? 1\n } else {\n style.opacity = 1\n }\n\n if (effects.scale) {\n const config = typeof effects.scale === 'object' ? effects.scale : {}\n style.transform = `scale(${config.to ?? 1})`\n } else {\n style.transform = 'none'\n }\n\n return style\n}\n\nfunction getMultiEffectEasing(effects: MotionEffects, easing?: string): string {\n if (easing) return easing\n if (effects.bounce) return 'cubic-bezier(0.34, 1.56, 0.64, 1)'\n return 'ease-out'\n}\n\nexport function useUnifiedMotion<T extends MotionElement = HTMLDivElement>(\n options: UseUnifiedMotionOptions\n): BaseMotionReturn<T> {\n const profile = useMotionProfile()\n const {\n type,\n effects,\n duration = profile.base.duration,\n autoStart = true,\n delay = 0,\n easing,\n threshold = profile.base.threshold,\n triggerOnce = profile.base.triggerOnce,\n distance = profile.entrance.slide.distance,\n onComplete,\n onStart,\n onStop,\n onReset\n } = options\n\n const resolvedType = type ?? 'fadeIn'\n const resolvedEasing = getEasingForType(resolvedType, easing)\n\n const ref = useRef<T>(null)\n const [isVisible, setIsVisible] = useState(false)\n const [isAnimating, setIsAnimating] = useState(false)\n const [progress, setProgress] = useState(0)\n const timeoutRef = useRef<number | null>(null)\n const startRef = useRef<() => void>(() => {})\n\n const start = useCallback(() => {\n if (isAnimating) return\n setIsAnimating(true)\n setProgress(0)\n onStart?.()\n\n timeoutRef.current = window.setTimeout(() => {\n setIsVisible(true)\n setProgress(1)\n setIsAnimating(false)\n onComplete?.()\n }, delay)\n }, [isAnimating, delay, onStart, onComplete])\n\n startRef.current = start\n\n const stop = useCallback(() => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current)\n timeoutRef.current = null\n }\n setIsAnimating(false)\n onStop?.()\n }, [onStop])\n\n const reset = useCallback(() => {\n stop()\n setIsVisible(false)\n setProgress(0)\n onReset?.()\n }, [stop, onReset])\n\n // IntersectionObserver로 자동 시작 (공유 observer pool 사용)\n useEffect(() => {\n if (!ref.current || !autoStart) return\n return observeElement(\n ref.current,\n (entry) => { if (entry.isIntersecting) startRef.current() },\n { threshold },\n triggerOnce\n )\n }, [autoStart, threshold, triggerOnce])\n\n useEffect(() => {\n return () => stop()\n }, [stop])\n\n // type에 맞는 스타일을 CSS transition으로 처리\n const style = useMemo(() => {\n if (effects) {\n const base = isVisible ? getMultiEffectVisibleStyle(effects) : getMultiEffectInitialStyle(effects, distance)\n const resolvedEasingMulti = getMultiEffectEasing(effects, easing)\n return {\n ...base,\n transition: `all ${duration}ms ${resolvedEasingMulti}`,\n '--motion-delay': `${delay}ms`,\n '--motion-duration': `${duration}ms`,\n '--motion-easing': resolvedEasingMulti,\n '--motion-progress': `${progress}`\n } as const\n }\n\n // 기존 단일 type 모드\n const base = isVisible ? getVisibleStyle() : getInitialStyle(resolvedType, distance)\n return {\n ...base,\n transition: `all ${duration}ms ${resolvedEasing}`,\n '--motion-delay': `${delay}ms`,\n '--motion-duration': `${duration}ms`,\n '--motion-easing': resolvedEasing,\n '--motion-progress': `${progress}`\n } as const\n }, [isVisible, type, effects, distance, duration, resolvedEasing, easing, delay, progress, resolvedType])\n\n return {\n ref,\n isVisible,\n isAnimating,\n style,\n progress,\n start,\n stop,\n reset\n }\n}\n","import { useRef, useState, useEffect, useCallback, useMemo } from 'react'\nimport { FadeInOptions, BaseMotionReturn, MotionElement } from '../types'\nimport { useMotionProfile } from '../profiles/MotionProfileContext'\nimport { observeElement } from '../utils/sharedIntersectionObserver'\n\nexport function useFadeIn<T extends MotionElement = HTMLDivElement>(\n options: FadeInOptions = {}\n): BaseMotionReturn<T> {\n const profile = useMotionProfile()\n const {\n delay = 0,\n duration = profile.base.duration,\n threshold = profile.base.threshold,\n triggerOnce = profile.base.triggerOnce,\n easing = profile.base.easing,\n autoStart = true,\n initialOpacity = profile.entrance.fade.initialOpacity,\n targetOpacity = 1,\n onComplete,\n onStart,\n onStop,\n onReset\n } = options\n\n const ref = useRef<T>(null)\n const [isVisible, setIsVisible] = useState(false)\n const [isAnimating, setIsAnimating] = useState(false)\n const [progress, setProgress] = useState(0)\n const [nodeReady, setNodeReady] = useState(false)\n const motionRef = useRef<number | null>(null)\n const timeoutRef = useRef<number | null>(null)\n const startRef = useRef<() => void>(() => {})\n\n // ref가 DOM에 연결되었는지 polling으로 감지\n useEffect(() => {\n if (nodeReady) return\n if (ref.current) {\n setNodeReady(true)\n return\n }\n const id = setInterval(() => {\n if (ref.current) {\n setNodeReady(true)\n clearInterval(id)\n }\n }, 50)\n return () => clearInterval(id)\n }, [nodeReady])\n\n // 모션 시작 함수\n const start = useCallback(() => {\n if (isAnimating) return\n\n setIsAnimating(true)\n setProgress(0)\n onStart?.()\n\n // 지연 시간 적용\n if (delay > 0) {\n timeoutRef.current = window.setTimeout(() => {\n setIsVisible(true)\n setProgress(1)\n setIsAnimating(false)\n onComplete?.()\n }, delay)\n } else {\n setIsVisible(true)\n setProgress(1)\n setIsAnimating(false)\n onComplete?.()\n }\n }, [delay, isAnimating, onStart, onComplete])\n\n // startRef 업데이트 (IntersectionObserver에서 안정적인 참조 사용)\n startRef.current = start\n\n // 모션 중단 함수\n const stop = useCallback(() => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current)\n timeoutRef.current = null\n }\n if (motionRef.current) {\n cancelAnimationFrame(motionRef.current)\n motionRef.current = null\n }\n setIsAnimating(false)\n onStop?.()\n }, [onStop])\n\n // 모션 리셋 함수\n const reset = useCallback(() => {\n stop()\n setIsVisible(false)\n setProgress(0)\n onReset?.()\n }, [stop, onReset])\n\n // Intersection Observer 설정 (공유 observer pool 사용)\n useEffect(() => {\n if (!ref.current || !autoStart) return\n return observeElement(\n ref.current,\n (entry) => { if (entry.isIntersecting) startRef.current() },\n { threshold },\n triggerOnce\n )\n }, [autoStart, threshold, triggerOnce, nodeReady])\n\n // 컴포넌트 언마운트 시 정리\n useEffect(() => {\n return () => {\n stop()\n }\n }, [stop])\n\n // 스타일 계산 (React 19 호환) - 메모이제이션으로 불필요한 리렌더링 방지\n const style = useMemo(() => ({\n opacity: isVisible ? targetOpacity : initialOpacity,\n transition: `opacity ${duration}ms ${easing}`,\n '--motion-delay': `${delay}ms`,\n '--motion-duration': `${duration}ms`,\n '--motion-easing': easing,\n '--motion-progress': `${progress}`\n } as const), [isVisible, targetOpacity, initialOpacity, duration, easing, delay, progress])\n\n return {\n ref,\n isVisible,\n isAnimating,\n style,\n progress,\n start,\n stop,\n reset\n }\n} ","import { useRef, useState, useEffect, useCallback, useMemo } from 'react'\nimport { SlideOptions, BaseMotionReturn, MotionElement } from '../types'\nimport { useMotionProfile } from '../profiles/MotionProfileContext'\nimport { observeElement } from '../utils/sharedIntersectionObserver'\n\nexport function useSlideUp<T extends MotionElement = HTMLDivElement>(\n options: SlideOptions = {}\n): BaseMotionReturn<T> {\n const profile = useMotionProfile()\n const {\n delay = 0,\n duration = profile.base.duration,\n threshold = profile.base.threshold,\n triggerOnce = profile.base.triggerOnce,\n easing = profile.entrance.slide.easing,\n autoStart = true,\n direction = 'up',\n distance = profile.entrance.slide.distance,\n onComplete,\n onStart,\n onStop,\n onReset\n } = options\n\n const ref = useRef<T>(null)\n const [isVisible, setIsVisible] = useState(false)\n const [isAnimating, setIsAnimating] = useState(false)\n const [progress, setProgress] = useState(0)\n const [nodeReady, setNodeReady] = useState(false)\n const timeoutRef = useRef<number | null>(null)\n const startRef = useRef<() => void>(() => {})\n\n // ref가 DOM에 연결되었는지 polling으로 감지\n useEffect(() => {\n if (nodeReady) return\n if (ref.current) {\n setNodeReady(true)\n return\n }\n const id = setInterval(() => {\n if (ref.current) {\n setNodeReady(true)\n clearInterval(id)\n }\n }, 50)\n return () => clearInterval(id)\n }, [nodeReady])\n\n // 방향에 따른 초기 위치 계산\n const getInitialTransform = useCallback(() => {\n switch (direction) {\n case 'up':\n return `translateY(${distance}px)`\n case 'down':\n return `translateY(-${distance}px)`\n case 'left':\n return `translateX(${distance}px)`\n case 'right':\n return `translateX(-${distance}px)`\n default:\n return `translateY(${distance}px)`\n }\n }, [direction, distance])\n\n // 모션 시작 함수\n const start = useCallback(() => {\n if (isAnimating) return\n\n setIsAnimating(true)\n setProgress(0)\n onStart?.()\n\n // 지연 시간 적용\n if (delay > 0) {\n timeoutRef.current = window.setTimeout(() => {\n setIsVisible(true)\n setProgress(1)\n setIsAnimating(false)\n onComplete?.()\n }, delay)\n } else {\n setIsVisible(true)\n setProgress(1)\n setIsAnimating(false)\n onComplete?.()\n }\n }, [delay, isAnimating, onStart, onComplete])\n\n // startRef 업데이트 (IntersectionObserver에서 안정적인 참조 사용)\n startRef.current = start\n\n // 모션 중단 함수\n const stop = useCallback(() => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current)\n timeoutRef.current = null\n }\n setIsAnimating(false)\n onStop?.()\n }, [onStop])\n\n // 모션 리셋 함수\n const reset = useCallback(() => {\n stop()\n setIsVisible(false)\n setProgress(0)\n onReset?.()\n }, [stop, onReset])\n\n // Intersection Observer 설정 (공유 observer pool 사용)\n useEffect(() => {\n if (!ref.current || !autoStart) return\n return observeElement(\n ref.current,\n (entry) => { if (entry.isIntersecting) startRef.current() },\n { threshold },\n triggerOnce\n )\n }, [autoStart, threshold, triggerOnce, nodeReady])\n\n // 컴포넌트 언마운트 시 정리\n useEffect(() => {\n return () => {\n stop()\n }\n }, [stop])\n\n // 초기 transform 값 메모이제이션\n const initialTransform = useMemo(() => getInitialTransform(), [getInitialTransform])\n\n // 최종 transform 값 (방향에 따라 translateX(0) 또는 translateY(0))\n const finalTransform = useMemo(() => {\n return direction === 'left' || direction === 'right' ? 'translateX(0)' : 'translateY(0)'\n }, [direction])\n\n // 스타일 계산 (React 19 호환) - 메모이제이션으로 불필요한 리렌더링 방지\n const style = useMemo(() => ({\n opacity: isVisible ? 1 : 0,\n transform: isVisible ? finalTransform : initialTransform,\n transition: `opacity ${duration}ms ${easing}, transform ${duration}ms ${easing}`,\n '--motion-delay': `${delay}ms`,\n '--motion-duration': `${duration}ms`,\n '--motion-easing': easing,\n '--motion-progress': `${progress}`,\n '--motion-direction': direction,\n '--motion-distance': `${distance}px`\n } as const), [isVisible, initialTransform, finalTransform, duration, easing, delay, progress, direction, distance])\n\n return {\n ref,\n isVisible,\n isAnimating,\n style,\n progress,\n start,\n stop,\n reset\n }\n} ","import { SlideOptions, BaseMotionReturn, MotionElement } from '../types'\nimport { useSlideUp } from './useSlideUp'\n\n/**\n * useSlideLeft - 오른쪽에서 왼쪽으로 슬라이드하며 나타나는 애니메이션 훅\n *\n * useSlideUp의 wrapper로, direction: 'left'를 기본값으로 사용합니다.\n * IntersectionObserver를 통해 뷰포트 진입 시 자동으로 애니메이션이 시작됩니다.\n *\n * @example\n * ```tsx\n * const slideLeft = useSlideLeft({ duration: 700, distance: 50 });\n *\n * return (\n * <div ref={slideLeft.ref} style={slideLeft.style}>\n * Content slides in from right\n * </div>\n * );\n * ```\n */\nexport function useSlideLeft<T extends MotionElement = HTMLDivElement>(\n options: Omit<SlideOptions, 'direction'> = {}\n): BaseMotionReturn<T> {\n return useSlideUp<T>({ ...options, direction: 'left' })\n}\n","import { SlideOptions, BaseMotionReturn, MotionElement } from '../types'\nimport { useSlideUp } from './useSlideUp'\n\n/**\n * useSlideRight - 왼쪽에서 오른쪽으로 슬라이드하며 나타나는 애니메이션 훅\n *\n * useSlideUp의 wrapper로, direction: 'right'를 기본값으로 사용합니다.\n * IntersectionObserver를 통해 뷰포트 진입 시 자동으로 애니메이션이 시작됩니다.\n *\n * @example\n * ```tsx\n * const slideRight = useSlideRight({ duration: 700, distance: 50 });\n *\n * return (\n * <div ref={slideRight.ref} style={slideRight.style}>\n * Content slides in from left\n * </div>\n * );\n * ```\n */\nexport function useSlideRight<T extends MotionElement = HTMLDivElement>(\n options: Omit<SlideOptions, 'direction'> = {}\n): BaseMotionReturn<T> {\n return useSlideUp<T>({ ...options, direction: 'right' })\n}\n","import { useRef, useState, useEffect, useCallback, useMemo } from 'react'\nimport { ScaleOptions, BaseMotionReturn, MotionElement } from '../types'\nimport { useMotionProfile } from '../profiles/MotionProfileContext'\nimport { observeElement } from '../utils/sharedIntersectionObserver'\n\nexport function useScaleIn<T extends MotionElement = HTMLDivElement>(\n options: ScaleOptions = {}\n): BaseMotionReturn<T> {\n const profile = useMotionProfile()\n const {\n initialScale = 0,\n targetScale = 1,\n duration = profile.base.duration,\n delay = 0,\n autoStart = true,\n easing = profile.base.easing,\n threshold = profile.base.threshold,\n triggerOnce = profile.base.triggerOnce,\n onComplete,\n onStart,\n onStop,\n onReset\n } = options\n\n const ref = useRef<T>(null)\n const [scale, setScale] = useState(autoStart ? initialScale : targetScale)\n const [opacity, setOpacity] = useState(autoStart ? 0 : 1)\n const [isAnimating, setIsAnimating] = useState(false)\n const [isVisible, setIsVisible] = useState(autoStart ? false : true)\n const [progress, setProgress] = useState(autoStart ? 0 : 1)\n\n const timeoutRef = useRef<number | null>(null)\n const startRef = useRef<() => void>(() => {})\n\n // 모션 시작 함수\n const start = useCallback(() => {\n if (isAnimating) return\n\n setIsAnimating(true)\n setScale(initialScale)\n setOpacity(0)\n setProgress(0)\n onStart?.()\n\n // delay 후 스케일 시작\n timeoutRef.current = window.setTimeout(() => {\n setProgress(1)\n setScale(targetScale)\n setOpacity(1)\n setIsVisible(true)\n setIsAnimating(false)\n onComplete?.()\n }, delay)\n }, [delay, initialScale, targetScale, isAnimating, onStart, onComplete])\n\n // startRef 업데이트 (IntersectionObserver에서 안정적인 참조 사용)\n startRef.current = start\n\n // 모션 중단 함수\n const stop = useCallback(() => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current)\n timeoutRef.current = null\n }\n setIsAnimating(false)\n onStop?.()\n }, [onStop])\n\n // 모션 리셋 함수\n const reset = useCallback(() => {\n stop()\n setScale(initialScale)\n setOpacity(0)\n setProgress(0)\n setIsVisible(false)\n\n // DOM 요소가 있다면 즉시 스타일 적용\n if (ref.current) {\n const element = ref.current\n element.style.transition = 'none'\n element.style.opacity = '0'\n element.style.transform = `scale(${initialScale})`\n\n // 다음 프레임에서 transition 복원\n requestAnimationFrame(() => {\n element.style.transition = ''\n })\n }\n onReset?.()\n }, [stop, initialScale, onReset])\n\n // IntersectionObserver 설정 (공유 observer pool 사용)\n useEffect(() => {\n if (!ref.current || !autoStart) return\n return observeElement(\n ref.current,\n (entry) => { if (entry.isIntersecting) startRef.current() },\n { threshold },\n triggerOnce\n )\n }, [autoStart, threshold, triggerOnce])\n\n // 컴포넌트 언마운트 시 정리\n useEffect(() => {\n return () => {\n stop()\n }\n }, [stop])\n\n // 스타일 계산 - 메모이제이션으로 불필요한 리렌더링 방지\n const style = useMemo(() => ({\n transform: `scale(${scale})`,\n opacity,\n transition: `all ${duration}ms ${easing}`,\n '--motion-delay': `${delay}ms`,\n '--motion-duration': `${duration}ms`,\n '--motion-easing': easing,\n '--motion-progress': `${progress}`\n } as const), [scale, opacity, duration, easing, delay, progress])\n\n return {\n ref,\n isVisible,\n isAnimating,\n style,\n progress,\n start,\n reset,\n stop\n }\n}\n","import { useRef, useState, useEffect, useCallback, useMemo } from 'react'\nimport { BounceOptions, BaseMotionReturn, MotionElement } from '../types'\nimport { useMotionProfile } from '../profiles/MotionProfileContext'\nimport { observeElement } from '../utils/sharedIntersectionObserver'\n\nexport function useBounceIn<T extends MotionElement = HTMLDivElement>(\n options: BounceOptions = {}\n): BaseMotionReturn<T> {\n const profile = useMotionProfile()\n const {\n duration = 600,\n delay = 0,\n autoStart = true,\n intensity = profile.entrance.bounce.intensity,\n threshold = profile.base.threshold,\n triggerOnce = profile.base.triggerOnce,\n easing = profile.entrance.bounce.easing,\n onComplete,\n onStart,\n onStop,\n onReset\n } = options\n\n const ref = useRef<T>(null)\n const [scale, setScale] = useState(autoStart ? 0 : 1)\n const [opacity, setOpacity] = useState(autoStart ? 0 : 1)\n const [isAnimating, setIsAnimating] = useState(false)\n const [isVisible, setIsVisible] = useState(autoStart ? false : true)\n const [progress, setProgress] = useState(autoStart ? 0 : 1)\n\n const timeoutRef = useRef<number | null>(null)\n const bounceTimeoutRef = useRef<number | null>(null)\n const startRef = useRef<() => void>(() => {})\n\n // 모션 시작 함수\n const start = useCallback(() => {\n if (isAnimating) return\n\n setIsAnimating(true)\n setScale(0)\n setOpacity(0)\n setProgress(0)\n onStart?.()\n\n // delay 후 바운스 시작\n timeoutRef.current = window.setTimeout(() => {\n setProgress(0.5)\n setScale(1 + intensity)\n setOpacity(1)\n\n // 바운스 후 안정화\n bounceTimeoutRef.current = window.setTimeout(() => {\n setProgress(1)\n setScale(1)\n setIsVisible(true)\n setIsAnimating(false)\n onComplete?.()\n }, duration * 0.3) // 바운스 지속시간\n }, delay)\n }, [delay, intensity, duration, isAnimating, onStart, onComplete])\n\n // startRef 업데이트 (IntersectionObserver에서 안정적인 참조 사용)\n startRef.current = start\n\n // 모션 중단 함수\n const stop = useCallback(() => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current)\n timeoutRef.current = null\n }\n if (bounceTimeoutRef.current) {\n clearTimeout(bounceTimeoutRef.current)\n bounceTimeoutRef.current = null\n }\n setIsAnimating(false)\n onStop?.()\n }, [onStop])\n\n // 모션 리셋 함수\n const reset = useCallback(() => {\n stop()\n setScale(0)\n setOpacity(0)\n setProgress(0)\n setIsVisible(false)\n\n // DOM 요소가 있다면 즉시 스타일 적용\n if (ref.current) {\n const element = ref.current\n element.style.transition = 'none'\n element.style.opacity = '0'\n element.style.transform = 'scale(0)'\n\n // 다음 프레임에서 transition 복원\n requestAnimationFrame(() => {\n element.style.transition = ''\n })\n }\n onReset?.()\n }, [stop, onReset])\n\n // IntersectionObserver 설정 (공유 observer pool 사용)\n useEffect(() => {\n if (!ref.current || !autoStart) return\n return observeElement(\n ref.current,\n (entry) => { if (entry.isIntersecting) startRef.current() },\n { threshold },\n triggerOnce\n )\n }, [autoStart, threshold, triggerOnce])\n\n // 컴포넌트 언마운트 시 정리\n useEffect(() => {\n return () => {\n stop()\n }\n }, [stop])\n\n // 스타일 계산 - 메모이제이션으로 불필요한 리렌더링 방지\n const style = useMemo(() => ({\n transform: `scale(${scale})`,\n opacity,\n transition: `all ${duration}ms ${easing}`,\n '--motion-delay': `${delay}ms`,\n '--motion-duration': `${duration}ms`,\n '--motion-easing': easing,\n '--motion-progress': `${progress}`\n } as const), [scale, opacity, duration, easing, delay, progress])\n\n return {\n ref,\n isVisible,\n isAnimating,\n style,\n progress,\n start,\n reset,\n stop\n }\n}\n","import { useRef, useEffect, useCallback, useState, useMemo } from 'react'\nimport { PulseOptions, BaseMotionReturn, MotionElement } from '../types'\nimport { getEasing } from '../utils/easing'\n\nexport function usePulse<T extends MotionElement = HTMLDivElement>(\n options: PulseOptions = {}\n): BaseMotionReturn<T> {\n const {\n duration = 3000,\n intensity = 1,\n repeatCount = Infinity,\n repeatDelay = 0,\n autoStart = false\n } = options\n\n const ref = useRef<T>(null)\n const [isAnimating, setIsAnimating] = useState(false)\n const [isVisible, setIsVisible] = useState(true)\n const [progress, setProgress] = useState(0)\n const motionRef = useRef<number | null>(null)\n\n // 이징 함수 메모이제이션 (애니메이션 루프 내 반복 호출 방지)\n const easingFn = useMemo(() => getEasing('easeInOut'), [])\n\n // 모션 시작\n const start = useCallback(() => {\n if (!ref.current) return\n\n const element = ref.current\n let currentRepeat = 0\n\n setIsAnimating(true)\n\n const animate = (startTime: number) => {\n const updateMotion = (currentTime: number) => {\n const elapsed = currentTime - startTime\n const rawProgress = Math.min(elapsed / duration, 1)\n const easedProgress = easingFn(rawProgress)\n\n // Yoyo 효과 (repeatDelay > 0이면 대기 후 역방향)\n const finalProgress = currentRepeat % 2 === 1 ? 1 - easedProgress : easedProgress\n\n // 펄스 효과 (투명도 변화)\n const opacity = 0.3 + (0.7 * finalProgress * intensity)\n element.style.opacity = opacity.toString()\n setProgress(rawProgress)\n\n if (rawProgress < 1) {\n motionRef.current = requestAnimationFrame(updateMotion)\n } else {\n currentRepeat++\n if (repeatCount === Infinity || currentRepeat < repeatCount * 2) {\n // repeatDelay 적용\n if (repeatDelay > 0) {\n const delayTimeout = window.setTimeout(() => {\n motionRef.current = requestAnimationFrame(() => animate(performance.now()))\n }, repeatDelay)\n // 타임아웃 ID를 motionRef에 저장하지 않음 (별도 관리 불필요, 언마운트 시 rAF 취소로 충분)\n motionRef.current = delayTimeout as unknown as number\n } else {\n motionRef.current = requestAnimationFrame(() => animate(performance.now()))\n }\n } else {\n setIsAnimating(false)\n }\n }\n }\n\n motionRef.current = requestAnimationFrame(updateMotion)\n }\n\n animate(performance.now())\n }, [duration, intensity, repeatCount, repeatDelay, easingFn])\n\n // 모션 정지\n const stop = useCallback(() => {\n if (motionRef.current) {\n cancelAnimationFrame(motionRef.current)\n clearTimeout(motionRef.current)\n motionRef.current = null\n }\n setIsAnimating(false)\n }, [])\n\n // 모션 리셋\n const reset = useCallback(() => {\n if (motionRef.current) {\n cancelAnimationFrame(motionRef.current)\n clearTimeout(motionRef.current)\n motionRef.current = null\n }\n\n setIsAnimating(false)\n setProgress(0)\n\n if (ref.current) {\n const element = ref.current\n element.style.transition = 'none'\n element.style.opacity = '1'\n\n requestAnimationFrame(() => {\n element.style.transition = ''\n })\n }\n }, [])\n\n // 자동 시작\n useEffect(() => {\n if (autoStart) {\n start()\n }\n }, [autoStart, start])\n\n // 컴포넌트 언마운트 시 정리\n useEffect(() => {\n return () => {\n if (motionRef.current) {\n cancelAnimationFrame(motionRef.current)\n clearTimeout(motionRef.current)\n }\n }\n }, [])\n\n // 스타일 계산\n const style = useMemo(() => ({\n opacity: isAnimating ? 0.3 + (0.7 * progress * intensity) : 1,\n transition: isAnimating ? 'none' : 'opacity 0.3s ease-in-out'\n }), [isAnimating, progress, intensity])\n\n return {\n ref,\n isVisible,\n isAnimating,\n style,\n progress,\n start,\n stop,\n reset\n }\n}\n","import { useRef, useEffect, useState, useCallback, useMemo, type CSSProperties } from 'react'\nimport { SpringOptions, BaseMotionReturn, MotionElement } from '../types'\nimport { useMotionProfile } from '../profiles/MotionProfileContext'\nimport { calculateSpring } from '../utils/springPhysics'\n\ninterface SpringMotionOptions extends SpringOptions {\n /** 시작 값 */\n from: number\n /** 목표 값 */\n to: number\n /** 활성화 여부 */\n enabled?: boolean\n}\n\nexport function useSpringMotion<T extends MotionElement = HTMLDivElement>(\n options: SpringMotionOptions\n): BaseMotionReturn<T> & {\n value: number\n velocity: number\n} {\n const profile = useMotionProfile()\n const {\n from,\n to,\n mass = profile.spring.mass,\n stiffness = profile.spring.stiffness,\n damping = profile.spring.damping,\n restDelta = profile.spring.restDelta,\n restSpeed = profile.spring.restSpeed,\n onComplete,\n enabled = true,\n autoStart = true\n } = options\n\n const ref = useRef<T>(null)\n const [springState, setSpringState] = useState({\n value: from,\n velocity: 0,\n isAnimating: false\n })\n const [isVisible, setIsVisible] = useState(true)\n const [progress, setProgress] = useState(0)\n\n const motionRef = useRef<number | null>(null)\n const lastTimeRef = useRef<number>(0)\n\n // 스프링 설정 메모이제이션\n const springConfig = useMemo(() => ({ stiffness, damping, mass }), [stiffness, damping, mass])\n\n // 모션 루프\n const animate = useCallback((currentTime: number) => {\n if (!enabled || !springState.isAnimating) return\n\n const deltaTime = Math.min(currentTime - lastTimeRef.current, 16) / 1000 // 60fps 제한\n lastTimeRef.current = currentTime\n\n const { value, velocity } = calculateSpring(\n springState.value,\n springState.velocity,\n to,\n deltaTime,\n springConfig\n )\n\n // 진행률 계산\n const range = Math.abs(to - from)\n const currentProgress = range > 0 ? Math.min(Math.abs(value - from) / range, 1) : 1\n setProgress(currentProgress)\n\n // 정지 조건 확인\n const isAtRest = Math.abs(value - to) < restDelta && Math.abs(velocity) < restSpeed\n\n if (isAtRest) {\n setSpringState({\n value: to,\n velocity: 0,\n isAnimating: false\n })\n setProgress(1)\n onComplete?.()\n return\n }\n\n setSpringState({\n value,\n velocity,\n isAnimating: true\n })\n\n motionRef.current = requestAnimationFrame(animate)\n }, [enabled, springState.isAnimating, to, from, restDelta, restSpeed, onComplete, springConfig])\n\n // 모션 시작\n const start = useCallback(() => {\n if (springState.isAnimating) return\n\n setSpringState(prev => ({\n ...prev,\n isAnimating: true\n }))\n lastTimeRef.current = performance.now()\n motionRef.current = requestAnimationFrame(animate)\n }, [springState.isAnimating, animate])\n\n // 모션 정지\n const stop = useCallback(() => {\n if (motionRef.current) {\n cancelAnimationFrame(motionRef.current)\n motionRef.current = null\n }\n setSpringState(prev => ({\n ...prev,\n isAnimating: false\n }))\n }, [])\n\n // 모션 리셋\n const reset = useCallback(() => {\n stop()\n setSpringState({\n value: from,\n velocity: 0,\n isAnimating: false\n })\n setProgress(0)\n motionRef.current = null\n }, [from, stop])\n\n // 자동 시작\n useEffect(() => {\n if (autoStart) {\n start()\n }\n }, [autoStart, start])\n\n // 컴포넌트 언마운트 시 정리\n useEffect(() => {\n return () => {\n if (motionRef.current) {\n cancelAnimationFrame(motionRef.current)\n }\n }\n }, [])\n\n // 스타일 계산\n const style = useMemo(() => ({\n '--motion-progress': `${progress}`,\n '--motion-value': `${springState.value}`\n } as CSSProperties), [progress, springState.value])\n\n return {\n ref,\n isVisible,\n isAnimating: springState.isAnimating,\n style,\n progress,\n value: springState.value,\n velocity: springState.velocity,\n start,\n stop,\n reset\n }\n}\n","import { useRef, useState, useEffect, useCallback, useMemo } from 'react'\nimport { GradientOptions, BaseMotionReturn, MotionElement } from '../types'\n\nconst defaultColors = ['#60a5fa', '#34d399', '#fbbf24', '#f87171']\n\n// SSR 안전한 키프레임 생성\nlet keyframesInjected = false\nfunction ensureGradientKeyframes() {\n if (typeof document === 'undefined' || keyframesInjected) return\n const name = 'gradientShift'\n if (!document.head.querySelector(`style[data-gradient=\"${name}\"]`)) {\n const style = document.createElement('style')\n style.setAttribute('data-gradient', name)\n style.textContent = `\n @keyframes ${name} {\n 0%, 100% { background-position: 0% 50%; }\n 50% { background-position: 100% 50%; }\n }\n `\n document.head.appendChild(style)\n }\n keyframesInjected = true\n}\n\nexport function useGradient<T extends MotionElement = HTMLDivElement>(\n options: GradientOptions = {}\n): BaseMotionReturn<T> {\n const {\n colors = defaultColors,\n duration = 6000,\n direction = 'diagonal',\n size = 300,\n easing = 'ease-in-out',\n autoStart = false\n } = options\n\n const ref = useRef<T>(null)\n const [isAnimating, setIsAnimating] = useState(autoStart)\n const [isVisible, setIsVisible] = useState(true)\n const [motionProgress, setMotionProgress] = useState(0)\n\n // SSR 가드: 키프레임은 useEffect 내에서만 생성\n useEffect(() => {\n ensureGradientKeyframes()\n }, [])\n\n const style = useMemo(() => {\n const gradientDirection = direction === 'horizontal' ? '90deg' :\n direction === 'vertical' ? '180deg' : '135deg'\n\n const background = `linear-gradient(${gradientDirection}, ${colors.join(', ')})`\n const backgroundSize = `${size}% ${size}%`\n\n return {\n background,\n backgroundSize,\n animation: isAnimating ? `gradientShift ${duration}ms ${easing} infinite` : 'none',\n backgroundPosition: isAnimating ? undefined : `${motionProgress}% 50%`\n } as React.CSSProperties\n }, [colors, direction, size, duration, easing, isAnimating, motionProgress])\n\n const start = useCallback(() => {\n setIsAnimating(true)\n }, [])\n\n const pause = useCallback(() => {\n setIsAnimating(false)\n }, [])\n\n const resume = useCallback(() => {\n setIsAnimating(true)\n }, [])\n\n const reset = useCallback(() => {\n setIsAnimating(false)\n setMotionProgress(0)\n }, [])\n\n const stop = useCallback(() => {\n setIsAnimating(false)\n }, [])\n\n useEffect(() => {\n if (!isAnimating) {\n const interval = setInterval(() => {\n setMotionProgress(prev => {\n const newProgress = prev + (100 / (duration / 16))\n return newProgress >= 100 ? 0 : newProgress\n })\n }, 16)\n\n return () => clearInterval(interval)\n }\n }, [isAnimating, duration])\n\n useEffect(() => {\n setIsAnimating(autoStart)\n }, [autoStart])\n\n return {\n ref,\n isVisible,\n isAnimating,\n style,\n progress: motionProgress / 100,\n start,\n pause,\n resume,\n reset,\n stop\n }\n}\n","import { useRef, useState, useEffect, useCallback, useMemo } from 'react'\nimport { HoverMotionOptions, BaseMotionReturn, MotionElement } from '../types'\nimport { useMotionProfile } from '../profiles/MotionProfileContext'\n\nexport function useHoverMotion<T extends MotionElement = HTMLDivElement>(\n options: HoverMotionOptions = {}\n): BaseMotionReturn<T> & { isHovered: boolean } {\n const profile = useMotionProfile()\n const {\n duration = profile.interaction.hover.duration,\n easing = profile.interaction.hover.easing,\n hoverScale = profile.interaction.hover.scale,\n hoverY = profile.interaction.hover.y,\n hoverOpacity = 1\n } = options\n\n const ref = useRef<T>(null)\n const [isHovered, setIsHovered] = useState(false)\n const [isAnimating, setIsAnimating] = useState(false)\n\n useEffect(() => {\n const element = ref.current\n if (!element) return\n\n const handleMouseEnter = () => {\n setIsHovered(true)\n setIsAnimating(true)\n }\n\n const handleMouseLeave = () => {\n setIsHovered(false)\n setIsAnimating(true)\n }\n\n const handleTransitionEnd = () => {\n setIsAnimating(false)\n }\n\n element.addEventListener('mouseenter', handleMouseEnter)\n element.addEventListener('mouseleave', handleMouseLeave)\n element.addEventListener('transitionend', handleTransitionEnd)\n\n return () => {\n element.removeEventListener('mouseenter', handleMouseEnter)\n element.removeEventListener('mouseleave', handleMouseLeave)\n element.removeEventListener('transitionend', handleTransitionEnd)\n }\n }, [])\n\n const style = useMemo(() => ({\n transform: isHovered\n ? `scale(${hoverScale}) translateY(${hoverY}px)`\n : 'scale(1) translateY(0px)',\n opacity: isHovered ? hoverOpacity : 1,\n transition: `transform ${duration}ms ${easing}, opacity ${duration}ms ${easing}`\n }), [isHovered, hoverScale, hoverY, hoverOpacity, duration, easing])\n\n const start = useCallback(() => {\n setIsHovered(true)\n setIsAnimating(true)\n }, [])\n\n const stop = useCallback(() => {\n setIsAnimating(false)\n }, [])\n\n const reset = useCallback(() => {\n setIsHovered(false)\n setIsAnimating(false)\n }, [])\n\n return {\n ref,\n isVisible: true,\n isAnimating,\n isHovered,\n style,\n progress: isHovered ? 1 : 0,\n start,\n stop,\n reset\n }\n}\n","import { useState, useEffect, useRef, useCallback } from 'react'\n\ninterface ClickToggleOptions {\n initialState?: boolean // 초기 상태\n toggleOnClick?: boolean // 클릭 시 토글 여부\n toggleOnDoubleClick?: boolean // 더블클릭 시 토글 여부\n toggleOnRightClick?: boolean // 우클릭 시 토글 여부\n toggleOnEnter?: boolean // Enter 키로 토글 여부\n toggleOnSpace?: boolean // Space 키로 토글 여부\n autoReset?: boolean // 자동 리셋 여부\n resetDelay?: number // 자동 리셋 지연 시간 (ms)\n preventDefault?: boolean // 기본 이벤트 방지 여부\n stopPropagation?: boolean // 이벤트 전파 중단 여부\n showOnMount?: boolean\n}\n\ninterface ClickToggleReturn {\n isActive: boolean\n mounted: boolean\n toggle: () => void\n activate: () => void\n deactivate: () => void\n reset: () => void\n clickHandlers: {\n onClick?: (event: React.MouseEvent) => void\n onDoubleClick?: (event: React.MouseEvent) => void\n onContextMenu?: (event: React.MouseEvent) => void\n onKeyDown?: (event: React.KeyboardEvent) => void\n }\n}\n\nexport function useClickToggle(options: ClickToggleOptions = {}): ClickToggleReturn {\n const {\n initialState = false,\n toggleOnClick = true,\n toggleOnDoubleClick = false,\n toggleOnRightClick = false,\n toggleOnEnter = true,\n toggleOnSpace = true,\n autoReset = false,\n resetDelay = 3000,\n preventDefault = false,\n stopPropagation = false,\n showOnMount = false\n } = options\n\n const [isActive, setIsActive] = useState(showOnMount ? initialState : false)\n const [mounted, setMounted] = useState(false)\n const resetTimeoutRef = useRef<number | null>(null)\n\n // 하이드레이션 이슈 해결을 위한 mounted 상태 관리\n useEffect(() => {\n setMounted(true)\n }, [])\n\n // 자동 리셋 타이머 관리\n const startResetTimer = useCallback(() => {\n if (!autoReset || resetDelay <= 0) return\n\n // 기존 타이머 클리어\n if (resetTimeoutRef.current !== null) {\n clearTimeout(resetTimeoutRef.current)\n }\n\n // 새 타이머 설정\n resetTimeoutRef.current = window.setTimeout(() => {\n setIsActive(false)\n resetTimeoutRef.current = null\n }, resetDelay)\n }, [autoReset, resetDelay])\n\n // 토글 함수\n const toggle = useCallback(() => {\n if (!mounted) return\n \n setIsActive(prev => {\n const newState = !prev\n \n // 자동 리셋 타이머 시작\n if (newState && autoReset) {\n startResetTimer()\n } else if (!newState && resetTimeoutRef.current !== null) {\n // 비활성화 시 타이머 클리어\n clearTimeout(resetTimeoutRef.current)\n resetTimeoutRef.current = null\n }\n \n return newState\n })\n }, [mounted, autoReset, startResetTimer])\n\n // 활성화 함수\n const activate = useCallback(() => {\n if (!mounted || isActive) return\n \n setIsActive(true)\n if (autoReset) {\n startResetTimer()\n }\n }, [mounted, isActive, autoReset, startResetTimer])\n\n // 비활성화 함수\n const deactivate = useCallback(() => {\n if (!mounted || !isActive) return\n \n setIsActive(false)\n if (resetTimeoutRef.current !== null) {\n clearTimeout(resetTimeoutRef.current)\n resetTimeoutRef.current = null\n }\n }, [mounted, isActive])\n\n // 리셋 함수\n const reset = useCallback(() => {\n setIsActive(initialState)\n if (resetTimeoutRef.current !== null) {\n clearTimeout(resetTimeoutRef.current)\n resetTimeoutRef.current = null\n }\n }, [initialState])\n\n // 클릭 핸들러\n const handleClick = useCallback((event: React.MouseEvent) => {\n if (!toggleOnClick) return\n \n if (preventDefault) event.preventDefault()\n if (stopPropagation) event.stopPropagation()\n \n toggle()\n }, [toggleOnClick, preventDefault, stopPropagation, toggle])\n\n // 더블클릭 핸들러\n const handleDoubleClick = useCallback((event: React.MouseEvent) => {\n if (!toggleOnDoubleClick) return\n \n if (preventDefault) event.preventDefault()\n if (stopPropagation) event.stopPropagation()\n \n toggle()\n }, [toggleOnDoubleClick, preventDefault, stopPropagation, toggle])\n\n // 우클릭 핸들러\n const handleContextMenu = useCallback((event: React.MouseEvent) => {\n if (!toggleOnRightClick) return\n \n if (preventDefault) event.preventDefault()\n if (stopPropagation) event.stopPropagation()\n \n toggle()\n }, [toggleOnRightClick, preventDefault, stopPropagation, toggle])\n\n // 키보드 핸들러\n const handleKeyDown = useCallback((event: React.KeyboardEvent) => {\n const shouldToggle = \n (event.key === 'Enter' && toggleOnEnter) ||\n (event.key === ' ' && toggleOnSpace)\n\n if (!shouldToggle) return\n \n if (preventDefault) event.preventDefault()\n if (stopPropagation) event.stopPropagation()\n \n toggle()\n }, [toggleOnEnter, toggleOnSpace, preventDefault, stopPropagation, toggle])\n\n // 클린업\n useEffect(() => {\n return () => {\n if (resetTimeoutRef.current !== null) {\n clearTimeout(resetTimeoutRef.current)\n }\n }\n }, [])\n\n // 클릭 핸들러 객체 생성\n const clickHandlers = {\n ...(toggleOnClick && { onClick: handleClick }),\n ...(toggleOnDoubleClick && { onDoubleClick: handleDoubleClick }),\n ...(toggleOnRightClick && { onContextMenu: handleContextMenu }),\n ...((toggleOnEnter || toggleOnSpace) && { onKeyDown: handleKeyDown })\n }\n\n return {\n isActive,\n mounted,\n toggle,\n activate,\n deactivate,\n reset,\n clickHandlers\n }\n}\n","import { useState, useEffect, useRef, useCallback } from 'react'\n\ninterface FocusToggleOptions {\n initialState?: boolean // 초기 상태\n toggleOnFocus?: boolean // 포커스 시 토글 여부\n toggleOnBlur?: boolean // 블러 시 토글 여부\n toggleOnFocusIn?: boolean // focusin 이벤트 시 토글 여부\n toggleOnFocusOut?: boolean // focusout 이벤트 시 토글 여부\n autoReset?: boolean // 자동 리셋 여부\n resetDelay?: number // 자동 리셋 지연 시간 (ms)\n preventDefault?: boolean // 기본 이벤트 방지 여부\n stopPropagation?: boolean // 이벤트 전파 중단 여부\n showOnMount?: boolean\n}\n\ninterface FocusToggleReturn {\n isActive: boolean\n mounted: boolean\n toggle: () => void\n activate: () => void\n deactivate: () => void\n reset: () => void\n focusHandlers: {\n onFocus?: (event: React.FocusEvent) => void\n onBlur?: (event: React.FocusEvent) => void\n onFocusIn?: (event: React.FocusEvent) => void\n onFocusOut?: (event: React.FocusEvent) => void\n }\n ref: React.RefObject<HTMLElement | null>\n}\n\nexport function useFocusToggle(options: FocusToggleOptions = {}): FocusToggleReturn {\n const {\n initialState = false,\n toggleOnFocus = true,\n toggleOnBlur = false,\n toggleOnFocusIn = false,\n toggleOnFocusOut = false,\n autoReset = false,\n resetDelay = 3000,\n preventDefault = false,\n stopPropagation = false,\n showOnMount = false\n } = options\n\n const [isActive, setIsActive] = useState(showOnMount ? initialState : false)\n const [mounted, setMounted] = useState(false)\n const resetTimeoutRef = useRef<number | null>(null)\n const elementRef = useRef<HTMLElement>(null)\n\n // 하이드레이션 이슈 해결을 위한 mounted 상태 관리\n useEffect(() => {\n setMounted(true)\n }, [])\n\n // 자동 리셋 타이머 관리\n const startResetTimer = useCallback(() => {\n if (!autoReset || resetDelay <= 0) return\n\n // 기존 타이머 클리어\n if (resetTimeoutRef.current !== null) {\n clearTimeout(resetTimeoutRef.current)\n }\n\n // 새 타이머 설정\n resetTimeoutRef.current = window.setTimeout(() => {\n setIsActive(false)\n resetTimeoutRef.current = null\n }, resetDelay)\n }, [autoReset, resetDelay])\n\n // 토글 함수\n const toggle = useCallback(() => {\n if (!mounted) return\n \n setIsActive(prev => {\n const newState = !prev\n \n // 자동 리셋 타이머 시작\n if (newState && autoReset) {\n startResetTimer()\n } else if (!newState && resetTimeoutRef.current !== null) {\n // 비활성화 시 타이머 클리어\n clearTimeout(resetTimeoutRef.current)\n resetTimeoutRef.current = null\n }\n \n return newState\n })\n }, [mounted, autoReset, startResetTimer])\n\n // 활성화 함수\n const activate = useCallback(() => {\n if (!mounted || isActive) return\n \n setIsActive(true)\n if (autoReset) {\n startResetTimer()\n }\n }, [mounted, isActive, autoReset, startResetTimer])\n\n // 비활성화 함수\n const deactivate = useCallback(() => {\n if (!mounted || !isActive) return\n \n setIsActive(false)\n if (resetTimeoutRef.current !== null) {\n clearTimeout(resetTimeoutRef.current)\n resetTimeoutRef.current = null\n }\n }, [mounted, isActive])\n\n // 리셋 함수\n const reset = useCallback(() => {\n setIsActive(initialState)\n if (resetTimeoutRef.current !== null) {\n clearTimeout(resetTimeoutRef.current)\n resetTimeoutRef.current = null\n }\n }, [initialState])\n\n // 포커스 핸들러\n const handleFocus = useCallback((event: React.FocusEvent) => {\n if (!toggleOnFocus) return\n \n if (preventDefault) event.preventDefault()\n if (stopPropagation) event.stopPropagation()\n \n activate()\n }, [toggleOnFocus, preventDefault, stopPropagation, activate])\n\n // 블러 핸들러\n const handleBlur = useCallback((event: React.FocusEvent) => {\n if (!toggleOnBlur) return\n \n if (preventDefault) event.preventDefault()\n if (stopPropagation) event.stopPropagation()\n \n deactivate()\n }, [toggleOnBlur, preventDefault, stopPropagation, deactivate])\n\n // 포커스 인 핸들러\n const handleFocusIn = useCallback((event: React.FocusEvent) => {\n if (!toggleOnFocusIn) return\n \n if (preventDefault) event.preventDefault()\n if (stopPropagation) event.stopPropagation()\n \n activate()\n }, [toggleOnFocusIn, preventDefault, stopPropagation, activate])\n\n // 포커스 아웃 핸들러\n const handleFocusOut = useCallback((event: React.FocusEvent) => {\n if (!toggleOnFocusOut) return\n \n if (preventDefault) event.preventDefault()\n if (stopPropagation) event.stopPropagation()\n \n deactivate()\n }, [toggleOnFocusOut, preventDefault, stopPropagation, deactivate])\n\n // 클린업\n useEffect(() => {\n return () => {\n if (resetTimeoutRef.current !== null) {\n clearTimeout(resetTimeoutRef.current)\n }\n }\n }, [])\n\n // 포커스 핸들러 객체 생성\n const focusHandlers = {\n ...(toggleOnFocus && { onFocus: handleFocus }),\n ...(toggleOnBlur && { onBlur: handleBlur }),\n ...(toggleOnFocusIn && { onFocusIn: handleFocusIn }),\n ...(toggleOnFocusOut && { onFocusOut: handleFocusOut })\n }\n\n return {\n isActive,\n mounted,\n toggle,\n activate,\n deactivate,\n reset,\n focusHandlers,\n ref: elementRef\n }\n}\n","import { useRef, useEffect, useCallback, useState, useMemo } from 'react'\nimport { ScrollRevealOptions, BaseMotionReturn, MotionElement } from '../types'\nimport { useMotionProfile } from '../profiles/MotionProfileContext'\nimport { observeElement } from '../utils/sharedIntersectionObserver'\n\nexport function useScrollReveal<T extends MotionElement = HTMLDivElement>(\n options: ScrollRevealOptions = {}\n): BaseMotionReturn<T> {\n const profile = useMotionProfile()\n const {\n threshold = profile.base.threshold,\n rootMargin = '0px',\n triggerOnce = profile.base.triggerOnce,\n delay = 0,\n duration = profile.base.duration,\n easing = profile.base.easing,\n motionType = 'fadeIn',\n onComplete,\n onStart,\n onStop,\n onReset\n } = options\n\n const ref = useRef<T>(null)\n const [isVisible, setIsVisible] = useState(false)\n const [isAnimating, setIsAnimating] = useState(false)\n const [hasTriggered, setHasTriggered] = useState(false)\n const [progress, setProgress] = useState(0)\n\n const observerCallback = useCallback((entries: IntersectionObserverEntry[]) => {\n entries.forEach(entry => {\n if (entry.isIntersecting && (!triggerOnce || !hasTriggered)) {\n setIsAnimating(true)\n onStart?.()\n setTimeout(() => {\n setIsVisible(true)\n setHasTriggered(true)\n setProgress(1)\n setIsAnimating(false)\n onComplete?.()\n }, delay)\n }\n })\n }, [triggerOnce, hasTriggered, delay, onStart, onComplete])\n\n useEffect(() => {\n if (!ref.current) return\n\n return observeElement(\n ref.current,\n (entry) => observerCallback([entry]),\n { threshold, rootMargin }\n )\n }, [observerCallback, threshold, rootMargin])\n\n // 프로필에서 거리/스케일 값 가져오기\n const slideDistance = profile.entrance.slide.distance\n const scaleFrom = profile.entrance.scale.from\n\n // 모션 스타일 생성 - duration/easing을 옵션에서 사용\n const style = useMemo(() => {\n const baseTransition = `all ${duration}ms ${easing}`\n\n if (!isVisible) {\n switch (motionType) {\n case 'fadeIn':\n return {\n opacity: 0,\n transition: baseTransition\n }\n case 'slideUp':\n return {\n opacity: 0,\n transform: `translateY(${slideDistance}px)`,\n transition: baseTransition\n }\n case 'slideLeft':\n return {\n opacity: 0,\n transform: `translateX(-${slideDistance}px)`,\n transition: baseTransition\n }\n case 'slideRight':\n return {\n opacity: 0,\n transform: `translateX(${slideDistance}px)`,\n transition: baseTransition\n }\n case 'scaleIn':\n return {\n opacity: 0,\n transform: `scale(${scaleFrom})`,\n transition: baseTransition\n }\n case 'bounceIn':\n return {\n opacity: 0,\n transform: 'scale(0.75)',\n transition: baseTransition\n }\n default:\n return {\n opacity: 0,\n transition: baseTransition\n }\n }\n }\n\n // 보이는 상태일 때\n return {\n opacity: 1,\n transform: 'none',\n transition: baseTransition\n }\n }, [isVisible, motionType, duration, easing, slideDistance, scaleFrom])\n\n const start = useCallback(() => {\n setIsAnimating(true)\n onStart?.()\n setTimeout(() => {\n setIsVisible(true)\n setProgress(1)\n setIsAnimating(false)\n onComplete?.()\n }, delay)\n }, [delay, onStart, onComplete])\n\n const reset = useCallback(() => {\n setIsVisible(false)\n setIsAnimating(false)\n setProgress(0)\n setHasTriggered(false)\n onReset?.()\n }, [onReset])\n\n const stop = useCallback(() => {\n setIsAnimating(false)\n onStop?.()\n }, [onStop])\n\n return {\n ref,\n isVisible,\n isAnimating,\n progress,\n style,\n start,\n reset,\n stop\n }\n}\n","/**\n * Shared Scroll Listener — 공유 스크롤 리스너\n *\n * 모든 스크롤 훅(useScrollProgress, useElementProgress, useScrollToggle 등)이\n * 단 하나의 scroll/resize 리스너를 공유합니다.\n *\n * N개 훅 = 1개 리스너 + 1개 rAF\n *\n * @example\n * ```ts\n * useEffect(() => {\n * const update = () => { ... };\n * update(); // initial\n * return subscribeScroll(update);\n * }, []);\n * ```\n */\n\ntype ScrollCallback = () => void\n\nconst subscribers = new Set<ScrollCallback>()\nlet listening = false\nlet rafId = 0\n\nfunction tick() {\n subscribers.forEach((cb) => cb())\n}\n\nfunction onScroll() {\n cancelAnimationFrame(rafId)\n rafId = requestAnimationFrame(tick)\n}\n\n/**\n * 스크롤 리스너에 콜백 등록.\n * 반환되는 함수를 호출하면 구독 해제.\n * rAF로 배칭되어 한 프레임에 한 번만 실행.\n */\nexport function subscribeScroll(cb: ScrollCallback): () => void {\n subscribers.add(cb)\n\n if (!listening && subscribers.size > 0) {\n window.addEventListener('scroll', onScroll, { passive: true })\n window.addEventListener('resize', onScroll, { passive: true })\n listening = true\n }\n\n return () => {\n subscribers.delete(cb)\n if (listening && subscribers.size === 0) {\n window.removeEventListener('scroll', onScroll)\n window.removeEventListener('resize', onScroll)\n cancelAnimationFrame(rafId)\n listening = false\n }\n }\n}\n","import { useState, useEffect, useRef } from 'react'\nimport { subscribeScroll } from '../utils/sharedScroll'\n\ninterface ScrollProgressOptions {\n target?: number // 전체 스크롤 목표 (기본값: document 전체 높이)\n offset?: number // 시작 오프셋\n showOnMount?: boolean\n}\n\nconst PROGRESS_THRESHOLD = 0.1\n\nexport function useScrollProgress(options: ScrollProgressOptions = {}) {\n const {\n target,\n offset = 0,\n showOnMount = false\n } = options\n\n const [progress, setProgress] = useState(showOnMount ? 0 : 0)\n const [mounted, setMounted] = useState(false)\n const progressRef = useRef(progress)\n\n // 하이드레이션 이슈 해결을 위한 mounted 상태 관리\n useEffect(() => {\n setMounted(true)\n }, [])\n\n useEffect(() => {\n if (!mounted) return\n\n const calculateProgress = () => {\n const scrollTop = window.pageYOffset\n const scrollHeight = target || document.documentElement.scrollHeight - window.innerHeight\n const adjustedScrollTop = Math.max(0, scrollTop - offset)\n\n const next = Math.min(100, Math.max(0, (adjustedScrollTop / scrollHeight) * 100))\n\n if (Math.abs(next - progressRef.current) > PROGRESS_THRESHOLD) {\n progressRef.current = next\n setProgress(next)\n }\n }\n\n // 초기 상태 확인\n calculateProgress()\n\n // 공유 스크롤 리스너 등록 (rAF 배칭 + scroll/resize 공유)\n return subscribeScroll(calculateProgress)\n }, [target, offset, mounted])\n\n return {\n progress,\n mounted\n }\n}\n","import { useState, useEffect, useRef, useCallback } from 'react'\n\ntype MotionState = 'idle' | 'playing' | 'paused' | 'completed' | 'error'\ntype MotionDirection = 'forward' | 'reverse' | 'alternate'\n\ninterface MotionStateOptions {\n initialState?: MotionState\n autoStart?: boolean\n loop?: boolean\n direction?: MotionDirection\n duration?: number\n delay?: number\n showOnMount?: boolean\n}\n\ninterface MotionStateReturn {\n state: MotionState\n direction: MotionDirection\n progress: number // 0-100\n elapsed: number // 경과 시간 (ms)\n remaining: number // 남은 시간 (ms)\n mounted: boolean\n play: () => void\n pause: () => void\n stop: () => void\n reset: () => void\n reverse: () => void\n seek: (progress: number) => void\n setState: (newState: MotionState) => void\n}\n\nexport function useMotionState(options: MotionStateOptions = {}): MotionStateReturn {\n const {\n initialState = 'idle',\n autoStart = false,\n loop = false,\n direction = 'forward',\n duration = 1000,\n delay = 0,\n showOnMount = false\n } = options\n\n const [state, setState] = useState<MotionState>(showOnMount ? initialState : 'idle')\n const [currentDirection, setCurrentDirection] = useState<MotionDirection>(direction)\n const [progress, setProgress] = useState(0)\n const [elapsed, setElapsed] = useState(0)\n const [mounted, setMounted] = useState(false)\n \n const motionRef = useRef<number | null>(null)\n const startTimeRef = useRef<number | null>(null)\n const pauseTimeRef = useRef<number | null>(null)\n const totalPausedTimeRef = useRef(0)\n\n // 하이드레이션 이슈 해결을 위한 mounted 상태 관리\n useEffect(() => {\n setMounted(true)\n }, [])\n\n // 모션 루프\n const animate = useCallback((timestamp: number) => {\n if (!startTimeRef.current) {\n startTimeRef.current = timestamp\n }\n\n const adjustedTimestamp = timestamp - totalPausedTimeRef.current\n const elapsedTime = adjustedTimestamp - startTimeRef.current\n const newElapsed = Math.max(0, elapsedTime - delay)\n \n setElapsed(newElapsed)\n\n // 진행률 계산\n let newProgress = 0\n if (newElapsed >= 0) {\n newProgress = Math.min(100, (newElapsed / duration) * 100)\n }\n\n // 방향에 따른 진행률 조정\n if (currentDirection === 'reverse') {\n newProgress = 100 - newProgress\n } else if (currentDirection === 'alternate') {\n const cycle = Math.floor(newElapsed / duration)\n const cycleProgress = (newElapsed % duration) / duration\n newProgress = cycle % 2 === 0 ? cycleProgress * 100 : (1 - cycleProgress) * 100\n }\n\n setProgress(newProgress)\n\n // 모션 완료 체크\n if (newElapsed >= duration) {\n if (loop) {\n // 루프: 처음부터 다시 시작\n startTimeRef.current = timestamp || performance.now()\n totalPausedTimeRef.current = 0\n setElapsed(0)\n setProgress(currentDirection === 'reverse' ? 100 : 0)\n } else {\n // 완료\n setState('completed')\n setProgress(currentDirection === 'reverse' ? 0 : 100)\n if (motionRef.current) {\n cancelAnimationFrame(motionRef.current)\n motionRef.current = null\n }\n return\n }\n }\n\n // 다음 프레임 요청\n if (state === 'playing') {\n motionRef.current = requestAnimationFrame(animate)\n }\n }, [state, duration, delay, loop, currentDirection])\n\n // 재생 시작\n const play = useCallback(() => {\n if (!mounted) return\n \n if (state === 'completed') {\n // 완료된 상태에서 재생 시 처음부터 시작\n reset()\n }\n\n setState('playing')\n \n if (pauseTimeRef.current) {\n // 일시정지에서 재개\n totalPausedTimeRef.current += performance.now() - pauseTimeRef.current\n pauseTimeRef.current = null\n } else {\n // 새로운 모션 시작\n startTimeRef.current = null\n totalPausedTimeRef.current = 0\n }\n\n if (!motionRef.current) {\n motionRef.current = requestAnimationFrame(animate)\n }\n }, [mounted, state, animate])\n\n // 일시정지\n const pause = useCallback(() => {\n if (state !== 'playing') return\n \n setState('paused')\n pauseTimeRef.current = performance.now()\n \n if (motionRef.current) {\n cancelAnimationFrame(motionRef.current)\n motionRef.current = null\n }\n }, [state])\n\n // 정지\n const stop = useCallback(() => {\n setState('idle')\n setProgress(0)\n setElapsed(0)\n startTimeRef.current = null\n pauseTimeRef.current = null\n totalPausedTimeRef.current = 0\n \n if (motionRef.current) {\n cancelAnimationFrame(motionRef.current)\n motionRef.current = null\n }\n }, [])\n\n // 리셋\n const reset = useCallback(() => {\n setState('idle')\n setProgress(0)\n setElapsed(0)\n setCurrentDirection(direction)\n startTimeRef.current = null\n pauseTimeRef.current = null\n totalPausedTimeRef.current = 0\n \n if (motionRef.current) {\n cancelAnimationFrame(motionRef.current)\n motionRef.current = null\n }\n }, [direction])\n\n // 역방향 전환\n const reverse = useCallback(() => {\n const newDirection: MotionDirection = currentDirection === 'forward' ? 'reverse' : 'forward'\n setCurrentDirection(newDirection)\n \n // 현재 진행률을 역방향으로 조정\n if (state === 'playing') {\n const remainingTime = duration - elapsed\n startTimeRef.current = performance.now() - remainingTime\n totalPausedTimeRef.current = 0\n }\n }, [currentDirection, state, duration, elapsed])\n\n // 특정 진행률로 이동\n const seek = useCallback((targetProgress: number) => {\n const clampedProgress = Math.max(0, Math.min(100, targetProgress))\n setProgress(clampedProgress)\n \n // 경과 시간 계산\n const targetElapsed = currentDirection === 'reverse'\n ? ((100 - clampedProgress) / 100) * duration\n : (clampedProgress / 100) * duration\n \n setElapsed(targetElapsed)\n \n // 모션이 재생 중이면 시간 조정\n if (state === 'playing' && startTimeRef.current) {\n const currentTime = performance.now()\n startTimeRef.current = currentTime - targetElapsed - totalPausedTimeRef.current\n }\n }, [currentDirection, duration, state])\n\n // 상태 직접 설정\n const setMotionState = useCallback((newState: MotionState) => {\n setState(newState)\n \n if (newState === 'playing' && !motionRef.current) {\n motionRef.current = requestAnimationFrame(animate)\n } else if (newState !== 'playing' && motionRef.current) {\n cancelAnimationFrame(motionRef.current)\n motionRef.current = null\n }\n }, [animate])\n\n // 자동 재생\n useEffect(() => {\n if (mounted && autoStart && state === 'idle') {\n play()\n }\n }, [mounted, autoStart, state, play])\n\n // 클린업\n useEffect(() => {\n return () => {\n if (motionRef.current) {\n cancelAnimationFrame(motionRef.current)\n }\n }\n }, [])\n\n return {\n state,\n direction: currentDirection,\n progress,\n elapsed,\n remaining: Math.max(0, duration - elapsed),\n mounted,\n play,\n pause,\n stop,\n reset,\n reverse,\n seek,\n setState: setMotionState\n }\n}\n","import { useRef, useState, useEffect, useCallback, useMemo } from 'react'\nimport { RepeatOptions, BaseMotionReturn, MotionElement } from '../types'\n\nexport function useRepeat<T extends MotionElement = HTMLDivElement>(\n options: RepeatOptions = {}\n): BaseMotionReturn<T> & { isAnimating: boolean } {\n const {\n duration = 1000,\n delay = 0,\n autoStart = true,\n type = 'pulse',\n intensity = 0.1\n } = options\n\n const ref = useRef<T>(null)\n const [scale, setScale] = useState(1)\n const [opacity, setOpacity] = useState(1)\n const [isAnimating, setIsAnimating] = useState(false)\n const [progress, setProgress] = useState(0)\n\n // 타이머 ID들을 ref로 관리하여 cleanup 보장\n const animationTimers = useRef<number[]>([])\n const isRunning = useRef(false)\n\n const clearAllTimers = useCallback(() => {\n animationTimers.current.forEach(id => clearTimeout(id))\n animationTimers.current = []\n }, [])\n\n const addTimer = useCallback((callback: () => void, ms: number): number => {\n const id = window.setTimeout(callback, ms)\n animationTimers.current.push(id)\n return id\n }, [])\n\n const animate = useCallback(() => {\n if (!isRunning.current) return\n\n setIsAnimating(true)\n setProgress(0)\n\n switch (type) {\n case 'pulse':\n setScale(1 + intensity)\n addTimer(() => {\n if (!isRunning.current) return\n setScale(1)\n setProgress(0.5)\n }, duration / 2)\n break\n case 'bounce':\n setScale(1 + intensity)\n addTimer(() => {\n if (!isRunning.current) return\n setScale(1 - intensity)\n setProgress(0.33)\n }, duration / 3)\n addTimer(() => {\n if (!isRunning.current) return\n setScale(1)\n setProgress(0.66)\n }, duration)\n break\n case 'wave':\n setScale(1 + intensity)\n addTimer(() => {\n if (!isRunning.current) return\n setScale(1 - intensity)\n setProgress(0.5)\n }, duration / 2)\n addTimer(() => {\n if (!isRunning.current) return\n setScale(1)\n setProgress(0.75)\n }, duration)\n break\n case 'fade':\n setOpacity(0.5)\n addTimer(() => {\n if (!isRunning.current) return\n setOpacity(1)\n setProgress(0.5)\n }, duration / 2)\n break\n }\n\n // 1사이클 완료 후 다음 반복\n addTimer(() => {\n if (!isRunning.current) return\n setProgress(1)\n setIsAnimating(false)\n // 다음 반복 시작\n animate()\n }, duration)\n }, [type, intensity, duration, addTimer])\n\n const start = useCallback(() => {\n isRunning.current = true\n clearAllTimers()\n if (delay > 0) {\n addTimer(() => animate(), delay)\n } else {\n animate()\n }\n }, [delay, animate, clearAllTimers, addTimer])\n\n const stop = useCallback(() => {\n isRunning.current = false\n clearAllTimers()\n setIsAnimating(false)\n setScale(1)\n setOpacity(1)\n setProgress(0)\n }, [clearAllTimers])\n\n const reset = useCallback(() => {\n stop()\n }, [stop])\n\n useEffect(() => {\n if (autoStart) {\n start()\n }\n return () => {\n isRunning.current = false\n clearAllTimers()\n }\n }, []) // eslint-disable-line react-hooks/exhaustive-deps\n\n const style = useMemo(() => ({\n transform: `scale(${scale})`,\n opacity,\n transition: `transform ${duration / 2}ms ease-in-out, opacity ${duration / 2}ms ease-in-out`\n }), [scale, opacity, duration])\n\n return {\n ref,\n isVisible: true,\n isAnimating,\n style,\n progress,\n start,\n stop,\n reset\n }\n}\n","import { useRef, useState, useCallback, useMemo } from 'react'\nimport { ToggleMotionOptions, InteractionReturn, MotionElement } from '../types'\n\nexport function useToggleMotion<T extends MotionElement = HTMLDivElement>(\n options: ToggleMotionOptions = {}\n): InteractionReturn<T> {\n const { duration = 300, delay = 0, easing = 'ease-in-out' } = options\n\n const ref = useRef<T>(null)\n const [isVisible, setIsVisible] = useState(false)\n const [isAnimating, setIsAnimating] = useState(false)\n\n const show = useCallback(() => {\n setIsVisible(true)\n setIsAnimating(true)\n setTimeout(() => setIsAnimating(false), duration + delay)\n }, [duration, delay])\n\n const hide = useCallback(() => {\n setIsVisible(false)\n setIsAnimating(true)\n setTimeout(() => setIsAnimating(false), duration + delay)\n }, [duration, delay])\n\n const toggle = useCallback(() => {\n if (isVisible) {\n hide()\n } else {\n show()\n }\n }, [isVisible, show, hide])\n\n const start = useCallback(() => show(), [show])\n const stop = useCallback(() => setIsAnimating(false), [])\n const reset = useCallback(() => {\n setIsVisible(false)\n setIsAnimating(false)\n }, [])\n\n const style = useMemo(() => ({\n opacity: isVisible ? 1 : 0,\n transform: isVisible\n ? 'translateY(0) scale(1)'\n : 'translateY(10px) scale(0.95)',\n transition: `opacity ${duration}ms ${easing} ${delay}ms, transform ${duration}ms ${easing} ${delay}ms`\n }), [isVisible, duration, easing, delay])\n\n return {\n ref,\n isVisible,\n isAnimating,\n style,\n progress: isVisible ? 1 : 0,\n start,\n stop,\n reset,\n toggle,\n show,\n hide\n }\n}\n","import { SlideOptions, BaseMotionReturn, MotionElement } from '../types'\nimport { useSlideUp } from './useSlideUp'\n\n/**\n * useSlideDown - 아래에서 위로 슬라이드하며 나타나는 애니메이션 훅\n *\n * useSlideUp의 wrapper로, direction: 'down'을 기본값으로 사용합니다.\n * IntersectionObserver를 통해 뷰포트 진입 시 자동으로 애니메이션이 시작됩니다.\n *\n * @example\n * ```tsx\n * const slideDown = useSlideDown({ duration: 700, distance: 50 });\n *\n * return (\n * <div ref={slideDown.ref} style={slideDown.style}>\n * Content slides down into view\n * </div>\n * );\n * ```\n */\nexport function useSlideDown<T extends MotionElement = HTMLDivElement>(\n options: Omit<SlideOptions, 'direction'> = {}\n): BaseMotionReturn<T> {\n return useSlideUp<T>({ ...options, direction: 'down' })\n}\n","import { useRef, useState, useEffect, useCallback } from 'react'\nimport { InViewOptions, InViewReturn } from '../types'\nimport { observeElement } from '../utils/sharedIntersectionObserver'\n\n/**\n * useInView - 요소의 뷰포트 가시성 감지 훅\n * Viewport visibility detection hook\n *\n * @description\n * Intersection Observer를 사용하여 요소가 뷰포트에 보이는지 감지.\n * 스크롤 애니메이션, 레이지 로딩 등에 활용.\n * Detects whether an element is visible in the viewport using Intersection Observer.\n * Useful for scroll animations, lazy loading, etc.\n *\n * @example\n * ```tsx\n * const { ref, inView } = useInView({ threshold: 0.5, triggerOnce: true })\n *\n * return (\n * <div ref={ref} style={{ opacity: inView ? 1 : 0 }}>\n * {inView ? 'Visible!' : 'Not visible'}\n * </div>\n * )\n * ```\n */\nexport function useInView<T extends HTMLElement = HTMLDivElement>(\n options: InViewOptions = {}\n): InViewReturn<T> {\n const {\n threshold = 0,\n rootMargin = '0px',\n triggerOnce = false,\n initialInView = false\n } = options\n\n const ref = useRef<T>(null)\n const [inView, setInView] = useState(initialInView)\n const [entry, setEntry] = useState<IntersectionObserverEntry | null>(null)\n const frozenRef = useRef(false)\n\n const handleIntersect = useCallback(\n (entries: IntersectionObserverEntry[]) => {\n const [observerEntry] = entries\n\n if (frozenRef.current) return\n\n setEntry(observerEntry)\n setInView(observerEntry.isIntersecting)\n\n if (triggerOnce && observerEntry.isIntersecting) {\n frozenRef.current = true\n }\n },\n [triggerOnce]\n )\n\n useEffect(() => {\n const element = ref.current\n if (!element) return\n\n return observeElement(\n element,\n (entry) => handleIntersect([entry]),\n { threshold, rootMargin }\n )\n }, [threshold, rootMargin, handleIntersect])\n\n return {\n ref,\n inView,\n entry\n }\n}\n","import { useState, useEffect, useCallback, useRef } from 'react'\nimport { MouseOptions, MouseReturn } from '../types'\n\n/**\n * useMouse - 마우스 위치 추적 훅\n * Mouse position tracking hook\n *\n * @description\n * 마우스 위치를 실시간으로 추적. 커서 따라다니는 효과,\n * 마우스 기반 인터랙션 등에 활용.\n * Tracks mouse position in real-time. Useful for cursor-following effects\n * and mouse-based interactions.\n *\n * @example\n * ```tsx\n * const { x, y, elementX, elementY } = useMouse()\n *\n * return (\n * <div style={{\n * '--mouse-x': elementX,\n * '--mouse-y': elementY\n * }}>\n * Mouse: {x}, {y}\n * </div>\n * )\n * ```\n */\nexport function useMouse(options: MouseOptions = {}): MouseReturn {\n const { targetRef, throttle = 0 } = options\n\n const [state, setState] = useState<MouseReturn>({\n x: 0,\n y: 0,\n elementX: 0,\n elementY: 0,\n isOver: false\n })\n\n const lastUpdateRef = useRef(0)\n const rafIdRef = useRef<number | null>(null)\n\n const updateMousePosition = useCallback(\n (clientX: number, clientY: number, isOver: boolean) => {\n const now = Date.now()\n\n if (throttle > 0 && now - lastUpdateRef.current < throttle) {\n return\n }\n\n lastUpdateRef.current = now\n\n let elementX = 0\n let elementY = 0\n\n if (targetRef?.current) {\n const rect = targetRef.current.getBoundingClientRect()\n elementX = (clientX - rect.left) / rect.width\n elementY = (clientY - rect.top) / rect.height\n\n // 0-1 범위로 클램프\n elementX = Math.max(0, Math.min(1, elementX))\n elementY = Math.max(0, Math.min(1, elementY))\n }\n\n setState({\n x: clientX,\n y: clientY,\n elementX,\n elementY,\n isOver\n })\n },\n [targetRef, throttle]\n )\n\n useEffect(() => {\n const target = targetRef?.current\n\n const handleMouseMove = (e: MouseEvent) => {\n if (rafIdRef.current) {\n cancelAnimationFrame(rafIdRef.current)\n }\n\n rafIdRef.current = requestAnimationFrame(() => {\n const isOver = target\n ? target.contains(e.target as Node)\n : true\n\n updateMousePosition(e.clientX, e.clientY, isOver)\n })\n }\n\n const handleMouseEnter = () => {\n setState((prev: MouseReturn) => ({ ...prev, isOver: true }))\n }\n\n const handleMouseLeave = () => {\n setState((prev: MouseReturn) => ({ ...prev, isOver: false }))\n }\n\n if (target) {\n target.addEventListener('mousemove', handleMouseMove)\n target.addEventListener('mouseenter', handleMouseEnter)\n target.addEventListener('mouseleave', handleMouseLeave)\n } else {\n window.addEventListener('mousemove', handleMouseMove)\n }\n\n return () => {\n if (rafIdRef.current) {\n cancelAnimationFrame(rafIdRef.current)\n }\n\n if (target) {\n target.removeEventListener('mousemove', handleMouseMove)\n target.removeEventListener('mouseenter', handleMouseEnter)\n target.removeEventListener('mouseleave', handleMouseLeave)\n } else {\n window.removeEventListener('mousemove', handleMouseMove)\n }\n }\n }, [targetRef, updateMousePosition])\n\n return state\n}\n","import { useState, useEffect } from 'react'\nimport { ReducedMotionReturn } from '../types'\n\n/**\n * useReducedMotion - 모션 감소 설정 감지 훅\n * Reduced motion preference detection hook\n *\n * @description\n * 사용자의 prefers-reduced-motion 설정을 감지.\n * 접근성을 위해 모션을 줄이거나 비활성화할 때 사용.\n * Detects user's prefers-reduced-motion setting.\n * Used to reduce or disable motion for accessibility.\n *\n * @example\n * ```tsx\n * const { prefersReducedMotion } = useReducedMotion()\n *\n * return (\n * <motion.div\n * animate={prefersReducedMotion ? {} : { scale: [1, 1.1, 1] }}\n * transition={{ duration: prefersReducedMotion ? 0 : 0.3 }}\n * >\n * Accessible Motion\n * </motion.div>\n * )\n * ```\n */\nexport function useReducedMotion(): ReducedMotionReturn {\n const [prefersReducedMotion, setPrefersReducedMotion] = useState(false)\n\n useEffect(() => {\n // SSR 대응\n if (typeof window === 'undefined') return\n\n const mediaQuery = window.matchMedia('(prefers-reduced-motion: reduce)')\n\n // 초기값 설정\n setPrefersReducedMotion(mediaQuery.matches)\n\n // 변경 감지\n const handleChange = (event: MediaQueryListEvent) => {\n setPrefersReducedMotion(event.matches)\n }\n\n mediaQuery.addEventListener('change', handleChange)\n\n return () => {\n mediaQuery.removeEventListener('change', handleChange)\n }\n }, [])\n\n return {\n prefersReducedMotion\n }\n}\n","import { useState, useEffect, useRef, useCallback } from 'react'\nimport { WindowSizeOptions, WindowSizeReturn } from '../types'\n\n/**\n * useWindowSize - 윈도우 크기 추적 훅\n * Window size tracking hook\n *\n * @description\n * 브라우저 윈도우 크기 변경을 감지.\n * 반응형 레이아웃, 리사이즈 기반 애니메이션 등에 활용.\n * Detects browser window size changes.\n * Useful for responsive layouts and resize-based animations.\n *\n * @example\n * ```tsx\n * const { width, height, isMounted } = useWindowSize({ debounce: 100 })\n *\n * return (\n * <div>\n * {isMounted ? `${width} x ${height}` : 'Loading...'}\n * </div>\n * )\n * ```\n */\nexport function useWindowSize(options: WindowSizeOptions = {}): WindowSizeReturn {\n const {\n debounce = 100,\n initialWidth = 0,\n initialHeight = 0\n } = options\n\n const [state, setState] = useState<WindowSizeReturn>({\n width: initialWidth,\n height: initialHeight,\n isMounted: false\n })\n\n const timeoutRef = useRef<number | null>(null)\n\n const updateSize = useCallback(() => {\n if (typeof window === 'undefined') return\n\n setState({\n width: window.innerWidth,\n height: window.innerHeight,\n isMounted: true\n })\n }, [])\n\n const handleResize = useCallback(() => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current)\n }\n\n if (debounce > 0) {\n timeoutRef.current = window.setTimeout(updateSize, debounce)\n } else {\n updateSize()\n }\n }, [debounce, updateSize])\n\n useEffect(() => {\n // 초기값 설정\n updateSize()\n\n window.addEventListener('resize', handleResize)\n\n return () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current)\n }\n window.removeEventListener('resize', handleResize)\n }\n }, [handleResize, updateSize])\n\n return state\n}\n","import { useState, useEffect, useRef, useCallback } from 'react'\n\ninterface GestureOptions {\n // 기본 설정\n enabled?: boolean // 제스처 활성화 여부\n threshold?: number // 제스처 인식 임계값\n timeout?: number // 제스처 타임아웃 (ms)\n \n // 스와이프 설정\n swipeThreshold?: number // 스와이프 최소 거리\n swipeVelocity?: number // 스와이프 최소 속도\n swipeDirections?: ('up' | 'down' | 'left' | 'right')[] // 허용할 스와이프 방향\n \n // 핀치 설정\n pinchThreshold?: number // 핀치 최소 거리 변화\n minScale?: number // 최소 스케일\n maxScale?: number // 최대 스케일\n \n // 로테이트 설정\n rotateThreshold?: number // 로테이트 최소 각도\n \n // 팬 설정\n panThreshold?: number // 팬 최소 거리\n \n // 콜백 함수들\n onSwipe?: (direction: 'up' | 'down' | 'left' | 'right', distance: number, velocity: number) => void\n onPinch?: (scale: number, delta: number) => void\n onRotate?: (angle: number, delta: number) => void\n onPan?: (deltaX: number, deltaY: number, totalX: number, totalY: number) => void\n onTap?: (x: number, y: number) => void\n onDoubleTap?: (x: number, y: number) => void\n onLongPress?: (x: number, y: number) => void\n onStart?: (x: number, y: number) => void\n onMove?: (x: number, y: number) => void\n onEnd?: (x: number, y: number) => void\n}\n\ninterface GestureState {\n isActive: boolean\n startX: number\n startY: number\n currentX: number\n currentY: number\n deltaX: number\n deltaY: number\n distance: number\n velocity: number\n startTime: number\n currentTime: number\n scale: number\n rotation: number\n startDistance: number\n startAngle: number\n touchCount: number\n}\n\ninterface GestureReturn {\n // 상태\n isActive: boolean\n gesture: string | null\n scale: number\n rotation: number\n deltaX: number\n deltaY: number\n distance: number\n velocity: number\n \n // 제어\n start: () => void\n stop: () => void\n reset: () => void\n \n // 이벤트 핸들러\n onTouchStart: (e: React.TouchEvent | TouchEvent) => void\n onTouchMove: (e: React.TouchEvent | TouchEvent) => void\n onTouchEnd: (e: React.TouchEvent | TouchEvent) => void\n onMouseDown: (e: React.MouseEvent | MouseEvent) => void\n onMouseMove: (e: React.MouseEvent | MouseEvent) => void\n onMouseUp: (e: React.MouseEvent | MouseEvent) => void\n}\n\nexport function useGesture(options: GestureOptions = {}): GestureReturn {\n const {\n enabled = true,\n threshold = 10,\n timeout = 300,\n swipeThreshold = 50,\n swipeVelocity = 0.3,\n swipeDirections = ['up', 'down', 'left', 'right'],\n pinchThreshold = 10,\n minScale = 0.1,\n maxScale = 10,\n rotateThreshold = 5,\n panThreshold = 10,\n onSwipe,\n onPinch,\n onRotate,\n onPan,\n onTap,\n onDoubleTap,\n onLongPress,\n onStart,\n onMove,\n onEnd\n } = options\n\n const [isActive, setIsActive] = useState(false)\n const [gesture, setGesture] = useState<string | null>(null)\n const [scale, setScale] = useState(1)\n const [rotation, setRotation] = useState(0)\n const [deltaX, setDeltaX] = useState(0)\n const [deltaY, setDeltaY] = useState(0)\n const [distance, setDistance] = useState(0)\n const [velocity, setVelocity] = useState(0)\n\n const stateRef = useRef<GestureState>({\n isActive: false,\n startX: 0,\n startY: 0,\n currentX: 0,\n currentY: 0,\n deltaX: 0,\n deltaY: 0,\n distance: 0,\n velocity: 0,\n startTime: 0,\n currentTime: 0,\n scale: 1,\n rotation: 0,\n startDistance: 0,\n startAngle: 0,\n touchCount: 0\n })\n\n const timeoutRef = useRef<number | null>(null)\n const longPressRef = useRef<number | null>(null)\n const lastTapRef = useRef<number>(0)\n\n // 두 점 사이의 거리 계산\n const getDistance = useCallback((x1: number, y1: number, x2: number, y2: number): number => {\n return Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2))\n }, [])\n\n // 두 점 사이의 각도 계산\n const getAngle = useCallback((x1: number, y1: number, x2: number, y2: number): number => {\n return Math.atan2(y2 - y1, x2 - x1) * 180 / Math.PI\n }, [])\n\n // 스와이프 방향 판단\n const getSwipeDirection = useCallback((deltaX: number, deltaY: number): 'up' | 'down' | 'left' | 'right' | null => {\n const absX = Math.abs(deltaX)\n const absY = Math.abs(deltaY)\n \n if (absX > absY) {\n return deltaX > 0 ? 'right' : 'left'\n } else {\n return deltaY > 0 ? 'down' : 'up'\n }\n }, [])\n\n // 제스처 시작\n const startGesture = useCallback((x: number, y: number, touchCount: number = 1) => {\n if (!enabled) return\n\n const now = performance.now()\n stateRef.current = {\n ...stateRef.current,\n isActive: true,\n startX: x,\n startY: y,\n currentX: x,\n currentY: y,\n deltaX: 0,\n deltaY: 0,\n distance: 0,\n velocity: 0,\n startTime: now,\n currentTime: now,\n touchCount\n }\n\n setIsActive(true)\n setGesture(null)\n onStart?.(x, y)\n\n // 롱프레스 타이머\n if (onLongPress) {\n longPressRef.current = window.setTimeout(() => {\n onLongPress(x, y)\n }, 500)\n }\n }, [enabled, onStart, onLongPress])\n\n // 제스처 업데이트\n const updateGesture = useCallback((x: number, y: number, touches?: Touch[]) => {\n if (!enabled || !stateRef.current.isActive) return\n\n const now = performance.now()\n const state = stateRef.current\n const deltaX = x - state.startX\n const deltaY = y - state.startY\n const distance = getDistance(state.startX, state.startY, x, y)\n const velocity = distance / (now - state.startTime) * 1000\n\n state.currentX = x\n state.currentY = y\n state.deltaX = deltaX\n state.deltaY = deltaY\n state.distance = distance\n state.velocity = velocity\n state.currentTime = now\n\n setDeltaX(deltaX)\n setDeltaY(deltaY)\n setDistance(distance)\n setVelocity(velocity)\n\n // 멀티터치 제스처 (핀치/로테이트)\n if (touches && touches.length === 2) {\n const touch1 = touches[0]\n const touch2 = touches[1]\n \n const currentDistance = getDistance(touch1.clientX, touch1.clientY, touch2.clientX, touch2.clientY)\n const currentAngle = getAngle(touch1.clientX, touch1.clientY, touch2.clientX, touch2.clientY)\n \n if (state.startDistance === 0) {\n state.startDistance = currentDistance\n state.startAngle = currentAngle\n } else {\n // 핀치\n const scaleDelta = currentDistance / state.startDistance\n const newScale = Math.max(minScale, Math.min(maxScale, scale * scaleDelta))\n \n if (Math.abs(scaleDelta - 1) * 100 > pinchThreshold) {\n setScale(newScale)\n setGesture('pinch')\n onPinch?.(newScale, scaleDelta - 1)\n }\n\n // 로테이트\n const angleDelta = currentAngle - state.startAngle\n if (Math.abs(angleDelta) > rotateThreshold) {\n const newRotation = rotation + angleDelta\n setRotation(newRotation)\n setGesture('rotate')\n onRotate?.(newRotation, angleDelta)\n }\n }\n }\n\n // 팬 제스처\n if (distance > panThreshold) {\n setGesture('pan')\n onPan?.(deltaX, deltaY, x - state.startX, y - state.startY)\n }\n\n onMove?.(x, y)\n }, [enabled, getDistance, getAngle, scale, rotation, minScale, maxScale, pinchThreshold, rotateThreshold, panThreshold, onPinch, onRotate, onPan, onMove])\n\n // 제스처 종료\n const endGesture = useCallback((x: number, y: number) => {\n if (!enabled || !stateRef.current.isActive) return\n\n const state = stateRef.current\n const now = performance.now()\n const deltaX = x - state.startX\n const deltaY = y - state.startY\n const distance = getDistance(state.startX, state.startY, x, y)\n const velocity = distance / (now - state.startTime) * 1000\n\n // 롱프레스 타이머 정리\n if (longPressRef.current) {\n clearTimeout(longPressRef.current)\n longPressRef.current = null\n }\n\n // 스와이프 판단\n if (distance > swipeThreshold && velocity > swipeVelocity) {\n const direction = getSwipeDirection(deltaX, deltaY)\n if (direction && swipeDirections.includes(direction)) {\n setGesture(`swipe-${direction}`)\n onSwipe?.(direction, distance, velocity)\n }\n }\n\n // 탭 판단\n if (distance < threshold && (now - state.startTime) < timeout) {\n const timeSinceLastTap = now - lastTapRef.current\n if (timeSinceLastTap < 300) {\n // 더블 탭\n onDoubleTap?.(x, y)\n lastTapRef.current = 0\n } else {\n // 싱글 탭\n onTap?.(x, y)\n lastTapRef.current = now\n }\n }\n\n state.isActive = false\n setIsActive(false)\n onEnd?.(x, y)\n\n // 상태 리셋\n timeoutRef.current = window.setTimeout(() => {\n setGesture(null)\n setDeltaX(0)\n setDeltaY(0)\n setDistance(0)\n setVelocity(0)\n }, 100)\n }, [enabled, getDistance, getSwipeDirection, swipeThreshold, swipeVelocity, swipeDirections, threshold, timeout, onSwipe, onTap, onDoubleTap, onEnd])\n\n // 터치 이벤트 핸들러\n // Note: e.preventDefault()는 passive event listener에서 경고 유발 가능\n // 실제 사용 시 onTouchStart 등에 { passive: false } 옵션 필요\n const onTouchStart = useCallback((e: React.TouchEvent | TouchEvent) => {\n // cancelable 체크 후 preventDefault 호출 (passive listener 경고 방지)\n if (e.cancelable) {\n e.preventDefault()\n }\n const touch = e.touches[0]\n startGesture(touch.clientX, touch.clientY, e.touches.length)\n }, [startGesture])\n\n const onTouchMove = useCallback((e: React.TouchEvent | TouchEvent) => {\n if (e.cancelable) {\n e.preventDefault()\n }\n const touch = e.touches[0]\n updateGesture(touch.clientX, touch.clientY, Array.from(e.touches) as Touch[])\n }, [updateGesture])\n\n const onTouchEnd = useCallback((e: React.TouchEvent | TouchEvent) => {\n if (e.cancelable) {\n e.preventDefault()\n }\n const touch = e.changedTouches[0]\n endGesture(touch.clientX, touch.clientY)\n }, [endGesture])\n\n // 마우스 이벤트 핸들러\n const onMouseDown = useCallback((e: React.MouseEvent | MouseEvent) => {\n e.preventDefault()\n startGesture(e.clientX, e.clientY, 1)\n }, [startGesture])\n\n const onMouseMove = useCallback((e: React.MouseEvent | MouseEvent) => {\n e.preventDefault()\n updateGesture(e.clientX, e.clientY)\n }, [updateGesture])\n\n const onMouseUp = useCallback((e: React.MouseEvent | MouseEvent) => {\n e.preventDefault()\n endGesture(e.clientX, e.clientY)\n }, [endGesture])\n\n // 제어 함수들\n const start = useCallback(() => {\n setIsActive(true)\n }, [])\n\n const stop = useCallback(() => {\n setIsActive(false)\n setGesture(null)\n if (longPressRef.current) {\n clearTimeout(longPressRef.current)\n longPressRef.current = null\n }\n }, [])\n\n const reset = useCallback(() => {\n setIsActive(false)\n setGesture(null)\n setScale(1)\n setRotation(0)\n setDeltaX(0)\n setDeltaY(0)\n setDistance(0)\n setVelocity(0)\n if (longPressRef.current) {\n clearTimeout(longPressRef.current)\n longPressRef.current = null\n }\n }, [])\n\n // 클린업\n useEffect(() => {\n return () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current)\n }\n if (longPressRef.current) {\n clearTimeout(longPressRef.current)\n }\n }\n }, [])\n\n return {\n isActive,\n gesture,\n scale,\n rotation,\n deltaX,\n deltaY,\n distance,\n velocity,\n start,\n stop,\n reset,\n onTouchStart,\n onTouchMove,\n onTouchEnd,\n onMouseDown,\n onMouseMove,\n onMouseUp\n }\n} ","import { useRef, useEffect, useState, useCallback } from 'react'\n\ninterface GestureMotionOptions {\n gestureType: 'hover' | 'drag' | 'pinch' | 'swipe' | 'tilt'\n duration?: number\n easing?: string\n sensitivity?: number\n enabled?: boolean\n onGestureStart?: () => void\n onGestureEnd?: () => void\n}\n\ninterface GestureState {\n isActive: boolean\n x: number\n y: number\n deltaX: number\n deltaY: number\n scale: number\n rotation: number\n}\n\nexport function useGestureMotion(options: GestureMotionOptions) {\n const {\n gestureType,\n duration = 300,\n easing = 'ease-out',\n sensitivity = 1,\n enabled = true,\n onGestureStart,\n onGestureEnd\n } = options\n\n const elementRef = useRef<HTMLElement | null>(null)\n const [gestureState, setGestureState] = useState<GestureState>({\n isActive: false,\n x: 0,\n y: 0,\n deltaX: 0,\n deltaY: 0,\n scale: 1,\n rotation: 0\n })\n const [motionStyle, setMotionStyle] = useState<React.CSSProperties>({})\n\n // 제스처 시작점 저장\n const startPoint = useRef<{ x: number; y: number }>({ x: 0, y: 0 })\n const isDragging = useRef(false)\n\n // 모션 스타일 업데이트\n const updateMotionStyle = useCallback(() => {\n if (!enabled) return\n\n const { isActive, deltaX, deltaY, scale, rotation } = gestureState\n \n let transform = ''\n \n switch (gestureType) {\n case 'hover':\n transform = isActive \n ? `scale(${1 + sensitivity * 0.05}) translateY(-${sensitivity * 2}px)`\n : 'scale(1) translateY(0)'\n break\n \n case 'drag':\n transform = isActive\n ? `translate(${deltaX * sensitivity}px, ${deltaY * sensitivity}px)`\n : 'translate(0, 0)'\n break\n \n case 'pinch':\n transform = `scale(${scale})`\n break\n \n case 'swipe':\n transform = isActive\n ? `translateX(${deltaX * sensitivity}px) rotateY(${deltaX * 0.1}deg)`\n : 'translateX(0) rotateY(0)'\n break\n \n case 'tilt':\n transform = isActive\n ? `rotateX(${deltaY * 0.1}deg) rotateY(${deltaX * 0.1}deg)`\n : 'rotateX(0) rotateY(0)'\n break\n }\n\n setMotionStyle({\n transform,\n transition: isActive ? 'none' : `all ${duration}ms ${easing}`,\n cursor: gestureType === 'drag' && isActive ? 'grabbing' : 'pointer'\n })\n }, [gestureState, gestureType, enabled, duration, easing, sensitivity])\n\n // 마우스 이벤트 핸들러\n const handleMouseDown = useCallback((e: MouseEvent) => {\n if (!enabled || gestureType !== 'drag') return\n \n isDragging.current = true\n startPoint.current = { x: e.clientX, y: e.clientY }\n \n setGestureState(prev => ({ ...prev, isActive: true }))\n onGestureStart?.()\n }, [enabled, gestureType, onGestureStart])\n\n const handleMouseMove = useCallback((e: MouseEvent) => {\n if (!enabled || !isDragging.current) return\n\n const deltaX = e.clientX - startPoint.current.x\n const deltaY = e.clientY - startPoint.current.y\n\n setGestureState(prev => ({\n ...prev,\n x: e.clientX,\n y: e.clientY,\n deltaX,\n deltaY\n }))\n }, [enabled])\n\n const handleMouseUp = useCallback(() => {\n if (!enabled) return\n \n isDragging.current = false\n setGestureState(prev => ({ ...prev, isActive: false }))\n onGestureEnd?.()\n }, [enabled, onGestureEnd])\n\n // 호버 이벤트 핸들러\n const handleMouseEnter = useCallback(() => {\n if (!enabled || gestureType !== 'hover') return\n \n setGestureState(prev => ({ ...prev, isActive: true }))\n onGestureStart?.()\n }, [enabled, gestureType, onGestureStart])\n\n const handleMouseLeave = useCallback(() => {\n if (!enabled || gestureType !== 'hover') return\n \n setGestureState(prev => ({ ...prev, isActive: false }))\n onGestureEnd?.()\n }, [enabled, gestureType, onGestureEnd])\n\n // 터치 이벤트 핸들러 (모바일 지원)\n const handleTouchStart = useCallback((e: TouchEvent) => {\n if (!enabled) return\n \n const touch = e.touches[0]\n startPoint.current = { x: touch.clientX, y: touch.clientY }\n \n setGestureState(prev => ({ ...prev, isActive: true }))\n onGestureStart?.()\n }, [enabled, onGestureStart])\n\n const handleTouchMove = useCallback((e: TouchEvent) => {\n if (!enabled) return\n\n const touch = e.touches[0]\n const deltaX = touch.clientX - startPoint.current.x\n const deltaY = touch.clientY - startPoint.current.y\n\n setGestureState(prev => ({\n ...prev,\n x: touch.clientX,\n y: touch.clientY,\n deltaX,\n deltaY\n }))\n }, [enabled])\n\n const handleTouchEnd = useCallback(() => {\n if (!enabled) return\n \n setGestureState(prev => ({ ...prev, isActive: false }))\n onGestureEnd?.()\n }, [enabled, onGestureEnd])\n\n // 이벤트 리스너 등록\n useEffect(() => {\n if (!elementRef.current) return\n\n const element = elementRef.current\n\n // 마우스 이벤트\n if (gestureType === 'hover') {\n element.addEventListener('mouseenter', handleMouseEnter)\n element.addEventListener('mouseleave', handleMouseLeave)\n } else if (gestureType === 'drag') {\n element.addEventListener('mousedown', handleMouseDown)\n document.addEventListener('mousemove', handleMouseMove)\n document.addEventListener('mouseup', handleMouseUp)\n }\n\n // 터치 이벤트\n element.addEventListener('touchstart', handleTouchStart)\n element.addEventListener('touchmove', handleTouchMove)\n element.addEventListener('touchend', handleTouchEnd)\n\n return () => {\n element.removeEventListener('mouseenter', handleMouseEnter)\n element.removeEventListener('mouseleave', handleMouseLeave)\n element.removeEventListener('mousedown', handleMouseDown)\n document.removeEventListener('mousemove', handleMouseMove)\n document.removeEventListener('mouseup', handleMouseUp)\n element.removeEventListener('touchstart', handleTouchStart)\n element.removeEventListener('touchmove', handleTouchMove)\n element.removeEventListener('touchend', handleTouchEnd)\n }\n }, [gestureType, handleMouseEnter, handleMouseLeave, handleMouseDown, handleMouseMove, handleMouseUp, handleTouchStart, handleTouchMove, handleTouchEnd])\n\n // 모션 스타일 업데이트\n useEffect(() => {\n updateMotionStyle()\n }, [updateMotionStyle])\n\n return {\n ref: elementRef,\n gestureState,\n motionStyle,\n isActive: gestureState.isActive\n }\n}\n","import { useRef, useState, useEffect, useCallback } from 'react'\nimport { BaseMotionOptions, BaseMotionReturn, MotionElement } from '../types'\n\nexport interface ButtonEffectOptions extends BaseMotionOptions {\n // 버튼 타입\n type?: 'scale' | 'ripple' | 'glow' | 'shake' | 'bounce' | 'slide' | 'custom'\n \n // 스케일 효과 (scale 타입일 때)\n scaleAmount?: number\n \n // 리플 효과 (ripple 타입일 때)\n rippleColor?: string\n rippleSize?: number\n rippleDuration?: number\n \n // 글로우 효과 (glow 타입일 때)\n glowColor?: string\n glowSize?: number\n glowIntensity?: number\n \n // 흔들림 효과 (shake 타입일 때)\n shakeAmount?: number\n shakeFrequency?: number\n \n // 바운스 효과 (bounce 타입일 때)\n bounceHeight?: number\n bounceStiffness?: number\n \n // 슬라이드 효과 (slide 타입일 때)\n slideDistance?: number\n slideDirection?: 'left' | 'right' | 'up' | 'down'\n \n // 호버 효과\n hoverScale?: number\n hoverRotate?: number\n hoverTranslateY?: number\n hoverTranslateX?: number\n \n // 활성 효과\n activeScale?: number\n activeRotate?: number\n activeTranslateY?: number\n activeTranslateX?: number\n \n // 포커스 효과\n focusScale?: number\n focusGlow?: boolean\n \n // 비활성화 상태\n disabled?: boolean\n disabledOpacity?: number\n \n // 자동 시작\n autoStart?: boolean\n}\n\nexport function useButtonEffect<T extends MotionElement = HTMLButtonElement>(\n options: ButtonEffectOptions = {}\n): BaseMotionReturn<T> & {\n buttonType: string\n isPressed: boolean\n isHovered: boolean\n isFocused: boolean\n ripplePosition: { x: number; y: number }\n currentGlowIntensity: number\n shakeOffset: number\n bounceOffset: number\n slideOffset: number\n pressButton: () => void\n releaseButton: () => void\n setButtonState: (state: 'idle' | 'hover' | 'active' | 'focus' | 'disabled') => void\n} {\n const {\n duration = 200,\n easing = 'ease-out',\n type = 'scale',\n scaleAmount = 0.95,\n rippleColor = 'rgba(255, 255, 255, 0.6)',\n rippleSize = 100,\n rippleDuration = 600,\n glowColor = '#3b82f6',\n glowSize = 20,\n glowIntensity = 0.8,\n shakeAmount = 5,\n shakeFrequency = 10,\n bounceHeight = 10,\n bounceStiffness = 0.3,\n slideDistance = 5,\n slideDirection = 'down',\n hoverScale = 1.05,\n hoverRotate = 0,\n hoverTranslateY = -2,\n hoverTranslateX = 0,\n activeScale = 0.95,\n activeRotate = 0,\n activeTranslateY = 2,\n activeTranslateX = 0,\n focusScale = 1.02,\n focusGlow = true,\n disabled = false,\n disabledOpacity = 0.5,\n autoStart = false,\n onComplete, onStart, onStop, onReset\n } = options\n\n const ref = useRef<T>(null)\n const [isVisible, setIsVisible] = useState(false)\n const [isAnimating, setIsAnimating] = useState(false)\n const [progress, setProgress] = useState(0)\n const [buttonType] = useState(type)\n const [isPressed, setIsPressed] = useState(false)\n const [isHovered, setIsHovered] = useState(false)\n const [isFocused, setIsFocused] = useState(false)\n const [ripplePosition, setRipplePosition] = useState({ x: 0, y: 0 })\n const [currentGlowIntensity, setGlowIntensity] = useState(0)\n const [shakeOffset, setShakeOffset] = useState(0)\n const [bounceOffset, setBounceOffset] = useState(0)\n const [slideOffset, setSlideOffset] = useState(0)\n \n const animationRef = useRef<number | null>(null)\n const startTimeRef = useRef<number>(0)\n\n // 리플 효과 함수\n const createRipple = useCallback((event: React.MouseEvent) => {\n if (!ref.current) return\n\n const rect = ref.current.getBoundingClientRect()\n const x = event.clientX - rect.left\n const y = event.clientY - rect.top\n \n setRipplePosition({ x, y })\n setIsAnimating(true)\n setProgress(0)\n startTimeRef.current = Date.now()\n onStart?.()\n\n const animateRipple = () => {\n const elapsed = Date.now() - startTimeRef.current\n const currentProgress = Math.min(elapsed / rippleDuration, 1)\n \n setProgress(currentProgress)\n\n if (currentProgress < 1) {\n animationRef.current = requestAnimationFrame(animateRipple)\n } else {\n setIsAnimating(false)\n onComplete?.()\n }\n }\n\n animationRef.current = requestAnimationFrame(animateRipple)\n }, [rippleDuration, onStart, onComplete])\n\n // 흔들림 효과 함수\n const shakeButton = useCallback(() => {\n setIsAnimating(true)\n setProgress(0)\n startTimeRef.current = Date.now()\n onStart?.()\n\n const animateShake = () => {\n const elapsed = Date.now() - startTimeRef.current\n const currentProgress = Math.min(elapsed / duration, 1)\n \n setProgress(currentProgress)\n const shake = shakeAmount * Math.sin(currentProgress * Math.PI * 2 * shakeFrequency) * (1 - currentProgress)\n setShakeOffset(shake)\n\n if (currentProgress < 1) {\n animationRef.current = requestAnimationFrame(animateShake)\n } else {\n setIsAnimating(false)\n setShakeOffset(0)\n onComplete?.()\n }\n }\n\n animationRef.current = requestAnimationFrame(animateShake)\n }, [duration, shakeAmount, shakeFrequency, onStart, onComplete])\n\n // 바운스 효과 함수\n const bounceButton = useCallback(() => {\n setIsAnimating(true)\n setProgress(0)\n startTimeRef.current = Date.now()\n onStart?.()\n\n const animateBounce = () => {\n const elapsed = Date.now() - startTimeRef.current\n const currentProgress = Math.min(elapsed / duration, 1)\n \n setProgress(currentProgress)\n const bounce = bounceHeight * Math.sin(currentProgress * Math.PI * bounceStiffness) * Math.exp(-currentProgress * 3)\n setBounceOffset(bounce)\n\n if (currentProgress < 1) {\n animationRef.current = requestAnimationFrame(animateBounce)\n } else {\n setIsAnimating(false)\n setBounceOffset(0)\n onComplete?.()\n }\n }\n\n animationRef.current = requestAnimationFrame(animateBounce)\n }, [duration, bounceHeight, bounceStiffness, onStart, onComplete])\n\n // 슬라이드 효과 함수\n const slideButton = useCallback(() => {\n setIsAnimating(true)\n setProgress(0)\n startTimeRef.current = Date.now()\n onStart?.()\n\n const animateSlide = () => {\n const elapsed = Date.now() - startTimeRef.current\n const currentProgress = Math.min(elapsed / duration, 1)\n \n setProgress(currentProgress)\n const slide = slideDistance * currentProgress\n setSlideOffset(slide)\n\n if (currentProgress < 1) {\n animationRef.current = requestAnimationFrame(animateSlide)\n } else {\n setIsAnimating(false)\n onComplete?.()\n }\n }\n\n animationRef.current = requestAnimationFrame(animateSlide)\n }, [duration, slideDistance, onStart, onComplete])\n\n // 버튼 누르기 함수\n const pressButton = useCallback(() => {\n if (disabled) return\n\n setIsPressed(true)\n \n switch (type) {\n case 'ripple':\n // 리플은 마우스 이벤트로 처리\n break\n case 'shake':\n shakeButton()\n break\n case 'bounce':\n bounceButton()\n break\n case 'slide':\n slideButton()\n break\n default:\n // 기본 스케일 효과\n break\n }\n }, [disabled, type, shakeButton, bounceButton, slideButton])\n\n // 버튼 놓기 함수\n const releaseButton = useCallback(() => {\n setIsPressed(false)\n }, [])\n\n // 버튼 상태 설정 함수\n const setButtonState = useCallback((state: 'idle' | 'hover' | 'active' | 'focus' | 'disabled') => {\n switch (state) {\n case 'hover':\n setIsHovered(true)\n break\n case 'active':\n setIsPressed(true)\n break\n case 'focus':\n setIsFocused(true)\n break\n case 'disabled':\n setIsHovered(false)\n setIsPressed(false)\n setIsFocused(false)\n break\n default:\n setIsHovered(false)\n setIsPressed(false)\n setIsFocused(false)\n break\n }\n }, [])\n\n // 모션 시작 함수\n const start = useCallback(() => {\n if (!isVisible) {\n setIsVisible(true)\n }\n }, [isVisible])\n\n // 모션 중단 함수\n const stop = useCallback(() => {\n setIsAnimating(false)\n if (animationRef.current) {\n cancelAnimationFrame(animationRef.current)\n animationRef.current = null\n }\n onStop?.()\n }, [onStop])\n\n // 모션 리셋 함수\n const reset = useCallback(() => {\n setIsVisible(false)\n setIsAnimating(false)\n setProgress(0)\n setIsPressed(false)\n setIsHovered(false)\n setIsFocused(false)\n setRipplePosition({ x: 0, y: 0 })\n setGlowIntensity(0)\n setShakeOffset(0)\n setBounceOffset(0)\n setSlideOffset(0)\n startTimeRef.current = 0\n if (animationRef.current) {\n cancelAnimationFrame(animationRef.current)\n animationRef.current = null\n }\n onReset?.()\n }, [onReset])\n\n // 모션 일시정지 함수\n const pause = useCallback(() => {\n setIsAnimating(false)\n if (animationRef.current) {\n cancelAnimationFrame(animationRef.current)\n animationRef.current = null\n }\n }, [])\n\n // 모션 재개 함수\n const resume = useCallback(() => {\n if (isVisible && !isAnimating) {\n setIsAnimating(true)\n }\n }, [isVisible, isAnimating])\n\n // 자동 시작\n useEffect(() => {\n if (autoStart) {\n start()\n }\n }, [autoStart, start])\n\n // 컴포넌트 언마운트 시 정리\n useEffect(() => {\n return () => {\n if (animationRef.current) {\n cancelAnimationFrame(animationRef.current)\n }\n }\n }, [])\n\n // 버튼 스타일 계산\n const getButtonStyle = (): React.CSSProperties => {\n let scale = 1\n let rotate = 0\n let translateY = 0\n let translateX = 0\n let boxShadow = 'none'\n\n // 상태별 효과 적용\n if (isPressed) {\n scale = activeScale\n rotate = activeRotate\n translateY = activeTranslateY\n translateX = activeTranslateX\n } else if (isHovered) {\n scale = hoverScale\n rotate = hoverRotate\n translateY = hoverTranslateY\n translateX = hoverTranslateX\n }\n\n if (isFocused && focusGlow) {\n boxShadow = `0 0 ${glowSize}px ${glowColor}`\n }\n\n // 타입별 추가 효과\n switch (type) {\n case 'shake':\n translateX += shakeOffset\n break\n case 'bounce':\n translateY += bounceOffset\n break\n case 'slide':\n if (slideDirection === 'left') translateX -= slideOffset\n else if (slideDirection === 'right') translateX += slideOffset\n else if (slideDirection === 'up') translateY -= slideOffset\n else if (slideDirection === 'down') translateY += slideOffset\n break\n }\n\n const baseStyle: React.CSSProperties = {\n transform: `\n scale(${scale})\n rotate(${rotate}deg)\n translate(${translateX}px, ${translateY}px)\n `,\n boxShadow,\n opacity: disabled ? disabledOpacity : 1,\n transition: `all ${duration}ms ${easing}`,\n willChange: 'transform, box-shadow, opacity',\n cursor: disabled ? 'not-allowed' : 'pointer',\n position: 'relative',\n overflow: 'hidden'\n }\n\n return baseStyle\n }\n\n const style = getButtonStyle()\n\n return {\n ref,\n isVisible,\n isAnimating,\n style,\n progress,\n start,\n stop,\n reset,\n pause,\n resume,\n buttonType: type,\n isPressed,\n isHovered,\n isFocused,\n ripplePosition,\n currentGlowIntensity,\n shakeOffset,\n bounceOffset,\n slideOffset,\n pressButton,\n releaseButton,\n setButtonState\n }\n}\n","import { useRef, useState, useCallback, useEffect } from 'react'\nimport { BaseMotionOptions, InteractionReturn, MotionElement } from '../types'\n\nexport interface VisibilityToggleOptions extends BaseMotionOptions {\n showScale?: number\n showOpacity?: number\n showRotate?: number\n showTranslateY?: number\n showTranslateX?: number\n hideScale?: number\n hideOpacity?: number\n hideRotate?: number\n hideTranslateY?: number\n hideTranslateX?: number\n}\n\nexport function useVisibilityToggle<T extends MotionElement = HTMLDivElement>(\n options: VisibilityToggleOptions = {}\n): InteractionReturn<T> {\n const {\n duration = 300,\n easing = 'ease-out',\n showScale = 1,\n showOpacity = 1,\n showRotate = 0,\n showTranslateY = 0,\n showTranslateX = 0,\n hideScale = 0.8,\n hideOpacity = 0,\n hideRotate = 0,\n hideTranslateY = 20,\n hideTranslateX = 0,\n onComplete, onStart, onStop, onReset\n } = options\n\n const ref = useRef<T>(null)\n const [isVisible, setIsVisible] = useState(false)\n const [isAnimating, setIsAnimating] = useState(false)\n const [progress, setProgress] = useState(0)\n\n // 가시성 토글 함수\n const toggle = useCallback(() => {\n setIsAnimating(true)\n setProgress(0)\n onStart?.()\n\n const newVisibility = !isVisible\n setIsVisible(newVisibility)\n\n // 애니메이션 완료 시\n setTimeout(() => {\n setIsAnimating(false)\n setProgress(1)\n onComplete?.()\n }, duration)\n }, [isVisible, duration, onStart, onComplete])\n\n // 표시 함수\n const show = useCallback(() => {\n if (!isVisible) {\n setIsAnimating(true)\n setProgress(0)\n onStart?.()\n setIsVisible(true)\n\n setTimeout(() => {\n setIsAnimating(false)\n setProgress(1)\n onComplete?.()\n }, duration)\n }\n }, [isVisible, duration, onStart, onComplete])\n\n // 숨김 함수\n const hide = useCallback(() => {\n if (isVisible) {\n setIsAnimating(true)\n setProgress(1)\n onStart?.()\n setIsVisible(false)\n\n setTimeout(() => {\n setIsAnimating(false)\n setProgress(0)\n onComplete?.()\n }, duration)\n }\n }, [isVisible, duration, onStart, onComplete])\n\n // 모션 시작 함수 (프로그래매틱 제어용)\n const start = useCallback(() => {\n if (!isVisible) {\n toggle()\n }\n }, [isVisible, toggle])\n\n // 모션 중단 함수\n const stop = useCallback(() => {\n setIsAnimating(false)\n onStop?.()\n }, [onStop])\n\n // 모션 리셋 함수\n const reset = useCallback(() => {\n setIsVisible(false)\n setIsAnimating(false)\n setProgress(0)\n onReset?.()\n }, [onReset])\n\n // 모션 일시정지 함수\n const pause = useCallback(() => {\n setIsAnimating(false)\n }, [])\n\n // 모션 재개 함수\n const resume = useCallback(() => {\n if (isVisible) {\n setIsAnimating(true)\n }\n }, [isVisible])\n\n // 스타일 계산\n const style: React.CSSProperties = {\n transform: `\n scale(${isVisible ? showScale : hideScale})\n rotate(${isVisible ? showRotate : hideRotate}deg)\n translate(${isVisible ? showTranslateX : hideTranslateX}px, ${isVisible ? showTranslateY : hideTranslateY}px)\n `,\n opacity: isVisible ? showOpacity : hideOpacity,\n transition: `all ${duration}ms ${easing}`,\n willChange: 'transform, opacity'\n }\n\n return {\n ref,\n isVisible,\n isAnimating,\n style,\n progress,\n start,\n stop,\n reset,\n pause,\n resume,\n // 추가 메서드\n toggle,\n show,\n hide\n }\n}\n","import { useRef, useState, useEffect, useCallback } from 'react'\nimport { BaseMotionOptions, BaseMotionReturn, MotionElement } from '../types'\nimport { subscribeScroll } from '../utils/sharedScroll'\n\nexport interface ScrollToggleOptions extends BaseMotionOptions {\n showScale?: number\n showOpacity?: number\n showRotate?: number\n showTranslateY?: number\n showTranslateX?: number\n hideScale?: number\n hideOpacity?: number\n hideRotate?: number\n hideTranslateY?: number\n hideTranslateX?: number\n scrollThreshold?: number\n scrollDirection?: 'up' | 'down' | 'both'\n}\n\nexport function useScrollToggle<T extends MotionElement = HTMLDivElement>(\n options: ScrollToggleOptions = {}\n): BaseMotionReturn<T> {\n const {\n duration = 300,\n easing = 'ease-out',\n showScale = 1,\n showOpacity = 1,\n showRotate = 0,\n showTranslateY = 0,\n showTranslateX = 0,\n hideScale = 0.8,\n hideOpacity = 0,\n hideRotate = 0,\n hideTranslateY = 20,\n hideTranslateX = 0,\n scrollThreshold = 0.1,\n scrollDirection = 'both',\n onComplete, onStart, onStop, onReset\n } = options\n\n const ref = useRef<T>(null)\n const [isVisible, setIsVisible] = useState(false)\n const [isAnimating, setIsAnimating] = useState(false)\n const [progress, setProgress] = useState(0)\n\n // refs for values read inside the stable handleScroll — avoids re-registration on every scroll\n const isVisibleRef = useRef(false)\n const lastScrollYRef = useRef(0)\n\n // keep isVisibleRef in sync with state\n useEffect(() => {\n isVisibleRef.current = isVisible\n }, [isVisible])\n\n // stable callback — depends only on option values (not on isVisible / lastScrollY state)\n const handleScroll = useCallback(() => {\n if (!ref.current) return\n\n const currentScrollY = window.scrollY\n const rect = ref.current.getBoundingClientRect()\n const threshold = window.innerHeight * scrollThreshold\n\n const isScrollingDown = currentScrollY > lastScrollYRef.current\n const isScrollingUp = currentScrollY < lastScrollYRef.current\n\n let shouldToggle = false\n\n if (scrollDirection === 'both') {\n shouldToggle = rect.top <= threshold\n } else if (scrollDirection === 'down' && isScrollingDown) {\n shouldToggle = rect.top <= threshold\n } else if (scrollDirection === 'up' && isScrollingUp) {\n shouldToggle = rect.top <= threshold\n }\n\n if (shouldToggle && !isVisibleRef.current) {\n isVisibleRef.current = true\n setIsVisible(true)\n setIsAnimating(true)\n setProgress(0)\n onStart?.()\n\n setTimeout(() => {\n setIsAnimating(false)\n setProgress(1)\n onComplete?.()\n }, duration)\n } else if (!shouldToggle && isVisibleRef.current) {\n isVisibleRef.current = false\n setIsVisible(false)\n setIsAnimating(true)\n setProgress(1)\n\n setTimeout(() => {\n setIsAnimating(false)\n setProgress(0)\n }, duration)\n }\n\n lastScrollYRef.current = currentScrollY\n }, [scrollDirection, scrollThreshold, duration, onStart, onComplete])\n\n // subscribe to the shared scroll listener\n useEffect(() => {\n handleScroll() // 초기 상태 확인\n return subscribeScroll(handleScroll)\n }, [handleScroll])\n\n // 모션 시작 함수 (프로그래매틱 제어용)\n const start = useCallback(() => {\n if (!isVisibleRef.current) {\n isVisibleRef.current = true\n setIsVisible(true)\n setIsAnimating(true)\n setProgress(0)\n onStart?.()\n\n setTimeout(() => {\n setIsAnimating(false)\n setProgress(1)\n onComplete?.()\n }, duration)\n }\n }, [duration, onStart, onComplete])\n\n // 모션 중단 함수\n const stop = useCallback(() => {\n setIsAnimating(false)\n onStop?.()\n }, [onStop])\n\n // 모션 리셋 함수\n const reset = useCallback(() => {\n isVisibleRef.current = false\n setIsVisible(false)\n setIsAnimating(false)\n setProgress(0)\n onReset?.()\n }, [onReset])\n\n // 모션 일시정지 함수\n const pause = useCallback(() => {\n setIsAnimating(false)\n }, [])\n\n // 모션 재개 함수\n const resume = useCallback(() => {\n if (isVisibleRef.current) {\n setIsAnimating(true)\n }\n }, [])\n\n // 스타일 계산\n const style: React.CSSProperties = {\n transform: `\n scale(${isVisible ? showScale : hideScale})\n rotate(${isVisible ? showRotate : hideRotate}deg)\n translate(${isVisible ? showTranslateX : hideTranslateX}px, ${isVisible ? showTranslateY : hideTranslateY}px)\n `,\n opacity: isVisible ? showOpacity : hideOpacity,\n transition: `all ${duration}ms ${easing}`,\n willChange: 'transform, opacity'\n }\n\n return {\n ref,\n isVisible,\n isAnimating,\n style,\n progress,\n start,\n stop,\n reset,\n pause,\n resume\n }\n}\n","import { useRef, useState, useEffect, useCallback } from 'react'\nimport { BaseMotionOptions, BaseMotionReturn, MotionElement } from '../types'\nimport { observeElement } from '../utils/sharedIntersectionObserver'\n\nexport interface CardListOptions extends BaseMotionOptions {\n staggerDelay?: number\n cardScale?: number\n cardOpacity?: number\n cardRotate?: number\n cardTranslateY?: number\n cardTranslateX?: number\n initialScale?: number\n initialOpacity?: number\n initialRotate?: number\n initialTranslateY?: number\n initialTranslateX?: number\n gridColumns?: number\n gridGap?: number\n}\n\nexport function useCardList<T extends MotionElement = HTMLDivElement>(\n options: CardListOptions = {}\n): BaseMotionReturn<T> & {\n cardStyles: React.CSSProperties[]\n staggerDelay: number\n gridColumns: number\n gridGap: number\n} {\n const {\n duration = 500,\n easing = 'ease-out',\n staggerDelay = 100,\n cardScale = 1,\n cardOpacity = 1,\n cardRotate = 0,\n cardTranslateY = 0,\n cardTranslateX = 0,\n initialScale = 0.8,\n initialOpacity = 0,\n initialRotate = 0,\n initialTranslateY = 30,\n initialTranslateX = 0,\n gridColumns = 3,\n gridGap = 20,\n onComplete, onStart, onStop, onReset\n } = options\n\n const ref = useRef<T>(null)\n const [isVisible, setIsVisible] = useState(false)\n const [isAnimating, setIsAnimating] = useState(false)\n const [progress, setProgress] = useState(0)\n const [cardCount, setCardCount] = useState(0)\n const startRef = useRef<() => void>(() => {})\n\n // 카드 개수 계산\n useEffect(() => {\n if (ref.current) {\n const cards = ref.current.querySelectorAll('[data-card]')\n setCardCount(cards.length)\n }\n }, [])\n\n // 카드 스타일 배열 생성\n const cardStyles = Array.from({ length: cardCount }, (_, index) => {\n const delay = isVisible ? index * staggerDelay : 0\n const isCardVisible = isVisible && delay <= progress * (cardCount * staggerDelay)\n\n return {\n transform: `\n scale(${isCardVisible ? cardScale : initialScale})\n rotate(${isCardVisible ? cardRotate : initialRotate}deg)\n translate(${isCardVisible ? cardTranslateX : initialTranslateX}px, ${isCardVisible ? cardTranslateY : initialTranslateY}px)\n `,\n opacity: isCardVisible ? cardOpacity : initialOpacity,\n transition: `all ${duration}ms ${easing} ${delay}ms`,\n willChange: 'transform, opacity'\n }\n })\n\n // 모션 시작 함수\n const start = useCallback(() => {\n if (isAnimating) return\n\n setIsAnimating(true)\n setProgress(0)\n onStart?.()\n\n // 카드들이 순차적으로 나타나도록\n const totalDuration = cardCount * staggerDelay + duration\n const interval = setInterval(() => {\n setProgress(prev => {\n const newProgress = prev + 0.1\n if (newProgress >= 1) {\n setIsVisible(true)\n setIsAnimating(false)\n onComplete?.()\n clearInterval(interval)\n return 1\n }\n return newProgress\n })\n }, totalDuration / 10)\n }, [isAnimating, cardCount, staggerDelay, duration, onStart, onComplete])\n\n // startRef 업데이트 (IntersectionObserver에서 안정적인 참조 사용)\n startRef.current = start\n\n // 모션 중단 함수\n const stop = useCallback(() => {\n setIsAnimating(false)\n onStop?.()\n }, [onStop])\n\n // 모션 리셋 함수\n const reset = useCallback(() => {\n setIsVisible(false)\n setIsAnimating(false)\n setProgress(0)\n onReset?.()\n }, [onReset])\n\n // 모션 일시정지 함수\n const pause = useCallback(() => {\n setIsAnimating(false)\n }, [])\n\n // 모션 재개 함수\n const resume = useCallback(() => {\n if (!isVisible && !isAnimating) {\n start()\n }\n }, [isVisible, isAnimating, start])\n\n // Intersection Observer 설정 (공유 observer pool 사용)\n useEffect(() => {\n if (!ref.current) return\n return observeElement(\n ref.current,\n (entry) => { if (entry.isIntersecting) startRef.current() },\n { threshold: 0.1 }\n )\n }, [])\n\n // 그리드 스타일\n const gridStyle: React.CSSProperties = {\n display: 'grid',\n gridTemplateColumns: `repeat(${gridColumns}, 1fr)`,\n gap: `${gridGap}px`,\n width: '100%'\n }\n\n return {\n ref,\n isVisible,\n isAnimating,\n style: gridStyle,\n progress,\n start,\n stop,\n reset,\n pause,\n resume,\n cardStyles,\n staggerDelay,\n gridColumns,\n gridGap\n }\n}\n","import { useRef, useState, useEffect, useCallback } from 'react'\nimport { BaseMotionOptions, BaseMotionReturn, MotionElement } from '../types'\n\nexport interface LoadingSpinnerOptions extends BaseMotionOptions {\n // 스피너 타입\n type?: 'rotate' | 'pulse' | 'bounce' | 'wave' | 'dots' | 'bars' | 'custom'\n \n // 회전 속도 (rotate 타입일 때)\n rotationSpeed?: number\n \n // 펄스 속도 (pulse 타입일 때)\n pulseSpeed?: number\n \n // 바운스 높이 (bounce 타입일 때)\n bounceHeight?: number\n \n // 웨이브 개수 (wave 타입일 때)\n waveCount?: number\n \n // 점 개수 (dots 타입일 때)\n dotCount?: number\n \n // 바 개수 (bars 타입일 때)\n barCount?: number\n \n // 색상\n color?: string\n backgroundColor?: string\n \n // 크기\n size?: number\n \n // 두께\n thickness?: number\n \n // 자동 시작\n autoStart?: boolean\n \n // 무한 반복\n infinite?: boolean\n}\n\nexport function useLoadingSpinner<T extends MotionElement = HTMLDivElement>(\n options: LoadingSpinnerOptions = {}\n): BaseMotionReturn<T> & {\n isLoading: boolean\n spinnerType: string\n rotationAngle: number\n pulseScale: number\n bounceOffset: number\n waveProgress: number\n dotProgress: number\n barProgress: number\n startLoading: () => void\n stopLoading: () => void\n setLoadingState: (loading: boolean) => void\n} {\n const {\n duration = 1000,\n easing = 'linear',\n type = 'rotate',\n rotationSpeed = 1,\n pulseSpeed = 1,\n bounceHeight = 20,\n waveCount = 3,\n dotCount = 3,\n barCount = 4,\n color = '#3b82f6',\n backgroundColor = 'transparent',\n size = 40,\n thickness = 4,\n autoStart = true,\n infinite = true,\n onComplete, onStart, onStop, onReset\n } = options\n\n const ref = useRef<T>(null)\n const [isVisible, setIsVisible] = useState(false)\n const [isAnimating, setIsAnimating] = useState(false)\n const [progress, setProgress] = useState(0)\n const [isLoading, setIsLoading] = useState(false)\n const [rotationAngle, setRotationAngle] = useState(0)\n const [pulseScale, setPulseScale] = useState(1)\n const [bounceOffset, setBounceOffset] = useState(0)\n const [waveProgress, setWaveProgress] = useState(0)\n const [dotProgress, setDotProgress] = useState(0)\n const [barProgress, setBarProgress] = useState(0)\n \n const animationRef = useRef<number | null>(null)\n const startTimeRef = useRef<number>(0)\n\n // 애니메이션 루프 함수\n const runAnimation = useCallback(() => {\n if (!isAnimating) return\n\n const animate = (currentTime: number) => {\n if (!isAnimating) return\n\n if (!startTimeRef.current) {\n startTimeRef.current = currentTime\n }\n\n const elapsed = currentTime - startTimeRef.current\n const currentProgress = (elapsed / duration) % 1\n \n setProgress(currentProgress)\n\n // 타입별 애니메이션 업데이트\n switch (type) {\n case 'rotate':\n setRotationAngle(currentProgress * 360 * rotationSpeed)\n break\n case 'pulse':\n setPulseScale(0.8 + 0.4 * Math.sin(currentProgress * Math.PI * 2 * pulseSpeed))\n break\n case 'bounce':\n setBounceOffset(bounceHeight * Math.sin(currentProgress * Math.PI * 2))\n break\n case 'wave':\n setWaveProgress(currentProgress)\n break\n case 'dots':\n setDotProgress(currentProgress)\n break\n case 'bars':\n setBarProgress(currentProgress)\n break\n }\n\n if (infinite || currentProgress < 1) {\n animationRef.current = requestAnimationFrame(animate)\n } else {\n setIsAnimating(false)\n onComplete?.()\n }\n }\n\n animationRef.current = requestAnimationFrame(animate)\n }, [isAnimating, duration, type, rotationSpeed, pulseSpeed, bounceHeight, infinite, onComplete])\n\n // 로딩 시작 함수\n const startLoading = useCallback(() => {\n if (isLoading) return\n\n setIsLoading(true)\n setIsAnimating(true)\n setProgress(0)\n startTimeRef.current = 0\n onStart?.()\n runAnimation()\n }, [isLoading, onStart, runAnimation])\n\n // 로딩 중단 함수\n const stopLoading = useCallback(() => {\n setIsLoading(false)\n setIsAnimating(false)\n if (animationRef.current) {\n cancelAnimationFrame(animationRef.current)\n animationRef.current = null\n }\n onStop?.()\n }, [onStop])\n\n // 로딩 상태 설정 함수\n const setLoadingState = useCallback((loading: boolean) => {\n if (loading) {\n startLoading()\n } else {\n stopLoading()\n }\n }, [startLoading, stopLoading])\n\n // 모션 시작 함수\n const start = useCallback(() => {\n if (!isVisible) {\n setIsVisible(true)\n startLoading()\n }\n }, [isVisible, startLoading])\n\n // 모션 중단 함수\n const stop = useCallback(() => {\n stopLoading()\n }, [stopLoading])\n\n // 모션 리셋 함수\n const reset = useCallback(() => {\n setIsVisible(false)\n setIsAnimating(false)\n setProgress(0)\n setIsLoading(false)\n setRotationAngle(0)\n setPulseScale(1)\n setBounceOffset(0)\n setWaveProgress(0)\n setDotProgress(0)\n setBarProgress(0)\n startTimeRef.current = 0\n if (animationRef.current) {\n cancelAnimationFrame(animationRef.current)\n animationRef.current = null\n }\n onReset?.()\n }, [onReset])\n\n // 모션 일시정지 함수\n const pause = useCallback(() => {\n setIsAnimating(false)\n if (animationRef.current) {\n cancelAnimationFrame(animationRef.current)\n animationRef.current = null\n }\n }, [])\n\n // 모션 재개 함수\n const resume = useCallback(() => {\n if (isVisible && !isAnimating) {\n setIsAnimating(true)\n runAnimation()\n }\n }, [isVisible, isAnimating, runAnimation])\n\n // 자동 시작\n useEffect(() => {\n if (autoStart) {\n startLoading()\n }\n }, [autoStart, startLoading])\n\n // 컴포넌트 언마운트 시 정리\n useEffect(() => {\n return () => {\n if (animationRef.current) {\n cancelAnimationFrame(animationRef.current)\n }\n }\n }, [])\n\n // 스피너 스타일 계산\n const getSpinnerStyle = (): React.CSSProperties => {\n const baseStyle: React.CSSProperties = {\n width: size,\n height: size,\n backgroundColor: 'transparent',\n position: 'relative',\n display: 'inline-block'\n }\n\n switch (type) {\n case 'rotate':\n return {\n ...baseStyle,\n border: `${thickness}px solid ${backgroundColor}`,\n borderTop: `${thickness}px solid ${color}`,\n borderRadius: '50%',\n transform: `rotate(${rotationAngle}deg)`,\n transition: `transform ${duration}ms ${easing}`\n }\n \n case 'pulse':\n return {\n ...baseStyle,\n backgroundColor: color,\n borderRadius: '50%',\n transform: `scale(${pulseScale})`,\n transition: `transform ${duration}ms ${easing}`\n }\n \n case 'bounce':\n return {\n ...baseStyle,\n backgroundColor: color,\n borderRadius: '50%',\n transform: `translateY(${bounceOffset}px)`,\n transition: `transform ${duration}ms ${easing}`\n }\n \n case 'wave':\n return {\n ...baseStyle,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between'\n }\n \n case 'dots':\n return {\n ...baseStyle,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between'\n }\n \n case 'bars':\n return {\n ...baseStyle,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between'\n }\n \n default:\n return baseStyle\n }\n }\n\n // 웨이브 바 스타일 생성\n const getWaveBars = (): React.CSSProperties[] => {\n return Array.from({ length: waveCount }, (_, index) => {\n const delay = index * (duration / waveCount)\n const height = size * (0.3 + 0.7 * Math.sin((waveProgress + index / waveCount) * Math.PI * 2))\n \n return {\n width: thickness,\n height: `${height}px`,\n backgroundColor: color,\n borderRadius: thickness / 2,\n animationDelay: `${delay}ms`,\n transition: `height ${duration}ms ${easing}`\n }\n })\n }\n\n // 점 스타일 생성\n const getDots = (): React.CSSProperties[] => {\n return Array.from({ length: dotCount }, (_, index) => {\n const delay = index * (duration / dotCount)\n const opacity = 0.3 + 0.7 * Math.sin((dotProgress + index / dotCount) * Math.PI * 2)\n const scale = 0.8 + 0.4 * Math.sin((dotProgress + index / dotCount) * Math.PI * 2)\n \n return {\n width: thickness * 2,\n height: thickness * 2,\n backgroundColor: color,\n borderRadius: '50%',\n opacity,\n transform: `scale(${scale})`,\n animationDelay: `${delay}ms`,\n transition: `all ${duration}ms ${easing}`\n }\n })\n }\n\n // 바 스타일 생성\n const getBars = (): React.CSSProperties[] => {\n return Array.from({ length: barCount }, (_, index) => {\n const delay = index * (duration / barCount)\n const height = size * (0.2 + 0.8 * Math.sin((barProgress + index / barCount) * Math.PI * 2))\n \n return {\n width: thickness,\n height: `${height}px`,\n backgroundColor: color,\n borderRadius: thickness / 2,\n animationDelay: `${delay}ms`,\n transition: `height ${duration}ms ${easing}`\n }\n })\n }\n\n const style = getSpinnerStyle()\n\n return {\n ref,\n isVisible,\n isAnimating,\n style,\n progress,\n start,\n stop,\n reset,\n pause,\n resume,\n isLoading,\n spinnerType: type,\n rotationAngle,\n pulseScale,\n bounceOffset,\n waveProgress,\n dotProgress,\n barProgress,\n startLoading,\n stopLoading,\n setLoadingState\n }\n}\n","import { useRef, useState, useEffect, useCallback } from 'react'\nimport { BaseMotionOptions, BaseMotionReturn, MotionElement } from '../types'\n\nexport interface NavigationOptions extends BaseMotionOptions {\n // 네비게이션 타입\n type?: 'slide' | 'fade' | 'scale' | 'rotate' | 'custom'\n \n // 슬라이드 방향 (slide 타입일 때)\n slideDirection?: 'left' | 'right' | 'up' | 'down'\n \n // 메뉴 아이템 애니메이션\n staggerDelay?: number\n itemScale?: number\n itemOpacity?: number\n itemRotate?: number\n itemTranslateY?: number\n itemTranslateX?: number\n \n // 초기 상태\n initialScale?: number\n initialOpacity?: number\n initialRotate?: number\n initialTranslateY?: number\n initialTranslateX?: number\n \n // 활성 상태\n activeScale?: number\n activeOpacity?: number\n activeRotate?: number\n activeTranslateY?: number\n activeTranslateX?: number\n \n // 호버 상태\n hoverScale?: number\n hoverOpacity?: number\n hoverRotate?: number\n hoverTranslateY?: number\n hoverTranslateX?: number\n \n // 메뉴 아이템 개수\n itemCount?: number\n \n // 자동 시작\n autoStart?: boolean\n}\n\nexport function useNavigation<T extends MotionElement = HTMLDivElement>(\n options: NavigationOptions = {}\n): BaseMotionReturn<T> & {\n isOpen: boolean\n activeIndex: number\n itemStyles: React.CSSProperties[]\n openMenu: () => void\n closeMenu: () => void\n toggleMenu: () => void\n setActiveItem: (index: number) => void\n goToNext: () => void\n goToPrevious: () => void\n} {\n const {\n duration = 300,\n easing = 'ease-out',\n type = 'slide',\n slideDirection = 'left',\n staggerDelay = 50,\n itemScale = 1,\n itemOpacity = 1,\n itemRotate = 0,\n itemTranslateY = 0,\n itemTranslateX = 0,\n initialScale = 0.8,\n initialOpacity = 0,\n initialRotate = -10,\n initialTranslateY = 20,\n initialTranslateX = 0,\n activeScale = 1.05,\n activeOpacity = 1,\n activeRotate = 0,\n activeTranslateY = 0,\n activeTranslateX = 0,\n hoverScale = 1.1,\n hoverOpacity = 1,\n hoverRotate = 5,\n hoverTranslateY = -5,\n hoverTranslateX = 0,\n itemCount = 5,\n autoStart = false,\n onComplete, onStart, onStop, onReset\n } = options\n\n const ref = useRef<T>(null)\n const [isVisible, setIsVisible] = useState(false)\n const [isAnimating, setIsAnimating] = useState(false)\n const [progress, setProgress] = useState(0)\n const [isOpen, setIsOpen] = useState(false)\n const [activeIndex, setActiveIndex] = useState(0)\n const [hoveredIndex, setHoveredIndex] = useState<number | null>(null)\n\n // 메뉴 열기 함수\n const openMenu = useCallback(() => {\n if (isOpen) return\n\n setIsOpen(true)\n setIsAnimating(true)\n setProgress(0)\n onStart?.()\n\n // 순차적으로 아이템들 나타나기\n const totalDuration = itemCount * staggerDelay + duration\n const interval = setInterval(() => {\n setProgress(prev => {\n const newProgress = prev + 0.1\n if (newProgress >= 1) {\n setIsAnimating(false)\n onComplete?.()\n clearInterval(interval)\n return 1\n }\n return newProgress\n })\n }, totalDuration / 10)\n }, [isOpen, itemCount, staggerDelay, duration, onStart, onComplete])\n\n // 메뉴 닫기 함수\n const closeMenu = useCallback(() => {\n if (!isOpen) return\n\n setIsOpen(false)\n setIsAnimating(true)\n setProgress(1)\n\n setTimeout(() => {\n setIsAnimating(false)\n setProgress(0)\n }, duration)\n }, [isOpen, duration])\n\n // 메뉴 토글 함수\n const toggleMenu = useCallback(() => {\n if (isOpen) {\n closeMenu()\n } else {\n openMenu()\n }\n }, [isOpen, openMenu, closeMenu])\n\n // 활성 아이템 설정 함수\n const setActiveItem = useCallback((index: number) => {\n if (index >= 0 && index < itemCount) {\n setActiveIndex(index)\n }\n }, [itemCount])\n\n // 다음 아이템으로 이동\n const goToNext = useCallback(() => {\n setActiveItem((activeIndex + 1) % itemCount)\n }, [activeIndex, itemCount, setActiveItem])\n\n // 이전 아이템으로 이동\n const goToPrevious = useCallback(() => {\n setActiveItem(activeIndex === 0 ? itemCount - 1 : activeIndex - 1)\n }, [activeIndex, itemCount, setActiveItem])\n\n // 모션 시작 함수\n const start = useCallback(() => {\n if (!isVisible) {\n setIsVisible(true)\n openMenu()\n }\n }, [isVisible, openMenu])\n\n // 모션 중단 함수\n const stop = useCallback(() => {\n setIsAnimating(false)\n onStop?.()\n }, [onStop])\n\n // 모션 리셋 함수\n const reset = useCallback(() => {\n setIsVisible(false)\n setIsAnimating(false)\n setProgress(0)\n setIsOpen(false)\n setActiveIndex(0)\n setHoveredIndex(null)\n onReset?.()\n }, [onReset])\n\n // 모션 일시정지 함수\n const pause = useCallback(() => {\n setIsAnimating(false)\n }, [])\n\n // 모션 재개 함수\n const resume = useCallback(() => {\n if (isVisible) {\n setIsAnimating(true)\n }\n }, [isVisible])\n\n // 자동 시작\n useEffect(() => {\n if (autoStart) {\n start()\n }\n }, [autoStart, start])\n\n // 메뉴 아이템 스타일 배열 생성\n const itemStyles = Array.from({ length: itemCount }, (_, index) => {\n const delay = isOpen ? index * staggerDelay : 0\n const isItemVisible = isOpen && delay <= progress * (itemCount * staggerDelay)\n const isActive = index === activeIndex\n const isHovered = index === hoveredIndex\n\n let scale = initialScale\n let opacity = initialOpacity\n let rotate = initialRotate\n let translateY = initialTranslateY\n let translateX = initialTranslateX\n\n if (isItemVisible) {\n if (isHovered) {\n scale = hoverScale\n opacity = hoverOpacity\n rotate = hoverRotate\n translateY = hoverTranslateY\n translateX = hoverTranslateX\n } else if (isActive) {\n scale = activeScale\n opacity = activeOpacity\n rotate = activeRotate\n translateY = activeTranslateY\n translateX = activeTranslateX\n } else {\n scale = itemScale\n opacity = itemOpacity\n rotate = itemRotate\n translateY = itemTranslateY\n translateX = itemTranslateX\n }\n }\n\n return {\n transform: `\n scale(${scale})\n rotate(${rotate}deg)\n translate(${translateX}px, ${translateY}px)\n `,\n opacity,\n transition: `all ${duration}ms ${easing} ${delay}ms`,\n willChange: 'transform, opacity',\n cursor: 'pointer'\n }\n })\n\n // 네비게이션 스타일 계산\n const getNavigationStyle = (): React.CSSProperties => {\n const baseStyle: React.CSSProperties = {\n transition: `all ${duration}ms ${easing}`,\n willChange: 'transform, opacity'\n }\n\n switch (type) {\n case 'slide':\n if (slideDirection === 'left') {\n baseStyle.transform = `translateX(${isOpen ? 0 : -100}%)`\n } else if (slideDirection === 'right') {\n baseStyle.transform = `translateX(${isOpen ? 0 : 100}%)`\n } else if (slideDirection === 'up') {\n baseStyle.transform = `translateY(${isOpen ? 0 : -100}%)`\n } else if (slideDirection === 'down') {\n baseStyle.transform = `translateY(${isOpen ? 0 : 100}%)`\n }\n break\n \n case 'fade':\n baseStyle.opacity = isOpen ? 1 : 0\n break\n \n case 'scale':\n baseStyle.transform = `scale(${isOpen ? 1 : 0})`\n break\n \n case 'rotate':\n baseStyle.transform = `rotate(${isOpen ? 0 : 180}deg)`\n break\n \n case 'custom':\n // 사용자 정의 스타일은 기본값 사용\n break\n }\n\n return baseStyle\n }\n\n const style = getNavigationStyle()\n\n return {\n ref,\n isVisible,\n isAnimating,\n style,\n progress,\n start,\n stop,\n reset,\n pause,\n resume,\n isOpen,\n activeIndex,\n itemStyles,\n openMenu,\n closeMenu,\n toggleMenu,\n setActiveItem,\n goToNext,\n goToPrevious\n }\n}\n","import { useRef, useState, useEffect, useCallback } from 'react'\nimport { BaseMotionOptions, BaseMotionReturn, MotionElement } from '../types'\n\nexport interface SkeletonOptions extends BaseMotionOptions {\n /** 스켈레톤 배경색 */\n backgroundColor?: string\n /** 스켈레톤 하이라이트 색상 */\n highlightColor?: string\n /** 모션 속도 (ms) */\n motionSpeed?: number\n /** 스켈레톤 높이 */\n height?: number\n /** 스켈레톤 너비 */\n width?: number | string\n /** 보더 반지름 */\n borderRadius?: number\n /** 웨이브 모션 활성화 여부 */\n wave?: boolean\n /** 펄스 모션 활성화 여부 */\n pulse?: boolean\n}\n\nexport function useSkeleton<T extends MotionElement = HTMLDivElement>(\n options: SkeletonOptions = {}\n): BaseMotionReturn<T> {\n const {\n delay = 0,\n duration = 1500,\n easing = 'ease-in-out',\n autoStart = true,\n backgroundColor = '#f0f0f0',\n highlightColor = '#e0e0e0',\n motionSpeed = 1500,\n height = 20,\n width = '100%',\n borderRadius = 4,\n wave = true,\n pulse = false,\n onComplete, onStart, onStop, onReset\n } = options\n\n const ref = useRef<T>(null)\n const [isVisible, setIsVisible] = useState(autoStart)\n const [isAnimating, setIsAnimating] = useState(autoStart)\n const [progress, setProgress] = useState(0)\n const motionRef = useRef<number | null>(null)\n const startTimeRef = useRef<number | null>(null)\n\n // 스켈레톤 시작 함수\n const start = useCallback(() => {\n if (isAnimating) return\n\n setIsVisible(true)\n setIsAnimating(true)\n setProgress(0)\n onStart?.()\n\n // 지연 시간 적용\n setTimeout(() => {\n startTimeRef.current = Date.now()\n \n const animate = () => {\n if (!startTimeRef.current) return\n \n const elapsed = Date.now() - startTimeRef.current\n const newProgress = Math.min(elapsed / duration, 1)\n setProgress(newProgress)\n\n if (newProgress < 1) {\n motionRef.current = requestAnimationFrame(animate)\n } else {\n setIsAnimating(false)\n onComplete?.()\n }\n }\n\n motionRef.current = requestAnimationFrame(animate)\n }, delay)\n }, [delay, duration, isAnimating, onStart, onComplete])\n\n // 스켈레톤 중단 함수\n const stop = useCallback(() => {\n if (motionRef.current) {\n cancelAnimationFrame(motionRef.current)\n motionRef.current = null\n }\n startTimeRef.current = null\n setIsAnimating(false)\n onStop?.()\n }, [onStop])\n\n // 스켈레톤 리셋 함수\n const reset = useCallback(() => {\n stop()\n setIsVisible(false)\n setProgress(0)\n onReset?.()\n }, [stop, onReset])\n\n // 스켈레톤 일시정지 함수\n const pause = useCallback(() => {\n if (motionRef.current) {\n cancelAnimationFrame(motionRef.current)\n motionRef.current = null\n }\n setIsAnimating(false)\n }, [])\n\n // 스켈레톤 재개 함수\n const resume = useCallback(() => {\n if (!isAnimating && isVisible) {\n start()\n }\n }, [isAnimating, isVisible, start])\n\n // 자동 시작\n useEffect(() => {\n if (autoStart) {\n start()\n }\n }, [autoStart, start])\n\n // 컴포넌트 언마운트 시 정리\n useEffect(() => {\n return () => {\n if (motionRef.current) {\n cancelAnimationFrame(motionRef.current)\n }\n }\n }, [])\n\n // 스켈레톤 스타일 계산\n const getSkeletonStyle = (): React.CSSProperties => {\n const baseStyle: React.CSSProperties = {\n width: typeof width === 'number' ? `${width}px` : width,\n height: `${height}px`,\n backgroundColor,\n borderRadius: `${borderRadius}px`,\n position: 'relative',\n overflow: 'hidden',\n opacity: isVisible ? 1 : 0,\n transition: `opacity ${duration}ms ${easing}`\n }\n\n if (wave && isAnimating) {\n baseStyle.background = `linear-gradient(90deg, ${backgroundColor} 25%, ${highlightColor} 50%, ${backgroundColor} 75%)`\n baseStyle.backgroundSize = '200% 100%'\n baseStyle.animation = `skeleton-wave ${motionSpeed}ms infinite linear`\n } else if (pulse && isAnimating) {\n baseStyle.animation = `skeleton-pulse ${motionSpeed}ms infinite ease-in-out`\n }\n\n return baseStyle\n }\n\n const style = getSkeletonStyle()\n\n // CSS 모션 키프레임을 동적으로 추가\n useEffect(() => {\n const styleSheet = document.styleSheets[0] || document.createElement('style').sheet\n \n if (styleSheet && !document.getElementById('skeleton-animations')) {\n const styleElement = document.createElement('style')\n styleElement.id = 'skeleton-animations'\n styleElement.textContent = `\n @keyframes skeleton-wave {\n 0% { background-position: 200% 0; }\n 100% { background-position: -200% 0; }\n }\n \n @keyframes skeleton-pulse {\n 0%, 100% { opacity: 0.6; }\n 50% { opacity: 1; }\n }\n `\n document.head.appendChild(styleElement)\n }\n }, [])\n\n return {\n ref,\n isVisible,\n isAnimating,\n style,\n progress,\n start,\n stop,\n reset,\n pause,\n resume\n }\n}\n","import { useState, useEffect, useRef, useCallback } from 'react'\n\nexport interface TypewriterOptions {\n /** 타이핑할 텍스트 */\n text: string\n /** 글자당 딜레이 (ms) @default 50 */\n speed?: number\n /** 시작 딜레이 (ms) @default 0 */\n delay?: number\n /** 활성화 여부 @default true */\n enabled?: boolean\n /** 완료 콜백 */\n onComplete?: () => void\n}\n\nexport interface TypewriterReturn {\n /** 현재 표시 중인 텍스트 */\n displayText: string\n /** 타이핑 진행 중 여부 */\n isTyping: boolean\n /** 진행률 (0-1) */\n progress: number\n /** 타이핑 재시작 */\n restart: () => void\n}\n\n/**\n * useTypewriter - 타이핑 효과 훅\n *\n * @example\n * ```tsx\n * const { displayText, isTyping } = useTypewriter({ text: 'Hello, world!' })\n * return <h1>{displayText}<span className=\"animate-pulse\">|</span></h1>\n * ```\n */\nexport function useTypewriter(options: TypewriterOptions): TypewriterReturn {\n const { text, speed = 50, delay = 0, enabled = true, onComplete } = options\n\n const [index, setIndex] = useState(0)\n const [started, setStarted] = useState(false)\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n const restart = useCallback(() => {\n setIndex(0)\n setStarted(false)\n }, [])\n\n // Delay before starting\n useEffect(() => {\n if (!enabled) return\n\n const id = setTimeout(() => setStarted(true), delay)\n return () => clearTimeout(id)\n }, [enabled, delay])\n\n // Typing animation\n useEffect(() => {\n if (!started || !enabled) return\n if (index >= text.length) {\n onComplete?.()\n return\n }\n\n timerRef.current = setTimeout(() => {\n setIndex(prev => prev + 1)\n }, speed)\n\n return () => {\n if (timerRef.current) clearTimeout(timerRef.current)\n }\n }, [started, enabled, index, text.length, speed, onComplete])\n\n // Reset when text changes\n useEffect(() => {\n setIndex(0)\n setStarted(false)\n }, [text])\n\n return {\n displayText: text.slice(0, index),\n isTyping: started && index < text.length,\n progress: text.length > 0 ? index / text.length : 0,\n restart,\n }\n}\n","import { useState, useEffect, useRef, useCallback, useMemo, type CSSProperties } from 'react'\n\nexport interface CustomCursorOptions {\n /** 활성화 여부 @default true */\n enabled?: boolean\n /** 커서 크기 (px) @default 32 */\n size?: number\n /** 스프링 스무딩 (0-1, 낮을수록 부드러움) @default 0.15 */\n smoothing?: number\n /** 호버 시 스케일 @default 1.5 */\n hoverScale?: number\n /** data-cursor 속성 요소 감지 @default true */\n detectLabels?: boolean\n}\n\nexport interface CustomCursorReturn {\n /** 커서 x 좌표 (smoothed) */\n x: number\n /** 커서 y 좌표 (smoothed) */\n y: number\n /** 호버 중인 요소의 data-cursor 값 */\n label: string | null\n /** 호버 상태 여부 */\n isHovering: boolean\n /** 커서 스타일 (CSS variables 포함) */\n style: CSSProperties\n /** 커서 가시 여부 */\n isVisible: boolean\n}\n\n/**\n * useCustomCursor - 커스텀 커서 효과 훅\n *\n * 마우스를 따라다니는 커스텀 커서를 구현합니다.\n * 스프링 보간으로 부드러운 추적, data-cursor 라벨 감지.\n *\n * @example\n * ```tsx\n * const cursor = useCustomCursor()\n * return (\n * <>\n * <div style={cursor.style} className=\"custom-cursor\" />\n * <button data-cursor=\"Click me\">Hover me</button>\n * </>\n * )\n * ```\n */\nexport function useCustomCursor(options: CustomCursorOptions = {}): CustomCursorReturn {\n const {\n enabled = true,\n size = 32,\n smoothing = 0.15,\n hoverScale = 1.5,\n detectLabels = true,\n } = options\n\n const [isVisible, setIsVisible] = useState(false)\n const [label, setLabel] = useState<string | null>(null)\n const [isHovering, setIsHovering] = useState(false)\n\n const targetRef = useRef({ x: 0, y: 0 })\n const currentRef = useRef({ x: 0, y: 0 })\n const [pos, setPos] = useState({ x: 0, y: 0 })\n const rafRef = useRef<number | null>(null)\n\n // Spring interpolation loop\n const animate = useCallback(() => {\n const dx = targetRef.current.x - currentRef.current.x\n const dy = targetRef.current.y - currentRef.current.y\n\n currentRef.current.x += dx * smoothing\n currentRef.current.y += dy * smoothing\n\n setPos({ x: currentRef.current.x, y: currentRef.current.y })\n\n if (Math.abs(dx) > 0.1 || Math.abs(dy) > 0.1) {\n rafRef.current = requestAnimationFrame(animate)\n }\n }, [smoothing])\n\n useEffect(() => {\n if (!enabled || typeof window === 'undefined') return\n\n const handleMouseMove = (e: MouseEvent) => {\n targetRef.current = { x: e.clientX, y: e.clientY }\n setIsVisible(true)\n\n if (!rafRef.current) {\n rafRef.current = requestAnimationFrame(animate)\n }\n\n // Detect data-cursor label\n if (detectLabels) {\n const target = e.target as HTMLElement\n const cursorEl = target.closest('[data-cursor]') as HTMLElement | null\n if (cursorEl) {\n setLabel(cursorEl.dataset.cursor || null)\n setIsHovering(true)\n } else {\n setLabel(null)\n setIsHovering(false)\n }\n }\n }\n\n const handleMouseLeave = () => {\n setIsVisible(false)\n setLabel(null)\n setIsHovering(false)\n }\n\n document.addEventListener('mousemove', handleMouseMove)\n document.addEventListener('mouseleave', handleMouseLeave)\n\n return () => {\n document.removeEventListener('mousemove', handleMouseMove)\n document.removeEventListener('mouseleave', handleMouseLeave)\n if (rafRef.current) cancelAnimationFrame(rafRef.current)\n }\n }, [enabled, detectLabels, animate])\n\n const scale = isHovering ? hoverScale : 1\n\n const style = useMemo<CSSProperties>(() => ({\n '--cursor-x': `${pos.x}px`,\n '--cursor-y': `${pos.y}px`,\n '--cursor-size': `${size}px`,\n '--cursor-scale': `${scale}`,\n position: 'fixed' as const,\n left: pos.x - (size * scale) / 2,\n top: pos.y - (size * scale) / 2,\n width: size * scale,\n height: size * scale,\n pointerEvents: 'none' as const,\n zIndex: 9999,\n transition: 'width 0.2s, height 0.2s, left 0.05s, top 0.05s',\n } as CSSProperties), [pos.x, pos.y, size, scale])\n\n return { x: pos.x, y: pos.y, label, isHovering, style, isVisible }\n}\n","import { useRef, useCallback, useMemo, type CSSProperties } from 'react'\n\nexport interface MagneticCursorOptions {\n /** 자석 끌림 강도 (0-1) @default 0.3 */\n strength?: number\n /** 자석 작동 반경 (px) @default 100 */\n radius?: number\n /** 활성화 여부 @default true */\n enabled?: boolean\n}\n\nexport interface MagneticCursorReturn<T extends HTMLElement = HTMLElement> {\n /** 자석 대상 요소에 연결할 ref */\n ref: React.RefObject<T | null>\n /** 마우스 이벤트 핸들러 */\n handlers: {\n onMouseMove: (e: React.MouseEvent) => void\n onMouseLeave: () => void\n }\n /** 요소에 적용할 transform 스타일 */\n style: CSSProperties\n}\n\n/**\n * useMagneticCursor - 자석 커서 효과 훅\n *\n * 마우스가 요소 근처에 오면 요소가 마우스 쪽으로 끌려오는 효과.\n * 버튼, 아이콘 등에 적용하면 인터랙티브 느낌 향상.\n *\n * @example\n * ```tsx\n * const magnetic = useMagneticCursor<HTMLButtonElement>({ strength: 0.4 })\n * return <button ref={magnetic.ref} style={magnetic.style} {...magnetic.handlers}>Click</button>\n * ```\n */\nexport function useMagneticCursor<T extends HTMLElement = HTMLElement>(\n options: MagneticCursorOptions = {}\n): MagneticCursorReturn<T> {\n const { strength = 0.3, radius = 100, enabled = true } = options\n\n const ref = useRef<T>(null)\n const transformRef = useRef({ x: 0, y: 0 })\n const styleRef = useRef<CSSProperties>({\n transition: 'transform 0.3s cubic-bezier(0.22, 1, 0.36, 1)',\n transform: 'translate(0px, 0px)',\n })\n\n const onMouseMove = useCallback((e: React.MouseEvent) => {\n if (!enabled || !ref.current) return\n\n const rect = ref.current.getBoundingClientRect()\n const centerX = rect.left + rect.width / 2\n const centerY = rect.top + rect.height / 2\n\n const dx = e.clientX - centerX\n const dy = e.clientY - centerY\n const dist = Math.sqrt(dx * dx + dy * dy)\n\n if (dist < radius) {\n const pull = (1 - dist / radius) * strength\n transformRef.current = { x: dx * pull, y: dy * pull }\n } else {\n transformRef.current = { x: 0, y: 0 }\n }\n\n ref.current.style.transform = `translate(${transformRef.current.x}px, ${transformRef.current.y}px)`\n }, [enabled, strength, radius])\n\n const onMouseLeave = useCallback(() => {\n if (!ref.current) return\n transformRef.current = { x: 0, y: 0 }\n ref.current.style.transform = 'translate(0px, 0px)'\n }, [])\n\n const handlers = useMemo(() => ({ onMouseMove, onMouseLeave }), [onMouseMove, onMouseLeave])\n\n return { ref, handlers, style: styleRef.current }\n}\n","import { useEffect, useRef, useCallback, useState } from 'react'\n\nexport interface SmoothScrollOptions {\n /** 활성화 여부 @default true */\n enabled?: boolean\n /** 스무딩 계수 (0-1, 낮을수록 부드러움) @default 0.1 */\n lerp?: number\n /** 마우스 휠 배율 @default 1 */\n wheelMultiplier?: number\n /** 터치 배율 @default 2 */\n touchMultiplier?: number\n /** 방향 @default 'vertical' */\n direction?: 'vertical' | 'horizontal'\n /** 콜백: 스크롤 값 변경 시 */\n onScroll?: (scroll: number) => void\n}\n\nexport interface SmoothScrollReturn {\n /** 현재 스크롤 위치 (smoothed) */\n scroll: number\n /** 목표 스크롤 위치 */\n targetScroll: number\n /** 스크롤 진행률 (0-1) */\n progress: number\n /** 특정 위치로 스크롤 */\n scrollTo: (target: number | HTMLElement, options?: { offset?: number }) => void\n /** 스크롤 중지 */\n stop: () => void\n}\n\n/**\n * useSmoothScroll - 부드러운 스크롤 훅\n *\n * lenis 스타일의 smooth scrolling. 네이티브 스크롤을 가로채서\n * lerp 보간으로 부드러운 스크롤 경험을 제공합니다.\n *\n * @example\n * ```tsx\n * const { scroll, progress, scrollTo } = useSmoothScroll({ lerp: 0.08 })\n * return <button onClick={() => scrollTo(document.getElementById('section')!)}>Go</button>\n * ```\n */\nexport function useSmoothScroll(options: SmoothScrollOptions = {}): SmoothScrollReturn {\n const {\n enabled = true,\n lerp = 0.1,\n wheelMultiplier = 1,\n touchMultiplier = 2,\n direction = 'vertical',\n onScroll,\n } = options\n\n const [scroll, setScroll] = useState(0)\n const [progress, setProgress] = useState(0)\n\n const targetRef = useRef(0)\n const currentRef = useRef(0)\n const rafRef = useRef<number | null>(null)\n const isRunningRef = useRef(false)\n const touchStartRef = useRef(0)\n\n const getMaxScroll = useCallback(() => {\n if (typeof document === 'undefined') return 0\n return direction === 'vertical'\n ? document.documentElement.scrollHeight - window.innerHeight\n : document.documentElement.scrollWidth - window.innerWidth\n }, [direction])\n\n const clamp = useCallback((val: number) => {\n return Math.max(0, Math.min(val, getMaxScroll()))\n }, [getMaxScroll])\n\n // Animation loop\n const animate = useCallback(() => {\n const dx = targetRef.current - currentRef.current\n\n if (Math.abs(dx) < 0.5) {\n currentRef.current = targetRef.current\n setScroll(currentRef.current)\n isRunningRef.current = false\n return\n }\n\n currentRef.current += dx * lerp\n setScroll(currentRef.current)\n\n const max = getMaxScroll()\n setProgress(max > 0 ? currentRef.current / max : 0)\n onScroll?.(currentRef.current)\n\n // Apply to native scroll position\n if (direction === 'vertical') {\n window.scrollTo(0, currentRef.current)\n } else {\n window.scrollTo(currentRef.current, 0)\n }\n\n rafRef.current = requestAnimationFrame(animate)\n }, [lerp, direction, getMaxScroll, onScroll])\n\n const startAnimation = useCallback(() => {\n if (isRunningRef.current) return\n isRunningRef.current = true\n rafRef.current = requestAnimationFrame(animate)\n }, [animate])\n\n useEffect(() => {\n if (!enabled || typeof window === 'undefined') return\n\n // Prevent native smooth scrolling\n document.documentElement.style.scrollBehavior = 'auto'\n\n // Sync initial position\n currentRef.current = direction === 'vertical' ? window.scrollY : window.scrollX\n targetRef.current = currentRef.current\n\n const handleWheel = (e: WheelEvent) => {\n e.preventDefault()\n const delta = direction === 'vertical' ? e.deltaY : e.deltaX\n targetRef.current = clamp(targetRef.current + delta * wheelMultiplier)\n startAnimation()\n }\n\n const handleTouchStart = (e: TouchEvent) => {\n touchStartRef.current = direction === 'vertical'\n ? e.touches[0].clientY\n : e.touches[0].clientX\n }\n\n const handleTouchMove = (e: TouchEvent) => {\n const current = direction === 'vertical'\n ? e.touches[0].clientY\n : e.touches[0].clientX\n const delta = (touchStartRef.current - current) * touchMultiplier\n touchStartRef.current = current\n targetRef.current = clamp(targetRef.current + delta)\n startAnimation()\n }\n\n window.addEventListener('wheel', handleWheel, { passive: false })\n window.addEventListener('touchstart', handleTouchStart, { passive: true })\n window.addEventListener('touchmove', handleTouchMove, { passive: true })\n\n return () => {\n window.removeEventListener('wheel', handleWheel)\n window.removeEventListener('touchstart', handleTouchStart)\n window.removeEventListener('touchmove', handleTouchMove)\n if (rafRef.current) cancelAnimationFrame(rafRef.current)\n document.documentElement.style.scrollBehavior = ''\n }\n }, [enabled, direction, wheelMultiplier, touchMultiplier, clamp, startAnimation])\n\n const scrollTo = useCallback((target: number | HTMLElement, opts?: { offset?: number }) => {\n const offset = opts?.offset ?? 0\n if (typeof target === 'number') {\n targetRef.current = clamp(target + offset)\n } else {\n const rect = target.getBoundingClientRect()\n const pos = direction === 'vertical'\n ? rect.top + currentRef.current + offset\n : rect.left + currentRef.current + offset\n targetRef.current = clamp(pos)\n }\n startAnimation()\n }, [clamp, direction, startAnimation])\n\n const stop = useCallback(() => {\n if (rafRef.current) {\n cancelAnimationFrame(rafRef.current)\n rafRef.current = null\n }\n isRunningRef.current = false\n targetRef.current = currentRef.current\n }, [])\n\n return {\n scroll,\n targetScroll: targetRef.current,\n progress,\n scrollTo,\n stop,\n }\n}\n","import { useState, useEffect, useRef } from 'react'\nimport { subscribeScroll } from '../utils/sharedScroll'\n\nexport interface ElementProgressOptions {\n /** 요소가 뷰포트 아래에서 시작되는 위치 (0 = 하단, 1 = 상단) @default 0 */\n start?: number\n /** 요소가 뷰포트 위에서 끝나는 위치 @default 1 */\n end?: number\n /** 클램프 여부 @default true */\n clamp?: boolean\n}\n\nexport interface ElementProgressReturn<T extends HTMLElement = HTMLElement> {\n /** 대상 요소 ref */\n ref: React.RefObject<T | null>\n /** 요소의 스크롤 진행률 (0-1) */\n progress: number\n /** 요소가 뷰포트 안에 있는지 */\n isInView: boolean\n}\n\n/**\n * useElementProgress - 요소 단위 스크롤 진행률 훅\n *\n * useScrollProgress의 확장판. 페이지 전체가 아니라\n * 특정 요소가 뷰포트를 통과하는 진행률을 추적합니다.\n *\n * 공유 스크롤 리스너(subscribeScroll)를 사용해 N개 인스턴스도\n * 단 하나의 scroll/resize 이벤트 + rAF 배칭으로 처리됩니다.\n *\n * @example\n * ```tsx\n * const { ref, progress, isInView } = useElementProgress<HTMLDivElement>()\n * return (\n * <div ref={ref} style={{ opacity: progress }}>\n * Fades in as you scroll\n * </div>\n * )\n * ```\n */\nexport function useElementProgress<T extends HTMLElement = HTMLElement>(\n options: ElementProgressOptions = {}\n): ElementProgressReturn<T> {\n const { start = 0, end = 1, clamp = true } = options\n\n const ref = useRef<T>(null)\n const [progress, setProgress] = useState(0)\n const [isInView, setIsInView] = useState(false)\n\n // Refs to avoid stale closure comparisons and skip redundant setState calls\n const progressRef = useRef(0)\n const isInViewRef = useRef(false)\n\n useEffect(() => {\n const el = ref.current\n if (!el || typeof window === 'undefined') return\n\n const calculate = () => {\n const rect = el.getBoundingClientRect()\n const vh = window.innerHeight\n\n // Element's center relative to viewport\n const elementTop = rect.top\n const elementBottom = rect.bottom\n\n // start=0 means tracking begins when element bottom enters viewport bottom\n // end=1 means tracking ends when element top exits viewport top\n const trackStart = vh * (1 - start)\n const trackEnd = vh * end * -1 + vh\n\n // Calculate raw progress\n const range = trackStart - trackEnd\n const raw = range > 0 ? (trackStart - elementTop) / range : 0\n\n const clamped = clamp ? Math.max(0, Math.min(1, raw)) : raw\n\n // Only update progress state when change exceeds threshold (avoids excessive renders)\n if (Math.abs(clamped - progressRef.current) > 0.005) {\n progressRef.current = clamped\n setProgress(clamped)\n }\n\n // Only update isInView state when it actually changes\n const nowInView = elementBottom > 0 && elementTop < vh\n if (nowInView !== isInViewRef.current) {\n isInViewRef.current = nowInView\n setIsInView(nowInView)\n }\n }\n\n // Run once immediately for initial state\n calculate()\n\n // Subscribe to shared scroll/resize listener (rAF-batched)\n return subscribeScroll(calculate)\n }, [start, end, clamp])\n\n return { ref, progress, isInView }\n}\n","import { useState, useEffect, useRef, useCallback } from \"react\";\n\nexport interface AutoFadeConfig {\n initialOpacity?: number; // 초기 투명도 (0-1)\n targetOpacity?: number; // 목표 투명도 (0-1)\n duration?: number; // 모션 지속 시간 (ms)\n delay?: number; // 시작 지연 시간 (ms)\n repeat?: boolean; // 반복 여부\n repeatDelay?: number; // 반복 간 지연 시간 (ms)\n repeatCount?: number; // 반복 횟수 (-1 = 무한)\n ease?: \"linear\" | \"ease-in\" | \"ease-out\" | \"ease-in-out\"; // 이징 함수\n autoStart?: boolean; // 자동 시작 여부\n onComplete?: () => void; // 완료 콜백\n onRepeat?: (count: number) => void; // 반복 콜백\n showOnMount?: boolean;\n}\n\ninterface AutoFadeReturn {\n opacity: number;\n isAnimating: boolean;\n isVisible: boolean;\n mounted: boolean;\n start: () => void;\n stop: () => void;\n reset: () => void;\n fadeIn: () => void;\n fadeOut: () => void;\n toggle: () => void;\n}\n\nexport function useAutoFade(options: AutoFadeConfig = {}): AutoFadeReturn {\n const {\n initialOpacity = 0,\n targetOpacity = 1,\n duration = 1000,\n delay = 0,\n repeat = false,\n repeatDelay = 1000,\n repeatCount = -1,\n ease = \"ease-in-out\",\n autoStart = true,\n onComplete,\n onRepeat,\n showOnMount = false,\n } = options;\n\n const [opacity, setOpacity] = useState(showOnMount ? initialOpacity : 0);\n const [isAnimating, setIsAnimating] = useState(false);\n const [isVisible, setIsVisible] = useState(\n showOnMount ? initialOpacity > 0 : false,\n );\n const [mounted, setMounted] = useState(false);\n const motionRef = useRef<number | null>(null);\n const timeoutRef = useRef<number | null>(null);\n const repeatCountRef = useRef(0);\n const isFadingInRef = useRef(true);\n\n // 하이드레이션 이슈 해결을 위한 mounted 상태 관리\n useEffect(() => {\n setMounted(true);\n }, []);\n\n // 이징 함수\n const getEasing = useCallback(\n (t: number): number => {\n switch (ease) {\n case \"linear\":\n return t;\n case \"ease-in\":\n return t * t;\n case \"ease-out\":\n return 1 - (1 - t) * (1 - t);\n case \"ease-in-out\":\n return t < 0.5 ? 2 * t * t : 1 - Math.pow(-2 * t + 2, 2) / 2;\n default:\n return t;\n }\n },\n [ease],\n );\n\n // 모션 실행 함수\n const animate = useCallback(\n (from: number, to: number, onFinish?: () => void) => {\n if (!mounted) return;\n\n setIsAnimating(true);\n const startTime = performance.now();\n const startOpacity = from;\n\n const updateOpacity = (currentTime: number) => {\n const elapsed = currentTime - startTime;\n const progress = Math.min(elapsed / duration, 1);\n const easedProgress = getEasing(progress);\n\n const currentOpacity =\n startOpacity + (to - startOpacity) * easedProgress;\n setOpacity(currentOpacity);\n setIsVisible(currentOpacity > 0);\n\n if (progress < 1) {\n motionRef.current = requestAnimationFrame(updateOpacity);\n } else {\n setIsAnimating(false);\n onFinish?.();\n }\n };\n\n motionRef.current = requestAnimationFrame(updateOpacity);\n },\n [mounted, duration, getEasing],\n );\n\n // 페이드 인\n const fadeIn = useCallback(() => {\n if (!mounted || isAnimating) return;\n\n animate(initialOpacity, targetOpacity, () => {\n onComplete?.();\n\n if (\n repeat &&\n (repeatCount === -1 || repeatCountRef.current < repeatCount)\n ) {\n repeatCountRef.current++;\n onRepeat?.(repeatCountRef.current);\n\n timeoutRef.current = window.setTimeout(() => {\n fadeOut();\n }, repeatDelay);\n }\n });\n }, [\n mounted,\n isAnimating,\n animate,\n initialOpacity,\n targetOpacity,\n onComplete,\n repeat,\n repeatCount,\n repeatDelay,\n onRepeat,\n ]);\n\n // 페이드 아웃\n const fadeOut = useCallback(() => {\n if (!mounted || isAnimating) return;\n\n animate(targetOpacity, initialOpacity, () => {\n onComplete?.();\n\n if (\n repeat &&\n (repeatCount === -1 || repeatCountRef.current < repeatCount)\n ) {\n repeatCountRef.current++;\n onRepeat?.(repeatCountRef.current);\n\n timeoutRef.current = window.setTimeout(() => {\n fadeIn();\n }, repeatDelay);\n }\n });\n }, [\n mounted,\n isAnimating,\n animate,\n targetOpacity,\n initialOpacity,\n onComplete,\n repeat,\n repeatCount,\n repeatDelay,\n onRepeat,\n ]);\n\n // 시작\n const start = useCallback(() => {\n if (!mounted || isAnimating) return;\n\n if (delay > 0) {\n timeoutRef.current = window.setTimeout(() => {\n fadeIn();\n }, delay);\n } else {\n fadeIn();\n }\n }, [mounted, isAnimating, delay, fadeIn]);\n\n // 정지\n const stop = useCallback(() => {\n if (motionRef.current !== null) {\n cancelAnimationFrame(motionRef.current);\n motionRef.current = null;\n }\n\n if (timeoutRef.current !== null) {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = null;\n }\n\n setIsAnimating(false);\n }, []);\n\n // 리셋\n const reset = useCallback(() => {\n stop();\n setOpacity(initialOpacity);\n setIsVisible(initialOpacity > 0);\n repeatCountRef.current = 0;\n isFadingInRef.current = true;\n }, [stop, initialOpacity]);\n\n // 토글\n const toggle = useCallback(() => {\n if (isFadingInRef.current) {\n fadeOut();\n isFadingInRef.current = false;\n } else {\n fadeIn();\n isFadingInRef.current = true;\n }\n }, [fadeIn, fadeOut]);\n\n // 자동 시작\n useEffect(() => {\n if (mounted && autoStart) {\n start();\n }\n }, [mounted, autoStart, start]);\n\n // 클린업\n useEffect(() => {\n return () => {\n if (motionRef.current !== null) {\n cancelAnimationFrame(motionRef.current);\n }\n if (timeoutRef.current !== null) {\n clearTimeout(timeoutRef.current);\n }\n };\n }, []);\n\n return {\n opacity,\n isAnimating,\n isVisible,\n mounted,\n start,\n stop,\n reset,\n fadeIn,\n fadeOut,\n toggle,\n };\n}\n","import { useState, useEffect, useRef, useCallback } from \"react\";\n\nexport interface AutoPlayConfig {\n interval?: number; // 재생 간격 (ms)\n delay?: number; // 시작 지연 시간 (ms)\n repeat?: number | \"infinite\"; // 반복 횟수\n autoStart?: boolean; // 자동 시작 여부\n pauseOnHover?: boolean; // 호버 시 일시정지 여부\n pauseOnBlur?: boolean; // 페이지 블러 시 일시정지 여부\n showOnMount?: boolean;\n}\n\nexport function useAutoPlay(options: AutoPlayConfig = {}) {\n const {\n interval = 3000,\n delay = 0,\n repeat = \"infinite\",\n autoStart = true,\n pauseOnHover = false,\n pauseOnBlur = true,\n showOnMount = false,\n } = options;\n\n const [isPlaying, setIsPlaying] = useState(showOnMount ? autoStart : false);\n const [currentStep, setCurrentStep] = useState(0);\n const [mounted, setMounted] = useState(false);\n const [isPaused, setIsPaused] = useState(false);\n\n const intervalRef = useRef<number | null>(null);\n const timeoutRef = useRef<number | null>(null);\n const repeatCountRef = useRef(0);\n\n // 하이드레이션 이슈 해결을 위한 mounted 상태 관리\n useEffect(() => {\n setMounted(true);\n }, []);\n\n // 다음 단계로 진행\n const next = useCallback(() => {\n setCurrentStep((prev) => {\n const nextStep = prev + 1;\n\n // 반복 횟수 체크\n if (repeat !== \"infinite\") {\n repeatCountRef.current += 1;\n if (repeatCountRef.current >= repeat) {\n stop();\n return prev;\n }\n }\n\n return nextStep;\n });\n }, [repeat]);\n\n // 인터벌 시작\n const startInterval = useCallback(() => {\n if (intervalRef.current) {\n clearInterval(intervalRef.current);\n }\n\n intervalRef.current = window.setInterval(() => {\n next();\n }, interval);\n }, [interval, next]);\n\n // 일시정지\n const pause = useCallback(() => {\n if (!isPlaying) return;\n\n setIsPaused(true);\n if (intervalRef.current) {\n clearInterval(intervalRef.current);\n intervalRef.current = null;\n }\n }, [isPlaying]);\n\n // 재개\n const resume = useCallback(() => {\n if (!isPlaying || !isPaused) return;\n\n setIsPaused(false);\n startInterval();\n }, [isPlaying, isPaused, startInterval]);\n\n // 자동 재생 정지\n const stop = useCallback(() => {\n setIsPlaying(false);\n setIsPaused(false);\n setCurrentStep(0);\n repeatCountRef.current = 0;\n\n if (intervalRef.current) {\n clearInterval(intervalRef.current);\n intervalRef.current = null;\n }\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = null;\n }\n }, []);\n\n // 자동 재생 시작\n const start = useCallback(() => {\n if (!mounted) return;\n\n setIsPlaying(true);\n setIsPaused(false);\n setCurrentStep(0);\n repeatCountRef.current = 0;\n\n // 초기 지연\n if (delay > 0) {\n timeoutRef.current = window.setTimeout(() => {\n startInterval();\n }, delay);\n } else {\n startInterval();\n }\n }, [mounted, delay, startInterval]);\n\n // 이전 단계로 이동\n const previous = useCallback(() => {\n setCurrentStep((prev) => Math.max(0, prev - 1));\n }, []);\n\n // 특정 단계로 이동\n const goTo = useCallback((step: number) => {\n setCurrentStep(Math.max(0, step));\n }, []);\n\n // 자동 시작\n useEffect(() => {\n if (mounted && autoStart) {\n start();\n }\n }, [mounted, autoStart, start]);\n\n // 호버 이벤트 처리\n useEffect(() => {\n if (!pauseOnHover) return;\n\n const handleMouseEnter = () => {\n if (isPlaying && !isPaused) {\n pause();\n }\n };\n\n const handleMouseLeave = () => {\n if (isPlaying && isPaused) {\n resume();\n }\n };\n\n document.addEventListener(\"mouseenter\", handleMouseEnter);\n document.addEventListener(\"mouseleave\", handleMouseLeave);\n\n return () => {\n document.removeEventListener(\"mouseenter\", handleMouseEnter);\n document.removeEventListener(\"mouseleave\", handleMouseLeave);\n };\n }, [pauseOnHover, isPlaying, isPaused, pause, resume]);\n\n // 페이지 블러 이벤트 처리\n useEffect(() => {\n if (!pauseOnBlur) return;\n\n const handleBlur = () => {\n if (isPlaying && !isPaused) {\n pause();\n }\n };\n\n const handleFocus = () => {\n if (isPlaying && isPaused) {\n resume();\n }\n };\n\n window.addEventListener(\"blur\", handleBlur);\n window.addEventListener(\"focus\", handleFocus);\n\n return () => {\n window.removeEventListener(\"blur\", handleBlur);\n window.removeEventListener(\"focus\", handleFocus);\n };\n }, [pauseOnBlur, isPlaying, isPaused, pause, resume]);\n\n // 클린업\n useEffect(() => {\n return () => {\n if (intervalRef.current) {\n clearInterval(intervalRef.current);\n }\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n };\n }, []);\n\n return {\n isPlaying,\n isPaused,\n currentStep,\n mounted,\n start,\n stop,\n pause,\n resume,\n next,\n previous,\n goTo,\n };\n}\n","import { useState, useEffect, useRef, useCallback } from \"react\";\n\nexport interface AutoScaleConfig {\n initialScale?: number; // 초기 스케일 (0-2)\n targetScale?: number; // 목표 스케일 (0-2)\n duration?: number; // 모션 지속 시간 (ms)\n delay?: number; // 시작 지연 시간 (ms)\n repeat?: boolean; // 반복 여부\n repeatDelay?: number; // 반복 간 지연 시간 (ms)\n repeatCount?: number; // 반복 횟수 (-1 = 무한)\n ease?:\n | \"linear\"\n | \"ease-in\"\n | \"ease-out\"\n | \"ease-in-out\"\n | \"bounce\"\n | \"elastic\"; // 이징 함수\n autoStart?: boolean; // 자동 시작 여부\n onComplete?: () => void; // 완료 콜백\n onRepeat?: (count: number) => void; // 반복 콜백\n showOnMount?: boolean;\n centerTransform?: boolean; // transform-origin을 center로 설정할지 여부\n}\n\ninterface AutoScaleReturn {\n scale: number;\n isAnimating: boolean;\n isVisible: boolean;\n mounted: boolean;\n start: () => void;\n stop: () => void;\n reset: () => void;\n scaleIn: () => void;\n scaleOut: () => void;\n toggle: () => void;\n}\n\nexport function useAutoScale(options: AutoScaleConfig = {}): AutoScaleReturn {\n const {\n initialScale = 0,\n targetScale = 1,\n duration = 1000,\n delay = 0,\n repeat = false,\n repeatDelay = 1000,\n repeatCount = -1,\n ease = \"ease-in-out\",\n autoStart = true,\n onComplete,\n onRepeat,\n showOnMount = false,\n centerTransform: _centerTransform = true,\n } = options;\n\n const [scale, setScale] = useState(showOnMount ? initialScale : 0);\n const [isAnimating, setIsAnimating] = useState(false);\n const [isVisible, setIsVisible] = useState(\n showOnMount ? initialScale > 0 : false,\n );\n const [mounted, setMounted] = useState(false);\n const motionRef = useRef<number | null>(null);\n const timeoutRef = useRef<number | null>(null);\n const repeatCountRef = useRef(0);\n const isScalingInRef = useRef(true);\n\n // 하이드레이션 이슈 해결을 위한 mounted 상태 관리\n useEffect(() => {\n setMounted(true);\n }, []);\n\n // 이징 함수\n const getEasing = useCallback(\n (t: number): number => {\n switch (ease) {\n case \"linear\":\n return t;\n case \"ease-in\":\n return t * t;\n case \"ease-out\":\n return 1 - (1 - t) * (1 - t);\n case \"ease-in-out\":\n return t < 0.5 ? 2 * t * t : 1 - Math.pow(-2 * t + 2, 2) / 2;\n case \"bounce\":\n if (t < 1 / 2.75) {\n return 7.5625 * t * t;\n } else if (t < 2 / 2.75) {\n return 7.5625 * (t -= 1.5 / 2.75) * t + 0.75;\n } else if (t < 2.5 / 2.75) {\n return 7.5625 * (t -= 2.25 / 2.75) * t + 0.9375;\n } else {\n return 7.5625 * (t -= 2.625 / 2.75) * t + 0.984375;\n }\n case \"elastic\":\n if (t === 0) return 0;\n if (t === 1) return 1;\n return (\n Math.pow(2, -10 * t) *\n Math.sin(((t - 0.075) * (2 * Math.PI)) / 0.3) +\n 1\n );\n default:\n return t;\n }\n },\n [ease],\n );\n\n // 모션 실행 함수\n const animate = useCallback(\n (from: number, to: number, onFinish?: () => void) => {\n if (!mounted) return;\n\n setIsAnimating(true);\n const startTime = performance.now();\n const startScale = from;\n\n const updateScale = (currentTime: number) => {\n const elapsed = currentTime - startTime;\n const progress = Math.min(elapsed / duration, 1);\n const easedProgress = getEasing(progress);\n\n const currentScale = startScale + (to - startScale) * easedProgress;\n setScale(currentScale);\n setIsVisible(currentScale > 0);\n\n if (progress < 1) {\n motionRef.current = requestAnimationFrame(updateScale);\n } else {\n setIsAnimating(false);\n onFinish?.();\n }\n };\n\n motionRef.current = requestAnimationFrame(updateScale);\n },\n [mounted, duration, getEasing],\n );\n\n // 스케일 인\n const scaleIn = useCallback(() => {\n if (!mounted || isAnimating) return;\n\n animate(initialScale, targetScale, () => {\n onComplete?.();\n\n if (\n repeat &&\n (repeatCount === -1 || repeatCountRef.current < repeatCount)\n ) {\n repeatCountRef.current++;\n onRepeat?.(repeatCountRef.current);\n\n timeoutRef.current = window.setTimeout(() => {\n scaleOut();\n }, repeatDelay);\n }\n });\n }, [\n mounted,\n isAnimating,\n animate,\n initialScale,\n targetScale,\n onComplete,\n repeat,\n repeatCount,\n repeatDelay,\n onRepeat,\n ]);\n\n // 스케일 아웃\n const scaleOut = useCallback(() => {\n if (!mounted || isAnimating) return;\n\n animate(targetScale, initialScale, () => {\n onComplete?.();\n\n if (\n repeat &&\n (repeatCount === -1 || repeatCountRef.current < repeatCount)\n ) {\n repeatCountRef.current++;\n onRepeat?.(repeatCountRef.current);\n\n timeoutRef.current = window.setTimeout(() => {\n scaleIn();\n }, repeatDelay);\n }\n });\n }, [\n mounted,\n isAnimating,\n animate,\n targetScale,\n initialScale,\n onComplete,\n repeat,\n repeatCount,\n repeatDelay,\n onRepeat,\n ]);\n\n // 시작\n const start = useCallback(() => {\n if (!mounted || isAnimating) return;\n\n if (delay > 0) {\n timeoutRef.current = window.setTimeout(() => {\n scaleIn();\n }, delay);\n } else {\n scaleIn();\n }\n }, [mounted, isAnimating, delay, scaleIn]);\n\n // 정지\n const stop = useCallback(() => {\n if (motionRef.current !== null) {\n cancelAnimationFrame(motionRef.current);\n motionRef.current = null;\n }\n\n if (timeoutRef.current !== null) {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = null;\n }\n\n setIsAnimating(false);\n }, []);\n\n // 리셋\n const reset = useCallback(() => {\n stop();\n setScale(initialScale);\n setIsVisible(initialScale > 0);\n repeatCountRef.current = 0;\n isScalingInRef.current = true;\n }, [stop, initialScale]);\n\n // 토글\n const toggle = useCallback(() => {\n if (isScalingInRef.current) {\n scaleOut();\n isScalingInRef.current = false;\n } else {\n scaleIn();\n isScalingInRef.current = true;\n }\n }, [scaleIn, scaleOut]);\n\n // 자동 시작\n useEffect(() => {\n if (mounted && autoStart) {\n start();\n }\n }, [mounted, autoStart, start]);\n\n // 클린업\n useEffect(() => {\n return () => {\n if (motionRef.current !== null) {\n cancelAnimationFrame(motionRef.current);\n }\n if (timeoutRef.current !== null) {\n clearTimeout(timeoutRef.current);\n }\n };\n }, []);\n\n return {\n scale,\n isAnimating,\n isVisible,\n mounted,\n start,\n stop,\n reset,\n scaleIn,\n scaleOut,\n toggle,\n };\n}\n","import { useState, useEffect, useRef, useCallback } from \"react\";\n\ntype SlideDirection =\n | \"left\"\n | \"right\"\n | \"up\"\n | \"down\"\n | \"left-up\"\n | \"left-down\"\n | \"right-up\"\n | \"right-down\";\n\nexport interface AutoSlideConfig {\n direction?: SlideDirection; // 슬라이드 방향\n distance?: number; // 슬라이드 거리 (px)\n initialPosition?: { x: number; y: number }; // 초기 위치\n targetPosition?: { x: number; y: number }; // 목표 위치\n duration?: number; // 모션 지속 시간 (ms)\n delay?: number; // 시작 지연 시간 (ms)\n repeat?: boolean; // 반복 여부\n repeatDelay?: number; // 반복 간 지연 시간 (ms)\n repeatCount?: number; // 반복 횟수 (-1 = 무한)\n ease?: \"linear\" | \"ease-in\" | \"ease-out\" | \"ease-in-out\"; // 이징 함수\n autoStart?: boolean; // 자동 시작 여부\n onComplete?: () => void; // 완료 콜백\n onRepeat?: (count: number) => void; // 반복 콜백\n showOnMount?: boolean;\n}\n\ninterface AutoSlideReturn {\n position: { x: number; y: number };\n isAnimating: boolean;\n isVisible: boolean;\n mounted: boolean;\n start: () => void;\n stop: () => void;\n reset: () => void;\n slideIn: () => void;\n slideOut: () => void;\n toggle: () => void;\n}\n\nexport function useAutoSlide(options: AutoSlideConfig = {}): AutoSlideReturn {\n const {\n direction = \"left\",\n distance = 100,\n initialPosition,\n targetPosition,\n duration = 1000,\n delay = 0,\n repeat = false,\n repeatDelay = 1000,\n repeatCount = -1,\n ease = \"ease-in-out\",\n autoStart = true,\n onComplete,\n onRepeat,\n showOnMount = false,\n } = options;\n\n // 방향에 따른 기본 위치 계산\n const getDefaultPositions = useCallback(() => {\n const defaultInitial = { x: 0, y: 0 };\n const defaultTarget = { x: 0, y: 0 };\n\n switch (direction) {\n case \"left\":\n defaultInitial.x = distance;\n defaultTarget.x = 0;\n break;\n case \"right\":\n defaultInitial.x = -distance;\n defaultTarget.x = 0;\n break;\n case \"up\":\n defaultInitial.y = distance;\n defaultTarget.y = 0;\n break;\n case \"down\":\n defaultInitial.y = -distance;\n defaultTarget.y = 0;\n break;\n case \"left-up\":\n defaultInitial.x = distance;\n defaultInitial.y = distance;\n defaultTarget.x = 0;\n defaultTarget.y = 0;\n break;\n case \"left-down\":\n defaultInitial.x = distance;\n defaultInitial.y = -distance;\n defaultTarget.x = 0;\n defaultTarget.y = 0;\n break;\n case \"right-up\":\n defaultInitial.x = -distance;\n defaultInitial.y = distance;\n defaultTarget.x = 0;\n defaultTarget.y = 0;\n break;\n case \"right-down\":\n defaultInitial.x = -distance;\n defaultInitial.y = -distance;\n defaultTarget.x = 0;\n defaultTarget.y = 0;\n break;\n }\n\n return {\n initial: initialPosition || defaultInitial,\n target: targetPosition || defaultTarget,\n };\n }, [direction, distance, initialPosition, targetPosition]);\n\n const positions = getDefaultPositions();\n const [position, setPosition] = useState(\n showOnMount ? positions.initial : positions.target,\n );\n const [isAnimating, setIsAnimating] = useState(false);\n const [isVisible, setIsVisible] = useState(showOnMount ? true : false);\n const [mounted, setMounted] = useState(false);\n const motionRef = useRef<number | null>(null);\n const timeoutRef = useRef<number | null>(null);\n const repeatCountRef = useRef(0);\n const isSlidingInRef = useRef(true);\n\n // 하이드레이션 이슈 해결을 위한 mounted 상태 관리\n useEffect(() => {\n setMounted(true);\n }, []);\n\n // 이징 함수\n const getEasing = useCallback(\n (t: number): number => {\n switch (ease) {\n case \"linear\":\n return t;\n case \"ease-in\":\n return t * t;\n case \"ease-out\":\n return 1 - (1 - t) * (1 - t);\n case \"ease-in-out\":\n return t < 0.5 ? 2 * t * t : 1 - Math.pow(-2 * t + 2, 2) / 2;\n default:\n return t;\n }\n },\n [ease],\n );\n\n // 모션 실행 함수\n const animate = useCallback(\n (\n from: { x: number; y: number },\n to: { x: number; y: number },\n onFinish?: () => void,\n ) => {\n if (!mounted) return;\n\n setIsAnimating(true);\n const startTime = performance.now();\n const startPosition = from;\n\n const updatePosition = (currentTime: number) => {\n const elapsed = currentTime - startTime;\n const progress = Math.min(elapsed / duration, 1);\n const easedProgress = getEasing(progress);\n\n const currentX =\n startPosition.x + (to.x - startPosition.x) * easedProgress;\n const currentY =\n startPosition.y + (to.y - startPosition.y) * easedProgress;\n\n setPosition({ x: currentX, y: currentY });\n setIsVisible(true);\n\n if (progress < 1) {\n motionRef.current = requestAnimationFrame(updatePosition);\n } else {\n setIsAnimating(false);\n onFinish?.();\n }\n };\n\n motionRef.current = requestAnimationFrame(updatePosition);\n },\n [mounted, duration, getEasing],\n );\n\n // 슬라이드 인\n const slideIn = useCallback(() => {\n if (!mounted || isAnimating) return;\n\n animate(positions.initial, positions.target, () => {\n onComplete?.();\n\n if (\n repeat &&\n (repeatCount === -1 || repeatCountRef.current < repeatCount)\n ) {\n repeatCountRef.current++;\n onRepeat?.(repeatCountRef.current);\n\n timeoutRef.current = window.setTimeout(() => {\n slideOut();\n }, repeatDelay);\n }\n });\n }, [\n mounted,\n isAnimating,\n animate,\n positions.initial,\n positions.target,\n onComplete,\n repeat,\n repeatCount,\n repeatDelay,\n onRepeat,\n ]);\n\n // 슬라이드 아웃\n const slideOut = useCallback(() => {\n if (!mounted || isAnimating) return;\n\n animate(positions.target, positions.initial, () => {\n onComplete?.();\n\n if (\n repeat &&\n (repeatCount === -1 || repeatCountRef.current < repeatCount)\n ) {\n repeatCountRef.current++;\n onRepeat?.(repeatCountRef.current);\n\n timeoutRef.current = window.setTimeout(() => {\n slideIn();\n }, repeatDelay);\n }\n });\n }, [\n mounted,\n isAnimating,\n animate,\n positions.target,\n positions.initial,\n onComplete,\n repeat,\n repeatCount,\n repeatDelay,\n onRepeat,\n ]);\n\n // 시작\n const start = useCallback(() => {\n if (!mounted || isAnimating) return;\n\n if (delay > 0) {\n timeoutRef.current = window.setTimeout(() => {\n slideIn();\n }, delay);\n } else {\n slideIn();\n }\n }, [mounted, isAnimating, delay, slideIn]);\n\n // 정지\n const stop = useCallback(() => {\n if (motionRef.current !== null) {\n cancelAnimationFrame(motionRef.current);\n motionRef.current = null;\n }\n\n if (timeoutRef.current !== null) {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = null;\n }\n\n setIsAnimating(false);\n }, []);\n\n // 리셋\n const reset = useCallback(() => {\n stop();\n setPosition(positions.initial);\n setIsVisible(showOnMount ? true : false);\n repeatCountRef.current = 0;\n isSlidingInRef.current = true;\n }, [stop, positions.initial, showOnMount]);\n\n // 토글\n const toggle = useCallback(() => {\n if (isSlidingInRef.current) {\n slideOut();\n isSlidingInRef.current = false;\n } else {\n slideIn();\n isSlidingInRef.current = true;\n }\n }, [slideIn, slideOut]);\n\n // 자동 시작\n useEffect(() => {\n if (mounted && autoStart) {\n start();\n }\n }, [mounted, autoStart, start]);\n\n // 클린업\n useEffect(() => {\n return () => {\n if (motionRef.current !== null) {\n cancelAnimationFrame(motionRef.current);\n }\n if (timeoutRef.current !== null) {\n clearTimeout(timeoutRef.current);\n }\n };\n }, []);\n\n return {\n position,\n isAnimating,\n isVisible,\n mounted,\n start,\n stop,\n reset,\n slideIn,\n slideOut,\n toggle,\n };\n}\n","import { useRef, useEffect, useState, useCallback } from \"react\";\n\ninterface MotionStep {\n id: string;\n motion: () => void;\n delay?: number;\n duration?: number;\n onComplete?: () => void;\n}\n\ninterface MotionOrchestraOptions {\n mode?: \"sequential\" | \"parallel\" | \"stagger\";\n staggerDelay?: number;\n autoStart?: boolean;\n loop?: boolean;\n onComplete?: () => void;\n}\n\ninterface OrchestraState {\n isPlaying: boolean;\n currentStep: number;\n completedSteps: Set<string>;\n}\n\nexport function useMotionOrchestra(options: MotionOrchestraOptions = {}) {\n const {\n mode = \"sequential\",\n staggerDelay = 100,\n autoStart = false,\n loop = false,\n onComplete,\n } = options;\n\n const [orchestraState, setOrchestraState] = useState<OrchestraState>({\n isPlaying: false,\n currentStep: 0,\n completedSteps: new Set(),\n });\n\n const motionsRef = useRef<MotionStep[]>([]);\n const timeoutsRef = useRef<ReturnType<typeof setTimeout>[]>([]);\n\n // 모션 추가\n const addMotion = useCallback((step: MotionStep) => {\n motionsRef.current.push(step);\n }, []);\n\n // 모션 제거\n const removeMotion = useCallback((id: string) => {\n motionsRef.current = motionsRef.current.filter((step) => step.id !== id);\n }, []);\n\n // 모든 타임아웃 정리\n const clearTimeouts = useCallback(() => {\n timeoutsRef.current.forEach((timeout) => clearTimeout(timeout));\n timeoutsRef.current = [];\n }, []);\n\n // 순차 실행\n const playSequential = useCallback(() => {\n if (motionsRef.current.length === 0) return;\n\n const playStep = (index: number) => {\n if (index >= motionsRef.current.length) {\n // 모든 모션 완료\n setOrchestraState((prev) => ({\n ...prev,\n isPlaying: false,\n currentStep: 0,\n }));\n onComplete?.();\n\n if (loop) {\n // 루프 모드: 다시 시작\n setTimeout(() => {\n setOrchestraState((prev) => ({\n ...prev,\n isPlaying: true,\n completedSteps: new Set(),\n }));\n playSequential();\n }, 1000);\n }\n return;\n }\n\n const step = motionsRef.current[index];\n setOrchestraState((prev) => ({\n ...prev,\n currentStep: index,\n completedSteps: new Set([...prev.completedSteps, step.id]),\n }));\n\n // 모션 실행\n step.motion();\n\n // 완료 콜백\n if (step.onComplete) {\n step.onComplete();\n }\n\n // 다음 단계로\n const timeout = setTimeout(() => {\n playStep(index + 1);\n }, step.delay || 0);\n\n timeoutsRef.current.push(timeout);\n };\n\n playStep(0);\n }, [loop, onComplete]);\n\n // 병렬 실행\n const playParallel = useCallback(() => {\n if (motionsRef.current.length === 0) return;\n\n const completedSteps = new Set<string>();\n\n motionsRef.current.forEach((step) => {\n const timeout = setTimeout(() => {\n step.motion();\n completedSteps.add(step.id);\n\n if (step.onComplete) {\n step.onComplete();\n }\n\n // 모든 모션 완료 확인\n if (completedSteps.size === motionsRef.current.length) {\n setOrchestraState((prev) => ({\n ...prev,\n isPlaying: false,\n currentStep: 0,\n }));\n onComplete?.();\n\n if (loop) {\n setTimeout(() => {\n setOrchestraState((prev) => ({ ...prev, isPlaying: true }));\n playParallel();\n }, 1000);\n }\n }\n }, step.delay || 0);\n\n timeoutsRef.current.push(timeout);\n });\n\n setOrchestraState((prev) => ({\n ...prev,\n completedSteps: new Set(completedSteps),\n }));\n }, [loop, onComplete]);\n\n // 스태거 실행\n const playStagger = useCallback(() => {\n if (motionsRef.current.length === 0) return;\n\n const completedSteps = new Set<string>();\n\n motionsRef.current.forEach((step, index) => {\n const timeout = setTimeout(\n () => {\n step.motion();\n completedSteps.add(step.id);\n\n if (step.onComplete) {\n step.onComplete();\n }\n\n setOrchestraState((prev) => ({\n ...prev,\n currentStep: index,\n completedSteps: new Set([...prev.completedSteps, step.id]),\n }));\n\n // 모든 모션 완료 확인\n if (completedSteps.size === motionsRef.current.length) {\n setOrchestraState((prev) => ({\n ...prev,\n isPlaying: false,\n currentStep: 0,\n }));\n onComplete?.();\n\n if (loop) {\n setTimeout(() => {\n setOrchestraState((prev) => ({\n ...prev,\n isPlaying: true,\n completedSteps: new Set(),\n }));\n playStagger();\n }, 1000);\n }\n }\n },\n (step.delay || 0) + index * staggerDelay,\n );\n\n timeoutsRef.current.push(timeout);\n });\n }, [staggerDelay, loop, onComplete]);\n\n // 재생 시작\n const play = useCallback(() => {\n clearTimeouts();\n setOrchestraState((prev) => ({\n ...prev,\n isPlaying: true,\n currentStep: 0,\n completedSteps: new Set(),\n }));\n\n switch (mode) {\n case \"sequential\":\n playSequential();\n break;\n case \"parallel\":\n playParallel();\n break;\n case \"stagger\":\n playStagger();\n break;\n }\n }, [mode, clearTimeouts, playSequential, playParallel, playStagger]);\n\n // 정지\n const stop = useCallback(() => {\n clearTimeouts();\n setOrchestraState((prev) => ({\n ...prev,\n isPlaying: false,\n currentStep: 0,\n }));\n }, [clearTimeouts]);\n\n // 일시정지\n const pause = useCallback(() => {\n setOrchestraState((prev) => ({ ...prev, isPlaying: false }));\n }, []);\n\n // 재개\n const resume = useCallback(() => {\n if (orchestraState.currentStep < motionsRef.current.length) {\n setOrchestraState((prev) => ({ ...prev, isPlaying: true }));\n\n switch (mode) {\n case \"sequential\":\n playSequential();\n break;\n case \"parallel\":\n playParallel();\n break;\n case \"stagger\":\n playStagger();\n break;\n }\n }\n }, [\n mode,\n orchestraState.currentStep,\n playSequential,\n playParallel,\n playStagger,\n ]);\n\n // 자동 시작\n useEffect(() => {\n if (autoStart && motionsRef.current.length > 0) {\n play();\n }\n }, [autoStart, play]);\n\n // 정리\n useEffect(() => {\n return () => {\n clearTimeouts();\n };\n }, [clearTimeouts]);\n\n return {\n addMotion,\n removeMotion,\n play,\n stop,\n pause,\n resume,\n isPlaying: orchestraState.isPlaying,\n currentStep: orchestraState.currentStep,\n completedSteps: orchestraState.completedSteps,\n totalSteps: motionsRef.current.length,\n };\n}\n","import { useState, useEffect, useRef, useCallback } from \"react\";\n\ninterface MotionStep {\n id: string;\n duration: number;\n delay?: number;\n ease?:\n | \"linear\"\n | \"ease-in\"\n | \"ease-out\"\n | \"ease-in-out\"\n | \"bounce\"\n | \"elastic\";\n onStart?: () => void;\n onUpdate?: (progress: number) => void;\n onComplete?: () => void;\n onError?: (error: Error) => void;\n}\n\nexport interface OrchestrationConfig {\n // 기본 설정\n autoStart?: boolean; // 자동 시작 여부\n loop?: boolean; // 반복 여부\n loopCount?: number; // 반복 횟수 (-1 = 무한)\n loopDelay?: number; // 반복 간 지연 시간 (ms)\n\n // 타임라인 설정\n timeline?: MotionStep[]; // 모션 시퀀스\n duration?: number; // 전체 지속 시간 (ms)\n\n // 제어 설정\n speed?: number; // 재생 속도 (1 = 정상, 2 = 2배 빠름)\n reverse?: boolean; // 역방향 재생\n\n // 콜백 함수들\n onStart?: () => void;\n onComplete?: () => void;\n onLoop?: (count: number) => void;\n onError?: (error: Error) => void;\n onProgress?: (progress: number) => void;\n onStepStart?: (stepId: string) => void;\n onStepComplete?: (stepId: string) => void;\n}\n\ninterface OrchestrationState {\n isPlaying: boolean;\n isPaused: boolean;\n currentTime: number;\n progress: number;\n currentStep: string | null;\n loopCount: number;\n error: string | null;\n}\n\ninterface OrchestrationReturn {\n // 상태\n isPlaying: boolean;\n isPaused: boolean;\n currentTime: number;\n progress: number;\n currentStep: string | null;\n loopCount: number;\n error: string | null;\n\n // 제어\n play: () => void;\n pause: () => void;\n stop: () => void;\n reset: () => void;\n seek: (time: number) => void;\n setSpeed: (speed: number) => void;\n reverse: () => void;\n\n // 타임라인 관리\n addStep: (step: MotionStep) => void;\n removeStep: (stepId: string) => void;\n updateStep: (stepId: string, updates: Partial<MotionStep>) => void;\n reorderSteps: (stepIds: string[]) => void;\n\n // 유틸리티\n getStepProgress: (stepId: string) => number;\n getStepTime: (stepId: string) => number;\n getTotalDuration: () => number;\n}\n\nexport function useOrchestration(\n options: OrchestrationConfig = {},\n): OrchestrationReturn {\n const {\n autoStart = false,\n loop = false,\n loopCount = -1,\n loopDelay = 1000,\n timeline = [],\n duration: totalDuration,\n speed = 1,\n reverse = false,\n onStart,\n onComplete,\n onLoop,\n onError: _onError,\n onProgress,\n onStepStart,\n onStepComplete,\n } = options;\n\n const [state, setState] = useState<OrchestrationState>({\n isPlaying: false,\n isPaused: false,\n currentTime: 0,\n progress: 0,\n currentStep: null,\n loopCount: 0,\n error: null,\n });\n\n const [steps, setSteps] = useState<MotionStep[]>(timeline);\n const [currentSpeed, setCurrentSpeed] = useState(speed);\n const [isReversed, setIsReversed] = useState(reverse);\n\n const motionRef = useRef<number | null>(null);\n const startTimeRef = useRef<number>(0);\n const pauseTimeRef = useRef<number>(0);\n const stepStartTimesRef = useRef<Map<string, number>>(new Map());\n const stepDurationsRef = useRef<Map<string, number>>(new Map());\n\n // 이징 함수\n const getEasing = useCallback(\n (t: number, ease: string = \"linear\"): number => {\n switch (ease) {\n case \"linear\":\n return t;\n case \"ease-in\":\n return t * t;\n case \"ease-out\":\n return 1 - (1 - t) * (1 - t);\n case \"ease-in-out\":\n return t < 0.5 ? 2 * t * t : 1 - Math.pow(-2 * t + 2, 2) / 2;\n case \"bounce\":\n if (t < 1 / 2.75) {\n return 7.5625 * t * t;\n } else if (t < 2 / 2.75) {\n return 7.5625 * (t -= 1.5 / 2.75) * t + 0.75;\n } else if (t < 2.5 / 2.75) {\n return 7.5625 * (t -= 2.25 / 2.75) * t + 0.9375;\n } else {\n return 7.5625 * (t -= 2.625 / 2.75) * t + 0.984375;\n }\n case \"elastic\":\n if (t === 0) return 0;\n if (t === 1) return 1;\n return (\n Math.pow(2, -10 * t) *\n Math.sin(((t - 0.075) * (2 * Math.PI)) / 0.3) +\n 1\n );\n default:\n return t;\n }\n },\n [],\n );\n\n // 전체 지속 시간 계산\n const getTotalDuration = useCallback((): number => {\n if (totalDuration) return totalDuration;\n\n let maxEndTime = 0;\n steps.forEach((step) => {\n const stepEndTime = (step.delay || 0) + step.duration;\n maxEndTime = Math.max(maxEndTime, stepEndTime);\n });\n return maxEndTime;\n }, [steps, totalDuration]);\n\n // 스텝 시작 시간 계산\n const calculateStepTimes = useCallback(() => {\n const stepTimes = new Map<string, number>();\n const stepDurations = new Map<string, number>();\n let currentTime = 0;\n\n steps.forEach((step) => {\n stepTimes.set(step.id, currentTime + (step.delay || 0));\n stepDurations.set(step.id, step.duration);\n currentTime += (step.delay || 0) + step.duration;\n });\n\n stepStartTimesRef.current = stepTimes;\n stepDurationsRef.current = stepDurations;\n }, [steps]);\n\n // 현재 스텝 찾기\n const getCurrentStep = useCallback(\n (time: number): string | null => {\n for (const step of steps) {\n const startTime = stepStartTimesRef.current.get(step.id) || 0;\n const endTime =\n startTime + (stepDurationsRef.current.get(step.id) || 0);\n\n if (time >= startTime && time <= endTime) {\n return step.id;\n }\n }\n return null;\n },\n [steps],\n );\n\n // 스텝 진행률 계산\n const getStepProgress = useCallback(\n (stepId: string): number => {\n const startTime = stepStartTimesRef.current.get(stepId) || 0;\n const duration = stepDurationsRef.current.get(stepId) || 0;\n const currentTime = state.currentTime;\n\n if (currentTime < startTime) return 0;\n if (currentTime > startTime + duration) return 1;\n\n const stepProgress = (currentTime - startTime) / duration;\n return Math.max(0, Math.min(1, stepProgress));\n },\n [state.currentTime],\n );\n\n // 스텝 시간 계산\n const getStepTime = useCallback(\n (stepId: string): number => {\n const startTime = stepStartTimesRef.current.get(stepId) || 0;\n const duration = stepDurationsRef.current.get(stepId) || 0;\n const currentTime = state.currentTime;\n\n if (currentTime < startTime) return 0;\n if (currentTime > startTime + duration) return duration;\n\n return currentTime - startTime;\n },\n [state.currentTime],\n );\n\n // 모션 업데이트\n const updateMotion = useCallback(\n (currentTime: number) => {\n const total = getTotalDuration();\n const adjustedTime = isReversed ? total - currentTime : currentTime;\n const progress = Math.min(adjustedTime / total, 1);\n\n const currentStep = getCurrentStep(adjustedTime);\n\n setState((prev) => ({\n ...prev,\n currentTime: adjustedTime,\n progress,\n currentStep,\n }));\n\n onProgress?.(progress);\n\n // 현재 스텝의 콜백 실행\n if (currentStep) {\n const step = steps.find((s) => s.id === currentStep);\n if (step) {\n const stepProgress = getStepProgress(currentStep);\n const easedProgress = getEasing(stepProgress, step.ease);\n step.onUpdate?.(easedProgress);\n }\n }\n\n // 모션 완료 체크\n if (progress >= 1) {\n if (loop && (loopCount === -1 || state.loopCount < loopCount)) {\n // 루프\n setState((prev) => ({\n ...prev,\n loopCount: prev.loopCount + 1,\n }));\n onLoop?.(state.loopCount + 1);\n\n setTimeout(() => {\n reset();\n play();\n }, loopDelay);\n } else {\n // 완료\n setState((prev) => ({\n ...prev,\n isPlaying: false,\n currentTime: isReversed ? 0 : total,\n progress: 1,\n }));\n onComplete?.();\n }\n } else {\n // 계속 재생\n motionRef.current = requestAnimationFrame(() => {\n const elapsed =\n ((performance.now() - startTimeRef.current) * currentSpeed) / 1000;\n updateMotion(elapsed);\n });\n }\n },\n [\n getTotalDuration,\n isReversed,\n getCurrentStep,\n onProgress,\n steps,\n getStepProgress,\n getEasing,\n loop,\n loopCount,\n state.loopCount,\n loopDelay,\n onLoop,\n onComplete,\n currentSpeed,\n ],\n );\n\n // 재생\n const play = useCallback(() => {\n if (state.isPlaying) return;\n\n setState((prev) => ({\n ...prev,\n isPlaying: true,\n isPaused: false,\n error: null,\n }));\n\n onStart?.();\n\n const startTime =\n performance.now() - (state.currentTime * 1000) / currentSpeed;\n startTimeRef.current = startTime;\n\n motionRef.current = requestAnimationFrame(() => {\n const elapsed =\n ((performance.now() - startTimeRef.current) * currentSpeed) / 1000;\n updateMotion(elapsed);\n });\n }, [state.isPlaying, state.currentTime, currentSpeed, onStart, updateMotion]);\n\n // 일시정지\n const pause = useCallback(() => {\n if (!state.isPlaying || state.isPaused) return;\n\n setState((prev) => ({\n ...prev,\n isPaused: true,\n }));\n\n if (motionRef.current) {\n cancelAnimationFrame(motionRef.current);\n motionRef.current = null;\n }\n\n pauseTimeRef.current = state.currentTime;\n }, [state.isPlaying, state.isPaused, state.currentTime]);\n\n // 정지\n const stop = useCallback(() => {\n setState((prev) => ({\n ...prev,\n isPlaying: false,\n isPaused: false,\n currentTime: 0,\n progress: 0,\n currentStep: null,\n }));\n\n if (motionRef.current) {\n cancelAnimationFrame(motionRef.current);\n motionRef.current = null;\n }\n }, []);\n\n // 리셋\n const reset = useCallback(() => {\n stop();\n setState((prev) => ({\n ...prev,\n currentTime: 0,\n progress: 0,\n currentStep: null,\n loopCount: 0,\n }));\n }, [stop]);\n\n // 시크\n const seek = useCallback(\n (time: number) => {\n const total = getTotalDuration();\n const clampedTime = Math.max(0, Math.min(time, total));\n\n setState((prev) => ({\n ...prev,\n currentTime: clampedTime,\n progress: clampedTime / total,\n currentStep: getCurrentStep(clampedTime),\n }));\n },\n [getTotalDuration, getCurrentStep],\n );\n\n // 속도 설정\n const setSpeed = useCallback((speed: number) => {\n setCurrentSpeed(Math.max(0.1, speed));\n }, []);\n\n // 역방향 토글\n const reverseDirection = useCallback(() => {\n setIsReversed((prev) => !prev);\n }, []);\n\n // 스텝 추가\n const addStep = useCallback((step: MotionStep) => {\n setSteps((prev) => [...prev, step]);\n }, []);\n\n // 스텝 제거\n const removeStep = useCallback((stepId: string) => {\n setSteps((prev) => prev.filter((step) => step.id !== stepId));\n }, []);\n\n // 스텝 업데이트\n const updateStep = useCallback(\n (stepId: string, updates: Partial<MotionStep>) => {\n setSteps((prev) =>\n prev.map((step) =>\n step.id === stepId ? { ...step, ...updates } : step,\n ),\n );\n },\n [],\n );\n\n // 스텝 순서 변경\n const reorderSteps = useCallback((stepIds: string[]) => {\n setSteps((prev) => {\n const stepMap = new Map(prev.map((step) => [step.id, step]));\n return stepIds\n .map((id) => stepMap.get(id))\n .filter(Boolean) as MotionStep[];\n });\n }, []);\n\n // 스텝 시작/완료 콜백 처리\n useEffect(() => {\n const currentStep = state.currentStep;\n if (currentStep) {\n onStepStart?.(currentStep);\n\n const step = steps.find((s) => s.id === currentStep);\n step?.onStart?.();\n }\n }, [state.currentStep, steps, onStepStart]);\n\n // 스텝 완료 체크\n useEffect(() => {\n const currentStep = state.currentStep;\n if (currentStep) {\n const stepProgress = getStepProgress(currentStep);\n if (stepProgress >= 1) {\n const step = steps.find((s) => s.id === currentStep);\n step?.onComplete?.();\n onStepComplete?.(currentStep);\n }\n }\n }, [\n state.currentTime,\n state.currentStep,\n steps,\n getStepProgress,\n onStepComplete,\n ]);\n\n // 스텝 시간 재계산\n useEffect(() => {\n calculateStepTimes();\n }, [calculateStepTimes]);\n\n // 자동 시작\n useEffect(() => {\n if (autoStart && steps.length > 0) {\n play();\n }\n }, [autoStart, steps.length, play]);\n\n // 클린업\n useEffect(() => {\n return () => {\n if (motionRef.current) {\n cancelAnimationFrame(motionRef.current);\n }\n };\n }, []);\n\n return {\n // 상태\n isPlaying: state.isPlaying,\n isPaused: state.isPaused,\n currentTime: state.currentTime,\n progress: state.progress,\n currentStep: state.currentStep,\n loopCount: state.loopCount,\n error: state.error,\n\n // 제어\n play,\n pause,\n stop,\n reset,\n seek,\n setSpeed,\n reverse: reverseDirection,\n\n // 타임라인 관리\n addStep,\n removeStep,\n updateStep,\n reorderSteps,\n\n // 유틸리티\n getStepProgress,\n getStepTime,\n getTotalDuration,\n };\n}\n","import { useRef, useCallback, useState, useEffect } from \"react\";\n\nexport interface SequenceConfig {\n autoStart?: boolean;\n loop?: boolean;\n}\n\ninterface SequenceItem {\n hook: () => any;\n delay?: number;\n}\n\nexport function useSequence(\n sequence: SequenceItem[],\n options: SequenceConfig = {},\n) {\n const { autoStart = true, loop = false } = options;\n\n const [currentIndex, setCurrentIndex] = useState(0);\n const [isPlaying, setIsPlaying] = useState(false);\n const motionsRef = useRef<any[]>([]);\n const timeoutsRef = useRef<number[]>([]);\n\n // 컴포넌트 레벨에서 모션 훅들을 미리 생성\n const motions = sequence.map((item) => item.hook());\n\n const start = useCallback(() => {\n if (isPlaying) return;\n\n setIsPlaying(true);\n setCurrentIndex(0);\n\n // 모션 참조 설정\n motionsRef.current = motions;\n\n // 첫 번째 모션 시작\n if (motionsRef.current[0]) {\n motionsRef.current[0].start();\n }\n\n // 순차적으로 다음 모션들 시작\n sequence.forEach((item, index) => {\n if (index === 0) return; // 첫 번째는 이미 시작됨\n\n const timeout = window.setTimeout(() => {\n if (motionsRef.current[index]) {\n motionsRef.current[index].start();\n setCurrentIndex(index);\n }\n }, item.delay || 0);\n\n timeoutsRef.current.push(timeout);\n });\n\n // 마지막 모션 완료 후 처리\n const totalDuration = sequence.reduce((total, item) => {\n return total + (item.delay || 0);\n }, 0);\n\n const finalTimeout = window.setTimeout(() => {\n setIsPlaying(false);\n if (loop) {\n start(); // 루프 모드면 다시 시작\n }\n }, totalDuration + 1000); // 마지막 모션 완료 대기\n\n timeoutsRef.current.push(finalTimeout);\n }, [sequence, isPlaying, loop, motions]);\n\n const stop = useCallback(() => {\n setIsPlaying(false);\n setCurrentIndex(0);\n\n // 모든 타임아웃 정리\n timeoutsRef.current.forEach((timeout) => window.clearTimeout(timeout));\n timeoutsRef.current = [];\n\n // 모든 모션 정지\n motionsRef.current.forEach((motion) => {\n if (motion && motion.stop) {\n motion.stop();\n }\n });\n }, []);\n\n const reset = useCallback(() => {\n stop();\n setCurrentIndex(0);\n\n // 모든 모션 리셋\n motionsRef.current.forEach((motion) => {\n if (motion && motion.reset) {\n motion.reset();\n }\n });\n }, [stop]);\n\n const pause = useCallback(() => {\n setIsPlaying(false);\n\n // 현재 실행 중인 모션 일시정지\n if (\n motionsRef.current[currentIndex] &&\n motionsRef.current[currentIndex].pause\n ) {\n motionsRef.current[currentIndex].pause();\n }\n }, [currentIndex]);\n\n const resume = useCallback(() => {\n setIsPlaying(true);\n\n // 현재 모션 재개\n if (\n motionsRef.current[currentIndex] &&\n motionsRef.current[currentIndex].resume\n ) {\n motionsRef.current[currentIndex].resume();\n }\n }, [currentIndex]);\n\n // 자동 시작\n useEffect(() => {\n if (autoStart && !isPlaying) {\n start();\n }\n }, [autoStart, isPlaying, start]);\n\n return {\n start,\n stop,\n pause,\n resume,\n reset,\n isPlaying,\n currentIndex,\n totalMotions: sequence.length,\n ref: motions[0]?.ref || (() => {}), // 첫 번째 모션의 ref 반환\n };\n}\n","import { useRef, useState, useCallback, useEffect } from \"react\";\n\nexport interface LayoutMotionConfig {\n from: {\n width?: number | string;\n height?: number | string;\n flexDirection?: \"row\" | \"column\" | \"row-reverse\" | \"column-reverse\";\n justifyContent?:\n | \"flex-start\"\n | \"flex-end\"\n | \"center\"\n | \"space-between\"\n | \"space-around\"\n | \"space-evenly\";\n alignItems?: \"flex-start\" | \"flex-end\" | \"center\" | \"stretch\" | \"baseline\";\n gap?: number | string;\n gridTemplateColumns?: string;\n gridTemplateRows?: string;\n gridGap?: number | string;\n };\n to: {\n width?: number | string;\n height?: number | string;\n flexDirection?: \"row\" | \"column\" | \"row-reverse\" | \"column-reverse\";\n justifyContent?:\n | \"flex-start\"\n | \"flex-end\"\n | \"center\"\n | \"space-between\"\n | \"space-around\"\n | \"space-evenly\";\n alignItems?: \"flex-start\" | \"flex-end\" | \"center\" | \"stretch\" | \"baseline\";\n gap?: number | string;\n gridTemplateColumns?: string;\n gridTemplateRows?: string;\n gridGap?: number | string;\n };\n duration?: number;\n easing?: string;\n autoStart?: boolean;\n onComplete?: () => void;\n}\n\nexport interface LayoutState {\n isAnimating: boolean;\n progress: number;\n currentStyle: React.CSSProperties;\n}\n\nexport function useLayoutMotion(config: LayoutMotionConfig) {\n const {\n from,\n to,\n duration = 500,\n easing = \"ease-in-out\",\n autoStart = false,\n onComplete,\n } = config;\n\n const ref = useRef<HTMLDivElement>(null);\n const [state, setState] = useState<LayoutState>({\n isAnimating: false,\n progress: 0,\n currentStyle: {},\n });\n\n const motionFrameRef = useRef<number | null>(null);\n const startTimeRef = useRef<number>(0);\n\n // CSS 값 파싱\n const parseValue = useCallback(\n (value: number | string | undefined): number => {\n if (typeof value === \"number\") return value;\n if (typeof value === \"string\") {\n const match = value.match(/^(\\d+(?:\\.\\d+)?)(px|%|em|rem|vh|vw)?$/);\n return match ? parseFloat(match[1]) : 0;\n }\n return 0;\n },\n [],\n );\n\n // 값 보간\n const interpolate = useCallback(\n (from: number, to: number, progress: number): number => {\n return from + (to - from) * progress;\n },\n [],\n );\n\n // 이징 적용\n const applyEasing = useCallback(\n (t: number): number => {\n switch (easing) {\n case \"ease-in\":\n return t * t;\n case \"ease-out\":\n return 1 - (1 - t) * (1 - t);\n case \"ease-in-out\":\n return t < 0.5 ? 2 * t * t : 1 - Math.pow(-2 * t + 2, 2) / 2;\n default:\n return t;\n }\n },\n [easing],\n );\n\n // 스타일 계산\n const calculateStyle = useCallback(\n (progress: number): React.CSSProperties => {\n const easedProgress = applyEasing(progress);\n const style: React.CSSProperties = {};\n\n // 크기 모션\n if (from.width !== undefined && to.width !== undefined) {\n const fromWidth = parseValue(from.width);\n const toWidth = parseValue(to.width);\n style.width = `${interpolate(fromWidth, toWidth, easedProgress)}px`;\n }\n\n if (from.height !== undefined && to.height !== undefined) {\n const fromHeight = parseValue(from.height);\n const toHeight = parseValue(to.height);\n style.height = `${interpolate(fromHeight, toHeight, easedProgress)}px`;\n }\n\n // Flexbox 모션\n if (from.flexDirection !== to.flexDirection) {\n style.flexDirection =\n progress < 0.5 ? from.flexDirection : to.flexDirection;\n }\n\n if (from.justifyContent !== to.justifyContent) {\n style.justifyContent =\n progress < 0.5 ? from.justifyContent : to.justifyContent;\n }\n\n if (from.alignItems !== to.alignItems) {\n style.alignItems = progress < 0.5 ? from.alignItems : to.alignItems;\n }\n\n if (from.gap !== undefined && to.gap !== undefined) {\n const fromGap = parseValue(from.gap);\n const toGap = parseValue(to.gap);\n style.gap = `${interpolate(fromGap, toGap, easedProgress)}px`;\n }\n\n // Grid 모션\n if (from.gridTemplateColumns !== to.gridTemplateColumns) {\n style.gridTemplateColumns =\n progress < 0.5 ? from.gridTemplateColumns : to.gridTemplateColumns;\n }\n\n if (from.gridTemplateRows !== to.gridTemplateRows) {\n style.gridTemplateRows =\n progress < 0.5 ? from.gridTemplateRows : to.gridTemplateRows;\n }\n\n if (from.gridGap !== undefined && to.gridGap !== undefined) {\n const fromGridGap = parseValue(from.gridGap);\n const toGridGap = parseValue(to.gridGap);\n style.gridGap = `${interpolate(fromGridGap, toGridGap, easedProgress)}px`;\n }\n\n return style;\n },\n [from, to, applyEasing, parseValue, interpolate],\n );\n\n // 모션 업데이트\n const updateMotion = useCallback(() => {\n if (!state.isAnimating) return;\n\n const elapsed = Date.now() - startTimeRef.current;\n const progress = Math.min(elapsed / duration, 1);\n\n setState((prev) => ({\n ...prev,\n progress,\n currentStyle: calculateStyle(progress),\n }));\n\n if (progress < 1) {\n motionFrameRef.current = requestAnimationFrame(updateMotion);\n } else {\n setState((prev) => ({ ...prev, isAnimating: false }));\n onComplete?.();\n }\n }, [state.isAnimating, duration, calculateStyle, onComplete]);\n\n // 모션 시작\n const start = useCallback(() => {\n setState((prev) => ({ ...prev, isAnimating: true, progress: 0 }));\n startTimeRef.current = Date.now();\n updateMotion();\n }, [updateMotion]);\n\n // 모션 정지\n const stop = useCallback(() => {\n setState((prev) => ({ ...prev, isAnimating: false }));\n if (motionFrameRef.current) {\n cancelAnimationFrame(motionFrameRef.current);\n }\n }, []);\n\n // 모션 리셋\n const reset = useCallback(() => {\n setState({\n isAnimating: false,\n progress: 0,\n currentStyle: calculateStyle(0),\n });\n if (motionFrameRef.current) {\n cancelAnimationFrame(motionFrameRef.current);\n }\n }, [calculateStyle]);\n\n // 자동 시작\n useEffect(() => {\n if (autoStart) {\n start();\n }\n\n return () => {\n if (motionFrameRef.current) {\n cancelAnimationFrame(motionFrameRef.current);\n }\n };\n }, [autoStart, start]);\n\n return {\n ref,\n state,\n start,\n stop,\n reset,\n };\n}\n\n// 레이아웃 전환 헬퍼\nexport function createLayoutTransition(\n from: LayoutMotionConfig[\"from\"],\n to: LayoutMotionConfig[\"to\"],\n options: Partial<LayoutMotionConfig> = {},\n) {\n return {\n from,\n to,\n duration: options.duration || 500,\n easing: options.easing || \"ease-in-out\",\n autoStart: options.autoStart || false,\n onComplete: options.onComplete,\n };\n}\n","import { useState, useEffect, useRef, useCallback } from \"react\";\n\nexport interface KeyboardToggleConfig {\n initialState?: boolean; // 초기 상태\n keys?: string[]; // 토글할 키들 (기본값: [' '])\n keyCode?: number; // 특정 키코드\n keyCombo?: string[]; // 키 조합 (예: ['Control', 'K'])\n toggleOnKeyDown?: boolean; // 키다운 시 토글 여부\n toggleOnKeyUp?: boolean; // 키업 시 토글 여부\n toggleOnKeyPress?: boolean; // 키프레스 시 토글 여부\n autoReset?: boolean; // 자동 리셋 여부\n resetDelay?: number; // 자동 리셋 지연 시간 (ms)\n preventDefault?: boolean; // 기본 이벤트 방지 여부\n stopPropagation?: boolean; // 이벤트 전파 중단 여부\n requireFocus?: boolean; // 포커스된 요소에서만 동작 여부\n showOnMount?: boolean;\n}\n\ninterface KeyboardToggleReturn {\n isActive: boolean;\n mounted: boolean;\n toggle: () => void;\n activate: () => void;\n deactivate: () => void;\n reset: () => void;\n keyboardHandlers: {\n onKeyDown?: (event: React.KeyboardEvent) => void;\n onKeyUp?: (event: React.KeyboardEvent) => void;\n onKeyPress?: (event: React.KeyboardEvent) => void;\n };\n ref: React.RefObject<HTMLElement | null>;\n}\n\nexport function useKeyboardToggle(\n options: KeyboardToggleConfig = {},\n): KeyboardToggleReturn {\n const {\n initialState = false,\n keys = [\" \"],\n keyCode,\n keyCombo,\n toggleOnKeyDown = true,\n toggleOnKeyUp = false,\n toggleOnKeyPress = false,\n autoReset = false,\n resetDelay = 3000,\n preventDefault = false,\n stopPropagation = false,\n requireFocus = false,\n showOnMount = false,\n } = options;\n\n const [isActive, setIsActive] = useState(showOnMount ? initialState : false);\n const [mounted, setMounted] = useState(false);\n const resetTimeoutRef = useRef<number | null>(null);\n const elementRef = useRef<HTMLElement>(null);\n const pressedKeysRef = useRef<Set<string>>(new Set());\n\n // 하이드레이션 이슈 해결을 위한 mounted 상태 관리\n useEffect(() => {\n setMounted(true);\n }, []);\n\n // 자동 리셋 타이머 관리\n const startResetTimer = useCallback(() => {\n if (!autoReset || resetDelay <= 0) return;\n\n // 기존 타이머 클리어\n if (resetTimeoutRef.current !== null) {\n clearTimeout(resetTimeoutRef.current);\n }\n\n // 새 타이머 설정\n resetTimeoutRef.current = window.setTimeout(() => {\n setIsActive(false);\n resetTimeoutRef.current = null;\n }, resetDelay);\n }, [autoReset, resetDelay]);\n\n // 토글 함수\n const toggle = useCallback(() => {\n if (!mounted) return;\n\n setIsActive((prev) => {\n const newState = !prev;\n\n // 자동 리셋 타이머 시작\n if (newState && autoReset) {\n startResetTimer();\n } else if (!newState && resetTimeoutRef.current !== null) {\n // 비활성화 시 타이머 클리어\n clearTimeout(resetTimeoutRef.current);\n resetTimeoutRef.current = null;\n }\n\n return newState;\n });\n }, [mounted, autoReset, startResetTimer]);\n\n // 활성화 함수\n const activate = useCallback(() => {\n if (!mounted || isActive) return;\n\n setIsActive(true);\n if (autoReset) {\n startResetTimer();\n }\n }, [mounted, isActive, autoReset, startResetTimer]);\n\n // 비활성화 함수\n const deactivate = useCallback(() => {\n if (!mounted || !isActive) return;\n\n setIsActive(false);\n if (resetTimeoutRef.current !== null) {\n clearTimeout(resetTimeoutRef.current);\n resetTimeoutRef.current = null;\n }\n }, [mounted, isActive]);\n\n // 리셋 함수\n const reset = useCallback(() => {\n setIsActive(initialState);\n if (resetTimeoutRef.current !== null) {\n clearTimeout(resetTimeoutRef.current);\n resetTimeoutRef.current = null;\n }\n }, [initialState]);\n\n // 키 매칭 함수\n const isKeyMatch = useCallback(\n (event: React.KeyboardEvent) => {\n // 키코드 매칭\n if (keyCode !== undefined && event.keyCode === keyCode) {\n return true;\n }\n\n // 키 이름 매칭\n if (keys.length > 0 && keys.includes(event.key)) {\n return true;\n }\n\n // 키 조합 매칭\n if (keyCombo && keyCombo.length > 0) {\n const pressedKeys = Array.from(pressedKeysRef.current);\n const comboMatch = keyCombo.every((key) => pressedKeys.includes(key));\n return comboMatch;\n }\n\n return false;\n },\n [keys, keyCode, keyCombo],\n );\n\n // 포커스 체크 함수\n const isFocused = useCallback(() => {\n if (!requireFocus) return true;\n return document.activeElement === elementRef.current;\n }, [requireFocus]);\n\n // 키다운 핸들러\n const handleKeyDown = useCallback(\n (event: React.KeyboardEvent) => {\n if (!toggleOnKeyDown || !isFocused()) return;\n\n // 눌린 키 추적\n pressedKeysRef.current.add(event.key);\n\n if (isKeyMatch(event)) {\n if (preventDefault) event.preventDefault();\n if (stopPropagation) event.stopPropagation();\n\n toggle();\n }\n },\n [\n toggleOnKeyDown,\n isFocused,\n isKeyMatch,\n preventDefault,\n stopPropagation,\n toggle,\n ],\n );\n\n // 키업 핸들러\n const handleKeyUp = useCallback(\n (event: React.KeyboardEvent) => {\n if (!toggleOnKeyUp || !isFocused()) return;\n\n // 눌린 키 제거\n pressedKeysRef.current.delete(event.key);\n\n if (isKeyMatch(event)) {\n if (preventDefault) event.preventDefault();\n if (stopPropagation) event.stopPropagation();\n\n toggle();\n }\n },\n [\n toggleOnKeyUp,\n isFocused,\n isKeyMatch,\n preventDefault,\n stopPropagation,\n toggle,\n ],\n );\n\n // 키프레스 핸들러\n const handleKeyPress = useCallback(\n (event: React.KeyboardEvent) => {\n if (!toggleOnKeyPress || !isFocused()) return;\n\n if (isKeyMatch(event)) {\n if (preventDefault) event.preventDefault();\n if (stopPropagation) event.stopPropagation();\n\n toggle();\n }\n },\n [\n toggleOnKeyPress,\n isFocused,\n isKeyMatch,\n preventDefault,\n stopPropagation,\n toggle,\n ],\n );\n\n // 전역 키보드 이벤트 리스너 (requireFocus가 false일 때)\n useEffect(() => {\n if (requireFocus || !mounted) return;\n\n const handleGlobalKeyDown = (event: KeyboardEvent) => {\n pressedKeysRef.current.add(event.key);\n\n if (isKeyMatch(event as any)) {\n if (preventDefault) event.preventDefault();\n if (stopPropagation) event.stopPropagation();\n\n toggle();\n }\n };\n\n const handleGlobalKeyUp = (event: KeyboardEvent) => {\n pressedKeysRef.current.delete(event.key);\n\n if (isKeyMatch(event as any)) {\n if (preventDefault) event.preventDefault();\n if (stopPropagation) event.stopPropagation();\n\n toggle();\n }\n };\n\n document.addEventListener(\"keydown\", handleGlobalKeyDown);\n document.addEventListener(\"keyup\", handleGlobalKeyUp);\n\n return () => {\n document.removeEventListener(\"keydown\", handleGlobalKeyDown);\n document.removeEventListener(\"keyup\", handleGlobalKeyUp);\n };\n }, [\n requireFocus,\n mounted,\n isKeyMatch,\n preventDefault,\n stopPropagation,\n toggle,\n ]);\n\n // 클린업\n useEffect(() => {\n return () => {\n if (resetTimeoutRef.current !== null) {\n clearTimeout(resetTimeoutRef.current);\n }\n };\n }, []);\n\n // 키보드 핸들러 객체 생성\n const keyboardHandlers = {\n ...(toggleOnKeyDown && { onKeyDown: handleKeyDown }),\n ...(toggleOnKeyUp && { onKeyUp: handleKeyUp }),\n ...(toggleOnKeyPress && { onKeyPress: handleKeyPress }),\n };\n\n return {\n isActive,\n mounted,\n toggle,\n activate,\n deactivate,\n reset,\n keyboardHandlers,\n ref: elementRef,\n };\n}\n","import { useState, useEffect } from \"react\";\n\ntype ScrollDirection = \"up\" | \"down\" | \"idle\";\n\nexport interface ScrollDirectionConfig {\n threshold?: number; // 방향 변화를 감지할 최소 스크롤 거리\n idleDelay?: number; // idle 상태로 전환되는 지연 시간 (ms)\n showOnMount?: boolean;\n}\n\nexport function useScrollDirection(options: ScrollDirectionConfig = {}) {\n const { threshold = 10, idleDelay = 150, showOnMount = false } = options;\n\n const [direction, setDirection] = useState<ScrollDirection>(\n showOnMount ? \"idle\" : \"idle\",\n );\n const [mounted, setMounted] = useState(false);\n const [lastScrollY, setLastScrollY] = useState(0);\n const [idleTimeout, setIdleTimeout] = useState<ReturnType<\n typeof setTimeout\n > | null>(null);\n\n // 하이드레이션 이슈 해결을 위한 mounted 상태 관리\n useEffect(() => {\n setMounted(true);\n }, []);\n\n useEffect(() => {\n if (!mounted) return;\n\n const handleScroll = () => {\n if (typeof window !== \"undefined\") {\n const currentScrollY = window.pageYOffset;\n const scrollDifference = Math.abs(currentScrollY - lastScrollY);\n\n // 이전 idle 타이머 클리어\n if (idleTimeout !== null) {\n clearTimeout(idleTimeout);\n }\n\n // 임계값보다 큰 스크롤 변화가 있을 때만 방향 감지\n if (scrollDifference > threshold) {\n const newDirection: ScrollDirection =\n currentScrollY > lastScrollY ? \"down\" : \"up\";\n setDirection(newDirection);\n setLastScrollY(currentScrollY);\n\n // idle 상태로 전환하는 타이머 설정\n const timeout = setTimeout(() => {\n setDirection(\"idle\");\n }, idleDelay);\n setIdleTimeout(timeout);\n }\n }\n };\n\n // 초기 상태 설정\n if (typeof window !== \"undefined\") {\n setLastScrollY(window.pageYOffset);\n }\n\n // 이벤트 리스너 등록\n window.addEventListener(\"scroll\", handleScroll, { passive: true });\n\n return () => {\n window.removeEventListener(\"scroll\", handleScroll);\n if (idleTimeout !== null) {\n clearTimeout(idleTimeout);\n }\n };\n }, [threshold, idleDelay, mounted, lastScrollY, idleTimeout]);\n\n return {\n direction,\n mounted,\n };\n}\n","import { useState, useEffect } from \"react\";\n\nexport interface StickyToggleConfig {\n offset?: number;\n behavior?: \"smooth\" | \"auto\";\n showOnMount?: boolean;\n}\n\nexport function useStickyToggle(options: StickyToggleConfig = {}) {\n const {\n offset = 0,\n behavior: _behavior = \"smooth\",\n showOnMount = false,\n } = options;\n\n const [isSticky, setIsSticky] = useState(showOnMount);\n const [mounted, setMounted] = useState(false);\n\n // 하이드레이션 이슈 해결을 위한 mounted 상태 관리\n useEffect(() => {\n setMounted(true);\n }, []);\n\n useEffect(() => {\n if (!mounted) return;\n\n const toggleSticky = () => {\n if (typeof window !== \"undefined\") {\n if (window.pageYOffset > offset) {\n setIsSticky(true);\n } else {\n setIsSticky(false);\n }\n }\n };\n\n // 초기 상태 확인\n toggleSticky();\n\n // 이벤트 리스너 등록\n window.addEventListener(\"scroll\", toggleSticky, { passive: true });\n window.addEventListener(\"resize\", toggleSticky, { passive: true });\n\n return () => {\n window.removeEventListener(\"scroll\", toggleSticky);\n window.removeEventListener(\"resize\", toggleSticky);\n };\n }, [offset, mounted]);\n\n return {\n isSticky,\n mounted,\n };\n}\n","import { useRef, useState, useCallback } from \"react\";\n\nexport interface InteractiveConfig {\n hoverScale?: number;\n clickScale?: number;\n duration?: number;\n}\n\nexport interface InteractiveState {\n scale: number;\n isHovered: boolean;\n isClicked: boolean;\n}\n\nexport function useInteractive(config: InteractiveConfig = {}) {\n const {\n hoverScale = 1.05,\n clickScale = 0.95,\n duration: _duration = 200,\n } = config;\n\n const ref = useRef<HTMLDivElement>(null);\n const [scale, setScale] = useState(1);\n const [isHovered, setIsHovered] = useState(false);\n const [isClicked, setIsClicked] = useState(false);\n\n const handleMouseEnter = useCallback(() => {\n setIsHovered(true);\n setScale(hoverScale);\n }, [hoverScale]);\n\n const handleMouseLeave = useCallback(() => {\n setIsHovered(false);\n setScale(1);\n }, []);\n\n const handleMouseDown = useCallback(() => {\n setIsClicked(true);\n setScale(clickScale);\n }, [clickScale]);\n\n const handleMouseUp = useCallback(() => {\n setIsClicked(false);\n setScale(isHovered ? hoverScale : 1);\n }, [isHovered, hoverScale]);\n\n const setRef = (element: HTMLDivElement | null) => {\n if (ref.current !== element) {\n (ref as any).current = element;\n }\n };\n\n return {\n ref: setRef,\n scale,\n isHovered,\n isClicked,\n handleMouseEnter,\n handleMouseLeave,\n handleMouseDown,\n handleMouseUp,\n };\n}\n","import { useRef, useState, useEffect } from \"react\";\n\nexport interface PerformanceMonitorConfig {\n threshold?: number;\n onPerformanceIssue?: (fps: number) => void;\n}\n\nexport interface PerformanceMonitorState {\n fps: number;\n isLowPerformance: boolean;\n frameCount: number;\n}\n\nexport function usePerformanceMonitor(config: PerformanceMonitorConfig = {}) {\n const { threshold = 30, onPerformanceIssue } = config;\n\n const ref = useRef<HTMLDivElement>(null);\n const [fps, setFps] = useState(60);\n const [isLowPerformance, setIsLowPerformance] = useState(false);\n const [frameCount, setFrameCount] = useState(0);\n const lastTime = useRef(performance.now());\n const frameCountRef = useRef(0);\n\n const measurePerformance = () => {\n const now = performance.now();\n frameCountRef.current++;\n\n if (now - lastTime.current >= 1000) {\n const currentFps = Math.round(\n (frameCountRef.current * 1000) / (now - lastTime.current),\n );\n setFps(currentFps);\n setFrameCount(frameCountRef.current);\n\n const lowPerformance = currentFps < threshold;\n setIsLowPerformance(lowPerformance);\n\n if (lowPerformance && onPerformanceIssue) {\n onPerformanceIssue(currentFps);\n }\n\n frameCountRef.current = 0;\n lastTime.current = now;\n }\n\n requestAnimationFrame(measurePerformance);\n };\n\n useEffect(() => {\n const motionId = requestAnimationFrame(measurePerformance);\n return () => cancelAnimationFrame(motionId);\n }, []);\n\n const setRef = (element: HTMLDivElement | null) => {\n if (ref.current !== element) {\n (ref as any).current = element;\n }\n };\n\n return {\n ref: setRef,\n fps,\n isLowPerformance,\n frameCount,\n };\n}\n","import { useRef, useEffect, useState, useCallback, useMemo } from \"react\";\n\nexport interface LanguageConfig {\n motionType:\n | \"fadeIn\"\n | \"slideUp\"\n | \"slideLeft\"\n | \"slideRight\"\n | \"scaleIn\"\n | \"bounceIn\";\n duration?: number;\n delay?: number;\n threshold?: number;\n pauseOnLanguageChange?: boolean;\n restartOnLanguageChange?: boolean;\n currentLanguage?: string; // 외부에서 언어 정보를 받음\n}\n\nexport function useLanguageAwareMotion(options: LanguageConfig) {\n const {\n motionType,\n duration = 700,\n delay = 0,\n threshold = 0.1,\n pauseOnLanguageChange = true,\n restartOnLanguageChange = false,\n currentLanguage: externalLanguage,\n } = options;\n\n const elementRef = useRef<HTMLElement | null>(null);\n const [isVisible, setIsVisible] = useState(false);\n const [isPaused, setIsPaused] = useState(false);\n const [internalLanguage, setInternalLanguage] = useState<string>(\"\");\n\n // ref로 상태 추적 (observer callback에서 안정적인 참조 사용)\n const isVisibleRef = useRef(false);\n const isPausedRef = useRef(false);\n\n // state 변경 시 ref 동기화\n isVisibleRef.current = isVisible;\n isPausedRef.current = isPaused;\n\n // 언어 변경 감지\n useEffect(() => {\n if (externalLanguage && internalLanguage !== externalLanguage) {\n setInternalLanguage(externalLanguage);\n\n if (pauseOnLanguageChange && isVisible) {\n // 언어 변경 시 모션 일시정지\n setIsPaused(true);\n\n // 텍스트 변경 완료 후 모션 재개\n setTimeout(() => {\n setIsPaused(false);\n }, 200); // 텍스트 변경 대기 시간\n }\n\n if (restartOnLanguageChange && isVisible) {\n // 언어 변경 시 모션 재시작\n setIsVisible(false);\n setTimeout(() => {\n setIsVisible(true);\n }, 100);\n }\n }\n }, [\n externalLanguage,\n internalLanguage,\n isVisible,\n pauseOnLanguageChange,\n restartOnLanguageChange,\n ]);\n\n // Intersection Observer로 가시성 감지\n useEffect(() => {\n if (!elementRef.current) return;\n\n const observer = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n if (\n entry.isIntersecting &&\n !isVisibleRef.current &&\n !isPausedRef.current\n ) {\n setTimeout(() => {\n setIsVisible(true);\n }, delay);\n }\n });\n },\n { threshold },\n );\n\n observer.observe(elementRef.current);\n\n return () => {\n observer.disconnect();\n };\n }, [delay, threshold]);\n\n // 모션 스타일 생성\n const getMotionStyle = useCallback(() => {\n const baseTransition = `all ${duration}ms ease-out`;\n\n if (isPaused) {\n // 일시정지 상태: 현재 상태 유지\n return {\n opacity: 1,\n transform: \"none\",\n transition: baseTransition,\n };\n }\n\n if (!isVisible) {\n // 초기 상태\n switch (motionType) {\n case \"fadeIn\":\n return {\n opacity: 0,\n transition: baseTransition,\n };\n case \"slideUp\":\n return {\n opacity: 0,\n transform: \"translateY(32px)\",\n transition: baseTransition,\n };\n case \"slideLeft\":\n return {\n opacity: 0,\n transform: \"translateX(-32px)\",\n transition: baseTransition,\n };\n case \"slideRight\":\n return {\n opacity: 0,\n transform: \"translateX(32px)\",\n transition: baseTransition,\n };\n case \"scaleIn\":\n return {\n opacity: 0,\n transform: \"scale(0.95)\",\n transition: baseTransition,\n };\n case \"bounceIn\":\n return {\n opacity: 0,\n transform: \"scale(0.75)\",\n transition: baseTransition,\n };\n default:\n return {\n opacity: 0,\n transition: baseTransition,\n };\n }\n }\n\n // 보이는 상태\n return {\n opacity: 1,\n transform: \"none\",\n transition: baseTransition,\n };\n }, [isVisible, isPaused, motionType, duration]);\n\n // 모션 제어 함수들\n const pauseMotion = useCallback(() => {\n setIsPaused(true);\n }, []);\n\n const resumeMotion = useCallback(() => {\n setIsPaused(false);\n }, []);\n\n const restartMotion = useCallback(() => {\n setIsVisible(false);\n setTimeout(() => {\n setIsVisible(true);\n }, 100);\n }, []);\n\n // Style 객체 메모이제이션 (불필요한 리렌더링 방지)\n const motionStyle = useMemo(() => getMotionStyle(), [getMotionStyle]);\n\n return {\n ref: elementRef,\n isVisible,\n isPaused,\n style: motionStyle,\n pauseMotion,\n resumeMotion,\n restartMotion,\n currentLanguage: internalLanguage,\n };\n}\n","import { useState, useEffect, useRef, useCallback } from \"react\";\n\nexport interface GameLoopConfig {\n fps?: number; // 목표 FPS (기본값: 60)\n autoStart?: boolean; // 자동 시작 여부\n maxFPS?: number; // 최대 FPS 제한\n minFPS?: number; // 최소 FPS 경고\n showOnMount?: boolean;\n}\n\nexport interface GameState {\n isRunning: boolean;\n fps: number;\n deltaTime: number;\n elapsedTime: number;\n frameCount: number;\n mounted: boolean;\n}\n\ninterface GameLoopReturn {\n isRunning: boolean;\n fps: number; // 현재 FPS\n deltaTime: number; // 프레임 간 시간 차이 (ms)\n elapsedTime: number; // 총 경과 시간 (ms)\n frameCount: number; // 총 프레임 수\n mounted: boolean;\n start: () => void;\n stop: () => void;\n pause: () => void;\n resume: () => void;\n reset: () => void;\n onUpdate: (\n callback: (deltaTime: number, elapsedTime: number) => void,\n ) => void;\n onRender: (\n callback: (deltaTime: number, elapsedTime: number) => void,\n ) => void;\n}\n\nexport function useGameLoop(options: GameLoopConfig = {}): GameLoopReturn {\n const {\n fps = 60,\n autoStart = false,\n maxFPS = 120,\n minFPS = 30,\n showOnMount = false,\n } = options;\n\n const [isRunning, setIsRunning] = useState(showOnMount ? autoStart : false);\n const [isPaused, setIsPaused] = useState(false);\n const [currentFPS, setCurrentFPS] = useState(0);\n const [deltaTime, setDeltaTime] = useState(0);\n const [elapsedTime, setElapsedTime] = useState(0);\n const [frameCount, setFrameCount] = useState(0);\n const [mounted, setMounted] = useState(false);\n\n const motionRef = useRef<number | null>(null);\n const lastTimeRef = useRef<number | null>(null);\n const frameTimeRef = useRef(1000 / fps); // 목표 프레임 시간\n const fpsUpdateTimeRef = useRef(0);\n const fpsFrameCountRef = useRef(0);\n\n const updateCallbacksRef = useRef<\n ((deltaTime: number, elapsedTime: number) => void)[]\n >([]);\n const renderCallbacksRef = useRef<\n ((deltaTime: number, elapsedTime: number) => void)[]\n >([]);\n\n // 하이드레이션 이슈 해결을 위한 mounted 상태 관리\n useEffect(() => {\n setMounted(true);\n }, []);\n\n // 게임 루프 메인 함수\n const gameLoop = useCallback(\n (currentTime: number) => {\n if (!isRunning || isPaused) return;\n\n // 첫 프레임 처리\n if (lastTimeRef.current === null) {\n lastTimeRef.current = currentTime;\n motionRef.current = requestAnimationFrame(gameLoop);\n return;\n }\n\n // 델타 타임 계산\n const delta = currentTime - lastTimeRef.current;\n const targetDelta = frameTimeRef.current;\n\n // FPS 제한 적용\n if (delta >= targetDelta) {\n // 업데이트 로직 실행\n updateCallbacksRef.current.forEach((callback) => {\n try {\n callback(delta, elapsedTime);\n } catch (error) {\n if (process.env.NODE_ENV === \"development\") {\n console.error(\"Game loop update error:\", error);\n }\n }\n });\n\n // 렌더링 로직 실행\n renderCallbacksRef.current.forEach((callback) => {\n try {\n callback(delta, elapsedTime);\n } catch (error) {\n if (process.env.NODE_ENV === \"development\") {\n console.error(\"Game loop render error:\", error);\n }\n }\n });\n\n // 상태 업데이트\n setDeltaTime(delta);\n setElapsedTime((prev) => prev + delta);\n setFrameCount((prev) => prev + 1);\n lastTimeRef.current = currentTime;\n\n // FPS 계산 (1초마다 업데이트)\n fpsFrameCountRef.current++;\n if (currentTime - fpsUpdateTimeRef.current >= 1000) {\n const newFPS = Math.round(\n (fpsFrameCountRef.current * 1000) /\n (currentTime - fpsUpdateTimeRef.current),\n );\n setCurrentFPS(newFPS);\n fpsFrameCountRef.current = 0;\n fpsUpdateTimeRef.current = currentTime;\n\n // FPS 경고 (개발 모드에서만)\n if (\n process.env.NODE_ENV === \"development\" &&\n typeof window !== \"undefined\" &&\n window.location.hostname === \"localhost\"\n ) {\n if (newFPS < minFPS) {\n console.warn(`Low FPS detected: ${newFPS} (min: ${minFPS})`);\n }\n }\n }\n }\n\n // 다음 프레임 요청\n motionRef.current = requestAnimationFrame(gameLoop);\n },\n [isRunning, isPaused, elapsedTime, minFPS],\n );\n\n // 게임 루프 시작\n const start = useCallback(() => {\n if (!mounted) return;\n\n setIsRunning(true);\n setIsPaused(false);\n setElapsedTime(0);\n setFrameCount(0);\n setDeltaTime(0);\n setCurrentFPS(0);\n\n lastTimeRef.current = null;\n fpsUpdateTimeRef.current = 0;\n fpsFrameCountRef.current = 0;\n\n if (!motionRef.current) {\n motionRef.current = requestAnimationFrame(gameLoop);\n }\n }, [mounted, gameLoop]);\n\n // 게임 루프 정지\n const stop = useCallback(() => {\n setIsRunning(false);\n setIsPaused(false);\n\n if (motionRef.current) {\n cancelAnimationFrame(motionRef.current);\n motionRef.current = null;\n }\n }, []);\n\n // 게임 루프 일시정지\n const pause = useCallback(() => {\n if (!isRunning) return;\n setIsPaused(true);\n }, [isRunning]);\n\n // 게임 루프 재개\n const resume = useCallback(() => {\n if (!isRunning) return;\n setIsPaused(false);\n\n if (!motionRef.current) {\n motionRef.current = requestAnimationFrame(gameLoop);\n }\n }, [isRunning, gameLoop]);\n\n // 게임 루프 리셋\n const reset = useCallback(() => {\n setElapsedTime(0);\n setFrameCount(0);\n setDeltaTime(0);\n setCurrentFPS(0);\n\n lastTimeRef.current = null;\n fpsUpdateTimeRef.current = 0;\n fpsFrameCountRef.current = 0;\n }, []);\n\n // 업데이트 콜백 등록\n const onUpdate = useCallback(\n (callback: (deltaTime: number, elapsedTime: number) => void) => {\n updateCallbacksRef.current.push(callback);\n\n // 클린업 함수 반환\n return () => {\n const index = updateCallbacksRef.current.indexOf(callback);\n if (index > -1) {\n updateCallbacksRef.current.splice(index, 1);\n }\n };\n },\n [],\n );\n\n // 렌더링 콜백 등록\n const onRender = useCallback(\n (callback: (deltaTime: number, elapsedTime: number) => void) => {\n renderCallbacksRef.current.push(callback);\n\n // 클린업 함수 반환\n return () => {\n const index = renderCallbacksRef.current.indexOf(callback);\n if (index > -1) {\n renderCallbacksRef.current.splice(index, 1);\n }\n };\n },\n [],\n );\n\n // FPS 변경 시 프레임 시간 업데이트\n useEffect(() => {\n frameTimeRef.current = 1000 / Math.min(fps, maxFPS);\n }, [fps, maxFPS]);\n\n // 자동 시작\n useEffect(() => {\n if (mounted && autoStart && !isRunning) {\n start();\n }\n }, [mounted, autoStart, isRunning, start]);\n\n // 클린업\n useEffect(() => {\n return () => {\n if (motionRef.current) {\n cancelAnimationFrame(motionRef.current);\n }\n };\n }, []);\n\n return {\n isRunning,\n fps: currentFPS,\n deltaTime,\n elapsedTime,\n frameCount,\n mounted,\n start,\n stop,\n pause,\n resume,\n reset,\n onUpdate,\n onRender,\n };\n}\n","import React, { useRef, useState, useEffect, useCallback } from \"react\";\n\nexport interface AutoMotionConfig {\n duration?: number;\n delay?: number;\n autoStart?: boolean;\n easing?: string;\n type?: \"fade\" | \"slide\" | \"scale\" | \"rotate\";\n}\n\nexport interface MotionConfig {\n duration?: number;\n delay?: number;\n autoStart?: boolean;\n easing?: string;\n type?: \"fade\" | \"slide\" | \"scale\" | \"rotate\";\n}\n\n// 기존 API 호환성을 위한 인터페이스\nexport interface MotionFromToConfig {\n from: Record<string, any>;\n to: Record<string, any>;\n duration?: number;\n delay?: number;\n autoStart?: boolean;\n ease?: string;\n}\n\nexport interface MotionState {\n transform: string;\n opacity: number;\n backgroundColor?: string;\n isAnimating: boolean;\n}\n\nexport function useMotion(\n configOrFrom: MotionConfig | Record<string, any> = {},\n to?: Record<string, any>,\n options?: {\n duration?: number;\n delay?: number;\n autoStart?: boolean;\n ease?: string;\n },\n) {\n // 기존 API 호환성 처리\n let config: MotionConfig;\n let fromValues: Record<string, any>;\n let toValues: Record<string, any>;\n\n if (to && options) {\n // 기존 API: useMotion(from, to, options)\n fromValues = configOrFrom as Record<string, any>;\n toValues = to;\n config = {\n duration: options.duration || 1000,\n delay: options.delay || 0,\n autoStart: options.autoStart || false,\n easing: options.ease || \"ease-out\",\n };\n } else {\n // 새로운 API: useMotion(config)\n config = configOrFrom as MotionConfig;\n const { type = \"fade\" } = config;\n\n // 타입별 기본값 설정\n switch (type) {\n case \"fade\":\n fromValues = { opacity: 0 };\n toValues = { opacity: 1 };\n break;\n case \"slide\":\n fromValues = { opacity: 0, translateX: 100 };\n toValues = { opacity: 1, translateX: 0 };\n break;\n case \"scale\":\n fromValues = { opacity: 0, scale: 0 };\n toValues = { opacity: 1, scale: 1 };\n break;\n case \"rotate\":\n fromValues = { opacity: 0, rotate: 180 };\n toValues = { opacity: 1, rotate: 0 };\n break;\n default:\n fromValues = { opacity: 0 };\n toValues = { opacity: 1 };\n }\n }\n\n const {\n duration = 1000,\n delay = 0,\n autoStart = true,\n easing = \"ease-out\",\n } = config;\n\n const ref = useRef<HTMLDivElement>(null);\n const fromValuesRef = useRef(fromValues);\n const toValuesRef = useRef(toValues);\n const initialBgColor = useRef(fromValues.backgroundColor);\n\n const [state, setState] = useState<MotionState>({\n transform: \"\",\n opacity: fromValues.opacity ?? 1,\n backgroundColor: fromValues.backgroundColor,\n isAnimating: false,\n });\n\n // 간단한 이징 함수\n const easingFunction = useCallback(\n (t: number) => {\n switch (easing) {\n case \"ease-in\":\n return t * t;\n case \"ease-out\":\n return 1 - (1 - t) * (1 - t);\n case \"ease-in-out\":\n return t < 0.5 ? 2 * t * t : 1 - 2 * (1 - t) * (1 - t);\n default:\n return t;\n }\n },\n [easing],\n );\n\n // 값 보간\n const interpolate = useCallback(\n (from: number, to: number, progress: number): number => {\n return from + (to - from) * progress;\n },\n [],\n );\n\n // 모션 업데이트\n const updateMotion = useCallback(\n (progress: number) => {\n const easedProgress = easingFunction(progress);\n const from = fromValuesRef.current;\n const to = toValuesRef.current;\n\n const newState: MotionState = {\n transform: \"\",\n opacity: 1,\n backgroundColor: initialBgColor.current,\n isAnimating: true,\n };\n\n // opacity 보간\n if (from.opacity !== undefined && to.opacity !== undefined) {\n newState.opacity = interpolate(from.opacity, to.opacity, easedProgress);\n }\n\n // transform 보간\n const transforms: string[] = [];\n\n if (from.translateX !== undefined && to.translateX !== undefined) {\n const translateX = interpolate(\n from.translateX,\n to.translateX,\n easedProgress,\n );\n transforms.push(`translateX(${translateX}px)`);\n }\n\n if (from.translateY !== undefined && to.translateY !== undefined) {\n const translateY = interpolate(\n from.translateY,\n to.translateY,\n easedProgress,\n );\n transforms.push(`translateY(${translateY}px)`);\n }\n\n if (from.scale !== undefined && to.scale !== undefined) {\n const scaleVal = interpolate(from.scale, to.scale, easedProgress);\n transforms.push(`scale(${scaleVal})`);\n }\n\n if (from.rotate !== undefined && to.rotate !== undefined) {\n const rotate = interpolate(from.rotate, to.rotate, easedProgress);\n transforms.push(`rotate(${rotate}deg)`);\n }\n\n if (transforms.length > 0) {\n newState.transform = transforms.join(\" \");\n }\n\n // backgroundColor 보간\n if (from.backgroundColor && to.backgroundColor) {\n newState.backgroundColor =\n easedProgress > 0.5 ? to.backgroundColor : from.backgroundColor;\n }\n\n setState(newState);\n },\n [easingFunction, interpolate],\n );\n\n const start = useCallback(() => {\n setState((prev) => ({ ...prev, isAnimating: true }));\n\n const startTime = Date.now();\n const animate = () => {\n const elapsed = Date.now() - startTime;\n const progress = Math.min(elapsed / duration, 1);\n\n updateMotion(progress);\n\n if (progress < 1) {\n requestAnimationFrame(animate);\n } else {\n setState((prev) => ({ ...prev, isAnimating: false }));\n }\n };\n\n setTimeout(() => {\n requestAnimationFrame(animate);\n }, delay);\n }, [duration, delay, updateMotion]);\n\n const reset = useCallback(() => {\n const from = fromValuesRef.current;\n setState({\n transform: \"\",\n opacity: from.opacity ?? 1,\n backgroundColor: from.backgroundColor,\n isAnimating: false,\n });\n }, []);\n\n const stop = useCallback(() => {\n setState((prev) => ({ ...prev, isAnimating: false }));\n }, []);\n\n // autoStart는 마운트 시 한 번만 실행 (start 의존성 제거로 무한 루프 방지)\n useEffect(() => {\n if (autoStart) {\n start();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const setRef = (element: HTMLDivElement | null) => {\n if (ref.current !== element) {\n (ref as any).current = element;\n }\n };\n\n // style 객체 생성 (편의용)\n const style: React.CSSProperties = {\n opacity: state.opacity,\n ...(state.transform && { transform: state.transform }),\n ...(state.backgroundColor && { backgroundColor: state.backgroundColor }),\n };\n\n return {\n ref: setRef,\n style,\n transform: state.transform,\n opacity: state.opacity,\n backgroundColor: state.backgroundColor,\n isAnimating: state.isAnimating,\n start,\n stop,\n reset,\n };\n}\n","import { useState, useEffect, useRef } from \"react\";\n\nexport interface ViewportToggleConfig {\n threshold?: number; // 가시성 변화를 감지할 임계값 (0-1)\n rootMargin?: string; // 루트 마진 (CSS 마진 형식)\n trigger?: \"enter\" | \"exit\" | \"both\"; // 트리거 조건\n once?: boolean; // 한 번만 실행할지 여부\n showOnMount?: boolean;\n}\n\n/**\n * IntersectionObserver를 사용해 뷰포트 진입/이탈을 감지하는 훅.\n * (구 hua-pro의 useVisibilityToggle — animation lifecycle 기반의\n * motion-core useVisibilityToggle과 충돌을 피해 이름을 변경함)\n */\nexport function useViewportToggle(options: ViewportToggleConfig = {}) {\n const {\n threshold = 0.1,\n rootMargin = \"0px\",\n trigger = \"both\",\n once = false,\n showOnMount = false,\n } = options;\n\n const [isVisible, setIsVisible] = useState(showOnMount);\n const [mounted, setMounted] = useState(false);\n const elementRef = useRef<HTMLElement>(null);\n\n // ref로 상태 추적 (observer callback에서 안정적인 참조 사용)\n const hasTriggeredRef = useRef(false);\n const isVisibleRef = useRef(showOnMount);\n\n // isVisible 변경 시 ref 동기화\n isVisibleRef.current = isVisible;\n\n // 하이드레이션 이슈 해결을 위한 mounted 상태 관리\n useEffect(() => {\n setMounted(true);\n }, []);\n\n useEffect(() => {\n if (!mounted || !elementRef.current) return;\n\n const observer = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n const isIntersecting = entry.isIntersecting;\n\n // 한 번만 실행하는 경우 체크\n if (once && hasTriggeredRef.current) return;\n\n // 트리거 조건에 따른 가시성 설정\n let shouldBeVisible = isVisibleRef.current;\n\n if (trigger === \"enter\" && isIntersecting) {\n shouldBeVisible = true;\n if (once) hasTriggeredRef.current = true;\n } else if (trigger === \"exit\" && !isIntersecting) {\n shouldBeVisible = true;\n if (once) hasTriggeredRef.current = true;\n } else if (trigger === \"both\") {\n shouldBeVisible = isIntersecting;\n if (once && isIntersecting) hasTriggeredRef.current = true;\n }\n\n setIsVisible(shouldBeVisible);\n });\n },\n {\n threshold,\n rootMargin,\n },\n );\n\n observer.observe(elementRef.current);\n\n return () => {\n observer.disconnect();\n };\n }, [threshold, rootMargin, trigger, once, mounted]);\n\n return {\n ref: elementRef,\n isVisible,\n mounted,\n };\n}\n","import { useState, useEffect } from \"react\";\n\nexport interface ScrollPositionToggleConfig {\n threshold?: number;\n showOnMount?: boolean;\n smooth?: boolean;\n}\n\n/**\n * window.pageYOffset 기준 스크롤 위치 임계값에 따라 가시성을 토글하는 훅.\n * (구 hua-pro의 useScrollToggle — animation lifecycle 기반의\n * motion-core useScrollToggle과 충돌을 피해 이름을 변경함)\n */\nexport function useScrollPositionToggle(\n options: ScrollPositionToggleConfig = {},\n) {\n const { threshold = 400, showOnMount = false, smooth = true } = options;\n\n const [isVisible, setIsVisible] = useState(showOnMount);\n const [mounted, setMounted] = useState(false);\n\n // 하이드레이션 이슈 해결을 위한 mounted 상태 관리\n useEffect(() => {\n setMounted(true);\n }, []);\n\n useEffect(() => {\n if (!mounted) return;\n\n const toggleVisibility = () => {\n if (typeof window !== \"undefined\") {\n if (window.pageYOffset > threshold) {\n setIsVisible(true);\n } else {\n setIsVisible(false);\n }\n }\n };\n\n // 초기 상태 확인\n toggleVisibility();\n\n // 이벤트 리스너 등록\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\") {\n if (smooth) {\n window.scrollTo({\n top: 0,\n behavior: \"smooth\",\n });\n } else {\n window.scrollTo(0, 0);\n }\n }\n };\n\n return {\n isVisible,\n scrollToTop,\n mounted,\n };\n}\n","\"use client\"\n\nimport React, { useMemo } from 'react'\nimport { useScrollReveal } from '../hooks/useScrollReveal'\nimport { useUnifiedMotion } from '../hooks/useUnifiedMotion'\nimport type { EntranceType, ScrollRevealOptions } from '../types'\nimport type { MotionEffects } from '../hooks/useUnifiedMotion'\n\ntype MotionAs = 'div' | 'span' | 'section' | 'article' | 'header' | 'footer' | 'main' | 'nav'\n\nexport interface MotionProps extends React.HTMLAttributes<HTMLElement> {\n /** HTML 요소 타입 @default 'div' */\n as?: MotionAs\n /** 모션 타입 */\n type?: EntranceType\n /** 멀티이펙트 */\n effects?: MotionEffects\n /** 스크롤 기반 reveal 모드 */\n scroll?: boolean | ScrollRevealOptions\n /** 딜레이 (ms) */\n delay?: number\n /** 지속시간 (ms) */\n duration?: number\n children: React.ReactNode\n}\n\n/**\n * Motion wrapper component\n *\n * ref/style 수동 연결 없이 모션을 적용하는 래퍼 컴포넌트.\n *\n * @example\n * // 기본 fadeIn\n * <Motion>content</Motion>\n *\n * // 스크롤 reveal\n * <Motion scroll delay={200} className=\"grid grid-cols-3\">...</Motion>\n *\n * // 커스텀 요소 + 타입\n * <Motion as=\"section\" type=\"slideUp\" duration={800}>...</Motion>\n */\nexport function Motion({\n as: Component = 'div',\n type,\n effects,\n scroll,\n delay,\n duration,\n children,\n className,\n style: userStyle,\n ...rest\n}: MotionProps) {\n // scroll 모드: useScrollReveal\n const scrollOptions = useMemo<ScrollRevealOptions | null>(() => {\n if (!scroll) return null\n const base = typeof scroll === 'object' ? scroll : {}\n return {\n ...base,\n ...(delay != null && { delay }),\n ...(duration != null && { duration }),\n ...(type != null && { motionType: type }),\n }\n }, [scroll, delay, duration, type])\n\n const scrollMotion = useScrollReveal(scrollOptions ?? { delay: 0 })\n\n // unified 모드: useUnifiedMotion\n const unifiedMotion = useUnifiedMotion({\n type: type ?? 'fadeIn',\n effects,\n delay,\n duration,\n autoStart: true,\n })\n\n const isScroll = scroll != null && scroll !== false\n const motion = isScroll ? scrollMotion : unifiedMotion\n\n const mergedStyle = useMemo(() => {\n if (!userStyle) return motion.style\n return { ...motion.style, ...userStyle }\n }, [motion.style, userStyle])\n\n return (\n <Component\n ref={motion.ref as React.Ref<any>}\n className={className}\n style={mergedStyle}\n {...rest}\n >\n {children}\n </Component>\n )\n}\n","\"use client\"\n\nimport { useState, useEffect, useRef } from 'react'\n\nexport interface CountUpOptions {\n /** 목표 숫자 */\n end: number\n /** 숫자 뒤에 붙는 접미사 (%, +, 명 등) */\n suffix?: string\n /** 애니메이션 지속 시간 (ms) */\n duration?: number\n /** 시작 지연 시간 (ms) */\n delay?: number\n /** 애니메이션 활성화 여부 (true가 되면 시작, 한 번만 실행) */\n active?: boolean\n}\n\nexport interface CountUpReturn {\n /** 현재 숫자 값 */\n value: number\n /** 접미사 포함 표시 문자열 */\n display: string\n}\n\n/**\n * useCountUp — 숫자 카운트업 애니메이션\n *\n * 통계, 대시보드, 메트릭 수치 강조에 적합.\n * ease-out cubic 이징으로 자연스러운 감속 효과.\n *\n * @example\n * ```tsx\n * const { display } = useCountUp({ end: 1200, suffix: '+', active: isInView })\n * return <span>{display}</span>\n * ```\n */\nexport function useCountUp(options: CountUpOptions): CountUpReturn {\n const {\n end,\n suffix = '',\n duration = 1500,\n delay = 0,\n active = true,\n } = options\n\n const [value, setValue] = useState(0)\n const startedRef = useRef(false)\n\n useEffect(() => {\n if (!active || startedRef.current) return\n\n const timer = setTimeout(() => {\n startedRef.current = true\n const startTime = performance.now()\n\n const animate = (now: number) => {\n const elapsed = now - startTime\n const progress = Math.min(elapsed / duration, 1)\n // Ease-out cubic\n const eased = 1 - Math.pow(1 - progress, 3)\n setValue(Math.round(eased * end))\n if (progress < 1) requestAnimationFrame(animate)\n }\n\n requestAnimationFrame(animate)\n }, delay)\n\n return () => clearTimeout(timer)\n }, [active, end, duration, delay])\n\n return { value, display: `${value}${suffix}` }\n}\n","\"use client\"\n\nimport { useState, useEffect, useMemo, type CSSProperties } from 'react'\n\n/** 오버슈트 바운스 — 타이틀, 강조 요소 */\nconst SPRING_EASING = 'cubic-bezier(0.34, 1.56, 0.64, 1)'\n\nexport interface ClipRevealOptions {\n /** 시작 지연 시간 (ms) */\n delay?: number\n /** 애니메이션 지속 시간 (ms) */\n duration?: number\n /** CSS 이징 함수 */\n easing?: string\n /** 애니메이션 활성화 여부 (true가 되면 시작, 한 번만 실행) */\n active?: boolean\n}\n\nexport interface ClipRevealReturn {\n /** overflow:hidden 컨테이너에 적용할 스타일 */\n containerStyle: CSSProperties\n /** 슬라이딩 텍스트에 적용할 스타일 */\n textStyle: CSSProperties\n /** 등장 완료 여부 */\n isVisible: boolean\n}\n\n/**\n * useClipReveal — overflow clip으로 텍스트가 아래→위로 등장\n *\n * 커버 타이틀, 히어로 헤드라인, 큰 문구에 적합.\n * 컨테이너에 overflow:hidden을 적용하고, 내부 텍스트가 translateY로 올라옴.\n *\n * @example\n * ```tsx\n * const { containerStyle, textStyle } = useClipReveal({ delay: 200, active: isInView })\n * return (\n * <span style={containerStyle}>\n * <span style={textStyle}>Hello World</span>\n * </span>\n * )\n * ```\n */\nexport function useClipReveal(options: ClipRevealOptions = {}): ClipRevealReturn {\n const {\n delay = 0,\n duration = 900,\n easing = SPRING_EASING,\n active = true,\n } = options\n\n const [triggered, setTriggered] = useState(false)\n\n useEffect(() => {\n if (active && !triggered) {\n setTriggered(true)\n }\n }, [active, triggered])\n\n const containerStyle = useMemo<CSSProperties>(() => ({\n overflow: 'hidden',\n display: 'inline-block',\n }), [])\n\n const textStyle = useMemo<CSSProperties>(() => ({\n display: 'block',\n transform: triggered ? 'translateY(0)' : 'translateY(110%)',\n transition: `transform ${duration}ms ${easing} ${delay}ms`,\n }), [triggered, duration, easing, delay])\n\n return { containerStyle, textStyle, isVisible: triggered }\n}\n","\"use client\"\n\nimport { useState, useEffect, useMemo, type CSSProperties } from 'react'\n\n/** 부드러운 감속 — 기본 */\nconst SMOOTH_EASING = 'cubic-bezier(0.16, 1, 0.3, 1)'\n\nexport interface BlurInOptions {\n /** 시작 지연 시간 (ms) */\n delay?: number\n /** 애니메이션 지속 시간 (ms) */\n duration?: number\n /** 초기 블러 강도 (px) */\n blurAmount?: number\n /** 초기 스케일 (0~1) */\n scale?: number\n /** CSS 이징 함수 */\n easing?: string\n /** 애니메이션 활성화 여부 (true가 되면 시작, 한 번만 실행) */\n active?: boolean\n}\n\nexport interface BlurInReturn {\n /** 요소에 적용할 스타일 */\n style: CSSProperties\n /** 등장 완료 여부 */\n isVisible: boolean\n}\n\n/**\n * useBlurIn — 블러에서 선명하게 + 스케일 등장\n *\n * 인용구, 임팩트 문구, 핵심 메시지에 적합.\n * blur + scale + opacity 세 가지가 동시에 전환됨.\n *\n * @example\n * ```tsx\n * const { style } = useBlurIn({ blurAmount: 12, scale: 0.95, active: isInView })\n * return <blockquote style={style}>Deep insight here</blockquote>\n * ```\n */\nexport function useBlurIn(options: BlurInOptions = {}): BlurInReturn {\n const {\n delay = 0,\n duration = 1200,\n blurAmount = 12,\n scale = 0.95,\n easing = SMOOTH_EASING,\n active = true,\n } = options\n\n const [triggered, setTriggered] = useState(false)\n\n useEffect(() => {\n if (active && !triggered) {\n setTriggered(true)\n }\n }, [active, triggered])\n\n const style = useMemo<CSSProperties>(() => ({\n opacity: triggered ? 1 : 0,\n filter: triggered ? 'blur(0px)' : `blur(${blurAmount}px)`,\n transform: triggered ? 'scale(1)' : `scale(${scale})`,\n transition: [\n `opacity ${duration}ms ${easing} ${delay}ms`,\n `filter ${duration}ms ${easing} ${delay}ms`,\n `transform ${duration}ms ${easing} ${delay}ms`,\n ].join(', '),\n }), [triggered, duration, blurAmount, scale, easing, delay])\n\n return { style, isVisible: triggered }\n}\n","import { useRef, useState, useEffect, useMemo, type CSSProperties, type RefObject } from 'react'\nimport type { ScrollRevealMotionType } from '../types'\nimport { useMotionProfile } from '../profiles/MotionProfileContext'\nimport { observeElement } from '../utils/sharedIntersectionObserver'\n\nexport interface UseStaggerOptions {\n /** 자식 아이템 개수 */\n count: number\n /** 아이템 간 딜레이 (ms) @default 100 */\n staggerDelay?: number\n /** 전체 시작 딜레이 (ms) @default 0 */\n baseDelay?: number\n /** 애니메이션 지속시간 (ms) @default 700 */\n duration?: number\n /** 모션 타입 @default 'fadeIn' */\n motionType?: ScrollRevealMotionType\n /** IntersectionObserver 임계값 @default 0.1 */\n threshold?: number\n /** 이징 함수 @default 'ease-out' */\n easing?: string\n}\n\nexport interface UseStaggerReturn {\n /** 부모 컨테이너 ref — IntersectionObserver 연결 */\n containerRef: RefObject<HTMLDivElement | null>\n /** 자식 아이템별 style 배열 */\n styles: CSSProperties[]\n /** 전체 visible 여부 */\n isVisible: boolean\n}\n\nfunction getInitialTransform(motionType: ScrollRevealMotionType, slideDistance: number, scaleFrom: number): string {\n switch (motionType) {\n case 'slideUp':\n return `translateY(${slideDistance}px)`\n case 'slideLeft':\n return `translateX(-${slideDistance}px)`\n case 'slideRight':\n return `translateX(${slideDistance}px)`\n case 'scaleIn':\n return `scale(${scaleFrom})`\n case 'bounceIn':\n return 'scale(0.75)'\n case 'fadeIn':\n default:\n return 'none'\n }\n}\n\n/**\n * useStagger — 리스트 아이템에 순차 딜레이를 적용하는 훅\n *\n * 단일 IntersectionObserver로 컨테이너를 관찰하고,\n * 자식 아이템별로 CSS transition-delay를 자동 계산합니다.\n *\n * @example\n * const stagger = useStagger({ count: items.length, staggerDelay: 100 });\n * <div ref={stagger.containerRef}>\n * {items.map((item, i) => (\n * <div style={stagger.styles[i]} key={i}>{item}</div>\n * ))}\n * </div>\n */\nexport function useStagger(options: UseStaggerOptions): UseStaggerReturn {\n const profile = useMotionProfile()\n const {\n count,\n staggerDelay = profile.stagger.perItem,\n baseDelay = profile.stagger.baseDelay,\n duration = profile.base.duration,\n motionType = 'fadeIn',\n threshold = profile.base.threshold,\n easing = profile.base.easing,\n } = options\n\n const containerRef = useRef<HTMLDivElement>(null)\n const [isVisible, setIsVisible] = useState(false)\n\n useEffect(() => {\n if (!containerRef.current) return\n return observeElement(\n containerRef.current,\n (entry) => { if (entry.isIntersecting) setIsVisible(true) },\n { threshold },\n true // once — 첫 intersection 후 자동 정리\n )\n }, [threshold])\n\n const slideDistance = profile.entrance.slide.distance\n const scaleFrom = profile.entrance.scale.from\n const initialTransform = useMemo(() => getInitialTransform(motionType, slideDistance, scaleFrom), [motionType, slideDistance, scaleFrom])\n\n const styles = useMemo<CSSProperties[]>(() => {\n return Array.from({ length: count }, (_, i) => {\n const itemDelay = baseDelay + i * staggerDelay\n\n if (!isVisible) {\n return {\n opacity: 0,\n transform: initialTransform,\n transition: `opacity ${duration}ms ${easing} ${itemDelay}ms, transform ${duration}ms ${easing} ${itemDelay}ms`,\n }\n }\n\n return {\n opacity: 1,\n transform: 'none',\n transition: `opacity ${duration}ms ${easing} ${itemDelay}ms, transform ${duration}ms ${easing} ${itemDelay}ms`,\n }\n })\n }, [count, isVisible, staggerDelay, baseDelay, duration, motionType, easing, initialTransform])\n\n return {\n containerRef,\n styles,\n isVisible,\n }\n}\n"]}
|