@mumulinya167/ccm-pet-assets 2.0.3 → 2.0.6

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 (141) hide show
  1. package/assets/calico/calico-idle-follow.svg +324 -324
  2. package/assets/calico.svg +324 -324
  3. package/assets/clawd/LICENSE +22 -22
  4. package/assets/clawd/clawd-about-hero.svg +202 -202
  5. package/assets/clawd/clawd-collapse-sleep.svg +247 -247
  6. package/assets/clawd/clawd-error.svg +94 -94
  7. package/assets/clawd/clawd-happy.svg +160 -160
  8. package/assets/clawd/clawd-headphones-groove.svg +194 -194
  9. package/assets/clawd/clawd-idle-bubble.svg +180 -180
  10. package/assets/clawd/clawd-idle-collapse.svg +101 -101
  11. package/assets/clawd/clawd-idle-doze.svg +72 -72
  12. package/assets/clawd/clawd-idle-follow.svg +64 -64
  13. package/assets/clawd/clawd-idle-living.svg +195 -195
  14. package/assets/clawd/clawd-idle-look.svg +115 -115
  15. package/assets/clawd/clawd-idle-reading.svg +252 -252
  16. package/assets/clawd/clawd-idle-yawn.svg +158 -158
  17. package/assets/clawd/clawd-mini-alert.svg +129 -129
  18. package/assets/clawd/clawd-mini-crabwalk.svg +76 -76
  19. package/assets/clawd/clawd-mini-enter-sleep.svg +64 -64
  20. package/assets/clawd/clawd-mini-enter.svg +114 -114
  21. package/assets/clawd/clawd-mini-happy.svg +124 -124
  22. package/assets/clawd/clawd-mini-idle.svg +83 -83
  23. package/assets/clawd/clawd-mini-peek.svg +82 -82
  24. package/assets/clawd/clawd-mini-sleep.svg +112 -112
  25. package/assets/clawd/clawd-mini-typing.svg +153 -153
  26. package/assets/clawd/clawd-notification.svg +438 -438
  27. package/assets/clawd/clawd-react-annoyed.svg +167 -167
  28. package/assets/clawd/clawd-react-double-jump.svg +229 -229
  29. package/assets/clawd/clawd-react-double.svg +108 -108
  30. package/assets/clawd/clawd-react-drag.svg +102 -102
  31. package/assets/clawd/clawd-react-left.svg +102 -102
  32. package/assets/clawd/clawd-react-right.svg +102 -102
  33. package/assets/clawd/clawd-sleeping.svg +117 -117
  34. package/assets/clawd/clawd-static-base.svg +20 -20
  35. package/assets/clawd/clawd-wake.svg +277 -277
  36. package/assets/clawd/clawd-working-building.svg +329 -329
  37. package/assets/clawd/clawd-working-carrying.svg +178 -178
  38. package/assets/clawd/clawd-working-debugger.svg +245 -245
  39. package/assets/clawd/clawd-working-juggling.svg +183 -183
  40. package/assets/clawd/clawd-working-sweeping.svg +248 -248
  41. package/assets/clawd/clawd-working-thinking.svg +501 -501
  42. package/assets/clawd/clawd-working-typing-boss.svg +307 -307
  43. package/assets/clawd/clawd-working-typing.svg +273 -273
  44. package/assets/clawd/clawd-working-ultrathink.svg +166 -166
  45. package/assets/clawd/clawd-working-wizard.svg +356 -356
  46. package/assets/clawd.svg +64 -64
  47. package/assets/cloudling/cloudling/cloudling-attention.svg +379 -379
  48. package/assets/cloudling/cloudling/cloudling-building.svg +667 -667
  49. package/assets/cloudling/cloudling/cloudling-carrying.svg +604 -604
  50. package/assets/cloudling/cloudling/cloudling-conducting.svg +616 -616
  51. package/assets/cloudling/cloudling/cloudling-dozing-to-sleeping.svg +578 -578
  52. package/assets/cloudling/cloudling/cloudling-dozing.svg +358 -358
  53. package/assets/cloudling/cloudling/cloudling-error.svg +428 -428
  54. package/assets/cloudling/cloudling/cloudling-idle-reading.svg +658 -658
  55. package/assets/cloudling/cloudling/cloudling-idle-to-dozing.svg +568 -568
  56. package/assets/cloudling/cloudling/cloudling-idle-to-sleeping.svg +811 -811
  57. package/assets/cloudling/cloudling/cloudling-idle.svg +255 -255
  58. package/assets/cloudling/cloudling/cloudling-juggling.svg +648 -648
  59. package/assets/cloudling/cloudling/cloudling-mini-alert.svg +389 -389
  60. package/assets/cloudling/cloudling/cloudling-mini-crabwalk.svg +335 -335
  61. package/assets/cloudling/cloudling/cloudling-mini-enter-roll-in.svg +225 -225
  62. package/assets/cloudling/cloudling/cloudling-mini-enter-sleep.svg +231 -231
  63. package/assets/cloudling/cloudling/cloudling-mini-happy.svg +370 -370
  64. package/assets/cloudling/cloudling/cloudling-mini-idle.svg +279 -279
  65. package/assets/cloudling/cloudling/cloudling-mini-peek.svg +327 -327
  66. package/assets/cloudling/cloudling/cloudling-mini-sleep.svg +260 -260
  67. package/assets/cloudling/cloudling/cloudling-mini-typing.svg +691 -691
  68. package/assets/cloudling/cloudling/cloudling-notification.svg +493 -493
  69. package/assets/cloudling/cloudling/cloudling-react-drag.svg +83 -83
  70. package/assets/cloudling/cloudling/cloudling-sleeping-to-idle.svg +555 -555
  71. package/assets/cloudling/cloudling/cloudling-sleeping.svg +500 -500
  72. package/assets/cloudling/cloudling/cloudling-sweeping.svg +292 -292
  73. package/assets/cloudling/cloudling/cloudling-thinking.svg +719 -719
  74. package/assets/cloudling/cloudling/cloudling-typing.svg +354 -354
  75. package/assets/cloudling/cloudling-attention.svg +379 -379
  76. package/assets/cloudling/cloudling-building.svg +667 -667
  77. package/assets/cloudling/cloudling-carrying.svg +604 -604
  78. package/assets/cloudling/cloudling-conducting.svg +616 -616
  79. package/assets/cloudling/cloudling-dozing-to-sleeping.svg +578 -578
  80. package/assets/cloudling/cloudling-dozing.svg +358 -358
  81. package/assets/cloudling/cloudling-error.svg +428 -428
  82. package/assets/cloudling/cloudling-idle-reading.svg +658 -658
  83. package/assets/cloudling/cloudling-idle-to-dozing.svg +568 -568
  84. package/assets/cloudling/cloudling-idle-to-sleeping.svg +811 -811
  85. package/assets/cloudling/cloudling-idle.svg +255 -255
  86. package/assets/cloudling/cloudling-juggling.svg +648 -648
  87. package/assets/cloudling/cloudling-mini-alert.svg +389 -389
  88. package/assets/cloudling/cloudling-mini-crabwalk.svg +335 -335
  89. package/assets/cloudling/cloudling-mini-enter-roll-in.svg +225 -225
  90. package/assets/cloudling/cloudling-mini-enter-sleep.svg +231 -231
  91. package/assets/cloudling/cloudling-mini-happy.svg +370 -370
  92. package/assets/cloudling/cloudling-mini-idle.svg +279 -279
  93. package/assets/cloudling/cloudling-mini-peek.svg +327 -327
  94. package/assets/cloudling/cloudling-mini-sleep.svg +260 -260
  95. package/assets/cloudling/cloudling-mini-typing.svg +691 -691
  96. package/assets/cloudling/cloudling-notification.svg +493 -493
  97. package/assets/cloudling/cloudling-react-drag.svg +83 -83
  98. package/assets/cloudling/cloudling-sleeping-to-idle.svg +555 -555
  99. package/assets/cloudling/cloudling-sleeping.svg +500 -500
  100. package/assets/cloudling/cloudling-sweeping.svg +292 -292
  101. package/assets/cloudling/cloudling-thinking.svg +719 -719
  102. package/assets/cloudling/cloudling-typing.svg +354 -354
  103. package/assets/cloudling.svg +255 -255
  104. package/assets/ghost-attention.svg +19 -19
  105. package/assets/ghost-carrying.svg +19 -19
  106. package/assets/ghost-collapsing.svg +19 -19
  107. package/assets/ghost-dozing.svg +23 -23
  108. package/assets/ghost-error.svg +19 -19
  109. package/assets/ghost-happy.svg +23 -23
  110. package/assets/ghost-idle.svg +11 -11
  111. package/assets/ghost-juggling.svg +19 -19
  112. package/assets/ghost-notification.svg +19 -19
  113. package/assets/ghost-react-double.svg +23 -23
  114. package/assets/ghost-react-drag.svg +23 -23
  115. package/assets/ghost-react-left.svg +19 -19
  116. package/assets/ghost-react-right.svg +19 -19
  117. package/assets/ghost-sleeping.svg +19 -19
  118. package/assets/ghost-sweeping.svg +19 -19
  119. package/assets/ghost-waking.svg +19 -19
  120. package/assets/ghost-yawning.svg +23 -23
  121. package/assets/ghost.svg +11 -11
  122. package/assets/robot-attention.svg +19 -19
  123. package/assets/robot-carrying.svg +19 -19
  124. package/assets/robot-collapsing.svg +19 -19
  125. package/assets/robot-dozing.svg +23 -23
  126. package/assets/robot-error.svg +19 -19
  127. package/assets/robot-happy.svg +23 -23
  128. package/assets/robot-idle.svg +11 -11
  129. package/assets/robot-juggling.svg +19 -19
  130. package/assets/robot-notification.svg +19 -19
  131. package/assets/robot-react-double.svg +23 -23
  132. package/assets/robot-react-drag.svg +23 -23
  133. package/assets/robot-react-left.svg +19 -19
  134. package/assets/robot-react-right.svg +19 -19
  135. package/assets/robot-sleeping.svg +19 -19
  136. package/assets/robot-sweeping.svg +19 -19
  137. package/assets/robot-waking.svg +19 -19
  138. package/assets/robot-yawning.svg +23 -23
  139. package/assets/robot.svg +11 -11
  140. package/manifest.json +280 -280
  141. package/package.json +1 -1
@@ -1,252 +1,252 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="-15 -25 45 45" width="500" height="500" shape-rendering="crispEdges">
2
- <defs>
3
- <style>
4
- /* ═══ 14s story: idle 挥手 → 抓书 + 戴眼镜 → 读 (眼镜下滑+推回) → 书+眼镜同步退场
5
- 在 clawd-idle-reading.svg 基础上加:
6
- 1. 圆框眼镜 (跟书同步 fade in/out + 读书慢下滑 + 推回过冲)
7
- 2. 双手 L 阴影 (clip 到 torso, 跟手 transform 同步, opacity 窗口对齐读书阶段)
8
- 3. z-order 重排: 手阴影 → 眼睛 → 眼镜 → 书 → 手
9
- 所有 wrapper 合并成单一 breathe 以方便理解 (原文件 3 个 breathe 效果等价) */
10
-
11
- /* ── Independent loops ── */
12
-
13
- .breathe {
14
- transform-origin: 7.5px 13px;
15
- animation: breathe 3.2s infinite ease-in-out;
16
- }
17
- @keyframes breathe {
18
- 0%, 100% { transform: scale(1, 1) translate(0, 0); }
19
- 50% { transform: scale(1.02, 0.98) translate(0, 0.5px); }
20
- }
21
-
22
- .blink {
23
- transform-origin: 7.5px 9px;
24
- animation: blink 5s infinite;
25
- }
26
- @keyframes blink {
27
- 0%, 6%, 100% { transform: scaleY(1); }
28
- 3% { transform: scaleY(0.1); }
29
- }
30
-
31
- .shadow {
32
- transform-origin: 7.5px 15.5px;
33
- animation: shadow-breathe 3.2s infinite ease-in-out;
34
- }
35
- @keyframes shadow-breathe {
36
- 0%, 100% { transform: scaleX(1); opacity: 0.5; }
37
- 50% { transform: scaleX(1.03); opacity: 0.47; }
38
- }
39
-
40
- /* ── Main 14s story ── */
41
-
42
- .body-nod {
43
- animation: body-nod 14s infinite ease-in-out;
44
- }
45
- @keyframes body-nod {
46
- 0%, 36%, 44%, 54%, 62%, 100% { transform: translateY(0); }
47
- 40% { transform: translateY(0.4px); }
48
- 58% { transform: translateY(0.4px); }
49
- }
50
-
51
- .arm-l {
52
- transform-origin: 2px 10px;
53
- animation: arm-l-anim 14s infinite ease-in-out;
54
- }
55
- @keyframes arm-l-anim {
56
- 0% { transform: translate(0, 0) rotate(0deg); }
57
- 2.5% { transform: translate(-0.5px, 0) rotate(25deg); }
58
- 5% { transform: translate(0.3px, 0) rotate(-20deg); }
59
- 7.5% { transform: translate(-0.5px, 0) rotate(22deg); }
60
- 10% { transform: translate(0, 0) rotate(0deg); }
61
- 18% { transform: translate(-1px, -1px) rotate(15deg); }
62
- 26% { transform: translate(2px, 0) rotate(-5deg); }
63
- 76% { transform: translate(2px, 0) rotate(-5deg); }
64
- 84% { transform: translate(1px, 2px) rotate(0deg); }
65
- 92% { transform: translate(0, 0) rotate(0deg); }
66
- 100% { transform: translate(0, 0) rotate(0deg); }
67
- }
68
-
69
- .arm-r {
70
- animation: arm-r-anim 14s infinite ease-in-out;
71
- }
72
- @keyframes arm-r-anim {
73
- 0%, 22% { transform: translate(0, 0); }
74
- 28%, 76% { transform: translate(-1px, 0); }
75
- 84%, 100% { transform: translate(0, 0); }
76
- }
77
-
78
- .book {
79
- opacity: 0;
80
- transform-origin: 7px 11.5px;
81
- animation: book-anim 14s infinite ease-in-out;
82
- }
83
- @keyframes book-anim {
84
- 0%, 12% { opacity: 0; transform: translate(-5px, -2px) scaleX(0.5); }
85
- 18% { opacity: 1; transform: translate(-5px, -2px) scaleX(0.5); }
86
- 26% { opacity: 1; transform: translate(0, 0) scaleX(1); }
87
- 76% { opacity: 1; transform: translate(0, 0) scaleX(1); }
88
- 84% { opacity: 0; transform: translate(0, 4px) scaleX(0.8); }
89
- 100% { opacity: 0; transform: translate(0, 4px) scaleX(0.8); }
90
- }
91
-
92
- .eyes-read {
93
- animation: eyes-read 14s infinite ease-in-out;
94
- }
95
- @keyframes eyes-read {
96
- 0%, 22% { transform: translate(0, 0); }
97
- 30% { transform: translate(0, 0.5px); }
98
- 46% { transform: translate(-0.3px, 0.5px); }
99
- 60% { transform: translate(0.3px, 0.5px); }
100
- 70% { transform: translate(0, 0.5px); }
101
- 80%, 100% { transform: translate(0, 0); }
102
- }
103
-
104
- /* ── NEW: 圆框眼镜
105
- - 0-12% 不可见 (idle 阶段, 还没戴)
106
- - 12-18% fade in + 从额头位置 0.5px 上方滑到鼻梁 (跟书出场同步)
107
- - 18-72% 戴好读书, 慢慢下滑 0.3px (读累了往鼻头下溜)
108
- - 72-78% 推回 -0.1px 过冲 (顺手把眼镜推上去, 配合书要滑下的节点)
109
- - 78-84% 稳住到 0
110
- - 84-92% fade out + 滑回额头位置 (跟书退场同步) */
111
- .glasses {
112
- animation: glasses-anim 14s infinite ease-in-out;
113
- }
114
- @keyframes glasses-anim {
115
- 0%, 12% { opacity: 0; transform: translateY(-0.5px); }
116
- 18% { opacity: 1; transform: translateY(0); }
117
- 30% { opacity: 1; transform: translateY(0); }
118
- 72% { opacity: 1; transform: translateY(0.3px); }
119
- 78% { opacity: 1; transform: translateY(-0.1px); }
120
- 84% { opacity: 1; transform: translateY(0); }
121
- 92% { opacity: 0; transform: translateY(-0.5px); }
122
- 100% { opacity: 0; transform: translateY(-0.5px); }
123
- }
124
-
125
- /* ── NEW: 手阴影 opacity 窗口 (避免 idle 大挥时阴影闪烁)
126
- - 左手 22% fade in (手快抓到书时), 84% fade out (随书下滑时)
127
- - 右手 26% fade in (右手 nudge 进 torso 前), 84% fade out */
128
- .shadow-l-fade {
129
- animation: shadow-l-fade 14s infinite ease-in-out;
130
- }
131
- @keyframes shadow-l-fade {
132
- 0%, 20% { opacity: 0; }
133
- 26%, 78% { opacity: 1; }
134
- 84%, 100% { opacity: 0; }
135
- }
136
- .shadow-r-fade {
137
- animation: shadow-r-fade 14s infinite ease-in-out;
138
- }
139
- @keyframes shadow-r-fade {
140
- 0%, 24% { opacity: 0; }
141
- 30%, 78% { opacity: 1; }
142
- 84%, 100% { opacity: 0; }
143
- }
144
-
145
- /* ── Thought particles ── */
146
- .reading-fx {
147
- animation: reading-fx-vis 14s infinite;
148
- }
149
- @keyframes reading-fx-vis {
150
- 0%, 27% { opacity: 0; }
151
- 32%, 75% { opacity: 1; }
152
- 78%, 100% { opacity: 0; }
153
- }
154
-
155
- .thought-bit {
156
- opacity: 0;
157
- animation: float-thought 2.5s infinite linear;
158
- }
159
- .t1 { animation-delay: 0s; }
160
- .t2 { animation-delay: -0.7s; }
161
- .t3 { animation-delay: -1.4s; }
162
- .t4 { animation-delay: -2.1s; }
163
-
164
- @keyframes float-thought {
165
- 0% { transform: translateY(0); opacity: 0; }
166
- 10% { opacity: 0.6; }
167
- 100% { transform: translateY(-12px); opacity: 0; }
168
- }
169
- </style>
170
-
171
- <clipPath id="inside-torso">
172
- <rect x="2" y="6" width="11" height="7"/>
173
- </clipPath>
174
- </defs>
175
-
176
- <!-- Ground shadow -->
177
- <rect class="shadow" x="3" y="15" width="9" height="1" fill="#000"/>
178
-
179
- <!-- Thought particles -->
180
- <g class="reading-fx">
181
- <rect class="thought-bit t1" x="2" y="4" width="2" height="2" fill="#40C4FF"/>
182
- <rect class="thought-bit t2" x="8" y="3" width="1.5" height="1.5" fill="#B388FF"/>
183
- <rect class="thought-bit t3" x="12" y="5" width="2" height="2" fill="#40C4FF"/>
184
- <rect class="thought-bit t4" x="5" y="3" width="1.5" height="1.5" fill="#69F0AE"/>
185
- </g>
186
-
187
- <g class="body-nod">
188
- <g class="breathe">
189
-
190
- <!-- 腿 + torso -->
191
- <g fill="#DE886D">
192
- <rect x="3" y="11" width="1" height="4"/>
193
- <rect x="5" y="11" width="1" height="4"/>
194
- <rect x="9" y="11" width="1" height="4"/>
195
- <rect x="11" y="11" width="1" height="4"/>
196
- </g>
197
- <rect x="2" y="6" width="11" height="7" fill="#DE886D"/>
198
-
199
- <!-- 手阴影 (clip 到 torso, opacity 窗口 + 跟手 transform 同步) -->
200
- <g clip-path="url(#inside-torso)" fill="#A85A3A">
201
- <g class="shadow-l-fade">
202
- <g class="arm-l">
203
- <rect x="0" y="9" width="2.4" height="2.4"/>
204
- </g>
205
- </g>
206
- <g class="shadow-r-fade">
207
- <g class="arm-r">
208
- <rect x="12.6" y="9" width="2.4" height="2.4"/>
209
- </g>
210
- </g>
211
- </g>
212
-
213
- <!-- 眼睛 (跟 eyes-read 漂移 + blink 眨眼) -->
214
- <g class="eyes-read">
215
- <g class="blink" fill="#000">
216
- <rect x="4" y="8" width="1" height="2"/>
217
- <rect x="10" y="8" width="1" height="2"/>
218
- </g>
219
- </g>
220
-
221
- <!-- 圆框眼镜 (不嵌 eyes-read/blink, 镜片固定眼球转) -->
222
- <g class="glasses" shape-rendering="auto">
223
- <g fill="none" stroke="#6B2522" stroke-width="0.56" stroke-linecap="round" stroke-linejoin="round">
224
- <circle cx="4.415" cy="9" r="2.03"/>
225
- <circle cx="10.585" cy="9" r="2.03"/>
226
- <path d="M6.445 8.85 C7.036 8.35 7.964 8.35 8.555 8.85"/>
227
- <path d="M2.426 8.45 C2.127 8.37 1.893 8.35 1.716 8.35"/>
228
- <path d="M12.574 8.45 C12.873 8.37 13.107 8.35 13.284 8.35"/>
229
- </g>
230
- </g>
231
-
232
- <!-- 书 (在脸之上, 手之下) -->
233
- <g class="book">
234
- <rect x="3" y="10" width="8" height="4" fill="#4A90D9"/>
235
- <rect x="7" y="10" width="1" height="4" fill="#2E6AB0"/>
236
- <rect x="3.9" y="9.7" width="6.5" height="0.3" fill="#FFFDE7"/>
237
- <rect x="10.5" y="10.5" width="0.5" height="3" fill="#FFFDE7"/>
238
- <rect x="4.5" y="10.5" width="5" height="1.5" fill="#E3F2FD" opacity="0.5"/>
239
- <rect x="5" y="10.8" width="3" height="0.5" fill="#2E6AB0"/>
240
- <rect x="5.5" y="11.5" width="2" height="0.3" fill="#2E6AB0" opacity="0.6"/>
241
- <rect x="6" y="12.5" width="2" height="0.5" fill="#E3F2FD" opacity="0.4"/>
242
- </g>
243
-
244
- <!-- 双手 (最上层) -->
245
- <g fill="#DE886D">
246
- <g class="arm-l"><rect x="0" y="9" width="2" height="2"/></g>
247
- <g class="arm-r"><rect x="13" y="9" width="2" height="2"/></g>
248
- </g>
249
-
250
- </g>
251
- </g>
252
- </svg>
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="-15 -25 45 45" width="500" height="500" shape-rendering="crispEdges">
2
+ <defs>
3
+ <style>
4
+ /* ═══ 14s story: idle 挥手 → 抓书 + 戴眼镜 → 读 (眼镜下滑+推回) → 书+眼镜同步退场
5
+ 在 clawd-idle-reading.svg 基础上加:
6
+ 1. 圆框眼镜 (跟书同步 fade in/out + 读书慢下滑 + 推回过冲)
7
+ 2. 双手 L 阴影 (clip 到 torso, 跟手 transform 同步, opacity 窗口对齐读书阶段)
8
+ 3. z-order 重排: 手阴影 → 眼睛 → 眼镜 → 书 → 手
9
+ 所有 wrapper 合并成单一 breathe 以方便理解 (原文件 3 个 breathe 效果等价) */
10
+
11
+ /* ── Independent loops ── */
12
+
13
+ .breathe {
14
+ transform-origin: 7.5px 13px;
15
+ animation: breathe 3.2s infinite ease-in-out;
16
+ }
17
+ @keyframes breathe {
18
+ 0%, 100% { transform: scale(1, 1) translate(0, 0); }
19
+ 50% { transform: scale(1.02, 0.98) translate(0, 0.5px); }
20
+ }
21
+
22
+ .blink {
23
+ transform-origin: 7.5px 9px;
24
+ animation: blink 5s infinite;
25
+ }
26
+ @keyframes blink {
27
+ 0%, 6%, 100% { transform: scaleY(1); }
28
+ 3% { transform: scaleY(0.1); }
29
+ }
30
+
31
+ .shadow {
32
+ transform-origin: 7.5px 15.5px;
33
+ animation: shadow-breathe 3.2s infinite ease-in-out;
34
+ }
35
+ @keyframes shadow-breathe {
36
+ 0%, 100% { transform: scaleX(1); opacity: 0.5; }
37
+ 50% { transform: scaleX(1.03); opacity: 0.47; }
38
+ }
39
+
40
+ /* ── Main 14s story ── */
41
+
42
+ .body-nod {
43
+ animation: body-nod 14s infinite ease-in-out;
44
+ }
45
+ @keyframes body-nod {
46
+ 0%, 36%, 44%, 54%, 62%, 100% { transform: translateY(0); }
47
+ 40% { transform: translateY(0.4px); }
48
+ 58% { transform: translateY(0.4px); }
49
+ }
50
+
51
+ .arm-l {
52
+ transform-origin: 2px 10px;
53
+ animation: arm-l-anim 14s infinite ease-in-out;
54
+ }
55
+ @keyframes arm-l-anim {
56
+ 0% { transform: translate(0, 0) rotate(0deg); }
57
+ 2.5% { transform: translate(-0.5px, 0) rotate(25deg); }
58
+ 5% { transform: translate(0.3px, 0) rotate(-20deg); }
59
+ 7.5% { transform: translate(-0.5px, 0) rotate(22deg); }
60
+ 10% { transform: translate(0, 0) rotate(0deg); }
61
+ 18% { transform: translate(-1px, -1px) rotate(15deg); }
62
+ 26% { transform: translate(2px, 0) rotate(-5deg); }
63
+ 76% { transform: translate(2px, 0) rotate(-5deg); }
64
+ 84% { transform: translate(1px, 2px) rotate(0deg); }
65
+ 92% { transform: translate(0, 0) rotate(0deg); }
66
+ 100% { transform: translate(0, 0) rotate(0deg); }
67
+ }
68
+
69
+ .arm-r {
70
+ animation: arm-r-anim 14s infinite ease-in-out;
71
+ }
72
+ @keyframes arm-r-anim {
73
+ 0%, 22% { transform: translate(0, 0); }
74
+ 28%, 76% { transform: translate(-1px, 0); }
75
+ 84%, 100% { transform: translate(0, 0); }
76
+ }
77
+
78
+ .book {
79
+ opacity: 0;
80
+ transform-origin: 7px 11.5px;
81
+ animation: book-anim 14s infinite ease-in-out;
82
+ }
83
+ @keyframes book-anim {
84
+ 0%, 12% { opacity: 0; transform: translate(-5px, -2px) scaleX(0.5); }
85
+ 18% { opacity: 1; transform: translate(-5px, -2px) scaleX(0.5); }
86
+ 26% { opacity: 1; transform: translate(0, 0) scaleX(1); }
87
+ 76% { opacity: 1; transform: translate(0, 0) scaleX(1); }
88
+ 84% { opacity: 0; transform: translate(0, 4px) scaleX(0.8); }
89
+ 100% { opacity: 0; transform: translate(0, 4px) scaleX(0.8); }
90
+ }
91
+
92
+ .eyes-read {
93
+ animation: eyes-read 14s infinite ease-in-out;
94
+ }
95
+ @keyframes eyes-read {
96
+ 0%, 22% { transform: translate(0, 0); }
97
+ 30% { transform: translate(0, 0.5px); }
98
+ 46% { transform: translate(-0.3px, 0.5px); }
99
+ 60% { transform: translate(0.3px, 0.5px); }
100
+ 70% { transform: translate(0, 0.5px); }
101
+ 80%, 100% { transform: translate(0, 0); }
102
+ }
103
+
104
+ /* ── NEW: 圆框眼镜
105
+ - 0-12% 不可见 (idle 阶段, 还没戴)
106
+ - 12-18% fade in + 从额头位置 0.5px 上方滑到鼻梁 (跟书出场同步)
107
+ - 18-72% 戴好读书, 慢慢下滑 0.3px (读累了往鼻头下溜)
108
+ - 72-78% 推回 -0.1px 过冲 (顺手把眼镜推上去, 配合书要滑下的节点)
109
+ - 78-84% 稳住到 0
110
+ - 84-92% fade out + 滑回额头位置 (跟书退场同步) */
111
+ .glasses {
112
+ animation: glasses-anim 14s infinite ease-in-out;
113
+ }
114
+ @keyframes glasses-anim {
115
+ 0%, 12% { opacity: 0; transform: translateY(-0.5px); }
116
+ 18% { opacity: 1; transform: translateY(0); }
117
+ 30% { opacity: 1; transform: translateY(0); }
118
+ 72% { opacity: 1; transform: translateY(0.3px); }
119
+ 78% { opacity: 1; transform: translateY(-0.1px); }
120
+ 84% { opacity: 1; transform: translateY(0); }
121
+ 92% { opacity: 0; transform: translateY(-0.5px); }
122
+ 100% { opacity: 0; transform: translateY(-0.5px); }
123
+ }
124
+
125
+ /* ── NEW: 手阴影 opacity 窗口 (避免 idle 大挥时阴影闪烁)
126
+ - 左手 22% fade in (手快抓到书时), 84% fade out (随书下滑时)
127
+ - 右手 26% fade in (右手 nudge 进 torso 前), 84% fade out */
128
+ .shadow-l-fade {
129
+ animation: shadow-l-fade 14s infinite ease-in-out;
130
+ }
131
+ @keyframes shadow-l-fade {
132
+ 0%, 20% { opacity: 0; }
133
+ 26%, 78% { opacity: 1; }
134
+ 84%, 100% { opacity: 0; }
135
+ }
136
+ .shadow-r-fade {
137
+ animation: shadow-r-fade 14s infinite ease-in-out;
138
+ }
139
+ @keyframes shadow-r-fade {
140
+ 0%, 24% { opacity: 0; }
141
+ 30%, 78% { opacity: 1; }
142
+ 84%, 100% { opacity: 0; }
143
+ }
144
+
145
+ /* ── Thought particles ── */
146
+ .reading-fx {
147
+ animation: reading-fx-vis 14s infinite;
148
+ }
149
+ @keyframes reading-fx-vis {
150
+ 0%, 27% { opacity: 0; }
151
+ 32%, 75% { opacity: 1; }
152
+ 78%, 100% { opacity: 0; }
153
+ }
154
+
155
+ .thought-bit {
156
+ opacity: 0;
157
+ animation: float-thought 2.5s infinite linear;
158
+ }
159
+ .t1 { animation-delay: 0s; }
160
+ .t2 { animation-delay: -0.7s; }
161
+ .t3 { animation-delay: -1.4s; }
162
+ .t4 { animation-delay: -2.1s; }
163
+
164
+ @keyframes float-thought {
165
+ 0% { transform: translateY(0); opacity: 0; }
166
+ 10% { opacity: 0.6; }
167
+ 100% { transform: translateY(-12px); opacity: 0; }
168
+ }
169
+ </style>
170
+
171
+ <clipPath id="inside-torso">
172
+ <rect x="2" y="6" width="11" height="7"/>
173
+ </clipPath>
174
+ </defs>
175
+
176
+ <!-- Ground shadow -->
177
+ <rect class="shadow" x="3" y="15" width="9" height="1" fill="#000"/>
178
+
179
+ <!-- Thought particles -->
180
+ <g class="reading-fx">
181
+ <rect class="thought-bit t1" x="2" y="4" width="2" height="2" fill="#40C4FF"/>
182
+ <rect class="thought-bit t2" x="8" y="3" width="1.5" height="1.5" fill="#B388FF"/>
183
+ <rect class="thought-bit t3" x="12" y="5" width="2" height="2" fill="#40C4FF"/>
184
+ <rect class="thought-bit t4" x="5" y="3" width="1.5" height="1.5" fill="#69F0AE"/>
185
+ </g>
186
+
187
+ <g class="body-nod">
188
+ <g class="breathe">
189
+
190
+ <!-- 腿 + torso -->
191
+ <g fill="#DE886D">
192
+ <rect x="3" y="11" width="1" height="4"/>
193
+ <rect x="5" y="11" width="1" height="4"/>
194
+ <rect x="9" y="11" width="1" height="4"/>
195
+ <rect x="11" y="11" width="1" height="4"/>
196
+ </g>
197
+ <rect x="2" y="6" width="11" height="7" fill="#DE886D"/>
198
+
199
+ <!-- 手阴影 (clip 到 torso, opacity 窗口 + 跟手 transform 同步) -->
200
+ <g clip-path="url(#inside-torso)" fill="#A85A3A">
201
+ <g class="shadow-l-fade">
202
+ <g class="arm-l">
203
+ <rect x="0" y="9" width="2.4" height="2.4"/>
204
+ </g>
205
+ </g>
206
+ <g class="shadow-r-fade">
207
+ <g class="arm-r">
208
+ <rect x="12.6" y="9" width="2.4" height="2.4"/>
209
+ </g>
210
+ </g>
211
+ </g>
212
+
213
+ <!-- 眼睛 (跟 eyes-read 漂移 + blink 眨眼) -->
214
+ <g class="eyes-read">
215
+ <g class="blink" fill="#000">
216
+ <rect x="4" y="8" width="1" height="2"/>
217
+ <rect x="10" y="8" width="1" height="2"/>
218
+ </g>
219
+ </g>
220
+
221
+ <!-- 圆框眼镜 (不嵌 eyes-read/blink, 镜片固定眼球转) -->
222
+ <g class="glasses" shape-rendering="auto">
223
+ <g fill="none" stroke="#6B2522" stroke-width="0.56" stroke-linecap="round" stroke-linejoin="round">
224
+ <circle cx="4.415" cy="9" r="2.03"/>
225
+ <circle cx="10.585" cy="9" r="2.03"/>
226
+ <path d="M6.445 8.85 C7.036 8.35 7.964 8.35 8.555 8.85"/>
227
+ <path d="M2.426 8.45 C2.127 8.37 1.893 8.35 1.716 8.35"/>
228
+ <path d="M12.574 8.45 C12.873 8.37 13.107 8.35 13.284 8.35"/>
229
+ </g>
230
+ </g>
231
+
232
+ <!-- 书 (在脸之上, 手之下) -->
233
+ <g class="book">
234
+ <rect x="3" y="10" width="8" height="4" fill="#4A90D9"/>
235
+ <rect x="7" y="10" width="1" height="4" fill="#2E6AB0"/>
236
+ <rect x="3.9" y="9.7" width="6.5" height="0.3" fill="#FFFDE7"/>
237
+ <rect x="10.5" y="10.5" width="0.5" height="3" fill="#FFFDE7"/>
238
+ <rect x="4.5" y="10.5" width="5" height="1.5" fill="#E3F2FD" opacity="0.5"/>
239
+ <rect x="5" y="10.8" width="3" height="0.5" fill="#2E6AB0"/>
240
+ <rect x="5.5" y="11.5" width="2" height="0.3" fill="#2E6AB0" opacity="0.6"/>
241
+ <rect x="6" y="12.5" width="2" height="0.5" fill="#E3F2FD" opacity="0.4"/>
242
+ </g>
243
+
244
+ <!-- 双手 (最上层) -->
245
+ <g fill="#DE886D">
246
+ <g class="arm-l"><rect x="0" y="9" width="2" height="2"/></g>
247
+ <g class="arm-r"><rect x="13" y="9" width="2" height="2"/></g>
248
+ </g>
249
+
250
+ </g>
251
+ </g>
252
+ </svg>