@dotcraft/avatar 0.6.3 → 0.6.5

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