Pastel Brutalism is a contemporary design aesthetic that fuses the raw, unapologetic structural language of brutalist design with a softened, candy-toned color palette. Where traditional web brutalism reveled in monochrome harshness, exposed grids, and deliberately unpolished interfaces, Pastel Brutalism retains all of that structural honesty while swapping the aggression for warmth. The result is a style that feels simultaneously bold and approachable – thick black borders and hard-offset box shadows sit atop backgrounds of lavender, mint, baby pink, and buttercream, creating a visual tension that is both playful and architecturally rigorous.
Pastel Brutalism emerged as a natural evolution of the neobrutalism (also called neubrutalism) trend that gained significant traction in web and UI design from 2020 onward. Platforms like Gumroad popularized the neobrutalist look – thick black outlines, flat color fills, hard drop shadows with zero blur, and a rejection of the glossy, gradient-heavy aesthetic that dominated the 2010s. As the style matured, designers began exploring a softer variant: retaining the structural DNA of brutalism (blocky layouts, exposed grid mechanics, stark typographic hierarchy, zero-blur shadows) while replacing the aggressive primary-color palettes with pastels, muted tones, and candy hues. This “soft brutalism” subgenre is what we now call Pastel Brutalism.
The aesthetic draws philosophical inspiration from architectural brutalism, where raw concrete (beton brut) was left exposed rather than hidden behind decorative facades. In the digital translation, this means UI elements do not pretend to be something they are not. Buttons look like buttons – chunky, bordered, obviously clickable. Cards are flat rectangles with visible edges. Shadows are hard and offset, as if the element were a physical cutout hovering above the page. There is no attempt at photorealism, no subtle gradients mimicking depth, no neumorphic softness. The honesty is structural.
What makes Pastel Brutalism distinctive is the emotional register that the color palette introduces. Pastels – soft pinks, lilacs, sage greens, powder blues, peachy corals – carry associations of gentleness, nostalgia, and playfulness. When these tones fill the rigid, angular containers of brutalist layout, the contrast creates something memorable: designs that feel both strong and tender, confident and friendly. The thick black borders act as a grounding force, preventing the pastels from reading as insipid or precious. Conversely, the pastels prevent the brutalist structure from feeling hostile or inaccessible.
This aesthetic has found particular traction in startups, creator-economy platforms, portfolio sites, educational tools, and lifestyle brands – contexts where approachability matters but generic corporate smoothness feels inauthentic. It pairs naturally with bold, oversized display typography, generous whitespace, and a willingness to let individual UI elements breathe within their stark frames. The overall impression is of a design that takes its structure seriously but does not take itself too seriously.
The palette balances soft, desaturated candy tones with stark neutrals. Every pastel is chosen to maintain sufficient contrast against dark text and thick black borders. The key principle is that no single pastel dominates – instead, different pastels are assigned to different UI regions or component types, creating a patchwork quilt effect held together by the consistent black framework.
| Swatch | Hex | Role / Usage |
|---|---|---|
#FFD6E0 |
Baby Pink – primary accent cards, hero backgrounds, CTA sections | |
#C5B4E3 |
Soft Lavender – secondary cards, featured content blocks, tag backgrounds | |
#B8E8D0 |
Mint Cream – success states, positive indicators, alternate section fills | |
#FFF1C1 |
Buttercream – warning states, highlight badges, warm accent areas | |
#B6D8F2 |
Powder Blue – info states, link highlights, cool accent sections | |
#FFCBA4 |
Peach Sorbet – tertiary accent, illustration backgrounds, hover fills | |
#F0F0F0 |
Concrete – page canvas, neutral background, structural base | |
#FFFFFF |
Pure White – card backgrounds (alternate), modal surfaces, input fields | |
#1A1A1A |
Near Black – primary text, borders, shadows, structural lines | |
#2B2B2B |
Charcoal – secondary text, body copy, descriptions | |
#6B6B6B |
Slate – tertiary text, captions, disabled labels | |
#E8C5E8 |
Orchid Mist – decorative accents, secondary badges, alternate tags | |
#D4F0B4 |
Lime Sorbet – positive metrics, growth indicators, fresh accents | |
#F5C6C6 |
Blush – error states, destructive action warnings, alert backgrounds | |
#D0D0D0 |
Silver – borders (alternate), dividers, disabled elements |
:root {
/* Pastel Fills */
--pb-pink: #ffd6e0;
--pb-lavender: #c5b4e3;
--pb-mint: #b8e8d0;
--pb-buttercream: #fff1c1;
--pb-blue: #b6d8f2;
--pb-peach: #ffcba4;
--pb-orchid: #e8c5e8;
--pb-lime: #d4f0b4;
--pb-blush: #f5c6c6;
/* Neutrals */
--pb-canvas: #f0f0f0;
--pb-white: #ffffff;
--pb-black: #1a1a1a;
--pb-charcoal: #2b2b2b;
--pb-slate: #6b6b6b;
--pb-silver: #d0d0d0;
/* Structural Tokens */
--pb-border-width: 3px;
--pb-border-color: #1a1a1a;
--pb-shadow-offset: 6px;
--pb-shadow: var(--pb-shadow-offset) var(--pb-shadow-offset) 0 var(--pb-border-color);
--pb-shadow-sm: 4px 4px 0 var(--pb-border-color);
--pb-shadow-lg: 8px 8px 0 var(--pb-border-color);
--pb-radius: 0px;
--pb-radius-soft: 6px;
--pb-padding: 28px;
--pb-gap: 20px;
}
Pastel Brutalism typography is aggressive in scale and weight while remaining legible and modern. The contrast between oversized, black-weight display headings and compact, clean body text mirrors the broader aesthetic tension between raw structure and soft color. Monospace typefaces are frequently introduced for labels, code snippets, or metadata to reinforce the “exposed-construction” ethos. System fonts or intentionally plain sans-serifs are also common, echoing early-web and brutalist traditions where typography was functional rather than decorative.
| Font | Style | Best For |
|---|---|---|
| Space Grotesk | Monospace-inspired proportional sans | Display headings, navigation, hero text |
| Space Mono | True monospace with character | Labels, tags, metadata, code-like accents |
| Inter | Highly legible screen sans-serif | Body text, descriptions, form labels |
| DM Sans | Clean geometric with warmth | Subheadings, card titles, button text |
| Syne | Bold, expressive display face | Hero headlines, impactful statements |
| Outfit | Geometric variable-weight sans | Headlines, metrics, callout numbers |
| JetBrains Mono | Developer-friendly monospace | Code blocks, technical labels, raw accents |
| Work Sans | Versatile humanist sans | Body text, navigation, general-purpose |
| Heading Font | Body Font | Character |
|---|---|---|
| Space Grotesk (700) | Inter (400) | Technical, structured, modern brutalism |
| Syne (800) | Work Sans (400) | Expressive, bold, high-contrast editorial |
| Outfit (800) | DM Sans (400) | Clean, geometric, friendly yet strong |
| Space Grotesk (700) | Space Mono (400) | Full monospace family, raw developer aesthetic |
| DM Sans (700) | Inter (400) | Warm, approachable, softer pastel variant |
@import url('https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@400;500;600;700&family=Inter:wght@400;500;600&family=Space+Mono:wght@400;700&display=swap');
h1, h2, h3, h4, h5, h6 {
font-family: 'Space Grotesk', sans-serif;
font-weight: 700;
color: var(--pb-black);
line-height: 1.1;
letter-spacing: -0.02em;
}
.pb-display {
font-family: 'Space Grotesk', sans-serif;
font-size: clamp(2.5rem, 6vw, 5rem);
font-weight: 700;
letter-spacing: -0.03em;
line-height: 1.0;
text-transform: uppercase;
}
body {
font-family: 'Inter', sans-serif;
font-weight: 400;
font-size: 1rem;
line-height: 1.65;
color: var(--pb-charcoal);
}
.pb-mono {
font-family: 'Space Mono', monospace;
font-weight: 400;
font-size: 0.85rem;
letter-spacing: 0.02em;
}
.pb-label {
font-family: 'Space Mono', monospace;
font-weight: 700;
font-size: 0.75rem;
letter-spacing: 0.06em;
text-transform: uppercase;
color: var(--pb-black);
}
.pb-caption {
font-family: 'Inter', sans-serif;
font-weight: 400;
font-size: 0.85rem;
color: var(--pb-slate);
}
.pb-card {
background: var(--pb-pink);
border: var(--pb-border-width) solid var(--pb-border-color);
box-shadow: var(--pb-shadow);
padding: var(--pb-padding);
position: relative;
transition: box-shadow 0.15s ease, transform 0.15s ease;
}
.pb-card:hover {
box-shadow: var(--pb-shadow-sm);
transform: translate(2px, 2px);
}
.pb-card--lavender { background: var(--pb-lavender); }
.pb-card--mint { background: var(--pb-mint); }
.pb-card--buttercream { background: var(--pb-buttercream); }
.pb-card--blue { background: var(--pb-blue); }
.pb-card--peach { background: var(--pb-peach); }
.pb-card--white { background: var(--pb-white); }
.pb-card h3 {
font-family: 'Space Grotesk', sans-serif;
font-weight: 700;
font-size: 1.3rem;
margin-bottom: 12px;
color: var(--pb-black);
}
.pb-card p {
font-family: 'Inter', sans-serif;
font-size: 0.95rem;
color: var(--pb-charcoal);
line-height: 1.6;
}
.pb-button {
display: inline-flex;
align-items: center;
justify-content: center;
gap: 8px;
font-family: 'Space Grotesk', sans-serif;
font-weight: 700;
font-size: 1rem;
text-transform: uppercase;
letter-spacing: 0.04em;
padding: 14px 32px;
border: var(--pb-border-width) solid var(--pb-border-color);
box-shadow: var(--pb-shadow-sm);
cursor: pointer;
text-decoration: none;
transition: box-shadow 0.12s ease, transform 0.12s ease;
background: var(--pb-buttercream);
color: var(--pb-black);
}
.pb-button:hover {
box-shadow: 2px 2px 0 var(--pb-border-color);
transform: translate(2px, 2px);
}
.pb-button:active {
box-shadow: 0px 0px 0 var(--pb-border-color);
transform: translate(4px, 4px);
}
.pb-button--pink { background: var(--pb-pink); }
.pb-button--lavender { background: var(--pb-lavender); }
.pb-button--mint { background: var(--pb-mint); }
.pb-button--blue { background: var(--pb-blue); }
.pb-button--dark {
background: var(--pb-black);
color: var(--pb-white);
}
.pb-button--outline {
background: transparent;
color: var(--pb-black);
}
.pb-nav {
display: flex;
align-items: center;
justify-content: space-between;
max-width: 1200px;
margin: 0 auto;
padding: 20px 24px;
border-bottom: var(--pb-border-width) solid var(--pb-border-color);
}
.pb-nav__logo {
font-family: 'Space Grotesk', sans-serif;
font-weight: 700;
font-size: 1.5rem;
color: var(--pb-black);
text-decoration: none;
text-transform: uppercase;
letter-spacing: 0.02em;
}
.pb-nav__links {
display: flex;
gap: 8px;
list-style: none;
margin: 0;
padding: 0;
}
.pb-nav__links a {
font-family: 'Space Grotesk', sans-serif;
font-weight: 600;
font-size: 0.9rem;
color: var(--pb-black);
text-decoration: none;
text-transform: uppercase;
letter-spacing: 0.03em;
padding: 8px 16px;
border: 2px solid transparent;
transition: border-color 0.15s ease, background 0.15s ease;
}
.pb-nav__links a:hover {
border: 2px solid var(--pb-border-color);
background: var(--pb-buttercream);
}
.pb-nav__links a.active {
border: 2px solid var(--pb-border-color);
background: var(--pb-pink);
box-shadow: 2px 2px 0 var(--pb-border-color);
}
.pb-hero {
background: var(--pb-lavender);
border: var(--pb-border-width) solid var(--pb-border-color);
box-shadow: var(--pb-shadow-lg);
padding: 60px 48px;
text-align: center;
margin-bottom: var(--pb-gap);
}
.pb-hero__title {
font-family: 'Space Grotesk', sans-serif;
font-size: clamp(2.5rem, 7vw, 5.5rem);
font-weight: 700;
line-height: 1.0;
letter-spacing: -0.03em;
text-transform: uppercase;
color: var(--pb-black);
margin-bottom: 20px;
}
.pb-hero__subtitle {
font-family: 'Inter', sans-serif;
font-size: 1.15rem;
font-weight: 400;
color: var(--pb-charcoal);
max-width: 550px;
margin: 0 auto 32px;
line-height: 1.6;
}
.pb-hero__tag {
display: inline-block;
font-family: 'Space Mono', monospace;
font-size: 0.8rem;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.08em;
padding: 6px 16px;
border: 2px solid var(--pb-border-color);
background: var(--pb-buttercream);
margin-bottom: 20px;
}
.pb-grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: var(--pb-gap);
max-width: 1200px;
margin: 0 auto;
padding: 0 24px;
}
.pb-grid--2col { grid-template-columns: repeat(2, 1fr); }
.pb-grid--4col { grid-template-columns: repeat(4, 1fr); }
.pb-grid .pb-card--wide { grid-column: span 2; }
.pb-grid .pb-card--full { grid-column: 1 / -1; }
@media (max-width: 900px) {
.pb-grid { grid-template-columns: repeat(2, 1fr); }
.pb-grid .pb-card--wide { grid-column: span 2; }
}
@media (max-width: 600px) {
.pb-grid {
grid-template-columns: 1fr;
padding: 0 16px;
gap: 16px;
}
.pb-grid .pb-card--wide,
.pb-grid .pb-card--full { grid-column: span 1; }
}
.pb-tag {
display: inline-block;
font-family: 'Space Mono', monospace;
font-size: 0.7rem;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.06em;
padding: 4px 12px;
border: 2px solid var(--pb-border-color);
background: var(--pb-mint);
color: var(--pb-black);
}
.pb-tag--pink { background: var(--pb-pink); }
.pb-tag--blue { background: var(--pb-blue); }
.pb-tag--buttercream { background: var(--pb-buttercream); }
.pb-tag--lavender { background: var(--pb-lavender); }
.pb-input {
font-family: 'Inter', sans-serif;
font-size: 1rem;
padding: 12px 16px;
border: var(--pb-border-width) solid var(--pb-border-color);
box-shadow: var(--pb-shadow-sm);
background: var(--pb-white);
color: var(--pb-black);
outline: none;
width: 100%;
transition: box-shadow 0.12s ease, transform 0.12s ease;
}
.pb-input:focus {
box-shadow: var(--pb-shadow);
background: var(--pb-buttercream);
}
.pb-input::placeholder {
color: var(--pb-slate);
font-style: italic;
}
.pb-input-label {
display: block;
font-family: 'Space Mono', monospace;
font-weight: 700;
font-size: 0.75rem;
text-transform: uppercase;
letter-spacing: 0.06em;
color: var(--pb-black);
margin-bottom: 8px;
}
.pb-footer {
background: var(--pb-black);
color: var(--pb-silver);
border-top: var(--pb-border-width) solid var(--pb-border-color);
padding: 40px 24px;
text-align: center;
}
.pb-footer__brand {
font-family: 'Space Grotesk', sans-serif;
font-weight: 700;
font-size: 1.3rem;
color: var(--pb-white);
text-transform: uppercase;
margin-bottom: 12px;
}
.pb-footer__links {
display: flex;
justify-content: center;
gap: 24px;
list-style: none;
margin: 0 0 16px;
padding: 0;
}
.pb-footer__links a {
font-family: 'Space Grotesk', sans-serif;
font-size: 0.85rem;
font-weight: 600;
color: var(--pb-silver);
text-decoration: none;
text-transform: uppercase;
letter-spacing: 0.04em;
transition: color 0.15s ease;
}
.pb-footer__links a:hover {
color: var(--pb-pink);
}
.pb-footer__copy {
font-family: 'Space Mono', monospace;
font-size: 0.75rem;
color: var(--pb-slate);
}
| Aesthetic | Relationship to Pastel Brutalism |
|---|---|
| Neobrutalism / Neubrutalism | The direct parent aesthetic; Pastel Brutalism is neobrutalism with the palette shifted from saturated primaries to soft pastels |
| Web Brutalism | The original digital brutalism – raw HTML, monochrome, system fonts; Pastel Brutalism retains the structural ethos but rejects the harshness |
| Flat Design | Shares the commitment to zero-depth, solid-color surfaces; Pastel Brutalism adds thick borders and hard shadows that Flat Design avoids |
| Memphis Design | Both use bold geometric shapes and playful color; Memphis is more chaotic and pattern-heavy, while Pastel Brutalism is more grid-disciplined |
| Danish Pastel | Shares the soft color palette but pairs it with organic curves and minimalism rather than hard edges and thick borders |
| Dopamine Design | Both aim for joyful, colorful interfaces; Dopamine Design is maximalist and gradient-friendly, while Pastel Brutalism is structurally restrained |
| Claymorphism | Both are playful and pastel-friendly, but Claymorphism uses puffy 3D shadows and rounded forms, opposing the flat hardness of brutalism |
| Corporate Memphis | Shares the flat-color, illustration-forward approach; Pastel Brutalism swaps the smooth corporate polish for raw, bordered construction |
| Bento Grid | Both use modular card-based layouts, but Bento Grid favors rounded corners and subtle depth while Pastel Brutalism uses sharp edges and hard shadows |
| Gen Z Maximalism | Both embrace bold color and personality; Gen Z Maximalism is denser and more eclectic, while Pastel Brutalism maintains grid discipline |
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Pastel Brutalism Page</title>
<link href="https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@400;500;600;700&family=Inter:wght@400;500;600&family=Space+Mono:wght@400;700&display=swap" rel="stylesheet">
<style>
/* ===========================
CSS Custom Properties
=========================== */
:root {
/* Pastel Fills */
--pb-pink: #ffd6e0;
--pb-lavender: #c5b4e3;
--pb-mint: #b8e8d0;
--pb-buttercream: #fff1c1;
--pb-blue: #b6d8f2;
--pb-peach: #ffcba4;
--pb-orchid: #e8c5e8;
--pb-lime: #d4f0b4;
--pb-blush: #f5c6c6;
/* Neutrals */
--pb-canvas: #f0f0f0;
--pb-white: #ffffff;
--pb-black: #1a1a1a;
--pb-charcoal: #2b2b2b;
--pb-slate: #6b6b6b;
--pb-silver: #d0d0d0;
/* Structural Tokens */
--pb-border-width: 3px;
--pb-border-color: #1a1a1a;
--pb-shadow: 6px 6px 0 #1a1a1a;
--pb-shadow-sm: 4px 4px 0 #1a1a1a;
--pb-shadow-lg: 8px 8px 0 #1a1a1a;
--pb-radius: 0px;
--pb-padding: 28px;
--pb-gap: 20px;
}
/* ===========================
Reset & Base
=========================== */
*, *::before, *::after {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
background: var(--pb-canvas);
color: var(--pb-charcoal);
font-family: 'Inter', sans-serif;
font-weight: 400;
font-size: 1rem;
line-height: 1.65;
}
h1, h2, h3, h4, h5, h6 {
font-family: 'Space Grotesk', sans-serif;
font-weight: 700;
color: var(--pb-black);
line-height: 1.1;
letter-spacing: -0.02em;
}
img { max-width: 100%; display: block; }
a { color: inherit; }
/* ===========================
Navigation
=========================== */
.nav {
display: flex;
align-items: center;
justify-content: space-between;
max-width: 1200px;
margin: 0 auto;
padding: 20px 24px;
border-bottom: var(--pb-border-width) solid var(--pb-border-color);
}
.nav__logo {
font-family: 'Space Grotesk', sans-serif;
font-weight: 700;
font-size: 1.5rem;
color: var(--pb-black);
text-decoration: none;
text-transform: uppercase;
letter-spacing: 0.02em;
}
.nav__links {
display: flex;
gap: 8px;
list-style: none;
}
.nav__links a {
font-family: 'Space Grotesk', sans-serif;
font-weight: 600;
font-size: 0.9rem;
color: var(--pb-black);
text-decoration: none;
text-transform: uppercase;
letter-spacing: 0.03em;
padding: 8px 16px;
border: 2px solid transparent;
transition: border-color 0.15s, background 0.15s;
}
.nav__links a:hover {
border-color: var(--pb-border-color);
background: var(--pb-buttercream);
}
.nav__links a.active {
border-color: var(--pb-border-color);
background: var(--pb-pink);
box-shadow: 2px 2px 0 var(--pb-border-color);
}
/* ===========================
Hero Section
=========================== */
.hero {
background: var(--pb-lavender);
border: var(--pb-border-width) solid var(--pb-border-color);
box-shadow: var(--pb-shadow-lg);
padding: 72px 48px;
text-align: center;
max-width: 1200px;
margin: var(--pb-gap) auto;
margin-left: max(24px, calc((100% - 1200px) / 2));
margin-right: max(24px, calc((100% - 1200px) / 2));
}
.hero__tag {
display: inline-block;
font-family: 'Space Mono', monospace;
font-size: 0.8rem;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.08em;
padding: 6px 16px;
border: 2px solid var(--pb-border-color);
background: var(--pb-buttercream);
margin-bottom: 24px;
}
.hero__title {
font-size: clamp(2.5rem, 7vw, 5rem);
font-weight: 700;
text-transform: uppercase;
letter-spacing: -0.03em;
line-height: 1.0;
margin-bottom: 20px;
}
.hero__subtitle {
font-family: 'Inter', sans-serif;
font-size: 1.15rem;
color: var(--pb-charcoal);
max-width: 550px;
margin: 0 auto 36px;
line-height: 1.6;
}
/* ===========================
Buttons
=========================== */
.btn {
display: inline-flex;
align-items: center;
justify-content: center;
gap: 8px;
font-family: 'Space Grotesk', sans-serif;
font-weight: 700;
font-size: 1rem;
text-transform: uppercase;
letter-spacing: 0.04em;
padding: 14px 32px;
border: var(--pb-border-width) solid var(--pb-border-color);
box-shadow: var(--pb-shadow-sm);
cursor: pointer;
text-decoration: none;
transition: box-shadow 0.12s, transform 0.12s;
background: var(--pb-buttercream);
color: var(--pb-black);
}
.btn:hover {
box-shadow: 2px 2px 0 var(--pb-border-color);
transform: translate(2px, 2px);
}
.btn:active {
box-shadow: 0 0 0 var(--pb-border-color);
transform: translate(4px, 4px);
}
.btn--dark {
background: var(--pb-black);
color: var(--pb-white);
}
.btn--pink { background: var(--pb-pink); }
.btn--mint { background: var(--pb-mint); }
.btn--blue { background: var(--pb-blue); }
/* ===========================
Grid Layout
=========================== */
.grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: var(--pb-gap);
max-width: 1200px;
margin: 0 auto;
padding: var(--pb-gap) 24px;
}
/* ===========================
Cards
=========================== */
.card {
background: var(--pb-white);
border: var(--pb-border-width) solid var(--pb-border-color);
box-shadow: var(--pb-shadow);
padding: var(--pb-padding);
transition: box-shadow 0.15s, transform 0.15s;
}
.card:hover {
box-shadow: var(--pb-shadow-sm);
transform: translate(2px, 2px);
}
.card--pink { background: var(--pb-pink); }
.card--lavender { background: var(--pb-lavender); }
.card--mint { background: var(--pb-mint); }
.card--buttercream { background: var(--pb-buttercream); }
.card--blue { background: var(--pb-blue); }
.card--peach { background: var(--pb-peach); }
.card--wide { grid-column: span 2; }
.card--full { grid-column: 1 / -1; }
.card__tag {
display: inline-block;
font-family: 'Space Mono', monospace;
font-size: 0.7rem;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.06em;
padding: 4px 12px;
border: 2px solid var(--pb-border-color);
background: var(--pb-buttercream);
margin-bottom: 16px;
}
.card__tag--mint { background: var(--pb-mint); }
.card__tag--pink { background: var(--pb-pink); }
.card__tag--blue { background: var(--pb-blue); }
.card__tag--lavender { background: var(--pb-lavender); }
.card h3 {
font-size: 1.3rem;
margin-bottom: 12px;
}
.card p {
font-size: 0.95rem;
color: var(--pb-charcoal);
line-height: 1.6;
}
.card__icon {
width: 56px;
height: 56px;
border: 2px solid var(--pb-border-color);
display: flex;
align-items: center;
justify-content: center;
font-size: 1.6rem;
margin-bottom: 16px;
background: var(--pb-white);
}
/* ===========================
Stats Row
=========================== */
.stats {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: var(--pb-gap);
max-width: 1200px;
margin: 0 auto;
padding: 0 24px var(--pb-gap);
}
.stat {
border: var(--pb-border-width) solid var(--pb-border-color);
box-shadow: var(--pb-shadow-sm);
padding: 24px;
text-align: center;
}
.stat--pink { background: var(--pb-pink); }
.stat--mint { background: var(--pb-mint); }
.stat--buttercream { background: var(--pb-buttercream); }
.stat--blue { background: var(--pb-blue); }
.stat__number {
font-family: 'Space Grotesk', sans-serif;
font-weight: 700;
font-size: 2.5rem;
color: var(--pb-black);
line-height: 1;
letter-spacing: -0.03em;
}
.stat__label {
font-family: 'Space Mono', monospace;
font-size: 0.75rem;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.06em;
color: var(--pb-charcoal);
margin-top: 8px;
}
/* ===========================
CTA / Banner Section
=========================== */
.cta {
background: var(--pb-pink);
border: var(--pb-border-width) solid var(--pb-border-color);
box-shadow: var(--pb-shadow-lg);
padding: 48px;
text-align: center;
max-width: 1200px;
margin: 0 auto var(--pb-gap);
margin-left: max(24px, calc((100% - 1200px) / 2));
margin-right: max(24px, calc((100% - 1200px) / 2));
}
.cta h2 {
font-size: clamp(1.5rem, 4vw, 2.5rem);
text-transform: uppercase;
margin-bottom: 12px;
}
.cta p {
font-size: 1.05rem;
color: var(--pb-charcoal);
margin-bottom: 28px;
max-width: 500px;
margin-left: auto;
margin-right: auto;
}
/* ===========================
Form Section
=========================== */
.form-section {
max-width: 1200px;
margin: 0 auto;
padding: 0 24px var(--pb-gap);
}
.form-card {
background: var(--pb-white);
border: var(--pb-border-width) solid var(--pb-border-color);
box-shadow: var(--pb-shadow);
padding: 40px;
max-width: 500px;
margin: 0 auto;
}
.form-card h3 {
font-size: 1.5rem;
text-transform: uppercase;
margin-bottom: 24px;
text-align: center;
}
.form-group {
margin-bottom: 20px;
}
.form-group label {
display: block;
font-family: 'Space Mono', monospace;
font-weight: 700;
font-size: 0.75rem;
text-transform: uppercase;
letter-spacing: 0.06em;
color: var(--pb-black);
margin-bottom: 8px;
}
.form-group input,
.form-group textarea {
font-family: 'Inter', sans-serif;
font-size: 1rem;
padding: 12px 16px;
border: var(--pb-border-width) solid var(--pb-border-color);
box-shadow: var(--pb-shadow-sm);
background: var(--pb-white);
color: var(--pb-black);
outline: none;
width: 100%;
transition: box-shadow 0.12s, background 0.12s;
}
.form-group input:focus,
.form-group textarea:focus {
box-shadow: var(--pb-shadow);
background: var(--pb-buttercream);
}
.form-group textarea {
resize: vertical;
min-height: 100px;
}
/* ===========================
Section Heading
=========================== */
.section-heading {
max-width: 1200px;
margin: 0 auto;
padding: var(--pb-gap) 24px 12px;
}
.section-heading h2 {
font-size: 1.8rem;
text-transform: uppercase;
display: inline-block;
padding-bottom: 4px;
border-bottom: var(--pb-border-width) solid var(--pb-border-color);
}
/* ===========================
Footer
=========================== */
.footer {
background: var(--pb-black);
color: var(--pb-silver);
border-top: var(--pb-border-width) solid var(--pb-border-color);
padding: 40px 24px;
text-align: center;
}
.footer__brand {
font-family: 'Space Grotesk', sans-serif;
font-weight: 700;
font-size: 1.3rem;
color: var(--pb-white);
text-transform: uppercase;
margin-bottom: 16px;
}
.footer__links {
display: flex;
justify-content: center;
gap: 24px;
list-style: none;
margin-bottom: 20px;
}
.footer__links a {
font-family: 'Space Grotesk', sans-serif;
font-size: 0.85rem;
font-weight: 600;
color: var(--pb-silver);
text-decoration: none;
text-transform: uppercase;
letter-spacing: 0.04em;
transition: color 0.15s;
}
.footer__links a:hover {
color: var(--pb-pink);
}
.footer__copy {
font-family: 'Space Mono', monospace;
font-size: 0.75rem;
color: var(--pb-slate);
}
/* ===========================
Responsive
=========================== */
@media (max-width: 900px) {
.grid { grid-template-columns: repeat(2, 1fr); }
.stats { grid-template-columns: repeat(2, 1fr); }
.card--wide { grid-column: span 2; }
.hero { padding: 48px 28px; }
.cta { padding: 36px 28px; }
}
@media (max-width: 600px) {
.grid {
grid-template-columns: 1fr;
padding: 16px;
gap: 16px;
}
.stats {
grid-template-columns: 1fr;
padding: 0 16px 16px;
gap: 16px;
}
.card--wide,
.card--full { grid-column: span 1; }
.nav {
flex-direction: column;
gap: 16px;
padding: 16px;
}
.nav__links {
flex-wrap: wrap;
justify-content: center;
gap: 6px;
}
.hero {
padding: 36px 20px;
margin-left: 16px;
margin-right: 16px;
}
.cta {
padding: 28px 20px;
margin-left: 16px;
margin-right: 16px;
}
.form-card { padding: 24px; }
.footer__links {
flex-wrap: wrap;
gap: 12px;
}
}
</style>
</head>
<body>
<!-- ===========================
Navigation
=========================== -->
<nav class="nav">
<a href="#" class="nav__logo">PastelBrut</a>
<ul class="nav__links">
<li><a href="#" class="active">Home</a></li>
<li><a href="#">Features</a></li>
<li><a href="#">Pricing</a></li>
<li><a href="#">Blog</a></li>
<li><a href="#">Contact</a></li>
</ul>
</nav>
<!-- ===========================
Hero Section
=========================== -->
<section class="hero">
<div class="hero__tag">Now in Public Beta</div>
<h1 class="hero__title">Soft on the eyes.<br>Hard on convention.</h1>
<p class="hero__subtitle">
Build bold, beautiful interfaces that reject corporate blandness.
Pastel tones meet raw structure for designs with real personality.
</p>
<div style="display: flex; gap: 12px; justify-content: center; flex-wrap: wrap;">
<a href="#" class="btn btn--dark">Get Started</a>
<a href="#" class="btn">Learn More</a>
</div>
</section>
<!-- ===========================
Stats Row
=========================== -->
<div class="stats">
<div class="stat stat--pink">
<div class="stat__number">12K+</div>
<div class="stat__label">Active Users</div>
</div>
<div class="stat stat--mint">
<div class="stat__number">98%</div>
<div class="stat__label">Satisfaction</div>
</div>
<div class="stat stat--buttercream">
<div class="stat__number">340+</div>
<div class="stat__label">Components</div>
</div>
<div class="stat stat--blue">
<div class="stat__number">4.9</div>
<div class="stat__label">Star Rating</div>
</div>
</div>
<!-- ===========================
Features Section
=========================== -->
<div class="section-heading">
<h2>Core Features</h2>
</div>
<div class="grid">
<!-- Card 1: Wide -->
<div class="card card--pink card--wide">
<div class="card__tag">Design System</div>
<h3>Consistent by Construction</h3>
<p>
Every component shares the same border weight, shadow offset, and spacing
rhythm. Mix and match pastel fills while the black framework holds everything
together. No guesswork, no inconsistency.
</p>
</div>
<!-- Card 2 -->
<div class="card card--mint">
<div class="card__icon">◆</div>
<div class="card__tag card__tag--mint">Layout</div>
<h3>Grid-First Architecture</h3>
<p>
Built on CSS Grid with explicit column spans. Asymmetric but balanced,
every card earns its space.
</p>
</div>
<!-- Card 3 -->
<div class="card card--buttercream">
<div class="card__icon">★</div>
<div class="card__tag">Typography</div>
<h3>Bold Type Hierarchy</h3>
<p>
Oversized Space Grotesk headings meet clean Inter body text.
Scale and weight do the talking.
</p>
</div>
<!-- Card 4 -->
<div class="card card--blue">
<div class="card__icon">✎</div>
<div class="card__tag card__tag--blue">Accessible</div>
<h3>WCAG-Ready Colors</h3>
<p>
Dark text on pastel backgrounds naturally produces high contrast ratios.
Accessibility is baked into the palette.
</p>
</div>
<!-- Card 5 -->
<div class="card card--lavender">
<div class="card__icon">⚙</div>
<div class="card__tag card__tag--lavender">Responsive</div>
<h3>Mobile-First Stacking</h3>
<p>
The grid collapses cleanly to single-column on small screens. Borders
and shadows persist at every breakpoint.
</p>
</div>
<!-- Card 6 -->
<div class="card card--peach">
<div class="card__icon">♥</div>
<div class="card__tag card__tag--pink">Interaction</div>
<h3>Tactile Hover States</h3>
<p>
Buttons press in, cards shift toward their shadow, inputs glow on focus.
Every click feels physical.
</p>
</div>
</div>
<!-- ===========================
CTA Section
=========================== -->
<section class="cta">
<h2>Ready to build something bold?</h2>
<p>
Join thousands of designers who have ditched the corporate polish for
honest, colorful, structurally sound interfaces.
</p>
<div style="display: flex; gap: 12px; justify-content: center; flex-wrap: wrap;">
<a href="#" class="btn btn--dark">Start Free Trial</a>
<a href="#" class="btn btn--mint">View Examples</a>
</div>
</section>
<!-- ===========================
Contact Form
=========================== -->
<div class="section-heading">
<h2>Get in Touch</h2>
</div>
<div class="form-section">
<div class="form-card">
<h3>Send a Message</h3>
<form>
<div class="form-group">
<label for="name">Your Name</label>
<input type="text" id="name" placeholder="Ada Lovelace">
</div>
<div class="form-group">
<label for="email">Email Address</label>
<input type="email" id="email" placeholder="ada@example.com">
</div>
<div class="form-group">
<label for="message">Message</label>
<textarea id="message" placeholder="Tell us about your project..."></textarea>
</div>
<button type="submit" class="btn btn--dark" style="width: 100%; justify-content: center;">
Send Message
</button>
</form>
</div>
</div>
<!-- ===========================
Footer
=========================== -->
<footer class="footer">
<div class="footer__brand">PastelBrut</div>
<ul class="footer__links">
<li><a href="#">Home</a></li>
<li><a href="#">Features</a></li>
<li><a href="#">Pricing</a></li>
<li><a href="#">Blog</a></li>
<li><a href="#">Contact</a></li>
<li><a href="#">GitHub</a></li>
</ul>
<p class="footer__copy">
Built with the Pastel Brutalism aesthetic.
Soft colors. Hard edges. Real personality.
</p>
</footer>
</body>
</html>
--pb-border-width, --pb-shadow, and --pb-gap first; these three variables control the entire brutalist framework, and changing them globally updates every component instantly.pb-card base class with all structural styles (border, shadow, padding, hover), then create color modifier classes (.pb-card--pink, .pb-card--mint) that only change background; this keeps CSS lean and consistenttranslate() for hover states, not margin or position changes – the tactile press effect is achieved by shifting the element toward its shadow with transform: translate(2px, 2px) while simultaneously reducing the shadow offset; transform triggers GPU compositing for smoother animation.btn--dark, dark footer, dark card variant) to provide grounding contrast; without it, the pastels can feel unanchoredclamp() and relative unitsSpace Mono sparingly – monospace accents are powerful for labels, tags, and metadata, but overusing monospace for body text reduces readability; reserve it for short, uppercase text elements that benefit from the raw, code-like quality