* { -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; cursor: none; } /* ============ TAILWIND UTILITY REPLACEMENTS ============ */ /* Only used when reduced_styles = true (no Tailwind CDN). */ .reduced-styles .flex { display: flex; } .reduced-styles .flex-col { flex-direction: column; } .reduced-styles .flex-1 { flex: 1 1 0%; } .reduced-styles .h-screen { height: 100vh; } .reduced-styles .w-screen { width: 100vw; } .reduced-styles .text-center { text-align: center; } .reduced-styles .pt-6 { padding-top: 1.5rem; } .reduced-styles .pointer-events-none { pointer-events: none; } .reduced-styles .items-center { align-items: center; } .reduced-styles .justify-center { justify-content: center; } .reduced-styles .relative { position: relative; } .reduced-styles .tracking-widest { letter-spacing: 0.1em; } .reduced-styles .uppercase { text-transform: uppercase; } .reduced-styles .whitespace-nowrap { white-space: nowrap; } .reduced-styles .leading-none { line-height: 1; } .reduced-styles .font-black { font-weight: 900; } .reduced-styles .font-bold { font-weight: 700; } .reduced-styles .italic { font-style: italic; } .reduced-styles .font-cinzel { font-family: 'Cinzel', serif; } .reduced-styles .font-orbitron { font-family: 'Orbitron', sans-serif; } .reduced-styles .font-playfair { font-family: 'Playfair Display', serif; } /* ============ SIDES ============ */ .side { position: relative; touch-action: none; } .side:active .side-glow { opacity: 1; } /* 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: 100%; transform: scaleX(0); transform-origin: left center; transition: none; } .side.holding::after { animation: hold-progress 4s linear forwards; } .side.hold-reset-arm::after { background: #ef4444; box-shadow: 0 0 12px #ef4444; } .side.hold-cancel::after { animation: hold-fade 0.2s ease-out forwards; transform: scaleX(1); } @keyframes hold-progress { 0% { transform: scaleX(0); } 100% { transform: scaleX(1); } } @keyframes hold-fade { 0% { opacity: 1; } 100% { opacity: 0; } } .side-glow { position: fixed; top: 0; left: 0; width: 100vw; height: 100vh; pointer-events: none; z-index: 0; opacity: 0.7; transition: opacity 0.15s ease; will-change: opacity; } .side-content { position: relative; z-index: 2; } /* ============ TEAM NAME ============ */ .team-name { letter-spacing: 0.3em; text-transform: uppercase; color: #c9a84c; text-shadow: 0 0 10px rgba(201, 168, 76, 0.35); } /* ============ 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.05em currentColor, 0 0 0.12em currentColor; 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) 60%, transparent 100% ); } .side-right .sweep-gradient { background: linear-gradient( 90deg, transparent 0%, var(--team-color) 40%, var(--team-color) 100% ); } /* ============ LIQUID WAVES (full styles only) ============ */ body:not(.reduced-styles) .wave-container { position: absolute; inset: 0; } body:not(.reduced-styles) .wave { position: absolute; left: -25%; width: 150%; border-radius: 42%; animation: wave-spin linear infinite; will-change: transform; } body:not(.reduced-styles) .wave-front { height: 160%; top: -15%; background: var(--team-color); opacity: 0.2; animation-duration: 3s; } body:not(.reduced-styles) .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 40px rgba(59, 130, 246, 0.4), inset 0 0 60px rgba(59, 130, 246, 0.15); outline: 4px solid rgba(59, 130, 246, 0.7); outline-offset: -4px; } .side.counting::before { content: ''; position: absolute; inset: 0; z-index: 1; pointer-events: none; box-shadow: 0 0 50px rgba(59, 130, 246, 0.55), inset 0 0 90px rgba(59, 130, 246, 0.2); animation: counting-pulse 0.6s ease-in-out infinite alternate; will-change: opacity; } @keyframes counting-pulse { 0% { opacity: 0.4; } 100% { opacity: 1; } } .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: 100%; transform: scaleX(0); transform-origin: left center; } .hw-bar.active { animation: hw-progress 5s linear forwards; } @keyframes hw-progress { 0% { transform: scaleX(0); } 100% { transform: scaleX(1); } } /* ============ 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: 100%; transform: scaleX(0); transform-origin: left center; } #reset-confirm.show .confirm-bar { animation: confirm-progress 10s linear forwards; } @keyframes confirm-progress { 0% { transform: scaleX(0); } 100% { transform: scaleX(1); } }