@wolf-scope/wolf-ui
Version:
UI library for web applications using Lit
705 lines (704 loc) • 14.5 kB
JavaScript
const l = (e) => ({
IMPORTANT: {
scope: "meta",
begin: "!important"
},
BLOCK_COMMENT: e.C_BLOCK_COMMENT_MODE,
HEXCOLOR: {
scope: "number",
begin: /#(([0-9a-fA-F]{3,4})|(([0-9a-fA-F]{2}){3,4}))\b/
},
FUNCTION_DISPATCH: {
className: "built_in",
begin: /[\w-]+(?=\()/
},
ATTRIBUTE_SELECTOR_MODE: {
scope: "selector-attr",
begin: /\[/,
end: /\]/,
illegal: "$",
contains: [
e.APOS_STRING_MODE,
e.QUOTE_STRING_MODE
]
},
CSS_NUMBER_MODE: {
scope: "number",
begin: e.NUMBER_RE + "(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",
relevance: 0
},
CSS_VARIABLE: {
className: "attr",
begin: /--[A-Za-z][A-Za-z0-9_-]*/
}
}), s = [
"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"
], d = [
"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"
], c = [
"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()
], b = [
"after",
"backdrop",
"before",
"cue",
"cue-region",
"first-letter",
"first-line",
"grammar-error",
"marker",
"part",
"placeholder",
"selection",
"slotted",
"spelling-error"
], g = [
"align-content",
"align-items",
"align-self",
"all",
"animation",
"animation-delay",
"animation-direction",
"animation-duration",
"animation-fill-mode",
"animation-iteration-count",
"animation-name",
"animation-play-state",
"animation-timing-function",
"backface-visibility",
"background",
"background-attachment",
"background-blend-mode",
"background-clip",
"background-color",
"background-image",
"background-origin",
"background-position",
"background-repeat",
"background-size",
"block-size",
"border",
"border-block",
"border-block-color",
"border-block-end",
"border-block-end-color",
"border-block-end-style",
"border-block-end-width",
"border-block-start",
"border-block-start-color",
"border-block-start-style",
"border-block-start-width",
"border-block-style",
"border-block-width",
"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-inline",
"border-inline-color",
"border-inline-end",
"border-inline-end-color",
"border-inline-end-style",
"border-inline-end-width",
"border-inline-start",
"border-inline-start-color",
"border-inline-start-style",
"border-inline-start-width",
"border-inline-style",
"border-inline-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",
"caret-color",
"clear",
"clip",
"clip-path",
"clip-rule",
"color",
"column-count",
"column-fill",
"column-gap",
"column-rule",
"column-rule-color",
"column-rule-style",
"column-rule-width",
"column-span",
"column-width",
"columns",
"contain",
"content",
"content-visibility",
"counter-increment",
"counter-reset",
"cue",
"cue-after",
"cue-before",
"cursor",
"direction",
"display",
"empty-cells",
"filter",
"flex",
"flex-basis",
"flex-direction",
"flex-flow",
"flex-grow",
"flex-shrink",
"flex-wrap",
"float",
"flow",
"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-synthesis",
"font-variant",
"font-variant-caps",
"font-variant-east-asian",
"font-variant-ligatures",
"font-variant-numeric",
"font-variant-position",
"font-variation-settings",
"font-weight",
"gap",
"glyph-orientation-vertical",
"grid",
"grid-area",
"grid-auto-columns",
"grid-auto-flow",
"grid-auto-rows",
"grid-column",
"grid-column-end",
"grid-column-start",
"grid-gap",
"grid-row",
"grid-row-end",
"grid-row-start",
"grid-template",
"grid-template-areas",
"grid-template-columns",
"grid-template-rows",
"hanging-punctuation",
"height",
"hyphens",
"icon",
"image-orientation",
"image-rendering",
"image-resolution",
"ime-mode",
"inline-size",
"isolation",
"justify-content",
"left",
"letter-spacing",
"line-break",
"line-height",
"list-style",
"list-style-image",
"list-style-position",
"list-style-type",
"margin",
"margin-block",
"margin-block-end",
"margin-block-start",
"margin-bottom",
"margin-inline",
"margin-inline-end",
"margin-inline-start",
"margin-left",
"margin-right",
"margin-top",
"marks",
"mask",
"mask-border",
"mask-border-mode",
"mask-border-outset",
"mask-border-repeat",
"mask-border-slice",
"mask-border-source",
"mask-border-width",
"mask-clip",
"mask-composite",
"mask-image",
"mask-mode",
"mask-origin",
"mask-position",
"mask-repeat",
"mask-size",
"mask-type",
"max-block-size",
"max-height",
"max-inline-size",
"max-width",
"min-block-size",
"min-height",
"min-inline-size",
"min-width",
"mix-blend-mode",
"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-block",
"padding-block-end",
"padding-block-start",
"padding-bottom",
"padding-inline",
"padding-inline-end",
"padding-inline-start",
"padding-left",
"padding-right",
"padding-top",
"page-break-after",
"page-break-before",
"page-break-inside",
"pause",
"pause-after",
"pause-before",
"perspective",
"perspective-origin",
"pointer-events",
"position",
"quotes",
"resize",
"rest",
"rest-after",
"rest-before",
"right",
"row-gap",
"scroll-margin",
"scroll-margin-block",
"scroll-margin-block-end",
"scroll-margin-block-start",
"scroll-margin-bottom",
"scroll-margin-inline",
"scroll-margin-inline-end",
"scroll-margin-inline-start",
"scroll-margin-left",
"scroll-margin-right",
"scroll-margin-top",
"scroll-padding",
"scroll-padding-block",
"scroll-padding-block-end",
"scroll-padding-block-start",
"scroll-padding-bottom",
"scroll-padding-inline",
"scroll-padding-inline-end",
"scroll-padding-inline-start",
"scroll-padding-left",
"scroll-padding-right",
"scroll-padding-top",
"scroll-snap-align",
"scroll-snap-stop",
"scroll-snap-type",
"scrollbar-color",
"scrollbar-gutter",
"scrollbar-width",
"shape-image-threshold",
"shape-margin",
"shape-outside",
"speak",
"speak-as",
"src",
// @font-face
"tab-size",
"table-layout",
"text-align",
"text-align-all",
"text-align-last",
"text-combine-upright",
"text-decoration",
"text-decoration-color",
"text-decoration-line",
"text-decoration-style",
"text-emphasis",
"text-emphasis-color",
"text-emphasis-position",
"text-emphasis-style",
"text-indent",
"text-justify",
"text-orientation",
"text-overflow",
"text-rendering",
"text-shadow",
"text-transform",
"text-underline-position",
"top",
"transform",
"transform-box",
"transform-origin",
"transform-style",
"transition",
"transition-delay",
"transition-duration",
"transition-property",
"transition-timing-function",
"unicode-bidi",
"vertical-align",
"visibility",
"voice-balance",
"voice-duration",
"voice-family",
"voice-pitch",
"voice-range",
"voice-rate",
"voice-stress",
"voice-volume",
"white-space",
"widows",
"width",
"will-change",
"word-break",
"word-spacing",
"word-wrap",
"writing-mode",
"z-index"
// reverse makes sure longer attributes `font-weight` are matched fully
// instead of getting false positives on say `font`
].reverse();
function m(e) {
const t = l(e), o = b, n = c, i = "@[a-z-]+", a = "and or not only", r = {
className: "variable",
begin: "(\\$" + "[a-zA-Z-][a-zA-Z0-9_-]*" + ")\\b",
relevance: 0
};
return {
name: "SCSS",
case_insensitive: !0,
illegal: "[=/|']",
contains: [
e.C_LINE_COMMENT_MODE,
e.C_BLOCK_COMMENT_MODE,
// to recognize keyframe 40% etc which are outside the scope of our
// attribute value mode
t.CSS_NUMBER_MODE,
{
className: "selector-id",
begin: "#[A-Za-z0-9_-]+",
relevance: 0
},
{
className: "selector-class",
begin: "\\.[A-Za-z0-9_-]+",
relevance: 0
},
t.ATTRIBUTE_SELECTOR_MODE,
{
className: "selector-tag",
begin: "\\b(" + s.join("|") + ")\\b",
// was there, before, but why?
relevance: 0
},
{
className: "selector-pseudo",
begin: ":(" + n.join("|") + ")"
},
{
className: "selector-pseudo",
begin: ":(:)?(" + o.join("|") + ")"
},
r,
{
// pseudo-selector params
begin: /\(/,
end: /\)/,
contains: [t.CSS_NUMBER_MODE]
},
t.CSS_VARIABLE,
{
className: "attribute",
begin: "\\b(" + g.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: /[;}{]/,
relevance: 0,
contains: [
t.BLOCK_COMMENT,
r,
t.HEXCOLOR,
t.CSS_NUMBER_MODE,
e.QUOTE_STRING_MODE,
e.APOS_STRING_MODE,
t.IMPORTANT,
t.FUNCTION_DISPATCH
]
},
// 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)",
keywords: {
$pattern: i,
keyword: "@page @font-face"
}
},
{
begin: "@",
end: "[{;]",
returnBegin: !0,
keywords: {
$pattern: /[a-z-]+/,
keyword: a,
attribute: d.join(" ")
},
contains: [
{
begin: i,
className: "keyword"
},
{
begin: /[a-z-]+(?=:)/,
className: "attribute"
},
r,
e.QUOTE_STRING_MODE,
e.APOS_STRING_MODE,
t.HEXCOLOR,
t.CSS_NUMBER_MODE
]
},
t.FUNCTION_DISPATCH
]
};
}
export {
m as default
};