baseTheme.ts 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. import {
  2. EditorView,
  3. keymap,
  4. highlightSpecialChars,
  5. highlightActiveLine,
  6. } from "@codemirror/view"
  7. import {
  8. HighlightStyle,
  9. tags as t,
  10. defaultHighlightStyle,
  11. } from "@codemirror/highlight"
  12. import { foldKeymap, foldGutter } from "@codemirror/fold"
  13. import { Extension, EditorState } from "@codemirror/state"
  14. import { history, historyKeymap } from "@codemirror/history"
  15. import { indentOnInput } from "@codemirror/language"
  16. import { lineNumbers, highlightActiveLineGutter } from "@codemirror/gutter"
  17. import { defaultKeymap } from "@codemirror/commands"
  18. import { bracketMatching } from "@codemirror/matchbrackets"
  19. import { closeBrackets, closeBracketsKeymap } from "@codemirror/closebrackets"
  20. import {
  21. searchKeymap,
  22. highlightSelectionMatches,
  23. searchConfig,
  24. } from "@codemirror/search"
  25. import { autocompletion, completionKeymap } from "@codemirror/autocomplete"
  26. import { commentKeymap } from "@codemirror/comment"
  27. import { rectangularSelection } from "@codemirror/rectangular-selection"
  28. import { lintKeymap } from "@codemirror/lint"
  29. export const baseTheme = EditorView.theme({
  30. "&": {
  31. fontSize: "var(--body-font-size)",
  32. },
  33. ".cm-content": {
  34. caretColor: "var(--secondary-light-color)",
  35. fontFamily: "var(--font-mono)",
  36. backgroundColor: "var(--primary-color)",
  37. },
  38. ".cm-cursor": {
  39. borderColor: "var(--secondary-color)",
  40. },
  41. ".cm-selectionBackground, .cm-content ::selection, .cm-line ::selection": {
  42. backgroundColor: "var(--accent-color)",
  43. color: "var(--accent-contrast-color)",
  44. },
  45. ".cm-panels": {
  46. backgroundColor: "var(--primary-light-color)",
  47. color: "var(--secondary-light-color)",
  48. },
  49. ".cm-panels.cm-panels-top": {
  50. borderBottom: "1px solid var(--divider-light-color)",
  51. },
  52. ".cm-panels.cm-panels-bottom": {
  53. borderTop: "1px solid var(--divider-light-color)",
  54. },
  55. ".cm-search": {
  56. display: "flex",
  57. alignItems: "center",
  58. flexWrap: "nowrap",
  59. flexShrink: 0,
  60. overflow: "auto",
  61. },
  62. ".cm-search label": {
  63. display: "inline-flex",
  64. alignItems: "center",
  65. },
  66. ".cm-textfield": {
  67. backgroundColor: "var(--primary-dark-color)",
  68. color: "var(--secondary-light-color)",
  69. borderColor: "var(--divider-light-color)",
  70. borderRadius: "3px",
  71. },
  72. ".cm-button": {
  73. backgroundColor: "var(--primary-dark-color)",
  74. color: "var(--secondary-light-color)",
  75. backgroundImage: "none",
  76. border: "none",
  77. },
  78. ".cm-tooltip": {
  79. backgroundColor: "var(--primary-dark-color)",
  80. color: "var(--secondary-light-color)",
  81. border: "none",
  82. borderRadius: "3px",
  83. },
  84. ".cm-completionLabel": {
  85. color: "var(--secondary-color)",
  86. },
  87. ".cm-tooltip.cm-tooltip-autocomplete > ul": {
  88. fontFamily: "var(--font-mono)",
  89. },
  90. ".cm-tooltip-autocomplete ul li[aria-selected]": {
  91. backgroundColor: "var(--accent-dark-color)",
  92. color: "var(--accent-contrast-color)",
  93. },
  94. ".cm-tooltip-autocomplete ul li[aria-selected] .cm-completionLabel": {
  95. color: "var(--accent-contrast-color)",
  96. },
  97. ".cm-activeLine": { backgroundColor: "transparent" },
  98. ".cm-searchMatch": {
  99. outline: "1px solid var(--accent-dark-color)",
  100. backgroundColor: "var(--divider-dark-color)",
  101. },
  102. ".cm-selectionMatch": {
  103. outline: "1px solid var(--accent-dark-color)",
  104. backgroundColor: "var(--divider-light-color)",
  105. },
  106. ".cm-matchingBracket, .cm-nonmatchingBracket": {
  107. backgroundColor: "var(--divider-color)",
  108. outline: "1px solid var(--accent-dark-color)",
  109. },
  110. ".cm-gutters": {
  111. fontFamily: "var(--font-mono)",
  112. backgroundColor: "var(--primary-color)",
  113. borderColor: "var(--divider-light-color)",
  114. },
  115. ".cm-lineNumbers": {
  116. minWidth: "3em",
  117. color: "var(--secondary-light-color)",
  118. },
  119. ".cm-foldGutter": {
  120. minWidth: "2em",
  121. color: "var(--secondary-light-color)",
  122. },
  123. ".cm-foldGutter .cm-gutterElement": {
  124. textAlign: "center",
  125. },
  126. ".cm-line": {
  127. paddingLeft: "0.5em",
  128. paddingRight: "0.5em",
  129. },
  130. ".cm-activeLineGutter": {
  131. backgroundColor: "transparent",
  132. },
  133. ".cm-scroller::-webkit-scrollbar": {
  134. display: "none",
  135. },
  136. ".cm-foldPlaceholder": {
  137. backgroundColor: "var(--divider-light-color)",
  138. color: "var(--secondary-dark-color)",
  139. borderColor: "var(--divider-dark-color)",
  140. },
  141. })
  142. const editorTypeColor = "var(--editor-type-color)"
  143. const editorNameColor = "var(--editor-name-color)"
  144. const editorOperatorColor = "var(--editor-operator-color)"
  145. const editorInvalidColor = "var(--editor-invalid-color)"
  146. const editorSeparatorColor = "var(--editor-separator-color)"
  147. const editorMetaColor = "var(--editor-meta-color)"
  148. const editorVariableColor = "var(--editor-variable-color)"
  149. const editorLinkColor = "var(--editor-link-color)"
  150. const editorProcessColor = "var(--editor-process-color)"
  151. const editorConstantColor = "var(--editor-constant-color)"
  152. const editorKeywordColor = "var(--editor-keyword-color)"
  153. export const baseHighlightStyle = HighlightStyle.define([
  154. { tag: t.keyword, color: editorKeywordColor },
  155. {
  156. tag: [t.name, t.deleted, t.character, t.propertyName, t.macroName],
  157. color: editorNameColor,
  158. },
  159. {
  160. tag: [t.function(t.variableName), t.labelName],
  161. color: editorVariableColor,
  162. },
  163. {
  164. tag: [t.color, t.constant(t.name), t.standard(t.name)],
  165. color: editorConstantColor,
  166. },
  167. { tag: [t.definition(t.name), t.separator], color: editorSeparatorColor },
  168. {
  169. tag: [
  170. t.typeName,
  171. t.className,
  172. t.number,
  173. t.changed,
  174. t.annotation,
  175. t.modifier,
  176. t.self,
  177. t.namespace,
  178. ],
  179. color: editorTypeColor,
  180. },
  181. {
  182. tag: [
  183. t.operator,
  184. t.operatorKeyword,
  185. t.url,
  186. t.escape,
  187. t.regexp,
  188. t.link,
  189. t.special(t.string),
  190. ],
  191. color: editorOperatorColor,
  192. },
  193. { tag: [t.meta, t.comment], color: editorMetaColor },
  194. { tag: t.strong, fontWeight: "bold" },
  195. { tag: t.emphasis, fontStyle: "italic" },
  196. { tag: t.strikethrough, textDecoration: "line-through" },
  197. { tag: t.link, color: editorLinkColor, textDecoration: "underline" },
  198. { tag: t.heading, fontWeight: "bold", color: editorNameColor },
  199. {
  200. tag: [t.atom, t.bool, t.special(t.variableName)],
  201. color: editorConstantColor,
  202. },
  203. {
  204. tag: [t.processingInstruction, t.string, t.inserted],
  205. color: editorProcessColor,
  206. },
  207. { tag: t.invalid, color: editorInvalidColor },
  208. ])
  209. export const basicSetup: Extension = [
  210. lineNumbers(),
  211. highlightActiveLineGutter(),
  212. highlightSpecialChars(),
  213. history(),
  214. foldGutter({
  215. openText: "▾",
  216. closedText: "▸",
  217. }),
  218. EditorState.allowMultipleSelections.of(true),
  219. indentOnInput(),
  220. defaultHighlightStyle.fallback,
  221. bracketMatching(),
  222. closeBrackets(),
  223. autocompletion(),
  224. rectangularSelection(),
  225. highlightActiveLine(),
  226. highlightSelectionMatches(),
  227. searchConfig({
  228. top: true,
  229. }),
  230. keymap.of([
  231. ...closeBracketsKeymap,
  232. ...defaultKeymap,
  233. ...searchKeymap,
  234. ...historyKeymap,
  235. ...foldKeymap,
  236. ...commentKeymap,
  237. ...completionKeymap,
  238. ...lintKeymap,
  239. ]),
  240. ]