Skip to content
← Doctrine

Posture

What this system refuses to be. The restrictions above are enforced by gates; the stances here are deliberate refusals.

The look is the product

The brand yellow, the radius ladder, the type ramp — these are not a starting point you retheme. They are the product. There is no theming API: no runtime theme prop, no provider to reconfigure, no override hook. The internal CSS custom properties are an implementation detail, not a public contract; reaching in to reassign them is unsupported and may break on any release. Light and dark are the two modes, and that is the entire surface.

Private, not open source

The package is UNLICENSED and published restricted. It is an internal instrument, built for one house style, not a general-purpose library to be forked and reshaped. Framing it as closed is what lets it stay this opinionated — there is no external audience of divergent needs to soften it for.

You build on top, not against

Restriction is not a dead end — it redirects the work upward. The sanctioned levers are className on primitives (still held inside the token language), asChild composition, and the compositions layer where domain assemblies live. ProductCard is one such assembly — it composes 14 lower units into a single domain control without touching a single token. That is the whole shape of extension here: you add above the line, never below it.

A note on styling weight

The JavaScript tree-shakes — importing Button bundles only Button. The CSS does not work that way. Tailwind scans the package's files, not your import graph, so your build emits the whole design-system utility vocabulary no matter how few components you use. It dedupes to tens of kilobytes and caches after first load; there is no lighter stylesheet to reach for. Importing less does not make it smaller — the vocabulary is delivered whole because it is meant to be used whole.