mocode-pet-app 0.1.0 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/assets/mascot.svg +0 -2
  2. package/assets/pets/01-robo-cat.svg +56 -0
  3. package/assets/pets/02-robo-dog.svg +53 -0
  4. package/assets/pets/03-robo-fox.svg +53 -0
  5. package/assets/pets/04-robo-panda.svg +52 -0
  6. package/assets/pets/05-robo-owl.svg +46 -0
  7. package/assets/pets/06-robo-bunny.svg +52 -0
  8. package/assets/pets/07-robo-frog.svg +39 -0
  9. package/assets/pets/08-robo-bear.svg +48 -0
  10. package/assets/pets/09-robo-penguin.svg +49 -0
  11. package/assets/pets/10-robo-dino.svg +56 -0
  12. package/assets/pets/11-slime-blob.svg +43 -0
  13. package/assets/pets/12-ghost-byte.svg +41 -0
  14. package/assets/pets/13-cactus-bot.svg +52 -0
  15. package/assets/pets/14-crystal-bot.svg +32 -0
  16. package/assets/pets/15-satellite-bot.svg +55 -0
  17. package/assets/pets/16-jellyfish-bot.svg +47 -0
  18. package/assets/pets/17-mushroom-bot.svg +47 -0
  19. package/assets/pets/18-star-bot.svg +45 -0
  20. package/assets/pets/manifest.json +25 -0
  21. package/assets/signal-light.svg +55 -0
  22. package/assets/tray-icon.png +0 -0
  23. package/dist/assets/mascot.svg +0 -2
  24. package/dist/assets/pets/01-robo-cat.svg +56 -0
  25. package/dist/assets/pets/02-robo-dog.svg +53 -0
  26. package/dist/assets/pets/03-robo-fox.svg +53 -0
  27. package/dist/assets/pets/04-robo-panda.svg +52 -0
  28. package/dist/assets/pets/05-robo-owl.svg +46 -0
  29. package/dist/assets/pets/06-robo-bunny.svg +52 -0
  30. package/dist/assets/pets/07-robo-frog.svg +39 -0
  31. package/dist/assets/pets/08-robo-bear.svg +48 -0
  32. package/dist/assets/pets/09-robo-penguin.svg +49 -0
  33. package/dist/assets/pets/10-robo-dino.svg +56 -0
  34. package/dist/assets/pets/11-slime-blob.svg +43 -0
  35. package/dist/assets/pets/12-ghost-byte.svg +41 -0
  36. package/dist/assets/pets/13-cactus-bot.svg +52 -0
  37. package/dist/assets/pets/14-crystal-bot.svg +32 -0
  38. package/dist/assets/pets/15-satellite-bot.svg +55 -0
  39. package/dist/assets/pets/16-jellyfish-bot.svg +47 -0
  40. package/dist/assets/pets/17-mushroom-bot.svg +47 -0
  41. package/dist/assets/pets/18-star-bot.svg +45 -0
  42. package/dist/assets/pets/manifest.json +25 -0
  43. package/dist/assets/signal-light.svg +55 -0
  44. package/dist/assets/tray-icon.png +0 -0
  45. package/dist/config.js +42 -0
  46. package/dist/main.js +158 -16
  47. package/dist/protocol.js +25 -0
  48. package/dist/renderer/index.html +4 -1
  49. package/dist/renderer/preload.js +32 -3
  50. package/dist/renderer/renderer.js +74 -10
  51. package/dist/renderer/style.css +114 -9
  52. package/dist/skins.js +55 -0
  53. package/package.json +2 -2
@@ -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
+ <path d="M40 130 Q14 150 26 186" stroke="url(#accentGrad)" stroke-width="10" stroke-linecap="round" fill="none"/>
40
+ <path d="M216 130 Q242 150 230 186" stroke="url(#accentGrad)" stroke-width="10" stroke-linecap="round" fill="none"/>
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,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="#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
+ <!-- Legs / feet -->
46
+ <rect x="76" y="200" width="20" height="26" rx="8" fill="url(#bodyGrad)" stroke="url(#accentGrad)" stroke-width="2.5"/>
47
+ <rect x="160" y="200" width="20" height="26" rx="8" fill="url(#bodyGrad)" stroke="url(#accentGrad)" stroke-width="2.5"/>
48
+
49
+ <!-- Fluffy tail -->
50
+ <circle cx="224" cy="184" r="16" fill="url(#bodyGrad)" stroke="url(#accentGrad)" stroke-width="3"/>
51
+ </g>
52
+ </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 148 Q22 172 40 200" stroke="url(#bodyGrad)" stroke-width="20" stroke-linecap="round" fill="none"/>
43
+ <path d="M214 148 Q234 172 216 200" stroke="url(#bodyGrad)" stroke-width="20" stroke-linecap="round" fill="none"/>
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,56 @@
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
+ <path d="M40 130 Q24 138 26 156" stroke="url(#accentGrad)" stroke-width="7" stroke-linecap="round" fill="none"/>
46
+ <path d="M216 130 Q232 138 230 156" stroke="url(#accentGrad)" stroke-width="7" stroke-linecap="round" fill="none"/>
47
+
48
+ <!-- Legs / feet -->
49
+ <rect x="76" y="200" width="20" height="26" rx="8" fill="url(#bodyGrad)" stroke="url(#accentGrad)" stroke-width="2.5"/>
50
+ <rect x="160" y="200" width="20" height="26" rx="8" fill="url(#bodyGrad)" stroke="url(#accentGrad)" stroke-width="2.5"/>
51
+
52
+ <!-- Spiky tail -->
53
+ <path d="M216 176 Q248 178 244 150" stroke="url(#accentGrad)" stroke-width="8" stroke-linecap="round" fill="none"/>
54
+ <path d="M240 150 L248 138 L252 154 Z" fill="url(#accentGrad)"/>
55
+ </g>
56
+ </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="M60 110 Q28 118 30 148" stroke="url(#accentGrad)" stroke-width="8" stroke-linecap="round" fill="none"/>
30
+ <path d="M196 110 Q228 118 226 148" stroke="url(#accentGrad)" stroke-width="8" stroke-linecap="round" fill="none"/>
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>
@@ -0,0 +1,47 @@
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="domeGrad" x1="48" y1="30" x2="208" y2="120" gradientUnits="userSpaceOnUse">
4
+ <stop offset="0" stop-color="#ce93d8" stop-opacity="0.85"/>
5
+ <stop offset="1" stop-color="#7e57c2" stop-opacity="0.8"/>
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
+ <!-- Dome head -->
15
+ <path d="M46 110 C46 56 82 26 128 26 C174 26 210 56 210 110 Z"
16
+ fill="url(#domeGrad)" stroke="#e1bee7" stroke-width="2.5"/>
17
+
18
+ <!-- Eyes -->
19
+ <g filter="url(#glow)">
20
+ <circle cx="102" cy="86" r="8" fill="#0a1420"/>
21
+ <circle cx="154" cy="86" r="8" fill="#0a1420"/>
22
+ </g>
23
+ <path d="M112 104 Q128 114 144 104" stroke="#0a1420" stroke-width="3" fill="none" stroke-linecap="round"/>
24
+
25
+ <!-- Tentacles -->
26
+ <path d="M64 110 Q56 150 66 190 Q72 210 62 232" stroke="#ba68c8" stroke-width="7" fill="none" stroke-linecap="round">
27
+ <animate attributeName="d" values="M64 110 Q56 150 66 190 Q72 210 62 232;M64 110 Q72 150 58 190 Q64 210 74 232;M64 110 Q56 150 66 190 Q72 210 62 232" dur="2.6s" repeatCount="indefinite"/>
28
+ </path>
29
+ <path d="M98 112 Q92 156 100 200 Q104 218 96 236" stroke="#ba68c8" stroke-width="7" fill="none" stroke-linecap="round">
30
+ <animate attributeName="d" values="M98 112 Q92 156 100 200 Q104 218 96 236;M98 112 Q104 156 92 200 Q96 218 106 236;M98 112 Q92 156 100 200 Q104 218 96 236" dur="2.9s" repeatCount="indefinite"/>
31
+ </path>
32
+ <path d="M132 114 Q128 158 134 202 Q136 220 130 238" stroke="#ba68c8" stroke-width="7" fill="none" stroke-linecap="round">
33
+ <animate attributeName="d" values="M132 114 Q128 158 134 202 Q136 220 130 238;M132 114 Q138 158 126 202 Q130 220 138 238;M132 114 Q128 158 134 202 Q136 220 130 238" dur="2.4s" repeatCount="indefinite"/>
34
+ </path>
35
+ <path d="M166 112 Q160 156 168 200 Q172 218 164 236" stroke="#ba68c8" stroke-width="7" fill="none" stroke-linecap="round">
36
+ <animate attributeName="d" values="M166 112 Q160 156 168 200 Q172 218 164 236;M166 112 Q172 156 160 200 Q164 218 174 236;M166 112 Q160 156 168 200 Q172 218 164 236" dur="2.7s" repeatCount="indefinite"/>
37
+ </path>
38
+ <path d="M196 110 Q204 150 194 190 Q188 210 198 232" stroke="#ba68c8" stroke-width="7" fill="none" stroke-linecap="round">
39
+ <animate attributeName="d" values="M196 110 Q204 150 194 190 Q188 210 198 232;M196 110 Q188 150 202 190 Q196 210 186 232;M196 110 Q204 150 194 190 Q188 210 198 232" dur="3.1s" repeatCount="indefinite"/>
40
+ </path>
41
+
42
+ <!-- Glow dots -->
43
+ <circle cx="66" cy="170" r="3" fill="#e040fb" filter="url(#glow)"/>
44
+ <circle cx="132" cy="180" r="3" fill="#e040fb" filter="url(#glow)"/>
45
+ <circle cx="196" cy="170" r="3" fill="#e040fb" filter="url(#glow)"/>
46
+ </g>
47
+ </svg>