@dotcraft/avatar 0.6.3 → 0.6.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/LICENSE +201 -201
  2. package/README.md +46 -43
  3. package/dist/accessories.css +14 -14
  4. package/dist/avatar.css +62 -62
  5. package/dist/composer/ComposerMascot.d.ts +1 -1
  6. package/dist/composer/ComposerMascot.d.ts.map +1 -1
  7. package/dist/composer/ComposerMascot.js +2 -2
  8. package/dist/composer/ComposerMascot.js.map +1 -1
  9. package/dist/composer/styles/energy.css +99 -99
  10. package/dist/composer/styles/expressions.css +20 -20
  11. package/dist/composer/styles/feedback.css +188 -188
  12. package/dist/composer/styles/focus.css +72 -72
  13. package/dist/composer/styles/foundation.css +301 -287
  14. package/dist/composer/styles/idle.css +438 -438
  15. package/dist/composer/styles/overdrive.css +264 -264
  16. package/dist/composer/styles/props.css +21 -21
  17. package/dist/composer/types.d.ts +1 -0
  18. package/dist/composer/types.d.ts.map +1 -1
  19. package/dist/rig.css +265 -265
  20. package/dist/styles.css +13 -13
  21. package/package.json +56 -55
  22. package/src/AnimatedDecoration.tsx +43 -0
  23. package/src/AppearanceRig.tsx +15 -0
  24. package/src/Avatar.tsx +85 -0
  25. package/src/DecorationShapes.tsx +8 -0
  26. package/src/Decorations.tsx +31 -0
  27. package/src/Faces.tsx +37 -0
  28. package/src/HatDecorations.tsx +75 -0
  29. package/src/HeldDecorations.tsx +48 -0
  30. package/src/MascotRig.tsx +191 -0
  31. package/src/ObjectDecorations.tsx +55 -0
  32. package/src/accessories.css +14 -0
  33. package/src/appearanceModel.ts +65 -0
  34. package/src/avatar.css +62 -0
  35. package/src/characters.ts +5 -0
  36. package/src/composer/ComposerMascot.tsx +521 -0
  37. package/src/composer/ComposerMascotShadow.tsx +5 -0
  38. package/src/composer/constants.ts +68 -0
  39. package/src/composer/mascotHandoff.ts +19 -0
  40. package/src/composer/styles/energy.css +99 -0
  41. package/src/composer/styles/expressions.css +20 -0
  42. package/src/composer/styles/feedback.css +188 -0
  43. package/src/composer/styles/focus.css +72 -0
  44. package/src/composer/styles/foundation.css +301 -0
  45. package/src/composer/styles/idle.css +438 -0
  46. package/src/composer/styles/overdrive.css +264 -0
  47. package/src/composer/styles/props.css +21 -0
  48. package/src/composer/types.ts +32 -0
  49. package/src/composer/useComposerAvatarBehavior.ts +97 -0
  50. package/src/composer/useComposerMotion.ts +15 -0
  51. package/src/composer/useComposerProfile.ts +50 -0
  52. package/src/decorationCatalog.ts +45 -0
  53. package/src/decorationMotion.ts +68 -0
  54. package/src/environment.ts +46 -0
  55. package/src/index.ts +5 -0
  56. package/src/palette.ts +52 -0
  57. package/src/react.ts +6 -0
  58. package/src/rig.css +265 -0
  59. package/src/styles.css +13 -0
  60. package/src/useEventReplay.ts +13 -0
  61. package/src/useGesture.ts +51 -0
@@ -1,438 +1,438 @@
1
- [data-composer-root]:has(.composer-mascot-active-idle) .composer-mascot-contact-shadow {
2
- opacity: 0;
3
- }
4
-
5
- .composer-mascot-active-idle .composer-mascot-motion {
6
- top: 0;
7
- left: 0;
8
- }
9
-
10
- .composer-mascot-active-idle[data-mascot-idle-phase='away'] .composer-mascot-breathe {
11
- animation: none;
12
- transform: scale(1);
13
- }
14
-
15
- .composer-mascot-active-idle[data-mascot-active-idle='hop'][data-mascot-idle-phase='away'] .composer-mascot-motion,
16
- .composer-mascot-active-idle[data-mascot-active-idle='hop'][data-mascot-idle-phase='inbound'] .composer-mascot-motion {
17
- left: -210px;
18
- }
19
-
20
- .composer-mascot-active-idle[data-mascot-active-idle='rocket'][data-mascot-idle-phase='away'] .composer-mascot-motion,
21
- .composer-mascot-active-idle[data-mascot-active-idle='rocket'][data-mascot-idle-phase='inbound'] .composer-mascot-motion {
22
- left: -220px;
23
- }
24
-
25
- .composer-mascot-active-idle[data-mascot-active-idle='hover'][data-mascot-idle-phase='away'] .composer-mascot-motion,
26
- .composer-mascot-active-idle[data-mascot-active-idle='hover'][data-mascot-idle-phase='inbound'] .composer-mascot-motion {
27
- top: -96px;
28
- left: -150px;
29
- }
30
-
31
- .composer-mascot-active-idle .composer-mascot-motion > div:first-child,
32
- .composer-mascot-active-idle .composer-mascot-motion > div:first-child > div:first-child,
33
- .composer-mascot-active-idle .composer-mascot-breathe {
34
- transform-origin: bottom center;
35
- will-change: transform;
36
- }
37
-
38
- .composer-mascot-active-idle .composer-mascot-motion > div:first-child > div:first-child {
39
- position: relative;
40
- z-index: 1;
41
- }
42
-
43
- .composer-mascot-active-idle[data-mascot-active-idle='hop'][data-mascot-idle-phase='outbound'] .composer-mascot-motion > div:first-child,
44
- .composer-mascot-active-idle[data-mascot-active-idle='hop'][data-mascot-idle-phase='inbound'] .composer-mascot-motion > div:first-child {
45
- --mascot-hop-compress-y: 0.82px;
46
- --mascot-hop-apex-y: -11.44px;
47
- --mascot-hop-fall-y: -2.86px;
48
- --mascot-hop-land-y: 0.41px;
49
- animation: composer-mascot-idle-hop-travel 2.4s linear forwards;
50
- }
51
-
52
- .composer-mascot-active-idle[data-mascot-active-idle='hop'][data-mascot-idle-phase='outbound'] .composer-mascot-motion > div:first-child {
53
- --mascot-hop-distance: -280px;
54
- --mascot-hop-x-1: -70px;
55
- --mascot-hop-x-2: -140px;
56
- --mascot-hop-x-3: -210px;
57
- }
58
-
59
- .composer-mascot-active-idle[data-mascot-active-idle='hop'][data-mascot-idle-phase='inbound'] .composer-mascot-motion > div:first-child {
60
- --mascot-hop-distance: 280px;
61
- --mascot-hop-x-1: 70px;
62
- --mascot-hop-x-2: 140px;
63
- --mascot-hop-x-3: 210px;
64
- }
65
-
66
- .composer-mascot-active-idle[data-mascot-active-idle='hop'][data-mascot-idle-phase='outbound'] .composer-mascot-breathe,
67
- .composer-mascot-active-idle[data-mascot-active-idle='hop'][data-mascot-idle-phase='inbound'] .composer-mascot-breathe {
68
- animation: composer-mascot-idle-hop-body 600ms linear 4;
69
- }
70
-
71
- .composer-mascot-active-idle[data-mascot-active-idle='hop'] .composer-mascot-motion > div:first-child::before,
72
- .composer-mascot-active-idle[data-mascot-active-idle='rocket'] .composer-mascot-motion > div:first-child::before {
73
- content: '';
74
- position: absolute;
75
- bottom: -1px;
76
- left: 50%;
77
- z-index: 0;
78
- width: 31px;
79
- height: 5px;
80
- border-radius: 50%;
81
- background: color-mix(in srgb, var(--text-primary) 15%, transparent);
82
- filter: blur(2px);
83
- pointer-events: none;
84
- transform: translateX(-50%);
85
- transform-origin: center;
86
- }
87
-
88
- .composer-mascot-active-idle[data-mascot-active-idle='hop'][data-mascot-idle-phase='outbound'] .composer-mascot-motion > div:first-child::before,
89
- .composer-mascot-active-idle[data-mascot-active-idle='hop'][data-mascot-idle-phase='inbound'] .composer-mascot-motion > div:first-child::before {
90
- animation: composer-mascot-idle-hop-shadow 600ms ease-in-out 4;
91
- }
92
-
93
- @keyframes composer-mascot-idle-hop-travel {
94
- 0% { transform: translateX(0); animation-timing-function: cubic-bezier(0.45, 0, 0.55, 1); }
95
- 25% { transform: translateX(var(--mascot-hop-x-1)); animation-timing-function: cubic-bezier(0.45, 0, 0.55, 1); }
96
- 50% { transform: translateX(var(--mascot-hop-x-2)); animation-timing-function: cubic-bezier(0.45, 0, 0.55, 1); }
97
- 75% { transform: translateX(var(--mascot-hop-x-3)); animation-timing-function: cubic-bezier(0.45, 0, 0.55, 1); }
98
- 100% { transform: translateX(var(--mascot-hop-distance)); }
99
- }
100
-
101
- @keyframes composer-mascot-idle-hop-body {
102
- 0% { transform: translateY(0) scale(1); animation-timing-function: cubic-bezier(0.55, 0, 1, 0.45); }
103
- 7% { transform: translateY(var(--mascot-hop-compress-y)) scale(1.075, 0.925); animation-timing-function: cubic-bezier(0.22, 1, 0.36, 1); }
104
- 44% { transform: translateY(var(--mascot-hop-apex-y)) scale(0.965, 1.055); animation-timing-function: cubic-bezier(0.64, 0, 0.78, 0); }
105
- 78% { transform: translateY(var(--mascot-hop-fall-y)) scale(0.995, 1.005); }
106
- 90% { transform: translateY(var(--mascot-hop-land-y)) scale(1.085, 0.91); animation-timing-function: cubic-bezier(0.34, 1.56, 0.64, 1); }
107
- 100% { transform: translateY(0) scale(1); }
108
- }
109
-
110
- @keyframes composer-mascot-idle-hop-shadow {
111
- 0%, 100% { opacity: 0.64; transform: translateX(-50%) scaleX(1); }
112
- 7% { opacity: 0.74; transform: translateX(-50%) scaleX(1.08); }
113
- 44% { opacity: 0.16; transform: translateX(-50%) scaleX(0.5); }
114
- 78% { opacity: 0.42; transform: translateX(-50%) scaleX(0.78); }
115
- 90% { opacity: 0.76; transform: translateX(-50%) scaleX(1.12); }
116
- }
117
-
118
- .composer-mascot-active-idle[data-mascot-active-idle='rocket'][data-mascot-idle-phase='outbound'] .composer-mascot-motion > div:first-child,
119
- .composer-mascot-active-idle[data-mascot-active-idle='rocket'][data-mascot-idle-phase='inbound'] .composer-mascot-motion > div:first-child {
120
- --mascot-rocket-apex-y: -66.99px;
121
- --mascot-rocket-crouch-y: 1.23px;
122
- --mascot-rocket-air-y: -2.04px;
123
- --mascot-rocket-approach-y: -0.82px;
124
- --mascot-rocket-rebound-y: -1.23px;
125
- animation: composer-mascot-idle-rocket-flight-x 1.8s linear forwards;
126
- }
127
-
128
- .composer-mascot-active-idle[data-mascot-active-idle='rocket'][data-mascot-idle-phase='outbound'] .composer-mascot-motion > div:first-child {
129
- --mascot-flight-distance: -293.33px;
130
- --mascot-rocket-tilt: -8deg;
131
- }
132
-
133
- .composer-mascot-active-idle[data-mascot-active-idle='rocket'][data-mascot-idle-phase='inbound'] .composer-mascot-motion > div:first-child {
134
- --mascot-flight-distance: 293.33px;
135
- --mascot-rocket-tilt: 8deg;
136
- }
137
-
138
- .composer-mascot-active-idle[data-mascot-active-idle='rocket'][data-mascot-idle-phase='outbound'] .composer-mascot-motion > div:first-child > div:first-child,
139
- .composer-mascot-active-idle[data-mascot-active-idle='rocket'][data-mascot-idle-phase='inbound'] .composer-mascot-motion > div:first-child > div:first-child {
140
- animation: composer-mascot-idle-rocket-flight-y 1.8s linear forwards;
141
- }
142
-
143
- .composer-mascot-active-idle[data-mascot-active-idle='rocket'][data-mascot-idle-phase='outbound'] .composer-mascot-breathe,
144
- .composer-mascot-active-idle[data-mascot-active-idle='rocket'][data-mascot-idle-phase='inbound'] .composer-mascot-breathe {
145
- animation: composer-mascot-idle-rocket-body 1.8s ease-out forwards;
146
- }
147
-
148
- .composer-mascot-active-idle[data-mascot-active-idle='rocket'][data-mascot-idle-phase='outbound'] .composer-mascot-motion > div:first-child::before,
149
- .composer-mascot-active-idle[data-mascot-active-idle='rocket'][data-mascot-idle-phase='inbound'] .composer-mascot-motion > div:first-child::before {
150
- animation: composer-mascot-idle-flight-shadow 1.8s ease-in-out forwards;
151
- }
152
-
153
- .composer-mascot-active-idle[data-mascot-active-idle='rocket'] .composer-mascot-jelly {
154
- position: relative;
155
- isolation: isolate;
156
- }
157
-
158
- .composer-mascot-active-idle[data-mascot-active-idle='rocket'][data-mascot-idle-phase='outbound'] .composer-mascot-jelly::before,
159
- .composer-mascot-active-idle[data-mascot-active-idle='rocket'][data-mascot-idle-phase='inbound'] .composer-mascot-jelly::before {
160
- content: '';
161
- position: absolute;
162
- top: 17px;
163
- z-index: 1;
164
- width: 48px;
165
- height: 25px;
166
- filter: drop-shadow(0 0 3px color-mix(in srgb, #8fa5ff 45%, transparent));
167
- opacity: 0;
168
- pointer-events: none;
169
- animation: composer-mascot-idle-rocket-trail 1.8s ease-out forwards;
170
- }
171
-
172
- .composer-mascot-active-idle[data-mascot-active-idle='rocket'][data-mascot-idle-phase='outbound'] .composer-mascot-jelly::before {
173
- left: calc(100% - 2px);
174
- background:
175
- linear-gradient(90deg, #f5f7fa, #8fa5ff 28%, transparent 100%) 0 1px / 34px 2px no-repeat,
176
- linear-gradient(90deg, #f5f7fa, #8fa5ff 28%, transparent 100%) 0 11px / 48px 2px no-repeat,
177
- linear-gradient(90deg, #f5f7fa, #8fa5ff 28%, transparent 100%) 0 21px / 26px 2px no-repeat;
178
- transform-origin: left center;
179
- }
180
-
181
- .composer-mascot-active-idle[data-mascot-active-idle='rocket'][data-mascot-idle-phase='inbound'] .composer-mascot-jelly::before {
182
- right: calc(100% - 2px);
183
- background:
184
- linear-gradient(90deg, transparent 0%, #8fa5ff 72%, #f5f7fa 100%) 100% 1px / 34px 2px no-repeat,
185
- linear-gradient(90deg, transparent 0%, #8fa5ff 72%, #f5f7fa 100%) 100% 11px / 48px 2px no-repeat,
186
- linear-gradient(90deg, transparent 0%, #8fa5ff 72%, #f5f7fa 100%) 100% 21px / 26px 2px no-repeat;
187
- transform-origin: right center;
188
- }
189
-
190
- @keyframes composer-mascot-idle-rocket-flight-x {
191
- 0% { transform: translateX(0); }
192
- 16% { transform: translateX(0); animation-timing-function: cubic-bezier(0.45, 0, 0.55, 1); }
193
- 86%, 100% { transform: translateX(var(--mascot-flight-distance)); }
194
- }
195
-
196
- @keyframes composer-mascot-idle-rocket-flight-y {
197
- 0% { transform: translateY(0); }
198
- 16% { transform: translateY(0); animation-timing-function: cubic-bezier(0.22, 1, 0.36, 1); }
199
- 51% { transform: translateY(var(--mascot-rocket-apex-y)); animation-timing-function: cubic-bezier(0.64, 0, 0.78, 0); }
200
- 86%, 100% { transform: translateY(0); }
201
- }
202
-
203
- @keyframes composer-mascot-idle-rocket-body {
204
- 0% { transform: translateY(0) rotate(0) scale(1); }
205
- 9% { transform: translateY(var(--mascot-rocket-crouch-y)) rotate(0) scale(1.12, 0.82); }
206
- 17% { transform: translateY(var(--mascot-rocket-air-y)) rotate(var(--mascot-rocket-tilt)) scale(0.93, 1.09); }
207
- 72% { transform: translateY(var(--mascot-rocket-air-y)) rotate(var(--mascot-rocket-tilt)) scale(0.97, 1.04); }
208
- 84% { transform: translateY(var(--mascot-rocket-approach-y)) rotate(0) scale(1); }
209
- 89% { transform: translateY(0) rotate(0) scale(1.12, 0.86); }
210
- 96% { transform: translateY(var(--mascot-rocket-rebound-y)) rotate(0) scale(0.98, 1.03); }
211
- 100% { transform: translateY(0) rotate(0) scale(1); }
212
- }
213
-
214
- @keyframes composer-mascot-idle-rocket-trail {
215
- 0%, 15% { opacity: 0; transform: scaleX(0.15); }
216
- 27% { opacity: 0.72; transform: scaleX(1); }
217
- 73% { opacity: 0.5; transform: scaleX(0.76); }
218
- 86%, 100% { opacity: 0; transform: scaleX(0.2); }
219
- }
220
-
221
- @keyframes composer-mascot-idle-flight-shadow {
222
- 0%, 16% { opacity: 0.65; transform: translateX(-50%) scaleX(1); }
223
- 51% { opacity: 0.1; transform: translateX(-50%) scaleX(0.45); }
224
- 86%, 100% { opacity: 0.7; transform: translateX(-50%) scaleX(1.12); }
225
- }
226
-
227
- .composer-mascot-active-idle[data-mascot-active-idle='hover'][data-mascot-idle-phase='outbound'] .composer-mascot-motion > div:first-child {
228
- --mascot-hover-x: -200px;
229
- --mascot-hover-y: -128px;
230
- animation: composer-mascot-idle-hover-rise-x 1.8s cubic-bezier(0.26, 0.55, 0.24, 1) forwards;
231
- }
232
-
233
- .composer-mascot-active-idle[data-mascot-active-idle='hover'][data-mascot-idle-phase='outbound'] .composer-mascot-motion > div:first-child > div:first-child {
234
- animation: composer-mascot-idle-hover-rise-y 1.8s linear forwards;
235
- }
236
-
237
- .composer-mascot-active-idle[data-mascot-active-idle='hover'][data-mascot-idle-phase='away'] .composer-mascot-motion > div:first-child > div:first-child {
238
- animation: composer-mascot-idle-hover-float 2.8s ease-in-out forwards;
239
- }
240
-
241
- .composer-mascot-active-idle[data-mascot-active-idle='hover'][data-mascot-idle-phase='inbound'] .composer-mascot-motion > div:first-child {
242
- --mascot-hover-x: 200px;
243
- --mascot-hover-y: 128px;
244
- animation: composer-mascot-idle-hover-return-x 1.8s cubic-bezier(0.38, 0.04, 0.34, 1) forwards;
245
- }
246
-
247
- .composer-mascot-active-idle[data-mascot-active-idle='hover'][data-mascot-idle-phase='inbound'] .composer-mascot-motion > div:first-child > div:first-child {
248
- animation: composer-mascot-idle-hover-return-y 1.8s linear forwards;
249
- }
250
-
251
- .composer-mascot-active-idle[data-mascot-active-idle='hover'][data-mascot-idle-phase='outbound'] .composer-mascot-breathe {
252
- animation: composer-mascot-idle-hover-launch-body 1.8s ease-out forwards;
253
- }
254
-
255
- .composer-mascot-active-idle[data-mascot-active-idle='hover'][data-mascot-idle-phase='away'] .composer-mascot-breathe {
256
- animation: composer-mascot-idle-hover-hold-body 2.8s ease-in-out forwards;
257
- }
258
-
259
- .composer-mascot-active-idle[data-mascot-active-idle='hover'][data-mascot-idle-phase='inbound'] .composer-mascot-breathe {
260
- animation: composer-mascot-idle-hover-land-body 1.8s ease-in forwards;
261
- }
262
-
263
- .composer-mascot-active-idle[data-mascot-active-idle='hover'][data-mascot-idle-phase='away'] .composer-mascot-jelly {
264
- animation: composer-mascot-idle-hover-scan-body 2.8s ease-in-out forwards;
265
- }
266
-
267
- .composer-mascot-active-idle[data-mascot-active-idle='hover'] .composer-mascot-jelly {
268
- position: relative;
269
- isolation: isolate;
270
- }
271
-
272
- .composer-mascot-active-idle[data-mascot-active-idle='hover'] .composer-mascot-jelly::before {
273
- content: '';
274
- position: absolute;
275
- top: 16px;
276
- left: 40px;
277
- z-index: 1;
278
- width: 58px;
279
- height: 32px;
280
- background:
281
- linear-gradient(90deg, #f8fbff 0%, #9fb5ff 28%, transparent 94%) 0 3px / 42px 3px no-repeat,
282
- linear-gradient(90deg, #f8fbff 0%, #7894f8 26%, transparent 96%) 0 14px / 58px 3px no-repeat,
283
- linear-gradient(90deg, #dce6ff 0%, #6f8cf5 32%, transparent 94%) 0 25px / 34px 3px no-repeat;
284
- filter: drop-shadow(6px 3px 5px color-mix(in srgb, #6f8dff 54%, transparent));
285
- opacity: 0;
286
- pointer-events: none;
287
- transform: rotate(22deg) scaleX(0.18);
288
- transform-origin: left center;
289
- }
290
-
291
- .composer-mascot-active-idle[data-mascot-active-idle='hover'][data-mascot-idle-phase='outbound'] .composer-mascot-jelly::before {
292
- animation: composer-mascot-idle-hover-side-jet-launch 1.8s ease-out forwards;
293
- }
294
-
295
- .composer-mascot-active-idle[data-mascot-active-idle='hover'][data-mascot-idle-phase='inbound'] .composer-mascot-jelly::before {
296
- right: 40px;
297
- left: auto;
298
- background:
299
- linear-gradient(90deg, transparent 6%, #9fb5ff 72%, #f8fbff 100%) 100% 3px / 42px 3px no-repeat,
300
- linear-gradient(90deg, transparent 4%, #7894f8 74%, #f8fbff 100%) 100% 14px / 58px 3px no-repeat,
301
- linear-gradient(90deg, transparent 6%, #6f8cf5 68%, #dce6ff 100%) 100% 25px / 34px 3px no-repeat;
302
- filter: drop-shadow(-5px 3px 5px color-mix(in srgb, #6f8dff 54%, transparent));
303
- transform: rotate(-18deg) scaleX(0.18);
304
- transform-origin: right center;
305
- animation: composer-mascot-idle-hover-side-jet-return 1.8s ease-out forwards;
306
- }
307
-
308
- .composer-mascot-active-idle[data-mascot-active-idle='hover'] .composer-mascot-jelly::after {
309
- content: '';
310
- position: absolute;
311
- top: 46px;
312
- left: 50%;
313
- z-index: 1;
314
- width: 38px;
315
- height: 48px;
316
- background:
317
- radial-gradient(circle at 25% 72%, #7895fa 0 1px, transparent 2px),
318
- radial-gradient(circle at 74% 84%, #aabfff 0 1px, transparent 2px),
319
- radial-gradient(ellipse at 50% 2%, rgb(255 255 255 / 0.96) 0 7%, transparent 30%),
320
- linear-gradient(180deg, #f8fbff 0%, #9fb5ff 27%, #5b76ee 55%, transparent 92%) center top / 8px 46px no-repeat,
321
- linear-gradient(180deg, #dce6ff 0%, #7894f8 34%, transparent 88%) 8px 2px / 5px 35px no-repeat,
322
- linear-gradient(180deg, #dce6ff 0%, #7894f8 34%, transparent 88%) calc(100% - 8px) 2px / 5px 35px no-repeat;
323
- filter: drop-shadow(0 6px 5px color-mix(in srgb, #6f8dff 54%, transparent));
324
- opacity: 0;
325
- pointer-events: none;
326
- transform: translateX(-50%) scaleY(0.2);
327
- transform-origin: top center;
328
- }
329
-
330
- .composer-mascot-active-idle[data-mascot-active-idle='hover'][data-mascot-idle-phase='outbound'] .composer-mascot-jelly::after {
331
- animation: composer-mascot-idle-hover-bottom-handoff 1.8s ease-out forwards;
332
- }
333
-
334
- .composer-mascot-active-idle[data-mascot-active-idle='hover'][data-mascot-idle-phase='away'] .composer-mascot-jelly::after {
335
- animation: composer-mascot-idle-hover-bottom-hold 360ms ease-in-out infinite;
336
- }
337
-
338
- .composer-mascot-active-idle[data-mascot-active-idle='hover'][data-mascot-idle-phase='inbound'] .composer-mascot-jelly::after {
339
- animation: composer-mascot-idle-hover-bottom-return 1.8s linear forwards;
340
- }
341
-
342
- @keyframes composer-mascot-idle-hover-rise-x {
343
- from { transform: translateX(0); }
344
- to { transform: translateX(var(--mascot-hover-x)); }
345
- }
346
-
347
- @keyframes composer-mascot-idle-hover-rise-y {
348
- 0% { transform: translateY(0); animation-timing-function: cubic-bezier(0.2, 0.7, 0.2, 1); }
349
- 82% { transform: translateY(calc(var(--mascot-hover-y) - 8px)); animation-timing-function: cubic-bezier(0.34, 1.25, 0.64, 1); }
350
- 100% { transform: translateY(var(--mascot-hover-y)); }
351
- }
352
-
353
- @keyframes composer-mascot-idle-hover-return-x {
354
- from { transform: translateX(0); }
355
- to { transform: translateX(var(--mascot-hover-x)); }
356
- }
357
-
358
- @keyframes composer-mascot-idle-hover-return-y {
359
- 0% { transform: translateY(0); animation-timing-function: cubic-bezier(0.4, 0, 0.72, 0.48); }
360
- 78% { transform: translateY(calc(var(--mascot-hover-y) + 4px)); animation-timing-function: cubic-bezier(0.34, 1.32, 0.64, 1); }
361
- 91% { transform: translateY(calc(var(--mascot-hover-y) - 3px)); animation-timing-function: ease-out; }
362
- 100% { transform: translateY(var(--mascot-hover-y)); }
363
- }
364
-
365
- @keyframes composer-mascot-idle-hover-float {
366
- 0%, 100% { transform: translateY(0); }
367
- 20% { transform: translateY(-5px); }
368
- 43% { transform: translateY(1px); }
369
- 68% { transform: translateY(-4px); }
370
- 86% { transform: translateY(1px); }
371
- }
372
-
373
- @keyframes composer-mascot-idle-hover-launch-body {
374
- 0% { transform: translateY(0) scale(1); }
375
- 10% { transform: translateY(2px) scale(1.12, 0.82); }
376
- 22% { transform: translateY(-3px) rotate(-8deg) scale(0.94, 1.09); }
377
- 72% { transform: translateY(-2px) rotate(-5deg) scale(0.98, 1.035); }
378
- 90% { transform: translateY(1px) rotate(-2deg) scale(1.02, 0.98); }
379
- 100% { transform: translateY(0) rotate(0) scale(1); }
380
- }
381
-
382
- @keyframes composer-mascot-idle-hover-hold-body {
383
- 0%, 100% { transform: scale(1); }
384
- 20%, 68% { transform: scale(0.985, 1.02); }
385
- 43%, 86% { transform: scale(1.012, 0.99); }
386
- }
387
-
388
- @keyframes composer-mascot-idle-hover-land-body {
389
- 0% { transform: translateY(0) rotate(0) scale(1); }
390
- 18% { transform: translateY(-1px) rotate(5deg) scale(0.99, 1.02); }
391
- 66% { transform: translateY(-1px) rotate(3deg) scale(0.99, 1.02); }
392
- 86% { transform: translateY(0) rotate(0) scale(1); }
393
- 91% { transform: translateY(1px) rotate(0) scale(1.1, 0.88); }
394
- 95% { transform: translateY(-1px) rotate(0) scale(0.99, 1.02); }
395
- 99%, 100% { transform: translateY(0) rotate(0) scale(1); }
396
- }
397
-
398
- @keyframes composer-mascot-idle-hover-scan-body {
399
- 0%, 12%, 46%, 54%, 88%, 100% { transform: rotate(0); }
400
- 20%, 38% { transform: rotate(-2.4deg); }
401
- 62%, 80% { transform: rotate(2.4deg); }
402
- }
403
-
404
- @keyframes composer-mascot-idle-hover-side-jet-launch {
405
- 0% { opacity: 0.34; transform: rotate(22deg) scaleX(0.34); }
406
- 12% { opacity: 0.94; transform: rotate(22deg) scaleX(1.08); }
407
- 68% { opacity: 0.76; transform: rotate(22deg) scaleX(0.84); }
408
- 84% { opacity: 0.42; transform: rotate(22deg) scaleX(0.48); }
409
- 100% { opacity: 0; transform: rotate(22deg) scaleX(0.12); }
410
- }
411
-
412
- @keyframes composer-mascot-idle-hover-side-jet-return {
413
- 0% { opacity: 0.28; transform: rotate(-18deg) scaleX(0.28); }
414
- 12% { opacity: 0.88; transform: rotate(-18deg) scaleX(0.92); }
415
- 52% { opacity: 0.66; transform: rotate(-18deg) scaleX(0.62); }
416
- 74% { opacity: 0.3; transform: rotate(-18deg) scaleX(0.34); }
417
- 86%, 100% { opacity: 0; transform: rotate(-18deg) scaleX(0.12); }
418
- }
419
-
420
- @keyframes composer-mascot-idle-hover-bottom-handoff {
421
- 0%, 70% { opacity: 0; transform: translateX(-50%) scaleY(0.16); }
422
- 84% { opacity: 0.58; transform: translateX(-50%) scaleY(0.58); }
423
- 100% { opacity: 0.78; transform: translateX(-50%) scaleY(0.72); }
424
- }
425
-
426
- @keyframes composer-mascot-idle-hover-bottom-hold {
427
- 0%, 100% { opacity: 0.72; transform: translateX(-50%) scaleY(0.68) scaleX(0.94); }
428
- 50% { opacity: 0.92; transform: translateX(-50%) scaleY(0.88) scaleX(1.04); }
429
- }
430
-
431
- @keyframes composer-mascot-idle-hover-bottom-return {
432
- 0% { opacity: 0.78; transform: translateX(-50%) rotate(0) scaleY(0.72); animation-timing-function: ease-in-out; }
433
- 24% { opacity: 0.68; transform: translateX(-50%) rotate(8deg) scaleY(0.58); }
434
- 58% { opacity: 0.44; transform: translateX(-50%) rotate(7deg) scaleY(0.38); }
435
- 78% { opacity: 0.86; transform: translateX(-50%) rotate(3deg) scaleY(0.84); }
436
- 91% { opacity: 0.98; transform: translateX(-50%) rotate(0) scaleY(1.04); }
437
- 100% { opacity: 0; transform: translateX(-50%) rotate(0) scaleY(0.14); }
438
- }
1
+ [data-composer-root]:has(.composer-mascot-active-idle) .composer-mascot-contact-shadow {
2
+ opacity: 0;
3
+ }
4
+
5
+ .composer-mascot-active-idle .composer-mascot-motion {
6
+ top: 0;
7
+ left: 0;
8
+ }
9
+
10
+ .composer-mascot-active-idle[data-mascot-idle-phase='away'] .composer-mascot-breathe {
11
+ animation: none;
12
+ transform: scale(1);
13
+ }
14
+
15
+ .composer-mascot-active-idle[data-mascot-active-idle='hop'][data-mascot-idle-phase='away'] .composer-mascot-motion,
16
+ .composer-mascot-active-idle[data-mascot-active-idle='hop'][data-mascot-idle-phase='inbound'] .composer-mascot-motion {
17
+ left: -210px;
18
+ }
19
+
20
+ .composer-mascot-active-idle[data-mascot-active-idle='rocket'][data-mascot-idle-phase='away'] .composer-mascot-motion,
21
+ .composer-mascot-active-idle[data-mascot-active-idle='rocket'][data-mascot-idle-phase='inbound'] .composer-mascot-motion {
22
+ left: -220px;
23
+ }
24
+
25
+ .composer-mascot-active-idle[data-mascot-active-idle='hover'][data-mascot-idle-phase='away'] .composer-mascot-motion,
26
+ .composer-mascot-active-idle[data-mascot-active-idle='hover'][data-mascot-idle-phase='inbound'] .composer-mascot-motion {
27
+ top: -96px;
28
+ left: -150px;
29
+ }
30
+
31
+ .composer-mascot-active-idle .composer-mascot-motion > div:first-child,
32
+ .composer-mascot-active-idle .composer-mascot-motion > div:first-child > div:first-child,
33
+ .composer-mascot-active-idle .composer-mascot-breathe {
34
+ transform-origin: bottom center;
35
+ will-change: transform;
36
+ }
37
+
38
+ .composer-mascot-active-idle .composer-mascot-motion > div:first-child > div:first-child {
39
+ position: relative;
40
+ z-index: 1;
41
+ }
42
+
43
+ .composer-mascot-active-idle[data-mascot-active-idle='hop'][data-mascot-idle-phase='outbound'] .composer-mascot-motion > div:first-child,
44
+ .composer-mascot-active-idle[data-mascot-active-idle='hop'][data-mascot-idle-phase='inbound'] .composer-mascot-motion > div:first-child {
45
+ --mascot-hop-compress-y: 0.82px;
46
+ --mascot-hop-apex-y: -11.44px;
47
+ --mascot-hop-fall-y: -2.86px;
48
+ --mascot-hop-land-y: 0.41px;
49
+ animation: composer-mascot-idle-hop-travel 2.4s linear forwards;
50
+ }
51
+
52
+ .composer-mascot-active-idle[data-mascot-active-idle='hop'][data-mascot-idle-phase='outbound'] .composer-mascot-motion > div:first-child {
53
+ --mascot-hop-distance: -280px;
54
+ --mascot-hop-x-1: -70px;
55
+ --mascot-hop-x-2: -140px;
56
+ --mascot-hop-x-3: -210px;
57
+ }
58
+
59
+ .composer-mascot-active-idle[data-mascot-active-idle='hop'][data-mascot-idle-phase='inbound'] .composer-mascot-motion > div:first-child {
60
+ --mascot-hop-distance: 280px;
61
+ --mascot-hop-x-1: 70px;
62
+ --mascot-hop-x-2: 140px;
63
+ --mascot-hop-x-3: 210px;
64
+ }
65
+
66
+ .composer-mascot-active-idle[data-mascot-active-idle='hop'][data-mascot-idle-phase='outbound'] .composer-mascot-breathe,
67
+ .composer-mascot-active-idle[data-mascot-active-idle='hop'][data-mascot-idle-phase='inbound'] .composer-mascot-breathe {
68
+ animation: composer-mascot-idle-hop-body 600ms linear 4;
69
+ }
70
+
71
+ .composer-mascot-active-idle[data-mascot-active-idle='hop'] .composer-mascot-motion > div:first-child::before,
72
+ .composer-mascot-active-idle[data-mascot-active-idle='rocket'] .composer-mascot-motion > div:first-child::before {
73
+ content: '';
74
+ position: absolute;
75
+ bottom: -1px;
76
+ left: 50%;
77
+ z-index: 0;
78
+ width: 31px;
79
+ height: 5px;
80
+ border-radius: 50%;
81
+ background: color-mix(in srgb, var(--dca-theme-ink) 15%, transparent);
82
+ filter: blur(2px);
83
+ pointer-events: none;
84
+ transform: translateX(-50%);
85
+ transform-origin: center;
86
+ }
87
+
88
+ .composer-mascot-active-idle[data-mascot-active-idle='hop'][data-mascot-idle-phase='outbound'] .composer-mascot-motion > div:first-child::before,
89
+ .composer-mascot-active-idle[data-mascot-active-idle='hop'][data-mascot-idle-phase='inbound'] .composer-mascot-motion > div:first-child::before {
90
+ animation: composer-mascot-idle-hop-shadow 600ms ease-in-out 4;
91
+ }
92
+
93
+ @keyframes composer-mascot-idle-hop-travel {
94
+ 0% { transform: translateX(0); animation-timing-function: cubic-bezier(0.45, 0, 0.55, 1); }
95
+ 25% { transform: translateX(var(--mascot-hop-x-1)); animation-timing-function: cubic-bezier(0.45, 0, 0.55, 1); }
96
+ 50% { transform: translateX(var(--mascot-hop-x-2)); animation-timing-function: cubic-bezier(0.45, 0, 0.55, 1); }
97
+ 75% { transform: translateX(var(--mascot-hop-x-3)); animation-timing-function: cubic-bezier(0.45, 0, 0.55, 1); }
98
+ 100% { transform: translateX(var(--mascot-hop-distance)); }
99
+ }
100
+
101
+ @keyframes composer-mascot-idle-hop-body {
102
+ 0% { transform: translateY(0) scale(1); animation-timing-function: cubic-bezier(0.55, 0, 1, 0.45); }
103
+ 7% { transform: translateY(var(--mascot-hop-compress-y)) scale(1.075, 0.925); animation-timing-function: cubic-bezier(0.22, 1, 0.36, 1); }
104
+ 44% { transform: translateY(var(--mascot-hop-apex-y)) scale(0.965, 1.055); animation-timing-function: cubic-bezier(0.64, 0, 0.78, 0); }
105
+ 78% { transform: translateY(var(--mascot-hop-fall-y)) scale(0.995, 1.005); }
106
+ 90% { transform: translateY(var(--mascot-hop-land-y)) scale(1.085, 0.91); animation-timing-function: cubic-bezier(0.34, 1.56, 0.64, 1); }
107
+ 100% { transform: translateY(0) scale(1); }
108
+ }
109
+
110
+ @keyframes composer-mascot-idle-hop-shadow {
111
+ 0%, 100% { opacity: 0.64; transform: translateX(-50%) scaleX(1); }
112
+ 7% { opacity: 0.74; transform: translateX(-50%) scaleX(1.08); }
113
+ 44% { opacity: 0.16; transform: translateX(-50%) scaleX(0.5); }
114
+ 78% { opacity: 0.42; transform: translateX(-50%) scaleX(0.78); }
115
+ 90% { opacity: 0.76; transform: translateX(-50%) scaleX(1.12); }
116
+ }
117
+
118
+ .composer-mascot-active-idle[data-mascot-active-idle='rocket'][data-mascot-idle-phase='outbound'] .composer-mascot-motion > div:first-child,
119
+ .composer-mascot-active-idle[data-mascot-active-idle='rocket'][data-mascot-idle-phase='inbound'] .composer-mascot-motion > div:first-child {
120
+ --mascot-rocket-apex-y: -66.99px;
121
+ --mascot-rocket-crouch-y: 1.23px;
122
+ --mascot-rocket-air-y: -2.04px;
123
+ --mascot-rocket-approach-y: -0.82px;
124
+ --mascot-rocket-rebound-y: -1.23px;
125
+ animation: composer-mascot-idle-rocket-flight-x 1.8s linear forwards;
126
+ }
127
+
128
+ .composer-mascot-active-idle[data-mascot-active-idle='rocket'][data-mascot-idle-phase='outbound'] .composer-mascot-motion > div:first-child {
129
+ --mascot-flight-distance: -293.33px;
130
+ --mascot-rocket-tilt: -8deg;
131
+ }
132
+
133
+ .composer-mascot-active-idle[data-mascot-active-idle='rocket'][data-mascot-idle-phase='inbound'] .composer-mascot-motion > div:first-child {
134
+ --mascot-flight-distance: 293.33px;
135
+ --mascot-rocket-tilt: 8deg;
136
+ }
137
+
138
+ .composer-mascot-active-idle[data-mascot-active-idle='rocket'][data-mascot-idle-phase='outbound'] .composer-mascot-motion > div:first-child > div:first-child,
139
+ .composer-mascot-active-idle[data-mascot-active-idle='rocket'][data-mascot-idle-phase='inbound'] .composer-mascot-motion > div:first-child > div:first-child {
140
+ animation: composer-mascot-idle-rocket-flight-y 1.8s linear forwards;
141
+ }
142
+
143
+ .composer-mascot-active-idle[data-mascot-active-idle='rocket'][data-mascot-idle-phase='outbound'] .composer-mascot-breathe,
144
+ .composer-mascot-active-idle[data-mascot-active-idle='rocket'][data-mascot-idle-phase='inbound'] .composer-mascot-breathe {
145
+ animation: composer-mascot-idle-rocket-body 1.8s ease-out forwards;
146
+ }
147
+
148
+ .composer-mascot-active-idle[data-mascot-active-idle='rocket'][data-mascot-idle-phase='outbound'] .composer-mascot-motion > div:first-child::before,
149
+ .composer-mascot-active-idle[data-mascot-active-idle='rocket'][data-mascot-idle-phase='inbound'] .composer-mascot-motion > div:first-child::before {
150
+ animation: composer-mascot-idle-flight-shadow 1.8s ease-in-out forwards;
151
+ }
152
+
153
+ .composer-mascot-active-idle[data-mascot-active-idle='rocket'] .composer-mascot-jelly {
154
+ position: relative;
155
+ isolation: isolate;
156
+ }
157
+
158
+ .composer-mascot-active-idle[data-mascot-active-idle='rocket'][data-mascot-idle-phase='outbound'] .composer-mascot-jelly::before,
159
+ .composer-mascot-active-idle[data-mascot-active-idle='rocket'][data-mascot-idle-phase='inbound'] .composer-mascot-jelly::before {
160
+ content: '';
161
+ position: absolute;
162
+ top: 17px;
163
+ z-index: 1;
164
+ width: 48px;
165
+ height: 25px;
166
+ filter: drop-shadow(0 0 3px color-mix(in srgb, #8fa5ff 45%, transparent));
167
+ opacity: 0;
168
+ pointer-events: none;
169
+ animation: composer-mascot-idle-rocket-trail 1.8s ease-out forwards;
170
+ }
171
+
172
+ .composer-mascot-active-idle[data-mascot-active-idle='rocket'][data-mascot-idle-phase='outbound'] .composer-mascot-jelly::before {
173
+ left: calc(100% - 2px);
174
+ background:
175
+ linear-gradient(90deg, #f5f7fa, #8fa5ff 28%, transparent 100%) 0 1px / 34px 2px no-repeat,
176
+ linear-gradient(90deg, #f5f7fa, #8fa5ff 28%, transparent 100%) 0 11px / 48px 2px no-repeat,
177
+ linear-gradient(90deg, #f5f7fa, #8fa5ff 28%, transparent 100%) 0 21px / 26px 2px no-repeat;
178
+ transform-origin: left center;
179
+ }
180
+
181
+ .composer-mascot-active-idle[data-mascot-active-idle='rocket'][data-mascot-idle-phase='inbound'] .composer-mascot-jelly::before {
182
+ right: calc(100% - 2px);
183
+ background:
184
+ linear-gradient(90deg, transparent 0%, #8fa5ff 72%, #f5f7fa 100%) 100% 1px / 34px 2px no-repeat,
185
+ linear-gradient(90deg, transparent 0%, #8fa5ff 72%, #f5f7fa 100%) 100% 11px / 48px 2px no-repeat,
186
+ linear-gradient(90deg, transparent 0%, #8fa5ff 72%, #f5f7fa 100%) 100% 21px / 26px 2px no-repeat;
187
+ transform-origin: right center;
188
+ }
189
+
190
+ @keyframes composer-mascot-idle-rocket-flight-x {
191
+ 0% { transform: translateX(0); }
192
+ 16% { transform: translateX(0); animation-timing-function: cubic-bezier(0.45, 0, 0.55, 1); }
193
+ 86%, 100% { transform: translateX(var(--mascot-flight-distance)); }
194
+ }
195
+
196
+ @keyframes composer-mascot-idle-rocket-flight-y {
197
+ 0% { transform: translateY(0); }
198
+ 16% { transform: translateY(0); animation-timing-function: cubic-bezier(0.22, 1, 0.36, 1); }
199
+ 51% { transform: translateY(var(--mascot-rocket-apex-y)); animation-timing-function: cubic-bezier(0.64, 0, 0.78, 0); }
200
+ 86%, 100% { transform: translateY(0); }
201
+ }
202
+
203
+ @keyframes composer-mascot-idle-rocket-body {
204
+ 0% { transform: translateY(0) rotate(0) scale(1); }
205
+ 9% { transform: translateY(var(--mascot-rocket-crouch-y)) rotate(0) scale(1.12, 0.82); }
206
+ 17% { transform: translateY(var(--mascot-rocket-air-y)) rotate(var(--mascot-rocket-tilt)) scale(0.93, 1.09); }
207
+ 72% { transform: translateY(var(--mascot-rocket-air-y)) rotate(var(--mascot-rocket-tilt)) scale(0.97, 1.04); }
208
+ 84% { transform: translateY(var(--mascot-rocket-approach-y)) rotate(0) scale(1); }
209
+ 89% { transform: translateY(0) rotate(0) scale(1.12, 0.86); }
210
+ 96% { transform: translateY(var(--mascot-rocket-rebound-y)) rotate(0) scale(0.98, 1.03); }
211
+ 100% { transform: translateY(0) rotate(0) scale(1); }
212
+ }
213
+
214
+ @keyframes composer-mascot-idle-rocket-trail {
215
+ 0%, 15% { opacity: 0; transform: scaleX(0.15); }
216
+ 27% { opacity: 0.72; transform: scaleX(1); }
217
+ 73% { opacity: 0.5; transform: scaleX(0.76); }
218
+ 86%, 100% { opacity: 0; transform: scaleX(0.2); }
219
+ }
220
+
221
+ @keyframes composer-mascot-idle-flight-shadow {
222
+ 0%, 16% { opacity: 0.65; transform: translateX(-50%) scaleX(1); }
223
+ 51% { opacity: 0.1; transform: translateX(-50%) scaleX(0.45); }
224
+ 86%, 100% { opacity: 0.7; transform: translateX(-50%) scaleX(1.12); }
225
+ }
226
+
227
+ .composer-mascot-active-idle[data-mascot-active-idle='hover'][data-mascot-idle-phase='outbound'] .composer-mascot-motion > div:first-child {
228
+ --mascot-hover-x: -200px;
229
+ --mascot-hover-y: -128px;
230
+ animation: composer-mascot-idle-hover-rise-x 1.8s cubic-bezier(0.26, 0.55, 0.24, 1) forwards;
231
+ }
232
+
233
+ .composer-mascot-active-idle[data-mascot-active-idle='hover'][data-mascot-idle-phase='outbound'] .composer-mascot-motion > div:first-child > div:first-child {
234
+ animation: composer-mascot-idle-hover-rise-y 1.8s linear forwards;
235
+ }
236
+
237
+ .composer-mascot-active-idle[data-mascot-active-idle='hover'][data-mascot-idle-phase='away'] .composer-mascot-motion > div:first-child > div:first-child {
238
+ animation: composer-mascot-idle-hover-float 2.8s ease-in-out forwards;
239
+ }
240
+
241
+ .composer-mascot-active-idle[data-mascot-active-idle='hover'][data-mascot-idle-phase='inbound'] .composer-mascot-motion > div:first-child {
242
+ --mascot-hover-x: 200px;
243
+ --mascot-hover-y: 128px;
244
+ animation: composer-mascot-idle-hover-return-x 1.8s cubic-bezier(0.38, 0.04, 0.34, 1) forwards;
245
+ }
246
+
247
+ .composer-mascot-active-idle[data-mascot-active-idle='hover'][data-mascot-idle-phase='inbound'] .composer-mascot-motion > div:first-child > div:first-child {
248
+ animation: composer-mascot-idle-hover-return-y 1.8s linear forwards;
249
+ }
250
+
251
+ .composer-mascot-active-idle[data-mascot-active-idle='hover'][data-mascot-idle-phase='outbound'] .composer-mascot-breathe {
252
+ animation: composer-mascot-idle-hover-launch-body 1.8s ease-out forwards;
253
+ }
254
+
255
+ .composer-mascot-active-idle[data-mascot-active-idle='hover'][data-mascot-idle-phase='away'] .composer-mascot-breathe {
256
+ animation: composer-mascot-idle-hover-hold-body 2.8s ease-in-out forwards;
257
+ }
258
+
259
+ .composer-mascot-active-idle[data-mascot-active-idle='hover'][data-mascot-idle-phase='inbound'] .composer-mascot-breathe {
260
+ animation: composer-mascot-idle-hover-land-body 1.8s ease-in forwards;
261
+ }
262
+
263
+ .composer-mascot-active-idle[data-mascot-active-idle='hover'][data-mascot-idle-phase='away'] .composer-mascot-jelly {
264
+ animation: composer-mascot-idle-hover-scan-body 2.8s ease-in-out forwards;
265
+ }
266
+
267
+ .composer-mascot-active-idle[data-mascot-active-idle='hover'] .composer-mascot-jelly {
268
+ position: relative;
269
+ isolation: isolate;
270
+ }
271
+
272
+ .composer-mascot-active-idle[data-mascot-active-idle='hover'] .composer-mascot-jelly::before {
273
+ content: '';
274
+ position: absolute;
275
+ top: 16px;
276
+ left: 40px;
277
+ z-index: 1;
278
+ width: 58px;
279
+ height: 32px;
280
+ background:
281
+ linear-gradient(90deg, #f8fbff 0%, #9fb5ff 28%, transparent 94%) 0 3px / 42px 3px no-repeat,
282
+ linear-gradient(90deg, #f8fbff 0%, #7894f8 26%, transparent 96%) 0 14px / 58px 3px no-repeat,
283
+ linear-gradient(90deg, #dce6ff 0%, #6f8cf5 32%, transparent 94%) 0 25px / 34px 3px no-repeat;
284
+ filter: drop-shadow(6px 3px 5px color-mix(in srgb, #6f8dff 54%, transparent));
285
+ opacity: 0;
286
+ pointer-events: none;
287
+ transform: rotate(22deg) scaleX(0.18);
288
+ transform-origin: left center;
289
+ }
290
+
291
+ .composer-mascot-active-idle[data-mascot-active-idle='hover'][data-mascot-idle-phase='outbound'] .composer-mascot-jelly::before {
292
+ animation: composer-mascot-idle-hover-side-jet-launch 1.8s ease-out forwards;
293
+ }
294
+
295
+ .composer-mascot-active-idle[data-mascot-active-idle='hover'][data-mascot-idle-phase='inbound'] .composer-mascot-jelly::before {
296
+ right: 40px;
297
+ left: auto;
298
+ background:
299
+ linear-gradient(90deg, transparent 6%, #9fb5ff 72%, #f8fbff 100%) 100% 3px / 42px 3px no-repeat,
300
+ linear-gradient(90deg, transparent 4%, #7894f8 74%, #f8fbff 100%) 100% 14px / 58px 3px no-repeat,
301
+ linear-gradient(90deg, transparent 6%, #6f8cf5 68%, #dce6ff 100%) 100% 25px / 34px 3px no-repeat;
302
+ filter: drop-shadow(-5px 3px 5px color-mix(in srgb, #6f8dff 54%, transparent));
303
+ transform: rotate(-18deg) scaleX(0.18);
304
+ transform-origin: right center;
305
+ animation: composer-mascot-idle-hover-side-jet-return 1.8s ease-out forwards;
306
+ }
307
+
308
+ .composer-mascot-active-idle[data-mascot-active-idle='hover'] .composer-mascot-jelly::after {
309
+ content: '';
310
+ position: absolute;
311
+ top: 46px;
312
+ left: 50%;
313
+ z-index: 1;
314
+ width: 38px;
315
+ height: 48px;
316
+ background:
317
+ radial-gradient(circle at 25% 72%, #7895fa 0 1px, transparent 2px),
318
+ radial-gradient(circle at 74% 84%, #aabfff 0 1px, transparent 2px),
319
+ radial-gradient(ellipse at 50% 2%, rgb(255 255 255 / 0.96) 0 7%, transparent 30%),
320
+ linear-gradient(180deg, #f8fbff 0%, #9fb5ff 27%, #5b76ee 55%, transparent 92%) center top / 8px 46px no-repeat,
321
+ linear-gradient(180deg, #dce6ff 0%, #7894f8 34%, transparent 88%) 8px 2px / 5px 35px no-repeat,
322
+ linear-gradient(180deg, #dce6ff 0%, #7894f8 34%, transparent 88%) calc(100% - 8px) 2px / 5px 35px no-repeat;
323
+ filter: drop-shadow(0 6px 5px color-mix(in srgb, #6f8dff 54%, transparent));
324
+ opacity: 0;
325
+ pointer-events: none;
326
+ transform: translateX(-50%) scaleY(0.2);
327
+ transform-origin: top center;
328
+ }
329
+
330
+ .composer-mascot-active-idle[data-mascot-active-idle='hover'][data-mascot-idle-phase='outbound'] .composer-mascot-jelly::after {
331
+ animation: composer-mascot-idle-hover-bottom-handoff 1.8s ease-out forwards;
332
+ }
333
+
334
+ .composer-mascot-active-idle[data-mascot-active-idle='hover'][data-mascot-idle-phase='away'] .composer-mascot-jelly::after {
335
+ animation: composer-mascot-idle-hover-bottom-hold 360ms ease-in-out infinite;
336
+ }
337
+
338
+ .composer-mascot-active-idle[data-mascot-active-idle='hover'][data-mascot-idle-phase='inbound'] .composer-mascot-jelly::after {
339
+ animation: composer-mascot-idle-hover-bottom-return 1.8s linear forwards;
340
+ }
341
+
342
+ @keyframes composer-mascot-idle-hover-rise-x {
343
+ from { transform: translateX(0); }
344
+ to { transform: translateX(var(--mascot-hover-x)); }
345
+ }
346
+
347
+ @keyframes composer-mascot-idle-hover-rise-y {
348
+ 0% { transform: translateY(0); animation-timing-function: cubic-bezier(0.2, 0.7, 0.2, 1); }
349
+ 82% { transform: translateY(calc(var(--mascot-hover-y) - 8px)); animation-timing-function: cubic-bezier(0.34, 1.25, 0.64, 1); }
350
+ 100% { transform: translateY(var(--mascot-hover-y)); }
351
+ }
352
+
353
+ @keyframes composer-mascot-idle-hover-return-x {
354
+ from { transform: translateX(0); }
355
+ to { transform: translateX(var(--mascot-hover-x)); }
356
+ }
357
+
358
+ @keyframes composer-mascot-idle-hover-return-y {
359
+ 0% { transform: translateY(0); animation-timing-function: cubic-bezier(0.4, 0, 0.72, 0.48); }
360
+ 78% { transform: translateY(calc(var(--mascot-hover-y) + 4px)); animation-timing-function: cubic-bezier(0.34, 1.32, 0.64, 1); }
361
+ 91% { transform: translateY(calc(var(--mascot-hover-y) - 3px)); animation-timing-function: ease-out; }
362
+ 100% { transform: translateY(var(--mascot-hover-y)); }
363
+ }
364
+
365
+ @keyframes composer-mascot-idle-hover-float {
366
+ 0%, 100% { transform: translateY(0); }
367
+ 20% { transform: translateY(-5px); }
368
+ 43% { transform: translateY(1px); }
369
+ 68% { transform: translateY(-4px); }
370
+ 86% { transform: translateY(1px); }
371
+ }
372
+
373
+ @keyframes composer-mascot-idle-hover-launch-body {
374
+ 0% { transform: translateY(0) scale(1); }
375
+ 10% { transform: translateY(2px) scale(1.12, 0.82); }
376
+ 22% { transform: translateY(-3px) rotate(-8deg) scale(0.94, 1.09); }
377
+ 72% { transform: translateY(-2px) rotate(-5deg) scale(0.98, 1.035); }
378
+ 90% { transform: translateY(1px) rotate(-2deg) scale(1.02, 0.98); }
379
+ 100% { transform: translateY(0) rotate(0) scale(1); }
380
+ }
381
+
382
+ @keyframes composer-mascot-idle-hover-hold-body {
383
+ 0%, 100% { transform: scale(1); }
384
+ 20%, 68% { transform: scale(0.985, 1.02); }
385
+ 43%, 86% { transform: scale(1.012, 0.99); }
386
+ }
387
+
388
+ @keyframes composer-mascot-idle-hover-land-body {
389
+ 0% { transform: translateY(0) rotate(0) scale(1); }
390
+ 18% { transform: translateY(-1px) rotate(5deg) scale(0.99, 1.02); }
391
+ 66% { transform: translateY(-1px) rotate(3deg) scale(0.99, 1.02); }
392
+ 86% { transform: translateY(0) rotate(0) scale(1); }
393
+ 91% { transform: translateY(1px) rotate(0) scale(1.1, 0.88); }
394
+ 95% { transform: translateY(-1px) rotate(0) scale(0.99, 1.02); }
395
+ 99%, 100% { transform: translateY(0) rotate(0) scale(1); }
396
+ }
397
+
398
+ @keyframes composer-mascot-idle-hover-scan-body {
399
+ 0%, 12%, 46%, 54%, 88%, 100% { transform: rotate(0); }
400
+ 20%, 38% { transform: rotate(-2.4deg); }
401
+ 62%, 80% { transform: rotate(2.4deg); }
402
+ }
403
+
404
+ @keyframes composer-mascot-idle-hover-side-jet-launch {
405
+ 0% { opacity: 0.34; transform: rotate(22deg) scaleX(0.34); }
406
+ 12% { opacity: 0.94; transform: rotate(22deg) scaleX(1.08); }
407
+ 68% { opacity: 0.76; transform: rotate(22deg) scaleX(0.84); }
408
+ 84% { opacity: 0.42; transform: rotate(22deg) scaleX(0.48); }
409
+ 100% { opacity: 0; transform: rotate(22deg) scaleX(0.12); }
410
+ }
411
+
412
+ @keyframes composer-mascot-idle-hover-side-jet-return {
413
+ 0% { opacity: 0.28; transform: rotate(-18deg) scaleX(0.28); }
414
+ 12% { opacity: 0.88; transform: rotate(-18deg) scaleX(0.92); }
415
+ 52% { opacity: 0.66; transform: rotate(-18deg) scaleX(0.62); }
416
+ 74% { opacity: 0.3; transform: rotate(-18deg) scaleX(0.34); }
417
+ 86%, 100% { opacity: 0; transform: rotate(-18deg) scaleX(0.12); }
418
+ }
419
+
420
+ @keyframes composer-mascot-idle-hover-bottom-handoff {
421
+ 0%, 70% { opacity: 0; transform: translateX(-50%) scaleY(0.16); }
422
+ 84% { opacity: 0.58; transform: translateX(-50%) scaleY(0.58); }
423
+ 100% { opacity: 0.78; transform: translateX(-50%) scaleY(0.72); }
424
+ }
425
+
426
+ @keyframes composer-mascot-idle-hover-bottom-hold {
427
+ 0%, 100% { opacity: 0.72; transform: translateX(-50%) scaleY(0.68) scaleX(0.94); }
428
+ 50% { opacity: 0.92; transform: translateX(-50%) scaleY(0.88) scaleX(1.04); }
429
+ }
430
+
431
+ @keyframes composer-mascot-idle-hover-bottom-return {
432
+ 0% { opacity: 0.78; transform: translateX(-50%) rotate(0) scaleY(0.72); animation-timing-function: ease-in-out; }
433
+ 24% { opacity: 0.68; transform: translateX(-50%) rotate(8deg) scaleY(0.58); }
434
+ 58% { opacity: 0.44; transform: translateX(-50%) rotate(7deg) scaleY(0.38); }
435
+ 78% { opacity: 0.86; transform: translateX(-50%) rotate(3deg) scaleY(0.84); }
436
+ 91% { opacity: 0.98; transform: translateX(-50%) rotate(0) scaleY(1.04); }
437
+ 100% { opacity: 0; transform: translateX(-50%) rotate(0) scaleY(0.14); }
438
+ }