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.
- package/assets/pets/01-robo-cat.motion.css +42 -0
- package/assets/pets/01-robo-cat.svg +2 -2
- package/assets/pets/02-robo-dog.motion.css +42 -0
- package/assets/pets/02-robo-dog.svg +1 -1
- package/assets/pets/03-robo-fox.motion.css +63 -0
- package/assets/pets/03-robo-fox.svg +1 -1
- package/assets/pets/04-robo-panda.motion.css +61 -0
- package/assets/pets/04-robo-panda.svg +1 -1
- package/assets/pets/05-robo-owl.motion.css +88 -0
- package/assets/pets/05-robo-owl.svg +3 -3
- package/assets/pets/06-robo-bunny.motion.css +84 -0
- package/assets/pets/06-robo-bunny.svg +2 -2
- package/assets/pets/07-robo-frog.motion.css +65 -0
- package/assets/pets/07-robo-frog.svg +3 -3
- package/assets/pets/08-robo-bear.motion.css +65 -0
- package/assets/pets/09-robo-penguin.motion.css +94 -0
- package/assets/pets/09-robo-penguin.svg +3 -3
- package/assets/pets/10-robo-dino.motion.css +91 -0
- package/assets/pets/10-robo-dino.svg +3 -3
- package/assets/pets/11-slime-blob.motion.css +44 -0
- package/assets/pets/11-slime-blob.svg +3 -3
- package/assets/pets/12-ghost-byte.motion.css +73 -0
- package/assets/pets/12-ghost-byte.svg +3 -3
- package/assets/pets/13-cactus-bot.motion.css +90 -0
- package/assets/pets/13-cactus-bot.svg +2 -2
- package/assets/pets/14-crystal-bot.motion.css +63 -0
- package/assets/pets/15-satellite-bot.motion.css +72 -0
- package/assets/pets/15-satellite-bot.svg +1 -1
- package/assets/pets/16-jellyfish-bot.motion.css +71 -0
- package/assets/pets/16-jellyfish-bot.svg +3 -3
- package/assets/pets/17-mushroom-bot.motion.css +65 -0
- package/assets/pets/18-star-bot.motion.css +72 -0
- package/assets/pets/18-star-bot.svg +3 -3
- package/assets/pets/manifest.json +139 -25
- package/dist/assets/pets/01-robo-cat.motion.css +42 -0
- package/dist/assets/pets/01-robo-cat.svg +2 -2
- package/dist/assets/pets/02-robo-dog.motion.css +42 -0
- package/dist/assets/pets/02-robo-dog.svg +1 -1
- package/dist/assets/pets/03-robo-fox.motion.css +63 -0
- package/dist/assets/pets/03-robo-fox.svg +1 -1
- package/dist/assets/pets/04-robo-panda.motion.css +61 -0
- package/dist/assets/pets/04-robo-panda.svg +1 -1
- package/dist/assets/pets/05-robo-owl.motion.css +88 -0
- package/dist/assets/pets/05-robo-owl.svg +3 -3
- package/dist/assets/pets/06-robo-bunny.motion.css +84 -0
- package/dist/assets/pets/06-robo-bunny.svg +2 -2
- package/dist/assets/pets/07-robo-frog.motion.css +65 -0
- package/dist/assets/pets/07-robo-frog.svg +3 -3
- package/dist/assets/pets/08-robo-bear.motion.css +65 -0
- package/dist/assets/pets/09-robo-penguin.motion.css +94 -0
- package/dist/assets/pets/09-robo-penguin.svg +3 -3
- package/dist/assets/pets/10-robo-dino.motion.css +91 -0
- package/dist/assets/pets/10-robo-dino.svg +3 -3
- package/dist/assets/pets/11-slime-blob.motion.css +44 -0
- package/dist/assets/pets/11-slime-blob.svg +3 -3
- package/dist/assets/pets/12-ghost-byte.motion.css +73 -0
- package/dist/assets/pets/12-ghost-byte.svg +3 -3
- package/dist/assets/pets/13-cactus-bot.motion.css +90 -0
- package/dist/assets/pets/13-cactus-bot.svg +2 -2
- package/dist/assets/pets/14-crystal-bot.motion.css +63 -0
- package/dist/assets/pets/15-satellite-bot.motion.css +72 -0
- package/dist/assets/pets/15-satellite-bot.svg +1 -1
- package/dist/assets/pets/16-jellyfish-bot.motion.css +71 -0
- package/dist/assets/pets/16-jellyfish-bot.svg +3 -3
- package/dist/assets/pets/17-mushroom-bot.motion.css +65 -0
- package/dist/assets/pets/18-star-bot.motion.css +72 -0
- package/dist/assets/pets/18-star-bot.svg +3 -3
- package/dist/assets/pets/manifest.json +139 -25
- package/dist/assets/tray-icon.png +0 -0
- package/dist/e2e-mood-check.js +150 -0
- package/dist/main.js +53 -2
- package/dist/mood-current-state.test.js +55 -0
- package/dist/mood-determinism.pbt.js +66 -0
- package/dist/mood-tracker-timing.test.js +70 -0
- package/dist/mood-tracker.js +41 -0
- package/dist/mood-tracker.test.js +56 -0
- package/dist/mood.js +102 -0
- package/dist/mood.pbt.js +52 -0
- package/dist/quips.js +59 -0
- package/dist/quips.test.js +98 -0
- package/dist/renderer/dom-mood.js +55 -0
- package/dist/renderer/dom-mood.test.js +105 -0
- package/dist/renderer/index.html +2 -0
- package/dist/renderer/preload.js +20 -2
- package/dist/renderer/renderer.js +29 -9
- package/dist/renderer/style.css +89 -0
- package/dist/skins.js +50 -1
- package/dist/skins.test.js +112 -0
- package/package.json +1 -1
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/* 水母兽(jellyfish-bot)专属演出:体现"水母"的飘逸与梦幻,所有动作都是柔缓的弧线漂移。
|
|
2
|
+
* SVG 里触手已自带 <animate> 形变,这里不动触手,只对 #pet-body-group 做整体节奏;
|
|
3
|
+
* 没有 #pet-arm-*,tool_call 改用身体左右柔摆代替双臂摆动。 */
|
|
4
|
+
|
|
5
|
+
/* ── idle:缓慢垂直上下漂移 ── */
|
|
6
|
+
@keyframes jellyfish-idle-drift {
|
|
7
|
+
0%, 100% { transform: translateY(0); }
|
|
8
|
+
50% { transform: translateY(-7px); }
|
|
9
|
+
}
|
|
10
|
+
.pet-idle #pet-body-group {
|
|
11
|
+
animation: jellyfish-idle-drift 3.2s ease-in-out infinite;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/* ── thinking:垂直 + 水平小幅弧线漂移,模拟随水流思考 ── */
|
|
15
|
+
@keyframes jellyfish-think-drift {
|
|
16
|
+
0%, 100% { transform: translate(0, 0); }
|
|
17
|
+
25% { transform: translate(-3px, -4px); }
|
|
18
|
+
50% { transform: translate(0, -7px); }
|
|
19
|
+
75% { transform: translate(3px, -4px); }
|
|
20
|
+
}
|
|
21
|
+
.pet-thinking #pet-body-group {
|
|
22
|
+
animation: jellyfish-think-drift 3s ease-in-out infinite;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/* ── tool_call:身体柔摆(代替双臂) ── */
|
|
26
|
+
@keyframes jellyfish-tool-sway {
|
|
27
|
+
0%, 100% { transform: rotate(-4deg); }
|
|
28
|
+
50% { transform: rotate(4deg); }
|
|
29
|
+
}
|
|
30
|
+
.pet-tool #pet-body-group {
|
|
31
|
+
animation: jellyfish-tool-sway 0.7s ease-in-out infinite;
|
|
32
|
+
transform-origin: 128px 130px;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/* ── mood-urging:快速上下窜动 + 嘴部张合 ── */
|
|
36
|
+
@keyframes jellyfish-urging-surge {
|
|
37
|
+
0%, 100% { transform: translateY(0); }
|
|
38
|
+
50% { transform: translateY(-9px); }
|
|
39
|
+
}
|
|
40
|
+
@keyframes jellyfish-urging-mouth {
|
|
41
|
+
0%, 100% { transform: scaleY(1); }
|
|
42
|
+
50% { transform: scaleY(1.5); }
|
|
43
|
+
}
|
|
44
|
+
.mood-urging #pet-body-group {
|
|
45
|
+
animation: jellyfish-urging-surge 0.4s ease-in-out infinite;
|
|
46
|
+
}
|
|
47
|
+
.mood-urging #pet-mouth {
|
|
48
|
+
animation: jellyfish-urging-mouth 0.4s ease-in-out infinite;
|
|
49
|
+
transform-origin: 128px 104px;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/* ── mood-tired:慢慢沉下去 + 透明度下降 ── */
|
|
53
|
+
@keyframes jellyfish-tired-sink {
|
|
54
|
+
0%, 100% { transform: translateY(0); opacity: 1; }
|
|
55
|
+
50% { transform: translateY(5px); opacity: 0.7; }
|
|
56
|
+
}
|
|
57
|
+
.mood-tired #pet-body-group {
|
|
58
|
+
animation: jellyfish-tired-sink 4.4s ease-in-out infinite;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/* ── done:整只小水母轻快地向下压一次再弹回 ── */
|
|
62
|
+
@keyframes jellyfish-done-pulse {
|
|
63
|
+
0% { transform: scale(1); }
|
|
64
|
+
40% { transform: scale(0.92) translateY(2px); }
|
|
65
|
+
70% { transform: scale(1.08) translateY(-4px); }
|
|
66
|
+
100% { transform: scale(1); }
|
|
67
|
+
}
|
|
68
|
+
.pet-done #pet-body-group {
|
|
69
|
+
animation: jellyfish-done-pulse 0.55s ease-out 1;
|
|
70
|
+
transform-origin: 128px 130px;
|
|
71
|
+
}
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
<feGaussianBlur stdDeviation="3" result="blur"/>
|
|
9
9
|
<feMerge><feMergeNode in="blur"/><feMergeNode in="SourceGraphic"/></feMerge>
|
|
10
10
|
</filter>
|
|
11
|
-
</defs>
|
|
11
|
+
</defs>
|
|
12
12
|
<g id="pet-body-group">
|
|
13
13
|
|
|
14
14
|
<!-- Dome head -->
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
<circle cx="102" cy="86" r="8" fill="#0a1420"/>
|
|
21
21
|
<circle cx="154" cy="86" r="8" fill="#0a1420"/>
|
|
22
22
|
</g>
|
|
23
|
-
<path d="M112 104 Q128 114 144 104" stroke="#0a1420" stroke-width="3" fill="none" stroke-linecap="round"/>
|
|
23
|
+
<path id="pet-mouth" d="M112 104 Q128 114 144 104" stroke="#0a1420" stroke-width="3" fill="none" stroke-linecap="round"/>
|
|
24
24
|
|
|
25
25
|
<!-- Tentacles -->
|
|
26
26
|
<path d="M64 110 Q56 150 66 190 Q72 210 62 232" stroke="#ba68c8" stroke-width="7" fill="none" stroke-linecap="round">
|
|
@@ -43,5 +43,5 @@
|
|
|
43
43
|
<circle cx="66" cy="170" r="3" fill="#e040fb" filter="url(#glow)"/>
|
|
44
44
|
<circle cx="132" cy="180" r="3" fill="#e040fb" filter="url(#glow)"/>
|
|
45
45
|
<circle cx="196" cy="170" r="3" fill="#e040fb" filter="url(#glow)"/>
|
|
46
|
-
</g>
|
|
46
|
+
</g>
|
|
47
47
|
</svg>
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/* 菌菇兽(mushroom-bot)专属演出:体现"蘑菇"的弹性与Q弹,所有动作都是"弹"或"压"。
|
|
2
|
+
* 没有 #pet-arm-* 和 #pet-mouth,所有动作只能作用在 #pet-body-group 整体;
|
|
3
|
+
* 高度对称、底下两根脚,可以用 ground origin 做压扁弹起。 */
|
|
4
|
+
|
|
5
|
+
/* ── idle:缓慢的"呼吸式"上下小弹(比通用浮动更有蘑菇的Q弹) ── */
|
|
6
|
+
@keyframes mushroom-idle-spring {
|
|
7
|
+
0%, 100% { transform: translateY(0); }
|
|
8
|
+
50% { transform: translateY(-5px); }
|
|
9
|
+
}
|
|
10
|
+
.pet-idle #pet-body-group {
|
|
11
|
+
animation: mushroom-idle-spring 2.4s ease-in-out infinite;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/* ── thinking:上下小幅点头,根部为支点(整颗菌盖跟着摆) ── */
|
|
15
|
+
@keyframes mushroom-think-tilt {
|
|
16
|
+
0%, 100% { transform: rotate(0deg); }
|
|
17
|
+
25% { transform: rotate(-3deg); }
|
|
18
|
+
75% { transform: rotate(3deg); }
|
|
19
|
+
}
|
|
20
|
+
.pet-thinking #pet-body-group {
|
|
21
|
+
animation: mushroom-think-tilt 1.1s ease-in-out infinite;
|
|
22
|
+
transform-origin: 128px 240px;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/* ── tool_call:整体左右小摇摆(代替双臂) ── */
|
|
26
|
+
@keyframes mushroom-tool-sway {
|
|
27
|
+
0%, 100% { transform: rotate(-5deg); }
|
|
28
|
+
50% { transform: rotate(5deg); }
|
|
29
|
+
}
|
|
30
|
+
.pet-tool #pet-body-group {
|
|
31
|
+
animation: mushroom-tool-sway 0.45s ease-in-out infinite;
|
|
32
|
+
transform-origin: 128px 240px;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/* ── mood-urging:急促的连续小弹跳 ── */
|
|
36
|
+
@keyframes mushroom-urging-bounce {
|
|
37
|
+
0%, 100% { transform: translateY(0) scaleY(1); }
|
|
38
|
+
50% { transform: translateY(-3px) scaleY(0.94); }
|
|
39
|
+
}
|
|
40
|
+
.mood-urging #pet-body-group {
|
|
41
|
+
animation: mushroom-urging-bounce 0.28s ease-in-out infinite;
|
|
42
|
+
transform-origin: 128px 240px;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/* ── mood-tired:慢慢萎缩变矮 ── */
|
|
46
|
+
@keyframes mushroom-tired-shrink {
|
|
47
|
+
0%, 100% { transform: scaleY(1); opacity: 1; }
|
|
48
|
+
50% { transform: scaleY(0.92); opacity: 0.85; }
|
|
49
|
+
}
|
|
50
|
+
.mood-tired #pet-body-group {
|
|
51
|
+
animation: mushroom-tired-shrink 4.4s ease-in-out infinite;
|
|
52
|
+
transform-origin: 128px 240px;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/* ── done:大弹跳 + 落下一次 ── */
|
|
56
|
+
@keyframes mushroom-done-hop {
|
|
57
|
+
0% { transform: translateY(0) scaleY(1); }
|
|
58
|
+
30% { transform: translateY(0) scaleY(0.8) scaleX(1.12); }
|
|
59
|
+
60% { transform: translateY(-16px) scaleY(1.05) scaleX(0.95); }
|
|
60
|
+
100% { transform: translateY(0) scaleY(1); }
|
|
61
|
+
}
|
|
62
|
+
.pet-done #pet-body-group {
|
|
63
|
+
animation: mushroom-done-hop 0.55s ease-out 1;
|
|
64
|
+
transform-origin: 128px 240px;
|
|
65
|
+
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/* 星星兽(star-bot)专属演出:体现"星"的闪光与魔法,动作以旋转/脉冲为主。
|
|
2
|
+
* SVG 自带 4s 慢速正负 6° 摆动(.pet-idle 时被替换);没有 #pet-arm-*;
|
|
3
|
+
* 整颗星就是身体,所有 transform 都以五角星中心 (128,128) 为原点。 */
|
|
4
|
+
|
|
5
|
+
/* ── idle:保留并替换内置慢摆为"原地悬停" ── */
|
|
6
|
+
@keyframes star-idle-hover {
|
|
7
|
+
0%, 100% { transform: translateY(0) rotate(0deg); }
|
|
8
|
+
50% { transform: translateY(-5px) rotate(0deg); }
|
|
9
|
+
}
|
|
10
|
+
.pet-idle #pet-body-group {
|
|
11
|
+
animation: star-idle-hover 3s ease-in-out infinite;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/* ── thinking:慢速连续旋转,像在展示星芒 ── */
|
|
15
|
+
@keyframes star-think-spin {
|
|
16
|
+
0% { transform: rotate(0deg); }
|
|
17
|
+
100% { transform: rotate(360deg); }
|
|
18
|
+
}
|
|
19
|
+
.pet-thinking #pet-body-group {
|
|
20
|
+
animation: star-think-spin 4s linear infinite;
|
|
21
|
+
transform-origin: 128px 128px;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/* ── tool_call:快速左右摇摆(代替双臂摆动) ── */
|
|
25
|
+
@keyframes star-tool-sway {
|
|
26
|
+
0%, 100% { transform: rotate(-8deg); }
|
|
27
|
+
50% { transform: rotate(8deg); }
|
|
28
|
+
}
|
|
29
|
+
.pet-tool #pet-body-group {
|
|
30
|
+
animation: star-tool-sway 0.4s ease-in-out infinite;
|
|
31
|
+
transform-origin: 128px 128px;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/* ── mood-urging:急速脉冲式缩放 + 嘴部跟随张合 ── */
|
|
35
|
+
@keyframes star-urging-pulse {
|
|
36
|
+
0%, 100% { transform: scale(1); }
|
|
37
|
+
50% { transform: scale(1.12); }
|
|
38
|
+
}
|
|
39
|
+
@keyframes star-urging-mouth {
|
|
40
|
+
0%, 100% { transform: scaleY(1); }
|
|
41
|
+
50% { transform: scaleY(1.5); }
|
|
42
|
+
}
|
|
43
|
+
.mood-urging #pet-body-group {
|
|
44
|
+
animation: star-urging-pulse 0.32s ease-in-out infinite;
|
|
45
|
+
transform-origin: 128px 128px;
|
|
46
|
+
}
|
|
47
|
+
.mood-urging #pet-mouth {
|
|
48
|
+
animation: star-urging-mouth 0.32s ease-in-out infinite;
|
|
49
|
+
transform-origin: 128px 148px;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/* ── mood-frustrated:暴怒式自转 + 脉冲(替换通用横向抖动) ── */
|
|
53
|
+
@keyframes star-frustrated-spin {
|
|
54
|
+
0% { transform: rotate(0deg) scale(1); }
|
|
55
|
+
50% { transform: rotate(180deg) scale(0.92); }
|
|
56
|
+
100% { transform: rotate(360deg) scale(1); }
|
|
57
|
+
}
|
|
58
|
+
.mood-frustrated #pet-body-group {
|
|
59
|
+
animation: star-frustrated-spin 0.4s linear infinite;
|
|
60
|
+
transform-origin: 128px 128px;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/* ── done:Twinkle 爆发(放大 + 收缩 + 旋转一次) ── */
|
|
64
|
+
@keyframes star-done-twinkle {
|
|
65
|
+
0% { transform: scale(1) rotate(0deg); }
|
|
66
|
+
40% { transform: scale(1.2) rotate(60deg); }
|
|
67
|
+
100% { transform: scale(1) rotate(0deg); }
|
|
68
|
+
}
|
|
69
|
+
.pet-done #pet-body-group {
|
|
70
|
+
animation: star-done-twinkle 0.5s ease-out 1;
|
|
71
|
+
transform-origin: 128px 128px;
|
|
72
|
+
}
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
<feGaussianBlur stdDeviation="3" result="blur"/>
|
|
9
9
|
<feMerge><feMergeNode in="blur"/><feMergeNode in="SourceGraphic"/></feMerge>
|
|
10
10
|
</filter>
|
|
11
|
-
</defs>
|
|
11
|
+
</defs>
|
|
12
12
|
<g id="pet-body-group">
|
|
13
13
|
|
|
14
14
|
<!-- Star body: 5-point star -->
|
|
@@ -40,6 +40,6 @@
|
|
|
40
40
|
</g>
|
|
41
41
|
|
|
42
42
|
<!-- Smile -->
|
|
43
|
-
<path d="M114 148 Q128 158 142 148" stroke="#ffe082" stroke-width="3" fill="none" stroke-linecap="round"/>
|
|
44
|
-
</g>
|
|
43
|
+
<path id="pet-mouth" d="M114 148 Q128 158 142 148" stroke="#ffe082" stroke-width="3" fill="none" stroke-linecap="round"/>
|
|
44
|
+
</g>
|
|
45
45
|
</svg>
|
|
@@ -1,25 +1,139 @@
|
|
|
1
|
-
{
|
|
2
|
-
"_description": "候选桌宠素材索引,供未来 desktop-pet '选皮' 功能读取。当前 packages/pet-app 实现仅使用 assets/mascot.svg(单一形象+CSS状态动画),这些素材是为后续换皮功能预留的候选库。",
|
|
3
|
-
"viewBox": "0 0 256 256",
|
|
4
|
-
"style": "赛博终端风,深色机身(#1b263b/#0d1b2a)+ 屏幕脸(黑底彩色像素眼,呼吸/眨眼动画),与 assets/mascot.svg 视觉语言一致",
|
|
5
|
-
"pets": [
|
|
6
|
-
{ "id": "robo-cat", "file": "01-robo-cat.svg", "name": "机械猫", "accent": "#2afadf"
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
{ "id": "robo-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
{ "id": "
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
1
|
+
{
|
|
2
|
+
"_description": "候选桌宠素材索引,供未来 desktop-pet '选皮' 功能读取。当前 packages/pet-app 实现仅使用 assets/mascot.svg(单一形象+CSS状态动画),这些素材是为后续换皮功能预留的候选库。",
|
|
3
|
+
"viewBox": "0 0 256 256",
|
|
4
|
+
"style": "赛博终端风,深色机身(#1b263b/#0d1b2a)+ 屏幕脸(黑底彩色像素眼,呼吸/眨眼动画),与 assets/mascot.svg 视觉语言一致",
|
|
5
|
+
"pets": [
|
|
6
|
+
{ "id": "robo-cat", "file": "01-robo-cat.svg", "name": "机械猫", "accent": "#2afadf",
|
|
7
|
+
"motionFile": "01-robo-cat.motion.css",
|
|
8
|
+
"quips": {
|
|
9
|
+
"tired": ["猫猫要趴一下…", "喵…有点累了,尾巴都垂下来了"],
|
|
10
|
+
"bored": ["理理毛,顺便等你", "尾巴甩甩,好无聊喵"],
|
|
11
|
+
"urging": ["喵?还没好吗", "尾巴都等急了喵"]
|
|
12
|
+
} },
|
|
13
|
+
{ "id": "robo-dog", "file": "02-robo-dog.svg", "name": "机械犬", "accent": "#ffb74d",
|
|
14
|
+
"motionFile": "02-robo-dog.motion.css",
|
|
15
|
+
"quips": {
|
|
16
|
+
"bored": ["打了个哈欠,好无聊呀", "尾巴都不知道摇给谁看了"],
|
|
17
|
+
"urging": ["快点快点,舌头都伸出来啦", "汪!还在等你呢"],
|
|
18
|
+
"flustered": ["汪汪汪,有点忙不过来了", "尾巴摇得比脑子转得快"]
|
|
19
|
+
} },
|
|
20
|
+
{ "id": "robo-fox", "file": "03-robo-fox.svg", "name": "机械狐", "accent": "#ff7043",
|
|
21
|
+
"motionFile": "03-robo-fox.motion.css",
|
|
22
|
+
"quips": {
|
|
23
|
+
"thinking": ["嗅嗅…好像有什么线索喵…不对,狐狐嗅嗅"],
|
|
24
|
+
"bored": ["尾巴都扫累了,还是没动静"],
|
|
25
|
+
"urging": ["喂喂,狐狸都急得直摇尾巴了"]
|
|
26
|
+
} },
|
|
27
|
+
{ "id": "robo-panda", "file": "04-robo-panda.svg", "name": "机械熊猫", "accent": "#2afadf",
|
|
28
|
+
"motionFile": "04-robo-panda.motion.css",
|
|
29
|
+
"quips": {
|
|
30
|
+
"tired": ["呜…竹子嚼完了,想眯一会儿"],
|
|
31
|
+
"bored": ["翻个身…啊,翻不动"],
|
|
32
|
+
"urging": ["嗯…?完了吗?让我再翻个身想想"]
|
|
33
|
+
} },
|
|
34
|
+
{ "id": "robo-owl", "file": "05-robo-owl.svg", "name": "机械猫头鹰", "accent": "#7c4dff",
|
|
35
|
+
"motionFile": "05-robo-owl.motion.css",
|
|
36
|
+
"quips": {
|
|
37
|
+
"bored": ["咕咕…360° 巡视中", "夜里都飞完了,白天可困"],
|
|
38
|
+
"urging": ["扇翅膀提示你,别再让我咕咕了"]
|
|
39
|
+
} },
|
|
40
|
+
{ "id": "robo-bunny", "file": "06-robo-bunny.svg", "name": "机械兔", "accent": "#ff6ec7",
|
|
41
|
+
"motionFile": "06-robo-bunny.motion.css",
|
|
42
|
+
"quips": {
|
|
43
|
+
"tired": ["耳朵都耷拉下来了…"],
|
|
44
|
+
"bored": ["蹦跶蹦跶!…啊,又没意思了"],
|
|
45
|
+
"urging": ["蹦蹦蹦!好了没呀"]
|
|
46
|
+
} },
|
|
47
|
+
{ "id": "robo-frog", "file": "07-robo-frog.svg", "name": "机械蛙", "accent": "#00e676",
|
|
48
|
+
"motionFile": "07-robo-frog.motion.css",
|
|
49
|
+
"quips": {
|
|
50
|
+
"thinking": ["呱…再想想"],
|
|
51
|
+
"bored": ["蹲得腿都麻了呱…"],
|
|
52
|
+
"urging": ["呱呱呱!快跳到下一题了呱"]
|
|
53
|
+
} },
|
|
54
|
+
{ "id": "robo-bear", "file": "08-robo-bear.svg", "name": "机械熊", "accent": "#ffa726",
|
|
55
|
+
"motionFile": "08-robo-bear.motion.css",
|
|
56
|
+
"quips": {
|
|
57
|
+
"tired": ["冬眠时间快到了…zzZ"],
|
|
58
|
+
"bored": ["蜂蜜都被我吃完了,无聊"],
|
|
59
|
+
"urging": ["熊!都!要!等!不!住!了!"]
|
|
60
|
+
} },
|
|
61
|
+
{ "id": "robo-penguin", "file": "09-robo-penguin.svg", "name": "机械企鹅", "accent": "#42a5f5",
|
|
62
|
+
"motionFile": "09-robo-penguin.motion.css",
|
|
63
|
+
"quips": {
|
|
64
|
+
"bored": ["左右摇,左右摇…站久了脚好冷"],
|
|
65
|
+
"urging": ["嘎嘎!鳍都拍红了!"],
|
|
66
|
+
"tired": ["南极了,太冷,想躺平"]
|
|
67
|
+
} },
|
|
68
|
+
{ "id": "robo-dino", "file": "10-robo-dino.svg", "name": "机械龙", "accent": "#00c853",
|
|
69
|
+
"motionFile": "10-robo-dino.motion.css",
|
|
70
|
+
"quips": {
|
|
71
|
+
"frustrated": ["嗷呜!侏罗纪的怒火在燃烧!"],
|
|
72
|
+
"urging": ["跺脚!跺脚!小短腿都跺出火星了!"]
|
|
73
|
+
},
|
|
74
|
+
"stateQuips": {
|
|
75
|
+
"done": ["哼,这次算你过关,本龙勉强点头"],
|
|
76
|
+
"aborted": ["嗷!本龙还没出手呢!"],
|
|
77
|
+
"error": ["本龙摔了一跤,爬起来继续"]
|
|
78
|
+
} },
|
|
79
|
+
{ "id": "slime-blob", "file": "11-slime-blob.svg", "name": "史莱姆", "accent": "#00acc1",
|
|
80
|
+
"motionFile": "11-slime-blob.motion.css",
|
|
81
|
+
"quips": {
|
|
82
|
+
"tired": ["软软地瘫下去了…", "身体有点撑不住形状了"],
|
|
83
|
+
"urging": ["晃一晃,还在等你哦", "抖一抖,催你一下"]
|
|
84
|
+
} },
|
|
85
|
+
{ "id": "ghost-byte", "file": "12-ghost-byte.svg", "name": "字节幽灵", "accent": "#4dd0e1",
|
|
86
|
+
"motionFile": "12-ghost-byte.motion.css",
|
|
87
|
+
"quips": {
|
|
88
|
+
"tired": ["电量耗尽了…要散了…"],
|
|
89
|
+
"bored": ["飘来飘去,连 bug 都飘光了"],
|
|
90
|
+
"urging": ["呜——呜——快看我一眼"]
|
|
91
|
+
} },
|
|
92
|
+
{ "id": "cactus-bot", "file": "13-cactus-bot.svg", "name": "仙人掌兽", "accent": "#66bb6a",
|
|
93
|
+
"motionFile": "13-cactus-bot.motion.css",
|
|
94
|
+
"quips": {
|
|
95
|
+
"bored": ["晒太阳晒到刺都软了"],
|
|
96
|
+
"tired": ["缺水…缺人理…"],
|
|
97
|
+
"urging": ["刺都竖起来了,快点快点"]
|
|
98
|
+
} },
|
|
99
|
+
{ "id": "crystal-bot", "file": "14-crystal-bot.svg", "name": "水晶精灵", "accent": "#7c4dff",
|
|
100
|
+
"motionFile": "14-crystal-bot.motion.css",
|
|
101
|
+
"quips": {
|
|
102
|
+
"bored": ["折射中…请勿直视"],
|
|
103
|
+
"tired": ["光谱变暗了…能量要充电"],
|
|
104
|
+
"urging": ["折射出警示光!快!快!"]
|
|
105
|
+
} },
|
|
106
|
+
{ "id": "satellite-bot", "file": "15-satellite-bot.svg", "name": "卫星兽", "accent": "#42a5f5",
|
|
107
|
+
"motionFile": "15-satellite-bot.motion.css",
|
|
108
|
+
"quips": {
|
|
109
|
+
"bored": ["轨道上只剩我一只,寂寞"],
|
|
110
|
+
"tired": ["太阳能板收起来了,需要补光"],
|
|
111
|
+
"urging": ["哔哔哔!信号强到溢出!"]
|
|
112
|
+
} },
|
|
113
|
+
{ "id": "jellyfish-bot", "file": "16-jellyfish-bot.svg", "name": "水母兽", "accent": "#ba68c8",
|
|
114
|
+
"motionFile": "16-jellyfish-bot.motion.css",
|
|
115
|
+
"quips": {
|
|
116
|
+
"tired": ["随波逐流,飘到没力气"],
|
|
117
|
+
"bored": ["深海里一只水母,在发呆"],
|
|
118
|
+
"urging": ["刺一下!刺一下!…啊我没有刺"]
|
|
119
|
+
} },
|
|
120
|
+
{ "id": "mushroom-bot", "file": "17-mushroom-bot.svg", "name": "菌菇兽", "accent": "#c62828",
|
|
121
|
+
"motionFile": "17-mushroom-bot.motion.css",
|
|
122
|
+
"quips": {
|
|
123
|
+
"tired": ["菌盖都瘪了,要孢子休了"],
|
|
124
|
+
"bored": ["在森林角落,洒了一把无聊的孢子"],
|
|
125
|
+
"urging": ["蹦!蹦!蹦!Q弹到爆!"]
|
|
126
|
+
} },
|
|
127
|
+
{ "id": "star-bot", "file": "18-star-bot.svg", "name": "星星兽", "accent": "#ff8f00",
|
|
128
|
+
"motionFile": "18-star-bot.motion.css",
|
|
129
|
+
"quips": {
|
|
130
|
+
"frustrated": ["星芒都烧起来了!急!急!"],
|
|
131
|
+
"urging": ["一闪一闪亮晶晶,催你快回应"]
|
|
132
|
+
},
|
|
133
|
+
"stateQuips": {
|
|
134
|
+
"done": ["Twinkle! 任务完成 ✨"],
|
|
135
|
+
"aborted": ["流星中途熄灭了…"],
|
|
136
|
+
"error": ["星星也黯淡了一瞬,别慌,会再亮起来的"]
|
|
137
|
+
} }
|
|
138
|
+
]
|
|
139
|
+
}
|
|
@@ -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"/>
|