I've written CSS for long enough to have accumulated a lot of workarounds. Over the last couple of years a surprising number of them have become unnecessary, and I keep catching myself reaching for a tool I no longer need.
Container queries
Media queries ask about the viewport, which is the wrong question. A card doesn't care how wide the window is; it cares how much room *it* has. That mismatch is why component libraries ended up with size props — <Card size="compact"> was always a workaround for CSS not being able to ask.
Now it can, and a component can be genuinely self-contained: drop it in a sidebar and it adapts, with no prop and no JavaScript measuring anything.
:has()
The "parent selector" framing undersells it. What it really gives you is styling based on state that lives in the DOM rather than in JavaScript.
A form field that styles its wrapper when the input is invalid. A card that changes when it contains an image. A layout that adapts when a slot is filled. All of these previously required a class toggled by JavaScript, which meant they were only correct if the JavaScript was correct.
Cascade layers
Specificity wars are the reason CSS got a reputation for being unmanageable, and @layer addresses the actual cause: there was no way to express *intent* about precedence, only to escalate.
Declaring layer order up front — reset, then base, then components, then utilities — means a utility beats a component because you said so, not because it has more class selectors stacked up. It's also the clean answer to overriding a third-party stylesheet without !important.
Subgrid
The long-standing failure of card grids: three cards side by side, each with a title, body and footer, and none of the rows line up because each card is its own layout context.
Subgrid lets children participate in the parent's grid, so the titles align across cards regardless of length. Every previous solution was a fixed height and a hope.
What I still reach for
Not everything is solved. Nesting is native now but tooling still helps with organisation, and a build step for autoprefixing and minification isn't going away. Utility classes remain a good answer to naming fatigue rather than to a technical gap.
But the balance has shifted. It's worth periodically re-checking which of your workarounds are still load-bearing.