website_designs

Tech Noir Design Reference

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.


Visual Characteristics

Core Design Traits

Design Principles


Color Palette

Rain-Slicked Neon Palette

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 #08080D Deepest black – page background, void areas
#0E0E14 #0E0E14 Primary surface – card backgrounds, panels
#161621 #161621 Elevated surface – modal backgrounds, nav
#1E1E2C #1E1E2C Tertiary surface – hover states, active panels
#2A2A3A #2A2A3A Border gray – dividers, subtle outlines
#4A4A5E #4A4A5E Muted steel – disabled text, secondary borders
#8888A0 #8888A0 Secondary text – captions, timestamps, metadata
#C8C8D8 #C8C8D8 Primary text – body copy, reading content
#3DA8D5 #3DA8D5 Cold neon blue – primary accent, links, active states
#D4A843 #D4A843 Amber lamplight – secondary accent, warm highlights
#C23B3B #C23B3B Blood red neon – danger, alerts, dramatic emphasis
#7B5EA7 #7B5EA7 Muted violet – tertiary accent, tags, decorative
#2E8B7A #2E8B7A Terminal green – success states, data readouts
#1A3A4A #1A3A4A Deep teal – tinted panels, atmospheric overlays
#E8E0D0 #E8E0D0 Warm white – headlines, high-emphasis text (never pure white)

CSS Custom Properties

: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);
}

Typography

Typeface Characteristics

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

Font Pairing Suggestions

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

Typography CSS Example

/* 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;
}

Layout Principles


CSS / Design Techniques

Tech Noir Card Component

.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;
}

Tech Noir Button

.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%;
}

Hero Section

.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;
  }
}

Venetian Blind Overlay

.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;
}

Fog / Atmospheric Depth

.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;
}

Neon Sign Text Effect

.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);
}

Dossier / Case-File Panel

.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;
}

Design Do’s and Don’ts

Do’s

Don’ts


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

Quick-Start HTML Template

<!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>

Implementation Tips