From f2bdc97b31764505cafbc12809724dd86d346bd1 Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Fri, 17 Apr 2026 14:40:42 +0000 Subject: [PATCH] feat: retro CRT arcade theme for Wordle - Replace fonts with Press Start 2P pixel font - CRT scanline overlay and vignette effects - Neon green on black color scheme - Pixel-perfect square borders (no border-radius) - Glowing text shadows and neon box shadows - Arcade-style header with flicker animation - Retro keyboard with hover glow effects - Terminal-style modals with green border glow - Magenta share button with neon effects - Cyan stat bars for retro feel - Retro toggle switches with pixel borders Co-Authored-By: Matthew Guerra --- public/index.html | 8 +- src/App.module.scss | 99 +++++++++++++------ src/components/Alert/Alert.module.scss | 13 ++- src/components/Cell/Cell.module.scss | 22 ++++- src/components/Grid/Grid.module.scss | 4 +- src/components/Header/Header.jsx | 2 +- src/components/Header/Header.module.scss | 35 ++++++- .../InfoModal/InfoModal.module.scss | 12 ++- src/components/Keyboard/Keyboard.module.scss | 58 ++++++++--- src/components/Modal/Modal.module.scss | 23 ++++- .../SettingModal/SettingModal.module.scss | 12 ++- .../StatsModal/StatsModal.module.scss | 56 ++++++++--- src/components/Switch/Switch.module.scss | 20 ++-- 13 files changed, 269 insertions(+), 95 deletions(-) diff --git a/public/index.html b/public/index.html index 9abfe26..9ebc2f7 100644 --- a/public/index.html +++ b/public/index.html @@ -24,14 +24,10 @@ - - Wordle + WORDLE // RETRO diff --git a/src/App.module.scss b/src/App.module.scss index 48368c4..261620a 100644 --- a/src/App.module.scss +++ b/src/App.module.scss @@ -8,48 +8,89 @@ } :root { - --color-absent: #405069; - --color-present: #e0c02b; - --color-correct: #31ad23; - --color-alert-success: #3fbf62; - --color-alert-error: #ea4e2c; - --color-toggle: #3fbf62; - - --color-background: #fff; - --color-cell: #afadb0; - --color-key: #e3e3e3; - --color-key-text: #333; - --color-key-secondary: #4f4f4f; - --color-text-primary: #000; - --color-text-secondary: #333; - --color-icon: #333; + --color-absent: #3a3a5c; + --color-present: #d4a017; + --color-correct: #00ff41; + --color-alert-success: #00ff41; + --color-alert-error: #ff003c; + --color-toggle: #00ff41; + + --color-background: #0a0a0a; + --color-cell: #1a1a2e; + --color-key: #1a1a2e; + --color-key-text: #00ff41; + --color-key-secondary: #00ff41; + --color-text-primary: #00ff41; + --color-text-secondary: #33cc33; + --color-icon: #00ff41; + --color-border: #00ff41; + --color-scanline: rgba(0, 255, 65, 0.03); [data-theme='dark'] { - --color-background: #191919; - --color-cell: #444444; - --color-key: #4f4f4f; - --color-key-text: #fff; - --color-key-secondary: #fff; - --color-text-primary: #fff; - --color-text-secondary: #adadad; - --color-icon: #fff; + --color-background: #0a0a0a; + --color-cell: #1a1a2e; + --color-key: #1a1a2e; + --color-key-text: #00ff41; + --color-key-secondary: #00ff41; + --color-text-primary: #00ff41; + --color-text-secondary: #33cc33; + --color-icon: #00ff41; } [data-mode='high-contrast'] { - --color-present: #06b6d4; - --color-correct: #f97316; + --color-present: #ff6ec7; + --color-correct: #00ffff; } } body { font-size: 62.5%; - font-family: 'Baloo 2', sans-serif; + font-family: 'Press Start 2P', monospace; background: var(--color-background); - color: #fff; + color: #00ff41; min-height: 100vh; scroll-behavior: smooth; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: none; + -moz-osx-font-smoothing: unset; + image-rendering: pixelated; + position: relative; + overflow-x: hidden; +} + +/* CRT Scanline overlay */ +body::before { + content: ''; + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + pointer-events: none; + z-index: 9999; + background: repeating-linear-gradient( + 0deg, + transparent, + transparent 2px, + var(--color-scanline) 2px, + var(--color-scanline) 4px + ); +} + +/* CRT vignette effect */ +body::after { + content: ''; + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + pointer-events: none; + z-index: 9998; + background: radial-gradient( + ellipse at center, + transparent 60%, + rgba(0, 0, 0, 0.4) 100% + ); } .container { diff --git a/src/components/Alert/Alert.module.scss b/src/components/Alert/Alert.module.scss index cb5c840..e296197 100644 --- a/src/components/Alert/Alert.module.scss +++ b/src/components/Alert/Alert.module.scss @@ -10,18 +10,25 @@ } .alert { - border-radius: 10px; + border: 2px solid; + border-radius: 0; padding: 0.5rem 0.75rem; - font-size: 1rem; - font-family: 'Poppins'; + font-size: 0.6rem; + font-family: 'Press Start 2P', monospace; font-weight: 500; text-align: center; + color: #000; + text-shadow: none; } .success { background-color: var(--color-alert-success); + border-color: var(--color-alert-success); + box-shadow: 0 0 15px var(--color-alert-success); } .error { background-color: var(--color-alert-error); + border-color: var(--color-alert-error); + box-shadow: 0 0 15px var(--color-alert-error); } diff --git a/src/components/Cell/Cell.module.scss b/src/components/Cell/Cell.module.scss index 62e7791..039a6b9 100644 --- a/src/components/Cell/Cell.module.scss +++ b/src/components/Cell/Cell.module.scss @@ -2,14 +2,20 @@ width: 60px; height: 60px; background-color: var(--color-cell); - border-radius: 10px; - font-size: 2.6rem; + border: 2px solid var(--color-border); + border-radius: 0; + font-size: 1.8rem; font-weight: 700; + font-family: 'Press Start 2P', monospace; text-transform: uppercase; display: flex; justify-content: center; align-items: center; cursor: default; + color: #fff; + text-shadow: 0 0 8px currentColor; + box-shadow: inset 0 0 10px rgba(0, 255, 65, 0.05), + 0 0 5px rgba(0, 255, 65, 0.1); } .fill { @@ -60,16 +66,19 @@ 0% { transform: rotateX(0deg); background-color: var(--color-cell); + border-color: var(--color-border); } 50% { background-color: var(--color-cell); } 50.5% { background-color: var(--color-absent); + border-color: var(--color-absent); } 100% { transform: rotateX(180deg); background-color: var(--color-absent); + border-color: var(--color-absent); } } @@ -77,16 +86,19 @@ 0% { transform: rotateX(0deg); background-color: var(--color-cell); + border-color: var(--color-border); } 50% { background-color: var(--color-cell); } 50.5% { background-color: var(--color-present); + border-color: var(--color-present); } 100% { transform: rotateX(180deg); background-color: var(--color-present); + border-color: var(--color-present); } } @@ -94,16 +106,20 @@ 0% { transform: rotateX(0deg); background-color: var(--color-cell); + border-color: var(--color-border); } 50% { background-color: var(--color-cell); } 50.5% { background-color: var(--color-correct); + border-color: var(--color-correct); } 100% { transform: rotateX(180deg); background-color: var(--color-correct); + border-color: var(--color-correct); + box-shadow: 0 0 15px var(--color-correct); } } @@ -120,6 +136,6 @@ .cell { width: 55px; height: 55px; - font-size: 2.4rem; + font-size: 1.6rem; } } diff --git a/src/components/Grid/Grid.module.scss b/src/components/Grid/Grid.module.scss index 4ee9adb..285c0d7 100644 --- a/src/components/Grid/Grid.module.scss +++ b/src/components/Grid/Grid.module.scss @@ -9,8 +9,8 @@ .row { display: grid; grid-template-columns: repeat(5, 1fr); - grid-gap: 10px; - margin: 0.25rem; + grid-gap: 6px; + margin: 0.2rem; } .jiggle { diff --git a/src/components/Header/Header.jsx b/src/components/Header/Header.jsx index 53cdd0d..542328e 100644 --- a/src/components/Header/Header.jsx +++ b/src/components/Header/Header.jsx @@ -13,7 +13,7 @@ const Header = ({ -

WORDLE

+

WORDLE ▶