From afd71c5c3c2373623c7c4721ef58c36cf5ed5160 Mon Sep 17 00:00:00 2001 From: michael <1+michael@noreply.git.casaderoll.de> Date: Thu, 24 Sep 2026 10:05:19 +0200 Subject: [PATCH] Add CSS: synthwave theme with sky, sun, grid floor, cards, game pages --- public/css/style.css | 310 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 310 insertions(+) create mode 100644 public/css/style.css diff --git a/public/css/style.css b/public/css/style.css new file mode 100644 index 0000000..7671c66 --- /dev/null +++ b/public/css/style.css @@ -0,0 +1,310 @@ +/* ============================================================ + DIGITAL SPACEPORT ARCADE — synthwave theme + ============================================================ */ +:root { + --bg: #0a0118; + --bg2: #12002e; + --pink: #ff2d95; + --cyan: #7df9ff; + --purple: #9d7dff; + --yellow: #ffe14d; + --green: #7dff5e; + --red: #ff4d6d; + --orange: #ff9d2d; + --text: #e8e0ff; + --dim: #8a7fb5; +} + +* { margin: 0; padding: 0; box-sizing: border-box; } + +html, body { + min-height: 100%; + background: var(--bg); + color: var(--text); + font-family: "Press Start 2P", monospace; + overflow-x: hidden; +} + +/* ---------- Sky ---------- */ +.sky { + position: fixed; + inset: 0; + z-index: -1; + background: linear-gradient(180deg, #05010d 0%, #12002e 30%, #2d0a4e 55%, #4a1259 70%, #7a1e5c 82%, #c23a6b 92%, #ff6b6b 100%); + overflow: hidden; +} +.stars { position: absolute; inset: 0; } +.star { + position: absolute; + border-radius: 50%; + animation: twinkle 2s ease-in-out infinite; +} +@keyframes twinkle { + 0%, 100% { opacity: 0.3; } + 50% { opacity: 1; } +} +.sun { + position: absolute; + left: 50%; + top: 16%; + width: 340px; + height: 340px; + transform: translateX(-50%); + border-radius: 50%; + background: linear-gradient(180deg, #ffe14d 0%, #ff9d2d 35%, #ff2d95 70%, #9d7dff 100%); + box-shadow: 0 0 120px 40px rgba(255, 45, 149, 0.45); + -webkit-mask-image: repeating-linear-gradient(180deg, #000 0 14px, transparent 14px 20px); + mask-image: repeating-linear-gradient(180deg, #000 0 14px, transparent 14px 20px); + animation: sunpulse 4s ease-in-out infinite; +} +@keyframes sunpulse { + 0%, 100% { box-shadow: 0 0 120px 40px rgba(255,45,149,0.45); } + 50% { box-shadow: 0 0 160px 60px rgba(255,45,149,0.6); } +} +.grid-floor { + position: absolute; + left: -50%; + right: -50%; + bottom: -10%; + height: 55%; + background: + linear-gradient(180deg, transparent 0%, rgba(255,45,149,0.25) 100%), + repeating-linear-gradient(90deg, rgba(125,249,255,0.5) 0 2px, transparent 2px 80px), + repeating-linear-gradient(0deg, rgba(125,249,255,0.5) 0 2px, transparent 2px 60px); + transform: perspective(400px) rotateX(62deg); + transform-origin: top center; + animation: gridmove 2.2s linear infinite; +} +@keyframes gridmove { + from { background-position: 0 0, 0 0, 0 0; } + to { background-position: 0 0, 0 0, 0 60px; } +} + +/* ---------- Hero ---------- */ +.hero { + text-align: center; + padding: 70px 20px 40px; + position: relative; +} +.badge { + display: inline-block; + font-size: 9px; + color: var(--cyan); + border: 1px solid var(--cyan); + padding: 8px 14px; + letter-spacing: 2px; + margin-bottom: 28px; + background: rgba(125,249,255,0.06); + box-shadow: 0 0 18px rgba(125,249,255,0.25); +} +.title { + line-height: 1.25; + margin-bottom: 22px; +} +.title span { display: block; } +.t1 { + font-size: clamp(26px, 6vw, 54px); + color: var(--cyan); + text-shadow: 0 0 12px var(--cyan), 0 0 40px rgba(125,249,255,0.5); +} +.t2 { + font-size: clamp(30px, 7.5vw, 68px); + color: var(--pink); + text-shadow: 0 0 14px var(--pink), 0 0 50px rgba(255,45,149,0.6); +} +.t3 { + font-size: clamp(26px, 6vw, 54px); + color: var(--yellow); + text-shadow: 0 0 12px var(--yellow), 0 0 40px rgba(255,225,77,0.5); +} +.tagline { + font-size: clamp(8px, 1.6vw, 11px); + color: var(--dim); + letter-spacing: 2px; + margin-bottom: 26px; +} +.blink { + font-size: clamp(10px, 2vw, 14px); + color: var(--yellow); + animation: blinker 1.1s steps(1) infinite; + text-shadow: 0 0 10px rgba(255,225,77,0.7); +} +@keyframes blinker { 50% { opacity: 0; } } + +/* ---------- Cards ---------- */ +.cards { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(320px, 1fr)); + gap: 30px; + max-width: 1200px; + margin: 30px auto 60px; + padding: 0 24px; +} +.card { + display: block; + text-decoration: none; + color: inherit; + background: linear-gradient(160deg, rgba(18,0,46,0.92), rgba(45,10,78,0.85)); + border: 2px solid rgba(157,125,255,0.35); + box-shadow: 0 0 0 rgba(255,45,149,0); + transition: transform 0.25s ease, box-shadow 0.25s ease, border-color 0.25s ease; + position: relative; + overflow: hidden; +} +.card::before { + content: ''; + position: absolute; + inset: 0; + background: linear-gradient(120deg, transparent 30%, rgba(255,255,255,0.06) 50%, transparent 70%); + transform: translateX(-100%); + transition: transform 0.6s ease; + pointer-events: none; +} +.card:hover::before { transform: translateX(100%); } +.card:hover { + border-color: var(--pink); + box-shadow: 0 0 30px rgba(255,45,149,0.45), 0 0 60px rgba(125,249,255,0.15); +} +.thumb { + position: relative; + aspect-ratio: 4 / 3; + background: #05010d; + border-bottom: 2px solid rgba(157,125,255,0.35); + overflow: hidden; +} +.thumb img { + width: 100%; + height: 100%; + object-fit: cover; + image-rendering: pixelated; + display: block; + transition: transform 0.4s ease; +} +.card:hover .thumb img { transform: scale(1.06); } +.thumb-glow { + position: absolute; + inset: 0; + background: radial-gradient(circle at 50% 120%, rgba(255,45,149,0.35), transparent 60%); + opacity: 0; + transition: opacity 0.3s ease; + pointer-events: none; +} +.card:hover .thumb-glow { opacity: 1; } +.card-body { padding: 20px; } +.card-body h2 { + font-size: 15px; + color: var(--cyan); + text-shadow: 0 0 10px rgba(125,249,255,0.6); + margin-bottom: 12px; + letter-spacing: 1px; +} +.desc { + font-size: 9px; + line-height: 1.8; + color: var(--dim); + margin-bottom: 14px; +} +.meta { + display: flex; + justify-content: space-between; + gap: 10px; + font-size: 7px; + margin-bottom: 16px; + flex-wrap: wrap; +} +.diff { color: var(--orange); } +.ctrl { color: var(--purple); } +.play { + font-size: 11px; + color: var(--yellow); + text-shadow: 0 0 8px rgba(255,225,77,0.6); + transition: letter-spacing 0.25s ease; +} +.card:hover .play { letter-spacing: 3px; } + +/* ---------- Footer ---------- */ +.footer { + text-align: center; + padding: 30px 20px 50px; + border-top: 1px solid rgba(157,125,255,0.2); + margin: 0 24px; +} +.controls-legend { + display: flex; + justify-content: center; + gap: 26px; + flex-wrap: wrap; + font-size: 8px; + color: var(--dim); + margin-bottom: 18px; +} +.credit { + font-size: 8px; + color: var(--dim); + letter-spacing: 1px; +} +.neon { + color: var(--pink); + text-shadow: 0 0 8px rgba(255,45,149,0.8); +} + +/* ---------- Game pages ---------- */ +.game-page { + min-height: 100vh; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + gap: 18px; + padding: 20px; + background: radial-gradient(ellipse at 50% 0%, #1a0533 0%, #05010d 70%); +} +.game-top { + display: flex; + align-items: center; + gap: 18px; + width: 100%; + max-width: 840px; +} +.back { + font-family: "Press Start 2P", monospace; + font-size: 9px; + color: var(--cyan); + text-decoration: none; + border: 1px solid var(--cyan); + padding: 10px 14px; + background: rgba(125,249,255,0.05); + transition: background 0.2s, box-shadow 0.2s; + white-space: nowrap; +} +.back:hover { + background: rgba(125,249,255,0.15); + box-shadow: 0 0 14px rgba(125,249,255,0.4); +} +.game-title { + font-size: clamp(12px, 3vw, 18px); + color: var(--pink); + text-shadow: 0 0 12px rgba(255,45,149,0.7); + letter-spacing: 2px; +} +canvas#game { + width: min(840px, 96vw); + height: auto; + aspect-ratio: 4 / 3; + image-rendering: pixelated; + border: 3px solid rgba(157,125,255,0.5); + box-shadow: 0 0 40px rgba(157,125,255,0.25), inset 0 0 60px rgba(0,0,0,0.5); + background: #05010d; +} +.game-hint { + font-size: 8px; + color: var(--dim); + letter-spacing: 1px; + text-align: center; + line-height: 2; +} + +@media (max-width: 600px) { + .cards { grid-template-columns: 1fr; } + .game-top { flex-direction: column; gap: 10px; } +} \ No newline at end of file