Skip to content

v0.2.0 — variants that actually emit, and an exit door

Choose a tag to compare

@Toragonite Toragonite released this 28 Jul 02:50
· 4 commits to main since this release

Tabula v0.2.0 — variants that actually emit, and an exit door

Breaking

  • Registry schema v3. registry.json gains variantProducts, chainCount, and
    chainExceptions; readers accept only v3. Upgrading from v0.1.0: run tabula build once —
    every artifact regenerates (registrySchemaVersion 2 != reader's 3 is the error you'll see
    until you do).
  • variantChainMaxLength default is now 2 (was 3), matching the shipped types.d.ts grammar.

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 inline whitelisted only base classes
    while source(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 (variants config section): preset
    (interaction — the default — / all-len1 / none), explicit products
    (chain-prefix → families), and a maxChainCandidates budget (default 20,000, TAB-E172).
    The preset emits chain rules as literal CSS in a trailing @layer utilities block, 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 scan rejects out-of-set chains
    (TAB-E230, with canonical-order rewrites and declare-this-product fix-its), config gates
    (TAB-E170 media-without-breakpoints, TAB-E171 malformed products), and cn() dev-throws
    on undeclared chains.
  • Chain exceptions: tabula except add --chain hover:p-md registers a single chain class
    as an exact-class grant with the same paperwork/expiry as value exceptions.
  • Provenance-preserving artifacts: tokens.resolved.json now carries $deprecated,
    $extensions (including tabula.contrastWith accessibility contracts), and $alias
    markers; .tabula/tabula.config.json is 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, --yes to execute, fail-closed
    integrity preconditions, EJECTED.md provenance (including the cn() keep-merge policy and
    an exception-expiry table, TAB-W402), --write-imports. The frozen directory compiles on
    stock @tailwindcss/cli with 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.