import {tags} from "@lezer/highlight";
-import {HighlightStyle} from "@codemirror/language";
+import {HighlightStyle, syntaxHighlighting} from "@codemirror/language";
+import {EditorView} from "@codemirror/view";
+import {oneDarkHighlightStyle, oneDarkTheme} from "@codemirror/theme-one-dark";
-export const defaultLight = HighlightStyle.define([
+const defaultLightHighlightStyle = HighlightStyle.define([
{ tag: tags.meta,
color: "#388938" },
{ tag: tags.link,
color: "#940" },
{ tag: tags.invalid,
color: "#f00" }
-]);
\ No newline at end of file
+]);
+
+const defaultThemeSpec = {
+ "&": {
+ color: "#000",
+ },
+ "&.cm-focused": {
+ outline: "none",
+ },
+ ".cm-line": {
+ lineHeight: "1.6",
+ },
+};
+
+/**
+ * Get the theme extension to use for editor view instance.
+ * @returns {Extension[]}
+ */
+export function getTheme(viewParentEl) {
+ const darkMode = document.documentElement.classList.contains('dark-mode');
+ let viewTheme = darkMode ? oneDarkTheme : EditorView.theme(defaultThemeSpec);
+ let highlightStyle = darkMode ? oneDarkHighlightStyle : defaultLightHighlightStyle;
+
+ const eventData = {
+ darkModeActive: darkMode,
+ registerViewTheme(builder) {
+ const spec = builder();
+ if (spec) {
+ viewTheme = EditorView.theme(spec);
+ }
+ },
+ registerHighlightStyle(builder) {
+ const tagStyles = builder(tags) || [];
+ if (tagStyles.length) {
+ highlightStyle = HighlightStyle.define(tagStyles);
+ }
+ }
+ };
+
+ window.$events.emitPublic(viewParentEl, 'library-cm6::configure-theme', eventData);
+
+ return [viewTheme, syntaxHighlighting(highlightStyle)];
+}
\ No newline at end of file