@hua-labs/motion-core 2.0.0 → 2.1.0-alpha.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (130) hide show
  1. package/README.md +16 -19
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/core/MotionEngine.d.ts +111 -0
  4. package/dist/core/MotionEngine.d.ts.map +1 -0
  5. package/dist/core/MotionEngine.js +206 -0
  6. package/dist/core/MotionEngine.js.map +1 -0
  7. package/dist/core/PerformanceOptimizer.d.ts +124 -0
  8. package/dist/core/PerformanceOptimizer.d.ts.map +1 -0
  9. package/dist/core/PerformanceOptimizer.js +334 -0
  10. package/dist/core/PerformanceOptimizer.js.map +1 -0
  11. package/dist/core/TransitionEffects.d.ts +76 -0
  12. package/dist/core/TransitionEffects.d.ts.map +1 -0
  13. package/dist/core/TransitionEffects.js +321 -0
  14. package/dist/core/TransitionEffects.js.map +1 -0
  15. package/dist/hooks/useBounceIn.d.ts +11 -2
  16. package/dist/hooks/useBounceIn.d.ts.map +1 -1
  17. package/dist/hooks/useBounceIn.js +48 -114
  18. package/dist/hooks/useBounceIn.js.map +1 -1
  19. package/dist/hooks/useClickToggle.d.ts +28 -13
  20. package/dist/hooks/useClickToggle.d.ts.map +1 -1
  21. package/dist/hooks/useClickToggle.js +125 -90
  22. package/dist/hooks/useClickToggle.js.map +1 -1
  23. package/dist/hooks/useFadeIn.d.ts +0 -14
  24. package/dist/hooks/useFadeIn.d.ts.map +1 -1
  25. package/dist/hooks/useFadeIn.js +17 -43
  26. package/dist/hooks/useFadeIn.js.map +1 -1
  27. package/dist/hooks/useFocusToggle.d.ts +28 -13
  28. package/dist/hooks/useFocusToggle.d.ts.map +1 -1
  29. package/dist/hooks/useFocusToggle.js +125 -87
  30. package/dist/hooks/useFocusToggle.js.map +1 -1
  31. package/dist/hooks/useGesture.d.ts +45 -0
  32. package/dist/hooks/useGesture.d.ts.map +1 -0
  33. package/dist/hooks/useGesture.js +274 -0
  34. package/dist/hooks/useGesture.js.map +1 -0
  35. package/dist/hooks/useGestureMotion.d.ts +26 -0
  36. package/dist/hooks/useGestureMotion.d.ts.map +1 -0
  37. package/dist/hooks/useGestureMotion.js +167 -0
  38. package/dist/hooks/useGestureMotion.js.map +1 -0
  39. package/dist/hooks/useGradient.d.ts +10 -21
  40. package/dist/hooks/useGradient.d.ts.map +1 -1
  41. package/dist/hooks/useGradient.js +70 -127
  42. package/dist/hooks/useGradient.js.map +1 -1
  43. package/dist/hooks/useHoverMotion.d.ts +4 -14
  44. package/dist/hooks/useHoverMotion.d.ts.map +1 -1
  45. package/dist/hooks/useHoverMotion.js +31 -82
  46. package/dist/hooks/useHoverMotion.js.map +1 -1
  47. package/dist/hooks/useMotionState.d.ts +27 -24
  48. package/dist/hooks/useMotionState.d.ts.map +1 -1
  49. package/dist/hooks/useMotionState.js +186 -103
  50. package/dist/hooks/useMotionState.js.map +1 -1
  51. package/dist/hooks/usePageMotions.d.ts +17 -0
  52. package/dist/hooks/usePageMotions.d.ts.map +1 -0
  53. package/dist/hooks/usePageMotions.js +352 -0
  54. package/dist/hooks/usePageMotions.js.map +1 -0
  55. package/dist/hooks/usePulse.d.ts +8 -1
  56. package/dist/hooks/usePulse.d.ts.map +1 -1
  57. package/dist/hooks/usePulse.js +75 -101
  58. package/dist/hooks/usePulse.js.map +1 -1
  59. package/dist/hooks/useRepeat.d.ts +17 -22
  60. package/dist/hooks/useRepeat.d.ts.map +1 -1
  61. package/dist/hooks/useRepeat.js +48 -162
  62. package/dist/hooks/useRepeat.js.map +1 -1
  63. package/dist/hooks/useScaleIn.d.ts +12 -2
  64. package/dist/hooks/useScaleIn.d.ts.map +1 -1
  65. package/dist/hooks/useScaleIn.js +46 -85
  66. package/dist/hooks/useScaleIn.js.map +1 -1
  67. package/dist/hooks/useScrollProgress.d.ts +8 -18
  68. package/dist/hooks/useScrollProgress.d.ts.map +1 -1
  69. package/dist/hooks/useScrollProgress.js +28 -130
  70. package/dist/hooks/useScrollProgress.js.map +1 -1
  71. package/dist/hooks/useScrollReveal.d.ts +12 -15
  72. package/dist/hooks/useScrollReveal.d.ts.map +1 -1
  73. package/dist/hooks/useScrollReveal.js +93 -72
  74. package/dist/hooks/useScrollReveal.js.map +1 -1
  75. package/dist/hooks/useSimplePageMotion.d.ts +29 -0
  76. package/dist/hooks/useSimplePageMotion.d.ts.map +1 -0
  77. package/dist/hooks/useSimplePageMotion.js +145 -0
  78. package/dist/hooks/useSimplePageMotion.js.map +1 -0
  79. package/dist/hooks/useSlideLeft.d.ts +12 -2
  80. package/dist/hooks/useSlideLeft.d.ts.map +1 -1
  81. package/dist/hooks/useSlideLeft.js +46 -85
  82. package/dist/hooks/useSlideLeft.js.map +1 -1
  83. package/dist/hooks/useSlideRight.d.ts +12 -2
  84. package/dist/hooks/useSlideRight.d.ts.map +1 -1
  85. package/dist/hooks/useSlideRight.js +46 -85
  86. package/dist/hooks/useSlideRight.js.map +1 -1
  87. package/dist/hooks/useSlideUp.d.ts.map +1 -1
  88. package/dist/hooks/useSlideUp.js +40 -29
  89. package/dist/hooks/useSlideUp.js.map +1 -1
  90. package/dist/hooks/useSmartMotion.d.ts +31 -0
  91. package/dist/hooks/useSmartMotion.d.ts.map +1 -0
  92. package/dist/hooks/useSmartMotion.js +257 -0
  93. package/dist/hooks/useSmartMotion.js.map +1 -0
  94. package/dist/hooks/useSpringMotion.d.ts +14 -24
  95. package/dist/hooks/useSpringMotion.d.ts.map +1 -1
  96. package/dist/hooks/useSpringMotion.js +109 -161
  97. package/dist/hooks/useSpringMotion.js.map +1 -1
  98. package/dist/hooks/useToggleMotion.d.ts +16 -0
  99. package/dist/hooks/useToggleMotion.d.ts.map +1 -0
  100. package/dist/hooks/useToggleMotion.js +53 -0
  101. package/dist/hooks/useToggleMotion.js.map +1 -0
  102. package/dist/hooks/useUnifiedMotion.d.ts +51 -0
  103. package/dist/hooks/useUnifiedMotion.d.ts.map +1 -0
  104. package/dist/hooks/useUnifiedMotion.js +106 -0
  105. package/dist/hooks/useUnifiedMotion.js.map +1 -0
  106. package/dist/index.d.ts +14 -10
  107. package/dist/index.d.ts.map +1 -1
  108. package/dist/index.js +37 -17
  109. package/dist/index.js.map +1 -1
  110. package/dist/managers/MotionStateManager.d.ts +63 -0
  111. package/dist/managers/MotionStateManager.d.ts.map +1 -0
  112. package/dist/managers/MotionStateManager.js +159 -0
  113. package/dist/managers/MotionStateManager.js.map +1 -0
  114. package/dist/presets/index.d.ts +16 -0
  115. package/dist/presets/index.d.ts.map +1 -0
  116. package/dist/presets/index.js +120 -0
  117. package/dist/presets/index.js.map +1 -0
  118. package/dist/types/common.d.ts +155 -0
  119. package/dist/types/common.d.ts.map +1 -0
  120. package/dist/types/common.js +5 -0
  121. package/dist/types/common.js.map +1 -0
  122. package/dist/types/index.d.ts +63 -95
  123. package/dist/types/index.d.ts.map +1 -1
  124. package/dist/types/index.js +2 -2
  125. package/dist/types/index.js.map +1 -1
  126. package/dist/utils/easing.d.ts +80 -26
  127. package/dist/utils/easing.d.ts.map +1 -1
  128. package/dist/utils/easing.js +202 -67
  129. package/dist/utils/easing.js.map +1 -1
  130. package/package.json +15 -15
@@ -0,0 +1,159 @@
1
+ /**
2
+ * MotionStateManager - 모션 상태 관리 클래스
3
+ *
4
+ * 상태 충돌 문제 해결을 위해 3가지 상태를 분리:
5
+ * - internalVisibility: 내부 로직 (초기화, 리셋 등)
6
+ * - triggeredVisibility: 외부 트리거 (Intersection Observer)
7
+ * - finalVisibility: 최종 계산된 상태
8
+ */
9
+ export class MotionStateManager {
10
+ constructor() {
11
+ this.states = new Map();
12
+ this.listeners = new Map();
13
+ }
14
+ /**
15
+ * 요소의 상태를 초기화
16
+ */
17
+ initializeElement(elementId, config) {
18
+ const initialState = {
19
+ internalVisibility: false, // 초기에 숨김 상태로 시작 (스크롤 리빌용)
20
+ triggeredVisibility: false, // Intersection Observer가 아직 트리거되지 않음
21
+ finalVisibility: false, // 초기에 숨김 상태로 시작
22
+ opacity: 0, // 초기에 투명 상태로 시작
23
+ translateY: 20, // 초기에 아래로 이동된 상태로 시작
24
+ translateX: 0,
25
+ scale: 0.95, // 초기에 약간 축소된 상태로 시작
26
+ rotation: 0,
27
+ isHovered: false,
28
+ isClicked: false,
29
+ isAnimating: false
30
+ };
31
+ this.states.set(elementId, initialState);
32
+ this.computeFinalState(elementId);
33
+ }
34
+ /**
35
+ * 내부 가시성 상태 업데이트 (초기화, 리셋 등)
36
+ */
37
+ setInternalVisibility(elementId, visible) {
38
+ const state = this.states.get(elementId);
39
+ if (!state)
40
+ return;
41
+ state.internalVisibility = visible;
42
+ this.computeFinalState(elementId);
43
+ this.notifyListeners(elementId, state);
44
+ }
45
+ /**
46
+ * 외부 트리거 가시성 상태 업데이트 (Intersection Observer)
47
+ */
48
+ setTriggeredVisibility(elementId, visible) {
49
+ const state = this.states.get(elementId);
50
+ if (!state)
51
+ return;
52
+ state.triggeredVisibility = visible;
53
+ this.computeFinalState(elementId);
54
+ this.notifyListeners(elementId, state);
55
+ }
56
+ /**
57
+ * 모션 값 업데이트
58
+ */
59
+ updateMotionValues(elementId, values) {
60
+ const state = this.states.get(elementId);
61
+ if (!state)
62
+ return;
63
+ Object.assign(state, values);
64
+ this.notifyListeners(elementId, state);
65
+ }
66
+ /**
67
+ * 최종 상태 계산
68
+ */
69
+ computeFinalState(elementId) {
70
+ const state = this.states.get(elementId);
71
+ if (!state)
72
+ return;
73
+ // 내부 또는 외부 트리거 중 하나라도 true면 최종적으로 보임
74
+ state.finalVisibility = state.internalVisibility || state.triggeredVisibility;
75
+ // 모션 중 상태 업데이트
76
+ state.isAnimating = state.finalVisibility && (state.opacity < 1 || state.translateY > 0);
77
+ }
78
+ /**
79
+ * 현재 상태 조회
80
+ */
81
+ getState(elementId) {
82
+ return this.states.get(elementId);
83
+ }
84
+ /**
85
+ * 모든 상태 조회
86
+ */
87
+ getAllStates() {
88
+ return new Map(this.states);
89
+ }
90
+ /**
91
+ * 상태 변경 리스너 등록
92
+ */
93
+ subscribe(elementId, listener) {
94
+ if (!this.listeners.has(elementId)) {
95
+ this.listeners.set(elementId, new Set());
96
+ }
97
+ this.listeners.get(elementId).add(listener);
98
+ // 구독 해제 함수 반환
99
+ return () => {
100
+ const listeners = this.listeners.get(elementId);
101
+ if (listeners) {
102
+ listeners.delete(listener);
103
+ }
104
+ };
105
+ }
106
+ /**
107
+ * 리스너들에게 상태 변경 알림
108
+ */
109
+ notifyListeners(elementId, state) {
110
+ const listeners = this.listeners.get(elementId);
111
+ if (!listeners)
112
+ return;
113
+ listeners.forEach(listener => {
114
+ try {
115
+ listener(state);
116
+ }
117
+ catch (error) {
118
+ if (process.env.NODE_ENV === 'development') {
119
+ console.error(`MotionStateManager listener error for ${elementId}:`, error);
120
+ }
121
+ }
122
+ });
123
+ }
124
+ /**
125
+ * 모든 상태 초기화
126
+ */
127
+ reset() {
128
+ this.states.clear();
129
+ this.listeners.clear();
130
+ }
131
+ /**
132
+ * 특정 요소 상태 초기화
133
+ */
134
+ resetElement(elementId) {
135
+ this.states.delete(elementId);
136
+ this.listeners.delete(elementId);
137
+ }
138
+ /**
139
+ * 디버그용 상태 출력
140
+ */
141
+ debug() {
142
+ if (process.env.NODE_ENV === 'development') {
143
+ console.log('MotionStateManager Debug:');
144
+ this.states.forEach((state, elementId) => {
145
+ console.log(` ${elementId}:`, {
146
+ internalVisibility: state.internalVisibility,
147
+ triggeredVisibility: state.triggeredVisibility,
148
+ finalVisibility: state.finalVisibility,
149
+ opacity: state.opacity,
150
+ translateY: state.translateY,
151
+ isAnimating: state.isAnimating
152
+ });
153
+ });
154
+ }
155
+ }
156
+ }
157
+ // 싱글톤 인스턴스
158
+ export const motionStateManager = new MotionStateManager();
159
+ //# sourceMappingURL=MotionStateManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MotionStateManager.js","sourceRoot":"","sources":["../../src/managers/MotionStateManager.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AACH,MAAM,OAAO,kBAAkB;IAA/B;QACU,WAAM,GAA6B,IAAI,GAAG,EAAE,CAAA;QAC5C,cAAS,GAAmD,IAAI,GAAG,EAAE,CAAA;IA8J/E,CAAC;IA5JC;;OAEG;IACH,iBAAiB,CAAC,SAAiB,EAAE,MAAqB;QACxD,MAAM,YAAY,GAAgB;YAChC,kBAAkB,EAAE,KAAK,EAAE,0BAA0B;YACrD,mBAAmB,EAAE,KAAK,EAAE,qCAAqC;YACjE,eAAe,EAAE,KAAK,EAAE,gBAAgB;YACxC,OAAO,EAAE,CAAC,EAAE,gBAAgB;YAC5B,UAAU,EAAE,EAAE,EAAE,qBAAqB;YACrC,UAAU,EAAE,CAAC;YACb,KAAK,EAAE,IAAI,EAAE,oBAAoB;YACjC,QAAQ,EAAE,CAAC;YACX,SAAS,EAAE,KAAK;YAChB,SAAS,EAAE,KAAK;YAChB,WAAW,EAAE,KAAK;SACnB,CAAA;QAED,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,YAAY,CAAC,CAAA;QACxC,IAAI,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAA;IACnC,CAAC;IAED;;OAEG;IACH,qBAAqB,CAAC,SAAiB,EAAE,OAAgB;QACvD,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;QACxC,IAAI,CAAC,KAAK;YAAE,OAAM;QAElB,KAAK,CAAC,kBAAkB,GAAG,OAAO,CAAA;QAClC,IAAI,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAA;QACjC,IAAI,CAAC,eAAe,CAAC,SAAS,EAAE,KAAK,CAAC,CAAA;IACxC,CAAC;IAED;;OAEG;IACH,sBAAsB,CAAC,SAAiB,EAAE,OAAgB;QACxD,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;QACxC,IAAI,CAAC,KAAK;YAAE,OAAM;QAElB,KAAK,CAAC,mBAAmB,GAAG,OAAO,CAAA;QACnC,IAAI,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAA;QACjC,IAAI,CAAC,eAAe,CAAC,SAAS,EAAE,KAAK,CAAC,CAAA;IACxC,CAAC;IAED;;OAEG;IACH,kBAAkB,CAAC,SAAiB,EAAE,MAA4B;QAChE,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;QACxC,IAAI,CAAC,KAAK;YAAE,OAAM;QAElB,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;QAC5B,IAAI,CAAC,eAAe,CAAC,SAAS,EAAE,KAAK,CAAC,CAAA;IACxC,CAAC;IAED;;OAEG;IACK,iBAAiB,CAAC,SAAiB;QACzC,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;QACxC,IAAI,CAAC,KAAK;YAAE,OAAM;QAElB,qCAAqC;QACrC,KAAK,CAAC,eAAe,GAAG,KAAK,CAAC,kBAAkB,IAAI,KAAK,CAAC,mBAAmB,CAAA;QAE7E,eAAe;QACf,KAAK,CAAC,WAAW,GAAG,KAAK,CAAC,eAAe,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,IAAI,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,CAAA;IAC1F,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,SAAiB;QACxB,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;IACnC,CAAC;IAED;;OAEG;IACH,YAAY;QACV,OAAO,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IAC7B,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,SAAiB,EAAE,QAAsC;QACjE,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;YACnC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,GAAG,EAAE,CAAC,CAAA;QAC1C,CAAC;QAED,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;QAE5C,cAAc;QACd,OAAO,GAAG,EAAE;YACV,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;YAC/C,IAAI,SAAS,EAAE,CAAC;gBACd,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;YAC5B,CAAC;QACH,CAAC,CAAA;IACH,CAAC;IAED;;OAEG;IACH,eAAe,CAAC,SAAiB,EAAE,KAAkB;QACnD,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;QAC/C,IAAI,CAAC,SAAS;YAAE,OAAM;QAEtB,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;YAC3B,IAAI,CAAC;gBACH,QAAQ,CAAC,KAAK,CAAC,CAAA;YACjB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,aAAa,EAAE,CAAC;oBAC3C,OAAO,CAAC,KAAK,CAAC,yCAAyC,SAAS,GAAG,EAAE,KAAK,CAAC,CAAA;gBAC7E,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAA;IACJ,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAA;QACnB,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAA;IACxB,CAAC;IAED;;OAEG;IACH,YAAY,CAAC,SAAiB;QAC5B,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;QAC7B,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;IAClC,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,aAAa,EAAE,CAAC;YAC3C,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAA;YACxC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE;gBACvC,OAAO,CAAC,GAAG,CAAC,KAAK,SAAS,GAAG,EAAE;oBAC7B,kBAAkB,EAAE,KAAK,CAAC,kBAAkB;oBAC5C,mBAAmB,EAAE,KAAK,CAAC,mBAAmB;oBAC9C,eAAe,EAAE,KAAK,CAAC,eAAe;oBACtC,OAAO,EAAE,KAAK,CAAC,OAAO;oBACtB,UAAU,EAAE,KAAK,CAAC,UAAU;oBAC5B,WAAW,EAAE,KAAK,CAAC,WAAW;iBAC/B,CAAC,CAAA;YACJ,CAAC,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;CACF;AAED,WAAW;AACX,MAAM,CAAC,MAAM,kBAAkB,GAAG,IAAI,kBAAkB,EAAE,CAAA"}
@@ -0,0 +1,16 @@
1
+ import type { MotionPreset, PresetConfig, PageType, PageMotionsConfig } from '../types';
2
+ export declare const MOTION_PRESETS: PresetConfig;
3
+ export declare const PAGE_MOTIONS: Record<PageType, PageMotionsConfig>;
4
+ /**
5
+ * 프리셋과 커스텀 설정을 병합
6
+ */
7
+ export declare function mergeWithPreset(preset: MotionPreset, custom?: Partial<MotionPreset>): MotionPreset;
8
+ /**
9
+ * 페이지 타입으로 프리셋 가져오기
10
+ */
11
+ export declare function getPagePreset(pageType: PageType): PageMotionsConfig;
12
+ /**
13
+ * 모션 타입으로 기본 프리셋 가져오기
14
+ */
15
+ export declare function getMotionPreset(type: string): MotionPreset;
16
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/presets/index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAA;AAMvF,eAAO,MAAM,cAAc,EAAE,YA2C5B,CAAA;AAMD,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,QAAQ,EAAE,iBAAiB,CA4C5D,CAAA;AAMD;;GAEG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,YAAY,EACpB,MAAM,GAAE,OAAO,CAAC,YAAY,CAAM,GACjC,YAAY,CAKd;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,QAAQ,GAAG,iBAAiB,CAEnE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,CAE1D"}
@@ -0,0 +1,120 @@
1
+ // ========================================
2
+ // HUA Motion SDK - Preset System
3
+ // ========================================
4
+ // ========================================
5
+ // 기본 모션 프리셋
6
+ // ========================================
7
+ export const MOTION_PRESETS = {
8
+ hero: {
9
+ entrance: 'fadeIn',
10
+ delay: 200,
11
+ duration: 800,
12
+ hover: false,
13
+ click: false
14
+ },
15
+ title: {
16
+ entrance: 'slideUp',
17
+ delay: 400,
18
+ duration: 700,
19
+ hover: false,
20
+ click: false
21
+ },
22
+ button: {
23
+ entrance: 'scaleIn',
24
+ delay: 600,
25
+ duration: 300,
26
+ hover: true,
27
+ click: true
28
+ },
29
+ card: {
30
+ entrance: 'slideUp',
31
+ delay: 800,
32
+ duration: 500,
33
+ hover: true,
34
+ click: false
35
+ },
36
+ text: {
37
+ entrance: 'fadeIn',
38
+ delay: 200,
39
+ duration: 600,
40
+ hover: false,
41
+ click: false
42
+ },
43
+ image: {
44
+ entrance: 'scaleIn',
45
+ delay: 400,
46
+ duration: 600,
47
+ hover: true,
48
+ click: false
49
+ }
50
+ };
51
+ // ========================================
52
+ // 페이지별 프리셋 (1단계: useSimplePageMotion)
53
+ // ========================================
54
+ export const PAGE_MOTIONS = {
55
+ // 홈페이지
56
+ home: {
57
+ hero: { type: 'hero' },
58
+ title: { type: 'title' },
59
+ description: { type: 'text' },
60
+ cta: { type: 'button' },
61
+ feature1: { type: 'card' },
62
+ feature2: { type: 'card' },
63
+ feature3: { type: 'card' }
64
+ },
65
+ // 대시보드
66
+ dashboard: {
67
+ header: { type: 'hero' },
68
+ sidebar: { type: 'card', entrance: 'slideLeft' },
69
+ main: { type: 'text', entrance: 'fadeIn' },
70
+ card1: { type: 'card' },
71
+ card2: { type: 'card' },
72
+ card3: { type: 'card' },
73
+ chart: { type: 'image' }
74
+ },
75
+ // 제품 페이지
76
+ product: {
77
+ hero: { type: 'hero' },
78
+ title: { type: 'title' },
79
+ image: { type: 'image' },
80
+ description: { type: 'text' },
81
+ price: { type: 'text' },
82
+ buyButton: { type: 'button' },
83
+ features: { type: 'card' }
84
+ },
85
+ // 블로그
86
+ blog: {
87
+ header: { type: 'hero' },
88
+ title: { type: 'title' },
89
+ content: { type: 'text' },
90
+ sidebar: { type: 'card', entrance: 'slideRight' },
91
+ related1: { type: 'card' },
92
+ related2: { type: 'card' },
93
+ related3: { type: 'card' }
94
+ }
95
+ };
96
+ // ========================================
97
+ // 프리셋 유틸리티 함수
98
+ // ========================================
99
+ /**
100
+ * 프리셋과 커스텀 설정을 병합
101
+ */
102
+ export function mergeWithPreset(preset, custom = {}) {
103
+ return {
104
+ ...preset,
105
+ ...custom
106
+ };
107
+ }
108
+ /**
109
+ * 페이지 타입으로 프리셋 가져오기
110
+ */
111
+ export function getPagePreset(pageType) {
112
+ return PAGE_MOTIONS[pageType];
113
+ }
114
+ /**
115
+ * 모션 타입으로 기본 프리셋 가져오기
116
+ */
117
+ export function getMotionPreset(type) {
118
+ return MOTION_PRESETS[type] || MOTION_PRESETS.text;
119
+ }
120
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/presets/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,155 @@
1
+ import { RefObject, CSSProperties } from 'react';
2
+ export type MotionElement = HTMLDivElement | HTMLSpanElement | HTMLButtonElement | HTMLHeadingElement | HTMLParagraphElement | HTMLImageElement;
3
+ export type MotionRef<T extends MotionElement = HTMLDivElement> = RefObject<T | null>;
4
+ export type MotionStyle = CSSProperties & {
5
+ '--motion-delay'?: string;
6
+ '--motion-duration'?: string;
7
+ '--motion-easing'?: string;
8
+ '--motion-progress'?: string;
9
+ };
10
+ export interface BaseMotionOptions {
11
+ /** 모션 시작 지연 시간 (ms) */
12
+ delay?: number;
13
+ /** 모션 지속 시간 (ms) */
14
+ duration?: number;
15
+ /** Intersection Observer 임계값 (0-1) */
16
+ threshold?: number;
17
+ /** 한 번만 트리거할지 여부 */
18
+ triggerOnce?: boolean;
19
+ /** 이징 함수명 */
20
+ easing?: string;
21
+ /** 자동 시작 여부 */
22
+ autoStart?: boolean;
23
+ /** 모션 완료 시 콜백 */
24
+ onComplete?: () => void;
25
+ /** 모션 시작 시 콜백 */
26
+ onStart?: () => void;
27
+ /** 모션 중단 시 콜백 */
28
+ onStop?: () => void;
29
+ /** 모션 리셋 시 콜백 */
30
+ onReset?: () => void;
31
+ }
32
+ export interface BaseMotionReturn<T extends MotionElement = HTMLDivElement> {
33
+ /** DOM 요소 참조 (React 19 호환) */
34
+ ref: React.RefObject<T | null>;
35
+ /** 요소가 화면에 보이는지 여부 */
36
+ isVisible: boolean;
37
+ /** 모션이 진행 중인지 여부 */
38
+ isAnimating: boolean;
39
+ /** 적용할 CSS 스타일 (React 19 호환) - useFadeIn 등에서는 항상 반환됨 */
40
+ style: MotionStyle;
41
+ /** 적용할 CSS 클래스명 */
42
+ className?: string;
43
+ /** 모션 진행률 (0-1) - useFadeIn 등에서는 항상 반환됨 */
44
+ progress: number;
45
+ /** 모션 시작 함수 - useFadeIn 등에서는 항상 반환됨 */
46
+ start: () => void;
47
+ /** 모션 리셋 함수 - useFadeIn 등에서는 항상 반환됨 */
48
+ reset: () => void;
49
+ /** 모션 중단 함수 - useFadeIn 등에서는 항상 반환됨 */
50
+ stop: () => void;
51
+ /** 모션 일시정지 함수 - 일부 훅에서만 제공 */
52
+ pause?: () => void;
53
+ /** 모션 재개 함수 - 일부 훅에서만 제공 */
54
+ resume?: () => void;
55
+ }
56
+ export interface InteractionReturn<T extends MotionElement = HTMLDivElement> extends BaseMotionReturn<T> {
57
+ /** 가시성 토글 함수 */
58
+ toggle?: () => void;
59
+ /** 표시 함수 */
60
+ show?: () => void;
61
+ /** 숨김 함수 */
62
+ hide?: () => void;
63
+ }
64
+ export interface FadeInOptions extends BaseMotionOptions {
65
+ /** 초기 투명도 */
66
+ initialOpacity?: number;
67
+ /** 목표 투명도 */
68
+ targetOpacity?: number;
69
+ }
70
+ export interface SlideOptions extends BaseMotionOptions {
71
+ /** 슬라이드 방향 */
72
+ direction?: 'up' | 'down' | 'left' | 'right';
73
+ /** 슬라이드 거리 (px) */
74
+ distance?: number;
75
+ }
76
+ export interface ScaleOptions extends BaseMotionOptions {
77
+ /** 초기 스케일 */
78
+ initialScale?: number;
79
+ /** 목표 스케일 */
80
+ targetScale?: number;
81
+ }
82
+ export interface BounceOptions extends BaseMotionOptions {
83
+ /** 바운스 강도 */
84
+ intensity?: number;
85
+ /** 바운스 횟수 */
86
+ bounces?: number;
87
+ }
88
+ export interface PulseOptions extends BaseMotionOptions {
89
+ /** 펄스 강도 */
90
+ intensity?: number;
91
+ /** 반복 횟수 (-1 = 무한) */
92
+ repeatCount?: number;
93
+ /** 반복 간격 (ms) */
94
+ repeatDelay?: number;
95
+ }
96
+ export interface SpringOptions extends BaseMotionOptions {
97
+ /** 스프링 질량 */
98
+ mass?: number;
99
+ /** 스프링 강성 */
100
+ stiffness?: number;
101
+ /** 스프링 감쇠 */
102
+ damping?: number;
103
+ /** 정지 임계값 */
104
+ restDelta?: number;
105
+ /** 정지 속도 */
106
+ restSpeed?: number;
107
+ }
108
+ export interface GestureOptions extends BaseMotionOptions {
109
+ /** 호버 제스처 활성화 */
110
+ hover?: boolean;
111
+ /** 드래그 제스처 활성화 */
112
+ drag?: boolean;
113
+ /** 핀치 제스처 활성화 */
114
+ pinch?: boolean;
115
+ /** 스와이프 제스처 활성화 */
116
+ swipe?: boolean;
117
+ /** 틸트 제스처 활성화 */
118
+ tilt?: boolean;
119
+ }
120
+ export interface OrchestrationOptions extends BaseMotionOptions {
121
+ /** 모션 시퀀스 타입 */
122
+ sequence?: 'sequential' | 'parallel' | 'stagger';
123
+ /** 스태거 지연 시간 */
124
+ staggerDelay?: number;
125
+ /** 스태거 지속 시간 */
126
+ staggerDuration?: number;
127
+ }
128
+ export type MotionDirection = 'up' | 'down' | 'left' | 'right';
129
+ export type MotionEasing = 'linear' | 'ease-in' | 'ease-out' | 'ease-in-out' | 'bounce' | 'elastic';
130
+ export type MotionSequence = 'sequential' | 'parallel' | 'stagger';
131
+ export type MotionTrigger = 'scroll' | 'click' | 'hover' | 'focus' | 'auto';
132
+ export type MotionCallback = () => void;
133
+ export type MotionProgressCallback = (progress: number) => void;
134
+ export type MotionStateCallback<T extends MotionElement = HTMLDivElement> = (state: BaseMotionReturn<T>) => void;
135
+ export interface PerformanceMetrics {
136
+ /** 모션 시작 시간 */
137
+ startTime: number;
138
+ /** 모션 종료 시간 */
139
+ endTime?: number;
140
+ /** 총 지속 시간 */
141
+ duration: number;
142
+ /** FPS */
143
+ fps: number;
144
+ /** 메모리 사용량 */
145
+ memoryUsage?: number;
146
+ }
147
+ export interface MotionConfig {
148
+ /** 성능 모니터링 활성화 */
149
+ enablePerformanceMonitoring?: boolean;
150
+ /** 디버그 모드 활성화 */
151
+ debug?: boolean;
152
+ /** 로그 레벨 */
153
+ logLevel?: 'none' | 'error' | 'warn' | 'info' | 'debug';
154
+ }
155
+ //# sourceMappingURL=common.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../src/types/common.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ // ========================================
2
+ // HUA Motion SDK - 공통 타입 정의 (React 19 호환)
3
+ // ========================================
4
+ export {};
5
+ //# sourceMappingURL=common.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"common.js","sourceRoot":"","sources":["../../src/types/common.ts"],"names":[],"mappings":"AAAA,2CAA2C;AAC3C,0CAA0C;AAC1C,2CAA2C"}
@@ -1,109 +1,77 @@
1
- import { RefObject, CSSProperties } from 'react';
2
- export type MotionElement = HTMLDivElement | HTMLSpanElement | HTMLButtonElement | HTMLHeadingElement | HTMLParagraphElement | HTMLImageElement;
3
- export type MotionRef<T extends MotionElement = HTMLDivElement> = RefObject<T | null>;
4
- export type MotionStyle = CSSProperties & {
5
- '--motion-delay'?: string;
6
- '--motion-duration'?: string;
7
- '--motion-easing'?: string;
8
- '--motion-progress'?: string;
9
- };
10
- export interface BaseMotionOptions {
11
- /** 모션 시작 지연 시간 (ms) */
1
+ import { BaseMotionOptions, BaseMotionReturn } from './common';
2
+ export * from './common';
3
+ export type PageType = 'home' | 'dashboard' | 'product' | 'blog';
4
+ export type MotionType = 'hero' | 'title' | 'button' | 'card' | 'text' | 'image';
5
+ export type EntranceType = 'fadeIn' | 'slideUp' | 'slideLeft' | 'slideRight' | 'scaleIn' | 'bounceIn';
6
+ export interface PageMotionElement {
7
+ type: MotionType;
8
+ entrance?: EntranceType;
9
+ hover?: boolean;
10
+ click?: boolean;
12
11
  delay?: number;
13
- /** 모션 지속 시간 (ms) */
14
12
  duration?: number;
15
- /** Intersection Observer 임계값 (0-1) */
16
13
  threshold?: number;
17
- /** 한 번만 트리거할지 여부 */
18
- triggerOnce?: boolean;
19
- /** 이징 함수명 */
20
- easing?: string;
21
- /** 자동 시작 여부 */
22
- autoStart?: boolean;
23
- /** 모션 완료 시 콜백 */
24
- onComplete?: () => void;
25
- /** 모션 시작 시 콜백 */
26
- onStart?: () => void;
27
- /** 모션 중단 시 콜백 */
28
- onStop?: () => void;
29
- /** 모션 리셋 시 콜백 */
30
- onReset?: () => void;
31
14
  }
32
- export interface BaseMotionReturn<T extends MotionElement = HTMLDivElement> {
33
- /** DOM 요소 참조 */
34
- ref: MotionRef<T>;
35
- /** 요소가 화면에 보이는지 여부 */
36
- isVisible: boolean;
37
- /** 모션이 진행 중인지 여부 */
15
+ export interface PageMotionsConfig {
16
+ [elementId: string]: PageMotionElement;
17
+ }
18
+ export interface MotionState {
19
+ internalVisibility: boolean;
20
+ triggeredVisibility: boolean;
21
+ finalVisibility: boolean;
22
+ opacity: number;
23
+ translateY: number;
24
+ translateX: number;
25
+ scale: number;
26
+ rotation: number;
27
+ isHovered: boolean;
28
+ isClicked: boolean;
38
29
  isAnimating: boolean;
39
- /** 적용할 CSS 스타일 */
40
- style?: MotionStyle;
41
- /** 적용할 CSS 클래스명 */
42
- className?: string;
43
- /** 모션 진행률 (0-1) */
44
- progress?: number;
45
- /** 모션 시작 함수 */
46
- start?: () => void;
47
- /** 모션 리셋 함수 */
48
- reset?: () => void;
49
- /** 모션 중단 함수 */
50
- stop?: () => void;
51
- /** 모션 일시정지 함수 */
52
- pause?: () => void;
53
- /** 모션 재개 함수 */
54
- resume?: () => void;
55
- /** 모션 토글 함수 (선택적) */
56
- toggle?: () => void;
57
30
  }
58
- export interface InteractionReturn<T extends MotionElement = HTMLDivElement> extends BaseMotionReturn<T> {
59
- start: () => void;
31
+ export interface MotionRef<T extends HTMLElement = HTMLElement> {
32
+ ref: React.RefObject<T | null>;
33
+ style: React.CSSProperties;
60
34
  isVisible: boolean;
61
- focus?: () => void;
62
- blur?: () => void;
63
- hover?: () => void;
64
- leave?: () => void;
65
- click?: () => void;
66
- release?: () => void;
67
- show?: () => void;
68
- hide?: () => void;
69
- isFocused?: boolean;
70
- isHovered?: boolean;
71
- isClicked?: boolean;
35
+ isHovered: boolean;
36
+ isClicked: boolean;
37
+ }
38
+ export interface SmartMotionOptions<T extends HTMLElement = HTMLElement> extends BaseMotionOptions {
39
+ type?: MotionType;
40
+ entrance?: EntranceType;
41
+ hover?: boolean;
42
+ click?: boolean;
43
+ }
44
+ export interface SmartMotionReturn<T extends HTMLElement = HTMLElement> extends BaseMotionReturn<T> {
45
+ isHovered: boolean;
46
+ isClicked: boolean;
72
47
  }
73
- export interface FadeInOptions extends BaseMotionOptions {
74
- /** 초기 투명도 */
75
- initialOpacity?: number;
76
- /** 목표 투명도 */
77
- targetOpacity?: number;
48
+ export interface MotionPreset {
49
+ entrance: EntranceType;
50
+ delay: number;
51
+ duration: number;
52
+ hover: boolean;
53
+ click: boolean;
78
54
  }
79
- export interface SlideOptions extends BaseMotionOptions {
80
- /** 슬라이드 방향 */
81
- direction?: 'up' | 'down' | 'left' | 'right';
82
- /** 슬라이드 거리 (px) */
83
- distance?: number;
55
+ export interface PresetConfig {
56
+ [key: string]: MotionPreset;
84
57
  }
85
- export interface ScaleOptions extends BaseMotionOptions {
86
- /** 초기 스케일 */
87
- initialScale?: number;
88
- /** 목표 스케일 */
89
- targetScale?: number;
58
+ export interface SpringConfig {
59
+ mass?: number;
60
+ stiffness?: number;
61
+ damping?: number;
62
+ restDelta?: number;
63
+ restSpeed?: number;
90
64
  }
91
- export interface BounceOptions extends BaseMotionOptions {
92
- /** 바운스 높이 (px) */
93
- bounceHeight?: number;
94
- /** 바운스 횟수 */
95
- bounceCount?: number;
65
+ export interface GestureConfig {
66
+ hover?: boolean;
67
+ drag?: boolean;
68
+ pinch?: boolean;
69
+ swipe?: boolean;
70
+ tilt?: boolean;
96
71
  }
97
- export interface PulseOptions extends BaseMotionOptions {
98
- /** 펄스 스케일 */
99
- pulseScale?: number;
100
- /** 반복 횟수 */
101
- pulseCount?: number;
72
+ export interface OrchestrationConfig {
73
+ sequence?: 'sequential' | 'parallel' | 'stagger';
74
+ staggerDelay?: number;
75
+ staggerDuration?: number;
102
76
  }
103
- export type MotionDirection = 'up' | 'down' | 'left' | 'right';
104
- export type MotionEasing = 'linear' | 'ease-in' | 'ease-out' | 'ease-in-out';
105
- export type MotionTrigger = 'scroll' | 'click' | 'hover' | 'focus' | 'auto';
106
- export type MotionCallback = () => void;
107
- export type MotionProgressCallback = (progress: number) => void;
108
- export type MotionStateCallback<T extends MotionElement = HTMLDivElement> = (state: BaseMotionReturn<T>) => void;
109
77
  //# sourceMappingURL=index.d.ts.map