Noir Minimalism is a dark, restrained design aesthetic that fuses the dramatic visual language of film noir cinema with the disciplined economy of minimalist design. Rooted in the chiaroscuro lighting techniques of 1940s and 1950s Hollywood – where German Expressionist emigres like Fritz Lang and Billy Wilder pioneered the interplay of deep shadow and strategic illumination – this aesthetic translates cinematic tension into digital interfaces. The result is a design philosophy where black is not merely a background but an active compositional force, where negative space carries as much narrative weight as the content it frames, and where every element earns its presence through rigorous editorial restraint.
Where standard dark-mode design simply inverts a light interface, Noir Minimalism treats darkness as a medium unto itself. Backgrounds are rich, absorptive blacks and near-blacks that recede infinitely, while content emerges from the void through carefully controlled pools of light – typographic highlights, thin luminous borders, and restrained accent colors that function like the glow of a cigarette in a shadowed doorway or the gleam of rain on a midnight street. The palette rarely exceeds two or three active hues at any given moment; color is deployed with the precision of a spotlight on a stage.
Typography in Noir Minimalism leans toward elegant, high-contrast typefaces – sharp serifs for editorial authority, geometric sans-serifs for clinical modernity, and generous letter-spacing that allows each character to breathe within the surrounding darkness. Layouts favor extreme whitespace (or rather, “blackspace”), asymmetric compositions, and cinematic aspect ratios that evoke widescreen frames. Imagery, when present, is monochromatic or desaturated, often partially obscured by shadow or cropped to reveal only essential fragments.
The overall mood is one of sophisticated tension – quiet but loaded, elegant but uneasy. Noir Minimalism appeals to luxury brands, photography portfolios, editorial platforms, film and music industry sites, and any context where atmosphere and exclusivity outweigh informational density. It demands that every pixel justify its existence: if an element does not serve the composition, it is consumed by the dark.
The Noir Minimalism palette is built on a foundation of deep blacks and near-blacks, structured through a grayscale hierarchy, and punctuated by one or two carefully rationed accent tones. Color is never abundant – it appears as a flash of warmth in a cold scene, a signal flare in the dark. The palette draws inspiration from the silver halide grain of black-and-white film stock, the amber glow of tungsten lighting through venetian blinds, and the cold steel-blue of moonlit urban landscapes.
| Swatch | Hex | Role / Usage |
|---|---|---|
| Void Black | #000000 |
True black, hero backgrounds, maximum depth fields |
| Onyx | #0A0A0A |
Primary surface background, slightly lifted from void |
| Obsidian | #111111 |
Card backgrounds, elevated surface panels |
| Charcoal Noir | #1A1A1A |
Secondary surfaces, modal overlays, nav backgrounds |
| Graphite | #242424 |
Tertiary surface, sidebar backgrounds, input fields |
| Gunmetal | #2E2E2E |
Borders on dark surfaces, subtle structural dividers |
| Ash | #3A3A3A |
Disabled states, inactive elements, muted borders |
| Smoke | #6B6B6B |
Muted body text, captions, timestamps, metadata |
| Silver Screen | #9A9A9A |
Secondary text, descriptions, supporting copy |
| Platinum | #C8C8C8 |
Primary body text on dark backgrounds |
| Bone White | #E8E8E8 |
High-emphasis text, headings, strong labels |
| Pure Light | #F5F5F5 |
Maximum emphasis text, hero titles, focal highlights |
| Tungsten Amber | #C9A84C |
Primary warm accent – links, CTAs, gold highlights |
| Steel Blue | #4A6D8C |
Primary cool accent – secondary actions, informational |
| Blood Red | #8B1A1A |
Danger, alert, noir crimson accent (use sparingly) |
:root {
/* Black spectrum */
--noir-void: #000000;
--noir-onyx: #0a0a0a;
--noir-obsidian: #111111;
--noir-charcoal: #1a1a1a;
--noir-graphite: #242424;
--noir-gunmetal: #2e2e2e;
--noir-ash: #3a3a3a;
/* Grayscale hierarchy */
--noir-smoke: #6b6b6b;
--noir-silver: #9a9a9a;
--noir-platinum: #c8c8c8;
--noir-bone: #e8e8e8;
--noir-light: #f5f5f5;
/* Accent tones */
--noir-amber: #c9a84c;
--noir-steel: #4a6d8c;
--noir-crimson: #8b1a1a;
/* Functional mappings */
--noir-bg-primary: var(--noir-onyx);
--noir-bg-secondary: var(--noir-charcoal);
--noir-bg-surface: var(--noir-obsidian);
--noir-bg-elevated: var(--noir-graphite);
--noir-text-primary: var(--noir-light);
--noir-text-secondary: var(--noir-platinum);
--noir-text-muted: var(--noir-smoke);
--noir-accent-primary: var(--noir-amber);
--noir-accent-secondary: var(--noir-steel);
--noir-accent-danger: var(--noir-crimson);
--noir-border: var(--noir-gunmetal);
--noir-border-subtle: rgba(255, 255, 255, 0.06);
--noir-glow: rgba(201, 168, 76, 0.15);
}
Noir Minimalism typography prioritizes clarity, elegance, and dramatic contrast. Typefaces are chosen for their ability to command attention in isolation – standing alone against vast dark fields without ornamental support. Sharp, high-contrast serifs echo the editorial authority of mid-century newspapers and detective fiction covers, while geometric sans-serifs provide a clinical, modern counterweight. Letter-spacing is generous, allowing characters to breathe and reinforcing the sense of deliberate, unhurried composition.
| Font | Style | Usage |
|---|---|---|
| Playfair Display | High-contrast serif | Hero headlines, editorial titles, dramatic display text |
| Cormorant Garamond | Elegant light serif | Subheadings, pull quotes, refined secondary headings |
| DM Serif Display | Sharp modern serif | Section headers, card titles, mid-weight emphasis |
| Inter | Clean geometric sans | Primary body text, UI elements, readable long-form |
| Outfit | Modern geometric sans | Alternative body, navigation labels, buttons |
| Space Grotesk | Technical geometric sans | Code-adjacent text, metadata, technical labels |
| Bebas Neue | Condensed all-caps sans | Oversized display, cinematic hero titles, section markers |
| JetBrains Mono | Monospace | Code blocks, timestamps, data labels, technical detail |
| Libre Baskerville | Classic book serif | Long-form reading, article body text on dark |
| Pairing | Headings | Body | Mood |
|---|---|---|---|
| Classic Noir | Playfair Display | Inter | Editorial elegance meets clean modernity |
| Cinematic Title | Bebas Neue | Outfit | Bold widescreen energy, movie-poster authority |
| Literary Dark | Cormorant Garamond | Libre Baskerville | Refined, bookish, detective-novel atmosphere |
| Modern Thriller | DM Serif Display | Space Grotesk | Sharp precision, contemporary noir tension |
| Technical Shadow | Space Grotesk | JetBrains Mono | Developer-noir, data-driven dark interface |
/* Import noir-appropriate Google Fonts */
@import url('https://fonts.googleapis.com/css2?family=Playfair+Display:wght@400;700;900&family=Cormorant+Garamond:wght@300;400;600&family=DM+Serif+Display&family=Inter:wght@300;400;500;600&family=Outfit:wght@300;400;500;600&family=Space+Grotesk:wght@300;400;500;700&family=Bebas+Neue&family=JetBrains+Mono:wght@300;400;500&family=Libre+Baskerville:wght@400;700&display=swap');
/* Hero / Display -- dramatic serif authority */
h1 {
font-family: 'Playfair Display', 'DM Serif Display', Georgia, serif;
font-weight: 900;
font-size: clamp(2.8rem, 7vw, 6rem);
letter-spacing: -0.02em;
line-height: 1.0;
color: var(--noir-light);
text-transform: none;
}
/* Section headings -- refined serif */
h2 {
font-family: 'Cormorant Garamond', 'Playfair Display', Georgia, serif;
font-weight: 300;
font-size: clamp(1.6rem, 3.5vw, 2.4rem);
color: var(--noir-bone);
letter-spacing: 0.08em;
text-transform: uppercase;
margin-bottom: 1.5rem;
}
/* Sub-headings -- sharp modern serif */
h3 {
font-family: 'DM Serif Display', Georgia, serif;
font-size: 1.25rem;
color: var(--noir-platinum);
letter-spacing: 0.02em;
}
/* Body text -- clean, legible sans-serif */
body {
font-family: 'Inter', 'Outfit', -apple-system, BlinkMacSystemFont, sans-serif;
font-weight: 400;
font-size: 1rem;
line-height: 1.75;
color: var(--noir-text-secondary);
}
/* Metadata, labels, timestamps */
.noir-label {
font-family: 'Space Grotesk', 'JetBrains Mono', monospace;
font-size: 0.7rem;
font-weight: 500;
text-transform: uppercase;
letter-spacing: 0.25em;
color: var(--noir-smoke);
}
/* Cinematic oversized display */
.noir-display {
font-family: 'Bebas Neue', 'Playfair Display', Impact, serif;
font-size: clamp(4rem, 12vw, 10rem);
letter-spacing: 0.05em;
line-height: 0.9;
color: var(--noir-light);
text-transform: uppercase;
}
/* Pull quotes and editorial emphasis */
blockquote {
font-family: 'Cormorant Garamond', Georgia, serif;
font-weight: 300;
font-style: italic;
font-size: 1.5rem;
line-height: 1.6;
color: var(--noir-amber);
border-left: 1px solid var(--noir-amber);
padding-left: 1.5rem;
}
.noir-card {
background: var(--noir-obsidian);
border: 1px solid var(--noir-border-subtle);
border-radius: 2px;
padding: 2rem 2.25rem;
position: relative;
overflow: hidden;
transition: border-color 0.4s ease, box-shadow 0.4s ease;
}
.noir-card::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
height: 1px;
background: linear-gradient(
90deg,
transparent 0%,
var(--noir-amber) 50%,
transparent 100%
);
opacity: 0;
transition: opacity 0.4s ease;
}
.noir-card:hover {
border-color: rgba(255, 255, 255, 0.1);
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.6);
}
.noir-card:hover::before {
opacity: 1;
}
.noir-card__title {
font-family: 'DM Serif Display', Georgia, serif;
font-size: 1.25rem;
color: var(--noir-bone);
margin-bottom: 0.75rem;
}
.noir-card__text {
font-family: 'Inter', sans-serif;
font-size: 0.9rem;
line-height: 1.7;
color: var(--noir-smoke);
}
.noir-card__meta {
font-family: 'Space Grotesk', monospace;
font-size: 0.7rem;
text-transform: uppercase;
letter-spacing: 0.2em;
color: var(--noir-ash);
margin-top: 1.5rem;
}
/* Primary button -- amber accent with cinematic hover */
.noir-btn {
display: inline-flex;
align-items: center;
gap: 0.5rem;
font-family: 'Space Grotesk', sans-serif;
font-size: 0.75rem;
font-weight: 500;
text-transform: uppercase;
letter-spacing: 0.2em;
color: var(--noir-light);
background: transparent;
border: 1px solid var(--noir-amber);
padding: 0.875rem 2rem;
cursor: pointer;
position: relative;
overflow: hidden;
transition: color 0.3s ease, background 0.3s ease;
}
.noir-btn::before {
content: '';
position: absolute;
inset: 0;
background: var(--noir-amber);
transform: scaleX(0);
transform-origin: left;
transition: transform 0.4s cubic-bezier(0.22, 1, 0.36, 1);
z-index: -1;
}
.noir-btn:hover::before {
transform: scaleX(1);
}
.noir-btn:hover {
color: var(--noir-void);
}
/* Ghost button -- minimal, outline only */
.noir-btn--ghost {
border-color: var(--noir-gunmetal);
color: var(--noir-silver);
}
.noir-btn--ghost:hover {
border-color: var(--noir-platinum);
color: var(--noir-light);
background: rgba(255, 255, 255, 0.03);
}
.noir-btn--ghost::before {
display: none;
}
/* Small variant */
.noir-btn--sm {
font-size: 0.65rem;
padding: 0.625rem 1.25rem;
letter-spacing: 0.18em;
}
.noir-nav {
position: fixed;
top: 0;
left: 0;
right: 0;
z-index: 100;
display: flex;
align-items: center;
justify-content: space-between;
padding: 1.5rem 3rem;
background: rgba(0, 0, 0, 0.85);
backdrop-filter: blur(12px);
-webkit-backdrop-filter: blur(12px);
border-bottom: 1px solid var(--noir-border-subtle);
transition: background 0.3s ease;
}
.noir-nav__logo {
font-family: 'Bebas Neue', sans-serif;
font-size: 1.4rem;
letter-spacing: 0.15em;
color: var(--noir-light);
text-decoration: none;
text-transform: uppercase;
}
.noir-nav__links {
display: flex;
align-items: center;
gap: 2.5rem;
list-style: none;
margin: 0;
padding: 0;
}
.noir-nav__link {
font-family: 'Space Grotesk', sans-serif;
font-size: 0.7rem;
font-weight: 500;
text-transform: uppercase;
letter-spacing: 0.2em;
color: var(--noir-smoke);
text-decoration: none;
position: relative;
transition: color 0.3s ease;
}
.noir-nav__link::after {
content: '';
position: absolute;
bottom: -4px;
left: 0;
width: 0;
height: 1px;
background: var(--noir-amber);
transition: width 0.3s cubic-bezier(0.22, 1, 0.36, 1);
}
.noir-nav__link:hover {
color: var(--noir-light);
}
.noir-nav__link:hover::after {
width: 100%;
}
.noir-nav__link--active {
color: var(--noir-amber);
}
.noir-nav__link--active::after {
width: 100%;
background: var(--noir-amber);
}
.noir-hero {
position: relative;
min-height: 100vh;
display: flex;
flex-direction: column;
justify-content: center;
align-items: flex-start;
padding: 6rem 3rem;
background: var(--noir-void);
overflow: hidden;
}
.noir-hero::before {
content: '';
position: absolute;
inset: 0;
background: radial-gradient(
ellipse at 30% 50%,
rgba(201, 168, 76, 0.04) 0%,
transparent 60%
);
pointer-events: none;
}
.noir-hero::after {
content: '';
position: absolute;
bottom: 0;
left: 0;
right: 0;
height: 200px;
background: linear-gradient(to top, var(--noir-onyx), transparent);
pointer-events: none;
}
.noir-hero__overline {
font-family: 'Space Grotesk', sans-serif;
font-size: 0.7rem;
font-weight: 500;
text-transform: uppercase;
letter-spacing: 0.3em;
color: var(--noir-amber);
margin-bottom: 1.5rem;
}
.noir-hero__title {
font-family: 'Playfair Display', Georgia, serif;
font-weight: 900;
font-size: clamp(3rem, 8vw, 7rem);
line-height: 1.0;
color: var(--noir-light);
max-width: 14ch;
margin-bottom: 2rem;
}
.noir-hero__subtitle {
font-family: 'Inter', sans-serif;
font-weight: 300;
font-size: clamp(1rem, 1.5vw, 1.25rem);
line-height: 1.8;
color: var(--noir-silver);
max-width: 45ch;
margin-bottom: 3rem;
}
.noir-hero__divider {
width: 60px;
height: 1px;
background: var(--noir-amber);
margin-bottom: 2.5rem;
}
/* Cinematic content reveal -- elements emerge from the dark */
.noir-reveal {
opacity: 0;
transform: translateY(30px);
transition: opacity 0.8s cubic-bezier(0.22, 1, 0.36, 1),
transform 0.8s cubic-bezier(0.22, 1, 0.36, 1);
}
.noir-reveal--visible {
opacity: 1;
transform: translateY(0);
}
/* Staggered reveal for lists and grids */
.noir-reveal:nth-child(1) { transition-delay: 0.0s; }
.noir-reveal:nth-child(2) { transition-delay: 0.1s; }
.noir-reveal:nth-child(3) { transition-delay: 0.2s; }
.noir-reveal:nth-child(4) { transition-delay: 0.3s; }
.noir-reveal:nth-child(5) { transition-delay: 0.4s; }
/* Horizontal wipe -- like a spotlight sweeping across */
.noir-wipe {
clip-path: inset(0 100% 0 0);
transition: clip-path 1s cubic-bezier(0.22, 1, 0.36, 1);
}
.noir-wipe--visible {
clip-path: inset(0 0 0 0);
}
/* Subtle glow pulse for focal elements */
@keyframes noir-glow {
0%, 100% { box-shadow: 0 0 0 rgba(201, 168, 76, 0); }
50% { box-shadow: 0 0 20px rgba(201, 168, 76, 0.08); }
}
.noir-glow-pulse {
animation: noir-glow 4s ease-in-out infinite;
}
/* Thin glowing horizontal rule */
.noir-divider {
border: none;
height: 1px;
background: linear-gradient(
90deg,
transparent 0%,
var(--noir-gunmetal) 20%,
var(--noir-amber) 50%,
var(--noir-gunmetal) 80%,
transparent 100%
);
margin: 4rem 0;
opacity: 0.6;
}
/* Vertical accent line */
.noir-vline {
width: 1px;
height: 80px;
background: linear-gradient(
to bottom,
transparent,
var(--noir-amber),
transparent
);
margin: 2rem auto;
}
/* Noir image -- desaturated with vignette */
.noir-image {
position: relative;
overflow: hidden;
line-height: 0;
}
.noir-image img {
width: 100%;
height: 100%;
object-fit: cover;
filter: grayscale(100%) contrast(1.2) brightness(0.85);
transition: filter 0.6s ease, transform 0.6s ease;
}
.noir-image::after {
content: '';
position: absolute;
inset: 0;
background: radial-gradient(
ellipse at center,
transparent 40%,
rgba(0, 0, 0, 0.7) 100%
);
pointer-events: none;
}
.noir-image:hover img {
filter: grayscale(60%) contrast(1.1) brightness(0.9);
transform: scale(1.03);
}
.noir-footer {
background: var(--noir-void);
border-top: 1px solid var(--noir-border-subtle);
padding: 4rem 3rem 2rem;
}
.noir-footer__grid {
display: grid;
grid-template-columns: 2fr repeat(3, 1fr);
gap: 3rem;
max-width: 1200px;
margin: 0 auto;
}
.noir-footer__heading {
font-family: 'Space Grotesk', sans-serif;
font-size: 0.65rem;
font-weight: 500;
text-transform: uppercase;
letter-spacing: 0.25em;
color: var(--noir-smoke);
margin-bottom: 1.25rem;
}
.noir-footer__link {
display: block;
font-family: 'Inter', sans-serif;
font-size: 0.85rem;
color: var(--noir-ash);
text-decoration: none;
padding: 0.3rem 0;
transition: color 0.3s ease;
}
.noir-footer__link:hover {
color: var(--noir-amber);
}
.noir-footer__bottom {
margin-top: 3rem;
padding-top: 1.5rem;
border-top: 1px solid var(--noir-border-subtle);
display: flex;
justify-content: space-between;
align-items: center;
}
.noir-footer__copyright {
font-family: 'Space Grotesk', sans-serif;
font-size: 0.65rem;
letter-spacing: 0.15em;
color: var(--noir-ash);
}
| Aesthetic | Relationship |
|---|---|
| Dark Mode UI | Shares the dark surface foundation but Noir Minimalism adds cinematic atmosphere and editorial restraint beyond standard dark interface patterns |
| Brutalism | Both strip away ornamentation, but Brutalism embraces raw, confrontational maximalism while Noir Minimalism is refined and controlled |
| Corporate Dark | Noir Minimalism’s commercial cousin; uses dark palettes for professionalism rather than cinematic mood, tends toward more conventional layouts |
| Film Noir (Cinema) | The direct aesthetic ancestor – chiaroscuro lighting, shadow-dominant compositions, morally ambiguous atmosphere translated from screen to pixel |
| Art Deco | Shares the gold-on-black palette and geometric precision but Art Deco is ornamented and symmetrical where Noir Minimalism is stripped and asymmetric |
| Swiss / International Style | Both value typographic hierarchy and grid discipline but Swiss Design is typically light-background and content-dense |
| Gothic / Dark Academia | Shares moodiness and dark palettes but Gothic leans toward maximalist ornamentation, texture, and historical pastiche |
| Neo-Minimalism | Contemporary minimalism that favors dark palettes and restrained interaction; Noir Minimalism adds the specific cinematic noir influence |
| Luxury / High Fashion | Fashion and luxury brands frequently adopt noir-minimal aesthetics for their web presence; shared values of exclusivity and restraint |
| Cyberpunk | Both use dark backgrounds with accent lighting, but Cyberpunk is neon-saturated and dystopian while Noir Minimalism is muted and controlled |
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Noir Minimalism -- Design Template</title>
<!-- Google Fonts -->
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Playfair+Display:wght@400;700;900&family=Cormorant+Garamond:wght@300;400;600&family=DM+Serif+Display&family=Inter:wght@300;400;500;600&family=Space+Grotesk:wght@300;400;500;700&family=Bebas+Neue&family=JetBrains+Mono:wght@300;400&display=swap" rel="stylesheet">
<style>
/* =============================================
CSS RESET & CUSTOM PROPERTIES
============================================= */
*, *::before, *::after {
margin: 0;
padding: 0;
box-sizing: border-box;
}
:root {
/* Black spectrum */
--noir-void: #000000;
--noir-onyx: #0a0a0a;
--noir-obsidian: #111111;
--noir-charcoal: #1a1a1a;
--noir-graphite: #242424;
--noir-gunmetal: #2e2e2e;
--noir-ash: #3a3a3a;
/* Grayscale hierarchy */
--noir-smoke: #6b6b6b;
--noir-silver: #9a9a9a;
--noir-platinum: #c8c8c8;
--noir-bone: #e8e8e8;
--noir-light: #f5f5f5;
/* Accent tones */
--noir-amber: #c9a84c;
--noir-steel: #4a6d8c;
--noir-crimson: #8b1a1a;
/* Functional mappings */
--noir-bg-primary: var(--noir-onyx);
--noir-bg-secondary: var(--noir-charcoal);
--noir-bg-surface: var(--noir-obsidian);
--noir-bg-elevated: var(--noir-graphite);
--noir-text-primary: var(--noir-light);
--noir-text-secondary: var(--noir-platinum);
--noir-text-muted: var(--noir-smoke);
--noir-accent-primary: var(--noir-amber);
--noir-accent-secondary: var(--noir-steel);
--noir-border: var(--noir-gunmetal);
--noir-border-subtle: rgba(255, 255, 255, 0.06);
--noir-glow: rgba(201, 168, 76, 0.15);
}
html {
scroll-behavior: smooth;
}
body {
font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;
font-weight: 400;
font-size: 1rem;
line-height: 1.75;
color: var(--noir-text-secondary);
background: var(--noir-bg-primary);
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
overflow-x: hidden;
}
a {
color: var(--noir-amber);
text-decoration: none;
transition: color 0.3s ease;
}
a:hover {
color: var(--noir-light);
}
img {
max-width: 100%;
display: block;
}
/* =============================================
NAVIGATION
============================================= */
.nav {
position: fixed;
top: 0;
left: 0;
right: 0;
z-index: 100;
display: flex;
align-items: center;
justify-content: space-between;
padding: 1.5rem 3rem;
background: rgba(0, 0, 0, 0.85);
backdrop-filter: blur(12px);
-webkit-backdrop-filter: blur(12px);
border-bottom: 1px solid var(--noir-border-subtle);
}
.nav__logo {
font-family: 'Bebas Neue', sans-serif;
font-size: 1.5rem;
letter-spacing: 0.15em;
color: var(--noir-light);
text-decoration: none;
text-transform: uppercase;
}
.nav__links {
display: flex;
align-items: center;
gap: 2.5rem;
list-style: none;
}
.nav__link {
font-family: 'Space Grotesk', sans-serif;
font-size: 0.7rem;
font-weight: 500;
text-transform: uppercase;
letter-spacing: 0.2em;
color: var(--noir-smoke);
text-decoration: none;
position: relative;
transition: color 0.3s ease;
}
.nav__link::after {
content: '';
position: absolute;
bottom: -4px;
left: 0;
width: 0;
height: 1px;
background: var(--noir-amber);
transition: width 0.3s cubic-bezier(0.22, 1, 0.36, 1);
}
.nav__link:hover {
color: var(--noir-light);
}
.nav__link:hover::after {
width: 100%;
}
/* =============================================
HERO SECTION
============================================= */
.hero {
position: relative;
min-height: 100vh;
display: flex;
flex-direction: column;
justify-content: center;
padding: 8rem 3rem 6rem;
background: var(--noir-void);
overflow: hidden;
}
.hero::before {
content: '';
position: absolute;
inset: 0;
background: radial-gradient(
ellipse at 25% 50%,
rgba(201, 168, 76, 0.04) 0%,
transparent 55%
);
pointer-events: none;
}
.hero::after {
content: '';
position: absolute;
bottom: 0;
left: 0;
right: 0;
height: 200px;
background: linear-gradient(to top, var(--noir-onyx), transparent);
pointer-events: none;
}
.hero__inner {
max-width: 900px;
position: relative;
z-index: 1;
}
.hero__overline {
font-family: 'Space Grotesk', sans-serif;
font-size: 0.7rem;
font-weight: 500;
text-transform: uppercase;
letter-spacing: 0.35em;
color: var(--noir-amber);
margin-bottom: 1.5rem;
}
.hero__title {
font-family: 'Playfair Display', Georgia, serif;
font-weight: 900;
font-size: clamp(3rem, 8vw, 6.5rem);
line-height: 1.0;
color: var(--noir-light);
margin-bottom: 2rem;
}
.hero__title em {
font-style: italic;
color: var(--noir-amber);
}
.hero__divider {
width: 60px;
height: 1px;
background: var(--noir-amber);
margin-bottom: 2rem;
}
.hero__subtitle {
font-family: 'Inter', sans-serif;
font-weight: 300;
font-size: clamp(1rem, 1.5vw, 1.2rem);
line-height: 1.8;
color: var(--noir-silver);
max-width: 48ch;
margin-bottom: 3rem;
}
.hero__actions {
display: flex;
gap: 1.25rem;
flex-wrap: wrap;
}
/* =============================================
BUTTONS
============================================= */
.btn {
display: inline-flex;
align-items: center;
gap: 0.5rem;
font-family: 'Space Grotesk', sans-serif;
font-size: 0.72rem;
font-weight: 500;
text-transform: uppercase;
letter-spacing: 0.2em;
color: var(--noir-light);
background: transparent;
border: 1px solid var(--noir-amber);
padding: 0.875rem 2rem;
cursor: pointer;
position: relative;
overflow: hidden;
transition: color 0.3s ease;
text-decoration: none;
}
.btn::before {
content: '';
position: absolute;
inset: 0;
background: var(--noir-amber);
transform: scaleX(0);
transform-origin: left;
transition: transform 0.4s cubic-bezier(0.22, 1, 0.36, 1);
z-index: -1;
}
.btn:hover {
color: var(--noir-void);
}
.btn:hover::before {
transform: scaleX(1);
}
.btn--ghost {
border-color: var(--noir-gunmetal);
color: var(--noir-silver);
}
.btn--ghost::before {
display: none;
}
.btn--ghost:hover {
border-color: var(--noir-platinum);
color: var(--noir-light);
background: rgba(255, 255, 255, 0.03);
}
/* =============================================
SECTION UTILITY
============================================= */
.section {
padding: 7rem 3rem;
max-width: 1200px;
margin: 0 auto;
}
.section--full {
max-width: none;
padding-left: 0;
padding-right: 0;
}
.section__overline {
font-family: 'Space Grotesk', sans-serif;
font-size: 0.65rem;
font-weight: 500;
text-transform: uppercase;
letter-spacing: 0.3em;
color: var(--noir-amber);
margin-bottom: 1rem;
}
.section__title {
font-family: 'Cormorant Garamond', Georgia, serif;
font-weight: 300;
font-size: clamp(1.8rem, 4vw, 2.8rem);
color: var(--noir-bone);
letter-spacing: 0.06em;
text-transform: uppercase;
margin-bottom: 1rem;
}
.section__subtitle {
font-family: 'Inter', sans-serif;
font-weight: 300;
font-size: 1rem;
color: var(--noir-smoke);
max-width: 55ch;
margin-bottom: 3.5rem;
}
/* Luminous divider */
.divider {
border: none;
height: 1px;
background: linear-gradient(
90deg,
transparent 0%,
var(--noir-gunmetal) 20%,
var(--noir-amber) 50%,
var(--noir-gunmetal) 80%,
transparent 100%
);
margin: 0;
opacity: 0.5;
}
/* =============================================
CARD GRID
============================================= */
.card-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(320px, 1fr));
gap: 1.5rem;
}
.card {
background: var(--noir-bg-surface);
border: 1px solid var(--noir-border-subtle);
border-radius: 2px;
padding: 2.25rem;
position: relative;
overflow: hidden;
transition: border-color 0.4s ease, box-shadow 0.4s ease;
}
.card::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
height: 1px;
background: linear-gradient(
90deg,
transparent 0%,
var(--noir-amber) 50%,
transparent 100%
);
opacity: 0;
transition: opacity 0.4s ease;
}
.card:hover {
border-color: rgba(255, 255, 255, 0.1);
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.5);
}
.card:hover::before {
opacity: 1;
}
.card__number {
font-family: 'Bebas Neue', sans-serif;
font-size: 2.5rem;
color: var(--noir-graphite);
line-height: 1;
margin-bottom: 1.25rem;
}
.card__title {
font-family: 'DM Serif Display', Georgia, serif;
font-size: 1.2rem;
color: var(--noir-bone);
margin-bottom: 0.75rem;
}
.card__text {
font-family: 'Inter', sans-serif;
font-size: 0.88rem;
line-height: 1.7;
color: var(--noir-smoke);
}
.card__tag {
display: inline-block;
font-family: 'Space Grotesk', sans-serif;
font-size: 0.6rem;
font-weight: 500;
text-transform: uppercase;
letter-spacing: 0.2em;
color: var(--noir-ash);
border: 1px solid var(--noir-gunmetal);
padding: 0.3rem 0.75rem;
margin-top: 1.5rem;
}
/* =============================================
FEATURED / SPLIT SECTION
============================================= */
.split {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 0;
min-height: 70vh;
}
.split__image {
position: relative;
overflow: hidden;
background: var(--noir-charcoal);
}
.split__image img {
width: 100%;
height: 100%;
object-fit: cover;
filter: grayscale(100%) contrast(1.15) brightness(0.8);
transition: filter 0.6s ease, transform 0.6s ease;
}
.split__image::after {
content: '';
position: absolute;
inset: 0;
background: radial-gradient(
ellipse at center,
transparent 30%,
rgba(0, 0, 0, 0.6) 100%
);
pointer-events: none;
}
.split__image:hover img {
filter: grayscale(70%) contrast(1.1) brightness(0.85);
transform: scale(1.02);
}
.split__content {
display: flex;
flex-direction: column;
justify-content: center;
padding: 4rem 4rem;
background: var(--noir-bg-primary);
}
.split__quote {
font-family: 'Cormorant Garamond', Georgia, serif;
font-weight: 300;
font-style: italic;
font-size: 1.6rem;
line-height: 1.6;
color: var(--noir-amber);
border-left: 1px solid var(--noir-amber);
padding-left: 1.5rem;
margin-bottom: 2rem;
}
.split__attribution {
font-family: 'Space Grotesk', sans-serif;
font-size: 0.7rem;
text-transform: uppercase;
letter-spacing: 0.2em;
color: var(--noir-ash);
}
/* =============================================
STATS / METRICS ROW
============================================= */
.stats {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 0;
border-top: 1px solid var(--noir-border-subtle);
border-bottom: 1px solid var(--noir-border-subtle);
}
.stat {
text-align: center;
padding: 3rem 1.5rem;
border-right: 1px solid var(--noir-border-subtle);
}
.stat:last-child {
border-right: none;
}
.stat__number {
font-family: 'Playfair Display', Georgia, serif;
font-weight: 700;
font-size: 2.5rem;
color: var(--noir-light);
line-height: 1;
margin-bottom: 0.5rem;
}
.stat__label {
font-family: 'Space Grotesk', sans-serif;
font-size: 0.65rem;
text-transform: uppercase;
letter-spacing: 0.25em;
color: var(--noir-smoke);
}
/* =============================================
FOOTER
============================================= */
.footer {
background: var(--noir-void);
border-top: 1px solid var(--noir-border-subtle);
padding: 4rem 3rem 2rem;
}
.footer__grid {
display: grid;
grid-template-columns: 2fr repeat(3, 1fr);
gap: 3rem;
max-width: 1200px;
margin: 0 auto;
}
.footer__brand {
font-family: 'Bebas Neue', sans-serif;
font-size: 1.3rem;
letter-spacing: 0.15em;
color: var(--noir-light);
text-transform: uppercase;
margin-bottom: 1rem;
}
.footer__desc {
font-size: 0.85rem;
color: var(--noir-ash);
max-width: 30ch;
line-height: 1.6;
}
.footer__heading {
font-family: 'Space Grotesk', sans-serif;
font-size: 0.62rem;
font-weight: 500;
text-transform: uppercase;
letter-spacing: 0.25em;
color: var(--noir-smoke);
margin-bottom: 1.25rem;
}
.footer__link {
display: block;
font-size: 0.85rem;
color: var(--noir-ash);
text-decoration: none;
padding: 0.3rem 0;
transition: color 0.3s ease;
}
.footer__link:hover {
color: var(--noir-amber);
}
.footer__bottom {
margin-top: 3rem;
padding-top: 1.5rem;
border-top: 1px solid var(--noir-border-subtle);
display: flex;
justify-content: space-between;
align-items: center;
max-width: 1200px;
margin-left: auto;
margin-right: auto;
}
.footer__copyright {
font-family: 'Space Grotesk', sans-serif;
font-size: 0.62rem;
letter-spacing: 0.15em;
color: var(--noir-ash);
}
/* =============================================
REVEAL ANIMATIONS
============================================= */
.reveal {
opacity: 0;
transform: translateY(24px);
transition: opacity 0.7s cubic-bezier(0.22, 1, 0.36, 1),
transform 0.7s cubic-bezier(0.22, 1, 0.36, 1);
}
.reveal--visible {
opacity: 1;
transform: translateY(0);
}
/* =============================================
RESPONSIVE
============================================= */
@media (max-width: 768px) {
.nav {
padding: 1rem 1.5rem;
}
.nav__links {
gap: 1.25rem;
}
.hero {
padding: 7rem 1.5rem 4rem;
}
.section {
padding: 4rem 1.5rem;
}
.split {
grid-template-columns: 1fr;
}
.split__content {
padding: 3rem 1.5rem;
}
.stats {
grid-template-columns: repeat(2, 1fr);
}
.stat:nth-child(2) {
border-right: none;
}
.card-grid {
grid-template-columns: 1fr;
}
.footer__grid {
grid-template-columns: 1fr 1fr;
}
}
@media (max-width: 480px) {
.nav__links {
display: none;
}
.stats {
grid-template-columns: 1fr;
}
.stat {
border-right: none;
border-bottom: 1px solid var(--noir-border-subtle);
}
.stat:last-child {
border-bottom: none;
}
.footer__grid {
grid-template-columns: 1fr;
}
}
</style>
</head>
<body>
<!-- ============================================
NAVIGATION
============================================ -->
<nav class="nav">
<a href="#" class="nav__logo">Noir</a>
<ul class="nav__links">
<li><a href="#work" class="nav__link">Work</a></li>
<li><a href="#about" class="nav__link">About</a></li>
<li><a href="#journal" class="nav__link">Journal</a></li>
<li><a href="#contact" class="nav__link">Contact</a></li>
</ul>
</nav>
<!-- ============================================
HERO SECTION
============================================ -->
<section class="hero">
<div class="hero__inner">
<p class="hero__overline">Design Studio</p>
<h1 class="hero__title">
Where Light<br>
Meets <em>Shadow</em>
</h1>
<div class="hero__divider"></div>
<p class="hero__subtitle">
We craft digital experiences defined by cinematic restraint,
precise typography, and the dramatic interplay of darkness
and light. Every element earns its place.
</p>
<div class="hero__actions">
<a href="#work" class="btn">View Work</a>
<a href="#about" class="btn btn--ghost">Our Process</a>
</div>
</div>
</section>
<!-- ============================================
LUMINOUS DIVIDER
============================================ -->
<hr class="divider">
<!-- ============================================
STATS ROW
============================================ -->
<section class="stats">
<div class="stat reveal">
<div class="stat__number">147</div>
<div class="stat__label">Projects Delivered</div>
</div>
<div class="stat reveal">
<div class="stat__number">12</div>
<div class="stat__label">Design Awards</div>
</div>
<div class="stat reveal">
<div class="stat__number">98%</div>
<div class="stat__label">Client Retention</div>
</div>
<div class="stat reveal">
<div class="stat__number">2018</div>
<div class="stat__label">Established</div>
</div>
</section>
<hr class="divider">
<!-- ============================================
WORK / CARD GRID
============================================ -->
<section id="work" class="section">
<p class="section__overline">Selected Work</p>
<h2 class="section__title">Recent Projects</h2>
<p class="section__subtitle">
A curated selection of our most compelling work, where
darkness serves as both canvas and collaborator.
</p>
<div class="card-grid">
<article class="card reveal">
<div class="card__number">01</div>
<h3 class="card__title">Meridian Hotel Brand</h3>
<p class="card__text">
Complete brand identity and web experience for a luxury
boutique hotel. Darkness, gold, and restraint define
every touchpoint.
</p>
<span class="card__tag">Branding</span>
</article>
<article class="card reveal">
<div class="card__number">02</div>
<h3 class="card__title">Obsidian Gallery</h3>
<p class="card__text">
A digital exhibition space for contemporary photography.
Monochromatic imagery emerges from pure black canvases
with cinematic pacing.
</p>
<span class="card__tag">Web Design</span>
</article>
<article class="card reveal">
<div class="card__number">03</div>
<h3 class="card__title">Vesper Watchmakers</h3>
<p class="card__text">
E-commerce experience for artisan timepieces. Each product
is revealed through chiaroscuro lighting and deliberate
scroll-driven narratives.
</p>
<span class="card__tag">E-Commerce</span>
</article>
</div>
</section>
<hr class="divider">
<!-- ============================================
SPLIT / FEATURED SECTION
============================================ -->
<section id="about" class="section section--full">
<div class="split">
<div class="split__image">
<!-- Replace with your own image -->
<img src="https://images.unsplash.com/photo-1507003211169-0a1dd7228f2d?w=800&q=80" alt="Portrait in shadow">
</div>
<div class="split__content">
<p class="section__overline">Philosophy</p>
<h2 class="section__title">Cinematic Restraint</h2>
<blockquote class="split__quote">
"The most powerful design decisions are the ones
where you choose to leave something out."
</blockquote>
<p class="split__attribution">-- Studio Manifesto, 2021</p>
</div>
</div>
</section>
<hr class="divider">
<!-- ============================================
JOURNAL / SECONDARY CARDS
============================================ -->
<section id="journal" class="section">
<p class="section__overline">Journal</p>
<h2 class="section__title">Thoughts on Design</h2>
<p class="section__subtitle">
Essays on craft, restraint, and the disciplined pursuit
of atmosphere in digital design.
</p>
<div class="card-grid">
<article class="card reveal">
<h3 class="card__title">On the Weight of Darkness</h3>
<p class="card__text">
How black space carries more visual mass than any
element placed within it, and why that matters for
hierarchy.
</p>
<span class="card__tag">Essay</span>
</article>
<article class="card reveal">
<h3 class="card__title">Typography as Light Source</h3>
<p class="card__text">
When color and imagery are stripped away, the letterform
becomes the brightest object in the room. A study in
typographic luminance.
</p>
<span class="card__tag">Process</span>
</article>
<article class="card reveal">
<h3 class="card__title">Accessible Darkness</h3>
<p class="card__text">
Maintaining WCAG compliance in ultra-dark interfaces.
Practical strategies for contrast, focus states, and
inclusive design within noir aesthetics.
</p>
<span class="card__tag">Accessibility</span>
</article>
</div>
</section>
<hr class="divider">
<!-- ============================================
FOOTER
============================================ -->
<footer id="contact" class="footer">
<div class="footer__grid">
<div>
<div class="footer__brand">Noir Studio</div>
<p class="footer__desc">
Design defined by cinematic restraint
and the eloquence of darkness.
</p>
</div>
<div>
<h4 class="footer__heading">Navigation</h4>
<a href="#work" class="footer__link">Work</a>
<a href="#about" class="footer__link">About</a>
<a href="#journal" class="footer__link">Journal</a>
<a href="#contact" class="footer__link">Contact</a>
</div>
<div>
<h4 class="footer__heading">Connect</h4>
<a href="#" class="footer__link">Twitter / X</a>
<a href="#" class="footer__link">Dribbble</a>
<a href="#" class="footer__link">Behance</a>
<a href="#" class="footer__link">LinkedIn</a>
</div>
<div>
<h4 class="footer__heading">Inquiries</h4>
<a href="mailto:hello@noir.studio" class="footer__link">hello@noir.studio</a>
<a href="#" class="footer__link">Start a Project</a>
</div>
</div>
<div class="footer__bottom">
<span class="footer__copyright">© 2026 Noir Studio. All rights reserved.</span>
<span class="footer__copyright">Crafted in darkness.</span>
</div>
</footer>
<!-- ============================================
REVEAL ANIMATION SCRIPT
============================================ -->
<script>
document.addEventListener('DOMContentLoaded', () => {
const reveals = document.querySelectorAll('.reveal');
const observer = new IntersectionObserver(
(entries) => {
entries.forEach((entry) => {
if (entry.isIntersecting) {
entry.target.classList.add('reveal--visible');
observer.unobserve(entry.target);
}
});
},
{
threshold: 0.15,
rootMargin: '0px 0px -40px 0px',
}
);
reveals.forEach((el) => observer.observe(el));
});
</script>
</body>
</html>
-webkit-font-smoothing: antialiased and -moz-osx-font-smoothing: grayscale globally; light text on dark backgrounds benefits from subpixel rendering suppression to avoid color fringingfilter: grayscale(100%), you can serve standard color photographs and let the browser handle the conversion; no need to prepare separate monochrome assetsprefers-reduced-motion media query; respect users who have motion sensitivity by providing a no-animation fallback where all .reveal elements are immediately visiblecolor-scheme: dark in your CSS and HTML meta tag to inform browsers and system UI elements (scrollbars, form controls) that the interface is dark-first