NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
pub.dev · #1313 most downloaded on pub.dev
A Sass implementation in Dart.
Last release 7 days ago
11 Sep 2026
Ships fairly regularly
a new release about every 3 weeks
Nearly every release is documented
notes for 60 of the last 60 stable releases
Nothing withdrawn
no release was ever pulled
13 years old
356 releases · first in 2013
Add a charset option that controls whether or not Sass emits a @charset/BOM for non-ASCII stylesheets.
charset option that controls whether or not Sass emits a
@charset/BOM for non-ASCII stylesheets.* No user-visible changes
* No user-visible changes
One column per quarter.
In expanded mode, emit characters in Unicode private-use areas as escape sequences rather than literal characters.
In expanded mode, emit characters in Unicode private-use areas as escape sequences rather than literal characters.
Fix a bug where quotes would be omitted for an attribute selector whose value was a single backslash.
Properly consider numbers that begin with . as "plain CSS" for the purposes
of parsing plain-CSS min() and max() functions.
Allow if to be used as an unquoted string.
Properly parse backslash escapes within url() expressions.
Fix a couple bugs where @extends could be marked as unsatisfied when
multiple identical @extends extended selectors across @use rules.
Don't crash when a Windows path is returned by a custom Node importer at the same time as file contents.
Don't crash when an error occurs in a stylesheet loaded via a custom importer with a custom URL scheme.
SassArgumentList.keywordsWithoutMarking getter to access the keyword
arguments of an argument list without marking them accessed.* No user-visible changes.
* No user-visible changes.
* No user-visible changes.
* No user-visible changes.
* No user-visible changes.
Potentially breaking bug fix: SassNumber.asSlash, SassNumber.withSlash(), and SassNumber.withoutSlash() have been marked as @internal. They were never
Potentially breaking bug fix: SassNumber.asSlash,
SassNumber.withSlash(), and SassNumber.withoutSlash() have been marked as
@internal. They were never intended to be used outside the sass package.
Potentially breaking bug fix: SassException has been marked as @sealed
to formally indicate that it's not intended to be extended outside of the
sass package.
Add a Value.withListContents() method that returns a new Sass list with the
same list separator and brackets as the current value, interpreted as a list.
These are intended to replace the existing compile*() methods, which are now deprecated. Rather than returning a simple string, these return a Compile…
Added compileToResult(), compileStringToResult(),
compileToResultAsync(), and compileStringToResultAsync() methods. These
are intended to replace the existing compile*() methods, which are now
deprecated. Rather than returning a simple string, these return a
CompileResult object, which will allow us to add additional information
about the compilation without having to introduce further deprecations.
Instead of passing a sourceMaps callback to compile*(), pass
sourceMaps: true to compile*ToResult() and access
CompileResult.sourceMap.
The CompileResult object exposes a loadedUrls object which lists the
canonical URLs accessed during a compilation. This information was
previously unavailable except through the JS API.
Potentially breaking bug fix: Properly throw an error for Unicode ranges that have too many ?s after hexadecimal digits, such as U+12345??.
Potentially breaking bug fix: Properly throw an error for Unicode ranges
that have too many ?s after hexadecimal digits, such as U+12345??.
Potentially breaking bug fix: Fixed a bug where certain local variable
declarations nested within multiple @if statements would incorrectly
override a global variable. It's unlikely that any real stylesheets were
relying on this bug, but if so they can simply add !global to the variable
declaration to preserve the old behavior.
Potentially breaking bug fix: Fix a bug where imports of root-relative
URLs (those that begin with /) in @import rules would be passed to
both Dart and JS importers as file: URLs.
Properly support selector lists for the $extendee argument to
selector.extend() and selector.replace().
Fix an edge case where @extend wouldn't affect a selector within a
pseudo-selector such as :is() that itself extended other selectors.
Fix a race condition where meta.load-css() could trigger an internal error
when running in asynchronous mode.
@internal annotation to indicate which Value APIs are available
for public use.Fix a bug where the quiet dependency flag didn't silence warnings in some stylesheets loaded using @import.
@import.Add a verbose option which causes the compiler to emit all deprecation warnings, not just 5 per feature.
Fix a couple bugs that could prevent some members from being found in certain files that use a mix of imports and the module system.
Fix incorrect recommendation for migrating division expressions that reference namespaced variables.
Add a quietDeps option which silences compiler warnings from stylesheets
loaded through importers and load paths.
Add a verbose option which causes the compiler to emit all deprecation
warnings, not just 5 per feature.
Fix the URL for the @-moz-document deprecation message.
Fix a bug where --update would always compile any file that depends on a
built-in module.
Fix the URL for the @-moz-document deprecation message.
Fix a bug with @for loops nested inside property declarations.
Cap deprecation warnings at 5 per feature by default.
Don't emit the same warning in the same location multiple times.
Cap deprecation warnings at 5 per feature by default.
Add a --quiet-deps flag which silences compiler warnings from stylesheets
loaded through --load-paths.
Add a --verbose flag which causes the compiler to emit all deprecation
warnings, not just 5 per feature.
Add a quietDeps argument to compile(), compileString(),
compileAsync(), and compileStringAsync() which silences compiler warnings
from stylesheets loaded through importers, load paths, and package: URLs.
Add a verbose argument to compile(), compileString(), compileAsync(),
and compileStringAsync() which causes the compiler to emit all deprecation
warnings, not just 5 per feature.
Deprecate the use of / for division. The new math.div() function should be used instead. See [this page][] for details.
/ for division. The new math.div() function should be
used instead. See this page for details.Add a list.slash() function that returns a slash-separated list.
Potentially breaking bug fix: The heuristics around when potentially
slash-separated numbers are converted to slash-free numbers—for example, when
1/2 will be printed as 0.5 rather than 1/2—have been slightly expanded.
Previously, a number would be made slash-free if it was passed as an argument
to a user-defined function, but not to a built-in function. Now it will be
made slash-free in both cases. This is a behavioral change, but it's unlikely
to affect any real-world stylesheets.
:is() now behaves identically to :matches().
Fix a bug where non-integer numbers that were very close to integer values would be incorrectly formatted in CSS.
Fix a bug where very small number and very large negative numbers would be incorrectly formatted in CSS.
this context for importers now has a fromImport field, which is true
if the importer is being invoked from an @import and false otherwise.
Importers should only use this to determine whether to load import-only
files.Importer.fromImport getter, which is true if the current
Importer.canonicalize() call comes from an @import rule and false
otherwise. Importers should only use this to determine whether to load
import-only files.Potentially breaking bug fix: Null values in @use and @forward configurations no longer override the !default variable, matching the behavior of the e
Potentially breaking bug fix: Null values in @use and @forward
configurations no longer override the !default variable, matching the
behavior of the equivalent code using @import.
Use the proper parameter names in error messages about string.slice
Fix a bug that disallowed more than one module from extending the same selector from a module if that selector itself extended a selector from another
Fix a bug where bogus indented syntax errors were reported for lines that contained only whitespace.
* No user-visible changes.
Update chokidar version for Node API tests.
render() options object within its
local context, as this.options.Allow the null safety release of stream_transform.
Allow the null safety release of stream_transform.
Allow @forward...with to take arguments that have a !default flag without
a trailing comma.
Improve the performance of unitless and single-unit numbers.
Fix Electron support when nodeIntegration is disabled.
nodeIntegration is disabled.SassColor constructors now throw RangeErrors with
start and end set.Potentially breaking bug fix: When using @for with numbers that have units, the iteration variable now matches the unit of the initial number. This ma
@for with numbers that have
units, the iteration variable now matches the unit of the initial number. This
matches the behavior of Ruby Sass and LibSass.Fix a few infrequent errors when calling render() with fiber multiple
times simultaneously.
Avoid possible mangled error messages when custom functions or importers throw unexpected exceptions.
Fix Electron support when nodeIntegration is disabled.
* No user-visible changes.
Optimize == for numbers that have different units.
== for numbers that have different units.Print the actual number that was received in unit deprecation warnings for color functions.
Don't emit permissions errors on Windows and OS X when trying to determine the real case of path names.
Deprecate passing non-% numbers as lightness and saturation to hsl(), hsla(), color.adjust(), and color.change(). This matches the CSS specification,…
Deprecate passing non-% numbers as lightness and saturation to hsl(),
hsla(), color.adjust(), and color.change(). This matches the CSS
specification, which also requires % for all lightness and saturation
parameters. See [the Sass website][color-units] for more details.
Deprecate passing numbers with units other than deg as the hue to hsl(),
hsla(), adjust-hue(), color.adjust(), and color.change(). Unitless
numbers are still allowed here, since they're allowed by CSS. See [the Sass
website][color-units] for more details.
Improve error messages about incompatible units.
Properly mark some warnings emitted by sass:color functions as deprecation
warnings.
Rename SassNumber.valueInUnits() to SassNumber.coerceValue(). The old name
remains, but is now deprecated.
Rename SassNumber.coerceValueToUnit(), a shorthand for
SassNumber.coerceValue() that takes a single numerator unit.
Add SassNumber.coerceToMatch() and SassNumber.coerceValueToMatch(), which
work like SassNumber.coerce() and SassNumber.coerceValue() but take a
SassNumber whose units should be matched rather than taking the units
explicitly. These generate better error messages than SassNumber.coerce()
and SassNumber.coerceValue().
Add SassNumber.convertToMatch() and SassNumber.convertValueToMatch(),
which work like SassNumber.coerceToMatch() and
SassNumber.coerceValueToMatch() except they throw exceptions when converting
unitless values to or from units.
Add SassNumber.compatibleWithUnit(), which returns whether the number can be
coerced to a single numerator unit.
Fix a bug where @at-root (without: all) wouldn't properly remove a @keyframes context when parsing selectors.
@at-root (without: all) wouldn't properly remove a
@keyframes context when parsing selectors.main() function in sass.js now returns a Promise that
completes when the executable is finished running.Support a broader syntax for @supports conditions, based on the latest [Editor's Draft of CSS Conditional Rules 3]. Almost all syntax will be allowed
@supports conditions, based on the latest
Editor's Draft of CSS Conditional Rules 3. Almost all syntax will be allowed
(with interpolation) in the conditions' parentheses, as well as function
syntax such as @supports selector(...).Add a [color.hwb()] function to sass:color that can express colors in [HWB] format.
color.hwb() function to sass:color that can express colors in HWB format.color.whiteness() and color.blackness() functions to sass:color
to get a color's HWB whiteness and blackness components.$whiteness and $blackness parameters to color.adjust(),
color.change(), and color.scale() to modify a color's HWB whiteness
and blackness components.SassColor class, including a SassColor.hwb()
constructor, whiteness and blackness getters, and a changeHwb() method.* No user-visible changes.
Potentially breaking bug fix: meta.load-css() now correctly uses the name $url for its first argument, rather than $module.
Potentially breaking bug fix: meta.load-css() now correctly uses the
name $url for its first argument, rather than $module.
Don't crash when using Infinity or NaN as a key in a map.
Emit a proper parse error for a = with no right-hand side in a function.
Avoid going exponential on certain recursive @extend edge cases.
Adds an overload to map.merge() that supports merging a nested map.
Adds an overload to map.merge() that supports merging a nested map.
map.merge($map1, $keys..., $map2): The $keys form a path to the nested map
in $map1, into which $map2 gets merged.
See the Sass documentation for more details.
Adds an overloaded map.set() function.
map.set($map, $key, $value): Adds to or updates $map with the specified
$key and $value.
map.set($map, $keys..., $value): Adds to or updates a map that is nested
within $map. The $keys form a path to the nested map in $map, into
which $value is inserted.
See the Sass documentation for more details.
Add support for nested maps to map.get().
For example, map.get((a: (b: (c: d))), a, b, c) would return d.
See the documentation for more details.
Add support for nested maps in map.has-key.
For example, map.has-key((a: (b: (c: d))), a, b, c) would return true.
See the documentation for more details.
Add a map.deep-merge() function. This works like map.merge(), except that
nested map values are also recursively merged. For example:
map.deep-merge(
(color: (primary: red, secondary: blue),
(color: (secondary: teal)
) // => (color: (primary: red, secondary: teal))
See the Sass documentation for more details.
Add a map.deep-remove() function. This allows you to remove keys from
nested maps by passing multiple keys. For example:
map.deep-remove(
(color: (primary: red, secondary: blue)),
color, primary
) // => (color: (secondary: blue))
See the Sass documentation for more details.
Fix a bug where custom property values in plain CSS were being parsed as normal property values.
Value.tryMap() function which returns the Value as a SassMap if
it's a valid map, or null otherwise. This allows function authors to safely
retrieve maps even if they're internally stored as empty lists, without having
to catch exceptions from Value.assertMap().Fix a bug where nesting properties beneath a Sass-syntax custom property (written as #{--foo}: ...) would crash.
#{--foo}: ...) would crash.Potentially breaking bug fix: selector.nest() now throws an error if the first arguments contains the parent selector &.
Potentially breaking bug fix: selector.nest() now throws an error
if the first arguments contains the parent selector &.
Fixes a parsing bug with inline comments in selectors.
Improve some error messages for edge-case parse failures.
Throw a proper error when the same built-in module is @used twice.
Don't crash when writing Infinity in JS mode.
Produce a better error message for positional arguments following named arguments.
Fixes a bug where two adjacent combinators could cause an error.
Use an updated version of node_preamble when compiling to JS.
node_preamble when compiling to JS.Fixes an error when emitting source maps to stdout.
* No user-visible changes.
* No user-visible changes.
Fix a bug where --watch mode could go into an infinite loop compiling CSS files to themselves.
--watch mode could go into an infinite loop compiling CSS
files to themselves.More aggressively eliminate redundant selectors in the selector.extend() and selector.replace() functions.
selector.extend() and
selector.replace() functions.Fix a longstanding bug where --watch mode could enter into a state where recompilation would not occur after a syntax error was introduced into a depe
--watch mode could enter into a state where
recompilation would not occur after a syntax error was introduced into a
dependency and then fixed.Potentially breaking bug fix: @use rules whose URLs' basenames begin with _ now correctly exclude that _ from the rules' namespaces.
Potentially breaking bug fix: @use rules whose URLs' basenames begin
with _ now correctly exclude that _ from the rules' namespaces.
Fix a bug where imported forwarded members weren't visible in mixins and
functions that were defined before the @import.
Don't throw errors if the exact same member is loaded or forwarded from multiple modules at the same time.
Nothing published for this version
Nothing published for this version
Nothing published for this version
Add functions to the built-in "sass:math" module.
Add functions to the built-in "sass:math" module.
clamp($min, $number, $max). Clamps $number in between $min and $max.
hypot($numbers...). Given n numbers, outputs the length of the
n-dimensional vector that has components equal to each of the inputs.
Exponential. All inputs must be unitless.
log($number) or log($number, $base). If no base is provided, performs
a natural log.pow($base, $exponent)sqrt($number)Trigonometric. The input must be an angle. If no unit is given, the input is
assumed to be in rad.
cos($number)sin($number)tan($number)Inverse trigonometric. The output is in deg.
acos($number). Input must be unitless.asin($number). Input must be unitless.atan($number). Input must be unitless.atan2($y, $x). $y and $x must have compatible units or be unitless.Add the variables $pi and $e to the built-in "sass:math" module.
constructor.value fields on value objects now match their Node Sass
equivalents.Highlight contextually-relevant sections of the stylesheet in error messages, rather than only highlighting the section where the error was detected.
Fix a bug where source map generation would crash with an absolute source map path and a custom importer that returns string file contents.
Fix a bug where sass --version would crash for certain executable distributions.
sass --version would crash for certain executable
distributions.Fix a bug introduced in the previous release that prevented custom importers in Node.js from loading import-only files.
Fix a bug where the wrong file could be loaded when the same URL is used by both a @use rule and an @import rule.
@use rule and an @import rule.Add an optional with clause to the @forward rule. This works like the @use rule's with clause, except that @forward ... with can declare variables as
Add an optional with clause to the @forward rule. This works like the
@use rule's with clause, except that @forward ... with can declare
variables as !default to allow downstream modules to reconfigure their
values.
Support configuring modules through @import rules.
* No user-visible changes
* No user-visible changes.
Support inline comments in the indented syntax.
Support inline comments in the indented syntax.
When an overloaded function receives the wrong number of arguments, guess which overload the user actually meant to invoke, and display the invalid argument error for that overload.
When @error is used in a function or mixin, print the call site rather than
the location of the @error itself to better match the behavior of calling a
built-in function that throws an error.
Your coding agent can read these notes before it upgrades. Set up the MCP server →