santycss 1.1.0 → 1.2.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.
@@ -1,519 +1,829 @@
1
- /* ═══════════════════════════════════════════════════════════════════════
2
- SANTY ANIMATIONS — animate.css compatible · Plain-English naming
3
- ═══════════════════════════════════════════════════════════════════════ */
4
-
5
- /* ── Speed helpers ── */
6
- .animation-speed-fastest { animation-duration: 0.3s !important; }
7
- .animation-speed-fast { animation-duration: 0.5s !important; }
8
- .animation-speed-normal { animation-duration: 1s !important; }
9
- .animation-speed-slow { animation-duration: 1.5s !important; }
10
- .animation-speed-slowest { animation-duration: 2s !important; }
11
- .animation-speed-glacial { animation-duration: 3s !important; }
12
-
13
- /* ── Delay helpers ── */
14
- .animation-delay-100 { animation-delay: 0.1s; }
15
- .animation-delay-200 { animation-delay: 0.2s; }
16
- .animation-delay-300 { animation-delay: 0.3s; }
17
- .animation-delay-400 { animation-delay: 0.4s; }
18
- .animation-delay-500 { animation-delay: 0.5s; }
19
- .animation-delay-600 { animation-delay: 0.6s; }
20
- .animation-delay-700 { animation-delay: 0.7s; }
21
- .animation-delay-800 { animation-delay: 0.8s; }
22
- .animation-delay-900 { animation-delay: 0.9s; }
23
- .animation-delay-1000 { animation-delay: 1s; }
24
- .animation-delay-1500 { animation-delay: 1.5s; }
25
- .animation-delay-2000 { animation-delay: 2s; }
26
- .animation-delay-3000 { animation-delay: 3s; }
27
-
28
- /* ── Iteration helpers ── */
29
- .animation-loop-1 { animation-iteration-count: 1; }
30
- .animation-loop-2 { animation-iteration-count: 2; }
31
- .animation-loop-3 { animation-iteration-count: 3; }
32
- .animation-loop-4 { animation-iteration-count: 4; }
33
- .animation-loop-5 { animation-iteration-count: 5; }
34
- .animation-loop-forever { animation-iteration-count: infinite; }
35
-
36
- /* ── Fill-mode helpers ── */
37
- .animation-fill-none { animation-fill-mode: none; }
38
- .animation-fill-forwards { animation-fill-mode: forwards; }
39
- .animation-fill-backwards { animation-fill-mode: backwards; }
40
- .animation-fill-both { animation-fill-mode: both; }
41
-
42
- /* ── Timing-function helpers ── */
43
- .animation-ease { animation-timing-function: ease; }
44
- .animation-ease-in { animation-timing-function: ease-in; }
45
- .animation-ease-out { animation-timing-function: ease-out; }
46
- .animation-ease-in-out { animation-timing-function: ease-in-out; }
47
- .animation-linear { animation-timing-function: linear; }
48
-
49
- /* ── Pause / play ── */
50
- .animation-paused { animation-play-state: paused; }
51
- .animation-running{ animation-play-state: running; }
52
- .animation-none { animation: none; }
53
-
54
- /* ════════════════════════════════════════════════════
55
- ATTENTION SEEKERS
56
- Keep looping or use once (add animation-loop-1)
57
- ════════════════════════════════════════════════════ */
58
- .animate-flash { animation: santy-flash 1s ease both; }
59
- .animate-rubber-band { animation: santy-rubber-band 1s ease both; }
60
- .animate-shake-x { animation: santy-shake-x 1s ease both; }
61
- .animate-shake-y { animation: santy-shake-y 1s ease both; }
62
- .animate-shake-head { animation: santy-shake-head 1s ease-in-out both; }
63
- .animate-swing { animation: santy-swing 1s ease both; transform-origin: top center; }
64
- .animate-tada { animation: santy-tada 1s ease both; }
65
- .animate-wobble { animation: santy-wobble 1s ease both; }
66
- .animate-jelly { animation: santy-jelly 1s ease both; }
67
- .animate-heartbeat { animation: santy-heartbeat 1.3s ease-in-out both; }
68
-
69
- /* ════════════════════════════════════════════════════
70
- FADING ENTRANCES
71
- ════════════════════════════════════════════════════ */
72
- .animate-fade-in { animation: santy-fade-in 0.5s ease both; }
73
- .animate-fade-in-from-top { animation: santy-fade-in-from-top 0.5s ease both; }
74
- .animate-fade-in-from-bottom { animation: santy-fade-in-from-bottom 0.5s ease both; }
75
- .animate-fade-in-from-left { animation: santy-fade-in-from-left 0.5s ease both; }
76
- .animate-fade-in-from-right { animation: santy-fade-in-from-right 0.5s ease both; }
77
- .animate-fade-in-top-left { animation: santy-fade-in-top-left 0.5s ease both; }
78
- .animate-fade-in-top-right { animation: santy-fade-in-top-right 0.5s ease both; }
79
- .animate-fade-in-bottom-left { animation: santy-fade-in-bottom-left 0.5s ease both; }
80
- .animate-fade-in-bottom-right { animation: santy-fade-in-bottom-right 0.5s ease both; }
81
-
82
- /* ════════════════════════════════════════════════════
83
- FADING EXITS
84
- ════════════════════════════════════════════════════ */
85
- .animate-fade-out { animation: santy-fade-out 0.5s ease both; }
86
- .animate-fade-out-to-top { animation: santy-fade-out-to-top 0.5s ease both; }
87
- .animate-fade-out-to-bottom { animation: santy-fade-out-to-bottom 0.5s ease both; }
88
- .animate-fade-out-to-left { animation: santy-fade-out-to-left 0.5s ease both; }
89
- .animate-fade-out-to-right { animation: santy-fade-out-to-right 0.5s ease both; }
90
- .animate-fade-out-top-left { animation: santy-fade-out-top-left 0.5s ease both; }
91
- .animate-fade-out-top-right { animation: santy-fade-out-top-right 0.5s ease both; }
92
- .animate-fade-out-bottom-left { animation: santy-fade-out-bottom-left 0.5s ease both; }
93
- .animate-fade-out-bottom-right { animation: santy-fade-out-bottom-right 0.5s ease both; }
94
-
95
- /* ════════════════════════════════════════════════════
96
- BOUNCING ENTRANCES
97
- ════════════════════════════════════════════════════ */
98
- .animate-bounce-in { animation: santy-bounce-in 0.75s ease both; }
99
- .animate-bounce-in-from-top { animation: santy-bounce-in-from-top 0.75s ease both; }
100
- .animate-bounce-in-from-bottom { animation: santy-bounce-in-from-bottom 0.75s ease both; }
101
- .animate-bounce-in-from-left { animation: santy-bounce-in-from-left 0.75s ease both; }
102
- .animate-bounce-in-from-right { animation: santy-bounce-in-from-right 0.75s ease both; }
103
-
104
- /* ════════════════════════════════════════════════════
105
- BOUNCING EXITS
106
- ════════════════════════════════════════════════════ */
107
- .animate-bounce-out { animation: santy-bounce-out 0.75s ease both; }
108
- .animate-bounce-out-to-top { animation: santy-bounce-out-to-top 0.75s ease both; }
109
- .animate-bounce-out-to-bottom { animation: santy-bounce-out-to-bottom 0.75s ease both; }
110
- .animate-bounce-out-to-left { animation: santy-bounce-out-to-left 0.75s ease both; }
111
- .animate-bounce-out-to-right { animation: santy-bounce-out-to-right 0.75s ease both; }
112
-
113
- /* ════════════════════════════════════════════════════
114
- SLIDING ENTRANCES
115
- ════════════════════════════════════════════════════ */
116
- .animate-slide-in-from-top { animation: santy-slide-in-from-top 0.4s ease both; }
117
- .animate-slide-in-from-bottom { animation: santy-slide-in-from-bottom 0.4s ease both; }
118
- .animate-slide-in-from-left { animation: santy-slide-in-from-left 0.4s ease both; }
119
- .animate-slide-in-from-right { animation: santy-slide-in-from-right 0.4s ease both; }
120
-
121
- /* ════════════════════════════════════════════════════
122
- SLIDING EXITS
123
- ════════════════════════════════════════════════════ */
124
- .animate-slide-out-to-top { animation: santy-slide-out-to-top 0.4s ease both; }
125
- .animate-slide-out-to-bottom { animation: santy-slide-out-to-bottom 0.4s ease both; }
126
- .animate-slide-out-to-left { animation: santy-slide-out-to-left 0.4s ease both; }
127
- .animate-slide-out-to-right { animation: santy-slide-out-to-right 0.4s ease both; }
128
-
129
- /* ════════════════════════════════════════════════════
130
- ZOOMING ENTRANCES
131
- ════════════════════════════════════════════════════ */
132
- .animate-zoom-in { animation: santy-zoom-in 0.3s ease both; }
133
- .animate-zoom-in-from-top { animation: santy-zoom-in-from-top 0.5s ease both; }
134
- .animate-zoom-in-from-bottom { animation: santy-zoom-in-from-bottom 0.5s ease both; }
135
- .animate-zoom-in-from-left { animation: santy-zoom-in-from-left 0.5s ease both; }
136
- .animate-zoom-in-from-right { animation: santy-zoom-in-from-right 0.5s ease both; }
137
-
138
- /* ════════════════════════════════════════════════════
139
- ZOOMING EXITS
140
- ════════════════════════════════════════════════════ */
141
- .animate-zoom-out { animation: santy-zoom-out 0.3s ease both; }
142
- .animate-zoom-out-to-top { animation: santy-zoom-out-to-top 0.5s ease both; }
143
- .animate-zoom-out-to-bottom { animation: santy-zoom-out-to-bottom 0.5s ease both; }
144
- .animate-zoom-out-to-left { animation: santy-zoom-out-to-left 0.5s ease both; }
145
- .animate-zoom-out-to-right { animation: santy-zoom-out-to-right 0.5s ease both; }
146
-
147
- /* ════════════════════════════════════════════════════
148
- FLIPPING
149
- ════════════════════════════════════════════════════ */
150
- .animate-flip { animation: santy-flip 1s ease both; backface-visibility: visible !important; }
151
- .animate-flip-in-x { animation: santy-flip-in-x 0.75s ease both; backface-visibility: visible !important; }
152
- .animate-flip-in-y { animation: santy-flip-in-y 0.75s ease both; backface-visibility: visible !important; }
153
- .animate-flip-out-x { animation: santy-flip-out-x 0.75s ease both; backface-visibility: visible !important; }
154
- .animate-flip-out-y { animation: santy-flip-out-y 0.75s ease both; backface-visibility: visible !important; }
155
-
156
- /* ════════════════════════════════════════════════════
157
- ROTATING ENTRANCES
158
- ════════════════════════════════════════════════════ */
159
- .animate-rotate-in { animation: santy-rotate-in 0.6s ease both; }
160
- .animate-rotate-in-from-top-left { animation: santy-rotate-in-from-top-left 0.6s ease both; transform-origin: left top; }
161
- .animate-rotate-in-from-top-right { animation: santy-rotate-in-from-top-right 0.6s ease both; transform-origin: right top; }
162
- .animate-rotate-in-from-bottom-left { animation: santy-rotate-in-from-bottom-left 0.6s ease both; transform-origin: left bottom; }
163
- .animate-rotate-in-from-bottom-right { animation: santy-rotate-in-from-bottom-right 0.6s ease both; transform-origin: right bottom; }
164
-
165
- /* ════════════════════════════════════════════════════
166
- ROTATING EXITS
167
- ════════════════════════════════════════════════════ */
168
- .animate-rotate-out { animation: santy-rotate-out 0.6s ease both; }
169
- .animate-rotate-out-to-top-left { animation: santy-rotate-out-to-top-left 0.6s ease both; transform-origin: left top; }
170
- .animate-rotate-out-to-top-right { animation: santy-rotate-out-to-top-right 0.6s ease both; transform-origin: right top; }
171
- .animate-rotate-out-to-bottom-left { animation: santy-rotate-out-to-bottom-left 0.6s ease both; transform-origin: left bottom; }
172
- .animate-rotate-out-to-bottom-right { animation: santy-rotate-out-to-bottom-right 0.6s ease both; transform-origin: right bottom; }
173
-
174
- /* ════════════════════════════════════════════════════
175
- BACK ENTRANCES (scale from afar)
176
- ════════════════════════════════════════════════════ */
177
- .animate-back-in-from-top { animation: santy-back-in-from-top 0.7s ease both; }
178
- .animate-back-in-from-bottom { animation: santy-back-in-from-bottom 0.7s ease both; }
179
- .animate-back-in-from-left { animation: santy-back-in-from-left 0.7s ease both; }
180
- .animate-back-in-from-right { animation: santy-back-in-from-right 0.7s ease both; }
181
-
182
- /* ════════════════════════════════════════════════════
183
- BACK EXITS
184
- ════════════════════════════════════════════════════ */
185
- .animate-back-out-to-top { animation: santy-back-out-to-top 0.7s ease both; }
186
- .animate-back-out-to-bottom { animation: santy-back-out-to-bottom 0.7s ease both; }
187
- .animate-back-out-to-left { animation: santy-back-out-to-left 0.7s ease both; }
188
- .animate-back-out-to-right { animation: santy-back-out-to-right 0.7s ease both; }
189
-
190
- /* ════════════════════════════════════════════════════
191
- LIGHT SPEED (skew + slide)
192
- ════════════════════════════════════════════════════ */
193
- .animate-speed-in-from-left { animation: santy-speed-in-from-left 0.5s ease-out both; }
194
- .animate-speed-in-from-right { animation: santy-speed-in-from-right 0.5s ease-out both; }
195
- .animate-speed-out-to-left { animation: santy-speed-out-to-left 0.5s ease-in both; }
196
- .animate-speed-out-to-right { animation: santy-speed-out-to-right 0.5s ease-in both; }
197
-
198
- /* ════════════════════════════════════════════════════
199
- SPECIALS
200
- ════════════════════════════════════════════════════ */
201
- .animate-hinge { animation: santy-hinge 2s ease both; transform-origin: top left; }
202
- .animate-jack-in-box { animation: santy-jack-in-box 1s ease both; transform-origin: center bottom; }
203
- .animate-roll-in { animation: santy-roll-in 0.6s ease both; }
204
- .animate-roll-out { animation: santy-roll-out 0.6s ease both; }
205
-
206
- /* ── Original utilities (kept for backwards compat) ── */
207
- .animate-spin { animation: santy-spin 1s linear infinite; }
208
- .animate-ping { animation: santy-ping 1s cubic-bezier(0,0,.2,1) infinite; }
209
- .animate-pulse { animation: santy-pulse 2s cubic-bezier(.4,0,.6,1) infinite; }
210
- .animate-bounce { animation: santy-bounce 1s infinite; }
211
- .animate-slide-up { animation: santy-slide-in-from-bottom 0.4s ease both; }
212
- .animate-slide-down { animation: santy-slide-in-from-top 0.4s ease both; }
213
- .animate-zoom-in { animation: santy-zoom-in 0.3s ease both; }
214
- .animate-zoom-out { animation: santy-zoom-out 0.3s ease both; }
215
-
216
- /* ═══════════════════════════════════════════════════════════════════════
217
- KEYFRAMES
218
- ═══════════════════════════════════════════════════════════════════════ */
219
-
220
- /* ── Core ── */
221
- @keyframes santy-spin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } }
222
- @keyframes santy-ping { 75%, 100% { transform: scale(2); opacity: 0; } }
223
- @keyframes santy-pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.5; } }
224
- @keyframes santy-bounce { 0%, 100% { transform: translateY(-25%); animation-timing-function: cubic-bezier(.8,0,1,1); } 50% { transform: translateY(0); animation-timing-function: cubic-bezier(0,0,.2,1); } }
225
- @keyframes santy-skeleton{ 0% { background-position: 200% 0; } 100% { background-position: -200% 0; } }
226
-
227
- /* ── Attention Seekers ── */
228
- @keyframes santy-flash {
229
- from, 50%, to { opacity: 1; }
230
- 25%, 75% { opacity: 0; }
231
- }
232
- @keyframes santy-rubber-band {
233
- from { transform: scale3d(1, 1, 1); }
234
- 30% { transform: scale3d(1.25, .75, 1); }
235
- 40% { transform: scale3d(.75, 1.25, 1); }
236
- 50% { transform: scale3d(1.15, .85, 1); }
237
- 65% { transform: scale3d(.95, 1.05, 1); }
238
- 75% { transform: scale3d(1.05, .95, 1); }
239
- to { transform: scale3d(1, 1, 1); }
240
- }
241
- @keyframes santy-shake-x {
242
- from, to { transform: translate3d(0, 0, 0); }
243
- 10%, 30%, 50%, 70%, 90% { transform: translate3d(-10px, 0, 0); }
244
- 20%, 40%, 60%, 80% { transform: translate3d(10px, 0, 0); }
245
- }
246
- @keyframes santy-shake-y {
247
- from, to { transform: translate3d(0, 0, 0); }
248
- 10%, 30%, 50%, 70%, 90% { transform: translate3d(0, -10px, 0); }
249
- 20%, 40%, 60%, 80% { transform: translate3d(0, 10px, 0); }
250
- }
251
- @keyframes santy-shake-head {
252
- 0% { transform: rotateY(0deg); }
253
- 6.5% { transform: rotateY(-9deg); }
254
- 18.5% { transform: rotateY(7deg); }
255
- 31.5% { transform: rotateY(-5deg); }
256
- 43.5% { transform: rotateY(3deg); }
257
- 50% { transform: rotateY(0deg); }
258
- }
259
- @keyframes santy-swing {
260
- 20% { transform: rotate3d(0, 0, 1, 15deg); }
261
- 40% { transform: rotate3d(0, 0, 1, -10deg); }
262
- 60% { transform: rotate3d(0, 0, 1, 5deg); }
263
- 80% { transform: rotate3d(0, 0, 1, -5deg); }
264
- to { transform: rotate3d(0, 0, 1, 0deg); }
265
- }
266
- @keyframes santy-tada {
267
- from { transform: scale3d(1, 1, 1); }
268
- 10%, 20% { transform: scale3d(.9, .9, .9) rotate3d(0, 0, 1, -3deg); }
269
- 30%, 50%, 70%, 90% { transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg); }
270
- 40%, 60%, 80% { transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg); }
271
- to { transform: scale3d(1, 1, 1); }
272
- }
273
- @keyframes santy-wobble {
274
- from { transform: translate3d(0, 0, 0); }
275
- 15% { transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg); }
276
- 30% { transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg); }
277
- 45% { transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg); }
278
- 60% { transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg); }
279
- 75% { transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg); }
280
- to { transform: translate3d(0, 0, 0); }
281
- }
282
- @keyframes santy-jelly {
283
- from, 11.1%, to { transform: translate3d(0, 0, 0); }
284
- 22.2% { transform: skewX(-12.5deg) skewY(-12.5deg); }
285
- 33.3% { transform: skewX(6.25deg) skewY(6.25deg); }
286
- 44.4% { transform: skewX(-3.125deg) skewY(-3.125deg); }
287
- 55.5% { transform: skewX(1.5625deg) skewY(1.5625deg); }
288
- 66.6% { transform: skewX(-.78125deg) skewY(-.78125deg); }
289
- 77.7% { transform: skewX(.390625deg) skewY(.390625deg); }
290
- 88.8% { transform: skewX(-.1953125deg) skewY(-.1953125deg); }
291
- }
292
- @keyframes santy-heartbeat {
293
- from { transform: scale(1); animation-timing-function: ease-out; }
294
- 10% { transform: scale(1.12); animation-timing-function: ease-in; }
295
- 17% { transform: scale(1.08); animation-timing-function: ease-out; }
296
- 33% { transform: scale(1.18); animation-timing-function: ease-in; }
297
- 45% { transform: scale(1); animation-timing-function: ease-out; }
298
- }
299
-
300
- /* ── Fade In ── */
301
- @keyframes santy-fade-in { from { opacity: 0; } to { opacity: 1; } }
302
- @keyframes santy-fade-in-from-top { from { opacity: 0; transform: translate3d(0, -30px, 0); } to { opacity: 1; transform: translate3d(0, 0, 0); } }
303
- @keyframes santy-fade-in-from-bottom { from { opacity: 0; transform: translate3d(0, 30px, 0); } to { opacity: 1; transform: translate3d(0, 0, 0); } }
304
- @keyframes santy-fade-in-from-left { from { opacity: 0; transform: translate3d(-30px, 0, 0); } to { opacity: 1; transform: translate3d(0, 0, 0); } }
305
- @keyframes santy-fade-in-from-right { from { opacity: 0; transform: translate3d( 30px, 0, 0); } to { opacity: 1; transform: translate3d(0, 0, 0); } }
306
- @keyframes santy-fade-in-top-left { from { opacity: 0; transform: translate3d(-30px, -30px, 0); } to { opacity: 1; transform: translate3d(0, 0, 0); } }
307
- @keyframes santy-fade-in-top-right { from { opacity: 0; transform: translate3d( 30px, -30px, 0); } to { opacity: 1; transform: translate3d(0, 0, 0); } }
308
- @keyframes santy-fade-in-bottom-left { from { opacity: 0; transform: translate3d(-30px, 30px, 0); } to { opacity: 1; transform: translate3d(0, 0, 0); } }
309
- @keyframes santy-fade-in-bottom-right { from { opacity: 0; transform: translate3d( 30px, 30px, 0); } to { opacity: 1; transform: translate3d(0, 0, 0); } }
310
-
311
- /* ── Fade Out ── */
312
- @keyframes santy-fade-out { from { opacity: 1; } to { opacity: 0; } }
313
- @keyframes santy-fade-out-to-top { from { opacity: 1; transform: translate3d(0, 0, 0); } to { opacity: 0; transform: translate3d(0, -30px, 0); } }
314
- @keyframes santy-fade-out-to-bottom { from { opacity: 1; transform: translate3d(0, 0, 0); } to { opacity: 0; transform: translate3d(0, 30px, 0); } }
315
- @keyframes santy-fade-out-to-left { from { opacity: 1; transform: translate3d(0, 0, 0); } to { opacity: 0; transform: translate3d(-30px, 0, 0); } }
316
- @keyframes santy-fade-out-to-right { from { opacity: 1; transform: translate3d(0, 0, 0); } to { opacity: 0; transform: translate3d( 30px, 0, 0); } }
317
- @keyframes santy-fade-out-top-left { from { opacity: 1; transform: translate3d(0, 0, 0); } to { opacity: 0; transform: translate3d(-30px, -30px, 0); } }
318
- @keyframes santy-fade-out-top-right { from { opacity: 1; transform: translate3d(0, 0, 0); } to { opacity: 0; transform: translate3d( 30px, -30px, 0); } }
319
- @keyframes santy-fade-out-bottom-left { from { opacity: 1; transform: translate3d(0, 0, 0); } to { opacity: 0; transform: translate3d(-30px, 30px, 0); } }
320
- @keyframes santy-fade-out-bottom-right { from { opacity: 1; transform: translate3d(0, 0, 0); } to { opacity: 0; transform: translate3d( 30px, 30px, 0); } }
321
-
322
- /* ── Bounce In ── */
323
- @keyframes santy-bounce-in {
324
- from,20%,40%,60%,80%,to { animation-timing-function: cubic-bezier(.215,.61,.355,1); }
325
- 0% { opacity: 0; transform: scale3d(.3, .3, .3); }
326
- 20% { transform: scale3d(1.1, 1.1, 1.1); }
327
- 40% { transform: scale3d(.9, .9, .9); }
328
- 60% { opacity: 1; transform: scale3d(1.03, 1.03, 1.03); }
329
- 80% { transform: scale3d(.97, .97, .97); }
330
- to { opacity: 1; transform: scale3d(1, 1, 1); }
331
- }
332
- @keyframes santy-bounce-in-from-top {
333
- from,60%,75%,90%,to { animation-timing-function: cubic-bezier(.215,.61,.355,1); }
334
- 0% { opacity: 0; transform: translate3d(0, -3000px, 0) scaleY(3); }
335
- 60% { opacity: 1; transform: translate3d(0, 25px, 0) scaleY(.9); }
336
- 75% { transform: translate3d(0, -10px, 0) scaleY(.95); }
337
- 90% { transform: translate3d(0, 5px, 0) scaleY(.985); }
338
- to { transform: translate3d(0, 0, 0); }
339
- }
340
- @keyframes santy-bounce-in-from-bottom {
341
- from,60%,75%,90%,to { animation-timing-function: cubic-bezier(.215,.61,.355,1); }
342
- 0% { opacity: 0; transform: translate3d(0, 3000px, 0) scaleY(5); }
343
- 60% { opacity: 1; transform: translate3d(0, -20px, 0) scaleY(.9); }
344
- 75% { transform: translate3d(0, 10px, 0) scaleY(.95); }
345
- 90% { transform: translate3d(0, -5px, 0) scaleY(.985); }
346
- to { transform: translate3d(0, 0, 0); }
347
- }
348
- @keyframes santy-bounce-in-from-left {
349
- from,60%,75%,90%,to { animation-timing-function: cubic-bezier(.215,.61,.355,1); }
350
- 0% { opacity: 0; transform: translate3d(-3000px, 0, 0) scaleX(3); }
351
- 60% { opacity: 1; transform: translate3d(25px, 0, 0) scaleX(1); }
352
- 75% { transform: translate3d(-10px, 0, 0) scaleX(.98); }
353
- 90% { transform: translate3d(5px, 0, 0) scaleX(.995); }
354
- to { transform: translate3d(0, 0, 0); }
355
- }
356
- @keyframes santy-bounce-in-from-right {
357
- from,60%,75%,90%,to { animation-timing-function: cubic-bezier(.215,.61,.355,1); }
358
- 0% { opacity: 0; transform: translate3d(3000px, 0, 0) scaleX(3); }
359
- 60% { opacity: 1; transform: translate3d(-25px, 0, 0) scaleX(1); }
360
- 75% { transform: translate3d(10px, 0, 0) scaleX(.98); }
361
- 90% { transform: translate3d(-5px, 0, 0) scaleX(.995); }
362
- to { transform: translate3d(0, 0, 0); }
363
- }
364
-
365
- /* ── Bounce Out ── */
366
- @keyframes santy-bounce-out {
367
- 20% { transform: scale3d(.9, .9, .9); }
368
- 50%,55% { opacity: 1; transform: scale3d(1.1, 1.1, 1.1); }
369
- to { opacity: 0; transform: scale3d(.3, .3, .3); }
370
- }
371
- @keyframes santy-bounce-out-to-top {
372
- 20% { transform: translate3d(0, -10px, 0) scaleY(.985); }
373
- 40%,45% { opacity: 1; transform: translate3d(0, 20px, 0) scaleY(.9); }
374
- to { opacity: 0; transform: translate3d(0, -2000px, 0) scaleY(3); }
375
- }
376
- @keyframes santy-bounce-out-to-bottom {
377
- 20% { transform: translate3d(0, 10px, 0) scaleY(.985); }
378
- 40%,45% { opacity: 1; transform: translate3d(0, -20px, 0) scaleY(.9); }
379
- to { opacity: 0; transform: translate3d(0, 2000px, 0) scaleY(5); }
380
- }
381
- @keyframes santy-bounce-out-to-left {
382
- 20% { opacity: 1; transform: translate3d(20px, 0, 0) scaleX(.9); }
383
- to { opacity: 0; transform: translate3d(-2000px, 0, 0) scaleX(2); }
384
- }
385
- @keyframes santy-bounce-out-to-right {
386
- 20% { opacity: 1; transform: translate3d(-20px, 0, 0) scaleX(.9); }
387
- to { opacity: 0; transform: translate3d(2000px, 0, 0) scaleX(2); }
388
- }
389
-
390
- /* ── Slide In ── */
391
- @keyframes santy-slide-in-from-top { from { visibility: visible; transform: translate3d(0, -100%, 0); } to { transform: translate3d(0, 0, 0); } }
392
- @keyframes santy-slide-in-from-bottom { from { visibility: visible; transform: translate3d(0, 100%, 0); } to { transform: translate3d(0, 0, 0); } }
393
- @keyframes santy-slide-in-from-left { from { visibility: visible; transform: translate3d(-100%, 0, 0); } to { transform: translate3d(0, 0, 0); } }
394
- @keyframes santy-slide-in-from-right { from { visibility: visible; transform: translate3d( 100%, 0, 0); } to { transform: translate3d(0, 0, 0); } }
395
-
396
- /* ── Slide Out ── */
397
- @keyframes santy-slide-out-to-top { from { transform: translate3d(0, 0, 0); } to { visibility: hidden; transform: translate3d(0, -100%, 0); } }
398
- @keyframes santy-slide-out-to-bottom { from { transform: translate3d(0, 0, 0); } to { visibility: hidden; transform: translate3d(0, 100%, 0); } }
399
- @keyframes santy-slide-out-to-left { from { transform: translate3d(0, 0, 0); } to { visibility: hidden; transform: translate3d(-100%, 0, 0); } }
400
- @keyframes santy-slide-out-to-right { from { transform: translate3d(0, 0, 0); } to { visibility: hidden; transform: translate3d( 100%, 0, 0); } }
401
-
402
- /* ── Zoom In ── */
403
- @keyframes santy-zoom-in { from { opacity: 0; transform: scale3d(.3, .3, .3); } 50% { opacity: 1; } }
404
- @keyframes santy-zoom-in-from-top {
405
- from { opacity: 0; transform: scale3d(.1,.1,.1) translate3d(0,-1000px,0); animation-timing-function: cubic-bezier(.55,.055,.675,.19); }
406
- 60% { opacity: 1; transform: scale3d(.475,.475,.475) translate3d(0,60px,0); animation-timing-function: cubic-bezier(.175,.885,.32,1); }
407
- }
408
- @keyframes santy-zoom-in-from-bottom {
409
- from { opacity: 0; transform: scale3d(.1,.1,.1) translate3d(0,1000px,0); animation-timing-function: cubic-bezier(.55,.055,.675,.19); }
410
- 60% { opacity: 1; transform: scale3d(.475,.475,.475) translate3d(0,-60px,0); animation-timing-function: cubic-bezier(.175,.885,.32,1); }
411
- }
412
- @keyframes santy-zoom-in-from-left {
413
- from { opacity: 0; transform: scale3d(.1,.1,.1) translate3d(-1000px,0,0); animation-timing-function: cubic-bezier(.55,.055,.675,.19); }
414
- 60% { opacity: 1; transform: scale3d(.475,.475,.475) translate3d(10px,0,0); animation-timing-function: cubic-bezier(.175,.885,.32,1); }
415
- }
416
- @keyframes santy-zoom-in-from-right {
417
- from { opacity: 0; transform: scale3d(.1,.1,.1) translate3d(1000px,0,0); animation-timing-function: cubic-bezier(.55,.055,.675,.19); }
418
- 60% { opacity: 1; transform: scale3d(.475,.475,.475) translate3d(-10px,0,0); animation-timing-function: cubic-bezier(.175,.885,.32,1); }
419
- }
420
-
421
- /* ── Zoom Out ── */
422
- @keyframes santy-zoom-out { from { opacity: 1; } 50% { opacity: 0; transform: scale3d(.3,.3,.3); } to { opacity: 0; } }
423
- @keyframes santy-zoom-out-to-top {
424
- 40% { opacity: 1; transform: scale3d(.475,.475,.475) translate3d(0,60px,0); animation-timing-function: cubic-bezier(.175,.885,.32,1); }
425
- to { opacity: 0; transform: scale3d(.1,.1,.1) translate3d(0,-2000px,0); animation-timing-function: cubic-bezier(.55,.055,.675,.19); }
426
- }
427
- @keyframes santy-zoom-out-to-bottom {
428
- 40% { opacity: 1; transform: scale3d(.475,.475,.475) translate3d(0,-60px,0); animation-timing-function: cubic-bezier(.175,.885,.32,1); }
429
- to { opacity: 0; transform: scale3d(.1,.1,.1) translate3d(0,2000px,0); animation-timing-function: cubic-bezier(.55,.055,.675,.19); }
430
- }
431
- @keyframes santy-zoom-out-to-left {
432
- 40% { opacity: 1; transform: scale3d(.475,.475,.475) translate3d(42px,0,0); animation-timing-function: cubic-bezier(.175,.885,.32,1); }
433
- to { opacity: 0; transform: scale3d(.1,.1,.1) translate3d(-2000px,0,0); animation-timing-function: cubic-bezier(.55,.055,.675,.19); }
434
- }
435
- @keyframes santy-zoom-out-to-right {
436
- 40% { opacity: 1; transform: scale3d(.475,.475,.475) translate3d(-42px,0,0); animation-timing-function: cubic-bezier(.175,.885,.32,1); }
437
- to { opacity: 0; transform: scale3d(.1,.1,.1) translate3d(2000px,0,0); animation-timing-function: cubic-bezier(.55,.055,.675,.19); }
438
- }
439
-
440
- /* ── Flip ── */
441
- @keyframes santy-flip {
442
- from { transform: perspective(400px) scale3d(1,1,1) rotate3d(0,1,0,-360deg); animation-timing-function: ease-out; }
443
- 40% { transform: perspective(400px) scale3d(1,1,.5) translate3d(0,0,150px) rotate3d(0,1,0,-190deg); animation-timing-function: ease-out; }
444
- 50% { transform: perspective(400px) scale3d(1,1,.5) translate3d(0,0,150px) rotate3d(0,1,0,-170deg); animation-timing-function: ease-in; }
445
- 80% { transform: perspective(400px) scale3d(.95,1,1) rotate3d(0,1,0,0deg); animation-timing-function: ease-in; }
446
- to { transform: perspective(400px) scale3d(1,1,1) rotate3d(0,1,0,0deg); animation-timing-function: ease-in; }
447
- }
448
- @keyframes santy-flip-in-x {
449
- from { transform: perspective(400px) rotate3d(1,0,0,90deg); animation-timing-function: ease-in; opacity: 0; }
450
- 40% { transform: perspective(400px) rotate3d(1,0,0,-20deg); animation-timing-function: ease-in; }
451
- 60% { transform: perspective(400px) rotate3d(1,0,0,10deg); opacity: 1; }
452
- 80% { transform: perspective(400px) rotate3d(1,0,0,-5deg); }
453
- to { transform: perspective(400px); }
454
- }
455
- @keyframes santy-flip-in-y {
456
- from { transform: perspective(400px) rotate3d(0,1,0,90deg); animation-timing-function: ease-in; opacity: 0; }
457
- 40% { transform: perspective(400px) rotate3d(0,1,0,-20deg); animation-timing-function: ease-in; }
458
- 60% { transform: perspective(400px) rotate3d(0,1,0,10deg); opacity: 1; }
459
- 80% { transform: perspective(400px) rotate3d(0,1,0,-5deg); }
460
- to { transform: perspective(400px); }
461
- }
462
- @keyframes santy-flip-out-x {
463
- from { transform: perspective(400px); }
464
- 30% { transform: perspective(400px) rotate3d(1,0,0,-20deg); opacity: 1; }
465
- to { transform: perspective(400px) rotate3d(1,0,0,90deg); opacity: 0; }
466
- }
467
- @keyframes santy-flip-out-y {
468
- from { transform: perspective(400px); }
469
- 30% { transform: perspective(400px) rotate3d(0,1,0,-15deg); opacity: 1; }
470
- to { transform: perspective(400px) rotate3d(0,1,0,90deg); opacity: 0; }
471
- }
472
-
473
- /* ── Rotate In ── */
474
- @keyframes santy-rotate-in { from { transform: rotate3d(0,0,1,-200deg); opacity: 0; } to { transform: translate3d(0,0,0); opacity: 1; } }
475
- @keyframes santy-rotate-in-from-top-left { from { transform: rotate3d(0,0,1,-45deg); opacity: 0; } to { transform: translate3d(0,0,0); opacity: 1; } }
476
- @keyframes santy-rotate-in-from-top-right { from { transform: rotate3d(0,0,1,45deg); opacity: 0; } to { transform: translate3d(0,0,0); opacity: 1; } }
477
- @keyframes santy-rotate-in-from-bottom-left { from { transform: rotate3d(0,0,1,45deg); opacity: 0; } to { transform: translate3d(0,0,0); opacity: 1; } }
478
- @keyframes santy-rotate-in-from-bottom-right { from { transform: rotate3d(0,0,1,-90deg); opacity: 0; } to { transform: translate3d(0,0,0); opacity: 1; } }
479
-
480
- /* ── Rotate Out ── */
481
- @keyframes santy-rotate-out { from { opacity: 1; } to { transform: rotate3d(0,0,1,200deg); opacity: 0; } }
482
- @keyframes santy-rotate-out-to-top-left { from { opacity: 1; } to { transform: rotate3d(0,0,1,-45deg); opacity: 0; } }
483
- @keyframes santy-rotate-out-to-top-right { from { opacity: 1; } to { transform: rotate3d(0,0,1,90deg); opacity: 0; } }
484
- @keyframes santy-rotate-out-to-bottom-left { from { opacity: 1; } to { transform: rotate3d(0,0,1,45deg); opacity: 0; } }
485
- @keyframes santy-rotate-out-to-bottom-right { from { opacity: 1; } to { transform: rotate3d(0,0,1,-45deg); opacity: 0; } }
486
-
487
- /* ── Back Entrances ── */
488
- @keyframes santy-back-in-from-top { 0% { transform: translateY(-1200px) scale(.7); opacity: .7; } 80% { transform: translateY(0) scale(.7); opacity: .7; } 100% { transform: scale(1); opacity: 1; } }
489
- @keyframes santy-back-in-from-bottom { 0% { transform: translateY( 1200px) scale(.7); opacity: .7; } 80% { transform: translateY(0) scale(.7); opacity: .7; } 100% { transform: scale(1); opacity: 1; } }
490
- @keyframes santy-back-in-from-left { 0% { transform: translateX(-2000px) scale(.7); opacity: .7; } 80% { transform: translateX(0) scale(.7); opacity: .7; } 100% { transform: scale(1); opacity: 1; } }
491
- @keyframes santy-back-in-from-right { 0% { transform: translateX( 2000px) scale(.7); opacity: .7; } 80% { transform: translateX(0) scale(.7); opacity: .7; } 100% { transform: scale(1); opacity: 1; } }
492
-
493
- /* ── Back Exits ── */
494
- @keyframes santy-back-out-to-top { 0% { transform: scale(1); opacity: 1; } 20% { transform: translateY(0) scale(.7); opacity: .7; } 100% { transform: translateY(-700px) scale(.7); opacity: .7; } }
495
- @keyframes santy-back-out-to-bottom { 0% { transform: scale(1); opacity: 1; } 20% { transform: translateY(0) scale(.7); opacity: .7; } 100% { transform: translateY( 700px) scale(.7); opacity: .7; } }
496
- @keyframes santy-back-out-to-left { 0% { transform: scale(1); opacity: 1; } 20% { transform: translateX(0) scale(.7); opacity: .7; } 100% { transform: translateX(-2000px) scale(.7); opacity: .7; } }
497
- @keyframes santy-back-out-to-right { 0% { transform: scale(1); opacity: 1; } 20% { transform: translateX(0) scale(.7); opacity: .7; } 100% { transform: translateX( 2000px) scale(.7); opacity: .7; } }
498
-
499
- /* ── Light Speed ── */
500
- @keyframes santy-speed-in-from-left { from { transform: translate3d(-100%,0,0) skewX(30deg); opacity: 0; } 60% { transform: skewX(-20deg); opacity: 1; } 80% { transform: skewX(5deg); } to { transform: translate3d(0,0,0); } }
501
- @keyframes santy-speed-in-from-right { from { transform: translate3d(100%,0,0) skewX(-30deg); opacity: 0; } 60% { transform: skewX(20deg); opacity: 1; } 80% { transform: skewX(-5deg); } to { transform: translate3d(0,0,0); } }
502
- @keyframes santy-speed-out-to-left { from { opacity: 1; } to { transform: translate3d(-100%,0,0) skewX(-30deg); opacity: 0; } }
503
- @keyframes santy-speed-out-to-right { from { opacity: 1; } to { transform: translate3d(100%,0,0) skewX(30deg); opacity: 0; } }
504
-
505
- /* ── Specials ── */
506
- @keyframes santy-hinge {
507
- 0% { animation-timing-function: ease-in-out; }
508
- 20%,60% { transform: rotate3d(0,0,1,80deg); animation-timing-function: ease-in-out; }
509
- 40%,80% { transform: rotate3d(0,0,1,60deg); animation-timing-function: ease-in-out; opacity: 1; }
510
- to { transform: translate3d(0,700px,0); opacity: 0; }
511
- }
512
- @keyframes santy-jack-in-box {
513
- from { opacity: 0; transform: scale(.1) rotate(30deg); }
514
- 50% { transform: rotate(-10deg); }
515
- 70% { transform: rotate(3deg); }
516
- to { opacity: 1; transform: scale(1); }
517
- }
518
- @keyframes santy-roll-in { from { opacity: 0; transform: translate3d(-100%,0,0) rotate3d(0,0,1,-120deg); } to { opacity: 1; transform: translate3d(0,0,0); } }
519
- @keyframes santy-roll-out { from { opacity: 1; } to { opacity: 0; transform: translate3d(100%,0,0) rotate3d(0,0,1,120deg); } }
1
+ /* ═══════════════════════════════════════════════════════════════════════
2
+ SANTY ANIMATIONS — animate.css compatible · Plain-English naming
3
+ ═══════════════════════════════════════════════════════════════════════ */
4
+
5
+ /* ── Speed helpers ── */
6
+ .animation-speed-fastest { animation-duration: 0.3s !important; }
7
+ .animation-speed-fast { animation-duration: 0.5s !important; }
8
+ .animation-speed-normal { animation-duration: 1s !important; }
9
+ .animation-speed-slow { animation-duration: 1.5s !important; }
10
+ .animation-speed-slowest { animation-duration: 2s !important; }
11
+ .animation-speed-glacial { animation-duration: 3s !important; }
12
+
13
+ /* ── Delay helpers ── */
14
+ .animation-delay-100 { animation-delay: 0.1s; }
15
+ .animation-delay-200 { animation-delay: 0.2s; }
16
+ .animation-delay-300 { animation-delay: 0.3s; }
17
+ .animation-delay-400 { animation-delay: 0.4s; }
18
+ .animation-delay-500 { animation-delay: 0.5s; }
19
+ .animation-delay-600 { animation-delay: 0.6s; }
20
+ .animation-delay-700 { animation-delay: 0.7s; }
21
+ .animation-delay-800 { animation-delay: 0.8s; }
22
+ .animation-delay-900 { animation-delay: 0.9s; }
23
+ .animation-delay-1000 { animation-delay: 1s; }
24
+ .animation-delay-1500 { animation-delay: 1.5s; }
25
+ .animation-delay-2000 { animation-delay: 2s; }
26
+ .animation-delay-3000 { animation-delay: 3s; }
27
+
28
+ /* ── Iteration helpers ── */
29
+ .animation-loop-1 { animation-iteration-count: 1; }
30
+ .animation-loop-2 { animation-iteration-count: 2; }
31
+ .animation-loop-3 { animation-iteration-count: 3; }
32
+ .animation-loop-4 { animation-iteration-count: 4; }
33
+ .animation-loop-5 { animation-iteration-count: 5; }
34
+ .animation-loop-forever { animation-iteration-count: infinite; }
35
+
36
+ /* ── Fill-mode helpers ── */
37
+ .animation-fill-none { animation-fill-mode: none; }
38
+ .animation-fill-forwards { animation-fill-mode: forwards; }
39
+ .animation-fill-backwards { animation-fill-mode: backwards; }
40
+ .animation-fill-both { animation-fill-mode: both; }
41
+
42
+ /* ── Timing-function helpers ── */
43
+ .animation-ease { animation-timing-function: ease; }
44
+ .animation-ease-in { animation-timing-function: ease-in; }
45
+ .animation-ease-out { animation-timing-function: ease-out; }
46
+ .animation-ease-in-out { animation-timing-function: ease-in-out; }
47
+ .animation-linear { animation-timing-function: linear; }
48
+ .animation-ease-bounce { animation-timing-function: cubic-bezier(0.34,1.56,0.64,1); }
49
+ .animation-ease-elastic { animation-timing-function: cubic-bezier(0.68,-0.55,0.265,1.55); }
50
+ .animation-ease-spring { animation-timing-function: cubic-bezier(0.175,0.885,0.32,1.275); }
51
+
52
+ /* ── Direction helpers ── */
53
+ .animation-direction-normal { animation-direction: normal; }
54
+ .animation-direction-reverse { animation-direction: reverse; }
55
+ .animation-direction-alternate { animation-direction: alternate; }
56
+ .animation-direction-alternate-reverse { animation-direction: alternate-reverse; }
57
+
58
+ /* ── Extra delay helpers ── */
59
+ .animation-delay-750 { animation-delay: 0.75s; }
60
+ .animation-delay-1250 { animation-delay: 1.25s; }
61
+ .animation-delay-1500 { animation-delay: 1.5s; }
62
+ .animation-delay-2500 { animation-delay: 2.5s; }
63
+ .animation-delay-3000 { animation-delay: 3s; }
64
+ .animation-delay-4000 { animation-delay: 4s; }
65
+ .animation-delay-5000 { animation-delay: 5s; }
66
+
67
+ /* ── Extra speed helpers ── */
68
+ .animation-speed-ultra-fast { animation-duration: 0.15s !important; }
69
+
70
+ /* ── Extra iteration helpers ── */
71
+ .animation-iteration-2 { animation-iteration-count: 2; }
72
+ .animation-iteration-4 { animation-iteration-count: 4; }
73
+ .animation-iteration-5 { animation-iteration-count: 5; }
74
+
75
+ /* ── Pause / play ── */
76
+ .animation-paused { animation-play-state: paused; }
77
+ .animation-running { animation-play-state: running; }
78
+ .animation-none { animation: none; }
79
+ .animation-pause-on-hover:hover { animation-play-state: paused; }
80
+
81
+ /* ════════════════════════════════════════════════════
82
+ ATTENTION SEEKERS
83
+ Keep looping or use once (add animation-loop-1)
84
+ ════════════════════════════════════════════════════ */
85
+ .animate-flash { animation: santy-flash 1s ease both; }
86
+ .animate-rubber-band { animation: santy-rubber-band 1s ease both; }
87
+ .animate-shake-x { animation: santy-shake-x 1s ease both; }
88
+ .animate-shake-y { animation: santy-shake-y 1s ease both; }
89
+ .animate-shake-head { animation: santy-shake-head 1s ease-in-out both; }
90
+ .animate-swing { animation: santy-swing 1s ease both; transform-origin: top center; }
91
+ .animate-tada { animation: santy-tada 1s ease both; }
92
+ .animate-wobble { animation: santy-wobble 1s ease both; }
93
+ .animate-jelly { animation: santy-jelly 1s ease both; }
94
+ .animate-heartbeat { animation: santy-heartbeat 1.3s ease-in-out both; }
95
+
96
+ /* ════════════════════════════════════════════════════
97
+ FADING ENTRANCES
98
+ ════════════════════════════════════════════════════ */
99
+ .animate-fade-in { animation: santy-fade-in 0.5s ease both; }
100
+ .animate-fade-in-from-top { animation: santy-fade-in-from-top 0.5s ease both; }
101
+ .animate-fade-in-from-bottom { animation: santy-fade-in-from-bottom 0.5s ease both; }
102
+ .animate-fade-in-from-left { animation: santy-fade-in-from-left 0.5s ease both; }
103
+ .animate-fade-in-from-right { animation: santy-fade-in-from-right 0.5s ease both; }
104
+ .animate-fade-in-top-left { animation: santy-fade-in-top-left 0.5s ease both; }
105
+ .animate-fade-in-top-right { animation: santy-fade-in-top-right 0.5s ease both; }
106
+ .animate-fade-in-bottom-left { animation: santy-fade-in-bottom-left 0.5s ease both; }
107
+ .animate-fade-in-bottom-right { animation: santy-fade-in-bottom-right 0.5s ease both; }
108
+
109
+ /* ════════════════════════════════════════════════════
110
+ FADING EXITS
111
+ ════════════════════════════════════════════════════ */
112
+ .animate-fade-out { animation: santy-fade-out 0.5s ease both; }
113
+ .animate-fade-out-to-top { animation: santy-fade-out-to-top 0.5s ease both; }
114
+ .animate-fade-out-to-bottom { animation: santy-fade-out-to-bottom 0.5s ease both; }
115
+ .animate-fade-out-to-left { animation: santy-fade-out-to-left 0.5s ease both; }
116
+ .animate-fade-out-to-right { animation: santy-fade-out-to-right 0.5s ease both; }
117
+ .animate-fade-out-top-left { animation: santy-fade-out-top-left 0.5s ease both; }
118
+ .animate-fade-out-top-right { animation: santy-fade-out-top-right 0.5s ease both; }
119
+ .animate-fade-out-bottom-left { animation: santy-fade-out-bottom-left 0.5s ease both; }
120
+ .animate-fade-out-bottom-right { animation: santy-fade-out-bottom-right 0.5s ease both; }
121
+
122
+ /* ════════════════════════════════════════════════════
123
+ BOUNCING ENTRANCES
124
+ ════════════════════════════════════════════════════ */
125
+ .animate-bounce-in { animation: santy-bounce-in 0.75s ease both; }
126
+ .animate-bounce-in-from-top { animation: santy-bounce-in-from-top 0.75s ease both; }
127
+ .animate-bounce-in-from-bottom { animation: santy-bounce-in-from-bottom 0.75s ease both; }
128
+ .animate-bounce-in-from-left { animation: santy-bounce-in-from-left 0.75s ease both; }
129
+ .animate-bounce-in-from-right { animation: santy-bounce-in-from-right 0.75s ease both; }
130
+
131
+ /* ════════════════════════════════════════════════════
132
+ BOUNCING EXITS
133
+ ════════════════════════════════════════════════════ */
134
+ .animate-bounce-out { animation: santy-bounce-out 0.75s ease both; }
135
+ .animate-bounce-out-to-top { animation: santy-bounce-out-to-top 0.75s ease both; }
136
+ .animate-bounce-out-to-bottom { animation: santy-bounce-out-to-bottom 0.75s ease both; }
137
+ .animate-bounce-out-to-left { animation: santy-bounce-out-to-left 0.75s ease both; }
138
+ .animate-bounce-out-to-right { animation: santy-bounce-out-to-right 0.75s ease both; }
139
+
140
+ /* ════════════════════════════════════════════════════
141
+ SLIDING ENTRANCES
142
+ ════════════════════════════════════════════════════ */
143
+ .animate-slide-in-from-top { animation: santy-slide-in-from-top 0.4s ease both; }
144
+ .animate-slide-in-from-bottom { animation: santy-slide-in-from-bottom 0.4s ease both; }
145
+ .animate-slide-in-from-left { animation: santy-slide-in-from-left 0.4s ease both; }
146
+ .animate-slide-in-from-right { animation: santy-slide-in-from-right 0.4s ease both; }
147
+
148
+ /* ════════════════════════════════════════════════════
149
+ SLIDING EXITS
150
+ ════════════════════════════════════════════════════ */
151
+ .animate-slide-out-to-top { animation: santy-slide-out-to-top 0.4s ease both; }
152
+ .animate-slide-out-to-bottom { animation: santy-slide-out-to-bottom 0.4s ease both; }
153
+ .animate-slide-out-to-left { animation: santy-slide-out-to-left 0.4s ease both; }
154
+ .animate-slide-out-to-right { animation: santy-slide-out-to-right 0.4s ease both; }
155
+
156
+ /* ════════════════════════════════════════════════════
157
+ ZOOMING ENTRANCES
158
+ ════════════════════════════════════════════════════ */
159
+ .animate-zoom-in { animation: santy-zoom-in 0.3s ease both; }
160
+ .animate-zoom-in-from-top { animation: santy-zoom-in-from-top 0.5s ease both; }
161
+ .animate-zoom-in-from-bottom { animation: santy-zoom-in-from-bottom 0.5s ease both; }
162
+ .animate-zoom-in-from-left { animation: santy-zoom-in-from-left 0.5s ease both; }
163
+ .animate-zoom-in-from-right { animation: santy-zoom-in-from-right 0.5s ease both; }
164
+
165
+ /* ════════════════════════════════════════════════════
166
+ ZOOMING EXITS
167
+ ════════════════════════════════════════════════════ */
168
+ .animate-zoom-out { animation: santy-zoom-out 0.3s ease both; }
169
+ .animate-zoom-out-to-top { animation: santy-zoom-out-to-top 0.5s ease both; }
170
+ .animate-zoom-out-to-bottom { animation: santy-zoom-out-to-bottom 0.5s ease both; }
171
+ .animate-zoom-out-to-left { animation: santy-zoom-out-to-left 0.5s ease both; }
172
+ .animate-zoom-out-to-right { animation: santy-zoom-out-to-right 0.5s ease both; }
173
+
174
+ /* ════════════════════════════════════════════════════
175
+ FLIPPING
176
+ ════════════════════════════════════════════════════ */
177
+ .animate-flip { animation: santy-flip 1s ease both; backface-visibility: visible !important; }
178
+ .animate-flip-in-x { animation: santy-flip-in-x 0.75s ease both; backface-visibility: visible !important; }
179
+ .animate-flip-in-y { animation: santy-flip-in-y 0.75s ease both; backface-visibility: visible !important; }
180
+ .animate-flip-out-x { animation: santy-flip-out-x 0.75s ease both; backface-visibility: visible !important; }
181
+ .animate-flip-out-y { animation: santy-flip-out-y 0.75s ease both; backface-visibility: visible !important; }
182
+
183
+ /* ════════════════════════════════════════════════════
184
+ ROTATING ENTRANCES
185
+ ════════════════════════════════════════════════════ */
186
+ .animate-rotate-in { animation: santy-rotate-in 0.6s ease both; }
187
+ .animate-rotate-in-from-top-left { animation: santy-rotate-in-from-top-left 0.6s ease both; transform-origin: left top; }
188
+ .animate-rotate-in-from-top-right { animation: santy-rotate-in-from-top-right 0.6s ease both; transform-origin: right top; }
189
+ .animate-rotate-in-from-bottom-left { animation: santy-rotate-in-from-bottom-left 0.6s ease both; transform-origin: left bottom; }
190
+ .animate-rotate-in-from-bottom-right { animation: santy-rotate-in-from-bottom-right 0.6s ease both; transform-origin: right bottom; }
191
+
192
+ /* ════════════════════════════════════════════════════
193
+ ROTATING EXITS
194
+ ════════════════════════════════════════════════════ */
195
+ .animate-rotate-out { animation: santy-rotate-out 0.6s ease both; }
196
+ .animate-rotate-out-to-top-left { animation: santy-rotate-out-to-top-left 0.6s ease both; transform-origin: left top; }
197
+ .animate-rotate-out-to-top-right { animation: santy-rotate-out-to-top-right 0.6s ease both; transform-origin: right top; }
198
+ .animate-rotate-out-to-bottom-left { animation: santy-rotate-out-to-bottom-left 0.6s ease both; transform-origin: left bottom; }
199
+ .animate-rotate-out-to-bottom-right { animation: santy-rotate-out-to-bottom-right 0.6s ease both; transform-origin: right bottom; }
200
+
201
+ /* ════════════════════════════════════════════════════
202
+ BACK ENTRANCES (scale from afar)
203
+ ════════════════════════════════════════════════════ */
204
+ .animate-back-in-from-top { animation: santy-back-in-from-top 0.7s ease both; }
205
+ .animate-back-in-from-bottom { animation: santy-back-in-from-bottom 0.7s ease both; }
206
+ .animate-back-in-from-left { animation: santy-back-in-from-left 0.7s ease both; }
207
+ .animate-back-in-from-right { animation: santy-back-in-from-right 0.7s ease both; }
208
+
209
+ /* ════════════════════════════════════════════════════
210
+ BACK EXITS
211
+ ════════════════════════════════════════════════════ */
212
+ .animate-back-out-to-top { animation: santy-back-out-to-top 0.7s ease both; }
213
+ .animate-back-out-to-bottom { animation: santy-back-out-to-bottom 0.7s ease both; }
214
+ .animate-back-out-to-left { animation: santy-back-out-to-left 0.7s ease both; }
215
+ .animate-back-out-to-right { animation: santy-back-out-to-right 0.7s ease both; }
216
+
217
+ /* ════════════════════════════════════════════════════
218
+ LIGHT SPEED (skew + slide)
219
+ ════════════════════════════════════════════════════ */
220
+ .animate-speed-in-from-left { animation: santy-speed-in-from-left 0.5s ease-out both; }
221
+ .animate-speed-in-from-right { animation: santy-speed-in-from-right 0.5s ease-out both; }
222
+ .animate-speed-out-to-left { animation: santy-speed-out-to-left 0.5s ease-in both; }
223
+ .animate-speed-out-to-right { animation: santy-speed-out-to-right 0.5s ease-in both; }
224
+
225
+ /* ════════════════════════════════════════════════════
226
+ SPECIALS
227
+ ════════════════════════════════════════════════════ */
228
+ .animate-hinge { animation: santy-hinge 2s ease both; transform-origin: top left; }
229
+ .animate-jack-in-box { animation: santy-jack-in-box 1s ease both; transform-origin: center bottom; }
230
+ .animate-roll-in { animation: santy-roll-in 0.6s ease both; }
231
+ .animate-roll-out { animation: santy-roll-out 0.6s ease both; }
232
+
233
+ /* ── Original utilities (kept for backwards compat) ── */
234
+ .animate-spin { animation: santy-spin 1s linear infinite; }
235
+ .animate-ping { animation: santy-ping 1s cubic-bezier(0,0,.2,1) infinite; }
236
+ .animate-pulse { animation: santy-pulse 2s cubic-bezier(.4,0,.6,1) infinite; }
237
+ .animate-bounce { animation: santy-bounce 1s infinite; }
238
+ .animate-slide-up { animation: santy-slide-in-from-bottom 0.4s ease both; }
239
+ .animate-slide-down { animation: santy-slide-in-from-top 0.4s ease both; }
240
+ .animate-zoom-in { animation: santy-zoom-in 0.3s ease both; }
241
+ .animate-zoom-out { animation: santy-zoom-out 0.3s ease both; }
242
+
243
+ /* ═══════════════════════════════════════════════════════════════════════
244
+ KEYFRAMES
245
+ ═══════════════════════════════════════════════════════════════════════ */
246
+
247
+ /* ── Core ── */
248
+ @keyframes santy-spin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } }
249
+ @keyframes santy-ping { 75%, 100% { transform: scale(2); opacity: 0; } }
250
+ @keyframes santy-pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.5; } }
251
+ @keyframes santy-bounce { 0%, 100% { transform: translateY(-25%); animation-timing-function: cubic-bezier(.8,0,1,1); } 50% { transform: translateY(0); animation-timing-function: cubic-bezier(0,0,.2,1); } }
252
+ @keyframes santy-skeleton{ 0% { background-position: 200% 0; } 100% { background-position: -200% 0; } }
253
+
254
+ /* ── Attention Seekers ── */
255
+ @keyframes santy-flash {
256
+ from, 50%, to { opacity: 1; }
257
+ 25%, 75% { opacity: 0; }
258
+ }
259
+ @keyframes santy-rubber-band {
260
+ from { transform: scale3d(1, 1, 1); }
261
+ 30% { transform: scale3d(1.25, .75, 1); }
262
+ 40% { transform: scale3d(.75, 1.25, 1); }
263
+ 50% { transform: scale3d(1.15, .85, 1); }
264
+ 65% { transform: scale3d(.95, 1.05, 1); }
265
+ 75% { transform: scale3d(1.05, .95, 1); }
266
+ to { transform: scale3d(1, 1, 1); }
267
+ }
268
+ @keyframes santy-shake-x {
269
+ from, to { transform: translate3d(0, 0, 0); }
270
+ 10%, 30%, 50%, 70%, 90% { transform: translate3d(-10px, 0, 0); }
271
+ 20%, 40%, 60%, 80% { transform: translate3d(10px, 0, 0); }
272
+ }
273
+ @keyframes santy-shake-y {
274
+ from, to { transform: translate3d(0, 0, 0); }
275
+ 10%, 30%, 50%, 70%, 90% { transform: translate3d(0, -10px, 0); }
276
+ 20%, 40%, 60%, 80% { transform: translate3d(0, 10px, 0); }
277
+ }
278
+ @keyframes santy-shake-head {
279
+ 0% { transform: rotateY(0deg); }
280
+ 6.5% { transform: rotateY(-9deg); }
281
+ 18.5% { transform: rotateY(7deg); }
282
+ 31.5% { transform: rotateY(-5deg); }
283
+ 43.5% { transform: rotateY(3deg); }
284
+ 50% { transform: rotateY(0deg); }
285
+ }
286
+ @keyframes santy-swing {
287
+ 20% { transform: rotate3d(0, 0, 1, 15deg); }
288
+ 40% { transform: rotate3d(0, 0, 1, -10deg); }
289
+ 60% { transform: rotate3d(0, 0, 1, 5deg); }
290
+ 80% { transform: rotate3d(0, 0, 1, -5deg); }
291
+ to { transform: rotate3d(0, 0, 1, 0deg); }
292
+ }
293
+ @keyframes santy-tada {
294
+ from { transform: scale3d(1, 1, 1); }
295
+ 10%, 20% { transform: scale3d(.9, .9, .9) rotate3d(0, 0, 1, -3deg); }
296
+ 30%, 50%, 70%, 90% { transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg); }
297
+ 40%, 60%, 80% { transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg); }
298
+ to { transform: scale3d(1, 1, 1); }
299
+ }
300
+ @keyframes santy-wobble {
301
+ from { transform: translate3d(0, 0, 0); }
302
+ 15% { transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg); }
303
+ 30% { transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg); }
304
+ 45% { transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg); }
305
+ 60% { transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg); }
306
+ 75% { transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg); }
307
+ to { transform: translate3d(0, 0, 0); }
308
+ }
309
+ @keyframes santy-jelly {
310
+ from, 11.1%, to { transform: translate3d(0, 0, 0); }
311
+ 22.2% { transform: skewX(-12.5deg) skewY(-12.5deg); }
312
+ 33.3% { transform: skewX(6.25deg) skewY(6.25deg); }
313
+ 44.4% { transform: skewX(-3.125deg) skewY(-3.125deg); }
314
+ 55.5% { transform: skewX(1.5625deg) skewY(1.5625deg); }
315
+ 66.6% { transform: skewX(-.78125deg) skewY(-.78125deg); }
316
+ 77.7% { transform: skewX(.390625deg) skewY(.390625deg); }
317
+ 88.8% { transform: skewX(-.1953125deg) skewY(-.1953125deg); }
318
+ }
319
+ @keyframes santy-heartbeat {
320
+ from { transform: scale(1); animation-timing-function: ease-out; }
321
+ 10% { transform: scale(1.12); animation-timing-function: ease-in; }
322
+ 17% { transform: scale(1.08); animation-timing-function: ease-out; }
323
+ 33% { transform: scale(1.18); animation-timing-function: ease-in; }
324
+ 45% { transform: scale(1); animation-timing-function: ease-out; }
325
+ }
326
+
327
+ /* ── Fade In ── */
328
+ @keyframes santy-fade-in { from { opacity: 0; } to { opacity: 1; } }
329
+ @keyframes santy-fade-in-from-top { from { opacity: 0; transform: translate3d(0, -30px, 0); } to { opacity: 1; transform: translate3d(0, 0, 0); } }
330
+ @keyframes santy-fade-in-from-bottom { from { opacity: 0; transform: translate3d(0, 30px, 0); } to { opacity: 1; transform: translate3d(0, 0, 0); } }
331
+ @keyframes santy-fade-in-from-left { from { opacity: 0; transform: translate3d(-30px, 0, 0); } to { opacity: 1; transform: translate3d(0, 0, 0); } }
332
+ @keyframes santy-fade-in-from-right { from { opacity: 0; transform: translate3d( 30px, 0, 0); } to { opacity: 1; transform: translate3d(0, 0, 0); } }
333
+ @keyframes santy-fade-in-top-left { from { opacity: 0; transform: translate3d(-30px, -30px, 0); } to { opacity: 1; transform: translate3d(0, 0, 0); } }
334
+ @keyframes santy-fade-in-top-right { from { opacity: 0; transform: translate3d( 30px, -30px, 0); } to { opacity: 1; transform: translate3d(0, 0, 0); } }
335
+ @keyframes santy-fade-in-bottom-left { from { opacity: 0; transform: translate3d(-30px, 30px, 0); } to { opacity: 1; transform: translate3d(0, 0, 0); } }
336
+ @keyframes santy-fade-in-bottom-right { from { opacity: 0; transform: translate3d( 30px, 30px, 0); } to { opacity: 1; transform: translate3d(0, 0, 0); } }
337
+
338
+ /* ── Fade Out ── */
339
+ @keyframes santy-fade-out { from { opacity: 1; } to { opacity: 0; } }
340
+ @keyframes santy-fade-out-to-top { from { opacity: 1; transform: translate3d(0, 0, 0); } to { opacity: 0; transform: translate3d(0, -30px, 0); } }
341
+ @keyframes santy-fade-out-to-bottom { from { opacity: 1; transform: translate3d(0, 0, 0); } to { opacity: 0; transform: translate3d(0, 30px, 0); } }
342
+ @keyframes santy-fade-out-to-left { from { opacity: 1; transform: translate3d(0, 0, 0); } to { opacity: 0; transform: translate3d(-30px, 0, 0); } }
343
+ @keyframes santy-fade-out-to-right { from { opacity: 1; transform: translate3d(0, 0, 0); } to { opacity: 0; transform: translate3d( 30px, 0, 0); } }
344
+ @keyframes santy-fade-out-top-left { from { opacity: 1; transform: translate3d(0, 0, 0); } to { opacity: 0; transform: translate3d(-30px, -30px, 0); } }
345
+ @keyframes santy-fade-out-top-right { from { opacity: 1; transform: translate3d(0, 0, 0); } to { opacity: 0; transform: translate3d( 30px, -30px, 0); } }
346
+ @keyframes santy-fade-out-bottom-left { from { opacity: 1; transform: translate3d(0, 0, 0); } to { opacity: 0; transform: translate3d(-30px, 30px, 0); } }
347
+ @keyframes santy-fade-out-bottom-right { from { opacity: 1; transform: translate3d(0, 0, 0); } to { opacity: 0; transform: translate3d( 30px, 30px, 0); } }
348
+
349
+ /* ── Bounce In ── */
350
+ @keyframes santy-bounce-in {
351
+ from,20%,40%,60%,80%,to { animation-timing-function: cubic-bezier(.215,.61,.355,1); }
352
+ 0% { opacity: 0; transform: scale3d(.3, .3, .3); }
353
+ 20% { transform: scale3d(1.1, 1.1, 1.1); }
354
+ 40% { transform: scale3d(.9, .9, .9); }
355
+ 60% { opacity: 1; transform: scale3d(1.03, 1.03, 1.03); }
356
+ 80% { transform: scale3d(.97, .97, .97); }
357
+ to { opacity: 1; transform: scale3d(1, 1, 1); }
358
+ }
359
+ @keyframes santy-bounce-in-from-top {
360
+ from,60%,75%,90%,to { animation-timing-function: cubic-bezier(.215,.61,.355,1); }
361
+ 0% { opacity: 0; transform: translate3d(0, -3000px, 0) scaleY(3); }
362
+ 60% { opacity: 1; transform: translate3d(0, 25px, 0) scaleY(.9); }
363
+ 75% { transform: translate3d(0, -10px, 0) scaleY(.95); }
364
+ 90% { transform: translate3d(0, 5px, 0) scaleY(.985); }
365
+ to { transform: translate3d(0, 0, 0); }
366
+ }
367
+ @keyframes santy-bounce-in-from-bottom {
368
+ from,60%,75%,90%,to { animation-timing-function: cubic-bezier(.215,.61,.355,1); }
369
+ 0% { opacity: 0; transform: translate3d(0, 3000px, 0) scaleY(5); }
370
+ 60% { opacity: 1; transform: translate3d(0, -20px, 0) scaleY(.9); }
371
+ 75% { transform: translate3d(0, 10px, 0) scaleY(.95); }
372
+ 90% { transform: translate3d(0, -5px, 0) scaleY(.985); }
373
+ to { transform: translate3d(0, 0, 0); }
374
+ }
375
+ @keyframes santy-bounce-in-from-left {
376
+ from,60%,75%,90%,to { animation-timing-function: cubic-bezier(.215,.61,.355,1); }
377
+ 0% { opacity: 0; transform: translate3d(-3000px, 0, 0) scaleX(3); }
378
+ 60% { opacity: 1; transform: translate3d(25px, 0, 0) scaleX(1); }
379
+ 75% { transform: translate3d(-10px, 0, 0) scaleX(.98); }
380
+ 90% { transform: translate3d(5px, 0, 0) scaleX(.995); }
381
+ to { transform: translate3d(0, 0, 0); }
382
+ }
383
+ @keyframes santy-bounce-in-from-right {
384
+ from,60%,75%,90%,to { animation-timing-function: cubic-bezier(.215,.61,.355,1); }
385
+ 0% { opacity: 0; transform: translate3d(3000px, 0, 0) scaleX(3); }
386
+ 60% { opacity: 1; transform: translate3d(-25px, 0, 0) scaleX(1); }
387
+ 75% { transform: translate3d(10px, 0, 0) scaleX(.98); }
388
+ 90% { transform: translate3d(-5px, 0, 0) scaleX(.995); }
389
+ to { transform: translate3d(0, 0, 0); }
390
+ }
391
+
392
+ /* ── Bounce Out ── */
393
+ @keyframes santy-bounce-out {
394
+ 20% { transform: scale3d(.9, .9, .9); }
395
+ 50%,55% { opacity: 1; transform: scale3d(1.1, 1.1, 1.1); }
396
+ to { opacity: 0; transform: scale3d(.3, .3, .3); }
397
+ }
398
+ @keyframes santy-bounce-out-to-top {
399
+ 20% { transform: translate3d(0, -10px, 0) scaleY(.985); }
400
+ 40%,45% { opacity: 1; transform: translate3d(0, 20px, 0) scaleY(.9); }
401
+ to { opacity: 0; transform: translate3d(0, -2000px, 0) scaleY(3); }
402
+ }
403
+ @keyframes santy-bounce-out-to-bottom {
404
+ 20% { transform: translate3d(0, 10px, 0) scaleY(.985); }
405
+ 40%,45% { opacity: 1; transform: translate3d(0, -20px, 0) scaleY(.9); }
406
+ to { opacity: 0; transform: translate3d(0, 2000px, 0) scaleY(5); }
407
+ }
408
+ @keyframes santy-bounce-out-to-left {
409
+ 20% { opacity: 1; transform: translate3d(20px, 0, 0) scaleX(.9); }
410
+ to { opacity: 0; transform: translate3d(-2000px, 0, 0) scaleX(2); }
411
+ }
412
+ @keyframes santy-bounce-out-to-right {
413
+ 20% { opacity: 1; transform: translate3d(-20px, 0, 0) scaleX(.9); }
414
+ to { opacity: 0; transform: translate3d(2000px, 0, 0) scaleX(2); }
415
+ }
416
+
417
+ /* ── Slide In ── */
418
+ @keyframes santy-slide-in-from-top { from { visibility: visible; transform: translate3d(0, -100%, 0); } to { transform: translate3d(0, 0, 0); } }
419
+ @keyframes santy-slide-in-from-bottom { from { visibility: visible; transform: translate3d(0, 100%, 0); } to { transform: translate3d(0, 0, 0); } }
420
+ @keyframes santy-slide-in-from-left { from { visibility: visible; transform: translate3d(-100%, 0, 0); } to { transform: translate3d(0, 0, 0); } }
421
+ @keyframes santy-slide-in-from-right { from { visibility: visible; transform: translate3d( 100%, 0, 0); } to { transform: translate3d(0, 0, 0); } }
422
+
423
+ /* ── Slide Out ── */
424
+ @keyframes santy-slide-out-to-top { from { transform: translate3d(0, 0, 0); } to { visibility: hidden; transform: translate3d(0, -100%, 0); } }
425
+ @keyframes santy-slide-out-to-bottom { from { transform: translate3d(0, 0, 0); } to { visibility: hidden; transform: translate3d(0, 100%, 0); } }
426
+ @keyframes santy-slide-out-to-left { from { transform: translate3d(0, 0, 0); } to { visibility: hidden; transform: translate3d(-100%, 0, 0); } }
427
+ @keyframes santy-slide-out-to-right { from { transform: translate3d(0, 0, 0); } to { visibility: hidden; transform: translate3d( 100%, 0, 0); } }
428
+
429
+ /* ── Zoom In ── */
430
+ @keyframes santy-zoom-in { from { opacity: 0; transform: scale3d(.3, .3, .3); } 50% { opacity: 1; } }
431
+ @keyframes santy-zoom-in-from-top {
432
+ from { opacity: 0; transform: scale3d(.1,.1,.1) translate3d(0,-1000px,0); animation-timing-function: cubic-bezier(.55,.055,.675,.19); }
433
+ 60% { opacity: 1; transform: scale3d(.475,.475,.475) translate3d(0,60px,0); animation-timing-function: cubic-bezier(.175,.885,.32,1); }
434
+ }
435
+ @keyframes santy-zoom-in-from-bottom {
436
+ from { opacity: 0; transform: scale3d(.1,.1,.1) translate3d(0,1000px,0); animation-timing-function: cubic-bezier(.55,.055,.675,.19); }
437
+ 60% { opacity: 1; transform: scale3d(.475,.475,.475) translate3d(0,-60px,0); animation-timing-function: cubic-bezier(.175,.885,.32,1); }
438
+ }
439
+ @keyframes santy-zoom-in-from-left {
440
+ from { opacity: 0; transform: scale3d(.1,.1,.1) translate3d(-1000px,0,0); animation-timing-function: cubic-bezier(.55,.055,.675,.19); }
441
+ 60% { opacity: 1; transform: scale3d(.475,.475,.475) translate3d(10px,0,0); animation-timing-function: cubic-bezier(.175,.885,.32,1); }
442
+ }
443
+ @keyframes santy-zoom-in-from-right {
444
+ from { opacity: 0; transform: scale3d(.1,.1,.1) translate3d(1000px,0,0); animation-timing-function: cubic-bezier(.55,.055,.675,.19); }
445
+ 60% { opacity: 1; transform: scale3d(.475,.475,.475) translate3d(-10px,0,0); animation-timing-function: cubic-bezier(.175,.885,.32,1); }
446
+ }
447
+
448
+ /* ── Zoom Out ── */
449
+ @keyframes santy-zoom-out { from { opacity: 1; } 50% { opacity: 0; transform: scale3d(.3,.3,.3); } to { opacity: 0; } }
450
+ @keyframes santy-zoom-out-to-top {
451
+ 40% { opacity: 1; transform: scale3d(.475,.475,.475) translate3d(0,60px,0); animation-timing-function: cubic-bezier(.175,.885,.32,1); }
452
+ to { opacity: 0; transform: scale3d(.1,.1,.1) translate3d(0,-2000px,0); animation-timing-function: cubic-bezier(.55,.055,.675,.19); }
453
+ }
454
+ @keyframes santy-zoom-out-to-bottom {
455
+ 40% { opacity: 1; transform: scale3d(.475,.475,.475) translate3d(0,-60px,0); animation-timing-function: cubic-bezier(.175,.885,.32,1); }
456
+ to { opacity: 0; transform: scale3d(.1,.1,.1) translate3d(0,2000px,0); animation-timing-function: cubic-bezier(.55,.055,.675,.19); }
457
+ }
458
+ @keyframes santy-zoom-out-to-left {
459
+ 40% { opacity: 1; transform: scale3d(.475,.475,.475) translate3d(42px,0,0); animation-timing-function: cubic-bezier(.175,.885,.32,1); }
460
+ to { opacity: 0; transform: scale3d(.1,.1,.1) translate3d(-2000px,0,0); animation-timing-function: cubic-bezier(.55,.055,.675,.19); }
461
+ }
462
+ @keyframes santy-zoom-out-to-right {
463
+ 40% { opacity: 1; transform: scale3d(.475,.475,.475) translate3d(-42px,0,0); animation-timing-function: cubic-bezier(.175,.885,.32,1); }
464
+ to { opacity: 0; transform: scale3d(.1,.1,.1) translate3d(2000px,0,0); animation-timing-function: cubic-bezier(.55,.055,.675,.19); }
465
+ }
466
+
467
+ /* ── Flip ── */
468
+ @keyframes santy-flip {
469
+ from { transform: perspective(400px) scale3d(1,1,1) rotate3d(0,1,0,-360deg); animation-timing-function: ease-out; }
470
+ 40% { transform: perspective(400px) scale3d(1,1,.5) translate3d(0,0,150px) rotate3d(0,1,0,-190deg); animation-timing-function: ease-out; }
471
+ 50% { transform: perspective(400px) scale3d(1,1,.5) translate3d(0,0,150px) rotate3d(0,1,0,-170deg); animation-timing-function: ease-in; }
472
+ 80% { transform: perspective(400px) scale3d(.95,1,1) rotate3d(0,1,0,0deg); animation-timing-function: ease-in; }
473
+ to { transform: perspective(400px) scale3d(1,1,1) rotate3d(0,1,0,0deg); animation-timing-function: ease-in; }
474
+ }
475
+ @keyframes santy-flip-in-x {
476
+ from { transform: perspective(400px) rotate3d(1,0,0,90deg); animation-timing-function: ease-in; opacity: 0; }
477
+ 40% { transform: perspective(400px) rotate3d(1,0,0,-20deg); animation-timing-function: ease-in; }
478
+ 60% { transform: perspective(400px) rotate3d(1,0,0,10deg); opacity: 1; }
479
+ 80% { transform: perspective(400px) rotate3d(1,0,0,-5deg); }
480
+ to { transform: perspective(400px); }
481
+ }
482
+ @keyframes santy-flip-in-y {
483
+ from { transform: perspective(400px) rotate3d(0,1,0,90deg); animation-timing-function: ease-in; opacity: 0; }
484
+ 40% { transform: perspective(400px) rotate3d(0,1,0,-20deg); animation-timing-function: ease-in; }
485
+ 60% { transform: perspective(400px) rotate3d(0,1,0,10deg); opacity: 1; }
486
+ 80% { transform: perspective(400px) rotate3d(0,1,0,-5deg); }
487
+ to { transform: perspective(400px); }
488
+ }
489
+ @keyframes santy-flip-out-x {
490
+ from { transform: perspective(400px); }
491
+ 30% { transform: perspective(400px) rotate3d(1,0,0,-20deg); opacity: 1; }
492
+ to { transform: perspective(400px) rotate3d(1,0,0,90deg); opacity: 0; }
493
+ }
494
+ @keyframes santy-flip-out-y {
495
+ from { transform: perspective(400px); }
496
+ 30% { transform: perspective(400px) rotate3d(0,1,0,-15deg); opacity: 1; }
497
+ to { transform: perspective(400px) rotate3d(0,1,0,90deg); opacity: 0; }
498
+ }
499
+
500
+ /* ── Rotate In ── */
501
+ @keyframes santy-rotate-in { from { transform: rotate3d(0,0,1,-200deg); opacity: 0; } to { transform: translate3d(0,0,0); opacity: 1; } }
502
+ @keyframes santy-rotate-in-from-top-left { from { transform: rotate3d(0,0,1,-45deg); opacity: 0; } to { transform: translate3d(0,0,0); opacity: 1; } }
503
+ @keyframes santy-rotate-in-from-top-right { from { transform: rotate3d(0,0,1,45deg); opacity: 0; } to { transform: translate3d(0,0,0); opacity: 1; } }
504
+ @keyframes santy-rotate-in-from-bottom-left { from { transform: rotate3d(0,0,1,45deg); opacity: 0; } to { transform: translate3d(0,0,0); opacity: 1; } }
505
+ @keyframes santy-rotate-in-from-bottom-right { from { transform: rotate3d(0,0,1,-90deg); opacity: 0; } to { transform: translate3d(0,0,0); opacity: 1; } }
506
+
507
+ /* ── Rotate Out ── */
508
+ @keyframes santy-rotate-out { from { opacity: 1; } to { transform: rotate3d(0,0,1,200deg); opacity: 0; } }
509
+ @keyframes santy-rotate-out-to-top-left { from { opacity: 1; } to { transform: rotate3d(0,0,1,-45deg); opacity: 0; } }
510
+ @keyframes santy-rotate-out-to-top-right { from { opacity: 1; } to { transform: rotate3d(0,0,1,90deg); opacity: 0; } }
511
+ @keyframes santy-rotate-out-to-bottom-left { from { opacity: 1; } to { transform: rotate3d(0,0,1,45deg); opacity: 0; } }
512
+ @keyframes santy-rotate-out-to-bottom-right { from { opacity: 1; } to { transform: rotate3d(0,0,1,-45deg); opacity: 0; } }
513
+
514
+ /* ── Back Entrances ── */
515
+ @keyframes santy-back-in-from-top { 0% { transform: translateY(-1200px) scale(.7); opacity: .7; } 80% { transform: translateY(0) scale(.7); opacity: .7; } 100% { transform: scale(1); opacity: 1; } }
516
+ @keyframes santy-back-in-from-bottom { 0% { transform: translateY( 1200px) scale(.7); opacity: .7; } 80% { transform: translateY(0) scale(.7); opacity: .7; } 100% { transform: scale(1); opacity: 1; } }
517
+ @keyframes santy-back-in-from-left { 0% { transform: translateX(-2000px) scale(.7); opacity: .7; } 80% { transform: translateX(0) scale(.7); opacity: .7; } 100% { transform: scale(1); opacity: 1; } }
518
+ @keyframes santy-back-in-from-right { 0% { transform: translateX( 2000px) scale(.7); opacity: .7; } 80% { transform: translateX(0) scale(.7); opacity: .7; } 100% { transform: scale(1); opacity: 1; } }
519
+
520
+ /* ── Back Exits ── */
521
+ @keyframes santy-back-out-to-top { 0% { transform: scale(1); opacity: 1; } 20% { transform: translateY(0) scale(.7); opacity: .7; } 100% { transform: translateY(-700px) scale(.7); opacity: .7; } }
522
+ @keyframes santy-back-out-to-bottom { 0% { transform: scale(1); opacity: 1; } 20% { transform: translateY(0) scale(.7); opacity: .7; } 100% { transform: translateY( 700px) scale(.7); opacity: .7; } }
523
+ @keyframes santy-back-out-to-left { 0% { transform: scale(1); opacity: 1; } 20% { transform: translateX(0) scale(.7); opacity: .7; } 100% { transform: translateX(-2000px) scale(.7); opacity: .7; } }
524
+ @keyframes santy-back-out-to-right { 0% { transform: scale(1); opacity: 1; } 20% { transform: translateX(0) scale(.7); opacity: .7; } 100% { transform: translateX( 2000px) scale(.7); opacity: .7; } }
525
+
526
+ /* ── Light Speed ── */
527
+ @keyframes santy-speed-in-from-left { from { transform: translate3d(-100%,0,0) skewX(30deg); opacity: 0; } 60% { transform: skewX(-20deg); opacity: 1; } 80% { transform: skewX(5deg); } to { transform: translate3d(0,0,0); } }
528
+ @keyframes santy-speed-in-from-right { from { transform: translate3d(100%,0,0) skewX(-30deg); opacity: 0; } 60% { transform: skewX(20deg); opacity: 1; } 80% { transform: skewX(-5deg); } to { transform: translate3d(0,0,0); } }
529
+ @keyframes santy-speed-out-to-left { from { opacity: 1; } to { transform: translate3d(-100%,0,0) skewX(-30deg); opacity: 0; } }
530
+ @keyframes santy-speed-out-to-right { from { opacity: 1; } to { transform: translate3d(100%,0,0) skewX(30deg); opacity: 0; } }
531
+
532
+ /* ── Specials ── */
533
+ @keyframes santy-hinge {
534
+ 0% { animation-timing-function: ease-in-out; }
535
+ 20%,60% { transform: rotate3d(0,0,1,80deg); animation-timing-function: ease-in-out; }
536
+ 40%,80% { transform: rotate3d(0,0,1,60deg); animation-timing-function: ease-in-out; opacity: 1; }
537
+ to { transform: translate3d(0,700px,0); opacity: 0; }
538
+ }
539
+ @keyframes santy-jack-in-box {
540
+ from { opacity: 0; transform: scale(.1) rotate(30deg); }
541
+ 50% { transform: rotate(-10deg); }
542
+ 70% { transform: rotate(3deg); }
543
+ to { opacity: 1; transform: scale(1); }
544
+ }
545
+ @keyframes santy-roll-in { from { opacity: 0; transform: translate3d(-100%,0,0) rotate3d(0,0,1,-120deg); } to { opacity: 1; transform: translate3d(0,0,0); } }
546
+ @keyframes santy-roll-out { from { opacity: 1; } to { opacity: 0; transform: translate3d(100%,0,0) rotate3d(0,0,1,120deg); } }
547
+
548
+ /* ═══════════════════════════════════════════════════════════════════════
549
+ SCROLL-TRIGGERED ANIMATIONS
550
+ Uses Intersection Observer via tiny JS snippet OR animation-timeline.
551
+ Add class + JS observer, or use with animate-on-scroll-* pattern.
552
+ Pure CSS fallback: elements start invisible, JS adds .is-visible.
553
+ ═══════════════════════════════════════════════════════════════════════ */
554
+
555
+ /* Base: elements are hidden until .is-visible is toggled by JS */
556
+ .animate-on-scroll-fade-in { opacity: 0; transition: opacity 0.6s ease, transform 0.6s ease; }
557
+ .animate-on-scroll-slide-up { opacity: 0; transform: translateY(40px); transition: opacity 0.6s ease, transform 0.6s ease; }
558
+ .animate-on-scroll-slide-down { opacity: 0; transform: translateY(-40px); transition: opacity 0.6s ease, transform 0.6s ease; }
559
+ .animate-on-scroll-zoom-in { opacity: 0; transform: scale(0.85); transition: opacity 0.6s ease, transform 0.6s ease; }
560
+ .animate-on-scroll-from-left { opacity: 0; transform: translateX(-60px); transition: opacity 0.6s ease, transform 0.6s ease; }
561
+ .animate-on-scroll-from-right { opacity: 0; transform: translateX(60px); transition: opacity 0.6s ease, transform 0.6s ease; }
562
+ .animate-on-scroll-flip-up { opacity: 0; transform: rotateX(30deg); transition: opacity 0.6s ease, transform 0.6s ease; }
563
+
564
+ /* Triggered state — add .is-visible via IntersectionObserver */
565
+ .animate-on-scroll-fade-in.is-visible,
566
+ .animate-on-scroll-slide-up.is-visible,
567
+ .animate-on-scroll-slide-down.is-visible,
568
+ .animate-on-scroll-zoom-in.is-visible,
569
+ .animate-on-scroll-from-left.is-visible,
570
+ .animate-on-scroll-from-right.is-visible,
571
+ .animate-on-scroll-flip-up.is-visible { opacity: 1; transform: none; }
572
+
573
+ /* scroll-reveal-once / scroll-reveal-repeat — same trigger, different JS behaviour */
574
+ .scroll-reveal-once,
575
+ .scroll-reveal-repeat { opacity: 0; transform: translateY(30px); transition: opacity 0.55s ease, transform 0.55s ease; }
576
+ .scroll-reveal-once.is-visible,
577
+ .scroll-reveal-repeat.is-visible { opacity: 1; transform: none; }
578
+
579
+ /* Delay modifiers for scroll reveals */
580
+ .scroll-reveal-delay-100 { transition-delay: 0.1s; }
581
+ .scroll-reveal-delay-200 { transition-delay: 0.2s; }
582
+ .scroll-reveal-delay-300 { transition-delay: 0.3s; }
583
+ .scroll-reveal-delay-400 { transition-delay: 0.4s; }
584
+ .scroll-reveal-delay-500 { transition-delay: 0.5s; }
585
+
586
+ /* ═══════════════════════════════════════════════════════════════════════
587
+ HOVER-TRIGGERED ANIMATIONS
588
+ These override animation only on :hover so they fire on mouse-over.
589
+ ═══════════════════════════════════════════════════════════════════════ */
590
+ .on-hover:animate-bounce:hover { animation: santy-bounce 0.8s ease both; }
591
+ .on-hover:animate-pulse:hover { animation: santy-pulse 1s ease both; }
592
+ .on-hover:animate-shake-x:hover { animation: santy-shake-x 0.6s ease both; }
593
+ .on-hover:animate-rubber-band:hover { animation: santy-rubber-band 0.8s ease both; }
594
+ .on-hover:animate-tada:hover { animation: santy-tada 0.8s ease both; }
595
+ .on-hover:animate-wobble:hover { animation: santy-wobble 0.8s ease both; }
596
+ .on-hover:animate-swing:hover { animation: santy-swing 0.8s ease both; transform-origin: top center; }
597
+ .on-hover:animate-heartbeat:hover { animation: santy-heartbeat 1s ease-in-out both; }
598
+ .on-hover:animate-spin-once:hover { animation: santy-spin 0.5s linear both; }
599
+ .on-hover:animate-flip-once:hover { animation: santy-flip-in-y 0.6s ease both; }
600
+ .on-hover:animate-jello:hover { animation: santy-jelly 0.9s ease both; }
601
+ .on-hover:animate-zoom-in:hover { animation: santy-zoom-in 0.3s ease both; }
602
+ .on-hover:animate-fade-in:hover { animation: santy-fade-in 0.4s ease both; }
603
+
604
+ /* ═══════════════════════════════════════════════════════════════════════
605
+ TEXT ANIMATIONS
606
+ ═══════════════════════════════════════════════════════════════════════ */
607
+
608
+ /* Typewriter — pure CSS using steps() */
609
+ .animate-typewriter {
610
+ overflow: hidden;
611
+ white-space: nowrap;
612
+ border-right: 2px solid currentColor;
613
+ width: 0;
614
+ animation: santy-typewriter 2.5s steps(30,end) forwards, santy-blink-caret 0.75s step-end infinite;
615
+ }
616
+ /* Blur-in entrance */
617
+ .animate-text-blur-in { animation: santy-text-blur-in 0.8s ease both; }
618
+ /* Slide up per-word (apply to the text container) */
619
+ .animate-text-slide-up { animation: santy-slide-up 0.5s ease both; }
620
+ /* Gradient flow — animated gradient on text */
621
+ .animate-text-gradient-flow {
622
+ background: linear-gradient(90deg, #3b82f6, #8b5cf6, #ec4899, #3b82f6);
623
+ background-size: 300% 100%;
624
+ -webkit-background-clip: text;
625
+ background-clip: text;
626
+ -webkit-text-fill-color: transparent;
627
+ animation: santy-gradient-shift 3s linear infinite;
628
+ }
629
+ /* Letter wave — each letter must be wrapped in a span via JS */
630
+ .animate-text-wave span { display: inline-block; animation: santy-text-wave 1s ease infinite; }
631
+ .animate-text-wave span:nth-child(1) { animation-delay: 0s; }
632
+ .animate-text-wave span:nth-child(2) { animation-delay: 0.08s; }
633
+ .animate-text-wave span:nth-child(3) { animation-delay: 0.16s; }
634
+ .animate-text-wave span:nth-child(4) { animation-delay: 0.24s; }
635
+ .animate-text-wave span:nth-child(5) { animation-delay: 0.32s; }
636
+ .animate-text-wave span:nth-child(6) { animation-delay: 0.40s; }
637
+ .animate-text-wave span:nth-child(7) { animation-delay: 0.48s; }
638
+ .animate-text-wave span:nth-child(8) { animation-delay: 0.56s; }
639
+ /* Glitch */
640
+ .animate-text-glitch { animation: santy-text-glitch 0.5s linear infinite; }
641
+ /* Neon pulse */
642
+ .animate-text-neon-pulse { animation: santy-neon-pulse 1.5s ease-in-out infinite alternate; }
643
+
644
+ @keyframes santy-typewriter { to { width: 100%; } }
645
+ @keyframes santy-blink-caret { 50% { border-color: transparent; } }
646
+ @keyframes santy-text-blur-in { from { filter: blur(12px); opacity: 0; } to { filter: blur(0); opacity: 1; } }
647
+ @keyframes santy-text-wave { 0%,100% { transform: translateY(0); } 50% { transform: translateY(-8px); } }
648
+ @keyframes santy-text-glitch {
649
+ 0%,100% { text-shadow: none; transform: none; }
650
+ 20% { text-shadow: -2px 0 #ff00c1, 2px 0 #00fff9; transform: skewX(-2deg); }
651
+ 40% { text-shadow: 2px 0 #ff00c1, -2px 0 #00fff9; transform: skewX(2deg); }
652
+ 60% { text-shadow: -2px 0 #00fff9; transform: skewX(0deg); }
653
+ 80% { text-shadow: 2px 0 #ff00c1; }
654
+ }
655
+ @keyframes santy-neon-pulse {
656
+ from { text-shadow: 0 0 4px currentColor, 0 0 10px currentColor; }
657
+ to { text-shadow: 0 0 8px currentColor, 0 0 20px currentColor, 0 0 40px currentColor; }
658
+ }
659
+
660
+ /* ═══════════════════════════════════════════════════════════════════════
661
+ STAGGERED ENTRANCE SEQUENCES
662
+ Apply parent class; children get incremental delays via nth-child.
663
+ ═══════════════════════════════════════════════════════════════════════ */
664
+ .animate-stagger-fade-in > * { animation: santy-fade-in 0.5s ease both; }
665
+ .animate-stagger-slide-up > * { animation: santy-slide-up 0.5s ease both; }
666
+ .animate-stagger-zoom-in > * { animation: santy-zoom-in 0.4s ease both; }
667
+ .animate-stagger-from-left > * { animation: santy-fade-in-from-left 0.5s ease both; }
668
+ .animate-stagger-from-right > * { animation: santy-fade-in-from-right 0.5s ease both; }
669
+
670
+ /* Delay each child — 100ms steps */
671
+ .animate-stagger-children-100 > *:nth-child(1) { animation-delay: 0.0s; }
672
+ .animate-stagger-children-100 > *:nth-child(2) { animation-delay: 0.1s; }
673
+ .animate-stagger-children-100 > *:nth-child(3) { animation-delay: 0.2s; }
674
+ .animate-stagger-children-100 > *:nth-child(4) { animation-delay: 0.3s; }
675
+ .animate-stagger-children-100 > *:nth-child(5) { animation-delay: 0.4s; }
676
+ .animate-stagger-children-100 > *:nth-child(6) { animation-delay: 0.5s; }
677
+ .animate-stagger-children-100 > *:nth-child(7) { animation-delay: 0.6s; }
678
+ .animate-stagger-children-100 > *:nth-child(8) { animation-delay: 0.7s; }
679
+ .animate-stagger-children-100 > *:nth-child(9) { animation-delay: 0.8s; }
680
+ .animate-stagger-children-100 > *:nth-child(10) { animation-delay: 0.9s; }
681
+ /* 200ms steps */
682
+ .animate-stagger-children-200 > *:nth-child(1) { animation-delay: 0.0s; }
683
+ .animate-stagger-children-200 > *:nth-child(2) { animation-delay: 0.2s; }
684
+ .animate-stagger-children-200 > *:nth-child(3) { animation-delay: 0.4s; }
685
+ .animate-stagger-children-200 > *:nth-child(4) { animation-delay: 0.6s; }
686
+ .animate-stagger-children-200 > *:nth-child(5) { animation-delay: 0.8s; }
687
+ .animate-stagger-children-200 > *:nth-child(6) { animation-delay: 1.0s; }
688
+ .animate-stagger-children-200 > *:nth-child(7) { animation-delay: 1.2s; }
689
+ .animate-stagger-children-200 > *:nth-child(8) { animation-delay: 1.4s; }
690
+ /* 300ms steps */
691
+ .animate-stagger-children-300 > *:nth-child(1) { animation-delay: 0.0s; }
692
+ .animate-stagger-children-300 > *:nth-child(2) { animation-delay: 0.3s; }
693
+ .animate-stagger-children-300 > *:nth-child(3) { animation-delay: 0.6s; }
694
+ .animate-stagger-children-300 > *:nth-child(4) { animation-delay: 0.9s; }
695
+ .animate-stagger-children-300 > *:nth-child(5) { animation-delay: 1.2s; }
696
+ .animate-stagger-children-300 > *:nth-child(6) { animation-delay: 1.5s; }
697
+
698
+ /* ═══════════════════════════════════════════════════════════════════════
699
+ MORPHING & SHAPE ANIMATIONS
700
+ ═══════════════════════════════════════════════════════════════════════ */
701
+ .animate-morph-blob { animation: santy-morph-blob 6s ease-in-out infinite; }
702
+ .animate-border-spin { animation: santy-border-spin 2s linear infinite; background: conic-gradient(from 0deg, #3b82f6, #8b5cf6, #ec4899, #3b82f6); }
703
+ .animate-shimmer { overflow: hidden; position: relative; background: #f0f0f0; }
704
+ .animate-shimmer::after {
705
+ content: '';
706
+ position: absolute;
707
+ inset: 0;
708
+ background: linear-gradient(90deg, transparent 0%, rgba(255,255,255,0.7) 50%, transparent 100%);
709
+ animation: santy-shimmer 1.5s ease-in-out infinite;
710
+ }
711
+ .animate-gradient-shift { background-size: 200% 200%; animation: santy-gradient-shift 3s ease infinite; }
712
+ .animate-morph-circle-to-square { animation: santy-morph-circle-to-square 1.5s ease-in-out infinite alternate; }
713
+ .animate-liquid { animation: santy-liquid 3s ease-in-out infinite; }
714
+
715
+ @keyframes santy-morph-blob {
716
+ 0%,100% { border-radius: 60% 40% 30% 70% / 60% 30% 70% 40%; }
717
+ 25% { border-radius: 30% 60% 70% 40% / 50% 60% 30% 60%; }
718
+ 50% { border-radius: 50% 60% 30% 60% / 40% 50% 60% 50%; }
719
+ 75% { border-radius: 40% 70% 60% 30% / 60% 40% 50% 70%; }
720
+ }
721
+ @keyframes santy-border-spin { to { transform: rotate(360deg); } }
722
+ @keyframes santy-shimmer { from { transform: translateX(-100%); } to { transform: translateX(100%); } }
723
+ @keyframes santy-gradient-shift { 0%,100% { background-position: 0% 50%; } 50% { background-position: 100% 50%; } }
724
+ @keyframes santy-morph-circle-to-square { from { border-radius: 50%; } to { border-radius: 0%; } }
725
+ @keyframes santy-liquid {
726
+ 0%,100% { border-radius: 40% 60% 60% 40% / 60% 30% 70% 40%; transform: rotate(0deg); }
727
+ 50% { border-radius: 60% 40% 30% 70% / 40% 60% 30% 60%; transform: rotate(5deg); }
728
+ }
729
+
730
+ /* ═══════════════════════════════════════════════════════════════════════
731
+ 3D ANIMATIONS
732
+ ═══════════════════════════════════════════════════════════════════════ */
733
+ .animate-flip-3d-x { animation: santy-flip-3d-x 0.7s ease both; }
734
+ .animate-flip-3d-y { animation: santy-flip-3d-y 0.7s ease both; }
735
+ .animate-rotate-3d { animation: santy-rotate-3d 1.2s linear infinite; }
736
+ .animate-tilt-left { animation: santy-tilt-left 0.4s ease both; }
737
+ .animate-tilt-right { animation: santy-tilt-right 0.4s ease both; }
738
+ .animate-depth-in { animation: santy-depth-in 0.5s ease both; }
739
+ .animate-depth-out { animation: santy-depth-out 0.5s ease both; }
740
+ .animate-swing-3d { animation: santy-swing-3d 1s ease-in-out infinite; transform-origin: top center; perspective: 400px; }
741
+
742
+ @keyframes santy-flip-3d-x { from { transform: perspective(400px) rotateX(90deg); opacity: 0; } to { transform: perspective(400px) rotateX(0deg); opacity: 1; } }
743
+ @keyframes santy-flip-3d-y { from { transform: perspective(400px) rotateY(90deg); opacity: 0; } to { transform: perspective(400px) rotateY(0deg); opacity: 1; } }
744
+ @keyframes santy-rotate-3d { from { transform: perspective(400px) rotate3d(1,1,0,0deg); } to { transform: perspective(400px) rotate3d(1,1,0,360deg); } }
745
+ @keyframes santy-tilt-left { from { transform: rotate(0deg); } to { transform: rotate(-6deg); } }
746
+ @keyframes santy-tilt-right { from { transform: rotate(0deg); } to { transform: rotate(6deg); } }
747
+ @keyframes santy-depth-in { from { transform: perspective(600px) translateZ(-80px); opacity: 0; } to { transform: perspective(600px) translateZ(0); opacity: 1; } }
748
+ @keyframes santy-depth-out { from { transform: perspective(600px) translateZ(0); opacity: 1; } to { transform: perspective(600px) translateZ(-80px); opacity: 0; } }
749
+ @keyframes santy-swing-3d {
750
+ 0%,100% { transform: perspective(400px) rotateY(0deg); }
751
+ 25% { transform: perspective(400px) rotateY(15deg); }
752
+ 75% { transform: perspective(400px) rotateY(-15deg); }
753
+ }
754
+
755
+ /* ═══════════════════════════════════════════════════════════════════════
756
+ EXIT + PAGE TRANSITION ANIMATIONS
757
+ ═══════════════════════════════════════════════════════════════════════ */
758
+ .animate-exit-fade-out { animation: santy-fade-out 0.4s ease both; }
759
+ .animate-exit-slide-left { animation: santy-exit-slide-left 0.4s ease both; }
760
+ .animate-exit-slide-right { animation: santy-exit-slide-right 0.4s ease both; }
761
+ .animate-exit-scale-down { animation: santy-exit-scale-down 0.35s ease both; }
762
+ .animate-exit-flip-out { animation: santy-flip-out 0.5s ease both; }
763
+ .animate-page-in-from-right { animation: santy-page-in-right 0.4s cubic-bezier(0.25,0.46,0.45,0.94) both; }
764
+ .animate-page-in-from-left { animation: santy-page-in-left 0.4s cubic-bezier(0.25,0.46,0.45,0.94) both; }
765
+ .animate-page-out-to-left { animation: santy-page-out-left 0.4s cubic-bezier(0.25,0.46,0.45,0.94) both; }
766
+ .animate-page-out-to-right { animation: santy-page-out-right 0.4s cubic-bezier(0.25,0.46,0.45,0.94) both; }
767
+
768
+ @keyframes santy-exit-slide-left { from { opacity: 1; transform: translateX(0); } to { opacity: 0; transform: translateX(-60px); } }
769
+ @keyframes santy-exit-slide-right { from { opacity: 1; transform: translateX(0); } to { opacity: 0; transform: translateX(60px); } }
770
+ @keyframes santy-exit-scale-down { from { opacity: 1; transform: scale(1); } to { opacity: 0; transform: scale(0.85); } }
771
+ @keyframes santy-page-in-right { from { opacity: 0; transform: translateX(100%); } to { opacity: 1; transform: translateX(0); } }
772
+ @keyframes santy-page-in-left { from { opacity: 0; transform: translateX(-100%); } to { opacity: 1; transform: translateX(0); } }
773
+ @keyframes santy-page-out-left { from { opacity: 1; transform: translateX(0); } to { opacity: 0; transform: translateX(-100%); } }
774
+ @keyframes santy-page-out-right { from { opacity: 1; transform: translateX(0); } to { opacity: 0; transform: translateX(100%); } }
775
+
776
+ /* View Transitions API */
777
+ .view-transition-fade { view-transition-name: fade-transition; }
778
+ .view-transition-slide { view-transition-name: slide-transition; }
779
+ @keyframes santy-vt-fade-in { from { opacity: 0; } }
780
+ @keyframes santy-vt-fade-out { to { opacity: 0; } }
781
+ ::view-transition-old(fade-transition) { animation: santy-vt-fade-out 0.3s ease; }
782
+ ::view-transition-new(fade-transition) { animation: santy-vt-fade-in 0.3s ease; }
783
+ ::view-transition-old(slide-transition) { animation: santy-page-out-left 0.35s ease; }
784
+ ::view-transition-new(slide-transition) { animation: santy-page-in-right 0.35s ease; }
785
+
786
+ /* ═══════════════════════════════════════════════════════════════════════
787
+ NOTIFICATION & UI FEEDBACK ANIMATIONS
788
+ ═══════════════════════════════════════════════════════════════════════ */
789
+ .animate-toast-in { animation: santy-toast-in 0.4s cubic-bezier(0.25,0.46,0.45,0.94) both; }
790
+ .animate-toast-out { animation: santy-toast-out 0.3s ease both; }
791
+ .animate-modal-in { animation: santy-modal-in 0.3s cubic-bezier(0.34,1.56,0.64,1) both; }
792
+ .animate-modal-out { animation: santy-modal-out 0.25s ease both; }
793
+ .animate-drawer-in-right { animation: santy-drawer-in-right 0.35s cubic-bezier(0.25,0.46,0.45,0.94) both; }
794
+ .animate-drawer-out-right { animation: santy-drawer-out-right 0.3s ease both; }
795
+ .animate-drawer-in-bottom { animation: santy-drawer-in-bottom 0.35s cubic-bezier(0.25,0.46,0.45,0.94) both; }
796
+ .animate-dropdown-in { animation: santy-dropdown-in 0.2s cubic-bezier(0.34,1.56,0.64,1) both; transform-origin: top center; }
797
+ .animate-dropdown-out { animation: santy-dropdown-out 0.15s ease both; transform-origin: top center; }
798
+ .animate-tooltip-in { animation: santy-zoom-in 0.15s ease both; }
799
+ .animate-badge-pop { animation: santy-badge-pop 0.4s cubic-bezier(0.34,1.56,0.64,1) both; }
800
+ .animate-success-checkmark { animation: santy-checkmark 0.6s ease both; stroke-dasharray: 50; stroke-dashoffset: 50; }
801
+ .animate-error-shake { animation: santy-shake-x 0.5s ease both; }
802
+
803
+ @keyframes santy-toast-in { from { opacity: 0; transform: translateY(100%) scale(0.9); } to { opacity: 1; transform: translateY(0) scale(1); } }
804
+ @keyframes santy-toast-out { from { opacity: 1; transform: translateY(0); } to { opacity: 0; transform: translateY(20px); } }
805
+ @keyframes santy-modal-in { from { opacity: 0; transform: scale(0.85); } to { opacity: 1; transform: scale(1); } }
806
+ @keyframes santy-modal-out { from { opacity: 1; transform: scale(1); } to { opacity: 0; transform: scale(0.9); } }
807
+ @keyframes santy-drawer-in-right { from { transform: translateX(100%); } to { transform: translateX(0); } }
808
+ @keyframes santy-drawer-out-right { from { transform: translateX(0); } to { transform: translateX(100%); } }
809
+ @keyframes santy-drawer-in-bottom { from { transform: translateY(100%); } to { transform: translateY(0); } }
810
+ @keyframes santy-dropdown-in { from { opacity: 0; transform: scaleY(0.8); } to { opacity: 1; transform: scaleY(1); } }
811
+ @keyframes santy-dropdown-out { from { opacity: 1; transform: scaleY(1); } to { opacity: 0; transform: scaleY(0.8); } }
812
+ @keyframes santy-badge-pop { 0% { transform: scale(0); } 60% { transform: scale(1.15); } 100% { transform: scale(1); } }
813
+ @keyframes santy-checkmark { to { stroke-dashoffset: 0; } }
814
+
815
+ /* ── Scroll-reveal observer snippet (embed in your HTML) ── */
816
+ /* <script>
817
+ new IntersectionObserver((entries) => {
818
+ entries.forEach(e => {
819
+ if(e.isIntersecting) {
820
+ e.target.classList.add('is-visible');
821
+ if(e.target.classList.contains('scroll-reveal-once'))
822
+ observer.unobserve(e.target);
823
+ } else {
824
+ if(e.target.classList.contains('scroll-reveal-repeat'))
825
+ e.target.classList.remove('is-visible');
826
+ }
827
+ });
828
+ }, { threshold: 0.15 }).observe(...document.querySelectorAll('[class*="animate-on-scroll"],[class*="scroll-reveal"]'));
829
+ </script> */