From 5088667ce337d34bc6f7a19887b07b06384d8fdc Mon Sep 17 00:00:00 2001 From: Denis Bezrukov <6227442+denbezrukov@users.noreply.github.com> Date: Thu, 9 May 2024 19:45:12 +0300 Subject: [PATCH] fix(css_parser): resolve CSS parsing issues (#2792) --- .../css/color/functional_colors.css.snap | 3 +- .../specs/prettier/css/grid/grid.css.snap | 56 - .../prettier/css/numbers/numbers.css.snap | 122 +- .../specs/prettier/css/parens/parens.css.snap | 155 +- crates/biome_css_parser/src/lexer/mod.rs | 22 +- crates/biome_css_parser/src/syntax/mod.rs | 8 +- .../tests/css_test_suite/ok/function/rgb.css | 8 + .../css_test_suite/ok/function/rgb.css.snap | 474 +++++ .../tests/css_test_suite/ok/property/grid.css | 4 + .../css_test_suite/ok/property/grid.css.snap | 147 ++ .../tests/css_test_suite/ok/values/number.css | 68 + .../css_test_suite/ok/values/number.css.snap | 1801 +++++++++++++++++ 12 files changed, 2535 insertions(+), 333 deletions(-) create mode 100644 crates/biome_css_parser/tests/css_test_suite/ok/function/rgb.css create mode 100644 crates/biome_css_parser/tests/css_test_suite/ok/function/rgb.css.snap create mode 100644 crates/biome_css_parser/tests/css_test_suite/ok/property/grid.css create mode 100644 crates/biome_css_parser/tests/css_test_suite/ok/property/grid.css.snap create mode 100644 crates/biome_css_parser/tests/css_test_suite/ok/values/number.css create mode 100644 crates/biome_css_parser/tests/css_test_suite/ok/values/number.css.snap diff --git a/crates/biome_css_formatter/tests/specs/css/color/functional_colors.css.snap b/crates/biome_css_formatter/tests/specs/css/color/functional_colors.css.snap index 26020331307..4396cc3408d 100644 --- a/crates/biome_css_formatter/tests/specs/css/color/functional_colors.css.snap +++ b/crates/biome_css_formatter/tests/specs/css/color/functional_colors.css.snap @@ -64,8 +64,7 @@ Quote style: Double Quotes .whitespace { color: rgba(51 170 51 / 0.4); - color: rgba( - 51 170 51 / 40%); + color: rgba(51 170 51 / 40%); color: hsl(270 60% 50% / 0.15); color: hsla(240 100% 50% / 0.05); color: hsla(240 100% 50% / 5%); diff --git a/crates/biome_css_formatter/tests/specs/prettier/css/grid/grid.css.snap b/crates/biome_css_formatter/tests/specs/prettier/css/grid/grid.css.snap index cc67beabead..cc36ca18c73 100644 --- a/crates/biome_css_formatter/tests/specs/prettier/css/grid/grid.css.snap +++ b/crates/biome_css_formatter/tests/specs/prettier/css/grid/grid.css.snap @@ -501,62 +501,6 @@ grid.css:83:5 parse ━━━━━━━━━━━━━━━━━━━━ - custom property - function -grid.css:109:18 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - - × Expected a number but instead found 'span'. - - 107 │ grid-column: 1 / 2; - 108 │ grid-column: main; - > 109 │ grid-row: -2 / span 1; - │ ^^^^ - 110 │ grid-row: footer; - 111 │ - - i Expected a number here. - - 107 │ grid-column: 1 / 2; - 108 │ grid-column: main; - > 109 │ grid-row: -2 / span 1; - │ ^^^^ - 110 │ grid-row: footer; - 111 │ - -grid.css:113:18 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - - × Expected a number but instead found 'main-start'. - - 112 │ grid-area: main; - > 113 │ grid-area: 1 / main-start / 3 / main-end; - │ ^^^^^^^^^^ - 114 │ } - 115 │ - - i Expected a number here. - - 112 │ grid-area: main; - > 113 │ grid-area: 1 / main-start / 3 / main-end; - │ ^^^^^^^^^^ - 114 │ } - 115 │ - -grid.css:113:35 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - - × Expected a number but instead found 'main-end'. - - 112 │ grid-area: main; - > 113 │ grid-area: 1 / main-start / 3 / main-end; - │ ^^^^^^^^ - 114 │ } - 115 │ - - i Expected a number here. - - 112 │ grid-area: main; - > 113 │ grid-area: 1 / main-start / 3 / main-end; - │ ^^^^^^^^ - 114 │ } - 115 │ - ``` diff --git a/crates/biome_css_formatter/tests/specs/prettier/css/numbers/numbers.css.snap b/crates/biome_css_formatter/tests/specs/prettier/css/numbers/numbers.css.snap index ade2fed4b29..a6313b6bf64 100644 --- a/crates/biome_css_formatter/tests/specs/prettier/css/numbers/numbers.css.snap +++ b/crates/biome_css_formatter/tests/specs/prettier/css/numbers/numbers.css.snap @@ -93,32 +93,6 @@ info: css/numbers/numbers.css a { a: 0; a: 1; -@@ -7,14 +7,14 @@ - a: 1.1; - - a: 0.1; -- a: 1; -+ a: 1.; - a: +0.1; - a: -0.1; - - a: 1e1; - a: 1e1; - a: 1e-1; -- a: 1e1; -+ a: 1.e1; - a: 0.1e1; - a: 1.1e1; - a: 1.1e10; -@@ -26,7 +26,7 @@ - a: 1e1; - a: 1e1; - a: 1e-1; -- a: 1e1; -+ a: 1.E1; - a: 0.1e1; - a: 1.1e1; - a: 1.1e10; @@ -44,23 +44,23 @@ a: 1; @@ -140,13 +114,12 @@ info: css/numbers/numbers.css + a: 1.0e60; a: 0.005e60; - a: 0e60; +- a: 0e60; + a: 0.0e60; + a: 0.0e60; + a: 0.0e60; -+ a: 0.e60; a: 0e60; -- a: 0e60; -- a: 0e60; + a: 0e60; - a: 0e60; a: 500600.001230045e60; a: 10; @@ -173,14 +146,14 @@ info: css/numbers/numbers.css a: 1.1; a: 0.1; - a: 1.; + a: 1; a: +0.1; a: -0.1; a: 1e1; a: 1e1; a: 1e-1; - a: 1.e1; + a: 1e1; a: 0.1e1; a: 1.1e1; a: 1.1e10; @@ -192,7 +165,7 @@ info: css/numbers/numbers.css a: 1e1; a: 1e1; a: 1e-1; - a: 1.E1; + a: 1e1; a: 0.1e1; a: 1.1e1; a: 1.1e10; @@ -225,7 +198,7 @@ info: css/numbers/numbers.css a: 0.0e60; a: 0.0e60; a: 0.0e60; - a: 0.e60; + a: 0e60; a: 0e60; a: 500600.001230045e60; a: 10; @@ -245,89 +218,6 @@ include single-transition(transform, .5s ease) # Errors ``` -numbers.css:10:9 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - - × Unexpected value or character. - - 9 │ a: .1; - > 10 │ a: 1.; - │ ^ - 11 │ a: +.1; - 12 │ a: -.1; - - i Expected one of: - - - identifier - - string - - number - - dimension - - ratio - - custom property - - function - -numbers.css:17:9 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - - × Unexpected value or character. - - 15 │ a: 1e+1; - 16 │ a: 1e-1; - > 17 │ a: 1.e1; - │ ^^^ - 18 │ a: .1e1; - 19 │ a: 1.1e1; - - i Expected one of: - - - identifier - - string - - number - - dimension - - ratio - - custom property - - function - -numbers.css:29:9 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - - × Unexpected value or character. - - 27 │ a: 1E+1; - 28 │ a: 1E-1; - > 29 │ a: 1.E1; - │ ^^^ - 30 │ a: .1E1; - 31 │ a: 1.1E1; - - i Expected one of: - - - identifier - - string - - number - - dimension - - ratio - - custom property - - function - -numbers.css:62:9 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - - × Unexpected value or character. - - 60 │ a: 0.0000e60; - 61 │ a: .0e60; - > 62 │ a: 0.e60; - │ ^^^^ - 63 │ a: 0e60; - 64 │ a: 500600.001230045000e60; - - i Expected one of: - - - identifier - - string - - number - - dimension - - ratio - - custom property - - function - numbers.css:73:2 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ × Unexpected value or character. diff --git a/crates/biome_css_formatter/tests/specs/prettier/css/parens/parens.css.snap b/crates/biome_css_formatter/tests/specs/prettier/css/parens/parens.css.snap index a8eb5355621..15721ae5d59 100644 --- a/crates/biome_css_formatter/tests/specs/prettier/css/parens/parens.css.snap +++ b/crates/biome_css_formatter/tests/specs/prettier/css/parens/parens.css.snap @@ -293,14 +293,15 @@ a { - prop12: 10px/8px; + prop12: 10px / 8px; prop13: round(1.5) / 2 round(1.5) / 2 round(1.5) / 2 round(1.5) / 2; -- prop14: 2 / round(1.5) 2 / round(1.5) 2 / round(1.5) 2 / round(1.5); + prop14: 2 / round(1.5) 2 / round(1.5) 2 / round(1.5) 2 / round(1.5); - prop15: (round(1.5) / 2) (round(1.5) / 2) (round(1.5) / 2) (round(1.5) / 2); - prop16: (2 / round(1.5)) (2 / round(1.5)) (2 / round(1.5)) (2 / round(1.5)); -+ prop14: 2/round(1.5) 2 /round(1.5) 2/ round(1.5) 2 / round(1.5); +- prop26: 8px/2px 8px /1 1/ 2px 1 / 2; +- prop27: 8px/2px 8px/1 1/2px 1/2; + prop15: (round(1.5)/2) (round(1.5) /2) (round(1.5)/ 2) (round(1.5) / 2); + prop16: (2/round(1.5)) (2 /round(1.5)) (2/ round(1.5)) (2 / round(1.5)); - prop26: 8px/2px 8px /1 1/ 2px 1 / 2; - prop27: 8px/2px 8px/1 1/2px 1/2; ++ prop26: 8px / 2px 8px / 1 1 / 2px 1 / 2; ++ prop27: 8px / 2px 8px / 1 1 / 2px 1 / 2; prop28: 8px / 2px 8px / 1 1 / 2px 1 / 2; prop29: (8px/2px) (8px/1) (1/2px) (1/2); prop30: (8px / 2px) (8px / 1) (1 / 2px) (1 / 2); @@ -442,11 +443,11 @@ a { prop11: (+1); prop12: 10px / 8px; prop13: round(1.5) / 2 round(1.5) / 2 round(1.5) / 2 round(1.5) / 2; - prop14: 2/round(1.5) 2 /round(1.5) 2/ round(1.5) 2 / round(1.5); + prop14: 2 / round(1.5) 2 / round(1.5) 2 / round(1.5) 2 / round(1.5); prop15: (round(1.5)/2) (round(1.5) /2) (round(1.5)/ 2) (round(1.5) / 2); prop16: (2/round(1.5)) (2 /round(1.5)) (2/ round(1.5)) (2 / round(1.5)); - prop26: 8px/2px 8px /1 1/ 2px 1 / 2; - prop27: 8px/2px 8px/1 1/2px 1/2; + prop26: 8px / 2px 8px / 1 1 / 2px 1 / 2; + prop27: 8px / 2px 8px / 1 1 / 2px 1 / 2; prop28: 8px / 2px 8px / 1 1 / 2px 1 / 2; prop29: (8px/2px) (8px/1) (1/2px) (1/2); prop30: (8px / 2px) (8px / 1) (1 / 2px) (1 / 2); @@ -670,86 +671,6 @@ parens.css:119:11 parse ━━━━━━━━━━━━━━━━━━ - custom property - function -parens.css:122:13 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - - × Expected a number but instead found 'round'. - - 120 │ prop12: 10px/8px; - 121 │ prop13: round(1.5)/2 round(1.5) /2 round(1.5)/ 2 round(1.5) / 2; - > 122 │ prop14: 2/round(1.5) 2 /round(1.5) 2/ round(1.5) 2 / round(1.5); - │ ^^^^^ - 123 │ prop15: (round(1.5)/2) (round(1.5) /2) (round(1.5)/ 2) (round(1.5) / 2); - 124 │ prop16: (2/round(1.5)) (2 /round(1.5)) (2/ round(1.5)) (2 / round(1.5)); - - i Expected a number here. - - 120 │ prop12: 10px/8px; - 121 │ prop13: round(1.5)/2 round(1.5) /2 round(1.5)/ 2 round(1.5) / 2; - > 122 │ prop14: 2/round(1.5) 2 /round(1.5) 2/ round(1.5) 2 / round(1.5); - │ ^^^^^ - 123 │ prop15: (round(1.5)/2) (round(1.5) /2) (round(1.5)/ 2) (round(1.5) / 2); - 124 │ prop16: (2/round(1.5)) (2 /round(1.5)) (2/ round(1.5)) (2 / round(1.5)); - -parens.css:122:27 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - - × Expected a number but instead found 'round'. - - 120 │ prop12: 10px/8px; - 121 │ prop13: round(1.5)/2 round(1.5) /2 round(1.5)/ 2 round(1.5) / 2; - > 122 │ prop14: 2/round(1.5) 2 /round(1.5) 2/ round(1.5) 2 / round(1.5); - │ ^^^^^ - 123 │ prop15: (round(1.5)/2) (round(1.5) /2) (round(1.5)/ 2) (round(1.5) / 2); - 124 │ prop16: (2/round(1.5)) (2 /round(1.5)) (2/ round(1.5)) (2 / round(1.5)); - - i Expected a number here. - - 120 │ prop12: 10px/8px; - 121 │ prop13: round(1.5)/2 round(1.5) /2 round(1.5)/ 2 round(1.5) / 2; - > 122 │ prop14: 2/round(1.5) 2 /round(1.5) 2/ round(1.5) 2 / round(1.5); - │ ^^^^^ - 123 │ prop15: (round(1.5)/2) (round(1.5) /2) (round(1.5)/ 2) (round(1.5) / 2); - 124 │ prop16: (2/round(1.5)) (2 /round(1.5)) (2/ round(1.5)) (2 / round(1.5)); - -parens.css:122:41 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - - × Expected a number but instead found 'round'. - - 120 │ prop12: 10px/8px; - 121 │ prop13: round(1.5)/2 round(1.5) /2 round(1.5)/ 2 round(1.5) / 2; - > 122 │ prop14: 2/round(1.5) 2 /round(1.5) 2/ round(1.5) 2 / round(1.5); - │ ^^^^^ - 123 │ prop15: (round(1.5)/2) (round(1.5) /2) (round(1.5)/ 2) (round(1.5) / 2); - 124 │ prop16: (2/round(1.5)) (2 /round(1.5)) (2/ round(1.5)) (2 / round(1.5)); - - i Expected a number here. - - 120 │ prop12: 10px/8px; - 121 │ prop13: round(1.5)/2 round(1.5) /2 round(1.5)/ 2 round(1.5) / 2; - > 122 │ prop14: 2/round(1.5) 2 /round(1.5) 2/ round(1.5) 2 / round(1.5); - │ ^^^^^ - 123 │ prop15: (round(1.5)/2) (round(1.5) /2) (round(1.5)/ 2) (round(1.5) / 2); - 124 │ prop16: (2/round(1.5)) (2 /round(1.5)) (2/ round(1.5)) (2 / round(1.5)); - -parens.css:122:56 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - - × Expected a number but instead found 'round'. - - 120 │ prop12: 10px/8px; - 121 │ prop13: round(1.5)/2 round(1.5) /2 round(1.5)/ 2 round(1.5) / 2; - > 122 │ prop14: 2/round(1.5) 2 /round(1.5) 2/ round(1.5) 2 / round(1.5); - │ ^^^^^ - 123 │ prop15: (round(1.5)/2) (round(1.5) /2) (round(1.5)/ 2) (round(1.5) / 2); - 124 │ prop16: (2/round(1.5)) (2 /round(1.5)) (2/ round(1.5)) (2 / round(1.5)); - - i Expected a number here. - - 120 │ prop12: 10px/8px; - 121 │ prop13: round(1.5)/2 round(1.5) /2 round(1.5)/ 2 round(1.5) / 2; - > 122 │ prop14: 2/round(1.5) 2 /round(1.5) 2/ round(1.5) 2 / round(1.5); - │ ^^^^^ - 123 │ prop15: (round(1.5)/2) (round(1.5) /2) (round(1.5)/ 2) (round(1.5) / 2); - 124 │ prop16: (2/round(1.5)) (2 /round(1.5)) (2/ round(1.5)) (2 / round(1.5)); - parens.css:123:11 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ × Unexpected value or character. @@ -792,66 +713,6 @@ parens.css:124:11 parse ━━━━━━━━━━━━━━━━━━ - custom property - function -parens.css:125:29 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - - × Expected a number but instead found '2'. - - 123 │ prop15: (round(1.5)/2) (round(1.5) /2) (round(1.5)/ 2) (round(1.5) / 2); - 124 │ prop16: (2/round(1.5)) (2 /round(1.5)) (2/ round(1.5)) (2 / round(1.5)); - > 125 │ prop26: 8px/2px 8px /1 1/ 2px 1 / 2; - │ ^ - 126 │ prop27: 8px/2px 8px/1 1/2px 1/2; - 127 │ prop28: 8px / 2px 8px / 1 1 / 2px 1 / 2; - - i Expected a number here. - - 123 │ prop15: (round(1.5)/2) (round(1.5) /2) (round(1.5)/ 2) (round(1.5) / 2); - 124 │ prop16: (2/round(1.5)) (2 /round(1.5)) (2/ round(1.5)) (2 / round(1.5)); - > 125 │ prop26: 8px/2px 8px /1 1/ 2px 1 / 2; - │ ^ - 126 │ prop27: 8px/2px 8px/1 1/2px 1/2; - 127 │ prop28: 8px / 2px 8px / 1 1 / 2px 1 / 2; - -parens.css:126:27 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - - × Expected a number but instead found '2'. - - 124 │ prop16: (2/round(1.5)) (2 /round(1.5)) (2/ round(1.5)) (2 / round(1.5)); - 125 │ prop26: 8px/2px 8px /1 1/ 2px 1 / 2; - > 126 │ prop27: 8px/2px 8px/1 1/2px 1/2; - │ ^ - 127 │ prop28: 8px / 2px 8px / 1 1 / 2px 1 / 2; - 128 │ prop29: (8px/2px) (8px/1) (1/2px) (1/2); - - i Expected a number here. - - 124 │ prop16: (2/round(1.5)) (2 /round(1.5)) (2/ round(1.5)) (2 / round(1.5)); - 125 │ prop26: 8px/2px 8px /1 1/ 2px 1 / 2; - > 126 │ prop27: 8px/2px 8px/1 1/2px 1/2; - │ ^ - 127 │ prop28: 8px / 2px 8px / 1 1 / 2px 1 / 2; - 128 │ prop29: (8px/2px) (8px/1) (1/2px) (1/2); - -parens.css:127:33 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - - × Expected a number but instead found '2'. - - 125 │ prop26: 8px/2px 8px /1 1/ 2px 1 / 2; - 126 │ prop27: 8px/2px 8px/1 1/2px 1/2; - > 127 │ prop28: 8px / 2px 8px / 1 1 / 2px 1 / 2; - │ ^ - 128 │ prop29: (8px/2px) (8px/1) (1/2px) (1/2); - 129 │ prop30: (8px / 2px) (8px / 1) (1 / 2px) (1 / 2); - - i Expected a number here. - - 125 │ prop26: 8px/2px 8px /1 1/ 2px 1 / 2; - 126 │ prop27: 8px/2px 8px/1 1/2px 1/2; - > 127 │ prop28: 8px / 2px 8px / 1 1 / 2px 1 / 2; - │ ^ - 128 │ prop29: (8px/2px) (8px/1) (1/2px) (1/2); - 129 │ prop30: (8px / 2px) (8px / 1) (1 / 2px) (1 / 2); - parens.css:128:11 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ × Unexpected value or character. diff --git a/crates/biome_css_parser/src/lexer/mod.rs b/crates/biome_css_parser/src/lexer/mod.rs index d6ee8bb0cd7..91ab39e5504 100644 --- a/crates/biome_css_parser/src/lexer/mod.rs +++ b/crates/biome_css_parser/src/lexer/mod.rs @@ -569,15 +569,21 @@ impl<'src> CssLexer<'src> { // While the next input code point is a digit, consume it. self.consume_number_sequence(); - // If the next 2 input code points are U+002E FULL STOP (.) followed by a digit... - if matches!(self.current_byte(), Some(b'.')) - && self.peek_byte().map_or(false, |byte| byte.is_ascii_digit()) - { - // Consume them. - self.advance(2); + // According to the spec if the next 2 input code points are U+002E FULL STOP (.) followed by a digit we need to consume them. + // However we want to parse numbers like `1.` and `1.e10` where we don't have a number after (.) + // If the next input code points are U+002E FULL STOP (.)... + if matches!(self.current_byte(), Some(b'.')) { + // Consume it. + self.advance(1); - // While the next input code point is a digit, consume it. - self.consume_number_sequence() + // U+002E FULL STOP (.) followed by a digit... + if self + .current_byte() + .map_or(false, |byte| byte.is_ascii_digit()) + { + // While the next input code point is a digit, consume it. + self.consume_number_sequence(); + } } // If the next 2 or 3 input code points are U+0045 LATIN CAPITAL LETTER E (E) or diff --git a/crates/biome_css_parser/src/syntax/mod.rs b/crates/biome_css_parser/src/syntax/mod.rs index fb603ee7169..2f471e6abe7 100644 --- a/crates/biome_css_parser/src/syntax/mod.rs +++ b/crates/biome_css_parser/src/syntax/mod.rs @@ -25,7 +25,7 @@ use biome_parser::{token_set, Parser}; use value::dimension::{is_at_any_dimension, parse_any_dimension}; use value::function::{is_at_any_function, parse_any_function}; -use self::parse_error::{expected_component_value, expected_declaration_item, expected_number}; +use self::parse_error::{expected_component_value, expected_declaration_item}; pub(crate) fn parse_root(p: &mut CssParser) { let m = p.start(); p.eat(UNICODE_BOM); @@ -311,7 +311,7 @@ impl ParseNodeList for CssComponentValueList { #[inline] pub(crate) fn is_at_ratio(p: &mut CssParser) -> bool { - p.at(CSS_NUMBER_LITERAL) && p.nth_at(1, T![/]) + p.at(CSS_NUMBER_LITERAL) && p.nth_at(1, T![/]) && p.nth_at(2, CSS_NUMBER_LITERAL) } #[inline] @@ -321,8 +321,8 @@ pub(crate) fn parse_ratio(p: &mut CssParser) -> ParsedSyntax { } let m = p.start(); parse_regular_number(p).ok(); - p.eat(T![/]); - parse_regular_number(p).or_add_diagnostic(p, expected_number); + p.bump(T![/]); + parse_regular_number(p).ok(); Present(m.complete(p, CSS_RATIO)) } diff --git a/crates/biome_css_parser/tests/css_test_suite/ok/function/rgb.css b/crates/biome_css_parser/tests/css_test_suite/ok/function/rgb.css new file mode 100644 index 00000000000..f16fe980930 --- /dev/null +++ b/crates/biome_css_parser/tests/css_test_suite/ok/function/rgb.css @@ -0,0 +1,8 @@ +.class { + text-shadow: 0 1px rgb(0 0 0 / var(--glass-text-shadow-opacity, 5%)) +} + +.class { + box-shadow: 0 0 0 1px rgb(255 255 255 / var(--glass-border-opacity, 10%)) inset, + 0 0 0 2px rgb(0 0 0 / 5%) +} diff --git a/crates/biome_css_parser/tests/css_test_suite/ok/function/rgb.css.snap b/crates/biome_css_parser/tests/css_test_suite/ok/function/rgb.css.snap new file mode 100644 index 00000000000..ef25af4b95c --- /dev/null +++ b/crates/biome_css_parser/tests/css_test_suite/ok/function/rgb.css.snap @@ -0,0 +1,474 @@ +--- +source: crates/biome_css_parser/tests/spec_test.rs +expression: snapshot +--- +## Input + +```css +.class { + text-shadow: 0 1px rgb(0 0 0 / var(--glass-text-shadow-opacity, 5%)) +} + +.class { + box-shadow: 0 0 0 1px rgb(255 255 255 / var(--glass-border-opacity, 10%)) inset, + 0 0 0 2px rgb(0 0 0 / 5%) +} + +``` + + +## AST + +``` +CssRoot { + bom_token: missing (optional), + rules: CssRuleList [ + CssQualifiedRule { + prelude: CssSelectorList [ + CssCompoundSelector { + nesting_selector_token: missing (optional), + simple_selector: missing (optional), + sub_selectors: CssSubSelectorList [ + CssClassSelector { + dot_token: DOT@0..1 "." [] [], + name: CssCustomIdentifier { + value_token: IDENT@1..7 "class" [] [Whitespace(" ")], + }, + }, + ], + }, + ], + block: CssDeclarationOrRuleBlock { + l_curly_token: L_CURLY@7..8 "{" [] [], + items: CssDeclarationOrRuleList [ + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@8..21 "text-shadow" [Newline("\n"), Whitespace("\t")] [], + }, + colon_token: COLON@21..23 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@23..25 "0" [] [Whitespace(" ")], + }, + CssRegularDimension { + value_token: CSS_NUMBER_LITERAL@25..26 "1" [] [], + unit_token: IDENT@26..29 "px" [] [Whitespace(" ")], + }, + CssFunction { + name: CssIdentifier { + value_token: IDENT@29..32 "rgb" [] [], + }, + l_paren_token: L_PAREN@32..33 "(" [] [], + items: CssParameterList [ + CssParameter { + any_css_expression: CssBinaryExpression { + left: CssListOfComponentValuesExpression { + css_component_value_list: CssComponentValueList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@33..35 "0" [] [Whitespace(" ")], + }, + CssNumber { + value_token: CSS_NUMBER_LITERAL@35..37 "0" [] [Whitespace(" ")], + }, + CssNumber { + value_token: CSS_NUMBER_LITERAL@37..39 "0" [] [Whitespace(" ")], + }, + ], + }, + operator_token: SLASH@39..41 "/" [] [Whitespace(" ")], + right: CssListOfComponentValuesExpression { + css_component_value_list: CssComponentValueList [ + CssFunction { + name: CssIdentifier { + value_token: IDENT@41..44 "var" [] [], + }, + l_paren_token: L_PAREN@44..45 "(" [] [], + items: CssParameterList [ + CssParameter { + any_css_expression: CssListOfComponentValuesExpression { + css_component_value_list: CssComponentValueList [ + CssDashedIdentifier { + value_token: IDENT@45..72 "--glass-text-shadow-opacity" [] [], + }, + ], + }, + }, + COMMA@72..74 "," [] [Whitespace(" ")], + CssParameter { + any_css_expression: CssListOfComponentValuesExpression { + css_component_value_list: CssComponentValueList [ + CssPercentage { + value_token: CSS_NUMBER_LITERAL@74..75 "5" [] [], + percent_token: PERCENT@75..76 "%" [] [], + }, + ], + }, + }, + ], + r_paren_token: R_PAREN@76..77 ")" [] [], + }, + ], + }, + }, + }, + ], + r_paren_token: R_PAREN@77..78 ")" [] [], + }, + ], + }, + important: missing (optional), + }, + semicolon_token: missing (optional), + }, + ], + r_curly_token: R_CURLY@78..80 "}" [Newline("\n")] [], + }, + }, + CssQualifiedRule { + prelude: CssSelectorList [ + CssCompoundSelector { + nesting_selector_token: missing (optional), + simple_selector: missing (optional), + sub_selectors: CssSubSelectorList [ + CssClassSelector { + dot_token: DOT@80..83 "." [Newline("\n"), Newline("\n")] [], + name: CssCustomIdentifier { + value_token: IDENT@83..89 "class" [] [Whitespace(" ")], + }, + }, + ], + }, + ], + block: CssDeclarationOrRuleBlock { + l_curly_token: L_CURLY@89..90 "{" [] [], + items: CssDeclarationOrRuleList [ + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@90..102 "box-shadow" [Newline("\n"), Whitespace("\t")] [], + }, + colon_token: COLON@102..104 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@104..106 "0" [] [Whitespace(" ")], + }, + CssNumber { + value_token: CSS_NUMBER_LITERAL@106..108 "0" [] [Whitespace(" ")], + }, + CssNumber { + value_token: CSS_NUMBER_LITERAL@108..110 "0" [] [Whitespace(" ")], + }, + CssRegularDimension { + value_token: CSS_NUMBER_LITERAL@110..111 "1" [] [], + unit_token: IDENT@111..114 "px" [] [Whitespace(" ")], + }, + CssFunction { + name: CssIdentifier { + value_token: IDENT@114..117 "rgb" [] [], + }, + l_paren_token: L_PAREN@117..118 "(" [] [], + items: CssParameterList [ + CssParameter { + any_css_expression: CssBinaryExpression { + left: CssListOfComponentValuesExpression { + css_component_value_list: CssComponentValueList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@118..122 "255" [] [Whitespace(" ")], + }, + CssNumber { + value_token: CSS_NUMBER_LITERAL@122..126 "255" [] [Whitespace(" ")], + }, + CssNumber { + value_token: CSS_NUMBER_LITERAL@126..130 "255" [] [Whitespace(" ")], + }, + ], + }, + operator_token: SLASH@130..132 "/" [] [Whitespace(" ")], + right: CssListOfComponentValuesExpression { + css_component_value_list: CssComponentValueList [ + CssFunction { + name: CssIdentifier { + value_token: IDENT@132..135 "var" [] [], + }, + l_paren_token: L_PAREN@135..136 "(" [] [], + items: CssParameterList [ + CssParameter { + any_css_expression: CssListOfComponentValuesExpression { + css_component_value_list: CssComponentValueList [ + CssDashedIdentifier { + value_token: IDENT@136..158 "--glass-border-opacity" [] [], + }, + ], + }, + }, + COMMA@158..160 "," [] [Whitespace(" ")], + CssParameter { + any_css_expression: CssListOfComponentValuesExpression { + css_component_value_list: CssComponentValueList [ + CssPercentage { + value_token: CSS_NUMBER_LITERAL@160..162 "10" [] [], + percent_token: PERCENT@162..163 "%" [] [], + }, + ], + }, + }, + ], + r_paren_token: R_PAREN@163..164 ")" [] [], + }, + ], + }, + }, + }, + ], + r_paren_token: R_PAREN@164..166 ")" [] [Whitespace(" ")], + }, + CssIdentifier { + value_token: IDENT@166..171 "inset" [] [], + }, + CssGenericDelimiter { + value: COMMA@171..172 "," [] [], + }, + CssNumber { + value_token: CSS_NUMBER_LITERAL@172..176 "0" [Newline("\n"), Whitespace("\t")] [Whitespace(" ")], + }, + CssNumber { + value_token: CSS_NUMBER_LITERAL@176..178 "0" [] [Whitespace(" ")], + }, + CssNumber { + value_token: CSS_NUMBER_LITERAL@178..180 "0" [] [Whitespace(" ")], + }, + CssRegularDimension { + value_token: CSS_NUMBER_LITERAL@180..181 "2" [] [], + unit_token: IDENT@181..184 "px" [] [Whitespace(" ")], + }, + CssFunction { + name: CssIdentifier { + value_token: IDENT@184..187 "rgb" [] [], + }, + l_paren_token: L_PAREN@187..188 "(" [] [], + items: CssParameterList [ + CssParameter { + any_css_expression: CssBinaryExpression { + left: CssListOfComponentValuesExpression { + css_component_value_list: CssComponentValueList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@188..190 "0" [] [Whitespace(" ")], + }, + CssNumber { + value_token: CSS_NUMBER_LITERAL@190..192 "0" [] [Whitespace(" ")], + }, + CssNumber { + value_token: CSS_NUMBER_LITERAL@192..194 "0" [] [Whitespace(" ")], + }, + ], + }, + operator_token: SLASH@194..196 "/" [] [Whitespace(" ")], + right: CssListOfComponentValuesExpression { + css_component_value_list: CssComponentValueList [ + CssPercentage { + value_token: CSS_NUMBER_LITERAL@196..197 "5" [] [], + percent_token: PERCENT@197..198 "%" [] [], + }, + ], + }, + }, + }, + ], + r_paren_token: R_PAREN@198..199 ")" [] [], + }, + ], + }, + important: missing (optional), + }, + semicolon_token: missing (optional), + }, + ], + r_curly_token: R_CURLY@199..201 "}" [Newline("\n")] [], + }, + }, + ], + eof_token: EOF@201..202 "" [Newline("\n")] [], +} +``` + +## CST + +``` +0: CSS_ROOT@0..202 + 0: (empty) + 1: CSS_RULE_LIST@0..201 + 0: CSS_QUALIFIED_RULE@0..80 + 0: CSS_SELECTOR_LIST@0..7 + 0: CSS_COMPOUND_SELECTOR@0..7 + 0: (empty) + 1: (empty) + 2: CSS_SUB_SELECTOR_LIST@0..7 + 0: CSS_CLASS_SELECTOR@0..7 + 0: DOT@0..1 "." [] [] + 1: CSS_CUSTOM_IDENTIFIER@1..7 + 0: IDENT@1..7 "class" [] [Whitespace(" ")] + 1: CSS_DECLARATION_OR_RULE_BLOCK@7..80 + 0: L_CURLY@7..8 "{" [] [] + 1: CSS_DECLARATION_OR_RULE_LIST@8..78 + 0: CSS_DECLARATION_WITH_SEMICOLON@8..78 + 0: CSS_DECLARATION@8..78 + 0: CSS_GENERIC_PROPERTY@8..78 + 0: CSS_IDENTIFIER@8..21 + 0: IDENT@8..21 "text-shadow" [Newline("\n"), Whitespace("\t")] [] + 1: COLON@21..23 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@23..78 + 0: CSS_NUMBER@23..25 + 0: CSS_NUMBER_LITERAL@23..25 "0" [] [Whitespace(" ")] + 1: CSS_REGULAR_DIMENSION@25..29 + 0: CSS_NUMBER_LITERAL@25..26 "1" [] [] + 1: IDENT@26..29 "px" [] [Whitespace(" ")] + 2: CSS_FUNCTION@29..78 + 0: CSS_IDENTIFIER@29..32 + 0: IDENT@29..32 "rgb" [] [] + 1: L_PAREN@32..33 "(" [] [] + 2: CSS_PARAMETER_LIST@33..77 + 0: CSS_PARAMETER@33..77 + 0: CSS_BINARY_EXPRESSION@33..77 + 0: CSS_LIST_OF_COMPONENT_VALUES_EXPRESSION@33..39 + 0: CSS_COMPONENT_VALUE_LIST@33..39 + 0: CSS_NUMBER@33..35 + 0: CSS_NUMBER_LITERAL@33..35 "0" [] [Whitespace(" ")] + 1: CSS_NUMBER@35..37 + 0: CSS_NUMBER_LITERAL@35..37 "0" [] [Whitespace(" ")] + 2: CSS_NUMBER@37..39 + 0: CSS_NUMBER_LITERAL@37..39 "0" [] [Whitespace(" ")] + 1: SLASH@39..41 "/" [] [Whitespace(" ")] + 2: CSS_LIST_OF_COMPONENT_VALUES_EXPRESSION@41..77 + 0: CSS_COMPONENT_VALUE_LIST@41..77 + 0: CSS_FUNCTION@41..77 + 0: CSS_IDENTIFIER@41..44 + 0: IDENT@41..44 "var" [] [] + 1: L_PAREN@44..45 "(" [] [] + 2: CSS_PARAMETER_LIST@45..76 + 0: CSS_PARAMETER@45..72 + 0: CSS_LIST_OF_COMPONENT_VALUES_EXPRESSION@45..72 + 0: CSS_COMPONENT_VALUE_LIST@45..72 + 0: CSS_DASHED_IDENTIFIER@45..72 + 0: IDENT@45..72 "--glass-text-shadow-opacity" [] [] + 1: COMMA@72..74 "," [] [Whitespace(" ")] + 2: CSS_PARAMETER@74..76 + 0: CSS_LIST_OF_COMPONENT_VALUES_EXPRESSION@74..76 + 0: CSS_COMPONENT_VALUE_LIST@74..76 + 0: CSS_PERCENTAGE@74..76 + 0: CSS_NUMBER_LITERAL@74..75 "5" [] [] + 1: PERCENT@75..76 "%" [] [] + 3: R_PAREN@76..77 ")" [] [] + 3: R_PAREN@77..78 ")" [] [] + 1: (empty) + 1: (empty) + 2: R_CURLY@78..80 "}" [Newline("\n")] [] + 1: CSS_QUALIFIED_RULE@80..201 + 0: CSS_SELECTOR_LIST@80..89 + 0: CSS_COMPOUND_SELECTOR@80..89 + 0: (empty) + 1: (empty) + 2: CSS_SUB_SELECTOR_LIST@80..89 + 0: CSS_CLASS_SELECTOR@80..89 + 0: DOT@80..83 "." [Newline("\n"), Newline("\n")] [] + 1: CSS_CUSTOM_IDENTIFIER@83..89 + 0: IDENT@83..89 "class" [] [Whitespace(" ")] + 1: CSS_DECLARATION_OR_RULE_BLOCK@89..201 + 0: L_CURLY@89..90 "{" [] [] + 1: CSS_DECLARATION_OR_RULE_LIST@90..199 + 0: CSS_DECLARATION_WITH_SEMICOLON@90..199 + 0: CSS_DECLARATION@90..199 + 0: CSS_GENERIC_PROPERTY@90..199 + 0: CSS_IDENTIFIER@90..102 + 0: IDENT@90..102 "box-shadow" [Newline("\n"), Whitespace("\t")] [] + 1: COLON@102..104 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@104..199 + 0: CSS_NUMBER@104..106 + 0: CSS_NUMBER_LITERAL@104..106 "0" [] [Whitespace(" ")] + 1: CSS_NUMBER@106..108 + 0: CSS_NUMBER_LITERAL@106..108 "0" [] [Whitespace(" ")] + 2: CSS_NUMBER@108..110 + 0: CSS_NUMBER_LITERAL@108..110 "0" [] [Whitespace(" ")] + 3: CSS_REGULAR_DIMENSION@110..114 + 0: CSS_NUMBER_LITERAL@110..111 "1" [] [] + 1: IDENT@111..114 "px" [] [Whitespace(" ")] + 4: CSS_FUNCTION@114..166 + 0: CSS_IDENTIFIER@114..117 + 0: IDENT@114..117 "rgb" [] [] + 1: L_PAREN@117..118 "(" [] [] + 2: CSS_PARAMETER_LIST@118..164 + 0: CSS_PARAMETER@118..164 + 0: CSS_BINARY_EXPRESSION@118..164 + 0: CSS_LIST_OF_COMPONENT_VALUES_EXPRESSION@118..130 + 0: CSS_COMPONENT_VALUE_LIST@118..130 + 0: CSS_NUMBER@118..122 + 0: CSS_NUMBER_LITERAL@118..122 "255" [] [Whitespace(" ")] + 1: CSS_NUMBER@122..126 + 0: CSS_NUMBER_LITERAL@122..126 "255" [] [Whitespace(" ")] + 2: CSS_NUMBER@126..130 + 0: CSS_NUMBER_LITERAL@126..130 "255" [] [Whitespace(" ")] + 1: SLASH@130..132 "/" [] [Whitespace(" ")] + 2: CSS_LIST_OF_COMPONENT_VALUES_EXPRESSION@132..164 + 0: CSS_COMPONENT_VALUE_LIST@132..164 + 0: CSS_FUNCTION@132..164 + 0: CSS_IDENTIFIER@132..135 + 0: IDENT@132..135 "var" [] [] + 1: L_PAREN@135..136 "(" [] [] + 2: CSS_PARAMETER_LIST@136..163 + 0: CSS_PARAMETER@136..158 + 0: CSS_LIST_OF_COMPONENT_VALUES_EXPRESSION@136..158 + 0: CSS_COMPONENT_VALUE_LIST@136..158 + 0: CSS_DASHED_IDENTIFIER@136..158 + 0: IDENT@136..158 "--glass-border-opacity" [] [] + 1: COMMA@158..160 "," [] [Whitespace(" ")] + 2: CSS_PARAMETER@160..163 + 0: CSS_LIST_OF_COMPONENT_VALUES_EXPRESSION@160..163 + 0: CSS_COMPONENT_VALUE_LIST@160..163 + 0: CSS_PERCENTAGE@160..163 + 0: CSS_NUMBER_LITERAL@160..162 "10" [] [] + 1: PERCENT@162..163 "%" [] [] + 3: R_PAREN@163..164 ")" [] [] + 3: R_PAREN@164..166 ")" [] [Whitespace(" ")] + 5: CSS_IDENTIFIER@166..171 + 0: IDENT@166..171 "inset" [] [] + 6: CSS_GENERIC_DELIMITER@171..172 + 0: COMMA@171..172 "," [] [] + 7: CSS_NUMBER@172..176 + 0: CSS_NUMBER_LITERAL@172..176 "0" [Newline("\n"), Whitespace("\t")] [Whitespace(" ")] + 8: CSS_NUMBER@176..178 + 0: CSS_NUMBER_LITERAL@176..178 "0" [] [Whitespace(" ")] + 9: CSS_NUMBER@178..180 + 0: CSS_NUMBER_LITERAL@178..180 "0" [] [Whitespace(" ")] + 10: CSS_REGULAR_DIMENSION@180..184 + 0: CSS_NUMBER_LITERAL@180..181 "2" [] [] + 1: IDENT@181..184 "px" [] [Whitespace(" ")] + 11: CSS_FUNCTION@184..199 + 0: CSS_IDENTIFIER@184..187 + 0: IDENT@184..187 "rgb" [] [] + 1: L_PAREN@187..188 "(" [] [] + 2: CSS_PARAMETER_LIST@188..198 + 0: CSS_PARAMETER@188..198 + 0: CSS_BINARY_EXPRESSION@188..198 + 0: CSS_LIST_OF_COMPONENT_VALUES_EXPRESSION@188..194 + 0: CSS_COMPONENT_VALUE_LIST@188..194 + 0: CSS_NUMBER@188..190 + 0: CSS_NUMBER_LITERAL@188..190 "0" [] [Whitespace(" ")] + 1: CSS_NUMBER@190..192 + 0: CSS_NUMBER_LITERAL@190..192 "0" [] [Whitespace(" ")] + 2: CSS_NUMBER@192..194 + 0: CSS_NUMBER_LITERAL@192..194 "0" [] [Whitespace(" ")] + 1: SLASH@194..196 "/" [] [Whitespace(" ")] + 2: CSS_LIST_OF_COMPONENT_VALUES_EXPRESSION@196..198 + 0: CSS_COMPONENT_VALUE_LIST@196..198 + 0: CSS_PERCENTAGE@196..198 + 0: CSS_NUMBER_LITERAL@196..197 "5" [] [] + 1: PERCENT@197..198 "%" [] [] + 3: R_PAREN@198..199 ")" [] [] + 1: (empty) + 1: (empty) + 2: R_CURLY@199..201 "}" [Newline("\n")] [] + 2: EOF@201..202 "" [Newline("\n")] [] + +``` diff --git a/crates/biome_css_parser/tests/css_test_suite/ok/property/grid.css b/crates/biome_css_parser/tests/css_test_suite/ok/property/grid.css new file mode 100644 index 00000000000..0acbfb12eed --- /dev/null +++ b/crates/biome_css_parser/tests/css_test_suite/ok/property/grid.css @@ -0,0 +1,4 @@ +.chat-image { + grid-row: span 2 / span 2; + align-self: flex-end +} diff --git a/crates/biome_css_parser/tests/css_test_suite/ok/property/grid.css.snap b/crates/biome_css_parser/tests/css_test_suite/ok/property/grid.css.snap new file mode 100644 index 00000000000..aad11e38bca --- /dev/null +++ b/crates/biome_css_parser/tests/css_test_suite/ok/property/grid.css.snap @@ -0,0 +1,147 @@ +--- +source: crates/biome_css_parser/tests/spec_test.rs +expression: snapshot +--- +## Input + +```css +.chat-image { + grid-row: span 2 / span 2; + align-self: flex-end +} + +``` + + +## AST + +``` +CssRoot { + bom_token: missing (optional), + rules: CssRuleList [ + CssQualifiedRule { + prelude: CssSelectorList [ + CssCompoundSelector { + nesting_selector_token: missing (optional), + simple_selector: missing (optional), + sub_selectors: CssSubSelectorList [ + CssClassSelector { + dot_token: DOT@0..1 "." [] [], + name: CssCustomIdentifier { + value_token: IDENT@1..12 "chat-image" [] [Whitespace(" ")], + }, + }, + ], + }, + ], + block: CssDeclarationOrRuleBlock { + l_curly_token: L_CURLY@12..13 "{" [] [], + items: CssDeclarationOrRuleList [ + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@13..23 "grid-row" [Newline("\n"), Whitespace("\t")] [], + }, + colon_token: COLON@23..25 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssIdentifier { + value_token: IDENT@25..30 "span" [] [Whitespace(" ")], + }, + CssNumber { + value_token: CSS_NUMBER_LITERAL@30..32 "2" [] [Whitespace(" ")], + }, + CssGenericDelimiter { + value: SLASH@32..34 "/" [] [Whitespace(" ")], + }, + CssIdentifier { + value_token: IDENT@34..39 "span" [] [Whitespace(" ")], + }, + CssNumber { + value_token: CSS_NUMBER_LITERAL@39..40 "2" [] [], + }, + ], + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@40..41 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@41..53 "align-self" [Newline("\n"), Whitespace("\t")] [], + }, + colon_token: COLON@53..55 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssIdentifier { + value_token: IDENT@55..63 "flex-end" [] [], + }, + ], + }, + important: missing (optional), + }, + semicolon_token: missing (optional), + }, + ], + r_curly_token: R_CURLY@63..65 "}" [Newline("\n")] [], + }, + }, + ], + eof_token: EOF@65..66 "" [Newline("\n")] [], +} +``` + +## CST + +``` +0: CSS_ROOT@0..66 + 0: (empty) + 1: CSS_RULE_LIST@0..65 + 0: CSS_QUALIFIED_RULE@0..65 + 0: CSS_SELECTOR_LIST@0..12 + 0: CSS_COMPOUND_SELECTOR@0..12 + 0: (empty) + 1: (empty) + 2: CSS_SUB_SELECTOR_LIST@0..12 + 0: CSS_CLASS_SELECTOR@0..12 + 0: DOT@0..1 "." [] [] + 1: CSS_CUSTOM_IDENTIFIER@1..12 + 0: IDENT@1..12 "chat-image" [] [Whitespace(" ")] + 1: CSS_DECLARATION_OR_RULE_BLOCK@12..65 + 0: L_CURLY@12..13 "{" [] [] + 1: CSS_DECLARATION_OR_RULE_LIST@13..63 + 0: CSS_DECLARATION_WITH_SEMICOLON@13..41 + 0: CSS_DECLARATION@13..40 + 0: CSS_GENERIC_PROPERTY@13..40 + 0: CSS_IDENTIFIER@13..23 + 0: IDENT@13..23 "grid-row" [Newline("\n"), Whitespace("\t")] [] + 1: COLON@23..25 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@25..40 + 0: CSS_IDENTIFIER@25..30 + 0: IDENT@25..30 "span" [] [Whitespace(" ")] + 1: CSS_NUMBER@30..32 + 0: CSS_NUMBER_LITERAL@30..32 "2" [] [Whitespace(" ")] + 2: CSS_GENERIC_DELIMITER@32..34 + 0: SLASH@32..34 "/" [] [Whitespace(" ")] + 3: CSS_IDENTIFIER@34..39 + 0: IDENT@34..39 "span" [] [Whitespace(" ")] + 4: CSS_NUMBER@39..40 + 0: CSS_NUMBER_LITERAL@39..40 "2" [] [] + 1: (empty) + 1: SEMICOLON@40..41 ";" [] [] + 1: CSS_DECLARATION_WITH_SEMICOLON@41..63 + 0: CSS_DECLARATION@41..63 + 0: CSS_GENERIC_PROPERTY@41..63 + 0: CSS_IDENTIFIER@41..53 + 0: IDENT@41..53 "align-self" [Newline("\n"), Whitespace("\t")] [] + 1: COLON@53..55 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@55..63 + 0: CSS_IDENTIFIER@55..63 + 0: IDENT@55..63 "flex-end" [] [] + 1: (empty) + 1: (empty) + 2: R_CURLY@63..65 "}" [Newline("\n")] [] + 2: EOF@65..66 "" [Newline("\n")] [] + +``` diff --git a/crates/biome_css_parser/tests/css_test_suite/ok/values/number.css b/crates/biome_css_parser/tests/css_test_suite/ok/values/number.css new file mode 100644 index 00000000000..9ac5d3e74e8 --- /dev/null +++ b/crates/biome_css_parser/tests/css_test_suite/ok/values/number.css @@ -0,0 +1,68 @@ +a { + a: 0; + a: 1; + + a: 0.1; + a: 1.1; + + a: .1; + a: 1.; + a: +.1; + a: -.1; + + a: 1e1; + a: 1e+1; + a: 1e-1; + a: 1.e1; + a: .1e1; + a: 1.1e1; + a: 1.1e0010; + a: +1.1e0010; + a: -1.1e0010; + a: .1e+0010; + a: .1e-0010; + + a: 1E1; + a: 1E+1; + a: 1E-1; + a: 1.E1; + a: .1E1; + a: 1.1E1; + a: 1.1E0010; + a: .1E+0010; + a: .1E-0010; + + a: 0.5e0; + a: 0.5e00; + a: 0.5e+0; + a: 0.5e+00; + a: 0.5e-0; + a: 0.5e-00; + a: +0.5e0; + a: -0.5e0; + + a: 1; + a: 1.00500; + a: 1.0; + a: 1.5; + a: 1.50; + + a: 0.00500; + a: 0.0; + a: 0.0000; + + a: 500600.001230045000; + a: 1.00500e60; + a: 1.0e60; + a: 0.00500e60; + a: 0.0e60; + a: 0.0000e60; + a: .0e60; + a: 0.e60; + a: 0e60; + a: 500600.001230045000e60; + a: 10; + a: 9700; + a: 10e100; + height: attr(data-size em, .01); +} diff --git a/crates/biome_css_parser/tests/css_test_suite/ok/values/number.css.snap b/crates/biome_css_parser/tests/css_test_suite/ok/values/number.css.snap new file mode 100644 index 00000000000..56b8d8cd9ae --- /dev/null +++ b/crates/biome_css_parser/tests/css_test_suite/ok/values/number.css.snap @@ -0,0 +1,1801 @@ +--- +source: crates/biome_css_parser/tests/spec_test.rs +expression: snapshot +--- +## Input + +```css +a { + a: 0; + a: 1; + + a: 0.1; + a: 1.1; + + a: .1; + a: 1.; + a: +.1; + a: -.1; + + a: 1e1; + a: 1e+1; + a: 1e-1; + a: 1.e1; + a: .1e1; + a: 1.1e1; + a: 1.1e0010; + a: +1.1e0010; + a: -1.1e0010; + a: .1e+0010; + a: .1e-0010; + + a: 1E1; + a: 1E+1; + a: 1E-1; + a: 1.E1; + a: .1E1; + a: 1.1E1; + a: 1.1E0010; + a: .1E+0010; + a: .1E-0010; + + a: 0.5e0; + a: 0.5e00; + a: 0.5e+0; + a: 0.5e+00; + a: 0.5e-0; + a: 0.5e-00; + a: +0.5e0; + a: -0.5e0; + + a: 1; + a: 1.00500; + a: 1.0; + a: 1.5; + a: 1.50; + + a: 0.00500; + a: 0.0; + a: 0.0000; + + a: 500600.001230045000; + a: 1.00500e60; + a: 1.0e60; + a: 0.00500e60; + a: 0.0e60; + a: 0.0000e60; + a: .0e60; + a: 0.e60; + a: 0e60; + a: 500600.001230045000e60; + a: 10; + a: 9700; + a: 10e100; + height: attr(data-size em, .01); +} + +``` + + +## AST + +``` +CssRoot { + bom_token: missing (optional), + rules: CssRuleList [ + CssQualifiedRule { + prelude: CssSelectorList [ + CssCompoundSelector { + nesting_selector_token: missing (optional), + simple_selector: CssTypeSelector { + namespace: missing (optional), + ident: CssIdentifier { + value_token: IDENT@0..2 "a" [] [Whitespace(" ")], + }, + }, + sub_selectors: CssSubSelectorList [], + }, + ], + block: CssDeclarationOrRuleBlock { + l_curly_token: L_CURLY@2..3 "{" [] [], + items: CssDeclarationOrRuleList [ + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@3..6 "a" [Newline("\n"), Whitespace("\t")] [], + }, + colon_token: COLON@6..8 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@8..9 "0" [] [], + }, + ], + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@9..10 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@10..13 "a" [Newline("\n"), Whitespace("\t")] [], + }, + colon_token: COLON@13..15 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@15..16 "1" [] [], + }, + ], + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@16..17 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@17..21 "a" [Newline("\n"), Newline("\n"), Whitespace("\t")] [], + }, + colon_token: COLON@21..23 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@23..26 "0.1" [] [], + }, + ], + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@26..27 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@27..30 "a" [Newline("\n"), Whitespace("\t")] [], + }, + colon_token: COLON@30..32 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@32..35 "1.1" [] [], + }, + ], + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@35..36 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@36..40 "a" [Newline("\n"), Newline("\n"), Whitespace("\t")] [], + }, + colon_token: COLON@40..42 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@42..44 ".1" [] [], + }, + ], + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@44..45 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@45..48 "a" [Newline("\n"), Whitespace("\t")] [], + }, + colon_token: COLON@48..50 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@50..52 "1." [] [], + }, + ], + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@52..53 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@53..56 "a" [Newline("\n"), Whitespace("\t")] [], + }, + colon_token: COLON@56..58 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@58..61 "+.1" [] [], + }, + ], + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@61..62 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@62..65 "a" [Newline("\n"), Whitespace("\t")] [], + }, + colon_token: COLON@65..67 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@67..70 "-.1" [] [], + }, + ], + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@70..71 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@71..75 "a" [Newline("\n"), Newline("\n"), Whitespace("\t")] [], + }, + colon_token: COLON@75..77 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@77..80 "1e1" [] [], + }, + ], + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@80..81 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@81..84 "a" [Newline("\n"), Whitespace("\t")] [], + }, + colon_token: COLON@84..86 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@86..90 "1e+1" [] [], + }, + ], + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@90..91 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@91..94 "a" [Newline("\n"), Whitespace("\t")] [], + }, + colon_token: COLON@94..96 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@96..100 "1e-1" [] [], + }, + ], + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@100..101 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@101..104 "a" [Newline("\n"), Whitespace("\t")] [], + }, + colon_token: COLON@104..106 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@106..110 "1.e1" [] [], + }, + ], + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@110..111 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@111..114 "a" [Newline("\n"), Whitespace("\t")] [], + }, + colon_token: COLON@114..116 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@116..120 ".1e1" [] [], + }, + ], + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@120..121 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@121..124 "a" [Newline("\n"), Whitespace("\t")] [], + }, + colon_token: COLON@124..126 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@126..131 "1.1e1" [] [], + }, + ], + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@131..132 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@132..135 "a" [Newline("\n"), Whitespace("\t")] [], + }, + colon_token: COLON@135..137 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@137..145 "1.1e0010" [] [], + }, + ], + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@145..146 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@146..149 "a" [Newline("\n"), Whitespace("\t")] [], + }, + colon_token: COLON@149..151 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@151..160 "+1.1e0010" [] [], + }, + ], + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@160..161 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@161..164 "a" [Newline("\n"), Whitespace("\t")] [], + }, + colon_token: COLON@164..166 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@166..175 "-1.1e0010" [] [], + }, + ], + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@175..176 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@176..179 "a" [Newline("\n"), Whitespace("\t")] [], + }, + colon_token: COLON@179..181 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@181..189 ".1e+0010" [] [], + }, + ], + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@189..190 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@190..193 "a" [Newline("\n"), Whitespace("\t")] [], + }, + colon_token: COLON@193..195 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@195..203 ".1e-0010" [] [], + }, + ], + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@203..204 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@204..208 "a" [Newline("\n"), Newline("\n"), Whitespace("\t")] [], + }, + colon_token: COLON@208..210 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@210..213 "1E1" [] [], + }, + ], + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@213..214 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@214..217 "a" [Newline("\n"), Whitespace("\t")] [], + }, + colon_token: COLON@217..219 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@219..223 "1E+1" [] [], + }, + ], + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@223..224 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@224..227 "a" [Newline("\n"), Whitespace("\t")] [], + }, + colon_token: COLON@227..229 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@229..233 "1E-1" [] [], + }, + ], + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@233..234 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@234..237 "a" [Newline("\n"), Whitespace("\t")] [], + }, + colon_token: COLON@237..239 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@239..243 "1.E1" [] [], + }, + ], + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@243..244 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@244..247 "a" [Newline("\n"), Whitespace("\t")] [], + }, + colon_token: COLON@247..249 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@249..253 ".1E1" [] [], + }, + ], + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@253..254 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@254..257 "a" [Newline("\n"), Whitespace("\t")] [], + }, + colon_token: COLON@257..259 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@259..264 "1.1E1" [] [], + }, + ], + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@264..265 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@265..268 "a" [Newline("\n"), Whitespace("\t")] [], + }, + colon_token: COLON@268..270 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@270..278 "1.1E0010" [] [], + }, + ], + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@278..279 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@279..282 "a" [Newline("\n"), Whitespace("\t")] [], + }, + colon_token: COLON@282..284 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@284..292 ".1E+0010" [] [], + }, + ], + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@292..293 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@293..296 "a" [Newline("\n"), Whitespace("\t")] [], + }, + colon_token: COLON@296..298 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@298..306 ".1E-0010" [] [], + }, + ], + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@306..307 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@307..311 "a" [Newline("\n"), Newline("\n"), Whitespace("\t")] [], + }, + colon_token: COLON@311..313 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@313..318 "0.5e0" [] [], + }, + ], + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@318..319 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@319..322 "a" [Newline("\n"), Whitespace("\t")] [], + }, + colon_token: COLON@322..324 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@324..330 "0.5e00" [] [], + }, + ], + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@330..331 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@331..334 "a" [Newline("\n"), Whitespace("\t")] [], + }, + colon_token: COLON@334..336 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@336..342 "0.5e+0" [] [], + }, + ], + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@342..343 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@343..346 "a" [Newline("\n"), Whitespace("\t")] [], + }, + colon_token: COLON@346..348 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@348..355 "0.5e+00" [] [], + }, + ], + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@355..356 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@356..359 "a" [Newline("\n"), Whitespace("\t")] [], + }, + colon_token: COLON@359..361 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@361..367 "0.5e-0" [] [], + }, + ], + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@367..368 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@368..371 "a" [Newline("\n"), Whitespace("\t")] [], + }, + colon_token: COLON@371..373 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@373..380 "0.5e-00" [] [], + }, + ], + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@380..381 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@381..384 "a" [Newline("\n"), Whitespace("\t")] [], + }, + colon_token: COLON@384..386 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@386..392 "+0.5e0" [] [], + }, + ], + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@392..393 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@393..396 "a" [Newline("\n"), Whitespace("\t")] [], + }, + colon_token: COLON@396..398 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@398..404 "-0.5e0" [] [], + }, + ], + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@404..405 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@405..409 "a" [Newline("\n"), Newline("\n"), Whitespace("\t")] [], + }, + colon_token: COLON@409..411 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@411..412 "1" [] [], + }, + ], + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@412..413 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@413..416 "a" [Newline("\n"), Whitespace("\t")] [], + }, + colon_token: COLON@416..418 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@418..425 "1.00500" [] [], + }, + ], + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@425..426 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@426..429 "a" [Newline("\n"), Whitespace("\t")] [], + }, + colon_token: COLON@429..431 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@431..434 "1.0" [] [], + }, + ], + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@434..435 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@435..438 "a" [Newline("\n"), Whitespace("\t")] [], + }, + colon_token: COLON@438..440 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@440..443 "1.5" [] [], + }, + ], + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@443..444 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@444..447 "a" [Newline("\n"), Whitespace("\t")] [], + }, + colon_token: COLON@447..449 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@449..453 "1.50" [] [], + }, + ], + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@453..454 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@454..458 "a" [Newline("\n"), Newline("\n"), Whitespace("\t")] [], + }, + colon_token: COLON@458..460 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@460..467 "0.00500" [] [], + }, + ], + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@467..468 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@468..471 "a" [Newline("\n"), Whitespace("\t")] [], + }, + colon_token: COLON@471..473 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@473..476 "0.0" [] [], + }, + ], + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@476..477 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@477..480 "a" [Newline("\n"), Whitespace("\t")] [], + }, + colon_token: COLON@480..482 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@482..488 "0.0000" [] [], + }, + ], + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@488..489 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@489..493 "a" [Newline("\n"), Newline("\n"), Whitespace("\t")] [], + }, + colon_token: COLON@493..495 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@495..514 "500600.001230045000" [] [], + }, + ], + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@514..515 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@515..518 "a" [Newline("\n"), Whitespace("\t")] [], + }, + colon_token: COLON@518..520 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@520..530 "1.00500e60" [] [], + }, + ], + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@530..531 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@531..534 "a" [Newline("\n"), Whitespace("\t")] [], + }, + colon_token: COLON@534..536 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@536..542 "1.0e60" [] [], + }, + ], + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@542..543 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@543..546 "a" [Newline("\n"), Whitespace("\t")] [], + }, + colon_token: COLON@546..548 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@548..558 "0.00500e60" [] [], + }, + ], + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@558..559 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@559..562 "a" [Newline("\n"), Whitespace("\t")] [], + }, + colon_token: COLON@562..564 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@564..570 "0.0e60" [] [], + }, + ], + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@570..571 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@571..574 "a" [Newline("\n"), Whitespace("\t")] [], + }, + colon_token: COLON@574..576 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@576..585 "0.0000e60" [] [], + }, + ], + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@585..586 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@586..589 "a" [Newline("\n"), Whitespace("\t")] [], + }, + colon_token: COLON@589..591 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@591..596 ".0e60" [] [], + }, + ], + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@596..597 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@597..600 "a" [Newline("\n"), Whitespace("\t")] [], + }, + colon_token: COLON@600..602 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@602..607 "0.e60" [] [], + }, + ], + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@607..608 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@608..611 "a" [Newline("\n"), Whitespace("\t")] [], + }, + colon_token: COLON@611..613 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@613..617 "0e60" [] [], + }, + ], + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@617..618 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@618..621 "a" [Newline("\n"), Whitespace("\t")] [], + }, + colon_token: COLON@621..623 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@623..645 "500600.001230045000e60" [] [], + }, + ], + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@645..646 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@646..649 "a" [Newline("\n"), Whitespace("\t")] [], + }, + colon_token: COLON@649..651 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@651..653 "10" [] [], + }, + ], + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@653..654 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@654..657 "a" [Newline("\n"), Whitespace("\t")] [], + }, + colon_token: COLON@657..659 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@659..663 "9700" [] [], + }, + ], + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@663..664 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@664..667 "a" [Newline("\n"), Whitespace("\t")] [], + }, + colon_token: COLON@667..669 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@669..675 "10e100" [] [], + }, + ], + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@675..676 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@676..684 "height" [Newline("\n"), Whitespace("\t")] [], + }, + colon_token: COLON@684..686 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssFunction { + name: CssIdentifier { + value_token: IDENT@686..690 "attr" [] [], + }, + l_paren_token: L_PAREN@690..691 "(" [] [], + items: CssParameterList [ + CssParameter { + any_css_expression: CssListOfComponentValuesExpression { + css_component_value_list: CssComponentValueList [ + CssIdentifier { + value_token: IDENT@691..701 "data-size" [] [Whitespace(" ")], + }, + CssIdentifier { + value_token: IDENT@701..703 "em" [] [], + }, + ], + }, + }, + COMMA@703..705 "," [] [Whitespace(" ")], + CssParameter { + any_css_expression: CssListOfComponentValuesExpression { + css_component_value_list: CssComponentValueList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@705..708 ".01" [] [], + }, + ], + }, + }, + ], + r_paren_token: R_PAREN@708..709 ")" [] [], + }, + ], + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@709..710 ";" [] [], + }, + ], + r_curly_token: R_CURLY@710..712 "}" [Newline("\n")] [], + }, + }, + ], + eof_token: EOF@712..713 "" [Newline("\n")] [], +} +``` + +## CST + +``` +0: CSS_ROOT@0..713 + 0: (empty) + 1: CSS_RULE_LIST@0..712 + 0: CSS_QUALIFIED_RULE@0..712 + 0: CSS_SELECTOR_LIST@0..2 + 0: CSS_COMPOUND_SELECTOR@0..2 + 0: (empty) + 1: CSS_TYPE_SELECTOR@0..2 + 0: (empty) + 1: CSS_IDENTIFIER@0..2 + 0: IDENT@0..2 "a" [] [Whitespace(" ")] + 2: CSS_SUB_SELECTOR_LIST@2..2 + 1: CSS_DECLARATION_OR_RULE_BLOCK@2..712 + 0: L_CURLY@2..3 "{" [] [] + 1: CSS_DECLARATION_OR_RULE_LIST@3..710 + 0: CSS_DECLARATION_WITH_SEMICOLON@3..10 + 0: CSS_DECLARATION@3..9 + 0: CSS_GENERIC_PROPERTY@3..9 + 0: CSS_IDENTIFIER@3..6 + 0: IDENT@3..6 "a" [Newline("\n"), Whitespace("\t")] [] + 1: COLON@6..8 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@8..9 + 0: CSS_NUMBER@8..9 + 0: CSS_NUMBER_LITERAL@8..9 "0" [] [] + 1: (empty) + 1: SEMICOLON@9..10 ";" [] [] + 1: CSS_DECLARATION_WITH_SEMICOLON@10..17 + 0: CSS_DECLARATION@10..16 + 0: CSS_GENERIC_PROPERTY@10..16 + 0: CSS_IDENTIFIER@10..13 + 0: IDENT@10..13 "a" [Newline("\n"), Whitespace("\t")] [] + 1: COLON@13..15 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@15..16 + 0: CSS_NUMBER@15..16 + 0: CSS_NUMBER_LITERAL@15..16 "1" [] [] + 1: (empty) + 1: SEMICOLON@16..17 ";" [] [] + 2: CSS_DECLARATION_WITH_SEMICOLON@17..27 + 0: CSS_DECLARATION@17..26 + 0: CSS_GENERIC_PROPERTY@17..26 + 0: CSS_IDENTIFIER@17..21 + 0: IDENT@17..21 "a" [Newline("\n"), Newline("\n"), Whitespace("\t")] [] + 1: COLON@21..23 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@23..26 + 0: CSS_NUMBER@23..26 + 0: CSS_NUMBER_LITERAL@23..26 "0.1" [] [] + 1: (empty) + 1: SEMICOLON@26..27 ";" [] [] + 3: CSS_DECLARATION_WITH_SEMICOLON@27..36 + 0: CSS_DECLARATION@27..35 + 0: CSS_GENERIC_PROPERTY@27..35 + 0: CSS_IDENTIFIER@27..30 + 0: IDENT@27..30 "a" [Newline("\n"), Whitespace("\t")] [] + 1: COLON@30..32 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@32..35 + 0: CSS_NUMBER@32..35 + 0: CSS_NUMBER_LITERAL@32..35 "1.1" [] [] + 1: (empty) + 1: SEMICOLON@35..36 ";" [] [] + 4: CSS_DECLARATION_WITH_SEMICOLON@36..45 + 0: CSS_DECLARATION@36..44 + 0: CSS_GENERIC_PROPERTY@36..44 + 0: CSS_IDENTIFIER@36..40 + 0: IDENT@36..40 "a" [Newline("\n"), Newline("\n"), Whitespace("\t")] [] + 1: COLON@40..42 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@42..44 + 0: CSS_NUMBER@42..44 + 0: CSS_NUMBER_LITERAL@42..44 ".1" [] [] + 1: (empty) + 1: SEMICOLON@44..45 ";" [] [] + 5: CSS_DECLARATION_WITH_SEMICOLON@45..53 + 0: CSS_DECLARATION@45..52 + 0: CSS_GENERIC_PROPERTY@45..52 + 0: CSS_IDENTIFIER@45..48 + 0: IDENT@45..48 "a" [Newline("\n"), Whitespace("\t")] [] + 1: COLON@48..50 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@50..52 + 0: CSS_NUMBER@50..52 + 0: CSS_NUMBER_LITERAL@50..52 "1." [] [] + 1: (empty) + 1: SEMICOLON@52..53 ";" [] [] + 6: CSS_DECLARATION_WITH_SEMICOLON@53..62 + 0: CSS_DECLARATION@53..61 + 0: CSS_GENERIC_PROPERTY@53..61 + 0: CSS_IDENTIFIER@53..56 + 0: IDENT@53..56 "a" [Newline("\n"), Whitespace("\t")] [] + 1: COLON@56..58 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@58..61 + 0: CSS_NUMBER@58..61 + 0: CSS_NUMBER_LITERAL@58..61 "+.1" [] [] + 1: (empty) + 1: SEMICOLON@61..62 ";" [] [] + 7: CSS_DECLARATION_WITH_SEMICOLON@62..71 + 0: CSS_DECLARATION@62..70 + 0: CSS_GENERIC_PROPERTY@62..70 + 0: CSS_IDENTIFIER@62..65 + 0: IDENT@62..65 "a" [Newline("\n"), Whitespace("\t")] [] + 1: COLON@65..67 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@67..70 + 0: CSS_NUMBER@67..70 + 0: CSS_NUMBER_LITERAL@67..70 "-.1" [] [] + 1: (empty) + 1: SEMICOLON@70..71 ";" [] [] + 8: CSS_DECLARATION_WITH_SEMICOLON@71..81 + 0: CSS_DECLARATION@71..80 + 0: CSS_GENERIC_PROPERTY@71..80 + 0: CSS_IDENTIFIER@71..75 + 0: IDENT@71..75 "a" [Newline("\n"), Newline("\n"), Whitespace("\t")] [] + 1: COLON@75..77 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@77..80 + 0: CSS_NUMBER@77..80 + 0: CSS_NUMBER_LITERAL@77..80 "1e1" [] [] + 1: (empty) + 1: SEMICOLON@80..81 ";" [] [] + 9: CSS_DECLARATION_WITH_SEMICOLON@81..91 + 0: CSS_DECLARATION@81..90 + 0: CSS_GENERIC_PROPERTY@81..90 + 0: CSS_IDENTIFIER@81..84 + 0: IDENT@81..84 "a" [Newline("\n"), Whitespace("\t")] [] + 1: COLON@84..86 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@86..90 + 0: CSS_NUMBER@86..90 + 0: CSS_NUMBER_LITERAL@86..90 "1e+1" [] [] + 1: (empty) + 1: SEMICOLON@90..91 ";" [] [] + 10: CSS_DECLARATION_WITH_SEMICOLON@91..101 + 0: CSS_DECLARATION@91..100 + 0: CSS_GENERIC_PROPERTY@91..100 + 0: CSS_IDENTIFIER@91..94 + 0: IDENT@91..94 "a" [Newline("\n"), Whitespace("\t")] [] + 1: COLON@94..96 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@96..100 + 0: CSS_NUMBER@96..100 + 0: CSS_NUMBER_LITERAL@96..100 "1e-1" [] [] + 1: (empty) + 1: SEMICOLON@100..101 ";" [] [] + 11: CSS_DECLARATION_WITH_SEMICOLON@101..111 + 0: CSS_DECLARATION@101..110 + 0: CSS_GENERIC_PROPERTY@101..110 + 0: CSS_IDENTIFIER@101..104 + 0: IDENT@101..104 "a" [Newline("\n"), Whitespace("\t")] [] + 1: COLON@104..106 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@106..110 + 0: CSS_NUMBER@106..110 + 0: CSS_NUMBER_LITERAL@106..110 "1.e1" [] [] + 1: (empty) + 1: SEMICOLON@110..111 ";" [] [] + 12: CSS_DECLARATION_WITH_SEMICOLON@111..121 + 0: CSS_DECLARATION@111..120 + 0: CSS_GENERIC_PROPERTY@111..120 + 0: CSS_IDENTIFIER@111..114 + 0: IDENT@111..114 "a" [Newline("\n"), Whitespace("\t")] [] + 1: COLON@114..116 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@116..120 + 0: CSS_NUMBER@116..120 + 0: CSS_NUMBER_LITERAL@116..120 ".1e1" [] [] + 1: (empty) + 1: SEMICOLON@120..121 ";" [] [] + 13: CSS_DECLARATION_WITH_SEMICOLON@121..132 + 0: CSS_DECLARATION@121..131 + 0: CSS_GENERIC_PROPERTY@121..131 + 0: CSS_IDENTIFIER@121..124 + 0: IDENT@121..124 "a" [Newline("\n"), Whitespace("\t")] [] + 1: COLON@124..126 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@126..131 + 0: CSS_NUMBER@126..131 + 0: CSS_NUMBER_LITERAL@126..131 "1.1e1" [] [] + 1: (empty) + 1: SEMICOLON@131..132 ";" [] [] + 14: CSS_DECLARATION_WITH_SEMICOLON@132..146 + 0: CSS_DECLARATION@132..145 + 0: CSS_GENERIC_PROPERTY@132..145 + 0: CSS_IDENTIFIER@132..135 + 0: IDENT@132..135 "a" [Newline("\n"), Whitespace("\t")] [] + 1: COLON@135..137 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@137..145 + 0: CSS_NUMBER@137..145 + 0: CSS_NUMBER_LITERAL@137..145 "1.1e0010" [] [] + 1: (empty) + 1: SEMICOLON@145..146 ";" [] [] + 15: CSS_DECLARATION_WITH_SEMICOLON@146..161 + 0: CSS_DECLARATION@146..160 + 0: CSS_GENERIC_PROPERTY@146..160 + 0: CSS_IDENTIFIER@146..149 + 0: IDENT@146..149 "a" [Newline("\n"), Whitespace("\t")] [] + 1: COLON@149..151 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@151..160 + 0: CSS_NUMBER@151..160 + 0: CSS_NUMBER_LITERAL@151..160 "+1.1e0010" [] [] + 1: (empty) + 1: SEMICOLON@160..161 ";" [] [] + 16: CSS_DECLARATION_WITH_SEMICOLON@161..176 + 0: CSS_DECLARATION@161..175 + 0: CSS_GENERIC_PROPERTY@161..175 + 0: CSS_IDENTIFIER@161..164 + 0: IDENT@161..164 "a" [Newline("\n"), Whitespace("\t")] [] + 1: COLON@164..166 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@166..175 + 0: CSS_NUMBER@166..175 + 0: CSS_NUMBER_LITERAL@166..175 "-1.1e0010" [] [] + 1: (empty) + 1: SEMICOLON@175..176 ";" [] [] + 17: CSS_DECLARATION_WITH_SEMICOLON@176..190 + 0: CSS_DECLARATION@176..189 + 0: CSS_GENERIC_PROPERTY@176..189 + 0: CSS_IDENTIFIER@176..179 + 0: IDENT@176..179 "a" [Newline("\n"), Whitespace("\t")] [] + 1: COLON@179..181 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@181..189 + 0: CSS_NUMBER@181..189 + 0: CSS_NUMBER_LITERAL@181..189 ".1e+0010" [] [] + 1: (empty) + 1: SEMICOLON@189..190 ";" [] [] + 18: CSS_DECLARATION_WITH_SEMICOLON@190..204 + 0: CSS_DECLARATION@190..203 + 0: CSS_GENERIC_PROPERTY@190..203 + 0: CSS_IDENTIFIER@190..193 + 0: IDENT@190..193 "a" [Newline("\n"), Whitespace("\t")] [] + 1: COLON@193..195 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@195..203 + 0: CSS_NUMBER@195..203 + 0: CSS_NUMBER_LITERAL@195..203 ".1e-0010" [] [] + 1: (empty) + 1: SEMICOLON@203..204 ";" [] [] + 19: CSS_DECLARATION_WITH_SEMICOLON@204..214 + 0: CSS_DECLARATION@204..213 + 0: CSS_GENERIC_PROPERTY@204..213 + 0: CSS_IDENTIFIER@204..208 + 0: IDENT@204..208 "a" [Newline("\n"), Newline("\n"), Whitespace("\t")] [] + 1: COLON@208..210 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@210..213 + 0: CSS_NUMBER@210..213 + 0: CSS_NUMBER_LITERAL@210..213 "1E1" [] [] + 1: (empty) + 1: SEMICOLON@213..214 ";" [] [] + 20: CSS_DECLARATION_WITH_SEMICOLON@214..224 + 0: CSS_DECLARATION@214..223 + 0: CSS_GENERIC_PROPERTY@214..223 + 0: CSS_IDENTIFIER@214..217 + 0: IDENT@214..217 "a" [Newline("\n"), Whitespace("\t")] [] + 1: COLON@217..219 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@219..223 + 0: CSS_NUMBER@219..223 + 0: CSS_NUMBER_LITERAL@219..223 "1E+1" [] [] + 1: (empty) + 1: SEMICOLON@223..224 ";" [] [] + 21: CSS_DECLARATION_WITH_SEMICOLON@224..234 + 0: CSS_DECLARATION@224..233 + 0: CSS_GENERIC_PROPERTY@224..233 + 0: CSS_IDENTIFIER@224..227 + 0: IDENT@224..227 "a" [Newline("\n"), Whitespace("\t")] [] + 1: COLON@227..229 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@229..233 + 0: CSS_NUMBER@229..233 + 0: CSS_NUMBER_LITERAL@229..233 "1E-1" [] [] + 1: (empty) + 1: SEMICOLON@233..234 ";" [] [] + 22: CSS_DECLARATION_WITH_SEMICOLON@234..244 + 0: CSS_DECLARATION@234..243 + 0: CSS_GENERIC_PROPERTY@234..243 + 0: CSS_IDENTIFIER@234..237 + 0: IDENT@234..237 "a" [Newline("\n"), Whitespace("\t")] [] + 1: COLON@237..239 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@239..243 + 0: CSS_NUMBER@239..243 + 0: CSS_NUMBER_LITERAL@239..243 "1.E1" [] [] + 1: (empty) + 1: SEMICOLON@243..244 ";" [] [] + 23: CSS_DECLARATION_WITH_SEMICOLON@244..254 + 0: CSS_DECLARATION@244..253 + 0: CSS_GENERIC_PROPERTY@244..253 + 0: CSS_IDENTIFIER@244..247 + 0: IDENT@244..247 "a" [Newline("\n"), Whitespace("\t")] [] + 1: COLON@247..249 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@249..253 + 0: CSS_NUMBER@249..253 + 0: CSS_NUMBER_LITERAL@249..253 ".1E1" [] [] + 1: (empty) + 1: SEMICOLON@253..254 ";" [] [] + 24: CSS_DECLARATION_WITH_SEMICOLON@254..265 + 0: CSS_DECLARATION@254..264 + 0: CSS_GENERIC_PROPERTY@254..264 + 0: CSS_IDENTIFIER@254..257 + 0: IDENT@254..257 "a" [Newline("\n"), Whitespace("\t")] [] + 1: COLON@257..259 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@259..264 + 0: CSS_NUMBER@259..264 + 0: CSS_NUMBER_LITERAL@259..264 "1.1E1" [] [] + 1: (empty) + 1: SEMICOLON@264..265 ";" [] [] + 25: CSS_DECLARATION_WITH_SEMICOLON@265..279 + 0: CSS_DECLARATION@265..278 + 0: CSS_GENERIC_PROPERTY@265..278 + 0: CSS_IDENTIFIER@265..268 + 0: IDENT@265..268 "a" [Newline("\n"), Whitespace("\t")] [] + 1: COLON@268..270 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@270..278 + 0: CSS_NUMBER@270..278 + 0: CSS_NUMBER_LITERAL@270..278 "1.1E0010" [] [] + 1: (empty) + 1: SEMICOLON@278..279 ";" [] [] + 26: CSS_DECLARATION_WITH_SEMICOLON@279..293 + 0: CSS_DECLARATION@279..292 + 0: CSS_GENERIC_PROPERTY@279..292 + 0: CSS_IDENTIFIER@279..282 + 0: IDENT@279..282 "a" [Newline("\n"), Whitespace("\t")] [] + 1: COLON@282..284 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@284..292 + 0: CSS_NUMBER@284..292 + 0: CSS_NUMBER_LITERAL@284..292 ".1E+0010" [] [] + 1: (empty) + 1: SEMICOLON@292..293 ";" [] [] + 27: CSS_DECLARATION_WITH_SEMICOLON@293..307 + 0: CSS_DECLARATION@293..306 + 0: CSS_GENERIC_PROPERTY@293..306 + 0: CSS_IDENTIFIER@293..296 + 0: IDENT@293..296 "a" [Newline("\n"), Whitespace("\t")] [] + 1: COLON@296..298 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@298..306 + 0: CSS_NUMBER@298..306 + 0: CSS_NUMBER_LITERAL@298..306 ".1E-0010" [] [] + 1: (empty) + 1: SEMICOLON@306..307 ";" [] [] + 28: CSS_DECLARATION_WITH_SEMICOLON@307..319 + 0: CSS_DECLARATION@307..318 + 0: CSS_GENERIC_PROPERTY@307..318 + 0: CSS_IDENTIFIER@307..311 + 0: IDENT@307..311 "a" [Newline("\n"), Newline("\n"), Whitespace("\t")] [] + 1: COLON@311..313 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@313..318 + 0: CSS_NUMBER@313..318 + 0: CSS_NUMBER_LITERAL@313..318 "0.5e0" [] [] + 1: (empty) + 1: SEMICOLON@318..319 ";" [] [] + 29: CSS_DECLARATION_WITH_SEMICOLON@319..331 + 0: CSS_DECLARATION@319..330 + 0: CSS_GENERIC_PROPERTY@319..330 + 0: CSS_IDENTIFIER@319..322 + 0: IDENT@319..322 "a" [Newline("\n"), Whitespace("\t")] [] + 1: COLON@322..324 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@324..330 + 0: CSS_NUMBER@324..330 + 0: CSS_NUMBER_LITERAL@324..330 "0.5e00" [] [] + 1: (empty) + 1: SEMICOLON@330..331 ";" [] [] + 30: CSS_DECLARATION_WITH_SEMICOLON@331..343 + 0: CSS_DECLARATION@331..342 + 0: CSS_GENERIC_PROPERTY@331..342 + 0: CSS_IDENTIFIER@331..334 + 0: IDENT@331..334 "a" [Newline("\n"), Whitespace("\t")] [] + 1: COLON@334..336 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@336..342 + 0: CSS_NUMBER@336..342 + 0: CSS_NUMBER_LITERAL@336..342 "0.5e+0" [] [] + 1: (empty) + 1: SEMICOLON@342..343 ";" [] [] + 31: CSS_DECLARATION_WITH_SEMICOLON@343..356 + 0: CSS_DECLARATION@343..355 + 0: CSS_GENERIC_PROPERTY@343..355 + 0: CSS_IDENTIFIER@343..346 + 0: IDENT@343..346 "a" [Newline("\n"), Whitespace("\t")] [] + 1: COLON@346..348 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@348..355 + 0: CSS_NUMBER@348..355 + 0: CSS_NUMBER_LITERAL@348..355 "0.5e+00" [] [] + 1: (empty) + 1: SEMICOLON@355..356 ";" [] [] + 32: CSS_DECLARATION_WITH_SEMICOLON@356..368 + 0: CSS_DECLARATION@356..367 + 0: CSS_GENERIC_PROPERTY@356..367 + 0: CSS_IDENTIFIER@356..359 + 0: IDENT@356..359 "a" [Newline("\n"), Whitespace("\t")] [] + 1: COLON@359..361 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@361..367 + 0: CSS_NUMBER@361..367 + 0: CSS_NUMBER_LITERAL@361..367 "0.5e-0" [] [] + 1: (empty) + 1: SEMICOLON@367..368 ";" [] [] + 33: CSS_DECLARATION_WITH_SEMICOLON@368..381 + 0: CSS_DECLARATION@368..380 + 0: CSS_GENERIC_PROPERTY@368..380 + 0: CSS_IDENTIFIER@368..371 + 0: IDENT@368..371 "a" [Newline("\n"), Whitespace("\t")] [] + 1: COLON@371..373 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@373..380 + 0: CSS_NUMBER@373..380 + 0: CSS_NUMBER_LITERAL@373..380 "0.5e-00" [] [] + 1: (empty) + 1: SEMICOLON@380..381 ";" [] [] + 34: CSS_DECLARATION_WITH_SEMICOLON@381..393 + 0: CSS_DECLARATION@381..392 + 0: CSS_GENERIC_PROPERTY@381..392 + 0: CSS_IDENTIFIER@381..384 + 0: IDENT@381..384 "a" [Newline("\n"), Whitespace("\t")] [] + 1: COLON@384..386 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@386..392 + 0: CSS_NUMBER@386..392 + 0: CSS_NUMBER_LITERAL@386..392 "+0.5e0" [] [] + 1: (empty) + 1: SEMICOLON@392..393 ";" [] [] + 35: CSS_DECLARATION_WITH_SEMICOLON@393..405 + 0: CSS_DECLARATION@393..404 + 0: CSS_GENERIC_PROPERTY@393..404 + 0: CSS_IDENTIFIER@393..396 + 0: IDENT@393..396 "a" [Newline("\n"), Whitespace("\t")] [] + 1: COLON@396..398 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@398..404 + 0: CSS_NUMBER@398..404 + 0: CSS_NUMBER_LITERAL@398..404 "-0.5e0" [] [] + 1: (empty) + 1: SEMICOLON@404..405 ";" [] [] + 36: CSS_DECLARATION_WITH_SEMICOLON@405..413 + 0: CSS_DECLARATION@405..412 + 0: CSS_GENERIC_PROPERTY@405..412 + 0: CSS_IDENTIFIER@405..409 + 0: IDENT@405..409 "a" [Newline("\n"), Newline("\n"), Whitespace("\t")] [] + 1: COLON@409..411 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@411..412 + 0: CSS_NUMBER@411..412 + 0: CSS_NUMBER_LITERAL@411..412 "1" [] [] + 1: (empty) + 1: SEMICOLON@412..413 ";" [] [] + 37: CSS_DECLARATION_WITH_SEMICOLON@413..426 + 0: CSS_DECLARATION@413..425 + 0: CSS_GENERIC_PROPERTY@413..425 + 0: CSS_IDENTIFIER@413..416 + 0: IDENT@413..416 "a" [Newline("\n"), Whitespace("\t")] [] + 1: COLON@416..418 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@418..425 + 0: CSS_NUMBER@418..425 + 0: CSS_NUMBER_LITERAL@418..425 "1.00500" [] [] + 1: (empty) + 1: SEMICOLON@425..426 ";" [] [] + 38: CSS_DECLARATION_WITH_SEMICOLON@426..435 + 0: CSS_DECLARATION@426..434 + 0: CSS_GENERIC_PROPERTY@426..434 + 0: CSS_IDENTIFIER@426..429 + 0: IDENT@426..429 "a" [Newline("\n"), Whitespace("\t")] [] + 1: COLON@429..431 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@431..434 + 0: CSS_NUMBER@431..434 + 0: CSS_NUMBER_LITERAL@431..434 "1.0" [] [] + 1: (empty) + 1: SEMICOLON@434..435 ";" [] [] + 39: CSS_DECLARATION_WITH_SEMICOLON@435..444 + 0: CSS_DECLARATION@435..443 + 0: CSS_GENERIC_PROPERTY@435..443 + 0: CSS_IDENTIFIER@435..438 + 0: IDENT@435..438 "a" [Newline("\n"), Whitespace("\t")] [] + 1: COLON@438..440 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@440..443 + 0: CSS_NUMBER@440..443 + 0: CSS_NUMBER_LITERAL@440..443 "1.5" [] [] + 1: (empty) + 1: SEMICOLON@443..444 ";" [] [] + 40: CSS_DECLARATION_WITH_SEMICOLON@444..454 + 0: CSS_DECLARATION@444..453 + 0: CSS_GENERIC_PROPERTY@444..453 + 0: CSS_IDENTIFIER@444..447 + 0: IDENT@444..447 "a" [Newline("\n"), Whitespace("\t")] [] + 1: COLON@447..449 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@449..453 + 0: CSS_NUMBER@449..453 + 0: CSS_NUMBER_LITERAL@449..453 "1.50" [] [] + 1: (empty) + 1: SEMICOLON@453..454 ";" [] [] + 41: CSS_DECLARATION_WITH_SEMICOLON@454..468 + 0: CSS_DECLARATION@454..467 + 0: CSS_GENERIC_PROPERTY@454..467 + 0: CSS_IDENTIFIER@454..458 + 0: IDENT@454..458 "a" [Newline("\n"), Newline("\n"), Whitespace("\t")] [] + 1: COLON@458..460 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@460..467 + 0: CSS_NUMBER@460..467 + 0: CSS_NUMBER_LITERAL@460..467 "0.00500" [] [] + 1: (empty) + 1: SEMICOLON@467..468 ";" [] [] + 42: CSS_DECLARATION_WITH_SEMICOLON@468..477 + 0: CSS_DECLARATION@468..476 + 0: CSS_GENERIC_PROPERTY@468..476 + 0: CSS_IDENTIFIER@468..471 + 0: IDENT@468..471 "a" [Newline("\n"), Whitespace("\t")] [] + 1: COLON@471..473 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@473..476 + 0: CSS_NUMBER@473..476 + 0: CSS_NUMBER_LITERAL@473..476 "0.0" [] [] + 1: (empty) + 1: SEMICOLON@476..477 ";" [] [] + 43: CSS_DECLARATION_WITH_SEMICOLON@477..489 + 0: CSS_DECLARATION@477..488 + 0: CSS_GENERIC_PROPERTY@477..488 + 0: CSS_IDENTIFIER@477..480 + 0: IDENT@477..480 "a" [Newline("\n"), Whitespace("\t")] [] + 1: COLON@480..482 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@482..488 + 0: CSS_NUMBER@482..488 + 0: CSS_NUMBER_LITERAL@482..488 "0.0000" [] [] + 1: (empty) + 1: SEMICOLON@488..489 ";" [] [] + 44: CSS_DECLARATION_WITH_SEMICOLON@489..515 + 0: CSS_DECLARATION@489..514 + 0: CSS_GENERIC_PROPERTY@489..514 + 0: CSS_IDENTIFIER@489..493 + 0: IDENT@489..493 "a" [Newline("\n"), Newline("\n"), Whitespace("\t")] [] + 1: COLON@493..495 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@495..514 + 0: CSS_NUMBER@495..514 + 0: CSS_NUMBER_LITERAL@495..514 "500600.001230045000" [] [] + 1: (empty) + 1: SEMICOLON@514..515 ";" [] [] + 45: CSS_DECLARATION_WITH_SEMICOLON@515..531 + 0: CSS_DECLARATION@515..530 + 0: CSS_GENERIC_PROPERTY@515..530 + 0: CSS_IDENTIFIER@515..518 + 0: IDENT@515..518 "a" [Newline("\n"), Whitespace("\t")] [] + 1: COLON@518..520 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@520..530 + 0: CSS_NUMBER@520..530 + 0: CSS_NUMBER_LITERAL@520..530 "1.00500e60" [] [] + 1: (empty) + 1: SEMICOLON@530..531 ";" [] [] + 46: CSS_DECLARATION_WITH_SEMICOLON@531..543 + 0: CSS_DECLARATION@531..542 + 0: CSS_GENERIC_PROPERTY@531..542 + 0: CSS_IDENTIFIER@531..534 + 0: IDENT@531..534 "a" [Newline("\n"), Whitespace("\t")] [] + 1: COLON@534..536 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@536..542 + 0: CSS_NUMBER@536..542 + 0: CSS_NUMBER_LITERAL@536..542 "1.0e60" [] [] + 1: (empty) + 1: SEMICOLON@542..543 ";" [] [] + 47: CSS_DECLARATION_WITH_SEMICOLON@543..559 + 0: CSS_DECLARATION@543..558 + 0: CSS_GENERIC_PROPERTY@543..558 + 0: CSS_IDENTIFIER@543..546 + 0: IDENT@543..546 "a" [Newline("\n"), Whitespace("\t")] [] + 1: COLON@546..548 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@548..558 + 0: CSS_NUMBER@548..558 + 0: CSS_NUMBER_LITERAL@548..558 "0.00500e60" [] [] + 1: (empty) + 1: SEMICOLON@558..559 ";" [] [] + 48: CSS_DECLARATION_WITH_SEMICOLON@559..571 + 0: CSS_DECLARATION@559..570 + 0: CSS_GENERIC_PROPERTY@559..570 + 0: CSS_IDENTIFIER@559..562 + 0: IDENT@559..562 "a" [Newline("\n"), Whitespace("\t")] [] + 1: COLON@562..564 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@564..570 + 0: CSS_NUMBER@564..570 + 0: CSS_NUMBER_LITERAL@564..570 "0.0e60" [] [] + 1: (empty) + 1: SEMICOLON@570..571 ";" [] [] + 49: CSS_DECLARATION_WITH_SEMICOLON@571..586 + 0: CSS_DECLARATION@571..585 + 0: CSS_GENERIC_PROPERTY@571..585 + 0: CSS_IDENTIFIER@571..574 + 0: IDENT@571..574 "a" [Newline("\n"), Whitespace("\t")] [] + 1: COLON@574..576 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@576..585 + 0: CSS_NUMBER@576..585 + 0: CSS_NUMBER_LITERAL@576..585 "0.0000e60" [] [] + 1: (empty) + 1: SEMICOLON@585..586 ";" [] [] + 50: CSS_DECLARATION_WITH_SEMICOLON@586..597 + 0: CSS_DECLARATION@586..596 + 0: CSS_GENERIC_PROPERTY@586..596 + 0: CSS_IDENTIFIER@586..589 + 0: IDENT@586..589 "a" [Newline("\n"), Whitespace("\t")] [] + 1: COLON@589..591 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@591..596 + 0: CSS_NUMBER@591..596 + 0: CSS_NUMBER_LITERAL@591..596 ".0e60" [] [] + 1: (empty) + 1: SEMICOLON@596..597 ";" [] [] + 51: CSS_DECLARATION_WITH_SEMICOLON@597..608 + 0: CSS_DECLARATION@597..607 + 0: CSS_GENERIC_PROPERTY@597..607 + 0: CSS_IDENTIFIER@597..600 + 0: IDENT@597..600 "a" [Newline("\n"), Whitespace("\t")] [] + 1: COLON@600..602 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@602..607 + 0: CSS_NUMBER@602..607 + 0: CSS_NUMBER_LITERAL@602..607 "0.e60" [] [] + 1: (empty) + 1: SEMICOLON@607..608 ";" [] [] + 52: CSS_DECLARATION_WITH_SEMICOLON@608..618 + 0: CSS_DECLARATION@608..617 + 0: CSS_GENERIC_PROPERTY@608..617 + 0: CSS_IDENTIFIER@608..611 + 0: IDENT@608..611 "a" [Newline("\n"), Whitespace("\t")] [] + 1: COLON@611..613 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@613..617 + 0: CSS_NUMBER@613..617 + 0: CSS_NUMBER_LITERAL@613..617 "0e60" [] [] + 1: (empty) + 1: SEMICOLON@617..618 ";" [] [] + 53: CSS_DECLARATION_WITH_SEMICOLON@618..646 + 0: CSS_DECLARATION@618..645 + 0: CSS_GENERIC_PROPERTY@618..645 + 0: CSS_IDENTIFIER@618..621 + 0: IDENT@618..621 "a" [Newline("\n"), Whitespace("\t")] [] + 1: COLON@621..623 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@623..645 + 0: CSS_NUMBER@623..645 + 0: CSS_NUMBER_LITERAL@623..645 "500600.001230045000e60" [] [] + 1: (empty) + 1: SEMICOLON@645..646 ";" [] [] + 54: CSS_DECLARATION_WITH_SEMICOLON@646..654 + 0: CSS_DECLARATION@646..653 + 0: CSS_GENERIC_PROPERTY@646..653 + 0: CSS_IDENTIFIER@646..649 + 0: IDENT@646..649 "a" [Newline("\n"), Whitespace("\t")] [] + 1: COLON@649..651 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@651..653 + 0: CSS_NUMBER@651..653 + 0: CSS_NUMBER_LITERAL@651..653 "10" [] [] + 1: (empty) + 1: SEMICOLON@653..654 ";" [] [] + 55: CSS_DECLARATION_WITH_SEMICOLON@654..664 + 0: CSS_DECLARATION@654..663 + 0: CSS_GENERIC_PROPERTY@654..663 + 0: CSS_IDENTIFIER@654..657 + 0: IDENT@654..657 "a" [Newline("\n"), Whitespace("\t")] [] + 1: COLON@657..659 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@659..663 + 0: CSS_NUMBER@659..663 + 0: CSS_NUMBER_LITERAL@659..663 "9700" [] [] + 1: (empty) + 1: SEMICOLON@663..664 ";" [] [] + 56: CSS_DECLARATION_WITH_SEMICOLON@664..676 + 0: CSS_DECLARATION@664..675 + 0: CSS_GENERIC_PROPERTY@664..675 + 0: CSS_IDENTIFIER@664..667 + 0: IDENT@664..667 "a" [Newline("\n"), Whitespace("\t")] [] + 1: COLON@667..669 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@669..675 + 0: CSS_NUMBER@669..675 + 0: CSS_NUMBER_LITERAL@669..675 "10e100" [] [] + 1: (empty) + 1: SEMICOLON@675..676 ";" [] [] + 57: CSS_DECLARATION_WITH_SEMICOLON@676..710 + 0: CSS_DECLARATION@676..709 + 0: CSS_GENERIC_PROPERTY@676..709 + 0: CSS_IDENTIFIER@676..684 + 0: IDENT@676..684 "height" [Newline("\n"), Whitespace("\t")] [] + 1: COLON@684..686 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@686..709 + 0: CSS_FUNCTION@686..709 + 0: CSS_IDENTIFIER@686..690 + 0: IDENT@686..690 "attr" [] [] + 1: L_PAREN@690..691 "(" [] [] + 2: CSS_PARAMETER_LIST@691..708 + 0: CSS_PARAMETER@691..703 + 0: CSS_LIST_OF_COMPONENT_VALUES_EXPRESSION@691..703 + 0: CSS_COMPONENT_VALUE_LIST@691..703 + 0: CSS_IDENTIFIER@691..701 + 0: IDENT@691..701 "data-size" [] [Whitespace(" ")] + 1: CSS_IDENTIFIER@701..703 + 0: IDENT@701..703 "em" [] [] + 1: COMMA@703..705 "," [] [Whitespace(" ")] + 2: CSS_PARAMETER@705..708 + 0: CSS_LIST_OF_COMPONENT_VALUES_EXPRESSION@705..708 + 0: CSS_COMPONENT_VALUE_LIST@705..708 + 0: CSS_NUMBER@705..708 + 0: CSS_NUMBER_LITERAL@705..708 ".01" [] [] + 3: R_PAREN@708..709 ")" [] [] + 1: (empty) + 1: SEMICOLON@709..710 ";" [] [] + 2: R_CURLY@710..712 "}" [Newline("\n")] [] + 2: EOF@712..713 "" [Newline("\n")] [] + +```