1.2.1

Parsing

1.2.0

Most entries below are defect fixes, and the largest group of them has one cause: readers, printers and optimizer passes each walked the statement tree with their own match ending in a catch-all case, so an at-rule added to the AST later was skipped by all of them instead of causing a compile error. They now share a single exhaustive walk, so adding a statement kind after this release breaks the build at every place that has to decide about it.

Correctness is now also checked against a browser. The suite now renders a sheet and its optimised form in headless Chrome, over a document derived from the sheet's own selectors, and compares the two pages pixel for pixel. It also replays 2960 recorded minification cases carrying six minifiers' answers. Several of the fixes below are cases where Chrome disagreed with the CSS cascade emitted, not readings of the spec.

Upgrading from 1.1.0. Many of the fixes below change the CSS cascade emits for input 1.1.0 already accepted, and enough of them are miscompiles that a page can render differently. If you shipped minified output built with 1.1.0, re-run it and compare: cascade diff --diff=canonical old.css new.css exits 1 and prints the difference wherever the two are not equivalent. Library callers should start at ### Breaking, where the public module set and the parser entry points both moved.

Breaking

Parsing

Cascade used to keep the part of a value it recognised and ignore the rest, and to lose a whole rule over one bad piece. Both are gone.

Printing

Minification

Custom properties

Canonical diff

Library

CLI tools

Testing

1.1.0

Breaking

Parsing

Printing and nesting

Minification

Custom properties and @layer

Canonical diff

Diff report

New properties and values

Testing

1.0.0

First public release. Cascade was extracted from the tw (Tailwind CSS v4 in OCaml) project as a standalone CSS command-line tool and library, then stabilised over several internal milestones.

Library

CLI tools

Notes