lilgotchi 0.0.0-stage → 3.0.2
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/LICENSE.md +21 -0
- package/README.md +69 -3
- package/dist/LICENSE.md +21 -0
- package/dist/README.md +69 -0
- package/dist/design/evolution/README.md +7 -0
- package/dist/design/evolution/cypunk.js +3 -0
- package/dist/design/evolution/cypunk.md +20 -0
- package/dist/design/evolution/index.html +20 -0
- package/dist/design/evolution/lilgotchi.js +3 -0
- package/dist/design/evolution/lilgotchi.md +20 -0
- package/dist/design/evolution/preview.css +3 -0
- package/dist/design/evolution/preview.js +47 -0
- package/dist/design/evolution/slice.js +3 -0
- package/dist/design/evolution/slice.md +14 -0
- package/dist/design/games/README.md +52 -0
- package/dist/design/games/bump.md +23 -0
- package/dist/design/games/catalog.md +24 -0
- package/dist/design/games/flag.md +19 -0
- package/dist/design/games/get.md +21 -0
- package/dist/design/games/heading.md +23 -0
- package/dist/design/games/hoops.md +17 -0
- package/dist/design/games/left-right.md +30 -0
- package/dist/design/games/memory.md +21 -0
- package/dist/design/games/polish-review.md +11 -0
- package/dist/design/games/release-checklist.md +52 -0
- package/dist/design/games/sprint.md +21 -0
- package/dist/docs/README.md +14 -0
- package/dist/docs/care.md +51 -0
- package/dist/docs/characters.md +51 -0
- package/dist/docs/credits.md +17 -0
- package/dist/docs/development.md +87 -0
- package/dist/docs/frame-contract.md +38 -0
- package/dist/docs/images/cypunk-family.jpg +0 -0
- package/dist/docs/images/lilgotchi-family.jpg +0 -0
- package/dist/docs/images/original-family.jpg +0 -0
- package/dist/docs/images/slice-family.jpg +0 -0
- package/dist/docs/install.md +41 -0
- package/dist/docs/release-review.md +47 -0
- package/dist/embed.js +21 -0
- package/dist/examples/cross-origin.html +7 -0
- package/dist/examples/curated.html +12 -0
- package/dist/examples/duplicate.html +3 -0
- package/dist/examples/install.html +11 -0
- package/dist/examples/launcher-review.html +23 -0
- package/dist/examples/launchers.html +10 -0
- package/dist/examples/nested/index.html +6 -0
- package/dist/examples/one-line.html +9 -0
- package/dist/index.html +100 -0
- package/dist/lilgotchi.js +437 -0
- package/dist/pets/NOTICE.md +19 -0
- package/dist/pets/README.md +7 -0
- package/dist/pets/arcade-catalog.js +52 -0
- package/dist/pets/arcade-geometry.js +18 -0
- package/dist/pets/arcade-opponents.js +16 -0
- package/dist/pets/arcade-renderer.js +116 -0
- package/dist/pets/arcade-sprites.js +64 -0
- package/dist/pets/arcade.js +393 -0
- package/dist/pets/away.js +20 -0
- package/dist/pets/boot.js +161 -0
- package/dist/pets/catalog.js +32 -0
- package/dist/pets/celebrations.js +54 -0
- package/dist/pets/classic-sprites.js +672 -0
- package/dist/pets/clock.js +3 -0
- package/dist/pets/colors.js +38 -0
- package/dist/pets/constants.js +20 -0
- package/dist/pets/custom-themes.css +80 -0
- package/dist/pets/cyberpunk-sprites.js +68 -0
- package/dist/pets/cypunk-original.js +2 -0
- package/dist/pets/embed.css +130 -0
- package/dist/pets/engine.js +38 -0
- package/dist/pets/evolution.js +46 -0
- package/dist/pets/focus.js +27 -0
- package/dist/pets/font.js +185 -0
- package/dist/pets/game.css +275 -0
- package/dist/pets/game.html +148 -0
- package/dist/pets/game.js +626 -0
- package/dist/pets/layout.js +53 -0
- package/dist/pets/lilgotchi-sprites.js +62 -0
- package/dist/pets/minigames/bump.js +52 -0
- package/dist/pets/minigames/flag.js +87 -0
- package/dist/pets/minigames/get.js +59 -0
- package/dist/pets/minigames/heading.js +117 -0
- package/dist/pets/minigames/hoops.js +96 -0
- package/dist/pets/minigames/memory.js +81 -0
- package/dist/pets/minigames/model.js +40 -0
- package/dist/pets/minigames/sprint.js +103 -0
- package/dist/pets/original-roster.js +46 -0
- package/dist/pets/original-sprites.js +3861 -0
- package/dist/pets/overlay-size.js +13 -0
- package/dist/pets/pixel-size.js +6 -0
- package/dist/pets/presentation.js +80 -0
- package/dist/pets/renderer.js +100 -0
- package/dist/pets/scenery.css +24 -0
- package/dist/pets/simulation.js +185 -0
- package/dist/pets/skins.js +14 -0
- package/dist/pets/slice-sprites.js +38 -0
- package/dist/pets/sound.js +33 -0
- package/dist/pets/status.js +28 -0
- package/dist/pets/storage.js +49 -0
- package/dist/pets/valid-state.js +26 -0
- package/dist/pets/wellbeing.js +73 -0
- package/dist/reference/source.json +8 -0
- package/dist/version.json +5 -0
- package/dist/widget/care-guide.js +50 -0
- package/dist/widget/care-monitor.js +52 -0
- package/dist/widget/color-controls.js +15 -0
- package/dist/widget/configurator.js +24 -0
- package/dist/widget/egg.svg +1 -0
- package/dist/widget/focus.js +6 -0
- package/dist/widget/gallery.js +17 -0
- package/dist/widget/inactive.js +24 -0
- package/dist/widget/install-snippet.js +14 -0
- package/dist/widget/launcher.js +63 -0
- package/dist/widget/pet-history.js +57 -0
- package/dist/widget/pet-label.js +12 -0
- package/dist/widget/save-store.js +198 -0
- package/dist/widget/scroll-lock.js +11 -0
- package/dist/widget/settings.js +48 -0
- package/dist/widget/shell.css +63 -0
- package/package.json +43 -6
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
*{margin:0;padding:0;box-sizing:border-box;-webkit-tap-highlight-color:transparent;touch-action:manipulation}
|
|
2
|
+
|
|
3
|
+
/* === Color Theme Variables === */
|
|
4
|
+
:root{
|
|
5
|
+
--bg-page:#2a2a2a;
|
|
6
|
+
--device-bg:linear-gradient(145deg,#e8d5c4,#c9a882);
|
|
7
|
+
--device-shadow:0 8px 32px rgba(0,0,0,.5);
|
|
8
|
+
--device-inset:inset 0 2px 4px rgba(255,255,255,.3);
|
|
9
|
+
--screen-frame:#7b8868;
|
|
10
|
+
--screen-inset:inset 0 3px 8px rgba(0,0,0,.4);
|
|
11
|
+
--lcd-bg:#c4cfa1;
|
|
12
|
+
--lcd-fg:#0f380f;
|
|
13
|
+
--attn-bar:#7b8868;
|
|
14
|
+
--attn-active:#ff4444;
|
|
15
|
+
--btn-bg:linear-gradient(180deg,#5a6650,#3d4636);
|
|
16
|
+
--btn-border:#2a2e25;
|
|
17
|
+
--btn-color:#c4cfa1;
|
|
18
|
+
--btn-shadow:0 3px 6px rgba(0,0,0,.3);
|
|
19
|
+
--btn-inset:inset 0 1px 1px rgba(255,255,255,.1);
|
|
20
|
+
--btn-active-bg:linear-gradient(180deg,#8bac0f,#5a6650);
|
|
21
|
+
--accent:#8bac0f;
|
|
22
|
+
--accent-dark:#0f380f;
|
|
23
|
+
--toast-bg:#1a2a1a;
|
|
24
|
+
--toast-border:#8bac0f;
|
|
25
|
+
--toast-color:#c4cfa1;
|
|
26
|
+
--settings-btn-color:#8b7355;
|
|
27
|
+
--overlay-bg:rgba(0,0,0,.85);
|
|
28
|
+
--overlay-color:#c4cfa1;
|
|
29
|
+
--overlay-btn-bg:linear-gradient(180deg,#5a6650,#3d4636);
|
|
30
|
+
--overlay-btn-border:#8bac0f;
|
|
31
|
+
--overlay-btn-color:#c4cfa1;
|
|
32
|
+
--overlay-btn-active-bg:#8bac0f;
|
|
33
|
+
--overlay-btn-active-color:#0f380f;
|
|
34
|
+
--overlay-close-color:#888;
|
|
35
|
+
--overlay-close-border:#555;
|
|
36
|
+
--overlay-close-active:#333;
|
|
37
|
+
--stat-border:#3d4636;
|
|
38
|
+
--stat-hearts:#8bac0f;
|
|
39
|
+
--input-bg:#1a1a1a;
|
|
40
|
+
--input-border:#8bac0f;
|
|
41
|
+
--input-color:#c4cfa1;
|
|
42
|
+
--info-color:#666;
|
|
43
|
+
--death-msg:#888;
|
|
44
|
+
--toggle-bg:#333;
|
|
45
|
+
--toggle-knob:#888;
|
|
46
|
+
--toggle-active-bg:#8bac0f;
|
|
47
|
+
--toggle-active-knob:#fff;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/* === E-ink Theme === */
|
|
51
|
+
.eink{
|
|
52
|
+
--bg-page:#e8e8e8;
|
|
53
|
+
--device-bg:linear-gradient(145deg,#f5f5f5,#d8d8d8);
|
|
54
|
+
--device-shadow:0 4px 16px rgba(0,0,0,.15);
|
|
55
|
+
--device-inset:inset 0 1px 2px rgba(255,255,255,.6);
|
|
56
|
+
--screen-frame:#b0b0b0;
|
|
57
|
+
--screen-inset:inset 0 2px 6px rgba(0,0,0,.2);
|
|
58
|
+
--lcd-bg:#f0f0f0;
|
|
59
|
+
--lcd-fg:#111;
|
|
60
|
+
--attn-bar:#b0b0b0;
|
|
61
|
+
--attn-active:#222;
|
|
62
|
+
--btn-bg:linear-gradient(180deg,#e0e0e0,#c8c8c8);
|
|
63
|
+
--btn-border:#999;
|
|
64
|
+
--btn-color:#222;
|
|
65
|
+
--btn-shadow:0 2px 4px rgba(0,0,0,.12);
|
|
66
|
+
--btn-inset:inset 0 1px 1px rgba(255,255,255,.5);
|
|
67
|
+
--btn-active-bg:linear-gradient(180deg,#333,#555);
|
|
68
|
+
--accent:#333;
|
|
69
|
+
--accent-dark:#f0f0f0;
|
|
70
|
+
--toast-bg:#fff;
|
|
71
|
+
--toast-border:#333;
|
|
72
|
+
--toast-color:#111;
|
|
73
|
+
--settings-btn-color:#555;
|
|
74
|
+
--overlay-bg:rgba(240,240,240,.96);
|
|
75
|
+
--overlay-color:#111;
|
|
76
|
+
--overlay-btn-bg:linear-gradient(180deg,#e0e0e0,#c8c8c8);
|
|
77
|
+
--overlay-btn-border:#333;
|
|
78
|
+
--overlay-btn-color:#111;
|
|
79
|
+
--overlay-btn-active-bg:#333;
|
|
80
|
+
--overlay-btn-active-color:#f0f0f0;
|
|
81
|
+
--overlay-close-color:#555;
|
|
82
|
+
--overlay-close-border:#999;
|
|
83
|
+
--overlay-close-active:#ddd;
|
|
84
|
+
--stat-border:#ccc;
|
|
85
|
+
--stat-hearts:#111;
|
|
86
|
+
--input-bg:#fff;
|
|
87
|
+
--input-border:#555;
|
|
88
|
+
--input-color:#111;
|
|
89
|
+
--info-color:#777;
|
|
90
|
+
--death-msg:#555;
|
|
91
|
+
--toggle-bg:#ccc;
|
|
92
|
+
--toggle-knob:#888;
|
|
93
|
+
--toggle-active-bg:#333;
|
|
94
|
+
--toggle-active-knob:#fff;
|
|
95
|
+
}
|
|
96
|
+
/* E-ink: hide color emoji, show mono SVG icons */
|
|
97
|
+
.eink .icon-color{display:none!important}
|
|
98
|
+
.eink .icon-mono{display:block!important}
|
|
99
|
+
.eink .ctrl-btn:active{color:#f0f0f0}
|
|
100
|
+
.eink .ctrl-btn:active .icon-mono{color:#f0f0f0}
|
|
101
|
+
|
|
102
|
+
html,body{width:100%;height:100%;overflow:hidden;background:var(--bg-page);font-family:'Courier New',monospace}
|
|
103
|
+
body{display:flex;flex-direction:column;align-items:center;justify-content:center}
|
|
104
|
+
|
|
105
|
+
#device{
|
|
106
|
+
width:100%;max-width:380px;
|
|
107
|
+
background:var(--device-bg);
|
|
108
|
+
border-radius:48% 48% 44% 44% / 52% 52% 42% 42%;
|
|
109
|
+
padding:18px 14px 24px;
|
|
110
|
+
box-shadow:var(--device-shadow),var(--device-inset);
|
|
111
|
+
position:relative;
|
|
112
|
+
display:flex;flex-direction:column;align-items:center;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
#screen-frame{
|
|
116
|
+
background:var(--screen-frame);
|
|
117
|
+
border-radius:12px;
|
|
118
|
+
padding:6px;
|
|
119
|
+
box-shadow:var(--screen-inset);
|
|
120
|
+
width:92%;
|
|
121
|
+
}
|
|
122
|
+
#lcd{
|
|
123
|
+
display:block;width:100%;
|
|
124
|
+
image-rendering:pixelated;
|
|
125
|
+
image-rendering:crisp-edges;
|
|
126
|
+
border-radius:6px;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
#attention-bar{
|
|
130
|
+
width:92%;height:6px;margin:6px 0;border-radius:3px;
|
|
131
|
+
background:var(--attn-bar);transition:background .3s;
|
|
132
|
+
}
|
|
133
|
+
#attention-bar.active{
|
|
134
|
+
background:var(--attn-active);
|
|
135
|
+
animation:blink-bar .6s infinite;
|
|
136
|
+
}
|
|
137
|
+
@keyframes blink-bar{0%,100%{opacity:1}50%{opacity:.3}}
|
|
138
|
+
|
|
139
|
+
#controls{
|
|
140
|
+
display:grid;grid-template-columns:repeat(4,1fr);gap:8px;
|
|
141
|
+
width:94%;margin-top:10px;
|
|
142
|
+
}
|
|
143
|
+
.ctrl-btn{
|
|
144
|
+
display:flex;flex-direction:column;align-items:center;justify-content:center;
|
|
145
|
+
background:var(--btn-bg);
|
|
146
|
+
border:2px solid var(--btn-border);border-radius:10px;
|
|
147
|
+
color:var(--btn-color);font-size:10px;font-family:'Courier New',monospace;
|
|
148
|
+
padding:10px 4px;cursor:pointer;user-select:none;
|
|
149
|
+
box-shadow:var(--btn-shadow),var(--btn-inset);
|
|
150
|
+
transition:transform .08s,box-shadow .08s,opacity .2s;
|
|
151
|
+
min-height:56px;
|
|
152
|
+
position:relative;
|
|
153
|
+
}
|
|
154
|
+
.ctrl-btn:active{
|
|
155
|
+
transform:translateY(2px);
|
|
156
|
+
box-shadow:0 1px 2px rgba(0,0,0,.3);
|
|
157
|
+
background:var(--btn-active-bg);
|
|
158
|
+
}
|
|
159
|
+
.ctrl-btn.disabled{
|
|
160
|
+
opacity:.35;
|
|
161
|
+
pointer-events:none;
|
|
162
|
+
}
|
|
163
|
+
.ctrl-btn .icon{font-size:20px;line-height:1;margin-bottom:2px}
|
|
164
|
+
.ctrl-btn .icon-mono{display:none;width:22px;height:22px;margin-bottom:2px}
|
|
165
|
+
.ctrl-btn .label{font-size:9px;letter-spacing:.5px;text-transform:uppercase;opacity:.8}
|
|
166
|
+
|
|
167
|
+
/* Toast notification */
|
|
168
|
+
#toast{
|
|
169
|
+
position:fixed;top:12px;left:50%;transform:translateX(-50%) translateY(-80px);
|
|
170
|
+
background:var(--toast-bg);border:2px solid var(--toast-border);border-radius:10px;
|
|
171
|
+
padding:10px 20px;color:var(--toast-color);font-size:13px;
|
|
172
|
+
font-family:'Courier New',monospace;
|
|
173
|
+
z-index:300;white-space:nowrap;
|
|
174
|
+
box-shadow:0 4px 16px rgba(0,0,0,.3);
|
|
175
|
+
transition:transform .3s ease;
|
|
176
|
+
pointer-events:none;
|
|
177
|
+
}
|
|
178
|
+
#toast.show{
|
|
179
|
+
transform:translateX(-50%) translateY(0);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
#settings-btn{
|
|
183
|
+
position:absolute;top:10px;right:16px;
|
|
184
|
+
background:none;border:none;color:var(--settings-btn-color);font-size:20px;cursor:pointer;
|
|
185
|
+
opacity:.6;z-index:10;
|
|
186
|
+
}
|
|
187
|
+
#settings-btn:active{opacity:1}
|
|
188
|
+
|
|
189
|
+
/* Overlays */
|
|
190
|
+
.overlay{
|
|
191
|
+
position:fixed;top:0;left:0;width:100%;height:100%;
|
|
192
|
+
background:var(--overlay-bg);
|
|
193
|
+
display:none;flex-direction:column;align-items:center;justify-content:center;
|
|
194
|
+
z-index:100;color:var(--overlay-color);font-family:'Courier New',monospace;
|
|
195
|
+
}
|
|
196
|
+
.overlay.show{display:flex}
|
|
197
|
+
.overlay-title{font-size:18px;margin-bottom:20px;color:var(--accent);letter-spacing:2px}
|
|
198
|
+
.overlay-btn{
|
|
199
|
+
display:block;width:220px;padding:16px;margin:8px;
|
|
200
|
+
background:var(--overlay-btn-bg);
|
|
201
|
+
border:2px solid var(--overlay-btn-border);border-radius:12px;
|
|
202
|
+
color:var(--overlay-btn-color);font-size:16px;text-align:center;cursor:pointer;
|
|
203
|
+
font-family:'Courier New',monospace;
|
|
204
|
+
transition:background .1s;
|
|
205
|
+
}
|
|
206
|
+
.overlay-btn:active{background:var(--overlay-btn-active-bg);color:var(--overlay-btn-active-color)}
|
|
207
|
+
.overlay-close{
|
|
208
|
+
margin-top:20px;color:var(--overlay-close-color);font-size:14px;cursor:pointer;
|
|
209
|
+
padding:12px 24px;border:1px solid var(--overlay-close-border);border-radius:8px;
|
|
210
|
+
}
|
|
211
|
+
.overlay-close:active{background:var(--overlay-close-active)}
|
|
212
|
+
|
|
213
|
+
/* Stats overlay */
|
|
214
|
+
#stats-overlay .stat-row{
|
|
215
|
+
display:flex;align-items:center;justify-content:space-between;
|
|
216
|
+
width:260px;padding:8px 0;border-bottom:1px solid var(--stat-border);
|
|
217
|
+
font-size:14px;
|
|
218
|
+
}
|
|
219
|
+
#stats-overlay .hearts{color:var(--stat-hearts);font-size:18px;letter-spacing:2px}
|
|
220
|
+
|
|
221
|
+
/* Game overlay */
|
|
222
|
+
#game-overlay .game-area{
|
|
223
|
+
display:flex;align-items:center;justify-content:center;gap:30px;
|
|
224
|
+
margin:20px 0;
|
|
225
|
+
}
|
|
226
|
+
#game-overlay .game-arrow{
|
|
227
|
+
width:80px;height:80px;
|
|
228
|
+
background:var(--overlay-btn-bg);
|
|
229
|
+
border:2px solid var(--accent);border-radius:50%;
|
|
230
|
+
color:var(--overlay-btn-color);font-size:36px;
|
|
231
|
+
display:flex;align-items:center;justify-content:center;
|
|
232
|
+
cursor:pointer;transition:background .1s;
|
|
233
|
+
}
|
|
234
|
+
#game-overlay .game-arrow:active{background:var(--overlay-btn-active-bg);color:var(--overlay-btn-active-color)}
|
|
235
|
+
#game-overlay .game-arrow.disabled{opacity:.3;pointer-events:none}
|
|
236
|
+
#game-overlay .game-score{font-size:16px;margin:10px 0;color:var(--accent)}
|
|
237
|
+
#game-overlay .game-result{font-size:14px;min-height:20px;color:var(--overlay-color)}
|
|
238
|
+
#game-overlay .game-pet{width:80px;height:80px;display:flex;align-items:center;justify-content:center}
|
|
239
|
+
#game-pet-canvas{image-rendering:pixelated;image-rendering:crisp-edges}
|
|
240
|
+
|
|
241
|
+
/* Settings modal */
|
|
242
|
+
#settings-overlay{z-index:200}
|
|
243
|
+
#settings-overlay input{
|
|
244
|
+
width:260px;padding:12px;margin:10px 0;
|
|
245
|
+
background:var(--input-bg);border:2px solid var(--input-border);border-radius:8px;
|
|
246
|
+
color:var(--input-color);font-size:14px;font-family:'Courier New',monospace;
|
|
247
|
+
}
|
|
248
|
+
#settings-overlay .settings-info{
|
|
249
|
+
font-size:11px;color:var(--info-color);max-width:260px;text-align:center;margin:6px 0 16px;
|
|
250
|
+
}
|
|
251
|
+
/* Settings toggle row */
|
|
252
|
+
.settings-row{
|
|
253
|
+
display:flex;align-items:center;justify-content:space-between;
|
|
254
|
+
width:260px;padding:10px 0;margin:4px 0;
|
|
255
|
+
}
|
|
256
|
+
.settings-row span{font-size:14px}
|
|
257
|
+
.toggle{
|
|
258
|
+
width:48px;height:26px;border-radius:13px;
|
|
259
|
+
background:var(--toggle-bg);
|
|
260
|
+
position:relative;cursor:pointer;
|
|
261
|
+
transition:background .2s;border:none;padding:0;
|
|
262
|
+
}
|
|
263
|
+
.toggle::after{
|
|
264
|
+
content:'';position:absolute;top:3px;left:3px;
|
|
265
|
+
width:20px;height:20px;border-radius:50%;
|
|
266
|
+
background:var(--toggle-knob);
|
|
267
|
+
transition:transform .2s,background .2s;
|
|
268
|
+
}
|
|
269
|
+
.toggle.on{background:var(--toggle-active-bg)}
|
|
270
|
+
.toggle.on::after{transform:translateX(22px);background:var(--toggle-active-knob)}
|
|
271
|
+
|
|
272
|
+
/* Death overlay */
|
|
273
|
+
#death-overlay{z-index:150}
|
|
274
|
+
#death-overlay .death-msg{font-size:14px;color:var(--death-msg);margin:10px 0}
|
|
275
|
+
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
6
|
+
<title>lilgotchi</title>
|
|
7
|
+
<link rel="stylesheet" href="game.css">
|
|
8
|
+
<link rel="stylesheet" href="embed.css">
|
|
9
|
+
<link rel="stylesheet" href="scenery.css">
|
|
10
|
+
<script type="module" src="boot.js"></script>
|
|
11
|
+
</head>
|
|
12
|
+
<body>
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
<div id="device">
|
|
16
|
+
<svg class="keychain" viewBox="0 0 112 104" aria-hidden="true" focusable="false">
|
|
17
|
+
<g fill="none" stroke="#77838b" stroke-width="2">
|
|
18
|
+
<circle cx="94" cy="58" r="14"/>
|
|
19
|
+
<path d="M99 68a11 11 0 1 1 5-5" stroke-width="1" stroke="#a3adb4"/>
|
|
20
|
+
<ellipse cx="16" cy="88" rx="4" ry="8" transform="rotate(8 16 88)"/>
|
|
21
|
+
<ellipse cx="19" cy="73" rx="4" ry="8" transform="rotate(15 19 73)"/>
|
|
22
|
+
<ellipse cx="23" cy="58" rx="4" ry="8" transform="rotate(20 23 58)"/>
|
|
23
|
+
<ellipse cx="29" cy="44" rx="4" ry="8" transform="rotate(30 29 44)"/>
|
|
24
|
+
<ellipse cx="38" cy="32" rx="4" ry="8" transform="rotate(45 38 32)"/>
|
|
25
|
+
<ellipse cx="50" cy="23" rx="4" ry="8" transform="rotate(65 50 23)"/>
|
|
26
|
+
<ellipse cx="65" cy="19" rx="4" ry="8" transform="rotate(90 65 19)"/>
|
|
27
|
+
<ellipse cx="80" cy="22" rx="4" ry="8" transform="rotate(115 80 22)"/>
|
|
28
|
+
<ellipse cx="90" cy="33" rx="4" ry="8" transform="rotate(150 90 33)"/>
|
|
29
|
+
<ellipse cx="94" cy="47" rx="4" ry="8" transform="rotate(175 94 47)"/>
|
|
30
|
+
</g>
|
|
31
|
+
</svg>
|
|
32
|
+
<div id="egg-shell">
|
|
33
|
+
<button id="settings-btn" aria-label="Settings">⚙</button>
|
|
34
|
+
<div id="pet-clock" aria-label="Local time"></div>
|
|
35
|
+
<div id="screen-frame">
|
|
36
|
+
<div class="scene-window" aria-hidden="true"><span class="scene-orb"></span><span class="scene-land"></span></div>
|
|
37
|
+
<canvas id="lcd" width="32" height="16" role="img" aria-label="Your pet"></canvas>
|
|
38
|
+
</div>
|
|
39
|
+
<div id="attention-bar"></div>
|
|
40
|
+
<div id="controls">
|
|
41
|
+
<button class="ctrl-btn" data-action="feed">
|
|
42
|
+
<span class="icon icon-color">🍖</span>
|
|
43
|
+
<svg class="icon-mono" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round"><line x1="7" y1="3" x2="7" y2="11"/><path d="M7 11c0 2 2 3 2 6h-4c0-3 2-4 2-6"/><line x1="7" y1="17" x2="7" y2="21"/><path d="M17 3v4c0 1.5-1 2-2 2h0c1 0 2 .5 2 2v3"/><line x1="17" y1="14" x2="17" y2="21"/></svg>
|
|
44
|
+
<span class="label">Feed</span>
|
|
45
|
+
</button>
|
|
46
|
+
<button class="ctrl-btn" data-action="play">
|
|
47
|
+
<span class="icon icon-color">🎮</span>
|
|
48
|
+
<svg class="icon-mono" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="9"/><polygon points="10,8 16,12 10,16" fill="currentColor" stroke="none"/></svg>
|
|
49
|
+
<span class="label">Play</span>
|
|
50
|
+
</button>
|
|
51
|
+
<button class="ctrl-btn" data-action="care" id="care-btn"><span class="care-symbol" aria-hidden="true">☾</span><span class="label">Sleep</span></button>
|
|
52
|
+
</div>
|
|
53
|
+
</div>
|
|
54
|
+
<div id="care-panel">
|
|
55
|
+
<div id="pet-identity"></div>
|
|
56
|
+
<div id="growth-notice" hidden></div>
|
|
57
|
+
<div id="pet-needs" aria-live="off"></div>
|
|
58
|
+
<div id="care-meters" aria-label="Pet needs"></div>
|
|
59
|
+
<p id="care-hint"></p>
|
|
60
|
+
<details id="more-care"><summary>More care</summary><div class="secondary-controls"> <button class="ctrl-btn" data-action="light">
|
|
61
|
+
<span class="icon icon-color">💡</span>
|
|
62
|
+
<svg class="icon-mono" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round"><path d="M9 18h6"/><path d="M10 21h4"/><path d="M12 2v1"/><path d="M12 7a4 4 0 0 0-4 4c0 2 1.5 3 2 4h4c.5-1 2-2 2-4a4 4 0 0 0-4-4z"/></svg>
|
|
63
|
+
<span class="label">Light</span>
|
|
64
|
+
</button>
|
|
65
|
+
<button class="ctrl-btn" data-action="medicine">
|
|
66
|
+
<span class="icon icon-color">💊</span>
|
|
67
|
+
<svg class="icon-mono" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round"><rect x="3" y="8" width="18" height="8" rx="3"/><line x1="12" y1="5" x2="12" y2="19"/></svg>
|
|
68
|
+
<span class="label">Heal</span>
|
|
69
|
+
</button>
|
|
70
|
+
<button class="ctrl-btn" data-action="clean">
|
|
71
|
+
<span class="icon icon-color">🧹</span>
|
|
72
|
+
<svg class="icon-mono" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round"><line x1="12" y1="3" x2="12" y2="13"/><path d="M8 13l-2 8h12l-2-8z"/><line x1="8" y1="7" x2="5" y2="5"/><line x1="16" y1="7" x2="19" y2="5"/><circle cx="5" cy="4" r="1" fill="currentColor" stroke="none"/><circle cx="19" cy="4" r="1" fill="currentColor" stroke="none"/></svg>
|
|
73
|
+
<span class="label">Clean</span>
|
|
74
|
+
</button>
|
|
75
|
+
<button class="ctrl-btn" data-action="stats">
|
|
76
|
+
<span class="icon icon-color">📊</span>
|
|
77
|
+
<svg class="icon-mono" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round"><rect x="4" y="14" width="4" height="7"/><rect x="10" y="8" width="4" height="13"/><rect x="16" y="3" width="4" height="18"/></svg>
|
|
78
|
+
<span class="label">Stats</span>
|
|
79
|
+
</button>
|
|
80
|
+
<button class="ctrl-btn" data-action="discipline">
|
|
81
|
+
<span class="icon icon-color">⚡</span>
|
|
82
|
+
<svg class="icon-mono" viewBox="0 0 24 24" fill="currentColor" stroke="none"><polygon points="13,2 5,14 11,14 10,22 19,10 13,10"/></svg>
|
|
83
|
+
<span class="label">Scold</span>
|
|
84
|
+
</button>
|
|
85
|
+
<button class="ctrl-btn" data-action="mute" id="mute-btn">
|
|
86
|
+
<span class="icon icon-color" id="mute-icon-color">🔇</span>
|
|
87
|
+
<svg class="icon-mono" id="mute-icon-mono" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><polygon points="6,9 2,9 2,15 6,15 11,19 11,5" fill="currentColor" stroke="none"/><path d="M15 9a4 4 0 0 1 0 6"/><path d="M18 7a7 7 0 0 1 0 10"/></svg>
|
|
88
|
+
<span class="label">Muted</span>
|
|
89
|
+
</button></div></details>
|
|
90
|
+
</div>
|
|
91
|
+
</div>
|
|
92
|
+
<p id="pet-status" aria-live="off"></p>
|
|
93
|
+
<p id="save-status"></p>
|
|
94
|
+
|
|
95
|
+
<!-- Toast -->
|
|
96
|
+
<div id="toast" role="status" aria-live="polite"></div>
|
|
97
|
+
|
|
98
|
+
<!-- Feed overlay -->
|
|
99
|
+
<div role="dialog" aria-modal="true" class="overlay" id="feed-overlay">
|
|
100
|
+
<div class="overlay-title">FEED</div>
|
|
101
|
+
<button class="overlay-btn" id="feed-meal-btn" data-feed="meal">🍚 Meal (+1 Food)</button>
|
|
102
|
+
<button class="overlay-btn" id="feed-snack-btn" data-feed="snack">🍬 Snack (+1 Happy)</button>
|
|
103
|
+
<button type="button" class="overlay-close" data-close="feed-overlay">Cancel</button>
|
|
104
|
+
</div>
|
|
105
|
+
|
|
106
|
+
<!-- Stats overlay -->
|
|
107
|
+
<div role="dialog" aria-modal="true" class="overlay" id="stats-overlay">
|
|
108
|
+
<div class="overlay-title">STATUS</div>
|
|
109
|
+
<div id="stats-content"></div>
|
|
110
|
+
<button type="button" class="overlay-close" data-close="stats-overlay">Close</button>
|
|
111
|
+
</div>
|
|
112
|
+
|
|
113
|
+
<!-- Game overlay -->
|
|
114
|
+
<div role="dialog" aria-modal="true" class="overlay" id="game-overlay" aria-labelledby="guess-title">
|
|
115
|
+
<h2 class="overlay-title" id="guess-title">Left and right</h2>
|
|
116
|
+
<p class="game-result" id="game-result" role="status">Guess which way your pet will look.</p>
|
|
117
|
+
<canvas class="guess-field" id="game-pet-canvas" width="256" height="192" aria-label="Your pet guessing game"></canvas>
|
|
118
|
+
<p class="game-score" id="game-score">Round 1/5 · Wins: 0</p>
|
|
119
|
+
<div class="game-area" id="guess-actions">
|
|
120
|
+
<button class="overlay-btn game-arrow" id="guess-left" aria-label="Guess left">← Left</button>
|
|
121
|
+
<button class="overlay-btn game-arrow" id="guess-right" aria-label="Guess right">Right →</button>
|
|
122
|
+
</div>
|
|
123
|
+
<button class="overlay-btn" id="guess-replay" hidden>Play again</button>
|
|
124
|
+
<button class="overlay-close" id="guess-exit">Back to games</button>
|
|
125
|
+
</div>
|
|
126
|
+
|
|
127
|
+
<!-- Settings overlay -->
|
|
128
|
+
<div role="dialog" aria-modal="true" class="overlay" id="settings-overlay">
|
|
129
|
+
<div class="settings-header"><div class="overlay-title">SETTINGS</div><button type="button" class="overlay-close" data-close="settings-overlay" aria-label="Close settings">Close</button></div>
|
|
130
|
+
<div class="settings-row"><span>Vacation</span><button class="toggle" id="vacation-toggle" role="switch" aria-checked="false" aria-label="Vacation" aria-describedby="vacation-info"></button></div>
|
|
131
|
+
<p class="settings-info" id="vacation-info">Pause care and growth until you turn Vacation off. Otherwise, up to eight hours pass while you are away.</p>
|
|
132
|
+
<div class="settings-row" id="eink-row"><span>E-ink Theme</span><button class="toggle" id="eink-toggle" role="switch" aria-checked="false" aria-label="Toggle E-ink theme"></button></div>
|
|
133
|
+
<div class="settings-row"><span>LCD scanlines</span><button class="toggle" id="scanline-toggle" role="switch" aria-checked="false" aria-label="LCD scanlines" aria-describedby="scanline-info"></button></div>
|
|
134
|
+
<p class="settings-info" id="scanline-info">Adds faint horizontal lines to the pet screen for an old LCD look. It does not change care or gameplay.</p>
|
|
135
|
+
<p class="settings-info">Start again replaces this pet with a fresh copy of your selected starting character.</p>
|
|
136
|
+
<button class="overlay-btn" id="reset-game-btn">⚠ Start again</button>
|
|
137
|
+
</div>
|
|
138
|
+
|
|
139
|
+
<!-- Death overlay -->
|
|
140
|
+
<div role="dialog" aria-modal="true" class="overlay" id="death-overlay">
|
|
141
|
+
<div class="overlay-title">REST IN PEACE</div>
|
|
142
|
+
<div class="death-msg" id="death-msg"></div>
|
|
143
|
+
<button class="overlay-btn" id="restart-btn">Start again</button>
|
|
144
|
+
</div>
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
</body>
|
|
148
|
+
</html>
|