* { -webkit-user-select: none; user-select: none; -webkit-tap-highlight-color: transparent; } html, body { margin: 0; padding: 0; width: 100vw; height: 100vh; overflow: hidden; background: #0a0a0f; } /* ============ SIDES ============ */ .side { cursor: pointer; position: relative; touch-action: none; transition: filter 0.15s ease; } .side:active { filter: brightness(1.15); } /* Hold to reset progress bar */ .side::after { content: ''; position: absolute; bottom: 0; left: 0; height: 5px; z-index: 30; pointer-events: none; background: var(--team-color); box-shadow: 0 0 12px var(--team-color); width: 0; transition: none; } .side.holding::after { animation: hold-progress 1.5s linear forwards; } .side.hold-cancel::after { animation: hold-fade 0.2s ease-out forwards; width: 100%; } @keyframes hold-progress { 0% { width: 0; } 100% { width: 100%; } } @keyframes hold-fade { 0% { opacity: 1; } 100% { opacity: 0; width: 100%; } } .side.holding { filter: brightness(0.7) !important; } .side-glow { position: fixed; top: 0; left: 0; width: 100vw; height: 100vh; pointer-events: none; z-index: 0; } .side-content { position: relative; z-index: 2; } /* ============ TEAM NAME ============ */ .team-name { letter-spacing: 0.3em; text-transform: uppercase; color: #c9a84c; text-shadow: 0 0 20px rgba(201, 168, 76, 0.3), 0 0 40px rgba(201, 168, 76, 0.1); } /* ============ TEAM SUBTITLE ============ */ .team-subtitle { font-size: 0.55em; letter-spacing: 0.25em; text-transform: uppercase; color: rgba(255, 255, 255, 0.5); margin-top: 0.3em; text-shadow: 0 0 12px rgba(255, 255, 255, 0.1); } /* ============ SCORE ============ */ .score { position: relative; color: inherit; text-shadow: 0 0 0.04em currentColor, 0 0 0.1em currentColor, 0 0 0.2em color-mix(in srgb, currentColor 40%, transparent); transition: text-shadow 0.3s ease; } /* ============ SCORE POP ============ */ @keyframes score-pop { 0% { transform: scale(1); } 25% { transform: scale(1.3); } 50% { transform: scale(0.95); } 75% { transform: scale(1.05); } 100% { transform: scale(1); } } .score-pop { animation: score-pop 0.6s cubic-bezier(0.34, 1.56, 0.64, 1) forwards; } /* ============ SWEEP OVERLAY ============ */ .sweep-overlay { position: fixed; top: 0; height: 100vh; z-index: 5; pointer-events: none; will-change: transform, opacity; transform: scaleX(0); opacity: 0; } .side-left .sweep-overlay { left: 0; width: 50vw; transform-origin: right center; } .side-right .sweep-overlay { right: 0; width: 50vw; transform-origin: left center; } /* Sweep expand + hold then fade */ .sweep-overlay.sweeping { animation: sweep-expand 0.45s cubic-bezier(0.22, 1, 0.36, 1) forwards, sweep-hold 0.15s ease-out 0.45s forwards, sweep-fade 0.4s ease-out 0.6s forwards; } @keyframes sweep-expand { 0% { transform: scaleX(0); opacity: 1; } 100% { transform: scaleX(1); opacity: 1; } } @keyframes sweep-hold { 0% { opacity: 1; } 100% { opacity: 1; } } @keyframes sweep-fade { 0% { opacity: 1; } 100% { opacity: 0; } } /* ============ SWEEP GRADIENT ============ */ .sweep-gradient { position: absolute; inset: 0; opacity: 0.35; } .side-left .sweep-gradient { background: linear-gradient( 90deg, var(--team-color) 0%, var(--team-color) 40%, var(--team-color) 60%, color-mix(in srgb, var(--team-color) 40%, transparent) 85%, transparent 100% ); } .side-right .sweep-gradient { background: linear-gradient( 90deg, transparent 0%, color-mix(in srgb, var(--team-color) 40%, transparent) 15%, var(--team-color) 40%, var(--team-color) 60%, var(--team-color) 100% ); } /* ============ LIQUID WAVES ============ */ .wave-container { position: absolute; inset: 0; } .wave { position: absolute; left: -25%; width: 150%; border-radius: 42%; animation: wave-spin linear infinite; will-change: transform; } .wave-front { height: 160%; top: -15%; background: var(--team-color); opacity: 0.2; animation-duration: 3s; } .wave-back { height: 200%; top: -40%; background: var(--team-color); opacity: 0.1; animation-duration: 5s; animation-direction: reverse; } @keyframes wave-spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } } /* ============ HAND WAVE COUNTDOWN ============ */ .side.counting { box-shadow: 0 0 60px rgba(59, 130, 246, 0.9), 0 0 120px rgba(59, 130, 246, 0.5), 0 0 200px rgba(59, 130, 246, 0.25), inset 0 0 80px rgba(59, 130, 246, 0.2); animation: counting-pulse 0.6s ease-in-out infinite alternate; outline: 4px solid rgba(59, 130, 246, 0.7); outline-offset: -4px; } @keyframes counting-pulse { 0% { box-shadow: 0 0 50px rgba(59,130,246,0.7), 0 0 100px rgba(59,130,246,0.3), 0 0 160px rgba(59,130,246,0.15), inset 0 0 60px rgba(59,130,246,0.12); outline-color: rgba(59,130,246,0.5); } 100% { box-shadow: 0 0 80px rgba(59,130,246,1.0), 0 0 160px rgba(59,130,246,0.6), 0 0 260px rgba(59,130,246,0.35), inset 0 0 120px rgba(59,130,246,0.3); outline-color: rgba(59,130,246,0.9); } } .hw-bar { position: absolute; top: 0; left: 0; height: 8px; z-index: 31; pointer-events: none; background: #60a5fa; box-shadow: 0 0 20px #3b82f6, 0 0 40px #3b82f6; width: 0; } .hw-bar.active { animation: hw-progress 5s linear forwards; } @keyframes hw-progress { 0% { width: 0; } 100% { width: 100%; } } /* ============ RESET CONFIRM OVERLAY ============ */ #reset-confirm { position: fixed; inset: 0; background: rgba(180, 0, 0, 0.85); display: none; align-items: center; justify-content: center; z-index: 100; pointer-events: none; } #reset-confirm.show { display: flex; animation: confirm-fadein 0.3s ease-out forwards; } @keyframes confirm-fadein { 0% { opacity: 0; } 100% { opacity: 1; } } #reset-confirm span { color: white; font-family: 'Orbitron', sans-serif; font-size: 4rem; font-weight: 900; letter-spacing: 0.1em; text-transform: uppercase; text-shadow: 0 0 40px rgba(255,255,255,0.3); } #reset-confirm .confirm-bar { position: absolute; bottom: 0; left: 0; height: 8px; background: white; box-shadow: 0 0 20px white, 0 0 40px white; width: 0; } #reset-confirm.show .confirm-bar { animation: confirm-progress 10s linear forwards; } @keyframes confirm-progress { 0% { width: 0; } 100% { width: 100%; } }