Files
the-nexus/index.html
Alexander Whitestone 8b19873dce
Some checks failed
CI / validate (pull_request) Failing after 10s
CI / auto-merge (pull_request) Has been skipped
feat: time-lapse mode — replay a day of Nexus activity in 30 seconds
Press 'L' to enter/exit. Fetches up to 100 commits from the last 24 h
via the Gitea API, then replays them in 30 real seconds. As virtual time
advances:
- Heatmap zones build up and decay at accelerated speed, showing which
  agent was most active during each part of the day.
- A floating commit banner spawns near the relevant zone whenever a
  commit's virtual timestamp is reached.
- A HUD indicator shows the virtual clock (HH:MM AM/PM) and an orange
  progress bar.

Falls back to seeded stub commits when no recent activity is found.
Automatically exits at the end of the replay; Escape also exits.

Fixes #259

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-24 01:07:32 -04:00

93 lines
3.6 KiB
HTML

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Timmy's Nexus</title>
<meta name="description" content="A sovereign 3D world">
<meta property="og:title" content="Timmy's Nexus">
<meta property="og:description" content="A sovereign 3D world">
<meta property="og:image" content="https://example.com/og-image.png">
<meta property="og:type" content="website">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="Timmy's Nexus">
<meta name="twitter:description" content="A sovereign 3D world">
<meta name="twitter:image" content="https://example.com/og-image.png">
<link rel="manifest" href="/manifest.json">
<link rel="stylesheet" href="style.css">
<script type="importmap">
{
"imports": {
"three": "https://unpkg.com/three@0.183.0/build/three.module.js",
"three/addons/": "https://unpkg.com/three@0.183.0/examples/jsm/"
}
}
</script>
</head>
<body>
<!-- Top Right: Audio Toggle -->
<div id="audio-control" class="hud-controls" style="position: absolute; top: 8px; right: 8px;">
<button id="audio-toggle" class="chat-toggle-btn" aria-label="Toggle ambient sound" style="background-color: var(--color-primary); color: var(--color-bg); padding: 4px 8px; border-radius: 4px; font-size: 12px; cursor: pointer;">
🔊
</button>
<button id="debug-toggle" class="chat-toggle-btn" aria-label="Toggle debug mode" style="background-color: var(--color-secondary); color: var(--color-bg); padding: 4px 8px; border-radius: 4px; font-size: 12px; cursor: pointer;">
🔍
</button>
<button id="export-session" class="chat-toggle-btn" aria-label="Export session as markdown" title="Export session log as Markdown">
📥
</button>
<audio id="ambient-sound" src="ambient.mp3" loop></audio>
</div>
<div id="overview-indicator">
<span>MAP VIEW</span>
<span class="overview-hint">[Tab] to exit</span>
</div>
<div id="photo-indicator">
<span>PHOTO MODE</span>
<span class="photo-hint">[P] exit &nbsp;|&nbsp; [[] focus- &nbsp; []] focus+ &nbsp; focus: <span id="photo-focus">5.0</span></span>
</div>
<div id="sovereignty-msg">⚡ SOVEREIGNTY ⚡</div>
<div id="block-height-display">
<span class="block-height-label">⛏ BLOCK</span>
<span id="block-height-value"></span>
</div>
<div id="zoom-indicator">
<span>ZOOMED: <span id="zoom-label">Object</span></span>
<span class="zoom-hint">[Esc] or double-click to exit</span>
</div>
<div id="timelapse-indicator">
<div class="timelapse-header">
<span>TIME-LAPSE</span>
<span class="timelapse-hint">[L] exit &nbsp;|&nbsp; <span id="timelapse-clock">12:00 AM</span></span>
</div>
<div id="timelapse-progress-track"><div id="timelapse-progress-bar"></div></div>
</div>
<script>
if ('serviceWorker' in navigator) {
navigator.serviceWorker.register('/sw.js').catch(() => {});
}
</script>
<script type="module" src="app.js"></script>
<div id="loading" style="position: fixed; top: 0; left: 0; right: 0; height: 4px; background: #222; z-index: 1000;">
<div id="loading-bar" style="height: 100%; background: var(--color-accent); width: 0;"></div>
</div>
<div class="crt-overlay"></div>
<!-- THE OATH overlay -->
<div id="oath-overlay" aria-live="polite" aria-label="The Oath reading">
<div id="oath-inner">
<div id="oath-title">THE OATH</div>
<div id="oath-text"></div>
<div id="oath-hint">[O] or [Esc] to close</div>
</div>
</div>
</body>
</html>