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
package/assets/mascot.svg CHANGED
@@ -53,6 +53,4 @@
53
53
  <!-- Legs / feet -->
54
54
  <rect x="76" y="200" width="20" height="26" rx="8" fill="url(#bodyGrad)" stroke="url(#cyanGrad)" stroke-width="2.5"/>
55
55
  <rect x="160" y="200" width="20" height="26" rx="8" fill="url(#bodyGrad)" stroke="url(#cyanGrad)" stroke-width="2.5"/>
56
- <rect x="66" y="222" width="40" height="10" rx="5" fill="#2afadf" fill-opacity="0.6"/>
57
- <rect x="150" y="222" width="40" height="10" rx="5" fill="#2afadf" fill-opacity="0.6"/>
58
56
  </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="#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
+ <!-- Ears -->
19
+ <path d="M52 62 L34 24 L78 48 Z" fill="url(#bodyGrad)" stroke="url(#accentGrad)" stroke-width="3"/>
20
+ <path d="M204 62 L222 24 L178 48 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="28" 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="#2afadf" 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
+ <!-- Cat mouth -->
41
+ <path d="M118 148 L128 156 L138 148" stroke="#2afadf" stroke-width="4" fill="none" stroke-linecap="round" filter="url(#glow)"/>
42
+
43
+ <!-- Whiskers -->
44
+ <line x1="46" y1="128" x2="76" y2="124" stroke="url(#accentGrad)" stroke-width="2" stroke-linecap="round"/>
45
+ <line x1="46" y1="140" x2="76" y2="140" stroke="url(#accentGrad)" stroke-width="2" stroke-linecap="round"/>
46
+ <line x1="210" y1="128" x2="180" y2="124" stroke="url(#accentGrad)" stroke-width="2" stroke-linecap="round"/>
47
+ <line x1="210" y1="140" x2="180" y2="140" stroke="url(#accentGrad)" stroke-width="2" stroke-linecap="round"/>
48
+
49
+ <!-- Legs / feet -->
50
+ <rect x="76" y="200" width="20" height="26" rx="8" fill="url(#bodyGrad)" stroke="url(#accentGrad)" stroke-width="2.5"/>
51
+ <rect x="160" y="200" width="20" height="26" rx="8" fill="url(#bodyGrad)" stroke="url(#accentGrad)" stroke-width="2.5"/>
52
+
53
+ <!-- Tail -->
54
+ <path d="M216 180 Q246 190 240 150" stroke="url(#accentGrad)" stroke-width="8" stroke-linecap="round" fill="none"/>
55
+ </g>
56
+ </svg>
@@ -0,0 +1,53 @@
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="#ff8a65"/>
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
+ <!-- Floppy ears -->
19
+ <path d="M50 68 Q16 88 26 142 Q42 152 58 122 Z" fill="url(#bodyGrad)" stroke="url(#accentGrad)" stroke-width="3"/>
20
+ <path d="M206 68 Q240 88 230 142 Q214 152 198 122 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="28" 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
+ <!-- Nose + tongue -->
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"/>
43
+
44
+ <!-- Legs / feet -->
45
+ <rect x="76" y="200" width="20" height="26" rx="8" fill="url(#bodyGrad)" stroke="url(#accentGrad)" stroke-width="2.5"/>
46
+ <rect x="160" y="200" width="20" height="26" rx="8" fill="url(#bodyGrad)" stroke="url(#accentGrad)" stroke-width="2.5"/>
47
+
48
+ <!-- Wagging tail -->
49
+ <path d="M216 178 Q250 168 244 138" stroke="url(#accentGrad)" stroke-width="8" stroke-linecap="round" fill="none">
50
+ <animateTransform attributeName="transform" type="rotate" values="0 216 178;18 216 178;0 216 178" dur="0.8s" repeatCount="indefinite"/>
51
+ </path>
52
+ </g>
53
+ </svg>
@@ -0,0 +1,53 @@
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="#ff7043"/>
9
+ <stop offset="1" stop-color="#ffab91"/>
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
+ <!-- Pointed ears with white tips -->
19
+ <path d="M56 60 L30 18 L82 46 Z" fill="url(#bodyGrad)" stroke="url(#accentGrad)" stroke-width="3"/>
20
+ <path d="M200 60 L226 18 L174 46 Z" fill="url(#bodyGrad)" stroke="url(#accentGrad)" stroke-width="3"/>
21
+ <circle cx="34" cy="24" r="4" fill="#fff" fill-opacity="0.85"/>
22
+ <circle cx="222" cy="24" r="4" fill="#fff" fill-opacity="0.85"/>
23
+
24
+ <!-- Body / head -->
25
+ <rect x="40" y="50" width="176" height="150" rx="28" 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="#ff7043" 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
+ <!-- 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)"/>
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
+ <!-- Bushy tail with white tip -->
50
+ <path d="M216 180 Q252 186 248 142 Q244 120 220 128" fill="url(#bodyGrad)" stroke="url(#accentGrad)" stroke-width="3"/>
51
+ <circle cx="230" cy="132" r="10" fill="#fff" fill-opacity="0.85"/>
52
+ </g>
53
+ </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="#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
+ <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>