mocode-pet-app 0.1.0 → 1.1.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/mascot.svg +3 -5
- package/assets/pets/01-robo-cat.svg +56 -0
- package/assets/pets/02-robo-dog.svg +53 -0
- package/assets/pets/03-robo-fox.svg +53 -0
- package/assets/pets/04-robo-panda.svg +52 -0
- package/assets/pets/05-robo-owl.svg +46 -0
- package/assets/pets/06-robo-bunny.svg +57 -0
- package/assets/pets/07-robo-frog.svg +39 -0
- package/assets/pets/08-robo-bear.svg +48 -0
- package/assets/pets/09-robo-penguin.svg +49 -0
- package/assets/pets/10-robo-dino.svg +58 -0
- package/assets/pets/11-slime-blob.svg +43 -0
- package/assets/pets/12-ghost-byte.svg +41 -0
- package/assets/pets/13-cactus-bot.svg +52 -0
- package/assets/pets/14-crystal-bot.svg +32 -0
- package/assets/pets/15-satellite-bot.svg +55 -0
- package/assets/pets/16-jellyfish-bot.svg +47 -0
- package/assets/pets/17-mushroom-bot.svg +47 -0
- package/assets/pets/18-star-bot.svg +45 -0
- package/assets/pets/manifest.json +25 -0
- package/assets/signal-light.svg +55 -0
- package/assets/tray-icon.png +0 -0
- package/dist/assets/mascot.svg +3 -5
- package/dist/assets/pets/01-robo-cat.svg +56 -0
- package/dist/assets/pets/02-robo-dog.svg +53 -0
- package/dist/assets/pets/03-robo-fox.svg +53 -0
- package/dist/assets/pets/04-robo-panda.svg +52 -0
- package/dist/assets/pets/05-robo-owl.svg +46 -0
- package/dist/assets/pets/06-robo-bunny.svg +57 -0
- package/dist/assets/pets/07-robo-frog.svg +39 -0
- package/dist/assets/pets/08-robo-bear.svg +48 -0
- package/dist/assets/pets/09-robo-penguin.svg +49 -0
- package/dist/assets/pets/10-robo-dino.svg +58 -0
- package/dist/assets/pets/11-slime-blob.svg +43 -0
- package/dist/assets/pets/12-ghost-byte.svg +41 -0
- package/dist/assets/pets/13-cactus-bot.svg +52 -0
- package/dist/assets/pets/14-crystal-bot.svg +32 -0
- package/dist/assets/pets/15-satellite-bot.svg +55 -0
- package/dist/assets/pets/16-jellyfish-bot.svg +47 -0
- package/dist/assets/pets/17-mushroom-bot.svg +47 -0
- package/dist/assets/pets/18-star-bot.svg +45 -0
- package/dist/assets/pets/manifest.json +25 -0
- package/dist/assets/signal-light.svg +55 -0
- package/dist/assets/tray-icon.png +0 -0
- package/dist/config.js +42 -0
- package/dist/main.js +158 -16
- package/dist/protocol.js +25 -0
- package/dist/renderer/index.html +4 -1
- package/dist/renderer/preload.js +32 -3
- package/dist/renderer/renderer.js +74 -10
- package/dist/renderer/style.css +116 -11
- package/dist/skins.js +55 -0
- package/package.json +2 -2
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
<svg width="256" height="256" viewBox="0 0 256 256" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<defs>
|
|
3
|
+
<linearGradient id="bodyGrad" x1="48" y1="48" x2="208" y2="220" gradientUnits="userSpaceOnUse">
|
|
4
|
+
<stop offset="0" stop-color="#eef2f6"/>
|
|
5
|
+
<stop offset="1" stop-color="#cbd5e0"/>
|
|
6
|
+
</linearGradient>
|
|
7
|
+
<linearGradient id="accentGrad" x1="60" y1="90" x2="196" y2="170" gradientUnits="userSpaceOnUse">
|
|
8
|
+
<stop offset="0" stop-color="#2afadf"/>
|
|
9
|
+
<stop offset="1" stop-color="#42a5f5"/>
|
|
10
|
+
</linearGradient>
|
|
11
|
+
<filter id="glow" x="-30%" y="-30%" width="160%" height="160%">
|
|
12
|
+
<feGaussianBlur stdDeviation="3" result="blur"/>
|
|
13
|
+
<feMerge><feMergeNode in="blur"/><feMergeNode in="SourceGraphic"/></feMerge>
|
|
14
|
+
</filter>
|
|
15
|
+
</defs>
|
|
16
|
+
<g id="pet-body-group">
|
|
17
|
+
|
|
18
|
+
<!-- Round black ears -->
|
|
19
|
+
<circle cx="58" cy="42" r="26" fill="#161a1e" stroke="url(#accentGrad)" stroke-width="3"/>
|
|
20
|
+
<circle cx="198" cy="42" r="26" fill="#161a1e" stroke="url(#accentGrad)" stroke-width="3"/>
|
|
21
|
+
|
|
22
|
+
<!-- Body / head -->
|
|
23
|
+
<rect x="40" y="50" width="176" height="150" rx="28" fill="url(#bodyGrad)" stroke="url(#accentGrad)" stroke-width="3"/>
|
|
24
|
+
|
|
25
|
+
<!-- Black eye patches -->
|
|
26
|
+
<ellipse cx="93" cy="112" rx="22" ry="28" fill="#161a1e"/>
|
|
27
|
+
<ellipse cx="163" cy="112" rx="22" ry="28" fill="#161a1e"/>
|
|
28
|
+
|
|
29
|
+
<!-- Screen face -->
|
|
30
|
+
<rect x="60" y="72" width="136" height="90" rx="14" fill="#0a1420" stroke="#2afadf" stroke-opacity="0.4" stroke-width="1.5"/>
|
|
31
|
+
|
|
32
|
+
<!-- Eyes -->
|
|
33
|
+
<g filter="url(#glow)">
|
|
34
|
+
<rect x="86" y="104" width="14" height="26" rx="6" fill="url(#accentGrad)">
|
|
35
|
+
<animate attributeName="height" values="26;2;26" keyTimes="0;0.5;1" dur="3.2s" repeatCount="indefinite"/>
|
|
36
|
+
<animate attributeName="y" values="104;117;104" keyTimes="0;0.5;1" dur="3.2s" repeatCount="indefinite"/>
|
|
37
|
+
</rect>
|
|
38
|
+
<rect x="156" y="104" width="14" height="26" rx="6" fill="url(#accentGrad)">
|
|
39
|
+
<animate attributeName="height" values="26;2;26" keyTimes="0;0.5;1" dur="3.2s" repeatCount="indefinite"/>
|
|
40
|
+
<animate attributeName="y" values="104;117;104" keyTimes="0;0.5;1" dur="3.2s" repeatCount="indefinite"/>
|
|
41
|
+
</rect>
|
|
42
|
+
</g>
|
|
43
|
+
|
|
44
|
+
<!-- Nose + mouth -->
|
|
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"/>
|
|
47
|
+
|
|
48
|
+
<!-- Legs / feet -->
|
|
49
|
+
<rect x="76" y="200" width="20" height="26" rx="8" fill="#161a1e" stroke="url(#accentGrad)" stroke-width="2.5"/>
|
|
50
|
+
<rect x="160" y="200" width="20" height="26" rx="8" fill="#161a1e" stroke="url(#accentGrad)" stroke-width="2.5"/>
|
|
51
|
+
</g>
|
|
52
|
+
</svg>
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
<svg width="256" height="256" viewBox="0 0 256 256" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<defs>
|
|
3
|
+
<linearGradient id="bodyGrad" x1="48" y1="48" x2="208" y2="220" gradientUnits="userSpaceOnUse">
|
|
4
|
+
<stop offset="0" stop-color="#1b263b"/>
|
|
5
|
+
<stop offset="1" stop-color="#0d1b2a"/>
|
|
6
|
+
</linearGradient>
|
|
7
|
+
<linearGradient id="accentGrad" x1="60" y1="90" x2="196" y2="170" gradientUnits="userSpaceOnUse">
|
|
8
|
+
<stop offset="0" stop-color="#b388ff"/>
|
|
9
|
+
<stop offset="1" stop-color="#7c4dff"/>
|
|
10
|
+
</linearGradient>
|
|
11
|
+
<filter id="glow" x="-30%" y="-30%" width="160%" height="160%">
|
|
12
|
+
<feGaussianBlur stdDeviation="3" result="blur"/>
|
|
13
|
+
<feMerge><feMergeNode in="blur"/><feMergeNode in="SourceGraphic"/></feMerge>
|
|
14
|
+
</filter>
|
|
15
|
+
</defs>
|
|
16
|
+
<g id="pet-body-group">
|
|
17
|
+
|
|
18
|
+
<!-- Ear tufts -->
|
|
19
|
+
<path d="M60 58 L50 26 L76 46 Z" fill="url(#bodyGrad)" stroke="url(#accentGrad)" stroke-width="3"/>
|
|
20
|
+
<path d="M196 58 L206 26 L180 46 Z" fill="url(#bodyGrad)" stroke="url(#accentGrad)" stroke-width="3"/>
|
|
21
|
+
|
|
22
|
+
<!-- Body / head -->
|
|
23
|
+
<rect x="40" y="50" width="176" height="150" rx="40" fill="url(#bodyGrad)" stroke="url(#accentGrad)" stroke-width="3"/>
|
|
24
|
+
|
|
25
|
+
<!-- Big round eyes -->
|
|
26
|
+
<circle cx="93" cy="118" r="30" fill="#0a1420" stroke="url(#accentGrad)" stroke-width="2"/>
|
|
27
|
+
<circle cx="163" cy="118" r="30" fill="#0a1420" stroke="url(#accentGrad)" stroke-width="2"/>
|
|
28
|
+
<circle cx="93" cy="118" r="13" fill="url(#accentGrad)" filter="url(#glow)">
|
|
29
|
+
<animate attributeName="r" values="13;3;13" keyTimes="0;0.5;1" dur="3.2s" repeatCount="indefinite"/>
|
|
30
|
+
</circle>
|
|
31
|
+
<circle cx="163" cy="118" r="13" fill="url(#accentGrad)" filter="url(#glow)">
|
|
32
|
+
<animate attributeName="r" values="13;3;13" keyTimes="0;0.5;1" dur="3.2s" repeatCount="indefinite"/>
|
|
33
|
+
</circle>
|
|
34
|
+
|
|
35
|
+
<!-- Beak -->
|
|
36
|
+
<path d="M120 156 L128 172 L136 156 Z" fill="#ffb74d"/>
|
|
37
|
+
|
|
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"/>
|
|
41
|
+
|
|
42
|
+
<!-- Feet / talons -->
|
|
43
|
+
<rect x="76" y="200" width="20" height="24" rx="6" fill="url(#bodyGrad)" stroke="url(#accentGrad)" stroke-width="2.5"/>
|
|
44
|
+
<rect x="160" y="200" width="20" height="24" rx="6" fill="url(#bodyGrad)" stroke="url(#accentGrad)" stroke-width="2.5"/>
|
|
45
|
+
</g>
|
|
46
|
+
</svg>
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
<svg width="256" height="256" viewBox="0 0 256 256" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<defs>
|
|
3
|
+
<linearGradient id="bodyGrad" x1="48" y1="48" x2="208" y2="220" gradientUnits="userSpaceOnUse">
|
|
4
|
+
<stop offset="0" stop-color="#1b263b"/>
|
|
5
|
+
<stop offset="1" stop-color="#0d1b2a"/>
|
|
6
|
+
</linearGradient>
|
|
7
|
+
<linearGradient id="accentGrad" x1="60" y1="90" x2="196" y2="170" gradientUnits="userSpaceOnUse">
|
|
8
|
+
<stop offset="0" stop-color="#ff6ec7"/>
|
|
9
|
+
<stop offset="1" stop-color="#f48fb1"/>
|
|
10
|
+
</linearGradient>
|
|
11
|
+
<filter id="glow" x="-30%" y="-30%" width="160%" height="160%">
|
|
12
|
+
<feGaussianBlur stdDeviation="3" result="blur"/>
|
|
13
|
+
<feMerge><feMergeNode in="blur"/><feMergeNode in="SourceGraphic"/></feMerge>
|
|
14
|
+
</filter>
|
|
15
|
+
</defs>
|
|
16
|
+
<g id="pet-body-group">
|
|
17
|
+
|
|
18
|
+
<!-- Long ears (top kept at y=12 to leave clearance for the idle float animation's -6px translateY, so ear tips don't get clipped by the viewBox edge) -->
|
|
19
|
+
<rect x="66" y="12" width="22" height="54" rx="11" fill="url(#bodyGrad)" stroke="url(#accentGrad)" stroke-width="3"/>
|
|
20
|
+
<rect x="168" y="12" width="22" height="54" rx="11" fill="url(#bodyGrad)" stroke="url(#accentGrad)" stroke-width="3"/>
|
|
21
|
+
<rect x="72" y="20" width="10" height="30" rx="5" fill="#ff6ec7" fill-opacity="0.5"/>
|
|
22
|
+
<rect x="174" y="20" width="10" height="30" rx="5" fill="#ff6ec7" fill-opacity="0.5"/>
|
|
23
|
+
|
|
24
|
+
<!-- Body / head -->
|
|
25
|
+
<rect x="40" y="50" width="176" height="150" rx="30" fill="url(#bodyGrad)" stroke="url(#accentGrad)" stroke-width="3"/>
|
|
26
|
+
|
|
27
|
+
<!-- Screen face -->
|
|
28
|
+
<rect x="60" y="72" width="136" height="90" rx="14" fill="#0a1420" stroke="#ff6ec7" stroke-opacity="0.4" stroke-width="1.5"/>
|
|
29
|
+
|
|
30
|
+
<!-- Eyes -->
|
|
31
|
+
<g filter="url(#glow)">
|
|
32
|
+
<rect x="86" y="104" width="14" height="26" rx="6" fill="url(#accentGrad)">
|
|
33
|
+
<animate attributeName="height" values="26;2;26" keyTimes="0;0.5;1" dur="3.2s" repeatCount="indefinite"/>
|
|
34
|
+
<animate attributeName="y" values="104;117;104" keyTimes="0;0.5;1" dur="3.2s" repeatCount="indefinite"/>
|
|
35
|
+
</rect>
|
|
36
|
+
<rect x="156" y="104" width="14" height="26" rx="6" fill="url(#accentGrad)">
|
|
37
|
+
<animate attributeName="height" values="26;2;26" keyTimes="0;0.5;1" dur="3.2s" repeatCount="indefinite"/>
|
|
38
|
+
<animate attributeName="y" values="104;117;104" keyTimes="0;0.5;1" dur="3.2s" repeatCount="indefinite"/>
|
|
39
|
+
</rect>
|
|
40
|
+
</g>
|
|
41
|
+
|
|
42
|
+
<!-- Nose -->
|
|
43
|
+
<path d="M122 148 L128 156 L134 148 Z" fill="#ff6ec7" filter="url(#glow)"/>
|
|
44
|
+
|
|
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">
|
|
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
|
+
</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">
|
|
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
|
+
</ellipse>
|
|
52
|
+
|
|
53
|
+
<!-- Legs / feet -->
|
|
54
|
+
<rect x="76" y="200" width="20" height="26" rx="8" fill="url(#bodyGrad)" stroke="url(#accentGrad)" stroke-width="2.5"/>
|
|
55
|
+
<rect x="160" y="200" width="20" height="26" rx="8" fill="url(#bodyGrad)" stroke="url(#accentGrad)" stroke-width="2.5"/>
|
|
56
|
+
</g>
|
|
57
|
+
</svg>
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
<svg width="256" height="256" viewBox="0 0 256 256" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<defs>
|
|
3
|
+
<linearGradient id="bodyGrad" x1="48" y1="48" x2="208" y2="220" gradientUnits="userSpaceOnUse">
|
|
4
|
+
<stop offset="0" stop-color="#1b263b"/>
|
|
5
|
+
<stop offset="1" stop-color="#0d1b2a"/>
|
|
6
|
+
</linearGradient>
|
|
7
|
+
<linearGradient id="accentGrad" x1="60" y1="90" x2="196" y2="170" gradientUnits="userSpaceOnUse">
|
|
8
|
+
<stop offset="0" stop-color="#69f0ae"/>
|
|
9
|
+
<stop offset="1" stop-color="#00e676"/>
|
|
10
|
+
</linearGradient>
|
|
11
|
+
<filter id="glow" x="-30%" y="-30%" width="160%" height="160%">
|
|
12
|
+
<feGaussianBlur stdDeviation="3" result="blur"/>
|
|
13
|
+
<feMerge><feMergeNode in="blur"/><feMergeNode in="SourceGraphic"/></feMerge>
|
|
14
|
+
</filter>
|
|
15
|
+
</defs>
|
|
16
|
+
<g id="pet-body-group">
|
|
17
|
+
|
|
18
|
+
<!-- Body / head (wide, squat) -->
|
|
19
|
+
<rect x="34" y="66" width="188" height="134" rx="36" fill="url(#bodyGrad)" stroke="url(#accentGrad)" stroke-width="3"/>
|
|
20
|
+
|
|
21
|
+
<!-- Bulging top eyes -->
|
|
22
|
+
<circle cx="88" cy="60" r="26" fill="#0a1420" stroke="url(#accentGrad)" stroke-width="2"/>
|
|
23
|
+
<circle cx="168" cy="60" r="26" fill="#0a1420" stroke="url(#accentGrad)" stroke-width="2"/>
|
|
24
|
+
<circle cx="88" cy="60" r="11" fill="url(#accentGrad)" filter="url(#glow)">
|
|
25
|
+
<animate attributeName="r" values="11;2;11" keyTimes="0;0.5;1" dur="3.2s" repeatCount="indefinite"/>
|
|
26
|
+
</circle>
|
|
27
|
+
<circle cx="168" cy="60" r="11" fill="url(#accentGrad)" filter="url(#glow)">
|
|
28
|
+
<animate attributeName="r" values="11;2;11" keyTimes="0;0.5;1" dur="3.2s" repeatCount="indefinite"/>
|
|
29
|
+
</circle>
|
|
30
|
+
|
|
31
|
+
<!-- Screen mouth panel -->
|
|
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)"/>
|
|
34
|
+
|
|
35
|
+
<!-- Bent frog legs -->
|
|
36
|
+
<path d="M50 176 Q20 190 30 224 Q46 236 56 214" fill="url(#bodyGrad)" stroke="url(#accentGrad)" stroke-width="3"/>
|
|
37
|
+
<path d="M206 176 Q236 190 226 224 Q210 236 200 214" fill="url(#bodyGrad)" stroke="url(#accentGrad)" stroke-width="3"/>
|
|
38
|
+
</g>
|
|
39
|
+
</svg>
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
<svg width="256" height="256" viewBox="0 0 256 256" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<defs>
|
|
3
|
+
<linearGradient id="bodyGrad" x1="48" y1="48" x2="208" y2="220" gradientUnits="userSpaceOnUse">
|
|
4
|
+
<stop offset="0" stop-color="#1b263b"/>
|
|
5
|
+
<stop offset="1" stop-color="#0d1b2a"/>
|
|
6
|
+
</linearGradient>
|
|
7
|
+
<linearGradient id="accentGrad" x1="60" y1="90" x2="196" y2="170" gradientUnits="userSpaceOnUse">
|
|
8
|
+
<stop offset="0" stop-color="#ffb74d"/>
|
|
9
|
+
<stop offset="1" stop-color="#ffa726"/>
|
|
10
|
+
</linearGradient>
|
|
11
|
+
<filter id="glow" x="-30%" y="-30%" width="160%" height="160%">
|
|
12
|
+
<feGaussianBlur stdDeviation="3" result="blur"/>
|
|
13
|
+
<feMerge><feMergeNode in="blur"/><feMergeNode in="SourceGraphic"/></feMerge>
|
|
14
|
+
</filter>
|
|
15
|
+
</defs>
|
|
16
|
+
<g id="pet-body-group">
|
|
17
|
+
|
|
18
|
+
<!-- Round ears -->
|
|
19
|
+
<circle cx="56" cy="46" r="24" fill="url(#bodyGrad)" stroke="url(#accentGrad)" stroke-width="3"/>
|
|
20
|
+
<circle cx="200" cy="46" r="24" fill="url(#bodyGrad)" stroke="url(#accentGrad)" stroke-width="3"/>
|
|
21
|
+
|
|
22
|
+
<!-- Body / head -->
|
|
23
|
+
<rect x="40" y="50" width="176" height="150" rx="30" fill="url(#bodyGrad)" stroke="url(#accentGrad)" stroke-width="3"/>
|
|
24
|
+
|
|
25
|
+
<!-- Screen face -->
|
|
26
|
+
<rect x="60" y="72" width="136" height="90" rx="14" fill="#0a1420" stroke="#ffb74d" stroke-opacity="0.4" stroke-width="1.5"/>
|
|
27
|
+
|
|
28
|
+
<!-- Eyes -->
|
|
29
|
+
<g filter="url(#glow)">
|
|
30
|
+
<rect x="86" y="104" width="14" height="26" rx="6" fill="url(#accentGrad)">
|
|
31
|
+
<animate attributeName="height" values="26;2;26" keyTimes="0;0.5;1" dur="3.2s" repeatCount="indefinite"/>
|
|
32
|
+
<animate attributeName="y" values="104;117;104" keyTimes="0;0.5;1" dur="3.2s" repeatCount="indefinite"/>
|
|
33
|
+
</rect>
|
|
34
|
+
<rect x="156" y="104" width="14" height="26" rx="6" fill="url(#accentGrad)">
|
|
35
|
+
<animate attributeName="height" values="26;2;26" keyTimes="0;0.5;1" dur="3.2s" repeatCount="indefinite"/>
|
|
36
|
+
<animate attributeName="y" values="104;117;104" keyTimes="0;0.5;1" dur="3.2s" repeatCount="indefinite"/>
|
|
37
|
+
</rect>
|
|
38
|
+
</g>
|
|
39
|
+
|
|
40
|
+
<!-- Round snout patch -->
|
|
41
|
+
<ellipse cx="128" cy="148" rx="26" ry="18" fill="#0a1420" stroke="#ffb74d" stroke-opacity="0.5" stroke-width="1.5"/>
|
|
42
|
+
<ellipse cx="128" cy="142" rx="6" ry="5" fill="#ffb74d"/>
|
|
43
|
+
|
|
44
|
+
<!-- Legs / feet -->
|
|
45
|
+
<rect x="72" y="200" width="24" height="26" rx="9" fill="url(#bodyGrad)" stroke="url(#accentGrad)" stroke-width="2.5"/>
|
|
46
|
+
<rect x="160" y="200" width="24" height="26" rx="9" fill="url(#bodyGrad)" stroke="url(#accentGrad)" stroke-width="2.5"/>
|
|
47
|
+
</g>
|
|
48
|
+
</svg>
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
<svg width="256" height="256" viewBox="0 0 256 256" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<defs>
|
|
3
|
+
<linearGradient id="bodyGrad" x1="48" y1="48" x2="208" y2="220" gradientUnits="userSpaceOnUse">
|
|
4
|
+
<stop offset="0" stop-color="#1b263b"/>
|
|
5
|
+
<stop offset="1" stop-color="#0d1b2a"/>
|
|
6
|
+
</linearGradient>
|
|
7
|
+
<linearGradient id="accentGrad" x1="60" y1="90" x2="196" y2="170" gradientUnits="userSpaceOnUse">
|
|
8
|
+
<stop offset="0" stop-color="#2afadf"/>
|
|
9
|
+
<stop offset="1" stop-color="#42a5f5"/>
|
|
10
|
+
</linearGradient>
|
|
11
|
+
<filter id="glow" x="-30%" y="-30%" width="160%" height="160%">
|
|
12
|
+
<feGaussianBlur stdDeviation="3" result="blur"/>
|
|
13
|
+
<feMerge><feMergeNode in="blur"/><feMergeNode in="SourceGraphic"/></feMerge>
|
|
14
|
+
</filter>
|
|
15
|
+
</defs>
|
|
16
|
+
<g id="pet-body-group">
|
|
17
|
+
|
|
18
|
+
<!-- Body (oval) -->
|
|
19
|
+
<ellipse cx="128" cy="140" rx="88" ry="100" fill="url(#bodyGrad)" stroke="url(#accentGrad)" stroke-width="3"/>
|
|
20
|
+
<!-- Belly patch -->
|
|
21
|
+
<ellipse cx="128" cy="156" rx="52" ry="66" fill="#eef2f6"/>
|
|
22
|
+
|
|
23
|
+
<!-- Screen face -->
|
|
24
|
+
<rect x="76" y="86" width="104" height="62" rx="14" fill="#0a1420" stroke="#2afadf" stroke-opacity="0.4" stroke-width="1.5"/>
|
|
25
|
+
|
|
26
|
+
<!-- Eyes -->
|
|
27
|
+
<g filter="url(#glow)">
|
|
28
|
+
<rect x="98" y="108" width="12" height="20" rx="5" fill="url(#accentGrad)">
|
|
29
|
+
<animate attributeName="height" values="20;2;20" keyTimes="0;0.5;1" dur="3.2s" repeatCount="indefinite"/>
|
|
30
|
+
<animate attributeName="y" values="108;117;108" keyTimes="0;0.5;1" dur="3.2s" repeatCount="indefinite"/>
|
|
31
|
+
</rect>
|
|
32
|
+
<rect x="146" y="108" width="12" height="20" rx="5" fill="url(#accentGrad)">
|
|
33
|
+
<animate attributeName="height" values="20;2;20" keyTimes="0;0.5;1" dur="3.2s" repeatCount="indefinite"/>
|
|
34
|
+
<animate attributeName="y" values="108;117;108" keyTimes="0;0.5;1" dur="3.2s" repeatCount="indefinite"/>
|
|
35
|
+
</rect>
|
|
36
|
+
</g>
|
|
37
|
+
|
|
38
|
+
<!-- Beak -->
|
|
39
|
+
<path d="M116 156 L128 172 L140 156 Z" fill="#ffb74d"/>
|
|
40
|
+
|
|
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"/>
|
|
44
|
+
|
|
45
|
+
<!-- Feet -->
|
|
46
|
+
<ellipse cx="104" cy="234" rx="16" ry="8" fill="#ffb74d"/>
|
|
47
|
+
<ellipse cx="152" cy="234" rx="16" ry="8" fill="#ffb74d"/>
|
|
48
|
+
</g>
|
|
49
|
+
</svg>
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
<svg width="256" height="256" viewBox="0 0 256 256" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<defs>
|
|
3
|
+
<linearGradient id="bodyGrad" x1="48" y1="48" x2="208" y2="220" gradientUnits="userSpaceOnUse">
|
|
4
|
+
<stop offset="0" stop-color="#1b263b"/>
|
|
5
|
+
<stop offset="1" stop-color="#0d1b2a"/>
|
|
6
|
+
</linearGradient>
|
|
7
|
+
<linearGradient id="accentGrad" x1="60" y1="90" x2="196" y2="170" gradientUnits="userSpaceOnUse">
|
|
8
|
+
<stop offset="0" stop-color="#69f0ae"/>
|
|
9
|
+
<stop offset="1" stop-color="#00c853"/>
|
|
10
|
+
</linearGradient>
|
|
11
|
+
<filter id="glow" x="-30%" y="-30%" width="160%" height="160%">
|
|
12
|
+
<feGaussianBlur stdDeviation="3" result="blur"/>
|
|
13
|
+
<feMerge><feMergeNode in="blur"/><feMergeNode in="SourceGraphic"/></feMerge>
|
|
14
|
+
</filter>
|
|
15
|
+
</defs>
|
|
16
|
+
<g id="pet-body-group">
|
|
17
|
+
|
|
18
|
+
<!-- Back spikes -->
|
|
19
|
+
<path d="M64 52 L76 24 L90 52 Z" fill="url(#accentGrad)"/>
|
|
20
|
+
<path d="M110 46 L122 16 L136 46 Z" fill="url(#accentGrad)"/>
|
|
21
|
+
<path d="M156 52 L168 24 L182 52 Z" fill="url(#accentGrad)"/>
|
|
22
|
+
|
|
23
|
+
<!-- Body / head -->
|
|
24
|
+
<rect x="40" y="50" width="176" height="150" rx="24" fill="url(#bodyGrad)" stroke="url(#accentGrad)" stroke-width="3"/>
|
|
25
|
+
|
|
26
|
+
<!-- Screen face -->
|
|
27
|
+
<rect x="60" y="76" width="136" height="86" rx="14" fill="#0a1420" stroke="#69f0ae" stroke-opacity="0.4" stroke-width="1.5"/>
|
|
28
|
+
|
|
29
|
+
<!-- Red eyes -->
|
|
30
|
+
<g filter="url(#glow)">
|
|
31
|
+
<rect x="86" y="106" width="14" height="24" rx="6" fill="#ff5252">
|
|
32
|
+
<animate attributeName="height" values="24;2;24" keyTimes="0;0.5;1" dur="3.2s" repeatCount="indefinite"/>
|
|
33
|
+
<animate attributeName="y" values="106;118;106" keyTimes="0;0.5;1" dur="3.2s" repeatCount="indefinite"/>
|
|
34
|
+
</rect>
|
|
35
|
+
<rect x="156" y="106" width="14" height="24" rx="6" fill="#ff5252">
|
|
36
|
+
<animate attributeName="height" values="24;2;24" keyTimes="0;0.5;1" dur="3.2s" repeatCount="indefinite"/>
|
|
37
|
+
<animate attributeName="y" values="106;118;106" keyTimes="0;0.5;1" dur="3.2s" repeatCount="indefinite"/>
|
|
38
|
+
</rect>
|
|
39
|
+
</g>
|
|
40
|
+
|
|
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)"/>
|
|
43
|
+
|
|
44
|
+
<!-- Small arms(填充块面而非线条,末端一颗圆球小手) -->
|
|
45
|
+
<ellipse cx="31" cy="142" rx="5.5" ry="15" fill="url(#accentGrad)" transform="rotate(-34 31 142)"/>
|
|
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)"/>
|
|
48
|
+
<circle cx="231" cy="156" r="5" fill="url(#accentGrad)"/>
|
|
49
|
+
|
|
50
|
+
<!-- Legs / feet -->
|
|
51
|
+
<rect x="76" y="200" width="20" height="26" rx="8" fill="url(#bodyGrad)" stroke="url(#accentGrad)" stroke-width="2.5"/>
|
|
52
|
+
<rect x="160" y="200" width="20" height="26" rx="8" fill="url(#bodyGrad)" stroke="url(#accentGrad)" stroke-width="2.5"/>
|
|
53
|
+
|
|
54
|
+
<!-- Spiky tail -->
|
|
55
|
+
<path d="M216 176 Q248 178 244 150" stroke="url(#accentGrad)" stroke-width="8" stroke-linecap="round" fill="none"/>
|
|
56
|
+
<path d="M240 150 L248 138 L252 154 Z" fill="url(#accentGrad)"/>
|
|
57
|
+
</g>
|
|
58
|
+
</svg>
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
<svg width="256" height="256" viewBox="0 0 256 256" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<defs>
|
|
3
|
+
<linearGradient id="blobGrad" x1="48" y1="60" x2="208" y2="220" gradientUnits="userSpaceOnUse">
|
|
4
|
+
<stop offset="0" stop-color="#26c6da" stop-opacity="0.9"/>
|
|
5
|
+
<stop offset="1" stop-color="#00acc1" stop-opacity="0.75"/>
|
|
6
|
+
</linearGradient>
|
|
7
|
+
<filter id="glow" x="-30%" y="-30%" width="160%" height="160%">
|
|
8
|
+
<feGaussianBlur stdDeviation="3" result="blur"/>
|
|
9
|
+
<feMerge><feMergeNode in="blur"/><feMergeNode in="SourceGraphic"/></feMerge>
|
|
10
|
+
</filter>
|
|
11
|
+
</defs>
|
|
12
|
+
<g id="pet-body-group">
|
|
13
|
+
|
|
14
|
+
<!-- Blob body -->
|
|
15
|
+
<path d="M128 40
|
|
16
|
+
C182 40 214 78 210 128
|
|
17
|
+
C232 150 224 190 198 202
|
|
18
|
+
C210 224 176 232 158 216
|
|
19
|
+
C132 236 96 234 78 214
|
|
20
|
+
C50 224 34 196 48 176
|
|
21
|
+
C24 158 30 118 62 96
|
|
22
|
+
C64 62 96 40 128 40 Z"
|
|
23
|
+
fill="url(#blobGrad)" stroke="#4dd0e1" stroke-width="2.5"/>
|
|
24
|
+
|
|
25
|
+
<!-- Eyes -->
|
|
26
|
+
<g filter="url(#glow)">
|
|
27
|
+
<circle cx="102" cy="132" r="9" fill="#0a1420"/>
|
|
28
|
+
<circle cx="154" cy="132" r="9" fill="#0a1420"/>
|
|
29
|
+
<circle cx="105" cy="129" r="2.5" fill="#e0fbff"/>
|
|
30
|
+
<circle cx="157" cy="129" r="2.5" fill="#e0fbff"/>
|
|
31
|
+
</g>
|
|
32
|
+
|
|
33
|
+
<!-- Smile -->
|
|
34
|
+
<path d="M110 156 Q128 170 146 156" stroke="#0a1420" stroke-width="3.5" fill="none" stroke-linecap="round"/>
|
|
35
|
+
|
|
36
|
+
<!-- Drips -->
|
|
37
|
+
<path d="M84 216 Q84 232 92 232 Q100 232 96 216 Z" fill="url(#blobGrad)"/>
|
|
38
|
+
<path d="M160 220 Q160 236 168 236 Q176 236 172 220 Z" fill="url(#blobGrad)"/>
|
|
39
|
+
|
|
40
|
+
<!-- Highlight -->
|
|
41
|
+
<ellipse cx="92" cy="86" rx="18" ry="10" fill="#ffffff" fill-opacity="0.25"/>
|
|
42
|
+
</g>
|
|
43
|
+
</svg>
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
<svg width="256" height="256" viewBox="0 0 256 256" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<defs>
|
|
3
|
+
<linearGradient id="ghostGrad" x1="48" y1="40" x2="208" y2="200" gradientUnits="userSpaceOnUse">
|
|
4
|
+
<stop offset="0" stop-color="#e1f5fe" stop-opacity="0.92"/>
|
|
5
|
+
<stop offset="1" stop-color="#81d4fa" stop-opacity="0.7"/>
|
|
6
|
+
</linearGradient>
|
|
7
|
+
<filter id="glow" x="-30%" y="-30%" width="160%" height="160%">
|
|
8
|
+
<feGaussianBlur stdDeviation="3" result="blur"/>
|
|
9
|
+
<feMerge><feMergeNode in="blur"/><feMergeNode in="SourceGraphic"/></feMerge>
|
|
10
|
+
</filter>
|
|
11
|
+
</defs>
|
|
12
|
+
<g id="pet-body-group">
|
|
13
|
+
|
|
14
|
+
<!-- Floating shadow -->
|
|
15
|
+
<ellipse cx="128" cy="234" rx="50" ry="8" fill="#000" fill-opacity="0.15"/>
|
|
16
|
+
|
|
17
|
+
<!-- Ghost body -->
|
|
18
|
+
<path d="M128 34
|
|
19
|
+
C176 34 208 70 208 120
|
|
20
|
+
L208 190
|
|
21
|
+
C208 190 196 176 184 190
|
|
22
|
+
C172 204 160 176 148 190
|
|
23
|
+
C136 204 120 176 108 190
|
|
24
|
+
C96 204 84 176 72 190
|
|
25
|
+
C60 176 48 190 48 190
|
|
26
|
+
L48 120
|
|
27
|
+
C48 70 80 34 128 34 Z"
|
|
28
|
+
fill="url(#ghostGrad)" stroke="#4dd0e1" stroke-width="2">
|
|
29
|
+
<animateTransform attributeName="transform" type="translate" values="0 0;0 -8;0 0" dur="2.4s" repeatCount="indefinite"/>
|
|
30
|
+
</path>
|
|
31
|
+
|
|
32
|
+
<!-- Eyes -->
|
|
33
|
+
<g filter="url(#glow)">
|
|
34
|
+
<ellipse cx="98" cy="112" rx="9" ry="12" fill="#0a1420"/>
|
|
35
|
+
<ellipse cx="158" cy="112" rx="9" ry="12" fill="#0a1420"/>
|
|
36
|
+
</g>
|
|
37
|
+
|
|
38
|
+
<!-- Mouth -->
|
|
39
|
+
<ellipse cx="128" cy="142" rx="10" ry="8" fill="#0a1420" fill-opacity="0.85"/>
|
|
40
|
+
</g>
|
|
41
|
+
</svg>
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
<svg width="256" height="256" viewBox="0 0 256 256" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<defs>
|
|
3
|
+
<linearGradient id="bodyGrad" x1="48" y1="48" x2="208" y2="220" gradientUnits="userSpaceOnUse">
|
|
4
|
+
<stop offset="0" stop-color="#2e7d32"/>
|
|
5
|
+
<stop offset="1" stop-color="#1b5e20"/>
|
|
6
|
+
</linearGradient>
|
|
7
|
+
<linearGradient id="accentGrad" x1="60" y1="90" x2="196" y2="170" gradientUnits="userSpaceOnUse">
|
|
8
|
+
<stop offset="0" stop-color="#aed581"/>
|
|
9
|
+
<stop offset="1" stop-color="#66bb6a"/>
|
|
10
|
+
</linearGradient>
|
|
11
|
+
<filter id="glow" x="-30%" y="-30%" width="160%" height="160%">
|
|
12
|
+
<feGaussianBlur stdDeviation="3" result="blur"/>
|
|
13
|
+
<feMerge><feMergeNode in="blur"/><feMergeNode in="SourceGraphic"/></feMerge>
|
|
14
|
+
</filter>
|
|
15
|
+
</defs>
|
|
16
|
+
<g id="pet-body-group">
|
|
17
|
+
|
|
18
|
+
<!-- Flower -->
|
|
19
|
+
<circle cx="108" cy="30" r="8" fill="#ff8a65"/>
|
|
20
|
+
<circle cx="122" cy="22" r="8" fill="#ffab91"/>
|
|
21
|
+
<circle cx="136" cy="30" r="8" fill="#ff8a65"/>
|
|
22
|
+
<circle cx="122" cy="34" r="7" fill="#ffe082"/>
|
|
23
|
+
|
|
24
|
+
<!-- Body segments -->
|
|
25
|
+
<rect x="60" y="46" width="136" height="120" rx="46" fill="url(#bodyGrad)" stroke="url(#accentGrad)" stroke-width="3"/>
|
|
26
|
+
<rect x="48" y="150" width="160" height="70" rx="40" fill="url(#bodyGrad)" stroke="url(#accentGrad)" stroke-width="3"/>
|
|
27
|
+
|
|
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"/>
|
|
31
|
+
<path d="M34 118 L24 108 M34 128 L22 124 M222 118 L232 108 M222 128 L234 124"
|
|
32
|
+
stroke="url(#accentGrad)" stroke-width="3" stroke-linecap="round"/>
|
|
33
|
+
|
|
34
|
+
<!-- Screen face -->
|
|
35
|
+
<rect x="80" y="76" width="96" height="66" rx="14" fill="#0a1420" stroke="#aed581" stroke-opacity="0.4" stroke-width="1.5"/>
|
|
36
|
+
|
|
37
|
+
<!-- Eyes -->
|
|
38
|
+
<g filter="url(#glow)">
|
|
39
|
+
<rect x="100" y="98" width="12" height="22" rx="5" fill="url(#accentGrad)">
|
|
40
|
+
<animate attributeName="height" values="22;2;22" keyTimes="0;0.5;1" dur="3.2s" repeatCount="indefinite"/>
|
|
41
|
+
<animate attributeName="y" values="98;108;98" keyTimes="0;0.5;1" dur="3.2s" repeatCount="indefinite"/>
|
|
42
|
+
</rect>
|
|
43
|
+
<rect x="144" y="98" width="12" height="22" rx="5" fill="url(#accentGrad)">
|
|
44
|
+
<animate attributeName="height" values="22;2;22" keyTimes="0;0.5;1" dur="3.2s" repeatCount="indefinite"/>
|
|
45
|
+
<animate attributeName="y" values="98;108;98" keyTimes="0;0.5;1" dur="3.2s" repeatCount="indefinite"/>
|
|
46
|
+
</rect>
|
|
47
|
+
</g>
|
|
48
|
+
|
|
49
|
+
<!-- Pot base / feet -->
|
|
50
|
+
<path d="M56 220 L200 220 L184 244 L72 244 Z" fill="#8d6e63" stroke="#a1887f" stroke-width="2"/>
|
|
51
|
+
</g>
|
|
52
|
+
</svg>
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
<svg width="256" height="256" viewBox="0 0 256 256" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<defs>
|
|
3
|
+
<linearGradient id="crystalGrad" x1="48" y1="30" x2="208" y2="220" gradientUnits="userSpaceOnUse">
|
|
4
|
+
<stop offset="0" stop-color="#b388ff" stop-opacity="0.85"/>
|
|
5
|
+
<stop offset="0.5" stop-color="#2afadf" stop-opacity="0.7"/>
|
|
6
|
+
<stop offset="1" stop-color="#7c4dff" stop-opacity="0.85"/>
|
|
7
|
+
</linearGradient>
|
|
8
|
+
<filter id="glow" x="-30%" y="-30%" width="160%" height="160%">
|
|
9
|
+
<feGaussianBlur stdDeviation="4" result="blur"/>
|
|
10
|
+
<feMerge><feMergeNode in="blur"/><feMergeNode in="SourceGraphic"/></feMerge>
|
|
11
|
+
</filter>
|
|
12
|
+
</defs>
|
|
13
|
+
<g id="pet-body-group">
|
|
14
|
+
|
|
15
|
+
<!-- Shadow (floating) -->
|
|
16
|
+
<ellipse cx="128" cy="236" rx="46" ry="8" fill="#000" fill-opacity="0.15"/>
|
|
17
|
+
|
|
18
|
+
<!-- Faceted crystal body -->
|
|
19
|
+
<path d="M128 26 L184 78 L168 190 L128 232 L88 190 L72 78 Z"
|
|
20
|
+
fill="url(#crystalGrad)" stroke="#e1bee7" stroke-width="2.5" filter="url(#glow)">
|
|
21
|
+
<animateTransform attributeName="transform" type="translate" values="0 0;0 -10;0 0" dur="3s" repeatCount="indefinite"/>
|
|
22
|
+
</path>
|
|
23
|
+
<!-- Inner facet lines -->
|
|
24
|
+
<line x1="128" y1="26" x2="128" y2="232" stroke="#ffffff" stroke-opacity="0.35" stroke-width="1.5"/>
|
|
25
|
+
<line x1="72" y1="78" x2="184" y2="78" stroke="#ffffff" stroke-opacity="0.35" stroke-width="1.5"/>
|
|
26
|
+
<line x1="88" y1="190" x2="168" y2="190" stroke="#ffffff" stroke-opacity="0.35" stroke-width="1.5"/>
|
|
27
|
+
|
|
28
|
+
<!-- Angular eyes -->
|
|
29
|
+
<path d="M100 110 L112 122 L100 134 L92 122 Z" fill="#0a1420"/>
|
|
30
|
+
<path d="M156 110 L168 122 L156 134 L148 122 Z" fill="#0a1420"/>
|
|
31
|
+
</g>
|
|
32
|
+
</svg>
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
<svg width="256" height="256" viewBox="0 0 256 256" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<defs>
|
|
3
|
+
<linearGradient id="bodyGrad" x1="48" y1="48" x2="208" y2="220" gradientUnits="userSpaceOnUse">
|
|
4
|
+
<stop offset="0" stop-color="#1b263b"/>
|
|
5
|
+
<stop offset="1" stop-color="#0d1b2a"/>
|
|
6
|
+
</linearGradient>
|
|
7
|
+
<linearGradient id="accentGrad" x1="60" y1="90" x2="196" y2="170" gradientUnits="userSpaceOnUse">
|
|
8
|
+
<stop offset="0" stop-color="#2afadf"/>
|
|
9
|
+
<stop offset="1" stop-color="#42a5f5"/>
|
|
10
|
+
</linearGradient>
|
|
11
|
+
<filter id="glow" x="-30%" y="-30%" width="160%" height="160%">
|
|
12
|
+
<feGaussianBlur stdDeviation="3" result="blur"/>
|
|
13
|
+
<feMerge><feMergeNode in="blur"/><feMergeNode in="SourceGraphic"/></feMerge>
|
|
14
|
+
</filter>
|
|
15
|
+
</defs>
|
|
16
|
+
<g id="pet-body-group">
|
|
17
|
+
|
|
18
|
+
<!-- Antenna dish (kept 8px lower than original so the dish curve's peak stays clear
|
|
19
|
+
of the viewBox top edge during the idle float animation's -6px translateY) -->
|
|
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"/>
|
|
22
|
+
|
|
23
|
+
<!-- Solar panel wings -->
|
|
24
|
+
<rect x="4" y="88" width="50" height="70" rx="6" fill="url(#bodyGrad)" stroke="url(#accentGrad)" stroke-width="2.5"/>
|
|
25
|
+
<line x1="4" y1="105" x2="54" y2="105" stroke="url(#accentGrad)" stroke-opacity="0.5" stroke-width="1.5"/>
|
|
26
|
+
<line x1="4" y1="123" x2="54" y2="123" stroke="url(#accentGrad)" stroke-opacity="0.5" stroke-width="1.5"/>
|
|
27
|
+
<line x1="4" y1="141" x2="54" y2="141" stroke="url(#accentGrad)" stroke-opacity="0.5" stroke-width="1.5"/>
|
|
28
|
+
<rect x="202" y="88" width="50" height="70" rx="6" fill="url(#bodyGrad)" stroke="url(#accentGrad)" stroke-width="2.5"/>
|
|
29
|
+
<line x1="202" y1="105" x2="252" y2="105" stroke="url(#accentGrad)" stroke-opacity="0.5" stroke-width="1.5"/>
|
|
30
|
+
<line x1="202" y1="123" x2="252" y2="123" stroke="url(#accentGrad)" stroke-opacity="0.5" stroke-width="1.5"/>
|
|
31
|
+
<line x1="202" y1="141" x2="252" y2="141" stroke="url(#accentGrad)" stroke-opacity="0.5" stroke-width="1.5"/>
|
|
32
|
+
<rect x="54" y="116" width="16" height="10" fill="url(#accentGrad)"/>
|
|
33
|
+
<rect x="186" y="116" width="16" height="10" fill="url(#accentGrad)"/>
|
|
34
|
+
|
|
35
|
+
<!-- Round body -->
|
|
36
|
+
<circle cx="128" cy="140" r="76" fill="url(#bodyGrad)" stroke="url(#accentGrad)" stroke-width="3"/>
|
|
37
|
+
|
|
38
|
+
<!-- Screen face -->
|
|
39
|
+
<rect x="82" y="106" width="92" height="64" rx="14" fill="#0a1420" stroke="#2afadf" stroke-opacity="0.4" stroke-width="1.5"/>
|
|
40
|
+
|
|
41
|
+
<!-- Eyes -->
|
|
42
|
+
<g filter="url(#glow)">
|
|
43
|
+
<circle cx="112" cy="138" r="9" fill="url(#accentGrad)">
|
|
44
|
+
<animate attributeName="r" values="9;2;9" keyTimes="0;0.5;1" dur="3.2s" repeatCount="indefinite"/>
|
|
45
|
+
</circle>
|
|
46
|
+
<circle cx="144" cy="138" r="9" fill="url(#accentGrad)">
|
|
47
|
+
<animate attributeName="r" values="9;2;9" keyTimes="0;0.5;1" dur="3.2s" repeatCount="indefinite"/>
|
|
48
|
+
</circle>
|
|
49
|
+
</g>
|
|
50
|
+
|
|
51
|
+
<!-- Struts / feet -->
|
|
52
|
+
<line x1="106" y1="212" x2="90" y2="236" stroke="url(#accentGrad)" stroke-width="6" stroke-linecap="round"/>
|
|
53
|
+
<line x1="150" y1="212" x2="166" y2="236" stroke="url(#accentGrad)" stroke-width="6" stroke-linecap="round"/>
|
|
54
|
+
</g>
|
|
55
|
+
</svg>
|