Compatibility

What matches dart-sass, what does not, and how it is measured.

dart-sass is the reference implementation, currently 1.104.1. A deviation from it is a bug rather than a dialect, with two declared exceptions: error message wording and error spans.

The framework corpus

CI compiles four real frameworks with both engines on every commit. A single differing colour value fails the job.

FrameworkVersionResult
Bulma1.0.4No colour differences
Pico2.1.1No colour differences
Foundation6.9.0No colour differences
USWDS3.13.0No colour differences

Foundation gets a second check: a probe stylesheet calls every Sass function Foundation documents, one per line, and any differing line fails the build. Whole-framework output tolerates rule grouping and ordering; a function result does not.

Bootstrap 5.0.2 is compiled too, but advisory: it reports the delta rather than gating.

Byte-identical output

All four frameworks compile byte-identically to dart-sass 1.104.1, comments included. For USWDS 3.13.0 that is 32,781 lines each, zero differences. Measured 2026-09-13 with .github/scripts/frameworks.sh.

The spec suite

The official sass-spec suite, run against the release build:

14266 runs, 14147 passing, 111 failures, 8 todo, 0 ignored, 0 errors

Measured on macOS 2026-09-13 against sass-spec b39c32768, with the flags CI uses: --trim-errors --ignore-warning-diffs --ignore-error-diffs. The Linux CI runner reports two fewer passing, 14,145, an offset that is stable across commits. The job is advisory in CI and publishes the tallies rather than gating.

The 111 remaining failures are tracked one work item at a time in specs/docs/features/, ranked by how many fixtures each would unlock.

Known divergences

Compressed output

--style compressed produces equivalent CSS that is under-minified rather than wrong. Measured across USWDS:

ClassCountThis compilerdart-sass
Numbers inside calc()623calc(1rem - .25rem)calc(1rem - 0.25rem)
Commas in font stacks378Helvetica,RobotoHelvetica, Roboto
@supports spacing, transparent110@supports (mask: ...)@supports(mask: ...)
A rule left empty once its comment is dropped8keptomitted
Semicolon before the closing brace8...:100%;}...:100%}

Every one is valid CSS meaning the same thing; the file is simply larger than dart-sass's. If byte-for-byte minification matters, run a dedicated minifier over the expanded output.

Warning and debug formatting

The message text of @warn and @debug matches dart-sass, including the rule that a string message is reported as its text: @warn "careful" says careful. @debug matches in full, down to the line it writes: file.scss:2 DEBUG: careful.

What surrounds a @warn message does not. This compiler writes Warning: ... above an ./file:line:column location, where dart-sass writes WARNING: ... above an indented stack trace. Do not match on those two lines.

Deprecation warnings

One deprecation is reported so far, bogus-combinators: a style rule whose selector has a leading, trailing or repeated combinator, and an @extend inside one. Its banner, message and source frame match dart-sass 1.104.1.

The line below the frame does not always. dart-sass writes a stack trace; this compiler writes the file, line and column, followed by root stylesheet only when that is the whole trace: a warning from the entry stylesheet, outside any mixin or function. A warning from a module names the module by the path it was loaded from, where dart-sass prints it relative to the working directory.

Not reported yet: the other deprecations dart-sass has, including import for @import and global-builtin for global functions, and the bogus-combinators warning the selector functions give, such as $extender: > is not valid CSS. from selector.extend().

Error messages and spans

Wording may change between bugfix versions, and which characters an error points at may change. Do not match on either.

Not implemented

  • Source maps
  • --watch

How to check a claim yourself

# The framework corpus, against a real dart-sass binary
.github/scripts/frameworks.sh

The script installs the frameworks from npm, compiles each with both engines, and reports differing lines, colour-bearing differences, and the difference after canonicalising both sides through lightningcss.

Note

Use the native dart-sass release binary, which is what CI uses. The npm sass package is the JavaScript build and does not always agree with it.