The Contract
Components do not carry their own colors, spacing, or type scale. They consume global design tokens:--color-primary,--space-m,--font-sand their relatives, defined once in your site's_design-tokens.css. That single file is the vocabulary, and it is how thirty installed components end up looking like one site instead of thirty.
The vocabulary is also a promise, and the promise runs in both directions. The moment a canon component consumes a token, every consuming site must define that token, and must keep defining it for as long as the component is installed anywhere. So:
- Canon never references a token the vocabulary has not shipped.
- The vocabulary never renames or drops a token canon consumes.
Neither side can see the other's working tree, which is why the contract needs to be auditable rather than remembered. Both halves of the tooling are covered at the end of this post.
The cost of the promise is what shapes the rest of the contract. Adding a token to the vocabulary is easy; removing one is a breaking change for every site that ever installed a component consuming it. That asymmetry is why the vocabulary should stay small, and it is why the next section exists.