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,196 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="-15 -25 45 45" width="500" height="500">
2
+ <defs>
3
+ <style>
4
+ /* 16-Second Master Sequence for Idle Actions */
5
+ .action-body {
6
+ transform-origin: 7.5px 13px; /* Pivot at the base of the torso */
7
+ animation: action-body 16s infinite ease-in-out;
8
+ }
9
+
10
+ /* Continuous Subtle Breathing (Syncs exactly 5 times per 16s loop) */
11
+ .breathe-anim {
12
+ transform-origin: 7.5px 13px;
13
+ animation: breathe 3.2s infinite ease-in-out;
14
+ }
15
+
16
+ /* Shadow shrinking and shifting matching actions */
17
+ .shadow-anim {
18
+ transform-origin: 7.5px 15.5px;
19
+ animation: shadow-action 16s infinite ease-in-out;
20
+ }
21
+
22
+ /* Left Arm (Scratching and Yawn Stretching) */
23
+ .arm-l {
24
+ transform-origin: 1px 10px;
25
+ animation: arm-l-idle 16s infinite ease-in-out;
26
+ }
27
+
28
+ /* Right Arm (Yawn Stretching) */
29
+ .arm-r {
30
+ transform-origin: 14px 10px;
31
+ animation: arm-r-idle 16s infinite ease-in-out;
32
+ }
33
+
34
+ /* Eye Tracking (Looking around) */
35
+ .eyes-look {
36
+ animation: eye-track 16s infinite ease-in-out;
37
+ }
38
+
39
+ /* Occasional Blinks and shutting during Yawn */
40
+ .eyes-blink {
41
+ transform-origin: 7.5px 9px;
42
+ animation: eye-blink 16s infinite linear;
43
+ }
44
+
45
+ /* Yawn Mouth Appearance */
46
+ .yawn-mouth {
47
+ transform-origin: 7.5px 11px;
48
+ animation: yawn-mouth-anim 16s infinite ease-in-out;
49
+ opacity: 0;
50
+ }
51
+
52
+ /* Tiny tear that appears during the big yawn */
53
+ .yawn-tear {
54
+ animation: tear-fall 16s infinite ease-in-out;
55
+ opacity: 0;
56
+ }
57
+
58
+ /* --- Keyframes --- */
59
+
60
+ @keyframes breathe {
61
+ 0%, 100% { transform: scale(1, 1) translate(0, 0); }
62
+ 50% { transform: scale(1.02, 0.98) translate(0, 0.5px); }
63
+ }
64
+
65
+ @keyframes action-body {
66
+ 0%, 8%, 26%, 38%, 55%, 80%, 100% { transform: scale(1, 1) translate(0, 0); }
67
+ /* Look Right Tilt */
68
+ 12%, 22% { transform: scale(1, 1) translate(1px, 0); }
69
+ /* Look Left Tilt */
70
+ 42%, 50% { transform: scale(1, 1) translate(-1px, 0); }
71
+ /* Scratching Lean */
72
+ 30%, 36% { transform: scale(1, 1) translate(0.5px, 0); }
73
+ /* Deep Yawn Stretch */
74
+ 60% { transform: scale(0.95, 1.05) translate(0px, -1px); } /* Stretch up */
75
+ 65% { transform: scale(0.9, 1.1) translate(0px, -2px); } /* Peak stretch */
76
+ 72% { transform: scale(1.05, 0.95) translate(0px, 1px); } /* Heavy sigh / squash down */
77
+ 76% { transform: scale(1, 1) translate(0px, 0px); } /* Recover */
78
+ }
79
+
80
+ @keyframes shadow-action {
81
+ 0%, 8%, 26%, 38%, 55%, 80%, 100% { transform: scaleX(1) translate(0, 0); opacity: 0.5; }
82
+ 12%, 22% { transform: scaleX(1) translate(1px, 0); opacity: 0.5; }
83
+ 42%, 50% { transform: scaleX(1) translate(-1px, 0); opacity: 0.5; }
84
+ 30%, 36% { transform: scaleX(1) translate(0.5px, 0); opacity: 0.5; }
85
+ 60% { transform: scaleX(0.95) translate(0, 0); opacity: 0.45; }
86
+ 65% { transform: scaleX(0.9) translate(0, 0); opacity: 0.4; }
87
+ 72% { transform: scaleX(1.05) translate(0, 0); opacity: 0.55; }
88
+ 76% { transform: scaleX(1) translate(0, 0); opacity: 0.5; }
89
+ }
90
+
91
+ @keyframes eye-track {
92
+ 0%, 10%, 25%, 38%, 52%, 58%, 80%, 100% { transform: translate(0px, 0px); }
93
+ 12%, 22% { transform: translate(3px, 0px); } /* Look Right */
94
+ 42%, 50% { transform: translate(-3px, 0px); } /* Look Left */
95
+ 60%, 75% { transform: translate(0px, -1px); } /* Look slightly up during yawn */
96
+ }
97
+
98
+ @keyframes eye-blink {
99
+ 0%, 3%, 7%, 18%, 22%, 43%, 47%, 56%, 83%, 87%, 100% { transform: scaleY(1); }
100
+ 5%, 20%, 45%, 85% { transform: scaleY(0.1); } /* Quick Blinks */
101
+ /* Yawn Closed Eyes */
102
+ 60% { transform: scaleY(1); }
103
+ 62%, 72% { transform: scaleY(0.1); } /* Eyes completely shut */
104
+ 75% { transform: scaleY(1); }
105
+ }
106
+
107
+ @keyframes arm-l-idle {
108
+ 0%, 28% { transform: translate(0, 0) rotate(0deg); }
109
+
110
+ /* Occasional Scratching Sequence (Left Arm) */
111
+ 30% { transform: translate(1px, -3px) rotate(15deg); }
112
+ 31% { transform: translate(1.5px, -4px) rotate(35deg); } /* Up */
113
+ 32% { transform: translate(0.5px, -2.5px) rotate(0deg); } /* Down */
114
+ 33% { transform: translate(1.5px, -4px) rotate(35deg); }
115
+ 34% { transform: translate(0.5px, -2.5px) rotate(0deg); }
116
+ 35% { transform: translate(1.5px, -4px) rotate(35deg); }
117
+ 36% { transform: translate(0.5px, -2.5px) rotate(0deg); }
118
+
119
+ 38%, 58% { transform: translate(0, 0) rotate(0deg); }
120
+
121
+ /* Yawn Stretch */
122
+ 62% { transform: translate(-1px, -2px) rotate(45deg); }
123
+ 65% { transform: translate(-2px, -3px) rotate(80deg); } /* Full outward stretch */
124
+ 72% { transform: translate(0px, 1px) rotate(-15deg); } /* Relax down */
125
+ 76%, 100% { transform: translate(0, 0) rotate(0deg); }
126
+ }
127
+
128
+ @keyframes arm-r-idle {
129
+ 0%, 58% { transform: translate(0, 0) rotate(0deg); }
130
+ /* Yawn Stretch */
131
+ 62% { transform: translate(1px, -2px) rotate(-45deg); }
132
+ 65% { transform: translate(2px, -3px) rotate(-80deg); } /* Full outward stretch */
133
+ 72% { transform: translate(0px, 1px) rotate(15deg); } /* Relax down */
134
+ 76%, 100% { transform: translate(0, 0) rotate(0deg); }
135
+ }
136
+
137
+ @keyframes yawn-mouth-anim {
138
+ 0%, 58%, 76%, 100% { opacity: 0; transform: scale(0.1); }
139
+ 60% { opacity: 1; transform: scale(0.5, 0.2); }
140
+ 65% { opacity: 1; transform: scale(1.1, 1.4); } /* Wide Open */
141
+ 72% { opacity: 1; transform: scale(0.6, 0.4); } /* Shrinking */
142
+ 75% { opacity: 0; transform: scale(0.1); }
143
+ }
144
+
145
+ @keyframes tear-fall {
146
+ 0%, 64%, 80%, 100% { opacity: 0; transform: translateY(0); }
147
+ 66% { opacity: 1; transform: translateY(0); } /* Appears at corner of eye */
148
+ 72% { opacity: 1; transform: translateY(2.5px); } /* Slides down cheek */
149
+ 75% { opacity: 0; transform: translateY(3px); } /* Fades out */
150
+ }
151
+ </style>
152
+ </defs>
153
+
154
+ <!-- Ground Shadow -->
155
+ <rect id="ground-shadow" class="shadow-anim" x="3" y="15" width="9" height="1" fill="#000000" opacity="0.5"/>
156
+
157
+ <!-- Static Character Legs (extended up to stay connected during yawn stretch) -->
158
+ <g id="legs" fill="#DE886D">
159
+ <rect id="outer-left-leg" x="3" y="12" width="1" height="3"/>
160
+ <rect id="inner-left-leg" x="5" y="12" width="1" height="3"/>
161
+ <rect id="inner-right-leg" x="9" y="12" width="1" height="3"/>
162
+ <rect id="outer-right-leg" x="11" y="12" width="1" height="3"/>
163
+ </g>
164
+
165
+ <!-- Animated Upper Body (Combines occasional actions + continuous breathing) -->
166
+ <g class="action-body">
167
+ <g class="breathe-anim">
168
+
169
+ <!-- Torso -->
170
+ <rect id="torso" x="2" y="6" width="11" height="7" fill="#DE886D"/>
171
+
172
+ <!-- Arms -->
173
+ <g class="arm-l">
174
+ <rect id="left-arm" x="0" y="9" width="2" height="2" fill="#DE886D"/>
175
+ </g>
176
+ <g class="arm-r">
177
+ <rect id="right-arm" x="13" y="9" width="2" height="2" fill="#DE886D"/>
178
+ </g>
179
+
180
+ <!-- Yawning Mouth (Hidden usually) -->
181
+ <rect class="yawn-mouth" x="6" y="10" width="3" height="2" fill="#000000"/>
182
+
183
+ <!-- Eyes Group -->
184
+ <g class="eyes-look" fill="#000000">
185
+ <g class="eyes-blink">
186
+ <rect id="left-eye" x="4" y="8" width="1" height="2"/>
187
+ <rect id="right-eye" x="10" y="8" width="1" height="2"/>
188
+ </g>
189
+ </g>
190
+
191
+ <!-- Yawn Tear Drop (A tiny detail for the big stretch) -->
192
+ <rect class="yawn-tear" x="3.5" y="10" width="1" height="1" fill="#40C4FF"/>
193
+
194
+ </g>
195
+ </g>
196
+ </svg>
@@ -0,0 +1,115 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="-15 -25 45 45" width="500" height="500">
2
+ <defs>
3
+ <style>
4
+ /* 10-Second Idle Loop — Looking Around + Scratching (no yawn) */
5
+ .action-body {
6
+ transform-origin: 7.5px 13px;
7
+ animation: action-body 10s infinite ease-in-out;
8
+ }
9
+
10
+ .breathe-anim {
11
+ transform-origin: 7.5px 13px;
12
+ animation: breathe 3.2s infinite ease-in-out;
13
+ }
14
+
15
+ .shadow-anim {
16
+ transform-origin: 7.5px 15.5px;
17
+ animation: shadow-action 10s infinite ease-in-out;
18
+ }
19
+
20
+ .arm-l {
21
+ transform-origin: 1px 10px;
22
+ animation: arm-l-idle 10s infinite ease-in-out;
23
+ }
24
+
25
+ .eyes-look {
26
+ animation: eye-track 10s infinite ease-in-out;
27
+ }
28
+
29
+ .eyes-blink {
30
+ transform-origin: 7.5px 9px;
31
+ animation: eye-blink 10s infinite linear;
32
+ }
33
+
34
+ /* --- Keyframes --- */
35
+
36
+ @keyframes breathe {
37
+ 0%, 100% { transform: scale(1, 1) translate(0, 0); }
38
+ 50% { transform: scale(1.02, 0.98) translate(0, 0.5px); }
39
+ }
40
+
41
+ @keyframes action-body {
42
+ 0%, 8%, 25%, 30%, 40%, 45%, 60%, 100% { transform: scale(1,1) translate(0,0); }
43
+ /* Look Right */
44
+ 12%, 22% { transform: scale(1,1) translate(1px, 0); }
45
+ /* Look Left */
46
+ 48%, 57% { transform: scale(1,1) translate(-1px, 0); }
47
+ /* Scratch Lean */
48
+ 33%, 38% { transform: scale(1,1) translate(0.5px, 0); }
49
+ }
50
+
51
+ @keyframes shadow-action {
52
+ 0%, 8%, 25%, 30%, 40%, 45%, 60%, 100% { transform: scaleX(1) translate(0,0); opacity: 0.5; }
53
+ 12%, 22% { transform: scaleX(1) translate(1px, 0); opacity: 0.5; }
54
+ 48%, 57% { transform: scaleX(1) translate(-1px, 0); opacity: 0.5; }
55
+ 33%, 38% { transform: scaleX(1) translate(0.5px, 0); opacity: 0.5; }
56
+ }
57
+
58
+ @keyframes eye-track {
59
+ 0%, 10%, 25%, 43%, 60%, 100% { transform: translate(0, 0); }
60
+ 12%, 22% { transform: translate(3px, 0); } /* Look Right */
61
+ 48%, 57% { transform: translate(-3px, 0); } /* Look Left */
62
+ }
63
+
64
+ @keyframes eye-blink {
65
+ 0%, 3%, 7%, 18%, 22%, 47%, 51%, 78%, 82%, 100% { transform: scaleY(1); }
66
+ 5%, 20%, 49%, 80% { transform: scaleY(0.1); }
67
+ }
68
+
69
+ @keyframes arm-l-idle {
70
+ 0%, 30% { transform: translate(0,0) rotate(0deg); }
71
+ /* Scratching Sequence */
72
+ 33% { transform: translate(1px, -3px) rotate(15deg); }
73
+ 34% { transform: translate(1.5px, -4px) rotate(35deg); }
74
+ 35% { transform: translate(0.5px, -2.5px) rotate(0deg); }
75
+ 36% { transform: translate(1.5px, -4px) rotate(35deg); }
76
+ 37% { transform: translate(0.5px, -2.5px) rotate(0deg); }
77
+ 38% { transform: translate(1.5px, -4px) rotate(35deg); }
78
+ 39% { transform: translate(0.5px, -2.5px) rotate(0deg); }
79
+ 42%, 100% { transform: translate(0,0) rotate(0deg); }
80
+ }
81
+ </style>
82
+ </defs>
83
+
84
+ <!-- Ground Shadow -->
85
+ <rect id="ground-shadow" class="shadow-anim" x="3" y="15" width="9" height="1" fill="#000000" opacity="0.5"/>
86
+
87
+ <!-- Static Legs -->
88
+ <g id="legs" fill="#DE886D">
89
+ <rect x="3" y="12" width="1" height="3"/>
90
+ <rect x="5" y="12" width="1" height="3"/>
91
+ <rect x="9" y="12" width="1" height="3"/>
92
+ <rect x="11" y="12" width="1" height="3"/>
93
+ </g>
94
+
95
+ <!-- Animated Upper Body -->
96
+ <g class="action-body">
97
+ <g class="breathe-anim">
98
+ <!-- Torso -->
99
+ <rect id="torso" x="2" y="6" width="11" height="7" fill="#DE886D"/>
100
+ <!-- Left Arm (scratches) -->
101
+ <g class="arm-l">
102
+ <rect x="0" y="9" width="2" height="2" fill="#DE886D"/>
103
+ </g>
104
+ <!-- Right Arm (static) -->
105
+ <rect x="13" y="9" width="2" height="2" fill="#DE886D"/>
106
+ <!-- Eyes -->
107
+ <g class="eyes-look" fill="#000000">
108
+ <g class="eyes-blink">
109
+ <rect x="4" y="8" width="1" height="2"/>
110
+ <rect x="10" y="8" width="1" height="2"/>
111
+ </g>
112
+ </g>
113
+ </g>
114
+ </g>
115
+ </svg>
@@ -0,0 +1,201 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="-15 -25 45 45" width="500" height="500">
2
+ <defs>
3
+ <style>
4
+ /* ═══ 14s story: arm sway → grab book → read (with thought bits) → book slides away ═══ */
5
+
6
+ /* ── Independent ── */
7
+
8
+ .breathe {
9
+ transform-origin: 7.5px 13px;
10
+ animation: breathe 3.2s infinite ease-in-out;
11
+ }
12
+ @keyframes breathe {
13
+ 0%, 100% { transform: scale(1, 1) translate(0, 0); }
14
+ 50% { transform: scale(1.02, 0.98) translate(0, 0.5px); }
15
+ }
16
+
17
+ .blink {
18
+ transform-origin: 7.5px 9px;
19
+ animation: blink 5s infinite;
20
+ }
21
+ @keyframes blink {
22
+ 0%, 6%, 100% { transform: scaleY(1); }
23
+ 3% { transform: scaleY(0.1); }
24
+ }
25
+
26
+ .shadow {
27
+ transform-origin: 7.5px 15.5px;
28
+ animation: shadow-breathe 3.2s infinite ease-in-out;
29
+ }
30
+ @keyframes shadow-breathe {
31
+ 0%, 100% { transform: scaleX(1); opacity: 0.5; }
32
+ 50% { transform: scaleX(1.03); opacity: 0.47; }
33
+ }
34
+
35
+ /* ── Main 14s ── */
36
+
37
+ /* Body: nod twice during reading */
38
+ .body-nod {
39
+ animation: body-nod 14s infinite ease-in-out;
40
+ }
41
+ @keyframes body-nod {
42
+ 0%, 36%, 44%, 54%, 62%, 100% { transform: translateY(0); }
43
+ 40% { transform: translateY(0.4px); }
44
+ 58% { transform: translateY(0.4px); }
45
+ }
46
+
47
+ /* Left arm: BIG casual sway → reach → hold → follow book → return */
48
+ .arm-l {
49
+ transform-origin: 2px 10px;
50
+ animation: arm-l-anim 14s infinite ease-in-out;
51
+ }
52
+ @keyframes arm-l-anim {
53
+ /* sway (big, visible fidgeting) */
54
+ 0% { transform: translate(0, 0) rotate(0deg); }
55
+ 2.5% { transform: translate(-0.5px, 0) rotate(25deg); }
56
+ 5% { transform: translate(0.3px, 0) rotate(-20deg); }
57
+ 7.5% { transform: translate(-0.5px, 0) rotate(22deg); }
58
+ 10% { transform: translate(0, 0) rotate(0deg); }
59
+ /* reach out left to grab book */
60
+ 18% { transform: translate(-1px, -1px) rotate(15deg); }
61
+ /* bring to chest (hand visible at book left edge) */
62
+ 26% { transform: translate(2px, 0) rotate(-5deg); }
63
+ /* hold during reading */
64
+ 76% { transform: translate(2px, 0) rotate(-5deg); }
65
+ /* follow book sliding down */
66
+ 84% { transform: translate(1px, 2px) rotate(0deg); }
67
+ /* return to normal */
68
+ 92% { transform: translate(0, 0) rotate(0deg); }
69
+ 100% { transform: translate(0, 0) rotate(0deg); }
70
+ }
71
+
72
+ /* Right arm: nudge inward during reading */
73
+ .arm-r {
74
+ animation: arm-r-anim 14s infinite ease-in-out;
75
+ }
76
+ @keyframes arm-r-anim {
77
+ 0%, 22% { transform: translate(0, 0); }
78
+ 28%, 76% { transform: translate(-1px, 0); }
79
+ 84%, 100% { transform: translate(0, 0); }
80
+ }
81
+
82
+ /* Book: appear in hand → widen to chest → slide down → gone */
83
+ .book {
84
+ opacity: 0;
85
+ transform-origin: 7px 11.5px;
86
+ animation: book-anim 14s infinite ease-in-out;
87
+ }
88
+ @keyframes book-anim {
89
+ 0%, 12% { opacity: 0; transform: translate(-5px, -2px) scaleX(0.5); }
90
+ 18% { opacity: 1; transform: translate(-5px, -2px) scaleX(0.5); }
91
+ 26% { opacity: 1; transform: translate(0, 0) scaleX(1); }
92
+ 76% { opacity: 1; transform: translate(0, 0) scaleX(1); }
93
+ 84% { opacity: 0; transform: translate(0, 4px) scaleX(0.8); }
94
+ 100% { opacity: 0; transform: translate(0, 4px) scaleX(0.8); }
95
+ }
96
+
97
+ /* Eyes: normal → slow gaze down → drift → normal */
98
+ .eyes-read {
99
+ animation: eyes-read 14s infinite ease-in-out;
100
+ }
101
+ @keyframes eyes-read {
102
+ 0%, 22% { transform: translate(0, 0); }
103
+ 30% { transform: translate(0, 0.5px); }
104
+ 46% { transform: translate(-0.3px, 0.5px); }
105
+ 60% { transform: translate(0.3px, 0.5px); }
106
+ 70% { transform: translate(0, 0.5px); }
107
+ 80%, 100% { transform: translate(0, 0); }
108
+ }
109
+
110
+ /* ── Thought particles (visible only during reading) ── */
111
+ .reading-fx {
112
+ animation: reading-fx-vis 14s infinite;
113
+ }
114
+ @keyframes reading-fx-vis {
115
+ 0%, 27% { opacity: 0; }
116
+ 32%, 75% { opacity: 1; }
117
+ 78%, 100% { opacity: 0; }
118
+ }
119
+
120
+ .thought-bit {
121
+ opacity: 0;
122
+ animation: float-thought 2.5s infinite linear;
123
+ }
124
+ .t1 { animation-delay: 0s; }
125
+ .t2 { animation-delay: -0.7s; }
126
+ .t3 { animation-delay: -1.4s; }
127
+ .t4 { animation-delay: -2.1s; }
128
+
129
+ @keyframes float-thought {
130
+ 0% { transform: translateY(0); opacity: 0; }
131
+ 10% { opacity: 0.6; }
132
+ 100% { transform: translateY(-12px); opacity: 0; }
133
+ }
134
+ </style>
135
+ </defs>
136
+
137
+ <!-- Ground shadow -->
138
+ <rect class="shadow" x="3" y="15" width="9" height="1" fill="#000"/>
139
+
140
+ <!-- Thought particles (behind body, float up during reading) -->
141
+ <g class="reading-fx">
142
+ <rect class="thought-bit t1" x="2" y="4" width="2" height="2" fill="#40C4FF"/>
143
+ <rect class="thought-bit t2" x="8" y="3" width="1.5" height="1.5" fill="#B388FF"/>
144
+ <rect class="thought-bit t3" x="12" y="5" width="2" height="2" fill="#40C4FF"/>
145
+ <rect class="thought-bit t4" x="5" y="3" width="1.5" height="1.5" fill="#69F0AE"/>
146
+ </g>
147
+
148
+ <!-- Nod wrapper -->
149
+ <g class="body-nod">
150
+
151
+ <!-- ── Body layer ── -->
152
+ <g class="breathe">
153
+ <!-- Legs (idle style) -->
154
+ <g fill="#DE886D">
155
+ <rect x="3" y="11" width="1" height="4"/>
156
+ <rect x="5" y="11" width="1" height="4"/>
157
+ <rect x="9" y="11" width="1" height="4"/>
158
+ <rect x="11" y="11" width="1" height="4"/>
159
+ </g>
160
+ <!-- Torso -->
161
+ <rect x="2" y="6" width="11" height="7" fill="#DE886D"/>
162
+ <!-- Eyes -->
163
+ <g class="eyes-read">
164
+ <g class="blink" fill="#000">
165
+ <rect x="4" y="8" width="1" height="2"/>
166
+ <rect x="10" y="8" width="1" height="2"/>
167
+ </g>
168
+ </g>
169
+ </g>
170
+
171
+ <!-- ── Book layer (on top of body, chest level) ── -->
172
+ <g class="breathe">
173
+ <g class="book">
174
+ <!-- Back cover (blue) -->
175
+ <rect x="3" y="10" width="8" height="4" fill="#4A90D9"/>
176
+ <!-- Spine -->
177
+ <rect x="7" y="10" width="1" height="4" fill="#2E6AB0"/>
178
+ <!-- Page edges (top) -->
179
+ <rect x="4" y="9.5" width="6" height="0.5" fill="#FFFDE7"/>
180
+ <!-- Page edges (right side) -->
181
+ <rect x="10.5" y="10.5" width="0.5" height="3" fill="#FFFDE7"/>
182
+ <!-- Title plate -->
183
+ <rect x="4.5" y="10.5" width="5" height="1.5" fill="#E3F2FD" opacity="0.5"/>
184
+ <!-- Title text blocks -->
185
+ <rect x="5" y="10.8" width="3" height="0.5" fill="#2E6AB0"/>
186
+ <rect x="5.5" y="11.5" width="2" height="0.3" fill="#2E6AB0" opacity="0.6"/>
187
+ <!-- Small deco block -->
188
+ <rect x="6" y="12.5" width="2" height="0.5" fill="#E3F2FD" opacity="0.4"/>
189
+ </g>
190
+ </g>
191
+
192
+ <!-- ── Arms layer (on top of book) ── -->
193
+ <g class="breathe">
194
+ <g fill="#DE886D">
195
+ <g class="arm-l"><rect x="0" y="9" width="2" height="2"/></g>
196
+ <g class="arm-r"><rect x="13" y="9" width="2" height="2"/></g>
197
+ </g>
198
+ </g>
199
+
200
+ </g>
201
+ </svg>
@@ -0,0 +1,158 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="-15 -25 45 45" width="500" height="500">
2
+ <defs>
3
+ <style>
4
+ /* 5-Second Yawn — One-shot, ends in squashed/eyes-closed pose */
5
+ .action-body {
6
+ transform-origin: 7.5px 13px;
7
+ animation: action-body-yawn 3.8s ease-in-out forwards;
8
+ }
9
+
10
+ .breathe-anim {
11
+ transform-origin: 7.5px 13px;
12
+ animation: breathe 3.2s infinite ease-in-out;
13
+ }
14
+
15
+ .shadow-anim {
16
+ transform-origin: 7.5px 15.5px;
17
+ animation: shadow-yawn 3.8s ease-in-out forwards;
18
+ }
19
+
20
+ .arm-l {
21
+ transform-origin: 1px 10px;
22
+ animation: arm-l-yawn 3.8s ease-in-out forwards;
23
+ }
24
+
25
+ .arm-r {
26
+ transform-origin: 14px 10px;
27
+ animation: arm-r-yawn 3.8s ease-in-out forwards;
28
+ }
29
+
30
+ .eyes-look {
31
+ animation: eye-track-yawn 3.8s ease-in-out forwards;
32
+ }
33
+
34
+ .eyes-blink {
35
+ transform-origin: 7.5px 9px;
36
+ animation: eye-blink-yawn 3.8s linear forwards;
37
+ }
38
+
39
+ .yawn-mouth {
40
+ transform-origin: 7.5px 11px;
41
+ animation: yawn-mouth-anim 3.8s ease-in-out forwards;
42
+ opacity: 0;
43
+ }
44
+
45
+ .yawn-tear {
46
+ animation: tear-fall 3.8s ease-in-out forwards;
47
+ opacity: 0;
48
+ }
49
+
50
+ /* --- Keyframes --- */
51
+
52
+ @keyframes breathe {
53
+ 0%, 100% { transform: scale(1, 1) translate(0, 0); }
54
+ 50% { transform: scale(1.02, 0.98) translate(0, 0.5px); }
55
+ }
56
+
57
+ /* Body: neutral → stretch up → peak → squash down (hold from 78%) */
58
+ @keyframes action-body-yawn {
59
+ 0%, 12% { transform: scale(1, 1) translate(0, 0); }
60
+ 32% { transform: scale(0.95, 1.05) translate(0, -1px); }
61
+ 50% { transform: scale(0.9, 1.1) translate(0, -2px); }
62
+ 78%, 100% { transform: scale(1.05, 0.95) translate(0, 1px); }
63
+ }
64
+
65
+ @keyframes shadow-yawn {
66
+ 0%, 12% { transform: scaleX(1); opacity: 0.5; }
67
+ 32% { transform: scaleX(0.95); opacity: 0.45; }
68
+ 50% { transform: scaleX(0.9); opacity: 0.4; }
69
+ 78%, 100% { transform: scaleX(1.05); opacity: 0.55; }
70
+ }
71
+
72
+ /* Eyes look slightly up during stretch, then neutral */
73
+ @keyframes eye-track-yawn {
74
+ 0%, 18% { transform: translate(0, 0); }
75
+ 32%, 68% { transform: translate(0, -1px); }
76
+ 82%, 100% { transform: translate(0, 0); }
77
+ }
78
+
79
+ /* Blink once, then eyes shut for the yawn and stay shut */
80
+ @keyframes eye-blink-yawn {
81
+ 0%, 18% { transform: scaleY(1); }
82
+ 24% { transform: scaleY(0.1); }
83
+ 30% { transform: scaleY(1); }
84
+ 42%, 100% { transform: scaleY(0.1); }
85
+ }
86
+
87
+ /* Both arms stretch outward during yawn, then relax down */
88
+ @keyframes arm-l-yawn {
89
+ 0%, 12% { transform: translate(0, 0) rotate(0deg); }
90
+ 38% { transform: translate(-1px, -2px) rotate(45deg); }
91
+ 50% { transform: translate(-2px, -3px) rotate(80deg); }
92
+ 78%, 100% { transform: translate(0, 1px) rotate(-15deg); }
93
+ }
94
+
95
+ @keyframes arm-r-yawn {
96
+ 0%, 12% { transform: translate(0, 0) rotate(0deg); }
97
+ 38% { transform: translate(1px, -2px) rotate(-45deg); }
98
+ 50% { transform: translate(2px, -3px) rotate(-80deg); }
99
+ 78%, 100% { transform: translate(0, 1px) rotate(15deg); }
100
+ }
101
+
102
+ /* Mouth opens wide then closes */
103
+ @keyframes yawn-mouth-anim {
104
+ 0%, 18% { opacity: 0; transform: scale(0.1); }
105
+ 32% { opacity: 1; transform: scale(0.5, 0.2); }
106
+ 50% { opacity: 1; transform: scale(1.1, 1.4); }
107
+ 68% { opacity: 1; transform: scale(0.6, 0.4); }
108
+ 80%, 100% { opacity: 0; transform: scale(0.1); }
109
+ }
110
+
111
+ /* Tiny tear slides down during peak yawn */
112
+ @keyframes tear-fall {
113
+ 0%, 45% { opacity: 0; transform: translateY(0); }
114
+ 50% { opacity: 1; transform: translateY(0); }
115
+ 68% { opacity: 1; transform: translateY(2.5px); }
116
+ 80%, 100% { opacity: 0; transform: translateY(3px); }
117
+ }
118
+ </style>
119
+ </defs>
120
+
121
+ <!-- Ground Shadow -->
122
+ <rect id="ground-shadow" class="shadow-anim" x="3" y="15" width="9" height="1" fill="#000000" opacity="0.5"/>
123
+
124
+ <!-- Static Legs -->
125
+ <g id="legs" fill="#DE886D">
126
+ <rect x="3" y="12" width="1" height="3"/>
127
+ <rect x="5" y="12" width="1" height="3"/>
128
+ <rect x="9" y="12" width="1" height="3"/>
129
+ <rect x="11" y="12" width="1" height="3"/>
130
+ </g>
131
+
132
+ <!-- Animated Upper Body -->
133
+ <g class="action-body">
134
+ <g class="breathe-anim">
135
+ <!-- Torso -->
136
+ <rect id="torso" x="2" y="6" width="11" height="7" fill="#DE886D"/>
137
+ <!-- Left Arm -->
138
+ <g class="arm-l">
139
+ <rect x="0" y="9" width="2" height="2" fill="#DE886D"/>
140
+ </g>
141
+ <!-- Right Arm -->
142
+ <g class="arm-r">
143
+ <rect x="13" y="9" width="2" height="2" fill="#DE886D"/>
144
+ </g>
145
+ <!-- Yawning Mouth (hidden initially) -->
146
+ <rect class="yawn-mouth" x="6" y="10" width="3" height="2" fill="#000000"/>
147
+ <!-- Eyes -->
148
+ <g class="eyes-look" fill="#000000">
149
+ <g class="eyes-blink">
150
+ <rect x="4" y="8" width="1" height="2"/>
151
+ <rect x="10" y="8" width="1" height="2"/>
152
+ </g>
153
+ </g>
154
+ <!-- Tear -->
155
+ <rect class="yawn-tear" x="3.5" y="10" width="1" height="1" fill="#40C4FF"/>
156
+ </g>
157
+ </g>
158
+ </svg>