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.
- package/LICENSE +21 -0
- package/README.md +58 -0
- package/assets/LICENSE-clawd +22 -0
- package/assets/gif/clawd-building.gif +0 -0
- package/assets/gif/clawd-carrying.gif +0 -0
- package/assets/gif/clawd-conducting.gif +0 -0
- package/assets/gif/clawd-debugger.gif +0 -0
- package/assets/gif/clawd-error.gif +0 -0
- package/assets/gif/clawd-happy.gif +0 -0
- package/assets/gif/clawd-idle-reading.gif +0 -0
- package/assets/gif/clawd-idle.gif +0 -0
- package/assets/gif/clawd-juggling.gif +0 -0
- package/assets/gif/clawd-notification.gif +0 -0
- package/assets/gif/clawd-react-annoyed.gif +0 -0
- package/assets/gif/clawd-react-double-jump.gif +0 -0
- package/assets/gif/clawd-sleeping.gif +0 -0
- package/assets/gif/clawd-sweeping.gif +0 -0
- package/assets/gif/clawd-thinking.gif +0 -0
- package/assets/gif/clawd-typing.gif +0 -0
- package/assets/svg/clawd-about-hero.svg +202 -0
- package/assets/svg/clawd-collapse-sleep.svg +247 -0
- package/assets/svg/clawd-error.svg +94 -0
- package/assets/svg/clawd-happy.svg +161 -0
- package/assets/svg/clawd-idle-collapse.svg +101 -0
- package/assets/svg/clawd-idle-doze.svg +72 -0
- package/assets/svg/clawd-idle-follow.svg +64 -0
- package/assets/svg/clawd-idle-living.svg +196 -0
- package/assets/svg/clawd-idle-look.svg +115 -0
- package/assets/svg/clawd-idle-reading.svg +201 -0
- package/assets/svg/clawd-idle-yawn.svg +158 -0
- package/assets/svg/clawd-mini-alert.svg +129 -0
- package/assets/svg/clawd-mini-crabwalk.svg +76 -0
- package/assets/svg/clawd-mini-enter-sleep.svg +65 -0
- package/assets/svg/clawd-mini-enter.svg +115 -0
- package/assets/svg/clawd-mini-happy.svg +124 -0
- package/assets/svg/clawd-mini-idle.svg +83 -0
- package/assets/svg/clawd-mini-peek.svg +82 -0
- package/assets/svg/clawd-mini-sleep.svg +112 -0
- package/assets/svg/clawd-mini-typing.svg +153 -0
- package/assets/svg/clawd-notification.svg +149 -0
- package/assets/svg/clawd-react-annoyed.svg +167 -0
- package/assets/svg/clawd-react-double-jump.svg +229 -0
- package/assets/svg/clawd-react-double.svg +108 -0
- package/assets/svg/clawd-react-drag.svg +102 -0
- package/assets/svg/clawd-react-left.svg +102 -0
- package/assets/svg/clawd-react-right.svg +102 -0
- package/assets/svg/clawd-sleeping.svg +118 -0
- package/assets/svg/clawd-static-base.svg +21 -0
- package/assets/svg/clawd-wake.svg +277 -0
- package/assets/svg/clawd-working-building.svg +329 -0
- package/assets/svg/clawd-working-carrying.svg +178 -0
- package/assets/svg/clawd-working-conducting.svg +220 -0
- package/assets/svg/clawd-working-debugger.svg +245 -0
- package/assets/svg/clawd-working-juggling.svg +183 -0
- package/assets/svg/clawd-working-sweeping.svg +248 -0
- package/assets/svg/clawd-working-thinking.svg +196 -0
- package/assets/svg/clawd-working-typing.svg +273 -0
- package/assets/svg/clawd-working-ultrathink.svg +166 -0
- package/assets/svg/clawd-working-wizard.svg +98 -0
- package/assets/tray-icon.ico +0 -0
- package/bin/claude-pet.js +6 -0
- package/main.js +86 -0
- package/package.json +38 -0
- package/preload.js +6 -0
- package/renderer/avatar.js +55 -0
- package/renderer/index.html +14 -0
- package/renderer/motion.js +24 -0
- package/renderer/style.css +104 -0
|
@@ -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>
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="-15 -25 45 45" width="500" height="500">
|
|
2
|
+
<defs>
|
|
3
|
+
<style>
|
|
4
|
+
/* === 12s master timeline: mostly still, one gentle "thinking moment" === */
|
|
5
|
+
|
|
6
|
+
/* Body: one subtle lean at the thinking moment */
|
|
7
|
+
.body-master {
|
|
8
|
+
transform-origin: 7.5px 15px;
|
|
9
|
+
animation: body-think 12s infinite ease-in-out;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
/* Breathing: the ONLY constant cycle (3.2s) */
|
|
13
|
+
.breathe {
|
|
14
|
+
transform-origin: 7.5px 13px;
|
|
15
|
+
animation: breathe 3.2s infinite ease-in-out;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/* Shadow follows body */
|
|
19
|
+
.shadow-think {
|
|
20
|
+
animation: shadow-think 12s infinite ease-in-out;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/* Right arm: resting on chin, one gentle press per cycle */
|
|
24
|
+
.arm-r {
|
|
25
|
+
transform-origin: 14px 10px;
|
|
26
|
+
animation: arm-r-think 12s infinite ease-in-out;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/* Left arm: one tiny shift with body lean */
|
|
30
|
+
.arm-l {
|
|
31
|
+
transform-origin: 1px 10px;
|
|
32
|
+
animation: arm-l-think 12s infinite ease-in-out;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/* Eyes: combined movement + blink on same timeline
|
|
36
|
+
Blinks are intentionally placed before/after eye drift */
|
|
37
|
+
.eyes-think {
|
|
38
|
+
transform-origin: 7.5px 8px;
|
|
39
|
+
animation: eyes-think 12s infinite ease-in-out;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/* === Bubble edge morph === */
|
|
43
|
+
.bubble-h {
|
|
44
|
+
animation: morph-h 5s infinite ease-in-out;
|
|
45
|
+
}
|
|
46
|
+
.bubble-v {
|
|
47
|
+
animation: morph-v 4s infinite ease-in-out;
|
|
48
|
+
}
|
|
49
|
+
.bubble-main {
|
|
50
|
+
animation: morph-main 6s infinite ease-in-out;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/* === Loading dots (2s) === */
|
|
54
|
+
.dot { opacity: 0; }
|
|
55
|
+
.d1 { animation: load-dot-1 2s infinite; }
|
|
56
|
+
.d2 { animation: load-dot-2 2s infinite; }
|
|
57
|
+
.d3 { animation: load-dot-3 2s infinite; }
|
|
58
|
+
|
|
59
|
+
/* ==================== Keyframes ==================== */
|
|
60
|
+
|
|
61
|
+
/* Body: neutral → gentle lean at 50% → return
|
|
62
|
+
Only 1.5deg, barely perceptible, but gives "weight shift" */
|
|
63
|
+
@keyframes body-think {
|
|
64
|
+
0%, 35%, 80%, 100% { transform: rotate(0deg) translate(0, 0); }
|
|
65
|
+
50% { transform: rotate(1.5deg) translate(0.3px, 0); }
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/* Shadow: subtle horizontal shift with body */
|
|
69
|
+
@keyframes shadow-think {
|
|
70
|
+
0%, 35%, 80%, 100% { transform: translate(0, 0); }
|
|
71
|
+
50% { transform: translate(0.3px, 0); }
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/* Breathing: standard template, always running */
|
|
75
|
+
@keyframes breathe {
|
|
76
|
+
0%, 100% { transform: scale(1, 1) translate(0, 0); }
|
|
77
|
+
50% { transform: scale(1.02, 0.98) translate(0, 0.5px); }
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/* Right arm: resting at -130deg (on chin), one slow press to -138deg
|
|
81
|
+
Arm is mostly STILL — the press is the "thinking moment" */
|
|
82
|
+
@keyframes arm-r-think {
|
|
83
|
+
0%, 38%, 75%, 100% { transform: rotate(-130deg); }
|
|
84
|
+
52% { transform: rotate(-138deg); }
|
|
85
|
+
62% { transform: rotate(-127deg); }
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/* Left arm: resting at 22deg, tiny 4deg shift with body lean */
|
|
89
|
+
@keyframes arm-l-think {
|
|
90
|
+
0%, 40%, 78%, 100% { transform: rotate(22deg); }
|
|
91
|
+
55% { transform: rotate(26deg); }
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/* Eyes: combined translate (gaze) + scaleY (blink)
|
|
95
|
+
3 blinks in 12s ≈ natural rate
|
|
96
|
+
Blinks gate the eye drift transitions (intentional)
|
|
97
|
+
|
|
98
|
+
Mirror note: translate(+x) = screen LEFT toward bubble
|
|
99
|
+
Gaze amplitude: max 0.5px (tiny, dreamy) */
|
|
100
|
+
@keyframes eyes-think {
|
|
101
|
+
/* --- quiet phase: gazing vaguely at bubble --- */
|
|
102
|
+
0% { transform: translate(0.5px, -0.3px) scaleY(1); }
|
|
103
|
+
14% { transform: translate(0.5px, -0.3px) scaleY(1); }
|
|
104
|
+
16% { transform: translate(0.5px, -0.3px) scaleY(0.1); }
|
|
105
|
+
18% { transform: translate(0.5px, -0.3px) scaleY(1); }
|
|
106
|
+
/* --- still quiet, holding gaze --- */
|
|
107
|
+
42% { transform: translate(0.5px, -0.3px) scaleY(1); }
|
|
108
|
+
44% { transform: translate(0.5px, -0.3px) scaleY(0.1); }
|
|
109
|
+
46% { transform: translate(0.5px, -0.3px) scaleY(1); }
|
|
110
|
+
/* --- slow drift to the side (the "hmm" moment) --- */
|
|
111
|
+
56% { transform: translate(-0.5px, 0) scaleY(1); }
|
|
112
|
+
70% { transform: translate(-0.5px, 0) scaleY(1); }
|
|
113
|
+
/* --- blink, then drift back --- */
|
|
114
|
+
74% { transform: translate(-0.5px, 0) scaleY(1); }
|
|
115
|
+
76% { transform: translate(-0.5px, 0) scaleY(0.1); }
|
|
116
|
+
78% { transform: translate(-0.5px, 0) scaleY(1); }
|
|
117
|
+
/* --- return to bubble --- */
|
|
118
|
+
88% { transform: translate(0.5px, -0.3px) scaleY(1); }
|
|
119
|
+
100% { transform: translate(0.5px, -0.3px) scaleY(1); }
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/* Bubble edge morphing */
|
|
123
|
+
@keyframes morph-main {
|
|
124
|
+
0%, 100% { transform: translate(0, 0); }
|
|
125
|
+
50% { transform: translate(0, -0.3px); }
|
|
126
|
+
}
|
|
127
|
+
@keyframes morph-h {
|
|
128
|
+
0%, 100% { transform: translate(0, 0); }
|
|
129
|
+
50% { transform: translate(0.3px, 0); }
|
|
130
|
+
}
|
|
131
|
+
@keyframes morph-v {
|
|
132
|
+
0%, 100% { transform: translate(0, 0); }
|
|
133
|
+
50% { transform: translate(0, 0.3px); }
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/* Loading dots */
|
|
137
|
+
@keyframes load-dot-1 {
|
|
138
|
+
0%, 20% { opacity: 0; }
|
|
139
|
+
21%, 100% { opacity: 1; }
|
|
140
|
+
}
|
|
141
|
+
@keyframes load-dot-2 {
|
|
142
|
+
0%, 40% { opacity: 0; }
|
|
143
|
+
41%, 100% { opacity: 1; }
|
|
144
|
+
}
|
|
145
|
+
@keyframes load-dot-3 {
|
|
146
|
+
0%, 60% { opacity: 0; }
|
|
147
|
+
61%, 100% { opacity: 1; }
|
|
148
|
+
}
|
|
149
|
+
</style>
|
|
150
|
+
</defs>
|
|
151
|
+
|
|
152
|
+
<!-- Thinking Bubble (upper-left) -->
|
|
153
|
+
<g transform="translate(-3, -7)">
|
|
154
|
+
<g class="think-bubble">
|
|
155
|
+
<g fill="#FFFFFF" opacity="0.9">
|
|
156
|
+
<rect class="bubble-main" x="2" y="1" width="8" height="7"/>
|
|
157
|
+
<rect class="bubble-h" x="1" y="2" width="10" height="5"/>
|
|
158
|
+
<rect class="bubble-v" x="3" y="0" width="6" height="9"/>
|
|
159
|
+
<rect x="8" y="7" width="2" height="2"/>
|
|
160
|
+
<rect x="10" y="9" width="1" height="1"/>
|
|
161
|
+
</g>
|
|
162
|
+
<g fill="#0082FC">
|
|
163
|
+
<rect class="dot d1" x="2.5" y="4" width="1" height="1"/>
|
|
164
|
+
<rect class="dot d2" x="5.5" y="4" width="1" height="1"/>
|
|
165
|
+
<rect class="dot d3" x="8.5" y="4" width="1" height="1"/>
|
|
166
|
+
</g>
|
|
167
|
+
</g>
|
|
168
|
+
</g>
|
|
169
|
+
|
|
170
|
+
<!-- Mirrored Character -->
|
|
171
|
+
<g transform="translate(15, 0) scale(-1, 1)">
|
|
172
|
+
<rect class="shadow-think" x="3" y="15" width="9" height="1" fill="#000000" opacity="0.5"/>
|
|
173
|
+
|
|
174
|
+
<g class="body-master">
|
|
175
|
+
<g class="breathe">
|
|
176
|
+
<g fill="#DE886D">
|
|
177
|
+
<rect x="3" y="13" width="1" height="2"/>
|
|
178
|
+
<rect x="5" y="13" width="1" height="2"/>
|
|
179
|
+
<rect x="9" y="13" width="1" height="2"/>
|
|
180
|
+
<rect x="11" y="13" width="1" height="2"/>
|
|
181
|
+
<rect id="torso" x="2" y="6" width="11" height="7"/>
|
|
182
|
+
<g class="arm-l">
|
|
183
|
+
<rect x="0" y="9" width="3" height="2"/>
|
|
184
|
+
</g>
|
|
185
|
+
<g class="arm-r">
|
|
186
|
+
<rect x="13" y="9" width="2" height="2"/>
|
|
187
|
+
</g>
|
|
188
|
+
</g>
|
|
189
|
+
<g class="eyes-think" fill="#000000">
|
|
190
|
+
<rect x="5" y="7" width="1" height="2"/>
|
|
191
|
+
<rect x="11" y="7" width="1" height="2"/>
|
|
192
|
+
</g>
|
|
193
|
+
</g>
|
|
194
|
+
</g>
|
|
195
|
+
</g>
|
|
196
|
+
</svg>
|