@mumulinya167/ccm-pet-assets 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (178) hide show
  1. package/README.md +4 -0
  2. package/assets/calico/calico-collapsing.apng +0 -0
  3. package/assets/calico/calico-dozing.apng +0 -0
  4. package/assets/calico/calico-error.apng +0 -0
  5. package/assets/calico/calico-happy.apng +0 -0
  6. package/assets/calico/calico-idle-follow.svg +324 -0
  7. package/assets/calico/calico-idle.apng +0 -0
  8. package/assets/calico/calico-mini-alert.apng +0 -0
  9. package/assets/calico/calico-mini-crabwalk.apng +0 -0
  10. package/assets/calico/calico-mini-enter.apng +0 -0
  11. package/assets/calico/calico-mini-happy.apng +0 -0
  12. package/assets/calico/calico-mini-idle.apng +0 -0
  13. package/assets/calico/calico-mini-peek.apng +0 -0
  14. package/assets/calico/calico-mini-sleep.apng +0 -0
  15. package/assets/calico/calico-notification.apng +0 -0
  16. package/assets/calico/calico-react-drag.apng +0 -0
  17. package/assets/calico/calico-react-left.apng +0 -0
  18. package/assets/calico/calico-react-poke.apng +0 -0
  19. package/assets/calico/calico-sleeping.apng +0 -0
  20. package/assets/calico/calico-thinking.apng +0 -0
  21. package/assets/calico/calico-waking.apng +0 -0
  22. package/assets/calico/calico-working-building.apng +0 -0
  23. package/assets/calico/calico-working-carrying.apng +0 -0
  24. package/assets/calico/calico-working-conducting.apng +0 -0
  25. package/assets/calico/calico-working-juggling.apng +0 -0
  26. package/assets/calico/calico-working-sweeping.apng +0 -0
  27. package/assets/calico/calico-working-typing.apng +0 -0
  28. package/assets/calico/calico-yawning.apng +0 -0
  29. package/assets/calico.svg +324 -0
  30. package/assets/clawd/LICENSE +22 -0
  31. package/assets/clawd/clawd-about-hero.svg +202 -0
  32. package/assets/clawd/clawd-collapse-sleep.svg +247 -0
  33. package/assets/clawd/clawd-error.svg +94 -0
  34. package/assets/clawd/clawd-happy.svg +161 -0
  35. package/assets/clawd/clawd-headphones-groove.svg +194 -0
  36. package/assets/clawd/clawd-idle-bubble.svg +180 -0
  37. package/assets/clawd/clawd-idle-collapse.svg +101 -0
  38. package/assets/clawd/clawd-idle-doze.svg +72 -0
  39. package/assets/clawd/clawd-idle-follow.svg +64 -0
  40. package/assets/clawd/clawd-idle-living.svg +196 -0
  41. package/assets/clawd/clawd-idle-look.svg +115 -0
  42. package/assets/clawd/clawd-idle-reading.svg +252 -0
  43. package/assets/clawd/clawd-idle-yawn.svg +158 -0
  44. package/assets/clawd/clawd-mini-alert.svg +129 -0
  45. package/assets/clawd/clawd-mini-crabwalk.svg +76 -0
  46. package/assets/clawd/clawd-mini-enter-sleep.svg +64 -0
  47. package/assets/clawd/clawd-mini-enter.svg +114 -0
  48. package/assets/clawd/clawd-mini-happy.svg +124 -0
  49. package/assets/clawd/clawd-mini-idle.svg +83 -0
  50. package/assets/clawd/clawd-mini-peek.svg +82 -0
  51. package/assets/clawd/clawd-mini-sleep.svg +112 -0
  52. package/assets/clawd/clawd-mini-typing.svg +153 -0
  53. package/assets/clawd/clawd-notification.svg +438 -0
  54. package/assets/clawd/clawd-react-annoyed.svg +167 -0
  55. package/assets/clawd/clawd-react-double-jump.svg +229 -0
  56. package/assets/clawd/clawd-react-double.svg +108 -0
  57. package/assets/clawd/clawd-react-drag.svg +102 -0
  58. package/assets/clawd/clawd-react-left.svg +102 -0
  59. package/assets/clawd/clawd-react-right.svg +102 -0
  60. package/assets/clawd/clawd-sleeping.svg +118 -0
  61. package/assets/clawd/clawd-static-base.svg +21 -0
  62. package/assets/clawd/clawd-wake.svg +277 -0
  63. package/assets/clawd/clawd-working-building.svg +329 -0
  64. package/assets/clawd/clawd-working-carrying.svg +178 -0
  65. package/assets/clawd/clawd-working-debugger.svg +245 -0
  66. package/assets/clawd/clawd-working-juggling.svg +183 -0
  67. package/assets/clawd/clawd-working-sweeping.svg +248 -0
  68. package/assets/clawd/clawd-working-thinking.svg +501 -0
  69. package/assets/clawd/clawd-working-typing-boss.svg +307 -0
  70. package/assets/clawd/clawd-working-typing.svg +273 -0
  71. package/assets/clawd/clawd-working-ultrathink.svg +166 -0
  72. package/assets/clawd/clawd-working-wizard.svg +356 -0
  73. package/assets/clawd.svg +64 -0
  74. package/assets/cloudling/cloudling/cloudling-attention.svg +380 -0
  75. package/assets/cloudling/cloudling/cloudling-building.svg +667 -0
  76. package/assets/cloudling/cloudling/cloudling-carrying.svg +604 -0
  77. package/assets/cloudling/cloudling/cloudling-conducting.svg +616 -0
  78. package/assets/cloudling/cloudling/cloudling-dozing-to-sleeping.svg +578 -0
  79. package/assets/cloudling/cloudling/cloudling-dozing.svg +358 -0
  80. package/assets/cloudling/cloudling/cloudling-error.svg +428 -0
  81. package/assets/cloudling/cloudling/cloudling-idle-reading.svg +658 -0
  82. package/assets/cloudling/cloudling/cloudling-idle-to-dozing.svg +568 -0
  83. package/assets/cloudling/cloudling/cloudling-idle-to-sleeping.svg +811 -0
  84. package/assets/cloudling/cloudling/cloudling-idle.svg +255 -0
  85. package/assets/cloudling/cloudling/cloudling-juggling.svg +648 -0
  86. package/assets/cloudling/cloudling/cloudling-mini-alert.svg +390 -0
  87. package/assets/cloudling/cloudling/cloudling-mini-crabwalk.svg +335 -0
  88. package/assets/cloudling/cloudling/cloudling-mini-enter-roll-in.svg +226 -0
  89. package/assets/cloudling/cloudling/cloudling-mini-enter-sleep.svg +232 -0
  90. package/assets/cloudling/cloudling/cloudling-mini-happy.svg +371 -0
  91. package/assets/cloudling/cloudling/cloudling-mini-idle.svg +279 -0
  92. package/assets/cloudling/cloudling/cloudling-mini-peek.svg +328 -0
  93. package/assets/cloudling/cloudling/cloudling-mini-sleep.svg +260 -0
  94. package/assets/cloudling/cloudling/cloudling-mini-typing.svg +692 -0
  95. package/assets/cloudling/cloudling/cloudling-notification.svg +494 -0
  96. package/assets/cloudling/cloudling/cloudling-react-drag.svg +83 -0
  97. package/assets/cloudling/cloudling/cloudling-sleeping-to-idle.svg +555 -0
  98. package/assets/cloudling/cloudling/cloudling-sleeping.svg +500 -0
  99. package/assets/cloudling/cloudling/cloudling-sweeping.svg +292 -0
  100. package/assets/cloudling/cloudling/cloudling-thinking.svg +720 -0
  101. package/assets/cloudling/cloudling/cloudling-typing.svg +354 -0
  102. package/assets/cloudling/cloudling-attention.svg +380 -0
  103. package/assets/cloudling/cloudling-building.svg +667 -0
  104. package/assets/cloudling/cloudling-carrying.svg +604 -0
  105. package/assets/cloudling/cloudling-conducting.svg +616 -0
  106. package/assets/cloudling/cloudling-dozing-to-sleeping.svg +578 -0
  107. package/assets/cloudling/cloudling-dozing.svg +358 -0
  108. package/assets/cloudling/cloudling-error.svg +428 -0
  109. package/assets/cloudling/cloudling-idle-reading.svg +658 -0
  110. package/assets/cloudling/cloudling-idle-to-dozing.svg +568 -0
  111. package/assets/cloudling/cloudling-idle-to-sleeping.svg +811 -0
  112. package/assets/cloudling/cloudling-idle.svg +255 -0
  113. package/assets/cloudling/cloudling-juggling.svg +648 -0
  114. package/assets/cloudling/cloudling-mini-alert.svg +390 -0
  115. package/assets/cloudling/cloudling-mini-crabwalk.svg +335 -0
  116. package/assets/cloudling/cloudling-mini-enter-roll-in.svg +226 -0
  117. package/assets/cloudling/cloudling-mini-enter-sleep.svg +232 -0
  118. package/assets/cloudling/cloudling-mini-happy.svg +371 -0
  119. package/assets/cloudling/cloudling-mini-idle.svg +279 -0
  120. package/assets/cloudling/cloudling-mini-peek.svg +328 -0
  121. package/assets/cloudling/cloudling-mini-sleep.svg +260 -0
  122. package/assets/cloudling/cloudling-mini-typing.svg +692 -0
  123. package/assets/cloudling/cloudling-notification.svg +494 -0
  124. package/assets/cloudling/cloudling-react-drag.svg +83 -0
  125. package/assets/cloudling/cloudling-sleeping-to-idle.svg +555 -0
  126. package/assets/cloudling/cloudling-sleeping.svg +500 -0
  127. package/assets/cloudling/cloudling-sweeping.svg +292 -0
  128. package/assets/cloudling/cloudling-thinking.svg +720 -0
  129. package/assets/cloudling/cloudling-typing.svg +354 -0
  130. package/assets/cloudling.svg +255 -0
  131. package/assets/ghost-attention.svg +19 -0
  132. package/assets/ghost-carrying.svg +19 -0
  133. package/assets/ghost-collapsing.svg +19 -0
  134. package/assets/ghost-dozing.svg +23 -0
  135. package/assets/ghost-error.svg +19 -0
  136. package/assets/ghost-happy.svg +23 -0
  137. package/assets/ghost-idle-action1.svg +19 -0
  138. package/assets/ghost-idle-action2.svg +19 -0
  139. package/assets/ghost-idle-action3.svg +19 -0
  140. package/assets/ghost-idle.svg +11 -0
  141. package/assets/ghost-juggling.svg +19 -0
  142. package/assets/ghost-notification.svg +19 -0
  143. package/assets/ghost-react-double.svg +23 -0
  144. package/assets/ghost-react-drag.svg +23 -0
  145. package/assets/ghost-react-left.svg +19 -0
  146. package/assets/ghost-react-right.svg +19 -0
  147. package/assets/ghost-sleeping.svg +19 -0
  148. package/assets/ghost-sweeping.svg +19 -0
  149. package/assets/ghost-thinking.svg +19 -0
  150. package/assets/ghost-waking.svg +19 -0
  151. package/assets/ghost-working.svg +19 -0
  152. package/assets/ghost-yawning.svg +23 -0
  153. package/assets/ghost.svg +11 -0
  154. package/assets/robot-attention.svg +19 -0
  155. package/assets/robot-carrying.svg +19 -0
  156. package/assets/robot-collapsing.svg +19 -0
  157. package/assets/robot-dozing.svg +23 -0
  158. package/assets/robot-error.svg +19 -0
  159. package/assets/robot-happy.svg +23 -0
  160. package/assets/robot-idle-action1.svg +19 -0
  161. package/assets/robot-idle-action2.svg +19 -0
  162. package/assets/robot-idle-action3.svg +19 -0
  163. package/assets/robot-idle.svg +11 -0
  164. package/assets/robot-juggling.svg +19 -0
  165. package/assets/robot-notification.svg +19 -0
  166. package/assets/robot-react-double.svg +23 -0
  167. package/assets/robot-react-drag.svg +23 -0
  168. package/assets/robot-react-left.svg +19 -0
  169. package/assets/robot-react-right.svg +19 -0
  170. package/assets/robot-sleeping.svg +19 -0
  171. package/assets/robot-sweeping.svg +19 -0
  172. package/assets/robot-thinking.svg +19 -0
  173. package/assets/robot-waking.svg +19 -0
  174. package/assets/robot-working.svg +19 -0
  175. package/assets/robot-yawning.svg +23 -0
  176. package/assets/robot.svg +11 -0
  177. package/manifest.json +889 -0
  178. package/package.json +18 -0
@@ -0,0 +1,245 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="-15 -25 45 45" width="500" height="500">
2
+ <defs>
3
+ <style>
4
+ /* ═══ Independent animations (always running) ═══ */
5
+
6
+ .breathe {
7
+ transform-origin: 7.5px 13px;
8
+ animation: breathe 3.2s infinite ease-in-out;
9
+ }
10
+
11
+ .blink {
12
+ transform-origin: 7.5px 9px;
13
+ animation: blink 4s infinite linear;
14
+ }
15
+
16
+ .leg-a {
17
+ animation: sneak-a 0.5s infinite linear;
18
+ transform-origin: top center;
19
+ transform-box: fill-box;
20
+ }
21
+ .leg-b {
22
+ animation: sneak-b 0.5s infinite linear;
23
+ transform-origin: top center;
24
+ transform-box: fill-box;
25
+ }
26
+
27
+ .glass-wobble {
28
+ transform-origin: 14px 10px;
29
+ animation: glass-wobble 3s infinite ease-in-out;
30
+ }
31
+
32
+ /* ═══ Main 14s timeline ═══ */
33
+
34
+ .body-main {
35
+ transform-origin: 7.5px 15px;
36
+ animation: body-main 14s infinite ease-in-out;
37
+ }
38
+
39
+ .shadow-main {
40
+ transform-origin: 7.5px 15.5px;
41
+ animation: shadow-main 14s infinite ease-in-out;
42
+ }
43
+
44
+ .arm-l {
45
+ transform-origin: 1px 10px;
46
+ animation: arm-l 14s infinite ease-in-out;
47
+ }
48
+
49
+ .arm-r {
50
+ transform-origin: 14px 10px;
51
+ animation: arm-r 14s infinite ease-in-out;
52
+ }
53
+
54
+ .glass-vis {
55
+ animation: glass-vis 14s infinite linear;
56
+ }
57
+
58
+ .eye-squint {
59
+ transform-origin: 4.5px 9px;
60
+ animation: eye-squint 14s infinite ease-in-out;
61
+ }
62
+
63
+ .legs-idle {
64
+ animation: legs-idle 14s infinite linear;
65
+ }
66
+
67
+ .legs-sneak {
68
+ animation: legs-sneak 14s infinite linear;
69
+ }
70
+
71
+ /* ═══ Independent keyframes ═══ */
72
+
73
+ @keyframes breathe {
74
+ 0%, 100% { transform: scale(1, 1) translate(0, 0); }
75
+ 50% { transform: scale(1.02, 0.98) translate(0, 0.5px); }
76
+ }
77
+
78
+ @keyframes blink {
79
+ 0%, 10%, 100% { transform: scaleY(1); }
80
+ 5% { transform: scaleY(0.1); }
81
+ }
82
+
83
+ @keyframes sneak-a {
84
+ 0%, 100% { transform: rotate(0deg) scaleY(1); }
85
+ 50% { transform: rotate(-25deg) scaleY(0.7); }
86
+ }
87
+ @keyframes sneak-b {
88
+ 0%, 100% { transform: rotate(-25deg) scaleY(0.7); }
89
+ 50% { transform: rotate(0deg) scaleY(1); }
90
+ }
91
+
92
+ @keyframes glass-wobble {
93
+ 0%, 100% { transform: rotate(0deg) scale(1); }
94
+ 50% { transform: rotate(-3deg) scale(1.05); }
95
+ }
96
+
97
+ /* ═══ Main timeline keyframes (14s) ═══ */
98
+
99
+ /* Body: idle → hunch + patrol → idle (both idle phases trimmed) */
100
+ @keyframes body-main {
101
+ 0%, 3% { transform: translate(0, 0) rotate(0deg); }
102
+ 15% { transform: translate(0, 1px) rotate(2deg); }
103
+ 22% { transform: translate(-2px, 1px) rotate(2deg); }
104
+ 35% { transform: translate(3px, 1px) rotate(2deg); }
105
+ 48% { transform: translate(-2px, 1px) rotate(2deg); }
106
+ 61% { transform: translate(2px, 1px) rotate(2deg); }
107
+ 78% { transform: translate(0, 1px) rotate(2deg); }
108
+ 90% { transform: translate(0, 0) rotate(0deg); }
109
+ 96%, 100% { transform: translate(0, 0) rotate(0deg); }
110
+ }
111
+
112
+ /* Shadow: follows body X, shrinks during detective */
113
+ @keyframes shadow-main {
114
+ 0%, 3% { transform: scaleX(1) translate(0, 0); opacity: 0.5; }
115
+ 15% { transform: scale(0.9) translate(0, 0); opacity: 0.4; }
116
+ 22% { transform: scale(0.9) translate(-2px, 0); opacity: 0.4; }
117
+ 35% { transform: scale(0.9) translate(3px, 0); opacity: 0.4; }
118
+ 48% { transform: scale(0.9) translate(-2px, 0); opacity: 0.4; }
119
+ 61% { transform: scale(0.9) translate(2px, 0); opacity: 0.4; }
120
+ 78% { transform: scale(0.9) translate(0, 0); opacity: 0.4; }
121
+ 90% { transform: scaleX(1) translate(0, 0); opacity: 0.5; }
122
+ 96%, 100% { transform: scaleX(1) translate(0, 0); opacity: 0.5; }
123
+ }
124
+
125
+ /* Left arm: normal → tucked behind → normal */
126
+ @keyframes arm-l {
127
+ 0%, 5% { transform: translate(0, 0) rotate(0deg); }
128
+ 15%, 78% { transform: translate(1px, -1px) rotate(15deg); }
129
+ 90%, 100% { transform: translate(0, 0) rotate(0deg); }
130
+ }
131
+
132
+ /* Right arm: lifts briefly when glass appears/disappears */
133
+ @keyframes arm-r {
134
+ 0%, 4% { transform: translate(0, 0); }
135
+ 7%, 10% { transform: translate(0, -2px); }
136
+ 13%, 80% { transform: translate(0, 0); }
137
+ 83%, 86% { transform: translate(0, -2px); }
138
+ 90%, 100% { transform: translate(0, 0); }
139
+ }
140
+
141
+ /* Magnifying glass: appears while arm is up, vanishes while arm is up */
142
+ @keyframes glass-vis {
143
+ 0%, 8.9% { opacity: 0; }
144
+ 9% { opacity: 1; }
145
+ 83.9% { opacity: 1; }
146
+ 84% { opacity: 0; }
147
+ 100% { opacity: 0; }
148
+ }
149
+
150
+ /* Left eye: normal → squint → normal */
151
+ @keyframes eye-squint {
152
+ 0%, 10% { transform: scaleY(1); }
153
+ 15%, 78% { transform: scaleY(0.5); }
154
+ 86%, 100% { transform: scaleY(1); }
155
+ }
156
+
157
+ /* Idle legs: visible in idle, hidden in detective */
158
+ @keyframes legs-idle {
159
+ 0%, 13.9% { opacity: 1; }
160
+ 14% { opacity: 0; }
161
+ 85.9% { opacity: 0; }
162
+ 86% { opacity: 1; }
163
+ 100% { opacity: 1; }
164
+ }
165
+
166
+ /* Sneak legs: hidden in idle, visible in detective */
167
+ @keyframes legs-sneak {
168
+ 0%, 13.9% { opacity: 0; }
169
+ 14% { opacity: 1; }
170
+ 85.9% { opacity: 1; }
171
+ 86% { opacity: 0; }
172
+ 100% { opacity: 0; }
173
+ }
174
+ </style>
175
+ </defs>
176
+
177
+ <!-- Ground Shadow -->
178
+ <g class="shadow-main">
179
+ <rect x="3" y="15" width="9" height="1" fill="#000000"/>
180
+ </g>
181
+
182
+ <!-- Static Legs (idle phases) -->
183
+ <g class="legs-idle" fill="#DE886D">
184
+ <rect x="3" y="12" width="1" height="3"/>
185
+ <rect x="5" y="12" width="1" height="3"/>
186
+ <rect x="9" y="12" width="1" height="3"/>
187
+ <rect x="11" y="12" width="1" height="3"/>
188
+ </g>
189
+
190
+ <!-- Body Group (main timeline: hunch + walk) -->
191
+ <g class="body-main">
192
+
193
+ <!-- Sneaking Legs (detective phase, inside body so they walk with it) -->
194
+ <g class="legs-sneak" fill="#DE886D" opacity="0">
195
+ <rect class="leg-a" x="3" y="13" width="1" height="2"/>
196
+ <rect class="leg-b" x="5" y="13" width="1" height="2"/>
197
+ <rect class="leg-a" x="9" y="13" width="1" height="2"/>
198
+ <rect class="leg-b" x="11" y="13" width="1" height="2"/>
199
+ </g>
200
+
201
+ <!-- Upper Body (breathing) -->
202
+ <g class="breathe">
203
+ <!-- Torso -->
204
+ <rect x="2" y="6" width="11" height="7" fill="#DE886D"/>
205
+
206
+ <!-- Left Arm -->
207
+ <g class="arm-l">
208
+ <rect x="0" y="9" width="2" height="2" fill="#DE886D"/>
209
+ </g>
210
+
211
+ <!-- Eyes -->
212
+ <g class="blink" fill="#000000">
213
+ <!-- Left Eye (squints during detective phase) -->
214
+ <g class="eye-squint">
215
+ <rect x="4" y="8" width="1" height="2"/>
216
+ </g>
217
+ <!-- Right Eye -->
218
+ <rect x="10" y="8" width="1" height="2"/>
219
+ </g>
220
+
221
+ <!-- Right Arm + Magnifying Glass (on top of eyes in z-order) -->
222
+ <g class="arm-r">
223
+ <rect x="13" y="9" width="2" height="2" fill="#DE886D"/>
224
+
225
+ <!-- Magnifying Glass -->
226
+ <g class="glass-vis" opacity="0">
227
+ <g class="glass-wobble">
228
+ <g transform="translate(13.5, 9.5)">
229
+ <!-- Handle -->
230
+ <polygon points="0.5,1.5 1.5,0.5 -1,-2 -2,-1" fill="#795548"/>
231
+ <!-- Rim -->
232
+ <rect x="-6" y="-5" width="6" height="6" fill="#546E7A" rx="2"/>
233
+ <!-- Magnified Eye -->
234
+ <rect x="-4" y="-3.5" width="2" height="3" fill="#000000"/>
235
+ <!-- Lens -->
236
+ <rect x="-5.5" y="-4.5" width="5" height="5" fill="#E0F7FA" rx="1.5" opacity="0.6"/>
237
+ <!-- Glare -->
238
+ <rect x="-4.5" y="-3.5" width="1.5" height="1.5" fill="#FFFFFF" opacity="0.8"/>
239
+ </g>
240
+ </g>
241
+ </g>
242
+ </g>
243
+ </g>
244
+ </g>
245
+ </svg>
@@ -0,0 +1,183 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="-15 -25 45 45" width="500" height="500">
2
+ <defs>
3
+ <style>
4
+ /* ===== Independent sub-animations ===== */
5
+ .breathe {
6
+ transform-origin: 7.5px 13px;
7
+ animation: breathe 3.2s infinite ease-in-out;
8
+ }
9
+ .blink {
10
+ transform-origin: 7.5px 9px;
11
+ animation: blink 4s infinite;
12
+ }
13
+
14
+ /* ===== Body rock: left-right sway + micro-dip ===== */
15
+ .body-rock {
16
+ transform-origin: 7.5px 15px;
17
+ animation: rock 1.2s infinite ease-in-out;
18
+ }
19
+
20
+ /* ===== Shadow ===== */
21
+ .shadow-anim {
22
+ transform-origin: 7.5px 15.5px;
23
+ animation: shadow-rock 1.2s infinite ease-in-out;
24
+ }
25
+
26
+ /* ===== Arms: alternate catch/throw, synced with rock ===== */
27
+ .arm-juggle-l {
28
+ transform-origin: 1px 10px;
29
+ animation: arm-jl 1.2s infinite ease-in-out;
30
+ }
31
+ .arm-juggle-r {
32
+ transform-origin: 14px 10px;
33
+ animation: arm-jr 1.2s infinite ease-in-out;
34
+ }
35
+
36
+ /* ===== Eyes: track balls ===== */
37
+ .eye-track {
38
+ animation: eye-track 2.4s infinite ease-in-out;
39
+ }
40
+
41
+ /* ===== Juggling packets: parabolic arc ===== */
42
+ .packet {
43
+ animation: juggle 1.2s infinite;
44
+ }
45
+ .p1 { animation-delay: 0s; fill: #FF5252; }
46
+ .p2 { animation-delay: -0.4s; fill: #FFC107; }
47
+ .p3 { animation-delay: -0.8s; fill: #4CAF50; }
48
+
49
+ /* (no sweat — juggling is a steady state, not emergency) */
50
+
51
+ /* ===== Keyframes ===== */
52
+
53
+ @keyframes breathe {
54
+ 0%, 100% { transform: scale(1, 1) translate(0, 0); }
55
+ 50% { transform: scale(1.02, 0.98) translate(0, 0.5px); }
56
+ }
57
+
58
+ @keyframes blink {
59
+ 0%, 10%, 100% { transform: scaleY(1); }
60
+ 5% { transform: scaleY(0.1); }
61
+ }
62
+
63
+ /* Body: center → left-dip → center → right-dip → center */
64
+ @keyframes rock {
65
+ 0%, 50%, 100% { transform: rotate(0deg) translateY(0); }
66
+ 25% { transform: rotate(-3deg) translateY(0.3px); }
67
+ 75% { transform: rotate(3deg) translateY(0.3px); }
68
+ }
69
+
70
+ /* Shadow: sway with body */
71
+ @keyframes shadow-rock {
72
+ 0%, 50%, 100% { transform: scaleX(1); opacity: 0.5; }
73
+ 25% { transform: scaleX(1.03) translateX(-0.3px); opacity: 0.52; }
74
+ 75% { transform: scaleX(1.03) translateX(0.3px); opacity: 0.52; }
75
+ }
76
+
77
+ /* Left arm: up at 25% (catch left), down at 75% */
78
+ @keyframes arm-jl {
79
+ 0%, 50%, 100% { transform: rotate(20deg); }
80
+ 25% { transform: rotate(35deg); }
81
+ 75% { transform: rotate(5deg); }
82
+ }
83
+
84
+ /* Right arm: down at 25%, up at 75% (catch right) */
85
+ @keyframes arm-jr {
86
+ 0%, 50%, 100% { transform: rotate(-20deg); }
87
+ 25% { transform: rotate(-5deg); }
88
+ 75% { transform: rotate(-35deg); }
89
+ }
90
+
91
+ /* Eyes: track ball arc left-right */
92
+ @keyframes eye-track {
93
+ 0%, 100% { transform: translate(-1px, -1px); }
94
+ 15% { transform: translate(0, -1.5px); }
95
+ 30% { transform: translate(1px, -1px); }
96
+ 45% { transform: translate(1px, 0.5px); }
97
+ 50% { transform: translate(1px, -1px); }
98
+ 65% { transform: translate(0, -1.5px); }
99
+ 80% { transform: translate(-1px, -1px); }
100
+ 90% { transform: translate(-1px, 0.5px); }
101
+ }
102
+
103
+ /* Juggle: parabolic arc between hands, hang at top
104
+ Packet origin is x=-1 y=-1 (2x2 rect center ~0,0)
105
+ Left hand: x~1, y~10 → translate(2, 10)
106
+ Right hand: x~14, y~10 → translate(14, 10)
107
+ Arc peak: y ~ -1 (well above head) */
108
+ @keyframes juggle {
109
+ 0% { transform: translate(2px, 10px); }
110
+ 8% { transform: translate(4px, 4px); }
111
+ 18% { transform: translate(6px, 0px); }
112
+ 30% { transform: translate(8px, -1px); }
113
+ 42% { transform: translate(10px, 0px); }
114
+ 50% { transform: translate(14px, 10px); }
115
+ 58% { transform: translate(12px, 4px); }
116
+ 68% { transform: translate(10px, 0px); }
117
+ 80% { transform: translate(8px, -1px); }
118
+ 92% { transform: translate(4px, 4px); }
119
+ 100% { transform: translate(2px, 10px); }
120
+ }
121
+ </style>
122
+ </defs>
123
+
124
+ <!-- Ground Shadow -->
125
+ <rect class="shadow-anim" x="3" y="15" width="9" height="1" fill="#000" opacity="0.5"/>
126
+
127
+ <!-- Juggling Packets -->
128
+ <g>
129
+ <!-- Red ball -->
130
+ <g class="packet p1">
131
+ <circle cx="0" cy="0" r="1.2" fill="#FF5252"/>
132
+ <circle cx="-0.35" cy="-0.35" r="0.45" fill="#FF8A80" opacity="0.7"/>
133
+ <circle cx="0.3" cy="0.4" r="0.6" fill="#D32F2F" opacity="0.3"/>
134
+ </g>
135
+ <!-- Yellow ball -->
136
+ <g class="packet p2">
137
+ <circle cx="0" cy="0" r="1.2" fill="#FFC107"/>
138
+ <circle cx="-0.35" cy="-0.35" r="0.45" fill="#FFE082" opacity="0.7"/>
139
+ <circle cx="0.3" cy="0.4" r="0.6" fill="#FFA000" opacity="0.3"/>
140
+ </g>
141
+ <!-- Green ball -->
142
+ <g class="packet p3">
143
+ <circle cx="0" cy="0" r="1.2" fill="#4CAF50"/>
144
+ <circle cx="-0.35" cy="-0.35" r="0.45" fill="#81C784" opacity="0.7"/>
145
+ <circle cx="0.3" cy="0.4" r="0.6" fill="#388E3C" opacity="0.3"/>
146
+ </g>
147
+ </g>
148
+
149
+ <!-- Static Legs -->
150
+ <g fill="#DE886D">
151
+ <rect x="3" y="13" width="1" height="2"/>
152
+ <rect x="5" y="13" width="1" height="2"/>
153
+ <rect x="9" y="13" width="1" height="2"/>
154
+ <rect x="11" y="13" width="1" height="2"/>
155
+ </g>
156
+
157
+ <!-- Upper Body -->
158
+ <g class="body-rock">
159
+ <g class="breathe">
160
+ <!-- Torso -->
161
+ <rect x="2" y="6" width="11" height="7" fill="#DE886D"/>
162
+
163
+ <!-- Left Arm -->
164
+ <g class="arm-juggle-l">
165
+ <rect x="0" y="9" width="2" height="2" fill="#DE886D"/>
166
+ </g>
167
+
168
+ <!-- Right Arm -->
169
+ <g class="arm-juggle-r">
170
+ <rect x="13" y="9" width="2" height="2" fill="#DE886D"/>
171
+ </g>
172
+
173
+ <!-- Eyes -->
174
+ <g class="eye-track" fill="#000">
175
+ <g class="blink">
176
+ <rect x="4" y="8" width="1" height="2"/>
177
+ <rect x="10" y="8" width="1" height="2"/>
178
+ </g>
179
+ </g>
180
+
181
+ </g>
182
+ </g>
183
+ </svg>
@@ -0,0 +1,248 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="-15 -25 45 45" width="500" height="500">
2
+ <defs>
3
+ <style>
4
+ /* ===== Independent sub-animations ===== */
5
+ .breathe {
6
+ transform-origin: 7.5px 13px;
7
+ animation: breathe 3.2s infinite ease-in-out;
8
+ }
9
+ .blink {
10
+ transform-origin: 7.5px 9px;
11
+ animation: blink 4s infinite;
12
+ }
13
+
14
+ /* ===== Main 10s story arc ===== */
15
+ .body-lean {
16
+ transform-origin: 7.5px 15px;
17
+ animation: body-lean 10s infinite ease-in-out;
18
+ }
19
+ .shadow-anim {
20
+ transform-origin: 7.5px 15.5px;
21
+ animation: shadow-anim 10s infinite ease-in-out;
22
+ }
23
+ .arm-r {
24
+ transform-origin: 14px 10px;
25
+ animation: arm-right 10s infinite ease-in-out;
26
+ }
27
+ .arm-l {
28
+ transform-origin: 1px 10px;
29
+ animation: arm-left 10s infinite ease-in-out;
30
+ }
31
+ .eyes-dir {
32
+ animation: eye-dir 10s infinite ease-in-out;
33
+ }
34
+
35
+ /* Dust particles */
36
+ .dust { opacity: 0; }
37
+ .dust-1 { animation: dust1 10s infinite; }
38
+ .dust-2 { animation: dust2 10s infinite; }
39
+ .dust-3 { animation: dust3 10s infinite; }
40
+
41
+ /* Sweat drops */
42
+ .sweat { opacity: 0; }
43
+ .sweat-1 { animation: sweat1 10s infinite; }
44
+ .sweat-2 { animation: sweat2 10s infinite; }
45
+
46
+ /* ===== Keyframes ===== */
47
+ @keyframes breathe {
48
+ 0%, 100% { transform: scale(1, 1) translate(0, 0); }
49
+ 50% { transform: scale(1.02, 0.98) translate(0, 0.5px); }
50
+ }
51
+
52
+ @keyframes blink {
53
+ 0%, 10%, 100% { transform: scaleY(1); }
54
+ 5% { transform: scaleY(0.1); }
55
+ }
56
+
57
+ /* Body: idle → lean → straighten → lean → return to idle */
58
+ @keyframes body-lean {
59
+ 0%, 1% { transform: translate(0, 0) rotate(0deg); }
60
+ 5%, 38% { transform: translate(1px, 0) rotate(6deg); }
61
+ 43%, 57% { transform: translate(0, 0) rotate(2deg); }
62
+ 62%, 85% { transform: translate(1px, 0) rotate(6deg); }
63
+ 90% { transform: translate(0.5px, 0) rotate(3deg); }
64
+ 100% { transform: translate(0, 0) rotate(0deg); }
65
+ }
66
+
67
+ @keyframes shadow-anim {
68
+ 0%, 1% { transform: scaleX(1); opacity: 0.5; }
69
+ 5%, 38% { transform: scaleX(1.08); opacity: 0.55; }
70
+ 43%, 57% { transform: scaleX(1); opacity: 0.5; }
71
+ 62%, 85% { transform: scaleX(1.08); opacity: 0.55; }
72
+ 90% { transform: scaleX(1.03); opacity: 0.52; }
73
+ 100% { transform: scaleX(1); opacity: 0.5; }
74
+ }
75
+
76
+ /* Right arm + broom: idle → 3 sweeps → relax → 3 sweeps → hold
77
+ Forward stroke (35 to -15) is faster than return (-15 to 35) */
78
+ @keyframes arm-right {
79
+ 0%, 1% { transform: rotate(0deg); }
80
+ 4% { transform: rotate(35deg); }
81
+ /* Phase A: stroke 1 */
82
+ 7% { transform: rotate(35deg); }
83
+ 10% { transform: rotate(-15deg); }
84
+ /* return */
85
+ 15% { transform: rotate(35deg); }
86
+ /* stroke 2 */
87
+ 18% { transform: rotate(-15deg); }
88
+ /* return */
89
+ 23% { transform: rotate(35deg); }
90
+ /* stroke 3 */
91
+ 26% { transform: rotate(-15deg); }
92
+ 30% { transform: rotate(10deg); }
93
+ /* Pause: arm relaxed */
94
+ 36%, 57% { transform: rotate(0deg); }
95
+ /* Phase B: stroke 1 */
96
+ 61% { transform: rotate(35deg); }
97
+ 64% { transform: rotate(-15deg); }
98
+ /* stroke 2 */
99
+ 69% { transform: rotate(35deg); }
100
+ 72% { transform: rotate(-15deg); }
101
+ /* stroke 3 */
102
+ 77% { transform: rotate(35deg); }
103
+ 80% { transform: rotate(-15deg); }
104
+ 85% { transform: rotate(10deg); }
105
+ 90% { transform: rotate(5deg); }
106
+ 100% { transform: rotate(0deg); }
107
+ }
108
+
109
+ /* Left arm: idle → scratch head during pause → idle */
110
+ @keyframes arm-left {
111
+ 0%, 41% { transform: translate(0, 0) rotate(0deg); }
112
+ 44% { transform: translate(2px, -4px) rotate(35deg); }
113
+ 46% { transform: translate(2.5px, -5px) rotate(50deg); }
114
+ 48% { transform: translate(2px, -4px) rotate(35deg); }
115
+ 50% { transform: translate(2.5px, -5px) rotate(50deg); }
116
+ 52% { transform: translate(2px, -4px) rotate(35deg); }
117
+ 55%, 100%{ transform: translate(0, 0) rotate(0deg); }
118
+ }
119
+
120
+ /* Eyes: ahead → look down → ahead (pause) → down → return to ahead */
121
+ @keyframes eye-dir {
122
+ 0%, 2% { transform: translate(0, 0); }
123
+ 5%, 38% { transform: translate(1px, 1px); }
124
+ 43%, 57% { transform: translate(0, 0); }
125
+ 62%, 85% { transform: translate(1px, 1px); }
126
+ 90% { transform: translate(0.5px, 0.5px); }
127
+ 100% { transform: translate(0, 0); }
128
+ }
129
+
130
+ /* Dust puffs at end of forward strokes */
131
+ @keyframes dust1 {
132
+ 0%, 8% { opacity: 0; transform: translate(17px, 15px) scale(0); }
133
+ 10% { opacity: 0.6; transform: translate(17px, 15px) scale(1); }
134
+ 16% { opacity: 0; transform: translate(20px, 13.5px) scale(0.3); }
135
+ 17%, 62% { opacity: 0; }
136
+ 64% { opacity: 0.6; transform: translate(17px, 15px) scale(1); }
137
+ 70% { opacity: 0; transform: translate(20px, 13.5px) scale(0.3); }
138
+ 71%, 100%{ opacity: 0; }
139
+ }
140
+ @keyframes dust2 {
141
+ 0%, 16% { opacity: 0; transform: translate(16px, 16px) scale(0); }
142
+ 18% { opacity: 0.5; transform: translate(16px, 16px) scale(1); }
143
+ 24% { opacity: 0; transform: translate(19px, 14.5px) scale(0.3); }
144
+ 25%, 70% { opacity: 0; }
145
+ 72% { opacity: 0.5; transform: translate(16px, 16px) scale(1); }
146
+ 78% { opacity: 0; transform: translate(19px, 14.5px) scale(0.3); }
147
+ 79%, 100%{ opacity: 0; }
148
+ }
149
+ @keyframes dust3 {
150
+ 0%, 24% { opacity: 0; transform: translate(18px, 15.5px) scale(0); }
151
+ 26% { opacity: 0.5; transform: translate(18px, 15.5px) scale(1); }
152
+ 32% { opacity: 0; transform: translate(21px, 14px) scale(0.3); }
153
+ 33%, 78% { opacity: 0; }
154
+ 80% { opacity: 0.5; transform: translate(18px, 15.5px) scale(1); }
155
+ 86% { opacity: 0; transform: translate(21px, 14px) scale(0.3); }
156
+ 87%, 100%{ opacity: 0; }
157
+ }
158
+
159
+ /* Sweat during Phase A sweeping */
160
+ @keyframes sweat1 {
161
+ 0%, 8% { opacity: 0; transform: translate(0, 0) scale(0); }
162
+ 10% { opacity: 1; transform: translate(0, 0) scale(1); }
163
+ 20% { opacity: 0; transform: translate(-5px, -5px) scale(0.5); }
164
+ 21%, 100%{ opacity: 0; }
165
+ }
166
+ @keyframes sweat2 {
167
+ 0%, 16% { opacity: 0; transform: translate(0, 0) scale(0); }
168
+ 18% { opacity: 1; transform: translate(0, 0) scale(1); }
169
+ 28% { opacity: 0; transform: translate(-4px, -6px) scale(0.4); }
170
+ 29%, 100%{ opacity: 0; }
171
+ }
172
+ </style>
173
+ </defs>
174
+
175
+ <!-- Mirrored: character faces left for visible broom -->
176
+ <g transform="translate(15, 0) scale(-1, 1)">
177
+
178
+ <!-- Ground Shadow -->
179
+ <rect class="shadow-anim" x="3" y="15" width="9" height="1" fill="#000" opacity="0.5"/>
180
+
181
+ <!-- Dust particles (ground level, outside body group) -->
182
+ <rect class="dust dust-1" x="0" y="0" width="1.5" height="1.5" fill="#9E9E9E"/>
183
+ <rect class="dust dust-2" x="0" y="0" width="1" height="1" fill="#B0BEC5"/>
184
+ <rect class="dust dust-3" x="0" y="0" width="1.2" height="1.2" fill="#9E9E9E"/>
185
+
186
+ <!-- Static Legs -->
187
+ <g fill="#DE886D">
188
+ <rect x="3" y="13" width="1" height="2"/>
189
+ <rect x="5" y="13" width="1" height="2"/>
190
+ <rect x="9" y="13" width="1" height="2"/>
191
+ <rect x="11" y="13" width="1" height="2"/>
192
+ </g>
193
+
194
+ <!-- Upper Body -->
195
+ <g class="body-lean">
196
+
197
+ <!-- Sweat drops (inside body group, move with lean) -->
198
+ <g transform="translate(1, 5)">
199
+ <g class="sweat sweat-1" fill="#40C4FF">
200
+ <rect x="0" y="1" width="1.5" height="1.5"/>
201
+ <rect x="0.25" y="0" width="1" height="1"/>
202
+ </g>
203
+ </g>
204
+ <g transform="translate(-0.5, 7)">
205
+ <g class="sweat sweat-2" fill="#40C4FF">
206
+ <rect x="0" y="0.5" width="1" height="1"/>
207
+ <rect x="0.15" y="0" width="0.7" height="0.7"/>
208
+ </g>
209
+ </g>
210
+
211
+ <!-- Breathing -->
212
+ <g class="breathe">
213
+
214
+ <!-- Torso -->
215
+ <rect x="2" y="6" width="11" height="7" fill="#DE886D"/>
216
+
217
+ <!-- Left Arm (scratch head during pause) -->
218
+ <g class="arm-l">
219
+ <rect x="0" y="9" width="2" height="2" fill="#DE886D"/>
220
+ </g>
221
+
222
+ <!-- Right Arm + Broom (attached, sweeps together) -->
223
+ <g class="arm-r">
224
+ <rect x="13" y="9" width="2" height="2" fill="#DE886D"/>
225
+ <!-- Broom Handle -->
226
+ <rect x="13.5" y="11" width="1" height="3.5" fill="#795548"/>
227
+ <!-- Broom Bristles -->
228
+ <rect x="12" y="14.5" width="4" height="1.5" fill="#FFC107"/>
229
+ <!-- Bristle texture (vertical lines, bottom up, faint, gap at edges) -->
230
+ <rect x="12.5" y="14.85" width="0.35" height="0.8" fill="#C99700" opacity="0.3"/>
231
+ <rect x="13.2" y="14.8" width="0.3" height="0.9" fill="#C99700" opacity="0.35"/>
232
+ <rect x="13.8" y="14.85" width="0.35" height="0.8" fill="#C99700" opacity="0.3"/>
233
+ <rect x="14.5" y="14.8" width="0.3" height="0.85" fill="#C99700" opacity="0.35"/>
234
+ </g>
235
+
236
+ <!-- Eyes -->
237
+ <g class="eyes-dir" fill="#000">
238
+ <g class="blink">
239
+ <rect x="4" y="8" width="1" height="2"/>
240
+ <rect x="10" y="8" width="1" height="2"/>
241
+ </g>
242
+ </g>
243
+
244
+ </g>
245
+ </g>
246
+
247
+ </g>
248
+ </svg>