Static HTML page served by DashboardServer. Renders the 2×2 room grid with progress bars and player tiles, subscribes to WS events, updates tiles live. Click-to-watch modal is wired but receives frames once the CDP screencaster ships in Task 22. Adds escapeHtml() on all user-controlled strings (roomId, player key) — not strictly needed for our trusted bot traffic but cheap XSS hardening against future scenarios that accept user input. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
48 lines
1.4 KiB
HTML
48 lines
1.4 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<title>Golf Soak Dashboard</title>
|
|
<link rel="stylesheet" href="/dashboard.css">
|
|
</head>
|
|
<body>
|
|
<header class="dash-header">
|
|
<h1>⛳ Golf Soak Dashboard</h1>
|
|
<div class="meta">
|
|
<span id="run-id">run —</span>
|
|
<span id="elapsed">00:00:00</span>
|
|
</div>
|
|
</header>
|
|
|
|
<div class="meta-bar">
|
|
<div class="stat"><span class="label">Games</span><span id="metric-games">0</span></div>
|
|
<div class="stat"><span class="label">Moves</span><span id="metric-moves">0</span></div>
|
|
<div class="stat"><span class="label">Errors</span><span id="metric-errors">0</span></div>
|
|
<div class="stat"><span class="label">WS</span><span id="ws-status">connecting</span></div>
|
|
</div>
|
|
|
|
<div class="rooms" id="rooms">
|
|
<!-- Room tiles injected by dashboard.js -->
|
|
</div>
|
|
|
|
<section class="log">
|
|
<div class="log-header">Activity Log</div>
|
|
<ul id="log-list"></ul>
|
|
</section>
|
|
|
|
<!-- Modal for focused live video (screencast arrives in Task 22/23) -->
|
|
<div id="video-modal" class="video-modal hidden">
|
|
<div class="video-modal-content">
|
|
<div class="video-modal-header">
|
|
<span id="video-modal-title">Watching —</span>
|
|
<button id="video-modal-close">Close</button>
|
|
</div>
|
|
<img id="video-frame" alt="Live screencast" />
|
|
</div>
|
|
</div>
|
|
|
|
<script src="/dashboard.js"></script>
|
|
</body>
|
|
</html>
|