01 Languages & frameworks

CSS

Modern CSS covers what a build step used to, so there is one fewer thing between you and the page.

Role
Styling
Licence
Open standard
Since
1996
Upstream
Project site ↗

CSS is on this list on purpose. We write it directly, without a framework in front of it.

Why we still choose it

The language has grown up. Custom properties made design tokens native, so a palette is defined in one place and can be themed without a rebuild. Grid and flexbox replaced a decade of layout workarounds, and clamp() turned fluid typography into a one-liner. Container queries, :has(), cascade layers and nesting cover most of what we used a preprocessor for.

In practice a bespoke stylesheet now comes out smaller and clearer than the configuration file for a framework that would generate one. This site’s design system, including light and dark themes, the type scale, the grid and every component, is around 30 kB of CSS with no runtime and no utility classes in the markup.

How we write it

Tokens on :root, a handful of layout primitives, and components named after what they are. Sass is still there for file organisation and nesting, but nothing we write depends on it. Dark mode redefines the tokens instead of loading a parallel stylesheet. We keep the markup readable, since HTML that describes its content lasts longer than HTML that describes its appearance.

Where it falls short

Writing CSS well needs someone on the team who knows CSS well. Without that person, a utility framework does help a team keep a large codebase together. Our approach trades more required skill for much less machinery, and leaves a stylesheet that whoever inherits it can still follow.

Nästa steg

Tell us what you are running.
We will tell you what it should be.

A first conversation costs nothing and takes forty minutes. You will leave it with our opinion of your stack, which is occasionally that you should change nothing at all.