├── .gitignore ├── .editorconfig ├── .travis.yml ├── package.json ├── readme.md ├── license.md ├── spec └── postcss-spec.coffee └── grammars ├── sugarss.cson └── postcss.cson /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | npm-debug.log 3 | node_modules 4 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | end_of_line = lf 6 | indent_style = space 7 | insert_final_newline = true 8 | trim_trailing_whitespace = true 9 | 10 | [{package.json,*.cson}] 11 | indent_size = 2 12 | indent_style = space 13 | 14 | [*.md] 15 | trim_trailing_whitespace = false 16 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: objective-c 2 | 3 | notifications: 4 | email: 5 | on_success: never 6 | on_failure: change 7 | 8 | script: 'curl -s https://raw.githubusercontent.com/atom/ci/master/build-package.sh | sh' 9 | 10 | git: 11 | depth: 10 12 | 13 | branches: 14 | only: 15 | - master 16 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "language-postcss", 3 | "version": "1.3.1", 4 | "description": "Syntax highlighting for PostCSS", 5 | "repository": "https://github.com/azat-io/atom-language-postcss", 6 | "license": "MIT", 7 | "author": { 8 | "name": "Azat S.", 9 | "email": "to@azat.io", 10 | "url": "http://azat.io/" 11 | }, 12 | "engines": { 13 | "atom": "*", 14 | "node": "*" 15 | }, 16 | "keywords": [ 17 | "postcss", 18 | "sugarss", 19 | "language", 20 | "grammar", 21 | "editor" 22 | ] 23 | } 24 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | # Atom PostCSS language 2 | 3 | [![apm version](https://img.shields.io/apm/v/language-postcss.svg)](https://atom.io/packages/language-postcss) 4 | [![apm downloads](https://img.shields.io/apm/dm/language-postcss.svg?maxAge=2592000)](https://atom.io/packages/language-postcss) 5 | [![gitHub issues](https://img.shields.io/github/issues/azat-io/atom-language-postcss.svg)](https://github.com/azat-io/atom-language-postcss) 6 | [![github pull requests](https://img.shields.io/github/issues-pr-raw/azat-io/atom-language-postcss.svg)](https://github.com/azat-io/atom-language-postcss) 7 | [![license](https://img.shields.io/apm/l/language-postcss.svg)](https://atom.io/packages/language-postcss) 8 | 9 | Adds syntax highlighting to [PostCSS](https://github.com/postcss/postcss) `*.pcss` `*.css` files and [SugarSS](https://github.com/postcss/sugarss) `*.sss` files in Atom. 10 | 11 | Contributions are greatly appreciated. Please fork this repository and open a pull request to make grammar tweaks, etc. 12 | 13 | ![sugarss](https://cloud.githubusercontent.com/assets/5698350/13654962/fb2de0de-e66c-11e5-9133-1860f04aa480.png) 14 | -------------------------------------------------------------------------------- /license.md: -------------------------------------------------------------------------------- 1 | Copyright (c) 2015-2016 Azat S. 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining 4 | a copy of this software and associated documentation files (the 5 | "Software"), to deal in the Software without restriction, including 6 | without limitation the rights to use, copy, modify, merge, publish, 7 | distribute, sublicense, and/or sell copies of the Software, and to 8 | permit persons to whom the Software is furnished to do so, subject to 9 | the following conditions: 10 | 11 | The above copyright notice and this permission notice shall be 12 | included in all copies or substantial portions of the Software. 13 | 14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 15 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 16 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 17 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 18 | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 19 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 20 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 | -------------------------------------------------------------------------------- /spec/postcss-spec.coffee: -------------------------------------------------------------------------------- 1 | describe 'PostCSS grammar', -> 2 | grammar = null 3 | 4 | beforeEach -> 5 | waitsForPromise -> 6 | atom.packages.activatePackage('language-postcss') 7 | 8 | runs -> 9 | grammar = atom.grammars.grammarForScopeName('source.css.postcss') 10 | 11 | it 'parses the grammar', -> 12 | expect(grammar).toBeTruthy() 13 | expect(grammar.scopeName).toBe 'source.css.postcss' 14 | 15 | describe 'numbers', -> 16 | it 'tokenizes them correctly', -> 17 | {tokens} = grammar.tokenizeLine '.something { color: 0 1 }' 18 | 19 | expect(tokens[8]).toEqual value: '0', scopes: ['source.css.postcss', 'meta.property-list.postcss', 'meta.property-value.postcss', 'constant.numeric.postcss'] 20 | expect(tokens[10]).toEqual value: '1', scopes: ['source.css.postcss', 'meta.property-list.postcss', 'meta.property-value.postcss', 'constant.numeric.postcss'] 21 | 22 | {tokens} = grammar.tokenizeLine '$q: (color1:$dark-orange);' 23 | 24 | expect(tokens[3]).toEqual value: '(color1:', scopes: ['source.css.postcss', 'meta.set.variable.postcss'] 25 | 26 | describe '@at-root', -> 27 | it 'tokenizes it correctly', -> 28 | {tokens} = grammar.tokenizeLine '@at-root (without: media) .btn { color: red; }' 29 | 30 | expect(tokens[0]).toEqual value: '@', scopes: ['source.css.postcss', 'meta.at-rule.at-root.postcss', 'keyword.control.at-rule.at-root.postcss', 'punctuation.definition.keyword.postcss'] 31 | expect(tokens[1]).toEqual value: 'at-root', scopes: ['source.css.postcss', 'meta.at-rule.at-root.postcss', 'keyword.control.at-rule.at-root.postcss'] 32 | 33 | describe '@page', -> 34 | it 'tokenizes it correctly', -> 35 | tokens = grammar.tokenizeLines """ 36 | @page { 37 | text-align: center; 38 | } 39 | """ 40 | 41 | expect(tokens[0][0]).toEqual value: '@', scopes: ['source.css.postcss', 'meta.at-rule.page.postcss', 'keyword.control.at-rule.page.postcss', 'punctuation.definition.keyword.postcss'] 42 | expect(tokens[0][1]).toEqual value: 'page', scopes: ['source.css.postcss', 'meta.at-rule.page.postcss', 'keyword.control.at-rule.page.postcss'] 43 | expect(tokens[1][0]).toEqual value: ' ', scopes: ['source.css.postcss', 'meta.property-list.postcss'] 44 | expect(tokens[1][1]).toEqual value: 'text-align', scopes: ['source.css.postcss', 'meta.property-list.postcss', 'meta.property-name.postcss', 'support.type.property-name.postcss'] 45 | expect(tokens[1][2]).toEqual value: ':', scopes: ['source.css.postcss', 'meta.property-list.postcss', 'meta.property-value.postcss', 'punctuation.separator.key-value.postcss'] 46 | expect(tokens[1][3]).toEqual value: ' ', scopes: ['source.css.postcss', 'meta.property-list.postcss', 'meta.property-value.postcss'] 47 | expect(tokens[1][4]).toEqual value: 'center', scopes: ['source.css.postcss', 'meta.property-list.postcss', 'meta.property-value.postcss', 'support.constant.property-value.postcss'] 48 | 49 | tokens = grammar.tokenizeLines """ 50 | @page :left { 51 | text-align: center; 52 | } 53 | """ 54 | 55 | expect(tokens[0][0]).toEqual value: '@', scopes: ['source.css.postcss', 'meta.at-rule.page.postcss', 'keyword.control.at-rule.page.postcss', 'punctuation.definition.keyword.postcss'] 56 | expect(tokens[0][1]).toEqual value: 'page', scopes: ['source.css.postcss', 'meta.at-rule.page.postcss', 'keyword.control.at-rule.page.postcss'] 57 | expect(tokens[0][2]).toEqual value: ' ', scopes: ['source.css.postcss', 'meta.at-rule.page.postcss'] 58 | expect(tokens[0][3]).toEqual value: ':left', scopes: ['source.css.postcss', 'meta.at-rule.page.postcss', 'entity.name.function.postcss'] 59 | expect(tokens[1][0]).toEqual value: ' ', scopes: ['source.css.postcss', 'meta.property-list.postcss'] 60 | expect(tokens[1][1]).toEqual value: 'text-align', scopes: ['source.css.postcss', 'meta.property-list.postcss', 'meta.property-name.postcss', 'support.type.property-name.postcss'] 61 | expect(tokens[1][2]).toEqual value: ':', scopes: ['source.css.postcss', 'meta.property-list.postcss', 'meta.property-value.postcss', 'punctuation.separator.key-value.postcss'] 62 | expect(tokens[1][3]).toEqual value: ' ', scopes: ['source.css.postcss', 'meta.property-list.postcss', 'meta.property-value.postcss'] 63 | expect(tokens[1][4]).toEqual value: 'center', scopes: ['source.css.postcss', 'meta.property-list.postcss', 'meta.property-value.postcss', 'support.constant.property-value.postcss'] 64 | 65 | tokens = grammar.tokenizeLines """ 66 | @page:left { 67 | text-align: center; 68 | } 69 | """ 70 | 71 | expect(tokens[0][0]).toEqual value: '@', scopes: ['source.css.postcss', 'meta.at-rule.page.postcss', 'keyword.control.at-rule.page.postcss', 'punctuation.definition.keyword.postcss'] 72 | expect(tokens[0][1]).toEqual value: 'page', scopes: ['source.css.postcss', 'meta.at-rule.page.postcss', 'keyword.control.at-rule.page.postcss'] 73 | expect(tokens[0][2]).toEqual value: ':left', scopes: ['source.css.postcss', 'meta.at-rule.page.postcss', 'entity.name.function.postcss'] 74 | expect(tokens[1][0]).toEqual value: ' ', scopes: ['source.css.postcss', 'meta.property-list.postcss'] 75 | expect(tokens[1][1]).toEqual value: 'text-align', scopes: ['source.css.postcss', 'meta.property-list.postcss', 'meta.property-name.postcss', 'support.type.property-name.postcss'] 76 | expect(tokens[1][2]).toEqual value: ':', scopes: ['source.css.postcss', 'meta.property-list.postcss', 'meta.property-value.postcss', 'punctuation.separator.key-value.postcss'] 77 | expect(tokens[1][3]).toEqual value: ' ', scopes: ['source.css.postcss', 'meta.property-list.postcss', 'meta.property-value.postcss'] 78 | expect(tokens[1][4]).toEqual value: 'center', scopes: ['source.css.postcss', 'meta.property-list.postcss', 'meta.property-value.postcss', 'support.constant.property-value.postcss'] 79 | 80 | describe 'property-list', -> 81 | it 'tokenizes the property-name and property-value', -> 82 | {tokens} = grammar.tokenizeLine 'very-custom { color: inherit; }' 83 | 84 | expect(tokens[4]).toEqual value: 'color', scopes: ['source.css.postcss', 'meta.property-list.postcss', 'meta.property-name.postcss', 'support.type.property-name.postcss'] 85 | expect(tokens[7]).toEqual value: 'inherit', scopes: ['source.css.postcss', 'meta.property-list.postcss', 'meta.property-value.postcss', 'support.constant.property-value.postcss'] 86 | expect(tokens[8]).toEqual value: ';', scopes: ['source.css.postcss', 'meta.property-list.postcss', 'meta.property-value.postcss', 'punctuation.terminator.rule.postcss'] 87 | expect(tokens[10]).toEqual value: '}', scopes: ['source.css.postcss', 'meta.property-list.postcss', 'punctuation.section.property-list.end.postcss'] 88 | 89 | it 'tokenizes an incomplete inline property-list', -> 90 | {tokens} = grammar.tokenizeLine 'very-custom { color: inherit}' 91 | 92 | expect(tokens[4]).toEqual value: 'color', scopes: ['source.css.postcss', 'meta.property-list.postcss', 'meta.property-name.postcss', 'support.type.property-name.postcss'] 93 | expect(tokens[7]).toEqual value: 'inherit', scopes: ['source.css.postcss', 'meta.property-list.postcss', 'meta.property-value.postcss', 'support.constant.property-value.postcss'] 94 | expect(tokens[8]).toEqual value: '}', scopes: ['source.css.postcss', 'meta.property-list.postcss', 'meta.property-value.postcss', 'punctuation.section.property-list.end.postcss'] 95 | 96 | it 'tokenizes multiple lines of incomplete property-list', -> 97 | tokens = grammar.tokenizeLines """ 98 | very-custom { color: inherit } 99 | another-one { display: none; } 100 | """ 101 | 102 | expect(tokens[0][0]).toEqual value: 'very-custom', scopes: ['source.css.postcss', 'entity.name.tag.custom.postcss'] 103 | expect(tokens[0][4]).toEqual value: 'color', scopes: ['source.css.postcss', 'meta.property-list.postcss', 'meta.property-name.postcss', 'support.type.property-name.postcss'] 104 | expect(tokens[0][7]).toEqual value: 'inherit', scopes: ['source.css.postcss', 'meta.property-list.postcss', 'meta.property-value.postcss', 'support.constant.property-value.postcss'] 105 | expect(tokens[0][9]).toEqual value: '}', scopes: ['source.css.postcss', 'meta.property-list.postcss', 'meta.property-value.postcss', 'punctuation.section.property-list.end.postcss'] 106 | expect(tokens[1][0]).toEqual value: 'another-one', scopes: ['source.css.postcss', 'entity.name.tag.custom.postcss'] 107 | expect(tokens[1][10]).toEqual value: '}', scopes: ['source.css.postcss', 'meta.property-list.postcss', 'punctuation.section.property-list.end.postcss'] 108 | 109 | describe 'property names with a prefix that matches an element name', -> 110 | it 'does not confuse them with properties', -> 111 | tokens = grammar.tokenizeLines """ 112 | text { 113 | text-align: center; 114 | } 115 | """ 116 | 117 | expect(tokens[0][0]).toEqual value: 'text', scopes: ['source.css.postcss', 'entity.name.tag.postcss'] 118 | expect(tokens[1][0]).toEqual value: ' ', scopes: ['source.css.postcss', 'meta.property-list.postcss'] 119 | expect(tokens[1][1]).toEqual value: 'text-align', scopes: ['source.css.postcss', 'meta.property-list.postcss', 'meta.property-name.postcss', 'support.type.property-name.postcss'] 120 | expect(tokens[1][2]).toEqual value: ':', scopes: ['source.css.postcss', 'meta.property-list.postcss', 'meta.property-value.postcss', 'punctuation.separator.key-value.postcss'] 121 | expect(tokens[1][3]).toEqual value: ' ', scopes: ['source.css.postcss', 'meta.property-list.postcss', 'meta.property-value.postcss'] 122 | expect(tokens[1][4]).toEqual value: 'center', scopes: ['source.css.postcss', 'meta.property-list.postcss', 'meta.property-value.postcss', 'support.constant.property-value.postcss'] 123 | 124 | tokens = grammar.tokenizeLines """ 125 | table { 126 | table-layout: fixed; 127 | } 128 | """ 129 | 130 | expect(tokens[0][0]).toEqual value: 'table', scopes: ['source.css.postcss', 'entity.name.tag.postcss'] 131 | expect(tokens[1][0]).toEqual value: ' ', scopes: ['source.css.postcss', 'meta.property-list.postcss'] 132 | expect(tokens[1][1]).toEqual value: 'table-layout', scopes: ['source.css.postcss', 'meta.property-list.postcss', 'meta.property-name.postcss', 'support.type.property-name.postcss'] 133 | expect(tokens[1][2]).toEqual value: ':', scopes: ['source.css.postcss', 'meta.property-list.postcss', 'meta.property-value.postcss', 'punctuation.separator.key-value.postcss'] 134 | expect(tokens[1][3]).toEqual value: ' ', scopes: ['source.css.postcss', 'meta.property-list.postcss', 'meta.property-value.postcss'] 135 | expect(tokens[1][4]).toEqual value: 'fixed', scopes: ['source.css.postcss', 'meta.property-list.postcss', 'meta.property-value.postcss', 'support.constant.property-value.postcss'] 136 | 137 | describe 'vendor properties', -> 138 | it 'tokenizes the browser prefix', -> 139 | {tokens} = grammar.tokenizeLine 'body { -webkit-box-shadow: none; }' 140 | 141 | expect(tokens[0]).toEqual value: 'body', scopes: ['source.css.postcss', 'entity.name.tag.postcss'] 142 | expect(tokens[4]).toEqual value: '-webkit-box-shadow', scopes: ['source.css.postcss', 'meta.property-list.postcss', 'meta.property-name.postcss', 'support.type.property-name.postcss'] 143 | 144 | describe 'custom elements', -> 145 | it 'tokenizes them as tags', -> 146 | {tokens} = grammar.tokenizeLine 'very-custom { color: red; }' 147 | 148 | expect(tokens[0]).toEqual value: 'very-custom', scopes: ['source.css.postcss', 'entity.name.tag.custom.postcss'] 149 | 150 | {tokens} = grammar.tokenizeLine 'very-very-custom { color: red; }' 151 | 152 | expect(tokens[0]).toEqual value: 'very-very-custom', scopes: ['source.css.postcss', 'entity.name.tag.custom.postcss'] 153 | 154 | it 'tokenizes them with pseudo selectors', -> 155 | {tokens} = grammar.tokenizeLine 'very-custom:hover { color: red; }' 156 | 157 | expect(tokens[0]).toEqual value: 'very-custom', scopes: ['source.css.postcss', 'entity.name.tag.custom.postcss'] 158 | expect(tokens[1]).toEqual value: ':', scopes: ['source.css.postcss', 'entity.other.attribute-name.pseudo-class.css', 'punctuation.definition.entity.css'] 159 | expect(tokens[2]).toEqual value: 'hover', scopes: ['source.css.postcss', 'entity.other.attribute-name.pseudo-class.css'] 160 | 161 | it 'tokenizes them with class selectors', -> 162 | {tokens} = grammar.tokenizeLine 'very-custom.class { color: red; }' 163 | 164 | expect(tokens[0]).toEqual value: 'very-custom', scopes: ['source.css.postcss', 'entity.name.tag.custom.postcss'] 165 | expect(tokens[1]).toEqual value: '.', scopes: ['source.css.postcss', 'entity.other.attribute-name.class.css', 'punctuation.definition.entity.css'] 166 | expect(tokens[2]).toEqual value: 'class', scopes: ['source.css.postcss', 'entity.other.attribute-name.class.css'] 167 | 168 | it 'does not confuse them with properties', -> 169 | tokens = grammar.tokenizeLines """ 170 | body { 171 | border-width: 2; 172 | font-size : 2; 173 | background-image : none; 174 | } 175 | """ 176 | 177 | expect(tokens[1][0]).toEqual value: ' ', scopes: ['source.css.postcss', 'meta.property-list.postcss'] 178 | expect(tokens[1][1]).toEqual value: 'border-width', scopes: ['source.css.postcss', 'meta.property-list.postcss', 'meta.property-name.postcss', 'support.type.property-name.postcss'] 179 | expect(tokens[1][2]).toEqual value: ':', scopes: ['source.css.postcss', 'meta.property-list.postcss', 'meta.property-value.postcss', 'punctuation.separator.key-value.postcss'] 180 | expect(tokens[1][3]).toEqual value: ' ', scopes: ['source.css.postcss', 'meta.property-list.postcss', 'meta.property-value.postcss'] 181 | expect(tokens[1][4]).toEqual value: '2', scopes: ['source.css.postcss', 'meta.property-list.postcss', 'meta.property-value.postcss', 'constant.numeric.postcss'] 182 | expect(tokens[2][0]).toEqual value: ' ', scopes: ['source.css.postcss', 'meta.property-list.postcss'] 183 | expect(tokens[2][1]).toEqual value: 'font-size', scopes: ['source.css.postcss', 'meta.property-list.postcss', 'meta.property-name.postcss', 'support.type.property-name.postcss'] 184 | expect(tokens[2][2]).toEqual value: ' ', scopes: ['source.css.postcss', 'meta.property-list.postcss'] 185 | expect(tokens[2][3]).toEqual value: ':', scopes: ['source.css.postcss', 'meta.property-list.postcss', 'meta.property-value.postcss', 'punctuation.separator.key-value.postcss'] 186 | expect(tokens[2][4]).toEqual value: ' ', scopes: ['source.css.postcss', 'meta.property-list.postcss', 'meta.property-value.postcss'] 187 | expect(tokens[2][5]).toEqual value: '2', scopes: ['source.css.postcss', 'meta.property-list.postcss', 'meta.property-value.postcss', 'constant.numeric.postcss'] 188 | expect(tokens[3][0]).toEqual value: ' ', scopes: ['source.css.postcss', 'meta.property-list.postcss'] 189 | expect(tokens[3][1]).toEqual value: 'background-image', scopes: ['source.css.postcss', 'meta.property-list.postcss', 'meta.property-name.postcss', 'support.type.property-name.postcss'] 190 | expect(tokens[3][2]).toEqual value: ' ', scopes: ['source.css.postcss', 'meta.property-list.postcss'] 191 | expect(tokens[3][3]).toEqual value: ':', scopes: ['source.css.postcss', 'meta.property-list.postcss', 'meta.property-value.postcss', 'punctuation.separator.key-value.postcss'] 192 | expect(tokens[3][4]).toEqual value: ' ', scopes: ['source.css.postcss', 'meta.property-list.postcss', 'meta.property-value.postcss'] 193 | expect(tokens[3][5]).toEqual value: 'none', scopes: ['source.css.postcss', 'meta.property-list.postcss', 'meta.property-value.postcss', 'support.constant.property-value.postcss'] 194 | 195 | describe "pseudo selectors", -> 196 | it "parses the value of the argument correctly", -> 197 | {tokens} = grammar.tokenizeLine 'div:nth-child(3n+0) { color: red; }' 198 | 199 | expect(tokens[0]).toEqual value: 'div', scopes: ['source.css.postcss', 'entity.name.tag.postcss'] 200 | expect(tokens[1]).toEqual value: ':', scopes: ['source.css.postcss', 'entity.other.attribute-name.pseudo-class.css', 'punctuation.definition.entity.css'] 201 | expect(tokens[2]).toEqual value: 'nth-child(3n+0)', scopes: ['source.css.postcss', 'entity.other.attribute-name.pseudo-class.css'] 202 | 203 | {tokens} = grammar.tokenizeLine 'div:nth-child(2n-1) { color: red; }' 204 | 205 | expect(tokens[0]).toEqual value: 'div', scopes: ['source.css.postcss', 'entity.name.tag.postcss'] 206 | expect(tokens[1]).toEqual value: ':', scopes: ['source.css.postcss', 'entity.other.attribute-name.pseudo-class.css', 'punctuation.definition.entity.css'] 207 | expect(tokens[2]).toEqual value: 'nth-child(2n-1)', scopes: ['source.css.postcss', 'entity.other.attribute-name.pseudo-class.css'] 208 | 209 | describe "keyframes", -> 210 | it "parses the from and to properties", -> 211 | tokens = grammar.tokenizeLines """ 212 | @keyframes anim { 213 | from { opacity: 0; } 214 | to { opacity: 1; } 215 | } 216 | """ 217 | 218 | expect(tokens[0][0]).toEqual value: '@', scopes: ['source.css.postcss', 'meta.at-rule.keyframes.postcss', 'keyword.control.at-rule.keyframes.postcss', 'punctuation.definition.keyword.postcss'] 219 | expect(tokens[0][1]).toEqual value: 'keyframes', scopes: ['source.css.postcss', 'meta.at-rule.keyframes.postcss', 'keyword.control.at-rule.keyframes.postcss'] 220 | expect(tokens[0][2]).toEqual value: ' ', scopes: ['source.css.postcss', 'meta.at-rule.keyframes.postcss'] 221 | expect(tokens[0][3]).toEqual value: 'anim', scopes: ['source.css.postcss', 'meta.at-rule.keyframes.postcss', 'entity.name.function.postcss'] 222 | expect(tokens[1][0]).toEqual value: 'from', scopes: ['source.css.postcss', 'meta.at-rule.keyframes.postcss', 'meta.keyframes.postcss', 'entity.other.attribute-name.postcss'] 223 | expect(tokens[1][4]).toEqual value: 'opacity', scopes: ['source.css.postcss', 'meta.at-rule.keyframes.postcss', 'meta.keyframes.postcss', 'meta.property-list.postcss', 'meta.property-name.postcss', 'support.type.property-name.postcss'] 224 | expect(tokens[1][7]).toEqual value: '0', scopes: ['source.css.postcss', 'meta.at-rule.keyframes.postcss', 'meta.keyframes.postcss', 'meta.property-list.postcss', 'meta.property-value.postcss', 'constant.numeric.postcss'] 225 | expect(tokens[2][0]).toEqual value: 'to', scopes: ['source.css.postcss', 'meta.at-rule.keyframes.postcss', 'meta.keyframes.postcss', 'entity.other.attribute-name.postcss'] 226 | expect(tokens[2][4]).toEqual value: 'opacity', scopes: ['source.css.postcss', 'meta.at-rule.keyframes.postcss', 'meta.keyframes.postcss', 'meta.property-list.postcss', 'meta.property-name.postcss', 'support.type.property-name.postcss'] 227 | expect(tokens[2][7]).toEqual value: '1', scopes: ['source.css.postcss', 'meta.at-rule.keyframes.postcss', 'meta.keyframes.postcss', 'meta.property-list.postcss', 'meta.property-value.postcss', 'constant.numeric.postcss'] 228 | 229 | describe 'media queries', -> 230 | it 'parses media types and features', -> 231 | {tokens} = grammar.tokenizeLine '@media (orientation: landscape) and only screen and (min-width: 700px) {}' 232 | 233 | expect(tokens[0]).toEqual value: '@', scopes: ['source.css.postcss', 'meta.at-rule.media.postcss', 'keyword.control.at-rule.media.postcss', 'punctuation.definition.keyword.postcss'] 234 | expect(tokens[1]).toEqual value: 'media', scopes: ['source.css.postcss', 'meta.at-rule.media.postcss', 'keyword.control.at-rule.media.postcss'] 235 | expect(tokens[4]).toEqual value: 'orientation', scopes: ['source.css.postcss', 'meta.at-rule.media.postcss', 'support.type.property-name.media.css'] 236 | expect(tokens[6]).toEqual value: 'landscape', scopes: ['source.css.postcss', 'meta.at-rule.media.postcss', 'support.constant.property-value.postcss'] 237 | expect(tokens[8]).toEqual value: 'and', scopes: ['source.css.postcss', 'meta.at-rule.media.postcss', 'keyword.control.operator'] 238 | expect(tokens[10]).toEqual value: 'only', scopes: ['source.css.postcss', 'meta.at-rule.media.postcss', 'keyword.control.operator'] 239 | expect(tokens[12]).toEqual value: 'screen', scopes: ['source.css.postcss', 'meta.at-rule.media.postcss', 'support.constant.media.css'] 240 | expect(tokens[14]).toEqual value: 'and', scopes: ['source.css.postcss', 'meta.at-rule.media.postcss', 'keyword.control.operator'] 241 | expect(tokens[16]).toEqual value: 'min-width', scopes: ['source.css.postcss', 'meta.at-rule.media.postcss', 'support.type.property-name.media.css'] 242 | expect(tokens[18]).toEqual value: '700', scopes: ['source.css.postcss', 'meta.at-rule.media.postcss', 'constant.numeric.postcss'] 243 | expect(tokens[19]).toEqual value: 'px', scopes: ['source.css.postcss', 'meta.at-rule.media.postcss', 'constant.numeric.postcss', 'keyword.other.unit.postcss'] 244 | 245 | describe 'variable setting', -> 246 | it 'parses all tokens', -> 247 | {tokens} = grammar.tokenizeLine '$font-size: $normal-font-size;' 248 | 249 | expect(tokens[0]).toEqual value: '$font-size', scopes: ['source.css.postcss', 'meta.set.variable.postcss', 'variable.postcss'] 250 | expect(tokens[1]).toEqual value: ':', scopes: ['source.css.postcss', 'meta.set.variable.postcss', 'punctuation.separator.key-value.postcss'] 251 | expect(tokens[2]).toEqual value: ' ', scopes: ['source.css.postcss', 'meta.set.variable.postcss'] 252 | expect(tokens[3]).toEqual value: '$normal-font-size', scopes: ['source.css.postcss', 'meta.set.variable.postcss', 'variable.postcss', 'variable.postcss'] 253 | 254 | describe 'interpolation', -> 255 | it 'is tokenized within single quotes', -> 256 | {tokens} = grammar.tokenizeLine "body { font-family: '#\{$family}'; }" # escaping CoffeeScript's interpolation 257 | 258 | expect(tokens[8]).toEqual value: '#{', scopes: ['source.css.postcss', 'meta.property-list.postcss', 'meta.property-value.postcss', 'string.quoted.single.postcss', 'variable.interpolation.postcss'] 259 | expect(tokens[9]).toEqual value: '$family', scopes: ['source.css.postcss', 'meta.property-list.postcss', 'meta.property-value.postcss', 'string.quoted.single.postcss', 'variable.interpolation.postcss', 'variable.postcss', 'variable.postcss'] 260 | expect(tokens[10]).toEqual value: '}', scopes: ['source.css.postcss', 'meta.property-list.postcss', 'meta.property-value.postcss', 'string.quoted.single.postcss', 'variable.interpolation.postcss'] 261 | 262 | it 'is tokenized within double quotes', -> 263 | {tokens} = grammar.tokenizeLine 'body { font-family: "#\{$family}"; }' 264 | 265 | expect(tokens[8]).toEqual value: '#{', scopes: ['source.css.postcss', 'meta.property-list.postcss', 'meta.property-value.postcss', 'string.quoted.double.postcss', 'variable.interpolation.postcss'] 266 | expect(tokens[9]).toEqual value: '$family', scopes: ['source.css.postcss', 'meta.property-list.postcss', 'meta.property-value.postcss', 'string.quoted.double.postcss', 'variable.interpolation.postcss', 'variable.postcss', 'variable.postcss'] 267 | expect(tokens[10]).toEqual value: '}', scopes: ['source.css.postcss', 'meta.property-list.postcss', 'meta.property-value.postcss', 'string.quoted.double.postcss', 'variable.interpolation.postcss'] 268 | 269 | it 'is tokenized without quotes', -> 270 | {tokens} = grammar.tokenizeLine 'body { font-family: #\{$family}; }' 271 | 272 | expect(tokens[7]).toEqual value: '#{', scopes: ['source.css.postcss', 'meta.property-list.postcss', 'meta.property-value.postcss', 'variable.interpolation.postcss'] 273 | expect(tokens[8]).toEqual value: '$family', scopes: ['source.css.postcss', 'meta.property-list.postcss', 'meta.property-value.postcss', 'variable.interpolation.postcss', 'variable.postcss', 'variable.postcss'] 274 | expect(tokens[9]).toEqual value: '}', scopes: ['source.css.postcss', 'meta.property-list.postcss', 'meta.property-value.postcss', 'variable.interpolation.postcss'] 275 | 276 | it 'is tokenized as a class name', -> 277 | {tokens} = grammar.tokenizeLine 'body.#\{$class} {}' 278 | 279 | expect(tokens[2]).toEqual value: '#{', scopes: ['source.css.postcss', 'variable.interpolation.postcss'] 280 | expect(tokens[3]).toEqual value: '$class', scopes: ['source.css.postcss', 'variable.interpolation.postcss', 'variable.postcss', 'variable.postcss'] 281 | expect(tokens[4]).toEqual value: '}', scopes: ['source.css.postcss', 'variable.interpolation.postcss'] 282 | 283 | it 'is tokenized as a keyframe', -> 284 | {tokens} = grammar.tokenizeLine '@keyframes anim { #\{$keyframe} {} }' 285 | 286 | expect(tokens[7]).toEqual value: '#{', scopes: ['source.css.postcss', 'meta.at-rule.keyframes.postcss', 'meta.keyframes.postcss', 'variable.interpolation.postcss'] 287 | expect(tokens[8]).toEqual value: '$keyframe', scopes: ['source.css.postcss', 'meta.at-rule.keyframes.postcss', 'meta.keyframes.postcss', 'variable.interpolation.postcss', 'variable.postcss', 'variable.postcss'] 288 | expect(tokens[9]).toEqual value: '}', scopes: ['source.css.postcss', 'meta.at-rule.keyframes.postcss', 'meta.keyframes.postcss', 'variable.interpolation.postcss'] 289 | -------------------------------------------------------------------------------- /grammars/sugarss.cson: -------------------------------------------------------------------------------- 1 | 'fileTypes': [ 2 | 'sss' 3 | ] 4 | 'name': 'SugarSS' 5 | 'patterns': [ 6 | { 7 | 'captures': 8 | '1': 9 | 'name': 'punctuation.definition.comment.postcss' 10 | 'match': '(?:^[ \\t]+)?(\\/\\/).*$\\n?' 11 | 'name': 'comment.line.postcss' 12 | } 13 | { 14 | 'begin': '/\\*' 15 | 'captures': 16 | '0': 17 | 'name': 'punctuation.definition.comment.postcss' 18 | 'end': '\\*/' 19 | 'name': 'comment.block.postcss' 20 | } 21 | { 22 | 'captures': 23 | '1': 24 | 'name': 'entity.name.function.postcss' 25 | 'match': '(^[-a-zA-Z_][-\\w]*)?(\\()' 26 | 'name': 'meta.function.postcss' 27 | } 28 | { 29 | 'captures': 30 | '1': 31 | 'name': 'punctuation.definition.entity.postcss' 32 | 'match': '\\.-?[_a-zA-Z]+[_a-zA-Z0-9-]*' 33 | 'name': 'entity.other.attribute-name.class.postcss' 34 | } 35 | { 36 | 'captures': 37 | '1': 38 | 'name': 'punctuation.definition.entity.postcss' 39 | 'match': '\\---?[_a-zA-Z]+[_a-zA-Z0-9-]*' 40 | 'name': 'variable.var.postcss' 41 | } 42 | { 43 | 'captures': 44 | '1': 45 | 'name': 'punctuation.definition.entity.postcss' 46 | 'match': '\\$-?[_a-zA-Z]+[_a-zA-Z0-9-]*' 47 | 'name': 'variable.var.postcss' 48 | } 49 | { 50 | 'match': '^ *&' 51 | 'name': 'entity.language.postcss' 52 | } 53 | { 54 | 'match': '(arguments)' 55 | 'name': 'variable.language.postcss' 56 | } 57 | { 58 | 'match': '\\b(.*)(?=\\s*=)' 59 | 'name': 'variable.language.postcss' 60 | } 61 | { 62 | 'match': '@([-\\w]+)' 63 | 'name': 'keyword.postcss' 64 | } 65 | { 66 | 'captures': 67 | '1': 68 | 'name': 'punctuation.definition.entity.postcss' 69 | 'match': '(:+)\\b(after|before|first-letter|first-line|selection|:-moz-selection)\\b' 70 | 'name': 'entity.other.attribute-name.pseudo-element.postcss' 71 | } 72 | { 73 | 'match': '(-webkit-|-moz\\-|-ms-|-o-)' 74 | 'name': 'entity.name.type.vendor-prefix.postcss' 75 | } 76 | { 77 | 'captures': 78 | '1': 79 | 'name': 'punctuation.definition.entity.postcss' 80 | 'match': '(:)\\b(active|hover|host|focus|target|link|any-link|local-link|visited|scope|current|past|future|dir|lang|enabled|disabled|checked|indeterminate|default|valid|invalid|in-range|out-of-range|required|optional|read-only|read-write|root|first-child|last-child|only-child|nth-child|nth-last-child|first-of-type|last-of-type|matches|nth-of-type|nth-last-of-type|only-of-type|nth-match|nth-last-match|empty|not|column|nth-column|nth-last-column)\\b' 81 | 'name': 'entity.other.attribute-name.pseudo-class.postcss' 82 | } 83 | { 84 | 'match': '\\b(:root|a|abbr|acronym|address|area|article|aside|audio|b|base|big|blackness|blend|blockquote|body|br|button|canvas|caption|cite|code|col|contrast|colgroup|datalist|dd|del|details|dfn|dialog|div|dl|dt|em|eventsource|fieldset|figure|figcaption|footer|form|frame|frameset|(h[1-6])|head|header|hgroup|hr|html|hwb|i|iframe|img|input|ins|kbd|label|legend|li|lightness|link|main|map|mark|menu|meta|meter|nav|noframes|noscript|object|ol|optgroup|option|output|p|param|pre|progress|q|rgba|rgb|s|samp|saturation|script|section|select|shade|span|strike|strong|style|sub|summary|sup|svg|table|tbody|td|textarea|tfoot|th|thead|time|tint|title|tr|tt|ul|var|video|whiteness)\\b' 85 | 'name': 'storage.name.tag.postcss' 86 | } 87 | { 88 | 'captures': 89 | '1': 90 | 'name': 'punctuation.definition.constant.postcss' 91 | 'match': '(#)([0-9a-fA-F]{1}|[0-9a-fA-F]{2}|[0-9a-fA-F]{3}|[0-9a-fA-F]{4}|[0-9a-fA-F]{6})\\b' 92 | 'name': 'constant.other.color.rgb-value.postcss' 93 | } 94 | { 95 | 'captures': 96 | '1': 97 | 'name': 'punctuation.definition.entity.postcss' 98 | 'match': '(#)[a-zA-Z][a-zA-Z0-9_-]*' 99 | 'name': 'entity.other.attribute-name.id.postcss' 100 | } 101 | { 102 | 'match': '(\\b|\\s)(!important|for|from|in|return|to|true|false|null|if|else|unless|return)\\b' 103 | 'name': 'keyword.control.postcss' 104 | } 105 | { 106 | 'match': '((?:!|~|\\+|-|(?:\\*)?\\*|\\/|%|(?:\\.)\\.\\.|<|>|(?:=|:|\\?|\\+|-|\\*|\\/|%|<|>)?=|!=)|\\b(?:in|is(?:nt)?|not)\\b)' 107 | 'name': 'keyword.operator.postcss' 108 | } 109 | { 110 | 'begin': '"' 111 | 'end': '"' 112 | 'name': 'string.quoted.double.postcss' 113 | } 114 | { 115 | 'begin': '\'' 116 | 'end': '\'' 117 | 'name': 'string.quoted.single.postcss' 118 | } 119 | { 120 | 'comment': 'http://www.w3.org/TR/CSS21/syndata.html#value-def-color' 121 | 'match': '\\b(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)\\b' 122 | 'name': 'support.constant.color.w3c-standard-color-name.postcss' 123 | } 124 | { 125 | 'match': '(\\b(?i:arial|century|comic|courier|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace)\\b)' 126 | 'name': 'string.constant.font-name.postcss' 127 | } 128 | { 129 | 'captures': 130 | '1': 131 | 'name': 'keyword.other.unit.postcss' 132 | 'match': '(?\\=|\\<|\\>|from|to|through)' 159 | 'name': 'keyword.control.operator' 160 | } 161 | { 162 | 'include': '#variable' 163 | } 164 | { 165 | 'include': '#property_values' 166 | } 167 | { 168 | 'include': '$self' 169 | } 170 | ] 171 | 'at_rule_function': 172 | 'patterns': [ 173 | { 174 | 'begin': '\\s*((@)function\\b)\\s*' 175 | 'captures': 176 | '1': 177 | 'name': 'keyword.control.at-rule.function.postcss' 178 | '2': 179 | 'name': 'punctuation.definition.keyword.postcss' 180 | '3': 181 | 'name': 'entity.name.function.postcss' 182 | 'comment': 'Function with Attributes' 183 | 'end': '\\s*(?=\\{)' 184 | 'name': 'meta.at-rule.function.postcss' 185 | 'patterns': [ 186 | { 187 | 'include': '#function_attributes' 188 | } 189 | ] 190 | } 191 | { 192 | 'captures': 193 | '1': 194 | 'name': 'keyword.control.at-rule.function.postcss' 195 | '2': 196 | 'name': 'punctuation.definition.keyword.postcss' 197 | '3': 198 | 'name': 'entity.name.function.postcss' 199 | 'comment': 'Simple Function' 200 | 'match': '\\s*((@)function\\b)\\s*' 201 | 'name': 'meta.at-rule.function.postcss' 202 | } 203 | ] 204 | 'at_rule_if': 205 | 'begin': '\\s*((@)if\\b)\\s*' 206 | 'captures': 207 | '1': 208 | 'name': 'keyword.control.if.postcss' 209 | '2': 210 | 'name': 'punctuation.definition.keyword.postcss' 211 | 'end': '\\s*(?=\\{)' 212 | 'name': 'meta.at-rule.if.postcss' 213 | 'patterns': [ 214 | { 215 | 'include': '#logical_operators' 216 | } 217 | { 218 | 'include': '#variable' 219 | } 220 | { 221 | 'include': '#property_values' 222 | } 223 | ] 224 | 'at_rule_import': 225 | 'begin': '\\s*((@)import\\b)\\s*' 226 | 'captures': 227 | '1': 228 | 'name': 'keyword.control.at-rule.import.postcss' 229 | '2': 230 | 'name': 'punctuation.definition.keyword.postcss' 231 | 'end': '\\s*((?=;)|(?=\\}))' 232 | 'name': 'meta.at-rule.import.postcss' 233 | 'patterns': [ 234 | { 235 | 'include': '#variable' 236 | } 237 | { 238 | 'include': '#string_single' 239 | } 240 | { 241 | 'include': '#string_double' 242 | } 243 | { 244 | 'include': '#functions' 245 | } 246 | { 247 | 'include': '#comment_line' 248 | } 249 | ] 250 | 'at_rule_nest': 251 | 'begin': '\\s*((@)nest\\b)\\s*' 252 | 'captures': 253 | '1': 254 | 'name': 'keyword.control.at-rule.nest.postcss' 255 | '2': 256 | 'name': 'punctuation.definition.keyword.postcss' 257 | 'comment': 'The Nesting At-Rule' 258 | 'end': '\\s*(?=\\{)' 259 | 'name': 'meta.at-rule.nest.postcss' 260 | 'patterns': [ 261 | { 262 | 'include': '#selectors' 263 | } 264 | { 265 | 'include': '#property_values' 266 | } 267 | ] 268 | 'at_rule_value': 269 | 'begin': '\\s*((@)value\\b)\\s*' 270 | 'captures': 271 | '1': 272 | 'name': 'keyword.control.at-rule.value.postcss' 273 | '2': 274 | 'name': 'punctuation.definition.keyword.postcss' 275 | 'end': '\\s*((?=;)|(?=\\}))' 276 | 'name': 'meta.at-rule.value.postcss' 277 | 'patterns': [ 278 | { 279 | 'include': '#variable' 280 | } 281 | { 282 | 'include': '#string_single' 283 | } 284 | { 285 | 'include': '#string_double' 286 | } 287 | { 288 | 'include': '#functions' 289 | } 290 | { 291 | 'include': '#comment_line' 292 | } 293 | ] 294 | 'at_rule_use': 295 | 'begin': '\\s*((@)use\\b)\\s*' 296 | 'captures': 297 | '1': 298 | 'name': 'keyword.control.at-rule.use.postcss' 299 | '2': 300 | 'name': 'punctuation.definition.keyword.postcss' 301 | 'end': '\\s*((?=;)|(?=\\}))' 302 | 'name': 'meta.at-rule.use.postcss' 303 | 'patterns': [ 304 | { 305 | 'include': '#variable' 306 | } 307 | { 308 | 'include': '#string_single' 309 | } 310 | { 311 | 'include': '#string_double' 312 | } 313 | { 314 | 'include': '#functions' 315 | } 316 | { 317 | 'include': '#comment_line' 318 | } 319 | ] 320 | 'at_rule_custom_media': 321 | 'begin': '\\s*((@)custom-media\\b)\\s*' 322 | 'captures': 323 | '1': 324 | 'name': 'keyword.control.at-rule.custom-media.postcss' 325 | '2': 326 | 'name': 'punctuation.definition.keyword.postcss' 327 | 'end': '\\s*((?=;)|(?=\\}))' 328 | 'name': 'meta.at-rule.custom-media.postcss' 329 | 'patterns': [ 330 | { 331 | 'include': '#variable' 332 | } 333 | { 334 | 'include': '#string_single' 335 | } 336 | { 337 | 'include': '#string_double' 338 | } 339 | { 340 | 'include': '#functions' 341 | } 342 | { 343 | 'include': '#comment_line' 344 | } 345 | ] 346 | 'at_rule_custom_selector': 347 | 'begin': '\\s*((@)custom-selector\\b)\\s*' 348 | 'captures': 349 | '1': 350 | 'name': 'keyword.control.at-rule.custom-selector.postcss' 351 | '2': 352 | 'name': 'punctuation.definition.keyword.postcss' 353 | 'end': '\\s*((?=;)|(?=\\}))' 354 | 'name': 'meta.at-rule.custom-selector.postcss' 355 | 'patterns': [ 356 | { 357 | 'include': '#variable' 358 | } 359 | { 360 | 'include': '#string_single' 361 | } 362 | { 363 | 'include': '#string_double' 364 | } 365 | { 366 | 'include': '#functions' 367 | } 368 | { 369 | 'include': '#comment_line' 370 | } 371 | ] 372 | 'at_rule_include': 373 | 'patterns': [ 374 | { 375 | 'begin': '\\s*((@)include\\b)\\s*' 376 | 'captures': 377 | '1': 378 | 'name': 'keyword.control.at-rule.include.postcss' 379 | '2': 380 | 'name': 'punctuation.definition.keyword.postcss' 381 | '3': 382 | 'name': 'entity.name.function.postcss' 383 | '4': 384 | 'name': 'entity.name.text.postcss' 385 | 'end': '\\s*[\\)|\\s\\;]' 386 | 'name': 'meta.at-rule.include.postcss' 387 | 'patterns': [ 388 | { 389 | 'include': '#function_attributes' 390 | } 391 | { 392 | 'include': '#functions' 393 | } 394 | ] 395 | } 396 | ] 397 | 'at_rule_keyframes': 398 | 'patterns': [ 399 | { 400 | 'begin': '^\\s*((@)(\\-[\\w\\-]*\\-)?keyframes\\b)\\s*([\\w-]*)' 401 | 'captures': 402 | '1': 403 | 'name': 'keyword.control.at-rule.keyframes.postcss' 404 | '2': 405 | 'name': 'punctuation.definition.keyword.postcss' 406 | '3': 407 | 'name': 'punctuation.definition.keyword.postcss' 408 | '4': 409 | 'name': 'entity.name.function.postcss' 410 | 'comment': 'Keyframes with Attributes' 411 | 'end': '(?<=\\})(?:\\s*$)?' 412 | 'name': 'meta.at-rule.keyframes.postcss' 413 | 'patterns': [ 414 | { 415 | 'begin': '\\{' 416 | 'end': '\\}' 417 | 'beginCaptures': 418 | '0': 419 | 'name': 'punctuation.section.keyframes.begin.postcss' 420 | 'endCaptures': 421 | '0': 422 | 'name': 'punctuation.section.keyframes.end.postcss' 423 | 'name': 'meta.keyframes.postcss' 424 | 'patterns': [ 425 | { 426 | 'match': '(\\b(\\d+%|from\\b|to\\b))' 427 | 'name': 'entity.other.attribute-name.postcss' 428 | } 429 | { 430 | 'include': '#interpolation' 431 | } 432 | { 433 | 'include': '#property_list' 434 | } 435 | ] 436 | } 437 | ] 438 | } 439 | ] 440 | 'at_rule_media': 441 | 'patterns': [ 442 | { 443 | 'begin': '^\\s*((@)media\\b)\\s*' 444 | 'end': '\\s*(?=\\{)' 445 | 'captures': 446 | '1': 447 | 'name': 'keyword.control.at-rule.media.postcss' 448 | '2': 449 | 'name': 'punctuation.definition.keyword.postcss' 450 | 'name': 'meta.at-rule.media.postcss' 451 | 'patterns': [ 452 | { 453 | 'match': '\\b(only)\\b' 454 | 'name': 'keyword.control.operator' 455 | } 456 | { 457 | 'include': '#property_values' 458 | } 459 | { 460 | 'include': '#variable' 461 | } 462 | { 463 | 'include': '#logical_operators' 464 | } 465 | { 466 | 'include': '#media_features' 467 | } 468 | { 469 | 'include': '#media_types' 470 | } 471 | { 472 | 'include': '#property_names' 473 | } 474 | ] 475 | } 476 | ] 477 | 'at_rule_mixin': 478 | 'patterns': [ 479 | { 480 | 'begin': '\\s*((@)mixin) ([\\w-]*)\\s*\\(' 481 | 'captures': 482 | '1': 483 | 'name': 'keyword.control.at-rule.mixin.postcss' 484 | '2': 485 | 'name': 'punctuation.definition.keyword.postcss' 486 | '3': 487 | 'name': 'entity.name.function.postcss' 488 | 'comment': 'Mixin with Attributes' 489 | 'end': '\\)' 490 | 'name': 'meta.at-rule.mixin.postcss' 491 | 'patterns': [ 492 | { 493 | 'include': '#function_attributes' 494 | } 495 | ] 496 | } 497 | { 498 | 'captures': 499 | '1': 500 | 'name': 'keyword.control.at-rule.mixin.postcss' 501 | '2': 502 | 'name': 'punctuation.definition.keyword.postcss' 503 | '3': 504 | 'name': 'entity.name.function.postcss' 505 | 'comment': 'Simple Mixin' 506 | 'match': '^\\s*((@)mixin) ([\\w-]{1,})' 507 | 'name': 'meta.at-rule.mixin.postcss' 508 | } 509 | ] 510 | 'at_rule_namespace': 511 | 'patterns': [ 512 | { 513 | 'begin': '\\s*((@)namespace)\\s+(?=url)' 514 | 'captures': 515 | '1': 516 | 'name': 'keyword.control.at-rule.namespace.postcss' 517 | '2': 518 | 'name': 'punctuation.definition.keyword.postcss' 519 | '3': 520 | 'name': 'support.function.misc.postcss' 521 | 'comment': 'Namespace without prefix' 522 | 'end': '\\s*((?=;|$))' 523 | 'name': 'meta.at-rule.namespace.postcss' 524 | 'patterns': [ 525 | { 526 | 'include': '#property_values' 527 | } 528 | { 529 | 'include': '#string_single' 530 | } 531 | { 532 | 'include': '#string_double' 533 | } 534 | ] 535 | } 536 | { 537 | 'begin': '\\s*((@)namespace) ([\\w-]*)\\s*' 538 | 'captures': 539 | '1': 540 | 'name': 'keyword.control.at-rule.namespace.postcss' 541 | '2': 542 | 'name': 'punctuation.definition.keyword.postcss' 543 | '3': 544 | 'name': 'entity.name.function.postcss' 545 | 'comment': 'Namespace' 546 | 'end': '\\s*((?=;|$))' 547 | 'name': 'meta.at-rule.namespace.postcss' 548 | 'patterns': [ 549 | { 550 | 'include': '#variables' 551 | } 552 | { 553 | 'include': '#cssnext_variables' 554 | } 555 | { 556 | 'include': '#property_values' 557 | } 558 | { 559 | 'include': '#string_single' 560 | } 561 | { 562 | 'include': '#string_double' 563 | } 564 | ] 565 | } 566 | ] 567 | 'at_rule_option': 568 | 'captures': 569 | '1': 570 | 'name': 'keyword.control.at-rule.charset.postcss' 571 | '2': 572 | 'name': 'punctuation.definition.keyword.postcss' 573 | 'comment': 'Option' 574 | 'match': '^\\s*((@)option\\b)\\s*' 575 | 'name': 'meta.at-rule.option.postcss' 576 | 'at_rule_page': 577 | 'patterns': [ 578 | { 579 | 'begin': '^\\s*((@)page)(?=:|\\s)\\s*([-:\\w]*)' 580 | 'captures': 581 | '1': 582 | 'name': 'keyword.control.at-rule.page.postcss' 583 | '2': 584 | 'name': 'punctuation.definition.keyword.postcss' 585 | '3': 586 | 'name': 'entity.name.function.postcss' 587 | 'comment': 'Page with Attributes' 588 | 'end': '\\s*(?=\\{)' 589 | 'name': 'meta.at-rule.page.postcss' 590 | } 591 | ] 592 | 'at_rule_return': 593 | 'begin': '\\s*((@)(return)\\b)' 594 | 'captures': 595 | '1': 596 | 'name': 'keyword.control.return.postcss' 597 | '2': 598 | 'name': 'punctuation.definition.keyword.postcss' 599 | 'end': '\\s*((?=;))' 600 | 'name': 'meta.at-rule.return.postcss' 601 | 'patterns': [ 602 | { 603 | 'include': '#variable' 604 | } 605 | { 606 | 'include': '#property_values' 607 | } 608 | ] 609 | 'at_rule_at_root': 610 | 'begin': '\\s*((@)(at-root))(\\s+|$)' 611 | 'end': '\\s*(?=\\{)' 612 | 'beginCaptures': 613 | '1': 614 | 'name': 'keyword.control.at-rule.at-root.postcss' 615 | '2': 616 | 'name': 'punctuation.definition.keyword.postcss' 617 | 'name': 'meta.at-rule.at-root.postcss' 618 | 'patterns': [ 619 | { 620 | 'include': '#function_attributes' 621 | } 622 | { 623 | 'include': '#functions' 624 | } 625 | { 626 | 'include': '#selectors' 627 | } 628 | ] 629 | 'at_rule_warn': 630 | 'begin': '\\s*((@)(warn|debug|error)\\b)\\s*' 631 | 'captures': 632 | '1': 633 | 'name': 'keyword.control.warn.postcss' 634 | '2': 635 | 'name': 'punctuation.definition.keyword.postcss' 636 | 'end': '\\s*(?=\\;)' 637 | 'name': 'meta.at-rule.warn.postcss' 638 | 'patterns': [ 639 | { 640 | 'include': '#variable' 641 | } 642 | { 643 | 'include': '#string_double' 644 | } 645 | { 646 | 'include': '#string_single' 647 | } 648 | ] 649 | 'at_rule_while': 650 | 'begin': '\\s*((@)while\\b)\\s*' 651 | 'captures': 652 | '1': 653 | 'name': 'keyword.control.while.postcss' 654 | '2': 655 | 'name': 'punctuation.definition.keyword.postcss' 656 | 'end': '\\s*(?=\\})' 657 | 'name': 'meta.at-rule.while.postcss' 658 | 'patterns': [ 659 | { 660 | 'include': '#logical_operators' 661 | } 662 | { 663 | 'include': '#variable' 664 | } 665 | { 666 | 'include': '#property_values' 667 | } 668 | { 669 | 'include': '$self' 670 | } 671 | ] 672 | 'comment_block': 673 | 'begin': '\\s*/\\*\\s*' 674 | 'captures': 675 | '0': 676 | 'name': 'punctuation.whitespace.comment.trailing.postcss' 677 | 'comment': 'Revamped Comment block.' 678 | 'end': '(\\*/)\\s*' 679 | 'name': 'comment.block.postcss' 680 | 'comment_line': 681 | 'begin': '(\\s*)//' 682 | 'comment': 'Revamped' 683 | 'end': '$(\\s*)' 684 | 'name': 'comment.line.postcss' 685 | 'constant_color': 686 | 'match': '\\b(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)\\b' 687 | 'name': 'support.constant.color.w3c-standard-color-name.postcss' 688 | 'constant_default': 689 | 'match': '\\!default' 690 | 'name': 'keyword.other.default.postcss' 691 | 'constant_font': 692 | 'match': '(\\b(?i:arial|century|comic|courier|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace)\\b)' 693 | 'name': 'string.constant.font-name.postcss' 694 | 'constant_functions': 695 | 'begin': '([\\w-]+)(\\()' 696 | 'beginCaptures': 697 | '1': 698 | 'name': 'support.function.misc.postcss' 699 | '2': 700 | 'name': 'punctuation.section.function.postcss' 701 | 'end': '(\\))' 702 | 'endCaptures': 703 | '1': 704 | 'name': 'punctuation.section.function.postcss' 705 | 'patterns': [ 706 | { 707 | 'include': '#parameters' 708 | } 709 | ] 710 | 'constant_hex': 711 | 'captures': 712 | '1': 713 | 'name': 'punctuation.definition.constant.postcss' 714 | 'match': '(#)([0-9a-fA-F]{1}|[0-9a-fA-F]{2}|[0-9a-fA-F]{3}|[0-9a-fA-F]{4}|[0-9a-fA-F]{6})\\b' 715 | 'name': 'constant.other.color.rgb-value.postcss' 716 | 'constant_important': 717 | 'match': '\\!important' 718 | 'name': 'keyword.other.important.postcss' 719 | 'constant_mathematical_symbols': 720 | 'match': '(\\b(\\+|\\-|\\*|/)\\b)' 721 | 'name': 'support.constant.mathematical-symbols.postcss' 722 | 'constant_number': 723 | 'match': '(\\b([0-9]+(\\.[0-9]+)?)|\\B\\.[0-9]+)(?=\\s*(ch|cm|deg|dpi|dpcm|dppx|em|ex|grad|in|mm|mozmm|ms|pc|pt|px|rad|rem|turn|s|vh|vmin|vmax|vw|\\b))' 724 | 'name': 'constant.numeric.postcss' 725 | 'constant_optional': 726 | 'match': '\\!optional' 727 | 'name': 'keyword.other.optional.postcss' 728 | 'constant_property_value': 729 | 'match': '\\b(absolute|all-scroll|always|armenian|auto|baseline|below|bidi-override|block|bold|bolder|both|bottom|border-box|break-all|break-word|butt|capitalize|center|char|circle|cjk-ideographic|col-resize|collapse|column-reverse|column|contain|content-box|cover|crosshair|currentColor|dashed|decimal-leading-zero|decimal|default|disabled|disc|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ellipsis|fill|fixed|flex-end|flex-start|flex|georgian|groove|hand|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|inactive|inherit|inline-block|inline-flex|inline|inset|inside|inter-ideograph|inter-word|italic|justify|katakana-iroha|katakana|keep-all|landscape|left|lighter|line-edge|line-through|line|list-item|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|medium|middle|move|n-resize|ne-resize|newspaper|no-drop|no-repeat|nw-resize|none|normal|not-allowed|nowrap|null|oblique|outset|outside|overline|pointer|portrait|preserve-3d|progress|relative|repeat-x|repeat-y|repeat|right|ridge|round|row-resize|row-reverse|row|rtl|s-resize|scroll|se-resize|separate|small-caps|solid|space-around|space-between|square|static|stretch|strict|super|sw-resize|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table-row|table|tb-rl|text-bottom|text-top|text|thick|thin|top|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|wrap|wrap-reverse|zero|true|false|vertical|horizontal)\\b' 730 | 'name': 'support.constant.property-value.postcss' 731 | 'postcss_values': 732 | 'match': '\\b(responsive|fix-legacy|fix|amaro|brannan|earlybird|inkwell|kalvin|lo-fi|nashville|toaster|small-caps|lining-nums)\\b' 733 | 'name': 'support.constant.property-value.postcss' 734 | 'constant_rgb': 735 | 'match': '(?\\=|\\<|\\>|not|or|and)\\b' 855 | 'name': 'keyword.control.operator' 856 | 'media_attributes': 857 | 'patterns': [ 858 | { 859 | 'match': ':' 860 | 'name': 'punctuation.definition' 861 | } 862 | { 863 | 'include': '#general' 864 | } 865 | { 866 | 'include': '#property_name' 867 | } 868 | { 869 | 'include': '#postcss_properties' 870 | } 871 | { 872 | 'include': '#property_values' 873 | } 874 | { 875 | 'include': '#property_name_au' 876 | } 877 | { 878 | 'comment': 'We even have error highlighting <3' 879 | 'match': '[=\\{\\}\\?\\@]' 880 | 'name': 'invalid.illegal' 881 | } 882 | ] 883 | 'media_features': 884 | 'patterns': [ 885 | { 886 | 'match': '\\b(min-device-aspect-ratio|max-device-aspect-ratio|device-aspect-ratio|min-aspect-ratio|max-aspect-ratio|aspect-ratio|min-device-height|max-device-height|device-height|min-device-width|max-device-width|device-width|min-monochrome|max-monochrome|monochrome|min-color-index|max-color-index|color-index|min-color|max-color|color|orientation|scan|min-resolution|max-resolution|resolution|grid|min-width|max-width|width)\\b' 887 | 'name': 'support.type.property-name.media.css' 888 | } 889 | ] 890 | 'media_types': 891 | 'patterns': [ 892 | { 893 | 'match': '\\b(all|aural|braille|embossed|handheld|print|projection|screen|tty|tv)\\b' 894 | 'name': 'support.constant.media.css' 895 | } 896 | ] 897 | 'parameters': 898 | 'patterns': [ 899 | { 900 | 'include': '#variable' 901 | } 902 | { 903 | 'include': '#property_values' 904 | } 905 | { 906 | 'include': '#comment_line' 907 | } 908 | { 909 | 'include': '#comment_block' 910 | } 911 | { 912 | 'match': '[^\'",) \\t]+' 913 | 'name': 'variable.parameter.url.postcss' 914 | } 915 | { 916 | 'match': ',' 917 | 'name': 'punctuation.postcss' 918 | } 919 | ] 920 | 'properties': 921 | 'patterns': [ 922 | { 923 | 'begin': '(?([\'"])(?:[^\\\\]|\\\\.)*?(\\6)))))?\\s*(\\])' 1105 | 'name': 'meta.attribute-selector.postcss' 1106 | 'selector_class': 1107 | 'captures': 1108 | '1': 1109 | 'name': 'punctuation.definition.entity.css' 1110 | 'match': '(\\.)[a-zA-Z0-9_-]+' 1111 | 'name': 'entity.other.attribute-name.class.css' 1112 | 'selector_entities': 1113 | 'match': '\\b(:root|a|abbr|acronym|address|area|article|aside|audio|b|base|bdi|bdo|big|blockquote|body|br|button|canvas|caption|circle|cite|code|col|colgroup|data|datalist|dd|del|details|dfn|dialog|div|dl|dt|em|embed|eventsource|fieldset|figure|figcaption|footer|form|frame|frameset|g|(h[1-6])|head|header|hgroup|hr|html|i|iframe|img|input|ins|kbd|keygen|label|legend|li|line(?!-)|link|main|map|mark|menu|menuitem|meta|meter|nav|noframes|noscript|object|ol|optgroup|option|output|p|param|path|polygon|polyline|pre|progress|q|rb|rect|rp|rt|rtc|ruby|s|samp|script|section|select|small|source|span|strike|strong|style|sub|summary|sup|svg|table(?!-)|tbody|td|template|text(?!-)|textarea|textpath|tfoot|th|thead|time|title|tr|track|tspan|tt|u|ul|var|video|wbr)\\b' 1114 | 'name': 'entity.name.tag.postcss' 1115 | 'selector_custom': 1116 | 'match': '\\b([a-zA-Z0-9]+(-[a-zA-Z0-9]+)+)(?=\\.|\\s++[^:]|\\s*[,{]|:(matches|not|link|any-link|visited|hover|active|focus|target|lang|disabled|enabled|checked|indeterminate|root|nth-child()|nth-last-child()|nth-of-type()|nth-last-of-type()|first-child|last-child|first-of-type|last-of-type|only-child|only-of-type|empty|not|valid|invalid)(\\([0-9A-Za-z]*\\))?)' 1117 | 'name': 'entity.name.tag.custom.postcss' 1118 | 'selector_id': 1119 | 'captures': 1120 | '1': 1121 | 'name': 'punctuation.definition.entity.css' 1122 | 'match': '(#)[a-zA-Z][a-zA-Z0-9_-]*' 1123 | 'name': 'entity.other.attribute-name.id.css' 1124 | 'selector_placeholder': 1125 | 'captures': 1126 | '1': 1127 | 'name': 'punctuation.definition.entity.postcss' 1128 | 'match': '(\\%)[a-zA-Z0-9_-]+' 1129 | 'name': 'entity.other.attribute-name.placeholder.postcss' 1130 | 'parent_selector_suffix': 1131 | 'match': '(?<=&)[a-zA-Z0-9_-]+' 1132 | 'name': 'entity.other.attribute-name.parent-selector-suffix.postcss' 1133 | 'selector_pseudo_class': 1134 | 'captures': 1135 | '1': 1136 | 'name': 'punctuation.definition.entity.css' 1137 | 'match': '(:)\\b(link|any-link|matches|not|visited|hover|active|focus|target|lang|disabled|enabled|checked|indeterminate|root|nth-child()|nth-last-child()|nth-of-type()|nth-last-of-type()|first-child|last-child|first-of-type|last-of-type|only-child|only-of-type|empty|not|valid|invalid)(\\([-+0-9A-Za-z]*\\))?' 1138 | 'name': 'entity.other.attribute-name.pseudo-class.css' 1139 | 'selector_pseudo_element': 1140 | 'captures': 1141 | '1': 1142 | 'name': 'punctuation.definition.entity.css' 1143 | 'match': '(:+)((-(moz|webkit|ms)-)?(after|before|first-letter|first-line|selection))\\b' 1144 | 'name': 'entity.other.attribute-name.pseudo-element.css' 1145 | 'selectors': 1146 | 'comment': 'Stuff for Selectors.' 1147 | 'patterns': [ 1148 | { 1149 | 'include': '#selector_entities' 1150 | } 1151 | { 1152 | 'include': '#selector_custom' 1153 | } 1154 | { 1155 | 'include': '#selector_class' 1156 | } 1157 | { 1158 | 'include': '#selector_id' 1159 | } 1160 | { 1161 | 'include': '#selector_pseudo_class' 1162 | } 1163 | { 1164 | 'include': '#tag_wildcard' 1165 | } 1166 | { 1167 | 'include': '#tag_parent_reference' 1168 | } 1169 | { 1170 | 'include': '#selector_pseudo_element' 1171 | } 1172 | { 1173 | 'include': '#selector_attribute' 1174 | } 1175 | { 1176 | 'include': '#selector_placeholder' 1177 | } 1178 | { 1179 | 'include': '#parent_selector_suffix' 1180 | } 1181 | ] 1182 | 'string_double': 1183 | 'begin': '"' 1184 | 'beginCaptures': 1185 | '0': 1186 | 'name': 'punctuation.definition.string.begin.postcss' 1187 | 'end': '"' 1188 | 'endCaptures': 1189 | '0': 1190 | 'name': 'punctuation.definition.string.end.postcss' 1191 | 'name': 'string.quoted.double.postcss' 1192 | 'patterns': [ 1193 | { 1194 | 'match': '\\\\.' 1195 | 'name': 'constant.character.escape.postcss' 1196 | } 1197 | { 1198 | 'include': '#interpolation' 1199 | } 1200 | ] 1201 | 'string_single': 1202 | 'begin': '\'' 1203 | 'beginCaptures': 1204 | '0': 1205 | 'name': 'punctuation.definition.string.begin.postcss' 1206 | 'end': '\'' 1207 | 'endCaptures': 1208 | '0': 1209 | 'name': 'punctuation.definition.string.end.postcss' 1210 | 'name': 'string.quoted.single.postcss' 1211 | 'patterns': [ 1212 | { 1213 | 'match': '\\\\.' 1214 | 'name': 'constant.character.escape.postcss' 1215 | } 1216 | { 1217 | 'include': '#interpolation' 1218 | } 1219 | ] 1220 | 'tag_parent_reference': 1221 | 'match': '\\&' 1222 | 'name': 'entity.name.tag.reference.postcss' 1223 | 'tag_wildcard': 1224 | 'match': '\\*' 1225 | 'name': 'entity.name.tag.wildcard.postcss' 1226 | 'variable': 1227 | 'patterns': [ 1228 | { 1229 | 'include': '#variables' 1230 | } 1231 | { 1232 | 'include': '#cssnext_variables' 1233 | } 1234 | { 1235 | 'include': '#interpolation' 1236 | } 1237 | ] 1238 | 'variable_setting': 1239 | 'begin': '\\s*(\\$[A-Za-z0-9_-]+\\b)\\s*(:)\\s*' 1240 | 'captures': 1241 | '1': 1242 | 'name': 'variable.postcss' 1243 | '2': 1244 | 'name': 'punctuation.separator.key-value.postcss' 1245 | 'end': '\\s*(?=;)' 1246 | 'name': 'meta.set.variable.postcss' 1247 | 'patterns': [ 1248 | { 1249 | 'include': '#comment_block' 1250 | } 1251 | { 1252 | 'include': '#comment_line' 1253 | } 1254 | { 1255 | 'include': '#property_values' 1256 | } 1257 | { 1258 | 'include': '#variable' 1259 | } 1260 | ] 1261 | 'cssnext_variables': 1262 | 'captures': 1263 | '1': 1264 | 'name': 'variable.postcss' 1265 | 'match': '\\---?[_a-zA-Z]+[_a-zA-Z0-9-]*' 1266 | 'name': 'variable.var.postcss' 1267 | 'variables': 1268 | 'captures': 1269 | '1': 1270 | 'name': 'variable.postcss' 1271 | 'match': '\\s*(\\$[A-Za-z0-9_-]+\\b)\\s*' 1272 | 'name': 'variable.postcss' 1273 | 'patterns': [ 1274 | { 1275 | 'include': '#variable_setting' 1276 | } 1277 | { 1278 | 'include': '#at_rule_include' 1279 | } 1280 | { 1281 | 'include': '#at_rule_import' 1282 | } 1283 | { 1284 | 'include': '#at_rule_use' 1285 | } 1286 | { 1287 | 'include': '#at_rule_custom_media' 1288 | } 1289 | { 1290 | 'include': '#at_rule_custom_selector' 1291 | } 1292 | { 1293 | 'include': '#general' 1294 | } 1295 | { 1296 | 'include': '#flow_control' 1297 | } 1298 | { 1299 | 'include': '#rules' 1300 | } 1301 | { 1302 | 'include': '#property_list' 1303 | } 1304 | { 1305 | 'include': '#at_rule_mixin' 1306 | } 1307 | { 1308 | 'include': '#at_rule_media' 1309 | } 1310 | { 1311 | 'include': '#at_rule_function' 1312 | } 1313 | { 1314 | 'include': '#at_rule_charset' 1315 | } 1316 | { 1317 | 'include': '#at_rule_apply' 1318 | } 1319 | { 1320 | 'include': '#at_rule_option' 1321 | } 1322 | { 1323 | 'include': '#at_rule_namespace' 1324 | } 1325 | { 1326 | 'include': '#at_rule_nest' 1327 | } 1328 | { 1329 | 'include': '#at_rule_fontface' 1330 | } 1331 | { 1332 | 'include': '#at_rule_page' 1333 | } 1334 | { 1335 | 'include': '#at_rule_keyframes' 1336 | } 1337 | { 1338 | 'include': '#at_rule_at_root' 1339 | } 1340 | # Australian style sheets 1341 | { 1342 | 'match': '\\b(colour|zed-index)\\b(?=\\:|\\s\\s*)' 1343 | 'name': 'support.type.property-name.postcss' 1344 | } 1345 | { 1346 | 'match': '\\b(centre|yeah-nah|fair-dinkum|rack-off|woop-woop)\\b' 1347 | 'name': 'variable.property-value.postcss' 1348 | } 1349 | { 1350 | 'match': '(\\b|\\s)(!bloody-oath)\\b' 1351 | 'name': 'keyword.control.postcss' 1352 | } 1353 | { 1354 | 'match': '\\b(true-blue|vegemite|vb-green|kangaroo|koala)\\b' 1355 | 'name': 'support.constant.color.w3c-standard-color-name.postcss' 1356 | } 1357 | # Canadian style sheets 1358 | { 1359 | 'match': '(\\b|\\s)(!sorry)\\b' 1360 | 'name': 'keyword.control.postcss' 1361 | } 1362 | { 1363 | 'match': '\\b(grey)\\b' 1364 | 'name': 'support.constant.color.w3c-standard-color-name.postcss' 1365 | } 1366 | # German style sheets 1367 | { 1368 | 'match': '\\b(animation-verzögerung|animation-richtung|animation-dauer|animation-füll-methode|animation-wiederholung-anzahl|animation-name|animation-abspiel-zustand|animation-takt-funktion|animation|hintergrund-befestigung|hintergrund-beschnitt|hintergrund-farbe|hintergrund-bild|hintergrund-ursprung|hintergrund-position|hintergrund-wiederholung|hintergrund-größe|hintergrund|rahmen-unten-farbe|rahmen-unten-links-radius|rahmen-unten-rechts-radius|rahmen-unten-stil|rahmen-unten-breite|rahmen-unten|rahmen-kollaps|rahmen-farbe|rahmen-bild|rahmen-bild-anfang|rahmen-bild-wiederholung|rahmen-bild-schnitt|rahmen-bild-quelle|rahmen-bild-breite|rahmen-links-farbe|rahmen-links-stil|rahmen-links-breite|rahmen-links|rahmen-radius|rahmen-rechts-farbe|rahmen-rechts-stil|rahmen-rechts-breite|rahmen-rechts|rahmen-abstand|rahmen-stil|rahmen-oben-farbe|rahmen-oben-links-radius|rahmen-oben-rechts-radius|rahmen-oben-stil|rahmen-oben-breite|rahmen-oben|rahmen-breite|rahmen|unten|kasten-schatten|kasten-bemessung|beschriftung-seite|klären|beschnitt|farbe|spalten|spalte-anzahl|spalte-füllung|spalte-lücke|spalte-linie|spalte-linie-farbe|spalte-linie-stil|spalte-linie-breite|spalte-spanne|spalte-breite|inhalt|zähler-erhöhen|zähler-zurücksetzen|zeiger|anzeige|leere-zellen|filter|flex-grundlage|flex-richtung|flex-fluss|flex-wachsem|flex-schrumpfen|flex-umbruch|umlaufen|schrift-familie|schrift-eigenschaft-einstellungen|schrift-größe|schrift-größe-einstellen|schrift-stil|schrift-variante|schrift-gewicht|schrift|höhe|trennstriche|inhalt-ausrichten|links|zeichen-abstand|zeilen-umbruch|zeilen-höhe|listen-stil-bild|listen-stil-position|listen-stil-typ|listen-stil|außenabstand-unten|außenabstand-links|außenabstand-rechts|außenabstand-oben|außenabstand|max-höhe|max-breite|min-höhe|min-breite|deckkraft|reihenfolge|schusterjungen|kontur-farbe|kontur-abstand|kontur-stil|kontur-breite|kontur|überlauf-x|überlauf-y|überlauf|innenabstand-unten|innenabstand-left|innenabstand-rechts|innenabstand-oben|innenabstand|perspektive-ursprung|perspektive|zeiger-ereignisse|position|anführungszeichen|größenänderung|rechts|tabelle-gestaltung|tab-größe|text-ausrichten|text-verzierung|text-einrückung|text-orientierung|text-überlauf|text-wiedergabe|text-schatten|text-umformung|oben|übergang-verzögerung|übergang-dauer|übergang-eigenschaft|übergang-takt-funktion|übergang|unicode-bidi|vertikale-ausrichtung|sichtbarkeit|weißraum|hurenkinder|breite|wort-umbruch|wort-abstand|wort-umschlag|schreib-richtung|ebene)\\b(?=\\:|\\s\\s*)' 1369 | 'name': 'support.type.property-name.postcss' 1370 | } 1371 | { 1372 | 'match': '\\b(absolut|automatisch|fett|fixiert|versteckt|erben|initial|kursiv|links|nicht-wiederholen|keines|relativ|wiederholen-x|wiederholen-y|wiederholen|rechts|durchgezogen|statisch|aufheben)\\b' 1373 | 'name': 'variable.property-value.postcss' 1374 | } 1375 | { 1376 | 'match': '(\\b|\\s)(!wichtig)\\b' 1377 | 'name': 'keyword.control.postcss' 1378 | } 1379 | { 1380 | 'match': '\\b(eisfarben|antikweiß|wasser|aquamarinblau|beige|biskuit|mandelweiß|blauviolett|gelbbraun|kadettenblau|schokolade|kornblumenblau|mais|karmesinrot|dunkelblau|dunkeltürkis|dunklegoldrunenfarbe|dunkelgrün|dunkelgrau|dunkelkhaki|dunkelmagenta|dunkelolivgrün|dunkelorange|dunkleorchidee|dunkelrot|dunklelachsfarbe|dunklesseegrün|dunklesschieferblau|dunkelviolett|tiefrosa|tiefhimmelblau|gedimmtesgrau|persinningblau|backstein|blütenweiß|waldgrün|geisterweiß|grüngelb|honigmelone|leuchtendrosa|indischrot|elfenbein|staubfarbend|lavendelrosa|grasgrün|chiffongelb|hellblau|helleskorallenrot|helltürkis|hellgrau|hellgrün|hellrosa|hellelachsfarbe|hellesseegrün|helleshimmelblau|hellesschiefergrau|hellesstahlblau|hellgelb|limonengrün|leinen|kastanie|mitternachtsblau|cremigeminze|altrosa|mokassin|navajoweiß|marineblau|altespitze|olivgrünbraun|orangerot|orchidee|blassegoldrunenfarbe|blassegoldrunenfarbe|blasstürkis|blasstürkis|pfirsich|pflaume|taubenblau|violett|rosigesbraun|royalblau|sattelbraun|lachsfarben|sandbraun|seegrün|muschel|siennaerde|silber|schieferblau|schiefergrau|schneeweiß|frühlingsgrün|stahlblau|hautfarben|krickentengrün|distel|tomate|türkis|veilchen|weizen|rauchfarben|gelbgrün|himmelblau|schwarz|blau|koralle|cyan|grau|grün|rosa|lavendel|limone|orange|rot|weiß|gelb)\\b' 1381 | 'name': 'support.constant.color.w3c-standard-color-name.postcss' 1382 | } 1383 | # Russian style sheets 1384 | { 1385 | 'match': '\\b(ключевыекадры|анимация|имя-анимации|длительность-анимации|функция-времени-анимации|задержка-анимации|число-повторов-анимации|направление-анимации|статус-проигрывания-анимации|фон|положение-фона|цвет-фона|изображение-фона|позиция-фона|повтор-фона|обрезка-фона|начало-фона|размер-фона|граница|нижняя-граница|цвет-нижней-границы|стиль-нижней-границы|толщина-нижней-границы|цвет-границы|левая-граница|цвет-левой-границы|стиль-левой-границы|толщина-левой-границы|правая-граница|цвет-правой-границы|стиль-правой-границы|толщина-правой-границы|стиль-границы|верхняя-граница|цвет-верхней-границы|стиль-верхней-границы|толщина-верхней-границы|толщина-границы|контур|цвет-контура|стиль-контура|толщина-контура|радиус-нижней-левой-рамки|радиус-нижней-правой-рамки|изображение-рамки|начало-изображения-рамки|повтор-изображения-рамки|смещение-изображения-рамки|источник-изображения-рамки|толщина-изображения-рамки|радиус-рамки|радиус-верхней-левой-рамки|радиус-верхней-правой-рамки|разрыв-оформления-блока|тень-блока|переполнение-икс|переполнение-игрек|стиль-переполнения|поворот|точка-поворота|цветовой-профиль|непрозрачность|намерение-отрисовки|метка-закладки|уровень-закладки|цель-закладки|плавающий-сдвиг|дефисный-после|дефисный-до|дефисный-символ|дефисный-строки|дифисный-ресурс|дефисы|разрешение-изображения|маркировка|набор-строк|высота|макс-высота|макс-ширина|мин-высота|мин-ширина|ширина|выравнивание-блока|направление-блока|флекс-блок|группа-флекс-блока|линии-блока|порядок-группы-бокса|ориентация-бокса|пак-бокса|шрифт|семейство-шрифта|размер-шрифта|стиль-шрифта|вид-шрифта|вес-шрифта|определение-шрифта|подгонка-размера-шрифта|разрядка-шрифта|содержимое|инкремент-счетчика|сброс-счетчика|кавычки|обрезка|сдвинуть-на|политика-страницы|колонки-сетки|ряды-сетки|цель|имя-цели|новая-цель|позиция-цели|подгонка-выравнивания|выравнивание-базовой|сдвиг-базовой|домининация-базовой|выравнивание-строчного-блока|высота-текста|стиль-списка|изображение-стиля-списка|позиция-стиля-списка|тип-стиля-списка|поле|поле-снизу|поле-слева|поле-справа|поле-сверху|направление-шатра|количество-повторов-шатра|скорость-шатра|стиль-шатра|количество-колонок|заполнение-колонок|зазор-колонок|направляющая-колонок|цвет-направляющей-колонок|стиль-направляющей-колонок|ширина-направляющей-колонок|охват-колонок|ширина-колонок|колонки|отбивка|отбивка-снизу|отбивка-слева|отбивка-справа|отбивка-сверху|ориентация-изображения|страница|размер|снизу|очистить|обрезать|курсор|отображение|обтекание|слева|переполнение|положение|справа|сверху|видимость|зед-индекс|сироты|разрыв-страницы-после|разрыв-страницы-до|разрыв-страницы-внутри|вдовы|схлопывание-границ|расстояние-границ|сторона-подписи|пустые-ячейки|макет-таблицы|цвет|направление|мужбуквенный-пробел|высота-строки|выравнивание-текста|оформление-текста|отступ-текста|трансформация-текста|уникод-биди|вертикальное-выравнивание|пробелы|межсловный-пробел|висячая-пунктуация|обрезка-пунктуации|выравнивание-последней-строки|выключка-текста|контур-текста|переполнение-текста|тень-текста|подгонка-размера-текста|обертка-текста|разрыв-слова|обертка-слова|трансформация|точка-трансформации|стиль-трансформации|перспектива|точка-перспективы|видимость-задника|переход|свойство-перехода|длительность-перехода|функция-вренеми-перехода|задержка-перехода|представление|калибровка-блока|иконка|нав-вниз|нав-индекс|нав-влево|нав-вправо|нав-вверх|смещение-контура|ресайз|зум|фильтр|выделение-пользователем|сглаживание-шрифта|осх-сглаживание-шрифта|переполнение-прокрутки|ист)\\b(?=\\:|\\s\\s*)' 1386 | 'name': 'support.type.property-name.postcss' 1387 | } 1388 | { 1389 | 'match': '\\b(выше|абсолютный|абсолютная|абсолютное|после|псевдоним|все|всё|свободный-скролл|все-капителью|всё-капителью|позволить-конец|алфавитный|алфавитная|алфавитное|альтернативный|альтернативная|альтернативное|альтернативный-инвертированн|альтернативная-инвертированн|альтернативное-инвертированн|всегда|армянский|армянская|армянское|авто|избегать|избегать-колонку|избегать-страницу|назад|баланс|базоваялиния|перед|ниже|отменить-биди|мигать|блок|блокировать|блочное|жирный|более-жирный|по-границе|оба|нижний|перенос-всего|перенос-слов|капитализировать|ячейка|центр|круг|обрезать|клонировать|закрывающие-кавычки|ресайз-колонки|схлопнуть|колонка|инвертировать-колонки|насыщенный|содержать|содержит|по-содержимому|контекстное-меню|копия|копировать|покрыть|перекрестие|пунктирная|десятичный|десятичный-ведущий-ноль|обычный|потомки|диск|распространять|распространить|точка|точечный|двойной|двойной-круг|в-ресайз|легкость|легкость-в|легкость-в-из|легкость-из|края|эллипсис|вставленный|конец|зв-ресайз|расширен|экстра-конденсирован|экстра-расширен|заполнение|заполнен|первый|фиксирован|плоский|флекс|флекс-конец|флекс-старт|форсированный-конец|вперед|полной-ширины|грузинский|канавка|помощь|скрытый|спрятать|горизонтальный|горизонтальный-тб|иконка|бесконечный|бесконечная|бесконечное|наследовать|начальный|начальная|начальное|чернила|строчный|строчный-блок|строчный-флекс|строчная-таблица|вставка|внутри|между-кластером|между-иероглифом|между-словом|инвертированный|инвертированная|инвертированное|курсив|курсивный|выключитьстроку|кашида|сохранить-все|большое|больше|последний|последняя|последнее|слева|левый|легче|зачеркнуть|линейный|линейная|линейное|последний-пункт|локальный|локальная|локальное|свободный|свободная|свободное|нижний-буквенный|нижний-греческий|нижний-латинский|нижний-романский|нижний-регистр|лнп|ручной|соответствует-родителю|средний|средняя|среднее|посередине|смешенный-справа|двигать|с-ресайз|св-ресайз|свюз-ресайз|не-закрывать-кавычки|не-сбрасывать|не-открывать-кавычки|не-повторять|нет|ничего|нету|нормальный|не-разрешен|безобтекания|сю-ресайз|сз-ресайз|сзюв-ресайз|объекты|наклонный|наклонная|наклонное|открыт|открывающие-кавычки|начало|снаружи|оверлайн|по-отбивке|страница|пауза|указатель|пре|пре-линия|пре-обертка|прогресс|относительный|относительная|относительное|повтор|повтор-икс|повтор-игрек|обратный|обратная|обратное|хребет|справа|превый|правый|круглый|круглая|круглое|ряд|ряд-ресайз|обратный-ряд|пнл|бегущий|бегущяя|бегущее|ю-ресайз|уменьшить|уменьшать|скролл|юв-ресайз|полу-конденсирован|полу-расширен|отдельный|отдельная|отдельное|кунжут|показать|боком|боком-лева|боком-права|нарезать|маленький|маленький|капитель|меньше|сплошной|пробел|пробел-вокруг|пробел-между|пробелы|квадрат|старт|статический|шаг-конец|шаг-старт|растягивать|строгий|строгая|строгое|стиль|суб|над|юз-ресайз|таблица|заголовок-таблицы|ячейка-таблицы|колонка-таблицы|группа-колонок-талицы|группа-футера-таблицы|группа-заголовка-таблицы|ряд-таблицы|группа-ряда-таблицы|текст|текст-внизу|текст-наверху|толстый|тонкий|начертание-титров|верх|прозрачный|прозрачная|прозрачное|треугольный|треугольная|треугольное|сверх-конденсирован|сверх-расширен|под|подчеркнут|однорегистровый|однорегистровая|однорегистровое|отключенный|отключенная|отключенное|верхний-буквенный|верхний-латинский|верхний-романский|верхний-регистр|вертикально|использовать-ориентуцию-знака|вертикальный|вертикальная|вертикальное|вертикальный-лп|вертикальный-пл|вертикальный-текст|видимый|з-ресайз|ждать|волнистый|волнистая|волнистое|вес|обернуть|обернуть-обратный|оч-большой|оч-маленький|очоч-большой|очоч-маленький|призумить|отзумить)\\b' 1390 | 'name': 'variable.property-value.postcss' 1391 | } 1392 | { 1393 | 'match': '(\\b|\\s)(!важно)\\b' 1394 | 'name': 'keyword.control.postcss' 1395 | } 1396 | { 1397 | 'match': '\\b(красный|красная|красное|оранжевый|оранжевая|оранжевое|желтый|желтая|желтое|оливковый|оливковая|оливковое|пурпурный|пурпурное|пурпурная|фуксия|белый|белая|белое|лимонный|лимонная|лимонное|зеленый|зеленая|зеленое|темносиний|темносиняя|темносинее|синий|синяя|синее|водяной|водяная|водяное|бирюзовый|бирюзовая|бирюзовое|черный|черная|черное|серебряный|серебряная|серебряное|серый|серая|серое)\\b' 1398 | 'name': 'support.constant.color.w3c-standard-color-name.postcss' 1399 | } 1400 | { 1401 | 'match': '\\b(моноширинный|c-засечками|без-засечек|фантазийный|рукописный)\\b' 1402 | 'name': 'string.constant.font-name.postcss' 1403 | } 1404 | { 1405 | 'match': '\\b(кзс|вычс|кзсп|урл|аттр|от|до)\\b' 1406 | 'name': 'storage.name.tag.postcss' 1407 | } 1408 | # Spanish style sheets 1409 | { 1410 | 'match': '\\b(fondo|flota|ancho|alto|puntero|redondeado|izquierda|derecha|arriba|abajo|espaciado)\\b' 1411 | 'name': 'support.type.property-name.postcss(?=\\:|\\s\\s*)' 1412 | } 1413 | { 1414 | 'match': '\\b(subrayado|manito|mayuscula|izquierda|derecha|arriba|abajo)\\b' 1415 | 'name': 'variable.property-value.postcss' 1416 | } 1417 | { 1418 | 'match': '(\\b|\\s)(!importantisimo)\\b' 1419 | 'name': 'keyword.control.postcss' 1420 | } 1421 | # Swedish style sheets 1422 | { 1423 | 'match': '\\b(animering-fördröjning|animering-riktning|animering-längd|animering-fyllnads-metod|animering-upprepning-antal|animering-namn|animering-spelning-status|animering-tajming-funktion|animering|bakgrund-bilaga|bakgrund-klipp|bakgrund-färg|bakgrund-bild|bakgrund-ursprung|bakgrund-position|bakgrund-upprepning|bakgrund-storlek|bakgrund|kant-botten-färg|kant-botten-vänster-radie|kant-botten-höger-radie|kant-botten-stil|kant-botten-bredd|kant-botten|kant-kollaps|kant-färg|kant-bild|kant-bild-början|kant-bild-upprepning|kant-bild-snitt|kant-bild-källa|kant-bild-bredd|kant-vänster-färg|kant-vänster-stil|kant-vänster-bredd|kant-vänster|kant-radie|kant-höger-färg|kant-höger-stil|kant-höger-bredd|kant-höger|kant-avstånd|kant-stil|kant-topp-färg|kant-topp-vänster-radie|kant-topp-höger-radie|kant-topp-stil|kant-topp-bredd|kant-topp|kant-bredd|kant|botten|låda-skugga|låda-kalibrering|bildtext-sida|rensa|klipp|färg|kolumn|kolumn-antal|kolumn-fyllning|kolumn-mellanrum|kolumn-linje|kolumn-linje-färg|kolumn-linje-stil|kolumn-linje-bredd|kolumn-spann|kolumn-bredd|innehåll|räknare-ökning|räknare-återställ|muspekare|visa|tomma-celler|filter|flex-grund|flex-rikting|flex-flöde|flex-ökning|flex-förminskning|flex-omslutning|flex|flyt|typsnitt-familj|typsnitt-särdrag-inställningar|typsnitt-storlek|typsnitt-storlek-justering|typsnitt-stil|typsnitt-variant|typsnitt-vikt|typsnitt|höjd|bindestreck|justera-innehåll|vänster|bokstav-mellanrum|linje-brytning|linje-höjd|lista-stil-bild|lista-stil-position|lista-stil-typ|lista-stil|marginal-botten|marginal-vänster|marginal-höger|marginal-topp|marginal|max-höjd|max-bredd|min-höjd|min-bredd|opacitet|ordning|föräldralösa|kontur-färg|kontur-abstand|kontur-stil|kontur-bredd|kontur|överflöde-x|överflöde-y|överflöde|stoppning-botten|stoppning-left|stoppning-höger|stoppning-topp|stoppning|perspektiv-ursprung|perspektiv|pekare-händelser|position|citat|storleksändra|höger|tabell-layout|tab-storlek|text-riktning|text-dekoration|text-indrag|text-inriktning|text-överflöde|text-rendering|text-skugga|text-omvanlda|topp|övergång-fördröjning|övergång-längd|övergång-egenskap|övergång-tajming-funktion|övergång|unicode-bidi|vertikal-riktning|synlighet|luftrum|änkor|bredd|ord-brytning|ord-avstånd|ord-omslutning|skriv-rikting|nivå)\\b(?=\\:|\\s\\s*)' 1424 | 'name': 'support.type.property-name.postcss' 1425 | } 1426 | { 1427 | 'name': 'variable.property-value.postcss' 1428 | 'match': '\\b(absolut|automatisk|fet|fixerad|gömd|ärva|inledande|kursiv|vänster|ingen-upprepning|ingen|uppradad|uppradad-block|relativ|upprepning-x|upprepning-y|upprepning|höger|solid|statisk|urkoppla)\\b' 1429 | } 1430 | { 1431 | 'match': '(\\b|\\s)(!viktigt)\\b' 1432 | 'name': 'keyword.control.postcss' 1433 | } 1434 | { 1435 | 'match': '\\b(isfärg|antikvitt|vatten|marinblå|beige|kex|mandelvit|blålila|gulbrun|kadettenblå|choklad|kornblå|majs|crimson|mörkblå|mörkturkos|mörkgyllenröd|mörkgrön|mörkgrå|mörkkhaki|mörkrosa|mörkolivgrön|mörkorange|mörkorchidee|mörkröd|mörklaxrosa|mörkväxtgräs|mörkskifferblått|mörklila|djuprosa|djuphimmelblå|grummelgrå|skojarblå|tegelsten|vitsippa|skogsgrön|spökvit|gröngul|honungsmelon|hetrosa|indiskröd|elfenben|khaki|lavendelrosa|gräsgrön|chiffongul|himmelblå|ljuskorall|ljusturkos|ljusgrå|ljusgrön|ljusrosa|ljuselaxrosa|ljushavsgrön|ljushimmelblå|ljusskiffergrå|ljusstålblå|ljusgul|limegrön|linnen|kastanj|midnattsblå|mintkräm|gammelrosa|mokassin|navajovitt|marineblå|spets|olivgrönbrun|orangeröd|orchidee|blektgyllenröd|blektgrön|blektturkos|papayakräm|persikopuff|plommon|ljusblå|lila|skärbrun|royalblå|sadelbrun|laxrosa|sandbrun|havsgrön|snäcka|sienna|silver|skifferblå|skiffergrå|snövit|vårgrön|stålblå|hudfärg|blågrön|tistel|tomat|turkos|violett|vete|vitrök|gulgrön|himmelblå|svart|blå|koraller|cyan|grå|grön|rosa|lavendel|lime|orange|röd|vit|gul)\\b' 1436 | 'name': 'support.constant.color.w3c-standard-color-name.postcss' 1437 | } 1438 | ] 1439 | --------------------------------------------------------------------------------