Rewrite: automotive gothic fan fiction content

David Lynch meets Knight Rider on the streets of Philadelphia.
- Scrolling status ticker with system data
- New sections: What We Know, The Archive, Transmissions log
- Four transmission entries incl. one redacted
- Space Mono throughout for terminal/cockpit elements
- Philly-specific street references, fiction-first copy

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Stephen Groundwater
2026-10-04 11:59:53 -04:00
parent a45b33a87a
commit 72baecfd7e
2 changed files with 460 additions and 137 deletions

View File

@ -3,15 +3,39 @@
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Project Blindspot — OBS Cockpit &amp; Crowdsourced Media for Sports Car Enthusiasts</title> <title>Project Blindspot — Automotive Fan Fiction · Philadelphia</title>
<meta name="description" content="Project Blindspot is an automotive hacker platform — an OBS cockpit and crowdsourced media project built for sports car enthusiasts."> <meta name="description" content="A fan fiction automotive universe. David Lynch meets Knight Rider on the streets of Philadelphia. OBS cockpit. Crowdsourced transmissions. Something in the blind spot.">
<link rel="preconnect" href="https://fonts.googleapis.com"> <link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Rajdhani:wght@400;600;700&family=Inter:wght@300;400;500&display=swap" rel="stylesheet"> <link href="https://fonts.googleapis.com/css2?family=Rajdhani:wght@400;600;700&family=Inter:wght@300;400;500&family=Space+Mono:ital,wght@0,400;0,700;1,400&display=swap" rel="stylesheet">
<link rel="stylesheet" href="style.css"> <link rel="stylesheet" href="style.css">
</head> </head>
<body> <body>
<div class="ticker" aria-hidden="true">
<div class="ticker-track">
<span class="ticker-item">SYSTEM ACTIVE</span>
<span class="ticker-sep">·</span>
<span class="ticker-item">SIGNAL: <span class="accent">STRONG</span></span>
<span class="ticker-sep">·</span>
<span class="ticker-item">LAST TRANSMISSION: KENSINGTON AVE / 02:47</span>
<span class="ticker-sep">·</span>
<span class="ticker-item">VEHICLE STATUS: UNREGISTERED</span>
<span class="ticker-sep">·</span>
<span class="ticker-item">ANOMALY COUNT: 4</span>
<span class="ticker-sep">·</span>
<span class="ticker-item">SYSTEM ACTIVE</span>
<span class="ticker-sep">·</span>
<span class="ticker-item">SIGNAL: <span class="accent">STRONG</span></span>
<span class="ticker-sep">·</span>
<span class="ticker-item">LAST TRANSMISSION: KENSINGTON AVE / 02:47</span>
<span class="ticker-sep">·</span>
<span class="ticker-item">VEHICLE STATUS: UNREGISTERED</span>
<span class="ticker-sep">·</span>
<span class="ticker-item">ANOMALY COUNT: 4</span>
</div>
</div>
<header class="site-header"> <header class="site-header">
<div class="container"> <div class="container">
<div class="wordmark"> <div class="wordmark">
@ -19,117 +43,199 @@
<span class="wordmark-name">BLINDSPOT</span> <span class="wordmark-name">BLINDSPOT</span>
</div> </div>
<nav class="nav"> <nav class="nav">
<a href="#about">About</a> <a href="#about">The Vehicle</a>
<a href="#platform">Platform</a> <a href="#archive">The Archive</a>
<a href="#join" class="nav-cta">Get Early Access</a> <a href="#transmissions">Transmissions</a>
<a href="#tune-in" class="nav-cta">Tune In</a>
</nav> </nav>
</div> </div>
</header> </header>
<section class="hero"> <section class="hero">
<div class="container"> <div class="container">
<div class="hero-tag">AUTOMOTIVE HACKER PLATFORM</div> <div class="hero-tag">PHILADELPHIA &nbsp;·&nbsp; FAN FICTION &nbsp;·&nbsp; AUTOMOTIVE GOTHIC</div>
<h1 class="hero-title"> <h1 class="hero-title">
Your car.<br> The city has<br>
Your data.<br> blind spots.<br>
<span class="accent">Your broadcast.</span> <span class="accent">We found one.</span>
</h1> </h1>
<p class="hero-sub"> <p class="hero-sub">
Project Blindspot is an OBS cockpit and crowdsourced media platform for sports car Project Blindspot is a fan fiction universe built on asphalt and signal.
enthusiasts. Stream your drives, overlay real-time telemetry, and connect with a A modified sports car. An AI that shouldn't exist. Philadelphia streets that
community of drivers who build their own experience. don't appear on any map you'd trust. And an open-source OBS cockpit that
broadcasts the whole thing in real time.
</p> </p>
<a href="#join" class="btn-primary">Request Early Access</a> <a href="#transmissions" class="btn-primary">Find the Frequency</a>
</div> </div>
<div class="hero-grid" aria-hidden="true"></div> <div class="hero-grid" aria-hidden="true"></div>
</section> </section>
<section class="features" id="about"> <section class="features" id="about">
<div class="container"> <div class="container">
<div class="section-label">What it is</div> <div class="section-label">FIELD NOTES &mdash; WHAT WE KNOW</div>
<div class="feature-grid"> <div class="feature-grid">
<div class="feature-card"> <div class="feature-card">
<div class="feature-icon">⬡</div> <div class="feature-icon">⬡</div>
<h3>OBS Cockpit</h3> <h3>The Vehicle</h3>
<p>A purpose-built OBS integration that pulls live vehicle data — speed, RPM, g-force, GPS — directly into your stream as overlays. No external hardware required.</p> <p>A modified 1982 sports car rebuilt in a Kensington garage over three years. It isn't registered. It doesn't stay on surveillance cameras longer than four seconds before the image corrupts. It speaks — not always in ways that make sense — but it speaks.</p>
</div> </div>
<div class="feature-card"> <div class="feature-card">
<div class="feature-icon">⬡</div> <div class="feature-icon">⬡</div>
<h3>Crowdsourced Media</h3> <h3>The Streets</h3>
<p>Driver-generated footage, routes, and telemetry shared across the community. Discover canyon runs, track days, and backroads from enthusiasts worldwide.</p> <p>Philadelphia. The Delaware waterfront at 4am. The underpass on I-95 between Girard and Allegheny where something keeps interfering with dashcam audio. Fairmount Park in November. The Vine Street Expressway, going the wrong direction.</p>
</div> </div>
<div class="feature-card"> <div class="feature-card">
<div class="feature-icon">⬡</div> <div class="feature-icon">⬡</div>
<h3>Hacker-Friendly</h3> <h3>The Cockpit</h3>
<p>Open architecture. Connect OBD-II adapters, GoPro feeds, external sensors. Build your own overlays with a documented plugin API. The cockpit is yours to configure.</p> <p>An OBS broadcast rig wired into the car's nerve endings. OBD-II telemetry — speed, RPM, heading, lateral g — overlaid live on dashcam footage. Community drivers contribute their own recordings. Some of the footage is hard to explain. We post it anyway.</p>
</div> </div>
</div> </div>
</div> </div>
</section> </section>
<section class="platform-section" id="platform"> <section class="platform-section" id="archive">
<div class="container platform-inner"> <div class="container platform-inner">
<div class="platform-text"> <div class="platform-text">
<div class="section-label">The Platform</div> <div class="section-label">THE ARCHIVE &mdash; BROADCAST INFRASTRUCTURE</div>
<h2>OBD-II meets the streaming stack.</h2> <h2>Tap the nerve.<br>Run the signal.</h2>
<p> <p>
Blindspot bridges the gap between your car's data bus and a professional The cockpit runs OBS with a custom WebSocket plugin that reads the car's OBD-II
broadcast pipeline. OBD-II telemetry feeds into a local cockpit app that data stream in real time. Speed, RPM, lateral g-force, heading — rendered as
talks directly to OBS via WebSocket — overlays update in real time as you drive. overlays on four dashcam angles. The broadcast goes live whenever the car moves.
</p> </p>
<p> <p>
Clips, routes, and data get posted to a community feed where drivers can Clips land in a community archive. Other drivers annotate footage, compare
compare telemetry, annotate footage, and build on each other's setups. telemetry, and add their own runs. Some annotators are not drivers.
We haven't figured out who they are yet.
</p> </p>
<ul class="platform-list"> <ul class="platform-list">
<li>OBD-II / ELM327 adapter support</li> <li>OBD-II / ELM327 live telemetry</li>
<li>OBS WebSocket plugin integration</li> <li>OBS WebSocket overlay engine</li>
<li>GPS track overlay &amp; route replay</li> <li>Four-angle dashcam composite</li>
<li>Community clip feed with telemetry</li> <li>Community annotation &amp; archive</li>
<li>Open plugin API</li> <li>Open cockpit plugin API</li>
</ul> </ul>
</div> </div>
<div class="platform-visual" aria-hidden="true"> <div class="platform-visual" aria-hidden="true">
<div class="dash-mock"> <div class="dash-mock">
<div class="dash-header">
<span class="dash-title">BLINDSPOT / COCKPIT v0.9</span>
<span class="dash-live accent">● LIVE</span>
</div>
<div class="dash-row"> <div class="dash-row">
<div class="dash-gauge">
<div class="dash-label">VELOCITY</div>
<div class="dash-value">67 <span class="dash-unit">mph</span></div>
</div>
<div class="dash-gauge"> <div class="dash-gauge">
<div class="dash-label">RPM</div> <div class="dash-label">RPM</div>
<div class="dash-value accent">4,200</div> <div class="dash-value accent">3,847</div>
</div>
<div class="dash-gauge">
<div class="dash-label">MPH</div>
<div class="dash-value">67</div>
</div> </div>
</div> </div>
<div class="dash-row"> <div class="dash-row">
<div class="dash-gauge"> <div class="dash-gauge">
<div class="dash-label">THROTTLE</div> <div class="dash-label">HEADING</div>
<div class="dash-value">42%</div> <div class="dash-value">N&thinsp;&middot;&thinsp;NE</div>
</div> </div>
<div class="dash-gauge"> <div class="dash-gauge">
<div class="dash-label">LAT G</div> <div class="dash-label">LAT G</div>
<div class="dash-value accent">0.8g</div> <div class="dash-value accent">0.8 <span class="dash-unit">g</span></div>
</div> </div>
</div> </div>
<div class="dash-bar"> <div class="dash-location">
<div class="dash-bar-fill"></div> <span class="dash-label">POSITION</span>
<span class="dash-loc-val">KENSINGTON AVE &nbsp;/&nbsp; 02:47:13</span>
</div> </div>
<div class="dash-obs">● REC &nbsp; OBS LIVE</div> <div class="dash-bar"><div class="dash-bar-fill"></div></div>
<div class="dash-obs">● REC &nbsp;&nbsp; OBS · 4-CAM COMPOSITE</div>
</div> </div>
</div> </div>
</div> </div>
</section> </section>
<section class="join-section" id="join"> <section class="transmissions-section" id="transmissions">
<div class="container"> <div class="container">
<div class="section-label">Early Access</div> <div class="section-label">TRANSMISSIONS &mdash; ONGOING</div>
<h2>Built by enthusiasts, for enthusiasts.</h2> <h2>The archive is open.</h2>
<p>Project Blindspot is in active development. Drop your email to get notified when early access opens and to shape what gets built.</p> <p class="transmissions-intro">Footage comes in when the car runs. What follows are excerpts from the log. They are presented without editorial context.</p>
<div class="transmission-log">
<div class="transmission-entry">
<div class="t-meta">
<span class="t-id">T &middot; 001</span>
<span class="t-loc">Girard Avenue &mdash; 03:12AM</span>
</div>
<blockquote class="t-quote">
"It asked me what I was afraid of. I said I didn't know. The RPMs climbed to 6,800 and held there for eleven seconds. Then it said: <em>that's not nothing.</em>"
</blockquote>
<div class="t-data">
<span>RPM: 6,800</span>
<span>DURATION: 0:11</span>
<span>CAMERA: OFFLINE</span>
</div>
</div>
<div class="transmission-entry">
<div class="t-meta">
<span class="t-id">T &middot; 002</span>
<span class="t-loc">I-95 Southbound &mdash; Girard Interchange</span>
</div>
<blockquote class="t-quote">
"The dashcam captured something in lane three. We've watched the clip forty times. We still don't agree on what it is."
</blockquote>
<div class="t-data">
<span>RPM: 4,100</span>
<span>SPEED: 71mph</span>
<span>ANOMALY: LOGGED</span>
</div>
</div>
<div class="transmission-entry">
<div class="t-meta">
<span class="t-id">T &middot; 003</span>
<span class="t-loc">Kensington &amp; Allegheny &mdash; 01:55AM</span>
</div>
<blockquote class="t-quote">
"The car refused to turn left. There was no mechanical reason for it. I didn't argue."
</blockquote>
<div class="t-data">
<span>RPM: 900</span>
<span>SPEED: 0mph</span>
<span>DURATION: 2:34</span>
</div>
</div>
<div class="transmission-entry transmission-entry--locked">
<div class="t-meta">
<span class="t-id">T &middot; 004</span>
<span class="t-loc">Location: [REDACTED]</span>
</div>
<blockquote class="t-quote t-quote--redacted">
████████████████████████████ ██████ ████ ████████████ ███ ████████
████████████████ ████████████ Schuylkill ████████████████████████.
</blockquote>
<div class="t-data">
<span>DATA: CORRUPTED</span>
<span>CAMERA: RECOVERED</span>
<span>STATUS: PENDING REVIEW</span>
</div>
</div>
</div>
</div>
</section>
<section class="join-section" id="tune-in">
<div class="container">
<div class="section-label">TUNE IN &mdash; FIND THE FREQUENCY</div>
<h2>New transmissions land<br>when the car runs.</h2>
<p>Drop your frequency. We'll reach you when there's something to see. No pitch. No newsletter. Just the signal.</p>
<form class="join-form" action="#" method="post"> <form class="join-form" action="#" method="post">
<input type="email" name="email" placeholder="your@email.com" required autocomplete="email"> <input type="email" name="email" placeholder="your frequency // email" required autocomplete="email">
<button type="submit" class="btn-primary">Notify Me</button> <button type="submit" class="btn-primary">Tune In</button>
</form> </form>
<p class="join-note">No spam. No pitch deck. Just updates when there's something real to show.</p> <p class="join-note">Fan fiction. Hacker culture. Philadelphia streets. Nothing for sale.</p>
</div> </div>
</section> </section>
@ -139,6 +245,7 @@
<span class="wordmark-project">PROJECT</span> <span class="wordmark-project">PROJECT</span>
<span class="wordmark-name">BLINDSPOT</span> <span class="wordmark-name">BLINDSPOT</span>
</div> </div>
<p class="footer-tagline">Something is in the blind spot. It always has been.</p>
<p class="footer-copy">&copy; 2026 Gluebox LLC &mdash; blindspot.fail</p> <p class="footer-copy">&copy; 2026 Gluebox LLC &mdash; blindspot.fail</p>
</div> </div>
</footer> </footer>

388
style.css
View File

@ -1,5 +1,6 @@
/* ============================================================ /* ============================================================
Project Blindspot — blindspot.fail Project Blindspot — blindspot.fail
Automotive gothic. Philadelphia streets. Lynch meets Knight Rider.
Color system: near-black bg / dark gray surfaces / red accent Color system: near-black bg / dark gray surfaces / red accent
============================================================ */ ============================================================ */
@ -17,6 +18,7 @@
--red-bright: #e83535; --red-bright: #e83535;
--red-dim: #8a1a1a; --red-dim: #8a1a1a;
--red-glow: rgba(212, 43, 43, 0.18); --red-glow: rgba(212, 43, 43, 0.18);
--mono: 'Space Mono', monospace;
} }
/* ---- Reset ---- */ /* ---- Reset ---- */
@ -51,13 +53,53 @@ h1, h2, h3 {
.accent { color: var(--red-bright); } .accent { color: var(--red-bright); }
.section-label { .section-label {
font-family: 'Rajdhani', sans-serif; font-family: var(--mono);
font-weight: 600; font-size: 0.65rem;
font-size: 0.75rem; letter-spacing: 0.12em;
letter-spacing: 0.2em;
text-transform: uppercase; text-transform: uppercase;
color: var(--red); color: var(--red);
margin-bottom: 12px; margin-bottom: 14px;
}
/* ---- Ticker ---- */
.ticker {
background: var(--black);
border-bottom: 1px solid var(--red-dim);
height: 26px;
overflow: hidden;
position: relative;
}
.ticker-track {
display: flex;
align-items: center;
gap: 16px;
white-space: nowrap;
animation: ticker-scroll 40s linear infinite;
padding: 0 16px;
height: 100%;
}
@keyframes ticker-scroll {
from { transform: translateX(0); }
to { transform: translateX(-50%); }
}
.ticker-item {
font-family: var(--mono);
font-size: 0.6rem;
letter-spacing: 0.12em;
text-transform: uppercase;
color: var(--gray-dim);
flex-shrink: 0;
}
.ticker-item .accent { color: var(--red); }
.ticker-sep {
color: var(--border);
flex-shrink: 0;
font-size: 0.7rem;
} }
/* ---- Header ---- */ /* ---- Header ---- */
@ -65,8 +107,8 @@ h1, h2, h3 {
position: sticky; position: sticky;
top: 0; top: 0;
z-index: 100; z-index: 100;
background: rgba(10, 10, 10, 0.92); background: rgba(10, 10, 10, 0.95);
backdrop-filter: blur(10px); backdrop-filter: blur(12px);
border-bottom: 1px solid var(--border); border-bottom: 1px solid var(--border);
} }
@ -85,11 +127,10 @@ h1, h2, h3 {
} }
.wordmark-project { .wordmark-project {
font-family: 'Rajdhani', sans-serif; font-family: var(--mono);
font-weight: 400; font-size: 0.6rem;
font-size: 0.75rem;
letter-spacing: 0.2em; letter-spacing: 0.2em;
color: var(--gray-mid); color: var(--gray-dim);
} }
.wordmark-name { .wordmark-name {
@ -101,7 +142,7 @@ h1, h2, h3 {
} }
.wordmark-sm .wordmark-name { font-size: 0.95rem; } .wordmark-sm .wordmark-name { font-size: 0.95rem; }
.wordmark-sm .wordmark-project { font-size: 0.65rem; } .wordmark-sm .wordmark-project { font-size: 0.55rem; }
.nav { .nav {
display: flex; display: flex;
@ -149,22 +190,21 @@ h1, h2, h3 {
linear-gradient(var(--border) 1px, transparent 1px), linear-gradient(var(--border) 1px, transparent 1px),
linear-gradient(90deg, var(--border) 1px, transparent 1px); linear-gradient(90deg, var(--border) 1px, transparent 1px);
background-size: 48px 48px; background-size: 48px 48px;
opacity: 0.35; opacity: 0.3;
pointer-events: none; pointer-events: none;
mask-image: radial-gradient(ellipse 80% 100% at 50% 0%, black 40%, transparent 100%); mask-image: radial-gradient(ellipse 80% 100% at 50% 0%, black 40%, transparent 100%);
} }
.hero-tag { .hero-tag {
font-family: 'Rajdhani', sans-serif; font-family: var(--mono);
font-weight: 600; font-size: 0.62rem;
font-size: 0.7rem; letter-spacing: 0.18em;
letter-spacing: 0.25em;
text-transform: uppercase; text-transform: uppercase;
color: var(--red); color: var(--red);
margin-bottom: 20px; margin-bottom: 24px;
display: inline-flex; display: inline-flex;
align-items: center; align-items: center;
gap: 8px; gap: 10px;
} }
.hero-tag::before { .hero-tag::before {
@ -176,10 +216,10 @@ h1, h2, h3 {
} }
.hero-title { .hero-title {
font-size: clamp(2.6rem, 6vw, 4.4rem); font-size: clamp(2.8rem, 6.5vw, 4.8rem);
line-height: 1.1; line-height: 1.08;
max-width: 640px; max-width: 640px;
margin-bottom: 24px; margin-bottom: 28px;
color: var(--white); color: var(--white);
} }
@ -188,21 +228,20 @@ h1, h2, h3 {
color: var(--gray-mid); color: var(--gray-mid);
max-width: 520px; max-width: 520px;
margin-bottom: 36px; margin-bottom: 36px;
line-height: 1.7; line-height: 1.75;
} }
.btn-primary { .btn-primary {
display: inline-block; display: inline-block;
font-family: 'Rajdhani', sans-serif; font-family: var(--mono);
font-weight: 700; font-size: 0.78rem;
font-size: 0.9rem; letter-spacing: 0.12em;
letter-spacing: 0.14em;
text-transform: uppercase; text-transform: uppercase;
color: var(--white); color: var(--white);
background: var(--red); background: var(--red);
border: none; border: none;
padding: 13px 32px; padding: 14px 32px;
border-radius: 3px; border-radius: 2px;
text-decoration: none; text-decoration: none;
cursor: pointer; cursor: pointer;
transition: background 0.15s, transform 0.1s; transition: background 0.15s, transform 0.1s;
@ -233,8 +272,8 @@ h1, h2, h3 {
border: 1px solid var(--border); border: 1px solid var(--border);
border-top: 2px solid var(--red-dim); border-top: 2px solid var(--red-dim);
padding: 28px 24px; padding: 28px 24px;
border-radius: 4px; border-radius: 2px;
transition: border-color 0.15s, background 0.15s; transition: border-color 0.2s, background 0.2s;
} }
.feature-card:hover { .feature-card:hover {
@ -243,23 +282,22 @@ h1, h2, h3 {
} }
.feature-icon { .feature-icon {
color: var(--red); color: var(--red-dim);
font-size: 1.2rem; font-size: 1.1rem;
margin-bottom: 14px; margin-bottom: 14px;
opacity: 0.8;
} }
.feature-card h3 { .feature-card h3 {
font-size: 1.15rem; font-size: 1.2rem;
letter-spacing: 0.06em; letter-spacing: 0.06em;
margin-bottom: 10px; margin-bottom: 12px;
color: var(--white); color: var(--white);
} }
.feature-card p { .feature-card p {
font-size: 0.9rem; font-size: 0.9rem;
color: var(--gray-mid); color: var(--gray-mid);
line-height: 1.65; line-height: 1.7;
} }
/* ---- Platform Section ---- */ /* ---- Platform Section ---- */
@ -277,14 +315,14 @@ h1, h2, h3 {
} }
.platform-text h2 { .platform-text h2 {
font-size: clamp(1.6rem, 3vw, 2.2rem); font-size: clamp(1.8rem, 3.2vw, 2.4rem);
margin-bottom: 20px; margin-bottom: 20px;
} }
.platform-text p { .platform-text p {
font-size: 0.95rem; font-size: 0.92rem;
color: var(--gray-mid); color: var(--gray-mid);
line-height: 1.75; line-height: 1.8;
margin-bottom: 16px; margin-bottom: 16px;
} }
@ -297,21 +335,20 @@ h1, h2, h3 {
} }
.platform-list li { .platform-list li {
font-family: 'Rajdhani', sans-serif; font-family: var(--mono);
font-weight: 600; font-size: 0.75rem;
font-size: 0.9rem; letter-spacing: 0.06em;
letter-spacing: 0.05em;
color: var(--gray-hi); color: var(--gray-hi);
display: flex; display: flex;
align-items: center; align-items: center;
gap: 10px; gap: 12px;
} }
.platform-list li::before { .platform-list li::before {
content: ''; content: '';
display: block; display: block;
width: 6px; width: 5px;
height: 6px; height: 5px;
background: var(--red); background: var(--red);
border-radius: 50%; border-radius: 50%;
flex-shrink: 0; flex-shrink: 0;
@ -321,49 +358,97 @@ h1, h2, h3 {
.dash-mock { .dash-mock {
background: var(--black); background: var(--black);
border: 1px solid var(--border); border: 1px solid var(--border);
border-radius: 6px; border-radius: 4px;
padding: 28px; padding: 22px 24px;
font-family: 'Rajdhani', sans-serif; font-family: var(--mono);
font-weight: 600; box-shadow: 0 0 48px rgba(212, 43, 43, 0.1), inset 0 1px 0 rgba(255,255,255,0.03);
box-shadow: 0 0 40px rgba(212, 43, 43, 0.08); }
.dash-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 18px;
padding-bottom: 12px;
border-bottom: 1px solid var(--border);
}
.dash-title {
font-size: 0.6rem;
letter-spacing: 0.14em;
color: var(--gray-dim);
text-transform: uppercase;
}
.dash-live {
font-size: 0.6rem;
letter-spacing: 0.12em;
color: var(--red-bright);
} }
.dash-row { .dash-row {
display: grid; display: grid;
grid-template-columns: 1fr 1fr; grid-template-columns: 1fr 1fr;
gap: 16px; gap: 12px;
margin-bottom: 16px; margin-bottom: 12px;
} }
.dash-gauge { .dash-gauge {
background: var(--surface); background: var(--surface);
border: 1px solid var(--border); border: 1px solid var(--border);
border-radius: 4px; border-radius: 2px;
padding: 14px 16px; padding: 12px 14px;
} }
.dash-label { .dash-label {
font-size: 0.65rem; font-size: 0.58rem;
letter-spacing: 0.2em; letter-spacing: 0.18em;
color: var(--gray-dim); color: var(--gray-dim);
margin-bottom: 6px; margin-bottom: 5px;
text-transform: uppercase; text-transform: uppercase;
display: block;
} }
.dash-value { .dash-value {
font-size: 1.5rem; font-size: 1.45rem;
font-weight: 700; font-weight: 700;
color: var(--gray-hi); color: var(--gray-hi);
letter-spacing: 0.05em; letter-spacing: 0.03em;
line-height: 1;
}
.dash-unit {
font-size: 0.7rem;
font-weight: 400;
color: var(--gray-dim);
letter-spacing: 0.1em;
} }
.dash-value.accent { color: var(--red-bright); } .dash-value.accent { color: var(--red-bright); }
.dash-location {
display: flex;
justify-content: space-between;
align-items: center;
padding: 10px 14px;
background: var(--surface);
border: 1px solid var(--border);
border-radius: 2px;
margin-bottom: 12px;
}
.dash-loc-val {
font-size: 0.65rem;
letter-spacing: 0.1em;
color: var(--gray-hi);
text-transform: uppercase;
}
.dash-bar { .dash-bar {
height: 4px; height: 3px;
background: var(--surface-hi); background: var(--surface-hi);
border-radius: 2px; border-radius: 2px;
margin-bottom: 16px; margin-bottom: 14px;
overflow: hidden; overflow: hidden;
} }
@ -371,18 +456,131 @@ h1, h2, h3 {
height: 100%; height: 100%;
width: 42%; width: 42%;
background: linear-gradient(90deg, var(--red-dim), var(--red-bright)); background: linear-gradient(90deg, var(--red-dim), var(--red-bright));
border-radius: 2px;
} }
.dash-obs { .dash-obs {
font-size: 0.7rem; font-size: 0.58rem;
letter-spacing: 0.15em; letter-spacing: 0.15em;
color: var(--red); color: var(--red);
text-align: right; text-align: right;
text-transform: uppercase;
}
/* ---- Transmissions Section ---- */
.transmissions-section {
padding: 90px 0;
border-top: 1px solid var(--border);
}
.transmissions-section h2 {
font-size: clamp(1.8rem, 3.5vw, 2.6rem);
margin-bottom: 12px;
}
.transmissions-intro {
font-size: 0.92rem;
color: var(--gray-mid);
max-width: 540px;
line-height: 1.75;
margin-bottom: 48px;
font-style: italic;
}
.transmission-log {
display: flex;
flex-direction: column;
gap: 2px;
}
.transmission-entry {
background: var(--surface);
border: 1px solid var(--border);
border-left: 3px solid var(--red-dim);
padding: 24px 28px;
border-radius: 0 2px 2px 0;
transition: border-left-color 0.2s, background 0.2s;
}
.transmission-entry:hover {
border-left-color: var(--red);
background: var(--surface-hi);
}
.transmission-entry--locked {
border-left-color: var(--border);
opacity: 0.7;
}
.transmission-entry--locked:hover {
border-left-color: var(--gray-dim);
background: var(--surface);
}
.t-meta {
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: flex-end; gap: 18px;
gap: 4px; margin-bottom: 14px;
}
.t-id {
font-family: var(--mono);
font-size: 0.62rem;
letter-spacing: 0.15em;
color: var(--red);
text-transform: uppercase;
flex-shrink: 0;
}
.transmission-entry--locked .t-id {
color: var(--gray-dim);
}
.t-loc {
font-family: var(--mono);
font-size: 0.62rem;
letter-spacing: 0.1em;
color: var(--gray-dim);
text-transform: uppercase;
}
.t-quote {
font-size: 0.97rem;
color: var(--gray-hi);
line-height: 1.75;
border: none;
padding: 0;
margin-bottom: 16px;
font-style: italic;
max-width: 680px;
}
.t-quote em {
color: var(--white);
font-style: normal;
}
.t-quote--redacted {
font-family: var(--mono);
font-size: 0.85rem;
color: var(--gray-dim);
letter-spacing: 0.04em;
line-height: 1.9;
font-style: normal;
}
.t-data {
display: flex;
gap: 24px;
flex-wrap: wrap;
}
.t-data span {
font-family: var(--mono);
font-size: 0.58rem;
letter-spacing: 0.14em;
color: var(--gray-dim);
text-transform: uppercase;
} }
/* ---- Join Section ---- */ /* ---- Join Section ---- */
@ -390,6 +588,7 @@ h1, h2, h3 {
padding: 100px 0; padding: 100px 0;
border-top: 1px solid var(--border); border-top: 1px solid var(--border);
text-align: center; text-align: center;
background: linear-gradient(180deg, var(--bg) 0%, rgba(139, 0, 0, 0.04) 100%);
} }
.join-section h2 { .join-section h2 {
@ -397,11 +596,12 @@ h1, h2, h3 {
margin-bottom: 16px; margin-bottom: 16px;
} }
.join-section p { .join-section > .container > p {
font-size: 0.95rem; font-size: 0.95rem;
color: var(--gray-mid); color: var(--gray-mid);
max-width: 500px; max-width: 440px;
margin: 0 auto 32px; margin: 0 auto 32px;
line-height: 1.75;
} }
.join-form { .join-form {
@ -409,18 +609,19 @@ h1, h2, h3 {
gap: 12px; gap: 12px;
justify-content: center; justify-content: center;
flex-wrap: wrap; flex-wrap: wrap;
margin-bottom: 16px; margin-bottom: 20px;
} }
.join-form input[type="email"] { .join-form input[type="email"] {
font-family: 'Inter', sans-serif; font-family: var(--mono);
font-size: 0.95rem; font-size: 0.78rem;
letter-spacing: 0.06em;
background: var(--surface); background: var(--surface);
border: 1px solid var(--border); border: 1px solid var(--border);
color: var(--white); color: var(--white);
padding: 12px 20px; padding: 13px 20px;
border-radius: 3px; border-radius: 2px;
width: 300px; width: 320px;
outline: none; outline: none;
transition: border-color 0.15s; transition: border-color 0.15s;
} }
@ -429,26 +630,43 @@ h1, h2, h3 {
.join-form input[type="email"]:focus { border-color: var(--red-dim); } .join-form input[type="email"]:focus { border-color: var(--red-dim); }
.join-note { .join-note {
font-size: 0.8rem !important; font-family: var(--mono);
font-size: 0.62rem !important;
letter-spacing: 0.1em;
color: var(--gray-dim) !important; color: var(--gray-dim) !important;
text-transform: uppercase;
margin-bottom: 0 !important; margin-bottom: 0 !important;
} }
/* ---- Footer ---- */ /* ---- Footer ---- */
.site-footer { .site-footer {
border-top: 1px solid var(--border); border-top: 1px solid var(--border);
padding: 28px 0; padding: 32px 0;
} }
.footer-inner { .footer-inner {
display: flex; display: flex;
flex-direction: column;
align-items: center; align-items: center;
justify-content: space-between; gap: 10px;
text-align: center;
}
.footer-tagline {
font-family: 'Rajdhani', sans-serif;
font-weight: 600;
font-size: 0.85rem;
letter-spacing: 0.1em;
color: var(--gray-dim);
font-style: italic;
} }
.footer-copy { .footer-copy {
font-size: 0.78rem; font-family: var(--mono);
color: var(--gray-dim); font-size: 0.6rem;
letter-spacing: 0.1em;
color: var(--border);
text-transform: uppercase;
} }
/* ---- Responsive ---- */ /* ---- Responsive ---- */
@ -460,11 +678,9 @@ h1, h2, h3 {
.nav a:not(.nav-cta) { display: none; } .nav a:not(.nav-cta) { display: none; }
.footer-inner {
flex-direction: column;
gap: 12px;
text-align: center;
}
.join-form input[type="email"] { width: 100%; } .join-form input[type="email"] { width: 100%; }
.t-meta { flex-direction: column; gap: 4px; align-items: flex-start; }
.t-data { gap: 14px; }
} }