Concrete Brutalism is a design aesthetic rooted in the architectural movement that emerged in the 1950s, built upon the French term beton brut – meaning “raw concrete.” Coined by Le Corbusier during the construction of the Unite d’Habitation in Marseille (1952), the philosophy celebrates the honest, unfinished beauty of poured concrete: the grain impressions left by wooden formwork, the subtle imperfections of aggregate, the monolithic weight of massive structural forms. Where traditional design seeks to conceal materials behind paint, polish, and ornament, Concrete Brutalism elevates the material itself as the primary visual language, treating every crack, seam, and surface irregularity as a deliberate expression of authenticity.
Translated into digital design, Concrete Brutalism carries forward these principles of material honesty and monumental form. Interfaces adopt the muted, mineral palette of raw concrete – grays ranging from pale cement dust to dark wet stone, accented sparingly with the rust of exposed rebar, the warm amber of formwork timber, or the oxidized green of weathered copper. Typography is heavy, structural, and unapologetic, echoing the massive geometric slabs of Brutalist architecture. Layouts favor bold asymmetry, visible grid structures, and generous negative space that evokes the stark plazas surrounding Brutalist buildings. Textures play a central role: noise overlays, grain patterns, and subtle surface irregularities replicate the tactile quality of bush-hammered, board-marked, or exposed-aggregate concrete surfaces.
Unlike its web-focused cousin Brutalist Web Design (which strips the browser to its bare defaults) or the colorful playfulness of Neubrutalism, Concrete Brutalism specifically channels the architectural tradition. It is about weight, permanence, and the deliberate beauty of raw materials. Every design element should feel as though it was cast in a mold and left unfinished – massive, textured, honest, and unmistakably made of something real. The aesthetic rejects the frictionless glass-and-gradient smoothness of contemporary UI trends in favor of surfaces that communicate their construction, materials that announce their presence, and forms that assert their structural purpose without apology.
The Concrete Brutalism palette is derived directly from the materials of Brutalist architecture: poured concrete in its many shades from pale cement to dark wet stone, the warm browns of timber formwork, the rust of exposed rebar and Corten steel, the dark charcoal of structural steel, and the verdigris of weathered copper. Color is used sparingly and always references a real material rather than an abstract decorative choice.
| Swatch | Hex | Role / Usage |
|---|---|---|
#D5D0CA |
Light concrete – primary background, open surfaces, negative space | |
#B8B2A8 |
Warm concrete – secondary surfaces, card backgrounds, panels | |
#9C9588 |
Weathered concrete – muted text, dividers, metadata | |
#7A746A |
Aged concrete – secondary text, structural borders | |
#5C5650 |
Dark concrete – headings on light backgrounds, heavy borders | |
#3B3733 |
Charcoal stone – primary text, dark structural elements | |
#2A2725 |
Deep shadow – dark backgrounds, footer, heavy masses | |
#F0ECE6 |
Cement dust – lightest surface, highlight areas | |
#8B4513 |
Rust / rebar – warm accent, call-to-action, links | |
#A0522D |
Corten steel – hover states, secondary accent | |
#C19A6B |
Formwork timber – warm highlight, wood-grain accents | |
#4A6741 |
Oxidized copper – tertiary accent, success states, patina | |
#6B8F71 |
Verdigris – light green accent, subtle interactive elements | |
#1A1816 |
Raw iron – deepest dark, text on light concrete | |
#E8DFD0 |
Limestone wash – warm light background variant |
:root {
/* Concrete spectrum */
--concrete-dust: #f0ece6;
--concrete-light: #d5d0ca;
--concrete-warm: #b8b2a8;
--concrete-weathered: #9c9588;
--concrete-aged: #7a746a;
--concrete-dark: #5c5650;
--concrete-charcoal: #3b3733;
--concrete-shadow: #2a2725;
--concrete-limestone: #e8dfd0;
/* Material accents */
--concrete-rust: #8b4513;
--concrete-corten: #a0522d;
--concrete-timber: #c19a6b;
--concrete-copper: #4a6741;
--concrete-verdigris: #6b8f71;
--concrete-iron: #1a1816;
/* Functional tokens */
--concrete-bg: var(--concrete-light);
--concrete-bg-alt: var(--concrete-warm);
--concrete-bg-dark: var(--concrete-shadow);
--concrete-text: var(--concrete-charcoal);
--concrete-text-muted: var(--concrete-aged);
--concrete-text-inverse: var(--concrete-dust);
--concrete-border: var(--concrete-dark);
--concrete-accent: var(--concrete-rust);
--concrete-accent-hover: var(--concrete-corten);
--concrete-highlight: var(--concrete-timber);
}
Concrete Brutalism demands typography that feels architectural – letterforms with the structural clarity and physical weight of characters carved into a concrete facade or cast from a steel mold. Geometric sans-serifs and heavy slab serifs dominate, chosen for their blocky, monumental quality. Body text uses clean, readable faces that maintain the industrial character without sacrificing legibility. The overall effect should evoke signage on a Brutalist building: bold, uppercase, tightly tracked, and permanently set.
| Font | Weight(s) | Usage | Link |
|---|---|---|---|
| Bebas Neue | 400 | Display headlines, hero text, monumental titles | fonts.google.com/specimen/Bebas+Neue |
| Oswald | 400, 500, 700 | Section headings, navigation, structural labels | fonts.google.com/specimen/Oswald |
| Roboto Slab | 400, 700 | Body text, editorial content, architectural slab serif | fonts.google.com/specimen/Roboto+Slab |
| Roboto Condensed | 400, 700 | Secondary headings, captions, compact structural text | fonts.google.com/specimen/Roboto+Condensed |
| IBM Plex Sans | 400, 500, 700 | Body text, UI elements, clean industrial sans-serif | fonts.google.com/specimen/IBM+Plex+Sans |
| Archivo Black | 400 | Heavy impact headlines, all-caps display text | fonts.google.com/specimen/Archivo+Black |
| Heading | Body | Vibe |
|---|---|---|
| Bebas Neue | IBM Plex Sans | Towering concrete monolith meets clean industrial precision |
| Archivo Black | Roboto Slab | Heavyweight impact paired with grounded slab-serif solidity |
| Oswald (700) | Roboto Condensed | Condensed structural authority with efficient, compact readability |
| Bebas Neue | Roboto Slab | Monumental display type grounded by warm architectural serifs |
@import url('https://fonts.googleapis.com/css2?family=Bebas+Neue&family=IBM+Plex+Sans:wght@400;500;700&family=Roboto+Slab:wght@400;700&display=swap');
/* === Base Typography === */
body {
font-family: 'IBM Plex Sans', 'Helvetica Neue', Arial, sans-serif;
font-size: 17px;
line-height: 1.7;
color: var(--concrete-text);
background-color: var(--concrete-bg);
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
h1, h2, h3, h4, h5, h6 {
font-family: 'Bebas Neue', 'Impact', 'Arial Black', sans-serif;
text-transform: uppercase;
letter-spacing: 0.04em;
line-height: 1.0;
color: var(--concrete-iron);
margin: 0 0 0.5em 0;
}
h1 {
font-size: clamp(3.5rem, 10vw, 9rem);
letter-spacing: 0.06em;
}
h2 {
font-size: clamp(2rem, 5vw, 4.5rem);
letter-spacing: 0.04em;
}
h3 {
font-size: clamp(1.25rem, 3vw, 2rem);
font-family: 'Roboto Slab', 'Georgia', serif;
font-weight: 700;
text-transform: none;
letter-spacing: 0;
}
a {
color: var(--concrete-accent);
text-decoration: underline;
text-underline-offset: 3px;
text-decoration-thickness: 2px;
}
a:hover {
color: var(--concrete-accent-hover);
background-color: var(--concrete-highlight);
text-decoration-thickness: 3px;
}
blockquote {
border-left: 6px solid var(--concrete-dark);
margin: 1.5em 0;
padding: 1em 1.5em;
background-color: var(--concrete-warm);
font-family: 'Roboto Slab', serif;
font-style: normal;
color: var(--concrete-charcoal);
}
A content card that evokes a precast concrete panel – textured surface, sharp edges, and visible structural borders.
.concrete-card {
background-color: var(--concrete-warm);
border: 3px solid var(--concrete-dark);
padding: 2rem;
margin: 1.5rem 0;
position: relative;
overflow: hidden;
}
/* Concrete grain noise overlay */
.concrete-card::before {
content: '';
position: absolute;
inset: 0;
background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noise'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noise)' opacity='0.08'/%3E%3C/svg%3E");
background-size: 200px 200px;
pointer-events: none;
z-index: 1;
}
.concrete-card > * {
position: relative;
z-index: 2;
}
.concrete-card h3 {
margin-top: 0;
padding-bottom: 0.75rem;
border-bottom: 2px solid var(--concrete-aged);
}
.concrete-card p {
color: var(--concrete-charcoal);
margin-bottom: 0;
}
.concrete-card:hover {
border-color: var(--concrete-rust);
}
Buttons that feel like they were cast from a mold – heavy, rectangular, with blunt state changes and no rounded corners.
.concrete-button {
display: inline-block;
font-family: 'Bebas Neue', 'Impact', sans-serif;
font-size: 1.1rem;
letter-spacing: 0.12em;
text-transform: uppercase;
padding: 0.9rem 2rem;
border: 3px solid var(--concrete-charcoal);
background-color: var(--concrete-charcoal);
color: var(--concrete-dust);
cursor: pointer;
text-decoration: none;
transition: none;
position: relative;
}
.concrete-button:hover {
background-color: var(--concrete-rust);
border-color: var(--concrete-rust);
color: var(--concrete-dust);
}
.concrete-button:active {
background-color: var(--concrete-iron);
border-color: var(--concrete-iron);
}
.concrete-button--outline {
background-color: transparent;
color: var(--concrete-charcoal);
}
.concrete-button--outline:hover {
background-color: var(--concrete-charcoal);
color: var(--concrete-dust);
}
A horizontal structural beam anchoring the page, with navigation links arranged like modular bay divisions.
.concrete-nav {
background-color: var(--concrete-shadow);
border-bottom: 4px solid var(--concrete-iron);
padding: 0;
}
.concrete-nav ul {
list-style: none;
padding: 0;
margin: 0;
display: flex;
flex-wrap: wrap;
}
.concrete-nav li {
border-right: 1px solid var(--concrete-dark);
}
.concrete-nav a {
display: block;
padding: 1rem 1.5rem;
color: var(--concrete-dust);
text-decoration: none;
font-family: 'Bebas Neue', sans-serif;
font-size: 1rem;
letter-spacing: 0.15em;
text-transform: uppercase;
}
.concrete-nav a:hover {
background-color: var(--concrete-rust);
color: var(--concrete-dust);
}
.concrete-nav a.active {
background-color: var(--concrete-dark);
border-bottom: 3px solid var(--concrete-rust);
}
A monumental, full-viewport slab with textured concrete background, massive typography, and the weight of a Brutalist facade.
.concrete-hero {
min-height: 100vh;
display: flex;
flex-direction: column;
justify-content: flex-end;
padding: 4rem 3rem;
background-color: var(--concrete-shadow);
position: relative;
overflow: hidden;
}
/* Board-marked concrete texture */
.concrete-hero::before {
content: '';
position: absolute;
inset: 0;
background:
repeating-linear-gradient(
0deg,
transparent,
transparent 18px,
rgba(0,0,0,0.05) 18px,
rgba(0,0,0,0.05) 20px
),
repeating-linear-gradient(
90deg,
transparent,
transparent 80px,
rgba(0,0,0,0.03) 80px,
rgba(0,0,0,0.03) 82px
);
pointer-events: none;
z-index: 1;
}
/* Noise grain overlay */
.concrete-hero::after {
content: '';
position: absolute;
inset: 0;
background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 512 512' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.7' numOctaves='5' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='0.06'/%3E%3C/svg%3E");
background-size: 256px 256px;
pointer-events: none;
z-index: 2;
}
.concrete-hero > * {
position: relative;
z-index: 3;
}
.concrete-hero h1 {
font-size: clamp(4rem, 12vw, 12rem);
line-height: 0.9;
color: var(--concrete-dust);
margin: 0;
}
.concrete-hero p {
font-family: 'IBM Plex Sans', sans-serif;
font-size: clamp(1rem, 2vw, 1.35rem);
max-width: 55ch;
margin-top: 2rem;
color: var(--concrete-weathered);
line-height: 1.7;
}
A reusable CSS technique for creating the appearance of board-marked concrete using only CSS – no images required.
.formwork-texture {
position: relative;
background-color: var(--concrete-light);
}
.formwork-texture::before {
content: '';
position: absolute;
inset: 0;
background:
/* Horizontal board lines */
repeating-linear-gradient(
180deg,
transparent,
transparent 22px,
rgba(0,0,0,0.04) 22px,
rgba(0,0,0,0.04) 24px
),
/* Vertical formwork seams */
repeating-linear-gradient(
90deg,
transparent,
transparent 120px,
rgba(0,0,0,0.06) 120px,
rgba(0,0,0,0.06) 122px
),
/* Subtle wood grain */
repeating-linear-gradient(
178deg,
transparent,
transparent 3px,
rgba(0,0,0,0.015) 3px,
rgba(0,0,0,0.015) 5px
);
pointer-events: none;
}
A section treatment that emulates the speckled, rough texture of exposed-aggregate concrete finishes.
.aggregate-section {
padding: 4rem 3rem;
background-color: var(--concrete-warm);
position: relative;
}
.aggregate-section::before {
content: '';
position: absolute;
inset: 0;
background-image:
radial-gradient(circle, var(--concrete-aged) 1px, transparent 1px),
radial-gradient(circle, var(--concrete-weathered) 0.5px, transparent 0.5px);
background-size: 12px 12px, 7px 7px;
background-position: 0 0, 4px 4px;
opacity: 0.4;
pointer-events: none;
}
.aggregate-section > * {
position: relative;
z-index: 1;
}
Heavy horizontal rules that evoke the expansion joints and floor-plate edges visible on Brutalist building facades.
.concrete-divider {
border: none;
height: 6px;
background: linear-gradient(
to bottom,
var(--concrete-dark) 0%,
var(--concrete-dark) 40%,
var(--concrete-charcoal) 40%,
var(--concrete-charcoal) 60%,
var(--concrete-dark) 60%,
var(--concrete-dark) 100%
);
margin: 0;
}
.concrete-divider--heavy {
height: 10px;
background: var(--concrete-iron);
}
.concrete-divider--rust {
height: 4px;
background: linear-gradient(
to right,
var(--concrete-rust),
var(--concrete-corten),
var(--concrete-rust)
);
}
A two-column layout where the sidebar acts as a structural pillar – a dark, narrow, load-bearing column anchoring the content.
.pillar-layout {
display: grid;
grid-template-columns: 280px 1fr;
min-height: 100vh;
}
.pillar-sidebar {
background-color: var(--concrete-shadow);
padding: 2rem 1.5rem;
border-right: 4px solid var(--concrete-iron);
position: sticky;
top: 0;
height: 100vh;
overflow-y: auto;
}
.pillar-sidebar a {
display: block;
padding: 0.6rem 0;
color: var(--concrete-weathered);
text-decoration: none;
font-family: 'Bebas Neue', sans-serif;
font-size: 0.95rem;
letter-spacing: 0.1em;
text-transform: uppercase;
border-bottom: 1px solid var(--concrete-dark);
}
.pillar-sidebar a:hover {
color: var(--concrete-dust);
background-color: var(--concrete-dark);
padding-left: 0.5rem;
}
.pillar-content {
padding: 3rem;
}
@media (max-width: 768px) {
.pillar-layout {
grid-template-columns: 1fr;
}
.pillar-sidebar {
position: static;
height: auto;
border-right: none;
border-bottom: 4px solid var(--concrete-iron);
}
}
| Aesthetic | Relationship |
|---|---|
| Brutalist Web Design | Shares the honesty-first philosophy but strips the browser to its raw defaults; Concrete Brutalism adds architectural texture and material specificity where Brutalist Web Design embraces pure HTML |
| Neubrutalism | A colorful, playful descendant that retains thick borders and bold typography but adds saturated accent colors and hard-offset shadows; less material-honest, more stylistically expressive |
| Raw Industrial | Kindred spirit in celebrating exposed materials and construction processes; Raw Industrial favors metal, rivets, and machinery where Concrete Brutalism centers on cast concrete and formwork |
| Minimalism | Both reduce visual noise, but Minimalism pursues serene elegance while Concrete Brutalism embraces the rough, textured weight of honest materials |
| Constructivism | Historical parallel in using bold geometry and structural expression as ideological design tools; both movements reject decorative superficiality in favor of honest, functional composition |
| Wabi-Sabi | Shares the appreciation for imperfection, natural aging, and material honesty; Wabi-Sabi finds beauty in gentle decay while Concrete Brutalism finds it in deliberate, imposing roughness |
| Dark Academia | Both use muted, warm palettes and evoke institutional architecture, but Dark Academia romanticizes while Concrete Brutalism confronts |
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Concrete Brutalism 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=Bebas+Neue&family=IBM+Plex+Sans:wght@400;500;700&family=Roboto+Slab:wght@400;700&display=swap" rel="stylesheet">
<style>
/* --- Custom Properties --- */
:root {
/* Concrete spectrum */
--concrete-dust: #f0ece6;
--concrete-light: #d5d0ca;
--concrete-warm: #b8b2a8;
--concrete-weathered: #9c9588;
--concrete-aged: #7a746a;
--concrete-dark: #5c5650;
--concrete-charcoal: #3b3733;
--concrete-shadow: #2a2725;
--concrete-limestone: #e8dfd0;
/* Material accents */
--concrete-rust: #8b4513;
--concrete-corten: #a0522d;
--concrete-timber: #c19a6b;
--concrete-copper: #4a6741;
--concrete-verdigris: #6b8f71;
--concrete-iron: #1a1816;
/* Functional tokens */
--concrete-bg: var(--concrete-light);
--concrete-bg-alt: var(--concrete-warm);
--concrete-bg-dark: var(--concrete-shadow);
--concrete-text: var(--concrete-charcoal);
--concrete-text-muted: var(--concrete-aged);
--concrete-text-inverse: var(--concrete-dust);
--concrete-border: var(--concrete-dark);
--concrete-accent: var(--concrete-rust);
--concrete-accent-hover: var(--concrete-corten);
--concrete-highlight: var(--concrete-timber);
}
/* --- Reset & Base --- */
*, *::before, *::after {
box-sizing: border-box;
margin: 0;
padding: 0;
}
body {
font-family: 'IBM Plex Sans', 'Helvetica Neue', Arial, sans-serif;
font-size: 17px;
line-height: 1.7;
color: var(--concrete-text);
background-color: var(--concrete-bg);
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
/* --- Typography --- */
h1, h2, h3, h4 {
font-family: 'Bebas Neue', 'Impact', 'Arial Black', sans-serif;
text-transform: uppercase;
letter-spacing: 0.04em;
line-height: 1.0;
color: var(--concrete-iron);
}
h3 {
font-family: 'Roboto Slab', Georgia, serif;
text-transform: none;
letter-spacing: 0;
font-weight: 700;
}
a {
color: var(--concrete-accent);
text-decoration: underline;
text-underline-offset: 3px;
text-decoration-thickness: 2px;
transition: none;
}
a:hover {
color: var(--concrete-accent-hover);
background-color: var(--concrete-highlight);
}
/* --- Concrete Noise Utility --- */
.concrete-texture {
position: relative;
}
.concrete-texture::after {
content: '';
position: absolute;
inset: 0;
background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.8' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='0.07'/%3E%3C/svg%3E");
background-size: 200px 200px;
pointer-events: none;
z-index: 1;
}
.concrete-texture > * {
position: relative;
z-index: 2;
}
/* --- Navigation --- */
.nav {
background-color: var(--concrete-shadow);
border-bottom: 4px solid var(--concrete-iron);
padding: 0;
}
.nav-inner {
display: flex;
align-items: center;
justify-content: space-between;
flex-wrap: wrap;
}
.nav-brand {
font-family: 'Bebas Neue', sans-serif;
font-size: 1.3rem;
letter-spacing: 0.2em;
color: var(--concrete-dust);
text-decoration: none;
padding: 1rem 1.5rem;
border-right: 1px solid var(--concrete-dark);
}
.nav-brand:hover {
background-color: var(--concrete-dark);
color: var(--concrete-dust);
}
.nav ul {
list-style: none;
display: flex;
flex-wrap: wrap;
}
.nav li {
border-left: 1px solid var(--concrete-dark);
}
.nav a {
display: block;
padding: 1rem 1.5rem;
color: var(--concrete-weathered);
text-decoration: none;
font-family: 'Bebas Neue', sans-serif;
font-size: 0.95rem;
letter-spacing: 0.15em;
text-transform: uppercase;
}
.nav a:hover {
background-color: var(--concrete-rust);
color: var(--concrete-dust);
}
/* --- Hero --- */
.hero {
min-height: 100vh;
display: flex;
flex-direction: column;
justify-content: flex-end;
padding: 5rem 3rem;
background-color: var(--concrete-shadow);
position: relative;
overflow: hidden;
}
/* Board-marked formwork texture */
.hero::before {
content: '';
position: absolute;
inset: 0;
background:
repeating-linear-gradient(
0deg,
transparent,
transparent 20px,
rgba(255,255,255,0.03) 20px,
rgba(255,255,255,0.03) 22px
),
repeating-linear-gradient(
90deg,
transparent,
transparent 100px,
rgba(255,255,255,0.02) 100px,
rgba(255,255,255,0.02) 102px
);
pointer-events: none;
z-index: 1;
}
.hero::after {
content: '';
position: absolute;
inset: 0;
background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 512 512' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.65' numOctaves='5' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='0.05'/%3E%3C/svg%3E");
background-size: 256px 256px;
pointer-events: none;
z-index: 2;
}
.hero > * {
position: relative;
z-index: 3;
}
.hero h1 {
font-size: clamp(4rem, 13vw, 13rem);
line-height: 0.88;
color: var(--concrete-dust);
margin: 0;
}
.hero h1 span {
display: block;
color: var(--concrete-rust);
}
.hero-subtitle {
font-family: 'IBM Plex Sans', sans-serif;
font-size: clamp(1rem, 1.8vw, 1.3rem);
max-width: 52ch;
margin-top: 2rem;
color: var(--concrete-weathered);
line-height: 1.8;
}
.hero .btn-row {
margin-top: 2.5rem;
display: flex;
flex-wrap: wrap;
gap: 0;
}
/* --- Buttons --- */
.btn {
display: inline-block;
font-family: 'Bebas Neue', sans-serif;
font-size: 1.1rem;
letter-spacing: 0.12em;
text-transform: uppercase;
padding: 0.9rem 2.2rem;
border: 3px solid var(--concrete-dust);
background-color: transparent;
color: var(--concrete-dust);
cursor: pointer;
text-decoration: none;
transition: none;
}
.btn:hover {
background-color: var(--concrete-rust);
border-color: var(--concrete-rust);
color: var(--concrete-dust);
}
.btn:active {
background-color: var(--concrete-iron);
border-color: var(--concrete-iron);
}
.btn--solid {
background-color: var(--concrete-rust);
border-color: var(--concrete-rust);
color: var(--concrete-dust);
}
.btn--solid:hover {
background-color: var(--concrete-corten);
border-color: var(--concrete-corten);
}
.btn--dark {
background-color: var(--concrete-charcoal);
border-color: var(--concrete-charcoal);
color: var(--concrete-dust);
}
.btn--dark:hover {
background-color: var(--concrete-rust);
border-color: var(--concrete-rust);
}
/* --- Structural Divider --- */
.divider {
border: none;
height: 6px;
background: var(--concrete-iron);
margin: 0;
}
.divider--rust {
height: 4px;
background: linear-gradient(
to right,
var(--concrete-rust),
var(--concrete-corten),
var(--concrete-rust)
);
}
/* --- Section Container --- */
.section {
padding: 5rem 3rem;
border-bottom: 3px solid var(--concrete-dark);
position: relative;
}
.section h2 {
font-size: clamp(2.5rem, 6vw, 5rem);
margin-bottom: 1.5rem;
}
.section-intro {
max-width: 65ch;
margin-bottom: 2.5rem;
color: var(--concrete-aged);
font-size: 1.05rem;
}
/* --- Card Grid --- */
.card-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
gap: 0;
border-top: 3px solid var(--concrete-dark);
border-left: 3px solid var(--concrete-dark);
}
.card {
border-right: 3px solid var(--concrete-dark);
border-bottom: 3px solid var(--concrete-dark);
padding: 2rem;
background-color: var(--concrete-bg);
position: relative;
overflow: hidden;
}
.card::before {
content: '';
position: absolute;
inset: 0;
background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='3' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='0.05'/%3E%3C/svg%3E");
background-size: 200px 200px;
pointer-events: none;
}
.card > * {
position: relative;
z-index: 1;
}
.card:hover {
background-color: var(--concrete-warm);
}
.card h3 {
font-size: 1.15rem;
margin-bottom: 0.75rem;
padding-bottom: 0.75rem;
border-bottom: 2px solid var(--concrete-aged);
}
.card p {
font-size: 0.95rem;
line-height: 1.7;
margin-bottom: 1rem;
color: var(--concrete-dark);
}
.card-tag {
display: inline-block;
font-family: 'Bebas Neue', sans-serif;
font-size: 0.75rem;
letter-spacing: 0.1em;
text-transform: uppercase;
border: 2px solid var(--concrete-aged);
padding: 0.15rem 0.5rem;
margin-right: 0.3rem;
color: var(--concrete-aged);
}
/* --- Feature Blocks --- */
.features {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
gap: 3rem;
margin-top: 3rem;
}
.feature {
padding: 2rem 0;
border-top: 4px solid var(--concrete-rust);
}
.feature-number {
font-family: 'Bebas Neue', sans-serif;
font-size: 3rem;
color: var(--concrete-weathered);
line-height: 1;
margin-bottom: 0.5rem;
}
.feature h3 {
font-size: 1.2rem;
margin-bottom: 0.75rem;
}
.feature p {
font-size: 0.95rem;
color: var(--concrete-dark);
line-height: 1.7;
}
/* --- Data Table --- */
.data-table {
width: 100%;
border-collapse: collapse;
font-size: 0.9rem;
margin-top: 2rem;
}
.data-table th,
.data-table td {
border: 3px solid var(--concrete-dark);
padding: 0.8rem 1rem;
text-align: left;
vertical-align: top;
}
.data-table th {
background-color: var(--concrete-charcoal);
color: var(--concrete-dust);
font-family: 'Bebas Neue', sans-serif;
font-size: 0.95rem;
letter-spacing: 0.1em;
text-transform: uppercase;
}
.data-table tr:hover td {
background-color: var(--concrete-warm);
}
/* --- Testimonial / Quote Block --- */
.quote-block {
padding: 3rem;
background-color: var(--concrete-shadow);
border-left: 8px solid var(--concrete-rust);
margin: 3rem 0;
position: relative;
}
.quote-block blockquote {
font-family: 'Roboto Slab', Georgia, serif;
font-size: clamp(1.1rem, 2vw, 1.4rem);
line-height: 1.7;
color: var(--concrete-limestone);
border: none;
padding: 0;
margin: 0;
background: none;
}
.quote-block cite {
display: block;
margin-top: 1.5rem;
font-family: 'Bebas Neue', sans-serif;
font-size: 0.9rem;
letter-spacing: 0.1em;
text-transform: uppercase;
color: var(--concrete-weathered);
font-style: normal;
}
/* --- Footer --- */
.footer {
padding: 3rem;
background-color: var(--concrete-iron);
border-top: 6px solid var(--concrete-charcoal);
}
.footer-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
gap: 2rem;
margin-bottom: 2rem;
}
.footer h4 {
font-size: 1rem;
letter-spacing: 0.15em;
color: var(--concrete-weathered);
margin-bottom: 1rem;
padding-bottom: 0.5rem;
border-bottom: 2px solid var(--concrete-dark);
}
.footer ul {
list-style: none;
}
.footer li {
padding: 0.3rem 0;
}
.footer a {
color: var(--concrete-aged);
text-decoration: none;
font-size: 0.9rem;
}
.footer a:hover {
color: var(--concrete-dust);
background: none;
text-decoration: underline;
}
.footer-bottom {
border-top: 1px solid var(--concrete-dark);
padding-top: 1.5rem;
}
.footer-bottom p {
font-size: 0.8rem;
color: var(--concrete-dark);
}
/* --- Utilities --- */
.mt-1 { margin-top: 1rem; }
.mt-2 { margin-top: 2rem; }
.mt-3 { margin-top: 3rem; }
/* --- Responsive --- */
@media (max-width: 768px) {
.hero {
min-height: 80vh;
padding: 3rem 1.5rem;
}
.section {
padding: 3rem 1.5rem;
}
.nav-brand {
padding: 0.75rem 1rem;
}
.nav a {
padding: 0.75rem 1rem;
font-size: 0.85rem;
}
.card-grid {
grid-template-columns: 1fr;
}
.features {
grid-template-columns: 1fr;
gap: 2rem;
}
.footer {
padding: 2rem 1.5rem;
}
.footer-grid {
grid-template-columns: 1fr;
}
}
</style>
</head>
<body>
<!-- NAVIGATION -->
<nav class="nav">
<div class="nav-inner">
<a href="#" class="nav-brand">Beton Brut</a>
<ul>
<li><a href="#about">About</a></li>
<li><a href="#projects">Projects</a></li>
<li><a href="#materials">Materials</a></li>
<li><a href="#data">Data</a></li>
<li><a href="#contact">Contact</a></li>
</ul>
</div>
</nav>
<!-- HERO -->
<section class="hero" id="top">
<h1>Concrete<br><span>Brutalism</span></h1>
<p class="hero-subtitle">
Raw concrete. Honest materials. Massive forms. We build with the
truth of beton brut -- celebrating the grain of formwork, the weight
of aggregate, and the unfinished beauty of architecture that refuses
to hide what it is made of.
</p>
<div class="btn-row">
<a href="#projects" class="btn btn--solid">View Projects</a>
<a href="#about" class="btn">Learn More</a>
</div>
</section>
<hr class="divider--rust">
<!-- ABOUT SECTION -->
<section class="section concrete-texture" id="about">
<h2>About the Practice</h2>
<p class="section-intro">
Born from Le Corbusier's declaration that raw concrete is beautiful in its
imperfection, our work embraces the material honesty of Brutalist architecture.
Every surface tells the story of its making -- the grain of the timber formwork,
the marks of the casting process, the slow patina of weather and time.
</p>
<div class="features">
<div class="feature">
<div class="feature-number">01</div>
<h3>Material Honesty</h3>
<p>
We never conceal what a building is made of. Concrete is left
exposed. Steel is left unclad. The structure is the finish.
</p>
</div>
<div class="feature">
<div class="feature-number">02</div>
<h3>Monumental Form</h3>
<p>
Our buildings assert their presence through scale and geometry.
Massive cantilevers, deep reveals, and bold silhouettes define
the relationship between structure and sky.
</p>
</div>
<div class="feature">
<div class="feature-number">03</div>
<h3>Textured Surfaces</h3>
<p>
Board-marked, bush-hammered, or exposed-aggregate -- every
concrete surface carries the deliberate texture of its making,
humanizing the architecture through tactile imperfection.
</p>
</div>
</div>
</section>
<hr class="divider">
<!-- PROJECTS (CARD GRID) -->
<section class="section" id="projects">
<h2>Projects</h2>
<p class="section-intro">
Each project is a concrete panel in a larger structure. The grid reveals
the modular system; the borders are expansion joints. Hover to see the
material beneath.
</p>
<div class="card-grid">
<div class="card">
<h3>Unité Résidentielle</h3>
<p>
A 337-unit housing block cast entirely in board-marked concrete.
The facade records every plank of the formwork that shaped it.
Twelve stories of honest material rising from an open piloti ground floor.
</p>
<span class="card-tag">Housing</span>
<span class="card-tag">Béton Brut</span>
</div>
<div class="card">
<h3>Aggregate Pavilion</h3>
<p>
An exhibition space with exposed-aggregate walls revealing the
river stone embedded within. Bush-hammered columns support a
cantilevered roof slab spanning 18 meters without intermediate support.
</p>
<span class="card-tag">Cultural</span>
<span class="card-tag">Cantilever</span>
</div>
<div class="card">
<h3>Formwork Library</h3>
<p>
A public library where every interior wall bears the imprint of
the timber boards used to cast it. Reading alcoves are carved
directly into the concrete mass, lit by deep slit windows.
</p>
<span class="card-tag">Public</span>
<span class="card-tag">Board-Marked</span>
</div>
<div class="card">
<h3>Piloti Tower</h3>
<p>
A 24-story residential tower raised on massive concrete piloti,
freeing the ground plane for public passage. The raw concrete
core is expressed as a visible spine running the full height of the building.
</p>
<span class="card-tag">Tower</span>
<span class="card-tag">Piloti</span>
</div>
</div>
</section>
<hr class="divider--rust">
<!-- QUOTE -->
<div class="quote-block">
<blockquote>
"The raw concrete surface, with all the imprints of the formwork,
adds a certain richness to the architecture. It humanises it."
</blockquote>
<cite>Le Corbusier, on the Unite d'Habitation, 1952</cite>
</div>
<!-- MATERIALS TABLE -->
<section class="section concrete-texture" id="materials">
<h2>Materials</h2>
<p class="section-intro">
A reference table of the primary materials and surface treatments
used in Concrete Brutalism. Each material is left honest and unfinished.
</p>
<table class="data-table">
<thead>
<tr>
<th>Material</th>
<th>Finish</th>
<th>Application</th>
<th>Character</th>
</tr>
</thead>
<tbody>
<tr>
<td>Poured Concrete</td>
<td>Board-marked</td>
<td>Walls, ceilings, structural cores</td>
<td>Horizontal grain lines from timber formwork</td>
</tr>
<tr>
<td>Precast Concrete</td>
<td>Smooth / sandblasted</td>
<td>Facade panels, cladding</td>
<td>Uniform surface with visible panel joints</td>
</tr>
<tr>
<td>Exposed Aggregate</td>
<td>Bush-hammered</td>
<td>Feature walls, columns, paving</td>
<td>Rough, speckled texture revealing stone within</td>
</tr>
<tr>
<td>Corten Steel</td>
<td>Weathered patina</td>
<td>Cladding, screens, structural accents</td>
<td>Deep rust-orange that stabilizes over time</td>
</tr>
<tr>
<td>Raw Timber</td>
<td>Untreated / oiled</td>
<td>Formwork references, interior warmth</td>
<td>Warm grain that contrasts with cool concrete</td>
</tr>
</tbody>
</table>
</section>
<hr class="divider">
<!-- DATA SECTION -->
<section class="section" id="data">
<h2>By the Numbers</h2>
<p class="section-intro">
Quantified characteristics of the Concrete Brutalism approach.
</p>
<table class="data-table">
<thead>
<tr>
<th>Metric</th>
<th>Value</th>
<th>Context</th>
</tr>
</thead>
<tbody>
<tr>
<td>Primary palette colors</td>
<td>8 grays</td>
<td>Derived from concrete at different moisture levels</td>
</tr>
<tr>
<td>Accent materials</td>
<td>3</td>
<td>Rust, timber, copper -- each referencing real substances</td>
</tr>
<tr>
<td>Minimum border weight</td>
<td>3px</td>
<td>Thinner borders feel insubstantial against concrete textures</td>
</tr>
<tr>
<td>Border-radius permitted</td>
<td>0px</td>
<td>No rounded corners -- concrete is cast in angular forms</td>
</tr>
<tr>
<td>Transition duration</td>
<td>0ms</td>
<td>State changes are instantaneous -- like light on stone</td>
</tr>
</tbody>
</table>
</section>
<!-- CONTACT -->
<section class="section" id="contact">
<h2>Contact</h2>
<p class="section-intro">
Structural inquiries and material consultations.
</p>
<p>
Email: <a href="mailto:studio@betonbrut.example">studio@betonbrut.example</a>
•
Location: Marseille, France
•
<a href="#">View on map</a>
</p>
<div class="mt-2">
<a href="#" class="btn btn--dark">Send Inquiry</a>
</div>
</section>
<!-- FOOTER -->
<footer class="footer">
<div class="footer-grid">
<div>
<h4>Studio</h4>
<ul>
<li><a href="#">About</a></li>
<li><a href="#">Team</a></li>
<li><a href="#">Process</a></li>
<li><a href="#">Careers</a></li>
</ul>
</div>
<div>
<h4>Work</h4>
<ul>
<li><a href="#">Residential</a></li>
<li><a href="#">Cultural</a></li>
<li><a href="#">Public</a></li>
<li><a href="#">Infrastructure</a></li>
</ul>
</div>
<div>
<h4>Resources</h4>
<ul>
<li><a href="#">Material Library</a></li>
<li><a href="#">Concrete Finishes</a></li>
<li><a href="#">Formwork Guide</a></li>
<li><a href="#">Brutalism Archive</a></li>
</ul>
</div>
<div>
<h4>References</h4>
<ul>
<li><a href="#">Le Corbusier</a></li>
<li><a href="#">Reyner Banham</a></li>
<li><a href="#">Barbican Estate</a></li>
<li><a href="#">Trellick Tower</a></li>
</ul>
</div>
</div>
<div class="footer-bottom">
<p>
Built with raw HTML and CSS. No frameworks. No build steps.
View source to verify. © 2025 Beton Brut Studio.
</p>
</div>
</footer>
</body>
</html>
transition: none globally as a reset: Add * { transition: none !important; } during development to catch any inherited transitions from resets or third-party CSS; Concrete Brutalism demands instant state changes, and even a 100ms ease-out feels wrong against this aesthetic