@hua-labs/motion-core 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (116) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +245 -0
  3. package/dist/.tsbuildinfo +1 -0
  4. package/dist/hooks/useBounceIn.d.ts +3 -0
  5. package/dist/hooks/useBounceIn.d.ts.map +1 -0
  6. package/dist/hooks/useBounceIn.js +141 -0
  7. package/dist/hooks/useBounceIn.js.map +1 -0
  8. package/dist/hooks/useButtonEffect.d.ts +48 -0
  9. package/dist/hooks/useButtonEffect.d.ts.map +1 -0
  10. package/dist/hooks/useButtonEffect.js +311 -0
  11. package/dist/hooks/useButtonEffect.js.map +1 -0
  12. package/dist/hooks/useCardList.d.ts +23 -0
  13. package/dist/hooks/useCardList.d.ts.map +1 -0
  14. package/dist/hooks/useCardList.js +119 -0
  15. package/dist/hooks/useCardList.js.map +1 -0
  16. package/dist/hooks/useClickToggle.d.ts +15 -0
  17. package/dist/hooks/useClickToggle.d.ts.map +1 -0
  18. package/dist/hooks/useClickToggle.js +102 -0
  19. package/dist/hooks/useClickToggle.js.map +1 -0
  20. package/dist/hooks/useFadeIn.d.ts +17 -0
  21. package/dist/hooks/useFadeIn.d.ts.map +1 -0
  22. package/dist/hooks/useFadeIn.js +133 -0
  23. package/dist/hooks/useFadeIn.js.map +1 -0
  24. package/dist/hooks/useFocusToggle.d.ts +15 -0
  25. package/dist/hooks/useFocusToggle.d.ts.map +1 -0
  26. package/dist/hooks/useFocusToggle.js +99 -0
  27. package/dist/hooks/useFocusToggle.js.map +1 -0
  28. package/dist/hooks/useGradient.d.ts +25 -0
  29. package/dist/hooks/useGradient.d.ts.map +1 -0
  30. package/dist/hooks/useGradient.js +144 -0
  31. package/dist/hooks/useGradient.js.map +1 -0
  32. package/dist/hooks/useHoverMotion.d.ts +15 -0
  33. package/dist/hooks/useHoverMotion.d.ts.map +1 -0
  34. package/dist/hooks/useHoverMotion.js +99 -0
  35. package/dist/hooks/useHoverMotion.js.map +1 -0
  36. package/dist/hooks/useLoadingSpinner.d.ts +30 -0
  37. package/dist/hooks/useLoadingSpinner.d.ts.map +1 -0
  38. package/dist/hooks/useLoadingSpinner.js +283 -0
  39. package/dist/hooks/useLoadingSpinner.js.map +1 -0
  40. package/dist/hooks/useMotion.d.ts +103 -0
  41. package/dist/hooks/useMotion.d.ts.map +1 -0
  42. package/dist/hooks/useMotion.js +266 -0
  43. package/dist/hooks/useMotion.js.map +1 -0
  44. package/dist/hooks/useMotionState.d.ts +26 -0
  45. package/dist/hooks/useMotionState.d.ts.map +1 -0
  46. package/dist/hooks/useMotionState.js +119 -0
  47. package/dist/hooks/useMotionState.js.map +1 -0
  48. package/dist/hooks/useNavigation.d.ts +40 -0
  49. package/dist/hooks/useNavigation.d.ts.map +1 -0
  50. package/dist/hooks/useNavigation.js +212 -0
  51. package/dist/hooks/useNavigation.js.map +1 -0
  52. package/dist/hooks/usePulse.d.ts +3 -0
  53. package/dist/hooks/usePulse.d.ts.map +1 -0
  54. package/dist/hooks/usePulse.js +134 -0
  55. package/dist/hooks/usePulse.js.map +1 -0
  56. package/dist/hooks/useRepeat.d.ts +26 -0
  57. package/dist/hooks/useRepeat.d.ts.map +1 -0
  58. package/dist/hooks/useRepeat.js +179 -0
  59. package/dist/hooks/useRepeat.js.map +1 -0
  60. package/dist/hooks/useScaleIn.d.ts +3 -0
  61. package/dist/hooks/useScaleIn.d.ts.map +1 -0
  62. package/dist/hooks/useScaleIn.js +111 -0
  63. package/dist/hooks/useScaleIn.js.map +1 -0
  64. package/dist/hooks/useScrollProgress.d.ts +21 -0
  65. package/dist/hooks/useScrollProgress.d.ts.map +1 -0
  66. package/dist/hooks/useScrollProgress.js +139 -0
  67. package/dist/hooks/useScrollProgress.js.map +1 -0
  68. package/dist/hooks/useScrollReveal.d.ts +17 -0
  69. package/dist/hooks/useScrollReveal.d.ts.map +1 -0
  70. package/dist/hooks/useScrollReveal.js +95 -0
  71. package/dist/hooks/useScrollReveal.js.map +1 -0
  72. package/dist/hooks/useScrollToggle.d.ts +17 -0
  73. package/dist/hooks/useScrollToggle.d.ts.map +1 -0
  74. package/dist/hooks/useScrollToggle.js +119 -0
  75. package/dist/hooks/useScrollToggle.js.map +1 -0
  76. package/dist/hooks/useSkeleton.d.ts +21 -0
  77. package/dist/hooks/useSkeleton.d.ts.map +1 -0
  78. package/dist/hooks/useSkeleton.js +139 -0
  79. package/dist/hooks/useSkeleton.js.map +1 -0
  80. package/dist/hooks/useSlideDown.d.ts +25 -0
  81. package/dist/hooks/useSlideDown.d.ts.map +1 -0
  82. package/dist/hooks/useSlideDown.js +263 -0
  83. package/dist/hooks/useSlideDown.js.map +1 -0
  84. package/dist/hooks/useSlideLeft.d.ts +3 -0
  85. package/dist/hooks/useSlideLeft.d.ts.map +1 -0
  86. package/dist/hooks/useSlideLeft.js +111 -0
  87. package/dist/hooks/useSlideLeft.js.map +1 -0
  88. package/dist/hooks/useSlideRight.d.ts +3 -0
  89. package/dist/hooks/useSlideRight.d.ts.map +1 -0
  90. package/dist/hooks/useSlideRight.js +111 -0
  91. package/dist/hooks/useSlideRight.js.map +1 -0
  92. package/dist/hooks/useSlideUp.d.ts +3 -0
  93. package/dist/hooks/useSlideUp.d.ts.map +1 -0
  94. package/dist/hooks/useSlideUp.js +111 -0
  95. package/dist/hooks/useSlideUp.js.map +1 -0
  96. package/dist/hooks/useSpringMotion.d.ts +32 -0
  97. package/dist/hooks/useSpringMotion.d.ts.map +1 -0
  98. package/dist/hooks/useSpringMotion.js +185 -0
  99. package/dist/hooks/useSpringMotion.js.map +1 -0
  100. package/dist/hooks/useVisibilityToggle.d.ts +15 -0
  101. package/dist/hooks/useVisibilityToggle.d.ts.map +1 -0
  102. package/dist/hooks/useVisibilityToggle.js +106 -0
  103. package/dist/hooks/useVisibilityToggle.js.map +1 -0
  104. package/dist/index.d.ts +29 -0
  105. package/dist/index.d.ts.map +1 -0
  106. package/dist/index.js +43 -0
  107. package/dist/index.js.map +1 -0
  108. package/dist/types/index.d.ts +109 -0
  109. package/dist/types/index.d.ts.map +1 -0
  110. package/dist/types/index.js +5 -0
  111. package/dist/types/index.js.map +1 -0
  112. package/dist/utils/easing.d.ts +44 -0
  113. package/dist/utils/easing.d.ts.map +1 -0
  114. package/dist/utils/easing.js +98 -0
  115. package/dist/utils/easing.js.map +1 -0
  116. package/package.json +69 -0
@@ -0,0 +1,179 @@
1
+ import { useRef, useState, useEffect, useCallback } from 'react';
2
+ export function useRepeat(options = {}) {
3
+ const { duration = 1000, easing = 'ease-in-out', repeatCount = -1, // 기본값: 무한 반복
4
+ repeatDelay = 0, repeatDirection = 'forward', repeatMode = 'loop', autoStart = true, initialScale = 1, initialOpacity = 1, initialRotate = 0, initialTranslateY = 0, initialTranslateX = 0, targetScale = 1.2, targetOpacity = 0.8, targetRotate = 10, targetTranslateY = -10, targetTranslateX = 0, onComplete, onStart, onStop, onReset } = options;
5
+ const ref = useRef(null);
6
+ const [isVisible, setIsVisible] = useState(false);
7
+ const [isAnimating, setIsAnimating] = useState(false);
8
+ const [progress, setProgress] = useState(0);
9
+ const [currentRepeat, setCurrentRepeat] = useState(0);
10
+ const [isRepeating, setIsRepeating] = useState(false);
11
+ const [animationDirection, setAnimationDirection] = useState('forward');
12
+ // 애니메이션 루프 함수
13
+ const runAnimation = useCallback(() => {
14
+ if (!isRepeating)
15
+ return;
16
+ setIsAnimating(true);
17
+ setProgress(0);
18
+ onStart?.();
19
+ // 애니메이션 진행
20
+ const startTime = Date.now();
21
+ const animate = () => {
22
+ if (!isRepeating)
23
+ return;
24
+ const elapsed = Date.now() - startTime;
25
+ const currentProgress = Math.min(elapsed / duration, 1);
26
+ // 이징 적용
27
+ const easedProgress = currentProgress;
28
+ setProgress(easedProgress);
29
+ if (currentProgress < 1) {
30
+ requestAnimationFrame(animate);
31
+ }
32
+ else {
33
+ // 애니메이션 완료
34
+ setIsAnimating(false);
35
+ setProgress(1);
36
+ // 반복 방향 결정
37
+ let nextDirection = animationDirection;
38
+ if (repeatDirection === 'alternate') {
39
+ nextDirection = animationDirection === 'forward' ? 'reverse' : 'forward';
40
+ setAnimationDirection(nextDirection);
41
+ }
42
+ // 반복 카운트 증가
43
+ const nextRepeat = currentRepeat + 1;
44
+ setCurrentRepeat(nextRepeat);
45
+ // 반복 조건 확인
46
+ if (repeatCount === -1 || nextRepeat < repeatCount) {
47
+ // 지연 후 다음 반복
48
+ setTimeout(() => {
49
+ if (isRepeating) {
50
+ runAnimation();
51
+ }
52
+ }, repeatDelay);
53
+ }
54
+ else {
55
+ // 반복 완료
56
+ setIsRepeating(false);
57
+ onComplete?.();
58
+ }
59
+ }
60
+ };
61
+ requestAnimationFrame(animate);
62
+ }, [isRepeating, duration, onStart, onComplete, currentRepeat, repeatCount, repeatDelay, repeatMode, animationDirection]);
63
+ // 반복 시작 함수
64
+ const startRepeat = useCallback(() => {
65
+ if (isRepeating)
66
+ return;
67
+ setIsRepeating(true);
68
+ setCurrentRepeat(0);
69
+ setAnimationDirection('forward');
70
+ runAnimation();
71
+ }, [isRepeating, runAnimation]);
72
+ // 반복 중단 함수
73
+ const stopRepeat = useCallback(() => {
74
+ setIsRepeating(false);
75
+ setIsAnimating(false);
76
+ onStop?.();
77
+ }, [onStop]);
78
+ // 반복 일시정지 함수
79
+ const pauseRepeat = useCallback(() => {
80
+ setIsRepeating(false);
81
+ setIsAnimating(false);
82
+ }, []);
83
+ // 반복 재개 함수
84
+ const resumeRepeat = useCallback(() => {
85
+ if (!isRepeating && currentRepeat < (repeatCount === -1 ? Infinity : repeatCount)) {
86
+ setIsRepeating(true);
87
+ runAnimation();
88
+ }
89
+ }, [isRepeating, currentRepeat, repeatCount, runAnimation]);
90
+ // 모션 시작 함수
91
+ const start = useCallback(() => {
92
+ if (!isVisible) {
93
+ setIsVisible(true);
94
+ startRepeat();
95
+ }
96
+ }, [isVisible, startRepeat]);
97
+ // 모션 중단 함수
98
+ const stop = useCallback(() => {
99
+ stopRepeat();
100
+ }, [stopRepeat]);
101
+ // 모션 리셋 함수
102
+ const reset = useCallback(() => {
103
+ setIsVisible(false);
104
+ setIsAnimating(false);
105
+ setProgress(0);
106
+ setCurrentRepeat(0);
107
+ setIsRepeating(false);
108
+ setAnimationDirection('forward');
109
+ onReset?.();
110
+ }, [onReset]);
111
+ // 모션 일시정지 함수
112
+ const pause = useCallback(() => {
113
+ pauseRepeat();
114
+ }, [pauseRepeat]);
115
+ // 모션 재개 함수
116
+ const resume = useCallback(() => {
117
+ if (isVisible) {
118
+ resumeRepeat();
119
+ }
120
+ }, [isVisible, resumeRepeat]);
121
+ // 자동 시작
122
+ useEffect(() => {
123
+ if (autoStart) {
124
+ startRepeat();
125
+ }
126
+ }, [autoStart, startRepeat]);
127
+ // 컴포넌트 언마운트 시 정리
128
+ useEffect(() => {
129
+ return () => {
130
+ setIsRepeating(false);
131
+ };
132
+ }, []);
133
+ // 현재 진행률에 따른 스타일 계산
134
+ const getCurrentStyle = () => {
135
+ let currentProgress = progress;
136
+ // 반복 방향에 따른 진행률 조정
137
+ if (animationDirection === 'reverse') {
138
+ currentProgress = 1 - progress;
139
+ }
140
+ // 반복 모드에 따른 진행률 조정
141
+ if (repeatMode === 'bounce') {
142
+ currentProgress = Math.sin(currentProgress * Math.PI);
143
+ }
144
+ const scale = initialScale + (targetScale - initialScale) * currentProgress;
145
+ const opacity = initialOpacity + (targetOpacity - initialOpacity) * currentProgress;
146
+ const rotate = initialRotate + (targetRotate - initialRotate) * currentProgress;
147
+ const translateY = initialTranslateY + (targetTranslateY - initialTranslateY) * currentProgress;
148
+ const translateX = initialTranslateX + (targetTranslateX - initialTranslateX) * currentProgress;
149
+ return {
150
+ transform: `
151
+ scale(${scale})
152
+ rotate(${rotate}deg)
153
+ translate(${translateX}px, ${translateY}px)
154
+ `,
155
+ opacity,
156
+ transition: `all ${duration}ms ${easing}`,
157
+ willChange: 'transform, opacity'
158
+ };
159
+ };
160
+ const style = getCurrentStyle();
161
+ return {
162
+ ref,
163
+ isVisible,
164
+ isAnimating,
165
+ style,
166
+ progress,
167
+ start,
168
+ stop,
169
+ reset,
170
+ pause,
171
+ resume,
172
+ repeatCount,
173
+ currentRepeat,
174
+ isRepeating,
175
+ repeatDirection,
176
+ repeatMode
177
+ };
178
+ }
179
+ //# sourceMappingURL=useRepeat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useRepeat.js","sourceRoot":"","sources":["../../src/hooks/useRepeat.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { ScaleOptions, BaseMotionReturn, MotionElement } from '../types';
2
+ export declare function useScaleIn<T extends MotionElement = HTMLDivElement>(options?: ScaleOptions): BaseMotionReturn<T>;
3
+ //# sourceMappingURL=useScaleIn.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useScaleIn.d.ts","sourceRoot":"","sources":["../../src/hooks/useScaleIn.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAExE,wBAAgB,UAAU,CAAC,CAAC,SAAS,aAAa,GAAG,cAAc,EACjE,OAAO,GAAE,YAAiB,GACzB,gBAAgB,CAAC,CAAC,CAAC,CAqIrB"}
@@ -0,0 +1,111 @@
1
+ import { useRef, useState, useEffect, useCallback } from 'react';
2
+ export function useScaleIn(options = {}) {
3
+ const { delay = 0, duration = 700, threshold = 0.1, triggerOnce = true, easing = 'ease-out', autoStart = true, initialScale = 0.5, targetScale = 1, onComplete, onStart, onStop, onReset } = options;
4
+ const ref = useRef(null);
5
+ const [isVisible, setIsVisible] = useState(false);
6
+ const [isAnimating, setIsAnimating] = useState(false);
7
+ const [progress, setProgress] = useState(0);
8
+ const observerRef = useRef(null);
9
+ const timeoutRef = useRef(null);
10
+ // 모션 시작 함수
11
+ const start = useCallback(() => {
12
+ if (isAnimating)
13
+ return;
14
+ setIsAnimating(true);
15
+ setProgress(0);
16
+ onStart?.();
17
+ // 지연 시간 적용
18
+ if (delay > 0) {
19
+ timeoutRef.current = window.setTimeout(() => {
20
+ setIsVisible(true);
21
+ setProgress(1);
22
+ setIsAnimating(false);
23
+ onComplete?.();
24
+ }, delay);
25
+ }
26
+ else {
27
+ setIsVisible(true);
28
+ setProgress(1);
29
+ setIsAnimating(false);
30
+ onComplete?.();
31
+ }
32
+ }, [delay, isAnimating, onStart, onComplete]);
33
+ // 모션 중단 함수
34
+ const stop = useCallback(() => {
35
+ if (timeoutRef.current) {
36
+ clearTimeout(timeoutRef.current);
37
+ timeoutRef.current = null;
38
+ }
39
+ setIsAnimating(false);
40
+ onStop?.();
41
+ }, [onStop]);
42
+ // 모션 리셋 함수
43
+ const reset = useCallback(() => {
44
+ stop();
45
+ setIsVisible(false);
46
+ setProgress(0);
47
+ onReset?.();
48
+ }, [stop, onReset]);
49
+ // 모션 일시정지 함수
50
+ const pause = useCallback(() => {
51
+ if (timeoutRef.current) {
52
+ clearTimeout(timeoutRef.current);
53
+ timeoutRef.current = null;
54
+ }
55
+ setIsAnimating(false);
56
+ }, []);
57
+ // 모션 재개 함수
58
+ const resume = useCallback(() => {
59
+ if (!isVisible && !isAnimating) {
60
+ start();
61
+ }
62
+ }, [isVisible, isAnimating, start]);
63
+ // Intersection Observer 설정
64
+ useEffect(() => {
65
+ if (!ref.current || !autoStart)
66
+ return;
67
+ observerRef.current = new IntersectionObserver((entries) => {
68
+ entries.forEach((entry) => {
69
+ if (entry.isIntersecting) {
70
+ start();
71
+ if (triggerOnce) {
72
+ observerRef.current?.disconnect();
73
+ }
74
+ }
75
+ });
76
+ }, { threshold });
77
+ observerRef.current.observe(ref.current);
78
+ return () => {
79
+ if (observerRef.current) {
80
+ observerRef.current.disconnect();
81
+ }
82
+ };
83
+ }, [autoStart, threshold, triggerOnce, start]);
84
+ // 컴포넌트 언마운트 시 정리
85
+ useEffect(() => {
86
+ return () => {
87
+ if (timeoutRef.current) {
88
+ clearTimeout(timeoutRef.current);
89
+ }
90
+ };
91
+ }, []);
92
+ // 스타일 계산
93
+ const style = {
94
+ transform: `scale(${isVisible ? targetScale : initialScale})`,
95
+ transition: `transform ${duration}ms ${easing}`,
96
+ willChange: 'transform'
97
+ };
98
+ return {
99
+ ref,
100
+ isVisible,
101
+ isAnimating,
102
+ style,
103
+ progress,
104
+ start,
105
+ stop,
106
+ reset,
107
+ pause,
108
+ resume
109
+ };
110
+ }
111
+ //# sourceMappingURL=useScaleIn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useScaleIn.js","sourceRoot":"","sources":["../../src/hooks/useScaleIn.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import { BaseMotionOptions, BaseMotionReturn, MotionElement } from '../types';
2
+ export interface ScrollProgressOptions extends BaseMotionOptions {
3
+ progressScale?: number;
4
+ progressOpacity?: number;
5
+ progressRotate?: number;
6
+ progressTranslateY?: number;
7
+ progressTranslateX?: number;
8
+ initialScale?: number;
9
+ initialOpacity?: number;
10
+ initialRotate?: number;
11
+ initialTranslateY?: number;
12
+ initialTranslateX?: number;
13
+ scrollThreshold?: number;
14
+ progressDirection?: 'horizontal' | 'vertical' | 'both';
15
+ }
16
+ export declare function useScrollProgress<T extends MotionElement = HTMLDivElement>(options?: ScrollProgressOptions): BaseMotionReturn<T> & {
17
+ scrollProgress: number;
18
+ scrollDirection: 'up' | 'down' | null;
19
+ scrollVelocity: number;
20
+ };
21
+ //# sourceMappingURL=useScrollProgress.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useScrollProgress.d.ts","sourceRoot":"","sources":["../../src/hooks/useScrollProgress.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAE7E,MAAM,WAAW,qBAAsB,SAAQ,iBAAiB;IAC9D,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,iBAAiB,CAAC,EAAE,YAAY,GAAG,UAAU,GAAG,MAAM,CAAA;CACvD;AAED,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,aAAa,GAAG,cAAc,EACxE,OAAO,GAAE,qBAA0B,GAClC,gBAAgB,CAAC,CAAC,CAAC,GAAG;IACvB,cAAc,EAAE,MAAM,CAAA;IACtB,eAAe,EAAE,IAAI,GAAG,MAAM,GAAG,IAAI,CAAA;IACrC,cAAc,EAAE,MAAM,CAAA;CACvB,CA6KA"}
@@ -0,0 +1,139 @@
1
+ import { useRef, useState, useEffect, useCallback } from 'react';
2
+ export function useScrollProgress(options = {}) {
3
+ const { duration = 300, easing = 'ease-out', progressScale = 1, progressOpacity, progressRotate, progressTranslateY, progressTranslateX, initialScale = 0.8, initialOpacity = 0.5, initialRotate = 0, initialTranslateY = 0, initialTranslateX = 0, scrollThreshold = 0.1, progressDirection = 'both', onComplete, onStart, onStop, onReset } = options;
4
+ const ref = useRef(null);
5
+ const [isVisible, setIsVisible] = useState(false);
6
+ const [isAnimating, setIsAnimating] = useState(false);
7
+ const [progress, setProgress] = useState(0);
8
+ const [scrollProgress, setScrollProgress] = useState(0);
9
+ const [scrollDirection, setScrollDirection] = useState(null);
10
+ const [scrollVelocity, setScrollVelocity] = useState(0);
11
+ const [lastScrollY, setLastScrollY] = useState(0);
12
+ const [lastScrollTime, setLastScrollTime] = useState(Date.now());
13
+ // 스크롤 이벤트 핸들러
14
+ const handleScroll = useCallback(() => {
15
+ if (!ref.current)
16
+ return;
17
+ const currentScrollY = window.scrollY;
18
+ const currentTime = Date.now();
19
+ const rect = ref.current.getBoundingClientRect();
20
+ const threshold = window.innerHeight * scrollThreshold;
21
+ // 스크롤 진행률 계산 (0-1)
22
+ const elementTop = rect.top + currentScrollY;
23
+ const elementHeight = rect.height;
24
+ const viewportHeight = window.innerHeight;
25
+ const documentHeight = document.documentElement.scrollHeight;
26
+ let newScrollProgress = 0;
27
+ if (progressDirection === 'vertical' || progressDirection === 'both') {
28
+ // 세로 스크롤 진행률
29
+ const scrollRange = documentHeight - viewportHeight;
30
+ newScrollProgress = Math.max(0, Math.min(1, currentScrollY / scrollRange));
31
+ }
32
+ else if (progressDirection === 'horizontal') {
33
+ // 가로 스크롤 진행률 (요소가 뷰포트에 들어올 때)
34
+ const elementProgress = Math.max(0, Math.min(1, (viewportHeight - rect.top) / (viewportHeight + elementHeight)));
35
+ newScrollProgress = elementProgress;
36
+ }
37
+ setScrollProgress(newScrollProgress);
38
+ // 스크롤 방향과 속도 계산
39
+ const isScrollingDown = currentScrollY > lastScrollY;
40
+ const isScrollingUp = currentScrollY < lastScrollY;
41
+ const timeDiff = currentTime - lastScrollTime;
42
+ const scrollDiff = Math.abs(currentScrollY - lastScrollY);
43
+ const velocity = timeDiff > 0 ? scrollDiff / timeDiff : 0;
44
+ if (isScrollingDown) {
45
+ setScrollDirection('down');
46
+ }
47
+ else if (isScrollingUp) {
48
+ setScrollDirection('up');
49
+ }
50
+ setScrollVelocity(velocity);
51
+ // 요소가 뷰포트에 보이는지 확인
52
+ const shouldBeVisible = rect.top <= threshold;
53
+ if (shouldBeVisible && !isVisible) {
54
+ setIsVisible(true);
55
+ setIsAnimating(true);
56
+ setProgress(0);
57
+ onStart?.();
58
+ setTimeout(() => {
59
+ setIsAnimating(false);
60
+ setProgress(1);
61
+ onComplete?.();
62
+ }, duration);
63
+ }
64
+ setLastScrollY(currentScrollY);
65
+ setLastScrollTime(currentTime);
66
+ }, [isVisible, lastScrollY, lastScrollTime, progressDirection, scrollThreshold, duration, onStart, onComplete]);
67
+ // 스크롤 이벤트 리스너 설정
68
+ useEffect(() => {
69
+ window.addEventListener('scroll', handleScroll, { passive: true });
70
+ handleScroll(); // 초기 상태 확인
71
+ return () => {
72
+ window.removeEventListener('scroll', handleScroll);
73
+ };
74
+ }, [handleScroll]);
75
+ // 모션 시작 함수
76
+ const start = useCallback(() => {
77
+ if (!isVisible) {
78
+ setIsVisible(true);
79
+ setIsAnimating(true);
80
+ setProgress(0);
81
+ onStart?.();
82
+ setTimeout(() => {
83
+ setIsAnimating(false);
84
+ setProgress(1);
85
+ onComplete?.();
86
+ }, duration);
87
+ }
88
+ }, [isVisible, duration, onStart, onComplete]);
89
+ // 모션 중단 함수
90
+ const stop = useCallback(() => {
91
+ setIsAnimating(false);
92
+ onStop?.();
93
+ }, [onStop]);
94
+ // 모션 리셋 함수
95
+ const reset = useCallback(() => {
96
+ setIsVisible(false);
97
+ setIsAnimating(false);
98
+ setProgress(0);
99
+ setScrollProgress(0);
100
+ onReset?.();
101
+ }, [onReset]);
102
+ // 모션 일시정지 함수
103
+ const pause = useCallback(() => {
104
+ setIsAnimating(false);
105
+ }, []);
106
+ // 모션 재개 함수
107
+ const resume = useCallback(() => {
108
+ if (isVisible) {
109
+ setIsAnimating(true);
110
+ }
111
+ }, [isVisible]);
112
+ // 스타일 계산 (스크롤 진행률에 따라)
113
+ const style = {
114
+ transform: `
115
+ scale(${initialScale + (progressScale - initialScale) * scrollProgress})
116
+ rotate(${initialRotate + (progressRotate || 0 - initialRotate) * scrollProgress}deg)
117
+ translate(${initialTranslateX + (progressTranslateX || 0 - initialTranslateX) * scrollProgress}px, ${initialTranslateY + (progressTranslateY || 0 - initialTranslateY) * scrollProgress}px)
118
+ `,
119
+ opacity: initialOpacity + (progressOpacity || 1 - initialOpacity) * scrollProgress,
120
+ transition: `all ${duration}ms ${easing}`,
121
+ willChange: 'transform, opacity'
122
+ };
123
+ return {
124
+ ref,
125
+ isVisible,
126
+ isAnimating,
127
+ style,
128
+ progress,
129
+ start,
130
+ stop,
131
+ reset,
132
+ pause,
133
+ resume,
134
+ scrollProgress,
135
+ scrollDirection,
136
+ scrollVelocity
137
+ };
138
+ }
139
+ //# sourceMappingURL=useScrollProgress.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useScrollProgress.js","sourceRoot":"","sources":["../../src/hooks/useScrollProgress.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { BaseMotionOptions, BaseMotionReturn, MotionElement } from '../types';
2
+ export interface ScrollRevealOptions extends BaseMotionOptions {
3
+ revealScale?: number;
4
+ revealOpacity?: number;
5
+ revealRotate?: number;
6
+ revealTranslateY?: number;
7
+ revealTranslateX?: number;
8
+ initialScale?: number;
9
+ initialOpacity?: number;
10
+ initialRotate?: number;
11
+ initialTranslateY?: number;
12
+ initialTranslateX?: number;
13
+ scrollThreshold?: number;
14
+ scrollDirection?: 'up' | 'down' | 'both';
15
+ }
16
+ export declare function useScrollReveal<T extends MotionElement = HTMLDivElement>(options?: ScrollRevealOptions): BaseMotionReturn<T>;
17
+ //# sourceMappingURL=useScrollReveal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useScrollReveal.d.ts","sourceRoot":"","sources":["../../src/hooks/useScrollReveal.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAE7E,MAAM,WAAW,mBAAoB,SAAQ,iBAAiB;IAC5D,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,eAAe,CAAC,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,CAAA;CACzC;AAED,wBAAgB,eAAe,CAAC,CAAC,SAAS,aAAa,GAAG,cAAc,EACtE,OAAO,GAAE,mBAAwB,GAChC,gBAAgB,CAAC,CAAC,CAAC,CA0HrB"}
@@ -0,0 +1,95 @@
1
+ import { useRef, useState, useEffect, useCallback } from 'react';
2
+ export function useScrollReveal(options = {}) {
3
+ const { duration = 700, easing = 'ease-out', revealScale = 1, revealOpacity = 1, revealRotate = 0, revealTranslateY = 0, revealTranslateX = 0, initialScale = 0.8, initialOpacity = 0, initialRotate = 0, initialTranslateY = 50, initialTranslateX = 0, scrollThreshold = 0.1, scrollDirection = 'both', onComplete, onStart, onStop, onReset } = options;
4
+ const ref = useRef(null);
5
+ const [isRevealed, setIsRevealed] = useState(false);
6
+ const [isAnimating, setIsAnimating] = useState(false);
7
+ const [progress, setProgress] = useState(0);
8
+ // 스크롤 이벤트 핸들러
9
+ const handleScroll = useCallback(() => {
10
+ if (!ref.current)
11
+ return;
12
+ const rect = ref.current.getBoundingClientRect();
13
+ const threshold = window.innerHeight * scrollThreshold;
14
+ const shouldReveal = rect.top <= threshold;
15
+ if (shouldReveal && !isRevealed) {
16
+ setIsRevealed(true);
17
+ setIsAnimating(true);
18
+ setProgress(0);
19
+ onStart?.();
20
+ setTimeout(() => {
21
+ setIsAnimating(false);
22
+ setProgress(1);
23
+ onComplete?.();
24
+ }, duration);
25
+ }
26
+ }, [isRevealed, scrollThreshold, duration, onStart, onComplete]);
27
+ // 스크롤 이벤트 리스너 설정
28
+ useEffect(() => {
29
+ window.addEventListener('scroll', handleScroll, { passive: true });
30
+ handleScroll();
31
+ return () => {
32
+ window.removeEventListener('scroll', handleScroll);
33
+ };
34
+ }, [handleScroll]);
35
+ // 모션 시작 함수
36
+ const start = useCallback(() => {
37
+ if (!isRevealed) {
38
+ setIsRevealed(true);
39
+ setIsAnimating(true);
40
+ setProgress(0);
41
+ onStart?.();
42
+ setTimeout(() => {
43
+ setIsAnimating(false);
44
+ setProgress(1);
45
+ onComplete?.();
46
+ }, duration);
47
+ }
48
+ }, [isRevealed, duration, onStart, onComplete]);
49
+ // 모션 중단 함수
50
+ const stop = useCallback(() => {
51
+ setIsAnimating(false);
52
+ onStop?.();
53
+ }, [onStop]);
54
+ // 모션 리셋 함수
55
+ const reset = useCallback(() => {
56
+ setIsRevealed(false);
57
+ setIsAnimating(false);
58
+ setProgress(0);
59
+ onReset?.();
60
+ }, [onReset]);
61
+ // 모션 일시정지 함수
62
+ const pause = useCallback(() => {
63
+ setIsAnimating(false);
64
+ }, []);
65
+ // 모션 재개 함수
66
+ const resume = useCallback(() => {
67
+ if (isRevealed) {
68
+ setIsAnimating(true);
69
+ }
70
+ }, [isRevealed]);
71
+ // 스타일 계산
72
+ const style = {
73
+ transform: `
74
+ scale(${isRevealed ? revealScale : initialScale})
75
+ rotate(${isRevealed ? revealRotate : initialRotate}deg)
76
+ translate(${isRevealed ? revealTranslateX : initialTranslateX}px, ${isRevealed ? revealTranslateY : initialTranslateY}px)
77
+ `,
78
+ opacity: isRevealed ? revealOpacity : initialOpacity,
79
+ transition: `all ${duration}ms ${easing}`,
80
+ willChange: 'transform, opacity'
81
+ };
82
+ return {
83
+ ref,
84
+ isVisible: isRevealed,
85
+ isAnimating,
86
+ style,
87
+ progress,
88
+ start,
89
+ stop,
90
+ reset,
91
+ pause,
92
+ resume
93
+ };
94
+ }
95
+ //# sourceMappingURL=useScrollReveal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useScrollReveal.js","sourceRoot":"","sources":["../../src/hooks/useScrollReveal.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { BaseMotionOptions, BaseMotionReturn, MotionElement } from '../types';
2
+ export interface ScrollToggleOptions extends BaseMotionOptions {
3
+ showScale?: number;
4
+ showOpacity?: number;
5
+ showRotate?: number;
6
+ showTranslateY?: number;
7
+ showTranslateX?: number;
8
+ hideScale?: number;
9
+ hideOpacity?: number;
10
+ hideRotate?: number;
11
+ hideTranslateY?: number;
12
+ hideTranslateX?: number;
13
+ scrollThreshold?: number;
14
+ scrollDirection?: 'up' | 'down' | 'both';
15
+ }
16
+ export declare function useScrollToggle<T extends MotionElement = HTMLDivElement>(options?: ScrollToggleOptions): BaseMotionReturn<T>;
17
+ //# sourceMappingURL=useScrollToggle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useScrollToggle.d.ts","sourceRoot":"","sources":["../../src/hooks/useScrollToggle.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAE7E,MAAM,WAAW,mBAAoB,SAAQ,iBAAiB;IAC5D,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,eAAe,CAAC,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,CAAA;CACzC;AAED,wBAAgB,eAAe,CAAC,CAAC,SAAS,aAAa,GAAG,cAAc,EACtE,OAAO,GAAE,mBAAwB,GAChC,gBAAgB,CAAC,CAAC,CAAC,CAoJrB"}