import { EditorView } from "@codemirror/view"; import { Extension } from "@codemirror/state"; import { HighlightStyle, syntaxHighlighting } from "@codemirror/language"; import { tags as t } from "@lezer/highlight"; const base00 = "#171717", base01 = "#505d64", base02 = "white", base03 = "#707d8b", base04 = "#a0a4ae", base05 = "#bdbdbd", base06 = "#e0e0e0", base07 = "#fdf6e3", base_red = "#ff5f52", base_deeporange = "#ff6e40", base_pink = "#fa5788", base_yellow = "#facf4e", base_orange = "#ffad42", base_cyan = "#1E6AE1", base_indigo = "#7186f0", base_purple = "#D09EBF", base_green = "#82d47c", base_lightgreen = "#82d47c", base_teal = "#4ebaaa"; const invalid = base_red, darkBackground = "#fdf6e3", highlightBackground = "#545b61", background = base00, tooltipBackground = base01, selection = base07, cursor = base04; /// The editor theme styles for Material Dark. export const materialDarkTheme = EditorView.theme( { "&": { color: base05, backgroundColor: background, fontSize: "24px", }, ".cm-content": { caretColor: cursor, }, ".cm-cursor, .cm-dropCursor": { borderLeftColor: cursor }, "&.cm-focused .cm-selectionBackground, .cm-selectionBackground, .cm-content ::selection": { backgroundColor: selection, border: `0.5px solid ${base_teal}` }, ".cm-panels": { backgroundColor: darkBackground, color: base03 }, ".cm-panels.cm-panels-top": { borderBottom: "2px solid black" }, ".cm-panels.cm-panels-bottom": { borderTop: "2px solid black" }, ".cm-searchMatch": { outline: `1px solid ${base_yellow}`, backgroundColor: "transparent", }, ".cm-searchMatch.cm-searchMatch-selected": { backgroundColor: highlightBackground, }, ".cm-activeLine": { backgroundColor: highlightBackground }, ".cm-selectionMatch": { backgroundColor: darkBackground, outline: `1px solid ${base_teal}`, }, "&.cm-focused .cm-matchingBracket": { color: base06, outline: `1px solid ${base_teal}`, }, "&.cm-focused .cm-nonmatchingBracket": { color: base_red, }, ".cm-gutters": { backgroundColor: base00, borderRight: `1px solid ${base07}`, color: base02, }, ".cm-activeLineGutter": { backgroundColor: highlightBackground, color: base07, }, ".cm-foldPlaceholder": { backgroundColor: "transparent", border: "none", color: `${base07}`, }, ".cm-tooltip": { border: "none", backgroundColor: tooltipBackground, }, ".cm-tooltip .cm-tooltip-arrow:before": { borderTopColor: "transparent", borderBottomColor: "transparent", }, ".cm-tooltip .cm-tooltip-arrow:after": { borderTopColor: tooltipBackground, borderBottomColor: tooltipBackground, }, ".cm-tooltip-autocomplete": { "& > ul > li[aria-selected]": { backgroundColor: highlightBackground, color: base03, }, }, }, { dark: true } ); /// The highlighting style for code in the Material Dark theme. export const materialDarkHighlightStyle = HighlightStyle.define([ { tag: t.keyword, color: base_purple }, { tag: [t.name, t.deleted, t.character, t.macroName], color: base_cyan, }, { tag: [t.propertyName], color: base_yellow }, { tag: [t.variableName], color: base05 }, { tag: [t.function(t.variableName)], color: base_cyan }, { tag: [t.labelName], color: base_purple }, { tag: [t.color, t.constant(t.name), t.standard(t.name)], color: base_yellow, }, { tag: [t.definition(t.name), t.separator], color: base_pink }, { tag: [t.brace], color: base_purple }, { tag: [t.annotation], color: invalid, }, { tag: [t.number, t.changed, t.annotation, t.modifier, t.self, t.namespace], color: base_orange, }, { tag: [t.typeName, t.className], color: base_orange, }, { tag: [t.operator, t.operatorKeyword], color: base_indigo, }, { tag: [t.tagName], color: base_deeporange, }, { tag: [t.squareBracket], color: base_red, }, { tag: [t.angleBracket], color: base02, }, { tag: [t.attributeName], color: base05, }, { tag: [t.regexp], color: invalid, }, { tag: [t.quote], color: base_green, }, { tag: [t.string], color: base_lightgreen }, { tag: t.link, color: base_cyan, textDecoration: "underline", textUnderlinePosition: "under", }, { tag: [t.url, t.escape, t.special(t.string)], color: base_yellow, }, { tag: [t.meta], color: base03 }, { tag: [t.comment], color: base02, fontStyle: "italic" }, { tag: t.monospace, color: base05 }, { tag: t.strong, fontWeight: "bold", color: base_red }, { tag: t.emphasis, fontStyle: "italic", color: base_lightgreen }, { tag: t.strikethrough, textDecoration: "line-through" }, { tag: t.heading, fontWeight: "bold", color: base_yellow }, { tag: t.heading1, fontWeight: "bold", color: base_yellow }, { tag: [t.heading2, t.heading3, t.heading4], fontWeight: "bold", color: base_yellow, }, { tag: [t.heading5, t.heading6], color: base_yellow, }, { tag: [t.atom, t.bool, t.special(t.variableName)], color: base_cyan }, { tag: [t.processingInstruction, t.inserted], color: base_red, }, { tag: [t.contentSeparator], color: base_cyan, }, { tag: t.invalid, color: base02, borderBottom: `1px dotted ${base_red}` }, ]); /// Extension to enable the Material Dark theme (both the editor theme and /// the highlight style). export const materialDark: Extension = [ materialDarkTheme, syntaxHighlighting(materialDarkHighlightStyle), ];