Scandinavian Dark – also known as Nordic Noir in interior and visual design circles – is the moody, inverted sibling of traditional Scandinavian minimalism. Where classic Scandinavian design celebrates airy whites, pale birch, and light-flooded interiors, Scandinavian Dark takes the same foundational principles of functional simplicity, clean geometry, natural material reverence, and restrained composition and submerges them in a palette of matte blacks, deep charcoals, smoked oak, and cool slate grays. The result is an aesthetic that feels simultaneously warm and austere, intimate and expansive – a design language shaped by the long, dark Nordic winters rather than the bright midnight sun of summer.
Rooted in the Danish concept of hygge (cozy well-being) and the broader Scandinavian commitment to lagom (balance, “just enough”), Scandinavian Dark achieves coziness not through brightness but through layered texture, warm undertones within dark palettes, and the interplay of matte and organic surfaces. Charred timber (shou sugi ban), blackened steel, dark stoneware ceramics, slate, and brushed concrete replace the bleached woods and white ceramics of their lighter counterpart. Accent warmth comes from cognac leather, amber-toned lighting, deep forest greens, and the occasional muted copper or brass detail.
In web and UI design, Scandinavian Dark translates into dark-mode interfaces with exceptional whitespace discipline, understated typography using geometric sans-serifs, subtle micro-interactions, and a material-inspired approach to surface elevation. Cards and containers use slight tonal shifts rather than harsh borders. Imagery favors desaturated, high-contrast photography with natural subject matter – forests, stone, still water, architectural concrete. The overall impression is one of quiet authority: the interface never shouts, but every element is precisely placed and purposeful. It borrows confidence from the broader Nordic design tradition – the idea that removing the unnecessary makes the necessary speak – while wrapping that philosophy in a darker, more dramatic visual envelope. Unlike generic “dark mode,” Scandinavian Dark is specifically warm, textured, and organic where standard dark themes are often cold and flat.
The Scandinavian Dark palette draws from the natural environments of the Nordic landscape: volcanic basalt, charred pine forests, slate fjord cliffs, dark winter seas, and the warm amber glow of candlelight against dark interiors. Colors are deeply desaturated, leaning warm in the neutrals and cool in the accents, with a few restrained earth tones for interactive elements and emphasis.
| Swatch | Hex | Role / Usage |
|---|---|---|
| Midnight Black | #0E0E10 |
Deepest background, page canvas, OLED-friendly base |
| Charcoal | #1A1A1E |
Primary background, main content area fills |
| Dark Slate | #242428 |
Elevated surfaces, card backgrounds, modal overlays |
| Graphite | #2E2E34 |
Secondary surfaces, sidebar backgrounds, input fields |
| Ash Gray | #3C3C44 |
Borders, subtle dividers, inactive element backgrounds |
| Stone | #5A5A64 |
Muted text, placeholder copy, disabled states |
| Fog | #8A8A94 |
Secondary body text, captions, metadata |
| Smoke White | #C8C8CE |
Primary body text, readable content on dark surfaces |
| Nordic Ivory | #E8E4DE |
High-emphasis text, headings, display typography |
| Warm White | #F5F0E8 |
Maximum contrast text, hero titles, critical labels |
| Smoked Oak | #6B5340 |
Warm accent, natural material reference, subtle highlights |
| Cognac | #A0714A |
Primary warm accent, interactive elements, links, CTAs |
| Amber Glow | #D4A054 |
Highlight accent, hover states, active indicators |
| Forest Pine | #2A4A3A |
Cool accent, success states, nature-inspired depth |
| Fjord Blue | #3A4A5A |
Cool neutral accent, secondary interactive states |
:root {
/* Dark base tones */
--scandi-midnight: #0e0e10;
--scandi-charcoal: #1a1a1e;
--scandi-dark-slate: #242428;
--scandi-graphite: #2e2e34;
--scandi-ash: #3c3c44;
/* Neutral grays */
--scandi-stone: #5a5a64;
--scandi-fog: #8a8a94;
/* Light tones */
--scandi-smoke-white: #c8c8ce;
--scandi-ivory: #e8e4de;
--scandi-warm-white: #f5f0e8;
/* Warm accents */
--scandi-smoked-oak: #6b5340;
--scandi-cognac: #a0714a;
--scandi-amber: #d4a054;
/* Cool accents */
--scandi-pine: #2a4a3a;
--scandi-fjord: #3a4a5a;
/* Functional mappings */
--scandi-bg-primary: var(--scandi-charcoal);
--scandi-bg-secondary: var(--scandi-dark-slate);
--scandi-bg-surface: var(--scandi-graphite);
--scandi-bg-elevated: var(--scandi-ash);
--scandi-text-primary: var(--scandi-ivory);
--scandi-text-body: var(--scandi-smoke-white);
--scandi-text-muted: var(--scandi-fog);
--scandi-text-disabled: var(--scandi-stone);
--scandi-accent-primary: var(--scandi-cognac);
--scandi-accent-highlight: var(--scandi-amber);
--scandi-accent-success: var(--scandi-pine);
--scandi-border: var(--scandi-ash);
--scandi-border-subtle: rgba(255, 255, 255, 0.06);
}
Typography in Scandinavian Dark design is clean, geometric, and precisely spaced. The tradition favors sans-serif typefaces that embody the functional clarity of Nordic graphic design – typefaces with even stroke widths, open apertures, and a humanist warmth that prevents them from feeling mechanical. Headings use generous letter-spacing and tend toward lighter weights to maintain the airy minimalism even within the dark palette. Body text prioritizes readability with comfortable line-heights and careful contrast ratios against dark backgrounds.
| Font | Style | Weight Range | Usage |
|---|---|---|---|
| Inter | Geometric Sans | 300 – 700 | Body text, UI elements, all-purpose |
| DM Sans | Geometric Humanist | 400 – 700 | Headings, subheadings, nav labels |
| Josefin Sans | Elegant Geometric | 300 – 600 | Display headings, hero text, titles |
| Work Sans | Functional Sans | 300 – 600 | Body text, secondary content, captions |
| Cormorant Garamond | Classical Serif | 300 – 600 | Editorial accent, pull quotes, contrast pairing |
| Source Serif 4 | Modern Serif | 400 – 700 | Long-form body text, article content |
| Heading | Body | Mood |
|---|---|---|
| Josefin Sans (300) | Inter (400) | Elegant and functional, classic Scandinavian feel |
| DM Sans (500) | Work Sans (400) | Modern and approachable, balanced weight |
| Josefin Sans (300) | Source Serif 4 (400) | Editorial contrast, warm and refined |
| DM Sans (700) | Inter (300) | Bold and clean, strong hierarchy |
| Cormorant Garamond (300) | Work Sans (400) | Sophisticated serif/sans contrast, Nordic editorial |
/* Import from Google Fonts */
@import url('https://fonts.googleapis.com/css2?family=Josefin+Sans:wght@300;400;600&family=Inter:wght@300;400;500;600&family=DM+Sans:wght@400;500;700&display=swap');
/* Base typography */
body {
font-family: 'Inter', 'Helvetica Neue', Arial, sans-serif;
font-size: 1rem;
font-weight: 400;
line-height: 1.7;
color: var(--scandi-text-body);
letter-spacing: 0.01em;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
/* Display heading -- hero and page titles */
h1 {
font-family: 'Josefin Sans', sans-serif;
font-weight: 300;
font-size: clamp(2.4rem, 5vw, 4rem);
line-height: 1.15;
letter-spacing: 0.04em;
text-transform: uppercase;
color: var(--scandi-text-primary);
}
/* Section heading */
h2 {
font-family: 'DM Sans', sans-serif;
font-weight: 500;
font-size: clamp(1.5rem, 3vw, 2.2rem);
line-height: 1.25;
letter-spacing: 0.02em;
color: var(--scandi-text-primary);
}
/* Subsection heading */
h3 {
font-family: 'DM Sans', sans-serif;
font-weight: 400;
font-size: clamp(1.1rem, 2vw, 1.5rem);
line-height: 1.35;
letter-spacing: 0.015em;
color: var(--scandi-text-body);
}
/* Small caps label */
.label {
font-family: 'Inter', sans-serif;
font-weight: 500;
font-size: 0.75rem;
letter-spacing: 0.12em;
text-transform: uppercase;
color: var(--scandi-text-muted);
}
/* Pull quote */
blockquote {
font-family: 'Cormorant Garamond', serif;
font-weight: 300;
font-style: italic;
font-size: 1.4rem;
line-height: 1.6;
color: var(--scandi-accent-primary);
border-left: 2px solid var(--scandi-accent-primary);
padding-left: 1.5rem;
margin: 2rem 0;
}
Cards in Scandinavian Dark use subtle surface elevation through tonal shifts rather than borders or strong shadows. The effect suggests a physical surface – like a slate tile resting on a dark stone counter.
.scandi-card {
background: var(--scandi-bg-secondary);
border: 1px solid var(--scandi-border-subtle);
border-radius: 12px;
padding: 2rem;
transition: background 0.3s ease, transform 0.3s ease, box-shadow 0.3s ease;
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);
}
.scandi-card:hover {
background: var(--scandi-bg-surface);
transform: translateY(-2px);
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.3);
}
.scandi-card__label {
font-family: 'Inter', sans-serif;
font-weight: 500;
font-size: 0.7rem;
letter-spacing: 0.14em;
text-transform: uppercase;
color: var(--scandi-accent-primary);
margin-bottom: 0.75rem;
}
.scandi-card__title {
font-family: 'DM Sans', sans-serif;
font-weight: 500;
font-size: 1.25rem;
color: var(--scandi-text-primary);
margin-bottom: 0.5rem;
}
.scandi-card__body {
font-family: 'Inter', sans-serif;
font-weight: 400;
font-size: 0.95rem;
line-height: 1.7;
color: var(--scandi-text-muted);
}
Buttons are understated and geometric. The primary button uses the warm cognac accent against the dark canvas; secondary buttons are ghost-style with subtle borders. Transitions are smooth and deliberate.
.scandi-btn {
font-family: 'Inter', sans-serif;
font-weight: 500;
font-size: 0.85rem;
letter-spacing: 0.08em;
text-transform: uppercase;
padding: 0.875rem 2rem;
border-radius: 8px;
border: none;
cursor: pointer;
transition: all 0.3s ease;
display: inline-flex;
align-items: center;
gap: 0.5rem;
}
.scandi-btn--primary {
background: var(--scandi-accent-primary);
color: var(--scandi-warm-white);
box-shadow: 0 2px 8px rgba(160, 113, 74, 0.25);
}
.scandi-btn--primary:hover {
background: var(--scandi-accent-highlight);
color: var(--scandi-midnight);
box-shadow: 0 4px 16px rgba(212, 160, 84, 0.3);
transform: translateY(-1px);
}
.scandi-btn--secondary {
background: transparent;
color: var(--scandi-text-body);
border: 1px solid var(--scandi-ash);
}
.scandi-btn--secondary:hover {
border-color: var(--scandi-accent-primary);
color: var(--scandi-accent-primary);
background: rgba(160, 113, 74, 0.08);
}
.scandi-btn--ghost {
background: transparent;
color: var(--scandi-text-muted);
border: none;
padding: 0.875rem 1rem;
}
.scandi-btn--ghost:hover {
color: var(--scandi-text-primary);
}
Navigation in Scandinavian Dark is minimal, fixed, and uses a translucent dark background with backdrop-filter for depth. Links are understated with subtle hover transitions.
.scandi-nav {
position: fixed;
top: 0;
left: 0;
right: 0;
z-index: 100;
display: flex;
align-items: center;
justify-content: space-between;
padding: 0 3rem;
height: 72px;
background: rgba(14, 14, 16, 0.85);
backdrop-filter: blur(20px) saturate(1.2);
-webkit-backdrop-filter: blur(20px) saturate(1.2);
border-bottom: 1px solid var(--scandi-border-subtle);
}
.scandi-nav__logo {
font-family: 'Josefin Sans', sans-serif;
font-weight: 300;
font-size: 1.1rem;
letter-spacing: 0.15em;
text-transform: uppercase;
color: var(--scandi-text-primary);
text-decoration: none;
}
.scandi-nav__links {
display: flex;
align-items: center;
gap: 2.5rem;
list-style: none;
margin: 0;
padding: 0;
}
.scandi-nav__link {
font-family: 'Inter', sans-serif;
font-weight: 400;
font-size: 0.85rem;
letter-spacing: 0.04em;
color: var(--scandi-text-muted);
text-decoration: none;
position: relative;
transition: color 0.3s ease;
}
.scandi-nav__link::after {
content: '';
position: absolute;
bottom: -4px;
left: 0;
width: 0;
height: 1px;
background: var(--scandi-accent-primary);
transition: width 0.3s ease;
}
.scandi-nav__link:hover {
color: var(--scandi-text-primary);
}
.scandi-nav__link:hover::after {
width: 100%;
}
.scandi-nav__link--active {
color: var(--scandi-accent-primary);
}
.scandi-nav__link--active::after {
width: 100%;
}
The hero section uses a full-viewport dark canvas with centered, generously spaced typography. A subtle background texture or gradient provides depth without competing with the text.
.scandi-hero {
position: relative;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
min-height: 100vh;
padding: 6rem 2rem;
text-align: center;
background: var(--scandi-bg-primary);
overflow: hidden;
}
.scandi-hero::before {
content: '';
position: absolute;
inset: 0;
background: radial-gradient(
ellipse at 50% 40%,
rgba(160, 113, 74, 0.06) 0%,
transparent 70%
);
pointer-events: none;
}
.scandi-hero__label {
font-family: 'Inter', sans-serif;
font-weight: 500;
font-size: 0.7rem;
letter-spacing: 0.2em;
text-transform: uppercase;
color: var(--scandi-accent-primary);
margin-bottom: 1.5rem;
}
.scandi-hero__title {
font-family: 'Josefin Sans', sans-serif;
font-weight: 300;
font-size: clamp(2.8rem, 6vw, 5rem);
line-height: 1.1;
letter-spacing: 0.05em;
text-transform: uppercase;
color: var(--scandi-text-primary);
max-width: 14ch;
margin-bottom: 1.5rem;
}
.scandi-hero__subtitle {
font-family: 'Inter', sans-serif;
font-weight: 300;
font-size: clamp(1rem, 2vw, 1.25rem);
line-height: 1.7;
color: var(--scandi-text-muted);
max-width: 48ch;
margin-bottom: 3rem;
}
.scandi-hero__actions {
display: flex;
gap: 1rem;
flex-wrap: wrap;
justify-content: center;
}
A systematic approach to depth using tonal shifts rather than shadows, inspired by the concept of layered dark materials (stone on slate on basalt).
/* Elevation levels for dark surfaces */
.surface-0 { background: var(--scandi-midnight); } /* Base canvas */
.surface-1 { background: var(--scandi-charcoal); } /* Primary background */
.surface-2 { background: var(--scandi-dark-slate); } /* Cards, containers */
.surface-3 { background: var(--scandi-graphite); } /* Elevated cards, modals */
.surface-4 { background: var(--scandi-ash); } /* Tooltips, dropdowns */
/* Ambient shadow system */
.elevation-1 {
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2),
0 1px 3px rgba(0, 0, 0, 0.15);
}
.elevation-2 {
box-shadow: 0 2px 6px rgba(0, 0, 0, 0.25),
0 4px 12px rgba(0, 0, 0, 0.15);
}
.elevation-3 {
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.3),
0 16px 48px rgba(0, 0, 0, 0.15);
}
Form elements maintain the dark surface language with clear focus states using the warm accent color.
.scandi-input {
font-family: 'Inter', sans-serif;
font-size: 0.95rem;
font-weight: 400;
color: var(--scandi-text-body);
background: var(--scandi-bg-surface);
border: 1px solid var(--scandi-border-subtle);
border-radius: 8px;
padding: 0.875rem 1.25rem;
width: 100%;
transition: border-color 0.3s ease, box-shadow 0.3s ease;
outline: none;
}
.scandi-input::placeholder {
color: var(--scandi-text-disabled);
}
.scandi-input:focus {
border-color: var(--scandi-accent-primary);
box-shadow: 0 0 0 3px rgba(160, 113, 74, 0.15);
}
.scandi-input-label {
font-family: 'Inter', sans-serif;
font-weight: 500;
font-size: 0.75rem;
letter-spacing: 0.1em;
text-transform: uppercase;
color: var(--scandi-text-muted);
display: block;
margin-bottom: 0.5rem;
}
Minimal separators that suggest the grain of natural materials rather than harsh graphical lines.
.scandi-divider {
border: none;
height: 1px;
background: linear-gradient(
90deg,
transparent 0%,
var(--scandi-ash) 20%,
var(--scandi-ash) 80%,
transparent 100%
);
margin: 4rem 0;
}
.scandi-divider--accent {
height: 2px;
background: linear-gradient(
90deg,
transparent 0%,
var(--scandi-accent-primary) 30%,
var(--scandi-accent-primary) 70%,
transparent 100%
);
}
.scandi-section-gap {
height: 8rem;
}
.scandi-footer {
background: var(--scandi-midnight);
border-top: 1px solid var(--scandi-border-subtle);
padding: 4rem 3rem 2rem;
}
.scandi-footer__grid {
display: grid;
grid-template-columns: 2fr repeat(3, 1fr);
gap: 3rem;
max-width: 1200px;
margin: 0 auto;
}
.scandi-footer__brand {
font-family: 'Josefin Sans', sans-serif;
font-weight: 300;
font-size: 1rem;
letter-spacing: 0.12em;
text-transform: uppercase;
color: var(--scandi-text-primary);
margin-bottom: 1rem;
}
.scandi-footer__text {
font-family: 'Inter', sans-serif;
font-size: 0.85rem;
line-height: 1.7;
color: var(--scandi-text-muted);
max-width: 30ch;
}
.scandi-footer__heading {
font-family: 'Inter', sans-serif;
font-weight: 500;
font-size: 0.7rem;
letter-spacing: 0.14em;
text-transform: uppercase;
color: var(--scandi-text-muted);
margin-bottom: 1.25rem;
}
.scandi-footer__link {
font-family: 'Inter', sans-serif;
font-size: 0.85rem;
color: var(--scandi-fog);
text-decoration: none;
display: block;
padding: 0.25rem 0;
transition: color 0.3s ease;
}
.scandi-footer__link:hover {
color: var(--scandi-accent-primary);
}
.scandi-footer__bottom {
max-width: 1200px;
margin: 3rem auto 0;
padding-top: 2rem;
border-top: 1px solid var(--scandi-border-subtle);
display: flex;
justify-content: space-between;
align-items: center;
}
.scandi-footer__copyright {
font-family: 'Inter', sans-serif;
font-size: 0.75rem;
color: var(--scandi-text-disabled);
}
#1A1A1E rather than pure #1A1A1A) to avoid a cold, sterile appearance| Aesthetic | Relationship |
|---|---|
| Scandinavian Minimalism | Direct parent – Scandinavian Dark inverts the light palette while preserving all other principles |
| Nordic Noir | Near-synonym – often used interchangeably, though Nordic Noir can lean more dramatically moody |
| Japandi | Shares material honesty and restrained palettes; blends Japanese wabi-sabi with Scandinavian function |
| Dark Mode UI | Technical cousin – Scandinavian Dark is a specific, warm, textured approach to dark interface design |
| Industrial Minimalism | Shares raw material references (concrete, steel, dark metal) but Scandinavian Dark is warmer and more refined |
| Hygge Design | The cozy, candlelit warmth within Scandinavian Dark directly channels hygge philosophy |
| Brutalist Web Design | Both reject decoration, but Brutalism is intentionally raw while Scandinavian Dark is quietly polished |
| Wabi-Sabi | Shares appreciation for natural imperfection and material authenticity, but wabi-sabi embraces visible aging more openly |
| Organic Minimalism | Overlapping emphasis on natural textures and clean lines, but Organic Minimalism typically uses lighter palettes |
| Muted Corporate | Shares the restrained palette and professional tone, but lacks Scandinavian Dark’s warmth and material depth |
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Scandinavian Dark -- Nordic Noir Template</title>
<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=Josefin+Sans:wght@300;400;600&family=Inter:wght@300;400;500;600&family=DM+Sans:wght@400;500;700&family=Cormorant+Garamond:ital,wght@0,300;0,400;1,300&display=swap" rel="stylesheet">
<style>
/* ========================================
CSS RESET & BASE
======================================== */
*, *::before, *::after {
box-sizing: border-box;
margin: 0;
padding: 0;
}
:root {
/* Dark base tones */
--scandi-midnight: #0e0e10;
--scandi-charcoal: #1a1a1e;
--scandi-dark-slate: #242428;
--scandi-graphite: #2e2e34;
--scandi-ash: #3c3c44;
/* Neutral grays */
--scandi-stone: #5a5a64;
--scandi-fog: #8a8a94;
/* Light tones */
--scandi-smoke-white: #c8c8ce;
--scandi-ivory: #e8e4de;
--scandi-warm-white: #f5f0e8;
/* Warm accents */
--scandi-smoked-oak: #6b5340;
--scandi-cognac: #a0714a;
--scandi-amber: #d4a054;
/* Cool accents */
--scandi-pine: #2a4a3a;
--scandi-fjord: #3a4a5a;
/* Functional tokens */
--bg-primary: var(--scandi-charcoal);
--bg-secondary: var(--scandi-dark-slate);
--bg-surface: var(--scandi-graphite);
--text-primary: var(--scandi-ivory);
--text-body: var(--scandi-smoke-white);
--text-muted: var(--scandi-fog);
--text-disabled: var(--scandi-stone);
--accent: var(--scandi-cognac);
--accent-hover: var(--scandi-amber);
--border-subtle: rgba(255, 255, 255, 0.06);
/* Spacing scale (8px base) */
--space-xs: 0.5rem;
--space-sm: 1rem;
--space-md: 1.5rem;
--space-lg: 2rem;
--space-xl: 3rem;
--space-2xl: 4rem;
--space-3xl: 6rem;
--space-4xl: 8rem;
}
html {
scroll-behavior: smooth;
}
body {
font-family: 'Inter', 'Helvetica Neue', Arial, sans-serif;
font-size: 1rem;
font-weight: 400;
line-height: 1.7;
color: var(--text-body);
background: var(--scandi-midnight);
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
a {
color: var(--accent);
text-decoration: none;
transition: color 0.3s ease;
}
a:hover {
color: var(--accent-hover);
}
img {
max-width: 100%;
height: auto;
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: 0 var(--space-xl);
height: 72px;
background: rgba(14, 14, 16, 0.88);
backdrop-filter: blur(24px) saturate(1.2);
-webkit-backdrop-filter: blur(24px) saturate(1.2);
border-bottom: 1px solid var(--border-subtle);
}
.nav__logo {
font-family: 'Josefin Sans', sans-serif;
font-weight: 300;
font-size: 1.05rem;
letter-spacing: 0.16em;
text-transform: uppercase;
color: var(--text-primary);
text-decoration: none;
}
.nav__links {
display: flex;
align-items: center;
gap: var(--space-lg);
list-style: none;
}
.nav__link {
font-family: 'Inter', sans-serif;
font-weight: 400;
font-size: 0.85rem;
letter-spacing: 0.03em;
color: var(--text-muted);
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(--accent);
transition: width 0.3s ease;
}
.nav__link:hover {
color: var(--text-primary);
}
.nav__link:hover::after {
width: 100%;
}
.nav__cta {
font-family: 'Inter', sans-serif;
font-weight: 500;
font-size: 0.8rem;
letter-spacing: 0.06em;
text-transform: uppercase;
padding: 0.6rem 1.4rem;
border: 1px solid var(--scandi-ash);
border-radius: 6px;
color: var(--text-body);
text-decoration: none;
transition: all 0.3s ease;
}
.nav__cta:hover {
border-color: var(--accent);
color: var(--accent);
background: rgba(160, 113, 74, 0.08);
}
/* ========================================
HERO
======================================== */
.hero {
position: relative;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
min-height: 100vh;
padding: var(--space-4xl) var(--space-lg);
text-align: center;
background: var(--bg-primary);
overflow: hidden;
}
.hero::before {
content: '';
position: absolute;
inset: 0;
background:
radial-gradient(ellipse at 50% 35%, rgba(160, 113, 74, 0.07) 0%, transparent 60%),
radial-gradient(ellipse at 80% 70%, rgba(58, 74, 90, 0.05) 0%, transparent 50%);
pointer-events: none;
}
.hero__label {
font-family: 'Inter', sans-serif;
font-weight: 500;
font-size: 0.7rem;
letter-spacing: 0.22em;
text-transform: uppercase;
color: var(--accent);
margin-bottom: var(--space-md);
position: relative;
}
.hero__title {
font-family: 'Josefin Sans', sans-serif;
font-weight: 300;
font-size: clamp(2.6rem, 6vw, 4.8rem);
line-height: 1.1;
letter-spacing: 0.05em;
text-transform: uppercase;
color: var(--text-primary);
max-width: 15ch;
margin-bottom: var(--space-md);
position: relative;
}
.hero__subtitle {
font-family: 'Inter', sans-serif;
font-weight: 300;
font-size: clamp(1rem, 2vw, 1.2rem);
line-height: 1.8;
color: var(--text-muted);
max-width: 50ch;
margin-bottom: var(--space-xl);
position: relative;
}
.hero__actions {
display: flex;
gap: var(--space-sm);
flex-wrap: wrap;
justify-content: center;
position: relative;
}
/* ========================================
BUTTONS
======================================== */
.btn {
font-family: 'Inter', sans-serif;
font-weight: 500;
font-size: 0.82rem;
letter-spacing: 0.08em;
text-transform: uppercase;
padding: 0.9rem 2.2rem;
border-radius: 8px;
border: none;
cursor: pointer;
transition: all 0.3s ease;
display: inline-flex;
align-items: center;
gap: 0.5rem;
text-decoration: none;
}
.btn--primary {
background: var(--accent);
color: var(--scandi-warm-white);
box-shadow: 0 2px 10px rgba(160, 113, 74, 0.2);
}
.btn--primary:hover {
background: var(--accent-hover);
color: var(--scandi-midnight);
box-shadow: 0 4px 20px rgba(212, 160, 84, 0.25);
transform: translateY(-1px);
}
.btn--secondary {
background: transparent;
color: var(--text-body);
border: 1px solid var(--scandi-ash);
}
.btn--secondary:hover {
border-color: var(--accent);
color: var(--accent);
background: rgba(160, 113, 74, 0.06);
}
/* ========================================
SECTION LAYOUT
======================================== */
.section {
padding: var(--space-4xl) var(--space-lg);
}
.section__inner {
max-width: 1200px;
margin: 0 auto;
}
.section__label {
font-family: 'Inter', sans-serif;
font-weight: 500;
font-size: 0.7rem;
letter-spacing: 0.18em;
text-transform: uppercase;
color: var(--accent);
margin-bottom: var(--space-sm);
}
.section__title {
font-family: 'DM Sans', sans-serif;
font-weight: 500;
font-size: clamp(1.6rem, 3.5vw, 2.4rem);
line-height: 1.2;
letter-spacing: 0.02em;
color: var(--text-primary);
margin-bottom: var(--space-sm);
}
.section__subtitle {
font-family: 'Inter', sans-serif;
font-weight: 400;
font-size: 1rem;
line-height: 1.7;
color: var(--text-muted);
max-width: 55ch;
margin-bottom: var(--space-2xl);
}
.divider {
border: none;
height: 1px;
background: linear-gradient(90deg, transparent, var(--scandi-ash), transparent);
margin: 0;
}
/* ========================================
CARDS GRID
======================================== */
.cards {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(320px, 1fr));
gap: var(--space-lg);
}
.card {
background: var(--bg-secondary);
border: 1px solid var(--border-subtle);
border-radius: 12px;
padding: var(--space-lg);
transition: background 0.3s ease, transform 0.3s ease, box-shadow 0.3s ease;
}
.card:hover {
background: var(--bg-surface);
transform: translateY(-3px);
box-shadow: 0 8px 30px rgba(0, 0, 0, 0.3);
}
.card__icon {
width: 48px;
height: 48px;
border-radius: 10px;
background: rgba(160, 113, 74, 0.1);
display: flex;
align-items: center;
justify-content: center;
margin-bottom: var(--space-md);
font-size: 1.4rem;
}
.card__title {
font-family: 'DM Sans', sans-serif;
font-weight: 500;
font-size: 1.15rem;
color: var(--text-primary);
margin-bottom: var(--space-xs);
}
.card__text {
font-family: 'Inter', sans-serif;
font-size: 0.9rem;
line-height: 1.7;
color: var(--text-muted);
}
/* ========================================
FEATURE SECTION (SPLIT LAYOUT)
======================================== */
.feature {
display: grid;
grid-template-columns: 1fr 1fr;
gap: var(--space-3xl);
align-items: center;
}
.feature--reverse {
direction: rtl;
}
.feature--reverse > * {
direction: ltr;
}
.feature__image {
aspect-ratio: 4 / 3;
background: var(--bg-secondary);
border-radius: 12px;
border: 1px solid var(--border-subtle);
overflow: hidden;
display: flex;
align-items: center;
justify-content: center;
}
.feature__image-placeholder {
font-family: 'Inter', sans-serif;
font-size: 0.75rem;
letter-spacing: 0.12em;
text-transform: uppercase;
color: var(--text-disabled);
}
.feature__content {
padding: var(--space-lg) 0;
}
.feature__label {
font-family: 'Inter', sans-serif;
font-weight: 500;
font-size: 0.7rem;
letter-spacing: 0.16em;
text-transform: uppercase;
color: var(--accent);
margin-bottom: var(--space-sm);
}
.feature__title {
font-family: 'DM Sans', sans-serif;
font-weight: 500;
font-size: 1.8rem;
line-height: 1.25;
color: var(--text-primary);
margin-bottom: var(--space-sm);
}
.feature__text {
font-family: 'Inter', sans-serif;
font-size: 0.95rem;
line-height: 1.8;
color: var(--text-muted);
margin-bottom: var(--space-lg);
}
/* ========================================
QUOTE / TESTIMONIAL
======================================== */
.quote-section {
text-align: center;
padding: var(--space-4xl) var(--space-lg);
}
.quote {
max-width: 700px;
margin: 0 auto;
}
.quote__text {
font-family: 'Cormorant Garamond', serif;
font-weight: 300;
font-style: italic;
font-size: clamp(1.3rem, 2.5vw, 1.8rem);
line-height: 1.6;
color: var(--text-primary);
margin-bottom: var(--space-lg);
}
.quote__attribution {
font-family: 'Inter', sans-serif;
font-weight: 500;
font-size: 0.75rem;
letter-spacing: 0.14em;
text-transform: uppercase;
color: var(--text-disabled);
}
.quote__attribution span {
color: var(--accent);
}
/* ========================================
FORM / CONTACT
======================================== */
.form {
max-width: 560px;
}
.form__group {
margin-bottom: var(--space-md);
}
.form__label {
font-family: 'Inter', sans-serif;
font-weight: 500;
font-size: 0.72rem;
letter-spacing: 0.1em;
text-transform: uppercase;
color: var(--text-muted);
display: block;
margin-bottom: var(--space-xs);
}
.form__input,
.form__textarea {
font-family: 'Inter', sans-serif;
font-size: 0.95rem;
color: var(--text-body);
background: var(--bg-surface);
border: 1px solid var(--border-subtle);
border-radius: 8px;
padding: 0.875rem 1.25rem;
width: 100%;
outline: none;
transition: border-color 0.3s ease, box-shadow 0.3s ease;
}
.form__input:focus,
.form__textarea:focus {
border-color: var(--accent);
box-shadow: 0 0 0 3px rgba(160, 113, 74, 0.12);
}
.form__input::placeholder,
.form__textarea::placeholder {
color: var(--text-disabled);
}
.form__textarea {
resize: vertical;
min-height: 140px;
}
/* ========================================
FOOTER
======================================== */
.footer {
background: var(--scandi-midnight);
border-top: 1px solid var(--border-subtle);
padding: var(--space-2xl) var(--space-xl) var(--space-lg);
}
.footer__inner {
max-width: 1200px;
margin: 0 auto;
}
.footer__grid {
display: grid;
grid-template-columns: 2fr repeat(3, 1fr);
gap: var(--space-xl);
margin-bottom: var(--space-2xl);
}
.footer__brand {
font-family: 'Josefin Sans', sans-serif;
font-weight: 300;
font-size: 0.95rem;
letter-spacing: 0.14em;
text-transform: uppercase;
color: var(--text-primary);
margin-bottom: var(--space-sm);
}
.footer__text {
font-family: 'Inter', sans-serif;
font-size: 0.85rem;
line-height: 1.7;
color: var(--text-muted);
max-width: 28ch;
}
.footer__heading {
font-family: 'Inter', sans-serif;
font-weight: 500;
font-size: 0.68rem;
letter-spacing: 0.14em;
text-transform: uppercase;
color: var(--text-muted);
margin-bottom: var(--space-sm);
}
.footer__links {
list-style: none;
}
.footer__link {
font-family: 'Inter', sans-serif;
font-size: 0.85rem;
color: var(--scandi-fog);
text-decoration: none;
display: block;
padding: 0.2rem 0;
transition: color 0.3s ease;
}
.footer__link:hover {
color: var(--accent);
}
.footer__bottom {
padding-top: var(--space-lg);
border-top: 1px solid var(--border-subtle);
display: flex;
justify-content: space-between;
align-items: center;
}
.footer__copy {
font-family: 'Inter', sans-serif;
font-size: 0.75rem;
color: var(--text-disabled);
}
.footer__socials {
display: flex;
gap: var(--space-sm);
}
.footer__social {
width: 36px;
height: 36px;
border-radius: 8px;
border: 1px solid var(--border-subtle);
display: flex;
align-items: center;
justify-content: center;
color: var(--text-muted);
text-decoration: none;
font-size: 0.85rem;
transition: all 0.3s ease;
}
.footer__social:hover {
border-color: var(--accent);
color: var(--accent);
background: rgba(160, 113, 74, 0.08);
}
/* ========================================
RESPONSIVE
======================================== */
@media (max-width: 768px) {
.nav {
padding: 0 var(--space-md);
}
.nav__links {
display: none;
}
.hero {
padding: 8rem var(--space-md) var(--space-3xl);
}
.section {
padding: var(--space-3xl) var(--space-md);
}
.feature {
grid-template-columns: 1fr;
gap: var(--space-lg);
}
.feature--reverse {
direction: ltr;
}
.footer__grid {
grid-template-columns: 1fr 1fr;
}
.footer__bottom {
flex-direction: column;
gap: var(--space-sm);
text-align: center;
}
}
@media (max-width: 480px) {
.cards {
grid-template-columns: 1fr;
}
.footer__grid {
grid-template-columns: 1fr;
}
}
</style>
</head>
<body>
<!-- ====== NAVIGATION ====== -->
<nav class="nav" role="navigation" aria-label="Main navigation">
<a href="#" class="nav__logo">Nordvik</a>
<ul class="nav__links">
<li><a href="#features" class="nav__link">Features</a></li>
<li><a href="#work" class="nav__link">Work</a></li>
<li><a href="#about" class="nav__link">About</a></li>
<li><a href="#contact" class="nav__link">Contact</a></li>
</ul>
<a href="#contact" class="nav__cta">Get in Touch</a>
</nav>
<!-- ====== HERO ====== -->
<section class="hero">
<p class="hero__label">Nordic Design Studio</p>
<h1 class="hero__title">Designed in Darkness</h1>
<p class="hero__subtitle">
We craft digital experiences rooted in Scandinavian minimalism --
where dark palettes meet warm materials, and every pixel serves a purpose.
</p>
<div class="hero__actions">
<a href="#work" class="btn btn--primary">View Our Work</a>
<a href="#about" class="btn btn--secondary">Learn More</a>
</div>
</section>
<hr class="divider">
<!-- ====== FEATURES / CARDS ====== -->
<section class="section" id="features">
<div class="section__inner">
<p class="section__label">What We Do</p>
<h2 class="section__title">Crafted with Intention</h2>
<p class="section__subtitle">
Every project begins with restraint. We remove the unnecessary
until only the essential remains -- then we refine it.
</p>
<div class="cards">
<article class="card">
<div class="card__icon" aria-hidden="true">◆</div>
<h3 class="card__title">Brand Identity</h3>
<p class="card__text">
Minimal, enduring brand systems built on Scandinavian design
principles. From mark to motion, every element is purposeful.
</p>
</article>
<article class="card">
<div class="card__icon" aria-hidden="true">◇</div>
<h3 class="card__title">Digital Product</h3>
<p class="card__text">
Dark-mode-first interfaces with exceptional usability.
We design products that feel calm, confident, and natural.
</p>
</article>
<article class="card">
<div class="card__icon" aria-hidden="true">◈</div>
<h3 class="card__title">Art Direction</h3>
<p class="card__text">
Photography, material selection, and visual tone guided
by the Nordic landscape -- fog, stone, timber, and quiet light.
</p>
</article>
</div>
</div>
</section>
<hr class="divider">
<!-- ====== FEATURE SPLIT 1 ====== -->
<section class="section" id="work">
<div class="section__inner">
<div class="feature">
<div class="feature__image">
<span class="feature__image-placeholder">Project Image</span>
</div>
<div class="feature__content">
<p class="feature__label">Case Study</p>
<h2 class="feature__title">Fjord Living Interiors</h2>
<p class="feature__text">
A complete brand and digital platform for a Norwegian furniture
studio specializing in charred oak and blackened steel pieces.
The interface mirrors the materiality of the product -- dark,
warm, and tactile.
</p>
<a href="#" class="btn btn--secondary">View Project</a>
</div>
</div>
</div>
</section>
<!-- ====== FEATURE SPLIT 2 (REVERSED) ====== -->
<section class="section">
<div class="section__inner">
<div class="feature feature--reverse">
<div class="feature__image">
<span class="feature__image-placeholder">Project Image</span>
</div>
<div class="feature__content">
<p class="feature__label">Case Study</p>
<h2 class="feature__title">Skov Ceramics</h2>
<p class="feature__text">
E-commerce experience for a Danish ceramics brand. Dark stoneware
demanded a dark interface -- matte surfaces, amber lighting cues,
and photography that celebrates the texture of each piece.
</p>
<a href="#" class="btn btn--secondary">View Project</a>
</div>
</div>
</div>
</section>
<hr class="divider">
<!-- ====== QUOTE ====== -->
<section class="quote-section">
<div class="quote">
<p class="quote__text">
"The best design is the least design. In darkness, what remains
is what matters -- form, material, and the warmth of intention."
</p>
<p class="quote__attribution">
-- <span>Astrid Lindberg</span>, Creative Director
</p>
</div>
</section>
<hr class="divider">
<!-- ====== ABOUT / CONTACT ====== -->
<section class="section" id="about">
<div class="section__inner">
<div class="feature">
<div class="feature__content" id="contact">
<p class="feature__label">Get in Touch</p>
<h2 class="feature__title">Start a Conversation</h2>
<p class="feature__text">
We work with brands that value simplicity, quality, and the
quiet confidence of Nordic design. Tell us about your project.
</p>
<form class="form" onsubmit="return false;">
<div class="form__group">
<label class="form__label" for="name">Name</label>
<input class="form__input" type="text" id="name" placeholder="Your name">
</div>
<div class="form__group">
<label class="form__label" for="email">Email</label>
<input class="form__input" type="email" id="email" placeholder="your@email.com">
</div>
<div class="form__group">
<label class="form__label" for="message">Message</label>
<textarea class="form__textarea" id="message" placeholder="Tell us about your project..."></textarea>
</div>
<button type="submit" class="btn btn--primary">Send Message</button>
</form>
</div>
<div class="feature__image">
<span class="feature__image-placeholder">Studio Photo</span>
</div>
</div>
</div>
</section>
<!-- ====== FOOTER ====== -->
<footer class="footer">
<div class="footer__inner">
<div class="footer__grid">
<div>
<p class="footer__brand">Nordvik</p>
<p class="footer__text">
A Nordic design studio crafting dark, warm,
and purposeful digital experiences.
</p>
</div>
<div>
<p class="footer__heading">Studio</p>
<ul class="footer__links">
<li><a href="#" class="footer__link">About</a></li>
<li><a href="#" class="footer__link">Careers</a></li>
<li><a href="#" class="footer__link">Process</a></li>
<li><a href="#" class="footer__link">Contact</a></li>
</ul>
</div>
<div>
<p class="footer__heading">Work</p>
<ul class="footer__links">
<li><a href="#" class="footer__link">Projects</a></li>
<li><a href="#" class="footer__link">Case Studies</a></li>
<li><a href="#" class="footer__link">Archive</a></li>
</ul>
</div>
<div>
<p class="footer__heading">Connect</p>
<ul class="footer__links">
<li><a href="#" class="footer__link">Instagram</a></li>
<li><a href="#" class="footer__link">Dribbble</a></li>
<li><a href="#" class="footer__link">LinkedIn</a></li>
</ul>
</div>
</div>
<div class="footer__bottom">
<p class="footer__copy">© 2026 Nordvik Studio. All rights reserved.</p>
<div class="footer__socials">
<a href="#" class="footer__social" aria-label="Instagram">Ig</a>
<a href="#" class="footer__social" aria-label="Dribbble">Dr</a>
<a href="#" class="footer__social" aria-label="LinkedIn">Li</a>
</div>
</div>
</div>
</footer>
</body>
</html>
--scandi-midnight or --scandi-charcoal, then layer surfaces on top using progressively lighter dark tones; never design light-first and invert#0E0E10 or #1A1A1E prevent the “infinite void” effect on OLED screens while still appearing deep black in most lighting conditionsfont-smoothing: antialiased – on macOS/WebKit browsers, this prevents light-on-dark text from appearing overly bold due to subpixel rendering; without it, thin weights will look heavier than intended:root block, and so a future light-mode toggle becomes straightforwardrgba() borders over solid colors – borders defined as rgba(255, 255, 255, 0.06) adapt automatically to surface changes and feel more natural than hard-coded gray valuesprefers-reduced-motion – wrap all hover transforms, transitions, and scroll-triggered animations in a @media (prefers-reduced-motion: no-preference) query; the calm, intentional character of Scandinavian Dark should extend to accessibility considerations