Files
hidden-spectre-server/public/index.html
T

122 lines
4.6 KiB
HTML

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, viewport-fit=cover" />
<meta name="theme-color" content="#0a0e1a" />
<title>HIDDEN SPECTRE — AR Ghost Hunt</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=Bungee&family=Space+Mono:wght@400;700&display=swap" rel="stylesheet" />
<link rel="stylesheet" href="css/style.css" />
</head>
<body>
<!-- ====================== TITLE SCREEN ====================== -->
<section id="title-screen" class="screen active">
<div class="vignette"></div>
<div class="title-content">
<div class="logo">
<span class="logo-hidden">HIDDEN</span>
<span class="logo-spectre">SPECTRE</span>
</div>
<p class="tagline">An AR ghost hunt. Point your phone at the world and trap what's lurking.</p>
<div class="hud-line">// SYSTEM STATUS</div>
<div id="capability" class="capability checking">Checking device capability…</div>
<button id="start-btn" class="btn-primary" disabled>
<span class="btn-glow"></span>
SCAN A SET
</button>
<button id="free-btn" class="btn-ghost">Free hunt (no set)</button>
<button id="how-btn" class="btn-ghost">How it works</button>
</div>
<div class="scanlines"></div>
<footer class="fan-note">
Fan-made tribute. Not affiliated with, sponsored by, or endorsed by the LEGO Group.
LEGO® and Hidden Side™ are trademarks of the LEGO Group.
</footer>
</section>
<!-- ====================== HOW-TO OVERLAY ====================== -->
<div id="howto" class="modal">
<div class="modal-card">
<h2>FIELD MANUAL</h2>
<ol class="howto-list">
<li><strong>Scan the area.</strong> Slowly pan your phone across the room so the hunt grid locks onto the world around you.</li>
<li><strong>Spot the spectres.</strong> Ghosts drift in 3-D space. Turn your body to find them — they hide behind you.</li>
<li><strong>Charge the trap.</strong> Aim the reticle at a ghost and <em>hold</em> the trap button. Keep it centered while the beam locks on.</li>
<li><strong>Banish it.</strong> Fill the capture meter before the ghost escapes. Each catch feeds your tally.</li>
</ol>
<button id="howto-close" class="btn-primary">GOT IT</button>
</div>
</div>
<!-- ====================== AR / HUNT SCREEN ====================== -->
<section id="hunt-screen" class="screen">
<!-- Fallback camera feed (used when full WebXR-AR unavailable) -->
<video id="camera-feed" playsinline autoplay muted></video>
<canvas id="gl-canvas"></canvas>
<!-- Scan prompt -->
<div id="scan-prompt" class="scan-prompt">
<div class="radar"><div class="radar-sweep"></div></div>
<p>PAN SLOWLY TO MAP THE AREA</p>
</div>
<!-- HUD -->
<div id="hud" class="hud hidden">
<div class="hud-top">
<div class="hud-stat">
<span class="hud-label">TRAPPED</span>
<span id="score" class="hud-value">0</span>
</div>
<div class="hud-stat">
<span class="hud-label">NEARBY</span>
<span id="nearby" class="hud-value">0</span>
</div>
<button id="exit-btn" class="hud-exit"></button>
</div>
<!-- Reticle -->
<div id="reticle" class="reticle">
<div class="reticle-ring"></div>
<div class="reticle-dot"></div>
<svg class="capture-ring" viewBox="0 0 120 120">
<circle class="capture-track" cx="60" cy="60" r="54" />
<circle id="capture-progress" class="capture-fill" cx="60" cy="60" r="54" />
</svg>
<div id="lock-label" class="lock-label"></div>
</div>
<!-- Direction hint -->
<div id="dir-hint" class="dir-hint hidden">
<span class="dir-arrow"></span> SPECTRE THIS WAY
</div>
<!-- Trap button -->
<div class="hud-bottom">
<button id="trap-btn" class="trap-btn">
<span class="trap-icon"></span>
<span class="trap-text">HOLD TO TRAP</span>
</button>
</div>
</div>
<!-- Capture flash -->
<div id="capture-flash" class="capture-flash"></div>
<div id="toast" class="toast"></div>
</section>
<script type="importmap">
{
"imports": {
"three": "https://cdnjs.cloudflare.com/ajax/libs/three.js/0.160.0/three.module.min.js"
}
}
</script>
<script type="module" src="js/main.js"></script>
</body>
</html>