Three layers of customization: deciding where a change belongs
Ant Design's token pipeline and ConfigProvider solve different parts of the same problem: preserving relationships while allowing a product to vary. The useful judgment is not whether the library is customizable, but where a proposed change should live. This checkpoint connects design intent, algorithms, inherited context, and local exceptions into one scope decision, so a team can predict both the benefit of a customization and the kind of drift it might create.
One pipeline, four kinds of decision
The first connection is causal. A product decision enters Ant Design as design intent; a token algorithm derives the related values; ConfigProvider carries the result and other policy through a React subtree; a component resolves that context into concrete states and output. These are not independent features that happen to share an API. Each is the next owner of a different part of the same decision.
A brand color is a useful example. The brand choice is a seed-level premise. The palette and semantic backgrounds derived from it are Map-level consequences. The names consumed by common component styles are Alias-level roles. The provider makes the resolved theme available to a subtree. A Button, link, selected menu item, or focus treatment then decides how its own contract uses those roles. If the color is changed in the wrong place, one link in this chain may move while the others remain fixed.
Density follows the same pattern. “Our operations team needs to see more rows at once” is not automatically a request for smaller padding on one table. It may be a product-wide compactness decision that should affect control heights and related type sizes. But “this one action has a long translated label” may be a local layout problem. Treating both requests as the same kind of override hides the difference between a shared premise and a local constraint.
Imagine that a product team brings one request with three sentences: “Use our green brand in the approval flow, make the data-entry panel denser, and make the final approval button stand out.” The first sentence may describe a global seed if green is the product's primary action color. The second may describe a nested compact policy if only that panel is dense. The third may be a component or state decision, because emphasis belongs to the meaning of the action rather than to a new global palette. One request can therefore contain several architectural changes. Treating it as one CSS override is a sign that the request has not yet been decomposed.
The relationship can be expressed without treating the system as a component catalogue: