clawd-desktop 1.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 (68) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +58 -0
  3. package/assets/LICENSE-clawd +22 -0
  4. package/assets/gif/clawd-building.gif +0 -0
  5. package/assets/gif/clawd-carrying.gif +0 -0
  6. package/assets/gif/clawd-conducting.gif +0 -0
  7. package/assets/gif/clawd-debugger.gif +0 -0
  8. package/assets/gif/clawd-error.gif +0 -0
  9. package/assets/gif/clawd-happy.gif +0 -0
  10. package/assets/gif/clawd-idle-reading.gif +0 -0
  11. package/assets/gif/clawd-idle.gif +0 -0
  12. package/assets/gif/clawd-juggling.gif +0 -0
  13. package/assets/gif/clawd-notification.gif +0 -0
  14. package/assets/gif/clawd-react-annoyed.gif +0 -0
  15. package/assets/gif/clawd-react-double-jump.gif +0 -0
  16. package/assets/gif/clawd-sleeping.gif +0 -0
  17. package/assets/gif/clawd-sweeping.gif +0 -0
  18. package/assets/gif/clawd-thinking.gif +0 -0
  19. package/assets/gif/clawd-typing.gif +0 -0
  20. package/assets/svg/clawd-about-hero.svg +202 -0
  21. package/assets/svg/clawd-collapse-sleep.svg +247 -0
  22. package/assets/svg/clawd-error.svg +94 -0
  23. package/assets/svg/clawd-happy.svg +161 -0
  24. package/assets/svg/clawd-idle-collapse.svg +101 -0
  25. package/assets/svg/clawd-idle-doze.svg +72 -0
  26. package/assets/svg/clawd-idle-follow.svg +64 -0
  27. package/assets/svg/clawd-idle-living.svg +196 -0
  28. package/assets/svg/clawd-idle-look.svg +115 -0
  29. package/assets/svg/clawd-idle-reading.svg +201 -0
  30. package/assets/svg/clawd-idle-yawn.svg +158 -0
  31. package/assets/svg/clawd-mini-alert.svg +129 -0
  32. package/assets/svg/clawd-mini-crabwalk.svg +76 -0
  33. package/assets/svg/clawd-mini-enter-sleep.svg +65 -0
  34. package/assets/svg/clawd-mini-enter.svg +115 -0
  35. package/assets/svg/clawd-mini-happy.svg +124 -0
  36. package/assets/svg/clawd-mini-idle.svg +83 -0
  37. package/assets/svg/clawd-mini-peek.svg +82 -0
  38. package/assets/svg/clawd-mini-sleep.svg +112 -0
  39. package/assets/svg/clawd-mini-typing.svg +153 -0
  40. package/assets/svg/clawd-notification.svg +149 -0
  41. package/assets/svg/clawd-react-annoyed.svg +167 -0
  42. package/assets/svg/clawd-react-double-jump.svg +229 -0
  43. package/assets/svg/clawd-react-double.svg +108 -0
  44. package/assets/svg/clawd-react-drag.svg +102 -0
  45. package/assets/svg/clawd-react-left.svg +102 -0
  46. package/assets/svg/clawd-react-right.svg +102 -0
  47. package/assets/svg/clawd-sleeping.svg +118 -0
  48. package/assets/svg/clawd-static-base.svg +21 -0
  49. package/assets/svg/clawd-wake.svg +277 -0
  50. package/assets/svg/clawd-working-building.svg +329 -0
  51. package/assets/svg/clawd-working-carrying.svg +178 -0
  52. package/assets/svg/clawd-working-conducting.svg +220 -0
  53. package/assets/svg/clawd-working-debugger.svg +245 -0
  54. package/assets/svg/clawd-working-juggling.svg +183 -0
  55. package/assets/svg/clawd-working-sweeping.svg +248 -0
  56. package/assets/svg/clawd-working-thinking.svg +196 -0
  57. package/assets/svg/clawd-working-typing.svg +273 -0
  58. package/assets/svg/clawd-working-ultrathink.svg +166 -0
  59. package/assets/svg/clawd-working-wizard.svg +98 -0
  60. package/assets/tray-icon.ico +0 -0
  61. package/bin/claude-pet.js +6 -0
  62. package/main.js +86 -0
  63. package/package.json +38 -0
  64. package/preload.js +6 -0
  65. package/renderer/avatar.js +55 -0
  66. package/renderer/index.html +14 -0
  67. package/renderer/motion.js +24 -0
  68. package/renderer/style.css +104 -0
@@ -0,0 +1,329 @@
1
+ <!--
2
+ clawd-experiment-working-building-helmet-v1.svg (2026-04-24)
3
+ 基础 = D:\animation\assets\svg\clawd-working-building.svg
4
+ 改动 = 把原黄色安全帽 (#FBC02D/#F9A825) 换成 helmet-tryon-v1 的三色橙帽 (#EFA74A/#B7782E/#FAB253)
5
+ 帽子仍放在 body-squash 组内, 跟随锤击 squash; z-order: torso → helmet → eyes (helmet 不遮眼, 无视觉冲突)
6
+ -->
7
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="-15 -25 45 45" width="500" height="500" shape-rendering="crispEdges">
8
+ <defs>
9
+ <style>
10
+ /* ===== Independent sub-animations ===== */
11
+
12
+ /* Breathe 3.2s */
13
+ .breathe {
14
+ transform-origin: 7.5px 13px;
15
+ animation: breathe 3.2s infinite ease-in-out;
16
+ }
17
+
18
+ /* Blink 4s */
19
+ .blink {
20
+ transform-origin: 7.5px 9px;
21
+ animation: blink 4s infinite;
22
+ }
23
+
24
+ /* ===== Hammer cycle 1.2s ===== */
25
+
26
+ /* Body bounce: up-down motion (shared by body + arms) */
27
+ .body-bounce {
28
+ transform-origin: 7.5px 15px;
29
+ animation: body-bounce 1.2s infinite;
30
+ }
31
+
32
+ /* Body squash: scale only (torso + hat + eyes, arms excluded) */
33
+ .body-squash {
34
+ transform-origin: 7.5px 15px;
35
+ animation: body-squash 1.2s infinite;
36
+ }
37
+
38
+ /* Right arm hammer swing */
39
+ .arm-hammer {
40
+ transform-origin: 14px 10px;
41
+ animation: hammer-swing 1.2s infinite;
42
+ }
43
+
44
+ /* Left arm counter-motion */
45
+ .arm-l-rest {
46
+ transform-origin: 2px 10px;
47
+ animation: arm-l-rest 1.2s infinite;
48
+ }
49
+
50
+ /* Shadow synced with bounce */
51
+ .shadow-anim {
52
+ transform-origin: 7.5px 15.5px;
53
+ animation: shadow-bounce 1.2s infinite;
54
+ }
55
+
56
+ /* Hot metal flash */
57
+ .hot-metal {
58
+ animation: metal-glow 1.2s infinite;
59
+ }
60
+
61
+ /* Sparks */
62
+ .spark { opacity: 0; }
63
+ .s1 { animation: spark-1 1.2s infinite; }
64
+ .s2 { animation: spark-2 1.2s infinite; }
65
+ .s3 { animation: spark-3 1.2s infinite; }
66
+
67
+ /* ===== Eyes 5s ===== */
68
+ .eyes-look {
69
+ animation: eyes-look 5s infinite ease-in-out;
70
+ }
71
+
72
+ /* ===== Sweat 6s ===== */
73
+ .sweat {
74
+ opacity: 0;
75
+ animation: sweat-fly 6s infinite;
76
+ }
77
+
78
+ /* ==================== Keyframes ==================== */
79
+
80
+ @keyframes breathe {
81
+ 0%, 100% { transform: scale(1, 1) translate(0, 0); }
82
+ 50% { transform: scale(1.02, 0.98) translate(0, 0.5px); }
83
+ }
84
+
85
+ @keyframes blink {
86
+ 0%, 10%, 100% { transform: scaleY(1); }
87
+ 5% { transform: scaleY(0.1); }
88
+ }
89
+
90
+ /* Body bounce: translateY only (arms share this, stay clean) */
91
+ @keyframes body-bounce {
92
+ 0%, 100% { transform: translateY(0); }
93
+ 30% { transform: translateY(-2px); }
94
+ 45% { transform: translateY(0); }
95
+ 50% { transform: translateY(2px); }
96
+ 70% { transform: translateY(0); }
97
+ }
98
+
99
+ /* Body squash: scale only (torso+hat+eyes, not arms) */
100
+ @keyframes body-squash {
101
+ 0%, 100% { transform: scale(1, 1); }
102
+ 30% { transform: scale(0.95, 1.05); }
103
+ 45% { transform: scale(1, 1); }
104
+ 50% { transform: scale(1.15, 0.85); }
105
+ 70% { transform: scale(1, 1); }
106
+ }
107
+
108
+ /* Shadow: lighter on rise, heavier on impact */
109
+ @keyframes shadow-bounce {
110
+ 0%, 45%, 70%, 100% { transform: scaleX(1); opacity: 0.5; }
111
+ 30% { transform: scaleX(0.92); opacity: 0.42; }
112
+ 50% { transform: scaleX(1.08); opacity: 0.58; }
113
+ }
114
+
115
+ /* Hammer swing: original angles preserved */
116
+ @keyframes hammer-swing {
117
+ 0%, 100% { transform: rotate(15deg); }
118
+ 30% { transform: rotate(-45deg); }
119
+ 45% { transform: rotate(40deg); }
120
+ 50% { transform: rotate(125deg); }
121
+ 70% { transform: rotate(15deg); }
122
+ }
123
+
124
+ /* Left arm: reacts to hammer rhythm */
125
+ @keyframes arm-l-rest {
126
+ 0%, 100% { transform: rotate(0deg); }
127
+ 30% { transform: rotate(15deg); }
128
+ 50% { transform: rotate(-5deg); }
129
+ }
130
+
131
+ /* Hot metal glow on impact */
132
+ @keyframes metal-glow {
133
+ 0%, 49% { fill: #FF5252; }
134
+ 50%, 60% { fill: #FFF59D; }
135
+ 100% { fill: #FF5252; }
136
+ }
137
+
138
+ /* Eyes: mostly watch anvil, occasional glance at hammer */
139
+ @keyframes eyes-look {
140
+ 0%, 100% { transform: translate(1.5px, 0.5px); }
141
+ 20% { transform: translate(1.5px, 0.5px); }
142
+ 25% { transform: translate(1px, -0.5px); }
143
+ 35% { transform: translate(1px, -0.5px); }
144
+ 40% { transform: translate(1.5px, 0.5px); }
145
+ 70% { transform: translate(0.3px, 0); }
146
+ 80% { transform: translate(1.5px, 0.5px); }
147
+ }
148
+
149
+ /* Sparks: appear at impact, scatter outward */
150
+ @keyframes spark-1 {
151
+ 0%, 49% { opacity: 0; transform: translate(0, 0) scale(0); }
152
+ 50% { opacity: 1; transform: translate(0, 0) scale(1); }
153
+ 70% { opacity: 0; transform: translate(4px, -6px) scale(0); }
154
+ 71%, 100% { opacity: 0; transform: translate(0, 0) scale(0); }
155
+ }
156
+ @keyframes spark-2 {
157
+ 0%, 49% { opacity: 0; transform: translate(0, 0) scale(0); }
158
+ 50% { opacity: 1; transform: translate(0, 0) scale(1); }
159
+ 70% { opacity: 0; transform: translate(7px, -1px) scale(0); }
160
+ 71%, 100% { opacity: 0; transform: translate(0, 0) scale(0); }
161
+ }
162
+ @keyframes spark-3 {
163
+ 0%, 49% { opacity: 0; transform: translate(0, 0) scale(0); }
164
+ 50% { opacity: 1; transform: translate(0, 0) scale(1); }
165
+ 70% { opacity: 0; transform: translate(3px, 3px) scale(0); }
166
+ 71%, 100% { opacity: 0; transform: translate(0, 0) scale(0); }
167
+ }
168
+
169
+ /* Sweat: one drop every 6s */
170
+ @keyframes sweat-fly {
171
+ 0%, 55% { opacity: 0; transform: translate(0, 0) scale(0); }
172
+ 60% { opacity: 1; transform: translate(0, 0) scale(1); }
173
+ 80% { opacity: 0; transform: translate(-6px, -6px) scale(0.5); }
174
+ 100% { opacity: 0; }
175
+ }
176
+ </style>
177
+
178
+ <!-- Pixel Spark -->
179
+ <g id="pixel-spark">
180
+ <rect x="0" y="0" width="1" height="1"/>
181
+ </g>
182
+ </defs>
183
+
184
+ <!-- Ground Shadows -->
185
+ <rect class="shadow-anim" x="3" y="15" width="9" height="1" fill="#000000"/>
186
+ <rect x="16" y="15" width="7" height="1" fill="#000000" opacity="0.4"/>
187
+
188
+ <!-- Metal Block / Anvil -->
189
+ <g transform="translate(17, 13)">
190
+ <rect x="0" y="2" width="5" height="1" fill="#546E7A"/>
191
+ <rect x="1" y="0" width="3" height="2" fill="#78909C"/>
192
+ <rect x="1.5" y="-0.5" width="2" height="1" class="hot-metal"/>
193
+ </g>
194
+
195
+ <!-- Impact Sparks -->
196
+ <g fill="#FFC107" transform="translate(19, 12.5)">
197
+ <use href="#pixel-spark" class="spark s1"/>
198
+ <use href="#pixel-spark" class="spark s2"/>
199
+ <use href="#pixel-spark" class="spark s3"/>
200
+ </g>
201
+
202
+ <!-- Legs (bounce with body, no squash) -->
203
+ <g class="body-bounce" fill="#DE886D">
204
+ <rect x="3" y="13" width="1" height="2"/>
205
+ <rect x="5" y="13" width="1" height="2"/>
206
+ <rect x="9" y="13" width="1" height="2"/>
207
+ <rect x="11" y="13" width="1" height="2"/>
208
+ </g>
209
+
210
+ <!-- Body group [bounce > breathe] -->
211
+ <g class="body-bounce">
212
+ <g class="breathe">
213
+
214
+ <!-- Sweat (bounces + breathes, outside squash) -->
215
+ <g transform="translate(1, 8)">
216
+ <g class="sweat" fill="#40C4FF">
217
+ <rect x="0" y="1" width="1.5" height="1.5"/>
218
+ <rect x="0.25" y="0" width="1" height="1"/>
219
+ </g>
220
+ </g>
221
+
222
+ <!-- Body core [squash] — only torso + hat + eyes get squashed -->
223
+ <g class="body-squash">
224
+
225
+ <!-- Torso -->
226
+ <rect x="2" y="6" width="11" height="7" fill="#DE886D"/>
227
+
228
+ <!-- Eyes [look 5s > blink 4s] — 放在 helmet 之前, 让帽子压过眼睛 -->
229
+ <g class="eyes-look">
230
+ <g class="blink" fill="#000">
231
+ <rect x="4" y="8" width="1" height="2"/>
232
+ <rect x="10" y="8" width="1" height="2"/>
233
+ </g>
234
+ </g>
235
+
236
+ <!-- Helmet (from helmet-tryon-v1: 三色橙, translate(0.5 1) scale(0.7) — v1 下移 1 格戴更低) -->
237
+ <g id="helmet" transform="translate(0.5 1) scale(0.7)">
238
+ <g fill="#EFA74A">
239
+ <rect x="7" y="0" width="6" height="1"/>
240
+ <rect x="7" y="1" width="6" height="1"/>
241
+ <rect x="14" y="1" width="2" height="1"/>
242
+ <rect x="2" y="2" width="3" height="1"/>
243
+ <rect x="7" y="2" width="2" height="1"/>
244
+ <rect x="11" y="2" width="2" height="1"/>
245
+ <rect x="14" y="2" width="4" height="1"/>
246
+ <rect x="2" y="3" width="3" height="1"/>
247
+ <rect x="7" y="3" width="1" height="1"/>
248
+ <rect x="14" y="3" width="4" height="1"/>
249
+ <rect x="1" y="4" width="4" height="1"/>
250
+ <rect x="7" y="4" width="1" height="1"/>
251
+ <rect x="14" y="4" width="5" height="1"/>
252
+ <rect x="1" y="5" width="4" height="1"/>
253
+ <rect x="7" y="5" width="1" height="1"/>
254
+ <rect x="12" y="5" width="1" height="1"/>
255
+ <rect x="14" y="5" width="5" height="1"/>
256
+ <rect x="1" y="6" width="4" height="1"/>
257
+ <rect x="8" y="6" width="1" height="1"/>
258
+ <rect x="11" y="6" width="1" height="1"/>
259
+ <rect x="14" y="6" width="5" height="1"/>
260
+ <rect x="1" y="7" width="1" height="1"/>
261
+ <rect x="0" y="9" width="20" height="1"/>
262
+ </g>
263
+ <g fill="#B7782E">
264
+ <rect x="6" y="1" width="1" height="1"/>
265
+ <rect x="13" y="1" width="1" height="1"/>
266
+ <rect x="6" y="2" width="1" height="1"/>
267
+ <rect x="9" y="2" width="2" height="1"/>
268
+ <rect x="13" y="2" width="1" height="1"/>
269
+ <rect x="6" y="3" width="1" height="1"/>
270
+ <rect x="8" y="3" width="4" height="1"/>
271
+ <rect x="13" y="3" width="1" height="1"/>
272
+ <rect x="6" y="4" width="1" height="1"/>
273
+ <rect x="8" y="4" width="4" height="1"/>
274
+ <rect x="13" y="4" width="1" height="1"/>
275
+ <rect x="6" y="5" width="1" height="1"/>
276
+ <rect x="9" y="5" width="2" height="1"/>
277
+ <rect x="13" y="5" width="1" height="1"/>
278
+ <rect x="6" y="6" width="1" height="1"/>
279
+ <rect x="9" y="6" width="2" height="1"/>
280
+ <rect x="13" y="6" width="1" height="1"/>
281
+ <rect x="7" y="7" width="1" height="1"/>
282
+ <rect x="12" y="7" width="1" height="1"/>
283
+ <rect x="1" y="8" width="18" height="1"/>
284
+ </g>
285
+ <g fill="#FAB253">
286
+ <rect x="5" y="1" width="1" height="1"/>
287
+ <rect x="5" y="2" width="1" height="1"/>
288
+ <rect x="5" y="3" width="1" height="1"/>
289
+ <rect x="12" y="3" width="1" height="1"/>
290
+ <rect x="5" y="4" width="1" height="1"/>
291
+ <rect x="12" y="4" width="1" height="1"/>
292
+ <rect x="5" y="5" width="1" height="1"/>
293
+ <rect x="8" y="5" width="1" height="1"/>
294
+ <rect x="11" y="5" width="1" height="1"/>
295
+ <rect x="5" y="6" width="1" height="1"/>
296
+ <rect x="7" y="6" width="1" height="1"/>
297
+ <rect x="12" y="6" width="1" height="1"/>
298
+ <rect x="2" y="7" width="5" height="1"/>
299
+ <rect x="8" y="7" width="4" height="1"/>
300
+ <rect x="13" y="7" width="6" height="1"/>
301
+ </g>
302
+ </g>
303
+
304
+ </g>
305
+
306
+ <!-- Left arm (bounces + breathes, NO squash) -->
307
+ <g class="arm-l-rest">
308
+ <rect x="0" y="9" width="2" height="2" fill="#DE886D"/>
309
+ </g>
310
+
311
+ </g>
312
+ </g>
313
+
314
+ <!-- Right arm + hammer [bounce > breathe] (separate group, same classes = auto sync) -->
315
+ <g class="body-bounce">
316
+ <g class="breathe">
317
+ <g class="arm-hammer">
318
+ <rect x="13" y="9" width="2" height="2" fill="#DE886D"/>
319
+ <!-- Hammer -->
320
+ <g>
321
+ <!-- Handle -->
322
+ <rect x="13.5" y="4" width="1" height="6" fill="#795548"/>
323
+ <!-- Head -->
324
+ <rect x="12.5" y="3" width="3" height="2" fill="#9E9E9E"/>
325
+ </g>
326
+ </g>
327
+ </g>
328
+ </g>
329
+ </svg>
@@ -0,0 +1,178 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="-15 -25 45 45" width="500" height="500">
2
+ <defs>
3
+ <style>
4
+ .body-walk {
5
+ transform-origin: 7.5px 15px;
6
+ animation: walk-bounce 0.4s infinite ease-in-out;
7
+ }
8
+ .step-a { animation: step 0.4s infinite ease-in-out; }
9
+ .step-b { animation: step 0.4s infinite ease-in-out; animation-delay: -0.2s; }
10
+ .pack-swing {
11
+ transform-origin: 13px 8px;
12
+ animation: pack-swing 0.4s infinite alternate ease-in-out;
13
+ }
14
+ .arm-swing-l {
15
+ transform-origin: 2px 9px;
16
+ animation: arm-swing 0.4s infinite alternate ease-in-out;
17
+ }
18
+ .cap-sway {
19
+ transform-origin: 6px 6.5px;
20
+ animation: cap-sway 0.8s infinite alternate ease-in-out;
21
+ }
22
+ .shadow-walk {
23
+ transform-origin: 7.5px 15.5px;
24
+ animation: shadow-walk 0.4s infinite ease-in-out;
25
+ }
26
+
27
+ /* Eyes three-layer */
28
+ .eyes-gaze { animation: eyes-gaze 2.5s infinite; }
29
+ .eyes-rect {
30
+ transform-origin: 7.5px 9px;
31
+ animation: eyes-blink-rush 2.5s infinite, rect-vis 2.5s infinite step-end;
32
+ }
33
+ .eyes-xmark {
34
+ visibility: hidden;
35
+ animation: xmark-vis 2.5s infinite step-end;
36
+ }
37
+
38
+ /* Sweat: only during xmark period */
39
+ .sweat-1 { animation: sweat1-fly 2.5s infinite; }
40
+ .sweat-2 { animation: sweat2-fly 2.5s infinite; }
41
+
42
+ @keyframes walk-bounce {
43
+ 0%, 50%, 100% { transform: translateY(1px); }
44
+ 25%, 75% { transform: translateY(0); }
45
+ }
46
+ @keyframes step {
47
+ 0%, 100% { transform: translateY(0); }
48
+ 50% { transform: translateY(-1px); }
49
+ }
50
+ @keyframes pack-swing {
51
+ 0% { transform: rotate(3deg); }
52
+ 100% { transform: rotate(-3deg); }
53
+ }
54
+ @keyframes arm-swing {
55
+ 0% { transform: rotate(-8deg); }
56
+ 100% { transform: rotate(8deg); }
57
+ }
58
+ @keyframes cap-sway {
59
+ 0% { transform: rotate(-3deg); }
60
+ 100% { transform: rotate(3deg); }
61
+ }
62
+ @keyframes shadow-walk {
63
+ 0%, 50%, 100% { transform: scale(1.03); opacity: 0.55; }
64
+ 25%, 75% { transform: scale(1); opacity: 0.5; }
65
+ }
66
+
67
+ /* Gaze: left while rushing, center during xmark */
68
+ @keyframes eyes-gaze {
69
+ 0%, 15%, 88%, 100% { transform: translate(-1px, 0); }
70
+ 25%, 80% { transform: translate(0, 0); }
71
+ }
72
+ /* Rect blink + gate at 28% and 78% */
73
+ @keyframes eyes-blink-rush {
74
+ 0%, 4%, 100% { transform: scaleY(1); }
75
+ 6% { transform: scaleY(0.1); }
76
+ 8% { transform: scaleY(1); }
77
+ 28% { transform: scaleY(0.1); }
78
+ 31%, 76% { transform: scaleY(1); }
79
+ 78% { transform: scaleY(0.1); }
80
+ 83% { transform: scaleY(1); }
81
+ }
82
+ /* Rect hidden during xmark */
83
+ @keyframes rect-vis {
84
+ 0% { visibility: visible; }
85
+ 29% { visibility: hidden; }
86
+ 79% { visibility: visible; }
87
+ }
88
+ /* Xmark shown during xmark */
89
+ @keyframes xmark-vis {
90
+ 0% { visibility: hidden; }
91
+ 29% { visibility: visible; }
92
+ 79% { visibility: hidden; }
93
+ }
94
+
95
+ /* Sweat only during xmark (synced to 2.5s) */
96
+ @keyframes sweat1-fly {
97
+ 0%, 27% { transform: translate(0, 0); opacity: 0; }
98
+ 31% { transform: translate(0, 0); opacity: 1; }
99
+ 55% { transform: translate(4px, -3px); opacity: 0; }
100
+ 100% { opacity: 0; }
101
+ }
102
+ @keyframes sweat2-fly {
103
+ 0%, 37% { transform: translate(0, 0); opacity: 0; }
104
+ 41% { transform: translate(0, 0); opacity: 1; }
105
+ 65% { transform: translate(2px, -5px); opacity: 0; }
106
+ 100% { opacity: 0; }
107
+ }
108
+ </style>
109
+ </defs>
110
+
111
+ <rect class="shadow-walk" x="3" y="15" width="9" height="1" fill="#000000" opacity="0.5"/>
112
+
113
+ <g transform="rotate(-2, 7.5, 15)">
114
+ <g class="body-walk">
115
+ <!-- Backpack -->
116
+ <g class="pack-swing">
117
+ <rect x="13" y="7" width="4" height="6" fill="#5C9CE6"/>
118
+ <rect x="12" y="8" width="5" height="4" fill="#5C9CE6"/>
119
+ <rect x="13" y="7" width="4" height="2" fill="#3D7AC7"/>
120
+ <rect x="13" y="10" width="4" height="1" fill="#3D7AC7"/>
121
+ <rect x="13" y="12" width="4" height="1" fill="#2D5FA5"/>
122
+ <rect x="15" y="9" width="1" height="1" fill="#FFD54F"/>
123
+ </g>
124
+
125
+ <!-- Legs -->
126
+ <g fill="#DE886D">
127
+ <rect class="step-a" x="3" y="13" width="1" height="2"/>
128
+ <rect class="step-b" x="5" y="13" width="1" height="2"/>
129
+ <rect class="step-b" x="9" y="13" width="1" height="2"/>
130
+ <rect class="step-a" x="11" y="13" width="1" height="2"/>
131
+ </g>
132
+
133
+ <!-- Body -->
134
+ <rect x="2" y="6" width="11" height="7" fill="#DE886D"/>
135
+
136
+ <!-- Arms -->
137
+ <g class="arm-swing-l" fill="#DE886D">
138
+ <rect x="0" y="9" width="3" height="2"/>
139
+ </g>
140
+ <rect x="13" y="9" width="2" height="2" fill="#DE886D"/>
141
+
142
+ <!-- Right strap -->
143
+ <rect x="13" y="7" width="1" height="4" fill="#3D7AC7"/>
144
+
145
+ <!-- Eyes: gaze + rect/xmark toggle -->
146
+ <g class="eyes-gaze">
147
+ <g class="eyes-rect" fill="#000000">
148
+ <rect x="4" y="8" width="1" height="2"/>
149
+ <rect x="10" y="8" width="1" height="2"/>
150
+ </g>
151
+ <g class="eyes-xmark" fill="none" stroke="#000000"
152
+ stroke-width="0.7" stroke-linecap="round" stroke-linejoin="round">
153
+ <polyline points="4,8 5.5,9 4,10"/>
154
+ <polyline points="11,8 9.5,9 11,10"/>
155
+ </g>
156
+ </g>
157
+
158
+ <!-- Sweat: 2 drops only during xmark -->
159
+ <g class="sweat-1" fill="#40C4FF">
160
+ <rect x="14" y="5" width="1" height="1.5"/>
161
+ <rect x="14.25" y="4.5" width="0.5" height="0.5"/>
162
+ </g>
163
+ <g class="sweat-2" fill="#40C4FF">
164
+ <rect x="16" y="4" width="1" height="1.5"/>
165
+ <rect x="16.25" y="3.5" width="0.5" height="0.5"/>
166
+ </g>
167
+
168
+ <!-- Tilted cap -->
169
+ <g class="cap-sway">
170
+ <g transform="rotate(-15, 6, 6.5)">
171
+ <rect x="1" y="4.5" width="7" height="2" fill="#5C9CE6"/>
172
+ <rect x="-1" y="5.5" width="4" height="1" fill="#3D7AC7"/>
173
+ <rect x="4" y="4.5" width="1" height="1" fill="#FFD54F"/>
174
+ </g>
175
+ </g>
176
+ </g>
177
+ </g>
178
+ </svg>