@dotcraft/avatar 0.6.3

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 (127) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +43 -0
  3. package/dist/AnimatedDecoration.d.ts +10 -0
  4. package/dist/AnimatedDecoration.d.ts.map +1 -0
  5. package/dist/AnimatedDecoration.js +43 -0
  6. package/dist/AnimatedDecoration.js.map +1 -0
  7. package/dist/AppearanceRig.d.ts +12 -0
  8. package/dist/AppearanceRig.d.ts.map +1 -0
  9. package/dist/AppearanceRig.js +9 -0
  10. package/dist/AppearanceRig.js.map +1 -0
  11. package/dist/Avatar.d.ts +22 -0
  12. package/dist/Avatar.d.ts.map +1 -0
  13. package/dist/Avatar.js +71 -0
  14. package/dist/Avatar.js.map +1 -0
  15. package/dist/DecorationShapes.d.ts +10 -0
  16. package/dist/DecorationShapes.d.ts.map +1 -0
  17. package/dist/DecorationShapes.js +8 -0
  18. package/dist/DecorationShapes.js.map +1 -0
  19. package/dist/Decorations.d.ts +15 -0
  20. package/dist/Decorations.d.ts.map +1 -0
  21. package/dist/Decorations.js +26 -0
  22. package/dist/Decorations.js.map +1 -0
  23. package/dist/Faces.d.ts +7 -0
  24. package/dist/Faces.d.ts.map +1 -0
  25. package/dist/Faces.js +8 -0
  26. package/dist/Faces.js.map +1 -0
  27. package/dist/HatDecorations.d.ts +5 -0
  28. package/dist/HatDecorations.d.ts.map +1 -0
  29. package/dist/HatDecorations.js +20 -0
  30. package/dist/HatDecorations.js.map +1 -0
  31. package/dist/HeldDecorations.d.ts +5 -0
  32. package/dist/HeldDecorations.d.ts.map +1 -0
  33. package/dist/HeldDecorations.js +5 -0
  34. package/dist/HeldDecorations.js.map +1 -0
  35. package/dist/MascotRig.d.ts +25 -0
  36. package/dist/MascotRig.d.ts.map +1 -0
  37. package/dist/MascotRig.js +58 -0
  38. package/dist/MascotRig.js.map +1 -0
  39. package/dist/ObjectDecorations.d.ts +5 -0
  40. package/dist/ObjectDecorations.d.ts.map +1 -0
  41. package/dist/ObjectDecorations.js +16 -0
  42. package/dist/ObjectDecorations.js.map +1 -0
  43. package/dist/accessories.css +14 -0
  44. package/dist/appearanceModel.d.ts +28 -0
  45. package/dist/appearanceModel.d.ts.map +1 -0
  46. package/dist/appearanceModel.js +58 -0
  47. package/dist/appearanceModel.js.map +1 -0
  48. package/dist/avatar.css +62 -0
  49. package/dist/characters.d.ts +6 -0
  50. package/dist/characters.d.ts.map +1 -0
  51. package/dist/characters.js +2 -0
  52. package/dist/characters.js.map +1 -0
  53. package/dist/composer/ComposerMascot.d.ts +3 -0
  54. package/dist/composer/ComposerMascot.d.ts.map +1 -0
  55. package/dist/composer/ComposerMascot.js +433 -0
  56. package/dist/composer/ComposerMascot.js.map +1 -0
  57. package/dist/composer/ComposerMascotShadow.d.ts +4 -0
  58. package/dist/composer/ComposerMascotShadow.d.ts.map +1 -0
  59. package/dist/composer/ComposerMascotShadow.js +7 -0
  60. package/dist/composer/ComposerMascotShadow.js.map +1 -0
  61. package/dist/composer/constants.d.ts +32 -0
  62. package/dist/composer/constants.d.ts.map +1 -0
  63. package/dist/composer/constants.js +50 -0
  64. package/dist/composer/constants.js.map +1 -0
  65. package/dist/composer/mascotHandoff.d.ts +3 -0
  66. package/dist/composer/mascotHandoff.d.ts.map +1 -0
  67. package/dist/composer/mascotHandoff.js +15 -0
  68. package/dist/composer/mascotHandoff.js.map +1 -0
  69. package/dist/composer/styles/energy.css +99 -0
  70. package/dist/composer/styles/expressions.css +20 -0
  71. package/dist/composer/styles/feedback.css +188 -0
  72. package/dist/composer/styles/focus.css +72 -0
  73. package/dist/composer/styles/foundation.css +287 -0
  74. package/dist/composer/styles/idle.css +438 -0
  75. package/dist/composer/styles/overdrive.css +264 -0
  76. package/dist/composer/styles/props.css +21 -0
  77. package/dist/composer/types.d.ts +40 -0
  78. package/dist/composer/types.d.ts.map +1 -0
  79. package/dist/composer/types.js +2 -0
  80. package/dist/composer/types.js.map +1 -0
  81. package/dist/composer/useComposerAvatarBehavior.d.ts +24 -0
  82. package/dist/composer/useComposerAvatarBehavior.d.ts.map +1 -0
  83. package/dist/composer/useComposerAvatarBehavior.js +72 -0
  84. package/dist/composer/useComposerAvatarBehavior.js.map +1 -0
  85. package/dist/composer/useComposerMotion.d.ts +2 -0
  86. package/dist/composer/useComposerMotion.d.ts.map +1 -0
  87. package/dist/composer/useComposerMotion.js +16 -0
  88. package/dist/composer/useComposerMotion.js.map +1 -0
  89. package/dist/composer/useComposerProfile.d.ts +7 -0
  90. package/dist/composer/useComposerProfile.d.ts.map +1 -0
  91. package/dist/composer/useComposerProfile.js +46 -0
  92. package/dist/composer/useComposerProfile.js.map +1 -0
  93. package/dist/decorationCatalog.d.ts +14 -0
  94. package/dist/decorationCatalog.d.ts.map +1 -0
  95. package/dist/decorationCatalog.js +37 -0
  96. package/dist/decorationCatalog.js.map +1 -0
  97. package/dist/decorationMotion.d.ts +35 -0
  98. package/dist/decorationMotion.d.ts.map +1 -0
  99. package/dist/decorationMotion.js +73 -0
  100. package/dist/decorationMotion.js.map +1 -0
  101. package/dist/environment.d.ts +6 -0
  102. package/dist/environment.d.ts.map +1 -0
  103. package/dist/environment.js +48 -0
  104. package/dist/environment.js.map +1 -0
  105. package/dist/index.d.ts +6 -0
  106. package/dist/index.d.ts.map +1 -0
  107. package/dist/index.js +6 -0
  108. package/dist/index.js.map +1 -0
  109. package/dist/palette.d.ts +26 -0
  110. package/dist/palette.d.ts.map +1 -0
  111. package/dist/palette.js +35 -0
  112. package/dist/palette.js.map +1 -0
  113. package/dist/react.d.ts +6 -0
  114. package/dist/react.d.ts.map +1 -0
  115. package/dist/react.js +5 -0
  116. package/dist/react.js.map +1 -0
  117. package/dist/rig.css +265 -0
  118. package/dist/styles.css +13 -0
  119. package/dist/useEventReplay.d.ts +3 -0
  120. package/dist/useEventReplay.d.ts.map +1 -0
  121. package/dist/useEventReplay.js +15 -0
  122. package/dist/useEventReplay.js.map +1 -0
  123. package/dist/useGesture.d.ts +4 -0
  124. package/dist/useGesture.d.ts.map +1 -0
  125. package/dist/useGesture.js +59 -0
  126. package/dist/useGesture.js.map +1 -0
  127. package/package.json +55 -0
@@ -0,0 +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
+ }