NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
pub.dev · #1331 most downloaded on pub.dev
A Sass implementation in Dart.
Last release 9 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
Fix a bug where selectors were being trimmed over-eagerly when @extend crossed module boundaries.
@extend
crossed module boundaries.Fix a bug when compiling all Sass files in a directory where a CSS file could be compiled to its own location, creating an infinite loop in --watch mo
Fix a bug when compiling all Sass files in a directory where a CSS file could
be compiled to its own location, creating an infinite loop in --watch mode.
Properly compile CSS entrypoints in directories outside of --watch mode.
One column per quarter.
Fix a bug preventing built-in modules from being loaded within a configured module.
Fix a bug preventing built-in modules from being loaded within a configured module.
Fix a bug preventing an unconfigured module from being loaded from within two different configured modules.
Fix a bug when meta.load-css() was used to load some files that included
media queries.
Allow saturate() in plain CSS files, since it can be used as a plain CSS
filter function.
Improve the error messages for trying to access functions like lighten()
from the sass:color module.
Launch the new Sass module system! This adds:
Launch the new Sass module system! This adds:
The @use rule, which loads Sass files as modules and makes their
members available only in the current file, with automatic namespacing.
The @forward rule, which makes members of another Sass file available
to stylesheets that @use the current file.
Built-in modules named sass:color, sass:list, sass:map, sass:math,
sass:meta, sass:selector, and sass:string that provide access to all
the built-in Sass functions you know and love, with automatic module
namespaces.
The meta.load-css() mixin, which includes the CSS contents of a module
loaded from a (potentially dynamic) URL.
The meta.module-variables() function, which provides access to the
variables defined in a given module.
The meta.module-functions() function, which provides access to the
functions defined in a given module.
Check out the Sass blog for more information on the new module system. You can also use the new Sass migrator to automatically migrate your stylesheets to the new module system!
Nothing published for this version
Potentially breaking bug fix: character sequences consisting of two or more hyphens followed by a number (such as --123), or two or more hyphens on th
Potentially breaking bug fix: character sequences consisting of two or
more hyphens followed by a number (such as --123), or two or more hyphens on
their own (such as --), are now parsed as identifiers in accordance with
the CSS spec.
The sequence -- was previously parsed as multiple applications of the -
operator. Since this is unlikely to be used intentionally in practice, we
consider this bug fix safe.
.css files would be ignored in --watch mode.Allow underscore-separated custom functions to be defined.
Improve the performance of Node.js compilation involving many @imports.
Fix a bug in which get-function() would fail to find a dash-separated function when passed a function name with underscores.
get-function() would fail to find a dash-separated
function when passed a function name with underscores.Include argument names when reporting range errors and selector parse errors.
Include argument names when reporting range errors and selector parse errors.
Avoid double Error: headers when reporting selector parse errors.
Clarify the error message when the wrong number of positional arguments are passed along with a named argument.
Don't crash when running in a directory whose name contains URL-sensitive characters.
Don't crash when running in a directory whose name contains URL-sensitive characters.
Drop support for Node Carbon (8.x), which doesn't support url.pathToFileURL.
Restrict the supported versions of the Dart SDK to ^2.4.0.
^2.4.0.Potentially breaking bug fix: The keywords() function now converts underscore-separated argument names to hyphen-separated names. This matches LibSass
Potentially breaking bug fix: The keywords() function now converts
underscore-separated argument names to hyphen-separated names. This matches
LibSass's behavior, but not Ruby Sass's.
Further improve performance for logic-heavy stylesheets.
Improve a few error messages.
Improve performance for logic-heavy stylesheets.
Fix a bug where at-rules imported from within a style rule would appear within that style rule rather than at the root of the document.
This never did anything useful, so it's considered a bug fix rather than a full breaking change.
Potentially breaking bug fix: The argument name for the saturate()
function is now $amount, to match the name in LibSass and originally in Ruby
Sass.
Potentially breaking bug fix: The invert() function now properly returns
#808080 when passed $weight: 50%. This matches the behavior in LibSass and
originally in Ruby Sass, as well as being consistent with other nearby values
of $weight.
Potentially breaking bug fix: The invert() function now throws an error
if it's used as a plain CSS function and the Sass-only
$weight parameter is passed. This never did anything useful, so it's
considered a bug fix rather than a full breaking change.
Potentially breaking bug fix: The str-insert() function now properly
inserts at the end of the string if the $index is -1. This matches the
behavior in LibSass and originally in Ruby Sass.
Potentially breaking bug fix: An empty map returned by map-remove() is
now treated as identical to the literal value (), rather than being treated
as though it had a comma separator. This matches the original behavior in Ruby
Sass.
The adjust-color() function no longer throws an error when a large $alpha
value is combined with HSL adjustments.
The alpha() function now produces clearer error messages when the wrong
number of arguments are passed.
Fix a bug where the str-slice() function could produce invalid output when
passed a string that contains characters that aren't represented as a single
byte in UTF-16.
Improve the error message for an unknown separator name passed to the join()
or append() functions.
The zip() function no longer deadlocks if passed no arguments.
The map-remove() function can now take a $key named argument. This matches
the signature in LibSass and originally in Ruby Sass.
Avoid re-assigning the require() function to make the code statically analyzable by Webpack.
require() function to make the code statically
analyzable by Webpack.Expand the dependency on chokidar to allow 3.x.
chokidar to allow 3.x.Make deprecation warnings for !global variable declarations that create new variables clearer, especially in the case where the !global flag is unnece…
Produce better stack traces when importing a file that contains a syntax error.
Make deprecation warnings for !global variable declarations that create new
variables clearer, especially in the case where the !global flag is
unnecessary because the variables are at the top level of the stylesheet.
Value.realNull getter, which returns Dart's null if the value is
Sass's null.Add a sass executable when installing the package through pub.
Add a sass executable when installing the package through pub.
Add a top-level warn() function for custom functions and importers to print
warning messages.
* No user-visible changes.
* No user-visible changes.
Support attribute selector modifiers, such as the i in [title="test" i].
i in [title="test" i].content property of a body::before rule so
it will show up in the browser (unless compiling to standard output). This can
be disabled with the --no-error-css flag, or forced even when compiling to
standard output with the --error-css flag.SassException.toCssString(), which returns the contents of a CSS
stylesheet describing the error, as above.Allow ! in url()s without quotes.
! in url()s without quotes.FilesystemImporter now doesn't change its effective directory if the working
directory changes, even if it's passed a relative argument.…outputs as valid inputs. This isn't considered a breaking change because the importer infrastructure already required this in practice.
Avoid recursively listing directories when finding the canonical name of a file on case-insensitive filesystems.
Fix importing files relative to package:-imported files.
Don't claim that "package:" URLs aren't supported when they actually are.
--no-charset flag. If this flag is set, Sass will never emit a
@charset declaration or a byte-order mark, even if the CSS file contains
non-ASCII characters.Add a charset option to compile(), compileString(), compileAsync() and
compileStringAsync(). If this option is set to false, Sass will never emit
a @charset declaration or a byte-order mark, even if the CSS file contains
non-ASCII characters.
Explicitly require that importers' canonicalize() methods be able to take
paths relative to their outputs as valid inputs. This isn't considered a
breaking change because the importer infrastructure already required this in
practice.
Consistently parse U+000C FORM FEED, U+000D CARRIAGE RETURN, and sequences of U+000D CARRIAGE RETURN followed by U+000A LINE FEED as individual newlin
sass.types.Error constructor as an alias for Error. This makes our
custom function API compatible with Node Sass's.Fix an edge case where slash-separated numbers were written to the stylesheet with a slash even when they're used as part of another arithmetic operat
Fix an edge case where slash-separated numbers were written to the stylesheet with a slash even when they're used as part of another arithmetic operation, such as being concatenated with a string.
Don't put style rules inside empty @keyframes selectors.
Deprecate !global variable assignments to variables that aren't yet defined. This deprecation message can be avoided by assigning variables to null at…
!global variable assignments to variables that aren't yet defined.
This deprecation message can be avoided by assigning variables to null at
the top level before globally assigning values to them.Properly quote attribute selector values that start with identifiers but end with a non-identifier character.
Improve error output, particularly for errors that cover multiple lines.
Improve error output, particularly for errors that cover multiple lines.
Improve source locations for some parse errors. Rather than pointing to the next token that wasn't what was expected, they point after the previous token. This should generally provide more context for the syntax error.
Produce a better error message for style rules that are missing the closing
}.
Produce a better error message for style rules and property declarations
within @function rules.
Passing a directory on the command line now compiles all Sass source files in
the directory to CSS files in the same directory, as though dir:dir were
passed instead of just dir.
The new error output uses non-ASCII Unicode characters by default. Add a
--no-unicode flag to disable this.
Fix a performance bug where stylesheet evaluation could take a very long time when many binary operators were used in sequence.
rgb() and hsl() now treat unquoted strings beginning with env(), min(), and max() as special number strings like calc().
rgb() and hsl() now treat unquoted strings beginning with env(),
min(), and max() as special number strings like calc().Nothing published for this version
Properly merge all and media queries. These queries were previously being merged as though all referred to a specific media type, rather than all medi
Properly merge all and media queries. These queries were previously being
merged as though all referred to a specific media type, rather than all
media types.
Never remove units from 0 values in compressed mode. This wasn't safe in
general, since some properties (such as line-height) interpret 0 as a
<number> rather than a <length> which can break CSS transforms. It's
better to do this optimization in a dedicated compressor that's aware of CSS
property semantics.
Match Ruby Sass's behavior in some edge-cases involving numbers with many significant digits.
Emit escaped tab characters in identifiers as \9 rather than a backslash
followed by a literal tab.
data: URL to include that stylesheet's contents in the source map.this.includePaths for a running importer is now a ;-separated string on
Windows, rather than :-separated. This matches Node Sass's behavior.ImportResult.sourceMapUrl as documented.When setValue() is called on a Sass string object, make it unquoted even if it was quoted originally, to match the behavior of Node Sass.
setValue() is called on a Sass string object, make it unquoted even if
it was quoted originally, to match the behavior of Node Sass.Always add quotes to attribute selector values that begin with --, since IE 11 doesn't consider them to be identifiers.
--, since IE
11 doesn't consider them to be identifiers.Add support for passing arguments to @content blocks. See [the proposal][content-args] for details.
Add support for passing arguments to @content blocks. See the
proposal for details.
Add support for the new rgb() and hsl() syntax introduced in CSS Colors
Level 4, such as rgb(0% 100% 0% / 0.5). See the proposal
for more details.
Add support for interpolation in at-rule names. See the proposal for details.
Add paths from the SASS_PATH environment variable to the load paths in the
command-line interface, Dart API, and JS API. These load paths are checked
just after the load paths explicitly passed by the user.
Allow saturation and lightness values outside of the 0% to 100% range in
the hsl() and hsla() functions. They're now clamped to be within that
range rather than producing an error if they're outside it.
Properly compile selectors that end in escaped whitespace.
Treat :before, :after, :first-line, and :first-letter as pseudo-elements for the purposes of @extend.
Treat :before, :after, :first-line, and :first-letter as
pseudo-elements for the purposes of @extend.
When running in compressed mode, remove spaces around combinators in complex
selectors, so a selector like a > b is output as a>b.
Properly indicate the source span for errors involving binary operation expressions whose operands are parenthesized.
Relative URLs are still supported, but are deprecated and will be removed in a future release.
Fix a bug where loading the same stylesheet from two different import paths could cause its imports to fail to resolve.
Properly escape U+001F INFORMATION SEPARATOR ONE in unquoted strings.
@debug in a stylesheet passed on standard input.AsyncImporter.canonicalize() and Importer.canonicalize() must now return
absolute URLs. Relative URLs are still supported, but are deprecated and will
be removed in a future release.Canonicalize escaped digits at the beginning of identifiers as hex escapes.
Canonicalize escaped digits at the beginning of identifiers as hex escapes.
Properly parse property declarations that are both in content blocks and written after content blocks.
--watch mode.In accordance with our [compatibility policy][], breaking changes made for CSS compatibility reasons are released as minor version revision after a th…
In accordance with our compatibility policy, breaking changes made for CSS compatibility reasons are released as minor version revision after a three-month deprecation period.
#abcd that are now interpreted as hex colors with alpha
channels, rather than unquoted ID strings.Tweak JS compilation options to substantially improve performance.
Properly generate source maps for stylesheets that emit @charset declarations.
@charset
declarations.--embed-source-maps along with
--embed-sources for stylesheets that contain non-ASCII characters.Properly parse :nth-child() and :nth-last-child() selectors with whitespace around the argument.
Properly parse :nth-child() and :nth-last-child() selectors with
whitespace around the argument.
Don't emit extra whitespace in the arguments for :nth-child() and
:nth-last-child() selectors.
Fix support for CSS hacks in plain CSS mode.
Allow an IE-style single equals operator in plain CSS imports.
Allow @extend to be used with multiple comma-separated simple selectors. This is already supported by other implementations, but fell through the crac
Allow @extend to be used with multiple comma-separated simple selectors.
This is already supported by other implementations, but fell through the
cracks for Dart Sass until now.
Don't crash when a media rule contains another media rule followed by a style rule.
Add a SassException type that provides information about Sass compilation failures.
SassException type that provides information about Sass compilation
failures.Deprecated the indented parameter to compileString() and compileStringAsync().
Add support for importing plain CSS files. They can only be imported without
an extension—for example, @import "style" will import style.css. Plain CSS
files imported this way only support standard CSS features, not Sass
extensions.
See the proposal for details.
Add support for CSS's min() and max() math functions. A min() and
max() call will continue to be parsed as a Sass function if it involves any
Sass-specific features like variables or function calls, but if it's valid
plain CSS (optionally with interpolation) it will be emitted as plain CSS instead.
See the proposal for details.
Add support for range-format media features like (10px < width < 100px). See
the proposal for details.
Normalize escape codes in identifiers so that, for example, éclair and
\E9clair are parsed to the same value. See
the proposal for details.
Don't choke on a byte-order mark at the beginning of a document when running in JavaScript.
--watch command now continues to recompile a file after a syntax error
has been detected.Added a Syntax enum to indicate syntaxes for Sass source files.
The compile() and compileAsync() functions now parse files with the .css
extension as plain CSS.
Added a syntax parameter to compileString() and compileStringAsync().
Deprecated the indented parameter to compileString() and compileStringAsync().
Added a syntax parameter to new ImporterResult() and a
ImporterResult.syntax getter to set the syntax of the source file.
Deprecated the indented parameter to new ImporterResult() and the
ImporterResult.indented getter in favor of syntax.
Fix a Homebrew installation failure.
Run the Chocolatey script with the correct arguments so it doesn't crash.
* No user-visible changes.
Don't crash when passing both includePaths and importer.
includePaths and importer.When two @media rules' queries can't be merged, leave nested rules in place for browsers that support them.
When two @media rules' queries can't be merged, leave nested rules in place
for browsers that support them.
Fix a typo in an error message.
Produce more readable filesystem errors, such as when a file doesn't exist.
Don't emit ANSI codes to Windows terminals that don't support them.
Don't emit ANSI codes to Windows terminals that don't support them.
Fix a bug where --watch crashed on Mac OS.
Add support for new sass.types.Color(argb) for creating colors from ARGB hex numbers. This was overlooked when initially adding support for Node Sass'
new sass.types.Color(argb) for creating colors from ARGB hex
numbers. This was overlooked when initially adding support for Node Sass's
JavaScript API.Add a --poll flag to make --watch mode repeatedly check the filesystem for updates rather than relying on native filesystem notifications.
Add a --poll flag to make --watch mode repeatedly check the filesystem for
updates rather than relying on native filesystem notifications.
Add a --stop-on-error flag to stop compiling additional files once an error
is encountered.
* No user-visible changes.
Add a deprecation warning for @-moz-document, except for cases where only an empty url-prefix() is used. Support is [being removed from Firefox][] and…
@-moz-document, except for cases where only an
empty url-prefix() is used. Support is being removed from Firefox and
will eventually be removed from Sass as well.@-moz-document functions with string arguments weren't being
parsed.Fix crashes in released binaries.
Emit deprecation warnings for tokens such as #abcd that are ambiguous between ID strings and hex colors with alpha channels. These will be interpreted…
Emit deprecation warnings for tokens such as #abcd that are ambiguous
between ID strings and hex colors with alpha channels. These will be
interpreted as colors in a release on or after 19 September 2018.
Parse unambiguous hex colors with alpha channels as colors.
Fix a bug where relative imports from files on the load path could look in the incorrect location.
Fix a bug where the source map comment in the generated CSS could refer to the source map file using an incorrect URL.
Your coding agent can read these notes before it upgrades. Set up the MCP server →