diff --git a/.gitignore b/.gitignore index aa9d7c5b..e73fbcda 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,17 @@ /errors.txt /syntax.txt /ROADMAP.draft.md +/.idea +/.DS_Store +/ROADMAP.md +/docs +/package-lock.json +test/*.ts +test/*.js +test/*.css +test/*.html +test/*.json +test/*.md # Logs logs diff --git a/.npmignore b/.npmignore index fce4f71f..6e5ce7fe 100644 --- a/.npmignore +++ b/.npmignore @@ -18,4 +18,5 @@ /.gitattributes /Writerside /validator -/sw.js \ No newline at end of file +/sw.js +/jsr.json \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 8d48bc75..1d9e6462 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,26 @@ # Changelog +#v0.7.0 + +- [x] fix merging rules +- [ ] experimental CSS prefix removal + - [x] declaration name + - [ ] declaration value + - [ ] exclude -webkit-* gradients + - [x] css selector validation + - [x] pseudo element + - [x] partial pseudo class validation. does not validate parameters + - [x] attribute selector + - [x] combinator + - [x] simple selector + - [x] nested selector + - [x] strict vs permissive validation: allow unknown items such as pseudo classes + - [x] allow unknown pseudo classes + - [x] allow unknown attribute selectors +- [x] strip universal selector when possible + # v0.6.0 + - [x] light-dark() color - [x] system color @@ -58,15 +78,16 @@ CSS color level 4 & 5 - [x] gap ### Other + - [x] renamed RenderOptions.colorConvert to RenderOptions.convertColor - [x] support none keyword in color - [x] css relative color syntax for rgb(), hsl() and hwb() colors https://www.w3.org/TR/css-color-5/#relative-colors - - [x] rgb - - [x] hex - - [x] hsl - - [x] hwb - - [x] calc() - - [x] calc() and inline var() + - [x] rgb + - [x] hex + - [x] hsl + - [x] hwb + - [x] calc() + - [x] calc() and inline var() ## v0.2.0 @@ -93,7 +114,7 @@ CSS color level 4 & 5 ## v0.1.0 - [x] sourcemap generation -- [x] reduce calc(): +- [x] reduce calc(): - [x] inline css variables - [x] configure duplicate declarations removal - [x] configure shorthand properties computation @@ -104,7 +125,7 @@ CSS color level 4 & 5 - [x] merge identical rules - [x] merge adjacent rules -- [x] minify colors +- [x] minify colors - [x] minify numbers and Dimensions tokens - [x] compute shorthand: see the list below - [x] remove redundant declarations @@ -113,12 +134,14 @@ CSS color level 4 & 5 - [x] conditionally unwrap :is() - [x] automatic css nesting - [x] automatically wrap selectors using :is() -- [x] multi-level shorthand properties (border - [border-width, border-color, border-style, etc.]) https://developer.mozilla.org/en-US/docs/Web/CSS/Shorthand_properties +- [x] multi-level shorthand properties ( + border - [border-width, border-color, border-style, etc.]) https://developer.mozilla.org/en-US/docs/Web/CSS/Shorthand_properties - [x] avoid reparsing (declarations, selectors, at-rule) - [x] node and browser versions - [x] decode and replace utf-8 escape sequence ### Computed shorthands + - [x] background - [x] border - [x] border-bottom diff --git a/README.md b/README.md index 0b50573b..497f3258 100644 --- a/README.md +++ b/README.md @@ -25,6 +25,7 @@ $ npm install @tbela99/css-parser - inline css variables - remove duplicate properties - flatten @import rules +- partial css validation: only css selector is validated ## Playground @@ -145,9 +146,13 @@ Include ParseOptions and RenderOptions - inlineCssVariables: boolean, optional. replace some css variables with their actual value. they must be declared once in the :root {} or html {} rule. - removeEmpty: boolean, optional. remove empty rule lists from the ast. +> Minify Options + +- validation: boolean, optional. enable strict css validation using (mdn data)[https://github.com/mdn/data]. only the selector is validated at this time. + > Sourcemap Options -- src: string, optional. original css file location to be used with sourcemap. +- src: string, optional. original css file location to be used with sourcemap, also used to resolve url(). - sourcemap: boolean, optional. preserve node location data. > Misc Options @@ -155,7 +160,7 @@ Include ParseOptions and RenderOptions - resolveUrls: boolean, optional. resolve css 'url()' according to the parameters 'src' and 'cwd' - resolveImport: boolean, optional. replace @import rule by the content of its referenced stylesheet. - removeCharset: boolean, optional. remove @charset. -- cwd: string, optional. the current working directory. when specified url() are resolved using this value +- cwd: string, optional. destination directory used to resolve url(). - visitor: VisitorNodeMap, optional. node visitor used to transform the ast. - signal: AbortSignal, optional. abort parsing. @@ -179,7 +184,7 @@ Include ParseOptions and RenderOptions - indent: string, optional. css indention string. uses space character by default. - newLine: string, optional. new line character. - output: string, optional. file where to store css. url() are resolved according to the specified value. no file is created though. -- cwd: string, optional. value used as current working directory. when output is not provided, urls are resolved according to this value. +- cwd: string, optional. destination directory used to resolve url(). ## Parsing @@ -316,6 +321,104 @@ table.colortable { } ``` +### CSS Validation + +CSS + +```css + +#404 { +--animate-duration: 1s; +} + +.s, #404 { +--animate-duration: 1s; +} + +.s [type="text" { +--animate-duration: 1s; +} + +.s [type="text"]] { +--animate-duration: 1s; +} + +.s [type="text"] { +--animate-duration: 1s; +} + +.s [type="text" i] { +--animate-duration: 1s; +} + +.s [type="text" s] { +--animate-duration: 1s; +} + +.s [type="text" b] { +--animate-duration: 1s; +} + +.s [type="text" b], { +--animate-duration: 1s; +} + +.s [type="text" b]+ { +--animate-duration: 1s; +} + +.s [type="text" b]+ b { +--animate-duration: 1s; +} + +.s [type="text" i]+ b { +--animate-duration: 1s; +} + + +.s [type="text"())] { +--animate-duration: 1s; +} +.s() { +--animate-duration: 1s; +} +.s:focus { +--animate-duration: 1s; +} +``` + +with validation enabled + +```javascript +import {parse, render} from '@tbela99/css-parser'; +const options = {minify: true, validate: true}; +const {code} = await parse(css, options).then(result => render(result.ast, {minify: false})); +// +console.debug(code); +``` + +```css +.s:is([type=text],[type=text i],[type=text s],[type=text i]+b,:focus) { + --animate-duration: 1s +} +``` + +with validation disabled + +```javascript +import {parse, render} from '@tbela99/css-parser'; +const options = {minify: true, validate: false}; +const {code} = await parse(css, options).then(result => render(result.ast, {minify: false})); +// +console.debug(code); +``` + +```css +.s:is([type=text],[type=text i],[type=text s],[type=text b],[type=text b]+b,[type=text i]+b,:focus) { + --animate-duration: 1s +} +``` + ### Nested CSS Expansion CSS diff --git a/dist/config.json.js b/dist/config.json.js index 2b34ecdb..ce64e4c7 100644 --- a/dist/config.json.js +++ b/dist/config.json.js @@ -450,7 +450,9 @@ var map = { transition: { shorthand: "transition", multiple: true, - separator: ",", + separator: { + typ: "Comma" + }, pattern: "transition-property transition-duration transition-timing-function transition-delay transition-behavior", keywords: [ "none", diff --git a/dist/index-umd-web.js b/dist/index-umd-web.js index 71bc4e28..f920e185 100644 --- a/dist/index-umd-web.js +++ b/dist/index-umd-web.js @@ -4,6 +4,11 @@ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.CSSParser = {})); })(this, (function (exports) { 'use strict'; + var ValidationLevel; + (function (ValidationLevel) { + ValidationLevel[ValidationLevel["Valid"] = 0] = "Valid"; + ValidationLevel[ValidationLevel["Drop"] = 1] = "Drop"; + })(ValidationLevel || (ValidationLevel = {})); exports.EnumToken = void 0; (function (EnumToken) { EnumToken[EnumToken["CommentTokenType"] = 0] = "CommentTokenType"; @@ -82,6 +87,16 @@ EnumToken[EnumToken["IdenListTokenType"] = 70] = "IdenListTokenType"; EnumToken[EnumToken["GridTemplateFuncTokenType"] = 71] = "GridTemplateFuncTokenType"; EnumToken[EnumToken["KeyFrameRuleNodeType"] = 72] = "KeyFrameRuleNodeType"; + EnumToken[EnumToken["ClassSelectorTokenType"] = 73] = "ClassSelectorTokenType"; + EnumToken[EnumToken["UniversalSelectorTokenType"] = 74] = "UniversalSelectorTokenType"; + EnumToken[EnumToken["ChildCombinatorTokenType"] = 75] = "ChildCombinatorTokenType"; + EnumToken[EnumToken["DescendantCombinatorTokenType"] = 76] = "DescendantCombinatorTokenType"; + EnumToken[EnumToken["NextSiblingCombinatorTokenType"] = 77] = "NextSiblingCombinatorTokenType"; + EnumToken[EnumToken["SubsequentSiblingCombinatorTokenType"] = 78] = "SubsequentSiblingCombinatorTokenType"; + EnumToken[EnumToken["NestingSelectorTokenType"] = 79] = "NestingSelectorTokenType"; + EnumToken[EnumToken["InvalidRuleTokenType"] = 80] = "InvalidRuleTokenType"; + EnumToken[EnumToken["InvalidClassSelectorTokenType"] = 81] = "InvalidClassSelectorTokenType"; + EnumToken[EnumToken["InvalidAttrTokenType"] = 82] = "InvalidAttrTokenType"; /* aliases */ EnumToken[EnumToken["Time"] = 25] = "Time"; EnumToken[EnumToken["Iden"] = 7] = "Iden"; @@ -3044,7 +3059,7 @@ options.output = options.resolve(options.output, options.cwd).absolute; } if (sourcemap != null) { - result.map = sourcemap.toJSON(); + result.map = sourcemap; } return result; } @@ -3152,6 +3167,10 @@ return `@${data.nam}${data.val === '' ? '' : options.indent || ' '}${data.val}${options.indent}{${options.newLine}` + (children === '' ? '' : indentSub + children + options.newLine) + indent + `}`; } return data.sel + `${options.indent}{${options.newLine}` + (children === '' ? '' : indentSub + children + options.newLine) + indent + `}`; + case exports.EnumToken.InvalidRuleTokenType: + return ''; + default: + throw new Error(`render: unexpected token ${JSON.stringify(data, null, 1)}`); } return ''; } @@ -3225,6 +3244,7 @@ return ' + '; case exports.EnumToken.Sub: return ' - '; + case exports.EnumToken.UniversalSelectorTokenType: case exports.EnumToken.Mul: return '*'; case exports.EnumToken.Div: @@ -3357,7 +3377,7 @@ renderToken(token.r, options, cache, reducer, errors) + (token.attr ? ' ' + token.attr : ''); case exports.EnumToken.NameSpaceAttributeTokenType: - return (token.l == null ? '' : renderToken(token.l, options, cache, reducer, errors) + '|') + + return (token.l == null ? '' : renderToken(token.l, options, cache, reducer, errors)) + '|' + renderToken(token.r, options, cache, reducer, errors); case exports.EnumToken.BlockStartTokenType: return '{'; @@ -3365,6 +3385,8 @@ return '}'; case exports.EnumToken.StartParensTokenType: return '('; + case exports.EnumToken.DelimTokenType: + return '='; case exports.EnumToken.IncludeMatchTokenType: return '~='; case exports.EnumToken.DashMatchTokenType: @@ -3379,7 +3401,12 @@ return '<'; case exports.EnumToken.LteTokenType: return '<='; + case exports.EnumToken.SubsequentSiblingCombinatorTokenType: + return '~'; + case exports.EnumToken.NextSiblingCombinatorTokenType: + return '+'; case exports.EnumToken.GtTokenType: + case exports.EnumToken.ChildCombinatorTokenType: return '>'; case exports.EnumToken.GteTokenType: return '>='; @@ -3391,6 +3418,7 @@ return '['; case exports.EnumToken.AttrEndTokenType: return ']'; + case exports.EnumToken.DescendantCombinatorTokenType: case exports.EnumToken.WhitespaceTokenType: return ' '; case exports.EnumToken.ColonTokenType: @@ -3522,12 +3550,20 @@ } case exports.EnumToken.HashTokenType: case exports.EnumToken.IdenTokenType: - case exports.EnumToken.DelimTokenType: case exports.EnumToken.AtRuleTokenType: case exports.EnumToken.StringTokenType: case exports.EnumToken.LiteralTokenType: case exports.EnumToken.DashedIdenTokenType: + case exports.EnumToken.ClassSelectorTokenType: return /* options.minify && 'Pseudo-class' == token.typ && '::' == token.val.slice(0, 2) ? token.val.slice(1) : */ token.val; + case exports.EnumToken.NestingSelectorTokenType: + return '&'; + case exports.EnumToken.InvalidAttrTokenType: + return '[' + token.chi.reduce((acc, curr) => acc + renderToken(curr, options, cache), ''); + case exports.EnumToken.InvalidClassSelectorTokenType: + return token.val; + default: + throw new Error(`render: unexpected token ${JSON.stringify(token, null, 1)}`); } errors?.push({ action: 'ignore', message: `render: unexpected token ${JSON.stringify(token, null, 1)}` }); return ''; @@ -3769,6 +3805,12 @@ while (i < j) { i += codepoint < 0x80 ? 1 : String.fromCodePoint(codepoint).length; codepoint = name.charCodeAt(i); + if (codepoint == REVERSE_SOLIDUS) { + i += codepoint < 0x80 ? 1 : String.fromCodePoint(codepoint).length; + codepoint = name.charCodeAt(i); + i += codepoint < 0x80 ? 1 : String.fromCodePoint(codepoint).length; + continue; + } if (!isIdentCodepoint(codepoint)) { return false; } @@ -4427,7 +4469,9 @@ transition: { shorthand: "transition", multiple: true, - separator: ",", + separator: { + typ: "Comma" + }, pattern: "transition-property transition-duration transition-timing-function transition-delay transition-behavior", keywords: [ "none", @@ -5443,12 +5487,13 @@ shorthand: "background" } }; - var config$1 = { + var config$3 = { properties: properties, map: map }; - const getConfig = () => config$1; + Object.freeze(config$3); + const getConfig$1 = () => config$3; // https://www.w3.org/TR/css-values-4/#math-function const funcList = ['clamp', 'calc']; @@ -5584,7 +5629,7 @@ continue; } if (escapeSequence.trimEnd().length > 0) { - const codepoint = Number(`0x${escapeSequence.trimEnd()}`); + const codepoint = parseInt(escapeSequence, 16); if (codepoint == 0 || // leading surrogate (0xD800 <= codepoint && codepoint <= 0xDBFF) || @@ -5764,9 +5809,22 @@ case '~': case '|': case '$': - if (value == '|' && peek(parseInfo) == '|') { - next(parseInfo); - yield pushToken('', parseInfo, exports.EnumToken.ColumnCombinatorTokenType); + if (buffer.length > 0) { + yield pushToken(buffer, parseInfo); + buffer = ''; + } + if (value == '|') { + if (peek(parseInfo) == '|') { + next(parseInfo); + yield pushToken('', parseInfo, exports.EnumToken.ColumnCombinatorTokenType); + } + else if (peek(parseInfo) == '=') { + buffer += next(parseInfo); + yield pushToken(buffer, parseInfo); + } + else { + yield pushToken('|', parseInfo); + } buffer = ''; break; } @@ -6033,30 +6091,53368 @@ yield pushToken(buffer, parseInfo); buffer = ''; } - yield pushToken(value, parseInfo); - break; - case '!': - if (buffer.length > 0) { - yield pushToken(buffer, parseInfo); - buffer = ''; + yield pushToken(value, parseInfo); + break; + case '!': + if (buffer.length > 0) { + yield pushToken(buffer, parseInfo); + buffer = ''; + } + if (peek(parseInfo, 9) == 'important') { + yield pushToken('', parseInfo, exports.EnumToken.ImportantTokenType); + next(parseInfo, 9); + buffer = ''; + break; + } + buffer = '!'; + break; + default: + buffer += value; + break; + } + } + if (buffer.length > 0) { + yield pushToken(buffer, parseInfo); + } + // yield pushToken('', EnumToken.EOFTokenType); + } + + var declarations = { + "-ms-accelerator": { + syntax: "false | true", + ast: [ + { + typ: 27, + l: [ + { + typ: 1, + val: "false" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 20 + }, + { + typ: 1, + val: "true" + } + ] + } + ] + }, + "-ms-block-progression": { + syntax: "tb | rl | bt | lr", + ast: [ + { + typ: 27, + l: [ + { + typ: 1, + val: "tb" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "rl" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "bt" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 20 + }, + { + typ: 1, + val: "lr" + } + ] + } + ] + } + ] + } + ] + }, + "-ms-content-zoom-chaining": { + syntax: "none | chained", + ast: [ + { + typ: 27, + l: [ + { + typ: 1, + val: "none" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 20 + }, + { + typ: 1, + val: "chained" + } + ] + } + ] + }, + "-ms-content-zooming": { + syntax: "none | zoom", + ast: [ + { + typ: 27, + l: [ + { + typ: 1, + val: "none" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 20 + }, + { + typ: 1, + val: "zoom" + } + ] + } + ] + }, + "-ms-content-zoom-limit": { + syntax: "<'-ms-content-zoom-limit-min'> <'-ms-content-zoom-limit-max'>", + ast: [ + { + typ: 3, + val: "-ms-content-zoom-limit-min" + }, + { + typ: 20 + }, + { + typ: 3, + val: "-ms-content-zoom-limit-max" + } + ] + }, + "-ms-content-zoom-limit-max": { + syntax: "", + ast: [ + { + typ: 2, + val: "percentage" + } + ] + }, + "-ms-content-zoom-limit-min": { + syntax: "", + ast: [ + { + typ: 2, + val: "percentage" + } + ] + }, + "-ms-content-zoom-snap": { + syntax: "<'-ms-content-zoom-snap-type'> || <'-ms-content-zoom-snap-points'>", + ast: [ + { + typ: 28, + l: [ + { + typ: 3, + val: "-ms-content-zoom-snap-type" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 20 + }, + { + typ: 3, + val: "-ms-content-zoom-snap-points" + } + ] + } + ] + }, + "-ms-content-zoom-snap-points": { + syntax: "snapInterval( , ) | snapList( # )", + ast: [ + { + typ: 27, + l: [ + { + typ: 18, + val: "snapInterval", + chi: [ + { + typ: 2, + val: "percentage" + }, + { + typ: 10 + }, + { + typ: 20 + }, + { + typ: 2, + val: "percentage" + } + ] + }, + { + typ: 20 + } + ], + r: [ + { + typ: 20 + }, + { + typ: 18, + val: "snapList", + chi: [ + { + typ: 2, + val: "percentage", + isList: true + } + ] + } + ] + } + ] + }, + "-ms-content-zoom-snap-type": { + syntax: "none | proximity | mandatory", + ast: [ + { + typ: 27, + l: [ + { + typ: 1, + val: "none" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "proximity" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 20 + }, + { + typ: 1, + val: "mandatory" + } + ] + } + ] + } + ] + }, + "-ms-filter": { + syntax: "", + ast: [ + { + typ: 2, + val: "string" + } + ] + }, + "-ms-flow-from": { + syntax: "[ none | ]#", + ast: [ + { + typ: 22, + chi: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "none" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 20 + }, + { + typ: 2, + val: "custom-ident" + }, + { + typ: 20 + } + ] + } + ], + isList: true + } + ] + }, + "-ms-flow-into": { + syntax: "[ none | ]#", + ast: [ + { + typ: 22, + chi: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "none" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 20 + }, + { + typ: 2, + val: "custom-ident" + }, + { + typ: 20 + } + ] + } + ], + isList: true + } + ] + }, + "-ms-grid-columns": { + syntax: "none | | ", + ast: [ + { + typ: 27, + l: [ + { + typ: 1, + val: "none" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 2, + val: "track-list" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 20 + }, + { + typ: 2, + val: "auto-track-list" + } + ] + } + ] + } + ] + }, + "-ms-grid-rows": { + syntax: "none | | ", + ast: [ + { + typ: 27, + l: [ + { + typ: 1, + val: "none" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 2, + val: "track-list" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 20 + }, + { + typ: 2, + val: "auto-track-list" + } + ] + } + ] + } + ] + }, + "-ms-high-contrast-adjust": { + syntax: "auto | none", + ast: [ + { + typ: 27, + l: [ + { + typ: 1, + val: "auto" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 20 + }, + { + typ: 1, + val: "none" + } + ] + } + ] + }, + "-ms-hyphenate-limit-chars": { + syntax: "auto | {1,3}", + ast: [ + { + typ: 27, + l: [ + { + typ: 1, + val: "auto" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 20 + }, + { + typ: 2, + val: "integer", + occurence: { + min: 1, + max: 3 + } + } + ] + } + ] + }, + "-ms-hyphenate-limit-lines": { + syntax: "no-limit | ", + ast: [ + { + typ: 27, + l: [ + { + typ: 1, + val: "no-limit" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 20 + }, + { + typ: 2, + val: "integer" + } + ] + } + ] + }, + "-ms-hyphenate-limit-zone": { + syntax: " | ", + ast: [ + { + typ: 27, + l: [ + { + typ: 2, + val: "percentage" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 20 + }, + { + typ: 2, + val: "length" + } + ] + } + ] + }, + "-ms-ime-align": { + syntax: "auto | after", + ast: [ + { + typ: 27, + l: [ + { + typ: 1, + val: "auto" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 20 + }, + { + typ: 1, + val: "after" + } + ] + } + ] + }, + "-ms-overflow-style": { + syntax: "auto | none | scrollbar | -ms-autohiding-scrollbar", + ast: [ + { + typ: 27, + l: [ + { + typ: 1, + val: "auto" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "none" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "scrollbar" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 20 + }, + { + typ: 1, + val: "-ms-autohiding-scrollbar" + } + ] + } + ] + } + ] + } + ] + }, + "-ms-scrollbar-3dlight-color": { + syntax: "", + ast: [ + { + typ: 2, + val: "color" + } + ] + }, + "-ms-scrollbar-arrow-color": { + syntax: "", + ast: [ + { + typ: 2, + val: "color" + } + ] + }, + "-ms-scrollbar-base-color": { + syntax: "", + ast: [ + { + typ: 2, + val: "color" + } + ] + }, + "-ms-scrollbar-darkshadow-color": { + syntax: "", + ast: [ + { + typ: 2, + val: "color" + } + ] + }, + "-ms-scrollbar-face-color": { + syntax: "", + ast: [ + { + typ: 2, + val: "color" + } + ] + }, + "-ms-scrollbar-highlight-color": { + syntax: "", + ast: [ + { + typ: 2, + val: "color" + } + ] + }, + "-ms-scrollbar-shadow-color": { + syntax: "", + ast: [ + { + typ: 2, + val: "color" + } + ] + }, + "-ms-scrollbar-track-color": { + syntax: "", + ast: [ + { + typ: 2, + val: "color" + } + ] + }, + "-ms-scroll-chaining": { + syntax: "chained | none", + ast: [ + { + typ: 27, + l: [ + { + typ: 1, + val: "chained" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 20 + }, + { + typ: 1, + val: "none" + } + ] + } + ] + }, + "-ms-scroll-limit": { + syntax: "<'-ms-scroll-limit-x-min'> <'-ms-scroll-limit-y-min'> <'-ms-scroll-limit-x-max'> <'-ms-scroll-limit-y-max'>", + ast: [ + { + typ: 3, + val: "-ms-scroll-limit-x-min" + }, + { + typ: 20 + }, + { + typ: 3, + val: "-ms-scroll-limit-y-min" + }, + { + typ: 20 + }, + { + typ: 3, + val: "-ms-scroll-limit-x-max" + }, + { + typ: 20 + }, + { + typ: 3, + val: "-ms-scroll-limit-y-max" + } + ] + }, + "-ms-scroll-limit-x-max": { + syntax: "auto | ", + ast: [ + { + typ: 27, + l: [ + { + typ: 1, + val: "auto" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 20 + }, + { + typ: 2, + val: "length" + } + ] + } + ] + }, + "-ms-scroll-limit-x-min": { + syntax: "", + ast: [ + { + typ: 2, + val: "length" + } + ] + }, + "-ms-scroll-limit-y-max": { + syntax: "auto | ", + ast: [ + { + typ: 27, + l: [ + { + typ: 1, + val: "auto" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 20 + }, + { + typ: 2, + val: "length" + } + ] + } + ] + }, + "-ms-scroll-limit-y-min": { + syntax: "", + ast: [ + { + typ: 2, + val: "length" + } + ] + }, + "-ms-scroll-rails": { + syntax: "none | railed", + ast: [ + { + typ: 27, + l: [ + { + typ: 1, + val: "none" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 20 + }, + { + typ: 1, + val: "railed" + } + ] + } + ] + }, + "-ms-scroll-snap-points-x": { + syntax: "snapInterval( , ) | snapList( # )", + ast: [ + { + typ: 27, + l: [ + { + typ: 18, + val: "snapInterval", + chi: [ + { + typ: 2, + val: "length-percentage" + }, + { + typ: 10 + }, + { + typ: 20 + }, + { + typ: 2, + val: "length-percentage" + } + ] + }, + { + typ: 20 + } + ], + r: [ + { + typ: 20 + }, + { + typ: 18, + val: "snapList", + chi: [ + { + typ: 2, + val: "length-percentage", + isList: true + } + ] + } + ] + } + ] + }, + "-ms-scroll-snap-points-y": { + syntax: "snapInterval( , ) | snapList( # )", + ast: [ + { + typ: 27, + l: [ + { + typ: 18, + val: "snapInterval", + chi: [ + { + typ: 2, + val: "length-percentage" + }, + { + typ: 10 + }, + { + typ: 20 + }, + { + typ: 2, + val: "length-percentage" + } + ] + }, + { + typ: 20 + } + ], + r: [ + { + typ: 20 + }, + { + typ: 18, + val: "snapList", + chi: [ + { + typ: 2, + val: "length-percentage", + isList: true + } + ] + } + ] + } + ] + }, + "-ms-scroll-snap-type": { + syntax: "none | proximity | mandatory", + ast: [ + { + typ: 27, + l: [ + { + typ: 1, + val: "none" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "proximity" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 20 + }, + { + typ: 1, + val: "mandatory" + } + ] + } + ] + } + ] + }, + "-ms-scroll-snap-x": { + syntax: "<'-ms-scroll-snap-type'> <'-ms-scroll-snap-points-x'>", + ast: [ + { + typ: 3, + val: "-ms-scroll-snap-type" + }, + { + typ: 20 + }, + { + typ: 3, + val: "-ms-scroll-snap-points-x" + } + ] + }, + "-ms-scroll-snap-y": { + syntax: "<'-ms-scroll-snap-type'> <'-ms-scroll-snap-points-y'>", + ast: [ + { + typ: 3, + val: "-ms-scroll-snap-type" + }, + { + typ: 20 + }, + { + typ: 3, + val: "-ms-scroll-snap-points-y" + } + ] + }, + "-ms-scroll-translation": { + syntax: "none | vertical-to-horizontal", + ast: [ + { + typ: 27, + l: [ + { + typ: 1, + val: "none" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 20 + }, + { + typ: 1, + val: "vertical-to-horizontal" + } + ] + } + ] + }, + "-ms-text-autospace": { + syntax: "none | ideograph-alpha | ideograph-numeric | ideograph-parenthesis | ideograph-space", + ast: [ + { + typ: 27, + l: [ + { + typ: 1, + val: "none" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "ideograph-alpha" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "ideograph-numeric" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "ideograph-parenthesis" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 20 + }, + { + typ: 1, + val: "ideograph-space" + } + ] + } + ] + } + ] + } + ] + } + ] + }, + "-ms-touch-select": { + syntax: "grippers | none", + ast: [ + { + typ: 27, + l: [ + { + typ: 1, + val: "grippers" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 20 + }, + { + typ: 1, + val: "none" + } + ] + } + ] + }, + "-ms-user-select": { + syntax: "none | element | text", + ast: [ + { + typ: 27, + l: [ + { + typ: 1, + val: "none" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "element" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 20 + }, + { + typ: 1, + val: "text" + } + ] + } + ] + } + ] + }, + "-ms-wrap-flow": { + syntax: "auto | both | start | end | maximum | clear", + ast: [ + { + typ: 27, + l: [ + { + typ: 1, + val: "auto" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "both" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "start" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "end" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "maximum" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 20 + }, + { + typ: 1, + val: "clear" + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + }, + "-ms-wrap-margin": { + syntax: "", + ast: [ + { + typ: 2, + val: "length" + } + ] + }, + "-ms-wrap-through": { + syntax: "wrap | none", + ast: [ + { + typ: 27, + l: [ + { + typ: 1, + val: "wrap" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 20 + }, + { + typ: 1, + val: "none" + } + ] + } + ] + }, + "-moz-appearance": { + syntax: "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", + ast: [ + { + typ: 27, + l: [ + { + typ: 1, + val: "none" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "button" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "button-arrow-down" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "button-arrow-next" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "button-arrow-previous" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "button-arrow-up" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "button-bevel" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "button-focus" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "caret" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "checkbox" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "checkbox-container" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "checkbox-label" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "checkmenuitem" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "dualbutton" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "groupbox" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "listbox" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "listitem" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "menuarrow" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "menubar" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "menucheckbox" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "menuimage" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "menuitem" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "menuitemtext" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "menulist" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "menulist-button" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "menulist-text" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "menulist-textfield" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "menupopup" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "menuradio" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "menuseparator" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "meterbar" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "meterchunk" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "progressbar" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "progressbar-vertical" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "progresschunk" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "progresschunk-vertical" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "radio" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "radio-container" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "radio-label" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "radiomenuitem" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "range" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "range-thumb" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "resizer" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "resizerpanel" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "scale-horizontal" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "scalethumbend" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "scalethumb-horizontal" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "scalethumbstart" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "scalethumbtick" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "scalethumb-vertical" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "scale-vertical" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "scrollbarbutton-down" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "scrollbarbutton-left" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "scrollbarbutton-right" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "scrollbarbutton-up" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "scrollbarthumb-horizontal" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "scrollbarthumb-vertical" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "scrollbartrack-horizontal" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "scrollbartrack-vertical" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "searchfield" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "separator" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "sheet" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "spinner" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "spinner-downbutton" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "spinner-textfield" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "spinner-upbutton" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "splitter" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "statusbar" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "statusbarpanel" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "tab" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "tabpanel" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "tabpanels" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "tab-scroll-arrow-back" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "tab-scroll-arrow-forward" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "textfield" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "textfield-multiline" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "toolbar" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "toolbarbutton" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "toolbarbutton-dropdown" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "toolbargripper" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "toolbox" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "tooltip" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "treeheader" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "treeheadercell" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "treeheadersortarrow" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "treeitem" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "treeline" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "treetwisty" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "treetwistyopen" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "treeview" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "-moz-mac-unified-toolbar" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "-moz-win-borderless-glass" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "-moz-win-browsertabbar-toolbox" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "-moz-win-communicationstext" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "-moz-win-communications-toolbox" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "-moz-win-exclude-glass" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "-moz-win-glass" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "-moz-win-mediatext" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "-moz-win-media-toolbox" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "-moz-window-button-box" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "-moz-window-button-box-maximized" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "-moz-window-button-close" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "-moz-window-button-maximize" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "-moz-window-button-minimize" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "-moz-window-button-restore" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "-moz-window-frame-bottom" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "-moz-window-frame-left" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "-moz-window-frame-right" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "-moz-window-titlebar" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 20 + }, + { + typ: 1, + val: "-moz-window-titlebar-maximized" + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + }, + "-moz-binding": { + syntax: " | none", + ast: [ + { + typ: 27, + l: [ + { + typ: 2, + val: "url" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 20 + }, + { + typ: 1, + val: "none" + } + ] + } + ] + }, + "-moz-border-bottom-colors": { + syntax: "+ | none", + ast: [ + { + typ: 27, + l: [ + { + typ: 2, + val: "color", + atLeastOnce: true + }, + { + typ: 20 + } + ], + r: [ + { + typ: 20 + }, + { + typ: 1, + val: "none" + } + ] + } + ] + }, + "-moz-border-left-colors": { + syntax: "+ | none", + ast: [ + { + typ: 27, + l: [ + { + typ: 2, + val: "color", + atLeastOnce: true + }, + { + typ: 20 + } + ], + r: [ + { + typ: 20 + }, + { + typ: 1, + val: "none" + } + ] + } + ] + }, + "-moz-border-right-colors": { + syntax: "+ | none", + ast: [ + { + typ: 27, + l: [ + { + typ: 2, + val: "color", + atLeastOnce: true + }, + { + typ: 20 + } + ], + r: [ + { + typ: 20 + }, + { + typ: 1, + val: "none" + } + ] + } + ] + }, + "-moz-border-top-colors": { + syntax: "+ | none", + ast: [ + { + typ: 27, + l: [ + { + typ: 2, + val: "color", + atLeastOnce: true + }, + { + typ: 20 + } + ], + r: [ + { + typ: 20 + }, + { + typ: 1, + val: "none" + } + ] + } + ] + }, + "-moz-context-properties": { + syntax: "none | [ fill | fill-opacity | stroke | stroke-opacity ]#", + ast: [ + { + typ: 27, + l: [ + { + typ: 1, + val: "none" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 20 + }, + { + typ: 22, + chi: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "fill" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "fill-opacity" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "stroke" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 20 + }, + { + typ: 1, + val: "stroke-opacity" + }, + { + typ: 20 + } + ] + } + ] + } + ] + } + ], + isList: true + } + ] + } + ] + }, + "-moz-float-edge": { + syntax: "border-box | content-box | margin-box | padding-box", + ast: [ + { + typ: 27, + l: [ + { + typ: 1, + val: "border-box" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "content-box" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "margin-box" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 20 + }, + { + typ: 1, + val: "padding-box" + } + ] + } + ] + } + ] + } + ] + }, + "-moz-force-broken-image-icon": { + syntax: "0 | 1", + ast: [ + { + typ: 27, + l: [ + { + typ: 19, + val: 0 + }, + { + typ: 20 + } + ], + r: [ + { + typ: 20 + }, + { + typ: 19, + val: 1 + } + ] + } + ] + }, + "-moz-image-region": { + syntax: " | auto", + ast: [ + { + typ: 27, + l: [ + { + typ: 2, + val: "shape" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 20 + }, + { + typ: 1, + val: "auto" + } + ] + } + ] + }, + "-moz-orient": { + syntax: "inline | block | horizontal | vertical", + ast: [ + { + typ: 27, + l: [ + { + typ: 1, + val: "inline" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "block" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "horizontal" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 20 + }, + { + typ: 1, + val: "vertical" + } + ] + } + ] + } + ] + } + ] + }, + "-moz-outline-radius": { + syntax: "{1,4} [ / {1,4} ]?", + ast: [ + { + typ: 2, + val: "outline-radius", + occurence: { + min: 1, + max: 4 + } + }, + { + typ: 20 + }, + { + typ: 22, + chi: [ + { + typ: 24 + }, + { + typ: 2, + val: "outline-radius", + occurence: { + min: 1, + max: 4 + } + } + ], + isOptional: true + } + ] + }, + "-moz-outline-radius-bottomleft": { + syntax: "", + ast: [ + { + typ: 2, + val: "outline-radius" + } + ] + }, + "-moz-outline-radius-bottomright": { + syntax: "", + ast: [ + { + typ: 2, + val: "outline-radius" + } + ] + }, + "-moz-outline-radius-topleft": { + syntax: "", + ast: [ + { + typ: 2, + val: "outline-radius" + } + ] + }, + "-moz-outline-radius-topright": { + syntax: "", + ast: [ + { + typ: 2, + val: "outline-radius" + } + ] + }, + "-moz-stack-sizing": { + syntax: "ignore | stretch-to-fit", + ast: [ + { + typ: 27, + l: [ + { + typ: 1, + val: "ignore" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 20 + }, + { + typ: 1, + val: "stretch-to-fit" + } + ] + } + ] + }, + "-moz-text-blink": { + syntax: "none | blink", + ast: [ + { + typ: 27, + l: [ + { + typ: 1, + val: "none" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 20 + }, + { + typ: 1, + val: "blink" + } + ] + } + ] + }, + "-moz-user-focus": { + syntax: "ignore | normal | select-after | select-before | select-menu | select-same | select-all | none", + ast: [ + { + typ: 27, + l: [ + { + typ: 1, + val: "ignore" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "normal" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "select-after" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "select-before" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "select-menu" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "select-same" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "select-all" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 20 + }, + { + typ: 1, + val: "none" + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + }, + "-moz-user-input": { + syntax: "auto | none | enabled | disabled", + ast: [ + { + typ: 27, + l: [ + { + typ: 1, + val: "auto" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "none" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "enabled" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 20 + }, + { + typ: 1, + val: "disabled" + } + ] + } + ] + } + ] + } + ] + }, + "-moz-user-modify": { + syntax: "read-only | read-write | write-only", + ast: [ + { + typ: 27, + l: [ + { + typ: 1, + val: "read-only" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "read-write" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 20 + }, + { + typ: 1, + val: "write-only" + } + ] + } + ] + } + ] + }, + "-moz-window-dragging": { + syntax: "drag | no-drag", + ast: [ + { + typ: 27, + l: [ + { + typ: 1, + val: "drag" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 20 + }, + { + typ: 1, + val: "no-drag" + } + ] + } + ] + }, + "-moz-window-shadow": { + syntax: "default | menu | tooltip | sheet | none", + ast: [ + { + typ: 27, + l: [ + { + typ: 1, + val: "default" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "menu" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "tooltip" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "sheet" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 20 + }, + { + typ: 1, + val: "none" + } + ] + } + ] + } + ] + } + ] + } + ] + }, + "-webkit-appearance": { + syntax: "none | button | button-bevel | caret | checkbox | default-button | inner-spin-button | listbox | listitem | media-controls-background | media-controls-fullscreen-background | media-current-time-display | media-enter-fullscreen-button | media-exit-fullscreen-button | media-fullscreen-button | media-mute-button | media-overlay-play-button | media-play-button | media-seek-back-button | media-seek-forward-button | media-slider | media-sliderthumb | media-time-remaining-display | media-toggle-closed-captions-button | media-volume-slider | media-volume-slider-container | media-volume-sliderthumb | menulist | menulist-button | menulist-text | menulist-textfield | meter | progress-bar | progress-bar-value | push-button | radio | searchfield | searchfield-cancel-button | searchfield-decoration | searchfield-results-button | searchfield-results-decoration | slider-horizontal | slider-vertical | sliderthumb-horizontal | sliderthumb-vertical | square-button | textarea | textfield | -apple-pay-button", + ast: [ + { + typ: 27, + l: [ + { + typ: 1, + val: "none" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "button" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "button-bevel" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "caret" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "checkbox" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "default-button" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "inner-spin-button" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "listbox" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "listitem" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "media-controls-background" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "media-controls-fullscreen-background" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "media-current-time-display" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "media-enter-fullscreen-button" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "media-exit-fullscreen-button" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "media-fullscreen-button" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "media-mute-button" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "media-overlay-play-button" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "media-play-button" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "media-seek-back-button" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "media-seek-forward-button" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "media-slider" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "media-sliderthumb" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "media-time-remaining-display" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "media-toggle-closed-captions-button" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "media-volume-slider" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "media-volume-slider-container" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "media-volume-sliderthumb" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "menulist" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "menulist-button" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "menulist-text" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "menulist-textfield" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "meter" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "progress-bar" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "progress-bar-value" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "push-button" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "radio" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "searchfield" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "searchfield-cancel-button" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "searchfield-decoration" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "searchfield-results-button" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "searchfield-results-decoration" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "slider-horizontal" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "slider-vertical" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "sliderthumb-horizontal" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "sliderthumb-vertical" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "square-button" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "textarea" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "textfield" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 20 + }, + { + typ: 1, + val: "-apple-pay-button" + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + }, + "-webkit-border-before": { + syntax: "<'border-width'> || <'border-style'> || ", + ast: [ + { + typ: 28, + l: [ + { + typ: 3, + val: "border-width" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 28, + l: [ + { + typ: 20 + }, + { + typ: 3, + val: "border-style" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 20 + }, + { + typ: 2, + val: "color" + } + ] + } + ] + } + ] + }, + "-webkit-border-before-color": { + syntax: "", + ast: [ + { + typ: 2, + val: "color" + } + ] + }, + "-webkit-border-before-style": { + syntax: "<'border-style'>", + ast: [ + { + typ: 3, + val: "border-style" + } + ] + }, + "-webkit-border-before-width": { + syntax: "<'border-width'>", + ast: [ + { + typ: 3, + val: "border-width" + } + ] + }, + "-webkit-box-reflect": { + syntax: "[ above | below | right | left ]? ? ?", + ast: [ + { + typ: 22, + chi: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "above" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "below" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "right" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 20 + }, + { + typ: 1, + val: "left" + }, + { + typ: 20 + } + ] + } + ] + } + ] + } + ], + isOptional: true + }, + { + typ: 20 + }, + { + typ: 2, + val: "length", + isOptional: true + }, + { + typ: 20 + }, + { + typ: 2, + val: "image", + isOptional: true + } + ] + }, + "-webkit-line-clamp": { + syntax: "none | ", + ast: [ + { + typ: 27, + l: [ + { + typ: 1, + val: "none" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 20 + }, + { + typ: 2, + val: "integer" + } + ] + } + ] + }, + "-webkit-mask": { + syntax: "[ || [ / ]? || || [ | border | padding | content | text ] || [ | border | padding | content ] ]#", + ast: [ + { + typ: 22, + chi: [ + { + typ: 28, + l: [ + { + typ: 20 + }, + { + typ: 2, + val: "mask-reference" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 28, + l: [ + { + typ: 20 + }, + { + typ: 2, + val: "position" + }, + { + typ: 20 + }, + { + typ: 22, + chi: [ + { + typ: 24 + }, + { + typ: 2, + val: "bg-size" + } + ], + isOptional: true + }, + { + typ: 20 + } + ], + r: [ + { + typ: 28, + l: [ + { + typ: 20 + }, + { + typ: 2, + val: "repeat-style" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 28, + l: [ + { + typ: 20 + }, + { + typ: 22, + chi: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 2, + val: "box" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "border" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "padding" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "content" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 20 + }, + { + typ: 1, + val: "text" + }, + { + typ: 20 + } + ] + } + ] + } + ] + } + ] + } + ] + }, + { + typ: 20 + } + ], + r: [ + { + typ: 20 + }, + { + typ: 22, + chi: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 2, + val: "box" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "border" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "padding" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 20 + }, + { + typ: 1, + val: "content" + }, + { + typ: 20 + } + ] + } + ] + } + ] + } + ] + }, + { + typ: 20 + } + ] + } + ] + } + ] + } + ] + } + ], + isList: true + } + ] + }, + "-webkit-mask-attachment": { + syntax: "#", + ast: [ + { + typ: 2, + val: "attachment", + isList: true + } + ] + }, + "-webkit-mask-clip": { + syntax: "[ | border | padding | content | text ]#", + ast: [ + { + typ: 22, + chi: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 2, + val: "box" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "border" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "padding" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "content" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 20 + }, + { + typ: 1, + val: "text" + }, + { + typ: 20 + } + ] + } + ] + } + ] + } + ] + } + ], + isList: true + } + ] + }, + "-webkit-mask-composite": { + syntax: "#", + ast: [ + { + typ: 2, + val: "composite-style", + isList: true + } + ] + }, + "-webkit-mask-image": { + syntax: "#", + ast: [ + { + typ: 2, + val: "mask-reference", + isList: true + } + ] + }, + "-webkit-mask-origin": { + syntax: "[ | border | padding | content ]#", + ast: [ + { + typ: 22, + chi: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 2, + val: "box" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "border" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "padding" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 20 + }, + { + typ: 1, + val: "content" + }, + { + typ: 20 + } + ] + } + ] + } + ] + } + ], + isList: true + } + ] + }, + "-webkit-mask-position": { + syntax: "#", + ast: [ + { + typ: 2, + val: "position", + isList: true + } + ] + }, + "-webkit-mask-position-x": { + syntax: "[ | left | center | right ]#", + ast: [ + { + typ: 22, + chi: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 2, + val: "length-percentage" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "left" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "center" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 20 + }, + { + typ: 1, + val: "right" + }, + { + typ: 20 + } + ] + } + ] + } + ] + } + ], + isList: true + } + ] + }, + "-webkit-mask-position-y": { + syntax: "[ | top | center | bottom ]#", + ast: [ + { + typ: 22, + chi: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 2, + val: "length-percentage" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "top" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "center" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 20 + }, + { + typ: 1, + val: "bottom" + }, + { + typ: 20 + } + ] + } + ] + } + ] + } + ], + isList: true + } + ] + }, + "-webkit-mask-repeat": { + syntax: "#", + ast: [ + { + typ: 2, + val: "repeat-style", + isList: true + } + ] + }, + "-webkit-mask-repeat-x": { + syntax: "repeat | no-repeat | space | round", + ast: [ + { + typ: 27, + l: [ + { + typ: 1, + val: "repeat" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "no-repeat" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "space" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 20 + }, + { + typ: 1, + val: "round" + } + ] + } + ] + } + ] + } + ] + }, + "-webkit-mask-repeat-y": { + syntax: "repeat | no-repeat | space | round", + ast: [ + { + typ: 27, + l: [ + { + typ: 1, + val: "repeat" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "no-repeat" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "space" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 20 + }, + { + typ: 1, + val: "round" + } + ] + } + ] + } + ] + } + ] + }, + "-webkit-mask-size": { + syntax: "#", + ast: [ + { + typ: 2, + val: "bg-size", + isList: true + } + ] + }, + "-webkit-overflow-scrolling": { + syntax: "auto | touch", + ast: [ + { + typ: 27, + l: [ + { + typ: 1, + val: "auto" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 20 + }, + { + typ: 1, + val: "touch" + } + ] + } + ] + }, + "-webkit-tap-highlight-color": { + syntax: "", + ast: [ + { + typ: 2, + val: "color" + } + ] + }, + "-webkit-text-fill-color": { + syntax: "", + ast: [ + { + typ: 2, + val: "color" + } + ] + }, + "-webkit-text-stroke": { + syntax: " || ", + ast: [ + { + typ: 28, + l: [ + { + typ: 2, + val: "length" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 20 + }, + { + typ: 2, + val: "color" + } + ] + } + ] + }, + "-webkit-text-stroke-color": { + syntax: "", + ast: [ + { + typ: 2, + val: "color" + } + ] + }, + "-webkit-text-stroke-width": { + syntax: "", + ast: [ + { + typ: 2, + val: "length" + } + ] + }, + "-webkit-touch-callout": { + syntax: "default | none", + ast: [ + { + typ: 27, + l: [ + { + typ: 1, + val: "default" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 20 + }, + { + typ: 1, + val: "none" + } + ] + } + ] + }, + "-webkit-user-modify": { + syntax: "read-only | read-write | read-write-plaintext-only", + ast: [ + { + typ: 27, + l: [ + { + typ: 1, + val: "read-only" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "read-write" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 20 + }, + { + typ: 1, + val: "read-write-plaintext-only" + } + ] + } + ] + } + ] + }, + "accent-color": { + syntax: "auto | ", + ast: [ + { + typ: 27, + l: [ + { + typ: 1, + val: "auto" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 20 + }, + { + typ: 2, + val: "color" + } + ] + } + ] + }, + "align-content": { + syntax: "normal | | | ? ", + ast: [ + { + typ: 27, + l: [ + { + typ: 1, + val: "normal" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 2, + val: "baseline-position" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 2, + val: "content-distribution" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 20 + }, + { + typ: 2, + val: "overflow-position", + isOptional: true + }, + { + typ: 20 + }, + { + typ: 2, + val: "content-position" + } + ] + } + ] + } + ] + } + ] + }, + "align-items": { + syntax: "normal | stretch | | [ ? ]", + ast: [ + { + typ: 27, + l: [ + { + typ: 1, + val: "normal" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "stretch" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 2, + val: "baseline-position" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 20 + }, + { + typ: 22, + chi: [ + { + typ: 2, + val: "overflow-position", + isOptional: true + }, + { + typ: 20 + }, + { + typ: 2, + val: "self-position" + } + ] + } + ] + } + ] + } + ] + } + ] + }, + "align-self": { + syntax: "auto | normal | stretch | | ? ", + ast: [ + { + typ: 27, + l: [ + { + typ: 1, + val: "auto" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "normal" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "stretch" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 2, + val: "baseline-position" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 20 + }, + { + typ: 2, + val: "overflow-position", + isOptional: true + }, + { + typ: 20 + }, + { + typ: 2, + val: "self-position" + } + ] + } + ] + } + ] + } + ] + } + ] + }, + "align-tracks": { + syntax: "[ normal | | | ? ]#", + ast: [ + { + typ: 22, + chi: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "normal" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 2, + val: "baseline-position" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 2, + val: "content-distribution" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 20 + }, + { + typ: 2, + val: "overflow-position", + isOptional: true + }, + { + typ: 20 + }, + { + typ: 2, + val: "content-position" + }, + { + typ: 20 + } + ] + } + ] + } + ] + } + ], + isList: true + } + ] + }, + all: { + syntax: "initial | inherit | unset | revert | revert-layer", + ast: [ + { + typ: 27, + l: [ + { + typ: 1, + val: "initial" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "inherit" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "unset" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "revert" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 20 + }, + { + typ: 1, + val: "revert-layer" + } + ] + } + ] + } + ] + } + ] + } + ] + }, + "anchor-name": { + syntax: "none | #", + ast: [ + { + typ: 27, + l: [ + { + typ: 1, + val: "none" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 20 + }, + { + typ: 2, + val: "dashed-ident", + isList: true + } + ] + } + ] + }, + "anchor-scope": { + syntax: "none | all | #", + ast: [ + { + typ: 27, + l: [ + { + typ: 1, + val: "none" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 27, + l: [ + { + typ: 20 + }, + { + typ: 1, + val: "all" + }, + { + typ: 20 + } + ], + r: [ + { + typ: 20 + }, + { + typ: 2, + val: "dashed-ident", + isList: true + } + ] + } + ] + } + ] + }, + animation: { + syntax: "#", + ast: [ + { + typ: 2, + val: "single-animation", + isList: true + } + ] + }, + "animation-composition": { + syntax: "#", + ast: [ + { + typ: 2, + val: "single-animation-composition", + isList: true + } + ] + }, + "animation-delay": { + syntax: "