| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666 | const MODES = (hljs) => {  return {    IMPORTANT: {      className: 'meta',      begin: '!important'    },    HEXCOLOR: {      className: 'number',      begin: '#([a-fA-F0-9]{6}|[a-fA-F0-9]{3})'    },    ATTRIBUTE_SELECTOR_MODE: {      className: 'selector-attr',      begin: /\[/,      end: /\]/,      illegal: '$',      contains: [        hljs.APOS_STRING_MODE,        hljs.QUOTE_STRING_MODE      ]    }  };};const TAGS = [  'a',  'abbr',  'address',  'article',  'aside',  'audio',  'b',  'blockquote',  'body',  'button',  'canvas',  'caption',  'cite',  'code',  'dd',  'del',  'details',  'dfn',  'div',  'dl',  'dt',  'em',  'fieldset',  'figcaption',  'figure',  'footer',  'form',  'h1',  'h2',  'h3',  'h4',  'h5',  'h6',  'header',  'hgroup',  'html',  'i',  'iframe',  'img',  'input',  'ins',  'kbd',  'label',  'legend',  'li',  'main',  'mark',  'menu',  'nav',  'object',  'ol',  'p',  'q',  'quote',  'samp',  'section',  'span',  'strong',  'summary',  'sup',  'table',  'tbody',  'td',  'textarea',  'tfoot',  'th',  'thead',  'time',  'tr',  'ul',  'var',  'video'];const MEDIA_FEATURES = [  'any-hover',  'any-pointer',  'aspect-ratio',  'color',  'color-gamut',  'color-index',  'device-aspect-ratio',  'device-height',  'device-width',  'display-mode',  'forced-colors',  'grid',  'height',  'hover',  'inverted-colors',  'monochrome',  'orientation',  'overflow-block',  'overflow-inline',  'pointer',  'prefers-color-scheme',  'prefers-contrast',  'prefers-reduced-motion',  'prefers-reduced-transparency',  'resolution',  'scan',  'scripting',  'update',  'width',  // TODO: find a better solution?  'min-width',  'max-width',  'min-height',  'max-height'];// https://developer.mozilla.org/en-US/docs/Web/CSS/Pseudo-classesconst PSEUDO_CLASSES = [  'active',  'any-link',  'blank',  'checked',  'current',  'default',  'defined',  'dir', // dir()  'disabled',  'drop',  'empty',  'enabled',  'first',  'first-child',  'first-of-type',  'fullscreen',  'future',  'focus',  'focus-visible',  'focus-within',  'has', // has()  'host', // host or host()  'host-context', // host-context()  'hover',  'indeterminate',  'in-range',  'invalid',  'is', // is()  'lang', // lang()  'last-child',  'last-of-type',  'left',  'link',  'local-link',  'not', // not()  'nth-child', // nth-child()  'nth-col', // nth-col()  'nth-last-child', // nth-last-child()  'nth-last-col', // nth-last-col()  'nth-last-of-type', //nth-last-of-type()  'nth-of-type', //nth-of-type()  'only-child',  'only-of-type',  'optional',  'out-of-range',  'past',  'placeholder-shown',  'read-only',  'read-write',  'required',  'right',  'root',  'scope',  'target',  'target-within',  'user-invalid',  'valid',  'visited',  'where' // where()];// https://developer.mozilla.org/en-US/docs/Web/CSS/Pseudo-elementsconst PSEUDO_ELEMENTS = [  'after',  'backdrop',  'before',  'cue',  'cue-region',  'first-letter',  'first-line',  'grammar-error',  'marker',  'part',  'placeholder',  'selection',  'slotted',  'spelling-error'];const ATTRIBUTES = [  'align-content',  'align-items',  'align-self',  'animation',  'animation-delay',  'animation-direction',  'animation-duration',  'animation-fill-mode',  'animation-iteration-count',  'animation-name',  'animation-play-state',  'animation-timing-function',  'auto',  'backface-visibility',  'background',  'background-attachment',  'background-clip',  'background-color',  'background-image',  'background-origin',  'background-position',  'background-repeat',  'background-size',  'border',  'border-bottom',  'border-bottom-color',  'border-bottom-left-radius',  'border-bottom-right-radius',  'border-bottom-style',  'border-bottom-width',  'border-collapse',  'border-color',  'border-image',  'border-image-outset',  'border-image-repeat',  'border-image-slice',  'border-image-source',  'border-image-width',  'border-left',  'border-left-color',  'border-left-style',  'border-left-width',  'border-radius',  'border-right',  'border-right-color',  'border-right-style',  'border-right-width',  'border-spacing',  'border-style',  'border-top',  'border-top-color',  'border-top-left-radius',  'border-top-right-radius',  'border-top-style',  'border-top-width',  'border-width',  'bottom',  'box-decoration-break',  'box-shadow',  'box-sizing',  'break-after',  'break-before',  'break-inside',  'caption-side',  'clear',  'clip',  'clip-path',  'color',  'column-count',  'column-fill',  'column-gap',  'column-rule',  'column-rule-color',  'column-rule-style',  'column-rule-width',  'column-span',  'column-width',  'columns',  'content',  'counter-increment',  'counter-reset',  'cursor',  'direction',  'display',  'empty-cells',  'filter',  'flex',  'flex-basis',  'flex-direction',  'flex-flow',  'flex-grow',  'flex-shrink',  'flex-wrap',  'float',  'font',  'font-display',  'font-family',  'font-feature-settings',  'font-kerning',  'font-language-override',  'font-size',  'font-size-adjust',  'font-smoothing',  'font-stretch',  'font-style',  'font-variant',  'font-variant-ligatures',  'font-variation-settings',  'font-weight',  'height',  'hyphens',  'icon',  'image-orientation',  'image-rendering',  'image-resolution',  'ime-mode',  'inherit',  'initial',  'justify-content',  'left',  'letter-spacing',  'line-height',  'list-style',  'list-style-image',  'list-style-position',  'list-style-type',  'margin',  'margin-bottom',  'margin-left',  'margin-right',  'margin-top',  'marks',  'mask',  'max-height',  'max-width',  'min-height',  'min-width',  'nav-down',  'nav-index',  'nav-left',  'nav-right',  'nav-up',  'none',  'normal',  'object-fit',  'object-position',  'opacity',  'order',  'orphans',  'outline',  'outline-color',  'outline-offset',  'outline-style',  'outline-width',  'overflow',  'overflow-wrap',  'overflow-x',  'overflow-y',  'padding',  'padding-bottom',  'padding-left',  'padding-right',  'padding-top',  'page-break-after',  'page-break-before',  'page-break-inside',  'perspective',  'perspective-origin',  'pointer-events',  'position',  'quotes',  'resize',  'right',  'src', // @font-face  'tab-size',  'table-layout',  'text-align',  'text-align-last',  'text-decoration',  'text-decoration-color',  'text-decoration-line',  'text-decoration-style',  'text-indent',  'text-overflow',  'text-rendering',  'text-shadow',  'text-transform',  'text-underline-position',  'top',  'transform',  'transform-origin',  'transform-style',  'transition',  'transition-delay',  'transition-duration',  'transition-property',  'transition-timing-function',  'unicode-bidi',  'vertical-align',  'visibility',  'white-space',  'widows',  'width',  'word-break',  'word-spacing',  'word-wrap',  'z-index'  // reverse makes sure longer attributes `font-weight` are matched fully  // instead of getting false positives on say `font`].reverse();// some grammars use them all as a single groupconst PSEUDO_SELECTORS = PSEUDO_CLASSES.concat(PSEUDO_ELEMENTS);/*Language: LessDescription: It's CSS, with just a little more.Author:   Max Mikhailov <seven.phases.max@gmail.com>Website: http://lesscss.orgCategory: common, css*//** @type LanguageFn */function less(hljs) {  const modes = MODES(hljs);  const PSEUDO_SELECTORS$1 = PSEUDO_SELECTORS;  const AT_MODIFIERS = "and or not only";  const IDENT_RE = '[\\w-]+'; // yes, Less identifiers may begin with a digit  const INTERP_IDENT_RE = '(' + IDENT_RE + '|@\\{' + IDENT_RE + '\\})';  /* Generic Modes */  const RULES = []; const VALUE_MODES = []; // forward def. for recursive modes  const STRING_MODE = function(c) {    return {    // Less strings are not multiline (also include '~' for more consistent coloring of "escaped" strings)      className: 'string',      begin: '~?' + c + '.*?' + c    };  };  const IDENT_MODE = function(name, begin, relevance) {    return {      className: name,      begin: begin,      relevance: relevance    };  };  const AT_KEYWORDS = {    $pattern: /[a-z-]+/,    keyword: AT_MODIFIERS,    attribute: MEDIA_FEATURES.join(" ")  };  const PARENS_MODE = {    // used only to properly balance nested parens inside mixin call, def. arg list    begin: '\\(',    end: '\\)',    contains: VALUE_MODES,    keywords: AT_KEYWORDS,    relevance: 0  };  // generic Less highlighter (used almost everywhere except selectors):  VALUE_MODES.push(    hljs.C_LINE_COMMENT_MODE,    hljs.C_BLOCK_COMMENT_MODE,    STRING_MODE("'"),    STRING_MODE('"'),    hljs.CSS_NUMBER_MODE, // fixme: it does not include dot for numbers like .5em :(    {      begin: '(url|data-uri)\\(',      starts: {        className: 'string',        end: '[\\)\\n]',        excludeEnd: true      }    },    modes.HEXCOLOR,    PARENS_MODE,    IDENT_MODE('variable', '@@?' + IDENT_RE, 10),    IDENT_MODE('variable', '@\\{' + IDENT_RE + '\\}'),    IDENT_MODE('built_in', '~?`[^`]*?`'), // inline javascript (or whatever host language) *multiline* string    { // @media features (it’s here to not duplicate things in AT_RULE_MODE with extra PARENS_MODE overriding):      className: 'attribute',      begin: IDENT_RE + '\\s*:',      end: ':',      returnBegin: true,      excludeEnd: true    },    modes.IMPORTANT  );  const VALUE_WITH_RULESETS = VALUE_MODES.concat({    begin: /\{/,    end: /\}/,    contains: RULES  });  const MIXIN_GUARD_MODE = {    beginKeywords: 'when',    endsWithParent: true,    contains: [      {        beginKeywords: 'and not'      }    ].concat(VALUE_MODES) // using this form to override VALUE’s 'function' match  };  /* Rule-Level Modes */  const RULE_MODE = {    begin: INTERP_IDENT_RE + '\\s*:',    returnBegin: true,    end: /[;}]/,    relevance: 0,    contains: [      {        begin: /-(webkit|moz|ms|o)-/      },      {        className: 'attribute',        begin: '\\b(' + ATTRIBUTES.join('|') + ')\\b',        end: /(?=:)/,        starts: {          endsWithParent: true,          illegal: '[<=$]',          relevance: 0,          contains: VALUE_MODES        }      }    ]  };  const AT_RULE_MODE = {    className: 'keyword',    begin: '@(import|media|charset|font-face|(-[a-z]+-)?keyframes|supports|document|namespace|page|viewport|host)\\b',    starts: {      end: '[;{}]',      keywords: AT_KEYWORDS,      returnEnd: true,      contains: VALUE_MODES,      relevance: 0    }  };  // variable definitions and calls  const VAR_RULE_MODE = {    className: 'variable',    variants: [      // using more strict pattern for higher relevance to increase chances of Less detection.      // this is *the only* Less specific statement used in most of the sources, so...      // (we’ll still often loose to the css-parser unless there's '//' comment,      // simply because 1 variable just can't beat 99 properties :)      {        begin: '@' + IDENT_RE + '\\s*:',        relevance: 15      },      {        begin: '@' + IDENT_RE      }    ],    starts: {      end: '[;}]',      returnEnd: true,      contains: VALUE_WITH_RULESETS    }  };  const SELECTOR_MODE = {    // first parse unambiguous selectors (i.e. those not starting with tag)    // then fall into the scary lookahead-discriminator variant.    // this mode also handles mixin definitions and calls    variants: [      {        begin: '[\\.#:&\\[>]',        end: '[;{}]' // mixin calls end with ';'      },      {        begin: INTERP_IDENT_RE,        end: /\{/      }    ],    returnBegin: true,    returnEnd: true,    illegal: '[<=\'$"]',    relevance: 0,    contains: [      hljs.C_LINE_COMMENT_MODE,      hljs.C_BLOCK_COMMENT_MODE,      MIXIN_GUARD_MODE,      IDENT_MODE('keyword', 'all\\b'),      IDENT_MODE('variable', '@\\{' + IDENT_RE + '\\}'), // otherwise it’s identified as tag      {        begin: '\\b(' + TAGS.join('|') + ')\\b',        className: 'selector-tag'      },      IDENT_MODE('selector-tag', INTERP_IDENT_RE + '%?', 0), // '%' for more consistent coloring of @keyframes "tags"      IDENT_MODE('selector-id', '#' + INTERP_IDENT_RE),      IDENT_MODE('selector-class', '\\.' + INTERP_IDENT_RE, 0),      IDENT_MODE('selector-tag', '&', 0),      modes.ATTRIBUTE_SELECTOR_MODE,      {        className: 'selector-pseudo',        begin: ':(' + PSEUDO_CLASSES.join('|') + ')'      },      {        className: 'selector-pseudo',        begin: '::(' + PSEUDO_ELEMENTS.join('|') + ')'      },      {        begin: '\\(',        end: '\\)',        contains: VALUE_WITH_RULESETS      }, // argument list of parametric mixins      {        begin: '!important'      } // eat !important after mixin call or it will be colored as tag    ]  };  const PSEUDO_SELECTOR_MODE = {    begin: IDENT_RE + ':(:)?' + `(${PSEUDO_SELECTORS$1.join('|')})`,    returnBegin: true,    contains: [ SELECTOR_MODE ]  };  RULES.push(    hljs.C_LINE_COMMENT_MODE,    hljs.C_BLOCK_COMMENT_MODE,    AT_RULE_MODE,    VAR_RULE_MODE,    PSEUDO_SELECTOR_MODE,    RULE_MODE,    SELECTOR_MODE  );  return {    name: 'Less',    case_insensitive: true,    illegal: '[=>\'/<($"]',    contains: RULES  };}module.exports = less;
 |