Two years into building block themes for clients, the honest summary is this: theme.json is worth the trouble, but not for the reason it is usually sold.
It is not really about the editor
The pitch is that clients get to change their own colours. In practice most clients never open those controls, and the ones who do usually should not. The actual value is that a design system stops living in a stylesheet where it can drift.
A palette declared once becomes a CSS custom property, an editor control, a set of utility classes and a constraint on what anyone can pick — from a single declaration. That is a genuinely different situation from a :root block that a developer can quietly ignore at 2am.
Where it still hurts
- Anything structural — a grid that has to collapse in a particular order, a sticky rail, a hover that wipes across a card — still belongs in a stylesheet. Block supports do not reach it.
- Specificity between
theme.jsonoutput and your own sheet is a real thing you have to hold in your head. - The moment a client edits a template in the Site Editor, the database wins and your file becomes decoration. Decide early whether that is allowed.
We settle it by putting tokens in theme.json, structure in one stylesheet, and treating block style variations as the seam between them.