2026-03-30 13:32:55 +02:00
|
|
|
|
<!DOCTYPE html>
|
|
|
|
|
|
<html lang="de">
|
|
|
|
|
|
<head>
|
|
|
|
|
|
<meta charset="UTF-8">
|
|
|
|
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
|
|
|
|
<title>HELLDIVERS 2 – Stratagem Trainer</title>
|
|
|
|
|
|
<link rel="preconnect" href="https://fonts.googleapis.com">
|
|
|
|
|
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
|
|
|
|
|
<link href="https://fonts.googleapis.com/css2?family=Exo+2:wght@400;600;700&family=Rajdhani:wght@600;700&family=Share+Tech+Mono&display=swap" rel="stylesheet">
|
2026-04-03 11:34:59 +02:00
|
|
|
|
<link rel="stylesheet" href="styles.css?v=1.0.0">
|
2026-03-30 13:32:55 +02:00
|
|
|
|
</head>
|
|
|
|
|
|
<body>
|
|
|
|
|
|
|
|
|
|
|
|
<!-- ── Navigation ─────────────────────────────────────────────── -->
|
|
|
|
|
|
<nav id="main-nav" class="hidden">
|
2026-03-31 08:48:56 +02:00
|
|
|
|
<button id="nav-hamburger" aria-label="Open menu" aria-expanded="false">☰</button>
|
2026-03-30 13:32:55 +02:00
|
|
|
|
<div class="nav-brand">
|
|
|
|
|
|
<span class="nav-logo">⚡</span>
|
|
|
|
|
|
<span>HELLDIVERS 2</span>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div class="nav-links">
|
|
|
|
|
|
<button class="nav-btn" data-view="dashboard">Dashboard</button>
|
|
|
|
|
|
<button class="nav-btn" data-view="practice">Training</button>
|
2026-03-31 08:48:56 +02:00
|
|
|
|
<button class="nav-btn" data-view="history">History</button>
|
2026-03-30 13:32:55 +02:00
|
|
|
|
<button class="nav-btn" data-view="lobby">1v1</button>
|
|
|
|
|
|
<button class="nav-btn" data-view="leaderboard">Highscores</button>
|
|
|
|
|
|
<button class="nav-btn nav-btn-admin hidden" id="nav-admin" data-view="admin">Admin</button>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div class="nav-user">
|
|
|
|
|
|
<span class="nav-username" id="nav-username"></span>
|
2026-03-30 18:31:46 +02:00
|
|
|
|
<button class="btn btn-muted btn-sm" id="btn-logout">Logout</button>
|
2026-03-30 13:32:55 +02:00
|
|
|
|
</div>
|
|
|
|
|
|
</nav>
|
|
|
|
|
|
|
2026-03-31 08:48:56 +02:00
|
|
|
|
<!-- ── Mobile drawer ──────────────────────────────────────────── -->
|
|
|
|
|
|
<div id="nav-overlay"></div>
|
|
|
|
|
|
<nav id="nav-drawer" role="navigation" aria-label="Mobile navigation">
|
|
|
|
|
|
<div class="drawer-header">⚡ HELLDIVERS 2</div>
|
|
|
|
|
|
<button class="drawer-btn" data-view="dashboard">Dashboard</button>
|
|
|
|
|
|
<button class="drawer-btn" data-view="practice">Training</button>
|
|
|
|
|
|
<button class="drawer-btn" data-view="history">History</button>
|
|
|
|
|
|
<button class="drawer-btn" data-view="lobby">1v1 Arena</button>
|
|
|
|
|
|
<button class="drawer-btn" data-view="leaderboard">Highscores</button>
|
|
|
|
|
|
<button class="drawer-btn drawer-btn-admin hidden" id="drawer-admin" data-view="admin">Admin</button>
|
|
|
|
|
|
<div class="drawer-footer">
|
|
|
|
|
|
<button class="btn btn-muted btn-full btn-sm" id="btn-logout-drawer">Logout</button>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</nav>
|
|
|
|
|
|
|
2026-03-30 13:32:55 +02:00
|
|
|
|
<!-- Incoming challenge badge (shown anywhere) -->
|
|
|
|
|
|
<div id="challenge-badge" class="challenge-badge hidden"></div>
|
|
|
|
|
|
|
2026-03-31 08:48:56 +02:00
|
|
|
|
<!-- Score popup (practice) -->
|
|
|
|
|
|
<div id="score-popup" class="score-popup hidden"></div>
|
|
|
|
|
|
|
2026-03-30 13:32:55 +02:00
|
|
|
|
<!-- ── LOGIN ─────────────────────────────────────────────────── -->
|
|
|
|
|
|
<div id="view-login" class="view view-centered">
|
2026-04-03 11:34:59 +02:00
|
|
|
|
<div class="login-shell">
|
|
|
|
|
|
<section class="login-intel card">
|
|
|
|
|
|
<div class="eyebrow">Super Earth Command</div>
|
|
|
|
|
|
<h1 class="login-intel-title">Deploy faster. Input cleaner. Win harder.</h1>
|
|
|
|
|
|
<p class="login-intel-copy">
|
|
|
|
|
|
Train every stratagem like a live-fire drill, chase leaderboard position, and challenge active Helldivers in the arena.
|
|
|
|
|
|
</p>
|
|
|
|
|
|
<div class="login-intel-grid">
|
|
|
|
|
|
<div class="intel-stat">
|
|
|
|
|
|
<span class="intel-stat-value">4</span>
|
|
|
|
|
|
<span class="intel-stat-label">Training Modes</span>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div class="intel-stat">
|
|
|
|
|
|
<span class="intel-stat-value">1v1</span>
|
|
|
|
|
|
<span class="intel-stat-label">Arena Duels</span>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div class="intel-stat">
|
|
|
|
|
|
<span class="intel-stat-value">ELO</span>
|
|
|
|
|
|
<span class="intel-stat-label">Rank Tracking</span>
|
|
|
|
|
|
</div>
|
2026-03-30 13:32:55 +02:00
|
|
|
|
</div>
|
2026-04-03 11:34:59 +02:00
|
|
|
|
</section>
|
|
|
|
|
|
<div class="login-box">
|
|
|
|
|
|
<div class="login-header">
|
|
|
|
|
|
<span class="login-logo">⚡</span>
|
|
|
|
|
|
<h1>HELLDIVERS 2</h1>
|
|
|
|
|
|
<p class="login-sub">STRATAGEM TRAINER — SUPER EARTH AUTHORIZED</p>
|
2026-03-30 13:32:55 +02:00
|
|
|
|
</div>
|
2026-04-03 11:34:59 +02:00
|
|
|
|
<form id="login-form" class="login-form" autocomplete="off">
|
|
|
|
|
|
<div class="field">
|
|
|
|
|
|
<label for="login-username">Helldiver ID</label>
|
|
|
|
|
|
<input id="login-username" type="text" placeholder="Username" autocomplete="username" required>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div class="field">
|
|
|
|
|
|
<label for="login-password">Access Code</label>
|
|
|
|
|
|
<input id="login-password" type="password" placeholder="Password" autocomplete="current-password" required>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<p id="login-error" class="error hidden"></p>
|
|
|
|
|
|
<button type="submit" class="btn btn-accent btn-full">AUTHENTICATE</button>
|
|
|
|
|
|
</form>
|
|
|
|
|
|
</div>
|
2026-03-30 13:32:55 +02:00
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
<!-- ── CHANGE PASSWORD ───────────────────────────────────────── -->
|
|
|
|
|
|
<div id="view-change-password" class="view view-centered hidden">
|
|
|
|
|
|
<div class="login-box">
|
|
|
|
|
|
<div class="login-header">
|
2026-03-31 08:48:56 +02:00
|
|
|
|
<h2 style="font-family:var(--font-heading);font-size:1.4rem;letter-spacing:.1em;color:var(--accent)">CHANGE ACCESS CODE</h2>
|
2026-03-30 13:32:55 +02:00
|
|
|
|
<p class="login-sub">Temporary password must be changed before proceeding</p>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<form id="change-password-form" class="login-form">
|
|
|
|
|
|
<div class="field">
|
|
|
|
|
|
<label for="cp-old">Current Password</label>
|
|
|
|
|
|
<input id="cp-old" type="password" required autocomplete="current-password">
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div class="field">
|
|
|
|
|
|
<label for="cp-new">New Password (min 8 chars)</label>
|
|
|
|
|
|
<input id="cp-new" type="password" required minlength="8" autocomplete="new-password">
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div class="field">
|
|
|
|
|
|
<label for="cp-confirm">Confirm New Password</label>
|
|
|
|
|
|
<input id="cp-confirm" type="password" required autocomplete="new-password">
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<p id="cp-error" class="error hidden"></p>
|
|
|
|
|
|
<button type="submit" class="btn btn-accent btn-full">SET NEW PASSWORD</button>
|
|
|
|
|
|
</form>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
<!-- ── DASHBOARD ─────────────────────────────────────────────── -->
|
|
|
|
|
|
<div id="view-dashboard" class="view hidden">
|
|
|
|
|
|
<div class="dashboard-grid">
|
2026-04-03 11:34:59 +02:00
|
|
|
|
<div class="card dashboard-briefing">
|
|
|
|
|
|
<div class="briefing-copy">
|
|
|
|
|
|
<div class="eyebrow">Mission Briefing</div>
|
|
|
|
|
|
<h2 class="briefing-title">Your command deck for practice, duels, and rank progress.</h2>
|
|
|
|
|
|
<p class="briefing-text" id="dash-status-line">Loading tactical status...</p>
|
|
|
|
|
|
<div class="briefing-pills">
|
|
|
|
|
|
<span class="status-pill">
|
|
|
|
|
|
<span class="status-pill-label">Online</span>
|
|
|
|
|
|
<strong id="dash-online-count">0</strong>
|
|
|
|
|
|
</span>
|
|
|
|
|
|
<span class="status-pill">
|
|
|
|
|
|
<span class="status-pill-label">Daily</span>
|
|
|
|
|
|
<strong id="dash-daily-focus">Pending</strong>
|
|
|
|
|
|
</span>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div class="briefing-actions">
|
|
|
|
|
|
<button class="btn btn-accent" id="btn-briefing-practice">⚡ Quick Start</button>
|
|
|
|
|
|
<button class="btn btn-muted" id="btn-briefing-lobby">⚔ Open Arena</button>
|
|
|
|
|
|
<button class="btn btn-muted" id="btn-briefing-leaderboard">Hall of Heroes</button>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
2026-03-31 08:48:56 +02:00
|
|
|
|
|
|
|
|
|
|
<!-- Hero card -->
|
|
|
|
|
|
<div class="card card-hero dashboard-hero">
|
|
|
|
|
|
<div class="hero-identity">
|
|
|
|
|
|
<div class="hero-rank-icon" id="dash-rank-icon">⚡</div>
|
|
|
|
|
|
<div>
|
|
|
|
|
|
<div class="hero-name" id="dash-hero-name">—</div>
|
|
|
|
|
|
<div class="hero-rank-name" id="dash-rank-label">PRIVATE</div>
|
2026-03-30 13:32:55 +02:00
|
|
|
|
</div>
|
2026-03-31 08:48:56 +02:00
|
|
|
|
</div>
|
|
|
|
|
|
<div class="hero-elo">ELO <span id="dash-elo">1000</span></div>
|
|
|
|
|
|
<div class="hero-stats">
|
|
|
|
|
|
<div class="hero-stat-item">
|
|
|
|
|
|
<div class="hero-stat-val" id="dash-total-score">—</div>
|
|
|
|
|
|
<div class="hero-stat-label">Total Score</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div class="hero-stat-item">
|
|
|
|
|
|
<div class="hero-stat-val" id="dash-rank">—</div>
|
|
|
|
|
|
<div class="hero-stat-label">Global Rank</div>
|
2026-03-30 13:32:55 +02:00
|
|
|
|
</div>
|
2026-03-31 08:48:56 +02:00
|
|
|
|
<div class="hero-stat-item">
|
|
|
|
|
|
<div class="hero-stat-val" id="dash-sessions">—</div>
|
|
|
|
|
|
<div class="hero-stat-label">Sessions</div>
|
2026-03-30 13:32:55 +02:00
|
|
|
|
</div>
|
2026-03-31 08:48:56 +02:00
|
|
|
|
<div class="hero-stat-item">
|
|
|
|
|
|
<div class="hero-stat-val" id="dash-win-rate">—</div>
|
|
|
|
|
|
<div class="hero-stat-label">Win Rate</div>
|
2026-03-30 13:32:55 +02:00
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
<!-- Daily challenge card -->
|
|
|
|
|
|
<div class="card card-accent">
|
2026-03-31 08:48:56 +02:00
|
|
|
|
<h3 class="card-title">Daily Challenge</h3>
|
2026-03-30 13:32:55 +02:00
|
|
|
|
<div class="daily-stratagem">
|
2026-03-31 08:48:56 +02:00
|
|
|
|
<div class="daily-icon-wrap">
|
|
|
|
|
|
<img id="dash-daily-icon" class="stratagem-icon-md" src="" alt="" style="display:none">
|
|
|
|
|
|
</div>
|
2026-03-30 13:32:55 +02:00
|
|
|
|
<div class="daily-name" id="dash-daily-name">—</div>
|
|
|
|
|
|
<div class="daily-category" id="dash-daily-category"></div>
|
2026-03-31 08:48:56 +02:00
|
|
|
|
<div class="daily-sequence-preview" id="dash-daily-sequence"></div>
|
|
|
|
|
|
<div class="daily-best">Personal best: <span id="dash-daily-best">—</span></div>
|
|
|
|
|
|
<button class="btn btn-accent btn-sm" id="btn-daily-challenge">⚡ Practice Now</button>
|
2026-03-30 13:32:55 +02:00
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
2026-03-31 08:48:56 +02:00
|
|
|
|
<!-- Online players -->
|
2026-03-30 13:32:55 +02:00
|
|
|
|
<div class="card">
|
2026-03-31 08:48:56 +02:00
|
|
|
|
<h3 class="card-title">Online Helldivers</h3>
|
2026-03-30 13:32:55 +02:00
|
|
|
|
<div id="dash-online" class="online-list">
|
|
|
|
|
|
<span class="muted">Loading...</span>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
2026-03-31 08:48:56 +02:00
|
|
|
|
<!-- Recent sessions -->
|
2026-03-30 13:32:55 +02:00
|
|
|
|
<div class="card">
|
2026-03-31 08:48:56 +02:00
|
|
|
|
<h3 class="card-title">Recent Sessions</h3>
|
2026-04-03 11:34:59 +02:00
|
|
|
|
<div class="table-wrap">
|
|
|
|
|
|
<table class="data-table">
|
|
|
|
|
|
<thead>
|
|
|
|
|
|
<tr><th>Stratagem</th><th>Mode</th><th>Score</th><th>Time</th></tr>
|
|
|
|
|
|
</thead>
|
|
|
|
|
|
<tbody id="dash-recent">
|
|
|
|
|
|
<tr><td colspan="4" class="muted">No sessions yet</td></tr>
|
|
|
|
|
|
</tbody>
|
|
|
|
|
|
</table>
|
|
|
|
|
|
</div>
|
2026-03-30 13:32:55 +02:00
|
|
|
|
</div>
|
2026-03-31 08:48:56 +02:00
|
|
|
|
|
2026-03-30 13:32:55 +02:00
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
<!-- ── PRACTICE ───────────────────────────────────────────────── -->
|
|
|
|
|
|
<div id="view-practice" class="view hidden">
|
2026-03-31 08:48:56 +02:00
|
|
|
|
<div class="practice-header">
|
|
|
|
|
|
<div>
|
|
|
|
|
|
<h2 class="page-title">TRAINING PROTOCOL</h2>
|
|
|
|
|
|
<p class="page-sub" id="practice-mode-label">Select a mode to begin</p>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<button class="btn btn-ghost btn-icon" id="btn-practice-settings" aria-label="Practice settings" data-tooltip="Settings">⚙</button>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
<!-- Mode selector -->
|
|
|
|
|
|
<div id="practice-mode-grid" class="mode-grid">
|
|
|
|
|
|
<div class="mode-card active" data-mode="timed">
|
|
|
|
|
|
<div class="mode-icon">⏱</div>
|
|
|
|
|
|
<div class="mode-name">Timed</div>
|
|
|
|
|
|
<div class="mode-desc">30s per stratagem. Score by speed.</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div class="mode-card" data-mode="endless">
|
|
|
|
|
|
<div class="mode-icon">❤</div>
|
|
|
|
|
|
<div class="mode-name">Endless</div>
|
|
|
|
|
|
<div class="mode-desc">3 lives. No timer. How far can you go?</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div class="mode-card" data-mode="drill">
|
|
|
|
|
|
<div class="mode-icon">🎯</div>
|
|
|
|
|
|
<div class="mode-name">Category Drill</div>
|
|
|
|
|
|
<div class="mode-desc">Master one category completely.</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div class="mode-card" data-mode="speedrun">
|
|
|
|
|
|
<div class="mode-icon">⚡</div>
|
|
|
|
|
|
<div class="mode-name">Speed Run</div>
|
|
|
|
|
|
<div class="mode-desc">All stratagems, fastest total time.</div>
|
|
|
|
|
|
</div>
|
2026-03-30 13:32:55 +02:00
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
<!-- Category filters -->
|
|
|
|
|
|
<div class="category-row" id="practice-categories"></div>
|
|
|
|
|
|
|
2026-03-31 08:48:56 +02:00
|
|
|
|
<!-- Idle -->
|
|
|
|
|
|
<div id="practice-idle" class="practice-setup">
|
|
|
|
|
|
<div class="idle-hint" id="practice-idle-hint">Select categories above, then start training</div>
|
|
|
|
|
|
<div class="practice-start-row">
|
|
|
|
|
|
<button class="btn btn-accent btn-lg" id="btn-start-practice">⚡ START TRAINING</button>
|
|
|
|
|
|
</div>
|
2026-03-30 13:32:55 +02:00
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
<!-- Active training -->
|
|
|
|
|
|
<div id="practice-active" class="practice-active hidden">
|
2026-03-31 08:48:56 +02:00
|
|
|
|
|
|
|
|
|
|
<!-- Drill progress bar -->
|
|
|
|
|
|
<div id="drill-progress-wrap" class="drill-progress hidden">
|
|
|
|
|
|
<div class="drill-label">
|
|
|
|
|
|
<span>Category Progress</span>
|
|
|
|
|
|
<span id="drill-progress-text">0 / 0</span>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div class="progress-bar">
|
|
|
|
|
|
<div class="progress-fill" id="drill-progress-fill" style="width:0%"></div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
2026-04-03 11:34:59 +02:00
|
|
|
|
<div class="practice-focus-shell">
|
|
|
|
|
|
<div class="practice-focus-meta">
|
|
|
|
|
|
<span class="focus-chip">Live Drill</span>
|
|
|
|
|
|
<span class="focus-chip focus-chip-muted">Stay on target</span>
|
2026-03-31 08:48:56 +02:00
|
|
|
|
</div>
|
2026-04-03 11:34:59 +02:00
|
|
|
|
<div id="practice-feedback" class="gameplay-feedback hidden" aria-live="polite"></div>
|
|
|
|
|
|
|
|
|
|
|
|
<div class="stratagem-display card">
|
|
|
|
|
|
<!-- Stratagem icon -->
|
|
|
|
|
|
<div class="stratagem-icon-wrap">
|
|
|
|
|
|
<img id="practice-icon" class="stratagem-icon-lg" src="" alt="" style="display:none">
|
|
|
|
|
|
<div id="practice-icon-fallback" class="stratagem-icon-fallback">⚡</div>
|
2026-03-31 08:48:56 +02:00
|
|
|
|
</div>
|
2026-04-03 11:34:59 +02:00
|
|
|
|
<div class="stratagem-category" id="practice-category"></div>
|
|
|
|
|
|
<div class="stratagem-name" id="practice-name"></div>
|
|
|
|
|
|
<div class="arrow-sequence arrow-sequence-hero" id="practice-sequence"></div>
|
|
|
|
|
|
<div class="practice-hint">Arrow Keys or D-Pad · <kbd>Esc</kbd> to stop</div>
|
2026-03-31 08:48:56 +02:00
|
|
|
|
</div>
|
|
|
|
|
|
|
2026-04-03 11:34:59 +02:00
|
|
|
|
<!-- Upcoming queue -->
|
|
|
|
|
|
<div class="stratagem-queue" id="practice-queue"></div>
|
|
|
|
|
|
|
|
|
|
|
|
<div class="practice-hud">
|
|
|
|
|
|
<!-- Timer ring / lives / elapsed -->
|
|
|
|
|
|
<div class="hud-item" id="hud-timer-wrap">
|
|
|
|
|
|
<div class="hud-label" id="hud-timer-label">TIME</div>
|
|
|
|
|
|
<div class="timer-ring-wrap">
|
|
|
|
|
|
<svg class="timer-ring-svg" viewBox="0 0 80 80">
|
|
|
|
|
|
<circle class="timer-ring-bg" cx="40" cy="40" r="35"/>
|
|
|
|
|
|
<circle class="timer-ring-fill" id="timer-ring-fill" cx="40" cy="40" r="35"
|
|
|
|
|
|
stroke-dasharray="219.9" stroke-dashoffset="0"/>
|
|
|
|
|
|
</svg>
|
|
|
|
|
|
<div class="timer-ring-val" id="practice-timer">30</div>
|
|
|
|
|
|
</div>
|
2026-03-31 08:48:56 +02:00
|
|
|
|
</div>
|
|
|
|
|
|
|
2026-04-03 11:34:59 +02:00
|
|
|
|
<!-- Lives (endless mode) -->
|
|
|
|
|
|
<div class="hud-item hidden" id="hud-lives-wrap">
|
|
|
|
|
|
<div class="hud-label">LIVES</div>
|
|
|
|
|
|
<div class="lives-display" id="practice-lives">
|
|
|
|
|
|
<span class="life-icon">❤</span>
|
|
|
|
|
|
<span class="life-icon">❤</span>
|
|
|
|
|
|
<span class="life-icon">❤</span>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
2026-03-30 13:32:55 +02:00
|
|
|
|
|
2026-04-03 11:34:59 +02:00
|
|
|
|
<div class="hud-item">
|
|
|
|
|
|
<div class="hud-label">SCORE</div>
|
|
|
|
|
|
<div class="hud-value" id="practice-score">0</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div class="hud-item" id="hud-streak-item">
|
|
|
|
|
|
<div class="hud-label">STREAK</div>
|
|
|
|
|
|
<div class="hud-value accent" id="practice-streak">0</div>
|
|
|
|
|
|
<div class="combo-badge hidden" id="practice-combo">×1.0</div>
|
|
|
|
|
|
</div>
|
2026-03-30 13:32:55 +02:00
|
|
|
|
</div>
|
2026-04-03 11:34:59 +02:00
|
|
|
|
|
|
|
|
|
|
<!-- D-Pad -->
|
|
|
|
|
|
<div class="dpad" id="practice-dpad">
|
|
|
|
|
|
<div class="dpad-row">
|
|
|
|
|
|
<button class="dpad-btn" data-dir="up" aria-label="Arrow up"><span class="dir-glyph dir-up" aria-hidden="true"><svg viewBox="0 0 64 64" focusable="false"><path class="dir-line" d="M32 50 L32 18" /><path class="dir-head" d="M32 12 L20 24 H28 V50 H36 V24 H44 Z" /></svg></span></button>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div class="dpad-row">
|
|
|
|
|
|
<button class="dpad-btn" data-dir="left" aria-label="Arrow left"><span class="dir-glyph dir-left" aria-hidden="true"><svg viewBox="0 0 64 64" focusable="false"><path class="dir-line" d="M32 50 L32 18" /><path class="dir-head" d="M32 12 L20 24 H28 V50 H36 V24 H44 Z" /></svg></span></button>
|
|
|
|
|
|
<div class="dpad-center"></div>
|
|
|
|
|
|
<button class="dpad-btn" data-dir="right" aria-label="Arrow right"><span class="dir-glyph dir-right" aria-hidden="true"><svg viewBox="0 0 64 64" focusable="false"><path class="dir-line" d="M32 50 L32 18" /><path class="dir-head" d="M32 12 L20 24 H28 V50 H36 V24 H44 Z" /></svg></span></button>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div class="dpad-row">
|
|
|
|
|
|
<button class="dpad-btn" data-dir="down" aria-label="Arrow down"><span class="dir-glyph dir-down" aria-hidden="true"><svg viewBox="0 0 64 64" focusable="false"><path class="dir-line" d="M32 50 L32 18" /><path class="dir-head" d="M32 12 L20 24 H28 V50 H36 V24 H44 Z" /></svg></span></button>
|
|
|
|
|
|
</div>
|
2026-03-30 13:32:55 +02:00
|
|
|
|
</div>
|
|
|
|
|
|
|
2026-04-03 11:34:59 +02:00
|
|
|
|
<button class="btn btn-muted btn-sm" id="btn-stop-practice">■ Stop Training</button>
|
|
|
|
|
|
</div>
|
2026-03-31 08:48:56 +02:00
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
<!-- ── HISTORY ────────────────────────────────────────────────── -->
|
|
|
|
|
|
<div id="view-history" class="view hidden">
|
|
|
|
|
|
<div class="page-header">
|
|
|
|
|
|
<h2 class="page-title">MISSION LOGS</h2>
|
|
|
|
|
|
<p class="page-sub">Your practice history and stratagem statistics</p>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
<div class="card" style="margin-bottom:16px">
|
|
|
|
|
|
<h3 class="card-title">Score Progression</h3>
|
|
|
|
|
|
<div class="history-chart" id="history-chart">
|
|
|
|
|
|
<svg id="history-chart-svg" width="100%" height="100%" preserveAspectRatio="none"></svg>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
<div class="card">
|
|
|
|
|
|
<div class="history-filters">
|
|
|
|
|
|
<select id="history-filter-mode">
|
|
|
|
|
|
<option value="">All Modes</option>
|
|
|
|
|
|
<option value="timed">Timed</option>
|
|
|
|
|
|
<option value="endless">Endless</option>
|
|
|
|
|
|
<option value="drill">Category Drill</option>
|
|
|
|
|
|
<option value="speedrun">Speed Run</option>
|
|
|
|
|
|
</select>
|
|
|
|
|
|
<select id="history-filter-cat">
|
|
|
|
|
|
<option value="">All Categories</option>
|
|
|
|
|
|
</select>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<h3 class="card-title">Session History</h3>
|
|
|
|
|
|
<table class="data-table">
|
|
|
|
|
|
<thead>
|
|
|
|
|
|
<tr><th>Stratagem</th><th>Category</th><th>Mode</th><th>Score</th><th>Time</th><th>Date</th></tr>
|
|
|
|
|
|
</thead>
|
|
|
|
|
|
<tbody id="history-table-body">
|
|
|
|
|
|
<tr><td colspan="6" class="muted">Loading...</td></tr>
|
|
|
|
|
|
</tbody>
|
|
|
|
|
|
</table>
|
|
|
|
|
|
<div class="pagination" id="history-pagination"></div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
<div class="card" style="margin-top:16px">
|
|
|
|
|
|
<h3 class="card-title">Best Times per Stratagem</h3>
|
|
|
|
|
|
<table class="data-table">
|
|
|
|
|
|
<thead>
|
|
|
|
|
|
<tr><th></th><th>Stratagem</th><th>Category</th><th>Best Time</th><th>Attempts</th></tr>
|
|
|
|
|
|
</thead>
|
|
|
|
|
|
<tbody id="best-per-stratagem-body">
|
|
|
|
|
|
<tr><td colspan="5" class="muted">No data yet</td></tr>
|
|
|
|
|
|
</tbody>
|
|
|
|
|
|
</table>
|
2026-03-30 13:32:55 +02:00
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
<!-- ── LOBBY ──────────────────────────────────────────────────── -->
|
|
|
|
|
|
<div id="view-lobby" class="view hidden">
|
|
|
|
|
|
<div class="page-header">
|
|
|
|
|
|
<h2 class="page-title">1v1 ARENA</h2>
|
|
|
|
|
|
<p class="page-sub">Challenge a fellow Helldiver to a stratagem duel</p>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
<div class="lobby-layout">
|
|
|
|
|
|
<div class="card">
|
2026-03-31 08:48:56 +02:00
|
|
|
|
<h3 class="card-title">Online Helldivers</h3>
|
2026-03-30 13:32:55 +02:00
|
|
|
|
<div id="lobby-players" class="player-list">
|
2026-03-31 08:48:56 +02:00
|
|
|
|
<div class="lobby-empty">
|
|
|
|
|
|
<div class="lobby-empty-icon">📡</div>
|
|
|
|
|
|
<p>No other Helldivers online.<br>Waiting for reinforcements...</p>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div class="card">
|
|
|
|
|
|
<h3 class="card-title">Incoming Challenges</h3>
|
|
|
|
|
|
<div id="lobby-challenges" class="challenge-list">
|
|
|
|
|
|
<p class="muted">No incoming challenges</p>
|
2026-03-30 13:32:55 +02:00
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
<!-- ── MATCH ──────────────────────────────────────────────────── -->
|
|
|
|
|
|
<div id="view-match" class="view hidden">
|
|
|
|
|
|
<div class="match-header">
|
|
|
|
|
|
<div class="match-status-text" id="match-status">Waiting...</div>
|
|
|
|
|
|
<div class="match-category" id="match-category"></div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
<div class="match-scoreboard">
|
|
|
|
|
|
<div class="match-player me">
|
|
|
|
|
|
<div class="match-player-name" id="match-me-name"></div>
|
|
|
|
|
|
<div class="match-wins" id="match-me-wins">0</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div class="match-vs">VS</div>
|
|
|
|
|
|
<div class="match-player opp">
|
|
|
|
|
|
<div class="match-player-name" id="match-opp-name"></div>
|
|
|
|
|
|
<div class="match-wins" id="match-opp-wins">0</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
<!-- Round area -->
|
|
|
|
|
|
<div id="match-round-area" class="match-round-area hidden">
|
2026-03-31 08:48:56 +02:00
|
|
|
|
<!-- Stratagem icon in match -->
|
|
|
|
|
|
<div style="text-align:center;margin-bottom:8px">
|
|
|
|
|
|
<img id="match-icon" class="stratagem-icon-md" src="" alt="" style="display:none">
|
|
|
|
|
|
</div>
|
2026-04-03 11:34:59 +02:00
|
|
|
|
<div class="match-focus-shell">
|
|
|
|
|
|
<div id="match-feedback" class="gameplay-feedback hidden" aria-live="polite"></div>
|
|
|
|
|
|
<div class="match-sequences">
|
|
|
|
|
|
<div class="match-seq-col">
|
|
|
|
|
|
<div class="match-seq-label">YOU</div>
|
|
|
|
|
|
<div class="duel-progress">
|
|
|
|
|
|
<div class="duel-progress-bar"><div class="duel-progress-fill" id="match-me-progress-fill" style="width:0%"></div></div>
|
|
|
|
|
|
<div class="duel-progress-text" id="match-me-progress-text">0 / 0</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div class="arrow-sequence arrow-sequence-hero arrow-sequence-duel" id="match-me-sequence"></div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div class="match-seq-col">
|
|
|
|
|
|
<div class="match-seq-label">OPPONENT</div>
|
|
|
|
|
|
<div class="duel-progress">
|
|
|
|
|
|
<div class="duel-progress-bar"><div class="duel-progress-fill duel-progress-fill-opp" id="match-opp-progress-fill" style="width:0%"></div></div>
|
|
|
|
|
|
<div class="duel-progress-text" id="match-opp-progress-text">0 / 0</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div class="arrow-sequence arrow-sequence-hero arrow-sequence-duel" id="match-opp-sequence"></div>
|
|
|
|
|
|
</div>
|
2026-03-30 13:32:55 +02:00
|
|
|
|
</div>
|
2026-04-03 11:34:59 +02:00
|
|
|
|
<div class="dpad" id="match-dpad">
|
|
|
|
|
|
<div class="dpad-row">
|
|
|
|
|
|
<button class="dpad-btn" data-dir="up" aria-label="Arrow up"><span class="dir-glyph dir-up" aria-hidden="true"><svg viewBox="0 0 64 64" focusable="false"><path class="dir-line" d="M32 50 L32 18" /><path class="dir-head" d="M32 12 L20 24 H28 V50 H36 V24 H44 Z" /></svg></span></button>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div class="dpad-row">
|
|
|
|
|
|
<button class="dpad-btn" data-dir="left" aria-label="Arrow left"><span class="dir-glyph dir-left" aria-hidden="true"><svg viewBox="0 0 64 64" focusable="false"><path class="dir-line" d="M32 50 L32 18" /><path class="dir-head" d="M32 12 L20 24 H28 V50 H36 V24 H44 Z" /></svg></span></button>
|
|
|
|
|
|
<div class="dpad-center"></div>
|
|
|
|
|
|
<button class="dpad-btn" data-dir="right" aria-label="Arrow right"><span class="dir-glyph dir-right" aria-hidden="true"><svg viewBox="0 0 64 64" focusable="false"><path class="dir-line" d="M32 50 L32 18" /><path class="dir-head" d="M32 12 L20 24 H28 V50 H36 V24 H44 Z" /></svg></span></button>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div class="dpad-row">
|
|
|
|
|
|
<button class="dpad-btn" data-dir="down" aria-label="Arrow down"><span class="dir-glyph dir-down" aria-hidden="true"><svg viewBox="0 0 64 64" focusable="false"><path class="dir-line" d="M32 50 L32 18" /><path class="dir-head" d="M32 12 L20 24 H28 V50 H36 V24 H44 Z" /></svg></span></button>
|
|
|
|
|
|
</div>
|
2026-03-30 13:32:55 +02:00
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
<div class="match-actions">
|
2026-03-30 18:31:46 +02:00
|
|
|
|
<button class="btn btn-accent hidden" id="match-ready-btn">READY</button>
|
|
|
|
|
|
<button class="btn btn-muted btn-sm" id="btn-leave-match">Leave Match</button>
|
2026-03-30 13:32:55 +02:00
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
<!-- ── LEADERBOARD ────────────────────────────────────────────── -->
|
|
|
|
|
|
<div id="view-leaderboard" class="view hidden">
|
|
|
|
|
|
<div class="page-header">
|
|
|
|
|
|
<h2 class="page-title">HALL OF HEROES</h2>
|
|
|
|
|
|
<p class="page-sub">Top Helldivers ranked by total practice score</p>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
2026-03-31 08:48:56 +02:00
|
|
|
|
<div class="leaderboard-tabs">
|
|
|
|
|
|
<button class="tab-btn active" data-tab="practice">Practice Score</button>
|
|
|
|
|
|
<button class="tab-btn" data-tab="elo">ELO Rating</button>
|
|
|
|
|
|
<button class="tab-btn" data-tab="speedrun">Speed Run</button>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
2026-03-30 13:32:55 +02:00
|
|
|
|
<div class="card">
|
2026-04-03 11:34:59 +02:00
|
|
|
|
<div class="table-wrap">
|
|
|
|
|
|
<table class="data-table">
|
|
|
|
|
|
<thead id="leaderboard-thead">
|
|
|
|
|
|
<tr><th>#</th><th>Helldiver</th><th>Rank</th><th>Total Score</th><th>Sessions</th><th>Match W/Total</th></tr>
|
|
|
|
|
|
</thead>
|
|
|
|
|
|
<tbody id="leaderboard-table-body">
|
|
|
|
|
|
<tr><td colspan="6" class="muted">Loading...</td></tr>
|
|
|
|
|
|
</tbody>
|
|
|
|
|
|
</table>
|
|
|
|
|
|
</div>
|
2026-03-30 13:32:55 +02:00
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
<!-- ── ADMIN ──────────────────────────────────────────────────── -->
|
|
|
|
|
|
<div id="view-admin" class="view hidden">
|
|
|
|
|
|
<div class="page-header">
|
|
|
|
|
|
<h2 class="page-title">ADMIN PANEL</h2>
|
2026-04-03 11:34:59 +02:00
|
|
|
|
<p class="page-sub">User control, password operations, role management, and live system activity</p>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div class="admin-overview" id="admin-overview">
|
|
|
|
|
|
<div class="card admin-stat-card">
|
|
|
|
|
|
<div class="card-title">Helldivers</div>
|
|
|
|
|
|
<div class="admin-stat-value" id="admin-total-users">—</div>
|
|
|
|
|
|
<div class="admin-stat-meta">Registered accounts</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div class="card admin-stat-card">
|
|
|
|
|
|
<div class="card-title">Admins</div>
|
|
|
|
|
|
<div class="admin-stat-value" id="admin-total-admins">—</div>
|
|
|
|
|
|
<div class="admin-stat-meta">Users with command access</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div class="card admin-stat-card">
|
|
|
|
|
|
<div class="card-title">Temp Passwords</div>
|
|
|
|
|
|
<div class="admin-stat-value" id="admin-temp-passwords">—</div>
|
|
|
|
|
|
<div class="admin-stat-meta">Accounts requiring password change</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div class="card admin-stat-card">
|
|
|
|
|
|
<div class="card-title">Practice Sessions</div>
|
|
|
|
|
|
<div class="admin-stat-value" id="admin-practice-sessions">—</div>
|
|
|
|
|
|
<div class="admin-stat-meta">Total runs recorded</div>
|
|
|
|
|
|
</div>
|
2026-03-30 13:32:55 +02:00
|
|
|
|
</div>
|
|
|
|
|
|
<div class="admin-layout">
|
|
|
|
|
|
<div class="card">
|
2026-03-31 08:48:56 +02:00
|
|
|
|
<h3 class="card-title">Create Helldiver</h3>
|
2026-03-30 13:32:55 +02:00
|
|
|
|
<div class="field">
|
|
|
|
|
|
<label for="new-username">Username</label>
|
|
|
|
|
|
<input id="new-username" type="text" placeholder="helldiver_name" pattern="[a-zA-Z0-9_-]{2,32}">
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div class="field">
|
|
|
|
|
|
<label for="new-role">Role</label>
|
|
|
|
|
|
<select id="new-role">
|
|
|
|
|
|
<option value="user">User</option>
|
|
|
|
|
|
<option value="admin">Admin</option>
|
|
|
|
|
|
</select>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<p id="admin-error" class="error hidden"></p>
|
2026-03-30 18:31:46 +02:00
|
|
|
|
<button class="btn btn-accent" id="btn-create-user">Create User</button>
|
2026-03-30 13:32:55 +02:00
|
|
|
|
<div id="new-pw-display" class="pw-display hidden"></div>
|
2026-04-03 11:34:59 +02:00
|
|
|
|
<div class="divider"></div>
|
|
|
|
|
|
<div class="admin-spotlight">
|
|
|
|
|
|
<div class="admin-spotlight-label">Top performer</div>
|
|
|
|
|
|
<div class="admin-spotlight-value" id="admin-top-user">—</div>
|
|
|
|
|
|
<div class="admin-spotlight-meta" id="admin-top-user-meta">Loading tactical data...</div>
|
|
|
|
|
|
</div>
|
2026-03-30 13:32:55 +02:00
|
|
|
|
</div>
|
|
|
|
|
|
<div class="card">
|
2026-04-03 11:34:59 +02:00
|
|
|
|
<div class="admin-users-header">
|
|
|
|
|
|
<h3 class="card-title">User Management</h3>
|
|
|
|
|
|
<input id="admin-user-search" class="admin-search" type="text" placeholder="Search user">
|
|
|
|
|
|
</div>
|
2026-03-30 13:32:55 +02:00
|
|
|
|
<div id="admin-users" class="admin-user-list">Loading...</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
2026-04-03 11:34:59 +02:00
|
|
|
|
<div class="admin-activity-grid">
|
|
|
|
|
|
<div class="card">
|
|
|
|
|
|
<h3 class="card-title">Recent Practice Activity</h3>
|
|
|
|
|
|
<div id="admin-recent-practice" class="admin-activity-list">
|
|
|
|
|
|
<span class="muted">Loading...</span>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div class="card">
|
|
|
|
|
|
<h3 class="card-title">Recent Matches</h3>
|
|
|
|
|
|
<div id="admin-recent-matches" class="admin-activity-list">
|
|
|
|
|
|
<span class="muted">Loading...</span>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
2026-03-30 13:32:55 +02:00
|
|
|
|
</div>
|
|
|
|
|
|
|
2026-03-31 08:48:56 +02:00
|
|
|
|
<!-- ── PRACTICE SETTINGS MODAL ──────────────────────────────── -->
|
|
|
|
|
|
<div id="modal-settings" class="modal-overlay hidden" role="dialog" aria-modal="true" aria-label="Practice Settings">
|
|
|
|
|
|
<div class="modal">
|
|
|
|
|
|
<div class="modal-header">
|
|
|
|
|
|
<span class="modal-title">⚙ Practice Settings</span>
|
|
|
|
|
|
<button class="modal-close" id="btn-settings-close" aria-label="Close">✕</button>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div class="settings-section">
|
|
|
|
|
|
<span class="settings-label">Timer Duration (Timed mode)</span>
|
|
|
|
|
|
<div class="settings-options">
|
|
|
|
|
|
<button class="settings-option" data-setting="timer" data-value="15">15s</button>
|
|
|
|
|
|
<button class="settings-option active" data-setting="timer" data-value="30">30s</button>
|
|
|
|
|
|
<button class="settings-option" data-setting="timer" data-value="45">45s</button>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div class="settings-section">
|
|
|
|
|
|
<span class="settings-label">Difficulty</span>
|
|
|
|
|
|
<div class="settings-options">
|
|
|
|
|
|
<button class="settings-option" data-setting="difficulty" data-value="easy">Easy<br><small>Shows category</small></button>
|
|
|
|
|
|
<button class="settings-option active" data-setting="difficulty" data-value="normal">Normal<br><small>Name only</small></button>
|
|
|
|
|
|
<button class="settings-option" data-setting="difficulty" data-value="hard">Hard<br><small>No name shown</small></button>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
<!-- ── CHALLENGE MODAL ────────────────────────────────────────── -->
|
|
|
|
|
|
<div id="modal-challenge" class="modal-overlay hidden" role="dialog" aria-modal="true" aria-label="Incoming Challenge">
|
|
|
|
|
|
<div class="modal">
|
|
|
|
|
|
<div class="modal-header">
|
|
|
|
|
|
<span class="modal-title">⚔ Challenge Incoming!</span>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<p style="color:var(--text-dim);margin-bottom:8px">Challenger:</p>
|
|
|
|
|
|
<p style="font-family:var(--font-mono);font-size:1.2rem;color:var(--accent);margin-bottom:4px" id="modal-challenger-name">—</p>
|
|
|
|
|
|
<p style="font-size:0.8rem;color:var(--text-muted);margin-bottom:20px">ELO: <span id="modal-challenger-elo">—</span></p>
|
|
|
|
|
|
<div class="modal-actions">
|
|
|
|
|
|
<button class="btn btn-muted" id="btn-decline-challenge">Decline</button>
|
|
|
|
|
|
<button class="btn btn-accent" id="btn-accept-challenge">⚔ Accept</button>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
<!-- ── POST-MATCH RESULT MODAL ───────────────────────────────── -->
|
|
|
|
|
|
<div id="modal-match-result" class="modal-overlay hidden" role="dialog" aria-modal="true" aria-label="Match Result">
|
|
|
|
|
|
<div class="modal modal-wide">
|
|
|
|
|
|
<div class="modal-header">
|
|
|
|
|
|
<span class="modal-title">Match Result</span>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div style="text-align:center;padding:8px 0 16px">
|
|
|
|
|
|
<div class="result-winner" id="result-winner-text">—</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div class="elo-delta-row">
|
|
|
|
|
|
<span class="elo-delta-old" id="result-elo-old">—</span>
|
|
|
|
|
|
<span class="elo-delta-arrow">→</span>
|
|
|
|
|
|
<span class="elo-delta-new" id="result-elo-new">—</span>
|
|
|
|
|
|
<span class="elo-delta-val" id="result-elo-delta">—</span>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div style="height:1px;background:var(--border);margin:12px 0"></div>
|
|
|
|
|
|
<div class="round-history" id="result-round-history"></div>
|
|
|
|
|
|
<div class="modal-actions">
|
|
|
|
|
|
<button class="btn btn-muted" id="btn-result-lobby">Back to Lobby</button>
|
|
|
|
|
|
<button class="btn btn-accent" id="btn-result-rematch">⚔ Rematch</button>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
<!-- ── SESSION SUMMARY MODAL ─────────────────────────────────── -->
|
|
|
|
|
|
<div id="modal-session-summary" class="modal-overlay hidden" role="dialog" aria-modal="true" aria-label="Session Summary">
|
|
|
|
|
|
<div class="modal modal-wide">
|
|
|
|
|
|
<div class="modal-header">
|
|
|
|
|
|
<span class="modal-title">Session Complete</span>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div class="summary-grid" id="summary-grid"></div>
|
|
|
|
|
|
<div style="height:1px;background:var(--border);margin:16px 0"></div>
|
2026-04-03 11:34:59 +02:00
|
|
|
|
<h4 style="font-family:var(--font-heading);font-size:0.85rem;letter-spacing:.06em;color:var(--text-muted);margin-bottom:8px">PERFORMANCE ANALYSIS</h4>
|
|
|
|
|
|
<div id="summary-insights" class="summary-insights"></div>
|
|
|
|
|
|
<div style="height:1px;background:var(--border);margin:16px 0"></div>
|
2026-03-31 08:48:56 +02:00
|
|
|
|
<h4 style="font-family:var(--font-heading);font-size:0.85rem;letter-spacing:.06em;color:var(--text-muted);margin-bottom:8px">TOP STRATAGEMS</h4>
|
|
|
|
|
|
<div id="summary-top-stratagems"></div>
|
|
|
|
|
|
<div class="modal-actions">
|
|
|
|
|
|
<button class="btn btn-muted" id="btn-summary-dashboard">Dashboard</button>
|
|
|
|
|
|
<button class="btn btn-accent" id="btn-summary-restart">⚡ Play Again</button>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
<!-- ── Danger vignette (≤5s) ──────────────────────────────────── -->
|
|
|
|
|
|
<div id="danger-vignette" class="danger-vignette hidden"></div>
|
2026-04-03 11:34:59 +02:00
|
|
|
|
<div id="gameplay-countdown" class="gameplay-countdown hidden" aria-live="assertive"></div>
|
2026-03-31 08:48:56 +02:00
|
|
|
|
|
2026-03-30 13:32:55 +02:00
|
|
|
|
<!-- Toast notifications -->
|
|
|
|
|
|
<div id="toast-container"></div>
|
|
|
|
|
|
|
2026-04-03 11:34:59 +02:00
|
|
|
|
<script src="app.js?v=1.0.0"></script>
|
2026-03-30 13:32:55 +02:00
|
|
|
|
</body>
|
|
|
|
|
|
</html>
|