santycss 1.0.0 → 1.1.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,519 @@
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); } }
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
519
  @keyframes santy-roll-out { from { opacity: 1; } to { opacity: 0; transform: translate3d(100%,0,0) rotate3d(0,0,1,120deg); } }