ATELIERBRUT

How the concrete was poured

Atelier Brut is a fictional experimental type foundry in Marseille that sells nothing politely. The audience is designers who buy typefaces the way other people buy records. The page has one job: make you feel the letters as physical, load-bearing material — then show you the price without ceremony.

Palette

Raw concrete
#B8B2A7
The page is the slab. Warm grey, never beige — it reads as material, not background.
Wet concrete
#6E6A62
Secondary voice for metadata and hairline-free dividers. Deliberately low contrast: used only large or decorative, never for body copy.
Shuttering black
#0F0E0C
Not pure #000 — a carbon black with warmth, so the concrete sections and dark sections feel cast from the same mix.
Signal orange
#FF4D00
Site-safety orange: the colour of load warnings and crane hooks. Spent almost entirely on the stress test and small wayfinding marks.

Type

Béton Brut, opsz 144

Fraunces at maximum optical size, weight 900. The display voice of the foundry — a slab that behaves like poured mass. Its SOFT axis (0–100) is the "slump" of the mix, worked live in the specimen rows.

Formwork keeps the wonk

Fraunces with WONK set to 1: stems drift like hand-set metal against warped plywood. The wonk is the brand — the mistakes stay in.

Rebar takes tension

Archivo condensed to width 62, weight 850. The structural steel: navigation, labels, and the stress-test headline that gets loaded to failure.

aggregate spreads the load

Archivo at width 125, weight 350 — the wide, even body voice. Real body copy runs Archivo near its default axes so reading stays effortless between the heavy moments.

Techniques

Signature — the scroll-velocity stress test
A 320vh section with a position:sticky stage. A requestAnimationFrame loop measures scroll velocity (px/s) each frame from scrollY deltas, smooths it with an asymmetric lerp (fast attack 0.22, slow decay 0.05 — the type snaps under load and relaxes like settling concrete), then maps the eased value onto the headline's variable axes: wght 200→900 and wdth 62→125, written as CSS custom properties consumed by font-variation-settings. An instrument panel reads out velocity, both axes, and the session peak. An IntersectionObserver gates the writes so the axes only animate while the section is on screen.
Cursor-weighted hero
Each letter of BRUT is a span with its own --wght. The letter nearest the cursor carries up to weight 900, falling off with distance — the cursor physically loads the word. Cursor Y drives the SOFT axis. Values are lerped in the same rAF loop for inertia.
Specimen axis scrubbing
Each specimen row exposes one axis (SOFT, WONK, wght, wdth) via data attributes; pointer X scrubs the axis across its full range with a live tabular-numeral readout, and pointerleave snaps back to the rest value.
GSAP split-text doctrine
Doctrine lines are split into word spans at runtime (overflow-hidden masks) and revealed with a ScrollTrigger'd stagger on power4.out — one orchestrated moment rather than scattered effects.
CSS-only marquees
Two duplicated glyph tracks on a linear translateX keyframe, opposite directions, alternating concrete/orange glyphs with WONK at 1. Pure CSS, killed entirely under reduced motion.
No images anywhere
Every visual is typography, borders, and four flat colours. The favicon is an inline SVG data URI.

Iteration log

Pass 1 — Craft

Pass 2 — Depth

Pass 3 — Hardening