diff -pruN 2.3.1-1/.github/FUNDING.yml 3.1.0-1/.github/FUNDING.yml
--- 2.3.1-1/.github/FUNDING.yml	1970-01-01 00:00:00.000000000 +0000
+++ 3.1.0-1/.github/FUNDING.yml	2024-12-06 17:25:18.000000000 +0000
@@ -0,0 +1,15 @@
+# These are supported funding model platforms
+
+github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
+patreon: # Replace with a single Patreon username
+open_collective: csstree
+ko_fi: # Replace with a single Ko-fi username
+tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
+community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
+liberapay: # Replace with a single Liberapay username
+issuehunt: # Replace with a single IssueHunt username
+lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry
+polar: # Replace with a single Polar username
+buy_me_a_coffee: # Replace with a single Buy Me a Coffee username
+thanks_dev: # Replace with a single thanks.dev username
+custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
diff -pruN 2.3.1-1/.github/workflows/build.yml 3.1.0-1/.github/workflows/build.yml
--- 2.3.1-1/.github/workflows/build.yml	2022-12-14 17:31:12.000000000 +0000
+++ 3.1.0-1/.github/workflows/build.yml	2024-12-06 17:25:18.000000000 +0000
@@ -5,8 +5,7 @@ on:
     pull_request:
 
 env:
-    PRIMARY_NODEJS_VERSION: 16
-    REPORTER: "min"
+    PRIMARY_NODEJS_VERSION: 18
 
 jobs:
     lint:
@@ -24,7 +23,10 @@ jobs:
 
     test-bundle:
         name: Test bundle
-        runs-on: ubuntu-latest
+        runs-on: ${{ matrix.os }}
+        strategy:
+            matrix:
+                os: [ubuntu-latest, windows-latest]
         steps:
             - uses: actions/checkout@v2
             - name: Setup node ${{ env.PRIMARY_NODEJS_VERSION }}
@@ -33,20 +35,29 @@ jobs:
                 node-version: ${{ env.PRIMARY_NODEJS_VERSION }}
                 cache: "npm"
             - run: npm ci
-            - run: npm run bundle-and-test
+            - run: npm run bundle-and-test -- -- --reporter min
 
     unit-tests:
         name: Unit tests
-        runs-on: ubuntu-latest
+        runs-on: ${{ matrix.os }}
 
         strategy:
             matrix:
+                os: [ubuntu-latest]
                 # See supported Node.js release schedule at https://nodejs.org/en/about/releases/
                 node_version:
                     - 10
                     - 12.20.0
                     - 14.13.0
                     - 16
+                    - 18
+                    - 20
+                    - 22
+                include:
+                    - os: windows-latest
+                      node: 10
+                    - os: windows-latest
+                      node: 22
 
         steps:
             - uses: actions/checkout@v2
@@ -56,10 +67,9 @@ jobs:
                 node-version: ${{ matrix.node_version }}
                 cache: "npm"
             - run: npm ci
-            - run: npm run test
+            - run: npm run test -- --reporter min
               if: ${{ matrix.node_version != '10' }}
-            - run: npm run esm-to-cjs-and-test
-
+            - run: npm run esm-to-cjs-and-test -- -- --reporter min
             - run: npm run coverage
               if: ${{ matrix.node_version == env.PRIMARY_NODEJS_VERSION }}
             - name: Coveralls parallel
diff -pruN 2.3.1-1/CHANGELOG.md 3.1.0-1/CHANGELOG.md
--- 2.3.1-1/CHANGELOG.md	2022-12-14 17:31:12.000000000 +0000
+++ 3.1.0-1/CHANGELOG.md	2024-12-06 17:25:18.000000000 +0000
@@ -1,3 +1,94 @@
+## 3.1.0 (December 6, 2024)
+
+- Added support for [boolean expression multiplier](https://drafts.csswg.org/css-values-5/#boolean) in syntax definition, i.e. `<boolean-expr[ test ]>` (#304)
+- Added `source`, `startOffset`, `startLine`, and `startColumn` parameters to `OffsetToLocation` constructor, eliminating the need to call `setSource()` after creating a new `OffsetToLocation` instance
+- Exposed `OffsetToLocation` class in the main entry point, which was previously accessible only via `css-tree/tokenizer`
+- Fixed `Raw` node value consumption by ignoring stop tokens inside blocks, resolving an issue where `Raw` value consumption stopped prematurely. This fix also enables parsing of functions whose content includes stop characters (e.g., semicolons and curly braces) within declaration values, aligning with the latest draft of CSS Values and Units Module Level 5.  
+- Fixed `TokenStream#balance` computation to handle unmatched brackets correctly. Previously, when encountering a closing bracket, the `TokenStream` would prioritize it over unmatched opening brackets, leading to improper parsing. For example, the parser would incorrectly consume the declaration value of `.a { prop: ([{); }` as `([{)` instead of consuming it until all opened brackets were closed (`([{); }`). Now, unmatched closing brackets are discarded unless they match the most recent opening bracket on the stack. This change aligns CSSTree with CSS specifications and browser behavior.
+- Fixed syntax definition parser to allow a token to be followed by a multiplier (#303)
+- Fixed location for `Layer` node (#310)
+- Bumped `mdn/data` to 2.12.2
+
+## 3.0.1 (November 1, 2024)
+
+- Bumped `mdn/data` to 2.12.1
+- Added `errors` array to the `Lexer#validate()` method result, providing details on problematic syntax.
+- Added CSS wide keyword customization and introspection:
+  - Added a `Lexer#cssWideKeywords` dictionary to list CSS-wide keywords
+  - Updated the Lexer's constructor to consider `config.cssWideKeywords` for overriding the default list
+  - Expanded the lexer's dump output to include the `cssWideKeywords` dictionary
+  - Modified the `fork()` method to accept a `cssWideKeywords` option, allowing the addition of new keywords to the existing list
+- Reverted changes to `Block` to include `{` and `}`, and `Atrule` and `Rule` to exclude `{` and `}` for a `block` (#296)
+- Removed second parameter (`assign`) for the callback in the `fork()` method (e.g., `syntax.fork((config, assign) => { ... })`), as it simply refers to `Object.assign()`
+- Fixes in syntaxes: `<basic-shapes>`, `<absolute-color-function>` and `<'stroke-opacity'>`
+
+## 3.0.0 (September 11, 2024)
+
+- Added support for the [`@container`](https://drafts.csswg.org/css-contain-3/#container-rule) at-rule
+- Added support for the [`@starting-style`](https://drafts.csswg.org/css-transitions-2/#defining-before-change-style) at-rule
+- Added support for the [`@scope`](https://drafts.csswg.org/css-cascade-6/#scoped-styles) at-rule
+- Added support for the [`@position-try`](https://developer.mozilla.org/en-US/docs/Web/CSS/@position-try) at-rule
+- Added support for the [`@layer`](https://drafts.csswg.org/css-cascade-5/#at-layer) at-rule
+- Added support for `layer`, `layer()` and `supports()` in the `@media` at-rule (according to [the @import rule](https://drafts.csswg.org/css-cascade-5/#at-import) in Cascading and Inheritance 5)
+- Added `Layer` and `LayerList` node types
+- Added `TokenStream#lookupTypeNonSC()` method
+- Added `<dashed-ident>` to generic types
+- Bumped `mdn/data` to `2.10.0`
+- Aligned `<'font'>` to [CSS Fonts 4](https://drafts.csswg.org/css-fonts-4/)
+- Aligned `<color>` to [CSS Color 5](https://drafts.csswg.org/css-color-5/)
+- Fixed initialization when `Object.prototype` is extended or polluted (#262)
+- Fixed `fork()` method to consider the `generic` option when creating a Lexer instance (#266)
+- Fixed crash on parse error when custom `line` or `offset` is specified via options (#251)
+- Fixed `speak` syntax patch (#241)
+- Fixed `:lang()` to accept a list of `<ident>` or `<string>` per [spec](https://drafts.csswg.org/selectors/#the-lang-pseudo) (#265)
+- Fixed lexer matching for syntaxes referred to as `<'property'>`, when the syntax has a top-level `#`-multiplier (#102)
+- Relaxed parsing of syntax definition to allow whitespaces in range multiplier (#270)
+- Changed `parseWithFallback()` to rollback `tokenIndex` before calling a fallback
+- Changed `Block` to not include `{` and `}`
+- Changed `Atrule` and `Rule` to include `{` and `}` for a block
+- Changed `Ratio` parsing:
+    - Left and right parts contain nodes instead of strings
+    - Both left and right parts of a ratio can now be any number; validation of number range is no longer within the parser's scope.
+    - Both parts can now be functions. Although not explicitly mentioned in the specification, mathematical functions can replace numbers, addressing potential use cases (#162).
+    - As per the [CSS Values and Units Level 4](https://drafts.csswg.org/css-values-4/#ratios) specification, the right part of `Ratio` can be omitted. While this can't be a parser output (which would produce a `Number` node), it's feasible during `Ratio` node construction or transformation.
+- Changes to query-related at-rules:
+    - Added new node types:
+        - [`Feature`](./docs/ast.md#feature): represents features like `(feature)` and `(feature: value)`, fundamental for both `@media` and `@container` at-rules
+        - [`FeatureRange`](./docs/ast.md#featurerange): represents [features in a range context](https://www.w3.org/TR/mediaqueries-4/#mq-range-context)
+        - [`FeatureFunction`](./docs/ast.md#featurefunction): represents functional features such as `@supports`'s `selector()` or `@container`'s `style()`
+        - [`Condition`](./docs/ast.md#condition): used across all query-like at-rules, encapsulating queries with features and the `not`, `and`, and `or` operators
+        - [`GeneralEnclosure`](./docs/ast.md#condition): represents the [`<general-enclosed>`](https://www.w3.org/TR/mediaqueries-4/#typedef-general-enclosed) production, which caters to unparsed parentheses or functional expressions
+        > Note: All new nodes include a `kind` property to define the at-rule type. Supported kinds are `media`, `supports`, and `container`.
+
+    - Added support for functions for features and features in a range context, e.g. `(width: calc(100cm / 6))`
+    - Added a `condition` value for the parser's context option to parse queries. Use the `kind` option to specify the condition type, e.g., `parse('...', { context: 'condition', kind: 'media' })`.
+    - Introduced a `features` section in the syntax configuration for defining functional features of at-rules. Expand definitions using the `fork()` method. The current definition is as follows:
+        ```js
+        features: {
+            supports: { selector() { /* ... */ } },
+            container: { style() { /* ... */ } }
+        }
+        ```
+    - Changes for `@media` at-rule:
+        - Enhanced prelude parsing for complex queries. Parentheses with errors will be parsed as `GeneralEnclosed`.
+        - Added support for features in a range context, e.g. `(width > 100px)` or `(100px < height < 400px)`
+        - Transitioned from `MediaFeature` node type to the `Feature` node type with `kind: "media"`.
+        - Changed `MediaQuery` node structure into the following form:
+            ```ts
+            type MediaQuery = {
+                type: "MediaQuery";
+                modifier: string | null; // e.g. "not", "only", etc.
+                mediaType: string | null; // e.g. "all", "screen", etc.
+                condition: Condition | null;
+            }
+            ```
+    - Changes for `@supports` at-rule:
+        - Enhanced prelude parsing for complex queries. Parentheses with errors will be parsed as `GeneralEnclosed`.
+        - Added support for features in a range context, e.g. `(width > 100px)` or `(100px < height < 400px)`
+        - Added `SupportsDeclaration` node type to encapsulate a declaration in a query, replacing `Parentheses`.
+        - Parsing now employs `Condition` or `SupportsDeclaration` nodes of kind `supports` instead of `Parentheses`.
+        - Added support for the [`selector()`](https://drafts.csswg.org/css-conditional-4/#at-supports-ext) feature via the `FeatureFunction` node (configured in `features.supports.selector`).
+
 ## 2.3.1 (December 14, 2022)
 
 - Added `:host`, `:host()` and `:host-context()` pseudo class support (#216)
diff -pruN 2.3.1-1/LICENSE 3.1.0-1/LICENSE
--- 2.3.1-1/LICENSE	2022-12-14 17:31:12.000000000 +0000
+++ 3.1.0-1/LICENSE	2024-12-06 17:25:18.000000000 +0000
@@ -1,4 +1,4 @@
-Copyright (C) 2016-2022 by Roman Dvornov
+Copyright (C) 2016-2024 by Roman Dvornov
 
 Permission is hereby granted, free of charge, to any person obtaining a copy
 of this software and associated documentation files (the "Software"), to deal
diff -pruN 2.3.1-1/README.md 3.1.0-1/README.md
--- 2.3.1-1/README.md	2022-12-14 17:31:12.000000000 +0000
+++ 3.1.0-1/README.md	2024-12-06 17:25:18.000000000 +0000
@@ -1,6 +1,4 @@
-<img align="right" width="111" height="111"
-     alt="CSSTree logo"
-     src="https://cloud.githubusercontent.com/assets/270491/19243723/6f9136c6-8f21-11e6-82ac-eeeee4c6c452.png"/>
+<img align="right" width="111" height="111" alt="CSSTree logo" src="assets/csstree-logo-rounded.svg" />
 
 # CSSTree
 
@@ -28,7 +26,7 @@ CSSTree is a tool set for CSS: [fast](ht
 
 - **Syntax validation**
 
-  The build-in lexer can test CSS against syntaxes defined by W3C. CSSTree uses [mdn/data](https://github.com/mdn/data/) as a basis for lexer's dictionaries and extends it with vendor specific and legacy syntaxes. Lexer can only check the declaration values currently, but this feature will be extended to other parts of the CSS in the future.
+  The built-in lexer can test CSS against syntaxes defined by W3C. CSSTree uses [mdn/data](https://github.com/mdn/data/) as a basis for lexer's dictionaries and extends it with vendor specific and legacy syntaxes. Lexer can only check the declaration values and at-rules currently, but this feature will be extended to other parts of the CSS in the future.
 
 ## Projects using CSSTree
 
@@ -60,6 +58,7 @@ CSSTree is a tool set for CSS: [fast](ht
     - [ident](docs/utils.md#ident)
     - [string](docs/utils.md#string)
     - [url](docs/utils.md#url)
+  - [List class](docs/list.md)
   - AST transforming
     - [clone(ast)](docs/utils.md#cloneast)
     - [fromPlainObject(object)](docs/utils.md#fromplainobjectobject)
diff -pruN 2.3.1-1/assets/csstree-logo-rounded.svg 3.1.0-1/assets/csstree-logo-rounded.svg
--- 2.3.1-1/assets/csstree-logo-rounded.svg	1970-01-01 00:00:00.000000000 +0000
+++ 3.1.0-1/assets/csstree-logo-rounded.svg	2024-12-06 17:25:18.000000000 +0000
@@ -0,0 +1 @@
+<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 308.1 308.1"><defs><style>.cls-1{fill:url(#radial-gradient);}.cls-2{fill:#fff;}.cls-3{isolation:isolate;}</style><radialGradient id="radial-gradient" cx="156" cy="193.5" r="186.2" gradientTransform="matrix(1, 0, 0, -1, 0, 310)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#87c039"/><stop offset="0.9" stop-color="#a2c43c"/></radialGradient></defs><rect class="cls-1" width="308.1" height="308.1" rx="13.8"/><path class="cls-2" d="M87.3,185.3c-7.5-34.5-15-36-22-58a40.07,40.07,0,0,1-1.6-8.4c1.8-4,7-12.7,17.7-13.2a21.21,21.21,0,0,1,15,4.4c5.9,4.4,6,18,6,18s1-.7,1-7.3-2.6-9.2-2.6-9.2l3.8,2.3c6.8,4.3,13.9,0,13.9,0s-5.6,1.4-13-2.3c-7-3.6-11.7-11.1-24.6-12a20,20,0,0,0-16,5.8c2.7-8.5,9.7-13.7,19-17.4a37.2,37.2,0,0,1,47.8,47.5c-3.7,9.1-13.7,11-13.7,11A20.3,20.3,0,0,0,135.2,134a37.77,37.77,0,0,0,2.6-15.3,9.8,9.8,0,0,0,6.7,1.4c5.5-1,9.5-4.8,10.8-6.1l1.7-1.6a9.37,9.37,0,0,1,3.5.2,11.24,11.24,0,0,1,4.6,2.4,13.15,13.15,0,0,1,3.2,4.2,40.55,40.55,0,0,1,2,5.1,11.1,11.1,0,0,0-.7-5.7,14.51,14.51,0,0,0-3.2-5,12.82,12.82,0,0,0-5.3-3.1,11,11,0,0,0-1.6-.4,20.22,20.22,0,0,1,3.8-2.9,14.9,14.9,0,0,1,14.4,1.8c-.7-.6-3-2.8-5.1-3.6a14.45,14.45,0,0,0-10.3-.2c-2,.7-7,4.7-8.4,5.8a18.64,18.64,0,0,1-9.6,4.4c-2.3.3-4.8-1.3-7-3.1a36.9,36.9,0,0,0-3.5-11.6l-1.7-2.8a57.24,57.24,0,0,0,10.9,2.5,59.74,59.74,0,0,0,17.3-.7,94.56,94.56,0,0,0,14.8-3.9l6.5-1.1c5.4-1,13.6-3.1,21.9-1.8a10.63,10.63,0,0,1,5,2.3,11.54,11.54,0,0,1,3.5,4.7,16,16,0,0,1,1,6.2,13.8,13.8,0,0,0,.4-6.6,12.31,12.31,0,0,0-3-6.2,13.1,13.1,0,0,0-2.2-1.8h2.2a40.23,40.23,0,0,1,9.4,1.2,18.94,18.94,0,0,1,4.4,1.8,12.38,12.38,0,0,1,3.6,3,11.61,11.61,0,0,1,2.1,4.2,17.65,17.65,0,0,1,.6,4.8,16.45,16.45,0,0,0-.2-5,12.36,12.36,0,0,0-1.9-4.5,13.47,13.47,0,0,0-3.6-3.5,19.77,19.77,0,0,0-4.5-2.2,39,39,0,0,0-9.8-1.9,82,82,0,0,0-8.3-.1c-1.6-.2-9.2.6-11.4.9h-.2l1-.4A147.6,147.6,0,0,1,206.4,85a53.55,53.55,0,0,1,15-2,40.49,40.49,0,0,1,14.5,3.3,53.76,53.76,0,0,1,7,3.6l6.9,4.1a39.46,39.46,0,0,0-12-11.3,35.78,35.78,0,0,0-7.7-3.6,40.72,40.72,0,0,0-8.4-1.6l-1.2-.2,1.4-1.4a30.87,30.87,0,0,0,5.1-7.6,21.78,21.78,0,0,0,1.6-4.3,22.81,22.81,0,0,0,.2-4.6,26.26,26.26,0,0,1-1.5,4.2,38.47,38.47,0,0,1-1.9,3.8,30.66,30.66,0,0,1-5.3,6.8,23.66,23.66,0,0,1-3.9,3,67.09,67.09,0,0,0-11.3,1.2A147.75,147.75,0,0,0,189,82.5l-15.2,4.8-7.6,2s-5,1-7.4,1.4a52.84,52.84,0,0,1-14.7.2,37.71,37.71,0,0,1-3.8-.8l1-.6c8-5.8,11-18.3,17.4-22,8.3-4.7,13-.7,13-.7s-5.6-5-14.6-1.4c-2.6,1-5.2,3.5-7.6,6.3a11.66,11.66,0,0,0-.5-1.4,15,15,0,0,0-3.3-4.4l-3.6-3c-2.3-2-4-3.7-4.6-6.2a12.2,12.2,0,0,1,0-4l.3-2.1.4-2.6-.2.1a10.52,10.52,0,0,0-1.6,1.8,12.12,12.12,0,0,0-1.2,2.1,10.53,10.53,0,0,0-1,5,11.2,11.2,0,0,0,1.7,5.2,24,24,0,0,0,3.1,4l3,3.2a10.78,10.78,0,0,1,2,3,10.21,10.21,0,0,1,1,3.8l-.3,1.7a48.64,48.64,0,0,1-4.3,5.2c-4.6,4.6-11.5,5-19.6.1A52.31,52.31,0,0,0,104,76.5l.4-.3a11.26,11.26,0,0,0,2.5-3.6,13.83,13.83,0,0,0,1-4.1,29.69,29.69,0,0,0,.2-4,60.9,60.9,0,0,1,0-7.4,18.79,18.79,0,0,1,2.2-7h-.1a8.64,8.64,0,0,0-2.7,3,12.84,12.84,0,0,0-1.3,3.7,52.38,52.38,0,0,0-.8,7.6,17.64,17.64,0,0,1-1.4,6.8,8.65,8.65,0,0,1-2,2.5,23.33,23.33,0,0,1-3.8,2,47.38,47.38,0,0,0-9.6.2,52.59,52.59,0,0,0-20.9,8.4A56.33,56.33,0,0,1,85.1,66.5c17.1-10.8,21.2-18.8,23.7-26.3l.9-3,1-1.6a18.52,18.52,0,0,1,4.3-4.4,9,9,0,0,1,1.2-.7l.3-.1.3-.1.7-.3a19.52,19.52,0,0,1,3-.8l2.2-.3.6.1a22.71,22.71,0,0,1,6.9,2.2,10.58,10.58,0,0,1,2.7,2,4.83,4.83,0,0,1,1.5,2.8,6.13,6.13,0,0,1-.7,3.2,25.2,25.2,0,0,1-2,3.3v.1a9.6,9.6,0,0,0,3.1-2.6,6.59,6.59,0,0,0,1.5-4,7,7,0,0,0-1.6-4.3,12.6,12.6,0,0,0-3.2-2.8l-.7-.4,3.7-.2a38.07,38.07,0,0,0,7.5-1.2,20.18,20.18,0,0,0,3.6-1.4,12.85,12.85,0,0,0,3.3-2.2,11.71,11.71,0,0,0,3.4-6.7l-.3-.1a28.48,28.48,0,0,1-2.2,2.7,15.24,15.24,0,0,1-2.6,2,15.53,15.53,0,0,1-6,2.4,36.81,36.81,0,0,1-6.8.3l-7-.3a53.6,53.6,0,0,0-7.6.2,24.85,24.85,0,0,0-4,.8l-1,.3-.4.2h-.3l-.3.2a13.83,13.83,0,0,0-2,1l-1.2,1a23.42,23.42,0,0,0-4.3-11.8,11.74,11.74,0,0,0-1.5-1.8,8.11,8.11,0,0,1-.3-2.4,11.68,11.68,0,0,1,1.4-4.9,15.65,15.65,0,0,1,3.3-4.2A25.93,25.93,0,0,1,112.4,0h-3a13.86,13.86,0,0,0-1.4.9,16.36,16.36,0,0,0-4.3,4.4,13.59,13.59,0,0,0-2.3,5.9C96.3,7.5,89,3.6,85.2,0H82.5a17.19,17.19,0,0,0,4,4.5c8.7,7.2,17,12.6,18.2,20.9s-3.8,18.8-14,26.4c-2,1.42-4.08,2.76-6.2,4,0,0,6.6-11.7,5-21s-10-16.6-14-20.6-6.8-13-6.8-13-.4,11.3,7.6,19.2a21.65,21.65,0,0,1,5,7.9,24.6,24.6,0,0,0-10.5-2,39.37,39.37,0,0,0-5,.2,4.34,4.34,0,0,1-1.3-.8A7.05,7.05,0,0,1,63,23c-.8-2-1.3-4.5-2-6.9a19.55,19.55,0,0,0-1.5-3.6,10.4,10.4,0,0,0-2.6-3,8.62,8.62,0,0,0-3.6-1.7,9.72,9.72,0,0,0-3.8,0V8c2.4.8,4.6,1.5,6.1,3a11.39,11.39,0,0,1,2.8,5.9l.7,3.5a27.27,27.27,0,0,0,.9,3.8,11.09,11.09,0,0,0,1.1,2.4c-3.6.1-5.8,0-8.2-1.5-4-2.4-5.2-8-5.2-8s.5,7,5.9,10.1S67.4,29.7,72.8,30a14.29,14.29,0,0,1,10,4.3,33.59,33.59,0,0,1-1,11.6c-2.6,10.8-17,23-17,23l-2,1.6c0-1.3.8-7.4-1.6-12.3-2.9-5.7-5.6-6.9-9.8-11-4.4-4.4-4.6-15.3-4.6-15.3s-.4,8.3,1.2,12.7c2.5,6.8,6.1,6.2,9,15.8,1.8,6-1,16.4-1,16.4a54.92,54.92,0,0,0-6.6,9l-1,1.5A64.29,64.29,0,0,0,36.6,74.4c-3-4.8-6-13.2-1-20.9C40.4,46,46.7,46,46.7,46a19.19,19.19,0,0,0-15,7.4c-3.5,4.7-3.5,12.5-3.5,15a31.17,31.17,0,0,1-8.7-8c-1-4.2-1.7-10.7,1.1-16,3.4-6.3,9.2-10,11.6-14.5,2.8-5.2,1.1-11.4,1.1-11.4s1.5,8.6-4.3,13.2S17.7,40,16.8,44.9c.9-7.6,4.4-12,4.4-18.3,0-8.2-6.3-14.2-6.3-14.2s3.8,5.9,4.6,11.4a12,12,0,0,0-6.2-5.6C9,16.4,8,11.7,8,11.7s-1.4,4,5,8c3.1,2,4.8,6,5.7,8.7-1,3.4-3,7.3-4.7,11.6q-.71-2.28-1.6-4.5A25.33,25.33,0,0,0,8,28.4a24.68,24.68,0,0,1,2,4.1c1.2,3.2,2,5,1.4,10.7a43.44,43.44,0,0,0,0,9.4l.1,1.7a19.54,19.54,0,0,0,3.1,8.6,11,11,0,0,0-10-.1A16.7,16.7,0,0,0,0,65.9v2.6a19.4,19.4,0,0,1,4-2.3c7-3,15.7,3.2,16.5,3.8,4.3,4.5,9.5,9,14.4,14.3,6.8,7.6,8,13.5,7.9,16.8l-.7,3A55.84,55.84,0,0,0,41,116.8s-2-3.3-11-4.4c-2.7-1.4-6.8-4.3-7.5-9.6-1-8,3-12,3-12a17.11,17.11,0,0,0-5.7,14.3,11,11,0,0,0,3.3,7,94.93,94.93,0,0,0-11.3.8A27.54,27.54,0,0,1,0,112v8.6l3.3-.4c4.7.5,9.6,0,14.8.2a13,13,0,0,0-7.9,6.4,20.09,20.09,0,0,0-.6,18s-2.8-8.1,2.5-14.3c9.5-11.2,23.5-4.3,24-4a27.35,27.35,0,0,1,8.7,11.8c.3.8,9.3,18.5,12.1,25C81.2,218.7,33.4,308,33.4,308H65.2s31.5-80,22.1-122.8Z"/><path class="cls-2" d="M116.6,21.4s-3.9-1.2-4.6-4.6a16.72,16.72,0,0,1-.2-5.6,11.69,11.69,0,0,1,.3-1.2s3.2,2.7,4.2,4.8a10.46,10.46,0,0,1,.4,6.4ZM13.7,13S10,11.5,9.1,8.2A17,17,0,0,1,9,2.6a10.13,10.13,0,0,1,.2-1.1s3.3,2.7,4.3,4.8a10.38,10.38,0,0,1,.3,6.4v.2ZM9,80.8a21.13,21.13,0,0,0-9-1v2A32.9,32.9,0,0,1,9,80.8Zm236.9,2.9s4.6,2,8-.5a21.37,21.37,0,0,0,5.5-6.1s-5.1-.5-7.8.7c-3.6,1.6-5.7,6-5.7,6Zm4.7,8.6s2.5,2.2,5.2,1.3a14.22,14.22,0,0,0,4.7-2.8s-3.1-1.3-5.1-1.1a9,9,0,0,0-4.8,2.6ZM49.9,58a4,4,0,0,0,.9,3.5,9.55,9.55,0,0,0,3.1,1.8.09.09,0,0,0,0-.1,10.6,10.6,0,0,0-1-3.3,6.45,6.45,0,0,0-3-2A.17.17,0,0,0,49.9,58ZM4.8,49.8a4,4,0,0,0,.9,3.5,9.55,9.55,0,0,0,3.1,1.8.09.09,0,0,0,0-.1,10.64,10.64,0,0,0-1-3.2A6.45,6.45,0,0,0,4.8,49.8ZM20.1,8.9A4,4,0,0,0,18.4,12a9.33,9.33,0,0,0,1,3.5.09.09,0,0,0,.1,0,10.82,10.82,0,0,0,1.5-3,6.43,6.43,0,0,0-.8-3.7ZM213,106.5s-1.6,7.4,3,11.6a31.49,31.49,0,0,0,10.6,6,.29.29,0,0,0,.2-.2c-.4-1.4-1.3-7.7-3.5-10.9a21.31,21.31,0,0,0-10.1-6.8A1.21,1.21,0,0,0,213,106.5Zm-35.6-1.2s4,1.8,7-.4a18.21,18.21,0,0,0,4.7-5.3.24.24,0,0,0-.1-.1c-.9,0-4.6-.2-6.7.7a12.41,12.41,0,0,0-5,5ZM161,60.5s-3.9,1.2-6.4-1a16.7,16.7,0,0,1-3.4-4.6c-.18-.32-.35-.66-.5-1,0,0,4.2.3,6.3,1.4a10.31,10.31,0,0,1,4,5v.2Zm11.1,65.6s1.2,7.4,7,9.6a31.11,31.11,0,0,0,12,2,.3.3,0,0,0,0-.4c-.9-1.2-4-6.7-7.1-8.8-4.6-3-11-2.8-11.8-2.8a.9.9,0,0,0,0,.4Zm59.8-18.3s-1,4.3,1.8,6.7a18.37,18.37,0,0,0,6.1,3.6.2.2,0,0,0,.1-.2c-.2-.8-.7-4.5-2-6.3a12.4,12.4,0,0,0-5.9-4,.75.75,0,0,0-.1.2ZM169.4,128s-2.2,2.7-1.2,5.4a14.29,14.29,0,0,0,3,4.7.17.17,0,0,0,.1,0c.2-.7,1.2-3.5,1-5.2a9.83,9.83,0,0,0-2.7-5,.54.54,0,0,0-.2.1ZM196,94.2s-1.3,6,2.4,9.4a25.28,25.28,0,0,0,8.5,4.9.29.29,0,0,0,.2-.3c-.3-1.1-1-6.2-2.9-8.7a17.2,17.2,0,0,0-8.1-5.6,1,1,0,0,0-.2.3Zm-89.6,28.5s-1.3,6.1,2.5,9.6a25.93,25.93,0,0,0,8.8,5,.3.3,0,0,0,.1-.2c-.3-1.2-1-6.4-2.9-9a17.67,17.67,0,0,0-8.4-5.7,1,1,0,0,0-.1.3Zm58.7-43.8s2,3.9,5.8,4a18.24,18.24,0,0,0,7-1.3.18.18,0,0,0,0-.2c-.7-.4-3.5-2.9-5.7-3.5a11.89,11.89,0,0,0-7,.8.67.67,0,0,0,0,.2ZM251,64a11.21,11.21,0,0,0-4.4,2.9c-2.2,2.2-3.1,5.6-8.4,7.5a6.59,6.59,0,0,1-8-3.3c-1.5-4,1.1-7.3,7-9.4,4.9-1.7,11.8,1.1,13.5,2a.55.55,0,0,1,.2.3ZM141.9,158.3a10,10,0,0,0-2.3-4c-1.8-2-4.8-3.1-6.2-7.9a5.8,5.8,0,0,1,3.5-7c3.5-1,6.3,1.5,7.9,6.8,1.2,4.5-1.8,10.5-2.6,11.9a.52.52,0,0,1-.3.2Zm81.5-60.1a4.49,4.49,0,0,0-1.8,1.2c-.8.9-1.2,2.3-3.3,3a2.7,2.7,0,0,1-3.3-1.3c-.6-1.6.5-3,2.8-3.8,2-.7,4.8.5,5.5.8A.24.24,0,0,1,223.4,98.2Zm-43.8,14.1a4.49,4.49,0,0,0-1.8,1.2c-.8.9-1.2,2.3-3.3,3a2.7,2.7,0,0,1-3.3-1.3c-.6-1.6.5-3,2.8-3.8,2-.7,4.8.4,5.5.8A.24.24,0,0,1,179.6,112.3Zm53.5-62.1a4.49,4.49,0,0,0-.5,2c0,1.3.6,2.6-.4,4.6A2.7,2.7,0,0,1,229,58c-1.5-.8-1.7-2.5-.5-4.8,1-1.8,3.8-2.9,4.6-3a.17.17,0,0,1,.1,0Zm-147.7,72a7.08,7.08,0,0,1,3.2-.7c2,0,3.9,1.2,7-.3a4.09,4.09,0,0,0,2.2-5c-1.1-2.4-3.8-2.7-7.3-1-3,1.3-4.8,5.7-5.2,6.7A.29.29,0,0,0,85.4,122.2Zm4.7,24.4a11.31,11.31,0,0,1,3.4-4c2.5-1.8,6-2.4,8.5-7.3a6.5,6.5,0,0,0-2.3-8.4c-3.7-2-7.3.2-10.1,5.8-2.4,4.6-.4,12,.2,13.6A.5.5,0,0,0,90.1,146.6Zm15.1,6.9a4.73,4.73,0,0,1,2-1c1.3-.3,2.8.1,4.6-1.4a2.9,2.9,0,0,0,.6-3.8c-1.2-1.4-3-1.1-5,.6-1.8,1.4-2.3,4.7-2.3,5.5a.17.17,0,0,0,0,.1Zm75.1-78a4.73,4.73,0,0,1,2,1c1,1,1.4,2.3,3.7,3a2.8,2.8,0,0,0,3.3-1.7c.4-1.7-.8-3-3.3-3.7-2.1-.6-5,.9-5.6,1.3a.17.17,0,0,0,0,.1Zm-35.6,28.7a4.73,4.73,0,0,1,1,2c.4,1.2,0,2.6,1.6,4.4a2.81,2.81,0,0,0,3.7.4c1.3-1.2,1-3-.7-4.9-1.5-1.6-4.7-2-5.4-2a.2.2,0,0,0-.2.1Zm-23.5,36.4a5.74,5.74,0,0,1,2.2-1.6c1.4-.6,3.2-.4,5-2.6a3.41,3.41,0,0,0,0-4.5c-1.7-1.4-3.7-.7-5.8,1.7-1.7,2-1.6,6-1.5,6.8a.3.3,0,0,0,.1.2Zm1.8,16.6c2.8-4,.3-8.9.3-8.9a.39.39,0,0,0-.2-.2,14.74,14.74,0,0,0-4.4.9c-1.7.6-4.6,3-4.3,6.2.4,3.5-.4,5.3-.8,5.8-.1.2,0,.2,0,.2A10,10,0,0,0,123,157.2ZM84.8,109.3s.3,6-3.8,8.6a24.78,24.78,0,0,1-9,3.5.29.29,0,0,1-.1-.3c.3-1.1,2-5.8,4-8a16.05,16.05,0,0,1,9-3.8Zm46.2,3.3s.2,4.5-3,6.6a18.72,18.72,0,0,1-6.7,2.7.18.18,0,0,1,0-.2c.2-1,1.4-4.5,3-6.1,2.4-2.6,6.6-3,6.6-3Zm35.6,6.6s-1.5,5.1-5.8,6.2a21.91,21.91,0,0,1-8.5.2.18.18,0,0,1,0-.2c.6-.9,3.4-4.4,5.8-5.6C161.7,118,166.6,119.2,166.6,119.2ZM131.3,83.1s-3.7.6-5.6-1.9a15.53,15.53,0,0,1-2.6-5.4h.1a15.19,15.19,0,0,1,5.2,2,10.49,10.49,0,0,1,3,5.3ZM240.4,107c-5.4-1.8-7.3-7.6-7.7-9.4a2.06,2.06,0,0,1,0-.7,16.06,16.06,0,0,1,5.1-2.9c2.5-.9,7.9-1,10.3,3,2.7,4.6,5.2,5.6,5.8,5.9a.51.51,0,0,1,0,.3s-5.3,6.3-13.5,3.7ZM214.3,70.1C210,75,203,74,201,73.4a2.28,2.28,0,0,1-.7-.3,18.32,18.32,0,0,1-.4-6.8c.3-3,2.9-8.5,8.2-9,6-.5,8.3-2.6,9-3a.48.48,0,0,1,.4.1s3.6,8.6-3,15.7ZM175.1,59.8c-2.8,3-7.1,2.3-8.4,2a1.46,1.46,0,0,1-.5-.2,11.75,11.75,0,0,1-.2-4.3c.1-1.8,1.8-5.4,5.1-5.6,3.8-.4,5.3-1.7,5.7-2a.34.34,0,0,1,.2,0,9.61,9.61,0,0,1-1.9,10ZM129.5,20c4,4,9.8,2,9.8,2a13.59,13.59,0,0,0,.2-5.2c-.4-2.1-2.5-5.8-6.2-6-5-.4-6.6-2-6.6-2A11.31,11.31,0,0,0,129.5,20Zm-7.2-5.2a4,4,0,0,0-1.8,3.1,9.33,9.33,0,0,0,1,3.5.09.09,0,0,0,.1,0,10.82,10.82,0,0,0,1.5-3A6.47,6.47,0,0,0,122.3,14.8Zm9.8,28.8a4,4,0,0,0-1.7,3.2,9.33,9.33,0,0,0,1,3.5.09.09,0,0,0,.1,0,10.85,10.85,0,0,0,1.5-3.1,6.47,6.47,0,0,0-.8-3.6ZM163,67.3a4,4,0,0,0,1.8,3,9.37,9.37,0,0,0,3.6.9.09.09,0,0,0,0-.1,10.68,10.68,0,0,0-2-2.8,6.41,6.41,0,0,0-3.5-1.1ZM138.4,31s2,4,5.6,4.3a18.46,18.46,0,0,0,7-.9.18.18,0,0,0,0-.2c-.6-.5-3.2-3.1-5.4-3.8-3-1-6.8.2-7.2.4a.67.67,0,0,0,0,.2Zm36.1-12.8a10.7,10.7,0,0,0-4.3,2.4c-2.2,2-3.4,5.1-8.5,6.6a6.3,6.3,0,0,1-7.5-3.7c-1-3.9,1.7-6.9,7.4-8.5,4.8-1.3,11.2,1.9,12.7,2.8a.48.48,0,0,1,.2.4Zm-21,28.5a7.45,7.45,0,0,0-3,2c-1.5,1.4-2.1,3.7-5.6,5a4.41,4.41,0,0,1-5.5-2.3c-1-2.6.8-4.9,4.8-6.3,3.3-1.2,8,.8,9,1.3A.39.39,0,0,1,153.5,46.7Zm-36.9-4.9a6.66,6.66,0,0,1,2.8-1.3c1.8-.5,3.8,0,6.5-2a4,4,0,0,0,.7-5.3c-1.6-1.9-4.1-1.6-7,.8-2.4,2-3,6.6-3.1,7.6a.34.34,0,0,0,0,.2ZM35.1,38c1.3,4.2,6.1,5,6.1,5a10.8,10.8,0,0,0,2-3.5c.6-1.6.5-5-2-6.5-3.3-2-3.9-3.8-3.9-3.8A9,9,0,0,0,35.1,38ZM97.7,22a4,4,0,0,0,1,3.5,9.56,9.56,0,0,0,3,1.8.09.09,0,0,0,.1-.1,10.64,10.64,0,0,0-1-3.2,6.45,6.45,0,0,0-3-2A.17.17,0,0,0,97.7,22ZM93,37.2a5.11,5.11,0,0,1,2.4-.5c1.5,0,2.9.9,5.2-.2a3,3,0,0,0,1.6-3.7c-.8-1.8-2.8-2-5.4-.8-2.2,1-3.5,4.3-3.8,5A.18.18,0,0,0,93,37.2Zm-24.1,7a4.59,4.59,0,0,1,2,.4c1.2.5,2,1.6,4.4,1.5a2.7,2.7,0,0,0,2.5-2.6c-.1-1.7-1.6-2.5-4.1-2.3-2.2,0-4.3,2.3-4.8,2.8A.18.18,0,0,0,68.9,44.2ZM63.5,15.8a5.61,5.61,0,0,1,2.1,1.7c1,1.2,1.3,3,4,4.2a3.4,3.4,0,0,0,4.2-1.3c.9-2-.3-3.8-3.2-5.1-2.4-1.1-6.1,0-7,.4a.17.17,0,0,0,0,.1Zm14.2-2.3a8,8,0,0,1,3.5,1c2,1,3.3,3,7.2,3.2a4.61,4.61,0,0,0,4.7-4c.2-2.9-2.3-4.6-6.7-4.7-3.7-.2-7.8,3.3-8.7,4.2A.32.32,0,0,0,77.7,13.5ZM46.1,17s-4.8,2.7-8.8.4a23.06,23.06,0,0,1-6.6-6,.19.19,0,0,1,.07-.27.16.16,0,0,1,.13,0c1-.2,5.7-.7,8.4.1C43.3,12.5,46.1,17,46.1,17ZM78.3,50s-1.6,5-5.8,5.8a21.59,21.59,0,0,1-8.4,0,.18.18,0,0,1,0-.2c.7-.9,3.5-4.1,5.9-5.2,3.6-1.7,8.3-.3,8.3-.3ZM19,131.5s3.3,5.3,8.5,5.2a26.06,26.06,0,0,0,9.9-2.3.32.32,0,0,0,0-.3c-1-.6-5.2-3.9-8.4-4.6-4.5-.9-9.5,1.4-10,1.7a.76.76,0,0,0,0,.3ZM13.5,140s.5,3.1,3,4a13.33,13.33,0,0,0,5,.9.1.1,0,1,0,0-.2,12.36,12.36,0,0,0-3-3.7,9,9,0,0,0-5-1.2v.2Zm-2,9s-3,5.2-.4,9.6a25.28,25.28,0,0,0,6.7,7.2.29.29,0,0,0,.2-.2c0-1.2.8-6.2-.1-9.2a17,17,0,0,0-6.1-7.7,1,1,0,0,0-.3.2ZM8.8,91.4a10.4,10.4,0,0,1,4.1-2.5c2.7-.9,5.9-.3,9.6-4a6,6,0,0,0,.4-8c-2.7-2.7-6.5-1.8-10.6,2.2-3.4,3.4-3.7,10.4-3.7,12A.52.52,0,0,0,8.8,91.4ZM25.4,45.8a4.48,4.48,0,0,1,2.1.4c1.2.5,2,1.6,4.3,1.5a2.7,2.7,0,0,0,2.5-2.6c0-1.7-1.6-2.5-4.1-2.3-2.1,0-4.3,2.3-4.7,2.8a.18.18,0,0,0,0,.2Zm-6.9,61.8s-4.7.4-7-2.8a19.46,19.46,0,0,1-3-7,.18.18,0,0,1,.2,0c1,.2,4.7,1.3,6.5,3C17.9,103.1,18.5,107.6,18.5,107.6Zm95.3-15.1s2,4,0,7.2a18.62,18.62,0,0,1-5.2,5h-.1a17,17,0,0,1,.4-6.9C110,94.6,113.8,92.5,113.8,92.5Zm-5.3-1.1s-2.3,4.8-6.6,5.2a21.87,21.87,0,0,1-8.5-1,.2.2,0,0,1,0-.28l0,0c.7-.8,4-3.8,6.5-4.6C103.9,89.4,108.5,91.4,108.5,91.4ZM52.4,73.5s-4.4.6-6.7-2.3a18.74,18.74,0,0,1-3.2-6.6.18.18,0,0,1,.2,0A15.63,15.63,0,0,1,49,67.1,12,12,0,0,1,52.4,73.5Zm-13.6,19s-1.6,5-5.8,5.8a21.46,21.46,0,0,1-8.3,0,.2.2,0,0,1,0-.28l0,0c.6-.8,3.4-4,5.8-5.1C34.1,91.1,38.8,92.5,38.8,92.5ZM53,38.2a4.48,4.48,0,0,1,1.5-1.5c1-.7,2.4-.8,3.6-2.8a2.7,2.7,0,0,0-.7-3.4c-1.5-.9-3-.1-4.3,2-1,2-.4,5-.2,5.6A.24.24,0,0,0,53,38.2ZM63.4,32s3.2,4.1,1.6,8a21.5,21.5,0,0,1-4.6,7,.2.2,0,0,1-.2-.1c-.4-1-1.5-5.2-1.1-7.8.6-3.9,4.3-7,4.3-7ZM128,65.4s-1.3,6,2.5,9.3a25.28,25.28,0,0,0,8.5,5,.29.29,0,0,0,.1-.3c-.3-1.1-1-6.2-2.8-8.7a17.08,17.08,0,0,0-8.1-5.6A1,1,0,0,0,128,65.4Zm-18.5-2.8s2,3.9,5.7,4a18.37,18.37,0,0,0,7-1.2.18.18,0,0,0,0-.2c-.7-.5-3.4-3-5.6-3.6a12.45,12.45,0,0,0-7.1.8A.67.67,0,0,0,109.5,62.6Z"/><g class="cls-3"><path class="cls-2" d="M177.94,271.65v13.27q-13.27,7.24-30.65,7.25-14.11,0-24-5.68a41.81,41.81,0,0,1-15.56-15.62A42.38,42.38,0,0,1,102,249.32a41.13,41.13,0,0,1,13.13-30.95q13.13-12.56,32.37-12.55,13.28,0,29.51,6.94v13q-14.79-8.44-28.9-8.45-14.49,0-24,9.14a30.36,30.36,0,0,0-9.57,22.9q0,13.89,9.42,22.81T148,281.06Q163.34,281.06,177.94,271.65Z"/><path class="cls-2" d="M213.67,255.88l-9.18-5.57q-8.62-5.28-12.28-10.37a19.67,19.67,0,0,1-3.65-11.74A20.77,20.77,0,0,1,195.47,212q6.92-6.21,18-6.21a33.89,33.89,0,0,1,19.36,5.93v13.69q-9.1-8.76-19.61-8.76a16.23,16.23,0,0,0-9.71,2.73,8.3,8.3,0,0,0-3.8,7,10.78,10.78,0,0,0,2.8,7.09,35.18,35.18,0,0,0,9,6.94l9.22,5.45q15.42,9.22,15.42,23.46,0,10.13-6.78,16.47t-17.65,6.34a37,37,0,0,1-22.75-7.68V269.16q9.76,12.39,22.62,12.39a14.25,14.25,0,0,0,9.45-3.16,9.91,9.91,0,0,0,3.77-7.91Q224.77,262.79,213.67,255.88Z"/><path class="cls-2" d="M270.27,255.88l-9.17-5.57q-8.64-5.28-12.28-10.37a19.6,19.6,0,0,1-3.65-11.74q0-9.94,6.9-16.17t18-6.21a34,34,0,0,1,19.37,5.93v13.69q-9.12-8.76-19.62-8.76a16.23,16.23,0,0,0-9.71,2.73,8.32,8.32,0,0,0-3.8,7,10.78,10.78,0,0,0,2.8,7.09,35.36,35.36,0,0,0,9,6.94l9.22,5.45q15.42,9.22,15.42,23.46,0,10.13-6.78,16.47t-17.65,6.34a37.07,37.07,0,0,1-22.75-7.68V269.16q9.76,12.39,22.63,12.39a14.24,14.24,0,0,0,9.44-3.16,9.91,9.91,0,0,0,3.77-7.91Q281.37,262.79,270.27,255.88Z"/></g></svg>
\ No newline at end of file
diff -pruN 2.3.1-1/assets/csstree-logo.svg 3.1.0-1/assets/csstree-logo.svg
--- 2.3.1-1/assets/csstree-logo.svg	1970-01-01 00:00:00.000000000 +0000
+++ 3.1.0-1/assets/csstree-logo.svg	2024-12-06 17:25:18.000000000 +0000
@@ -0,0 +1 @@
+<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 308.1 308.1"><defs><style>.cls-1{fill:url(#radial-gradient);}.cls-2{fill:#fff;}.cls-3{isolation:isolate;}</style><radialGradient id="radial-gradient" cx="156" cy="193.5" r="186.2" gradientTransform="matrix(1, 0, 0, -1, 0, 310)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#87c039"/><stop offset="0.9" stop-color="#a2c43c"/></radialGradient></defs><rect class="cls-1" width="308.1" height="308.1"/><path class="cls-2" d="M87.3,185.3c-7.5-34.5-15-36-22-58a40.07,40.07,0,0,1-1.6-8.4c1.8-4,7-12.7,17.7-13.2a21.21,21.21,0,0,1,15,4.4c5.9,4.4,6,18,6,18s1-.7,1-7.3-2.6-9.2-2.6-9.2l3.8,2.3c6.8,4.3,13.9,0,13.9,0s-5.6,1.4-13-2.3c-7-3.6-11.7-11.1-24.6-12a20,20,0,0,0-16,5.8c2.7-8.5,9.7-13.7,19-17.4a37.2,37.2,0,0,1,47.8,47.5c-3.7,9.1-13.7,11-13.7,11A20.3,20.3,0,0,0,135.2,134a37.77,37.77,0,0,0,2.6-15.3,9.8,9.8,0,0,0,6.7,1.4c5.5-1,9.5-4.8,10.8-6.1l1.7-1.6a9.37,9.37,0,0,1,3.5.2,11.24,11.24,0,0,1,4.6,2.4,13.15,13.15,0,0,1,3.2,4.2,40.55,40.55,0,0,1,2,5.1,11.1,11.1,0,0,0-.7-5.7,14.51,14.51,0,0,0-3.2-5,12.82,12.82,0,0,0-5.3-3.1,11,11,0,0,0-1.6-.4,20.22,20.22,0,0,1,3.8-2.9,14.9,14.9,0,0,1,14.4,1.8c-.7-.6-3-2.8-5.1-3.6a14.45,14.45,0,0,0-10.3-.2c-2,.7-7,4.7-8.4,5.8a18.64,18.64,0,0,1-9.6,4.4c-2.3.3-4.8-1.3-7-3.1a36.9,36.9,0,0,0-3.5-11.6l-1.7-2.8a57.24,57.24,0,0,0,10.9,2.5,59.74,59.74,0,0,0,17.3-.7,94.56,94.56,0,0,0,14.8-3.9l6.5-1.1c5.4-1,13.6-3.1,21.9-1.8a10.63,10.63,0,0,1,5,2.3,11.54,11.54,0,0,1,3.5,4.7,16,16,0,0,1,1,6.2,13.8,13.8,0,0,0,.4-6.6,12.31,12.31,0,0,0-3-6.2,13.1,13.1,0,0,0-2.2-1.8h2.2a40.23,40.23,0,0,1,9.4,1.2,18.94,18.94,0,0,1,4.4,1.8,12.38,12.38,0,0,1,3.6,3,11.61,11.61,0,0,1,2.1,4.2,17.65,17.65,0,0,1,.6,4.8,16.45,16.45,0,0,0-.2-5,12.36,12.36,0,0,0-1.9-4.5,13.47,13.47,0,0,0-3.6-3.5,19.77,19.77,0,0,0-4.5-2.2,39,39,0,0,0-9.8-1.9,82,82,0,0,0-8.3-.1c-1.6-.2-9.2.6-11.4.9h-.2l1-.4A147.6,147.6,0,0,1,206.4,85a53.55,53.55,0,0,1,15-2,40.49,40.49,0,0,1,14.5,3.3,53.76,53.76,0,0,1,7,3.6l6.9,4.1a39.46,39.46,0,0,0-12-11.3,35.78,35.78,0,0,0-7.7-3.6,40.72,40.72,0,0,0-8.4-1.6l-1.2-.2,1.4-1.4a30.87,30.87,0,0,0,5.1-7.6,21.78,21.78,0,0,0,1.6-4.3,22.81,22.81,0,0,0,.2-4.6,26.26,26.26,0,0,1-1.5,4.2,38.47,38.47,0,0,1-1.9,3.8,30.66,30.66,0,0,1-5.3,6.8,23.66,23.66,0,0,1-3.9,3,67.09,67.09,0,0,0-11.3,1.2A147.75,147.75,0,0,0,189,82.5l-15.2,4.8-7.6,2s-5,1-7.4,1.4a52.84,52.84,0,0,1-14.7.2,37.71,37.71,0,0,1-3.8-.8l1-.6c8-5.8,11-18.3,17.4-22,8.3-4.7,13-.7,13-.7s-5.6-5-14.6-1.4c-2.6,1-5.2,3.5-7.6,6.3a11.66,11.66,0,0,0-.5-1.4,15,15,0,0,0-3.3-4.4l-3.6-3c-2.3-2-4-3.7-4.6-6.2a12.2,12.2,0,0,1,0-4l.3-2.1.4-2.6-.2.1a10.52,10.52,0,0,0-1.6,1.8,12.12,12.12,0,0,0-1.2,2.1,10.53,10.53,0,0,0-1,5,11.2,11.2,0,0,0,1.7,5.2,24,24,0,0,0,3.1,4l3,3.2a10.78,10.78,0,0,1,2,3,10.21,10.21,0,0,1,1,3.8l-.3,1.7a48.64,48.64,0,0,1-4.3,5.2c-4.6,4.6-11.5,5-19.6.1A52.31,52.31,0,0,0,104,76.5l.4-.3a11.26,11.26,0,0,0,2.5-3.6,13.83,13.83,0,0,0,1-4.1,29.69,29.69,0,0,0,.2-4,60.9,60.9,0,0,1,0-7.4,18.79,18.79,0,0,1,2.2-7h-.1a8.64,8.64,0,0,0-2.7,3,12.84,12.84,0,0,0-1.3,3.7,52.38,52.38,0,0,0-.8,7.6,17.64,17.64,0,0,1-1.4,6.8,8.65,8.65,0,0,1-2,2.5,23.33,23.33,0,0,1-3.8,2,47.38,47.38,0,0,0-9.6.2,52.59,52.59,0,0,0-20.9,8.4A56.33,56.33,0,0,1,85.1,66.5c17.1-10.8,21.2-18.8,23.7-26.3l.9-3,1-1.6a18.52,18.52,0,0,1,4.3-4.4,9,9,0,0,1,1.2-.7l.3-.1.3-.1.7-.3a19.52,19.52,0,0,1,3-.8l2.2-.3.6.1a22.71,22.71,0,0,1,6.9,2.2,10.58,10.58,0,0,1,2.7,2,4.83,4.83,0,0,1,1.5,2.8,6.13,6.13,0,0,1-.7,3.2,25.2,25.2,0,0,1-2,3.3v.1a9.6,9.6,0,0,0,3.1-2.6,6.59,6.59,0,0,0,1.5-4,7,7,0,0,0-1.6-4.3,12.6,12.6,0,0,0-3.2-2.8l-.7-.4,3.7-.2a38.07,38.07,0,0,0,7.5-1.2,20.18,20.18,0,0,0,3.6-1.4,12.85,12.85,0,0,0,3.3-2.2,11.71,11.71,0,0,0,3.4-6.7l-.3-.1a28.48,28.48,0,0,1-2.2,2.7,15.24,15.24,0,0,1-2.6,2,15.53,15.53,0,0,1-6,2.4,36.81,36.81,0,0,1-6.8.3l-7-.3a53.6,53.6,0,0,0-7.6.2,24.85,24.85,0,0,0-4,.8l-1,.3-.4.2h-.3l-.3.2a13.83,13.83,0,0,0-2,1l-1.2,1a23.42,23.42,0,0,0-4.3-11.8,11.74,11.74,0,0,0-1.5-1.8,8.11,8.11,0,0,1-.3-2.4,11.68,11.68,0,0,1,1.4-4.9,15.65,15.65,0,0,1,3.3-4.2A25.93,25.93,0,0,1,112.4,0h-3a13.86,13.86,0,0,0-1.4.9,16.36,16.36,0,0,0-4.3,4.4,13.59,13.59,0,0,0-2.3,5.9C96.3,7.5,89,3.6,85.2,0H82.5a17.19,17.19,0,0,0,4,4.5c8.7,7.2,17,12.6,18.2,20.9s-3.8,18.8-14,26.4c-2,1.42-4.08,2.76-6.2,4,0,0,6.6-11.7,5-21s-10-16.6-14-20.6-6.8-13-6.8-13-.4,11.3,7.6,19.2a21.65,21.65,0,0,1,5,7.9,24.6,24.6,0,0,0-10.5-2,39.37,39.37,0,0,0-5,.2,4.34,4.34,0,0,1-1.3-.8A7.05,7.05,0,0,1,63,23c-.8-2-1.3-4.5-2-6.9a19.55,19.55,0,0,0-1.5-3.6,10.4,10.4,0,0,0-2.6-3,8.62,8.62,0,0,0-3.6-1.7,9.72,9.72,0,0,0-3.8,0V8c2.4.8,4.6,1.5,6.1,3a11.39,11.39,0,0,1,2.8,5.9l.7,3.5a27.27,27.27,0,0,0,.9,3.8,11.09,11.09,0,0,0,1.1,2.4c-3.6.1-5.8,0-8.2-1.5-4-2.4-5.2-8-5.2-8s.5,7,5.9,10.1S67.4,29.7,72.8,30a14.29,14.29,0,0,1,10,4.3,33.59,33.59,0,0,1-1,11.6c-2.6,10.8-17,23-17,23l-2,1.6c0-1.3.8-7.4-1.6-12.3-2.9-5.7-5.6-6.9-9.8-11-4.4-4.4-4.6-15.3-4.6-15.3s-.4,8.3,1.2,12.7c2.5,6.8,6.1,6.2,9,15.8,1.8,6-1,16.4-1,16.4a54.92,54.92,0,0,0-6.6,9l-1,1.5A64.29,64.29,0,0,0,36.6,74.4c-3-4.8-6-13.2-1-20.9C40.4,46,46.7,46,46.7,46a19.19,19.19,0,0,0-15,7.4c-3.5,4.7-3.5,12.5-3.5,15a31.17,31.17,0,0,1-8.7-8c-1-4.2-1.7-10.7,1.1-16,3.4-6.3,9.2-10,11.6-14.5,2.8-5.2,1.1-11.4,1.1-11.4s1.5,8.6-4.3,13.2S17.7,40,16.8,44.9c.9-7.6,4.4-12,4.4-18.3,0-8.2-6.3-14.2-6.3-14.2s3.8,5.9,4.6,11.4a12,12,0,0,0-6.2-5.6C9,16.4,8,11.7,8,11.7s-1.4,4,5,8c3.1,2,4.8,6,5.7,8.7-1,3.4-3,7.3-4.7,11.6q-.71-2.28-1.6-4.5A25.33,25.33,0,0,0,8,28.4a24.68,24.68,0,0,1,2,4.1c1.2,3.2,2,5,1.4,10.7a43.44,43.44,0,0,0,0,9.4l.1,1.7a19.54,19.54,0,0,0,3.1,8.6,11,11,0,0,0-10-.1A16.7,16.7,0,0,0,0,65.9v2.6a19.4,19.4,0,0,1,4-2.3c7-3,15.7,3.2,16.5,3.8,4.3,4.5,9.5,9,14.4,14.3,6.8,7.6,8,13.5,7.9,16.8l-.7,3A55.84,55.84,0,0,0,41,116.8s-2-3.3-11-4.4c-2.7-1.4-6.8-4.3-7.5-9.6-1-8,3-12,3-12a17.11,17.11,0,0,0-5.7,14.3,11,11,0,0,0,3.3,7,94.93,94.93,0,0,0-11.3.8A27.54,27.54,0,0,1,0,112v8.6l3.3-.4c4.7.5,9.6,0,14.8.2a13,13,0,0,0-7.9,6.4,20.09,20.09,0,0,0-.6,18s-2.8-8.1,2.5-14.3c9.5-11.2,23.5-4.3,24-4a27.35,27.35,0,0,1,8.7,11.8c.3.8,9.3,18.5,12.1,25C81.2,218.7,33.4,308,33.4,308H65.2s31.5-80,22.1-122.8Z"/><path class="cls-2" d="M116.6,21.4s-3.9-1.2-4.6-4.6a16.72,16.72,0,0,1-.2-5.6,11.69,11.69,0,0,1,.3-1.2s3.2,2.7,4.2,4.8a10.46,10.46,0,0,1,.4,6.4ZM13.7,13S10,11.5,9.1,8.2A17,17,0,0,1,9,2.6a10.13,10.13,0,0,1,.2-1.1s3.3,2.7,4.3,4.8a10.38,10.38,0,0,1,.3,6.4v.2ZM9,80.8a21.13,21.13,0,0,0-9-1v2A32.9,32.9,0,0,1,9,80.8Zm236.9,2.9s4.6,2,8-.5a21.37,21.37,0,0,0,5.5-6.1s-5.1-.5-7.8.7c-3.6,1.6-5.7,6-5.7,6Zm4.7,8.6s2.5,2.2,5.2,1.3a14.22,14.22,0,0,0,4.7-2.8s-3.1-1.3-5.1-1.1a9,9,0,0,0-4.8,2.6ZM49.9,58a4,4,0,0,0,.9,3.5,9.55,9.55,0,0,0,3.1,1.8.09.09,0,0,0,0-.1,10.6,10.6,0,0,0-1-3.3,6.45,6.45,0,0,0-3-2A.17.17,0,0,0,49.9,58ZM4.8,49.8a4,4,0,0,0,.9,3.5,9.55,9.55,0,0,0,3.1,1.8.09.09,0,0,0,0-.1,10.64,10.64,0,0,0-1-3.2A6.45,6.45,0,0,0,4.8,49.8ZM20.1,8.9A4,4,0,0,0,18.4,12a9.33,9.33,0,0,0,1,3.5.09.09,0,0,0,.1,0,10.82,10.82,0,0,0,1.5-3,6.43,6.43,0,0,0-.8-3.7ZM213,106.5s-1.6,7.4,3,11.6a31.49,31.49,0,0,0,10.6,6,.29.29,0,0,0,.2-.2c-.4-1.4-1.3-7.7-3.5-10.9a21.31,21.31,0,0,0-10.1-6.8A1.21,1.21,0,0,0,213,106.5Zm-35.6-1.2s4,1.8,7-.4a18.21,18.21,0,0,0,4.7-5.3.24.24,0,0,0-.1-.1c-.9,0-4.6-.2-6.7.7a12.41,12.41,0,0,0-5,5ZM161,60.5s-3.9,1.2-6.4-1a16.7,16.7,0,0,1-3.4-4.6c-.18-.32-.35-.66-.5-1,0,0,4.2.3,6.3,1.4a10.31,10.31,0,0,1,4,5v.2Zm11.1,65.6s1.2,7.4,7,9.6a31.11,31.11,0,0,0,12,2,.3.3,0,0,0,0-.4c-.9-1.2-4-6.7-7.1-8.8-4.6-3-11-2.8-11.8-2.8a.9.9,0,0,0,0,.4Zm59.8-18.3s-1,4.3,1.8,6.7a18.37,18.37,0,0,0,6.1,3.6.2.2,0,0,0,.1-.2c-.2-.8-.7-4.5-2-6.3a12.4,12.4,0,0,0-5.9-4,.75.75,0,0,0-.1.2ZM169.4,128s-2.2,2.7-1.2,5.4a14.29,14.29,0,0,0,3,4.7.17.17,0,0,0,.1,0c.2-.7,1.2-3.5,1-5.2a9.83,9.83,0,0,0-2.7-5,.54.54,0,0,0-.2.1ZM196,94.2s-1.3,6,2.4,9.4a25.28,25.28,0,0,0,8.5,4.9.29.29,0,0,0,.2-.3c-.3-1.1-1-6.2-2.9-8.7a17.2,17.2,0,0,0-8.1-5.6,1,1,0,0,0-.2.3Zm-89.6,28.5s-1.3,6.1,2.5,9.6a25.93,25.93,0,0,0,8.8,5,.3.3,0,0,0,.1-.2c-.3-1.2-1-6.4-2.9-9a17.67,17.67,0,0,0-8.4-5.7,1,1,0,0,0-.1.3Zm58.7-43.8s2,3.9,5.8,4a18.24,18.24,0,0,0,7-1.3.18.18,0,0,0,0-.2c-.7-.4-3.5-2.9-5.7-3.5a11.89,11.89,0,0,0-7,.8.67.67,0,0,0,0,.2ZM251,64a11.21,11.21,0,0,0-4.4,2.9c-2.2,2.2-3.1,5.6-8.4,7.5a6.59,6.59,0,0,1-8-3.3c-1.5-4,1.1-7.3,7-9.4,4.9-1.7,11.8,1.1,13.5,2a.55.55,0,0,1,.2.3ZM141.9,158.3a10,10,0,0,0-2.3-4c-1.8-2-4.8-3.1-6.2-7.9a5.8,5.8,0,0,1,3.5-7c3.5-1,6.3,1.5,7.9,6.8,1.2,4.5-1.8,10.5-2.6,11.9a.52.52,0,0,1-.3.2Zm81.5-60.1a4.49,4.49,0,0,0-1.8,1.2c-.8.9-1.2,2.3-3.3,3a2.7,2.7,0,0,1-3.3-1.3c-.6-1.6.5-3,2.8-3.8,2-.7,4.8.5,5.5.8A.24.24,0,0,1,223.4,98.2Zm-43.8,14.1a4.49,4.49,0,0,0-1.8,1.2c-.8.9-1.2,2.3-3.3,3a2.7,2.7,0,0,1-3.3-1.3c-.6-1.6.5-3,2.8-3.8,2-.7,4.8.4,5.5.8A.24.24,0,0,1,179.6,112.3Zm53.5-62.1a4.49,4.49,0,0,0-.5,2c0,1.3.6,2.6-.4,4.6A2.7,2.7,0,0,1,229,58c-1.5-.8-1.7-2.5-.5-4.8,1-1.8,3.8-2.9,4.6-3a.17.17,0,0,1,.1,0Zm-147.7,72a7.08,7.08,0,0,1,3.2-.7c2,0,3.9,1.2,7-.3a4.09,4.09,0,0,0,2.2-5c-1.1-2.4-3.8-2.7-7.3-1-3,1.3-4.8,5.7-5.2,6.7A.29.29,0,0,0,85.4,122.2Zm4.7,24.4a11.31,11.31,0,0,1,3.4-4c2.5-1.8,6-2.4,8.5-7.3a6.5,6.5,0,0,0-2.3-8.4c-3.7-2-7.3.2-10.1,5.8-2.4,4.6-.4,12,.2,13.6A.5.5,0,0,0,90.1,146.6Zm15.1,6.9a4.73,4.73,0,0,1,2-1c1.3-.3,2.8.1,4.6-1.4a2.9,2.9,0,0,0,.6-3.8c-1.2-1.4-3-1.1-5,.6-1.8,1.4-2.3,4.7-2.3,5.5a.17.17,0,0,0,0,.1Zm75.1-78a4.73,4.73,0,0,1,2,1c1,1,1.4,2.3,3.7,3a2.8,2.8,0,0,0,3.3-1.7c.4-1.7-.8-3-3.3-3.7-2.1-.6-5,.9-5.6,1.3a.17.17,0,0,0,0,.1Zm-35.6,28.7a4.73,4.73,0,0,1,1,2c.4,1.2,0,2.6,1.6,4.4a2.81,2.81,0,0,0,3.7.4c1.3-1.2,1-3-.7-4.9-1.5-1.6-4.7-2-5.4-2a.2.2,0,0,0-.2.1Zm-23.5,36.4a5.74,5.74,0,0,1,2.2-1.6c1.4-.6,3.2-.4,5-2.6a3.41,3.41,0,0,0,0-4.5c-1.7-1.4-3.7-.7-5.8,1.7-1.7,2-1.6,6-1.5,6.8a.3.3,0,0,0,.1.2Zm1.8,16.6c2.8-4,.3-8.9.3-8.9a.39.39,0,0,0-.2-.2,14.74,14.74,0,0,0-4.4.9c-1.7.6-4.6,3-4.3,6.2.4,3.5-.4,5.3-.8,5.8-.1.2,0,.2,0,.2A10,10,0,0,0,123,157.2ZM84.8,109.3s.3,6-3.8,8.6a24.78,24.78,0,0,1-9,3.5.29.29,0,0,1-.1-.3c.3-1.1,2-5.8,4-8a16.05,16.05,0,0,1,9-3.8Zm46.2,3.3s.2,4.5-3,6.6a18.72,18.72,0,0,1-6.7,2.7.18.18,0,0,1,0-.2c.2-1,1.4-4.5,3-6.1,2.4-2.6,6.6-3,6.6-3Zm35.6,6.6s-1.5,5.1-5.8,6.2a21.91,21.91,0,0,1-8.5.2.18.18,0,0,1,0-.2c.6-.9,3.4-4.4,5.8-5.6C161.7,118,166.6,119.2,166.6,119.2ZM131.3,83.1s-3.7.6-5.6-1.9a15.53,15.53,0,0,1-2.6-5.4h.1a15.19,15.19,0,0,1,5.2,2,10.49,10.49,0,0,1,3,5.3ZM240.4,107c-5.4-1.8-7.3-7.6-7.7-9.4a2.06,2.06,0,0,1,0-.7,16.06,16.06,0,0,1,5.1-2.9c2.5-.9,7.9-1,10.3,3,2.7,4.6,5.2,5.6,5.8,5.9a.51.51,0,0,1,0,.3s-5.3,6.3-13.5,3.7ZM214.3,70.1C210,75,203,74,201,73.4a2.28,2.28,0,0,1-.7-.3,18.32,18.32,0,0,1-.4-6.8c.3-3,2.9-8.5,8.2-9,6-.5,8.3-2.6,9-3a.48.48,0,0,1,.4.1s3.6,8.6-3,15.7ZM175.1,59.8c-2.8,3-7.1,2.3-8.4,2a1.46,1.46,0,0,1-.5-.2,11.75,11.75,0,0,1-.2-4.3c.1-1.8,1.8-5.4,5.1-5.6,3.8-.4,5.3-1.7,5.7-2a.34.34,0,0,1,.2,0,9.61,9.61,0,0,1-1.9,10ZM129.5,20c4,4,9.8,2,9.8,2a13.59,13.59,0,0,0,.2-5.2c-.4-2.1-2.5-5.8-6.2-6-5-.4-6.6-2-6.6-2A11.31,11.31,0,0,0,129.5,20Zm-7.2-5.2a4,4,0,0,0-1.8,3.1,9.33,9.33,0,0,0,1,3.5.09.09,0,0,0,.1,0,10.82,10.82,0,0,0,1.5-3A6.47,6.47,0,0,0,122.3,14.8Zm9.8,28.8a4,4,0,0,0-1.7,3.2,9.33,9.33,0,0,0,1,3.5.09.09,0,0,0,.1,0,10.85,10.85,0,0,0,1.5-3.1,6.47,6.47,0,0,0-.8-3.6ZM163,67.3a4,4,0,0,0,1.8,3,9.37,9.37,0,0,0,3.6.9.09.09,0,0,0,0-.1,10.68,10.68,0,0,0-2-2.8,6.41,6.41,0,0,0-3.5-1.1ZM138.4,31s2,4,5.6,4.3a18.46,18.46,0,0,0,7-.9.18.18,0,0,0,0-.2c-.6-.5-3.2-3.1-5.4-3.8-3-1-6.8.2-7.2.4a.67.67,0,0,0,0,.2Zm36.1-12.8a10.7,10.7,0,0,0-4.3,2.4c-2.2,2-3.4,5.1-8.5,6.6a6.3,6.3,0,0,1-7.5-3.7c-1-3.9,1.7-6.9,7.4-8.5,4.8-1.3,11.2,1.9,12.7,2.8a.48.48,0,0,1,.2.4Zm-21,28.5a7.45,7.45,0,0,0-3,2c-1.5,1.4-2.1,3.7-5.6,5a4.41,4.41,0,0,1-5.5-2.3c-1-2.6.8-4.9,4.8-6.3,3.3-1.2,8,.8,9,1.3A.39.39,0,0,1,153.5,46.7Zm-36.9-4.9a6.66,6.66,0,0,1,2.8-1.3c1.8-.5,3.8,0,6.5-2a4,4,0,0,0,.7-5.3c-1.6-1.9-4.1-1.6-7,.8-2.4,2-3,6.6-3.1,7.6a.34.34,0,0,0,0,.2ZM35.1,38c1.3,4.2,6.1,5,6.1,5a10.8,10.8,0,0,0,2-3.5c.6-1.6.5-5-2-6.5-3.3-2-3.9-3.8-3.9-3.8A9,9,0,0,0,35.1,38ZM97.7,22a4,4,0,0,0,1,3.5,9.56,9.56,0,0,0,3,1.8.09.09,0,0,0,.1-.1,10.64,10.64,0,0,0-1-3.2,6.45,6.45,0,0,0-3-2A.17.17,0,0,0,97.7,22ZM93,37.2a5.11,5.11,0,0,1,2.4-.5c1.5,0,2.9.9,5.2-.2a3,3,0,0,0,1.6-3.7c-.8-1.8-2.8-2-5.4-.8-2.2,1-3.5,4.3-3.8,5A.18.18,0,0,0,93,37.2Zm-24.1,7a4.59,4.59,0,0,1,2,.4c1.2.5,2,1.6,4.4,1.5a2.7,2.7,0,0,0,2.5-2.6c-.1-1.7-1.6-2.5-4.1-2.3-2.2,0-4.3,2.3-4.8,2.8A.18.18,0,0,0,68.9,44.2ZM63.5,15.8a5.61,5.61,0,0,1,2.1,1.7c1,1.2,1.3,3,4,4.2a3.4,3.4,0,0,0,4.2-1.3c.9-2-.3-3.8-3.2-5.1-2.4-1.1-6.1,0-7,.4a.17.17,0,0,0,0,.1Zm14.2-2.3a8,8,0,0,1,3.5,1c2,1,3.3,3,7.2,3.2a4.61,4.61,0,0,0,4.7-4c.2-2.9-2.3-4.6-6.7-4.7-3.7-.2-7.8,3.3-8.7,4.2A.32.32,0,0,0,77.7,13.5ZM46.1,17s-4.8,2.7-8.8.4a23.06,23.06,0,0,1-6.6-6,.19.19,0,0,1,.07-.27.16.16,0,0,1,.13,0c1-.2,5.7-.7,8.4.1C43.3,12.5,46.1,17,46.1,17ZM78.3,50s-1.6,5-5.8,5.8a21.59,21.59,0,0,1-8.4,0,.18.18,0,0,1,0-.2c.7-.9,3.5-4.1,5.9-5.2,3.6-1.7,8.3-.3,8.3-.3ZM19,131.5s3.3,5.3,8.5,5.2a26.06,26.06,0,0,0,9.9-2.3.32.32,0,0,0,0-.3c-1-.6-5.2-3.9-8.4-4.6-4.5-.9-9.5,1.4-10,1.7a.76.76,0,0,0,0,.3ZM13.5,140s.5,3.1,3,4a13.33,13.33,0,0,0,5,.9.1.1,0,1,0,0-.2,12.36,12.36,0,0,0-3-3.7,9,9,0,0,0-5-1.2v.2Zm-2,9s-3,5.2-.4,9.6a25.28,25.28,0,0,0,6.7,7.2.29.29,0,0,0,.2-.2c0-1.2.8-6.2-.1-9.2a17,17,0,0,0-6.1-7.7,1,1,0,0,0-.3.2ZM8.8,91.4a10.4,10.4,0,0,1,4.1-2.5c2.7-.9,5.9-.3,9.6-4a6,6,0,0,0,.4-8c-2.7-2.7-6.5-1.8-10.6,2.2-3.4,3.4-3.7,10.4-3.7,12A.52.52,0,0,0,8.8,91.4ZM25.4,45.8a4.48,4.48,0,0,1,2.1.4c1.2.5,2,1.6,4.3,1.5a2.7,2.7,0,0,0,2.5-2.6c0-1.7-1.6-2.5-4.1-2.3-2.1,0-4.3,2.3-4.7,2.8a.18.18,0,0,0,0,.2Zm-6.9,61.8s-4.7.4-7-2.8a19.46,19.46,0,0,1-3-7,.18.18,0,0,1,.2,0c1,.2,4.7,1.3,6.5,3C17.9,103.1,18.5,107.6,18.5,107.6Zm95.3-15.1s2,4,0,7.2a18.62,18.62,0,0,1-5.2,5h-.1a17,17,0,0,1,.4-6.9C110,94.6,113.8,92.5,113.8,92.5Zm-5.3-1.1s-2.3,4.8-6.6,5.2a21.87,21.87,0,0,1-8.5-1,.2.2,0,0,1,0-.28l0,0c.7-.8,4-3.8,6.5-4.6C103.9,89.4,108.5,91.4,108.5,91.4ZM52.4,73.5s-4.4.6-6.7-2.3a18.74,18.74,0,0,1-3.2-6.6.18.18,0,0,1,.2,0A15.63,15.63,0,0,1,49,67.1,12,12,0,0,1,52.4,73.5Zm-13.6,19s-1.6,5-5.8,5.8a21.46,21.46,0,0,1-8.3,0,.2.2,0,0,1,0-.28l0,0c.6-.8,3.4-4,5.8-5.1C34.1,91.1,38.8,92.5,38.8,92.5ZM53,38.2a4.48,4.48,0,0,1,1.5-1.5c1-.7,2.4-.8,3.6-2.8a2.7,2.7,0,0,0-.7-3.4c-1.5-.9-3-.1-4.3,2-1,2-.4,5-.2,5.6A.24.24,0,0,0,53,38.2ZM63.4,32s3.2,4.1,1.6,8a21.5,21.5,0,0,1-4.6,7,.2.2,0,0,1-.2-.1c-.4-1-1.5-5.2-1.1-7.8.6-3.9,4.3-7,4.3-7ZM128,65.4s-1.3,6,2.5,9.3a25.28,25.28,0,0,0,8.5,5,.29.29,0,0,0,.1-.3c-.3-1.1-1-6.2-2.8-8.7a17.08,17.08,0,0,0-8.1-5.6A1,1,0,0,0,128,65.4Zm-18.5-2.8s2,3.9,5.7,4a18.37,18.37,0,0,0,7-1.2.18.18,0,0,0,0-.2c-.7-.5-3.4-3-5.6-3.6a12.45,12.45,0,0,0-7.1.8A.67.67,0,0,0,109.5,62.6Z"/><g class="cls-3"><path class="cls-2" d="M177.94,271.65v13.27q-13.27,7.24-30.65,7.25-14.11,0-24-5.68a41.81,41.81,0,0,1-15.56-15.62A42.38,42.38,0,0,1,102,249.32a41.13,41.13,0,0,1,13.13-30.95q13.13-12.56,32.37-12.55,13.28,0,29.51,6.94v13q-14.79-8.44-28.9-8.45-14.49,0-24,9.14a30.36,30.36,0,0,0-9.57,22.9q0,13.89,9.42,22.81T148,281.06Q163.34,281.06,177.94,271.65Z"/><path class="cls-2" d="M213.67,255.88l-9.18-5.57q-8.62-5.28-12.28-10.37a19.67,19.67,0,0,1-3.65-11.74A20.77,20.77,0,0,1,195.47,212q6.92-6.21,18-6.21a33.89,33.89,0,0,1,19.36,5.93v13.69q-9.1-8.76-19.61-8.76a16.23,16.23,0,0,0-9.71,2.73,8.3,8.3,0,0,0-3.8,7,10.78,10.78,0,0,0,2.8,7.09,35.18,35.18,0,0,0,9,6.94l9.22,5.45q15.42,9.22,15.42,23.46,0,10.13-6.78,16.47t-17.65,6.34a37,37,0,0,1-22.75-7.68V269.16q9.76,12.39,22.62,12.39a14.25,14.25,0,0,0,9.45-3.16,9.91,9.91,0,0,0,3.77-7.91Q224.77,262.79,213.67,255.88Z"/><path class="cls-2" d="M270.27,255.88l-9.17-5.57q-8.64-5.28-12.28-10.37a19.6,19.6,0,0,1-3.65-11.74q0-9.94,6.9-16.17t18-6.21a34,34,0,0,1,19.37,5.93v13.69q-9.12-8.76-19.62-8.76a16.23,16.23,0,0,0-9.71,2.73,8.32,8.32,0,0,0-3.8,7,10.78,10.78,0,0,0,2.8,7.09,35.36,35.36,0,0,0,9,6.94l9.22,5.45q15.42,9.22,15.42,23.46,0,10.13-6.78,16.47t-17.65,6.34a37.07,37.07,0,0,1-22.75-7.68V269.16q9.76,12.39,22.63,12.39a14.24,14.24,0,0,0,9.44-3.16,9.91,9.91,0,0,0,3.77-7.91Q281.37,262.79,270.27,255.88Z"/></g></svg>
\ No newline at end of file
diff -pruN 2.3.1-1/data/patch.json 3.1.0-1/data/patch.json
--- 2.3.1-1/data/patch.json	2022-12-14 17:31:12.000000000 +0000
+++ 3.1.0-1/data/patch.json	2024-12-06 17:25:18.000000000 +0000
@@ -3,6 +3,9 @@
         "charset": {
             "prelude": "<string>"
         },
+        "container": {
+            "prelude": "[ <container-name> ]? <container-condition>"
+        },
         "font-face": {
             "descriptors": {
                 "unicode-range": {
@@ -13,6 +16,50 @@
         },
         "nest": {
             "prelude": "<complex-selector-list>"
+        },
+        "scope": {
+            "prelude": "[ ( <scope-start> ) ]? [ to ( <scope-end> ) ]?"
+        },
+        "position-try": {
+            "comment": "The list of descriptors: https://developer.mozilla.org/en-US/docs/Web/CSS/@position-try",
+            "descriptors": {
+                "top": "<'top'>",
+                "left": "<'left'>",
+                "bottom": "<'bottom'>",
+                "right": "<'right'>",
+                "inset-block-start": "<'inset-block-start'>",
+                "inset-block-end": "<'inset-block-end'>",
+                "inset-inline-start": "<'inset-inline-start'>",
+                "inset-inline-end": "<'inset-inline-end'>",
+                "inset-block": "<'inset-block'>",
+                "inset-inline": "<'inset-inline'>",
+                "inset": "<'inset'>",
+                "margin-top": "<'margin-top'>",
+                "margin-left": "<'margin-left'>",
+                "margin-bottom": "<'margin-bottom'>",
+                "margin-right": "<'margin-right'>",
+                "margin-block-start": "<'margin-block-start'>",
+                "margin-block-end": "<'margin-block-end'>",
+                "margin-inline-start": "<'margin-inline-start'>",
+                "margin-inline-end": "<'margin-inline-end'>",
+                "margin": "<'margin'>",
+                "margin-block": "<'margin-block'>",
+                "margin-inline": "<'margin-inline'>",
+                "width": "<'width'>",
+                "height": "<'height'>",
+                "min-width": "<'min-width'>",
+                "min-height": "<'min-height'>",
+                "max-width": "<'max-width'>",
+                "max-height": "<'max-height'>",
+                "block-size": "<'block-size'>",
+                "inline-size": "<'inline-size'>",
+                "min-block-size": "<'min-block-size'>",
+                "min-inline-size": "<'min-inline-size'>",
+                "max-block-size": "<'max-block-size'>",
+                "max-inline-size": "<'max-inline-size'>",
+                "align-self": "<'align-self'> | anchor-center",
+                "justify-self": "<'justify-self'> | anchor-center"
+            }
         }
     },
     "properties": {
@@ -171,12 +218,9 @@
             "comment": "added old IE property https://msdn.microsoft.com/en-us/library/ms530723(v=vs.85).aspx",
             "syntax": "<url>+"
         },
-        "clip-rule": {
-            "comment": "added SVG property",
-            "references": [
-                "https://www.w3.org/TR/SVG/masking.html#ClipRuleProperty"
-            ],
-            "syntax": "nonzero | evenodd"
+        "container-type": {
+            "comment": "https://www.w3.org/TR/css-contain-3/#propdef-container-type",
+            "syntax": "normal || [ size | inline-size ]"
         },
         "cue": {
             "comment": "https://www.w3.org/TR/css3-speech/#property-index",
@@ -234,17 +278,19 @@
             ],
             "syntax": "<number-zero-one>"
         },
-        "fill-rule": {
-            "comment": "added SVG property",
-            "references": [
-                "https://www.w3.org/TR/SVG/painting.html#FillProperty"
-            ],
-            "syntax": "nonzero | evenodd"
-        },
         "filter": {
             "comment": "extend with IE legacy syntaxes",
             "syntax": "| <-ms-filter-function-list>"
         },
+        "font": {
+            "comment": "align with font-4, fix <'font-family'>#, add non standard fonts",
+            "references": [
+                "https://drafts.csswg.org/css-fonts-4/#font-prop",
+                "https://github.com/w3c/csswg-drafts/pull/10832",
+                "https://webkit.org/blog/3709/using-the-system-font-in-web-content/"
+            ],
+            "syntax": "[ [ <'font-style'> || <font-variant-css2> || <'font-weight'> || <font-width-css3> ]? <'font-size'> [ / <'line-height'> ]? <'font-family'># ] | <system-family-name> | <-non-standard-font>"
+        },
         "glyph-orientation-horizontal": {
             "comment": "added SVG property",
             "references": [
@@ -273,48 +319,30 @@
             ],
             "syntax": "normal | <length-percentage>"
         },
-        "marker": {
-            "comment": "added SVG property",
-            "references": [
-                "https://www.w3.org/TR/SVG/painting.html#MarkerProperties"
-            ],
-            "syntax": "none | <url>"
-        },
-        "marker-end": {
-            "comment": "added SVG property",
-            "references": [
-                "https://www.w3.org/TR/SVG/painting.html#MarkerProperties"
-            ],
-            "syntax": "none | <url>"
-        },
-        "marker-mid": {
-            "comment": "added SVG property",
-            "references": [
-                "https://www.w3.org/TR/SVG/painting.html#MarkerProperties"
-            ],
-            "syntax": "none | <url>"
-        },
-        "marker-start": {
-            "comment": "added SVG property",
-            "references": [
-                "https://www.w3.org/TR/SVG/painting.html#MarkerProperties"
-            ],
-            "syntax": "none | <url>"
-        },
         "max-width": {
-            "comment": "extend by non-standard width keywords https://developer.mozilla.org/en-US/docs/Web/CSS/max-width",
-            "syntax": "| <-non-standard-width>"
+            "comment": "extend by non-standard size keywords https://developer.mozilla.org/en-US/docs/Web/CSS/width",
+            "syntax": "| stretch | <-non-standard-size>"
+        },
+        "max-height": {
+            "comment": "extend by non-standard size keywords https://developer.mozilla.org/en-US/docs/Web/CSS/width",
+            "syntax": "| stretch | <-non-standard-size>"
         },
         "width": {
             "references": [
                 "https://developer.mozilla.org/en-US/docs/Web/CSS/width",
                 "https://github.com/csstree/stylelint-validator/issues/29"
             ],
-            "syntax": "| fill | stretch | intrinsic | -moz-max-content | -webkit-max-content | -moz-fit-content | -webkit-fit-content"
+            "syntax": "| stretch | <-non-standard-size>"
+        },
+        "height": {
+            "syntax": "| stretch | <-non-standard-size>"
         },
         "min-width": {
             "comment": "extend by non-standard width keywords https://developer.mozilla.org/en-US/docs/Web/CSS/width",
-            "syntax": "| <-non-standard-width>"
+            "syntax": "| stretch | <-non-standard-size>"
+        },
+        "min-height": {
+            "syntax": "| stretch | <-non-standard-size>"
         },
         "overflow": {
             "comment": "extend by vendor keywords https://developer.mozilla.org/en-US/docs/Web/CSS/overflow",
@@ -344,12 +372,19 @@
             "comment": "https://www.w3.org/TR/css3-speech/#property-index",
             "syntax": "<time> | none | x-weak | weak | medium | strong | x-strong"
         },
-        "shape-rendering": {
-            "comment": "added SVG property",
+        "scroll-timeline": {
+            "comment": "fix according to spec",
+            "references": [
+                "https://www.w3.org/TR/scroll-animations-1/#scroll-timeline-shorthand"
+            ],
+            "syntax": "[ <'scroll-timeline-name'> || <'scroll-timeline-axis'> ]#"
+        },
+        "scroll-timeline-name": {
+            "comment": "fix according to spec",
             "references": [
-                "https://www.w3.org/TR/SVG/painting.html#ShapeRenderingPropert"
+                "https://w3c.github.io/csswg-drafts/scroll-animations/#propdef-scroll-timeline-name"
             ],
-            "syntax": "auto | optimizeSpeed | crispEdges | geometricPrecision"
+            "syntax": "[ none | <dashed-ident> ]#"
         },
         "src": {
             "comment": "added @font-face's src property https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/src",
@@ -357,7 +392,7 @@
         },
         "speak": {
             "comment": "https://www.w3.org/TR/css3-speech/#property-index",
-            "syntax": "auto | none | normal"
+            "syntax": "auto | never | always"
         },
         "speak-as": {
             "comment": "https://www.w3.org/TR/css3-speech/#property-index",
@@ -384,13 +419,6 @@
             ],
             "syntax": "<svg-length>"
         },
-        "stroke-linecap": {
-            "comment": "added SVG property",
-            "references": [
-                "https://www.w3.org/TR/SVG/painting.html#StrokeProperties"
-            ],
-            "syntax": "butt | round | square"
-        },
         "stroke-linejoin": {
             "comment": "added SVG property",
             "references": [
@@ -405,13 +433,6 @@
             ],
             "syntax": "<number-one-or-greater>"
         },
-        "stroke-opacity": {
-            "comment": "added SVG property",
-            "references": [
-                "https://www.w3.org/TR/SVG/painting.html#StrokeProperties"
-            ],
-            "syntax": "<number-zero-one>"
-        },
         "stroke-width": {
             "comment": "added SVG property",
             "references": [
@@ -419,12 +440,9 @@
             ],
             "syntax": "<svg-length>"
         },
-        "text-anchor": {
-            "comment": "added SVG property",
-            "references": [
-                "https://www.w3.org/TR/SVG/text.html#TextAlignmentProperties"
-            ],
-            "syntax": "start | middle | end"
+        "text-wrap": {
+            "comment": "broken in mdn/data",
+            "syntax": "<'text-wrap-mode'> || <'text-wrap-style'>"
         },
         "unicode-bidi": {
             "comment": "added prefixed keywords https://developer.mozilla.org/en-US/docs/Web/CSS/unicode-bidi",
@@ -469,6 +487,17 @@
         "writing-mode": {
             "comment": "extend with SVG keywords",
             "syntax": "| <svg-writing-mode>"
+        },
+        "white-space-trim": {
+            "syntax": "none | discard-before || discard-after || discard-inner",
+            "comment": "missed, https://www.w3.org/TR/css-text-4/#white-space-trim"
+        },
+        "word-break": {
+            "syntax": "normal | break-all | keep-all | break-word | auto-phrase",
+            "comment": "added in Chrome/Edge 119, not covered by a spec currently (2024-09-02)",
+            "references": [
+                "https://developer.mozilla.org/en-US/docs/Web/CSS/word-break"
+            ]
         }
     },
     "types": {
@@ -529,11 +558,11 @@
         },
         "-non-standard-overflow": {
             "comment": "non-standard keywords https://developer.mozilla.org/en-US/docs/Web/CSS/overflow",
-            "syntax": "-moz-scrollbars-none | -moz-scrollbars-horizontal | -moz-scrollbars-vertical | -moz-hidden-unscrollable"
+            "syntax": "overlay | -moz-scrollbars-none | -moz-scrollbars-horizontal | -moz-scrollbars-vertical | -moz-hidden-unscrollable"
         },
-        "-non-standard-width": {
+        "-non-standard-size": {
             "comment": "non-standard keywords https://developer.mozilla.org/en-US/docs/Web/CSS/width",
-            "syntax": "fill-available | min-intrinsic | intrinsic | -moz-available | -moz-fit-content | -moz-min-content | -moz-max-content | -webkit-min-content | -webkit-max-content"
+            "syntax": "intrinsic | min-intrinsic | -webkit-fill-available | -webkit-fit-content | -webkit-min-content | -webkit-max-content  | -moz-available | -moz-fit-content | -moz-min-content | -moz-max-content"
         },
         "-webkit-gradient()": {
             "comment": "first Apple proposal gradient syntax https://webkit.org/blog/175/introducing-css-gradients/ - TODO: simplify when after match algorithm improvement ( [, point, radius | , point] -> [, radius]? , point )",
@@ -559,10 +588,6 @@
             "comment": "missed; https://developer.mozilla.org/en-US/docs/Web/CSS/-webkit-mask-box-image",
             "syntax": "repeat | stretch | round"
         },
-        "-webkit-mask-clip-style": {
-            "comment": "missed; there is no enough information about `-webkit-mask-clip` property, but looks like all those keywords are working",
-            "syntax": "border | border-box | padding | padding-box | content | content-box | text"
-        },
         "-ms-filter-function-list": {
             "comment": "https://developer.mozilla.org/en-US/docs/Web/CSS/-ms-filter",
             "syntax": "<-ms-filter-function>+"
@@ -579,13 +604,22 @@
             "comment": "https://developer.mozilla.org/en-US/docs/Web/CSS/-ms-filter",
             "syntax": "<ident-token> | <function-token> <any-value>? )"
         },
-        "-ms-filter": {
-            "syntax": "<string>"
+        "absolute-color-base": {
+            "comment": "https://www.w3.org/TR/css-color-4/#color-syntax",
+            "syntax": "<hex-color> | <absolute-color-function> | <named-color> | transparent"
+        },
+        "absolute-color-function": {
+            "comment": "https://www.w3.org/TR/css-color-4/#color-syntax",
+            "syntax": "<rgb()> | <rgba()> | <hsl()> | <hsla()> | <hwb()> | <lab()> | <lch()> | <oklab()> | <oklch()> | <color()>"
         },
         "age": {
             "comment": "https://www.w3.org/TR/css3-speech/#voice-family",
             "syntax": "child | young | old"
         },
+        "anchor-name": {
+            "comment": "missed in mdn/data",
+            "syntax": "<dashed-ident>"
+        },
         "attr-name": {
             "syntax": "<wq-name>"
         },
@@ -604,6 +638,17 @@
             "comment": "added attr(), see https://github.com/csstree/csstree/issues/201",
             "syntax": "[ <string> | contents | <image> | <counter> | <quote> | <target> | <leader()> | <attr()> ]+"
         },
+        "container-name": {
+            "comment": "missed, https://drafts.csswg.org/css-contain-3/#container-rule",
+            "syntax": "<custom-ident>"
+        },
+        "container-condition": {
+            "comment": "missed, https://drafts.csswg.org/css-contain-3/#container-rule",
+            "syntax": "not <query-in-parens> | <query-in-parens> [ [ and <query-in-parens> ]* | [ or <query-in-parens> ]* ]"
+        },
+        "coord-box": {
+            "syntax": "content-box | padding-box | border-box | fill-box | stroke-box | view-box"
+        },
         "element()": {
             "comment": "https://drafts.csswg.org/css-gcpm/#element-syntax & https://drafts.csswg.org/css-images-4/#element-notation",
             "syntax": "element( <custom-ident> , [ first | start | last | first-except ]? ) | element( <id-selector> )"
@@ -616,12 +661,29 @@
             "comment": "https://www.w3.org/TR/css3-speech/#voice-family",
             "syntax": "male | female | neutral"
         },
+        "general-enclosed": {
+            "comment": "remove ident-token, optional any-value, brackets (see https://drafts.csswg.org/mediaqueries-5/#typedef-general-enclosed)",
+            "syntax": "[ <function-token> <any-value>? ) ] | [ ( <any-value>? ) ]"
+        },
         "generic-family": {
-            "comment": "added -apple-system",
+            "comment": "new definition on font-4, https://drafts.csswg.org/css-fonts-4/#typedef-generic-family",
+            "syntax": "<generic-script-specific>| <generic-complete> | <generic-incomplete> | <-non-standard-generic-family>"
+        },
+        "generic-script-specific": {
+            "syntax": "generic(kai) | generic(fangsong) | generic(nastaliq)"
+        },
+        "generic-complete": {
+            "syntax": "serif | sans-serif | system-ui | cursive | fantasy | math | monospace"
+        },
+        "generic-incomplete": {
+            "syntax": "ui-serif | ui-sans-serif | ui-monospace | ui-rounded"
+        },
+        "-non-standard-generic-family": {
+            "syntax": "-apple-system | BlinkMacSystemFont",
             "references": [
+                "https://css-tricks.com/snippets/css/system-font-stack/",
                 "https://webkit.org/blog/3709/using-the-system-font-in-web-content/"
-            ],
-            "syntax": "| -apple-system"
+            ]
         },
         "gradient": {
             "comment": "added legacy syntaxes support",
@@ -631,18 +693,48 @@
             "comment": "missed; not sure we should add it, but no others except `shape` is using it so it's ok for now; https://drafts.fxtf.org/css-masking-1/#funcdef-clip-rect",
             "syntax": "<length> | auto"
         },
-        "mask-image": {
-            "comment": "missed; https://drafts.fxtf.org/css-masking-1/#the-mask-image",
-            "syntax": "<mask-reference>#"
-        },
-        "named-color": {
-            "comment": "added non standard color names",
-            "syntax": "| <-non-standard-color>"
+        "color": {
+            "comment": "css-color-5, added non standard color names",
+            "syntax": "<color-base> | currentColor | <system-color> | <device-cmyk()>  | <light-dark()> | <-non-standard-color>"
+        },
+        "color-base": {
+            "syntax": "<hex-color> | <color-function> | <named-color> | <color-mix()> | transparent"
+        },
+        "color-function": {
+            "syntax": "<rgb()> | <rgba()> | <hsl()> | <hsla()> | <hwb()> | <lab()> | <lch()> | <oklab()> | <oklch()> | <color()>"
+        },
+        "device-cmyk()": {
+            "syntax": "<legacy-device-cmyk-syntax> | <modern-device-cmyk-syntax>"
+        },
+        "legacy-device-cmyk-syntax": {
+            "syntax": "device-cmyk( <number>#{4} )"
+        },
+        "modern-device-cmyk-syntax": {
+            "syntax": "device-cmyk( <cmyk-component>{4} [ / [ <alpha-value> | none ] ]? )"
+        },
+        "cmyk-component": {
+            "syntax": "<number> | <percentage> | none"
+        },
+        "color-mix()": {
+            "syntax": "color-mix( <color-interpolation-method> , [ <color> && <percentage [0,100]>? ]#{2} )"
+        },
+        "color-interpolation-method": {
+            "syntax": "in [ <rectangular-color-space> | <polar-color-space> <hue-interpolation-method>? | <custom-color-space> ]"
+        },
+        "color-space": {
+            "syntax": "<rectangular-color-space> | <polar-color-space> | <custom-color-space>"
+        },
+        "custom-color-space": {
+            "syntax": "<dashed-ident>"
         },
         "paint": {
             "comment": "used by SVG https://www.w3.org/TR/SVG/painting.html#SpecifyingPaint",
             "syntax": "none | <color> | <url> [ none | <color> ]? | context-fill | context-stroke"
         },
+        "palette-identifier": {
+            "comment": "<palette-identifier> is parsed as a <dashed-ident> (https://drafts.csswg.org/css-fonts/#typedef-font-palette-palette-identifier)",
+            "syntax": "<dashed-ident>"
+        },
         "right": {
             "comment": "missed; not sure we should add it, but no others except `shape` is using it so it's ok for now; https://drafts.fxtf.org/css-masking-1/#funcdef-clip-rect",
             "syntax": "<length> | auto"
@@ -651,16 +743,59 @@
             "comment": "missed spaces in function body and add backwards compatible syntax",
             "syntax": "rect( <top>, <right>, <bottom>, <left> ) | rect( <top> <right> <bottom> <left> )"
         },
-        "scroll-timeline-axis": {
-            "comment": "missed definition",
-            "syntax": "block | inline | vertical | horizontal"
+        "scope-start": {
+            "syntax": "<forgiving-selector-list>"
         },
-        "scroll-timeline-name": {
-            "comment": "missed definition",
-            "references": [
-                "https://w3c.github.io/csswg-drafts/scroll-animations/#propdef-scroll-timeline-name"
-            ],
-            "syntax": "none | <custom-ident>"
+        "scope-end": {
+            "syntax": "<forgiving-selector-list>"
+        },
+        "forgiving-selector-list": {
+            "syntax": "<complex-real-selector-list>"
+        },
+        "forgiving-relative-selector-list": {
+            "syntax": "<relative-real-selector-list>"
+        },
+        "selector-list": {
+            "syntax": "<complex-selector-list>"
+        },
+        "complex-real-selector-list": {
+            "syntax": "<complex-real-selector>#"
+        },
+        "simple-selector-list": {
+            "syntax": "<simple-selector>#"
+        },
+        "relative-real-selector-list": {
+            "syntax": "<relative-real-selector>#"
+        },
+        "complex-selector": {
+            "syntax": "<complex-selector-unit> [ <combinator>? <complex-selector-unit> ]*"
+        },
+        "complex-selector-unit": {
+            "syntax": "[ <compound-selector>? <pseudo-compound-selector>* ]!"
+        },
+        "complex-real-selector": {
+            "syntax": "<compound-selector> [ <combinator>? <compound-selector> ]*"
+        },
+        "relative-real-selector": {
+            "syntax": "<combinator>? <complex-real-selector>"
+        },
+        "compound-selector": {
+            "syntax": "[ <type-selector>? <subclass-selector>* ]!"
+        },
+        "pseudo-compound-selector": {
+            "syntax": " <pseudo-element-selector> <pseudo-class-selector>*"
+        },
+        "simple-selector": {
+            "syntax": "<type-selector> | <subclass-selector>"
+        },
+        "combinator": {
+            "syntax": "'>' | '+' | '~' | [ '|' '|' ]"
+        },
+        "pseudo-element-selector": {
+            "syntax": "':' <pseudo-class-selector> | <legacy-pseudo-element-selector>"
+        },
+        "legacy-pseudo-element-selector": {
+            "syntax": " ':' [before | after | first-line | first-letter]"
         },
         "single-animation-composition": {
             "comment": "missed definition",
@@ -718,8 +853,130 @@
         "number-one-or-greater": {
             "syntax": "<number [1,∞]>"
         },
+        "color()": {
+            "syntax": "color( <colorspace-params> [ / [ <alpha-value> | none ] ]? )"
+        },
+        "colorspace-params": {
+            "syntax": "[ <predefined-rgb-params> | <xyz-params>]"
+        },
+        "predefined-rgb-params": {
+            "syntax": "<predefined-rgb> [ <number> | <percentage> | none ]{3}"
+        },
+        "predefined-rgb": {
+            "syntax": "srgb | srgb-linear | display-p3 | a98-rgb | prophoto-rgb | rec2020"
+        },
+        "xyz-params": {
+            "syntax": "<xyz-space> [ <number> | <percentage> | none ]{3}"
+        },
+        "xyz-space": {
+            "syntax": "xyz | xyz-d50 | xyz-d65"
+        },
+        "oklab()": {
+            "comment": "https://www.w3.org/TR/css-color-4/#specifying-oklab-oklch",
+            "syntax": "oklab( [ <percentage> | <number> | none] [ <percentage> | <number> | none] [ <percentage> | <number> | none] [ / [<alpha-value> | none] ]? )"
+        },
+        "oklch()": {
+            "comment": "https://www.w3.org/TR/css-color-4/#specifying-oklab-oklch",
+            "syntax": "oklch( [ <percentage> | <number> | none] [ <percentage> | <number> | none] [ <hue> | none] [ / [<alpha-value> | none] ]? )"
+        },
+        "offset-path": {
+            "syntax": "<ray()> | <url> | <basic-shape>"
+        },
+        "basic-shape": {
+            "syntax": "<inset()> | <xywh()> | <rect()> | <circle()> | <ellipse()> | <polygon()> | <path()>"
+        },
+        "rect()": {
+            "comment": "missed, https://drafts.csswg.org/css-shapes/#supported-basic-shapes",
+            "syntax": "rect( [ <length-percentage> | auto ]{4} [ round <'border-radius'> ]? )"
+        },
+        "xywh()": {
+            "comment": "missed, https://drafts.csswg.org/css-shapes/#supported-basic-shapes",
+            "syntax": "xywh( <length-percentage>{2} <length-percentage [0,∞]>{2} [ round <'border-radius'> ]? )"
+        },
+        "query-in-parens": {
+            "comment": "missed, https://drafts.csswg.org/css-contain-3/#container-rule",
+            "syntax": "( <container-condition> ) | ( <size-feature> ) | style( <style-query> ) | <general-enclosed>"
+        },
+        "size-feature": {
+            "comment": "missed, https://drafts.csswg.org/css-contain-3/#typedef-size-feature",
+            "syntax": "<mf-plain> | <mf-boolean> | <mf-range>"
+        },
+        "style-feature": {
+            "comment": "missed, https://drafts.csswg.org/css-contain-3/#typedef-style-feature",
+            "syntax": "<declaration>"
+        },
+        "style-query": {
+            "comment": "missed, https://drafts.csswg.org/css-contain-3/#container-rule",
+            "syntax": "<style-condition> | <style-feature>"
+        },
+        "style-condition": {
+            "comment": "missed, https://drafts.csswg.org/css-contain-3/#container-rule",
+            "syntax": "not <style-in-parens> | <style-in-parens> [ [ and <style-in-parens> ]* | [ or <style-in-parens> ]* ]"
+        },
+        "style-in-parens": {
+            "comment": "missed, https://drafts.csswg.org/css-contain-3/#container-rule",
+            "syntax": "( <style-condition> ) | ( <style-feature> ) | <general-enclosed>"
+        },
         "-non-standard-display": {
             "syntax": "-ms-inline-flexbox | -ms-grid | -ms-inline-grid | -webkit-flex | -webkit-inline-flex | -webkit-box | -webkit-inline-box | -moz-inline-stack | -moz-box | -moz-inline-box"
+        },
+        "inset-area": {
+            "syntax": "[ [ left | center | right | span-left | span-right | x-start | x-end | span-x-start | span-x-end | x-self-start | x-self-end | span-x-self-start | span-x-self-end | span-all ] || [ top | center | bottom | span-top | span-bottom | y-start | y-end | span-y-start | span-y-end | y-self-start | y-self-end | span-y-self-start | span-y-self-end | span-all ] | [ block-start | center | block-end | span-block-start | span-block-end | span-all ] || [ inline-start | center | inline-end | span-inline-start | span-inline-end | span-all ] | [ self-block-start | self-block-end | span-self-block-start | span-self-block-end | span-all ] || [ self-inline-start | self-inline-end | span-self-inline-start | span-self-inline-end | span-all ] | [ start | center | end | span-start | span-end | span-all ]{1,2} | [ self-start | center | self-end | span-self-start | span-self-end | span-all ]{1,2} ]",
+            "comment": "initial name for <position-area> before renamed",
+            "references": [
+                "https://www.w3.org/TR/css-anchor-position-1/#inset-area"
+            ]
+        },
+        "position-area": {
+            "syntax": "[ [ left | center | right | span-left | span-right | x-start | x-end | span-x-start | span-x-end | x-self-start | x-self-end | span-x-self-start | span-x-self-end | span-all ] || [ top | center | bottom | span-top | span-bottom | y-start | y-end | span-y-start | span-y-end | y-self-start | y-self-end | span-y-self-start | span-y-self-end | span-all ] | [ block-start | center | block-end | span-block-start | span-block-end | span-all ] || [ inline-start | center | inline-end | span-inline-start | span-inline-end | span-all ] | [ self-block-start | center | self-block-end | span-self-block-start | span-self-block-end | span-all ] || [ self-inline-start | center | self-inline-end | span-self-inline-start | span-self-inline-end | span-all ] | [ start | center | end | span-start | span-end | span-all ]{1,2} | [ self-start | center | self-end | span-self-start | span-self-end | span-all ]{1,2} ]",
+            "comment": "replaced <inset-area>",
+            "references": [
+                "https://drafts.csswg.org/css-anchor-position-1/#typedef-position-area"
+            ]
+        },
+        "anchor()": {
+            "syntax": "anchor( <anchor-element>? && <anchor-side>, <length-percentage>? )",
+            "comment": "missed",
+            "references": [
+                "https://drafts.csswg.org/css-anchor-position-1/#anchor-pos"
+            ]
+        },
+        "anchor-side": {
+            "syntax": "inside | outside | top | left | right | bottom | start | end | self-start | self-end | <percentage> | center"
+        },
+        "anchor-size()": {
+            "syntax": "anchor-size( [ <anchor-element> || <anchor-size> ]? , <length-percentage>? )",
+            "comment": "missed",
+            "references": [
+                "https://drafts.csswg.org/css-anchor-position-1/#funcdef-anchor-size"
+            ]
+        },
+        "anchor-size": {
+            "syntax": "width | height | block | inline | self-block | self-inline"
+        },
+        "anchor-element": {
+            "syntax": "<dashed-ident>",
+            "comment": "missed, https://drafts.csswg.org/css-anchor-position-1/#typedef-anchor-element"
+        },
+        "try-size": {
+            "syntax": "most-width | most-height | most-block-size | most-inline-size",
+            "comment": "missed, https://drafts.csswg.org/css-anchor-position-1/#typedef-try-size"
+        },
+        "try-tactic": {
+            "syntax": "flip-block || flip-inline || flip-start",
+            "comment": "missed, https://drafts.csswg.org/css-anchor-position-1/#typedef-position-try-fallbacks-try-tactic"
+        },
+        "font-variant-css2": {
+            "syntax": "normal | small-caps",
+            "comment": "new definition on font-4, https://drafts.csswg.org/css-fonts-4/#font-variant-css21-values"
+        },
+        "font-width-css3": {
+            "syntax": "normal | ultra-condensed | extra-condensed | condensed | semi-condensed | semi-expanded | expanded | extra-expanded | ultra-expanded",
+            "comment": "new definition on font-4, https://drafts.csswg.org/css-fonts-4/#font-width-css3-values"
+        },
+        "system-family-name": {
+            "syntax": "caption | icon | menu | message-box | small-caption | status-bar",
+            "comment": "new definition on font-4, https://drafts.csswg.org/css-fonts-4/#system-family-name-value"
         }
     }
 }
diff -pruN 2.3.1-1/debian/changelog 3.1.0-1/debian/changelog
--- 2.3.1-1/debian/changelog	2023-09-30 16:35:53.000000000 +0000
+++ 3.1.0-1/debian/changelog	2025-08-14 12:38:41.000000000 +0000
@@ -1,3 +1,11 @@
+node-css-tree (3.1.0-1) unstable; urgency=medium
+
+  * Team upload
+  * Declare compliance with policy 4.7.2
+  * New upstream version 3.1.0
+
+ -- Yadd <yadd@debian.org>  Thu, 14 Aug 2025 14:38:41 +0200
+
 node-css-tree (2.3.1-1) unstable; urgency=medium
 
   * Team upload
diff -pruN 2.3.1-1/debian/control 3.1.0-1/debian/control
--- 2.3.1-1/debian/control	2023-09-30 16:35:53.000000000 +0000
+++ 3.1.0-1/debian/control	2025-08-14 12:31:48.000000000 +0000
@@ -14,7 +14,7 @@ Build-Depends:
  , node-mdn-data (>= 2.0.28~)
  , node-source-map-js
  , rollup
-Standards-Version: 4.6.1
+Standards-Version: 4.7.2
 Vcs-Browser: https://salsa.debian.org/js-team/node-css-tree
 Vcs-Git: https://salsa.debian.org/js-team/node-css-tree.git
 Homepage: https://github.com/csstree/csstree
diff -pruN 2.3.1-1/docs/ast.md 3.1.0-1/docs/ast.md
--- 2.3.1-1/docs/ast.md	2022-12-14 17:31:12.000000000 +0000
+++ 3.1.0-1/docs/ast.md	2024-12-06 17:25:18.000000000 +0000
@@ -23,14 +23,20 @@ Interactively explore the AST with [AST
     - [ClassSelector](#classselector)
     - [Combinator](#combinator)
     - [Comment](#comment)
+    - [Condition](#condition)
     - [Declaration](#declaration)
     - [DeclarationList](#declarationlist)
     - [Dimension](#dimension)
+    - [Feature](#feature)
+    - [FeatureFunction](#featurefunction)
+    - [FeatureRange](#featurerange)
     - [Function](#function)
+    - [GeneralEnclosed](#generalenclosed)
     - [Hash](#hash)
     - [IdSelector](#idselector)
     - [Identifier](#identifier)
-    - [MediaFeature](#mediafeature)
+    - [Layer](#layer)
+    - [LayerList](#layerlist)
     - [MediaQuery](#mediaquery)
     - [MediaQueryList](#mediaquerylist)
     - [NestingSelector](#nestingselector)
@@ -44,10 +50,12 @@ Interactively explore the AST with [AST
     - [Ratio](#ratio)
     - [Raw](#raw)
     - [Rule](#rule)
+    - [Scope](#scope)
     - [Selector](#selector)
     - [SelectorList](#selectorlist)
     - [String](#string)
     - [StyleSheet](#stylesheet)
+    - [SupportsDeclaration](#supportsdeclaration)
     - [TypeSelector](#typeselector)
     - [UnicodeRange](#unicoderange)
     - [Url](#url)
@@ -183,11 +191,11 @@ Most node types always store an instance
 
 Used for [the An+B microsyntax](https://drafts.csswg.org/css-syntax/#anb-microsyntax).
 
-```js
-{
-    type: "AnPlusB",
-    a: String | null,
-    b: String | null
+```ts
+type AnPlusB = {
+    type: "AnPlusB";
+    a: string | null;
+    b: string | null;
 }
 ```
 
@@ -195,273 +203,340 @@ Used for [the An+B microsyntax](https://
 
 ### Atrule
 
-```js
-{
-    type: "Atrule",
-    name: String,
-    prelude: <AtrulePrelude> | <Raw> | null,
-    block: <Block> | null
+```ts
+type Atrule = {
+    type: "Atrule";
+    name: string;
+    prelude: AtrulePrelude | Raw | null;
+    block: Block | null;
 }
 ```
 
 ### AtrulePrelude
 
-```js
-{
-    type: "AtrulePrelude",
-    children: List
+```ts
+type AtrulePrelude = {
+    type: "AtrulePrelude";
+    children: List<any>;
 }
 ```
 
 ### AttributeSelector
 
-```js
-{
-    type: "AttributeSelector",
-    name: <Identifier>,
-    matcher: String | null,
-    value: <String> | <Identifier> | null,
-    flags: String | null
+```ts
+type AttributeSelector = {
+    type: "AttributeSelector";
+    name: Identifier;
+    matcher: string | null;
+    value: String | Identifier | null;
+    flags: string | null;
 }
 ```
 
 ### Block
 
-```js
-{
-    type: "Block",
-    children: List
+```ts
+type Block = {
+    type: "Block";
+    children: List<Atrule | Rule | Declaration>;
 }
 ```
 
 ### Brackets
 
-```js
-{
-    type: "Brackets",
-    children: List
+```ts
+type Brackets = {
+    type: "Brackets";
+    children: List<any>;
 }
 ```
 
 ### CDC
 
-```js
-{
-    type: "CDC"
+```ts
+type CDC = {
+    type: "CDC";
 }
 ```
 
 ### CDO
 
-```js
-{
-    type: "CDO"
+```ts
+type CDO = {
+    type: "CDO";
 }
 ```
 
 ### ClassSelector
 
-```js
-{
-    type: "ClassSelector",
-    name: String
+```ts
+type ClassSelector = {
+    type: "ClassSelector";
+    name: string;
 }
 ```
 
 ### Combinator
 
-```js
-{
-    type: "Combinator",
-    name: String
+```ts
+type Combinator = {
+    type: "Combinator";
+    name: string;
 }
 ```
 
 ### Comment
 
-```js
-{
-    type: "Comment",
-    value: String
+```ts
+type Comment = {
+    type: "Comment";
+    value: string;
+}
+```
+
+### Condition
+
+```ts
+type Condition = {
+    type: "Condition";
+    kind: string;
+    children: List<Identifier | Feature | FeatureFunction | FeatureRange | SupportsDeclaration>;
 }
 ```
 
 ### Declaration
 
-```js
-{
-    type: "Declaration",
-    important: Boolean | String,
-    property: String,
-    value: <Value> | <Raw>
+```ts
+type Declaration = {
+    type: "Declaration";
+    important: boolean | string;
+    property: string;
+    value: Value | Raw;
 }
 ```
 
 ### DeclarationList
 
-```js
-{
-    type: "DeclarationList",
-    children: List
+```ts
+type DeclarationList = {
+    type: "DeclarationList";
+    children: List<Declaration | Atrule | Rule>;
 }
 ```
 
 ### Dimension
 
-```js
-{
-    type: "Dimension",
-    value: String,
-    unit: String
+```ts
+type Dimension = {
+    type: "Dimension";
+    value: string;
+    unit: string;
+}
+```
+
+### Feature
+
+```ts
+type Feature = {
+    type: "Feature";
+    kind: string;
+    name: string;
+    value: Identifier | Number | Dimension | Ratio | Function | null;
+}
+```
+
+### FeatureFunction
+
+```ts
+type FeatureFunction = {
+    type: "FeatureFunction";
+    kind: string;
+    feature: string;
+    value: Declaration | Selector;
+}
+```
+
+### FeatureRange
+
+```ts
+type FeatureRange = {
+    type: "FeatureRange";
+    kind: string;
+    left: Identifier | Number | Dimension | Ratio | Function;
+    leftComparison: string;
+    middle: Identifier | Number | Dimension | Ratio | Function;
+    rightComparison: string | null;
+    right: Identifier | Number | Dimension | Ratio | Function | null;
 }
 ```
 
 ### Function
 
-```js
-{
-    type: "Function",
-    name: String,
-    children: List
+```ts
+type Function = {
+    type: "Function";
+    name: string;
+    children: List<any>;
+}
+```
+
+### GeneralEnclosed
+
+```ts
+type GeneralEnclosed = {
+    type: "GeneralEnclosed";
+    kind: string;
+    function: string | null;
+    children: List<any>;
 }
 ```
 
 ### Hash
 
-```js
-{
-    type: "Hash",
-    value: String
+```ts
+type Hash = {
+    type: "Hash";
+    value: string;
 }
 ```
 
 ### IdSelector
 
-```js
-{
-    type: "IdSelector",
-    name: String
+```ts
+type IdSelector = {
+    type: "IdSelector";
+    name: string;
 }
 ```
 
 ### Identifier
 
-```js
-{
-    type: "Identifier",
-    name: String
+```ts
+type Identifier = {
+    type: "Identifier";
+    name: string;
 }
 ```
 
-### MediaFeature
+### Layer
 
-```js
-{
-    type: "MediaFeature",
-    name: String,
-    value: <Identifier> | <Number> | <Dimension> | <Ratio> | null
+```ts
+type Layer = {
+    type: "Layer";
+    name: string;
+}
+```
+
+### LayerList
+
+```ts
+type LayerList = {
+    type: "LayerList";
+    children: List<Layer>;
 }
 ```
 
 ### MediaQuery
 
-```js
-{
-    type: "MediaQuery",
-    children: List
+```ts
+type MediaQuery = {
+    type: "MediaQuery";
+    modifier: string | null;
+    mediaType: string | null;
+    condition: Condition | null;
 }
 ```
 
 ### MediaQueryList
 
-```js
-{
-    type: "MediaQueryList",
-    children: List
+```ts
+type MediaQueryList = {
+    type: "MediaQueryList";
+    children: List<MediaQuery>;
 }
 ```
 
 ### NestingSelector
 
-```js
-{
-    type: "NestingSelector"
+```ts
+type NestingSelector = {
+    type: "NestingSelector";
 }
 ```
 
 ### Nth
 
-```js
-{
-    type: "Nth",
-    nth: <AnPlusB> | <Identifier>,
-    selector: <SelectorList> | null
+```ts
+type Nth = {
+    type: "Nth";
+    nth: AnPlusB | Identifier;
+    selector: SelectorList | null;
 }
 ```
 
 ### Number
 
-```js
-{
-    type: "Number",
-    value: String
+```ts
+type Number = {
+    type: "Number";
+    value: string;
 }
 ```
 
 ### Operator
 
-```js
-{
-    type: "Operator",
-    value: String
+```ts
+type Operator = {
+    type: "Operator";
+    value: string;
 }
 ```
 
 ### Parentheses
 
-```js
-{
-    type: "Parentheses",
-    children: List
+```ts
+type Parentheses = {
+    type: "Parentheses";
+    children: List<any>;
 }
 ```
 
 ### Percentage
 
-```js
-{
-    type: "Percentage",
-    value: String
+```ts
+type Percentage = {
+    type: "Percentage";
+    value: string;
 }
 ```
 
 ### PseudoClassSelector
 
-```js
-{
-    type: "PseudoClassSelector",
-    name: String,
-    children: List | null
+```ts
+type PseudoClassSelector = {
+    type: "PseudoClassSelector";
+    name: string;
+    children: List<Raw> | null;
 }
 ```
 
 ### PseudoElementSelector
 
-```js
-{
-    type: "PseudoElementSelector",
-    name: String,
-    children: List | null
+```ts
+type PseudoElementSelector = {
+    type: "PseudoElementSelector";
+    name: string;
+    children: List<Raw> | null;
 }
 ```
 
 ### Ratio
 
-```js
-{
-    type: "Ratio",
-    left: String,
-    right: String
+```ts
+type Ratio = {
+    type: "Ratio";
+    left: Number | Function;
+    right: Number | Function | null;
 }
 ```
 
@@ -469,38 +544,48 @@ Used for [the An+B microsyntax](https://
 
 A sequence of any characters. This node type is used for unparsed fragments of CSS, e.g. due to parse error or parser settings, and for quirk parts like content of some functions, such as `url()` or `expression()`.
 
-```js
-{
-    type: "Raw",
-    value: String
+```ts
+type Raw = {
+    type: "Raw";
+    value: string;
 }
 ```
 
 ### Rule
 
-```js
-{
-    type: "Rule",
-    prelude: <SelectorList> | <Raw>,
-    block: <Block>
+```ts
+type Rule = {
+    type: "Rule";
+    prelude: SelectorList | Raw;
+    block: Block;
+}
+```
+
+### Scope
+
+```ts
+type Scope = {
+    type: "Scope";
+    root: SelectorList | Raw | null;
+    limit: SelectorList | Raw | null;
 }
 ```
 
 ### Selector
 
-```js
-{
-    type: "Selector",
-    children: List
+```ts
+type Selector = {
+    type: "Selector";
+    children: List<TypeSelector | IdSelector | ClassSelector | AttributeSelector | PseudoClassSelector | PseudoElementSelector | Combinator>;
 }
 ```
 
 ### SelectorList
 
-```js
-{
-    type: "SelectorList",
-    children: List
+```ts
+type SelectorList = {
+    type: "SelectorList";
+    children: List<Selector | Raw>;
 }
 ```
 
@@ -508,28 +593,37 @@ A sequence of any characters. This node
 
 A sequence of characters enclosed in double quotes or single quotes.
 
-```js
-{
-    type: "String",
-    value: String
+```ts
+type String = {
+    type: "String";
+    value: string;
 }
 ```
 
 ### StyleSheet
 
-```js
-{
-    type: "StyleSheet",
-    children: List
+```ts
+type StyleSheet = {
+    type: "StyleSheet";
+    children: List<Comment | CDO | CDC | Atrule | Rule | Raw>;
+}
+```
+
+### SupportsDeclaration
+
+```ts
+type SupportsDeclaration = {
+    type: "SupportsDeclaration";
+    declaration: Declaration;
 }
 ```
 
 ### TypeSelector
 
-```js
-{
-    type: "TypeSelector",
-    name: String
+```ts
+type TypeSelector = {
+    type: "TypeSelector";
+    name: string;
 }
 ```
 
@@ -537,28 +631,28 @@ A sequence of characters enclosed in dou
 
 Used for [the Unicode-Range microsyntax](https://drafts.csswg.org/css-syntax/#urange).
 
-```js
-{
-    type: "UnicodeRange",
-    value: String
+```ts
+type UnicodeRange = {
+    type: "UnicodeRange";
+    value: string;
 }
 ```
 
 ### Url
 
-```js
-{
-    type: "Url",
-    value: String
+```ts
+type Url = {
+    type: "Url";
+    value: string;
 }
 ```
 
 ### Value
 
-```js
-{
-    type: "Value",
-    children: List
+```ts
+type Value = {
+    type: "Value";
+    children: List<any>;
 }
 ```
 
@@ -566,10 +660,10 @@ Used for [the Unicode-Range microsyntax]
 
 A sequence of one or more white spaces, i.e. ` ` (space), `\t`, `\r`, `\n` and `\f`.
 
-```js
-{
-    type: "WhiteSpace",
-    value: String
+```ts
+type WhiteSpace = {
+    type: "WhiteSpace";
+    value: string;
 }
 ```
 
diff -pruN 2.3.1-1/docs/generate.md 3.1.0-1/docs/generate.md
--- 2.3.1-1/docs/generate.md	2022-12-14 17:31:12.000000000 +0000
+++ 3.1.0-1/docs/generate.md	2024-12-06 17:25:18.000000000 +0000
@@ -20,6 +20,7 @@ Options (optional):
 
 - [sourceMap](#sourcemap)
 - [decorator](#decorator)
+- [mode](#mode)
 
 <!-- /MarkdownTOC -->
 
@@ -52,7 +53,7 @@ A function that returns handlers used by
 ### mode
 
 Type: `"spec"` or `"safe"`  
-Default: `"spec"`
+Default: `"safe"`
 
 CSS Syntax Module defines [rules for CSS serialization](https://www.w3.org/TR/css-syntax-3/#serialization) that it must "round-trip" with parsing. The generator follows these rules and determines itself when to output the space to avoid unintended CSS tokens combining. However, some older browsers fail to parse the resulting CSS because they didn't follow the spec in some cases. For this reason, the generator supports two modes:
 
@@ -72,4 +73,4 @@ console.log(generate(ast));
 // spec mode
 console.log(generate(ast, { mode: 'spec' }));
 // a{border:calc(1px)solid#ff0000}
-```
\ No newline at end of file
+```
diff -pruN 2.3.1-1/docs/list.md 3.1.0-1/docs/list.md
--- 2.3.1-1/docs/list.md	1970-01-01 00:00:00.000000000 +0000
+++ 3.1.0-1/docs/list.md	2024-12-06 17:25:18.000000000 +0000
@@ -0,0 +1,534 @@
+# List Class
+
+The `List` class is a fundamental data structure in CSSTree, used to represent the children of AST nodes. It provides a performant way to manipulate nodes during CSS parsing and transformation by avoiding the overhead of growing arrays and reducing common mistakes when modifying a list while iterating over it.
+
+## Table of Contents
+
+- [Introduction](#introduction)
+- [List Structure](#list-structure)
+- [List Items vs. Data](#list-items-vs-data)
+- [Usage Examples](#usage-examples)
+- [API Reference](#api-reference)
+  - [Static Methods](#static-methods)
+  - [Instance Methods](#instance-methods)
+  - [Properties](#properties)
+- [Conversion Methods](#conversion-methods)
+- [Traversal Methods](#traversal-methods)
+- [Mutation Methods](#mutation-methods)
+- [Array Compatibility](#array-compatibility)
+- [Serialization](#serialization)
+
+## Introduction
+
+The `List` class implements a doubly linked list specifically optimized for AST node manipulation within CSSTree. By using a linked list instead of an array, it ensures efficient insertions and deletions without the need for memory reallocation or shifting elements, which can be costly with large AST.
+
+This data structure is particularly useful when traversing and modifying the AST, as it helps avoid common pitfalls such as altering the collection while iterating over it.
+
+## List Structure
+
+The `List` is a doubly linked list where each element (item) contains references to its previous and next items, as well as the data (node) it holds.
+
+```
+                             List
+                           ┌──────┐
+            ┌──────────────┼─head │
+            │              │ tail─┼──────────────┐
+            │              └──────┘              │
+            ▼                                    ▼
+           Item        Item        Item        Item
+         ┌──────┐    ┌──────┐    ┌──────┐    ┌──────┐
+ null ◀──┼─prev │◀───┼─prev │◀───┼─prev │◀───┼─prev │
+         │ next─┼───▶│ next─┼───▶│ next─┼───▶│ next─┼──▶ null
+         ├──────┤    ├──────┤    ├──────┤    ├──────┤
+         │ data │    │ data │    │ data │    │ data │
+         └──────┘    └──────┘    └──────┘    └──────┘
+```
+
+## List Items vs. Data
+
+In the `List` class, each node of the list is called an **item**, which contains:
+
+- `prev`: Reference to the previous item.
+- `next`: Reference to the next item.
+- `data`: The actual data (AST node).
+
+It's crucial to understand the distinction between the **item** and the **data** it holds. When manipulating the list, operations often involve items, especially when inserting or removing elements.
+
+## Usage Examples
+
+### Traversing and Modifying the List
+
+When using CSSTree's `walk()` function to traverse the AST, you interact with `List` instances:
+
+```js
+csstree.walk(ast, function(node, item, list) {
+  // node: the current AST node (item.data)
+  // item: the current list item
+  // list: the list containing the item
+
+  // Remove the current node
+  list.remove(item);
+
+  // Insert a new node before the current item
+  const newItem = List.createItem(newNode);
+  list.insert(newItem, item);
+
+  // Alternatively, insert data directly
+  list.insertData(newNode, item);
+
+  // Insert a node after the current item
+  list.insert(List.createItem(anotherNode), item.next);
+});
+```
+
+## API Reference
+
+### Static Methods
+
+#### `List.createItem(data)`
+
+Creates a new list item containing the provided data.
+
+- **Parameters:**
+  - `data`: The data to store in the item.
+- **Returns:** A new list item.
+
+```js
+const item = List.createItem(node);
+```
+
+### Instance Methods
+
+#### `constructor()`
+
+Initializes a new empty `List`.
+
+```js
+const list = new List();
+```
+
+#### `createItem(data)`
+
+Instance method to create a new list item.
+
+- **Parameters:**
+  - `data`: The data to store in the item.
+- **Returns:** A new list item.
+
+```js
+const item = list.createItem(node);
+```
+
+#### `[Symbol.iterator]()`
+
+Allows the list to be iterable using `for...of` loops.
+
+```js
+for (const node of list) {
+  console.log(node);
+}
+```
+
+### Properties
+
+#### `size`
+
+Returns the number of items in the list.
+
+- **Type:** `number`
+
+```js
+console.log(list.size); // Outputs the size of the list
+```
+
+#### `isEmpty`
+
+Checks if the list is empty.
+
+- **Type:** `boolean`
+
+```js
+if (list.isEmpty) {
+  // The list is empty
+}
+```
+
+#### `first`
+
+Gets the data of the first item.
+
+- **Type:** Same as the data stored in the list.
+
+```js
+const firstNode = list.first;
+```
+
+#### `last`
+
+Gets the data of the last item.
+
+- **Type:** Same as the data stored in the list.
+
+```js
+const lastNode = list.last;
+```
+
+## Conversion Methods
+
+### `fromArray(array)`
+
+Populates the list with items created from the given array.
+
+- **Parameters:**
+  - `array`: An array of data elements.
+- **Returns:** The `List` instance (for chaining).
+
+```js
+list.fromArray([node1, node2, node3]);
+```
+
+### `toArray()`
+
+Converts the list to an array of data elements.
+
+- **Returns:** An array of the data in the list.
+
+```js
+const nodes = list.toArray();
+```
+
+### `toJSON()`
+
+Serializes the list to a JSON-compatible array.
+
+- **Returns:** An array suitable for JSON serialization.
+
+```js
+const jsonString = JSON.stringify(list);
+```
+
+## Traversal Methods
+
+### `forEach(fn, [thisArg])`
+
+Executes a function for each item in the list, from head to tail.
+
+- **Parameters:**
+  - `fn(data, item, list)`: Function to execute for each item.
+  - `thisArg` (optional): Value to use as `this` when executing `fn`.
+
+```js
+list.forEach((node, item, list) => {
+  console.log(node.type);
+});
+```
+
+### `forEachRight(fn, [thisArg])`
+
+Executes a function for each item in the list, from tail to head.
+
+```js
+list.forEachRight((node, item, list) => {
+  console.log(node.type);
+});
+```
+
+### `reduce(fn, initialValue, [thisArg])`
+
+Applies a function against an accumulator and each item to reduce it to a single value.
+
+- **Parameters:**
+  - `fn(accumulator, data, item, list)`: Function to execute on each item.
+  - `initialValue`: Initial value for the accumulator.
+  - `thisArg` (optional): Value to use as `this` when executing `fn`.
+
+```js
+const total = list.reduce((sum, node) => sum + node.value, 0);
+```
+
+### `reduceRight(fn, initialValue, [thisArg])`
+
+Same as `reduce`, but from tail to head.
+
+```js
+const total = list.reduceRight((sum, node) => sum + node.value, 0);
+```
+
+### `some(fn, [thisArg])`
+
+Tests whether at least one element in the list passes the test implemented by `fn`.
+
+- **Parameters:**
+  - `fn(data, item, list)`: Function to test for each element.
+  - `thisArg` (optional): Value to use as `this` when executing `fn`.
+- **Returns:** `true` if the callback returns a truthy value for any item; otherwise, `false`.
+
+```js
+const hasTypeA = list.some(node => node.type === 'TypeA');
+```
+
+### `map(fn, [thisArg])`
+
+Creates a new `List` with the results of calling a function on every element.
+
+- **Parameters:**
+  - `fn(data, item, list)`: Function that produces an element of the new list.
+  - `thisArg` (optional): Value to use as `this` when executing `fn`.
+- **Returns:** A new `List` instance.
+
+```js
+const mappedList = list.map(node => ({ ...node, value: node.value * 2 }));
+```
+
+### `filter(fn, [thisArg])`
+
+Creates a new `List` with all elements that pass the test implemented by `fn`.
+
+- **Parameters:**
+  - `fn(data, item, list)`: Function to test each element.
+  - `thisArg` (optional): Value to use as `this` when executing `fn`.
+- **Returns:** A new `List` instance.
+
+```js
+const filteredList = list.filter(node => node.isActive);
+```
+
+### `nextUntil(startItem, fn, [thisArg])`
+
+Iterates over the list starting from `startItem`, moving forward, until `fn` returns `true`.
+
+- **Parameters:**
+  - `startItem`: The item to start from.
+  - `fn(data, item, list)`: Function to execute for each item.
+  - `thisArg` (optional): Value to use as `this` when executing `fn`.
+
+```js
+list.nextUntil(someItem, (node, item) => {
+  if (node.type === 'StopType') return true;
+  // Process node
+});
+```
+
+### `prevUntil(startItem, fn, [thisArg])`
+
+Iterates over the list starting from `startItem`, moving backward, until `fn` returns `true`.
+
+```js
+list.prevUntil(someItem, (node, item) => {
+  if (node.type === 'StartType') return true;
+  // Process node
+});
+```
+
+## Mutation Methods
+
+### `clear()`
+
+Removes all items from the list.
+
+```js
+list.clear();
+```
+
+### `copy()`
+
+Creates a shallow copy of the list.
+
+- **Returns:** A new `List` instance.
+
+```js
+const newList = list.copy();
+```
+
+### `prepend(item)`
+
+Inserts an item at the beginning of the list.
+
+- **Parameters:**
+  - `item`: The item to prepend.
+
+```js
+const item = List.createItem(node);
+list.prepend(item);
+```
+
+### `prependData(data)`
+
+Creates a new item with the provided data and inserts it at the beginning.
+
+```js
+list.prependData(node);
+```
+
+### `append(item)`
+
+Inserts an item at the end of the list.
+
+```js
+const item = List.createItem(node);
+list.append(item);
+```
+
+### `appendData(data)`
+
+Creates a new item with the provided data and inserts it at the end.
+
+```js
+list.appendData(node);
+```
+
+### `insert(item, [before])`
+
+Inserts an item into the list before the specified item.
+
+- **Parameters:**
+  - `item`: The item to insert.
+  - `before` (optional): The item before which the new item will be inserted. If `null` or not provided, the item is appended to the end.
+
+```js
+const item = List.createItem(node);
+list.insert(item, existingItem);
+```
+
+### `insertData(data, [before])`
+
+Creates a new item with the provided data and inserts it before the specified item.
+
+```js
+list.insertData(node, existingItem);
+```
+
+### `remove(item)`
+
+Removes an item from the list.
+
+- **Parameters:**
+  - `item`: The item to remove.
+- **Returns:** The removed item.
+
+```js
+list.remove(existingItem);
+```
+
+### `push(data)`
+
+Appends data to the end of the list (alias for `appendData`).
+
+```js
+list.push(node);
+```
+
+### `pop()`
+
+Removes and returns the last item of the list.
+
+- **Returns:** The removed item, or `null` if the list is empty.
+
+```js
+const lastItem = list.pop();
+```
+
+### `unshift(data)`
+
+Prepends data to the beginning of the list (alias for `prependData`).
+
+```js
+list.unshift(node);
+```
+
+### `shift()`
+
+Removes and returns the first item of the list.
+
+- **Returns:** The removed item, or `null` if the list is empty.
+
+```js
+const firstItem = list.shift();
+```
+
+### `prependList(otherList)`
+
+Inserts all items from `otherList` at the beginning of the list.
+
+- **Parameters:**
+  - `otherList`: The list to prepend. After the operation, `otherList` will be empty.
+
+```js
+list.prependList(anotherList);
+```
+
+### `appendList(otherList)`
+
+Inserts all items from `otherList` at the end of the list.
+
+```js
+list.appendList(anotherList);
+```
+
+### `insertList(otherList, [before])`
+
+Inserts all items from `otherList` into the list before the specified item.
+
+- **Parameters:**
+  - `otherList`: The list to insert. After the operation, `otherList` will be empty.
+  - `before` (optional): The item before which to insert the new list.
+
+```js
+list.insertList(anotherList, existingItem);
+```
+
+### `replace(oldItem, newItemOrList)`
+
+Replaces `oldItem` with a new item or list.
+
+- **Parameters:**
+  - `oldItem`: The item to replace.
+  - `newItemOrList`: The new item or list to insert.
+
+**Example (with a single item):**
+
+```js
+const newItem = List.createItem(newNode);
+list.replace(oldItem, newItem);
+```
+
+**Example (with a list):**
+
+```js
+const newList = new List().fromArray([node1, node2]);
+list.replace(oldItem, newList);
+```
+
+## Array Compatibility
+
+The `List` class is compatible with arrays in many cases. It provides methods to convert to and from arrays, and implements iterable protocols.
+
+**Conversion to Array:**
+
+```js
+const array = list.toArray();
+```
+
+**Conversion from Array:**
+
+```js
+list.fromArray([node1, node2, node3]);
+```
+
+**Iteration using `for...of`:**
+
+```js
+for (const node of list) {
+  // Process node
+}
+```
+
+**Note:** Direct index access (e.g., `list[0]`) is not supported.
+
+## Serialization
+
+The `List` class implements `toJSON()`, allowing it to be serialized with `JSON.stringify()`.
+
+```js
+const jsonString = JSON.stringify(list);
+```
diff -pruN 2.3.1-1/docs/readme.md 3.1.0-1/docs/readme.md
--- 2.3.1-1/docs/readme.md	2022-12-14 17:31:12.000000000 +0000
+++ 3.1.0-1/docs/readme.md	2024-12-06 17:25:18.000000000 +0000
@@ -5,4 +5,5 @@
 - [Serialization AST → CSS](generate.md)
 - [AST traversal](traversal.md)
 - [Util functions](utils.md)
+- [List class](list.md)
 - [Working with definition syntax](definition-syntax.md)
diff -pruN 2.3.1-1/fixtures/ast/atrule/atrule/container.json 3.1.0-1/fixtures/ast/atrule/atrule/container.json
--- 2.3.1-1/fixtures/ast/atrule/atrule/container.json	1970-01-01 00:00:00.000000000 +0000
+++ 3.1.0-1/fixtures/ast/atrule/atrule/container.json	2024-12-06 17:25:18.000000000 +0000
@@ -0,0 +1,400 @@
+{
+    "query with a base feature": {
+        "source": "@container (min-inline-size: 150px) { selector {} }",
+        "generate": "@container (min-inline-size:150px){selector{}}",
+        "ast": {
+            "type": "Atrule",
+            "name": "container",
+            "prelude": {
+                "type": "AtrulePrelude",
+                "children": [
+                    {
+                        "type": "Condition",
+                        "kind": "container",
+                        "children": [
+                            {
+                                "type": "Feature",
+                                "kind": "container",
+                                "name": "min-inline-size",
+                                "value": {
+                                    "type": "Dimension",
+                                    "value": "150",
+                                    "unit": "px"
+                                }
+                            }
+                        ]
+                    }
+                ]
+            },
+            "block": {
+                "type": "Block",
+                "children": [
+                    {
+                        "type": "Rule",
+                        "prelude": {
+                            "type": "SelectorList",
+                            "children": [
+                                {
+                                    "type": "Selector",
+                                    "children": [
+                                        {
+                                            "type": "TypeSelector",
+                                            "name": "selector"
+                                        }
+                                    ]
+                                }
+                            ]
+                        },
+                        "block": {
+                            "type": "Block",
+                            "children": []
+                        }
+                    }
+                ]
+            }
+        }
+    },
+    "query with a range feature": {
+        "source": "@container (inline-size < 150px) { selector {} }",
+        "generate": "@container (inline-size<150px){selector{}}",
+        "ast": {
+            "type": "Atrule",
+            "name": "container",
+            "prelude": {
+                "type": "AtrulePrelude",
+                "children": [
+                    {
+                        "type": "Condition",
+                        "kind": "container",
+                        "children": [
+                            {
+                                "type": "FeatureRange",
+                                "kind": "container",
+                                "left": {
+                                    "type": "Identifier",
+                                    "name": "inline-size"
+                                },
+                                "leftComparison": "<",
+                                "middle": {
+                                    "type": "Dimension",
+                                    "value": "150",
+                                    "unit": "px"
+                                },
+                                "rightComparison": null,
+                                "right": null
+                            }
+                        ]
+                    }
+                ]
+            },
+            "block": {
+                "type": "Block",
+                "children": [
+                    {
+                        "type": "Rule",
+                        "prelude": {
+                            "type": "SelectorList",
+                            "children": [
+                                {
+                                    "type": "Selector",
+                                    "children": [
+                                        {
+                                            "type": "TypeSelector",
+                                            "name": "selector"
+                                        }
+                                    ]
+                                }
+                            ]
+                        },
+                        "block": {
+                            "type": "Block",
+                            "children": []
+                        }
+                    }
+                ]
+            }
+        }
+    },
+    "with a container name": {
+        "source": "@container my-layout (inline-size > 45em) { selector {} }",
+        "generate": "@container my-layout (inline-size>45em){selector{}}",
+        "ast": {
+            "type": "Atrule",
+            "name": "container",
+            "prelude": {
+                "type": "AtrulePrelude",
+                "children": [
+                    {
+                        "type": "Identifier",
+                        "name": "my-layout"
+                    },
+                    {
+                        "type": "Condition",
+                        "kind": "container",
+                        "children": [
+                            {
+                                "type": "FeatureRange",
+                                "kind": "container",
+                                "left": {
+                                    "type": "Identifier",
+                                    "name": "inline-size"
+                                },
+                                "leftComparison": ">",
+                                "middle": {
+                                    "type": "Dimension",
+                                    "value": "45",
+                                    "unit": "em"
+                                },
+                                "rightComparison": null,
+                                "right": null
+                            }
+                        ]
+                    }
+                ]
+            },
+            "block": {
+                "type": "Block",
+                "children": [
+                    {
+                        "type": "Rule",
+                        "prelude": {
+                            "type": "SelectorList",
+                            "children": [
+                                {
+                                    "type": "Selector",
+                                    "children": [
+                                        {
+                                            "type": "TypeSelector",
+                                            "name": "selector"
+                                        }
+                                    ]
+                                }
+                            ]
+                        },
+                        "block": {
+                            "type": "Block",
+                            "children": []
+                        }
+                    }
+                ]
+            }
+        }
+    },
+    "complex query": {
+        "source": "@container not ( ( a : 500px) and ( not ( b : 500px) ) ) {}",
+        "generate": "@container not ((a:500px) and (not (b:500px))){}",
+        "ast": {
+            "type": "Atrule",
+            "name": "container",
+            "prelude": {
+                "type": "AtrulePrelude",
+                "children": [
+                    {
+                        "type": "Condition",
+                        "kind": "container",
+                        "children": [
+                            {
+                                "type": "Identifier",
+                                "name": "not"
+                            },
+                            {
+                                "type": "Condition",
+                                "kind": "container",
+                                "children": [
+                                    {
+                                        "type": "Feature",
+                                        "kind": "container",
+                                        "name": "a",
+                                        "value": {
+                                            "type": "Dimension",
+                                            "value": "500",
+                                            "unit": "px"
+                                        }
+                                    },
+                                    {
+                                        "type": "Identifier",
+                                        "name": "and"
+                                    },
+                                    {
+                                        "type": "Condition",
+                                        "kind": "container",
+                                        "children": [
+                                            {
+                                                "type": "Identifier",
+                                                "name": "not"
+                                            },
+                                            {
+                                                "type": "Feature",
+                                                "kind": "container",
+                                                "name": "b",
+                                                "value": {
+                                                    "type": "Dimension",
+                                                    "value": "500",
+                                                    "unit": "px"
+                                                }
+                                            }
+                                        ]
+                                    }
+                                ]
+                            }
+                        ]
+                    }
+                ]
+            },
+            "block": {
+                "type": "Block",
+                "children": []
+            }
+        }
+    },
+    "style query": {
+        "source": "@container style(--cards: small){}",
+        "ast": {
+            "type": "Atrule",
+            "name": "container",
+            "prelude": {
+                "type": "AtrulePrelude",
+                "children": [
+                    {
+                        "type": "Condition",
+                        "kind": "container",
+                        "children": [
+                            {
+                                "type": "FeatureFunction",
+                                "kind": "container",
+                                "feature": "style",
+                                "value": {
+                                    "type": "Declaration",
+                                    "important": false,
+                                    "property": "--cards",
+                                    "value": {
+                                        "type": "Raw",
+                                        "value": " small"
+                                    }
+                                }
+                            }
+                        ]
+                    }
+                ]
+            },
+            "block": {
+                "type": "Block",
+                "children": []
+            }
+        }
+    },
+    "style query should case-insensitive": {
+        "source": "@container STYLE(--cards: small){}",
+        "ast": {
+            "type": "Atrule",
+            "name": "container",
+            "prelude": {
+                "type": "AtrulePrelude",
+                "children": [
+                    {
+                        "type": "Condition",
+                        "kind": "container",
+                        "children": [
+                            {
+                                "type": "FeatureFunction",
+                                "kind": "container",
+                                "feature": "STYLE",
+                                "value": {
+                                    "type": "Declaration",
+                                    "important": false,
+                                    "property": "--cards",
+                                    "value": {
+                                        "type": "Raw",
+                                        "value": " small"
+                                    }
+                                }
+                            }
+                        ]
+                    }
+                ]
+            },
+            "block": {
+                "type": "Block",
+                "children": []
+            }
+        }
+    },
+    "all together": {
+        "source": "@container card (inline-size > 30em) and style(--responsive: true) {}",
+        "generate": "@container card (inline-size>30em) and style(--responsive: true){}",
+        "ast": {
+            "type": "Atrule",
+            "name": "container",
+            "prelude": {
+                "type": "AtrulePrelude",
+                "children": [
+                    {
+                        "type": "Identifier",
+                        "name": "card"
+                    },
+                    {
+                        "type": "Condition",
+                        "kind": "container",
+                        "children": [
+                            {
+                                "type": "FeatureRange",
+                                "kind": "container",
+                                "left": {
+                                    "type": "Identifier",
+                                    "name": "inline-size"
+                                },
+                                "leftComparison": ">",
+                                "middle": {
+                                    "type": "Dimension",
+                                    "value": "30",
+                                    "unit": "em"
+                                },
+                                "rightComparison": null,
+                                "right": null
+                            },
+                            {
+                                "type": "Identifier",
+                                "name": "and"
+                            },
+                            {
+                                "type": "FeatureFunction",
+                                "kind": "container",
+                                "feature": "style",
+                                "value": {
+                                    "type": "Declaration",
+                                    "important": false,
+                                    "property": "--responsive",
+                                    "value": {
+                                        "type": "Raw",
+                                        "value": " true"
+                                    }
+                                }
+                            }
+                        ]
+                    }
+                ]
+            },
+            "block": {
+                "type": "Block",
+                "children": []
+            }
+        }
+    },
+    "error": [
+        {
+            "source": "@container '' {}",
+            "offset": "           ^",
+            "error": "Condition is expected"
+        },
+        {
+            "source": "@container 1 {}",
+            "offset": "           ^",
+            "error": "Condition is expected"
+        },
+        {
+            "source": "@container flex: 1 {}",
+            "offset": "               ^",
+            "error": "Condition is expected"
+        }
+    ]
+}
diff -pruN 2.3.1-1/fixtures/ast/atrule/atrule/import.json 3.1.0-1/fixtures/ast/atrule/atrule/import.json
--- 2.3.1-1/fixtures/ast/atrule/atrule/import.json	2022-12-14 17:31:12.000000000 +0000
+++ 3.1.0-1/fixtures/ast/atrule/atrule/import.json	2024-12-06 17:25:18.000000000 +0000
@@ -51,34 +51,30 @@
                         "children": [
                             {
                                 "type": "MediaQuery",
-                                "children": [
-                                    {
-                                        "type": "Identifier",
-                                        "name": "all"
-                                    }
-                                ]
+                                "modifier": null,
+                                "mediaType": "all",
+                                "condition": null
                             },
                             {
                                 "type": "MediaQuery",
-                                "children": [
-                                    {
-                                        "type": "Identifier",
-                                        "name": "screen"
-                                    },
-                                    {
-                                        "type": "Identifier",
-                                        "name": "and"
-                                    },
-                                    {
-                                        "type": "MediaFeature",
-                                        "name": "min-width",
-                                        "value": {
-                                            "type": "Dimension",
-                                            "value": "600",
-                                            "unit": "px"
+                                "modifier": null,
+                                "mediaType": "screen",
+                                "condition": {
+                                    "type": "Condition",
+                                    "kind": "media",
+                                    "children": [
+                                        {
+                                            "type": "Feature",
+                                            "kind": "media",
+                                            "name": "min-width",
+                                            "value": {
+                                                "type": "Dimension",
+                                                "value": "600",
+                                                "unit": "px"
+                                            }
                                         }
-                                    }
-                                ]
+                                    ]
+                                }
                             }
                         ]
                     }
@@ -105,15 +101,379 @@
                         "children": [
                             {
                                 "type": "MediaQuery",
+                                "modifier": null,
+                                "mediaType": "all",
+                                "condition": null
+                            }
+                        ]
+                    }
+                ]
+            },
+            "block": null
+        }
+    },
+    "with anonymous layer": {
+        "source": "@import url(test) layer;",
+        "generate": "@import url(test)layer;",
+        "ast": {
+            "type": "Atrule",
+            "name": "import",
+            "prelude": {
+                "type": "AtrulePrelude",
+                "children": [
+                    {
+                        "type": "Url",
+                        "value": "test"
+                    },
+                    {
+                        "type": "Identifier",
+                        "name": "layer"
+                    }
+                ]
+            },
+            "block": null
+        }
+    },
+    "with layer()": {
+        "source": "@import url(test) layer(foo);",
+        "generate": "@import url(test)layer(foo);",
+        "ast": {
+            "type": "Atrule",
+            "name": "import",
+            "prelude": {
+                "type": "AtrulePrelude",
+                "children": [
+                    {
+                        "type": "Url",
+                        "value": "test"
+                    },
+                    {
+                        "type": "Function",
+                        "name": "layer",
+                        "children": [
+                            {
+                                "type": "Layer",
+                                "name": "foo"
+                            }
+                        ]
+                    }
+                ]
+            },
+            "block": null
+        }
+    },
+    "with bad layer()": [
+        {
+            "source": "@import url(test) layer();",
+            "generate": "@import url(test)layer();",
+            "ast": {
+                "type": "Atrule",
+                "name": "import",
+                "prelude": {
+                    "type": "AtrulePrelude",
+                    "children": [
+                        {
+                            "type": "Url",
+                            "value": "test"
+                        },
+                        {
+                            "type": "Function",
+                            "name": "layer",
+                            "children": []
+                        }
+                    ]
+                },
+                "block": null
+            }
+        },
+        {
+            "source": "@import url(test) layer( 2px );",
+            "generate": "@import url(test)layer(2px);",
+            "ast": {
+                "type": "Atrule",
+                "name": "import",
+                "prelude": {
+                    "type": "AtrulePrelude",
+                    "children": [
+                        {
+                            "type": "Url",
+                            "value": "test"
+                        },
+                        {
+                            "type": "Function",
+                            "name": "layer",
+                            "children": [
+                                {
+                                    "type": "Raw",
+                                    "value": "2px"
+                                }
+                            ]
+                        }
+                    ]
+                },
+                "block": null
+            }
+        }
+    ],
+    "with supports(declaration)": {
+        "source": "@import url(test) supports(foo:1);",
+        "generate": "@import url(test)supports(foo:1);",
+        "ast": {
+            "type": "Atrule",
+            "name": "import",
+            "prelude": {
+                "type": "AtrulePrelude",
+                "children": [
+                    {
+                        "type": "Url",
+                        "value": "test"
+                    },
+                    {
+                        "type": "Function",
+                        "name": "supports",
+                        "children": [
+                            {
+                                "type": "Declaration",
+                                "important": false,
+                                "property": "foo",
+                                "value": {
+                                    "type": "Value",
+                                    "children": [
+                                        {
+                                            "type": "Number",
+                                            "value": "1"
+                                        }
+                                    ]
+                                }
+                            }
+                        ]
+                    }
+                ]
+            },
+            "block": null
+        }
+    },
+    "with supports(condition)": {
+        "source": "@import url(test) supports(not (foo:1));",
+        "generate": "@import url(test)supports(not (foo:1));",
+        "ast": {
+            "type": "Atrule",
+            "name": "import",
+            "prelude": {
+                "type": "AtrulePrelude",
+                "children": [
+                    {
+                        "type": "Url",
+                        "value": "test"
+                    },
+                    {
+                        "type": "Function",
+                        "name": "supports",
+                        "children": [
+                            {
+                                "type": "Condition",
+                                "kind": "supports",
                                 "children": [
                                     {
                                         "type": "Identifier",
-                                        "name": "all"
+                                        "name": "not"
+                                    },
+                                    {
+                                        "type": "SupportsDeclaration",
+                                        "declaration": {
+                                            "type": "Declaration",
+                                            "important": false,
+                                            "property": "foo",
+                                            "value": {
+                                                "type": "Value",
+                                                "children": [
+                                                    {
+                                                        "type": "Number",
+                                                        "value": "1"
+                                                    }
+                                                ]
+                                            }
+                                        }
                                     }
                                 ]
                             }
                         ]
                     }
+                ]
+            },
+            "block": null
+        }
+    },
+    "with bad supports()": [
+        {
+            "source": "@import url(test) supports();",
+            "generate": "@import url(test)supports();",
+            "ast": {
+                "type": "Atrule",
+                "name": "import",
+                "prelude": {
+                    "type": "AtrulePrelude",
+                    "children": [
+                        {
+                            "type": "Url",
+                            "value": "test"
+                        },
+                        {
+                            "type": "Function",
+                            "name": "supports",
+                            "children": []
+                        }
+                    ]
+                },
+                "block": null
+            }
+        },
+        {
+            "source": "@import url(test) supports(  2px  );",
+            "generate": "@import url(test)supports(2px);",
+            "ast": {
+                "type": "Atrule",
+                "name": "import",
+                "prelude": {
+                    "type": "AtrulePrelude",
+                    "children": [
+                        {
+                            "type": "Url",
+                            "value": "test"
+                        },
+                        {
+                            "type": "Function",
+                            "name": "supports",
+                            "children": [
+                                {
+                                    "type": "Raw",
+                                    "value": "2px"
+                                }
+                            ]
+                        }
+                    ]
+                },
+                "block": null
+            }
+        }
+    ],
+    "with layer & supports": {
+        "source": "@import url(test) layer(name) supports(foo:1);",
+        "generate": "@import url(test)layer(name) supports(foo:1);",
+        "ast": {
+            "type": "Atrule",
+            "name": "import",
+            "prelude": {
+                "type": "AtrulePrelude",
+                "children": [
+                    {
+                        "type": "Url",
+                        "value": "test"
+                    },
+                    {
+                        "type": "Function",
+                        "name": "layer",
+                        "children": [
+                            {
+                                "type": "Layer",
+                                "name": "name"
+                            }
+                        ]
+                    },
+                    {
+                        "type": "Function",
+                        "name": "supports",
+                        "children": [
+                            {
+                                "type": "Declaration",
+                                "important": false,
+                                "property": "foo",
+                                "value": {
+                                    "type": "Value",
+                                    "children": [
+                                        {
+                                            "type": "Number",
+                                            "value": "1"
+                                        }
+                                    ]
+                                }
+                            }
+                        ]
+                    }
+                ]
+            },
+            "block": null
+        }
+    },
+    "with layer & supports & media": {
+        "source": "@import url(test) layer(name) supports(foo:1) screen and (min-width: 100px);",
+        "generate": "@import url(test)layer(name) supports(foo:1) screen and (min-width:100px);",
+        "ast": {
+            "type": "Atrule",
+            "name": "import",
+            "prelude": {
+                "type": "AtrulePrelude",
+                "children": [
+                    {
+                        "type": "Url",
+                        "value": "test"
+                    },
+                    {
+                        "type": "Function",
+                        "name": "layer",
+                        "children": [
+                            {
+                                "type": "Layer",
+                                "name": "name"
+                            }
+                        ]
+                    },
+                    {
+                        "type": "Function",
+                        "name": "supports",
+                        "children": [
+                            {
+                                "type": "Declaration",
+                                "important": false,
+                                "property": "foo",
+                                "value": {
+                                    "type": "Value",
+                                    "children": [
+                                        {
+                                            "type": "Number",
+                                            "value": "1"
+                                        }
+                                    ]
+                                }
+                            }
+                        ]
+                    },
+                    {
+                        "type": "MediaQueryList",
+                        "children": [
+                            {
+                                "type": "MediaQuery",
+                                "modifier": null,
+                                "mediaType": "screen",
+                                "condition": {
+                                    "type": "Condition",
+                                    "kind": "media",
+                                    "children": [
+                                        {
+                                            "type": "Feature",
+                                            "kind": "media",
+                                            "name": "min-width",
+                                            "value": {
+                                                "type": "Dimension",
+                                                "value": "100",
+                                                "unit": "px"
+                                            }
+                                        }
+                                    ]
+                                }
+                            }
+                        ]
+                    }
                 ]
             },
             "block": null
diff -pruN 2.3.1-1/fixtures/ast/atrule/atrule/layer.json 3.1.0-1/fixtures/ast/atrule/atrule/layer.json
--- 2.3.1-1/fixtures/ast/atrule/atrule/layer.json	1970-01-01 00:00:00.000000000 +0000
+++ 3.1.0-1/fixtures/ast/atrule/atrule/layer.json	2024-12-06 17:25:18.000000000 +0000
@@ -0,0 +1,193 @@
+{
+    "anonymous layer": {
+        "source": "@layer;",
+        "ast": {
+            "type": "Atrule",
+            "name": "layer",
+            "prelude": null,
+            "block": null
+        }
+    },
+    "anonymous layer with block": {
+        "source": "@layer { selector {} }",
+        "generate": "@layer{selector{}}",
+        "ast": {
+            "type": "Atrule",
+            "loc": null,
+            "name": "layer",
+            "prelude": null,
+            "block": {
+                "type": "Block",
+                "loc": null,
+                "children": [
+                    {
+                        "type": "Rule",
+                        "loc": null,
+                        "prelude": {
+                            "type": "SelectorList",
+                            "loc": null,
+                            "children": [
+                                {
+                                    "type": "Selector",
+                                    "loc": null,
+                                    "children": [
+                                        {
+                                            "type": "TypeSelector",
+                                            "loc": null,
+                                            "name": "selector"
+                                        }
+                                    ]
+                                }
+                            ]
+                        },
+                        "block": {
+                            "type": "Block",
+                            "loc": null,
+                            "children": []
+                        }
+                    }
+                ]
+            }
+        }
+    },
+    "one layer name": {
+        "source": "@layer test;",
+        "ast": {
+            "type": "Atrule",
+            "name": "layer",
+            "prelude": {
+                "type": "AtrulePrelude",
+                "children": [
+                    {
+                        "type": "LayerList",
+                        "children": [
+                            {
+                                "type": "Layer",
+                                "name": "test"
+                            }
+                        ]
+                    }
+                ]
+            },
+            "block": null
+        }
+    },
+    "layer name with fullstop": {
+        "source": "@layer foo.bar;",
+        "ast": {
+            "type": "Atrule",
+            "name": "layer",
+            "prelude": {
+                "type": "AtrulePrelude",
+                "children": [
+                    {
+                        "type": "LayerList",
+                        "children": [
+                            {
+                                "type": "Layer",
+                                "name": "foo.bar"
+                            }
+                        ]
+                    }
+                ]
+            },
+            "block": null
+        }
+    },
+    "with a block": {
+        "source": "@layer test { selector {} }",
+        "generate": "@layer test{selector{}}",
+        "ast": {
+            "type": "Atrule",
+            "loc": null,
+            "name": "layer",
+            "prelude": {
+                "type": "AtrulePrelude",
+                "loc": null,
+                "children": [
+                    {
+                        "type": "LayerList",
+                        "loc": null,
+                        "children": [
+                            {
+                                "type": "Layer",
+                                "loc": null,
+                                "name": "test"
+                            }
+                        ]
+                    }
+                ]
+            },
+            "block": {
+                "type": "Block",
+                "loc": null,
+                "children": [
+                    {
+                        "type": "Rule",
+                        "loc": null,
+                        "prelude": {
+                            "type": "SelectorList",
+                            "loc": null,
+                            "children": [
+                                {
+                                    "type": "Selector",
+                                    "loc": null,
+                                    "children": [
+                                        {
+                                            "type": "TypeSelector",
+                                            "loc": null,
+                                            "name": "selector"
+                                        }
+                                    ]
+                                }
+                            ]
+                        },
+                        "block": {
+                            "type": "Block",
+                            "loc": null,
+                            "children": []
+                        }
+                    }
+                ]
+            }
+        }
+    },
+    "layer name list": {
+        "source": "@layer foo, foo.bar , foo.bar.baz;",
+        "generate": "@layer foo,foo.bar,foo.bar.baz;",
+        "ast": {
+            "type": "Atrule",
+            "name": "layer",
+            "prelude": {
+                "type": "AtrulePrelude",
+                "children": [
+                    {
+                        "type": "LayerList",
+                        "children": [
+                            {
+                                "type": "Layer",
+                                "name": "foo"
+                            },
+                            {
+                                "type": "Layer",
+                                "name": "foo.bar"
+                            },
+                            {
+                                "type": "Layer",
+                                "name": "foo.bar.baz"
+                            }
+                        ]
+                    }
+                ]
+            },
+            "block": null
+        }
+    },
+    "error": [
+        {
+            "source": "@layer foo . bar ;",
+            "offset": "           ^",
+            "error": "Semicolon or block is expected"
+        }
+    ]
+}
diff -pruN 2.3.1-1/fixtures/ast/atrule/atrule/media.json 3.1.0-1/fixtures/ast/atrule/atrule/media.json
--- 2.3.1-1/fixtures/ast/atrule/atrule/media.json	2022-12-14 17:31:12.000000000 +0000
+++ 3.1.0-1/fixtures/ast/atrule/atrule/media.json	2024-12-06 17:25:18.000000000 +0000
@@ -12,12 +12,9 @@
                         "children": [
                             {
                                 "type": "MediaQuery",
-                                "children": [
-                                    {
-                                        "type": "Identifier",
-                                        "name": "screen"
-                                    }
-                                ]
+                                "modifier": null,
+                                "mediaType": "screen",
+                                "condition": null
                             }
                         ]
                     }
@@ -42,16 +39,9 @@
                         "children": [
                             {
                                 "type": "MediaQuery",
-                                "children": [
-                                    {
-                                        "type": "Identifier",
-                                        "name": "not"
-                                    },
-                                    {
-                                        "type": "Identifier",
-                                        "name": "screen"
-                                    }
-                                ]
+                                "modifier": "not",
+                                "mediaType": "screen",
+                                "condition": null
                             }
                         ]
                     }
@@ -76,16 +66,136 @@
                         "children": [
                             {
                                 "type": "MediaQuery",
-                                "children": [
-                                    {
-                                        "type": "Identifier",
-                                        "name": "only"
-                                    },
-                                    {
-                                        "type": "Identifier",
-                                        "name": "screen"
-                                    }
-                                ]
+                                "modifier": "only",
+                                "mediaType": "screen",
+                                "condition": null
+                            }
+                        ]
+                    }
+                ]
+            },
+            "block": {
+                "type": "Block",
+                "children": []
+            }
+        }
+    },
+    "a list of conditions": {
+        "source": "@media all and (min-width: 500px), only screen, (200px < width) and ((foo: 1/2) or (100px > width > 200px)) {}",
+        "generate": "@media all and (min-width:500px),only screen,(200px<width) and ((foo:1/2) or (100px>width>200px)){}",
+        "ast": {
+            "type": "Atrule",
+            "name": "media",
+            "prelude": {
+                "type": "AtrulePrelude",
+                "children": [
+                    {
+                        "type": "MediaQueryList",
+                        "children": [
+                            {
+                                "type": "MediaQuery",
+                                "modifier": null,
+                                "mediaType": "all",
+                                "condition": {
+                                    "type": "Condition",
+                                    "kind": "media",
+                                    "children": [
+                                        {
+                                            "type": "Feature",
+                                            "kind": "media",
+                                            "name": "min-width",
+                                            "value": {
+                                                "type": "Dimension",
+                                                "value": "500",
+                                                "unit": "px"
+                                            }
+                                        }
+                                    ]
+                                }
+                            },
+                            {
+                                "type": "MediaQuery",
+                                "modifier": "only",
+                                "mediaType": "screen",
+                                "condition": null
+                            },
+                            {
+                                "type": "MediaQuery",
+                                "modifier": null,
+                                "mediaType": null,
+                                "condition": {
+                                    "type": "Condition",
+                                    "kind": "media",
+                                    "children": [
+                                        {
+                                            "type": "FeatureRange",
+                                            
+                                            "kind": "media",
+                                            "left": {
+                                                "type": "Dimension",
+                                                "value": "200",
+                                                "unit": "px"
+                                            },
+                                            "leftComparison": "<",
+                                            "middle": {
+                                                "type": "Identifier",
+                                                "name": "width"
+                                            },
+                                            "rightComparison": null,
+                                            "right": null
+                                        },
+                                        {
+                                            "type": "Identifier",
+                                            "name": "and"
+                                        },
+                                        {
+                                            "type": "Condition",
+                                            "kind": "media",
+                                            "children": [
+                                                {
+                                                    "type": "Feature",
+                                                    "kind": "media",
+                                                    "name": "foo",
+                                                    "value": {
+                                                        "type": "Ratio",
+                                                        "left": {
+                                                            "type": "Number",
+                                                            "value": "1"
+                                                        },
+                                                        "right": {
+                                                            "type": "Number",
+                                                            "value": "2"
+                                                        }
+                                                    }
+                                                },
+                                                {
+                                                    "type": "Identifier",
+                                                    "name": "or"
+                                                },
+                                                {
+                                                    "type": "FeatureRange",
+                                                    "kind": "media",
+                                                    "left": {
+                                                        "type": "Dimension",
+                                                        "value": "100",
+                                                        "unit": "px"
+                                                    },
+                                                    "leftComparison": ">",
+                                                    "middle": {
+                                                        "type": "Identifier",
+                                                        "name": "width"
+                                                    },
+                                                    "rightComparison": ">",
+                                                    "right": {
+                                                        "type": "Dimension",
+                                                        "value": "200",
+                                                        "unit": "px"
+                                                    }
+                                                }
+                                            ]
+                                        }
+                                    ]
+                                }
                             }
                         ]
                     }
@@ -110,12 +220,54 @@
                         "children": [
                             {
                                 "type": "MediaQuery",
-                                "children": [
-                                    {
-                                        "type": "Identifier",
-                                        "name": "screen"
-                                    }
-                                ]
+                                "modifier": null,
+                                "mediaType": "screen",
+                                "condition": null
+                            }
+                        ]
+                    }
+                ]
+            },
+            "block": {
+                "type": "Block",
+                "children": []
+            }
+        }
+    },
+    "missed 'and' keyword": {
+        "source": "@media screen (feature:1){}",
+        "ast": {
+            "type": "Atrule",
+            "name": "media",
+            "prelude": {
+                "type": "AtrulePrelude",
+                "children": [
+                    {
+                        "type": "MediaQueryList",
+                        "children": [
+                            {
+                                "type": "MediaQuery",
+                                "modifier": null,
+                                "mediaType": null,
+                                "condition": {
+                                    "type": "Condition",
+                                    "kind": "media",
+                                    "children": [
+                                        {
+                                            "type": "Identifier",
+                                            "name": "screen"
+                                        },
+                                        {
+                                            "type": "Feature",
+                                            "kind": "media",
+                                            "name": "feature",
+                                            "value": {
+                                                "type": "Number",
+                                                "value": "1"
+                                            }
+                                        }
+                                    ]
+                                }
                             }
                         ]
                     }
@@ -167,11 +319,50 @@
             }
         }
     },
+    "@media with unclosed parentheses is not an error": {
+        "source": "@media (foo:1",
+        "generate": "@media (foo:1);",
+        "ast": {
+            "type": "Atrule",
+            "name": "media",
+            "prelude": {
+                "type": "AtrulePrelude",
+                "children": [
+                    {
+                        "type": "MediaQueryList",
+                        "children": [
+                            {
+                                "type": "MediaQuery",
+                                "modifier": null,
+                                "mediaType": null,
+                                "condition": {
+                                    "type": "Condition",
+                                    "kind": "media",
+                                    "children": [
+                                        {
+                                            "type": "Feature",
+                                            "kind": "media",
+                                            "name": "foo",
+                                            "value": {
+                                                "type": "Number",
+                                                "value": "1"
+                                            }
+                                        }
+                                    ]
+                                }
+                            }
+                        ]
+                    }
+                ]
+            },
+            "block": null
+        }
+    },
     "error": [
         {
-            "source": "@media (foo:1",
-            "offset": "             ^",
-            "error": "\")\" is expected"
+            "source": "@media foo screen {}",
+            "offset": "           ^",
+            "error": "Identifier \"and\" is expected"
         },
         {
             "source": "@media (foo:1) ~",
diff -pruN 2.3.1-1/fixtures/ast/atrule/atrule/scope.json 3.1.0-1/fixtures/ast/atrule/atrule/scope.json
--- 2.3.1-1/fixtures/ast/atrule/atrule/scope.json	1970-01-01 00:00:00.000000000 +0000
+++ 3.1.0-1/fixtures/ast/atrule/atrule/scope.json	2024-12-06 17:25:18.000000000 +0000
@@ -0,0 +1,168 @@
+{
+    "base syntax": {
+        "source": "@scope (a) to (b) { c {} }",
+        "generate": "@scope (a) to (b){c{}}",
+        "ast": {
+            "type": "Atrule",
+            "name": "scope",
+            "prelude": {
+                "type": "AtrulePrelude",
+                "children": [
+                    {
+                        "type": "Scope",
+                        "root": {
+                            "type": "SelectorList",
+                            "children": [
+                                {
+                                    "type": "Selector",
+                                    "children": [
+                                        {
+                                            "type": "TypeSelector",
+                                            "name": "a"
+                                        }
+                                    ]
+                                }
+                            ]
+                        },
+                        "limit": {
+                            "type": "SelectorList",
+                            "children": [
+                                {
+                                    "type": "Selector",
+                                    "children": [
+                                        {
+                                            "type": "TypeSelector",
+                                            "name": "b"
+                                        }
+                                    ]
+                                }
+                            ]
+                        }
+                    }
+                ]
+            },
+            "block": {
+                "type": "Block",
+                "children": [
+                    {
+                        "type": "Rule",
+                        "prelude": {
+                            "type": "SelectorList",
+                            "children": [
+                                {
+                                    "type": "Selector",
+                                    "children": [
+                                        {
+                                            "type": "TypeSelector",
+                                            "name": "c"
+                                        }
+                                    ]
+                                }
+                            ]
+                        },
+                        "block": {
+                            "type": "Block",
+                            "children": []
+                        }
+                    }
+                ]
+            }
+        }
+    },
+    "only root": {
+        "source": "@scope (root){}",
+        "ast": {
+            "type": "Atrule",
+            "name": "scope",
+            "prelude": {
+                "type": "AtrulePrelude",
+                "children": [
+                    {
+                        "type": "Scope",
+                        "root": {
+                            "type": "SelectorList",
+                            "children": [
+                                {
+                                    "type": "Selector",
+                                    "children": [
+                                        {
+                                            "type": "TypeSelector",
+                                            "name": "root"
+                                        }
+                                    ]
+                                }
+                            ]
+                        },
+                        "limit": null
+                    }
+                ]
+            },
+            "block": {
+                "type": "Block",
+                "children": []
+            }
+        }
+    },
+    "only limit": {
+        "source": "@scope to (limit){}",
+        "ast": {
+            "type": "Atrule",
+            "name": "scope",
+            "prelude": {
+                "type": "AtrulePrelude",
+                "children": [
+                    {
+                        "type": "Scope",
+                        "root": null,
+                        "limit": {
+                            "type": "SelectorList",
+                            "children": [
+                                {
+                                    "type": "Selector",
+                                    "children": [
+                                        {
+                                            "type": "TypeSelector",
+                                            "name": "limit"
+                                        }
+                                    ]
+                                }
+                            ]
+                        }
+                    }
+                ]
+            },
+            "block": {
+                "type": "Block",
+                "children": []
+            }
+        }
+    },
+    "bad selectors": {
+        "source": "@scope ( .a. ) to ( .b. ) {}",
+        "generate": "@scope (.a.) to (.b.){}",
+        "ast": {
+            "type": "Atrule",
+            "name": "scope",
+            "prelude": {
+                "type": "AtrulePrelude",
+                "children": [
+                    {
+                        "type": "Scope",
+                        "root": {
+                            "type": "Raw",
+                            "value": ".a."
+                        },
+                        "limit": {
+                            "type": "Raw",
+                            "value": ".b."
+                        }
+                    }
+                ]
+            },
+            "block": {
+                "type": "Block",
+                "children": []
+            }
+        }
+    }
+}
diff -pruN 2.3.1-1/fixtures/ast/atrule/atrule/starting-style.json 3.1.0-1/fixtures/ast/atrule/atrule/starting-style.json
--- 2.3.1-1/fixtures/ast/atrule/atrule/starting-style.json	1970-01-01 00:00:00.000000000 +0000
+++ 3.1.0-1/fixtures/ast/atrule/atrule/starting-style.json	2024-12-06 17:25:18.000000000 +0000
@@ -0,0 +1,37 @@
+{
+    "base syntax": {
+        "source": "@starting-style { selector {} }",
+        "generate": "@starting-style{selector{}}",
+        "ast": {
+            "type": "Atrule",
+            "name": "starting-style",
+            "prelude": null,
+            "block": {
+                "type": "Block",
+                "children": [
+                    {
+                        "type": "Rule",
+                        "prelude": {
+                            "type": "SelectorList",
+                            "children": [
+                                {
+                                    "type": "Selector",
+                                    "children": [
+                                        {
+                                            "type": "TypeSelector",
+                                            "name": "selector"
+                                        }
+                                    ]
+                                }
+                            ]
+                        },
+                        "block": {
+                            "type": "Block",
+                            "children": []
+                        }
+                    }
+                ]
+            }
+        }
+    }
+}
diff -pruN 2.3.1-1/fixtures/ast/atrule/atrule/supports.json 3.1.0-1/fixtures/ast/atrule/atrule/supports.json
--- 2.3.1-1/fixtures/ast/atrule/atrule/supports.json	2022-12-14 17:31:12.000000000 +0000
+++ 3.1.0-1/fixtures/ast/atrule/atrule/supports.json	2024-12-06 17:25:18.000000000 +0000
@@ -1,6 +1,6 @@
 {
     "base test": {
-        "source": "@supports (flex:1){}",
+        "source": "@supports (flex:1){selector{color:green}}",
         "ast": {
             "type": "Atrule",
             "name": "supports",
@@ -8,20 +8,24 @@
                 "type": "AtrulePrelude",
                 "children": [
                     {
-                        "type": "Parentheses",
+                        "type": "Condition",
+                        "kind": "supports",
                         "children": [
                             {
-                                "type": "Declaration",
-                                "important": false,
-                                "property": "flex",
-                                "value": {
-                                    "type": "Value",
-                                    "children": [
-                                        {
-                                            "type": "Number",
-                                            "value": "1"
-                                        }
-                                    ]
+                                "type": "SupportsDeclaration",
+                                "declaration": {
+                                    "type": "Declaration",
+                                    "important": false,
+                                    "property": "flex",
+                                    "value": {
+                                        "type": "Value",
+                                        "children": [
+                                            {
+                                                "type": "Number",
+                                                "value": "1"
+                                            }
+                                        ]
+                                    }
                                 }
                             }
                         ]
@@ -30,7 +34,44 @@
             },
             "block": {
                 "type": "Block",
-                "children": []
+                "children": [
+                    {
+                        "type": "Rule",
+                        "prelude": {
+                            "type": "SelectorList",
+                            "children": [
+                                {
+                                    "type": "Selector",
+                                    "children": [
+                                        {
+                                            "type": "TypeSelector",
+                                            "name": "selector"
+                                        }
+                                    ]
+                                }
+                            ]
+                        },
+                        "block": {
+                            "type": "Block",
+                            "children": [
+                                {
+                                    "type": "Declaration",
+                                    "important": false,
+                                    "property": "color",
+                                    "value": {
+                                        "type": "Value",
+                                        "children": [
+                                            {
+                                                "type": "Identifier",
+                                                "name": "green"
+                                            }
+                                        ]
+                                    }
+                                }
+                            ]
+                        }
+                    }
+                ]
             }
         }
     },
@@ -44,20 +85,24 @@
                 "type": "AtrulePrelude",
                 "children": [
                     {
-                        "type": "Parentheses",
+                        "type": "Condition",
+                        "kind": "supports",
                         "children": [
                             {
-                                "type": "Declaration",
-                                "important": false,
-                                "property": "flex",
-                                "value": {
-                                    "type": "Value",
-                                    "children": [
-                                        {
-                                            "type": "Number",
-                                            "value": "1"
-                                        }
-                                    ]
+                                "type": "SupportsDeclaration",
+                                "declaration": {
+                                    "type": "Declaration",
+                                    "important": false,
+                                    "property": "flex",
+                                    "value": {
+                                        "type": "Value",
+                                        "children": [
+                                            {
+                                                "type": "Number",
+                                                "value": "1"
+                                            }
+                                        ]
+                                    }
                                 }
                             }
                         ]
@@ -80,24 +125,28 @@
                 "type": "AtrulePrelude",
                 "children": [
                     {
-                        "type": "Identifier",
-                        "name": "not"
-                    },
-                    {
-                        "type": "Parentheses",
+                        "type": "Condition",
+                        "kind": "supports",
                         "children": [
                             {
-                                "type": "Declaration",
-                                "important": false,
-                                "property": "flex",
-                                "value": {
-                                    "type": "Value",
-                                    "children": [
-                                        {
-                                            "type": "Number",
-                                            "value": "1"
-                                        }
-                                    ]
+                                "type": "Identifier",
+                                "name": "not"
+                            },        
+                            {
+                                "type": "SupportsDeclaration",
+                                "declaration": {
+                                    "type": "Declaration",
+                                    "important": false,
+                                    "property": "flex",
+                                    "value": {
+                                        "type": "Value",
+                                        "children": [
+                                            {
+                                                "type": "Number",
+                                                "value": "1"
+                                            }
+                                        ]
+                                    }
                                 }
                             }
                         ]
@@ -119,20 +168,24 @@
                 "type": "AtrulePrelude",
                 "children": [
                     {
-                        "type": "Parentheses",
+                        "type": "Condition",
+                        "kind": "supports",
                         "children": [
                             {
-                                "type": "Declaration",
-                                "important": false,
-                                "property": "flex",
-                                "value": {
-                                    "type": "Value",
-                                    "children": [
-                                        {
-                                            "type": "Number",
-                                            "value": "1"
-                                        }
-                                    ]
+                                "type": "SupportsDeclaration",
+                                "declaration": {
+                                    "type": "Declaration",
+                                    "important": false,
+                                    "property": "flex",
+                                    "value": {
+                                        "type": "Value",
+                                        "children": [
+                                            {
+                                                "type": "Number",
+                                                "value": "1"
+                                            }
+                                        ]
+                                    }
                                 }
                             }
                         ]
@@ -154,20 +207,24 @@
                 "type": "AtrulePrelude",
                 "children": [
                     {
-                        "type": "Parentheses",
+                        "type": "Condition",
+                        "kind": "supports",
                         "children": [
                             {
-                                "type": "Declaration",
-                                "important": false,
-                                "property": "-vendor-name",
-                                "value": {
-                                    "type": "Value",
-                                    "children": [
-                                        {
-                                            "type": "Number",
-                                            "value": "1"
-                                        }
-                                    ]
+                                "type": "SupportsDeclaration",
+                                "declaration": {
+                                    "type": "Declaration",
+                                    "important": false,
+                                    "property": "-vendor-name",
+                                    "value": {
+                                        "type": "Value",
+                                        "children": [
+                                            {
+                                                "type": "Number",
+                                                "value": "1"
+                                            }
+                                        ]
+                                    }
                                 }
                             }
                         ]
@@ -189,15 +246,19 @@
                 "type": "AtrulePrelude",
                 "children": [
                     {
-                        "type": "Parentheses",
+                        "type": "Condition",
+                        "kind": "supports",
                         "children": [
                             {
-                                "type": "Declaration",
-                                "important": false,
-                                "property": "--custom",
-                                "value": {
-                                    "type": "Raw",
-                                    "value": " 1"
+                                "type": "SupportsDeclaration",
+                                "declaration": {
+                                    "type": "Declaration",
+                                    "important": false,
+                                    "property": "--custom",
+                                    "value": {
+                                        "type": "Raw",
+                                        "value": " 1"
+                                    }
                                 }
                             }
                         ]
@@ -220,24 +281,28 @@
                 "type": "AtrulePrelude",
                 "children": [
                     {
-                        "type": "Identifier",
-                        "name": "not"
-                    },
-                    {
-                        "type": "Parentheses",
+                        "type": "Condition",
+                        "kind": "supports",
                         "children": [
                             {
-                                "type": "Declaration",
-                                "important": false,
-                                "property": "flex",
-                                "value": {
-                                    "type": "Value",
-                                    "children": [
-                                        {
-                                            "type": "Number",
-                                            "value": "1"
-                                        }
-                                    ]
+                                "type": "Identifier",
+                                "name": "not"
+                            },        
+                            {
+                                "type": "SupportsDeclaration",
+                                "declaration": {
+                                    "type": "Declaration",
+                                    "important": false,
+                                    "property": "flex",
+                                    "value": {
+                                        "type": "Value",
+                                        "children": [
+                                            {
+                                                "type": "Number",
+                                                "value": "1"
+                                            }
+                                        ]
+                                    }
                                 }
                             }
                         ]
@@ -260,52 +325,55 @@
                 "type": "AtrulePrelude",
                 "children": [
                     {
-                        "type": "Parentheses",
+                        "type": "Condition",
+                        "kind": "supports",
                         "children": [
                             {
-                                "type": "Identifier",
-                                "name": "not"
-                            },
-                            {
-                                "type": "Parentheses",
+                                "type": "Condition",
+                                "kind": "supports",
                                 "children": [
                                     {
-                                        "type": "Declaration",
-                                        "important": false,
-                                        "property": "flex",
-                                        "value": {
-                                            "type": "Value",
-                                            "children": [
-                                                {
-                                                    "type": "Number",
-                                                    "value": "1"
-                                                }
-                                            ]
+                                        "type": "Identifier",
+                                        "name": "not"
+                                    },
+                                    {
+                                        "type": "SupportsDeclaration",
+                                        "declaration":  {
+                                            "type": "Declaration",
+                                            "important": false,
+                                            "property": "flex",
+                                            "value": {
+                                                "type": "Value",
+                                                "children": [
+                                                    {
+                                                        "type": "Number",
+                                                        "value": "1"
+                                                    }
+                                                ]
+                                            }
                                         }
                                     }
                                 ]
-                            }
-                        ]
-                    },
-                    {
-                        "type": "Identifier",
-                        "name": "or"
-                    },
-                    {
-                        "type": "Parentheses",
-                        "children": [
+                            },
                             {
-                                "type": "Declaration",
-                                "important": false,
-                                "property": "grid",
-                                "value": {
-                                    "type": "Value",
-                                    "children": [
-                                        {
-                                            "type": "Identifier",
-                                            "name": "support"
-                                        }
-                                    ]
+                                "type": "Identifier",
+                                "name": "or"
+                            },
+                            {
+                                "type": "SupportsDeclaration",
+                                "declaration": {
+                                    "type": "Declaration",
+                                    "important": false,
+                                    "property": "grid",
+                                    "value": {
+                                        "type": "Value",
+                                        "children": [
+                                            {
+                                                "type": "Identifier",
+                                                "name": "support"
+                                            }
+                                        ]
+                                    }
                                 }
                             }
                         ]
@@ -327,12 +395,19 @@
                 "type": "AtrulePrelude",
                 "children": [
                     {
-                        "type": "Function",
-                        "name": "func",
+                        "type": "Condition",
+                        "kind": "supports",
                         "children": [
                             {
-                                "type": "Raw",
-                                "value": "flex: 1"
+                                "type": "GeneralEnclosed",
+                                "kind": "supports",
+                                "function": "func",
+                                "children": [
+                                    {
+                                        "type": "Raw",
+                                        "value": "flex: 1"
+                                    }
+                                ]
                             }
                         ]
                     }
@@ -354,28 +429,106 @@
                 "type": "AtrulePrelude",
                 "children": [
                     {
-                        "type": "Parentheses",
+                        "type": "Condition",
+                        "kind": "supports",
                         "children": [
                             {
-                                "type": "Declaration",
-                                "important": true,
-                                "property": "box-shadow",
+                                "type": "SupportsDeclaration",
+                                "declaration": {
+                                    "type": "Declaration",
+                                    "important": true,
+                                    "property": "box-shadow",
+                                    "value": {
+                                        "type": "Value",
+                                        "children": [
+                                            {
+                                                "type": "Identifier",
+                                                "name": "something"
+                                            },
+                                            {
+                                                "type": "Function",
+                                                "name": "var",
+                                                "children": [
+                                                    {
+                                                        "type": "Identifier",
+                                                        "name": "--complex"
+                                                    }
+                                                ]
+                                            }
+                                        ]
+                                    }
+                                }
+                            }
+                        ]
+                    }
+                ]
+            },
+            "block": {
+                "type": "Block",
+                "children": []
+            }
+        }
+    },
+    "@supports with no block": {
+        "source": "@supports (flex: 1)",
+        "generate": "@supports (flex:1);",
+        "ast": {
+            "type": "Atrule",
+            "name": "supports",
+            "prelude": {
+                "type": "AtrulePrelude",
+                "children": [
+                    {
+                        "type": "Condition",
+                        "kind": "supports",
+                        "children": [
+                            {
+                                "type": "SupportsDeclaration",
+                                "declaration": {
+                                    "type": "Declaration",
+                                    "important": false,
+                                    "property": "flex",
+                                    "value": {
+                                        "type": "Value",
+                                        "children": [
+                                            {
+                                                "type": "Number",
+                                                "value": "1"
+                                            }
+                                        ]
+                                    }
+                                }
+                            }
+                        ]
+                    }
+                ]
+            },
+            "block": null
+        }
+    },
+    "@supports with selector()": {
+        "source": "@supports selector(.example) {}",
+        "generate": "@supports selector(.example){}",
+        "ast": {
+            "type": "Atrule",
+            "name": "supports",
+            "prelude": {
+                "type": "AtrulePrelude",
+                "children": [
+                    {
+                        "type": "Condition",
+                        "kind": "supports",
+                        "children": [
+                            {
+                                "type": "FeatureFunction",
+                                "kind": "supports",
+                                "feature": "selector",
                                 "value": {
-                                    "type": "Value",
+                                    "type": "Selector",
                                     "children": [
                                         {
-                                            "type": "Identifier",
-                                            "name": "something"
-                                        },
-                                        {
-                                            "type": "Function",
-                                            "name": "var",
-                                            "children": [
-                                                {
-                                                    "type": "Identifier",
-                                                    "name": "--complex"
-                                                }
-                                            ]
+                                            "type": "ClassSelector",
+                                            "name": "example"
                                         }
                                     ]
                                 }
@@ -390,9 +543,9 @@
             }
         }
     },
-    "@supports with no block": {
-        "source": "@supports (flex: 1)",
-        "generate": "@supports (flex:1);",
+    "@supports with selector() case-insensitive": {
+        "source": "@supports SELECTOR(.example) {}",
+        "generate": "@supports SELECTOR(.example){}",
         "ast": {
             "type": "Atrule",
             "name": "supports",
@@ -400,18 +553,19 @@
                 "type": "AtrulePrelude",
                 "children": [
                     {
-                        "type": "Parentheses",
+                        "type": "Condition",
+                        "kind": "supports",
                         "children": [
                             {
-                                "type": "Declaration",
-                                "important": false,
-                                "property": "flex",
+                                "type": "FeatureFunction",
+                                "kind": "supports",
+                                "feature": "SELECTOR",
                                 "value": {
-                                    "type": "Value",
+                                    "type": "Selector",
                                     "children": [
                                         {
-                                            "type": "Number",
-                                            "value": "1"
+                                            "type": "ClassSelector",
+                                            "name": "example"
                                         }
                                     ]
                                 }
@@ -420,7 +574,10 @@
                     }
                 ]
             },
-            "block": null
+            "block": {
+                "type": "Block",
+                "children": []
+            }
         }
     },
     "@supports with no block is not an error": {
diff -pruN 2.3.1-1/fixtures/ast/atrulePrelude/index.json 3.1.0-1/fixtures/ast/atrulePrelude/index.json
--- 2.3.1-1/fixtures/ast/atrulePrelude/index.json	2022-12-14 17:31:12.000000000 +0000
+++ 3.1.0-1/fixtures/ast/atrulePrelude/index.json	2024-12-06 17:25:18.000000000 +0000
@@ -28,12 +28,9 @@
                     "children": [
                         {
                             "type": "MediaQuery",
-                            "children": [
-                                {
-                                    "type": "Identifier",
-                                    "name": "screen"
-                                }
-                            ]
+                            "modifier": null,
+                            "mediaType": "screen",
+                            "condition": null
                         }
                     ]
                 }
diff -pruN 2.3.1-1/fixtures/ast/block/Block.json 3.1.0-1/fixtures/ast/block/Block.json
--- 2.3.1-1/fixtures/ast/block/Block.json	2022-12-14 17:31:12.000000000 +0000
+++ 3.1.0-1/fixtures/ast/block/Block.json	2024-12-06 17:25:18.000000000 +0000
@@ -6,18 +6,6 @@
             "children": []
         }
     },
-    "block.1": {
-        "source": "{;}",
-        "ast": {
-            "type": "Block",
-            "children": [
-                {
-                    "type": "Raw",
-                    "value": ";"
-                }
-            ]
-        }
-    },
     "block.2": {
         "source": "{p:v}",
         "ast": {
@@ -211,19 +199,6 @@
             "children": []
         }
     },
-    "block.s.1": {
-        "source": "{  ;  }",
-        "generate": "{;}",
-        "ast": {
-            "type": "Block",
-            "children": [
-                {
-                    "type": "Raw",
-                    "value": ";"
-                }
-            ]
-        }
-    },
     "block.s.2": {
         "source": "{  p:v  }",
         "generate": "{p:v}",
@@ -271,7 +246,7 @@
         }
     },
     "block.s.4": {
-        "source": "{  p0:v0  ;  p1:v1  }",
+        "source": "{  p0  :  v0  ;  p1  :  v1  }",
         "generate": "{p0:v0;p1:v1}",
         "ast": {
             "type": "Block",
@@ -518,5 +493,120 @@
                 ]
             }
         }
-    ]
+    ],
+    "bad declaration should include semicolon": [
+        {
+            "source": "{foo: boom!;}",
+            "ast": {
+                "type": "Block",
+                "children": [
+                    {
+                        "type": "Raw",
+                        "value": "foo: boom!;"
+                    }
+                ]
+            }
+        },
+        {
+            "source": "{foo: boom! ; }",
+            "generate": "{foo: boom! ;}",
+            "ast": {
+                "type": "Block",
+                "children": [
+                    {
+                        "type": "Raw",
+                        "value": "foo: boom! ;"
+                    }
+                ]
+            }
+        }
+    ],
+    "bad declaration should not include whitespaces": [
+        {
+            "source": "{ foo: ? }",
+            "generate": "{foo:?}",
+            "ast": {
+                "type": "Block",
+                "children": [
+                    {
+                        "type": "Declaration",
+                        "important": false,
+                        "property": "foo",
+                        "value": {
+                            "type": "Raw",
+                            "value": "?"
+                        }
+                    }
+                ]
+            }
+        },
+        {
+            "source": "{ foo }",
+            "generate": "{foo}",
+            "ast": {
+                "type": "Block",
+                "children": [
+                    {
+                        "type": "Raw",
+                        "value": "foo"
+                    }
+                ]
+            }
+        },
+        {
+            "source": "{ foo: boom! }",
+            "generate": "{foo: boom!}",
+            "ast": {
+                "type": "Block",
+                "children": [
+                    {
+                        "type": "Raw",
+                        "value": "foo: boom!"
+                    }
+                ]
+            }
+        }
+    ],
+    "bad symbol in a property name": {
+        "source": "{!foo: value}",
+        "ast": {
+            "type": "Block",
+            "children": [
+                {
+                    "type": "Raw",
+                    "value": "!foo: value"
+                }
+            ]
+        }
+    },
+    "uncomplete !important": {
+        "source": "{bada: boom!}",
+        "ast": {
+            "type": "Block",
+            "children": [
+                {
+                    "type": "Raw",
+                    "value": "bada: boom!"
+                }
+            ]
+        }
+    },
+    "bad value": {
+        "source": "{bada: boom? }",
+        "generate": "{bada:boom?}",
+        "ast": {
+            "type": "Block",
+            "children": [
+                {
+                    "type": "Declaration",
+                    "important": false,
+                    "property": "bada",
+                    "value": {
+                        "type": "Raw",
+                        "value": "boom?"
+                    }
+                }
+            ]
+        }
+    }
 }
diff -pruN 2.3.1-1/fixtures/ast/block/tolerant.json 3.1.0-1/fixtures/ast/block/tolerant.json
--- 2.3.1-1/fixtures/ast/block/tolerant.json	2022-12-14 17:31:12.000000000 +0000
+++ 3.1.0-1/fixtures/ast/block/tolerant.json	1970-01-01 00:00:00.000000000 +0000
@@ -1,137 +0,0 @@
-{
-    "unclosed block": {
-        "source": "{ ",
-        "generate": "{}",
-        "ast": {
-            "type": "Block",
-            "children": []
-        }
-    },
-    "no colon after a property name": {
-        "source": "{foo}",
-        "ast": {
-            "type": "Block",
-            "children": [
-                {
-                    "type": "Raw",
-                    "value": "foo"
-                }
-            ]
-        }
-    },
-    "bad symbol in a property name": {
-        "source": "{!foo: value}",
-        "ast": {
-            "type": "Block",
-            "children": [
-                {
-                    "type": "Raw",
-                    "value": "!foo: value"
-                }
-            ]
-        }
-    },
-    "uncomplete !important": {
-        "source": "{bada: boom!}",
-        "ast": {
-            "type": "Block",
-            "children": [
-                {
-                    "type": "Raw",
-                    "value": "bada: boom!"
-                }
-            ]
-        }
-    },
-    "bad value": {
-        "source": "{bada: boom? }",
-        "generate": "{bada:boom?}",
-        "ast": {
-            "type": "Block",
-            "children": [
-                {
-                    "type": "Declaration",
-                    "important": false,
-                    "property": "bada",
-                    "value": {
-                        "type": "Raw",
-                        "value": "boom?"
-                    }
-                }
-            ]
-        }
-    },
-    "bad declaration should include semicolon": [
-        {
-            "source": "{foo: boom!;}",
-            "ast": {
-                "type": "Block",
-                "children": [
-                    {
-                        "type": "Raw",
-                        "value": "foo: boom!;"
-                    }
-                ]
-            }
-        },
-        {
-            "source": "{foo: boom! ; }",
-            "generate": "{foo: boom! ;}",
-            "ast": {
-                "type": "Block",
-                "children": [
-                    {
-                        "type": "Raw",
-                        "value": "foo: boom! ;"
-                    }
-                ]
-            }
-        }
-    ],
-    "bad declaration should not include whitespaces": [
-        {
-            "source": "{ foo: ? }",
-            "generate": "{foo:?}",
-            "ast": {
-                "type": "Block",
-                "children": [
-                    {
-                        "type": "Declaration",
-                        "important": false,
-                        "property": "foo",
-                        "value": {
-                            "type": "Raw",
-                            "value": "?"
-                        }
-                    }
-                ]
-            }
-        },
-        {
-            "source": "{ foo }",
-            "generate": "{foo}",
-            "ast": {
-                "type": "Block",
-                "children": [
-                    {
-                        "type": "Raw",
-                        "value": "foo"
-                    }
-                ]
-            }
-        },
-        {
-            "source": "{ foo: boom! }",
-            "generate": "{foo: boom!}",
-            "ast": {
-                "type": "Block",
-                "children": [
-                    {
-                        "type": "Raw",
-                        "value": "foo: boom!"
-                    }
-                ]
-            }
-        }
-    ]
-}
diff -pruN 2.3.1-1/fixtures/ast/declarationList/nesting.json 3.1.0-1/fixtures/ast/declarationList/nesting.json
--- 2.3.1-1/fixtures/ast/declarationList/nesting.json	2022-12-14 17:31:12.000000000 +0000
+++ 3.1.0-1/fixtures/ast/declarationList/nesting.json	2024-12-06 17:25:18.000000000 +0000
@@ -150,16 +150,23 @@
                                 "children": [
                                     {
                                         "type": "MediaQuery",
-                                        "children": [
-                                            {
-                                                "type": "MediaFeature",
-                                                "name": "orientation",
-                                                "value": {
-                                                    "type": "Identifier",
-                                                    "name": "landscape"
+                                        "modifier": null,
+                                        "mediaType": null,
+                                        "condition": {
+                                            "type": "Condition",
+                                            "kind": "media",
+                                            "children": [
+                                                {
+                                                    "type": "Feature",
+                                                    "kind": "media",
+                                                    "name": "orientation",
+                                                    "value": {
+                                                        "type": "Identifier",
+                                                        "name": "landscape"
+                                                    }
                                                 }
-                                            }
-                                        ]
+                                            ]
+                                        }
                                     }
                                 ]
                             }
@@ -193,17 +200,24 @@
                                             "children": [
                                                 {
                                                     "type": "MediaQuery",
-                                                    "children": [
-                                                        {
-                                                            "type": "MediaFeature",
-                                                            "name": "min-width",
-                                                            "value": {
-                                                                "type": "Dimension",
-                                                                "value": "1024",
-                                                                "unit": "px"
+                                                    "modifier": null,
+                                                    "mediaType": null,
+                                                    "condition": {
+                                                        "type": "Condition",
+                                                        "kind": "media",
+                                                        "children": [
+                                                            {
+                                                                "type": "Feature",
+                                                                "kind": "media",
+                                                                "name": "min-width",
+                                                                "value": {
+                                                                    "type": "Dimension",
+                                                                    "value": "1024",
+                                                                    "unit": "px"
+                                                                }
                                                             }
-                                                        }
-                                                    ]
+                                                        ]
+                                                    }
                                                 }
                                             ]
                                         }
diff -pruN 2.3.1-1/fixtures/ast/mediaQuery/FeatureRange.json 3.1.0-1/fixtures/ast/mediaQuery/FeatureRange.json
--- 2.3.1-1/fixtures/ast/mediaQuery/FeatureRange.json	1970-01-01 00:00:00.000000000 +0000
+++ 3.1.0-1/fixtures/ast/mediaQuery/FeatureRange.json	2024-12-06 17:25:18.000000000 +0000
@@ -0,0 +1,465 @@
+{
+    "basic": {
+        "source": "(foo>1)",
+        "ast": {
+            "type": "Condition",
+            "kind": "media",
+            "children": [
+                {
+                    "type": "FeatureRange",
+                    "kind": "media",
+                    "left": {
+                        "type": "Identifier",
+                        "name": "foo"
+                    },
+                    "leftComparison": ">",
+                    "middle": {
+                        "type": "Number",
+                        "value": "1"
+                    },
+                    "rightComparison": null,
+                    "right": null
+                }
+            ]
+        }
+    },
+    "number first": {
+        "source": "(1<foo)",
+        "ast": {
+            "type": "Condition",
+            "kind": "media",
+            "children": [
+                {
+                    "type": "FeatureRange",
+                    "kind": "media",
+                    "left": {
+                        "type": "Number",
+                        "value": "1"
+                    },
+                    "leftComparison": "<",
+                    "middle": {
+                        "type": "Identifier",
+                        "name": "foo"
+                    },
+                    "rightComparison": null,
+                    "right": null
+                }
+            ]
+        }
+    },
+    "ratio first": {
+        "source": "(1/2<foo)",
+        "ast": {
+            "type": "Condition",
+            "kind": "media",
+            "children": [
+                {
+                    "type": "FeatureRange",
+                    "kind": "media",
+                    "left": {
+                        "type": "Ratio",
+                        "left": {
+                            "type": "Number",
+                            "value": "1"
+                        },
+                        "right": {
+                            "type": "Number",
+                            "value": "2"
+                        }
+                    },
+                    "leftComparison": "<",
+                    "middle": {
+                        "type": "Identifier",
+                        "name": "foo"
+                    },
+                    "rightComparison": null,
+                    "right": null
+                }
+            ]
+        }
+    },
+    "dimension first": {
+        "source": "(1px<foo)",
+        "ast": {
+            "type": "Condition",
+            "kind": "media",
+            "children": [
+                {
+                    "type": "FeatureRange",
+                    "kind": "media",
+                    "left": {
+                        "type": "Dimension",
+                        "value": "1",
+                        "unit": "px"
+                    },
+                    "leftComparison": "<",
+                    "middle": {
+                        "type": "Identifier",
+                        "name": "foo"
+                    },
+                    "rightComparison": null,
+                    "right": null
+                }
+            ]
+        }
+    },
+    "function first": {
+        "source": "(calc(1 + 2)<foo)",
+        "ast": {
+            "type": "Condition",
+            "kind": "media",
+            "children": [
+                {
+                    "type": "FeatureRange",
+                    "kind": "media",
+                    "left": {
+                        "type": "Function",
+                        "name": "calc",
+                        "children": [
+                            {
+                                "type": "Number",
+                                "value": "1"
+                            },
+                            {
+                                "type": "Operator",
+                                "value": " + "
+                            },
+                            {
+                                "type": "Number",
+                                "value": "2"
+                            }
+                        ]
+                    },
+                    "leftComparison": "<",
+                    "middle": {
+                        "type": "Identifier",
+                        "name": "foo"
+                    },
+                    "rightComparison": null,
+                    "right": null
+                }
+            ]
+        }
+    },
+    "full form": {
+        "source": "(100px<bar<200px)",
+        "ast": {
+            "type": "Condition",
+            "kind": "media",
+            "children": [
+                {
+                    "type": "FeatureRange",
+                    "kind": "media",
+                    "left": {
+                        "type": "Dimension",
+                        "value": "100",
+                        "unit": "px"
+                    },
+                    "leftComparison": "<",
+                    "middle": {
+                        "type": "Identifier",
+                        "name": "bar"
+                    },
+                    "rightComparison": "<",
+                    "right": {
+                        "type": "Dimension",
+                        "value": "200",
+                        "unit": "px"
+                    }
+                }
+            ]
+        }
+    },
+    "all three numbers": {
+        "source": "(1 < 2 < 3)",
+        "generate": "(1<2<3)",
+        "ast": {
+            "type": "Condition",
+            "kind": "media",
+            "children": [
+                {
+                    "type": "FeatureRange",
+                    "kind": "media",
+                    "left": {
+                        "type": "Number",
+                        "value": "1"
+                    },
+                    "leftComparison": "<",
+                    "middle": {
+                        "type": "Number",
+                        "value": "2"
+                    },
+                    "rightComparison": "<",
+                    "right": {
+                        "type": "Number",
+                        "value": "3"
+                    }
+                }
+            ]
+        }
+    },
+    "all three ratio": {
+        "source": "(1 / 2 < 1 /**/ / /**/ 3 < 1/**///**/4)",
+        "generate": "(1/2<1/3<1/4)",
+        "ast": {
+            "type": "Condition",
+            "kind": "media",
+            "children": [
+                {
+                    "type": "FeatureRange",
+                    "kind": "media",
+                    "left": {
+                        "type": "Ratio",
+                        "left": {
+                            "type": "Number",
+                            "value": "1"
+                        },
+                        "right": {
+                            "type": "Number",
+                            "value": "2"
+                        }
+                    },
+                    "leftComparison": "<",
+                    "middle": {
+                        "type": "Ratio",
+                        "left": {
+                            "type": "Number",
+                            "value": "1"
+                        },
+                        "right": {
+                            "type": "Number",
+                            "value": "3"
+                        }
+                    },
+                    "rightComparison": "<",
+                    "right": {
+                        "type": "Ratio",
+                        "left": {
+                            "type": "Number",
+                            "value": "1"
+                        },
+                        "right": {
+                            "type": "Number",
+                            "value": "4"
+                        }
+                    }
+                }
+            ]
+        }
+    },
+    "all three functions": {
+        "source": "(calc(1   +   2) < calc() < max(1, 2))",
+        "generate": "(calc(1 + 2)<calc()<max(1,2))",
+        "ast": {
+            "type": "Condition",
+            "kind": "media",
+            "children": [
+                {
+                    "type": "FeatureRange",
+                    "kind": "media",
+                    "left": {
+                        "type": "Function",
+                        "name": "calc",
+                        "children": [
+                            {
+                                "type": "Number",
+                                "value": "1"
+                            },
+                            {
+                                "type": "Operator",
+                                "value": " + "
+                            },
+                            {
+                                "type": "Number",
+                                "value": "2"
+                            }
+                        ]
+                    },
+                    "leftComparison": "<",
+                    "middle": {
+                        "type": "Function",
+                        "name": "calc",
+                        "children": []
+                    },
+                    "rightComparison": "<",
+                    "right": {
+                        "type": "Function",
+                        "name": "max",
+                        "children": [
+                            {
+                                "type": "Number",
+                                "value": "1"
+                            },
+                            {
+                                "type": "Operator",
+                                "value": ","
+                            },
+                            {
+                                "type": "Number",
+                                "value": "2"
+                            }
+                        ]
+                    }
+                }
+            ]
+        }
+    },
+    "function in ratio": [
+        {
+            "source": "(2/calc(1 + 2)<foo)",
+            "ast": {
+                "type": "Condition",
+                "kind": "media",
+                "children": [
+                    {
+                        "type": "FeatureRange",
+                        "kind": "media",
+                        "left": {
+                            "type": "Ratio",
+                            "left": {
+                                "type": "Number",
+                                "value": "2"
+                            },
+                            "right": {
+                                "type": "Function",
+                                "name": "calc",
+                                "children": [
+                                    {
+                                        "type": "Number",
+                                        "value": "1"
+                                    },
+                                    {
+                                        "type": "Operator",
+                                        "value": " + "
+                                    },
+                                    {
+                                        "type": "Number",
+                                        "value": "2"
+                                    }
+                                ]
+                            }
+                        },
+                        "leftComparison": "<",
+                        "middle": {
+                            "type": "Identifier",
+                            "name": "foo"
+                        },
+                        "rightComparison": null,
+                        "right": null
+                    }
+                ]
+            }
+        },
+        {
+            "source": "(calc(1 + 2)/2<foo)",
+            "ast": {
+                "type": "Condition",
+                "kind": "media",
+                "children": [
+                    {
+                        "type": "FeatureRange",
+                        "kind": "media",
+                        "left": {
+                            "type": "Ratio",
+                            "left": {
+                                "type": "Function",
+                                "name": "calc",
+                                "children": [
+                                    {
+                                        "type": "Number",
+                                        "value": "1"
+                                    },
+                                    {
+                                        "type": "Operator",
+                                        "value": " + "
+                                    },
+                                    {
+                                        "type": "Number",
+                                        "value": "2"
+                                    }
+                                ]
+                            },
+                            "right": {
+                                "type": "Number",
+                                "value": "2"
+                            }
+                        },
+                        "leftComparison": "<",
+                        "middle": {
+                            "type": "Identifier",
+                            "name": "foo"
+                        },
+                        "rightComparison": null,
+                        "right": null
+                    }
+                ]
+            }
+        },
+        {
+            "source": "(calc(1 + 2)/calc(1 + 2)<foo)",
+            "ast": {
+                "type": "Condition",
+                "kind": "media",
+                "children": [
+                    {
+                        "type": "FeatureRange",
+                        "kind": "media",
+                        "left": {
+                            "type": "Ratio",
+                            "left": {
+                                "type": "Function",
+                                "name": "calc",
+                                "children": [
+                                    {
+                                        "type": "Number",
+                                        "value": "1"
+                                    },
+                                    {
+                                        "type": "Operator",
+                                        "value": " + "
+                                    },
+                                    {
+                                        "type": "Number",
+                                        "value": "2"
+                                    }
+                                ]
+                            },
+                            "right": {
+                                "type": "Function",
+                                "name": "calc",
+                                "children": [
+                                    {
+                                        "type": "Number",
+                                        "value": "1"
+                                    },
+                                    {
+                                        "type": "Operator",
+                                        "value": " + "
+                                    },
+                                    {
+                                        "type": "Number",
+                                        "value": "2"
+                                    }
+                                ]
+                            }
+                        },
+                        "leftComparison": "<",
+                        "middle": {
+                            "type": "Identifier",
+                            "name": "foo"
+                        },
+                        "rightComparison": null,
+                        "right": null
+                    }
+                ]
+            }
+        }
+    ],
+    "error": [
+        {
+            "source": "(foo > 123 123)",
+            "offset": "           ^",
+            "error": "Expected \"<\", \">\", \"=\" or \")\""
+        }
+    ]
+}
diff -pruN 2.3.1-1/fixtures/ast/mediaQuery/GeneralEnclosed.json 3.1.0-1/fixtures/ast/mediaQuery/GeneralEnclosed.json
--- 2.3.1-1/fixtures/ast/mediaQuery/GeneralEnclosed.json	1970-01-01 00:00:00.000000000 +0000
+++ 3.1.0-1/fixtures/ast/mediaQuery/GeneralEnclosed.json	2024-12-06 17:25:18.000000000 +0000
@@ -0,0 +1,148 @@
+{
+    "function": {
+        "source": "foo(1 2)",
+        "ast": {
+            "type": "Condition",
+            "kind": "media",
+            "children": [
+                {
+                    "type": "GeneralEnclosed",
+                    "kind": "media",
+                    "function": "foo",
+                    "children": [
+                        {
+                            "type": "Number",
+                            "value": "1"
+                        },
+                        {
+                            "type": "Number",
+                            "value": "2"
+                        }
+                    ]
+                }
+            ]
+        }
+    },
+    "empty function": {
+        "source": "foo()",
+        "ast": {
+            "type": "Condition",
+            "kind": "media",
+            "children": [
+                {
+                    "type": "GeneralEnclosed",
+                    "kind": "media",
+                    "function": "foo",
+                    "children": []
+                }
+            ]
+        }
+    },
+    "parentheses": {
+        "source": "(1 2)",
+        "ast": {
+            "type": "Condition",
+            "kind": "media",
+            "children": [
+                {
+                    "type": "GeneralEnclosed",
+                    "kind": "media",
+                    "function": null,
+                    "children": [
+                        {
+                            "type": "Number",
+                            "value": "1"
+                        },
+                        {
+                            "type": "Number",
+                            "value": "2"
+                        }
+                    ]
+                }
+            ]
+        }
+    },
+    "empty parentheses": {
+        "source": "()",
+        "ast": {
+            "type": "Condition",
+            "kind": "media",
+            "children": [
+                {
+                    "type": "GeneralEnclosed",
+                    "kind": "media",
+                    "function": null,
+                    "children": []
+                }
+            ]
+        }
+    },
+    "mixed": {
+        "source": "foo(1 2) and (1 2)",
+        "ast": {
+            "type": "Condition",
+            "kind": "media",
+            "children": [
+                {
+                    "type": "GeneralEnclosed",
+                    "kind": "media",
+                    "function": "foo",
+                    "children": [
+                        {
+                            "type": "Number",
+                            "value": "1"
+                        },
+                        {
+                            "type": "Number",
+                            "value": "2"
+                        }
+                    ]
+                },
+                {
+                    "type": "Identifier",
+                    "name": "and"
+                },
+                {
+                    "type": "GeneralEnclosed",
+                    "kind": "media",
+                    "function": null,
+                    "children": [
+                        {
+                            "type": "Number",
+                            "value": "1"
+                        },
+                        {
+                            "type": "Number",
+                            "value": "2"
+                        }
+                    ]
+                }
+            ]
+        }
+    },
+    "mixed empty": {
+        "source": "foo() and ()",
+        "ast": {
+            "type": "Condition",
+            "kind": "media",
+            "children": [
+                {
+                    "type": "GeneralEnclosed",
+                    "kind": "media",
+                    "function": "foo",
+                    "children": []
+                },
+                {
+                    "type": "Identifier",
+                    "name": "and"
+                },
+                {
+                    "type": "GeneralEnclosed",
+                    "kind": "media",
+                    "function": null,
+                    "children": []
+                }
+            ]
+        }
+    }
+}
diff -pruN 2.3.1-1/fixtures/ast/mediaQuery/MediaQuery.json 3.1.0-1/fixtures/ast/mediaQuery/MediaQuery.json
--- 2.3.1-1/fixtures/ast/mediaQuery/MediaQuery.json	2022-12-14 17:31:12.000000000 +0000
+++ 3.1.0-1/fixtures/ast/mediaQuery/MediaQuery.json	2024-12-06 17:25:18.000000000 +0000
@@ -3,79 +3,120 @@
         "source": "(foo)",
         "ast": {
             "type": "MediaQuery",
-            "children": [
-                {
-                    "type": "MediaFeature",
-                    "name": "foo",
-                    "value": null
-                }
-            ]
+            "modifier": null,
+            "mediaType": null,
+            "condition": {
+                "type": "Condition",
+                "kind": "media",
+                "children": [
+                    {
+                        "type": "Feature",
+                        "kind": "media",
+                        "name": "foo",
+                        "value": null
+                    }
+                ]
+            }
         }
     },
     "media feature with number value": {
         "source": "(foo:1)",
         "ast": {
             "type": "MediaQuery",
-            "children": [
-                {
-                    "type": "MediaFeature",
-                    "name": "foo",
-                    "value": {
-                        "type": "Number",
-                        "value": "1"
+            "modifier": null,
+            "mediaType": null,
+            "condition": {
+                "type": "Condition",
+                "kind": "media",
+                "children": [
+                    {
+                        "type": "Feature",
+                        "kind": "media",
+                        "name": "foo",
+                        "value": {
+                            "type": "Number",
+                            "value": "1"
+                        }
                     }
-                }
-            ]
+                ]
+            }
         }
     },
     "media feature with identifier value": {
         "source": "(foo:bar)",
         "ast": {
             "type": "MediaQuery",
-            "children": [
-                {
-                    "type": "MediaFeature",
-                    "name": "foo",
-                    "value": {
-                        "type": "Identifier",
-                        "name": "bar"
+            "modifier": null,
+            "mediaType": null,
+            "condition": {
+                "type": "Condition",
+                "kind": "media",
+                "children": [
+                    {
+                        "type": "Feature",
+                        "kind": "media",
+                        "name": "foo",
+                        "value": {
+                            "type": "Identifier",
+                            "name": "bar"
+                        }
                     }
-                }
-            ]
+                ]
+            }
         }
     },
     "media feature with dimension value": {
         "source": "(foo:2px)",
         "ast": {
             "type": "MediaQuery",
-            "children": [
-                {
-                    "type": "MediaFeature",
-                    "name": "foo",
-                    "value": {
-                        "type": "Dimension",
-                        "value": "2",
-                        "unit": "px"
+            "modifier": null,
+            "mediaType": null,
+            "condition": {
+                "type": "Condition",
+                "kind": "media",
+                "children": [
+                    {
+                        "type": "Feature",
+                        "kind": "media",
+                        "name": "foo",
+                        "value": {
+                            "type": "Dimension",
+                            "value": "2",
+                            "unit": "px"
+                        }
                     }
-                }
-            ]
+                ]
+            }
         }
     },
     "media feature with ratio": {
         "source": "(foo:3/4)",
         "ast": {
             "type": "MediaQuery",
-            "children": [
-                {
-                    "type": "MediaFeature",
-                    "name": "foo",
-                    "value": {
-                        "type": "Ratio",
-                        "left": "3",
-                        "right": "4"
+            "modifier": null,
+            "mediaType": null,
+            "condition": {
+                "type": "Condition",
+                "kind": "media",
+                "children": [
+                    {
+                        "type": "Feature",
+                        "kind": "media",
+                        "name": "foo",
+                        "value": {
+                            "type": "Ratio",
+                            "left": {
+                                "type": "Number",
+                                "value": "3"
+                            },
+                            "right": {
+                                "type": "Number",
+                                "value": "4"
+                            }
+                        }
                     }
-                }
-            ]
+                ]
+            }
         }
     },
     "media feature with spaces": {
@@ -83,16 +124,23 @@
         "generate": "(foo:1)",
         "ast": {
             "type": "MediaQuery",
-            "children": [
-                {
-                    "type": "MediaFeature",
-                    "name": "foo",
-                    "value": {
-                        "type": "Number",
-                        "value": "1"
+            "modifier": null,
+            "mediaType": null,
+            "condition": {
+                "type": "Condition",
+                "kind": "media",
+                "children": [
+                    {
+                        "type": "Feature",
+                        "kind": "media",
+                        "name": "foo",
+                        "value": {
+                            "type": "Number",
+                            "value": "1"
+                        }
                     }
-                }
-            ]
+                ]
+            }
         }
     },
     "media feature with comments": {
@@ -100,20 +148,27 @@
         "generate": "all (foo:1)",
         "ast": {
             "type": "MediaQuery",
-            "children": [
-                {
-                    "type": "Identifier",
-                    "name": "all"
-                },
-                {
-                    "type": "MediaFeature",
-                    "name": "foo",
-                    "value": {
-                        "type": "Number",
-                        "value": "1"
+            "modifier": null,
+            "mediaType": null,
+            "condition": {
+                "type": "Condition",
+                "kind": "media",
+                "children": [
+                    {
+                        "type": "Identifier",
+                        "name": "all"
+                    },
+                    {
+                        "type": "Feature",
+                        "kind": "media",
+                        "name": "foo",
+                        "value": {
+                            "type": "Number",
+                            "value": "1"
+                        }
                     }
-                }
-            ]
+                ]
+            }
         }
     },
     "media feature with ratio and spaces": {
@@ -121,57 +176,153 @@
         "generate": "(foo:3/4)",
         "ast": {
             "type": "MediaQuery",
-            "children": [
-                {
-                    "type": "MediaFeature",
-                    "name": "foo",
-                    "value": {
-                        "type": "Ratio",
-                        "left": "3",
-                        "right": "4"
+            "modifier": null,
+            "mediaType": null,
+            "condition": {
+                "type": "Condition",
+                "kind": "media",
+                "children": [
+                    {
+                        "type": "Feature",
+                        "kind": "media",
+                        "name": "foo",
+                        "value": {
+                            "type": "Ratio",
+                            "left": {
+                                "type": "Number",
+                                "value": "3"
+                            },
+                            "right": {
+                                "type": "Number",
+                                "value": "4"
+                            }
+                        }
                     }
-                }
-            ]
+                ]
+            }
         }
     },
     "vendor media feature": {
         "source": "(-webkit-min-device-pixel-ratio:2)",
         "ast": {
             "type": "MediaQuery",
-            "children": [
-                {
-                    "type": "MediaFeature",
-                    "name": "-webkit-min-device-pixel-ratio",
-                    "value": {
-                        "type": "Number",
-                        "value": "2"
+            "modifier": null,
+            "mediaType": null,
+            "condition": {
+                "type": "Condition",
+                "kind": "media",
+                "children": [
+                    {
+                        "type": "Feature",
+                        "kind": "media",
+                        "name": "-webkit-min-device-pixel-ratio",
+                        "value": {
+                            "type": "Number",
+                            "value": "2"
+                        }
+                    }
+                ]
+            }
+        }
+    },
+    "dashed name feature": {
+        "source": "(--foo:2)",
+        "ast": {
+            "type": "MediaQuery",
+            "modifier": null,
+            "mediaType": null,
+            "condition": {
+                "type": "Condition",
+                "kind": "media",
+                "children": [
+                    {
+                        "type": "Feature",
+                        "kind": "media",
+                        "name": "--foo",
+                        "value": {
+                            "type": "Number",
+                            "value": "2"
+                        }
+                    }
+                ]
+            }
+        }
+    },
+    "with function": {
+        "source": "(  foo  :  calc( 3  /  4 + 2)  )",
+        "generate": "(foo:calc(3/4 + 2))",
+        "ast": {
+            "type": "MediaQuery",
+            "modifier": null,
+            "mediaType": null,
+            "condition": {
+                "type": "Condition",
+                "kind": "media",
+                "children": [
+                    {
+                        "type": "Feature",
+                        "kind": "media",
+                        "name": "foo",
+                        "value": {
+                            "type": "Function",
+                            "name": "calc",
+                            "children": [
+                                {
+                                    "type": "Number",
+                                    "value": "3"
+                                },
+                                {
+                                    "type": "Operator",
+                                    "value": "/"
+                                },
+                                {
+                                    "type": "Number",
+                                    "value": "4"
+                                },
+                                {
+                                    "type": "Operator",
+                                    "value": " + "
+                                },
+                                {
+                                    "type": "Number",
+                                    "value": "2"
+                                }
+                            ]
+                        }
                     }
-                }
-            ]
+                ]
+            }
         }
     },
     "number with \\0 hack": {
         "source": "(min-width:0\\0)",
         "ast": {
             "type": "MediaQuery",
-            "children": [
-                {
-                    "type": "MediaFeature",
-                    "name": "min-width",
-                    "value": {
-                        "type": "Dimension",
-                        "value": "0",
-                        "unit": "\\0"
+            "modifier": null,
+            "mediaType": null,
+            "condition": {
+                "type": "Condition",
+                "kind": "media",
+                "children": [
+                    {
+                        "type": "Feature",
+                        "kind": "media",
+                        "name": "min-width",
+                        "value": {
+                            "type": "Dimension",
+                            "value": "0",
+                            "unit": "\\0"
+                        }
                     }
-                }
-            ]
+                ]
+            }
         }
     },
     "error": [
         {
             "source": "(foo 123)",
             "offset": "     ^",
-            "error": "Colon is expected"
+            "error": "Expected \":\", \"<\", \">\", \"=\" or \")\""
         },
         {
             "source": "(foo: bar baz)",
diff -pruN 2.3.1-1/fixtures/ast/mediaQuery/Ratio.json 3.1.0-1/fixtures/ast/mediaQuery/Ratio.json
--- 2.3.1-1/fixtures/ast/mediaQuery/Ratio.json	2022-12-14 17:31:12.000000000 +0000
+++ 3.1.0-1/fixtures/ast/mediaQuery/Ratio.json	2024-12-06 17:25:18.000000000 +0000
@@ -2,88 +2,395 @@
     "basic ratio": {
         "source": "(foo:1/2)",
         "ast": {
-            "type": "MediaFeature",
-            "name": "foo",
-            "value": {
-                "type": "Ratio",
-                "left": "1",
-                "right": "2"
-            }
+            "type": "Condition",
+            "kind": "media",
+            "children": [
+                {
+                    "type": "Feature",
+                    "kind": "media",
+                    "name": "foo",
+                    "value": {
+                        "type": "Ratio",
+                        "left": {
+                            "type": "Number",
+                            "value": "1"
+                        },
+                        "right": {
+                            "type": "Number",
+                            "value": "2"
+                        }
+                    }
+                }
+            ]
         }
     },
-    "fractal": [
+    "fractional": [
         {
             "source": "(foo:2.5/3)",
             "ast": {
-                "type": "MediaFeature",
-                "name": "foo",
-                "value": {
-                    "type": "Ratio",
-                    "left": "2.5",
-                    "right": "3"
-                }
+                "type": "Condition",
+                "kind": "media",
+                "children": [
+                    {
+                        "type": "Feature",
+                        "kind": "media",
+                        "name": "foo",
+                        "value": {
+                            "type": "Ratio",
+                            "left": {
+                                "type": "Number",
+                                "value": "2.5"
+                            },
+                            "right": {
+                                "type": "Number",
+                                "value": "3"
+                            }
+                        }
+                    }
+                ]
             }
         },
         {
             "source": "(foo:3/1.6)",
             "ast": {
-                "type": "MediaFeature",
-                "name": "foo",
-                "value": {
-                    "type": "Ratio",
-                    "left": "3",
-                    "right": "1.6"
-                }
+                "type": "Condition",
+                "kind": "media",
+                "children": [
+                    {
+                        "type": "Feature",
+                        "kind": "media",
+                        "name": "foo",
+                        "value": {
+                            "type": "Ratio",
+                            "left": {
+                                "type": "Number",
+                                "value": "3"
+                            },
+                            "right": {
+                                "type": "Number",
+                                "value": "1.6"
+                            }
+                        }
+                    }
+                ]
             }
         },
         {
             "source": "(foo:2.5/1.6)",
             "ast": {
-                "type": "MediaFeature",
-                "name": "foo",
-                "value": {
-                    "type": "Ratio",
-                    "left": "2.5",
-                    "right": "1.6"
-                }
+                "type": "Condition",
+                "kind": "media",
+                "children": [
+                    {
+                        "type": "Feature",
+                        "kind": "media",
+                        "name": "foo",
+                        "value": {
+                            "type": "Ratio",
+                            "left": {
+                                "type": "Number",
+                                "value": "2.5"
+                            },
+                            "right": {
+                                "type": "Number",
+                                "value": "1.6"
+                            }
+                        }
+                    }
+                ]
             }
         }
     ],
-    "error": [
+    "out of range": [
         {
-            "source": "(foo: 1/)",
-            "offset": "        ^",
-            "error": "Number is expected"
+            "source": "(foo:0/1)",
+            "ast": {
+                "type": "Condition",
+                "kind": "media",
+                "children": [
+                    {
+                        "type": "Feature",
+                        "kind": "media",
+                        "name": "foo",
+                        "value": {
+                            "type": "Ratio",
+                            "left": {
+                                "type": "Number",
+                                "value": "0"
+                            },
+                            "right": {
+                                "type": "Number",
+                                "value": "1"
+                            }
+                        }
+                    }
+                ]
+            }
         },
         {
-            "source": "(foo: 0/1)",
-            "offset": "      ^",
-            "error": "Zero number is not allowed"
+            "source": "(foo:1e2/1)",
+            "ast": {
+                "type": "Condition",
+                "kind": "media",
+                "children": [
+                    {
+                        "type": "Feature",
+                        "kind": "media",
+                        "name": "foo",
+                        "value": {
+                            "type": "Ratio",
+                            "left": {
+                                "type": "Number",
+                                "value": "1e2"
+                            },
+                            "right": {
+                                "type": "Number",
+                                "value": "1"
+                            }
+                        }
+                    }
+                ]
+            }
         },
         {
-            "source": "(foo: 1e2/1)",
-            "offset": "       ^",
-            "error": "Unsigned number is expected"
+            "source": "(foo:-1/5)",
+            "ast": {
+                "type": "Condition",
+                "kind": "media",
+                "children": [
+                    {
+                        "type": "Feature",
+                        "kind": "media",
+                        "name": "foo",
+                        "value": {
+                            "type": "Ratio",
+                            "left": {
+                                "type": "Number",
+                                "value": "-1"
+                            },
+                            "right": {
+                                "type": "Number",
+                                "value": "5"
+                            }
+                        }
+                    }
+                ]
+            }
         },
         {
-            "source": "(foo: -1/5)",
-            "offset": "      ^",
-            "error": "Unsigned number is expected"
+            "source": "(foo:2/0)",
+            "ast": {
+                "type": "Condition",
+                "kind": "media",
+                "children": [
+                    {
+                        "type": "Feature",
+                        "kind": "media",
+                        "name": "foo",
+                        "value": {
+                            "type": "Ratio",
+                            "left": {
+                                "type": "Number",
+                                "value": "2"
+                            },
+                            "right": {
+                                "type": "Number",
+                                "value": "0"
+                            }
+                        }
+                    }
+                ]
+            }
         },
         {
-            "source": "(foo: 2/0)",
-            "offset": "        ^",
-            "error": "Zero number is not allowed"
+            "source": "(foo:1/1e2)",
+            "ast": {
+                "type": "Condition",
+                "kind": "media",
+                "children": [
+                    {
+                        "type": "Feature",
+                        "kind": "media",
+                        "name": "foo",
+                        "value": {
+                            "type": "Ratio",
+                            "left": {
+                                "type": "Number",
+                                "value": "1"
+                            },
+                            "right": {
+                                "type": "Number",
+                                "value": "1e2"
+                            }
+                        }
+                    }
+                ]
+            }
         },
         {
-            "source": "(foo: 1/1e2)",
-            "offset": "         ^",
-            "error": "Unsigned number is expected"
+            "source": "(foo:1/-5)",
+            "ast": {
+                "type": "Condition",
+                "kind": "media",
+                "children": [
+                    {
+                        "type": "Feature",
+                        "kind": "media",
+                        "name": "foo",
+                        "value": {
+                            "type": "Ratio",
+                            "left": {
+                                "type": "Number",
+                                "value": "1"
+                            },
+                            "right": {
+                                "type": "Number",
+                                "value": "-5"
+                            }
+                        }
+                    }
+                ]
+            }
+        }
+    ],
+    "usingn with functions": [
+        {
+            "source": "(foo:1/calc(2 + 3))",
+            "ast": {
+                "type": "Condition",
+                "kind": "media",
+                "children": [
+                    {
+                        "type": "Feature",
+                        "kind": "media",
+                        "name": "foo",
+                        "value": {
+                            "type": "Ratio",
+                            "left": {
+                                "type": "Number",
+                                "value": "1"
+                            },
+                            "right": {
+                                "type": "Function",
+                                "name": "calc",
+                                "children": [
+                                    {
+                                        "type": "Number",
+                                        "value": "2"
+                                    },
+                                    {
+                                        "type": "Operator",
+                                        "value": " + "
+                                    },
+                                    {
+                                        "type": "Number",
+                                        "value": "3"
+                                    }
+                                ]
+                            }
+                        }
+                    }
+                ]
+            }
+        },
+        {
+            "source": "(foo:calc(2 + 3)/1)",
+            "ast": {
+                "type": "Condition",
+                "kind": "media",
+                "children": [
+                    {
+                        "type": "Feature",
+                        "kind": "media",
+                        "name": "foo",
+                        "value": {
+                            "type": "Ratio",
+                            "left": {
+                                "type": "Function",
+                                "name": "calc",
+                                "children": [
+                                    {
+                                        "type": "Number",
+                                        "value": "2"
+                                    },
+                                    {
+                                        "type": "Operator",
+                                        "value": " + "
+                                    },
+                                    {
+                                        "type": "Number",
+                                        "value": "3"
+                                    }
+                                ]
+                            },
+                            "right": {
+                                "type": "Number",
+                                "value": "1"
+                            }
+                        }
+                    }
+                ]
+            }
         },
         {
-            "source": "(foo: 1/-5)",
+            "source": "(foo:calc(2 + 3)/calc(2 + 3))",
+            "ast": {
+                "type": "Condition",
+                "kind": "media",
+                "children": [
+                    {
+                        "type": "Feature",
+                        "kind": "media",
+                        "name": "foo",
+                        "value": {
+                            "type": "Ratio",
+                            "left": {
+                                "type": "Function",
+                                "name": "calc",
+                                "children": [
+                                    {
+                                        "type": "Number",
+                                        "value": "2"
+                                    },
+                                    {
+                                        "type": "Operator",
+                                        "value": " + "
+                                    },
+                                    {
+                                        "type": "Number",
+                                        "value": "3"
+                                    }
+                                ]
+                            },
+                            "right": {
+                                "type": "Function",
+                                "name": "calc",
+                                "children": [
+                                    {
+                                        "type": "Number",
+                                        "value": "2"
+                                    },
+                                    {
+                                        "type": "Operator",
+                                        "value": " + "
+                                    },
+                                    {
+                                        "type": "Number",
+                                        "value": "3"
+                                    }
+                                ]
+                            }
+                        }
+                    }
+                ]
+            }
+        }
+    ],
+    "error": [
+        {
+            "source": "(foo: 1/)",
             "offset": "        ^",
-            "error": "Unsigned number is expected"
+            "error": "Number of function is expected"
         }
     ]
 }
diff -pruN 2.3.1-1/fixtures/ast/rule/Rule.json 3.1.0-1/fixtures/ast/rule/Rule.json
--- 2.3.1-1/fixtures/ast/rule/Rule.json	2022-12-14 17:31:12.000000000 +0000
+++ 3.1.0-1/fixtures/ast/rule/Rule.json	2024-12-06 17:25:18.000000000 +0000
@@ -1,5 +1,5 @@
 {
-    "ruleset.0": {
+    "rule.0": {
         "source": "s{p:v}",
         "ast": {
             "type": "Rule",
@@ -38,7 +38,7 @@
             }
         }
     },
-    "ruleset.1": {
+    "rule.1": {
         "source": "s{p0:v0;p1:v1}",
         "ast": {
             "type": "Rule",
@@ -91,7 +91,7 @@
             }
         }
     },
-    "ruleset.2": {
+    "rule.2": {
         "source": "s0,s1{p:v}",
         "ast": {
             "type": "Rule",
@@ -139,7 +139,7 @@
             }
         }
     },
-    "ruleset.3": {
+    "rule.3": {
         "source": "s0,s1{p0:v0;p1:v1}",
         "ast": {
             "type": "Rule",
@@ -201,103 +201,7 @@
             }
         }
     },
-    "ruleset.4": {
-        "source": ".test{filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='images/transparent-border.png',sizingMethod='scale');color:red}",
-        "ast": {
-            "type": "Rule",
-            "prelude": {
-                "type": "SelectorList",
-                "children": [
-                    {
-                        "type": "Selector",
-                        "children": [
-                            {
-                                "type": "ClassSelector",
-                                "name": "test"
-                            }
-                        ]
-                    }
-                ]
-            },
-            "block": {
-                "type": "Block",
-                "children": [
-                    {
-                        "type": "Declaration",
-                        "important": false,
-                        "property": "filter",
-                        "value": {
-                            "type": "Raw",
-                            "value": "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='images/transparent-border.png',sizingMethod='scale')"
-                        }
-                    },
-                    {
-                        "type": "Declaration",
-                        "important": false,
-                        "property": "color",
-                        "value": {
-                            "type": "Value",
-                            "children": [
-                                {
-                                    "type": "Identifier",
-                                    "name": "red"
-                                }
-                            ]
-                        }
-                    }
-                ]
-            }
-        }
-    },
-    "ruleset.5": {
-        "source": ".test{color:red;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='images/transparent-border.png',sizingMethod='scale') progid:DXImageTransform.Microsoft.AlphaImageLoader(src='test.png',sizingMethod='test')}",
-        "ast": {
-            "type": "Rule",
-            "prelude": {
-                "type": "SelectorList",
-                "children": [
-                    {
-                        "type": "Selector",
-                        "children": [
-                            {
-                                "type": "ClassSelector",
-                                "name": "test"
-                            }
-                        ]
-                    }
-                ]
-            },
-            "block": {
-                "type": "Block",
-                "children": [
-                    {
-                        "type": "Declaration",
-                        "important": false,
-                        "property": "color",
-                        "value": {
-                            "type": "Value",
-                            "children": [
-                                {
-                                    "type": "Identifier",
-                                    "name": "red"
-                                }
-                            ]
-                        }
-                    },
-                    {
-                        "type": "Declaration",
-                        "important": false,
-                        "property": "filter",
-                        "value": {
-                            "type": "Raw",
-                            "value": "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='images/transparent-border.png',sizingMethod='scale') progid:DXImageTransform.Microsoft.AlphaImageLoader(src='test.png',sizingMethod='test')"
-                        }
-                    }
-                ]
-            }
-        }
-    },
-    "ruleset.s.6": {
+    "rule.s.6": {
         "source": ".test\n{\rcolor:red;\r\n}",
         "generate": ".test{color:red}",
         "ast": {
@@ -376,7 +280,7 @@
             }
         }
     },
-    "ruleset.c.0": {
+    "rule.c.0": {
         "source": "s/*test*/{/*test*/p/*test*/:/*test*/v/*test*/}",
         "generate": "s{p:v}",
         "ast": {
@@ -416,7 +320,7 @@
             }
         }
     },
-    "ruleset.c.1": {
+    "rule.c.1": {
         "source": "s/*test*/{/*test*/p0/*test*/:/*test*/v0/*test*/;/*test*/p1/*test*/:/*test*/v1/*test*/}",
         "generate": "s{p0:v0;p1:v1}",
         "ast": {
@@ -470,7 +374,7 @@
             }
         }
     },
-    "ruleset.c.2": {
+    "rule.c.2": {
         "source": "s0/*test*/,/*test*/s1/*test*/{/*test*/p/*test*/:/*test*/v/*test*/}",
         "generate": "s0,s1{p:v}",
         "ast": {
@@ -519,7 +423,7 @@
             }
         }
     },
-    "ruleset.c.3": {
+    "rule.c.3": {
         "source": "s0/*test*/,/*test*/s1/*test*/{/*test*/p0/*test*/:/*test*/v0/*test*/;/*test*/p1/*test*/:/*test*/v1/*test*/}",
         "generate": "s0,s1{p0:v0;p1:v1}",
         "ast": {
@@ -582,7 +486,7 @@
             }
         }
     },
-    "ruleset.s.0": {
+    "rule.s.0": {
         "source": "s  {  p  :  v  }",
         "generate": "s{p:v}",
         "ast": {
@@ -622,7 +526,7 @@
             }
         }
     },
-    "ruleset.s.1": {
+    "rule.s.1": {
         "source": "s  {  p0  :  v0  ;  p1  :  v1  }",
         "generate": "s{p0:v0;p1:v1}",
         "ast": {
@@ -676,7 +580,7 @@
             }
         }
     },
-    "ruleset.s.2": {
+    "rule.s.2": {
         "source": "s0  ,  s1  {  p  :  v  }",
         "generate": "s0,s1{p:v}",
         "ast": {
@@ -725,7 +629,7 @@
             }
         }
     },
-    "ruleset.s.3": {
+    "rule.s.3": {
         "source": "s0  ,  s1  {  p0  :  v0  ;  p1  :  v1  }",
         "generate": "s0,s1{p0:v0;p1:v1}",
         "ast": {
@@ -788,104 +692,6 @@
             }
         }
     },
-    "ruleset.s.4": {
-        "source": ".test {\n    filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='images/transparent-border.png',sizingMethod='scale');\n    color:red\n}",
-        "generate": ".test{filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='images/transparent-border.png',sizingMethod='scale');color:red}",
-        "ast": {
-            "type": "Rule",
-            "prelude": {
-                "type": "SelectorList",
-                "children": [
-                    {
-                        "type": "Selector",
-                        "children": [
-                            {
-                                "type": "ClassSelector",
-                                "name": "test"
-                            }
-                        ]
-                    }
-                ]
-            },
-            "block": {
-                "type": "Block",
-                "children": [
-                    {
-                        "type": "Declaration",
-                        "important": false,
-                        "property": "filter",
-                        "value": {
-                            "type": "Raw",
-                            "value": "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='images/transparent-border.png',sizingMethod='scale')"
-                        }
-                    },
-                    {
-                        "type": "Declaration",
-                        "important": false,
-                        "property": "color",
-                        "value": {
-                            "type": "Value",
-                            "children": [
-                                {
-                                    "type": "Identifier",
-                                    "name": "red"
-                                }
-                            ]
-                        }
-                    }
-                ]
-            }
-        }
-    },
-    "ruleset.s.5": {
-        "source": ".test {\n    color:red;\n    filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='images/transparent-border.png',sizingMethod='scale')\n           progid:DXImageTransform.Microsoft.AlphaImageLoader(src='test.png',sizingMethod='test')\n}",
-        "generate": ".test{color:red;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='images/transparent-border.png',sizingMethod='scale')\n           progid:DXImageTransform.Microsoft.AlphaImageLoader(src='test.png',sizingMethod='test')}",
-        "ast": {
-            "type": "Rule",
-            "prelude": {
-                "type": "SelectorList",
-                "children": [
-                    {
-                        "type": "Selector",
-                        "children": [
-                            {
-                                "type": "ClassSelector",
-                                "name": "test"
-                            }
-                        ]
-                    }
-                ]
-            },
-            "block": {
-                "type": "Block",
-                "children": [
-                    {
-                        "type": "Declaration",
-                        "important": false,
-                        "property": "color",
-                        "value": {
-                            "type": "Value",
-                            "children": [
-                                {
-                                    "type": "Identifier",
-                                    "name": "red"
-                                }
-                            ]
-                        }
-                    },
-                    {
-                        "type": "Declaration",
-                        "important": false,
-                        "property": "filter",
-                        "value": {
-                            "type": "Raw",
-                            "value": "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='images/transparent-border.png',sizingMethod='scale')\n           progid:DXImageTransform.Microsoft.AlphaImageLoader(src='test.png',sizingMethod='test')"
-                        }
-                    }
-                ]
-            }
-        }
-    },
     "value.color.ident.0": {
         "source": "s{p:yellow}",
         "ast": {
@@ -996,5 +802,30 @@
                 ]
             }
         }
+    },
+    "unclosed block": {
+        "source": "selector { ",
+        "generate": "selector{}",
+        "ast": {
+            "type": "Rule",
+            "prelude": {
+                "type": "SelectorList",
+                "children": [
+                    {
+                        "type": "Selector",
+                        "children": [
+                            {
+                                "type": "TypeSelector",
+                                "name": "selector"
+                            }
+                        ]
+                    }
+                ]
+            },
+            "block": {
+                "type": "Block",
+                "children": []
+            }
+        }
     }
 }
diff -pruN 2.3.1-1/fixtures/ast/rule/legacy.json 3.1.0-1/fixtures/ast/rule/legacy.json
--- 2.3.1-1/fixtures/ast/rule/legacy.json	1970-01-01 00:00:00.000000000 +0000
+++ 3.1.0-1/fixtures/ast/rule/legacy.json	2024-12-06 17:25:18.000000000 +0000
@@ -0,0 +1,196 @@
+{
+    "rule.4": {
+        "source": ".test{filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='images/transparent-border.png',sizingMethod='scale');color:red}",
+        "ast": {
+            "type": "Rule",
+            "prelude": {
+                "type": "SelectorList",
+                "children": [
+                    {
+                        "type": "Selector",
+                        "children": [
+                            {
+                                "type": "ClassSelector",
+                                "name": "test"
+                            }
+                        ]
+                    }
+                ]
+            },
+            "block": {
+                "type": "Block",
+                "children": [
+                    {
+                        "type": "Declaration",
+                        "important": false,
+                        "property": "filter",
+                        "value": {
+                            "type": "Raw",
+                            "value": "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='images/transparent-border.png',sizingMethod='scale')"
+                        }
+                    },
+                    {
+                        "type": "Declaration",
+                        "important": false,
+                        "property": "color",
+                        "value": {
+                            "type": "Value",
+                            "children": [
+                                {
+                                    "type": "Identifier",
+                                    "name": "red"
+                                }
+                            ]
+                        }
+                    }
+                ]
+            }
+        }
+    },
+    "rule.5": {
+        "source": ".test{color:red;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='images/transparent-border.png',sizingMethod='scale') progid:DXImageTransform.Microsoft.AlphaImageLoader(src='test.png',sizingMethod='test')}",
+        "ast": {
+            "type": "Rule",
+            "prelude": {
+                "type": "SelectorList",
+                "children": [
+                    {
+                        "type": "Selector",
+                        "children": [
+                            {
+                                "type": "ClassSelector",
+                                "name": "test"
+                            }
+                        ]
+                    }
+                ]
+            },
+            "block": {
+                "type": "Block",
+                "children": [
+                    {
+                        "type": "Declaration",
+                        "important": false,
+                        "property": "color",
+                        "value": {
+                            "type": "Value",
+                            "children": [
+                                {
+                                    "type": "Identifier",
+                                    "name": "red"
+                                }
+                            ]
+                        }
+                    },
+                    {
+                        "type": "Declaration",
+                        "important": false,
+                        "property": "filter",
+                        "value": {
+                            "type": "Raw",
+                            "value": "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='images/transparent-border.png',sizingMethod='scale') progid:DXImageTransform.Microsoft.AlphaImageLoader(src='test.png',sizingMethod='test')"
+                        }
+                    }
+                ]
+            }
+        }
+    },
+    "rule.s.4": {
+        "source": ".test {\n    filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='images/transparent-border.png',sizingMethod='scale');\n    color:red\n}",
+        "generate": ".test{filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='images/transparent-border.png',sizingMethod='scale');color:red}",
+        "ast": {
+            "type": "Rule",
+            "prelude": {
+                "type": "SelectorList",
+                "children": [
+                    {
+                        "type": "Selector",
+                        "children": [
+                            {
+                                "type": "ClassSelector",
+                                "name": "test"
+                            }
+                        ]
+                    }
+                ]
+            },
+            "block": {
+                "type": "Block",
+                "children": [
+                    {
+                        "type": "Declaration",
+                        "important": false,
+                        "property": "filter",
+                        "value": {
+                            "type": "Raw",
+                            "value": "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='images/transparent-border.png',sizingMethod='scale')"
+                        }
+                    },
+                    {
+                        "type": "Declaration",
+                        "important": false,
+                        "property": "color",
+                        "value": {
+                            "type": "Value",
+                            "children": [
+                                {
+                                    "type": "Identifier",
+                                    "name": "red"
+                                }
+                            ]
+                        }
+                    }
+                ]
+            }
+        }
+    },
+    "rule.s.5": {
+        "source": ".test {\n    color:red;\n    filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='images/transparent-border.png',sizingMethod='scale')\n           progid:DXImageTransform.Microsoft.AlphaImageLoader(src='test.png',sizingMethod='test')\n}",
+        "generate": ".test{color:red;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='images/transparent-border.png',sizingMethod='scale')\n           progid:DXImageTransform.Microsoft.AlphaImageLoader(src='test.png',sizingMethod='test')}",
+        "ast": {
+            "type": "Rule",
+            "prelude": {
+                "type": "SelectorList",
+                "children": [
+                    {
+                        "type": "Selector",
+                        "children": [
+                            {
+                                "type": "ClassSelector",
+                                "name": "test"
+                            }
+                        ]
+                    }
+                ]
+            },
+            "block": {
+                "type": "Block",
+                "children": [
+                    {
+                        "type": "Declaration",
+                        "important": false,
+                        "property": "color",
+                        "value": {
+                            "type": "Value",
+                            "children": [
+                                {
+                                    "type": "Identifier",
+                                    "name": "red"
+                                }
+                            ]
+                        }
+                    },
+                    {
+                        "type": "Declaration",
+                        "important": false,
+                        "property": "filter",
+                        "value": {
+                            "type": "Raw",
+                            "value": "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='images/transparent-border.png',sizingMethod='scale')\n           progid:DXImageTransform.Microsoft.AlphaImageLoader(src='test.png',sizingMethod='test')"
+                        }
+                    }
+                ]
+            }
+        }
+    }
+}
diff -pruN 2.3.1-1/fixtures/ast/rule/nesting.json 3.1.0-1/fixtures/ast/rule/nesting.json
--- 2.3.1-1/fixtures/ast/rule/nesting.json	2022-12-14 17:31:12.000000000 +0000
+++ 3.1.0-1/fixtures/ast/rule/nesting.json	2024-12-06 17:25:18.000000000 +0000
@@ -183,16 +183,23 @@
                                     "children": [
                                         {
                                             "type": "MediaQuery",
-                                            "children": [
-                                                {
-                                                    "type": "MediaFeature",
-                                                    "name": "orientation",
-                                                    "value": {
-                                                        "type": "Identifier",
-                                                        "name": "landscape"
+                                            "modifier": null,
+                                            "mediaType": null,
+                                            "condition": {
+                                                "type": "Condition",
+                                                "kind": "media",
+                                                "children": [
+                                                    {
+                                                        "type": "Feature",
+                                                        "kind": "media",
+                                                        "name": "orientation",
+                                                        "value": {
+                                                            "type": "Identifier",
+                                                            "name": "landscape"
+                                                        }
                                                     }
-                                                }
-                                            ]
+                                                ]
+                                            }
                                         }
                                     ]
                                 }
@@ -226,17 +233,24 @@
                                                 "children": [
                                                     {
                                                         "type": "MediaQuery",
-                                                        "children": [
-                                                            {
-                                                                "type": "MediaFeature",
-                                                                "name": "min-width",
-                                                                "value": {
-                                                                    "type": "Dimension",
-                                                                    "value": "1024",
-                                                                    "unit": "px"
+                                                        "modifier": null,
+                                                        "mediaType": null,
+                                                        "condition": {
+                                                            "type": "Condition",
+                                                            "kind": "media",
+                                                            "children": [
+                                                                {
+                                                                    "type": "Feature",
+                                                                    "kind": "media",
+                                                                    "name": "min-width",
+                                                                    "value": {
+                                                                        "type": "Dimension",
+                                                                        "value": "1024",
+                                                                        "unit": "px"
+                                                                    }
                                                                 }
-                                                            }
-                                                        ]
+                                                            ]
+                                                        }
                                                     }
                                                 ]
                                             }
@@ -312,20 +326,24 @@
                             "type": "AtrulePrelude",
                             "children": [
                                 {
-                                    "type": "Parentheses",
+                                    "type": "Condition",
+                                    "kind": "supports",
                                     "children": [
                                         {
-                                            "type": "Declaration",
-                                            "important": false,
-                                            "property": "prop",
-                                            "value": {
-                                                "type": "Value",
-                                                "children": [
-                                                    {
-                                                        "type": "Identifier",
-                                                        "name": "value"
-                                                    }
-                                                ]
+                                            "type": "SupportsDeclaration",
+                                            "declaration": {
+                                                "type": "Declaration",
+                                                "important": false,
+                                                "property": "prop",
+                                                "value": {
+                                                    "type": "Value",
+                                                    "children": [
+                                                        {
+                                                            "type": "Identifier",
+                                                            "name": "value"
+                                                        }
+                                                    ]
+                                                }
                                             }
                                         }
                                     ]
@@ -356,20 +374,138 @@
                                         "type": "AtrulePrelude",
                                         "children": [
                                             {
-                                                "type": "Parentheses",
+                                                "type": "Condition",
+                                                "kind": "supports",
+                                                "children": [
+                                                    {
+                                                        "type": "SupportsDeclaration",
+                                                        "declaration": {
+                                                            "type": "Declaration",
+                                                            "important": false,
+                                                            "property": "prop2",
+                                                            "value": {
+                                                                "type": "Value",
+                                                                "children": [
+                                                                    {
+                                                                        "type": "Identifier",
+                                                                        "name": "value2"
+                                                                    }
+                                                                ]
+                                                            }
+                                                        }
+                                                    }
+                                                ]
+                                            }
+                                        ]
+                                    },
+                                    "block": {
+                                        "type": "Block",
+                                        "children": [
+                                            {
+                                                "type": "Declaration",
+                                                "important": false,
+                                                "property": "color",
+                                                "value": {
+                                                    "type": "Value",
+                                                    "children": [
+                                                        {
+                                                            "type": "Identifier",
+                                                            "name": "green"
+                                                        }
+                                                    ]
+                                                }
+                                            }
+                                        ]
+                                    }
+                                }
+                            ]
+                        }
+                    }
+                ]
+            }
+        }
+    },
+    "nested @container": {
+        "source": "selector { @container card (inline-size > 30em) { @container style(--responsive: true) { color: green; } } }",
+        "generate": "selector{@container card (inline-size>30em){@container style(--responsive: true){color:green}}}",
+        "ast": {
+            "type": "Rule",
+            "prelude": {
+                "type": "SelectorList",
+                "children": [
+                    {
+                        "type": "Selector",
+                        "children": [
+                            {
+                                "type": "TypeSelector",
+                                "name": "selector"
+                            }
+                        ]
+                    }
+                ]
+            },
+            "block": {
+                "type": "Block",
+                "children": [
+                    {
+                        "type": "Atrule",
+                        "name": "container",
+                        "prelude": {
+                            "type": "AtrulePrelude",
+                            "children": [
+                                {
+                                    "type": "Identifier",
+                                    "name": "card"
+                                },
+                                {
+                                    "type": "Condition",
+                                    "kind": "container",
+                                    "children": [
+                                        {
+                                            "type": "FeatureRange",
+                                            "kind": "container",
+                                            "left": {
+                                                "type": "Identifier",
+                                                "name": "inline-size"
+                                            },
+                                            "leftComparison": ">",
+                                            "middle": {
+                                                "type": "Dimension",
+                                                "value": "30",
+                                                "unit": "em"
+                                            },
+                                            "rightComparison": null,
+                                            "right": null
+                                        }
+                                    ]
+                                }
+                            ]
+                        },
+                        "block": {
+                            "type": "Block",
+                            "children": [
+                                {
+                                    "type": "Atrule",
+                                    "name": "container",
+                                    "prelude": {
+                                        "type": "AtrulePrelude",
+                                        "children": [
+                                            {
+                                                "type": "Condition",
+                                                "kind": "container",
                                                 "children": [
                                                     {
-                                                        "type": "Declaration",
-                                                        "important": false,
-                                                        "property": "prop2",
+                                                        "type": "FeatureFunction",
+                                                        "kind": "container",
+                                                        "feature": "style",
                                                         "value": {
-                                                            "type": "Value",
-                                                            "children": [
-                                                                {
-                                                                    "type": "Identifier",
-                                                                    "name": "value2"
-                                                                }
-                                                            ]
+                                                            "type": "Declaration",
+                                                            "important": false,
+                                                            "property": "--responsive",
+                                                            "value": {
+                                                                "type": "Raw",
+                                                                "value": " true"
+                                                            }
                                                         }
                                                     }
                                                 ]
@@ -395,6 +531,56 @@
                                             }
                                         ]
                                     }
+                                }
+                            ]
+                        }
+                    }
+                ]
+            }
+        }
+    },
+    "nested @starting-style": {
+        "source": "selector { @starting-style { color: red; } }",
+        "generate": "selector{@starting-style{color:red}}",
+        "ast": {
+            "type": "Rule",
+            "prelude": {
+                "type": "SelectorList",
+                "children": [
+                    {
+                        "type": "Selector",
+                        "children": [
+                            {
+                                "type": "TypeSelector",
+                                "name": "selector"
+                            }
+                        ]
+                    }
+                ]
+            },
+            "block": {
+                "type": "Block",
+                "children": [
+                    {
+                        "type": "Atrule",
+                        "name": "starting-style",
+                        "prelude": null,
+                        "block": {
+                            "type": "Block",
+                            "children": [
+                                {
+                                    "type": "Declaration",
+                                    "important": false,
+                                    "property": "color",
+                                    "value": {
+                                        "type": "Value",
+                                        "children": [
+                                            {
+                                                "type": "Identifier",
+                                                "name": "red"
+                                            }
+                                        ]
+                                    }
                                 }
                             ]
                         }
diff -pruN 2.3.1-1/fixtures/ast/selector/functional-pseudo/has.json 3.1.0-1/fixtures/ast/selector/functional-pseudo/has.json
--- 2.3.1-1/fixtures/ast/selector/functional-pseudo/has.json	2022-12-14 17:31:12.000000000 +0000
+++ 3.1.0-1/fixtures/ast/selector/functional-pseudo/has.json	2024-12-06 17:25:18.000000000 +0000
@@ -22,6 +22,22 @@
             ]
         }
     },
+    "no argument": {
+        "source": ":has",
+        "ast": {
+            "type": "PseudoClassSelector",
+            "name": "has",
+            "children": null
+        }
+    },
+    "empty argument": {
+        "source": ":has()",
+        "ast": {
+            "type": "PseudoClassSelector",
+            "name": "has",
+            "children": []
+        }
+    },
     "negation with selector group": {
         "source": ":has(.a,.b.c)",
         "ast": {
diff -pruN 2.3.1-1/fixtures/ast/selector/functional-pseudo/host-context.json 3.1.0-1/fixtures/ast/selector/functional-pseudo/host-context.json
--- 2.3.1-1/fixtures/ast/selector/functional-pseudo/host-context.json	2022-12-14 17:31:12.000000000 +0000
+++ 3.1.0-1/fixtures/ast/selector/functional-pseudo/host-context.json	2024-12-06 17:25:18.000000000 +0000
@@ -17,6 +17,22 @@
             ]
         }
     },
+    "no argument": {
+        "source": ":host-context",
+        "ast": {
+            "type": "PseudoClassSelector",
+            "name": "host-context",
+            "children": null
+        }
+    },
+    "empty argument": {
+        "source": ":host-context()",
+        "ast": {
+            "type": "PseudoClassSelector",
+            "name": "host-context",
+            "children": []
+        }
+    },
     "spaces around selector": {
         "source": ":host-context(  .a.b  )",
         "generate": ":host-context(.a.b)",
diff -pruN 2.3.1-1/fixtures/ast/selector/functional-pseudo/host.json 3.1.0-1/fixtures/ast/selector/functional-pseudo/host.json
--- 2.3.1-1/fixtures/ast/selector/functional-pseudo/host.json	2022-12-14 17:31:12.000000000 +0000
+++ 3.1.0-1/fixtures/ast/selector/functional-pseudo/host.json	2024-12-06 17:25:18.000000000 +0000
@@ -25,6 +25,14 @@
             "children": null
         }
     },
+    "empty argument": {
+        "source": ":host()",
+        "ast": {
+            "type": "PseudoClassSelector",
+            "name": "host",
+            "children": []
+        }
+    },
     "spaces around selector": {
         "source": ":host(  .a.b  )",
         "generate": ":host(.a.b)",
@@ -68,11 +76,6 @@
     },
     "error": [
         {
-            "source": ":host()",
-            "offset": "      ^",
-            "error": "Selector is expected"
-        },
-        {
             "source": ":host(.a{)",
             "offset": "        ^",
             "error": "\")\" is expected"
diff -pruN 2.3.1-1/fixtures/ast/selector/functional-pseudo/lang.json 3.1.0-1/fixtures/ast/selector/functional-pseudo/lang.json
--- 2.3.1-1/fixtures/ast/selector/functional-pseudo/lang.json	2022-12-14 17:31:12.000000000 +0000
+++ 3.1.0-1/fixtures/ast/selector/functional-pseudo/lang.json	2024-12-06 17:25:18.000000000 +0000
@@ -1,5 +1,5 @@
 {
-    "basic": {
+    "ident": {
         "source": ":lang(en)",
         "ast": {
             "type": "PseudoClassSelector",
@@ -12,6 +12,50 @@
             ]
         }
     },
+    "string": {
+        "source": ":lang('en')",
+        "generate": ":lang(\"en\")",
+        "ast": {
+            "type": "PseudoClassSelector",
+            "name": "lang",
+            "children": [
+                {
+                    "type": "String",
+                    "value": "en"
+                }
+            ]
+        }
+    },
+    "list": {
+        "source": ":lang( 'en', de-DE ,  \"es\" )",
+        "generate": ":lang(\"en\",de-DE,\"es\")",
+        "ast": {
+            "type": "PseudoClassSelector",
+            "name": "lang",
+            "children": [
+                {
+                    "type": "String",
+                    "value": "en"
+                },
+                {
+                    "type": "Operator",
+                    "value": ","
+                },
+                {
+                    "type": "Identifier",
+                    "name": "de-DE"
+                },
+                {
+                    "type": "Operator",
+                    "value": ","
+                },
+                {
+                    "type": "String",
+                    "value": "es"
+                }
+            ]
+        }
+    },
     "with spaces and comments": {
         "source": ":lang(  en /* test */ )",
         "generate": ":lang(en)",
@@ -39,16 +83,33 @@
             ]
         }
     },
+    "not an error": {
+        "source": ":lang(en en)",
+        "ast": {
+            "type": "PseudoClassSelector",
+            "name": "lang",
+            "children": [
+                {
+                    "type": "Identifier",
+                    "name": "en"
+                },
+                {
+                    "type": "Identifier",
+                    "name": "en"
+                }
+            ]
+        }
+    },
     "error": [
         {
             "source": ":lang(1)",
             "offset": "      ^",
-            "error": "Identifier is expected"
+            "error": "Identifier, string or comma is expected"
         },
         {
-            "source": ":lang(en en)",
-            "offset": "         ^",
-            "error": "\")\" is expected"
+            "source": ":lang(var(--test)) {}",
+            "offset": "      ^",
+            "error": "Identifier, string or comma is expected"
         }
     ]
 }
diff -pruN 2.3.1-1/fixtures/ast/selector/functional-pseudo/slotted.json 3.1.0-1/fixtures/ast/selector/functional-pseudo/slotted.json
--- 2.3.1-1/fixtures/ast/selector/functional-pseudo/slotted.json	2022-12-14 17:31:12.000000000 +0000
+++ 3.1.0-1/fixtures/ast/selector/functional-pseudo/slotted.json	2024-12-06 17:25:18.000000000 +0000
@@ -17,6 +17,22 @@
             ]
         }
     },
+    "no argument": {
+        "source": "::slotted",
+        "ast": {
+            "type": "PseudoElementSelector",
+            "name": "slotted",
+            "children": null
+        }
+    },
+    "empty argument": {
+        "source": "::slotted()",
+        "ast": {
+            "type": "PseudoElementSelector",
+            "name": "slotted",
+            "children": []
+        }
+    },
     "spaces around selector": {
         "source": "::slotted(  .a.b  )",
         "generate": "::slotted(.a.b)",
diff -pruN 2.3.1-1/fixtures/ast/stylesheet/StyleSheet.json 3.1.0-1/fixtures/ast/stylesheet/StyleSheet.json
--- 2.3.1-1/fixtures/ast/stylesheet/StyleSheet.json	2022-12-14 17:31:12.000000000 +0000
+++ 3.1.0-1/fixtures/ast/stylesheet/StyleSheet.json	2024-12-06 17:25:18.000000000 +0000
@@ -149,12 +149,9 @@
                                 "children": [
                                     {
                                         "type": "MediaQuery",
-                                        "children": [
-                                            {
-                                                "type": "Identifier",
-                                                "name": "test"
-                                            }
-                                        ]
+                                        "modifier": null,
+                                        "mediaType": "test",
+                                        "condition": null
                                     }
                                 ]
                             }
@@ -246,12 +243,9 @@
                                 "children": [
                                     {
                                         "type": "MediaQuery",
-                                        "children": [
-                                            {
-                                                "type": "Identifier",
-                                                "name": "test"
-                                            }
-                                        ]
+                                        "modifier": null,
+                                        "mediaType": "test",
+                                        "condition": null
                                     }
                                 ]
                             }
diff -pruN 2.3.1-1/fixtures/ast/stylesheet/errors.json 3.1.0-1/fixtures/ast/stylesheet/errors.json
--- 2.3.1-1/fixtures/ast/stylesheet/errors.json	2022-12-14 17:31:12.000000000 +0000
+++ 3.1.0-1/fixtures/ast/stylesheet/errors.json	2024-12-06 17:25:18.000000000 +0000
@@ -86,11 +86,6 @@
             "error": "\")\" is expected"
         },
         {
-            "source": ":lang(var(--test)) {}",
-            "offset": "         ^",
-            "error": "Identifier is expected but function found"
-        },
-        {
             "source": "[",
             "offset": " ^",
             "error": "Unexpected end of input"
diff -pruN 2.3.1-1/fixtures/ast/stylesheet/tolerant.json 3.1.0-1/fixtures/ast/stylesheet/tolerant.json
--- 2.3.1-1/fixtures/ast/stylesheet/tolerant.json	2022-12-14 17:31:12.000000000 +0000
+++ 3.1.0-1/fixtures/ast/stylesheet/tolerant.json	2024-12-06 17:25:18.000000000 +0000
@@ -131,19 +131,123 @@
     },
     "unclosed unknown functional-pseudo in selector": {
         "source": " foo:bar(x {}",
-        "generate": "foo:bar(x{}",
+        "generate": "foo:bar(x {}",
+        "ast": {
+            "type": "StyleSheet",
+            "children": [
+                {
+                    "type": "Raw",
+                    "value": "foo:bar(x {}"
+                }
+            ]
+        }
+    },
+    "parser should respect bracket balance over stop token": {
+        "skipRoundtrip": "broken round-trip since generator adds } to the end, not critical and can be fixed in the future",
+        "source": ".a{--x:(;color:green;}.b{color:red;--y:);width:10px}",
+        "generate": ".a{--x:(;color:green;}.b{color:red;--y:);width:10px}}",
+        "ast": {
+            "type": "StyleSheet",
+            "children": [
+                {
+                    "type": "Rule",
+                    "loc": null,
+                    "prelude": {
+                        "type": "SelectorList",
+                        "loc": null,
+                        "children": [
+                            {
+                                "type": "Selector",
+                                "loc": null,
+                                "children": [
+                                    {
+                                        "type": "ClassSelector",
+                                        "loc": null,
+                                        "name": "a"
+                                    }
+                                ]
+                            }
+                        ]
+                    },
+                    "block": {
+                        "type": "Block",
+                        "loc": null,
+                        "children": [
+                            {
+                                "type": "Declaration",
+                                "loc": null,
+                                "important": false,
+                                "property": "--x",
+                                "value": {
+                                    "type": "Raw",
+                                    "loc": null,
+                                    "value": "(;color:green;}.b{color:red;--y:);width:10px}"
+                                }
+                            }
+                        ]
+                    }
+                }
+            ]
+        }
+    },
+    "parser should respect bracket balance over stop token #2": {
+        "source": ".a{--x:(;color:green;}.b{color:red;--y:});width:10px}",
         "ast": {
             "type": "StyleSheet",
             "children": [
                 {
                     "type": "Rule",
+                    "loc": null,
                     "prelude": {
-                        "type": "Raw",
-                        "value": "foo:bar(x"
+                        "type": "SelectorList",
+                        "loc": null,
+                        "children": [
+                            {
+                                "type": "Selector",
+                                "loc": null,
+                                "children": [
+                                    {
+                                        "type": "ClassSelector",
+                                        "loc": null,
+                                        "name": "a"
+                                    }
+                                ]
+                            }
+                        ]
                     },
                     "block": {
                         "type": "Block",
-                        "children": []
+                        "loc": null,
+                        "children": [
+                            {
+                                "type": "Declaration",
+                                "loc": null,
+                                "important": false,
+                                "property": "--x",
+                                "value": {
+                                    "type": "Raw",
+                                    "loc": null,
+                                    "value": "(;color:green;}.b{color:red;--y:})"
+                                }
+                            },
+                            {
+                                "type": "Declaration",
+                                "loc": null,
+                                "important": false,
+                                "property": "width",
+                                "value": {
+                                    "type": "Value",
+                                    "children": [
+                                        {
+                                            "type": "Dimension",
+                                            "loc": null,
+                                            "value": "10",
+                                            "unit": "px"
+                                        }
+                                    ]
+                                }
+                            }
+                        ]
                     }
                 }
             ]
diff -pruN 2.3.1-1/fixtures/ast/value/Parentheses.json 3.1.0-1/fixtures/ast/value/Parentheses.json
--- 2.3.1-1/fixtures/ast/value/Parentheses.json	2022-12-14 17:31:12.000000000 +0000
+++ 3.1.0-1/fixtures/ast/value/Parentheses.json	2024-12-06 17:25:18.000000000 +0000
@@ -97,6 +97,7 @@
         }
     },
     "parentheses.c.3": {
+        "skipRoundtrip": "broken round-trip since generator adds whitespace between + and 1 to prevent tokens merge into single token",
         "source": "(/*test*/x/*test*/+/*test*/1/*test*/)",
         "generate": "(x+ 1)",
         "ast": {
diff -pruN 2.3.1-1/fixtures/definition-syntax/boolean-expr.json 3.1.0-1/fixtures/definition-syntax/boolean-expr.json
--- 2.3.1-1/fixtures/definition-syntax/boolean-expr.json	1970-01-01 00:00:00.000000000 +0000
+++ 3.1.0-1/fixtures/definition-syntax/boolean-expr.json	2024-12-06 17:25:18.000000000 +0000
@@ -0,0 +1,69 @@
+{
+    "boolean-expr": {
+        "syntax": "<boolean-expr[x]>",
+        "valid": [
+            "x",
+            "not x",
+            "(not x)",
+            "x and x",
+            "x and (x)",
+            "x and x and x",
+            "x and (not x)",
+            "x and (x or x)",
+            "x and (x and (x or x))",
+            "x or x",
+            "x or (x)",
+            "x or x or x",
+            "x or (not x)",
+            "x or (x and x)",
+            "x or (x or (x and x))",
+            "x and (x and x or x)",
+            "(general enclosed)",
+            "(general enclosed) and x",
+            "(general enclosed) and (general enclosed)",
+            "fn(general enclosed)",
+            "fn(general enclosed) and x",
+            "fn(general enclosed) and (general enclosed)"
+        ],
+        "invalid": [
+            "not x and x",
+            "x and x or x",
+            "x and not x"
+        ]
+    },
+    "boolean-expr#2": {
+        "syntax": "<boolean-expr[a | b]>",
+        "valid": [
+            "a",
+            "b",
+            "not a",
+            "(not b)",
+            "a and b",
+            "a and a and a",
+            "a and b and a",
+            "a and (not b)",
+            "a and (b or a)",
+            "a and (a and (a or a))",
+            "a or b",
+            "a or a or a",
+            "a or b or a",
+            "a or (not b)",
+            "a or (b and a)",
+            "a or (a or (a and a))",
+            "a and (b and a or b)",
+            "(general enclosed)",
+            "(general enclosed) and a",
+            "(general enclosed) and (general enclosed)",
+            "fn(general enclosed)",
+            "fn(general enclosed) and b",
+            "fn(general enclosed) and (general enclosed)"
+        ],
+        "invalid": [
+            "c",
+            "not c",
+            "not a and b",
+            "a and b or a",
+            "a and not b"
+        ]
+    }
+}
diff -pruN 2.3.1-1/fixtures/definition-syntax/multiplier.json 3.1.0-1/fixtures/definition-syntax/multiplier.json
--- 2.3.1-1/fixtures/definition-syntax/multiplier.json	2022-12-14 17:31:12.000000000 +0000
+++ 3.1.0-1/fixtures/definition-syntax/multiplier.json	2024-12-06 17:25:18.000000000 +0000
@@ -183,6 +183,36 @@
             "foo foo foo foo bar"
         ]
     },
+    "should ignore whitespaces": {
+        "syntax": "foo{ 2 }",
+        "valid": [
+            "foo foo"
+        ],
+        "invalid": [
+            "foo",
+            "foo foo foo",
+            "foo foo foo foo",
+            "",
+            "bar",
+            "foo foo bar",
+            "foo foo foo foo bar"
+        ]
+    },
+    "should ignore whitespaces #2": {
+        "syntax": "foo{ 2 , 4 }",
+        "valid": [
+            "foo foo",
+            "foo foo foo",
+            "foo foo foo foo"
+        ],
+        "invalid": [
+            "foo",
+            "",
+            "bar",
+            "foo foo bar",
+            "foo foo foo foo bar"
+        ]
+    },
     "one or more comma separated": {
         "syntax": "foo#",
         "valid": [
diff -pruN 2.3.1-1/fixtures/definition-syntax/property.json 3.1.0-1/fixtures/definition-syntax/property.json
--- 2.3.1-1/fixtures/definition-syntax/property.json	2022-12-14 17:31:12.000000000 +0000
+++ 3.1.0-1/fixtures/definition-syntax/property.json	2024-12-06 17:25:18.000000000 +0000
@@ -30,5 +30,79 @@
             "foo foo bar",
             ""
         ]
+    },
+    "with #-multiplier": {
+        "syntax": "<'property'>#",
+        "lexer": {
+            "properties": {
+                "property": "foo"
+            }
+        },
+        "valid": [
+            "foo",
+            "foo, foo",
+            "foo, foo, foo, foo"
+        ],
+        "invalid": [
+            "foo foo bar",
+            "foo, foo, bar",
+            ""
+        ]
+    },
+    "top-level #-multiplier in property syntax": {
+        "syntax": "<'property'>",
+        "lexer": {
+            "properties": {
+                "property": "[ foo ]#"
+            }
+        },
+        "valid": [
+            "foo"
+        ],
+        "invalid": [
+            "foo foo bar",
+            "foo, foo",
+            "foo, foo, foo, foo",
+            "foo, foo, bar",
+            ""
+        ]
+    },
+    "non top-level #-multiplier in property syntax": {
+        "syntax": "<'property'>",
+        "lexer": {
+            "properties": {
+                "property": "none | [ foo ]#"
+            }
+        },
+        "valid": [
+            "none",
+            "foo",
+            "foo, foo",
+            "foo, foo, foo, foo"
+        ],
+        "invalid": [
+            "none none",
+            "none, none",
+            "foo foo bar",
+            "foo, foo, bar",
+            ""
+        ]
+    },
+    "top-level non #-multiplier in property syntax": {
+        "syntax": "<'property'>",
+        "lexer": {
+            "properties": {
+                "property": "[ foo ]+"
+            }
+        },
+        "valid": [
+            "foo",
+            "foo foo",
+            "foo foo foo foo"
+        ],
+        "invalid": [
+            "foo foo bar",
+            ""
+        ]
     }
 }
diff -pruN 2.3.1-1/fixtures/definition-syntax/slash.json 3.1.0-1/fixtures/definition-syntax/slash.json
--- 2.3.1-1/fixtures/definition-syntax/slash.json	2022-12-14 17:31:12.000000000 +0000
+++ 3.1.0-1/fixtures/definition-syntax/slash.json	1970-01-01 00:00:00.000000000 +0000
@@ -1,18 +0,0 @@
-{
-    "simple": {
-        "syntax": "foo / bar",
-        "valid": [
-            "foo / bar",
-            "foo/bar"
-        ],
-        "invalid": [
-            "",
-            "/",
-            "foo",
-            "foo /",
-            "foo bar",
-            "bar",
-            "/ bar"
-        ]
-    }
-}
diff -pruN 2.3.1-1/fixtures/definition-syntax/token.json 3.1.0-1/fixtures/definition-syntax/token.json
--- 2.3.1-1/fixtures/definition-syntax/token.json	1970-01-01 00:00:00.000000000 +0000
+++ 3.1.0-1/fixtures/definition-syntax/token.json	2024-12-06 17:25:18.000000000 +0000
@@ -0,0 +1,44 @@
+{
+    "slash": {
+        "syntax": "foo / bar",
+        "valid": [
+            "foo / bar",
+            "foo/bar"
+        ],
+        "invalid": [
+            "",
+            "/",
+            "foo",
+            "foo /",
+            "foo bar",
+            "bar",
+            "/ bar"
+        ]
+    },
+    "semicolon": {
+        "syntax": "foo ; bar",
+        "valid": [
+            "foo ; bar",
+            "foo;bar"
+        ],
+        "invalid": [
+            "",
+            ";",
+            "foo",
+            "foo ;",
+            "foo bar",
+            "bar",
+            "; bar"
+        ]
+    },
+    "token with a multiplier": {
+        "syntax": ";?",
+        "valid": [
+            " ; ",
+            ";",
+            "  ",
+            ""
+        ],
+        "invalid": []
+    }
+}
diff -pruN 2.3.1-1/fixtures/definition-syntax-match/generic.json 3.1.0-1/fixtures/definition-syntax-match/generic.json
--- 2.3.1-1/fixtures/definition-syntax-match/generic.json	2022-12-14 17:31:12.000000000 +0000
+++ 3.1.0-1/fixtures/definition-syntax-match/generic.json	2024-12-06 17:25:18.000000000 +0000
@@ -506,6 +506,18 @@
     },
     "<custom-property-name>": {
         "valid": [
+            "--foo"
+        ],
+        "invalid": [
+            "",
+            "foo",
+            "-foo",
+            "-foo--bar",
+            "--"
+        ]
+    },
+    "<dashed-ident>": {
+        "valid": [
             "--",
             "--foo"
         ],
@@ -541,10 +553,6 @@
         ]
     },
     "<any-value>": {
-        "skipped": {
-            "valid": [
-            ]
-        },
         "valid": [
             "foo",
             "123px",
diff -pruN 2.3.1-1/fixtures/stringify.ast 3.1.0-1/fixtures/stringify.ast
--- 2.3.1-1/fixtures/stringify.ast	2022-12-14 17:31:12.000000000 +0000
+++ 3.1.0-1/fixtures/stringify.ast	2024-12-06 17:25:18.000000000 +0000
@@ -8,8 +8,8 @@
             "column": 1
         },
         "end": {
-            "offset": 1529,
-            "line": 69,
+            "offset": 2240,
+            "line": 119,
             "column": 1
         }
     },
@@ -271,9 +271,9 @@
                         "column": 8
                     },
                     "end": {
-                        "offset": 94,
+                        "offset": 95,
                         "line": 6,
-                        "column": 27
+                        "column": 28
                     }
                 },
                 "children": [
@@ -287,9 +287,9 @@
                                 "column": 8
                             },
                             "end": {
-                                "offset": 94,
+                                "offset": 95,
                                 "line": 6,
-                                "column": 27
+                                "column": 28
                             }
                         },
                         "children": [
@@ -303,81 +303,67 @@
                                         "column": 8
                                     },
                                     "end": {
-                                        "offset": 94,
+                                        "offset": 95,
                                         "line": 6,
-                                        "column": 27
+                                        "column": 28
                                     }
                                 },
-                                "children": [
-                                    {
-                                        "type": "Identifier",
-                                        "loc": {
-                                            "source": "stringify.css",
-                                            "start": {
-                                                "offset": 75,
-                                                "line": 6,
-                                                "column": 8
-                                            },
-                                            "end": {
-                                                "offset": 81,
-                                                "line": 6,
-                                                "column": 14
-                                            }
-                                        },
-                                        "name": "screen"
-                                    },
-                                    {
-                                        "type": "Identifier",
-                                        "loc": {
-                                            "source": "stringify.css",
-                                            "start": {
-                                                "offset": 82,
-                                                "line": 6,
-                                                "column": 15
-                                            },
-                                            "end": {
-                                                "offset": 85,
-                                                "line": 6,
-                                                "column": 18
-                                            }
+                                "modifier": null,
+                                "mediaType": "screen",
+                                "condition": {
+                                    "type": "Condition",
+                                    "loc": {
+                                        "source": "stringify.css",
+                                        "start": {
+                                            "offset": 86,
+                                            "line": 6,
+                                            "column": 19
                                         },
-                                        "name": "and"
+                                        "end": {
+                                            "offset": 94,
+                                            "line": 6,
+                                            "column": 27
+                                        }
                                     },
-                                    {
-                                        "type": "MediaFeature",
-                                        "loc": {
-                                            "source": "stringify.css",
-                                            "start": {
-                                                "offset": 86,
-                                                "line": 6,
-                                                "column": 19
-                                            },
-                                            "end": {
-                                                "offset": 94,
-                                                "line": 6,
-                                                "column": 27
-                                            }
-                                        },
-                                        "name": "foo",
-                                        "value": {
-                                            "type": "Number",
+                                    "kind": "media",
+                                    "children": [
+                                        {
+                                            "type": "Feature",
                                             "loc": {
                                                 "source": "stringify.css",
                                                 "start": {
-                                                    "offset": 92,
+                                                    "offset": 86,
                                                     "line": 6,
-                                                    "column": 25
+                                                    "column": 19
                                                 },
                                                 "end": {
-                                                    "offset": 93,
+                                                    "offset": 94,
                                                     "line": 6,
-                                                    "column": 26
+                                                    "column": 27
                                                 }
                                             },
-                                            "value": "1"
+                                            "kind": "media",
+                                            "name": "foo",
+                                            "value": {
+                                                "type": "Number",
+                                                "loc": {
+                                                    "source": "stringify.css",
+                                                    "start": {
+                                                        "offset": 92,
+                                                        "line": 6,
+                                                        "column": 25
+                                                    },
+                                                    "end": {
+                                                        "offset": 93,
+                                                        "line": 6,
+                                                        "column": 26
+                                                    }
+                                                },
+                                                "value": "1"
+                                            }
                                         }
-                                    }
-                                ]
+                                    ]
+                                }
                             }
                         ]
                     }
@@ -543,7 +529,7 @@
             }
         },
         {
-            "type": "Rule",
+            "type": "Atrule",
             "loc": {
                 "source": "stringify.css",
                 "start": {
@@ -552,8 +538,957 @@
                     "column": 1
                 },
                 "end": {
-                    "offset": 755,
-                    "line": 23,
+                    "offset": 164,
+                    "line": 12,
+                    "column": 26
+                }
+            },
+            "name": "import",
+            "prelude": {
+                "type": "AtrulePrelude",
+                "loc": {
+                    "source": "stringify.css",
+                    "start": {
+                        "offset": 147,
+                        "line": 12,
+                        "column": 9
+                    },
+                    "end": {
+                        "offset": 163,
+                        "line": 12,
+                        "column": 25
+                    }
+                },
+                "children": [
+                    {
+                        "type": "String",
+                        "loc": {
+                            "source": "stringify.css",
+                            "start": {
+                                "offset": 147,
+                                "line": 12,
+                                "column": 9
+                            },
+                            "end": {
+                                "offset": 152,
+                                "line": 12,
+                                "column": 14
+                            }
+                        },
+                        "value": "foo"
+                    },
+                    {
+                        "type": "Function",
+                        "loc": {
+                            "source": "stringify.css",
+                            "start": {
+                                "offset": 153,
+                                "line": 12,
+                                "column": 15
+                            },
+                            "end": {
+                                "offset": 163,
+                                "line": 12,
+                                "column": 25
+                            }
+                        },
+                        "name": "layer",
+                        "children": [
+                            {
+                                "type": "Layer",
+                                "loc": {
+                                    "source": "stringify.css",
+                                    "start": {
+                                        "offset": 159,
+                                        "line": 12,
+                                        "column": 21
+                                    },
+                                    "end": {
+                                        "offset": 162,
+                                        "line": 12,
+                                        "column": 24
+                                    }
+                                },
+                                "name": "bar"
+                            }
+                        ]
+                    }
+                ]
+            },
+            "block": null
+        },
+        {
+            "type": "Atrule",
+            "loc": {
+                "source": "stringify.css",
+                "start": {
+                    "offset": 166,
+                    "line": 14,
+                    "column": 1
+                },
+                "end": {
+                    "offset": 295,
+                    "line": 24,
+                    "column": 2
+                }
+            },
+            "name": "layer",
+            "prelude": {
+                "type": "AtrulePrelude",
+                "loc": {
+                    "source": "stringify.css",
+                    "start": {
+                        "offset": 173,
+                        "line": 14,
+                        "column": 8
+                    },
+                    "end": {
+                        "offset": 176,
+                        "line": 14,
+                        "column": 11
+                    }
+                },
+                "children": [
+                    {
+                        "type": "LayerList",
+                        "loc": {
+                            "source": "stringify.css",
+                            "start": {
+                                "offset": 173,
+                                "line": 14,
+                                "column": 8
+                            },
+                            "end": {
+                                "offset": 176,
+                                "line": 14,
+                                "column": 11
+                            }
+                        },
+                        "children": [
+                            {
+                                "type": "Layer",
+                                "loc": {
+                                    "source": "stringify.css",
+                                    "start": {
+                                        "offset": 173,
+                                        "line": 14,
+                                        "column": 8
+                                    },
+                                    "end": {
+                                        "offset": 176,
+                                        "line": 14,
+                                        "column": 11
+                                    }
+                                },
+                                "name": "foo"
+                            }
+                        ]
+                    }
+                ]
+            },
+            "block": {
+                "type": "Block",
+                "loc": {
+                    "source": "stringify.css",
+                    "start": {
+                        "offset": 177,
+                        "line": 14,
+                        "column": 12
+                    },
+                    "end": {
+                        "offset": 295,
+                        "line": 24,
+                        "column": 2
+                    }
+                },
+                "children": [
+                    {
+                        "type": "Rule",
+                        "loc": {
+                            "source": "stringify.css",
+                            "start": {
+                                "offset": 183,
+                                "line": 15,
+                                "column": 5
+                            },
+                            "end": {
+                                "offset": 217,
+                                "line": 17,
+                                "column": 6
+                            }
+                        },
+                        "prelude": {
+                            "type": "SelectorList",
+                            "loc": {
+                                "source": "stringify.css",
+                                "start": {
+                                    "offset": 183,
+                                    "line": 15,
+                                    "column": 5
+                                },
+                                "end": {
+                                    "offset": 189,
+                                    "line": 15,
+                                    "column": 11
+                                }
+                            },
+                            "children": [
+                                {
+                                    "type": "Selector",
+                                    "loc": {
+                                        "source": "stringify.css",
+                                        "start": {
+                                            "offset": 183,
+                                            "line": 15,
+                                            "column": 5
+                                        },
+                                        "end": {
+                                            "offset": 189,
+                                            "line": 15,
+                                            "column": 11
+                                        }
+                                    },
+                                    "children": [
+                                        {
+                                            "type": "ClassSelector",
+                                            "loc": {
+                                                "source": "stringify.css",
+                                                "start": {
+                                                    "offset": 183,
+                                                    "line": 15,
+                                                    "column": 5
+                                                },
+                                                "end": {
+                                                    "offset": 189,
+                                                    "line": 15,
+                                                    "column": 11
+                                                }
+                                            },
+                                            "name": "class"
+                                        }
+                                    ]
+                                }
+                            ]
+                        },
+                        "block": {
+                            "type": "Block",
+                            "loc": {
+                                "source": "stringify.css",
+                                "start": {
+                                    "offset": 190,
+                                    "line": 15,
+                                    "column": 12
+                                },
+                                "end": {
+                                    "offset": 217,
+                                    "line": 17,
+                                    "column": 6
+                                }
+                            },
+                            "children": [
+                                {
+                                    "type": "Declaration",
+                                    "loc": {
+                                        "source": "stringify.css",
+                                        "start": {
+                                            "offset": 200,
+                                            "line": 16,
+                                            "column": 9
+                                        },
+                                        "end": {
+                                            "offset": 210,
+                                            "line": 16,
+                                            "column": 19
+                                        }
+                                    },
+                                    "important": false,
+                                    "property": "color",
+                                    "value": {
+                                        "type": "Value",
+                                        "loc": {
+                                            "source": "stringify.css",
+                                            "start": {
+                                                "offset": 207,
+                                                "line": 16,
+                                                "column": 16
+                                            },
+                                            "end": {
+                                                "offset": 210,
+                                                "line": 16,
+                                                "column": 19
+                                            }
+                                        },
+                                        "children": [
+                                            {
+                                                "type": "Identifier",
+                                                "loc": {
+                                                    "source": "stringify.css",
+                                                    "start": {
+                                                        "offset": 207,
+                                                        "line": 16,
+                                                        "column": 16
+                                                    },
+                                                    "end": {
+                                                        "offset": 210,
+                                                        "line": 16,
+                                                        "column": 19
+                                                    }
+                                                },
+                                                "name": "red"
+                                            }
+                                        ]
+                                    }
+                                }
+                            ]
+                        }
+                    },
+                    {
+                        "type": "Atrule",
+                        "loc": {
+                            "source": "stringify.css",
+                            "start": {
+                                "offset": 223,
+                                "line": 19,
+                                "column": 5
+                            },
+                            "end": {
+                                "offset": 293,
+                                "line": 23,
+                                "column": 6
+                            }
+                        },
+                        "name": "layer",
+                        "prelude": {
+                            "type": "AtrulePrelude",
+                            "loc": {
+                                "source": "stringify.css",
+                                "start": {
+                                    "offset": 230,
+                                    "line": 19,
+                                    "column": 12
+                                },
+                                "end": {
+                                    "offset": 233,
+                                    "line": 19,
+                                    "column": 15
+                                }
+                            },
+                            "children": [
+                                {
+                                    "type": "LayerList",
+                                    "loc": {
+                                        "source": "stringify.css",
+                                        "start": {
+                                            "offset": 230,
+                                            "line": 19,
+                                            "column": 12
+                                        },
+                                        "end": {
+                                            "offset": 233,
+                                            "line": 19,
+                                            "column": 15
+                                        }
+                                    },
+                                    "children": [
+                                        {
+                                            "type": "Layer",
+                                            "loc": {
+                                                "source": "stringify.css",
+                                                "start": {
+                                                    "offset": 230,
+                                                    "line": 19,
+                                                    "column": 12
+                                                },
+                                                "end": {
+                                                    "offset": 233,
+                                                    "line": 19,
+                                                    "column": 15
+                                                }
+                                            },
+                                            "name": "bar"
+                                        }
+                                    ]
+                                }
+                            ]
+                        },
+                        "block": {
+                            "type": "Block",
+                            "loc": {
+                                "source": "stringify.css",
+                                "start": {
+                                    "offset": 234,
+                                    "line": 19,
+                                    "column": 16
+                                },
+                                "end": {
+                                    "offset": 293,
+                                    "line": 23,
+                                    "column": 6
+                                }
+                            },
+                            "children": [
+                                {
+                                    "type": "Rule",
+                                    "loc": {
+                                        "source": "stringify.css",
+                                        "start": {
+                                            "offset": 244,
+                                            "line": 20,
+                                            "column": 9
+                                        },
+                                        "end": {
+                                            "offset": 287,
+                                            "line": 22,
+                                            "column": 10
+                                        }
+                                    },
+                                    "prelude": {
+                                        "type": "SelectorList",
+                                        "loc": {
+                                            "source": "stringify.css",
+                                            "start": {
+                                                "offset": 244,
+                                                "line": 20,
+                                                "column": 9
+                                            },
+                                            "end": {
+                                                "offset": 251,
+                                                "line": 20,
+                                                "column": 16
+                                            }
+                                        },
+                                        "children": [
+                                            {
+                                                "type": "Selector",
+                                                "loc": {
+                                                    "source": "stringify.css",
+                                                    "start": {
+                                                        "offset": 244,
+                                                        "line": 20,
+                                                        "column": 9
+                                                    },
+                                                    "end": {
+                                                        "offset": 251,
+                                                        "line": 20,
+                                                        "column": 16
+                                                    }
+                                                },
+                                                "children": [
+                                                    {
+                                                        "type": "ClassSelector",
+                                                        "loc": {
+                                                            "source": "stringify.css",
+                                                            "start": {
+                                                                "offset": 244,
+                                                                "line": 20,
+                                                                "column": 9
+                                                            },
+                                                            "end": {
+                                                                "offset": 251,
+                                                                "line": 20,
+                                                                "column": 16
+                                                            }
+                                                        },
+                                                        "name": "class2"
+                                                    }
+                                                ]
+                                            }
+                                        ]
+                                    },
+                                    "block": {
+                                        "type": "Block",
+                                        "loc": {
+                                            "source": "stringify.css",
+                                            "start": {
+                                                "offset": 252,
+                                                "line": 20,
+                                                "column": 17
+                                            },
+                                            "end": {
+                                                "offset": 287,
+                                                "line": 22,
+                                                "column": 10
+                                            }
+                                        },
+                                        "children": [
+                                            {
+                                                "type": "Declaration",
+                                                "loc": {
+                                                    "source": "stringify.css",
+                                                    "start": {
+                                                        "offset": 266,
+                                                        "line": 21,
+                                                        "column": 13
+                                                    },
+                                                    "end": {
+                                                        "offset": 276,
+                                                        "line": 21,
+                                                        "column": 23
+                                                    }
+                                                },
+                                                "important": false,
+                                                "property": "color",
+                                                "value": {
+                                                    "type": "Value",
+                                                    "loc": {
+                                                        "source": "stringify.css",
+                                                        "start": {
+                                                            "offset": 273,
+                                                            "line": 21,
+                                                            "column": 20
+                                                        },
+                                                        "end": {
+                                                            "offset": 276,
+                                                            "line": 21,
+                                                            "column": 23
+                                                        }
+                                                    },
+                                                    "children": [
+                                                        {
+                                                            "type": "Identifier",
+                                                            "loc": {
+                                                                "source": "stringify.css",
+                                                                "start": {
+                                                                    "offset": 273,
+                                                                    "line": 21,
+                                                                    "column": 20
+                                                                },
+                                                                "end": {
+                                                                    "offset": 276,
+                                                                    "line": 21,
+                                                                    "column": 23
+                                                                }
+                                                            },
+                                                            "name": "red"
+                                                        }
+                                                    ]
+                                                }
+                                            }
+                                        ]
+                                    }
+                                }
+                            ]
+                        }
+                    }
+                ]
+            }
+        },
+        {
+            "type": "Atrule",
+            "loc": {
+                "source": "stringify.css",
+                "start": {
+                    "offset": 297,
+                    "line": 26,
+                    "column": 1
+                },
+                "end": {
+                    "offset": 354,
+                    "line": 30,
+                    "column": 2
+                }
+            },
+            "name": "layer",
+            "prelude": {
+                "type": "AtrulePrelude",
+                "loc": {
+                    "source": "stringify.css",
+                    "start": {
+                        "offset": 304,
+                        "line": 26,
+                        "column": 8
+                    },
+                    "end": {
+                        "offset": 311,
+                        "line": 26,
+                        "column": 15
+                    }
+                },
+                "children": [
+                    {
+                        "type": "LayerList",
+                        "loc": {
+                            "source": "stringify.css",
+                            "start": {
+                                "offset": 304,
+                                "line": 26,
+                                "column": 8
+                            },
+                            "end": {
+                                "offset": 311,
+                                "line": 26,
+                                "column": 15
+                            }
+                        },
+                        "children": [
+                            {
+                                "type": "Layer",
+                                "loc": {
+                                    "source": "stringify.css",
+                                    "start": {
+                                        "offset": 304,
+                                        "line": 26,
+                                        "column": 8
+                                    },
+                                    "end": {
+                                        "offset": 311,
+                                        "line": 26,
+                                        "column": 15
+                                    }
+                                },
+                                "name": "foo.bar"
+                            }
+                        ]
+                    }
+                ]
+            },
+            "block": {
+                "type": "Block",
+                "loc": {
+                    "source": "stringify.css",
+                    "start": {
+                        "offset": 312,
+                        "line": 26,
+                        "column": 16
+                    },
+                    "end": {
+                        "offset": 354,
+                        "line": 30,
+                        "column": 2
+                    }
+                },
+                "children": [
+                    {
+                        "type": "Rule",
+                        "loc": {
+                            "source": "stringify.css",
+                            "start": {
+                                "offset": 318,
+                                "line": 27,
+                                "column": 5
+                            },
+                            "end": {
+                                "offset": 352,
+                                "line": 29,
+                                "column": 6
+                            }
+                        },
+                        "prelude": {
+                            "type": "SelectorList",
+                            "loc": {
+                                "source": "stringify.css",
+                                "start": {
+                                    "offset": 318,
+                                    "line": 27,
+                                    "column": 5
+                                },
+                                "end": {
+                                    "offset": 324,
+                                    "line": 27,
+                                    "column": 11
+                                }
+                            },
+                            "children": [
+                                {
+                                    "type": "Selector",
+                                    "loc": {
+                                        "source": "stringify.css",
+                                        "start": {
+                                            "offset": 318,
+                                            "line": 27,
+                                            "column": 5
+                                        },
+                                        "end": {
+                                            "offset": 324,
+                                            "line": 27,
+                                            "column": 11
+                                        }
+                                    },
+                                    "children": [
+                                        {
+                                            "type": "ClassSelector",
+                                            "loc": {
+                                                "source": "stringify.css",
+                                                "start": {
+                                                    "offset": 318,
+                                                    "line": 27,
+                                                    "column": 5
+                                                },
+                                                "end": {
+                                                    "offset": 324,
+                                                    "line": 27,
+                                                    "column": 11
+                                                }
+                                            },
+                                            "name": "class"
+                                        }
+                                    ]
+                                }
+                            ]
+                        },
+                        "block": {
+                            "type": "Block",
+                            "loc": {
+                                "source": "stringify.css",
+                                "start": {
+                                    "offset": 325,
+                                    "line": 27,
+                                    "column": 12
+                                },
+                                "end": {
+                                    "offset": 352,
+                                    "line": 29,
+                                    "column": 6
+                                }
+                            },
+                            "children": [
+                                {
+                                    "type": "Declaration",
+                                    "loc": {
+                                        "source": "stringify.css",
+                                        "start": {
+                                            "offset": 335,
+                                            "line": 28,
+                                            "column": 9
+                                        },
+                                        "end": {
+                                            "offset": 345,
+                                            "line": 28,
+                                            "column": 19
+                                        }
+                                    },
+                                    "important": false,
+                                    "property": "color",
+                                    "value": {
+                                        "type": "Value",
+                                        "loc": {
+                                            "source": "stringify.css",
+                                            "start": {
+                                                "offset": 342,
+                                                "line": 28,
+                                                "column": 16
+                                            },
+                                            "end": {
+                                                "offset": 345,
+                                                "line": 28,
+                                                "column": 19
+                                            }
+                                        },
+                                        "children": [
+                                            {
+                                                "type": "Identifier",
+                                                "loc": {
+                                                    "source": "stringify.css",
+                                                    "start": {
+                                                        "offset": 342,
+                                                        "line": 28,
+                                                        "column": 16
+                                                    },
+                                                    "end": {
+                                                        "offset": 345,
+                                                        "line": 28,
+                                                        "column": 19
+                                                    }
+                                                },
+                                                "name": "red"
+                                            }
+                                        ]
+                                    }
+                                }
+                            ]
+                        }
+                    }
+                ]
+            }
+        },
+        {
+            "type": "Atrule",
+            "loc": {
+                "source": "stringify.css",
+                "start": {
+                    "offset": 356,
+                    "line": 32,
+                    "column": 1
+                },
+                "end": {
+                    "offset": 405,
+                    "line": 36,
+                    "column": 2
+                }
+            },
+            "name": "layer",
+            "prelude": null,
+            "block": {
+                "type": "Block",
+                "loc": {
+                    "source": "stringify.css",
+                    "start": {
+                        "offset": 363,
+                        "line": 32,
+                        "column": 8
+                    },
+                    "end": {
+                        "offset": 405,
+                        "line": 36,
+                        "column": 2
+                    }
+                },
+                "children": [
+                    {
+                        "type": "Rule",
+                        "loc": {
+                            "source": "stringify.css",
+                            "start": {
+                                "offset": 369,
+                                "line": 33,
+                                "column": 5
+                            },
+                            "end": {
+                                "offset": 403,
+                                "line": 35,
+                                "column": 6
+                            }
+                        },
+                        "prelude": {
+                            "type": "SelectorList",
+                            "loc": {
+                                "source": "stringify.css",
+                                "start": {
+                                    "offset": 369,
+                                    "line": 33,
+                                    "column": 5
+                                },
+                                "end": {
+                                    "offset": 375,
+                                    "line": 33,
+                                    "column": 11
+                                }
+                            },
+                            "children": [
+                                {
+                                    "type": "Selector",
+                                    "loc": {
+                                        "source": "stringify.css",
+                                        "start": {
+                                            "offset": 369,
+                                            "line": 33,
+                                            "column": 5
+                                        },
+                                        "end": {
+                                            "offset": 375,
+                                            "line": 33,
+                                            "column": 11
+                                        }
+                                    },
+                                    "children": [
+                                        {
+                                            "type": "ClassSelector",
+                                            "loc": {
+                                                "source": "stringify.css",
+                                                "start": {
+                                                    "offset": 369,
+                                                    "line": 33,
+                                                    "column": 5
+                                                },
+                                                "end": {
+                                                    "offset": 375,
+                                                    "line": 33,
+                                                    "column": 11
+                                                }
+                                            },
+                                            "name": "class"
+                                        }
+                                    ]
+                                }
+                            ]
+                        },
+                        "block": {
+                            "type": "Block",
+                            "loc": {
+                                "source": "stringify.css",
+                                "start": {
+                                    "offset": 376,
+                                    "line": 33,
+                                    "column": 12
+                                },
+                                "end": {
+                                    "offset": 403,
+                                    "line": 35,
+                                    "column": 6
+                                }
+                            },
+                            "children": [
+                                {
+                                    "type": "Declaration",
+                                    "loc": {
+                                        "source": "stringify.css",
+                                        "start": {
+                                            "offset": 386,
+                                            "line": 34,
+                                            "column": 9
+                                        },
+                                        "end": {
+                                            "offset": 396,
+                                            "line": 34,
+                                            "column": 19
+                                        }
+                                    },
+                                    "important": false,
+                                    "property": "color",
+                                    "value": {
+                                        "type": "Value",
+                                        "loc": {
+                                            "source": "stringify.css",
+                                            "start": {
+                                                "offset": 393,
+                                                "line": 34,
+                                                "column": 16
+                                            },
+                                            "end": {
+                                                "offset": 396,
+                                                "line": 34,
+                                                "column": 19
+                                            }
+                                        },
+                                        "children": [
+                                            {
+                                                "type": "Identifier",
+                                                "loc": {
+                                                    "source": "stringify.css",
+                                                    "start": {
+                                                        "offset": 393,
+                                                        "line": 34,
+                                                        "column": 16
+                                                    },
+                                                    "end": {
+                                                        "offset": 396,
+                                                        "line": 34,
+                                                        "column": 19
+                                                    }
+                                                },
+                                                "name": "red"
+                                            }
+                                        ]
+                                    }
+                                }
+                            ]
+                        }
+                    }
+                ]
+            }
+        },
+        {
+            "type": "Rule",
+            "loc": {
+                "source": "stringify.css",
+                "start": {
+                    "offset": 407,
+                    "line": 38,
+                    "column": 1
+                },
+                "end": {
+                    "offset": 1023,
+                    "line": 49,
                     "column": 2
                 }
             },
@@ -562,13 +1497,13 @@
                 "loc": {
                     "source": "stringify.css",
                     "start": {
-                        "offset": 139,
-                        "line": 12,
+                        "offset": 407,
+                        "line": 38,
                         "column": 1
                     },
                     "end": {
-                        "offset": 350,
-                        "line": 14,
+                        "offset": 618,
+                        "line": 40,
                         "column": 12
                     }
                 },
@@ -578,13 +1513,13 @@
                         "loc": {
                             "source": "stringify.css",
                             "start": {
-                                "offset": 139,
-                                "line": 12,
+                                "offset": 407,
+                                "line": 38,
                                 "column": 1
                             },
                             "end": {
-                                "offset": 255,
-                                "line": 12,
+                                "offset": 523,
+                                "line": 38,
                                 "column": 117
                             }
                         },
@@ -594,13 +1529,13 @@
                                 "loc": {
                                     "source": "stringify.css",
                                     "start": {
-                                        "offset": 139,
-                                        "line": 12,
+                                        "offset": 407,
+                                        "line": 38,
                                         "column": 1
                                     },
                                     "end": {
-                                        "offset": 140,
-                                        "line": 12,
+                                        "offset": 408,
+                                        "line": 38,
                                         "column": 2
                                     }
                                 },
@@ -611,13 +1546,13 @@
                                 "loc": {
                                     "source": "stringify.css",
                                     "start": {
-                                        "offset": 140,
-                                        "line": 12,
+                                        "offset": 408,
+                                        "line": 38,
                                         "column": 2
                                     },
                                     "end": {
-                                        "offset": 146,
-                                        "line": 12,
+                                        "offset": 414,
+                                        "line": 38,
                                         "column": 8
                                     }
                                 },
@@ -633,13 +1568,13 @@
                                 "loc": {
                                     "source": "stringify.css",
                                     "start": {
-                                        "offset": 147,
-                                        "line": 12,
+                                        "offset": 415,
+                                        "line": 38,
                                         "column": 9
                                     },
                                     "end": {
-                                        "offset": 154,
-                                        "line": 12,
+                                        "offset": 422,
+                                        "line": 38,
                                         "column": 16
                                     }
                                 },
@@ -650,13 +1585,13 @@
                                 "loc": {
                                     "source": "stringify.css",
                                     "start": {
-                                        "offset": 154,
-                                        "line": 12,
+                                        "offset": 422,
+                                        "line": 38,
                                         "column": 16
                                     },
                                     "end": {
-                                        "offset": 157,
-                                        "line": 12,
+                                        "offset": 425,
+                                        "line": 38,
                                         "column": 19
                                     }
                                 },
@@ -667,13 +1602,13 @@
                                 "loc": {
                                     "source": "stringify.css",
                                     "start": {
-                                        "offset": 157,
-                                        "line": 12,
+                                        "offset": 425,
+                                        "line": 38,
                                         "column": 19
                                     },
                                     "end": {
-                                        "offset": 163,
-                                        "line": 12,
+                                        "offset": 431,
+                                        "line": 38,
                                         "column": 25
                                     }
                                 },
@@ -682,13 +1617,13 @@
                                     "loc": {
                                         "source": "stringify.css",
                                         "start": {
-                                            "offset": 158,
-                                            "line": 12,
+                                            "offset": 426,
+                                            "line": 38,
                                             "column": 20
                                         },
                                         "end": {
-                                            "offset": 162,
-                                            "line": 12,
+                                            "offset": 430,
+                                            "line": 38,
                                             "column": 24
                                         }
                                     },
@@ -708,13 +1643,13 @@
                                 "loc": {
                                     "source": "stringify.css",
                                     "start": {
-                                        "offset": 164,
-                                        "line": 12,
+                                        "offset": 432,
+                                        "line": 38,
                                         "column": 26
                                     },
                                     "end": {
-                                        "offset": 177,
-                                        "line": 12,
+                                        "offset": 445,
+                                        "line": 38,
                                         "column": 39
                                     }
                                 },
@@ -723,13 +1658,13 @@
                                     "loc": {
                                         "source": "stringify.css",
                                         "start": {
-                                            "offset": 165,
-                                            "line": 12,
+                                            "offset": 433,
+                                            "line": 38,
                                             "column": 27
                                         },
                                         "end": {
-                                            "offset": 169,
-                                            "line": 12,
+                                            "offset": 437,
+                                            "line": 38,
                                             "column": 31
                                         }
                                     },
@@ -741,13 +1676,13 @@
                                     "loc": {
                                         "source": "stringify.css",
                                         "start": {
-                                            "offset": 171,
-                                            "line": 12,
+                                            "offset": 439,
+                                            "line": 38,
                                             "column": 33
                                         },
                                         "end": {
-                                            "offset": 176,
-                                            "line": 12,
+                                            "offset": 444,
+                                            "line": 38,
                                             "column": 38
                                         }
                                     },
@@ -760,13 +1695,13 @@
                                 "loc": {
                                     "source": "stringify.css",
                                     "start": {
-                                        "offset": 177,
-                                        "line": 12,
+                                        "offset": 445,
+                                        "line": 38,
                                         "column": 39
                                     },
                                     "end": {
-                                        "offset": 191,
-                                        "line": 12,
+                                        "offset": 459,
+                                        "line": 38,
                                         "column": 53
                                     }
                                 },
@@ -775,13 +1710,13 @@
                                     "loc": {
                                         "source": "stringify.css",
                                         "start": {
-                                            "offset": 178,
-                                            "line": 12,
+                                            "offset": 446,
+                                            "line": 38,
                                             "column": 40
                                         },
                                         "end": {
-                                            "offset": 182,
-                                            "line": 12,
+                                            "offset": 450,
+                                            "line": 38,
                                             "column": 44
                                         }
                                     },
@@ -793,13 +1728,13 @@
                                     "loc": {
                                         "source": "stringify.css",
                                         "start": {
-                                            "offset": 183,
-                                            "line": 12,
+                                            "offset": 451,
+                                            "line": 38,
                                             "column": 45
                                         },
                                         "end": {
-                                            "offset": 188,
-                                            "line": 12,
+                                            "offset": 456,
+                                            "line": 38,
                                             "column": 50
                                         }
                                     },
@@ -812,13 +1747,13 @@
                                 "loc": {
                                     "source": "stringify.css",
                                     "start": {
-                                        "offset": 191,
-                                        "line": 12,
+                                        "offset": 459,
+                                        "line": 38,
                                         "column": 53
                                     },
                                     "end": {
-                                        "offset": 198,
-                                        "line": 12,
+                                        "offset": 466,
+                                        "line": 38,
                                         "column": 60
                                     }
                                 },
@@ -830,13 +1765,13 @@
                                 "loc": {
                                     "source": "stringify.css",
                                     "start": {
-                                        "offset": 198,
-                                        "line": 12,
+                                        "offset": 466,
+                                        "line": 38,
                                         "column": 60
                                     },
                                     "end": {
-                                        "offset": 206,
-                                        "line": 12,
+                                        "offset": 474,
+                                        "line": 38,
                                         "column": 68
                                     }
                                 },
@@ -848,13 +1783,13 @@
                                 "loc": {
                                     "source": "stringify.css",
                                     "start": {
-                                        "offset": 207,
-                                        "line": 12,
+                                        "offset": 475,
+                                        "line": 38,
                                         "column": 69
                                     },
                                     "end": {
-                                        "offset": 208,
-                                        "line": 12,
+                                        "offset": 476,
+                                        "line": 38,
                                         "column": 70
                                     }
                                 },
@@ -865,13 +1800,13 @@
                                 "loc": {
                                     "source": "stringify.css",
                                     "start": {
-                                        "offset": 209,
-                                        "line": 12,
+                                        "offset": 477,
+                                        "line": 38,
                                         "column": 71
                                     },
                                     "end": {
-                                        "offset": 219,
-                                        "line": 12,
+                                        "offset": 487,
+                                        "line": 38,
                                         "column": 81
                                     }
                                 },
@@ -882,13 +1817,13 @@
                                         "loc": {
                                             "source": "stringify.css",
                                             "start": {
-                                                "offset": 214,
-                                                "line": 12,
+                                                "offset": 482,
+                                                "line": 38,
                                                 "column": 76
                                             },
                                             "end": {
-                                                "offset": 218,
-                                                "line": 12,
+                                                "offset": 486,
+                                                "line": 38,
                                                 "column": 80
                                             }
                                         },
@@ -898,13 +1833,13 @@
                                                 "loc": {
                                                     "source": "stringify.css",
                                                     "start": {
-                                                        "offset": 214,
-                                                        "line": 12,
+                                                        "offset": 482,
+                                                        "line": 38,
                                                         "column": 76
                                                     },
                                                     "end": {
-                                                        "offset": 215,
-                                                        "line": 12,
+                                                        "offset": 483,
+                                                        "line": 38,
                                                         "column": 77
                                                     }
                                                 },
@@ -914,13 +1849,13 @@
                                                         "loc": {
                                                             "source": "stringify.css",
                                                             "start": {
-                                                                "offset": 214,
-                                                                "line": 12,
+                                                                "offset": 482,
+                                                                "line": 38,
                                                                 "column": 76
                                                             },
                                                             "end": {
-                                                                "offset": 215,
-                                                                "line": 12,
+                                                                "offset": 483,
+                                                                "line": 38,
                                                                 "column": 77
                                                             }
                                                         },
@@ -933,13 +1868,13 @@
                                                 "loc": {
                                                     "source": "stringify.css",
                                                     "start": {
-                                                        "offset": 217,
-                                                        "line": 12,
+                                                        "offset": 485,
+                                                        "line": 38,
                                                         "column": 79
                                                     },
                                                     "end": {
-                                                        "offset": 218,
-                                                        "line": 12,
+                                                        "offset": 486,
+                                                        "line": 38,
                                                         "column": 80
                                                     }
                                                 },
@@ -949,13 +1884,13 @@
                                                         "loc": {
                                                             "source": "stringify.css",
                                                             "start": {
-                                                                "offset": 217,
-                                                                "line": 12,
+                                                                "offset": 485,
+                                                                "line": 38,
                                                                 "column": 79
                                                             },
                                                             "end": {
-                                                                "offset": 218,
-                                                                "line": 12,
+                                                                "offset": 486,
+                                                                "line": 38,
                                                                 "column": 80
                                                             }
                                                         },
@@ -972,13 +1907,13 @@
                                 "loc": {
                                     "source": "stringify.css",
                                     "start": {
-                                        "offset": 220,
-                                        "line": 12,
+                                        "offset": 488,
+                                        "line": 38,
                                         "column": 82
                                     },
                                     "end": {
-                                        "offset": 221,
-                                        "line": 12,
+                                        "offset": 489,
+                                        "line": 38,
                                         "column": 83
                                     }
                                 },
@@ -989,13 +1924,13 @@
                                 "loc": {
                                     "source": "stringify.css",
                                     "start": {
-                                        "offset": 222,
-                                        "line": 12,
+                                        "offset": 490,
+                                        "line": 38,
                                         "column": 84
                                     },
                                     "end": {
-                                        "offset": 237,
-                                        "line": 12,
+                                        "offset": 505,
+                                        "line": 38,
                                         "column": 99
                                     }
                                 },
@@ -1006,13 +1941,13 @@
                                         "loc": {
                                             "source": "stringify.css",
                                             "start": {
-                                                "offset": 233,
-                                                "line": 12,
+                                                "offset": 501,
+                                                "line": 38,
                                                 "column": 95
                                             },
                                             "end": {
-                                                "offset": 236,
-                                                "line": 12,
+                                                "offset": 504,
+                                                "line": 38,
                                                 "column": 98
                                             }
                                         },
@@ -1021,13 +1956,13 @@
                                             "loc": {
                                                 "source": "stringify.css",
                                                 "start": {
-                                                    "offset": 233,
-                                                    "line": 12,
+                                                    "offset": 501,
+                                                    "line": 38,
                                                     "column": 95
                                                 },
                                                 "end": {
-                                                    "offset": 236,
-                                                    "line": 12,
+                                                    "offset": 504,
+                                                    "line": 38,
                                                     "column": 98
                                                 }
                                             },
@@ -1042,13 +1977,13 @@
                                 "loc": {
                                     "source": "stringify.css",
                                     "start": {
-                                        "offset": 237,
-                                        "line": 12,
+                                        "offset": 505,
+                                        "line": 38,
                                         "column": 99
                                     },
                                     "end": {
-                                        "offset": 255,
-                                        "line": 12,
+                                        "offset": 523,
+                                        "line": 38,
                                         "column": 117
                                     }
                                 },
@@ -1059,13 +1994,13 @@
                                         "loc": {
                                             "source": "stringify.css",
                                             "start": {
-                                                "offset": 248,
-                                                "line": 12,
+                                                "offset": 516,
+                                                "line": 38,
                                                 "column": 110
                                             },
                                             "end": {
-                                                "offset": 254,
-                                                "line": 12,
+                                                "offset": 522,
+                                                "line": 38,
                                                 "column": 116
                                             }
                                         },
@@ -1074,13 +2009,13 @@
                                             "loc": {
                                                 "source": "stringify.css",
                                                 "start": {
-                                                    "offset": 248,
-                                                    "line": 12,
+                                                    "offset": 516,
+                                                    "line": 38,
                                                     "column": 110
                                                 },
                                                 "end": {
-                                                    "offset": 254,
-                                                    "line": 12,
+                                                    "offset": 522,
+                                                    "line": 38,
                                                     "column": 116
                                                 }
                                             },
@@ -1098,13 +2033,13 @@
                         "loc": {
                             "source": "stringify.css",
                             "start": {
-                                "offset": 257,
-                                "line": 13,
+                                "offset": 525,
+                                "line": 39,
                                 "column": 1
                             },
                             "end": {
-                                "offset": 337,
-                                "line": 13,
+                                "offset": 605,
+                                "line": 39,
                                 "column": 81
                             }
                         },
@@ -1114,13 +2049,13 @@
                                 "loc": {
                                     "source": "stringify.css",
                                     "start": {
-                                        "offset": 257,
-                                        "line": 13,
+                                        "offset": 525,
+                                        "line": 39,
                                         "column": 1
                                     },
                                     "end": {
-                                        "offset": 262,
-                                        "line": 13,
+                                        "offset": 530,
+                                        "line": 39,
                                         "column": 6
                                     }
                                 },
@@ -1131,13 +2066,13 @@
                                 "loc": {
                                     "source": "stringify.css",
                                     "start": {
-                                        "offset": 262,
-                                        "line": 13,
+                                        "offset": 530,
+                                        "line": 39,
                                         "column": 6
                                     },
                                     "end": {
-                                        "offset": 273,
-                                        "line": 13,
+                                        "offset": 541,
+                                        "line": 39,
                                         "column": 17
                                     }
                                 },
@@ -1148,13 +2083,13 @@
                                         "loc": {
                                             "source": "stringify.css",
                                             "start": {
-                                                "offset": 271,
-                                                "line": 13,
+                                                "offset": 539,
+                                                "line": 39,
                                                 "column": 15
                                             },
                                             "end": {
-                                                "offset": 272,
-                                                "line": 13,
+                                                "offset": 540,
+                                                "line": 39,
                                                 "column": 16
                                             }
                                         },
@@ -1164,13 +2099,13 @@
                                                 "loc": {
                                                     "source": "stringify.css",
                                                     "start": {
-                                                        "offset": 271,
-                                                        "line": 13,
+                                                        "offset": 539,
+                                                        "line": 39,
                                                         "column": 15
                                                     },
                                                     "end": {
-                                                        "offset": 272,
-                                                        "line": 13,
+                                                        "offset": 540,
+                                                        "line": 39,
                                                         "column": 16
                                                     }
                                                 },
@@ -1180,13 +2115,13 @@
                                                         "loc": {
                                                             "source": "stringify.css",
                                                             "start": {
-                                                                "offset": 271,
-                                                                "line": 13,
+                                                                "offset": 539,
+                                                                "line": 39,
                                                                 "column": 15
                                                             },
                                                             "end": {
-                                                                "offset": 272,
-                                                                "line": 13,
+                                                                "offset": 540,
+                                                                "line": 39,
                                                                 "column": 16
                                                             }
                                                         },
@@ -1203,13 +2138,13 @@
                                 "loc": {
                                     "source": "stringify.css",
                                     "start": {
-                                        "offset": 273,
-                                        "line": 13,
+                                        "offset": 541,
+                                        "line": 39,
                                         "column": 17
                                     },
                                     "end": {
-                                        "offset": 285,
-                                        "line": 13,
+                                        "offset": 553,
+                                        "line": 39,
                                         "column": 29
                                     }
                                 },
@@ -1220,13 +2155,13 @@
                                         "loc": {
                                             "source": "stringify.css",
                                             "start": {
-                                                "offset": 283,
-                                                "line": 13,
+                                                "offset": 551,
+                                                "line": 39,
                                                 "column": 27
                                             },
                                             "end": {
-                                                "offset": 284,
-                                                "line": 13,
+                                                "offset": 552,
+                                                "line": 39,
                                                 "column": 28
                                             }
                                         },
@@ -1236,13 +2171,13 @@
                                                 "loc": {
                                                     "source": "stringify.css",
                                                     "start": {
-                                                        "offset": 283,
-                                                        "line": 13,
+                                                        "offset": 551,
+                                                        "line": 39,
                                                         "column": 27
                                                     },
                                                     "end": {
-                                                        "offset": 284,
-                                                        "line": 13,
+                                                        "offset": 552,
+                                                        "line": 39,
                                                         "column": 28
                                                     }
                                                 },
@@ -1257,13 +2192,13 @@
                                 "loc": {
                                     "source": "stringify.css",
                                     "start": {
-                                        "offset": 286,
-                                        "line": 13,
+                                        "offset": 554,
+                                        "line": 39,
                                         "column": 30
                                     },
                                     "end": {
-                                        "offset": 287,
-                                        "line": 13,
+                                        "offset": 555,
+                                        "line": 39,
                                         "column": 31
                                     }
                                 },
@@ -1274,13 +2209,13 @@
                                 "loc": {
                                     "source": "stringify.css",
                                     "start": {
-                                        "offset": 288,
-                                        "line": 13,
+                                        "offset": 556,
+                                        "line": 39,
                                         "column": 32
                                     },
                                     "end": {
-                                        "offset": 312,
-                                        "line": 13,
+                                        "offset": 580,
+                                        "line": 39,
                                         "column": 56
                                     }
                                 },
@@ -1291,13 +2226,13 @@
                                         "loc": {
                                             "source": "stringify.css",
                                             "start": {
-                                                "offset": 299,
-                                                "line": 13,
+                                                "offset": 567,
+                                                "line": 39,
                                                 "column": 43
                                             },
                                             "end": {
-                                                "offset": 311,
-                                                "line": 13,
+                                                "offset": 579,
+                                                "line": 39,
                                                 "column": 55
                                             }
                                         },
@@ -1306,13 +2241,13 @@
                                             "loc": {
                                                 "source": "stringify.css",
                                                 "start": {
-                                                    "offset": 299,
-                                                    "line": 13,
+                                                    "offset": 567,
+                                                    "line": 39,
                                                     "column": 43
                                                 },
                                                 "end": {
-                                                    "offset": 302,
-                                                    "line": 13,
+                                                    "offset": 570,
+                                                    "line": 39,
                                                     "column": 46
                                                 }
                                             },
@@ -1323,13 +2258,13 @@
                                             "loc": {
                                                 "source": "stringify.css",
                                                 "start": {
-                                                    "offset": 306,
-                                                    "line": 13,
+                                                    "offset": 574,
+                                                    "line": 39,
                                                     "column": 50
                                                 },
                                                 "end": {
-                                                    "offset": 311,
-                                                    "line": 13,
+                                                    "offset": 579,
+                                                    "line": 39,
                                                     "column": 55
                                                 }
                                             },
@@ -1339,13 +2274,13 @@
                                                     "loc": {
                                                         "source": "stringify.css",
                                                         "start": {
-                                                            "offset": 306,
-                                                            "line": 13,
+                                                            "offset": 574,
+                                                            "line": 39,
                                                             "column": 50
                                                         },
                                                         "end": {
-                                                            "offset": 307,
-                                                            "line": 13,
+                                                            "offset": 575,
+                                                            "line": 39,
                                                             "column": 51
                                                         }
                                                     },
@@ -1355,13 +2290,13 @@
                                                             "loc": {
                                                                 "source": "stringify.css",
                                                                 "start": {
-                                                                    "offset": 306,
-                                                                    "line": 13,
+                                                                    "offset": 574,
+                                                                    "line": 39,
                                                                     "column": 50
                                                                 },
                                                                 "end": {
-                                                                    "offset": 307,
-                                                                    "line": 13,
+                                                                    "offset": 575,
+                                                                    "line": 39,
                                                                     "column": 51
                                                                 }
                                                             },
@@ -1374,13 +2309,13 @@
                                                     "loc": {
                                                         "source": "stringify.css",
                                                         "start": {
-                                                            "offset": 309,
-                                                            "line": 13,
+                                                            "offset": 577,
+                                                            "line": 39,
                                                             "column": 53
                                                         },
                                                         "end": {
-                                                            "offset": 311,
-                                                            "line": 13,
+                                                            "offset": 579,
+                                                            "line": 39,
                                                             "column": 55
                                                         }
                                                     },
@@ -1390,13 +2325,13 @@
                                                             "loc": {
                                                                 "source": "stringify.css",
                                                                 "start": {
-                                                                    "offset": 309,
-                                                                    "line": 13,
+                                                                    "offset": 577,
+                                                                    "line": 39,
                                                                     "column": 53
                                                                 },
                                                                 "end": {
-                                                                    "offset": 311,
-                                                                    "line": 13,
+                                                                    "offset": 579,
+                                                                    "line": 39,
                                                                     "column": 55
                                                                 }
                                                             },
@@ -1415,13 +2350,13 @@
                                 "loc": {
                                     "source": "stringify.css",
                                     "start": {
-                                        "offset": 312,
-                                        "line": 13,
+                                        "offset": 580,
+                                        "line": 39,
                                         "column": 56
                                     },
                                     "end": {
-                                        "offset": 337,
-                                        "line": 13,
+                                        "offset": 605,
+                                        "line": 39,
                                         "column": 81
                                     }
                                 },
@@ -1432,13 +2367,13 @@
                                         "loc": {
                                             "source": "stringify.css",
                                             "start": {
-                                                "offset": 323,
-                                                "line": 13,
+                                                "offset": 591,
+                                                "line": 39,
                                                 "column": 67
                                             },
                                             "end": {
-                                                "offset": 336,
-                                                "line": 13,
+                                                "offset": 604,
+                                                "line": 39,
                                                 "column": 80
                                             }
                                         },
@@ -1447,13 +2382,13 @@
                                             "loc": {
                                                 "source": "stringify.css",
                                                 "start": {
-                                                    "offset": 323,
-                                                    "line": 13,
+                                                    "offset": 591,
+                                                    "line": 39,
                                                     "column": 67
                                                 },
                                                 "end": {
-                                                    "offset": 329,
-                                                    "line": 13,
+                                                    "offset": 597,
+                                                    "line": 39,
                                                     "column": 73
                                                 }
                                             },
@@ -1465,13 +2400,13 @@
                                             "loc": {
                                                 "source": "stringify.css",
                                                 "start": {
-                                                    "offset": 333,
-                                                    "line": 13,
+                                                    "offset": 601,
+                                                    "line": 39,
                                                     "column": 77
                                                 },
                                                 "end": {
-                                                    "offset": 336,
-                                                    "line": 13,
+                                                    "offset": 604,
+                                                    "line": 39,
                                                     "column": 80
                                                 }
                                             },
@@ -1481,13 +2416,13 @@
                                                     "loc": {
                                                         "source": "stringify.css",
                                                         "start": {
-                                                            "offset": 333,
-                                                            "line": 13,
+                                                            "offset": 601,
+                                                            "line": 39,
                                                             "column": 77
                                                         },
                                                         "end": {
-                                                            "offset": 336,
-                                                            "line": 13,
+                                                            "offset": 604,
+                                                            "line": 39,
                                                             "column": 80
                                                         }
                                                     },
@@ -1497,13 +2432,13 @@
                                                             "loc": {
                                                                 "source": "stringify.css",
                                                                 "start": {
-                                                                    "offset": 333,
-                                                                    "line": 13,
+                                                                    "offset": 601,
+                                                                    "line": 39,
                                                                     "column": 77
                                                                 },
                                                                 "end": {
-                                                                    "offset": 336,
-                                                                    "line": 13,
+                                                                    "offset": 604,
+                                                                    "line": 39,
                                                                     "column": 80
                                                                 }
                                                             },
@@ -1512,13 +2447,13 @@
                                                                 "loc": {
                                                                     "source": "stringify.css",
                                                                     "start": {
-                                                                        "offset": 334,
-                                                                        "line": 13,
+                                                                        "offset": 602,
+                                                                        "line": 39,
                                                                         "column": 78
                                                                     },
                                                                     "end": {
-                                                                        "offset": 335,
-                                                                        "line": 13,
+                                                                        "offset": 603,
+                                                                        "line": 39,
                                                                         "column": 79
                                                                     }
                                                                 },
@@ -1542,13 +2477,13 @@
                         "loc": {
                             "source": "stringify.css",
                             "start": {
-                                "offset": 339,
-                                "line": 14,
+                                "offset": 607,
+                                "line": 40,
                                 "column": 1
                             },
                             "end": {
-                                "offset": 350,
-                                "line": 14,
+                                "offset": 618,
+                                "line": 40,
                                 "column": 12
                             }
                         },
@@ -1558,13 +2493,13 @@
                                 "loc": {
                                     "source": "stringify.css",
                                     "start": {
-                                        "offset": 339,
-                                        "line": 14,
+                                        "offset": 607,
+                                        "line": 40,
                                         "column": 1
                                     },
                                     "end": {
-                                        "offset": 350,
-                                        "line": 14,
+                                        "offset": 618,
+                                        "line": 40,
                                         "column": 12
                                     }
                                 },
@@ -1575,13 +2510,13 @@
                                         "loc": {
                                             "source": "stringify.css",
                                             "start": {
-                                                "offset": 344,
-                                                "line": 14,
+                                                "offset": 612,
+                                                "line": 40,
                                                 "column": 6
                                             },
                                             "end": {
-                                                "offset": 349,
-                                                "line": 14,
+                                                "offset": 617,
+                                                "line": 40,
                                                 "column": 11
                                             }
                                         },
@@ -1591,13 +2526,13 @@
                                                 "loc": {
                                                     "source": "stringify.css",
                                                     "start": {
-                                                        "offset": 344,
-                                                        "line": 14,
+                                                        "offset": 612,
+                                                        "line": 40,
                                                         "column": 6
                                                     },
                                                     "end": {
-                                                        "offset": 349,
-                                                        "line": 14,
+                                                        "offset": 617,
+                                                        "line": 40,
                                                         "column": 11
                                                     }
                                                 },
@@ -1607,13 +2542,13 @@
                                                         "loc": {
                                                             "source": "stringify.css",
                                                             "start": {
-                                                                "offset": 344,
-                                                                "line": 14,
+                                                                "offset": 612,
+                                                                "line": 40,
                                                                 "column": 6
                                                             },
                                                             "end": {
-                                                                "offset": 345,
-                                                                "line": 14,
+                                                                "offset": 613,
+                                                                "line": 40,
                                                                 "column": 7
                                                             }
                                                         },
@@ -1624,13 +2559,13 @@
                                                         "loc": {
                                                             "source": "stringify.css",
                                                             "start": {
-                                                                "offset": 346,
-                                                                "line": 14,
+                                                                "offset": 614,
+                                                                "line": 40,
                                                                 "column": 8
                                                             },
                                                             "end": {
-                                                                "offset": 349,
-                                                                "line": 14,
+                                                                "offset": 617,
+                                                                "line": 40,
                                                                 "column": 11
                                                             }
                                                         },
@@ -1651,13 +2586,13 @@
                 "loc": {
                     "source": "stringify.css",
                     "start": {
-                        "offset": 351,
-                        "line": 14,
+                        "offset": 619,
+                        "line": 40,
                         "column": 13
                     },
                     "end": {
-                        "offset": 755,
-                        "line": 23,
+                        "offset": 1023,
+                        "line": 49,
                         "column": 2
                     }
                 },
@@ -1667,13 +2602,13 @@
                         "loc": {
                             "source": "stringify.css",
                             "start": {
-                                "offset": 357,
-                                "line": 15,
+                                "offset": 625,
+                                "line": 41,
                                 "column": 5
                             },
                             "end": {
-                                "offset": 369,
-                                "line": 15,
+                                "offset": 637,
+                                "line": 41,
                                 "column": 17
                             }
                         },
@@ -1684,13 +2619,13 @@
                             "loc": {
                                 "source": "stringify.css",
                                 "start": {
-                                    "offset": 364,
-                                    "line": 15,
+                                    "offset": 632,
+                                    "line": 41,
                                     "column": 12
                                 },
                                 "end": {
-                                    "offset": 369,
-                                    "line": 15,
+                                    "offset": 637,
+                                    "line": 41,
                                     "column": 17
                                 }
                             },
@@ -1700,13 +2635,13 @@
                                     "loc": {
                                         "source": "stringify.css",
                                         "start": {
-                                            "offset": 364,
-                                            "line": 15,
+                                            "offset": 632,
+                                            "line": 41,
                                             "column": 12
                                         },
                                         "end": {
-                                            "offset": 369,
-                                            "line": 15,
+                                            "offset": 637,
+                                            "line": 41,
                                             "column": 17
                                         }
                                     },
@@ -1720,13 +2655,13 @@
                         "loc": {
                             "source": "stringify.css",
                             "start": {
-                                "offset": 375,
-                                "line": 16,
+                                "offset": 643,
+                                "line": 42,
                                 "column": 5
                             },
                             "end": {
-                                "offset": 487,
-                                "line": 16,
+                                "offset": 755,
+                                "line": 42,
                                 "column": 117
                             }
                         },
@@ -1737,13 +2672,13 @@
                             "loc": {
                                 "source": "stringify.css",
                                 "start": {
-                                    "offset": 383,
-                                    "line": 16,
+                                    "offset": 651,
+                                    "line": 42,
                                     "column": 13
                                 },
                                 "end": {
-                                    "offset": 487,
-                                    "line": 16,
+                                    "offset": 755,
+                                    "line": 42,
                                     "column": 117
                                 }
                             },
@@ -1755,13 +2690,13 @@
                         "loc": {
                             "source": "stringify.css",
                             "start": {
-                                "offset": 493,
-                                "line": 17,
+                                "offset": 761,
+                                "line": 43,
                                 "column": 5
                             },
                             "end": {
-                                "offset": 517,
-                                "line": 17,
+                                "offset": 785,
+                                "line": 43,
                                 "column": 29
                             }
                         },
@@ -1772,13 +2707,13 @@
                             "loc": {
                                 "source": "stringify.css",
                                 "start": {
-                                    "offset": 500,
-                                    "line": 17,
+                                    "offset": 768,
+                                    "line": 43,
                                     "column": 12
                                 },
                                 "end": {
-                                    "offset": 517,
-                                    "line": 17,
+                                    "offset": 785,
+                                    "line": 43,
                                     "column": 29
                                 }
                             },
@@ -1788,13 +2723,13 @@
                                     "loc": {
                                         "source": "stringify.css",
                                         "start": {
-                                            "offset": 500,
-                                            "line": 17,
+                                            "offset": 768,
+                                            "line": 43,
                                             "column": 12
                                         },
                                         "end": {
-                                            "offset": 517,
-                                            "line": 17,
+                                            "offset": 785,
+                                            "line": 43,
                                             "column": 29
                                         }
                                     },
@@ -1805,13 +2740,13 @@
                                             "loc": {
                                                 "source": "stringify.css",
                                                 "start": {
-                                                    "offset": 511,
-                                                    "line": 17,
+                                                    "offset": 779,
+                                                    "line": 43,
                                                     "column": 23
                                                 },
                                                 "end": {
-                                                    "offset": 516,
-                                                    "line": 17,
+                                                    "offset": 784,
+                                                    "line": 43,
                                                     "column": 28
                                                 }
                                             },
@@ -1827,13 +2762,13 @@
                         "loc": {
                             "source": "stringify.css",
                             "start": {
-                                "offset": 523,
-                                "line": 18,
+                                "offset": 791,
+                                "line": 44,
                                 "column": 5
                             },
                             "end": {
-                                "offset": 752,
-                                "line": 22,
+                                "offset": 1020,
+                                "line": 48,
                                 "column": 89
                             }
                         },
@@ -1844,13 +2779,13 @@
                             "loc": {
                                 "source": "stringify.css",
                                 "start": {
-                                    "offset": 543,
-                                    "line": 19,
+                                    "offset": 811,
+                                    "line": 45,
                                     "column": 9
                                 },
                                 "end": {
-                                    "offset": 742,
-                                    "line": 22,
+                                    "offset": 1010,
+                                    "line": 48,
                                     "column": 79
                                 }
                             },
@@ -1860,13 +2795,13 @@
                                     "loc": {
                                         "source": "stringify.css",
                                         "start": {
-                                            "offset": 543,
-                                            "line": 19,
+                                            "offset": 811,
+                                            "line": 45,
                                             "column": 9
                                         },
                                         "end": {
-                                            "offset": 548,
-                                            "line": 19,
+                                            "offset": 816,
+                                            "line": 45,
                                             "column": 14
                                         }
                                     },
@@ -1877,13 +2812,13 @@
                                     "loc": {
                                         "source": "stringify.css",
                                         "start": {
-                                            "offset": 549,
-                                            "line": 19,
+                                            "offset": 817,
+                                            "line": 45,
                                             "column": 15
                                         },
                                         "end": {
-                                            "offset": 555,
-                                            "line": 19,
+                                            "offset": 823,
+                                            "line": 45,
                                             "column": 21
                                         }
                                     },
@@ -1894,13 +2829,13 @@
                                     "loc": {
                                         "source": "stringify.css",
                                         "start": {
-                                            "offset": 556,
-                                            "line": 19,
+                                            "offset": 824,
+                                            "line": 45,
                                             "column": 22
                                         },
                                         "end": {
-                                            "offset": 560,
-                                            "line": 19,
+                                            "offset": 828,
+                                            "line": 45,
                                             "column": 26
                                         }
                                     },
@@ -1911,13 +2846,13 @@
                                     "loc": {
                                         "source": "stringify.css",
                                         "start": {
-                                            "offset": 561,
-                                            "line": 19,
+                                            "offset": 829,
+                                            "line": 45,
                                             "column": 27
                                         },
                                         "end": {
-                                            "offset": 564,
-                                            "line": 19,
+                                            "offset": 832,
+                                            "line": 45,
                                             "column": 30
                                         }
                                     },
@@ -1929,13 +2864,13 @@
                                     "loc": {
                                         "source": "stringify.css",
                                         "start": {
-                                            "offset": 564,
-                                            "line": 19,
+                                            "offset": 832,
+                                            "line": 45,
                                             "column": 30
                                         },
                                         "end": {
-                                            "offset": 565,
-                                            "line": 19,
+                                            "offset": 833,
+                                            "line": 45,
                                             "column": 31
                                         }
                                     },
@@ -1946,13 +2881,13 @@
                                     "loc": {
                                         "source": "stringify.css",
                                         "start": {
-                                            "offset": 565,
-                                            "line": 19,
+                                            "offset": 833,
+                                            "line": 45,
                                             "column": 31
                                         },
                                         "end": {
-                                            "offset": 568,
-                                            "line": 19,
+                                            "offset": 836,
+                                            "line": 45,
                                             "column": 34
                                         }
                                     },
@@ -1964,13 +2899,13 @@
                                     "loc": {
                                         "source": "stringify.css",
                                         "start": {
-                                            "offset": 569,
-                                            "line": 19,
+                                            "offset": 837,
+                                            "line": 45,
                                             "column": 35
                                         },
                                         "end": {
-                                            "offset": 587,
-                                            "line": 19,
+                                            "offset": 855,
+                                            "line": 45,
                                             "column": 53
                                         }
                                     },
@@ -1981,13 +2916,13 @@
                                             "loc": {
                                                 "source": "stringify.css",
                                                 "start": {
-                                                    "offset": 574,
-                                                    "line": 19,
+                                                    "offset": 842,
+                                                    "line": 45,
                                                     "column": 40
                                                 },
                                                 "end": {
-                                                    "offset": 577,
-                                                    "line": 19,
+                                                    "offset": 845,
+                                                    "line": 45,
                                                     "column": 43
                                                 }
                                             },
@@ -1999,13 +2934,13 @@
                                             "loc": {
                                                 "source": "stringify.css",
                                                 "start": {
-                                                    "offset": 578,
-                                                    "line": 19,
+                                                    "offset": 846,
+                                                    "line": 45,
                                                     "column": 44
                                                 },
                                                 "end": {
-                                                    "offset": 579,
-                                                    "line": 19,
+                                                    "offset": 847,
+                                                    "line": 45,
                                                     "column": 45
                                                 }
                                             },
@@ -2016,13 +2951,13 @@
                                             "loc": {
                                                 "source": "stringify.css",
                                                 "start": {
-                                                    "offset": 580,
-                                                    "line": 19,
+                                                    "offset": 848,
+                                                    "line": 45,
                                                     "column": 46
                                                 },
                                                 "end": {
-                                                    "offset": 582,
-                                                    "line": 19,
+                                                    "offset": 850,
+                                                    "line": 45,
                                                     "column": 48
                                                 }
                                             },
@@ -2033,13 +2968,13 @@
                                             "loc": {
                                                 "source": "stringify.css",
                                                 "start": {
-                                                    "offset": 583,
-                                                    "line": 19,
+                                                    "offset": 851,
+                                                    "line": 45,
                                                     "column": 49
                                                 },
                                                 "end": {
-                                                    "offset": 584,
-                                                    "line": 19,
+                                                    "offset": 852,
+                                                    "line": 45,
                                                     "column": 50
                                                 }
                                             },
@@ -2050,13 +2985,13 @@
                                             "loc": {
                                                 "source": "stringify.css",
                                                 "start": {
-                                                    "offset": 585,
-                                                    "line": 19,
+                                                    "offset": 853,
+                                                    "line": 45,
                                                     "column": 51
                                                 },
                                                 "end": {
-                                                    "offset": 586,
-                                                    "line": 19,
+                                                    "offset": 854,
+                                                    "line": 45,
                                                     "column": 52
                                                 }
                                             },
@@ -2069,13 +3004,13 @@
                                     "loc": {
                                         "source": "stringify.css",
                                         "start": {
-                                            "offset": 587,
-                                            "line": 19,
+                                            "offset": 855,
+                                            "line": 45,
                                             "column": 53
                                         },
                                         "end": {
-                                            "offset": 588,
-                                            "line": 19,
+                                            "offset": 856,
+                                            "line": 45,
                                             "column": 54
                                         }
                                     },
@@ -2086,13 +3021,13 @@
                                     "loc": {
                                         "source": "stringify.css",
                                         "start": {
-                                            "offset": 597,
-                                            "line": 20,
+                                            "offset": 865,
+                                            "line": 46,
                                             "column": 9
                                         },
                                         "end": {
-                                            "offset": 613,
-                                            "line": 20,
+                                            "offset": 881,
+                                            "line": 46,
                                             "column": 25
                                         }
                                     },
@@ -2103,13 +3038,13 @@
                                     "loc": {
                                         "source": "stringify.css",
                                         "start": {
-                                            "offset": 614,
-                                            "line": 20,
+                                            "offset": 882,
+                                            "line": 46,
                                             "column": 26
                                         },
                                         "end": {
-                                            "offset": 636,
-                                            "line": 20,
+                                            "offset": 904,
+                                            "line": 46,
                                             "column": 48
                                         }
                                     },
@@ -2120,13 +3055,13 @@
                                     "loc": {
                                         "source": "stringify.css",
                                         "start": {
-                                            "offset": 645,
-                                            "line": 21,
+                                            "offset": 913,
+                                            "line": 47,
                                             "column": 9
                                         },
                                         "end": {
-                                            "offset": 654,
-                                            "line": 21,
+                                            "offset": 922,
+                                            "line": 47,
                                             "column": 18
                                         }
                                     },
@@ -2137,13 +3072,13 @@
                                     "loc": {
                                         "source": "stringify.css",
                                         "start": {
-                                            "offset": 655,
-                                            "line": 21,
+                                            "offset": 923,
+                                            "line": 47,
                                             "column": 19
                                         },
                                         "end": {
-                                            "offset": 663,
-                                            "line": 21,
+                                            "offset": 931,
+                                            "line": 47,
                                             "column": 27
                                         }
                                     },
@@ -2154,13 +3089,13 @@
                                     "loc": {
                                         "source": "stringify.css",
                                         "start": {
-                                            "offset": 672,
-                                            "line": 22,
+                                            "offset": 940,
+                                            "line": 48,
                                             "column": 9
                                         },
                                         "end": {
-                                            "offset": 688,
-                                            "line": 22,
+                                            "offset": 956,
+                                            "line": 48,
                                             "column": 25
                                         }
                                     },
@@ -2171,13 +3106,13 @@
                                             "loc": {
                                                 "source": "stringify.css",
                                                 "start": {
-                                                    "offset": 677,
-                                                    "line": 22,
+                                                    "offset": 945,
+                                                    "line": 48,
                                                     "column": 14
                                                 },
                                                 "end": {
-                                                    "offset": 678,
-                                                    "line": 22,
+                                                    "offset": 946,
+                                                    "line": 48,
                                                     "column": 15
                                                 }
                                             },
@@ -2188,13 +3123,13 @@
                                             "loc": {
                                                 "source": "stringify.css",
                                                 "start": {
-                                                    "offset": 678,
-                                                    "line": 22,
+                                                    "offset": 946,
+                                                    "line": 48,
                                                     "column": 15
                                                 },
                                                 "end": {
-                                                    "offset": 679,
-                                                    "line": 22,
+                                                    "offset": 947,
+                                                    "line": 48,
                                                     "column": 16
                                                 }
                                             },
@@ -2205,13 +3140,13 @@
                                             "loc": {
                                                 "source": "stringify.css",
                                                 "start": {
-                                                    "offset": 680,
-                                                    "line": 22,
+                                                    "offset": 948,
+                                                    "line": 48,
                                                     "column": 17
                                                 },
                                                 "end": {
-                                                    "offset": 681,
-                                                    "line": 22,
+                                                    "offset": 949,
+                                                    "line": 48,
                                                     "column": 18
                                                 }
                                             },
@@ -2222,13 +3157,13 @@
                                             "loc": {
                                                 "source": "stringify.css",
                                                 "start": {
-                                                    "offset": 681,
-                                                    "line": 22,
+                                                    "offset": 949,
+                                                    "line": 48,
                                                     "column": 18
                                                 },
                                                 "end": {
-                                                    "offset": 682,
-                                                    "line": 22,
+                                                    "offset": 950,
+                                                    "line": 48,
                                                     "column": 19
                                                 }
                                             },
@@ -2239,13 +3174,13 @@
                                             "loc": {
                                                 "source": "stringify.css",
                                                 "start": {
-                                                    "offset": 683,
-                                                    "line": 22,
+                                                    "offset": 951,
+                                                    "line": 48,
                                                     "column": 20
                                                 },
                                                 "end": {
-                                                    "offset": 684,
-                                                    "line": 22,
+                                                    "offset": 952,
+                                                    "line": 48,
                                                     "column": 21
                                                 }
                                             },
@@ -2256,13 +3191,13 @@
                                             "loc": {
                                                 "source": "stringify.css",
                                                 "start": {
-                                                    "offset": 684,
-                                                    "line": 22,
+                                                    "offset": 952,
+                                                    "line": 48,
                                                     "column": 21
                                                 },
                                                 "end": {
-                                                    "offset": 685,
-                                                    "line": 22,
+                                                    "offset": 953,
+                                                    "line": 48,
                                                     "column": 22
                                                 }
                                             },
@@ -2273,13 +3208,13 @@
                                             "loc": {
                                                 "source": "stringify.css",
                                                 "start": {
-                                                    "offset": 686,
-                                                    "line": 22,
+                                                    "offset": 954,
+                                                    "line": 48,
                                                     "column": 23
                                                 },
                                                 "end": {
-                                                    "offset": 687,
-                                                    "line": 22,
+                                                    "offset": 955,
+                                                    "line": 48,
                                                     "column": 24
                                                 }
                                             },
@@ -2292,13 +3227,13 @@
                                     "loc": {
                                         "source": "stringify.css",
                                         "start": {
-                                            "offset": 689,
-                                            "line": 22,
+                                            "offset": 957,
+                                            "line": 48,
                                             "column": 26
                                         },
                                         "end": {
-                                            "offset": 693,
-                                            "line": 22,
+                                            "offset": 961,
+                                            "line": 48,
                                             "column": 30
                                         }
                                     },
@@ -2309,13 +3244,13 @@
                                     "loc": {
                                         "source": "stringify.css",
                                         "start": {
-                                            "offset": 694,
-                                            "line": 22,
+                                            "offset": 962,
+                                            "line": 48,
                                             "column": 31
                                         },
                                         "end": {
-                                            "offset": 701,
-                                            "line": 22,
+                                            "offset": 969,
+                                            "line": 48,
                                             "column": 38
                                         }
                                     },
@@ -2326,13 +3261,13 @@
                                     "loc": {
                                         "source": "stringify.css",
                                         "start": {
-                                            "offset": 702,
-                                            "line": 22,
+                                            "offset": 970,
+                                            "line": 48,
                                             "column": 39
                                         },
                                         "end": {
-                                            "offset": 710,
-                                            "line": 22,
+                                            "offset": 978,
+                                            "line": 48,
                                             "column": 47
                                         }
                                     },
@@ -2343,13 +3278,13 @@
                                     "loc": {
                                         "source": "stringify.css",
                                         "start": {
-                                            "offset": 711,
-                                            "line": 22,
+                                            "offset": 979,
+                                            "line": 48,
                                             "column": 48
                                         },
                                         "end": {
-                                            "offset": 719,
-                                            "line": 22,
+                                            "offset": 987,
+                                            "line": 48,
                                             "column": 56
                                         }
                                     },
@@ -2360,13 +3295,13 @@
                                     "loc": {
                                         "source": "stringify.css",
                                         "start": {
-                                            "offset": 720,
-                                            "line": 22,
+                                            "offset": 988,
+                                            "line": 48,
                                             "column": 57
                                         },
                                         "end": {
-                                            "offset": 733,
-                                            "line": 22,
+                                            "offset": 1001,
+                                            "line": 48,
                                             "column": 70
                                         }
                                     },
@@ -2376,13 +3311,13 @@
                                             "loc": {
                                                 "source": "stringify.css",
                                                 "start": {
-                                                    "offset": 721,
-                                                    "line": 22,
+                                                    "offset": 989,
+                                                    "line": 48,
                                                     "column": 58
                                                 },
                                                 "end": {
-                                                    "offset": 732,
-                                                    "line": 22,
+                                                    "offset": 1000,
+                                                    "line": 48,
                                                     "column": 69
                                                 }
                                             },
@@ -2395,13 +3330,13 @@
                                     "loc": {
                                         "source": "stringify.css",
                                         "start": {
-                                            "offset": 734,
-                                            "line": 22,
+                                            "offset": 1002,
+                                            "line": 48,
                                             "column": 71
                                         },
                                         "end": {
-                                            "offset": 741,
-                                            "line": 22,
+                                            "offset": 1009,
+                                            "line": 48,
                                             "column": 78
                                         }
                                     },
@@ -2411,13 +3346,13 @@
                                             "loc": {
                                                 "source": "stringify.css",
                                                 "start": {
-                                                    "offset": 735,
-                                                    "line": 22,
+                                                    "offset": 1003,
+                                                    "line": 48,
                                                     "column": 72
                                                 },
                                                 "end": {
-                                                    "offset": 740,
-                                                    "line": 22,
+                                                    "offset": 1008,
+                                                    "line": 48,
                                                     "column": 77
                                                 }
                                             },
@@ -2436,13 +3371,13 @@
             "loc": {
                 "source": "stringify.css",
                 "start": {
-                    "offset": 757,
-                    "line": 25,
+                    "offset": 1025,
+                    "line": 51,
                     "column": 1
                 },
                 "end": {
-                    "offset": 936,
-                    "line": 31,
+                    "offset": 1204,
+                    "line": 57,
                     "column": 2
                 }
             },
@@ -2452,14 +3387,14 @@
                 "loc": {
                     "source": "stringify.css",
                     "start": {
-                        "offset": 764,
-                        "line": 25,
+                        "offset": 1032,
+                        "line": 51,
                         "column": 8
                     },
                     "end": {
-                        "offset": 791,
-                        "line": 25,
-                        "column": 35
+                        "offset": 1060,
+                        "line": 51,
+                        "column": 36
                     }
                 },
                 "children": [
@@ -2468,14 +3403,14 @@
                         "loc": {
                             "source": "stringify.css",
                             "start": {
-                                "offset": 764,
-                                "line": 25,
+                                "offset": 1032,
+                                "line": 51,
                                 "column": 8
                             },
                             "end": {
-                                "offset": 791,
-                                "line": 25,
-                                "column": 35
+                                "offset": 1060,
+                                "line": 51,
+                                "column": 36
                             }
                         },
                         "children": [
@@ -2484,53 +3419,105 @@
                                 "loc": {
                                     "source": "stringify.css",
                                     "start": {
-                                        "offset": 764,
-                                        "line": 25,
+                                        "offset": 1032,
+                                        "line": 51,
                                         "column": 8
                                     },
                                     "end": {
-                                        "offset": 791,
-                                        "line": 25,
-                                        "column": 35
+                                        "offset": 1060,
+                                        "line": 51,
+                                        "column": 36
                                     }
                                 },
-                                "children": [
-                                    {
-                                        "type": "MediaFeature",
-                                        "loc": {
-                                            "source": "stringify.css",
-                                            "start": {
-                                                "offset": 764,
-                                                "line": 25,
-                                                "column": 8
-                                            },
-                                            "end": {
-                                                "offset": 791,
-                                                "line": 25,
-                                                "column": 35
-                                            }
+                                "modifier": null,
+                                "mediaType": null,
+                                "condition": {
+                                    "type": "Condition",
+                                    "loc": {
+                                        "source": "stringify.css",
+                                        "start": {
+                                            "offset": 1032,
+                                            "line": 51,
+                                            "column": 8
                                         },
-                                        "name": "device-aspect-ratio",
-                                        "value": {
-                                            "type": "Ratio",
+                                        "end": {
+                                            "offset": 1059,
+                                            "line": 51,
+                                            "column": 35
+                                        }
+                                    },
+                                    "kind": "media",
+                                    "children": [
+                                        {
+                                            "type": "Feature",
                                             "loc": {
                                                 "source": "stringify.css",
                                                 "start": {
-                                                    "offset": 786,
-                                                    "line": 25,
-                                                    "column": 30
+                                                    "offset": 1032,
+                                                    "line": 51,
+                                                    "column": 8
                                                 },
                                                 "end": {
-                                                    "offset": 790,
-                                                    "line": 25,
-                                                    "column": 34
+                                                    "offset": 1059,
+                                                    "line": 51,
+                                                    "column": 35
                                                 }
                                             },
-                                            "left": "16",
-                                            "right": "9"
+                                            "kind": "media",
+                                            "name": "device-aspect-ratio",
+                                            "value": {
+                                                "type": "Ratio",
+                                                "loc": {
+                                                    "source": "stringify.css",
+                                                    "start": {
+                                                        "offset": 1054,
+                                                        "line": 51,
+                                                        "column": 30
+                                                    },
+                                                    "end": {
+                                                        "offset": 1058,
+                                                        "line": 51,
+                                                        "column": 34
+                                                    }
+                                                },
+                                                "left": {
+                                                    "type": "Number",
+                                                    "loc": {
+                                                        "source": "stringify.css",
+                                                        "start": {
+                                                            "offset": 1054,
+                                                            "line": 51,
+                                                            "column": 30
+                                                        },
+                                                        "end": {
+                                                            "offset": 1056,
+                                                            "line": 51,
+                                                            "column": 32
+                                                        }
+                                                    },
+                                                    "value": "16"
+                                                },
+                                                "right": {
+                                                    "type": "Number",
+                                                    "loc": {
+                                                        "source": "stringify.css",
+                                                        "start": {
+                                                            "offset": 1057,
+                                                            "line": 51,
+                                                            "column": 33
+                                                        },
+                                                        "end": {
+                                                            "offset": 1058,
+                                                            "line": 51,
+                                                            "column": 34
+                                                        }
+                                                    },
+                                                    "value": "9"
+                                                }
+                                            }
                                         }
-                                    }
-                                ]
+                                    ]
+                                }
                             }
                         ]
                     }
@@ -2541,13 +3528,13 @@
                 "loc": {
                     "source": "stringify.css",
                     "start": {
-                        "offset": 792,
-                        "line": 25,
+                        "offset": 1060,
+                        "line": 51,
                         "column": 36
                     },
                     "end": {
-                        "offset": 936,
-                        "line": 31,
+                        "offset": 1204,
+                        "line": 57,
                         "column": 2
                     }
                 },
@@ -2557,13 +3544,13 @@
                         "loc": {
                             "source": "stringify.css",
                             "start": {
-                                "offset": 798,
-                                "line": 26,
+                                "offset": 1066,
+                                "line": 52,
                                 "column": 5
                             },
                             "end": {
-                                "offset": 934,
-                                "line": 30,
+                                "offset": 1202,
+                                "line": 56,
                                 "column": 6
                             }
                         },
@@ -2572,13 +3559,13 @@
                             "loc": {
                                 "source": "stringify.css",
                                 "start": {
-                                    "offset": 798,
-                                    "line": 26,
+                                    "offset": 1066,
+                                    "line": 52,
                                     "column": 5
                                 },
                                 "end": {
-                                    "offset": 811,
-                                    "line": 26,
+                                    "offset": 1079,
+                                    "line": 52,
                                     "column": 18
                                 }
                             },
@@ -2588,13 +3575,13 @@
                                     "loc": {
                                         "source": "stringify.css",
                                         "start": {
-                                            "offset": 798,
-                                            "line": 26,
+                                            "offset": 1066,
+                                            "line": 52,
                                             "column": 5
                                         },
                                         "end": {
-                                            "offset": 811,
-                                            "line": 26,
+                                            "offset": 1079,
+                                            "line": 52,
                                             "column": 18
                                         }
                                     },
@@ -2604,13 +3591,13 @@
                                             "loc": {
                                                 "source": "stringify.css",
                                                 "start": {
-                                                    "offset": 798,
-                                                    "line": 26,
+                                                    "offset": 1066,
+                                                    "line": 52,
                                                     "column": 5
                                                 },
                                                 "end": {
-                                                    "offset": 804,
-                                                    "line": 26,
+                                                    "offset": 1072,
+                                                    "line": 52,
                                                     "column": 11
                                                 }
                                             },
@@ -2621,13 +3608,13 @@
                                             "loc": {
                                                 "source": "stringify.css",
                                                 "start": {
-                                                    "offset": 804,
-                                                    "line": 26,
+                                                    "offset": 1072,
+                                                    "line": 52,
                                                     "column": 11
                                                 },
                                                 "end": {
-                                                    "offset": 811,
-                                                    "line": 26,
+                                                    "offset": 1079,
+                                                    "line": 52,
                                                     "column": 18
                                                 }
                                             },
@@ -2643,13 +3630,13 @@
                             "loc": {
                                 "source": "stringify.css",
                                 "start": {
-                                    "offset": 812,
-                                    "line": 26,
+                                    "offset": 1080,
+                                    "line": 52,
                                     "column": 19
                                 },
                                 "end": {
-                                    "offset": 934,
-                                    "line": 30,
+                                    "offset": 1202,
+                                    "line": 56,
                                     "column": 6
                                 }
                             },
@@ -2659,13 +3646,13 @@
                                     "loc": {
                                         "source": "stringify.css",
                                         "start": {
-                                            "offset": 822,
-                                            "line": 27,
+                                            "offset": 1090,
+                                            "line": 53,
                                             "column": 9
                                         },
                                         "end": {
-                                            "offset": 857,
-                                            "line": 27,
+                                            "offset": 1125,
+                                            "line": 53,
                                             "column": 44
                                         }
                                     },
@@ -2676,13 +3663,13 @@
                                         "loc": {
                                             "source": "stringify.css",
                                             "start": {
-                                                "offset": 832,
-                                                "line": 27,
+                                                "offset": 1100,
+                                                "line": 53,
                                                 "column": 19
                                             },
                                             "end": {
-                                                "offset": 857,
-                                                "line": 27,
+                                                "offset": 1125,
+                                                "line": 53,
                                                 "column": 44
                                             }
                                         },
@@ -2694,13 +3681,13 @@
                                     "loc": {
                                         "source": "stringify.css",
                                         "start": {
-                                            "offset": 867,
-                                            "line": 28,
+                                            "offset": 1135,
+                                            "line": 54,
                                             "column": 9
                                         },
                                         "end": {
-                                            "offset": 893,
-                                            "line": 28,
+                                            "offset": 1161,
+                                            "line": 54,
                                             "column": 35
                                         }
                                     },
@@ -2711,13 +3698,13 @@
                                         "loc": {
                                             "source": "stringify.css",
                                             "start": {
-                                                "offset": 877,
-                                                "line": 28,
+                                                "offset": 1145,
+                                                "line": 54,
                                                 "column": 19
                                             },
                                             "end": {
-                                                "offset": 883,
-                                                "line": 28,
+                                                "offset": 1151,
+                                                "line": 54,
                                                 "column": 25
                                             }
                                         },
@@ -2729,13 +3716,13 @@
                                     "loc": {
                                         "source": "stringify.css",
                                         "start": {
-                                            "offset": 903,
-                                            "line": 29,
+                                            "offset": 1171,
+                                            "line": 55,
                                             "column": 9
                                         },
                                         "end": {
-                                            "offset": 927,
-                                            "line": 29,
+                                            "offset": 1195,
+                                            "line": 55,
                                             "column": 33
                                         }
                                     },
@@ -2746,13 +3733,13 @@
                                         "loc": {
                                             "source": "stringify.css",
                                             "start": {
-                                                "offset": 915,
-                                                "line": 29,
+                                                "offset": 1183,
+                                                "line": 55,
                                                 "column": 21
                                             },
                                             "end": {
-                                                "offset": 927,
-                                                "line": 29,
+                                                "offset": 1195,
+                                                "line": 55,
                                                 "column": 33
                                             }
                                         },
@@ -2762,13 +3749,13 @@
                                                 "loc": {
                                                     "source": "stringify.css",
                                                     "start": {
-                                                        "offset": 915,
-                                                        "line": 29,
+                                                        "offset": 1183,
+                                                        "line": 55,
                                                         "column": 21
                                                     },
                                                     "end": {
-                                                        "offset": 927,
-                                                        "line": 29,
+                                                        "offset": 1195,
+                                                        "line": 55,
                                                         "column": 33
                                                     }
                                                 },
@@ -2779,13 +3766,13 @@
                                                         "loc": {
                                                             "source": "stringify.css",
                                                             "start": {
-                                                                "offset": 923,
-                                                                "line": 29,
+                                                                "offset": 1191,
+                                                                "line": 55,
                                                                 "column": 29
                                                             },
                                                             "end": {
-                                                                "offset": 926,
-                                                                "line": 29,
+                                                                "offset": 1194,
+                                                                "line": 55,
                                                                 "column": 32
                                                             }
                                                         },
@@ -2807,13 +3794,13 @@
             "loc": {
                 "source": "stringify.css",
                 "start": {
-                    "offset": 938,
-                    "line": 33,
+                    "offset": 1206,
+                    "line": 59,
                     "column": 1
                 },
                 "end": {
-                    "offset": 1056,
-                    "line": 37,
+                    "offset": 1324,
+                    "line": 63,
                     "column": 2
                 }
             },
@@ -2823,120 +3810,137 @@
                 "loc": {
                     "source": "stringify.css",
                     "start": {
-                        "offset": 948,
-                        "line": 33,
+                        "offset": 1216,
+                        "line": 59,
                         "column": 11
                     },
                     "end": {
-                        "offset": 986,
-                        "line": 33,
+                        "offset": 1254,
+                        "line": 59,
                         "column": 49
                     }
                 },
                 "children": [
                     {
-                        "type": "Parentheses",
+                        "type": "Condition",
                         "loc": {
                             "source": "stringify.css",
                             "start": {
-                                "offset": 948,
-                                "line": 33,
+                                "offset": 1216,
+                                "line": 59,
                                 "column": 11
                             },
                             "end": {
-                                "offset": 986,
-                                "line": 33,
+                                "offset": 1254,
+                                "line": 59,
                                 "column": 49
                             }
                         },
+                        "kind": "supports",
                         "children": [
                             {
-                                "type": "Declaration",
+                                "type": "SupportsDeclaration",
                                 "loc": {
                                     "source": "stringify.css",
                                     "start": {
-                                        "offset": 949,
-                                        "line": 33,
-                                        "column": 12
+                                        "offset": 1216,
+                                        "line": 59,
+                                        "column": 11
                                     },
                                     "end": {
-                                        "offset": 985,
-                                        "line": 33,
-                                        "column": 48
+                                        "offset": 1254,
+                                        "line": 59,
+                                        "column": 49
                                     }
                                 },
-                                "important": true,
-                                "property": "box-shadow",
-                                "value": {
-                                    "type": "Value",
+                                "declaration": {
+                                    "type": "Declaration",
                                     "loc": {
                                         "source": "stringify.css",
                                         "start": {
-                                            "offset": 961,
-                                            "line": 33,
-                                            "column": 24
+                                            "offset": 1217,
+                                            "line": 59,
+                                            "column": 12
                                         },
                                         "end": {
-                                            "offset": 975,
-                                            "line": 33,
-                                            "column": 38
+                                            "offset": 1253,
+                                            "line": 59,
+                                            "column": 48
                                         }
                                     },
-                                    "children": [
-                                        {
-                                            "type": "Dimension",
-                                            "loc": {
-                                                "source": "stringify.css",
-                                                "start": {
-                                                    "offset": 961,
-                                                    "line": 33,
-                                                    "column": 24
-                                                },
-                                                "end": {
-                                                    "offset": 964,
-                                                    "line": 33,
-                                                    "column": 27
-                                                }
+                                    "important": true,
+                                    "property": "box-shadow",
+                                    "value": {
+                                        "type": "Value",
+                                        "loc": {
+                                            "source": "stringify.css",
+                                            "start": {
+                                                "offset": 1229,
+                                                "line": 59,
+                                                "column": 24
                                             },
-                                            "value": "1",
-                                            "unit": "px"
+                                            "end": {
+                                                "offset": 1243,
+                                                "line": 59,
+                                                "column": 38
+                                            }
                                         },
-                                        {
-                                            "type": "Dimension",
-                                            "loc": {
-                                                "source": "stringify.css",
-                                                "start": {
-                                                    "offset": 965,
-                                                    "line": 33,
-                                                    "column": 28
+                                        "children": [
+                                            {
+                                                "type": "Dimension",
+                                                "loc": {
+                                                    "source": "stringify.css",
+                                                    "start": {
+                                                        "offset": 1229,
+                                                        "line": 59,
+                                                        "column": 24
+                                                    },
+                                                    "end": {
+                                                        "offset": 1232,
+                                                        "line": 59,
+                                                        "column": 27
+                                                    }
                                                 },
-                                                "end": {
-                                                    "offset": 968,
-                                                    "line": 33,
-                                                    "column": 31
-                                                }
+                                                "value": "1",
+                                                "unit": "px"
                                             },
-                                            "value": "2",
-                                            "unit": "px"
-                                        },
-                                        {
-                                            "type": "Identifier",
-                                            "loc": {
-                                                "source": "stringify.css",
-                                                "start": {
-                                                    "offset": 969,
-                                                    "line": 33,
-                                                    "column": 32
+                                            {
+                                                "type": "Dimension",
+                                                "loc": {
+                                                    "source": "stringify.css",
+                                                    "start": {
+                                                        "offset": 1233,
+                                                        "line": 59,
+                                                        "column": 28
+                                                    },
+                                                    "end": {
+                                                        "offset": 1236,
+                                                        "line": 59,
+                                                        "column": 31
+                                                    }
                                                 },
-                                                "end": {
-                                                    "offset": 974,
-                                                    "line": 33,
-                                                    "column": 37
-                                                }
+                                                "value": "2",
+                                                "unit": "px"
                                             },
-                                            "name": "black"
-                                        }
-                                    ]
+                                            {
+                                                "type": "Identifier",
+                                                "loc": {
+                                                    "source": "stringify.css",
+                                                    "start": {
+                                                        "offset": 1237,
+                                                        "line": 59,
+                                                        "column": 32
+                                                    },
+                                                    "end": {
+                                                        "offset": 1242,
+                                                        "line": 59,
+                                                        "column": 37
+                                                    }
+                                                },
+                                                "name": "black"
+                                            }
+                                        ]
+                                    }
                                 }
                             }
                         ]
@@ -2948,13 +3952,13 @@
                 "loc": {
                     "source": "stringify.css",
                     "start": {
-                        "offset": 987,
-                        "line": 33,
+                        "offset": 1255,
+                        "line": 59,
                         "column": 50
                     },
                     "end": {
-                        "offset": 1056,
-                        "line": 37,
+                        "offset": 1324,
+                        "line": 63,
                         "column": 2
                     }
                 },
@@ -2964,13 +3968,13 @@
                         "loc": {
                             "source": "stringify.css",
                             "start": {
-                                "offset": 993,
-                                "line": 34,
+                                "offset": 1261,
+                                "line": 60,
                                 "column": 5
                             },
                             "end": {
-                                "offset": 1054,
-                                "line": 36,
+                                "offset": 1322,
+                                "line": 62,
                                 "column": 6
                             }
                         },
@@ -2979,13 +3983,13 @@
                             "loc": {
                                 "source": "stringify.css",
                                 "start": {
-                                    "offset": 993,
-                                    "line": 34,
+                                    "offset": 1261,
+                                    "line": 60,
                                     "column": 5
                                 },
                                 "end": {
-                                    "offset": 998,
-                                    "line": 34,
+                                    "offset": 1266,
+                                    "line": 60,
                                     "column": 10
                                 }
                             },
@@ -2995,13 +3999,13 @@
                                     "loc": {
                                         "source": "stringify.css",
                                         "start": {
-                                            "offset": 993,
-                                            "line": 34,
+                                            "offset": 1261,
+                                            "line": 60,
                                             "column": 5
                                         },
                                         "end": {
-                                            "offset": 998,
-                                            "line": 34,
+                                            "offset": 1266,
+                                            "line": 60,
                                             "column": 10
                                         }
                                     },
@@ -3011,13 +4015,13 @@
                                             "loc": {
                                                 "source": "stringify.css",
                                                 "start": {
-                                                    "offset": 993,
-                                                    "line": 34,
+                                                    "offset": 1261,
+                                                    "line": 60,
                                                     "column": 5
                                                 },
                                                 "end": {
-                                                    "offset": 998,
-                                                    "line": 34,
+                                                    "offset": 1266,
+                                                    "line": 60,
                                                     "column": 10
                                                 }
                                             },
@@ -3032,13 +4036,13 @@
                             "loc": {
                                 "source": "stringify.css",
                                 "start": {
-                                    "offset": 999,
-                                    "line": 34,
+                                    "offset": 1267,
+                                    "line": 60,
                                     "column": 11
                                 },
                                 "end": {
-                                    "offset": 1054,
-                                    "line": 36,
+                                    "offset": 1322,
+                                    "line": 62,
                                     "column": 6
                                 }
                             },
@@ -3048,13 +4052,13 @@
                                     "loc": {
                                         "source": "stringify.css",
                                         "start": {
-                                            "offset": 1009,
-                                            "line": 35,
+                                            "offset": 1277,
+                                            "line": 61,
                                             "column": 9
                                         },
                                         "end": {
-                                            "offset": 1047,
-                                            "line": 35,
+                                            "offset": 1315,
+                                            "line": 61,
                                             "column": 47
                                         }
                                     },
@@ -3065,13 +4069,13 @@
                                         "loc": {
                                             "source": "stringify.css",
                                             "start": {
-                                                "offset": 1021,
-                                                "line": 35,
+                                                "offset": 1289,
+                                                "line": 61,
                                                 "column": 21
                                             },
                                             "end": {
-                                                "offset": 1047,
-                                                "line": 35,
+                                                "offset": 1315,
+                                                "line": 61,
                                                 "column": 47
                                             }
                                         },
@@ -3081,13 +4085,13 @@
                                                 "loc": {
                                                     "source": "stringify.css",
                                                     "start": {
-                                                        "offset": 1021,
-                                                        "line": 35,
+                                                        "offset": 1289,
+                                                        "line": 61,
                                                         "column": 21
                                                     },
                                                     "end": {
-                                                        "offset": 1047,
-                                                        "line": 35,
+                                                        "offset": 1315,
+                                                        "line": 61,
                                                         "column": 47
                                                     }
                                                 },
@@ -3098,13 +4102,13 @@
                                                         "loc": {
                                                             "source": "stringify.css",
                                                             "start": {
-                                                                "offset": 1025,
-                                                                "line": 35,
+                                                                "offset": 1293,
+                                                                "line": 61,
                                                                 "column": 25
                                                             },
                                                             "end": {
-                                                                "offset": 1036,
-                                                                "line": 35,
+                                                                "offset": 1304,
+                                                                "line": 61,
                                                                 "column": 36
                                                             }
                                                         },
@@ -3115,13 +4119,13 @@
                                                         "loc": {
                                                             "source": "stringify.css",
                                                             "start": {
-                                                                "offset": 1036,
-                                                                "line": 35,
+                                                                "offset": 1304,
+                                                                "line": 61,
                                                                 "column": 36
                                                             },
                                                             "end": {
-                                                                "offset": 1037,
-                                                                "line": 35,
+                                                                "offset": 1305,
+                                                                "line": 61,
                                                                 "column": 37
                                                             }
                                                         },
@@ -3132,13 +4136,13 @@
                                                         "loc": {
                                                             "source": "stringify.css",
                                                             "start": {
-                                                                "offset": 1037,
-                                                                "line": 35,
+                                                                "offset": 1305,
+                                                                "line": 61,
                                                                 "column": 37
                                                             },
                                                             "end": {
-                                                                "offset": 1046,
-                                                                "line": 35,
+                                                                "offset": 1314,
+                                                                "line": 61,
                                                                 "column": 46
                                                             }
                                                         },
@@ -3160,13 +4164,13 @@
             "loc": {
                 "source": "stringify.css",
                 "start": {
-                    "offset": 1058,
-                    "line": 39,
+                    "offset": 1326,
+                    "line": 65,
                     "column": 1
                 },
                 "end": {
-                    "offset": 1100,
-                    "line": 41,
+                    "offset": 1368,
+                    "line": 67,
                     "column": 2
                 }
             },
@@ -3175,13 +4179,13 @@
                 "loc": {
                     "source": "stringify.css",
                     "start": {
-                        "offset": 1058,
-                        "line": 39,
+                        "offset": 1326,
+                        "line": 65,
                         "column": 1
                     },
                     "end": {
-                        "offset": 1081,
-                        "line": 39,
+                        "offset": 1349,
+                        "line": 65,
                         "column": 24
                     }
                 },
@@ -3191,13 +4195,13 @@
                         "loc": {
                             "source": "stringify.css",
                             "start": {
-                                "offset": 1058,
-                                "line": 39,
+                                "offset": 1326,
+                                "line": 65,
                                 "column": 1
                             },
                             "end": {
-                                "offset": 1081,
-                                "line": 39,
+                                "offset": 1349,
+                                "line": 65,
                                 "column": 24
                             }
                         },
@@ -3207,13 +4211,13 @@
                                 "loc": {
                                     "source": "stringify.css",
                                     "start": {
-                                        "offset": 1058,
-                                        "line": 39,
+                                        "offset": 1326,
+                                        "line": 65,
                                         "column": 1
                                     },
                                     "end": {
-                                        "offset": 1061,
-                                        "line": 39,
+                                        "offset": 1329,
+                                        "line": 65,
                                         "column": 4
                                     }
                                 },
@@ -3224,13 +4228,13 @@
                                 "loc": {
                                     "source": "stringify.css",
                                     "start": {
-                                        "offset": 1061,
-                                        "line": 39,
+                                        "offset": 1329,
+                                        "line": 65,
                                         "column": 4
                                     },
                                     "end": {
-                                        "offset": 1064,
-                                        "line": 39,
+                                        "offset": 1332,
+                                        "line": 65,
                                         "column": 7
                                     }
                                 },
@@ -3241,13 +4245,13 @@
                                 "loc": {
                                     "source": "stringify.css",
                                     "start": {
-                                        "offset": 1064,
-                                        "line": 39,
+                                        "offset": 1332,
+                                        "line": 65,
                                         "column": 7
                                     },
                                     "end": {
-                                        "offset": 1067,
-                                        "line": 39,
+                                        "offset": 1335,
+                                        "line": 65,
                                         "column": 10
                                     }
                                 },
@@ -3259,13 +4263,13 @@
                                 "loc": {
                                     "source": "stringify.css",
                                     "start": {
-                                        "offset": 1067,
-                                        "line": 39,
+                                        "offset": 1335,
+                                        "line": 65,
                                         "column": 10
                                     },
                                     "end": {
-                                        "offset": 1071,
-                                        "line": 39,
+                                        "offset": 1339,
+                                        "line": 65,
                                         "column": 14
                                     }
                                 },
@@ -3277,13 +4281,13 @@
                                 "loc": {
                                     "source": "stringify.css",
                                     "start": {
-                                        "offset": 1071,
-                                        "line": 39,
+                                        "offset": 1339,
+                                        "line": 65,
                                         "column": 14
                                     },
                                     "end": {
-                                        "offset": 1075,
-                                        "line": 39,
+                                        "offset": 1343,
+                                        "line": 65,
                                         "column": 18
                                     }
                                 },
@@ -3292,13 +4296,13 @@
                                     "loc": {
                                         "source": "stringify.css",
                                         "start": {
-                                            "offset": 1072,
-                                            "line": 39,
+                                            "offset": 1340,
+                                            "line": 65,
                                             "column": 15
                                         },
                                         "end": {
-                                            "offset": 1074,
-                                            "line": 39,
+                                            "offset": 1342,
+                                            "line": 65,
                                             "column": 17
                                         }
                                     },
@@ -3313,13 +4317,13 @@
                                 "loc": {
                                     "source": "stringify.css",
                                     "start": {
-                                        "offset": 1075,
-                                        "line": 39,
+                                        "offset": 1343,
+                                        "line": 65,
                                         "column": 18
                                     },
                                     "end": {
-                                        "offset": 1081,
-                                        "line": 39,
+                                        "offset": 1349,
+                                        "line": 65,
                                         "column": 24
                                     }
                                 },
@@ -3328,13 +4332,13 @@
                                     "loc": {
                                         "source": "stringify.css",
                                         "start": {
-                                            "offset": 1076,
-                                            "line": 39,
+                                            "offset": 1344,
+                                            "line": 65,
                                             "column": 19
                                         },
                                         "end": {
-                                            "offset": 1080,
-                                            "line": 39,
+                                            "offset": 1348,
+                                            "line": 65,
                                             "column": 23
                                         }
                                     },
@@ -3353,13 +4357,13 @@
                 "loc": {
                     "source": "stringify.css",
                     "start": {
-                        "offset": 1082,
-                        "line": 39,
+                        "offset": 1350,
+                        "line": 65,
                         "column": 25
                     },
                     "end": {
-                        "offset": 1100,
-                        "line": 41,
+                        "offset": 1368,
+                        "line": 67,
                         "column": 2
                     }
                 },
@@ -3369,13 +4373,13 @@
                         "loc": {
                             "source": "stringify.css",
                             "start": {
-                                "offset": 1088,
-                                "line": 40,
+                                "offset": 1356,
+                                "line": 66,
                                 "column": 5
                             },
                             "end": {
-                                "offset": 1097,
-                                "line": 40,
+                                "offset": 1365,
+                                "line": 66,
                                 "column": 14
                             }
                         },
@@ -3386,13 +4390,13 @@
                             "loc": {
                                 "source": "stringify.css",
                                 "start": {
-                                    "offset": 1094,
-                                    "line": 40,
+                                    "offset": 1362,
+                                    "line": 66,
                                     "column": 11
                                 },
                                 "end": {
-                                    "offset": 1097,
-                                    "line": 40,
+                                    "offset": 1365,
+                                    "line": 66,
                                     "column": 14
                                 }
                             },
@@ -3402,13 +4406,13 @@
                                     "loc": {
                                         "source": "stringify.css",
                                         "start": {
-                                            "offset": 1094,
-                                            "line": 40,
+                                            "offset": 1362,
+                                            "line": 66,
                                             "column": 11
                                         },
                                         "end": {
-                                            "offset": 1097,
-                                            "line": 40,
+                                            "offset": 1365,
+                                            "line": 66,
                                             "column": 14
                                         }
                                     },
@@ -3421,17 +4425,156 @@
             }
         },
         {
+            "type": "Rule",
+            "loc": {
+                "source": "stringify.css",
+                "start": {
+                    "offset": 1370,
+                    "line": 69,
+                    "column": 1
+                },
+                "end": {
+                    "offset": 1391,
+                    "line": 69,
+                    "column": 22
+                }
+            },
+            "prelude": {
+                "type": "SelectorList",
+                "loc": {
+                    "source": "stringify.css",
+                    "start": {
+                        "offset": 1370,
+                        "line": 69,
+                        "column": 1
+                    },
+                    "end": {
+                        "offset": 1388,
+                        "line": 69,
+                        "column": 19
+                    }
+                },
+                "children": [
+                    {
+                        "type": "Selector",
+                        "loc": {
+                            "source": "stringify.css",
+                            "start": {
+                                "offset": 1370,
+                                "line": 69,
+                                "column": 1
+                            },
+                            "end": {
+                                "offset": 1388,
+                                "line": 69,
+                                "column": 19
+                            }
+                        },
+                        "children": [
+                            {
+                                "type": "PseudoClassSelector",
+                                "loc": {
+                                    "source": "stringify.css",
+                                    "start": {
+                                        "offset": 1370,
+                                        "line": 69,
+                                        "column": 1
+                                    },
+                                    "end": {
+                                        "offset": 1388,
+                                        "line": 69,
+                                        "column": 19
+                                    }
+                                },
+                                "name": "lang",
+                                "children": [
+                                    {
+                                        "type": "Identifier",
+                                        "loc": {
+                                            "source": "stringify.css",
+                                            "start": {
+                                                "offset": 1376,
+                                                "line": 69,
+                                                "column": 7
+                                            },
+                                            "end": {
+                                                "offset": 1378,
+                                                "line": 69,
+                                                "column": 9
+                                            }
+                                        },
+                                        "name": "en"
+                                    },
+                                    {
+                                        "type": "Operator",
+                                        "loc": {
+                                            "source": "stringify.css",
+                                            "start": {
+                                                "offset": 1378,
+                                                "line": 69,
+                                                "column": 9
+                                            },
+                                            "end": {
+                                                "offset": 1379,
+                                                "line": 69,
+                                                "column": 10
+                                            }
+                                        },
+                                        "value": ","
+                                    },
+                                    {
+                                        "type": "String",
+                                        "loc": {
+                                            "source": "stringify.css",
+                                            "start": {
+                                                "offset": 1380,
+                                                "line": 69,
+                                                "column": 11
+                                            },
+                                            "end": {
+                                                "offset": 1387,
+                                                "line": 69,
+                                                "column": 18
+                                            }
+                                        },
+                                        "value": "de-DE"
+                                    }
+                                ]
+                            }
+                        ]
+                    }
+                ]
+            },
+            "block": {
+                "type": "Block",
+                "loc": {
+                    "source": "stringify.css",
+                    "start": {
+                        "offset": 1389,
+                        "line": 69,
+                        "column": 20
+                    },
+                    "end": {
+                        "offset": 1391,
+                        "line": 69,
+                        "column": 22
+                    }
+                },
+                "children": []
+            }
+        },
+        {
             "type": "CDO",
             "loc": {
                 "source": "stringify.css",
                 "start": {
-                    "offset": 1102,
-                    "line": 43,
+                    "offset": 1393,
+                    "line": 71,
                     "column": 1
                 },
                 "end": {
-                    "offset": 1106,
-                    "line": 43,
+                    "offset": 1397,
+                    "line": 71,
                     "column": 5
                 }
             }
@@ -3441,13 +4584,13 @@
             "loc": {
                 "source": "stringify.css",
                 "start": {
-                    "offset": 1121,
-                    "line": 43,
+                    "offset": 1412,
+                    "line": 71,
                     "column": 20
                 },
                 "end": {
-                    "offset": 1124,
-                    "line": 43,
+                    "offset": 1415,
+                    "line": 71,
                     "column": 23
                 }
             }
@@ -3457,13 +4600,13 @@
             "loc": {
                 "source": "stringify.css",
                 "start": {
-                    "offset": 1125,
-                    "line": 44,
+                    "offset": 1416,
+                    "line": 72,
                     "column": 1
                 },
                 "end": {
-                    "offset": 1146,
-                    "line": 44,
+                    "offset": 1437,
+                    "line": 72,
                     "column": 22
                 }
             },
@@ -3473,13 +4616,13 @@
                 "loc": {
                     "source": "stringify.css",
                     "start": {
-                        "offset": 1133,
-                        "line": 44,
+                        "offset": 1424,
+                        "line": 72,
                         "column": 9
                     },
                     "end": {
-                        "offset": 1145,
-                        "line": 44,
+                        "offset": 1436,
+                        "line": 72,
                         "column": 21
                     }
                 },
@@ -3489,13 +4632,13 @@
                         "loc": {
                             "source": "stringify.css",
                             "start": {
-                                "offset": 1133,
-                                "line": 44,
+                                "offset": 1424,
+                                "line": 72,
                                 "column": 9
                             },
                             "end": {
-                                "offset": 1138,
-                                "line": 44,
+                                "offset": 1429,
+                                "line": 72,
                                 "column": 14
                             }
                         },
@@ -3506,13 +4649,13 @@
                         "loc": {
                             "source": "stringify.css",
                             "start": {
-                                "offset": 1139,
-                                "line": 44,
+                                "offset": 1430,
+                                "line": 72,
                                 "column": 15
                             },
                             "end": {
-                                "offset": 1145,
-                                "line": 44,
+                                "offset": 1436,
+                                "line": 72,
                                 "column": 21
                             }
                         },
@@ -3522,35 +4665,19 @@
                                 "loc": {
                                     "source": "stringify.css",
                                     "start": {
-                                        "offset": 1139,
-                                        "line": 44,
+                                        "offset": 1430,
+                                        "line": 72,
                                         "column": 15
                                     },
                                     "end": {
-                                        "offset": 1145,
-                                        "line": 44,
+                                        "offset": 1436,
+                                        "line": 72,
                                         "column": 21
                                     }
                                 },
-                                "children": [
-                                    {
-                                        "type": "Identifier",
-                                        "loc": {
-                                            "source": "stringify.css",
-                                            "start": {
-                                                "offset": 1139,
-                                                "line": 44,
-                                                "column": 15
-                                            },
-                                            "end": {
-                                                "offset": 1145,
-                                                "line": 44,
-                                                "column": 21
-                                            }
-                                        },
-                                        "name": "screen"
-                                    }
-                                ]
+                                "modifier": null,
+                                "mediaType": "screen",
+                                "condition": null
                             }
                         ]
                     }
@@ -3563,13 +4690,13 @@
             "loc": {
                 "source": "stringify.css",
                 "start": {
-                    "offset": 1147,
-                    "line": 45,
+                    "offset": 1438,
+                    "line": 73,
                     "column": 1
                 },
                 "end": {
-                    "offset": 1270,
-                    "line": 49,
+                    "offset": 1561,
+                    "line": 77,
                     "column": 2
                 }
             },
@@ -3579,13 +4706,13 @@
                 "loc": {
                     "source": "stringify.css",
                     "start": {
-                        "offset": 1158,
-                        "line": 45,
+                        "offset": 1449,
+                        "line": 73,
                         "column": 12
                     },
                     "end": {
-                        "offset": 1164,
-                        "line": 45,
+                        "offset": 1455,
+                        "line": 73,
                         "column": 18
                     }
                 },
@@ -3595,13 +4722,13 @@
                         "loc": {
                             "source": "stringify.css",
                             "start": {
-                                "offset": 1158,
-                                "line": 45,
+                                "offset": 1449,
+                                "line": 73,
                                 "column": 12
                             },
                             "end": {
-                                "offset": 1164,
-                                "line": 45,
+                                "offset": 1455,
+                                "line": 73,
                                 "column": 18
                             }
                         },
@@ -3614,13 +4741,13 @@
                 "loc": {
                     "source": "stringify.css",
                     "start": {
-                        "offset": 1165,
-                        "line": 45,
+                        "offset": 1456,
+                        "line": 73,
                         "column": 19
                     },
                     "end": {
-                        "offset": 1270,
-                        "line": 49,
+                        "offset": 1561,
+                        "line": 77,
                         "column": 2
                     }
                 },
@@ -3630,13 +4757,13 @@
                         "loc": {
                             "source": "stringify.css",
                             "start": {
-                                "offset": 1171,
-                                "line": 46,
+                                "offset": 1462,
+                                "line": 74,
                                 "column": 5
                             },
                             "end": {
-                                "offset": 1193,
-                                "line": 46,
+                                "offset": 1484,
+                                "line": 74,
                                 "column": 27
                             }
                         },
@@ -3645,13 +4772,13 @@
                             "loc": {
                                 "source": "stringify.css",
                                 "start": {
-                                    "offset": 1171,
-                                    "line": 46,
+                                    "offset": 1462,
+                                    "line": 74,
                                     "column": 5
                                 },
                                 "end": {
-                                    "offset": 1175,
-                                    "line": 46,
+                                    "offset": 1466,
+                                    "line": 74,
                                     "column": 9
                                 }
                             },
@@ -3661,13 +4788,13 @@
                                     "loc": {
                                         "source": "stringify.css",
                                         "start": {
-                                            "offset": 1171,
-                                            "line": 46,
+                                            "offset": 1462,
+                                            "line": 74,
                                             "column": 5
                                         },
                                         "end": {
-                                            "offset": 1175,
-                                            "line": 46,
+                                            "offset": 1466,
+                                            "line": 74,
                                             "column": 9
                                         }
                                     },
@@ -3677,13 +4804,13 @@
                                             "loc": {
                                                 "source": "stringify.css",
                                                 "start": {
-                                                    "offset": 1171,
-                                                    "line": 46,
+                                                    "offset": 1462,
+                                                    "line": 74,
                                                     "column": 5
                                                 },
                                                 "end": {
-                                                    "offset": 1175,
-                                                    "line": 46,
+                                                    "offset": 1466,
+                                                    "line": 74,
                                                     "column": 9
                                                 }
                                             },
@@ -3698,13 +4825,13 @@
                             "loc": {
                                 "source": "stringify.css",
                                 "start": {
-                                    "offset": 1177,
-                                    "line": 46,
+                                    "offset": 1468,
+                                    "line": 74,
                                     "column": 11
                                 },
                                 "end": {
-                                    "offset": 1193,
-                                    "line": 46,
+                                    "offset": 1484,
+                                    "line": 74,
                                     "column": 27
                                 }
                             },
@@ -3714,13 +4841,13 @@
                                     "loc": {
                                         "source": "stringify.css",
                                         "start": {
-                                            "offset": 1179,
-                                            "line": 46,
+                                            "offset": 1470,
+                                            "line": 74,
                                             "column": 13
                                         },
                                         "end": {
-                                            "offset": 1192,
-                                            "line": 46,
+                                            "offset": 1483,
+                                            "line": 74,
                                             "column": 26
                                         }
                                     },
@@ -3731,13 +4858,13 @@
                                         "loc": {
                                             "source": "stringify.css",
                                             "start": {
-                                                "offset": 1188,
-                                                "line": 46,
+                                                "offset": 1479,
+                                                "line": 74,
                                                 "column": 22
                                             },
                                             "end": {
-                                                "offset": 1192,
-                                                "line": 46,
+                                                "offset": 1483,
+                                                "line": 74,
                                                 "column": 26
                                             }
                                         },
@@ -3747,13 +4874,13 @@
                                                 "loc": {
                                                     "source": "stringify.css",
                                                     "start": {
-                                                        "offset": 1188,
-                                                        "line": 46,
+                                                        "offset": 1479,
+                                                        "line": 74,
                                                         "column": 22
                                                     },
                                                     "end": {
-                                                        "offset": 1191,
-                                                        "line": 46,
+                                                        "offset": 1482,
+                                                        "line": 74,
                                                         "column": 25
                                                     }
                                                 },
@@ -3770,13 +4897,13 @@
                         "loc": {
                             "source": "stringify.css",
                             "start": {
-                                "offset": 1198,
-                                "line": 47,
+                                "offset": 1489,
+                                "line": 75,
                                 "column": 5
                             },
                             "end": {
-                                "offset": 1239,
-                                "line": 47,
+                                "offset": 1530,
+                                "line": 75,
                                 "column": 46
                             }
                         },
@@ -3785,13 +4912,13 @@
                             "loc": {
                                 "source": "stringify.css",
                                 "start": {
-                                    "offset": 1198,
-                                    "line": 47,
+                                    "offset": 1489,
+                                    "line": 75,
                                     "column": 5
                                 },
                                 "end": {
-                                    "offset": 1203,
-                                    "line": 47,
+                                    "offset": 1494,
+                                    "line": 75,
                                     "column": 10
                                 }
                             },
@@ -3801,13 +4928,13 @@
                                     "loc": {
                                         "source": "stringify.css",
                                         "start": {
-                                            "offset": 1198,
-                                            "line": 47,
+                                            "offset": 1489,
+                                            "line": 75,
                                             "column": 5
                                         },
                                         "end": {
-                                            "offset": 1203,
-                                            "line": 47,
+                                            "offset": 1494,
+                                            "line": 75,
                                             "column": 10
                                         }
                                     },
@@ -3817,13 +4944,13 @@
                                             "loc": {
                                                 "source": "stringify.css",
                                                 "start": {
-                                                    "offset": 1198,
-                                                    "line": 47,
+                                                    "offset": 1489,
+                                                    "line": 75,
                                                     "column": 5
                                                 },
                                                 "end": {
-                                                    "offset": 1203,
-                                                    "line": 47,
+                                                    "offset": 1494,
+                                                    "line": 75,
                                                     "column": 10
                                                 }
                                             },
@@ -3838,13 +4965,13 @@
                             "loc": {
                                 "source": "stringify.css",
                                 "start": {
-                                    "offset": 1204,
-                                    "line": 47,
+                                    "offset": 1495,
+                                    "line": 75,
                                     "column": 11
                                 },
                                 "end": {
-                                    "offset": 1239,
-                                    "line": 47,
+                                    "offset": 1530,
+                                    "line": 75,
                                     "column": 46
                                 }
                             },
@@ -3854,13 +4981,13 @@
                                     "loc": {
                                         "source": "stringify.css",
                                         "start": {
-                                            "offset": 1206,
-                                            "line": 47,
+                                            "offset": 1497,
+                                            "line": 75,
                                             "column": 13
                                         },
                                         "end": {
-                                            "offset": 1218,
-                                            "line": 47,
+                                            "offset": 1509,
+                                            "line": 75,
                                             "column": 25
                                         }
                                     },
@@ -3871,13 +4998,13 @@
                                         "loc": {
                                             "source": "stringify.css",
                                             "start": {
-                                                "offset": 1213,
-                                                "line": 47,
+                                                "offset": 1504,
+                                                "line": 75,
                                                 "column": 20
                                             },
                                             "end": {
-                                                "offset": 1218,
-                                                "line": 47,
+                                                "offset": 1509,
+                                                "line": 75,
                                                 "column": 25
                                             }
                                         },
@@ -3887,13 +5014,13 @@
                                                 "loc": {
                                                     "source": "stringify.css",
                                                     "start": {
-                                                        "offset": 1213,
-                                                        "line": 47,
+                                                        "offset": 1504,
+                                                        "line": 75,
                                                         "column": 20
                                                     },
                                                     "end": {
-                                                        "offset": 1218,
-                                                        "line": 47,
+                                                        "offset": 1509,
+                                                        "line": 75,
                                                         "column": 25
                                                     }
                                                 },
@@ -3907,13 +5034,13 @@
                                     "loc": {
                                         "source": "stringify.css",
                                         "start": {
-                                            "offset": 1220,
-                                            "line": 47,
+                                            "offset": 1511,
+                                            "line": 75,
                                             "column": 27
                                         },
                                         "end": {
-                                            "offset": 1238,
-                                            "line": 47,
+                                            "offset": 1529,
+                                            "line": 75,
                                             "column": 45
                                         }
                                     },
@@ -3924,13 +5051,13 @@
                                         "loc": {
                                             "source": "stringify.css",
                                             "start": {
-                                                "offset": 1232,
-                                                "line": 47,
+                                                "offset": 1523,
+                                                "line": 75,
                                                 "column": 39
                                             },
                                             "end": {
-                                                "offset": 1238,
-                                                "line": 47,
+                                                "offset": 1529,
+                                                "line": 75,
                                                 "column": 45
                                             }
                                         },
@@ -3940,13 +5067,13 @@
                                                 "loc": {
                                                     "source": "stringify.css",
                                                     "start": {
-                                                        "offset": 1232,
-                                                        "line": 47,
+                                                        "offset": 1523,
+                                                        "line": 75,
                                                         "column": 39
                                                     },
                                                     "end": {
-                                                        "offset": 1237,
-                                                        "line": 47,
+                                                        "offset": 1528,
+                                                        "line": 75,
                                                         "column": 44
                                                     }
                                                 },
@@ -3963,13 +5090,13 @@
                         "loc": {
                             "source": "stringify.css",
                             "start": {
-                                "offset": 1244,
-                                "line": 48,
+                                "offset": 1535,
+                                "line": 76,
                                 "column": 5
                             },
                             "end": {
-                                "offset": 1268,
-                                "line": 48,
+                                "offset": 1559,
+                                "line": 76,
                                 "column": 29
                             }
                         },
@@ -3978,13 +5105,13 @@
                             "loc": {
                                 "source": "stringify.css",
                                 "start": {
-                                    "offset": 1244,
-                                    "line": 48,
+                                    "offset": 1535,
+                                    "line": 76,
                                     "column": 5
                                 },
                                 "end": {
-                                    "offset": 1248,
-                                    "line": 48,
+                                    "offset": 1539,
+                                    "line": 76,
                                     "column": 9
                                 }
                             },
@@ -3994,13 +5121,13 @@
                                     "loc": {
                                         "source": "stringify.css",
                                         "start": {
-                                            "offset": 1244,
-                                            "line": 48,
+                                            "offset": 1535,
+                                            "line": 76,
                                             "column": 5
                                         },
                                         "end": {
-                                            "offset": 1248,
-                                            "line": 48,
+                                            "offset": 1539,
+                                            "line": 76,
                                             "column": 9
                                         }
                                     },
@@ -4010,13 +5137,13 @@
                                             "loc": {
                                                 "source": "stringify.css",
                                                 "start": {
-                                                    "offset": 1244,
-                                                    "line": 48,
+                                                    "offset": 1535,
+                                                    "line": 76,
                                                     "column": 5
                                                 },
                                                 "end": {
-                                                    "offset": 1248,
-                                                    "line": 48,
+                                                    "offset": 1539,
+                                                    "line": 76,
                                                     "column": 9
                                                 }
                                             },
@@ -4031,13 +5158,13 @@
                             "loc": {
                                 "source": "stringify.css",
                                 "start": {
-                                    "offset": 1250,
-                                    "line": 48,
+                                    "offset": 1541,
+                                    "line": 76,
                                     "column": 11
                                 },
                                 "end": {
-                                    "offset": 1268,
-                                    "line": 48,
+                                    "offset": 1559,
+                                    "line": 76,
                                     "column": 29
                                 }
                             },
@@ -4047,13 +5174,13 @@
                                     "loc": {
                                         "source": "stringify.css",
                                         "start": {
-                                            "offset": 1252,
-                                            "line": 48,
+                                            "offset": 1543,
+                                            "line": 76,
                                             "column": 13
                                         },
                                         "end": {
-                                            "offset": 1253,
-                                            "line": 48,
+                                            "offset": 1544,
+                                            "line": 76,
                                             "column": 14
                                         }
                                     },
@@ -4064,13 +5191,13 @@
                                     "loc": {
                                         "source": "stringify.css",
                                         "start": {
-                                            "offset": 1253,
-                                            "line": 48,
+                                            "offset": 1544,
+                                            "line": 76,
                                             "column": 14
                                         },
                                         "end": {
-                                            "offset": 1264,
-                                            "line": 48,
+                                            "offset": 1555,
+                                            "line": 76,
                                             "column": 25
                                         }
                                     },
@@ -4081,13 +5208,13 @@
                                         "loc": {
                                             "source": "stringify.css",
                                             "start": {
-                                                "offset": 1260,
-                                                "line": 48,
+                                                "offset": 1551,
+                                                "line": 76,
                                                 "column": 21
                                             },
                                             "end": {
-                                                "offset": 1264,
-                                                "line": 48,
+                                                "offset": 1555,
+                                                "line": 76,
                                                 "column": 25
                                             }
                                         },
@@ -4097,13 +5224,13 @@
                                                 "loc": {
                                                     "source": "stringify.css",
                                                     "start": {
-                                                        "offset": 1260,
-                                                        "line": 48,
+                                                        "offset": 1551,
+                                                        "line": 76,
                                                         "column": 21
                                                     },
                                                     "end": {
-                                                        "offset": 1264,
-                                                        "line": 48,
+                                                        "offset": 1555,
+                                                        "line": 76,
                                                         "column": 25
                                                     }
                                                 },
@@ -4117,13 +5244,13 @@
                                     "loc": {
                                         "source": "stringify.css",
                                         "start": {
-                                            "offset": 1265,
-                                            "line": 48,
+                                            "offset": 1556,
+                                            "line": 76,
                                             "column": 26
                                         },
                                         "end": {
-                                            "offset": 1266,
-                                            "line": 48,
+                                            "offset": 1557,
+                                            "line": 76,
                                             "column": 27
                                         }
                                     },
@@ -4140,13 +5267,13 @@
             "loc": {
                 "source": "stringify.css",
                 "start": {
-                    "offset": 1272,
-                    "line": 51,
+                    "offset": 1563,
+                    "line": 79,
                     "column": 1
                 },
                 "end": {
-                    "offset": 1347,
-                    "line": 55,
+                    "offset": 1638,
+                    "line": 83,
                     "column": 2
                 }
             },
@@ -4155,13 +5282,13 @@
                 "loc": {
                     "source": "stringify.css",
                     "start": {
-                        "offset": 1272,
-                        "line": 51,
+                        "offset": 1563,
+                        "line": 79,
                         "column": 1
                     },
                     "end": {
-                        "offset": 1287,
-                        "line": 51,
+                        "offset": 1578,
+                        "line": 79,
                         "column": 16
                     }
                 },
@@ -4171,13 +5298,13 @@
                         "loc": {
                             "source": "stringify.css",
                             "start": {
-                                "offset": 1272,
-                                "line": 51,
+                                "offset": 1563,
+                                "line": 79,
                                 "column": 1
                             },
                             "end": {
-                                "offset": 1287,
-                                "line": 51,
+                                "offset": 1578,
+                                "line": 79,
                                 "column": 16
                             }
                         },
@@ -4187,13 +5314,13 @@
                                 "loc": {
                                     "source": "stringify.css",
                                     "start": {
-                                        "offset": 1272,
-                                        "line": 51,
+                                        "offset": 1563,
+                                        "line": 79,
                                         "column": 1
                                     },
                                     "end": {
-                                        "offset": 1278,
-                                        "line": 51,
+                                        "offset": 1569,
+                                        "line": 79,
                                         "column": 7
                                     }
                                 },
@@ -4204,13 +5331,13 @@
                                 "loc": {
                                     "source": "stringify.css",
                                     "start": {
-                                        "offset": 1278,
-                                        "line": 51,
+                                        "offset": 1569,
+                                        "line": 79,
                                         "column": 7
                                     },
                                     "end": {
-                                        "offset": 1287,
-                                        "line": 51,
+                                        "offset": 1578,
+                                        "line": 79,
                                         "column": 16
                                     }
                                 },
@@ -4225,13 +5352,13 @@
                 "loc": {
                     "source": "stringify.css",
                     "start": {
-                        "offset": 1288,
-                        "line": 51,
+                        "offset": 1579,
+                        "line": 79,
                         "column": 17
                     },
                     "end": {
-                        "offset": 1347,
-                        "line": 55,
+                        "offset": 1638,
+                        "line": 83,
                         "column": 2
                     }
                 },
@@ -4241,13 +5368,13 @@
                         "loc": {
                             "source": "stringify.css",
                             "start": {
-                                "offset": 1294,
-                                "line": 52,
+                                "offset": 1585,
+                                "line": 80,
                                 "column": 5
                             },
                             "end": {
-                                "offset": 1307,
-                                "line": 52,
+                                "offset": 1598,
+                                "line": 80,
                                 "column": 18
                             }
                         },
@@ -4258,13 +5385,13 @@
                             "loc": {
                                 "source": "stringify.css",
                                 "start": {
-                                    "offset": 1306,
-                                    "line": 52,
+                                    "offset": 1597,
+                                    "line": 80,
                                     "column": 17
                                 },
                                 "end": {
-                                    "offset": 1307,
-                                    "line": 52,
+                                    "offset": 1598,
+                                    "line": 80,
                                     "column": 18
                                 }
                             },
@@ -4276,13 +5403,13 @@
                         "loc": {
                             "source": "stringify.css",
                             "start": {
-                                "offset": 1313,
-                                "line": 53,
+                                "offset": 1604,
+                                "line": 81,
                                 "column": 5
                             },
                             "end": {
-                                "offset": 1323,
-                                "line": 53,
+                                "offset": 1614,
+                                "line": 81,
                                 "column": 15
                             }
                         },
@@ -4293,13 +5420,13 @@
                             "loc": {
                                 "source": "stringify.css",
                                 "start": {
-                                    "offset": 1323,
-                                    "line": 53,
+                                    "offset": 1614,
+                                    "line": 81,
                                     "column": 15
                                 },
                                 "end": {
-                                    "offset": 1323,
-                                    "line": 53,
+                                    "offset": 1614,
+                                    "line": 81,
                                     "column": 15
                                 }
                             },
@@ -4311,13 +5438,13 @@
                         "loc": {
                             "source": "stringify.css",
                             "start": {
-                                "offset": 1329,
-                                "line": 54,
+                                "offset": 1620,
+                                "line": 82,
                                 "column": 5
                             },
                             "end": {
-                                "offset": 1344,
-                                "line": 54,
+                                "offset": 1635,
+                                "line": 82,
                                 "column": 20
                             }
                         },
@@ -4328,13 +5455,13 @@
                             "loc": {
                                 "source": "stringify.css",
                                 "start": {
-                                    "offset": 1337,
-                                    "line": 54,
+                                    "offset": 1628,
+                                    "line": 82,
                                     "column": 13
                                 },
                                 "end": {
-                                    "offset": 1344,
-                                    "line": 54,
+                                    "offset": 1635,
+                                    "line": 82,
                                     "column": 20
                                 }
                             },
@@ -4344,13 +5471,13 @@
                                     "loc": {
                                         "source": "stringify.css",
                                         "start": {
-                                            "offset": 1337,
-                                            "line": 54,
+                                            "offset": 1628,
+                                            "line": 82,
                                             "column": 13
                                         },
                                         "end": {
-                                            "offset": 1340,
-                                            "line": 54,
+                                            "offset": 1631,
+                                            "line": 82,
                                             "column": 16
                                         }
                                     },
@@ -4361,13 +5488,13 @@
                                     "loc": {
                                         "source": "stringify.css",
                                         "start": {
-                                            "offset": 1340,
-                                            "line": 54,
+                                            "offset": 1631,
+                                            "line": 82,
                                             "column": 16
                                         },
                                         "end": {
-                                            "offset": 1342,
-                                            "line": 54,
+                                            "offset": 1633,
+                                            "line": 82,
                                             "column": 18
                                         }
                                     },
@@ -4378,13 +5505,13 @@
                                     "loc": {
                                         "source": "stringify.css",
                                         "start": {
-                                            "offset": 1342,
-                                            "line": 54,
+                                            "offset": 1633,
+                                            "line": 82,
                                             "column": 18
                                         },
                                         "end": {
-                                            "offset": 1344,
-                                            "line": 54,
+                                            "offset": 1635,
+                                            "line": 82,
                                             "column": 20
                                         }
                                     },
@@ -4401,13 +5528,13 @@
             "loc": {
                 "source": "stringify.css",
                 "start": {
-                    "offset": 1349,
-                    "line": 57,
+                    "offset": 1640,
+                    "line": 85,
                     "column": 1
                 },
                 "end": {
-                    "offset": 1528,
-                    "line": 68,
+                    "offset": 1920,
+                    "line": 102,
                     "column": 2
                 }
             },
@@ -4416,13 +5543,13 @@
                 "loc": {
                     "source": "stringify.css",
                     "start": {
-                        "offset": 1349,
-                        "line": 57,
+                        "offset": 1640,
+                        "line": 85,
                         "column": 1
                     },
                     "end": {
-                        "offset": 1353,
-                        "line": 57,
+                        "offset": 1644,
+                        "line": 85,
                         "column": 5
                     }
                 },
@@ -4432,13 +5559,13 @@
                         "loc": {
                             "source": "stringify.css",
                             "start": {
-                                "offset": 1349,
-                                "line": 57,
+                                "offset": 1640,
+                                "line": 85,
                                 "column": 1
                             },
                             "end": {
-                                "offset": 1353,
-                                "line": 57,
+                                "offset": 1644,
+                                "line": 85,
                                 "column": 5
                             }
                         },
@@ -4448,13 +5575,13 @@
                                 "loc": {
                                     "source": "stringify.css",
                                     "start": {
-                                        "offset": 1349,
-                                        "line": 57,
+                                        "offset": 1640,
+                                        "line": 85,
                                         "column": 1
                                     },
                                     "end": {
-                                        "offset": 1353,
-                                        "line": 57,
+                                        "offset": 1644,
+                                        "line": 85,
                                         "column": 5
                                     }
                                 },
@@ -4469,13 +5596,13 @@
                 "loc": {
                     "source": "stringify.css",
                     "start": {
-                        "offset": 1354,
-                        "line": 57,
+                        "offset": 1645,
+                        "line": 85,
                         "column": 6
                     },
                     "end": {
-                        "offset": 1528,
-                        "line": 68,
+                        "offset": 1920,
+                        "line": 102,
                         "column": 2
                     }
                 },
@@ -4485,13 +5612,13 @@
                         "loc": {
                             "source": "stringify.css",
                             "start": {
-                                "offset": 1360,
-                                "line": 58,
+                                "offset": 1651,
+                                "line": 86,
                                 "column": 5
                             },
                             "end": {
-                                "offset": 1371,
-                                "line": 58,
+                                "offset": 1662,
+                                "line": 86,
                                 "column": 16
                             }
                         },
@@ -4502,13 +5629,13 @@
                             "loc": {
                                 "source": "stringify.css",
                                 "start": {
-                                    "offset": 1367,
-                                    "line": 58,
+                                    "offset": 1658,
+                                    "line": 86,
                                     "column": 12
                                 },
                                 "end": {
-                                    "offset": 1371,
-                                    "line": 58,
+                                    "offset": 1662,
+                                    "line": 86,
                                     "column": 16
                                 }
                             },
@@ -4518,13 +5645,13 @@
                                     "loc": {
                                         "source": "stringify.css",
                                         "start": {
-                                            "offset": 1367,
-                                            "line": 58,
+                                            "offset": 1658,
+                                            "line": 86,
                                             "column": 12
                                         },
                                         "end": {
-                                            "offset": 1371,
-                                            "line": 58,
+                                            "offset": 1662,
+                                            "line": 86,
                                             "column": 16
                                         }
                                     },
@@ -4538,13 +5665,13 @@
                         "loc": {
                             "source": "stringify.css",
                             "start": {
-                                "offset": 1377,
-                                "line": 59,
+                                "offset": 1668,
+                                "line": 87,
                                 "column": 5
                             },
                             "end": {
-                                "offset": 1414,
-                                "line": 61,
+                                "offset": 1705,
+                                "line": 89,
                                 "column": 6
                             }
                         },
@@ -4553,13 +5680,13 @@
                             "loc": {
                                 "source": "stringify.css",
                                 "start": {
-                                    "offset": 1377,
-                                    "line": 59,
+                                    "offset": 1668,
+                                    "line": 87,
                                     "column": 5
                                 },
                                 "end": {
-                                    "offset": 1384,
-                                    "line": 59,
+                                    "offset": 1675,
+                                    "line": 87,
                                     "column": 12
                                 }
                             },
@@ -4569,13 +5696,13 @@
                                     "loc": {
                                         "source": "stringify.css",
                                         "start": {
-                                            "offset": 1377,
-                                            "line": 59,
+                                            "offset": 1668,
+                                            "line": 87,
                                             "column": 5
                                         },
                                         "end": {
-                                            "offset": 1384,
-                                            "line": 59,
+                                            "offset": 1675,
+                                            "line": 87,
                                             "column": 12
                                         }
                                     },
@@ -4585,13 +5712,13 @@
                                             "loc": {
                                                 "source": "stringify.css",
                                                 "start": {
-                                                    "offset": 1377,
-                                                    "line": 59,
+                                                    "offset": 1668,
+                                                    "line": 87,
                                                     "column": 5
                                                 },
                                                 "end": {
-                                                    "offset": 1378,
-                                                    "line": 59,
+                                                    "offset": 1669,
+                                                    "line": 87,
                                                     "column": 6
                                                 }
                                             }
@@ -4601,13 +5728,13 @@
                                             "loc": {
                                                 "source": "stringify.css",
                                                 "start": {
-                                                    "offset": 1378,
-                                                    "line": 59,
+                                                    "offset": 1669,
+                                                    "line": 87,
                                                     "column": 6
                                                 },
                                                 "end": {
-                                                    "offset": 1384,
-                                                    "line": 59,
+                                                    "offset": 1675,
+                                                    "line": 87,
                                                     "column": 12
                                                 }
                                             },
@@ -4623,13 +5750,13 @@
                             "loc": {
                                 "source": "stringify.css",
                                 "start": {
-                                    "offset": 1385,
-                                    "line": 59,
+                                    "offset": 1676,
+                                    "line": 87,
                                     "column": 13
                                 },
                                 "end": {
-                                    "offset": 1414,
-                                    "line": 61,
+                                    "offset": 1705,
+                                    "line": 89,
                                     "column": 6
                                 }
                             },
@@ -4639,13 +5766,13 @@
                                     "loc": {
                                         "source": "stringify.css",
                                         "start": {
-                                            "offset": 1395,
-                                            "line": 60,
+                                            "offset": 1686,
+                                            "line": 88,
                                             "column": 9
                                         },
                                         "end": {
-                                            "offset": 1407,
-                                            "line": 60,
+                                            "offset": 1698,
+                                            "line": 88,
                                             "column": 21
                                         }
                                     },
@@ -4656,13 +5783,13 @@
                                         "loc": {
                                             "source": "stringify.css",
                                             "start": {
-                                                "offset": 1402,
-                                                "line": 60,
+                                                "offset": 1693,
+                                                "line": 88,
                                                 "column": 16
                                             },
                                             "end": {
-                                                "offset": 1407,
-                                                "line": 60,
+                                                "offset": 1698,
+                                                "line": 88,
                                                 "column": 21
                                             }
                                         },
@@ -4672,13 +5799,13 @@
                                                 "loc": {
                                                     "source": "stringify.css",
                                                     "start": {
-                                                        "offset": 1402,
-                                                        "line": 60,
+                                                        "offset": 1693,
+                                                        "line": 88,
                                                         "column": 16
                                                     },
                                                     "end": {
-                                                        "offset": 1407,
-                                                        "line": 60,
+                                                        "offset": 1698,
+                                                        "line": 88,
                                                         "column": 21
                                                     }
                                                 },
@@ -4695,13 +5822,13 @@
                         "loc": {
                             "source": "stringify.css",
                             "start": {
-                                "offset": 1419,
-                                "line": 62,
+                                "offset": 1710,
+                                "line": 90,
                                 "column": 5
                             },
                             "end": {
-                                "offset": 1463,
-                                "line": 64,
+                                "offset": 1754,
+                                "line": 92,
                                 "column": 6
                             }
                         },
@@ -4711,13 +5838,13 @@
                             "loc": {
                                 "source": "stringify.css",
                                 "start": {
-                                    "offset": 1425,
-                                    "line": 62,
+                                    "offset": 1716,
+                                    "line": 90,
                                     "column": 11
                                 },
                                 "end": {
-                                    "offset": 1432,
-                                    "line": 62,
+                                    "offset": 1723,
+                                    "line": 90,
                                     "column": 18
                                 }
                             },
@@ -4727,13 +5854,13 @@
                                     "loc": {
                                         "source": "stringify.css",
                                         "start": {
-                                            "offset": 1425,
-                                            "line": 62,
+                                            "offset": 1716,
+                                            "line": 90,
                                             "column": 11
                                         },
                                         "end": {
-                                            "offset": 1432,
-                                            "line": 62,
+                                            "offset": 1723,
+                                            "line": 90,
                                             "column": 18
                                         }
                                     },
@@ -4743,13 +5870,13 @@
                                             "loc": {
                                                 "source": "stringify.css",
                                                 "start": {
-                                                    "offset": 1425,
-                                                    "line": 62,
+                                                    "offset": 1716,
+                                                    "line": 90,
                                                     "column": 11
                                                 },
                                                 "end": {
-                                                    "offset": 1432,
-                                                    "line": 62,
+                                                    "offset": 1723,
+                                                    "line": 90,
                                                     "column": 18
                                                 }
                                             },
@@ -4759,13 +5886,13 @@
                                                     "loc": {
                                                         "source": "stringify.css",
                                                         "start": {
-                                                            "offset": 1425,
-                                                            "line": 62,
+                                                            "offset": 1716,
+                                                            "line": 90,
                                                             "column": 11
                                                         },
                                                         "end": {
-                                                            "offset": 1432,
-                                                            "line": 62,
+                                                            "offset": 1723,
+                                                            "line": 90,
                                                             "column": 18
                                                         }
                                                     },
@@ -4776,13 +5903,13 @@
                                                             "loc": {
                                                                 "source": "stringify.css",
                                                                 "start": {
-                                                                    "offset": 1430,
-                                                                    "line": 62,
+                                                                    "offset": 1721,
+                                                                    "line": 90,
                                                                     "column": 16
                                                                 },
                                                                 "end": {
-                                                                    "offset": 1431,
-                                                                    "line": 62,
+                                                                    "offset": 1722,
+                                                                    "line": 90,
                                                                     "column": 17
                                                                 }
                                                             },
@@ -4792,13 +5919,13 @@
                                                                     "loc": {
                                                                         "source": "stringify.css",
                                                                         "start": {
-                                                                            "offset": 1430,
-                                                                            "line": 62,
+                                                                            "offset": 1721,
+                                                                            "line": 90,
                                                                             "column": 16
                                                                         },
                                                                         "end": {
-                                                                            "offset": 1431,
-                                                                            "line": 62,
+                                                                            "offset": 1722,
+                                                                            "line": 90,
                                                                             "column": 17
                                                                         }
                                                                     },
@@ -4808,13 +5935,13 @@
                                                                             "loc": {
                                                                                 "source": "stringify.css",
                                                                                 "start": {
-                                                                                    "offset": 1430,
-                                                                                    "line": 62,
+                                                                                    "offset": 1721,
+                                                                                    "line": 90,
                                                                                     "column": 16
                                                                                 },
                                                                                 "end": {
-                                                                                    "offset": 1431,
-                                                                                    "line": 62,
+                                                                                    "offset": 1722,
+                                                                                    "line": 90,
                                                                                     "column": 17
                                                                                 }
                                                                             }
@@ -4836,13 +5963,13 @@
                             "loc": {
                                 "source": "stringify.css",
                                 "start": {
-                                    "offset": 1433,
-                                    "line": 62,
+                                    "offset": 1724,
+                                    "line": 90,
                                     "column": 19
                                 },
                                 "end": {
-                                    "offset": 1463,
-                                    "line": 64,
+                                    "offset": 1754,
+                                    "line": 92,
                                     "column": 6
                                 }
                             },
@@ -4852,13 +5979,13 @@
                                     "loc": {
                                         "source": "stringify.css",
                                         "start": {
-                                            "offset": 1443,
-                                            "line": 63,
+                                            "offset": 1734,
+                                            "line": 91,
                                             "column": 9
                                         },
                                         "end": {
-                                            "offset": 1456,
-                                            "line": 63,
+                                            "offset": 1747,
+                                            "line": 91,
                                             "column": 22
                                         }
                                     },
@@ -4869,13 +5996,13 @@
                                         "loc": {
                                             "source": "stringify.css",
                                             "start": {
-                                                "offset": 1450,
-                                                "line": 63,
+                                                "offset": 1741,
+                                                "line": 91,
                                                 "column": 16
                                             },
                                             "end": {
-                                                "offset": 1456,
-                                                "line": 63,
+                                                "offset": 1747,
+                                                "line": 91,
                                                 "column": 22
                                             }
                                         },
@@ -4885,13 +6012,13 @@
                                                 "loc": {
                                                     "source": "stringify.css",
                                                     "start": {
-                                                        "offset": 1450,
-                                                        "line": 63,
+                                                        "offset": 1741,
+                                                        "line": 91,
                                                         "column": 16
                                                     },
                                                     "end": {
-                                                        "offset": 1456,
-                                                        "line": 63,
+                                                        "offset": 1747,
+                                                        "line": 91,
                                                         "column": 22
                                                     }
                                                 },
@@ -4908,13 +6035,13 @@
                         "loc": {
                             "source": "stringify.css",
                             "start": {
-                                "offset": 1468,
-                                "line": 65,
+                                "offset": 1759,
+                                "line": 93,
                                 "column": 5
                             },
                             "end": {
-                                "offset": 1526,
-                                "line": 67,
+                                "offset": 1817,
+                                "line": 95,
                                 "column": 6
                             }
                         },
@@ -4924,14 +6051,14 @@
                             "loc": {
                                 "source": "stringify.css",
                                 "start": {
-                                    "offset": 1475,
-                                    "line": 65,
+                                    "offset": 1766,
+                                    "line": 93,
                                     "column": 12
                                 },
                                 "end": {
-                                    "offset": 1498,
-                                    "line": 65,
-                                    "column": 35
+                                    "offset": 1790,
+                                    "line": 93,
+                                    "column": 36
                                 }
                             },
                             "children": [
@@ -4940,14 +6067,14 @@
                                     "loc": {
                                         "source": "stringify.css",
                                         "start": {
-                                            "offset": 1475,
-                                            "line": 65,
+                                            "offset": 1766,
+                                            "line": 93,
                                             "column": 12
                                         },
                                         "end": {
-                                            "offset": 1498,
-                                            "line": 65,
-                                            "column": 35
+                                            "offset": 1790,
+                                            "line": 93,
+                                            "column": 36
                                         }
                                     },
                                     "children": [
@@ -4956,52 +6083,72 @@
                                             "loc": {
                                                 "source": "stringify.css",
                                                 "start": {
-                                                    "offset": 1475,
-                                                    "line": 65,
+                                                    "offset": 1766,
+                                                    "line": 93,
                                                     "column": 12
                                                 },
                                                 "end": {
-                                                    "offset": 1498,
-                                                    "line": 65,
-                                                    "column": 35
+                                                    "offset": 1790,
+                                                    "line": 93,
+                                                    "column": 36
                                                 }
                                             },
-                                            "children": [
-                                                {
-                                                    "type": "MediaFeature",
-                                                    "loc": {
-                                                        "source": "stringify.css",
-                                                        "start": {
-                                                            "offset": 1475,
-                                                            "line": 65,
-                                                            "column": 12
-                                                        },
-                                                        "end": {
-                                                            "offset": 1498,
-                                                            "line": 65,
-                                                            "column": 35
-                                                        }
+                                            "modifier": null,
+                                            "mediaType": null,
+                                            "condition": {
+                                                "type": "Condition",
+                                                "loc": {
+                                                    "source": "stringify.css",
+                                                    "start": {
+                                                        "offset": 1766,
+                                                        "line": 93,
+                                                        "column": 12
                                                     },
-                                                    "name": "orientation",
-                                                    "value": {
-                                                        "type": "Identifier",
+                                                    "end": {
+                                                        "offset": 1789,
+                                                        "line": 93,
+                                                        "column": 35
+                                                    }
+                                                },
+                                                "kind": "media",
+                                                "children": [
+                                                    {
+                                                        "type": "Feature",
                                                         "loc": {
                                                             "source": "stringify.css",
                                                             "start": {
-                                                                "offset": 1489,
-                                                                "line": 65,
-                                                                "column": 26
+                                                                "offset": 1766,
+                                                                "line": 93,
+                                                                "column": 12
                                                             },
                                                             "end": {
-                                                                "offset": 1497,
-                                                                "line": 65,
-                                                                "column": 34
+                                                                "offset": 1789,
+                                                                "line": 93,
+                                                                "column": 35
                                                             }
                                                         },
-                                                        "name": "vertical"
+                                                        "kind": "media",
+                                                        "name": "orientation",
+                                                        "value": {
+                                                            "type": "Identifier",
+                                                            "loc": {
+                                                                "source": "stringify.css",
+                                                                "start": {
+                                                                    "offset": 1780,
+                                                                    "line": 93,
+                                                                    "column": 26
+                                                                },
+                                                                "end": {
+                                                                    "offset": 1788,
+                                                                    "line": 93,
+                                                                    "column": 34
+                                                                }
+                                                            },
+                                                            "name": "vertical"
+                                                        }
                                                     }
-                                                }
-                                            ]
+                                                ]
+                                            }
                                         }
                                     ]
                                 }
@@ -5012,13 +6159,13 @@
                             "loc": {
                                 "source": "stringify.css",
                                 "start": {
-                                    "offset": 1499,
-                                    "line": 65,
+                                    "offset": 1790,
+                                    "line": 93,
                                     "column": 36
                                 },
                                 "end": {
-                                    "offset": 1526,
-                                    "line": 67,
+                                    "offset": 1817,
+                                    "line": 95,
                                     "column": 6
                                 }
                             },
@@ -5028,13 +6175,13 @@
                                     "loc": {
                                         "source": "stringify.css",
                                         "start": {
-                                            "offset": 1509,
-                                            "line": 66,
+                                            "offset": 1800,
+                                            "line": 94,
                                             "column": 9
                                         },
                                         "end": {
-                                            "offset": 1519,
-                                            "line": 66,
+                                            "offset": 1810,
+                                            "line": 94,
                                             "column": 19
                                         }
                                     },
@@ -5045,13 +6192,13 @@
                                         "loc": {
                                             "source": "stringify.css",
                                             "start": {
-                                                "offset": 1516,
-                                                "line": 66,
+                                                "offset": 1807,
+                                                "line": 94,
                                                 "column": 16
                                             },
                                             "end": {
-                                                "offset": 1519,
-                                                "line": 66,
+                                                "offset": 1810,
+                                                "line": 94,
                                                 "column": 19
                                             }
                                         },
@@ -5061,13 +6208,13 @@
                                                 "loc": {
                                                     "source": "stringify.css",
                                                     "start": {
-                                                        "offset": 1516,
-                                                        "line": 66,
+                                                        "offset": 1807,
+                                                        "line": 94,
                                                         "column": 16
                                                     },
                                                     "end": {
-                                                        "offset": 1519,
-                                                        "line": 66,
+                                                        "offset": 1810,
+                                                        "line": 94,
                                                         "column": 19
                                                     }
                                                 },
@@ -5078,6 +6225,1665 @@
                                 }
                             ]
                         }
+                    },
+                    {
+                        "type": "Atrule",
+                        "loc": {
+                            "source": "stringify.css",
+                            "start": {
+                                "offset": 1822,
+                                "line": 96,
+                                "column": 5
+                            },
+                            "end": {
+                                "offset": 1866,
+                                "line": 98,
+                                "column": 6
+                            }
+                        },
+                        "name": "starting-style",
+                        "prelude": null,
+                        "block": {
+                            "type": "Block",
+                            "loc": {
+                                "source": "stringify.css",
+                                "start": {
+                                    "offset": 1838,
+                                    "line": 96,
+                                    "column": 21
+                                },
+                                "end": {
+                                    "offset": 1866,
+                                    "line": 98,
+                                    "column": 6
+                                }
+                            },
+                            "children": [
+                                {
+                                    "type": "Declaration",
+                                    "loc": {
+                                        "source": "stringify.css",
+                                        "start": {
+                                            "offset": 1848,
+                                            "line": 97,
+                                            "column": 9
+                                        },
+                                        "end": {
+                                            "offset": 1859,
+                                            "line": 97,
+                                            "column": 20
+                                        }
+                                    },
+                                    "important": false,
+                                    "property": "color",
+                                    "value": {
+                                        "type": "Value",
+                                        "loc": {
+                                            "source": "stringify.css",
+                                            "start": {
+                                                "offset": 1855,
+                                                "line": 97,
+                                                "column": 16
+                                            },
+                                            "end": {
+                                                "offset": 1859,
+                                                "line": 97,
+                                                "column": 20
+                                            }
+                                        },
+                                        "children": [
+                                            {
+                                                "type": "Identifier",
+                                                "loc": {
+                                                    "source": "stringify.css",
+                                                    "start": {
+                                                        "offset": 1855,
+                                                        "line": 97,
+                                                        "column": 16
+                                                    },
+                                                    "end": {
+                                                        "offset": 1859,
+                                                        "line": 97,
+                                                        "column": 20
+                                                    }
+                                                },
+                                                "name": "blue"
+                                            }
+                                        ]
+                                    }
+                                }
+                            ]
+                        }
+                    },
+                    {
+                        "type": "Atrule",
+                        "loc": {
+                            "source": "stringify.css",
+                            "start": {
+                                "offset": 1871,
+                                "line": 99,
+                                "column": 5
+                            },
+                            "end": {
+                                "offset": 1918,
+                                "line": 101,
+                                "column": 6
+                            }
+                        },
+                        "name": "scope",
+                        "prelude": {
+                            "type": "AtrulePrelude",
+                            "loc": {
+                                "source": "stringify.css",
+                                "start": {
+                                    "offset": 1878,
+                                    "line": 99,
+                                    "column": 12
+                                },
+                                "end": {
+                                    "offset": 1888,
+                                    "line": 99,
+                                    "column": 22
+                                }
+                            },
+                            "children": [
+                                {
+                                    "type": "Scope",
+                                    "loc": {
+                                        "source": "stringify.css",
+                                        "start": {
+                                            "offset": 1878,
+                                            "line": 99,
+                                            "column": 12
+                                        },
+                                        "end": {
+                                            "offset": 1888,
+                                            "line": 99,
+                                            "column": 22
+                                        }
+                                    },
+                                    "root": {
+                                        "type": "SelectorList",
+                                        "loc": {
+                                            "source": "stringify.css",
+                                            "start": {
+                                                "offset": 1879,
+                                                "line": 99,
+                                                "column": 13
+                                            },
+                                            "end": {
+                                                "offset": 1880,
+                                                "line": 99,
+                                                "column": 14
+                                            }
+                                        },
+                                        "children": [
+                                            {
+                                                "type": "Selector",
+                                                "loc": {
+                                                    "source": "stringify.css",
+                                                    "start": {
+                                                        "offset": 1879,
+                                                        "line": 99,
+                                                        "column": 13
+                                                    },
+                                                    "end": {
+                                                        "offset": 1880,
+                                                        "line": 99,
+                                                        "column": 14
+                                                    }
+                                                },
+                                                "children": [
+                                                    {
+                                                        "type": "TypeSelector",
+                                                        "loc": {
+                                                            "source": "stringify.css",
+                                                            "start": {
+                                                                "offset": 1879,
+                                                                "line": 99,
+                                                                "column": 13
+                                                            },
+                                                            "end": {
+                                                                "offset": 1880,
+                                                                "line": 99,
+                                                                "column": 14
+                                                            }
+                                                        },
+                                                        "name": "a"
+                                                    }
+                                                ]
+                                            }
+                                        ]
+                                    },
+                                    "limit": {
+                                        "type": "SelectorList",
+                                        "loc": {
+                                            "source": "stringify.css",
+                                            "start": {
+                                                "offset": 1886,
+                                                "line": 99,
+                                                "column": 20
+                                            },
+                                            "end": {
+                                                "offset": 1887,
+                                                "line": 99,
+                                                "column": 21
+                                            }
+                                        },
+                                        "children": [
+                                            {
+                                                "type": "Selector",
+                                                "loc": {
+                                                    "source": "stringify.css",
+                                                    "start": {
+                                                        "offset": 1886,
+                                                        "line": 99,
+                                                        "column": 20
+                                                    },
+                                                    "end": {
+                                                        "offset": 1887,
+                                                        "line": 99,
+                                                        "column": 21
+                                                    }
+                                                },
+                                                "children": [
+                                                    {
+                                                        "type": "TypeSelector",
+                                                        "loc": {
+                                                            "source": "stringify.css",
+                                                            "start": {
+                                                                "offset": 1886,
+                                                                "line": 99,
+                                                                "column": 20
+                                                            },
+                                                            "end": {
+                                                                "offset": 1887,
+                                                                "line": 99,
+                                                                "column": 21
+                                                            }
+                                                        },
+                                                        "name": "b"
+                                                    }
+                                                ]
+                                            }
+                                        ]
+                                    }
+                                }
+                            ]
+                        },
+                        "block": {
+                            "type": "Block",
+                            "loc": {
+                                "source": "stringify.css",
+                                "start": {
+                                    "offset": 1889,
+                                    "line": 99,
+                                    "column": 23
+                                },
+                                "end": {
+                                    "offset": 1918,
+                                    "line": 101,
+                                    "column": 6
+                                }
+                            },
+                            "children": [
+                                {
+                                    "type": "Declaration",
+                                    "loc": {
+                                        "source": "stringify.css",
+                                        "start": {
+                                            "offset": 1899,
+                                            "line": 100,
+                                            "column": 9
+                                        },
+                                        "end": {
+                                            "offset": 1911,
+                                            "line": 100,
+                                            "column": 21
+                                        }
+                                    },
+                                    "important": false,
+                                    "property": "color",
+                                    "value": {
+                                        "type": "Value",
+                                        "loc": {
+                                            "source": "stringify.css",
+                                            "start": {
+                                                "offset": 1906,
+                                                "line": 100,
+                                                "column": 16
+                                            },
+                                            "end": {
+                                                "offset": 1911,
+                                                "line": 100,
+                                                "column": 21
+                                            }
+                                        },
+                                        "children": [
+                                            {
+                                                "type": "Identifier",
+                                                "loc": {
+                                                    "source": "stringify.css",
+                                                    "start": {
+                                                        "offset": 1906,
+                                                        "line": 100,
+                                                        "column": 16
+                                                    },
+                                                    "end": {
+                                                        "offset": 1911,
+                                                        "line": 100,
+                                                        "column": 21
+                                                    }
+                                                },
+                                                "name": "black"
+                                            }
+                                        ]
+                                    }
+                                }
+                            ]
+                        }
+                    }
+                ]
+            }
+        },
+        {
+            "type": "Atrule",
+            "loc": {
+                "source": "stringify.css",
+                "start": {
+                    "offset": 1922,
+                    "line": 104,
+                    "column": 1
+                },
+                "end": {
+                    "offset": 2035,
+                    "line": 110,
+                    "column": 2
+                }
+            },
+            "name": "media",
+            "prelude": {
+                "type": "AtrulePrelude",
+                "loc": {
+                    "source": "stringify.css",
+                    "start": {
+                        "offset": 1929,
+                        "line": 104,
+                        "column": 8
+                    },
+                    "end": {
+                        "offset": 1953,
+                        "line": 104,
+                        "column": 32
+                    }
+                },
+                "children": [
+                    {
+                        "type": "MediaQueryList",
+                        "loc": {
+                            "source": "stringify.css",
+                            "start": {
+                                "offset": 1929,
+                                "line": 104,
+                                "column": 8
+                            },
+                            "end": {
+                                "offset": 1953,
+                                "line": 104,
+                                "column": 32
+                            }
+                        },
+                        "children": [
+                            {
+                                "type": "MediaQuery",
+                                "loc": {
+                                    "source": "stringify.css",
+                                    "start": {
+                                        "offset": 1929,
+                                        "line": 104,
+                                        "column": 8
+                                    },
+                                    "end": {
+                                        "offset": 1953,
+                                        "line": 104,
+                                        "column": 32
+                                    }
+                                },
+                                "modifier": null,
+                                "mediaType": null,
+                                "condition": {
+                                    "type": "Condition",
+                                    "loc": {
+                                        "source": "stringify.css",
+                                        "start": {
+                                            "offset": 1929,
+                                            "line": 104,
+                                            "column": 8
+                                        },
+                                        "end": {
+                                            "offset": 1952,
+                                            "line": 104,
+                                            "column": 31
+                                        }
+                                    },
+                                    "kind": "media",
+                                    "children": [
+                                        {
+                                            "type": "FeatureRange",
+                                            "loc": {
+                                                "source": "stringify.css",
+                                                "start": {
+                                                    "offset": 1929,
+                                                    "line": 104,
+                                                    "column": 8
+                                                },
+                                                "end": {
+                                                    "offset": 1952,
+                                                    "line": 104,
+                                                    "column": 31
+                                                }
+                                            },
+                                            "kind": "media",
+                                            "left": {
+                                                "type": "Dimension",
+                                                "loc": {
+                                                    "source": "stringify.css",
+                                                    "start": {
+                                                        "offset": 1930,
+                                                        "line": 104,
+                                                        "column": 9
+                                                    },
+                                                    "end": {
+                                                        "offset": 1935,
+                                                        "line": 104,
+                                                        "column": 14
+                                                    }
+                                                },
+                                                "value": "100",
+                                                "unit": "px"
+                                            },
+                                            "leftComparison": "<",
+                                            "middle": {
+                                                "type": "Identifier",
+                                                "loc": {
+                                                    "source": "stringify.css",
+                                                    "start": {
+                                                        "offset": 1938,
+                                                        "line": 104,
+                                                        "column": 17
+                                                    },
+                                                    "end": {
+                                                        "offset": 1943,
+                                                        "line": 104,
+                                                        "column": 22
+                                                    }
+                                                },
+                                                "name": "width"
+                                            },
+                                            "rightComparison": "<",
+                                            "right": {
+                                                "type": "Dimension",
+                                                "loc": {
+                                                    "source": "stringify.css",
+                                                    "start": {
+                                                        "offset": 1946,
+                                                        "line": 104,
+                                                        "column": 25
+                                                    },
+                                                    "end": {
+                                                        "offset": 1951,
+                                                        "line": 104,
+                                                        "column": 30
+                                                    }
+                                                },
+                                                "value": "400",
+                                                "unit": "px"
+                                            }
+                                        }
+                                    ]
+                                }
+                            }
+                        ]
+                    }
+                ]
+            },
+            "block": {
+                "type": "Block",
+                "loc": {
+                    "source": "stringify.css",
+                    "start": {
+                        "offset": 1953,
+                        "line": 104,
+                        "column": 32
+                    },
+                    "end": {
+                        "offset": 2035,
+                        "line": 110,
+                        "column": 2
+                    }
+                },
+                "children": [
+                    {
+                        "type": "Atrule",
+                        "loc": {
+                            "source": "stringify.css",
+                            "start": {
+                                "offset": 1959,
+                                "line": 105,
+                                "column": 5
+                            },
+                            "end": {
+                                "offset": 2033,
+                                "line": 109,
+                                "column": 6
+                            }
+                        },
+                        "name": "container",
+                        "prelude": {
+                            "type": "Raw",
+                            "loc": {
+                                "source": "stringify.css",
+                                "start": {
+                                    "offset": 1970,
+                                    "line": 105,
+                                    "column": 16
+                                },
+                                "end": {
+                                    "offset": 1973,
+                                    "line": 105,
+                                    "column": 19
+                                }
+                            },
+                            "value": "foo"
+                        },
+                        "block": {
+                            "type": "Block",
+                            "loc": {
+                                "source": "stringify.css",
+                                "start": {
+                                    "offset": 1974,
+                                    "line": 105,
+                                    "column": 20
+                                },
+                                "end": {
+                                    "offset": 2033,
+                                    "line": 109,
+                                    "column": 6
+                                }
+                            },
+                            "children": [
+                                {
+                                    "type": "Rule",
+                                    "loc": {
+                                        "source": "stringify.css",
+                                        "start": {
+                                            "offset": 1984,
+                                            "line": 106,
+                                            "column": 9
+                                        },
+                                        "end": {
+                                            "offset": 2027,
+                                            "line": 108,
+                                            "column": 10
+                                        }
+                                    },
+                                    "prelude": {
+                                        "type": "SelectorList",
+                                        "loc": {
+                                            "source": "stringify.css",
+                                            "start": {
+                                                "offset": 1984,
+                                                "line": 106,
+                                                "column": 9
+                                            },
+                                            "end": {
+                                                "offset": 1989,
+                                                "line": 106,
+                                                "column": 14
+                                            }
+                                        },
+                                        "children": [
+                                            {
+                                                "type": "Selector",
+                                                "loc": {
+                                                    "source": "stringify.css",
+                                                    "start": {
+                                                        "offset": 1984,
+                                                        "line": 106,
+                                                        "column": 9
+                                                    },
+                                                    "end": {
+                                                        "offset": 1989,
+                                                        "line": 106,
+                                                        "column": 14
+                                                    }
+                                                },
+                                                "children": [
+                                                    {
+                                                        "type": "ClassSelector",
+                                                        "loc": {
+                                                            "source": "stringify.css",
+                                                            "start": {
+                                                                "offset": 1984,
+                                                                "line": 106,
+                                                                "column": 9
+                                                            },
+                                                            "end": {
+                                                                "offset": 1989,
+                                                                "line": 106,
+                                                                "column": 14
+                                                            }
+                                                        },
+                                                        "name": "test"
+                                                    }
+                                                ]
+                                            }
+                                        ]
+                                    },
+                                    "block": {
+                                        "type": "Block",
+                                        "loc": {
+                                            "source": "stringify.css",
+                                            "start": {
+                                                "offset": 1990,
+                                                "line": 106,
+                                                "column": 15
+                                            },
+                                            "end": {
+                                                "offset": 2027,
+                                                "line": 108,
+                                                "column": 10
+                                            }
+                                        },
+                                        "children": [
+                                            {
+                                                "type": "Declaration",
+                                                "loc": {
+                                                    "source": "stringify.css",
+                                                    "start": {
+                                                        "offset": 2004,
+                                                        "line": 107,
+                                                        "column": 13
+                                                    },
+                                                    "end": {
+                                                        "offset": 2016,
+                                                        "line": 107,
+                                                        "column": 25
+                                                    }
+                                                },
+                                                "important": false,
+                                                "property": "color",
+                                                "value": {
+                                                    "type": "Value",
+                                                    "loc": {
+                                                        "source": "stringify.css",
+                                                        "start": {
+                                                            "offset": 2011,
+                                                            "line": 107,
+                                                            "column": 20
+                                                        },
+                                                        "end": {
+                                                            "offset": 2016,
+                                                            "line": 107,
+                                                            "column": 25
+                                                        }
+                                                    },
+                                                    "children": [
+                                                        {
+                                                            "type": "Hash",
+                                                            "loc": {
+                                                                "source": "stringify.css",
+                                                                "start": {
+                                                                    "offset": 2011,
+                                                                    "line": 107,
+                                                                    "column": 20
+                                                                },
+                                                                "end": {
+                                                                    "offset": 2016,
+                                                                    "line": 107,
+                                                                    "column": 25
+                                                                }
+                                                            },
+                                                            "value": "0f08"
+                                                        }
+                                                    ]
+                                                }
+                                            }
+                                        ]
+                                    }
+                                }
+                            ]
+                        }
+                    }
+                ]
+            }
+        },
+        {
+            "type": "Atrule",
+            "loc": {
+                "source": "stringify.css",
+                "start": {
+                    "offset": 2060,
+                    "line": 113,
+                    "column": 1
+                },
+                "end": {
+                    "offset": 2099,
+                    "line": 113,
+                    "column": 40
+                }
+            },
+            "name": "media",
+            "prelude": {
+                "type": "AtrulePrelude",
+                "loc": {
+                    "source": "stringify.css",
+                    "start": {
+                        "offset": 2067,
+                        "line": 113,
+                        "column": 8
+                    },
+                    "end": {
+                        "offset": 2097,
+                        "line": 113,
+                        "column": 38
+                    }
+                },
+                "children": [
+                    {
+                        "type": "MediaQueryList",
+                        "loc": {
+                            "source": "stringify.css",
+                            "start": {
+                                "offset": 2067,
+                                "line": 113,
+                                "column": 8
+                            },
+                            "end": {
+                                "offset": 2097,
+                                "line": 113,
+                                "column": 38
+                            }
+                        },
+                        "children": [
+                            {
+                                "type": "MediaQuery",
+                                "loc": {
+                                    "source": "stringify.css",
+                                    "start": {
+                                        "offset": 2067,
+                                        "line": 113,
+                                        "column": 8
+                                    },
+                                    "end": {
+                                        "offset": 2097,
+                                        "line": 113,
+                                        "column": 38
+                                    }
+                                },
+                                "modifier": null,
+                                "mediaType": null,
+                                "condition": {
+                                    "type": "Condition",
+                                    "loc": {
+                                        "source": "stringify.css",
+                                        "start": {
+                                            "offset": 2067,
+                                            "line": 113,
+                                            "column": 8
+                                        },
+                                        "end": {
+                                            "offset": 2096,
+                                            "line": 113,
+                                            "column": 37
+                                        }
+                                    },
+                                    "kind": "media",
+                                    "children": [
+                                        {
+                                            "type": "Feature",
+                                            "loc": {
+                                                "source": "stringify.css",
+                                                "start": {
+                                                    "offset": 2067,
+                                                    "line": 113,
+                                                    "column": 8
+                                                },
+                                                "end": {
+                                                    "offset": 2077,
+                                                    "line": 113,
+                                                    "column": 18
+                                                }
+                                            },
+                                            "kind": "media",
+                                            "name": "foo",
+                                            "value": {
+                                                "type": "Number",
+                                                "loc": {
+                                                    "source": "stringify.css",
+                                                    "start": {
+                                                        "offset": 2073,
+                                                        "line": 113,
+                                                        "column": 14
+                                                    },
+                                                    "end": {
+                                                        "offset": 2076,
+                                                        "line": 113,
+                                                        "column": 17
+                                                    }
+                                                },
+                                                "value": "123"
+                                            }
+                                        },
+                                        {
+                                            "type": "Identifier",
+                                            "loc": {
+                                                "source": "stringify.css",
+                                                "start": {
+                                                    "offset": 2078,
+                                                    "line": 113,
+                                                    "column": 19
+                                                },
+                                                "end": {
+                                                    "offset": 2081,
+                                                    "line": 113,
+                                                    "column": 22
+                                                }
+                                            },
+                                            "name": "and"
+                                        },
+                                        {
+                                            "type": "GeneralEnclosed",
+                                            "loc": {
+                                                "source": "stringify.css",
+                                                "start": {
+                                                    "offset": 2082,
+                                                    "line": 113,
+                                                    "column": 23
+                                                },
+                                                "end": {
+                                                    "offset": 2085,
+                                                    "line": 113,
+                                                    "column": 26
+                                                }
+                                            },
+                                            "kind": "media",
+                                            "function": null,
+                                            "children": [
+                                                {
+                                                    "type": "Number",
+                                                    "loc": {
+                                                        "source": "stringify.css",
+                                                        "start": {
+                                                            "offset": 2083,
+                                                            "line": 113,
+                                                            "column": 24
+                                                        },
+                                                        "end": {
+                                                            "offset": 2084,
+                                                            "line": 113,
+                                                            "column": 25
+                                                        }
+                                                    },
+                                                    "value": "1"
+                                                }
+                                            ]
+                                        },
+                                        {
+                                            "type": "Identifier",
+                                            "loc": {
+                                                "source": "stringify.css",
+                                                "start": {
+                                                    "offset": 2086,
+                                                    "line": 113,
+                                                    "column": 27
+                                                },
+                                                "end": {
+                                                    "offset": 2089,
+                                                    "line": 113,
+                                                    "column": 30
+                                                }
+                                            },
+                                            "name": "and"
+                                        },
+                                        {
+                                            "type": "GeneralEnclosed",
+                                            "loc": {
+                                                "source": "stringify.css",
+                                                "start": {
+                                                    "offset": 2090,
+                                                    "line": 113,
+                                                    "column": 31
+                                                },
+                                                "end": {
+                                                    "offset": 2096,
+                                                    "line": 113,
+                                                    "column": 37
+                                                }
+                                            },
+                                            "kind": "media",
+                                            "function": "foo",
+                                            "children": [
+                                                {
+                                                    "type": "Number",
+                                                    "loc": {
+                                                        "source": "stringify.css",
+                                                        "start": {
+                                                            "offset": 2094,
+                                                            "line": 113,
+                                                            "column": 35
+                                                        },
+                                                        "end": {
+                                                            "offset": 2095,
+                                                            "line": 113,
+                                                            "column": 36
+                                                        }
+                                                    },
+                                                    "value": "1"
+                                                }
+                                            ]
+                                        }
+                                    ]
+                                }
+                            }
+                        ]
+                    }
+                ]
+            },
+            "block": {
+                "type": "Block",
+                "loc": {
+                    "source": "stringify.css",
+                    "start": {
+                        "offset": 2097,
+                        "line": 113,
+                        "column": 38
+                    },
+                    "end": {
+                        "offset": 2099,
+                        "line": 113,
+                        "column": 40
+                    }
+                },
+                "children": []
+            }
+        },
+        {
+            "type": "Atrule",
+            "loc": {
+                "source": "stringify.css",
+                "start": {
+                    "offset": 2100,
+                    "line": 114,
+                    "column": 1
+                },
+                "end": {
+                    "offset": 2125,
+                    "line": 114,
+                    "column": 26
+                }
+            },
+            "name": "supports",
+            "prelude": {
+                "type": "AtrulePrelude",
+                "loc": {
+                    "source": "stringify.css",
+                    "start": {
+                        "offset": 2110,
+                        "line": 114,
+                        "column": 11
+                    },
+                    "end": {
+                        "offset": 2122,
+                        "line": 114,
+                        "column": 23
+                    }
+                },
+                "children": [
+                    {
+                        "type": "Condition",
+                        "loc": {
+                            "source": "stringify.css",
+                            "start": {
+                                "offset": 2110,
+                                "line": 114,
+                                "column": 11
+                            },
+                            "end": {
+                                "offset": 2122,
+                                "line": 114,
+                                "column": 23
+                            }
+                        },
+                        "kind": "supports",
+                        "children": [
+                            {
+                                "type": "FeatureFunction",
+                                "loc": {
+                                    "source": "stringify.css",
+                                    "start": {
+                                        "offset": 2110,
+                                        "line": 114,
+                                        "column": 11
+                                    },
+                                    "end": {
+                                        "offset": 2122,
+                                        "line": 114,
+                                        "column": 23
+                                    }
+                                },
+                                "kind": "supports",
+                                "feature": "selector",
+                                "value": {
+                                    "type": "Selector",
+                                    "loc": {
+                                        "source": "stringify.css",
+                                        "start": {
+                                            "offset": 2119,
+                                            "line": 114,
+                                            "column": 20
+                                        },
+                                        "end": {
+                                            "offset": 2121,
+                                            "line": 114,
+                                            "column": 22
+                                        }
+                                    },
+                                    "children": [
+                                        {
+                                            "type": "ClassSelector",
+                                            "loc": {
+                                                "source": "stringify.css",
+                                                "start": {
+                                                    "offset": 2119,
+                                                    "line": 114,
+                                                    "column": 20
+                                                },
+                                                "end": {
+                                                    "offset": 2121,
+                                                    "line": 114,
+                                                    "column": 22
+                                                }
+                                            },
+                                            "name": "a"
+                                        }
+                                    ]
+                                }
+                            }
+                        ]
+                    }
+                ]
+            },
+            "block": {
+                "type": "Block",
+                "loc": {
+                    "source": "stringify.css",
+                    "start": {
+                        "offset": 2123,
+                        "line": 114,
+                        "column": 24
+                    },
+                    "end": {
+                        "offset": 2125,
+                        "line": 114,
+                        "column": 26
+                    }
+                },
+                "children": []
+            }
+        },
+        {
+            "type": "Atrule",
+            "loc": {
+                "source": "stringify.css",
+                "start": {
+                    "offset": 2126,
+                    "line": 115,
+                    "column": 1
+                },
+                "end": {
+                    "offset": 2174,
+                    "line": 115,
+                    "column": 49
+                }
+            },
+            "name": "container",
+            "prelude": {
+                "type": "AtrulePrelude",
+                "loc": {
+                    "source": "stringify.css",
+                    "start": {
+                        "offset": 2137,
+                        "line": 115,
+                        "column": 12
+                    },
+                    "end": {
+                        "offset": 2171,
+                        "line": 115,
+                        "column": 46
+                    }
+                },
+                "children": [
+                    {
+                        "type": "Condition",
+                        "loc": {
+                            "source": "stringify.css",
+                            "start": {
+                                "offset": 2137,
+                                "line": 115,
+                                "column": 12
+                            },
+                            "end": {
+                                "offset": 2171,
+                                "line": 115,
+                                "column": 46
+                            }
+                        },
+                        "kind": "container",
+                        "children": [
+                            {
+                                "type": "FeatureRange",
+                                "loc": {
+                                    "source": "stringify.css",
+                                    "start": {
+                                        "offset": 2137,
+                                        "line": 115,
+                                        "column": 12
+                                    },
+                                    "end": {
+                                        "offset": 2152,
+                                        "line": 115,
+                                        "column": 27
+                                    }
+                                },
+                                "kind": "container",
+                                "left": {
+                                    "type": "Identifier",
+                                    "loc": {
+                                        "source": "stringify.css",
+                                        "start": {
+                                            "offset": 2138,
+                                            "line": 115,
+                                            "column": 13
+                                        },
+                                        "end": {
+                                            "offset": 2143,
+                                            "line": 115,
+                                            "column": 18
+                                        }
+                                    },
+                                    "name": "width"
+                                },
+                                "leftComparison": ">",
+                                "middle": {
+                                    "type": "Dimension",
+                                    "loc": {
+                                        "source": "stringify.css",
+                                        "start": {
+                                            "offset": 2146,
+                                            "line": 115,
+                                            "column": 21
+                                        },
+                                        "end": {
+                                            "offset": 2151,
+                                            "line": 115,
+                                            "column": 26
+                                        }
+                                    },
+                                    "value": "500",
+                                    "unit": "px"
+                                },
+                                "rightComparison": null,
+                                "right": null
+                            },
+                            {
+                                "type": "Identifier",
+                                "loc": {
+                                    "source": "stringify.css",
+                                    "start": {
+                                        "offset": 2153,
+                                        "line": 115,
+                                        "column": 28
+                                    },
+                                    "end": {
+                                        "offset": 2156,
+                                        "line": 115,
+                                        "column": 31
+                                    }
+                                },
+                                "name": "and"
+                            },
+                            {
+                                "type": "FeatureFunction",
+                                "loc": {
+                                    "source": "stringify.css",
+                                    "start": {
+                                        "offset": 2157,
+                                        "line": 115,
+                                        "column": 32
+                                    },
+                                    "end": {
+                                        "offset": 2171,
+                                        "line": 115,
+                                        "column": 46
+                                    }
+                                },
+                                "kind": "container",
+                                "feature": "style",
+                                "value": {
+                                    "type": "Declaration",
+                                    "loc": {
+                                        "source": "stringify.css",
+                                        "start": {
+                                            "offset": 2163,
+                                            "line": 115,
+                                            "column": 38
+                                        },
+                                        "end": {
+                                            "offset": 2170,
+                                            "line": 115,
+                                            "column": 45
+                                        }
+                                    },
+                                    "important": false,
+                                    "property": "--foo",
+                                    "value": {
+                                        "type": "Raw",
+                                        "loc": {
+                                            "source": "stringify.css",
+                                            "start": {
+                                                "offset": 2169,
+                                                "line": 115,
+                                                "column": 44
+                                            },
+                                            "end": {
+                                                "offset": 2170,
+                                                "line": 115,
+                                                "column": 45
+                                            }
+                                        },
+                                        "value": "1"
+                                    }
+                                }
+                            }
+                        ]
+                    }
+                ]
+            },
+            "block": {
+                "type": "Block",
+                "loc": {
+                    "source": "stringify.css",
+                    "start": {
+                        "offset": 2172,
+                        "line": 115,
+                        "column": 47
+                    },
+                    "end": {
+                        "offset": 2174,
+                        "line": 115,
+                        "column": 49
+                    }
+                },
+                "children": []
+            }
+        },
+        {
+            "type": "Atrule",
+            "loc": {
+                "source": "stringify.css",
+                "start": {
+                    "offset": 2175,
+                    "line": 116,
+                    "column": 1
+                },
+                "end": {
+                    "offset": 2193,
+                    "line": 116,
+                    "column": 19
+                }
+            },
+            "name": "layer",
+            "prelude": {
+                "type": "AtrulePrelude",
+                "loc": {
+                    "source": "stringify.css",
+                    "start": {
+                        "offset": 2182,
+                        "line": 116,
+                        "column": 8
+                    },
+                    "end": {
+                        "offset": 2190,
+                        "line": 116,
+                        "column": 16
+                    }
+                },
+                "children": [
+                    {
+                        "type": "LayerList",
+                        "loc": {
+                            "source": "stringify.css",
+                            "start": {
+                                "offset": 2182,
+                                "line": 116,
+                                "column": 8
+                            },
+                            "end": {
+                                "offset": 2190,
+                                "line": 116,
+                                "column": 16
+                            }
+                        },
+                        "children": [
+                            {
+                                "type": "Layer",
+                                "loc": {
+                                    "source": "stringify.css",
+                                    "start": {
+                                        "offset": 2182,
+                                        "line": 116,
+                                        "column": 8
+                                    },
+                                    "end": {
+                                        "offset": 2185,
+                                        "line": 116,
+                                        "column": 11
+                                    }
+                                },
+                                "name": "foo"
+                            },
+                            {
+                                "type": "Layer",
+                                "loc": {
+                                    "source": "stringify.css",
+                                    "start": {
+                                        "offset": 2187,
+                                        "line": 116,
+                                        "column": 13
+                                    },
+                                    "end": {
+                                        "offset": 2190,
+                                        "line": 116,
+                                        "column": 16
+                                    }
+                                },
+                                "name": "bar"
+                            }
+                        ]
+                    }
+                ]
+            },
+            "block": {
+                "type": "Block",
+                "loc": {
+                    "source": "stringify.css",
+                    "start": {
+                        "offset": 2191,
+                        "line": 116,
+                        "column": 17
+                    },
+                    "end": {
+                        "offset": 2193,
+                        "line": 116,
+                        "column": 19
+                    }
+                },
+                "children": []
+            }
+        },
+        {
+            "type": "Atrule",
+            "loc": {
+                "source": "stringify.css",
+                "start": {
+                    "offset": 2194,
+                    "line": 117,
+                    "column": 1
+                },
+                "end": {
+                    "offset": 2212,
+                    "line": 117,
+                    "column": 19
+                }
+            },
+            "name": "starting-style",
+            "prelude": null,
+            "block": {
+                "type": "Block",
+                "loc": {
+                    "source": "stringify.css",
+                    "start": {
+                        "offset": 2210,
+                        "line": 117,
+                        "column": 17
+                    },
+                    "end": {
+                        "offset": 2212,
+                        "line": 117,
+                        "column": 19
+                    }
+                },
+                "children": []
+            }
+        },
+        {
+            "type": "Atrule",
+            "loc": {
+                "source": "stringify.css",
+                "start": {
+                    "offset": 2213,
+                    "line": 118,
+                    "column": 1
+                },
+                "end": {
+                    "offset": 2239,
+                    "line": 118,
+                    "column": 27
+                }
+            },
+            "name": "scope",
+            "prelude": {
+                "type": "AtrulePrelude",
+                "loc": {
+                    "source": "stringify.css",
+                    "start": {
+                        "offset": 2220,
+                        "line": 118,
+                        "column": 8
+                    },
+                    "end": {
+                        "offset": 2230,
+                        "line": 118,
+                        "column": 18
+                    }
+                },
+                "children": [
+                    {
+                        "type": "Scope",
+                        "loc": {
+                            "source": "stringify.css",
+                            "start": {
+                                "offset": 2220,
+                                "line": 118,
+                                "column": 8
+                            },
+                            "end": {
+                                "offset": 2230,
+                                "line": 118,
+                                "column": 18
+                            }
+                        },
+                        "root": {
+                            "type": "SelectorList",
+                            "loc": {
+                                "source": "stringify.css",
+                                "start": {
+                                    "offset": 2221,
+                                    "line": 118,
+                                    "column": 9
+                                },
+                                "end": {
+                                    "offset": 2222,
+                                    "line": 118,
+                                    "column": 10
+                                }
+                            },
+                            "children": [
+                                {
+                                    "type": "Selector",
+                                    "loc": {
+                                        "source": "stringify.css",
+                                        "start": {
+                                            "offset": 2221,
+                                            "line": 118,
+                                            "column": 9
+                                        },
+                                        "end": {
+                                            "offset": 2222,
+                                            "line": 118,
+                                            "column": 10
+                                        }
+                                    },
+                                    "children": [
+                                        {
+                                            "type": "TypeSelector",
+                                            "loc": {
+                                                "source": "stringify.css",
+                                                "start": {
+                                                    "offset": 2221,
+                                                    "line": 118,
+                                                    "column": 9
+                                                },
+                                                "end": {
+                                                    "offset": 2222,
+                                                    "line": 118,
+                                                    "column": 10
+                                                }
+                                            },
+                                            "name": "a"
+                                        }
+                                    ]
+                                }
+                            ]
+                        },
+                        "limit": {
+                            "type": "SelectorList",
+                            "loc": {
+                                "source": "stringify.css",
+                                "start": {
+                                    "offset": 2228,
+                                    "line": 118,
+                                    "column": 16
+                                },
+                                "end": {
+                                    "offset": 2229,
+                                    "line": 118,
+                                    "column": 17
+                                }
+                            },
+                            "children": [
+                                {
+                                    "type": "Selector",
+                                    "loc": {
+                                        "source": "stringify.css",
+                                        "start": {
+                                            "offset": 2228,
+                                            "line": 118,
+                                            "column": 16
+                                        },
+                                        "end": {
+                                            "offset": 2229,
+                                            "line": 118,
+                                            "column": 17
+                                        }
+                                    },
+                                    "children": [
+                                        {
+                                            "type": "TypeSelector",
+                                            "loc": {
+                                                "source": "stringify.css",
+                                                "start": {
+                                                    "offset": 2228,
+                                                    "line": 118,
+                                                    "column": 16
+                                                },
+                                                "end": {
+                                                    "offset": 2229,
+                                                    "line": 118,
+                                                    "column": 17
+                                                }
+                                            },
+                                            "name": "b"
+                                        }
+                                    ]
+                                }
+                            ]
+                        }
+                    }
+                ]
+            },
+            "block": {
+                "type": "Block",
+                "loc": {
+                    "source": "stringify.css",
+                    "start": {
+                        "offset": 2231,
+                        "line": 118,
+                        "column": 19
+                    },
+                    "end": {
+                        "offset": 2239,
+                        "line": 118,
+                        "column": 27
+                    }
+                },
+                "children": [
+                    {
+                        "type": "Rule",
+                        "loc": {
+                            "source": "stringify.css",
+                            "start": {
+                                "offset": 2233,
+                                "line": 118,
+                                "column": 21
+                            },
+                            "end": {
+                                "offset": 2237,
+                                "line": 118,
+                                "column": 25
+                            }
+                        },
+                        "prelude": {
+                            "type": "SelectorList",
+                            "loc": {
+                                "source": "stringify.css",
+                                "start": {
+                                    "offset": 2233,
+                                    "line": 118,
+                                    "column": 21
+                                },
+                                "end": {
+                                    "offset": 2234,
+                                    "line": 118,
+                                    "column": 22
+                                }
+                            },
+                            "children": [
+                                {
+                                    "type": "Selector",
+                                    "loc": {
+                                        "source": "stringify.css",
+                                        "start": {
+                                            "offset": 2233,
+                                            "line": 118,
+                                            "column": 21
+                                        },
+                                        "end": {
+                                            "offset": 2234,
+                                            "line": 118,
+                                            "column": 22
+                                        }
+                                    },
+                                    "children": [
+                                        {
+                                            "type": "TypeSelector",
+                                            "loc": {
+                                                "source": "stringify.css",
+                                                "start": {
+                                                    "offset": 2233,
+                                                    "line": 118,
+                                                    "column": 21
+                                                },
+                                                "end": {
+                                                    "offset": 2234,
+                                                    "line": 118,
+                                                    "column": 22
+                                                }
+                                            },
+                                            "name": "c"
+                                        }
+                                    ]
+                                }
+                            ]
+                        },
+                        "block": {
+                            "type": "Block",
+                            "loc": {
+                                "source": "stringify.css",
+                                "start": {
+                                    "offset": 2235,
+                                    "line": 118,
+                                    "column": 23
+                                },
+                                "end": {
+                                    "offset": 2237,
+                                    "line": 118,
+                                    "column": 25
+                                }
+                            },
+                            "children": []
+                        }
                     }
                 ]
             }
diff -pruN 2.3.1-1/fixtures/stringify.css 3.1.0-1/fixtures/stringify.css
--- 2.3.1-1/fixtures/stringify.css	2022-12-14 17:31:12.000000000 +0000
+++ 3.1.0-1/fixtures/stringify.css	2024-12-06 17:25:18.000000000 +0000
@@ -9,6 +9,32 @@
     }
 }
 
+@import 'foo' layer(bar);
+
+@layer foo {
+    .class {
+        color: red;
+    }
+
+    @layer bar {
+        .class2 {
+            color: red;
+        }
+    }
+}
+
+@layer foo.bar {
+    .class {
+        color: red;
+    }
+}
+
+@layer {
+    .class {
+        color: red;
+    }
+}
+
 *.class element#id[attr] [attr|="asd"][attr=value i]:pseudo::pseudo ~ :not(a, b) + :nth-child(odd):nth-child(2n + 1),
 svg|*:matches(a)::slotted(c) > :nth-child(odd of a, :b):nth-child(2n + 1 of [a]),
 :has(> img) {
@@ -40,6 +66,8 @@ svg|*:matches(a)::slotted(c) > :nth-chil
     -foo: 123;
 }
 
+:lang(en, 'de-DE') {}
+
 <!-- /* CDO/CDC */ -->
 @import 'foo' screen;
 @keyframes 'anim' {
@@ -65,4 +93,26 @@ edge\ .c\61ases {
     @media (orientation: vertical) {
         color: red;
     }
+    @starting-style {
+        color: blue;
+    }
+    @scope (a) to (b) {
+        color: black;
+    }
 }
+
+@media (100px < width < 400px) {
+    @container foo {
+        .test {
+            color: #0f08;
+        }
+    }
+}
+
+/* general enclosed */
+@media (foo: 123) and (1) and foo(1) {}
+@supports selector(.a) {}
+@container (width > 500px) and style(--foo:1) {}
+@layer foo, bar {}
+@starting-style {}
+@scope (a) to (b) { c {} }
diff -pruN 2.3.1-1/lib/__tests/common.js 3.1.0-1/lib/__tests/common.js
--- 2.3.1-1/lib/__tests/common.js	2022-12-14 17:31:12.000000000 +0000
+++ 3.1.0-1/lib/__tests/common.js	2024-12-06 17:25:18.000000000 +0000
@@ -17,7 +17,7 @@ describe('Common', () => {
         assert.strictEqual(version, JSON.parse(fs.readFileSync('./package.json')).version);
     });
 
-    it('JSON.strigify()', () => {
+    it('JSON.stringify()', () => {
         const ast = parse(fixture, {
             filename: path.basename(fixtureFilename),
             positions: true
@@ -68,4 +68,25 @@ describe('Common', () => {
             });
         });
     });
+
+    it('generic option should work in fork()', () => {
+        const forkWithoutGeneric = fork({
+            // By default, generic is true, but we disable it
+            generic: false
+        });
+
+        const forkWithGeneric = fork({
+            // By default, generic is true
+        });
+
+        // Generic should be set
+        assert.strictEqual(forkWithoutGeneric.lexer.generic, false);
+        assert.strictEqual(forkWithGeneric.lexer.generic, true);
+
+        // Lexer match should depend on generic (<length> is generic type)
+        const node = parse('1px', { context: 'value' });
+
+        assert.throws(() => forkWithoutGeneric.lexer.match('<length>', node));
+        assert.doesNotThrow(() => forkWithGeneric.lexer.match('<length>', node));
+    });
 });
diff -pruN 2.3.1-1/lib/__tests/definition-syntax-generate.js 3.1.0-1/lib/__tests/definition-syntax-generate.js
--- 2.3.1-1/lib/__tests/definition-syntax-generate.js	2022-12-14 17:31:12.000000000 +0000
+++ 3.1.0-1/lib/__tests/definition-syntax-generate.js	2024-12-06 17:25:18.000000000 +0000
@@ -69,7 +69,11 @@ describe('definitionSyntax.generate()',
 
                     it(test.name, () => {
                         const actual = generate(parse(test.syntax)).replace(/\s+,/g, ',');
-                        const expected = test.syntax.replace(/\s+,/g, ',');
+                        const expected = test.syntax
+                            .replace(/\s+,/g, ',')
+                            .replace(/\{\s+(?=\d)/g, '{')
+                            .replace(/(?<=\d)\s+}/g, '}')
+                            .replace(/,\s+(\d+)}/g, ',$1}');
 
                         assert.strictEqual(actual, expected);
                     });
diff -pruN 2.3.1-1/lib/__tests/definition-syntax-match.js 3.1.0-1/lib/__tests/definition-syntax-match.js
--- 2.3.1-1/lib/__tests/definition-syntax-match.js	2022-12-14 17:31:12.000000000 +0000
+++ 3.1.0-1/lib/__tests/definition-syntax-match.js	2024-12-06 17:25:18.000000000 +0000
@@ -7,16 +7,31 @@ import { buildMatchGraph } from '../lexe
 import { matchAsList, matchAsTree } from '../lexer/match.js';
 import * as fixture from './fixture/definition-syntax-match.js';
 
-const defaultTypes = Object.create(null);
-const defaultProperties = Object.create(null);
 const genericSyntaxes = createGenericTypes(units);
+let defaultSyntax = null;
 
-for (const [name, def] of Object.entries(lexer.types)) {
-    defaultTypes[name] = def.match;
-}
+function getDefaultSyntax() {
+    if (defaultSyntax === null) {
+        const defaultTypes = Object.create(null);
+        const defaultProperties = Object.create(null);
+
+        it('create default syntax', () => {
+            for (const [name, def] of Object.entries(lexer.types)) {
+                defaultTypes[name] = def.match;
+            }
+
+            for (const [name, def] of Object.entries(lexer.properties)) {
+                defaultProperties[name] = def.match;
+            }
+        });
+
+        defaultSyntax = {
+            types: defaultTypes,
+            properties: defaultProperties
+        };
+    }
 
-for (const [name, def] of Object.entries(lexer.properties)) {
-    defaultProperties[name] = def.match;
+    return defaultSyntax;
 }
 
 function processMatchResult(mr) {
@@ -45,22 +60,22 @@ function createSyntaxTest(testName, test
     const syntax = test.syntax || testName;
     const matchTree = buildMatchGraph(syntax);
     const syntaxes = test.defaultSyntaxes
-        ? { types: { ...defaultTypes }, properties: { ...defaultProperties} }
+        ? getDefaultSyntax()
         : { types: {}, properties: {} };
 
-    for (const name in genericSyntaxes) {
+    for (const name of Object.keys(genericSyntaxes)) {
         syntaxes.types[name] = {
             match: buildMatchGraph(genericSyntaxes[name])
         };
     }
 
-    for (const name in test.types) {
+    for (const name of Object.keys(test.types || {})) {
         syntaxes.types[name] = {
             match: buildMatchGraph(test.types[name])
         };
     }
 
-    for (const name in test.properties) {
+    for (const name of Object.keys(test.properties || {})) {
         syntaxes.properties[name] = {
             match: buildMatchGraph(test.properties[name])
         };
diff -pruN 2.3.1-1/lib/__tests/definition-syntax-parse.js 3.1.0-1/lib/__tests/definition-syntax-parse.js
--- 2.3.1-1/lib/__tests/definition-syntax-parse.js	2022-12-14 17:31:12.000000000 +0000
+++ 3.1.0-1/lib/__tests/definition-syntax-parse.js	2024-12-06 17:25:18.000000000 +0000
@@ -42,9 +42,9 @@ describe('definitionSyntax.parse()', ()
         describe('expected a number', () => {
             const tests = [
                 '<x>{}',
+                '<x>{ }',
                 '<x>{,2}',
-                '<x>{ 2}',
-                '<x>{1, }'
+                '<x>{ ,2}'
             ];
 
             for (const test of tests) {
diff -pruN 2.3.1-1/lib/__tests/exports.js 3.1.0-1/lib/__tests/exports.js
--- 2.3.1-1/lib/__tests/exports.js	2022-12-14 17:31:12.000000000 +0000
+++ 3.1.0-1/lib/__tests/exports.js	2024-12-06 17:25:18.000000000 +0000
@@ -98,7 +98,11 @@ describe('exports / entry points', () =>
         // collect all the selectors
         csstree.walk(expectedAst, function(node) {
             if (node.type === 'SelectorList' || node.type === 'Selector') {
-                selectors.push({ css: csstree.generate(node), expected: node });
+                selectors.push({
+                    css: csstree.generate(node),
+                    context: node.type === 'SelectorList' ? 'selectorList' : 'selector',
+                    expected: node
+                });
 
                 return csstree.walk.skip;
             }
@@ -106,7 +110,7 @@ describe('exports / entry points', () =>
 
         for (const test of selectors) {
             it(test.css, () => {
-                const ast = parseSelector(test.css);
+                const ast = parseSelector(test.css, { context: test.context });
                 assert.strictEqual(stringifyWithNoInfo(ast), stringifyWithNoInfo(test.expected));
             });
         }
diff -pruN 2.3.1-1/lib/__tests/fixture/ast.js 3.1.0-1/lib/__tests/fixture/ast.js
--- 2.3.1-1/lib/__tests/fixture/ast.js	2022-12-14 17:31:12.000000000 +0000
+++ 3.1.0-1/lib/__tests/fixture/ast.js	2024-12-06 17:25:18.000000000 +0000
@@ -10,7 +10,9 @@ const wrapper = {
     }),
     mediaQuery: ast => ({
         type: 'MediaQuery',
-        children: [ast]
+        modifier: null,
+        mediaType: null,
+        condition: ast
     }),
     rule: ast => ({
         type: 'Rule',
@@ -103,6 +105,10 @@ function readTestDir(dir, result, scope)
                 return readTestDir(filename, result, scope);
             }
 
+            if (path.extname(filename) !== '.json') {
+                return;
+            }
+
             const locator = new JsonLocator(filename);
             const origTests = JSON.parse(fs.readFileSync(filename));
             const tests = {};
diff -pruN 2.3.1-1/lib/__tests/fixture/definition-syntax-match.js 3.1.0-1/lib/__tests/fixture/definition-syntax-match.js
--- 2.3.1-1/lib/__tests/fixture/definition-syntax-match.js	2022-12-14 17:31:12.000000000 +0000
+++ 3.1.0-1/lib/__tests/fixture/definition-syntax-match.js	2024-12-06 17:25:18.000000000 +0000
@@ -5,11 +5,9 @@ import { JsonLocator } from '../helpers/
 const __dirname = 'fixtures/definition-syntax-match';
 
 export function forEachTest(factory) {
-    for (const filename in tests) {
-        const file = tests[filename];
-
-        for (const key in file) {
-            factory(key, file[key]);
+    for (const file of Object.values(tests)) {
+        for (const [key, test] of Object.entries(file)) {
+            factory(key, test);
         }
     };
 }
diff -pruN 2.3.1-1/lib/__tests/fixture/definition-syntax.js 3.1.0-1/lib/__tests/fixture/definition-syntax.js
--- 2.3.1-1/lib/__tests/fixture/definition-syntax.js	2022-12-14 17:31:12.000000000 +0000
+++ 3.1.0-1/lib/__tests/fixture/definition-syntax.js	2024-12-06 17:25:18.000000000 +0000
@@ -6,11 +6,8 @@ import { JsonLocator } from '../helpers/
 const __dirname = 'fixtures/definition-syntax';
 
 export function forEachTest(factory) {
-    for (const filename in tests) {
-        const file = tests[filename];
-
-        for (const key in file) {
-            const test = file[key];
+    for (const file of Object.values(tests)) {
+        for (const test of Object.values(file)) {
             const syntax = test.syntax;
             const lexer = test.lexer ? createLexer(test.lexer) : defaultLexer;
 
@@ -36,9 +33,7 @@ export function forEachTest(factory) {
 }
 
 export function forEachAtrulePreludeTest(factory) {
-    for (const atruleName in atruleTests) {
-        const testset = atruleTests[atruleName];
-
+    for (const [atruleName, testset] of Object.entries(atruleTests)) {
         if (testset.prelude) {
             const test = testset.prelude;
             for (const field in test) {
@@ -62,13 +57,10 @@ export function forEachAtrulePreludeTest
 }
 
 export function forEachAtruleDescriptorTest(factory) {
-    for (const atruleName in atruleTests) {
-        const testset = atruleTests[atruleName];
-
+    for (const [atruleName, testset] of Object.entries(atruleTests)) {
         if (testset.descriptors) {
-            for (const descriptorName in testset.descriptors) {
-                const test = testset.descriptors[descriptorName];
-                for (const field in test) {
+            for (const [descriptorName, test] of Object.entries(testset.descriptors)) {
+                for (const field of Object.keys(test)) {
                     if (field !== 'valid' && field !== 'invalid') {
                         continue;
                     }
diff -pruN 2.3.1-1/lib/__tests/fixture/tokenize.js 3.1.0-1/lib/__tests/fixture/tokenize.js
--- 2.3.1-1/lib/__tests/fixture/tokenize.js	2022-12-14 17:31:12.000000000 +0000
+++ 3.1.0-1/lib/__tests/fixture/tokenize.js	2024-12-06 17:25:18.000000000 +0000
@@ -20,9 +20,7 @@ function processTests(tests, key, type,
 }
 
 export function forEachTest(testType, factory) {
-    for (const filename in tests) {
-        const file = tests[filename];
-
+    for (const file of Object.values(tests)) {
         Object.keys(file[testType]).forEach(key => factory(
             file[testType][key].name,
             file[testType][key].value,
diff -pruN 2.3.1-1/lib/__tests/generate.js 3.1.0-1/lib/__tests/generate.js
--- 2.3.1-1/lib/__tests/generate.js	2022-12-14 17:31:12.000000000 +0000
+++ 3.1.0-1/lib/__tests/generate.js	2024-12-06 17:25:18.000000000 +0000
@@ -22,9 +22,7 @@ function createGenerateTests(name, test)
         assert.strictEqual(actual, expected);
     });
 
-    // FIXME: Skip some test cases for round-trip check until generator's improvements
-    const skipRoundTrip = test.skip || /block at-rule #c\.2|atruler\.c\.2|parentheses\.c\.3/.test(name);
-    (skipRoundTrip ? it.skip : it)(name + ' (round-trip)', () => {
+    (test.skip || test.skipRoundtrip ? it.skip : it)(name + ' (round-trip)', () => {
         const expected = parse(test.source, test.options);
         const actual = parse(generate(expected), test.options);
 
diff -pruN 2.3.1-1/lib/__tests/helpers/lib.js 3.1.0-1/lib/__tests/helpers/lib.js
--- 2.3.1-1/lib/__tests/helpers/lib.js	2022-12-14 17:31:12.000000000 +0000
+++ 3.1.0-1/lib/__tests/helpers/lib.js	1970-01-01 00:00:00.000000000 +0000
@@ -1,19 +0,0 @@
-import chalk from 'chalk';
-const libPaths = {
-    'src': 'lib/index.js'
-    // 'dist': 'dist/csstree.js',
-    // 'dist-min': 'dist/csstree.min.js'
-};
-const mode = process.env.MODE || 'src';
-const libPath = libPaths[mode];
-const postfix = '';
-
-if (!libPaths.hasOwnProperty(mode)) {
-    console.error(`Mode ${chalk.white.bgRed(mode)} is not supported!\n`);
-    process.exit(1);
-}
-
-console.info('Test lib entry:', chalk.yellow(libPath + postfix));
-
-// module.exports = require('../../' + libPath);
-export * from '../../index.js';
diff -pruN 2.3.1-1/lib/__tests/helpers/setup.js 3.1.0-1/lib/__tests/helpers/setup.js
--- 2.3.1-1/lib/__tests/helpers/setup.js	1970-01-01 00:00:00.000000000 +0000
+++ 3.1.0-1/lib/__tests/helpers/setup.js	2024-12-06 17:25:18.000000000 +0000
@@ -0,0 +1,8 @@
+// Guard to mitigate the risk of reading non-own properties,
+// which can be a potential issue when working with dictionaries
+Object.defineProperty(Object.prototype, '__proto_pollute__', {
+    enumerable: true,
+    get() {
+        throw new Error('Attempted to read a non-own property');
+    }
+});
diff -pruN 2.3.1-1/lib/__tests/lexer-match-property.js 3.1.0-1/lib/__tests/lexer-match-property.js
--- 2.3.1-1/lib/__tests/lexer-match-property.js	2022-12-14 17:31:12.000000000 +0000
+++ 3.1.0-1/lib/__tests/lexer-match-property.js	2024-12-06 17:25:18.000000000 +0000
@@ -3,16 +3,17 @@ import { parse, lexer, fork } from 'css-
 import { lazyValues, cssWideKeywords } from './helpers/index.js';
 import { forEachTest } from './fixture/definition-syntax.js';
 
-const values = lazyValues({
+const lazy = lazyValues({
     bar: () => parse('bar', { context: 'value' }),
     qux: () => parse('qux', { context: 'value' }),
-    customSyntax: () => fork(function(prev, assign) {
-        return assign(prev, {
-            properties: {
-                foo: 'bar',
-                '-baz-foo': 'qux'
-            }
-        });
+    customSyntax: () => fork({
+        properties: {
+            foo: 'bar',
+            '-baz-foo': 'qux'
+        }
+    }),
+    customCssWideKeywords: () => fork({
+        cssWideKeywords: ['test']
     })
 });
 
@@ -25,21 +26,21 @@ function getMatch(lexer, property, value
 describe('Lexer#matchProperty()', () => {
     describe('vendor prefixes and hacks', () => {
         it('vendor prefix', () => {
-            const match = values.customSyntax.lexer.matchProperty('-vendor-foo', values.bar);
+            const match = lazy.customSyntax.lexer.matchProperty('-vendor-foo', lazy.bar);
 
             assert(match.matched);
             assert.strictEqual(match.error, null);
         });
 
         it('hacks', () => {
-            const match = values.customSyntax.lexer.matchProperty('_foo', values.bar);
+            const match = lazy.customSyntax.lexer.matchProperty('_foo', lazy.bar);
 
             assert(match.matched);
             assert.strictEqual(match.error, null);
         });
 
         it('vendor prefix and hack', () => {
-            const match = values.customSyntax.lexer.matchProperty('_-vendor-foo', values.bar);
+            const match = lazy.customSyntax.lexer.matchProperty('_-vendor-foo', lazy.bar);
 
             assert(match.matched);
             assert.strictEqual(match.error, null);
@@ -48,19 +49,19 @@ describe('Lexer#matchProperty()', () =>
         it('case insensetive with vendor prefix and hack', () => {
             let match;
 
-            match = values.customSyntax.lexer.matchProperty('FOO', values.bar);
+            match = lazy.customSyntax.lexer.matchProperty('FOO', lazy.bar);
             assert(match.matched);
             assert.strictEqual(match.error, null);
 
-            match = values.customSyntax.lexer.matchProperty('-VENDOR-Foo', values.bar);
+            match = lazy.customSyntax.lexer.matchProperty('-VENDOR-Foo', lazy.bar);
             assert(match.matched);
             assert.strictEqual(match.error, null);
 
-            match = values.customSyntax.lexer.matchProperty('_FOO', values.bar);
+            match = lazy.customSyntax.lexer.matchProperty('_FOO', lazy.bar);
             assert(match.matched);
             assert.strictEqual(match.error, null);
 
-            match = values.customSyntax.lexer.matchProperty('_-VENDOR-Foo', values.bar);
+            match = lazy.customSyntax.lexer.matchProperty('_-VENDOR-Foo', lazy.bar);
             assert(match.matched);
             assert.strictEqual(match.error, null);
         });
@@ -68,18 +69,18 @@ describe('Lexer#matchProperty()', () =>
         it('should use verdor version first', () => {
             let match;
 
-            match = values.customSyntax.lexer.matchProperty('-baz-foo', values.qux);
+            match = lazy.customSyntax.lexer.matchProperty('-baz-foo', lazy.qux);
             assert(match.matched);
             assert.strictEqual(match.error, null);
 
-            match = values.customSyntax.lexer.matchProperty('-baz-baz-foo', values.qux);
+            match = lazy.customSyntax.lexer.matchProperty('-baz-baz-foo', lazy.qux);
             assert.strictEqual(match.matched, null);
             assert.strictEqual(match.error.message, 'Unknown property `-baz-baz-foo`');
         });
     });
 
     it('custom property', () => {
-        const match = lexer.matchProperty('--foo', values.bar);
+        const match = lexer.matchProperty('--foo', lazy.bar);
 
         assert.strictEqual(match.matched, null);
         assert.strictEqual(match.error.message, 'Lexer matching doesn\'t applicable for custom properties');
@@ -87,12 +88,19 @@ describe('Lexer#matchProperty()', () =>
 
     describe('should match css wide keywords', function() {
         for (const keyword of cssWideKeywords) {
-            it(keyword, () => {
-                const match = lexer.matchProperty('color', parse(keyword, { context: 'value' }));
+            const match = lexer.matchProperty('color', keyword);
+
+            assert(match.matched);
+            assert.strictEqual(match.error, null);
+        }
+    });
+
+    it('should match css wide keywords', function() {
+        for (const keyword of cssWideKeywords.concat('test')) {
+            const match = lazy.customCssWideKeywords.lexer.matchProperty('color', keyword);
 
-                assert(match.matched);
-                assert.strictEqual(match.error, null);
-            });
+            assert(match.matched, keyword);
+            assert.strictEqual(match.error, null, keyword);
         }
     });
 
diff -pruN 2.3.1-1/lib/__tests/lexer-match-result.js 3.1.0-1/lib/__tests/lexer-match-result.js
--- 2.3.1-1/lib/__tests/lexer-match-result.js	2022-12-14 17:31:12.000000000 +0000
+++ 3.1.0-1/lib/__tests/lexer-match-result.js	2024-12-06 17:25:18.000000000 +0000
@@ -19,6 +19,8 @@ describe('lexer match result', () => {
             { type: 'Type', opts: null, name: 'final-bg-layer' },
             { type: 'Property', name: 'background-color' },
             { type: 'Type', opts: null, name: 'color' },
+            { type: 'Type', opts: null, name: 'color-base' },
+            { type: 'Type', opts: null, name: 'color-function' },
             { type: 'Type', opts: null, name: 'rgb()' },
             { type: 'Type', opts: null, name: 'number' }
         ]);
diff -pruN 2.3.1-1/lib/__tests/lexer.js 3.1.0-1/lib/__tests/lexer.js
--- 2.3.1-1/lib/__tests/lexer.js	2022-12-14 17:31:12.000000000 +0000
+++ 3.1.0-1/lib/__tests/lexer.js	2024-12-06 17:25:18.000000000 +0000
@@ -41,6 +41,10 @@ describe('lexer', () => {
         });
 
         assert.deepStrictEqual(customLexer.validate(), {
+            errors: [
+                '<invalid> used missed syntax definition <foo>',
+                '<\'invalid\'> used broken syntax definition <invalid>'
+            ],
             types: [
                 'invalid'
             ],
@@ -77,6 +81,20 @@ describe('lexer', () => {
         assert.deepStrictEqual(Object.keys(customLexer.units), Object.keys(lexer.units));
     });
 
+    it('should allow to override CSS wide keywords', () => {
+        const customLexer = createLexer({
+            cssWideKeywords: ['foo', 'bar'],
+            generic: true,
+            properties: {
+                test: '<number>'
+            }
+        });
+
+        assert.notStrictEqual(customLexer.matchProperty('test', 'foo').matched, null);
+        assert.notStrictEqual(customLexer.matchProperty('test', 'bar').matched, null);
+        assert.strictEqual(customLexer.matchProperty('test', 'inherit').matched, null);
+    });
+
     describe('should allow append definitions', function() {
         const customSyntax = fork({
             properties: {
@@ -110,6 +128,7 @@ describe('lexer', () => {
     describe('dump & recovery', () => {
         const customLexer = createLexer({
             generic: true,
+            cssWideKeywords: ['wide'],
             units: {
                 length: ['aa', 'bb']
             },
@@ -124,6 +143,7 @@ describe('lexer', () => {
         it('custom syntax should not affect base syntax', () => {
             assert.strictEqual(lexer.validate(), null);
             assert.strictEqual(lexer.matchProperty('test', '1 2aa 3').matched, null);
+            assert.strictEqual(lexer.matchProperty('test', 'wide').matched, null);
             assert.notStrictEqual(lexer.matchProperty('color', 'red').matched, null);
         });
 
@@ -133,6 +153,7 @@ describe('lexer', () => {
 
         it('custom syntax should match own grammar only', () => {
             assert.notStrictEqual(customLexer.matchProperty('test', '1 2aa 3').matched, null);
+            assert.notStrictEqual(customLexer.matchProperty('test', 'wide').matched, null);
             assert.strictEqual(customLexer.matchProperty('color', 'red').matched, null);
         });
 
@@ -144,6 +165,7 @@ describe('lexer', () => {
 
             assert.strictEqual(recoverySyntax.lexer.validate(), null);
             assert.notStrictEqual(recoverySyntax.lexer.matchProperty('test', '1 2aa 3').matched, null);
+            assert.notStrictEqual(recoverySyntax.lexer.matchProperty('test', 'wide').matched, null);
         });
     });
 });
diff -pruN 2.3.1-1/lib/__tests/parse.js 3.1.0-1/lib/__tests/parse.js
--- 2.3.1-1/lib/__tests/parse.js	2022-12-14 17:31:12.000000000 +0000
+++ 3.1.0-1/lib/__tests/parse.js	2024-12-06 17:25:18.000000000 +0000
@@ -60,13 +60,15 @@ describe('parse', () => {
                 });
             });
 
-            fixture.invalid.forEach(value =>
-                it(value, () =>
-                    assert.throws(
-                        () => parse(':nth-child(' + value + ')', { context: 'selector' })
+            fixture.invalid
+                .filter(value => value !== '')
+                .forEach(value =>
+                    it(value, () =>
+                        assert.throws(
+                            () => parse(':nth-child(' + value + ')', { context: 'selector' })
+                        )
                     )
-                )
-            );
+                );
         });
 
         describe('UnicodeRange', () => {
@@ -145,7 +147,7 @@ describe('parse', () => {
 
     it('should call onParseError when handler is passed', () => {
         const errors = [];
-        const ast = parse('{ a: 1!; foo; b: 2 }', {
+        const ast = parse('{a: 1!; foo; b: 2}', {
             context: 'block',
             onParseError: (error, fallbackNode) => errors.push({ error, fallbackNode })
         });
@@ -282,6 +284,35 @@ describe('parse', () => {
 
                     return true;
                 }
+            );
+        });
+
+        it('with custom offset/line/column', () => {
+            assert.throws(
+                () => parse(
+                    '#.classname\n\n\n',
+                    { context: 'selector', positions: true, offset: 10, line: 10, column: 10 }
+                ),
+                (e) => {
+                    assert.strictEqual(e.formattedMessage,
+                        'Parse error: Name is expected\n' +
+                        '   10 |         #.classname\n' +
+                        '-----------------^'
+                    );
+                    assert.deepStrictEqual({
+                        source: '#.classname\n\n\n',
+                        offset: 11,
+                        line: 10,
+                        column: 11
+                    }, {
+                        source: e.source,
+                        offset: e.offset,
+                        line: e.line,
+                        column: e.column
+                    });
+
+                    return true;
+                }
             );
         });
     });
diff -pruN 2.3.1-1/lib/__tests/tokenizer.js 3.1.0-1/lib/__tests/tokenizer.js
--- 2.3.1-1/lib/__tests/tokenizer.js	2022-12-14 17:31:12.000000000 +0000
+++ 3.1.0-1/lib/__tests/tokenizer.js	2024-12-06 17:25:18.000000000 +0000
@@ -6,9 +6,9 @@ describe('tokenize/stream', () => {
     const createStream = source => new TokenStream(source, tokenize);
     const css = '.test\n{\n  prop: url(foo/bar.jpg) url( a\\(\\33 \\).\\ \\"\\\'test ) calc(1 + 1) \\x \\aa ;\n}<!--<-->\\\n';
     const tokens = [
-        { type: 'delim-token', chunk: '.', balance: 93 },
-        { type: 'ident-token', chunk: 'test', balance: 93 },
-        { type: 'whitespace-token', chunk: '\n', balance: 93 },
+        { type: 'delim-token', chunk: '.', balance: 31 },
+        { type: 'ident-token', chunk: 'test', balance: 31 },
+        { type: 'whitespace-token', chunk: '\n', balance: 31 },
         { type: '{-token', chunk: '{', balance: 25 },
         { type: 'whitespace-token', chunk: '\n  ', balance: 25 },
         { type: 'ident-token', chunk: 'prop', balance: 25 },
@@ -32,11 +32,11 @@ describe('tokenize/stream', () => {
         { type: 'semicolon-token', chunk: ';', balance: 25 },
         { type: 'whitespace-token', chunk: '\n', balance: 25 },
         { type: '}-token', chunk: '}', balance: 3 },
-        { type: 'CDO-token', chunk: '<!--', balance: 93 },
-        { type: 'delim-token', chunk: '<', balance: 93 },
-        { type: 'CDC-token', chunk: '-->', balance: 93 },
-        { type: 'delim-token', chunk: '\\', balance: 93 },
-        { type: 'whitespace-token', chunk: '\n', balance: 93 }
+        { type: 'CDO-token', chunk: '<!--', balance: 31 },
+        { type: 'delim-token', chunk: '<', balance: 31 },
+        { type: 'CDC-token', chunk: '-->', balance: 31 },
+        { type: 'delim-token', chunk: '\\', balance: 31 },
+        { type: 'whitespace-token', chunk: '\n', balance: 31 }
     ];
     const dump = tokens.map(({ type, chunk, balance }, idx) => ({
         idx,
diff -pruN 2.3.1-1/lib/__tests/walk.js 3.1.0-1/lib/__tests/walk.js
--- 2.3.1-1/lib/__tests/walk.js	2022-12-14 17:31:12.000000000 +0000
+++ 3.1.0-1/lib/__tests/walk.js	2024-12-06 17:25:18.000000000 +0000
@@ -102,10 +102,11 @@ describe('AST traversal', () => {
             'AtrulePrelude',
             'Block',
             'ClassSelector',
+            'Condition',
             'Declaration',
             'Dimension',
+            'Feature',
             'Function',
-            'MediaFeature',
             'MediaQuery',
             'MediaQueryList',
             'Nth',
@@ -168,8 +169,10 @@ describe('AST traversal', () => {
 
             walk(values.ast, {
                 enter(node) {
-                    if (node.name || node.property) {
-                        visitedNames.push(node.name || node.property);
+                    const ref = node.name || node.property || node.mediaType;
+
+                    if (ref) {
+                        visitedNames.push(ref);
                     }
                 }
             });
@@ -187,8 +190,10 @@ describe('AST traversal', () => {
             walk(values.ast, {
                 reverse: true,
                 enter(node) {
-                    if (node.name || node.property) {
-                        visitedNames.push(node.name || node.property);
+                    const ref = node.name || node.property || node.mediaType;
+
+                    if (ref) {
+                        visitedNames.push(ref);
                     }
                 }
             });
@@ -561,7 +566,7 @@ describe('AST traversal', () => {
         it('should throws when visit has wrong value', () => {
             assert.throws(
                 () => walk(ast, { visit: 'Foo' }),
-                /Bad value `Foo` for `visit` option \(should be: AnPlusB, Atrule, AtrulePrelude, AttributeSelector, Block, Brackets, CDC, CDO, ClassSelector, Combinator, Comment, Declaration, DeclarationList, Dimension, Function, Hash, IdSelector, Identifier, MediaFeature, MediaQuery, MediaQueryList, NestingSelector, Nth, Number, Operator, Parentheses, Percentage, PseudoClassSelector, PseudoElementSelector, Ratio, Raw, Rule, Selector, SelectorList, String, StyleSheet, TypeSelector, UnicodeRange, Url, Value, WhiteSpace\)/
+                /Bad value `Foo` for `visit` option/
             );
         });
     });
diff -pruN 2.3.1-1/lib/data.js 3.1.0-1/lib/data.js
--- 2.3.1-1/lib/data.js	2022-12-14 17:31:12.000000000 +0000
+++ 3.1.0-1/lib/data.js	2024-12-06 17:25:18.000000000 +0000
@@ -6,20 +6,20 @@ const mdnAtrules = require('mdn-data/css
 const mdnProperties = require('mdn-data/css/properties.json');
 const mdnSyntaxes = require('mdn-data/css/syntaxes.json');
 
+const hasOwn = Object.hasOwn || ((object, property) => Object.prototype.hasOwnProperty.call(object, property));
 const extendSyntax = /^\s*\|\s*/;
 
 function preprocessAtrules(dict) {
     const result = Object.create(null);
 
-    for (const atruleName in dict) {
-        const atrule = dict[atruleName];
+    for (const [atruleName, atrule] of Object.entries(dict)) {
         let descriptors = null;
 
         if (atrule.descriptors) {
             descriptors = Object.create(null);
 
-            for (const descriptor in atrule.descriptors) {
-                descriptors[descriptor] = atrule.descriptors[descriptor].syntax;
+            for (const [name, descriptor] of Object.entries(atrule.descriptors)) {
+                descriptors[name] = descriptor.syntax;
             }
         }
 
@@ -33,16 +33,18 @@ function preprocessAtrules(dict) {
 }
 
 function patchDictionary(dict, patchDict) {
-    const result = {};
+    const result = Object.create(null);
 
     // copy all syntaxes for an original dict
-    for (const key in dict) {
-        result[key] = dict[key].syntax || dict[key];
+    for (const [key, value] of Object.entries(dict)) {
+        if (value) {
+            result[key] = value.syntax || value;
+        }
     }
 
     // apply a patch
-    for (const key in patchDict) {
-        if (key in dict) {
+    for (const key of Object.keys(patchDict)) {
+        if (hasOwn(dict, key)) {
             if (patchDict[key].syntax) {
                 result[key] = extendSyntax.test(patchDict[key].syntax)
                     ? result[key] + ' ' + patchDict[key].syntax.trim()
@@ -60,29 +62,48 @@ function patchDictionary(dict, patchDict
     return result;
 }
 
+function preprocessPatchAtrulesDescritors(declarations) {
+    const result = {};
+
+    for (const [key, value] of Object.entries(declarations || {})) {
+        result[key] = typeof value === 'string'
+            ? { syntax: value }
+            : value;
+    }
+
+    return result;
+}
+
 function patchAtrules(dict, patchDict) {
     const result = {};
 
     // copy all syntaxes for an original dict
     for (const key in dict) {
+        if (patchDict[key] === null) {
+            continue;
+        }
+
         const atrulePatch = patchDict[key] || {};
 
         result[key] = {
             prelude: key in patchDict && 'prelude' in atrulePatch
                 ? atrulePatch.prelude
                 : dict[key].prelude || null,
-            descriptors: patchDictionary(dict[key].descriptors || {}, atrulePatch.descriptors || {})
+            descriptors: patchDictionary(
+                dict[key].descriptors || {},
+                preprocessPatchAtrulesDescritors(atrulePatch.descriptors)
+            )
         };
     }
 
     // apply a patch
-    for (const key in patchDict) {
-        if (!hasOwnProperty.call(dict, key)) {
-            const atrulePatch = patchDict[key] || {};
-
+    for (const [key, atrulePatch] of Object.entries(patchDict)) {
+        if (atrulePatch && !hasOwn(dict, key)) {
             result[key] = {
                 prelude: atrulePatch.prelude || null,
-                descriptors: atrulePatch.descriptors && patchDictionary({}, atrulePatch.descriptors)
+                descriptors: atrulePatch.descriptors
+                    ? patchDictionary({}, preprocessPatchAtrulesDescritors(atrulePatch.descriptors))
+                    : null
             };
         }
     }
diff -pruN 2.3.1-1/lib/definition-syntax/generate.js 3.1.0-1/lib/definition-syntax/generate.js
--- 2.3.1-1/lib/definition-syntax/generate.js	2022-12-14 17:31:12.000000000 +0000
+++ 3.1.0-1/lib/definition-syntax/generate.js	2024-12-06 17:25:18.000000000 +0000
@@ -76,6 +76,10 @@ function internalGenerate(node, decorate
                 decorate(generateMultiplier(node), node)
             );
 
+        case 'Boolean':
+            result = '<boolean-expr[' + internalGenerate(node.term, decorate, forceBraces, compact) + ']>';
+            break;
+
         case 'Type':
             result = '<' + node.name + (node.opts ? decorate(generateTypeOpts(node.opts), node.opts) : '') + '>';
             break;
diff -pruN 2.3.1-1/lib/definition-syntax/parse.js 3.1.0-1/lib/definition-syntax/parse.js
--- 2.3.1-1/lib/definition-syntax/parse.js	2022-12-14 17:31:12.000000000 +0000
+++ 3.1.0-1/lib/definition-syntax/parse.js	2024-12-06 17:25:18.000000000 +0000
@@ -1,4 +1,4 @@
-import { Tokenizer } from './tokenizer.js';
+import { Scanner } from './scanner.js';
 
 const TAB = 9;
 const N = 10;
@@ -25,9 +25,6 @@ const LEFTCURLYBRACKET = 123;  // {
 const VERTICALLINE = 124;      // |
 const RIGHTCURLYBRACKET = 125; // }
 const INFINITY = 8734;         // ∞
-const NAME_CHAR = new Uint8Array(128).map((_, idx) =>
-    /[a-zA-Z0-9\-]/.test(String.fromCharCode(idx)) ? 1 : 0
-);
 const COMBINATOR_PRECEDENCE = {
     ' ': 1,
     '&&': 2,
@@ -35,75 +32,29 @@ const COMBINATOR_PRECEDENCE = {
     '|': 4
 };
 
-function scanSpaces(tokenizer) {
-    return tokenizer.substringToPos(
-        tokenizer.findWsEnd(tokenizer.pos)
-    );
-}
-
-function scanWord(tokenizer) {
-    let end = tokenizer.pos;
-
-    for (; end < tokenizer.str.length; end++) {
-        const code = tokenizer.str.charCodeAt(end);
-        if (code >= 128 || NAME_CHAR[code] === 0) {
-            break;
-        }
-    }
-
-    if (tokenizer.pos === end) {
-        tokenizer.error('Expect a keyword');
-    }
-
-    return tokenizer.substringToPos(end);
-}
-
-function scanNumber(tokenizer) {
-    let end = tokenizer.pos;
-
-    for (; end < tokenizer.str.length; end++) {
-        const code = tokenizer.str.charCodeAt(end);
-        if (code < 48 || code > 57) {
-            break;
-        }
-    }
-
-    if (tokenizer.pos === end) {
-        tokenizer.error('Expect a number');
-    }
-
-    return tokenizer.substringToPos(end);
-}
-
-function scanString(tokenizer) {
-    const end = tokenizer.str.indexOf('\'', tokenizer.pos + 1);
-
-    if (end === -1) {
-        tokenizer.pos = tokenizer.str.length;
-        tokenizer.error('Expect an apostrophe');
-    }
-
-    return tokenizer.substringToPos(end + 1);
-}
-
-function readMultiplierRange(tokenizer) {
+function readMultiplierRange(scanner) {
     let min = null;
     let max = null;
 
-    tokenizer.eat(LEFTCURLYBRACKET);
+    scanner.eat(LEFTCURLYBRACKET);
+    scanner.skipWs();
 
-    min = scanNumber(tokenizer);
+    min = scanner.scanNumber(scanner);
+    scanner.skipWs();
 
-    if (tokenizer.charCode() === COMMA) {
-        tokenizer.pos++;
-        if (tokenizer.charCode() !== RIGHTCURLYBRACKET) {
-            max = scanNumber(tokenizer);
+    if (scanner.charCode() === COMMA) {
+        scanner.pos++;
+        scanner.skipWs();
+
+        if (scanner.charCode() !== RIGHTCURLYBRACKET) {
+            max = scanner.scanNumber(scanner);
+            scanner.skipWs();
         }
     } else {
         max = min;
     }
 
-    tokenizer.eat(RIGHTCURLYBRACKET);
+    scanner.eat(RIGHTCURLYBRACKET);
 
     return {
         min: Number(min),
@@ -111,13 +62,13 @@ function readMultiplierRange(tokenizer)
     };
 }
 
-function readMultiplier(tokenizer) {
+function readMultiplier(scanner) {
     let range = null;
     let comma = false;
 
-    switch (tokenizer.charCode()) {
+    switch (scanner.charCode()) {
         case ASTERISK:
-            tokenizer.pos++;
+            scanner.pos++;
 
             range = {
                 min: 0,
@@ -127,7 +78,7 @@ function readMultiplier(tokenizer) {
             break;
 
         case PLUSSIGN:
-            tokenizer.pos++;
+            scanner.pos++;
 
             range = {
                 min: 1,
@@ -137,7 +88,7 @@ function readMultiplier(tokenizer) {
             break;
 
         case QUESTIONMARK:
-            tokenizer.pos++;
+            scanner.pos++;
 
             range = {
                 min: 0,
@@ -147,18 +98,18 @@ function readMultiplier(tokenizer) {
             break;
 
         case NUMBERSIGN:
-            tokenizer.pos++;
+            scanner.pos++;
 
             comma = true;
 
-            if (tokenizer.charCode() === LEFTCURLYBRACKET) {
-                range = readMultiplierRange(tokenizer);
-            } else if (tokenizer.charCode() === QUESTIONMARK) {
+            if (scanner.charCode() === LEFTCURLYBRACKET) {
+                range = readMultiplierRange(scanner);
+            } else if (scanner.charCode() === QUESTIONMARK) {
                 // https://www.w3.org/TR/css-values-4/#component-multipliers
                 // > the # and ? multipliers may be stacked as #?
                 // In this case just treat "#?" as a single multiplier
                 // { min: 0, max: 0, comma: true }
-                tokenizer.pos++;
+                scanner.pos++;
                 range = {
                     min: 0,
                     max: 0
@@ -173,7 +124,7 @@ function readMultiplier(tokenizer) {
             break;
 
         case LEFTCURLYBRACKET:
-            range = readMultiplierRange(tokenizer);
+            range = readMultiplierRange(scanner);
             break;
 
         default:
@@ -189,8 +140,8 @@ function readMultiplier(tokenizer) {
     };
 }
 
-function maybeMultiplied(tokenizer, node) {
-    const multiplier = readMultiplier(tokenizer);
+function maybeMultiplied(scanner, node) {
+    const multiplier = readMultiplier(scanner);
 
     if (multiplier !== null) {
         multiplier.term = node;
@@ -204,9 +155,9 @@ function maybeMultiplied(tokenizer, node
         //     term: node
         //   }
         // }
-        if (tokenizer.charCode() === NUMBERSIGN &&
-            tokenizer.charCodeAt(tokenizer.pos - 1) === PLUSSIGN) {
-            return maybeMultiplied(tokenizer, multiplier);
+        if (scanner.charCode() === NUMBERSIGN &&
+            scanner.charCodeAt(scanner.pos - 1) === PLUSSIGN) {
+            return maybeMultiplied(scanner, multiplier);
         }
 
         return multiplier;
@@ -215,31 +166,31 @@ function maybeMultiplied(tokenizer, node
     return node;
 }
 
-function maybeToken(tokenizer) {
-    const ch = tokenizer.peek();
+function maybeToken(scanner) {
+    const ch = scanner.peek();
 
     if (ch === '') {
         return null;
     }
 
-    return {
+    return maybeMultiplied(scanner, {
         type: 'Token',
         value: ch
-    };
+    });
 }
 
-function readProperty(tokenizer) {
+function readProperty(scanner) {
     let name;
 
-    tokenizer.eat(LESSTHANSIGN);
-    tokenizer.eat(APOSTROPHE);
+    scanner.eat(LESSTHANSIGN);
+    scanner.eat(APOSTROPHE);
 
-    name = scanWord(tokenizer);
+    name = scanner.scanWord();
 
-    tokenizer.eat(APOSTROPHE);
-    tokenizer.eat(GREATERTHANSIGN);
+    scanner.eat(APOSTROPHE);
+    scanner.eat(GREATERTHANSIGN);
 
-    return maybeMultiplied(tokenizer, {
+    return maybeMultiplied(scanner, {
         type: 'Property',
         name
     });
@@ -252,51 +203,51 @@ function readProperty(tokenizer) {
 // range notation—[min,max]—within the angle brackets, after the identifying keyword,
 // indicating a closed range between (and including) min and max.
 // For example, <integer [0, 10]> indicates an integer between 0 and 10, inclusive.
-function readTypeRange(tokenizer) {
+function readTypeRange(scanner) {
     // use null for Infinity to make AST format JSON serializable/deserializable
     let min = null; // -Infinity
     let max = null; // Infinity
     let sign = 1;
 
-    tokenizer.eat(LEFTSQUAREBRACKET);
+    scanner.eat(LEFTSQUAREBRACKET);
 
-    if (tokenizer.charCode() === HYPERMINUS) {
-        tokenizer.peek();
+    if (scanner.charCode() === HYPERMINUS) {
+        scanner.peek();
         sign = -1;
     }
 
-    if (sign == -1 && tokenizer.charCode() === INFINITY) {
-        tokenizer.peek();
+    if (sign == -1 && scanner.charCode() === INFINITY) {
+        scanner.peek();
     } else {
-        min = sign * Number(scanNumber(tokenizer));
+        min = sign * Number(scanner.scanNumber(scanner));
 
-        if (NAME_CHAR[tokenizer.charCode()] !== 0) {
-            min += scanWord(tokenizer);
+        if (scanner.isNameCharCode()) {
+            min += scanner.scanWord();
         }
     }
 
-    scanSpaces(tokenizer);
-    tokenizer.eat(COMMA);
-    scanSpaces(tokenizer);
+    scanner.skipWs();
+    scanner.eat(COMMA);
+    scanner.skipWs();
 
-    if (tokenizer.charCode() === INFINITY) {
-        tokenizer.peek();
+    if (scanner.charCode() === INFINITY) {
+        scanner.peek();
     } else {
         sign = 1;
 
-        if (tokenizer.charCode() === HYPERMINUS) {
-            tokenizer.peek();
+        if (scanner.charCode() === HYPERMINUS) {
+            scanner.peek();
             sign = -1;
         }
 
-        max = sign * Number(scanNumber(tokenizer));
+        max = sign * Number(scanner.scanNumber(scanner));
 
-        if (NAME_CHAR[tokenizer.charCode()] !== 0) {
-            max += scanWord(tokenizer);
+        if (scanner.isNameCharCode()) {
+            max += scanner.scanWord();
         }
     }
 
-    tokenizer.eat(RIGHTSQUAREBRACKET);
+    scanner.eat(RIGHTSQUAREBRACKET);
 
     return {
         type: 'Range',
@@ -305,38 +256,55 @@ function readTypeRange(tokenizer) {
     };
 }
 
-function readType(tokenizer) {
+function readType(scanner) {
     let name;
     let opts = null;
 
-    tokenizer.eat(LESSTHANSIGN);
-    name = scanWord(tokenizer);
+    scanner.eat(LESSTHANSIGN);
+    name = scanner.scanWord();
 
-    if (tokenizer.charCode() === LEFTPARENTHESIS &&
-        tokenizer.nextCharCode() === RIGHTPARENTHESIS) {
-        tokenizer.pos += 2;
+    // https://drafts.csswg.org/css-values-5/#boolean
+    if (name === 'boolean-expr') {
+        scanner.eat(LEFTSQUAREBRACKET);
+
+        const implicitGroup = readImplicitGroup(scanner, RIGHTSQUAREBRACKET);
+
+        scanner.eat(RIGHTSQUAREBRACKET);
+        scanner.eat(GREATERTHANSIGN);
+
+        return maybeMultiplied(scanner, {
+            type: 'Boolean',
+            term: implicitGroup.terms.length === 1
+                ? implicitGroup.terms[0]
+                : implicitGroup
+        });
+    }
+
+    if (scanner.charCode() === LEFTPARENTHESIS &&
+        scanner.nextCharCode() === RIGHTPARENTHESIS) {
+        scanner.pos += 2;
         name += '()';
     }
 
-    if (tokenizer.charCodeAt(tokenizer.findWsEnd(tokenizer.pos)) === LEFTSQUAREBRACKET) {
-        scanSpaces(tokenizer);
-        opts = readTypeRange(tokenizer);
+    if (scanner.charCodeAt(scanner.findWsEnd(scanner.pos)) === LEFTSQUAREBRACKET) {
+        scanner.skipWs();
+        opts = readTypeRange(scanner);
     }
 
-    tokenizer.eat(GREATERTHANSIGN);
+    scanner.eat(GREATERTHANSIGN);
 
-    return maybeMultiplied(tokenizer, {
+    return maybeMultiplied(scanner, {
         type: 'Type',
         name,
         opts
     });
 }
 
-function readKeywordOrFunction(tokenizer) {
-    const name = scanWord(tokenizer);
+function readKeywordOrFunction(scanner) {
+    const name = scanner.scanWord();
 
-    if (tokenizer.charCode() === LEFTPARENTHESIS) {
-        tokenizer.pos++;
+    if (scanner.charCode() === LEFTPARENTHESIS) {
+        scanner.pos++;
 
         return {
             type: 'Function',
@@ -344,7 +312,7 @@ function readKeywordOrFunction(tokenizer
         };
     }
 
-    return maybeMultiplied(tokenizer, {
+    return maybeMultiplied(scanner, {
         type: 'Keyword',
         name
     });
@@ -408,20 +376,20 @@ function regroupTerms(terms, combinators
     return combinator;
 }
 
-function readImplicitGroup(tokenizer) {
+function readImplicitGroup(scanner, stopCharCode) {
+    const combinators = Object.create(null);
     const terms = [];
-    const combinators = {};
     let token;
     let prevToken = null;
-    let prevTokenPos = tokenizer.pos;
+    let prevTokenPos = scanner.pos;
 
-    while (token = peek(tokenizer)) {
+    while (scanner.charCode() !== stopCharCode && (token = peek(scanner, stopCharCode))) {
         if (token.type !== 'Spaces') {
             if (token.type === 'Combinator') {
                 // check for combinator in group beginning and double combinator sequence
                 if (prevToken === null || prevToken.type === 'Combinator') {
-                    tokenizer.pos = prevTokenPos;
-                    tokenizer.error('Unexpected combinator');
+                    scanner.pos = prevTokenPos;
+                    scanner.error('Unexpected combinator');
                 }
 
                 combinators[token.value] = true;
@@ -435,14 +403,14 @@ function readImplicitGroup(tokenizer) {
 
             terms.push(token);
             prevToken = token;
-            prevTokenPos = tokenizer.pos;
+            prevTokenPos = scanner.pos;
         }
     }
 
     // check for combinator in group ending
     if (prevToken !== null && prevToken.type === 'Combinator') {
-        tokenizer.pos -= prevTokenPos;
-        tokenizer.error('Unexpected combinator');
+        scanner.pos -= prevTokenPos;
+        scanner.error('Unexpected combinator');
     }
 
     return {
@@ -454,29 +422,25 @@ function readImplicitGroup(tokenizer) {
     };
 }
 
-function readGroup(tokenizer) {
+function readGroup(scanner, stopCharCode) {
     let result;
 
-    tokenizer.eat(LEFTSQUAREBRACKET);
-    result = readImplicitGroup(tokenizer);
-    tokenizer.eat(RIGHTSQUAREBRACKET);
+    scanner.eat(LEFTSQUAREBRACKET);
+    result = readImplicitGroup(scanner, stopCharCode);
+    scanner.eat(RIGHTSQUAREBRACKET);
 
     result.explicit = true;
 
-    if (tokenizer.charCode() === EXCLAMATIONMARK) {
-        tokenizer.pos++;
+    if (scanner.charCode() === EXCLAMATIONMARK) {
+        scanner.pos++;
         result.disallowEmpty = true;
     }
 
     return result;
 }
 
-function peek(tokenizer) {
-    let code = tokenizer.charCode();
-
-    if (code < 128 && NAME_CHAR[code] === 1) {
-        return readKeywordOrFunction(tokenizer);
-    }
+function peek(scanner, stopCharCode) {
+    let code = scanner.charCode();
 
     switch (code) {
         case RIGHTSQUAREBRACKET:
@@ -484,24 +448,24 @@ function peek(tokenizer) {
             break;
 
         case LEFTSQUAREBRACKET:
-            return maybeMultiplied(tokenizer, readGroup(tokenizer));
+            return maybeMultiplied(scanner, readGroup(scanner, stopCharCode));
 
         case LESSTHANSIGN:
-            return tokenizer.nextCharCode() === APOSTROPHE
-                ? readProperty(tokenizer)
-                : readType(tokenizer);
+            return scanner.nextCharCode() === APOSTROPHE
+                ? readProperty(scanner)
+                : readType(scanner);
 
         case VERTICALLINE:
             return {
                 type: 'Combinator',
-                value: tokenizer.substringToPos(
-                    tokenizer.pos + (tokenizer.nextCharCode() === VERTICALLINE ? 2 : 1)
+                value: scanner.substringToPos(
+                    scanner.pos + (scanner.nextCharCode() === VERTICALLINE ? 2 : 1)
                 )
             };
 
         case AMPERSAND:
-            tokenizer.pos++;
-            tokenizer.eat(AMPERSAND);
+            scanner.pos++;
+            scanner.eat(AMPERSAND);
 
             return {
                 type: 'Combinator',
@@ -509,15 +473,15 @@ function peek(tokenizer) {
             };
 
         case COMMA:
-            tokenizer.pos++;
+            scanner.pos++;
             return {
                 type: 'Comma'
             };
 
         case APOSTROPHE:
-            return maybeMultiplied(tokenizer, {
+            return maybeMultiplied(scanner, {
                 type: 'String',
-                value: scanString(tokenizer)
+                value: scanner.scanString()
             });
 
         case SPACE:
@@ -527,21 +491,21 @@ function peek(tokenizer) {
         case F:
             return {
                 type: 'Spaces',
-                value: scanSpaces(tokenizer)
+                value: scanner.scanSpaces()
             };
 
         case COMMERCIALAT:
-            code = tokenizer.nextCharCode();
+            code = scanner.nextCharCode();
 
-            if (code < 128 && NAME_CHAR[code] === 1) {
-                tokenizer.pos++;
+            if (scanner.isNameCharCode(code)) {
+                scanner.pos++;
                 return {
                     type: 'AtKeyword',
-                    name: scanWord(tokenizer)
+                    name: scanner.scanWord()
                 };
             }
 
-            return maybeToken(tokenizer);
+            return maybeToken(scanner);
 
         case ASTERISK:
         case PLUSSIGN:
@@ -554,25 +518,29 @@ function peek(tokenizer) {
         case LEFTCURLYBRACKET:
             // LEFTCURLYBRACKET is allowed since mdn/data uses it w/o quoting
             // check next char isn't a number, because it's likely a disjoined multiplier
-            code = tokenizer.nextCharCode();
+            code = scanner.nextCharCode();
 
             if (code < 48 || code > 57) {
-                return maybeToken(tokenizer);
+                return maybeToken(scanner);
             }
 
             break;
 
         default:
-            return maybeToken(tokenizer);
+            if (scanner.isNameCharCode(code)) {
+                return readKeywordOrFunction(scanner);
+            }
+
+            return maybeToken(scanner);
     }
 }
 
 export function parse(source) {
-    const tokenizer = new Tokenizer(source);
-    const result = readImplicitGroup(tokenizer);
+    const scanner = new Scanner(source);
+    const result = readImplicitGroup(scanner);
 
-    if (tokenizer.pos !== source.length) {
-        tokenizer.error('Unexpected input');
+    if (scanner.pos !== source.length) {
+        scanner.error('Unexpected input');
     }
 
     // reduce redundant groups with single group term
diff -pruN 2.3.1-1/lib/definition-syntax/scanner.js 3.1.0-1/lib/definition-syntax/scanner.js
--- 2.3.1-1/lib/definition-syntax/scanner.js	1970-01-01 00:00:00.000000000 +0000
+++ 3.1.0-1/lib/definition-syntax/scanner.js	2024-12-06 17:25:18.000000000 +0000
@@ -0,0 +1,109 @@
+import { SyntaxError } from './SyntaxError.js';
+
+const TAB = 9;
+const N = 10;
+const F = 12;
+const R = 13;
+const SPACE = 32;
+const NAME_CHAR = new Uint8Array(128).map((_, idx) =>
+    /[a-zA-Z0-9\-]/.test(String.fromCharCode(idx)) ? 1 : 0
+);
+
+export class Scanner {
+    constructor(str) {
+        this.str = str;
+        this.pos = 0;
+    }
+
+    charCodeAt(pos) {
+        return pos < this.str.length ? this.str.charCodeAt(pos) : 0;
+    }
+    charCode() {
+        return this.charCodeAt(this.pos);
+    }
+    isNameCharCode(code = this.charCode()) {
+        return code < 128 && NAME_CHAR[code] === 1;
+    }
+    nextCharCode() {
+        return this.charCodeAt(this.pos + 1);
+    }
+    nextNonWsCode(pos) {
+        return this.charCodeAt(this.findWsEnd(pos));
+    }
+    skipWs() {
+        this.pos = this.findWsEnd(this.pos);
+    }
+    findWsEnd(pos) {
+        for (; pos < this.str.length; pos++) {
+            const code = this.str.charCodeAt(pos);
+            if (code !== R && code !== N && code !== F && code !== SPACE && code !== TAB) {
+                break;
+            }
+        }
+
+        return pos;
+    }
+    substringToPos(end) {
+        return this.str.substring(this.pos, this.pos = end);
+    }
+    eat(code) {
+        if (this.charCode() !== code) {
+            this.error('Expect `' + String.fromCharCode(code) + '`');
+        }
+
+        this.pos++;
+    }
+    peek() {
+        return this.pos < this.str.length ? this.str.charAt(this.pos++) : '';
+    }
+    error(message) {
+        throw new SyntaxError(message, this.str, this.pos);
+    }
+
+    scanSpaces() {
+        return this.substringToPos(this.findWsEnd(this.pos));
+    }
+    scanWord() {
+        let end = this.pos;
+
+        for (; end < this.str.length; end++) {
+            const code = this.str.charCodeAt(end);
+            if (code >= 128 || NAME_CHAR[code] === 0) {
+                break;
+            }
+        }
+
+        if (this.pos === end) {
+            this.error('Expect a keyword');
+        }
+
+        return this.substringToPos(end);
+    }
+    scanNumber() {
+        let end = this.pos;
+
+        for (; end < this.str.length; end++) {
+            const code = this.str.charCodeAt(end);
+
+            if (code < 48 || code > 57) {
+                break;
+            }
+        }
+
+        if (this.pos === end) {
+            this.error('Expect a number');
+        }
+
+        return this.substringToPos(end);
+    }
+    scanString() {
+        const end = this.str.indexOf('\'', this.pos + 1);
+
+        if (end === -1) {
+            this.pos = this.str.length;
+            this.error('Expect an apostrophe');
+        }
+
+        return this.substringToPos(end + 1);
+    }
+};
diff -pruN 2.3.1-1/lib/definition-syntax/tokenizer.js 3.1.0-1/lib/definition-syntax/tokenizer.js
--- 2.3.1-1/lib/definition-syntax/tokenizer.js	2022-12-14 17:31:12.000000000 +0000
+++ 3.1.0-1/lib/definition-syntax/tokenizer.js	1970-01-01 00:00:00.000000000 +0000
@@ -1,52 +0,0 @@
-import { SyntaxError } from './SyntaxError.js';
-
-const TAB = 9;
-const N = 10;
-const F = 12;
-const R = 13;
-const SPACE = 32;
-
-export class Tokenizer {
-    constructor(str) {
-        this.str = str;
-        this.pos = 0;
-    }
-    charCodeAt(pos) {
-        return pos < this.str.length ? this.str.charCodeAt(pos) : 0;
-    }
-    charCode() {
-        return this.charCodeAt(this.pos);
-    }
-    nextCharCode() {
-        return this.charCodeAt(this.pos + 1);
-    }
-    nextNonWsCode(pos) {
-        return this.charCodeAt(this.findWsEnd(pos));
-    }
-    findWsEnd(pos) {
-        for (; pos < this.str.length; pos++) {
-            const code = this.str.charCodeAt(pos);
-            if (code !== R && code !== N && code !== F && code !== SPACE && code !== TAB) {
-                break;
-            }
-        }
-
-        return pos;
-    }
-    substringToPos(end) {
-        return this.str.substring(this.pos, this.pos = end);
-    }
-    eat(code) {
-        if (this.charCode() !== code) {
-            this.error('Expect `' + String.fromCharCode(code) + '`');
-        }
-
-        this.pos++;
-    }
-    peek() {
-        return this.pos < this.str.length ? this.str.charAt(this.pos++) : '';
-    }
-    error(message) {
-        throw new SyntaxError(message, this.str, this.pos);
-    }
-};
diff -pruN 2.3.1-1/lib/definition-syntax/walk.js 3.1.0-1/lib/definition-syntax/walk.js
--- 2.3.1-1/lib/definition-syntax/walk.js	2022-12-14 17:31:12.000000000 +0000
+++ 3.1.0-1/lib/definition-syntax/walk.js	2024-12-06 17:25:18.000000000 +0000
@@ -14,6 +14,7 @@ export function walk(node, options, cont
                 break;
 
             case 'Multiplier':
+            case 'Boolean':
                 walk(node.term);
                 break;
 
diff -pruN 2.3.1-1/lib/generator/create.js 3.1.0-1/lib/generator/create.js
--- 2.3.1-1/lib/generator/create.js	2022-12-14 17:31:12.000000000 +0000
+++ 3.1.0-1/lib/generator/create.js	2024-12-06 17:25:18.000000000 +0000
@@ -32,8 +32,7 @@ function processChunk(chunk) {
 export function createGenerator(config) {
     const types = new Map();
 
-    for (let name in config.node) {
-        const item = config.node[name];
+    for (let [name, item] of Object.entries(config.node)) {
         const fn = item.generate || item;
 
         if (typeof fn === 'function') {
diff -pruN 2.3.1-1/lib/index.js 3.1.0-1/lib/index.js
--- 2.3.1-1/lib/index.js	2022-12-14 17:31:12.000000000 +0000
+++ 3.1.0-1/lib/index.js	2024-12-06 17:25:18.000000000 +0000
@@ -4,7 +4,7 @@ export * from './version.js';
 export { default as createSyntax } from './syntax/create.js';
 export { List } from './utils/List.js';
 export { Lexer } from './lexer/Lexer.js';
-export { tokenTypes, tokenNames, TokenStream } from './tokenizer/index.js';
+export { tokenTypes, tokenNames, TokenStream, OffsetToLocation } from './tokenizer/index.js';
 export * as definitionSyntax from './definition-syntax/index.js';
 export { clone } from './utils/clone.js';
 export * from './utils/names.js';
diff -pruN 2.3.1-1/lib/lexer/Lexer.js 3.1.0-1/lib/lexer/Lexer.js
--- 2.3.1-1/lib/lexer/Lexer.js	2022-12-14 17:31:12.000000000 +0000
+++ 3.1.0-1/lib/lexer/Lexer.js	2024-12-06 17:25:18.000000000 +0000
@@ -11,8 +11,6 @@ import * as trace from './trace.js';
 import { matchFragments } from './search.js';
 import { getStructureFromConfig } from './structure.js';
 
-const cssWideKeywordsSyntax = buildMatchGraph(cssWideKeywords.join(' | '));
-
 function dumpMapSyntax(map, compact, syntaxAsAst) {
     const result = {};
 
@@ -54,6 +52,17 @@ function valueHasVar(tokens) {
     return false;
 }
 
+function syntaxHasTopLevelCommaMultiplier(syntax) {
+    const singleTerm = syntax.terms[0];
+
+    return (
+        syntax.explicit === false &&
+        syntax.terms.length === 1 &&
+        singleTerm.type === 'Multiplier' &&
+        singleTerm.comma === true
+    );
+}
+
 function buildMatchResult(matched, error, iterations) {
     return {
         matched,
@@ -91,7 +100,7 @@ function matchSyntax(lexer, syntax, valu
 
 export class Lexer {
     constructor(config, syntax, structure) {
-        this.cssWideKeywordsSyntax = cssWideKeywordsSyntax;
+        this.cssWideKeywords = cssWideKeywords;
         this.syntax = syntax;
         this.generic = false;
         this.units = { ...units };
@@ -101,6 +110,10 @@ export class Lexer {
         this.structure = structure || getStructureFromConfig(config);
 
         if (config) {
+            if (config.cssWideKeywords) {
+                this.cssWideKeywords = config.cssWideKeywords;
+            }
+
             if (config.units) {
                 for (const group of Object.keys(units)) {
                     if (Array.isArray(config.units[group])) {
@@ -110,8 +123,8 @@ export class Lexer {
             }
 
             if (config.types) {
-                for (const name in config.types) {
-                    this.addType_(name, config.types[name]);
+                for (const [name, type] of Object.entries(config.types)) {
+                    this.addType_(name, type);
                 }
             }
 
@@ -123,17 +136,19 @@ export class Lexer {
             }
 
             if (config.atrules) {
-                for (const name in config.atrules) {
-                    this.addAtrule_(name, config.atrules[name]);
+                for (const [name, atrule] of Object.entries(config.atrules)) {
+                    this.addAtrule_(name, atrule);
                 }
             }
 
             if (config.properties) {
-                for (const name in config.properties) {
-                    this.addProperty_(name, config.properties[name]);
+                for (const [name, property] of Object.entries(config.properties)) {
+                    this.addProperty_(name, property);
                 }
             }
         }
+
+        this.cssWideKeywordsSyntax = buildMatchGraph(this.cssWideKeywords.join(' |  '));
     }
 
     checkStructure(ast) {
@@ -166,7 +181,8 @@ export class Lexer {
             parent,
             serializable: typeof syntax === 'string' || (syntax && typeof syntax.type === 'string'),
             syntax: null,
-            match: null
+            match: null,
+            matchRef: null // used for properties when a syntax referenced as <'property'> in other syntax definitions
         };
 
         if (typeof syntax === 'function') {
@@ -197,6 +213,26 @@ export class Lexer {
                     return descriptor.match;
                 }
             });
+
+            if (type === 'Property') {
+                Object.defineProperty(descriptor, 'matchRef', {
+                    get() {
+                        const syntax = descriptor.syntax;
+                        const value = syntaxHasTopLevelCommaMultiplier(syntax)
+                            ? buildMatchGraph({
+                                ...syntax,
+                                terms: [syntax.terms[0].term]
+                            }, ref)
+                            : null;
+
+                        Object.defineProperty(descriptor, 'matchRef', {
+                            value
+                        });
+
+                        return value;
+                    }
+                });
+            }
         }
 
         return descriptor;
@@ -404,6 +440,10 @@ export class Lexer {
     }
 
     validate() {
+        function syntaxRef(name, isType) {
+            return isType ? `<${name}>` : `<'${name}'>`;
+        }
+
         function validate(syntax, name, broken, descriptor) {
             if (broken.has(name)) {
                 return broken.get(name);
@@ -419,13 +459,18 @@ export class Lexer {
                     const map = node.type === 'Type' ? syntax.types : syntax.properties;
                     const brokenMap = node.type === 'Type' ? brokenTypes : brokenProperties;
 
-                    if (!hasOwnProperty.call(map, node.name) || validate(syntax, node.name, brokenMap, map[node.name])) {
+                    if (!hasOwnProperty.call(map, node.name)) {
+                        errors.push(`${syntaxRef(name, broken === brokenTypes)} used missed syntax definition ${syntaxRef(node.name, node.type === 'Type')}`);
+                        broken.set(name, true);
+                    } else if (validate(syntax, node.name, brokenMap, map[node.name])) {
+                        errors.push(`${syntaxRef(name, broken === brokenTypes)} used broken syntax definition ${syntaxRef(node.name, node.type === 'Type')}`);
                         broken.set(name, true);
                     }
                 }, this);
             }
         }
 
+        const errors = [];
         let brokenTypes = new Map();
         let brokenProperties = new Map();
 
@@ -437,13 +482,14 @@ export class Lexer {
             validate(this, key, brokenProperties, this.properties[key]);
         }
 
-        brokenTypes = [...brokenTypes.keys()].filter(name => brokenTypes.get(name));
-        brokenProperties = [...brokenProperties.keys()].filter(name => brokenProperties.get(name));
+        const brokenTypesArray = [...brokenTypes.keys()].filter(name => brokenTypes.get(name));
+        const brokenPropertiesArray = [...brokenProperties.keys()].filter(name => brokenProperties.get(name));
 
-        if (brokenTypes.length || brokenProperties.length) {
+        if (brokenTypesArray.length || brokenPropertiesArray.length) {
             return {
-                types: brokenTypes,
-                properties: brokenProperties
+                errors,
+                types: brokenTypesArray,
+                properties: brokenPropertiesArray
             };
         }
 
@@ -452,6 +498,7 @@ export class Lexer {
     dump(syntaxAsAst, pretty) {
         return {
             generic: this.generic,
+            cssWideKeywords: this.cssWideKeywords,
             units: this.units,
             types: dumpMapSyntax(this.types, !pretty, syntaxAsAst),
             properties: dumpMapSyntax(this.properties, !pretty, syntaxAsAst),
diff -pruN 2.3.1-1/lib/lexer/generic.js 3.1.0-1/lib/lexer/generic.js
--- 2.3.1-1/lib/lexer/generic.js	2022-12-14 17:31:12.000000000 +0000
+++ 3.1.0-1/lib/lexer/generic.js	2024-12-06 17:25:18.000000000 +0000
@@ -205,19 +205,34 @@ function customIdent(token) {
     return 1;
 }
 
+// https://drafts.csswg.org/css-values-4/#dashed-idents
+// The <dashed-ident> production is a <custom-ident>, with all the case-sensitivity that implies,
+// with the additional restriction that it must start with two dashes (U+002D HYPHEN-MINUS).
+function dashedIdent(token) {
+    if (token === null || token.type !== Ident) {
+        return 0;
+    }
+
+    // ... must start with two dashes (U+002D HYPHEN-MINUS)
+    if (charCodeAt(token.value, 0) !== 0x002D || charCodeAt(token.value, 1) !== 0x002D) {
+        return 0;
+    }
+
+    return 1;
+}
+
 // https://drafts.csswg.org/css-variables/#typedef-custom-property-name
 // A custom property is any property whose name starts with two dashes (U+002D HYPHEN-MINUS), like --foo.
-// The <custom-property-name> production corresponds to this: it’s defined as any valid identifier
-// that starts with two dashes, except -- itself, which is reserved for future use by CSS.
-// NOTE: Current implementation treat `--` as a valid name since most (all?) major browsers treat it as valid.
+// The <custom-property-name> production corresponds to this: it’s defined as any <dashed-ident>
+// (a valid identifier that starts with two dashes), except -- itself, which is reserved for future use by CSS.
 function customPropertyName(token) {
-    // ... defined as any valid identifier
-    if (token === null || token.type !== Ident) {
+    // ... it’s defined as any <dashed-ident>
+    if (!dashedIdent(token)) {
         return 0;
     }
 
-    // ... that starts with two dashes (U+002D HYPHEN-MINUS)
-    if (charCodeAt(token.value, 0) !== 0x002D || charCodeAt(token.value, 1) !== 0x002D) {
+    // ... except -- itself, which is reserved for future use by CSS
+    if (token.value === '--') {
         return 0;
     }
 
@@ -551,6 +566,7 @@ export const productionTypes = {
 
     // complex types
     'custom-ident': customIdent,
+    'dashed-ident': dashedIdent,
     'custom-property-name': customPropertyName,
     'hex-color': hexColor,
     'id-selector': idSelector, // element( <id-selector> )
diff -pruN 2.3.1-1/lib/lexer/match-graph.js 3.1.0-1/lib/lexer/match-graph.js
--- 2.3.1-1/lib/lexer/match-graph.js	2022-12-14 17:31:12.000000000 +0000
+++ 3.1.0-1/lib/lexer/match-graph.js	2024-12-06 17:25:18.000000000 +0000
@@ -47,6 +47,35 @@ function isEnumCapatible(term) {
     );
 }
 
+function groupNode(terms, combinator = ' ', explicit = false) {
+    return {
+        type: 'Group',
+        terms,
+        combinator,
+        disallowEmpty: false,
+        explicit
+    };
+}
+
+function replaceTypeInGraph(node, replacements, visited = new Set()) {
+    if (!visited.has(node)) {
+        visited.add(node);
+
+        switch (node.type) {
+            case 'If':
+                node.match = replaceTypeInGraph(node.match, replacements, visited);
+                node.then = replaceTypeInGraph(node.then, replacements, visited);
+                node.else = replaceTypeInGraph(node.else, replacements, visited);
+                break;
+
+            case 'Type':
+                return replacements[node.name] || node;
+        }
+    }
+
+    return node;
+}
+
 function buildGroupMatchGraph(combinator, terms, atLeastOneTermMatched) {
     switch (combinator) {
         case ' ': {
@@ -378,6 +407,48 @@ function buildMatchGraphInternal(node) {
         case 'Multiplier':
             return buildMultiplierMatchGraph(node);
 
+        // https://drafts.csswg.org/css-values-5/#boolean
+        case 'Boolean': {
+            const term = buildMatchGraphInternal(node.term);
+            // <boolean-expr[ <test> ]> = not <boolean-expr-group> | <boolean-expr-group> [ [ and <boolean-expr-group> ]* | [ or <boolean-expr-group> ]* ]
+            const matchNode = buildMatchGraphInternal(groupNode([
+                groupNode([
+                    { type: 'Keyword', name: 'not' },
+                    { type: 'Type', name: '!boolean-group' }
+                ]),
+                groupNode([
+                    { type: 'Type', name: '!boolean-group' },
+                    groupNode([
+                        { type: 'Multiplier', comma: false, min: 0, max: 0, term: groupNode([
+                            { type: 'Keyword', name: 'and' },
+                            { type: 'Type', name: '!boolean-group' }
+                        ]) },
+                        { type: 'Multiplier', comma: false, min: 0, max: 0, term: groupNode([
+                            { type: 'Keyword', name: 'or' },
+                            { type: 'Type', name: '!boolean-group' }
+                        ]) }
+                    ], '|')
+                ])
+            ], '|'));
+            // <boolean-expr-group> = <test> | ( <boolean-expr[ <test> ]> ) | <general-enclosed>
+            const booleanGroup = buildMatchGraphInternal(
+                groupNode([
+                    { type: 'Type', name: '!term' },
+                    groupNode([
+                        { type: 'Token', value: '(' },
+                        { type: 'Type', name: '!self' },
+                        { type: 'Token', value: ')' }
+                    ]),
+                    { type: 'Type', name: 'general-enclosed' }
+                ], '|')
+            );
+
+            replaceTypeInGraph(booleanGroup, { '!term': term, '!self': matchNode });
+            replaceTypeInGraph(matchNode, { '!boolean-group': booleanGroup });
+
+            return matchNode;
+        }
+
         case 'Type':
         case 'Property':
             return {
diff -pruN 2.3.1-1/lib/lexer/match.js 3.1.0-1/lib/lexer/match.js
--- 2.3.1-1/lib/lexer/match.js	2022-12-14 17:31:12.000000000 +0000
+++ 3.1.0-1/lib/lexer/match.js	2024-12-06 17:25:18.000000000 +0000
@@ -435,7 +435,7 @@ function internalMatch(tokens, state, sy
                 }
 
                 openSyntax();
-                state = dictSyntax.match;
+                state = dictSyntax.matchRef || dictSyntax.match;
                 break;
             }
 
diff -pruN 2.3.1-1/lib/lexer/structure.js 3.1.0-1/lib/lexer/structure.js
--- 2.3.1-1/lib/lexer/structure.js	2022-12-14 17:31:12.000000000 +0000
+++ 3.1.0-1/lib/lexer/structure.js	2024-12-06 17:25:18.000000000 +0000
@@ -99,6 +99,27 @@ function createNodeStructureChecker(type
     };
 }
 
+function genTypesList(fieldTypes, path) {
+    const docsTypes = [];
+
+    for (let i = 0; i < fieldTypes.length; i++) {
+        const fieldType = fieldTypes[i];
+        if (fieldType === String || fieldType === Boolean) {
+            docsTypes.push(fieldType.name.toLowerCase());
+        } else if (fieldType === null) {
+            docsTypes.push('null');
+        } else if (typeof fieldType === 'string') {
+            docsTypes.push(fieldType);
+        } else if (Array.isArray(fieldType)) {
+            docsTypes.push('List<' + (genTypesList(fieldType, path) || 'any') + '>'); // TODO: use type enum
+        } else {
+            throw new Error('Wrong value `' + fieldType + '` in `' + path + '` structure definition');
+        }
+    }
+
+    return docsTypes.join(' | ');
+}
+
 function processStructure(name, nodeType) {
     const structure = nodeType.structure;
     const fields = {
@@ -114,27 +135,11 @@ function processStructure(name, nodeType
             continue;
         }
 
-        const docsTypes = [];
         const fieldTypes = fields[key] = Array.isArray(structure[key])
             ? structure[key].slice()
             : [structure[key]];
 
-        for (let i = 0; i < fieldTypes.length; i++) {
-            const fieldType = fieldTypes[i];
-            if (fieldType === String || fieldType === Boolean) {
-                docsTypes.push(fieldType.name);
-            } else if (fieldType === null) {
-                docsTypes.push('null');
-            } else if (typeof fieldType === 'string') {
-                docsTypes.push('<' + fieldType + '>');
-            } else if (Array.isArray(fieldType)) {
-                docsTypes.push('List'); // TODO: use type enum
-            } else {
-                throw new Error('Wrong value `' + fieldType + '` in `' + name + '.' + key + '` structure definition');
-            }
-        }
-
-        docs[key] = docsTypes.join(' | ');
+        docs[key] = genTypesList(fieldTypes, name + '.' + key);
     }
 
     return {
diff -pruN 2.3.1-1/lib/parser/SyntaxError.js 3.1.0-1/lib/parser/SyntaxError.js
--- 2.3.1-1/lib/parser/SyntaxError.js	2022-12-14 17:31:12.000000000 +0000
+++ 3.1.0-1/lib/parser/SyntaxError.js	2024-12-06 17:25:18.000000000 +0000
@@ -4,7 +4,7 @@ const MAX_LINE_LENGTH = 100;
 const OFFSET_CORRECTION = 60;
 const TAB_REPLACEMENT = '    ';
 
-function sourceFragment({ source, line, column }, extraLines) {
+function sourceFragment({ source, line, column, baseLine, baseColumn }, extraLines) {
     function processLines(start, end) {
         return lines
             .slice(start, end)
@@ -13,7 +13,9 @@ function sourceFragment({ source, line,
             ).join('\n');
     }
 
-    const lines = source.split(/\r\n?|\n|\f/);
+    const prelines = '\n'.repeat(Math.max(baseLine - 1, 0));
+    const precolumns = ' '.repeat(Math.max(baseColumn - 1, 0));
+    const lines = (prelines + precolumns + source).split(/\r\n?|\n|\f/);
     const startLine = Math.max(1, line - extraLines) - 1;
     const endLine = Math.min(line + extraLines, lines.length + 1);
     const maxNumLength = Math.max(4, String(endLine).length) + 1;
@@ -41,22 +43,25 @@ function sourceFragment({ source, line,
         processLines(startLine, line),
         new Array(column + maxNumLength + 2).join('-') + '^',
         processLines(line, endLine)
-    ].filter(Boolean).join('\n');
+    ].filter(Boolean)
+        .join('\n')
+        .replace(/^(\s+\d+\s+\|\n)+/, '')
+        .replace(/\n(\s+\d+\s+\|)+$/, '');
 }
 
-export function SyntaxError(message, source, offset, line, column) {
+export function SyntaxError(message, source, offset, line, column, baseLine = 1, baseColumn = 1) {
     const error = Object.assign(createCustomError('SyntaxError', message), {
         source,
         offset,
         line,
         column,
         sourceFragment(extraLines) {
-            return sourceFragment({ source, line, column }, isNaN(extraLines) ? 0 : extraLines);
+            return sourceFragment({ source, line, column, baseLine, baseColumn }, isNaN(extraLines) ? 0 : extraLines);
         },
         get formattedMessage() {
             return (
                 `Parse error: ${message}\n` +
-                sourceFragment({ source, line, column }, 2)
+                sourceFragment({ source, line, column, baseLine, baseColumn }, 2)
             );
         }
     });
diff -pruN 2.3.1-1/lib/parser/create.js 3.1.0-1/lib/parser/create.js
--- 2.3.1-1/lib/parser/create.js	2022-12-14 17:31:12.000000000 +0000
+++ 3.1.0-1/lib/parser/create.js	2024-12-06 17:25:18.000000000 +0000
@@ -38,7 +38,7 @@ function createParseContext(name) {
 function fetchParseValues(dict) {
     const result = Object.create(null);
 
-    for (const name in dict) {
+    for (const name of Object.keys(dict)) {
         const item = dict[name];
         const fn = item.parse || item;
 
@@ -53,20 +53,21 @@ function fetchParseValues(dict) {
 function processConfig(config) {
     const parseConfig = {
         context: Object.create(null),
+        features: Object.assign(Object.create(null), config.features),
         scope: Object.assign(Object.create(null), config.scope),
         atrule: fetchParseValues(config.atrule),
         pseudo: fetchParseValues(config.pseudo),
         node: fetchParseValues(config.node)
     };
 
-    for (const name in config.parseContext) {
-        switch (typeof config.parseContext[name]) {
+    for (const [name, context] of Object.entries(config.parseContext)) {
+        switch (typeof context) {
             case 'function':
-                parseConfig.context[name] = config.parseContext[name];
+                parseConfig.context[name] = context;
                 break;
 
             case 'string':
-                parseConfig.context[name] = createParseContext(config.parseContext[name]);
+                parseConfig.context[name] = createParseContext(context);
                 break;
         }
     }
@@ -122,7 +123,7 @@ export function createParser(config) {
         },
 
         parseWithFallback(consumer, fallback) {
-            const startToken = this.tokenIndex;
+            const startIndex = this.tokenIndex;
 
             try {
                 return consumer.call(this);
@@ -131,7 +132,8 @@ export function createParser(config) {
                     throw e;
                 }
 
-                const fallbackNode = fallback.call(this, startToken);
+                this.skip(startIndex - this.tokenIndex);
+                const fallbackNode = fallback.call(this);
 
                 onParseErrorThrow = true;
                 onParseError(e, fallbackNode);
@@ -146,7 +148,7 @@ export function createParser(config) {
 
             do {
                 type = this.lookupType(offset++);
-                if (type !== WhiteSpace) {
+                if (type !== WhiteSpace && type !== Comment) {
                     return type;
                 }
             } while (type !== NULL);
@@ -284,7 +286,9 @@ export function createParser(config) {
                 source,
                 location.offset,
                 location.line,
-                location.column
+                location.column,
+                locationMap.startLine,
+                locationMap.startColumn
             );
         }
     });
diff -pruN 2.3.1-1/lib/syntax/atrule/container.js 3.1.0-1/lib/syntax/atrule/container.js
--- 2.3.1-1/lib/syntax/atrule/container.js	1970-01-01 00:00:00.000000000 +0000
+++ 3.1.0-1/lib/syntax/atrule/container.js	2024-12-06 17:25:18.000000000 +0000
@@ -0,0 +1,28 @@
+import { Ident } from '../../tokenizer/index.js';
+
+// https://drafts.csswg.org/css-contain-3/#container-rule
+// The keywords `none`, `and`, `not`, and `or` are excluded from the <custom-ident> above.
+const nonContainerNameKeywords = new Set(['none', 'and', 'not', 'or']);
+
+export default {
+    parse: {
+        prelude() {
+            const children = this.createList();
+
+            if (this.tokenType === Ident) {
+                const name = this.substring(this.tokenStart, this.tokenEnd);
+
+                if (!nonContainerNameKeywords.has(name.toLowerCase())) {
+                    children.push(this.Identifier());
+                }
+            }
+
+            children.push(this.Condition('container'));
+
+            return children;
+        },
+        block(nested = false) {
+            return this.Block(nested);
+        }
+    }
+};
diff -pruN 2.3.1-1/lib/syntax/atrule/import.js 3.1.0-1/lib/syntax/atrule/import.js
--- 2.3.1-1/lib/syntax/atrule/import.js	2022-12-14 17:31:12.000000000 +0000
+++ 3.1.0-1/lib/syntax/atrule/import.js	2024-12-06 17:25:18.000000000 +0000
@@ -3,16 +3,62 @@ import {
     Ident,
     Url,
     Function as FunctionToken,
-    LeftParenthesis
+    LeftParenthesis,
+    RightParenthesis
 } from '../../tokenizer/index.js';
 
+function parseWithFallback(parse, fallback) {
+    return this.parseWithFallback(
+        () => {
+            try {
+                return parse.call(this);
+            } finally {
+                this.skipSC();
+                if (this.lookupNonWSType(0) !== RightParenthesis) {
+                    this.error();
+                }
+            }
+        },
+        fallback || (() => this.Raw(null, true))
+    );
+}
+
+const parseFunctions = {
+    layer() {
+        this.skipSC();
+
+        const children = this.createList();
+        const node = parseWithFallback.call(this, this.Layer);
+
+        if (node.type !== 'Raw' || node.value !== '') {
+            children.push(node);
+        }
+
+        return children;
+    },
+    supports() {
+        this.skipSC();
+
+        const children = this.createList();
+        const node = parseWithFallback.call(
+            this,
+            this.Declaration,
+            () => parseWithFallback.call(this, () => this.Condition('supports'))
+        );
+
+        if (node.type !== 'Raw' || node.value !== '') {
+            children.push(node);
+        }
+
+        return children;
+    }
+};
+
 export default {
     parse: {
         prelude() {
             const children = this.createList();
 
-            this.skipSC();
-
             switch (this.tokenType) {
                 case StringToken:
                     children.push(this.String());
@@ -27,6 +73,25 @@ export default {
                     this.error('String or url() is expected');
             }
 
+            this.skipSC();
+
+            if (this.tokenType === Ident &&
+                this.cmpStr(this.tokenStart, this.tokenEnd, 'layer')) {
+                children.push(this.Identifier());
+            } else if (
+                this.tokenType === FunctionToken &&
+                this.cmpStr(this.tokenStart, this.tokenEnd, 'layer(')
+            ) {
+                children.push(this.Function(null, parseFunctions));
+            }
+
+            this.skipSC();
+
+            if (this.tokenType === FunctionToken &&
+                this.cmpStr(this.tokenStart, this.tokenEnd, 'supports(')) {
+                children.push(this.Function(null, parseFunctions));
+            }
+
             if (this.lookupNonWSType(0) === Ident ||
                 this.lookupNonWSType(0) === LeftParenthesis) {
                 children.push(this.MediaQueryList());
diff -pruN 2.3.1-1/lib/syntax/atrule/index.js 3.1.0-1/lib/syntax/atrule/index.js
--- 2.3.1-1/lib/syntax/atrule/index.js	2022-12-14 17:31:12.000000000 +0000
+++ 3.1.0-1/lib/syntax/atrule/index.js	2024-12-06 17:25:18.000000000 +0000
@@ -1,15 +1,23 @@
+import container from './container.js';
 import fontFace from './font-face.js';
 import importAtrule from './import.js';
+import layer from './layer.js';
 import media from './media.js';
 import nest from './nest.js';
 import page from './page.js';
+import scope from './scope.js';
+import startingStyle from './starting-style.js';
 import supports from './supports.js';
 
 export default {
+    container,
     'font-face': fontFace,
-    'import': importAtrule,
+    import: importAtrule,
+    layer,
     media,
     nest,
     page,
+    scope,
+    'starting-style': startingStyle,
     supports
 };
diff -pruN 2.3.1-1/lib/syntax/atrule/layer.js 3.1.0-1/lib/syntax/atrule/layer.js
--- 2.3.1-1/lib/syntax/atrule/layer.js	1970-01-01 00:00:00.000000000 +0000
+++ 3.1.0-1/lib/syntax/atrule/layer.js	2024-12-06 17:25:18.000000000 +0000
@@ -0,0 +1,12 @@
+export default {
+    parse: {
+        prelude() {
+            return this.createSingleNodeList(
+                this.LayerList()
+            );
+        },
+        block() {
+            return this.Block(false);
+        }
+    }
+};
diff -pruN 2.3.1-1/lib/syntax/atrule/media.js 3.1.0-1/lib/syntax/atrule/media.js
--- 2.3.1-1/lib/syntax/atrule/media.js	2022-12-14 17:31:12.000000000 +0000
+++ 3.1.0-1/lib/syntax/atrule/media.js	2024-12-06 17:25:18.000000000 +0000
@@ -5,8 +5,8 @@ export default {
                 this.MediaQueryList()
             );
         },
-        block(isStyleBlock = false) {
-            return this.Block(isStyleBlock);
+        block(nested = false) {
+            return this.Block(nested);
         }
     }
 };
diff -pruN 2.3.1-1/lib/syntax/atrule/scope.js 3.1.0-1/lib/syntax/atrule/scope.js
--- 2.3.1-1/lib/syntax/atrule/scope.js	1970-01-01 00:00:00.000000000 +0000
+++ 3.1.0-1/lib/syntax/atrule/scope.js	2024-12-06 17:25:18.000000000 +0000
@@ -0,0 +1,12 @@
+export default {
+    parse: {
+        prelude() {
+            return this.createSingleNodeList(
+                this.Scope()
+            );
+        },
+        block(nested = false) {
+            return this.Block(nested);
+        }
+    }
+};
diff -pruN 2.3.1-1/lib/syntax/atrule/starting-style.js 3.1.0-1/lib/syntax/atrule/starting-style.js
--- 2.3.1-1/lib/syntax/atrule/starting-style.js	1970-01-01 00:00:00.000000000 +0000
+++ 3.1.0-1/lib/syntax/atrule/starting-style.js	2024-12-06 17:25:18.000000000 +0000
@@ -0,0 +1,8 @@
+export default {
+    parse: {
+        prelude: null,
+        block(nested = false) {
+            return this.Block(nested);
+        }
+    }
+};
diff -pruN 2.3.1-1/lib/syntax/atrule/supports.js 3.1.0-1/lib/syntax/atrule/supports.js
--- 2.3.1-1/lib/syntax/atrule/supports.js	2022-12-14 17:31:12.000000000 +0000
+++ 3.1.0-1/lib/syntax/atrule/supports.js	2024-12-06 17:25:18.000000000 +0000
@@ -1,80 +1,12 @@
-import {
-    WhiteSpace,
-    Comment,
-    Ident,
-    Function,
-    Colon,
-    LeftParenthesis
-} from '../../tokenizer/index.js';
-
-function consumeRaw() {
-    return this.createSingleNodeList(
-        this.Raw(this.tokenIndex, null, false)
-    );
-}
-
-function parentheses() {
-    this.skipSC();
-
-    if (this.tokenType === Ident &&
-        this.lookupNonWSType(1) === Colon) {
-        return this.createSingleNodeList(
-            this.Declaration()
-        );
-    }
-
-    return readSequence.call(this);
-}
-
-function readSequence() {
-    const children = this.createList();
-    let child;
-
-    this.skipSC();
-
-    scan:
-    while (!this.eof) {
-        switch (this.tokenType) {
-            case Comment:
-            case WhiteSpace:
-                this.next();
-                continue;
-
-            case Function:
-                child = this.Function(consumeRaw, this.scope.AtrulePrelude);
-                break;
-
-            case Ident:
-                child = this.Identifier();
-                break;
-
-            case LeftParenthesis:
-                child = this.Parentheses(parentheses, this.scope.AtrulePrelude);
-                break;
-
-            default:
-                break scan;
-        }
-
-        children.push(child);
-    }
-
-    return children;
-}
-
 export default {
     parse: {
         prelude() {
-            const children = readSequence.call(this);
-
-            if (this.getFirstListNode(children) === null) {
-                this.error('Condition is expected');
-            }
-
-            return children;
+            return this.createSingleNodeList(
+                this.Condition('supports')
+            );
         },
-        block(isStyleBlock = false) {
-            return this.Block(isStyleBlock);
+        block(nested = false) {
+            return this.Block(nested);
         }
     }
 };
diff -pruN 2.3.1-1/lib/syntax/config/lexer.js 3.1.0-1/lib/syntax/config/lexer.js
--- 2.3.1-1/lib/syntax/config/lexer.js	2022-12-14 17:31:12.000000000 +0000
+++ 3.1.0-1/lib/syntax/config/lexer.js	2024-12-06 17:25:18.000000000 +0000
@@ -1,8 +1,10 @@
+import { cssWideKeywords } from '../../lexer/generic-const.js';
 import definitions from '../../data.js';
 import * as node from '../node/index.js';
 
 export default {
     generic: true,
+    cssWideKeywords,
     ...definitions,
     node
 };
diff -pruN 2.3.1-1/lib/syntax/config/mix.js 3.1.0-1/lib/syntax/config/mix.js
--- 2.3.1-1/lib/syntax/config/mix.js	2022-12-14 17:31:12.000000000 +0000
+++ 3.1.0-1/lib/syntax/config/mix.js	2024-12-06 17:25:18.000000000 +0000
@@ -34,6 +34,12 @@ export default function mix(dest, src) {
                 result[prop] = Boolean(value);
                 break;
 
+            case 'cssWideKeywords':
+                result[prop] = dest[prop]
+                    ? [...dest[prop], ...value]
+                    : value || [];
+                break;
+
             case 'units':
                 result[prop] = { ...dest[prop] };
                 for (const [name, patch] of Object.entries(value)) {
@@ -82,6 +88,7 @@ export default function mix(dest, src) {
                 break;
 
             case 'scope':
+            case 'features':
                 result[prop] = { ...dest[prop] };
                 for (const [name, props] of Object.entries(value)) {
                     result[prop][name] = { ...result[prop][name], ...props };
@@ -99,7 +106,8 @@ export default function mix(dest, src) {
             case 'pseudo':
                 result[prop] = {
                     ...dest[prop],
-                    ...sliceProps(value, ['parse']) };
+                    ...sliceProps(value, ['parse'])
+                };
                 break;
 
             case 'node':
diff -pruN 2.3.1-1/lib/syntax/config/parser.js 3.1.0-1/lib/syntax/config/parser.js
--- 2.3.1-1/lib/syntax/config/parser.js	2022-12-14 17:31:12.000000000 +0000
+++ 3.1.0-1/lib/syntax/config/parser.js	2024-12-06 17:25:18.000000000 +0000
@@ -13,6 +13,9 @@ export default {
         },
         mediaQueryList: 'MediaQueryList',
         mediaQuery: 'MediaQuery',
+        condition(options) {
+            return this.Condition(options.kind);
+        },
         rule: 'Rule',
         selectorList: 'SelectorList',
         selector: 'Selector',
@@ -23,6 +26,18 @@ export default {
         declaration: 'Declaration',
         value: 'Value'
     },
+    features: {
+        supports: {
+            selector() {
+                return this.Selector();
+            }
+        },
+        container: {
+            style() {
+                return this.Declaration();
+            }
+        }
+    },
     scope,
     atrule,
     pseudo,
diff -pruN 2.3.1-1/lib/syntax/create.js 3.1.0-1/lib/syntax/create.js
--- 2.3.1-1/lib/syntax/create.js	2022-12-14 17:31:12.000000000 +0000
+++ 3.1.0-1/lib/syntax/create.js	2024-12-06 17:25:18.000000000 +0000
@@ -33,14 +33,15 @@ function createSyntax(config) {
 
             return createSyntax(
                 typeof extension === 'function'
-                    ? extension(base, Object.assign)
+                    ? extension(base) // TODO: remove Object.assign as second parameter
                     : mix(base, extension)
             );
         }
     };
 
     syntax.lexer = new Lexer({
-        generic: true,
+        generic: config.generic,
+        cssWideKeywords: config.cssWideKeywords,
         units: config.units,
         types: config.types,
         atrules: config.atrules,
diff -pruN 2.3.1-1/lib/syntax/function/expression.js 3.1.0-1/lib/syntax/function/expression.js
--- 2.3.1-1/lib/syntax/function/expression.js	2022-12-14 17:31:12.000000000 +0000
+++ 3.1.0-1/lib/syntax/function/expression.js	2024-12-06 17:25:18.000000000 +0000
@@ -2,6 +2,6 @@
 // expression( <any-value> )
 export default function() {
     return this.createSingleNodeList(
-        this.Raw(this.tokenIndex, null, false)
+        this.Raw(null, false)
     );
 }
diff -pruN 2.3.1-1/lib/syntax/function/var.js 3.1.0-1/lib/syntax/function/var.js
--- 2.3.1-1/lib/syntax/function/var.js	2022-12-14 17:31:12.000000000 +0000
+++ 3.1.0-1/lib/syntax/function/var.js	2024-12-06 17:25:18.000000000 +0000
@@ -17,7 +17,7 @@ export default function() {
         const startIndex = this.tokenIndex;
         const value = this.parseCustomProperty
             ? this.Value(null)
-            : this.Raw(this.tokenIndex, this.consumeUntilExclamationMarkOrSemicolon, false);
+            : this.Raw(this.consumeUntilExclamationMarkOrSemicolon, false);
 
         if (value.type === 'Value' && value.children.isEmpty) {
             for (let offset = startIndex - this.tokenIndex; offset <= 0; offset++) {
diff -pruN 2.3.1-1/lib/syntax/node/Atrule.js 3.1.0-1/lib/syntax/node/Atrule.js
--- 2.3.1-1/lib/syntax/node/Atrule.js	2022-12-14 17:31:12.000000000 +0000
+++ 3.1.0-1/lib/syntax/node/Atrule.js	2024-12-06 17:25:18.000000000 +0000
@@ -5,8 +5,8 @@ import {
     RightCurlyBracket
 } from '../../tokenizer/index.js';
 
-function consumeRaw(startToken) {
-    return this.Raw(startToken, this.consumeUntilLeftCurlyBracketOrSemicolon, true);
+function consumeRaw() {
+    return this.Raw(this.consumeUntilLeftCurlyBracketOrSemicolon, true);
 }
 
 function isDeclarationBlockAtrule() {
diff -pruN 2.3.1-1/lib/syntax/node/Block.js 3.1.0-1/lib/syntax/node/Block.js
--- 2.3.1-1/lib/syntax/node/Block.js	2022-12-14 17:31:12.000000000 +0000
+++ 3.1.0-1/lib/syntax/node/Block.js	2024-12-06 17:25:18.000000000 +0000
@@ -9,14 +9,14 @@ import {
 
 const AMPERSAND = 0x0026;       // U+0026 AMPERSAND (&)
 
-function consumeRaw(startToken) {
-    return this.Raw(startToken, null, true);
+function consumeRaw() {
+    return this.Raw(null, true);
 }
 function consumeRule() {
     return this.parseWithFallback(this.Rule, consumeRaw);
 }
-function consumeRawDeclaration(startToken) {
-    return this.Raw(startToken, this.consumeUntilSemicolonIncluded, true);
+function consumeRawDeclaration() {
+    return this.Raw(this.consumeUntilSemicolonIncluded, true);
 }
 function consumeDeclaration() {
     if (this.tokenType === Semicolon) {
diff -pruN 2.3.1-1/lib/syntax/node/Condition.js 3.1.0-1/lib/syntax/node/Condition.js
--- 2.3.1-1/lib/syntax/node/Condition.js	1970-01-01 00:00:00.000000000 +0000
+++ 3.1.0-1/lib/syntax/node/Condition.js	2024-12-06 17:25:18.000000000 +0000
@@ -0,0 +1,123 @@
+import {
+    WhiteSpace,
+    Comment,
+    Ident,
+    LeftParenthesis,
+    RightParenthesis,
+    Function as FunctionToken,
+    Colon,
+    EOF
+} from '../../tokenizer/index.js';
+
+const likelyFeatureToken = new Set([Colon, RightParenthesis, EOF]);
+
+export const name = 'Condition';
+export const structure = {
+    kind: String,
+    children: [[
+        'Identifier',
+        'Feature',
+        'FeatureFunction',
+        'FeatureRange',
+        'SupportsDeclaration'
+    ]]
+};
+
+function featureOrRange(kind) {
+    if (this.lookupTypeNonSC(1) === Ident &&
+        likelyFeatureToken.has(this.lookupTypeNonSC(2))) {
+        return this.Feature(kind);
+    }
+
+    return this.FeatureRange(kind);
+}
+
+const parentheses = {
+    media: featureOrRange,
+    container: featureOrRange,
+    supports() {
+        return this.SupportsDeclaration();
+    }
+};
+
+export function parse(kind = 'media') {
+    const children = this.createList();
+
+    scan: while (!this.eof) {
+        switch (this.tokenType) {
+            case Comment:
+            case WhiteSpace:
+                this.next();
+                continue;
+
+            case Ident:
+                children.push(this.Identifier());
+                break;
+
+            case LeftParenthesis: {
+                let term = this.parseWithFallback(
+                    () => parentheses[kind].call(this, kind),
+                    () => null
+                );
+
+                if (!term) {
+                    term = this.parseWithFallback(
+                        () => {
+                            this.eat(LeftParenthesis);
+                            const res = this.Condition(kind);
+                            this.eat(RightParenthesis);
+                            return res;
+                        },
+                        () => {
+                            return this.GeneralEnclosed(kind);
+                        }
+                    );
+                }
+
+                children.push(term);
+                break;
+            }
+
+            case FunctionToken: {
+                let term = this.parseWithFallback(
+                    () => this.FeatureFunction(kind),
+                    () => null
+                );
+
+                if (!term) {
+                    term = this.GeneralEnclosed(kind);
+                }
+
+                children.push(term);
+                break;
+            }
+
+            default:
+                break scan;
+        }
+    }
+
+    if (children.isEmpty) {
+        this.error('Condition is expected');
+    }
+
+    return {
+        type: 'Condition',
+        loc: this.getLocationFromList(children),
+        kind,
+        children
+    };
+}
+
+export function generate(node) {
+    node.children.forEach(child => {
+        if (child.type === 'Condition') {
+            this.token(LeftParenthesis, '(');
+            this.node(child);
+            this.token(RightParenthesis, ')');
+        } else {
+            this.node(child);
+        }
+    });
+}
+
diff -pruN 2.3.1-1/lib/syntax/node/Declaration.js 3.1.0-1/lib/syntax/node/Declaration.js
--- 2.3.1-1/lib/syntax/node/Declaration.js	2022-12-14 17:31:12.000000000 +0000
+++ 3.1.0-1/lib/syntax/node/Declaration.js	2024-12-06 17:25:18.000000000 +0000
@@ -16,12 +16,12 @@ const ASTERISK = 0x002A;        // U+002
 const PLUSSIGN = 0x002B;        // U+002B PLUS SIGN (+)
 const SOLIDUS = 0x002F;         // U+002F SOLIDUS (/)
 
-function consumeValueRaw(startToken) {
-    return this.Raw(startToken, this.consumeUntilExclamationMarkOrSemicolon, true);
+function consumeValueRaw() {
+    return this.Raw(this.consumeUntilExclamationMarkOrSemicolon, true);
 }
 
-function consumeCustomPropertyRaw(startToken) {
-    return this.Raw(startToken, this.consumeUntilExclamationMarkOrSemicolon, false);
+function consumeCustomPropertyRaw() {
+    return this.Raw(this.consumeUntilExclamationMarkOrSemicolon, false);
 }
 
 function consumeValue() {
diff -pruN 2.3.1-1/lib/syntax/node/DeclarationList.js 3.1.0-1/lib/syntax/node/DeclarationList.js
--- 2.3.1-1/lib/syntax/node/DeclarationList.js	2022-12-14 17:31:12.000000000 +0000
+++ 3.1.0-1/lib/syntax/node/DeclarationList.js	2024-12-06 17:25:18.000000000 +0000
@@ -7,8 +7,8 @@ import {
 
 const AMPERSAND = 0x0026;       // U+0026 AMPERSAND (&)
 
-function consumeRaw(startToken) {
-    return this.Raw(startToken, this.consumeUntilSemicolonIncluded, true);
+function consumeRaw() {
+    return this.Raw(this.consumeUntilSemicolonIncluded, true);
 }
 
 export const name = 'DeclarationList';
diff -pruN 2.3.1-1/lib/syntax/node/Feature.js 3.1.0-1/lib/syntax/node/Feature.js
--- 2.3.1-1/lib/syntax/node/Feature.js	1970-01-01 00:00:00.000000000 +0000
+++ 3.1.0-1/lib/syntax/node/Feature.js	2024-12-06 17:25:18.000000000 +0000
@@ -0,0 +1,103 @@
+import {
+    Ident,
+    Number,
+    Dimension,
+    Function as FunctionToken,
+    LeftParenthesis,
+    RightParenthesis,
+    Colon,
+    Delim
+} from '../../tokenizer/index.js';
+
+const SOLIDUS = 0x002F;  // U+002F SOLIDUS (/)
+
+export const name = 'Feature';
+export const structure = {
+    kind: String,
+    name: String,
+    value: ['Identifier', 'Number', 'Dimension', 'Ratio', 'Function', null]
+};
+
+export function parse(kind) {
+    const start = this.tokenStart;
+    let name;
+    let value = null;
+
+    this.eat(LeftParenthesis);
+    this.skipSC();
+
+    name = this.consume(Ident);
+    this.skipSC();
+
+    if (this.tokenType !== RightParenthesis) {
+        this.eat(Colon);
+        this.skipSC();
+
+        switch (this.tokenType) {
+            case Number:
+                if (this.lookupNonWSType(1) === Delim) {
+                    value = this.Ratio();
+                } else {
+                    value = this.Number();
+                }
+
+                break;
+
+            case Dimension:
+                value = this.Dimension();
+                break;
+
+            case Ident:
+                value = this.Identifier();
+                break;
+
+            case FunctionToken:
+                value = this.parseWithFallback(
+                    () => {
+                        const res = this.Function(this.readSequence, this.scope.Value);
+
+                        this.skipSC();
+
+                        if (this.isDelim(SOLIDUS)) {
+                            this.error();
+                        }
+
+                        return res;
+                    },
+                    () => {
+                        return this.Ratio();
+                    }
+                );
+                break;
+
+            default:
+                this.error('Number, dimension, ratio or identifier is expected');
+        }
+
+        this.skipSC();
+    }
+
+    if (!this.eof) {
+        this.eat(RightParenthesis);
+    }
+
+    return {
+        type: 'Feature',
+        loc: this.getLocation(start, this.tokenStart),
+        kind,
+        name,
+        value
+    };
+}
+
+export function generate(node) {
+    this.token(LeftParenthesis, '(');
+    this.token(Ident, node.name);
+
+    if (node.value !== null) {
+        this.token(Colon, ':');
+        this.node(node.value);
+    }
+
+    this.token(RightParenthesis, ')');
+}
diff -pruN 2.3.1-1/lib/syntax/node/FeatureFunction.js 3.1.0-1/lib/syntax/node/FeatureFunction.js
--- 2.3.1-1/lib/syntax/node/FeatureFunction.js	1970-01-01 00:00:00.000000000 +0000
+++ 3.1.0-1/lib/syntax/node/FeatureFunction.js	2024-12-06 17:25:18.000000000 +0000
@@ -0,0 +1,63 @@
+import {
+    Function as FunctionToken,
+    RightParenthesis
+} from '../../tokenizer/index.js';
+
+export const name = 'FeatureFunction';
+export const structure = {
+    kind: String,
+    feature: String,
+    value: ['Declaration', 'Selector']
+};
+
+function getFeatureParser(kind, name) {
+    const featuresOfKind = this.features[kind] || {};
+    const parser = featuresOfKind[name];
+
+    if (typeof parser !== 'function') {
+        this.error(`Unknown feature ${name}()`);
+    }
+
+    return parser;
+}
+
+export function parse(kind = 'unknown') {
+    const start = this.tokenStart;
+    const functionName = this.consumeFunctionName();
+    const valueParser = getFeatureParser.call(this, kind, functionName.toLowerCase());
+
+    this.skipSC();
+
+    const value = this.parseWithFallback(
+        () => {
+            const startValueToken = this.tokenIndex;
+            const value = valueParser.call(this);
+
+            if (this.eof === false &&
+                this.isBalanceEdge(startValueToken) === false) {
+                this.error();
+            }
+
+            return value;
+        },
+        () => this.Raw(null, false)
+    );
+
+    if (!this.eof) {
+        this.eat(RightParenthesis);
+    }
+
+    return {
+        type: 'FeatureFunction',
+        loc: this.getLocation(start, this.tokenStart),
+        kind,
+        feature: functionName,
+        value
+    };
+}
+
+export function generate(node) {
+    this.token(FunctionToken, node.feature + '(');
+    this.node(node.value);
+    this.token(RightParenthesis, ')');
+}
diff -pruN 2.3.1-1/lib/syntax/node/FeatureRange.js 3.1.0-1/lib/syntax/node/FeatureRange.js
--- 2.3.1-1/lib/syntax/node/FeatureRange.js	1970-01-01 00:00:00.000000000 +0000
+++ 3.1.0-1/lib/syntax/node/FeatureRange.js	2024-12-06 17:25:18.000000000 +0000
@@ -0,0 +1,133 @@
+import {
+    Ident,
+    Number,
+    Dimension,
+    Function as FunctionToken,
+    LeftParenthesis,
+    RightParenthesis
+} from '../../tokenizer/index.js';
+
+const SOLIDUS = 0x002F;         // U+002F SOLIDUS (/)
+const LESSTHANSIGN = 0x003C;    // U+003C LESS-THAN SIGN (<)
+const EQUALSSIGN = 0x003D;      // U+003D EQUALS SIGN (=)
+const GREATERTHANSIGN = 0x003E; // U+003E GREATER-THAN SIGN (>)
+
+export const name = 'FeatureRange';
+export const structure = {
+    kind: String,
+    left: ['Identifier', 'Number', 'Dimension', 'Ratio', 'Function'],
+    leftComparison: String,
+    middle: ['Identifier', 'Number', 'Dimension', 'Ratio', 'Function'],
+    rightComparison: [String, null],
+    right: ['Identifier', 'Number', 'Dimension', 'Ratio', 'Function', null]
+};
+
+function readTerm() {
+    this.skipSC();
+
+    switch (this.tokenType) {
+        case Number:
+            if (this.isDelim(SOLIDUS, this.lookupOffsetNonSC(1))) {
+                return this.Ratio();
+            } else {
+                return this.Number();
+            }
+
+        case Dimension:
+            return this.Dimension();
+
+        case Ident:
+            return this.Identifier();
+
+        case FunctionToken:
+            return this.parseWithFallback(
+                () => {
+                    const res = this.Function(this.readSequence, this.scope.Value);
+
+                    this.skipSC();
+
+                    if (this.isDelim(SOLIDUS)) {
+                        this.error();
+                    }
+
+                    return res;
+                },
+                () => {
+                    return this.Ratio();
+                }
+            );
+
+        default:
+            this.error('Number, dimension, ratio or identifier is expected');
+    }
+}
+
+function readComparison(expectColon) {
+    this.skipSC();
+
+    if (this.isDelim(LESSTHANSIGN) ||
+        this.isDelim(GREATERTHANSIGN)) {
+        const value = this.source[this.tokenStart];
+
+        this.next();
+
+        if (this.isDelim(EQUALSSIGN)) {
+            this.next();
+            return value + '=';
+        }
+
+        return value;
+    }
+
+    if (this.isDelim(EQUALSSIGN)) {
+        return '=';
+    }
+
+    this.error(`Expected ${expectColon ? '":", ' : ''}"<", ">", "=" or ")"`);
+}
+
+export function parse(kind = 'unknown') {
+    const start = this.tokenStart;
+
+    this.skipSC();
+    this.eat(LeftParenthesis);
+
+    const left = readTerm.call(this);
+    const leftComparison = readComparison.call(this, left.type === 'Identifier');
+    const middle = readTerm.call(this);
+    let rightComparison = null;
+    let right = null;
+
+    if (this.lookupNonWSType(0) !== RightParenthesis) {
+        rightComparison = readComparison.call(this);
+        right = readTerm.call(this);
+    }
+
+    this.skipSC();
+    this.eat(RightParenthesis);
+
+    return {
+        type: 'FeatureRange',
+        loc: this.getLocation(start, this.tokenStart),
+        kind,
+        left,
+        leftComparison,
+        middle,
+        rightComparison,
+        right
+    };
+}
+
+export function generate(node) {
+    this.token(LeftParenthesis, '(');
+    this.node(node.left);
+    this.tokenize(node.leftComparison);
+    this.node(node.middle);
+
+    if (node.right) {
+        this.tokenize(node.rightComparison);
+        this.node(node.right);
+    }
+
+    this.token(RightParenthesis, ')');
+}
diff -pruN 2.3.1-1/lib/syntax/node/GeneralEnclosed.js 3.1.0-1/lib/syntax/node/GeneralEnclosed.js
--- 2.3.1-1/lib/syntax/node/GeneralEnclosed.js	1970-01-01 00:00:00.000000000 +0000
+++ 3.1.0-1/lib/syntax/node/GeneralEnclosed.js	2024-12-06 17:25:18.000000000 +0000
@@ -0,0 +1,66 @@
+import {
+    Function as FunctionToken,
+    LeftParenthesis,
+    RightParenthesis
+} from '../../tokenizer/index.js';
+
+
+export const name = 'GeneralEnclosed';
+export const structure = {
+    kind: String,
+    function: [String, null],
+    children: [[]]
+};
+
+// <function-token> <any-value> )
+// ( <any-value> )
+export function parse(kind) {
+    const start = this.tokenStart;
+    let functionName = null;
+
+    if (this.tokenType === FunctionToken) {
+        functionName = this.consumeFunctionName();
+    } else {
+        this.eat(LeftParenthesis);
+    }
+
+    const children = this.parseWithFallback(
+        () => {
+            const startValueToken = this.tokenIndex;
+            const children = this.readSequence(this.scope.Value);
+
+            if (this.eof === false &&
+                this.isBalanceEdge(startValueToken) === false) {
+                this.error();
+            }
+
+            return children;
+        },
+        () => this.createSingleNodeList(
+            this.Raw(null, false)
+        )
+    );
+
+    if (!this.eof) {
+        this.eat(RightParenthesis);
+    }
+
+    return {
+        type: 'GeneralEnclosed',
+        loc: this.getLocation(start, this.tokenStart),
+        kind,
+        function: functionName,
+        children
+    };
+}
+
+export function generate(node) {
+    if (node.function) {
+        this.token(FunctionToken, node.function + '(');
+    } else {
+        this.token(LeftParenthesis, '(');
+    }
+
+    this.children(node);
+    this.token(RightParenthesis, ')');
+}
diff -pruN 2.3.1-1/lib/syntax/node/Layer.js 3.1.0-1/lib/syntax/node/Layer.js
--- 2.3.1-1/lib/syntax/node/Layer.js	1970-01-01 00:00:00.000000000 +0000
+++ 3.1.0-1/lib/syntax/node/Layer.js	2024-12-06 17:25:18.000000000 +0000
@@ -0,0 +1,28 @@
+import { Ident, Delim } from '../../tokenizer/index.js';
+
+const FULLSTOP = 0x002E; // U+002E FULL STOP (.)
+
+export const name = 'Layer';
+export const structure = {
+    name: String
+};
+
+export function parse() {
+    let tokenStart = this.tokenStart;
+    let name = this.consume(Ident);
+
+    while (this.isDelim(FULLSTOP)) {
+        this.eat(Delim);
+        name += '.' + this.consume(Ident);
+    }
+
+    return {
+        type: 'Layer',
+        loc: this.getLocation(tokenStart, this.tokenStart),
+        name
+    };
+}
+
+export function generate(node) {
+    this.tokenize(node.name);
+}
diff -pruN 2.3.1-1/lib/syntax/node/LayerList.js 3.1.0-1/lib/syntax/node/LayerList.js
--- 2.3.1-1/lib/syntax/node/LayerList.js	1970-01-01 00:00:00.000000000 +0000
+++ 3.1.0-1/lib/syntax/node/LayerList.js	2024-12-06 17:25:18.000000000 +0000
@@ -0,0 +1,36 @@
+import { Comma } from '../../tokenizer/index.js';
+
+export const name = 'LayerList';
+export const structure = {
+    children: [[
+        'Layer'
+    ]]
+};
+
+export function parse() {
+    const children = this.createList();
+
+    this.skipSC();
+
+    while (!this.eof) {
+        children.push(this.Layer());
+
+        if (this.lookupTypeNonSC(0) !== Comma) {
+            break;
+        }
+
+        this.skipSC();
+        this.next();
+        this.skipSC();
+    }
+
+    return {
+        type: 'LayerList',
+        loc: this.getLocationFromList(children),
+        children
+    };
+}
+
+export function generate(node) {
+    this.children(node, () => this.token(Comma, ','));
+}
diff -pruN 2.3.1-1/lib/syntax/node/MediaFeature.js 3.1.0-1/lib/syntax/node/MediaFeature.js
--- 2.3.1-1/lib/syntax/node/MediaFeature.js	2022-12-14 17:31:12.000000000 +0000
+++ 3.1.0-1/lib/syntax/node/MediaFeature.js	1970-01-01 00:00:00.000000000 +0000
@@ -1,77 +0,0 @@
-import {
-    Ident,
-    Number,
-    Dimension,
-    LeftParenthesis,
-    RightParenthesis,
-    Colon,
-    Delim
-} from '../../tokenizer/index.js';
-
-export const name = 'MediaFeature';
-export const structure = {
-    name: String,
-    value: ['Identifier', 'Number', 'Dimension', 'Ratio', null]
-};
-
-export function parse() {
-    const start = this.tokenStart;
-    let name;
-    let value = null;
-
-    this.eat(LeftParenthesis);
-    this.skipSC();
-
-    name = this.consume(Ident);
-    this.skipSC();
-
-    if (this.tokenType !== RightParenthesis) {
-        this.eat(Colon);
-        this.skipSC();
-
-        switch (this.tokenType) {
-            case Number:
-                if (this.lookupNonWSType(1) === Delim) {
-                    value = this.Ratio();
-                } else {
-                    value = this.Number();
-                }
-
-                break;
-
-            case Dimension:
-                value = this.Dimension();
-                break;
-
-            case Ident:
-                value = this.Identifier();
-                break;
-
-            default:
-                this.error('Number, dimension, ratio or identifier is expected');
-        }
-
-        this.skipSC();
-    }
-
-    this.eat(RightParenthesis);
-
-    return {
-        type: 'MediaFeature',
-        loc: this.getLocation(start, this.tokenStart),
-        name,
-        value
-    };
-}
-
-export function generate(node) {
-    this.token(LeftParenthesis, '(');
-    this.token(Ident, node.name);
-
-    if (node.value !== null) {
-        this.token(Colon, ':');
-        this.node(node.value);
-    }
-
-    this.token(RightParenthesis, ')');
-}
diff -pruN 2.3.1-1/lib/syntax/node/MediaQuery.js 3.1.0-1/lib/syntax/node/MediaQuery.js
--- 2.3.1-1/lib/syntax/node/MediaQuery.js	2022-12-14 17:31:12.000000000 +0000
+++ 3.1.0-1/lib/syntax/node/MediaQuery.js	2024-12-06 17:25:18.000000000 +0000
@@ -1,60 +1,102 @@
 import {
-    WhiteSpace,
-    Comment,
+    Comma,
+    EOF,
     Ident,
-    LeftParenthesis
+    LeftCurlyBracket,
+    LeftParenthesis,
+    Function as FunctionToken,
+    Semicolon
 } from '../../tokenizer/index.js';
 
 export const name = 'MediaQuery';
 export const structure = {
-    children: [[
-        'Identifier',
-        'MediaFeature',
-        'WhiteSpace'
-    ]]
+    modifier: [String, null],
+    mediaType: [String, null],
+    condition: ['Condition', null]
 };
 
 export function parse() {
-    const children = this.createList();
-    let child = null;
+    const start = this.tokenStart;
+    let modifier = null;
+    let mediaType = null;
+    let condition = null;
 
     this.skipSC();
 
-    scan:
-    while (!this.eof) {
-        switch (this.tokenType) {
-            case Comment:
-            case WhiteSpace:
-                this.next();
-                continue;
+    if (this.tokenType === Ident && this.lookupTypeNonSC(1) !== LeftParenthesis) {
+        // [ not | only ]? <media-type>
+        const ident = this.consume(Ident);
+        const identLowerCase = ident.toLowerCase();
+
+        if (identLowerCase === 'not' || identLowerCase === 'only') {
+            this.skipSC();
+            modifier = identLowerCase;
+            mediaType = this.consume(Ident);
+        } else {
+            mediaType = ident;
+        }
 
-            case Ident:
-                child = this.Identifier();
+        switch (this.lookupTypeNonSC(0)) {
+            case Ident: {
+                // and <media-condition-without-or>
+                this.skipSC();
+                this.eatIdent('and');
+                condition = this.Condition('media');
                 break;
+            }
 
-            case LeftParenthesis:
-                child = this.MediaFeature();
+            case LeftCurlyBracket:
+            case Semicolon:
+            case Comma:
+            case EOF:
                 break;
 
             default:
-                break scan;
+                this.error('Identifier or parenthesis is expected');
         }
+    } else {
+        switch (this.tokenType) {
+            case Ident:
+            case LeftParenthesis:
+            case FunctionToken: {
+                // <media-condition>
+                condition = this.Condition('media');
+                break;
+            }
 
-        children.push(child);
-    }
+            case LeftCurlyBracket:
+            case Semicolon:
+            case EOF:
+                break;
 
-    if (child === null) {
-        this.error('Identifier or parenthesis is expected');
+            default:
+                this.error('Identifier or parenthesis is expected');
+        }
     }
 
     return {
         type: 'MediaQuery',
-        loc: this.getLocationFromList(children),
-        children
+        loc: this.getLocation(start, this.tokenStart),
+        modifier,
+        mediaType,
+        condition
     };
 }
 
 export function generate(node) {
-    this.children(node);
+    if (node.mediaType) {
+        if (node.modifier) {
+            this.token(Ident, node.modifier);
+        }
+
+        this.token(Ident, node.mediaType);
+
+        if (node.condition) {
+            this.token(Ident, 'and');
+            this.node(node.condition);
+        }
+    } else if (node.condition) {
+        this.node(node.condition);
+    }
 }
 
diff -pruN 2.3.1-1/lib/syntax/node/PseudoClassSelector.js 3.1.0-1/lib/syntax/node/PseudoClassSelector.js
--- 2.3.1-1/lib/syntax/node/PseudoClassSelector.js	2022-12-14 17:31:12.000000000 +0000
+++ 3.1.0-1/lib/syntax/node/PseudoClassSelector.js	2024-12-06 17:25:18.000000000 +0000
@@ -26,14 +26,16 @@ export function parse() {
         name = this.consumeFunctionName();
         nameLowerCase = name.toLowerCase();
 
-        if (hasOwnProperty.call(this.pseudo, nameLowerCase)) {
+        if (this.lookupNonWSType(0) == RightParenthesis) {
+            children = this.createList();
+        } else if (hasOwnProperty.call(this.pseudo, nameLowerCase)) {
             this.skipSC();
             children = this.pseudo[nameLowerCase].call(this);
             this.skipSC();
         } else {
             children = this.createList();
             children.push(
-                this.Raw(this.tokenIndex, null, false)
+                this.Raw(null, false)
             );
         }
 
diff -pruN 2.3.1-1/lib/syntax/node/PseudoElementSelector.js 3.1.0-1/lib/syntax/node/PseudoElementSelector.js
--- 2.3.1-1/lib/syntax/node/PseudoElementSelector.js	2022-12-14 17:31:12.000000000 +0000
+++ 3.1.0-1/lib/syntax/node/PseudoElementSelector.js	2024-12-06 17:25:18.000000000 +0000
@@ -26,14 +26,16 @@ export function parse() {
         name = this.consumeFunctionName();
         nameLowerCase = name.toLowerCase();
 
-        if (hasOwnProperty.call(this.pseudo, nameLowerCase)) {
+        if (this.lookupNonWSType(0) == RightParenthesis) {
+            children = this.createList();
+        } else if (hasOwnProperty.call(this.pseudo, nameLowerCase)) {
             this.skipSC();
             children = this.pseudo[nameLowerCase].call(this);
             this.skipSC();
         } else {
             children = this.createList();
             children.push(
-                this.Raw(this.tokenIndex, null, false)
+                this.Raw(null, false)
             );
         }
 
diff -pruN 2.3.1-1/lib/syntax/node/Ratio.js 3.1.0-1/lib/syntax/node/Ratio.js
--- 2.3.1-1/lib/syntax/node/Ratio.js	2022-12-14 17:31:12.000000000 +0000
+++ 3.1.0-1/lib/syntax/node/Ratio.js	2024-12-06 17:25:18.000000000 +0000
@@ -1,48 +1,53 @@
-import { isDigit, Delim, Number as NumberToken } from '../../tokenizer/index.js';
+import {
+    Delim,
+    Number as NumberToken,
+    Function as FunctionToken
+} from '../../tokenizer/index.js';
 
 const SOLIDUS = 0x002F;  // U+002F SOLIDUS (/)
-const FULLSTOP = 0x002E; // U+002E FULL STOP (.)
 
-// Terms of <ratio> should be a positive numbers (not zero or negative)
-// (see https://drafts.csswg.org/mediaqueries-3/#values)
-// However, -o-min-device-pixel-ratio takes fractional values as a ratio's term
-// and this is using by various sites. Therefore we relax checking on parse
-// to test a term is unsigned number without an exponent part.
-// Additional checking may be applied on lexer validation.
-function consumeNumber() {
+// Media Queries Level 3 defines terms of <ratio> as a positive (not zero or negative)
+// integers (see https://drafts.csswg.org/mediaqueries-3/#values)
+// However, Media Queries Level 4 removes any definition of values
+// (see https://drafts.csswg.org/mediaqueries-4/#values) and refers to
+// CSS Values and Units for detail. In CSS Values and Units Level 4 a <ratio>
+// definition was added (see https://drafts.csswg.org/css-values-4/#ratios) which
+// defines ratio as "<number [0,∞]> [ / <number [0,∞]> ]?" and based on it
+// any constrains on terms were removed. Parser also doesn't test numbers
+// in any way to make possible for linting and fixing them by the tools using CSSTree.
+// An additional syntax examination may be applied by a lexer.
+function consumeTerm() {
     this.skipSC();
 
-    const value = this.consume(NumberToken);
+    switch (this.tokenType) {
+        case NumberToken:
+            return this.Number();
 
-    for (let i = 0; i < value.length; i++) {
-        const code = value.charCodeAt(i);
-        if (!isDigit(code) && code !== FULLSTOP) {
-            this.error('Unsigned number is expected', this.tokenStart - value.length + i);
-        }
-    }
+        case FunctionToken:
+            return this.Function(this.readSequence, this.scope.Value);
 
-    if (Number(value) === 0) {
-        this.error('Zero number is not allowed', this.tokenStart - value.length);
+        default:
+            this.error('Number of function is expected');
     }
-
-    return value;
 }
 
 export const name = 'Ratio';
 export const structure = {
-    left: String,
-    right: String
+    left: ['Number', 'Function'],
+    right: ['Number', 'Function', null]
 };
 
-// <positive-integer> S* '/' S* <positive-integer>
+// <number [0,∞]> [ / <number [0,∞]> ]?
 export function parse() {
     const start = this.tokenStart;
-    const left = consumeNumber.call(this);
-    let right;
+    const left = consumeTerm.call(this);
+    let right = null;
 
     this.skipSC();
-    this.eatDelim(SOLIDUS);
-    right = consumeNumber.call(this);
+    if (this.isDelim(SOLIDUS)) {
+        this.eatDelim(SOLIDUS);
+        right = consumeTerm.call(this);
+    }
 
     return {
         type: 'Ratio',
@@ -53,7 +58,11 @@ export function parse() {
 }
 
 export function generate(node) {
-    this.token(NumberToken, node.left);
+    this.node(node.left);
     this.token(Delim, '/');
-    this.token(NumberToken, node.right);
+    if (node.right) {
+        this.node(node.right);
+    } else {
+        this.node(NumberToken, 1);
+    }
 }
diff -pruN 2.3.1-1/lib/syntax/node/Raw.js 3.1.0-1/lib/syntax/node/Raw.js
--- 2.3.1-1/lib/syntax/node/Raw.js	2022-12-14 17:31:12.000000000 +0000
+++ 3.1.0-1/lib/syntax/node/Raw.js	2024-12-06 17:25:18.000000000 +0000
@@ -17,11 +17,11 @@ export const structure = {
     value: String
 };
 
-export function parse(startToken, consumeUntil, excludeWhiteSpace) {
-    const startOffset = this.getTokenStart(startToken);
+export function parse(consumeUntil, excludeWhiteSpace) {
+    const startOffset = this.getTokenStart(this.tokenIndex);
     let endOffset;
 
-    this.skipUntilBalanced(startToken, consumeUntil || this.consumeUntilBalanceEnd);
+    this.skipUntilBalanced(this.tokenIndex, consumeUntil || this.consumeUntilBalanceEnd);
 
     if (excludeWhiteSpace && this.tokenStart > startOffset) {
         endOffset = getOffsetExcludeWS.call(this);
diff -pruN 2.3.1-1/lib/syntax/node/Rule.js 3.1.0-1/lib/syntax/node/Rule.js
--- 2.3.1-1/lib/syntax/node/Rule.js	2022-12-14 17:31:12.000000000 +0000
+++ 3.1.0-1/lib/syntax/node/Rule.js	2024-12-06 17:25:18.000000000 +0000
@@ -1,7 +1,7 @@
 import { LeftCurlyBracket } from '../../tokenizer/index.js';
 
-function consumeRaw(startToken) {
-    return this.Raw(startToken, this.consumeUntilLeftCurlyBracket, true);
+function consumeRaw() {
+    return this.Raw(this.consumeUntilLeftCurlyBracket, true);
 }
 
 function consumePrelude() {
diff -pruN 2.3.1-1/lib/syntax/node/Scope.js 3.1.0-1/lib/syntax/node/Scope.js
--- 2.3.1-1/lib/syntax/node/Scope.js	1970-01-01 00:00:00.000000000 +0000
+++ 3.1.0-1/lib/syntax/node/Scope.js	2024-12-06 17:25:18.000000000 +0000
@@ -0,0 +1,66 @@
+import {
+    Ident,
+    LeftParenthesis,
+    RightParenthesis
+} from '../../tokenizer/index.js';
+
+export const name = 'Scope';
+export const structure = {
+    root: ['SelectorList', 'Raw', null],
+    limit: ['SelectorList', 'Raw', null]
+};
+
+export function parse() {
+    let root = null;
+    let limit = null;
+
+    this.skipSC();
+
+    const startOffset = this.tokenStart;
+    if (this.tokenType === LeftParenthesis) {
+        this.next();
+        this.skipSC();
+        root = this.parseWithFallback(
+            this.SelectorList,
+            () => this.Raw(false, true)
+        );
+        this.skipSC();
+        this.eat(RightParenthesis);
+    }
+
+    if (this.lookupNonWSType(0) === Ident) {
+        this.skipSC();
+        this.eatIdent('to');
+        this.skipSC();
+        this.eat(LeftParenthesis);
+        this.skipSC();
+        limit = this.parseWithFallback(
+            this.SelectorList,
+            () => this.Raw(false, true)
+        );
+        this.skipSC();
+        this.eat(RightParenthesis);
+    }
+
+    return {
+        type: 'Scope',
+        loc: this.getLocation(startOffset, this.tokenStart),
+        root,
+        limit
+    };
+}
+
+export function generate(node) {
+    if (node.root) {
+        this.token(LeftParenthesis, '(');
+        this.node(node.root);
+        this.token(RightParenthesis, ')');
+    }
+
+    if (node.limit) {
+        this.token(Ident, 'to');
+        this.token(LeftParenthesis, '(');
+        this.node(node.limit);
+        this.token(RightParenthesis, ')');
+    }
+}
diff -pruN 2.3.1-1/lib/syntax/node/Selector.js 3.1.0-1/lib/syntax/node/Selector.js
--- 2.3.1-1/lib/syntax/node/Selector.js	2022-12-14 17:31:12.000000000 +0000
+++ 3.1.0-1/lib/syntax/node/Selector.js	2024-12-06 17:25:18.000000000 +0000
@@ -7,8 +7,7 @@ export const structure = {
         'AttributeSelector',
         'PseudoClassSelector',
         'PseudoElementSelector',
-        'Combinator',
-        'WhiteSpace'
+        'Combinator'
     ]]
 };
 
diff -pruN 2.3.1-1/lib/syntax/node/StyleSheet.js 3.1.0-1/lib/syntax/node/StyleSheet.js
--- 2.3.1-1/lib/syntax/node/StyleSheet.js	2022-12-14 17:31:12.000000000 +0000
+++ 3.1.0-1/lib/syntax/node/StyleSheet.js	2024-12-06 17:25:18.000000000 +0000
@@ -8,8 +8,8 @@ import {
 
 const EXCLAMATIONMARK = 0x0021; // U+0021 EXCLAMATION MARK (!)
 
-function consumeRaw(startToken) {
-    return this.Raw(startToken, null, false);
+function consumeRaw() {
+    return this.Raw(null, false);
 }
 
 export const name = 'StyleSheet';
diff -pruN 2.3.1-1/lib/syntax/node/SupportsDeclaration.js 3.1.0-1/lib/syntax/node/SupportsDeclaration.js
--- 2.3.1-1/lib/syntax/node/SupportsDeclaration.js	1970-01-01 00:00:00.000000000 +0000
+++ 3.1.0-1/lib/syntax/node/SupportsDeclaration.js	2024-12-06 17:25:18.000000000 +0000
@@ -0,0 +1,34 @@
+import {
+    LeftParenthesis,
+    RightParenthesis
+} from '../../tokenizer/index.js';
+
+export const name = 'SupportsDeclaration';
+export const structure = {
+    declaration: 'Declaration'
+};
+
+export function parse() {
+    const start = this.tokenStart;
+
+    this.eat(LeftParenthesis);
+    this.skipSC();
+
+    const declaration = this.Declaration();
+
+    if (!this.eof) {
+        this.eat(RightParenthesis);
+    }
+
+    return {
+        type: 'SupportsDeclaration',
+        loc: this.getLocation(start, this.tokenStart),
+        declaration
+    };
+}
+
+export function generate(node) {
+    this.token(LeftParenthesis, '(');
+    this.node(node.declaration);
+    this.token(RightParenthesis, ')');
+}
diff -pruN 2.3.1-1/lib/syntax/node/index-generate.js 3.1.0-1/lib/syntax/node/index-generate.js
--- 2.3.1-1/lib/syntax/node/index-generate.js	2022-12-14 17:31:12.000000000 +0000
+++ 3.1.0-1/lib/syntax/node/index-generate.js	2024-12-06 17:25:18.000000000 +0000
@@ -9,14 +9,20 @@ export { generate as CDO } from './CDO.j
 export { generate as ClassSelector } from './ClassSelector.js';
 export { generate as Combinator } from './Combinator.js';
 export { generate as Comment } from './Comment.js';
+export { generate as Condition } from './Condition.js';
 export { generate as Declaration } from './Declaration.js';
 export { generate as DeclarationList } from './DeclarationList.js';
 export { generate as Dimension } from './Dimension.js';
+export { generate as Feature } from './Feature.js';
+export { generate as FeatureFunction } from './FeatureFunction.js';
+export { generate as FeatureRange } from './FeatureRange.js';
 export { generate as Function } from './Function.js';
+export { generate as GeneralEnclosed } from './GeneralEnclosed.js';
 export { generate as Hash } from './Hash.js';
 export { generate as Identifier } from './Identifier.js';
 export { generate as IdSelector } from './IdSelector.js';
-export { generate as MediaFeature } from './MediaFeature.js';
+export { generate as Layer } from './Layer.js';
+export { generate as LayerList } from './LayerList.js';
 export { generate as MediaQuery } from './MediaQuery.js';
 export { generate as MediaQueryList } from './MediaQueryList.js';
 export { generate as NestingSelector } from './NestingSelector.js';
@@ -30,10 +36,12 @@ export { generate as PseudoElementSelect
 export { generate as Ratio } from './Ratio.js';
 export { generate as Raw } from './Raw.js';
 export { generate as Rule } from './Rule.js';
+export { generate as Scope } from './Scope.js';
 export { generate as Selector } from './Selector.js';
 export { generate as SelectorList } from './SelectorList.js';
 export { generate as String } from './String.js';
 export { generate as StyleSheet } from './StyleSheet.js';
+export { generate as SupportsDeclaration } from './SupportsDeclaration.js';
 export { generate as TypeSelector } from './TypeSelector.js';
 export { generate as UnicodeRange } from './UnicodeRange.js';
 export { generate as Url } from './Url.js';
diff -pruN 2.3.1-1/lib/syntax/node/index-parse-selector.js 3.1.0-1/lib/syntax/node/index-parse-selector.js
--- 2.3.1-1/lib/syntax/node/index-parse-selector.js	2022-12-14 17:31:12.000000000 +0000
+++ 3.1.0-1/lib/syntax/node/index-parse-selector.js	2024-12-06 17:25:18.000000000 +0000
@@ -6,6 +6,7 @@ export { parse as Identifier } from './I
 export { parse as IdSelector } from './IdSelector.js';
 export { parse as NestingSelector } from './NestingSelector.js';
 export { parse as Nth } from './Nth.js';
+export { parse as Operator } from './Operator.js';
 export { parse as Percentage } from './Percentage.js';
 export { parse as PseudoClassSelector } from './PseudoClassSelector.js';
 export { parse as PseudoElementSelector } from './PseudoElementSelector.js';
diff -pruN 2.3.1-1/lib/syntax/node/index-parse.js 3.1.0-1/lib/syntax/node/index-parse.js
--- 2.3.1-1/lib/syntax/node/index-parse.js	2022-12-14 17:31:12.000000000 +0000
+++ 3.1.0-1/lib/syntax/node/index-parse.js	2024-12-06 17:25:18.000000000 +0000
@@ -9,14 +9,20 @@ export { parse as CDO } from './CDO.js';
 export { parse as ClassSelector } from './ClassSelector.js';
 export { parse as Combinator } from './Combinator.js';
 export { parse as Comment } from './Comment.js';
+export { parse as Condition } from './Condition.js';
 export { parse as Declaration } from './Declaration.js';
 export { parse as DeclarationList } from './DeclarationList.js';
 export { parse as Dimension } from './Dimension.js';
+export { parse as Feature } from './Feature.js';
+export { parse as FeatureFunction } from './FeatureFunction.js';
+export { parse as FeatureRange } from './FeatureRange.js';
 export { parse as Function } from './Function.js';
+export { parse as GeneralEnclosed } from './GeneralEnclosed.js';
 export { parse as Hash } from './Hash.js';
 export { parse as Identifier } from './Identifier.js';
 export { parse as IdSelector } from './IdSelector.js';
-export { parse as MediaFeature } from './MediaFeature.js';
+export { parse as Layer } from './Layer.js';
+export { parse as LayerList } from './LayerList.js';
 export { parse as MediaQuery } from './MediaQuery.js';
 export { parse as MediaQueryList } from './MediaQueryList.js';
 export { parse as NestingSelector } from './NestingSelector.js';
@@ -30,10 +36,12 @@ export { parse as PseudoElementSelector
 export { parse as Ratio } from './Ratio.js';
 export { parse as Raw } from './Raw.js';
 export { parse as Rule } from './Rule.js';
+export { parse as Scope } from './Scope.js';
 export { parse as Selector } from './Selector.js';
 export { parse as SelectorList } from './SelectorList.js';
 export { parse as String } from './String.js';
 export { parse as StyleSheet } from './StyleSheet.js';
+export { parse as SupportsDeclaration } from './SupportsDeclaration.js';
 export { parse as TypeSelector } from './TypeSelector.js';
 export { parse as UnicodeRange } from './UnicodeRange.js';
 export { parse as Url } from './Url.js';
diff -pruN 2.3.1-1/lib/syntax/node/index.js 3.1.0-1/lib/syntax/node/index.js
--- 2.3.1-1/lib/syntax/node/index.js	2022-12-14 17:31:12.000000000 +0000
+++ 3.1.0-1/lib/syntax/node/index.js	2024-12-06 17:25:18.000000000 +0000
@@ -9,14 +9,20 @@ export * as CDO from './CDO.js';
 export * as ClassSelector from './ClassSelector.js';
 export * as Combinator from './Combinator.js';
 export * as Comment from './Comment.js';
+export * as Condition from './Condition.js';
 export * as Declaration from './Declaration.js';
 export * as DeclarationList from './DeclarationList.js';
 export * as Dimension from './Dimension.js';
+export * as Feature from './Feature.js';
+export * as FeatureFunction from './FeatureFunction.js';
+export * as FeatureRange from './FeatureRange.js';
 export * as Function from './Function.js';
+export * as GeneralEnclosed from './GeneralEnclosed.js';
 export * as Hash from './Hash.js';
 export * as Identifier from './Identifier.js';
 export * as IdSelector from './IdSelector.js';
-export * as MediaFeature from './MediaFeature.js';
+export * as Layer from './Layer.js';
+export * as LayerList from './LayerList.js';
 export * as MediaQuery from './MediaQuery.js';
 export * as MediaQueryList from './MediaQueryList.js';
 export * as NestingSelector from './NestingSelector.js';
@@ -30,10 +36,12 @@ export * as PseudoElementSelector from '
 export * as Ratio from './Ratio.js';
 export * as Raw from './Raw.js';
 export * as Rule from './Rule.js';
+export * as Scope from './Scope.js';
 export * as Selector from './Selector.js';
 export * as SelectorList from './SelectorList.js';
 export * as String from './String.js';
 export * as StyleSheet from './StyleSheet.js';
+export * as SupportsDeclaration from './SupportsDeclaration.js';
 export * as TypeSelector from './TypeSelector.js';
 export * as UnicodeRange from './UnicodeRange.js';
 export * as Url from './Url.js';
diff -pruN 2.3.1-1/lib/syntax/pseudo/index.js 3.1.0-1/lib/syntax/pseudo/index.js
--- 2.3.1-1/lib/syntax/pseudo/index.js	2022-12-14 17:31:12.000000000 +0000
+++ 3.1.0-1/lib/syntax/pseudo/index.js	2024-12-06 17:25:18.000000000 +0000
@@ -1,3 +1,5 @@
+import { parseLanguageRangeList } from './lang.js';
+
 const selectorList = {
     parse() {
         return this.createSingleNodeList(
@@ -22,6 +24,10 @@ const identList = {
     }
 };
 
+const langList = {
+    parse: parseLanguageRangeList
+};
+
 const nth = {
     parse() {
         return this.createSingleNodeList(
@@ -33,7 +39,7 @@ const nth = {
 export default {
     'dir': identList,
     'has': selectorList,
-    'lang': identList,
+    'lang': langList,
     'matches': selectorList,
     'is': selectorList,
     '-moz-any': selectorList,
diff -pruN 2.3.1-1/lib/syntax/pseudo/lang.js 3.1.0-1/lib/syntax/pseudo/lang.js
--- 2.3.1-1/lib/syntax/pseudo/lang.js	1970-01-01 00:00:00.000000000 +0000
+++ 3.1.0-1/lib/syntax/pseudo/lang.js	2024-12-06 17:25:18.000000000 +0000
@@ -0,0 +1,33 @@
+import { Comma, String as StringToken, Ident, RightParenthesis } from '../../tokenizer/index.js';
+
+export function parseLanguageRangeList() {
+    const children = this.createList();
+
+    this.skipSC();
+
+    loop: while (!this.eof) {
+        switch (this.tokenType) {
+            case Ident:
+                children.push(this.Identifier());
+                break;
+
+            case StringToken:
+                children.push(this.String());
+                break;
+
+            case Comma:
+                children.push(this.Operator());
+                break;
+
+            case RightParenthesis:
+                break loop;
+
+            default:
+                this.error('Identifier, string or comma is expected');
+        }
+
+        this.skipSC();
+    }
+
+    return children;
+}
diff -pruN 2.3.1-1/lib/tokenizer/OffsetToLocation.js 3.1.0-1/lib/tokenizer/OffsetToLocation.js
--- 2.3.1-1/lib/tokenizer/OffsetToLocation.js	2022-12-14 17:31:12.000000000 +0000
+++ 3.1.0-1/lib/tokenizer/OffsetToLocation.js	2024-12-06 17:25:18.000000000 +0000
@@ -41,12 +41,12 @@ function computeLinesAndColumns(host) {
 }
 
 export class OffsetToLocation {
-    constructor() {
+    constructor(source, startOffset, startLine, startColumn) {
+        this.setSource(source, startOffset, startLine, startColumn);
         this.lines = null;
         this.columns = null;
-        this.computed = false;
     }
-    setSource(source, startOffset = 0, startLine = 1, startColumn = 1) {
+    setSource(source = '', startOffset = 0, startLine = 1, startColumn = 1) {
         this.source = source;
         this.startOffset = startOffset;
         this.startLine = startLine;
diff -pruN 2.3.1-1/lib/tokenizer/TokenStream.js 3.1.0-1/lib/tokenizer/TokenStream.js
--- 2.3.1-1/lib/tokenizer/TokenStream.js	2022-12-14 17:31:12.000000000 +0000
+++ 3.1.0-1/lib/tokenizer/TokenStream.js	2024-12-06 17:25:18.000000000 +0000
@@ -17,12 +17,15 @@ import {
 
 const OFFSET_MASK = 0x00FFFFFF;
 const TYPE_SHIFT = 24;
-const balancePair = new Map([
-    [FunctionToken, RightParenthesis],
-    [LeftParenthesis, RightParenthesis],
-    [LeftSquareBracket, RightSquareBracket],
-    [LeftCurlyBracket, RightCurlyBracket]
-]);
+const balancePair = new Uint8Array(32); // 32b of memory ought to be enough for anyone (any number of tokens)
+balancePair[FunctionToken] = RightParenthesis;
+balancePair[LeftParenthesis] = RightParenthesis;
+balancePair[LeftSquareBracket] = RightSquareBracket;
+balancePair[LeftCurlyBracket] = RightCurlyBracket;
+
+function isBlockOpenerToken(tokenType) {
+    return balancePair[tokenType] !== 0;
+}
 
 export class TokenStream {
     constructor(source, tokenize) {
@@ -42,60 +45,74 @@ export class TokenStream {
         const offsetAndType = adoptBuffer(this.offsetAndType, source.length + 1); // +1 because of eof-token
         const balance = adoptBuffer(this.balance, source.length + 1);
         let tokenCount = 0;
-        let balanceCloseType = 0;
-        let balanceStart = 0;
         let firstCharOffset = -1;
+        let balanceCloseType = 0;
+        let balanceStart = source.length;
 
         // capture buffers
         this.offsetAndType = null;
         this.balance = null;
+        balance.fill(0);
 
         tokenize(source, (type, start, end) => {
-            switch (type) {
-                default:
-                    balance[tokenCount] = sourceLength;
-                    break;
-
-                case balanceCloseType: {
-                    let balancePrev = balanceStart & OFFSET_MASK;
-                    balanceStart = balance[balancePrev];
-                    balanceCloseType = balanceStart >> TYPE_SHIFT;
-                    balance[tokenCount] = balancePrev;
-                    balance[balancePrev++] = tokenCount;
-                    for (; balancePrev < tokenCount; balancePrev++) {
-                        if (balance[balancePrev] === sourceLength) {
-                            balance[balancePrev] = tokenCount;
-                        }
-                    }
-                    break;
-                }
+            const index = tokenCount++;
 
-                case LeftParenthesis:
-                case FunctionToken:
-                case LeftSquareBracket:
-                case LeftCurlyBracket:
-                    balance[tokenCount] = balanceStart;
-                    balanceCloseType = balancePair.get(type);
-                    balanceStart = (balanceCloseType << TYPE_SHIFT) | tokenCount;
-                    break;
-            }
+            // type & offset
+            offsetAndType[index] = (type << TYPE_SHIFT) | end;
 
-            offsetAndType[tokenCount++] = (type << TYPE_SHIFT) | end;
             if (firstCharOffset === -1) {
                 firstCharOffset = start;
             }
+
+            // balance
+            balance[index] = balanceStart;
+
+            if (type === balanceCloseType) {
+                const prevBalanceStart = balance[balanceStart];
+
+                // set reference to balance end for a block opener
+                balance[balanceStart] = index;
+
+                // pop state
+                balanceStart = prevBalanceStart;
+                balanceCloseType = balancePair[offsetAndType[prevBalanceStart] >> TYPE_SHIFT];
+            } else if (isBlockOpenerToken(type)) { // check for FunctionToken, <(-token>, <[-token> and <{-token>
+                // push state
+                balanceStart = index;
+                balanceCloseType = balancePair[type];
+            }
         });
 
         // finalize buffers
         offsetAndType[tokenCount] = (EOF << TYPE_SHIFT) | sourceLength; // <EOF-token>
-        balance[tokenCount] = sourceLength;
-        balance[sourceLength] = sourceLength; // prevents false positive balance match with any token
-        while (balanceStart !== 0) {
-            const balancePrev = balanceStart & OFFSET_MASK;
-            balanceStart = balance[balancePrev];
-            balance[balancePrev] = sourceLength;
+        balance[tokenCount] = tokenCount; // prevents false positive balance match with any token
+
+        // reverse references from balance start to end
+        // tokens
+        //   token:   a ( [ b c ] d e ) {
+        //   index:   0 1 2 3 4 5 6 7 8 9
+        // before
+        //   balance: 0 8 5 2 2 2 1 1 1 0
+        //            - > > < < < < < < -
+        // after
+        //   balance: 9 8 5 5 5 2 8 8 1 9
+        //            > > > > > < > > < >
+        for (let i = 0; i < tokenCount; i++) {
+            const balanceStart = balance[i];
+
+            if (balanceStart <= i) {
+                const balanceEnd = balance[balanceStart];
+
+                if (balanceEnd !== i) {
+                    balance[i] = balanceEnd;
+                }
+            } else if (balanceStart > tokenCount) {
+                balance[i] = tokenCount;
+            }
         }
 
+        // balance[0] = tokenCount;
+
         this.source = source;
         this.firstCharOffset = firstCharOffset === -1 ? 0 : firstCharOffset;
         this.tokenCount = tokenCount;
@@ -115,6 +132,19 @@ export class TokenStream {
 
         return EOF;
     }
+    lookupTypeNonSC(idx) {
+        for (let offset = this.tokenIndex; offset < this.tokenCount; offset++) {
+            const tokenType = this.offsetAndType[offset] >> TYPE_SHIFT;
+
+            if (tokenType !== WhiteSpace && tokenType !== Comment) {
+                if (idx-- === 0) {
+                    return tokenType;
+                }
+            }
+        }
+
+        return EOF;
+    }
     lookupOffset(offset) {
         offset += this.tokenIndex;
 
@@ -124,6 +154,19 @@ export class TokenStream {
 
         return this.source.length;
     }
+    lookupOffsetNonSC(idx) {
+        for (let offset = this.tokenIndex; offset < this.tokenCount; offset++) {
+            const tokenType = this.offsetAndType[offset] >> TYPE_SHIFT;
+
+            if (tokenType !== WhiteSpace && tokenType !== Comment) {
+                if (idx-- === 0) {
+                    return offset - this.tokenIndex;
+                }
+            }
+        }
+
+        return EOF;
+    }
     lookupValue(offset, referenceStr) {
         offset += this.tokenIndex;
 
@@ -157,6 +200,7 @@ export class TokenStream {
 
     isBalanceEdge(pos) {
         return this.balance[this.tokenIndex] < pos;
+        // return this.balance[this.balance[pos]] !== this.tokenIndex;
     }
     isDelim(code, offset) {
         if (offset) {
@@ -209,8 +253,8 @@ export class TokenStream {
     }
     skipUntilBalanced(startToken, stopConsume) {
         let cursor = startToken;
-        let balanceEnd;
-        let offset;
+        let balanceEnd = 0;
+        let offset = 0;
 
         loop:
         for (; cursor < this.tokenCount; cursor++) {
@@ -233,8 +277,8 @@ export class TokenStream {
                     break loop;
 
                 default:
-                    // fast forward to the end of balanced block
-                    if (this.balance[balanceEnd] === cursor) {
+                    // fast forward to the end of balanced block for an open block tokens
+                    if (isBlockOpenerToken(this.offsetAndType[cursor] >> TYPE_SHIFT)) {
                         cursor = balanceEnd;
                     }
             }
diff -pruN 2.3.1-1/lib/tokenizer/char-code-definitions.js 3.1.0-1/lib/tokenizer/char-code-definitions.js
--- 2.3.1-1/lib/tokenizer/char-code-definitions.js	2022-12-14 17:31:12.000000000 +0000
+++ 3.1.0-1/lib/tokenizer/char-code-definitions.js	2024-12-06 17:25:18.000000000 +0000
@@ -40,6 +40,11 @@ export function isLetter(code) {
 
 // non-ASCII code point
 // A code point with a value equal to or greater than U+0080 <control>.
+//
+// 2024-09-02: The latest spec narrows the range for non-ASCII characters (see https://github.com/csstree/csstree/issues/188).
+// However, all modern browsers support a wider range, and strictly following the latest spec could result
+// in some CSS being parsed incorrectly, even though it works in the browser. Therefore, this function adheres
+// to the previous, broader definition of non-ASCII characters.
 export function isNonAscii(code) {
     return code >= 0x0080;
 }
diff -pruN 2.3.1-1/lib/tokenizer/names.js 3.1.0-1/lib/tokenizer/names.js
--- 2.3.1-1/lib/tokenizer/names.js	2022-12-14 17:31:12.000000000 +0000
+++ 3.1.0-1/lib/tokenizer/names.js	2024-12-06 17:25:18.000000000 +0000
@@ -23,5 +23,6 @@ export default [
     '(-token',
     ')-token',
     '{-token',
-    '}-token'
+    '}-token',
+    'comment-token'
 ];
diff -pruN 2.3.1-1/lib/utils/clone.js 3.1.0-1/lib/utils/clone.js
--- 2.3.1-1/lib/utils/clone.js	2022-12-14 17:31:12.000000000 +0000
+++ 3.1.0-1/lib/utils/clone.js	2024-12-06 17:25:18.000000000 +0000
@@ -3,7 +3,7 @@ import { List } from './List.js';
 export function clone(node) {
     const result = {};
 
-    for (const key in node) {
+    for (const key of Object.keys(node)) {
         let value = node[key];
 
         if (value) {
diff -pruN 2.3.1-1/package-lock.json 3.1.0-1/package-lock.json
--- 2.3.1-1/package-lock.json	2022-12-14 17:31:12.000000000 +0000
+++ 3.1.0-1/package-lock.json	2024-12-06 17:25:18.000000000 +0000
@@ -1,25 +1,25 @@
 {
   "name": "css-tree",
-  "version": "2.3.1",
+  "version": "3.1.0",
   "lockfileVersion": 2,
   "requires": true,
   "packages": {
     "": {
       "name": "css-tree",
-      "version": "2.3.1",
+      "version": "3.1.0",
       "license": "MIT",
       "dependencies": {
-        "mdn-data": "2.0.30",
+        "mdn-data": "2.12.2",
         "source-map-js": "^1.0.1"
       },
       "devDependencies": {
         "c8": "^7.12.0",
         "clap": "^2.0.1",
-        "esbuild": "^0.14.53",
+        "esbuild": "^0.24.0",
         "eslint": "^8.4.1",
         "json-to-ast": "^2.1.0",
         "mocha": "^9.2.2",
-        "rollup": "^2.68.0"
+        "rollup": "^2.79.2"
       },
       "engines": {
         "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0"
@@ -31,20 +31,412 @@
       "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==",
       "dev": true
     },
+    "node_modules/@esbuild/aix-ppc64": {
+      "version": "0.24.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.0.tgz",
+      "integrity": "sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==",
+      "cpu": [
+        "ppc64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "aix"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/android-arm": {
+      "version": "0.24.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.0.tgz",
+      "integrity": "sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==",
+      "cpu": [
+        "arm"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/android-arm64": {
+      "version": "0.24.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.0.tgz",
+      "integrity": "sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/android-x64": {
+      "version": "0.24.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.0.tgz",
+      "integrity": "sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/darwin-arm64": {
+      "version": "0.24.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.0.tgz",
+      "integrity": "sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/darwin-x64": {
+      "version": "0.24.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.0.tgz",
+      "integrity": "sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/freebsd-arm64": {
+      "version": "0.24.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.0.tgz",
+      "integrity": "sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "freebsd"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/freebsd-x64": {
+      "version": "0.24.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.0.tgz",
+      "integrity": "sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "freebsd"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/linux-arm": {
+      "version": "0.24.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.0.tgz",
+      "integrity": "sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==",
+      "cpu": [
+        "arm"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/linux-arm64": {
+      "version": "0.24.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.0.tgz",
+      "integrity": "sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/linux-ia32": {
+      "version": "0.24.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.0.tgz",
+      "integrity": "sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==",
+      "cpu": [
+        "ia32"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
     "node_modules/@esbuild/linux-loong64": {
-      "version": "0.14.53",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.14.53.tgz",
-      "integrity": "sha512-W2dAL6Bnyn4xa/QRSU3ilIK4EzD5wgYXKXJiS1HDF5vU3675qc2bvFyLwbUcdmssDveyndy7FbitrCoiV/eMLg==",
+      "version": "0.24.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.0.tgz",
+      "integrity": "sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==",
       "cpu": [
         "loong64"
       ],
       "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/linux-mips64el": {
+      "version": "0.24.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.0.tgz",
+      "integrity": "sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==",
+      "cpu": [
+        "mips64el"
+      ],
+      "dev": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "linux"
       ],
       "engines": {
-        "node": ">=12"
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/linux-ppc64": {
+      "version": "0.24.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.0.tgz",
+      "integrity": "sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==",
+      "cpu": [
+        "ppc64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/linux-riscv64": {
+      "version": "0.24.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.0.tgz",
+      "integrity": "sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==",
+      "cpu": [
+        "riscv64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/linux-s390x": {
+      "version": "0.24.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.0.tgz",
+      "integrity": "sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==",
+      "cpu": [
+        "s390x"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/linux-x64": {
+      "version": "0.24.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.0.tgz",
+      "integrity": "sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/netbsd-x64": {
+      "version": "0.24.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.0.tgz",
+      "integrity": "sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "netbsd"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/openbsd-arm64": {
+      "version": "0.24.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.0.tgz",
+      "integrity": "sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "openbsd"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/openbsd-x64": {
+      "version": "0.24.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.0.tgz",
+      "integrity": "sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "openbsd"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/sunos-x64": {
+      "version": "0.24.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.0.tgz",
+      "integrity": "sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "sunos"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/win32-arm64": {
+      "version": "0.24.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.0.tgz",
+      "integrity": "sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/win32-ia32": {
+      "version": "0.24.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.0.tgz",
+      "integrity": "sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==",
+      "cpu": [
+        "ia32"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/win32-x64": {
+      "version": "0.24.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.0.tgz",
+      "integrity": "sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">=18"
       }
     },
     "node_modules/@eslint/eslintrc": {
@@ -248,12 +640,13 @@
       }
     },
     "node_modules/braces": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
-      "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
+      "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "fill-range": "^7.0.1"
+        "fill-range": "^7.1.1"
       },
       "engines": {
         "node": ">=8"
@@ -415,10 +808,11 @@
       "dev": true
     },
     "node_modules/cross-spawn": {
-      "version": "7.0.3",
-      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
-      "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+      "version": "7.0.6",
+      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
+      "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "path-key": "^3.1.0",
         "shebang-command": "^2.0.0",
@@ -503,359 +897,43 @@
       }
     },
     "node_modules/esbuild": {
-      "version": "0.14.53",
-      "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.53.tgz",
-      "integrity": "sha512-ohO33pUBQ64q6mmheX1mZ8mIXj8ivQY/L4oVuAshr+aJI+zLl+amrp3EodrUNDNYVrKJXGPfIHFGhO8slGRjuw==",
+      "version": "0.24.0",
+      "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.0.tgz",
+      "integrity": "sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==",
       "dev": true,
       "hasInstallScript": true,
+      "license": "MIT",
       "bin": {
         "esbuild": "bin/esbuild"
       },
       "engines": {
-        "node": ">=12"
+        "node": ">=18"
       },
       "optionalDependencies": {
-        "@esbuild/linux-loong64": "0.14.53",
-        "esbuild-android-64": "0.14.53",
-        "esbuild-android-arm64": "0.14.53",
-        "esbuild-darwin-64": "0.14.53",
-        "esbuild-darwin-arm64": "0.14.53",
-        "esbuild-freebsd-64": "0.14.53",
-        "esbuild-freebsd-arm64": "0.14.53",
-        "esbuild-linux-32": "0.14.53",
-        "esbuild-linux-64": "0.14.53",
-        "esbuild-linux-arm": "0.14.53",
-        "esbuild-linux-arm64": "0.14.53",
-        "esbuild-linux-mips64le": "0.14.53",
-        "esbuild-linux-ppc64le": "0.14.53",
-        "esbuild-linux-riscv64": "0.14.53",
-        "esbuild-linux-s390x": "0.14.53",
-        "esbuild-netbsd-64": "0.14.53",
-        "esbuild-openbsd-64": "0.14.53",
-        "esbuild-sunos-64": "0.14.53",
-        "esbuild-windows-32": "0.14.53",
-        "esbuild-windows-64": "0.14.53",
-        "esbuild-windows-arm64": "0.14.53"
-      }
-    },
-    "node_modules/esbuild-android-64": {
-      "version": "0.14.53",
-      "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.53.tgz",
-      "integrity": "sha512-fIL93sOTnEU+NrTAVMIKiAw0YH22HWCAgg4N4Z6zov2t0kY9RAJ50zY9ZMCQ+RT6bnOfDt8gCTnt/RaSNA2yRA==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "android"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/esbuild-android-arm64": {
-      "version": "0.14.53",
-      "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.53.tgz",
-      "integrity": "sha512-PC7KaF1v0h/nWpvlU1UMN7dzB54cBH8qSsm7S9mkwFA1BXpaEOufCg8hdoEI1jep0KeO/rjZVWrsH8+q28T77A==",
-      "cpu": [
-        "arm64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "android"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/esbuild-darwin-64": {
-      "version": "0.14.53",
-      "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.53.tgz",
-      "integrity": "sha512-gE7P5wlnkX4d4PKvLBUgmhZXvL7lzGRLri17/+CmmCzfncIgq8lOBvxGMiQ4xazplhxq+72TEohyFMZLFxuWvg==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "darwin"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/esbuild-darwin-arm64": {
-      "version": "0.14.53",
-      "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.53.tgz",
-      "integrity": "sha512-otJwDU3hnI15Q98PX4MJbknSZ/WSR1I45il7gcxcECXzfN4Mrpft5hBDHXNRnCh+5858uPXBXA1Vaz2jVWLaIA==",
-      "cpu": [
-        "arm64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "darwin"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/esbuild-freebsd-64": {
-      "version": "0.14.53",
-      "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.53.tgz",
-      "integrity": "sha512-WkdJa8iyrGHyKiPF4lk0MiOF87Q2SkE+i+8D4Cazq3/iqmGPJ6u49je300MFi5I2eUsQCkaOWhpCVQMTKGww2w==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "freebsd"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/esbuild-freebsd-arm64": {
-      "version": "0.14.53",
-      "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.53.tgz",
-      "integrity": "sha512-9T7WwCuV30NAx0SyQpw8edbKvbKELnnm1FHg7gbSYaatH+c8WJW10g/OdM7JYnv7qkimw2ZTtSA+NokOLd2ydQ==",
-      "cpu": [
-        "arm64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "freebsd"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/esbuild-linux-32": {
-      "version": "0.14.53",
-      "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.53.tgz",
-      "integrity": "sha512-VGanLBg5en2LfGDgLEUxQko2lqsOS7MTEWUi8x91YmsHNyzJVT/WApbFFx3MQGhkf+XdimVhpyo5/G0PBY91zg==",
-      "cpu": [
-        "ia32"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/esbuild-linux-64": {
-      "version": "0.14.53",
-      "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.53.tgz",
-      "integrity": "sha512-pP/FA55j/fzAV7N9DF31meAyjOH6Bjuo3aSKPh26+RW85ZEtbJv9nhoxmGTd9FOqjx59Tc1ZbrJabuiXlMwuZQ==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/esbuild-linux-arm": {
-      "version": "0.14.53",
-      "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.53.tgz",
-      "integrity": "sha512-/u81NGAVZMopbmzd21Nu/wvnKQK3pT4CrvQ8BTje1STXcQAGnfyKgQlj3m0j2BzYbvQxSy+TMck4TNV2onvoPA==",
-      "cpu": [
-        "arm"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/esbuild-linux-arm64": {
-      "version": "0.14.53",
-      "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.53.tgz",
-      "integrity": "sha512-GDmWITT+PMsjCA6/lByYk7NyFssW4Q6in32iPkpjZ/ytSyH+xeEx8q7HG3AhWH6heemEYEWpTll/eui3jwlSnw==",
-      "cpu": [
-        "arm64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/esbuild-linux-mips64le": {
-      "version": "0.14.53",
-      "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.53.tgz",
-      "integrity": "sha512-d6/XHIQW714gSSp6tOOX2UscedVobELvQlPMkInhx1NPz4ThZI9uNLQ4qQJHGBGKGfu+rtJsxM4NVHLhnNRdWQ==",
-      "cpu": [
-        "mips64el"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/esbuild-linux-ppc64le": {
-      "version": "0.14.53",
-      "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.53.tgz",
-      "integrity": "sha512-ndnJmniKPCB52m+r6BtHHLAOXw+xBCWIxNnedbIpuREOcbSU/AlyM/2dA3BmUQhsHdb4w3amD5U2s91TJ3MzzA==",
-      "cpu": [
-        "ppc64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/esbuild-linux-riscv64": {
-      "version": "0.14.53",
-      "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.53.tgz",
-      "integrity": "sha512-yG2sVH+QSix6ct4lIzJj329iJF3MhloLE6/vKMQAAd26UVPVkhMFqFopY+9kCgYsdeWvXdPgmyOuKa48Y7+/EQ==",
-      "cpu": [
-        "riscv64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/esbuild-linux-s390x": {
-      "version": "0.14.53",
-      "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.53.tgz",
-      "integrity": "sha512-OCJlgdkB+XPYndHmw6uZT7jcYgzmx9K+28PVdOa/eLjdoYkeAFvH5hTwX4AXGLZLH09tpl4bVsEtvuyUldaNCg==",
-      "cpu": [
-        "s390x"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/esbuild-netbsd-64": {
-      "version": "0.14.53",
-      "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.53.tgz",
-      "integrity": "sha512-gp2SB+Efc7MhMdWV2+pmIs/Ja/Mi5rjw+wlDmmbIn68VGXBleNgiEZG+eV2SRS0kJEUyHNedDtwRIMzaohWedQ==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "netbsd"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/esbuild-openbsd-64": {
-      "version": "0.14.53",
-      "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.53.tgz",
-      "integrity": "sha512-eKQ30ZWe+WTZmteDYg8S+YjHV5s4iTxeSGhJKJajFfQx9TLZJvsJX0/paqwP51GicOUruFpSUAs2NCc0a4ivQQ==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "openbsd"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/esbuild-sunos-64": {
-      "version": "0.14.53",
-      "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.53.tgz",
-      "integrity": "sha512-OWLpS7a2FrIRukQqcgQqR1XKn0jSJoOdT+RlhAxUoEQM/IpytS3FXzCJM6xjUYtpO5GMY0EdZJp+ur2pYdm39g==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "sunos"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/esbuild-windows-32": {
-      "version": "0.14.53",
-      "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.53.tgz",
-      "integrity": "sha512-m14XyWQP5rwGW0tbEfp95U6A0wY0DYPInWBB7D69FAXUpBpBObRoGTKRv36lf2RWOdE4YO3TNvj37zhXjVL5xg==",
-      "cpu": [
-        "ia32"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "win32"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/esbuild-windows-64": {
-      "version": "0.14.53",
-      "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.53.tgz",
-      "integrity": "sha512-s9skQFF0I7zqnQ2K8S1xdLSfZFsPLuOGmSx57h2btSEswv0N0YodYvqLcJMrNMXh6EynOmWD7rz+0rWWbFpIHQ==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "win32"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/esbuild-windows-arm64": {
-      "version": "0.14.53",
-      "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.53.tgz",
-      "integrity": "sha512-E+5Gvb+ZWts+00T9II6wp2L3KG2r3iGxByqd/a1RmLmYWVsSVUjkvIxZuJ3hYTIbhLkH5PRwpldGTKYqVz0nzQ==",
-      "cpu": [
-        "arm64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "win32"
-      ],
-      "engines": {
-        "node": ">=12"
+        "@esbuild/aix-ppc64": "0.24.0",
+        "@esbuild/android-arm": "0.24.0",
+        "@esbuild/android-arm64": "0.24.0",
+        "@esbuild/android-x64": "0.24.0",
+        "@esbuild/darwin-arm64": "0.24.0",
+        "@esbuild/darwin-x64": "0.24.0",
+        "@esbuild/freebsd-arm64": "0.24.0",
+        "@esbuild/freebsd-x64": "0.24.0",
+        "@esbuild/linux-arm": "0.24.0",
+        "@esbuild/linux-arm64": "0.24.0",
+        "@esbuild/linux-ia32": "0.24.0",
+        "@esbuild/linux-loong64": "0.24.0",
+        "@esbuild/linux-mips64el": "0.24.0",
+        "@esbuild/linux-ppc64": "0.24.0",
+        "@esbuild/linux-riscv64": "0.24.0",
+        "@esbuild/linux-s390x": "0.24.0",
+        "@esbuild/linux-x64": "0.24.0",
+        "@esbuild/netbsd-x64": "0.24.0",
+        "@esbuild/openbsd-arm64": "0.24.0",
+        "@esbuild/openbsd-x64": "0.24.0",
+        "@esbuild/sunos-x64": "0.24.0",
+        "@esbuild/win32-arm64": "0.24.0",
+        "@esbuild/win32-ia32": "0.24.0",
+        "@esbuild/win32-x64": "0.24.0"
       }
     },
     "node_modules/escalade": {
@@ -1098,10 +1176,11 @@
       }
     },
     "node_modules/fill-range": {
-      "version": "7.0.1",
-      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
-      "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+      "version": "7.1.1",
+      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
+      "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "to-regex-range": "^5.0.1"
       },
@@ -1384,6 +1463,7 @@
       "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
       "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=0.12.0"
       }
@@ -1554,18 +1634,6 @@
         "url": "https://github.com/chalk/chalk?sponsor=1"
       }
     },
-    "node_modules/lru-cache": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
-      "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
-      "dev": true,
-      "dependencies": {
-        "yallist": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
     "node_modules/make-dir": {
       "version": "3.1.0",
       "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
@@ -1582,18 +1650,19 @@
       }
     },
     "node_modules/make-dir/node_modules/semver": {
-      "version": "6.3.0",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-      "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+      "version": "6.3.1",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+      "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
       "dev": true,
+      "license": "ISC",
       "bin": {
         "semver": "bin/semver.js"
       }
     },
     "node_modules/mdn-data": {
-      "version": "2.0.30",
-      "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz",
-      "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA=="
+      "version": "2.12.2",
+      "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz",
+      "integrity": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA=="
     },
     "node_modules/minimatch": {
       "version": "3.1.2",
@@ -1926,10 +1995,11 @@
       }
     },
     "node_modules/rollup": {
-      "version": "2.68.0",
-      "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.68.0.tgz",
-      "integrity": "sha512-XrMKOYK7oQcTio4wyTz466mucnd8LzkiZLozZ4Rz0zQD+HeX4nUK4B8GrTX/2EvN2/vBF/i2WnaXboPxo0JylA==",
+      "version": "2.79.2",
+      "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.2.tgz",
+      "integrity": "sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==",
       "dev": true,
+      "license": "MIT",
       "bin": {
         "rollup": "dist/bin/rollup"
       },
@@ -1961,13 +2031,11 @@
       ]
     },
     "node_modules/semver": {
-      "version": "7.3.5",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
-      "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
+      "version": "7.6.3",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
+      "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
       "dev": true,
-      "dependencies": {
-        "lru-cache": "^6.0.0"
-      },
+      "license": "ISC",
       "bin": {
         "semver": "bin/semver.js"
       },
@@ -2094,6 +2162,7 @@
       "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
       "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "is-number": "^7.0.0"
       },
@@ -2170,10 +2239,11 @@
       }
     },
     "node_modules/word-wrap": {
-      "version": "1.2.3",
-      "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
-      "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
+      "version": "1.2.5",
+      "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
+      "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
@@ -2216,12 +2286,6 @@
         "node": ">=10"
       }
     },
-    "node_modules/yallist": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
-      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
-      "dev": true
-    },
     "node_modules/yargs": {
       "version": "16.2.0",
       "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
@@ -2284,10 +2348,171 @@
       "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==",
       "dev": true
     },
+    "@esbuild/aix-ppc64": {
+      "version": "0.24.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.0.tgz",
+      "integrity": "sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/android-arm": {
+      "version": "0.24.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.0.tgz",
+      "integrity": "sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/android-arm64": {
+      "version": "0.24.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.0.tgz",
+      "integrity": "sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/android-x64": {
+      "version": "0.24.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.0.tgz",
+      "integrity": "sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/darwin-arm64": {
+      "version": "0.24.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.0.tgz",
+      "integrity": "sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/darwin-x64": {
+      "version": "0.24.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.0.tgz",
+      "integrity": "sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/freebsd-arm64": {
+      "version": "0.24.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.0.tgz",
+      "integrity": "sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/freebsd-x64": {
+      "version": "0.24.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.0.tgz",
+      "integrity": "sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/linux-arm": {
+      "version": "0.24.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.0.tgz",
+      "integrity": "sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/linux-arm64": {
+      "version": "0.24.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.0.tgz",
+      "integrity": "sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/linux-ia32": {
+      "version": "0.24.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.0.tgz",
+      "integrity": "sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==",
+      "dev": true,
+      "optional": true
+    },
     "@esbuild/linux-loong64": {
-      "version": "0.14.53",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.14.53.tgz",
-      "integrity": "sha512-W2dAL6Bnyn4xa/QRSU3ilIK4EzD5wgYXKXJiS1HDF5vU3675qc2bvFyLwbUcdmssDveyndy7FbitrCoiV/eMLg==",
+      "version": "0.24.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.0.tgz",
+      "integrity": "sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/linux-mips64el": {
+      "version": "0.24.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.0.tgz",
+      "integrity": "sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/linux-ppc64": {
+      "version": "0.24.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.0.tgz",
+      "integrity": "sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/linux-riscv64": {
+      "version": "0.24.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.0.tgz",
+      "integrity": "sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/linux-s390x": {
+      "version": "0.24.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.0.tgz",
+      "integrity": "sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/linux-x64": {
+      "version": "0.24.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.0.tgz",
+      "integrity": "sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/netbsd-x64": {
+      "version": "0.24.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.0.tgz",
+      "integrity": "sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/openbsd-arm64": {
+      "version": "0.24.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.0.tgz",
+      "integrity": "sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/openbsd-x64": {
+      "version": "0.24.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.0.tgz",
+      "integrity": "sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/sunos-x64": {
+      "version": "0.24.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.0.tgz",
+      "integrity": "sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/win32-arm64": {
+      "version": "0.24.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.0.tgz",
+      "integrity": "sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/win32-ia32": {
+      "version": "0.24.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.0.tgz",
+      "integrity": "sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==",
+      "dev": true,
+      "optional": true
+    },
+    "@esbuild/win32-x64": {
+      "version": "0.24.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.0.tgz",
+      "integrity": "sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==",
       "dev": true,
       "optional": true
     },
@@ -2450,12 +2675,12 @@
       }
     },
     "braces": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
-      "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
+      "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
       "dev": true,
       "requires": {
-        "fill-range": "^7.0.1"
+        "fill-range": "^7.1.1"
       }
     },
     "browser-stdout": {
@@ -2576,9 +2801,9 @@
       "dev": true
     },
     "cross-spawn": {
-      "version": "7.0.3",
-      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
-      "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+      "version": "7.0.6",
+      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
+      "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
       "dev": true,
       "requires": {
         "path-key": "^3.1.0",
@@ -2638,174 +2863,37 @@
       }
     },
     "esbuild": {
-      "version": "0.14.53",
-      "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.53.tgz",
-      "integrity": "sha512-ohO33pUBQ64q6mmheX1mZ8mIXj8ivQY/L4oVuAshr+aJI+zLl+amrp3EodrUNDNYVrKJXGPfIHFGhO8slGRjuw==",
-      "dev": true,
-      "requires": {
-        "@esbuild/linux-loong64": "0.14.53",
-        "esbuild-android-64": "0.14.53",
-        "esbuild-android-arm64": "0.14.53",
-        "esbuild-darwin-64": "0.14.53",
-        "esbuild-darwin-arm64": "0.14.53",
-        "esbuild-freebsd-64": "0.14.53",
-        "esbuild-freebsd-arm64": "0.14.53",
-        "esbuild-linux-32": "0.14.53",
-        "esbuild-linux-64": "0.14.53",
-        "esbuild-linux-arm": "0.14.53",
-        "esbuild-linux-arm64": "0.14.53",
-        "esbuild-linux-mips64le": "0.14.53",
-        "esbuild-linux-ppc64le": "0.14.53",
-        "esbuild-linux-riscv64": "0.14.53",
-        "esbuild-linux-s390x": "0.14.53",
-        "esbuild-netbsd-64": "0.14.53",
-        "esbuild-openbsd-64": "0.14.53",
-        "esbuild-sunos-64": "0.14.53",
-        "esbuild-windows-32": "0.14.53",
-        "esbuild-windows-64": "0.14.53",
-        "esbuild-windows-arm64": "0.14.53"
+      "version": "0.24.0",
+      "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.0.tgz",
+      "integrity": "sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==",
+      "dev": true,
+      "requires": {
+        "@esbuild/aix-ppc64": "0.24.0",
+        "@esbuild/android-arm": "0.24.0",
+        "@esbuild/android-arm64": "0.24.0",
+        "@esbuild/android-x64": "0.24.0",
+        "@esbuild/darwin-arm64": "0.24.0",
+        "@esbuild/darwin-x64": "0.24.0",
+        "@esbuild/freebsd-arm64": "0.24.0",
+        "@esbuild/freebsd-x64": "0.24.0",
+        "@esbuild/linux-arm": "0.24.0",
+        "@esbuild/linux-arm64": "0.24.0",
+        "@esbuild/linux-ia32": "0.24.0",
+        "@esbuild/linux-loong64": "0.24.0",
+        "@esbuild/linux-mips64el": "0.24.0",
+        "@esbuild/linux-ppc64": "0.24.0",
+        "@esbuild/linux-riscv64": "0.24.0",
+        "@esbuild/linux-s390x": "0.24.0",
+        "@esbuild/linux-x64": "0.24.0",
+        "@esbuild/netbsd-x64": "0.24.0",
+        "@esbuild/openbsd-arm64": "0.24.0",
+        "@esbuild/openbsd-x64": "0.24.0",
+        "@esbuild/sunos-x64": "0.24.0",
+        "@esbuild/win32-arm64": "0.24.0",
+        "@esbuild/win32-ia32": "0.24.0",
+        "@esbuild/win32-x64": "0.24.0"
       }
     },
-    "esbuild-android-64": {
-      "version": "0.14.53",
-      "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.53.tgz",
-      "integrity": "sha512-fIL93sOTnEU+NrTAVMIKiAw0YH22HWCAgg4N4Z6zov2t0kY9RAJ50zY9ZMCQ+RT6bnOfDt8gCTnt/RaSNA2yRA==",
-      "dev": true,
-      "optional": true
-    },
-    "esbuild-android-arm64": {
-      "version": "0.14.53",
-      "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.53.tgz",
-      "integrity": "sha512-PC7KaF1v0h/nWpvlU1UMN7dzB54cBH8qSsm7S9mkwFA1BXpaEOufCg8hdoEI1jep0KeO/rjZVWrsH8+q28T77A==",
-      "dev": true,
-      "optional": true
-    },
-    "esbuild-darwin-64": {
-      "version": "0.14.53",
-      "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.53.tgz",
-      "integrity": "sha512-gE7P5wlnkX4d4PKvLBUgmhZXvL7lzGRLri17/+CmmCzfncIgq8lOBvxGMiQ4xazplhxq+72TEohyFMZLFxuWvg==",
-      "dev": true,
-      "optional": true
-    },
-    "esbuild-darwin-arm64": {
-      "version": "0.14.53",
-      "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.53.tgz",
-      "integrity": "sha512-otJwDU3hnI15Q98PX4MJbknSZ/WSR1I45il7gcxcECXzfN4Mrpft5hBDHXNRnCh+5858uPXBXA1Vaz2jVWLaIA==",
-      "dev": true,
-      "optional": true
-    },
-    "esbuild-freebsd-64": {
-      "version": "0.14.53",
-      "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.53.tgz",
-      "integrity": "sha512-WkdJa8iyrGHyKiPF4lk0MiOF87Q2SkE+i+8D4Cazq3/iqmGPJ6u49je300MFi5I2eUsQCkaOWhpCVQMTKGww2w==",
-      "dev": true,
-      "optional": true
-    },
-    "esbuild-freebsd-arm64": {
-      "version": "0.14.53",
-      "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.53.tgz",
-      "integrity": "sha512-9T7WwCuV30NAx0SyQpw8edbKvbKELnnm1FHg7gbSYaatH+c8WJW10g/OdM7JYnv7qkimw2ZTtSA+NokOLd2ydQ==",
-      "dev": true,
-      "optional": true
-    },
-    "esbuild-linux-32": {
-      "version": "0.14.53",
-      "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.53.tgz",
-      "integrity": "sha512-VGanLBg5en2LfGDgLEUxQko2lqsOS7MTEWUi8x91YmsHNyzJVT/WApbFFx3MQGhkf+XdimVhpyo5/G0PBY91zg==",
-      "dev": true,
-      "optional": true
-    },
-    "esbuild-linux-64": {
-      "version": "0.14.53",
-      "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.53.tgz",
-      "integrity": "sha512-pP/FA55j/fzAV7N9DF31meAyjOH6Bjuo3aSKPh26+RW85ZEtbJv9nhoxmGTd9FOqjx59Tc1ZbrJabuiXlMwuZQ==",
-      "dev": true,
-      "optional": true
-    },
-    "esbuild-linux-arm": {
-      "version": "0.14.53",
-      "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.53.tgz",
-      "integrity": "sha512-/u81NGAVZMopbmzd21Nu/wvnKQK3pT4CrvQ8BTje1STXcQAGnfyKgQlj3m0j2BzYbvQxSy+TMck4TNV2onvoPA==",
-      "dev": true,
-      "optional": true
-    },
-    "esbuild-linux-arm64": {
-      "version": "0.14.53",
-      "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.53.tgz",
-      "integrity": "sha512-GDmWITT+PMsjCA6/lByYk7NyFssW4Q6in32iPkpjZ/ytSyH+xeEx8q7HG3AhWH6heemEYEWpTll/eui3jwlSnw==",
-      "dev": true,
-      "optional": true
-    },
-    "esbuild-linux-mips64le": {
-      "version": "0.14.53",
-      "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.53.tgz",
-      "integrity": "sha512-d6/XHIQW714gSSp6tOOX2UscedVobELvQlPMkInhx1NPz4ThZI9uNLQ4qQJHGBGKGfu+rtJsxM4NVHLhnNRdWQ==",
-      "dev": true,
-      "optional": true
-    },
-    "esbuild-linux-ppc64le": {
-      "version": "0.14.53",
-      "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.53.tgz",
-      "integrity": "sha512-ndnJmniKPCB52m+r6BtHHLAOXw+xBCWIxNnedbIpuREOcbSU/AlyM/2dA3BmUQhsHdb4w3amD5U2s91TJ3MzzA==",
-      "dev": true,
-      "optional": true
-    },
-    "esbuild-linux-riscv64": {
-      "version": "0.14.53",
-      "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.53.tgz",
-      "integrity": "sha512-yG2sVH+QSix6ct4lIzJj329iJF3MhloLE6/vKMQAAd26UVPVkhMFqFopY+9kCgYsdeWvXdPgmyOuKa48Y7+/EQ==",
-      "dev": true,
-      "optional": true
-    },
-    "esbuild-linux-s390x": {
-      "version": "0.14.53",
-      "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.53.tgz",
-      "integrity": "sha512-OCJlgdkB+XPYndHmw6uZT7jcYgzmx9K+28PVdOa/eLjdoYkeAFvH5hTwX4AXGLZLH09tpl4bVsEtvuyUldaNCg==",
-      "dev": true,
-      "optional": true
-    },
-    "esbuild-netbsd-64": {
-      "version": "0.14.53",
-      "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.53.tgz",
-      "integrity": "sha512-gp2SB+Efc7MhMdWV2+pmIs/Ja/Mi5rjw+wlDmmbIn68VGXBleNgiEZG+eV2SRS0kJEUyHNedDtwRIMzaohWedQ==",
-      "dev": true,
-      "optional": true
-    },
-    "esbuild-openbsd-64": {
-      "version": "0.14.53",
-      "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.53.tgz",
-      "integrity": "sha512-eKQ30ZWe+WTZmteDYg8S+YjHV5s4iTxeSGhJKJajFfQx9TLZJvsJX0/paqwP51GicOUruFpSUAs2NCc0a4ivQQ==",
-      "dev": true,
-      "optional": true
-    },
-    "esbuild-sunos-64": {
-      "version": "0.14.53",
-      "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.53.tgz",
-      "integrity": "sha512-OWLpS7a2FrIRukQqcgQqR1XKn0jSJoOdT+RlhAxUoEQM/IpytS3FXzCJM6xjUYtpO5GMY0EdZJp+ur2pYdm39g==",
-      "dev": true,
-      "optional": true
-    },
-    "esbuild-windows-32": {
-      "version": "0.14.53",
-      "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.53.tgz",
-      "integrity": "sha512-m14XyWQP5rwGW0tbEfp95U6A0wY0DYPInWBB7D69FAXUpBpBObRoGTKRv36lf2RWOdE4YO3TNvj37zhXjVL5xg==",
-      "dev": true,
-      "optional": true
-    },
-    "esbuild-windows-64": {
-      "version": "0.14.53",
-      "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.53.tgz",
-      "integrity": "sha512-s9skQFF0I7zqnQ2K8S1xdLSfZFsPLuOGmSx57h2btSEswv0N0YodYvqLcJMrNMXh6EynOmWD7rz+0rWWbFpIHQ==",
-      "dev": true,
-      "optional": true
-    },
-    "esbuild-windows-arm64": {
-      "version": "0.14.53",
-      "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.53.tgz",
-      "integrity": "sha512-E+5Gvb+ZWts+00T9II6wp2L3KG2r3iGxByqd/a1RmLmYWVsSVUjkvIxZuJ3hYTIbhLkH5PRwpldGTKYqVz0nzQ==",
-      "dev": true,
-      "optional": true
-    },
     "escalade": {
       "version": "3.1.1",
       "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
@@ -2987,9 +3075,9 @@
       }
     },
     "fill-range": {
-      "version": "7.0.1",
-      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
-      "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+      "version": "7.1.1",
+      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
+      "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
       "dev": true,
       "requires": {
         "to-regex-range": "^5.0.1"
@@ -3321,15 +3409,6 @@
         }
       }
     },
-    "lru-cache": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
-      "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
-      "dev": true,
-      "requires": {
-        "yallist": "^4.0.0"
-      }
-    },
     "make-dir": {
       "version": "3.1.0",
       "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
@@ -3340,17 +3419,17 @@
       },
       "dependencies": {
         "semver": {
-          "version": "6.3.0",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+          "version": "6.3.1",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+          "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
           "dev": true
         }
       }
     },
     "mdn-data": {
-      "version": "2.0.30",
-      "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz",
-      "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA=="
+      "version": "2.12.2",
+      "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz",
+      "integrity": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA=="
     },
     "minimatch": {
       "version": "3.1.2",
@@ -3587,9 +3666,9 @@
       }
     },
     "rollup": {
-      "version": "2.68.0",
-      "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.68.0.tgz",
-      "integrity": "sha512-XrMKOYK7oQcTio4wyTz466mucnd8LzkiZLozZ4Rz0zQD+HeX4nUK4B8GrTX/2EvN2/vBF/i2WnaXboPxo0JylA==",
+      "version": "2.79.2",
+      "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.2.tgz",
+      "integrity": "sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==",
       "dev": true,
       "requires": {
         "fsevents": "~2.3.2"
@@ -3602,13 +3681,10 @@
       "dev": true
     },
     "semver": {
-      "version": "7.3.5",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
-      "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
-      "dev": true,
-      "requires": {
-        "lru-cache": "^6.0.0"
-      }
+      "version": "7.6.3",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
+      "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
+      "dev": true
     },
     "serialize-javascript": {
       "version": "6.0.0",
@@ -3757,9 +3833,9 @@
       }
     },
     "word-wrap": {
-      "version": "1.2.3",
-      "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
-      "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
+      "version": "1.2.5",
+      "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
+      "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
       "dev": true
     },
     "workerpool": {
@@ -3791,12 +3867,6 @@
       "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
       "dev": true
     },
-    "yallist": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
-      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
-      "dev": true
-    },
     "yargs": {
       "version": "16.2.0",
       "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
diff -pruN 2.3.1-1/package.json 3.1.0-1/package.json
--- 2.3.1-1/package.json	2022-12-14 17:31:12.000000000 +0000
+++ 3.1.0-1/package.json	2024-12-06 17:25:18.000000000 +0000
@@ -1,6 +1,6 @@
 {
   "name": "css-tree",
-  "version": "2.3.1",
+  "version": "3.1.0",
   "description": "A tool set for CSS: fast detailed parser (CSS → AST), walker (AST traversal), generator (AST → CSS) and lexer (validation and matching) based on specs and browser implementations",
   "author": "Roman Dvornov <rdvornov@gmail.com> (https://github.com/lahmatiy)",
   "license": "MIT",
@@ -92,25 +92,24 @@
     "lint-and-test": "npm run lint && npm test",
     "update:docs": "node scripts/update-docs",
     "review:syntax-patch": "node scripts/review-syntax-patch",
-    "test": "mocha lib/__tests --reporter ${REPORTER:-progress}",
-    "test:cjs": "mocha cjs/__tests --reporter ${REPORTER:-progress}",
-    "test:dist": "mocha dist/__tests --reporter ${REPORTER:-progress}",
+    "test": "mocha lib/__tests --require lib/__tests/helpers/setup.js --reporter progress",
+    "test:cjs": "mocha cjs/__tests --require lib/__tests/helpers/setup.js --reporter progress",
+    "test:dist": "mocha dist/__tests --reporter progress",
     "coverage": "c8 --exclude lib/__tests --reporter=lcovonly npm test",
-    "prepublishOnly": "npm run lint-and-test && npm run build-and-test",
-    "hydrogen": "node --trace-hydrogen --trace-phase=Z --trace-deopt --code-comments --hydrogen-track-positions --redirect-code-traces --redirect-code-traces-to=code.asm --trace_hydrogen_file=code.cfg --print-opt-code bin/parse --stat -o /dev/null"
+    "prepublishOnly": "npm run lint-and-test && npm run build-and-test"
   },
   "dependencies": {
-    "mdn-data": "2.0.30",
+    "mdn-data": "2.12.2",
     "source-map-js": "^1.0.1"
   },
   "devDependencies": {
     "c8": "^7.12.0",
     "clap": "^2.0.1",
-    "esbuild": "^0.14.53",
+    "esbuild": "^0.24.0",
     "eslint": "^8.4.1",
     "json-to-ast": "^2.1.0",
     "mocha": "^9.2.2",
-    "rollup": "^2.68.0"
+    "rollup": "^2.79.2"
   },
   "engines": {
     "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0"
diff -pruN 2.3.1-1/scripts/bundle.js 3.1.0-1/scripts/bundle.js
--- 2.3.1-1/scripts/bundle.js	2022-12-14 17:31:12.000000000 +0000
+++ 3.1.0-1/scripts/bundle.js	2024-12-06 17:25:18.000000000 +0000
@@ -9,17 +9,17 @@ const data = JSON.stringify(lexer.dump()
 
 async function build() {
     const genModules = {
-        [path.resolve('lib/data.js')]: `export default ${data};`,
-        [path.resolve('lib/data.cjs')]: `module.exports = ${data};`,
-        [path.resolve('lib/version.js')]: `export const version = "${version}";`,
-        [path.resolve('lib/version.cjs')]: `module.exports = "${version}";`
+        'data.js': `export default ${data};`,
+        'data.cjs': `module.exports = ${data};`,
+        'version.js': `export const version = "${version}";`,
+        'version.cjs': `module.exports = "${version}";`
     };
-    const genModulesFilter = new RegExp('(' + Object.keys(genModules).join('|').replace(/\./g, '\\.') + ')$');
+    const genModulesFilter = new RegExp('lib[\\\\/](' + Object.keys(genModules).join('|').replace(/\./g, '\\.') + ')$');
     const plugins = [{
         name: 'replace',
         setup({ onLoad }) {
             onLoad({ filter: genModulesFilter }, args => ({
-                contents: genModules[args.path]
+                contents: genModules[path.basename(args.path)]
             }));
         }
     }];
diff -pruN 2.3.1-1/scripts/docs/ast.js 3.1.0-1/scripts/docs/ast.js
--- 2.3.1-1/scripts/docs/ast.js	2022-12-14 17:31:12.000000000 +0000
+++ 3.1.0-1/scripts/docs/ast.js	2024-12-06 17:25:18.000000000 +0000
@@ -3,10 +3,10 @@ import { lexer } from '../../lib/index.j
 const TOC_RX = /(<!-- MarkdownTOC .*?-->\n+)((?:\s|.)*?)(\n+<!-- \/MarkdownTOC -->)/;
 const ARTICLES_RX = /(<!-- node types -->\n+)((?:\s|.)*?)(\n+<!-- \/node types -->)/;
 
-function genNodeStructure(docs) {
-    return '{\n' +
-        Object.keys(docs).map(field => `    ${field}: ${docs[field]}`).join(',\n') +
-    '\n}';
+function genNodeStructure(type, docs) {
+    return 'type ' + type + ' = {\n' +
+        Object.keys(docs).map(field => `    ${field}: ${docs[field]}`).join(';\n') +
+    ';\n}';
 }
 
 function updateTOC(md, toc) {
@@ -40,8 +40,8 @@ function updateArticles(md, definitions)
             return (
                 '### ' + type + '\n\n' +
                 (article.before ? article.before + '\n\n' : '') +
-                '```js\n' +
-                genNodeStructure(lexer.structure[type].docs) +
+                '```ts\n' +
+                genNodeStructure(type, lexer.structure[type].docs) +
                 '\n```' +
                 (article.after ?  '\n\n' + article.after : '')
             );
diff -pruN 2.3.1-1/scripts/parse.js 3.1.0-1/scripts/parse.js
--- 2.3.1-1/scripts/parse.js	2022-12-14 17:31:12.000000000 +0000
+++ 3.1.0-1/scripts/parse.js	2024-12-06 17:25:18.000000000 +0000
@@ -1,5 +1,6 @@
 import cli from 'clap';
-import { parse, toPlainObject } from '../lib/index.js';
+import { parse } from '../lib/index.js';
+import { printAstColor } from './utils/print-ast_prototype.js';
 
 cli.command('parse', '[css]')
     .option('-c, --context <context>')
@@ -16,6 +17,7 @@ cli.command('parse', '[css]')
         const source = args[0] || '';
         const unescaped = JSON.parse(`"${source.replace(/\\.|"/g, m => m === '"' ? '\\"' : m)}"`);
 
-        console.dir(toPlainObject(parse(unescaped, this.values)), { depth: null });
+        // console.dir(toPlainObject(parse(unescaped, this.values)), { depth: null });
+        console.log(printAstColor(parse(unescaped, this.values)));
     })
     .run();
diff -pruN 2.3.1-1/scripts/utils/print-ast_module.js 3.1.0-1/scripts/utils/print-ast_module.js
--- 2.3.1-1/scripts/utils/print-ast_module.js	1970-01-01 00:00:00.000000000 +0000
+++ 3.1.0-1/scripts/utils/print-ast_module.js	2024-12-06 17:25:18.000000000 +0000
@@ -0,0 +1,205 @@
+export function printAst(ast, options) {
+    const { decorate, outline = true } = options || {};
+    const printer = createPrinter(normalizeDecorate(decorate));
+    const setup = {
+        inlineSingleEntry: false,
+        outline: Boolean(outline),
+        getTag(value) {
+            return value?.type;
+        },
+        isList(value, prop) {
+            return Array.isArray(value) || prop === 'children';
+        },
+        ignoreProperty(prop) {
+            return (
+                prop === 'type' ||
+                prop === 'loc' ||
+                prop === 'start' ||
+                prop === 'end'
+            );
+        }
+    };
+
+    printInternal(ast, setup, printer);
+
+    return printer.emit();
+}
+
+function printInternal(root, setup, printer) {
+    function renderValue(value) {
+        printer.value(typeof value === 'string' ? JSON.stringify(value) : String(value));
+        printer.newline();
+    }
+
+    function renderList(node, property, self, nested) {
+        const list = node[property];
+
+        if (!list) {
+            return;
+        }
+
+        printer.outline(self);
+        printer.property(property);
+
+        if (!list.length && !list.size) {
+            printer.value('<empty>');
+            printer.newline();
+            return;
+        }
+
+        printer.newline();
+
+        const size = list.length || list.size;
+        let idx = 0;
+        for (const child of list) {
+            if (++idx < size) {
+                renderNode(child, `${nested}${o1}`, `${nested}${o2}${setup.outline ? '' : ' '}`, idx - 1);
+            } else {
+                renderNode(child, `${nested}${o3}`, `${nested}${o0}${setup.outline ? '' : ' '}`, idx - 1);
+            }
+        }
+    }
+
+    const o0 = setup.outline ? '  ' : ' ';
+    const o1 = setup.outline ? '├─' : ' ';
+    const o2 = setup.outline ? '│ ' : ' ';
+    const o3 = setup.outline ? '└─' : ' ';
+
+    function renderEntries(node, entries, self, nested) {
+        if (entries.length === 0) {
+            return;
+        }
+
+        const isSingleEntry = entries.length === 1 && setup.inlineSingleEntry;
+        const __self = key => isSingleEntry ? '' : key === lastKey ? o3 : o1;
+        const __nested = key => isSingleEntry ? '' : key === lastKey ? o0 + ' ' : o2 + ' ';
+        const objects = [];
+        const arrays = [];
+        let lastKey = entries[entries.length - 1][0];
+
+        for (const [key, value] of entries) {
+            if (setup.getTag(value, key, node)) {
+                objects.push(key);
+                lastKey = arrays.length === 0 ? key : lastKey;
+            } else if (setup.isList(value, key, node)) {
+                arrays.push(key);
+                lastKey = key;
+            } else {
+                printer.outline(self + __self(key));
+                printer.property(key);
+                renderValue(value);
+            }
+        }
+
+        for (const key of objects) {
+            const tag = setup.getTag(node[key]);
+            const other = nested + (typeof tag === 'string' ? '' : __nested(key));
+
+            printer.outline(self + __self(key));
+            printer.property(key);
+
+            if (typeof tag === 'string') {
+                printer.tag(tag);
+                renderNode(node[key], `${other}${o3}`, `${other}${o0} `, undefined, true);
+            } else {
+                printer.newline();
+                renderNode(node[key], `${other}${o3}`, `${other}${o0} `);
+            }
+        }
+
+        for (const key of arrays) {
+            renderList(node, key, self + __self(key), nested + (setup.outline ? __nested(key) : __nested(key).slice(1)));
+        }
+    }
+
+    function renderNode(node, self = '', nested = '', index, skipTag) {
+        const tag = setup.getTag(node);
+
+        if (!skipTag) {
+            printer.outline(self);
+        }
+
+        if (Number.isFinite(index)) {
+            printer.index(index);
+            nested += ' ';
+        }
+
+        if (typeof tag !== 'string') {
+            renderValue(node);
+            return;
+        }
+
+        const entries = Object.entries(node)
+            .filter(([key]) => !setup.ignoreProperty(key, node));
+
+        if (!skipTag) {
+            printer.tag(tag);
+        }
+
+        if (entries.length === 1 && setup.inlineSingleEntry) {
+            renderEntries(node, entries, '', nested /* + (Number.isFinite(index) ? '   ' : '') */);
+        } else {
+            printer.newline();
+            renderEntries(node, entries, nested, nested);
+        }
+    }
+
+    renderNode(root);
+}
+
+function normalizeDecorate(decorate) {
+    const selfFn = value => value;
+    const result = {
+        tag: selfFn,
+        index: selfFn,
+        property: selfFn,
+        colon: selfFn,
+        value: selfFn,
+        outline: selfFn
+    };
+
+    if (decorate) {
+        for (const key of Object.keys(result)) {
+            if (typeof decorate[key] === 'function') {
+                result[key] = decorate[key];
+            }
+        }
+    }
+
+    return result;
+}
+
+function createPrinter(decorate) {
+    const TAG = 1;
+    const PROPERTY = 2;
+    const INDEX = 3;
+    const VALUE = 4;
+    const OUTLINE = 5;
+    const NEWLINE = 6;
+    const space = new Set([
+        16 * TAG + PROPERTY,
+        16 * PROPERTY + VALUE,
+        16 * PROPERTY + TAG,
+        16 * INDEX + TAG,
+        16 * INDEX + VALUE,
+        16 * OUTLINE + TAG,
+        16 * OUTLINE + PROPERTY
+    ]);
+    const put = (next, str) => {
+        buffer += space.has(16 * prev + next) ? ' ' + str : str;
+        prev = next;
+    };
+    const colon = decorate.colon(':');
+    let prev = 0;
+    let buffer = '';
+
+    return {
+        tag: str => put(TAG, decorate.tag(str)),
+        index: index => put(INDEX, decorate.index(`[${index}]`)),
+        property: str => put(PROPERTY, decorate.property(str) + colon),
+        value: str => put(VALUE, decorate.value(str)),
+        outline: str => str && put(OUTLINE, decorate.outline(str)),
+        newline: () => put(NEWLINE, '\n'),
+        emit: () => buffer
+    };
+}
diff -pruN 2.3.1-1/scripts/utils/print-ast_prototype.js 3.1.0-1/scripts/utils/print-ast_prototype.js
--- 2.3.1-1/scripts/utils/print-ast_prototype.js	1970-01-01 00:00:00.000000000 +0000
+++ 3.1.0-1/scripts/utils/print-ast_prototype.js	2024-12-06 17:25:18.000000000 +0000
@@ -0,0 +1,209 @@
+import chalk_ from 'chalk';
+
+const chalk = new chalk_.Instance({ level: 1 });
+
+export function printAstColor(root) {
+    return printAst(root, {
+        tag: chalk.blue,
+        index: chalk.gray,
+        property: chalk.white,
+        colon: chalk.gray,
+        value: str => /^(null|undefined|<empty>)$/.test(str) ? chalk.gray(str) : chalk.green(str),
+        outline: chalk.grey
+        // outline: (s) => s.replace(/\S+/g, ' ')
+    });
+}
+
+function normalizeDecorate(decorate) {
+    const selfFn = value => value;
+    const result = {
+        tag: selfFn,
+        index: selfFn,
+        property: selfFn,
+        colon: selfFn,
+        value: selfFn,
+        outline: selfFn
+    };
+
+    if (decorate) {
+        for (const key of Object.keys(result)) {
+            if (typeof decorate[key] === 'function') {
+                result[key] = decorate[key];
+            }
+        }
+    }
+
+    return result;
+}
+
+export function printAst(root, decorate) {
+    decorate = normalizeDecorate(decorate);
+
+    // === printer
+
+    const TAG = 1;
+    const PROPERTY = 2;
+    const INDEX = 3;
+    const VALUE = 4;
+    const OUTLINE = 5;
+    const NEWLINE = 6;
+    const space = new Set([
+        16 * TAG + PROPERTY,
+        16 * PROPERTY + VALUE,
+        16 * INDEX + TAG,
+        16 * INDEX + VALUE,
+        16 * OUTLINE + TAG,
+        16 * OUTLINE + PROPERTY
+    ]);
+    const put = (next, str) => {
+        buffer += space.has(16 * prev + next) ? ' ' + str : str;
+        prev = next;
+    };
+    const colon = decorate.colon(':');
+    const printer = {
+        tag: str => put(TAG, decorate.tag(str)),
+        index: index => put(INDEX, decorate.index(`[${index}]`)),
+        property: str => put(PROPERTY, decorate.property(str) + colon),
+        value: str => put(VALUE, decorate.value(str)),
+        outline: str => str && put(OUTLINE, decorate.outline(str)),
+        newline: () => put(NEWLINE, '\n'),
+        emit: () => buffer
+    };
+
+    let prev = 0;
+    let buffer = '';
+
+    // === setup
+
+    const setup = {
+        outline: true,
+        getTag(value) {
+            return value?.type;
+        },
+        isList(value, prop) {
+            return Array.isArray(value) || prop === 'children';
+        },
+        ignoreProperty(prop) {
+            return (
+                prop === 'type' ||
+                prop === 'loc' ||
+                prop === 'start' ||
+                prop === 'end'
+            );
+        }
+    };
+
+    // === main part
+
+    printInternal(root, setup, printer);
+
+    return printer.emit();
+}
+
+function printInternal(root, setup, printer) {
+    function renderValue(value) {
+        printer.value(typeof value === 'string' ? JSON.stringify(value) : String(value));
+        printer.newline();
+    }
+
+    function renderList(node, property, self, nested) {
+        const list = node[property];
+
+        if (!list) {
+            return;
+        }
+
+        printer.outline(self);
+        printer.property(property);
+
+        if (!list.length && !list.size) {
+            printer.value('<empty>');
+            printer.newline();
+            return;
+        }
+
+        printer.newline();
+
+        const size = list.length || list.size;
+        let idx = 0;
+        for (const child of list) {
+            if (++idx < size) {
+                renderNode(child, `${nested}${o1}`, `${nested}${o2} `, idx - 1);
+            } else {
+                renderNode(child, `${nested}${o3}`, `${nested}${o0} `, idx - 1);
+            }
+        }
+    }
+
+    const o0 = setup.outline ? '  ' : ' ';
+    const o1 = setup.outline ? '├─' : ' ';
+    const o2 = setup.outline ? '│ ' : ' ';
+    const o3 = setup.outline ? '└─' : ' ';
+
+    function renderEntries(node, entries, self, nested) {
+        if (entries.length === 0) {
+            return;
+        }
+
+        const __self = key => entries.length === 1 ? '' : key === lastKey ? o3 : o1;
+        const __nested = key => entries.length === 1 ? '' : key === lastKey ? o0 + ' ' : o2 + ' ';
+        const objects = [];
+        const arrays = [];
+        let lastKey = entries[entries.length - 1][0];
+
+        for (const [key, value] of entries) {
+            if (setup.getTag(value, key, node)) {
+                objects.push(key);
+                lastKey = arrays.length === 0 ? key : lastKey;
+            } else if (setup.isList(value, key, node)) {
+                arrays.push(key);
+                lastKey = key;
+            } else {
+                printer.outline(self + __self(key));
+                printer.property(key);
+                renderValue(value);
+            }
+        }
+
+        for (const key of objects) {
+            printer.outline(self + __self(key));
+            printer.property(key);
+            printer.newline();
+            const other = nested + __nested(key);
+            renderNode(node[key], `${other}${o3}`, `${other}${o0} `);
+        }
+
+        for (const key of arrays) {
+            renderList(node, key, self + __self(key), nested + __nested(key));
+        }
+    }
+
+    function renderNode(node, self = '', nested = '', index) {
+        const tag = setup.getTag(node);
+
+        printer.outline(self);
+
+        if (Number.isFinite(index)) {
+            printer.index(index);
+        }
+
+        if (typeof tag !== 'string') {
+            renderValue(node);
+            return;
+        }
+
+        const entries = Object.entries(node)
+            .filter(([key]) => !setup.ignoreProperty(key, node));
+
+        printer.tag(tag);
+
+        if (entries.length === 1) {
+            renderEntries(node, entries, '', nested /* + (Number.isFinite(index) ? '   ' : '') */);
+        } else {
+            printer.newline();
+            renderEntries(node, entries, nested, nested);
+        }
+    }
+
+    renderNode(root);
+}
