--- comment: Complete Rewrite of the SCSS Grammar by Mario "Kuroir" Ricalde (http://kuroir.com) fileTypes: - scss foldingStartMarker: /\*\*(?!\*)|\{\s*($|/\*(?!.*?\*/.*\S)) foldingStopMarker: (?\=|\<|\>|from|through) name: keyword.control.operator - include: ! '#variable' - include: ! '#property_values' - include: $self function_attributes: patterns: - match: ! ':' name: punctuation.definition - include: ! '#general' - include: ! '#property_values' - comment: We even have error highlighting <3 match: ! '[=\{\}\?\;\@]' name: invalid.illegal functions: patterns: - begin: ([\w-]{1,})(\()\s* beginCaptures: '1': name: support.function.misc.css '2': name: punctuation.section.function.css end: (\)) endCaptures: '1': name: punctuation.section.function.css patterns: - include: ! '#parameters' - match: ([\w-]{1,}) name: support.function.misc.css general: comment: Stuff that should be everywhere patterns: - include: ! '#variable' - include: ! '#comment_block' - include: ! '#comment_line' if: begin: \s{0,}((@)(if)\b) captures: '1': name: keyword.control.if.scss '2': name: punctuation.definition.keyword.css end: (?={) name: meta.at-rule.if.scss patterns: - include: ! '#logical_operators' - include: ! '#variable' - include: ! '#property_values' import: begin: \s*((@)(import)\b) captures: '1': name: keyword.control.at-rule.import.css '2': name: punctuation.definition.keyword.css end: \s*((?=;|\})) name: meta.at-rule.import.css patterns: - include: ! '#variable' - include: ! '#string_single' - include: ! '#string_double' - include: ! '#functions' include: begin: \s*((@)(include)\b) captures: '1': name: keyword.control.at-rule.import.css '2': name: punctuation.definition.keyword.css end: \s*((?=;|\})) name: meta.at-rule.include.css patterns: - include: ! '#functions' interpolation: begin: ! '#\{' end: \} name: variable.interpolation.scss patterns: - include: ! '#property_values' - include: ! '#variable' logical_operators: match: (\=\=|\!\=|\<\=|\>\=|\<|\>|not|or|and) name: keyword.control.operator parameters: patterns: - include: ! '#variable' - include: ! '#property_values' - include: ! '#comment_line' - include: ! '#comment_block' - match: ! '[^''",) \t]+' name: variable.parameter.url.css - match: ! ',' name: punctuation.css property_list: begin: \{ captures: '0': name: punctuation.section.property-list.css end: \} name: meta.property-list.css patterns: - include: ! '#flow_control' - include: ! '#rules' property_name: comment: Reversal order is important; KEEP IT. Also when adding new properties add them to the error checker below! match: \b(z-index|y|x|wrap|word-wrap|word-spacing|word-break|word|width|widows|white-space-collapse|white-space|white|weight|volume|voice-volume|voice-stress|voice-rate|voice-pitch-range|voice-pitch|voice-family|voice-duration|voice-balance|voice|visibility|vertical-align|variant|user-select|up|unicode-bidi|unicode|trim|transition-timing-function|transition-property|transition-duration|transition-delay|transition|transform|top-width|top-style|top-right-radius|top-left-radius|top-color|top|timing-function|text-wrap|text-transform|text-shadow|text-replace|text-outline|text-justify|text-indent|text-height|text-emphasis|text-decoration|text-align-last|text-align|text|target-position|target-new|target-name|target|table-layout|tab-side|style-type|style-position|style-image|style|string-set|stretch|stress|stacking-strategy|stacking-shift|stacking-ruby|stacking|speed|speech-rate|speech|speak-punctuation|speak-numeral|speak-header|speak|span|spacing|space-collapse|space|sizing|size-adjust|size|shadow|rule-width|rule-style|rule-color|rule|ruby-span|ruby-position|ruby-overhang|ruby-align|ruby|rows|rotation-point|rotation|role|right-width|right-style|right-color|right|richness|rest-before|rest-after|rest|resource|resolution|resize|reset|replace|repeat|rendering-intent|rate|radius|quotes|punctuation-trim|punctuation|property|profile|presentation-level|presentation|position|point|play-state|play-during|play-count|pitch-range|pitch|phonemes|pause-before|pause-after|pause|page-policy|page-break-inside|page-break-before|page-break-after|page|padding-top|padding-right|padding-left|padding-bottom|padding|pack|overhang|overflow-y|overflow-x|overflow-style|overflow|outline-width|outline-style|outline-offset|outline-color|outline|orphans|origin|orientation|orient|ordinal-group|opacity|offset|numeral|new|nav-up|nav-right|nav-left|nav-index|nav-down|nav|name|move-to|model|min-width|min-height|min|max-width|max-height|max|marquee-style|marquee-speed|marquee-play-count|marquee-direction|marquee|marks|mark-before|mark-after|mark|margin-top|margin-right|margin-left|margin-bottom|margin|list-style-type|list-style-position|list-style-image|list-style|list|lines|line-stacking-strategy|line-stacking-shift|line-stacking-ruby|line-stacking|line-height|line|level|letter-spacing|length|left-width|left-style|left-color|left|label|justify|iteration-count|inline-box-align|initial-value|initial-size|initial-before-align|initial-before-adjust|initial-after-align|initial-after-adjust|index|indent|increment|image-resolution|image-orientation|image|icon|hyphens|hyphenate-resource|hyphenate-lines|hyphenate-character|hyphenate-before|hyphenate-after|hyphenate|height|header|hanging-punctuation|grid-rows|grid-columns|grid|gap|font-weight|font-variant|font-style|font-stretch|font-size-adjust|font-size|font-family|font|float-offset|float|flex-group|flex|fit-position|fit|fill|family|empty-cells|emphasis|elevation|duration|drop-initial-value|drop-initial-size|drop-initial-before-align|drop-initial-before-adjust|drop-initial-after-align|drop-initial-after-adjust|drop|down|dominant-baseline|display-role|display-model|display|direction|delay|decoration-break|decoration|cursor|cue-before|cue-after|cue|crop|counter-reset|counter-increment|counter|count|content|columns|column-width|column-span|column-rule-width|column-rule-style|column-rule-color|column-rule|column-gap|column-fill|column-count|column-break-before|column-break-after|column|color-profile|color|collapse|clip|clear|character|caption-side|break-inside|break-before|break-after|break|box-sizing|box-shadow|box-pack|box-orient|box-ordinal-group|box-lines|box-flex-group|box-flex|box-direction|box-decoration-break|box-align|box|bottom-width|bottom-style|bottom-right-radius|bottom-left-radius|bottom-color|bottom|border-width|border-top-width|border-top-style|border-top-right-radius|border-top-left-radius|border-top-color|border-top|border-style|border-spacing|border-right-width|border-right-style|border-right-color|border-right|border-radius|border-length|border-left-width|border-left-style|border-left-color|border-left|border-image|border-color|border-collapse|border-bottom-width|border-bottom-style|border-bottom-right-radius|border-bottom-left-radius|border-bottom-color|border-bottom|border|bookmark-target|bookmark-level|bookmark-label|bookmark|binding|bidi|before|baseline-shift|baseline|balance|background-size|background-repeat|background-position|background-origin|background-image|background-color|background-clip|background-break|background-attachment|background|azimuth|attachment|appearance|animation-timing-function|animation-play-state|animation-name|animation-iteration-count|animation-duration|animation-direction|animation-delay|animation|alignment-baseline|alignment-adjust|alignment|align-last|align|after|adjust)\b name: support.type.property-name.css property_name_error: match: (?(['"])(?:[^\\]|\\.)*?(\6)))))?\s*(\]) name: meta.attribute-selector.css selector_class: captures: '1': name: punctuation.definition.entity.css match: (\.)[a-zA-Z0-9_-]+ name: entity.other.attribute-name.class.css selector_entities: match: \b(a|abbr|address|area|article|aside|audio|b|base|bdo|blockquote|body|br|button|canvas|caption|cite|code|col|colgroup|command|datalist|dd|del|details|dfn|div|dl|dt|em|embed|fieldset|figcaption|figure|footer|form|(h[1-6])|head|header|hgroup|hr|html|i|iframe|img|input|ins|keygen|kbd|label|legend|li|link|map|mark|menu|meta|meter|nav|noscript|object|ol|optgroup|option|output|p|param|pre|progress|q|rp|rt|ruby|samp|script|section|select|small|source|span|strong|style|sub|summary|sup|table|tbody|td|textarea|tfoot|th|thead|time|title|tr|ul|var|video)\b name: entity.name.tag.css selector_id: captures: '1': name: punctuationctuation.definition.entity.css match: (#)[a-zA-Z][a-zA-Z0-9_-]* name: entity.other.attribute-name.id.css selector_pseudo_class: captures: '1': name: punctuation.definition.entity.css match: (:)\b(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)\b name: entity.other.attribute-name.pseudo-class.css selector_pseudo_element: captures: '1': name: punctuation.definition.entity.css match: (:+)\b(after|before|first-letter|first-line|selection)\b name: entity.other.attribute-name.pseudo-element.css selectors: comment: Stuff for Selectors. patterns: - include: ! '#selector_entities' - include: ! '#selector_class' - include: ! '#selector_id' - include: ! '#selector_pseudo_class' - include: ! '#tag_wildcard' - include: ! '#tag_parent_reference' - include: ! '#selector_pseudo_element' - include: ! '#selector_attribute' string_double: begin: ! '"' beginCaptures: '0': name: punctuation.definition.string.begin.css end: ! '"' endCaptures: '0': name: punctuation.definition.string.end.css name: string.quoted.double.css patterns: - match: \\. name: constant.character.escape.css string_single: begin: ! '''' beginCaptures: '0': name: punctuation.definition.string.begin.css end: ! '''' endCaptures: '0': name: punctuation.definition.string.end.css name: string.quoted.single.css patterns: - match: \\. name: constant.character.escape.css tag_parent_reference: match: \& name: entity.name.tag.reference.css tag_wildcard: match: \* name: entity.name.tag.wildcard.css variable: patterns: - include: ! '#variables' - include: ! '#interpolation' variable_setting: begin: (\$[\w\-]+)\s{0,}(:) captures: '1': name: variable '2': name: punctuation end: ; name: meta.set.variable patterns: - include: ! '#property_values' - include: ! '#variable' variables: captures: '1': name: variable.scss match: (\s*)(\$[a-zA-Z0-9_-]+) name: variable.scss warn: begin: \s*((@)(warn|debug)\b) captures: '1': name: keyword.control.warn.scss '2': name: punctuation.definition.keyword.css end: (?=\;) name: meta.at-rule.warn.scss patterns: - include: ! '#variable' - include: ! '#string_double' - include: ! '#string_single' while: begin: \s{0,}((@)(while)\b) captures: '1': name: keyword.control.while.scss '2': name: punctuation.definition.keyword.css end: (?={) name: meta.at-rule.while.scss patterns: - include: ! '#logical_operators' - include: ! '#variable' - include: ! '#property_values' - include: $self scopeName: source.scss uuid: 3D9ADE5E-ADC5-460F-97B3-B61EF5A18273