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,129 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="-15 -25 45 45" width="500" height="500">
|
|
2
|
+
<defs>
|
|
3
|
+
<style>
|
|
4
|
+
.breathe-anim {
|
|
5
|
+
transform-origin: 7.5px 13px;
|
|
6
|
+
animation: breathe 3.2s infinite ease-in-out;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
.arm-alert {
|
|
10
|
+
transform-origin: 2px 9px;
|
|
11
|
+
animation: alert-arm 4s infinite ease-in-out;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/* Normal rect eyes: visible first, hidden after blink */
|
|
15
|
+
.eyes-rect {
|
|
16
|
+
transform-origin: 7.5px 9px; /* eye vertical center for blink */
|
|
17
|
+
animation: rect-vis 4s infinite step-end, rect-move 4s infinite ease-in-out;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/* xmark squint eyes: hidden first, visible after switch */
|
|
21
|
+
.eyes-xmark {
|
|
22
|
+
visibility: hidden;
|
|
23
|
+
animation: xmark-vis 4s infinite step-end;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
.alert-pop {
|
|
27
|
+
animation: alert-flash 4s infinite ease-in-out;
|
|
28
|
+
opacity: 0;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
@keyframes breathe {
|
|
32
|
+
0%, 100% { transform: scale(1, 1) translate(0, 0); }
|
|
33
|
+
50% { transform: scale(1.02, 0.98) translate(0, 0.5px); }
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
@keyframes alert-arm {
|
|
37
|
+
0%, 49% { transform: rotate(0deg); }
|
|
38
|
+
51% { transform: rotate(20deg); }
|
|
39
|
+
60% { transform: rotate(-8deg); }
|
|
40
|
+
64% { transform: rotate(20deg); }
|
|
41
|
+
68% { transform: rotate(-8deg); }
|
|
42
|
+
72% { transform: rotate(20deg); }
|
|
43
|
+
76% { transform: rotate(-8deg); }
|
|
44
|
+
80% { transform: rotate(20deg); }
|
|
45
|
+
84% { transform: rotate(-8deg); }
|
|
46
|
+
88% { transform: rotate(20deg); }
|
|
47
|
+
92%, 100% { transform: rotate(0deg); }
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/* Rect eyes: center, wait for exclamation, slowly look left, back, pause, blink, switch */
|
|
51
|
+
@keyframes rect-move {
|
|
52
|
+
0%, 16% { transform: translate(0, 0) scaleY(1); }
|
|
53
|
+
22%, 28% { transform: translate(-2px, 0) scaleY(1); }
|
|
54
|
+
34% { transform: translate(0, 0) scaleY(1); }
|
|
55
|
+
36% { transform: translate(0, 0) scaleY(0.1); }
|
|
56
|
+
37%, 39% { transform: translate(0, 0) scaleY(1); }
|
|
57
|
+
41% { transform: translate(0, 0) scaleY(0.1); }
|
|
58
|
+
42%, 100% { transform: translate(0, 0) scaleY(1); }
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/* Rect eyes visibility: visible → hidden at 22%, back at 91% */
|
|
62
|
+
@keyframes rect-vis {
|
|
63
|
+
0% { visibility: visible; }
|
|
64
|
+
42% { visibility: hidden; }
|
|
65
|
+
91% { visibility: visible; }
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/* xmark eyes visibility: hidden at start, visible at 42%, hidden at 89% */
|
|
69
|
+
@keyframes xmark-vis {
|
|
70
|
+
0% { visibility: hidden; }
|
|
71
|
+
42% { visibility: visible; }
|
|
72
|
+
89% { visibility: hidden; }
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
@keyframes alert-flash {
|
|
76
|
+
0%, 8% { opacity: 0; transform: scale(0.5); }
|
|
77
|
+
12% { opacity: 1; transform: translate(0, -4px) scale(1.2); }
|
|
78
|
+
20%, 70% { opacity: 1; transform: translate(0, -4px) scale(1); }
|
|
79
|
+
85%, 100% { opacity: 0; transform: translate(0, -6px) scale(0.8); }
|
|
80
|
+
}
|
|
81
|
+
</style>
|
|
82
|
+
</defs>
|
|
83
|
+
|
|
84
|
+
<!-- Entire character leaning -->
|
|
85
|
+
<g transform="rotate(-12, 7.5, 15)">
|
|
86
|
+
|
|
87
|
+
<!-- Legs -->
|
|
88
|
+
<g fill="#DE886D">
|
|
89
|
+
<rect x="3" y="11" width="1" height="4"/>
|
|
90
|
+
<rect x="5" y="11" width="1" height="4"/>
|
|
91
|
+
<rect x="9" y="11" width="1" height="4"/>
|
|
92
|
+
<rect x="11" y="11" width="1" height="4"/>
|
|
93
|
+
</g>
|
|
94
|
+
|
|
95
|
+
<g id="body-js">
|
|
96
|
+
<g class="breathe-anim">
|
|
97
|
+
<!-- Torso -->
|
|
98
|
+
<rect x="2" y="6" width="11" height="7" fill="#DE886D"/>
|
|
99
|
+
|
|
100
|
+
<!-- Left Arm — still then shake -->
|
|
101
|
+
<g class="arm-alert">
|
|
102
|
+
<rect x="-1.5" y="9" width="4.5" height="2" fill="#DE886D"/>
|
|
103
|
+
</g>
|
|
104
|
+
|
|
105
|
+
<!-- Right Arm -->
|
|
106
|
+
<rect x="13" y="9" width="2" height="2" fill="#DE886D"/>
|
|
107
|
+
|
|
108
|
+
<!-- Phase 1: Normal rect eyes (look left at exclamation, then blink away) -->
|
|
109
|
+
<g class="eyes-rect" fill="#000000">
|
|
110
|
+
<rect x="4" y="8" width="1" height="2"/>
|
|
111
|
+
<rect x="10" y="8" width="1" height="2"/>
|
|
112
|
+
</g>
|
|
113
|
+
|
|
114
|
+
<!-- Phase 2: >< squint eyes (appear after blink) -->
|
|
115
|
+
<g class="eyes-xmark" fill="none" stroke="#000000" stroke-width="0.7" stroke-linecap="round" stroke-linejoin="round">
|
|
116
|
+
<polyline points="4,8 5.5,9 4,10"/>
|
|
117
|
+
<polyline points="11,8 9.5,9 11,10"/>
|
|
118
|
+
</g>
|
|
119
|
+
</g>
|
|
120
|
+
</g>
|
|
121
|
+
|
|
122
|
+
</g>
|
|
123
|
+
|
|
124
|
+
<!-- Exclamation mark (outside rotation = stays vertical) -->
|
|
125
|
+
<g class="alert-pop" fill="#FF3D00">
|
|
126
|
+
<rect x="-8" y="5" width="2" height="4"/>
|
|
127
|
+
<rect x="-8" y="10" width="2" height="2"/>
|
|
128
|
+
</g>
|
|
129
|
+
</svg>
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="-15 -25 45 45" width="500" height="500">
|
|
2
|
+
<defs>
|
|
3
|
+
<style>
|
|
4
|
+
.body-hunch {
|
|
5
|
+
transform-origin: 7.5px 15px;
|
|
6
|
+
animation: hunch-walk 2s infinite alternate ease-in-out;
|
|
7
|
+
}
|
|
8
|
+
.leg-1 { animation: sneak-1 0.5s infinite linear; transform-origin: top center; transform-box: fill-box; }
|
|
9
|
+
.leg-2 { animation: sneak-2 0.5s infinite linear; transform-origin: top center; transform-box: fill-box; }
|
|
10
|
+
.shadow-sneak {
|
|
11
|
+
transform-origin: 7.5px 15.5px;
|
|
12
|
+
animation: shadow-shift 2s infinite alternate ease-in-out;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/* Sneaking forward and backward */
|
|
16
|
+
@keyframes hunch-walk {
|
|
17
|
+
0% { transform: translate(-2px, 1px) rotate(2deg); }
|
|
18
|
+
100% { transform: translate(3px, 1px) rotate(2deg); }
|
|
19
|
+
}
|
|
20
|
+
@keyframes shadow-shift {
|
|
21
|
+
0% { transform: translateX(-2px) scale(0.9); opacity: 0.4; }
|
|
22
|
+
100% { transform: translateX(3px) scale(0.9); opacity: 0.4; }
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/* Fast tiptoe / sneak leg movement */
|
|
26
|
+
@keyframes sneak-1 {
|
|
27
|
+
0%, 100% { transform: rotate(0deg) scaleY(1); }
|
|
28
|
+
50% { transform: rotate(-25deg) scaleY(0.7); }
|
|
29
|
+
}
|
|
30
|
+
@keyframes sneak-2 {
|
|
31
|
+
0%, 100% { transform: rotate(-25deg) scaleY(0.7); }
|
|
32
|
+
50% { transform: rotate(0deg) scaleY(1); }
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/* Eyes: look right (toward destination), occasionally glance back and blink */
|
|
36
|
+
.eyes-crabwalk {
|
|
37
|
+
transform-origin: 7.5px 9px;
|
|
38
|
+
animation: crab-eyes 5s infinite ease-in-out;
|
|
39
|
+
}
|
|
40
|
+
@keyframes crab-eyes {
|
|
41
|
+
0%, 55% { transform: translateX(2px) scaleY(1); }
|
|
42
|
+
62% { transform: translateX(0) scaleY(1); }
|
|
43
|
+
66% { transform: translateX(0) scaleY(0.1); }
|
|
44
|
+
70% { transform: translateX(0) scaleY(1); }
|
|
45
|
+
75% { transform: translateX(0) scaleY(0.1); }
|
|
46
|
+
80%, 85% { transform: translateX(0) scaleY(1); }
|
|
47
|
+
92%, 100% { transform: translateX(2px) scaleY(1); }
|
|
48
|
+
}
|
|
49
|
+
</style>
|
|
50
|
+
</defs>
|
|
51
|
+
|
|
52
|
+
<rect id="ground-shadow" class="shadow-sneak" x="3" y="15" width="9" height="1" fill="#000000" opacity="0.5"/>
|
|
53
|
+
|
|
54
|
+
<g class="body-hunch">
|
|
55
|
+
<g id="legs" fill="#DE886D">
|
|
56
|
+
<rect id="outer-left-leg" class="leg-1" x="3" y="13" width="1" height="2"/>
|
|
57
|
+
<rect id="inner-left-leg" class="leg-2" x="5" y="13" width="1" height="2"/>
|
|
58
|
+
<rect id="inner-right-leg" class="leg-1" x="9" y="13" width="1" height="2"/>
|
|
59
|
+
<rect id="outer-right-leg" class="leg-2" x="11" y="13" width="1" height="2"/>
|
|
60
|
+
</g>
|
|
61
|
+
|
|
62
|
+
<g id="body-color-group" fill="#DE886D">
|
|
63
|
+
<rect id="torso" x="2" y="6" width="11" height="7"/>
|
|
64
|
+
<!-- Left arm (normal pose) -->
|
|
65
|
+
<rect id="left-arm" x="0" y="9" width="2" height="2"/>
|
|
66
|
+
<!-- Right arm (normal pose, no magnifying glass) -->
|
|
67
|
+
<rect id="right-arm" x="13" y="9" width="2" height="2"/>
|
|
68
|
+
</g>
|
|
69
|
+
|
|
70
|
+
<!-- Eyes: look right, occasionally glance back + blink -->
|
|
71
|
+
<g class="eyes-crabwalk" fill="#000000">
|
|
72
|
+
<rect x="4" y="8" width="1" height="2"/>
|
|
73
|
+
<rect x="10" y="8" width="1" height="2"/>
|
|
74
|
+
</g>
|
|
75
|
+
</g>
|
|
76
|
+
</svg>
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="500" height="500" viewBox="-15 -25 45 45"
|
|
2
|
+
shape-rendering="crispEdges">
|
|
3
|
+
<style>
|
|
4
|
+
#body-js {
|
|
5
|
+
animation: bodyEnter 3.2s cubic-bezier(0.22, 1, 0.36, 1) 1 forwards;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
#left-arm {
|
|
9
|
+
transform-origin: 2px 9px;
|
|
10
|
+
animation: armEnterSleep 3.2s ease-in-out 1 forwards;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/* Eyes stay closed — wide dashes like sleeping pose */
|
|
14
|
+
|
|
15
|
+
@keyframes bodyEnter {
|
|
16
|
+
0% {
|
|
17
|
+
transform: translate(25px, 0px);
|
|
18
|
+
}
|
|
19
|
+
18% {
|
|
20
|
+
transform: translate(-3px, -0.8px);
|
|
21
|
+
}
|
|
22
|
+
24% {
|
|
23
|
+
transform: translate(1.4px, 0.4px);
|
|
24
|
+
}
|
|
25
|
+
30%,
|
|
26
|
+
100% {
|
|
27
|
+
transform: translate(0px, 0px);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/* Arm extends out gently, no waving */
|
|
32
|
+
@keyframes armEnterSleep {
|
|
33
|
+
0%,
|
|
34
|
+
30% {
|
|
35
|
+
transform: scaleX(0.05) rotate(0deg);
|
|
36
|
+
}
|
|
37
|
+
50% {
|
|
38
|
+
transform: scaleX(1) rotate(0deg);
|
|
39
|
+
}
|
|
40
|
+
100% {
|
|
41
|
+
transform: scaleX(1) rotate(0deg);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
</style>
|
|
45
|
+
<g id="body-js">
|
|
46
|
+
<g transform="rotate(-12, 7.5, 15)">
|
|
47
|
+
<rect id="left-arm" x="-1.5" y="9" width="4.5" height="2" fill="#DE886D"/>
|
|
48
|
+
|
|
49
|
+
<rect x="2" y="6" width="11" height="7" fill="#DE886D"/>
|
|
50
|
+
<rect x="13" y="9" width="2" height="2" fill="#DE886D"/>
|
|
51
|
+
|
|
52
|
+
<g id="eyes-js" fill="#000000">
|
|
53
|
+
<rect x="3.5" y="8.8" width="2" height="0.4"/>
|
|
54
|
+
<rect x="9.5" y="8.8" width="2" height="0.4"/>
|
|
55
|
+
</g>
|
|
56
|
+
|
|
57
|
+
<g fill="#DE886D">
|
|
58
|
+
<rect x="3" y="11" width="1" height="4"/>
|
|
59
|
+
<rect x="5" y="11" width="1" height="4"/>
|
|
60
|
+
<rect x="9" y="11" width="1" height="4"/>
|
|
61
|
+
<rect x="11" y="11" width="1" height="4"/>
|
|
62
|
+
</g>
|
|
63
|
+
</g>
|
|
64
|
+
</g>
|
|
65
|
+
</svg>
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="500" height="500" viewBox="-15 -25 45 45"
|
|
2
|
+
shape-rendering="crispEdges">
|
|
3
|
+
<style>
|
|
4
|
+
#body-js {
|
|
5
|
+
animation: bodyEnter 3.2s cubic-bezier(0.22, 1, 0.36, 1) 1 forwards;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
#left-arm {
|
|
9
|
+
transform-origin: 2px 9px;
|
|
10
|
+
animation: armEnterWave 3.2s ease-in-out 1 forwards;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
#eyes-js {
|
|
14
|
+
transform-origin: 7.5px 9px;
|
|
15
|
+
animation: eyesEnter 3.2s ease-in-out 1 forwards;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
@keyframes bodyEnter {
|
|
19
|
+
0% {
|
|
20
|
+
transform: translate(25px, 0px);
|
|
21
|
+
}
|
|
22
|
+
18% {
|
|
23
|
+
transform: translate(-3px, -0.8px);
|
|
24
|
+
}
|
|
25
|
+
24% {
|
|
26
|
+
transform: translate(1.4px, 0.4px);
|
|
27
|
+
}
|
|
28
|
+
30% {
|
|
29
|
+
transform: translate(0px, 0px);
|
|
30
|
+
}
|
|
31
|
+
65% {
|
|
32
|
+
transform: translate(0px, 0px);
|
|
33
|
+
}
|
|
34
|
+
76% {
|
|
35
|
+
transform: translate(0.5px, 0.2px);
|
|
36
|
+
}
|
|
37
|
+
88%,
|
|
38
|
+
100% {
|
|
39
|
+
transform: translate(0px, 0px);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
@keyframes armEnterWave {
|
|
44
|
+
0%,
|
|
45
|
+
30% {
|
|
46
|
+
transform: scaleX(0.05) rotate(0deg);
|
|
47
|
+
}
|
|
48
|
+
38% {
|
|
49
|
+
transform: scaleX(1.18) rotate(-8deg);
|
|
50
|
+
}
|
|
51
|
+
43% {
|
|
52
|
+
transform: scaleX(0.96) rotate(6deg);
|
|
53
|
+
}
|
|
54
|
+
48% {
|
|
55
|
+
transform: scaleX(1) rotate(-14deg);
|
|
56
|
+
}
|
|
57
|
+
53% {
|
|
58
|
+
transform: scaleX(1) rotate(16deg);
|
|
59
|
+
}
|
|
60
|
+
58% {
|
|
61
|
+
transform: scaleX(1) rotate(-12deg);
|
|
62
|
+
}
|
|
63
|
+
63% {
|
|
64
|
+
transform: scaleX(1) rotate(9deg);
|
|
65
|
+
}
|
|
66
|
+
70%,
|
|
67
|
+
100% {
|
|
68
|
+
transform: scaleX(1) rotate(0deg);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
@keyframes eyesEnter {
|
|
73
|
+
0%,
|
|
74
|
+
65% {
|
|
75
|
+
transform: translateX(-1px) scaleY(1);
|
|
76
|
+
}
|
|
77
|
+
74% {
|
|
78
|
+
transform: translateX(-0.6px) scaleY(1);
|
|
79
|
+
}
|
|
80
|
+
80% {
|
|
81
|
+
transform: translateX(-0.1px) scaleY(1);
|
|
82
|
+
}
|
|
83
|
+
84% {
|
|
84
|
+
transform: translateX(0px) scaleY(0.1);
|
|
85
|
+
}
|
|
86
|
+
88% {
|
|
87
|
+
transform: translateX(0px) scaleY(1.08);
|
|
88
|
+
}
|
|
89
|
+
92%,
|
|
90
|
+
100% {
|
|
91
|
+
transform: translateX(0px) scaleY(1);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
</style>
|
|
95
|
+
<g id="body-js">
|
|
96
|
+
<g transform="rotate(-12, 7.5, 15)">
|
|
97
|
+
<rect id="left-arm" x="-1.5" y="9" width="4.5" height="2" fill="#DE886D"/>
|
|
98
|
+
|
|
99
|
+
<rect x="2" y="6" width="11" height="7" fill="#DE886D"/>
|
|
100
|
+
<rect x="13" y="9" width="2" height="2" fill="#DE886D"/>
|
|
101
|
+
|
|
102
|
+
<g id="eyes-js" fill="#000000">
|
|
103
|
+
<rect x="4" y="8" width="1" height="2"/>
|
|
104
|
+
<rect x="10" y="8" width="1" height="2"/>
|
|
105
|
+
</g>
|
|
106
|
+
|
|
107
|
+
<g fill="#DE886D">
|
|
108
|
+
<rect x="3" y="11" width="1" height="4"/>
|
|
109
|
+
<rect x="5" y="11" width="1" height="4"/>
|
|
110
|
+
<rect x="9" y="11" width="1" height="4"/>
|
|
111
|
+
<rect x="11" y="11" width="1" height="4"/>
|
|
112
|
+
</g>
|
|
113
|
+
</g>
|
|
114
|
+
</g>
|
|
115
|
+
</svg>
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="-15 -25 45 45" width="500" height="500">
|
|
2
|
+
<defs>
|
|
3
|
+
<style>
|
|
4
|
+
.breathe-anim {
|
|
5
|
+
transform-origin: 7.5px 13px;
|
|
6
|
+
animation: breathe 3.2s infinite ease-in-out;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
/* Happy arm wave — continuous, fast, fixed pivot at shoulder */
|
|
10
|
+
.arm-happy {
|
|
11
|
+
transform-origin: 2px 9px; /* Shoulder joint in SVG coords, no fill-box */
|
|
12
|
+
animation: arm-happy-wave 0.4s infinite alternate ease-in-out;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/* Eyes ^^ blink — mostly ^^ with occasional full blink */
|
|
16
|
+
.eyes-happy-blink {
|
|
17
|
+
transform-origin: 7.5px 9px;
|
|
18
|
+
animation: happy-blink 3s infinite ease-in-out;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/* Pixel-Art Sparkle Animations */
|
|
22
|
+
.spark-center {
|
|
23
|
+
opacity: 0;
|
|
24
|
+
animation: flash-center 1.5s infinite step-end;
|
|
25
|
+
animation-delay: var(--delay, 0s);
|
|
26
|
+
}
|
|
27
|
+
.spark-outer {
|
|
28
|
+
opacity: 0;
|
|
29
|
+
animation: flash-outer 1.5s infinite step-end;
|
|
30
|
+
animation-delay: var(--delay, 0s);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
@keyframes breathe {
|
|
34
|
+
0%, 100% { transform: scale(1, 1) translate(0, 0); }
|
|
35
|
+
50% { transform: scale(1.02, 0.98) translate(0, 0.5px); }
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/* Continuous happy waving */
|
|
39
|
+
@keyframes arm-happy-wave {
|
|
40
|
+
0% { transform: rotate(22deg); }
|
|
41
|
+
100% { transform: rotate(-8deg); }
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/* Happy blink: frequent blinks to look excited */
|
|
45
|
+
@keyframes happy-blink {
|
|
46
|
+
0%, 12%, 30%, 42%, 100% { transform: scaleY(1); }
|
|
47
|
+
6% { transform: scaleY(0.1); }
|
|
48
|
+
36% { transform: scaleY(0.1); }
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
@keyframes flash-center {
|
|
52
|
+
0% { opacity: 0; }
|
|
53
|
+
10% { opacity: 1; }
|
|
54
|
+
30% { opacity: 0; }
|
|
55
|
+
100%{ opacity: 0; }
|
|
56
|
+
}
|
|
57
|
+
@keyframes flash-outer {
|
|
58
|
+
0% { opacity: 0; }
|
|
59
|
+
20% { opacity: 1; }
|
|
60
|
+
40% { opacity: 0; }
|
|
61
|
+
100%{ opacity: 0; }
|
|
62
|
+
}
|
|
63
|
+
</style>
|
|
64
|
+
|
|
65
|
+
<!-- Reusable Pixel Art Sparkle (from clawd-happy.svg) -->
|
|
66
|
+
<g id="px-sparkle">
|
|
67
|
+
<rect class="spark-center" x="-0.5" y="-0.5" width="1" height="1" />
|
|
68
|
+
<path class="spark-outer" d="M -0.5,-1.5 h1 v1 h-1 z
|
|
69
|
+
M -0.5,0.5 h1 v1 h-1 z
|
|
70
|
+
M -1.5,-0.5 h1 v1 h-1 z
|
|
71
|
+
M 0.5,-0.5 h1 v1 h-1 z" />
|
|
72
|
+
</g>
|
|
73
|
+
</defs>
|
|
74
|
+
|
|
75
|
+
<!-- Entire character leaning -->
|
|
76
|
+
<g transform="rotate(-12, 7.5, 15)">
|
|
77
|
+
|
|
78
|
+
<!-- Legs -->
|
|
79
|
+
<g fill="#DE886D">
|
|
80
|
+
<rect x="3" y="11" width="1" height="4"/>
|
|
81
|
+
<rect x="5" y="11" width="1" height="4"/>
|
|
82
|
+
<rect x="9" y="11" width="1" height="4"/>
|
|
83
|
+
<rect x="11" y="11" width="1" height="4"/>
|
|
84
|
+
</g>
|
|
85
|
+
|
|
86
|
+
<g id="body-js">
|
|
87
|
+
<g class="breathe-anim">
|
|
88
|
+
<!-- Torso -->
|
|
89
|
+
<rect x="2" y="6" width="11" height="7" fill="#DE886D"/>
|
|
90
|
+
|
|
91
|
+
<!-- Left Arm — happy continuous wave + flower on top -->
|
|
92
|
+
<g class="arm-happy">
|
|
93
|
+
<rect x="-1.5" y="9" width="4.5" height="2" fill="#DE886D"/>
|
|
94
|
+
<!-- Flower held at hand tip -->
|
|
95
|
+
<!-- Stem (black, from hand top to flower) -->
|
|
96
|
+
<rect x="-1.5" y="6" width="0.5" height="3" fill="#000000"/>
|
|
97
|
+
<!-- Petals (yellow pixel cross) -->
|
|
98
|
+
<rect x="-2.5" y="5" width="0.8" height="0.8" fill="#FFD700"/>
|
|
99
|
+
<rect x="-0.5" y="5" width="0.8" height="0.8" fill="#FFD700"/>
|
|
100
|
+
<rect x="-1.5" y="4.2" width="0.8" height="0.8" fill="#FFD700"/>
|
|
101
|
+
<rect x="-1.5" y="5.8" width="0.8" height="0.8" fill="#FFD700"/>
|
|
102
|
+
<!-- Center -->
|
|
103
|
+
<rect x="-1.5" y="5" width="0.8" height="0.8" fill="#FFA000"/>
|
|
104
|
+
</g>
|
|
105
|
+
|
|
106
|
+
<!-- Right Arm -->
|
|
107
|
+
<rect x="13" y="9" width="2" height="2" fill="#DE886D"/>
|
|
108
|
+
|
|
109
|
+
<!-- Eyes: ^^ happy squint with blink -->
|
|
110
|
+
<g class="eyes-happy-blink">
|
|
111
|
+
<g fill="none" stroke="#000000" stroke-width="0.7" stroke-linecap="round" stroke-linejoin="round">
|
|
112
|
+
<polyline points="3.5,9 4.5,8 5.5,9"/>
|
|
113
|
+
<polyline points="9.5,9 10.5,8 11.5,9"/>
|
|
114
|
+
</g>
|
|
115
|
+
</g>
|
|
116
|
+
</g>
|
|
117
|
+
</g>
|
|
118
|
+
</g>
|
|
119
|
+
|
|
120
|
+
<!-- Sparkles (outside rotation = stay upright, within window bounds) -->
|
|
121
|
+
<use href="#px-sparkle" x="-3" y="0" fill="#FFD700" style="--delay: 0s"/>
|
|
122
|
+
<use href="#px-sparkle" x="-6" y="6" fill="#FFA000" style="--delay: 0.4s"/>
|
|
123
|
+
<use href="#px-sparkle" x="0" y="-5" fill="#FFF59D" style="--delay: 0.8s"/>
|
|
124
|
+
</svg>
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="-15 -25 45 45" width="500" height="500">
|
|
2
|
+
<defs>
|
|
3
|
+
<style>
|
|
4
|
+
.breathe-anim {
|
|
5
|
+
transform-origin: 7.5px 13px;
|
|
6
|
+
animation: breathe 3.2s infinite ease-in-out;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
.eyes-blink {
|
|
10
|
+
transform-origin: 7.5px 9px;
|
|
11
|
+
animation: eye-blink 4s infinite ease-in-out;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
#eyes-js {
|
|
15
|
+
transition: transform 0.2s ease-out;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/* Visible arm (left, facing screen) — occasional wobble */
|
|
19
|
+
.arm-wobble {
|
|
20
|
+
transform-box: fill-box;
|
|
21
|
+
transform-origin: 100% 0%; /* Shoulder joint: body-side top */
|
|
22
|
+
animation: arm-wobble 25s infinite ease-in-out;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
@keyframes breathe {
|
|
26
|
+
0%, 100% { transform: scale(1, 1) translate(0, 0); }
|
|
27
|
+
50% { transform: scale(1.02, 0.98) translate(0, 0.5px); }
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
@keyframes eye-blink {
|
|
31
|
+
0%, 10%, 100% { transform: scaleY(1); }
|
|
32
|
+
5% { transform: scaleY(0.1); }
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/* Arm wobble: 25s cycle, still ~23s, quick wave in ~1.5s near the end */
|
|
36
|
+
@keyframes arm-wobble {
|
|
37
|
+
0%, 91%, 97%, 100% { transform: rotate(0deg); }
|
|
38
|
+
92% { transform: rotate(18deg); }
|
|
39
|
+
93.5% { transform: rotate(-5deg); }
|
|
40
|
+
95% { transform: rotate(14deg); }
|
|
41
|
+
}
|
|
42
|
+
</style>
|
|
43
|
+
</defs>
|
|
44
|
+
|
|
45
|
+
<!-- No shadow (against screen edge, no ground plane) -->
|
|
46
|
+
|
|
47
|
+
<!-- Entire character leaning: rotate -12° around feet base (7.5, 15) -->
|
|
48
|
+
<!-- Negative = counterclockwise = head tilts left toward screen = peeking pose -->
|
|
49
|
+
<g transform="rotate(-12, 7.5, 15)">
|
|
50
|
+
|
|
51
|
+
<!-- Legs (inside rotation group so they tilt with the body) -->
|
|
52
|
+
<g fill="#DE886D">
|
|
53
|
+
<rect x="3" y="11" width="1" height="4"/>
|
|
54
|
+
<rect x="5" y="11" width="1" height="4"/>
|
|
55
|
+
<rect x="9" y="11" width="1" height="4"/>
|
|
56
|
+
<rect x="11" y="11" width="1" height="4"/>
|
|
57
|
+
</g>
|
|
58
|
+
|
|
59
|
+
<!-- Upper Body (JS body-shift preserved for compatibility) -->
|
|
60
|
+
<g id="body-js">
|
|
61
|
+
<g class="breathe-anim">
|
|
62
|
+
<!-- Torso -->
|
|
63
|
+
<rect x="2" y="6" width="11" height="7" fill="#DE886D"/>
|
|
64
|
+
|
|
65
|
+
<!-- Left Arm (visible side, facing screen) — extended + wobble -->
|
|
66
|
+
<g class="arm-wobble">
|
|
67
|
+
<rect x="-1.5" y="9" width="4.5" height="2" fill="#DE886D"/>
|
|
68
|
+
</g>
|
|
69
|
+
|
|
70
|
+
<!-- Right Arm (near edge, partially hidden) — normal -->
|
|
71
|
+
<rect x="13" y="9" width="2" height="2" fill="#DE886D"/>
|
|
72
|
+
|
|
73
|
+
<!-- Eyes: JS translate wrapper + CSS blink -->
|
|
74
|
+
<g id="eyes-js" fill="#000000">
|
|
75
|
+
<g class="eyes-blink">
|
|
76
|
+
<rect x="4" y="8" width="1" height="2"/>
|
|
77
|
+
<rect x="10" y="8" width="1" height="2"/>
|
|
78
|
+
</g>
|
|
79
|
+
</g>
|
|
80
|
+
</g>
|
|
81
|
+
</g>
|
|
82
|
+
</g>
|
|
83
|
+
</svg>
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="-15 -25 45 45" width="500" height="500">
|
|
2
|
+
<defs>
|
|
3
|
+
<style>
|
|
4
|
+
.breathe-anim {
|
|
5
|
+
transform-origin: 7.5px 13px;
|
|
6
|
+
animation: breathe 3.2s infinite ease-in-out;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
.eyes-blink {
|
|
10
|
+
transform-origin: 7.5px 9px;
|
|
11
|
+
animation: eye-blink 4s infinite ease-in-out;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
#eyes-js {
|
|
15
|
+
transition: transform 0.2s ease-out;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/* Arm waving — fast 3 waves then pause, loop */
|
|
19
|
+
.arm-wave {
|
|
20
|
+
transform-origin: 2px 9px;
|
|
21
|
+
animation: peek-wave 3s infinite ease-in-out;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
@keyframes breathe {
|
|
25
|
+
0%, 100% { transform: scale(1, 1) translate(0, 0); }
|
|
26
|
+
50% { transform: scale(1.02, 0.98) translate(0, 0.5px); }
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
@keyframes eye-blink {
|
|
30
|
+
0%, 10%, 100% { transform: scaleY(1); }
|
|
31
|
+
5% { transform: scaleY(0.1); }
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/* Fast 3 waves (~0.9s) then still (~2.1s), loop */
|
|
35
|
+
@keyframes peek-wave {
|
|
36
|
+
0% { transform: rotate(0deg); }
|
|
37
|
+
5% { transform: rotate(35deg); }
|
|
38
|
+
10% { transform: rotate(-15deg); }
|
|
39
|
+
15% { transform: rotate(35deg); }
|
|
40
|
+
20% { transform: rotate(-15deg); }
|
|
41
|
+
25% { transform: rotate(35deg); }
|
|
42
|
+
30%, 100% { transform: rotate(0deg); }
|
|
43
|
+
}
|
|
44
|
+
</style>
|
|
45
|
+
</defs>
|
|
46
|
+
|
|
47
|
+
<!-- Entire character leaning -->
|
|
48
|
+
<g transform="rotate(-12, 7.5, 15)">
|
|
49
|
+
|
|
50
|
+
<!-- Legs -->
|
|
51
|
+
<g fill="#DE886D">
|
|
52
|
+
<rect x="3" y="11" width="1" height="4"/>
|
|
53
|
+
<rect x="5" y="11" width="1" height="4"/>
|
|
54
|
+
<rect x="9" y="11" width="1" height="4"/>
|
|
55
|
+
<rect x="11" y="11" width="1" height="4"/>
|
|
56
|
+
</g>
|
|
57
|
+
|
|
58
|
+
<!-- Upper Body -->
|
|
59
|
+
<g id="body-js">
|
|
60
|
+
<g class="breathe-anim">
|
|
61
|
+
<!-- Torso -->
|
|
62
|
+
<rect x="2" y="6" width="11" height="7" fill="#DE886D"/>
|
|
63
|
+
|
|
64
|
+
<!-- Left Arm — continuous big wave -->
|
|
65
|
+
<g class="arm-wave">
|
|
66
|
+
<rect x="-1.5" y="9" width="5.5" height="2" fill="#DE886D"/>
|
|
67
|
+
</g>
|
|
68
|
+
|
|
69
|
+
<!-- Right Arm -->
|
|
70
|
+
<rect x="13" y="9" width="2" height="2" fill="#DE886D"/>
|
|
71
|
+
|
|
72
|
+
<!-- Eyes: JS translate wrapper + CSS blink -->
|
|
73
|
+
<g id="eyes-js" fill="#000000">
|
|
74
|
+
<g class="eyes-blink">
|
|
75
|
+
<rect x="4" y="8" width="1" height="2"/>
|
|
76
|
+
<rect x="10" y="8" width="1" height="2"/>
|
|
77
|
+
</g>
|
|
78
|
+
</g>
|
|
79
|
+
</g>
|
|
80
|
+
</g>
|
|
81
|
+
</g>
|
|
82
|
+
</svg>
|