1 import {tags} from "@lezer/highlight";
2 import {HighlightStyle, syntaxHighlighting} from "@codemirror/language";
3 import {EditorView} from "@codemirror/view";
4 import {oneDarkHighlightStyle, oneDarkTheme} from "@codemirror/theme-one-dark";
6 const defaultLightHighlightStyle = HighlightStyle.define([
10 textDecoration: "underline" },
12 textDecoration: "underline",
15 fontStyle: "italic" },
18 { tag: tags.strikethrough,
19 textDecoration: "line-through" },
22 { tag: [tags.atom, tags.bool, tags.url, tags.contentSeparator, tags.labelName],
24 { tag: [tags.literal, tags.inserted],
26 { tag: [tags.string, tags.deleted],
28 { tag: [tags.regexp, tags.escape, tags.special(tags.string)],
30 { tag: tags.definition(tags.variableName),
32 { tag: tags.local(tags.variableName),
34 { tag: [tags.typeName, tags.namespace],
36 { tag: tags.className,
38 { tag: [tags.special(tags.variableName), tags.macroName],
40 { tag: tags.definition(tags.propertyName),
42 { tag: tags.compareOperator,
50 const defaultThemeSpec = {
52 backgroundColor: "#FFF",
64 * Get the theme extension to use for editor view instance.
65 * @returns {Extension[]}
67 export function getTheme(viewParentEl) {
68 const darkMode = document.documentElement.classList.contains('dark-mode');
69 let viewTheme = darkMode ? oneDarkTheme : EditorView.theme(defaultThemeSpec);
70 let highlightStyle = darkMode ? oneDarkHighlightStyle : defaultLightHighlightStyle;
73 darkModeActive: darkMode,
74 registerViewTheme(builder) {
75 const spec = builder();
77 viewTheme = EditorView.theme(spec);
80 registerHighlightStyle(builder) {
81 const tagStyles = builder(tags) || [];
82 if (tagStyles.length) {
83 highlightStyle = HighlightStyle.define(tagStyles);
88 window.$events.emitPublic(viewParentEl, 'library-cm6::configure-theme', eventData);
90 return [viewTheme, syntaxHighlighting(highlightStyle)];