- support
...$keys
argument tomap-has-key(..)
/map.has-key(..)
- parse aliased colors (e.g.
cyan
foraqua
) as colors rather than identifiers
- implement builtin string-module function
string.split(..)
(#96) by @xpe - implement functionality for intercepting logs (#93) by cryocz
- update rustix dependency to silence security warning
- fix @forward statement altering the scope of the forwarded module (#85) by @kketch
- bump MSRV to 1.70.0
- update
clap
dependency to 4.x.x to silenceatty
security warning - bump MSRV to 1.64.0 for new
clap
version - fix bug in which
--no-charset
flag wasn't respected
- fix various module system bugs when combined with
@import
. this is potentially breaking in rare cases where users were relying on the incorrect behavior - expose more AST internals in
grass_compiler
- allow building docs with stable/beta rust compiler
- support
...$keys
argument tomap-get(..)
/map.get(..)
(#83)
- implement builtin map-module functions
map.deep-merge(..)
andmap.deep-remove(..)
No visible changes for users of the grass
crate
Exposes more internals of the grass_compiler
crate, allowing for custom functions implemented in rust to be accessed from Sass.
- implement an import cache, significantly improving the performance of certain pathological cases
- slash lists can be compared using
==
- resolve rounding errors for extremely large numbers
- potentially breaking bug fixes in certain color functions
color.hwb(..)
no longer allows whiteness or blackness values outside the bounds 0% to 100%scale-color(..)
no longer allows the$hue
argument. previously it was ignoredscale-color(..)
,change-color(..)
, andadjust-color(..)
no longer allow invalid combinations of arguments or unknown named arguments- many functions that accept hues now convert other angle units (
rad
,grad
,turn
) todeg
. previously the unit was ignored
- improve compressed output of selectors containing newlines and
rgba(..)
colors - improve resolution of imports containing explicit file extensions, e.g.
@import "foo.scss"
- fix bug in which whitespace was not emitted between
+
or-
inside calc for compressed output (#71 by @ModProg)
- add
grass::include!
macro to make it easier to include CSS at compile time - various optimizations improving the bootstrap benchmark by ~30% and the bulma benchmark by ~15%
- improve error message for complex units in calculations
- more accurate formatting of named arguments in arglists when passed to
inspect(..)
- more accurate formatting of nested lists with different separators when passed to
inspect(..)
- support
$whiteness
and$blackness
as arguments toscale-color(..)
- more accurate list separator from
join(..)
- resolve unicode edge cases in
str-index(..)
- more robust support for
@forward
prefixes - allow strings as the first argument to
call(..)
- bug fix: add back support for the
$css
argument toget-function(..)
. regressed in 0.12.0
- complete rewrite of parsing, evaluation, and serialization steps
- implement the indented syntax
- implement plain CSS imports
- support for custom properties
- represent all numbers as f64, rather than using arbitrary precision
- implement media query merging
- implement builtin function
keywords
- implement Infinity and -Infinity
- implement the
@forward
rule - feature complete parsing of
@supports
conditions - support media queries level 4
- implement calculation simplification and the calculation value type
- implement builtin fns
calc-args
,calc-name
- add builtin math module variables
$epsilon
,$max-safe-integer
,$min-safe-integer
,$max-number
,$min-number
- allow angle units
turn
andgrad
in builtin trigonometry functions - implement
@at-root
conditions - implement
@import
conditions - remove dependency on
num-rational
andbeef
- support control flow inside declaration blocks For example:
a {
-webkit-: {
@if 1 == 1 {
scrollbar: red;
}
}
}
will now emit
a {
-webkit-scrollbar: red;
}
- always emit
rgb
/rgba
/hsl
/hsla
for colors declared as such in expanded mode - more efficiently compress colors in compressed mode
- treat
:where
the same as:is
in extension - support "import-only" files
- treat
@elseif
the same as@else if
- implement division of non-comparable units and feature complete support for complex units
- support 1 arg color.hwb()
- make
grass::Error
aSend
type - expose more internals of
grass::Error
, allowing for custom formatting - fix WASM builds
- fix load path bug in which paths were searched for relative to the SCSS file, not the executable (#57)
fs
option added to allow interception and reimplementation of all file system operations (such as imports)wasm
feature renamed to/replaced withwasm-exports
, which no longer materially alters the API:from_path
is reinstated, andfrom_string
once again returns the full error type; but the WASM exportfrom_string
(which returns a string error) is now a new functionfrom_string_js
. (It was renamed fromwasm
towasm-exports
because the name was misleading; Rust code that uses grass doesn’t need this feature, it’s solely to get thisfrom_string
WASM export.)
- bugfix: properly emit the number
0
in compressed mode (#53)
- special case plain CSS fn
clamp
- support more uses of plain CSS fns inside
rgb
/rgba
/hsl
/hsla
- better support for
@at-root
at the toplevel and inside media queries - bugfixes for the module system
- more robust handling of load paths that are directories
- feature complete, byte-for-byte support for bootstrap
- add bootstrap v5.0.2 to ci
- run script to verify output against the last 2,500 commits to bootstrap
- feature complete
min
/max
support -- special functions andmin
/max
are now allowed as arguments - removed dependency on
peekmore
, which sped up parsing and simplified lookahead - emit comments inside the
@if
rule body - fix bug in
hue(...)
function in which the value would be incorrect when thered
channel was the highest and the green channel was lower than the blue channel - no longer round output from
saturation(...)
function - improve handling of newlines for
@media
,@supports
,@at-root
, placeholder selectors, unrelated style rules, and unknown @-rules - arglists can be equal to comma separated lists
- throw error for invalid uses of
@charset
- more robustly parse
@else if
, allowing escaped and uppercase characters - resolve two
@extend
bugs -- one in which we would incorrectly emita b, a > b
as a selector, even thougha b
is a superselector ofa > b
, and a feature called "three-level extend loop", in which a stylesheet wherea
extendsb
,b
extendsc
, andc
extendsa
would fail to include all 3 selectors in certain places - support compressed values for comma separated lists and numbers
- more robustly parse unknown @-rules
- support compressed output
- support new builtin functions
math.div
,map.set
- support the HWB colorspace and builtin functions
color.hwb
,color.blackness
,color.whiteness
:is
pseudo selector is now considered an alias of:matches
in@extend
- support
$keys...
argument inmap.merge
%
now implements the modulo operation, rather than finding the remainder. this largely affects negative numbers- fix parsing bug in which
/***/
in a selector would miss the closing/
- plain css
invert(..)
accepts numbers with any unit - plain css imports (e.g.
@import url(foo)
or@import "foo.css"
) are now emitted at the top of documents
- hyphen followed by interpolation is not treated as subtraction, e.g.
10-#{10}
=>10 -10
rather than0
- function arguments do not affect variables in outer scopes (fixes #37)
- improve error messages for NaN with units passed to builtin functions
- use
std::fs::OpenOptions
to open files (#35 by @MidasLamb)
- implement
@use
and the module system - support the filter syntax for function arguments, e.g.
alpha(opacity=1)
- disallow certain at-rules in functions, resolving several panics
- allow vendor-prefixed special CSS functions, e.g.
-webkit-calc(...)
- allow decimal percent selectors inside
@keyframes
- allow vendor-prefixed
@keyframes
- resolve parsing bug for maps involving silent comments
- allow escaped
!
in selectors - allow multiline comments in functions
- resolve several panics on malformed input when parsing bracketed lists
- support NaN in all contexts
- add support for unicode ranges
- recognize plain CSS imports beginning with
//
, e.g.@import "//fonts.googleapis.com/css?family=Droid+Sans";
- resolve integer overflows in
@for
when bounds were equal toi32::MIN
andi32::MAX
- allow quoted strings in default function arguments
- bugfixes for
@media
query regressions - bugfixes for maps, arglists, and
@each
- implement string interning for identifiers and style properties
- implement spec-compliant variable scoping
- emit
@import
when importingurl(...)
or*.css
- resolve all panics for malformed
@import
- various optimizations that now allow us to compile bootstrap 10% faster than
libsass
- errors inside builtin functions use
inspect
to print values - bugfixes for color and map equality (e.g.
red
==#ff0000
) - hide unimplemented command line flags
- implement CLI options for
--quiet
,--load-path
(#22 by @JosephLing),--no-charset
,--stdin
, and--no-unicode
- use unicode characters in error messages by default
- allow comma separated
@import
statements (#23 by @JosephLing) - implement and correctly parse
!optional
in@extend
- lazily evaluate
!default
variable values - disallow interpolation in mixin and function names
- improve parsing for
@supports
and unknown at-rules
- functions now take an
Options
struct
A small release fixing potential build issues and improving documentation.
This release is not published to NPM due to a bug
in wasm-pack
.
- implement
@keyframes
- don't strip newlines following comments in selectors
- fix parsing bugs for empty bracketed lists
- partially implement inverse units
- remove all remaining
todo!()
s from binary and unary ops - parse keywords case sensitively
- various optimizations that make bulma about 6x faster to compile
- implement builtin functions
min
andmax
- bugfixes for
@extend
andselector-unify
- allow
@content
to take arguments - bugfixes for
@content
, for example it will no longer infinitely recurse for chained mixins - better support queries in
@media
- bugfixes for
@media
- add support for splats, e.g.
rgba([1, 2, 3, 4]...)
- resolve a number of parsing bugs for
@for
, variable declarations, selectors, and maps - completely rewrite how styles are evaluated, allowing short circuiting of values like
false and unit(foo)
andif(true, foo, unit(foo)
This release is largely focused on @extend
, but it also resolves some regressions resulting from the new parser.
- implement
@extend
- properly document new API
- MVP implementation of
@supports
- fix regression in which
@at-root
would panic when placed after a ruleset - fix regression related to
@mixin
and@function
scoping when combined with outer, local variables - remove most remaining
unwrap
s that could result in a panic
This release is focused on setting up the groundwork for implementing @extend
as well
as being able to compile Bootstrap.
- implement all builtin selector functions
selector-append
selector-extend
selector-nest
selector-parse
selector-replace
selector-unify
simple-selectors
is-superselector
- implement builtin function
content-exists
- allow
@import
,@warn
, and@debug
in all contexts, such as inside@mixin
- refactor control flow evaluation, resolving some issues blocking Bootstrap
- remove the
StyleSheet
struct in favor of freestanding functions,from_string
andfrom_path
This release is largely focused on performance and robustness
- implement smallint optimization for numbers, making some benchmarks 50% faster
- remove
bimap
as a dependency for storing named colors in favor of an ad hoc, more specialized data structure - remove dozens of panics on malformed input
- use
beef::Cow
instead ofstd::borrow::Cow
- increase code coverage to 80%
This release contains significant (>10x) improvements for WASM speed.
Performance is now comparable to libsass bindings with node-sass
as
well as dart-sass
with dart2js. It is, however, roughly 4x slower than
native grass
.