@hua-labs/motion-core 2.2.0 → 2.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core/MotionEngine.ts","../src/core/TransitionEffects.ts","../src/core/PerformanceOptimizer.ts","../src/presets/index.ts","../src/hooks/useSimplePageMotion.ts","../src/managers/MotionStateManager.ts","../src/hooks/usePageMotions.ts","../src/hooks/useSmartMotion.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/utils/easing.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/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"],"names":["useState","useRef","useCallback","useEffect","opacity","translateY","translateX","scale","useMemo","easing","deltaX","deltaY","distance","velocity"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * HUA Motion Core - 의존성 제로 모션 엔진\n * \n * 순수 JavaScript로 구현된 고성능 모션 엔진\n * GPU 가속, 레이어 분리, 성능 최적화 포함\n */\n\nexport interface MotionFrame {\n progress: number // 0 ~ 1\n properties: {\n opacity?: number\n transform?: string\n scale?: number\n translateX?: number\n translateY?: number\n rotate?: number\n rotateX?: number\n rotateY?: number\n rotateZ?: number\n skewX?: number\n skewY?: number\n }\n}\n\nexport interface MotionOptions {\n duration: number\n easing: (t: number) => number\n delay?: number\n direction?: 'forward' | 'reverse' | 'alternate'\n iterations?: number\n fill?: 'none' | 'forwards' | 'backwards' | 'both'\n onStart?: () => void\n onUpdate?: (progress: number) => void\n onComplete?: () => void\n onCancel?: () => void\n}\n\nexport interface Motion {\n id: string\n element: HTMLElement\n isRunning: boolean\n isPaused: boolean\n currentProgress: number\n startTime: number\n pauseTime: number\n options: MotionOptions\n}\n\nexport class MotionEngine {\n private motions = new Map<string, Motion>()\n private isRunning = false\n private animationFrameId: number | null = null\n\n /**\n * 모션 시작\n */\n motion(\n element: HTMLElement, \n motionFrames: MotionFrame[], \n options: MotionOptions\n ): Promise<string> {\n return new Promise((resolve) => {\n const motionId = this.generateMotionId()\n \n // GPU 가속 활성화\n this.enableGPUAcceleration(element)\n \n // 레이어 분리\n this.createLayer(element)\n \n const motion: Motion = {\n id: motionId,\n element,\n isRunning: true,\n isPaused: false,\n currentProgress: 0,\n startTime: Date.now() + (options.delay || 0),\n pauseTime: 0,\n options: {\n ...options,\n onComplete: () => {\n options.onComplete?.()\n this.motions.delete(motionId)\n }\n }\n }\n\n this.motions.set(motionId, motion)\n \n if (!this.isRunning) {\n this.startAnimationLoop()\n }\n\n options.onStart?.()\n \n // motionId를 즉시 반환\n resolve(motionId)\n })\n }\n\n /**\n * 모션 중지\n */\n stop(motionId: string): void {\n const motion = this.motions.get(motionId)\n if (motion) {\n motion.isRunning = false\n motion.options.onCancel?.()\n this.motions.delete(motionId)\n }\n }\n\n /**\n * 모션 일시정지\n */\n pause(motionId: string): void {\n const motion = this.motions.get(motionId)\n if (motion && motion.isRunning && !motion.isPaused) {\n motion.isPaused = true\n motion.pauseTime = Date.now()\n }\n }\n\n /**\n * 모션 재개\n */\n resume(motionId: string): void {\n const motion = this.motions.get(motionId)\n if (motion && motion.isPaused) {\n motion.isPaused = false\n if (motion.pauseTime > 0) {\n motion.startTime += Date.now() - motion.pauseTime\n }\n }\n }\n\n /**\n * 모든 모션 중지\n */\n stopAll(): void {\n this.motions.forEach((motion) => {\n motion.isRunning = false\n motion.options.onCancel?.()\n })\n this.motions.clear()\n this.stopAnimationLoop()\n }\n\n /**\n * 모션 상태 확인\n */\n getMotion(motionId: string): Motion | undefined {\n return this.motions.get(motionId)\n }\n\n /**\n * 실행 중인 모션 수\n */\n getActiveMotionCount(): number {\n return this.motions.size\n }\n\n /**\n * 애니메이션 루프 시작\n */\n private startAnimationLoop(): void {\n if (this.isRunning) return\n \n this.isRunning = true\n this.animate()\n }\n\n /**\n * 애니메이션 루프 중지\n */\n private stopAnimationLoop(): void {\n if (this.animationFrameId) {\n cancelAnimationFrame(this.animationFrameId)\n this.animationFrameId = null\n }\n this.isRunning = false\n }\n\n /**\n * 메인 애니메이션 루프\n */\n private animate(): void {\n if (!this.isRunning || this.motions.size === 0) {\n this.stopAnimationLoop()\n return\n }\n\n const currentTime = Date.now()\n const completedMotions: string[] = []\n\n this.motions.forEach((motion) => {\n if (!motion.isRunning || motion.isPaused) return\n\n const elapsed = currentTime - motion.startTime\n if (elapsed < 0) return // 아직 시작하지 않음\n\n const progress = Math.min(elapsed / motion.options.duration, 1)\n const easedProgress = motion.options.easing(progress)\n \n motion.currentProgress = easedProgress\n \n // 모션 프레임 적용\n this.applyMotionFrame(motion.element, easedProgress)\n \n // 콜백 호출\n motion.options.onUpdate?.(easedProgress)\n \n // 완료된 모션 체크\n if (progress >= 1) {\n completedMotions.push(motion.id)\n motion.isRunning = false\n motion.options.onComplete?.()\n }\n })\n\n // 완료된 모션 제거\n completedMotions.forEach(id => this.motions.delete(id))\n\n // 다음 프레임 요청\n this.animationFrameId = requestAnimationFrame(() => this.animate())\n }\n\n /**\n * 모션 프레임 적용\n */\n private applyMotionFrame(element: HTMLElement, progress: number): void {\n // GPU 가속을 위한 transform 사용\n const transforms: string[] = []\n \n // 기본 transform 속성들\n if (element.style.transform) {\n transforms.push(element.style.transform)\n }\n \n // progress에 따른 transform 계산\n // 여기서는 기본적인 예시만 구현\n // 실제로는 motionFrames를 받아서 처리해야 함\n \n element.style.transform = transforms.join(' ')\n }\n\n /**\n * GPU 가속 활성화\n */\n private enableGPUAcceleration(element: HTMLElement): void {\n // will-change 속성 설정으로 GPU 가속 활성화\n element.style.willChange = 'transform, opacity'\n \n // transform3d로 강제 GPU 가속\n element.style.transform = 'translateZ(0)'\n }\n\n /**\n * 레이어 분리\n */\n private createLayer(element: HTMLElement): void {\n // 새로운 레이어 생성으로 성능 향상\n element.style.transform = 'translateZ(0)'\n element.style.backfaceVisibility = 'hidden'\n }\n\n /**\n * 고유 모션 ID 생성\n */\n private generateMotionId(): string {\n return `motion_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`\n }\n\n /**\n * 정리\n */\n destroy(): void {\n this.stopAll()\n this.stopAnimationLoop()\n }\n}\n\n// 싱글톤 인스턴스\nexport const motionEngine = new MotionEngine()\n","/**\n * HUA Motion Core - 전환 효과 시스템\n * \n * CSS Motion API를 활용한 고성능 전환 효과들\n * GPU 가속 및 레이어 분리 최적화 포함\n */\n\nimport { motionEngine, MotionOptions } from './MotionEngine'\n\nexport type TransitionType = \n | 'fade'\n | 'slide'\n | 'slide-up'\n | 'slide-down'\n | 'slide-left'\n | 'slide-right'\n | 'scale'\n | 'flip'\n | 'morph'\n | 'cube'\n | 'zoom'\n\nexport interface TransitionOptions extends Omit<MotionOptions, 'easing'> {\n type: TransitionType\n easing?: (t: number) => number // easing을 다시 추가\n distance?: number // slide 거리 (px)\n scale?: number // scale 시작/끝 값\n perspective?: number // 3D 효과를 위한 원근감\n onTransitionStart?: () => void\n onTransitionComplete?: () => void\n}\n\nexport class TransitionEffects {\n private static instance: TransitionEffects\n private activeTransitions = new Map<string, string>()\n\n static getInstance(): TransitionEffects {\n if (!TransitionEffects.instance) {\n TransitionEffects.instance = new TransitionEffects()\n }\n return TransitionEffects.instance\n }\n\n /**\n * 페이드 인/아웃 전환\n */\n async fade(\n element: HTMLElement, \n options: Omit<TransitionOptions, 'type'>\n ): Promise<void> {\n const transitionId = this.generateTransitionId()\n \n return new Promise(async (resolve) => {\n const initialOpacity = parseFloat(getComputedStyle(element).opacity) || 1\n const targetOpacity = options.direction === 'reverse' ? 0 : 1\n \n // 초기 상태 설정\n if (options.direction === 'reverse') {\n element.style.opacity = initialOpacity.toString()\n } else {\n element.style.opacity = '0'\n }\n\n // GPU 가속 활성화\n this.enableGPUAcceleration(element)\n\n const motionId = await motionEngine.motion(\n element,\n [\n { progress: 0, properties: { opacity: options.direction === 'reverse' ? initialOpacity : 0 } },\n { progress: 1, properties: { opacity: targetOpacity } }\n ],\n {\n duration: options.duration,\n easing: options.easing || this.getDefaultEasing(),\n delay: options.delay,\n onStart: options.onTransitionStart,\n onUpdate: (progress) => {\n const currentOpacity = options.direction === 'reverse' \n ? initialOpacity * (1 - progress)\n : targetOpacity * progress\n element.style.opacity = currentOpacity.toString()\n },\n onComplete: () => {\n options.onTransitionComplete?.()\n this.activeTransitions.delete(transitionId)\n resolve()\n }\n }\n )\n\n this.activeTransitions.set(transitionId, motionId)\n })\n }\n\n /**\n * 슬라이드 전환\n */\n async slide(\n element: HTMLElement, \n options: Omit<TransitionOptions, 'type'>\n ): Promise<void> {\n const transitionId = this.generateTransitionId()\n const distance = options.distance || 100\n \n return new Promise(async (resolve) => {\n const initialTransform = getComputedStyle(element).transform\n const isReverse = options.direction === 'reverse'\n \n // 초기 위치 설정\n if (!isReverse) {\n element.style.transform = `translateX(${distance}px)`\n }\n\n // GPU 가속 활성화\n this.enableGPUAcceleration(element)\n\n const motionId = await motionEngine.motion(\n element,\n [\n { progress: 0, properties: { translateX: isReverse ? 0 : distance } },\n { progress: 1, properties: { translateX: isReverse ? distance : 0 } }\n ],\n {\n duration: options.duration,\n easing: options.easing || this.getDefaultEasing(),\n delay: options.delay,\n onStart: options.onTransitionStart,\n onUpdate: (progress) => {\n const currentTranslateX = isReverse \n ? distance * progress\n : distance * (1 - progress)\n element.style.transform = `translateX(${currentTranslateX}px)`\n },\n onComplete: () => {\n element.style.transform = initialTransform\n options.onTransitionComplete?.()\n this.activeTransitions.delete(transitionId)\n resolve()\n }\n }\n )\n\n this.activeTransitions.set(transitionId, motionId)\n })\n }\n\n /**\n * 스케일 전환\n */\n async scale(\n element: HTMLElement, \n options: Omit<TransitionOptions, 'type'>\n ): Promise<void> {\n const transitionId = this.generateTransitionId()\n const scaleValue = options.scale || 0.8\n \n return new Promise(async (resolve) => {\n const initialTransform = getComputedStyle(element).transform\n const isReverse = options.direction === 'reverse'\n \n // 초기 스케일 설정\n if (!isReverse) {\n element.style.transform = `scale(${scaleValue})`\n }\n\n // GPU 가속 활성화\n this.enableGPUAcceleration(element)\n\n const motionId = await motionEngine.motion(\n element,\n [\n { progress: 0, properties: { scale: isReverse ? 1 : scaleValue } },\n { progress: 1, properties: { scale: isReverse ? scaleValue : 1 } }\n ],\n {\n duration: options.duration,\n easing: options.easing || this.getDefaultEasing(),\n delay: options.delay,\n onStart: options.onTransitionStart,\n onUpdate: (progress) => {\n const currentScale = isReverse \n ? 1 - (1 - scaleValue) * progress\n : scaleValue + (1 - scaleValue) * progress\n element.style.transform = `scale(${currentScale})`\n },\n onComplete: () => {\n element.style.transform = initialTransform\n options.onTransitionComplete?.()\n this.activeTransitions.delete(transitionId)\n resolve()\n }\n }\n )\n\n this.activeTransitions.set(transitionId, motionId)\n })\n }\n\n /**\n * 플립 전환 (3D 회전)\n */\n async flip(\n element: HTMLElement, \n options: Omit<TransitionOptions, 'type'>\n ): Promise<void> {\n const transitionId = this.generateTransitionId()\n const perspective = options.perspective || 1000\n \n return new Promise(async (resolve) => {\n const initialTransform = getComputedStyle(element).transform\n const isReverse = options.direction === 'reverse'\n \n // 3D 설정\n element.style.perspective = `${perspective}px`\n element.style.transformStyle = 'preserve-3d'\n \n // 초기 회전 설정\n if (!isReverse) {\n element.style.transform = `rotateY(90deg)`\n }\n\n // GPU 가속 활성화\n this.enableGPUAcceleration(element)\n\n const motionId = await motionEngine.motion(\n element,\n [\n { progress: 0, properties: { rotateY: isReverse ? 0 : 90 } },\n { progress: 1, properties: { rotateY: isReverse ? 90 : 0 } }\n ],\n {\n duration: options.duration,\n easing: options.easing || this.getDefaultEasing(),\n delay: options.delay,\n onStart: options.onTransitionStart,\n onUpdate: (progress) => {\n const currentRotateY = isReverse \n ? 90 * progress\n : 90 * (1 - progress)\n element.style.transform = `rotateY(${currentRotateY}deg)`\n },\n onComplete: () => {\n element.style.transform = initialTransform\n element.style.perspective = ''\n element.style.transformStyle = ''\n options.onTransitionComplete?.()\n this.activeTransitions.delete(transitionId)\n resolve()\n }\n }\n )\n\n this.activeTransitions.set(transitionId, motionId)\n })\n }\n\n /**\n * 큐브 전환 (3D 큐브 회전)\n */\n async cube(\n element: HTMLElement, \n options: Omit<TransitionOptions, 'type'>\n ): Promise<void> {\n const transitionId = this.generateTransitionId()\n const perspective = options.perspective || 1200\n \n return new Promise(async (resolve) => {\n const initialTransform = getComputedStyle(element).transform\n const isReverse = options.direction === 'reverse'\n \n // 3D 큐브 설정\n element.style.perspective = `${perspective}px`\n element.style.transformStyle = 'preserve-3d'\n \n // 초기 큐브 회전 설정\n if (!isReverse) {\n element.style.transform = `rotateX(90deg) rotateY(45deg)`\n }\n\n // GPU 가속 활성화\n this.enableGPUAcceleration(element)\n\n const motionId = await motionEngine.motion(\n element,\n [\n { progress: 0, properties: { rotateX: isReverse ? 0 : 90, rotateY: isReverse ? 0 : 45 } },\n { progress: 1, properties: { rotateX: isReverse ? 90 : 0, rotateY: isReverse ? 45 : 0 } }\n ],\n {\n duration: options.duration,\n easing: options.easing || this.getDefaultEasing(),\n delay: options.delay,\n onStart: options.onTransitionStart,\n onUpdate: (progress) => {\n const currentRotateX = isReverse \n ? 90 * progress\n : 90 * (1 - progress)\n const currentRotateY = isReverse \n ? 45 * progress\n : 45 * (1 - progress)\n element.style.transform = `rotateX(${currentRotateX}deg) rotateY(${currentRotateY}deg)`\n },\n onComplete: () => {\n element.style.transform = initialTransform\n element.style.perspective = ''\n element.style.transformStyle = ''\n options.onTransitionComplete?.()\n this.activeTransitions.delete(transitionId)\n resolve()\n }\n }\n )\n\n this.activeTransitions.set(transitionId, motionId)\n })\n }\n\n /**\n * 모프 전환 (복합 변형)\n */\n async morph(\n element: HTMLElement, \n options: Omit<TransitionOptions, 'type'>\n ): Promise<void> {\n const transitionId = this.generateTransitionId()\n \n return new Promise(async (resolve) => {\n const initialTransform = getComputedStyle(element).transform\n const isReverse = options.direction === 'reverse'\n \n // 초기 모프 상태 설정\n if (!isReverse) {\n element.style.transform = `scale(0.9) rotate(5deg)`\n }\n\n // GPU 가속 활성화\n this.enableGPUAcceleration(element)\n\n const motionId = await motionEngine.motion(\n element,\n [\n { progress: 0, properties: { scale: isReverse ? 1 : 0.9, rotate: isReverse ? 0 : 5 } },\n { progress: 1, properties: { scale: isReverse ? 0.9 : 1, rotate: isReverse ? 5 : 0 } }\n ],\n {\n duration: options.duration,\n easing: options.easing || this.getDefaultEasing(),\n delay: options.delay,\n onStart: options.onTransitionStart,\n onUpdate: (progress) => {\n const currentScale = isReverse \n ? 1 - 0.1 * progress\n : 0.9 + 0.1 * progress\n const currentRotate = isReverse \n ? 5 * progress\n : 5 * (1 - progress)\n element.style.transform = `scale(${currentScale}) rotate(${currentRotate}deg)`\n },\n onComplete: () => {\n element.style.transform = initialTransform\n options.onTransitionComplete?.()\n this.activeTransitions.delete(transitionId)\n resolve()\n }\n }\n )\n\n this.activeTransitions.set(transitionId, motionId)\n })\n }\n\n /**\n * 전환 중지\n */\n stopTransition(transitionId: string): void {\n const motionId = this.activeTransitions.get(transitionId)\n if (motionId) {\n motionEngine.stop(motionId)\n this.activeTransitions.delete(transitionId)\n }\n }\n\n /**\n * 모든 전환 중지\n */\n stopAllTransitions(): void {\n this.activeTransitions.forEach((motionId) => {\n motionEngine.stop(motionId)\n })\n this.activeTransitions.clear()\n }\n\n /**\n * 활성 전환 수 확인\n */\n getActiveTransitionCount(): number {\n return this.activeTransitions.size\n }\n\n /**\n * GPU 가속 활성화\n */\n private enableGPUAcceleration(element: HTMLElement): void {\n element.style.willChange = 'transform, opacity'\n element.style.transform = 'translateZ(0)'\n }\n\n /**\n * 기본 이징 함수\n */\n private getDefaultEasing(): (t: number) => number {\n return (t: number) => t * t * (3 - 2 * t) // smooth easing\n }\n\n /**\n * 고유 전환 ID 생성\n */\n private generateTransitionId(): string {\n return `transition_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`\n }\n\n /**\n * 정리\n */\n destroy(): void {\n this.stopAllTransitions()\n }\n}\n\n// 싱글톤 인스턴스\nexport const transitionEffects = TransitionEffects.getInstance()\n","/**\n * HUA Motion Core - 성능 최적화 시스템\n * \n * GPU 가속, 레이어 관리, 메모리 최적화를 위한 유틸리티들\n * 브라우저별 최적화 전략 포함\n */\n\nexport interface PerformanceOptimizerMetrics {\n fps: number\n memoryUsage?: number\n gpuTime?: number\n cpuTime?: number\n layerCount: number\n activeMotions: number\n}\n\nexport interface OptimizationConfig {\n enableGPUAcceleration: boolean\n enableLayerSeparation: boolean\n enableMemoryOptimization: boolean\n targetFPS: number\n maxLayerCount: number\n memoryThreshold: number\n}\n\nexport class PerformanceOptimizer {\n private static instance: PerformanceOptimizer\n private config: OptimizationConfig\n private performanceObserver: PerformanceObserver | null = null\n private metrics: PerformanceOptimizerMetrics\n private layerRegistry = new Set<HTMLElement>()\n private isMonitoring = false\n\n constructor() {\n this.config = {\n enableGPUAcceleration: true,\n enableLayerSeparation: true,\n enableMemoryOptimization: true,\n targetFPS: 60,\n maxLayerCount: 100,\n memoryThreshold: 50 * 1024 * 1024 // 50MB\n }\n\n this.metrics = {\n fps: 0,\n layerCount: 0,\n activeMotions: 0\n }\n\n this.initializePerformanceMonitoring()\n }\n\n static getInstance(): PerformanceOptimizer {\n if (!PerformanceOptimizer.instance) {\n PerformanceOptimizer.instance = new PerformanceOptimizer()\n }\n return PerformanceOptimizer.instance\n }\n\n /**\n * 성능 모니터링 초기화\n */\n private initializePerformanceMonitoring(): void {\n if (typeof PerformanceObserver !== 'undefined') {\n try {\n this.performanceObserver = new PerformanceObserver((list) => {\n const entries = list.getEntries()\n this.updatePerformanceMetrics(entries)\n })\n \n this.performanceObserver.observe({ entryTypes: ['measure', 'navigation'] })\n } catch (error) {\n if (process.env.NODE_ENV === 'development') {\n console.warn('Performance monitoring not supported:', error)\n }\n }\n }\n }\n\n /**\n * 성능 메트릭 업데이트\n */\n private updatePerformanceMetrics(entries: PerformanceEntry[]): void {\n entries.forEach(entry => {\n if (entry.entryType === 'measure') {\n // FPS 계산\n this.calculateFPS()\n }\n })\n }\n\n /**\n * FPS 계산\n */\n private calculateFPS(): void {\n const now = performance.now()\n const deltaTime = now - (this.lastFrameTime || now)\n this.lastFrameTime = now\n \n if (deltaTime > 0) {\n this.metrics.fps = Math.round(1000 / deltaTime)\n }\n }\n\n /**\n * GPU 가속 활성화\n */\n enableGPUAcceleration(element: HTMLElement): void {\n if (!this.config.enableGPUAcceleration) return\n\n try {\n // will-change 속성으로 GPU 가속 힌트 제공\n element.style.willChange = 'transform, opacity'\n \n // transform3d로 강제 GPU 가속\n element.style.transform = 'translateZ(0)'\n \n // 하드웨어 가속을 위한 추가 속성들\n element.style.backfaceVisibility = 'hidden'\n element.style.transformStyle = 'preserve-3d'\n \n // 레이어 등록\n this.registerLayer(element)\n \n } catch (error) {\n if (process.env.NODE_ENV === 'development') {\n console.warn('GPU acceleration failed:', error)\n }\n }\n }\n\n /**\n * 레이어 분리 및 최적화\n */\n createOptimizedLayer(element: HTMLElement): void {\n if (!this.config.enableLayerSeparation) return\n\n try {\n // 새로운 레이어 생성\n element.style.transform = 'translateZ(0)'\n element.style.backfaceVisibility = 'hidden'\n element.style.perspective = '1000px'\n \n // 레이어 등록\n this.registerLayer(element)\n \n // 레이어 수 제한 체크\n this.checkLayerLimit()\n \n } catch (error) {\n if (process.env.NODE_ENV === 'development') {\n console.warn('Layer optimization failed:', error)\n }\n }\n }\n\n /**\n * 레이어 등록\n */\n private registerLayer(element: HTMLElement): void {\n if (this.layerRegistry.has(element)) return\n \n this.layerRegistry.add(element)\n this.metrics.layerCount = this.layerRegistry.size\n \n // 메모리 사용량 체크\n this.checkMemoryUsage()\n }\n\n /**\n * 레이어 제거\n */\n removeLayer(element: HTMLElement): void {\n if (this.layerRegistry.has(element)) {\n this.layerRegistry.delete(element)\n this.metrics.layerCount = this.layerRegistry.size\n \n // GPU 가속 비활성화\n element.style.willChange = 'auto'\n element.style.transform = ''\n element.style.backfaceVisibility = ''\n element.style.transformStyle = ''\n element.style.perspective = ''\n }\n }\n\n /**\n * 레이어 수 제한 체크\n */\n private checkLayerLimit(): void {\n if (this.metrics.layerCount > this.config.maxLayerCount) {\n if (process.env.NODE_ENV === 'development') {\n console.warn(`Layer count (${this.metrics.layerCount}) exceeds limit (${this.config.maxLayerCount})`)\n }\n \n // 오래된 레이어들 정리\n this.cleanupOldLayers()\n }\n }\n\n /**\n * 오래된 레이어 정리\n */\n private cleanupOldLayers(): void {\n const layersToRemove = Array.from(this.layerRegistry).slice(0, 10)\n layersToRemove.forEach(layer => {\n this.removeLayer(layer)\n })\n }\n\n /**\n * 메모리 사용량 체크\n */\n private checkMemoryUsage(): void {\n if (!this.config.enableMemoryOptimization) return\n\n // Memory API 지원 여부 체크\n if ('memory' in performance) {\n const memory = (performance as any).memory\n this.metrics.memoryUsage = memory.usedJSHeapSize\n \n if (memory.usedJSHeapSize > this.config.memoryThreshold) {\n if (process.env.NODE_ENV === 'development') {\n console.warn('Memory usage high, cleaning up...')\n }\n this.cleanupMemory()\n }\n }\n }\n\n /**\n * 메모리 정리\n */\n private cleanupMemory(): void {\n // 가비지 컬렉션 힌트\n if ('gc' in window) {\n try {\n (window as any).gc()\n } catch (error) {\n // gc() 호출 실패 시 무시\n }\n }\n \n // 불필요한 레이어 정리\n this.cleanupOldLayers()\n }\n\n /**\n * 성능 최적화 설정 업데이트\n */\n updateConfig(newConfig: Partial<OptimizationConfig>): void {\n this.config = { ...this.config, ...newConfig }\n \n // 설정 변경에 따른 즉시 적용\n if (!this.config.enableGPUAcceleration) {\n this.disableAllGPUAcceleration()\n }\n \n if (!this.config.enableLayerSeparation) {\n this.disableAllLayers()\n }\n }\n\n /**\n * 모든 GPU 가속 비활성화\n */\n private disableAllGPUAcceleration(): void {\n this.layerRegistry.forEach(element => {\n element.style.willChange = 'auto'\n element.style.transform = ''\n })\n }\n\n /**\n * 모든 레이어 비활성화\n */\n private disableAllLayers(): void {\n this.layerRegistry.forEach(element => {\n this.removeLayer(element)\n })\n }\n\n /**\n * 성능 메트릭 가져오기\n */\n getMetrics(): PerformanceOptimizerMetrics {\n return { ...this.metrics }\n }\n\n /**\n * 성능 모니터링 시작\n */\n startMonitoring(): void {\n if (this.isMonitoring) return\n \n this.isMonitoring = true\n this.monitoringInterval = setInterval(() => {\n this.updateMetrics()\n }, 1000) // 1초마다 업데이트\n }\n\n /**\n * 성능 모니터링 중지\n */\n stopMonitoring(): void {\n if (!this.isMonitoring) return\n \n this.isMonitoring = false\n if (this.monitoringInterval) {\n clearInterval(this.monitoringInterval)\n this.monitoringInterval = undefined\n }\n }\n\n /**\n * 메트릭 업데이트\n */\n private updateMetrics(): void {\n // 메모리 사용량 업데이트\n if ('memory' in performance) {\n const memory = (performance as any).memory\n this.metrics.memoryUsage = memory.usedJSHeapSize\n }\n \n // 레이어 수 업데이트\n this.metrics.layerCount = this.layerRegistry.size\n }\n\n /**\n * 성능 리포트 생성\n */\n generateReport(): string {\n const metrics = this.getMetrics()\n \n return `\n=== HUA Motion Performance Report ===\nFPS: ${metrics.fps}\nActive Layers: ${metrics.layerCount}\nMemory Usage: ${this.formatBytes(metrics.memoryUsage || 0)}\nActive Motions: ${metrics.activeMotions}\nGPU Acceleration: ${this.config.enableGPUAcceleration ? 'Enabled' : 'Disabled'}\nLayer Separation: ${this.config.enableLayerSeparation ? 'Enabled' : 'Disabled'}\nMemory Optimization: ${this.config.enableMemoryOptimization ? 'Enabled' : 'Disabled'}\n=====================================\n `.trim()\n }\n\n /**\n * 바이트 단위 포맷팅\n */\n private formatBytes(bytes: number): string {\n if (bytes === 0) return '0 B'\n \n const k = 1024\n const sizes = ['B', 'KB', 'MB', 'GB']\n const i = Math.floor(Math.log(bytes) / Math.log(k))\n \n return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i]\n }\n\n /**\n * 성능 최적화 권장사항\n */\n getOptimizationRecommendations(): string[] {\n const recommendations: string[] = []\n const metrics = this.getMetrics()\n \n if (metrics.fps < this.config.targetFPS) {\n recommendations.push('FPS가 낮습니다. GPU 가속을 활성화하거나 레이어 수를 줄이세요.')\n }\n \n if (metrics.layerCount > this.config.maxLayerCount * 0.8) {\n recommendations.push('레이어 수가 많습니다. 불필요한 레이어를 정리하세요.')\n }\n \n if (metrics.memoryUsage && metrics.memoryUsage > this.config.memoryThreshold * 0.8) {\n recommendations.push('메모리 사용량이 높습니다. 메모리 정리를 고려하세요.')\n }\n \n return recommendations\n }\n\n /**\n * 정리\n */\n destroy(): void {\n this.stopMonitoring()\n \n if (this.performanceObserver) {\n this.performanceObserver.disconnect()\n this.performanceObserver = null\n }\n \n // 모든 레이어 정리\n this.layerRegistry.forEach(element => {\n this.removeLayer(element)\n })\n \n this.layerRegistry.clear()\n }\n\n private lastFrameTime?: number\n private monitoringInterval?: NodeJS.Timeout\n}\n\n// 싱글톤 인스턴스\nexport const performanceOptimizer = PerformanceOptimizer.getInstance()\n","// ========================================\n// HUA Motion SDK - Preset System\n// ========================================\n\nimport type { MotionPreset, PresetConfig, PageType, PageMotionsConfig } from '../types'\n\n// ========================================\n// 기본 모션 프리셋\n// ========================================\n\nexport const MOTION_PRESETS: PresetConfig = {\n hero: {\n entrance: 'fadeIn',\n delay: 200,\n duration: 800,\n hover: false,\n click: false\n },\n title: {\n entrance: 'slideUp',\n delay: 400,\n duration: 700,\n hover: false,\n click: false\n },\n button: {\n entrance: 'scaleIn',\n delay: 600,\n duration: 300,\n hover: true,\n click: true\n },\n card: {\n entrance: 'slideUp',\n delay: 800,\n duration: 500,\n hover: true,\n click: false\n },\n text: {\n entrance: 'fadeIn',\n delay: 200,\n duration: 600,\n hover: false,\n click: false\n },\n image: {\n entrance: 'scaleIn',\n delay: 400,\n duration: 600,\n hover: true,\n click: false\n }\n}\n\n// ========================================\n// 페이지별 프리셋 (1단계: useSimplePageMotion)\n// ========================================\n\nexport const PAGE_MOTIONS: Record<PageType, PageMotionsConfig> = {\n // 홈페이지\n home: {\n hero: { type: 'hero' },\n title: { type: 'title' },\n description: { type: 'text' },\n cta: { type: 'button' },\n feature1: { type: 'card' },\n feature2: { type: 'card' },\n feature3: { type: 'card' }\n },\n \n // 대시보드\n dashboard: {\n header: { type: 'hero' },\n sidebar: { type: 'card', entrance: 'slideLeft' },\n main: { type: 'text', entrance: 'fadeIn' },\n card1: { type: 'card' },\n card2: { type: 'card' },\n card3: { type: 'card' },\n chart: { type: 'image' }\n },\n \n // 제품 페이지\n product: {\n hero: { type: 'hero' },\n title: { type: 'title' },\n image: { type: 'image' },\n description: { type: 'text' },\n price: { type: 'text' },\n buyButton: { type: 'button' },\n features: { type: 'card' }\n },\n \n // 블로그\n blog: {\n header: { type: 'hero' },\n title: { type: 'title' },\n content: { type: 'text' },\n sidebar: { type: 'card', entrance: 'slideRight' },\n related1: { type: 'card' },\n related2: { type: 'card' },\n related3: { type: 'card' }\n }\n}\n\n// ========================================\n// 프리셋 유틸리티 함수\n// ========================================\n\n/**\n * 프리셋과 커스텀 설정을 병합\n */\nexport function mergeWithPreset(\n preset: MotionPreset,\n custom: Partial<MotionPreset> = {}\n): MotionPreset {\n return {\n ...preset,\n ...custom\n }\n}\n\n/**\n * 페이지 타입으로 프리셋 가져오기\n */\nexport function getPagePreset(pageType: PageType): PageMotionsConfig {\n return PAGE_MOTIONS[pageType]\n}\n\n/**\n * 모션 타입으로 기본 프리셋 가져오기\n */\nexport function getMotionPreset(type: string): MotionPreset {\n return MOTION_PRESETS[type] || MOTION_PRESETS.text\n} ","// ========================================\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 let opacity = isVisible ? 1 : 0\n let translateY = isVisible ? 0 : 20\n let translateX = 0\n let 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} ","import { MotionState, MotionElement } from '../types'\n\n/**\n * MotionStateManager - 모션 상태 관리 클래스\n * \n * 상태 충돌 문제 해결을 위해 3가지 상태를 분리:\n * - internalVisibility: 내부 로직 (초기화, 리셋 등)\n * - triggeredVisibility: 외부 트리거 (Intersection Observer)\n * - finalVisibility: 최종 계산된 상태\n */\nexport class MotionStateManager {\n private states: Map<string, MotionState> = new Map()\n private listeners: Map<string, Set<(state: MotionState) => void>> = new Map()\n\n /**\n * 요소의 상태를 초기화\n */\n initializeElement(elementId: string, config: MotionElement): void {\n const initialState: MotionState = {\n internalVisibility: false, // 초기에 숨김 상태로 시작 (스크롤 리빌용)\n triggeredVisibility: false, // Intersection Observer가 아직 트리거되지 않음\n finalVisibility: false, // 초기에 숨김 상태로 시작\n opacity: 0, // 초기에 투명 상태로 시작\n translateY: 20, // 초기에 아래로 이동된 상태로 시작\n translateX: 0,\n scale: 0.95, // 초기에 약간 축소된 상태로 시작\n rotation: 0,\n isHovered: false,\n isClicked: false,\n isAnimating: false\n }\n\n this.states.set(elementId, initialState)\n this.computeFinalState(elementId)\n }\n\n /**\n * 내부 가시성 상태 업데이트 (초기화, 리셋 등)\n */\n setInternalVisibility(elementId: string, visible: boolean): void {\n const state = this.states.get(elementId)\n if (!state) return\n\n state.internalVisibility = visible\n this.computeFinalState(elementId)\n this.notifyListeners(elementId, state)\n }\n\n /**\n * 외부 트리거 가시성 상태 업데이트 (Intersection Observer)\n */\n setTriggeredVisibility(elementId: string, visible: boolean): void {\n const state = this.states.get(elementId)\n if (!state) return\n\n state.triggeredVisibility = visible\n this.computeFinalState(elementId)\n this.notifyListeners(elementId, state)\n }\n\n /**\n * 모션 값 업데이트\n */\n updateMotionValues(elementId: string, values: Partial<MotionState>): void {\n const state = this.states.get(elementId)\n if (!state) return\n\n Object.assign(state, values)\n this.notifyListeners(elementId, state)\n }\n\n /**\n * 최종 상태 계산\n */\n private computeFinalState(elementId: string): void {\n const state = this.states.get(elementId)\n if (!state) return\n\n // 내부 또는 외부 트리거 중 하나라도 true면 최종적으로 보임\n state.finalVisibility = state.internalVisibility || state.triggeredVisibility\n\n // 모션 중 상태 업데이트\n state.isAnimating = state.finalVisibility && (state.opacity < 1 || state.translateY > 0)\n }\n\n /**\n * 현재 상태 조회\n */\n getState(elementId: string): MotionState | undefined {\n return this.states.get(elementId)\n }\n\n /**\n * 모든 상태 조회\n */\n getAllStates(): Map<string, MotionState> {\n return new Map(this.states)\n }\n\n /**\n * 상태 변경 리스너 등록\n */\n subscribe(elementId: string, listener: (state: MotionState) => void): () => void {\n if (!this.listeners.has(elementId)) {\n this.listeners.set(elementId, new Set())\n }\n\n this.listeners.get(elementId)!.add(listener)\n\n // 구독 해제 함수 반환\n return () => {\n const listeners = this.listeners.get(elementId)\n if (listeners) {\n listeners.delete(listener)\n }\n }\n }\n\n /**\n * 리스너들에게 상태 변경 알림\n */\n notifyListeners(elementId: string, state: MotionState): void {\n const listeners = this.listeners.get(elementId)\n if (!listeners) return\n\n listeners.forEach(listener => {\n try {\n listener(state)\n } catch (error) {\n if (process.env.NODE_ENV === 'development') {\n console.error(`MotionStateManager listener error for ${elementId}:`, error)\n }\n }\n })\n }\n\n /**\n * 모든 상태 초기화\n */\n reset(): void {\n this.states.clear()\n this.listeners.clear()\n }\n\n /**\n * 특정 요소 상태 초기화\n */\n resetElement(elementId: string): void {\n this.states.delete(elementId)\n this.listeners.delete(elementId)\n }\n\n /**\n * 디버그용 상태 출력\n */\n debug(): void {\n if (process.env.NODE_ENV === 'development') {\n console.log('MotionStateManager Debug:')\n this.states.forEach((state, elementId) => {\n console.log(` ${elementId}:`, {\n internalVisibility: state.internalVisibility,\n triggeredVisibility: state.triggeredVisibility,\n finalVisibility: state.finalVisibility,\n opacity: state.opacity,\n translateY: state.translateY,\n isAnimating: state.isAnimating\n })\n })\n }\n }\n}\n\n// 싱글톤 인스턴스\nexport const motionStateManager = new MotionStateManager()\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 let 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 * @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'\n\nexport interface UseUnifiedMotionOptions extends Omit<BaseMotionOptions, 'autoStart'> {\n /** Motion type to use */\n type: EntranceType\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\nexport function useUnifiedMotion<T extends MotionElement = HTMLDivElement>(\n options: UseUnifiedMotionOptions\n): BaseMotionReturn<T> {\n const {\n type,\n duration = 600,\n autoStart = true,\n delay = 0,\n easing,\n threshold = 0.1,\n triggerOnce = true,\n distance = 50,\n onComplete,\n onStart,\n onStop,\n onReset\n } = options\n\n const resolvedEasing = getEasingForType(type, 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 observerRef = useRef<IntersectionObserver | null>(null)\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로 자동 시작\n useEffect(() => {\n if (!ref.current || !autoStart) return\n\n observerRef.current = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n if (entry.isIntersecting) {\n startRef.current()\n if (triggerOnce) {\n observerRef.current?.disconnect()\n }\n }\n })\n },\n { threshold }\n )\n\n observerRef.current.observe(ref.current)\n\n return () => {\n observerRef.current?.disconnect()\n }\n }, [autoStart, threshold, triggerOnce])\n\n useEffect(() => {\n return () => stop()\n }, [stop])\n\n // type에 맞는 스타일을 CSS transition으로 처리\n const style = useMemo(() => {\n const base = isVisible ? getVisibleStyle() : getInitialStyle(type, 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, distance, duration, resolvedEasing, delay, progress])\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'\n\nexport function useFadeIn<T extends MotionElement = HTMLDivElement>(\n options: FadeInOptions = {}\n): BaseMotionReturn<T> {\n const {\n delay = 0,\n duration = 700,\n threshold = 0.1,\n triggerOnce = true,\n easing = 'ease-out',\n autoStart = true,\n initialOpacity = 0,\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 observerRef = useRef<IntersectionObserver | null>(null)\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 설정\n useEffect(() => {\n if (!ref.current || !autoStart) return\n\n observerRef.current = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n if (entry.isIntersecting) {\n startRef.current()\n if (triggerOnce) {\n observerRef.current?.disconnect()\n }\n }\n })\n },\n { threshold }\n )\n\n observerRef.current.observe(ref.current)\n\n return () => {\n if (observerRef.current) {\n observerRef.current.disconnect()\n }\n }\n }, [autoStart, threshold, triggerOnce, nodeReady])\n\n // 자동 시작이 비활성화된 경우 수동 시작\n useEffect(() => {\n if (!autoStart) {\n start()\n }\n }, [autoStart, start])\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'\n\nexport function useSlideUp<T extends MotionElement = HTMLDivElement>(\n options: SlideOptions = {}\n): BaseMotionReturn<T> {\n const {\n delay = 0,\n duration = 700,\n threshold = 0.1,\n triggerOnce = true,\n easing = 'ease-out',\n autoStart = true,\n direction = 'up',\n distance = 50,\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 observerRef = useRef<IntersectionObserver | 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 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 설정\n useEffect(() => {\n if (!ref.current || !autoStart) return\n\n observerRef.current = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n if (entry.isIntersecting) {\n startRef.current()\n if (triggerOnce) {\n observerRef.current?.disconnect()\n }\n }\n })\n },\n { threshold }\n )\n\n observerRef.current.observe(ref.current)\n\n return () => {\n if (observerRef.current) {\n observerRef.current.disconnect()\n }\n }\n }, [autoStart, threshold, triggerOnce, nodeReady])\n\n // 자동 시작이 비활성화된 경우 수동 시작\n useEffect(() => {\n if (!autoStart) {\n start()\n }\n }, [autoStart, start])\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'\n\nexport function useScaleIn<T extends MotionElement = HTMLDivElement>(\n options: ScaleOptions = {}\n): BaseMotionReturn<T> {\n const {\n initialScale = 0,\n targetScale = 1,\n duration = 700,\n delay = 0,\n autoStart = true,\n easing = 'ease-out',\n threshold = 0.1,\n triggerOnce = true,\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 observerRef = useRef<IntersectionObserver | null>(null)\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 설정\n useEffect(() => {\n if (!ref.current || !autoStart) return\n\n observerRef.current = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n if (entry.isIntersecting) {\n startRef.current()\n if (triggerOnce) {\n observerRef.current?.disconnect()\n }\n }\n })\n },\n { threshold }\n )\n\n observerRef.current.observe(ref.current)\n\n return () => {\n if (observerRef.current) {\n observerRef.current.disconnect()\n }\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'\n\nexport function useBounceIn<T extends MotionElement = HTMLDivElement>(\n options: BounceOptions = {}\n): BaseMotionReturn<T> {\n const {\n duration = 600,\n delay = 0,\n autoStart = true,\n intensity = 0.3,\n threshold = 0.1,\n triggerOnce = true,\n easing = 'cubic-bezier(0.34, 1.56, 0.64, 1)', // 바운스 이징\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 observerRef = useRef<IntersectionObserver | null>(null)\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 설정 (useFadeIn과 동일 패턴)\n useEffect(() => {\n if (!ref.current || !autoStart) return\n\n observerRef.current = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n if (entry.isIntersecting) {\n startRef.current()\n if (triggerOnce) {\n observerRef.current?.disconnect()\n }\n }\n })\n },\n { threshold }\n )\n\n observerRef.current.observe(ref.current)\n\n return () => {\n if (observerRef.current) {\n observerRef.current.disconnect()\n }\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","// 고급 이징 함수들 - Framer Motion과 유사한 기능 제공\n\nexport type EasingFunction = (t: number) => number\n\n// 기본 이징 함수들\nexport const linear: EasingFunction = (t) => t\n\nexport const easeIn: EasingFunction = (t) => t * t\nexport const easeOut: EasingFunction = (t) => 1 - (1 - t) * (1 - t)\nexport const easeInOut: EasingFunction = (t) => t < 0.5 ? 2 * t * t : 1 - Math.pow(-2 * t + 2, 2) / 2\n\n// 고급 이징 함수들\nexport const easeInQuad: EasingFunction = (t) => t * t\nexport const easeOutQuad: EasingFunction = (t) => 1 - (1 - t) * (1 - t)\nexport const easeInOutQuad: EasingFunction = (t) => t < 0.5 ? 2 * t * t : 1 - Math.pow(-2 * t + 2, 2) / 2\n\nexport const easeInCubic: EasingFunction = (t) => t * t * t\nexport const easeOutCubic: EasingFunction = (t) => 1 - Math.pow(1 - t, 3)\nexport const easeInOutCubic: EasingFunction = (t) => t < 0.5 ? 4 * t * t * t : 1 - Math.pow(-2 * t + 2, 3) / 2\n\nexport const easeInQuart: EasingFunction = (t) => t * t * t * t\nexport const easeOutQuart: EasingFunction = (t) => 1 - Math.pow(1 - t, 4)\nexport const easeInOutQuart: EasingFunction = (t) => t < 0.5 ? 8 * t * t * t * t : 1 - Math.pow(-2 * t + 2, 4) / 2\n\nexport const easeInQuint: EasingFunction = (t) => t * t * t * t * t\nexport const easeOutQuint: EasingFunction = (t) => 1 - Math.pow(1 - t, 5)\nexport const easeInOutQuint: EasingFunction = (t) => t < 0.5 ? 16 * t * t * t * t * t : 1 - Math.pow(-2 * t + 2, 5) / 2\n\nexport const easeInSine: EasingFunction = (t) => 1 - Math.cos((t * Math.PI) / 2)\nexport const easeOutSine: EasingFunction = (t) => Math.sin((t * Math.PI) / 2)\nexport const easeInOutSine: EasingFunction = (t) => -(Math.cos(Math.PI * t) - 1) / 2\n\nexport const easeInExpo: EasingFunction = (t) => t === 0 ? 0 : Math.pow(2, 10 * t - 10)\nexport const easeOutExpo: EasingFunction = (t) => t === 1 ? 1 : 1 - Math.pow(2, -10 * t)\nexport const easeInOutExpo: EasingFunction = (t) => {\n if (t === 0) return 0\n if (t === 1) return 1\n if (t < 0.5) return Math.pow(2, 20 * t - 10) / 2\n return (2 - Math.pow(2, -20 * t + 10)) / 2\n}\n\nexport const easeInCirc: EasingFunction = (t) => 1 - Math.sqrt(1 - Math.pow(t, 2))\nexport const easeOutCirc: EasingFunction = (t) => Math.sqrt(1 - Math.pow(t - 1, 2))\nexport const easeInOutCirc: EasingFunction = (t) => {\n if (t < 0.5) return (1 - Math.sqrt(1 - Math.pow(2 * t, 2))) / 2\n return (Math.sqrt(1 - Math.pow(-2 * t + 2, 2)) + 1) / 2\n}\n\nexport const easeInBounce: EasingFunction = (t) => 1 - easeOutBounce(1 - t)\nexport const easeOutBounce: EasingFunction = (t) => {\n const n1 = 7.5625\n const d1 = 2.75\n\n if (t < 1 / d1) {\n return n1 * t * t\n } else if (t < 2 / d1) {\n return n1 * (t -= 1.5 / d1) * t + 0.75\n } else if (t < 2.5 / d1) {\n return n1 * (t -= 2.25 / d1) * t + 0.9375\n } else {\n return n1 * (t -= 2.625 / d1) * t + 0.984375\n }\n}\nexport const easeInOutBounce: EasingFunction = (t) => {\n if (t < 0.5) return (1 - easeOutBounce(1 - 2 * t)) / 2\n return (1 + easeOutBounce(2 * t - 1)) / 2\n}\n\nexport const easeInBack: EasingFunction = (t) => {\n const c1 = 1.70158\n const c3 = c1 + 1\n return c3 * t * t * t - c1 * t * t\n}\nexport const easeOutBack: EasingFunction = (t) => {\n const c1 = 1.70158\n const c3 = c1 + 1\n return 1 + c3 * Math.pow(t - 1, 3) + c1 * Math.pow(t - 1, 2)\n}\nexport const easeInOutBack: EasingFunction = (t) => {\n const c1 = 1.70158\n const c2 = c1 * 1.525\n if (t < 0.5) {\n return (Math.pow(2 * t, 2) * ((c2 + 1) * 2 * t - c2)) / 2\n } else {\n return (Math.pow(2 * t - 2, 2) * ((c2 + 1) * (t * 2 - 2) + c2) + 2) / 2\n }\n}\n\nexport const easeInElastic: EasingFunction = (t) => {\n const c4 = (2 * Math.PI) / 3\n if (t === 0) return 0\n if (t === 1) return 1\n return -Math.pow(2, 10 * t - 10) * Math.sin((t * 10 - 0.75) * c4)\n}\nexport const easeOutElastic: EasingFunction = (t) => {\n const c4 = (2 * Math.PI) / 3\n if (t === 0) return 0\n if (t === 1) return 1\n return Math.pow(2, -10 * t) * Math.sin((t * 10 - 0.75) * c4) + 1\n}\nexport const easeInOutElastic: EasingFunction = (t) => {\n const c5 = (2 * Math.PI) / 4.5\n if (t === 0) return 0\n if (t === 1) return 1\n if (t < 0.5) {\n return -(Math.pow(2, 20 * t - 10) * Math.sin((20 * t - 11.125) * c5)) / 2\n } else {\n return (Math.pow(2, -20 * t + 10) * Math.sin((20 * t - 11.125) * c5)) / 2 + 1\n }\n}\n\n// 특수 효과 이징 함수들\nexport const pulse: EasingFunction = (t) => Math.sin(t * Math.PI) * 0.5 + 0.5\nexport const pulseSmooth: EasingFunction = (t) => Math.sin(t * Math.PI * 2) * 0.3 + 0.7\nexport const skeletonWave: EasingFunction = (t) => Math.sin((t - 0.5) * Math.PI * 2) * 0.5 + 0.5\nexport const blink: EasingFunction = (t) => t < 0.5 ? 1 : 0\n\n// 이징 타입 정의\nexport type EasingType = \n | 'linear'\n | 'easeIn' | 'easeOut' | 'easeInOut'\n | 'easeInQuad' | 'easeOutQuad' | 'easeInOutQuad'\n | 'easeInCubic' | 'easeOutCubic' | 'easeInOutCubic'\n | 'easeInQuart' | 'easeOutQuart' | 'easeInOutQuart'\n | 'easeInQuint' | 'easeOutQuint' | 'easeInOutQuint'\n | 'easeInSine' | 'easeOutSine' | 'easeInOutSine'\n | 'easeInExpo' | 'easeOutExpo' | 'easeInOutExpo'\n | 'easeInCirc' | 'easeOutCirc' | 'easeInOutCirc'\n | 'easeInBounce' | 'easeOutBounce' | 'easeInOutBounce'\n | 'easeInBack' | 'easeOutBack' | 'easeInOutBack'\n | 'easeInElastic' | 'easeOutElastic' | 'easeInOutElastic'\n | 'pulse' | 'pulseSmooth' | 'skeletonWave' | 'blink'\n\n// 이징 함수 객체 (기존 호환성을 위해)\nexport const easing = {\n linear,\n easeIn,\n easeOut,\n easeInOut,\n easeInQuad,\n easeOutQuad,\n easeInOutQuad,\n easeInCubic,\n easeOutCubic,\n easeInOutCubic,\n easeInQuart,\n easeOutQuart,\n easeInOutQuart,\n easeInQuint,\n easeOutQuint,\n easeInOutQuint,\n easeInSine,\n easeOutSine,\n easeInOutSine,\n easeInExpo,\n easeOutExpo,\n easeInOutExpo,\n easeInCirc,\n easeOutCirc,\n easeInOutCirc,\n easeInBounce,\n easeOutBounce,\n easeInOutBounce,\n easeInBack,\n easeOutBack,\n easeInOutBack,\n easeInElastic,\n easeOutElastic,\n easeInOutElastic,\n pulse,\n pulseSmooth,\n skeletonWave,\n blink\n} as const\n\n// 이징 함수 확인 함수\nexport function isValidEasing(easingName: string): boolean {\n return easingName in easing\n}\n\n// 이징 함수 가져오기 함수\nexport function getEasing(easingName: unknown): EasingFunction {\n if (typeof easingName === 'function') {\n // 타입이 Function이지만 EasingFunction 시그니처와 일치하는지 확인\n return (easingName as EasingFunction)\n }\n\n if (typeof easingName === 'string') {\n if (easingName in easing) {\n return easing[easingName as keyof typeof easing]\n }\n\n // 'bounce'는 easeOutBounce로 매핑 (별도 이름이므로)\n if (easingName === 'bounce') {\n return easing.easeOutBounce\n }\n\n if (process.env.NODE_ENV === 'development') {\n console.warn(`[HUA Motion] Unknown easing \"${easingName}\", using default \"easeOut\".`)\n }\n }\n\n return easeOut\n}\n\n// 이징 적용 함수\nexport function applyEasing(t: number, easingName: string | EasingFunction): number {\n const easingFn = getEasing(easingName)\n return easingFn(t)\n}\n\n// 안전한 이징 적용 함수 (에러 방지)\nexport function safeApplyEasing(t: number, easingName: unknown): number {\n try {\n const easingFn = getEasing(easingName)\n return easingFn(t)\n } catch (err) {\n if (process.env.NODE_ENV === 'development') {\n console.error(`[HUA Motion] Failed to apply easing \"${easingName}\":`, err)\n }\n return easeOut(t)\n }\n}\n\n// 사용 가능한 이징 함수 목록\nexport function getAvailableEasings(): string[] {\n return Object.keys(easing)\n}\n\n// 이징 함수 유효성 검사\nexport function isEasingFunction(value: any): value is EasingFunction {\n return typeof value === 'function'\n}\n\n// 이징 프리셋\nexport const easingPresets = {\n default: 'easeOut',\n smooth: 'easeInOutCubic',\n fast: 'easeOutQuad',\n slow: 'easeInOutSine',\n bouncy: 'easeOutBounce',\n elastic: 'easeOutElastic',\n fade: 'easeInOut',\n scale: 'easeOutBack'\n} as const\n\n// 프리셋에서 이징 함수 가져오기\nexport function getPresetEasing(preset: keyof typeof easingPresets): EasingFunction {\n const easingName = easingPresets[preset]\n return getEasing(easingName)\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'\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 {\n from,\n to,\n mass = 1,\n stiffness = 100,\n damping = 10,\n restDelta = 0.01,\n restSpeed = 0.01,\n onComplete,\n enabled = true,\n autoStart = false\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 calculateSpring = useCallback((currentValue: number, currentVelocity: number, targetValue: number, deltaTime: number) => {\n // 스프링 힘 계산 (Hooke's Law)\n const displacement = currentValue - targetValue\n const springForce = -stiffness * displacement\n\n // 댐핑 힘 계산\n const dampingForce = -damping * currentVelocity\n\n // 총 힘\n const totalForce = springForce + dampingForce\n\n // 가속도 (F = ma)\n const acceleration = totalForce / mass\n\n // 새로운 속도\n const newVelocity = currentVelocity + acceleration * deltaTime\n\n // 새로운 위치\n const newValue = currentValue + newVelocity * deltaTime\n\n return { value: newValue, velocity: newVelocity }\n }, [mass, stiffness, damping])\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 )\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, calculateSpring])\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'\n\nexport function useHoverMotion<T extends MotionElement = HTMLDivElement>(\n options: HoverMotionOptions = {}\n): BaseMotionReturn<T> & { isHovered: boolean } {\n const {\n duration = 200,\n easing = 'ease-out',\n hoverScale = 1.05,\n hoverY = -2,\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'\n\nexport function useScrollReveal<T extends MotionElement = HTMLDivElement>(\n options: ScrollRevealOptions = {}\n): BaseMotionReturn<T> {\n const {\n threshold = 0.1,\n rootMargin = '0px',\n triggerOnce = true,\n delay = 0,\n duration = 700,\n easing = 'ease-out',\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 const observer = new IntersectionObserver(observerCallback, {\n threshold,\n rootMargin\n })\n\n observer.observe(ref.current)\n\n return () => {\n observer.disconnect()\n }\n }, [observerCallback, threshold, rootMargin])\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(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, motionType, duration, easing])\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","import { useState, useEffect } from 'react'\n\ninterface ScrollProgressOptions {\n target?: number // 전체 스크롤 목표 (기본값: document 전체 높이)\n offset?: number // 시작 오프셋\n showOnMount?: boolean\n}\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\n // 하이드레이션 이슈 해결을 위한 mounted 상태 관리\n useEffect(() => {\n setMounted(true)\n }, [])\n\n useEffect(() => {\n if (!mounted) return\n\n const calculateProgress = () => {\n if (typeof window !== 'undefined') {\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 progressPercent = Math.min(100, Math.max(0, (adjustedScrollTop / scrollHeight) * 100))\n setProgress(progressPercent)\n }\n }\n\n // 초기 상태 확인\n calculateProgress()\n\n // 이벤트 리스너 등록\n window.addEventListener(\"scroll\", calculateProgress, { passive: true })\n window.addEventListener(\"resize\", calculateProgress, { passive: true })\n\n return () => {\n window.removeEventListener(\"scroll\", calculateProgress)\n window.removeEventListener(\"resize\", calculateProgress)\n }\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 let targetElapsed = 0\n if (currentDirection === 'reverse') {\n targetElapsed = ((100 - clampedProgress) / 100) * duration\n } else if (currentDirection === 'alternate') {\n // alternate의 경우 복잡하므로 단순화\n targetElapsed = (clampedProgress / 100) * duration\n } else {\n targetElapsed = (clampedProgress / 100) * duration\n }\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'\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 const observer = new IntersectionObserver(handleIntersect, {\n threshold,\n rootMargin\n })\n\n observer.observe(element)\n\n return () => {\n observer.disconnect()\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"]}
1
+ {"version":3,"sources":["../src/core/MotionEngine.ts","../src/core/TransitionEffects.ts","../src/core/PerformanceOptimizer.ts","../src/presets/index.ts","../src/hooks/useSimplePageMotion.ts","../src/managers/MotionStateManager.ts","../src/hooks/usePageMotions.ts","../src/hooks/useSmartMotion.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/utils/easing.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/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"],"names":["useState","useRef","useCallback","useEffect","opacity","translateY","translateX","scale","useMemo","easing","deltaX","deltaY","distance","velocity"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * HUA Motion Core - 의존성 제로 모션 엔진\n * \n * 순수 JavaScript로 구현된 고성능 모션 엔진\n * GPU 가속, 레이어 분리, 성능 최적화 포함\n */\n\nexport interface MotionFrame {\n progress: number // 0 ~ 1\n properties: {\n opacity?: number\n transform?: string\n scale?: number\n translateX?: number\n translateY?: number\n rotate?: number\n rotateX?: number\n rotateY?: number\n rotateZ?: number\n skewX?: number\n skewY?: number\n }\n}\n\nexport interface MotionOptions {\n duration: number\n easing: (t: number) => number\n delay?: number\n direction?: 'forward' | 'reverse' | 'alternate'\n iterations?: number\n fill?: 'none' | 'forwards' | 'backwards' | 'both'\n onStart?: () => void\n onUpdate?: (progress: number) => void\n onComplete?: () => void\n onCancel?: () => void\n}\n\nexport interface Motion {\n id: string\n element: HTMLElement\n isRunning: boolean\n isPaused: boolean\n currentProgress: number\n startTime: number\n pauseTime: number\n options: MotionOptions\n}\n\nexport class MotionEngine {\n private motions = new Map<string, Motion>()\n private isRunning = false\n private animationFrameId: number | null = null\n\n /**\n * 모션 시작\n */\n motion(\n element: HTMLElement, \n motionFrames: MotionFrame[], \n options: MotionOptions\n ): Promise<string> {\n return new Promise((resolve) => {\n const motionId = this.generateMotionId()\n \n // GPU 가속 활성화\n this.enableGPUAcceleration(element)\n \n // 레이어 분리\n this.createLayer(element)\n \n const motion: Motion = {\n id: motionId,\n element,\n isRunning: true,\n isPaused: false,\n currentProgress: 0,\n startTime: Date.now() + (options.delay || 0),\n pauseTime: 0,\n options: {\n ...options,\n onComplete: () => {\n options.onComplete?.()\n this.motions.delete(motionId)\n }\n }\n }\n\n this.motions.set(motionId, motion)\n \n if (!this.isRunning) {\n this.startAnimationLoop()\n }\n\n options.onStart?.()\n \n // motionId를 즉시 반환\n resolve(motionId)\n })\n }\n\n /**\n * 모션 중지\n */\n stop(motionId: string): void {\n const motion = this.motions.get(motionId)\n if (motion) {\n motion.isRunning = false\n motion.options.onCancel?.()\n this.motions.delete(motionId)\n }\n }\n\n /**\n * 모션 일시정지\n */\n pause(motionId: string): void {\n const motion = this.motions.get(motionId)\n if (motion && motion.isRunning && !motion.isPaused) {\n motion.isPaused = true\n motion.pauseTime = Date.now()\n }\n }\n\n /**\n * 모션 재개\n */\n resume(motionId: string): void {\n const motion = this.motions.get(motionId)\n if (motion && motion.isPaused) {\n motion.isPaused = false\n if (motion.pauseTime > 0) {\n motion.startTime += Date.now() - motion.pauseTime\n }\n }\n }\n\n /**\n * 모든 모션 중지\n */\n stopAll(): void {\n this.motions.forEach((motion) => {\n motion.isRunning = false\n motion.options.onCancel?.()\n })\n this.motions.clear()\n this.stopAnimationLoop()\n }\n\n /**\n * 모션 상태 확인\n */\n getMotion(motionId: string): Motion | undefined {\n return this.motions.get(motionId)\n }\n\n /**\n * 실행 중인 모션 수\n */\n getActiveMotionCount(): number {\n return this.motions.size\n }\n\n /**\n * 애니메이션 루프 시작\n */\n private startAnimationLoop(): void {\n if (this.isRunning) return\n \n this.isRunning = true\n this.animate()\n }\n\n /**\n * 애니메이션 루프 중지\n */\n private stopAnimationLoop(): void {\n if (this.animationFrameId) {\n cancelAnimationFrame(this.animationFrameId)\n this.animationFrameId = null\n }\n this.isRunning = false\n }\n\n /**\n * 메인 애니메이션 루프\n */\n private animate(): void {\n if (!this.isRunning || this.motions.size === 0) {\n this.stopAnimationLoop()\n return\n }\n\n const currentTime = Date.now()\n const completedMotions: string[] = []\n\n this.motions.forEach((motion) => {\n if (!motion.isRunning || motion.isPaused) return\n\n const elapsed = currentTime - motion.startTime\n if (elapsed < 0) return // 아직 시작하지 않음\n\n const progress = Math.min(elapsed / motion.options.duration, 1)\n const easedProgress = motion.options.easing(progress)\n \n motion.currentProgress = easedProgress\n \n // 모션 프레임 적용\n this.applyMotionFrame(motion.element, easedProgress)\n \n // 콜백 호출\n motion.options.onUpdate?.(easedProgress)\n \n // 완료된 모션 체크\n if (progress >= 1) {\n completedMotions.push(motion.id)\n motion.isRunning = false\n motion.options.onComplete?.()\n }\n })\n\n // 완료된 모션 제거\n completedMotions.forEach(id => this.motions.delete(id))\n\n // 다음 프레임 요청\n this.animationFrameId = requestAnimationFrame(() => this.animate())\n }\n\n /**\n * 모션 프레임 적용\n */\n private applyMotionFrame(element: HTMLElement, progress: number): void {\n // GPU 가속을 위한 transform 사용\n const transforms: string[] = []\n \n // 기본 transform 속성들\n if (element.style.transform) {\n transforms.push(element.style.transform)\n }\n \n // progress에 따른 transform 계산\n // 여기서는 기본적인 예시만 구현\n // 실제로는 motionFrames를 받아서 처리해야 함\n \n element.style.transform = transforms.join(' ')\n }\n\n /**\n * GPU 가속 활성화\n */\n private enableGPUAcceleration(element: HTMLElement): void {\n // will-change 속성 설정으로 GPU 가속 활성화\n element.style.willChange = 'transform, opacity'\n \n // transform3d로 강제 GPU 가속\n element.style.transform = 'translateZ(0)'\n }\n\n /**\n * 레이어 분리\n */\n private createLayer(element: HTMLElement): void {\n // 새로운 레이어 생성으로 성능 향상\n element.style.transform = 'translateZ(0)'\n element.style.backfaceVisibility = 'hidden'\n }\n\n /**\n * 고유 모션 ID 생성\n */\n private generateMotionId(): string {\n return `motion_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`\n }\n\n /**\n * 정리\n */\n destroy(): void {\n this.stopAll()\n this.stopAnimationLoop()\n }\n}\n\n// 싱글톤 인스턴스\nexport const motionEngine = new MotionEngine()\n","/**\n * HUA Motion Core - 전환 효과 시스템\n * \n * CSS Motion API를 활용한 고성능 전환 효과들\n * GPU 가속 및 레이어 분리 최적화 포함\n */\n\nimport { motionEngine, MotionOptions } from './MotionEngine'\n\nexport type TransitionType = \n | 'fade'\n | 'slide'\n | 'slide-up'\n | 'slide-down'\n | 'slide-left'\n | 'slide-right'\n | 'scale'\n | 'flip'\n | 'morph'\n | 'cube'\n | 'zoom'\n\nexport interface TransitionOptions extends Omit<MotionOptions, 'easing'> {\n type: TransitionType\n easing?: (t: number) => number // easing을 다시 추가\n distance?: number // slide 거리 (px)\n scale?: number // scale 시작/끝 값\n perspective?: number // 3D 효과를 위한 원근감\n onTransitionStart?: () => void\n onTransitionComplete?: () => void\n}\n\nexport class TransitionEffects {\n private static instance: TransitionEffects\n private activeTransitions = new Map<string, string>()\n\n static getInstance(): TransitionEffects {\n if (!TransitionEffects.instance) {\n TransitionEffects.instance = new TransitionEffects()\n }\n return TransitionEffects.instance\n }\n\n /**\n * 페이드 인/아웃 전환\n */\n async fade(\n element: HTMLElement, \n options: Omit<TransitionOptions, 'type'>\n ): Promise<void> {\n const transitionId = this.generateTransitionId()\n \n return new Promise(async (resolve) => {\n const initialOpacity = parseFloat(getComputedStyle(element).opacity) || 1\n const targetOpacity = options.direction === 'reverse' ? 0 : 1\n \n // 초기 상태 설정\n if (options.direction === 'reverse') {\n element.style.opacity = initialOpacity.toString()\n } else {\n element.style.opacity = '0'\n }\n\n // GPU 가속 활성화\n this.enableGPUAcceleration(element)\n\n const motionId = await motionEngine.motion(\n element,\n [\n { progress: 0, properties: { opacity: options.direction === 'reverse' ? initialOpacity : 0 } },\n { progress: 1, properties: { opacity: targetOpacity } }\n ],\n {\n duration: options.duration,\n easing: options.easing || this.getDefaultEasing(),\n delay: options.delay,\n onStart: options.onTransitionStart,\n onUpdate: (progress) => {\n const currentOpacity = options.direction === 'reverse' \n ? initialOpacity * (1 - progress)\n : targetOpacity * progress\n element.style.opacity = currentOpacity.toString()\n },\n onComplete: () => {\n options.onTransitionComplete?.()\n this.activeTransitions.delete(transitionId)\n resolve()\n }\n }\n )\n\n this.activeTransitions.set(transitionId, motionId)\n })\n }\n\n /**\n * 슬라이드 전환\n */\n async slide(\n element: HTMLElement, \n options: Omit<TransitionOptions, 'type'>\n ): Promise<void> {\n const transitionId = this.generateTransitionId()\n const distance = options.distance || 100\n \n return new Promise(async (resolve) => {\n const initialTransform = getComputedStyle(element).transform\n const isReverse = options.direction === 'reverse'\n \n // 초기 위치 설정\n if (!isReverse) {\n element.style.transform = `translateX(${distance}px)`\n }\n\n // GPU 가속 활성화\n this.enableGPUAcceleration(element)\n\n const motionId = await motionEngine.motion(\n element,\n [\n { progress: 0, properties: { translateX: isReverse ? 0 : distance } },\n { progress: 1, properties: { translateX: isReverse ? distance : 0 } }\n ],\n {\n duration: options.duration,\n easing: options.easing || this.getDefaultEasing(),\n delay: options.delay,\n onStart: options.onTransitionStart,\n onUpdate: (progress) => {\n const currentTranslateX = isReverse \n ? distance * progress\n : distance * (1 - progress)\n element.style.transform = `translateX(${currentTranslateX}px)`\n },\n onComplete: () => {\n element.style.transform = initialTransform\n options.onTransitionComplete?.()\n this.activeTransitions.delete(transitionId)\n resolve()\n }\n }\n )\n\n this.activeTransitions.set(transitionId, motionId)\n })\n }\n\n /**\n * 스케일 전환\n */\n async scale(\n element: HTMLElement, \n options: Omit<TransitionOptions, 'type'>\n ): Promise<void> {\n const transitionId = this.generateTransitionId()\n const scaleValue = options.scale || 0.8\n \n return new Promise(async (resolve) => {\n const initialTransform = getComputedStyle(element).transform\n const isReverse = options.direction === 'reverse'\n \n // 초기 스케일 설정\n if (!isReverse) {\n element.style.transform = `scale(${scaleValue})`\n }\n\n // GPU 가속 활성화\n this.enableGPUAcceleration(element)\n\n const motionId = await motionEngine.motion(\n element,\n [\n { progress: 0, properties: { scale: isReverse ? 1 : scaleValue } },\n { progress: 1, properties: { scale: isReverse ? scaleValue : 1 } }\n ],\n {\n duration: options.duration,\n easing: options.easing || this.getDefaultEasing(),\n delay: options.delay,\n onStart: options.onTransitionStart,\n onUpdate: (progress) => {\n const currentScale = isReverse \n ? 1 - (1 - scaleValue) * progress\n : scaleValue + (1 - scaleValue) * progress\n element.style.transform = `scale(${currentScale})`\n },\n onComplete: () => {\n element.style.transform = initialTransform\n options.onTransitionComplete?.()\n this.activeTransitions.delete(transitionId)\n resolve()\n }\n }\n )\n\n this.activeTransitions.set(transitionId, motionId)\n })\n }\n\n /**\n * 플립 전환 (3D 회전)\n */\n async flip(\n element: HTMLElement, \n options: Omit<TransitionOptions, 'type'>\n ): Promise<void> {\n const transitionId = this.generateTransitionId()\n const perspective = options.perspective || 1000\n \n return new Promise(async (resolve) => {\n const initialTransform = getComputedStyle(element).transform\n const isReverse = options.direction === 'reverse'\n \n // 3D 설정\n element.style.perspective = `${perspective}px`\n element.style.transformStyle = 'preserve-3d'\n \n // 초기 회전 설정\n if (!isReverse) {\n element.style.transform = `rotateY(90deg)`\n }\n\n // GPU 가속 활성화\n this.enableGPUAcceleration(element)\n\n const motionId = await motionEngine.motion(\n element,\n [\n { progress: 0, properties: { rotateY: isReverse ? 0 : 90 } },\n { progress: 1, properties: { rotateY: isReverse ? 90 : 0 } }\n ],\n {\n duration: options.duration,\n easing: options.easing || this.getDefaultEasing(),\n delay: options.delay,\n onStart: options.onTransitionStart,\n onUpdate: (progress) => {\n const currentRotateY = isReverse \n ? 90 * progress\n : 90 * (1 - progress)\n element.style.transform = `rotateY(${currentRotateY}deg)`\n },\n onComplete: () => {\n element.style.transform = initialTransform\n element.style.perspective = ''\n element.style.transformStyle = ''\n options.onTransitionComplete?.()\n this.activeTransitions.delete(transitionId)\n resolve()\n }\n }\n )\n\n this.activeTransitions.set(transitionId, motionId)\n })\n }\n\n /**\n * 큐브 전환 (3D 큐브 회전)\n */\n async cube(\n element: HTMLElement, \n options: Omit<TransitionOptions, 'type'>\n ): Promise<void> {\n const transitionId = this.generateTransitionId()\n const perspective = options.perspective || 1200\n \n return new Promise(async (resolve) => {\n const initialTransform = getComputedStyle(element).transform\n const isReverse = options.direction === 'reverse'\n \n // 3D 큐브 설정\n element.style.perspective = `${perspective}px`\n element.style.transformStyle = 'preserve-3d'\n \n // 초기 큐브 회전 설정\n if (!isReverse) {\n element.style.transform = `rotateX(90deg) rotateY(45deg)`\n }\n\n // GPU 가속 활성화\n this.enableGPUAcceleration(element)\n\n const motionId = await motionEngine.motion(\n element,\n [\n { progress: 0, properties: { rotateX: isReverse ? 0 : 90, rotateY: isReverse ? 0 : 45 } },\n { progress: 1, properties: { rotateX: isReverse ? 90 : 0, rotateY: isReverse ? 45 : 0 } }\n ],\n {\n duration: options.duration,\n easing: options.easing || this.getDefaultEasing(),\n delay: options.delay,\n onStart: options.onTransitionStart,\n onUpdate: (progress) => {\n const currentRotateX = isReverse \n ? 90 * progress\n : 90 * (1 - progress)\n const currentRotateY = isReverse \n ? 45 * progress\n : 45 * (1 - progress)\n element.style.transform = `rotateX(${currentRotateX}deg) rotateY(${currentRotateY}deg)`\n },\n onComplete: () => {\n element.style.transform = initialTransform\n element.style.perspective = ''\n element.style.transformStyle = ''\n options.onTransitionComplete?.()\n this.activeTransitions.delete(transitionId)\n resolve()\n }\n }\n )\n\n this.activeTransitions.set(transitionId, motionId)\n })\n }\n\n /**\n * 모프 전환 (복합 변형)\n */\n async morph(\n element: HTMLElement, \n options: Omit<TransitionOptions, 'type'>\n ): Promise<void> {\n const transitionId = this.generateTransitionId()\n \n return new Promise(async (resolve) => {\n const initialTransform = getComputedStyle(element).transform\n const isReverse = options.direction === 'reverse'\n \n // 초기 모프 상태 설정\n if (!isReverse) {\n element.style.transform = `scale(0.9) rotate(5deg)`\n }\n\n // GPU 가속 활성화\n this.enableGPUAcceleration(element)\n\n const motionId = await motionEngine.motion(\n element,\n [\n { progress: 0, properties: { scale: isReverse ? 1 : 0.9, rotate: isReverse ? 0 : 5 } },\n { progress: 1, properties: { scale: isReverse ? 0.9 : 1, rotate: isReverse ? 5 : 0 } }\n ],\n {\n duration: options.duration,\n easing: options.easing || this.getDefaultEasing(),\n delay: options.delay,\n onStart: options.onTransitionStart,\n onUpdate: (progress) => {\n const currentScale = isReverse \n ? 1 - 0.1 * progress\n : 0.9 + 0.1 * progress\n const currentRotate = isReverse \n ? 5 * progress\n : 5 * (1 - progress)\n element.style.transform = `scale(${currentScale}) rotate(${currentRotate}deg)`\n },\n onComplete: () => {\n element.style.transform = initialTransform\n options.onTransitionComplete?.()\n this.activeTransitions.delete(transitionId)\n resolve()\n }\n }\n )\n\n this.activeTransitions.set(transitionId, motionId)\n })\n }\n\n /**\n * 전환 중지\n */\n stopTransition(transitionId: string): void {\n const motionId = this.activeTransitions.get(transitionId)\n if (motionId) {\n motionEngine.stop(motionId)\n this.activeTransitions.delete(transitionId)\n }\n }\n\n /**\n * 모든 전환 중지\n */\n stopAllTransitions(): void {\n this.activeTransitions.forEach((motionId) => {\n motionEngine.stop(motionId)\n })\n this.activeTransitions.clear()\n }\n\n /**\n * 활성 전환 수 확인\n */\n getActiveTransitionCount(): number {\n return this.activeTransitions.size\n }\n\n /**\n * GPU 가속 활성화\n */\n private enableGPUAcceleration(element: HTMLElement): void {\n element.style.willChange = 'transform, opacity'\n // Preserve existing transform and append translateZ(0) for GPU acceleration\n const currentTransform = element.style.transform\n if (currentTransform && currentTransform !== 'none' && currentTransform !== '') {\n // Only append if translateZ is not already present\n if (!currentTransform.includes('translateZ')) {\n element.style.transform = `${currentTransform} translateZ(0)`\n }\n } else {\n element.style.transform = 'translateZ(0)'\n }\n }\n\n /**\n * 기본 이징 함수\n */\n private getDefaultEasing(): (t: number) => number {\n return (t: number) => t * t * (3 - 2 * t) // smooth easing\n }\n\n /**\n * 고유 전환 ID 생성\n */\n private generateTransitionId(): string {\n return `transition_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`\n }\n\n /**\n * 정리\n */\n destroy(): void {\n this.stopAllTransitions()\n }\n}\n\n// 싱글톤 인스턴스\nexport const transitionEffects = TransitionEffects.getInstance()\n","/**\n * HUA Motion Core - 성능 최적화 시스템\n * \n * GPU 가속, 레이어 관리, 메모리 최적화를 위한 유틸리티들\n * 브라우저별 최적화 전략 포함\n */\n\nexport interface PerformanceOptimizerMetrics {\n fps: number\n memoryUsage?: number\n gpuTime?: number\n cpuTime?: number\n layerCount: number\n activeMotions: number\n}\n\nexport interface OptimizationConfig {\n enableGPUAcceleration: boolean\n enableLayerSeparation: boolean\n enableMemoryOptimization: boolean\n targetFPS: number\n maxLayerCount: number\n memoryThreshold: number\n}\n\nexport class PerformanceOptimizer {\n private static instance: PerformanceOptimizer\n private config: OptimizationConfig\n private performanceObserver: PerformanceObserver | null = null\n private metrics: PerformanceOptimizerMetrics\n private layerRegistry = new Set<HTMLElement>()\n private isMonitoring = false\n\n constructor() {\n this.config = {\n enableGPUAcceleration: true,\n enableLayerSeparation: true,\n enableMemoryOptimization: true,\n targetFPS: 60,\n maxLayerCount: 100,\n memoryThreshold: 50 * 1024 * 1024 // 50MB\n }\n\n this.metrics = {\n fps: 0,\n layerCount: 0,\n activeMotions: 0\n }\n\n this.initializePerformanceMonitoring()\n }\n\n static getInstance(): PerformanceOptimizer {\n if (!PerformanceOptimizer.instance) {\n PerformanceOptimizer.instance = new PerformanceOptimizer()\n }\n return PerformanceOptimizer.instance\n }\n\n /**\n * 성능 모니터링 초기화\n */\n private initializePerformanceMonitoring(): void {\n if (typeof PerformanceObserver !== 'undefined') {\n try {\n this.performanceObserver = new PerformanceObserver((list) => {\n const entries = list.getEntries()\n this.updatePerformanceMetrics(entries)\n })\n \n this.performanceObserver.observe({ entryTypes: ['measure', 'navigation'] })\n } catch (error) {\n if (process.env.NODE_ENV === 'development') {\n console.warn('Performance monitoring not supported:', error)\n }\n }\n }\n }\n\n /**\n * 성능 메트릭 업데이트\n */\n private updatePerformanceMetrics(entries: PerformanceEntry[]): void {\n entries.forEach(entry => {\n if (entry.entryType === 'measure') {\n // FPS 계산\n this.calculateFPS()\n }\n })\n }\n\n /**\n * FPS 계산\n */\n private calculateFPS(): void {\n const now = performance.now()\n const deltaTime = now - (this.lastFrameTime || now)\n this.lastFrameTime = now\n \n if (deltaTime > 0) {\n this.metrics.fps = Math.round(1000 / deltaTime)\n }\n }\n\n /**\n * GPU 가속 활성화\n */\n enableGPUAcceleration(element: HTMLElement): void {\n if (!this.config.enableGPUAcceleration) return\n\n try {\n // will-change 속성으로 GPU 가속 힌트 제공\n element.style.willChange = 'transform, opacity'\n \n // transform3d로 강제 GPU 가속\n element.style.transform = 'translateZ(0)'\n \n // 하드웨어 가속을 위한 추가 속성들\n element.style.backfaceVisibility = 'hidden'\n element.style.transformStyle = 'preserve-3d'\n \n // 레이어 등록\n this.registerLayer(element)\n \n } catch (error) {\n if (process.env.NODE_ENV === 'development') {\n console.warn('GPU acceleration failed:', error)\n }\n }\n }\n\n /**\n * 레이어 분리 및 최적화\n */\n createOptimizedLayer(element: HTMLElement): void {\n if (!this.config.enableLayerSeparation) return\n\n try {\n // 새로운 레이어 생성\n element.style.transform = 'translateZ(0)'\n element.style.backfaceVisibility = 'hidden'\n element.style.perspective = '1000px'\n \n // 레이어 등록\n this.registerLayer(element)\n \n // 레이어 수 제한 체크\n this.checkLayerLimit()\n \n } catch (error) {\n if (process.env.NODE_ENV === 'development') {\n console.warn('Layer optimization failed:', error)\n }\n }\n }\n\n /**\n * 레이어 등록\n */\n private registerLayer(element: HTMLElement): void {\n if (this.layerRegistry.has(element)) return\n \n this.layerRegistry.add(element)\n this.metrics.layerCount = this.layerRegistry.size\n \n // 메모리 사용량 체크\n this.checkMemoryUsage()\n }\n\n /**\n * 레이어 제거\n */\n removeLayer(element: HTMLElement): void {\n if (this.layerRegistry.has(element)) {\n this.layerRegistry.delete(element)\n this.metrics.layerCount = this.layerRegistry.size\n \n // GPU 가속 비활성화\n element.style.willChange = 'auto'\n element.style.transform = ''\n element.style.backfaceVisibility = ''\n element.style.transformStyle = ''\n element.style.perspective = ''\n }\n }\n\n /**\n * 레이어 수 제한 체크\n */\n private checkLayerLimit(): void {\n if (this.metrics.layerCount > this.config.maxLayerCount) {\n if (process.env.NODE_ENV === 'development') {\n console.warn(`Layer count (${this.metrics.layerCount}) exceeds limit (${this.config.maxLayerCount})`)\n }\n \n // 오래된 레이어들 정리\n this.cleanupOldLayers()\n }\n }\n\n /**\n * 오래된 레이어 정리\n */\n private cleanupOldLayers(): void {\n const layersToRemove = Array.from(this.layerRegistry).slice(0, 10)\n layersToRemove.forEach(layer => {\n this.removeLayer(layer)\n })\n }\n\n /**\n * 메모리 사용량 체크\n */\n private checkMemoryUsage(): void {\n if (!this.config.enableMemoryOptimization) return\n\n // Memory API 지원 여부 체크\n if ('memory' in performance) {\n const memory = (performance as any).memory\n this.metrics.memoryUsage = memory.usedJSHeapSize\n \n if (memory.usedJSHeapSize > this.config.memoryThreshold) {\n if (process.env.NODE_ENV === 'development') {\n console.warn('Memory usage high, cleaning up...')\n }\n this.cleanupMemory()\n }\n }\n }\n\n /**\n * 메모리 정리\n */\n private cleanupMemory(): void {\n // 가비지 컬렉션 힌트\n if ('gc' in window) {\n try {\n (window as any).gc()\n } catch (error) {\n // gc() 호출 실패 시 무시\n }\n }\n \n // 불필요한 레이어 정리\n this.cleanupOldLayers()\n }\n\n /**\n * 성능 최적화 설정 업데이트\n */\n updateConfig(newConfig: Partial<OptimizationConfig>): void {\n this.config = { ...this.config, ...newConfig }\n \n // 설정 변경에 따른 즉시 적용\n if (!this.config.enableGPUAcceleration) {\n this.disableAllGPUAcceleration()\n }\n \n if (!this.config.enableLayerSeparation) {\n this.disableAllLayers()\n }\n }\n\n /**\n * 모든 GPU 가속 비활성화\n */\n private disableAllGPUAcceleration(): void {\n this.layerRegistry.forEach(element => {\n element.style.willChange = 'auto'\n element.style.transform = ''\n })\n }\n\n /**\n * 모든 레이어 비활성화\n */\n private disableAllLayers(): void {\n this.layerRegistry.forEach(element => {\n this.removeLayer(element)\n })\n }\n\n /**\n * 성능 메트릭 가져오기\n */\n getMetrics(): PerformanceOptimizerMetrics {\n return { ...this.metrics }\n }\n\n /**\n * 성능 모니터링 시작\n */\n startMonitoring(): void {\n if (this.isMonitoring) return\n \n this.isMonitoring = true\n this.monitoringInterval = setInterval(() => {\n this.updateMetrics()\n }, 1000) // 1초마다 업데이트\n }\n\n /**\n * 성능 모니터링 중지\n */\n stopMonitoring(): void {\n if (!this.isMonitoring) return\n \n this.isMonitoring = false\n if (this.monitoringInterval) {\n clearInterval(this.monitoringInterval)\n this.monitoringInterval = undefined\n }\n }\n\n /**\n * 메트릭 업데이트\n */\n private updateMetrics(): void {\n // 메모리 사용량 업데이트\n if ('memory' in performance) {\n const memory = (performance as any).memory\n this.metrics.memoryUsage = memory.usedJSHeapSize\n }\n \n // 레이어 수 업데이트\n this.metrics.layerCount = this.layerRegistry.size\n }\n\n /**\n * 성능 리포트 생성\n */\n generateReport(): string {\n const metrics = this.getMetrics()\n \n return `\n=== HUA Motion Performance Report ===\nFPS: ${metrics.fps}\nActive Layers: ${metrics.layerCount}\nMemory Usage: ${this.formatBytes(metrics.memoryUsage || 0)}\nActive Motions: ${metrics.activeMotions}\nGPU Acceleration: ${this.config.enableGPUAcceleration ? 'Enabled' : 'Disabled'}\nLayer Separation: ${this.config.enableLayerSeparation ? 'Enabled' : 'Disabled'}\nMemory Optimization: ${this.config.enableMemoryOptimization ? 'Enabled' : 'Disabled'}\n=====================================\n `.trim()\n }\n\n /**\n * 바이트 단위 포맷팅\n */\n private formatBytes(bytes: number): string {\n if (bytes === 0) return '0 B'\n \n const k = 1024\n const sizes = ['B', 'KB', 'MB', 'GB']\n const i = Math.floor(Math.log(bytes) / Math.log(k))\n \n return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i]\n }\n\n /**\n * 성능 최적화 권장사항\n */\n getOptimizationRecommendations(): string[] {\n const recommendations: string[] = []\n const metrics = this.getMetrics()\n \n if (metrics.fps < this.config.targetFPS) {\n recommendations.push('FPS가 낮습니다. GPU 가속을 활성화하거나 레이어 수를 줄이세요.')\n }\n \n if (metrics.layerCount > this.config.maxLayerCount * 0.8) {\n recommendations.push('레이어 수가 많습니다. 불필요한 레이어를 정리하세요.')\n }\n \n if (metrics.memoryUsage && metrics.memoryUsage > this.config.memoryThreshold * 0.8) {\n recommendations.push('메모리 사용량이 높습니다. 메모리 정리를 고려하세요.')\n }\n \n return recommendations\n }\n\n /**\n * 정리\n */\n destroy(): void {\n this.stopMonitoring()\n \n if (this.performanceObserver) {\n this.performanceObserver.disconnect()\n this.performanceObserver = null\n }\n \n // 모든 레이어 정리\n this.layerRegistry.forEach(element => {\n this.removeLayer(element)\n })\n \n this.layerRegistry.clear()\n }\n\n private lastFrameTime?: number\n private monitoringInterval?: NodeJS.Timeout\n}\n\n// 싱글톤 인스턴스\nexport const performanceOptimizer = PerformanceOptimizer.getInstance()\n","// ========================================\n// HUA Motion SDK - Preset System\n// ========================================\n\nimport type { MotionPreset, PresetConfig, PageType, PageMotionsConfig } from '../types'\n\n// ========================================\n// 기본 모션 프리셋\n// ========================================\n\nexport const MOTION_PRESETS: PresetConfig = {\n hero: {\n entrance: 'fadeIn',\n delay: 200,\n duration: 800,\n hover: false,\n click: false\n },\n title: {\n entrance: 'slideUp',\n delay: 400,\n duration: 700,\n hover: false,\n click: false\n },\n button: {\n entrance: 'scaleIn',\n delay: 600,\n duration: 300,\n hover: true,\n click: true\n },\n card: {\n entrance: 'slideUp',\n delay: 800,\n duration: 500,\n hover: true,\n click: false\n },\n text: {\n entrance: 'fadeIn',\n delay: 200,\n duration: 600,\n hover: false,\n click: false\n },\n image: {\n entrance: 'scaleIn',\n delay: 400,\n duration: 600,\n hover: true,\n click: false\n }\n}\n\n// ========================================\n// 페이지별 프리셋 (1단계: useSimplePageMotion)\n// ========================================\n\nexport const PAGE_MOTIONS: Record<PageType, PageMotionsConfig> = {\n // 홈페이지\n home: {\n hero: { type: 'hero' },\n title: { type: 'title' },\n description: { type: 'text' },\n cta: { type: 'button' },\n feature1: { type: 'card' },\n feature2: { type: 'card' },\n feature3: { type: 'card' }\n },\n \n // 대시보드\n dashboard: {\n header: { type: 'hero' },\n sidebar: { type: 'card', entrance: 'slideLeft' },\n main: { type: 'text', entrance: 'fadeIn' },\n card1: { type: 'card' },\n card2: { type: 'card' },\n card3: { type: 'card' },\n chart: { type: 'image' }\n },\n \n // 제품 페이지\n product: {\n hero: { type: 'hero' },\n title: { type: 'title' },\n image: { type: 'image' },\n description: { type: 'text' },\n price: { type: 'text' },\n buyButton: { type: 'button' },\n features: { type: 'card' }\n },\n \n // 블로그\n blog: {\n header: { type: 'hero' },\n title: { type: 'title' },\n content: { type: 'text' },\n sidebar: { type: 'card', entrance: 'slideRight' },\n related1: { type: 'card' },\n related2: { type: 'card' },\n related3: { type: 'card' }\n }\n}\n\n// ========================================\n// 프리셋 유틸리티 함수\n// ========================================\n\n/**\n * 프리셋과 커스텀 설정을 병합\n */\nexport function mergeWithPreset(\n preset: MotionPreset,\n custom: Partial<MotionPreset> = {}\n): MotionPreset {\n return {\n ...preset,\n ...custom\n }\n}\n\n/**\n * 페이지 타입으로 프리셋 가져오기\n */\nexport function getPagePreset(pageType: PageType): PageMotionsConfig {\n return PAGE_MOTIONS[pageType]\n}\n\n/**\n * 모션 타입으로 기본 프리셋 가져오기\n */\nexport function getMotionPreset(type: string): MotionPreset {\n return MOTION_PRESETS[type] || MOTION_PRESETS.text\n} ","// ========================================\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 let opacity = isVisible ? 1 : 0\n let translateY = isVisible ? 0 : 20\n let translateX = 0\n let 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} ","import { MotionState, MotionElement } from '../types'\n\n/**\n * MotionStateManager - 모션 상태 관리 클래스\n * \n * 상태 충돌 문제 해결을 위해 3가지 상태를 분리:\n * - internalVisibility: 내부 로직 (초기화, 리셋 등)\n * - triggeredVisibility: 외부 트리거 (Intersection Observer)\n * - finalVisibility: 최종 계산된 상태\n */\nexport class MotionStateManager {\n private states: Map<string, MotionState> = new Map()\n private listeners: Map<string, Set<(state: MotionState) => void>> = new Map()\n\n /**\n * 요소의 상태를 초기화\n */\n initializeElement(elementId: string, config: MotionElement): void {\n const initialState: MotionState = {\n internalVisibility: false, // 초기에 숨김 상태로 시작 (스크롤 리빌용)\n triggeredVisibility: false, // Intersection Observer가 아직 트리거되지 않음\n finalVisibility: false, // 초기에 숨김 상태로 시작\n opacity: 0, // 초기에 투명 상태로 시작\n translateY: 20, // 초기에 아래로 이동된 상태로 시작\n translateX: 0,\n scale: 0.95, // 초기에 약간 축소된 상태로 시작\n rotation: 0,\n isHovered: false,\n isClicked: false,\n isAnimating: false\n }\n\n this.states.set(elementId, initialState)\n this.computeFinalState(elementId)\n }\n\n /**\n * 내부 가시성 상태 업데이트 (초기화, 리셋 등)\n */\n setInternalVisibility(elementId: string, visible: boolean): void {\n const state = this.states.get(elementId)\n if (!state) return\n\n state.internalVisibility = visible\n this.computeFinalState(elementId)\n this.notifyListeners(elementId, state)\n }\n\n /**\n * 외부 트리거 가시성 상태 업데이트 (Intersection Observer)\n */\n setTriggeredVisibility(elementId: string, visible: boolean): void {\n const state = this.states.get(elementId)\n if (!state) return\n\n state.triggeredVisibility = visible\n this.computeFinalState(elementId)\n this.notifyListeners(elementId, state)\n }\n\n /**\n * 모션 값 업데이트\n */\n updateMotionValues(elementId: string, values: Partial<MotionState>): void {\n const state = this.states.get(elementId)\n if (!state) return\n\n Object.assign(state, values)\n this.notifyListeners(elementId, state)\n }\n\n /**\n * 최종 상태 계산\n */\n private computeFinalState(elementId: string): void {\n const state = this.states.get(elementId)\n if (!state) return\n\n // 내부 또는 외부 트리거 중 하나라도 true면 최종적으로 보임\n state.finalVisibility = state.internalVisibility || state.triggeredVisibility\n\n // 모션 중 상태 업데이트\n state.isAnimating = state.finalVisibility && (state.opacity < 1 || state.translateY > 0)\n }\n\n /**\n * 현재 상태 조회\n */\n getState(elementId: string): MotionState | undefined {\n return this.states.get(elementId)\n }\n\n /**\n * 모든 상태 조회\n */\n getAllStates(): Map<string, MotionState> {\n return new Map(this.states)\n }\n\n /**\n * 상태 변경 리스너 등록\n */\n subscribe(elementId: string, listener: (state: MotionState) => void): () => void {\n if (!this.listeners.has(elementId)) {\n this.listeners.set(elementId, new Set())\n }\n\n this.listeners.get(elementId)!.add(listener)\n\n // 구독 해제 함수 반환\n return () => {\n const listeners = this.listeners.get(elementId)\n if (listeners) {\n listeners.delete(listener)\n }\n }\n }\n\n /**\n * 리스너들에게 상태 변경 알림\n */\n notifyListeners(elementId: string, state: MotionState): void {\n const listeners = this.listeners.get(elementId)\n if (!listeners) return\n\n listeners.forEach(listener => {\n try {\n listener(state)\n } catch (error) {\n if (process.env.NODE_ENV === 'development') {\n console.error(`MotionStateManager listener error for ${elementId}:`, error)\n }\n }\n })\n }\n\n /**\n * 모든 상태 초기화\n */\n reset(): void {\n this.states.clear()\n this.listeners.clear()\n }\n\n /**\n * 특정 요소 상태 초기화\n */\n resetElement(elementId: string): void {\n this.states.delete(elementId)\n this.listeners.delete(elementId)\n }\n\n /**\n * 디버그용 상태 출력\n */\n debug(): void {\n if (process.env.NODE_ENV === 'development') {\n console.log('MotionStateManager Debug:')\n this.states.forEach((state, elementId) => {\n console.log(` ${elementId}:`, {\n internalVisibility: state.internalVisibility,\n triggeredVisibility: state.triggeredVisibility,\n finalVisibility: state.finalVisibility,\n opacity: state.opacity,\n translateY: state.translateY,\n isAnimating: state.isAnimating\n })\n })\n }\n }\n}\n\n// 싱글톤 인스턴스\nexport const motionStateManager = new MotionStateManager()\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 let 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 * @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'\n\nexport interface UseUnifiedMotionOptions extends Omit<BaseMotionOptions, 'autoStart'> {\n /** Motion type to use */\n type: EntranceType\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\nexport function useUnifiedMotion<T extends MotionElement = HTMLDivElement>(\n options: UseUnifiedMotionOptions\n): BaseMotionReturn<T> {\n const {\n type,\n duration = 600,\n autoStart = true,\n delay = 0,\n easing,\n threshold = 0.1,\n triggerOnce = true,\n distance = 50,\n onComplete,\n onStart,\n onStop,\n onReset\n } = options\n\n const resolvedEasing = getEasingForType(type, 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 observerRef = useRef<IntersectionObserver | null>(null)\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로 자동 시작\n useEffect(() => {\n if (!ref.current || !autoStart) return\n\n observerRef.current = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n if (entry.isIntersecting) {\n startRef.current()\n if (triggerOnce) {\n observerRef.current?.disconnect()\n }\n }\n })\n },\n { threshold }\n )\n\n observerRef.current.observe(ref.current)\n\n return () => {\n observerRef.current?.disconnect()\n }\n }, [autoStart, threshold, triggerOnce])\n\n useEffect(() => {\n return () => stop()\n }, [stop])\n\n // type에 맞는 스타일을 CSS transition으로 처리\n const style = useMemo(() => {\n const base = isVisible ? getVisibleStyle() : getInitialStyle(type, 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, distance, duration, resolvedEasing, delay, progress])\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'\n\nexport function useFadeIn<T extends MotionElement = HTMLDivElement>(\n options: FadeInOptions = {}\n): BaseMotionReturn<T> {\n const {\n delay = 0,\n duration = 700,\n threshold = 0.1,\n triggerOnce = true,\n easing = 'ease-out',\n autoStart = true,\n initialOpacity = 0,\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 observerRef = useRef<IntersectionObserver | null>(null)\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 설정\n useEffect(() => {\n if (!ref.current || !autoStart) return\n\n observerRef.current = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n if (entry.isIntersecting) {\n startRef.current()\n if (triggerOnce) {\n observerRef.current?.disconnect()\n }\n }\n })\n },\n { threshold }\n )\n\n observerRef.current.observe(ref.current)\n\n return () => {\n if (observerRef.current) {\n observerRef.current.disconnect()\n }\n }\n }, [autoStart, threshold, triggerOnce, nodeReady])\n\n // 자동 시작이 비활성화된 경우 수동 시작\n useEffect(() => {\n if (!autoStart) {\n start()\n }\n }, [autoStart, start])\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'\n\nexport function useSlideUp<T extends MotionElement = HTMLDivElement>(\n options: SlideOptions = {}\n): BaseMotionReturn<T> {\n const {\n delay = 0,\n duration = 700,\n threshold = 0.1,\n triggerOnce = true,\n easing = 'ease-out',\n autoStart = true,\n direction = 'up',\n distance = 50,\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 observerRef = useRef<IntersectionObserver | 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 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 설정\n useEffect(() => {\n if (!ref.current || !autoStart) return\n\n observerRef.current = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n if (entry.isIntersecting) {\n startRef.current()\n if (triggerOnce) {\n observerRef.current?.disconnect()\n }\n }\n })\n },\n { threshold }\n )\n\n observerRef.current.observe(ref.current)\n\n return () => {\n if (observerRef.current) {\n observerRef.current.disconnect()\n }\n }\n }, [autoStart, threshold, triggerOnce, nodeReady])\n\n // 자동 시작이 비활성화된 경우 수동 시작\n useEffect(() => {\n if (!autoStart) {\n start()\n }\n }, [autoStart, start])\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'\n\nexport function useScaleIn<T extends MotionElement = HTMLDivElement>(\n options: ScaleOptions = {}\n): BaseMotionReturn<T> {\n const {\n initialScale = 0,\n targetScale = 1,\n duration = 700,\n delay = 0,\n autoStart = true,\n easing = 'ease-out',\n threshold = 0.1,\n triggerOnce = true,\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 observerRef = useRef<IntersectionObserver | null>(null)\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 설정\n useEffect(() => {\n if (!ref.current || !autoStart) return\n\n observerRef.current = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n if (entry.isIntersecting) {\n startRef.current()\n if (triggerOnce) {\n observerRef.current?.disconnect()\n }\n }\n })\n },\n { threshold }\n )\n\n observerRef.current.observe(ref.current)\n\n return () => {\n if (observerRef.current) {\n observerRef.current.disconnect()\n }\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'\n\nexport function useBounceIn<T extends MotionElement = HTMLDivElement>(\n options: BounceOptions = {}\n): BaseMotionReturn<T> {\n const {\n duration = 600,\n delay = 0,\n autoStart = true,\n intensity = 0.3,\n threshold = 0.1,\n triggerOnce = true,\n easing = 'cubic-bezier(0.34, 1.56, 0.64, 1)', // 바운스 이징\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 observerRef = useRef<IntersectionObserver | null>(null)\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 설정 (useFadeIn과 동일 패턴)\n useEffect(() => {\n if (!ref.current || !autoStart) return\n\n observerRef.current = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n if (entry.isIntersecting) {\n startRef.current()\n if (triggerOnce) {\n observerRef.current?.disconnect()\n }\n }\n })\n },\n { threshold }\n )\n\n observerRef.current.observe(ref.current)\n\n return () => {\n if (observerRef.current) {\n observerRef.current.disconnect()\n }\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","// 고급 이징 함수들 - Framer Motion과 유사한 기능 제공\n\nexport type EasingFunction = (t: number) => number\n\n// 기본 이징 함수들\nexport const linear: EasingFunction = (t) => t\n\nexport const easeIn: EasingFunction = (t) => t * t\nexport const easeOut: EasingFunction = (t) => 1 - (1 - t) * (1 - t)\nexport const easeInOut: EasingFunction = (t) => t < 0.5 ? 2 * t * t : 1 - Math.pow(-2 * t + 2, 2) / 2\n\n// 고급 이징 함수들\nexport const easeInQuad: EasingFunction = (t) => t * t\nexport const easeOutQuad: EasingFunction = (t) => 1 - (1 - t) * (1 - t)\nexport const easeInOutQuad: EasingFunction = (t) => t < 0.5 ? 2 * t * t : 1 - Math.pow(-2 * t + 2, 2) / 2\n\nexport const easeInCubic: EasingFunction = (t) => t * t * t\nexport const easeOutCubic: EasingFunction = (t) => 1 - Math.pow(1 - t, 3)\nexport const easeInOutCubic: EasingFunction = (t) => t < 0.5 ? 4 * t * t * t : 1 - Math.pow(-2 * t + 2, 3) / 2\n\nexport const easeInQuart: EasingFunction = (t) => t * t * t * t\nexport const easeOutQuart: EasingFunction = (t) => 1 - Math.pow(1 - t, 4)\nexport const easeInOutQuart: EasingFunction = (t) => t < 0.5 ? 8 * t * t * t * t : 1 - Math.pow(-2 * t + 2, 4) / 2\n\nexport const easeInQuint: EasingFunction = (t) => t * t * t * t * t\nexport const easeOutQuint: EasingFunction = (t) => 1 - Math.pow(1 - t, 5)\nexport const easeInOutQuint: EasingFunction = (t) => t < 0.5 ? 16 * t * t * t * t * t : 1 - Math.pow(-2 * t + 2, 5) / 2\n\nexport const easeInSine: EasingFunction = (t) => 1 - Math.cos((t * Math.PI) / 2)\nexport const easeOutSine: EasingFunction = (t) => Math.sin((t * Math.PI) / 2)\nexport const easeInOutSine: EasingFunction = (t) => -(Math.cos(Math.PI * t) - 1) / 2\n\nexport const easeInExpo: EasingFunction = (t) => t === 0 ? 0 : Math.pow(2, 10 * t - 10)\nexport const easeOutExpo: EasingFunction = (t) => t === 1 ? 1 : 1 - Math.pow(2, -10 * t)\nexport const easeInOutExpo: EasingFunction = (t) => {\n if (t === 0) return 0\n if (t === 1) return 1\n if (t < 0.5) return Math.pow(2, 20 * t - 10) / 2\n return (2 - Math.pow(2, -20 * t + 10)) / 2\n}\n\nexport const easeInCirc: EasingFunction = (t) => 1 - Math.sqrt(1 - Math.pow(t, 2))\nexport const easeOutCirc: EasingFunction = (t) => Math.sqrt(1 - Math.pow(t - 1, 2))\nexport const easeInOutCirc: EasingFunction = (t) => {\n if (t < 0.5) return (1 - Math.sqrt(1 - Math.pow(2 * t, 2))) / 2\n return (Math.sqrt(1 - Math.pow(-2 * t + 2, 2)) + 1) / 2\n}\n\nexport const easeInBounce: EasingFunction = (t) => 1 - easeOutBounce(1 - t)\nexport const easeOutBounce: EasingFunction = (t) => {\n const n1 = 7.5625\n const d1 = 2.75\n\n if (t < 1 / d1) {\n return n1 * t * t\n } else if (t < 2 / d1) {\n return n1 * (t -= 1.5 / d1) * t + 0.75\n } else if (t < 2.5 / d1) {\n return n1 * (t -= 2.25 / d1) * t + 0.9375\n } else {\n return n1 * (t -= 2.625 / d1) * t + 0.984375\n }\n}\nexport const easeInOutBounce: EasingFunction = (t) => {\n if (t < 0.5) return (1 - easeOutBounce(1 - 2 * t)) / 2\n return (1 + easeOutBounce(2 * t - 1)) / 2\n}\n\nexport const easeInBack: EasingFunction = (t) => {\n const c1 = 1.70158\n const c3 = c1 + 1\n return c3 * t * t * t - c1 * t * t\n}\nexport const easeOutBack: EasingFunction = (t) => {\n const c1 = 1.70158\n const c3 = c1 + 1\n return 1 + c3 * Math.pow(t - 1, 3) + c1 * Math.pow(t - 1, 2)\n}\nexport const easeInOutBack: EasingFunction = (t) => {\n const c1 = 1.70158\n const c2 = c1 * 1.525\n if (t < 0.5) {\n return (Math.pow(2 * t, 2) * ((c2 + 1) * 2 * t - c2)) / 2\n } else {\n return (Math.pow(2 * t - 2, 2) * ((c2 + 1) * (t * 2 - 2) + c2) + 2) / 2\n }\n}\n\nexport const easeInElastic: EasingFunction = (t) => {\n const c4 = (2 * Math.PI) / 3\n if (t === 0) return 0\n if (t === 1) return 1\n return -Math.pow(2, 10 * t - 10) * Math.sin((t * 10 - 0.75) * c4)\n}\nexport const easeOutElastic: EasingFunction = (t) => {\n const c4 = (2 * Math.PI) / 3\n if (t === 0) return 0\n if (t === 1) return 1\n return Math.pow(2, -10 * t) * Math.sin((t * 10 - 0.75) * c4) + 1\n}\nexport const easeInOutElastic: EasingFunction = (t) => {\n const c5 = (2 * Math.PI) / 4.5\n if (t === 0) return 0\n if (t === 1) return 1\n if (t < 0.5) {\n return -(Math.pow(2, 20 * t - 10) * Math.sin((20 * t - 11.125) * c5)) / 2\n } else {\n return (Math.pow(2, -20 * t + 10) * Math.sin((20 * t - 11.125) * c5)) / 2 + 1\n }\n}\n\n// 특수 효과 이징 함수들\nexport const pulse: EasingFunction = (t) => Math.sin(t * Math.PI) * 0.5 + 0.5\nexport const pulseSmooth: EasingFunction = (t) => Math.sin(t * Math.PI * 2) * 0.3 + 0.7\nexport const skeletonWave: EasingFunction = (t) => Math.sin((t - 0.5) * Math.PI * 2) * 0.5 + 0.5\nexport const blink: EasingFunction = (t) => t < 0.5 ? 1 : 0\n\n// 이징 타입 정의\nexport type EasingType = \n | 'linear'\n | 'easeIn' | 'easeOut' | 'easeInOut'\n | 'easeInQuad' | 'easeOutQuad' | 'easeInOutQuad'\n | 'easeInCubic' | 'easeOutCubic' | 'easeInOutCubic'\n | 'easeInQuart' | 'easeOutQuart' | 'easeInOutQuart'\n | 'easeInQuint' | 'easeOutQuint' | 'easeInOutQuint'\n | 'easeInSine' | 'easeOutSine' | 'easeInOutSine'\n | 'easeInExpo' | 'easeOutExpo' | 'easeInOutExpo'\n | 'easeInCirc' | 'easeOutCirc' | 'easeInOutCirc'\n | 'easeInBounce' | 'easeOutBounce' | 'easeInOutBounce'\n | 'easeInBack' | 'easeOutBack' | 'easeInOutBack'\n | 'easeInElastic' | 'easeOutElastic' | 'easeInOutElastic'\n | 'pulse' | 'pulseSmooth' | 'skeletonWave' | 'blink'\n\n// 이징 함수 객체 (기존 호환성을 위해)\nexport const easing = {\n linear,\n easeIn,\n easeOut,\n easeInOut,\n easeInQuad,\n easeOutQuad,\n easeInOutQuad,\n easeInCubic,\n easeOutCubic,\n easeInOutCubic,\n easeInQuart,\n easeOutQuart,\n easeInOutQuart,\n easeInQuint,\n easeOutQuint,\n easeInOutQuint,\n easeInSine,\n easeOutSine,\n easeInOutSine,\n easeInExpo,\n easeOutExpo,\n easeInOutExpo,\n easeInCirc,\n easeOutCirc,\n easeInOutCirc,\n easeInBounce,\n easeOutBounce,\n easeInOutBounce,\n easeInBack,\n easeOutBack,\n easeInOutBack,\n easeInElastic,\n easeOutElastic,\n easeInOutElastic,\n pulse,\n pulseSmooth,\n skeletonWave,\n blink\n} as const\n\n// 이징 함수 확인 함수\nexport function isValidEasing(easingName: string): boolean {\n return easingName in easing\n}\n\n// 이징 함수 가져오기 함수\nexport function getEasing(easingName: unknown): EasingFunction {\n if (typeof easingName === 'function') {\n // 타입이 Function이지만 EasingFunction 시그니처와 일치하는지 확인\n return (easingName as EasingFunction)\n }\n\n if (typeof easingName === 'string') {\n if (easingName in easing) {\n return easing[easingName as keyof typeof easing]\n }\n\n // 'bounce'는 easeOutBounce로 매핑 (별도 이름이므로)\n if (easingName === 'bounce') {\n return easing.easeOutBounce\n }\n\n if (process.env.NODE_ENV === 'development') {\n console.warn(`[HUA Motion] Unknown easing \"${easingName}\", using default \"easeOut\".`)\n }\n }\n\n return easeOut\n}\n\n// 이징 적용 함수\nexport function applyEasing(t: number, easingName: string | EasingFunction): number {\n const easingFn = getEasing(easingName)\n return easingFn(t)\n}\n\n// 안전한 이징 적용 함수 (에러 방지)\nexport function safeApplyEasing(t: number, easingName: unknown): number {\n try {\n const easingFn = getEasing(easingName)\n return easingFn(t)\n } catch (err) {\n if (process.env.NODE_ENV === 'development') {\n console.error(`[HUA Motion] Failed to apply easing \"${easingName}\":`, err)\n }\n return easeOut(t)\n }\n}\n\n// 사용 가능한 이징 함수 목록\nexport function getAvailableEasings(): string[] {\n return Object.keys(easing)\n}\n\n// 이징 함수 유효성 검사\nexport function isEasingFunction(value: any): value is EasingFunction {\n return typeof value === 'function'\n}\n\n// 이징 프리셋\nexport const easingPresets = {\n default: 'easeOut',\n smooth: 'easeInOutCubic',\n fast: 'easeOutQuad',\n slow: 'easeInOutSine',\n bouncy: 'easeOutBounce',\n elastic: 'easeOutElastic',\n fade: 'easeInOut',\n scale: 'easeOutBack'\n} as const\n\n// 프리셋에서 이징 함수 가져오기\nexport function getPresetEasing(preset: keyof typeof easingPresets): EasingFunction {\n const easingName = easingPresets[preset]\n return getEasing(easingName)\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'\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 {\n from,\n to,\n mass = 1,\n stiffness = 100,\n damping = 10,\n restDelta = 0.01,\n restSpeed = 0.01,\n onComplete,\n enabled = true,\n autoStart = false\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 calculateSpring = useCallback((currentValue: number, currentVelocity: number, targetValue: number, deltaTime: number) => {\n // 스프링 힘 계산 (Hooke's Law)\n const displacement = currentValue - targetValue\n const springForce = -stiffness * displacement\n\n // 댐핑 힘 계산\n const dampingForce = -damping * currentVelocity\n\n // 총 힘\n const totalForce = springForce + dampingForce\n\n // 가속도 (F = ma)\n const acceleration = totalForce / mass\n\n // 새로운 속도\n const newVelocity = currentVelocity + acceleration * deltaTime\n\n // 새로운 위치\n const newValue = currentValue + newVelocity * deltaTime\n\n return { value: newValue, velocity: newVelocity }\n }, [mass, stiffness, damping])\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 )\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, calculateSpring])\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'\n\nexport function useHoverMotion<T extends MotionElement = HTMLDivElement>(\n options: HoverMotionOptions = {}\n): BaseMotionReturn<T> & { isHovered: boolean } {\n const {\n duration = 200,\n easing = 'ease-out',\n hoverScale = 1.05,\n hoverY = -2,\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'\n\nexport function useScrollReveal<T extends MotionElement = HTMLDivElement>(\n options: ScrollRevealOptions = {}\n): BaseMotionReturn<T> {\n const {\n threshold = 0.1,\n rootMargin = '0px',\n triggerOnce = true,\n delay = 0,\n duration = 700,\n easing = 'ease-out',\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 const observer = new IntersectionObserver(observerCallback, {\n threshold,\n rootMargin\n })\n\n observer.observe(ref.current)\n\n return () => {\n observer.disconnect()\n }\n }, [observerCallback, threshold, rootMargin])\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(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, motionType, duration, easing])\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","import { useState, useEffect } from 'react'\n\ninterface ScrollProgressOptions {\n target?: number // 전체 스크롤 목표 (기본값: document 전체 높이)\n offset?: number // 시작 오프셋\n showOnMount?: boolean\n}\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\n // 하이드레이션 이슈 해결을 위한 mounted 상태 관리\n useEffect(() => {\n setMounted(true)\n }, [])\n\n useEffect(() => {\n if (!mounted) return\n\n const calculateProgress = () => {\n if (typeof window !== 'undefined') {\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 progressPercent = Math.min(100, Math.max(0, (adjustedScrollTop / scrollHeight) * 100))\n setProgress(progressPercent)\n }\n }\n\n // 초기 상태 확인\n calculateProgress()\n\n // 이벤트 리스너 등록\n window.addEventListener(\"scroll\", calculateProgress, { passive: true })\n window.addEventListener(\"resize\", calculateProgress, { passive: true })\n\n return () => {\n window.removeEventListener(\"scroll\", calculateProgress)\n window.removeEventListener(\"resize\", calculateProgress)\n }\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 let targetElapsed = 0\n if (currentDirection === 'reverse') {\n targetElapsed = ((100 - clampedProgress) / 100) * duration\n } else if (currentDirection === 'alternate') {\n // alternate의 경우 복잡하므로 단순화\n targetElapsed = (clampedProgress / 100) * duration\n } else {\n targetElapsed = (clampedProgress / 100) * duration\n }\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'\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 const observer = new IntersectionObserver(handleIntersect, {\n threshold,\n rootMargin\n })\n\n observer.observe(element)\n\n return () => {\n observer.disconnect()\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"]}