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.