Tech Noir is a hybrid visual aesthetic born from the collision of 1940s-50s film noir and near-future cyberpunk science fiction. The term itself – a portmanteau of “technology” and “noir” – was coined as the name of a nightclub in James Cameron’s The Terminator (1984), and quickly became shorthand for a genre where shadowy crime narratives unfold against backdrops of advanced, often oppressive technology. Where pure cyberpunk revels in maximalist neon overload and terminal interfaces, Tech Noir pulls back into the chiaroscuro of classic detective cinema: deep pools of shadow, shafts of light slicing through venetian blinds, rain-slicked streets reflecting a single neon sign. The technology is present but lurking – surveillance cameras in dark alleys, holographic displays in smoky back rooms, augmented reality overlays glimpsed through cracked monocles.
The visual language draws equally from Ridley Scott’s Blade Runner (1982), the rotoscoped shadows of classic noir posters, and the rain-soaked nocturnal cityscapes of 1940s Los Angeles reimagined with 2040s infrastructure. In web and UI design, Tech Noir translates to interfaces that feel like stepping into a dimly lit private investigator’s office rebuilt inside a server room – dark backgrounds punctuated not by broad neon washes but by singular, carefully placed light sources: an amber desk lamp, a cold blue terminal glow, a red neon bar sign bleeding through rain-streaked glass. Typography borrows from both worlds: Art Deco-influenced display faces with hairline strokes and geometric elegance share space with monospaced terminal readouts. The result is an aesthetic that feels simultaneously retro and futuristic, elegant and gritty, sophisticated and dangerous. Every design choice should serve the central tension: high technology wrapped in low-light atmosphere, where the future is not bright and clean but smoky, rain-soaked, and morally ambiguous.
The Tech Noir palette is built on a foundation of near-blacks and deep cool grays, punctuated by carefully rationed accent colors. Unlike full cyberpunk which uses multiple vivid neons simultaneously, Tech Noir typically restricts itself to one primary accent (cold neon blue or warm amber) with a secondary accent (blood red or muted violet) used sparingly. The effect should feel like a single neon sign reflected in a rain puddle on an otherwise dark street.
| Swatch | Hex | Role / Usage |
|---|---|---|
![]() |
#08080D |
Deepest black – page background, void areas |
![]() |
#0E0E14 |
Primary surface – card backgrounds, panels |
![]() |
#161621 |
Elevated surface – modal backgrounds, nav |
![]() |
#1E1E2C |
Tertiary surface – hover states, active panels |
![]() |
#2A2A3A |
Border gray – dividers, subtle outlines |
![]() |
#4A4A5E |
Muted steel – disabled text, secondary borders |
![]() |
#8888A0 |
Secondary text – captions, timestamps, metadata |
![]() |
#C8C8D8 |
Primary text – body copy, reading content |
![]() |
#3DA8D5 |
Cold neon blue – primary accent, links, active states |
![]() |
#D4A843 |
Amber lamplight – secondary accent, warm highlights |
![]() |
#C23B3B |
Blood red neon – danger, alerts, dramatic emphasis |
![]() |
#7B5EA7 |
Muted violet – tertiary accent, tags, decorative |
![]() |
#2E8B7A |
Terminal green – success states, data readouts |
![]() |
#1A3A4A |
Deep teal – tinted panels, atmospheric overlays |
![]() |
#E8E0D0 |
Warm white – headlines, high-emphasis text (never pure white) |
:root {
/* Backgrounds -- deep noir foundations */
--noir-bg-void: #08080d;
--noir-bg-surface: #0e0e14;
--noir-bg-elevated: #161621;
--noir-bg-active: #1e1e2c;
/* Borders and structure */
--noir-border: #2a2a3a;
--noir-border-muted: #4a4a5e;
/* Text hierarchy */
--noir-text-headline: #e8e0d0;
--noir-text-primary: #c8c8d8;
--noir-text-secondary: #8888a0;
--noir-text-muted: #4a4a5e;
/* Accent colors -- used sparingly */
--noir-blue: #3da8d5;
--noir-amber: #d4a843;
--noir-red: #c23b3b;
--noir-violet: #7b5ea7;
--noir-green: #2e8b7a;
--noir-teal: #1a3a4a;
/* Glow effects -- simulating neon light bleed */
--noir-glow-blue: 0 0 8px rgba(61, 168, 213, 0.35), 0 0 30px rgba(61, 168, 213, 0.10);
--noir-glow-amber: 0 0 8px rgba(212, 168, 67, 0.35), 0 0 30px rgba(212, 168, 67, 0.10);
--noir-glow-red: 0 0 8px rgba(194, 59, 59, 0.40), 0 0 30px rgba(194, 59, 59, 0.12);
/* Atmospheric overlays */
--noir-fog: rgba(22, 22, 33, 0.6);
--noir-rain-streak: rgba(61, 168, 213, 0.08);
--noir-shadow-deep: rgba(0, 0, 0, 0.7);
}
Tech Noir typography lives at the intersection of two distinct eras. Display and heading type draws from Art Deco and 1940s film poster design – geometric letterforms with elegant thin strokes, wide tracking, and condensed proportions that evoke sophistication and danger. Body and data text, by contrast, uses utilitarian monospaced or semi-monospaced faces that suggest terminal readouts, dossier files, and surveillance logs. The key is that neither family dominates entirely: the Art Deco display text grounds the aesthetic in noir tradition, while the monospace body text quietly insists that this is a world of machines and data.
| Font | Style | Best For |
|---|---|---|
| Cinzel | Elegant serif, Roman inscriptions | Display headlines, dramatic titles |
| Poiret One | Art Deco, thin geometric | Subheadings, elegant labels, decorative text |
| Josefin Sans | Geometric, Art Deco influenced | Headlines, navigation, UI labels |
| Cormorant Garamond | Classic serif, high contrast | Pull quotes, editorial body text |
| Special Elite | Typewriter, worn | Dossier text, case-file entries, flavor text |
| Share Tech Mono | Monospaced, technical | Data readouts, terminal text, code blocks |
| IBM Plex Mono | Clean monospace | Body text, readable technical content |
| Bebas Neue | Condensed sans, bold | Impactful headlines, poster-style display |
| Rajdhani | Condensed, semi-rounded tech | Navigation, labels, secondary headings |
| Source Code Pro | Monospace, neutral | Metadata, timestamps, secondary data |
| Heading Font | Body Font | Character |
|---|---|---|
| Cinzel (700) | IBM Plex Mono (400) | Classic noir elegance meets cold data – the detective’s desk |
| Bebas Neue (400) | Share Tech Mono (400) | Bold poster drama meets terminal readout – rain-slicked billboard |
| Josefin Sans (600) | Source Code Pro (400) | Art Deco geometry meets clean monospace – refined surveillance |
| Poiret One (400) | Cormorant Garamond (400) | Thin Deco elegance meets literary serif – upscale noir lounge |
| Rajdhani (600) | IBM Plex Mono (400) | Condensed tech meets readable mono – dashboard noir |
/* Import fonts */
@import url('https://fonts.googleapis.com/css2?family=Cinzel:wght@500;700;900&family=IBM+Plex+Mono:wght@300;400;500&family=Poiret+One&display=swap');
/* Headings -- Art Deco noir influence */
h1, h2, h3, h4, h5, h6 {
font-family: 'Cinzel', 'Josefin Sans', serif;
font-weight: 700;
color: var(--noir-text-headline);
letter-spacing: 0.06em;
line-height: 1.15;
}
/* Display / Hero text with subtle neon glow */
.noir-display {
font-family: 'Cinzel', serif;
font-size: clamp(2.5rem, 6vw, 5rem);
font-weight: 900;
letter-spacing: 0.08em;
text-transform: uppercase;
color: var(--noir-blue);
text-shadow: 0 0 10px rgba(61, 168, 213, 0.4), 0 0 40px rgba(61, 168, 213, 0.12);
}
/* Body / terminal text */
body {
font-family: 'IBM Plex Mono', 'Source Code Pro', monospace;
font-size: 0.92rem;
line-height: 1.75;
color: var(--noir-text-primary);
font-weight: 300;
}
/* Elegant labels -- Deco influence */
.noir-label {
font-family: 'Poiret One', 'Josefin Sans', sans-serif;
font-size: 0.8rem;
letter-spacing: 0.18em;
text-transform: uppercase;
color: var(--noir-text-secondary);
}
/* Data readout */
.noir-data {
font-family: 'IBM Plex Mono', monospace;
font-size: 0.82rem;
color: var(--noir-green);
line-height: 1.5;
}
/* Dossier / case-file style */
.noir-dossier {
font-family: 'Special Elite', 'Courier New', monospace;
font-size: 0.9rem;
color: var(--noir-text-secondary);
line-height: 1.8;
letter-spacing: 0.02em;
}
.noir-card {
background: var(--noir-bg-surface);
border: 1px solid var(--noir-border);
padding: 32px;
position: relative;
transition: border-color 0.4s ease, box-shadow 0.4s ease;
overflow: hidden;
}
/* Subtle top-edge light -- like lamplight hitting a document */
.noir-card::before {
content: '';
position: absolute;
top: 0;
left: 10%;
right: 10%;
height: 1px;
background: linear-gradient(
90deg,
transparent,
rgba(61, 168, 213, 0.3),
transparent
);
transition: opacity 0.4s ease;
}
.noir-card:hover {
border-color: rgba(61, 168, 213, 0.25);
box-shadow: var(--noir-glow-blue);
}
.noir-card:hover::before {
opacity: 0;
}
/* Art Deco corner accents */
.noir-card::after {
content: '';
position: absolute;
top: 8px;
left: 8px;
right: 8px;
bottom: 8px;
border: 1px solid rgba(61, 168, 213, 0.06);
pointer-events: none;
transition: border-color 0.4s ease;
}
.noir-card:hover::after {
border-color: rgba(61, 168, 213, 0.12);
}
/* Card grid */
.noir-card-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(320px, 1fr));
gap: 24px;
}
.noir-button {
display: inline-flex;
align-items: center;
justify-content: center;
background: transparent;
color: var(--noir-blue);
border: 1px solid var(--noir-blue);
padding: 14px 36px;
font-family: 'Cinzel', serif;
font-weight: 700;
font-size: 0.8rem;
letter-spacing: 0.14em;
text-transform: uppercase;
text-decoration: none;
cursor: pointer;
position: relative;
transition: all 0.35s ease;
}
/* Subtle inner glow on hover */
.noir-button:hover {
background: rgba(61, 168, 213, 0.08);
box-shadow: var(--noir-glow-blue);
color: var(--noir-text-headline);
border-color: rgba(61, 168, 213, 0.6);
}
/* Thin decorative lines extending from button edges */
.noir-button::before,
.noir-button::after {
content: '';
position: absolute;
background: var(--noir-blue);
transition: width 0.35s ease;
}
.noir-button::before {
top: -1px;
left: 20%;
width: 0;
height: 1px;
}
.noir-button::after {
bottom: -1px;
right: 20%;
width: 0;
height: 1px;
}
.noir-button:hover::before {
width: 60%;
}
.noir-button:hover::after {
width: 60%;
}
/* Amber / warm variant */
.noir-button--amber {
color: var(--noir-amber);
border-color: var(--noir-amber);
}
.noir-button--amber:hover {
background: rgba(212, 168, 67, 0.08);
box-shadow: var(--noir-glow-amber);
color: var(--noir-text-headline);
border-color: rgba(212, 168, 67, 0.6);
}
.noir-button--amber::before,
.noir-button--amber::after {
background: var(--noir-amber);
}
/* Red / danger variant */
.noir-button--red {
color: var(--noir-red);
border-color: var(--noir-red);
}
.noir-button--red:hover {
background: rgba(194, 59, 59, 0.08);
box-shadow: var(--noir-glow-red);
color: var(--noir-text-headline);
border-color: rgba(194, 59, 59, 0.6);
}
.noir-button--red::before,
.noir-button--red::after {
background: var(--noir-red);
}
.noir-nav {
display: flex;
align-items: center;
justify-content: space-between;
max-width: 1400px;
margin: 0 auto;
padding: 20px 48px;
background: rgba(8, 8, 13, 0.9);
backdrop-filter: blur(8px);
border-bottom: 1px solid rgba(61, 168, 213, 0.08);
position: relative;
}
/* Thin decorative line below nav */
.noir-nav::after {
content: '';
position: absolute;
bottom: 0;
left: 15%;
right: 15%;
height: 1px;
background: linear-gradient(
90deg,
transparent,
rgba(212, 168, 67, 0.15),
transparent
);
}
.noir-nav__logo {
font-family: 'Cinzel', serif;
font-weight: 900;
font-size: 1.1rem;
color: var(--noir-text-headline);
text-decoration: none;
text-transform: uppercase;
letter-spacing: 0.2em;
}
.noir-nav__logo span {
color: var(--noir-blue);
text-shadow: 0 0 6px rgba(61, 168, 213, 0.3);
}
.noir-nav__links {
display: flex;
gap: 32px;
list-style: none;
margin: 0;
padding: 0;
}
.noir-nav__links a {
font-family: 'IBM Plex Mono', monospace;
font-size: 0.78rem;
font-weight: 400;
color: var(--noir-text-secondary);
text-decoration: none;
text-transform: uppercase;
letter-spacing: 0.1em;
transition: color 0.3s ease, text-shadow 0.3s ease;
position: relative;
}
.noir-nav__links a::after {
content: '';
position: absolute;
bottom: -4px;
left: 0;
width: 0;
height: 1px;
background: var(--noir-blue);
transition: width 0.3s ease;
}
.noir-nav__links a:hover,
.noir-nav__links a.active {
color: var(--noir-blue);
text-shadow: 0 0 6px rgba(61, 168, 213, 0.25);
}
.noir-nav__links a:hover::after,
.noir-nav__links a.active::after {
width: 100%;
}
.noir-hero {
position: relative;
min-height: 90vh;
display: flex;
align-items: center;
justify-content: center;
text-align: center;
padding: 100px 48px;
background: var(--noir-bg-void);
overflow: hidden;
}
/* Rain streaks overlay */
.noir-hero::before {
content: '';
position: absolute;
inset: 0;
background:
repeating-linear-gradient(
90deg,
transparent,
transparent 3px,
var(--noir-rain-streak) 3px,
var(--noir-rain-streak) 4px
);
opacity: 0.4;
pointer-events: none;
z-index: 1;
animation: rain-drift 8s linear infinite;
}
@keyframes rain-drift {
0% { transform: translateY(-100%) skewY(-5deg); }
100% { transform: translateY(100%) skewY(-5deg); }
}
/* Venetian blind shadow overlay */
.noir-hero::after {
content: '';
position: absolute;
inset: 0;
background: repeating-linear-gradient(
0deg,
transparent,
transparent 18px,
rgba(0, 0, 0, 0.25) 18px,
rgba(0, 0, 0, 0.25) 22px
);
pointer-events: none;
z-index: 2;
opacity: 0.3;
}
/* Directional light -- light source from upper left */
.noir-hero .noir-hero__light {
position: absolute;
inset: 0;
background: radial-gradient(
ellipse at 20% 20%,
rgba(61, 168, 213, 0.06) 0%,
transparent 60%
);
pointer-events: none;
z-index: 1;
}
.noir-hero__content {
position: relative;
z-index: 3;
max-width: 750px;
}
.noir-hero__content h1 {
font-family: 'Cinzel', serif;
font-size: clamp(2.5rem, 6vw, 4.5rem);
font-weight: 900;
color: var(--noir-text-headline);
text-shadow: 0 0 30px rgba(61, 168, 213, 0.2);
margin-bottom: 1.5rem;
letter-spacing: 0.08em;
text-transform: uppercase;
}
.noir-hero__content h1 em {
font-style: normal;
color: var(--noir-blue);
text-shadow: 0 0 12px rgba(61, 168, 213, 0.4), 0 0 40px rgba(61, 168, 213, 0.12);
}
.noir-hero__content p {
font-size: 1rem;
color: var(--noir-text-secondary);
max-width: 580px;
margin: 0 auto 2.5rem;
line-height: 1.9;
}
@media (max-width: 768px) {
.noir-hero {
min-height: auto;
padding: 60px 24px;
}
}
.noir-blinds {
position: relative;
overflow: hidden;
}
.noir-blinds::after {
content: '';
position: absolute;
inset: 0;
background: repeating-linear-gradient(
0deg,
transparent,
transparent 14px,
rgba(0, 0, 0, 0.3) 14px,
rgba(0, 0, 0, 0.3) 18px
);
pointer-events: none;
transform: rotate(-2deg) scale(1.1);
opacity: 0.5;
}
.noir-fog {
position: relative;
}
.noir-fog::before {
content: '';
position: absolute;
inset: 0;
background:
radial-gradient(
ellipse at 30% 80%,
rgba(22, 22, 33, 0.8) 0%,
transparent 50%
),
radial-gradient(
ellipse at 70% 20%,
rgba(22, 22, 33, 0.6) 0%,
transparent 40%
);
pointer-events: none;
z-index: 1;
}
.noir-neon {
font-family: 'Poiret One', 'Josefin Sans', sans-serif;
color: var(--noir-blue);
text-shadow:
0 0 5px rgba(61, 168, 213, 0.6),
0 0 15px rgba(61, 168, 213, 0.3),
0 0 40px rgba(61, 168, 213, 0.1),
0 0 80px rgba(61, 168, 213, 0.05);
animation: neon-flicker 4s ease-in-out infinite;
}
@keyframes neon-flicker {
0%, 100% { opacity: 1; }
92% { opacity: 1; }
93% { opacity: 0.7; }
94% { opacity: 1; }
96% { opacity: 0.8; }
97% { opacity: 1; }
}
/* Amber neon variant */
.noir-neon--amber {
color: var(--noir-amber);
text-shadow:
0 0 5px rgba(212, 168, 67, 0.6),
0 0 15px rgba(212, 168, 67, 0.3),
0 0 40px rgba(212, 168, 67, 0.1),
0 0 80px rgba(212, 168, 67, 0.05);
}
/* Red neon variant */
.noir-neon--red {
color: var(--noir-red);
text-shadow:
0 0 5px rgba(194, 59, 59, 0.6),
0 0 15px rgba(194, 59, 59, 0.3),
0 0 40px rgba(194, 59, 59, 0.1),
0 0 80px rgba(194, 59, 59, 0.05);
}
.noir-dossier-panel {
background: var(--noir-bg-surface);
border: 1px solid var(--noir-border);
padding: 32px;
position: relative;
font-family: 'IBM Plex Mono', monospace;
}
/* Stamped classification header */
.noir-dossier-panel__header {
font-family: 'Cinzel', serif;
font-size: 0.7rem;
letter-spacing: 0.2em;
text-transform: uppercase;
color: var(--noir-red);
border: 1px solid var(--noir-red);
display: inline-block;
padding: 4px 12px;
margin-bottom: 20px;
transform: rotate(-1deg);
}
.noir-dossier-panel__body {
color: var(--noir-text-secondary);
font-size: 0.85rem;
line-height: 1.8;
}
/* Redacted text effect */
.noir-redacted {
background: var(--noir-text-primary);
color: var(--noir-text-primary);
padding: 0 4px;
user-select: none;
cursor: not-allowed;
}
| Aesthetic | Relationship to Tech Noir |
|---|---|
| Cyberpunk | The most direct sibling – shares the neon-on-dark palette and dystopian themes, but Cyberpunk is maximalist and neon-saturated while Tech Noir exercises noir restraint and shadow dominance |
| Film Noir | The ancestral foundation – Tech Noir inherits chiaroscuro lighting, venetian blind shadows, detective narratives, and moral ambiguity, then adds technology and futurism |
| Synthwave | Shares 1980s roots and neon aesthetics, but Synthwave is nostalgic and celebratory (sunset grids, chrome) while Tech Noir is cynical and rain-soaked |
| Dark Mode Neon | Overlaps in dark backgrounds with neon accents, but Dark Mode Neon is a UI pattern without narrative context; Tech Noir adds story, atmosphere, and cinematic composition |
| Art Deco | Tech Noir borrows Art Deco’s geometric typography, thin-rule ornamentation, and elegant proportions, recontextualizing them in a dystopian future |
| Industrial Gothic | Shares the emphasis on dark materiality, metal textures, and oppressive atmosphere, but Industrial Gothic lacks the neon technology and detective narrative |
| Steampunk | Both are “-punk” aesthetics that critique technology through retro-futurist lenses, but from different eras; Steampunk is Victorian brass, Tech Noir is 1940s shadow |
| Neo-Brutalism | Both embrace raw, unpolished materiality, but Neo-Brutalism is stark and daylit while Tech Noir is nocturnal and atmospheric |
| Glassmorphism | The frosted-glass panel technique appears in Tech Noir as rain-streaked or fogged windows, but Glassmorphism is clean and bright where Tech Noir is dark and moody |
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Tech Noir Page</title>
<link href="https://fonts.googleapis.com/css2?family=Cinzel:wght@500;700;900&family=IBM+Plex+Mono:wght@300;400;500&family=Poiret+One&display=swap" rel="stylesheet">
<style>
/* ========================================
CSS CUSTOM PROPERTIES
======================================== */
:root {
--noir-bg-void: #08080d;
--noir-bg-surface: #0e0e14;
--noir-bg-elevated: #161621;
--noir-bg-active: #1e1e2c;
--noir-border: #2a2a3a;
--noir-border-muted: #4a4a5e;
--noir-text-headline: #e8e0d0;
--noir-text-primary: #c8c8d8;
--noir-text-secondary: #8888a0;
--noir-text-muted: #4a4a5e;
--noir-blue: #3da8d5;
--noir-amber: #d4a843;
--noir-red: #c23b3b;
--noir-violet: #7b5ea7;
--noir-green: #2e8b7a;
--noir-teal: #1a3a4a;
--noir-glow-blue: 0 0 8px rgba(61, 168, 213, 0.35), 0 0 30px rgba(61, 168, 213, 0.10);
--noir-glow-amber: 0 0 8px rgba(212, 168, 67, 0.35), 0 0 30px rgba(212, 168, 67, 0.10);
--noir-glow-red: 0 0 8px rgba(194, 59, 59, 0.40), 0 0 30px rgba(194, 59, 59, 0.12);
}
/* ========================================
RESET & BASE
======================================== */
*, *::before, *::after {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
background: var(--noir-bg-void);
color: var(--noir-text-primary);
font-family: 'IBM Plex Mono', 'Source Code Pro', monospace;
font-size: 0.92rem;
font-weight: 300;
line-height: 1.75;
-webkit-font-smoothing: antialiased;
}
h1, h2, h3, h4, h5, h6 {
font-family: 'Cinzel', serif;
font-weight: 700;
color: var(--noir-text-headline);
letter-spacing: 0.06em;
line-height: 1.15;
}
a {
color: var(--noir-blue);
text-decoration: none;
transition: color 0.3s ease, text-shadow 0.3s ease;
}
a:hover {
text-shadow: 0 0 6px rgba(61, 168, 213, 0.25);
}
img {
max-width: 100%;
height: auto;
display: block;
}
/* ========================================
NAVIGATION
======================================== */
.noir-nav-wrapper {
position: sticky;
top: 0;
z-index: 100;
background: rgba(8, 8, 13, 0.92);
backdrop-filter: blur(8px);
border-bottom: 1px solid rgba(61, 168, 213, 0.06);
}
nav {
display: flex;
align-items: center;
justify-content: space-between;
max-width: 1200px;
margin: 0 auto;
padding: 20px 48px;
}
nav .logo {
font-family: 'Cinzel', serif;
font-weight: 900;
font-size: 1.05rem;
color: var(--noir-text-headline);
text-decoration: none;
text-transform: uppercase;
letter-spacing: 0.2em;
}
nav .logo span {
color: var(--noir-blue);
text-shadow: 0 0 6px rgba(61, 168, 213, 0.3);
}
nav ul {
display: flex;
gap: 32px;
list-style: none;
}
nav ul a {
font-family: 'IBM Plex Mono', monospace;
font-size: 0.75rem;
font-weight: 400;
color: var(--noir-text-secondary);
text-transform: uppercase;
letter-spacing: 0.1em;
position: relative;
}
nav ul a::after {
content: '';
position: absolute;
bottom: -4px;
left: 0;
width: 0;
height: 1px;
background: var(--noir-blue);
transition: width 0.3s ease;
}
nav ul a:hover {
color: var(--noir-blue);
}
nav ul a:hover::after {
width: 100%;
}
/* ========================================
HERO
======================================== */
.hero {
position: relative;
min-height: 88vh;
display: flex;
align-items: center;
justify-content: center;
text-align: center;
padding: 100px 48px;
overflow: hidden;
}
/* Directional light source -- upper left */
.hero .hero-light {
position: absolute;
inset: 0;
background: radial-gradient(
ellipse at 15% 15%,
rgba(61, 168, 213, 0.05) 0%,
transparent 55%
);
pointer-events: none;
z-index: 1;
}
/* Rain streaks */
.hero::before {
content: '';
position: absolute;
top: -100%;
left: 0;
right: 0;
bottom: -100%;
background: repeating-linear-gradient(
95deg,
transparent,
transparent 3px,
rgba(61, 168, 213, 0.04) 3px,
rgba(61, 168, 213, 0.04) 4px
);
pointer-events: none;
z-index: 1;
animation: rain-fall 6s linear infinite;
}
@keyframes rain-fall {
0% { transform: translateY(0); }
100% { transform: translateY(50%); }
}
/* Venetian blind shadow */
.hero::after {
content: '';
position: absolute;
inset: 0;
background: repeating-linear-gradient(
0deg,
transparent,
transparent 20px,
rgba(0, 0, 0, 0.2) 20px,
rgba(0, 0, 0, 0.2) 24px
);
pointer-events: none;
z-index: 2;
opacity: 0.25;
}
.hero-content {
position: relative;
z-index: 3;
max-width: 700px;
}
.hero h1 {
font-size: clamp(2.2rem, 5.5vw, 4.2rem);
text-transform: uppercase;
margin-bottom: 1.5rem;
text-shadow: 0 0 30px rgba(61, 168, 213, 0.15);
}
.hero h1 em {
font-style: normal;
color: var(--noir-blue);
text-shadow: 0 0 10px rgba(61, 168, 213, 0.4), 0 0 40px rgba(61, 168, 213, 0.12);
}
.hero .tagline {
font-family: 'Poiret One', sans-serif;
font-size: 1rem;
letter-spacing: 0.2em;
text-transform: uppercase;
color: var(--noir-text-secondary);
margin-bottom: 0.75rem;
}
.hero p {
color: var(--noir-text-secondary);
font-size: 0.9rem;
max-width: 550px;
margin: 0 auto 2.5rem;
line-height: 1.9;
}
/* Thin decorative line */
.hero .separator {
width: 60px;
height: 1px;
background: linear-gradient(90deg, transparent, var(--noir-blue), transparent);
margin: 0 auto 2rem;
}
/* Button */
.btn {
display: inline-block;
background: transparent;
color: var(--noir-blue);
border: 1px solid var(--noir-blue);
padding: 14px 40px;
font-family: 'Cinzel', serif;
font-weight: 700;
font-size: 0.78rem;
letter-spacing: 0.14em;
text-transform: uppercase;
text-decoration: none;
cursor: pointer;
position: relative;
transition: all 0.35s ease;
}
.btn:hover {
background: rgba(61, 168, 213, 0.08);
box-shadow: var(--noir-glow-blue);
color: var(--noir-text-headline);
border-color: rgba(61, 168, 213, 0.6);
text-shadow: none;
}
.btn--amber {
color: var(--noir-amber);
border-color: var(--noir-amber);
}
.btn--amber:hover {
background: rgba(212, 168, 67, 0.08);
box-shadow: var(--noir-glow-amber);
color: var(--noir-text-headline);
border-color: rgba(212, 168, 67, 0.6);
}
/* ========================================
CASES / FEATURES SECTION
======================================== */
.cases {
padding: 100px 0;
border-top: 1px solid rgba(61, 168, 213, 0.06);
}
.cases .section-header {
text-align: center;
margin-bottom: 60px;
}
.cases .section-header .label {
font-family: 'Poiret One', sans-serif;
font-size: 0.75rem;
letter-spacing: 0.25em;
text-transform: uppercase;
color: var(--noir-amber);
margin-bottom: 12px;
}
.cases .section-header h2 {
font-size: clamp(1.6rem, 3vw, 2.2rem);
text-transform: uppercase;
}
.case-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(320px, 1fr));
gap: 24px;
max-width: 1200px;
margin: 0 auto;
padding: 0 48px;
}
.case-card {
background: var(--noir-bg-surface);
border: 1px solid var(--noir-border);
padding: 32px;
position: relative;
transition: border-color 0.4s ease, box-shadow 0.4s ease;
overflow: hidden;
}
/* Top-edge light bar */
.case-card::before {
content: '';
position: absolute;
top: 0;
left: 15%;
right: 15%;
height: 1px;
background: linear-gradient(90deg, transparent, rgba(61, 168, 213, 0.25), transparent);
}
/* Inner frame */
.case-card::after {
content: '';
position: absolute;
top: 8px;
left: 8px;
right: 8px;
bottom: 8px;
border: 1px solid rgba(61, 168, 213, 0.04);
pointer-events: none;
transition: border-color 0.4s ease;
}
.case-card:hover {
border-color: rgba(61, 168, 213, 0.2);
box-shadow: var(--noir-glow-blue);
}
.case-card:hover::after {
border-color: rgba(61, 168, 213, 0.1);
}
.case-card .case-id {
font-family: 'IBM Plex Mono', monospace;
font-size: 0.65rem;
letter-spacing: 0.15em;
text-transform: uppercase;
color: var(--noir-amber);
margin-bottom: 16px;
}
.case-card h3 {
font-size: 1.1rem;
margin-bottom: 12px;
text-transform: uppercase;
letter-spacing: 0.04em;
}
.case-card p {
color: var(--noir-text-secondary);
font-size: 0.85rem;
line-height: 1.7;
}
/* ========================================
DOSSIER / ABOUT SECTION
======================================== */
.dossier {
padding: 100px 48px;
border-top: 1px solid rgba(61, 168, 213, 0.06);
max-width: 900px;
margin: 0 auto;
}
.dossier .classified {
font-family: 'Cinzel', serif;
font-size: 0.65rem;
letter-spacing: 0.2em;
text-transform: uppercase;
color: var(--noir-red);
border: 1px solid var(--noir-red);
display: inline-block;
padding: 4px 14px;
margin-bottom: 28px;
transform: rotate(-1deg);
}
.dossier h2 {
font-size: 1.8rem;
text-transform: uppercase;
margin-bottom: 24px;
}
.dossier p {
color: var(--noir-text-secondary);
margin-bottom: 1.25rem;
line-height: 1.9;
}
.dossier .redacted {
background: var(--noir-text-primary);
color: var(--noir-text-primary);
padding: 0 6px;
user-select: none;
cursor: not-allowed;
}
/* ========================================
CTA SECTION
======================================== */
.cta {
text-align: center;
padding: 100px 48px;
border-top: 1px solid rgba(61, 168, 213, 0.06);
position: relative;
overflow: hidden;
}
/* Atmospheric fog */
.cta::before {
content: '';
position: absolute;
inset: 0;
background: radial-gradient(
ellipse at 50% 100%,
rgba(194, 59, 59, 0.04) 0%,
transparent 60%
);
pointer-events: none;
}
.cta .content {
position: relative;
z-index: 2;
}
.cta h2 {
font-size: clamp(1.6rem, 3vw, 2.2rem);
text-transform: uppercase;
margin-bottom: 1rem;
}
.cta h2 em {
font-style: normal;
color: var(--noir-red);
text-shadow: 0 0 10px rgba(194, 59, 59, 0.3);
}
.cta p {
color: var(--noir-text-secondary);
margin-bottom: 2.5rem;
max-width: 500px;
margin-left: auto;
margin-right: auto;
}
.btn--red {
color: var(--noir-red);
border-color: var(--noir-red);
}
.btn--red:hover {
background: rgba(194, 59, 59, 0.08);
box-shadow: var(--noir-glow-red);
color: var(--noir-text-headline);
border-color: rgba(194, 59, 59, 0.6);
}
/* ========================================
FOOTER
======================================== */
footer {
border-top: 1px solid rgba(61, 168, 213, 0.06);
padding: 40px 48px;
max-width: 1200px;
margin: 0 auto;
}
.footer-inner {
display: flex;
justify-content: space-between;
align-items: center;
}
.footer-brand {
font-family: 'Cinzel', serif;
font-size: 0.8rem;
font-weight: 700;
color: var(--noir-text-muted);
text-transform: uppercase;
letter-spacing: 0.15em;
}
.footer-meta {
font-size: 0.72rem;
color: var(--noir-text-muted);
letter-spacing: 0.05em;
}
/* Thin decorative line above footer text */
footer::before {
content: '';
display: block;
width: 40px;
height: 1px;
background: var(--noir-border);
margin-bottom: 24px;
}
/* ========================================
UTILITIES
======================================== */
.neon-text {
color: var(--noir-blue);
text-shadow:
0 0 5px rgba(61, 168, 213, 0.5),
0 0 15px rgba(61, 168, 213, 0.2),
0 0 40px rgba(61, 168, 213, 0.08);
}
.neon-text--amber {
color: var(--noir-amber);
text-shadow:
0 0 5px rgba(212, 168, 67, 0.5),
0 0 15px rgba(212, 168, 67, 0.2),
0 0 40px rgba(212, 168, 67, 0.08);
}
.neon-text--red {
color: var(--noir-red);
text-shadow:
0 0 5px rgba(194, 59, 59, 0.5),
0 0 15px rgba(194, 59, 59, 0.2),
0 0 40px rgba(194, 59, 59, 0.08);
}
/* ========================================
RESPONSIVE
======================================== */
@media (max-width: 768px) {
nav {
padding: 14px 24px;
}
nav ul {
gap: 18px;
}
.hero {
min-height: auto;
padding: 60px 24px;
}
.cases {
padding: 60px 0;
}
.case-grid {
padding: 0 24px;
}
.dossier {
padding: 60px 24px;
}
.cta {
padding: 60px 24px;
}
footer {
padding: 30px 24px;
}
.footer-inner {
flex-direction: column;
gap: 8px;
text-align: center;
}
}
</style>
</head>
<body>
<!-- Navigation -->
<div class="noir-nav-wrapper">
<nav>
<a href="#" class="logo">Shadow<span>&</span>Signal</a>
<ul>
<li><a href="#cases">Cases</a></li>
<li><a href="#dossier">Dossier</a></li>
<li><a href="#contact">Contact</a></li>
<li><a href="#">Terminal</a></li>
</ul>
</nav>
</div>
<!-- Hero Section -->
<section class="hero" id="hero">
<div class="hero-light"></div>
<div class="hero-content">
<div class="tagline">Private Investigations // Digital Forensics</div>
<div class="separator"></div>
<h1>The Truth Hides in the <em>Signal</em></h1>
<p>In a city drowning in data, some secrets still prefer the dark. We trace the
threads that others cannot see -- through encrypted channels, corrupted
archives, and rain-washed server rooms.</p>
<a href="#cases" class="btn">Open Case File</a>
</div>
</section>
<!-- Cases Section -->
<section class="cases" id="cases">
<div class="section-header">
<div class="label">Active Investigations</div>
<h2>Recent Case Files</h2>
</div>
<div class="case-grid">
<div class="case-card">
<div class="case-id">Case No. 2049-7A</div>
<h3>The Vanishing Protocol</h3>
<p>A senior engineer at Meridian Systems disappeared forty-eight hours
before a scheduled whistleblower hearing. Her terminal logs were wiped.
Her biometric data was overwritten. But data never truly dies.</p>
</div>
<div class="case-card">
<div class="case-id">Case No. 2049-12C</div>
<h3>Ghost in the Ledger</h3>
<p>Anomalous transactions routing through seventeen shell corporations,
each registered to addresses that do not exist. The money trail ends
at a server farm beneath the old waterfront district.</p>
</div>
<div class="case-card">
<div class="case-id">Case No. 2050-01F</div>
<h3>Neon Witness</h3>
<p>The only witness to the Eastside incident is a surveillance AI with
corrupted memory banks. Extracting testimony from a machine that does
not know it is lying requires a different kind of interrogation.</p>
</div>
</div>
</section>
<!-- Dossier Section -->
<section class="dossier" id="dossier">
<div class="classified">Classified // Eyes Only</div>
<h2>Operative Dossier</h2>
<p>Shadow & Signal was established in <span class="redacted">REDACTED</span> by former
corporate intelligence operatives who chose to work the other side of the
firewall. We specialize in digital forensics, surveillance analysis, and
the recovery of information that powerful entities would prefer stayed buried.</p>
<p>Our methods combine traditional investigative craft -- interviews, stakeouts,
document analysis -- with cutting-edge computational forensics. Every case
begins in the dark. Our job is to find which shadows are worth illuminating.</p>
<p>Operative clearance level: <span class="redacted">REDACTED</span>.
Current jurisdiction: sectors 7 through 19.
Handler designation: <span class="redacted">REDACTED</span>.</p>
</section>
<!-- CTA Section -->
<section class="cta" id="contact">
<div class="content">
<h2>Something Doesn't <em>Add Up</em>?</h2>
<p>If you have a case that the authorities cannot -- or will not -- pursue,
we operate in the spaces between jurisdictions.</p>
<a href="#" class="btn btn--red">Initiate Contact</a>
</div>
</section>
<!-- Footer -->
<footer>
<div class="footer-inner">
<div class="footer-brand">Shadow & Signal // Est. 2041</div>
<div class="footer-meta">Encrypted channel active. All transmissions monitored.</div>
</div>
</footer>
</body>
</html>
backdrop-filter: blur() for glass panels – frosted glass effects work well for overlaid panels and modals, simulating rain-streaked windows; pair with a dark semi-transparent background colorpointer-events: none – rain streaks, venetian blind overlays, and fog gradients should be purely decorative pseudo-elements that never interfere with user interactionprefers-color-scheme carefully – Tech Noir is inherently a dark aesthetic; if you need a light mode, consider a sepia-toned “case file” variant rather than simply inverting the palette