From 6b7001d408d6c0d65dcf6d7964ce453e372df534 Mon Sep 17 00:00:00 2001 From: ERROR_404 Date: Thu, 8 Oct 2026 05:59:10 +0100 Subject: [PATCH] Source Vault gate: smaller viewfinder card over the digital rain Option S5 + C3: the ACCESS REQUIRED card shrinks to 270 px (tag, one-line title, key field with a built-in arrow button) and loses its box for four viewfinder corner ticks. The site's three-layer rain runs behind it, streaming only public words (track titles, stem types) until unlock. Co-Authored-By: Claude Opus 5.5 --- CHANGELOG.md | 1 + src/vault/main.js | 26 +++++++++++ src/vault/vault.css | 110 ++++++++++++++++++++++++++++---------------- vault/index.html | 12 ++--- 4 files changed, 102 insertions(+), 47 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d1257ca..1fc5de7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and ### Changed +- Source Vault gate: the ACCESS REQUIRED card is much smaller (270 px: tag, one-line title, and the key field with a → button) and has no box, just four viewfinder corner ticks with the rain fading to dark behind it. The site's digital rain now runs behind it, streaming only public words (track titles and stem types) until the key is in. - End credits: the GitHub mark beside VIEW PROJECT → GITHUB now carries the magenta → cyan gradient, matching the GitHub mark in the footer bar. - README: new catalogue screenshot showing the Hyperpop · Metalcore · Glitchcore tags. diff --git a/src/vault/main.js b/src/vault/main.js index 32cc15e..5788159 100644 --- a/src/vault/main.js +++ b/src/vault/main.js @@ -5,6 +5,7 @@ import "../styles/index.css"; import "../styles/overrides.css"; import "./vault.css"; import { audioSrc } from "../lib/audioSrc"; +import { CHAPTERS as SITE_CHAPTERS } from "../data/chapters"; const $ = (s, el = document) => el.querySelector(s), $$ = (s, el = document) => [...el.querySelectorAll(s)]; @@ -187,6 +188,7 @@ function reveal() { if (revealed) return; revealed = true; $("#gate").classList.add("out"); + stopGateRain(); document.body.classList.remove("locked"); $("#vault").hidden = false; $("#snav").hidden = false; @@ -300,6 +302,29 @@ function vaultRain(cv, words) { }, }; } +// The gate's rain: only public words before the key is in (the site's track titles and the stem types). +const GATE_WORDS = [ + ...SITE_CHAPTERS.flatMap((c) => c.tracks.map((t) => t.title)), + ...["VOCALS", "BACKING_VOCALS", "DRUMS", "BASS", "SYNTH", "GUITAR", "KEYBOARD", "STRINGS", "BRASS", "FX"], +]; +let gateRain = null; +function startGateRain() { + if (REDUCE) return; + gateRain?.stop(); + gateRain = vaultRain($("#gateRain"), GATE_WORDS); +} +function stopGateRain() { + const r = gateRain; + gateRain = null; + if (r) setTimeout(() => r.stop(), 400); // after the gate's fade +} +startGateRain(); +let resizeT = 0; +addEventListener("resize", () => { + if (!gateRain) return; + clearTimeout(resizeT); + resizeT = setTimeout(() => gateRain && startGateRain(), 200); +}); let introDone = null; function unlockSequence() { $("#viStatus").textContent = "Access granted. Opening the vault."; @@ -314,6 +339,7 @@ function unlockSequence() { ov.hidden = false; ov.classList.remove("out"); $("#gate").classList.add("out"); + stopGateRain(); const rain = vaultRain($("canvas", ov), stems.concat(titles)); const T = []; const at = (ms, f) => T.push(setTimeout(f, ms)); diff --git a/src/vault/vault.css b/src/vault/vault.css index 6761b04..c863aca 100644 --- a/src/vault/vault.css +++ b/src/vault/vault.css @@ -142,8 +142,26 @@ a { display: grid; place-items: center; padding: 24px 16px; - background: - radial-gradient(ellipse 80% 60% at 50% 40%, rgba(161, 0, 255, 0.14), transparent 70%), var(--void); + background: var(--void); +} +/* the site's digital rain behind the card (public words only: track titles and stem types) */ +.gate-rain { + position: absolute; + inset: 0; + width: 100%; + height: 100%; + display: block; +} +.gate::before { + content: ""; + position: absolute; + inset: 0; + z-index: 1; + pointer-events: none; + background: radial-gradient(ellipse 80% 60% at 50% 40%, rgba(161, 0, 255, 0.14), transparent 70%); +} +.gate.scan::after { + z-index: 1; } .gate.out { opacity: 0; @@ -155,18 +173,20 @@ a { .gate-box { position: relative; z-index: 2; - width: min(440px, 100%); - padding: 32px 26px 26px; - background: rgba(3, 4, 9, 0.85); - border: 1px solid var(--hair); + width: min(270px, 100%); + padding: 18px 16px 10px; + background: radial-gradient(closest-side, rgba(3, 4, 9, 0.92), rgba(3, 4, 9, 0.75) 70%, transparent); } .gate-box::before, -.gate-box::after { +.gate-box::after, +.gate-box .vf::before, +.gate-box .vf::after { content: ""; position: absolute; width: 14px; height: 14px; border: 1px solid var(--mag); + pointer-events: none; } .gate-box::before { top: -1px; @@ -181,9 +201,28 @@ a { border-top: 0; border-color: var(--cyan); } +.gate-box .vf { + position: absolute; + inset: -1px; + pointer-events: none; +} +.gate-box .vf::before { + top: 0; + right: 0; + border-left: 0; + border-bottom: 0; + border-color: var(--cyan); +} +.gate-box .vf::after { + bottom: 0; + left: 0; + border-right: 0; + border-top: 0; +} .gate .tg { font-family: var(--mono); - font-size: 9px; + font-size: 8px; + white-space: nowrap; letter-spacing: 0.32em; color: var(--mag); display: flex; @@ -205,30 +244,9 @@ a { .gate h1 { font-family: var(--head); font-weight: 400; - font-size: clamp(3rem, 13vw, 4.4rem); + font-size: 1.7rem; line-height: 0.86; - margin: 16px 0 12px; -} -.term { - font-family: var(--mono); - font-size: 12px; - letter-spacing: 0.06em; - color: var(--t2); - line-height: 1.9; - margin-bottom: 18px; - min-height: 68px; -} -.term b { - color: var(--mag); - font-weight: 400; -} -.term em { - font-style: normal; - color: var(--cyan); -} -.term i { - font-style: normal; - color: var(--led); + margin: 8px 0 10px; } .field { display: flex; @@ -242,7 +260,7 @@ a { .field span { display: grid; place-items: center; - padding: 0 12px; + padding: 0 10px; font-family: var(--mono); color: var(--mag); } @@ -255,20 +273,32 @@ a { color: var(--ghost); font-family: var(--mono); font-size: 16px; - letter-spacing: 0.2em; - padding: 14px 4px; + letter-spacing: 0.14em; + padding: 10px 2px; } -.gate .holo { - width: 100%; - margin-top: 14px; - min-height: 50px; +.field .go { + display: grid; + place-items: center; + width: 46px; + flex: none; + font-family: var(--mono); + color: var(--ghost); + border-left: 1px solid var(--hair); +} +.field .go:hover, +.field .go:focus-visible { + background: rgba(255, 0, 229, 0.12); + outline: none; +} +.field .go:disabled { + color: var(--t4); } .gate .msg { font-family: var(--mono); - font-size: 10px; + font-size: 8.5px; letter-spacing: 0.22em; min-height: 16px; - margin-top: 14px; + margin-top: 8px; color: var(--t3); } .gate .msg.bad { diff --git a/vault/index.html b/vault/index.html index c187306..15434f5 100644 --- a/vault/index.html +++ b/vault/index.html @@ -28,13 +28,11 @@