v0.2.0 — variants that actually emit, and an exit door
Tabula v0.2.0 — variants that actually emit, and an exit door
Breaking
- Registry schema v3.
registry.jsongainsvariantProducts,chainCount, and
chainExceptions; readers accept only v3. Upgrading from v0.1.0: runtabula buildonce —
every artifact regenerates (registrySchemaVersion 2 != reader's 3is the error you'll see
until you do). variantChainMaxLengthdefault is now 2 (was 3), matching the shippedtypes.d.tsgrammar.
Fixed
- Variant classes emit CSS. In v0.1.0, every variant-prefixed class (
hover:bg-accent-hover,
sm:p-md, chains) silently produced no CSS:@source inlinewhitelisted only base classes
whilesource(none)disabled scanning. v0.2.0 makes variant chains a first-class part of the
registered set — T3 (Closure) keeps its exact wording; the registered set now includes
declared variant products.
New
- Declared variant products (
variantsconfig section):preset
(interaction— the default — /all-len1/none), explicitproducts
(chain-prefix → families), and amaxChainCandidatesbudget (default 20,000,TAB-E172).
The preset emits chain rules as literal CSS in a trailing@layer utilitiesblock, in global
(effectiveRank, class)order — cascade order provably matches the merge model (the
conformance oracle asserts it against a real Tailwind build). - Loud failure paths, never silent-missing-CSS:
tabula scanrejects out-of-set chains
(TAB-E230, with canonical-order rewrites and declare-this-product fix-its), config gates
(TAB-E170media-without-breakpoints,TAB-E171malformed products), andcn()dev-throws
on undeclared chains. - Chain exceptions:
tabula except add --chain hover:p-mdregisters a single chain class
as an exact-class grant with the same paperwork/expiry as value exceptions. - Provenance-preserving artifacts:
tokens.resolved.jsonnow carries$deprecated,
$extensions(includingtabula.contrastWithaccessibility contracts), and$alias
markers;.tabula/tabula.config.jsonis a canonical copy of the config that built the
artifacts. Restoring a buildable profile from a frozen.tabula/is now near-lossless. tabula eject— the one-way freeze: dry-run by default,--yesto execute, fail-closed
integrity preconditions,EJECTED.mdprovenance (including thecn()keep-merge policy and
an exception-expiry table,TAB-W402),--write-imports. The frozen directory compiles on
stock@tailwindcss/cliwith zero Tabula packages — verified end-to-end.
Docs
- New guide: Eject — plus full v0.2 API
reference updates, in English, 한국어, 日本語, and 简体中文.
All 10 packages published in lockstep at 0.2.0 with npm provenance.