/* ── Custom properties ─────────────────────────────────────────────────────── */ :root { --bg: #0d0d14; --bg-surface: #131325; --bg-surface2: #1a1a2e; --accent: #ffe710; --accent-dim: rgba(255, 231, 16, 0.15); --brand: #41639c; --brand-dim: rgba(65, 99, 156, 0.12); --danger: #ff525d; --danger-dim: rgba(255, 82, 93, 0.15); --success: #4dff91; --success-dim: rgba(77, 255, 145, 0.15); --text: #e0e0e0; --text-muted: #556; --border: rgba(65, 99, 156, 0.3); --font-heading: 'Rajdhani', 'Exo 2', sans-serif; --font-mono: 'Share Tech Mono', 'Courier New', monospace; --font-body: 'Exo 2', system-ui, sans-serif; --radius: 4px; --transition: 0.15s ease; } /* ── Reset & base ──────────────────────────────────────────────────────────── */ *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; } html, body { height: 100%; background: var(--bg); color: var(--text); font-family: var(--font-body); font-size: 16px; line-height: 1.5; overflow-x: hidden; } /* ── Military grid overlay ─────────────────────────────────────────────────── */ body::before { content: ''; position: fixed; inset: 0; background-image: linear-gradient(rgba(65, 99, 156, 0.06) 1px, transparent 1px), linear-gradient(90deg, rgba(65, 99, 156, 0.06) 1px, transparent 1px); background-size: 40px 40px; pointer-events: none; z-index: 0; } /* Scanlines */ body::after { content: ''; position: fixed; inset: 0; background: repeating-linear-gradient( 0deg, transparent, transparent 3px, rgba(0, 0, 0, 0.06) 3px, rgba(0, 0, 0, 0.06) 4px ); pointer-events: none; z-index: 0; } /* ── Layout helpers ────────────────────────────────────────────────────────── */ .hidden { display: none !important; } .view { position: relative; z-index: 1; min-height: calc(100vh - 56px); padding: 24px 20px 48px; max-width: 1100px; margin: 0 auto; } .view-centered { display: flex; align-items: center; justify-content: center; min-height: 100vh; padding: 20px; } /* ── Navigation ────────────────────────────────────────────────────────────── */ #main-nav { position: sticky; top: 0; z-index: 100; display: flex; align-items: center; gap: 16px; padding: 0 20px; height: 56px; background: rgba(13, 13, 20, 0.92); border-bottom: 1px solid var(--border); backdrop-filter: blur(8px); } .nav-brand { display: flex; align-items: center; gap: 8px; font-family: var(--font-heading); font-size: 1.1rem; font-weight: 700; color: var(--accent); letter-spacing: 0.05em; white-space: nowrap; } .nav-logo { font-size: 1.4rem; } .nav-links { display: flex; gap: 4px; flex: 1; justify-content: center; } .nav-btn { background: transparent; border: none; color: var(--text-muted); font-family: var(--font-heading); font-size: 0.9rem; font-weight: 600; letter-spacing: 0.05em; padding: 6px 14px; border-radius: var(--radius); cursor: pointer; transition: color var(--transition), background var(--transition); } .nav-btn:hover { color: var(--text); background: var(--brand-dim); } .nav-btn.active { color: var(--accent); background: var(--accent-dim); } .nav-user { display: flex; align-items: center; gap: 10px; margin-left: auto; white-space: nowrap; } .nav-username { font-family: var(--font-mono); font-size: 0.85rem; color: var(--brand); } /* ── Cards ─────────────────────────────────────────────────────────────────── */ .card { background: var(--bg-surface); border: 1px solid var(--border); border-radius: var(--radius); padding: 20px; } .card-accent { border-color: rgba(255, 231, 16, 0.3); } .card-title { font-family: var(--font-heading); font-size: 0.8rem; font-weight: 700; letter-spacing: 0.12em; color: var(--brand); margin-bottom: 16px; text-transform: uppercase; } /* ── Buttons ───────────────────────────────────────────────────────────────── */ .btn { display: inline-flex; align-items: center; justify-content: center; gap: 6px; padding: 10px 20px; border: 1px solid transparent; border-radius: var(--radius); font-family: var(--font-heading); font-size: 0.9rem; font-weight: 700; letter-spacing: 0.08em; cursor: pointer; transition: all var(--transition); text-transform: uppercase; white-space: nowrap; } .btn-accent { background: var(--accent); color: #000; border-color: var(--accent); } .btn-accent:hover { background: #fff066; box-shadow: 0 0 16px rgba(255,231,16,0.4); } .btn-muted { background: transparent; color: var(--text-muted); border-color: var(--border); } .btn-muted:hover { color: var(--text); border-color: var(--text-muted); } .btn-danger { background: var(--danger-dim); color: var(--danger); border-color: rgba(255,82,93,0.4); } .btn-danger:hover { background: rgba(255,82,93,0.25); } .btn-sm { padding: 5px 12px; font-size: 0.8rem; } .btn-lg { padding: 14px 32px; font-size: 1.1rem; } .btn-full { width: 100%; } /* ── Form elements ─────────────────────────────────────────────────────────── */ .field { margin-bottom: 14px; } label { display: block; font-size: 0.75rem; font-weight: 600; letter-spacing: 0.1em; text-transform: uppercase; color: var(--text-muted); margin-bottom: 6px; } input[type="text"], input[type="password"], select { width: 100%; background: var(--bg-surface2); border: 1px solid var(--border); border-radius: var(--radius); color: var(--text); font-family: var(--font-body); font-size: 1rem; padding: 10px 14px; outline: none; transition: border-color var(--transition); } input:focus, select:focus { border-color: var(--accent); } select option { background: var(--bg-surface2); } .error { color: var(--danger); font-size: 0.85rem; margin-bottom: 10px; } /* ── Login ─────────────────────────────────────────────────────────────────── */ .login-box { width: 100%; max-width: 400px; background: var(--bg-surface); border: 1px solid var(--border); border-radius: var(--radius); padding: 36px 32px; } .login-header { text-align: center; margin-bottom: 28px; } .login-logo { font-size: 3rem; line-height: 1; display: block; margin-bottom: 8px; filter: drop-shadow(0 0 12px rgba(255,231,16,0.6)); } .login-header h1 { font-family: var(--font-heading); font-size: 1.8rem; font-weight: 700; letter-spacing: 0.15em; color: var(--accent); text-shadow: 0 0 20px rgba(255,231,16,0.3); } .login-sub { font-size: 0.7rem; letter-spacing: 0.1em; color: var(--text-muted); margin-top: 4px; } /* ── Page headers ──────────────────────────────────────────────────────────── */ .page-header { margin-bottom: 24px; } .page-title { font-family: var(--font-heading); font-size: 1.6rem; font-weight: 700; letter-spacing: 0.12em; color: var(--accent); text-transform: uppercase; } .page-sub { font-size: 0.85rem; color: var(--text-muted); margin-top: 4px; } /* ── Dashboard grid ────────────────────────────────────────────────────────── */ .dashboard-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 16px; } .stat-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; } .stat-item { text-align: center; padding: 12px 8px; background: var(--bg-surface2); border-radius: var(--radius); } .stat-value { font-family: var(--font-mono); font-size: 1.6rem; font-weight: 700; color: var(--text); } .stat-value.accent { color: var(--accent); } .stat-label { font-size: 0.7rem; letter-spacing: 0.1em; color: var(--text-muted); text-transform: uppercase; margin-top: 4px; } /* Daily challenge */ .daily-name { font-family: var(--font-heading); font-size: 1.3rem; font-weight: 700; color: var(--accent); margin-bottom: 4px; } .daily-category { font-size: 0.8rem; color: var(--text-muted); margin-bottom: 8px; } .daily-best { font-size: 0.85rem; color: var(--text-muted); margin-bottom: 16px; } /* Online list */ .online-list { display: flex; flex-direction: column; gap: 8px; } .online-user { display: flex; align-items: center; gap: 10px; padding: 8px 10px; background: var(--bg-surface2); border-radius: var(--radius); } .online-dot { width: 8px; height: 8px; border-radius: 50%; background: var(--success); box-shadow: 0 0 6px var(--success); flex-shrink: 0; } /* Data table */ .data-table { width: 100%; border-collapse: collapse; font-size: 0.9rem; } .data-table th { text-align: left; font-size: 0.7rem; letter-spacing: 0.1em; color: var(--text-muted); padding: 6px 8px; border-bottom: 1px solid var(--border); text-transform: uppercase; } .data-table td { padding: 8px 8px; border-bottom: 1px solid rgba(65, 99, 156, 0.1); font-family: var(--font-mono); font-size: 0.85rem; } .data-table tr.row-me td { color: var(--accent); } .data-table .rank { font-size: 1rem; color: var(--accent); font-weight: 700; text-align: center; width: 40px; } .muted { color: var(--text-muted); font-size: 0.85rem; } /* ── Practice mode ─────────────────────────────────────────────────────────── */ .category-row { display: flex; flex-wrap: wrap; gap: 8px; margin-bottom: 20px; } .cat-btn { background: var(--bg-surface); border: 1px solid var(--border); color: var(--text-muted); border-radius: 20px; padding: 5px 14px; font-family: var(--font-body); font-size: 0.8rem; cursor: pointer; transition: all var(--transition); } .cat-btn.active { background: var(--brand-dim); border-color: var(--brand); color: var(--text); } .cat-btn:hover { border-color: var(--text-muted); color: var(--text); } .practice-idle { display: flex; flex-direction: column; align-items: center; gap: 20px; padding: 40px 20px; } .idle-hint { color: var(--text-muted); font-size: 0.9rem; } .practice-active { display: flex; flex-direction: column; align-items: center; gap: 20px; } .stratagem-display { width: 100%; max-width: 600px; text-align: center; } .stratagem-category { font-size: 0.75rem; letter-spacing: 0.12em; color: var(--brand); text-transform: uppercase; margin-bottom: 6px; } .stratagem-name { font-family: var(--font-heading); font-size: 2rem; font-weight: 700; color: var(--accent); letter-spacing: 0.05em; margin-bottom: 20px; text-shadow: 0 0 20px rgba(255,231,16,0.2); } .practice-hint { font-size: 0.75rem; color: var(--text-muted); margin-top: 16px; letter-spacing: 0.08em; } /* ── Arrow key indicators ──────────────────────────────────────────────────── */ .arrow-sequence { display: flex; flex-wrap: wrap; gap: 8px; justify-content: center; align-items: center; min-height: 56px; } .arrow-key { display: flex; align-items: center; justify-content: center; width: 48px; height: 48px; border: 2px solid var(--border); border-radius: 6px; font-family: var(--font-mono); font-size: 1.3rem; color: var(--text-muted); background: var(--bg-surface2); transition: all 0.12s ease; user-select: none; } .arrow-key.active { border-color: var(--accent); color: var(--accent); box-shadow: 0 0 12px rgba(255,231,16,0.35); } .arrow-key.completed { border-color: var(--success); color: var(--success); background: var(--success-dim); } .arrow-key.flash-correct { border-color: var(--success); background: var(--success-dim); color: var(--success); animation: pop 0.25s ease; } .arrow-key.flash-wrong { border-color: var(--danger); background: var(--danger-dim); color: var(--danger); animation: shake 0.35s ease; } @keyframes pop { 0% { transform: scale(1.25); } 100% { transform: scale(1); } } @keyframes shake { 0%, 100% { transform: translateX(0); } 20% { transform: translateX(-5px); } 40% { transform: translateX(5px); } 60% { transform: translateX(-4px); } 80% { transform: translateX(4px); } } /* ── Practice HUD ──────────────────────────────────────────────────────────── */ .practice-hud { display: flex; gap: 24px; align-items: center; justify-content: center; } .hud-item { text-align: center; } .hud-label { font-size: 0.65rem; letter-spacing: 0.15em; color: var(--text-muted); text-transform: uppercase; } .hud-value { font-family: var(--font-mono); font-size: 2rem; font-weight: 700; } .hud-value.accent { color: var(--accent); } .timer { font-family: var(--font-mono); font-size: 2.5rem; font-weight: 700; color: var(--text); transition: color var(--transition); min-width: 60px; text-align: center; } .timer.timer-danger { color: var(--danger); animation: pulse 0.8s infinite; } @keyframes pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.5; } } .timer.flash-wrong { animation: shake 0.4s ease; } /* Container shake when wrong input in match mode */ .flash-wrong-seq { animation: shake 0.35s ease; } /* ── D-Pad ─────────────────────────────────────────────────────────────────── */ .dpad { display: flex; flex-direction: column; align-items: center; gap: 4px; } .dpad-row { display: flex; gap: 4px; align-items: center; } .dpad-btn { width: 56px; height: 56px; background: var(--bg-surface); border: 1px solid var(--border); border-radius: var(--radius); color: var(--text); font-size: 1.4rem; cursor: pointer; transition: all var(--transition); font-family: var(--font-mono); display: flex; align-items: center; justify-content: center; } .dpad-btn:hover { background: var(--brand-dim); border-color: var(--brand); } .dpad-btn:active { background: var(--accent-dim); border-color: var(--accent); color: var(--accent); transform: scale(0.92); } .dpad-center { width: 56px; height: 56px; background: var(--bg-surface2); border-radius: var(--radius); } /* ── Lobby ─────────────────────────────────────────────────────────────────── */ .lobby-layout { display: flex; flex-direction: column; gap: 16px; max-width: 600px; } .player-list { display: flex; flex-direction: column; gap: 10px; } .lobby-player { display: flex; align-items: center; gap: 12px; padding: 12px 14px; background: var(--bg-surface2); border-radius: var(--radius); border: 1px solid var(--border); } .player-name { flex: 1; font-family: var(--font-mono); } .challenge-list { display: flex; flex-direction: column; gap: 10px; } .challenge-item { display: flex; align-items: center; gap: 10px; padding: 14px; background: var(--accent-dim); border: 1px solid rgba(255,231,16,0.3); border-radius: var(--radius); flex-wrap: wrap; } .challenge-badge { position: fixed; top: 64px; right: 16px; background: var(--accent); color: #000; font-family: var(--font-heading); font-size: 0.8rem; font-weight: 700; padding: 6px 14px; border-radius: 20px; cursor: pointer; z-index: 200; box-shadow: 0 0 12px rgba(255,231,16,0.5); animation: pulse 1.5s infinite; } /* ── Match ─────────────────────────────────────────────────────────────────── */ .match-header { position: relative; z-index: 1; text-align: center; padding: 24px 20px 16px; } .match-status-text { font-family: var(--font-heading); font-size: 1.8rem; font-weight: 700; color: var(--accent); letter-spacing: 0.1em; text-transform: uppercase; } .match-category { font-size: 0.8rem; color: var(--text-muted); letter-spacing: 0.1em; margin-top: 4px; } .match-scoreboard { position: relative; z-index: 1; display: flex; align-items: center; justify-content: center; gap: 32px; padding: 16px; max-width: 600px; margin: 0 auto 24px; } .match-player { text-align: center; } .match-player-name { font-family: var(--font-mono); font-size: 0.9rem; color: var(--text-muted); } .match-wins { font-family: var(--font-mono); font-size: 3rem; font-weight: 700; color: var(--text); } .match-player.me .match-wins { color: var(--accent); } .match-vs { font-family: var(--font-heading); font-size: 1rem; color: var(--text-muted); } .match-round-area { position: relative; z-index: 1; display: flex; flex-direction: column; align-items: center; gap: 24px; max-width: 700px; margin: 0 auto; padding: 0 20px; } .match-sequences { display: grid; grid-template-columns: 1fr 1fr; gap: 24px; width: 100%; } .match-seq-col { display: flex; flex-direction: column; align-items: center; gap: 10px; } .match-seq-label { font-size: 0.7rem; letter-spacing: 0.15em; font-weight: 700; color: var(--text-muted); text-transform: uppercase; } .match-actions { position: relative; z-index: 1; display: flex; gap: 12px; align-items: center; justify-content: center; padding: 16px; } /* ── Leaderboard ───────────────────────────────────────────────────────────── */ .leaderboard-table { max-width: 700px; } /* ── Admin ─────────────────────────────────────────────────────────────────── */ .admin-layout { display: grid; grid-template-columns: 1fr 2fr; gap: 16px; max-width: 800px; } .admin-user-list { display: flex; flex-direction: column; gap: 8px; } .admin-user-row { display: flex; align-items: center; gap: 10px; padding: 10px 12px; background: var(--bg-surface2); border-radius: var(--radius); flex-wrap: wrap; } .user-name { flex: 1; font-family: var(--font-mono); } .user-role { font-size: 0.7rem; padding: 2px 8px; border-radius: 20px; font-weight: 700; letter-spacing: 0.08em; } .badge-admin { background: var(--accent-dim); color: var(--accent); } .badge-user { background: var(--brand-dim); color: var(--brand); } .badge-warning { background: var(--danger-dim); color: var(--danger); font-size: 0.7rem; padding: 2px 8px; border-radius: 20px; } .pw-display { margin-top: 12px; padding: 10px 14px; background: var(--bg-surface2); border: 1px solid var(--accent); border-radius: var(--radius); font-family: var(--font-mono); color: var(--accent); font-size: 0.9rem; word-break: break-all; } /* ── Toast notifications ───────────────────────────────────────────────────── */ #toast-container { position: fixed; bottom: 20px; right: 20px; display: flex; flex-direction: column; gap: 8px; z-index: 500; pointer-events: none; } .toast { background: var(--bg-surface); border: 1px solid var(--border); border-radius: var(--radius); padding: 10px 16px; font-size: 0.9rem; opacity: 0; transform: translateX(20px); transition: all 0.25s ease; max-width: 320px; pointer-events: auto; } .toast.show { opacity: 1; transform: translateX(0); } /* ── Responsive ────────────────────────────────────────────────────────────── */ @media (max-width: 600px) { .nav-links { display: none; } .dashboard-grid { grid-template-columns: 1fr; } .admin-layout { grid-template-columns: 1fr; } .match-sequences { grid-template-columns: 1fr; gap: 12px; } .stratagem-name { font-size: 1.4rem; } .arrow-key { width: 40px; height: 40px; font-size: 1.1rem; } .match-scoreboard { gap: 16px; } .match-wins { font-size: 2rem; } .match-status-text { font-size: 1.3rem; } .practice-hud { gap: 16px; } .timer { font-size: 2rem; } }