Players pick 1-on-1 shootout or 3-on-3 scrimmage; 3v3 gets nets, goalies, scoring, OOB whistles to the nearest faceoff circle, and one-way board re-entry for skaters who leave the ice.
97 lines
4.1 KiB
HTML
97 lines
4.1 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no,viewport-fit=cover">
|
|
<title>tilt — spike 1</title>
|
|
<link rel="icon" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'><text y='13' font-size='13'>🏒</text></svg>">
|
|
<style>
|
|
html, body { margin:0; padding:0; height:100%; overflow:hidden; background:#0a0e14;
|
|
font-family:'SF Mono', ui-monospace, Menlo, monospace;
|
|
/* A thumb on the canvas orbits the camera — it must never scroll or zoom
|
|
the page, or fire pull-to-refresh instead. */
|
|
touch-action:none; overscroll-behavior:none; -webkit-user-select:none; user-select:none;
|
|
-webkit-tap-highlight-color:transparent; }
|
|
/* width/height are not redundant with inset:0. A canvas is a replaced
|
|
element, so `width:auto` resolves to its intrinsic (drawing buffer) size
|
|
rather than stretching between left and right — which at DPR 2 makes the
|
|
element twice the window. three.js sets these inline too; this is the
|
|
safety net if that ever regresses. */
|
|
#stage { position:absolute; inset:0; width:100%; height:100%; display:block; touch-action:none; }
|
|
#hud { position:absolute; left:14px; top:12px; color:#8fb4d4; font-size:12px;
|
|
line-height:1.5; white-space:pre; pointer-events:none; text-shadow:0 1px 2px #000; }
|
|
#boot { position:absolute; inset:0; display:flex; align-items:center; justify-content:center;
|
|
color:#6ea8dc; letter-spacing:5px; font-size:13px; background:#0a0e14; z-index:20; }
|
|
#menu {
|
|
position:absolute; inset:0; z-index:15;
|
|
display:flex; flex-direction:column; align-items:center; justify-content:center;
|
|
background:radial-gradient(ellipse at 50% 35%, #121a26 0%, #0a0e14 70%);
|
|
color:#c8dcea; pointer-events:auto;
|
|
}
|
|
#menu[hidden] { display:none; }
|
|
#menu .brand {
|
|
letter-spacing:0.55em; font-size:13px; color:#6ea8dc; margin:0 0 10px;
|
|
text-indent:0.55em;
|
|
}
|
|
#menu h1 {
|
|
margin:0 0 8px; font-size:42px; font-weight:600; letter-spacing:0.08em;
|
|
color:#e8f2fa; text-shadow:0 2px 24px rgba(80,140,200,0.35);
|
|
}
|
|
#menu .tag {
|
|
margin:0 0 36px; font-size:12px; color:#6a849c; letter-spacing:0.12em;
|
|
}
|
|
#menu .choices {
|
|
display:flex; flex-direction:column; gap:12px; width:min(360px, 86vw);
|
|
}
|
|
#menu button.choice {
|
|
appearance:none; border:1px solid #2a4058; background:#121c28;
|
|
color:#d4e6f5; font:inherit; font-size:15px; letter-spacing:0.06em;
|
|
padding:16px 20px; text-align:left; cursor:pointer;
|
|
border-radius:4px; transition:border-color .12s, background .12s, transform .08s;
|
|
}
|
|
#menu button.choice:hover, #menu button.choice:focus-visible {
|
|
outline:none; border-color:#5a9fd4; background:#172433;
|
|
}
|
|
#menu button.choice:active { transform:scale(0.99); }
|
|
#menu button.choice .label {
|
|
display:block; font-size:16px; color:#eef6fc; margin-bottom:4px;
|
|
}
|
|
#menu button.choice .hint {
|
|
display:block; font-size:11px; color:#6a849c; letter-spacing:0.04em;
|
|
}
|
|
#menu button.choice .key {
|
|
float:right; margin-top:2px; color:#5a9fd4; font-size:12px;
|
|
border:1px solid #2a5070; border-radius:3px; padding:2px 7px;
|
|
}
|
|
#menu .foot {
|
|
margin-top:28px; font-size:11px; color:#4a6074; letter-spacing:0.08em;
|
|
}
|
|
</style>
|
|
</head>
|
|
<body>
|
|
<canvas id="stage"></canvas>
|
|
<div id="hud"></div>
|
|
<div id="menu" hidden>
|
|
<div class="brand">TILT</div>
|
|
<h1>HOCKEY</h1>
|
|
<p class="tag">pick a mode</p>
|
|
<div class="choices">
|
|
<button type="button" class="choice" data-mode="1v1" id="mode-1v1">
|
|
<span class="key">1</span>
|
|
<span class="label">1-on-1</span>
|
|
<span class="hint">Shootout — one shooter, one goalie, alternating ends</span>
|
|
</button>
|
|
<button type="button" class="choice" data-mode="3v3" id="mode-3v3">
|
|
<span class="key">2</span>
|
|
<span class="label">3-on-3</span>
|
|
<span class="hint">Full ice — nets, goalies, hits, pass, shoot for a score</span>
|
|
</button>
|
|
</div>
|
|
<p class="foot">Esc returns here · pad or keyboard once you’re in</p>
|
|
</div>
|
|
<div id="boot">TILT…</div>
|
|
<script type="module" src="/src/main.js"></script>
|
|
</body>
|
|
</html>
|
|
|