diff --git a/.gitignore b/.gitignore index ceeda0a..a2954df 100644 --- a/.gitignore +++ b/.gitignore @@ -20,6 +20,17 @@ plugin_config/obs-websocket/ *.env .env* +# ============================================================ +# Machine-local generated data +# ============================================================ + +# Generated wrapper for telemetry.json — built by telemetry.sh, not edited. +# (The JSON itself is tracked: it's the hand-edited source for the wrapper.) +landing/telemetry.js + +# Local backups created during edits — keep out of git noise. +landing/*.manual + # ============================================================ # OBS runtime / generated state — no value in version control # ============================================================ diff --git a/landing/index.html b/landing/index.html index 0a4131d..7ca3182 100644 --- a/landing/index.html +++ b/landing/index.html @@ -36,8 +36,8 @@ body { /* ───────── HUD top strip ───────── */ .hud { - display: flex; - justify-content: space-between; + display: grid; + grid-template-columns: 1fr 1fr 1fr; align-items: center; font-family: var(--mono); font-size: 22px; @@ -46,6 +46,9 @@ body { letter-spacing: 0.08em; } .hud .group { display: flex; gap: 28px; align-items: center; } +.hud > .group:nth-child(1) { justify-self: start; } +.hud > .group:nth-child(2) { justify-self: center; } +.hud > .group:nth-child(3) { justify-self: end; } .hud .dim { color: var(--hud-dim); } .hud .led { display: inline-block; @@ -99,7 +102,7 @@ body { text-align: center; } .standby .big { - font-size: 172px; + font-size: 130px; font-weight: 900; letter-spacing: 0.20em; line-height: 1; @@ -129,6 +132,68 @@ body { letter-spacing: 0.12em; } .foot .warn { color: var(--warn); } +#rig { transition: opacity 0.4s ease; } + +/* ───────── Doomguard watermark ───────── + Sits at z-index: -1 — below all flow content (HUD, standby, etc.) + and below the static canvas, so the white noise paints on top of it. + Mostly buried under noise (~4% opacity, blurred); periodic "tune-in" + spikes raise opacity + sharpen blur briefly, like a CRT catching signal. */ +.watermark { + position: absolute; + top: 50%; + left: 50%; + width: 38vw; + height: auto; + transform: translate(-50%, -50%); + pointer-events: none; + user-select: none; + z-index: -1; + opacity: 0; + filter: blur(2px) brightness(0.9); + animation: logo-tune-in 27s linear infinite; +} + +/* Logo is invisible by default. Three irregular "almost-catches-signal" + events per loop, each preceded by stutter (rapid opacity flips) and + tiny vertical jitter — like a CRT trying to sync. Max opacity ~13%, + always blurred — never crisp, always reads as buried in the noise. */ +@keyframes logo-tune-in { + /* — Long quiet — */ + 0%, 22% { opacity: 0; filter: blur(2px) brightness(0.9); transform: translate(-50%, -50%); } + + /* Event 1: stutter in, brief soft hold (~9% peak), stutter out */ + 22.3% { opacity: 0.06; filter: blur(1.4px) brightness(1.0); transform: translate(-50%, -50.3%); } + 22.6% { opacity: 0; filter: blur(2px) brightness(0.9); transform: translate(-50%, -49.8%); } + 23% { opacity: 0.09; filter: blur(0.8px) brightness(1.1); transform: translate(-50%, -50%); } + 24.6% { opacity: 0.09; filter: blur(0.8px) brightness(1.1); transform: translate(-50%, -50%); } + 25% { opacity: 0; filter: blur(2px) brightness(0.9); } + 25.3% { opacity: 0.04; } + 25.6% { opacity: 0; } + + /* — Long quiet — */ + 44% { opacity: 0; transform: translate(-50%, -50%); } + + /* Event 2: split-second flutter, signal almost catches but loses it (~5% peak) */ + 44.2% { opacity: 0.05; filter: blur(1.4px) brightness(1.0); transform: translate(-50.3%, -50%); } + 44.5% { opacity: 0; transform: translate(-50%, -50%); } + + /* — Quiet — */ + 68% { opacity: 0; transform: translate(-50%, -50%); filter: blur(2px) brightness(0.9); } + + /* Event 3: stuttered emergence to longer hold (~13% peak), stuttered exit */ + 68.3% { opacity: 0.05; filter: blur(2px) brightness(0.95); transform: translate(-49.7%, -50%); } + 68.6% { opacity: 0; } + 69% { opacity: 0.08; filter: blur(1px) brightness(1.05); transform: translate(-50%, -50.2%); } + 70.5% { opacity: 0.13; filter: blur(0.4px) brightness(1.15); transform: translate(-50%, -50%); } + 72% { opacity: 0.10; filter: blur(0.6px) brightness(1.1); } + 73% { opacity: 0; filter: blur(2px) brightness(0.9); } + 73.3% { opacity: 0.05; } + 73.6% { opacity: 0; } + + /* — Quiet to end — */ + 100% { opacity: 0; transform: translate(-50%, -50%); } +} /* ───────── Overlays ───────── */ #static { @@ -183,6 +248,11 @@ body {
+ +