150 lines
4.1 KiB
TypeScript
150 lines
4.1 KiB
TypeScript
import { EditorView } from "@codemirror/view"
|
|
import { Extension } from "@codemirror/state"
|
|
import { HighlightStyle, syntaxHighlighting } from "@codemirror/language"
|
|
import { tags as t } from "@lezer/highlight"
|
|
|
|
// Using https://github.com/one-dark/vscode-one-dark-theme/ as reference for the colors
|
|
|
|
const chalky = "#e5c07b",
|
|
coral = "#e06c75",
|
|
cyan = "#56b6c2",
|
|
invalid = "#ffffff",
|
|
ivory = "#abb2bf",
|
|
stone = "#7d8799", // Brightened compared to original to increase contrast
|
|
malibu = "#61afef",
|
|
sage = "#98c379",
|
|
whiskey = "#d19a66",
|
|
violet = "#c678dd",
|
|
darkBackground = "#26262a",
|
|
highlightBackground = "#2c313a",
|
|
background = "#101014", // naive-ui
|
|
tooltipBackground = "#353a42",
|
|
selection = "#3E4451",
|
|
cursor = "#528bff"
|
|
|
|
/// The editor theme styles for One Dark.
|
|
const oneDarkTheme = EditorView.theme(
|
|
{
|
|
"&": {
|
|
color: ivory,
|
|
backgroundColor: background,
|
|
},
|
|
|
|
".cm-content": {
|
|
caretColor: cursor,
|
|
},
|
|
|
|
".cm-cursor, .cm-dropCursor": { borderLeftColor: cursor },
|
|
"&.cm-focused .cm-selectionBackground, .cm-selectionBackground, .cm-content ::selection":
|
|
{ backgroundColor: selection },
|
|
|
|
".cm-panels": { backgroundColor: darkBackground, color: ivory },
|
|
".cm-panels.cm-panels-top": { borderBottom: "2px solid black" },
|
|
".cm-panels.cm-panels-bottom": { borderTop: "2px solid black" },
|
|
|
|
".cm-searchMatch": {
|
|
backgroundColor: "#72a1ff59",
|
|
outline: "1px solid #457dff",
|
|
},
|
|
".cm-searchMatch.cm-searchMatch-selected": {
|
|
backgroundColor: "#6199ff2f",
|
|
},
|
|
|
|
".cm-activeLine": { backgroundColor: "#6699ff0b" },
|
|
".cm-selectionMatch": { backgroundColor: "#aafe661a" },
|
|
|
|
"&.cm-focused .cm-matchingBracket, &.cm-focused .cm-nonmatchingBracket": {
|
|
backgroundColor: "#bad0f847",
|
|
},
|
|
|
|
".cm-gutters": {
|
|
backgroundColor: background,
|
|
color: stone,
|
|
border: "none",
|
|
},
|
|
|
|
".cm-activeLineGutter": {
|
|
backgroundColor: highlightBackground,
|
|
},
|
|
|
|
".cm-foldPlaceholder": {
|
|
backgroundColor: "transparent",
|
|
border: "none",
|
|
color: "#ddd",
|
|
},
|
|
|
|
".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: ivory,
|
|
},
|
|
},
|
|
},
|
|
{ dark: true },
|
|
)
|
|
|
|
/// The highlighting style for code in the One Dark theme.
|
|
const oneDarkHighlightStyle = HighlightStyle.define([
|
|
{ tag: t.keyword, color: violet },
|
|
{
|
|
tag: [t.name, t.deleted, t.character, t.propertyName, t.macroName],
|
|
color: coral,
|
|
},
|
|
{ tag: [t.function(t.variableName), t.labelName], color: malibu },
|
|
{ tag: [t.color, t.constant(t.name), t.standard(t.name)], color: whiskey },
|
|
{ tag: [t.definition(t.name), t.separator], color: ivory },
|
|
{
|
|
tag: [
|
|
t.typeName,
|
|
t.className,
|
|
t.number,
|
|
t.changed,
|
|
t.annotation,
|
|
t.modifier,
|
|
t.self,
|
|
t.namespace,
|
|
],
|
|
color: chalky,
|
|
},
|
|
{
|
|
tag: [
|
|
t.operator,
|
|
t.operatorKeyword,
|
|
t.url,
|
|
t.escape,
|
|
t.regexp,
|
|
t.link,
|
|
t.special(t.string),
|
|
],
|
|
color: cyan,
|
|
},
|
|
{ tag: [t.meta, t.comment], color: stone },
|
|
{ tag: t.strong, fontWeight: "bold" },
|
|
{ tag: t.emphasis, fontStyle: "italic" },
|
|
{ tag: t.strikethrough, textDecoration: "line-through" },
|
|
{ tag: t.link, color: stone, textDecoration: "underline" },
|
|
{ tag: t.heading, fontWeight: "bold", color: coral },
|
|
{ tag: [t.atom, t.bool, t.special(t.variableName)], color: whiskey },
|
|
{ tag: [t.processingInstruction, t.string, t.inserted], color: sage },
|
|
{ tag: t.invalid, color: invalid },
|
|
])
|
|
|
|
/// Extension to enable the One Dark theme (both the editor theme and
|
|
/// the highlight style).
|
|
export const oneDark: Extension = [
|
|
oneDarkTheme,
|
|
syntaxHighlighting(oneDarkHighlightStyle),
|
|
]
|