mocode-pet-app 1.3.0 → 1.6.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.svg +1 -1
- package/assets/pets/04-robo-panda.svg +1 -1
- package/assets/pets/05-robo-owl.svg +3 -3
- package/assets/pets/06-robo-bunny.svg +2 -2
- package/assets/pets/07-robo-frog.svg +3 -3
- package/assets/pets/09-robo-penguin.svg +3 -3
- 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.svg +3 -3
- package/assets/pets/13-cactus-bot.svg +2 -2
- package/assets/pets/15-satellite-bot.svg +1 -1
- package/assets/pets/16-jellyfish-bot.svg +3 -3
- package/assets/pets/18-star-bot.svg +3 -3
- package/assets/pets/manifest.json +20 -3
- package/assets/tray-icon.png +0 -0
- 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.svg +1 -1
- package/dist/assets/pets/04-robo-panda.svg +1 -1
- package/dist/assets/pets/05-robo-owl.svg +3 -3
- package/dist/assets/pets/06-robo-bunny.svg +2 -2
- package/dist/assets/pets/07-robo-frog.svg +3 -3
- package/dist/assets/pets/09-robo-penguin.svg +3 -3
- 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.svg +3 -3
- package/dist/assets/pets/13-cactus-bot.svg +2 -2
- package/dist/assets/pets/15-satellite-bot.svg +1 -1
- package/dist/assets/pets/16-jellyfish-bot.svg +3 -3
- package/dist/assets/pets/18-star-bot.svg +3 -3
- package/dist/assets/pets/manifest.json +20 -3
- package/dist/assets/tray-icon.png +0 -0
- package/dist/e2e-mood-check.js +128 -0
- package/dist/main.js +49 -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 +45 -0
- package/dist/quips.test.js +57 -0
- package/dist/renderer/dom-mood.js +53 -0
- package/dist/renderer/dom-mood.test.js +105 -0
- package/dist/renderer/index.html +2 -0
- package/dist/renderer/preload.js +9 -2
- package/dist/renderer/renderer.js +25 -9
- package/dist/renderer/style.css +89 -0
- package/dist/skins.js +32 -1
- package/dist/skins.test.js +73 -0
- 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"/>
|
|
@@ -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"/>
|
|
@@ -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"/>
|
|
@@ -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"/>
|
|
@@ -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
|
|
|
@@ -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>
|
|
@@ -36,11 +36,11 @@
|
|
|
36
36
|
</g>
|
|
37
37
|
|
|
38
38
|
<!-- Beak -->
|
|
39
|
-
<path d="M116 156 L128 172 L140 156 Z" fill="#ffb74d"/>
|
|
39
|
+
<path id="pet-mouth" d="M116 156 L128 172 L140 156 Z" fill="#ffb74d"/>
|
|
40
40
|
|
|
41
41
|
<!-- Flipper arms(填充块面而非线条,贴身收成圆润小翼) -->
|
|
42
|
-
<path d="M42 146 Q16 162 22 190 Q26 204 42 202 Q50 200 46 188 Q40 168 46 150 Z" fill="url(#bodyGrad)" stroke="url(#accentGrad)" stroke-width="2"/>
|
|
43
|
-
<path d="M214 146 Q240 162 234 190 Q230 204 214 202 Q206 200 210 188 Q216 168 210 150 Z" fill="url(#bodyGrad)" stroke="url(#accentGrad)" stroke-width="2"/>
|
|
42
|
+
<path id="pet-arm-left" d="M42 146 Q16 162 22 190 Q26 204 42 202 Q50 200 46 188 Q40 168 46 150 Z" fill="url(#bodyGrad)" stroke="url(#accentGrad)" stroke-width="2"/>
|
|
43
|
+
<path id="pet-arm-right" d="M214 146 Q240 162 234 190 Q230 204 214 202 Q206 200 210 188 Q216 168 210 150 Z" fill="url(#bodyGrad)" stroke="url(#accentGrad)" stroke-width="2"/>
|
|
44
44
|
|
|
45
45
|
<!-- Feet -->
|
|
46
46
|
<ellipse cx="104" cy="234" rx="16" ry="8" fill="#ffb74d"/>
|
|
@@ -39,12 +39,12 @@
|
|
|
39
39
|
</g>
|
|
40
40
|
|
|
41
41
|
<!-- Jagged mouth -->
|
|
42
|
-
<path d="M108 148 L118 156 L128 148 L138 156 L148 148" stroke="#69f0ae" stroke-width="4" fill="none" stroke-linecap="round" filter="url(#glow)"/>
|
|
42
|
+
<path id="pet-mouth" d="M108 148 L118 156 L128 148 L138 156 L148 148" stroke="#69f0ae" stroke-width="4" fill="none" stroke-linecap="round" filter="url(#glow)"/>
|
|
43
43
|
|
|
44
44
|
<!-- Small arms(填充块面而非线条,末端一颗圆球小手) -->
|
|
45
|
-
<ellipse cx="31" cy="142" rx="5.5" ry="15" fill="url(#accentGrad)" transform="rotate(-34 31 142)"/>
|
|
45
|
+
<ellipse id="pet-arm-left" cx="31" cy="142" rx="5.5" ry="15" fill="url(#accentGrad)" transform="rotate(-34 31 142)"/>
|
|
46
46
|
<circle cx="25" cy="156" r="5" fill="url(#accentGrad)"/>
|
|
47
|
-
<ellipse cx="223" cy="142" rx="5.5" ry="15" fill="url(#accentGrad)" transform="rotate(34 223 142)"/>
|
|
47
|
+
<ellipse id="pet-arm-right" cx="223" cy="142" rx="5.5" ry="15" fill="url(#accentGrad)" transform="rotate(34 223 142)"/>
|
|
48
48
|
<circle cx="231" cy="156" r="5" fill="url(#accentGrad)"/>
|
|
49
49
|
|
|
50
50
|
<!-- Legs / feet -->
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/* 史莱姆(slime-blob)专属演出:利用"形变"这个史莱姆独有的视觉语言覆盖通用规则。
|
|
2
|
+
* 史莱姆没有 arm-left/right/tail 等 id,通用规则里依赖这些 id 的动画(如 tool_call 摆臂、
|
|
3
|
+
* flustered 摆臂)对它本来就不生效,这里改用挤压/压扁形变来填补对应状态的演出。 */
|
|
4
|
+
|
|
5
|
+
/* ── mood-tired:身体压扁变矮,模拟疲惫瘫软,替代通用的"下沉" ── */
|
|
6
|
+
@keyframes slime-tired-squash {
|
|
7
|
+
0%, 100% { transform: scaleY(1) scaleX(1); }
|
|
8
|
+
50% { transform: scaleY(0.82) scaleX(1.08); }
|
|
9
|
+
}
|
|
10
|
+
.mood-tired #pet-body-group {
|
|
11
|
+
animation: slime-tired-squash 3.6s ease-in-out infinite;
|
|
12
|
+
transform-origin: 128px 200px;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/* ── tool_call:挤压弹跳形变代替通用双臂摆动 ── */
|
|
16
|
+
@keyframes slime-tool-bounce {
|
|
17
|
+
0%, 100% { transform: scaleY(1) scaleX(1); }
|
|
18
|
+
30% { transform: scaleY(0.85) scaleX(1.12); }
|
|
19
|
+
60% { transform: scaleY(1.12) scaleX(0.9); }
|
|
20
|
+
}
|
|
21
|
+
.pet-tool #pet-body-group {
|
|
22
|
+
animation: slime-tool-bounce 0.5s ease-in-out infinite;
|
|
23
|
+
transform-origin: 128px 200px;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/* ── idle:呼吸感的轻微鼓起收缩,比通用的上下浮动更软糯 ── */
|
|
27
|
+
@keyframes slime-idle-breathe {
|
|
28
|
+
0%, 100% { transform: scale(1); }
|
|
29
|
+
50% { transform: scale(1.03); }
|
|
30
|
+
}
|
|
31
|
+
.pet-idle #pet-body-group {
|
|
32
|
+
animation: slime-idle-breathe 2.8s ease-in-out infinite;
|
|
33
|
+
transform-origin: 128px 138px;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/* ── mood-urging:急促地一颤一颤,像在催你快点 ── */
|
|
37
|
+
@keyframes slime-urging-jiggle {
|
|
38
|
+
0%, 100% { transform: scaleY(1); }
|
|
39
|
+
50% { transform: scaleY(0.92); }
|
|
40
|
+
}
|
|
41
|
+
.mood-urging #pet-body-group {
|
|
42
|
+
animation: slime-urging-jiggle 0.45s ease-in-out infinite;
|
|
43
|
+
transform-origin: 128px 200px;
|
|
44
|
+
}
|
|
@@ -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
|
<!-- Blob body -->
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
</g>
|
|
32
32
|
|
|
33
33
|
<!-- Smile -->
|
|
34
|
-
<path d="M110 156 Q128 170 146 156" stroke="#0a1420" stroke-width="3.5" fill="none" stroke-linecap="round"/>
|
|
34
|
+
<path id="pet-mouth" d="M110 156 Q128 170 146 156" stroke="#0a1420" stroke-width="3.5" fill="none" stroke-linecap="round"/>
|
|
35
35
|
|
|
36
36
|
<!-- Drips -->
|
|
37
37
|
<path d="M84 216 Q84 232 92 232 Q100 232 96 216 Z" fill="url(#blobGrad)"/>
|
|
@@ -39,5 +39,5 @@
|
|
|
39
39
|
|
|
40
40
|
<!-- Highlight -->
|
|
41
41
|
<ellipse cx="92" cy="86" rx="18" ry="10" fill="#ffffff" fill-opacity="0.25"/>
|
|
42
|
-
</g>
|
|
42
|
+
</g>
|
|
43
43
|
</svg>
|
|
@@ -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
|
<!-- Floating shadow -->
|
|
@@ -36,6 +36,6 @@
|
|
|
36
36
|
</g>
|
|
37
37
|
|
|
38
38
|
<!-- Mouth -->
|
|
39
|
-
<ellipse cx="128" cy="142" rx="10" ry="8" fill="#0a1420" fill-opacity="0.85"/>
|
|
40
|
-
</g>
|
|
39
|
+
<ellipse id="pet-mouth" cx="128" cy="142" rx="10" ry="8" fill="#0a1420" fill-opacity="0.85"/>
|
|
40
|
+
</g>
|
|
41
41
|
</svg>
|
|
@@ -26,8 +26,8 @@
|
|
|
26
26
|
<rect x="48" y="150" width="160" height="70" rx="40" fill="url(#bodyGrad)" stroke="url(#accentGrad)" stroke-width="3"/>
|
|
27
27
|
|
|
28
28
|
<!-- Spike arms(填充块面而非线条,细刺仍保留为短线装饰) -->
|
|
29
|
-
<path d="M62 108 Q26 112 24 142 Q22 156 38 158 Q50 158 48 144 Q44 122 62 118 Z" fill="url(#bodyGrad)" stroke="url(#accentGrad)" stroke-width="2.5"/>
|
|
30
|
-
<path d="M194 108 Q230 112 232 142 Q234 156 218 158 Q206 158 208 144 Q212 122 194 118 Z" fill="url(#bodyGrad)" stroke="url(#accentGrad)" stroke-width="2.5"/>
|
|
29
|
+
<path id="pet-arm-left" d="M62 108 Q26 112 24 142 Q22 156 38 158 Q50 158 48 144 Q44 122 62 118 Z" fill="url(#bodyGrad)" stroke="url(#accentGrad)" stroke-width="2.5"/>
|
|
30
|
+
<path id="pet-arm-right" d="M194 108 Q230 112 232 142 Q234 156 218 158 Q206 158 208 144 Q212 122 194 118 Z" fill="url(#bodyGrad)" stroke="url(#accentGrad)" stroke-width="2.5"/>
|
|
31
31
|
<path d="M34 118 L24 108 M34 128 L22 124 M222 118 L232 108 M222 128 L234 124"
|
|
32
32
|
stroke="url(#accentGrad)" stroke-width="3" stroke-linecap="round"/>
|
|
33
33
|
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
<!-- Antenna dish (kept 8px lower than original so the dish curve's peak stays clear
|
|
19
19
|
of the viewBox top edge during the idle float animation's -6px translateY) -->
|
|
20
20
|
<line x1="128" y1="24" x2="128" y2="54" stroke="url(#accentGrad)" stroke-width="4"/>
|
|
21
|
-
<path d="M100 24 Q128 4 156 24 Q128 36 100 24 Z" fill="url(#bodyGrad)" stroke="url(#accentGrad)" stroke-width="2.5"/>
|
|
21
|
+
<path id="pet-antenna" d="M100 24 Q128 4 156 24 Q128 36 100 24 Z" fill="url(#bodyGrad)" stroke="url(#accentGrad)" stroke-width="2.5"/>
|
|
22
22
|
|
|
23
23
|
<!-- Solar panel wings -->
|
|
24
24
|
<rect x="4" y="88" width="50" height="70" rx="6" fill="url(#bodyGrad)" stroke="url(#accentGrad)" stroke-width="2.5"/>
|
|
@@ -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>
|
|
@@ -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>
|
|
@@ -3,8 +3,20 @@
|
|
|
3
3
|
"viewBox": "0 0 256 256",
|
|
4
4
|
"style": "赛博终端风,深色机身(#1b263b/#0d1b2a)+ 屏幕脸(黑底彩色像素眼,呼吸/眨眼动画),与 assets/mascot.svg 视觉语言一致",
|
|
5
5
|
"pets": [
|
|
6
|
-
{ "id": "robo-cat", "file": "01-robo-cat.svg", "name": "机械猫", "accent": "#2afadf"
|
|
7
|
-
|
|
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
|
+
} },
|
|
8
20
|
{ "id": "robo-fox", "file": "03-robo-fox.svg", "name": "机械狐", "accent": "#ff7043" },
|
|
9
21
|
{ "id": "robo-panda", "file": "04-robo-panda.svg", "name": "机械熊猫", "accent": "#2afadf" },
|
|
10
22
|
{ "id": "robo-owl", "file": "05-robo-owl.svg", "name": "机械猫头鹰", "accent": "#7c4dff" },
|
|
@@ -13,7 +25,12 @@
|
|
|
13
25
|
{ "id": "robo-bear", "file": "08-robo-bear.svg", "name": "机械熊", "accent": "#ffa726" },
|
|
14
26
|
{ "id": "robo-penguin", "file": "09-robo-penguin.svg", "name": "机械企鹅", "accent": "#42a5f5" },
|
|
15
27
|
{ "id": "robo-dino", "file": "10-robo-dino.svg", "name": "机械龙", "accent": "#00c853" },
|
|
16
|
-
{ "id": "slime-blob", "file": "11-slime-blob.svg", "name": "史莱姆", "accent": "#00acc1"
|
|
28
|
+
{ "id": "slime-blob", "file": "11-slime-blob.svg", "name": "史莱姆", "accent": "#00acc1",
|
|
29
|
+
"motionFile": "11-slime-blob.motion.css",
|
|
30
|
+
"quips": {
|
|
31
|
+
"tired": ["软软地瘫下去了…", "身体有点撑不住形状了"],
|
|
32
|
+
"urging": ["晃一晃,还在等你哦", "抖一抖,催你一下"]
|
|
33
|
+
} },
|
|
17
34
|
{ "id": "ghost-byte", "file": "12-ghost-byte.svg", "name": "字节幽灵", "accent": "#4dd0e1" },
|
|
18
35
|
{ "id": "cactus-bot", "file": "13-cactus-bot.svg", "name": "仙人掌兽", "accent": "#66bb6a" },
|
|
19
36
|
{ "id": "crystal-bot", "file": "14-crystal-bot.svg", "name": "水晶精灵", "accent": "#7c4dff" },
|
package/assets/tray-icon.png
CHANGED
|
Binary file
|
|
@@ -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"/>
|
|
@@ -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"/>
|
|
@@ -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"/>
|
|
@@ -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"/>
|
|
@@ -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
|
|
|
@@ -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>
|