@import url('https://fonts.googleapis.com/css2?family=Press+Start+2P&display=swap'); /* ======================================== SKEUOMORPHIC ARCADE CABINET UI ======================================== */ :root { /* Black Metal Cabinet Colors - Deep, Rich Textures */ --metal-black: #0a0a0a; --metal-deep: #0d0d0d; --metal-dark: #151515; --metal-mid: #1e1e1e; --metal-light: #2a2a2a; --metal-highlight: #353535; --metal-chrome: #4a4a4a; --metal-shine: rgba(255, 255, 255, 0.08); --metal-shadow: rgba(0, 0, 0, 0.6); /* Brushed Metal Texture */ --brushed-light: rgba(255, 255, 255, 0.04); --brushed-dark: rgba(0, 0, 0, 0.15); /* Accent Colors - Retro Arcade Neon */ --neon-cyan: #00fff7; --neon-pink: #ff00ff; --neon-yellow: #ffff00; --neon-green: #00ff00; --neon-orange: #ff6600; --neon-red: #ff0033; /* LED Display - Realistic 7-Segment Style */ --led-off: #1a1515; --led-red: #ff3333; --led-red-dark: #cc2222; --led-glow: rgba(255, 51, 51, 0.8); --led-glow-strong: rgba(255, 51, 51, 1); --led-segment: #1a0a0a; /* CRT Screen - Enhanced Effects */ --crt-bg: #050508; --crt-inner: #080810; --crt-glow: rgba(0, 255, 247, 0.03); --scanline: rgba(0, 0, 0, 0.12); --vignette: rgba(0, 0, 0, 0.4); /* Button Colors - Realistic Arcade Buttons */ --btn-red: #cc2222; --btn-red-light: #ff4444; --btn-red-dark: #771111; --btn-red-shadow: #440000; --btn-yellow: #ccaa22; --btn-yellow-light: #ffdd44; --btn-yellow-dark: #886611; --btn-yellow-shadow: #554400; --btn-green: #22cc22; --btn-green-light: #44ee44; --btn-green-dark: #118811; --btn-green-shadow: #005500; --btn-blue: #2222cc; --btn-blue-light: #4444ee; --btn-blue-dark: #111188; --btn-blue-shadow: #000066; /* Speaker Grille */ --grille-bg: #0a0a0a; --grille-hole: #000000; --grille-shadow: rgba(0, 0, 0, 0.8); /* Cabinet Vents */ --vent-color: #080808; --vent-shadow: #050505; /* Wood/Plastic Cabinet Base */ --cabinet-wood: #2a1a0a; --cabinet-plastic: #1a1a1a; } * { box-sizing: border-box; margin: 0; padding: 0; } body { min-height: 100vh; padding: 20px; display: flex; justify-content: center; align-items: center; font-family: 'Press Start 2P', cursive; color: #fff; background: radial-gradient(ellipse at 50% 0%, rgba(60, 60, 80, 0.15) 0%, transparent 50%), radial-gradient(ellipse at 50% 50%, rgba(0, 255, 247, 0.02) 0%, transparent 60%), linear-gradient(180deg, #080808 0%, #0f0f0f 50%, #080808 100%); position: relative; overflow-x: hidden; } #root { width: min(600px, 100%); } /* ======================================== ARCADE CABINET CONTAINER ======================================== */ .arcade-cabinet { width: 100%; background: linear-gradient( 180deg, var(--metal-dark) 0%, var(--metal-black) 30%, var(--metal-deep) 70%, var(--metal-dark) 100% ); border-radius: 20px; padding: 5px; box-shadow: 0 25px 80px rgba(0, 0, 0, 0.9), 0 35px 120px rgba(0, 0, 0, 0.7), 0 0 0 3px var(--metal-mid), 0 0 0 5px var(--metal-dark), inset 0 2px 0 rgba(255, 255, 255, 0.04), inset 0 -2px 8px rgba(0, 0, 0, 0.5); position: relative; transform-style: preserve-3d; } /* Cabinet edge highlight */ .arcade-cabinet::before { content: ''; position: absolute; inset: 0; border-radius: 20px; background: linear-gradient( 135deg, rgba(255, 255, 255, 0.06) 0%, transparent 40%, transparent 60%, rgba(0, 0, 0, 0.3) 100% ); pointer-events: none; z-index: 0; } .cabinet-inner { background: linear-gradient( 180deg, var(--metal-deep) 0%, var(--metal-black) 50%, var(--metal-deep) 100% ); border-radius: 16px; overflow: hidden; position: relative; display: flex; flex-direction: column; min-height: calc(100vh - 40px); z-index: 1; } /* Brushed metal texture overlay */ .cabinet-inner::before { content: ''; position: absolute; inset: 0; background: repeating-linear-gradient( 90deg, transparent, transparent 3px, var(--brushed-light) 3px, var(--brushed-light) 4px ), repeating-linear-gradient( 0deg, transparent, transparent 3px, var(--brushed-dark) 3px, var(--brushed-dark) 4px ); pointer-events: none; z-index: 1; opacity: 0.7; } /* ======================================== MARQUEE AREA ======================================== */ .marquee { background: linear-gradient( 180deg, var(--metal-mid) 0%, var(--metal-dark) 50%, var(--metal-black) 100% ); padding: 24px 28px; text-align: center; position: relative; border-bottom: 4px solid var(--metal-black); box-shadow: inset 0 3px 6px rgba(255, 255, 255, 0.06), inset 0 -3px 8px rgba(0, 0, 0, 0.5), 0 4px 12px rgba(0, 0, 0, 0.6); } /* Top neon accent line */ .marquee::before { content: ''; position: absolute; top: 0; left: 0; right: 0; height: 3px; background: linear-gradient( 90deg, transparent, var(--neon-cyan) 20%, var(--neon-cyan) 80%, transparent ); box-shadow: 0 0 10px var(--neon-cyan), 0 0 20px rgba(0, 255, 247, 0.5); opacity: 0.8; } /* Marquee inner glow */ .marquee::after { content: ''; position: absolute; inset: 0; background: radial-gradient( ellipse at 50% 0%, rgba(0, 255, 247, 0.03) 0%, transparent 70% ); pointer-events: none; } .marquee-title { font-size: 26px; font-weight: 400; letter-spacing: 5px; text-transform: uppercase; color: var(--neon-cyan); text-shadow: 0 0 8px var(--neon-cyan), 0 0 16px var(--neon-cyan), 0 0 32px rgba(0, 255, 247, 0.4), 0 2px 4px rgba(0, 0, 0, 0.8); animation: neonFlicker 5s infinite; position: relative; z-index: 2; } .marquee-subtitle { font-size: 9px; color: var(--metal-chrome); margin-top: 10px; letter-spacing: 3px; text-transform: uppercase; text-shadow: 0 1px 2px rgba(0, 0, 0, 0.8); position: relative; z-index: 2; } @keyframes neonFlicker { 0%, 100% { opacity: 1; } 91% { opacity: 1; } 92% { opacity: 0.85; } 93% { opacity: 1; } 95% { opacity: 0.92; } 96% { opacity: 1; } } /* ======================================== LED SCORE DISPLAY ======================================== */ .led-display-panel { background: linear-gradient( 180deg, #0a0a0a 0%, #121212 30%, #0a0a0a 70%, #050505 100% ); padding: 18px 24px; display: flex; justify-content: space-between; align-items: center; border-bottom: 4px solid var(--metal-black); box-shadow: inset 0 3px 10px rgba(0, 0, 0, 0.9), 0 4px 8px rgba(0, 0, 0, 0.5); position: relative; } /* LED panel inner bezel effect */ .led-display-panel::before { content: ''; position: absolute; inset: 0; background: linear-gradient( 180deg, rgba(255, 255, 255, 0.02) 0%, transparent 30%, transparent 70%, rgba(0, 0, 0, 0.3) 100% ); pointer-events: none; } .led-display { display: flex; flex-direction: column; align-items: center; gap: 6px; } .led-label { font-size: 7px; color: var(--metal-chrome); letter-spacing: 2px; text-transform: uppercase; text-shadow: 0 1px 2px rgba(0, 0, 0, 0.8); } .led-value { font-size: 22px; color: var(--led-red); text-shadow: 0 0 4px var(--led-glow), 0 0 8px var(--led-glow-strong), 0 0 12px rgba(255, 51, 51, 0.4), 0 0 20px rgba(255, 51, 51, 0.2); font-family: 'Press Start 2P', monospace; min-width: 85px; text-align: right; position: relative; letter-spacing: 2px; filter: drop-shadow(0 0 2px var(--led-red)); } /* LED segment effect overlay */ .led-value::before { content: ''; position: absolute; inset: 0; background: linear-gradient( 180deg, rgba(255, 255, 255, 0.1) 0%, transparent 50%, rgba(0, 0, 0, 0.2) 100% ); pointer-events: none; } .led-value.highlight { color: var(--neon-green); text-shadow: 0 0 4px rgba(0, 255, 0, 0.8), 0 0 8px rgba(0, 255, 0, 0.6), 0 0 12px rgba(0, 255, 0, 0.3), 0 0 20px rgba(0, 255, 0, 0.2); filter: drop-shadow(0 0 2px var(--neon-green)); } /* ======================================== CRT SCREEN AREA ======================================== */ .screen-bezel { background: linear-gradient( 180deg, var(--metal-mid) 0%, var(--metal-dark) 50%, var(--metal-black) 100% ); padding: 18px; margin: 0 14px; border-radius: 12px; box-shadow: inset 0 3px 6px rgba(255, 255, 255, 0.04), inset 0 -3px 8px rgba(0, 0, 0, 0.5), 0 6px 16px rgba(0, 0, 0, 0.7), 0 12px 24px rgba(0, 0, 0, 0.5), 0 0 0 2px var(--metal-light), 0 0 0 4px var(--metal-dark); flex: 1; display: flex; flex-direction: column; position: relative; transform-style: preserve-3d; } /* Bezel inner highlight */ .screen-bezel::before { content: ''; position: absolute; inset: 4px; border-radius: 8px; background: linear-gradient( 135deg, rgba(255, 255, 255, 0.03) 0%, transparent 40%, transparent 60%, rgba(0, 0, 0, 0.2) 100% ); pointer-events: none; } .crt-screen { position: relative; border-radius: 10px; background: var(--crt-bg); box-shadow: inset 0 0 80px rgba(0, 0, 0, 0.8), inset 0 0 20px rgba(0, 0, 0, 0.5), 0 0 15px rgba(0, 255, 247, 0.08), 0 0 0 4px var(--metal-deep), 0 0 0 6px var(--metal-black); overflow: hidden; display: flex; align-items: center; justify-content: center; flex: 1; width: 100%; min-height: 300px; } /* Glass reflection overlay */ .crt-screen::after { content: ''; position: absolute; inset: 0; background: linear-gradient( 135deg, rgba(255, 255, 255, 0.08) 0%, transparent 20%, transparent 80%, rgba(255, 255, 255, 0.03) 100% ), repeating-linear-gradient( 0deg, transparent, transparent 2px, var(--scanline) 2px, var(--scanline) 3px ), radial-gradient( ellipse at center, transparent 0%, var(--vignette) 100% ); opacity: 0.6; pointer-events: none; z-index: 10; border-radius: 10px; } /* CRT screen inner shadow/depression effect - using a wrapper approach */ .crt-screen > * { position: relative; z-index: 6; } .crt-screen canvas { display: block; border-radius: 6px; position: relative; z-index: 6; box-shadow: 0 0 40px rgba(0, 0, 0, 0.5), inset 0 0 100px rgba(0, 0, 0, 0.3); } /* ======================================== START/GAME OVER SCREEN ======================================== */ .game-overlay { position: absolute; inset: 0; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 24px; background: radial-gradient( ellipse at center, rgba(20, 20, 30, 0.98) 0%, rgba(10, 10, 18, 0.99) 100% ); border-radius: 10px; z-index: 20; padding: 24px; box-shadow: inset 0 0 60px rgba(0, 0, 0, 0.8); } .game-overlay h2 { font-size: 22px; font-weight: 400; text-transform: uppercase; letter-spacing: 5px; text-shadow: 0 2px 4px rgba(0, 0, 0, 0.8); } .game-overlay h2.game-over { color: var(--neon-red); text-shadow: 0 0 12px var(--neon-red), 0 0 24px var(--neon-red), 0 2px 4px rgba(0, 0, 0, 0.8); animation: glitch 0.4s ease-in-out; } @keyframes glitch { 0%, 100% { transform: translate(0); } 15% { transform: translate(-3px, 2px); } 30% { transform: translate(3px, -2px); } 45% { transform: translate(-2px, -1px); } 60% { transform: translate(2px, 1px); } 75% { transform: translate(-1px, 2px); } 90% { transform: translate(1px, -1px); } } .final-score-box { text-align: center; } .final-score { font-size: 14px; color: var(--metal-chrome); text-shadow: 0 1px 2px rgba(0, 0, 0, 0.8); } .new-high-score { font-size: 11px; color: var(--neon-green); margin-top: 14px; text-shadow: 0 0 12px rgba(0, 255, 0, 0.6), 0 0 24px rgba(0, 255, 0, 0.3); animation: pulse 1.2s infinite; } @keyframes pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.7; } } .game-overlay label { font-size: 9px; color: var(--metal-chrome); letter-spacing: 2px; text-shadow: 0 1px 2px rgba(0, 0, 0, 0.8); } /* Level Select Dropdown */ .level-select { width: 200px; padding: 14px 18px; font-size: 10px; font-family: 'Press Start 2P', cursive; background: linear-gradient( 180deg, var(--metal-dark) 0%, var(--metal-black) 100% ); color: var(--neon-cyan); border: 3px solid var(--metal-mid); border-radius: 6px; cursor: pointer; appearance: none; background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%2300fff7' d='M6 8L2 4h8z'/%3E%3C/svg%3E"); background-repeat: no-repeat; background-position: right 14px center; box-shadow: inset 0 2px 6px rgba(0, 0, 0, 0.5), 0 2px 4px rgba(0, 0, 0, 0.3); } .level-select:focus { outline: none; border-color: var(--neon-cyan); box-shadow: inset 0 2px 6px rgba(0, 0, 0, 0.5), 0 0 12px rgba(0, 255, 247, 0.4), 0 0 20px rgba(0, 255, 247, 0.2); } .level-select option { background: var(--metal-black); color: var(--neon-cyan); padding: 10px; } /* ======================================== ARCADE BUTTONS ======================================== */ .control-panel { background: linear-gradient( 180deg, var(--metal-mid) 0%, var(--metal-dark) 50%, var(--metal-black) 100% ); padding: 24px; margin-top: 14px; position: relative; border-top: 4px solid var(--metal-black); box-shadow: inset 0 4px 12px rgba(0, 0, 0, 0.6), 0 -4px 12px rgba(0, 0, 0, 0.3); } .control-panel::before { content: ''; position: absolute; top: 0; left: 0; right: 0; height: 2px; background: linear-gradient( 90deg, transparent, rgba(255, 255, 255, 0.08), transparent ); } /* Start Button - Large Arcade Style */ .start-btn { width: 190px; padding: 18px 28px; font-size: 12px; font-family: 'Press Start 2P', cursive; text-transform: uppercase; letter-spacing: 2px; border: none; border-radius: 10px; cursor: pointer; background: radial-gradient( ellipse at 30% 30%, var(--btn-green-light) 0%, var(--btn-green) 40%, var(--btn-green-dark) 100% ); color: #fff; text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6), 0 0 8px rgba(0, 255, 0, 0.3); box-shadow: 0 8px 0 var(--btn-green-shadow), 0 10px 16px rgba(0, 0, 0, 0.6), 0 14px 24px rgba(0, 0, 0, 0.4), inset 0 -3px 6px rgba(0, 0, 0, 0.4), inset 0 3px 6px rgba(255, 255, 255, 0.25), inset 0 0 0 1px rgba(255, 255, 255, 0.1); transform: translateY(0); transition: all 0.08s ease; position: relative; } /* Button top highlight */ .start-btn::before { content: ''; position: absolute; top: 4px; left: 12px; right: 12px; height: 1px; background: rgba(255, 255, 255, 0.3); border-radius: 50%; } .start-btn:hover { filter: brightness(1.15); transform: translateY(-1px); box-shadow: 0 9px 0 var(--btn-green-shadow), 0 12px 20px rgba(0, 0, 0, 0.7), 0 16px 28px rgba(0, 0, 0, 0.4), inset 0 -3px 6px rgba(0, 0, 0, 0.4), inset 0 3px 6px rgba(255, 255, 255, 0.25), inset 0 0 0 1px rgba(255, 255, 255, 0.1); } .start-btn:active { transform: translateY(5px); box-shadow: 0 3px 0 var(--btn-green-shadow), 0 5px 10px rgba(0, 0, 0, 0.6), 0 8px 16px rgba(0, 0, 0, 0.4), inset 0 -3px 6px rgba(0, 0, 0, 0.4), inset 0 3px 6px rgba(255, 255, 255, 0.25), inset 0 0 0 1px rgba(255, 255, 255, 0.1); } /* Pause Button Container */ .pause-btn-container { display: flex; justify-content: center; margin-bottom: 18px; } /* Direction Controls */ .direction-controls { display: flex; flex-direction: column; align-items: center; gap: 10px; margin-top: 24px; } .control-row { display: flex; gap: 10px; } .arcade-btn { width: 60px; height: 60px; border-radius: 50%; border: none; cursor: pointer; font-size: 10px; font-family: 'Press Start 2P', cursive; color: #fff; text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6), 0 0 6px rgba(255, 255, 255, 0.2); display: flex; align-items: center; justify-content: center; transform: translateY(0); transition: all 0.08s ease; -webkit-tap-highlight-color: transparent; touch-action: manipulation; position: relative; } /* Button top highlight */ .arcade-btn::before { content: ''; position: absolute; top: 6px; left: 14px; right: 14px; height: 1px; background: rgba(255, 255, 255, 0.35); border-radius: 50%; } /* Red direction buttons */ .arcade-btn.red { background: radial-gradient( ellipse at 30% 30%, var(--btn-red-light) 0%, var(--btn-red) 40%, var(--btn-red-dark) 100% ); box-shadow: 0 7px 0 var(--btn-red-shadow), 0 9px 14px rgba(0, 0, 0, 0.6), 0 12px 20px rgba(0, 0, 0, 0.4), inset 0 -3px 6px rgba(0, 0, 0, 0.4), inset 0 3px 6px rgba(255, 255, 255, 0.25), inset 0 0 0 1px rgba(255, 255, 255, 0.1); } .arcade-btn.red:hover { filter: brightness(1.15); transform: translateY(-1px); box-shadow: 0 8px 0 var(--btn-red-shadow), 0 10px 16px rgba(0, 0, 0, 0.6), 0 14px 24px rgba(0, 0, 0, 0.4), inset 0 -3px 6px rgba(0, 0, 0, 0.4), inset 0 3px 6px rgba(255, 255, 255, 0.25), inset 0 0 0 1px rgba(255, 255, 255, 0.1); } .arcade-btn.red:active { transform: translateY(5px); box-shadow: 0 2px 0 var(--btn-red-shadow), 0 4px 8px rgba(0, 0, 0, 0.6), 0 6px 12px rgba(0, 0, 0, 0.4), inset 0 -3px 6px rgba(0, 0, 0, 0.4), inset 0 3px 6px rgba(255, 255, 255, 0.25), inset 0 0 0 1px rgba(255, 255, 255, 0.1); } /* Yellow direction buttons */ .arcade-btn.yellow { background: radial-gradient( ellipse at 30% 30%, var(--btn-yellow-light) 0%, var(--btn-yellow) 40%, var(--btn-yellow-dark) 100% ); box-shadow: 0 7px 0 var(--btn-yellow-shadow), 0 9px 14px rgba(0, 0, 0, 0.6), 0 12px 20px rgba(0, 0, 0, 0.4), inset 0 -3px 6px rgba(0, 0, 0, 0.4), inset 0 3px 6px rgba(255, 255, 255, 0.25), inset 0 0 0 1px rgba(255, 255, 255, 0.1); } .arcade-btn.yellow:hover { filter: brightness(1.15); transform: translateY(-1px); box-shadow: 0 8px 0 var(--btn-yellow-shadow), 0 10px 16px rgba(0, 0, 0, 0.6), 0 14px 24px rgba(0, 0, 0, 0.4), inset 0 -3px 6px rgba(0, 0, 0, 0.4), inset 0 3px 6px rgba(255, 255, 255, 0.25), inset 0 0 0 1px rgba(255, 255, 255, 0.1); } .arcade-btn.yellow:active { transform: translateY(5px); box-shadow: 0 2px 0 var(--btn-yellow-shadow), 0 4px 8px rgba(0, 0, 0, 0.6), 0 6px 12px rgba(0, 0, 0, 0.4), inset 0 -3px 6px rgba(0, 0, 0, 0.4), inset 0 3px 6px rgba(255, 255, 255, 0.25), inset 0 0 0 1px rgba(255, 255, 255, 0.1); } /* Placeholder button for layout */ .arcade-btn.placeholder { visibility: hidden; } /* ======================================== COIN SLOT ======================================== */ .coin-slot-area { display: flex; align-items: center; justify-content: center; gap: 20px; margin-bottom: 20px; } .coin-slot { display: flex; flex-direction: column; align-items: center; gap: 6px; } .coin-slot-label { font-size: 8px; color: var(--metal-chrome); letter-spacing: 2px; text-transform: uppercase; text-shadow: 0 1px 2px rgba(0, 0, 0, 0.8); } .coin-slot-opening { width: 48px; height: 8px; background: linear-gradient( 180deg, #020202 0%, #080808 50%, #050505 100% ); border: 3px solid var(--metal-mid); border-radius: 3px; box-shadow: inset 0 3px 8px rgba(0, 0, 0, 1), inset 0 -2px 4px rgba(0, 0, 0, 0.8), 0 2px 4px rgba(0, 0, 0, 0.6), 0 4px 8px rgba(0, 0, 0, 0.4), 0 0 0 1px var(--metal-dark); position: relative; overflow: hidden; cursor: pointer; transition: all 0.2s ease; } /* Metal bezel around coin slot */ .coin-slot-opening::before { content: ''; position: absolute; inset: 0; border-radius: 2px; background: linear-gradient( 180deg, rgba(255, 255, 255, 0.05) 0%, transparent 50%, rgba(0, 0, 0, 0.3) 100% ); pointer-events: none; } .coin-slot-opening:hover { border-color: var(--neon-yellow); box-shadow: inset 0 3px 8px rgba(0, 0, 0, 1), inset 0 -2px 4px rgba(0, 0, 0, 0.8), 0 2px 4px rgba(0, 0, 0, 0.6), 0 0 0 1px var(--metal-dark), 0 0 15px rgba(255, 255, 0, 0.4), 0 0 30px rgba(255, 255, 0, 0.2); } /* Animated coin */ .coin { position: absolute; width: 18px; height: 18px; background: radial-gradient( ellipse at 25% 25%, #ffe44d 0%, #ffd700 30%, #daa520 60%, #b8860b 100% ); border-radius: 50%; top: -24px; left: 50%; transform: translateX(-50%); opacity: 0; box-shadow: 0 3px 6px rgba(0, 0, 0, 0.5), inset 0 2px 4px rgba(255, 255, 255, 0.4), inset 0 -1px 2px rgba(0, 0, 0, 0.3); } /* Coin shine */ .coin::before { content: ''; position: absolute; top: 3px; left: 4px; right: 4px; height: 1px; background: rgba(255, 255, 255, 0.6); border-radius: 50%; } .coin-slot-opening.dropping .coin { animation: coinDrop 0.7s ease-in forwards; } @keyframes coinDrop { 0% { top: -24px; opacity: 1; transform: translateX(-50%) rotate(0deg); } 60% { top: 2px; opacity: 1; transform: translateX(-50%) rotate(180deg); } 80% { top: 4px; opacity: 0.8; } 100% { top: 24px; opacity: 0; transform: translateX(-50%) rotate(360deg); } } /* ======================================== CABINET SIDE PANELS ======================================== */ .cabinet-side { position: absolute; top: 0; bottom: 0; width: 8px; background: linear-gradient( 90deg, var(--metal-black) 0%, var(--metal-dark) 30%, var(--metal-mid) 70%, var(--metal-dark) 100% ); z-index: 0; } .cabinet-side.left { left: 0; background: linear-gradient( 90deg, var(--metal-dark) 0%, var(--metal-mid) 50%, var(--metal-dark) 100% ); box-shadow: inset 2px 0 6px rgba(0, 0, 0, 0.8), inset -1px 0 2px rgba(255, 255, 255, 0.03); } .cabinet-side.right { right: 0; background: linear-gradient( 90deg, var(--metal-dark) 0%, var(--metal-mid) 50%, var(--metal-dark) 100% ); box-shadow: inset -2px 0 6px rgba(0, 0, 0, 0.8), inset 1px 0 2px rgba(255, 255, 255, 0.03); } /* ======================================== CABINET DECORATIONS ======================================== */ .cabinet-screws { display: flex; justify-content: space-between; padding: 10px 20px; } .screw { width: 14px; height: 14px; background: radial-gradient( circle at 35% 35%, var(--metal-chrome) 0%, var(--metal-light) 40%, var(--metal-mid) 70%, var(--metal-dark) 100% ); border-radius: 50%; box-shadow: inset 0 2px 4px rgba(255, 255, 255, 0.3), inset 0 -1px 2px rgba(0, 0, 0, 0.4), 0 2px 4px rgba(0, 0, 0, 0.6), 0 3px 6px rgba(0, 0, 0, 0.3); position: relative; } /* Screw head slot */ .screw::before { content: ''; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); width: 10px; height: 2px; background: var(--metal-dark); box-shadow: 0 1px 0 rgba(0, 0, 0, 0.5); } /* Screw head cross slot */ .screw::after { content: ''; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); width: 2px; height: 10px; background: var(--metal-dark); box-shadow: 0 1px 0 rgba(0, 0, 0, 0.5); } /* ======================================== BRAND PLAQUE ======================================== */ .brand-plaque { background: linear-gradient( 180deg, #d4af37 0%, #b8960c 20%, #9a7b0a 50%, #7a6108 80%, #5c4a06 100% ); border: 3px solid #3d3104; border-radius: 6px; padding: 10px 20px; margin: 10px 24px; text-align: center; box-shadow: inset 0 3px 6px rgba(255, 255, 255, 0.4), inset 0 -3px 6px rgba(0, 0, 0, 0.5), 0 3px 8px rgba(0, 0, 0, 0.6), 0 6px 12px rgba(0, 0, 0, 0.4), 0 0 0 2px #3d3104, 0 0 15px rgba(212, 175, 55, 0.2); position: relative; transform-style: preserve-3d; } /* Brushed brass effect */ .brand-plaque::before { content: ''; position: absolute; inset: 0; background: repeating-linear-gradient( 90deg, transparent, transparent 3px, rgba(255, 255, 255, 0.08) 3px, rgba(255, 255, 255, 0.08) 4px ); border-radius: 4px; pointer-events: none; } /* Plaque inner shadow */ .brand-plaque::after { content: ''; position: absolute; inset: 4px; border: 1px solid rgba(255, 255, 255, 0.15); border-radius: 3px; pointer-events: none; } .brand-plaque-text { font-size: 9px; color: #2a2005; text-transform: uppercase; letter-spacing: 3px; font-weight: bold; text-shadow: 0 1px 0 rgba(255, 255, 255, 0.4), 0 -1px 0 rgba(0, 0, 0, 0.2); position: relative; z-index: 1; } /* ======================================== CONTROL PANEL RECESSED AREA ======================================== */ .control-panel-recess { background: linear-gradient( 180deg, #050505 0%, #0a0a0a 50%, #050505 100% ); border-radius: 8px; padding: 20px; margin: 12px; box-shadow: inset 0 4px 12px rgba(0, 0, 0, 0.9), inset 0 -2px 6px rgba(0, 0, 0, 0.7), 0 1px 0 rgba(255, 255, 255, 0.02); position: relative; } /* Recessed edge highlight */ .control-panel-recess::before { content: ''; position: absolute; inset: 0; border-radius: 8px; border: 1px solid #151515; pointer-events: none; } /* ======================================== JOYSTICK BASE ======================================== */ .joystick-base { width: 80px; height: 80px; background: radial-gradient( circle at 30% 30%, var(--metal-light) 0%, var(--metal-mid) 40%, var(--metal-dark) 70%, var(--metal-black) 100% ); border-radius: 50%; position: relative; box-shadow: inset 0 4px 8px rgba(0, 0, 0, 0.6), inset 0 -2px 6px rgba(255, 255, 255, 0.05), 0 4px 12px rgba(0, 0, 0, 0.5); } .joystick-base::before { content: ''; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); width: 50px; height: 50px; background: radial-gradient( circle, var(--metal-dark) 0%, var(--metal-black) 100% ); border-radius: 50%; box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.8), 0 0 0 2px var(--metal-mid); } /* ======================================== CABLE MANAGEMENT ======================================== */ .cable-ties { display: flex; gap: 6px; padding: 8px 20px; justify-content: center; } .cable-tie { width: 30px; height: 4px; background: linear-gradient( 180deg, #333 0%, #222 50%, #333 100% ); border-radius: 2px; box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.5), 0 1px 1px rgba(255, 255, 255, 0.05); } .cable-tie::before { content: ''; position: absolute; right: -8px; top: 50%; transform: translateY(-50%); width: 8px; height: 6px; background: linear-gradient( 180deg, #333 0%, #222 100% ); border-radius: 1px; clip-path: polygon(0 20%, 100% 0, 100% 100%, 0 80%); } /* ======================================== SPEAKER GRILLE ======================================== */ .speaker-grille { background: linear-gradient( 180deg, var(--metal-dark) 0%, var(--metal-black) 50%, var(--metal-dark) 100% ); padding: 18px 24px; display: flex; justify-content: center; align-items: center; border-top: 4px solid var(--metal-black); border-bottom: 4px solid var(--metal-black); position: relative; box-shadow: inset 0 3px 10px rgba(0, 0, 0, 0.9), inset 0 -3px 10px rgba(0, 0, 0, 0.7), 0 3px 6px rgba(0, 0, 0, 0.5); } /* Speaker grille mesh texture */ .speaker-grille::before { content: ''; position: absolute; inset: 0; background: repeating-linear-gradient( 45deg, transparent, transparent 2px, rgba(0, 0, 0, 0.3) 2px, rgba(0, 0, 0, 0.3) 3px ); pointer-events: none; opacity: 0.5; } .speaker-holes { display: grid; grid-template-columns: repeat(12, 1fr); gap: 8px; padding: 10px 16px; } .speaker-hole { width: 8px; height: 8px; background: radial-gradient( circle at 35% 35%, var(--grille-bg) 0%, var(--grille-hole) 60% ); border-radius: 50%; box-shadow: inset 0 2px 4px rgba(0, 0, 0, 1), 0 1px 2px rgba(0, 0, 0, 0.8), inset 0 0 0 1px #1a1a1a; } /* ======================================== CABINET VENTS ======================================== */ .cabinet-vents { display: flex; justify-content: space-between; padding: 0 16px 16px; } .vent-slot { width: 90px; height: 5px; background: linear-gradient( 90deg, var(--vent-color) 0%, var(--vent-shadow) 40%, #000000 50%, var(--vent-shadow) 60%, var(--vent-color) 100% ); border-radius: 3px; box-shadow: inset 0 2px 4px rgba(0, 0, 0, 1), 0 1px 2px rgba(0, 0, 0, 0.8), inset 0 0 0 1px #1a1a1a; position: relative; } /* Vent inner slats */ .vent-slot::before { content: ''; position: absolute; inset: 2px; background: repeating-linear-gradient( 90deg, transparent, transparent 8px, rgba(0, 0, 0, 0.8) 8px, rgba(0, 0, 0, 0.8) 10px ); border-radius: 2px; } /* ======================================== GAME OVER SHAKE ======================================== */ .game-over-shake { animation: shake 0.5s ease-in-out; } @keyframes shake { 0%, 100% { transform: translateX(0); } 25% { transform: translateX(-5px); } 75% { transform: translateX(5px); } } /* ======================================== SCORE UPDATE ANIMATION ======================================== */ .score-update .led-value { animation: scorePopup 0.3s ease-out; } @keyframes scorePopup { 0% { transform: scale(1); } 50% { transform: scale(1.2); } 100% { transform: scale(1); } } /* ======================================== CABINET EDGE DETAILS ======================================== */ .cabinet-edge-top { height: 6px; background: linear-gradient( 180deg, var(--metal-highlight) 0%, var(--metal-mid) 30%, var(--metal-dark) 70%, var(--metal-black) 100% ); border-bottom: 2px solid var(--metal-black); box-shadow: inset 0 1px 2px rgba(255, 255, 255, 0.1), 0 2px 4px rgba(0, 0, 0, 0.5); } .cabinet-edge-bottom { height: 6px; background: linear-gradient( 180deg, var(--metal-black) 0%, var(--metal-dark) 30%, var(--metal-mid) 70%, var(--metal-highlight) 100% ); border-top: 2px solid var(--metal-black); box-shadow: inset 0 -1px 2px rgba(255, 255, 255, 0.05), 0 -2px 4px rgba(0, 0, 0, 0.4); } /* ======================================== BUTTON BEZEL RINGS ======================================== */ .arcade-btn-bezel { width: 66px; height: 66px; background: radial-gradient( circle, var(--metal-dark) 0%, var(--metal-black) 70% ); border-radius: 50%; display: flex; align-items: center; justify-content: center; box-shadow: inset 0 2px 6px rgba(0, 0, 0, 0.9), inset 0 -1px 3px rgba(255, 255, 255, 0.02), 0 2px 4px rgba(0, 0, 0, 0.5), 0 4px 8px rgba(0, 0, 0, 0.3), 0 0 0 2px var(--metal-mid), 0 0 0 3px var(--metal-dark); position: relative; } /* Bezel inner ring */ .arcade-btn-bezel::before { content: ''; position: absolute; inset: 3px; border-radius: 50%; border: 1px solid var(--metal-light); opacity: 0.3; box-shadow: inset 0 1px 2px rgba(255, 255, 255, 0.1); } /* ======================================== CONTROL PANEL BUTTON GROUP ======================================== */ .button-group { display: flex; align-items: center; gap: 12px; padding: 12px; background: linear-gradient( 180deg, #0a0a0a 0%, #080808 100% ); border-radius: 8px; box-shadow: inset 0 2px 6px rgba(0, 0, 0, 0.8), 0 1px 0 rgba(255, 255, 255, 0.02); } /* ======================================== LED INDICATOR LIGHTS ======================================== */ .led-indicator { width: 8px; height: 8px; border-radius: 50%; background: radial-gradient( circle at 30% 30%, var(--led-red-light) 0%, var(--led-red) 50%, var(--led-red-dark) 100% ); box-shadow: 0 0 8px var(--led-glow), 0 0 16px rgba(255, 51, 51, 0.4), inset 0 1px 2px rgba(255, 255, 255, 0.3); animation: ledPulse 2s infinite; } .led-indicator.green { background: radial-gradient( circle at 30% 30%, var(--btn-green-light) 0%, var(--btn-green) 50%, var(--btn-green-dark) 100% ); box-shadow: 0 0 8px rgba(0, 255, 0, 0.6), 0 0 16px rgba(0, 255, 0, 0.3), inset 0 1px 2px rgba(255, 255, 255, 0.3); } .led-indicator.yellow { background: radial-gradient( circle at 30% 30%, var(--btn-yellow-light) 0%, var(--btn-yellow) 50%, var(--btn-yellow-dark) 100% ); box-shadow: 0 0 8px rgba(255, 221, 68, 0.6), 0 0 16px rgba(255, 221, 68, 0.3), inset 0 1px 2px rgba(255, 255, 255, 0.3); } @keyframes ledPulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.7; } } .led-indicator-row { display: flex; gap: 8px; justify-content: center; padding: 8px 0; } /* ======================================== POWER SWITCH ======================================== */ .power-switch-container { display: flex; flex-direction: column; align-items: center; gap: 4px; } .power-switch-label { font-size: 6px; color: var(--metal-chrome); letter-spacing: 1px; text-transform: uppercase; } .power-switch { width: 24px; height: 14px; background: linear-gradient( 180deg, var(--metal-mid) 0%, var(--metal-dark) 100% ); border-radius: 7px; border: 2px solid var(--metal-light); box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.6), 0 2px 4px rgba(0, 0, 0, 0.4); position: relative; cursor: pointer; } .power-switch::before { content: ''; position: absolute; top: 2px; left: 2px; width: 8px; height: 6px; background: linear-gradient( 180deg, var(--btn-green-light) 0%, var(--btn-green) 100% ); border-radius: 3px; box-shadow: 0 0 4px rgba(0, 255, 0, 0.5), 0 0 8px rgba(0, 255, 0, 0.3), inset 0 1px 2px rgba(255, 255, 255, 0.3); animation: powerPulse 3s infinite ease-in-out; } @keyframes powerPulse { 0%, 100% { opacity: 1; box-shadow: 0 0 4px rgba(0, 255, 0, 0.5), 0 0 8px rgba(0, 255, 0, 0.3), inset 0 1px 2px rgba(255, 255, 255, 0.3); } 50% { opacity: 0.85; box-shadow: 0 0 6px rgba(0, 255, 0, 0.6), 0 0 12px rgba(0, 255, 0, 0.4), inset 0 1px 2px rgba(255, 255, 255, 0.3); } } /* ======================================== VOLUME KNOB ======================================== */ .volume-knob { width: 28px; height: 28px; background: radial-gradient( circle at 30% 30%, var(--metal-light) 0%, var(--metal-mid) 40%, var(--metal-dark) 70%, var(--metal-black) 100% ); border-radius: 50%; border: 2px solid var(--metal-chrome); box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.6), inset 0 -1px 2px rgba(255, 255, 255, 0.05), 0 3px 6px rgba(0, 0, 0, 0.5), 0 5px 10px rgba(0, 0, 0, 0.3); position: relative; cursor: pointer; transition: transform 0.1s ease; } .volume-knob:hover { transform: scale(1.05); } .volume-knob:active { transform: scale(0.98); } .volume-knob::before { content: ''; position: absolute; top: 4px; left: 50%; transform: translateX(-50%); width: 2px; height: 6px; background: var(--metal-black); border-radius: 1px; } .volume-knob-label { font-size: 6px; color: var(--metal-chrome); letter-spacing: 1px; text-transform: uppercase; margin-top: 4px; } .volume-control { display: flex; flex-direction: column; align-items: center; } /* ======================================== DECORATIVE RIVETS ======================================== */ .rivets-row { display: flex; justify-content: center; gap: 40px; padding: 8px 0; } .rivet { width: 8px; height: 8px; background: radial-gradient( circle at 35% 35%, var(--metal-chrome) 0%, var(--metal-light) 40%, var(--metal-mid) 70%, var(--metal-dark) 100% ); border-radius: 50%; box-shadow: inset 0 1px 2px rgba(255, 255, 255, 0.3), 0 1px 2px rgba(0, 0, 0, 0.5); } .rivet::before { content: ''; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); width: 4px; height: 1px; background: var(--metal-dark); } /* ======================================== RESPONSIVE DESIGN ======================================== */ @media (max-width: 480px) { body { padding: 10px; } .arcade-cabinet { border-radius: 14px; padding: 3px; } .cabinet-inner { border-radius: 10px; } .marquee { padding: 18px 20px; } .marquee-title { font-size: 18px; letter-spacing: 2px; } .marquee-subtitle { font-size: 7px; letter-spacing: 2px; } .rivets-row { gap: 30px; } .rivet { width: 6px; height: 6px; } .led-display-panel { padding: 14px 16px; } .led-value { font-size: 16px; min-width: 60px; } .led-label { font-size: 6px; } .screen-bezel { padding: 12px; margin: 0 8px; border-radius: 8px; } .crt-screen { border-radius: 6px; min-height: 250px; } .game-overlay h2 { font-size: 16px; letter-spacing: 3px; } .final-score { font-size: 11px; } .new-high-score { font-size: 9px; } .level-select { width: 160px; padding: 12px 14px; font-size: 9px; } .start-btn { width: 160px; padding: 14px 20px; font-size: 10px; } .control-panel { padding: 16px; } .coin-slot-opening { width: 40px; height: 6px; } .coin { width: 14px; height: 14px; } .power-switch { width: 20px; height: 12px; } .volume-knob { width: 24px; height: 24px; } .volume-knob-label, .power-switch-label { font-size: 5px; } .led-indicator { width: 6px; height: 6px; } .arcade-btn-bezel { width: 54px; height: 54px; } .arcade-btn { width: 48px; height: 48px; font-size: 8px; } .speaker-grille { padding: 12px 16px; } .speaker-holes { gap: 6px; padding: 8px 12px; } .speaker-hole { width: 6px; height: 6px; } .vent-slot { width: 60px; height: 4px; } .brand-plaque { padding: 8px 16px; margin: 8px 16px; } .brand-plaque-text { font-size: 7px; letter-spacing: 2px; } .screw { width: 12px; height: 12px; } } /* ======================================== PREFERS REDUCED MOTION ======================================== */ @media (prefers-reduced-motion: reduce) { *, *::before, *::after { animation-duration: 0.01ms !important; animation-iteration-count: 1 !important; transition-duration: 0.01ms !important; } }