Comparing version 1.0.0-alpha.30 to 1.0.0-alpha.31
@@ -0,1 +1,15 @@ | ||
## 1.0.0-alpha.31 (July 11, 2019) | ||
- Bumped `mdn/data` to `2.0.4` (#99) | ||
- Lexer | ||
- Added [bracketed range notation](https://drafts.csswg.org/css-values-4/#numeric-ranges) support and related refactoring | ||
- Removed `<number-zero-one>`, `<number-one-or-greater>` and `<positive-integer>` from generic types. In fact, types moved to patch, because those types can be expressed in a regular grammar due to bracketed range notation implemented | ||
- Added support for multiple token string matching | ||
- Improved `<custom-ident>` production matching to claim the keyword only if no other unfulfilled production can claim it (#101) | ||
- Improved `<length>` production matching to claim "unitless zero" only if no other unfulfilled production can claim it | ||
- Changed lexer's constructor to prevent generic types override when used | ||
- Fixed large `||`- and `&&`-group matching, matching continues from the beginning on term match (#85) | ||
- Fixed checking that value has `var()` occurrences when value is a string (such values can't be matched on syntax currently and fail with specific error that can be used for ignorance in validation tools) | ||
- Fixed `<declaration-value>` and `<any-value>` matching when a value contains a function, parentheses or braces | ||
## 1.0.0-alpha.30 (July 3, 2019) | ||
@@ -2,0 +16,0 @@ |
@@ -245,6 +245,2 @@ { | ||
}, | ||
"line-height-step": { | ||
"comment": "fix extra spaces around", | ||
"syntax": "none | <length>" | ||
}, | ||
"marker": { | ||
@@ -292,4 +288,7 @@ "comment": "added SVG property", | ||
"comment": "extend by vendor keywords https://developer.mozilla.org/en-US/docs/Web/CSS/overflow", | ||
"syntax": "visible | hidden | scroll | auto | <-non-standard-overflow>" | ||
"syntax": "[ visible | hidden | clip | scroll | auto ]{1,2} | <-non-standard-overflow>" | ||
}, | ||
"line-height": { | ||
"syntax": "normal | <length> | <number> | <percentage>" | ||
}, | ||
"pause": { | ||
@@ -319,14 +318,2 @@ "comment": "https://www.w3.org/TR/css3-speech/#property-index", | ||
}, | ||
"scroll-margin-inline": { | ||
"comment": "temporary, since test fails", | ||
"syntax": "[ auto | <length> | <percentage> ]{1,2}" | ||
}, | ||
"scroll-padding-block": { | ||
"comment": "temporary, since test fails", | ||
"syntax": "[ auto | <length> | <percentage> ]{1,2}" | ||
}, | ||
"scroll-padding-inline": { | ||
"comment": "temporary, since test fails", | ||
"syntax": "[ auto | <length> | <percentage> ]{1,2}" | ||
}, | ||
"shape-rendering": { | ||
@@ -414,6 +401,2 @@ "comment": "added SVG property", | ||
}, | ||
"transform-origin": { | ||
"comment": "move first group to the end since less collecting", | ||
"syntax": "[ [ <length-percentage> | left | center | right ] && [ <length-percentage> | top | center | bottom ] ] <length>? | [ <length-percentage> | left | center | right | top | bottom ]" | ||
}, | ||
"unicode-bidi": { | ||
@@ -459,6 +442,2 @@ "comment": "added prefixed keywords https://developer.mozilla.org/en-US/docs/Web/CSS/unicode-bidi", | ||
}, | ||
"word-break": { | ||
"comment": "extend with non-standard keywords", | ||
"syntax": "normal | break-all | keep-all | <-non-standard-word-break>" | ||
}, | ||
"writing-mode": { | ||
@@ -533,6 +512,2 @@ "comment": "extend with SVG keywords", | ||
}, | ||
"-non-standard-word-break": { | ||
"comment": "non-standard keywords https://css-tricks.com/almanac/properties/w/word-break/", | ||
"syntax": "break-word" | ||
}, | ||
"-webkit-gradient()": { | ||
@@ -623,4 +598,4 @@ "comment": "first Apple proposal gradient syntax https://webkit.org/blog/175/introducing-css-gradients/ - TODO: simplify when after match algorithm improvement ( [, point, radius | , point] -> [, radius]? , point )", | ||
"gradient": { | ||
"comment": "added -webkit-gradient() since may to be used for legacy support", | ||
"syntax": "<-legacy-gradient> | <linear-gradient()> | <repeating-linear-gradient()> | <radial-gradient()> | <repeating-radial-gradient()>" | ||
"comment": "added legacy syntaxes support", | ||
"syntax": "<linear-gradient()> | <repeating-linear-gradient()> | <radial-gradient()> | <repeating-radial-gradient()> | <conic-gradient()> | <-legacy-gradient>" | ||
}, | ||
@@ -635,10 +610,2 @@ "left": { | ||
}, | ||
"matrix()": { | ||
"comment": "redundant max", | ||
"syntax": "matrix( <number>#{6} )" | ||
}, | ||
"matrix3d()": { | ||
"comment": "redundant max", | ||
"syntax": "matrix3d( <number>#{16} )" | ||
}, | ||
"name-repeat": { | ||
@@ -672,6 +639,2 @@ "comment": "missed, and looks like obsolete, keep it as is since other property syntaxes should be changed too; https://www.w3.org/TR/2015/WD-css-grid-1-20150917/#typedef-name-repeat", | ||
}, | ||
"single-transition": { | ||
"comment": "moved <timing-function> in the beginning to avoid wrong match to <single-transition-property>", | ||
"syntax": "<timing-function> || [ none | <single-transition-property> ] || <time> || <time>" | ||
}, | ||
"svg-length": { | ||
@@ -719,4 +682,13 @@ "comment": "All coordinates and lengths in SVG can be specified with or without a unit identifier", | ||
"syntax": "<ident> | <function-token> <any-value> )" | ||
}, | ||
"number-zero-one": { | ||
"syntax": "<number [0,1]>" | ||
}, | ||
"number-one-or-greater": { | ||
"syntax": "<number [1,∞]>" | ||
}, | ||
"positive-integer": { | ||
"syntax": "<integer [0,∞]>" | ||
} | ||
} | ||
} |
@@ -1,1 +0,1 @@ | ||
{"generic":true,"types":{"id-selector":"<hash-token>","absolute-size":"xx-small | x-small | small | medium | large | x-large | xx-large","alpha-value":"<number> | <percentage>","angle-percentage":"<angle> | <percentage>","angular-color-hint":"<angle-percentage>","angular-color-stop":"<color> && <color-stop-angle>?","angular-color-stop-list":"[ <angular-color-stop> [, <angular-color-hint> ]? ]# , <angular-color-stop>","animateable-feature":"scroll-position | contents | <custom-ident>","attachment":"scroll | fixed | local","attr()":"attr( <attr-name> <type-or-unit>? [, <attr-fallback> ]? )","attr-matcher":"[ '~' | '|' | '^' | '$' | '*' ]? '='","attr-modifier":"i | s","attribute-selector":"'[' <wq-name> ']' | '[' <wq-name> <attr-matcher> [ <string-token> | <ident-token> ] <attr-modifier>? ']'","auto-repeat":"repeat( [ auto-fill | auto-fit ] , [ <line-names>? <fixed-size> ]+ <line-names>? )","auto-track-list":"[ <line-names>? [ <fixed-size> | <fixed-repeat> ] ]* <line-names>? <auto-repeat> [ <line-names>? [ <fixed-size> | <fixed-repeat> ] ]* <line-names>?","baseline-position":"[ first | last ]? baseline","basic-shape":"<inset()> | <circle()> | <ellipse()> | <polygon()>","bg-image":"none | <image>","bg-layer":"<bg-image> || <bg-position> [ / <bg-size> ]? || <repeat-style> || <attachment> || <box> || <box>","bg-position":"[ [ left | center | right | top | bottom | <length-percentage> ] | [ left | center | right | <length-percentage> ] [ top | center | bottom | <length-percentage> ] | [ center | [ left | right ] <length-percentage>? ] && [ center | [ top | bottom ] <length-percentage>? ] ]","bg-size":"[ <length-percentage> | auto ]{1,2} | cover | contain","blur()":"blur( <length> )","blend-mode":"normal | multiply | screen | overlay | darken | lighten | color-dodge | color-burn | hard-light | soft-light | difference | exclusion | hue | saturation | color | luminosity","box":"border-box | padding-box | content-box","brightness()":"brightness( <number-percentage> )","calc()":"calc( <calc-sum> )","calc-sum":"<calc-product> [ [ '+' | '-' ] <calc-product> ]*","calc-product":"<calc-value> [ '*' <calc-value> | '/' <number> ]*","calc-value":"<number> | <dimension> | <percentage> | ( <calc-sum> )","cf-final-image":"<image> | <color>","cf-mixing-image":"<percentage>? && <image>","circle()":"circle( [ <shape-radius> ]? [ at <position> ]? )","clamp()":"clamp( <calc-sum>#{3} )","class-selector":"'.' <ident-token>","clip-source":"<url>","color":"<rgb()> | <rgba()> | <hsl()> | <hsla()> | <hex-color> | <named-color> | currentcolor | <deprecated-system-color>","color-stop":"<color-stop-length> | <color-stop-angle>","color-stop-angle":"<angle-percentage>{1,2}","color-stop-length":"<length-percentage>{1,2}","color-stop-list":"[ <linear-color-stop> [, <linear-color-hint> ]? ]# , <linear-color-stop>","combinator":"'>' | '+' | '~' | [ '||' ]","common-lig-values":"[ common-ligatures | no-common-ligatures ]","compat":"searchfield | textarea | push-button | button-bevel | slider-horizontal | checkbox | radio | square-button | menulist | menulist-button | listbox | meter | progress-bar","composite-style":"clear | copy | source-over | source-in | source-out | source-atop | destination-over | destination-in | destination-out | destination-atop | xor","compositing-operator":"add | subtract | intersect | exclude","compound-selector":"[ <type-selector>? <subclass-selector>* [ <pseudo-element-selector> <pseudo-class-selector>* ]* ]!","compound-selector-list":"<compound-selector>#","complex-selector":"<compound-selector> [ <combinator>? <compound-selector> ]*","complex-selector-list":"<complex-selector>#","conic-gradient()":"conic-gradient( [ from <angle> ]? [ at <position> ]? , <angular-color-stop-list> )","contextual-alt-values":"[ contextual | no-contextual ]","content-distribution":"space-between | space-around | space-evenly | stretch","content-list":"[ <string> | contents | <url> | <quote> | <attr()> | counter( <ident> , <'list-style-type'>? ) ]+","content-position":"center | start | end | flex-start | flex-end","content-replacement":"<image>","contrast()":"contrast( [ <number-percentage> ] )","counter()":"counter( <custom-ident> , [ <counter-style> | none ]? )","counter-style":"<counter-style-name> | symbols( )","counter-style-name":"<custom-ident>","counters()":"counters( <custom-ident> , <string> , [ <counter-style> | none ]? )","cross-fade()":"cross-fade( <cf-mixing-image> , <cf-final-image>? )","cubic-bezier-timing-function":"ease | ease-in | ease-out | ease-in-out | cubic-bezier( <number> , <number> , <number> , <number> )","deprecated-system-color":"ActiveBorder | ActiveCaption | AppWorkspace | Background | ButtonFace | ButtonHighlight | ButtonShadow | ButtonText | CaptionText | GrayText | Highlight | HighlightText | InactiveBorder | InactiveCaption | InactiveCaptionText | InfoBackground | InfoText | Menu | MenuText | Scrollbar | ThreeDDarkShadow | ThreeDFace | ThreeDHighlight | ThreeDLightShadow | ThreeDShadow | Window | WindowFrame | WindowText","discretionary-lig-values":"[ discretionary-ligatures | no-discretionary-ligatures ]","display-box":"contents | none","display-inside":"flow | flow-root | table | flex | grid | ruby","display-internal":"table-row-group | table-header-group | table-footer-group | table-row | table-cell | table-column-group | table-column | table-caption | ruby-base | ruby-text | ruby-base-container | ruby-text-container","display-legacy":"inline-block | inline-list-item | inline-table | inline-flex | inline-grid","display-listitem":"<display-outside>? && [ flow | flow-root ]? && list-item","display-outside":"block | inline | run-in","drop-shadow()":"drop-shadow( <length>{2,3} <color>? )","east-asian-variant-values":"[ jis78 | jis83 | jis90 | jis04 | simplified | traditional ]","east-asian-width-values":"[ full-width | proportional-width ]","element()":"element( <id-selector> )","ellipse()":"ellipse( [ <shape-radius>{2} ]? [ at <position> ]? )","ending-shape":"circle | ellipse","env()":"env( <custom-ident> , <declaration-value>? )","explicit-track-list":"[ <line-names>? <track-size> ]+ <line-names>?","family-name":"<string> | <custom-ident>+","feature-tag-value":"<string> [ <integer> | on | off ]?","feature-type":"@stylistic | @historical-forms | @styleset | @character-variant | @swash | @ornaments | @annotation","feature-value-block":"<feature-type> '{' <feature-value-declaration-list> '}'","feature-value-block-list":"<feature-value-block>+","feature-value-declaration":"<custom-ident> : <integer>+ ;","feature-value-declaration-list":"<feature-value-declaration>","feature-value-name":"<custom-ident>","fill-rule":"nonzero | evenodd","filter-function":"<blur()> | <brightness()> | <contrast()> | <drop-shadow()> | <grayscale()> | <hue-rotate()> | <invert()> | <opacity()> | <saturate()> | <sepia()>","filter-function-list":"[ <filter-function> | <url> ]+","final-bg-layer":"<'background-color'> || <bg-image> || <bg-position> [ / <bg-size> ]? || <repeat-style> || <attachment> || <box> || <box>","fit-content()":"fit-content( [ <length> | <percentage> ] )","fixed-breadth":"<length-percentage>","fixed-repeat":"repeat( [ <positive-integer> ] , [ <line-names>? <fixed-size> ]+ <line-names>? )","fixed-size":"<fixed-breadth> | minmax( <fixed-breadth> , <track-breadth> ) | minmax( <inflexible-breadth> , <fixed-breadth> )","font-stretch-absolute":"normal | ultra-condensed | extra-condensed | condensed | semi-condensed | semi-expanded | expanded | extra-expanded | ultra-expanded | <percentage>","font-variant-css21":"[ normal | small-caps ]","font-weight-absolute":"normal | bold | <number>","frequency-percentage":"<frequency> | <percentage>","general-enclosed":"[ <function-token> <any-value> ) ] | ( <ident> <any-value> )","generic-family":"serif | sans-serif | cursive | fantasy | monospace | -apple-system","generic-name":"serif | sans-serif | cursive | fantasy | monospace","geometry-box":"<shape-box> | fill-box | stroke-box | view-box","gradient":"<-legacy-gradient> | <linear-gradient()> | <repeating-linear-gradient()> | <radial-gradient()> | <repeating-radial-gradient()>","grayscale()":"grayscale( <number-percentage> )","grid-line":"auto | <custom-ident> | [ <integer> && <custom-ident>? ] | [ span && [ <integer> || <custom-ident> ] ]","historical-lig-values":"[ historical-ligatures | no-historical-ligatures ]","hsl()":"hsl( <hue> <percentage> <percentage> [ / <alpha-value> ]? ) | hsl( <hue> , <percentage> , <percentage> , <alpha-value>? )","hsla()":"hsla( <hue> <percentage> <percentage> [ / <alpha-value> ]? ) | hsla( <hue> , <percentage> , <percentage> , <alpha-value>? )","hue":"<number> | <angle>","hue-rotate()":"hue-rotate( <angle> )","image":"<url> | <image()> | <image-set()> | <element()> | <cross-fade()> | <gradient>","image()":"image( <image-tags>? [ <image-src>? , <color>? ]! )","image-set()":"image-set( <image-set-option># )","image-set-option":"[ <image> | <string> ] <resolution>","image-src":"<url> | <string>","image-tags":"ltr | rtl","inflexible-breadth":"<length> | <percentage> | min-content | max-content | auto","inset()":"inset( <length-percentage>{1,4} [ round <'border-radius'> ]? )","invert()":"invert( <number-percentage> )","keyframes-name":"<custom-ident> | <string>","keyframe-block":"<keyframe-selector># { <declaration-list> }","keyframe-block-list":"<keyframe-block>+","keyframe-selector":"from | to | <percentage>","leader()":"leader( <leader-type> )","leader-type":"dotted | solid | space | <string>","length-percentage":"<length> | <percentage>","line-names":"'[' <custom-ident>* ']'","line-name-list":"[ <line-names> | <name-repeat> ]+","line-style":"none | hidden | dotted | dashed | solid | double | groove | ridge | inset | outset","line-width":"<length> | thin | medium | thick","linear-color-hint":"<length-percentage>","linear-color-stop":"<color> && <color-stop-length>","linear-gradient()":"linear-gradient( [ <angle> | to <side-or-corner> ]? , <color-stop-list> )","mask-layer":"<mask-reference> || <position> [ / <bg-size> ]? || <repeat-style> || <geometry-box> || [ <geometry-box> | no-clip ] || <compositing-operator> || <masking-mode>","mask-position":"[ <length-percentage> | left | center | right ] [ <length-percentage> | top | center | bottom ]?","mask-reference":"none | <image> | <mask-source>","mask-source":"<url>","masking-mode":"alpha | luminance | match-source","matrix()":"matrix( <number>#{6} )","matrix3d()":"matrix3d( <number>#{16} )","max()":"max( <calc-sum># )","media-and":"<media-in-parens> [ and <media-in-parens> ]+","media-condition":"<media-not> | <media-and> | <media-or> | <media-in-parens>","media-condition-without-or":"<media-not> | <media-and> | <media-in-parens>","media-feature":"( [ <mf-plain> | <mf-boolean> | <mf-range> ] )","media-in-parens":"( <media-condition> ) | <media-feature> | <general-enclosed>","media-not":"not <media-in-parens>","media-or":"<media-in-parens> [ or <media-in-parens> ]+","media-query":"<media-condition> | [ not | only ]? <media-type> [ and <media-condition-without-or> ]?","media-query-list":"<media-query>#","media-type":"<ident>","mf-boolean":"<mf-name>","mf-name":"<ident>","mf-plain":"<mf-name> : <mf-value>","mf-range":"<mf-name> [ '<' | '>' ]? '='? <mf-value> | <mf-value> [ '<' | '>' ]? '='? <mf-name> | <mf-value> '<' '='? <mf-name> '<' '='? <mf-value> | <mf-value> '>' '='? <mf-name> '>' '='? <mf-value>","mf-value":"<number> | <dimension> | <ident> | <ratio>","min()":"min( <calc-sum># )","minmax()":"minmax( [ <length> | <percentage> | <flex> | min-content | max-content | auto ] , [ <length> | <percentage> | <flex> | min-content | max-content | auto ] )","named-color":"transparent | aliceblue | antiquewhite | aqua | aquamarine | azure | beige | bisque | black | blanchedalmond | blue | blueviolet | brown | burlywood | cadetblue | chartreuse | chocolate | coral | cornflowerblue | cornsilk | crimson | cyan | darkblue | darkcyan | darkgoldenrod | darkgray | darkgreen | darkgrey | darkkhaki | darkmagenta | darkolivegreen | darkorange | darkorchid | darkred | darksalmon | darkseagreen | darkslateblue | darkslategray | darkslategrey | darkturquoise | darkviolet | deeppink | deepskyblue | dimgray | dimgrey | dodgerblue | firebrick | floralwhite | forestgreen | fuchsia | gainsboro | ghostwhite | gold | goldenrod | gray | green | greenyellow | grey | honeydew | hotpink | indianred | indigo | ivory | khaki | lavender | lavenderblush | lawngreen | lemonchiffon | lightblue | lightcoral | lightcyan | lightgoldenrodyellow | lightgray | lightgreen | lightgrey | lightpink | lightsalmon | lightseagreen | lightskyblue | lightslategray | lightslategrey | lightsteelblue | lightyellow | lime | limegreen | linen | magenta | maroon | mediumaquamarine | mediumblue | mediumorchid | mediumpurple | mediumseagreen | mediumslateblue | mediumspringgreen | mediumturquoise | mediumvioletred | midnightblue | mintcream | mistyrose | moccasin | navajowhite | navy | oldlace | olive | olivedrab | orange | orangered | orchid | palegoldenrod | palegreen | paleturquoise | palevioletred | papayawhip | peachpuff | peru | pink | plum | powderblue | purple | rebeccapurple | red | rosybrown | royalblue | saddlebrown | salmon | sandybrown | seagreen | seashell | sienna | silver | skyblue | slateblue | slategray | slategrey | snow | springgreen | steelblue | tan | teal | thistle | tomato | turquoise | violet | wheat | white | whitesmoke | yellow | yellowgreen | <-non-standard-color>","namespace-prefix":"<ident>","ns-prefix":"[ <ident-token> | '*' ]? '|'","number-percentage":"<number> | <percentage>","numeric-figure-values":"[ lining-nums | oldstyle-nums ]","numeric-fraction-values":"[ diagonal-fractions | stacked-fractions ]","numeric-spacing-values":"[ proportional-nums | tabular-nums ]","nth":"<an-plus-b> | even | odd","opacity()":"opacity( [ <number-percentage> ] )","overflow-position":"unsafe | safe","outline-radius":"<length> | <percentage>","page-body":"<declaration>? [ ; <page-body> ]? | <page-margin-box> <page-body>","page-margin-box":"<page-margin-box-type> '{' <declaration-list> '}'","page-margin-box-type":"@top-left-corner | @top-left | @top-center | @top-right | @top-right-corner | @bottom-left-corner | @bottom-left | @bottom-center | @bottom-right | @bottom-right-corner | @left-top | @left-middle | @left-bottom | @right-top | @right-middle | @right-bottom","page-selector-list":"[ <page-selector># ]?","page-selector":"<pseudo-page>+ | <ident> <pseudo-page>*","perspective()":"perspective( <length> )","polygon()":"polygon( <fill-rule>? , [ <length-percentage> <length-percentage> ]# )","position":"[ [ left | center | right ] || [ top | center | bottom ] | [ left | center | right | <length-percentage> ] [ top | center | bottom | <length-percentage> ]? | [ [ left | right ] <length-percentage> ] && [ [ top | bottom ] <length-percentage> ] ]","pseudo-class-selector":"':' <ident-token> | ':' <function-token> <any-value> ')'","pseudo-element-selector":"':' <pseudo-class-selector>","pseudo-page":": [ left | right | first | blank ]","quote":"open-quote | close-quote | no-open-quote | no-close-quote","radial-gradient()":"radial-gradient( [ <ending-shape> || <size> ]? [ at <position> ]? , <color-stop-list> )","relative-selector":"<combinator>? <complex-selector>","relative-selector-list":"<relative-selector>#","relative-size":"larger | smaller","repeat-style":"repeat-x | repeat-y | [ repeat | space | round | no-repeat ]{1,2}","repeating-linear-gradient()":"repeating-linear-gradient( [ <angle> | to <side-or-corner> ]? , <color-stop-list> )","repeating-radial-gradient()":"repeating-radial-gradient( [ <ending-shape> || <size> ]? [ at <position> ]? , <color-stop-list> )","rgb()":"rgb( <percentage>{3} [ / <alpha-value> ]? ) | rgb( <number>{3} [ / <alpha-value> ]? ) | rgb( <percentage>#{3} , <alpha-value>? ) | rgb( <number>#{3} , <alpha-value>? )","rgba()":"rgba( <percentage>{3} [ / <alpha-value> ]? ) | rgba( <number>{3} [ / <alpha-value> ]? ) | rgba( <percentage>#{3} , <alpha-value>? ) | rgba( <number>#{3} , <alpha-value>? )","rotate()":"rotate( <angle> )","rotate3d()":"rotate3d( <number> , <number> , <number> , <angle> )","rotateX()":"rotateX( <angle> )","rotateY()":"rotateY( <angle> )","rotateZ()":"rotateZ( <angle> )","saturate()":"saturate( <number-percentage> )","scale()":"scale( <number> [, <number> ]? )","scale3d()":"scale3d( <number> , <number> , <number> )","scaleX()":"scaleX( <number> )","scaleY()":"scaleY( <number> )","scaleZ()":"scaleZ( <number> )","self-position":"center | start | end | self-start | self-end | flex-start | flex-end","shape-radius":"<length-percentage> | closest-side | farthest-side","skew()":"skew( <angle> [, <angle> ]? )","skewX()":"skewX( <angle> )","skewY()":"skewY( <angle> )","sepia()":"sepia( <number-percentage> )","shadow":"inset? && <length>{2,4} && <color>?","shadow-t":"[ <length>{2,3} && <color>? ]","shape":"rect( <top> , <right> , <bottom> , <left> ) | rect( <top> <right> <bottom> <left> )","shape-box":"<box> | margin-box","side-or-corner":"[ left | right ] || [ top | bottom ]","single-animation":"<time> || <timing-function> || <time> || <single-animation-iteration-count> || <single-animation-direction> || <single-animation-fill-mode> || <single-animation-play-state> || [ none | <keyframes-name> ]","single-animation-direction":"normal | reverse | alternate | alternate-reverse","single-animation-fill-mode":"none | forwards | backwards | both","single-animation-iteration-count":"infinite | <number>","single-animation-play-state":"running | paused","single-transition":"<timing-function> || [ none | <single-transition-property> ] || <time> || <time>","single-transition-property":"all | <custom-ident>","size":"closest-side | farthest-side | closest-corner | farthest-corner | <length> | <length-percentage>{2}","step-position":"jump-start | jump-end | jump-none | jump-both | start | end","step-timing-function":"step-start | step-end | steps( <integer> [, <step-position> ]? )","subclass-selector":"<id-selector> | <class-selector> | <attribute-selector> | <pseudo-class-selector>","supports-condition":"not <supports-in-parens> | <supports-in-parens> [ and <supports-in-parens> ]* | <supports-in-parens> [ or <supports-in-parens> ]*","supports-in-parens":"( <supports-condition> ) | <supports-feature> | <general-enclosed>","supports-feature":"<supports-decl> | <supports-selector-fn>","supports-decl":"( <declaration> )","supports-selector-fn":"selector( <complex-selector> )","symbol":"<string> | <image> | <custom-ident>","target":"<target-counter()> | <target-counters()> | <target-text()>","target-counter()":"target-counter( [ <string> | <url> ] , <custom-ident> , <counter-style>? )","target-counters()":"target-counters( [ <string> | <url> ] , <custom-ident> , <string> , <counter-style>? )","target-text()":"target-text( [ <string> | <url> ] , [ content | before | after | first-letter ]? )","time-percentage":"<time> | <percentage>","timing-function":"linear | <cubic-bezier-timing-function> | <step-timing-function>","track-breadth":"<length-percentage> | <flex> | min-content | max-content | auto","track-list":"[ <line-names>? [ <track-size> | <track-repeat> ] ]+ <line-names>?","track-repeat":"repeat( [ <positive-integer> ] , [ <line-names>? <track-size> ]+ <line-names>? )","track-size":"<track-breadth> | minmax( <inflexible-breadth> , <track-breadth> ) | fit-content( [ <length> | <percentage> ] )","transform-function":"<matrix()> | <translate()> | <translateX()> | <translateY()> | <scale()> | <scaleX()> | <scaleY()> | <rotate()> | <skew()> | <skewX()> | <skewY()> | <matrix3d()> | <translate3d()> | <translateZ()> | <scale3d()> | <scaleZ()> | <rotate3d()> | <rotateX()> | <rotateY()> | <rotateZ()> | <perspective()>","transform-list":"<transform-function>+","translate()":"translate( <length-percentage> [, <length-percentage> ]? )","translate3d()":"translate3d( <length-percentage> , <length-percentage> , <length> )","translateX()":"translateX( <length-percentage> )","translateY()":"translateY( <length-percentage> )","translateZ()":"translateZ( <length> )","type-or-unit":"string | color | url | integer | number | length | angle | time | frequency | cap | ch | em | ex | ic | lh | rlh | rem | vb | vi | vw | vh | vmin | vmax | mm | Q | cm | in | pt | pc | px | deg | grad | rad | turn | ms | s | Hz | kHz | %","type-selector":"<wq-name> | <ns-prefix>? '*'","var()":"var( <custom-property-name> , <declaration-value>? )","viewport-length":"auto | <length-percentage>","wq-name":"<ns-prefix>? <ident-token>","-legacy-gradient":"<-webkit-gradient()> | <-legacy-linear-gradient> | <-legacy-repeating-linear-gradient> | <-legacy-radial-gradient> | <-legacy-repeating-radial-gradient>","-legacy-linear-gradient":"-moz-linear-gradient( <-legacy-linear-gradient-arguments> ) | -webkit-linear-gradient( <-legacy-linear-gradient-arguments> ) | -o-linear-gradient( <-legacy-linear-gradient-arguments> )","-legacy-repeating-linear-gradient":"-moz-repeating-linear-gradient( <-legacy-linear-gradient-arguments> ) | -webkit-repeating-linear-gradient( <-legacy-linear-gradient-arguments> ) | -o-repeating-linear-gradient( <-legacy-linear-gradient-arguments> )","-legacy-linear-gradient-arguments":"[ <angle> | <side-or-corner> ]? , <color-stop-list>","-legacy-radial-gradient":"-moz-radial-gradient( <-legacy-radial-gradient-arguments> ) | -webkit-radial-gradient( <-legacy-radial-gradient-arguments> ) | -o-radial-gradient( <-legacy-radial-gradient-arguments> )","-legacy-repeating-radial-gradient":"-moz-repeating-radial-gradient( <-legacy-radial-gradient-arguments> ) | -webkit-repeating-radial-gradient( <-legacy-radial-gradient-arguments> ) | -o-repeating-radial-gradient( <-legacy-radial-gradient-arguments> )","-legacy-radial-gradient-arguments":"[ <position> , ]? [ [ [ <-legacy-radial-gradient-shape> || <-legacy-radial-gradient-size> ] | [ <length> | <percentage> ]{2} ] , ]? <color-stop-list>","-legacy-radial-gradient-size":"closest-side | closest-corner | farthest-side | farthest-corner | contain | cover","-legacy-radial-gradient-shape":"circle | ellipse","-non-standard-font":"-apple-system-body | -apple-system-headline | -apple-system-subheadline | -apple-system-caption1 | -apple-system-caption2 | -apple-system-footnote | -apple-system-short-body | -apple-system-short-headline | -apple-system-short-subheadline | -apple-system-short-caption1 | -apple-system-short-footnote | -apple-system-tall-body","-non-standard-color":"-moz-ButtonDefault | -moz-ButtonHoverFace | -moz-ButtonHoverText | -moz-CellHighlight | -moz-CellHighlightText | -moz-Combobox | -moz-ComboboxText | -moz-Dialog | -moz-DialogText | -moz-dragtargetzone | -moz-EvenTreeRow | -moz-Field | -moz-FieldText | -moz-html-CellHighlight | -moz-html-CellHighlightText | -moz-mac-accentdarkestshadow | -moz-mac-accentdarkshadow | -moz-mac-accentface | -moz-mac-accentlightesthighlight | -moz-mac-accentlightshadow | -moz-mac-accentregularhighlight | -moz-mac-accentregularshadow | -moz-mac-chrome-active | -moz-mac-chrome-inactive | -moz-mac-focusring | -moz-mac-menuselect | -moz-mac-menushadow | -moz-mac-menutextselect | -moz-MenuHover | -moz-MenuHoverText | -moz-MenuBarText | -moz-MenuBarHoverText | -moz-nativehyperlinktext | -moz-OddTreeRow | -moz-win-communicationstext | -moz-win-mediatext | -moz-activehyperlinktext | -moz-default-background-color | -moz-default-color | -moz-hyperlinktext | -moz-visitedhyperlinktext | -webkit-activelink | -webkit-focus-ring-color | -webkit-link | -webkit-text","-non-standard-image-rendering":"optimize-contrast | -moz-crisp-edges | -o-crisp-edges | -webkit-optimize-contrast","-non-standard-overflow":"-moz-scrollbars-none | -moz-scrollbars-horizontal | -moz-scrollbars-vertical | -moz-hidden-unscrollable","-non-standard-width":"min-intrinsic | intrinsic | -moz-min-content | -moz-max-content | -webkit-min-content | -webkit-max-content","-non-standard-word-break":"break-word","-webkit-gradient()":"-webkit-gradient( <-webkit-gradient-type> , <-webkit-gradient-point> [, <-webkit-gradient-point> | , <-webkit-gradient-radius> , <-webkit-gradient-point> ] [, <-webkit-gradient-radius> ]? [, <-webkit-gradient-color-stop> ]* )","-webkit-gradient-color-stop":"from( <color> ) | color-stop( [ <number-zero-one> | <percentage> ] , <color> ) | to( <color> )","-webkit-gradient-point":"[ left | center | right | <length-percentage> ] [ top | center | bottom | <length-percentage> ]","-webkit-gradient-radius":"<length> | <percentage>","-webkit-gradient-type":"linear | radial","-webkit-mask-box-repeat":"repeat | stretch | round","-webkit-mask-clip-style":"border | border-box | padding | padding-box | content | content-box | text","-ms-filter-function-list":"<-ms-filter-function>+","-ms-filter-function":"<-ms-filter-function-progid> | <-ms-filter-function-legacy>","-ms-filter-function-progid":"'progid:' [ <ident-token> '.' ]* [ <ident-token> | <function-token> <any-value>? ')' ]","-ms-filter-function-legacy":"<ident-token> | <function-token> <any-value>? ')'","-ms-filter":"<string>","age":"child | young | old","attr-name":"<wq-name>","attr-fallback":"<any-value>","border-radius":"<length-percentage>{1,2}","bottom":"<length> | auto","generic-voice":"[ <age>? <gender> <integer>? ]","gender":"male | female | neutral","left":"<length> | auto","mask-image":"<mask-reference>#","name-repeat":"repeat( [ <positive-integer> | auto-fill ] , <line-names>+ )","paint":"none | <color> | <url> [ none | <color> ]? | context-fill | context-stroke","path()":"path( <string> )","ratio":"<integer> / <integer>","right":"<length> | auto","svg-length":"<percentage> | <length> | <number>","svg-writing-mode":"lr-tb | rl-tb | tb-rl | lr | rl | tb","top":"<length> | auto","x":"<number>","y":"<number>","declaration":"<ident-token> : <declaration-value>? [ '!' important ]?","declaration-list":"[ <declaration>? ';' ]* <declaration>?","url":"url( <string> <url-modifier>* ) | <url-token>","url-modifier":"<ident> | <function-token> <any-value> )"},"properties":{"--*":"<declaration-value>","-ms-accelerator":"false | true","-ms-block-progression":"tb | rl | bt | lr","-ms-content-zoom-chaining":"none | chained","-ms-content-zooming":"none | zoom","-ms-content-zoom-limit":"<'-ms-content-zoom-limit-min'> <'-ms-content-zoom-limit-max'>","-ms-content-zoom-limit-max":"<percentage>","-ms-content-zoom-limit-min":"<percentage>","-ms-content-zoom-snap":"<'-ms-content-zoom-snap-type'> || <'-ms-content-zoom-snap-points'>","-ms-content-zoom-snap-points":"snapInterval( <percentage> , <percentage> ) | snapList( <percentage># )","-ms-content-zoom-snap-type":"none | proximity | mandatory","-ms-filter":"<string>","-ms-flow-from":"[ none | <custom-ident> ]#","-ms-flow-into":"[ none | <custom-ident> ]#","-ms-high-contrast-adjust":"auto | none","-ms-hyphenate-limit-chars":"auto | <integer>{1,3}","-ms-hyphenate-limit-lines":"no-limit | <integer>","-ms-hyphenate-limit-zone":"<percentage> | <length>","-ms-ime-align":"auto | after","-ms-overflow-style":"auto | none | scrollbar | -ms-autohiding-scrollbar","-ms-scrollbar-3dlight-color":"<color>","-ms-scrollbar-arrow-color":"<color>","-ms-scrollbar-base-color":"<color>","-ms-scrollbar-darkshadow-color":"<color>","-ms-scrollbar-face-color":"<color>","-ms-scrollbar-highlight-color":"<color>","-ms-scrollbar-shadow-color":"<color>","-ms-scrollbar-track-color":"<color>","-ms-scroll-chaining":"chained | none","-ms-scroll-limit":"<'-ms-scroll-limit-x-min'> <'-ms-scroll-limit-y-min'> <'-ms-scroll-limit-x-max'> <'-ms-scroll-limit-y-max'>","-ms-scroll-limit-x-max":"auto | <length>","-ms-scroll-limit-x-min":"<length>","-ms-scroll-limit-y-max":"auto | <length>","-ms-scroll-limit-y-min":"<length>","-ms-scroll-rails":"none | railed","-ms-scroll-snap-points-x":"snapInterval( <length-percentage> , <length-percentage> ) | snapList( <length-percentage># )","-ms-scroll-snap-points-y":"snapInterval( <length-percentage> , <length-percentage> ) | snapList( <length-percentage># )","-ms-scroll-snap-type":"none | proximity | mandatory","-ms-scroll-snap-x":"<'-ms-scroll-snap-type'> <'-ms-scroll-snap-points-x'>","-ms-scroll-snap-y":"<'-ms-scroll-snap-type'> <'-ms-scroll-snap-points-y'>","-ms-scroll-translation":"none | vertical-to-horizontal","-ms-text-autospace":"none | ideograph-alpha | ideograph-numeric | ideograph-parenthesis | ideograph-space","-ms-touch-select":"grippers | none","-ms-user-select":"none | element | text","-ms-wrap-flow":"auto | both | start | end | maximum | clear","-ms-wrap-margin":"<length>","-ms-wrap-through":"wrap | none","-moz-appearance":"none | button | button-arrow-down | button-arrow-next | button-arrow-previous | button-arrow-up | button-bevel | button-focus | caret | checkbox | checkbox-container | checkbox-label | checkmenuitem | dualbutton | groupbox | listbox | listitem | menuarrow | menubar | menucheckbox | menuimage | menuitem | menuitemtext | menulist | menulist-button | menulist-text | menulist-textfield | menupopup | menuradio | menuseparator | meterbar | meterchunk | progressbar | progressbar-vertical | progresschunk | progresschunk-vertical | radio | radio-container | radio-label | radiomenuitem | range | range-thumb | resizer | resizerpanel | scale-horizontal | scalethumbend | scalethumb-horizontal | scalethumbstart | scalethumbtick | scalethumb-vertical | scale-vertical | scrollbarbutton-down | scrollbarbutton-left | scrollbarbutton-right | scrollbarbutton-up | scrollbarthumb-horizontal | scrollbarthumb-vertical | scrollbartrack-horizontal | scrollbartrack-vertical | searchfield | separator | sheet | spinner | spinner-downbutton | spinner-textfield | spinner-upbutton | splitter | statusbar | statusbarpanel | tab | tabpanel | tabpanels | tab-scroll-arrow-back | tab-scroll-arrow-forward | textfield | textfield-multiline | toolbar | toolbarbutton | toolbarbutton-dropdown | toolbargripper | toolbox | tooltip | treeheader | treeheadercell | treeheadersortarrow | treeitem | treeline | treetwisty | treetwistyopen | treeview | -moz-mac-unified-toolbar | -moz-win-borderless-glass | -moz-win-browsertabbar-toolbox | -moz-win-communicationstext | -moz-win-communications-toolbox | -moz-win-exclude-glass | -moz-win-glass | -moz-win-mediatext | -moz-win-media-toolbox | -moz-window-button-box | -moz-window-button-box-maximized | -moz-window-button-close | -moz-window-button-maximize | -moz-window-button-minimize | -moz-window-button-restore | -moz-window-frame-bottom | -moz-window-frame-left | -moz-window-frame-right | -moz-window-titlebar | -moz-window-titlebar-maximized","-moz-binding":"<url> | none","-moz-border-bottom-colors":"<color>+ | none","-moz-border-left-colors":"<color>+ | none","-moz-border-right-colors":"<color>+ | none","-moz-border-top-colors":"<color>+ | none","-moz-context-properties":"none | [ fill | fill-opacity | stroke | stroke-opacity ]#","-moz-float-edge":"border-box | content-box | margin-box | padding-box","-moz-force-broken-image-icon":"<integer>","-moz-image-region":"<shape> | auto","-moz-orient":"inline | block | horizontal | vertical","-moz-outline-radius":"<outline-radius>{1,4} [ / <outline-radius>{1,4} ]?","-moz-outline-radius-bottomleft":"<outline-radius>","-moz-outline-radius-bottomright":"<outline-radius>","-moz-outline-radius-topleft":"<outline-radius>","-moz-outline-radius-topright":"<outline-radius>","-moz-stack-sizing":"ignore | stretch-to-fit","-moz-text-blink":"none | blink","-moz-user-focus":"ignore | normal | select-after | select-before | select-menu | select-same | select-all | none","-moz-user-input":"auto | none | enabled | disabled","-moz-user-modify":"read-only | read-write | write-only","-moz-window-dragging":"drag | no-drag","-moz-window-shadow":"default | menu | tooltip | sheet | none","-webkit-appearance":"none | button | button-bevel | caps-lock-indicator | caret | checkbox | default-button | listbox | listitem | media-fullscreen-button | media-mute-button | media-play-button | media-seek-back-button | media-seek-forward-button | media-slider | media-sliderthumb | menulist | menulist-button | menulist-text | menulist-textfield | push-button | radio | scrollbarbutton-down | scrollbarbutton-left | scrollbarbutton-right | scrollbarbutton-up | scrollbargripper-horizontal | scrollbargripper-vertical | scrollbarthumb-horizontal | scrollbarthumb-vertical | scrollbartrack-horizontal | scrollbartrack-vertical | searchfield | searchfield-cancel-button | searchfield-decoration | searchfield-results-button | searchfield-results-decoration | slider-horizontal | slider-vertical | sliderthumb-horizontal | sliderthumb-vertical | square-button | textarea | textfield","-webkit-border-before":"<'border-width'> || <'border-style'> || <'color'>","-webkit-border-before-color":"<'color'>","-webkit-border-before-style":"<'border-style'>","-webkit-border-before-width":"<'border-width'>","-webkit-box-reflect":"[ above | below | right | left ]? <length>? <image>?","-webkit-line-clamp":"none | <integer>","-webkit-mask":"[ <mask-reference> || <position> [ / <bg-size> ]? || <repeat-style> || [ <box> | border | padding | content | text ] || [ <box> | border | padding | content ] ]#","-webkit-mask-attachment":"<attachment>#","-webkit-mask-clip":"[ <box> | border | padding | content | text ]#","-webkit-mask-composite":"<composite-style>#","-webkit-mask-image":"<mask-reference>#","-webkit-mask-origin":"[ <box> | border | padding | content ]#","-webkit-mask-position":"<position>#","-webkit-mask-position-x":"[ <length-percentage> | left | center | right ]#","-webkit-mask-position-y":"[ <length-percentage> | top | center | bottom ]#","-webkit-mask-repeat":"<repeat-style>#","-webkit-mask-repeat-x":"repeat | no-repeat | space | round","-webkit-mask-repeat-y":"repeat | no-repeat | space | round","-webkit-mask-size":"<bg-size>#","-webkit-overflow-scrolling":"auto | touch","-webkit-tap-highlight-color":"<color>","-webkit-text-fill-color":"<color>","-webkit-text-stroke":"<length> || <color>","-webkit-text-stroke-color":"<color>","-webkit-text-stroke-width":"<length>","-webkit-touch-callout":"default | none","-webkit-user-modify":"read-only | read-write | read-write-plaintext-only","align-content":"normal | <baseline-position> | <content-distribution> | <overflow-position>? <content-position>","align-items":"normal | stretch | <baseline-position> | [ <overflow-position>? <self-position> ]","align-self":"auto | normal | stretch | <baseline-position> | <overflow-position>? <self-position>","all":"initial | inherit | unset | revert","animation":"<single-animation>#","animation-delay":"<time>#","animation-direction":"<single-animation-direction>#","animation-duration":"<time>#","animation-fill-mode":"<single-animation-fill-mode>#","animation-iteration-count":"<single-animation-iteration-count>#","animation-name":"[ none | <keyframes-name> ]#","animation-play-state":"<single-animation-play-state>#","animation-timing-function":"<timing-function>#","appearance":"none | auto | button | textfield | <compat>","azimuth":"<angle> | [ [ left-side | far-left | left | center-left | center | center-right | right | far-right | right-side ] || behind ] | leftwards | rightwards","backdrop-filter":"none | <filter-function-list>","backface-visibility":"visible | hidden","background":"[ <bg-layer> , ]* <final-bg-layer>","background-attachment":"<attachment>#","background-blend-mode":"<blend-mode>#","background-clip":"<box>#","background-color":"<color>","background-image":"<bg-image>#","background-origin":"<box>#","background-position":"<bg-position>#","background-position-x":"[ center | [ left | right | x-start | x-end ]? <length-percentage>? ]#","background-position-y":"[ center | [ top | bottom | y-start | y-end ]? <length-percentage>? ]#","background-repeat":"<repeat-style>#","background-size":"<bg-size>#","block-overflow":"clip | ellipsis | <string>","block-size":"<'width'>","border":"<line-width> || <line-style> || <color>","border-block":"<'border-top-width'> || <'border-top-style'> || <'color'>","border-block-color":"<'border-top-color'>{1,2}","border-block-style":"<'border-top-style'>","border-block-width":"<'border-top-width'>","border-block-end":"<'border-top-width'> || <'border-top-style'> || <'color'>","border-block-end-color":"<'border-top-color'>","border-block-end-style":"<'border-top-style'>","border-block-end-width":"<'border-top-width'>","border-block-start":"<'border-top-width'> || <'border-top-style'> || <'color'>","border-block-start-color":"<'border-top-color'>","border-block-start-style":"<'border-top-style'>","border-block-start-width":"<'border-top-width'>","border-bottom":"<line-width> || <line-style> || <color>","border-bottom-color":"<'border-top-color'>","border-bottom-left-radius":"<length-percentage>{1,2}","border-bottom-right-radius":"<length-percentage>{1,2}","border-bottom-style":"<line-style>","border-bottom-width":"<line-width>","border-collapse":"collapse | separate","border-color":"<color>{1,4}","border-end-end-radius":"<length-percentage>{1,2}","border-end-start-radius":"<length-percentage>{1,2}","border-image":"<'border-image-source'> || <'border-image-slice'> [ / <'border-image-width'> | / <'border-image-width'>? / <'border-image-outset'> ]? || <'border-image-repeat'>","border-image-outset":"[ <length> | <number> ]{1,4}","border-image-repeat":"[ stretch | repeat | round | space ]{1,2}","border-image-slice":"<number-percentage>{1,4} && fill?","border-image-source":"none | <image>","border-image-width":"[ <length-percentage> | <number> | auto ]{1,4}","border-inline":"<'border-top-width'> || <'border-top-style'> || <'color'>","border-inline-end":"<'border-top-width'> || <'border-top-style'> || <'color'>","border-inline-color":"<'border-top-color'>{1,2}","border-inline-style":"<'border-top-style'>","border-inline-width":"<'border-top-width'>","border-inline-end-color":"<'border-top-color'>","border-inline-end-style":"<'border-top-style'>","border-inline-end-width":"<'border-top-width'>","border-inline-start":"<'border-top-width'> || <'border-top-style'> || <'color'>","border-inline-start-color":"<'border-top-color'>","border-inline-start-style":"<'border-top-style'>","border-inline-start-width":"<'border-top-width'>","border-left":"<line-width> || <line-style> || <color>","border-left-color":"<color>","border-left-style":"<line-style>","border-left-width":"<line-width>","border-radius":"<length-percentage>{1,4} [ / <length-percentage>{1,4} ]?","border-right":"<line-width> || <line-style> || <color>","border-right-color":"<color>","border-right-style":"<line-style>","border-right-width":"<line-width>","border-spacing":"<length> <length>?","border-start-end-radius":"<length-percentage>{1,2}","border-start-start-radius":"<length-percentage>{1,2}","border-style":"<line-style>{1,4}","border-top":"<line-width> || <line-style> || <color>","border-top-color":"<color>","border-top-left-radius":"<length-percentage>{1,2}","border-top-right-radius":"<length-percentage>{1,2}","border-top-style":"<line-style>","border-top-width":"<line-width>","border-width":"<line-width>{1,4}","bottom":"<length> | <percentage> | auto","box-align":"start | center | end | baseline | stretch","box-decoration-break":"slice | clone","box-direction":"normal | reverse | inherit","box-flex":"<number>","box-flex-group":"<integer>","box-lines":"single | multiple","box-ordinal-group":"<integer>","box-orient":"horizontal | vertical | inline-axis | block-axis | inherit","box-pack":"start | center | end | justify","box-shadow":"none | <shadow>#","box-sizing":"content-box | border-box","break-after":"auto | avoid | always | all | avoid-page | page | left | right | recto | verso | avoid-column | column | avoid-region | region","break-before":"auto | avoid | always | all | avoid-page | page | left | right | recto | verso | avoid-column | column | avoid-region | region","break-inside":"auto | avoid | avoid-page | avoid-column | avoid-region","caption-side":"top | bottom | block-start | block-end | inline-start | inline-end","caret-color":"auto | <color>","clear":"none | left | right | both | inline-start | inline-end","clip":"<shape> | auto","clip-path":"<clip-source> | [ <basic-shape> || <geometry-box> ] | none","color":"<color>","color-adjust":"economy | exact","column-count":"<integer> | auto","column-fill":"auto | balance | balance-all","column-gap":"normal | <length-percentage>","column-rule":"<'column-rule-width'> || <'column-rule-style'> || <'column-rule-color'>","column-rule-color":"<color>","column-rule-style":"<'border-style'>","column-rule-width":"<'border-width'>","column-span":"none | all","column-width":"<length> | auto","columns":"<'column-width'> || <'column-count'>","contain":"none | strict | content | [ size || layout || style || paint ]","content":"normal | none | [ <content-replacement> | <content-list> ] [ / <string> ]?","counter-increment":"[ <custom-ident> <integer>? ]+ | none","counter-reset":"[ <custom-ident> <integer>? ]+ | none","cursor":"[ [ <url> [ <x> <y> ]? , ]* [ auto | default | none | context-menu | help | pointer | progress | wait | cell | crosshair | text | vertical-text | alias | copy | move | no-drop | not-allowed | e-resize | n-resize | ne-resize | nw-resize | s-resize | se-resize | sw-resize | w-resize | ew-resize | ns-resize | nesw-resize | nwse-resize | col-resize | row-resize | all-scroll | zoom-in | zoom-out | grab | grabbing | hand | -webkit-grab | -webkit-grabbing | -webkit-zoom-in | -webkit-zoom-out | -moz-grab | -moz-grabbing | -moz-zoom-in | -moz-zoom-out ] ]","direction":"ltr | rtl","display":"none | inline | block | list-item | inline-list-item | inline-block | inline-table | table | table-cell | table-column | table-column-group | table-footer-group | table-header-group | table-row | table-row-group | flex | inline-flex | grid | inline-grid | run-in | ruby | ruby-base | ruby-text | ruby-base-container | ruby-text-container | contents | -ms-flexbox | -ms-inline-flexbox | -ms-grid | -ms-inline-grid | -webkit-flex | -webkit-inline-flex | -webkit-box | -webkit-inline-box | -moz-inline-stack | -moz-box | -moz-inline-box","empty-cells":"show | hide","filter":"none | <filter-function-list> | <-ms-filter-function-list>","flex":"none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ]","flex-basis":"content | <'width'>","flex-direction":"row | row-reverse | column | column-reverse","flex-flow":"<'flex-direction'> || <'flex-wrap'>","flex-grow":"<number>","flex-shrink":"<number>","flex-wrap":"nowrap | wrap | wrap-reverse","float":"left | right | none | inline-start | inline-end","font":"[ [ <'font-style'> || <font-variant-css21> || <'font-weight'> || <'font-stretch'> ]? <'font-size'> [ / <'line-height'> ]? <'font-family'> ] | caption | icon | menu | message-box | small-caption | status-bar","font-family":"[ <family-name> | <generic-family> ]#","font-feature-settings":"normal | <feature-tag-value>#","font-kerning":"auto | normal | none","font-language-override":"normal | <string>","font-optical-sizing":"auto | none","font-variation-settings":"normal | [ <string> <number> ]#","font-size":"<absolute-size> | <relative-size> | <length-percentage>","font-size-adjust":"none | <number>","font-stretch":"<font-stretch-absolute>","font-style":"normal | italic | oblique <angle>?","font-synthesis":"none | [ weight || style ]","font-variant":"normal | none | [ <common-lig-values> || <discretionary-lig-values> || <historical-lig-values> || <contextual-alt-values> || stylistic( <feature-value-name> ) || historical-forms || styleset( <feature-value-name># ) || character-variant( <feature-value-name># ) || swash( <feature-value-name> ) || ornaments( <feature-value-name> ) || annotation( <feature-value-name> ) || [ small-caps | all-small-caps | petite-caps | all-petite-caps | unicase | titling-caps ] || <numeric-figure-values> || <numeric-spacing-values> || <numeric-fraction-values> || ordinal || slashed-zero || <east-asian-variant-values> || <east-asian-width-values> || ruby ]","font-variant-alternates":"normal | [ stylistic( <feature-value-name> ) || historical-forms || styleset( <feature-value-name># ) || character-variant( <feature-value-name># ) || swash( <feature-value-name> ) || ornaments( <feature-value-name> ) || annotation( <feature-value-name> ) ]","font-variant-caps":"normal | small-caps | all-small-caps | petite-caps | all-petite-caps | unicase | titling-caps","font-variant-east-asian":"normal | [ <east-asian-variant-values> || <east-asian-width-values> || ruby ]","font-variant-ligatures":"normal | none | [ <common-lig-values> || <discretionary-lig-values> || <historical-lig-values> || <contextual-alt-values> ]","font-variant-numeric":"normal | [ <numeric-figure-values> || <numeric-spacing-values> || <numeric-fraction-values> || ordinal || slashed-zero ]","font-variant-position":"normal | sub | super","font-weight":"<font-weight-absolute> | bolder | lighter","gap":"<'row-gap'> <'column-gap'>?","grid":"<'grid-template'> | <'grid-template-rows'> / [ auto-flow && dense? ] <'grid-auto-columns'>? | [ auto-flow && dense? ] <'grid-auto-rows'>? / <'grid-template-columns'>","grid-area":"<grid-line> [ / <grid-line> ]{0,3}","grid-auto-columns":"<track-size>+","grid-auto-flow":"[ row | column ] || dense","grid-auto-rows":"<track-size>+","grid-column":"<grid-line> [ / <grid-line> ]?","grid-column-end":"<grid-line>","grid-column-gap":"<length-percentage>","grid-column-start":"<grid-line>","grid-gap":"<'grid-row-gap'> <'grid-column-gap'>?","grid-row":"<grid-line> [ / <grid-line> ]?","grid-row-end":"<grid-line>","grid-row-gap":"<length-percentage>","grid-row-start":"<grid-line>","grid-template":"none | [ <'grid-template-rows'> / <'grid-template-columns'> ] | [ <line-names>? <string> <track-size>? <line-names>? ]+ [ / <explicit-track-list> ]?","grid-template-areas":"none | <string>+","grid-template-columns":"none | <track-list> | <auto-track-list>","grid-template-rows":"none | <track-list> | <auto-track-list>","hanging-punctuation":"none | [ first || [ force-end | allow-end ] || last ]","height":"[ <length> | <percentage> ] && [ border-box | content-box ]? | available | min-content | max-content | fit-content | auto","hyphens":"none | manual | auto","image-orientation":"from-image | <angle> | [ <angle>? flip ]","image-rendering":"auto | crisp-edges | pixelated | optimizeSpeed | optimizeQuality | <-non-standard-image-rendering>","image-resolution":"[ from-image || <resolution> ] && snap?","ime-mode":"auto | normal | active | inactive | disabled","initial-letter":"normal | [ <number> <integer>? ]","initial-letter-align":"[ auto | alphabetic | hanging | ideographic ]","inline-size":"<'width'>","inset":"<'top'>{1,4}","inset-block":"<'top'>{1,2}","inset-block-end":"<'top'>","inset-block-start":"<'top'>","inset-inline":"<'top'>{1,2}","inset-inline-end":"<'top'>","inset-inline-start":"<'top'>","isolation":"auto | isolate","justify-content":"normal | <content-distribution> | <overflow-position>? [ <content-position> | left | right ]","justify-items":"normal | stretch | <baseline-position> | <overflow-position>? [ <self-position> | left | right ] | legacy | legacy && [ left | right | center ]","justify-self":"auto | normal | stretch | <baseline-position> | <overflow-position>? [ <self-position> | left | right ]","left":"<length> | <percentage> | auto","letter-spacing":"normal | <length-percentage>","line-break":"auto | loose | normal | strict","line-clamp":"none | <integer>","line-height":"normal | <number> | <length> | <percentage>","line-height-step":"none | <length>","list-style":"<'list-style-type'> || <'list-style-position'> || <'list-style-image'>","list-style-image":"<url> | none","list-style-position":"inside | outside","list-style-type":"<counter-style> | <string> | none","margin":"[ <length> | <percentage> | auto ]{1,4}","margin-block":"<'margin-left'>{1,2}","margin-block-end":"<'margin-left'>","margin-block-start":"<'margin-left'>","margin-bottom":"<length> | <percentage> | auto","margin-inline":"<'margin-left'>{1,2}","margin-inline-end":"<'margin-left'>","margin-inline-start":"<'margin-left'>","margin-left":"<length> | <percentage> | auto","margin-right":"<length> | <percentage> | auto","margin-top":"<length> | <percentage> | auto","mask":"<mask-layer>#","mask-border":"<'mask-border-source'> || <'mask-border-slice'> [ / <'mask-border-width'>? [ / <'mask-border-outset'> ]? ]? || <'mask-border-repeat'> || <'mask-border-mode'>","mask-border-mode":"luminance | alpha","mask-border-outset":"[ <length> | <number> ]{1,4}","mask-border-repeat":"[ stretch | repeat | round | space ]{1,2}","mask-border-slice":"<number-percentage>{1,4} fill?","mask-border-source":"none | <image>","mask-border-width":"[ <length-percentage> | <number> | auto ]{1,4}","mask-clip":"[ <geometry-box> | no-clip ]#","mask-composite":"<compositing-operator>#","mask-image":"<mask-reference>#","mask-mode":"<masking-mode>#","mask-origin":"<geometry-box>#","mask-position":"<position>#","mask-repeat":"<repeat-style>#","mask-size":"<bg-size>#","mask-type":"luminance | alpha","max-block-size":"<'max-width'>","max-height":"<length> | <percentage> | none | max-content | min-content | fit-content | fill-available","max-inline-size":"<'max-width'>","max-lines":"none | <integer>","max-width":"<length> | <percentage> | none | max-content | min-content | fit-content | fill-available | <-non-standard-width>","min-block-size":"<'min-width'>","min-height":"<length> | <percentage> | auto | max-content | min-content | fit-content | fill-available","min-inline-size":"<'min-width'>","min-width":"<length> | <percentage> | auto | max-content | min-content | fit-content | fill-available | <-non-standard-width>","mix-blend-mode":"<blend-mode>","object-fit":"fill | contain | cover | none | scale-down","object-position":"<position>","offset":"[ <'offset-position'>? [ <'offset-path'> [ <'offset-distance'> || <'offset-rotate'> ]? ]? ]! [ / <'offset-anchor'> ]?","offset-anchor":"auto | <position>","offset-distance":"<length-percentage>","offset-path":"none | ray( [ <angle> && <size>? && contain? ] ) | <path()> | <url> | [ <basic-shape> || <geometry-box> ]","offset-position":"auto | <position>","offset-rotate":"[ auto | reverse ] || <angle>","opacity":"<number-zero-one>","order":"<integer>","orphans":"<integer>","outline":"[ <'outline-color'> || <'outline-style'> || <'outline-width'> ]","outline-color":"<color> | invert","outline-offset":"<length>","outline-style":"auto | <'border-style'>","outline-width":"<line-width>","overflow":"visible | hidden | scroll | auto | <-non-standard-overflow>","overflow-anchor":"auto | none","overflow-block":"visible | hidden | clip | scroll | auto","overflow-clip-box":"padding-box | content-box","overflow-inline":"visible | hidden | clip | scroll | auto","overflow-wrap":"normal | break-word | anywhere","overflow-x":"visible | hidden | clip | scroll | auto","overflow-y":"visible | hidden | clip | scroll | auto","overscroll-behavior":"[ contain | none | auto ]{1,2}","overscroll-behavior-x":"contain | none | auto","overscroll-behavior-y":"contain | none | auto","padding":"[ <length> | <percentage> ]{1,4}","padding-block":"<'padding-left'>{1,2}","padding-block-end":"<'padding-left'>","padding-block-start":"<'padding-left'>","padding-bottom":"<length> | <percentage>","padding-inline":"<'padding-left'>{1,2}","padding-inline-end":"<'padding-left'>","padding-inline-start":"<'padding-left'>","padding-left":"<length> | <percentage>","padding-right":"<length> | <percentage>","padding-top":"<length> | <percentage>","page-break-after":"auto | always | avoid | left | right | recto | verso","page-break-before":"auto | always | avoid | left | right | recto | verso","page-break-inside":"auto | avoid","paint-order":"normal | [ fill || stroke || markers ]","perspective":"none | <length>","perspective-origin":"<position>","place-content":"<'align-content'> <'justify-content'>?","place-items":"<'align-items'> <'justify-items'>?","place-self":"<'align-self'> <'justify-self'>?","pointer-events":"auto | none | visiblePainted | visibleFill | visibleStroke | visible | painted | fill | stroke | all | inherit","position":"static | relative | absolute | sticky | fixed | -webkit-sticky","quotes":"none | [ <string> <string> ]+","resize":"none | both | horizontal | vertical | block | inline","right":"<length> | <percentage> | auto","rotate":"none | <angle> | [ x | y | z | <number>{3} ] && <angle>","row-gap":"normal | <length-percentage>","ruby-align":"start | center | space-between | space-around","ruby-merge":"separate | collapse | auto","ruby-position":"over | under | inter-character","scale":"none | <number>{1,3}","scrollbar-color":"auto | dark | light | <color>{2}","scrollbar-width":"auto | thin | none","scroll-behavior":"auto | smooth","scroll-margin":"[ auto | <length> ]{1,4}","scroll-margin-block":"[ auto | <length> ]{1,2}","scroll-margin-block-start":"auto | <length>","scroll-margin-block-end":"auto | <length>","scroll-margin-bottom":"auto | <length>","scroll-margin-inline":"[ auto | <length> | <percentage> ]{1,2}","scroll-margin-inline-start":"auto | <length>","scroll-margin-inline-end":"auto | <length>","scroll-margin-left":"auto | <length>","scroll-margin-right":"auto | <length>","scroll-margin-top":"auto | <length>","scroll-padding":"[ auto | <length> | <percentage> ]{1,4}","scroll-padding-block":"[ auto | <length> | <percentage> ]{1,2}","scroll-padding-block-start":"auto | <length> | <percentage>","scroll-padding-block-end":"auto | <length> | <percentage>","scroll-padding-bottom":"auto | <length> | <percentage>","scroll-padding-inline":"[ auto | <length> | <percentage> ]{1,2}","scroll-padding-inline-start":"auto | <length> | <percentage>","scroll-padding-inline-end":"auto | <length> | <percentage>","scroll-padding-left":"auto | <length> | <percentage>","scroll-padding-right":"auto | <length> | <percentage>","scroll-padding-top":"auto | <length> | <percentage>","scroll-snap-align":"[ none | start | end | center ]{1,2}","scroll-snap-coordinate":"none | <position>#","scroll-snap-destination":"<position>","scroll-snap-points-x":"none | repeat( <length-percentage> )","scroll-snap-points-y":"none | repeat( <length-percentage> )","scroll-snap-stop":"normal | always","scroll-snap-type":"none | [ x | y | block | inline | both ] [ mandatory | proximity ]","scroll-snap-type-x":"none | mandatory | proximity","scroll-snap-type-y":"none | mandatory | proximity","shape-image-threshold":"<number>","shape-margin":"<length-percentage>","shape-outside":"none | <shape-box> || <basic-shape> | <image>","tab-size":"<integer> | <length>","table-layout":"auto | fixed","text-align":"start | end | left | right | center | justify | match-parent","text-align-last":"auto | start | end | left | right | center | justify","text-combine-upright":"none | all | [ digits <integer>? ]","text-decoration":"<'text-decoration-line'> || <'text-decoration-style'> || <'text-decoration-color'>","text-decoration-color":"<color>","text-decoration-line":"none | [ underline || overline || line-through || blink ]","text-decoration-skip":"none | [ objects || [ spaces | [ leading-spaces || trailing-spaces ] ] || edges || box-decoration ]","text-decoration-skip-ink":"auto | none","text-decoration-style":"solid | double | dotted | dashed | wavy","text-emphasis":"<'text-emphasis-style'> || <'text-emphasis-color'>","text-emphasis-color":"<color>","text-emphasis-position":"[ over | under ] && [ right | left ]","text-emphasis-style":"none | [ [ filled | open ] || [ dot | circle | double-circle | triangle | sesame ] ] | <string>","text-indent":"<length-percentage> && hanging? && each-line?","text-justify":"auto | inter-character | inter-word | none","text-orientation":"mixed | upright | sideways","text-overflow":"[ clip | ellipsis | <string> ]{1,2}","text-rendering":"auto | optimizeSpeed | optimizeLegibility | geometricPrecision","text-shadow":"none | <shadow-t>#","text-size-adjust":"none | auto | <percentage>","text-transform":"none | capitalize | uppercase | lowercase | full-width | full-size-kana","text-underline-position":"auto | [ under || [ left | right ] ]","top":"<length> | <percentage> | auto","touch-action":"auto | none | [ [ pan-x | pan-left | pan-right ] || [ pan-y | pan-up | pan-down ] || pinch-zoom ] | manipulation","transform":"none | <transform-list>","transform-box":"border-box | fill-box | view-box","transform-origin":"[ [ <length-percentage> | left | center | right ] && [ <length-percentage> | top | center | bottom ] ] <length>? | [ <length-percentage> | left | center | right | top | bottom ]","transform-style":"flat | preserve-3d","transition":"<single-transition>#","transition-delay":"<time>#","transition-duration":"<time>#","transition-property":"none | <single-transition-property>#","transition-timing-function":"<timing-function>#","translate":"none | <length-percentage> [ <length-percentage> <length>? ]?","unicode-bidi":"normal | embed | isolate | bidi-override | isolate-override | plaintext | -moz-isolate | -moz-isolate-override | -moz-plaintext | -webkit-isolate","user-select":"auto | text | none | contain | all","vertical-align":"baseline | sub | super | text-top | text-bottom | middle | top | bottom | <percentage> | <length>","visibility":"visible | hidden | collapse","white-space":"normal | pre | nowrap | pre-wrap | pre-line","widows":"<integer>","width":"[ <length> | <percentage> ] && [ border-box | content-box ]? | available | min-content | max-content | fit-content | auto","will-change":"auto | <animateable-feature>#","word-break":"normal | break-all | keep-all | <-non-standard-word-break>","word-spacing":"normal | <length-percentage>","word-wrap":"normal | break-word","writing-mode":"horizontal-tb | vertical-rl | vertical-lr | sideways-rl | sideways-lr | <svg-writing-mode>","z-index":"auto | <integer>","zoom":"normal | reset | <number> | <percentage>","-moz-background-clip":"padding | border","-moz-border-radius-bottomleft":"<'border-bottom-left-radius'>","-moz-border-radius-bottomright":"<'border-bottom-right-radius'>","-moz-border-radius-topleft":"<'border-top-left-radius'>","-moz-border-radius-topright":"<'border-bottom-right-radius'>","-moz-osx-font-smoothing":"auto | grayscale","-moz-user-select":"none | text | all | -moz-none","-ms-flex-align":"start | end | center | baseline | stretch","-ms-flex-item-align":"auto | start | end | center | baseline | stretch","-ms-flex-line-pack":"start | end | center | justify | distribute | stretch","-ms-flex-negative":"<'flex-shrink'>","-ms-flex-pack":"start | end | center | justify | distribute","-ms-flex-order":"<integer>","-ms-flex-positive":"<'flex-grow'>","-ms-flex-preferred-size":"<'flex-basis'>","-ms-interpolation-mode":"nearest-neighbor | bicubic","-ms-grid-column-align":"start | end | center | stretch","-ms-grid-row-align":"start | end | center | stretch","-webkit-background-clip":"[ <box> | border | padding | content | text ]#","-webkit-column-break-after":"always | auto | avoid","-webkit-column-break-before":"always | auto | avoid","-webkit-column-break-inside":"always | auto | avoid","-webkit-font-smoothing":"auto | none | antialiased | subpixel-antialiased","-webkit-mask-box-image":"[ <url> | <gradient> | none ] [ <length-percentage>{4} <-webkit-mask-box-repeat>{2} ]?","-webkit-print-color-adjust":"economy | exact","-webkit-text-security":"none | circle | disc | square","-webkit-user-drag":"none | element | auto","-webkit-user-select":"auto | none | text | all","alignment-baseline":"auto | baseline | before-edge | text-before-edge | middle | central | after-edge | text-after-edge | ideographic | alphabetic | hanging | mathematical","baseline-shift":"baseline | sub | super | <svg-length>","behavior":"<url>+","clip-rule":"nonzero | evenodd","cue":"<'cue-before'> <'cue-after'>?","cue-after":"<url> <decibel>? | none","cue-before":"<url> <decibel>? | none","dominant-baseline":"auto | use-script | no-change | reset-size | ideographic | alphabetic | hanging | mathematical | central | middle | text-after-edge | text-before-edge","fill":"<paint>","fill-opacity":"<number-zero-one>","fill-rule":"nonzero | evenodd","glyph-orientation-horizontal":"<angle>","glyph-orientation-vertical":"<angle>","kerning":"auto | <svg-length>","marker":"none | <url>","marker-end":"none | <url>","marker-mid":"none | <url>","marker-start":"none | <url>","pause":"<'pause-before'> <'pause-after'>?","pause-after":"<time> | none | x-weak | weak | medium | strong | x-strong","pause-before":"<time> | none | x-weak | weak | medium | strong | x-strong","rest":"<'rest-before'> <'rest-after'>?","rest-after":"<time> | none | x-weak | weak | medium | strong | x-strong","rest-before":"<time> | none | x-weak | weak | medium | strong | x-strong","shape-rendering":"auto | optimizeSpeed | crispEdges | geometricPrecision","src":"[ <url> [ format( <string># ) ]? | local( <family-name> ) ]#","speak":"auto | none | normal","speak-as":"normal | spell-out || digits || [ literal-punctuation | no-punctuation ]","stroke":"<paint>","stroke-dasharray":"none | [ <svg-length>+ ]#","stroke-dashoffset":"<svg-length>","stroke-linecap":"butt | round | square","stroke-linejoin":"miter | round | bevel","stroke-miterlimit":"<number-one-or-greater>","stroke-opacity":"<number-zero-one>","stroke-width":"<svg-length>","text-anchor":"start | middle | end","unicode-range":"<urange>#","voice-balance":"<number> | left | center | right | leftwards | rightwards","voice-duration":"auto | <time>","voice-family":"[ [ <family-name> | <generic-voice> ] , ]* [ <family-name> | <generic-voice> ] | preserve","voice-pitch":"<frequency> && absolute | [ [ x-low | low | medium | high | x-high ] || [ <frequency> | <semitones> | <percentage> ] ]","voice-range":"<frequency> && absolute | [ [ x-low | low | medium | high | x-high ] || [ <frequency> | <semitones> | <percentage> ] ]","voice-rate":"[ normal | x-slow | slow | medium | fast | x-fast ] || <percentage>","voice-stress":"normal | strong | moderate | none | reduced","voice-volume":"silent | [ [ x-soft | soft | medium | loud | x-loud ] || <decibel> ]"}} | ||
{"generic":true,"types":{"absolute-size":"xx-small | x-small | small | medium | large | x-large | xx-large","alpha-value":"<number> | <percentage>","angle-percentage":"<angle> | <percentage>","angular-color-hint":"<angle-percentage>","angular-color-stop":"<color> && <color-stop-angle>?","angular-color-stop-list":"[ <angular-color-stop> [, <angular-color-hint> ]? ]# , <angular-color-stop>","animateable-feature":"scroll-position | contents | <custom-ident>","attachment":"scroll | fixed | local","attr()":"attr( <attr-name> <type-or-unit>? [, <attr-fallback> ]? )","attr-matcher":"[ '~' | '|' | '^' | '$' | '*' ]? '='","attr-modifier":"i | s","attribute-selector":"'[' <wq-name> ']' | '[' <wq-name> <attr-matcher> [ <string-token> | <ident-token> ] <attr-modifier>? ']'","auto-repeat":"repeat( [ auto-fill | auto-fit ] , [ <line-names>? <fixed-size> ]+ <line-names>? )","auto-track-list":"[ <line-names>? [ <fixed-size> | <fixed-repeat> ] ]* <line-names>? <auto-repeat> [ <line-names>? [ <fixed-size> | <fixed-repeat> ] ]* <line-names>?","baseline-position":"[ first | last ]? baseline","basic-shape":"<inset()> | <circle()> | <ellipse()> | <polygon()>","bg-image":"none | <image>","bg-layer":"<bg-image> || <bg-position> [ / <bg-size> ]? || <repeat-style> || <attachment> || <box> || <box>","bg-position":"[ [ left | center | right | top | bottom | <length-percentage> ] | [ left | center | right | <length-percentage> ] [ top | center | bottom | <length-percentage> ] | [ center | [ left | right ] <length-percentage>? ] && [ center | [ top | bottom ] <length-percentage>? ] ]","bg-size":"[ <length-percentage> | auto ]{1,2} | cover | contain","blur()":"blur( <length> )","blend-mode":"normal | multiply | screen | overlay | darken | lighten | color-dodge | color-burn | hard-light | soft-light | difference | exclusion | hue | saturation | color | luminosity","box":"border-box | padding-box | content-box","brightness()":"brightness( <number-percentage> )","calc()":"calc( <calc-sum> )","calc-sum":"<calc-product> [ [ '+' | '-' ] <calc-product> ]*","calc-product":"<calc-value> [ '*' <calc-value> | '/' <number> ]*","calc-value":"<number> | <dimension> | <percentage> | ( <calc-sum> )","cf-final-image":"<image> | <color>","cf-mixing-image":"<percentage>? && <image>","circle()":"circle( [ <shape-radius> ]? [ at <position> ]? )","clamp()":"clamp( <calc-sum>#{3} )","class-selector":"'.' <ident-token>","clip-source":"<url>","color":"<rgb()> | <rgba()> | <hsl()> | <hsla()> | <hex-color> | <named-color> | currentcolor | <deprecated-system-color>","color-stop":"<color-stop-length> | <color-stop-angle>","color-stop-angle":"<angle-percentage>{1,2}","color-stop-length":"<length-percentage>{1,2}","color-stop-list":"[ <linear-color-stop> [, <linear-color-hint> ]? ]# , <linear-color-stop>","combinator":"'>' | '+' | '~' | [ '||' ]","common-lig-values":"[ common-ligatures | no-common-ligatures ]","compat":"searchfield | textarea | push-button | button-bevel | slider-horizontal | checkbox | radio | square-button | menulist | menulist-button | listbox | meter | progress-bar","composite-style":"clear | copy | source-over | source-in | source-out | source-atop | destination-over | destination-in | destination-out | destination-atop | xor","compositing-operator":"add | subtract | intersect | exclude","compound-selector":"[ <type-selector>? <subclass-selector>* [ <pseudo-element-selector> <pseudo-class-selector>* ]* ]!","compound-selector-list":"<compound-selector>#","complex-selector":"<compound-selector> [ <combinator>? <compound-selector> ]*","complex-selector-list":"<complex-selector>#","conic-gradient()":"conic-gradient( [ from <angle> ]? [ at <position> ]? , <angular-color-stop-list> )","contextual-alt-values":"[ contextual | no-contextual ]","content-distribution":"space-between | space-around | space-evenly | stretch","content-list":"[ <string> | contents | <url> | <quote> | <attr()> | counter( <ident> , <'list-style-type'>? ) ]+","content-position":"center | start | end | flex-start | flex-end","content-replacement":"<image>","contrast()":"contrast( [ <number-percentage> ] )","counter()":"counter( <custom-ident> , [ <counter-style> | none ]? )","counter-style":"<counter-style-name> | symbols( )","counter-style-name":"<custom-ident>","counters()":"counters( <custom-ident> , <string> , [ <counter-style> | none ]? )","cross-fade()":"cross-fade( <cf-mixing-image> , <cf-final-image>? )","cubic-bezier-timing-function":"ease | ease-in | ease-out | ease-in-out | cubic-bezier( <number> , <number> , <number> , <number> )","deprecated-system-color":"ActiveBorder | ActiveCaption | AppWorkspace | Background | ButtonFace | ButtonHighlight | ButtonShadow | ButtonText | CaptionText | GrayText | Highlight | HighlightText | InactiveBorder | InactiveCaption | InactiveCaptionText | InfoBackground | InfoText | Menu | MenuText | Scrollbar | ThreeDDarkShadow | ThreeDFace | ThreeDHighlight | ThreeDLightShadow | ThreeDShadow | Window | WindowFrame | WindowText","discretionary-lig-values":"[ discretionary-ligatures | no-discretionary-ligatures ]","display-box":"contents | none","display-inside":"flow | flow-root | table | flex | grid | ruby","display-internal":"table-row-group | table-header-group | table-footer-group | table-row | table-cell | table-column-group | table-column | table-caption | ruby-base | ruby-text | ruby-base-container | ruby-text-container","display-legacy":"inline-block | inline-list-item | inline-table | inline-flex | inline-grid","display-listitem":"<display-outside>? && [ flow | flow-root ]? && list-item","display-outside":"block | inline | run-in","drop-shadow()":"drop-shadow( <length>{2,3} <color>? )","east-asian-variant-values":"[ jis78 | jis83 | jis90 | jis04 | simplified | traditional ]","east-asian-width-values":"[ full-width | proportional-width ]","element()":"element( <id-selector> )","ellipse()":"ellipse( [ <shape-radius>{2} ]? [ at <position> ]? )","ending-shape":"circle | ellipse","env()":"env( <custom-ident> , <declaration-value>? )","explicit-track-list":"[ <line-names>? <track-size> ]+ <line-names>?","family-name":"<string> | <custom-ident>+","feature-tag-value":"<string> [ <integer> | on | off ]?","feature-type":"@stylistic | @historical-forms | @styleset | @character-variant | @swash | @ornaments | @annotation","feature-value-block":"<feature-type> '{' <feature-value-declaration-list> '}'","feature-value-block-list":"<feature-value-block>+","feature-value-declaration":"<custom-ident> : <integer>+ ;","feature-value-declaration-list":"<feature-value-declaration>","feature-value-name":"<custom-ident>","fill-rule":"nonzero | evenodd","filter-function":"<blur()> | <brightness()> | <contrast()> | <drop-shadow()> | <grayscale()> | <hue-rotate()> | <invert()> | <opacity()> | <saturate()> | <sepia()>","filter-function-list":"[ <filter-function> | <url> ]+","final-bg-layer":"<'background-color'> || <bg-image> || <bg-position> [ / <bg-size> ]? || <repeat-style> || <attachment> || <box> || <box>","fit-content()":"fit-content( [ <length> | <percentage> ] )","fixed-breadth":"<length-percentage>","fixed-repeat":"repeat( [ <positive-integer> ] , [ <line-names>? <fixed-size> ]+ <line-names>? )","fixed-size":"<fixed-breadth> | minmax( <fixed-breadth> , <track-breadth> ) | minmax( <inflexible-breadth> , <fixed-breadth> )","font-stretch-absolute":"normal | ultra-condensed | extra-condensed | condensed | semi-condensed | semi-expanded | expanded | extra-expanded | ultra-expanded | <percentage>","font-variant-css21":"[ normal | small-caps ]","font-weight-absolute":"normal | bold | <number>","frequency-percentage":"<frequency> | <percentage>","general-enclosed":"[ <function-token> <any-value> ) ] | ( <ident> <any-value> )","generic-family":"serif | sans-serif | cursive | fantasy | monospace | -apple-system","generic-name":"serif | sans-serif | cursive | fantasy | monospace","geometry-box":"<shape-box> | fill-box | stroke-box | view-box","gradient":"<linear-gradient()> | <repeating-linear-gradient()> | <radial-gradient()> | <repeating-radial-gradient()> | <conic-gradient()> | <-legacy-gradient>","grayscale()":"grayscale( <number-percentage> )","grid-line":"auto | <custom-ident> | [ <integer> && <custom-ident>? ] | [ span && [ <integer> || <custom-ident> ] ]","historical-lig-values":"[ historical-ligatures | no-historical-ligatures ]","hsl()":"hsl( <hue> <percentage> <percentage> [ / <alpha-value> ]? ) | hsl( <hue> , <percentage> , <percentage> , <alpha-value>? )","hsla()":"hsla( <hue> <percentage> <percentage> [ / <alpha-value> ]? ) | hsla( <hue> , <percentage> , <percentage> , <alpha-value>? )","hue":"<number> | <angle>","hue-rotate()":"hue-rotate( <angle> )","image":"<url> | <image()> | <image-set()> | <element()> | <cross-fade()> | <gradient>","image()":"image( <image-tags>? [ <image-src>? , <color>? ]! )","image-set()":"image-set( <image-set-option># )","image-set-option":"[ <image> | <string> ] <resolution>","image-src":"<url> | <string>","image-tags":"ltr | rtl","inflexible-breadth":"<length> | <percentage> | min-content | max-content | auto","inset()":"inset( <length-percentage>{1,4} [ round <'border-radius'> ]? )","invert()":"invert( <number-percentage> )","keyframes-name":"<custom-ident> | <string>","keyframe-block":"<keyframe-selector># { <declaration-list> }","keyframe-block-list":"<keyframe-block>+","keyframe-selector":"from | to | <percentage>","leader()":"leader( <leader-type> )","leader-type":"dotted | solid | space | <string>","length-percentage":"<length> | <percentage>","line-names":"'[' <custom-ident>* ']'","line-name-list":"[ <line-names> | <name-repeat> ]+","line-style":"none | hidden | dotted | dashed | solid | double | groove | ridge | inset | outset","line-width":"<length> | thin | medium | thick","linear-color-hint":"<length-percentage>","linear-color-stop":"<color> <color-stop-length>?","linear-gradient()":"linear-gradient( [ <angle> | to <side-or-corner> ]? , <color-stop-list> )","mask-layer":"<mask-reference> || <position> [ / <bg-size> ]? || <repeat-style> || <geometry-box> || [ <geometry-box> | no-clip ] || <compositing-operator> || <masking-mode>","mask-position":"[ <length-percentage> | left | center | right ] [ <length-percentage> | top | center | bottom ]?","mask-reference":"none | <image> | <mask-source>","mask-source":"<url>","masking-mode":"alpha | luminance | match-source","matrix()":"matrix( <number>#{6} )","matrix3d()":"matrix3d( <number>#{16} )","max()":"max( <calc-sum># )","media-and":"<media-in-parens> [ and <media-in-parens> ]+","media-condition":"<media-not> | <media-and> | <media-or> | <media-in-parens>","media-condition-without-or":"<media-not> | <media-and> | <media-in-parens>","media-feature":"( [ <mf-plain> | <mf-boolean> | <mf-range> ] )","media-in-parens":"( <media-condition> ) | <media-feature> | <general-enclosed>","media-not":"not <media-in-parens>","media-or":"<media-in-parens> [ or <media-in-parens> ]+","media-query":"<media-condition> | [ not | only ]? <media-type> [ and <media-condition-without-or> ]?","media-query-list":"<media-query>#","media-type":"<ident>","mf-boolean":"<mf-name>","mf-name":"<ident>","mf-plain":"<mf-name> : <mf-value>","mf-range":"<mf-name> [ '<' | '>' ]? '='? <mf-value> | <mf-value> [ '<' | '>' ]? '='? <mf-name> | <mf-value> '<' '='? <mf-name> '<' '='? <mf-value> | <mf-value> '>' '='? <mf-name> '>' '='? <mf-value>","mf-value":"<number> | <dimension> | <ident> | <ratio>","min()":"min( <calc-sum># )","minmax()":"minmax( [ <length> | <percentage> | <flex> | min-content | max-content | auto ] , [ <length> | <percentage> | <flex> | min-content | max-content | auto ] )","named-color":"transparent | aliceblue | antiquewhite | aqua | aquamarine | azure | beige | bisque | black | blanchedalmond | blue | blueviolet | brown | burlywood | cadetblue | chartreuse | chocolate | coral | cornflowerblue | cornsilk | crimson | cyan | darkblue | darkcyan | darkgoldenrod | darkgray | darkgreen | darkgrey | darkkhaki | darkmagenta | darkolivegreen | darkorange | darkorchid | darkred | darksalmon | darkseagreen | darkslateblue | darkslategray | darkslategrey | darkturquoise | darkviolet | deeppink | deepskyblue | dimgray | dimgrey | dodgerblue | firebrick | floralwhite | forestgreen | fuchsia | gainsboro | ghostwhite | gold | goldenrod | gray | green | greenyellow | grey | honeydew | hotpink | indianred | indigo | ivory | khaki | lavender | lavenderblush | lawngreen | lemonchiffon | lightblue | lightcoral | lightcyan | lightgoldenrodyellow | lightgray | lightgreen | lightgrey | lightpink | lightsalmon | lightseagreen | lightskyblue | lightslategray | lightslategrey | lightsteelblue | lightyellow | lime | limegreen | linen | magenta | maroon | mediumaquamarine | mediumblue | mediumorchid | mediumpurple | mediumseagreen | mediumslateblue | mediumspringgreen | mediumturquoise | mediumvioletred | midnightblue | mintcream | mistyrose | moccasin | navajowhite | navy | oldlace | olive | olivedrab | orange | orangered | orchid | palegoldenrod | palegreen | paleturquoise | palevioletred | papayawhip | peachpuff | peru | pink | plum | powderblue | purple | rebeccapurple | red | rosybrown | royalblue | saddlebrown | salmon | sandybrown | seagreen | seashell | sienna | silver | skyblue | slateblue | slategray | slategrey | snow | springgreen | steelblue | tan | teal | thistle | tomato | turquoise | violet | wheat | white | whitesmoke | yellow | yellowgreen | <-non-standard-color>","namespace-prefix":"<ident>","ns-prefix":"[ <ident-token> | '*' ]? '|'","number-percentage":"<number> | <percentage>","numeric-figure-values":"[ lining-nums | oldstyle-nums ]","numeric-fraction-values":"[ diagonal-fractions | stacked-fractions ]","numeric-spacing-values":"[ proportional-nums | tabular-nums ]","nth":"<an-plus-b> | even | odd","opacity()":"opacity( [ <number-percentage> ] )","overflow-position":"unsafe | safe","outline-radius":"<length> | <percentage>","page-body":"<declaration>? [ ; <page-body> ]? | <page-margin-box> <page-body>","page-margin-box":"<page-margin-box-type> '{' <declaration-list> '}'","page-margin-box-type":"@top-left-corner | @top-left | @top-center | @top-right | @top-right-corner | @bottom-left-corner | @bottom-left | @bottom-center | @bottom-right | @bottom-right-corner | @left-top | @left-middle | @left-bottom | @right-top | @right-middle | @right-bottom","page-selector-list":"[ <page-selector># ]?","page-selector":"<pseudo-page>+ | <ident> <pseudo-page>*","perspective()":"perspective( <length> )","polygon()":"polygon( <fill-rule>? , [ <length-percentage> <length-percentage> ]# )","position":"[ [ left | center | right ] || [ top | center | bottom ] | [ left | center | right | <length-percentage> ] [ top | center | bottom | <length-percentage> ]? | [ [ left | right ] <length-percentage> ] && [ [ top | bottom ] <length-percentage> ] ]","pseudo-class-selector":"':' <ident-token> | ':' <function-token> <any-value> ')'","pseudo-element-selector":"':' <pseudo-class-selector>","pseudo-page":": [ left | right | first | blank ]","quote":"open-quote | close-quote | no-open-quote | no-close-quote","radial-gradient()":"radial-gradient( [ <ending-shape> || <size> ]? [ at <position> ]? , <color-stop-list> )","relative-selector":"<combinator>? <complex-selector>","relative-selector-list":"<relative-selector>#","relative-size":"larger | smaller","repeat-style":"repeat-x | repeat-y | [ repeat | space | round | no-repeat ]{1,2}","repeating-linear-gradient()":"repeating-linear-gradient( [ <angle> | to <side-or-corner> ]? , <color-stop-list> )","repeating-radial-gradient()":"repeating-radial-gradient( [ <ending-shape> || <size> ]? [ at <position> ]? , <color-stop-list> )","rgb()":"rgb( <percentage>{3} [ / <alpha-value> ]? ) | rgb( <number>{3} [ / <alpha-value> ]? ) | rgb( <percentage>#{3} , <alpha-value>? ) | rgb( <number>#{3} , <alpha-value>? )","rgba()":"rgba( <percentage>{3} [ / <alpha-value> ]? ) | rgba( <number>{3} [ / <alpha-value> ]? ) | rgba( <percentage>#{3} , <alpha-value>? ) | rgba( <number>#{3} , <alpha-value>? )","rotate()":"rotate( [ <angle> | <zero> ] )","rotate3d()":"rotate3d( <number> , <number> , <number> , [ <angle> | <zero> ] )","rotateX()":"rotateX( [ <angle> | <zero> ] )","rotateY()":"rotateY( [ <angle> | <zero> ] )","rotateZ()":"rotateZ( [ <angle> | <zero> ] )","saturate()":"saturate( <number-percentage> )","scale()":"scale( <number> , <number>? )","scale3d()":"scale3d( <number> , <number> , <number> )","scaleX()":"scaleX( <number> )","scaleY()":"scaleY( <number> )","scaleZ()":"scaleZ( <number> )","self-position":"center | start | end | self-start | self-end | flex-start | flex-end","shape-radius":"<length-percentage> | closest-side | farthest-side","skew()":"skew( [ <angle> | <zero> ] , [ <angle> | <zero> ]? )","skewX()":"skewX( [ <angle> | <zero> ] )","skewY()":"skewY( [ <angle> | <zero> ] )","sepia()":"sepia( <number-percentage> )","shadow":"inset? && <length>{2,4} && <color>?","shadow-t":"[ <length>{2,3} && <color>? ]","shape":"rect( <top> , <right> , <bottom> , <left> ) | rect( <top> <right> <bottom> <left> )","shape-box":"<box> | margin-box","side-or-corner":"[ left | right ] || [ top | bottom ]","single-animation":"<time> || <timing-function> || <time> || <single-animation-iteration-count> || <single-animation-direction> || <single-animation-fill-mode> || <single-animation-play-state> || [ none | <keyframes-name> ]","single-animation-direction":"normal | reverse | alternate | alternate-reverse","single-animation-fill-mode":"none | forwards | backwards | both","single-animation-iteration-count":"infinite | <number>","single-animation-play-state":"running | paused","single-transition":"[ none | <single-transition-property> ] || <time> || <timing-function> || <time>","single-transition-property":"all | <custom-ident>","size":"closest-side | farthest-side | closest-corner | farthest-corner | <length> | <length-percentage>{2}","step-position":"jump-start | jump-end | jump-none | jump-both | start | end","step-timing-function":"step-start | step-end | steps( <integer> [, <step-position> ]? )","subclass-selector":"<id-selector> | <class-selector> | <attribute-selector> | <pseudo-class-selector>","supports-condition":"not <supports-in-parens> | <supports-in-parens> [ and <supports-in-parens> ]* | <supports-in-parens> [ or <supports-in-parens> ]*","supports-in-parens":"( <supports-condition> ) | <supports-feature> | <general-enclosed>","supports-feature":"<supports-decl> | <supports-selector-fn>","supports-decl":"( <declaration> )","supports-selector-fn":"selector( <complex-selector> )","symbol":"<string> | <image> | <custom-ident>","target":"<target-counter()> | <target-counters()> | <target-text()>","target-counter()":"target-counter( [ <string> | <url> ] , <custom-ident> , <counter-style>? )","target-counters()":"target-counters( [ <string> | <url> ] , <custom-ident> , <string> , <counter-style>? )","target-text()":"target-text( [ <string> | <url> ] , [ content | before | after | first-letter ]? )","time-percentage":"<time> | <percentage>","timing-function":"linear | <cubic-bezier-timing-function> | <step-timing-function>","track-breadth":"<length-percentage> | <flex> | min-content | max-content | auto","track-list":"[ <line-names>? [ <track-size> | <track-repeat> ] ]+ <line-names>?","track-repeat":"repeat( [ <positive-integer> ] , [ <line-names>? <track-size> ]+ <line-names>? )","track-size":"<track-breadth> | minmax( <inflexible-breadth> , <track-breadth> ) | fit-content( [ <length> | <percentage> ] )","transform-function":"<matrix()> | <translate()> | <translateX()> | <translateY()> | <scale()> | <scaleX()> | <scaleY()> | <rotate()> | <skew()> | <skewX()> | <skewY()> | <matrix3d()> | <translate3d()> | <translateZ()> | <scale3d()> | <scaleZ()> | <rotate3d()> | <rotateX()> | <rotateY()> | <rotateZ()> | <perspective()>","transform-list":"<transform-function>+","translate()":"translate( <length-percentage> , <length-percentage>? )","translate3d()":"translate3d( <length-percentage> , <length-percentage> , <length> )","translateX()":"translateX( <length-percentage> )","translateY()":"translateY( <length-percentage> )","translateZ()":"translateZ( <length> )","type-or-unit":"string | color | url | integer | number | length | angle | time | frequency | cap | ch | em | ex | ic | lh | rlh | rem | vb | vi | vw | vh | vmin | vmax | mm | Q | cm | in | pt | pc | px | deg | grad | rad | turn | ms | s | Hz | kHz | %","type-selector":"<wq-name> | <ns-prefix>? '*'","var()":"var( <custom-property-name> , <declaration-value>? )","viewport-length":"auto | <length-percentage>","wq-name":"<ns-prefix>? <ident-token>","-legacy-gradient":"<-webkit-gradient()> | <-legacy-linear-gradient> | <-legacy-repeating-linear-gradient> | <-legacy-radial-gradient> | <-legacy-repeating-radial-gradient>","-legacy-linear-gradient":"-moz-linear-gradient( <-legacy-linear-gradient-arguments> ) | -webkit-linear-gradient( <-legacy-linear-gradient-arguments> ) | -o-linear-gradient( <-legacy-linear-gradient-arguments> )","-legacy-repeating-linear-gradient":"-moz-repeating-linear-gradient( <-legacy-linear-gradient-arguments> ) | -webkit-repeating-linear-gradient( <-legacy-linear-gradient-arguments> ) | -o-repeating-linear-gradient( <-legacy-linear-gradient-arguments> )","-legacy-linear-gradient-arguments":"[ <angle> | <side-or-corner> ]? , <color-stop-list>","-legacy-radial-gradient":"-moz-radial-gradient( <-legacy-radial-gradient-arguments> ) | -webkit-radial-gradient( <-legacy-radial-gradient-arguments> ) | -o-radial-gradient( <-legacy-radial-gradient-arguments> )","-legacy-repeating-radial-gradient":"-moz-repeating-radial-gradient( <-legacy-radial-gradient-arguments> ) | -webkit-repeating-radial-gradient( <-legacy-radial-gradient-arguments> ) | -o-repeating-radial-gradient( <-legacy-radial-gradient-arguments> )","-legacy-radial-gradient-arguments":"[ <position> , ]? [ [ [ <-legacy-radial-gradient-shape> || <-legacy-radial-gradient-size> ] | [ <length> | <percentage> ]{2} ] , ]? <color-stop-list>","-legacy-radial-gradient-size":"closest-side | closest-corner | farthest-side | farthest-corner | contain | cover","-legacy-radial-gradient-shape":"circle | ellipse","-non-standard-font":"-apple-system-body | -apple-system-headline | -apple-system-subheadline | -apple-system-caption1 | -apple-system-caption2 | -apple-system-footnote | -apple-system-short-body | -apple-system-short-headline | -apple-system-short-subheadline | -apple-system-short-caption1 | -apple-system-short-footnote | -apple-system-tall-body","-non-standard-color":"-moz-ButtonDefault | -moz-ButtonHoverFace | -moz-ButtonHoverText | -moz-CellHighlight | -moz-CellHighlightText | -moz-Combobox | -moz-ComboboxText | -moz-Dialog | -moz-DialogText | -moz-dragtargetzone | -moz-EvenTreeRow | -moz-Field | -moz-FieldText | -moz-html-CellHighlight | -moz-html-CellHighlightText | -moz-mac-accentdarkestshadow | -moz-mac-accentdarkshadow | -moz-mac-accentface | -moz-mac-accentlightesthighlight | -moz-mac-accentlightshadow | -moz-mac-accentregularhighlight | -moz-mac-accentregularshadow | -moz-mac-chrome-active | -moz-mac-chrome-inactive | -moz-mac-focusring | -moz-mac-menuselect | -moz-mac-menushadow | -moz-mac-menutextselect | -moz-MenuHover | -moz-MenuHoverText | -moz-MenuBarText | -moz-MenuBarHoverText | -moz-nativehyperlinktext | -moz-OddTreeRow | -moz-win-communicationstext | -moz-win-mediatext | -moz-activehyperlinktext | -moz-default-background-color | -moz-default-color | -moz-hyperlinktext | -moz-visitedhyperlinktext | -webkit-activelink | -webkit-focus-ring-color | -webkit-link | -webkit-text","-non-standard-image-rendering":"optimize-contrast | -moz-crisp-edges | -o-crisp-edges | -webkit-optimize-contrast","-non-standard-overflow":"-moz-scrollbars-none | -moz-scrollbars-horizontal | -moz-scrollbars-vertical | -moz-hidden-unscrollable","-non-standard-width":"min-intrinsic | intrinsic | -moz-min-content | -moz-max-content | -webkit-min-content | -webkit-max-content","-webkit-gradient()":"-webkit-gradient( <-webkit-gradient-type> , <-webkit-gradient-point> [, <-webkit-gradient-point> | , <-webkit-gradient-radius> , <-webkit-gradient-point> ] [, <-webkit-gradient-radius> ]? [, <-webkit-gradient-color-stop> ]* )","-webkit-gradient-color-stop":"from( <color> ) | color-stop( [ <number-zero-one> | <percentage> ] , <color> ) | to( <color> )","-webkit-gradient-point":"[ left | center | right | <length-percentage> ] [ top | center | bottom | <length-percentage> ]","-webkit-gradient-radius":"<length> | <percentage>","-webkit-gradient-type":"linear | radial","-webkit-mask-box-repeat":"repeat | stretch | round","-webkit-mask-clip-style":"border | border-box | padding | padding-box | content | content-box | text","-ms-filter-function-list":"<-ms-filter-function>+","-ms-filter-function":"<-ms-filter-function-progid> | <-ms-filter-function-legacy>","-ms-filter-function-progid":"'progid:' [ <ident-token> '.' ]* [ <ident-token> | <function-token> <any-value>? ')' ]","-ms-filter-function-legacy":"<ident-token> | <function-token> <any-value>? ')'","-ms-filter":"<string>","age":"child | young | old","attr-name":"<wq-name>","attr-fallback":"<any-value>","border-radius":"<length-percentage>{1,2}","bottom":"<length> | auto","generic-voice":"[ <age>? <gender> <integer>? ]","gender":"male | female | neutral","left":"<length> | auto","mask-image":"<mask-reference>#","name-repeat":"repeat( [ <positive-integer> | auto-fill ] , <line-names>+ )","paint":"none | <color> | <url> [ none | <color> ]? | context-fill | context-stroke","path()":"path( <string> )","ratio":"<integer> / <integer>","right":"<length> | auto","svg-length":"<percentage> | <length> | <number>","svg-writing-mode":"lr-tb | rl-tb | tb-rl | lr | rl | tb","top":"<length> | auto","x":"<number>","y":"<number>","declaration":"<ident-token> : <declaration-value>? [ '!' important ]?","declaration-list":"[ <declaration>? ';' ]* <declaration>?","url":"url( <string> <url-modifier>* ) | <url-token>","url-modifier":"<ident> | <function-token> <any-value> )","number-zero-one":"<number [0,1]>","number-one-or-greater":"<number [1,∞]>","positive-integer":"<integer [0,∞]>"},"properties":{"--*":"<declaration-value>","-ms-accelerator":"false | true","-ms-block-progression":"tb | rl | bt | lr","-ms-content-zoom-chaining":"none | chained","-ms-content-zooming":"none | zoom","-ms-content-zoom-limit":"<'-ms-content-zoom-limit-min'> <'-ms-content-zoom-limit-max'>","-ms-content-zoom-limit-max":"<percentage>","-ms-content-zoom-limit-min":"<percentage>","-ms-content-zoom-snap":"<'-ms-content-zoom-snap-type'> || <'-ms-content-zoom-snap-points'>","-ms-content-zoom-snap-points":"snapInterval( <percentage> , <percentage> ) | snapList( <percentage># )","-ms-content-zoom-snap-type":"none | proximity | mandatory","-ms-filter":"<string>","-ms-flow-from":"[ none | <custom-ident> ]#","-ms-flow-into":"[ none | <custom-ident> ]#","-ms-high-contrast-adjust":"auto | none","-ms-hyphenate-limit-chars":"auto | <integer>{1,3}","-ms-hyphenate-limit-lines":"no-limit | <integer>","-ms-hyphenate-limit-zone":"<percentage> | <length>","-ms-ime-align":"auto | after","-ms-overflow-style":"auto | none | scrollbar | -ms-autohiding-scrollbar","-ms-scrollbar-3dlight-color":"<color>","-ms-scrollbar-arrow-color":"<color>","-ms-scrollbar-base-color":"<color>","-ms-scrollbar-darkshadow-color":"<color>","-ms-scrollbar-face-color":"<color>","-ms-scrollbar-highlight-color":"<color>","-ms-scrollbar-shadow-color":"<color>","-ms-scrollbar-track-color":"<color>","-ms-scroll-chaining":"chained | none","-ms-scroll-limit":"<'-ms-scroll-limit-x-min'> <'-ms-scroll-limit-y-min'> <'-ms-scroll-limit-x-max'> <'-ms-scroll-limit-y-max'>","-ms-scroll-limit-x-max":"auto | <length>","-ms-scroll-limit-x-min":"<length>","-ms-scroll-limit-y-max":"auto | <length>","-ms-scroll-limit-y-min":"<length>","-ms-scroll-rails":"none | railed","-ms-scroll-snap-points-x":"snapInterval( <length-percentage> , <length-percentage> ) | snapList( <length-percentage># )","-ms-scroll-snap-points-y":"snapInterval( <length-percentage> , <length-percentage> ) | snapList( <length-percentage># )","-ms-scroll-snap-type":"none | proximity | mandatory","-ms-scroll-snap-x":"<'-ms-scroll-snap-type'> <'-ms-scroll-snap-points-x'>","-ms-scroll-snap-y":"<'-ms-scroll-snap-type'> <'-ms-scroll-snap-points-y'>","-ms-scroll-translation":"none | vertical-to-horizontal","-ms-text-autospace":"none | ideograph-alpha | ideograph-numeric | ideograph-parenthesis | ideograph-space","-ms-touch-select":"grippers | none","-ms-user-select":"none | element | text","-ms-wrap-flow":"auto | both | start | end | maximum | clear","-ms-wrap-margin":"<length>","-ms-wrap-through":"wrap | none","-moz-appearance":"none | button | button-arrow-down | button-arrow-next | button-arrow-previous | button-arrow-up | button-bevel | button-focus | caret | checkbox | checkbox-container | checkbox-label | checkmenuitem | dualbutton | groupbox | listbox | listitem | menuarrow | menubar | menucheckbox | menuimage | menuitem | menuitemtext | menulist | menulist-button | menulist-text | menulist-textfield | menupopup | menuradio | menuseparator | meterbar | meterchunk | progressbar | progressbar-vertical | progresschunk | progresschunk-vertical | radio | radio-container | radio-label | radiomenuitem | range | range-thumb | resizer | resizerpanel | scale-horizontal | scalethumbend | scalethumb-horizontal | scalethumbstart | scalethumbtick | scalethumb-vertical | scale-vertical | scrollbarbutton-down | scrollbarbutton-left | scrollbarbutton-right | scrollbarbutton-up | scrollbarthumb-horizontal | scrollbarthumb-vertical | scrollbartrack-horizontal | scrollbartrack-vertical | searchfield | separator | sheet | spinner | spinner-downbutton | spinner-textfield | spinner-upbutton | splitter | statusbar | statusbarpanel | tab | tabpanel | tabpanels | tab-scroll-arrow-back | tab-scroll-arrow-forward | textfield | textfield-multiline | toolbar | toolbarbutton | toolbarbutton-dropdown | toolbargripper | toolbox | tooltip | treeheader | treeheadercell | treeheadersortarrow | treeitem | treeline | treetwisty | treetwistyopen | treeview | -moz-mac-unified-toolbar | -moz-win-borderless-glass | -moz-win-browsertabbar-toolbox | -moz-win-communicationstext | -moz-win-communications-toolbox | -moz-win-exclude-glass | -moz-win-glass | -moz-win-mediatext | -moz-win-media-toolbox | -moz-window-button-box | -moz-window-button-box-maximized | -moz-window-button-close | -moz-window-button-maximize | -moz-window-button-minimize | -moz-window-button-restore | -moz-window-frame-bottom | -moz-window-frame-left | -moz-window-frame-right | -moz-window-titlebar | -moz-window-titlebar-maximized","-moz-binding":"<url> | none","-moz-border-bottom-colors":"<color>+ | none","-moz-border-left-colors":"<color>+ | none","-moz-border-right-colors":"<color>+ | none","-moz-border-top-colors":"<color>+ | none","-moz-context-properties":"none | [ fill | fill-opacity | stroke | stroke-opacity ]#","-moz-float-edge":"border-box | content-box | margin-box | padding-box","-moz-force-broken-image-icon":"<integer>","-moz-image-region":"<shape> | auto","-moz-orient":"inline | block | horizontal | vertical","-moz-outline-radius":"<outline-radius>{1,4} [ / <outline-radius>{1,4} ]?","-moz-outline-radius-bottomleft":"<outline-radius>","-moz-outline-radius-bottomright":"<outline-radius>","-moz-outline-radius-topleft":"<outline-radius>","-moz-outline-radius-topright":"<outline-radius>","-moz-stack-sizing":"ignore | stretch-to-fit","-moz-text-blink":"none | blink","-moz-user-focus":"ignore | normal | select-after | select-before | select-menu | select-same | select-all | none","-moz-user-input":"auto | none | enabled | disabled","-moz-user-modify":"read-only | read-write | write-only","-moz-window-dragging":"drag | no-drag","-moz-window-shadow":"default | menu | tooltip | sheet | none","-webkit-appearance":"none | button | button-bevel | caps-lock-indicator | caret | checkbox | default-button | listbox | listitem | media-fullscreen-button | media-mute-button | media-play-button | media-seek-back-button | media-seek-forward-button | media-slider | media-sliderthumb | menulist | menulist-button | menulist-text | menulist-textfield | push-button | radio | scrollbarbutton-down | scrollbarbutton-left | scrollbarbutton-right | scrollbarbutton-up | scrollbargripper-horizontal | scrollbargripper-vertical | scrollbarthumb-horizontal | scrollbarthumb-vertical | scrollbartrack-horizontal | scrollbartrack-vertical | searchfield | searchfield-cancel-button | searchfield-decoration | searchfield-results-button | searchfield-results-decoration | slider-horizontal | slider-vertical | sliderthumb-horizontal | sliderthumb-vertical | square-button | textarea | textfield","-webkit-border-before":"<'border-width'> || <'border-style'> || <'color'>","-webkit-border-before-color":"<'color'>","-webkit-border-before-style":"<'border-style'>","-webkit-border-before-width":"<'border-width'>","-webkit-box-reflect":"[ above | below | right | left ]? <length>? <image>?","-webkit-line-clamp":"none | <integer>","-webkit-mask":"[ <mask-reference> || <position> [ / <bg-size> ]? || <repeat-style> || [ <box> | border | padding | content | text ] || [ <box> | border | padding | content ] ]#","-webkit-mask-attachment":"<attachment>#","-webkit-mask-clip":"[ <box> | border | padding | content | text ]#","-webkit-mask-composite":"<composite-style>#","-webkit-mask-image":"<mask-reference>#","-webkit-mask-origin":"[ <box> | border | padding | content ]#","-webkit-mask-position":"<position>#","-webkit-mask-position-x":"[ <length-percentage> | left | center | right ]#","-webkit-mask-position-y":"[ <length-percentage> | top | center | bottom ]#","-webkit-mask-repeat":"<repeat-style>#","-webkit-mask-repeat-x":"repeat | no-repeat | space | round","-webkit-mask-repeat-y":"repeat | no-repeat | space | round","-webkit-mask-size":"<bg-size>#","-webkit-overflow-scrolling":"auto | touch","-webkit-tap-highlight-color":"<color>","-webkit-text-fill-color":"<color>","-webkit-text-stroke":"<length> || <color>","-webkit-text-stroke-color":"<color>","-webkit-text-stroke-width":"<length>","-webkit-touch-callout":"default | none","-webkit-user-modify":"read-only | read-write | read-write-plaintext-only","align-content":"normal | <baseline-position> | <content-distribution> | <overflow-position>? <content-position>","align-items":"normal | stretch | <baseline-position> | [ <overflow-position>? <self-position> ]","align-self":"auto | normal | stretch | <baseline-position> | <overflow-position>? <self-position>","all":"initial | inherit | unset | revert","animation":"<single-animation>#","animation-delay":"<time>#","animation-direction":"<single-animation-direction>#","animation-duration":"<time>#","animation-fill-mode":"<single-animation-fill-mode>#","animation-iteration-count":"<single-animation-iteration-count>#","animation-name":"[ none | <keyframes-name> ]#","animation-play-state":"<single-animation-play-state>#","animation-timing-function":"<timing-function>#","appearance":"none | auto | button | textfield | <compat>","azimuth":"<angle> | [ [ left-side | far-left | left | center-left | center | center-right | right | far-right | right-side ] || behind ] | leftwards | rightwards","backdrop-filter":"none | <filter-function-list>","backface-visibility":"visible | hidden","background":"[ <bg-layer> , ]* <final-bg-layer>","background-attachment":"<attachment>#","background-blend-mode":"<blend-mode>#","background-clip":"<box>#","background-color":"<color>","background-image":"<bg-image>#","background-origin":"<box>#","background-position":"<bg-position>#","background-position-x":"[ center | [ left | right | x-start | x-end ]? <length-percentage>? ]#","background-position-y":"[ center | [ top | bottom | y-start | y-end ]? <length-percentage>? ]#","background-repeat":"<repeat-style>#","background-size":"<bg-size>#","block-overflow":"clip | ellipsis | <string>","block-size":"<'width'>","border":"<line-width> || <line-style> || <color>","border-block":"<'border-top-width'> || <'border-top-style'> || <'color'>","border-block-color":"<'border-top-color'>{1,2}","border-block-style":"<'border-top-style'>","border-block-width":"<'border-top-width'>","border-block-end":"<'border-top-width'> || <'border-top-style'> || <'color'>","border-block-end-color":"<'border-top-color'>","border-block-end-style":"<'border-top-style'>","border-block-end-width":"<'border-top-width'>","border-block-start":"<'border-top-width'> || <'border-top-style'> || <'color'>","border-block-start-color":"<'border-top-color'>","border-block-start-style":"<'border-top-style'>","border-block-start-width":"<'border-top-width'>","border-bottom":"<line-width> || <line-style> || <color>","border-bottom-color":"<'border-top-color'>","border-bottom-left-radius":"<length-percentage>{1,2}","border-bottom-right-radius":"<length-percentage>{1,2}","border-bottom-style":"<line-style>","border-bottom-width":"<line-width>","border-collapse":"collapse | separate","border-color":"<color>{1,4}","border-end-end-radius":"<length-percentage>{1,2}","border-end-start-radius":"<length-percentage>{1,2}","border-image":"<'border-image-source'> || <'border-image-slice'> [ / <'border-image-width'> | / <'border-image-width'>? / <'border-image-outset'> ]? || <'border-image-repeat'>","border-image-outset":"[ <length> | <number> ]{1,4}","border-image-repeat":"[ stretch | repeat | round | space ]{1,2}","border-image-slice":"<number-percentage>{1,4} && fill?","border-image-source":"none | <image>","border-image-width":"[ <length-percentage> | <number> | auto ]{1,4}","border-inline":"<'border-top-width'> || <'border-top-style'> || <'color'>","border-inline-end":"<'border-top-width'> || <'border-top-style'> || <'color'>","border-inline-color":"<'border-top-color'>{1,2}","border-inline-style":"<'border-top-style'>","border-inline-width":"<'border-top-width'>","border-inline-end-color":"<'border-top-color'>","border-inline-end-style":"<'border-top-style'>","border-inline-end-width":"<'border-top-width'>","border-inline-start":"<'border-top-width'> || <'border-top-style'> || <'color'>","border-inline-start-color":"<'border-top-color'>","border-inline-start-style":"<'border-top-style'>","border-inline-start-width":"<'border-top-width'>","border-left":"<line-width> || <line-style> || <color>","border-left-color":"<color>","border-left-style":"<line-style>","border-left-width":"<line-width>","border-radius":"<length-percentage>{1,4} [ / <length-percentage>{1,4} ]?","border-right":"<line-width> || <line-style> || <color>","border-right-color":"<color>","border-right-style":"<line-style>","border-right-width":"<line-width>","border-spacing":"<length> <length>?","border-start-end-radius":"<length-percentage>{1,2}","border-start-start-radius":"<length-percentage>{1,2}","border-style":"<line-style>{1,4}","border-top":"<line-width> || <line-style> || <color>","border-top-color":"<color>","border-top-left-radius":"<length-percentage>{1,2}","border-top-right-radius":"<length-percentage>{1,2}","border-top-style":"<line-style>","border-top-width":"<line-width>","border-width":"<line-width>{1,4}","bottom":"<length> | <percentage> | auto","box-align":"start | center | end | baseline | stretch","box-decoration-break":"slice | clone","box-direction":"normal | reverse | inherit","box-flex":"<number>","box-flex-group":"<integer>","box-lines":"single | multiple","box-ordinal-group":"<integer>","box-orient":"horizontal | vertical | inline-axis | block-axis | inherit","box-pack":"start | center | end | justify","box-shadow":"none | <shadow>#","box-sizing":"content-box | border-box","break-after":"auto | avoid | always | all | avoid-page | page | left | right | recto | verso | avoid-column | column | avoid-region | region","break-before":"auto | avoid | always | all | avoid-page | page | left | right | recto | verso | avoid-column | column | avoid-region | region","break-inside":"auto | avoid | avoid-page | avoid-column | avoid-region","caption-side":"top | bottom | block-start | block-end | inline-start | inline-end","caret-color":"auto | <color>","clear":"none | left | right | both | inline-start | inline-end","clip":"<shape> | auto","clip-path":"<clip-source> | [ <basic-shape> || <geometry-box> ] | none","color":"<color>","color-adjust":"economy | exact","column-count":"<integer> | auto","column-fill":"auto | balance | balance-all","column-gap":"normal | <length-percentage>","column-rule":"<'column-rule-width'> || <'column-rule-style'> || <'column-rule-color'>","column-rule-color":"<color>","column-rule-style":"<'border-style'>","column-rule-width":"<'border-width'>","column-span":"none | all","column-width":"<length> | auto","columns":"<'column-width'> || <'column-count'>","contain":"none | strict | content | [ size || layout || style || paint ]","content":"normal | none | [ <content-replacement> | <content-list> ] [ / <string> ]?","counter-increment":"[ <custom-ident> <integer>? ]+ | none","counter-reset":"[ <custom-ident> <integer>? ]+ | none","counter-set":"[ <custom-ident> <integer>? ]+ | none","cursor":"[ [ <url> [ <x> <y> ]? , ]* [ auto | default | none | context-menu | help | pointer | progress | wait | cell | crosshair | text | vertical-text | alias | copy | move | no-drop | not-allowed | e-resize | n-resize | ne-resize | nw-resize | s-resize | se-resize | sw-resize | w-resize | ew-resize | ns-resize | nesw-resize | nwse-resize | col-resize | row-resize | all-scroll | zoom-in | zoom-out | grab | grabbing | hand | -webkit-grab | -webkit-grabbing | -webkit-zoom-in | -webkit-zoom-out | -moz-grab | -moz-grabbing | -moz-zoom-in | -moz-zoom-out ] ]","direction":"ltr | rtl","display":"none | inline | block | list-item | inline-list-item | inline-block | inline-table | table | table-cell | table-column | table-column-group | table-footer-group | table-header-group | table-row | table-row-group | flex | inline-flex | grid | inline-grid | run-in | ruby | ruby-base | ruby-text | ruby-base-container | ruby-text-container | contents | -ms-flexbox | -ms-inline-flexbox | -ms-grid | -ms-inline-grid | -webkit-flex | -webkit-inline-flex | -webkit-box | -webkit-inline-box | -moz-inline-stack | -moz-box | -moz-inline-box","empty-cells":"show | hide","filter":"none | <filter-function-list> | <-ms-filter-function-list>","flex":"none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ]","flex-basis":"content | <'width'>","flex-direction":"row | row-reverse | column | column-reverse","flex-flow":"<'flex-direction'> || <'flex-wrap'>","flex-grow":"<number>","flex-shrink":"<number>","flex-wrap":"nowrap | wrap | wrap-reverse","float":"left | right | none | inline-start | inline-end","font":"[ [ <'font-style'> || <font-variant-css21> || <'font-weight'> || <'font-stretch'> ]? <'font-size'> [ / <'line-height'> ]? <'font-family'> ] | caption | icon | menu | message-box | small-caption | status-bar","font-family":"[ <family-name> | <generic-family> ]#","font-feature-settings":"normal | <feature-tag-value>#","font-kerning":"auto | normal | none","font-language-override":"normal | <string>","font-optical-sizing":"auto | none","font-variation-settings":"normal | [ <string> <number> ]#","font-size":"<absolute-size> | <relative-size> | <length-percentage>","font-size-adjust":"none | <number>","font-stretch":"<font-stretch-absolute>","font-style":"normal | italic | oblique <angle>?","font-synthesis":"none | [ weight || style ]","font-variant":"normal | none | [ <common-lig-values> || <discretionary-lig-values> || <historical-lig-values> || <contextual-alt-values> || stylistic( <feature-value-name> ) || historical-forms || styleset( <feature-value-name># ) || character-variant( <feature-value-name># ) || swash( <feature-value-name> ) || ornaments( <feature-value-name> ) || annotation( <feature-value-name> ) || [ small-caps | all-small-caps | petite-caps | all-petite-caps | unicase | titling-caps ] || <numeric-figure-values> || <numeric-spacing-values> || <numeric-fraction-values> || ordinal || slashed-zero || <east-asian-variant-values> || <east-asian-width-values> || ruby ]","font-variant-alternates":"normal | [ stylistic( <feature-value-name> ) || historical-forms || styleset( <feature-value-name># ) || character-variant( <feature-value-name># ) || swash( <feature-value-name> ) || ornaments( <feature-value-name> ) || annotation( <feature-value-name> ) ]","font-variant-caps":"normal | small-caps | all-small-caps | petite-caps | all-petite-caps | unicase | titling-caps","font-variant-east-asian":"normal | [ <east-asian-variant-values> || <east-asian-width-values> || ruby ]","font-variant-ligatures":"normal | none | [ <common-lig-values> || <discretionary-lig-values> || <historical-lig-values> || <contextual-alt-values> ]","font-variant-numeric":"normal | [ <numeric-figure-values> || <numeric-spacing-values> || <numeric-fraction-values> || ordinal || slashed-zero ]","font-variant-position":"normal | sub | super","font-weight":"<font-weight-absolute> | bolder | lighter","gap":"<'row-gap'> <'column-gap'>?","grid":"<'grid-template'> | <'grid-template-rows'> / [ auto-flow && dense? ] <'grid-auto-columns'>? | [ auto-flow && dense? ] <'grid-auto-rows'>? / <'grid-template-columns'>","grid-area":"<grid-line> [ / <grid-line> ]{0,3}","grid-auto-columns":"<track-size>+","grid-auto-flow":"[ row | column ] || dense","grid-auto-rows":"<track-size>+","grid-column":"<grid-line> [ / <grid-line> ]?","grid-column-end":"<grid-line>","grid-column-gap":"<length-percentage>","grid-column-start":"<grid-line>","grid-gap":"<'grid-row-gap'> <'grid-column-gap'>?","grid-row":"<grid-line> [ / <grid-line> ]?","grid-row-end":"<grid-line>","grid-row-gap":"<length-percentage>","grid-row-start":"<grid-line>","grid-template":"none | [ <'grid-template-rows'> / <'grid-template-columns'> ] | [ <line-names>? <string> <track-size>? <line-names>? ]+ [ / <explicit-track-list> ]?","grid-template-areas":"none | <string>+","grid-template-columns":"none | <track-list> | <auto-track-list>","grid-template-rows":"none | <track-list> | <auto-track-list>","hanging-punctuation":"none | [ first || [ force-end | allow-end ] || last ]","height":"[ <length> | <percentage> ] && [ border-box | content-box ]? | available | min-content | max-content | fit-content | auto","hyphens":"none | manual | auto","image-orientation":"from-image | <angle> | [ <angle>? flip ]","image-rendering":"auto | crisp-edges | pixelated | optimizeSpeed | optimizeQuality | <-non-standard-image-rendering>","image-resolution":"[ from-image || <resolution> ] && snap?","ime-mode":"auto | normal | active | inactive | disabled","initial-letter":"normal | [ <number> <integer>? ]","initial-letter-align":"[ auto | alphabetic | hanging | ideographic ]","inline-size":"<'width'>","inset":"<'top'>{1,4}","inset-block":"<'top'>{1,2}","inset-block-end":"<'top'>","inset-block-start":"<'top'>","inset-inline":"<'top'>{1,2}","inset-inline-end":"<'top'>","inset-inline-start":"<'top'>","isolation":"auto | isolate","justify-content":"normal | <content-distribution> | <overflow-position>? [ <content-position> | left | right ]","justify-items":"normal | stretch | <baseline-position> | <overflow-position>? [ <self-position> | left | right ] | legacy | legacy && [ left | right | center ]","justify-self":"auto | normal | stretch | <baseline-position> | <overflow-position>? [ <self-position> | left | right ]","left":"<length> | <percentage> | auto","letter-spacing":"normal | <length-percentage>","line-break":"auto | loose | normal | strict","line-clamp":"none | <integer>","line-height":"normal | <length> | <number> | <percentage>","line-height-step":"<length>","list-style":"<'list-style-type'> || <'list-style-position'> || <'list-style-image'>","list-style-image":"<url> | none","list-style-position":"inside | outside","list-style-type":"<counter-style> | <string> | none","margin":"[ <length> | <percentage> | auto ]{1,4}","margin-block":"<'margin-left'>{1,2}","margin-block-end":"<'margin-left'>","margin-block-start":"<'margin-left'>","margin-bottom":"<length> | <percentage> | auto","margin-inline":"<'margin-left'>{1,2}","margin-inline-end":"<'margin-left'>","margin-inline-start":"<'margin-left'>","margin-left":"<length> | <percentage> | auto","margin-right":"<length> | <percentage> | auto","margin-top":"<length> | <percentage> | auto","mask":"<mask-layer>#","mask-border":"<'mask-border-source'> || <'mask-border-slice'> [ / <'mask-border-width'>? [ / <'mask-border-outset'> ]? ]? || <'mask-border-repeat'> || <'mask-border-mode'>","mask-border-mode":"luminance | alpha","mask-border-outset":"[ <length> | <number> ]{1,4}","mask-border-repeat":"[ stretch | repeat | round | space ]{1,2}","mask-border-slice":"<number-percentage>{1,4} fill?","mask-border-source":"none | <image>","mask-border-width":"[ <length-percentage> | <number> | auto ]{1,4}","mask-clip":"[ <geometry-box> | no-clip ]#","mask-composite":"<compositing-operator>#","mask-image":"<mask-reference>#","mask-mode":"<masking-mode>#","mask-origin":"<geometry-box>#","mask-position":"<position>#","mask-repeat":"<repeat-style>#","mask-size":"<bg-size>#","mask-type":"luminance | alpha","max-block-size":"<'max-width'>","max-height":"<length> | <percentage> | none | max-content | min-content | fit-content | fill-available","max-inline-size":"<'max-width'>","max-lines":"none | <integer>","max-width":"<length> | <percentage> | none | max-content | min-content | fit-content | fill-available | <-non-standard-width>","min-block-size":"<'min-width'>","min-height":"<length> | <percentage> | auto | max-content | min-content | fit-content | fill-available","min-inline-size":"<'min-width'>","min-width":"<length> | <percentage> | auto | max-content | min-content | fit-content | fill-available | <-non-standard-width>","mix-blend-mode":"<blend-mode>","object-fit":"fill | contain | cover | none | scale-down","object-position":"<position>","offset":"[ <'offset-position'>? [ <'offset-path'> [ <'offset-distance'> || <'offset-rotate'> ]? ]? ]! [ / <'offset-anchor'> ]?","offset-anchor":"auto | <position>","offset-distance":"<length-percentage>","offset-path":"none | ray( [ <angle> && <size>? && contain? ] ) | <path()> | <url> | [ <basic-shape> || <geometry-box> ]","offset-position":"auto | <position>","offset-rotate":"[ auto | reverse ] || <angle>","opacity":"<number-zero-one>","order":"<integer>","orphans":"<integer>","outline":"[ <'outline-color'> || <'outline-style'> || <'outline-width'> ]","outline-color":"<color> | invert","outline-offset":"<length>","outline-style":"auto | <'border-style'>","outline-width":"<line-width>","overflow":"[ visible | hidden | clip | scroll | auto ]{1,2} | <-non-standard-overflow>","overflow-anchor":"auto | none","overflow-block":"visible | hidden | clip | scroll | auto","overflow-clip-box":"padding-box | content-box","overflow-inline":"visible | hidden | clip | scroll | auto","overflow-wrap":"normal | break-word | anywhere","overflow-x":"visible | hidden | clip | scroll | auto","overflow-y":"visible | hidden | clip | scroll | auto","overscroll-behavior":"[ contain | none | auto ]{1,2}","overscroll-behavior-x":"contain | none | auto","overscroll-behavior-y":"contain | none | auto","padding":"[ <length> | <percentage> ]{1,4}","padding-block":"<'padding-left'>{1,2}","padding-block-end":"<'padding-left'>","padding-block-start":"<'padding-left'>","padding-bottom":"<length> | <percentage>","padding-inline":"<'padding-left'>{1,2}","padding-inline-end":"<'padding-left'>","padding-inline-start":"<'padding-left'>","padding-left":"<length> | <percentage>","padding-right":"<length> | <percentage>","padding-top":"<length> | <percentage>","page-break-after":"auto | always | avoid | left | right | recto | verso","page-break-before":"auto | always | avoid | left | right | recto | verso","page-break-inside":"auto | avoid","paint-order":"normal | [ fill || stroke || markers ]","perspective":"none | <length>","perspective-origin":"<position>","place-content":"<'align-content'> <'justify-content'>?","place-items":"<'align-items'> <'justify-items'>?","place-self":"<'align-self'> <'justify-self'>?","pointer-events":"auto | none | visiblePainted | visibleFill | visibleStroke | visible | painted | fill | stroke | all | inherit","position":"static | relative | absolute | sticky | fixed | -webkit-sticky","quotes":"none | [ <string> <string> ]+","resize":"none | both | horizontal | vertical | block | inline","right":"<length> | <percentage> | auto","rotate":"none | <angle> | [ x | y | z | <number>{3} ] && <angle>","row-gap":"normal | <length-percentage>","ruby-align":"start | center | space-between | space-around","ruby-merge":"separate | collapse | auto","ruby-position":"over | under | inter-character","scale":"none | <number>{1,3}","scrollbar-color":"auto | dark | light | <color>{2}","scrollbar-width":"auto | thin | none","scroll-behavior":"auto | smooth","scroll-margin":"<length>{1,4}","scroll-margin-block":"<length>{1,2}","scroll-margin-block-start":"<length>","scroll-margin-block-end":"<length>","scroll-margin-bottom":"<length>","scroll-margin-inline":"<length>{1,2}","scroll-margin-inline-start":"<length>","scroll-margin-inline-end":"<length>","scroll-margin-left":"<length>","scroll-margin-right":"<length>","scroll-margin-top":"<length>","scroll-padding":"[ auto | <length-percentage> ]{1,4}","scroll-padding-block":"[ auto | <length-percentage> ]{1,2}","scroll-padding-block-start":"auto | <length-percentage>","scroll-padding-block-end":"auto | <length-percentage>","scroll-padding-bottom":"auto | <length-percentage>","scroll-padding-inline":"[ auto | <length-percentage> ]{1,2}","scroll-padding-inline-start":"auto | <length-percentage>","scroll-padding-inline-end":"auto | <length-percentage>","scroll-padding-left":"auto | <length-percentage>","scroll-padding-right":"auto | <length-percentage>","scroll-padding-top":"auto | <length-percentage>","scroll-snap-align":"[ none | start | end | center ]{1,2}","scroll-snap-coordinate":"none | <position>#","scroll-snap-destination":"<position>","scroll-snap-points-x":"none | repeat( <length-percentage> )","scroll-snap-points-y":"none | repeat( <length-percentage> )","scroll-snap-stop":"normal | always","scroll-snap-type":"none | [ x | y | block | inline | both ] [ mandatory | proximity ]?","scroll-snap-type-x":"none | mandatory | proximity","scroll-snap-type-y":"none | mandatory | proximity","shape-image-threshold":"<number>","shape-margin":"<length-percentage>","shape-outside":"none | <shape-box> || <basic-shape> | <image>","tab-size":"<integer> | <length>","table-layout":"auto | fixed","text-align":"start | end | left | right | center | justify | match-parent","text-align-last":"auto | start | end | left | right | center | justify","text-combine-upright":"none | all | [ digits <integer>? ]","text-decoration":"<'text-decoration-line'> || <'text-decoration-style'> || <'text-decoration-color'>","text-decoration-color":"<color>","text-decoration-line":"none | [ underline || overline || line-through || blink ]","text-decoration-skip":"none | [ objects || [ spaces | [ leading-spaces || trailing-spaces ] ] || edges || box-decoration ]","text-decoration-skip-ink":"auto | none","text-decoration-style":"solid | double | dotted | dashed | wavy","text-emphasis":"<'text-emphasis-style'> || <'text-emphasis-color'>","text-emphasis-color":"<color>","text-emphasis-position":"[ over | under ] && [ right | left ]","text-emphasis-style":"none | [ [ filled | open ] || [ dot | circle | double-circle | triangle | sesame ] ] | <string>","text-indent":"<length-percentage> && hanging? && each-line?","text-justify":"auto | inter-character | inter-word | none","text-orientation":"mixed | upright | sideways","text-overflow":"[ clip | ellipsis | <string> ]{1,2}","text-rendering":"auto | optimizeSpeed | optimizeLegibility | geometricPrecision","text-shadow":"none | <shadow-t>#","text-size-adjust":"none | auto | <percentage>","text-transform":"none | capitalize | uppercase | lowercase | full-width | full-size-kana","text-underline-position":"auto | [ under || [ left | right ] ]","top":"<length> | <percentage> | auto","touch-action":"auto | none | [ [ pan-x | pan-left | pan-right ] || [ pan-y | pan-up | pan-down ] || pinch-zoom ] | manipulation","transform":"none | <transform-list>","transform-box":"border-box | fill-box | view-box","transform-origin":"[ <length-percentage> | left | center | right | top | bottom ] | [ [ <length-percentage> | left | center | right ] && [ <length-percentage> | top | center | bottom ] ] <length>?","transform-style":"flat | preserve-3d","transition":"<single-transition>#","transition-delay":"<time>#","transition-duration":"<time>#","transition-property":"none | <single-transition-property>#","transition-timing-function":"<timing-function>#","translate":"none | <length-percentage> [ <length-percentage> <length>? ]?","unicode-bidi":"normal | embed | isolate | bidi-override | isolate-override | plaintext | -moz-isolate | -moz-isolate-override | -moz-plaintext | -webkit-isolate","user-select":"auto | text | none | contain | all","vertical-align":"baseline | sub | super | text-top | text-bottom | middle | top | bottom | <percentage> | <length>","visibility":"visible | hidden | collapse","white-space":"normal | pre | nowrap | pre-wrap | pre-line","widows":"<integer>","width":"[ <length> | <percentage> ] && [ border-box | content-box ]? | available | min-content | max-content | fit-content | auto","will-change":"auto | <animateable-feature>#","word-break":"normal | break-all | keep-all | break-word","word-spacing":"normal | <length-percentage>","word-wrap":"normal | break-word","writing-mode":"horizontal-tb | vertical-rl | vertical-lr | sideways-rl | sideways-lr | <svg-writing-mode>","z-index":"auto | <integer>","zoom":"normal | reset | <number> | <percentage>","-moz-background-clip":"padding | border","-moz-border-radius-bottomleft":"<'border-bottom-left-radius'>","-moz-border-radius-bottomright":"<'border-bottom-right-radius'>","-moz-border-radius-topleft":"<'border-top-left-radius'>","-moz-border-radius-topright":"<'border-bottom-right-radius'>","-moz-osx-font-smoothing":"auto | grayscale","-moz-user-select":"none | text | all | -moz-none","-ms-flex-align":"start | end | center | baseline | stretch","-ms-flex-item-align":"auto | start | end | center | baseline | stretch","-ms-flex-line-pack":"start | end | center | justify | distribute | stretch","-ms-flex-negative":"<'flex-shrink'>","-ms-flex-pack":"start | end | center | justify | distribute","-ms-flex-order":"<integer>","-ms-flex-positive":"<'flex-grow'>","-ms-flex-preferred-size":"<'flex-basis'>","-ms-interpolation-mode":"nearest-neighbor | bicubic","-ms-grid-column-align":"start | end | center | stretch","-ms-grid-row-align":"start | end | center | stretch","-webkit-background-clip":"[ <box> | border | padding | content | text ]#","-webkit-column-break-after":"always | auto | avoid","-webkit-column-break-before":"always | auto | avoid","-webkit-column-break-inside":"always | auto | avoid","-webkit-font-smoothing":"auto | none | antialiased | subpixel-antialiased","-webkit-mask-box-image":"[ <url> | <gradient> | none ] [ <length-percentage>{4} <-webkit-mask-box-repeat>{2} ]?","-webkit-print-color-adjust":"economy | exact","-webkit-text-security":"none | circle | disc | square","-webkit-user-drag":"none | element | auto","-webkit-user-select":"auto | none | text | all","alignment-baseline":"auto | baseline | before-edge | text-before-edge | middle | central | after-edge | text-after-edge | ideographic | alphabetic | hanging | mathematical","baseline-shift":"baseline | sub | super | <svg-length>","behavior":"<url>+","clip-rule":"nonzero | evenodd","cue":"<'cue-before'> <'cue-after'>?","cue-after":"<url> <decibel>? | none","cue-before":"<url> <decibel>? | none","dominant-baseline":"auto | use-script | no-change | reset-size | ideographic | alphabetic | hanging | mathematical | central | middle | text-after-edge | text-before-edge","fill":"<paint>","fill-opacity":"<number-zero-one>","fill-rule":"nonzero | evenodd","glyph-orientation-horizontal":"<angle>","glyph-orientation-vertical":"<angle>","kerning":"auto | <svg-length>","marker":"none | <url>","marker-end":"none | <url>","marker-mid":"none | <url>","marker-start":"none | <url>","pause":"<'pause-before'> <'pause-after'>?","pause-after":"<time> | none | x-weak | weak | medium | strong | x-strong","pause-before":"<time> | none | x-weak | weak | medium | strong | x-strong","rest":"<'rest-before'> <'rest-after'>?","rest-after":"<time> | none | x-weak | weak | medium | strong | x-strong","rest-before":"<time> | none | x-weak | weak | medium | strong | x-strong","shape-rendering":"auto | optimizeSpeed | crispEdges | geometricPrecision","src":"[ <url> [ format( <string># ) ]? | local( <family-name> ) ]#","speak":"auto | none | normal","speak-as":"normal | spell-out || digits || [ literal-punctuation | no-punctuation ]","stroke":"<paint>","stroke-dasharray":"none | [ <svg-length>+ ]#","stroke-dashoffset":"<svg-length>","stroke-linecap":"butt | round | square","stroke-linejoin":"miter | round | bevel","stroke-miterlimit":"<number-one-or-greater>","stroke-opacity":"<number-zero-one>","stroke-width":"<svg-length>","text-anchor":"start | middle | end","unicode-range":"<urange>#","voice-balance":"<number> | left | center | right | leftwards | rightwards","voice-duration":"auto | <time>","voice-family":"[ [ <family-name> | <generic-voice> ] , ]* [ <family-name> | <generic-voice> ] | preserve","voice-pitch":"<frequency> && absolute | [ [ x-low | low | medium | high | x-high ] || [ <frequency> | <semitones> | <percentage> ] ]","voice-range":"<frequency> && absolute | [ [ x-low | low | medium | high | x-high ] || [ <frequency> | <semitones> | <percentage> ] ]","voice-rate":"[ normal | x-slow | slow | medium | fast | x-fast ] || <percentage>","voice-stress":"normal | strong | moderate | none | reduced","voice-volume":"silent | [ [ x-soft | soft | medium | loud | x-loud ] || <decibel> ]"}} |
@@ -110,2 +110,26 @@ var tokenizerUtils = require('../tokenizer/utils'); | ||
function outOfRange(opts, value, numEnd) { | ||
if (opts && opts.type === 'Range') { | ||
var num = Number( | ||
numEnd !== undefined && numEnd !== value.length | ||
? value.substr(0, numEnd) | ||
: value | ||
); | ||
if (isNaN(num)) { | ||
return true; | ||
} | ||
if (opts.min !== null && num < opts.min) { | ||
return true; | ||
} | ||
if (opts.max !== null && num > opts.max) { | ||
return true; | ||
} | ||
} | ||
return false; | ||
} | ||
function consumeFunction(token, getNextToken) { | ||
@@ -131,3 +155,3 @@ var startIdx = token.index; | ||
function calc(next) { | ||
return function(token, getNextToken) { | ||
return function(token, getNextToken, opts) { | ||
if (token === null) { | ||
@@ -141,3 +165,3 @@ return 0; | ||
return next(token, getNextToken); | ||
return next(token, getNextToken, opts); | ||
}; | ||
@@ -286,3 +310,3 @@ } | ||
case TYPE.RightSquareBracket: | ||
if (token.balance > token.index || token.balance <= startIdx) { | ||
if (token.balance > token.index || token.balance < startIdx) { | ||
break scan; | ||
@@ -355,3 +379,3 @@ } | ||
case TYPE.RightSquareBracket: | ||
if (token.balance > token.index || token.balance <= startIdx) { | ||
if (token.balance > token.index || token.balance < startIdx) { | ||
break scan; | ||
@@ -379,15 +403,25 @@ } | ||
function dimension(type) { | ||
return function(token) { | ||
return function(token, getNextToken, opts) { | ||
debugger; | ||
if (token === null || token.type !== TYPE.Dimension) { | ||
return false; | ||
return 0; | ||
} | ||
var numberEnd = consumeNumber(token.value, 0); | ||
// check for IE postfix hack, i.e. 123px\0 or 123px\9 | ||
var reverseSolidusOffset = token.value.indexOf('\\', numberEnd); | ||
var unit = reverseSolidusOffset === -1 || !isPostfixIeHack(token.value, reverseSolidusOffset) | ||
? token.value.substr(numberEnd) | ||
: token.value.substring(numberEnd, reverseSolidusOffset); | ||
if (!type.hasOwnProperty(unit.toLowerCase())) { | ||
// check unit | ||
if (type !== null) { | ||
// check for IE postfix hack, i.e. 123px\0 or 123px\9 | ||
var reverseSolidusOffset = token.value.indexOf('\\', numberEnd); | ||
var unit = reverseSolidusOffset === -1 || !isPostfixIeHack(token.value, reverseSolidusOffset) | ||
? token.value.substr(numberEnd) | ||
: token.value.substring(numberEnd, reverseSolidusOffset); | ||
if (type.hasOwnProperty(unit.toLowerCase()) === false) { | ||
return 0; | ||
} | ||
} | ||
// check range if specified | ||
if (outOfRange(opts, token.value, numberEnd)) { | ||
return 0; | ||
@@ -401,5 +435,29 @@ } | ||
// ========================= | ||
// Percentage | ||
// | ||
// §5.5. Percentages: the <percentage> type | ||
// https://drafts.csswg.org/css-values-4/#percentages | ||
function percentage(token, getNextToken, opts) { | ||
// ... corresponds to the <percentage-token> production | ||
if (token === null || token.type !== TYPE.Percentage) { | ||
return 0; | ||
} | ||
// check range if specified | ||
if (outOfRange(opts, token.value, token.value.length - 1)) { | ||
return 0; | ||
} | ||
return 1; | ||
} | ||
// ========================= | ||
// Numeric | ||
// | ||
// https://drafts.csswg.org/css-values-4/#numbers | ||
// The value <zero> represents a literal number with the value 0. Expressions that merely | ||
// evaluate to a <number> with the value 0 (for example, calc(0)) do not match <zero>; | ||
// only literal <number-token>s do. | ||
function zero(next) { | ||
@@ -412,3 +470,3 @@ if (typeof next !== 'function') { | ||
return function(token, getNextToken) { | ||
return function(token, getNextToken, opts) { | ||
if (token !== null && token.type === TYPE.Number) { | ||
@@ -420,7 +478,11 @@ if (Number(token.value) === 0) { | ||
return next(token, getNextToken); | ||
return next(token, getNextToken, opts); | ||
}; | ||
} | ||
function number(token) { | ||
// § 5.3. Real Numbers: the <number> type | ||
// https://drafts.csswg.org/css-values-4/#numbers | ||
// Number values are denoted by <number>, and represent real numbers, possibly with a fractional component. | ||
// ... It corresponds to the <number-token> production | ||
function number(token, getNextToken, opts) { | ||
if (token === null) { | ||
@@ -431,23 +493,19 @@ return 0; | ||
var numberEnd = consumeNumber(token.value, 0); | ||
if (numberEnd !== token.value.length && !isPostfixIeHack(token.value, numberEnd)) { | ||
var isNumber = numberEnd === token.value.length; | ||
if (!isNumber && !isPostfixIeHack(token.value, numberEnd)) { | ||
return 0; | ||
} | ||
return 1; | ||
} | ||
function numberZeroOne(token) { | ||
if (token === null || token.type !== TYPE.Number) { | ||
// check range if specified | ||
if (outOfRange(opts, token.value, numberEnd)) { | ||
return 0; | ||
} | ||
var value = Number(token.value); | ||
if (value < 0 || value > 1) { | ||
return 0; | ||
} | ||
return 1; | ||
} | ||
function numberOneOrGreater(token) { | ||
// §5.2. Integers: the <integer> type | ||
// https://drafts.csswg.org/css-values-4/#integers | ||
function integer(token, getNextToken, opts) { | ||
// ... corresponds to a subset of the <number-token> production | ||
if (token === null || token.type !== TYPE.Number) { | ||
@@ -457,17 +515,15 @@ return 0; | ||
var value = Number(token.value); | ||
if (value < 1) { | ||
return 0; | ||
} | ||
// The first digit of an integer may be immediately preceded by `-` or `+` to indicate the integer’s sign. | ||
var i = token.value.charCodeAt(0) === 0x002B || // U+002B PLUS SIGN (+) | ||
token.value.charCodeAt(0) === 0x002D ? 1 : 0; // U+002D HYPHEN-MINUS (-) | ||
return 1; | ||
} | ||
// TODO: fail on 10e-2 | ||
function integer(token) { | ||
if (token === null || token.type !== TYPE.Number) { | ||
return 0; | ||
// When written literally, an integer is one or more decimal digits 0 through 9 ... | ||
for (; i < token.value.length; i++) { | ||
if (!isDigit(token.value.charCodeAt(i))) { | ||
return 0; | ||
} | ||
} | ||
if (token.value.indexOf('.') !== -1) { | ||
// check range if specified | ||
if (outOfRange(opts, token.value, i)) { | ||
return 0; | ||
@@ -479,16 +535,2 @@ } | ||
function positiveInteger(token) { | ||
if (token === null || token.type !== TYPE.Number) { | ||
return 0; | ||
} | ||
for (var i = 0; i < token.value.length; i++) { | ||
if (!isDigit(token.value.charCodeAt(i))) { | ||
return 0; | ||
} | ||
} | ||
return 1; | ||
} | ||
module.exports = { | ||
@@ -522,3 +564,2 @@ // token types | ||
// token type aliases | ||
'dimension': tokenType(TYPE.Dimension), | ||
'string': tokenType(TYPE.String), | ||
@@ -538,2 +579,3 @@ 'ident': tokenType(TYPE.Ident), | ||
// dimensions | ||
'dimension': calc(dimension(null)), | ||
'angle': calc(dimension(ANGLE)), | ||
@@ -544,3 +586,2 @@ 'decibel': calc(dimension(DECIBEL)), | ||
'length': calc(zero(dimension(LENGTH))), | ||
'percentage': calc(tokenType(TYPE.Percentage)), | ||
'resolution': calc(dimension(RESOLUTION)), | ||
@@ -550,9 +591,9 @@ 'semitones': calc(dimension(SEMITONES)), | ||
// percentage | ||
'percentage': calc(percentage), | ||
// numeric | ||
'zero': zero(), | ||
'number': calc(number), | ||
'number-zero-one': calc(numberZeroOne), | ||
'number-one-or-greater': calc(numberOneOrGreater), | ||
'integer': calc(integer), | ||
'positive-integer': calc(positiveInteger), | ||
@@ -559,0 +600,0 @@ // old IE stuff |
@@ -31,2 +31,18 @@ function noop(value) { | ||
function generateTypeOpts(node) { | ||
switch (node.type) { | ||
case 'Range': | ||
return ( | ||
' [' + | ||
(node.min === null ? '-∞' : node.min) + | ||
',' + | ||
(node.max === null ? '∞' : node.max) + | ||
']' | ||
); | ||
default: | ||
throw new Error('Unknown node type `' + node.type + '`'); | ||
} | ||
} | ||
function generateSequence(node, forceBraces, decorate) { | ||
@@ -62,3 +78,3 @@ var result = node.terms.map(function(term) { | ||
case 'Type': | ||
result = '<' + node.name + '>'; | ||
result = '<' + node.name + (node.opts ? decorate(generateTypeOpts(node.opts), node.opts) : '') + '>'; | ||
break; | ||
@@ -65,0 +81,0 @@ |
@@ -16,2 +16,3 @@ var Tokenizer = require('./tokenizer'); | ||
var COMMA = 44; // , | ||
var HYPERMINUS = 45; // - | ||
var LESSTHANSIGN = 60; // < | ||
@@ -26,2 +27,3 @@ var GREATERTHANSIGN = 62; // > | ||
var RIGHTCURLYBRACKET = 125; // } | ||
var INFINITY = 8734; // ∞ | ||
var NAME_CHAR = createCharMap(function(ch) { | ||
@@ -47,3 +49,3 @@ return /[a-zA-Z0-9\-]/.test(ch); | ||
return tokenizer.substringToPos( | ||
tokenizer.findWsEnd(tokenizer.pos + 1) | ||
tokenizer.findWsEnd(tokenizer.pos) | ||
); | ||
@@ -231,4 +233,63 @@ } | ||
// https://drafts.csswg.org/css-values-3/#numeric-ranges | ||
// 4.1. Range Restrictions and Range Definition Notation | ||
// | ||
// Range restrictions can be annotated in the numeric type notation using CSS bracketed | ||
// range notation—[min,max]—within the angle brackets, after the identifying keyword, | ||
// indicating a closed range between (and including) min and max. | ||
// For example, <integer [0, 10]> indicates an integer between 0 and 10, inclusive. | ||
function readTypeRange(tokenizer) { | ||
// use null for Infinity to make AST format JSON serializable/deserializable | ||
var min = null; // -Infinity | ||
var max = null; // Infinity | ||
var sign = 1; | ||
tokenizer.eat(LEFTSQUAREBRACKET); | ||
if (tokenizer.charCode() === HYPERMINUS) { | ||
tokenizer.peek(); | ||
sign = -1; | ||
} | ||
if (sign == -1 && tokenizer.charCode() === INFINITY) { | ||
tokenizer.peek(); | ||
} else { | ||
min = sign * Number(scanNumber(tokenizer)); | ||
} | ||
scanSpaces(tokenizer); | ||
tokenizer.eat(COMMA); | ||
scanSpaces(tokenizer); | ||
if (tokenizer.charCode() === INFINITY) { | ||
tokenizer.peek(); | ||
} else { | ||
sign = 1; | ||
if (tokenizer.charCode() === HYPERMINUS) { | ||
tokenizer.peek(); | ||
sign = -1; | ||
} | ||
max = sign * Number(scanNumber(tokenizer)); | ||
} | ||
tokenizer.eat(RIGHTSQUAREBRACKET); | ||
// If no range is indicated, either by using the bracketed range notation | ||
// or in the property description, then [−∞,∞] is assumed. | ||
if (min === null && max === null) { | ||
return null; | ||
} | ||
return { | ||
type: 'Range', | ||
min: min, | ||
max: max | ||
}; | ||
} | ||
function readType(tokenizer) { | ||
var name; | ||
var opts = null; | ||
@@ -244,2 +305,7 @@ tokenizer.eat(LESSTHANSIGN); | ||
if (tokenizer.charCodeAt(tokenizer.findWsEnd(tokenizer.pos)) === LEFTSQUAREBRACKET) { | ||
scanSpaces(tokenizer); | ||
opts = readTypeRange(tokenizer); | ||
} | ||
tokenizer.eat(GREATERTHANSIGN); | ||
@@ -249,3 +315,4 @@ | ||
type: 'Type', | ||
name: name | ||
name: name, | ||
opts: opts | ||
}); | ||
@@ -252,0 +319,0 @@ } |
@@ -29,12 +29,10 @@ var SyntaxReferenceError = require('./error').SyntaxReferenceError; | ||
function valueHasVar(value) { | ||
var hasVar = false; | ||
this.syntax.walk(value, function(node) { | ||
if (node.type === 'Function' && node.name.toLowerCase() === 'var') { | ||
hasVar = true; | ||
function valueHasVar(tokens) { | ||
for (var i = 0; i < tokens.length; i++) { | ||
if (tokens[i].value.toLowerCase() === 'var(') { | ||
return true; | ||
} | ||
}); | ||
} | ||
return hasVar; | ||
return false; | ||
} | ||
@@ -55,9 +53,9 @@ | ||
function matchSyntax(lexer, syntax, value, useCommon) { | ||
if (value && valueHasVar.call(lexer, value)) { | ||
var tokens = prepareTokens(value, lexer.syntax); | ||
var result; | ||
if (valueHasVar(tokens)) { | ||
return buildMatchResult(null, new Error('Matching for a tree with var() is not supported')); | ||
} | ||
var tokens = prepareTokens(value, lexer.syntax); | ||
var result; | ||
if (useCommon) { | ||
@@ -90,2 +88,8 @@ result = matchAsTree(tokens, lexer.valueCommonSyntax, lexer); | ||
if (config) { | ||
if (config.types) { | ||
for (var name in config.types) { | ||
this.addType_(name, config.types[name]); | ||
} | ||
} | ||
if (config.generic) { | ||
@@ -98,8 +102,2 @@ this.generic = true; | ||
if (config.types) { | ||
for (var name in config.types) { | ||
this.addType_(name, config.types[name]); | ||
} | ||
} | ||
if (config.properties) { | ||
@@ -106,0 +104,0 @@ for (var name in config.properties) { |
@@ -73,2 +73,6 @@ var parse = require('./grammar/parse'); | ||
); | ||
if (i > 0) { | ||
result.checkStash = true; | ||
} | ||
}; | ||
@@ -207,3 +211,3 @@ | ||
all: false | ||
};; | ||
}; | ||
} | ||
@@ -283,2 +287,3 @@ | ||
result.checkStash = true; | ||
result.then = createCondition( | ||
@@ -317,2 +322,3 @@ MATCH, | ||
); | ||
result.checkStash = true; | ||
} | ||
@@ -421,3 +427,3 @@ } | ||
type: node.type, | ||
value: node.value, | ||
value: node.value.substr(1, node.value.length - 2).replace(/\\'/g, '\''), | ||
syntax: node | ||
@@ -424,0 +430,0 @@ }; |
@@ -6,3 +6,5 @@ var hasOwnProperty = Object.prototype.hasOwnProperty; | ||
var DISALLOW_EMPTY = matchGraph.DISALLOW_EMPTY; | ||
var TYPE = require('../tokenizer/const').TYPE; | ||
var STUB = 0; | ||
var TOKEN = 1; | ||
@@ -30,2 +32,24 @@ var OPEN_SYNTAX = 2; | ||
function areStringsEqualCaseInsensitive(testStr, referenceStr) { | ||
if (testStr.length !== referenceStr.length) { | ||
return false; | ||
} | ||
for (var i = 0; i < testStr.length; i++) { | ||
var testCode = testStr.charCodeAt(i); | ||
var referenceCode = referenceStr.charCodeAt(i); | ||
// testCode.toLowerCase() for U+0041 LATIN CAPITAL LETTER A (A) .. U+005A LATIN CAPITAL LETTER Z (Z). | ||
if (testCode >= 0x0041 && testCode <= 0x005A) { | ||
testCode = testCode | 32; | ||
} | ||
if (testCode !== referenceCode) { | ||
return false; | ||
} | ||
} | ||
return true; | ||
} | ||
function isCommaContextStart(token) { | ||
@@ -36,9 +60,9 @@ if (token === null) { | ||
token = token.value.charAt(token.value.length - 1); | ||
var ch = token.value.charAt(token.value.length - 1); | ||
return ( | ||
token === ',' || | ||
token === '(' || | ||
token === '[' || | ||
token === '/' | ||
ch === ',' || | ||
ch === '(' || | ||
ch === '[' || | ||
ch === '/' | ||
); | ||
@@ -52,16 +76,16 @@ } | ||
token = token.value.charAt(0); | ||
var ch = token.value.charAt(0); | ||
return ( | ||
token === ')' || | ||
token === ']' || | ||
token === '/' | ||
ch === ')' || | ||
ch === ']' || | ||
ch === '/' | ||
); | ||
} | ||
function internalMatch(tokens, syntax, syntaxes) { | ||
function internalMatch(tokens, state, syntaxes) { | ||
function moveToNextToken() { | ||
do { | ||
tokenCursor++; | ||
token = tokenCursor < tokens.length ? tokens[tokenCursor] : null; | ||
tokenIndex++; | ||
token = tokenIndex < tokens.length ? tokens[tokenIndex] : null; | ||
} while (token !== null && !/\S/.test(token.value)); | ||
@@ -71,3 +95,3 @@ } | ||
function getNextToken(offset) { | ||
var nextIndex = tokenCursor + offset; | ||
var nextIndex = tokenIndex + offset; | ||
@@ -77,27 +101,31 @@ return nextIndex < tokens.length ? tokens[nextIndex] : null; | ||
function pushThenStack(nextSyntax) { | ||
thenStack = { | ||
nextSyntax: nextSyntax, | ||
function stateSnapshotFromSyntax(nextState, prev) { | ||
return { | ||
nextState: nextState, | ||
matchStack: matchStack, | ||
syntaxStack: syntaxStack, | ||
prev: thenStack | ||
thenStack: thenStack, | ||
tokenCursor: tokenIndex, | ||
token: token, | ||
prev: prev | ||
}; | ||
} | ||
function pushElseStack(nextSyntax) { | ||
elseStack = { | ||
nextSyntax: nextSyntax, | ||
function pushThenStack(nextState) { | ||
thenStack = { | ||
nextState: nextState, | ||
matchStack: matchStack, | ||
syntaxStack: syntaxStack, | ||
thenStack: thenStack, | ||
tokenCursor: tokenCursor, | ||
token: token, | ||
prev: elseStack | ||
prev: thenStack | ||
}; | ||
} | ||
function pushElseStack(nextState) { | ||
elseStack = stateSnapshotFromSyntax(nextState, elseStack); | ||
} | ||
function addTokenToMatch() { | ||
matchStack = { | ||
type: TOKEN, | ||
syntax: syntax.syntax, | ||
syntax: state.syntax, | ||
token: token, | ||
@@ -109,5 +137,9 @@ prev: matchStack | ||
if (tokenCursor > longestMatch) { | ||
longestMatch = tokenCursor; | ||
if (syntaxStash !== null) { | ||
syntaxStash = null; | ||
} | ||
if (tokenIndex > longestMatch) { | ||
longestMatch = tokenIndex; | ||
} | ||
} | ||
@@ -117,3 +149,4 @@ | ||
syntaxStack = { | ||
syntax: syntax, | ||
syntax: state, | ||
opts: state.syntax.opts || (syntaxStack !== null && syntaxStack.opts) || null, | ||
prev: syntaxStack | ||
@@ -124,3 +157,3 @@ }; | ||
type: OPEN_SYNTAX, | ||
syntax: syntax.syntax, | ||
syntax: state.syntax, | ||
token: matchStack.token, | ||
@@ -150,17 +183,27 @@ prev: matchStack | ||
var iterationCount = 0; | ||
var exitReason = EXIT_REASON_MATCH; | ||
// null – stashing allowed, nothing stashed | ||
// false – stashing disabled, nothing stashed | ||
// anithing else – fail stashable syntaxes, some syntax stashed | ||
var syntaxStash = null; | ||
var matchStack = { type: 'Stub', syntax: null, token: null, tokenCursor: -1, prev: null }; | ||
var iterationCount = 0; // count iterations and prevent infinite loop | ||
var exitReason = null; | ||
var token = null; | ||
var tokenIndex = -1; | ||
var longestMatch = 0; | ||
var tokenCursor = -1; | ||
var token = null; | ||
var matchStack = { | ||
type: STUB, | ||
syntax: null, | ||
token: null, | ||
prev: null | ||
}; | ||
moveToNextToken(); | ||
while (true) { | ||
while (exitReason === null && ++iterationCount < ITERATION_LIMIT) { | ||
// console.log('--\n', | ||
// '#' + iterationCount, | ||
// require('util').inspect({ | ||
// match: mapList(matchStack, x => x.type === TOKEN ? x.token && x.token.value : x.syntax ? x.type + '!' + x.syntax.name : null), | ||
// match: mapList(matchStack, x => x.type === TOKEN ? x.token && x.token.value : x.syntax ? ({ [OPEN_SYNTAX]: '<', [CLOSE_SYNTAX]: '</' }[x.type] || x.type) + '!' + x.syntax.name : null), | ||
// elseStack: mapList(elseStack, x => x.id), | ||
@@ -170,98 +213,108 @@ // thenStack: mapList(thenStack, x => x.id), | ||
// tokenCursor, | ||
// syntax | ||
// syntax: syntax.type + (syntax.id ? ' #' + syntax.id : '') | ||
// }, { depth: null }) | ||
// ); | ||
switch (state.type) { | ||
case 'Match': | ||
if (thenStack === null) { | ||
// turn to MISMATCH when some tokens left unmatched | ||
if (token !== null) { | ||
// doesn't mismatch if just one token left and it's an IE hack | ||
if (tokenIndex !== tokens.length - 1 || (token.value !== '\\0' && token.value !== '\\9')) { | ||
state = MISMATCH; | ||
break; | ||
} | ||
} | ||
// prevent infinite loop | ||
if (++iterationCount === ITERATION_LIMIT) { | ||
console.warn('[csstree-match] BREAK after ' + ITERATION_LIMIT + ' iterations'); | ||
exitReason = EXIT_REASON_ITERATION_LIMIT; | ||
break; | ||
} | ||
// break the main loop, return a result - MATCH | ||
exitReason = EXIT_REASON_MATCH; | ||
break; | ||
} | ||
if (syntax === MATCH) { | ||
if (thenStack === null) { | ||
// turn to MISMATCH when some tokens left unmatched | ||
if (token !== null) { | ||
// doesn't mismatch if just one token left and it's an IE hack | ||
if (tokenCursor !== tokens.length - 1 || (token.value !== '\\0' && token.value !== '\\9')) { | ||
syntax = MISMATCH; | ||
continue; | ||
// go to next syntax (`then` branch) | ||
state = thenStack.nextState; | ||
// check match is not empty | ||
if (state === DISALLOW_EMPTY) { | ||
if (thenStack.matchStack.token === matchStack.token) { | ||
state = MISMATCH; | ||
break; | ||
} else { | ||
state = MATCH; | ||
} | ||
} | ||
// break the main loop, return a result - MATCH | ||
exitReason = EXIT_REASON_MATCH; | ||
// close syntax if needed | ||
while (syntaxStack !== null && thenStack.syntaxStack !== syntaxStack) { | ||
closeSyntax(); | ||
} | ||
// pop stack | ||
thenStack = thenStack.prev; | ||
break; | ||
} | ||
// go to next syntax (`then` branch) | ||
syntax = thenStack.nextSyntax; | ||
case 'Mismatch': | ||
if (elseStack === null) { | ||
if (syntaxStash === null || syntaxStash === false) { | ||
// no else branches and no stashed syntax -> break the main loop | ||
// return a result - MISMATCH | ||
exitReason = EXIT_REASON_MISMATCH; | ||
break; | ||
} | ||
// check match is not empty | ||
if (syntax === DISALLOW_EMPTY) { | ||
if (thenStack.matchStack.token === matchStack.token) { | ||
syntax = MISMATCH; | ||
continue; | ||
} else { | ||
syntax = MATCH; | ||
// restore from the stash | ||
elseStack = syntaxStash; | ||
syntaxStash = false; // disable stashing | ||
} | ||
} | ||
// close syntax if needed | ||
while (syntaxStack !== null && thenStack.syntaxStack !== syntaxStack) { | ||
closeSyntax(); | ||
} | ||
// go to next syntax (`else` branch) | ||
state = elseStack.nextState; | ||
// pop stack | ||
thenStack = thenStack.prev; | ||
continue; | ||
} | ||
// restore all the rest stack states | ||
thenStack = elseStack.thenStack; | ||
syntaxStack = elseStack.syntaxStack; | ||
matchStack = elseStack.matchStack; | ||
tokenIndex = elseStack.tokenCursor; | ||
token = elseStack.token; | ||
if (syntax === MISMATCH) { | ||
if (elseStack === null) { | ||
// break the main loop, return a result - MISMATCH | ||
exitReason = EXIT_REASON_MISMATCH; | ||
// pop stack | ||
elseStack = elseStack.prev; | ||
break; | ||
} | ||
// go to next syntax (`else` branch) | ||
syntax = elseStack.nextSyntax; | ||
// restore all the rest stack states | ||
thenStack = elseStack.thenStack; | ||
syntaxStack = elseStack.syntaxStack; | ||
matchStack = elseStack.matchStack; | ||
tokenCursor = elseStack.tokenCursor; | ||
token = elseStack.token; | ||
// pop stack | ||
elseStack = elseStack.prev; | ||
continue; | ||
} | ||
switch (syntax.type) { | ||
case 'MatchGraph': | ||
syntax = syntax.match; | ||
state = state.match; | ||
break; | ||
case 'If': | ||
if (state.checkStash) { | ||
if (syntaxStash !== null) { | ||
if (syntaxStash !== false) { | ||
elseStack = syntaxStash; | ||
syntaxStash = false; // disable stashing | ||
state = MISMATCH; | ||
break; | ||
} | ||
syntaxStash = null; | ||
} | ||
} | ||
// IMPORTANT: else stack push must go first, | ||
// since it stores the state of thenStack before changes | ||
if (syntax.else !== MISMATCH) { | ||
pushElseStack(syntax.else); | ||
if (state.else !== MISMATCH) { | ||
pushElseStack(state.else); | ||
} | ||
if (syntax.then !== MATCH) { | ||
pushThenStack(syntax.then); | ||
if (state.then !== MATCH) { | ||
pushThenStack(state.then); | ||
} | ||
syntax = syntax.match; | ||
state = state.match; | ||
break; | ||
case 'MatchOnce': | ||
syntax = { | ||
state = { | ||
type: 'MatchOnceBuffer', | ||
terms: syntax.terms, | ||
all: syntax.all, | ||
terms: state.terms, | ||
all: state.all, | ||
matchStack: matchStack, | ||
@@ -274,8 +327,8 @@ index: 0, | ||
case 'MatchOnceBuffer': | ||
if (syntax.index === syntax.terms.length) { | ||
if (state.index === state.terms.length) { | ||
// if no matches during a cycle | ||
if (syntax.matchStack === matchStack) { | ||
if (state.matchStack === matchStack) { | ||
// no matches at all or it's required all terms to be matched | ||
if (syntax.mask === 0 || syntax.all) { | ||
syntax = MISMATCH; | ||
if (state.mask === 0 || state.all) { | ||
state = MISMATCH; | ||
break; | ||
@@ -285,23 +338,23 @@ } | ||
// a partial match is ok | ||
syntax = MATCH; | ||
state = MATCH; | ||
break; | ||
} else { | ||
// start trying to match from the start | ||
syntax.index = 0; | ||
syntax.matchStack = matchStack; | ||
state.index = 0; | ||
state.matchStack = matchStack; | ||
} | ||
} | ||
for (; syntax.index < syntax.terms.length; syntax.index++) { | ||
if ((syntax.mask & (1 << syntax.index)) === 0) { | ||
for (; state.index < state.terms.length; state.index++) { | ||
if ((state.mask & (1 << state.index)) === 0) { | ||
// IMPORTANT: else stack push must go first, | ||
// since it stores the state of thenStack before changes | ||
pushElseStack(syntax); | ||
pushElseStack(state); | ||
pushThenStack({ | ||
type: 'AddMatchOnce', | ||
buffer: syntax | ||
nextState: state | ||
}); | ||
// match | ||
syntax = syntax.terms[syntax.index++]; | ||
state = state.terms[state.index++]; | ||
break; | ||
@@ -313,18 +366,18 @@ } | ||
case 'AddMatchOnce': | ||
syntax = syntax.buffer; | ||
state = state.nextState; | ||
var newMask = syntax.mask | (1 << (syntax.index - 1)); | ||
var newMask = state.mask | (1 << (state.index - 1)); | ||
// all terms are matched | ||
if (newMask === (1 << syntax.terms.length) - 1) { | ||
syntax = MATCH; | ||
if (newMask === (1 << state.terms.length) - 1) { | ||
state = MATCH; | ||
continue; | ||
} | ||
syntax = { | ||
state = { | ||
type: 'MatchOnceBuffer', | ||
terms: syntax.terms, | ||
all: syntax.all, | ||
matchStack: syntax.matchStack, | ||
index: syntax.index, | ||
terms: state.terms, | ||
all: state.all, | ||
matchStack: state.matchStack, | ||
index: 0, | ||
mask: newMask | ||
@@ -336,27 +389,31 @@ }; | ||
case 'Enum': | ||
var name = token !== null ? token.value.toLowerCase() : ''; | ||
if (token !== null) { | ||
var name = token.value.toLowerCase(); | ||
// drop \0 and \9 hack from keyword name | ||
if (name.indexOf('\\') !== -1) { | ||
name = name.replace(/\\[09].*$/, ''); | ||
} | ||
// drop \0 and \9 hack from keyword name | ||
if (name.indexOf('\\') !== -1) { | ||
name = name.replace(/\\[09].*$/, ''); | ||
} | ||
if (hasOwnProperty.call(syntax.map, name)) { | ||
syntax = syntax.map[name]; | ||
} else { | ||
syntax = MISMATCH; | ||
if (hasOwnProperty.call(state.map, name)) { | ||
state = state.map[name]; | ||
break; | ||
} | ||
} | ||
state = MISMATCH; | ||
break; | ||
case 'Generic': | ||
var length = Math.floor(syntax.fn(token, getNextToken)); | ||
var opts = syntaxStack !== null ? syntaxStack.opts : null; | ||
var tokenCount = Math.floor(state.fn(token, getNextToken, opts)); | ||
if (!isNaN(length) && length > 0) { | ||
syntax = MATCH; | ||
for (var lastTokenIndex = tokenCursor + length; tokenCursor < lastTokenIndex;) { | ||
if (!isNaN(tokenCount) && tokenCount > 0) { | ||
for (var lastTokenIndex = tokenIndex + tokenCount; tokenIndex < lastTokenIndex;) { | ||
addTokenToMatch(); | ||
} | ||
state = MATCH; | ||
} else { | ||
syntax = MISMATCH; | ||
state = MISMATCH; | ||
} | ||
@@ -368,25 +425,43 @@ | ||
case 'Property': | ||
openSyntax(); | ||
var syntaxDict = state.type === 'Type' ? 'types' : 'properties'; | ||
var dictSyntax = hasOwnProperty.call(syntaxes, syntaxDict) ? syntaxes[syntaxDict][state.name] : null; | ||
var syntaxDict = syntax.type === 'Type' ? 'types' : 'properties'; | ||
if (hasOwnProperty.call(syntaxes, syntaxDict) && syntaxes[syntaxDict][syntax.name]) { | ||
syntax = syntaxes[syntaxDict][syntax.name].match; | ||
} else { | ||
syntax = undefined; | ||
} | ||
if (!syntax) { | ||
if (!dictSyntax || !dictSyntax.match) { | ||
throw new Error( | ||
'Bad syntax reference: ' + | ||
(syntaxStack.syntax.type === 'Type' | ||
? '<' + syntaxStack.syntax.name + '>' | ||
: '<\'' + syntaxStack.syntax.name + '\'>') | ||
(state.type === 'Type' | ||
? '<' + state.name + '>' | ||
: '<\'' + state.name + '\'>') | ||
); | ||
} | ||
// stash a syntax for types with low priority | ||
if (syntaxStash !== false && token !== null && state.type === 'Type') { | ||
var lowPriorityMatching = | ||
// https://drafts.csswg.org/css-values-4/#custom-idents | ||
// When parsing positionally-ambiguous keywords in a property value, a <custom-ident> production | ||
// can only claim the keyword if no other unfulfilled production can claim it. | ||
(state.name === 'custom-ident' && token.type === TYPE.Ident) || | ||
// https://drafts.csswg.org/css-values-4/#lengths | ||
// ... if a `0` could be parsed as either a <number> or a <length> in a property (such as line-height), | ||
// it must parse as a <number> | ||
(state.name === 'length' && token.value === '0'); | ||
if (lowPriorityMatching) { | ||
if (syntaxStash === null) { | ||
syntaxStash = stateSnapshotFromSyntax(state, elseStack); | ||
} | ||
state = MISMATCH; | ||
break; | ||
} | ||
} | ||
openSyntax(); | ||
state = dictSyntax.match; | ||
break; | ||
case 'Keyword': | ||
var name = syntax.name; | ||
var name = state.name; | ||
@@ -401,6 +476,6 @@ if (token !== null) { | ||
if (keywordName.toLowerCase() === name) { | ||
if (areStringsEqualCaseInsensitive(keywordName, name)) { | ||
addTokenToMatch(); | ||
syntax = MATCH; | ||
state = MATCH; | ||
break; | ||
@@ -410,3 +485,3 @@ } | ||
syntax = MISMATCH; | ||
state = MISMATCH; | ||
break; | ||
@@ -416,21 +491,21 @@ | ||
case 'Function': | ||
if (token !== null && token.value.toLowerCase() === syntax.name) { | ||
if (token !== null && areStringsEqualCaseInsensitive(token.value, state.name)) { | ||
addTokenToMatch(); | ||
syntax = MATCH; | ||
state = MATCH; | ||
break; | ||
} | ||
syntax = MISMATCH; | ||
state = MISMATCH; | ||
break; | ||
case 'Token': | ||
if (token !== null && token.value === syntax.value) { | ||
if (token !== null && token.value === state.value) { | ||
addTokenToMatch(); | ||
syntax = MATCH; | ||
state = MATCH; | ||
break; | ||
} | ||
syntax = MISMATCH; | ||
state = MISMATCH; | ||
break; | ||
@@ -441,9 +516,9 @@ | ||
if (isCommaContextStart(matchStack.token)) { | ||
syntax = MISMATCH; | ||
state = MISMATCH; | ||
} else { | ||
addTokenToMatch(); | ||
syntax = isCommaContextEnd(token) ? MISMATCH : MATCH; | ||
state = isCommaContextEnd(token) ? MISMATCH : MATCH; | ||
} | ||
} else { | ||
syntax = isCommaContextStart(matchStack.token) || isCommaContextEnd(token) ? MATCH : MISMATCH; | ||
state = isCommaContextStart(matchStack.token) || isCommaContextEnd(token) ? MATCH : MISMATCH; | ||
} | ||
@@ -453,7 +528,23 @@ | ||
// case 'String': | ||
// TODO: strings with length other than 1 char | ||
case 'String': | ||
var string = ''; | ||
for (var lastTokenIndex = tokenIndex; lastTokenIndex < tokens.length && string.length < state.value.length; lastTokenIndex++) { | ||
string += tokens[lastTokenIndex].value; | ||
} | ||
if (areStringsEqualCaseInsensitive(string, state.value)) { | ||
for (; tokenIndex < lastTokenIndex;) { | ||
addTokenToMatch(); | ||
} | ||
state = MATCH; | ||
} else { | ||
state = MISMATCH; | ||
} | ||
break; | ||
default: | ||
throw new Error('Unknown node type: ' + syntax.type); | ||
throw new Error('Unknown node type: ' + state.type); | ||
} | ||
@@ -464,2 +555,7 @@ } | ||
if (exitReason === null) { | ||
console.warn('[csstree-match] BREAK after ' + ITERATION_LIMIT + ' iterations'); | ||
exitReason = EXIT_REASON_ITERATION_LIMIT; | ||
} | ||
if (exitReason === EXIT_REASON_MATCH) { | ||
@@ -466,0 +562,0 @@ while (syntaxStack !== null) { |
{ | ||
"name": "css-tree", | ||
"version": "1.0.0-alpha.30", | ||
"version": "1.0.0-alpha.31", | ||
"description": "CSSTree is a tool set to work with CSS, including fast detailed parser (string->AST), walker (AST traversal), generator (AST->string) and lexer (validation and matching) based on knowledge of spec and browser implementations", | ||
@@ -68,3 +68,3 @@ "keywords": [ | ||
"dependencies": { | ||
"mdn-data": "~2.0.3", | ||
"mdn-data": "2.0.4", | ||
"source-map": "^0.5.3" | ||
@@ -71,0 +71,0 @@ }, |
Sorry, the diff of this file is too big to display
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
616172
9735
+ Addedmdn-data@2.0.4(transitive)
- Removedmdn-data@2.0.33(transitive)
Updatedmdn-data@2.0.4