mocode-pet-app 1.4.0 → 1.7.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 (89) hide show
  1. package/assets/pets/01-robo-cat.motion.css +42 -0
  2. package/assets/pets/01-robo-cat.svg +2 -2
  3. package/assets/pets/02-robo-dog.motion.css +42 -0
  4. package/assets/pets/02-robo-dog.svg +1 -1
  5. package/assets/pets/03-robo-fox.motion.css +63 -0
  6. package/assets/pets/03-robo-fox.svg +1 -1
  7. package/assets/pets/04-robo-panda.motion.css +61 -0
  8. package/assets/pets/04-robo-panda.svg +1 -1
  9. package/assets/pets/05-robo-owl.motion.css +88 -0
  10. package/assets/pets/05-robo-owl.svg +3 -3
  11. package/assets/pets/06-robo-bunny.motion.css +84 -0
  12. package/assets/pets/06-robo-bunny.svg +2 -2
  13. package/assets/pets/07-robo-frog.motion.css +65 -0
  14. package/assets/pets/07-robo-frog.svg +3 -3
  15. package/assets/pets/08-robo-bear.motion.css +65 -0
  16. package/assets/pets/09-robo-penguin.motion.css +94 -0
  17. package/assets/pets/09-robo-penguin.svg +3 -3
  18. package/assets/pets/10-robo-dino.motion.css +91 -0
  19. package/assets/pets/10-robo-dino.svg +3 -3
  20. package/assets/pets/11-slime-blob.motion.css +44 -0
  21. package/assets/pets/11-slime-blob.svg +3 -3
  22. package/assets/pets/12-ghost-byte.motion.css +73 -0
  23. package/assets/pets/12-ghost-byte.svg +3 -3
  24. package/assets/pets/13-cactus-bot.motion.css +90 -0
  25. package/assets/pets/13-cactus-bot.svg +2 -2
  26. package/assets/pets/14-crystal-bot.motion.css +63 -0
  27. package/assets/pets/15-satellite-bot.motion.css +72 -0
  28. package/assets/pets/15-satellite-bot.svg +1 -1
  29. package/assets/pets/16-jellyfish-bot.motion.css +71 -0
  30. package/assets/pets/16-jellyfish-bot.svg +3 -3
  31. package/assets/pets/17-mushroom-bot.motion.css +65 -0
  32. package/assets/pets/18-star-bot.motion.css +72 -0
  33. package/assets/pets/18-star-bot.svg +3 -3
  34. package/assets/pets/manifest.json +139 -25
  35. package/dist/assets/pets/01-robo-cat.motion.css +42 -0
  36. package/dist/assets/pets/01-robo-cat.svg +2 -2
  37. package/dist/assets/pets/02-robo-dog.motion.css +42 -0
  38. package/dist/assets/pets/02-robo-dog.svg +1 -1
  39. package/dist/assets/pets/03-robo-fox.motion.css +63 -0
  40. package/dist/assets/pets/03-robo-fox.svg +1 -1
  41. package/dist/assets/pets/04-robo-panda.motion.css +61 -0
  42. package/dist/assets/pets/04-robo-panda.svg +1 -1
  43. package/dist/assets/pets/05-robo-owl.motion.css +88 -0
  44. package/dist/assets/pets/05-robo-owl.svg +3 -3
  45. package/dist/assets/pets/06-robo-bunny.motion.css +84 -0
  46. package/dist/assets/pets/06-robo-bunny.svg +2 -2
  47. package/dist/assets/pets/07-robo-frog.motion.css +65 -0
  48. package/dist/assets/pets/07-robo-frog.svg +3 -3
  49. package/dist/assets/pets/08-robo-bear.motion.css +65 -0
  50. package/dist/assets/pets/09-robo-penguin.motion.css +94 -0
  51. package/dist/assets/pets/09-robo-penguin.svg +3 -3
  52. package/dist/assets/pets/10-robo-dino.motion.css +91 -0
  53. package/dist/assets/pets/10-robo-dino.svg +3 -3
  54. package/dist/assets/pets/11-slime-blob.motion.css +44 -0
  55. package/dist/assets/pets/11-slime-blob.svg +3 -3
  56. package/dist/assets/pets/12-ghost-byte.motion.css +73 -0
  57. package/dist/assets/pets/12-ghost-byte.svg +3 -3
  58. package/dist/assets/pets/13-cactus-bot.motion.css +90 -0
  59. package/dist/assets/pets/13-cactus-bot.svg +2 -2
  60. package/dist/assets/pets/14-crystal-bot.motion.css +63 -0
  61. package/dist/assets/pets/15-satellite-bot.motion.css +72 -0
  62. package/dist/assets/pets/15-satellite-bot.svg +1 -1
  63. package/dist/assets/pets/16-jellyfish-bot.motion.css +71 -0
  64. package/dist/assets/pets/16-jellyfish-bot.svg +3 -3
  65. package/dist/assets/pets/17-mushroom-bot.motion.css +65 -0
  66. package/dist/assets/pets/18-star-bot.motion.css +72 -0
  67. package/dist/assets/pets/18-star-bot.svg +3 -3
  68. package/dist/assets/pets/manifest.json +139 -25
  69. package/dist/assets/tray-icon.png +0 -0
  70. package/dist/e2e-mood-check.js +150 -0
  71. package/dist/main.js +53 -2
  72. package/dist/mood-current-state.test.js +55 -0
  73. package/dist/mood-determinism.pbt.js +66 -0
  74. package/dist/mood-tracker-timing.test.js +70 -0
  75. package/dist/mood-tracker.js +41 -0
  76. package/dist/mood-tracker.test.js +56 -0
  77. package/dist/mood.js +102 -0
  78. package/dist/mood.pbt.js +52 -0
  79. package/dist/quips.js +59 -0
  80. package/dist/quips.test.js +98 -0
  81. package/dist/renderer/dom-mood.js +55 -0
  82. package/dist/renderer/dom-mood.test.js +105 -0
  83. package/dist/renderer/index.html +2 -0
  84. package/dist/renderer/preload.js +20 -2
  85. package/dist/renderer/renderer.js +29 -9
  86. package/dist/renderer/style.css +89 -0
  87. package/dist/skins.js +50 -1
  88. package/dist/skins.test.js +112 -0
  89. package/package.json +1 -1
@@ -0,0 +1,42 @@
1
+ /* 机械猫(robo-cat)专属演出:覆盖通用 style.css 的部分选择器,体现"猫"的悠闲与傲娇感。
2
+ * 未覆盖的选择器(如 speaking/tool_call 等)继续回退通用规则。 */
3
+
4
+ /* ── thinking:比通用更慢更懒的摆动,像猫盯着屏幕犯懒 ── */
5
+ @keyframes cat-think-lazy-nod {
6
+ 0%, 100% { transform: rotate(0deg); }
7
+ 50% { transform: rotate(-3deg); }
8
+ }
9
+ .pet-thinking #pet-body-group {
10
+ animation: cat-think-lazy-nod 1.8s ease-in-out infinite;
11
+ transform-origin: 128px 125px;
12
+ }
13
+
14
+ /* ── mood-tired:尾巴慢慢垂下并轻轻摇,模拟没精神耷拉着尾巴 ── */
15
+ @keyframes cat-tail-droop-sway {
16
+ 0%, 100% { transform: rotate(6deg); }
17
+ 50% { transform: rotate(12deg); }
18
+ }
19
+ .mood-tired #pet-tail {
20
+ animation: cat-tail-droop-sway 3.5s ease-in-out infinite;
21
+ transform-origin: 216px 180px;
22
+ }
23
+
24
+ /* ── idle:尾巴悠闲地慢慢甩动,叠加在通用的上下浮动之上 ── */
25
+ @keyframes cat-tail-flick {
26
+ 0%, 100% { transform: rotate(0deg); }
27
+ 50% { transform: rotate(-8deg); }
28
+ }
29
+ .pet-idle #pet-tail {
30
+ animation: cat-tail-flick 2.6s ease-in-out infinite;
31
+ transform-origin: 216px 180px;
32
+ }
33
+
34
+ /* ── mood-bored:尾巴无聊地左右扫动,比 idle 更明显 ── */
35
+ @keyframes cat-tail-bored-sweep {
36
+ 0%, 100% { transform: rotate(-10deg); }
37
+ 50% { transform: rotate(10deg); }
38
+ }
39
+ .mood-bored #pet-tail {
40
+ animation: cat-tail-bored-sweep 1.6s ease-in-out infinite;
41
+ transform-origin: 216px 180px;
42
+ }
@@ -38,7 +38,7 @@
38
38
  </g>
39
39
 
40
40
  <!-- Cat mouth -->
41
- <path d="M118 148 L128 156 L138 148" stroke="#2afadf" stroke-width="4" fill="none" stroke-linecap="round" filter="url(#glow)"/>
41
+ <path id="pet-mouth" d="M118 148 L128 156 L138 148" stroke="#2afadf" stroke-width="4" fill="none" stroke-linecap="round" filter="url(#glow)"/>
42
42
 
43
43
  <!-- Whiskers -->
44
44
  <line x1="46" y1="128" x2="76" y2="124" stroke="url(#accentGrad)" stroke-width="2" stroke-linecap="round"/>
@@ -51,6 +51,6 @@
51
51
  <rect x="160" y="200" width="20" height="26" rx="8" fill="url(#bodyGrad)" stroke="url(#accentGrad)" stroke-width="2.5"/>
52
52
 
53
53
  <!-- Tail -->
54
- <path d="M216 180 Q246 190 240 150" stroke="url(#accentGrad)" stroke-width="8" stroke-linecap="round" fill="none"/>
54
+ <path id="pet-tail" d="M216 180 Q246 190 240 150" stroke="url(#accentGrad)" stroke-width="8" stroke-linecap="round" fill="none"/>
55
55
  </g>
56
56
  </svg>
@@ -0,0 +1,42 @@
1
+ /* 机械犬(robo-dog)专属演出:体现"狗"活泼好奇的个性。
2
+ * 尾巴摆动已由 SVG 内置 animateTransform 独立驱动,这里不重复控制;
3
+ * 只覆盖头部摆动节奏和嘴部(舌头)形变。 */
4
+
5
+ /* ── thinking:比通用更快更兴奋的点头,像狗狗好奇张望 ── */
6
+ @keyframes dog-think-excited-nod {
7
+ 0%, 100% { transform: rotate(0deg); }
8
+ 50% { transform: rotate(-7deg); }
9
+ }
10
+ .pet-thinking #pet-body-group {
11
+ animation: dog-think-excited-nod 0.5s ease-in-out infinite;
12
+ transform-origin: 128px 125px;
13
+ }
14
+
15
+ /* ── mood-bored:舌头(嘴部元素)打哈欠似的拉长再收回 ── */
16
+ @keyframes dog-bored-yawn {
17
+ 0%, 100% { transform: scaleY(1); }
18
+ 50% { transform: scaleY(1.8); }
19
+ }
20
+ .mood-bored #pet-mouth {
21
+ animation: dog-bored-yawn 2.2s ease-in-out infinite;
22
+ transform-origin: 128px 153px;
23
+ }
24
+
25
+ /* ── idle:头部轻快小幅点动,比通用浮动更活泼 ── */
26
+ @keyframes dog-idle-perk {
27
+ 0%, 100% { transform: translateY(0); }
28
+ 50% { transform: translateY(-3px); }
29
+ }
30
+ .pet-idle #pet-body-group {
31
+ animation: dog-idle-perk 1.6s ease-in-out infinite;
32
+ }
33
+
34
+ /* ── mood-urging:舌头快速一伸一缩,像在催促着"快点快点" ── */
35
+ @keyframes dog-urging-tongue {
36
+ 0%, 100% { transform: scaleY(1); }
37
+ 50% { transform: scaleY(1.5); }
38
+ }
39
+ .mood-urging #pet-mouth {
40
+ animation: dog-urging-tongue 0.4s ease-in-out infinite;
41
+ transform-origin: 128px 153px;
42
+ }
@@ -39,7 +39,7 @@
39
39
 
40
40
  <!-- Nose + tongue -->
41
41
  <ellipse cx="128" cy="145" rx="9" ry="6" fill="#ff8a65" filter="url(#glow)"/>
42
- <rect x="120" y="153" width="16" height="14" rx="6" fill="#ff8fa3"/>
42
+ <rect id="pet-mouth" x="120" y="153" width="16" height="14" rx="6" fill="#ff8fa3"/>
43
43
 
44
44
  <!-- Legs / feet -->
45
45
  <rect x="76" y="200" width="20" height="26" rx="8" fill="url(#bodyGrad)" stroke="url(#accentGrad)" stroke-width="2.5"/>
@@ -0,0 +1,63 @@
1
+ /* 机械狐(robo-fox)专属演出:体现"狐"的狡黠与机敏,动作偏小巧、节奏偏快。
2
+ * 没有 #pet-arm-* 元素,故 tool_call 用头部抖动代替双臂摆动;
3
+ * 蓬松的尾巴在 SVG 里没有 id,这里通过 #pet-body-group 的偏转让尾巴自然跟着摇摆。 */
4
+
5
+ /* ── thinking:小角度歪头,像盯着某处揣摩,比通用 4° 更轻 ── */
6
+ @keyframes fox-think-cocked-head {
7
+ 0%, 100% { transform: rotate(0deg); }
8
+ 50% { transform: rotate(5deg); }
9
+ }
10
+ .pet-thinking #pet-body-group {
11
+ animation: fox-think-cocked-head 1.1s ease-in-out infinite;
12
+ transform-origin: 128px 125px;
13
+ }
14
+
15
+ /* ── idle:细微左右探身,模拟警觉地东张西望 ── */
16
+ @keyframes fox-idle-prowl {
17
+ 0%, 100% { transform: rotate(0deg); }
18
+ 25% { transform: rotate(-2deg); }
19
+ 75% { transform: rotate(2deg); }
20
+ }
21
+ .pet-idle #pet-body-group {
22
+ animation: fox-idle-prowl 3.4s ease-in-out infinite;
23
+ transform-origin: 128px 125px;
24
+ }
25
+
26
+ /* ── tool_call:头部快速左右抖动(代替双臂摆动),像在分析嗅探 ── */
27
+ @keyframes fox-tool-shake {
28
+ 0%, 100% { transform: rotate(0deg); }
29
+ 25% { transform: rotate(-4deg); }
30
+ 75% { transform: rotate(4deg); }
31
+ }
32
+ .pet-tool #pet-body-group {
33
+ animation: fox-tool-shake 0.35s ease-in-out infinite;
34
+ transform-origin: 128px 125px;
35
+ }
36
+
37
+ /* ── mood-bored:慢慢左右扫视,比 idle 幅度更大 ── */
38
+ @keyframes fox-bored-scan {
39
+ 0%, 100% { transform: rotate(-6deg); }
40
+ 50% { transform: rotate(6deg); }
41
+ }
42
+ .mood-bored #pet-body-group {
43
+ animation: fox-bored-scan 2.6s ease-in-out infinite;
44
+ transform-origin: 128px 125px;
45
+ }
46
+
47
+ /* ── mood-urging:歪头 + 嘴部快速张合(催促式"开口说话") ── */
48
+ @keyframes fox-urging-nod {
49
+ 0%, 100% { transform: rotate(0deg); }
50
+ 50% { transform: rotate(-6deg); }
51
+ }
52
+ .mood-urging #pet-body-group {
53
+ animation: fox-urging-nod 0.55s ease-in-out infinite;
54
+ transform-origin: 128px 125px;
55
+ }
56
+ @keyframes fox-urging-mouth {
57
+ 0%, 100% { transform: scaleY(1); }
58
+ 50% { transform: scaleY(1.6); }
59
+ }
60
+ .mood-urging #pet-mouth {
61
+ animation: fox-urging-mouth 0.55s ease-in-out infinite;
62
+ transform-origin: 128px 150px;
63
+ }
@@ -40,7 +40,7 @@
40
40
  </g>
41
41
 
42
42
  <!-- Sharp muzzle line -->
43
- <path d="M112 150 L128 158 L144 150" stroke="#ff7043" stroke-width="4" fill="none" stroke-linecap="round" filter="url(#glow)"/>
43
+ <path id="pet-mouth" d="M112 150 L128 158 L144 150" stroke="#ff7043" stroke-width="4" fill="none" stroke-linecap="round" filter="url(#glow)"/>
44
44
 
45
45
  <!-- Legs / feet -->
46
46
  <rect x="76" y="200" width="20" height="26" rx="8" fill="url(#bodyGrad)" stroke="url(#accentGrad)" stroke-width="2.5"/>
@@ -0,0 +1,61 @@
1
+ /* 机械熊猫(robo-panda)专属演出:体现"熊猫"的慵懒与迟缓,所有节奏都比通用更慢。
2
+ * 没有 #pet-arm-*,tool_call 改用身体大幅摇摆代替双臂摆动。 */
3
+
4
+ /* ── thinking:非常慢的小幅点头,像在打盹时梦到什么 ── */
5
+ @keyframes panda-think-drowsy {
6
+ 0%, 100% { transform: rotate(0deg); }
7
+ 50% { transform: rotate(-2deg); }
8
+ }
9
+ .pet-thinking #pet-body-group {
10
+ animation: panda-think-drowsy 2.4s ease-in-out infinite;
11
+ transform-origin: 128px 125px;
12
+ }
13
+
14
+ /* ── idle:非常慢的慵懒浮动,曲线比通用 3s 更沉 ── */
15
+ @keyframes panda-idle-lazy-float {
16
+ 0%, 100% { transform: translateY(0); }
17
+ 50% { transform: translateY(-3px); }
18
+ }
19
+ .pet-idle #pet-body-group {
20
+ animation: panda-idle-lazy-float 4.2s ease-in-out infinite;
21
+ }
22
+
23
+ /* ── tool_call:慢慢左右晃身(代替双臂),动作幅度大但迟缓,像在嚼竹子 ── */
24
+ @keyframes panda-tool-sway {
25
+ 0%, 100% { transform: rotate(0deg); }
26
+ 50% { transform: rotate(6deg); }
27
+ }
28
+ .pet-tool #pet-body-group {
29
+ animation: panda-tool-sway 1.2s ease-in-out infinite;
30
+ transform-origin: 128px 125px;
31
+ }
32
+
33
+ /* ── mood-tired:缓慢下沉 + 略微变暗,疲惫感比通用更浓 ── */
34
+ @keyframes panda-tired-sink {
35
+ 0%, 100% { transform: translateY(0); opacity: 1; }
36
+ 50% { transform: translateY(6px); opacity: 0.8; }
37
+ }
38
+ .mood-tired #pet-body-group {
39
+ animation: panda-tired-sink 4.8s ease-in-out infinite;
40
+ }
41
+
42
+ /* ── mood-bored:慢到极致的左右摇晃,像快睡着了 ── */
43
+ @keyframes panda-bored-sway {
44
+ 0%, 100% { transform: rotate(0deg); }
45
+ 50% { transform: rotate(3deg); }
46
+ }
47
+ .mood-bored #pet-body-group {
48
+ animation: panda-bored-sway 3.2s ease-in-out infinite;
49
+ transform-origin: 128px 125px;
50
+ }
51
+
52
+ /* ── done:慵懒但满足的小弹 ── */
53
+ @keyframes panda-done-soft-bounce {
54
+ 0% { transform: scale(1); }
55
+ 40% { transform: scale(1.05); }
56
+ 100% { transform: scale(1); }
57
+ }
58
+ .pet-done #pet-body-group {
59
+ animation: panda-done-soft-bounce 0.6s ease-out 1;
60
+ transform-origin: 128px 220px;
61
+ }
@@ -43,7 +43,7 @@
43
43
 
44
44
  <!-- Nose + mouth -->
45
45
  <ellipse cx="128" cy="142" rx="8" ry="6" fill="#161a1e"/>
46
- <rect x="112" y="150" width="32" height="5" rx="2.5" fill="#161a1e" fill-opacity="0.7"/>
46
+ <rect id="pet-mouth" x="112" y="150" width="32" height="5" rx="2.5" fill="#161a1e" fill-opacity="0.7"/>
47
47
 
48
48
  <!-- Legs / feet -->
49
49
  <rect x="76" y="200" width="20" height="26" rx="8" fill="#161a1e" stroke="url(#accentGrad)" stroke-width="2.5"/>
@@ -0,0 +1,88 @@
1
+ /* 机械猫头鹰(robo-owl)专属演出:体现"猫头鹰"的机警与睿智。
2
+ * 头身一体的体型让"转头巡视"成为招牌动作;
3
+ * 双翼作为 #pet-arm-* 在这里承担"扇翅"的语义而非"挥臂"。 */
4
+
5
+ /* ── thinking:慢速 360° 巡视(大角度旋转,因为体型方,看起来像头部旋转) ── */
6
+ @keyframes owl-think-slow-scan {
7
+ 0% { transform: rotate(0deg); }
8
+ 100% { transform: rotate(360deg); }
9
+ }
10
+ .pet-thinking #pet-body-group {
11
+ animation: owl-think-slow-scan 4s linear infinite;
12
+ transform-origin: 128px 140px;
13
+ }
14
+
15
+ /* ── idle:缓慢左右转头巡视 ── */
16
+ @keyframes owl-idle-turn {
17
+ 0%, 100% { transform: rotate(0deg); }
18
+ 25% { transform: rotate(-8deg); }
19
+ 75% { transform: rotate(8deg); }
20
+ }
21
+ .pet-idle #pet-body-group {
22
+ animation: owl-idle-turn 3.6s ease-in-out infinite;
23
+ transform-origin: 128px 140px;
24
+ }
25
+
26
+ /* ── tool_call:双翼大幅拍动代替通用"双臂小幅摆动" ── */
27
+ @keyframes owl-tool-wing-left {
28
+ 0%, 100% { transform: rotate(-12deg); }
29
+ 50% { transform: rotate(-30deg); }
30
+ }
31
+ @keyframes owl-tool-wing-right {
32
+ 0%, 100% { transform: rotate(12deg); }
33
+ 50% { transform: rotate(30deg); }
34
+ }
35
+ .pet-tool #pet-arm-left {
36
+ animation: owl-tool-wing-left 0.4s ease-in-out infinite;
37
+ transform-origin: 26px 160px;
38
+ }
39
+ .pet-tool #pet-arm-right {
40
+ animation: owl-tool-wing-right 0.4s ease-in-out infinite 0.2s;
41
+ transform-origin: 230px 160px;
42
+ }
43
+
44
+ /* ── mood-urging:急促的翅膀拍打 + 身体前倾 ── */
45
+ @keyframes owl-urging-wing-left {
46
+ 0%, 100% { transform: rotate(-12deg); }
47
+ 50% { transform: rotate(-40deg); }
48
+ }
49
+ @keyframes owl-urging-wing-right {
50
+ 0%, 100% { transform: rotate(12deg); }
51
+ 50% { transform: rotate(40deg); }
52
+ }
53
+ @keyframes owl-urging-lean {
54
+ 0%, 100% { transform: translateY(0) rotate(0deg); }
55
+ 50% { transform: translateY(-2px) rotate(-3deg); }
56
+ }
57
+ .mood-urging #pet-arm-left {
58
+ animation: owl-urging-wing-left 0.2s ease-in-out infinite;
59
+ transform-origin: 26px 160px;
60
+ }
61
+ .mood-urging #pet-arm-right {
62
+ animation: owl-urging-wing-right 0.2s ease-in-out infinite 0.1s;
63
+ transform-origin: 230px 160px;
64
+ }
65
+ .mood-urging #pet-body-group {
66
+ animation: owl-urging-lean 0.4s ease-in-out infinite;
67
+ transform-origin: 128px 140px;
68
+ }
69
+
70
+ /* ── done:展翅庆祝 ── */
71
+ @keyframes owl-done-spread-left {
72
+ 0% { transform: rotate(-12deg); }
73
+ 40% { transform: rotate(-50deg); }
74
+ 100% { transform: rotate(-12deg); }
75
+ }
76
+ @keyframes owl-done-spread-right {
77
+ 0% { transform: rotate(12deg); }
78
+ 40% { transform: rotate(50deg); }
79
+ 100% { transform: rotate(12deg); }
80
+ }
81
+ .pet-done #pet-arm-left {
82
+ animation: owl-done-spread-left 0.5s ease-out 1;
83
+ transform-origin: 26px 160px;
84
+ }
85
+ .pet-done #pet-arm-right {
86
+ animation: owl-done-spread-right 0.5s ease-out 1;
87
+ transform-origin: 230px 160px;
88
+ }
@@ -33,11 +33,11 @@
33
33
  </circle>
34
34
 
35
35
  <!-- Beak -->
36
- <path d="M120 156 L128 172 L136 156 Z" fill="#ffb74d"/>
36
+ <path id="pet-mouth" d="M120 156 L128 172 L136 156 Z" fill="#ffb74d"/>
37
37
 
38
38
  <!-- Folded wing arms(填充块面而非线条,末端贴身收圆) -->
39
- <ellipse cx="26" cy="160" rx="14" ry="30" transform="rotate(-12 26 160)" fill="url(#bodyGrad)" stroke="url(#accentGrad)" stroke-width="2.5"/>
40
- <ellipse cx="230" cy="160" rx="14" ry="30" transform="rotate(12 230 160)" fill="url(#bodyGrad)" stroke="url(#accentGrad)" stroke-width="2.5"/>
39
+ <ellipse id="pet-arm-left" cx="26" cy="160" rx="14" ry="30" transform="rotate(-12 26 160)" fill="url(#bodyGrad)" stroke="url(#accentGrad)" stroke-width="2.5"/>
40
+ <ellipse id="pet-arm-right" cx="230" cy="160" rx="14" ry="30" transform="rotate(12 230 160)" fill="url(#bodyGrad)" stroke="url(#accentGrad)" stroke-width="2.5"/>
41
41
 
42
42
  <!-- Feet / talons -->
43
43
  <rect x="76" y="200" width="20" height="24" rx="6" fill="url(#bodyGrad)" stroke="url(#accentGrad)" stroke-width="2.5"/>
@@ -0,0 +1,84 @@
1
+ /* 机械兔(robo-bunny)专属演出:体现"兔子"的轻快与活泼,节奏普遍偏快、幅度偏小。
2
+ * 注意:robo-bunny.svg 的 #pet-arm-left/right 自带 inline <animateTransform> 缓慢摆动,
3
+ * 这里在状态/mood class 下用更快的 keyframe 覆盖之;非覆盖状态下内置动画继续提供自然律动。 */
4
+
5
+ /* ── thinking:短促高频的小点头 ── */
6
+ @keyframes bunny-think-bob {
7
+ 0%, 100% { transform: rotate(0deg); }
8
+ 50% { transform: rotate(-3deg); }
9
+ }
10
+ .pet-thinking #pet-body-group {
11
+ animation: bunny-think-bob 0.6s ease-in-out infinite;
12
+ transform-origin: 128px 125px;
13
+ }
14
+
15
+ /* ── idle:轻微上下小跳,代替通用浮动 ── */
16
+ @keyframes bunny-idle-hop {
17
+ 0%, 100% { transform: translateY(0); }
18
+ 50% { transform: translateY(-8px); }
19
+ }
20
+ .pet-idle #pet-body-group {
21
+ animation: bunny-idle-hop 1.4s ease-in-out infinite;
22
+ }
23
+
24
+ /* ── tool_call:手臂快摆(覆盖内置慢摆),蹦跳式连续工作 ── */
25
+ @keyframes bunny-tool-arm-left {
26
+ 0%, 100% { transform: rotate(-18deg); }
27
+ 50% { transform: rotate(-40deg); }
28
+ }
29
+ @keyframes bunny-tool-arm-right {
30
+ 0%, 100% { transform: rotate(18deg); }
31
+ 50% { transform: rotate(40deg); }
32
+ }
33
+ .pet-tool #pet-arm-left {
34
+ animation: bunny-tool-arm-left 0.3s ease-in-out infinite;
35
+ transform-origin: 34px 130px;
36
+ }
37
+ .pet-tool #pet-arm-right {
38
+ animation: bunny-tool-arm-right 0.3s ease-in-out infinite 0.15s;
39
+ transform-origin: 222px 130px;
40
+ }
41
+
42
+ /* ── mood-tired:身体略微下沉,叠加在内置慢摆之上 ── */
43
+ @keyframes bunny-tired-sink {
44
+ 0%, 100% { transform: translateY(0); opacity: 1; }
45
+ 50% { transform: translateY(3px); opacity: 0.9; }
46
+ }
47
+ .mood-tired #pet-body-group {
48
+ animation: bunny-tired-sink 3.2s ease-in-out infinite;
49
+ }
50
+
51
+ /* ── mood-urging:高频小跳 + 急切摆臂 ── */
52
+ @keyframes bunny-urging-hop {
53
+ 0%, 100% { transform: translateY(0); }
54
+ 50% { transform: translateY(-6px); }
55
+ }
56
+ @keyframes bunny-urging-arm-left {
57
+ 0%, 100% { transform: rotate(-18deg); }
58
+ 50% { transform: rotate(-50deg); }
59
+ }
60
+ @keyframes bunny-urging-arm-right {
61
+ 0%, 100% { transform: rotate(18deg); }
62
+ 50% { transform: rotate(50deg); }
63
+ }
64
+ .mood-urging #pet-body-group {
65
+ animation: bunny-urging-hop 0.35s ease-in-out infinite;
66
+ }
67
+ .mood-urging #pet-arm-left {
68
+ animation: bunny-urging-arm-left 0.2s ease-in-out infinite;
69
+ transform-origin: 34px 130px;
70
+ }
71
+ .mood-urging #pet-arm-right {
72
+ animation: bunny-urging-arm-right 0.2s ease-in-out infinite 0.1s;
73
+ transform-origin: 222px 130px;
74
+ }
75
+
76
+ /* ── done:大弹跳一次 ── */
77
+ @keyframes bunny-done-bounce {
78
+ 0% { transform: translateY(0) scale(1); }
79
+ 40% { transform: translateY(-14px) scale(1.05); }
80
+ 100% { transform: translateY(0) scale(1); }
81
+ }
82
+ .pet-done #pet-body-group {
83
+ animation: bunny-done-bounce 0.5s ease-out 1;
84
+ }
@@ -43,10 +43,10 @@
43
43
  <path d="M122 148 L128 156 L134 148 Z" fill="#ff6ec7" filter="url(#glow)"/>
44
44
 
45
45
  <!-- Arms (gentle wave) -->
46
- <ellipse cx="34" cy="150" rx="12" ry="22" transform="rotate(-18 34 130)" fill="url(#bodyGrad)" stroke="url(#accentGrad)" stroke-width="2.5">
46
+ <ellipse id="pet-arm-left" cx="34" cy="150" rx="12" ry="22" transform="rotate(-18 34 130)" fill="url(#bodyGrad)" stroke="url(#accentGrad)" stroke-width="2.5">
47
47
  <animateTransform attributeName="transform" type="rotate" values="-18 34 130;-30 34 130;-18 34 130;-6 34 130;-18 34 130" keyTimes="0;0.25;0.5;0.75;1" dur="2.6s" repeatCount="indefinite"/>
48
48
  </ellipse>
49
- <ellipse cx="222" cy="150" rx="12" ry="22" transform="rotate(18 222 130)" fill="url(#bodyGrad)" stroke="url(#accentGrad)" stroke-width="2.5">
49
+ <ellipse id="pet-arm-right" cx="222" cy="150" rx="12" ry="22" transform="rotate(18 222 130)" fill="url(#bodyGrad)" stroke="url(#accentGrad)" stroke-width="2.5">
50
50
  <animateTransform attributeName="transform" type="rotate" values="18 222 130;30 222 130;18 222 130;6 222 130;18 222 130" keyTimes="0;0.25;0.5;0.75;1" dur="2.6s" repeatCount="indefinite"/>
51
51
  </ellipse>
52
52
 
@@ -0,0 +1,65 @@
1
+ /* 机械蛙(robo-frog)专属演出:利用"挤压/弹跳"这个青蛙的核心视觉语言,
2
+ * SVG 里没有 #pet-arm-*,tool_call 用整体压扁弹起代替通用双臂摆动。 */
3
+
4
+ /* ── thinking:嘴部开合(呱呱叫的雏形) ── */
5
+ @keyframes frog-think-mouth {
6
+ 0%, 100% { transform: scaleY(1); }
7
+ 50% { transform: scaleY(1.6); }
8
+ }
9
+ .pet-thinking #pet-mouth {
10
+ animation: frog-think-mouth 0.8s ease-in-out infinite;
11
+ transform-origin: 128px 150px;
12
+ }
13
+
14
+ /* ── idle:极轻微的鼓起呼吸 ── */
15
+ @keyframes frog-idle-breathe {
16
+ 0%, 100% { transform: scale(1); }
17
+ 50% { transform: scale(1.02); }
18
+ }
19
+ .pet-idle #pet-body-group {
20
+ animation: frog-idle-breathe 2.6s ease-in-out infinite;
21
+ transform-origin: 128px 200px;
22
+ }
23
+
24
+ /* ── tool_call:压扁弹起,代替双臂摆动,像青蛙蓄力跳 ── */
25
+ @keyframes frog-tool-squash {
26
+ 0%, 100% { transform: scaleY(1) scaleX(1); }
27
+ 30% { transform: scaleY(0.78) scaleX(1.15); }
28
+ 60% { transform: scaleY(1.18) scaleX(0.88); }
29
+ }
30
+ .pet-tool #pet-body-group {
31
+ animation: frog-tool-squash 0.55s ease-in-out infinite;
32
+ transform-origin: 128px 200px;
33
+ }
34
+
35
+ /* ── mood-urging:嘴部急速张合(急促呱呱催促) ── */
36
+ @keyframes frog-urging-mouth {
37
+ 0%, 100% { transform: scaleY(1); }
38
+ 50% { transform: scaleY(2.4); }
39
+ }
40
+ .mood-urging #pet-mouth {
41
+ animation: frog-urging-mouth 0.25s ease-in-out infinite;
42
+ transform-origin: 128px 150px;
43
+ }
44
+
45
+ /* ── mood-tired:身体整体慢慢压扁变矮,像没气了的蛙 ── */
46
+ @keyframes frog-tired-squash {
47
+ 0%, 100% { transform: scaleY(1); }
48
+ 50% { transform: scaleY(0.86); }
49
+ }
50
+ .mood-tired #pet-body-group {
51
+ animation: frog-tired-squash 4.4s ease-in-out infinite;
52
+ transform-origin: 128px 200px;
53
+ }
54
+
55
+ /* ── done:大跳跃一次 ── */
56
+ @keyframes frog-done-jump {
57
+ 0% { transform: translateY(0) scaleY(1); }
58
+ 30% { transform: translateY(0) scaleY(0.78) scaleX(1.15); }
59
+ 50% { transform: translateY(-18px) scaleY(1.1) scaleX(0.92); }
60
+ 100% { transform: translateY(0) scaleY(1); }
61
+ }
62
+ .pet-done #pet-body-group {
63
+ animation: frog-done-jump 0.55s ease-out 1;
64
+ transform-origin: 128px 200px;
65
+ }
@@ -12,7 +12,7 @@
12
12
  <feGaussianBlur stdDeviation="3" result="blur"/>
13
13
  <feMerge><feMergeNode in="blur"/><feMergeNode in="SourceGraphic"/></feMerge>
14
14
  </filter>
15
- </defs>
15
+ </defs>
16
16
  <g id="pet-body-group">
17
17
 
18
18
  <!-- Body / head (wide, squat) -->
@@ -30,10 +30,10 @@
30
30
 
31
31
  <!-- Screen mouth panel -->
32
32
  <rect x="60" y="110" width="136" height="72" rx="14" fill="#0a1420" stroke="#69f0ae" stroke-opacity="0.4" stroke-width="1.5"/>
33
- <path d="M76 150 Q128 176 180 150" stroke="url(#accentGrad)" stroke-width="5" fill="none" stroke-linecap="round" filter="url(#glow)"/>
33
+ <path id="pet-mouth" d="M76 150 Q128 176 180 150" stroke="url(#accentGrad)" stroke-width="5" fill="none" stroke-linecap="round" filter="url(#glow)"/>
34
34
 
35
35
  <!-- Bent frog legs -->
36
36
  <path d="M50 176 Q20 190 30 224 Q46 236 56 214" fill="url(#bodyGrad)" stroke="url(#accentGrad)" stroke-width="3"/>
37
37
  <path d="M206 176 Q236 190 226 224 Q210 236 200 214" fill="url(#bodyGrad)" stroke="url(#accentGrad)" stroke-width="3"/>
38
- </g>
38
+ </g>
39
39
  </svg>
@@ -0,0 +1,65 @@
1
+ /* 机械熊(robo-bear)专属演出:体现"熊"的笨重与迟缓,所有动作幅度大但慢半拍。
2
+ * 没有 #pet-arm-*,tool_call 改为大角度身体摇摆代替双臂摆动。 */
3
+
4
+ /* ── thinking:沉甸甸的大幅点头,模拟思考时整颗头都跟着动 ── */
5
+ @keyframes bear-think-heavy-nod {
6
+ 0%, 100% { transform: rotate(0deg); }
7
+ 50% { transform: rotate(7deg); }
8
+ }
9
+ .pet-thinking #pet-body-group {
10
+ animation: bear-think-heavy-nod 1.6s ease-in-out infinite;
11
+ transform-origin: 128px 125px;
12
+ }
13
+
14
+ /* ── idle:比通用更慢更沉的浮动 ── */
15
+ @keyframes bear-idle-heavy-float {
16
+ 0%, 100% { transform: translateY(0); }
17
+ 50% { transform: translateY(-4px); }
18
+ }
19
+ .pet-idle #pet-body-group {
20
+ animation: bear-idle-heavy-float 4s ease-in-out infinite;
21
+ }
22
+
23
+ /* ── tool_call:大幅左右晃身(代替双臂),动作慢但幅度大 ── */
24
+ @keyframes bear-tool-sway {
25
+ 0%, 100% { transform: rotate(0deg); }
26
+ 25% { transform: rotate(-8deg); }
27
+ 75% { transform: rotate(8deg); }
28
+ }
29
+ .pet-tool #pet-body-group {
30
+ animation: bear-tool-sway 1s ease-in-out infinite;
31
+ transform-origin: 128px 125px;
32
+ }
33
+
34
+ /* ── mood-urging:熊式大甩头 ── */
35
+ @keyframes bear-urging-shake {
36
+ 0%, 100% { transform: rotate(0deg); }
37
+ 25% { transform: rotate(-10deg); }
38
+ 75% { transform: rotate(10deg); }
39
+ }
40
+ .mood-urging #pet-body-group {
41
+ animation: bear-urging-shake 0.5s ease-in-out infinite;
42
+ transform-origin: 128px 125px;
43
+ }
44
+
45
+ /* ── mood-bored:慢悠悠的左右晃,像无聊到打哈欠 ── */
46
+ @keyframes bear-bored-sway {
47
+ 0%, 100% { transform: rotate(0deg); }
48
+ 50% { transform: rotate(5deg); }
49
+ }
50
+ .mood-bored #pet-body-group {
51
+ animation: bear-bored-sway 3.4s ease-in-out infinite;
52
+ transform-origin: 128px 125px;
53
+ }
54
+
55
+ /* ── done:笨重但兴奋的小弹跳 ── */
56
+ @keyframes bear-done-stomp {
57
+ 0% { transform: translateY(0) scale(1); }
58
+ 40% { transform: translateY(0) scale(0.94); }
59
+ 60% { transform: translateY(-10px) scale(1.06); }
60
+ 100% { transform: translateY(0) scale(1); }
61
+ }
62
+ .pet-done #pet-body-group {
63
+ animation: bear-done-stomp 0.6s ease-out 1;
64
+ transform-origin: 128px 220px;
65
+ }