This is not a purity argument. We use tooling. We just check, every couple of years, whether the tooling is still earning its place.
What changed underneath
Grid, custom properties, container queries, clamp(), color-mix(), cascade layers, :has(). Half of what a build step used to buy is now a line of CSS that ships to every browser we support, with no runtime and nothing to keep up to date.
What we still reach for
- A utility layer, for the eighty per cent of declarations that are one property
- A token block, so a colour lives in exactly one place
- A cascade layer, so a base rule can never silently beat a utility
That is close to the whole list.
The cost nobody prices
Every abstraction is a thing the next person has to learn before they can change a margin. On a site that will outlive the team that built it, that is the expensive part — not the kilobytes.
When we would do it differently
Application UI with heavy state, shared across a large team, on a long-lived product. Different problem, different answer. The mistake is picking the answer before you have said which problem you have.
Half of what a build step used to buy is now a line of CSS that ships to every browser we support.