1:root {
2 --tile: 36px;
3 --bg: #10121c;
4 --bg-alt: #191c2b;
5 --panel: #1c2036;
6 --panel-border: #383e63;
7 --ink: #e9ecff;
8 --ink-dim: #8b8fb8;
9 --neon-cyan: #4bf2e0;
10 --neon-magenta: #ff5fd8;
11 --neon-yellow: #ffd54b;
12 --neon-green: #7dff8f;
13 --floor-a: #23273e;
14 --floor-b: #262b46;
15 --wall-a: #4c5170;
16 --wall-b: #383c5a;
17 --box: #c17a3f;
18 --box-dark: #8a5326;
19 --box-goal: #6bd47a;
20 --box-goal-dark: #3f9450;
21}
22
23* { box-sizing: border-box; }
24
25html, body {
26 margin: 0;
27 padding: 0;
28 height: 100%;
29 background: var(--bg);
30}
31
32body {
33 font-family: 'Courier New', Courier, monospace;
34 color: var(--ink);
35 display: flex;
36 align-items: flex-start;
37 justify-content: center;
38 min-height: 100vh;
39 padding: 24px 12px 48px;
40 position: relative;
41 overflow-x: hidden;
42 background:
43 radial-gradient(circle at 20% 0%, rgba(75, 242, 224, 0.08), transparent 55%),
44 radial-gradient(circle at 80% 10%, rgba(255, 95, 216, 0.08), transparent 50%),
45 var(--bg);
46}
47
48.crt-overlay {
49 position: fixed;
50 inset: 0;
51 pointer-events: none;
52 z-index: 50;
53 background: repeating-linear-gradient(
54 to bottom,
55 rgba(0, 0, 0, 0.18) 0px,
56 rgba(0, 0, 0, 0.18) 1px,
57 transparent 2px,
58 transparent 3px
59 );
60 mix-blend-mode: overlay;
61 opacity: 0.5;
62}
63
64.app {
65 width: 100%;
66 max-width: 640px;
67 display: flex;
68 flex-direction: column;
69 align-items: center;
70 gap: 16px;
71}
72
73
74
75.app-header {
76 width: 100%;
77 display: flex;
78 flex-direction: column;
79 align-items: center;
80 gap: 10px;
81}
82
83.title {
84 margin: 0;
85 font-size: 2rem;
86 letter-spacing: 0.4em;
87 text-indent: 0.4em;
88 color: var(--neon-cyan);
89 text-shadow:
90 0 0 6px rgba(75, 242, 224, 0.9),
91 0 0 22px rgba(75, 242, 224, 0.45),
92 3px 3px 0 #072421;
93}
94
95.hud {
96 display: flex;
97 gap: 10px;
98 flex-wrap: wrap;
99 justify-content: center;
100}
101
102.hud-stat {
103 background: var(--panel);
104 border: 2px solid var(--panel-border);
105 border-radius: 6px;
106 padding: 6px 14px;
107 display: flex;
108 flex-direction: column;
109 align-items: center;
110 min-width: 72px;
111 box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.03), 0 2px 0 rgba(0, 0, 0, 0.4);
112}
113
114.hud-label {
115 font-size: 0.6rem;
116 letter-spacing: 0.15em;
117 color: var(--ink-dim);
118 text-transform: uppercase;
119}
120
121.hud-value {
122 font-size: 1.15rem;
123 font-weight: bold;
124 color: var(--neon-yellow);
125 text-shadow: 0 0 8px rgba(255, 213, 75, 0.5);
126}
127
128
129
130.level-strip {
131 display: flex;
132 gap: 8px;
133 flex-wrap: wrap;
134 justify-content: center;
135 width: 100%;
136}
137
138.level-btn {
139 width: 40px;
140 height: 40px;
141 border-radius: 6px;
142 border: 2px solid var(--panel-border);
143 background: var(--panel);
144 color: var(--ink-dim);
145 font-family: inherit;
146 font-weight: bold;
147 font-size: 1rem;
148 cursor: pointer;
149 position: relative;
150 transition: transform 0.08s ease, border-color 0.15s ease, color 0.15s ease;
151 box-shadow: 0 2px 0 rgba(0, 0, 0, 0.4);
152}
153
154.level-btn:hover {
155 transform: translateY(-2px);
156 border-color: var(--neon-cyan);
157 color: var(--ink);
158}
159
160.level-btn.current {
161 border-color: var(--neon-cyan);
162 color: var(--neon-cyan);
163 box-shadow: 0 0 10px rgba(75, 242, 224, 0.6);
164}
165
166.level-btn.completed {
167 border-color: var(--neon-green);
168 color: var(--neon-green);
169}
170
171.level-btn.completed::after {
172 content: "\2605";
173 position: absolute;
174 top: -8px;
175 right: -6px;
176 font-size: 0.7rem;
177 color: var(--neon-yellow);
178 text-shadow: 0 0 4px rgba(255, 213, 75, 0.8);
179}
180
181
182
183.board-wrap {
184 position: relative;
185 max-width: 100%;
186 overflow: auto;
187 padding: 10px;
188 background: var(--bg-alt);
189 border: 3px solid var(--panel-border);
190 border-radius: 10px;
191 box-shadow: inset 0 0 0 2px rgba(0, 0, 0, 0.5), 0 6px 0 rgba(0, 0, 0, 0.35);
192}
193
194.board {
195 position: relative;
196 display: grid;
197}
198
199.tile {
200 width: var(--tile);
201 height: var(--tile);
202 position: relative;
203}
204
205.tile.floor-a { background: var(--floor-a); }
206.tile.floor-b { background: var(--floor-b); }
207
208.tile.floor-a,
209.tile.floor-b {
210 box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.02);
211}
212
213.tile.wall {
214 background:
215 linear-gradient(180deg, var(--wall-a) 0%, var(--wall-b) 100%);
216 box-shadow:
217 inset 3px 3px 0 rgba(255, 255, 255, 0.08),
218 inset -3px -3px 0 rgba(0, 0, 0, 0.35);
219 background-image:
220 linear-gradient(180deg, var(--wall-a) 0%, var(--wall-b) 100%),
221 repeating-linear-gradient(
222 0deg,
223 rgba(0, 0, 0, 0.18) 0,
224 rgba(0, 0, 0, 0.18) 2px,
225 transparent 2px,
226 transparent calc(var(--tile) / 2)
227 ),
228 repeating-linear-gradient(
229 90deg,
230 rgba(0, 0, 0, 0.14) 0,
231 rgba(0, 0, 0, 0.14) 2px,
232 transparent 2px,
233 transparent calc(var(--tile) / 3)
234 );
235}
236
237.tile.goal::after {
238 content: "";
239 position: absolute;
240 top: 50%;
241 left: 50%;
242 width: calc(var(--tile) * 0.34);
243 height: calc(var(--tile) * 0.34);
244 transform: translate(-50%, -50%) rotate(45deg);
245 background: transparent;
246 border: 2px solid var(--neon-yellow);
247 box-shadow: 0 0 6px rgba(255, 213, 75, 0.7);
248 animation: goal-pulse 1.6s ease-in-out infinite;
249}
250
251@keyframes goal-pulse {
252 0%, 100% { opacity: 0.55; }
253 50% { opacity: 1; }
254}
255
256
257
258.entity {
259 position: absolute;
260 top: 0;
261 left: 0;
262 width: var(--tile);
263 height: var(--tile);
264 transition: left 0.09s linear, top 0.09s linear;
265 z-index: 5;
266}
267
268.entity.box {
269 z-index: 4;
270}
271
272.box-body {
273 position: absolute;
274 inset: 10%;
275 background: linear-gradient(160deg, var(--box) 0%, var(--box-dark) 100%);
276 border-radius: 3px;
277 box-shadow:
278 inset 2px 2px 0 rgba(255, 255, 255, 0.25),
279 inset -2px -2px 0 rgba(0, 0, 0, 0.35),
280 0 2px 0 rgba(0, 0, 0, 0.4);
281}
282
283.box-body::before,
284.box-body::after {
285 content: "";
286 position: absolute;
287 background: rgba(0, 0, 0, 0.25);
288}
289
290.box-body::before {
291 left: 0;
292 right: 0;
293 top: 50%;
294 height: 2px;
295 transform: translateY(-1px);
296}
297
298.box-body::after {
299 top: 0;
300 bottom: 0;
301 left: 50%;
302 width: 2px;
303 transform: translateX(-1px);
304}
305
306.entity.box.on-goal .box-body {
307 background: linear-gradient(160deg, var(--box-goal) 0%, var(--box-goal-dark) 100%);
308 box-shadow:
309 inset 2px 2px 0 rgba(255, 255, 255, 0.35),
310 inset -2px -2px 0 rgba(0, 0, 0, 0.3),
311 0 0 10px rgba(125, 255, 143, 0.7);
312}
313
314.entity.player {
315 z-index: 6;
316}
317
318.player-body {
319 position: absolute;
320 inset: 12%;
321 background: linear-gradient(160deg, #6fb3ff 0%, #2f66c9 100%);
322 border-radius: 30%;
323 box-shadow:
324 inset 2px 2px 0 rgba(255, 255, 255, 0.35),
325 inset -2px -2px 0 rgba(0, 0, 0, 0.35),
326 0 0 8px rgba(75, 178, 255, 0.5);
327}
328
329.player-eyes {
330 position: absolute;
331 top: 34%;
332 left: 22%;
333 right: 22%;
334 display: flex;
335 justify-content: space-between;
336}
337
338.player-eyes::before,
339.player-eyes::after {
340 content: "";
341 width: 18%;
342 aspect-ratio: 1;
343 background: #0c1220;
344 border-radius: 50%;
345 box-shadow: 0 0 3px rgba(0,0,0,0.6);
346}
347
348.entity.player.facing-up .player-eyes { top: 18%; }
349.entity.player.facing-down .player-eyes { top: 46%; }
350.entity.player.facing-left .player-eyes { justify-content: flex-start; gap: 10%; }
351.entity.player.facing-right .player-eyes { justify-content: flex-end; gap: 10%; }
352
353
354
355.overlay {
356 position: absolute;
357 inset: 0;
358 display: flex;
359 align-items: center;
360 justify-content: center;
361 background: rgba(6, 8, 18, 0.82);
362 border-radius: 8px;
363 z-index: 20;
364 transition: opacity 0.2s ease;
365}
366
367.overlay.hidden {
368 display: none;
369}
370
371.overlay-card {
372 text-align: center;
373 padding: 22px 30px;
374 background: var(--panel);
375 border: 2px solid var(--neon-cyan);
376 border-radius: 10px;
377 box-shadow: 0 0 24px rgba(75, 242, 224, 0.45);
378}
379
380.overlay-card h2 {
381 margin: 0 0 8px;
382 color: var(--neon-yellow);
383 text-shadow: 0 0 10px rgba(255, 213, 75, 0.6);
384 letter-spacing: 0.05em;
385}
386
387.overlay-card p {
388 margin: 0 0 16px;
389 color: var(--ink);
390 font-size: 0.95rem;
391}
392
393
394
395.btn {
396 font-family: inherit;
397 background: linear-gradient(180deg, #2b3160 0%, #1c2140 100%);
398 color: var(--neon-cyan);
399 border: 2px solid var(--neon-cyan);
400 border-radius: 6px;
401 padding: 10px 18px;
402 font-size: 0.95rem;
403 font-weight: bold;
404 letter-spacing: 0.04em;
405 cursor: pointer;
406 box-shadow: 0 3px 0 rgba(0, 0, 0, 0.4);
407 transition: transform 0.08s ease, box-shadow 0.08s ease;
408}
409
410.btn:hover {
411 transform: translateY(-1px);
412}
413
414.btn:active {
415 transform: translateY(2px);
416 box-shadow: 0 1px 0 rgba(0, 0, 0, 0.4);
417}
418
419.btn.small {
420 padding: 7px 14px;
421 font-size: 0.8rem;
422 color: var(--ink);
423 border-color: var(--panel-border);
424}
425
426.btn.small:hover {
427 border-color: var(--neon-magenta);
428 color: var(--neon-magenta);
429}
430
431
432
433.controls {
434 width: 100%;
435 display: flex;
436 align-items: center;
437 justify-content: space-between;
438 gap: 10px;
439 flex-wrap: wrap;
440}
441
442.controls-info {
443 display: flex;
444 gap: 14px;
445 flex-wrap: wrap;
446 font-size: 0.75rem;
447 color: var(--ink-dim);
448}
449
450.control-hint {
451 display: inline-flex;
452 align-items: center;
453 gap: 3px;
454}
455
456kbd {
457 display: inline-block;
458 min-width: 18px;
459 text-align: center;
460 padding: 2px 5px;
461 background: var(--panel);
462 border: 1px solid var(--panel-border);
463 border-bottom-width: 2px;
464 border-radius: 4px;
465 font-size: 0.7rem;
466 color: var(--ink);
467}
468
469.controls-buttons {
470 display: flex;
471 gap: 8px;
472}
473
474
475
476.dpad {
477 display: grid;
478 grid-template-columns: repeat(3, 44px);
479 grid-template-rows: repeat(2, 44px);
480 gap: 6px;
481 justify-content: center;
482}
483
484.dpad-btn {
485 font-family: inherit;
486 background: var(--panel);
487 border: 2px solid var(--panel-border);
488 border-radius: 6px;
489 color: var(--neon-cyan);
490 font-size: 1rem;
491 cursor: pointer;
492 box-shadow: 0 3px 0 rgba(0, 0, 0, 0.4);
493}
494
495.dpad-btn:active {
496 transform: translateY(2px);
497 box-shadow: none;
498}
499
500.dpad-up { grid-column: 2; grid-row: 1; }
501.dpad-left { grid-column: 1; grid-row: 2; }
502.dpad-right { grid-column: 3; grid-row: 2; }
503.dpad-down { grid-column: 2; grid-row: 2; }
504
505
506
507.app-footer {
508 color: var(--ink-dim);
509 font-size: 0.75rem;
510 text-align: center;
511 opacity: 0.8;
512}
513
514@media (max-width: 480px) {
515 :root { --tile: 28px; }
516 .title { font-size: 1.4rem; letter-spacing: 0.25em; }
517}
518
Discussion
No comments yet. Start the discussion. Recorded by @patrick-toulme.