Grotesk Display is a bold, typography-driven web design aesthetic that elevates massive sans-serif letterforms into the primary visual element of a composition. Rooted in the grotesque typeface tradition that emerged in the early 19th century and was refined through Swiss International Typographic Style in the 1950s, this aesthetic strips design back to its most fundamental ingredient – type – and pushes it to monumental scale. Where traditional Swiss design used grotesk typefaces at functional sizes within rigid grids, Grotesk Display breaks those letterforms free, scaling them to viewport-filling proportions and exploiting extreme weight contrast (hairline thin against ultra-black bold) to create arresting visual hierarchy without relying on imagery, illustration, or decoration.
The ancestry runs deep. Akzidenz-Grotesk, released by the Berthold Type Foundry in 1896, pioneered the stripped-down, low-contrast sans-serif letterform. Its DNA flows directly into Neue Haas Grotesk (later renamed Helvetica), Univers, and the wave of neo-grotesque typefaces that defined mid-century modernism. Grotesk Display inherits this lineage but amplifies it: where Helvetica whispered neutrality, Grotesk Display shouts presence. Condensed grotesques like Commercial Type’s Druk (originally commissioned for Bloomberg Businessweek and inspired by historical Annonce Grotesk) exemplify the trend – punchy, compressed, and designed to fill every pixel of a headline with typographic mass.
In practice, the aesthetic manifests as websites and interfaces dominated by oversized type that serves simultaneously as content, navigation, and ornament. Body text remains minimal and restrained, creating a dramatic tension between the colossal display headings and the whisper-thin supporting copy. The color palette is deliberately reduced – often monochromatic black and white, occasionally punctuated by a single stark accent – because the typography itself carries all the visual weight. Layouts favor generous white space that allows the massive letterforms to breathe, and micro-interactions tend to be subtle: weight shifts on hover, tracking adjustments, and smooth font-size transitions that keep the focus on the type. It is modernism distilled to its typographic essence, then amplified to a scale that demands attention.
The Grotesk Display palette is deliberately austere. Rooted in the Swiss tradition of letting typography speak, the color system favors stark neutrals with minimal chromatic intervention. A single accent color – typically a pure, saturated hue – provides punctuation without competing with the massive letterforms. The palette shifts between light mode (white ground, black type) and dark mode (black ground, white type) to suit editorial context.
| Color Name | Hex | Role / Usage |
|---|---|---|
| Jet Black | #0A0A0A |
Primary text, display headings, dark backgrounds |
| Pure White | #FFFFFF |
Light backgrounds, inverse text on dark |
| Off-White | #F5F5F0 |
Secondary backgrounds, paper-like warmth |
| Light Gray | #E8E8E3 |
Dividers, card backgrounds, subtle separators |
| Mid Gray | #9E9E99 |
Caption text, metadata, muted UI elements |
| Dark Gray | #3D3D3A |
Secondary text, subheadings on light backgrounds |
| Signal Red | #E63222 |
Primary accent, active states, call-to-action highlights |
| Deep Red | #B8281C |
Hover/pressed state for red accent elements |
| Electric Blue | #1A5CFF |
Link color, secondary accent for interactive elements |
| Deep Blue | #1244CC |
Hover/pressed state for blue accent elements |
| Warm Charcoal | #2A2A28 |
Dark-mode secondary backgrounds, footer areas |
| Stone | #C8C4BC |
Borders, inactive UI elements, neutral separators |
| Ink | #1A1A18 |
Alternate dark for softer-than-pure-black compositions |
| Cream | #FAF8F2 |
Warm light-mode background alternative |
| Highlight Yellow | #FFE424 |
Rare tertiary accent for emphasis, badges, markers |
:root {
/* Neutrals */
--gd-black: #0a0a0a;
--gd-white: #ffffff;
--gd-off-white: #f5f5f0;
--gd-cream: #faf8f2;
--gd-light-gray: #e8e8e3;
--gd-mid-gray: #9e9e99;
--gd-dark-gray: #3d3d3a;
--gd-stone: #c8c4bc;
--gd-charcoal: #2a2a28;
--gd-ink: #1a1a18;
/* Accent – Red */
--gd-red: #e63222;
--gd-red-hover: #b8281c;
/* Accent – Blue */
--gd-blue: #1a5cff;
--gd-blue-hover: #1244cc;
/* Accent – Yellow (rare) */
--gd-yellow: #ffe424;
/* Semantic */
--gd-bg-primary: #ffffff;
--gd-bg-secondary: #f5f5f0;
--gd-bg-dark: #0a0a0a;
--gd-bg-dark-secondary: #2a2a28;
--gd-text-primary: #0a0a0a;
--gd-text-secondary: #3d3d3a;
--gd-text-muted: #9e9e99;
--gd-text-inverse: #ffffff;
--gd-border: #e8e8e3;
--gd-border-dark: #3d3d3a;
}
Grotesk Display typography is defined by:
| Font | Style | Best For |
|---|---|---|
| Space Grotesk | Geometric grotesque, 5 weights | Headlines and display; idiosyncratic details add character |
| Familjen Grotesk | Contemporary grotesque | Display and text; bridges editorial and functional roles |
| Inter | Neo-grotesque, variable | Body text, UI; extremely legible at all sizes |
| Work Sans | Geometric grotesque, 9 weights | Body text, labels; excellent weight range |
| Darker Grotesque | High-contrast grotesque, 9 weights | Display headings; dramatic weight extremes from 300-900 |
| Hanken Grotesk | Clean neo-grotesque | Subheadings, navigation; neutral and versatile |
| Albert Sans | Geometric grotesque, variable | Body text; modern, clean, and highly legible |
| Schibsted Grotesk | Editorial grotesque | Headlines and body; strong personality for editorial layouts |
| Archivo | Grotesque with geometric leanings | Versatile heading and body font; wide weight range |
| Bricolage Grotesque | Display grotesque, variable | Large display text; distinctive character at big sizes |
| Heading Font | Body Font | Character |
|---|---|---|
| Space Grotesk (700) | Inter (400) | Tech-forward, modern clarity |
| Darker Grotesque (900) | Work Sans (400) | Maximum weight contrast, editorial drama |
| Familjen Grotesk (700) | Albert Sans (400) | Refined and contemporary |
| Bricolage Grotesque (800) | Inter (400) | Display personality with functional body |
| Schibsted Grotesk (700) | Hanken Grotesk (400) | Editorial, Scandinavian-influenced |
| Archivo (800) | Archivo (400) | Monofamily, cohesive at all sizes |
/* Import fonts */
@import url('https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@300;400;500;600;700&family=Inter:wght@300;400;500;600&display=swap');
/* Headings */
h1, h2, h3, h4, h5, h6 {
font-family: 'Space Grotesk', 'Helvetica Neue', Arial, sans-serif;
font-weight: 700;
color: var(--gd-text-primary);
line-height: 1.0;
letter-spacing: -0.03em;
}
/* Display / Hero text */
.gd-display {
font-family: 'Space Grotesk', sans-serif;
font-size: clamp(3.5rem, 12vw, 12rem);
font-weight: 700;
letter-spacing: -0.04em;
line-height: 0.9;
text-transform: uppercase;
}
/* Display thin variant for contrast */
.gd-display--thin {
font-weight: 300;
letter-spacing: -0.02em;
}
/* Body text */
body {
font-family: 'Inter', 'Helvetica Neue', Arial, sans-serif;
font-weight: 400;
font-size: 1rem;
line-height: 1.65;
color: var(--gd-text-secondary);
}
/* Labels and overlines */
.gd-label {
font-family: 'Space Grotesk', sans-serif;
font-weight: 500;
font-size: 0.75rem;
letter-spacing: 0.12em;
text-transform: uppercase;
color: var(--gd-text-muted);
}
/* Large body / lead paragraph */
.gd-lead {
font-family: 'Inter', sans-serif;
font-weight: 300;
font-size: 1.25rem;
line-height: 1.7;
color: var(--gd-text-secondary);
max-width: 540px;
}
/* Caption */
.gd-caption {
font-family: 'Inter', sans-serif;
font-weight: 400;
font-size: 0.8rem;
color: var(--gd-text-muted);
line-height: 1.5;
}
.gd-card {
background: var(--gd-white);
border-bottom: 2px solid var(--gd-border);
padding: 40px 0;
display: block;
text-decoration: none;
color: inherit;
transition: border-color 0.3s ease;
}
.gd-card:hover {
border-color: var(--gd-black);
}
.gd-card__label {
font-family: 'Space Grotesk', sans-serif;
font-weight: 500;
font-size: 0.7rem;
letter-spacing: 0.12em;
text-transform: uppercase;
color: var(--gd-text-muted);
margin-bottom: 12px;
}
.gd-card__title {
font-family: 'Space Grotesk', sans-serif;
font-size: clamp(1.5rem, 3vw, 2.5rem);
font-weight: 700;
letter-spacing: -0.02em;
line-height: 1.05;
margin-bottom: 16px;
transition: letter-spacing 0.3s ease;
}
.gd-card:hover .gd-card__title {
letter-spacing: 0em;
}
.gd-card__body {
font-family: 'Inter', sans-serif;
font-size: 0.95rem;
color: var(--gd-text-muted);
max-width: 480px;
line-height: 1.6;
}
.gd-card-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(340px, 1fr));
gap: 0;
}
.gd-button {
display: inline-flex;
align-items: center;
gap: 10px;
background: var(--gd-black);
color: var(--gd-white);
border: 2px solid var(--gd-black);
border-radius: 0;
padding: 14px 32px;
font-family: 'Space Grotesk', sans-serif;
font-weight: 600;
font-size: 0.85rem;
letter-spacing: 0.08em;
text-transform: uppercase;
cursor: pointer;
text-decoration: none;
transition: background 0.25s ease, color 0.25s ease, letter-spacing 0.25s ease;
}
.gd-button:hover {
background: transparent;
color: var(--gd-black);
letter-spacing: 0.14em;
}
/* Outline variant */
.gd-button--outline {
background: transparent;
color: var(--gd-black);
}
.gd-button--outline:hover {
background: var(--gd-black);
color: var(--gd-white);
letter-spacing: 0.08em;
}
/* Accent variant */
.gd-button--accent {
background: var(--gd-red);
border-color: var(--gd-red);
}
.gd-button--accent:hover {
background: var(--gd-red-hover);
border-color: var(--gd-red-hover);
color: var(--gd-white);
letter-spacing: 0.08em;
}
/* Inverse for dark backgrounds */
.gd-button--inverse {
background: var(--gd-white);
color: var(--gd-black);
border-color: var(--gd-white);
}
.gd-button--inverse:hover {
background: transparent;
color: var(--gd-white);
}
/* Arrow icon pseudo-element */
.gd-button__arrow {
display: inline-block;
transition: transform 0.25s ease;
}
.gd-button:hover .gd-button__arrow {
transform: translateX(4px);
}
.gd-nav {
display: flex;
align-items: center;
justify-content: space-between;
max-width: 1200px;
margin: 0 auto;
padding: 28px 40px;
border-bottom: 1px solid var(--gd-border);
}
.gd-nav__logo {
font-family: 'Space Grotesk', sans-serif;
font-weight: 700;
font-size: 1.2rem;
color: var(--gd-black);
text-decoration: none;
text-transform: uppercase;
letter-spacing: 0.06em;
}
.gd-nav__links {
display: flex;
gap: 36px;
list-style: none;
margin: 0;
padding: 0;
}
.gd-nav__links a {
font-family: 'Inter', sans-serif;
font-weight: 400;
font-size: 0.85rem;
color: var(--gd-text-muted);
text-decoration: none;
letter-spacing: 0.02em;
transition: color 0.2s ease;
}
.gd-nav__links a:hover {
color: var(--gd-black);
}
.gd-nav__links a.active {
color: var(--gd-black);
font-weight: 500;
}
/* Dark variant */
.gd-nav--dark {
border-color: var(--gd-border-dark);
}
.gd-nav--dark .gd-nav__logo {
color: var(--gd-white);
}
.gd-nav--dark .gd-nav__links a {
color: var(--gd-mid-gray);
}
.gd-nav--dark .gd-nav__links a:hover,
.gd-nav--dark .gd-nav__links a.active {
color: var(--gd-white);
}
.gd-hero {
display: flex;
flex-direction: column;
justify-content: center;
min-height: 100vh;
max-width: 1200px;
margin: 0 auto;
padding: 120px 40px 80px;
position: relative;
}
.gd-hero__heading {
font-family: 'Space Grotesk', sans-serif;
font-size: clamp(4rem, 14vw, 14rem);
font-weight: 700;
letter-spacing: -0.05em;
line-height: 0.85;
text-transform: uppercase;
color: var(--gd-text-primary);
margin-bottom: 48px;
}
.gd-hero__heading em {
font-style: normal;
font-weight: 300;
letter-spacing: -0.02em;
}
.gd-hero__heading .accent {
color: var(--gd-red);
}
.gd-hero__body {
display: flex;
justify-content: space-between;
align-items: flex-end;
gap: 40px;
}
.gd-hero__intro {
font-family: 'Inter', sans-serif;
font-weight: 300;
font-size: 1.15rem;
color: var(--gd-text-secondary);
max-width: 440px;
line-height: 1.7;
}
.gd-hero__meta {
font-family: 'Space Grotesk', sans-serif;
font-size: 0.7rem;
font-weight: 500;
letter-spacing: 0.1em;
text-transform: uppercase;
color: var(--gd-text-muted);
text-align: right;
}
@media (max-width: 768px) {
.gd-hero {
min-height: auto;
padding: 80px 24px 60px;
}
.gd-hero__body {
flex-direction: column;
align-items: flex-start;
}
.gd-hero__meta {
text-align: left;
}
}
.gd-divider {
max-width: 1200px;
margin: 0 auto;
padding: 0 40px;
}
.gd-divider hr {
border: none;
height: 1px;
background: var(--gd-border);
}
.gd-divider--dark hr {
background: var(--gd-border-dark);
}
.gd-divider--heavy hr {
height: 3px;
background: var(--gd-black);
}
.gd-content-row {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 80px;
max-width: 1200px;
margin: 0 auto;
padding: 80px 40px;
align-items: start;
}
.gd-content-row__label {
font-family: 'Space Grotesk', sans-serif;
font-weight: 500;
font-size: 0.7rem;
letter-spacing: 0.12em;
text-transform: uppercase;
color: var(--gd-text-muted);
margin-bottom: 16px;
}
.gd-content-row__heading {
font-family: 'Space Grotesk', sans-serif;
font-size: clamp(2rem, 4vw, 3.5rem);
font-weight: 700;
letter-spacing: -0.03em;
line-height: 1.05;
margin-bottom: 24px;
}
.gd-content-row__text {
font-family: 'Inter', sans-serif;
font-size: 1rem;
color: var(--gd-text-secondary);
line-height: 1.7;
max-width: 480px;
}
@media (max-width: 768px) {
.gd-content-row {
grid-template-columns: 1fr;
gap: 40px;
padding: 60px 24px;
}
}
.gd-dark-section {
background: var(--gd-bg-dark);
color: var(--gd-text-inverse);
padding: 120px 0;
}
.gd-dark-section h2 {
color: var(--gd-white);
}
.gd-dark-section p {
color: var(--gd-mid-gray);
}
.gd-dark-section .gd-label {
color: var(--gd-mid-gray);
}
/* Large centered statement */
.gd-statement {
max-width: 1200px;
margin: 0 auto;
padding: 0 40px;
text-align: center;
}
.gd-statement__text {
font-family: 'Space Grotesk', sans-serif;
font-size: clamp(2rem, 5vw, 4.5rem);
font-weight: 700;
letter-spacing: -0.03em;
line-height: 1.05;
max-width: 900px;
margin: 0 auto;
}
.gd-statement__text em {
font-style: normal;
font-weight: 300;
color: var(--gd-mid-gray);
}
.gd-footer {
background: var(--gd-bg-dark);
color: var(--gd-mid-gray);
border-top: 1px solid var(--gd-border-dark);
}
.gd-footer__inner {
display: flex;
justify-content: space-between;
align-items: center;
max-width: 1200px;
margin: 0 auto;
padding: 32px 40px;
}
.gd-footer__brand {
font-family: 'Space Grotesk', sans-serif;
font-weight: 700;
font-size: 0.85rem;
letter-spacing: 0.06em;
text-transform: uppercase;
color: var(--gd-white);
}
.gd-footer__links {
display: flex;
gap: 24px;
list-style: none;
margin: 0;
padding: 0;
}
.gd-footer__links a {
font-family: 'Inter', sans-serif;
font-size: 0.8rem;
color: var(--gd-mid-gray);
text-decoration: none;
transition: color 0.2s ease;
}
.gd-footer__links a:hover {
color: var(--gd-white);
}
.gd-footer__copy {
font-size: 0.75rem;
color: var(--gd-mid-gray);
}
@media (max-width: 768px) {
.gd-footer__inner {
flex-direction: column;
gap: 20px;
text-align: center;
padding: 28px 24px;
}
}
| Aesthetic | Relationship to Grotesk Display |
|---|---|
| International Typographic Style | Direct ancestor; Swiss Style established the grotesque typeface, grid system, and objective clarity that Grotesk Display inherits and amplifies |
| Brutalist Web Design | Shares the raw, unadorned approach and bold typographic scale, but Brutalist embraces deliberate ugliness where Grotesk Display seeks refined impact |
| Minimalism | Parallel reductive philosophy; both strip away ornament, but Grotesk Display uses massive type scale as a maximalist gesture within a minimal framework |
| Editorial Design | Magazine and newspaper layouts pioneered the oversized headline / restrained body text dynamic that defines Grotesk Display on the web |
| Bauhaus | Shared geometric sans-serif foundation and functional design principles; Bauhaus adds color and shape where Grotesk Display focuses purely on type |
| Flat Design | Both reject dimensionality and ornament; Flat Design distributes visual weight across UI components while Grotesk Display concentrates it in typography |
| Neo-Brutalism | Shares bold graphic presence and boundary-pushing scale, but adds color blocks and visible borders where Grotesk Display remains monochromatic |
| Kinetic Typography | Extends the Grotesk Display philosophy into motion; animated type becomes the entire visual experience |
| Corporate Memphis | Opposite approach – uses illustration and color as primary elements, whereas Grotesk Display asserts that type alone is sufficient |
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Grotesk Display</title>
<link href="https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@300;400;500;600;700&family=Inter:wght@300;400;500;600&display=swap" rel="stylesheet">
<style>
:root {
--gd-black: #0a0a0a;
--gd-white: #ffffff;
--gd-off-white: #f5f5f0;
--gd-cream: #faf8f2;
--gd-light-gray: #e8e8e3;
--gd-mid-gray: #9e9e99;
--gd-dark-gray: #3d3d3a;
--gd-stone: #c8c4bc;
--gd-charcoal: #2a2a28;
--gd-ink: #1a1a18;
--gd-red: #e63222;
--gd-red-hover: #b8281c;
--gd-blue: #1a5cff;
--gd-blue-hover: #1244cc;
--gd-yellow: #ffe424;
}
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
html {
scroll-behavior: smooth;
}
body {
background: var(--gd-white);
color: var(--gd-black);
font-family: 'Inter', 'Helvetica Neue', Arial, sans-serif;
font-weight: 400;
line-height: 1.65;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
h1, h2, h3, h4 {
font-family: 'Space Grotesk', sans-serif;
font-weight: 700;
line-height: 1.0;
letter-spacing: -0.03em;
}
/* Navigation */
nav {
display: flex;
align-items: center;
justify-content: space-between;
max-width: 1200px;
margin: 0 auto;
padding: 28px 40px;
border-bottom: 1px solid var(--gd-light-gray);
}
nav .logo {
font-family: 'Space Grotesk', sans-serif;
font-weight: 700;
font-size: 1.15rem;
color: var(--gd-black);
text-decoration: none;
text-transform: uppercase;
letter-spacing: 0.06em;
}
nav ul {
display: flex;
gap: 32px;
list-style: none;
}
nav ul a {
font-family: 'Inter', sans-serif;
font-weight: 400;
font-size: 0.85rem;
color: var(--gd-mid-gray);
text-decoration: none;
transition: color 0.2s ease;
}
nav ul a:hover {
color: var(--gd-black);
}
/* Hero */
.hero {
display: flex;
flex-direction: column;
justify-content: center;
min-height: 92vh;
max-width: 1200px;
margin: 0 auto;
padding: 100px 40px 80px;
}
.hero h1 {
font-size: clamp(4rem, 13vw, 13rem);
font-weight: 700;
letter-spacing: -0.05em;
line-height: 0.85;
text-transform: uppercase;
margin-bottom: 48px;
}
.hero h1 .thin {
font-weight: 300;
letter-spacing: -0.02em;
}
.hero h1 .accent {
color: var(--gd-red);
}
.hero-bottom {
display: flex;
justify-content: space-between;
align-items: flex-end;
gap: 40px;
padding-top: 40px;
border-top: 1px solid var(--gd-light-gray);
}
.hero-intro {
font-weight: 300;
font-size: 1.1rem;
color: var(--gd-dark-gray);
max-width: 420px;
line-height: 1.7;
}
.hero-scroll {
font-family: 'Space Grotesk', sans-serif;
font-size: 0.7rem;
font-weight: 500;
letter-spacing: 0.1em;
text-transform: uppercase;
color: var(--gd-mid-gray);
text-align: right;
white-space: nowrap;
}
.hero-scroll span {
display: block;
margin-top: 8px;
font-size: 1.4rem;
letter-spacing: 0;
animation: bounce 2s infinite;
}
@keyframes bounce {
0%, 100% { transform: translateY(0); }
50% { transform: translateY(6px); }
}
/* Divider */
.divider {
max-width: 1200px;
margin: 0 auto;
padding: 0 40px;
}
.divider hr {
border: none;
height: 1px;
background: var(--gd-light-gray);
}
/* About / Content Row */
.content-row {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 80px;
max-width: 1200px;
margin: 0 auto;
padding: 100px 40px;
align-items: start;
}
.content-row .label {
font-family: 'Space Grotesk', sans-serif;
font-weight: 500;
font-size: 0.7rem;
letter-spacing: 0.12em;
text-transform: uppercase;
color: var(--gd-mid-gray);
margin-bottom: 20px;
}
.content-row h2 {
font-size: clamp(2rem, 4vw, 3.5rem);
letter-spacing: -0.03em;
line-height: 1.05;
margin-bottom: 24px;
}
.content-row p {
font-size: 1rem;
color: var(--gd-dark-gray);
line-height: 1.7;
max-width: 480px;
}
.content-row p + p {
margin-top: 16px;
}
.content-row .stats {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 32px;
margin-top: 48px;
}
.stat-number {
font-family: 'Space Grotesk', sans-serif;
font-size: 3rem;
font-weight: 700;
letter-spacing: -0.03em;
line-height: 1;
margin-bottom: 8px;
}
.stat-label {
font-size: 0.8rem;
color: var(--gd-mid-gray);
}
/* Dark Section / Statement */
.dark-section {
background: var(--gd-black);
color: var(--gd-white);
padding: 120px 0;
}
.dark-section .inner {
max-width: 1200px;
margin: 0 auto;
padding: 0 40px;
text-align: center;
}
.dark-section .label {
font-family: 'Space Grotesk', sans-serif;
font-weight: 500;
font-size: 0.7rem;
letter-spacing: 0.12em;
text-transform: uppercase;
color: var(--gd-mid-gray);
margin-bottom: 32px;
}
.dark-section .statement {
font-family: 'Space Grotesk', sans-serif;
font-size: clamp(2rem, 5vw, 4.5rem);
font-weight: 700;
letter-spacing: -0.03em;
line-height: 1.05;
max-width: 900px;
margin: 0 auto 40px;
}
.dark-section .statement .light {
font-weight: 300;
color: var(--gd-mid-gray);
}
.dark-section .btn {
display: inline-flex;
align-items: center;
gap: 10px;
background: var(--gd-white);
color: var(--gd-black);
border: 2px solid var(--gd-white);
padding: 14px 32px;
font-family: 'Space Grotesk', sans-serif;
font-weight: 600;
font-size: 0.85rem;
letter-spacing: 0.08em;
text-transform: uppercase;
text-decoration: none;
cursor: pointer;
transition: background 0.25s ease, color 0.25s ease, letter-spacing 0.25s ease;
}
.dark-section .btn:hover {
background: transparent;
color: var(--gd-white);
letter-spacing: 0.14em;
}
/* Projects / Cards */
.projects {
max-width: 1200px;
margin: 0 auto;
padding: 100px 40px;
}
.projects .section-header {
display: flex;
justify-content: space-between;
align-items: flex-end;
margin-bottom: 60px;
padding-bottom: 24px;
border-bottom: 1px solid var(--gd-light-gray);
}
.projects .section-header h2 {
font-size: clamp(2rem, 4vw, 3.5rem);
letter-spacing: -0.03em;
}
.projects .section-header .label {
font-family: 'Space Grotesk', sans-serif;
font-weight: 500;
font-size: 0.7rem;
letter-spacing: 0.12em;
text-transform: uppercase;
color: var(--gd-mid-gray);
}
.card {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 40px;
padding: 48px 0;
border-bottom: 1px solid var(--gd-light-gray);
text-decoration: none;
color: inherit;
align-items: center;
transition: border-color 0.3s ease;
}
.card:hover {
border-color: var(--gd-black);
}
.card-visual {
background: var(--gd-off-white);
aspect-ratio: 4 / 3;
display: flex;
align-items: center;
justify-content: center;
overflow: hidden;
}
.card-visual .placeholder {
font-family: 'Space Grotesk', sans-serif;
font-size: clamp(3rem, 6vw, 5rem);
font-weight: 700;
letter-spacing: -0.04em;
color: var(--gd-stone);
text-transform: uppercase;
user-select: none;
}
.card-content .card-label {
font-family: 'Space Grotesk', sans-serif;
font-weight: 500;
font-size: 0.7rem;
letter-spacing: 0.12em;
text-transform: uppercase;
color: var(--gd-mid-gray);
margin-bottom: 12px;
}
.card-content h3 {
font-size: clamp(1.5rem, 3vw, 2.2rem);
letter-spacing: -0.02em;
line-height: 1.1;
margin-bottom: 16px;
transition: letter-spacing 0.3s ease;
}
.card:hover .card-content h3 {
letter-spacing: 0em;
}
.card-content p {
font-size: 0.95rem;
color: var(--gd-mid-gray);
line-height: 1.6;
max-width: 400px;
}
.card:nth-child(even) {
direction: rtl;
}
.card:nth-child(even) > * {
direction: ltr;
}
/* Contact / CTA */
.cta {
max-width: 1200px;
margin: 0 auto;
padding: 120px 40px;
text-align: center;
}
.cta .label {
font-family: 'Space Grotesk', sans-serif;
font-weight: 500;
font-size: 0.7rem;
letter-spacing: 0.12em;
text-transform: uppercase;
color: var(--gd-mid-gray);
margin-bottom: 24px;
}
.cta h2 {
font-size: clamp(3rem, 10vw, 10rem);
letter-spacing: -0.05em;
line-height: 0.9;
text-transform: uppercase;
margin-bottom: 40px;
}
.cta h2 .thin {
font-weight: 300;
letter-spacing: -0.02em;
}
.cta .btn {
display: inline-flex;
align-items: center;
gap: 10px;
background: var(--gd-black);
color: var(--gd-white);
border: 2px solid var(--gd-black);
padding: 16px 40px;
font-family: 'Space Grotesk', sans-serif;
font-weight: 600;
font-size: 0.85rem;
letter-spacing: 0.08em;
text-transform: uppercase;
text-decoration: none;
cursor: pointer;
transition: background 0.25s ease, color 0.25s ease, letter-spacing 0.25s ease;
}
.cta .btn:hover {
background: transparent;
color: var(--gd-black);
letter-spacing: 0.14em;
}
/* Footer */
footer {
background: var(--gd-black);
color: var(--gd-mid-gray);
border-top: 1px solid var(--gd-charcoal);
}
.footer-inner {
display: flex;
justify-content: space-between;
align-items: center;
max-width: 1200px;
margin: 0 auto;
padding: 32px 40px;
}
.footer-brand {
font-family: 'Space Grotesk', sans-serif;
font-weight: 700;
font-size: 0.85rem;
letter-spacing: 0.06em;
text-transform: uppercase;
color: var(--gd-white);
}
.footer-links {
display: flex;
gap: 24px;
list-style: none;
}
.footer-links a {
font-size: 0.8rem;
color: var(--gd-mid-gray);
text-decoration: none;
transition: color 0.2s ease;
}
.footer-links a:hover {
color: var(--gd-white);
}
.footer-copy {
font-size: 0.75rem;
}
/* Responsive */
@media (max-width: 768px) {
nav {
padding: 20px 24px;
}
nav ul {
gap: 20px;
}
.hero {
min-height: auto;
padding: 60px 24px 48px;
}
.hero-bottom {
flex-direction: column;
align-items: flex-start;
}
.hero-scroll {
text-align: left;
}
.content-row {
grid-template-columns: 1fr;
gap: 40px;
padding: 60px 24px;
}
.content-row .stats {
grid-template-columns: 1fr 1fr;
gap: 24px;
}
.dark-section {
padding: 80px 0;
}
.projects {
padding: 60px 24px;
}
.card {
grid-template-columns: 1fr;
gap: 24px;
padding: 32px 0;
}
.card:nth-child(even) {
direction: ltr;
}
.cta {
padding: 80px 24px;
}
.divider {
padding: 0 24px;
}
.footer-inner {
flex-direction: column;
gap: 16px;
text-align: center;
padding: 28px 24px;
}
}
</style>
</head>
<body>
<!-- Navigation -->
<nav>
<a href="#" class="logo">Grotesk</a>
<ul>
<li><a href="#about">About</a></li>
<li><a href="#projects">Work</a></li>
<li><a href="#contact">Contact</a></li>
</ul>
</nav>
<!-- Hero -->
<section class="hero">
<h1>
<span class="thin">The</span> Bold<br>
Weight <span class="accent thin">of</span><br>
Type
</h1>
<div class="hero-bottom">
<p class="hero-intro">
Massive grotesque letterforms command the viewport. Swiss precision
meets display-scale drama. Typography is the design.
</p>
<div class="hero-scroll">
Scroll to explore
<span>↓</span>
</div>
</div>
</section>
<!-- Divider -->
<div class="divider"><hr></div>
<!-- About -->
<section class="content-row" id="about">
<div>
<p class="label">001 — Philosophy</p>
<h2>Type as the<br>primary material</h2>
<p>
Grotesk Display strips design to its typographic skeleton. Descended
from the sans-serif revolution that began with Akzidenz-Grotesk in 1896
and was refined by Swiss modernists in the 1950s, this aesthetic makes
a singular argument: the letterform is enough.
</p>
<p>
Scale a grotesque to viewport-filling proportions, contrast hairline
thin against ultra-black, and the result is a composition that needs
nothing more. No imagery. No illustration. Just type.
</p>
</div>
<div>
<div class="stats">
<div>
<div class="stat-number">128</div>
<div class="stat-label">Years of grotesque type heritage</div>
</div>
<div>
<div class="stat-number">14vw</div>
<div class="stat-label">Typical display heading scale</div>
</div>
<div>
<div class="stat-number">100+</div>
<div class="stat-label">Weight range: Thin to Black</div>
</div>
<div>
<div class="stat-number">2</div>
<div class="stat-label">Colors needed: black and white</div>
</div>
</div>
</div>
</section>
<!-- Divider -->
<div class="divider"><hr></div>
<!-- Dark Statement Section -->
<section class="dark-section">
<div class="inner">
<p class="label">Manifesto</p>
<p class="statement">
When type is <span class="light">bold enough,</span>
everything else becomes
<span class="light">silence.</span>
</p>
<a href="#" class="btn">
Read More
<span>→</span>
</a>
</div>
</section>
<!-- Projects -->
<section class="projects" id="projects">
<div class="section-header">
<h2>Selected<br>Work</h2>
<p class="label">002 — Projects</p>
</div>
<a href="#" class="card">
<div class="card-visual">
<span class="placeholder">Aa</span>
</div>
<div class="card-content">
<p class="card-label">Branding</p>
<h3>Typographic Identity System</h3>
<p>
A complete brand identity built exclusively from grotesque
letterforms, weight contrast, and negative space.
</p>
</div>
</a>
<a href="#" class="card">
<div class="card-visual">
<span class="placeholder">Rg</span>
</div>
<div class="card-content">
<p class="card-label">Editorial</p>
<h3>Display Magazine Redesign</h3>
<p>
Oversized condensed headlines meet disciplined Swiss grids
in this editorial layout for a contemporary design journal.
</p>
</div>
</a>
<a href="#" class="card">
<div class="card-visual">
<span class="placeholder">Bk</span>
</div>
<div class="card-content">
<p class="card-label">Web</p>
<h3>Monochrome Portfolio Platform</h3>
<p>
A black-and-white portfolio site where viewport-scale type
replaces hero imagery, proving that letterforms are enough.
</p>
</div>
</a>
</section>
<!-- CTA -->
<section class="cta" id="contact">
<p class="label">003 — Contact</p>
<h2>
<span class="thin">Let's</span><br>
Work
</h2>
<a href="#" class="btn">
Get in Touch
<span>→</span>
</a>
</section>
<!-- Footer -->
<footer>
<div class="footer-inner">
<span class="footer-brand">Grotesk</span>
<ul class="footer-links">
<li><a href="#">Twitter</a></li>
<li><a href="#">Dribbble</a></li>
<li><a href="#">GitHub</a></li>
<li><a href="#">LinkedIn</a></li>
</ul>
<span class="footer-copy">© 2026 Grotesk Display. All rights reserved.</span>
</div>
</footer>
</body>
</html>
wght axis allow smooth weight transitions on hover (e.g., font-variation-settings: 'wght' 300 transitioning to 'wght' 700) without loading multiple font filesclamp() for responsive display type – font-size: clamp(3rem, 12vw, 12rem) ensures headings scale fluidly from mobile to widescreen without media query breakpoints-webkit-font-smoothing: antialiased and -moz-osx-font-smoothing: grayscale to ensure the thin weights of grotesk fonts render cleanly on macOS and Firefox<link rel="preload" href="font.woff2" as="font" crossorigin> for the primary display font to minimize visible font swaps on page loadmax-width: 540px (or equivalent ch-based units) for comfortable readingletter-spacing transitions for hover states – animating tracking from -0.04em to 0em on display links creates a subtle, type-native interaction that reinforces the grotesk aesthetic without resorting to color changes