"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
    return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const html_tags_1 = __importDefault(require("html-tags"));
const void_1 = __importDefault(require("html-tags/void"));
const known_css_properties_1 = __importDefault(require("known-css-properties"));
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 = [...html_tags_1.default, ...void_1.default];
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-classes
const PSEUDO_CLASSES = [
    'active',
    'any-link',
    'blank',
    'checked',
    'current',
    'default',
    'defined',
    'dir',
    'disabled',
    'drop',
    'empty',
    'enabled',
    'first',
    'first-child',
    'first-of-type',
    'fullscreen',
    'future',
    'focus',
    'focus-visible',
    'focus-within',
    'has',
    'host',
    'host-context',
    'hover',
    'indeterminate',
    'in-range',
    'invalid',
    'is',
    'lang',
    'last-child',
    'last-of-type',
    'left',
    'link',
    'local-link',
    'not',
    'nth-child',
    'nth-col',
    'nth-last-child',
    'nth-last-col',
    'nth-last-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-elements
const PSEUDO_ELEMENTS = [
    'after',
    'backdrop',
    'before',
    'cue',
    'cue-region',
    'first-letter',
    'first-line',
    'grammar-error',
    'marker',
    'part',
    'placeholder',
    'selection',
    'slotted',
    'spelling-error',
];
const ATTRIBUTES = known_css_properties_1.default.all.reverse();
/*
Language: css
Description: Scss is an extension of the syntax of CSS.
Author: Kurt Emch <kurt@kurtemch.com>
Website: https://sass-lang.com
Category: common, css
*/
/** @type LanguageFn */
function css(hljs) {
    const modes = MODES(hljs);
    const PSEUDO_ELEMENTS$1 = PSEUDO_ELEMENTS;
    const PSEUDO_CLASSES$1 = PSEUDO_CLASSES;
    const AT_IDENTIFIER = '@[a-z-.]+'; // @font-face
    const AT_MODIFIERS = 'and or not only';
    const IDENT_RE = '[a-zA-Z-.][a-zA-Z0-9_.-]*';
    const VARIABLE = {
        className: 'variable',
        begin: '(\\$' + IDENT_RE + ')\\b',
    };
    const ret = {
        name: 'CSS',
        case_insensitive: true,
        illegal: "[=/|']",
        contains: [
            {
                className: 'sugar-function',
                begin: 'sugar\\.[a-zA-Z0-9-_\\.]+',
                contains: [hljs.QUOTE_STRING_MODE, hljs.APOS_STRING_MODE],
            },
            {
                className: 'sugar-mixin',
                begin: '@sugar\\.[a-zA-Z0-9-_\\.]+',
                contains: [hljs.QUOTE_STRING_MODE, hljs.APOS_STRING_MODE],
            },
            hljs.C_LINE_COMMENT_MODE,
            hljs.C_BLOCK_COMMENT_MODE,
            {
                className: 'selector-id',
                begin: '#[A-Za-z0-9_-]+',
                relevance: 0,
            },
            {
                className: 'selector-class',
                begin: '\\.[A-Za-z0-9_-]+',
                relevance: 0,
            },
            modes.ATTRIBUTE_SELECTOR_MODE,
            {
                className: 'selector-tag',
                begin: '\\b(' + TAGS.join('|') + ')\\b',
                // was there, before, but why?
                relevance: 0,
            },
            {
                className: 'selector-pseudo',
                begin: ':(' + PSEUDO_CLASSES$1.join('|') + ')',
            },
            {
                className: 'selector-pseudo',
                begin: '::(' + PSEUDO_ELEMENTS$1.join('|') + ')',
            },
            VARIABLE,
            {
                // pseudo-selector params
                begin: /\(/,
                end: /\)/,
                contains: [hljs.NUMBER_MODE],
            },
            {
                className: 'attribute',
                begin: '\\b(' + ATTRIBUTES.join('|') + ')\\b',
            },
            {
                begin: '\\b(whitespace|wait|w-resize|visible|vertical-text|vertical-ideographic|uppercase|upper-roman|upper-alpha|underline|transparent|top|thin|thick|text|text-top|text-bottom|tb-rl|table-header-group|table-footer-group|sw-resize|super|strict|static|square|solid|small-caps|separate|se-resize|scroll|s-resize|rtl|row-resize|ridge|right|repeat|repeat-y|repeat-x|relative|progress|pointer|overline|outside|outset|oblique|nowrap|not-allowed|normal|none|nw-resize|no-repeat|no-drop|newspaper|ne-resize|n-resize|move|middle|medium|ltr|lr-tb|lowercase|lower-roman|lower-alpha|loose|list-item|line|line-through|line-edge|lighter|left|keep-all|justify|italic|inter-word|inter-ideograph|inside|inset|inline|inline-block|inherit|inactive|ideograph-space|ideograph-parenthesis|ideograph-numeric|ideograph-alpha|horizontal|hidden|help|hand|groove|fixed|ellipsis|e-resize|double|dotted|distribute|distribute-space|distribute-letter|distribute-all-lines|disc|disabled|default|decimal|dashed|crosshair|collapse|col-resize|circle|char|center|capitalize|break-word|break-all|bottom|both|bolder|bold|block|bidi-override|below|baseline|auto|always|all-scroll|absolute|table|table-cell)\\b',
            },
            // {
            //   begin: ':',
            //   end: ';',
            //   contains: [
            //     VARIABLE,
            //     modes.HEXCOLOR,
            //     hljs.NUMBER_MODE,
            //     hljs.QUOTE_STRING_MODE,
            //     hljs.APOS_STRING_MODE,
            //     modes.IMPORTANT
            //   ]
            // },
            // matching these here allows us to treat them more like regular CSS
            // rules so everything between the {} gets regular rule highlighting,
            // which is what we want for page and font-face
            {
                begin: '@(page|font-face)',
                lexemes: AT_IDENTIFIER,
                keywords: '@page @font-face',
            },
            {
                begin: '@',
                end: '[{;]',
                returnBegin: true,
                keywords: {
                    $pattern: /[a-zA-Z-\.]+/,
                    keyword: AT_MODIFIERS,
                    attribute: MEDIA_FEATURES.join(' '),
                },
                contains: [
                    {
                        begin: AT_IDENTIFIER,
                        className: 'keyword',
                    },
                    {
                        begin: /[a-zA-Z\.-]+(?=:)/,
                        className: 'attribute',
                    },
                    VARIABLE,
                    hljs.QUOTE_STRING_MODE,
                    hljs.APOS_STRING_MODE,
                    modes.HEXCOLOR,
                    hljs.NUMBER_MODE,
                ],
            },
        ],
    };
    return ret;
}
exports.default = css;
//# sourceMappingURL=data:application/json;base64, 